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>2023-07-19 17:16:28 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2023-07-19 17:16:28 +0300
commite4384360a16dd9a19d4d2d25d0ef1f2b862ed2a6 (patch)
tree2fcdfa7dcdb9db8f5208b2562f4b4e803d671243
parentffda4e7bcac36987f936b4ba515995a6698698f0 (diff)
Add latest changes from gitlab-org/gitlab@16-2-stable-eev16.2.0-rc42
-rw-r--r--.dockerignore1
-rw-r--r--.eslintrc.yml10
-rw-r--r--.gitignore1
-rw-r--r--.gitlab-ci.yml37
-rw-r--r--.gitlab/CODEOWNERS138
-rw-r--r--.gitlab/ci/benchmark.gitlab-ci.yml17
-rw-r--r--.gitlab/ci/caching.gitlab-ci.yml1
-rw-r--r--.gitlab/ci/docs.gitlab-ci.yml7
-rw-r--r--.gitlab/ci/frontend.gitlab-ci.yml22
-rw-r--r--.gitlab/ci/gitlab-gems.gitlab-ci.yml22
-rw-r--r--.gitlab/ci/global.gitlab-ci.yml316
-rw-r--r--.gitlab/ci/package-and-test-nightly/main.gitlab-ci.yml24
-rw-r--r--.gitlab/ci/package-and-test/main.gitlab-ci.yml115
-rw-r--r--.gitlab/ci/preflight.gitlab-ci.yml3
-rw-r--r--.gitlab/ci/qa-common/main.gitlab-ci.yml17
-rw-r--r--.gitlab/ci/qa-common/variables.gitlab-ci.yml7
-rw-r--r--.gitlab/ci/qa.gitlab-ci.yml23
-rw-r--r--.gitlab/ci/rails.gitlab-ci.yml134
-rw-r--r--.gitlab/ci/rails/rspec-foss-impact.gitlab-ci.yml.erb4
-rw-r--r--.gitlab/ci/rails/shared.gitlab-ci.yml25
-rw-r--r--.gitlab/ci/release-environments/main.gitlab-ci.yml2
-rw-r--r--.gitlab/ci/review-apps/main.gitlab-ci.yml6
-rw-r--r--.gitlab/ci/review-apps/qa.gitlab-ci.yml21
-rw-r--r--.gitlab/ci/review.gitlab-ci.yml1
-rw-r--r--.gitlab/ci/rules.gitlab-ci.yml261
-rw-r--r--.gitlab/ci/setup.gitlab-ci.yml10
-rw-r--r--.gitlab/ci/static-analysis.gitlab-ci.yml36
-rw-r--r--.gitlab/ci/templates/gem.gitlab-ci.yml28
-rw-r--r--.gitlab/ci/test-on-gdk/main.gitlab-ci.yml68
-rw-r--r--.gitlab/ci/vendored-gems.gitlab-ci.yml148
-rw-r--r--.gitlab/ci/workhorse.gitlab-ci.yml3
-rw-r--r--.gitlab/ci/yaml.gitlab-ci.yml2
-rw-r--r--.gitlab/issue_templates/Analytics_Instrumentation_Incident_Template.md49
-rw-r--r--.gitlab/issue_templates/Broken Master - Flaky.md4
-rw-r--r--.gitlab/issue_templates/Broken Master - Non-flaky.md4
-rw-r--r--.gitlab/issue_templates/Geo Replicate a new Git repository type.md15
-rw-r--r--.gitlab/issue_templates/Geo Replicate a new blob type.md12
-rw-r--r--.gitlab/issue_templates/Pipeline Execution Issue Implementation.md55
-rw-r--r--.gitlab/issue_templates/Pipeline Execution Refinement Spike.md33
-rw-r--r--.gitlab/issue_templates/Pipeline Security issue implementation.md (renamed from .gitlab/issue_templates/Pipeline Security issue implementation)0
-rw-r--r--.gitlab/issue_templates/Security developer workflow.md2
-rw-r--r--.gitlab/merge_request_templates/Deprecations.md14
-rw-r--r--.gitlab/merge_request_templates/Removals.md110
-rw-r--r--.gitlab/sast-ruleset.toml2
-rw-r--r--.gitpod.yml4
-rw-r--r--.haml-lint.yml5
-rw-r--r--.markdownlint.yml1
-rw-r--r--.nvmrc2
-rw-r--r--.rubocop.yml42
-rw-r--r--.rubocop_todo/background_migration/avoid_silent_rescue_exceptions.yml8
-rw-r--r--.rubocop_todo/factory_bot/create_list.yml83
-rw-r--r--.rubocop_todo/fips/md5.yml2
-rw-r--r--.rubocop_todo/gettext/static_identifier.yml1
-rw-r--r--.rubocop_todo/gitlab/doc_url.yml1
-rw-r--r--.rubocop_todo/gitlab/feature_available_usage.yml27
-rw-r--r--.rubocop_todo/gitlab/namespaced_class.yml2
-rw-r--r--.rubocop_todo/gitlab/service_response.yml1
-rw-r--r--.rubocop_todo/gitlab/strong_memoize_attr.yml21
-rw-r--r--.rubocop_todo/graphql/resource_not_available_error.yml1
-rw-r--r--.rubocop_todo/internal_affairs/use_restrict_on_send.yml13
-rw-r--r--.rubocop_todo/layout/argument_alignment.yml152
-rw-r--r--.rubocop_todo/layout/empty_line_after_magic_comment.yml3
-rw-r--r--.rubocop_todo/layout/extra_spacing.yml8
-rw-r--r--.rubocop_todo/layout/first_hash_element_indentation.yml2
-rw-r--r--.rubocop_todo/layout/line_end_string_concatenation_indentation.yml2
-rw-r--r--.rubocop_todo/layout/line_length.yml165
-rw-r--r--.rubocop_todo/layout/space_in_lambda_literal.yml1
-rw-r--r--.rubocop_todo/lint/ambiguous_regexp_literal.yml1
-rw-r--r--.rubocop_todo/lint/assignment_in_condition.yml259
-rw-r--r--.rubocop_todo/lint/empty_block.yml1
-rw-r--r--.rubocop_todo/lint/empty_class.yml4
-rw-r--r--.rubocop_todo/lint/missing_cop_enable_directive.yml1
-rw-r--r--.rubocop_todo/lint/non_atomic_file_operation.yml2
-rw-r--r--.rubocop_todo/lint/redundant_cop_disable_directive.yml7
-rw-r--r--.rubocop_todo/lint/redundant_safe_navigation.yml15
-rw-r--r--.rubocop_todo/lint/redundant_string_coercion.yml7
-rw-r--r--.rubocop_todo/lint/symbol_conversion.yml3
-rw-r--r--.rubocop_todo/lint/unused_block_argument.yml2
-rw-r--r--.rubocop_todo/lint/unused_method_argument.yml3
-rw-r--r--.rubocop_todo/metrics/cyclomatic_complexity.yml3
-rw-r--r--.rubocop_todo/metrics/perceived_complexity.yml3
-rw-r--r--.rubocop_todo/migration/avoid_finalize_background_migration.yml7
-rw-r--r--.rubocop_todo/naming/heredoc_delimiter_naming.yml6
-rw-r--r--.rubocop_todo/naming/inclusive_language.yml39
-rw-r--r--.rubocop_todo/performance/active_record_subtransaction_methods.yml2
-rw-r--r--.rubocop_todo/performance/regexp_match.yml60
-rw-r--r--.rubocop_todo/rails/file_path.yml6
-rw-r--r--.rubocop_todo/rails/output_safety.yml157
-rw-r--r--.rubocop_todo/rspec/any_instance_of.yml1
-rw-r--r--.rubocop_todo/rspec/before_all_role_assignment.yml1584
-rw-r--r--.rubocop_todo/rspec/context_wording.yml99
-rw-r--r--.rubocop_todo/rspec/described_class.yml179
-rw-r--r--.rubocop_todo/rspec/expect_change.yml1
-rw-r--r--.rubocop_todo/rspec/expect_in_hook.yml5
-rw-r--r--.rubocop_todo/rspec/factory_bot/excessive_create_list.yml46
-rw-r--r--.rubocop_todo/rspec/missing_feature_category.yml30
-rw-r--r--.rubocop_todo/rspec/return_from_stub.yml2
-rw-r--r--.rubocop_todo/rspec/useless_dynamic_definition.yml12
-rw-r--r--.rubocop_todo/rspec/verified_doubles.yml5
-rw-r--r--.rubocop_todo/search/namespaced_class.yml12
-rw-r--r--.rubocop_todo/style/bare_percent_literals.yml87
-rw-r--r--.rubocop_todo/style/empty_method.yml4
-rw-r--r--.rubocop_todo/style/format_string.yml2
-rw-r--r--.rubocop_todo/style/guard_clause.yml4
-rw-r--r--.rubocop_todo/style/if_unless_modifier.yml3
-rw-r--r--.rubocop_todo/style/percent_literal_delimiters.yml1
-rw-r--r--.rubocop_todo/style/redundant_freeze.yml21
-rw-r--r--.rubocop_todo/style/redundant_interpolation.yml1
-rw-r--r--.rubocop_todo/style/redundant_parentheses.yml9
-rw-r--r--.rubocop_todo/style/sole_nested_conditional.yml1
-rw-r--r--.rubocop_todo/style/string_concatenation.yml2
-rw-r--r--.rubocop_todo/style/string_literals_in_interpolation.yml1
-rw-r--r--.rubocop_todo/style/symbol_proc.yml1
-rw-r--r--CHANGELOG.md48
-rw-r--r--GITALY_SERVER_VERSION2
-rw-r--r--GITLAB_ELASTICSEARCH_INDEXER_VERSION2
-rw-r--r--GITLAB_KAS_VERSION2
-rw-r--r--GITLAB_PAGES_VERSION2
-rw-r--r--Gemfile62
-rw-r--r--Gemfile.checksum132
-rw-r--r--Gemfile.lock305
-rwxr-xr-xRakefile2
-rw-r--r--app/assets/images/callouts/rich_text_editor_illustration.svg79
-rw-r--r--app/assets/images/service_desk_callout.svg1
-rw-r--r--app/assets/javascripts/access_tokens/components/access_token_table_app.vue3
-rw-r--r--app/assets/javascripts/access_tokens/components/token.vue35
-rw-r--r--app/assets/javascripts/access_tokens/components/tokens_app.vue16
-rw-r--r--app/assets/javascripts/actioncable_connection_monitor.js142
-rw-r--r--app/assets/javascripts/actioncable_consumer.js9
-rw-r--r--app/assets/javascripts/admin/abuse_reports/components/abuse_category.vue33
-rw-r--r--app/assets/javascripts/admin/abuse_reports/components/abuse_report_row.vue17
-rw-r--r--app/assets/javascripts/admin/abuse_reports/constants.js45
-rw-r--r--app/assets/javascripts/admin/applications/components/delete_application.vue2
-rw-r--r--app/assets/javascripts/admin/broadcast_messages/components/message_form.vue69
-rw-r--r--app/assets/javascripts/admin/broadcast_messages/constants.js21
-rw-r--r--app/assets/javascripts/admin/users/components/actions/ban.vue2
-rw-r--r--app/assets/javascripts/admin/users/components/users_table.vue2
-rw-r--r--app/assets/javascripts/alerts_settings/components/alerts_settings_form.vue63
-rw-r--r--app/assets/javascripts/alerts_settings/constants.js6
-rw-r--r--app/assets/javascripts/alerts_settings/graphql/fragments/integration_item.fragment.graphql1
-rw-r--r--app/assets/javascripts/alerts_settings/graphql/mutations/create_prometheus_integration.mutation.graphql6
-rw-r--r--app/assets/javascripts/analytics/cycle_analytics/components/filter_bar.vue2
-rw-r--r--app/assets/javascripts/analytics/shared/constants.js4
-rw-r--r--app/assets/javascripts/analytics/usage_trends/components/users_chart.vue12
-rw-r--r--app/assets/javascripts/api/groups_api.js4
-rw-r--r--app/assets/javascripts/api/user_api.js11
-rw-r--r--app/assets/javascripts/batch_comments/components/submit_dropdown.vue83
-rw-r--r--app/assets/javascripts/batch_comments/stores/modules/batch_comments/actions.js26
-rw-r--r--app/assets/javascripts/behaviors/gl_emoji.js11
-rw-r--r--app/assets/javascripts/behaviors/markdown/render_gfm.js10
-rw-r--r--app/assets/javascripts/behaviors/markdown/render_metrics.js47
-rw-r--r--app/assets/javascripts/behaviors/preview_markdown.js4
-rw-r--r--app/assets/javascripts/blob/line_highlighter.js61
-rw-r--r--app/assets/javascripts/boards/components/board_app.vue14
-rw-r--r--app/assets/javascripts/boards/components/board_card_inner.vue22
-rw-r--r--app/assets/javascripts/boards/components/board_content.vue12
-rw-r--r--app/assets/javascripts/boards/components/board_form.vue10
-rw-r--r--app/assets/javascripts/boards/components/board_list.vue82
-rw-r--r--app/assets/javascripts/boards/components/board_list_header.vue102
-rw-r--r--app/assets/javascripts/boards/components/board_new_issue.vue83
-rw-r--r--app/assets/javascripts/boards/components/issue_board_filtered_search.vue2
-rw-r--r--app/assets/javascripts/boards/components/project_select.vue119
-rw-r--r--app/assets/javascripts/boards/constants.js26
-rw-r--r--app/assets/javascripts/boards/graphql/cache_updates.js38
-rw-r--r--app/assets/javascripts/boards/graphql/client/error.query.graphql3
-rw-r--r--app/assets/javascripts/boards/graphql/client/set_error.mutation.graphql3
-rw-r--r--app/assets/javascripts/boards/graphql/issue_create.mutation.graphql4
-rw-r--r--app/assets/javascripts/boards/stores/actions.js4
-rw-r--r--app/assets/javascripts/branches/components/delete_merged_branches.vue7
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/components/ci_environments_dropdown.vue39
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/components/ci_group_variables.vue16
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/components/ci_variable_modal.vue7
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/components/ci_variable_settings.vue5
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/components/ci_variable_shared.vue25
-rw-r--r--app/assets/javascripts/ci/ci_variable_list/graphql/queries/group_environments.query.graphql10
-rw-r--r--app/assets/javascripts/ci/pipeline_editor/components/drawer/cards/first_pipeline_card.vue3
-rw-r--r--app/assets/javascripts/ci/pipeline_editor/components/job_assistant_drawer/accordion_items/artifacts_and_cache_item.vue2
-rw-r--r--app/assets/javascripts/ci/pipeline_editor/components/job_assistant_drawer/accordion_items/rules_item.vue9
-rw-r--r--app/assets/javascripts/ci/pipeline_schedules/components/pipeline_schedules.vue25
-rw-r--r--app/assets/javascripts/ci/pipeline_schedules/components/pipeline_schedules_empty_state.vue15
-rw-r--r--app/assets/javascripts/ci/pipeline_schedules/components/pipeline_schedules_form.vue309
-rw-r--r--app/assets/javascripts/ci/pipeline_schedules/components/table/cells/pipeline_schedule_actions.vue15
-rw-r--r--app/assets/javascripts/ci/pipeline_schedules/constants.js5
-rw-r--r--app/assets/javascripts/ci/pipeline_schedules/graphql/mutations/create_pipeline_schedule.mutation.graphql6
-rw-r--r--app/assets/javascripts/ci/pipeline_schedules/graphql/mutations/update_pipeline_schedule.mutation.graphql6
-rw-r--r--app/assets/javascripts/ci/pipeline_schedules/graphql/queries/get_pipeline_schedules.query.graphql20
-rw-r--r--app/assets/javascripts/ci/pipeline_schedules/mount_pipeline_schedules_app.js4
-rw-r--r--app/assets/javascripts/ci/pipeline_schedules/mount_pipeline_schedules_form_app.js9
-rw-r--r--app/assets/javascripts/ci/reports/components/grouped_issues_list.vue106
-rw-r--r--app/assets/javascripts/ci/reports/components/summary_row.vue93
-rw-r--r--app/assets/javascripts/ci/reports/constants.js5
-rw-r--r--app/assets/javascripts/ci/reports/sast/constants.js44
-rw-r--r--app/assets/javascripts/ci/reports/utils.js20
-rw-r--r--app/assets/javascripts/ci/runner/admin_runner_show/admin_runner_show_app.vue16
-rw-r--r--app/assets/javascripts/ci/runner/admin_runners/admin_runners_app.vue8
-rw-r--r--app/assets/javascripts/ci/runner/components/cells/runner_summary_cell.vue18
-rw-r--r--app/assets/javascripts/ci/runner/components/registration/registration_dropdown.vue106
-rw-r--r--app/assets/javascripts/ci/runner/components/registration/registration_token.vue1
-rw-r--r--app/assets/javascripts/ci/runner/components/registration/registration_token_reset_dropdown_item.vue34
-rw-r--r--app/assets/javascripts/ci/runner/components/runner_delete_action.vue126
-rw-r--r--app/assets/javascripts/ci/runner/components/runner_delete_button.vue126
-rw-r--r--app/assets/javascripts/ci/runner/components/runner_delete_disclosure_dropdown_item.vue38
-rw-r--r--app/assets/javascripts/ci/runner/components/runner_delete_modal.vue3
-rw-r--r--app/assets/javascripts/ci/runner/components/runner_detail.vue4
-rw-r--r--app/assets/javascripts/ci/runner/components/runner_edit_button.vue10
-rw-r--r--app/assets/javascripts/ci/runner/components/runner_edit_disclosure_dropdown_item.vue29
-rw-r--r--app/assets/javascripts/ci/runner/components/runner_header.vue46
-rw-r--r--app/assets/javascripts/ci/runner/components/runner_header_actions.vue80
-rw-r--r--app/assets/javascripts/ci/runner/components/runner_list_empty_state.vue54
-rw-r--r--app/assets/javascripts/ci/runner/components/runner_pause_action.vue89
-rw-r--r--app/assets/javascripts/ci/runner/components/runner_pause_button.vue97
-rw-r--r--app/assets/javascripts/ci/runner/components/runner_pause_disclosure_dropdown_item.vue34
-rw-r--r--app/assets/javascripts/ci/runner/constants.js21
-rw-r--r--app/assets/javascripts/ci/runner/graphql/list/list_item_shared.fragment.graphql6
-rw-r--r--app/assets/javascripts/ci/runner/group_runner_show/group_runner_show_app.vue16
-rw-r--r--app/assets/javascripts/ci/runner/group_runners/group_runners_app.vue12
-rw-r--r--app/assets/javascripts/clusters/forms/show/index.js3
-rw-r--r--app/assets/javascripts/clusters_list/components/clusters_actions.vue81
-rw-r--r--app/assets/javascripts/comment_templates/components/app.vue30
-rw-r--r--app/assets/javascripts/comment_templates/components/form.vue2
-rw-r--r--app/assets/javascripts/comment_templates/components/list.vue16
-rw-r--r--app/assets/javascripts/comment_templates/components/list_item.vue2
-rw-r--r--app/assets/javascripts/comment_templates/pages/index.vue10
-rw-r--r--app/assets/javascripts/content_editor/components/bubble_menus/bubble_menu.vue2
-rw-r--r--app/assets/javascripts/content_editor/components/bubble_menus/media_bubble_menu.vue57
-rw-r--r--app/assets/javascripts/content_editor/components/content_editor.vue69
-rw-r--r--app/assets/javascripts/content_editor/components/formatting_toolbar.vue259
-rw-r--r--app/assets/javascripts/content_editor/components/suggestions_dropdown.vue146
-rw-r--r--app/assets/javascripts/content_editor/components/toolbar_attachment_button.vue1
-rw-r--r--app/assets/javascripts/content_editor/components/toolbar_button.vue7
-rw-r--r--app/assets/javascripts/content_editor/components/toolbar_more_dropdown.vue4
-rw-r--r--app/assets/javascripts/content_editor/components/toolbar_table_button.vue82
-rw-r--r--app/assets/javascripts/content_editor/components/wrappers/code_block.vue207
-rw-r--r--app/assets/javascripts/content_editor/components/wrappers/image.vue103
-rw-r--r--app/assets/javascripts/content_editor/components/wrappers/reference.vue15
-rw-r--r--app/assets/javascripts/content_editor/extensions/code_suggestion.js81
-rw-r--r--app/assets/javascripts/content_editor/extensions/comment.js49
-rw-r--r--app/assets/javascripts/content_editor/extensions/copy_paste.js191
-rw-r--r--app/assets/javascripts/content_editor/extensions/hard_break.js4
-rw-r--r--app/assets/javascripts/content_editor/extensions/image.js5
-rw-r--r--app/assets/javascripts/content_editor/extensions/loading.js23
-rw-r--r--app/assets/javascripts/content_editor/extensions/paragraph.js10
-rw-r--r--app/assets/javascripts/content_editor/extensions/paste_markdown.js155
-rw-r--r--app/assets/javascripts/content_editor/extensions/reference.js6
-rw-r--r--app/assets/javascripts/content_editor/services/code_suggestion_utils.js32
-rw-r--r--app/assets/javascripts/content_editor/services/content_editor.js14
-rw-r--r--app/assets/javascripts/content_editor/services/create_content_editor.js17
-rw-r--r--app/assets/javascripts/content_editor/services/markdown_serializer.js7
-rw-r--r--app/assets/javascripts/content_editor/services/serialization_helpers.js7
-rw-r--r--app/assets/javascripts/content_editor/services/utils.js8
-rw-r--r--app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_approved.vue21
-rw-r--r--app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_base.vue29
-rw-r--r--app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_expired.vue46
-rw-r--r--app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_joined.vue44
-rw-r--r--app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_left.vue44
-rw-r--r--app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_merged.vue29
-rw-r--r--app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_private.vue24
-rw-r--r--app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_pushed.vue110
-rw-r--r--app/assets/javascripts/contribution_events/components/contribution_events.vue34
-rw-r--r--app/assets/javascripts/contribution_events/components/resource_parent_link.vue4
-rw-r--r--app/assets/javascripts/contribution_events/components/target_link.vue2
-rw-r--r--app/assets/javascripts/contribution_events/constants.js4
-rw-r--r--app/assets/javascripts/custom_metrics/components/custom_metrics_form.vue2
-rw-r--r--app/assets/javascripts/deploy_tokens/components/new_deploy_token.vue2
-rw-r--r--app/assets/javascripts/deprecated_notes.js14
-rw-r--r--app/assets/javascripts/design_management/components/design_description/description_form.vue9
-rw-r--r--app/assets/javascripts/design_management/components/design_notes/design_discussion.vue6
-rw-r--r--app/assets/javascripts/design_management/components/design_notes/design_note.vue153
-rw-r--r--app/assets/javascripts/design_management/components/design_notes/design_note_awards_list.vue34
-rw-r--r--app/assets/javascripts/design_management/components/design_notes/design_reply_form.vue2
-rw-r--r--app/assets/javascripts/design_management/graphql/fragments/design_note.fragment.graphql9
-rw-r--r--app/assets/javascripts/design_management/graphql/fragments/note_permissions.fragment.graphql1
-rw-r--r--app/assets/javascripts/design_management/graphql/mutations/design_note_award_emoji_toggle.mutation.graphql6
-rw-r--r--app/assets/javascripts/design_management/pages/index.vue22
-rw-r--r--app/assets/javascripts/diffs/components/app.vue33
-rw-r--r--app/assets/javascripts/diffs/components/commit_item.vue4
-rw-r--r--app/assets/javascripts/diffs/components/diff_code_quality.vue38
-rw-r--r--app/assets/javascripts/diffs/components/diff_code_quality_item.vue30
-rw-r--r--app/assets/javascripts/diffs/components/diff_content.vue32
-rw-r--r--app/assets/javascripts/diffs/components/diff_file.vue79
-rw-r--r--app/assets/javascripts/diffs/components/diff_file_header.vue8
-rw-r--r--app/assets/javascripts/diffs/components/diff_inline_findings.vue32
-rw-r--r--app/assets/javascripts/diffs/components/diff_line.vue14
-rw-r--r--app/assets/javascripts/diffs/components/diff_line_note_form.vue24
-rw-r--r--app/assets/javascripts/diffs/components/diff_row.vue46
-rw-r--r--app/assets/javascripts/diffs/components/diff_row_utils.js4
-rw-r--r--app/assets/javascripts/diffs/components/diff_view.vue11
-rw-r--r--app/assets/javascripts/diffs/components/pre_renderer.vue83
-rw-r--r--app/assets/javascripts/diffs/components/settings_dropdown.vue162
-rw-r--r--app/assets/javascripts/diffs/components/tree_list.vue4
-rw-r--r--app/assets/javascripts/diffs/components/virtual_scroller_scroll_sync.js13
-rw-r--r--app/assets/javascripts/diffs/i18n.js16
-rw-r--r--app/assets/javascripts/diffs/index.js2
-rw-r--r--app/assets/javascripts/diffs/store/actions.js83
-rw-r--r--app/assets/javascripts/diffs/store/getters.js5
-rw-r--r--app/assets/javascripts/diffs/store/modules/diff_state.js11
-rw-r--r--app/assets/javascripts/diffs/store/mutations.js16
-rw-r--r--app/assets/javascripts/diffs/store/utils.js2
-rw-r--r--app/assets/javascripts/emoji/components/category.vue5
-rw-r--r--app/assets/javascripts/emoji/components/picker.vue27
-rw-r--r--app/assets/javascripts/emoji/components/utils.js2
-rw-r--r--app/assets/javascripts/emoji/constants.js1
-rw-r--r--app/assets/javascripts/emoji/index.js63
-rw-r--r--app/assets/javascripts/emoji/queries/custom_emoji.query.graphql12
-rw-r--r--app/assets/javascripts/environments/components/edit_environment.vue75
-rw-r--r--app/assets/javascripts/environments/components/environment_form.vue137
-rw-r--r--app/assets/javascripts/environments/components/new_environment.vue28
-rw-r--r--app/assets/javascripts/environments/components/new_environment_item.vue26
-rw-r--r--app/assets/javascripts/environments/components/stop_environment_modal.vue15
-rw-r--r--app/assets/javascripts/environments/constants.js16
-rw-r--r--app/assets/javascripts/environments/edit.js14
-rw-r--r--app/assets/javascripts/environments/graphql/client.js9
-rw-r--r--app/assets/javascripts/environments/graphql/queries/environment_cluster_agent_with_namespace.query.graphql20
-rw-r--r--app/assets/javascripts/environments/graphql/queries/environment_with_namespace.graphql15
-rw-r--r--app/assets/javascripts/environments/graphql/queries/k8s_namespaces.query.graphql7
-rw-r--r--app/assets/javascripts/environments/graphql/resolvers.js25
-rw-r--r--app/assets/javascripts/environments/graphql/typedefs.graphql6
-rw-r--r--app/assets/javascripts/environments/helpers/k8s_integration_helper.js7
-rw-r--r--app/assets/javascripts/environments/new.js9
-rw-r--r--app/assets/javascripts/error_tracking/components/error_details.vue91
-rw-r--r--app/assets/javascripts/error_tracking/components/timeline_chart.vue4
-rw-r--r--app/assets/javascripts/feature_flags/components/feature_flags_table.vue12
-rw-r--r--app/assets/javascripts/frequent_items/store/mutations.js2
-rw-r--r--app/assets/javascripts/gfm_auto_complete.js2
-rw-r--r--app/assets/javascripts/gitlab_version_check/constants.js3
-rw-r--r--app/assets/javascripts/google_cloud/service_accounts/list.vue5
-rw-r--r--app/assets/javascripts/google_tag_manager/index.js3
-rw-r--r--app/assets/javascripts/graphql_shared/issuable_client.js43
-rw-r--r--app/assets/javascripts/groups/components/app.vue9
-rw-r--r--app/assets/javascripts/groups/components/item_stats.vue6
-rw-r--r--app/assets/javascripts/groups/components/overview_tabs.vue73
-rw-r--r--app/assets/javascripts/groups/constants.js54
-rw-r--r--app/assets/javascripts/groups/init_overview_tabs.js2
-rw-r--r--app/assets/javascripts/groups/service/archived_projects_service.js56
-rw-r--r--app/assets/javascripts/groups/service/groups_service.js13
-rw-r--r--app/assets/javascripts/groups/settings/init_access_dropdown.js2
-rw-r--r--app/assets/javascripts/header_search/components/app.vue2
-rw-r--r--app/assets/javascripts/ide/components/ide_status_bar.vue1
-rw-r--r--app/assets/javascripts/import_entities/import_groups/components/import_table.vue1
-rw-r--r--app/assets/javascripts/invite_members/components/group_select.vue151
-rw-r--r--app/assets/javascripts/invite_members/components/import_project_members_modal.vue1
-rw-r--r--app/assets/javascripts/invite_members/components/invite_groups_modal.vue12
-rw-r--r--app/assets/javascripts/invite_members/components/members_token_select.vue6
-rw-r--r--app/assets/javascripts/issuable/components/status_box.vue43
-rw-r--r--app/assets/javascripts/issuable/issuable_form.js15
-rw-r--r--app/assets/javascripts/issuable/issuable_label_selector.js1
-rw-r--r--app/assets/javascripts/issuable/popover/components/issue_popover.vue8
-rw-r--r--app/assets/javascripts/issuable/popover/components/mr_popover.vue8
-rw-r--r--app/assets/javascripts/issuable/popover/index.js20
-rw-r--r--app/assets/javascripts/issues/constants.js3
-rw-r--r--app/assets/javascripts/issues/dashboard/components/issues_dashboard_app.vue7
-rw-r--r--app/assets/javascripts/issues/dashboard/index.js2
-rw-r--r--app/assets/javascripts/issues/list/components/empty_state_without_any_issues.vue2
-rw-r--r--app/assets/javascripts/issues/list/components/issues_list_app.vue4
-rw-r--r--app/assets/javascripts/issues/list/index.js2
-rw-r--r--app/assets/javascripts/issues/related_merge_requests/components/related_merge_requests.vue94
-rw-r--r--app/assets/javascripts/issues/show/components/fields/description.vue49
-rw-r--r--app/assets/javascripts/issues/show/components/form.vue13
-rw-r--r--app/assets/javascripts/issues/show/components/header_actions.vue42
-rw-r--r--app/assets/javascripts/issues/show/components/incidents/timeline_events_form.vue2
-rw-r--r--app/assets/javascripts/issues/show/components/incidents/timeline_events_item.vue42
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/components/add_namespace_button.vue2
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/components/app.vue68
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/components/feedback_banner.vue57
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/components/sign_in_oauth_button.vue2
-rw-r--r--app/assets/javascripts/jobs/components/job/job_app.vue2
-rw-r--r--app/assets/javascripts/jobs/components/job/job_log_controllers.vue2
-rw-r--r--app/assets/javascripts/jobs/components/job/sidebar/job_sidebar_retry_button.vue34
-rw-r--r--app/assets/javascripts/jobs/components/job/sidebar/stages_dropdown.vue7
-rw-r--r--app/assets/javascripts/jobs/components/job/stuck_block.vue3
-rw-r--r--app/assets/javascripts/jobs/components/table/cells/job_cell.vue4
-rw-r--r--app/assets/javascripts/jobs/index.js3
-rw-r--r--app/assets/javascripts/layout_nav.js18
-rw-r--r--app/assets/javascripts/lib/logger/hello.js5
-rw-r--r--app/assets/javascripts/lib/utils/common_utils.js10
-rw-r--r--app/assets/javascripts/lib/utils/confirm_via_gl_modal/confirm_modal.vue3
-rw-r--r--app/assets/javascripts/lib/utils/datetime/date_format_utility.js32
-rw-r--r--app/assets/javascripts/lib/utils/forms.js57
-rw-r--r--app/assets/javascripts/lib/utils/text_markdown.js6
-rw-r--r--app/assets/javascripts/lib/utils/vue3compat/vue_router.js30
-rw-r--r--app/assets/javascripts/members/components/table/members_table.vue9
-rw-r--r--app/assets/javascripts/members/components/table/role_dropdown.vue1
-rw-r--r--app/assets/javascripts/members/constants.js14
-rw-r--r--app/assets/javascripts/merge_request_tabs.js8
-rw-r--r--app/assets/javascripts/merge_requests/components/sticky_header.vue6
-rw-r--r--app/assets/javascripts/merge_requests/generated_content.js64
-rw-r--r--app/assets/javascripts/milestones/index.js19
-rw-r--r--app/assets/javascripts/ml/model_registry/routes/models/index/components/ml_models_index.vue34
-rw-r--r--app/assets/javascripts/ml/model_registry/routes/models/index/index.js3
-rw-r--r--app/assets/javascripts/ml/model_registry/routes/models/index/translations.js3
-rw-r--r--app/assets/javascripts/monitoring/components/charts/annotations.js133
-rw-r--r--app/assets/javascripts/monitoring/components/charts/anomaly.vue230
-rw-r--r--app/assets/javascripts/monitoring/components/charts/bar.vue87
-rw-r--r--app/assets/javascripts/monitoring/components/charts/column.vue107
-rw-r--r--app/assets/javascripts/monitoring/components/charts/empty_chart.vue37
-rw-r--r--app/assets/javascripts/monitoring/components/charts/gauge.vue110
-rw-r--r--app/assets/javascripts/monitoring/components/charts/heatmap.vue74
-rw-r--r--app/assets/javascripts/monitoring/components/charts/options.js175
-rw-r--r--app/assets/javascripts/monitoring/components/charts/single_stat.vue71
-rw-r--r--app/assets/javascripts/monitoring/components/charts/stacked_column.vue146
-rw-r--r--app/assets/javascripts/monitoring/components/charts/time_series.vue420
-rw-r--r--app/assets/javascripts/monitoring/components/create_dashboard_modal.vue66
-rw-r--r--app/assets/javascripts/monitoring/components/dashboard.vue510
-rw-r--r--app/assets/javascripts/monitoring/components/dashboard_actions_menu.vue291
-rw-r--r--app/assets/javascripts/monitoring/components/dashboard_header.vue294
-rw-r--r--app/assets/javascripts/monitoring/components/dashboard_panel.vue388
-rw-r--r--app/assets/javascripts/monitoring/components/dashboard_panel_builder.vue204
-rw-r--r--app/assets/javascripts/monitoring/components/dashboards_dropdown.vue127
-rw-r--r--app/assets/javascripts/monitoring/components/duplicate_dashboard_form.vue138
-rw-r--r--app/assets/javascripts/monitoring/components/duplicate_dashboard_modal.vue106
-rw-r--r--app/assets/javascripts/monitoring/components/embeds/embed_group.vue102
-rw-r--r--app/assets/javascripts/monitoring/components/embeds/metric_embed.vue125
-rw-r--r--app/assets/javascripts/monitoring/components/empty_state.vue114
-rw-r--r--app/assets/javascripts/monitoring/components/graph_group.vue87
-rw-r--r--app/assets/javascripts/monitoring/components/group_empty_state.vue109
-rw-r--r--app/assets/javascripts/monitoring/components/links_section.vue32
-rw-r--r--app/assets/javascripts/monitoring/components/refresh_button.vue168
-rw-r--r--app/assets/javascripts/monitoring/components/variables/dropdown_field.vue53
-rw-r--r--app/assets/javascripts/monitoring/components/variables/text_field.vue39
-rw-r--r--app/assets/javascripts/monitoring/components/variables_section.vue53
-rw-r--r--app/assets/javascripts/monitoring/constants.js262
-rw-r--r--app/assets/javascripts/monitoring/csv_export.js146
-rw-r--r--app/assets/javascripts/monitoring/format_date.js40
-rw-r--r--app/assets/javascripts/monitoring/monitoring_app.js49
-rw-r--r--app/assets/javascripts/monitoring/monitoring_tracking_helper.js10
-rw-r--r--app/assets/javascripts/monitoring/pages/dashboard_page.vue29
-rw-r--r--app/assets/javascripts/monitoring/pages/panel_new_page.vue45
-rw-r--r--app/assets/javascripts/monitoring/queries/get_annotations.query.graphql27
-rw-r--r--app/assets/javascripts/monitoring/queries/get_dashboard_validation_warnings.query.graphql19
-rw-r--r--app/assets/javascripts/monitoring/queries/get_environments.query.graphql11
-rw-r--r--app/assets/javascripts/monitoring/requests/index.js51
-rw-r--r--app/assets/javascripts/monitoring/router/constants.js7
-rw-r--r--app/assets/javascripts/monitoring/router/index.js15
-rw-r--r--app/assets/javascripts/monitoring/router/routes.js24
-rw-r--r--app/assets/javascripts/monitoring/stores/actions.js576
-rw-r--r--app/assets/javascripts/monitoring/stores/embed_group/actions.js3
-rw-r--r--app/assets/javascripts/monitoring/stores/embed_group/getters.js2
-rw-r--r--app/assets/javascripts/monitoring/stores/embed_group/index.js22
-rw-r--r--app/assets/javascripts/monitoring/stores/embed_group/mutation_types.js1
-rw-r--r--app/assets/javascripts/monitoring/stores/embed_group/mutations.js7
-rw-r--r--app/assets/javascripts/monitoring/stores/embed_group/state.js3
-rw-r--r--app/assets/javascripts/monitoring/stores/getters.js174
-rw-r--r--app/assets/javascripts/monitoring/stores/index.js29
-rw-r--r--app/assets/javascripts/monitoring/stores/mutation_types.js62
-rw-r--r--app/assets/javascripts/monitoring/stores/mutations.js273
-rw-r--r--app/assets/javascripts/monitoring/stores/state.js97
-rw-r--r--app/assets/javascripts/monitoring/stores/utils.js505
-rw-r--r--app/assets/javascripts/monitoring/stores/variable_mapping.js273
-rw-r--r--app/assets/javascripts/monitoring/utils.js402
-rw-r--r--app/assets/javascripts/monitoring/validators.js55
-rw-r--r--app/assets/javascripts/mr_more_dropdown.js9
-rw-r--r--app/assets/javascripts/mr_notes/init.js7
-rw-r--r--app/assets/javascripts/nav/components/new_nav_toggle.vue9
-rw-r--r--app/assets/javascripts/nav/components/responsive_home.vue2
-rw-r--r--app/assets/javascripts/nav/components/top_nav_app.vue2
-rw-r--r--app/assets/javascripts/nav/components/top_nav_dropdown_menu.vue1
-rw-r--r--app/assets/javascripts/notes/components/comment_field_layout.vue20
-rw-r--r--app/assets/javascripts/notes/components/comment_form.vue14
-rw-r--r--app/assets/javascripts/notes/components/comment_type_dropdown.vue97
-rw-r--r--app/assets/javascripts/notes/components/diff_discussion_header.vue8
-rw-r--r--app/assets/javascripts/notes/components/discussion_counter.vue90
-rw-r--r--app/assets/javascripts/notes/components/discussion_notes.vue1
-rw-r--r--app/assets/javascripts/notes/components/discussion_notes_replies_wrapper.vue2
-rw-r--r--app/assets/javascripts/notes/components/mr_discussion_filter.vue11
-rw-r--r--app/assets/javascripts/notes/components/note_actions.vue29
-rw-r--r--app/assets/javascripts/notes/components/note_body.vue1
-rw-r--r--app/assets/javascripts/notes/components/note_form.vue34
-rw-r--r--app/assets/javascripts/notes/components/noteable_discussion.vue19
-rw-r--r--app/assets/javascripts/notes/components/noteable_note.vue34
-rw-r--r--app/assets/javascripts/notes/components/toggle_replies_widget.vue2
-rw-r--r--app/assets/javascripts/notes/mixins/diff_line_note_form.js34
-rw-r--r--app/assets/javascripts/notes/utils.js14
-rw-r--r--app/assets/javascripts/notifications/components/notification_email_listbox_input.vue4
-rw-r--r--app/assets/javascripts/notifications/index.js10
-rw-r--r--app/assets/javascripts/observability/client.js43
-rw-r--r--app/assets/javascripts/observability/components/observability_container.vue92
-rw-r--r--app/assets/javascripts/observability/components/skeleton/index.vue59
-rw-r--r--app/assets/javascripts/observability/constants.js1
-rw-r--r--app/assets/javascripts/observability/mock_traces.json2807
-rw-r--r--app/assets/javascripts/organizations/groups_and_projects/components/app.vue62
-rw-r--r--app/assets/javascripts/organizations/groups_and_projects/graphql/queries/projects.query.graphql24
-rw-r--r--app/assets/javascripts/organizations/groups_and_projects/graphql/resolvers.js14
-rw-r--r--app/assets/javascripts/organizations/groups_and_projects/index.js24
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/tags_list_row.vue42
-rw-r--r--app/assets/javascripts/packages_and_registries/dependency_proxy/app.vue29
-rw-r--r--app/assets/javascripts/packages_and_registries/dependency_proxy/components/manifests_empty_state.vue80
-rw-r--r--app/assets/javascripts/packages_and_registries/dependency_proxy/components/manifests_list.vue21
-rw-r--r--app/assets/javascripts/packages_and_registries/dependency_proxy/constants.js9
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/components/details/package_files.vue277
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/components/details/version_row.vue31
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/components/list/package_list_row.vue53
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/components/list/packages_list.vue2
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/constants.js2
-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/index.js1
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/graphql/queries/get_package_files.query.graphql14
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/index.js3
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/pages/list.vue25
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/group/components/group_settings_app.vue1
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/project/components/packages_cleanup_policy_form.vue2
-rw-r--r--app/assets/javascripts/packages_and_registries/shared/components/settings_block.vue18
-rw-r--r--app/assets/javascripts/pages/groups/new/components/app.vue8
-rw-r--r--app/assets/javascripts/pages/organizations/organizations/groups_and_projects/index.js3
-rw-r--r--app/assets/javascripts/pages/profiles/two_factor_auths/index.js6
-rw-r--r--app/assets/javascripts/pages/projects/blob/show/index.js7
-rw-r--r--app/assets/javascripts/pages/projects/environments/metrics/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/forks/new/components/fork_form.vue1
-rw-r--r--app/assets/javascripts/pages/projects/issues/new/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/issues/service_desk/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/merge_requests/creations/new/index.js4
-rw-r--r--app/assets/javascripts/pages/projects/merge_requests/diffs/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/merge_requests/edit/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/merge_requests/page.js2
-rw-r--r--app/assets/javascripts/pages/projects/merge_requests/show/index.js6
-rw-r--r--app/assets/javascripts/pages/projects/metrics_dashboard/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/ml/models/index/index.js4
-rw-r--r--app/assets/javascripts/pages/projects/pipeline_schedules/edit/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/interval_pattern_input.vue7
-rw-r--r--app/assets/javascripts/pages/projects/pipelines/show/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/shared/web_ide_link/index.js5
-rw-r--r--app/assets/javascripts/pages/projects/shared/web_ide_link/provide_web_ide_link.js9
-rw-r--r--app/assets/javascripts/pages/projects/tracing/index/index.js4
-rw-r--r--app/assets/javascripts/pages/shared/wikis/components/wiki_form.vue7
-rw-r--r--app/assets/javascripts/pages/shared/wikis/constants.js1
-rw-r--r--app/assets/javascripts/pages/shared/wikis/edit.js7
-rw-r--r--app/assets/javascripts/pages/users/show/index.js2
-rw-r--r--app/assets/javascripts/pipelines/components/graph/graph_component_wrapper.vue41
-rw-r--r--app/assets/javascripts/pipelines/components/graph/linked_pipeline.vue6
-rw-r--r--app/assets/javascripts/pipelines/components/header_component.vue320
-rw-r--r--app/assets/javascripts/pipelines/components/pipeline_details_header.vue52
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/empty_state/ios_templates.vue4
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/failure_widget/failed_job_details.vue164
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/failure_widget/failed_jobs_list.vue166
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/failure_widget/pipeline_failed_jobs_widget.vue108
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/failure_widget/utils.js4
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/failure_widget/widget_failed_job_row.vue107
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipelines_artifacts.vue51
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table.vue14
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/time_ago.vue13
-rw-r--r--app/assets/javascripts/pipelines/components/test_reports/empty_state.vue2
-rw-r--r--app/assets/javascripts/pipelines/components/test_reports/test_suite_table.vue2
-rw-r--r--app/assets/javascripts/pipelines/graphql/mutations/retry_mr_failed_job.mutation.graphql5
-rw-r--r--app/assets/javascripts/pipelines/graphql/queries/get_pipeline_failed_jobs.query.graphql7
-rw-r--r--app/assets/javascripts/pipelines/graphql/queries/get_pipeline_failed_jobs_count.query.graphql12
-rw-r--r--app/assets/javascripts/pipelines/pipeline_details_bundle.js12
-rw-r--r--app/assets/javascripts/pipelines/pipeline_details_header.js35
-rw-r--r--app/assets/javascripts/profile/account/components/delete_account_modal.vue16
-rw-r--r--app/assets/javascripts/profile/account/components/update_username.vue2
-rw-r--r--app/assets/javascripts/profile/components/follow.vue33
-rw-r--r--app/assets/javascripts/profile/components/followers_tab.vue4
-rw-r--r--app/assets/javascripts/profile/components/following_tab.vue57
-rw-r--r--app/assets/javascripts/profile/components/profile_tabs.vue17
-rw-r--r--app/assets/javascripts/profile/components/snippets/snippets_tab.vue37
-rw-r--r--app/assets/javascripts/profile/components/user_achievements.vue2
-rw-r--r--app/assets/javascripts/profile/index.js4
-rw-r--r--app/assets/javascripts/profile/preferences/components/profile_preferences.vue49
-rw-r--r--app/assets/javascripts/projects/clusters_deprecation_alert/components/clusters_deprecation_alert.vue4
-rw-r--r--app/assets/javascripts/projects/commits/components/author_select.vue136
-rw-r--r--app/assets/javascripts/projects/compare/components/app.vue126
-rw-r--r--app/assets/javascripts/projects/compare/components/revision_card.vue2
-rw-r--r--app/assets/javascripts/projects/compare/constants.js25
-rw-r--r--app/assets/javascripts/projects/new/components/app.vue16
-rw-r--r--app/assets/javascripts/projects/settings/access_dropdown.js16
-rw-r--r--app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue18
-rw-r--r--app/assets/javascripts/projects/settings_service_desk/components/service_desk_setting.vue22
-rw-r--r--app/assets/javascripts/projects/settings_service_desk/index.js8
-rw-r--r--app/assets/javascripts/projects/tree/components/commit_pipeline_status.vue (renamed from app/assets/javascripts/projects/tree/components/commit_pipeline_status_component.vue)0
-rw-r--r--app/assets/javascripts/related_issues/components/related_issues_block.vue79
-rw-r--r--app/assets/javascripts/releases/components/app_edit_new.vue3
-rw-r--r--app/assets/javascripts/repository/components/blob_content_viewer.vue34
-rw-r--r--app/assets/javascripts/repository/components/blob_viewers/geo_json/constants.js2
-rw-r--r--app/assets/javascripts/repository/components/blob_viewers/index.js8
-rw-r--r--app/assets/javascripts/repository/components/breadcrumbs.vue177
-rw-r--r--app/assets/javascripts/repository/components/last_commit.vue2
-rw-r--r--app/assets/javascripts/repository/index.js8
-rw-r--r--app/assets/javascripts/repository/mixins/highlight_mixin.js13
-rw-r--r--app/assets/javascripts/search/sidebar/components/label_filter/index.vue31
-rw-r--r--app/assets/javascripts/search/sidebar/components/label_filter/label_dropdown_items.vue6
-rw-r--r--app/assets/javascripts/search/store/constants.js6
-rw-r--r--app/assets/javascripts/search/topbar/components/group_filter.vue3
-rw-r--r--app/assets/javascripts/search/topbar/components/project_filter.vue3
-rw-r--r--app/assets/javascripts/security_configuration/components/training_provider_list.vue2
-rw-r--r--app/assets/javascripts/service_desk/components/info_banner.vue64
-rw-r--r--app/assets/javascripts/service_desk/components/service_desk_list_app.vue151
-rw-r--r--app/assets/javascripts/service_desk/constants.js17
-rw-r--r--app/assets/javascripts/service_desk/graphql.js24
-rw-r--r--app/assets/javascripts/service_desk/index.js55
-rw-r--r--app/assets/javascripts/service_desk/queries/get_service_desk_issues.query.graphql72
-rw-r--r--app/assets/javascripts/service_desk/queries/get_service_desk_issues_counts.query.graphql91
-rw-r--r--app/assets/javascripts/service_desk/queries/issue.fragment.graphql60
-rw-r--r--app/assets/javascripts/sidebar/components/assignees/assignee_avatar_link.vue76
-rw-r--r--app/assets/javascripts/sidebar/components/assignees/assignee_title.vue20
-rw-r--r--app/assets/javascripts/sidebar/components/assignees/collapsed_assignee_list.vue2
-rw-r--r--app/assets/javascripts/sidebar/components/assignees/sidebar_assignees.vue6
-rw-r--r--app/assets/javascripts/sidebar/components/assignees/uncollapsed_assignee_list.vue3
-rw-r--r--app/assets/javascripts/sidebar/components/crm_contacts/crm_contacts.vue6
-rw-r--r--app/assets/javascripts/sidebar/components/labels/labels_select_vue/dropdown_contents.vue1
-rw-r--r--app/assets/javascripts/sidebar/components/labels/labels_select_widget/dropdown_contents.vue9
-rw-r--r--app/assets/javascripts/sidebar/components/lock/issuable_lock_form.vue15
-rw-r--r--app/assets/javascripts/sidebar/components/participants/participants.vue9
-rw-r--r--app/assets/javascripts/sidebar/components/reviewers/collapsed_reviewer_list.vue2
-rw-r--r--app/assets/javascripts/sidebar/components/reviewers/reviewer_avatar_link.vue35
-rw-r--r--app/assets/javascripts/sidebar/components/severity/sidebar_severity_widget.vue36
-rw-r--r--app/assets/javascripts/sidebar/mount_sidebar.js1
-rw-r--r--app/assets/javascripts/snippets/constants.js3
-rw-r--r--app/assets/javascripts/super_sidebar/components/brand_logo.vue2
-rw-r--r--app/assets/javascripts/super_sidebar/components/create_menu.vue17
-rw-r--r--app/assets/javascripts/super_sidebar/components/frequent_items_list.vue1
-rw-r--r--app/assets/javascripts/super_sidebar/components/global_search/command_palette/command_palette_items.vue154
-rw-r--r--app/assets/javascripts/super_sidebar/components/global_search/command_palette/constants.js13
-rw-r--r--app/assets/javascripts/super_sidebar/components/global_search/command_palette/fake_search_input.vue4
-rw-r--r--app/assets/javascripts/super_sidebar/components/global_search/command_palette/utils.js14
-rw-r--r--app/assets/javascripts/super_sidebar/components/global_search/components/global_search.vue106
-rw-r--r--app/assets/javascripts/super_sidebar/components/global_search/constants.js2
-rw-r--r--app/assets/javascripts/super_sidebar/components/help_center.vue2
-rw-r--r--app/assets/javascripts/super_sidebar/components/items_list.vue9
-rw-r--r--app/assets/javascripts/super_sidebar/components/menu_section.vue10
-rw-r--r--app/assets/javascripts/super_sidebar/components/nav_item.vue18
-rw-r--r--app/assets/javascripts/super_sidebar/components/sidebar_peek_behavior.vue6
-rw-r--r--app/assets/javascripts/super_sidebar/components/super_sidebar.vue6
-rw-r--r--app/assets/javascripts/super_sidebar/components/super_sidebar_toggle.vue6
-rw-r--r--app/assets/javascripts/super_sidebar/components/user_bar.vue6
-rw-r--r--app/assets/javascripts/super_sidebar/components/user_menu.vue23
-rw-r--r--app/assets/javascripts/super_sidebar/components/user_name_group.vue6
-rw-r--r--app/assets/javascripts/super_sidebar/constants.js2
-rw-r--r--app/assets/javascripts/super_sidebar/super_sidebar_bundle.js14
-rw-r--r--app/assets/javascripts/super_sidebar/super_sidebar_collapsed_state_manager.js9
-rw-r--r--app/assets/javascripts/surveys/merge_request_experience/app.vue4
-rw-r--r--app/assets/javascripts/token_access/components/outbound_token_access.vue24
-rw-r--r--app/assets/javascripts/tracing/components/tracing_empty_state.vue46
-rw-r--r--app/assets/javascripts/tracing/components/tracing_list.vue93
-rw-r--r--app/assets/javascripts/tracing/components/tracing_table_list.vue89
-rw-r--r--app/assets/javascripts/tracing/list_index.vue37
-rw-r--r--app/assets/javascripts/tracking/constants.js5
-rw-r--r--app/assets/javascripts/tracking/index.js4
-rw-r--r--app/assets/javascripts/tracking/internal_events.js58
-rw-r--r--app/assets/javascripts/tracking/utils.js18
-rw-r--r--app/assets/javascripts/usage_quotas/storage/components/usage_graph.vue7
-rw-r--r--app/assets/javascripts/usage_quotas/storage/constants.js17
-rw-r--r--app/assets/javascripts/usage_quotas/storage/queries/project_storage.query.graphql1
-rw-r--r--app/assets/javascripts/users/profile/actions/components/user_actions_app.vue45
-rw-r--r--app/assets/javascripts/users/profile/actions/index.js25
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/extensions/base.vue2
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/extensions/index.js83
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/commit_message_dropdown.vue41
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/ready_to_merge.vue103
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/widget/action_buttons.vue2
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/widget/app.vue10
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/widget/dynamic_content.vue32
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/widget/widget.vue37
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/constants.js3
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/extensions/security_reports/mr_widget_security_reports.vue5
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/extensions/terraform/index.js179
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/extensions/terraform/index.vue200
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/mixins/ready_to_merge.js6
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue31
-rw-r--r--app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_assignees.vue6
-rw-r--r--app/assets/javascripts/vue_shared/components/actions_button.vue7
-rw-r--r--app/assets/javascripts/vue_shared/components/awards_list.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/blob_viewers/rich_viewer.vue17
-rw-r--r--app/assets/javascripts/vue_shared/components/ci_icon.vue12
-rw-r--r--app/assets/javascripts/vue_shared/components/code_block_highlighted.vue4
-rw-r--r--app/assets/javascripts/vue_shared/components/confirm_danger/constants.js4
-rw-r--r--app/assets/javascripts/vue_shared/components/entity_select/entity_select.vue7
-rw-r--r--app/assets/javascripts/vue_shared/components/entity_select/group_select.vue1
-rw-r--r--app/assets/javascripts/vue_shared/components/entity_select/project_select.vue1
-rw-r--r--app/assets/javascripts/vue_shared/components/header_ci_component.vue6
-rw-r--r--app/assets/javascripts/vue_shared/components/listbox_input/init_listbox_inputs.js3
-rw-r--r--app/assets/javascripts/vue_shared/components/listbox_input/listbox_input.vue18
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/apply_suggestion.vue3
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/comment_templates_dropdown.vue26
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/editor_mode_switcher.vue103
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/field.vue59
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/header.vue163
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/markdown_editor.vue28
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/mount_markdown_editor.js17
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/non_gfm_markdown.stories.js89
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/non_gfm_markdown.vue120
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/suggestions.vue5
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/toolbar.vue208
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/tracking.js14
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/utils.js7
-rw-r--r--app/assets/javascripts/vue_shared/components/mr_more_dropdown.vue27
-rw-r--r--app/assets/javascripts/vue_shared/components/paginated_table_with_search_and_tabs/paginated_table_with_search_and_tabs.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/projects_list/projects_list.vue12
-rw-r--r--app/assets/javascripts/vue_shared/components/projects_list/projects_list_item.vue154
-rw-r--r--app/assets/javascripts/vue_shared/components/registry/list_item.vue13
-rw-r--r--app/assets/javascripts/vue_shared/components/runner_instructions/instructions/runner_docker_instructions.vue3
-rw-r--r--app/assets/javascripts/vue_shared/components/runner_instructions/instructions/runner_kubernetes_instructions.vue3
-rw-r--r--app/assets/javascripts/vue_shared/components/runner_instructions/runner_instructions_modal.vue15
-rw-r--r--app/assets/javascripts/vue_shared/components/source_viewer/components/chunk_new.vue5
-rw-r--r--app/assets/javascripts/vue_shared/components/source_viewer/plugins/index.js4
-rw-r--r--app/assets/javascripts/vue_shared/components/source_viewer/plugins/wrap_child_nodes.js2
-rw-r--r--app/assets/javascripts/vue_shared/components/source_viewer/plugins/wrap_lines.js20
-rw-r--r--app/assets/javascripts/vue_shared/components/source_viewer/source_viewer_new.vue9
-rw-r--r--app/assets/javascripts/vue_shared/components/source_viewer/workers/highlight_utils.js10
-rw-r--r--app/assets/javascripts/vue_shared/components/source_viewer/workers/highlight_worker.js (renamed from app/assets/javascripts/vue_shared/components/source_viewer/workers/highlight.js)0
-rw-r--r--app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_link.vue25
-rw-r--r--app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_list.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/user_popover/user_popover.vue21
-rw-r--r--app/assets/javascripts/vue_shared/components/web_ide_link.vue7
-rw-r--r--app/assets/javascripts/vue_shared/constants.js1
-rw-r--r--app/assets/javascripts/vue_shared/global_search/constants.js20
-rw-r--r--app/assets/javascripts/vue_shared/issuable/show/components/issuable_header.vue40
-rw-r--r--app/assets/javascripts/vue_shared/issuable/show/components/issuable_title.vue7
-rw-r--r--app/assets/javascripts/vue_shared/new_namespace/components/welcome.vue11
-rw-r--r--app/assets/javascripts/vue_shared/new_namespace/new_namespace_page.vue8
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/components/artifact_downloads/merge_request_artifact_download.vue91
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/components/constants.js8
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/components/help_icon.vue58
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/components/security_summary.vue59
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/constants.js1
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/security_reports_app.vue238
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/store/constants.js7
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/store/getters.js66
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/store/index.js16
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/store/messages.js4
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/store/modules/sast/actions.js26
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/store/modules/sast/index.js10
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/store/modules/sast/mutation_types.js4
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/store/modules/sast/mutations.js31
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/store/modules/sast/state.js14
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/store/modules/secret_detection/actions.js26
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/store/modules/secret_detection/index.js10
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/store/modules/secret_detection/mutation_types.js4
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/store/modules/secret_detection/mutations.js30
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/store/modules/secret_detection/state.js14
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/store/state.js5
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/store/utils.js154
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/utils.js10
-rw-r--r--app/assets/javascripts/work_items/components/item_state.vue4
-rw-r--r--app/assets/javascripts/work_items/components/notes/system_note.vue2
-rw-r--r--app/assets/javascripts/work_items/components/notes/work_item_note.vue21
-rw-r--r--app/assets/javascripts/work_items/components/notes/work_item_note_actions.vue64
-rw-r--r--app/assets/javascripts/work_items/components/notes/work_item_note_awards_list.vue95
-rw-r--r--app/assets/javascripts/work_items/components/widget_wrapper.vue28
-rw-r--r--app/assets/javascripts/work_items/components/work_item_assignees.vue7
-rw-r--r--app/assets/javascripts/work_items/components/work_item_attributes_wrapper.vue180
-rw-r--r--app/assets/javascripts/work_items/components/work_item_award_emoji.vue90
-rw-r--r--app/assets/javascripts/work_items/components/work_item_description.vue12
-rw-r--r--app/assets/javascripts/work_items/components/work_item_description_rendered.vue2
-rw-r--r--app/assets/javascripts/work_items/components/work_item_detail.vue403
-rw-r--r--app/assets/javascripts/work_items/components/work_item_due_date.vue6
-rw-r--r--app/assets/javascripts/work_items/components/work_item_labels.vue14
-rw-r--r--app/assets/javascripts/work_items/components/work_item_links/work_item_link_child.vue2
-rw-r--r--app/assets/javascripts/work_items/components/work_item_links/work_item_links.vue100
-rw-r--r--app/assets/javascripts/work_items/components/work_item_links/work_item_links_form.vue3
-rw-r--r--app/assets/javascripts/work_items/components/work_item_links/work_item_tree.vue8
-rw-r--r--app/assets/javascripts/work_items/components/work_item_milestone.vue6
-rw-r--r--app/assets/javascripts/work_items/components/work_item_todos.vue109
-rw-r--r--app/assets/javascripts/work_items/constants.js15
-rw-r--r--app/assets/javascripts/work_items/graphql/award_emoji.query.graphql27
-rw-r--r--app/assets/javascripts/work_items/graphql/cache_utils.js40
-rw-r--r--app/assets/javascripts/work_items/graphql/create_work_item_todos.mutation.graphql9
-rw-r--r--app/assets/javascripts/work_items/graphql/mark_done_work_item_todos.mutation.graphql9
-rw-r--r--app/assets/javascripts/work_items/graphql/notes/work_item_note.fragment.graphql6
-rw-r--r--app/assets/javascripts/work_items/graphql/notes/work_item_note_add_award_emoji.mutation.graphql12
-rw-r--r--app/assets/javascripts/work_items/graphql/notes/work_item_note_remove_award_emoji.mutation.graphql5
-rw-r--r--app/assets/javascripts/work_items/graphql/work_item_assignees.subscription.graphql21
-rw-r--r--app/assets/javascripts/work_items/graphql/work_item_description.subscription.graphql20
-rw-r--r--app/assets/javascripts/work_items/graphql/work_item_labels.subscription.graphql19
-rw-r--r--app/assets/javascripts/work_items/graphql/work_item_metadata_widgets.fragment.graphql13
-rw-r--r--app/assets/javascripts/work_items/graphql/work_item_milestone.subscription.graphql17
-rw-r--r--app/assets/javascripts/work_items/graphql/work_item_title.subscription.graphql8
-rw-r--r--app/assets/javascripts/work_items/graphql/work_item_updated.subscription.graphql7
-rw-r--r--app/assets/javascripts/work_items/graphql/work_item_widgets.fragment.graphql13
-rw-r--r--app/assets/javascripts/work_items/notes/award_utils.js67
-rw-r--r--app/assets/javascripts/work_items/utils.js49
-rw-r--r--app/assets/stylesheets/components/avatar.scss21
-rw-r--r--app/assets/stylesheets/components/content_editor.scss175
-rw-r--r--app/assets/stylesheets/fonts.scss54
-rw-r--r--app/assets/stylesheets/framework.scss2
-rw-r--r--app/assets/stylesheets/framework/brand_logo.scss29
-rw-r--r--app/assets/stylesheets/framework/common.scss33
-rw-r--r--app/assets/stylesheets/framework/diffs.scss22
-rw-r--r--app/assets/stylesheets/framework/emojis.scss7
-rw-r--r--app/assets/stylesheets/framework/header.scss4
-rw-r--r--app/assets/stylesheets/framework/layout.scss7
-rw-r--r--app/assets/stylesheets/framework/markdown_area.scss3
-rw-r--r--app/assets/stylesheets/framework/new_card.scss94
-rw-r--r--app/assets/stylesheets/framework/selects.scss6
-rw-r--r--app/assets/stylesheets/framework/sidebar.scss4
-rw-r--r--app/assets/stylesheets/framework/super_sidebar.scss35
-rw-r--r--app/assets/stylesheets/framework/system_messages.scss10
-rw-r--r--app/assets/stylesheets/framework/timeline.scss8
-rw-r--r--app/assets/stylesheets/framework/typography.scss11
-rw-r--r--app/assets/stylesheets/framework/variables.scss15
-rw-r--r--app/assets/stylesheets/page_bundles/branches.scss12
-rw-r--r--app/assets/stylesheets/page_bundles/design_management.scss17
-rw-r--r--app/assets/stylesheets/page_bundles/issuable.scss4
-rw-r--r--app/assets/stylesheets/page_bundles/jira_connect.scss8
-rw-r--r--app/assets/stylesheets/page_bundles/login.scss62
-rw-r--r--app/assets/stylesheets/page_bundles/merge_requests.scss25
-rw-r--r--app/assets/stylesheets/page_bundles/notifications.scss28
-rw-r--r--app/assets/stylesheets/page_bundles/profiles/preferences.scss7
-rw-r--r--app/assets/stylesheets/page_bundles/project.scss6
-rw-r--r--app/assets/stylesheets/page_bundles/prometheus.scss113
-rw-r--r--app/assets/stylesheets/page_bundles/search.scss4
-rw-r--r--app/assets/stylesheets/page_bundles/settings.scss2
-rw-r--r--app/assets/stylesheets/page_bundles/tree.scss15
-rw-r--r--app/assets/stylesheets/page_bundles/work_items.scss54
-rw-r--r--app/assets/stylesheets/pages/commits.scss8
-rw-r--r--app/assets/stylesheets/pages/note_form.scss76
-rw-r--r--app/assets/stylesheets/pages/notes.scss20
-rw-r--r--app/assets/stylesheets/pages/projects.scss54
-rw-r--r--app/assets/stylesheets/pages/settings.scss67
-rw-r--r--app/assets/stylesheets/startup/startup-dark.scss20
-rw-r--r--app/assets/stylesheets/startup/startup-general.scss20
-rw-r--r--app/assets/stylesheets/startup/startup-signin.scss39
-rw-r--r--app/assets/stylesheets/themes/dark_mode_overrides.scss3
-rw-r--r--app/assets/stylesheets/utilities.scss20
-rw-r--r--app/assets/stylesheets/vendors/atwho.scss29
-rw-r--r--app/components/pajamas/banner_component.html.haml2
-rw-r--r--app/components/pajamas/banner_component.rb2
-rw-r--r--app/components/pajamas/empty_state_component.html.haml29
-rw-r--r--app/components/pajamas/empty_state_component.rb35
-rw-r--r--app/controllers/admin/application_settings/appearances_controller.rb2
-rw-r--r--app/controllers/admin/application_settings_controller.rb10
-rw-r--r--app/controllers/admin/runners_controller.rb19
-rw-r--r--app/controllers/admin/users_controller.rb7
-rw-r--r--app/controllers/application_controller.rb2
-rw-r--r--app/controllers/clusters/clusters_controller.rb1
-rw-r--r--app/controllers/concerns/integrations/params.rb2
-rw-r--r--app/controllers/concerns/internal_redirect.rb2
-rw-r--r--app/controllers/concerns/issuable_actions.rb5
-rw-r--r--app/controllers/concerns/membership_actions.rb2
-rw-r--r--app/controllers/concerns/metrics_dashboard.rb126
-rw-r--r--app/controllers/concerns/observability/content_security_policy.rb21
-rw-r--r--app/controllers/concerns/onboarding/status.rb41
-rw-r--r--app/controllers/concerns/preview_markdown.rb4
-rw-r--r--app/controllers/concerns/redirects_for_missing_path_on_tree.rb4
-rw-r--r--app/controllers/concerns/requires_allowlisted_monitoring_client.rb40
-rw-r--r--app/controllers/concerns/requires_whitelisted_monitoring_client.rb40
-rw-r--r--app/controllers/concerns/uploads_actions.rb17
-rw-r--r--app/controllers/concerns/verifies_with_email.rb8
-rw-r--r--app/controllers/explore/projects_controller.rb9
-rw-r--r--app/controllers/graphql_controller.rb33
-rw-r--r--app/controllers/groups/milestones_controller.rb4
-rw-r--r--app/controllers/groups/runners_controller.rb20
-rw-r--r--app/controllers/groups/settings/ci_cd_controller.rb1
-rw-r--r--app/controllers/groups/uploads_controller.rb2
-rw-r--r--app/controllers/health_check_controller.rb2
-rw-r--r--app/controllers/health_controller.rb2
-rw-r--r--app/controllers/import/base_controller.rb2
-rw-r--r--app/controllers/import/bitbucket_server_controller.rb4
-rw-r--r--app/controllers/metrics_controller.rb2
-rw-r--r--app/controllers/oauth/authorizations_controller.rb2
-rw-r--r--app/controllers/organizations/application_controller.rb2
-rw-r--r--app/controllers/organizations/organizations_controller.rb4
-rw-r--r--app/controllers/profiles/accounts_controller.rb1
-rw-r--r--app/controllers/profiles/notifications_controller.rb2
-rw-r--r--app/controllers/projects/alerting/notifications_controller.rb2
-rw-r--r--app/controllers/projects/blob_controller.rb15
-rw-r--r--app/controllers/projects/environments_controller.rb10
-rw-r--r--app/controllers/projects/forks_controller.rb11
-rw-r--r--app/controllers/projects/grafana_api_controller.rb46
-rw-r--r--app/controllers/projects/incidents_controller.rb1
-rw-r--r--app/controllers/projects/issues_controller.rb4
-rw-r--r--app/controllers/projects/jobs_controller.rb6
-rw-r--r--app/controllers/projects/merge_requests/conflicts_controller.rb14
-rw-r--r--app/controllers/projects/merge_requests/creations_controller.rb20
-rw-r--r--app/controllers/projects/merge_requests/diffs_controller.rb11
-rw-r--r--app/controllers/projects/merge_requests/drafts_controller.rb27
-rw-r--r--app/controllers/projects/merge_requests_controller.rb75
-rw-r--r--app/controllers/projects/milestones_controller.rb4
-rw-r--r--app/controllers/projects/ml/candidates_controller.rb10
-rw-r--r--app/controllers/projects/ml/experiments_controller.rb9
-rw-r--r--app/controllers/projects/ml/models_controller.rb20
-rw-r--r--app/controllers/projects/notes_controller.rb23
-rw-r--r--app/controllers/projects/pages_controller.rb10
-rw-r--r--app/controllers/projects/pipeline_schedules_controller.rb25
-rw-r--r--app/controllers/projects/pipelines_controller.rb5
-rw-r--r--app/controllers/projects/runners_controller.rb16
-rw-r--r--app/controllers/projects/service_desk/custom_email_controller.rb84
-rw-r--r--app/controllers/projects/service_desk_controller.rb6
-rw-r--r--app/controllers/projects/settings/ci_cd_controller.rb4
-rw-r--r--app/controllers/projects/tracing_controller.rb19
-rw-r--r--app/controllers/projects/tree_controller.rb35
-rw-r--r--app/controllers/projects/uploads_controller.rb2
-rw-r--r--app/controllers/projects_controller.rb6
-rw-r--r--app/controllers/registrations/welcome_controller.rb53
-rw-r--r--app/controllers/registrations_controller.rb3
-rw-r--r--app/controllers/uploads_controller.rb2
-rw-r--r--app/controllers/users_controller.rb45
-rw-r--r--app/experiments/concerns/project_commit_count.rb21
-rw-r--r--app/experiments/empty_repo_upload_experiment.rb22
-rw-r--r--app/experiments/force_company_trial_experiment.rb11
-rw-r--r--app/experiments/logged_out_marketing_header_experiment.rb9
-rw-r--r--app/finders/award_emojis_finder.rb2
-rw-r--r--app/finders/ci/group_variables_finder.rb39
-rw-r--r--app/finders/ci/pipelines_finder.rb2
-rw-r--r--app/finders/ci/runners_finder.rb11
-rw-r--r--app/finders/deployments_finder.rb1
-rw-r--r--app/finders/events_finder.rb1
-rw-r--r--app/finders/group_descendants_finder.rb6
-rw-r--r--app/finders/group_projects_finder.rb9
-rw-r--r--app/finders/issuable_finder.rb3
-rw-r--r--app/finders/issuables/assignee_filter.rb2
-rw-r--r--app/finders/members_finder.rb4
-rw-r--r--app/finders/merge_requests_finder.rb1
-rw-r--r--app/finders/packages/ml_model/package_finder.rb23
-rw-r--r--app/finders/packages/npm/package_finder.rb19
-rw-r--r--app/finders/projects/ml/model_finder.rb21
-rw-r--r--app/finders/projects_finder.rb10
-rw-r--r--app/finders/users_finder.rb20
-rw-r--r--app/graphql/gitlab_schema.rb3
-rw-r--r--app/graphql/mutations/alert_management/prometheus_integration/create.rb2
-rw-r--r--app/graphql/mutations/ci/job_token_scope/add_project.rb5
-rw-r--r--app/graphql/mutations/ci/pipeline_schedule/create.rb30
-rw-r--r--app/graphql/mutations/ci/pipeline_schedule/update.rb14
-rw-r--r--app/graphql/mutations/ci/pipeline_schedule/variable_input_type.rb7
-rw-r--r--app/graphql/mutations/ci/project_ci_cd_settings_update.rb2
-rw-r--r--app/graphql/mutations/ci/runner/create.rb24
-rw-r--r--app/graphql/mutations/environments/create.rb5
-rw-r--r--app/graphql/mutations/environments/update.rb5
-rw-r--r--app/graphql/resolvers/alert_management/http_integrations_resolver.rb2
-rw-r--r--app/graphql/resolvers/alert_management/integrations_resolver.rb2
-rw-r--r--app/graphql/resolvers/ci/inherited_variables_resolver.rb8
-rw-r--r--app/graphql/resolvers/ci/runner_job_count_resolver.rb49
-rw-r--r--app/graphql/resolvers/ci/runners_resolver.rb3
-rw-r--r--app/graphql/resolvers/concerns/issues/look_ahead_preloads.rb8
-rw-r--r--app/graphql/resolvers/concerns/resolves_merge_requests.rb5
-rw-r--r--app/graphql/resolvers/issues/base_resolver.rb8
-rw-r--r--app/graphql/resolvers/metrics/dashboard_resolver.rb35
-rw-r--r--app/graphql/resolvers/user_merge_requests_resolver_base.rb8
-rw-r--r--app/graphql/types/alert_management/alert_type.rb13
-rw-r--r--app/graphql/types/assignee_wildcard_id_enum.rb11
-rw-r--r--app/graphql/types/boards/assignee_wildcard_id_enum.rb13
-rw-r--r--app/graphql/types/boards/board_issue_input_type.rb4
-rw-r--r--app/graphql/types/ci/config/include_type.rb16
-rw-r--r--app/graphql/types/ci/group_variable_type.rb4
-rw-r--r--app/graphql/types/ci/group_variables_sort_enum.rb20
-rw-r--r--app/graphql/types/ci/job_type.rb10
-rw-r--r--app/graphql/types/ci/project_variable_type.rb4
-rw-r--r--app/graphql/types/ci/runner_sort_enum.rb2
-rw-r--r--app/graphql/types/ci/runner_type.rb49
-rw-r--r--app/graphql/types/ci/stage_type.rb2
-rw-r--r--app/graphql/types/current_user_todos.rb3
-rw-r--r--app/graphql/types/environment_type.rb8
-rw-r--r--app/graphql/types/ide_type.rb17
-rw-r--r--app/graphql/types/merge_request_type.rb4
-rw-r--r--app/graphql/types/metrics/dashboard_type.rb33
-rw-r--r--app/graphql/types/project_statistics_type.rb2
-rw-r--r--app/graphql/types/project_type.rb2
-rw-r--r--app/graphql/types/root_storage_statistics_type.rb14
-rw-r--r--app/graphql/types/user_interface.rb11
-rw-r--r--app/helpers/admin/application_settings/settings_helper.rb19
-rw-r--r--app/helpers/application_helper.rb20
-rw-r--r--app/helpers/application_settings_helper.rb3
-rw-r--r--app/helpers/auth_helper.rb3
-rw-r--r--app/helpers/blob_helper.rb4
-rw-r--r--app/helpers/button_helper.rb62
-rw-r--r--app/helpers/calendar_helper.rb2
-rw-r--r--app/helpers/ci/jobs_helper.rb14
-rw-r--r--app/helpers/ci/pipeline_schedules_helper.rb19
-rw-r--r--app/helpers/ci/pipelines_helper.rb12
-rw-r--r--app/helpers/clusters_helper.rb6
-rw-r--r--app/helpers/colors_helper.rb4
-rw-r--r--app/helpers/emails_helper.rb2
-rw-r--r--app/helpers/environment_helper.rb7
-rw-r--r--app/helpers/environments_helper.rb26
-rw-r--r--app/helpers/feed_token_helper.rb12
-rw-r--r--app/helpers/form_helper.rb8
-rw-r--r--app/helpers/groups_helper.rb5
-rw-r--r--app/helpers/integrations_helper.rb8
-rw-r--r--app/helpers/issuables_helper.rb6
-rw-r--r--app/helpers/issues_helper.rb4
-rw-r--r--app/helpers/namespaces_helper.rb8
-rw-r--r--app/helpers/nav/new_dropdown_helper.rb8
-rw-r--r--app/helpers/nav/top_nav_helper.rb10
-rw-r--r--app/helpers/packages_helper.rb10
-rw-r--r--app/helpers/projects/observability_helper.rb13
-rw-r--r--app/helpers/projects/pages_helper.rb12
-rw-r--r--app/helpers/projects/pipeline_helper.rb2
-rw-r--r--app/helpers/projects_helper.rb95
-rw-r--r--app/helpers/rss_helper.rb2
-rw-r--r--app/helpers/search_helper.rb89
-rw-r--r--app/helpers/sidebars_helper.rb24
-rw-r--r--app/helpers/sorting_helper.rb11
-rw-r--r--app/helpers/storage_helper.rb6
-rw-r--r--app/helpers/time_helper.rb4
-rw-r--r--app/helpers/timeboxes_helper.rb4
-rw-r--r--app/helpers/users_helper.rb6
-rw-r--r--app/helpers/web_ide_button_helper.rb4
-rw-r--r--app/mailers/emails/issues.rb2
-rw-r--r--app/mailers/emails/notes.rb15
-rw-r--r--app/mailers/emails/profile.rb56
-rw-r--r--app/mailers/previews/notify_preview.rb5
-rw-r--r--app/models/abuse/trust_score.rb15
-rw-r--r--app/models/abuse/user_trust_score.rb53
-rw-r--r--app/models/ai/service_access_token.rb25
-rw-r--r--app/models/alert_management/http_integration.rb21
-rw-r--r--app/models/analytics/cycle_analytics/stage.rb13
-rw-r--r--app/models/analytics/cycle_analytics/value_stream.rb10
-rw-r--r--app/models/application_setting.rb9
-rw-r--r--app/models/audit_event.rb34
-rw-r--r--app/models/award_emoji.rb11
-rw-r--r--app/models/broadcast_message.rb3
-rw-r--r--app/models/bulk_import.rb8
-rw-r--r--app/models/bulk_imports/batch_tracker.rb4
-rw-r--r--app/models/bulk_imports/entity.rb23
-rw-r--r--app/models/bulk_imports/export.rb11
-rw-r--r--app/models/bulk_imports/export_status.rb40
-rw-r--r--app/models/bulk_imports/tracker.rb5
-rw-r--r--app/models/ci/artifact_blob.rb25
-rw-r--r--app/models/ci/bridge.rb107
-rw-r--r--app/models/ci/build_metadata.rb2
-rw-r--r--app/models/ci/build_need.rb6
-rw-r--r--app/models/ci/build_pending_state.rb3
-rw-r--r--app/models/ci/build_report_result.rb3
-rw-r--r--app/models/ci/build_runner_session.rb3
-rw-r--r--app/models/ci/build_trace_chunk.rb7
-rw-r--r--app/models/ci/build_trace_metadata.rb3
-rw-r--r--app/models/ci/catalog/resource.rb2
-rw-r--r--app/models/ci/external_pull_request.rb106
-rw-r--r--app/models/ci/group_variable.rb16
-rw-r--r--app/models/ci/job_artifact.rb3
-rw-r--r--app/models/ci/job_variable.rb3
-rw-r--r--app/models/ci/pending_build.rb3
-rw-r--r--app/models/ci/persistent_ref.rb7
-rw-r--r--app/models/ci/pipeline.rb12
-rw-r--r--app/models/ci/pipeline_variable.rb5
-rw-r--r--app/models/ci/runner.rb4
-rw-r--r--app/models/ci/runner_manager.rb13
-rw-r--r--app/models/ci/running_build.rb3
-rw-r--r--app/models/ci/sources/pipeline.rb3
-rw-r--r--app/models/ci/stage.rb5
-rw-r--r--app/models/ci/unit_test_failure.rb3
-rw-r--r--app/models/ci/variable.rb1
-rw-r--r--app/models/clusters/agent.rb2
-rw-r--r--app/models/clusters/concerns/prometheus_client.rb2
-rw-r--r--app/models/commit.rb4
-rw-r--r--app/models/commit_range.rb2
-rw-r--r--app/models/commit_status.rb4
-rw-r--r--app/models/concerns/commit_signature.rb3
-rw-r--r--app/models/concerns/database_event_tracking.rb15
-rw-r--r--app/models/concerns/enums/ci/pipeline.rb3
-rw-r--r--app/models/concerns/enums/vulnerability.rb8
-rw-r--r--app/models/concerns/expirable.rb6
-rw-r--r--app/models/concerns/has_user_type.rb2
-rw-r--r--app/models/concerns/ignorable_columns.rb2
-rw-r--r--app/models/concerns/issue_available_features.rb2
-rw-r--r--app/models/concerns/issues/forbid_issue_type_column_usage.rb59
-rw-r--r--app/models/concerns/milestoneish.rb5
-rw-r--r--app/models/concerns/packages/debian/component_file.rb2
-rw-r--r--app/models/concerns/project_features_compatibility.rb2
-rw-r--r--app/models/concerns/protected_ref.rb7
-rw-r--r--app/models/concerns/protected_ref_access.rb22
-rw-r--r--app/models/concerns/protected_ref_deploy_key_access.rb61
-rw-r--r--app/models/concerns/spammable.rb6
-rw-r--r--app/models/concerns/triggerable_hooks.rb3
-rw-r--r--app/models/concerns/vulnerability_finding_helpers.rb1
-rw-r--r--app/models/concerns/vulnerability_finding_signature_helpers.rb9
-rw-r--r--app/models/container_repository.rb4
-rw-r--r--app/models/deployment.rb4
-rw-r--r--app/models/design_management/repository.rb2
-rw-r--r--app/models/environment.rb20
-rw-r--r--app/models/external_issue.rb2
-rw-r--r--app/models/external_pull_request.rb106
-rw-r--r--app/models/group.rb100
-rw-r--r--app/models/hooks/project_hook.rb3
-rw-r--r--app/models/hooks/web_hook_log.rb2
-rw-r--r--app/models/integration.rb9
-rw-r--r--app/models/integrations/base_chat_notification.rb4
-rw-r--r--app/models/integrations/base_slack_notification.rb11
-rw-r--r--app/models/integrations/chat_message/group_mention_message.rb102
-rw-r--r--app/models/integrations/hangouts_chat.rb37
-rw-r--r--app/models/integrations/microsoft_teams.rb37
-rw-r--r--app/models/integrations/prometheus.rb6
-rw-r--r--app/models/integrations/unify_circuit.rb34
-rw-r--r--app/models/integrations/webex_teams.rb37
-rw-r--r--app/models/issue.rb103
-rw-r--r--app/models/member.rb11
-rw-r--r--app/models/members/group_member.rb1
-rw-r--r--app/models/merge_request.rb28
-rw-r--r--app/models/merge_request/diff_llm_summary.rb14
-rw-r--r--app/models/merge_request/metrics.rb2
-rw-r--r--app/models/milestone.rb8
-rw-r--r--app/models/ml/experiment.rb12
-rw-r--r--app/models/ml/model.rb25
-rw-r--r--app/models/ml/model_version.rb38
-rw-r--r--app/models/namespace.rb9
-rw-r--r--app/models/namespaces/traversal/linear.rb33
-rw-r--r--app/models/namespaces/traversal/linear_scopes.rb16
-rw-r--r--app/models/note.rb12
-rw-r--r--app/models/organizations/organization.rb8
-rw-r--r--app/models/organizations/organization_setting.rb20
-rw-r--r--app/models/organizations/organization_user.rb8
-rw-r--r--app/models/packages/npm/metadatum.rb7
-rw-r--r--app/models/packages/package.rb9
-rw-r--r--app/models/pages/lookup_path.rb11
-rw-r--r--app/models/personal_access_token.rb11
-rw-r--r--app/models/plan_limits.rb36
-rw-r--r--app/models/project.rb80
-rw-r--r--app/models/project_ci_cd_setting.rb3
-rw-r--r--app/models/project_statistics.rb1
-rw-r--r--app/models/projects/topic.rb2
-rw-r--r--app/models/projects/triggered_hooks.rb2
-rw-r--r--app/models/protected_branch/push_access_level.rb44
-rw-r--r--app/models/protected_tag/create_access_level.rb45
-rw-r--r--app/models/release.rb4
-rw-r--r--app/models/remote_mirror.rb1
-rw-r--r--app/models/repository.rb2
-rw-r--r--app/models/service_desk_setting.rb9
-rw-r--r--app/models/system_access.rb7
-rw-r--r--app/models/todo.rb13
-rw-r--r--app/models/user.rb67
-rw-r--r--app/models/user_custom_attribute.rb2
-rw-r--r--app/models/user_preference.rb4
-rw-r--r--app/models/users/callout.rb19
-rw-r--r--app/models/users/group_callout.rb16
-rw-r--r--app/models/webauthn_registration.rb4
-rw-r--r--app/models/work_item.rb10
-rw-r--r--app/models/work_items/widgets/base.rb4
-rw-r--r--app/models/work_items/widgets/current_user_todos.rb13
-rw-r--r--app/policies/global_policy.rb8
-rw-r--r--app/policies/group_policy.rb8
-rw-r--r--app/policies/merge_request_policy.rb8
-rw-r--r--app/policies/project_policy.rb20
-rw-r--r--app/presenters/alert_management/alert_presenter.rb21
-rw-r--r--app/presenters/blob_presenter.rb21
-rw-r--r--app/presenters/ci/pipeline_presenter.rb38
-rw-r--r--app/presenters/ml/models_index_presenter.rb21
-rw-r--r--app/presenters/project_presenter.rb20
-rw-r--r--app/serializers/diff_viewer_entity.rb2
-rw-r--r--app/serializers/environment_entity.rb8
-rw-r--r--app/serializers/environment_status_entity.rb4
-rw-r--r--app/serializers/lfs_file_lock_entity.rb4
-rw-r--r--app/serializers/prometheus_alert_entity.rb23
-rw-r--r--app/serializers/prometheus_alert_serializer.rb5
-rw-r--r--app/services/admin/plan_limits/update_service.rb14
-rw-r--r--app/services/application_settings/update_service.rb14
-rw-r--r--app/services/auto_merge/merge_when_pipeline_succeeds_service.rb14
-rw-r--r--app/services/award_emojis/add_service.rb2
-rw-r--r--app/services/award_emojis/base_service.rb7
-rw-r--r--app/services/award_emojis/destroy_service.rb1
-rw-r--r--app/services/boards/base_items_list_service.rb19
-rw-r--r--app/services/bulk_imports/create_service.rb4
-rw-r--r--app/services/bulk_imports/relation_export_service.rb11
-rw-r--r--app/services/ci/create_pipeline_schedule_service.rb1
-rw-r--r--app/services/ci/create_pipeline_service.rb30
-rw-r--r--app/services/ci/destroy_pipeline_service.rb2
-rw-r--r--app/services/ci/pipeline_processing/atomic_processing_service.rb14
-rw-r--r--app/services/ci/pipeline_schedules/create_service.rb47
-rw-r--r--app/services/ci/pipeline_schedules/update_service.rb19
-rw-r--r--app/services/clusters/agent_tokens/create_service.rb2
-rw-r--r--app/services/clusters/agents/authorize_proxy_user_service.rb21
-rw-r--r--app/services/clusters/cleanup/project_namespace_service.rb2
-rw-r--r--app/services/clusters/cleanup/service_account_service.rb2
-rw-r--r--app/services/clusters/integrations/prometheus_health_check_service.rb101
-rw-r--r--app/services/concerns/integrations/project_test_data.rb15
-rw-r--r--app/services/concerns/projects/remove_refs.rb24
-rw-r--r--app/services/draft_notes/create_service.rb3
-rw-r--r--app/services/draft_notes/publish_service.rb7
-rw-r--r--app/services/environments/create_service.rb2
-rw-r--r--app/services/environments/update_service.rb2
-rw-r--r--app/services/git/base_hooks_service.rb19
-rw-r--r--app/services/groups/participants_service.rb12
-rw-r--r--app/services/groups/transfer_service.rb5
-rw-r--r--app/services/groups/update_service.rb1
-rw-r--r--app/services/groups/update_shared_runners_service.rb42
-rw-r--r--app/services/import/github_service.rb11
-rw-r--r--app/services/import_csv/base_service.rb2
-rw-r--r--app/services/import_csv/preprocess_milestones_service.rb35
-rw-r--r--app/services/integrations/group_mention_service.rb59
-rw-r--r--app/services/integrations/test/project_service.rb2
-rw-r--r--app/services/issuable/import_csv/base_service.rb18
-rw-r--r--app/services/issues/base_service.rb19
-rw-r--r--app/services/issues/build_service.rb25
-rw-r--r--app/services/issues/create_service.rb30
-rw-r--r--app/services/issues/export_csv_service.rb10
-rw-r--r--app/services/issues/update_service.rb15
-rw-r--r--app/services/members/creator_service.rb50
-rw-r--r--app/services/members/groups/creator_service.rb2
-rw-r--r--app/services/merge_requests/base_service.rb19
-rw-r--r--app/services/merge_requests/cleanup_refs_service.rb5
-rw-r--r--app/services/merge_requests/merge_to_ref_service.rb10
-rw-r--r--app/services/merge_requests/mergeability_check_batch_service.rb20
-rw-r--r--app/services/merge_requests/refresh_service.rb6
-rw-r--r--app/services/milestones/create_service.rb8
-rw-r--r--app/services/milestones/update_service.rb13
-rw-r--r--app/services/namespace_settings/update_service.rb17
-rw-r--r--app/services/notes/post_process_service.rb11
-rw-r--r--app/services/packages/debian/find_or_create_package_service.rb42
-rw-r--r--app/services/packages/debian/process_changes_service.rb113
-rw-r--r--app/services/packages/npm/create_metadata_cache_service.rb2
-rw-r--r--app/services/packages/npm/create_package_service.rb4
-rw-r--r--app/services/packages/npm/deprecate_package_service.rb2
-rw-r--r--app/services/packages/npm/generate_metadata_service.rb2
-rw-r--r--app/services/packages/nuget/extract_metadata_content_service.rb85
-rw-r--r--app/services/packages/nuget/extract_metadata_file_service.rb62
-rw-r--r--app/services/packages/nuget/metadata_extraction_service.rb115
-rw-r--r--app/services/packages/nuget/update_package_from_metadata_service.rb2
-rw-r--r--app/services/personal_access_tokens/last_used_service.rb7
-rw-r--r--app/services/personal_access_tokens/revoke_token_family_service.rb36
-rw-r--r--app/services/personal_access_tokens/rotate_service.rb1
-rw-r--r--app/services/projects/destroy_service.rb4
-rw-r--r--app/services/projects/download_service.rb4
-rw-r--r--app/services/projects/participants_service.rb2
-rw-r--r--app/services/projects/prometheus/alerts/notify_service.rb4
-rw-r--r--app/services/projects/update_remote_mirror_service.rb2
-rw-r--r--app/services/quick_actions/interpret_service.rb3
-rw-r--r--app/services/search/project_service.rb23
-rw-r--r--app/services/search_service.rb10
-rw-r--r--app/services/service_desk/custom_emails/base_service.rb41
-rw-r--r--app/services/service_desk/custom_emails/create_service.rb85
-rw-r--r--app/services/service_desk/custom_emails/destroy_service.rb26
-rw-r--r--app/services/service_desk_settings/update_service.rb4
-rw-r--r--app/services/service_response.rb4
-rw-r--r--app/services/spam/spam_verdict_service.rb2
-rw-r--r--app/services/system_notes/merge_requests_service.rb2
-rw-r--r--app/services/system_notes/time_tracking_service.rb4
-rw-r--r--app/services/test_hooks/project_service.rb2
-rw-r--r--app/services/todo_service.rb2
-rw-r--r--app/services/users/allow_possible_spam_service.rb18
-rw-r--r--app/services/users/ban_service.rb7
-rw-r--r--app/services/users/banned_user_base_service.rb4
-rw-r--r--app/services/users/disallow_possible_spam_service.rb13
-rw-r--r--app/services/web_hook_service.rb1
-rw-r--r--app/services/work_items/export_csv_service.rb2
-rw-r--r--app/uploaders/file_uploader.rb2
-rw-r--r--app/validators/abstract_path_validator.rb2
-rw-r--r--app/validators/cluster_name_validator.rb2
-rw-r--r--app/validators/cron_validator.rb8
-rw-r--r--app/validators/devise_email_validator.rb2
-rw-r--r--app/validators/json_schemas/default_branch_protection_defaults.json10
-rw-r--r--app/validators/json_schemas/organization_settings.json14
-rw-r--r--app/validators/json_schemas/scan_result_policy_vulnerability_attributes.json14
-rw-r--r--app/validators/json_schemas/security_ci_configuration_schemas/sast_ui_schema.json38
-rw-r--r--app/validators/line_code_validator.rb2
-rw-r--r--app/views/admin/application_settings/_account_and_limit.html.haml4
-rw-r--r--app/views/admin/application_settings/_ai_access.html.haml5
-rw-r--r--app/views/admin/application_settings/_ci_cd.html.haml6
-rw-r--r--app/views/admin/application_settings/_diff_limits.html.haml6
-rw-r--r--app/views/admin/application_settings/_email.html.haml2
-rw-r--r--app/views/admin/application_settings/_error_tracking.html.haml6
-rw-r--r--app/views/admin/application_settings/_gitlab_shell_operation_limits.html.haml19
-rw-r--r--app/views/admin/application_settings/_help_page.html.haml2
-rw-r--r--app/views/admin/application_settings/_localization.html.haml2
-rw-r--r--app/views/admin/application_settings/_runner_registrars_form.html.haml4
-rw-r--r--app/views/admin/application_settings/_signin.html.haml2
-rw-r--r--app/views/admin/application_settings/_slack.html.haml49
-rw-r--r--app/views/admin/application_settings/_usage.html.haml8
-rw-r--r--app/views/admin/application_settings/appearances/_form.html.haml13
-rw-r--r--app/views/admin/application_settings/appearances/_system_header_footer_form.html.haml2
-rw-r--r--app/views/admin/application_settings/general.html.haml2
-rw-r--r--app/views/admin/application_settings/network.html.haml3
-rw-r--r--app/views/admin/application_settings/service_usage_data.html.haml2
-rw-r--r--app/views/admin/applications/_delete_form.html.haml4
-rw-r--r--app/views/admin/applications/_form.html.haml2
-rw-r--r--app/views/admin/cohorts/_cohorts_table.html.haml2
-rw-r--r--app/views/admin/groups/show.html.haml2
-rw-r--r--app/views/admin/hooks/_form.html.haml4
-rw-r--r--app/views/admin/hooks/edit.html.haml18
-rw-r--r--app/views/admin/hooks/index.html.haml13
-rw-r--r--app/views/admin/labels/_label.html.haml4
-rw-r--r--app/views/admin/projects/show.html.haml6
-rw-r--r--app/views/admin/runners/edit.html.haml3
-rw-r--r--app/views/admin/sessions/_new_base.html.haml10
-rw-r--r--app/views/admin/sessions/_signin_box.html.haml2
-rw-r--r--app/views/admin/sessions/new.html.haml4
-rw-r--r--app/views/admin/sessions/two_factor.html.haml2
-rw-r--r--app/views/admin/topics/_topic.html.haml4
-rw-r--r--app/views/admin/users/_profile.html.haml2
-rw-r--r--app/views/admin/users/projects.html.haml6
-rw-r--r--app/views/admin/users/show.html.haml13
-rw-r--r--app/views/clusters/clusters/_integrations.html.haml16
-rw-r--r--app/views/clusters/clusters/_integrations_tab.html.haml4
-rw-r--r--app/views/clusters/clusters/show.html.haml1
-rw-r--r--app/views/dashboard/todos/_todo.html.haml4
-rw-r--r--app/views/dashboard/todos/index.html.haml2
-rw-r--r--app/views/devise/sessions/_new_crowd.html.haml2
-rw-r--r--app/views/devise/sessions/_new_ldap.html.haml2
-rw-r--r--app/views/devise/shared/_footer.html.haml19
-rw-r--r--app/views/devise/shared/_signup_box.html.haml30
-rw-r--r--app/views/devise/shared/_signup_omniauth_provider_list.haml4
-rw-r--r--app/views/devise/unlocks/new.html.haml18
-rw-r--r--app/views/discussions/_notes.html.haml24
-rw-r--r--app/views/events/_event_push.atom.haml2
-rw-r--r--app/views/explore/projects/_project.atom.builder14
-rw-r--r--app/views/explore/projects/topic.atom.builder9
-rw-r--r--app/views/explore/projects/topic.html.haml3
-rw-r--r--app/views/groups/group_members/index.html.haml8
-rw-r--r--app/views/groups/milestones/_form.html.haml16
-rw-r--r--app/views/groups/packages/index.html.haml1
-rw-r--r--app/views/groups/settings/_general.html.haml2
-rw-r--r--app/views/groups/settings/access_tokens/index.html.haml49
-rw-r--r--app/views/groups/settings/ci_cd/_form.html.haml2
-rw-r--r--app/views/import/fogbugz/new.html.haml3
-rw-r--r--app/views/invites/show.html.haml2
-rw-r--r--app/views/layouts/_google_tag_manager_head.html.haml1
-rw-r--r--app/views/layouts/_head.html.haml39
-rw-r--r--app/views/layouts/_header_search.html.haml2
-rw-r--r--app/views/layouts/_img_loader.html.haml2
-rw-r--r--app/views/layouts/_mailer.html.haml2
-rw-r--r--app/views/layouts/_page.html.haml4
-rw-r--r--app/views/layouts/_startup_css.haml9
-rw-r--r--app/views/layouts/_startup_css_activation.haml7
-rw-r--r--app/views/layouts/devise.html.haml22
-rw-r--r--app/views/layouts/devise_empty.html.haml16
-rw-r--r--app/views/layouts/errors.html.haml2
-rw-r--r--app/views/layouts/header/_current_user_dropdown.html.haml6
-rw-r--r--app/views/layouts/header/_default.html.haml18
-rw-r--r--app/views/layouts/header/_new_dropdown.html.haml2
-rw-r--r--app/views/layouts/in_product_marketing_mailer.html.haml2
-rw-r--r--app/views/layouts/jira_connect.html.haml2
-rw-r--r--app/views/layouts/nav/_ask_duo_button.html.haml13
-rw-r--r--app/views/layouts/nav/_top_bar.html.haml9
-rw-r--r--app/views/layouts/nav/sidebar/_organization.html.haml1
-rw-r--r--app/views/layouts/notify.html.haml2
-rw-r--r--app/views/layouts/oauth_error.html.haml2
-rw-r--r--app/views/layouts/organization.html.haml6
-rw-r--r--app/views/layouts/service_desk.html.haml2
-rw-r--r--app/views/layouts/signup_onboarding.html.haml21
-rw-r--r--app/views/layouts/simple_registration.html.haml11
-rw-r--r--app/views/notify/_successful_pipeline.html.haml3
-rw-r--r--app/views/notify/_successful_pipeline.text.erb7
-rw-r--r--app/views/notify/approved_merge_request_email.html.haml2
-rw-r--r--app/views/notify/import_issues_csv_email.html.haml16
-rw-r--r--app/views/notify/import_issues_csv_email.text.erb17
-rw-r--r--app/views/notify/issue_due_email.html.haml2
-rw-r--r--app/views/notify/merge_when_pipeline_succeeds_email.html.haml2
-rw-r--r--app/views/notify/pipeline_failed_email.html.haml5
-rw-r--r--app/views/notify/pipeline_failed_email.text.erb18
-rw-r--r--app/views/notify/pipeline_fixed_email.html.haml2
-rw-r--r--app/views/notify/pipeline_fixed_email.text.erb2
-rw-r--r--app/views/notify/pipeline_success_email.html.haml2
-rw-r--r--app/views/notify/pipeline_success_email.text.erb2
-rw-r--r--app/views/notify/prometheus_alert_fired_email.html.haml4
-rw-r--r--app/views/notify/prometheus_alert_fired_email.text.erb4
-rw-r--r--app/views/notify/repository_push_email.html.haml2
-rw-r--r--app/views/notify/repository_push_email.text.haml2
-rw-r--r--app/views/notify/unapproved_merge_request_email.html.haml2
-rw-r--r--app/views/organizations/organizations/directory.html.haml2
-rw-r--r--app/views/organizations/organizations/groups_and_projects.html.haml3
-rw-r--r--app/views/organizations/organizations/show.html.haml2
-rw-r--r--app/views/profiles/accounts/_providers.html.haml4
-rw-r--r--app/views/profiles/accounts/show.html.haml144
-rw-r--r--app/views/profiles/active_sessions/_active_session.html.haml6
-rw-r--r--app/views/profiles/active_sessions/index.html.haml23
-rw-r--r--app/views/profiles/audit_log.html.haml17
-rw-r--r--app/views/profiles/chat_names/_chat_name.html.haml2
-rw-r--r--app/views/profiles/chat_names/index.html.haml44
-rw-r--r--app/views/profiles/comment_templates/index.html.haml19
-rw-r--r--app/views/profiles/emails/index.html.haml32
-rw-r--r--app/views/profiles/gpg_keys/_key.html.haml7
-rw-r--r--app/views/profiles/gpg_keys/index.html.haml40
-rw-r--r--app/views/profiles/keys/_key_details.html.haml6
-rw-r--r--app/views/profiles/keys/index.html.haml48
-rw-r--r--app/views/profiles/notifications/_email_settings.html.haml7
-rw-r--r--app/views/profiles/notifications/_group_settings.html.haml16
-rw-r--r--app/views/profiles/notifications/_project_settings.html.haml13
-rw-r--r--app/views/profiles/notifications/show.html.haml102
-rw-r--r--app/views/profiles/passwords/edit.html.haml60
-rw-r--r--app/views/profiles/personal_access_tokens/index.html.haml37
-rw-r--r--app/views/profiles/preferences/show.html.haml277
-rw-r--r--app/views/profiles/show.html.haml282
-rw-r--r--app/views/profiles/two_factor_auths/show.html.haml5
-rw-r--r--app/views/projects/_activity.html.haml3
-rw-r--r--app/views/projects/_customize_workflow.html.haml2
-rw-r--r--app/views/projects/_export.html.haml14
-rw-r--r--app/views/projects/_find_file_link.html.haml2
-rw-r--r--app/views/projects/_home_panel.html.haml4
-rw-r--r--app/views/projects/_import_project_pane.html.haml4
-rw-r--r--app/views/projects/_new_project_fields.html.haml2
-rw-r--r--app/views/projects/_readme.html.haml2
-rw-r--r--app/views/projects/_service_desk_settings.html.haml4
-rw-r--r--app/views/projects/_wiki.html.haml2
-rw-r--r--app/views/projects/artifacts/browse.html.haml6
-rw-r--r--app/views/projects/artifacts/external_file.html.haml5
-rw-r--r--app/views/projects/blob/_breadcrumb.html.haml13
-rw-r--r--app/views/projects/blob/_new_dir.html.haml2
-rw-r--r--app/views/projects/branches/_branch.html.haml62
-rw-r--r--app/views/projects/branches/_commit.html.haml4
-rw-r--r--app/views/projects/branches/_panel.html.haml4
-rw-r--r--app/views/projects/branches/index.html.haml14
-rw-r--r--app/views/projects/branches/new.html.haml2
-rw-r--r--app/views/projects/buttons/_clone.html.haml2
-rw-r--r--app/views/projects/buttons/_download.html.haml2
-rw-r--r--app/views/projects/buttons/_download_links.html.haml2
-rw-r--r--app/views/projects/buttons/_fork.html.haml12
-rw-r--r--app/views/projects/buttons/_star.html.haml9
-rw-r--r--app/views/projects/ci/builds/_build.html.haml29
-rw-r--r--app/views/projects/commit/_commit_box.html.haml2
-rw-r--r--app/views/projects/commit/_pipelines_list.haml1
-rw-r--r--app/views/projects/commit/_signature_badge_user.html.haml21
-rw-r--r--app/views/projects/commit/_verified_system_signature_badge.html.haml5
-rw-r--r--app/views/projects/commit/x509/_signature_badge_user.html.haml19
-rw-r--r--app/views/projects/commits/_commit.html.haml2
-rw-r--r--app/views/projects/commits/_commit_list.html.haml2
-rw-r--r--app/views/projects/commits/show.html.haml5
-rw-r--r--app/views/projects/compare/index.html.haml14
-rw-r--r--app/views/projects/compare/show.html.haml10
-rw-r--r--app/views/projects/confluences/show.html.haml2
-rw-r--r--app/views/projects/deploy_keys/edit.html.haml2
-rw-r--r--app/views/projects/diffs/_diffs.html.haml2
-rw-r--r--app/views/projects/diffs/_file.html.haml4
-rw-r--r--app/views/projects/edit.html.haml14
-rw-r--r--app/views/projects/environments/edit.html.haml4
-rw-r--r--app/views/projects/environments/empty_metrics.html.haml14
-rw-r--r--app/views/projects/environments/metrics.html.haml6
-rw-r--r--app/views/projects/environments/new.html.haml2
-rw-r--r--app/views/projects/environments/terminal.html.haml3
-rw-r--r--app/views/projects/find_file/show.html.haml8
-rw-r--r--app/views/projects/forks/error.html.haml2
-rw-r--r--app/views/projects/forks/index.html.haml10
-rw-r--r--app/views/projects/hook_logs/show.html.haml2
-rw-r--r--app/views/projects/hooks/edit.html.haml15
-rw-r--r--app/views/projects/hooks/index.html.haml13
-rw-r--r--app/views/projects/integrations/shimos/show.html.haml2
-rw-r--r--app/views/projects/issues/_related_branches.html.haml41
-rw-r--r--app/views/projects/issues/service_desk.html.haml31
-rw-r--r--app/views/projects/issues/service_desk/_issue.html.haml2
-rw-r--r--app/views/projects/issues/service_desk/_nav_btns.html.haml11
-rw-r--r--app/views/projects/issues/service_desk/_service_desk_empty_state.html.haml2
-rw-r--r--app/views/projects/issues/service_desk/_service_desk_info_content.html.haml2
-rw-r--r--app/views/projects/jobs/_table.html.haml2
-rw-r--r--app/views/projects/jobs/show.html.haml2
-rw-r--r--app/views/projects/labels/index.html.haml27
-rw-r--r--app/views/projects/mattermosts/_no_teams.html.haml2
-rw-r--r--app/views/projects/merge_requests/_close_reopen_draft_report_toggle.html.haml2
-rw-r--r--app/views/projects/merge_requests/_form.html.haml1
-rw-r--r--app/views/projects/merge_requests/_mr_box.html.haml2
-rw-r--r--app/views/projects/merge_requests/_source_and_target.html.haml10
-rw-r--r--app/views/projects/merge_requests/_widget.html.haml7
-rw-r--r--app/views/projects/merge_requests/creations/_new_submit.html.haml1
-rw-r--r--app/views/projects/milestones/_form.html.haml21
-rw-r--r--app/views/projects/milestones/index.html.haml6
-rw-r--r--app/views/projects/ml/models/index.html.haml5
-rw-r--r--app/views/projects/no_repo.html.haml10
-rw-r--r--app/views/projects/packages/packages/index.html.haml1
-rw-r--r--app/views/projects/pages/_access.html.haml2
-rw-r--r--app/views/projects/pages/_list.html.haml4
-rw-r--r--app/views/projects/pages/new.html.haml8
-rw-r--r--app/views/projects/pages/show.html.haml4
-rw-r--r--app/views/projects/pages_domains/_dns.html.haml6
-rw-r--r--app/views/projects/pages_domains/_lets_encrypt_callout.html.haml2
-rw-r--r--app/views/projects/pages_domains/new.html.haml2
-rw-r--r--app/views/projects/pages_domains/show.html.haml2
-rw-r--r--app/views/projects/pipeline_schedules/_form.html.haml2
-rw-r--r--app/views/projects/pipeline_schedules/_pipeline_schedule.html.haml9
-rw-r--r--app/views/projects/pipeline_schedules/edit.html.haml3
-rw-r--r--app/views/projects/pipeline_schedules/index.html.haml6
-rw-r--r--app/views/projects/pipeline_schedules/new.html.haml2
-rw-r--r--app/views/projects/pipelines/_info.html.haml75
-rw-r--r--app/views/projects/pipelines/show.html.haml8
-rw-r--r--app/views/projects/project_templates/_template.html.haml2
-rw-r--r--app/views/projects/protected_tags/shared/_index.html.haml2
-rw-r--r--app/views/projects/protected_tags/shared/_protected_tag.html.haml2
-rw-r--r--app/views/projects/runners/_group_runners.html.haml4
-rw-r--r--app/views/projects/runners/_project_runners.html.haml26
-rw-r--r--app/views/projects/runners/_runner.html.haml13
-rw-r--r--app/views/projects/settings/_archive.html.haml12
-rw-r--r--app/views/projects/settings/_general.html.haml2
-rw-r--r--app/views/projects/settings/access_tokens/index.html.haml29
-rw-r--r--app/views/projects/settings/ci_cd/_form.html.haml2
-rw-r--r--app/views/projects/settings/ci_cd/show.html.haml5
-rw-r--r--app/views/projects/settings/slacks/edit.html.haml2
-rw-r--r--app/views/projects/snippets/index.html.haml2
-rw-r--r--app/views/projects/tags/_edit_release_button.html.haml3
-rw-r--r--app/views/projects/tags/index.html.haml5
-rw-r--r--app/views/projects/tags/show.html.haml6
-rw-r--r--app/views/projects/tracing/index.html.haml4
-rw-r--r--app/views/protected_branches/shared/_protected_branch.html.haml2
-rw-r--r--app/views/registrations/welcome/show.html.haml1
-rw-r--r--app/views/search/results/_issuable.html.haml7
-rw-r--r--app/views/search/results/_wiki_blob.html.haml5
-rw-r--r--app/views/sent_notifications/unsubscribe.html.haml2
-rw-r--r--app/views/shared/_auto_devops_implicitly_enabled_banner.html.haml4
-rw-r--r--app/views/shared/_md_preview.html.haml11
-rw-r--r--app/views/shared/_new_merge_request_checkbox.html.haml3
-rw-r--r--app/views/shared/_no_ssh.html.haml4
-rw-r--r--app/views/shared/_project_limit.html.haml4
-rw-r--r--app/views/shared/_prometheus_configuration_banner.html.haml4
-rw-r--r--app/views/shared/_registration_features_discovery_message.html.haml2
-rw-r--r--app/views/shared/_remote_mirror_update_button.html.haml3
-rw-r--r--app/views/shared/_service_ping_consent.html.haml13
-rw-r--r--app/views/shared/_two_factor_auth_recovery_settings_check.html.haml2
-rw-r--r--app/views/shared/access_tokens/_form.html.haml35
-rw-r--r--app/views/shared/blob/_markdown_buttons.html.haml27
-rw-r--r--app/views/shared/deploy_tokens/_form.html.haml2
-rw-r--r--app/views/shared/deploy_tokens/_table.html.haml2
-rw-r--r--app/views/shared/doorkeeper/applications/_form.html.haml2
-rw-r--r--app/views/shared/doorkeeper/applications/_index.html.haml164
-rw-r--r--app/views/shared/doorkeeper/applications/_show.html.haml4
-rw-r--r--app/views/shared/empty_states/_issues.html.haml8
-rw-r--r--app/views/shared/empty_states/_labels.html.haml6
-rw-r--r--app/views/shared/empty_states/_merge_requests.html.haml6
-rw-r--r--app/views/shared/empty_states/_priority_labels.html.haml6
-rw-r--r--app/views/shared/empty_states/_profile_tabs.html.haml4
-rw-r--r--app/views/shared/empty_states/_snippets.html.haml4
-rw-r--r--app/views/shared/empty_states/_wikis.html.haml4
-rw-r--r--app/views/shared/file_hooks/_index.html.haml50
-rw-r--r--app/views/shared/form_elements/_apply_generated_description_warning.haml13
-rw-r--r--app/views/shared/form_elements/_description.html.haml3
-rw-r--r--app/views/shared/hook_logs/_index.html.haml13
-rw-r--r--app/views/shared/integrations/gitlab_slack_application/_slack_button.html.haml4
-rw-r--r--app/views/shared/integrations/gitlab_slack_application/_slack_integration_form.html.haml13
-rw-r--r--app/views/shared/integrations/prometheus/_custom_metrics.html.haml2
-rw-r--r--app/views/shared/integrations/slack_slash_commands/_help.html.haml2
-rw-r--r--app/views/shared/issuable/_form.html.haml6
-rw-r--r--app/views/shared/issuable/_search_bar.html.haml56
-rw-r--r--app/views/shared/issuable/_sidebar.html.haml4
-rw-r--r--app/views/shared/issuable/_sidebar_assignees.html.haml1
-rw-r--r--app/views/shared/issuable/_status_box.html.haml2
-rw-r--r--app/views/shared/issue_type/_details_header.html.haml3
-rw-r--r--app/views/shared/members/_manage_access_button.html.haml6
-rw-r--r--app/views/shared/members/_member.html.haml2
-rw-r--r--app/views/shared/milestones/_labels_tab.html.haml8
-rw-r--r--app/views/shared/milestones/_milestone.html.haml4
-rw-r--r--app/views/shared/milestones/_sidebar.html.haml4
-rw-r--r--app/views/shared/nav/_sidebar.html.haml2
-rw-r--r--app/views/shared/nav/_sidebar_menu.html.haml2
-rw-r--r--app/views/shared/nav/_sidebar_menu_item.html.haml2
-rw-r--r--app/views/shared/notes/_form.html.haml6
-rw-r--r--app/views/shared/notes/_hints.html.haml12
-rw-r--r--app/views/shared/projects/_search_form.html.haml2
-rw-r--r--app/views/shared/web_hooks/_form.html.haml35
-rw-r--r--app/views/shared/web_hooks/_hook.html.haml10
-rw-r--r--app/views/shared/web_hooks/_index.html.haml33
-rw-r--r--app/views/shared/web_hooks/_title_and_docs.html.haml10
-rw-r--r--app/views/shared/web_hooks/_web_hook_disabled_alert.html.haml2
-rw-r--r--app/views/shared/wikis/_main_links.html.haml4
-rw-r--r--app/views/shared/wikis/_sidebar.html.haml2
-rw-r--r--app/views/shared/wikis/diff.html.haml2
-rw-r--r--app/views/shared/wikis/pages.html.haml3
-rw-r--r--app/views/shared/wikis/show.html.haml17
-rw-r--r--app/views/users/_follow_user.html.haml11
-rw-r--r--app/views/users/_overview.html.haml6
-rw-r--r--app/views/users/_profile_basic_info.html.haml7
-rw-r--r--app/views/users/_view_gpg_keys.html.haml5
-rw-r--r--app/views/users/_view_user_in_admin_area.html.haml4
-rw-r--r--app/views/users/calendar_activities.html.haml2
-rw-r--r--app/views/users/show.html.haml56
-rw-r--r--app/workers/all_queues.yml99
-rw-r--r--app/workers/bulk_imports/export_request_worker.rb58
-rw-r--r--app/workers/bulk_imports/finish_batched_pipeline_worker.rb45
-rw-r--r--app/workers/bulk_imports/finish_batched_relation_export_worker.rb2
-rw-r--r--app/workers/bulk_imports/pipeline_batch_worker.rb81
-rw-r--r--app/workers/bulk_imports/pipeline_worker.rb23
-rw-r--r--app/workers/bulk_imports/relation_export_worker.rb4
-rw-r--r--app/workers/ci/pipeline_cleanup_ref_worker.rb35
-rw-r--r--app/workers/clusters/integrations/check_prometheus_health_worker.rb24
-rw-r--r--app/workers/container_registry/cleanup_worker.rb17
-rw-r--r--app/workers/container_registry/record_data_repair_detail_worker.rb6
-rw-r--r--app/workers/integrations/execute_worker.rb2
-rw-r--r--app/workers/integrations/group_mention_worker.rb42
-rw-r--r--app/workers/merge_requests/cleanup_ref_worker.rb35
-rw-r--r--app/workers/merge_requests/mergeability_check_batch_worker.rb15
-rw-r--r--app/workers/metrics/dashboard/prune_old_annotations_worker.rb22
-rw-r--r--app/workers/metrics/dashboard/schedule_annotations_prune_worker.rb22
-rw-r--r--app/workers/metrics/dashboard/sync_dashboards_worker.rb19
-rw-r--r--app/workers/packages/debian/process_changes_worker.rb46
-rw-r--r--app/workers/redis_migration_worker.rb40
-rw-r--r--app/workers/run_pipeline_schedule_worker.rb7
-rwxr-xr-xbin/audit-event-type3
-rw-r--r--config/application.rb37
-rw-r--r--config/click_house.yml.example6
-rw-r--r--config/database.yml.decomposed-clusterwide-postgresql86
-rw-r--r--config/environments/test.rb5
-rw-r--r--config/events/g_project_management_issue_created.yml24
-rw-r--r--config/feature_flags/development/adapt_deprecated_approvals.yml8
-rw-r--r--config/feature_flags/development/add_ignore_all_white_spaces.yml8
-rw-r--r--config/feature_flags/development/ai_chat_history_context.yml8
-rw-r--r--config/feature_flags/development/ai_chat_prompt_alternative.yml8
-rw-r--r--config/feature_flags/development/allow_protected_branches_for_group.yml2
-rw-r--r--config/feature_flags/development/auto_merge_labels_mr_widget.yml8
-rw-r--r--config/feature_flags/development/autocomplete_users_use_search_service.yml8
-rw-r--r--config/feature_flags/development/batch_delay_jira_branch_sync_worker.yml2
-rw-r--r--config/feature_flags/development/batched_api_mergeability_checks.yml8
-rw-r--r--config/feature_flags/development/bulk_imports_batched_import_export.yml4
-rw-r--r--config/feature_flags/development/ci_group_env_scope_graphql.yml8
-rw-r--r--config/feature_flags/development/ci_includable_files_interpolation.yml8
-rw-r--r--config/feature_flags/development/ci_limit_environment_scope.yml8
-rw-r--r--config/feature_flags/development/ci_refactoring_pipeline_schedule_create_service.yml8
-rw-r--r--config/feature_flags/development/ci_reset_skipped_jobs_in_atomic_processing.yml8
-rw-r--r--config/feature_flags/development/ci_support_include_rules_when_never.yml8
-rw-r--r--config/feature_flags/development/cluster_agents_limit_tokens_created.yml8
-rw-r--r--config/feature_flags/development/code_suggestions_tokens_from_customers_dot.yml8
-rw-r--r--config/feature_flags/development/command_palette.yml2
-rw-r--r--config/feature_flags/development/comment_on_files.yml8
-rw-r--r--config/feature_flags/development/complete_p_ci_builds_partitioning.yml8
-rw-r--r--config/feature_flags/development/compliance_adherence_report.yml8
-rw-r--r--config/feature_flags/development/config/feature_flags/development/ci_jwt_v2_ref_uri_claim.yml8
-rw-r--r--config/feature_flags/development/content_editor_on_issues.yml4
-rw-r--r--config/feature_flags/development/create_runner_workflow_for_admin.yml8
-rw-r--r--config/feature_flags/development/create_runner_workflow_for_namespace.yml8
-rw-r--r--config/feature_flags/development/deprecate_vulnerabilities_feedback.yml8
-rw-r--r--config/feature_flags/development/emoji_webhooks.yml8
-rw-r--r--config/feature_flags/development/enable_vulnerability_remediations_from_records.yml8
-rw-r--r--config/feature_flags/development/environment_settings_to_graphql.yml8
-rw-r--r--config/feature_flags/development/explain_code_vertex_ai.yml8
-rw-r--r--config/feature_flags/development/expose_authorized_cluster_agents.yml8
-rw-r--r--config/feature_flags/development/filter_vulnerability_findings_dismissed_on_default.yml8
-rw-r--r--config/feature_flags/development/find_changed_paths_new_format.yml8
-rw-r--r--config/feature_flags/development/frozen_outbound_job_token_scopes.yml8
-rw-r--r--config/feature_flags/development/frozen_outbound_job_token_scopes_override.yml8
-rw-r--r--config/feature_flags/development/global_file_size_check.yml8
-rw-r--r--config/feature_flags/development/graphql_generic_tracing_metrics_deactivate.yml8
-rw-r--r--config/feature_flags/development/group_analytics_dashboards.yml8
-rw-r--r--config/feature_flags/development/group_mentions.yml8
-rw-r--r--config/feature_flags/development/group_protected_branches.yml2
-rw-r--r--config/feature_flags/development/hide_projects_of_banned_users.yml8
-rw-r--r--config/feature_flags/development/highlight_js_worker.yml8
-rw-r--r--config/feature_flags/development/introduce_rules_with_needs.yml8
-rw-r--r--config/feature_flags/development/issue_type_uses_work_item_types_table.yml8
-rw-r--r--config/feature_flags/development/issues_full_text_search.yml8
-rw-r--r--config/feature_flags/development/jira_deployment_issue_keys.yml8
-rw-r--r--config/feature_flags/development/job_webhook_retries_count.yml8
-rw-r--r--config/feature_flags/development/kas_user_access.yml8
-rw-r--r--config/feature_flags/development/kas_user_access_project.yml8
-rw-r--r--config/feature_flags/development/kubernetes_namespace_for_environment.yml8
-rw-r--r--config/feature_flags/development/linear_group_descendants_finder_upto.yml8
-rw-r--r--config/feature_flags/development/load_merge_request_via_links.yml8
-rw-r--r--config/feature_flags/development/log_response_length.yml8
-rw-r--r--config/feature_flags/development/merge_request_cleanup_ref_worker_async.yml8
-rw-r--r--config/feature_flags/development/mirror_only_branches_match_regex.yml8
-rw-r--r--config/feature_flags/development/ml_experiment_tracking.yml2
-rw-r--r--config/feature_flags/development/move_close_into_dropdown.yml8
-rw-r--r--config/feature_flags/development/moved_mr_sidebar.yml2
-rw-r--r--config/feature_flags/development/notify_kas_on_git_push.yml2
-rw-r--r--config/feature_flags/development/observability_tracing.yml8
-rw-r--r--config/feature_flags/development/packages_dependency_proxy_maven.yml8
-rw-r--r--config/feature_flags/development/pat_reuse_detection.yml8
-rw-r--r--config/feature_flags/development/persist_failed_pipelines_from_schedules.yml8
-rw-r--r--config/feature_flags/development/pipeline_cleanup_ref_worker_async.yml8
-rw-r--r--config/feature_flags/development/pipeline_details_header_vue.yml8
-rw-r--r--config/feature_flags/development/product_intelligence_database_event_tracking.yml8
-rw-r--r--config/feature_flags/development/product_intelligence_database_event_tracking_batch2.yml8
-rw-r--r--config/feature_flags/development/redirect_with_ref_type.yml8
-rw-r--r--config/feature_flags/development/remove_deployments_api_ref_sort.yml8
-rw-r--r--config/feature_flags/development/remove_startup_css.yml8
-rw-r--r--config/feature_flags/development/runners_dashboard.yml8
-rw-r--r--config/feature_flags/development/scan_execution_policy_pipelines.yml8
-rw-r--r--config/feature_flags/development/service_desk_ticket.yml8
-rw-r--r--config/feature_flags/development/service_desk_vue_list.yml8
-rw-r--r--config/feature_flags/development/sidekiq_queueing_application_slis.yml8
-rw-r--r--config/feature_flags/development/support_group_level_merge_checks_setting.yml2
-rw-r--r--config/feature_flags/development/tanuki_bot_breadcrumbs_entry_point.yml8
-rw-r--r--config/feature_flags/development/update_personal_access_token_usage_information_every_10_minutes.yml8
-rw-r--r--config/feature_flags/development/use_metric_definitions_for_events_list.yml8
-rw-r--r--config/feature_flags/development/use_repository_info_for_repository_size.yml8
-rw-r--r--config/feature_flags/development/use_traversal_ids_for_ancestors.yml8
-rw-r--r--config/feature_flags/development/use_traversal_ids_for_ancestors_upto.yml8
-rw-r--r--config/feature_flags/development/use_traversal_ids_for_descendants_scopes.yml8
-rw-r--r--config/feature_flags/development/use_traversal_ids_for_self_and_hierarchy.yml8
-rw-r--r--config/feature_flags/development/use_traversal_ids_roots.yml8
-rw-r--r--config/feature_flags/development/user_profile_overflow_menu_vue.yml8
-rw-r--r--config/feature_flags/development/validate_environment_tier_presence.yml7
-rw-r--r--config/feature_flags/development/vsd_graphql_dora_and_flow_metrics.yml2
-rw-r--r--config/feature_flags/experiment/phone_verification_for_low_risk_users.yml8
-rw-r--r--config/feature_flags/experiment/show_pages_in_deployments_menu.yml8
-rw-r--r--config/feature_flags/ops/disable_keep_around_refs.yml8
-rw-r--r--config/feature_flags/ops/gtm_nonce.yml2
-rw-r--r--config/feature_flags/ops/search_index_curation_epics.yml8
-rw-r--r--config/feature_flags/ops/search_index_curation_projects.yml8
-rw-r--r--config/gitlab_loose_foreign_keys.yml4
-rw-r--r--config/initializers/00_deprecations.rb4
-rw-r--r--config/initializers/00_rails_disable_joins.rb16
-rw-r--r--config/initializers/01_active_record_database_tasks_configuration_flag.rb37
-rw-r--r--config/initializers/1_active_record_data_types.rb18
-rw-r--r--config/initializers/1_settings.rb12
-rw-r--r--config/initializers/7_redis.rb17
-rw-r--r--config/initializers/action_cable.rb1
-rw-r--r--config/initializers/action_dispatch_journey_router.rb51
-rw-r--r--config/initializers/active_record_migrations.rb21
-rw-r--r--config/initializers/active_record_postgresql_adapter.rb4
-rw-r--r--config/initializers/active_record_preloader.rb70
-rw-r--r--config/initializers/click_house.rb31
-rw-r--r--config/initializers/grpc_patch.rb31
-rw-r--r--config/initializers/internal_events.rb3
-rw-r--r--config/initializers/remove_active_job_execute_callback.rb4
-rw-r--r--config/initializers/sidekiq.rb2
-rw-r--r--config/initializers/wrap_parameters.rb16
-rw-r--r--config/initializers_before_autoloader/000_inflections.rb1
-rw-r--r--config/locales/doorkeeper.en.yml5
-rw-r--r--config/locales/en.yml7
-rw-r--r--config/metrics/counts_28d/20210216175132_i_code_review_user_create_mr_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210216175436_projects_slack_notifications_active.yml21
-rw-r--r--config/metrics/counts_28d/20210216175437_projects_slack_slash_active.yml21
-rw-r--r--config/metrics/counts_28d/20210216181147_service_desk_enabled_projects.yml2
-rw-r--r--config/metrics/counts_28d/20210216181323_g_project_management_issue_created_monthly.yml5
-rw-r--r--config/metrics/counts_28d/20211118200530_p_ci_templates_security_dast_on_demand_api_scan_monthly.yml26
-rw-r--r--config/metrics/counts_28d/20220729001651_agent_users_using_ci_tunnel_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20230620070723_k8s_api_proxy_requests_unique_agents_via_ci_access_monthly.yml25
-rw-r--r--config/metrics/counts_28d/20230620070723_k8s_api_proxy_requests_unique_agents_via_user_access_monthly.yml25
-rw-r--r--config/metrics/counts_28d/20230620070723_k8s_api_proxy_requests_unique_users_via_ci_access_monthly.yml25
-rw-r--r--config/metrics/counts_28d/20230620070723_k8s_api_proxy_requests_unique_users_via_user_access_monthly.yml25
-rw-r--r--config/metrics/counts_28d/20230630153556_flux_git_push_notified_unique_projects_monthly.yml25
-rw-r--r--config/metrics/counts_7d/20210216175130_i_code_review_user_create_mr_weekly.yml5
-rw-r--r--config/metrics/counts_7d/20210216181321_g_project_management_issue_created_weekly.yml5
-rw-r--r--config/metrics/counts_7d/20211118200524_p_ci_templates_security_dast_on_demand_api_scan_weekly.yml26
-rw-r--r--config/metrics/counts_7d/20230620070722_k8s_api_proxy_requests_unique_agents_via_ci_access_weekly.yml25
-rw-r--r--config/metrics/counts_7d/20230620070722_k8s_api_proxy_requests_unique_users_via_ci_access_weekly.yml25
-rw-r--r--config/metrics/counts_7d/20230620070723_k8s_api_proxy_requests_unique_agents_via_user_access_weekly.yml25
-rw-r--r--config/metrics/counts_7d/20230620070723_k8s_api_proxy_requests_unique_users_via_user_access_weekly.yml25
-rw-r--r--config/metrics/counts_7d/20230630153554_flux_git_push_notified_unique_projects_weekly.yml25
-rw-r--r--config/metrics/counts_all/20210216175400_projects_slack_notifications_active.yml20
-rw-r--r--config/metrics/counts_all/20210216175402_projects_slack_slash_active.yml20
-rw-r--r--config/metrics/counts_all/20210216180232_projects_jira_dvcs_cloud_active.yml3
-rw-r--r--config/metrics/counts_all/20210216180234_projects_jira_dvcs_server_active.yml3
-rw-r--r--config/metrics/counts_all/20210216181122_service_desk_enabled_projects.yml2
-rw-r--r--config/metrics/counts_all/20220607141129_slack_app_installations_gbp.yml21
-rw-r--r--config/metrics/counts_all/20220607141417_slack_app_installations.yml21
-rw-r--r--config/metrics/counts_all/20230620073845_kubernetes_agent_k8s_api_proxy_requests_via_ci_access.yml25
-rw-r--r--config/metrics/counts_all/20230620074102_kubernetes_agent_k8s_api_proxy_requests_via_user_access.yml25
-rw-r--r--config/metrics/objects_schemas/batched_background_migrations_metric.json18
-rw-r--r--config/metrics/objects_schemas/schema_inconsistencies_metric.json22
-rw-r--r--config/metrics/schema.json26
-rw-r--r--config/metrics/settings/20210216175606_ldap_encrypted_secrets_enabled.yml1
-rw-r--r--config/metrics/settings/20210225045628_operating_system.yml1
-rw-r--r--config/metrics/settings/20210321224827_gitaly_apdex.yml1
-rw-r--r--config/metrics/settings/20210812202137_smtp_encrypted_secrets_enabled.yml1
-rw-r--r--config/metrics/settings/20230602180038_batched_background_migrations_metric.yml24
-rw-r--r--config/metrics/settings/20230612132238_schema_inconsistencies_metric.yml24
-rw-r--r--config/object_store_settings.rb5
-rw-r--r--config/redis.yml.example6
-rw-r--r--config/routes.rb1
-rw-r--r--config/routes/admin.rb3
-rw-r--r--config/routes/directs/subscription_portal.rb4
-rw-r--r--config/routes/explore.rb2
-rw-r--r--config/routes/organizations.rb4
-rw-r--r--config/routes/project.rb20
-rw-r--r--config/sidekiq_queues.yml24
-rw-r--r--config/webpack.config.js29
-rw-r--r--danger/experiments/Dangerfile7
-rw-r--r--danger/plugins/experiments.rb10
-rw-r--r--danger/roulette/Dangerfile19
-rw-r--r--data/deprecations/ 16-2-cirunner_fields.yml13
-rw-r--r--data/deprecations/14-10-old-search-migration-removal.yml5
-rw-r--r--data/deprecations/14-8-compliance-required-pipeline-configuration-premium.yml2
-rw-r--r--data/deprecations/14-8-enforce-pat-expiration.yml2
-rw-r--r--data/deprecations/14-8-enforce-ssh-expiration.yml2
-rw-r--r--data/deprecations/14-8-sast-analyzer-removals.yml5
-rw-r--r--data/deprecations/14-9-deprecate-testcoveragesetting.yml2
-rw-r--r--data/deprecations/15-0-oauth-noexpiry.yml2
-rw-r--r--data/deprecations/15-3-pipeline_activity_limit.yml6
-rw-r--r--data/deprecations/15-9-accessibility-testing-deprecation.yml26
-rw-r--r--data/deprecations/15-9-browser-performance-testing-deprecation.yml26
-rw-r--r--data/deprecations/15-9-license-compliance-ci-template.yml6
-rw-r--r--data/deprecations/15-9-load-performance-testing-deprecation.yml26
-rw-r--r--data/deprecations/15-9-required-pipeline-configuration.yml2
-rw-r--r--data/deprecations/16-0-deprecate-sidekiq-delivery-method-for-mailroom.yml5
-rw-r--r--data/deprecations/16-1-deprecate-message-from-vulnerabilitycreate.yml10
-rw-r--r--data/deprecations/16-1-non-decomposed-mode-deprecation.yml10
-rw-r--r--data/deprecations/16-2-agentk-builtin-gitops.yml13
-rw-r--r--data/deprecations/16-2-deprecation-omniauth-facebook.yml11
-rw-r--r--data/deprecations/16-2-registry-size-estimated-graphql-field.yml11
-rw-r--r--data/deprecations/16_2-custom_sign_in_fields.yml11
-rw-r--r--data/deprecations/templates/_deprecation_template.md.erb12
-rw-r--r--data/removals/14_0/14_0-ds-deprecations.yml11
-rw-r--r--data/removals/14_0/14_0-lc-deprecations.yml7
-rw-r--r--data/removals/14_0/change_default_branch_name_to_main.yml11
-rw-r--r--data/removals/14_0/create-code-review-draft-wip.yml7
-rw-r--r--data/removals/14_0/create-code-review-w-parameter-removal.yml7
-rw-r--r--data/removals/14_0/deprecation_bump_terraform_template_version.yml19
-rw-r--r--data/removals/14_0/deprecation_manage_access_14_0.yml19
-rw-r--r--data/removals/14_0/deprecation_update_cicd_templates_to_stop_using_hardcode_master.yml7
-rw-r--r--data/removals/14_0/deuley_servicetemplates_removal.yml9
-rw-r--r--data/removals/14_0/release_announce_deprecation_of_release_notes_api.yml8
-rw-r--r--data/removals/14_0/release_deprecation_auto-deploy-image.yml10
-rw-r--r--data/removals/14_0/release_domainsource_configuration_for_gitlab_pages_deprecation.yml8
-rw-r--r--data/removals/14_0/release_legacy_feature_flags_deprecation.yml8
-rw-r--r--data/removals/14_0/release_remove_redundant_keyvalue_pair_from_the_payload_of_dora.yml8
-rw-r--r--data/removals/14_0/removal-geo-fdw-settings.yml12
-rw-r--r--data/removals/14_0/removal-graphql-fields.yml14
-rw-r--r--data/removals/14_0/removal-legacy-storage.yml7
-rw-r--r--data/removals/14_0/removal-protect-features.yml15
-rw-r--r--data/removals/14_0/removal-sidekiq_experimental_queue_selector.yml9
-rw-r--r--data/removals/14_0/removal-unicorn.yml7
-rw-r--r--data/removals/14_0/removal_ci_project_config_path.yml11
-rw-r--r--data/removals/14_0/removal_enablement_helm2.yml9
-rw-r--r--data/removals/14_0/removal_enablement_opensuse_15_1.yml7
-rw-r--r--data/removals/14_0/removal_enablement_pg11.yml9
-rw-r--r--data/removals/14_0/removal_enablement_ubuntu_16.yml9
-rw-r--r--data/removals/14_0/removal_repost_static_analysis_notices.yml42
-rw-r--r--data/removals/14_0/removal_runner_25555.yml7
-rw-r--r--data/removals/14_0/removal_runner_26036.yml7
-rw-r--r--data/removals/14_0/removal_runner_26419.yml7
-rw-r--r--data/removals/14_0/removal_runner_4845.yml7
-rw-r--r--data/removals/14_0/removal_runner_6413.yml7
-rw-r--r--data/removals/14_0/removals-14-testing-team.yml29
-rw-r--r--data/removals/14_0/removals_runner_26651.yml7
-rw-r--r--data/removals/14_0/removals_runner_26679.yml7
-rw-r--r--data/removals/14_0/removals_runner_26900.yml7
-rw-r--r--data/removals/14_0/removals_runner_27175.yml7
-rw-r--r--data/removals/14_0/removals_runner_27218.yml7
-rw-r--r--data/removals/14_0/removals_runner_27551.yml7
-rw-r--r--data/removals/14_0/removals_runner_27899.yml7
-rw-r--r--data/removals/14_0/remove-sql-elector.yml10
-rw-r--r--data/removals/14_0/remove_dast_env_variables.yml16
-rw-r--r--data/removals/14_0/remove_dast_legacy_domain_validation.yml9
-rw-r--r--data/removals/14_0/remove_dast_legacy_report_fields.yml9
-rw-r--r--data/removals/14_0/remove_dast_spider_host_reset.yml7
-rw-r--r--data/removals/14_0/remove_dast_template_stages.yml7
-rw-r--r--data/removals/14_0/remove_optimize_api.yml7
-rw-r--r--data/removals/14_0/remove_terraform_template.yml10
-rw-r--r--data/removals/14_0/verify-ci-removal-parametertrace.yml7
-rw-r--r--data/removals/14_0/verify-ci-removalpipelineservice.yml7
-rw-r--r--data/removals/14_1/removal-memory-prometheus-options-source.yml9
-rw-r--r--data/removals/14_1/removal-outdated-browser-support.yml21
-rw-r--r--data/removals/14_10/14-10-package-permissions-composer-change.yml12
-rw-r--r--data/removals/14_2/removal-verify-build-log.yml8
-rw-r--r--data/removals/14_3/removal-limit-tags-to-50.yml7
-rw-r--r--data/removals/14_3/removal-verify-pe-pipelinefindername.yml7
-rw-r--r--data/removals/14_3/removal_legacy_storage_setting.yml9
-rw-r--r--data/removals/14_6/limit_trigger_pipelines.yml6
-rw-r--r--data/removals/14_6/removal-release-cli-s3.yml6
-rw-r--r--data/removals/14_9/removal_monitor_respond_integrated_error_tracking.yml14
-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-configure-self-managed-cert-based-kube-feature-flag.yml24
-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-merge-commit-message.yml16
-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.yml52
-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_optional_pat_expiration.yml13
-rw-r--r--data/removals/15_0/removal_manage_repository_push_audit_event.yml17
-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/15_10/15_10-non-public-artifacts.yml25
-rw-r--r--data/removals/15_11/15-11-opensuse-15-3.yml14
-rw-r--r--data/removals/15_11/15-11-project-export-import-ndjson.yml16
-rw-r--r--data/removals/15_2/removal-outdated-browser-support.yml20
-rw-r--r--data/removals/15_3/15-3-vulnerability-report-state-sort.yml25
-rw-r--r--data/removals/15_3/15-3-vulnerability-report-tool-sort.yml26
-rw-r--r--data/removals/15_3/removal_debian9.yml6
-rw-r--r--data/removals/15_4/15-4-sast-analyzer-consolidation.yml30
-rw-r--r--data/removals/15_6/15-6-nfs-git-repository-storage.yml32
-rw-r--r--data/removals/15_7/15-7-remove-expansion-file-type-variables-ci-pipeline.yml20
-rw-r--r--data/removals/15_7/15-7-remove-flowdock-integration.yml18
-rw-r--r--data/removals/15_8/15-8-auto-deploy-helm-chart-cilium-policy.yml16
-rw-r--r--data/removals/15_8/15-8-group-export-import-ndjson.yml16
-rw-r--r--data/removals/15_9/15-9-live-preview.yml11
-rw-r--r--data/removals/15_9/15-9-omniauth-authentiq.yml11
-rw-r--r--data/removals/15_9/15-9-omniauth-shibboleth.yml11
-rw-r--r--data/removals/16_0/16-0-PipelineSecurityReportFinding-name-GraphQL-field.yml10
-rw-r--r--data/removals/16_0/16-0-Security-report-schemas-version-14.yml11
-rw-r--r--data/removals/16_0/16-0-api-lint-removal.yml41
-rw-r--r--data/removals/16_0/16-0-auto-deploy-postgres-enabled.yml16
-rw-r--r--data/removals/16_0/16-0-azure-storage-driver-registry.yml12
-rw-r--r--data/removals/16_0/16-0-cas3-authentication.yml23
-rw-r--r--data/removals/16_0/16-0-ci-builds-column-validations.yml24
-rw-r--r--data/removals/16_0/16-0-ci-cd-settings-update-mutation-renamed.yml17
-rw-r--r--data/removals/16_0/16-0-conan-search-limited-to-project.yml11
-rw-r--r--data/removals/16_0/16-0-cs-docker-variables.yml31
-rw-r--r--data/removals/16_0/16-0-dast-api-variable-removal.yml13
-rw-r--r--data/removals/16_0/16-0-dependency-scanning-java-versions.yml19
-rw-r--r--data/removals/16_0/16-0-external-field-grapql-release-asset-link-type.yml11
-rw-r--r--data/removals/16_0/16-0-external-field-releases-release-links-api.yml11
-rw-r--r--data/removals/16_0/16-0-gitaly-legacy-config-vars.yml19
-rw-r--r--data/removals/16_0/16-0-gitlab-com-importer.yml16
-rw-r--r--data/removals/16_0/16-0-grafana-chart.yml19
-rw-r--r--data/removals/16_0/16-0-graphql-dora-environment-tier-param.yml14
-rw-r--r--data/removals/16_0/16-0-import-bare-repositories-rake-task.yml25
-rw-r--r--data/removals/16_0/16-0-jira-github-enterprise-dvcs-connector.yml10
-rw-r--r--data/removals/16_0/16-0-job_age.yml11
-rw-r--r--data/removals/16_0/16-0-licenses-check.yml10
-rw-r--r--data/removals/16_0/16-0-limit-ci-job-token.yml32
-rw-r--r--data/removals/16_0/16-0-managed-licenses-api.yml14
-rw-r--r--data/removals/16_0/16-0-non-expiring-access-tokens.yml19
-rw-r--r--data/removals/16_0/16-0-operations-access-level-api-field.yml16
-rw-r--r--data/removals/16_0/16-0-phabricator-importer.yml13
-rw-r--r--data/removals/16_0/16-0-pipeline_activity_limit.yml12
-rw-r--r--data/removals/16_0/16-0-postgresql-12.yml17
-rw-r--r--data/removals/16_0/16-0-pull-thru-cache-container-registry.yml11
-rw-r--r--data/removals/16_0/16-0-redis-5.yml14
-rw-r--r--data/removals/16_0/16-0-redis-config-env.yml13
-rw-r--r--data/removals/16_0/16-0-redis-localhost.yml16
-rw-r--r--data/removals/16_0/16-0-removal-variables.yml29
-rw-r--r--data/removals/16_0/16-0-remove-embed-grafana-panels-in-markdown.yml13
-rw-r--r--data/removals/16_0/16-0-remove-legacy-gitaly-config-structure.yml22
-rw-r--r--data/removals/16_0/16-0-remove-legacy-praefect-config-structure.yml22
-rw-r--r--data/removals/16_0/16-0-remove-metrics.yml24
-rw-r--r--data/removals/16_0/16-0-remove-praefect-custom-metric-endpoint.yml18
-rw-r--r--data/removals/16_0/16-0-restrict-imports-to-maintainers-and-above.yml12
-rw-r--r--data/removals/16_0/16-0-sast-analyzer-consolidation.yml21
-rw-r--r--data/removals/16_0/16-0-secure-template-changes.yml27
-rw-r--r--data/removals/16_0/16-0-self-monitor-removal.yml9
-rw-r--r--data/removals/16_0/16-0-source-code-approvals-endpoint.yml30
-rw-r--r--data/removals/16_0/16-0-source-code-branch-push.yml16
-rw-r--r--data/removals/16_0/16-0-source-code-routes.yml36
-rw-r--r--data/removals/16_0/16-0-starboard-directive.yml19
-rw-r--r--data/removals/16_0/16-0-terraform-latest-stable-change.yml21
-rw-r--r--data/removals/16_0/16-0-ttl-days-removal.yml16
-rw-r--r--data/removals/16_0/16-0-vulnerability-confidence-field.yml11
-rw-r--r--data/removals/16_0/16-0-vulnerabilityFindingDismiss-GraphQL-mutation.yml11
-rw-r--r--data/removals/16_0/16-0-vulnerabilityFindingDismiss-mutation.yml11
-rw-r--r--data/removals/16_0/16-00-JWT-limit-setting.yml21
-rw-r--r--data/removals/16_0/16.0-config-fields-runner-helm-chart.yml39
-rw-r--r--data/removals/16_0/16.0-docker-ssh-executors.yml9
-rw-r--r--data/removals/16_0/16.0-eol-windows-server-2004-and-20H2.yml9
-rw-r--r--data/removals/16_0/16.0-pre-clone-script-gitlab-saas.yml9
-rw-r--r--data/removals/16_0/16.0-runner-api-does-not-return-paused-active.yml12
-rw-r--r--data/removals/templates/_removal_template.md.erb57
-rw-r--r--data/removals/templates/example.yml45
-rw-r--r--data/whats_new/202011230001_13_06.yml2
-rw-r--r--data/whats_new/202105220001_13_12.yml2
-rw-r--r--data/whats_new/202106220001_14_0.yml4
-rw-r--r--data/whats_new/202107220001_14_1.yml2
-rw-r--r--data/whats_new/202108190001_14_02.yml2
-rw-r--r--data/whats_new/202202210001_14_08.yml2
-rw-r--r--data/whats_new/2022082200001_15_03.yml2
-rw-r--r--data/whats_new/20230220001_15_08.yml2
-rw-r--r--data/whats_new/202306220001_16_1.yml98
-rw-r--r--db/click_house/main/20230705124511_create_events.sql15
-rw-r--r--db/database_connections/ci.yaml5
-rw-r--r--db/database_connections/main.yaml2
-rw-r--r--db/docs/batched_background_migrations/backfill_missing_ci_cd_settings.yml6
-rw-r--r--db/docs/batched_background_migrations/backfill_uuid_conversion_column_in_vulnerability_occurrences.yml6
-rw-r--r--db/docs/deleted_tables/sbom_vulnerable_component_versions.yml12
-rw-r--r--db/docs/deleted_tables/u2f_registrations.yml12
-rw-r--r--db/docs/deleted_tables/vulnerability_advisories.yml13
-rw-r--r--db/docs/dependency_proxy_packages_settings.yml2
-rw-r--r--db/docs/external_pull_requests.yml2
-rw-r--r--db/docs/group_wiki_repository_states.yml10
-rw-r--r--db/docs/merge_request_review_llm_summaries.yml11
-rw-r--r--db/docs/ml_model_versions.yml10
-rw-r--r--db/docs/ml_models.yml10
-rw-r--r--db/docs/organization_settings.yml10
-rw-r--r--db/docs/organization_users.yml10
-rw-r--r--db/docs/organizations.yml2
-rw-r--r--db/docs/sbom_vulnerable_component_versions.yml10
-rw-r--r--db/docs/service_access_tokens.yml11
-rw-r--r--db/docs/subscription_user_add_on_assignments.yml10
-rw-r--r--db/docs/system_access_microsoft_applications.yml10
-rw-r--r--db/docs/system_access_microsoft_graph_access_tokens.yml10
-rw-r--r--db/docs/u2f_registrations.yml10
-rw-r--r--db/docs/verification_codes.yml3
-rw-r--r--db/docs/vulnerability_advisories.yml11
-rw-r--r--db/gitlab_schemas/gitlab_main_cell.yaml3
-rw-r--r--db/migrate/20230522162742_cleanup_bigint_conversion_for_merge_request_metrics_for_self_hosts.rb31
-rw-r--r--db/migrate/20230523101514_finalize_user_type_migration.rb15
-rw-r--r--db/migrate/20230605125735_add_tracking_columns_to_namespace_limits.rb8
-rw-r--r--db/migrate/20230607124754_create_organization_settings.rb13
-rw-r--r--db/migrate/20230608113106_create_organization_users.rb22
-rw-r--r--db/migrate/20230609065641_initialize_conversion_of_ci_pipeline_variables_pipeline_id.rb16
-rw-r--r--db/migrate/20230612074428_add_name_to_external_audit_event_destination.rb11
-rw-r--r--db/migrate/20230612091526_add_text_limit_to_external_audit_event_destination_name.rb13
-rw-r--r--db/migrate/20230612091747_add_name_to_instance_audit_event_destination.rb11
-rw-r--r--db/migrate/20230612091910_add_text_limit_to_instance_audit_event_destination_name.rb13
-rw-r--r--db/migrate/20230613122211_add_vulnerability_attributes_to_scan_result_policies.rb7
-rw-r--r--db/migrate/20230614180651_add_organization_id_to_namespaces.rb19
-rw-r--r--db/migrate/20230615074515_add_index_to_audit_event_external_destination.rb16
-rw-r--r--db/migrate/20230615074544_add_index_to_instance_audit_event_destination.rb15
-rw-r--r--db/migrate/20230615104902_add_user_id_foreign_key_to_organization_users.rb15
-rw-r--r--db/migrate/20230616164309_create_subscription_user_add_on_assignments.rb17
-rw-r--r--db/migrate/20230616164705_add_foreign_key_add_on_purchase_id_on_subscription_user_add_on_assignments.rb16
-rw-r--r--db/migrate/20230616164731_add_foreign_key_user_id_on_subscription_user_add_on_assignments.rb15
-rw-r--r--db/migrate/20230616200440_create_system_access_microsoft_application.rb19
-rw-r--r--db/migrate/20230616214220_create_system_access_microsoft_graph_access_tokens.rb15
-rw-r--r--db/migrate/20230620101808_change_default_value_for_distro_version.rb13
-rw-r--r--db/migrate/20230620104217_add_organization_id_foreign_key_to_organization_users.rb15
-rw-r--r--db/migrate/20230621065943_add_elasticsearch_requeue_workers_to_application_settings.rb7
-rw-r--r--db/migrate/20230621070810_update_requeue_workers_in_application_settings_for_gitlab_com.rb17
-rw-r--r--db/migrate/20230621072726_add_description_to_ci_variable.rb12
-rw-r--r--db/migrate/20230621074446_add_elasticsearch_number_of_shards_to_application_settings.rb9
-rw-r--r--db/migrate/20230621074611_update_elasticsearch_number_of_shards_in_application_settings_for_gitlab_com.rb19
-rw-r--r--db/migrate/20230621083004_add_description_to_ci_group_variable.rb12
-rw-r--r--db/migrate/20230622044119_create_merge_request_review_llm_summary.rb16
-rw-r--r--db/migrate/20230622051925_add_user_foreign_key_to_merge_request_review_llm_summary.rb15
-rw-r--r--db/migrate/20230622051943_add_review_foreign_key_to_merge_request_review_llm_summary.rb15
-rw-r--r--db/migrate/20230622052015_add_merge_request_diff_foreign_key_to_merge_request_review_llm_summary.rb17
-rw-r--r--db/migrate/20230622093921_remove_deprecated_metric_worker_instances.rb20
-rw-r--r--db/migrate/20230626065725_backfill_instance_audit_event_name.rb18
-rw-r--r--db/migrate/20230626065755_backfill_external_audit_event_name.rb15
-rw-r--r--db/migrate/20230626070959_add_not_null_to_external_audit_event.rb13
-rw-r--r--db/migrate/20230626071100_add_not_null_to_instance_audit_event.rb13
-rw-r--r--db/migrate/20230626113908_add_project_id_to_scan_result_policies.rb11
-rw-r--r--db/migrate/20230626113909_add_index_to_scan_result_policies_on_project_id.rb15
-rw-r--r--db/migrate/20230626113910_add_project_id_foreign_key_to_scan_result_policies.rb16
-rw-r--r--db/migrate/20230629071427_add_last_enforced_at_to_namespace_limits.rb7
-rw-r--r--db/migrate/20230629112833_create_fk_ml_candidates_on_user_id.rb29
-rw-r--r--db/migrate/20230629113029_validate_fk_ml_candidates_on_user_id.rb13
-rw-r--r--db/migrate/20230629113133_remove_old_fk_ml_candidates_on_user_id.rb21
-rw-r--r--db/migrate/20230630101337_add_previous_personal_access_token_to_personal_access_tokens.rb13
-rw-r--r--db/migrate/20230630101342_add_index_to_personal_access_tokens_on_previous_personal_access_token_id.rb15
-rw-r--r--db/migrate/20230630101347_add_fk_to_personal_access_tokens_on_previous_personal_access_token_id.rb19
-rw-r--r--db/migrate/20230630170515_add_state_to_catalog_resources.rb9
-rw-r--r--db/migrate/20230701195315_add_kubernetes_namespace_column_to_environments.rb17
-rw-r--r--db/migrate/20230703115902_add_relay_state_allowlist_application_settings.rb11
-rw-r--r--db/migrate/20230703121859_add_relay_state_allowlist_saml_providers.rb11
-rw-r--r--db/migrate/20230705085223_create_service_access_tokens.rb12
-rw-r--r--db/migrate/20230705092150_create_ml_models.rb19
-rw-r--r--db/migrate/20230705155000_add_group_mention_events_to_integrations.rb8
-rw-r--r--db/migrate/20230706130217_add_column_model_id_to_ml_experiments.rb14
-rw-r--r--db/migrate/20230706192435_remove_debian_process_changes_worker_job_instances.rb15
-rw-r--r--db/migrate/20230707090835_create_ml_model_versions.rb25
-rw-r--r--db/migrate/20230707094002_add_fk_on_ml_model_versions_to_ml_models.rb15
-rw-r--r--db/migrate/20230707094003_add_fk_on_ml_model_versions_to_packages.rb15
-rw-r--r--db/migrate/20230710160232_add_expires_at_to_service_access_tokens.rb11
-rw-r--r--db/migrate/20230710200434_add_emoji_events_to_web_hooks.rb9
-rw-r--r--db/migrate/20230712214613_add_read_dependency_to_member_roles.rb7
-rw-r--r--db/migrate/20230714195649_add_namespace_storage_forks_cost_factor_to_application_settings.rb22
-rw-r--r--db/migrate/20230717200940_create_group_wiki_repository_states.rb43
-rw-r--r--db/post_migrate/20230314094213_remove_foreign_keys_from_u2f_registrations_table.rb15
-rw-r--r--db/post_migrate/20230314094215_drop_u2f_registrations_table.rb23
-rw-r--r--db/post_migrate/20230317004428_migrate_daily_redis_hll_events_to_weekly_aggregation.rb6
-rw-r--r--db/post_migrate/20230523101514_finalize_user_type_migration.rb22
-rw-r--r--db/post_migrate/20230528203340_drop_message_from_vulnerability_occurrences.rb17
-rw-r--r--db/post_migrate/20230530012406_finalize_backfill_resource_link_events.rb22
-rw-r--r--db/post_migrate/20230601211635_add_detected_at_id_index_to_vulnerabilities.rb15
-rw-r--r--db/post_migrate/20230601213750_add_uuid_project_id_state_id_index_to_vulnerability_reads.rb15
-rw-r--r--db/post_migrate/20230608145500_add_prepared_at_index_to_merge_requests.rb20
-rw-r--r--db/post_migrate/20230609065942_backfill_ci_pipeline_variables_for_pipeline_id_bigint_conversion.rb16
-rw-r--r--db/post_migrate/20230613192703_ensure_ci_build_needs_big_int_backfill_is_finished_for_self_hosts.rb24
-rw-r--r--db/post_migrate/20230613192802_swap_ci_build_needs_to_big_int_for_self_hosts.rb74
-rw-r--r--db/post_migrate/20230614181310_track_organization_deletions.rb17
-rw-r--r--db/post_migrate/20230614182049_add_index_to_namespaces_organization_id.rb19
-rw-r--r--db/post_migrate/20230615030402_remove_audit_events_group_index.rb40
-rw-r--r--db/post_migrate/20230615113748_replace_ci_job_artifacts_foreign_key_v3.rb20
-rw-r--r--db/post_migrate/20230615113840_replace_ci_running_builds_foreign_key_v3.rb20
-rw-r--r--db/post_migrate/20230615113858_replace_ci_job_variables_foreign_key_v3.rb20
-rw-r--r--db/post_migrate/20230615121103_replace_p_ci_builds_metadata_foreign_key_v3.rb37
-rw-r--r--db/post_migrate/20230615121122_replace_p_ci_runner_machine_builds_foreign_key_v3.rb37
-rw-r--r--db/post_migrate/20230615144627_remove_temporary_container_repository_indexes.rb82
-rw-r--r--db/post_migrate/20230616082958_add_unique_index_for_npm_packages_on_project_id_name_version.rb22
-rw-r--r--db/post_migrate/20230618020202_finish_user_type_migration.rb22
-rw-r--r--db/post_migrate/20230619005223_change_unconfirmed_created_at_index_on_users.rb24
-rw-r--r--db/post_migrate/20230619072744_schedule_index_events_on_project_id_and_id_desc_on_merged_action_for_removal.rb17
-rw-r--r--db/post_migrate/20230619081412_add_index_to_ci_triggers_token.rb15
-rw-r--r--db/post_migrate/20230619123701_schedule_removal_index_job_artifacts_id_and_expire_at.rb16
-rw-r--r--db/post_migrate/20230619134106_prepare_index_for_vulnerability_reads_on_common_project_filters.rb18
-rw-r--r--db/post_migrate/20230620072854_replace_old_fk_ci_build_pending_states_to_builds_v2.rb37
-rw-r--r--db/post_migrate/20230620072856_replace_old_fk_ci_build_trace_chunks_to_builds_v2.rb37
-rw-r--r--db/post_migrate/20230620072900_replace_old_fk_ci_unit_test_failures_to_builds_v2.rb37
-rw-r--r--db/post_migrate/20230620072905_replace_old_fk_ci_sources_pipelines_to_builds_v2.rb37
-rw-r--r--db/post_migrate/20230620072908_replace_old_fk_ci_resources_to_builds_v2.rb37
-rw-r--r--db/post_migrate/20230620072911_replace_old_fk_ci_build_report_results_to_builds_v2.rb37
-rw-r--r--db/post_migrate/20230620072915_replace_old_fk_ci_build_needs_to_builds_v2.rb37
-rw-r--r--db/post_migrate/20230620072917_replace_old_fk_ci_builds_runner_session_to_builds_v2.rb37
-rw-r--r--db/post_migrate/20230620072920_replace_old_fk_ci_pending_builds_to_builds_v2.rb37
-rw-r--r--db/post_migrate/20230620072925_replace_old_fk_ci_build_trace_metadata_to_builds_v2.rb37
-rw-r--r--db/post_migrate/20230620105919_replace_old_fk_ci_job_artifacts_to_builds.rb45
-rw-r--r--db/post_migrate/20230620110004_replace_old_fk_ci_running_builds_to_builds.rb45
-rw-r--r--db/post_migrate/20230620110021_replace_old_fk_ci_job_variables_to_builds.rb45
-rw-r--r--db/post_migrate/20230620134708_validate_user_type_constraint.rb13
-rw-r--r--db/post_migrate/20230620201738_add_index_issues_on_project_health_status_asc_work_item_type.rb18
-rw-r--r--db/post_migrate/20230620201817_add_index_issues_on_project_health_status_desc_work_item_type.rb18
-rw-r--r--db/post_migrate/20230621072848_add_text_limit_to_ci_variable_description.rb16
-rw-r--r--db/post_migrate/20230621083052_add_text_limit_to_ci_group_variable_description.rb16
-rw-r--r--db/post_migrate/20230621102941_replace_old_fk_ci_job_artifacts_to_builds_v2.rb37
-rw-r--r--db/post_migrate/20230621103000_replace_old_fk_ci_running_builds_to_builds_v2.rb37
-rw-r--r--db/post_migrate/20230621103043_replace_old_fk_ci_job_variables_to_builds_v2.rb37
-rw-r--r--db/post_migrate/20230622052046_remove_ci_pipeline_variables_trigger_and_old_column.rb16
-rw-r--r--db/post_migrate/20230622073752_ensure_backfill_ci_pipelines_bigint_id_is_completed.rb23
-rw-r--r--db/post_migrate/20230623073906_prepare_async_index_for_ci_pipelines_bigint_id.rb15
-rw-r--r--db/post_migrate/20230626070723_drop_unused_sent_notification_columns.rb17
-rw-r--r--db/post_migrate/20230626072436_drop_tmp_index_job_artifacts_id_and_expire_at.rb28
-rw-r--r--db/post_migrate/20230626101519_create_index_for_vulnerability_reads_on_common_project_filters.rb18
-rw-r--r--db/post_migrate/20230626115046_add_temporary_index_on_vulnerability_reads.rb24
-rw-r--r--db/post_migrate/20230627115305_replace_p_ci_builds_metadata_foreign_key_v4.rb40
-rw-r--r--db/post_migrate/20230627140707_async_index_for_vulnerabilities_uuid_type_migration.rb25
-rw-r--r--db/post_migrate/20230627174139_add_index_to_pool_repositories.rb21
-rw-r--r--db/post_migrate/20230628023103_queue_backfill_missing_ci_cd_settings.rb25
-rw-r--r--db/post_migrate/20230629011859_cleanup_bigint_conversion_for_notes_for_gitlab_com.rb28
-rw-r--r--db/post_migrate/20230629024032_ensure_events_bigint_backfill_is_finished_for_gitlab_dot_com.rb29
-rw-r--r--db/post_migrate/20230629024403_events_bigint_create_indexe_async_for_gitlab_dot_com.rb28
-rw-r--r--db/post_migrate/20230629095819_queue_backfill_uuid_conversion_column_in_vulnerability_occurrences.rb25
-rw-r--r--db/post_migrate/20230703024031_cleanup_project_pipeline_status_key.rb15
-rw-r--r--db/post_migrate/20230703122803_create_vulnerability_uuid_type_migration_index.rb11
-rw-r--r--db/post_migrate/20230704042302_prepare_removal_index_deployments_on_project_id_sha.rb17
-rw-r--r--db/post_migrate/20230704044541_prepare_removal_index_deployments_on_project_id_and_status.rb16
-rw-r--r--db/post_migrate/20230704050739_prepare_removal_index_deployments_on_environment_id_and_iid_and_project_id.rb16
-rw-r--r--db/post_migrate/20230704062132_replace_p_ci_builds_metadata_foreign_key_v5.rb26
-rw-r--r--db/post_migrate/20230704062136_replace_p_ci_runner_machine_builds_foreign_key_v4.rb26
-rw-r--r--db/post_migrate/20230704074120_replace_old_fk_p_ci_builds_metadata_to_builds.rb54
-rw-r--r--db/post_migrate/20230704074124_replace_old_fk_p_ci_runner_machine_builds_to_builds.rb54
-rw-r--r--db/post_migrate/20230705115215_remove_user_details_provisioned_by_group_at_column.rb9
-rw-r--r--db/post_migrate/20230705141703_rollback_vulnerability_advisories_foreign_key_on_vulnerable_component_versions.rb17
-rw-r--r--db/post_migrate/20230705141733_rollback_component_version_foreign_key_on_vulnerable_component_versions.rb17
-rw-r--r--db/post_migrate/20230705142241_drop_vulnerable_component_versions.rb22
-rw-r--r--db/post_migrate/20230705142334_drop_vulnerabilities_advisories.rb29
-rw-r--r--db/post_migrate/20230705145827_drop_wrong_index_on_vulnerability_occurrences.rb22
-rw-r--r--db/post_migrate/20230705150100_recreate_type_migration_index_on_vulnerability_occurrences.rb24
-rw-r--r--db/post_migrate/20230706011541_add_user_id_foreign_key_to_ml_experiments.rb31
-rw-r--r--db/post_migrate/20230706073937_remove_index_events_on_project_id_and_id_desc_on_merged_action.rb17
-rw-r--r--db/post_migrate/20230706080234_add_trigger_on_organizations.rb29
-rw-r--r--db/post_migrate/20230707114012_change_project_view_default.rb9
-rw-r--r--db/post_migrate/20230707211358_deduplicate_inactive_alert_integrations.rb40
-rw-r--r--db/post_migrate/20230707211359_change_alert_integrations_unique_index.rb33
-rw-r--r--db/post_migrate/20230707220646_add_index_to_vulnerability_findings_on_uuid_again.rb16
-rw-r--r--db/post_migrate/20230711093010_drop_default_partition_id_value_for_ci_tables.rb39
-rw-r--r--db/post_migrate/20230712020407_remove_temporary_index_from_system_note_metadata.rb18
-rw-r--r--db/post_migrate/20230712064637_replace_old_fk_p_ci_builds_metadata_to_builds_v2.rb54
-rw-r--r--db/post_migrate/20230712064655_replace_old_fk_p_ci_runner_machine_builds_to_builds_v2.rb54
-rw-r--r--db/post_migrate/20230712145323_drop_ci_job_artifacts_partition_id_default.rb24
-rw-r--r--db/post_migrate/20230712145821_drop_ci_stages_partition_id_default.rb24
-rw-r--r--db/post_migrate/20230712145926_drop_ci_build_trace_metadata_partition_id_default.rb24
-rw-r--r--db/post_migrate/20230713020247_change_pm_advisories_urls_constraint.rb17
-rw-r--r--db/post_migrate/20230713100100_drop_ci_pipeline_variable_partition_id_default.rb24
-rw-r--r--db/schema_migrations/202303140942131
-rw-r--r--db/schema_migrations/202303140942151
-rw-r--r--db/schema_migrations/202305221627421
-rw-r--r--db/schema_migrations/202305282033401
-rw-r--r--db/schema_migrations/202305300124061
-rw-r--r--db/schema_migrations/202306012116351
-rw-r--r--db/schema_migrations/202306012137501
-rw-r--r--db/schema_migrations/202306051257351
-rw-r--r--db/schema_migrations/202306071247541
-rw-r--r--db/schema_migrations/202306081131061
-rw-r--r--db/schema_migrations/202306081455001
-rw-r--r--db/schema_migrations/202306090656411
-rw-r--r--db/schema_migrations/202306090659421
-rw-r--r--db/schema_migrations/202306120744281
-rw-r--r--db/schema_migrations/202306120915261
-rw-r--r--db/schema_migrations/202306120917471
-rw-r--r--db/schema_migrations/202306120919101
-rw-r--r--db/schema_migrations/202306131222111
-rw-r--r--db/schema_migrations/202306131927031
-rw-r--r--db/schema_migrations/202306131928021
-rw-r--r--db/schema_migrations/202306141806511
-rw-r--r--db/schema_migrations/202306141813101
-rw-r--r--db/schema_migrations/202306141820491
-rw-r--r--db/schema_migrations/202306150304021
-rw-r--r--db/schema_migrations/202306150745151
-rw-r--r--db/schema_migrations/202306150745441
-rw-r--r--db/schema_migrations/202306151049021
-rw-r--r--db/schema_migrations/202306151137481
-rw-r--r--db/schema_migrations/202306151138401
-rw-r--r--db/schema_migrations/202306151138581
-rw-r--r--db/schema_migrations/202306151211031
-rw-r--r--db/schema_migrations/202306151211221
-rw-r--r--db/schema_migrations/202306151446271
-rw-r--r--db/schema_migrations/202306160829581
-rw-r--r--db/schema_migrations/202306161643091
-rw-r--r--db/schema_migrations/202306161647051
-rw-r--r--db/schema_migrations/202306161647311
-rw-r--r--db/schema_migrations/202306162004401
-rw-r--r--db/schema_migrations/202306162142201
-rw-r--r--db/schema_migrations/202306180202021
-rw-r--r--db/schema_migrations/202306190052231
-rw-r--r--db/schema_migrations/202306190727441
-rw-r--r--db/schema_migrations/202306190814121
-rw-r--r--db/schema_migrations/202306191237011
-rw-r--r--db/schema_migrations/202306191341061
-rw-r--r--db/schema_migrations/202306200728541
-rw-r--r--db/schema_migrations/202306200728561
-rw-r--r--db/schema_migrations/202306200729001
-rw-r--r--db/schema_migrations/202306200729051
-rw-r--r--db/schema_migrations/202306200729081
-rw-r--r--db/schema_migrations/202306200729111
-rw-r--r--db/schema_migrations/202306200729151
-rw-r--r--db/schema_migrations/202306200729171
-rw-r--r--db/schema_migrations/202306200729201
-rw-r--r--db/schema_migrations/202306200729251
-rw-r--r--db/schema_migrations/202306201018081
-rw-r--r--db/schema_migrations/202306201042171
-rw-r--r--db/schema_migrations/202306201059191
-rw-r--r--db/schema_migrations/202306201100041
-rw-r--r--db/schema_migrations/202306201100211
-rw-r--r--db/schema_migrations/202306201347081
-rw-r--r--db/schema_migrations/202306202017381
-rw-r--r--db/schema_migrations/202306202018171
-rw-r--r--db/schema_migrations/202306210659431
-rw-r--r--db/schema_migrations/202306210708101
-rw-r--r--db/schema_migrations/202306210727261
-rw-r--r--db/schema_migrations/202306210728481
-rw-r--r--db/schema_migrations/202306210744461
-rw-r--r--db/schema_migrations/202306210746111
-rw-r--r--db/schema_migrations/202306210830041
-rw-r--r--db/schema_migrations/202306210830521
-rw-r--r--db/schema_migrations/202306211029411
-rw-r--r--db/schema_migrations/202306211030001
-rw-r--r--db/schema_migrations/202306211030431
-rw-r--r--db/schema_migrations/202306220441191
-rw-r--r--db/schema_migrations/202306220519251
-rw-r--r--db/schema_migrations/202306220519431
-rw-r--r--db/schema_migrations/202306220520151
-rw-r--r--db/schema_migrations/202306220520461
-rw-r--r--db/schema_migrations/202306220737521
-rw-r--r--db/schema_migrations/202306220939211
-rw-r--r--db/schema_migrations/202306230739061
-rw-r--r--db/schema_migrations/202306260657251
-rw-r--r--db/schema_migrations/202306260657551
-rw-r--r--db/schema_migrations/202306260707231
-rw-r--r--db/schema_migrations/202306260709591
-rw-r--r--db/schema_migrations/202306260711001
-rw-r--r--db/schema_migrations/202306260724361
-rw-r--r--db/schema_migrations/202306261015191
-rw-r--r--db/schema_migrations/202306261139081
-rw-r--r--db/schema_migrations/202306261139091
-rw-r--r--db/schema_migrations/202306261139101
-rw-r--r--db/schema_migrations/202306261150461
-rw-r--r--db/schema_migrations/202306271153051
-rw-r--r--db/schema_migrations/202306271407071
-rw-r--r--db/schema_migrations/202306271741391
-rw-r--r--db/schema_migrations/202306280231031
-rw-r--r--db/schema_migrations/202306290118591
-rw-r--r--db/schema_migrations/202306290240321
-rw-r--r--db/schema_migrations/202306290244031
-rw-r--r--db/schema_migrations/202306290714271
-rw-r--r--db/schema_migrations/202306290958191
-rw-r--r--db/schema_migrations/202306291128331
-rw-r--r--db/schema_migrations/202306291130291
-rw-r--r--db/schema_migrations/202306291131331
-rw-r--r--db/schema_migrations/202306301013371
-rw-r--r--db/schema_migrations/202306301013421
-rw-r--r--db/schema_migrations/202306301013471
-rw-r--r--db/schema_migrations/202306301705151
-rw-r--r--db/schema_migrations/202307011953151
-rw-r--r--db/schema_migrations/202307030240311
-rw-r--r--db/schema_migrations/202307031159021
-rw-r--r--db/schema_migrations/202307031218591
-rw-r--r--db/schema_migrations/202307031228031
-rw-r--r--db/schema_migrations/202307040423021
-rw-r--r--db/schema_migrations/202307040445411
-rw-r--r--db/schema_migrations/202307040507391
-rw-r--r--db/schema_migrations/202307040621321
-rw-r--r--db/schema_migrations/202307040621361
-rw-r--r--db/schema_migrations/202307040741201
-rw-r--r--db/schema_migrations/202307040741241
-rw-r--r--db/schema_migrations/202307050852231
-rw-r--r--db/schema_migrations/202307050921501
-rw-r--r--db/schema_migrations/202307051152151
-rw-r--r--db/schema_migrations/202307051417031
-rw-r--r--db/schema_migrations/202307051417331
-rw-r--r--db/schema_migrations/202307051422411
-rw-r--r--db/schema_migrations/202307051423341
-rw-r--r--db/schema_migrations/202307051458271
-rw-r--r--db/schema_migrations/202307051501001
-rw-r--r--db/schema_migrations/202307051550001
-rw-r--r--db/schema_migrations/202307060115411
-rw-r--r--db/schema_migrations/202307060739371
-rw-r--r--db/schema_migrations/202307060802341
-rw-r--r--db/schema_migrations/202307061302171
-rw-r--r--db/schema_migrations/202307061924351
-rw-r--r--db/schema_migrations/202307070908351
-rw-r--r--db/schema_migrations/202307070940021
-rw-r--r--db/schema_migrations/202307070940031
-rw-r--r--db/schema_migrations/202307071140121
-rw-r--r--db/schema_migrations/202307072113581
-rw-r--r--db/schema_migrations/202307072113591
-rw-r--r--db/schema_migrations/202307072206461
-rw-r--r--db/schema_migrations/202307101602321
-rw-r--r--db/schema_migrations/202307102004341
-rw-r--r--db/schema_migrations/202307110930101
-rw-r--r--db/schema_migrations/202307120204071
-rw-r--r--db/schema_migrations/202307120646371
-rw-r--r--db/schema_migrations/202307120646551
-rw-r--r--db/schema_migrations/202307121453231
-rw-r--r--db/schema_migrations/202307121458211
-rw-r--r--db/schema_migrations/202307121459261
-rw-r--r--db/schema_migrations/202307122146131
-rw-r--r--db/schema_migrations/202307130202471
-rw-r--r--db/schema_migrations/202307131001001
-rw-r--r--db/schema_migrations/202307141956491
-rw-r--r--db/schema_migrations/202307172009401
-rw-r--r--db/structure.sql676
-rw-r--r--doc/.vale/gitlab/FirstPerson.yml16
-rw-r--r--doc/.vale/gitlab/Markdown_emoji.yml4
-rw-r--r--doc/.vale/gitlab/SubstitutionWarning.yml10
-rw-r--r--doc/.vale/gitlab/Zip.yml15
-rw-r--r--doc/.vale/gitlab/spelling-exceptions.txt5
-rw-r--r--doc/administration/admin_area.md489
-rw-r--r--doc/administration/analytics/dev_ops_reports.md74
-rw-r--r--doc/administration/analytics/img/admin_devops_adoption_v14_2.png (renamed from doc/user/admin_area/analytics/img/admin_devops_adoption_v14_2.png)bin25280 -> 25280 bytes
-rw-r--r--doc/administration/analytics/img/instance_activity_pipelines_chart_v13_6_a.png (renamed from doc/user/admin_area/analytics/img/instance_activity_pipelines_chart_v13_6_a.png)bin30831 -> 30831 bytes
-rw-r--r--doc/administration/analytics/index.md26
-rw-r--r--doc/administration/analytics/usage_trends.md46
-rw-r--r--doc/administration/appearance.md123
-rw-r--r--doc/administration/audit_event_streaming/graphql_api.md232
-rw-r--r--doc/administration/audit_event_streaming/index.md178
-rw-r--r--doc/administration/audit_events.md24
-rw-r--r--doc/administration/auditor_users.md8
-rw-r--r--doc/administration/auth/ldap/index.md6
-rw-r--r--doc/administration/auth/ldap/ldap-troubleshooting.md6
-rw-r--r--doc/administration/auth/ldap/ldap_synchronization.md4
-rw-r--r--doc/administration/auth/oidc.md85
-rw-r--r--doc/administration/auth/smartcard.md2
-rw-r--r--doc/administration/backup_restore/backup_gitlab.md1925
-rw-r--r--doc/administration/backup_restore/index.md232
-rw-r--r--doc/administration/backup_restore/restore_gitlab.md432
-rw-r--r--doc/administration/broadcast_messages.md120
-rw-r--r--doc/administration/clusters/kas.md7
-rw-r--r--doc/administration/compliance.md8
-rw-r--r--doc/administration/configure.md4
-rw-r--r--doc/administration/credentials_inventory.md86
-rw-r--r--doc/administration/custom_project_templates.md73
-rw-r--r--doc/administration/dedicated/index.md11
-rw-r--r--doc/administration/diff_limits.md53
-rw-r--r--doc/administration/docs_self_host.md6
-rw-r--r--doc/administration/email_from_gitlab.md61
-rw-r--r--doc/administration/external_users.md80
-rw-r--r--doc/administration/geo/disaster_recovery/planned_failover.md6
-rw-r--r--doc/administration/geo/glossary.md27
-rw-r--r--doc/administration/geo/index.md3
-rw-r--r--doc/administration/geo/replication/configuration.md4
-rw-r--r--doc/administration/geo/replication/datatypes.md12
-rw-r--r--doc/administration/geo/replication/location_aware_git_url.md2
-rw-r--r--doc/administration/geo/replication/multiple_servers.md6
-rw-r--r--doc/administration/geo/replication/single_sign_on.md4
-rw-r--r--doc/administration/geo/replication/troubleshooting.md71
-rw-r--r--doc/administration/geo/replication/upgrading_the_geo_sites.md2
-rw-r--r--doc/administration/geo/secondary_proxy/index.md4
-rw-r--r--doc/administration/geo/setup/database.md9
-rw-r--r--doc/administration/geo/setup/external_database.md2
-rw-r--r--doc/administration/geo/setup/index.md4
-rw-r--r--doc/administration/geo_sites.md119
-rw-r--r--doc/administration/get_started.md22
-rw-r--r--doc/administration/gitaly/configure_gitaly.md5
-rw-r--r--doc/administration/gitaly/gitaly_geo_capabilities.md1
-rw-r--r--doc/administration/gitaly/index.md19
-rw-r--r--doc/administration/gitaly/praefect.md26
-rw-r--r--doc/administration/gitaly/recovery.md10
-rw-r--r--doc/administration/gitaly/troubleshooting.md2
-rw-r--r--doc/administration/img/abuse_report_blocked_user.png (renamed from doc/user/admin_area/img/abuse_report_blocked_user.png)bin7393 -> 7393 bytes
-rw-r--r--doc/administration/img/abuse_reports_page_v13_11.png (renamed from doc/user/admin_area/img/abuse_reports_page_v13_11.png)bin25232 -> 25232 bytes
-rw-r--r--doc/administration/img/admin_labels_v14_7.png (renamed from doc/user/admin_area/img/admin_labels_v14_7.png)bin10804 -> 10804 bytes
-rw-r--r--doc/administration/img/broadcast_messages_banner_v15_0.png (renamed from doc/user/admin_area/img/broadcast_messages_banner_v15_0.png)bin13690 -> 13690 bytes
-rw-r--r--doc/administration/img/broadcast_messages_notification_v12_10.png (renamed from doc/user/admin_area/img/broadcast_messages_notification_v12_10.png)bin23154 -> 23154 bytes
-rw-r--r--doc/administration/img/cohorts_v13_9_a.png (renamed from doc/user/admin_area/img/cohorts_v13_9_a.png)bin35297 -> 35297 bytes
-rw-r--r--doc/administration/img/credentials_inventory_gpg_keys_v14_9.png (renamed from doc/user/admin_area/img/credentials_inventory_gpg_keys_v14_9.png)bin16956 -> 16956 bytes
-rw-r--r--doc/administration/img/credentials_inventory_personal_access_tokens_v14_9.png (renamed from doc/user/admin_area/img/credentials_inventory_personal_access_tokens_v14_9.png)bin34445 -> 34445 bytes
-rw-r--r--doc/administration/img/credentials_inventory_project_access_tokens_v14_9.png (renamed from doc/user/admin_area/img/credentials_inventory_project_access_tokens_v14_9.png)bin19849 -> 19849 bytes
-rw-r--r--doc/administration/img/credentials_inventory_ssh_keys_v14_9.png (renamed from doc/user/admin_area/img/credentials_inventory_ssh_keys_v14_9.png)bin29612 -> 29612 bytes
-rw-r--r--doc/administration/img/email1.png (renamed from doc/user/admin_area/img/email1.png)bin9590 -> 9590 bytes
-rw-r--r--doc/administration/img/email2.png (renamed from doc/user/admin_area/img/email2.png)bin14902 -> 14902 bytes
-rw-r--r--doc/administration/img/export_permissions_v13_11.png (renamed from doc/user/admin_area/img/export_permissions_v13_11.png)bin11567 -> 11567 bytes
-rw-r--r--doc/administration/img/impersonate_user_button_v13_8.png (renamed from doc/user/admin_area/img/impersonate_user_button_v13_8.png)bin23707 -> 23707 bytes
-rw-r--r--doc/administration/img/index_runners_search_or_filter_v14_5.png (renamed from doc/user/admin_area/img/index_runners_search_or_filter_v14_5.png)bin13881 -> 13881 bytes
-rw-r--r--doc/administration/instance_limits.md292
-rw-r--r--doc/administration/integration/diagrams_net.md2
-rw-r--r--doc/administration/integration/plantuml.md33
-rw-r--r--doc/administration/integration/terminal.md4
-rw-r--r--doc/administration/job_artifacts.md4
-rw-r--r--doc/administration/labels.md28
-rw-r--r--doc/administration/lfs/index.md4
-rw-r--r--doc/administration/license.md83
-rw-r--r--doc/administration/license_file.md269
-rw-r--r--doc/administration/load_balancer.md2
-rw-r--r--doc/administration/logs/index.md6
-rw-r--r--doc/administration/maintenance_mode/index.md7
-rw-r--r--doc/administration/merge_requests_approvals.md43
-rw-r--r--doc/administration/moderate_users.md393
-rw-r--r--doc/administration/monitoring/health_check.md146
-rw-r--r--doc/administration/monitoring/index.md2
-rw-r--r--doc/administration/monitoring/ip_allowlist.md16
-rw-r--r--doc/administration/monitoring/performance/gitlab_configuration.md4
-rw-r--r--doc/administration/monitoring/performance/grafana_configuration.md13
-rw-r--r--doc/administration/monitoring/performance/performance_bar.md5
-rw-r--r--doc/administration/monitoring/prometheus/gitlab_exporter.md6
-rw-r--r--doc/administration/monitoring/prometheus/gitlab_metrics.md20
-rw-r--r--doc/administration/monitoring/prometheus/index.md42
-rw-r--r--doc/administration/nfs.md89
-rw-r--r--doc/administration/object_storage.md10
-rw-r--r--doc/administration/operations/fast_ssh_key_lookup.md9
-rw-r--r--doc/administration/operations/filesystem_benchmarking.md2
-rw-r--r--doc/administration/operations/gitlab_sshd.md4
-rw-r--r--doc/administration/operations/index.md4
-rw-r--r--doc/administration/operations/moving_repositories.md6
-rw-r--r--doc/administration/operations/puma.md6
-rw-r--r--doc/administration/operations/rails_console.md193
-rw-r--r--doc/administration/package_information/defaults.md5
-rw-r--r--doc/administration/package_information/deprecation_policy.md9
-rw-r--r--doc/administration/package_information/index.md29
-rw-r--r--doc/administration/package_information/licensing.md26
-rw-r--r--doc/administration/package_information/omnibus_packages.md17
-rw-r--r--doc/administration/package_information/postgresql_versions.md24
-rw-r--r--doc/administration/package_information/signed_packages.md15
-rw-r--r--doc/administration/package_information/supported_os.md2
-rw-r--r--doc/administration/packages/container_registry.md264
-rw-r--r--doc/administration/packages/dependency_proxy.md65
-rw-r--r--doc/administration/packages/index.md2
-rw-r--r--doc/administration/pages/index.md348
-rw-r--r--doc/administration/pages/source.md14
-rw-r--r--doc/administration/pages/troubleshooting.md4
-rw-r--r--doc/administration/postgresql/database_load_balancing.md4
-rw-r--r--doc/administration/postgresql/external.md2
-rw-r--r--doc/administration/postgresql/index.md18
-rw-r--r--doc/administration/postgresql/multiple_databases.md8
-rw-r--r--doc/administration/postgresql/pgbouncer.md18
-rw-r--r--doc/administration/postgresql/replication_and_failover.md43
-rw-r--r--doc/administration/postgresql/standalone.md10
-rw-r--r--doc/administration/raketasks/check.md94
-rw-r--r--doc/administration/raketasks/geo.md64
-rw-r--r--doc/administration/raketasks/ldap.md112
-rw-r--r--doc/administration/raketasks/maintenance.md141
-rw-r--r--doc/administration/raketasks/praefect.md16
-rw-r--r--doc/administration/raketasks/project_import_export.md6
-rw-r--r--doc/administration/raketasks/service_desk_email.md2
-rw-r--r--doc/administration/raketasks/smtp.md48
-rw-r--r--doc/administration/raketasks/storage.md24
-rw-r--r--doc/administration/raketasks/uploads/migrate.md46
-rw-r--r--doc/administration/raketasks/uploads/sanitize.md4
-rw-r--r--doc/administration/read_only_gitlab.md2
-rw-r--r--doc/administration/redis/replication_and_failover.md2
-rw-r--r--doc/administration/reference_architectures/10k_users.md4
-rw-r--r--doc/administration/reference_architectures/25k_users.md4
-rw-r--r--doc/administration/reference_architectures/2k_users.md4
-rw-r--r--doc/administration/reference_architectures/3k_users.md4
-rw-r--r--doc/administration/reference_architectures/50k_users.md4
-rw-r--r--doc/administration/reference_architectures/5k_users.md4
-rw-r--r--doc/administration/reference_architectures/index.md8
-rw-r--r--doc/administration/reporting/git_abuse_rate_limit.md49
-rw-r--r--doc/administration/reporting/ip_addr_restrictions.md33
-rw-r--r--doc/administration/reporting/spamcheck.md69
-rw-r--r--doc/administration/repository_storage_paths.md6
-rw-r--r--doc/administration/repository_storage_types.md2
-rw-r--r--doc/administration/review_abuse_reports.md96
-rw-r--r--doc/administration/settings/account_and_limit_settings.md399
-rw-r--r--doc/administration/settings/continuous_integration.md429
-rw-r--r--doc/administration/settings/deprecated_api_rate_limits.md54
-rw-r--r--doc/administration/settings/email.md125
-rw-r--r--doc/administration/settings/external_authorization.md144
-rw-r--r--doc/administration/settings/files_api_rate_limits.md51
-rw-r--r--doc/administration/settings/floc.md42
-rw-r--r--doc/administration/settings/git_lfs_rate_limits.md36
-rw-r--r--doc/administration/settings/gitaly_timeouts.md27
-rw-r--r--doc/administration/settings/help_page.md111
-rw-r--r--doc/administration/settings/img/bulk_push_event_v12_4.pngbin0 -> 9386 bytes
-rw-r--r--doc/administration/settings/img/classification_label_on_project_page_v14_8.pngbin0 -> 17728 bytes
-rw-r--r--doc/administration/settings/img/continuous_integration_shared_runner_details_input_v14_10.png (renamed from doc/user/admin_area/settings/img/continuous_integration_shared_runner_details_input_v14_10.png)bin10770 -> 10770 bytes
-rw-r--r--doc/administration/settings/img/continuous_integration_shared_runner_details_v14_10.png (renamed from doc/user/admin_area/settings/img/continuous_integration_shared_runner_details_v14_10.png)bin9849 -> 9849 bytes
-rw-r--r--doc/administration/settings/img/custom_git_clone_url_for_https_v12_4.pngbin0 -> 11171 bytes
-rw-r--r--doc/administration/settings/img/domain_denylist_v14_1.pngbin0 -> 31473 bytes
-rw-r--r--doc/administration/settings/img/email_notification_for_unknown_sign_ins_v13_2.pngbin0 -> 12539 bytes
-rw-r--r--doc/administration/settings/img/file_template_user_dropdown.pngbin0 -> 8067 bytes
-rw-r--r--doc/administration/settings/img/mirror_settings_v15_7.pngbin0 -> 10322 bytes
-rw-r--r--doc/administration/settings/img/protected_paths.pngbin0 -> 56448 bytes
-rw-r--r--doc/administration/settings/img/push_event_activities_limit_v12_4.pngbin0 -> 15739 bytes
-rw-r--r--doc/administration/settings/img/rate_limit_on_issues_creation_v14_2.pngbin0 -> 10102 bytes
-rw-r--r--doc/administration/settings/img/rate_limits_on_raw_endpoints.pngbin0 -> 20962 bytes
-rw-r--r--doc/administration/settings/img/restricted_url.pngbin0 -> 18191 bytes
-rw-r--r--doc/administration/settings/img/sign_up_terms.pngbin0 -> 18174 bytes
-rw-r--r--doc/administration/settings/img/suggest_pipeline_banner_v14_5.png (renamed from doc/user/admin_area/settings/img/suggest_pipeline_banner_v14_5.png)bin11137 -> 11137 bytes
-rw-r--r--doc/administration/settings/img/two_factor_grace_period.pngbin0 -> 17591 bytes
-rw-r--r--doc/administration/settings/img/update-available.pngbin0 -> 26769 bytes
-rw-r--r--doc/administration/settings/import_export_rate_limits.md31
-rw-r--r--doc/administration/settings/incident_management_rate_limits.md39
-rw-r--r--doc/administration/settings/index.md215
-rw-r--r--doc/administration/settings/instance_template_repository.md84
-rw-r--r--doc/administration/settings/package_registry_rate_limits.md57
-rw-r--r--doc/administration/settings/project_integration_management.md138
-rw-r--r--doc/administration/settings/protected_paths.md43
-rw-r--r--doc/administration/settings/push_event_activities_limit.md38
-rw-r--r--doc/administration/settings/rate_limit_on_issues_creation.md36
-rw-r--r--doc/administration/settings/rate_limit_on_notes_creation.md35
-rw-r--r--doc/administration/settings/rate_limit_on_pipelines_creation.md35
-rw-r--r--doc/administration/settings/rate_limit_on_projects_api.md37
-rw-r--r--doc/administration/settings/rate_limit_on_users_api.md34
-rw-r--r--doc/administration/settings/rate_limits_on_git_ssh_operations.md33
-rw-r--r--doc/administration/settings/rate_limits_on_raw_endpoints.md29
-rw-r--r--doc/administration/settings/scim_setup.md43
-rw-r--r--doc/administration/settings/security_and_compliance.md25
-rw-r--r--doc/administration/settings/sidekiq_job_limits.md35
-rw-r--r--doc/administration/settings/sign_in_restrictions.md203
-rw-r--r--doc/administration/settings/sign_up_restrictions.md206
-rw-r--r--doc/administration/settings/terms.md49
-rw-r--r--doc/administration/settings/terraform_limits.md28
-rw-r--r--doc/administration/settings/third_party_offers.md38
-rw-r--r--doc/administration/settings/usage_statistics.md230
-rw-r--r--doc/administration/settings/user_and_ip_rate_limits.md240
-rw-r--r--doc/administration/settings/visibility_and_access_controls.md363
-rw-r--r--doc/administration/sidekiq/extra_sidekiq_processes.md2
-rw-r--r--doc/administration/sidekiq/index.md2
-rw-r--r--doc/administration/sidekiq/sidekiq_troubleshooting.md26
-rw-r--r--doc/administration/silent_mode/index.md8
-rw-r--r--doc/administration/snippets/index.md2
-rw-r--r--doc/administration/terraform_state.md2
-rw-r--r--doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md2
-rw-r--r--doc/administration/troubleshooting/postgresql.md2
-rw-r--r--doc/administration/uploads.md2
-rw-r--r--doc/administration/user_cohorts.md40
-rw-r--r--doc/administration/user_settings.md4
-rw-r--r--doc/administration/wikis/index.md4
-rw-r--r--doc/api/api_resources.md101
-rw-r--r--doc/api/audit_events.md10
-rw-r--r--doc/api/award_emoji.md4
-rw-r--r--doc/api/broadcast_messages.md2
-rw-r--r--doc/api/cluster_agents.md3
-rw-r--r--doc/api/code_suggestions.md81
-rw-r--r--doc/api/database_migrations.md33
-rw-r--r--doc/api/deployments.md4
-rw-r--r--doc/api/environments.md2
-rw-r--r--doc/api/error_tracking.md2
-rw-r--r--doc/api/geo_nodes.md42
-rw-r--r--doc/api/graphql/custom_emoji.md8
-rw-r--r--doc/api/graphql/index.md2
-rw-r--r--doc/api/graphql/reference/index.md696
-rw-r--r--doc/api/group_access_tokens.md5
-rw-r--r--doc/api/group_import_export.md4
-rw-r--r--doc/api/group_level_variables.md81
-rw-r--r--doc/api/group_protected_branches.md2
-rw-r--r--doc/api/group_relations_export.md43
-rw-r--r--doc/api/group_releases.md2
-rw-r--r--doc/api/groups.md19
-rw-r--r--doc/api/import.md22
-rw-r--r--doc/api/instance_level_ci_variables.md49
-rw-r--r--doc/api/issues.md2
-rw-r--r--doc/api/job_artifacts.md69
-rw-r--r--doc/api/jobs.md106
-rw-r--r--doc/api/lint.md50
-rw-r--r--doc/api/markdown.md2
-rw-r--r--doc/api/merge_request_approvals.md6
-rw-r--r--doc/api/merge_trains.md49
-rw-r--r--doc/api/notes.md2
-rw-r--r--doc/api/openapi/openapi.yaml3980
-rw-r--r--doc/api/packages/npm.md2
-rw-r--r--doc/api/packages/pypi.md6
-rw-r--r--doc/api/pipeline_schedules.md120
-rw-r--r--doc/api/pipeline_triggers.md52
-rw-r--r--doc/api/pipelines.md115
-rw-r--r--doc/api/product_analytics.md2
-rw-r--r--doc/api/project_access_tokens.md3
-rw-r--r--doc/api/project_import_export.md6
-rw-r--r--doc/api/project_job_token_scopes.md42
-rw-r--r--doc/api/project_level_variables.md85
-rw-r--r--doc/api/project_relations_export.md49
-rw-r--r--doc/api/project_snippets.md2
-rw-r--r--doc/api/projects.md260
-rw-r--r--doc/api/protected_branches.md22
-rw-r--r--doc/api/releases/index.md2
-rw-r--r--doc/api/remote_mirrors.md14
-rw-r--r--doc/api/repository_files.md3
-rw-r--r--doc/api/rest/deprecations.md7
-rw-r--r--doc/api/runners.md21
-rw-r--r--doc/api/saml.md10
-rw-r--r--doc/api/scim.md4
-rw-r--r--doc/api/search.md9
-rw-r--r--doc/api/secure_files.md40
-rw-r--r--doc/api/settings.md82
-rw-r--r--doc/api/snippets.md2
-rw-r--r--doc/api/templates/dockerfiles.md2
-rw-r--r--doc/api/templates/gitlab_ci_ymls.md8
-rw-r--r--doc/api/users.md49
-rw-r--r--doc/api/visual_review_discussions.md34
-rw-r--r--doc/architecture/blueprints/ai_gateway/img/architecture.pngbin0 -> 378194 bytes
-rw-r--r--doc/architecture/blueprints/ai_gateway/index.md463
-rw-r--r--doc/architecture/blueprints/cells/cells-feature-backups.md6
-rw-r--r--doc/architecture/blueprints/cells/cells-feature-contributions-forks.md6
-rw-r--r--doc/architecture/blueprints/cells/cells-feature-secrets.md4
-rw-r--r--doc/architecture/blueprints/cells/index.md10
-rw-r--r--doc/architecture/blueprints/cells/proposal-stateless-router-with-buffering-requests.md2
-rw-r--r--doc/architecture/blueprints/cells/proposal-stateless-router-with-routes-learning.md2
-rw-r--r--doc/architecture/blueprints/ci_data_decay/index.md2
-rw-r--r--doc/architecture/blueprints/ci_pipeline_components/index.md6
-rw-r--r--doc/architecture/blueprints/ci_scale/index.md2
-rw-r--r--doc/architecture/blueprints/clickhouse_ingestion_pipeline/index.md4
-rw-r--r--doc/architecture/blueprints/clickhouse_usage/index.md37
-rw-r--r--doc/architecture/blueprints/code_search_with_zoekt/index.md2
-rw-r--r--doc/architecture/blueprints/consolidating_groups_and_projects/index.md2
-rw-r--r--doc/architecture/blueprints/container_registry_metadata_database/index.md2
-rw-r--r--doc/architecture/blueprints/container_registry_metadata_database_self_managed_rollout/index.md238
-rw-r--r--doc/architecture/blueprints/database/automated_query_analysis/index.md2
-rw-r--r--doc/architecture/blueprints/gitlab_agent_deployments/index.md171
-rw-r--r--doc/architecture/blueprints/gitlab_ci_events/index.md13
-rw-r--r--doc/architecture/blueprints/gitlab_ci_events/proposal-1-using-the-gitlab-ci-file.md24
-rw-r--r--doc/architecture/blueprints/gitlab_ci_events/proposal-2-using-the-rules-keyword.md23
-rw-r--r--doc/architecture/blueprints/gitlab_ci_events/proposal-3-using-the-gitlab-ci-events-folder.md13
-rw-r--r--doc/architecture/blueprints/gitlab_ci_events/proposal-4-creating-events-via-ci-files.md26
-rw-r--r--doc/architecture/blueprints/gitlab_ci_events/proposal-5-combined-proposal.md99
-rw-r--r--doc/architecture/blueprints/gitlab_observability_backend/index.md693
-rw-r--r--doc/architecture/blueprints/gitlab_observability_backend/metrics/index.md690
-rw-r--r--doc/architecture/blueprints/gitlab_observability_backend/supported-deployments.png (renamed from doc/architecture/blueprints/gitlab_observability_backend/metrics/supported-deployments.png)bin74153 -> 74153 bytes
-rw-r--r--doc/architecture/blueprints/modular_monolith/bounded_contexts.md119
-rw-r--r--doc/architecture/blueprints/modular_monolith/hexagonal_monolith/hexagonal_architecture.pngbin0 -> 33135 bytes
-rw-r--r--doc/architecture/blueprints/modular_monolith/hexagonal_monolith/index.md132
-rw-r--r--doc/architecture/blueprints/modular_monolith/index.md112
-rw-r--r--doc/architecture/blueprints/modular_monolith/proof_of_concepts.md134
-rw-r--r--doc/architecture/blueprints/modular_monolith/references.md70
-rw-r--r--doc/architecture/blueprints/object_pools/index.md4
-rw-r--r--doc/architecture/blueprints/observability_tracing/arch.pngbin0 -> 53192 bytes
-rw-r--r--doc/architecture/blueprints/observability_tracing/index.md171
-rw-r--r--doc/architecture/blueprints/organization/index.md192
-rw-r--r--doc/architecture/blueprints/rate_limiting/index.md2
-rw-r--r--doc/architecture/blueprints/remote_development/index.md4
-rw-r--r--doc/architecture/blueprints/repository_backups/index.md268
-rw-r--r--doc/architecture/blueprints/runner_admission_controller/index.md241
-rw-r--r--doc/architecture/blueprints/runner_scaling/index.md6
-rw-r--r--doc/architecture/blueprints/runner_tokens/index.md4
-rw-r--r--doc/architecture/blueprints/work_items/index.md22
-rw-r--r--doc/ci/caching/index.md158
-rw-r--r--doc/ci/chatops/index.md14
-rw-r--r--doc/ci/ci_cd_for_external_repos/index.md2
-rw-r--r--doc/ci/cloud_deployment/ecs/deploy_to_aws_ecs.md2
-rw-r--r--doc/ci/cloud_deployment/index.md6
-rw-r--r--doc/ci/cloud_services/azure/index.md9
-rw-r--r--doc/ci/components/index.md179
-rw-r--r--doc/ci/docker/authenticate_registry.md16
-rw-r--r--doc/ci/docker/docker_layer_caching.md15
-rw-r--r--doc/ci/docker/using_docker_build.md92
-rw-r--r--doc/ci/docker/using_docker_images.md2
-rw-r--r--doc/ci/environments/deployment_approvals.md8
-rw-r--r--doc/ci/environments/deployment_safety.md20
-rw-r--r--doc/ci/environments/index.md14
-rw-r--r--doc/ci/environments/kubernetes_dashboard.md7
-rw-r--r--doc/ci/examples/deployment/composer-npm-deploy.md40
-rw-r--r--doc/ci/examples/deployment/index.md12
-rw-r--r--doc/ci/examples/end_to_end_testing_webdriverio/index.md21
-rw-r--r--doc/ci/examples/index.md2
-rw-r--r--doc/ci/examples/laravel_with_gitlab_and_envoy/index.md29
-rw-r--r--doc/ci/examples/php.md48
-rw-r--r--doc/ci/index.md13
-rw-r--r--doc/ci/jobs/ci_job_token.md2
-rw-r--r--doc/ci/jobs/job_artifacts.md6
-rw-r--r--doc/ci/jobs/job_control.md32
-rw-r--r--doc/ci/migration/circleci.md20
-rw-r--r--doc/ci/migration/jenkins.md4
-rw-r--r--doc/ci/pipeline_editor/index.md8
-rw-r--r--doc/ci/pipelines/cicd_minutes.md100
-rw-r--r--doc/ci/pipelines/downstream_pipelines.md4
-rw-r--r--doc/ci/pipelines/index.md8
-rw-r--r--doc/ci/pipelines/job_artifacts.md11
-rw-r--r--doc/ci/pipelines/merge_trains.md2
-rw-r--r--doc/ci/pipelines/pipeline_architectures.md18
-rw-r--r--doc/ci/pipelines/pipeline_security.md14
-rw-r--r--doc/ci/pipelines/settings.md4
-rw-r--r--doc/ci/quick_start/index.md4
-rw-r--r--doc/ci/review_apps/index.md4
-rw-r--r--doc/ci/runners/configure_runners.md135
-rw-r--r--doc/ci/runners/index.md12
-rw-r--r--doc/ci/runners/new_creation_workflow.md21
-rw-r--r--doc/ci/runners/register_runner.md131
-rw-r--r--doc/ci/runners/runners_scope.md274
-rw-r--r--doc/ci/runners/saas/gpu_saas_runner.md6
-rw-r--r--doc/ci/runners/saas/linux_saas_runner.md10
-rw-r--r--doc/ci/runners/saas/macos_saas_runner.md21
-rw-r--r--doc/ci/runners/saas/windows_saas_runner.md11
-rw-r--r--doc/ci/secrets/convert-to-id-tokens.md203
-rw-r--r--doc/ci/secrets/id_token_authentication.md7
-rw-r--r--doc/ci/services/index.md51
-rw-r--r--doc/ci/services/postgres.md5
-rw-r--r--doc/ci/ssh_keys/index.md4
-rw-r--r--doc/ci/test_cases/index.md33
-rw-r--r--doc/ci/testing/accessibility_testing.md22
-rw-r--r--doc/ci/testing/browser_performance_testing.md88
-rw-r--r--doc/ci/testing/code_quality.md12
-rw-r--r--doc/ci/testing/load_performance_testing.md9
-rw-r--r--doc/ci/testing/unit_test_report_examples.md20
-rw-r--r--doc/ci/triggers/index.md2
-rw-r--r--doc/ci/troubleshooting.md2
-rw-r--r--doc/ci/variables/index.md21
-rw-r--r--doc/ci/variables/predefined_variables.md2
-rw-r--r--doc/ci/yaml/includes.md11
-rw-r--r--doc/ci/yaml/index.md80
-rw-r--r--doc/ci/yaml/signing_examples.md310
-rw-r--r--doc/development/advanced_search.md2
-rw-r--r--doc/development/ai_architecture.md23
-rw-r--r--doc/development/ai_features.md65
-rw-r--r--doc/development/api_graphql_styleguide.md8
-rw-r--r--doc/development/api_styleguide.md14
-rw-r--r--doc/development/application_limits.md2
-rw-r--r--doc/development/architecture.md4
-rw-r--r--doc/development/audit_event_guide/index.md2
-rw-r--r--doc/development/auto_devops.md2
-rw-r--r--doc/development/avoiding_required_stops.md137
-rw-r--r--doc/development/backend/ruby_style_guide.md21
-rw-r--r--doc/development/cicd/cicd_reference_documentation_guide.md2
-rw-r--r--doc/development/cicd/index.md2
-rw-r--r--doc/development/cicd/pipeline_wizard.md2
-rw-r--r--doc/development/cicd/templates.md21
-rw-r--r--doc/development/code_review.md8
-rw-r--r--doc/development/contributing/first_contribution.md2
-rw-r--r--doc/development/contributing/index.md4
-rw-r--r--doc/development/contributing/style_guides.md2
-rw-r--r--doc/development/database/adding_database_indexes.md5
-rw-r--r--doc/development/database/avoiding_downtime_in_migrations.md9
-rw-r--r--doc/development/database/background_migrations.md511
-rw-r--r--doc/development/database/batched_background_migrations.md644
-rw-r--r--doc/development/database/database_reviewer_guidelines.md41
-rw-r--r--doc/development/database/efficient_in_operator_queries.md4
-rw-r--r--doc/development/database/index.md3
-rw-r--r--doc/development/database/insert_into_tables_in_batches.md2
-rw-r--r--doc/development/database/keyset_pagination.md2
-rw-r--r--doc/development/database/load_balancing.md2
-rw-r--r--doc/development/database/loose_foreign_keys.md4
-rw-r--r--doc/development/database/migrations_for_multiple_databases.md4
-rw-r--r--doc/development/database/multiple_databases.md17
-rw-r--r--doc/development/database/not_null_constraints.md2
-rw-r--r--doc/development/database/pagination_guidelines.md2
-rw-r--r--doc/development/database/post_deployment_migrations.md4
-rw-r--r--doc/development/database/required_stops.md8
-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/database_review.md6
-rw-r--r--doc/development/deprecation_guidelines/index.md75
-rw-r--r--doc/development/development_processes.md1
-rw-r--r--doc/development/distributed_tracing.md6
-rw-r--r--doc/development/documentation/alpha_beta.md2
-rw-r--r--doc/development/documentation/contribute.md2
-rw-r--r--doc/development/documentation/feature_flags.md24
-rw-r--r--doc/development/documentation/index.md2
-rw-r--r--doc/development/documentation/restful_api_styleguide.md18
-rw-r--r--doc/development/documentation/site_architecture/folder_structure.md38
-rw-r--r--doc/development/documentation/styleguide/index.md32
-rw-r--r--doc/development/documentation/styleguide/word_list.md135
-rw-r--r--doc/development/documentation/workflow.md2
-rw-r--r--doc/development/ee_features.md8
-rw-r--r--doc/development/event_store.md16
-rw-r--r--doc/development/experiment_guide/implementing_experiments.md4
-rw-r--r--doc/development/fe_guide/content_editor.md42
-rw-r--r--doc/development/fe_guide/design_tokens.md320
-rw-r--r--doc/development/fe_guide/frontend_faq.md2
-rw-r--r--doc/development/fe_guide/graphql.md45
-rw-r--r--doc/development/fe_guide/index.md59
-rw-r--r--doc/development/fe_guide/logging.md6
-rw-r--r--doc/development/fe_guide/merge_request_widget_extensions.md6
-rw-r--r--doc/development/fe_guide/onboarding_course/index.md64
-rw-r--r--doc/development/fe_guide/onboarding_course/lesson_1.md183
-rw-r--r--doc/development/fe_guide/storybook.md6
-rw-r--r--doc/development/fe_guide/style/javascript.md26
-rw-r--r--doc/development/fe_guide/vue.md9
-rw-r--r--doc/development/fe_guide/vuex.md2
-rw-r--r--doc/development/feature_flags/index.md48
-rw-r--r--doc/development/features_inside_dot_gitlab.md2
-rw-r--r--doc/development/fips_compliance.md2
-rw-r--r--doc/development/gemfile.md3
-rw-r--r--doc/development/gems.md259
-rw-r--r--doc/development/geo.md26
-rw-r--r--doc/development/git_object_deduplication.md4
-rw-r--r--doc/development/gitaly.md6
-rw-r--r--doc/development/gitlab_flavored_markdown/specification_guide/index.md34
-rw-r--r--doc/development/graphql_guide/batchloader.md6
-rw-r--r--doc/development/import_export.md5
-rw-r--r--doc/development/integrations/index.md3
-rw-r--r--doc/development/integrations/secure.md13
-rw-r--r--doc/development/internal_analytics/internal_events/index.md98
-rw-r--r--doc/development/internal_analytics/service_ping/implement.md8
-rw-r--r--doc/development/internal_analytics/service_ping/index.md2
-rw-r--r--doc/development/internal_analytics/service_ping/metrics_dictionary.md6
-rw-r--r--doc/development/internal_analytics/service_ping/metrics_instrumentation.md30
-rw-r--r--doc/development/internal_analytics/service_ping/metrics_lifecycle.md8
-rw-r--r--doc/development/internal_analytics/service_ping/troubleshooting.md6
-rw-r--r--doc/development/internal_analytics/snowplow/infrastructure.md2
-rw-r--r--doc/development/internal_analytics/snowplow/troubleshooting.md6
-rw-r--r--doc/development/internal_api/index.md33
-rw-r--r--doc/development/internal_api/internal_api_allowed.md2
-rw-r--r--doc/development/internal_users.md1
-rw-r--r--doc/development/jh_features_review.md14
-rw-r--r--doc/development/merge_request_concepts/diffs/development.md2
-rw-r--r--doc/development/migration_style_guide.md264
-rw-r--r--doc/development/packages/new_format_development.md2
-rw-r--r--doc/development/performance.md2
-rw-r--r--doc/development/permissions/custom_roles.md14
-rw-r--r--doc/development/pipelines/index.md52
-rw-r--r--doc/development/pipelines/internals.md28
-rw-r--r--doc/development/policies.md15
-rw-r--r--doc/development/product_qualified_lead_guide/index.md10
-rw-r--r--doc/development/project_templates.md4
-rw-r--r--doc/development/reactive_caching.md5
-rw-r--r--doc/development/redis.md45
-rw-r--r--doc/development/sec/gemnasium_analyzer_data.md33
-rw-r--r--doc/development/secure_coding_guidelines.md4
-rw-r--r--doc/development/sidekiq/compatibility_across_updates.md2
-rw-r--r--doc/development/sidekiq/idempotent_jobs.md2
-rw-r--r--doc/development/sidekiq/index.md2
-rw-r--r--doc/development/software_design.md162
-rw-r--r--doc/development/spam_protection_and_captcha/web_ui.md8
-rw-r--r--doc/development/testing_guide/best_practices.md192
-rw-r--r--doc/development/testing_guide/contract/index.md4
-rw-r--r--doc/development/testing_guide/contract/provider_tests.md4
-rw-r--r--doc/development/testing_guide/end_to_end/beginners_guide.md4
-rw-r--r--doc/development/testing_guide/end_to_end/best_practices.md37
-rw-r--r--doc/development/testing_guide/end_to_end/feature_flags.md8
-rw-r--r--doc/development/testing_guide/end_to_end/rspec_metadata_tests.md5
-rw-r--r--doc/development/testing_guide/end_to_end/style_guide.md2
-rw-r--r--doc/development/testing_guide/flaky_tests.md14
-rw-r--r--doc/development/testing_guide/frontend_testing.md21
-rw-r--r--doc/development/testing_guide/review_apps.md4
-rw-r--r--doc/development/testing_guide/test_results_tracking.md2
-rw-r--r--doc/development/value_stream_analytics.md4
-rw-r--r--doc/development/work_items_widgets.md18
-rw-r--r--doc/development/workhorse/channel.md4
-rw-r--r--doc/development/workhorse/configuration.md4
-rw-r--r--doc/gitlab-basics/feature_branch_workflow.md2
-rw-r--r--doc/index.md4
-rw-r--r--doc/install/aws/gitlab_hybrid_on_aws.md28
-rw-r--r--doc/install/aws/gitlab_sre_for_aws.md4
-rw-r--r--doc/install/aws/manual_install_aws.md18
-rw-r--r--doc/install/docker.md23
-rw-r--r--doc/install/installation.md22
-rw-r--r--doc/install/migrate/compare_sm_to_saas.md4
-rw-r--r--doc/install/next_steps.md9
-rw-r--r--doc/install/requirements.md3
-rw-r--r--doc/integration/advanced_search/elasticsearch.md14
-rw-r--r--doc/integration/advanced_search/elasticsearch_troubleshooting.md20
-rw-r--r--doc/integration/external-issue-tracker.md30
-rw-r--r--doc/integration/index.md22
-rw-r--r--doc/integration/jira/configure.md6
-rw-r--r--doc/integration/jira/connect-app.md10
-rw-r--r--doc/integration/jira/development_panel.md13
-rw-r--r--doc/integration/jira/index.md2
-rw-r--r--doc/integration/jira/issues.md12
-rw-r--r--doc/integration/jira/jira_server_configuration.md4
-rw-r--r--doc/integration/jira/troubleshooting.md9
-rw-r--r--doc/integration/kerberos.md9
-rw-r--r--doc/integration/mattermost/index.md2
-rw-r--r--doc/integration/oauth_provider.md3
-rw-r--r--doc/integration/omniauth.md4
-rw-r--r--doc/integration/saml.md24
-rw-r--r--doc/integration/security_partners/index.md33
-rw-r--r--doc/integration/shibboleth.md4
-rw-r--r--doc/integration/slash_commands.md54
-rw-r--r--doc/integration/sourcegraph.md2
-rw-r--r--doc/operations/error_tracking.md2
-rw-r--r--doc/operations/feature_flags.md6
-rw-r--r--doc/operations/incident_management/incident_timeline_events.md4
-rw-r--r--doc/operations/incident_management/manage_incidents.md4
-rw-r--r--doc/operations/incident_management/slack.md2
-rw-r--r--doc/operations/incident_management/status_page.md6
-rw-r--r--doc/policy/experiment-beta-support.md24
-rw-r--r--doc/policy/maintenance.md2
-rw-r--r--doc/raketasks/backup_gitlab.md956
-rw-r--r--doc/raketasks/backup_restore.md1094
-rw-r--r--doc/raketasks/generate_sample_prometheus_data.md30
-rw-r--r--doc/raketasks/index.md4
-rw-r--r--doc/raketasks/migrate_snippets.md104
-rw-r--r--doc/raketasks/restore_gitlab.md405
-rw-r--r--doc/raketasks/user_management.md2
-rw-r--r--doc/security/email_verification.md2
-rw-r--r--doc/security/hardening_application_recommendations.md8
-rw-r--r--doc/security/hardening_operating_system_recommendations.md2
-rw-r--r--doc/security/img/ssh_keys_restrictions_settings.pngbin19571 -> 32832 bytes
-rw-r--r--doc/security/index.md2
-rw-r--r--doc/security/rate_limits.md45
-rw-r--r--doc/security/responding_to_security_incidents.md6
-rw-r--r--doc/security/token_overview.md34
-rw-r--r--doc/security/two_factor_authentication.md4
-rw-r--r--doc/security/unlock_user.md2
-rw-r--r--doc/security/webhooks.md2
-rw-r--r--doc/subscriptions/bronze_starter.md8
-rw-r--r--doc/subscriptions/choosing_subscription.md6
-rw-r--r--doc/subscriptions/community_programs.md6
-rw-r--r--doc/subscriptions/customers_portal.md68
-rw-r--r--doc/subscriptions/gitlab_com/index.md20
-rw-r--r--doc/subscriptions/gitlab_dedicated/index.md4
-rw-r--r--doc/subscriptions/self_managed/index.md39
-rw-r--r--doc/topics/autodevops/cloud_deployments/auto_devops_with_eks.md3
-rw-r--r--doc/topics/autodevops/cloud_deployments/auto_devops_with_gke.md3
-rw-r--r--doc/topics/autodevops/index.md2
-rw-r--r--doc/topics/autodevops/multiple_clusters_auto_devops.md2
-rw-r--r--doc/topics/autodevops/prepare_deployment.md6
-rw-r--r--doc/topics/autodevops/requirements.md6
-rw-r--r--doc/topics/build_your_application.md6
-rw-r--r--doc/topics/cron/index.md1
-rw-r--r--doc/topics/git/git_rebase.md3
-rw-r--r--doc/topics/git/lfs/index.md2
-rw-r--r--doc/topics/git/useful_git_commands.md34
-rw-r--r--doc/topics/manage_code.md12
-rw-r--r--doc/topics/offline/quick_start_guide.md8
-rw-r--r--doc/topics/release_your_application.md2
-rw-r--r--doc/tutorials/configure_gitlab_runner_to_use_gke/index.md2
-rw-r--r--doc/tutorials/dependency_scanning.md12
-rw-r--r--doc/tutorials/fuzz_testing/index.md2
-rw-r--r--doc/tutorials/hugo/index.md2
-rw-r--r--doc/tutorials/left_sidebar/index.md5
-rw-r--r--doc/tutorials/make_first_git_commit/index.md2
-rw-r--r--doc/tutorials/manage_user/index.md2
-rw-r--r--doc/tutorials/move_personal_project_to_group/index.md2
-rw-r--r--doc/tutorials/protected_workflow/img/approval_rules_v16_2.pngbin0 -> 9312 bytes
-rw-r--r--doc/tutorials/protected_workflow/img/branch_is_protected_v16_2.pngbin0 -> 8894 bytes
-rw-r--r--doc/tutorials/protected_workflow/img/branch_list_v16_1.pngbin0 -> 11202 bytes
-rw-r--r--doc/tutorials/protected_workflow/img/new_file_v16_2.pngbin0 -> 9452 bytes
-rw-r--r--doc/tutorials/protected_workflow/img/new_project_v16_2.pngbin0 -> 21608 bytes
-rw-r--r--doc/tutorials/protected_workflow/img/protections_in_place_v16_2.pngbin0 -> 22111 bytes
-rw-r--r--doc/tutorials/protected_workflow/img/search_engineering_v16_2.pngbin0 -> 6244 bytes
-rw-r--r--doc/tutorials/protected_workflow/img/subgroup_structure_v16_1.pngbin0 -> 16992 bytes
-rw-r--r--doc/tutorials/protected_workflow/index.md290
-rw-r--r--doc/update/background_migrations.md365
-rw-r--r--doc/update/deprecations.md565
-rw-r--r--doc/update/img/batched_background_migrations_failed_v14_3.pngbin0 -> 13427 bytes
-rw-r--r--doc/update/img/batched_background_migrations_queued_v14_0.pngbin11690 -> 0 bytes
-rw-r--r--doc/update/index.md104
-rw-r--r--doc/update/package/convert_to_ee.md6
-rw-r--r--doc/update/package/downgrade.md4
-rw-r--r--doc/update/package/index.md5
-rw-r--r--doc/update/patch_versions.md2
-rw-r--r--doc/update/plan_your_upgrade.md14
-rw-r--r--doc/update/removals.md2596
-rw-r--r--doc/update/upgrading_from_source.md18
-rw-r--r--doc/user/admin_area/analytics/dev_ops_reports.md77
-rw-r--r--doc/user/admin_area/analytics/index.md29
-rw-r--r--doc/user/admin_area/analytics/usage_trends.md49
-rw-r--r--doc/user/admin_area/appearance.md126
-rw-r--r--doc/user/admin_area/broadcast_messages.md123
-rw-r--r--doc/user/admin_area/credentials_inventory.md89
-rw-r--r--doc/user/admin_area/custom_project_templates.md76
-rw-r--r--doc/user/admin_area/diff_limits.md56
-rw-r--r--doc/user/admin_area/email_from_gitlab.md64
-rw-r--r--doc/user/admin_area/external_users.md83
-rw-r--r--doc/user/admin_area/geo_sites.md122
-rw-r--r--doc/user/admin_area/index.md443
-rw-r--r--doc/user/admin_area/labels.md31
-rw-r--r--doc/user/admin_area/license.md86
-rw-r--r--doc/user/admin_area/license_file.md255
-rw-r--r--doc/user/admin_area/merge_requests_approvals.md46
-rw-r--r--doc/user/admin_area/moderate_users.md363
-rw-r--r--doc/user/admin_area/monitoring/health_check.md149
-rw-r--r--doc/user/admin_area/reporting/git_abuse_rate_limit.md52
-rw-r--r--doc/user/admin_area/reporting/ip_addr_restrictions.md36
-rw-r--r--doc/user/admin_area/reporting/spamcheck.md72
-rw-r--r--doc/user/admin_area/review_abuse_reports.md99
-rw-r--r--doc/user/admin_area/settings/account_and_limit_settings.md402
-rw-r--r--doc/user/admin_area/settings/continuous_integration.md432
-rw-r--r--doc/user/admin_area/settings/deprecated_api_rate_limits.md57
-rw-r--r--doc/user/admin_area/settings/email.md128
-rw-r--r--doc/user/admin_area/settings/external_authorization.md147
-rw-r--r--doc/user/admin_area/settings/files_api_rate_limits.md54
-rw-r--r--doc/user/admin_area/settings/floc.md45
-rw-r--r--doc/user/admin_area/settings/git_lfs_rate_limits.md39
-rw-r--r--doc/user/admin_area/settings/gitaly_timeouts.md30
-rw-r--r--doc/user/admin_area/settings/help_page.md114
-rw-r--r--doc/user/admin_area/settings/import_export_rate_limits.md34
-rw-r--r--doc/user/admin_area/settings/incident_management_rate_limits.md42
-rw-r--r--doc/user/admin_area/settings/index.md221
-rw-r--r--doc/user/admin_area/settings/instance_template_repository.md87
-rw-r--r--doc/user/admin_area/settings/package_registry_rate_limits.md60
-rw-r--r--doc/user/admin_area/settings/project_integration_management.md141
-rw-r--r--doc/user/admin_area/settings/protected_paths.md46
-rw-r--r--doc/user/admin_area/settings/push_event_activities_limit.md41
-rw-r--r--doc/user/admin_area/settings/rate_limit_on_issues_creation.md39
-rw-r--r--doc/user/admin_area/settings/rate_limit_on_notes_creation.md38
-rw-r--r--doc/user/admin_area/settings/rate_limit_on_pipelines_creation.md38
-rw-r--r--doc/user/admin_area/settings/rate_limit_on_projects_api.md40
-rw-r--r--doc/user/admin_area/settings/rate_limit_on_users_api.md37
-rw-r--r--doc/user/admin_area/settings/rate_limits_on_git_ssh_operations.md11
-rw-r--r--doc/user/admin_area/settings/rate_limits_on_raw_endpoints.md32
-rw-r--r--doc/user/admin_area/settings/scim_setup.md46
-rw-r--r--doc/user/admin_area/settings/security_and_compliance.md28
-rw-r--r--doc/user/admin_area/settings/sidekiq_job_limits.md38
-rw-r--r--doc/user/admin_area/settings/sign_in_restrictions.md204
-rw-r--r--doc/user/admin_area/settings/sign_up_restrictions.md209
-rw-r--r--doc/user/admin_area/settings/slack_app.md109
-rw-r--r--doc/user/admin_area/settings/terms.md52
-rw-r--r--doc/user/admin_area/settings/terraform_limits.md31
-rw-r--r--doc/user/admin_area/settings/third_party_offers.md41
-rw-r--r--doc/user/admin_area/settings/usage_statistics.md233
-rw-r--r--doc/user/admin_area/settings/user_and_ip_rate_limits.md243
-rw-r--r--doc/user/admin_area/settings/visibility_and_access_controls.md366
-rw-r--r--doc/user/admin_area/user_cohorts.md43
-rw-r--r--doc/user/ai_features.md43
-rw-r--r--doc/user/analytics/analytics_dashboards.md185
-rw-r--r--doc/user/analytics/dora_metrics.md2
-rw-r--r--doc/user/analytics/index.md4
-rw-r--r--doc/user/analytics/value_streams_dashboard.md36
-rw-r--r--doc/user/application_security/api_fuzzing/index.md4
-rw-r--r--doc/user/application_security/comparison_dependency_and_container_scanning.md34
-rw-r--r--doc/user/application_security/container_scanning/index.md8
-rw-r--r--doc/user/application_security/dast/browser_based.md71
-rw-r--r--doc/user/application_security/dast/browser_based_troubleshooting.md9
-rw-r--r--doc/user/application_security/dast/checks/16.9.md2
-rw-r--r--doc/user/application_security/dast/proxy-based.md229
-rw-r--r--doc/user/application_security/dast_api/index.md4
-rw-r--r--doc/user/application_security/dependency_list/index.md11
-rw-r--r--doc/user/application_security/dependency_scanning/analyzers.md127
-rw-r--r--doc/user/application_security/dependency_scanning/index.md130
-rw-r--r--doc/user/application_security/iac_scanning/index.md12
-rw-r--r--doc/user/application_security/index.md53
-rw-r--r--doc/user/application_security/offline_deployments/index.md3
-rw-r--r--doc/user/application_security/policies/index.md3
-rw-r--r--doc/user/application_security/policies/scan-execution-policies.md102
-rw-r--r--doc/user/application_security/policies/scan-result-policies.md81
-rw-r--r--doc/user/application_security/sast/index.md36
-rw-r--r--doc/user/application_security/secret_detection/automatic_response.md1
-rw-r--r--doc/user/application_security/secret_detection/index.md27
-rw-r--r--doc/user/application_security/vulnerabilities/index.md11
-rw-r--r--doc/user/application_security/vulnerabilities/severities.md28
-rw-r--r--doc/user/asciidoc.md2
-rw-r--r--doc/user/award_emojis.md48
-rw-r--r--doc/user/clusters/agent/gitops.md224
-rw-r--r--doc/user/clusters/agent/gitops/agent.md255
-rw-r--r--doc/user/clusters/agent/gitops/example_repository_structure.md2
-rw-r--r--doc/user/clusters/agent/gitops/flux.md100
-rw-r--r--doc/user/clusters/agent/gitops/flux_tutorial.md9
-rw-r--r--doc/user/clusters/agent/gitops/helm.md155
-rw-r--r--doc/user/clusters/agent/gitops/secrets_management.md6
-rw-r--r--doc/user/clusters/agent/index.md9
-rw-r--r--doc/user/clusters/agent/install/index.md8
-rw-r--r--doc/user/clusters/agent/troubleshooting.md5
-rw-r--r--doc/user/clusters/agent/user_access.md4
-rw-r--r--doc/user/clusters/agent/work_with_agent.md3
-rw-r--r--doc/user/clusters/create/index.md1
-rw-r--r--doc/user/clusters/environments.md4
-rw-r--r--doc/user/clusters/management_project.md4
-rw-r--r--doc/user/compliance/license_compliance/index.md6
-rw-r--r--doc/user/compliance/license_list.md2
-rw-r--r--doc/user/compliance/license_scanning_of_cyclonedx_files/index.md2
-rw-r--r--doc/user/discussions/index.md4
-rw-r--r--doc/user/enterprise_user/index.md50
-rw-r--r--doc/user/free_user_limit.md4
-rw-r--r--doc/user/gitlab_com/index.md38
-rw-r--r--doc/user/group/access_and_permissions.md8
-rw-r--r--doc/user/group/compliance_frameworks.md62
-rw-r--r--doc/user/group/custom_project_templates.md2
-rw-r--r--doc/user/group/epics/epic_boards.md4
-rw-r--r--doc/user/group/epics/manage_epics.md22
-rw-r--r--doc/user/group/import/index.md22
-rw-r--r--doc/user/group/index.md34
-rw-r--r--doc/user/group/manage.md9
-rw-r--r--doc/user/group/moderate_users.md2
-rw-r--r--doc/user/group/reporting/git_abuse_rate_limit.md4
-rw-r--r--doc/user/group/repositories_analytics/index.md4
-rw-r--r--doc/user/group/saml_sso/example_saml_config.md9
-rw-r--r--doc/user/group/saml_sso/index.md19
-rw-r--r--doc/user/group/saml_sso/scim_setup.md16
-rw-r--r--doc/user/group/saml_sso/troubleshooting_scim.md4
-rw-r--r--doc/user/group/settings/group_access_tokens.md9
-rw-r--r--doc/user/group/subgroups/index.md2
-rw-r--r--doc/user/group/value_stream_analytics/index.md18
-rw-r--r--doc/user/img/award_emoji_votes_sort_options.pngbin40489 -> 0 bytes
-rw-r--r--doc/user/img/custom_emoji_reactions_v16_2.pngbin0 -> 20270 bytes
-rw-r--r--doc/user/img/objective_two_column_view_v16_2.pngbin0 -> 31451 bytes
-rw-r--r--doc/user/img/rich_text_editor_01_v16_2.pngbin0 -> 14293 bytes
-rw-r--r--doc/user/img/rich_text_editor_02_v16_2.pngbin0 -> 13117 bytes
-rw-r--r--doc/user/img/rich_text_editor_03_v16_2.pngbin0 -> 32211 bytes
-rw-r--r--doc/user/img/rich_text_editor_04_v16_2.pngbin0 -> 17386 bytes
-rw-r--r--doc/user/img/task_two_column_view_v16_2.pngbin0 -> 32287 bytes
-rw-r--r--doc/user/img/todos_add_okrs_v16_0.pngbin12705 -> 0 bytes
-rw-r--r--doc/user/img/todos_add_todo_sidebar_v14_1.pngbin6554 -> 0 bytes
-rw-r--r--doc/user/img/todos_mark_done_okrs_v16_0.pngbin13043 -> 0 bytes
-rw-r--r--doc/user/img/todos_mark_done_sidebar_v14_1.pngbin7055 -> 0 bytes
-rw-r--r--doc/user/infrastructure/clusters/connect/new_aks_cluster.md132
-rw-r--r--doc/user/infrastructure/clusters/connect/new_civo_cluster.md10
-rw-r--r--doc/user/infrastructure/clusters/connect/new_eks_cluster.md10
-rw-r--r--doc/user/infrastructure/clusters/connect/new_gke_cluster.md10
-rw-r--r--doc/user/infrastructure/clusters/deploy/inventory_object.md6
-rw-r--r--doc/user/infrastructure/clusters/manage/management_project_applications/runner.md15
-rw-r--r--doc/user/infrastructure/clusters/migrate_to_gitlab_agent.md4
-rw-r--r--doc/user/infrastructure/iac/index.md2
-rw-r--r--doc/user/infrastructure/iac/mr_integration.md7
-rw-r--r--doc/user/infrastructure/iac/terraform_state.md2
-rw-r--r--doc/user/markdown.md38
-rw-r--r--doc/user/okrs.md17
-rw-r--r--doc/user/organization/index.md2
-rw-r--r--doc/user/packages/composer_repository/index.md12
-rw-r--r--doc/user/packages/conan_repository/index.md2
-rw-r--r--doc/user/packages/container_registry/authenticate_with_container_registry.md2
-rw-r--r--doc/user/packages/container_registry/build_and_push_images.md12
-rw-r--r--doc/user/packages/container_registry/delete_container_registry_images.md2
-rw-r--r--doc/user/packages/container_registry/troubleshoot_container_registry.md2
-rw-r--r--doc/user/packages/harbor_container_registry/index.md2
-rw-r--r--doc/user/packages/maven_repository/index.md2
-rw-r--r--doc/user/packages/package_registry/index.md6
-rw-r--r--doc/user/packages/package_registry/reduce_package_registry_storage.md4
-rw-r--r--doc/user/packages/package_registry/supported_functionality.md12
-rw-r--r--doc/user/packages/terraform_module_registry/index.md8
-rw-r--r--doc/user/packages/workflows/project_registry.md2
-rw-r--r--doc/user/permissions.md8
-rw-r--r--doc/user/product_analytics/index.md38
-rw-r--r--doc/user/profile/account/delete_account.md12
-rw-r--r--doc/user/profile/account/two_factor_authentication.md12
-rw-r--r--doc/user/profile/achievements.md19
-rw-r--r--doc/user/profile/comment_templates.md2
-rw-r--r--doc/user/profile/contributions_calendar.md2
-rw-r--r--doc/user/profile/index.md16
-rw-r--r--doc/user/profile/notifications.md18
-rw-r--r--doc/user/profile/personal_access_tokens.md24
-rw-r--r--doc/user/profile/preferences.md7
-rw-r--r--doc/user/profile/saved_replies.md11
-rw-r--r--doc/user/profile/user_passwords.md2
-rw-r--r--doc/user/project/canary_deployments.md4
-rw-r--r--doc/user/project/clusters/add_eks_clusters.md4
-rw-r--r--doc/user/project/clusters/add_existing_cluster.md2
-rw-r--r--doc/user/project/clusters/add_gke_clusters.md2
-rw-r--r--doc/user/project/clusters/add_remove_clusters.md2
-rw-r--r--doc/user/project/clusters/gitlab_managed_clusters.md4
-rw-r--r--doc/user/project/deploy_boards.md4
-rw-r--r--doc/user/project/deploy_keys/index.md22
-rw-r--r--doc/user/project/description_templates.md2
-rw-r--r--doc/user/project/file_lock.md8
-rw-r--r--doc/user/project/import/bitbucket.md4
-rw-r--r--doc/user/project/import/bitbucket_server.md6
-rw-r--r--doc/user/project/import/fogbugz.md4
-rw-r--r--doc/user/project/import/gitea.md2
-rw-r--r--doc/user/project/import/github.md16
-rw-r--r--doc/user/project/import/index.md4
-rw-r--r--doc/user/project/import/manifest.md2
-rw-r--r--doc/user/project/import/repo_by_url.md2
-rw-r--r--doc/user/project/index.md10
-rw-r--r--doc/user/project/insights/index.md7
-rw-r--r--doc/user/project/integrations/gitlab_slack_application.md151
-rw-r--r--doc/user/project/integrations/index.md1
-rw-r--r--doc/user/project/integrations/mattermost_slash_commands.md23
-rw-r--r--doc/user/project/integrations/mlflow_client.md107
-rw-r--r--doc/user/project/integrations/slack.md2
-rw-r--r--doc/user/project/integrations/slack_slash_commands.md20
-rw-r--r--doc/user/project/integrations/webhook_events.md158
-rw-r--r--doc/user/project/integrations/webhooks.md4
-rw-r--r--doc/user/project/issue_board.md8
-rw-r--r--doc/user/project/issues/confidential_issues.md2
-rw-r--r--doc/user/project/issues/create_issues.md8
-rw-r--r--doc/user/project/issues/design_management.md10
-rw-r--r--doc/user/project/issues/index.md2
-rw-r--r--doc/user/project/issues/managing_issues.md31
-rw-r--r--doc/user/project/issues/sorting_issue_lists.md4
-rw-r--r--doc/user/project/members/index.md6
-rw-r--r--doc/user/project/members/share_project_with_groups.md1
-rw-r--r--doc/user/project/merge_requests/allow_collaboration.md2
-rw-r--r--doc/user/project/merge_requests/approvals/index.md15
-rw-r--r--doc/user/project/merge_requests/approvals/rules.md11
-rw-r--r--doc/user/project/merge_requests/approvals/settings.md2
-rw-r--r--doc/user/project/merge_requests/changes.md9
-rw-r--r--doc/user/project/merge_requests/drafts.md2
-rw-r--r--doc/user/project/merge_requests/index.md13
-rw-r--r--doc/user/project/merge_requests/reviews/img/suggest_changes_v16_2.pngbin0 -> 45128 bytes
-rw-r--r--doc/user/project/merge_requests/reviews/index.md4
-rw-r--r--doc/user/project/merge_requests/reviews/suggestions.md27
-rw-r--r--doc/user/project/milestones/burndown_and_burnup_charts.md12
-rw-r--r--doc/user/project/ml/experiment_tracking/img/candidate_detail_ci_v16_12.pngbin0 -> 53241 bytes
-rw-r--r--doc/user/project/ml/experiment_tracking/index.md28
-rw-r--r--doc/user/project/ml/experiment_tracking/mlflow_client.md109
-rw-r--r--doc/user/project/pages/custom_domains_ssl_tls_certification/index.md28
-rw-r--r--doc/user/project/pages/custom_domains_ssl_tls_certification/lets_encrypt_integration.md15
-rw-r--r--doc/user/project/pages/getting_started/pages_ci_cd_template.md6
-rw-r--r--doc/user/project/pages/getting_started/pages_forked_sample_project.md6
-rw-r--r--doc/user/project/pages/getting_started/pages_from_scratch.md6
-rw-r--r--doc/user/project/pages/getting_started/pages_new_project_template.md8
-rw-r--r--doc/user/project/pages/getting_started/pages_ui.md6
-rw-r--r--doc/user/project/pages/index.md7
-rw-r--r--doc/user/project/pages/introduction.md45
-rw-r--r--doc/user/project/pages/public_folder.md2
-rw-r--r--doc/user/project/protected_branches.md5
-rw-r--r--doc/user/project/push_options.md7
-rw-r--r--doc/user/project/quick_actions.md4
-rw-r--r--doc/user/project/releases/index.md18
-rw-r--r--doc/user/project/releases/release_evidence.md2
-rw-r--r--doc/user/project/remote_development/connect_machine.md2
-rw-r--r--doc/user/project/remote_development/index.md2
-rw-r--r--doc/user/project/repository/branches/default.md2
-rw-r--r--doc/user/project/repository/branches/index.md2
-rw-r--r--doc/user/project/repository/code_suggestions.md327
-rw-r--r--doc/user/project/repository/git_blame.md2
-rw-r--r--doc/user/project/repository/git_history.md2
-rw-r--r--doc/user/project/repository/gpg_signed_commits/index.md10
-rw-r--r--doc/user/project/repository/index.md12
-rw-r--r--doc/user/project/repository/mirror/index.md30
-rw-r--r--doc/user/project/repository/mirror/pull.md12
-rw-r--r--doc/user/project/repository/mirror/push.md11
-rw-r--r--doc/user/project/repository/push_rules.md12
-rw-r--r--doc/user/project/repository/reducing_the_repo_size_using_git.md4
-rw-r--r--doc/user/project/repository/ssh_signed_commits/index.md2
-rw-r--r--doc/user/project/requirements/index.md8
-rw-r--r--doc/user/project/service_desk.md341
-rw-r--r--doc/user/project/settings/import_export.md6
-rw-r--r--doc/user/project/settings/index.md48
-rw-r--r--doc/user/project/settings/project_access_tokens.md19
-rw-r--r--doc/user/project/web_ide/index.md2
-rw-r--r--doc/user/project/wiki/group.md1
-rw-r--r--doc/user/project/wiki/index.md13
-rw-r--r--doc/user/project/working_with_projects.md162
-rw-r--r--doc/user/public_access.md18
-rw-r--r--doc/user/report_abuse.md4
-rw-r--r--doc/user/reserved_names.md2
-rw-r--r--doc/user/rich_text_editor.md134
-rw-r--r--doc/user/search/advanced_search.md2
-rw-r--r--doc/user/search/command_palette.md30
-rw-r--r--doc/user/search/img/code_search_git_blame_v15_1.pngbin7461 -> 0 bytes
-rw-r--r--doc/user/search/img/project_search_general_settings_v13_8.pngbin47120 -> 0 bytes
-rw-r--r--doc/user/search/img/project_search_sha_redirect.pngbin17031 -> 0 bytes
-rw-r--r--doc/user/search/img/search_navbar_v15_7.pngbin9493 -> 0 bytes
-rw-r--r--doc/user/search/img/search_scope_v15_7.pngbin71848 -> 0 bytes
-rw-r--r--doc/user/search/index.md143
-rw-r--r--doc/user/shortcuts.md47
-rw-r--r--doc/user/snippets.md20
-rw-r--r--doc/user/ssh.md4
-rw-r--r--doc/user/tasks.md19
-rw-r--r--doc/user/todos.md12
-rw-r--r--doc/user/upgrade_email_bypass.md4
-rw-r--r--doc/user/usage_quotas.md2
-rw-r--r--doc/user/workspace/index.md29
-rw-r--r--gems/activerecord-gitlab/.gitignore (renamed from vendor/gems/gitlab_active_record/.gitignore)0
-rw-r--r--gems/activerecord-gitlab/.gitlab-ci.yml4
-rw-r--r--gems/activerecord-gitlab/.rspec (renamed from vendor/gems/gitlab_active_record/.rspec)0
-rw-r--r--gems/activerecord-gitlab/.rubocop.yml18
-rw-r--r--gems/activerecord-gitlab/Gemfile5
-rw-r--r--gems/activerecord-gitlab/Gemfile.lock104
-rw-r--r--gems/activerecord-gitlab/README.md4
-rw-r--r--gems/activerecord-gitlab/activerecord-gitlab.gemspec28
-rw-r--r--gems/activerecord-gitlab/lib/active_record/gitlab_patches.rb11
-rw-r--r--gems/activerecord-gitlab/lib/active_record/gitlab_patches/partitioning.rb43
-rw-r--r--gems/activerecord-gitlab/lib/active_record/gitlab_patches/partitioning/associations/builder/association.rb21
-rw-r--r--gems/activerecord-gitlab/lib/active_record/gitlab_patches/partitioning/base.rb49
-rw-r--r--gems/activerecord-gitlab/lib/active_record/gitlab_patches/partitioning/reflection/abstract_reflection.rb25
-rw-r--r--gems/activerecord-gitlab/lib/active_record/gitlab_patches/partitioning/reflection/association_reflection.rb17
-rw-r--r--gems/activerecord-gitlab/lib/active_record/gitlab_patches/partitioning/reflection/macro_reflection.rb19
-rw-r--r--gems/activerecord-gitlab/lib/active_record/gitlab_patches/rescue_from.rb39
-rw-r--r--gems/activerecord-gitlab/lib/active_record/gitlab_patches/version.rb9
-rw-r--r--gems/activerecord-gitlab/spec/active_record/gitlab_patches/partitioning/associations/belongs_to_spec.rb52
-rw-r--r--gems/activerecord-gitlab/spec/active_record/gitlab_patches/partitioning/associations/has_many_spec.rb115
-rw-r--r--gems/activerecord-gitlab/spec/active_record/gitlab_patches/partitioning/associations/has_one_spec.rb101
-rw-r--r--gems/activerecord-gitlab/spec/active_record/gitlab_patches/partitioning/joins_spec.rb41
-rw-r--r--gems/activerecord-gitlab/spec/active_record/gitlab_patches/partitioning/preloads_spec.rb241
-rw-r--r--gems/activerecord-gitlab/spec/active_record/gitlab_patches/partitioning/single_model_queries_spec.rb110
-rw-r--r--gems/activerecord-gitlab/spec/active_record/gitlab_patches/rescue_from_spec.rb31
-rw-r--r--gems/activerecord-gitlab/spec/active_record/gitlab_patches_spec.rb7
-rw-r--r--gems/activerecord-gitlab/spec/spec_helper.rb31
-rw-r--r--gems/activerecord-gitlab/spec/support/database.rb29
-rw-r--r--gems/activerecord-gitlab/spec/support/models.rb50
-rw-r--r--gems/activerecord-gitlab/spec/support/query_recorder.rb21
-rw-r--r--gems/click_house-client/.gitlab-ci.yml4
-rw-r--r--gems/click_house-client/.rspec3
-rw-r--r--gems/click_house-client/.rubocop.yml2
-rw-r--r--gems/click_house-client/Gemfile5
-rw-r--r--gems/click_house-client/Gemfile.lock102
-rw-r--r--gems/click_house-client/README.md3
-rw-r--r--gems/click_house-client/click_house-client.gemspec24
-rw-r--r--gems/click_house-client/lib/click_house/client.rb64
-rw-r--r--gems/click_house-client/lib/click_house/client/configuration.rb68
-rw-r--r--gems/click_house-client/lib/click_house/client/database.rb32
-rw-r--r--gems/click_house-client/lib/click_house/client/formatter.rb28
-rw-r--r--gems/click_house-client/lib/click_house/client/response.rb18
-rw-r--r--gems/click_house-client/spec/click_house/client/configuration_spec.rb66
-rw-r--r--gems/click_house-client/spec/click_house/client/database_spec.rb32
-rw-r--r--gems/click_house-client/spec/click_house/client_spec.rb98
-rw-r--r--gems/click_house-client/spec/fixtures/query_result.json53
-rw-r--r--gems/click_house-client/spec/spec_helper.rb15
-rw-r--r--gems/config/rubocop.yml98
-rw-r--r--gems/gem.gitlab-ci.yml66
-rw-r--r--gems/gitlab-rspec/.gitignore11
-rw-r--r--gems/gitlab-rspec/.gitlab-ci.yml4
-rw-r--r--gems/gitlab-rspec/.rspec3
-rw-r--r--gems/gitlab-rspec/.rubocop.yml10
-rw-r--r--gems/gitlab-rspec/Gemfile5
-rw-r--r--gems/gitlab-rspec/Gemfile.lock182
-rw-r--r--gems/gitlab-rspec/gitlab-rspec.gemspec31
-rw-r--r--gems/gitlab-rspec/lib/gitlab/rspec.rb9
-rw-r--r--gems/gitlab-rspec/lib/gitlab/rspec/all.rb8
-rw-r--r--gems/gitlab-rspec/lib/gitlab/rspec/configurations/time_travel.rb32
-rw-r--r--gems/gitlab-rspec/lib/gitlab/rspec/stub_env.rb52
-rw-r--r--gems/gitlab-rspec/lib/gitlab/rspec/version.rb9
-rw-r--r--gems/gitlab-rspec/spec/gitlab/rspec/time_travel_spec.rb28
-rw-r--r--gems/gitlab-rspec/spec/spec_helper.rb15
-rw-r--r--gems/gitlab-schema-validation/.gitignore11
-rw-r--r--gems/gitlab-schema-validation/.gitlab-ci.yml4
-rw-r--r--gems/gitlab-schema-validation/.rspec3
-rw-r--r--gems/gitlab-schema-validation/.rubocop.yml8
-rw-r--r--gems/gitlab-schema-validation/Gemfile6
-rw-r--r--gems/gitlab-schema-validation/Gemfile.lock137
-rw-r--r--gems/gitlab-schema-validation/gitlab-schema-validation.gemspec32
-rw-r--r--gems/gitlab-schema-validation/lib/gitlab/schema/validation.rb66
-rw-r--r--gems/gitlab-schema-validation/lib/gitlab/schema/validation/adapters/column_database_adapter.rb47
-rw-r--r--gems/gitlab-schema-validation/lib/gitlab/schema/validation/adapters/column_structure_sql_adapter.rb139
-rw-r--r--gems/gitlab-schema-validation/lib/gitlab/schema/validation/adapters/foreign_key_database_adapter.rb31
-rw-r--r--gems/gitlab-schema-validation/lib/gitlab/schema/validation/adapters/foreign_key_structure_sql_adapter.rb50
-rw-r--r--gems/gitlab-schema-validation/lib/gitlab/schema/validation/inconsistency.rb67
-rw-r--r--gems/gitlab-schema-validation/lib/gitlab/schema/validation/pg_types.rb73
-rw-r--r--gems/gitlab-schema-validation/lib/gitlab/schema/validation/schema_objects/base.rb31
-rw-r--r--gems/gitlab-schema-validation/lib/gitlab/schema/validation/schema_objects/column.rb33
-rw-r--r--gems/gitlab-schema-validation/lib/gitlab/schema/validation/schema_objects/foreign_key.rb34
-rw-r--r--gems/gitlab-schema-validation/lib/gitlab/schema/validation/schema_objects/index.rb15
-rw-r--r--gems/gitlab-schema-validation/lib/gitlab/schema/validation/schema_objects/table.rb44
-rw-r--r--gems/gitlab-schema-validation/lib/gitlab/schema/validation/schema_objects/trigger.rb15
-rw-r--r--gems/gitlab-schema-validation/lib/gitlab/schema/validation/sources/database.rb192
-rw-r--r--gems/gitlab-schema-validation/lib/gitlab/schema/validation/sources/structure_sql.rb143
-rw-r--r--gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/base.rb49
-rw-r--r--gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/different_definition_foreign_keys.rb24
-rw-r--r--gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/different_definition_indexes.rb24
-rw-r--r--gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/different_definition_tables.rb50
-rw-r--r--gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/different_definition_triggers.rb24
-rw-r--r--gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/extra_foreign_keys.rb21
-rw-r--r--gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/extra_indexes.rb21
-rw-r--r--gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/extra_table_columns.rb32
-rw-r--r--gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/extra_tables.rb21
-rw-r--r--gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/extra_triggers.rb21
-rw-r--r--gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/missing_foreign_keys.rb21
-rw-r--r--gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/missing_indexes.rb21
-rw-r--r--gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/missing_table_columns.rb32
-rw-r--r--gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/missing_tables.rb21
-rw-r--r--gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/missing_triggers.rb21
-rw-r--r--gems/gitlab-schema-validation/lib/gitlab/schema/validation/version.rb11
-rw-r--r--gems/gitlab-schema-validation/spec/fixtures/structure.sql108
-rw-r--r--gems/gitlab-schema-validation/spec/gitlab/schema/validation_spec.rb7
-rw-r--r--gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/adapters/column_database_adapter_spec.rb72
-rw-r--r--gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/adapters/column_structure_sql_adapter_spec.rb78
-rw-r--r--gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/adapters/foreign_key_database_adapter_spec.rb28
-rw-r--r--gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/adapters/foreign_key_structure_sql_adapter_spec.rb42
-rw-r--r--gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/inconsistency_spec.rb96
-rw-r--r--gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/schema_objects/column_spec.rb25
-rw-r--r--gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/schema_objects/foreign_key_spec.rb25
-rw-r--r--gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/schema_objects/index_spec.rb11
-rw-r--r--gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/schema_objects/table_spec.rb45
-rw-r--r--gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/schema_objects/trigger_spec.rb11
-rw-r--r--gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/sources/structure_sql_spec.rb66
-rw-r--r--gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/base_spec.rb39
-rw-r--r--gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/different_definition_indexes_spec.rb7
-rw-r--r--gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/different_definition_tables_spec.rb7
-rw-r--r--gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/different_definition_triggers_spec.rb8
-rw-r--r--gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/extra_foreign_keys_spec.rb7
-rw-r--r--gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/extra_indexes_spec.rb7
-rw-r--r--gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/extra_table_columns_spec.rb7
-rw-r--r--gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/extra_tables_spec.rb7
-rw-r--r--gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/extra_triggers_spec.rb7
-rw-r--r--gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/missing_foreign_keys_spec.rb7
-rw-r--r--gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/missing_indexes_spec.rb14
-rw-r--r--gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/missing_table_columns_spec.rb7
-rw-r--r--gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/missing_tables_spec.rb9
-rw-r--r--gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/missing_triggers_spec.rb9
-rw-r--r--gems/gitlab-schema-validation/spec/spec_helper.rb18
-rw-r--r--gems/gitlab-schema-validation/spec/support/shared_examples/foreign_key_validators_shared_examples.rb46
-rw-r--r--gems/gitlab-schema-validation/spec/support/shared_examples/index_validators_shared_examples.rb32
-rw-r--r--gems/gitlab-schema-validation/spec/support/shared_examples/schema_objects_shared_examples.rb26
-rw-r--r--gems/gitlab-schema-validation/spec/support/shared_examples/table_validators_shared_examples.rb81
-rw-r--r--gems/gitlab-schema-validation/spec/support/shared_examples/trigger_validators_shared_examples.rb31
-rw-r--r--gems/gitlab-utils/.gitignore11
-rw-r--r--gems/gitlab-utils/.gitlab-ci.yml4
-rw-r--r--gems/gitlab-utils/.rspec3
-rw-r--r--gems/gitlab-utils/.rubocop.yml27
-rw-r--r--gems/gitlab-utils/Gemfile10
-rw-r--r--gems/gitlab-utils/Gemfile.lock199
-rw-r--r--gems/gitlab-utils/README.md8
-rw-r--r--gems/gitlab-utils/Rakefile12
-rw-r--r--gems/gitlab-utils/gitlab-utils.gemspec35
-rw-r--r--gems/gitlab-utils/lib/gitlab/utils.rb263
-rw-r--r--gems/gitlab-utils/lib/gitlab/utils/all.rb6
-rw-r--r--gems/gitlab-utils/lib/gitlab/utils/strong_memoize.rb (renamed from lib/gitlab/utils/strong_memoize.rb)0
-rw-r--r--gems/gitlab-utils/lib/gitlab/utils/version.rb9
-rw-r--r--gems/gitlab-utils/lib/gitlab/version_info.rb101
-rw-r--r--gems/gitlab-utils/spec/gitlab/utils/strong_memoize_spec.rb368
-rw-r--r--gems/gitlab-utils/spec/gitlab/utils_spec.rb479
-rw-r--r--gems/gitlab-utils/spec/gitlab/version_info_spec.rb193
-rw-r--r--gems/gitlab-utils/spec/spec_helper.rb23
-rw-r--r--gems/ipynbdiff/.gitignore3
-rw-r--r--gems/ipynbdiff/.gitlab-ci.yml4
-rw-r--r--gems/ipynbdiff/.rubocop.yml21
-rw-r--r--gems/ipynbdiff/Gemfile (renamed from vendor/gems/ipynbdiff/Gemfile)0
-rw-r--r--gems/ipynbdiff/Gemfile.lock139
-rw-r--r--gems/ipynbdiff/LICENSE (renamed from vendor/gems/ipynbdiff/LICENSE)0
-rw-r--r--gems/ipynbdiff/README.md (renamed from vendor/gems/ipynbdiff/README.md)0
-rw-r--r--gems/ipynbdiff/ipynbdiff.gemspec33
-rw-r--r--gems/ipynbdiff/lib/ipynb_diff.rb24
-rw-r--r--gems/ipynbdiff/lib/ipynb_diff/diff.rb (renamed from vendor/gems/ipynbdiff/lib/diff.rb)0
-rw-r--r--gems/ipynbdiff/lib/ipynb_diff/output_transformer.rb73
-rw-r--r--gems/ipynbdiff/lib/ipynb_diff/symbol_map.rb109
-rw-r--r--gems/ipynbdiff/lib/ipynb_diff/symbolized_markdown_helper.rb25
-rw-r--r--gems/ipynbdiff/lib/ipynb_diff/transformed_notebook.rb (renamed from vendor/gems/ipynbdiff/lib/transformed_notebook.rb)0
-rw-r--r--gems/ipynbdiff/lib/ipynb_diff/transformer.rb111
-rw-r--r--gems/ipynbdiff/lib/ipynb_diff/version.rb7
-rw-r--r--gems/ipynbdiff/spec/benchmark.rb68
-rw-r--r--gems/ipynbdiff/spec/ipynb_diff/symbol_map_spec.rb55
-rw-r--r--gems/ipynbdiff/spec/ipynb_diff/transformer_spec.rb94
-rw-r--r--gems/ipynbdiff/spec/ipynb_diff_spec.rb127
-rw-r--r--gems/ipynbdiff/spec/test_helper.rb46
-rw-r--r--gems/ipynbdiff/spec/testdata/backslash_as_last_char/expected.md (renamed from vendor/gems/ipynbdiff/spec/testdata/backslash_as_last_char/expected.md)0
-rw-r--r--gems/ipynbdiff/spec/testdata/backslash_as_last_char/expected_symbols.txt (renamed from vendor/gems/ipynbdiff/spec/testdata/backslash_as_last_char/expected_symbols.txt)0
-rw-r--r--gems/ipynbdiff/spec/testdata/backslash_as_last_char/input.ipynb (renamed from vendor/gems/ipynbdiff/spec/testdata/backslash_as_last_char/input.ipynb)0
-rw-r--r--gems/ipynbdiff/spec/testdata/error_output/expected.md (renamed from vendor/gems/ipynbdiff/spec/testdata/error_output/expected.md)0
-rw-r--r--gems/ipynbdiff/spec/testdata/error_output/expected_symbols.txt (renamed from vendor/gems/ipynbdiff/spec/testdata/error_output/expected_symbols.txt)0
-rw-r--r--gems/ipynbdiff/spec/testdata/error_output/input.ipynb (renamed from vendor/gems/ipynbdiff/spec/testdata/error_output/input.ipynb)0
-rw-r--r--gems/ipynbdiff/spec/testdata/from.ipynb (renamed from vendor/gems/ipynbdiff/spec/testdata/from.ipynb)0
-rw-r--r--gems/ipynbdiff/spec/testdata/hide_images/expected.md (renamed from vendor/gems/ipynbdiff/spec/testdata/hide_images/expected.md)0
-rw-r--r--gems/ipynbdiff/spec/testdata/hide_images/expected_symbols.txt (renamed from vendor/gems/ipynbdiff/spec/testdata/hide_images/expected_symbols.txt)0
-rw-r--r--gems/ipynbdiff/spec/testdata/hide_images/input.ipynb (renamed from vendor/gems/ipynbdiff/spec/testdata/hide_images/input.ipynb)0
-rw-r--r--gems/ipynbdiff/spec/testdata/ignore_html_output/expected.md (renamed from vendor/gems/ipynbdiff/spec/testdata/ignore_html_output/expected.md)0
-rw-r--r--gems/ipynbdiff/spec/testdata/ignore_html_output/expected_symbols.txt (renamed from vendor/gems/ipynbdiff/spec/testdata/ignore_html_output/expected_symbols.txt)0
-rw-r--r--gems/ipynbdiff/spec/testdata/ignore_html_output/input.ipynb (renamed from vendor/gems/ipynbdiff/spec/testdata/ignore_html_output/input.ipynb)0
-rw-r--r--gems/ipynbdiff/spec/testdata/latex_output/expected.md (renamed from vendor/gems/ipynbdiff/spec/testdata/latex_output/expected.md)0
-rw-r--r--gems/ipynbdiff/spec/testdata/latex_output/expected_symbols.txt (renamed from vendor/gems/ipynbdiff/spec/testdata/latex_output/expected_symbols.txt)0
-rw-r--r--gems/ipynbdiff/spec/testdata/latex_output/input.ipynb (renamed from vendor/gems/ipynbdiff/spec/testdata/latex_output/input.ipynb)0
-rw-r--r--gems/ipynbdiff/spec/testdata/multiline_png_output/expected.md (renamed from vendor/gems/ipynbdiff/spec/testdata/multiline_png_output/expected.md)0
-rw-r--r--gems/ipynbdiff/spec/testdata/multiline_png_output/expected_symbols.txt (renamed from vendor/gems/ipynbdiff/spec/testdata/multiline_png_output/expected_symbols.txt)0
-rw-r--r--gems/ipynbdiff/spec/testdata/multiline_png_output/input.ipynb (renamed from vendor/gems/ipynbdiff/spec/testdata/multiline_png_output/input.ipynb)0
-rw-r--r--gems/ipynbdiff/spec/testdata/no_cells/expected.md (renamed from vendor/gems/ipynbdiff/spec/testdata/no_cells/expected.md)0
-rw-r--r--gems/ipynbdiff/spec/testdata/no_cells/expected_symbols.txt (renamed from vendor/gems/ipynbdiff/spec/testdata/no_cells/expected_symbols.txt)0
-rw-r--r--gems/ipynbdiff/spec/testdata/no_cells/input.ipynb (renamed from vendor/gems/ipynbdiff/spec/testdata/no_cells/input.ipynb)0
-rw-r--r--gems/ipynbdiff/spec/testdata/no_cells_no_metadata/expected.md (renamed from vendor/gems/ipynbdiff/spec/testdata/no_cells_no_metadata/expected.md)0
-rw-r--r--gems/ipynbdiff/spec/testdata/no_cells_no_metadata/expected_symbols.txt (renamed from vendor/gems/ipynbdiff/spec/testdata/no_cells_no_metadata/expected_symbols.txt)0
-rw-r--r--gems/ipynbdiff/spec/testdata/no_cells_no_metadata/input.ipynb (renamed from vendor/gems/ipynbdiff/spec/testdata/no_cells_no_metadata/input.ipynb)0
-rw-r--r--gems/ipynbdiff/spec/testdata/no_metadata_on_cell/expected.md (renamed from vendor/gems/ipynbdiff/spec/testdata/no_metadata_on_cell/expected.md)0
-rw-r--r--gems/ipynbdiff/spec/testdata/no_metadata_on_cell/expected_symbols.txt (renamed from vendor/gems/ipynbdiff/spec/testdata/no_metadata_on_cell/expected_symbols.txt)0
-rw-r--r--gems/ipynbdiff/spec/testdata/no_metadata_on_cell/input.ipynb (renamed from vendor/gems/ipynbdiff/spec/testdata/no_metadata_on_cell/input.ipynb)0
-rw-r--r--gems/ipynbdiff/spec/testdata/only_code/expected.md (renamed from vendor/gems/ipynbdiff/spec/testdata/only_code/expected.md)0
-rw-r--r--gems/ipynbdiff/spec/testdata/only_code/expected_symbols.txt (renamed from vendor/gems/ipynbdiff/spec/testdata/only_code/expected_symbols.txt)0
-rw-r--r--gems/ipynbdiff/spec/testdata/only_code/input.ipynb (renamed from vendor/gems/ipynbdiff/spec/testdata/only_code/input.ipynb)0
-rw-r--r--gems/ipynbdiff/spec/testdata/only_code_no_kernelspec/expected.md (renamed from vendor/gems/ipynbdiff/spec/testdata/only_code_no_kernelspec/expected.md)0
-rw-r--r--gems/ipynbdiff/spec/testdata/only_code_no_kernelspec/expected_symbols.txt (renamed from vendor/gems/ipynbdiff/spec/testdata/only_code_no_kernelspec/expected_symbols.txt)0
-rw-r--r--gems/ipynbdiff/spec/testdata/only_code_no_kernelspec/input.ipynb (renamed from vendor/gems/ipynbdiff/spec/testdata/only_code_no_kernelspec/input.ipynb)0
-rw-r--r--gems/ipynbdiff/spec/testdata/only_code_no_language/expected.md (renamed from vendor/gems/ipynbdiff/spec/testdata/only_code_no_language/expected.md)0
-rw-r--r--gems/ipynbdiff/spec/testdata/only_code_no_language/expected_symbols.txt (renamed from vendor/gems/ipynbdiff/spec/testdata/only_code_no_language/expected_symbols.txt)0
-rw-r--r--gems/ipynbdiff/spec/testdata/only_code_no_language/input.ipynb (renamed from vendor/gems/ipynbdiff/spec/testdata/only_code_no_language/input.ipynb)0
-rw-r--r--gems/ipynbdiff/spec/testdata/only_code_no_metadata/expected.md (renamed from vendor/gems/ipynbdiff/spec/testdata/only_code_no_metadata/expected.md)0
-rw-r--r--gems/ipynbdiff/spec/testdata/only_code_no_metadata/expected_symbols.txt (renamed from vendor/gems/ipynbdiff/spec/testdata/only_code_no_metadata/expected_symbols.txt)0
-rw-r--r--gems/ipynbdiff/spec/testdata/only_code_no_metadata/input.ipynb (renamed from vendor/gems/ipynbdiff/spec/testdata/only_code_no_metadata/input.ipynb)0
-rw-r--r--gems/ipynbdiff/spec/testdata/only_md/expected.md (renamed from vendor/gems/ipynbdiff/spec/testdata/only_md/expected.md)0
-rw-r--r--gems/ipynbdiff/spec/testdata/only_md/expected_symbols.txt (renamed from vendor/gems/ipynbdiff/spec/testdata/only_md/expected_symbols.txt)0
-rw-r--r--gems/ipynbdiff/spec/testdata/only_md/input.ipynb (renamed from vendor/gems/ipynbdiff/spec/testdata/only_md/input.ipynb)0
-rw-r--r--gems/ipynbdiff/spec/testdata/only_raw/expected.md (renamed from vendor/gems/ipynbdiff/spec/testdata/only_raw/expected.md)0
-rw-r--r--gems/ipynbdiff/spec/testdata/only_raw/expected_symbols.txt (renamed from vendor/gems/ipynbdiff/spec/testdata/only_raw/expected_symbols.txt)0
-rw-r--r--gems/ipynbdiff/spec/testdata/only_raw/input.ipynb (renamed from vendor/gems/ipynbdiff/spec/testdata/only_raw/input.ipynb)0
-rw-r--r--gems/ipynbdiff/spec/testdata/percent_decorator/expected.md (renamed from vendor/gems/ipynbdiff/spec/testdata/percent_decorator/expected.md)0
-rw-r--r--gems/ipynbdiff/spec/testdata/percent_decorator/expected_symbols.txt (renamed from vendor/gems/ipynbdiff/spec/testdata/percent_decorator/expected_symbols.txt)0
-rw-r--r--gems/ipynbdiff/spec/testdata/single_line_md/expected.md (renamed from vendor/gems/ipynbdiff/spec/testdata/single_line_md/expected.md)0
-rw-r--r--gems/ipynbdiff/spec/testdata/single_line_md/expected_symbols.txt (renamed from vendor/gems/ipynbdiff/spec/testdata/single_line_md/expected_symbols.txt)0
-rw-r--r--gems/ipynbdiff/spec/testdata/single_line_md/input.ipynb (renamed from vendor/gems/ipynbdiff/spec/testdata/single_line_md/input.ipynb)0
-rw-r--r--gems/ipynbdiff/spec/testdata/source_with_linebreak/expected.md (renamed from vendor/gems/ipynbdiff/spec/testdata/source_with_linebreak/expected.md)0
-rw-r--r--gems/ipynbdiff/spec/testdata/source_with_linebreak/expected_symbols.txt (renamed from vendor/gems/ipynbdiff/spec/testdata/source_with_linebreak/expected_symbols.txt)0
-rw-r--r--gems/ipynbdiff/spec/testdata/source_with_linebreak/input.ipynb (renamed from vendor/gems/ipynbdiff/spec/testdata/source_with_linebreak/input.ipynb)0
-rw-r--r--gems/ipynbdiff/spec/testdata/stream_text/expected.md (renamed from vendor/gems/ipynbdiff/spec/testdata/stream_text/expected.md)0
-rw-r--r--gems/ipynbdiff/spec/testdata/stream_text/expected_symbols.txt (renamed from vendor/gems/ipynbdiff/spec/testdata/stream_text/expected_symbols.txt)0
-rw-r--r--gems/ipynbdiff/spec/testdata/stream_text/input.ipynb (renamed from vendor/gems/ipynbdiff/spec/testdata/stream_text/input.ipynb)0
-rw-r--r--gems/ipynbdiff/spec/testdata/svg/expected.md (renamed from vendor/gems/ipynbdiff/spec/testdata/svg/expected.md)0
-rw-r--r--gems/ipynbdiff/spec/testdata/svg/expected_symbols.txt (renamed from vendor/gems/ipynbdiff/spec/testdata/svg/expected_symbols.txt)0
-rw-r--r--gems/ipynbdiff/spec/testdata/svg/input.ipynb (renamed from vendor/gems/ipynbdiff/spec/testdata/svg/input.ipynb)0
-rw-r--r--gems/ipynbdiff/spec/testdata/text_output/expected.md (renamed from vendor/gems/ipynbdiff/spec/testdata/text_output/expected.md)0
-rw-r--r--gems/ipynbdiff/spec/testdata/text_output/expected_symbols.txt (renamed from vendor/gems/ipynbdiff/spec/testdata/text_output/expected_symbols.txt)0
-rw-r--r--gems/ipynbdiff/spec/testdata/text_output/input.ipynb (renamed from vendor/gems/ipynbdiff/spec/testdata/text_output/input.ipynb)0
-rw-r--r--gems/ipynbdiff/spec/testdata/text_png_output/expected.md (renamed from vendor/gems/ipynbdiff/spec/testdata/text_png_output/expected.md)0
-rw-r--r--gems/ipynbdiff/spec/testdata/text_png_output/expected_line_numbers.txt (renamed from vendor/gems/ipynbdiff/spec/testdata/text_png_output/expected_line_numbers.txt)0
-rw-r--r--gems/ipynbdiff/spec/testdata/text_png_output/expected_symbols.txt (renamed from vendor/gems/ipynbdiff/spec/testdata/text_png_output/expected_symbols.txt)0
-rw-r--r--gems/ipynbdiff/spec/testdata/text_png_output/input.ipynb (renamed from vendor/gems/ipynbdiff/spec/testdata/text_png_output/input.ipynb)0
-rw-r--r--gems/ipynbdiff/spec/testdata/to.ipynb (renamed from vendor/gems/ipynbdiff/spec/testdata/to.ipynb)0
-rw-r--r--gems/ipynbdiff/spec/testdata/unknown_output_type/expected.md (renamed from vendor/gems/ipynbdiff/spec/testdata/unknown_output_type/expected.md)0
-rw-r--r--gems/ipynbdiff/spec/testdata/unknown_output_type/expected_symbols.txt (renamed from vendor/gems/ipynbdiff/spec/testdata/unknown_output_type/expected_symbols.txt)0
-rw-r--r--gems/ipynbdiff/spec/testdata/unknown_output_type/input.ipynb (renamed from vendor/gems/ipynbdiff/spec/testdata/unknown_output_type/input.ipynb)0
-rw-r--r--gems/rspec_flaky/.gitignore11
-rw-r--r--gems/rspec_flaky/.gitlab-ci.yml4
-rw-r--r--gems/rspec_flaky/.rspec3
-rw-r--r--gems/rspec_flaky/.rubocop.yml13
-rw-r--r--gems/rspec_flaky/Gemfile8
-rw-r--r--gems/rspec_flaky/Gemfile.lock126
-rw-r--r--gems/rspec_flaky/lib/rspec_flaky.rb6
-rw-r--r--gems/rspec_flaky/lib/rspec_flaky/config.rb21
-rw-r--r--gems/rspec_flaky/lib/rspec_flaky/example.rb68
-rw-r--r--gems/rspec_flaky/lib/rspec_flaky/flaky_example.rb59
-rw-r--r--gems/rspec_flaky/lib/rspec_flaky/flaky_examples_collection.rb34
-rw-r--r--gems/rspec_flaky/lib/rspec_flaky/listener.rb70
-rw-r--r--gems/rspec_flaky/lib/rspec_flaky/report.rb59
-rw-r--r--gems/rspec_flaky/lib/rspec_flaky/version.rb7
-rw-r--r--gems/rspec_flaky/rspec_flaky.gemspec30
-rw-r--r--gems/rspec_flaky/spec/rspec_flaky/config_spec.rb99
-rw-r--r--gems/rspec_flaky/spec/rspec_flaky/example_spec.rb99
-rw-r--r--gems/rspec_flaky/spec/rspec_flaky/flaky_example_spec.rb144
-rw-r--r--gems/rspec_flaky/spec/rspec_flaky/flaky_examples_collection_spec.rb87
-rw-r--r--gems/rspec_flaky/spec/rspec_flaky/listener_spec.rb229
-rw-r--r--gems/rspec_flaky/spec/rspec_flaky/report_spec.rb141
-rw-r--r--gems/rspec_flaky/spec/spec_helper.rb17
-rw-r--r--generator_templates/active_record/migration/create_table_migration.rb.tt (renamed from generator_templates/active_record/migration/create_table_migration.rb)0
-rw-r--r--generator_templates/active_record/migration/migration.rb.tt (renamed from generator_templates/active_record/migration/migration.rb)0
-rw-r--r--generator_templates/gitlab_internal_events/metric_definition.yml2
-rw-r--r--generator_templates/post_deployment_migration/post_deployment_migration/migration.rb.tt (renamed from generator_templates/post_deployment_migration/post_deployment_migration/migration.rb)0
-rw-r--r--glfm_specification/output_example_snapshots/html.yml1494
-rw-r--r--glfm_specification/output_spec/spec.html4
-rw-r--r--jest.config.base.js1
-rw-r--r--lefthook.yml17
-rw-r--r--lib/api/api.rb1
-rw-r--r--lib/api/award_emoji.rb4
-rw-r--r--lib/api/badges.rb4
-rw-r--r--lib/api/ci/pipeline_schedules.rb44
-rw-r--r--lib/api/ci/variables.rb2
-rw-r--r--lib/api/concerns/packages/debian_package_endpoints.rb19
-rw-r--r--lib/api/concerns/packages/npm_endpoints.rb29
-rw-r--r--lib/api/debian_project_packages.rb2
-rw-r--r--lib/api/deployments.rb9
-rw-r--r--lib/api/entities/blob.rb7
-rw-r--r--lib/api/entities/bulk_imports/export_batch_status.rb15
-rw-r--r--lib/api/entities/bulk_imports/export_status.rb4
-rw-r--r--lib/api/entities/ci/runner.rb1
-rw-r--r--lib/api/entities/ci/variable.rb2
-rw-r--r--lib/api/entities/dictionary/table.rb2
-rw-r--r--lib/api/entities/group.rb1
-rw-r--r--lib/api/entities/plan_limit.rb5
-rw-r--r--lib/api/entities/project_hook.rb1
-rw-r--r--lib/api/entities/protected_ref_access.rb7
-rw-r--r--lib/api/environments.rb8
-rw-r--r--lib/api/files.rb15
-rw-r--r--lib/api/group_export.rb45
-rw-r--r--lib/api/group_variables.rb3
-rw-r--r--lib/api/helpers.rb13
-rw-r--r--lib/api/helpers/custom_attributes.rb2
-rw-r--r--lib/api/helpers/integrations_helpers.rb58
-rw-r--r--lib/api/helpers/members_helpers.rb1
-rw-r--r--lib/api/helpers/packages/maven.rb22
-rw-r--r--lib/api/helpers/packages/npm.rb27
-rw-r--r--lib/api/helpers/projects_helpers.rb7
-rw-r--r--lib/api/helpers/remote_mirrors_helpers.rb2
-rw-r--r--lib/api/import_github.rb10
-rw-r--r--lib/api/internal/kubernetes.rb37
-rw-r--r--lib/api/lint.rb28
-rw-r--r--lib/api/markdown.rb5
-rw-r--r--lib/api/maven_packages.rb6
-rw-r--r--lib/api/merge_requests.rb14
-rw-r--r--lib/api/ml_model_packages.rb37
-rw-r--r--lib/api/npm_instance_packages.rb4
-rw-r--r--lib/api/npm_project_packages.rb5
-rw-r--r--lib/api/package_files.rb3
-rw-r--r--lib/api/project_export.rb50
-rw-r--r--lib/api/project_hooks.rb1
-rw-r--r--lib/api/project_packages.rb3
-rw-r--r--lib/api/projects.rb23
-rw-r--r--lib/api/remote_mirrors.rb4
-rw-r--r--lib/api/search.rb10
-rw-r--r--lib/api/settings.rb7
-rw-r--r--lib/api/usage_data.rb32
-rw-r--r--lib/api/user_runners.rb72
-rw-r--r--lib/api/users.rb61
-rw-r--r--lib/atlassian/jira_connect/serializers/build_entity.rb20
-rw-r--r--lib/atlassian/jira_connect/serializers/deployment_entity.rb46
-rw-r--r--lib/backup/database.rb4
-rw-r--r--lib/backup/repositories.rb7
-rw-r--r--lib/banzai/filter/references/external_issue_reference_filter.rb11
-rw-r--r--lib/banzai/filter/references/reference_filter.rb3
-rw-r--r--lib/banzai/filter/references/user_reference_filter.rb11
-rw-r--r--lib/banzai/pipeline/single_line_pipeline.rb1
-rw-r--r--lib/banzai/reference_parser/user_parser.rb9
-rw-r--r--lib/bulk_imports/common/extractors/ndjson_extractor.rb2
-rw-r--r--lib/bulk_imports/common/pipelines/lfs_objects_pipeline.rb4
-rw-r--r--lib/bulk_imports/common/pipelines/uploads_pipeline.rb4
-rw-r--r--lib/container_registry/client.rb2
-rw-r--r--lib/container_registry/gitlab_api_client.rb2
-rw-r--r--lib/expand_variables.rb53
-rw-r--r--lib/extracts_ref.rb2
-rw-r--r--lib/extracts_ref/requested_ref.rb61
-rw-r--r--lib/generators/batched_background_migration/batched_background_migration_generator.rb46
-rw-r--r--lib/generators/batched_background_migration/templates/ee_batched_background_migration_job.template29
-rw-r--r--lib/generators/batched_background_migration/templates/foss_batched_background_migration_job.template14
-rw-r--r--lib/generators/gitlab/analytics/internal_events_generator.rb10
-rw-r--r--lib/gitlab/access/branch_protection.rb57
-rw-r--r--lib/gitlab/alert_management/payload/base.rb1
-rw-r--r--lib/gitlab/alert_management/payload/managed_prometheus.rb12
-rw-r--r--lib/gitlab/alert_management/payload/prometheus.rb35
-rw-r--r--lib/gitlab/application_context.rb18
-rw-r--r--lib/gitlab/auth.rb12
-rw-r--r--lib/gitlab/auth/auth_finders.rb35
-rw-r--r--lib/gitlab/auth/ldap/config.rb2
-rw-r--r--lib/gitlab/background_migration/.rubocop.yml5
-rw-r--r--lib/gitlab/background_migration/backfill_missing_ci_cd_settings.rb39
-rw-r--r--lib/gitlab/background_migration/backfill_uuid_conversion_column_in_vulnerability_occurrences.rb21
-rw-r--r--lib/gitlab/background_migration/redis/backfill_project_pipeline_status_ttl.rb33
-rw-r--r--lib/gitlab/cache/ci/project_pipeline_status.rb9
-rw-r--r--lib/gitlab/cache/client.rb43
-rw-r--r--lib/gitlab/cache/metadata.rb12
-rw-r--r--lib/gitlab/cache/metrics.rb24
-rw-r--r--lib/gitlab/checks/changes_access.rb1
-rw-r--r--lib/gitlab/checks/diff_check.rb2
-rw-r--r--lib/gitlab/checks/file_size_check/allow_existing_oversized_blobs.rb38
-rw-r--r--lib/gitlab/checks/file_size_check/any_oversized_blobs.rb27
-rw-r--r--lib/gitlab/checks/global_file_size_check.rb29
-rw-r--r--lib/gitlab/ci/artifact_file_reader.rb3
-rw-r--r--lib/gitlab/ci/build/rules.rb11
-rw-r--r--lib/gitlab/ci/components/instance_path.rb4
-rw-r--r--lib/gitlab/ci/config/README.md178
-rw-r--r--lib/gitlab/ci/config/external/file/artifact.rb13
-rw-r--r--lib/gitlab/ci/config/external/file/base.rb42
-rw-r--r--lib/gitlab/ci/config/external/rules.rb20
-rw-r--r--lib/gitlab/ci/config/yaml.rb16
-rw-r--r--lib/gitlab/ci/config/yaml/interpolator.rb55
-rw-r--r--lib/gitlab/ci/config/yaml/loader.rb48
-rw-r--r--lib/gitlab/ci/config/yaml/result.rb5
-rw-r--r--lib/gitlab/ci/jwt_v2.rb24
-rw-r--r--lib/gitlab/ci/parsers/security/common.rb12
-rw-r--r--lib/gitlab/ci/parsers/security/validators/schema_validator.rb16
-rw-r--r--lib/gitlab/ci/parsers/security/validators/schemas/15.0.5/cluster-image-scanning-report-format.json1035
-rw-r--r--lib/gitlab/ci/parsers/security/validators/schemas/15.0.5/container-scanning-report-format.json967
-rw-r--r--lib/gitlab/ci/parsers/security/validators/schemas/15.0.5/coverage-fuzzing-report-format.json925
-rw-r--r--lib/gitlab/ci/parsers/security/validators/schemas/15.0.5/dast-report-format.json1330
-rw-r--r--lib/gitlab/ci/parsers/security/validators/schemas/15.0.5/dependency-scanning-report-format.json1033
-rw-r--r--lib/gitlab/ci/parsers/security/validators/schemas/15.0.5/sast-report-format.json920
-rw-r--r--lib/gitlab/ci/parsers/security/validators/schemas/15.0.5/secret-detection-report-format.json944
-rw-r--r--lib/gitlab/ci/pipeline/chain/validate/abilities.rb6
-rw-r--r--lib/gitlab/ci/project_config/bridge.rb5
-rw-r--r--lib/gitlab/ci/project_config/repository.rb2
-rw-r--r--lib/gitlab/ci/project_config/source.rb1
-rw-r--r--lib/gitlab/ci/reports/sbom/source.rb16
-rw-r--r--lib/gitlab/ci/reports/security/link.rb4
-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/Deploy.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Jobs/Deploy.latest.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Terraform/Base.gitlab-ci.yml10
-rw-r--r--lib/gitlab/ci/templates/Terraform/Base.latest.gitlab-ci.yml10
-rw-r--r--lib/gitlab/ci/templates/npm.gitlab-ci.yml8
-rw-r--r--lib/gitlab/ci/variables/collection.rb15
-rw-r--r--lib/gitlab/ci/variables/collection/item.rb4
-rw-r--r--lib/gitlab/ci/variables/downstream/base.rb19
-rw-r--r--lib/gitlab/ci/variables/downstream/expandable_variable_generator.rb17
-rw-r--r--lib/gitlab/ci/variables/downstream/generator.rb73
-rw-r--r--lib/gitlab/ci/variables/downstream/raw_variable_generator.rb15
-rw-r--r--lib/gitlab/cleanup/remote_uploads.rb11
-rw-r--r--lib/gitlab/cluster/lifecycle_events.rb2
-rw-r--r--lib/gitlab/config/README.md29
-rw-r--r--lib/gitlab/data_builder/build.rb7
-rw-r--r--lib/gitlab/data_builder/emoji.rb45
-rw-r--r--lib/gitlab/data_builder/push.rb3
-rw-r--r--lib/gitlab/database.rb2
-rw-r--r--lib/gitlab/database/async_indexes/migration_helpers.rb2
-rw-r--r--lib/gitlab/database/async_indexes/postgres_async_index.rb6
-rw-r--r--lib/gitlab/database/ci_builds_partitioning.rb224
-rw-r--r--lib/gitlab/database/database_connection_info.rb2
-rw-r--r--lib/gitlab/database/each_database.rb3
-rw-r--r--lib/gitlab/database/gitlab_schema.rb31
-rw-r--r--lib/gitlab/database/load_balancing/connection_proxy.rb2
-rw-r--r--lib/gitlab/database/load_balancing/load_balancer.rb8
-rw-r--r--lib/gitlab/database/load_balancing/service_discovery.rb31
-rw-r--r--lib/gitlab/database/load_balancing/setup.rb2
-rw-r--r--lib/gitlab/database/migration_helpers.rb1
-rw-r--r--lib/gitlab/database/migration_helpers/automatic_lock_writes_on_tables.rb19
-rw-r--r--lib/gitlab/database/migrations/redis_helpers.rb17
-rw-r--r--lib/gitlab/database/migrations/runner.rb4
-rw-r--r--lib/gitlab/database/migrations/test_batched_background_runner.rb16
-rw-r--r--lib/gitlab/database/partitioning.rb4
-rw-r--r--lib/gitlab/database/postgresql_adapter/empty_query_ping.rb25
-rw-r--r--lib/gitlab/database/reindexing.rb3
-rw-r--r--lib/gitlab/database/schema_validation/adapters/column_database_adapter.rb47
-rw-r--r--lib/gitlab/database/schema_validation/adapters/column_structure_sql_adapter.rb139
-rw-r--r--lib/gitlab/database/schema_validation/adapters/foreign_key_database_adapter.rb31
-rw-r--r--lib/gitlab/database/schema_validation/adapters/foreign_key_structure_sql_adapter.rb50
-rw-r--r--lib/gitlab/database/schema_validation/database.rb166
-rw-r--r--lib/gitlab/database/schema_validation/inconsistency.rb65
-rw-r--r--lib/gitlab/database/schema_validation/pg_types.rb73
-rw-r--r--lib/gitlab/database/schema_validation/runner.rb23
-rw-r--r--lib/gitlab/database/schema_validation/schema_objects/base.rb31
-rw-r--r--lib/gitlab/database/schema_validation/schema_objects/column.rb23
-rw-r--r--lib/gitlab/database/schema_validation/schema_objects/foreign_key.rb34
-rw-r--r--lib/gitlab/database/schema_validation/schema_objects/index.rb15
-rw-r--r--lib/gitlab/database/schema_validation/schema_objects/table.rb40
-rw-r--r--lib/gitlab/database/schema_validation/schema_objects/trigger.rb15
-rw-r--r--lib/gitlab/database/schema_validation/structure_sql.rb125
-rw-r--r--lib/gitlab/database/schema_validation/track_inconsistency.rb138
-rw-r--r--lib/gitlab/database/schema_validation/validators/base_validator.rb49
-rw-r--r--lib/gitlab/database/schema_validation/validators/different_definition_foreign_keys.rb24
-rw-r--r--lib/gitlab/database/schema_validation/validators/different_definition_indexes.rb24
-rw-r--r--lib/gitlab/database/schema_validation/validators/different_definition_tables.rb50
-rw-r--r--lib/gitlab/database/schema_validation/validators/different_definition_triggers.rb24
-rw-r--r--lib/gitlab/database/schema_validation/validators/extra_foreign_keys.rb21
-rw-r--r--lib/gitlab/database/schema_validation/validators/extra_indexes.rb21
-rw-r--r--lib/gitlab/database/schema_validation/validators/extra_table_columns.rb32
-rw-r--r--lib/gitlab/database/schema_validation/validators/extra_tables.rb21
-rw-r--r--lib/gitlab/database/schema_validation/validators/extra_triggers.rb21
-rw-r--r--lib/gitlab/database/schema_validation/validators/missing_foreign_keys.rb21
-rw-r--r--lib/gitlab/database/schema_validation/validators/missing_indexes.rb21
-rw-r--r--lib/gitlab/database/schema_validation/validators/missing_table_columns.rb32
-rw-r--r--lib/gitlab/database/schema_validation/validators/missing_tables.rb21
-rw-r--r--lib/gitlab/database/schema_validation/validators/missing_triggers.rb21
-rw-r--r--lib/gitlab/database/tables_locker.rb4
-rw-r--r--lib/gitlab/discussions_diff/highlight_cache.rb6
-rw-r--r--lib/gitlab/email/handler/service_desk_handler.rb24
-rw-r--r--lib/gitlab/email/receiver.rb2
-rw-r--r--lib/gitlab/error_tracking/error_repository.rb7
-rw-r--r--lib/gitlab/error_tracking/error_repository/active_record_strategy.rb117
-rw-r--r--lib/gitlab/error_tracking/processor/grpc_error_processor.rb3
-rw-r--r--lib/gitlab/exception_log_formatter.rb14
-rw-r--r--lib/gitlab/git/base_error.rb12
-rw-r--r--lib/gitlab/git/commit.rb2
-rw-r--r--lib/gitlab/git/finders/refs_finder.rb40
-rw-r--r--lib/gitlab/git/hook_env.rb8
-rw-r--r--lib/gitlab/git/keep_around.rb9
-rw-r--r--lib/gitlab/git/repository.rb25
-rw-r--r--lib/gitlab/git/tree.rb5
-rw-r--r--lib/gitlab/gitaly_client/call.rb14
-rw-r--r--lib/gitlab/gitaly_client/commit_service.rb24
-rw-r--r--lib/gitlab/gitaly_client/operation_service.rb3
-rw-r--r--lib/gitlab/gitaly_client/repository_service.rb6
-rw-r--r--lib/gitlab/github_import.rb12
-rw-r--r--lib/gitlab/github_import/client_pool.rb39
-rw-r--r--lib/gitlab/github_import/importer/issue_importer.rb2
-rw-r--r--lib/gitlab/github_import/settings.rb14
-rw-r--r--lib/gitlab/github_import/user_finder.rb29
-rw-r--r--lib/gitlab/gon_helper.rb1
-rw-r--r--lib/gitlab/gpg/commit.rb10
-rw-r--r--lib/gitlab/grape_logging/loggers/response_logger.rb2
-rw-r--r--lib/gitlab/graphql/generic_tracing.rb71
-rw-r--r--lib/gitlab/group_search_results.rb1
-rw-r--r--lib/gitlab/hook_data/emoji_builder.rb26
-rw-r--r--lib/gitlab/i18n.rb18
-rw-r--r--lib/gitlab/import_export/group/import_export.yml9
-rw-r--r--lib/gitlab/import_export/group/relation_factory.rb1
-rw-r--r--lib/gitlab/import_export/project/import_export.yml12
-rw-r--r--lib/gitlab/import_export/project/object_builder.rb17
-rw-r--r--lib/gitlab/import_export/project/relation_factory.rb16
-rw-r--r--lib/gitlab/internal_events.rb34
-rw-r--r--lib/gitlab/internal_events/event_definitions.rb75
-rw-r--r--lib/gitlab/issues/rebalancing/state.rb36
-rw-r--r--lib/gitlab/jwt_authenticatable.rb4
-rw-r--r--lib/gitlab/kas/client.rb18
-rw-r--r--lib/gitlab/kas/user_access.rb6
-rw-r--r--lib/gitlab/lograge/custom_options.rb4
-rw-r--r--lib/gitlab/manifest_import/metadata.rb17
-rw-r--r--lib/gitlab/markdown_cache/redis/store.rb8
-rw-r--r--lib/gitlab/metrics/dashboard/stages/cluster_endpoint_inserter.rb45
-rw-r--r--lib/gitlab/metrics/dashboard/stages/grafana_formatter.rb14
-rw-r--r--lib/gitlab/metrics/dashboard/url.rb25
-rw-r--r--lib/gitlab/metrics/sidekiq_slis.rb24
-rw-r--r--lib/gitlab/nav/top_nav_menu_item.rb2
-rw-r--r--lib/gitlab/observability.rb22
-rw-r--r--lib/gitlab/pages/url_builder.rb94
-rw-r--r--lib/gitlab/pagination/keyset/in_operator_optimization/query_builder.rb2
-rw-r--r--lib/gitlab/pagination/keyset/in_operator_optimization/strategies/record_loader_strategy.rb7
-rw-r--r--lib/gitlab/pagination/keyset/order.rb5
-rw-r--r--lib/gitlab/patch/action_cable_redis_listener.rb26
-rw-r--r--lib/gitlab/patch/redis_cache_store.rb8
-rw-r--r--lib/gitlab/push_options.rb3
-rw-r--r--lib/gitlab/quick_actions/dsl.rb4
-rw-r--r--lib/gitlab/quick_actions/issuable_actions.rb6
-rw-r--r--lib/gitlab/quick_actions/issue_actions.rb1
-rw-r--r--lib/gitlab/quick_actions/issue_and_merge_request_actions.rb2
-rw-r--r--lib/gitlab/quick_actions/merge_request_actions.rb4
-rw-r--r--lib/gitlab/quick_actions/work_item_actions.rb2
-rw-r--r--lib/gitlab/redis/multi_store.rb62
-rw-r--r--lib/gitlab/regex.rb8
-rw-r--r--lib/gitlab/search/found_blob.rb5
-rw-r--r--lib/gitlab/search/found_wiki_page.rb5
-rw-r--r--lib/gitlab/search_results.rb6
-rw-r--r--lib/gitlab/seeder.rb4
-rw-r--r--lib/gitlab/seeders/ci/runner/runner_fleet_pipeline_seeder.rb5
-rw-r--r--lib/gitlab/sidekiq_logging/structured_logger.rb9
-rw-r--r--lib/gitlab/sidekiq_middleware.rb4
-rw-r--r--lib/gitlab/sidekiq_middleware/defer_jobs.rb78
-rw-r--r--lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb9
-rw-r--r--lib/gitlab/sidekiq_middleware/server_metrics.rb10
-rw-r--r--lib/gitlab/sidekiq_middleware/size_limiter/validator.rb3
-rw-r--r--lib/gitlab/sidekiq_middleware/skip_jobs.rb125
-rw-r--r--lib/gitlab/signed_commit.rb10
-rw-r--r--lib/gitlab/slash_commands/presenters/access.rb4
-rw-r--r--lib/gitlab/spamcheck/client.rb2
-rw-r--r--lib/gitlab/ssh/commit.rb2
-rw-r--r--lib/gitlab/ssh/signature.rb13
-rw-r--r--lib/gitlab/subscription_portal.rb8
-rw-r--r--lib/gitlab/task_helpers.rb2
-rw-r--r--lib/gitlab/testing/action_cable_blocker.rb40
-rw-r--r--lib/gitlab/usage/metric_definition.rb33
-rw-r--r--lib/gitlab/usage/metrics/aggregates.rb6
-rw-r--r--lib/gitlab/usage/metrics/instrumentations/batched_background_migrations_metric.rb26
-rw-r--r--lib/gitlab/usage/metrics/instrumentations/count_projects_with_jira_dvcs_integration_metric.rb23
-rw-r--r--lib/gitlab/usage/metrics/instrumentations/count_slack_app_installations_gbp_metric.rb15
-rw-r--r--lib/gitlab/usage/metrics/instrumentations/count_slack_app_installations_metric.rb15
-rw-r--r--lib/gitlab/usage/metrics/instrumentations/generic_metric.rb4
-rw-r--r--lib/gitlab/usage/metrics/instrumentations/gitaly_apdex_metric.rb19
-rw-r--r--lib/gitlab/usage/metrics/instrumentations/index_inconsistencies_metric.rb12
-rw-r--r--lib/gitlab/usage/metrics/instrumentations/ldap_encrypted_secrets_metric.rb15
-rw-r--r--lib/gitlab/usage/metrics/instrumentations/operating_system_metric.rb24
-rw-r--r--lib/gitlab/usage/metrics/instrumentations/prometheus_metric.rb28
-rw-r--r--lib/gitlab/usage/metrics/instrumentations/schema_inconsistencies_metric.rb45
-rw-r--r--lib/gitlab/usage/metrics/instrumentations/smtp_encrypted_secrets_metric.rb15
-rw-r--r--lib/gitlab/usage_data.rb53
-rw-r--r--lib/gitlab/usage_data_counters/hll_redis_counter.rb23
-rw-r--r--lib/gitlab/usage_data_counters/issue_activity_unique_counter.rb36
-rw-r--r--lib/gitlab/usage_data_counters/known_events/kubernetes_agent.yml20
-rw-r--r--lib/gitlab/usage_data_counters/kubernetes_agent_counter.rb8
-rw-r--r--lib/gitlab/usage_data_counters/merge_request_activity_unique_counter.rb6
-rw-r--r--lib/gitlab/utils.rb259
-rw-r--r--lib/gitlab/utils/override.rb2
-rw-r--r--lib/gitlab/utils/usage_data.rb2
-rw-r--r--lib/gitlab/uuid.rb9
-rw-r--r--lib/gitlab/version_info.rb98
-rw-r--r--lib/gitlab/web_hooks.rb1
-rw-r--r--lib/gitlab_settings/options.rb110
-rw-r--r--lib/result.rb209
-rw-r--r--lib/search/navigation.rb158
-rw-r--r--lib/sidebars/groups/super_sidebar_menus/analyze_menu.rb2
-rw-r--r--lib/sidebars/organizations/menus/manage_menu.rb37
-rw-r--r--lib/sidebars/organizations/menus/scope_menu.rb46
-rw-r--r--lib/sidebars/organizations/panel.rb21
-rw-r--r--lib/sidebars/organizations/super_sidebar_panel.rb33
-rw-r--r--lib/sidebars/projects/menus/deployments_menu.rb9
-rw-r--r--lib/sidebars/projects/menus/monitor_menu.rb15
-rw-r--r--lib/sidebars/projects/menus/packages_registries_menu.rb2
-rw-r--r--lib/sidebars/projects/menus/settings_menu.rb18
-rw-r--r--lib/sidebars/projects/super_sidebar_menus/analyze_menu.rb3
-rw-r--r--lib/sidebars/projects/super_sidebar_menus/deploy_menu.rb3
-rw-r--r--lib/sidebars/projects/super_sidebar_menus/monitor_menu.rb1
-rw-r--r--lib/sidebars/user_settings/menus/access_tokens_menu.rb2
-rw-r--r--lib/sidebars/user_settings/menus/account_menu.rb2
-rw-r--r--lib/sidebars/user_settings/menus/emails_menu.rb2
-rw-r--r--lib/sidebars/user_settings/menus/password_menu.rb2
-rw-r--r--lib/sidebars/user_settings/menus/ssh_keys_menu.rb2
-rw-r--r--lib/slack/manifest.rb114
-rw-r--r--lib/tasks/dev.rake4
-rw-r--r--lib/tasks/gettext.rake2
-rw-r--r--lib/tasks/gitlab/db.rake30
-rw-r--r--lib/tasks/gitlab/db/migration_fix_15_11.rake2
-rw-r--r--lib/tasks/gitlab/db/validate_config.rake5
-rw-r--r--lib/tasks/gitlab/docs/compile_deprecations.rake29
-rw-r--r--lib/tasks/gitlab/metrics_exporter.rake27
-rw-r--r--lib/tasks/gitlab/packages/events.rake69
-rw-r--r--lib/tasks/gitlab/shell.rake51
-rw-r--r--lib/tasks/gitlab/usage_data.rake15
-rw-r--r--locale/am_ET/gitlab.po1682
-rw-r--r--locale/ar_SA/gitlab.po1730
-rw-r--r--locale/as_IN/gitlab.po1682
-rw-r--r--locale/az_AZ/gitlab.po1682
-rw-r--r--locale/ba_RU/gitlab.po1670
-rw-r--r--locale/be_BY/gitlab.po1706
-rw-r--r--locale/bg/gitlab.po1682
-rw-r--r--locale/bn_BD/gitlab.po1682
-rw-r--r--locale/bn_IN/gitlab.po1682
-rw-r--r--locale/br_FR/gitlab.po1718
-rw-r--r--locale/bs_BA/gitlab.po1694
-rw-r--r--locale/ca_ES/gitlab.po1682
-rw-r--r--locale/cs_CZ/gitlab.po1706
-rw-r--r--locale/cy_GB/gitlab.po1730
-rw-r--r--locale/da_DK/gitlab.po1730
-rw-r--r--locale/de/gitlab.po2754
-rw-r--r--locale/el_GR/gitlab.po1682
-rw-r--r--locale/en_GB/gitlab.po1684
-rw-r--r--locale/eo/gitlab.po1682
-rw-r--r--locale/es/gitlab.po1730
-rw-r--r--locale/et_EE/gitlab.po1682
-rw-r--r--locale/fa_IR/gitlab.po1682
-rw-r--r--locale/fi_FI/gitlab.po1682
-rw-r--r--locale/fil_PH/gitlab.po1682
-rw-r--r--locale/fr/gitlab.po2558
-rw-r--r--locale/gitlab.pot2025
-rw-r--r--locale/gl_ES/gitlab.po1682
-rw-r--r--locale/he_IL/gitlab.po1706
-rw-r--r--locale/hi_IN/gitlab.po1682
-rw-r--r--locale/hr_HR/gitlab.po1694
-rw-r--r--locale/hu_HU/gitlab.po1682
-rw-r--r--locale/hy_AM/gitlab.po1682
-rw-r--r--locale/id_ID/gitlab.po1670
-rw-r--r--locale/ig_NG/gitlab.po1670
-rw-r--r--locale/is_IS/gitlab.po1682
-rw-r--r--locale/it/gitlab.po1682
-rw-r--r--locale/ja/gitlab.po2486
-rw-r--r--locale/ka_GE/gitlab.po1682
-rw-r--r--locale/kab/gitlab.po1682
-rw-r--r--locale/ko/gitlab.po1730
-rw-r--r--locale/ku_TR/gitlab.po1682
-rw-r--r--locale/ky_KG/gitlab.po1682
-rw-r--r--locale/lt_LT/gitlab.po1706
-rw-r--r--locale/mk_MK/gitlab.po1682
-rw-r--r--locale/ml_IN/gitlab.po1682
-rw-r--r--locale/mn_MN/gitlab.po1682
-rw-r--r--locale/ms_MY/gitlab.po1670
-rw-r--r--locale/nb_NO/gitlab.po1724
-rw-r--r--locale/nl_NL/gitlab.po1682
-rw-r--r--locale/or_IN/gitlab.po1682
-rw-r--r--locale/pa_IN/gitlab.po1682
-rw-r--r--locale/pa_PK/gitlab.po1682
-rw-r--r--locale/pl_PL/gitlab.po1708
-rw-r--r--locale/pt_BR/gitlab.po2154
-rw-r--r--locale/pt_PT/gitlab.po1688
-rw-r--r--locale/ro_RO/gitlab.po1792
-rw-r--r--locale/ru/gitlab.po1738
-rw-r--r--locale/si_LK/gitlab.po1694
-rw-r--r--locale/sk_SK/gitlab.po1706
-rw-r--r--locale/sl_SI/gitlab.po1706
-rw-r--r--locale/sq_AL/gitlab.po1682
-rw-r--r--locale/sr_CS/gitlab.po1694
-rw-r--r--locale/sr_SP/gitlab.po1694
-rw-r--r--locale/sv_SE/gitlab.po1686
-rw-r--r--locale/sw_KE/gitlab.po1682
-rw-r--r--locale/ta_IN/gitlab.po1682
-rw-r--r--locale/th_TH/gitlab.po1670
-rw-r--r--locale/tr_TR/gitlab.po1700
-rw-r--r--locale/uk/gitlab.po1970
-rw-r--r--locale/ur_PK/gitlab.po1682
-rw-r--r--locale/uz_UZ/gitlab.po1682
-rw-r--r--locale/vi_VN/gitlab.po1670
-rw-r--r--locale/zh_CN/gitlab.po1928
-rw-r--r--locale/zh_HK/gitlab.po1676
-rw-r--r--locale/zh_TW/gitlab.po1870
-rw-r--r--metrics_server/dependencies.rb4
-rw-r--r--metrics_server/metrics_server.rb47
-rw-r--r--package.json22
-rw-r--r--patches/@rails+ujs+6.1.4-7.patch16
-rw-r--r--patches/@rails+ujs+7.0.6.patch16
-rw-r--r--qa/Dockerfile3
-rw-r--r--qa/Gemfile9
-rw-r--r--qa/Gemfile.lock52
-rw-r--r--qa/gdk/Dockerfile.gdk10
-rw-r--r--qa/qa.rb3
-rw-r--r--qa/qa/fixtures/package_managers/maven/gradle/build.gradle.erb51
-rw-r--r--qa/qa/fixtures/package_managers/maven/gradle/build_install.gradle.erb27
-rw-r--r--qa/qa/fixtures/package_managers/maven/gradle/build_upload.gradle.erb27
-rw-r--r--qa/qa/fixtures/package_managers/maven/gradle/gradle_install_package.yaml.erb8
-rw-r--r--qa/qa/fixtures/package_managers/maven/gradle/gradle_upload_install_package.yaml.erb23
-rw-r--r--qa/qa/fixtures/package_managers/maven/gradle/gradle_upload_package.yaml.erb8
-rw-r--r--qa/qa/fixtures/package_managers/maven/group/consumer/request_forwarding/gitlab_ci.yaml.erb8
-rw-r--r--qa/qa/fixtures/package_managers/maven/group/consumer/request_forwarding/settings.xml.erb23
-rw-r--r--qa/qa/fixtures/package_managers/maven/project/request_forwarding/gitlab_ci.yaml.erb8
-rw-r--r--qa/qa/fixtures/package_managers/maven/project/request_forwarding/settings.xml.erb23
-rw-r--r--qa/qa/fixtures/package_managers/pypi/pypi_upload_install_package.yaml.erb2
-rw-r--r--qa/qa/flow/alert_settings.rb1
-rw-r--r--qa/qa/git/repository.rb2
-rw-r--r--qa/qa/page/base.rb11
-rw-r--r--qa/qa/page/component/confirm_modal.rb15
-rw-r--r--qa/qa/page/component/design_management.rb2
-rw-r--r--qa/qa/page/component/dropdown.rb7
-rw-r--r--qa/qa/page/component/issuable/sidebar.rb4
-rw-r--r--qa/qa/page/component/members/invite_members_modal.rb12
-rw-r--r--qa/qa/page/component/members/members_table.rb3
-rw-r--r--qa/qa/page/component/note.rb5
-rw-r--r--qa/qa/page/component/rich_text_popover.rb31
-rw-r--r--qa/qa/page/file/form.rb2
-rw-r--r--qa/qa/page/group/bulk_import.rb9
-rw-r--r--qa/qa/page/group/sub_menus/common.rb2
-rw-r--r--qa/qa/page/issuable/new.rb9
-rw-r--r--qa/qa/page/main/login.rb25
-rw-r--r--qa/qa/page/main/menu.rb37
-rw-r--r--qa/qa/page/merge_request/show.rb12
-rw-r--r--qa/qa/page/project/branches/show.rb22
-rw-r--r--qa/qa/page/project/issue/show.rb1
-rw-r--r--qa/qa/page/project/pipeline/show.rb24
-rw-r--r--qa/qa/page/project/settings/alerts.rb8
-rw-r--r--qa/qa/page/project/snippet/new.rb2
-rw-r--r--qa/qa/page/project/web_ide/edit.rb4
-rw-r--r--qa/qa/page/user/show.rb5
-rw-r--r--qa/qa/resource/base.rb3
-rw-r--r--qa/qa/resource/design.rb2
-rw-r--r--qa/qa/resource/events/project.rb8
-rw-r--r--qa/qa/resource/import_project.rb2
-rw-r--r--qa/qa/resource/issuable.rb2
-rw-r--r--qa/qa/resource/issue.rb7
-rw-r--r--qa/qa/resource/merge_request.rb7
-rw-r--r--qa/qa/resource/personal_access_token_cache.rb6
-rw-r--r--qa/qa/resource/project_imported_from_github.rb9
-rw-r--r--qa/qa/resource/repository/branch.rb52
-rw-r--r--qa/qa/runtime/application_settings.rb9
-rw-r--r--qa/qa/runtime/env.rb24
-rw-r--r--qa/qa/runtime/fixtures.rb2
-rw-r--r--qa/qa/runtime/gpg.rb2
-rw-r--r--qa/qa/runtime/path.rb16
-rw-r--r--qa/qa/scenario/test/instance/airgapped.rb2
-rw-r--r--qa/qa/scenario/test/instance/blocking.rb14
-rw-r--r--qa/qa/scenario/test/instance/non_blocking.rb15
-rw-r--r--qa/qa/scenario/test/integration/oauth.rb13
-rw-r--r--qa/qa/service/docker_run/base.rb36
-rw-r--r--qa/qa/service/docker_run/gitlab_runner.rb7
-rw-r--r--qa/qa/service/docker_run/ldap.rb2
-rw-r--r--qa/qa/service/docker_run/smocker.rb6
-rw-r--r--qa/qa/service/docker_run/video.rb50
-rw-r--r--qa/qa/service/praefect_manager.rb182
-rw-r--r--qa/qa/specs/features/api/12_systems/gitaly/praefect_dataloss_spec.rb114
-rw-r--r--qa/qa/specs/features/api/12_systems/gitaly/praefect_repo_sync_spec.rb96
-rw-r--r--qa/qa/specs/features/api/1_manage/import/import_large_github_repo_spec.rb5
-rw-r--r--qa/qa/specs/features/api/1_manage/migration/gitlab_migration_large_project_spec.rb4
-rw-r--r--qa/qa/specs/features/api/1_manage/migration/gitlab_migration_mr_spec.rb6
-rw-r--r--qa/qa/specs/features/api/1_manage/migration/gitlab_migration_project_spec.rb2
-rw-r--r--qa/qa/specs/features/api/1_manage/migration/gitlab_migration_release_spec.rb8
-rw-r--r--qa/qa/specs/features/api/1_manage/rate_limits_spec.rb2
-rw-r--r--qa/qa/specs/features/api/3_create/repository/add_list_delete_branches_spec.rb77
-rw-r--r--qa/qa/specs/features/api/5_package/container_registry/saas/container_registry_spec.rb24
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/login/oauth_login_with_facebook_spec.rb18
-rw-r--r--qa/qa/specs/features/browser_ui/2_plan/design_management/add_design_content_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb6
-rw-r--r--qa/qa/specs/features/browser_ui/2_plan/issue/create_issue_spec.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/2_plan/milestone/create_group_milestone_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/2_plan/pages/new_static_page_spec.rb9
-rw-r--r--qa/qa/specs/features/browser_ui/2_plan/project_wiki/project_based_file_upload_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/merge_request/suggestions/batch_suggestion_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/merge_request/suggestions/custom_commit_suggestion_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/repository/add_list_delete_branches_spec.rb99
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/repository/add_new_branch_rule_spec.rb6
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/repository/license_detection_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/web_ide_old/server_hooks_custom_error_message_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/web_ide_old/upload_new_file_in_web_ide_spec.rb3
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/ci_job_artifacts/unlocking_job_artifacts_across_pipelines_spec.rb22
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_tabs_spec.rb118
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_with_image_pull_policy_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/infrastructure_registry/terraform_module_registry_spec.rb10
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/conan_repository_spec.rb6
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/helm_registry_spec.rb9
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_group_level_spec.rb9
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_project_level_spec.rb7
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/maven_gradle_repository_spec.rb115
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb15
-rw-r--r--qa/qa/specs/features/shared_contexts/import/github_import_shared_context.rb2
-rw-r--r--qa/qa/specs/features/shared_contexts/import/gitlab_group_migration_common.rb2
-rw-r--r--qa/qa/support/formatters/allure_metadata_formatter.rb1
-rw-r--r--qa/qa/support/formatters/test_metrics_formatter.rb8
-rw-r--r--qa/qa/support/helpers/mask_token.rb2
-rw-r--r--qa/qa/support/influxdb_tools.rb27
-rw-r--r--qa/qa/support/matchers/have_matcher.rb1
-rw-r--r--qa/qa/support/parallel_pipeline_jobs.rb2
-rw-r--r--qa/qa/support/wait_for_requests.rb6
-rw-r--r--qa/qa/tools/ci/qa_changes.rb4
-rw-r--r--qa/qa/tools/test_resources_handler.rb1
-rw-r--r--qa/qa/vendor/facebook/page/login.rb23
-rw-r--r--qa/qa/vendor/github/page/base.rb14
-rw-r--r--qa/qa/vendor/github/page/login.rb11
-rw-r--r--qa/qa/vendor/page/base.rb14
-rw-r--r--qa/qa/vendor/saml_idp/page/base.rb14
-rw-r--r--qa/qa/vendor/saml_idp/page/login.rb10
-rw-r--r--qa/qa/vendor/smocker/smocker_api.rb2
-rw-r--r--qa/spec/runtime/feature_spec.rb2
-rw-r--r--qa/spec/service/docker_run/video_spec.rb28
-rw-r--r--qa/spec/support/formatters/allure_metadata_formatter_spec.rb10
-rw-r--r--rubocop/cop/active_record_association_reload.rb2
-rw-r--r--rubocop/cop/avoid_becomes.rb2
-rw-r--r--rubocop/cop/avoid_keyword_arguments_in_sidekiq_workers.rb2
-rw-r--r--rubocop/cop/avoid_return_from_blocks.rb8
-rw-r--r--rubocop/cop/background_migration/avoid_silent_rescue_exceptions.rb84
-rw-r--r--rubocop/cop/background_migration/feature_category.rb2
-rw-r--r--rubocop/cop/default_scope.rb2
-rw-r--r--rubocop/cop/destroy_all.rb2
-rw-r--r--rubocop/cop/gitlab/doc_url.rb2
-rw-r--r--rubocop/cop/gitlab/finder_with_find_by.rb2
-rw-r--r--rubocop/cop/gitlab/strong_memoize_attr.rb15
-rw-r--r--rubocop/cop/graphql/gid_expected_type.rb21
-rw-r--r--rubocop/cop/graphql/id_type.rb4
-rw-r--r--rubocop/cop/group_public_or_visible_to_user.rb2
-rw-r--r--rubocop/cop/ignored_columns.rb4
-rw-r--r--rubocop/cop/inject_enterprise_edition_module.rb6
-rw-r--r--rubocop/cop/migration/add_columns_to_wide_tables.rb4
-rw-r--r--rubocop/cop/migration/avoid_finalize_background_migration.rb23
-rw-r--r--rubocop/cop/project_path_helper.rb4
-rw-r--r--rubocop/cop/qa/selector_usage.rb4
-rw-r--r--rubocop/cop/rake/require.rb10
-rw-r--r--rubocop/cop/rspec/before_all_role_assignment.rb77
-rw-r--r--rubocop/cop/rspec/factory_bot/strategy_in_callback.rb2
-rw-r--r--rubocop/cop/search/avoid_checking_finished_on_deprecated_migrations.rb38
-rw-r--r--rubocop/cop/usage_data/distinct_count_by_large_foreign_key.rb6
-rw-r--r--rubocop/cop/usage_data/histogram_with_large_table.rb6
-rw-r--r--rubocop/cop/usage_data/instrumentation_superclass.rb8
-rw-r--r--rubocop/cop/usage_data/large_table.rb6
-rw-r--r--rubocop/cop_todo.rb4
-rw-r--r--rubocop/formatter/todo_formatter.rb19
-rw-r--r--rubocop/rubocop-code_reuse.yml1
-rw-r--r--rubocop/rubocop-usage-data.yml12
-rw-r--r--rubocop/usage_data_helpers.rb19
-rw-r--r--scripts/allowed_warnings.txt8
-rwxr-xr-xscripts/build_assets_image5
-rwxr-xr-xscripts/flaky_examples/prune-old-flaky-examples17
-rwxr-xr-xscripts/frontend/po_to_json.js14
-rwxr-xr-xscripts/gitaly-test-build1
-rwxr-xr-xscripts/gitaly-test-spawn1
-rw-r--r--scripts/gitlab_component_helpers.sh4
-rwxr-xr-xscripts/lint-docs-blueprints.rb2
-rwxr-xr-xscripts/lint-vendored-gems.sh5
-rwxr-xr-xscripts/merge-simplecov1
-rw-r--r--scripts/prepare_build.sh39
-rwxr-xr-xscripts/qa/testcases-check2
-rwxr-xr-xscripts/remote_development/run-smoke-test-suite.sh32
-rwxr-xr-xscripts/review_apps/review-apps.sh21
-rw-r--r--scripts/rspec_helpers.sh128
-rwxr-xr-xscripts/setup-test-env2
-rwxr-xr-xscripts/static-analysis3
-rw-r--r--scripts/utils.sh48
-rwxr-xr-xscripts/validate_migration_timestamps2
-rw-r--r--shared/ci_secure_files/.gitkeep0
-rw-r--r--sidekiq_cluster/cli.rb4
-rw-r--r--spec/commands/metrics_server/metrics_server_spec.rb36
-rw-r--r--spec/commands/sidekiq_cluster/cli_spec.rb4
-rw-r--r--spec/components/pajamas/empty_state_component_spec.rb101
-rw-r--r--spec/components/previews/pajamas/empty_state_component_preview.rb36
-rw-r--r--spec/config/settings_spec.rb4
-rw-r--r--spec/contracts/provider/spec_helper.rb2
-rw-r--r--spec/controllers/admin/application_settings_controller_spec.rb37
-rw-r--r--spec/controllers/admin/runners_controller_spec.rb26
-rw-r--r--spec/controllers/application_controller_spec.rb14
-rw-r--r--spec/controllers/concerns/issuable_collections_spec.rb4
-rw-r--r--spec/controllers/concerns/kas_cookie_spec.rb62
-rw-r--r--spec/controllers/concerns/metrics_dashboard_spec.rb195
-rw-r--r--spec/controllers/concerns/onboarding/status_spec.rb106
-rw-r--r--spec/controllers/dashboard_controller_spec.rb17
-rw-r--r--spec/controllers/explore/projects_controller_spec.rb53
-rw-r--r--spec/controllers/graphql_controller_spec.rb33
-rw-r--r--spec/controllers/groups/children_controller_spec.rb6
-rw-r--r--spec/controllers/groups/group_members_controller_spec.rb2
-rw-r--r--spec/controllers/groups/runners_controller_spec.rb106
-rw-r--r--spec/controllers/groups/uploads_controller_spec.rb20
-rw-r--r--spec/controllers/import/fogbugz_controller_spec.rb2
-rw-r--r--spec/controllers/oauth/authorizations_controller_spec.rb11
-rw-r--r--spec/controllers/projects/alert_management_controller_spec.rb59
-rw-r--r--spec/controllers/projects/artifacts_controller_spec.rb8
-rw-r--r--spec/controllers/projects/autocomplete_sources_controller_spec.rb34
-rw-r--r--spec/controllers/projects/blob_controller_spec.rb78
-rw-r--r--spec/controllers/projects/clusters_controller_spec.rb12
-rw-r--r--spec/controllers/projects/design_management/designs/raw_images_controller_spec.rb2
-rw-r--r--spec/controllers/projects/design_management/designs/resized_image_controller_spec.rb4
-rw-r--r--spec/controllers/projects/grafana_api_controller_spec.rb268
-rw-r--r--spec/controllers/projects/incidents_controller_spec.rb122
-rw-r--r--spec/controllers/projects/issues_controller_spec.rb2
-rw-r--r--spec/controllers/projects/merge_requests/drafts_controller_spec.rb53
-rw-r--r--spec/controllers/projects/notes_controller_spec.rb104
-rw-r--r--spec/controllers/projects/pipeline_schedules_controller_spec.rb13
-rw-r--r--spec/controllers/projects/pipelines_controller_spec.rb2
-rw-r--r--spec/controllers/projects/project_members_controller_spec.rb2
-rw-r--r--spec/controllers/projects/runners_controller_spec.rb106
-rw-r--r--spec/controllers/projects/service_desk_controller_spec.rb112
-rw-r--r--spec/controllers/projects/settings/ci_cd_controller_spec.rb5
-rw-r--r--spec/controllers/projects/tree_controller_spec.rb171
-rw-r--r--spec/controllers/projects_controller_spec.rb156
-rw-r--r--spec/controllers/registrations/welcome_controller_spec.rb2
-rw-r--r--spec/controllers/repositories/git_http_controller_spec.rb10
-rw-r--r--spec/db/schema_spec.rb5
-rw-r--r--spec/deprecation_warnings.rb2
-rw-r--r--spec/experiments/application_experiment_spec.rb2
-rw-r--r--spec/experiments/concerns/project_commit_count_spec.rb41
-rw-r--r--spec/experiments/force_company_trial_experiment_spec.rb24
-rw-r--r--spec/factories/ai/service_access_tokens.rb21
-rw-r--r--spec/factories/alert_management/http_integrations.rb10
-rw-r--r--spec/factories/audit_events.rb23
-rw-r--r--spec/factories/boards.rb1
-rw-r--r--spec/factories/bulk_import/trackers.rb8
-rw-r--r--spec/factories/ci/external_pull_requests.rb17
-rw-r--r--spec/factories/ci/pipelines.rb4
-rw-r--r--spec/factories/events.rb2
-rw-r--r--spec/factories/external_pull_requests.rb17
-rw-r--r--spec/factories/integrations.rb13
-rw-r--r--spec/factories/issues.rb12
-rw-r--r--spec/factories/ml/model_versions.rb16
-rw-r--r--spec/factories/ml/models.rb10
-rw-r--r--spec/factories/organizations/organization_settings.rb7
-rw-r--r--spec/factories/organizations/organization_users.rb8
-rw-r--r--spec/factories/packages/packages.rb2
-rw-r--r--spec/factories/project_authorizations.rb4
-rw-r--r--spec/factories/project_hooks.rb1
-rw-r--r--spec/factories/work_items.rb11
-rw-r--r--spec/factories/work_items/work_item_types.rb5
-rw-r--r--spec/fast_spec_helper.rb4
-rw-r--r--spec/features/abuse_report_spec.rb5
-rw-r--r--spec/features/admin/admin_hooks_spec.rb7
-rw-r--r--spec/features/admin/admin_mode/login_spec.rb6
-rw-r--r--spec/features/admin/admin_runners_spec.rb27
-rw-r--r--spec/features/admin/admin_settings_spec.rb45
-rw-r--r--spec/features/admin/integrations/user_activates_mattermost_slash_command_spec.rb2
-rw-r--r--spec/features/admin/users/user_spec.rb4
-rw-r--r--spec/features/atom/issues_spec.rb14
-rw-r--r--spec/features/atom/merge_requests_spec.rb14
-rw-r--r--spec/features/atom/topics_spec.rb49
-rw-r--r--spec/features/atom/users_spec.rb36
-rw-r--r--spec/features/boards/boards_spec.rb3
-rw-r--r--spec/features/boards/issue_ordering_spec.rb16
-rw-r--r--spec/features/boards/multi_select_spec.rb16
-rw-r--r--spec/features/boards/new_issue_spec.rb31
-rw-r--r--spec/features/boards/sidebar_assignee_spec.rb5
-rw-r--r--spec/features/boards/sidebar_labels_in_namespaces_spec.rb1
-rw-r--r--spec/features/boards/sidebar_spec.rb2
-rw-r--r--spec/features/boards/user_adds_lists_to_board_spec.rb2
-rw-r--r--spec/features/boards/user_visits_board_spec.rb2
-rw-r--r--spec/features/clusters/create_agent_spec.rb3
-rw-r--r--spec/features/commits_spec.rb39
-rw-r--r--spec/features/dashboard/activity_spec.rb14
-rw-r--r--spec/features/dashboard/datetime_on_tooltips_spec.rb9
-rw-r--r--spec/features/dashboard/issues_filter_spec.rb9
-rw-r--r--spec/features/dashboard/merge_requests_spec.rb55
-rw-r--r--spec/features/dashboard/todos/todos_sorting_spec.rb5
-rw-r--r--spec/features/dashboard/todos/todos_spec.rb25
-rw-r--r--spec/features/discussion_comments/issue_spec.rb3
-rw-r--r--spec/features/error_tracking/user_filters_errors_by_status_spec.rb2
-rw-r--r--spec/features/error_tracking/user_searches_sentry_errors_spec.rb2
-rw-r--r--spec/features/error_tracking/user_sees_error_details_spec.rb2
-rw-r--r--spec/features/error_tracking/user_sees_error_index_spec.rb2
-rw-r--r--spec/features/file_uploads/multipart_invalid_uploads_spec.rb2
-rw-r--r--spec/features/groups/board_spec.rb3
-rw-r--r--spec/features/groups/group_runners_spec.rb15
-rw-r--r--spec/features/groups/milestone_spec.rb8
-rw-r--r--spec/features/groups/milestones/gfm_autocomplete_spec.rb6
-rw-r--r--spec/features/groups/packages_spec.rb2
-rw-r--r--spec/features/groups/participants_autocomplete_spec.rb50
-rw-r--r--spec/features/groups/settings/access_tokens_spec.rb2
-rw-r--r--spec/features/groups_spec.rb8
-rw-r--r--spec/features/help_pages_spec.rb8
-rw-r--r--spec/features/ics/dashboard_issues_spec.rb67
-rw-r--r--spec/features/ics/group_issues_spec.rb11
-rw-r--r--spec/features/ics/project_issues_spec.rb11
-rw-r--r--spec/features/incidents/incident_timeline_events_spec.rb10
-rw-r--r--spec/features/incidents/user_views_incident_spec.rb10
-rw-r--r--spec/features/invites_spec.rb3
-rw-r--r--spec/features/issuables/issuable_list_spec.rb4
-rw-r--r--spec/features/issuables/markdown_references/jira_spec.rb3
-rw-r--r--spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb10
-rw-r--r--spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb7
-rw-r--r--spec/features/issues/filtered_search/filter_issues_spec.rb13
-rw-r--r--spec/features/issues/form_spec.rb4
-rw-r--r--spec/features/issues/gfm_autocomplete_spec.rb13
-rw-r--r--spec/features/issues/markdown_toolbar_spec.rb16
-rw-r--r--spec/features/issues/note_polling_spec.rb6
-rw-r--r--spec/features/issues/notes_on_issues_spec.rb3
-rw-r--r--spec/features/issues/related_issues_spec.rb4
-rw-r--r--spec/features/issues/service_desk_spec.rb67
-rw-r--r--spec/features/issues/user_comments_on_issue_spec.rb9
-rw-r--r--spec/features/issues/user_creates_branch_and_merge_request_spec.rb20
-rw-r--r--spec/features/issues/user_creates_issue_spec.rb4
-rw-r--r--spec/features/issues/user_edits_issue_spec.rb8
-rw-r--r--spec/features/issues/user_filters_issues_spec.rb12
-rw-r--r--spec/features/issues/user_interacts_with_awards_spec.rb2
-rw-r--r--spec/features/issues/user_sees_sidebar_updates_in_realtime_spec.rb5
-rw-r--r--spec/features/issues/user_uses_quick_actions_spec.rb2
-rw-r--r--spec/features/labels_hierarchy_spec.rb4
-rw-r--r--spec/features/markdown/keyboard_shortcuts_spec.rb15
-rw-r--r--spec/features/merge_request/maintainer_edits_fork_spec.rb18
-rw-r--r--spec/features/merge_request/user_accepts_merge_request_spec.rb9
-rw-r--r--spec/features/merge_request/user_allows_commits_from_memebers_who_can_merge_spec.rb12
-rw-r--r--spec/features/merge_request/user_closes_reopens_merge_request_state_spec.rb2
-rw-r--r--spec/features/merge_request/user_comments_on_diff_spec.rb25
-rw-r--r--spec/features/merge_request/user_creates_merge_request_spec.rb12
-rw-r--r--spec/features/merge_request/user_edits_assignees_sidebar_spec.rb17
-rw-r--r--spec/features/merge_request/user_edits_merge_request_spec.rb4
-rw-r--r--spec/features/merge_request/user_edits_mr_spec.rb6
-rw-r--r--spec/features/merge_request/user_interacts_with_batched_mr_diffs_spec.rb2
-rw-r--r--spec/features/merge_request/user_merges_immediately_spec.rb25
-rw-r--r--spec/features/merge_request/user_merges_merge_request_spec.rb3
-rw-r--r--spec/features/merge_request/user_merges_only_if_pipeline_succeeds_spec.rb157
-rw-r--r--spec/features/merge_request/user_merges_when_pipeline_succeeds_spec.rb201
-rw-r--r--spec/features/merge_request/user_opens_checkout_branch_modal_spec.rb16
-rw-r--r--spec/features/merge_request/user_posts_notes_spec.rb17
-rw-r--r--spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb8
-rw-r--r--spec/features/merge_request/user_resolves_outdated_diff_discussions_spec.rb22
-rw-r--r--spec/features/merge_request/user_resolves_wip_mr_spec.rb22
-rw-r--r--spec/features/merge_request/user_reverts_merge_request_spec.rb3
-rw-r--r--spec/features/merge_request/user_sees_deployment_widget_spec.rb8
-rw-r--r--spec/features/merge_request/user_sees_diff_spec.rb5
-rw-r--r--spec/features/merge_request/user_sees_discussions_navigation_spec.rb44
-rw-r--r--spec/features/merge_request/user_sees_discussions_spec.rb4
-rw-r--r--spec/features/merge_request/user_sees_merge_button_depending_on_unresolved_discussions_spec.rb2
-rw-r--r--spec/features/merge_request/user_sees_merge_request_pipelines_spec.rb90
-rw-r--r--spec/features/merge_request/user_sees_merge_widget_spec.rb57
-rw-r--r--spec/features/merge_request/user_sees_mr_from_deleted_forked_project_spec.rb11
-rw-r--r--spec/features/merge_request/user_sees_mr_with_deleted_source_branch_spec.rb2
-rw-r--r--spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb20
-rw-r--r--spec/features/merge_request/user_sees_pipelines_from_forked_project_spec.rb21
-rw-r--r--spec/features/merge_request/user_sees_pipelines_spec.rb25
-rw-r--r--spec/features/merge_request/user_sees_versions_spec.rb24
-rw-r--r--spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb4
-rw-r--r--spec/features/merge_request/user_squashes_merge_request_spec.rb28
-rw-r--r--spec/features/merge_request/user_suggests_changes_on_diff_spec.rb20
-rw-r--r--spec/features/merge_request/user_tries_to_access_private_project_info_through_new_mr_spec.rb24
-rw-r--r--spec/features/merge_request/user_uses_quick_actions_spec.rb2
-rw-r--r--spec/features/merge_request/user_views_open_merge_request_spec.rb3
-rw-r--r--spec/features/merge_requests/user_lists_merge_requests_spec.rb87
-rw-r--r--spec/features/merge_requests/user_views_open_merge_requests_spec.rb10
-rw-r--r--spec/features/nav/top_nav_spec.rb2
-rw-r--r--spec/features/participants_autocomplete_spec.rb8
-rw-r--r--spec/features/profiles/user_visits_profile_spec.rb128
-rw-r--r--spec/features/projects/activity/user_sees_activity_spec.rb14
-rw-r--r--spec/features/projects/artifacts/user_downloads_artifacts_spec.rb2
-rw-r--r--spec/features/projects/badges/coverage_spec.rb13
-rw-r--r--spec/features/projects/badges/pipeline_badge_spec.rb2
-rw-r--r--spec/features/projects/blobs/blame_spec.rb2
-rw-r--r--spec/features/projects/blobs/blob_show_spec.rb2
-rw-r--r--spec/features/projects/branches/download_buttons_spec.rb24
-rw-r--r--spec/features/projects/branches_spec.rb23
-rw-r--r--spec/features/projects/ci/editor_spec.rb138
-rw-r--r--spec/features/projects/clusters/gcp_spec.rb2
-rw-r--r--spec/features/projects/clusters/user_spec.rb2
-rw-r--r--spec/features/projects/clusters_spec.rb4
-rw-r--r--spec/features/projects/commit/builds_spec.rb4
-rw-r--r--spec/features/projects/commit/mini_pipeline_graph_spec.rb12
-rw-r--r--spec/features/projects/commits/user_browses_commits_spec.rb10
-rw-r--r--spec/features/projects/compare_spec.rb12
-rw-r--r--spec/features/projects/environments/environment_spec.rb24
-rw-r--r--spec/features/projects/environments/environments_spec.rb68
-rw-r--r--spec/features/projects/feature_flags/user_deletes_feature_flag_spec.rb3
-rw-r--r--spec/features/projects/files/download_buttons_spec.rb11
-rw-r--r--spec/features/projects/files/editing_a_file_spec.rb9
-rw-r--r--spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb2
-rw-r--r--spec/features/projects/files/user_browses_a_tree_with_a_folder_containing_only_a_folder_spec.rb2
-rw-r--r--spec/features/projects/files/user_browses_files_spec.rb2
-rw-r--r--spec/features/projects/files/user_creates_directory_spec.rb8
-rw-r--r--spec/features/projects/import_export/export_file_spec.rb2
-rw-r--r--spec/features/projects/integrations/user_activates_prometheus_spec.rb1
-rw-r--r--spec/features/projects/issuable_templates_spec.rb8
-rw-r--r--spec/features/projects/issues/design_management/user_views_design_spec.rb71
-rw-r--r--spec/features/projects/issues/viewing_issues_with_external_authorization_enabled_spec.rb23
-rw-r--r--spec/features/projects/jobs/user_browses_jobs_spec.rb16
-rw-r--r--spec/features/projects/jobs_spec.rb2
-rw-r--r--spec/features/projects/members/group_member_cannot_request_access_to_his_group_project_spec.rb2
-rw-r--r--spec/features/projects/members/group_requester_cannot_request_access_to_project_spec.rb2
-rw-r--r--spec/features/projects/members/user_requests_access_spec.rb8
-rw-r--r--spec/features/projects/milestones/gfm_autocomplete_spec.rb6
-rw-r--r--spec/features/projects/navbar_spec.rb6
-rw-r--r--spec/features/projects/pages/user_adds_domain_spec.rb2
-rw-r--r--spec/features/projects/pages/user_edits_settings_spec.rb40
-rw-r--r--spec/features/projects/pipelines/pipeline_spec.rb421
-rw-r--r--spec/features/projects/pipelines/pipelines_spec.rb63
-rw-r--r--spec/features/projects/releases/user_views_release_spec.rb10
-rw-r--r--spec/features/projects/settings/access_tokens_spec.rb2
-rw-r--r--spec/features/projects/settings/external_authorization_service_settings_spec.rb2
-rw-r--r--spec/features/projects/settings/monitor_settings_spec.rb7
-rw-r--r--spec/features/projects/settings/registry_settings_cleanup_tags_spec.rb2
-rw-r--r--spec/features/projects/settings/registry_settings_spec.rb2
-rw-r--r--spec/features/projects/settings/repository_settings_spec.rb1
-rw-r--r--spec/features/projects/settings/service_desk_setting_spec.rb35
-rw-r--r--spec/features/projects/settings/user_searches_in_settings_spec.rb19
-rw-r--r--spec/features/projects/settings/webhooks_settings_spec.rb5
-rw-r--r--spec/features/projects/show/download_buttons_spec.rb24
-rw-r--r--spec/features/projects/show/user_interacts_with_auto_devops_banner_spec.rb2
-rw-r--r--spec/features/projects/show/user_sees_collaboration_links_spec.rb4
-rw-r--r--spec/features/projects/tags/download_buttons_spec.rb22
-rw-r--r--spec/features/projects/user_sees_user_popover_spec.rb2
-rw-r--r--spec/features/projects/wiki/user_views_wiki_in_project_page_spec.rb21
-rw-r--r--spec/features/runners_spec.rb66
-rw-r--r--spec/features/search/user_searches_for_milestones_spec.rb2
-rw-r--r--spec/features/search/user_searches_for_wiki_pages_spec.rb2
-rw-r--r--spec/features/search/user_uses_search_filters_spec.rb8
-rw-r--r--spec/features/snippets/search_snippets_spec.rb4
-rw-r--r--spec/features/snippets/spam_snippets_spec.rb2
-rw-r--r--spec/features/snippets/user_creates_snippet_spec.rb6
-rw-r--r--spec/features/task_lists_spec.rb9
-rw-r--r--spec/features/uploads/user_uploads_avatar_to_group_spec.rb2
-rw-r--r--spec/features/uploads/user_uploads_avatar_to_profile_spec.rb2
-rw-r--r--spec/features/user_sees_revert_modal_spec.rb7
-rw-r--r--spec/features/users/email_verification_on_login_spec.rb12
-rw-r--r--spec/features/users/login_spec.rb17
-rw-r--r--spec/features/users/overview_spec.rb14
-rw-r--r--spec/features/users/rss_spec.rb8
-rw-r--r--spec/features/users/show_spec.rb28
-rw-r--r--spec/features/users/terms_spec.rb15
-rw-r--r--spec/finders/award_emojis_finder_spec.rb4
-rw-r--r--spec/finders/ci/group_variables_finder_spec.rb73
-rw-r--r--spec/finders/ci/runners_finder_spec.rb4
-rw-r--r--spec/finders/clusters/agent_tokens_finder_spec.rb5
-rw-r--r--spec/finders/deployments_finder_spec.rb39
-rw-r--r--spec/finders/group_descendants_finder_spec.rb8
-rw-r--r--spec/finders/group_projects_finder_spec.rb10
-rw-r--r--spec/finders/packages/ml_model/package_finder_spec.rb57
-rw-r--r--spec/finders/packages/npm/package_finder_spec.rb67
-rw-r--r--spec/finders/projects/ml/model_finder_spec.rb40
-rw-r--r--spec/finders/projects_finder_spec.rb30
-rw-r--r--spec/finders/users_finder_spec.rb13
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/project_hook.json116
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/wiki_blobs.json57
-rw-r--r--spec/fixtures/api/schemas/slack/manifest.json1250
-rw-r--r--spec/fixtures/csv_missing_milestones.csv5
-rw-r--r--spec/fixtures/grafana/expected_grafana_embed.json6
-rw-r--r--spec/fixtures/lib/gitlab/import_export/complex/tree/project/issues.ndjson6
-rw-r--r--spec/fixtures/lib/gitlab/metrics/dashboard/schemas/metrics.json60
-rw-r--r--spec/frontend/__helpers__/set_vue_error_handler.js30
-rw-r--r--spec/frontend/access_tokens/components/tokens_app_spec.js4
-rw-r--r--spec/frontend/actioncable_connection_monitor_spec.js79
-rw-r--r--spec/frontend/add_context_commits_modal/components/add_context_commits_modal_spec.js17
-rw-r--r--spec/frontend/admin/abuse_reports/components/abuse_category_spec.js43
-rw-r--r--spec/frontend/admin/abuse_reports/components/abuse_report_row_spec.js16
-rw-r--r--spec/frontend/admin/applications/components/delete_application_spec.js7
-rw-r--r--spec/frontend/admin/broadcast_messages/components/message_form_spec.js43
-rw-r--r--spec/frontend/admin/topics/components/remove_avatar_spec.js2
-rw-r--r--spec/frontend/admin/topics/components/topic_select_spec.js4
-rw-r--r--spec/frontend/alert_management/components/alert_management_table_spec.js2
-rw-r--r--spec/frontend/alerts_settings/components/alerts_settings_form_spec.js31
-rw-r--r--spec/frontend/analytics/shared/components/projects_dropdown_filter_spec.js13
-rw-r--r--spec/frontend/analytics/usage_trends/components/users_chart_spec.js47
-rw-r--r--spec/frontend/api/user_api_spec.js21
-rw-r--r--spec/frontend/batch_comments/components/draft_note_spec.js68
-rw-r--r--spec/frontend/batch_comments/components/submit_dropdown_spec.js17
-rw-r--r--spec/frontend/batch_comments/stores/modules/batch_comments/actions_spec.js55
-rw-r--r--spec/frontend/behaviors/gl_emoji_spec.js196
-rw-r--r--spec/frontend/behaviors/markdown/render_gfm_spec.js26
-rw-r--r--spec/frontend/behaviors/markdown/render_metrics_spec.js49
-rw-r--r--spec/frontend/blob/line_highlighter_spec.js71
-rw-r--r--spec/frontend/blob_edit/edit_blob_spec.js1
-rw-r--r--spec/frontend/boards/board_card_inner_spec.js2
-rw-r--r--spec/frontend/boards/components/board_app_spec.js11
-rw-r--r--spec/frontend/boards/components/board_content_spec.js11
-rw-r--r--spec/frontend/boards/components/board_list_header_spec.js23
-rw-r--r--spec/frontend/boards/components/board_new_issue_spec.js65
-rw-r--r--spec/frontend/boards/components/board_settings_sidebar_spec.js4
-rw-r--r--spec/frontend/boards/mock_data.js41
-rw-r--r--spec/frontend/boards/project_select_spec.js111
-rw-r--r--spec/frontend/boards/stores/actions_spec.js8
-rw-r--r--spec/frontend/branches/components/__snapshots__/delete_merged_branches_spec.js.snap5
-rw-r--r--spec/frontend/branches/components/delete_merged_branches_spec.js2
-rw-r--r--spec/frontend/ci/ci_variable_list/components/ci_environments_dropdown_spec.js65
-rw-r--r--spec/frontend/ci/ci_variable_list/components/ci_group_variables_spec.js43
-rw-r--r--spec/frontend/ci/ci_variable_list/components/ci_variable_modal_spec.js5
-rw-r--r--spec/frontend/ci/ci_variable_list/components/ci_variable_settings_spec.js2
-rw-r--r--spec/frontend/ci/ci_variable_list/components/ci_variable_shared_spec.js33
-rw-r--r--spec/frontend/ci/ci_variable_list/mocks.js3
-rw-r--r--spec/frontend/ci/pipeline_editor/components/commit/commit_section_spec.js21
-rw-r--r--spec/frontend/ci/pipeline_editor/components/job_assistant_drawer/accordion_items/rules_item_spec.js18
-rw-r--r--spec/frontend/ci/pipeline_schedules/components/pipeline_schedules_form_spec.js306
-rw-r--r--spec/frontend/ci/pipeline_schedules/components/pipeline_schedules_spec.js37
-rw-r--r--spec/frontend/ci/pipeline_schedules/components/table/cells/pipeline_schedule_actions_spec.js13
-rw-r--r--spec/frontend/ci/pipeline_schedules/mock_data.js34
-rw-r--r--spec/frontend/ci/reports/components/__snapshots__/grouped_issues_list_spec.js.snap26
-rw-r--r--spec/frontend/ci/reports/components/grouped_issues_list_spec.js83
-rw-r--r--spec/frontend/ci/reports/components/summary_row_spec.js63
-rw-r--r--spec/frontend/ci/reports/mock_data/mock_data.js54
-rw-r--r--spec/frontend/ci/reports/utils_spec.js30
-rw-r--r--spec/frontend/ci/runner/admin_runner_show/admin_runner_show_app_spec.js82
-rw-r--r--spec/frontend/ci/runner/admin_runners/admin_runners_app_spec.js2
-rw-r--r--spec/frontend/ci/runner/components/cells/runner_summary_cell_spec.js94
-rw-r--r--spec/frontend/ci/runner/components/registration/registration_dropdown_spec.js75
-rw-r--r--spec/frontend/ci/runner/components/registration/registration_token_reset_dropdown_item_spec.js4
-rw-r--r--spec/frontend/ci/runner/components/registration/registration_token_spec.js23
-rw-r--r--spec/frontend/ci/runner/components/runner_delete_action_spec.js223
-rw-r--r--spec/frontend/ci/runner/components/runner_delete_button_spec.js222
-rw-r--r--spec/frontend/ci/runner/components/runner_delete_disclosure_dropdown_item_spec.js68
-rw-r--r--spec/frontend/ci/runner/components/runner_delete_modal_spec.js34
-rw-r--r--spec/frontend/ci/runner/components/runner_detail_spec.js88
-rw-r--r--spec/frontend/ci/runner/components/runner_edit_button_spec.js30
-rw-r--r--spec/frontend/ci/runner/components/runner_edit_disclosure_dropdown_item_spec.js42
-rw-r--r--spec/frontend/ci/runner/components/runner_header_actions_spec.js147
-rw-r--r--spec/frontend/ci/runner/components/runner_list_empty_state_spec.js159
-rw-r--r--spec/frontend/ci/runner/components/runner_pause_action_spec.js180
-rw-r--r--spec/frontend/ci/runner/components/runner_pause_button_spec.js282
-rw-r--r--spec/frontend/ci/runner/components/runner_pause_disclosure_dropdown_item_spec.js71
-rw-r--r--spec/frontend/ci/runner/group_runner_show/group_runner_show_app_spec.js67
-rw-r--r--spec/frontend/ci/runner/group_runners/group_runners_app_spec.js29
-rw-r--r--spec/frontend/clusters/agents/components/create_token_modal_spec.js13
-rw-r--r--spec/frontend/clusters/agents/components/revoke_token_button_spec.js8
-rw-r--r--spec/frontend/clusters_list/components/clusters_actions_spec.js38
-rw-r--r--spec/frontend/clusters_list/components/delete_agent_button_spec.js10
-rw-r--r--spec/frontend/comment_templates/components/__snapshots__/list_item_spec.js.snap2
-rw-r--r--spec/frontend/commit/commit_pipeline_status_component_spec.js172
-rw-r--r--spec/frontend/commit/commit_pipeline_status_spec.js172
-rw-r--r--spec/frontend/content_editor/components/bubble_menus/bubble_menu_spec.js2
-rw-r--r--spec/frontend/content_editor/components/bubble_menus/link_bubble_menu_spec.js2
-rw-r--r--spec/frontend/content_editor/components/bubble_menus/media_bubble_menu_spec.js71
-rw-r--r--spec/frontend/content_editor/components/bubble_menus/reference_bubble_menu_spec.js2
-rw-r--r--spec/frontend/content_editor/components/content_editor_spec.js20
-rw-r--r--spec/frontend/content_editor/components/formatting_toolbar_spec.js104
-rw-r--r--spec/frontend/content_editor/components/suggestions_dropdown_spec.js9
-rw-r--r--spec/frontend/content_editor/components/wrappers/code_block_spec.js239
-rw-r--r--spec/frontend/content_editor/components/wrappers/image_spec.js100
-rw-r--r--spec/frontend/content_editor/components/wrappers/reference_spec.js18
-rw-r--r--spec/frontend/content_editor/extensions/code_suggestion_spec.js128
-rw-r--r--spec/frontend/content_editor/extensions/comment_spec.js30
-rw-r--r--spec/frontend/content_editor/extensions/copy_paste_spec.js385
-rw-r--r--spec/frontend/content_editor/extensions/hard_break_spec.js20
-rw-r--r--spec/frontend/content_editor/extensions/html_nodes_spec.js6
-rw-r--r--spec/frontend/content_editor/extensions/image_spec.js2
-rw-r--r--spec/frontend/content_editor/extensions/paragraph_spec.js29
-rw-r--r--spec/frontend/content_editor/extensions/paste_markdown_spec.js323
-rw-r--r--spec/frontend/content_editor/remark_markdown_processing_spec.js13
-rw-r--r--spec/frontend/content_editor/services/code_suggestion_utils_spec.js53
-rw-r--r--spec/frontend/content_editor/services/create_content_editor_spec.js8
-rw-r--r--spec/frontend/content_editor/services/gl_api_markdown_deserializer_spec.js13
-rw-r--r--spec/frontend/content_editor/services/markdown_serializer_spec.js27
-rw-r--r--spec/frontend/content_editor/test_utils.js19
-rw-r--r--spec/frontend/contribution_events/components/contribution_event/contribution_event_approved_spec.js34
-rw-r--r--spec/frontend/contribution_events/components/contribution_event/contribution_event_base_spec.js79
-rw-r--r--spec/frontend/contribution_events/components/contribution_event/contribution_event_expired_spec.js30
-rw-r--r--spec/frontend/contribution_events/components/contribution_event/contribution_event_joined_spec.js30
-rw-r--r--spec/frontend/contribution_events/components/contribution_event/contribution_event_left_spec.js30
-rw-r--r--spec/frontend/contribution_events/components/contribution_event/contribution_event_merged_spec.js31
-rw-r--r--spec/frontend/contribution_events/components/contribution_event/contribution_event_private_spec.js33
-rw-r--r--spec/frontend/contribution_events/components/contribution_event/contribution_event_pushed_spec.js141
-rw-r--r--spec/frontend/contribution_events/components/contribution_events_spec.js37
-rw-r--r--spec/frontend/contribution_events/components/resource_parent_link_spec.js46
-rw-r--r--spec/frontend/contribution_events/components/target_link_spec.js43
-rw-r--r--spec/frontend/contribution_events/utils.js52
-rw-r--r--spec/frontend/deploy_keys/components/app_spec.js82
-rw-r--r--spec/frontend/design_management/components/design_description/description_form_spec.js35
-rw-r--r--spec/frontend/design_management/components/design_notes/__snapshots__/design_note_spec.js.snap86
-rw-r--r--spec/frontend/design_management/components/design_notes/design_discussion_spec.js12
-rw-r--r--spec/frontend/design_management/components/design_notes/design_note_spec.js268
-rw-r--r--spec/frontend/design_management/components/design_presentation_spec.js4
-rw-r--r--spec/frontend/design_management/components/design_todo_button_spec.js4
-rw-r--r--spec/frontend/design_management/mock_data/apollo_mock.js29
-rw-r--r--spec/frontend/design_management/mock_data/discussion.js12
-rw-r--r--spec/frontend/design_management/mock_data/notes.js3
-rw-r--r--spec/frontend/diffs/components/app_spec.js12
-rw-r--r--spec/frontend/diffs/components/commit_item_spec.js2
-rw-r--r--spec/frontend/diffs/components/diff_code_quality_item_spec.js37
-rw-r--r--spec/frontend/diffs/components/diff_code_quality_spec.js55
-rw-r--r--spec/frontend/diffs/components/diff_content_spec.js72
-rw-r--r--spec/frontend/diffs/components/diff_discussions_spec.js16
-rw-r--r--spec/frontend/diffs/components/diff_file_header_spec.js26
-rw-r--r--spec/frontend/diffs/components/diff_file_spec.js181
-rw-r--r--spec/frontend/diffs/components/diff_inline_findings_spec.js33
-rw-r--r--spec/frontend/diffs/components/diff_line_note_form_spec.js40
-rw-r--r--spec/frontend/diffs/components/diff_line_spec.js21
-rw-r--r--spec/frontend/diffs/components/diff_row_spec.js14
-rw-r--r--spec/frontend/diffs/components/tree_list_spec.js36
-rw-r--r--spec/frontend/diffs/mock_data/diff_code_quality.js87
-rw-r--r--spec/frontend/diffs/store/actions_spec.js65
-rw-r--r--spec/frontend/diffs/store/mutations_spec.js2
-rw-r--r--spec/frontend/diffs/store/utils_spec.js6
-rw-r--r--spec/frontend/drawio/drawio_editor_spec.js1
-rw-r--r--spec/frontend/dropzone_input_spec.js2
-rw-r--r--spec/frontend/editor/source_editor_extension_base_spec.js1
-rw-r--r--spec/frontend/editor/source_editor_markdown_livepreview_ext_spec.js7
-rw-r--r--spec/frontend/editor/source_editor_yaml_ext_spec.js4
-rw-r--r--spec/frontend/emoji/index_spec.js95
-rw-r--r--spec/frontend/environments/edit_environment_spec.js158
-rw-r--r--spec/frontend/environments/environment_form_spec.js247
-rw-r--r--spec/frontend/environments/graphql/mock_data.js5
-rw-r--r--spec/frontend/environments/graphql/resolvers_spec.js46
-rw-r--r--spec/frontend/environments/new_environment_item_spec.js60
-rw-r--r--spec/frontend/environments/new_environment_spec.js108
-rw-r--r--spec/frontend/error_tracking/components/error_details_spec.js11
-rw-r--r--spec/frontend/fixtures/groups.rb33
-rw-r--r--spec/frontend/fixtures/issues.rb4
-rw-r--r--spec/frontend/fixtures/metrics_dashboard.rb42
-rw-r--r--spec/frontend/fixtures/milestones.rb43
-rw-r--r--spec/frontend/fixtures/pipeline_schedules.rb6
-rw-r--r--spec/frontend/fixtures/static/line_highlighter.html85
-rw-r--r--spec/frontend/fixtures/static/textarea.html27
-rw-r--r--spec/frontend/fixtures/timezones.rb2
-rw-r--r--spec/frontend/fixtures/users.rb9
-rw-r--r--spec/frontend/frequent_items/mock_data.js2
-rw-r--r--spec/frontend/gfm_auto_complete_spec.js2
-rw-r--r--spec/frontend/gitlab_version_check/components/security_patch_upgrade_alert_modal_spec.js33
-rw-r--r--spec/frontend/groups/components/app_spec.js8
-rw-r--r--spec/frontend/groups/components/overview_tabs_spec.js67
-rw-r--r--spec/frontend/groups/service/archived_projects_service_spec.js90
-rw-r--r--spec/frontend/groups/service/groups_service_spec.js19
-rw-r--r--spec/frontend/header_search/init_spec.js2
-rw-r--r--spec/frontend/ide/components/ide_status_bar_spec.js44
-rw-r--r--spec/frontend/ide/components/repo_editor_spec.js1
-rw-r--r--spec/frontend/ide/mock_data.js2
-rw-r--r--spec/frontend/invite_members/components/group_select_spec.js174
-rw-r--r--spec/frontend/invite_members/components/invite_groups_modal_spec.js31
-rw-r--r--spec/frontend/invite_members/components/members_token_select_spec.js13
-rw-r--r--spec/frontend/issuable/components/related_issuable_item_spec.js6
-rw-r--r--spec/frontend/issuable/components/status_box_spec.js2
-rw-r--r--spec/frontend/issuable/issuable_form_spec.js35
-rw-r--r--spec/frontend/issuable/popover/components/issue_popover_spec.js2
-rw-r--r--spec/frontend/issuable/popover/components/mr_popover_spec.js2
-rw-r--r--spec/frontend/issuable/popover/index_spec.js68
-rw-r--r--spec/frontend/issuable/related_issues/components/related_issues_block_spec.js51
-rw-r--r--spec/frontend/issuable/related_issues/components/related_issues_root_spec.js109
-rw-r--r--spec/frontend/issues/dashboard/components/issues_dashboard_app_spec.js3
-rw-r--r--spec/frontend/issues/list/components/empty_state_without_any_issues_spec.js1
-rw-r--r--spec/frontend/issues/list/components/issues_list_app_spec.js1
-rw-r--r--spec/frontend/issues/show/components/delete_issue_modal_spec.js9
-rw-r--r--spec/frontend/issues/show/components/fields/description_spec.js103
-rw-r--r--spec/frontend/issues/show/components/header_actions_spec.js36
-rw-r--r--spec/frontend/issues/show/components/incidents/timeline_events_item_spec.js10
-rw-r--r--spec/frontend/issues/show/components/task_list_item_actions_spec.js6
-rw-r--r--spec/frontend/issues/show/issue_spec.js2
-rw-r--r--spec/frontend/jira_connect/branches/components/project_dropdown_spec.js1
-rw-r--r--spec/frontend/jira_connect/branches/components/source_branch_dropdown_spec.js1
-rw-r--r--spec/frontend/jira_connect/subscriptions/components/app_spec.js8
-rw-r--r--spec/frontend/jira_connect/subscriptions/components/feedback_banner_spec.js45
-rw-r--r--spec/frontend/jobs/components/job/job_app_spec.js2
-rw-r--r--spec/frontend/jobs/components/job/job_container_item_spec.js16
-rw-r--r--spec/frontend/lib/utils/common_utils_spec.js34
-rw-r--r--spec/frontend/lib/utils/datetime/date_format_utility_spec.js15
-rw-r--r--spec/frontend/lib/utils/downloader_spec.js4
-rw-r--r--spec/frontend/lib/utils/forms_spec.js111
-rw-r--r--spec/frontend/lib/utils/ref_validator_spec.js23
-rw-r--r--spec/frontend/members/components/table/members_table_spec.js2
-rw-r--r--spec/frontend/members/components/table/role_dropdown_spec.js10
-rw-r--r--spec/frontend/merge_requests/generated_content_spec.js310
-rw-r--r--spec/frontend/ml/model_registry/routes/models/index/components/ml_models_index_spec.js39
-rw-r--r--spec/frontend/ml/model_registry/routes/models/index/components/mock_data.js12
-rw-r--r--spec/frontend/monitoring/components/__snapshots__/dashboard_template_spec.js.snap155
-rw-r--r--spec/frontend/monitoring/components/__snapshots__/empty_state_spec.js.snap55
-rw-r--r--spec/frontend/monitoring/components/__snapshots__/group_empty_state_spec.js.snap160
-rw-r--r--spec/frontend/monitoring/components/charts/annotations_spec.js95
-rw-r--r--spec/frontend/monitoring/components/charts/anomaly_spec.js304
-rw-r--r--spec/frontend/monitoring/components/charts/bar_spec.js53
-rw-r--r--spec/frontend/monitoring/components/charts/column_spec.js118
-rw-r--r--spec/frontend/monitoring/components/charts/empty_chart_spec.js21
-rw-r--r--spec/frontend/monitoring/components/charts/gauge_spec.js210
-rw-r--r--spec/frontend/monitoring/components/charts/heatmap_spec.js93
-rw-r--r--spec/frontend/monitoring/components/charts/options_spec.js327
-rw-r--r--spec/frontend/monitoring/components/charts/single_stat_spec.js94
-rw-r--r--spec/frontend/monitoring/components/charts/stacked_column_spec.js193
-rw-r--r--spec/frontend/monitoring/components/charts/time_series_spec.js748
-rw-r--r--spec/frontend/monitoring/components/create_dashboard_modal_spec.js44
-rw-r--r--spec/frontend/monitoring/components/dashboard_actions_menu_spec.js421
-rw-r--r--spec/frontend/monitoring/components/dashboard_header_spec.js395
-rw-r--r--spec/frontend/monitoring/components/dashboard_panel_builder_spec.js226
-rw-r--r--spec/frontend/monitoring/components/dashboard_panel_spec.js582
-rw-r--r--spec/frontend/monitoring/components/dashboard_spec.js784
-rw-r--r--spec/frontend/monitoring/components/dashboard_template_spec.js41
-rw-r--r--spec/frontend/monitoring/components/dashboard_url_time_spec.js159
-rw-r--r--spec/frontend/monitoring/components/dashboards_dropdown_spec.js170
-rw-r--r--spec/frontend/monitoring/components/duplicate_dashboard_form_spec.js166
-rw-r--r--spec/frontend/monitoring/components/duplicate_dashboard_modal_spec.js110
-rw-r--r--spec/frontend/monitoring/components/embeds/embed_group_spec.js157
-rw-r--r--spec/frontend/monitoring/components/embeds/metric_embed_spec.js100
-rw-r--r--spec/frontend/monitoring/components/embeds/mock_data.js86
-rw-r--r--spec/frontend/monitoring/components/empty_state_spec.js55
-rw-r--r--spec/frontend/monitoring/components/graph_group_spec.js144
-rw-r--r--spec/frontend/monitoring/components/group_empty_state_spec.js47
-rw-r--r--spec/frontend/monitoring/components/links_section_spec.js64
-rw-r--r--spec/frontend/monitoring/components/refresh_button_spec.js139
-rw-r--r--spec/frontend/monitoring/components/variables/dropdown_field_spec.js62
-rw-r--r--spec/frontend/monitoring/components/variables/text_field_spec.js55
-rw-r--r--spec/frontend/monitoring/components/variables_section_spec.js125
-rw-r--r--spec/frontend/monitoring/csv_export_spec.js126
-rw-r--r--spec/frontend/monitoring/fixture_data.js49
-rw-r--r--spec/frontend/monitoring/graph_data.js274
-rw-r--r--spec/frontend/monitoring/mock_data.js574
-rw-r--r--spec/frontend/monitoring/pages/dashboard_page_spec.js60
-rw-r--r--spec/frontend/monitoring/pages/panel_new_page_spec.js93
-rw-r--r--spec/frontend/monitoring/requests/index_spec.js157
-rw-r--r--spec/frontend/monitoring/router_spec.js106
-rw-r--r--spec/frontend/monitoring/store/actions_spec.js1167
-rw-r--r--spec/frontend/monitoring/store/embed_group/actions_spec.js16
-rw-r--r--spec/frontend/monitoring/store/embed_group/getters_spec.js19
-rw-r--r--spec/frontend/monitoring/store/embed_group/mutations_spec.js16
-rw-r--r--spec/frontend/monitoring/store/getters_spec.js457
-rw-r--r--spec/frontend/monitoring/store/index_spec.js23
-rw-r--r--spec/frontend/monitoring/store/mutations_spec.js586
-rw-r--r--spec/frontend/monitoring/store/utils_spec.js893
-rw-r--r--spec/frontend/monitoring/store/variable_mapping_spec.js209
-rw-r--r--spec/frontend/monitoring/store_utils.js80
-rw-r--r--spec/frontend/monitoring/stubs/modal_stub.js11
-rw-r--r--spec/frontend/monitoring/utils_spec.js464
-rw-r--r--spec/frontend/monitoring/validators_spec.js80
-rw-r--r--spec/frontend/notes/components/comment_form_spec.js51
-rw-r--r--spec/frontend/notes/components/comment_type_dropdown_spec.js40
-rw-r--r--spec/frontend/notes/components/diff_discussion_header_spec.js105
-rw-r--r--spec/frontend/notes/components/discussion_counter_spec.js25
-rw-r--r--spec/frontend/notes/components/mr_discussion_filter_spec.js28
-rw-r--r--spec/frontend/notes/components/note_form_spec.js35
-rw-r--r--spec/frontend/notes/components/noteable_note_spec.js30
-rw-r--r--spec/frontend/notes/components/notes_app_spec.js26
-rw-r--r--spec/frontend/notes/deprecated_notes_spec.js3
-rw-r--r--spec/frontend/notes/mixins/discussion_navigation_spec.js1
-rw-r--r--spec/frontend/notes/mock_data.js2
-rw-r--r--spec/frontend/notes/utils_spec.js31
-rw-r--r--spec/frontend/notifications/components/notification_email_listbox_input_spec.js2
-rw-r--r--spec/frontend/observability/client_spec.js66
-rw-r--r--spec/frontend/observability/observability_app_spec.js15
-rw-r--r--spec/frontend/observability/observability_container_spec.js134
-rw-r--r--spec/frontend/observability/skeleton_spec.js44
-rw-r--r--spec/frontend/organizations/groups_and_projects/components/app_spec.js99
-rw-r--r--spec/frontend/organizations/groups_and_projects/components/mock_data.js98
-rw-r--r--spec/frontend/packages_and_registries/container_registry/explorer/components/details_page/tags_list_row_spec.js36
-rw-r--r--spec/frontend/packages_and_registries/dependency_proxy/app_spec.js94
-rw-r--r--spec/frontend/packages_and_registries/dependency_proxy/components/manifest_list_spec.js24
-rw-r--r--spec/frontend/packages_and_registries/dependency_proxy/components/manifests_empty_state_spec.js81
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/details/package_files_spec.js143
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/details/version_row_spec.js40
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/package_list_row_spec.js.snap21
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/list/package_list_row_spec.js82
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/list/packages_list_spec.js26
-rw-r--r--spec/frontend/packages_and_registries/package_registry/mock_data.js16
-rw-r--r--spec/frontend/packages_and_registries/package_registry/pages/list_spec.js6
-rw-r--r--spec/frontend/pages/admin/jobs/components/cancel_jobs_modal_spec.js6
-rw-r--r--spec/frontend/pages/groups/new/components/app_spec.js5
-rw-r--r--spec/frontend/pages/projects/pipeline_schedules/shared/components/interval_pattern_input_spec.js13
-rw-r--r--spec/frontend/pages/shared/wikis/components/wiki_form_spec.js45
-rw-r--r--spec/frontend/pipeline_wizard/components/commit_spec.js8
-rw-r--r--spec/frontend/pipeline_wizard/components/editor_spec.js46
-rw-r--r--spec/frontend/pipelines/components/pipelines_list/failure_widget/failed_job_details_spec.js252
-rw-r--r--spec/frontend/pipelines/components/pipelines_list/failure_widget/failed_jobs_list_spec.js236
-rw-r--r--spec/frontend/pipelines/components/pipelines_list/failure_widget/mock.js54
-rw-r--r--spec/frontend/pipelines/components/pipelines_list/failure_widget/pipeline_failed_jobs_widget_spec.js114
-rw-r--r--spec/frontend/pipelines/components/pipelines_list/failure_widget/widget_failed_job_row_spec.js140
-rw-r--r--spec/frontend/pipelines/graph/graph_component_wrapper_spec.js56
-rw-r--r--spec/frontend/pipelines/graph/job_name_component_spec.js4
-rw-r--r--spec/frontend/pipelines/graph/linked_pipeline_spec.js6
-rw-r--r--spec/frontend/pipelines/graph/mock_data.js9
-rw-r--r--spec/frontend/pipelines/graph_shared/links_inner_spec.js1
-rw-r--r--spec/frontend/pipelines/header_component_spec.js246
-rw-r--r--spec/frontend/pipelines/mock_data.js8
-rw-r--r--spec/frontend/pipelines/pipeline_details_header_spec.js44
-rw-r--r--spec/frontend/pipelines/pipelines_artifacts_spec.js23
-rw-r--r--spec/frontend/pipelines/pipelines_table_spec.js26
-rw-r--r--spec/frontend/pipelines/time_ago_spec.js13
-rw-r--r--spec/frontend/profile/account/components/update_username_spec.js7
-rw-r--r--spec/frontend/profile/components/follow_spec.js49
-rw-r--r--spec/frontend/profile/components/followers_tab_spec.js2
-rw-r--r--spec/frontend/profile/components/following_tab_spec.js108
-rw-r--r--spec/frontend/profile/components/profile_tabs_spec.js19
-rw-r--r--spec/frontend/profile/components/snippets/snippets_tab_spec.js43
-rw-r--r--spec/frontend/profile/mock_data.js1
-rw-r--r--spec/frontend/profile/preferences/components/profile_preferences_spec.js8
-rw-r--r--spec/frontend/projects/commits/components/author_select_spec.js110
-rw-r--r--spec/frontend/projects/compare/components/app_spec.js104
-rw-r--r--spec/frontend/projects/new/components/__snapshots__/app_spec.js.snap30
-rw-r--r--spec/frontend/projects/new/components/app_spec.js6
-rw-r--r--spec/frontend/projects/settings/access_dropdown_spec.js25
-rw-r--r--spec/frontend/projects/settings/branch_rules/components/view/index_spec.js1
-rw-r--r--spec/frontend/projects/settings_service_desk/components/service_desk_root_spec.js10
-rw-r--r--spec/frontend/projects/settings_service_desk/components/service_desk_setting_spec.js24
-rw-r--r--spec/frontend/projects/terraform_notification/terraform_notification_spec.js3
-rw-r--r--spec/frontend/related_issues/components/related_issuable_input_spec.js98
-rw-r--r--spec/frontend/releases/components/releases_pagination_spec.js15
-rw-r--r--spec/frontend/repository/components/__snapshots__/last_commit_spec.js.snap4
-rw-r--r--spec/frontend/repository/components/blob_content_viewer_spec.js7
-rw-r--r--spec/frontend/repository/components/breadcrumbs_spec.js43
-rw-r--r--spec/frontend/repository/mixins/highlight_mixin_spec.js8
-rw-r--r--spec/frontend/scripts/frontend/po_to_json_spec.js8
-rw-r--r--spec/frontend/search/mock_data.js21
-rw-r--r--spec/frontend/search/sidebar/components/label_filter_spec.js30
-rw-r--r--spec/frontend/search/sidebar/components/scope_legacy_navigation_spec.js6
-rw-r--r--spec/frontend/search/sidebar/components/scope_sidebar_navigation_spec.js4
-rw-r--r--spec/frontend/search/topbar/components/app_spec.js16
-rw-r--r--spec/frontend/search/topbar/components/group_filter_spec.js5
-rw-r--r--spec/frontend/search/topbar/components/project_filter_spec.js5
-rw-r--r--spec/frontend/service_desk/components/info_banner_spec.js81
-rw-r--r--spec/frontend/service_desk/components/service_desk_list_app_spec.js151
-rw-r--r--spec/frontend/service_desk/mock_data.js118
-rw-r--r--spec/frontend/sidebar/components/assignees/assignee_avatar_link_spec.js96
-rw-r--r--spec/frontend/sidebar/components/assignees/assignee_title_spec.js21
-rw-r--r--spec/frontend/sidebar/components/assignees/assignees_spec.js5
-rw-r--r--spec/frontend/sidebar/components/assignees/collapsed_assignee_list_spec.js2
-rw-r--r--spec/frontend/sidebar/components/assignees/sidebar_assignees_spec.js22
-rw-r--r--spec/frontend/sidebar/components/lock/issuable_lock_form_spec.js8
-rw-r--r--spec/frontend/sidebar/components/participants/participants_spec.js13
-rw-r--r--spec/frontend/sidebar/components/reviewers/reviewer_avatar_link_spec.js66
-rw-r--r--spec/frontend/sidebar/components/severity/sidebar_severity_widget_spec.js11
-rw-r--r--spec/frontend/sidebar/components/time_tracking/create_timelog_form_spec.js50
-rw-r--r--spec/frontend/sidebar/components/time_tracking/mock_data.js13
-rw-r--r--spec/frontend/sidebar/components/time_tracking/report_spec.js57
-rw-r--r--spec/frontend/sidebar/components/todo_toggle/__snapshots__/todo_spec.js.snap1
-rw-r--r--spec/frontend/sidebar/components/todo_toggle/todo_button_spec.js1
-rw-r--r--spec/frontend/sidebar/sidebar_mediator_spec.js2
-rw-r--r--spec/frontend/snippets/components/__snapshots__/snippet_description_edit_spec.js.snap9
-rw-r--r--spec/frontend/snippets/components/snippet_visibility_edit_spec.js11
-rw-r--r--spec/frontend/super_sidebar/components/create_menu_spec.js15
-rw-r--r--spec/frontend/super_sidebar/components/global_search/command_palette/command_palette_items_spec.js93
-rw-r--r--spec/frontend/super_sidebar/components/global_search/command_palette/mock_data.js43
-rw-r--r--spec/frontend/super_sidebar/components/global_search/command_palette/utils_spec.js13
-rw-r--r--spec/frontend/super_sidebar/components/global_search/components/global_search_spec.js175
-rw-r--r--spec/frontend/super_sidebar/components/global_search/mock_data.js14
-rw-r--r--spec/frontend/super_sidebar/components/help_center_spec.js6
-rw-r--r--spec/frontend/super_sidebar/components/sidebar_peek_behavior_spec.js12
-rw-r--r--spec/frontend/super_sidebar/components/super_sidebar_spec.js15
-rw-r--r--spec/frontend/super_sidebar/components/super_sidebar_toggle_spec.js15
-rw-r--r--spec/frontend/super_sidebar/components/user_bar_spec.js8
-rw-r--r--spec/frontend/super_sidebar/components/user_menu_spec.js13
-rw-r--r--spec/frontend/super_sidebar/components/user_name_group_spec.js2
-rw-r--r--spec/frontend/super_sidebar/mock_data.js1
-rw-r--r--spec/frontend/super_sidebar/super_sidebar_collapsed_state_manager_spec.js32
-rw-r--r--spec/frontend/tags/components/delete_tag_modal_spec.js19
-rw-r--r--spec/frontend/token_access/outbound_token_access_spec.js125
-rw-r--r--spec/frontend/tracing/components/tracing_empty_state_spec.js44
-rw-r--r--spec/frontend/tracing/components/tracing_list_spec.js131
-rw-r--r--spec/frontend/tracing/components/tracing_table_list_spec.js63
-rw-r--r--spec/frontend/tracing/list_index_spec.js37
-rw-r--r--spec/frontend/tracking/internal_events_spec.js100
-rw-r--r--spec/frontend/tracking/tracking_spec.js1
-rw-r--r--spec/frontend/tracking/utils_spec.js37
-rw-r--r--spec/frontend/usage_quotas/storage/components/usage_graph_spec.js9
-rw-r--r--spec/frontend/usage_quotas/storage/mock_data.js12
-rw-r--r--spec/frontend/users/profile/actions/components/user_actions_app_spec.js38
-rw-r--r--spec/frontend/vue_compat_test_setup.js74
-rw-r--r--spec/frontend/vue_merge_request_widget/components/states/mr_widget_commit_message_dropdown_spec.js25
-rw-r--r--spec/frontend/vue_merge_request_widget/components/states/mr_widget_failed_to_merge_spec.js19
-rw-r--r--spec/frontend/vue_merge_request_widget/components/states/mr_widget_ready_to_merge_spec.js51
-rw-r--r--spec/frontend/vue_merge_request_widget/components/widget/__snapshots__/dynamic_content_spec.js.snap32
-rw-r--r--spec/frontend/vue_merge_request_widget/components/widget/widget_spec.js39
-rw-r--r--spec/frontend/vue_merge_request_widget/extentions/terraform/index_spec.js46
-rw-r--r--spec/frontend/vue_merge_request_widget/mock_data.js6
-rw-r--r--spec/frontend/vue_merge_request_widget/mr_widget_options_spec.js208
-rw-r--r--spec/frontend/vue_shared/alert_details/alert_management_sidebar_todo_spec.js65
-rw-r--r--spec/frontend/vue_shared/alert_details/alert_status_spec.js120
-rw-r--r--spec/frontend/vue_shared/components/actions_button_spec.js32
-rw-r--r--spec/frontend/vue_shared/components/awards_list_spec.js13
-rw-r--r--spec/frontend/vue_shared/components/blob_viewers/rich_viewer_spec.js11
-rw-r--r--spec/frontend/vue_shared/components/ci_icon_spec.js63
-rw-r--r--spec/frontend/vue_shared/components/code_block_highlighted_spec.js7
-rw-r--r--spec/frontend/vue_shared/components/confirm_danger/confirm_danger_modal_spec.js4
-rw-r--r--spec/frontend/vue_shared/components/diff_stats_dropdown_spec.js9
-rw-r--r--spec/frontend/vue_shared/components/entity_select/entity_select_spec.js7
-rw-r--r--spec/frontend/vue_shared/components/entity_select/group_select_spec.js12
-rw-r--r--spec/frontend/vue_shared/components/entity_select/project_select_spec.js12
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/filtered_search_bar_root_spec.js47
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/tokens/crm_contact_token_spec.js35
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/tokens/crm_organization_token_spec.js33
-rw-r--r--spec/frontend/vue_shared/components/listbox_input/listbox_input_spec.js28
-rw-r--r--spec/frontend/vue_shared/components/markdown/comment_templates_dropdown_spec.js22
-rw-r--r--spec/frontend/vue_shared/components/markdown/editor_mode_switcher_spec.js100
-rw-r--r--spec/frontend/vue_shared/components/markdown/field_spec.js18
-rw-r--r--spec/frontend/vue_shared/components/markdown/header_spec.js112
-rw-r--r--spec/frontend/vue_shared/components/markdown/markdown_editor_spec.js36
-rw-r--r--spec/frontend/vue_shared/components/markdown/non_gfm_markdown_spec.js157
-rw-r--r--spec/frontend/vue_shared/components/markdown/toolbar_spec.js73
-rw-r--r--spec/frontend/vue_shared/components/new_resource_dropdown/new_resource_dropdown_spec.js41
-rw-r--r--spec/frontend/vue_shared/components/paginated_table_with_search_and_tabs/paginated_table_with_search_and_tabs_spec.js2
-rw-r--r--spec/frontend/vue_shared/components/projects_list/projects_list_item_spec.js45
-rw-r--r--spec/frontend/vue_shared/components/projects_list/projects_list_spec.js1
-rw-r--r--spec/frontend/vue_shared/components/registry/list_item_spec.js46
-rw-r--r--spec/frontend/vue_shared/components/runner_instructions/instructions/runner_docker_instructions_spec.js5
-rw-r--r--spec/frontend/vue_shared/components/runner_instructions/instructions/runner_kubernetes_instructions_spec.js5
-rw-r--r--spec/frontend/vue_shared/components/runner_instructions/runner_instructions_modal_spec.js23
-rw-r--r--spec/frontend/vue_shared/components/security_reports/__snapshots__/security_summary_spec.js.snap144
-rw-r--r--spec/frontend/vue_shared/components/security_reports/artifact_downloads/merge_request_artifact_download_spec.js104
-rw-r--r--spec/frontend/vue_shared/components/security_reports/help_icon_spec.js63
-rw-r--r--spec/frontend/vue_shared/components/security_reports/security_summary_spec.js33
-rw-r--r--spec/frontend/vue_shared/components/source_viewer/components/chunk_new_spec.js2
-rw-r--r--spec/frontend/vue_shared/components/source_viewer/highlight_util_spec.js11
-rw-r--r--spec/frontend/vue_shared/components/source_viewer/plugins/wrap_child_nodes_spec.js7
-rw-r--r--spec/frontend/vue_shared/components/source_viewer/plugins/wrap_lines_spec.js12
-rw-r--r--spec/frontend/vue_shared/components/source_viewer/source_viewer_new_spec.js6
-rw-r--r--spec/frontend/vue_shared/components/upload_dropzone/upload_dropzone_spec.js36
-rw-r--r--spec/frontend/vue_shared/components/user_avatar/user_avatar_link_spec.js14
-rw-r--r--spec/frontend/vue_shared/components/user_avatar/user_avatar_list_spec.js5
-rw-r--r--spec/frontend/vue_shared/components/user_popover/user_popover_spec.js36
-rw-r--r--spec/frontend/vue_shared/components/user_select_spec.js27
-rw-r--r--spec/frontend/vue_shared/components/web_ide_link_spec.js27
-rw-r--r--spec/frontend/vue_shared/issuable/list/mock_data.js4
-rw-r--r--spec/frontend/vue_shared/issuable/show/components/issuable_header_spec.js25
-rw-r--r--spec/frontend/vue_shared/new_namespace/components/welcome_spec.js12
-rw-r--r--spec/frontend/vue_shared/new_namespace/new_namespace_page_spec.js9
-rw-r--r--spec/frontend/vue_shared/security_reports/mock_data.js136
-rw-r--r--spec/frontend/vue_shared/security_reports/security_reports_app_spec.js267
-rw-r--r--spec/frontend/vue_shared/security_reports/store/getters_spec.js182
-rw-r--r--spec/frontend/vue_shared/security_reports/store/modules/sast/actions_spec.js197
-rw-r--r--spec/frontend/vue_shared/security_reports/store/modules/sast/mutations_spec.js84
-rw-r--r--spec/frontend/vue_shared/security_reports/store/modules/secret_detection/actions_spec.js198
-rw-r--r--spec/frontend/vue_shared/security_reports/store/modules/secret_detection/mutations_spec.js84
-rw-r--r--spec/frontend/vue_shared/security_reports/store/utils_spec.js63
-rw-r--r--spec/frontend/vue_shared/security_reports/utils_spec.js48
-rw-r--r--spec/frontend/work_items/components/notes/work_item_note_actions_spec.js63
-rw-r--r--spec/frontend/work_items/components/notes/work_item_note_awards_list_spec.js147
-rw-r--r--spec/frontend/work_items/components/notes/work_item_note_spec.js30
-rw-r--r--spec/frontend/work_items/components/work_item_assignees_spec.js8
-rw-r--r--spec/frontend/work_items/components/work_item_attributes_wrapper_spec.js107
-rw-r--r--spec/frontend/work_items/components/work_item_award_emoji_spec.js231
-rw-r--r--spec/frontend/work_items/components/work_item_description_spec.js13
-rw-r--r--spec/frontend/work_items/components/work_item_detail_spec.js292
-rw-r--r--spec/frontend/work_items/components/work_item_labels_spec.js14
-rw-r--r--spec/frontend/work_items/components/work_item_links/work_item_tree_spec.js5
-rw-r--r--spec/frontend/work_items/components/work_item_todos_spec.js111
-rw-r--r--spec/frontend/work_items/mock_data.js258
-rw-r--r--spec/frontend/work_items/notes/award_utils_spec.js109
-rw-r--r--spec/frontend/work_items/router_spec.js39
-rw-r--r--spec/frontend/work_items/utils_spec.js21
-rw-r--r--spec/frontend_integration/content_editor/content_editor_integration_spec.js9
-rw-r--r--spec/graphql/gitlab_schema_spec.rb6
-rw-r--r--spec/graphql/graphql_triggers_spec.rb22
-rw-r--r--spec/graphql/mutations/alert_management/prometheus_integration/create_spec.rb13
-rw-r--r--spec/graphql/mutations/ci/job_token_scope/add_project_spec.rb40
-rw-r--r--spec/graphql/mutations/ci/pipeline_schedule/variable_input_type_spec.rb2
-rw-r--r--spec/graphql/mutations/issues/create_spec.rb6
-rw-r--r--spec/graphql/resolvers/alert_management/http_integrations_resolver_spec.rb3
-rw-r--r--spec/graphql/resolvers/alert_management/integrations_resolver_spec.rb3
-rw-r--r--spec/graphql/resolvers/board_lists_resolver_spec.rb2
-rw-r--r--spec/graphql/resolvers/ci/config_resolver_spec.rb2
-rw-r--r--spec/graphql/resolvers/ci/inherited_variables_resolver_spec.rb53
-rw-r--r--spec/graphql/resolvers/ci/job_token_scope_resolver_spec.rb2
-rw-r--r--spec/graphql/resolvers/ci/project_pipeline_counts_resolver_spec.rb2
-rw-r--r--spec/graphql/resolvers/ci/runner_job_count_resolver_spec.rb56
-rw-r--r--spec/graphql/resolvers/ci/runner_jobs_resolver_spec.rb17
-rw-r--r--spec/graphql/resolvers/ci/runners_resolver_spec.rb2
-rw-r--r--spec/graphql/resolvers/design_management/version_resolver_spec.rb2
-rw-r--r--spec/graphql/resolvers/echo_resolver_spec.rb2
-rw-r--r--spec/graphql/resolvers/issue_status_counts_resolver_spec.rb2
-rw-r--r--spec/graphql/resolvers/metrics/dashboard_resolver_spec.rb56
-rw-r--r--spec/graphql/resolvers/project_issues_resolver_spec.rb2
-rw-r--r--spec/graphql/resolvers/users/participants_resolver_spec.rb3
-rw-r--r--spec/graphql/types/alert_management/alert_type_spec.rb1
-rw-r--r--spec/graphql/types/ci/detailed_status_type_spec.rb2
-rw-r--r--spec/graphql/types/ci/group_variable_type_spec.rb4
-rw-r--r--spec/graphql/types/ci/project_variable_type_spec.rb4
-rw-r--r--spec/graphql/types/commit_signatures/verification_status_enum_spec.rb2
-rw-r--r--spec/graphql/types/deployment_tag_type_spec.rb15
-rw-r--r--spec/graphql/types/detployment_tag_type_spec.rb15
-rw-r--r--spec/graphql/types/environment_type_spec.rb2
-rw-r--r--spec/graphql/types/global_id_type_spec.rb6
-rw-r--r--spec/graphql/types/ide_type_spec.rb15
-rw-r--r--spec/graphql/types/issue_type_spec.rb1
-rw-r--r--spec/graphql/types/metrics/dashboard_type_spec.rb22
-rw-r--r--spec/graphql/types/project_statistics_type_spec.rb4
-rw-r--r--spec/graphql/types/project_type_spec.rb8
-rw-r--r--spec/graphql/types/root_storage_statistics_type_spec.rb6
-rw-r--r--spec/graphql/types/user_type_spec.rb42
-rw-r--r--spec/helpers/admin/application_settings/settings_helper_spec.rb6
-rw-r--r--spec/helpers/application_helper_spec.rb86
-rw-r--r--spec/helpers/button_helper_spec.rb119
-rw-r--r--spec/helpers/calendar_helper_spec.rb5
-rw-r--r--spec/helpers/ci/jobs_helper_spec.rb7
-rw-r--r--spec/helpers/ci/pipeline_schedules_helper_spec.rb31
-rw-r--r--spec/helpers/ci/pipelines_helper_spec.rb22
-rw-r--r--spec/helpers/clusters_helper_spec.rb15
-rw-r--r--spec/helpers/environment_helper_spec.rb12
-rw-r--r--spec/helpers/environments_helper_spec.rb35
-rw-r--r--spec/helpers/feed_token_helper_spec.rb28
-rw-r--r--spec/helpers/groups_helper_spec.rb15
-rw-r--r--spec/helpers/integrations_helper_spec.rb2
-rw-r--r--spec/helpers/issuables_helper_spec.rb6
-rw-r--r--spec/helpers/issues_helper_spec.rb3
-rw-r--r--spec/helpers/markup_helper_spec.rb2
-rw-r--r--spec/helpers/nav/new_dropdown_helper_spec.rb10
-rw-r--r--spec/helpers/nav/top_nav_helper_spec.rb10
-rw-r--r--spec/helpers/packages_helper_spec.rb111
-rw-r--r--spec/helpers/page_layout_helper_spec.rb2
-rw-r--r--spec/helpers/projects/observability_helper_spec.rb21
-rw-r--r--spec/helpers/projects/pipeline_helper_spec.rb2
-rw-r--r--spec/helpers/projects_helper_spec.rb154
-rw-r--r--spec/helpers/rss_helper_spec.rb5
-rw-r--r--spec/helpers/search_helper_spec.rb378
-rw-r--r--spec/helpers/sidebars_helper_spec.rb41
-rw-r--r--spec/helpers/tree_helper_spec.rb7
-rw-r--r--spec/helpers/users_helper_spec.rb18
-rw-r--r--spec/helpers/web_hooks/web_hooks_helper_spec.rb4
-rw-r--r--spec/initializers/00_rails_disable_joins_spec.rb288
-rw-r--r--spec/initializers/100_patch_omniauth_saml_spec.rb9
-rw-r--r--spec/initializers/action_dispatch_journey_router_spec.rb36
-rw-r--r--spec/initializers/google_api_client_spec.rb2
-rw-r--r--spec/initializers/grpc_patch_spec.rb31
-rw-r--r--spec/initializers/secret_token_spec.rb4
-rw-r--r--spec/lib/api/entities/bulk_imports/export_batch_status_spec.rb21
-rw-r--r--spec/lib/api/entities/bulk_imports/export_status_spec.rb19
-rw-r--r--spec/lib/api/entities/plan_limit_spec.rb1
-rw-r--r--spec/lib/api/entities/project_spec.rb2
-rw-r--r--spec/lib/api/helpers/packages/npm_spec.rb26
-rw-r--r--spec/lib/api/helpers_spec.rb39
-rw-r--r--spec/lib/atlassian/jira_connect/client_spec.rb20
-rw-r--r--spec/lib/atlassian/jira_connect/serializers/deployment_entity_spec.rb168
-rw-r--r--spec/lib/banzai/filter/autolink_filter_spec.rb4
-rw-r--r--spec/lib/banzai/filter/external_link_filter_spec.rb12
-rw-r--r--spec/lib/banzai/filter/image_link_filter_spec.rb20
-rw-r--r--spec/lib/banzai/filter/references/external_issue_reference_filter_spec.rb32
-rw-r--r--spec/lib/banzai/filter/references/label_reference_filter_spec.rb2
-rw-r--r--spec/lib/banzai/filter/references/milestone_reference_filter_spec.rb4
-rw-r--r--spec/lib/banzai/pipeline/full_pipeline_spec.rb2
-rw-r--r--spec/lib/banzai/pipeline/incident_management/timeline_event_pipeline_spec.rb2
-rw-r--r--spec/lib/banzai/pipeline/plain_markdown_pipeline_spec.rb14
-rw-r--r--spec/lib/banzai/reference_parser/issue_parser_spec.rb2
-rw-r--r--spec/lib/banzai/reference_parser/merge_request_parser_spec.rb2
-rw-r--r--spec/lib/container_registry/client_spec.rb4
-rw-r--r--spec/lib/container_registry/gitlab_api_client_spec.rb6
-rw-r--r--spec/lib/expand_variables_spec.rb102
-rw-r--r--spec/lib/extracts_ref/requested_ref_spec.rb153
-rw-r--r--spec/lib/generators/batched_background_migration/batched_background_migration_generator_spec.rb82
-rw-r--r--spec/lib/generators/batched_background_migration/expected_files/ee_my_batched_migration.txt29
-rw-r--r--spec/lib/generators/batched_background_migration/expected_files/foss_my_batched_migration.txt14
-rw-r--r--spec/lib/generators/gitlab/analytics/internal_events_generator_spec.rb24
-rw-r--r--spec/lib/gitlab/access/branch_protection_spec.rb58
-rw-r--r--spec/lib/gitlab/alert_management/payload/managed_prometheus_spec.rb16
-rw-r--r--spec/lib/gitlab/alert_management/payload/prometheus_spec.rb28
-rw-r--r--spec/lib/gitlab/asciidoc/html5_converter_spec.rb2
-rw-r--r--spec/lib/gitlab/auth/auth_finders_spec.rb75
-rw-r--r--spec/lib/gitlab/auth_spec.rb45
-rw-r--r--spec/lib/gitlab/background_migration/backfill_missing_ci_cd_settings_spec.rb98
-rw-r--r--spec/lib/gitlab/background_migration/backfill_uuid_conversion_column_in_vulnerability_occurrences_spec.rb133
-rw-r--r--spec/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy_spec.rb5
-rw-r--r--spec/lib/gitlab/background_migration/legacy_upload_mover_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/redis/backfill_project_pipeline_status_ttl_spec.rb37
-rw-r--r--spec/lib/gitlab/buffered_io_spec.rb4
-rw-r--r--spec/lib/gitlab/cache/ci/project_pipeline_status_spec.rb16
-rw-r--r--spec/lib/gitlab/cache/client_spec.rb60
-rw-r--r--spec/lib/gitlab/cache/metadata_spec.rb13
-rw-r--r--spec/lib/gitlab/cache/metrics_spec.rb90
-rw-r--r--spec/lib/gitlab/checks/changes_access_spec.rb8
-rw-r--r--spec/lib/gitlab/checks/diff_check_spec.rb4
-rw-r--r--spec/lib/gitlab/checks/file_size_check/allow_existing_oversized_blobs_spec.rb86
-rw-r--r--spec/lib/gitlab/checks/file_size_check/any_oversized_blobs_spec.rb31
-rw-r--r--spec/lib/gitlab/checks/global_file_size_check_spec.rb36
-rw-r--r--spec/lib/gitlab/checks/snippet_check_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/artifact_file_reader_spec.rb6
-rw-r--r--spec/lib/gitlab/ci/build/rules_spec.rb53
-rw-r--r--spec/lib/gitlab/ci/components/instance_path_spec.rb26
-rw-r--r--spec/lib/gitlab/ci/config/external/file/artifact_spec.rb5
-rw-r--r--spec/lib/gitlab/ci/config/external/file/base_spec.rb40
-rw-r--r--spec/lib/gitlab/ci/config/external/file/component_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/config/external/mapper/filter_spec.rb13
-rw-r--r--spec/lib/gitlab/ci/config/external/processor_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/config/external/rules_spec.rb40
-rw-r--r--spec/lib/gitlab/ci/config/yaml/interpolator_spec.rb144
-rw-r--r--spec/lib/gitlab/ci/config/yaml/loader_spec.rb165
-rw-r--r--spec/lib/gitlab/ci/config/yaml_spec.rb172
-rw-r--r--spec/lib/gitlab/ci/jwt_v2_spec.rb56
-rw-r--r--spec/lib/gitlab/ci/pipeline/chain/config/content_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/reports/sbom/source_spec.rb24
-rw-r--r--spec/lib/gitlab/ci/status/stage/factory_spec.rb4
-rw-r--r--spec/lib/gitlab/ci/status/stage/play_manual_spec.rb4
-rw-r--r--spec/lib/gitlab/ci/tags/bulk_insert_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/variables/builder_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/variables/collection/sort_spec.rb4
-rw-r--r--spec/lib/gitlab/ci/variables/collection_spec.rb60
-rw-r--r--spec/lib/gitlab/ci/variables/downstream/expandable_variable_generator_spec.rb38
-rw-r--r--spec/lib/gitlab/ci/variables/downstream/generator_spec.rb85
-rw-r--r--spec/lib/gitlab/ci/variables/downstream/raw_variable_generator_spec.rb17
-rw-r--r--spec/lib/gitlab/ci/yaml_processor_spec.rb58
-rw-r--r--spec/lib/gitlab/cleanup/remote_uploads_spec.rb26
-rw-r--r--spec/lib/gitlab/cluster/mixins/puma_cluster_spec.rb2
-rw-r--r--spec/lib/gitlab/config/entry/composable_array_spec.rb4
-rw-r--r--spec/lib/gitlab/config/entry/composable_hash_spec.rb6
-rw-r--r--spec/lib/gitlab/config/loader/yaml_spec.rb2
-rw-r--r--spec/lib/gitlab/current_settings_spec.rb2
-rw-r--r--spec/lib/gitlab/data_builder/build_spec.rb19
-rw-r--r--spec/lib/gitlab/data_builder/emoji_spec.rb126
-rw-r--r--spec/lib/gitlab/database/async_indexes/migration_helpers_spec.rb15
-rw-r--r--spec/lib/gitlab/database/async_indexes/postgres_async_index_spec.rb15
-rw-r--r--spec/lib/gitlab/database/click_house_client_spec.rb113
-rw-r--r--spec/lib/gitlab/database/each_database_spec.rb14
-rw-r--r--spec/lib/gitlab/database/gitlab_schema_spec.rb3
-rw-r--r--spec/lib/gitlab/database/health_status_spec.rb4
-rw-r--r--spec/lib/gitlab/database/load_balancing/host_spec.rb2
-rw-r--r--spec/lib/gitlab/database/load_balancing/load_balancer_spec.rb27
-rw-r--r--spec/lib/gitlab/database/load_balancing/primary_host_spec.rb2
-rw-r--r--spec/lib/gitlab/database/load_balancing/service_discovery_spec.rb82
-rw-r--r--spec/lib/gitlab/database/migration_helpers/automatic_lock_writes_on_tables_spec.rb37
-rw-r--r--spec/lib/gitlab/database/migrations/lock_retry_mixin_spec.rb2
-rw-r--r--spec/lib/gitlab/database/migrations/redis_helpers_spec.rb33
-rw-r--r--spec/lib/gitlab/database/migrations/test_batched_background_runner_spec.rb19
-rw-r--r--spec/lib/gitlab/database/partitioning_spec.rb2
-rw-r--r--spec/lib/gitlab/database/postgresql_adapter/empty_query_ping_spec.rb43
-rw-r--r--spec/lib/gitlab/database/postgresql_adapter/type_map_cache_spec.rb6
-rw-r--r--spec/lib/gitlab/database/reindexing_spec.rb18
-rw-r--r--spec/lib/gitlab/database/schema_validation/adapters/column_database_adapter_spec.rb72
-rw-r--r--spec/lib/gitlab/database/schema_validation/adapters/column_structure_sql_adapter_spec.rb78
-rw-r--r--spec/lib/gitlab/database/schema_validation/adapters/foreign_key_database_adapter_spec.rb28
-rw-r--r--spec/lib/gitlab/database/schema_validation/adapters/foreign_key_structure_sql_adapter_spec.rb42
-rw-r--r--spec/lib/gitlab/database/schema_validation/database_spec.rb93
-rw-r--r--spec/lib/gitlab/database/schema_validation/inconsistency_spec.rb96
-rw-r--r--spec/lib/gitlab/database/schema_validation/runner_spec.rb50
-rw-r--r--spec/lib/gitlab/database/schema_validation/schema_objects/column_spec.rb25
-rw-r--r--spec/lib/gitlab/database/schema_validation/schema_objects/foreign_key_spec.rb25
-rw-r--r--spec/lib/gitlab/database/schema_validation/schema_objects/index_spec.rb11
-rw-r--r--spec/lib/gitlab/database/schema_validation/schema_objects/table_spec.rb45
-rw-r--r--spec/lib/gitlab/database/schema_validation/schema_objects/trigger_spec.rb11
-rw-r--r--spec/lib/gitlab/database/schema_validation/structure_sql_spec.rb66
-rw-r--r--spec/lib/gitlab/database/schema_validation/track_inconsistency_spec.rb185
-rw-r--r--spec/lib/gitlab/database/schema_validation/validators/base_validator_spec.rb39
-rw-r--r--spec/lib/gitlab/database/schema_validation/validators/different_definition_foreign_keys_spec.rb8
-rw-r--r--spec/lib/gitlab/database/schema_validation/validators/different_definition_indexes_spec.rb8
-rw-r--r--spec/lib/gitlab/database/schema_validation/validators/different_definition_tables_spec.rb7
-rw-r--r--spec/lib/gitlab/database/schema_validation/validators/different_definition_triggers_spec.rb8
-rw-r--r--spec/lib/gitlab/database/schema_validation/validators/extra_foreign_keys_spec.rb7
-rw-r--r--spec/lib/gitlab/database/schema_validation/validators/extra_indexes_spec.rb7
-rw-r--r--spec/lib/gitlab/database/schema_validation/validators/extra_table_columns_spec.rb7
-rw-r--r--spec/lib/gitlab/database/schema_validation/validators/extra_tables_spec.rb7
-rw-r--r--spec/lib/gitlab/database/schema_validation/validators/extra_triggers_spec.rb7
-rw-r--r--spec/lib/gitlab/database/schema_validation/validators/missing_foreign_keys_spec.rb7
-rw-r--r--spec/lib/gitlab/database/schema_validation/validators/missing_indexes_spec.rb14
-rw-r--r--spec/lib/gitlab/database/schema_validation/validators/missing_table_columns_spec.rb7
-rw-r--r--spec/lib/gitlab/database/schema_validation/validators/missing_tables_spec.rb9
-rw-r--r--spec/lib/gitlab/database/schema_validation/validators/missing_triggers_spec.rb9
-rw-r--r--spec/lib/gitlab/database/similarity_score_spec.rb10
-rw-r--r--spec/lib/gitlab/database_spec.rb12
-rw-r--r--spec/lib/gitlab/diff/highlight_spec.rb8
-rw-r--r--spec/lib/gitlab/diff/rendered/notebook/diff_file_spec.rb2
-rw-r--r--spec/lib/gitlab/email/handler/service_desk_handler_spec.rb119
-rw-r--r--spec/lib/gitlab/email/handler_spec.rb2
-rw-r--r--spec/lib/gitlab/email/hook/smime_signature_interceptor_spec.rb2
-rw-r--r--spec/lib/gitlab/email/receiver_spec.rb19
-rw-r--r--spec/lib/gitlab/encrypted_configuration_spec.rb4
-rw-r--r--spec/lib/gitlab/error_tracking/logger_spec.rb2
-rw-r--r--spec/lib/gitlab/error_tracking/processor/sanitize_error_message_processor_spec.rb4
-rw-r--r--spec/lib/gitlab/error_tracking/stack_trace_highlight_decorator_spec.rb2
-rw-r--r--spec/lib/gitlab/exception_log_formatter_spec.rb48
-rw-r--r--spec/lib/gitlab/gfm/reference_rewriter_spec.rb10
-rw-r--r--spec/lib/gitlab/git/base_error_spec.rb29
-rw-r--r--spec/lib/gitlab/git/blame_spec.rb2
-rw-r--r--spec/lib/gitlab/git/blob_spec.rb68
-rw-r--r--spec/lib/gitlab/git/commit_spec.rb5
-rw-r--r--spec/lib/gitlab/git/compare_spec.rb18
-rw-r--r--spec/lib/gitlab/git/diff_collection_spec.rb16
-rw-r--r--spec/lib/gitlab/git/finders/refs_finder_spec.rb62
-rw-r--r--spec/lib/gitlab/git/keep_around_spec.rb15
-rw-r--r--spec/lib/gitlab/git/repository_spec.rb56
-rw-r--r--spec/lib/gitlab/git/tree_spec.rb9
-rw-r--r--spec/lib/gitlab/git_access_snippet_spec.rb2
-rw-r--r--spec/lib/gitlab/gitaly_client/call_spec.rb47
-rw-r--r--spec/lib/gitlab/gitaly_client/commit_service_spec.rb140
-rw-r--r--spec/lib/gitlab/gitaly_client/operation_service_spec.rb3
-rw-r--r--spec/lib/gitlab/gitaly_client/repository_service_spec.rb17
-rw-r--r--spec/lib/gitlab/github_import/client_pool_spec.rb41
-rw-r--r--spec/lib/gitlab/github_import/importer/issue_importer_spec.rb58
-rw-r--r--spec/lib/gitlab/github_import/settings_spec.rb21
-rw-r--r--spec/lib/gitlab/github_import/user_finder_spec.rb75
-rw-r--r--spec/lib/gitlab/github_import_spec.rb25
-rw-r--r--spec/lib/gitlab/gl_repository/repo_type_spec.rb8
-rw-r--r--spec/lib/gitlab/gpg/commit_spec.rb49
-rw-r--r--spec/lib/gitlab/gpg/invalid_gpg_signature_updater_spec.rb16
-rw-r--r--spec/lib/gitlab/grape_logging/loggers/response_logger_spec.rb8
-rw-r--r--spec/lib/gitlab/graphql/generic_tracing_spec.rb89
-rw-r--r--spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb2
-rw-r--r--spec/lib/gitlab/highlight_spec.rb2
-rw-r--r--spec/lib/gitlab/hook_data/emoji_builder_spec.rb27
-rw-r--r--spec/lib/gitlab/i18n/pluralization_spec.rb1
-rw-r--r--spec/lib/gitlab/import_export/all_models.yml10
-rw-r--r--spec/lib/gitlab/import_export/attribute_configuration_spec.rb2
-rw-r--r--spec/lib/gitlab/import_export/group/relation_tree_restorer_spec.rb37
-rw-r--r--spec/lib/gitlab/import_export/project/object_builder_spec.rb25
-rw-r--r--spec/lib/gitlab/import_export/project/relation_factory_spec.rb32
-rw-r--r--spec/lib/gitlab/import_export/project/tree_restorer_spec.rb19
-rw-r--r--spec/lib/gitlab/import_export/project/tree_saver_spec.rb8
-rw-r--r--spec/lib/gitlab/import_export/references_configuration_spec.rb2
-rw-r--r--spec/lib/gitlab/import_export/safe_model_attributes.yml5
-rw-r--r--spec/lib/gitlab/import_formatter_spec.rb2
-rw-r--r--spec/lib/gitlab/inactive_projects_deletion_warning_tracker_spec.rb36
-rw-r--r--spec/lib/gitlab/instrumentation/redis_interceptor_spec.rb47
-rw-r--r--spec/lib/gitlab/instrumentation/redis_spec.rb22
-rw-r--r--spec/lib/gitlab/internal_events/event_definitions_spec.rb102
-rw-r--r--spec/lib/gitlab/internal_events_spec.rb79
-rw-r--r--spec/lib/gitlab/issues/rebalancing/state_spec.rb3
-rw-r--r--spec/lib/gitlab/jwt_authenticatable_spec.rb26
-rw-r--r--spec/lib/gitlab/kas/client_spec.rb26
-rw-r--r--spec/lib/gitlab/kas/user_access_spec.rb36
-rw-r--r--spec/lib/gitlab/kubernetes/kube_client_spec.rb2
-rw-r--r--spec/lib/gitlab/lograge/custom_options_spec.rb10
-rw-r--r--spec/lib/gitlab/manifest_import/metadata_spec.rb39
-rw-r--r--spec/lib/gitlab/markdown_cache/active_record/extension_spec.rb2
-rw-r--r--spec/lib/gitlab/markdown_cache/redis/extension_spec.rb4
-rw-r--r--spec/lib/gitlab/memory/reporter_spec.rb2
-rw-r--r--spec/lib/gitlab/metrics/dashboard/url_spec.rb107
-rw-r--r--spec/lib/gitlab/metrics/environment_spec.rb3
-rw-r--r--spec/lib/gitlab/metrics/sidekiq_slis_spec.rb58
-rw-r--r--spec/lib/gitlab/middleware/go_spec.rb2
-rw-r--r--spec/lib/gitlab/multi_destination_logger_spec.rb3
-rw-r--r--spec/lib/gitlab/observability_spec.rb42
-rw-r--r--spec/lib/gitlab/pages/url_builder_spec.rb227
-rw-r--r--spec/lib/gitlab/pagination/gitaly_keyset_pager_spec.rb2
-rw-r--r--spec/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder_spec.rb63
-rw-r--r--spec/lib/gitlab/pagination/keyset/in_operator_optimization/strategies/record_loader_strategy_spec.rb32
-rw-r--r--spec/lib/gitlab/pagination/keyset/iterator_spec.rb2
-rw-r--r--spec/lib/gitlab/pagination/keyset/order_spec.rb54
-rw-r--r--spec/lib/gitlab/pagination/offset_pagination_spec.rb24
-rw-r--r--spec/lib/gitlab/patch/action_cable_redis_listener_spec.rb28
-rw-r--r--spec/lib/gitlab/prometheus/query_variables_spec.rb2
-rw-r--r--spec/lib/gitlab/rack_attack/request_spec.rb5
-rw-r--r--spec/lib/gitlab/redis/cross_slot_spec.rb27
-rw-r--r--spec/lib/gitlab/redis/multi_store_spec.rb118
-rw-r--r--spec/lib/gitlab/reference_extractor_spec.rb2
-rw-r--r--spec/lib/gitlab/relative_positioning/range_spec.rb6
-rw-r--r--spec/lib/gitlab/request_forgery_protection_spec.rb5
-rw-r--r--spec/lib/gitlab/runtime_spec.rb10
-rw-r--r--spec/lib/gitlab/search/found_wiki_page_spec.rb2
-rw-r--r--spec/lib/gitlab/search_results_spec.rb12
-rw-r--r--spec/lib/gitlab/seeder_spec.rb2
-rw-r--r--spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb40
-rw-r--r--spec/lib/gitlab/sidekiq_middleware/defer_jobs_spec.rb111
-rw-r--r--spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job_spec.rb26
-rw-r--r--spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb100
-rw-r--r--spec/lib/gitlab/sidekiq_middleware/size_limiter/client_spec.rb2
-rw-r--r--spec/lib/gitlab/sidekiq_middleware/skip_jobs_spec.rb151
-rw-r--r--spec/lib/gitlab/sidekiq_middleware_spec.rb12
-rw-r--r--spec/lib/gitlab/slash_commands/presenters/access_spec.rb2
-rw-r--r--spec/lib/gitlab/spamcheck/client_spec.rb4
-rw-r--r--spec/lib/gitlab/ssh/commit_spec.rb5
-rw-r--r--spec/lib/gitlab/ssh/signature_spec.rb11
-rw-r--r--spec/lib/gitlab/url_sanitizer_spec.rb2
-rw-r--r--spec/lib/gitlab/usage/metric_definition_spec.rb106
-rw-r--r--spec/lib/gitlab/usage/metrics/aggregates/aggregate_spec.rb5
-rw-r--r--spec/lib/gitlab/usage/metrics/aggregates/sources/redis_hll_spec.rb4
-rw-r--r--spec/lib/gitlab/usage/metrics/instrumentations/batched_background_migrations_metric_spec.rb27
-rw-r--r--spec/lib/gitlab/usage/metrics/instrumentations/count_bulk_imports_entities_metric_spec.rb32
-rw-r--r--spec/lib/gitlab/usage/metrics/instrumentations/count_imported_projects_metric_spec.rb8
-rw-r--r--spec/lib/gitlab/usage/metrics/instrumentations/count_imported_projects_total_metric_spec.rb4
-rw-r--r--spec/lib/gitlab/usage/metrics/instrumentations/count_projects_with_jira_dvcs_integration_metric_spec.rb50
-rw-r--r--spec/lib/gitlab/usage/metrics/instrumentations/count_slack_app_installations_gbp_metric_spec.rb16
-rw-r--r--spec/lib/gitlab/usage/metrics/instrumentations/count_slack_app_installations_metric_spec.rb13
-rw-r--r--spec/lib/gitlab/usage/metrics/instrumentations/count_users_creating_issues_metric_spec.rb4
-rw-r--r--spec/lib/gitlab/usage/metrics/instrumentations/gitaly_apdex_metric_spec.rb25
-rw-r--r--spec/lib/gitlab/usage/metrics/instrumentations/index_inconsistencies_metric_spec.rb6
-rw-r--r--spec/lib/gitlab/usage/metrics/instrumentations/ldap_encrypted_secrets_metric_spec.rb23
-rw-r--r--spec/lib/gitlab/usage/metrics/instrumentations/operating_system_metric_spec.rb23
-rw-r--r--spec/lib/gitlab/usage/metrics/instrumentations/schema_inconsistencies_metric_spec.rb43
-rw-r--r--spec/lib/gitlab/usage/metrics/instrumentations/smtp_encrypted_secrets_metric_spec.rb23
-rw-r--r--spec/lib/gitlab/usage/metrics/names_suggestions/generator_spec.rb4
-rw-r--r--spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb65
-rw-r--r--spec/lib/gitlab/usage_data_counters/issue_activity_unique_counter_spec.rb2
-rw-r--r--spec/lib/gitlab/usage_data_counters/kubernetes_agent_counter_spec.rb9
-rw-r--r--spec/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter_spec.rb39
-rw-r--r--spec/lib/gitlab/usage_data_metrics_spec.rb6
-rw-r--r--spec/lib/gitlab/usage_data_spec.rb106
-rw-r--r--spec/lib/gitlab/utils/measuring_spec.rb2
-rw-r--r--spec/lib/gitlab/utils/strong_memoize_spec.rb374
-rw-r--r--spec/lib/gitlab/utils_spec.rb477
-rw-r--r--spec/lib/gitlab/version_info_spec.rb193
-rw-r--r--spec/lib/gitlab/webpack/file_loader_spec.rb12
-rw-r--r--spec/lib/gitlab/webpack/manifest_spec.rb20
-rw-r--r--spec/lib/gitlab/x509/commit_spec.rb2
-rw-r--r--spec/lib/gitlab/x509/signature_spec.rb16
-rw-r--r--spec/lib/gitlab_settings/options_spec.rb118
-rw-r--r--spec/lib/result_spec.rb328
-rw-r--r--spec/lib/search/navigation_spec.rb280
-rw-r--r--spec/lib/service_ping/devops_report_spec.rb2
-rw-r--r--spec/lib/sidebars/groups/super_sidebar_menus/analyze_menu_spec.rb2
-rw-r--r--spec/lib/sidebars/organizations/menus/manage_menu_spec.rb28
-rw-r--r--spec/lib/sidebars/organizations/menus/scope_menu_spec.rb21
-rw-r--r--spec/lib/sidebars/organizations/panel_spec.rb17
-rw-r--r--spec/lib/sidebars/organizations/super_sidebar_panel_spec.rb39
-rw-r--r--spec/lib/sidebars/panel_spec.rb2
-rw-r--r--spec/lib/sidebars/projects/menus/deployments_menu_spec.rb26
-rw-r--r--spec/lib/sidebars/projects/menus/monitor_menu_spec.rb18
-rw-r--r--spec/lib/sidebars/projects/menus/settings_menu_spec.rb30
-rw-r--r--spec/lib/sidebars/projects/super_sidebar_menus/analyze_menu_spec.rb3
-rw-r--r--spec/lib/sidebars/projects/super_sidebar_menus/deploy_menu_spec.rb3
-rw-r--r--spec/lib/sidebars/projects/super_sidebar_menus/monitor_menu_spec.rb1
-rw-r--r--spec/lib/slack/manifest_spec.rb99
-rw-r--r--spec/mailers/emails/in_product_marketing_spec.rb2
-rw-r--r--spec/mailers/emails/issues_spec.rb9
-rw-r--r--spec/mailers/emails/projects_spec.rb3
-rw-r--r--spec/mailers/emails/releases_spec.rb2
-rw-r--r--spec/mailers/emails/service_desk_spec.rb24
-rw-r--r--spec/mailers/notify_spec.rb49
-rw-r--r--spec/metrics_server/metrics_server_spec.rb179
-rw-r--r--spec/migrations/20230523101514_finalize_user_type_migration_spec.rb9
-rw-r--r--spec/migrations/20230530012406_finalize_backfill_resource_link_events_spec.rb68
-rw-r--r--spec/migrations/20230613192703_ensure_ci_build_needs_big_int_backfill_is_finished_for_self_hosts_spec.rb25
-rw-r--r--spec/migrations/20230613192703_swap_ci_build_needs_to_big_int_for_self_hosts_spec.rb146
-rw-r--r--spec/migrations/20230616082958_add_unique_index_for_npm_packages_on_project_id_name_version_spec.rb20
-rw-r--r--spec/migrations/20230621070810_update_requeue_workers_in_application_settings_for_gitlab_com_spec.rb44
-rw-r--r--spec/migrations/20230621074611_update_elasticsearch_number_of_shards_in_application_settings_for_gitlab_com_spec.rb44
-rw-r--r--spec/migrations/20230628023103_queue_backfill_missing_ci_cd_settings_spec.rb26
-rw-r--r--spec/migrations/20230629095819_queue_backfill_uuid_conversion_column_in_vulnerability_occurrences_spec.rb26
-rw-r--r--spec/migrations/20230703024031_cleanup_project_pipeline_status_key_spec.rb12
-rw-r--r--spec/migrations/cleanup_bigint_conversion_for_merge_request_metrics_for_self_hosts_spec.rb107
-rw-r--r--spec/migrations/deduplicate_inactive_alert_integrations_spec.rb71
-rw-r--r--spec/migrations/ensure_events_bigint_backfill_is_finished_for_gitlab_dot_com_spec.rb35
-rw-r--r--spec/models/abuse/trust_score_spec.rb12
-rw-r--r--spec/models/abuse/user_trust_score_spec.rb130
-rw-r--r--spec/models/active_session_spec.rb56
-rw-r--r--spec/models/ai/service_access_token_spec.rb45
-rw-r--r--spec/models/alert_management/alert_spec.rb14
-rw-r--r--spec/models/alert_management/http_integration_spec.rb27
-rw-r--r--spec/models/analytics/cycle_analytics/stage_spec.rb15
-rw-r--r--spec/models/analytics/cycle_analytics/value_stream_spec.rb13
-rw-r--r--spec/models/application_record_spec.rb2
-rw-r--r--spec/models/application_setting_spec.rb54
-rw-r--r--spec/models/award_emoji_spec.rb25
-rw-r--r--spec/models/bulk_import_spec.rb18
-rw-r--r--spec/models/bulk_imports/entity_spec.rb42
-rw-r--r--spec/models/bulk_imports/export_spec.rb25
-rw-r--r--spec/models/bulk_imports/export_status_spec.rb96
-rw-r--r--spec/models/bulk_imports/file_transfer/group_config_spec.rb7
-rw-r--r--spec/models/ci/artifact_blob_spec.rb72
-rw-r--r--spec/models/ci/bridge_spec.rb85
-rw-r--r--spec/models/ci/build_dependencies_spec.rb2
-rw-r--r--spec/models/ci/build_metadata_spec.rb2
-rw-r--r--spec/models/ci/build_report_result_spec.rb2
-rw-r--r--spec/models/ci/build_runner_session_spec.rb4
-rw-r--r--spec/models/ci/build_spec.rb4
-rw-r--r--spec/models/ci/catalog/resource_spec.rb8
-rw-r--r--spec/models/ci/daily_build_group_report_result_spec.rb2
-rw-r--r--spec/models/ci/external_pull_request_spec.rb242
-rw-r--r--spec/models/ci/group_variable_spec.rb53
-rw-r--r--spec/models/ci/job_artifact_spec.rb2
-rw-r--r--spec/models/ci/persistent_ref_spec.rb20
-rw-r--r--spec/models/ci/pipeline_artifact_spec.rb8
-rw-r--r--spec/models/ci/pipeline_spec.rb29
-rw-r--r--spec/models/ci/processable_spec.rb4
-rw-r--r--spec/models/ci/ref_spec.rb4
-rw-r--r--spec/models/ci/runner_manager_spec.rb43
-rw-r--r--spec/models/ci/runner_spec.rb3
-rw-r--r--spec/models/ci/stage_spec.rb2
-rw-r--r--spec/models/ci/variable_spec.rb5
-rw-r--r--spec/models/ci_platform_metric_spec.rb2
-rw-r--r--spec/models/clusters/agent_spec.rb32
-rw-r--r--spec/models/clusters/cluster_spec.rb2
-rw-r--r--spec/models/commit_spec.rb2
-rw-r--r--spec/models/commit_status_spec.rb6
-rw-r--r--spec/models/concerns/batch_destroy_dependent_associations_spec.rb2
-rw-r--r--spec/models/concerns/counter_attribute_spec.rb2
-rw-r--r--spec/models/concerns/database_event_tracking_spec.rb14
-rw-r--r--spec/models/concerns/expirable_spec.rb2
-rw-r--r--spec/models/concerns/group_descendant_spec.rb7
-rw-r--r--spec/models/concerns/has_user_type_spec.rb2
-rw-r--r--spec/models/concerns/integrations/enable_ssl_verification_spec.rb2
-rw-r--r--spec/models/concerns/integrations/reset_secret_fields_spec.rb2
-rw-r--r--spec/models/concerns/issuable_spec.rb2
-rw-r--r--spec/models/concerns/milestoneish_spec.rb16
-rw-r--r--spec/models/concerns/resolvable_note_spec.rb8
-rw-r--r--spec/models/concerns/spammable_spec.rb26
-rw-r--r--spec/models/concerns/token_authenticatable_spec.rb8
-rw-r--r--spec/models/concerns/vulnerability_finding_signature_helpers_spec.rb2
-rw-r--r--spec/models/container_expiration_policy_spec.rb3
-rw-r--r--spec/models/container_repository_spec.rb6
-rw-r--r--spec/models/customer_relations/contact_spec.rb2
-rw-r--r--spec/models/customer_relations/organization_spec.rb2
-rw-r--r--spec/models/dependency_proxy/image_ttl_group_policy_spec.rb3
-rw-r--r--spec/models/dependency_proxy/manifest_spec.rb2
-rw-r--r--spec/models/deployment_spec.rb10
-rw-r--r--spec/models/environment_spec.rb11
-rw-r--r--spec/models/external_pull_request_spec.rb242
-rw-r--r--spec/models/group_spec.rb294
-rw-r--r--spec/models/import_failure_spec.rb6
-rw-r--r--spec/models/incident_management/timeline_event_spec.rb2
-rw-r--r--spec/models/integration_spec.rb44
-rw-r--r--spec/models/integrations/apple_app_store_spec.rb3
-rw-r--r--spec/models/integrations/asana_spec.rb14
-rw-r--r--spec/models/integrations/assembla_spec.rb39
-rw-r--r--spec/models/integrations/bamboo_spec.rb19
-rw-r--r--spec/models/integrations/base_chat_notification_spec.rb8
-rw-r--r--spec/models/integrations/base_issue_tracker_spec.rb6
-rw-r--r--spec/models/integrations/base_slack_notification_spec.rb2
-rw-r--r--spec/models/integrations/base_third_party_wiki_spec.rb6
-rw-r--r--spec/models/integrations/bugzilla_spec.rb2
-rw-r--r--spec/models/integrations/buildkite_spec.rb10
-rw-r--r--spec/models/integrations/chat_message/group_mention_message_spec.rb193
-rw-r--r--spec/models/integrations/confluence_spec.rb9
-rw-r--r--spec/models/integrations/custom_issue_tracker_spec.rb2
-rw-r--r--spec/models/integrations/drone_ci_spec.rb2
-rw-r--r--spec/models/integrations/microsoft_teams_spec.rb2
-rw-r--r--spec/models/integrations/prometheus_spec.rb8
-rw-r--r--spec/models/integrations/teamcity_spec.rb4
-rw-r--r--spec/models/integrations/unify_circuit_spec.rb2
-rw-r--r--spec/models/integrations/webex_teams_spec.rb2
-rw-r--r--spec/models/internal_id_spec.rb12
-rw-r--r--spec/models/issue_assignee_spec.rb8
-rw-r--r--spec/models/issue_spec.rb252
-rw-r--r--spec/models/label_link_spec.rb2
-rw-r--r--spec/models/lfs_objects_project_spec.rb2
-rw-r--r--spec/models/loose_foreign_keys/deleted_record_spec.rb2
-rw-r--r--spec/models/member_spec.rb17
-rw-r--r--spec/models/members/group_member_spec.rb9
-rw-r--r--spec/models/merge_request/diff_llm_summary_spec.rb18
-rw-r--r--spec/models/merge_request/metrics_spec.rb2
-rw-r--r--spec/models/merge_request_assignee_spec.rb4
-rw-r--r--spec/models/merge_request_diff_commit_spec.rb4
-rw-r--r--spec/models/merge_request_diff_file_spec.rb2
-rw-r--r--spec/models/merge_request_spec.rb46
-rw-r--r--spec/models/milestone_spec.rb46
-rw-r--r--spec/models/ml/experiment_spec.rb15
-rw-r--r--spec/models/ml/model_spec.rb62
-rw-r--r--spec/models/ml/model_version_spec.rb90
-rw-r--r--spec/models/namespace/package_setting_spec.rb6
-rw-r--r--spec/models/namespace/root_storage_statistics_spec.rb39
-rw-r--r--spec/models/namespace_spec.rb132
-rw-r--r--spec/models/oauth_access_token_spec.rb8
-rw-r--r--spec/models/organizations/organization_setting_spec.rb57
-rw-r--r--spec/models/organizations/organization_spec.rb21
-rw-r--r--spec/models/organizations/organization_user_spec.rb10
-rw-r--r--spec/models/packages/dependency_spec.rb4
-rw-r--r--spec/models/packages/maven/metadatum_spec.rb2
-rw-r--r--spec/models/packages/npm/metadatum_spec.rb4
-rw-r--r--spec/models/packages/package_spec.rb43
-rw-r--r--spec/models/pages/lookup_path_spec.rb15
-rw-r--r--spec/models/pages_deployment_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/performance_monitoring/prometheus_metric_spec.rb2
-rw-r--r--spec/models/performance_monitoring/prometheus_panel_group_spec.rb2
-rw-r--r--spec/models/performance_monitoring/prometheus_panel_spec.rb2
-rw-r--r--spec/models/personal_access_token_spec.rb14
-rw-r--r--spec/models/plan_limits_spec.rb172
-rw-r--r--spec/models/postgresql/detached_partition_spec.rb8
-rw-r--r--spec/models/preloaders/user_max_access_level_in_projects_preloader_spec.rb4
-rw-r--r--spec/models/project_label_spec.rb4
-rw-r--r--spec/models/project_setting_spec.rb3
-rw-r--r--spec/models/project_spec.rb362
-rw-r--r--spec/models/project_statistics_spec.rb27
-rw-r--r--spec/models/projects/topic_spec.rb4
-rw-r--r--spec/models/projects/triggered_hooks_spec.rb39
-rw-r--r--spec/models/protected_branch/push_access_level_spec.rb77
-rw-r--r--spec/models/protected_tag/create_access_level_spec.rb130
-rw-r--r--spec/models/release_highlight_spec.rb16
-rw-r--r--spec/models/release_spec.rb4
-rw-r--r--spec/models/remote_mirror_spec.rb8
-rw-r--r--spec/models/route_spec.rb4
-rw-r--r--spec/models/service_desk_setting_spec.rb59
-rw-r--r--spec/models/todo_spec.rb2
-rw-r--r--spec/models/user_custom_attribute_spec.rb10
-rw-r--r--spec/models/user_preference_spec.rb3
-rw-r--r--spec/models/user_spec.rb206
-rw-r--r--spec/models/users/merge_request_interaction_spec.rb2
-rw-r--r--spec/models/users_statistics_spec.rb2
-rw-r--r--spec/models/wiki_directory_spec.rb8
-rw-r--r--spec/models/work_item_spec.rb81
-rw-r--r--spec/models/work_items/parent_link_spec.rb4
-rw-r--r--spec/models/work_items/type_spec.rb4
-rw-r--r--spec/models/work_items/widgets/base_spec.rb6
-rw-r--r--spec/models/work_items/widgets/current_user_todos_spec.rb60
-rw-r--r--spec/models/work_items/widgets/milestone_spec.rb2
-rw-r--r--spec/policies/global_policy_spec.rb54
-rw-r--r--spec/policies/group_policy_spec.rb166
-rw-r--r--spec/policies/merge_request_policy_spec.rb31
-rw-r--r--spec/policies/note_policy_spec.rb2
-rw-r--r--spec/policies/project_policy_spec.rb217
-rw-r--r--spec/presenters/alert_management/alert_presenter_spec.rb18
-rw-r--r--spec/presenters/blob_presenter_spec.rb108
-rw-r--r--spec/presenters/ci/pipeline_presenter_spec.rb106
-rw-r--r--spec/presenters/ml/models_index_presenter_spec.rb33
-rw-r--r--spec/presenters/project_presenter_spec.rb29
-rw-r--r--spec/presenters/snippet_blob_presenter_spec.rb4
-rw-r--r--spec/requests/admin/users_controller_spec.rb20
-rw-r--r--spec/requests/api/admin/instance_clusters_spec.rb2
-rw-r--r--spec/requests/api/admin/plan_limits_spec.rb10
-rw-r--r--spec/requests/api/ci/job_artifacts_spec.rb2
-rw-r--r--spec/requests/api/ci/pipeline_schedules_spec.rb18
-rw-r--r--spec/requests/api/ci/variables_spec.rb7
-rw-r--r--spec/requests/api/container_repositories_spec.rb2
-rw-r--r--spec/requests/api/debian_group_packages_spec.rb29
-rw-r--r--spec/requests/api/debian_project_packages_spec.rb39
-rw-r--r--spec/requests/api/deployments_spec.rb2
-rw-r--r--spec/requests/api/discussions_spec.rb2
-rw-r--r--spec/requests/api/environments_spec.rb68
-rw-r--r--spec/requests/api/error_tracking/project_settings_spec.rb60
-rw-r--r--spec/requests/api/files_spec.rb8
-rw-r--r--spec/requests/api/graphql/boards/board_list_issues_query_spec.rb2
-rw-r--r--spec/requests/api/graphql/boards/board_lists_query_spec.rb2
-rw-r--r--spec/requests/api/graphql/ci/inherited_ci_variables_spec.rb178
-rw-r--r--spec/requests/api/graphql/ci/runner_spec.rb15
-rw-r--r--spec/requests/api/graphql/container_repository/container_repository_details_spec.rb2
-rw-r--r--spec/requests/api/graphql/gitlab_schema_spec.rb4
-rw-r--r--spec/requests/api/graphql/metrics/dashboard/annotations_spec.rb104
-rw-r--r--spec/requests/api/graphql/metrics/dashboard_query_spec.rb114
-rw-r--r--spec/requests/api/graphql/mutations/alert_management/prometheus_integration/create_spec.rb19
-rw-r--r--spec/requests/api/graphql/mutations/ci/job_token_scope/add_project_spec.rb15
-rw-r--r--spec/requests/api/graphql/mutations/ci/pipeline_schedule/create_spec.rb162
-rw-r--r--spec/requests/api/graphql/mutations/ci/pipeline_schedule/delete_spec.rb82
-rw-r--r--spec/requests/api/graphql/mutations/ci/pipeline_schedule/play_spec.rb80
-rw-r--r--spec/requests/api/graphql/mutations/ci/pipeline_schedule/take_ownership_spec.rb (renamed from spec/requests/api/graphql/mutations/ci/pipeline_schedule_take_ownership_spec.rb)0
-rw-r--r--spec/requests/api/graphql/mutations/ci/pipeline_schedule/update_spec.rb189
-rw-r--r--spec/requests/api/graphql/mutations/ci/pipeline_schedule_create_spec.rb151
-rw-r--r--spec/requests/api/graphql/mutations/ci/pipeline_schedule_delete_spec.rb82
-rw-r--r--spec/requests/api/graphql/mutations/ci/pipeline_schedule_play_spec.rb80
-rw-r--r--spec/requests/api/graphql/mutations/ci/pipeline_schedule_update_spec.rb151
-rw-r--r--spec/requests/api/graphql/mutations/ci/project_ci_cd_settings_update_spec.rb20
-rw-r--r--spec/requests/api/graphql/mutations/ci/runner/create_spec.rb32
-rw-r--r--spec/requests/api/graphql/mutations/issues/update_spec.rb4
-rw-r--r--spec/requests/api/graphql/mutations/notes/create/note_spec.rb2
-rw-r--r--spec/requests/api/graphql/mutations/notes/destroy_spec.rb2
-rw-r--r--spec/requests/api/graphql/mutations/notes/update/note_spec.rb2
-rw-r--r--spec/requests/api/graphql/mutations/snippets/destroy_spec.rb2
-rw-r--r--spec/requests/api/graphql/mutations/work_items/update_spec.rb4
-rw-r--r--spec/requests/api/graphql/project/alert_management/alert/metrics_dashboard_url_spec.rb85
-rw-r--r--spec/requests/api/graphql/project/alert_management/alerts_spec.rb1
-rw-r--r--spec/requests/api/graphql/project/incident_management/timeline_events_spec.rb2
-rw-r--r--spec/requests/api/graphql/project/jobs_spec.rb31
-rw-r--r--spec/requests/api/graphql/project/pipeline_spec.rb36
-rw-r--r--spec/requests/api/graphql/user_query_spec.rb47
-rw-r--r--spec/requests/api/group_clusters_spec.rb2
-rw-r--r--spec/requests/api/group_export_spec.rb120
-rw-r--r--spec/requests/api/group_variables_spec.rb7
-rw-r--r--spec/requests/api/groups_spec.rb99
-rw-r--r--spec/requests/api/helpers_spec.rb6
-rw-r--r--spec/requests/api/import_github_spec.rb27
-rw-r--r--spec/requests/api/internal/kubernetes_spec.rb54
-rw-r--r--spec/requests/api/lint_spec.rb10
-rw-r--r--spec/requests/api/merge_requests_spec.rb73
-rw-r--r--spec/requests/api/ml_model_packages_spec.rb146
-rw-r--r--spec/requests/api/npm_group_packages_spec.rb30
-rw-r--r--spec/requests/api/npm_instance_packages_spec.rb27
-rw-r--r--spec/requests/api/npm_project_packages_spec.rb99
-rw-r--r--spec/requests/api/project_attributes.yml3
-rw-r--r--spec/requests/api/project_clusters_spec.rb2
-rw-r--r--spec/requests/api/project_export_spec.rb124
-rw-r--r--spec/requests/api/project_hooks_spec.rb1
-rw-r--r--spec/requests/api/project_packages_spec.rb14
-rw-r--r--spec/requests/api/projects_spec.rb78
-rw-r--r--spec/requests/api/protected_branches_spec.rb13
-rw-r--r--spec/requests/api/protected_tags_spec.rb13
-rw-r--r--spec/requests/api/search_spec.rb12
-rw-r--r--spec/requests/api/settings_spec.rb105
-rw-r--r--spec/requests/api/statistics_spec.rb2
-rw-r--r--spec/requests/api/usage_data_spec.rb55
-rw-r--r--spec/requests/api/user_runners_spec.rb243
-rw-r--r--spec/requests/api/users_spec.rb165
-rw-r--r--spec/requests/git_http_spec.rb5
-rw-r--r--spec/requests/groups/observability_controller_spec.rb4
-rw-r--r--spec/requests/lfs_http_spec.rb2
-rw-r--r--spec/requests/openid_connect_spec.rb11
-rw-r--r--spec/requests/organizations/organizations_controller_spec.rb16
-rw-r--r--spec/requests/projects/alert_management_controller_spec.rb69
-rw-r--r--spec/requests/projects/incidents_controller_spec.rb116
-rw-r--r--spec/requests/projects/issues_controller_spec.rb7
-rw-r--r--spec/requests/projects/merge_requests/creations_spec.rb20
-rw-r--r--spec/requests/projects/merge_requests_controller_spec.rb1
-rw-r--r--spec/requests/projects/ml/candidates_controller_spec.rb23
-rw-r--r--spec/requests/projects/ml/experiments_controller_spec.rb27
-rw-r--r--spec/requests/projects/ml/models_controller_spec.rb67
-rw-r--r--spec/requests/projects/packages/package_files_controller_spec.rb2
-rw-r--r--spec/requests/projects/service_desk/custom_email_controller_spec.rb380
-rw-r--r--spec/requests/projects/service_desk_controller_spec.rb109
-rw-r--r--spec/requests/projects/tracing_controller_spec.rb68
-rw-r--r--spec/requests/search_controller_spec.rb6
-rw-r--r--spec/requests/users_controller_spec.rb28
-rw-r--r--spec/requests/verifies_with_email_spec.rb2
-rw-r--r--spec/routing/organizations/organizations_controller_routing_spec.rb11
-rw-r--r--spec/rubocop/cop/avoid_return_from_blocks_spec.rb10
-rw-r--r--spec/rubocop/cop/background_migration/avoid_silent_rescue_exceptions_spec.rb107
-rw-r--r--spec/rubocop/cop/gitlab/mark_used_feature_flags_spec.rb50
-rw-r--r--spec/rubocop/cop/gitlab/strong_memoize_attr_spec.rb38
-rw-r--r--spec/rubocop/cop/graphql/gid_expected_type_spec.rb20
-rw-r--r--spec/rubocop/cop/graphql/id_type_spec.rb4
-rw-r--r--spec/rubocop/cop/ignored_columns_spec.rb8
-rw-r--r--spec/rubocop/cop/migration/avoid_finalize_background_migration_spec.rb21
-rw-r--r--spec/rubocop/cop/qa/element_with_pattern_spec.rb2
-rw-r--r--spec/rubocop/cop/rake/require_spec.rb108
-rw-r--r--spec/rubocop/cop/rspec/before_all_role_assignment_spec.rb234
-rw-r--r--spec/rubocop/cop/search/avoid_checking_finished_on_deprecated_migrations_spec.rb31
-rw-r--r--spec/rubocop/cop/usage_data/distinct_count_by_large_foreign_key_spec.rb52
-rw-r--r--spec/rubocop/cop/usage_data/histogram_with_large_table_spec.rb140
-rw-r--r--spec/rubocop/cop/usage_data/instrumentation_superclass_spec.rb76
-rw-r--r--spec/rubocop/cop/usage_data/large_table_spec.rb10
-rw-r--r--spec/rubocop/cop_todo_spec.rb15
-rw-r--r--spec/rubocop/formatter/todo_formatter_spec.rb41
-rw-r--r--spec/scripts/generate_failed_package_and_test_mr_message_spec.rb2
-rw-r--r--spec/scripts/generate_message_to_run_e2e_pipeline_spec.rb2
-rw-r--r--spec/scripts/lib/glfm/update_example_snapshots_spec.rb24
-rw-r--r--spec/scripts/trigger-build_spec.rb1
-rw-r--r--spec/serializers/context_commits_diff_entity_spec.rb2
-rw-r--r--spec/serializers/diff_viewer_entity_spec.rb48
-rw-r--r--spec/serializers/environment_entity_spec.rb26
-rw-r--r--spec/serializers/issue_sidebar_basic_entity_spec.rb1
-rw-r--r--spec/serializers/lfs_file_lock_entity_spec.rb2
-rw-r--r--spec/serializers/merge_request_poll_widget_entity_spec.rb2
-rw-r--r--spec/serializers/prometheus_alert_entity_spec.rb22
-rw-r--r--spec/serializers/stage_entity_spec.rb6
-rw-r--r--spec/services/admin/plan_limits/update_service_spec.rb24
-rw-r--r--spec/services/alert_management/alerts/todo/create_service_spec.rb2
-rw-r--r--spec/services/application_settings/update_service_spec.rb9
-rw-r--r--spec/services/auth/dependency_proxy_authentication_service_spec.rb2
-rw-r--r--spec/services/auto_merge/merge_when_pipeline_succeeds_service_spec.rb171
-rw-r--r--spec/services/auto_merge_service_spec.rb21
-rw-r--r--spec/services/award_emojis/add_service_spec.rb6
-rw-r--r--spec/services/award_emojis/base_service_spec.rb37
-rw-r--r--spec/services/award_emojis/destroy_service_spec.rb6
-rw-r--r--spec/services/boards/issues/list_service_spec.rb10
-rw-r--r--spec/services/boards/lists/list_service_spec.rb6
-rw-r--r--spec/services/ci/create_pipeline_service/rules_spec.rb36
-rw-r--r--spec/services/ci/create_pipeline_service_spec.rb4
-rw-r--r--spec/services/ci/pipeline_processing/atomic_processing_service_spec.rb28
-rw-r--r--spec/services/ci/pipeline_processing/test_cases/dag_build_fails_test_skips_rollback_on_failure.yml47
-rw-r--r--spec/services/ci/pipeline_schedules/create_service_spec.rb86
-rw-r--r--spec/services/ci/pipeline_schedules/update_service_spec.rb55
-rw-r--r--spec/services/ci/pipeline_trigger_service_spec.rb4
-rw-r--r--spec/services/ci/process_sync_events_service_spec.rb4
-rw-r--r--spec/services/ci/register_job_service_spec.rb4
-rw-r--r--spec/services/ci/runners/register_runner_service_spec.rb4
-rw-r--r--spec/services/clusters/agent_tokens/create_service_spec.rb15
-rw-r--r--spec/services/clusters/agents/authorize_proxy_user_service_spec.rb16
-rw-r--r--spec/services/clusters/integrations/prometheus_health_check_service_spec.rb115
-rw-r--r--spec/services/design_management/generate_image_versions_service_spec.rb2
-rw-r--r--spec/services/draft_notes/create_service_spec.rb14
-rw-r--r--spec/services/environments/create_service_spec.rb3
-rw-r--r--spec/services/environments/update_service_spec.rb15
-rw-r--r--spec/services/error_tracking/issue_details_service_spec.rb33
-rw-r--r--spec/services/error_tracking/issue_latest_event_service_spec.rb35
-rw-r--r--spec/services/error_tracking/issue_update_service_spec.rb40
-rw-r--r--spec/services/error_tracking/list_issues_service_spec.rb88
-rw-r--r--spec/services/git/base_hooks_service_spec.rb17
-rw-r--r--spec/services/git/branch_hooks_service_spec.rb1
-rw-r--r--spec/services/git/tag_hooks_service_spec.rb1
-rw-r--r--spec/services/groups/participants_service_spec.rb73
-rw-r--r--spec/services/groups/update_service_spec.rb14
-rw-r--r--spec/services/groups/update_shared_runners_service_spec.rb183
-rw-r--r--spec/services/import/github_service_spec.rb44
-rw-r--r--spec/services/import_csv/preprocess_milestones_service_spec.rb83
-rw-r--r--spec/services/incident_management/issuable_escalation_statuses/after_update_service_spec.rb2
-rw-r--r--spec/services/integrations/group_mention_service_spec.rb143
-rw-r--r--spec/services/issuable/discussions_list_service_spec.rb2
-rw-r--r--spec/services/issuable/import_csv/base_service_spec.rb92
-rw-r--r--spec/services/issuable/process_assignees_spec.rb14
-rw-r--r--spec/services/issues/build_service_spec.rb1
-rw-r--r--spec/services/issues/create_service_spec.rb29
-rw-r--r--spec/services/issues/relative_position_rebalancing_service_spec.rb93
-rw-r--r--spec/services/issues/reopen_service_spec.rb6
-rw-r--r--spec/services/members/invite_service_spec.rb12
-rw-r--r--spec/services/merge_requests/after_create_service_spec.rb6
-rw-r--r--spec/services/merge_requests/cleanup_refs_service_spec.rb2
-rw-r--r--spec/services/merge_requests/merge_orchestration_service_spec.rb18
-rw-r--r--spec/services/merge_requests/merge_to_ref_service_spec.rb12
-rw-r--r--spec/services/merge_requests/mergeability_check_batch_service_spec.rb46
-rw-r--r--spec/services/merge_requests/refresh_service_spec.rb45
-rw-r--r--spec/services/merge_requests/reopen_service_spec.rb4
-rw-r--r--spec/services/merge_requests/update_service_spec.rb29
-rw-r--r--spec/services/metrics/dashboard/cluster_dashboard_service_spec.rb2
-rw-r--r--spec/services/milestones/create_service_spec.rb68
-rw-r--r--spec/services/milestones/update_service_spec.rb90
-rw-r--r--spec/services/namespace_settings/update_service_spec.rb16
-rw-r--r--spec/services/notes/post_process_service_spec.rb3
-rw-r--r--spec/services/notes/quick_actions_service_spec.rb4
-rw-r--r--spec/services/notification_service_spec.rb4
-rw-r--r--spec/services/packages/cleanup/execute_policy_service_spec.rb4
-rw-r--r--spec/services/packages/debian/find_or_create_package_service_spec.rb83
-rw-r--r--spec/services/packages/debian/process_changes_service_spec.rb140
-rw-r--r--spec/services/packages/npm/create_metadata_cache_service_spec.rb2
-rw-r--r--spec/services/packages/npm/create_package_service_spec.rb14
-rw-r--r--spec/services/packages/npm/generate_metadata_service_spec.rb6
-rw-r--r--spec/services/packages/nuget/extract_metadata_content_service_spec.rb64
-rw-r--r--spec/services/packages/nuget/extract_metadata_file_service_spec.rb100
-rw-r--r--spec/services/packages/nuget/metadata_extraction_service_spec.rb138
-rw-r--r--spec/services/packages/nuget/update_package_from_metadata_service_spec.rb2
-rw-r--r--spec/services/personal_access_tokens/last_used_service_spec.rb44
-rw-r--r--spec/services/personal_access_tokens/revoke_token_family_service_spec.rb18
-rw-r--r--spec/services/personal_access_tokens/rotate_service_spec.rb7
-rw-r--r--spec/services/projects/create_service_spec.rb30
-rw-r--r--spec/services/projects/destroy_service_spec.rb61
-rw-r--r--spec/services/projects/download_service_spec.rb4
-rw-r--r--spec/services/projects/participants_service_spec.rb16
-rw-r--r--spec/services/projects/update_service_spec.rb2
-rw-r--r--spec/services/prometheus/proxy_variable_substitution_service_spec.rb2
-rw-r--r--spec/services/quick_actions/interpret_service_spec.rb25
-rw-r--r--spec/services/resource_access_tokens/create_service_spec.rb16
-rw-r--r--spec/services/resource_events/synthetic_label_notes_builder_service_spec.rb2
-rw-r--r--spec/services/service_desk/custom_emails/create_service_spec.rb185
-rw-r--r--spec/services/service_desk/custom_emails/destroy_service_spec.rb95
-rw-r--r--spec/services/service_desk_settings/update_service_spec.rb14
-rw-r--r--spec/services/service_response_spec.rb13
-rw-r--r--spec/services/snippets/update_service_spec.rb2
-rw-r--r--spec/services/spam/spam_action_service_spec.rb3
-rw-r--r--spec/services/spam/spam_verdict_service_spec.rb61
-rw-r--r--spec/services/system_notes/time_tracking_service_spec.rb12
-rw-r--r--spec/services/test_hooks/project_service_spec.rb21
-rw-r--r--spec/services/todo_service_spec.rb51
-rw-r--r--spec/services/user_project_access_changed_service_spec.rb4
-rw-r--r--spec/services/users/allow_possible_spam_service_spec.rb24
-rw-r--r--spec/services/users/ban_service_spec.rb7
-rw-r--r--spec/services/users/disallow_possible_spam_service_spec.rb34
-rw-r--r--spec/services/web_hook_service_spec.rb11
-rw-r--r--spec/services/webauthn/authenticate_service_spec.rb6
-rw-r--r--spec/services/webauthn/register_service_spec.rb4
-rw-r--r--spec/services/work_items/export_csv_service_spec.rb2
-rw-r--r--spec/services/work_items/update_service_spec.rb36
-rw-r--r--spec/services/work_items/widgets/current_user_todos_service/update_service_spec.rb2
-rw-r--r--spec/simplecov_env.rb57
-rw-r--r--spec/spec_helper.rb39
-rw-r--r--spec/support/ability_check.rb2
-rw-r--r--spec/support/capybara.rb4
-rw-r--r--spec/support/database/click_house/hooks.rb55
-rw-r--r--spec/support/database/prevent_cross_joins.rb2
-rw-r--r--spec/support/db_cleaner.rb2
-rw-r--r--spec/support/finder_collection_allowlist.yml1
-rw-r--r--spec/support/formatters/json_formatter.rb13
-rw-r--r--spec/support/helpers/content_editor_helpers.rb10
-rw-r--r--spec/support/helpers/database/migration_testing_helpers.rb6
-rw-r--r--spec/support/helpers/database/multiple_databases_helpers.rb2
-rw-r--r--spec/support/helpers/emails_helper_test_helper.rb2
-rw-r--r--spec/support/helpers/features/autocomplete_helpers.rb13
-rw-r--r--spec/support/helpers/features/invite_members_modal_helpers.rb2
-rw-r--r--spec/support/helpers/features/iteration_helpers.rb2
-rw-r--r--spec/support/helpers/gitaly_setup.rb3
-rw-r--r--spec/support/helpers/graphql_helpers.rb2
-rw-r--r--spec/support/helpers/ldap_helpers.rb2
-rw-r--r--spec/support/helpers/next_found_instance_of.rb2
-rw-r--r--spec/support/helpers/next_instance_of.rb5
-rw-r--r--spec/support/helpers/redis_helpers.rb18
-rw-r--r--spec/support/helpers/reload_helpers.rb5
-rw-r--r--spec/support/helpers/require_migration.rb2
-rw-r--r--spec/support/helpers/stub_env.rb52
-rw-r--r--spec/support/helpers/test_env.rb2
-rw-r--r--spec/support/helpers/usage_data_helpers.rb2
-rw-r--r--spec/support/helpers/wait_for_requests.rb17
-rw-r--r--spec/support/import_export/configuration_helper.rb2
-rw-r--r--spec/support/import_export/export_file_helper.rb2
-rw-r--r--spec/support/matchers/exceed_query_limit.rb2
-rw-r--r--spec/support/matchers/have_native_text_validation_message.rb8
-rw-r--r--spec/support/matchers/result_matchers.rb66
-rw-r--r--spec/support/rspec.rb4
-rw-r--r--spec/support/rspec_order_todo.yml23
-rw-r--r--spec/support/shared_contexts/email_shared_context.rb5
-rw-r--r--spec/support/shared_contexts/features/integrations/integrations_shared_context.rb2
-rw-r--r--spec/support/shared_contexts/finders/packages/npm/package_finder_shared_context.rb14
-rw-r--r--spec/support/shared_contexts/lib/gitlab/sidekiq_logging/structured_logger_shared_context.rb21
-rw-r--r--spec/support/shared_contexts/merge_request_create_shared_context.rb4
-rw-r--r--spec/support/shared_contexts/merge_request_edit_shared_context.rb3
-rw-r--r--spec/support/shared_contexts/navbar_structure_context.rb1
-rw-r--r--spec/support/shared_contexts/prometheus/alert_shared_context.rb11
-rw-r--r--spec/support/shared_contexts/requests/api/npm_packages_metadata_shared_examples.rb40
-rw-r--r--spec/support/shared_contexts/requests/api/npm_packages_shared_context.rb6
-rw-r--r--spec/support/shared_contexts/services/service_ping/stubbed_service_ping_metrics_definitions_shared_context.rb2
-rw-r--r--spec/support/shared_contexts/user_contribution_events_shared_context.rb37
-rw-r--r--spec/support/shared_examples/ci/stage_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/config/metrics/every_metric_definition_shared_examples.rb3
-rw-r--r--spec/support/shared_examples/controllers/internal_event_tracking_examples.rb50
-rw-r--r--spec/support/shared_examples/controllers/metrics_dashboard_shared_examples.rb44
-rw-r--r--spec/support/shared_examples/controllers/repository_lfs_file_load_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/controllers/snowplow_event_tracking_examples.rb2
-rw-r--r--spec/support/shared_examples/controllers/uploads_actions_shared_examples.rb8
-rw-r--r--spec/support/shared_examples/features/cascading_settings_shared_examples.rb8
-rw-r--r--spec/support/shared_examples/features/content_editor_shared_examples.rb32
-rw-r--r--spec/support/shared_examples/features/discussion_comments_shared_example.rb57
-rw-r--r--spec/support/shared_examples/features/editable_merge_request_shared_examples.rb6
-rw-r--r--spec/support/shared_examples/features/inviting_members_shared_examples.rb34
-rw-r--r--spec/support/shared_examples/features/milestone_editing_shared_examples.rb4
-rw-r--r--spec/support/shared_examples/features/nav_sidebar_shared_examples.rb16
-rw-r--r--spec/support/shared_examples/features/packages_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/features/project_upload_files_shared_examples.rb16
-rw-r--r--spec/support/shared_examples/features/resolving_discussions_in_issues_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/features/rss_shared_examples.rb14
-rw-r--r--spec/support/shared_examples/features/sidebar/sidebar_due_date_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/features/wiki/user_creates_wiki_page_shared_examples.rb7
-rw-r--r--spec/support/shared_examples/features/wiki/user_previews_wiki_changes_shared_examples.rb3
-rw-r--r--spec/support/shared_examples/features/wiki/user_updates_wiki_page_shared_examples.rb10
-rw-r--r--spec/support/shared_examples/features/wiki/user_views_wiki_page_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/features/work_items_shared_examples.rb3
-rw-r--r--spec/support/shared_examples/finders/assignees_filter_shared_examples.rb12
-rw-r--r--spec/support/shared_examples/finders/issues_finder_shared_examples.rb12
-rw-r--r--spec/support/shared_examples/graphql/label_fields.rb2
-rw-r--r--spec/support/shared_examples/graphql/mutations/boards_list_create_shared_examples.rb4
-rw-r--r--spec/support/shared_examples/graphql/notes_quick_actions_for_work_items_shared_examples.rb15
-rw-r--r--spec/support/shared_examples/graphql/types/merge_request_interactions_type_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/lib/banzai/filters/sanitization_filter_shared_examples.rb4
-rw-r--r--spec/support/shared_examples/lib/gitlab/database/foreign_key_validators_shared_examples.rb48
-rw-r--r--spec/support/shared_examples/lib/gitlab/database/index_validators_shared_examples.rb38
-rw-r--r--spec/support/shared_examples/lib/gitlab/database/table_validators_shared_examples.rb84
-rw-r--r--spec/support/shared_examples/lib/gitlab/database/trigger_validators_shared_examples.rb33
-rw-r--r--spec/support/shared_examples/lib/gitlab/usage_data_counters/issuable_activity_shared_examples.rb23
-rw-r--r--spec/support/shared_examples/models/concerns/analytics/cycle_analytics/stage_event_model_examples.rb2
-rw-r--r--spec/support/shared_examples/models/concerns/protected_ref_access_examples.rb30
-rw-r--r--spec/support/shared_examples/models/concerns/protected_ref_deploy_key_access_examples.rb132
-rw-r--r--spec/support/shared_examples/models/database_event_tracking_shared_examples.rb7
-rw-r--r--spec/support/shared_examples/models/integrations/base_slash_commands_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/namespaces/traversal_examples.rb8
-rw-r--r--spec/support/shared_examples/namespaces/traversal_scope_examples.rb7
-rw-r--r--spec/support/shared_examples/nav_sidebar_shared_examples.rb36
-rw-r--r--spec/support/shared_examples/npm_sync_metadata_cache_worker_shared_examples.rb30
-rw-r--r--spec/support/shared_examples/observability/csp_shared_examples.rb172
-rw-r--r--spec/support/shared_examples/quick_actions/issuable/close_quick_action_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/quick_actions/merge_request/merge_quick_action_shared_examples.rb8
-rw-r--r--spec/support/shared_examples/quick_actions/work_item/type_change_quick_actions_shared_examples.rb6
-rw-r--r--spec/support/shared_examples/requests/api/debian_packages_shared_examples.rb1
-rw-r--r--spec/support/shared_examples/requests/api/graphql/issue_list_shared_examples.rb48
-rw-r--r--spec/support/shared_examples/requests/api/graphql/remote_development_shared_examples.rb50
-rw-r--r--spec/support/shared_examples/requests/api/ml_model_packages_shared_examples.rb18
-rw-r--r--spec/support/shared_examples/requests/api/npm_packages_shared_examples.rb29
-rw-r--r--spec/support/shared_examples/requests/api/npm_packages_tags_shared_examples.rb80
-rw-r--r--spec/support/shared_examples/requests/response_status_with_error_shared_examples.rb11
-rw-r--r--spec/support/shared_examples/services/auto_merge_shared_examples.rb182
-rw-r--r--spec/support/shared_examples/services/boards/issues_move_service_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/services/boards/lists_list_service_shared_examples.rb6
-rw-r--r--spec/support/shared_examples/services/issuable/issuable_import_csv_service_shared_examples.rb1
-rw-r--r--spec/support/shared_examples/views/nav_sidebar_shared_examples.rb25
-rw-r--r--spec/support/shared_examples/views/pipeline_status_changes_email.rb8
-rw-r--r--spec/support/shared_examples/views/preferred_language.rb19
-rw-r--r--spec/support/stub_dot_com_check.rb2
-rw-r--r--spec/support/system_exit_detected.rb3
-rw-r--r--spec/support/time_travel.rb21
-rw-r--r--spec/support/webmock.rb9
-rw-r--r--spec/support_specs/helpers/graphql_helpers_spec.rb2
-rw-r--r--spec/support_specs/matchers/exceed_query_limit_helpers_spec.rb4
-rw-r--r--spec/support_specs/matchers/result_matchers_spec.rb21
-rw-r--r--spec/support_specs/time_travel_spec.rb21
-rw-r--r--spec/tasks/dev_rake_spec.rb2
-rw-r--r--spec/tasks/gitlab/db_rake_spec.rb8
-rw-r--r--spec/tasks/gitlab/feature_categories_rake_spec.rb3
-rw-r--r--spec/tasks/gitlab/metrics_exporter_rake_spec.rb81
-rw-r--r--spec/tasks/gitlab/packages/events_rake_spec.rb55
-rw-r--r--spec/tasks/gitlab/shell_rake_spec.rb72
-rw-r--r--spec/tasks/gitlab/usage_data_rake_spec.rb17
-rw-r--r--spec/tooling/danger/experiments_spec.rb59
-rw-r--r--spec/tooling/danger/project_helper_spec.rb12
-rw-r--r--spec/tooling/lib/tooling/find_changes_spec.rb2
-rw-r--r--spec/tooling/lib/tooling/find_tests_spec.rb2
-rw-r--r--spec/tooling/lib/tooling/gettext_extractor_spec.rb2
-rw-r--r--spec/tooling/lib/tooling/predictive_tests_spec.rb2
-rw-r--r--spec/tooling/quality/test_level_spec.rb2
-rw-r--r--spec/tooling/rspec_flaky/config_spec.rb106
-rw-r--r--spec/tooling/rspec_flaky/example_spec.rb99
-rw-r--r--spec/tooling/rspec_flaky/flaky_example_spec.rb148
-rw-r--r--spec/tooling/rspec_flaky/flaky_examples_collection_spec.rb85
-rw-r--r--spec/tooling/rspec_flaky/listener_spec.rb228
-rw-r--r--spec/tooling/rspec_flaky/report_spec.rb138
-rw-r--r--spec/uploaders/avatar_uploader_spec.rb6
-rw-r--r--spec/uploaders/design_management/design_v432x230_uploader_spec.rb6
-rw-r--r--spec/uploaders/favicon_uploader_spec.rb6
-rw-r--r--spec/validators/cron_validator_spec.rb4
-rw-r--r--spec/validators/html_safety_validator_spec.rb2
-rw-r--r--spec/views/admin/application_settings/_slack.html.haml_spec.rb42
-rw-r--r--spec/views/admin/application_settings/general.html.haml_spec.rb5
-rw-r--r--spec/views/explore/projects/topic.html.haml_spec.rb24
-rw-r--r--spec/views/groups/packages/index.html.haml_spec.rb18
-rw-r--r--spec/views/layouts/_head.html.haml_spec.rb8
-rw-r--r--spec/views/layouts/application.html.haml_spec.rb1
-rw-r--r--spec/views/layouts/devise.html.haml_spec.rb1
-rw-r--r--spec/views/layouts/devise_empty.html.haml_spec.rb1
-rw-r--r--spec/views/layouts/fullscreen.html.haml_spec.rb1
-rw-r--r--spec/views/layouts/signup_onboarding.html.haml_spec.rb1
-rw-r--r--spec/views/layouts/simple_registration.html.haml_spec.rb7
-rw-r--r--spec/views/layouts/terms.html.haml_spec.rb1
-rw-r--r--spec/views/notify/approved_merge_request_email.html.haml_spec.rb2
-rw-r--r--spec/views/notify/import_issues_csv_email.html.haml_spec.rb29
-rw-r--r--spec/views/notify/pipeline_failed_email.html.haml_spec.rb17
-rw-r--r--spec/views/notify/pipeline_failed_email.text.erb_spec.rb55
-rw-r--r--spec/views/notify/pipeline_fixed_email.html.haml_spec.rb17
-rw-r--r--spec/views/notify/pipeline_fixed_email.text.erb_spec.rb17
-rw-r--r--spec/views/notify/pipeline_success_email.html.haml_spec.rb17
-rw-r--r--spec/views/notify/pipeline_success_email.text.erb_spec.rb17
-rw-r--r--spec/views/profiles/keys/_key_details.html.haml_spec.rb15
-rw-r--r--spec/views/profiles/show.html.haml_spec.rb2
-rw-r--r--spec/views/projects/commit/show.html.haml_spec.rb25
-rw-r--r--spec/views/projects/edit.html.haml_spec.rb22
-rw-r--r--spec/views/projects/packages/index.html.haml_spec.rb18
-rw-r--r--spec/views/projects/pipelines/show.html.haml_spec.rb1
-rw-r--r--spec/views/projects/runners/_project_runners.html.haml_spec.rb59
-rw-r--r--spec/views/registrations/welcome/show.html.haml_spec.rb2
-rw-r--r--spec/views/search/_results.html.haml_spec.rb3
-rw-r--r--spec/views/shared/notes/_form.html.haml_spec.rb30
-rw-r--r--spec/workers/bulk_imports/entity_worker_spec.rb2
-rw-r--r--spec/workers/bulk_imports/export_request_worker_spec.rb30
-rw-r--r--spec/workers/bulk_imports/finish_batched_pipeline_worker_spec.rb75
-rw-r--r--spec/workers/bulk_imports/pipeline_batch_worker_spec.rb136
-rw-r--r--spec/workers/bulk_imports/pipeline_worker_spec.rb46
-rw-r--r--spec/workers/bulk_imports/relation_export_worker_spec.rb24
-rw-r--r--spec/workers/ci/merge_requests/cleanup_ref_worker_spec.rb47
-rw-r--r--spec/workers/ci/pipeline_cleanup_ref_worker_spec.rb61
-rw-r--r--spec/workers/container_registry/cleanup_worker_spec.rb19
-rw-r--r--spec/workers/container_registry/record_data_repair_detail_worker_spec.rb11
-rw-r--r--spec/workers/every_sidekiq_worker_spec.rb39
-rw-r--r--spec/workers/gitlab/github_import/stage/import_attachments_worker_spec.rb2
-rw-r--r--spec/workers/gitlab/github_import/stage/import_collaborators_worker_spec.rb2
-rw-r--r--spec/workers/gitlab/github_import/stage/import_issue_events_worker_spec.rb2
-rw-r--r--spec/workers/gitlab/github_import/stage/import_issues_and_diff_notes_worker_spec.rb2
-rw-r--r--spec/workers/gitlab/github_import/stage/import_notes_worker_spec.rb2
-rw-r--r--spec/workers/incident_management/close_incident_worker_spec.rb2
-rw-r--r--spec/workers/integrations/execute_worker_spec.rb14
-rw-r--r--spec/workers/integrations/group_mention_worker_spec.rb65
-rw-r--r--spec/workers/jira_connect/retry_request_worker_spec.rb6
-rw-r--r--spec/workers/merge_requests/mergeability_check_batch_worker_spec.rb54
-rw-r--r--spec/workers/packages/debian/process_changes_worker_spec.rb133
-rw-r--r--spec/workers/packages/nuget/extraction_worker_spec.rb2
-rw-r--r--spec/workers/pipeline_schedule_worker_spec.rb14
-rw-r--r--spec/workers/redis_migration_worker_spec.rb73
-rw-r--r--spec/workers/run_pipeline_schedule_worker_spec.rb23
-rwxr-xr-xtooling/bin/find_only_allowed_files_changes2
-rwxr-xr-xtooling/bin/gettext_extractor17
-rw-r--r--tooling/danger/analytics_instrumentation.rb2
-rw-r--r--tooling/danger/config_files.rb2
-rw-r--r--tooling/danger/customer_success.rb4
-rw-r--r--tooling/danger/database_dictionary.rb2
-rw-r--r--tooling/danger/datateam.rb8
-rw-r--r--tooling/danger/experiments.rb34
-rw-r--r--tooling/danger/project_helper.rb6
-rw-r--r--tooling/danger/specs/feature_category_suggestion.rb2
-rw-r--r--tooling/danger/stable_branch.rb4
-rw-r--r--tooling/lib/tooling/kubernetes_client.rb2
-rw-r--r--tooling/lib/tooling/mappings/view_to_js_mappings.rb4
-rw-r--r--tooling/rspec_flaky/config.rb27
-rw-r--r--tooling/rspec_flaky/example.rb68
-rw-r--r--tooling/rspec_flaky/flaky_example.rb59
-rw-r--r--tooling/rspec_flaky/flaky_examples_collection.rb38
-rw-r--r--tooling/rspec_flaky/listener.rb70
-rw-r--r--tooling/rspec_flaky/report.rb57
-rw-r--r--vendor/gems/attr_encrypted/.gitlab-ci.yml26
-rw-r--r--vendor/gems/attr_encrypted/Gemfile.lock44
-rw-r--r--vendor/gems/attr_encrypted/attr_encrypted.gemspec2
-rw-r--r--vendor/gems/bundler-checksum/.gitlab-ci.yml26
-rw-r--r--vendor/gems/cloud_profiler_agent/.gitlab-ci.yml37
-rw-r--r--vendor/gems/devise-pbkdf2-encryptable/.gitlab-ci.yml33
-rw-r--r--vendor/gems/gitlab_active_record/.gitlab-ci.yml28
-rw-r--r--vendor/gems/gitlab_active_record/Gemfile6
-rw-r--r--vendor/gems/gitlab_active_record/Gemfile.lock54
-rw-r--r--vendor/gems/gitlab_active_record/LICENSE7
-rw-r--r--vendor/gems/gitlab_active_record/Rakefile8
-rwxr-xr-xvendor/gems/gitlab_active_record/bin/console15
-rwxr-xr-xvendor/gems/gitlab_active_record/bin/setup8
-rw-r--r--vendor/gems/gitlab_active_record/gitlab_active_record.gemspec29
-rw-r--r--vendor/gems/gitlab_active_record/lib/gitlab_active_record.rb7
-rw-r--r--vendor/gems/gitlab_active_record/lib/gitlab_active_record/version.rb5
-rw-r--r--vendor/gems/gitlab_active_record/spec/gitlab_active_record_spec.rb7
-rw-r--r--vendor/gems/gitlab_active_record/spec/spec_helper.rb15
-rw-r--r--vendor/gems/ipynbdiff/.gitignore2
-rw-r--r--vendor/gems/ipynbdiff/.gitlab-ci.yml34
-rw-r--r--vendor/gems/ipynbdiff/Gemfile.lock67
-rw-r--r--vendor/gems/ipynbdiff/ipynbdiff.gemspec34
-rw-r--r--vendor/gems/ipynbdiff/lib/ipynbdiff.rb23
-rw-r--r--vendor/gems/ipynbdiff/lib/output_transformer.rb72
-rw-r--r--vendor/gems/ipynbdiff/lib/symbol_map.rb107
-rw-r--r--vendor/gems/ipynbdiff/lib/symbolized_markdown_helper.rb26
-rw-r--r--vendor/gems/ipynbdiff/lib/transformer.rb112
-rw-r--r--vendor/gems/ipynbdiff/lib/version.rb5
-rw-r--r--vendor/gems/ipynbdiff/spec/benchmark.rb64
-rw-r--r--vendor/gems/ipynbdiff/spec/ipynbdiff_spec.rb126
-rw-r--r--vendor/gems/ipynbdiff/spec/symbol_map_spec.rb58
-rw-r--r--vendor/gems/ipynbdiff/spec/test_helper.rb23
-rw-r--r--vendor/gems/ipynbdiff/spec/transformer_spec.rb117
-rw-r--r--vendor/gems/mail-smtp_pool/.gitlab-ci.yml36
-rw-r--r--vendor/gems/microsoft_graph_mailer/.gitlab-ci.yml37
-rw-r--r--vendor/gems/omniauth-azure-oauth2/.gitlab-ci.yml41
-rw-r--r--vendor/gems/omniauth-gitlab/.gitlab-ci.yml41
-rw-r--r--vendor/gems/omniauth-salesforce/.gitlab-ci.yml41
-rw-r--r--vendor/gems/omniauth_crowd/.gitlab-ci.yml41
-rw-r--r--vendor/gems/sidekiq-reliable-fetch/.gitlab-ci.yml89
-rw-r--r--vendor/gems/sidekiq-reliable-fetch/lib/sidekiq/base_reliable_fetch.rb5
-rw-r--r--vendor/project_templates/typo3_distribution.tar.gzbin71800 -> 77071 bytes
-rw-r--r--workhorse/.tool-versions2
-rw-r--r--workhorse/Makefile4
-rw-r--r--workhorse/go.mod32
-rw-r--r--workhorse/go.sum63
-rw-r--r--workhorse/internal/lsif_transformer/parser/hovers.go27
-rw-r--r--workhorse/internal/lsif_transformer/parser/hovers_test.go3
-rw-r--r--workhorse/internal/lsif_transformer/parser/ranges.go52
-rw-r--r--workhorse/internal/lsif_transformer/parser/ranges_test.go20
-rw-r--r--workhorse/internal/lsif_transformer/parser/result_set.go100
-rw-r--r--workhorse/internal/lsif_transformer/parser/result_set_test.go48
-rw-r--r--workhorse/internal/senddata/contentprocessor/contentprocessor_test.go6
-rw-r--r--workhorse/internal/utils/svg/svg.go2
-rw-r--r--yarn.lock369
5872 files changed, 193552 insertions, 145945 deletions
diff --git a/.dockerignore b/.dockerignore
index 0782627230a..a2d54fa65dd 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -80,4 +80,3 @@
/spec/
/symbol/
/tmp/
-/vendor/
diff --git a/.eslintrc.yml b/.eslintrc.yml
index 1bb28aae21a..956758255cb 100644
--- a/.eslintrc.yml
+++ b/.eslintrc.yml
@@ -117,6 +117,14 @@ rules:
message: 'Migrate to GlSkeletonLoader, or import GlDeprecatedSkeletonLoading.'
- selector: ImportSpecifier[imported.name='GlSafeHtmlDirective']
message: 'Use directive at ~/vue_shared/directives/safe_html.js instead.'
+ - selector: Literal[value=/docs.gitlab.+\u002Fee/]
+ message: 'No hard coded url, use `DOCS_URL_IN_EE_DIR` in `jh_else_ce/lib/utils/url_utility`'
+ - selector: Literal[value=/(?=.*docs.gitlab.*)(?=^(?!.*\u002Fee\b).*$)/]
+ message: 'No hard coded url, use `DOCS_URL` in `jh_else_ce/lib/utils/url_utility`'
+ - selector: Literal[value=/(?=.*about.gitlab.*)(?=^(?!.*\u002Fblog\b).*$)/]
+ message: 'No hard coded url, use `PROMO_URL` in `jh_else_ce/lib/utils/url_utility`'
+ - selector: TemplateLiteral[expressions.0.name=DOCS_URL] > TemplateElement[value.cooked=/\u002Fjh/]
+ message: '`/ee` or `/jh` path found in docs url, use `DOCS_URL_IN_EE_DIR` in `jh_else_ce/lib/utils/url_utility`'
no-restricted-imports:
- error
- paths:
@@ -155,6 +163,8 @@ overrides:
message: 'Migrate to GlSkeletonLoader, or import GlDeprecatedSkeletonLoading.'
- selector: CallExpression[arguments.length=1][arguments.0.type='Literal'] CallExpression[callee.property.name='toBe'] CallExpression[callee.property.name='attributes'][arguments.length=1][arguments.0.value='disabled']
message: Avoid asserting disabled attribute exact value, because Vue.js 2 and Vue.js 3 renders it differently. Use toBeDefined / toBeUndefined instead
+ - selector: MemberExpression[object.object.name='Vue'][object.property.name='config'][property.name='errorHandler']
+ message: 'Use setErrorHandler/resetVueErrorHandler from helpers/set_vue_error_handler.js instead.'
no-unsanitized/method: off
no-unsanitized/property: off
- files:
diff --git a/.gitignore b/.gitignore
index 9723e537f1c..881e08d5a14 100644
--- a/.gitignore
+++ b/.gitignore
@@ -47,6 +47,7 @@ eslint-report.html
/config/puma.rb
/config/secrets.yml
/config/sidekiq.yml
+/config/click_house.yml
/config/registry.key
/coverage/*
/db/*.sqlite3
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 63068cfee1b..fc2f061bd81 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -13,6 +13,7 @@ stages:
- pages
- notify
- release-environments
+ - benchmark
# always use `gitlab-org` runners, however
# in cases where jobs require Docker-in-Docker, the job
@@ -28,20 +29,20 @@ default:
.default-ruby-variables: &default-ruby-variables
RUBY_VERSION: "3.0"
- OMNIBUS_GITLAB_RUBY3_BUILD: "true"
- OMNIBUS_GITLAB_CACHE_EDITION: "GITLAB_RUBY3"
-.backcompat-ruby-variables: &backcompat-ruby-variables
- RUBY_VERSION: "2.7"
- OMNIBUS_GITLAB_RUBY2_BUILD: "true"
- OMNIBUS_GITLAB_CACHE_EDITION: "GITLAB_RUBY2"
+.next-ruby-variables: &next-ruby-variables
+ RUBY_VERSION: "3.1"
.default-branch-pipeline-failure-variables: &default-branch-pipeline-failure-variables
CREATE_RAILS_TEST_FAILURE_ISSUES: "true"
+ CREATE_RAILS_SLOW_TEST_ISSUES: "true"
workflow:
name: '$PIPELINE_NAME'
rules:
+ - if: '$CI_PROJECT_PATH == "gitlab-org/gitaly" && $CI_PIPELINE_SOURCE == "parent_pipeline" && $GITALY_TEST'
+ variables:
+ PIPELINE_NAME: 'Gitaly Rails Test Pipeline'
# If `$FORCE_GITLAB_CI` is set, create a pipeline.
- if: '$FORCE_GITLAB_CI'
variables:
@@ -54,10 +55,10 @@ workflow:
# they serve no purpose and will run anyway when the changes are merged.
- if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^release-tools\/\d+\.\d+\.\d+-rc\d+$/ && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME =~ /^[\d-]+-stable(-ee)?$/ && $CI_PROJECT_PATH == "gitlab-org/gitlab"'
when: never
- # For merge requests running exclusively in Ruby 2.7
- - if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-in-ruby2/'
+ # For merge requests running exclusively in Ruby 3.1
+ - if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-in-ruby3_1/'
variables:
- <<: *backcompat-ruby-variables
+ <<: *next-ruby-variables
PIPELINE_NAME: 'Ruby $RUBY_VERSION $CI_MERGE_REQUEST_EVENT_TYPE MR pipeline'
NO_SOURCEMAPS: 'true'
- if: '$CI_MERGE_REQUEST_LABELS =~ /Community contribution/'
@@ -79,10 +80,10 @@ workflow:
<<: *default-branch-pipeline-failure-variables
CRYSTALBALL: "true"
PIPELINE_NAME: 'Scheduled Ruby $RUBY_VERSION $CI_COMMIT_BRANCH branch pipeline'
- # Run pipelines for ruby2 branch
- - if: '$CI_COMMIT_BRANCH == "ruby2" && $CI_PIPELINE_SOURCE == "schedule"'
+ # Run pipelines for ruby3_1 branch
+ - if: '$CI_COMMIT_BRANCH == "ruby3_1" && $CI_PIPELINE_SOURCE == "schedule"'
variables:
- <<: *backcompat-ruby-variables
+ <<: *next-ruby-variables
PIPELINE_NAME: 'Scheduled Ruby $RUBY_VERSION $CI_COMMIT_BRANCH branch pipeline'
# This work around https://gitlab.com/gitlab-org/gitlab/-/issues/332411 whichs prevents usage of dependency proxy
# when pipeline is triggered by a project access token.
@@ -142,7 +143,6 @@ variables:
UBI_VERSION: "8.6"
CHROME_VERSION: "113"
DOCKER_VERSION: "23.0.1"
- RUBY_VERSION: "2.7"
RUBYGEMS_VERSION: "3.4"
GO_VERSION: "1.20"
RUST_VERSION: "1.65"
@@ -152,18 +152,19 @@ variables:
GITLAB_WORKHORSE_FOLDER: "gitlab-workhorse"
KNAPSACK_RSPEC_SUITE_REPORT_PATH: knapsack/report-master.json
RSPEC_CHANGED_FILES_PATH: rspec/changed_files.txt
+ RSPEC_FAIL_FAST_THRESHOLD: 20
+ RSPEC_FAST_QUARANTINE_LOCAL_PATH: rspec/fast_quarantine-gitlab.txt
RSPEC_FOSS_IMPACT_PIPELINE_TEMPLATE_YML: .gitlab/ci/rails/rspec-foss-impact.gitlab-ci.yml.erb
- RSPEC_PREDICTIVE_PIPELINE_TEMPLATE_YML: .gitlab/ci/rails/rspec-predictive.gitlab-ci.yml.erb
RSPEC_LAST_RUN_RESULTS_FILE: rspec/rspec_last_run_results.txt
RSPEC_MATCHING_JS_FILES_PATH: rspec/js_matching_files.txt
- RSPEC_VIEWS_INCLUDING_PARTIALS_PATH: rspec/views_including_partials.txt
- RSPEC_MATCHING_TESTS_PATH: rspec/matching_tests.txt
- RSPEC_MATCHING_TESTS_FOSS_PATH: rspec/matching_tests-foss.txt
RSPEC_MATCHING_TESTS_EE_PATH: rspec/matching_tests-ee.txt
+ RSPEC_MATCHING_TESTS_FOSS_PATH: rspec/matching_tests-foss.txt
+ RSPEC_MATCHING_TESTS_PATH: rspec/matching_tests.txt
RSPEC_PACKED_TESTS_MAPPING_PATH: crystalball/packed-mapping.json
+ RSPEC_PREDICTIVE_PIPELINE_TEMPLATE_YML: .gitlab/ci/rails/rspec-predictive.gitlab-ci.yml.erb
RSPEC_PROFILING_FOLDER_PATH: rspec/profiling
RSPEC_TESTS_MAPPING_PATH: crystalball/mapping.json
- RSPEC_FAST_QUARANTINE_LOCAL_PATH: rspec/fast_quarantine-gitlab.txt
+ RSPEC_VIEWS_INCLUDING_PARTIALS_PATH: rspec/views_including_partials.txt
TMP_TEST_FOLDER: "${CI_PROJECT_DIR}/tmp/tests"
TMP_TEST_GITLAB_WORKHORSE_PATH: "${TMP_TEST_FOLDER}/${GITLAB_WORKHORSE_FOLDER}"
diff --git a/.gitlab/CODEOWNERS b/.gitlab/CODEOWNERS
index 5db7ba5b109..38b60413db5 100644
--- a/.gitlab/CODEOWNERS
+++ b/.gitlab/CODEOWNERS
@@ -20,12 +20,10 @@ GITALY_SERVER_VERSION @project_278964_bot6 @gitlab-org/maintainers/rails-backend
/doc/**/*.jpg
/doc/**/*.png
/data/deprecations/*.yml
-/data/removals/**/*.yml
## Technical writing files that do not need `*` rule approval,
## but still require an approval from a TW team DRI for each file.
/data/deprecations/templates/ @marcel.amirault @sarahgerman @gitlab-org/tw-leadership
-/data/removals/templates/ @marcel.amirault @sarahgerman @gitlab-org/tw-leadership
.markdownlint.yml @marcel.amirault @eread @aqualls @gitlab-org/tw-leadership
/doc/.markdownlint/ @marcel.amirault @eread @aqualls @gitlab-org/tw-leadership
/doc/.vale/ @marcel.amirault @eread @aqualls @gitlab-org/tw-leadership
@@ -61,6 +59,10 @@ GITALY_SERVER_VERSION @project_278964_bot6 @gitlab-org/maintainers/rails-backend
/ee/app/finders/
/rubocop/rubocop-migrations.yml
+[Create::IDE - Remote Development Scripts] @gitlab-org/maintainers/remote-development/backend
+# This entry must occur before `/scripts/` in order to be matched first
+/scripts/remote_development/
+
[Engineering Productivity] @gl-quality/eng-prod
/.gitlab-ci.yml
/.gitlab/ci/
@@ -74,6 +76,7 @@ GITALY_SERVER_VERSION @project_278964_bot6 @gitlab-org/maintainers/rails-backend
/.gitlab/ci/test-on-gdk/ @gl-quality/eng-prod @gl-quality/qe-maintainers
Dangerfile
/danger/
+/gems/gem.gitlab-ci.yml
/tooling/danger/
/scripts/
/scripts/frontend/ @gl-quality/eng-prod @gitlab-org/maintainers/frontend
@@ -83,6 +86,7 @@ Dangerfile
^[Backend Static Code Analysis] @gl-quality/eng-prod @dstull @splattael
.rubocop*.yml
.rubocop_todo/
+/gems/config/rubocop.yml
/rubocop/
/spec/rubocop/
@@ -392,29 +396,35 @@ lib/gitlab/checks/**
^[Documentation Directories] @gl-docsteam
/doc/
/data/deprecations/
-/data/removals/
^[Documentation Pages]
# This block is managed by the rake script at lib/tasks/gitlab/tw/codeowners.rake, manual updates will be overwritten!
# Begin rake-managed-docs-block
+/doc/administration/analytics/ @lciutacu
/doc/administration/application_settings_cache.md @jglassman1
-/doc/administration/audit_event_streaming.md @eread
+/doc/administration/audit_event_streaming/ @eread
/doc/administration/audit_events.md @eread
/doc/administration/audit_reports.md @eread
/doc/administration/auditor_users.md @jglassman1
/doc/administration/auth/ @jglassman1
+/doc/administration/backup_restore/ @axil
/doc/administration/cicd.md @marcel.amirault
/doc/administration/clusters/ @phillipwells
/doc/administration/compliance.md @eread
/doc/administration/configure.md @axil
/doc/administration/consul.md @axil
+/doc/administration/credentials_inventory.md @jglassman1
+/doc/administration/custom_project_templates.md @aqualls @msedlakjakubowski
+/doc/administration/diff_limits.md @aqualls @msedlakjakubowski
/doc/administration/docs_self_host.md @axil
/doc/administration/encrypted_configuration.md @axil
/doc/administration/environment_variables.md @axil
/doc/administration/external_pipeline_validation.md @marcel.amirault
+/doc/administration/external_users.md @jglassman1
/doc/administration/feature_flags.md @axil
/doc/administration/file_hooks.md @eread @ashrafkhamis
/doc/administration/geo/ @axil
+/doc/administration/geo_sites.md @axil
/doc/administration/get_started.md @kpaizee
/doc/administration/git_protocol.md @aqualls @msedlakjakubowski
/doc/administration/gitaly/ @eread
@@ -432,14 +442,20 @@ lib/gitlab/checks/**
/doc/administration/issue_closing_pattern.md @aqualls
/doc/administration/job_artifacts.md @marcel.amirault
/doc/administration/job_logs.md @fneill
+/doc/administration/labels.md @msedlakjakubowski
/doc/administration/lfs/ @aqualls @msedlakjakubowski
/doc/administration/libravatar.md @axil
+/doc/administration/license.md @fneill
+/doc/administration/license_file.md @fneill
/doc/administration/load_balancer.md @axil
/doc/administration/logs/ @axil
/doc/administration/logs/index.md @msedlakjakubowski
/doc/administration/maintenance_mode/ @axil
/doc/administration/merge_request_diffs.md @aqualls @msedlakjakubowski
+/doc/administration/merge_requests_approvals.md @aqualls @msedlakjakubowski
+/doc/administration/moderate_users.md @jglassman1
/doc/administration/monitoring/github_imports.md @eread @ashrafkhamis
+/doc/administration/monitoring/health_check.md @msedlakjakubowski
/doc/administration/monitoring/index.md @msedlakjakubowski
/doc/administration/monitoring/ip_allowlist.md @jglassman1
/doc/administration/monitoring/performance/gitlab_configuration.md @msedlakjakubowski
@@ -472,11 +488,36 @@ lib/gitlab/checks/**
/doc/administration/reference_architectures/ @axil
/doc/administration/reply_by_email.md @msedlakjakubowski
/doc/administration/reply_by_email_postfix_setup.md @axil
+/doc/administration/reporting/ @phillipwells
+/doc/administration/reporting/spamcheck.md @axil
/doc/administration/repository_checks.md @eread
/doc/administration/repository_storage_paths.md @eread
/doc/administration/repository_storage_types.md @eread
/doc/administration/restart_gitlab.md @axil
+/doc/administration/review_abuse_reports.md @phillipwells
/doc/administration/server_hooks.md @eread
+/doc/administration/settings/account_and_limit_settings.md @aqualls @msedlakjakubowski
+/doc/administration/settings/deprecated_api_rate_limits.md @aqualls @msedlakjakubowski
+/doc/administration/settings/git_lfs_rate_limits.md @aqualls @msedlakjakubowski
+/doc/administration/settings/gitaly_timeouts.md @eread
+/doc/administration/settings/import_export_rate_limits.md @eread @ashrafkhamis
+/doc/administration/settings/incident_management_rate_limits.md @msedlakjakubowski
+/doc/administration/settings/index.md @aqualls @msedlakjakubowski
+/doc/administration/settings/instance_template_repository.md @aqualls @msedlakjakubowski
+/doc/administration/settings/package_registry_rate_limits.md @phillipwells
+/doc/administration/settings/project_integration_management.md @eread @ashrafkhamis
+/doc/administration/settings/push_event_activities_limit.md @aqualls @msedlakjakubowski
+/doc/administration/settings/rate_limit_on_issues_creation.md @msedlakjakubowski
+/doc/administration/settings/rate_limit_on_notes_creation.md @msedlakjakubowski
+/doc/administration/settings/rate_limit_on_pipelines_creation.md @marcel.amirault
+/doc/administration/settings/rate_limit_on_projects_api.md @lciutacu
+/doc/administration/settings/rate_limit_on_users_api.md @jglassman1
+/doc/administration/settings/rate_limits_on_git_ssh_operations.md @aqualls @msedlakjakubowski
+/doc/administration/settings/scim_setup.md @jglassman1
+/doc/administration/settings/security_and_compliance.md @rdickenson
+/doc/administration/settings/terraform_limits.md @phillipwells
+/doc/administration/settings/third_party_offers.md @lciutacu
+/doc/administration/settings/visibility_and_access_controls.md @aqualls @msedlakjakubowski
/doc/administration/sidekiq/ @axil
/doc/administration/sidekiq/sidekiq_memory_killer.md @jglassman1
/doc/administration/silent_mode/ @axil
@@ -506,6 +547,7 @@ lib/gitlab/checks/**
/doc/api/commits.md @aqualls @msedlakjakubowski
/doc/api/container_registry.md @marcel.amirault
/doc/api/custom_attributes.md @msedlakjakubowski
+/doc/api/database_migrations.md @aqualls
/doc/api/dependencies.md @rdickenson
/doc/api/dependency_proxy.md @marcel.amirault
/doc/api/deploy_keys.md @phillipwells
@@ -595,7 +637,7 @@ lib/gitlab/checks/**
/doc/api/project_aliases.md @aqualls @msedlakjakubowski
/doc/api/project_badges.md @aqualls @msedlakjakubowski
/doc/api/project_clusters.md @phillipwells
-/doc/api/project_import_export.md @aqualls @msedlakjakubowski
+/doc/api/project_import_export.md @eread @ashrafkhamis
/doc/api/project_job_token_scopes.md @marcel.amirault
/doc/api/project_level_variables.md @marcel.amirault
/doc/api/project_relations_export.md @eread @ashrafkhamis
@@ -690,12 +732,10 @@ lib/gitlab/checks/**
/doc/development/distribution/ @axil
/doc/development/documentation/ @sselhorn
/doc/development/export_csv.md @eread @ashrafkhamis
+/doc/development/fe_guide/ @sselhorn
/doc/development/fe_guide/customizable_dashboards.md @lciutacu
-/doc/development/fe_guide/dark_mode.md @sselhorn
-/doc/development/fe_guide/graphql.md @sselhorn
/doc/development/fe_guide/merge_request_widget_extensions.md @aqualls
/doc/development/fe_guide/source_editor.md @aqualls @msedlakjakubowski
-/doc/development/fe_guide/view_component.md @sselhorn
/doc/development/feature_categorization/ @sselhorn
/doc/development/feature_development.md @sselhorn
/doc/development/feature_flags/ @sselhorn
@@ -716,6 +756,7 @@ lib/gitlab/checks/**
/doc/development/integrations/ @eread @ashrafkhamis
/doc/development/integrations/secure.md @rdickenson
/doc/development/integrations/secure_partner_integration.md @rdickenson
+/doc/development/internal_analytics/ @lciutacu
/doc/development/internal_api/ @aqualls @msedlakjakubowski
/doc/development/internal_users.md @sselhorn
/doc/development/issuable-like-models.md @msedlakjakubowski
@@ -735,6 +776,7 @@ lib/gitlab/checks/**
/doc/development/packages/cleanup_policies.md @marcel.amirault
/doc/development/packages/dependency_proxy.md @marcel.amirault
/doc/development/permissions.md @jglassman1
+/doc/development/permissions/ @jglassman1
/doc/development/policies.md @jglassman1
/doc/development/project_templates.md @aqualls @msedlakjakubowski
/doc/development/prometheus_metrics.md @msedlakjakubowski
@@ -744,8 +786,6 @@ lib/gitlab/checks/**
/doc/development/search/ @ashrafkhamis
/doc/development/sec/ @rdickenson
/doc/development/secure_coding_guidelines.md @sselhorn
-/doc/development/service_ping/ @lciutacu
-/doc/development/snowplow/ @lciutacu
/doc/development/spam_protection_and_captcha/ @phillipwells
/doc/development/sql.md @aqualls
/doc/development/testing_guide/ @sselhorn
@@ -774,8 +814,6 @@ lib/gitlab/checks/**
/doc/integration/mattermost/ @axil
/doc/integration/partner_marketplace.md @fneill
/doc/integration/recaptcha.md @phillipwells
-/doc/integration/security_partners/ @rdickenson
-/doc/integration/slash_commands.md @eread @ashrafkhamis
/doc/integration/sourcegraph.md @aqualls @msedlakjakubowski
/doc/integration/trello_power_up.md @eread @ashrafkhamis
/doc/integration/vault.md @phillipwells
@@ -784,8 +822,6 @@ lib/gitlab/checks/**
/doc/operations/index.md @msedlakjakubowski
/doc/policy/ @axil
/doc/raketasks/ @axil
-/doc/raketasks/generate_sample_prometheus_data.md @msedlakjakubowski
-/doc/raketasks/migrate_snippets.md @ashrafkhamis
/doc/raketasks/spdx.md @rdickenson
/doc/raketasks/x509_signatures.md @aqualls @msedlakjakubowski
/doc/security/ @jglassman1
@@ -803,53 +839,21 @@ lib/gitlab/checks/**
/doc/tutorials/boards_for_teams/ @msedlakjakubowski
/doc/tutorials/compliance_pipeline/ @eread
/doc/tutorials/configure_gitlab_runner_to_use_gke/ @fneill
+/doc/tutorials/container_scanning/ @rdickenson
/doc/tutorials/convert_personal_namespace_to_group/ @lciutacu
+/doc/tutorials/dependency_scanning.md @rdickenson
/doc/tutorials/fuzz_testing/ @rdickenson
/doc/tutorials/move_personal_project_to_group/ @lciutacu
+/doc/tutorials/protected_workflow/ @aqualls
/doc/tutorials/scan_result_policy/ @rdickenson
/doc/update/ @axil
/doc/update/background_migrations.md @aqualls
-/doc/user/admin_area/analytics/ @lciutacu
-/doc/user/admin_area/credentials_inventory.md @jglassman1
-/doc/user/admin_area/custom_project_templates.md @aqualls @msedlakjakubowski
-/doc/user/admin_area/diff_limits.md @aqualls @msedlakjakubowski
-/doc/user/admin_area/external_users.md @jglassman1
-/doc/user/admin_area/geo_sites.md @axil
-/doc/user/admin_area/labels.md @msedlakjakubowski
-/doc/user/admin_area/license.md @fneill
-/doc/user/admin_area/license_file.md @fneill
-/doc/user/admin_area/merge_requests_approvals.md @aqualls @msedlakjakubowski
-/doc/user/admin_area/moderate_users.md @jglassman1
-/doc/user/admin_area/monitoring/ @msedlakjakubowski
-/doc/user/admin_area/reporting/git_abuse_rate_limit.md @phillipwells
-/doc/user/admin_area/reporting/spamcheck.md @axil
-/doc/user/admin_area/review_abuse_reports.md @phillipwells
-/doc/user/admin_area/settings/account_and_limit_settings.md @aqualls @msedlakjakubowski
/doc/user/admin_area/settings/continuous_integration.md @marcel.amirault
-/doc/user/admin_area/settings/deprecated_api_rate_limits.md @aqualls @msedlakjakubowski
/doc/user/admin_area/settings/email.md @msedlakjakubowski
/doc/user/admin_area/settings/external_authorization.md @jglassman1
/doc/user/admin_area/settings/files_api_rate_limits.md @aqualls @msedlakjakubowski
-/doc/user/admin_area/settings/git_lfs_rate_limits.md @aqualls @msedlakjakubowski
-/doc/user/admin_area/settings/gitaly_timeouts.md @eread
-/doc/user/admin_area/settings/import_export_rate_limits.md @eread @ashrafkhamis
-/doc/user/admin_area/settings/incident_management_rate_limits.md @msedlakjakubowski
-/doc/user/admin_area/settings/index.md @aqualls @msedlakjakubowski
-/doc/user/admin_area/settings/instance_template_repository.md @aqualls @msedlakjakubowski
-/doc/user/admin_area/settings/package_registry_rate_limits.md @phillipwells
-/doc/user/admin_area/settings/project_integration_management.md @eread @ashrafkhamis
-/doc/user/admin_area/settings/push_event_activities_limit.md @aqualls @msedlakjakubowski
-/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_pipelines_creation.md @marcel.amirault
-/doc/user/admin_area/settings/rate_limit_on_projects_api.md @lciutacu
-/doc/user/admin_area/settings/rate_limit_on_users_api.md @jglassman1
-/doc/user/admin_area/settings/scim_setup.md @jglassman1
-/doc/user/admin_area/settings/security_and_compliance.md @rdickenson
-/doc/user/admin_area/settings/terraform_limits.md @phillipwells
-/doc/user/admin_area/settings/third_party_offers.md @lciutacu
+/doc/user/admin_area/settings/slack_app.md @eread @ashrafkhamis
/doc/user/admin_area/settings/usage_statistics.md @lciutacu
-/doc/user/admin_area/settings/visibility_and_access_controls.md @aqualls @msedlakjakubowski
/doc/user/analytics/ @lciutacu
/doc/user/analytics/ci_cd_analytics.md @phillipwells
/doc/user/application_security/ @rdickenson
@@ -958,6 +962,7 @@ lib/gitlab/checks/**
/doc/user/report_abuse.md @phillipwells
/doc/user/reserved_names.md @lciutacu
/doc/user/search/ @ashrafkhamis
+/doc/user/search/command_palette.md @sselhorn
/doc/user/shortcuts.md @ashrafkhamis
/doc/user/snippets.md @aqualls @msedlakjakubowski
/doc/user/ssh.md @jglassman1
@@ -1104,7 +1109,6 @@ lib/gitlab/checks/**
/ee/app/assets/javascripts/access_tokens/
/ee/app/assets/javascripts/audit_events/components/tokens/
/ee/app/assets/javascripts/audit_events/token_utils.js
-/ee/app/assets/javascripts/batch_comments/
/ee/app/assets/javascripts/groups/settings/components/
/ee/app/assets/javascripts/pages/admin/application_settings/general/components/
/ee/app/assets/javascripts/pages/groups/omniauth_callbacks/
@@ -1236,7 +1240,6 @@ lib/gitlab/checks/**
/app/controllers/projects/triggers_controller.rb
/app/controllers/projects/variables_controller.rb
/app/models/commit_status.rb
-/app/models/external_pull_request.rb
/app/models/generic_commit_status.rb
/app/models/namespace_ci_cd_setting.rb
/app/models/project_ci_cd_setting.rb
@@ -1449,6 +1452,37 @@ ee/lib/ee/api/entities/project.rb
/ee/spec/elastic/migrate/
/ee/spec/support/elastic.rb
+[Create::IDE - Remote Development Backend] @gitlab-org/maintainers/remote-development/backend
+/ee/app/models/remote_development/
+/ee/app/policies/remote_development/
+/ee/app/finders/remote_development/
+/ee/app/graphql/types/remote_development/
+/ee/app/graphql/mutations/remote_development/
+/ee/app/graphql/resolvers/remote_development/
+/ee/app/controllers/remote_development/
+/ee/app/services/remote_development/
+/ee/spec/frontend/remote_development/
+/ee/spec/features/remote_development/
+/ee/spec/models/remote_development/
+/ee/spec/policies/remote_development/
+/ee/spec/requests/api/graphql/mutations/remote_development/
+/ee/spec/requests/api/graphql/remote_development/
+/ee/spec/finders/remote_development/
+/ee/spec/support/shared_contexts/remote_development/
+/ee/spec/graphql/types/remote_development/
+/ee/spec/factories/remote_development/
+/ee/spec/lib/remote_development/
+/ee/spec/fixtures/remote_development/
+/ee/spec/controllers/remote_development/
+/ee/spec/services/remote_development/
+/ee/lib/remote_development/
+/qa/qa/specs/features/ee/browser_ui/3_create/remote_development/
+
+[Create::IDE - Remote Development Frontend] @gitlab-org/maintainers/remote-development/frontend
+/ee/app/views/remote_development/
+/ee/app/assets/javascripts/remote_development/
+/ee/app/assets/javascripts/pages/remote_development/
+
# JiHu GitLab rules. See https://gitlab.com/gitlab-jh/gitlab-jh-enablement/-/issues/213#note_1024367528
[JH Frontend] @jihulab/maintainers/frontend
diff --git a/.gitlab/ci/benchmark.gitlab-ci.yml b/.gitlab/ci/benchmark.gitlab-ci.yml
new file mode 100644
index 00000000000..5949a9cd6a9
--- /dev/null
+++ b/.gitlab/ci/benchmark.gitlab-ci.yml
@@ -0,0 +1,17 @@
+benchmark-markdown:
+ extends:
+ - .single-db-ci-connection
+ - .rails-job-base
+ - .use-pg14
+ - .benchmark:rules:benchmark-markdown
+ stage: benchmark
+ needs:
+ - setup-test-env
+ script:
+ - section_start "gitaly-test-spawn" "Spawning Gitaly"; scripts/gitaly-test-spawn; section_end "gitaly-test-spawn"; # Do not use 'bundle exec' here
+ - bundle exec rake benchmark:banzai &> benchmark-markdown.txt
+ artifacts:
+ when: always
+ paths:
+ - benchmark-markdown.txt
+ allow_failure: true
diff --git a/.gitlab/ci/caching.gitlab-ci.yml b/.gitlab/ci/caching.gitlab-ci.yml
index ae4bb94b301..96c2b0d9322 100644
--- a/.gitlab/ci/caching.gitlab-ci.yml
+++ b/.gitlab/ci/caching.gitlab-ci.yml
@@ -45,6 +45,7 @@ cache-assets:test as-if-foss:
extends:
- .cache-assets-base
- .as-if-foss
+ - .caching:rules:cache-assets-as-if-foss
cache-assets:production:
extends:
diff --git a/.gitlab/ci/docs.gitlab-ci.yml b/.gitlab/ci/docs.gitlab-ci.yml
index 6c426749af3..6ad916d919a 100644
--- a/.gitlab/ci/docs.gitlab-ci.yml
+++ b/.gitlab/ci/docs.gitlab-ci.yml
@@ -42,7 +42,7 @@ review-docs-cleanup:
docs-lint links:
extends:
- .docs:rules:docs-lint
- image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-docs/lint-html:alpine-3.17-ruby-3.2.2-c24946ab
+ image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-docs/lint-html:alpine-3.18-ruby-3.2.2-4207821e
stage: lint
needs: []
script:
@@ -52,13 +52,13 @@ docs-lint links:
- mv doc/ /tmp/gitlab-docs/content/ee
- cd /tmp/gitlab-docs
# Build HTML from Markdown
- - bundle exec nanoc
+ - make compile
# Check the internal links and anchors (in parallel)
- "parallel time bundle exec nanoc check ::: internal_links internal_anchors"
.docs-markdown-lint-image:
# When updating the image version here, update it in /scripts/lint-doc.sh too.
- image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-docs/lint-markdown:alpine-3.17-vale-2.24.0-markdownlint-0.33.0-markdownlint2-0.6.0
+ image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-docs/lint-markdown:alpine-3.18-vale-2.27.0-markdownlint-0.35.0-markdownlint2-0.8.1
docs-lint markdown:
extends:
@@ -123,4 +123,3 @@ docs-lint deprecations-and-removals:
needs: []
script:
- bundle exec rake gitlab:docs:check_deprecations
- - bundle exec rake gitlab:docs:check_removals
diff --git a/.gitlab/ci/frontend.gitlab-ci.yml b/.gitlab/ci/frontend.gitlab-ci.yml
index 34c29a9e902..279a7067a74 100644
--- a/.gitlab/ci/frontend.gitlab-ci.yml
+++ b/.gitlab/ci/frontend.gitlab-ci.yml
@@ -371,28 +371,6 @@ bundle-size-review:
paths:
- bundle-size-review/
-.startup-css-check-base:
- extends:
- - .frontend-test-base
- script:
- - run_timed_command "yarn generate:startup_css"
- - yarn check:startup_css
-
-startup-css-check:
- extends:
- - .startup-css-check-base
- - .frontend:rules:default-frontend-jobs
- needs: ["compile-test-assets", "rspec-all frontend_fixture"]
-
-startup-css-check as-if-foss:
- extends:
- - .startup-css-check-base
- - .as-if-foss
- - .frontend:rules:default-frontend-jobs-as-if-foss
- needs:
- - job: "compile-test-assets as-if-foss"
- - job: "rspec-all frontend_fixture as-if-foss"
-
.compile-storybook-base:
extends:
- .frontend-test-base
diff --git a/.gitlab/ci/gitlab-gems.gitlab-ci.yml b/.gitlab/ci/gitlab-gems.gitlab-ci.yml
new file mode 100644
index 00000000000..eb0c8b8536e
--- /dev/null
+++ b/.gitlab/ci/gitlab-gems.gitlab-ci.yml
@@ -0,0 +1,22 @@
+include:
+ - local: .gitlab/ci/templates/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "activerecord-gitlab"
+ - local: .gitlab/ci/templates/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "click_house-client"
+ - local: .gitlab/ci/templates/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "gitlab-rspec"
+ - local: .gitlab/ci/templates/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "gitlab-schema-validation"
+ - local: .gitlab/ci/templates/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "gitlab-utils"
+ - local: .gitlab/ci/templates/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "ipynbdiff"
+ - local: .gitlab/ci/templates/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "rspec_flaky"
diff --git a/.gitlab/ci/global.gitlab-ci.yml b/.gitlab/ci/global.gitlab-ci.yml
index b5578c25518..c501d930352 100644
--- a/.gitlab/ci/global.gitlab-ci.yml
+++ b/.gitlab/ci/global.gitlab-ci.yml
@@ -213,296 +213,192 @@
- *node-modules-cache # We don't push this cache as it's already rebuilt by `update-assets-compile-*-cache`
- *storybook-node-modules-cache-push
-.use-pg12:
- services:
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:postgres-12-pgvector-0.4.1
- command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
- alias: postgres
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:redis-cluster-6.2.12
- alias: rediscluster # configure connections in config/redis.yml
- - name: redis:6.0-alpine
+.pg-base-variables:
variables:
POSTGRES_HOST_AUTH_METHOD: trust
- PG_VERSION: "12"
-.use-pg13:
+.db-services:
services:
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:postgres-13-pgvector-0.4.1
- command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
+ - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:postgres-${PG_VERSION}-pgvector-0.4.1
+ command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off", "-c", "max_locks_per_transaction=256"]
alias: postgres
- name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:redis-cluster-6.2.12
alias: rediscluster # configure connections in config/redis.yml
+
+.db-services-with-redis-6:
+ services:
+ - !reference [.db-services, services]
- name: redis:6.2-alpine
+
+.db-services-with-redis-7:
+ services:
+ - !reference [.db-services, services]
+ - name: redis:7.0-alpine
+
+.use-pg12:
+ extends:
+ - .pg-base-variables
+ - .db-services-with-redis-6
+ variables:
+ PG_VERSION: "12"
+
+.use-pg13:
+ extends:
+ - .pg-base-variables
+ - .db-services-with-redis-6
variables:
- POSTGRES_HOST_AUTH_METHOD: trust
PG_VERSION: "13"
.use-pg14:
- services:
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:postgres-14-pgvector-0.4.1
- command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
- alias: postgres
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:redis-cluster-6.2.12
- alias: rediscluster # configure connections in config/redis.yml
- - name: redis:6.2-alpine
+ extends:
+ - .pg-base-variables
+ - .db-services-with-redis-6
variables:
- POSTGRES_HOST_AUTH_METHOD: trust
PG_VERSION: "14"
.use-pg15:
- services:
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:postgres-15-pgvector-0.4.1
- command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
- alias: postgres
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:redis-cluster-6.2.12
- alias: rediscluster # configure connections in config/redis.yml
- - name: redis:6.2-alpine
+ extends:
+ - .pg-base-variables
+ - .db-services-with-redis-7
variables:
- POSTGRES_HOST_AUTH_METHOD: trust
PG_VERSION: "15"
-.use-pg12-es7-ee:
- services:
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:postgres-12-pgvector-0.4.1
- command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
- alias: postgres
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:redis-cluster-6.2.12
- alias: rediscluster # configure connections in config/redis.yml
- - name: redis:6.0-alpine
- - name: elasticsearch:7.17.6
- command: ["elasticsearch", "-E", "discovery.type=single-node", "-E", "xpack.security.enabled=false"]
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:zoekt-ci-image-1.1
- alias: zoekt-ci-image
+.zoekt-variables:
variables:
- POSTGRES_HOST_AUTH_METHOD: trust
- PG_VERSION: "12"
ZOEKT_INDEX_BASE_URL: http://zoekt-ci-image:6060
ZOEKT_SEARCH_BASE_URL: http://zoekt-ci-image:6070
-.use-pg13-es7-ee:
+.zoekt-services:
services:
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:postgres-13-pgvector-0.4.1
- command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
- alias: postgres
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:redis-cluster-6.2.12
- alias: rediscluster # configure connections in config/redis.yml
- - name: redis:6.2-alpine
- - name: elasticsearch:7.17.6
- command: ["elasticsearch", "-E", "discovery.type=single-node", "-E", "xpack.security.enabled=false"]
- name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:zoekt-ci-image-1.1
alias: zoekt-ci-image
- variables:
- POSTGRES_HOST_AUTH_METHOD: trust
- PG_VERSION: "13"
- ZOEKT_INDEX_BASE_URL: http://zoekt-ci-image:6060
- ZOEKT_SEARCH_BASE_URL: http://zoekt-ci-image:6070
-.use-pg14-es7-ee:
+.es7-base:
+ extends:
+ - .pg-base-variables
+ - .zoekt-variables
services:
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:postgres-14-pgvector-0.4.1
- command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
- alias: postgres
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:redis-cluster-6.2.12
- alias: rediscluster # configure connections in config/redis.yml
- - name: redis:6.2-alpine
+ - !reference [.db-services-with-redis-6, services]
+ - !reference [.zoekt-services, services]
- name: elasticsearch:7.17.6
command: ["elasticsearch", "-E", "discovery.type=single-node", "-E", "xpack.security.enabled=false"]
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:zoekt-ci-image-1.1
- alias: zoekt-ci-image
+
+.use-pg12-es7-ee:
+ extends: .es7-base
+ variables:
+ PG_VERSION: "12"
+
+.use-pg13-es7-ee:
+ extends: .es7-base
+ variables:
+ PG_VERSION: "13"
+
+.use-pg14-es7-ee:
+ extends: .es7-base
variables:
- POSTGRES_HOST_AUTH_METHOD: trust
PG_VERSION: "14"
- ZOEKT_INDEX_BASE_URL: http://zoekt-ci-image:6060
- ZOEKT_SEARCH_BASE_URL: http://zoekt-ci-image:6070
.use-pg15-es7-ee:
- services:
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:postgres-15-pgvector-0.4.1
- command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
- alias: postgres
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:redis-cluster-6.2.12
- alias: rediscluster # configure connections in config/redis.yml
- - name: redis:6.2-alpine
- - name: elasticsearch:7.17.6
- command: ["elasticsearch", "-E", "discovery.type=single-node", "-E", "xpack.security.enabled=false"]
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:zoekt-ci-image-1.1
- alias: zoekt-ci-image
+ extends: .es7-base
variables:
- POSTGRES_HOST_AUTH_METHOD: trust
PG_VERSION: "15"
- ZOEKT_INDEX_BASE_URL: http://zoekt-ci-image:6060
- ZOEKT_SEARCH_BASE_URL: http://zoekt-ci-image:6070
-.use-pg13-es8-ee:
+.es8-base:
+ extends:
+ - .pg-base-variables
+ - .zoekt-variables
services:
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:postgres-13-pgvector-0.4.1
- command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
- alias: postgres
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:redis-cluster-6.2.12
- alias: rediscluster # configure connections in config/redis.yml
- - name: redis:6.0-alpine
+ - !reference [.db-services-with-redis-6, services]
+ - !reference [.zoekt-services, services]
- name: elasticsearch:8.6.2
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:zoekt-ci-image-1.1
- alias: zoekt-ci-image
variables:
- POSTGRES_HOST_AUTH_METHOD: trust
- PG_VERSION: "13"
ES_SETTING_DISCOVERY_TYPE: "single-node"
ES_SETTING_XPACK_SECURITY_ENABLED: "false"
- ZOEKT_INDEX_BASE_URL: http://zoekt-ci-image:6060
- ZOEKT_SEARCH_BASE_URL: http://zoekt-ci-image:6070
+
+.use-pg13-es8-ee:
+ extends: .es8-base
+ variables:
+ PG_VERSION: "13"
.use-pg14-es8-ee:
- services:
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:postgres-14-pgvector-0.4.1
- command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
- alias: postgres
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:redis-cluster-6.2.12
- alias: rediscluster # configure connections in config/redis.yml
- - name: redis:6.0-alpine
- - name: elasticsearch:8.6.2
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:zoekt-ci-image-1.1
- alias: zoekt-ci-image
+ extends: .es8-base
variables:
- POSTGRES_HOST_AUTH_METHOD: trust
PG_VERSION: "14"
- ES_SETTING_DISCOVERY_TYPE: "single-node"
- ES_SETTING_XPACK_SECURITY_ENABLED: "false"
- ZOEKT_INDEX_BASE_URL: http://zoekt-ci-image:6060
- ZOEKT_SEARCH_BASE_URL: http://zoekt-ci-image:6070
.use-pg15-es8-ee:
- services:
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:postgres-15-pgvector-0.4.1
- command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
- alias: postgres
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:redis-cluster-6.2.12
- alias: rediscluster # configure connections in config/redis.yml
- - name: redis:6.0-alpine
- - name: elasticsearch:8.6.2
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:zoekt-ci-image-1.1
- alias: zoekt-ci-image
+ extends: .es8-base
variables:
- POSTGRES_HOST_AUTH_METHOD: trust
PG_VERSION: "15"
- ES_SETTING_DISCOVERY_TYPE: "single-node"
- ES_SETTING_XPACK_SECURITY_ENABLED: "false"
- ZOEKT_INDEX_BASE_URL: http://zoekt-ci-image:6060
- ZOEKT_SEARCH_BASE_URL: http://zoekt-ci-image:6070
-.use-pg13-opensearch1-ee:
+.os1-base:
+ extends:
+ - .pg-base-variables
+ - .zoekt-variables
services:
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:postgres-13-pgvector-0.4.1
- command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
- alias: postgres
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:redis-cluster-6.2.12
- alias: rediscluster # configure connections in config/redis.yml
- - name: redis:6.0-alpine
+ - !reference [.db-services-with-redis-6, services]
+ - !reference [.zoekt-services, services]
- name: opensearchproject/opensearch:1.3.5
alias: elasticsearch
command: ["bin/opensearch", "-E", "discovery.type=single-node", "-E", "plugins.security.disabled=true"]
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:zoekt-ci-image-1.1
- alias: zoekt-ci-image
- variables:
- POSTGRES_HOST_AUTH_METHOD: trust
- PG_VERSION: "13"
- ZOEKT_INDEX_BASE_URL: http://zoekt-ci-image:6060
- ZOEKT_SEARCH_BASE_URL: http://zoekt-ci-image:6070
-.use-pg13-opensearch2-ee:
- services:
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:postgres-13-pgvector-0.4.1
- command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
- alias: postgres
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:redis-cluster-6.2.12
- alias: rediscluster # configure connections in config/redis.yml
- - name: redis:6.0-alpine
- - name: opensearchproject/opensearch:2.2.1
- alias: elasticsearch
- command: ["bin/opensearch", "-E", "discovery.type=single-node", "-E", "plugins.security.disabled=true"]
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:zoekt-ci-image-1.1
- alias: zoekt-ci-image
+.use-pg13-opensearch1-ee:
+ extends: .os1-base
variables:
- POSTGRES_HOST_AUTH_METHOD: trust
PG_VERSION: "13"
- ZOEKT_INDEX_BASE_URL: http://zoekt-ci-image:6060
- ZOEKT_SEARCH_BASE_URL: http://zoekt-ci-image:6070
.use-pg14-opensearch1-ee:
- services:
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:postgres-14-pgvector-0.4.1
- command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
- alias: postgres
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:redis-cluster-6.2.12
- alias: rediscluster # configure connections in config/redis.yml
- - name: redis:6.0-alpine
- - name: opensearchproject/opensearch:1.3.5
- alias: elasticsearch
- command: ["bin/opensearch", "-E", "discovery.type=single-node", "-E", "plugins.security.disabled=true"]
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:zoekt-ci-image-1.1
- alias: zoekt-ci-image
+ extends: .os1-base
variables:
- POSTGRES_HOST_AUTH_METHOD: trust
PG_VERSION: "14"
- ZOEKT_INDEX_BASE_URL: http://zoekt-ci-image:6060
- ZOEKT_SEARCH_BASE_URL: http://zoekt-ci-image:6070
-.use-pg14-opensearch2-ee:
+.use-pg15-opensearch1-ee:
+ extends: .os1-base
+ variables:
+ PG_VERSION: "15"
+
+.os2-base:
+ extends:
+ - .pg-base-variables
+ - .zoekt-variables
services:
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:postgres-14-pgvector-0.4.1
- command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
- alias: postgres
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:redis-cluster-6.2.12
- alias: rediscluster # configure connections in config/redis.yml
- - name: redis:6.0-alpine
+ - !reference [.db-services-with-redis-6, services]
+ - !reference [.zoekt-services, services]
- name: opensearchproject/opensearch:2.2.1
alias: elasticsearch
command: ["bin/opensearch", "-E", "discovery.type=single-node", "-E", "plugins.security.disabled=true"]
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:zoekt-ci-image-1.1
- alias: zoekt-ci-image
+
+.use-pg13-opensearch2-ee:
+ extends: .os2-base
+ variables:
+ PG_VERSION: "13"
+
+.use-pg14-opensearch2-ee:
+ extends: .os2-base
variables:
- POSTGRES_HOST_AUTH_METHOD: trust
PG_VERSION: "14"
- ZOEKT_INDEX_BASE_URL: http://zoekt-ci-image:6060
- ZOEKT_SEARCH_BASE_URL: http://zoekt-ci-image:6070
-.use-pg15-opensearch1-ee:
- services:
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:postgres-15-pgvector-0.4.1
- command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
- alias: postgres
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:redis-cluster-6.2.12
- alias: rediscluster # configure connections in config/redis.yml
- - name: redis:6.0-alpine
- - name: opensearchproject/opensearch:1.3.5
- alias: elasticsearch
- command: ["bin/opensearch", "-E", "discovery.type=single-node", "-E", "plugins.security.disabled=true"]
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:zoekt-ci-image-1.1
- alias: zoekt-ci-image
+.use-pg15-opensearch2-ee:
+ extends: .os2-base
variables:
- POSTGRES_HOST_AUTH_METHOD: trust
PG_VERSION: "15"
- ZOEKT_INDEX_BASE_URL: http://zoekt-ci-image:6060
- ZOEKT_SEARCH_BASE_URL: http://zoekt-ci-image:6070
-.use-pg15-opensearch2-ee:
+.use-pg14-clickhouse23:
services:
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:postgres-15-pgvector-0.4.1
+ - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:postgres-14-pgvector-0.4.1
command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
alias: postgres
- name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:redis-cluster-6.2.12
alias: rediscluster # configure connections in config/redis.yml
- - name: redis:6.0-alpine
- - name: opensearchproject/opensearch:2.2.1
- alias: elasticsearch
- command: ["bin/opensearch", "-E", "discovery.type=single-node", "-E", "plugins.security.disabled=true"]
- - name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:zoekt-ci-image-1.1
- alias: zoekt-ci-image
+ - name: redis:6.2-alpine
+ - name: clickhouse/clickhouse-server:23-alpine
+ alias: clickhouse
variables:
POSTGRES_HOST_AUTH_METHOD: trust
- PG_VERSION: "15"
- ZOEKT_INDEX_BASE_URL: http://zoekt-ci-image:6060
- ZOEKT_SEARCH_BASE_URL: http://zoekt-ci-image:6070
+ PG_VERSION: "14"
+ CLICKHOUSE_USER: clickhouse
+ CLICKHOUSE_PASSWORD: clickhouse
+ CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT: 1
+ CLICKHOUSE_DB: gitlab_clickhouse_test
.use-kaniko:
image:
diff --git a/.gitlab/ci/package-and-test-nightly/main.gitlab-ci.yml b/.gitlab/ci/package-and-test-nightly/main.gitlab-ci.yml
index 34b4e853415..bb0de4a79e2 100644
--- a/.gitlab/ci/package-and-test-nightly/main.gitlab-ci.yml
+++ b/.gitlab/ci/package-and-test-nightly/main.gitlab-ci.yml
@@ -2,6 +2,16 @@ include:
- local: .gitlab/ci/qa-common/main.gitlab-ci.yml
- local: .gitlab/ci/qa-common/rules.gitlab-ci.yml
- local: .gitlab/ci/qa-common/variables.gitlab-ci.yml
+ - component: "gitlab.com/gitlab-org/quality/pipeline-common/allure-report@7.3.0"
+ inputs:
+ job_name: "e2e-test-report"
+ job_stage: "report"
+ aws_access_key_id_variable_name: "QA_ALLURE_AWS_ACCESS_KEY_ID"
+ aws_secret_access_key_variable_name: "QA_ALLURE_AWS_SECRET_ACCESS_KEY"
+ gitlab_auth_token_variable_name: "PROJECT_TOKEN_FOR_CI_SCRIPTS_API_USAGE"
+ allure_results_glob: "gitlab-qa-run-*/**/allure-results"
+ allure_job_name: "${QA_RUN_TYPE}"
+ allure_ref_slug: "${CI_COMMIT_REF_SLUG}"
workflow:
rules:
@@ -97,12 +107,22 @@ integration-opensearch-compatibility-version-2:
OPENSEARCH_VERSION: "2.0.1"
QA_SCENARIO: "Test::Integration::Opensearch"
+# ------------------------------------------
+# Relative url
+# ------------------------------------------
+relative-url:
+ extends:
+ - .qa
+ - .ee
+ - .parallel
+ variables:
+ QA_SCENARIO: Test::Instance::RelativeUrl
+
# ==========================================
# Post test stage
# ==========================================
e2e-test-report:
- extends:
- - .e2e-test-report
+ extends: .rules:report:allure-report
upload-knapsack-report:
extends:
diff --git a/.gitlab/ci/package-and-test/main.gitlab-ci.yml b/.gitlab/ci/package-and-test/main.gitlab-ci.yml
index fcea49e3103..45e07ccf659 100644
--- a/.gitlab/ci/package-and-test/main.gitlab-ci.yml
+++ b/.gitlab/ci/package-and-test/main.gitlab-ci.yml
@@ -4,6 +4,16 @@ include:
- local: .gitlab/ci/qa-common/main.gitlab-ci.yml
- local: .gitlab/ci/qa-common/rules.gitlab-ci.yml
- local: .gitlab/ci/qa-common/variables.gitlab-ci.yml
+ - component: "gitlab.com/gitlab-org/quality/pipeline-common/allure-report@7.3.1"
+ inputs:
+ job_name: "e2e-test-report"
+ job_stage: "report"
+ aws_access_key_id_variable_name: "QA_ALLURE_AWS_ACCESS_KEY_ID"
+ aws_secret_access_key_variable_name: "QA_ALLURE_AWS_SECRET_ACCESS_KEY"
+ gitlab_auth_token_variable_name: "PROJECT_TOKEN_FOR_CI_SCRIPTS_API_USAGE"
+ allure_results_glob: "gitlab-qa-run-*/**/allure-results"
+ allure_job_name: "${QA_RUN_TYPE}"
+ allure_ref_slug: "${CI_COMMIT_REF_SLUG}"
# ==========================================
# Prepare stage
@@ -81,6 +91,7 @@ instance-ff-inverse:
# ------------------------------------------
# ========== instance ===========
+
instance:
extends:
- .parallel
@@ -151,38 +162,6 @@ praefect-selective-parallel:
variables:
QA_TESTS: ""
-# ========== relative-url ===========
-
-relative-url:
- extends:
- - .qa
- - .parallel
- variables:
- QA_SCENARIO: Test::Instance::RelativeUrl
- rules:
- - !reference [.rules:test:qa-parallel, rules]
- - if: $QA_SUITES =~ /Test::Instance::All/
-
-relative-url-selective:
- extends: .qa
- variables:
- QA_SCENARIO: Test::Instance::RelativeUrl
- rules:
- - !reference [.rules:test:qa-selective, rules]
- - if: $QA_SUITES =~ /Test::Instance::All/
-
-relative-url-selective-parallel:
- extends:
- - .qa
- - .parallel
- variables:
- QA_SCENARIO: Test::Instance::RelativeUrl
- rules:
- - !reference [.rules:test:qa-selective-parallel, rules]
- - if: $QA_SUITES =~ /Test::Instance::All/
- variables:
- QA_TESTS: ""
-
# ========== decomposition-single-db ===========
decomposition-single-db:
@@ -259,7 +238,9 @@ decomposition-multiple-db-selective-parallel:
# ========== object-storage ===========
object-storage:
- extends: .qa
+ extends:
+ - .qa
+ - .failure-videos
parallel: 2
variables:
QA_SCENARIO: Test::Instance::Image
@@ -295,7 +276,9 @@ object-storage-selective-parallel:
# ========== object-storage-aws ===========
object-storage-aws:
- extends: object-storage
+ extends:
+ - object-storage
+ - .failure-videos
variables:
AWS_S3_ACCESS_KEY: $QA_AWS_S3_ACCESS_KEY
AWS_S3_BUCKET_NAME: $QA_AWS_S3_BUCKET_NAME
@@ -325,7 +308,9 @@ object-storage-aws-selective-parallel:
# ========== object-storage-gcs ===========
object-storage-gcs:
- extends: object-storage
+ extends:
+ - object-storage
+ - .failure-videos
variables:
GCS_BUCKET_NAME: $QA_GCS_BUCKET_NAME
GOOGLE_PROJECT: $QA_GOOGLE_PROJECT
@@ -383,7 +368,9 @@ group-saml:
- !reference [.rules:test:manual, rules]
oauth:
- extends: .qa
+ extends:
+ - .qa
+ - .failure-videos
variables:
QA_SCENARIO: Test::Integration::OAuth
rules:
@@ -401,7 +388,9 @@ instance-saml:
- !reference [.rules:test:manual, rules]
jira:
- extends: .qa
+ extends:
+ - .qa
+ - .failure-videos
variables:
QA_SCENARIO: Test::Integration::Jira
rules:
@@ -419,7 +408,9 @@ integrations:
- !reference [.rules:test:manual, rules]
ldap-no-server:
- extends: .qa
+ extends:
+ - .qa
+ - .failure-videos
variables:
QA_SCENARIO: Test::Integration::LDAPNoServer
rules:
@@ -428,7 +419,9 @@ ldap-no-server:
- !reference [.rules:test:manual, rules]
ldap-tls:
- extends: .qa
+ extends:
+ - .qa
+ - .failure-videos
variables:
QA_SCENARIO: Test::Integration::LDAPTLS
rules:
@@ -437,7 +430,9 @@ ldap-tls:
- !reference [.rules:test:manual, rules]
ldap-no-tls:
- extends: .qa
+ extends:
+ - .qa
+ - .failure-videos
variables:
QA_SCENARIO: Test::Integration::LDAPNoTLS
rules:
@@ -455,7 +450,9 @@ mtls:
- !reference [.rules:test:manual, rules]
mattermost:
- extends: .qa
+ extends:
+ - .qa
+ - .failure-videos
variables:
QA_SCENARIO: Test::Integration::Mattermost
rules:
@@ -464,7 +461,9 @@ mattermost:
- !reference [.rules:test:manual, rules]
registry:
- extends: .qa
+ extends:
+ - .qa
+ - .failure-videos
variables:
QA_SCENARIO: Test::Integration::Registry
rules:
@@ -473,7 +472,9 @@ registry:
- !reference [.rules:test:manual, rules]
registry-with-cdn:
- extends: .qa
+ extends:
+ - .qa
+ - .failure-videos
variables:
QA_SCENARIO: Test::Integration::RegistryWithCDN
GCS_CDN_BUCKET_NAME: $QA_GCS_CDN_BUCKET_NAME
@@ -490,7 +491,9 @@ registry-with-cdn:
- !reference [.rules:test:manual, rules]
repository-storage:
- extends: .qa
+ extends:
+ - .qa
+ - .failure-videos
variables:
QA_SCENARIO: Test::Instance::RepositoryStorage
rules:
@@ -499,7 +502,9 @@ repository-storage:
- !reference [.rules:test:manual, rules]
service-ping-disabled:
- extends: .qa
+ extends:
+ - .qa
+ - .failure-videos
variables:
QA_SCENARIO: Test::Integration::ServicePingDisabled
rules:
@@ -508,7 +513,9 @@ service-ping-disabled:
- !reference [.rules:test:manual, rules]
smtp:
- extends: .qa
+ extends:
+ - .qa
+ - .failure-videos
variables:
QA_SCENARIO: Test::Integration::SMTP
rules:
@@ -517,7 +524,9 @@ smtp:
- !reference [.rules:test:manual, rules]
cloud-activation:
- extends: .qa
+ extends:
+ - .qa
+ - .failure-videos
variables:
QA_SCENARIO: Test::Instance::Image
QA_RSPEC_TAGS: --tag cloud_activation
@@ -527,7 +536,9 @@ cloud-activation:
- !reference [.rules:test:manual, rules]
large-setup:
- extends: .qa
+ extends:
+ - .qa
+ - .failure-videos
variables:
QA_SCENARIO: Test::Instance::Image
QA_RSPEC_TAGS: --tag can_use_large_setup
@@ -566,7 +577,9 @@ registry-object-storage-tls:
GITLAB_QA_OPTS: --omnibus-config registry_object_storage $EXTRA_GITLAB_QA_OPTS
importers:
- extends: .qa
+ extends:
+ - .qa
+ - .failure-videos
variables:
QA_SCENARIO: Test::Integration::Import
QA_MOCK_GITHUB: "true"
@@ -620,9 +633,7 @@ update-ee-to-ce:
# Post test stage
# ==========================================
e2e-test-report:
- extends:
- - .e2e-test-report
- - .rules:report:allure-report
+ extends: .rules:report:allure-report
upload-knapsack-report:
extends:
diff --git a/.gitlab/ci/preflight.gitlab-ci.yml b/.gitlab/ci/preflight.gitlab-ci.yml
index 968402b2ea5..6a2ea85f393 100644
--- a/.gitlab/ci/preflight.gitlab-ci.yml
+++ b/.gitlab/ci/preflight.gitlab-ci.yml
@@ -24,9 +24,6 @@
- .ruby-cache
- .preflight:rules:rails-production-server-boot
- .use-pg13
- variables:
- BUNDLE_WITHOUT: "development:test"
- BUNDLE_WITH: "production"
# Test the puma configuration present in `config/puma.rb.example`
rails-production-server-boot-puma-example:
diff --git a/.gitlab/ci/qa-common/main.gitlab-ci.yml b/.gitlab/ci/qa-common/main.gitlab-ci.yml
index 3b6f42ba57e..603ac12c464 100644
--- a/.gitlab/ci/qa-common/main.gitlab-ci.yml
+++ b/.gitlab/ci/qa-common/main.gitlab-ci.yml
@@ -9,7 +9,6 @@ include:
ref: 7.2.3
file:
- /ci/base.gitlab-ci.yml
- - /ci/allure-report.yml
- /ci/knapsack-report.yml
stages:
@@ -86,15 +85,6 @@ stages:
- qa/knapsack/*.json
expire_in: 1 day
-.e2e-test-report:
- extends:
- - .generate-allure-report-base
- stage: report
- variables:
- GITLAB_AUTH_TOKEN: $PROJECT_TOKEN_FOR_CI_SCRIPTS_API_USAGE
- ALLURE_PROJECT_PATH: $CI_PROJECT_PATH
- ALLURE_MERGE_REQUEST_IID: $CI_MERGE_REQUEST_IID
-
.upload-knapsack-report:
extends:
- .generate-knapsack-report-base
@@ -148,6 +138,7 @@ stages:
STATUS_SYM: ☠ï¸
STATUS: failed
TYPE: "($QA_RUN_TYPE) "
+ ALLURE_JOB_NAME: $QA_RUN_TYPE
when: always
script:
- |
@@ -158,6 +149,12 @@ stages:
- bundle exec prepare-stage-reports --input-files "${QA_RSPEC_XML_FILE_PATTERN}"
- !reference [.notify-slack-qa, script]
+.failure-videos:
+ variables:
+ USE_SELENOID: "true"
+ QA_RECORD_VIDEO: "true"
+ QA_REMOTE_GRID: "selenoid:4444"
+
# ==========================================
# Pre stage
# ==========================================
diff --git a/.gitlab/ci/qa-common/variables.gitlab-ci.yml b/.gitlab/ci/qa-common/variables.gitlab-ci.yml
index 817f2e0020a..fe980293f3a 100644
--- a/.gitlab/ci/qa-common/variables.gitlab-ci.yml
+++ b/.gitlab/ci/qa-common/variables.gitlab-ci.yml
@@ -3,12 +3,6 @@
variables:
REGISTRY_HOST: "registry.gitlab.com"
REGISTRY_GROUP: "gitlab-org"
- SKIP_OMNIBUS_TRIGGER: "true"
- OMNIBUS_GITLAB_CACHE_UPDATE: "false"
- OMNIBUS_GITLAB_RUBY3_BUILD: "false"
- OMNIBUS_GITLAB_RUBY2_BUILD: "false"
- OMNIBUS_GITLAB_CACHE_EDITION: "GITLAB"
- OMNIBUS_GITLAB_BUILD_ON_ALL_OS: "false"
ALLURE_JOB_NAME: $CI_PROJECT_NAME
COLORIZED_LOGS: "true"
QA_LOG_LEVEL: "info"
@@ -17,3 +11,4 @@ variables:
# run all tests by default when package-and-test is included natively in other projects
# this will be overridden when selective test execution is used in gitlab canonical project
QA_RUN_ALL_TESTS: "true"
+ USE_OLD_RUBY_VERSION: "true"
diff --git a/.gitlab/ci/qa.gitlab-ci.yml b/.gitlab/ci/qa.gitlab-ci.yml
index 6d181a59214..eae3b2f2a36 100644
--- a/.gitlab/ci/qa.gitlab-ci.yml
+++ b/.gitlab/ci/qa.gitlab-ci.yml
@@ -15,10 +15,6 @@
.e2e-trigger-base:
extends: .production # this makes sure GITLAB_ALLOW_SEPARATE_CI_DATABASE is passed to the child pipeline
stage: qa
- needs:
- - build-assets-image
- - build-qa-image
- - e2e-test-pipeline-generate
variables:
# This is needed by `trigger-omnibus-env` (`.gitlab/ci/package-and-test/main.gitlab-ci.yml`).
PARENT_PIPELINE_ID: $CI_PIPELINE_ID
@@ -27,7 +23,6 @@
RUN_WITH_BUNDLE: "true" # instructs pipeline to install and run gitlab-qa gem via bundler
QA_PATH: qa # sets the optional path for bundler to run from
DYNAMIC_PIPELINE_YML: package-and-test-pipeline.yml # yml files are generated by scripts/generate-e2e-pipeline script
- EXTRA_GITLAB_QA_OPTS: --set-feature-flags super_sidebar_nav_enrolled=enabled
inherit:
variables:
- CHROME_VERSION
@@ -36,9 +31,6 @@
- DEBIAN_VERSION
- REGISTRY_GROUP
- REGISTRY_HOST
- - OMNIBUS_GITLAB_CACHE_EDITION
- - OMNIBUS_GITLAB_RUBY3_BUILD
- - OMNIBUS_GITLAB_RUBY2_BUILD
trigger:
strategy: depend
forward:
@@ -102,9 +94,9 @@ trigger-omnibus:
TOP_UPSTREAM_SOURCE_PROJECT: $CI_PROJECT_PATH
SECURITY_SOURCES: $SECURITY_SOURCES
CACHE_UPDATE: $OMNIBUS_GITLAB_CACHE_UPDATE
- RUBY3_BUILD: $OMNIBUS_GITLAB_RUBY3_BUILD
- RUBY2_BUILD: $OMNIBUS_GITLAB_RUBY2_BUILD
- CACHE_EDITION: $OMNIBUS_GITLAB_CACHE_EDITION
+ USE_OLD_RUBY_VERSION: "true"
+ CACHE_EDITION: "GITLAB_RUBY3_0"
+ NEXT_RUBY_VERSION: "3.1.4"
BUILD_ON_ALL_OS: $OMNIBUS_GITLAB_BUILD_ON_ALL_OS
SKIP_QA_TEST: "true"
ee: $EE
@@ -135,7 +127,6 @@ e2e:package-and-test-ee:
variables:
RELEASE: "${REGISTRY_HOST}/${REGISTRY_GROUP}/build/omnibus-gitlab-mirror/gitlab-ee:${CI_COMMIT_SHA}"
QA_RUN_TYPE: e2e-package-and-test
- ALLURE_JOB_NAME: e2e-package-and-test
PIPELINE_NAME: E2E Omnibus GitLab EE
e2e:package-and-test-ce:
@@ -151,17 +142,19 @@ e2e:package-and-test-ce:
RELEASE: ${REGISTRY_HOST}/${REGISTRY_GROUP}/build/omnibus-gitlab-mirror/gitlab-ce:${CI_COMMIT_SHA}
GITLAB_QA_IMAGE: ${CI_REGISTRY_IMAGE}/gitlab-ce-qa:${CI_COMMIT_SHA}
QA_RUN_TYPE: e2e-package-and-test-ce
- ALLURE_JOB_NAME: e2e-package-and-test-ce
PIPELINE_NAME: E2E Omnibus GitLab CE
e2e:package-and-test-old-nav:
extends:
- .e2e-trigger-base
- .qa:rules:package-and-test-old-nav
+ needs:
+ - build-qa-image
+ - trigger-omnibus
+ - e2e-test-pipeline-generate
variables:
RELEASE: "${REGISTRY_HOST}/${REGISTRY_GROUP}/build/omnibus-gitlab-mirror/gitlab-ee:${CI_COMMIT_SHA}"
QA_RUN_TYPE: e2e-package-and-test-old-nav
- ALLURE_JOB_NAME: e2e-package-and-test-old-nav
PIPELINE_NAME: E2E Omnibus Old Navigation
QA_SUPER_SIDEBAR_ENABLED: "false"
EXTRA_GITLAB_QA_OPTS: ""
@@ -177,7 +170,6 @@ e2e:package-and-test-nightly:
variables:
GITLAB_SEMVER_VERSION: $GITLAB_SEMVER_VERSION
QA_RUN_TYPE: nightly
- ALLURE_JOB_NAME: nightly
PIPELINE_NAME: E2E Omnibus GitLab Nightly
DYNAMIC_PIPELINE_YML: package-and-test-nightly-pipeline.yml
@@ -190,7 +182,6 @@ e2e:test-on-gdk:
- build-gdk-image
- e2e-test-pipeline-generate
variables:
- ALLURE_JOB_NAME: e2e-test-on-gdk
QA_RUN_TYPE: e2e-test-on-gdk
PIPELINE_NAME: E2E GDK
DYNAMIC_PIPELINE_YML: test-on-gdk-pipeline.yml
diff --git a/.gitlab/ci/rails.gitlab-ci.yml b/.gitlab/ci/rails.gitlab-ci.yml
index 0df6ef0cacd..9338f5cf7e5 100644
--- a/.gitlab/ci/rails.gitlab-ci.yml
+++ b/.gitlab/ci/rails.gitlab-ci.yml
@@ -115,6 +115,18 @@ rspec background_migration pg14 praefect:
- .praefect-with-db
- .rails:rules:praefect-with-db
+rspec migration pg14 clusterwide-db:
+ extends:
+ - rspec migration pg14
+ - .clusterwide-db
+ - .rails:rules:clusterwide-db
+
+rspec background_migration pg14 clusterwide-db:
+ extends:
+ - rspec background_migration pg14
+ - .clusterwide-db
+ - .rails:rules:clusterwide-db
+
rspec unit pg14:
extends:
- .rspec-base-pg14
@@ -139,6 +151,12 @@ rspec unit pg14 single-db-ci-connection:
- .single-db-ci-connection-rspec
- .rails:rules:single-db-ci-connection
+rspec unit pg14 clusterwide-db:
+ extends:
+ - rspec unit pg14
+ - .clusterwide-db
+ - .rails:rules:clusterwide-db
+
rspec unit pg14 praefect:
extends:
- rspec unit pg14
@@ -169,6 +187,12 @@ rspec integration pg14 single-db-ci-connection:
- .single-db-ci-connection-rspec
- .rails:rules:single-db-ci-connection
+rspec integration pg14 clusterwide-db:
+ extends:
+ - rspec integration pg14
+ - .clusterwide-db
+ - .rails:rules:clusterwide-db
+
rspec integration pg14 praefect:
extends:
- rspec integration pg14
@@ -201,6 +225,12 @@ rspec system pg14 single-db-ci-connection:
- .single-db-ci-connection-rspec
- .rails:rules:single-db-ci-connection
+rspec system pg14 clusterwide-db:
+ extends:
+ - rspec system pg14
+ - .clusterwide-db
+ - .rails:rules:clusterwide-db
+
rspec system pg14 praefect:
extends:
- rspec system pg14
@@ -236,6 +266,11 @@ rspec fast_spec_helper:
# Load fast_spec_helper as well just in case there are no specs available.
- bin/rspec --dry-run spec/fast_spec_helper.rb $fast_spec_helper_specs
+rspec unit clickhouse:
+ extends:
+ - .rspec-base-pg14-clickhouse23
+ - .rails:rules:clickhouse-changes
+
gitlab:setup:
extends: .db-job-base
variables:
@@ -275,7 +310,7 @@ rspec:deprecations:
script:
- grep -h -R "keyword" deprecations/ | awk '{$1=$1};1' | sort | uniq -c | sort
- grep -R "keyword" deprecations/ | wc
- - run_timed_command "fail_on_warnings bundle exec rubocop --only Lint/LastKeywordArgument --parallel"
+ - run_timed_command "fail_on_warnings bundle exec rubocop --config .rubocop.yml --only Lint/LastKeywordArgument --parallel"
artifacts:
expire_in: 31d
when: always
@@ -326,6 +361,10 @@ rspec:artifact-collector remainder:
optional: true
- job: rspec background_migration pg14 # 4 jobs
optional: true
+ rules:
+ - !reference ['.rails:rules:ee-and-foss-integration', rules]
+ - !reference ['.rails:rules:ee-and-foss-migration', rules]
+ - !reference ['.rails:rules:ee-and-foss-background-migration', rules]
rspec:artifact-collector as-if-foss unit:
extends:
@@ -351,6 +390,10 @@ rspec:artifact-collector as-if-foss remainder:
optional: true
- job: rspec background_migration pg14-as-if-foss # 4 jobs
optional: true
+ rules:
+ - !reference ['.rails:rules:as-if-foss-integration', rules]
+ - !reference ['.rails:rules:as-if-foss-migration', rules]
+ - !reference ['.rails:rules:as-if-foss-background-migration', rules]
rspec:artifact-collector single-redis:
extends:
@@ -370,6 +413,7 @@ rspec:artifact-collector system single-redis:
rspec:artifact-collector ee single-redis:
extends:
- .artifact-collector
+ - .rails:rules:single-redis
needs:
- job: rspec-ee unit pg14 single-redis # 18 jobs
optional: true
@@ -392,6 +436,12 @@ rspec:artifact-collector ee:
optional: true
- job: rspec-ee system pg14 # 10 jobs
optional: true
+ rules:
+ - !reference ['.rails:rules:ee-only-migration', rules]
+ - !reference ['.rails:rules:ee-only-background-migration', rules]
+ - !reference ['.rails:rules:ee-only-unit', rules]
+ - !reference ['.rails:rules:ee-only-integration', rules]
+ - !reference ['.rails:rules:ee-only-system', rules]
rspec:coverage:
extends:
@@ -569,25 +619,37 @@ rspec migration pg14-as-if-foss single-db:
extends:
- rspec migration pg14-as-if-foss
- .single-db-rspec
- - .rails:rules:single-db
+ - .rails:rules:single-db-as-if-foss
rspec background_migration pg14-as-if-foss single-db:
extends:
- rspec background_migration pg14-as-if-foss
- .single-db-rspec
- - .rails:rules:single-db
+ - .rails:rules:single-db-as-if-foss
rspec migration pg14-as-if-foss single-db-ci-connection:
extends:
- rspec migration pg14-as-if-foss
- .single-db-ci-connection-rspec
- - .rails:rules:single-db-ci-connection
+ - .rails:rules:single-db-ci-connection-as-if-foss
rspec background_migration pg14-as-if-foss single-db-ci-connection:
extends:
- rspec background_migration pg14-as-if-foss
- .single-db-ci-connection-rspec
- - .rails:rules:single-db-ci-connection
+ - .rails:rules:single-db-ci-connection-as-if-foss
+
+rspec migration pg14-as-if-foss clusterwide-db:
+ extends:
+ - rspec migration pg14-as-if-foss
+ - .clusterwide-db
+ - .rails:rules:clusterwide-db
+
+rspec background_migration pg14-as-if-foss clusterwide-db:
+ extends:
+ - rspec background_migration pg14-as-if-foss
+ - .clusterwide-db
+ - .rails:rules:clusterwide-db
rspec unit pg14-as-if-foss:
extends:
@@ -599,13 +661,19 @@ rspec unit pg14-as-if-foss single-db:
extends:
- rspec unit pg14-as-if-foss
- .single-db-rspec
- - .rails:rules:single-db
+ - .rails:rules:single-db-as-if-foss
rspec unit pg14-as-if-foss single-db-ci-connection:
extends:
- rspec unit pg14-as-if-foss
- .single-db-ci-connection-rspec
- - .rails:rules:single-db-ci-connection
+ - .rails:rules:single-db-ci-connection-as-if-foss
+
+rspec unit pg14-as-if-foss clusterwide-db:
+ extends:
+ - rspec unit pg14-as-if-foss
+ - .clusterwide-db
+ - .rails:rules:clusterwide-db
rspec integration pg14-as-if-foss:
extends:
@@ -617,13 +685,19 @@ rspec integration pg14-as-if-foss single-db:
extends:
- rspec integration pg14-as-if-foss
- .single-db-rspec
- - .rails:rules:single-db
+ - .rails:rules:single-db-as-if-foss
rspec integration pg14-as-if-foss single-db-ci-connection:
extends:
- rspec integration pg14-as-if-foss
- .single-db-ci-connection-rspec
- - .rails:rules:single-db-ci-connection
+ - .rails:rules:single-db-ci-connection-as-if-foss
+
+rspec integration pg14-as-if-foss clusterwide-db:
+ extends:
+ - rspec integration pg14-as-if-foss
+ - .clusterwide-db
+ - .rails:rules:clusterwide-db
rspec system pg14-as-if-foss:
extends:
@@ -635,13 +709,19 @@ rspec system pg14-as-if-foss single-db:
extends:
- rspec system pg14-as-if-foss
- .single-db-rspec
- - .rails:rules:single-db
+ - .rails:rules:single-db-as-if-foss
rspec system pg14-as-if-foss single-db-ci-connection:
extends:
- rspec system pg14-as-if-foss
- .single-db-ci-connection-rspec
- - .rails:rules:single-db-ci-connection
+ - .rails:rules:single-db-ci-connection-as-if-foss
+
+rspec system pg14-as-if-foss clusterwide-db:
+ extends:
+ - rspec system pg14-as-if-foss
+ - .clusterwide-db
+ - .rails:rules:clusterwide-db
rspec-ee migration pg14:
extends:
@@ -681,6 +761,18 @@ rspec-ee background_migration pg14 single-db-ci-connection:
- .single-db-ci-connection-rspec
- .rails:rules:single-db-ci-connection
+rspec-ee migration pg14 clusterwide-db:
+ extends:
+ - rspec-ee migration pg14
+ - .clusterwide-db
+ - .rails:rules:clusterwide-db
+
+rspec-ee background_migration pg14 clusterwide-db:
+ extends:
+ - rspec-ee background_migration pg14
+ - .clusterwide-db
+ - .rails:rules:clusterwide-db
+
rspec-ee migration pg14 praefect:
extends:
- rspec migration pg14
@@ -722,6 +814,12 @@ rspec-ee unit pg14 single-db-ci-connection:
- .single-db-ci-connection-rspec
- .rails:rules:single-db-ci-connection
+rspec-ee unit pg14 clusterwide-db:
+ extends:
+ - rspec-ee unit pg14
+ - .clusterwide-db
+ - .rails:rules:clusterwide-db
+
rspec-ee integration pg14:
extends:
- .rspec-ee-base-pg14
@@ -751,6 +849,12 @@ rspec-ee integration pg14 single-db-ci-connection:
- .single-db-ci-connection-rspec
- .rails:rules:single-db-ci-connection
+rspec-ee integration pg14 clusterwide-db:
+ extends:
+ - rspec-ee integration pg14
+ - .clusterwide-db
+ - .rails:rules:clusterwide-db
+
rspec-ee system pg14:
extends:
- .rspec-ee-base-pg14
@@ -779,6 +883,12 @@ rspec-ee system pg14 single-db-ci-connection:
- rspec-ee system pg14
- .single-db-ci-connection-rspec
- .rails:rules:single-db-ci-connection
+
+rspec-ee system pg14 clusterwide-db:
+ extends:
+ - rspec-ee system pg14
+ - .clusterwide-db
+ - .rails:rules:clusterwide-db
# EE: default refs (MRs, default branch, schedules) jobs #
##################################################
@@ -1085,7 +1195,7 @@ rspec-ee system pg15 es8:
needs: ["setup-test-env", "retrieve-tests-metadata", "compile-test-assets", "detect-tests"]
script:
- !reference [.base-script, script]
- - rspec_fail_fast "${MATCHING_TESTS_PATH}" "--tag ~quarantine --tag ~zoekt"
+ - rspec_fail_fast "${MATCHING_TESTS_PATH}" "--fail-fast=${RSPEC_FAIL_FAST_THRESHOLD} --tag ~quarantine --tag ~zoekt --tag ~click_house"
rspec fail-fast:
extends:
diff --git a/.gitlab/ci/rails/rspec-foss-impact.gitlab-ci.yml.erb b/.gitlab/ci/rails/rspec-foss-impact.gitlab-ci.yml.erb
index dc469c30207..4584cba0282 100644
--- a/.gitlab/ci/rails/rspec-foss-impact.gitlab-ci.yml.erb
+++ b/.gitlab/ci/rails/rspec-foss-impact.gitlab-ci.yml.erb
@@ -39,7 +39,7 @@ dont-interrupt-me:
RSPEC_TESTS_MAPPING_ENABLED: "true"
script:
- !reference [.base-script, script]
- - rspec_paralellized_job "--tag ~quarantine --tag ~level:background_migration --tag ~zoekt"
+ - rspec_paralellized_job "--fail-fast=${RSPEC_FAIL_FAST_THRESHOLD} --tag ~quarantine --tag ~level:background_migration --tag ~zoekt --tag ~click_house"
artifacts:
expire_in: 7d
paths:
@@ -54,7 +54,7 @@ rspec migration foss-impact:
<% end %>
script:
- !reference [.base-script, script]
- - rspec_paralellized_job "--tag ~quarantine --tag ~zoekt"
+ - rspec_paralellized_job "--fail-fast=${RSPEC_FAIL_FAST_THRESHOLD} --tag ~quarantine --tag ~zoekt --tag ~click_house"
<% end %>
<% if rspec_files_per_test_level[:background_migration][:files].size > 0 %>
diff --git a/.gitlab/ci/rails/shared.gitlab-ci.yml b/.gitlab/ci/rails/shared.gitlab-ci.yml
index 6ea6d8e523c..9c2b0406f02 100644
--- a/.gitlab/ci/rails/shared.gitlab-ci.yml
+++ b/.gitlab/ci/rails/shared.gitlab-ci.yml
@@ -24,14 +24,16 @@ include:
# Only install knapsack after bundle install! Otherwise oddly some native
# gems could not be found under some circumstance. No idea why, hours wasted.
- run_timed_command "gem install knapsack --no-document"
- - echo -e "\e[0Ksection_start:`date +%s`:gitaly-test-spawn[collapsed=true]\r\e[0KStarting Gitaly"
- section_start "gitaly-test-spawn" "Spawning Gitaly"; scripts/gitaly-test-spawn; section_end "gitaly-test-spawn" # Do not use 'bundle exec' here
- - echo -e "\e[0Ksection_end:`date +%s`:gitaly-test-spawn\r\e[0K"
.no-redis-cluster:
variables:
USE_REDIS_CLUSTER: "false"
+.clusterwide-db:
+ variables:
+ CLUSTERWIDE_DB: "true"
+
.single-db:
variables:
DECOMPOSED_DB: "false"
@@ -74,12 +76,15 @@ include:
# spec/lib, yet background migration tests are also sitting there,
# and they should run on their own jobs so we don't need to run them
# in unit tests again.
- - rspec_paralellized_job "--tag ~quarantine --tag ~level:background_migration"
+ - rspec_paralellized_job "--fail-fast=${RSPEC_FAIL_FAST_THRESHOLD} --tag ~quarantine --tag ~level:background_migration --tag ~click_house"
after_script:
- echo -e "\e[0Ksection_start:`date +%s`:report_results_section[collapsed=true]\r\e[0KReport results"
- |
if [ "$CREATE_RAILS_TEST_FAILURE_ISSUES" == "true" ]; then
- bundle exec relate-failure-issue --input-files "rspec/rspec-*.json" --system-log-files "log" --project "gitlab-org-sandbox/rails-test-failures" --token "${RAILS_TEST_FAILURES_PROJECT_TOKEN}";
+ bundle exec relate-failure-issue --input-files "rspec/rspec-*.json" --system-log-files "log" --project "gitlab-org/gitlab" --token "${TEST_FAILURES_PROJECT_TOKEN}";
+ fi
+ if [ "$CREATE_RAILS_SLOW_TEST_ISSUES" == "true" ]; then
+ bundle exec slow-test-issues --input-files "rspec/rspec-*.json" --project "gitlab-org-sandbox/rails-test-failures" --token "${RAILS_TEST_FAILURES_PROJECT_TOKEN}";
fi
- echo -e "\e[0Ksection_end:`date +%s`:report_results_section\r\e[0K"
@@ -105,7 +110,7 @@ include:
.rspec-base-migration:
script:
- !reference [.base-script, script]
- - rspec_paralellized_job "--tag ~quarantine --tag ~zoekt"
+ - rspec_paralellized_job "--fail-fast=${RSPEC_FAIL_FAST_THRESHOLD} --tag ~quarantine --tag ~zoekt --tag ~click_house"
after_script:
- !reference [.rspec-base, after_script]
@@ -124,6 +129,16 @@ include:
- .rspec-base
- .use-pg14
+.rspec-base-pg14-clickhouse23:
+ extends:
+ - .rspec-base
+ - .use-pg14-clickhouse23
+ script:
+ - cp config/click_house.yml.example config/click_house.yml
+ - 'sed -i "s|url:.*$|url: http://clickhouse:8123|g" config/click_house.yml'
+ - !reference [.base-script, script]
+ - rspec_paralellized_job "--fail-fast=${RSPEC_FAIL_FAST_THRESHOLD} --tag click_house"
+
.rspec-base-pg14-as-if-foss:
extends:
- .rspec-base
diff --git a/.gitlab/ci/release-environments/main.gitlab-ci.yml b/.gitlab/ci/release-environments/main.gitlab-ci.yml
index 6c28ba3e2dd..7eb67509301 100644
--- a/.gitlab/ci/release-environments/main.gitlab-ci.yml
+++ b/.gitlab/ci/release-environments/main.gitlab-ci.yml
@@ -14,7 +14,7 @@ review-build-cng:
review-deploy-env:
allow_failure: true
stage: deploy
- needs: ["release-environments-build-cng"]
+ needs: ["review-build-cng"]
variables:
DEPLOY_ENV: deploy.env
script:
diff --git a/.gitlab/ci/review-apps/main.gitlab-ci.yml b/.gitlab/ci/review-apps/main.gitlab-ci.yml
index 3522dac39e4..c5f56076ce7 100644
--- a/.gitlab/ci/review-apps/main.gitlab-ci.yml
+++ b/.gitlab/ci/review-apps/main.gitlab-ci.yml
@@ -44,6 +44,11 @@ review-build-cng:
variables:
HOST_SUFFIX: "${CI_ENVIRONMENT_SLUG}"
DOMAIN: "-${CI_ENVIRONMENT_SLUG}.${REVIEW_APPS_DOMAIN}"
+ GITLAB_HELM_CHART_PROJECT_URL: "https://gitlab.com/gitlab-org/charts/gitlab"
+ GITLAB_HELM_REPO_URL: "https://charts.gitlab.io"
+ GITLAB_REPO_URL: ${CI_PROJECT_URL}
+ GITLAB_IMAGE_REPOSITORY: "registry.gitlab.com/gitlab-org/build/cng-mirror"
+ GITLAB_IMAGE_SUFFIX: "ee"
GITLAB_HELM_CHART_REF: "75b1486a9aec212d0f49ef1251526d8e51004bbc" # 7.0.1: https://gitlab.com/gitlab-org/charts/gitlab/-/commit/75b1486a9aec212d0f49ef1251526d8e51004bbc
environment:
name: review/${CI_COMMIT_REF_SLUG}${SCHEDULE_TYPE} # No separator for SCHEDULE_TYPE so it's compatible as before and looks nice without it
@@ -115,6 +120,7 @@ review-deploy-sample-projects:
.review-stop-base:
extends: .review-workflow-base
+ timeout: 15min
environment:
action: stop
variables:
diff --git a/.gitlab/ci/review-apps/qa.gitlab-ci.yml b/.gitlab/ci/review-apps/qa.gitlab-ci.yml
index ccbdfd3c298..a9ab031e115 100644
--- a/.gitlab/ci/review-apps/qa.gitlab-ci.yml
+++ b/.gitlab/ci/review-apps/qa.gitlab-ci.yml
@@ -1,6 +1,18 @@
include:
- local: .gitlab/ci/qa-common/main.gitlab-ci.yml
- template: Verify/Browser-Performance.gitlab-ci.yml
+ - component: "gitlab.com/gitlab-org/quality/pipeline-common/allure-report@7.3.0"
+ inputs:
+ job_name: "e2e-test-report"
+ job_stage: "post-qa"
+ aws_access_key_id_variable_name: "QA_ALLURE_AWS_ACCESS_KEY_ID"
+ aws_secret_access_key_variable_name: "QA_ALLURE_AWS_SECRET_ACCESS_KEY"
+ gitlab_auth_token_variable_name: "PROJECT_TOKEN_FOR_CI_SCRIPTS_API_USAGE"
+ allure_results_glob: "qa/tmp/allure-results"
+ allure_ref_slug: "${CI_COMMIT_REF_SLUG}"
+ allure_project_path: "${CI_PROJECT_PATH}"
+ allure_merge_request_iid: "${CI_MERGE_REQUEST_IID}"
+ allure_job_name: "${QA_RUN_TYPE}"
.test-variables:
variables:
@@ -108,13 +120,7 @@ browser_performance:
URL: environment_url.txt
e2e-test-report:
- extends:
- - .e2e-test-report
- - .rules:prepare-report
- stage: post-qa
- variables:
- ALLURE_RESULTS_GLOB: qa/tmp/allure-results
- ALLURE_JOB_NAME: $QA_RUN_TYPE
+ extends: .rules:prepare-report
upload-knapsack-report:
extends:
@@ -144,7 +150,6 @@ notify-slack:
variables:
QA_RSPEC_XML_FILE_PATTERN: ${CI_PROJECT_DIR}/qa/tmp/rspec-*.xml
RUN_WITH_BUNDLE: "true"
- ALLURE_JOB_NAME: $QA_RUN_TYPE
when: on_failure
export-test-metrics:
diff --git a/.gitlab/ci/review.gitlab-ci.yml b/.gitlab/ci/review.gitlab-ci.yml
index 68bfa682d0f..224312bd8ee 100644
--- a/.gitlab/ci/review.gitlab-ci.yml
+++ b/.gitlab/ci/review.gitlab-ci.yml
@@ -1,4 +1,5 @@
review-cleanup:
+ timeout: 15min
extends:
- .default-retry
- .review:rules:review-cleanup
diff --git a/.gitlab/ci/rules.gitlab-ci.yml b/.gitlab/ci/rules.gitlab-ci.yml
index 1c1f6cfa96a..295f22258e9 100644
--- a/.gitlab/ci/rules.gitlab-ci.yml
+++ b/.gitlab/ci/rules.gitlab-ci.yml
@@ -2,7 +2,7 @@
# Conditions #
##############
.if-not-canonical-namespace: &if-not-canonical-namespace
- if: '$CI_PROJECT_NAMESPACE !~ /^gitlab(-org)?($|\/)/'
+ if: '$CI_PROJECT_NAMESPACE !~ /^gitlab(-org|-cn)?($|\/)/'
.if-not-ee: &if-not-ee
# Only consider FOSS not EE
@@ -21,7 +21,7 @@
if: '$FORCE_GITLAB_CI'
.if-default-refs: &if-default-refs
- if: '$CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH || $CI_COMMIT_REF_NAME =~ /^[\d-]+-stable(-ee)?$/ || $CI_COMMIT_REF_NAME =~ /^\d+-\d+-auto-deploy-\d+$/ || $CI_COMMIT_REF_NAME =~ /^security\// || $CI_COMMIT_REF_NAME == "ruby2" || ($CI_MERGE_REQUEST_EVENT_TYPE == "merged_result" || $CI_MERGE_REQUEST_EVENT_TYPE == "detached") || $CI_COMMIT_TAG || $FORCE_GITLAB_CI'
+ if: '$CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH || $CI_COMMIT_REF_NAME =~ /^[\d-]+-stable(-ee)?$/ || $CI_COMMIT_REF_NAME =~ /^\d+-\d+-auto-deploy-\d+$/ || $CI_COMMIT_REF_NAME =~ /^security\// || $CI_COMMIT_REF_NAME == "ruby3_1" || ($CI_MERGE_REQUEST_EVENT_TYPE == "merged_result" || $CI_MERGE_REQUEST_EVENT_TYPE == "detached") || $CI_COMMIT_TAG || $FORCE_GITLAB_CI'
.if-default-branch-refs: &if-default-branch-refs
if: '$CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH && $CI_MERGE_REQUEST_IID == null'
@@ -51,10 +51,10 @@
if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME == "release-tools/update-gitaly" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME =~ /stable-(ee|jh)$/'
.if-merge-request-targeting-stable-branch: &if-merge-request-targeting-stable-branch
- if: '($CI_MERGE_REQUEST_EVENT_TYPE == "merged_result" || $CI_MERGE_REQUEST_EVENT_TYPE == "detached") && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME =~ /^[\d-]+-stable(-ee)?$/'
+ if: '($CI_MERGE_REQUEST_EVENT_TYPE == "merged_result" || $CI_MERGE_REQUEST_EVENT_TYPE == "detached") && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME =~ /^[\d-]+-stable(-ee|-jh)?$/'
-.if-merge-request-labels-run-in-ruby2: &if-merge-request-labels-run-in-ruby2
- if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-in-ruby2/'
+.if-merge-request-labels-run-in-ruby3_1: &if-merge-request-labels-run-in-ruby3_1
+ if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-in-ruby3_1/'
.if-merge-request-labels-as-if-foss: &if-merge-request-labels-as-if-foss
if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-as-if-foss/'
@@ -77,6 +77,9 @@
.if-merge-request-labels-run-single-db: &if-merge-request-labels-run-single-db
if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-single-db/'
+.if-merge-request-labels-run-clusterwide-db: &if-merge-request-labels-run-clusterwide-db
+ if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-clusterwide-db/'
+
.if-merge-request-labels-run-review-app: &if-merge-request-labels-run-review-app
if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-review-app/'
@@ -113,8 +116,8 @@
.if-default-branch-schedule-nightly: &if-default-branch-schedule-nightly
if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE == "schedule" && $SCHEDULE_TYPE == "nightly"'
-.if-ruby2-branch-schedule-nightly: &if-ruby2-branch-schedule-nightly
- if: '$CI_COMMIT_BRANCH == "ruby2" && $CI_PIPELINE_SOURCE == "schedule" && $SCHEDULE_TYPE == "nightly"'
+.if-ruby3_1-branch-schedule-nightly: &if-ruby3_1-branch-schedule-nightly
+ if: '$CI_COMMIT_BRANCH == "ruby3_1" && $CI_PIPELINE_SOURCE == "schedule" && $SCHEDULE_TYPE == "nightly"'
.if-security-schedule: &if-security-schedule
if: '$CI_PROJECT_NAMESPACE == "gitlab-org/security" && $CI_PIPELINE_SOURCE == "schedule"'
@@ -149,8 +152,8 @@
.if-dot-com-gitlab-org-and-security-tag: &if-dot-com-gitlab-org-and-security-tag
if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_NAMESPACE =~ /^gitlab-org($|\/security$)/ && $CI_COMMIT_TAG'
-.if-ruby2-branch: &if-ruby2-branch
- if: '$CI_COMMIT_BRANCH == "ruby2"'
+.if-ruby3_1-branch: &if-ruby3_1-branch
+ if: '$CI_COMMIT_BRANCH == "ruby3_1" || $CI_MERGE_REQUEST_LABELS =~ /pipeline:run-in-ruby3_1/'
####################
# Changes patterns #
@@ -193,10 +196,13 @@
- "lib/gitlab/setup_helper.rb"
.workhorse-patterns: &workhorse-patterns
+ - ".gitlab/ci/workhorse.gitlab-ci.yml"
- "GITLAB_WORKHORSE_VERSION"
- "workhorse/**/*"
- - ".gitlab/ci/workhorse.gitlab-ci.yml"
+ - "scripts/gitaly-test-build"
+ - "scripts/gitaly-test-spawn"
- "spec/support/gitlab-git-test.git/**/*"
+ - "spec/support/helpers/gitaly_setup.rb"
.yaml-lint-patterns: &yaml-lint-patterns
- "**/*.{yml,yaml}{,.*}"
@@ -226,9 +232,7 @@
.docs-deprecations-and-removals-patterns: &docs-deprecations-and-removals-patterns
- "doc/update/deprecations.md"
- - "doc/update/removals.md"
- "data/deprecations/**/*"
- - "data/removals/**/*"
- "tooling/docs/**/*"
- "lib/tasks/gitlab/docs/compile_deprecations.rake"
@@ -311,9 +315,6 @@
.lib-gitlab-patterns: &lib-gitlab-patterns
- "{,ee/,jh/}lib/{,ee/,jh/}gitlab/**/*"
-.startup-css-patterns: &startup-css-patterns
- - "{,ee/,jh/}app/assets/stylesheets/startup/**/*"
-
# Backend patterns + .ci-patterns
.backend-patterns: &backend-patterns
- "{,jh/}Gemfile{,.lock}"
@@ -412,14 +413,13 @@
- ".stylelintrc"
- "Dockerfile.assets"
- "vendor/assets/**/*"
- - ".{eslintignore,gitattributes,nvmrc,prettierrc,stylelintrc,yamllint}"
- - ".gitlab-ci.yml"
+ - ".{eslintrc.yml,eslintignore,gitattributes,nvmrc,prettierrc,stylelintrc,yamllint}"
- "*_VERSION"
- "{,jh/}Gemfile{,.lock}"
- "Rakefile"
- "tests.yml"
- "config.ru"
- - "{,ee/,jh/}{app,bin,config,db,generator_templates,haml_lint,lib,locale,public,scripts,symbol,vendor}/**/*"
+ - "{,ee/,jh/}{app,bin,config,db,generator_templates,haml_lint,lib,locale,public,scripts,storybook,symbol,vendor}/**/*"
- "doc/api/graphql/reference/*" # Files in this folder are auto-generated
# CI changes
- ".gitlab-ci.yml"
@@ -448,6 +448,9 @@
# CI changes
- ".gitlab-ci.yml"
- ".gitlab/ci/**/*"
+ # Mapped patterns (see tests.yml)
+ - "data/whats_new/*.yml"
+ - "doc/index.md"
# Backstage changes
- "Dangerfile"
- "danger/**/*"
@@ -455,9 +458,6 @@
- "{,ee/,jh/}rubocop/**/*"
- "{,ee/,jh/}spec/**/*"
- "{,spec/}tooling/**/*"
- # Mapped patterns (see tests.yml)
- - "data/whats_new/*.yml"
- - "doc/index.md"
# .code-patterns + .qa-patterns
.code-qa-patterns: &code-qa-patterns
@@ -468,7 +468,7 @@
- ".stylelintrc"
- "Dockerfile.assets"
- "vendor/assets/**/*"
- - ".{eslintignore,gitattributes,nvmrc,prettierrc,stylelintrc,yamllint}"
+ - ".{eslintrc.yml,eslintignore,gitattributes,nvmrc,prettierrc,stylelintrc,yamllint}"
- "*_VERSION"
- "{,jh/}Gemfile{,.lock}"
- "Rakefile"
@@ -495,7 +495,7 @@
- ".stylelintrc"
- "Dockerfile.assets"
- "vendor/assets/**/*"
- - ".{eslintignore,gitattributes,nvmrc,prettierrc,stylelintrc,yamllint}"
+ - ".{eslintrc.yml,eslintignore,gitattributes,nvmrc,prettierrc,stylelintrc,yamllint}"
- ".gitlab-ci.yml"
- "*_VERSION"
- "{,jh/}Gemfile{,.lock}"
@@ -533,8 +533,7 @@
- ".stylelintrc"
- "Dockerfile.assets"
- "vendor/assets/**/*"
- - ".{eslintignore,gitattributes,nvmrc,prettierrc,stylelintrc,yamllint}"
- - ".gitlab-ci.yml"
+ - ".{eslintrc.yml,eslintignore,gitattributes,nvmrc,prettierrc,stylelintrc,yamllint}"
- "*_VERSION"
- "{,jh/}Gemfile{,.lock}"
- "Rakefile"
@@ -545,6 +544,9 @@
# CI changes
- ".gitlab-ci.yml"
- ".gitlab/ci/**/*"
+ # Mapped patterns (see tests.yml)
+ - "data/whats_new/*.yml"
+ - "doc/index.md"
# Backstage changes
- "Dangerfile"
- "danger/**/*"
@@ -555,9 +557,6 @@
# QA changes
- ".dockerignore"
- "{,jh/}qa/**/*"
- # Mapped patterns (see tests.yml)
- - "data/whats_new/*.yml"
- - "doc/index.md"
# Workhorse changes
- "GITLAB_WORKHORSE_VERSION"
- "workhorse/**/*"
@@ -617,6 +616,8 @@
.as-if-jh-default-exclusion-rules:
rules:
+ - if: '$ADD_JH_FILES_TOKEN == null'
+ when: never
- <<: *if-security-merge-request
when: never
- <<: *if-merge-request-targeting-stable-branch
@@ -872,10 +873,12 @@
- <<: *if-dot-com-gitlab-org-schedule
variables:
ARCH: amd64,arm64
- - <<: *if-ruby2-branch
+ - <<: *if-ruby3_1-branch
.build-images:rules:build-qa-image-as-if-foss:
rules:
+ - <<: *if-jh
+ when: never
- !reference [".build-images:rules:build-qa-image-merge-requests", "rules"]
- <<: *if-default-branch-schedule-nightly
variables:
@@ -915,7 +918,7 @@
- <<: *if-merge-request-targeting-stable-branch
changes: *setup-test-env-patterns
allow_failure: true
- - <<: *if-ruby2-branch
+ - <<: *if-ruby3_1-branch
allow_failure: true
# We include the job under the matching conditions below, but unlike in .qa:rules:e2e:test-on-gdk we don't need to
# set OMNIBUS_GITLAB_BUILD_ON_ALL_OS when testing against GDK
@@ -950,7 +953,7 @@
when: never
- <<: *if-merge-request-targeting-stable-branch
changes: *setup-test-env-patterns
- - <<: *if-ruby2-branch
+ - <<: *if-ruby3_1-branch
- <<: *if-merge-request-labels-run-review-app
- <<: *if-auto-deploy-branches
- <<: *if-default-refs
@@ -1013,6 +1016,12 @@
when: manual
allow_failure: true
+.caching:rules:cache-assets-as-if-foss:
+ rules:
+ - <<: *if-jh
+ when: never
+ - !reference [".caching:rules:cache-assets", "rules"]
+
.caching:rules:packages-cleanup:
rules:
# The new strategy to cache assets as generic packages is experimental and can be disabled by removing the `CACHE_ASSETS_AS_PACKAGE` variable
@@ -1146,16 +1155,20 @@
- <<: *if-merge-request-targeting-stable-branch
changes: *setup-test-env-patterns
- <<: *if-merge-request-labels-run-review-app
- - <<: *if-merge-request-labels-run-all-e2e
- <<: *if-auto-deploy-branches
- - <<: *if-ruby2-branch
- - <<: *if-default-branch-schedule-nightly
+ - <<: *if-ruby3_1-branch
- <<: *if-default-refs
changes: *ci-build-images-patterns
- <<: *if-default-refs
changes: *code-qa-patterns
- <<: *if-default-refs
changes: *workhorse-patterns
+ # Rules to support .qa:rules:package-and-test
+ - <<: *if-default-branch-schedule-nightly
+ - <<: *if-merge-request-labels-run-all-e2e
+ - <<: *if-dot-com-gitlab-org-and-security-merge-request-manual-ff-package-and-e2e
+ changes: *feature-flag-development-config-patterns
+ - <<: *if-force-ci
.frontend:rules:compile-production-assets-as-if-foss:
rules:
@@ -1175,16 +1188,13 @@
.frontend:rules:compile-test-assets-as-if-foss:
rules:
- - <<: *if-not-ee
- when: never
+ - !reference [".strict-ee-only-rules", rules]
- <<: *if-merge-request-labels-as-if-foss
- <<: *if-merge-request-labels-run-all-rspec
- <<: *if-merge-request-labels-frontend-and-feature-flag
- <<: *if-default-refs
changes: *code-backstage-qa-patterns
- <<: *if-default-refs
- changes: *startup-css-patterns
- - <<: *if-default-refs
changes: *workhorse-patterns
.frontend:rules:default-frontend-jobs:
@@ -1206,8 +1216,6 @@
- <<: *if-merge-request-labels-as-if-foss
- <<: *if-merge-request-labels-run-all-rspec
- <<: *if-merge-request
- changes: *startup-css-patterns
- - <<: *if-merge-request
changes: *frontend-patterns-for-as-if-foss
.frontend:rules:frontend_fixture-as-if-foss:
@@ -1419,7 +1427,7 @@
allow_failure: true
- <<: *if-dot-com-gitlab-org-schedule
allow_failure: true
- - <<: *if-ruby2-branch
+ - <<: *if-ruby3_1-branch
# Rules to support .qa:rules:package-and-test-ee
- <<: *if-merge-request
changes: *dependency-patterns
@@ -1456,7 +1464,10 @@
- <<: *if-merge-request-targeting-stable-branch
changes: *setup-test-env-patterns
allow_failure: true
- - <<: *if-ruby2-branch
+ - <<: *if-ruby3_1-branch
+ variables:
+ USE_OLD_RUBY_VERSION: 'false'
+ CACHE_EDITION: 'GITLAB_RUBY3_1'
allow_failure: true
- <<: *if-merge-request
changes: *dependency-patterns
@@ -1512,8 +1523,6 @@
.qa:rules:package-and-test-ee:
rules:
- - <<: *if-default-branch-schedule-nightly # already executed in the 2-hourly schedule
- when: never
- !reference [".qa:rules:package-and-test-common", rules]
- !reference [".qa:rules:package-and-test-schedule", rules]
- !reference [".qa:rules:code-merge-request-manual", rules]
@@ -1595,6 +1604,10 @@
changes: *setup-test-env-patterns
- <<: *if-merge-request-labels-run-all-rspec
+.rails:rules:clusterwide-db:
+ rules:
+ - <<: *if-merge-request-labels-run-clusterwide-db
+
.rails:rules:single-redis:
rules:
- <<: *if-merge-request-labels-run-single-db
@@ -1615,6 +1628,12 @@
changes: *decomposed-db-models-patterns
- <<: *if-default-branch-schedule-nightly
+.rails:rules:single-db-as-if-foss:
+ rules:
+ - <<: *if-jh
+ when: never
+ - !reference [".rails:rules:single-db", "rules"]
+
.rails:rules:db:check-migrations-single-db:
rules:
- <<: *if-merge-request-labels-run-single-db
@@ -1636,6 +1655,12 @@
changes: *decomposed-db-models-patterns
- <<: *if-default-branch-schedule-nightly
+.rails:rules:single-db-ci-connection-as-if-foss:
+ rules:
+ - <<: *if-jh
+ when: never
+ - !reference [".rails:rules:single-db-ci-connection", "rules"]
+
.rails:rules:db:check-migrations-single-db-ci-connection:
rules:
- <<: *if-merge-request-labels-run-single-db
@@ -1831,8 +1856,7 @@
.rails:rules:as-if-foss-migration:
rules:
- - <<: *if-not-ee
- when: never
+ - !reference [".strict-ee-only-rules", rules]
- <<: *if-merge-request-labels-pipeline-expedite
when: never
- <<: *if-merge-request-labels-run-all-rspec
@@ -1857,8 +1881,7 @@
.rails:rules:as-if-foss-unit:
rules:
- - <<: *if-not-ee
- when: never
+ - !reference [".strict-ee-only-rules", rules]
- <<: *if-fork-merge-request
when: never
- <<: *if-merge-request-labels-pipeline-expedite
@@ -1869,8 +1892,7 @@
.rails:rules:as-if-foss-integration:
rules:
- - <<: *if-not-ee
- when: never
+ - !reference [".strict-ee-only-rules", rules]
- <<: *if-fork-merge-request
when: never
- <<: *if-merge-request-labels-pipeline-expedite
@@ -1881,8 +1903,7 @@
.rails:rules:as-if-foss-system:
rules:
- - <<: *if-not-ee
- when: never
+ - !reference [".strict-ee-only-rules", rules]
- <<: *if-fork-merge-request
when: never
- <<: *if-merge-request-labels-pipeline-expedite
@@ -1968,7 +1989,7 @@
- <<: *if-merge-request-labels-pipeline-expedite
when: never
- <<: *if-default-branch-schedule-nightly
- - <<: *if-ruby2-branch-schedule-nightly
+ - <<: *if-ruby3_1-branch-schedule-nightly
- <<: *if-merge-request-labels-run-all-rspec
.rails:rules:rspec-coverage:
@@ -2045,6 +2066,11 @@
changes: *code-backstage-patterns
when: always
+.rails:rules:clickhouse-changes:
+ rules:
+ - <<: *if-merge-request
+ changes: ["**/*click_house*"]
+
#########################
# Static analysis rules #
#########################
@@ -2099,8 +2125,7 @@
.static-analysis:rules:static-analysis-as-if-foss:
rules:
- - <<: *if-not-ee
- when: never
+ - !reference [".strict-ee-only-rules", rules]
- <<: *if-merge-request-labels-as-if-foss
changes: *code-backstage-qa-patterns
- <<: *if-security-merge-request
@@ -2110,6 +2135,17 @@
- <<: *if-merge-request
changes: *static-analysis-patterns
+.static-analysis:rules:trigger-depsaster:
+ rules:
+ - if: $ENABLE_DEPSASTER != 'true'
+ when: never
+ - <<: *if-fork-merge-request
+ when: never
+ - <<: *if-not-ee
+ when: never
+ - <<: *if-merge-request
+ changes: ["**/Gemfile.checksum"]
+
.semgrep-appsec-custom-rules:rules:
rules:
- <<: *if-not-ee
@@ -2128,87 +2164,19 @@
- <<: *if-merge-request
changes: *code-backstage-qa-patterns
-#######################
-# Vendored gems rules #
-#######################
-
-.vendor:rules:mail-smtp_pool:
- rules:
- - <<: *if-merge-request
- changes: ["vendor/gems/mail-smtp_pool/**/*"]
- - <<: *if-merge-request-labels-run-all-rspec
-
-.vendor:rules:attr_encrypted:
- rules:
- - <<: *if-merge-request
- changes: ["vendor/gems/attr_encrypted/**/*"]
- - <<: *if-merge-request-labels-run-all-rspec
-
-.vendor:rules:microsoft_graph_mailer:
- rules:
- - <<: *if-merge-request
- changes: ["vendor/gems/microsoft_graph_mailer/**/*"]
- - <<: *if-merge-request-labels-run-all-rspec
-
-.vendor:rules:ipynbdiff:
- rules:
- - <<: *if-merge-request
- changes: ["vendor/gems/ipynbdiff/**/*"]
- - <<: *if-merge-request-labels-run-all-rspec
-
-.vendor:rules:omniauth-azure-oauth2:
- rules:
- - <<: *if-merge-request
- changes: ["vendor/gems/omniauth-azure-oauth2/**/*"]
- - <<: *if-merge-request-labels-run-all-rspec
-
-.vendor:rules:omniauth_crowd:
- rules:
- - <<: *if-merge-request
- changes: ["vendor/gems/omniauth_crowd/**/*"]
- - <<: *if-merge-request-labels-run-all-rspec
-
-.vendor:rules:omniauth-gitlab:
- rules:
- - <<: *if-merge-request
- changes: ["vendor/gems/omniauth-gitlab/**/*"]
- - <<: *if-merge-request-labels-run-all-rspec
-
-.vendor:rules:omniauth-salesforce:
- rules:
- - <<: *if-merge-request
- changes: ["vendor/gems/omniauth-salesforce/**/*"]
- - <<: *if-merge-request-labels-run-all-rspec
-
-.vendor:rules:devise-pbkdf2-encryptable:
- rules:
- - <<: *if-merge-request
- changes: ["vendor/gems/devise-pbkdf2-encryptable/**/*"]
- - <<: *if-merge-request-labels-run-all-rspec
-
-.vendor:rules:gitlab_active_record:
- rules:
- - <<: *if-merge-request
- changes: ["vendor/gems/gitlab_active_record/**/*"]
- - <<: *if-merge-request-labels-run-all-rspec
-
-.vendor:rules:bundler-checksum:
- rules:
- - <<: *if-merge-request
- changes: ["vendor/gems/bundler-checksum/**/*"]
- - <<: *if-merge-request-labels-run-all-rspec
-
-.vendor:rules:cloud_profiler_agent:
- rules:
- - <<: *if-merge-request
- changes: ["vendor/gems/cloud_profiler_agent/**/*"]
- - <<: *if-merge-request-labels-run-all-rspec
-
-.vendor:rules:sidekiq-reliable-fetch:
+.ping-appsec-for-dependency-review:rules:
rules:
+ # Requiring $DEPENDENCY_REVIEW_PAT prevents the bot from running on forks or CE
+ # Without it the script would fail too.
+ - if: $ENABLE_DEPSCORE != 'true'
+ when: never
+ - if: "$DEPENDENCY_REVIEW_PAT == null"
+ when: never
+ - <<: *if-not-ee
+ when: never
+ # Run only when the merge request have dependency file modifications
- <<: *if-merge-request
- changes: ["vendor/gems/sidekiq-reliable-fetch/**/*"]
- - <<: *if-merge-request-labels-run-all-rspec
+ changes: *dependency-patterns
##################
# Releases rules #
@@ -2356,11 +2324,9 @@
- <<: *if-merge-request-labels-run-review-app
- <<: *if-dot-com-gitlab-org-merge-request
changes: *ci-review-patterns
- allow_failure: true
- <<: *if-dot-com-gitlab-org-merge-request
changes: *frontend-build-patterns
variables: *review-change-pattern
- allow_failure: true
- <<: *if-dot-com-gitlab-org-merge-request
changes: *controllers-patterns
variables: *review-change-pattern
@@ -2378,7 +2344,6 @@
allow_failure: true
- <<: *if-dot-com-gitlab-org-merge-request
changes: *qa-patterns
- allow_failure: true
- <<: *if-dot-com-gitlab-org-merge-request
changes: *code-patterns
when: manual
@@ -2505,7 +2470,7 @@
.setup:rules:verify-ruby-3.0:
rules:
- - <<: *if-merge-request-labels-run-in-ruby2
+ - <<: *if-merge-request-labels-run-in-ruby3_1
.setup:rules:verify-tests-yml:
rules:
@@ -2533,9 +2498,9 @@
- ".gitlab/ci/test-metadata.gitlab-ci.yml"
- "scripts/rspec_helpers.sh"
-#######################
+###################
# Preflight rules #
-#######################
+###################
.preflight:rules:rails-production-server-boot:
rules:
@@ -2578,6 +2543,11 @@
changes:
- ".gitlab/ci/test-metadata.gitlab-ci.yml"
- "scripts/rspec_helpers.sh"
+ - <<: *if-merge-request
+ changes:
+ - "gems/gitlab-rspec/**/*"
+ - "gems/rspec_flaky/**/*"
+ - "scripts/flaky_examples/prune-old-flaky-examples"
###################
# workhorse rules #
@@ -2665,3 +2635,14 @@
- <<: *if-merge-request-labels-pipeline-expedite
when: never
- !reference [".releases:rules:canonical-dot-com-gitlab-stable-branch-only-setup-test-env-patterns", rules]
+
+###################
+# Benchmark rules #
+###################
+.benchmark:rules:benchmark-markdown:
+ rules:
+ - <<: *if-default-refs
+ changes: *setup-test-env-patterns
+ when: manual
+ - <<: *if-merge-request-labels-run-all-rspec
+ when: manual
diff --git a/.gitlab/ci/setup.gitlab-ci.yml b/.gitlab/ci/setup.gitlab-ci.yml
index 85409d37fa4..ddd479385fc 100644
--- a/.gitlab/ci/setup.gitlab-ci.yml
+++ b/.gitlab/ci/setup.gitlab-ci.yml
@@ -57,7 +57,7 @@ verify-ruby-3.0:
- .setup:rules:verify-ruby-3.0
stage: prepare
script:
- - echo 'Please remove label ~"pipeline:run-in-ruby2" so we do test against Ruby 3.0 (default version) before merging the merge request'
+ - echo 'Please remove label ~"pipeline:run-in-ruby3_1" so we do test against Ruby 3.0 (default version) before merging the merge request'
- exit 1
verify-tests-yml:
@@ -185,15 +185,15 @@ trigger-omnibus-env:
before_script:
- source scripts/utils.sh
script:
+ # Note that OMNIBUS_GITLAB_CACHE_UPDATE is not used in the code, but it is actually used in the 2-hourly maintenance pipeline schedule.
- |
SECURITY_SOURCES=$([[ ! "$CI_PROJECT_NAMESPACE" =~ ^gitlab-org\/security ]] || echo "true")
echo "SECURITY_SOURCES=${SECURITY_SOURCES:-false}" > $BUILD_ENV
echo "OMNIBUS_GITLAB_CACHE_UPDATE=${OMNIBUS_GITLAB_CACHE_UPDATE:-false}" >> $BUILD_ENV
for version_file in *_VERSION; do echo "$version_file=$(cat $version_file)" >> $BUILD_ENV; done
- echo "OMNIBUS_GITLAB_RUBY3_BUILD=${OMNIBUS_GITLAB_RUBY3_BUILD:-false}" >> $BUILD_ENV
- echo "OMNIBUS_GITLAB_RUBY2_BUILD=${OMNIBUS_GITLAB_RUBY2_BUILD:-false}" >> $BUILD_ENV
- echo "OMNIBUS_GITLAB_CACHE_EDITION=${OMNIBUS_GITLAB_CACHE_EDITION:-GITLAB}" >> $BUILD_ENV
echo "OMNIBUS_GITLAB_BUILD_ON_ALL_OS=${OMNIBUS_GITLAB_BUILD_ON_ALL_OS:-false}" >> $BUILD_ENV
+ echo "USE_OLD_RUBY_VERSION=${USE_OLD_RUBY_VERSION:-false}" >> $BUILD_ENV
+ echo "NEXT_RUBY_VERSION=${NEXT_RUBY_VERSION}" >> $BUILD_ENV
echo "GITLAB_ASSETS_TAG=$(assets_image_tag)" >> $BUILD_ENV
echo "EE=$([[ $FOSS_ONLY == '1' ]] && echo 'false' || echo 'true')" >> $BUILD_ENV
target_branch_name="${CI_MERGE_REQUEST_TARGET_BRANCH_NAME:-${CI_COMMIT_REF_NAME}}"
@@ -214,3 +214,5 @@ trigger-omnibus-env as-if-foss:
- .qa:rules:package-and-test-ce
needs:
- compile-production-assets as-if-foss
+ variables:
+ FOSS_ONLY: "1"
diff --git a/.gitlab/ci/static-analysis.gitlab-ci.yml b/.gitlab/ci/static-analysis.gitlab-ci.yml
index b351a63ecf0..40582170cc9 100644
--- a/.gitlab/ci/static-analysis.gitlab-ci.yml
+++ b/.gitlab/ci/static-analysis.gitlab-ci.yml
@@ -134,10 +134,10 @@ rubocop:
unset CI_SLACK_WEBHOOK_URL
run_timed_command "fail_on_warnings bundle exec rake rubocop:check:graceful"
else
- cat "${RSPEC_CHANGED_FILES_PATH}" | ruby -e 'print $stdin.read.split(" ").select { |f| File.exist?(f) }.join(" ")' > "$RUBOCOP_TARGET_FILES"
+ select_existing_files < "${RSPEC_CHANGED_FILES_PATH}" > "${RUBOCOP_TARGET_FILES}"
# Skip running RuboCop if there's no target files
if [ -s "${RUBOCOP_TARGET_FILES}" ]; then
- run_timed_command "fail_on_warnings bundle exec rubocop --parallel --force-exclusion $(cat ${RUBOCOP_TARGET_FILES})"
+ run_timed_command "fail_on_warnings bundle exec rubocop --config .rubocop.yml --parallel --force-exclusion $(cat ${RUBOCOP_TARGET_FILES})"
else
echoinfo "Nothing interesting changed for RuboCop. Skipping."
fi
@@ -177,7 +177,7 @@ feature-flags-usage:
script:
# We need to disable the cache for this cop since it creates files under tmp/feature_flags/*.used,
# the cache would prevent these files from being created.
- - run_timed_command "fail_on_warnings bundle exec rubocop --only Gitlab/MarkUsedFeatureFlags --cache false"
+ - run_timed_command "fail_on_warnings bundle exec rubocop --config .rubocop.yml --only Gitlab/MarkUsedFeatureFlags --cache false"
artifacts:
expire_in: 31d
when: always
@@ -199,7 +199,7 @@ semgrep-appsec-custom-rules:
--include app --include lib --include workhorse \
--exclude '*_test.go' --exclude spec --exclude qa > gl-sast-report.json || true
variables:
- CUSTOM_RULES_URL: https://gitlab.com/gitlab-com/gl-security/appsec/sast-custom-rules/-/raw/main/appsec-pings/rules.yml
+ CUSTOM_RULES_URL: https://gitlab.com/gitlab-com/gl-security/appsec/sast-custom-rules/-/raw/main/gitlab-sast-rules/rules.yml
artifacts:
paths:
- gl-sast-report.json
@@ -217,3 +217,31 @@ ping-appsec-for-sast-findings:
script:
- apk add jq curl
- scripts/process_custom_semgrep_results.sh
+
+trigger-depsaster:
+ extends: .static-analysis:rules:trigger-depsaster
+ stage: lint
+ variables:
+ MERGE_REQUEST_PROJECT_ID: $CI_MERGE_REQUEST_PROJECT_ID
+ MERGE_REQUEST_IID: $CI_MERGE_REQUEST_IID
+ trigger:
+ project: "gitlab-com/gl-security/appsec/tooling/depsaster"
+ allow_failure: true
+
+ping-appsec-for-dependency-review:
+ stage: lint
+ needs: []
+ variables:
+ GIT_CHECKOUT: "false"
+ DISABLE_MENTIONS: "false"
+ DISABLE_SCORING: "true"
+ DISABLE_COMMENTING: "false"
+ DEPENDENCY_REVIEW_BOT_CI_REG: "${CI_REGISTRY}/gitlab-com/gl-security/appsec/tooling/depscore/master"
+ extends: [".ping-appsec-for-dependency-review:rules", ".use-docker-in-docker"]
+ before_script:
+ - apk add jq curl
+ - DEPENDENCY_REVIEW_BOT_UNAME=$(curl --header "PRIVATE-TOKEN:$DEPENDENCY_REVIEW_PAT" "https://gitlab.com/api/v4/user" | jq -r '.username')
+ - echo "$DEPENDENCY_REVIEW_PAT" | docker login --password-stdin -u "$DEPENDENCY_REVIEW_BOT_UNAME" -- "$DEPENDENCY_REVIEW_BOT_CI_REG"
+ script:
+ - docker run --interactive --rm "$DEPENDENCY_REVIEW_BOT_CI_REG:latest" -t "$DEPENDENCY_REVIEW_PAT" -p "$CI_PROJECT_ID" -m "$CI_MERGE_REQUEST_IID" -s "$DISABLE_SCORING" -a "$DISABLE_MENTIONS" -c "$DISABLE_COMMENTING"
+ allow_failure: true
diff --git a/.gitlab/ci/templates/gem.gitlab-ci.yml b/.gitlab/ci/templates/gem.gitlab-ci.yml
new file mode 100644
index 00000000000..46c5e1342c6
--- /dev/null
+++ b/.gitlab/ci/templates/gem.gitlab-ci.yml
@@ -0,0 +1,28 @@
+# The template generates jobs that trigger child pipelines for gems vendored in the main GitLab project under `gems/`.
+#
+# Inputs:
+# - `gem_name`: The name of the gem, i.e. if the gem is located at `gems/gitlab-rspec`, `gem_name` should be set to `gitlab-rspec`.
+# - `gem_path_prefix`: The prefix of the gem path, i.e. if the gem is located at `vendor/gems/gitlab-rspec`, `gem_path_prefix` should be set to `vendor/gems/`. Defaults to `gems/`.
+spec:
+ inputs:
+ gem_name:
+ gem_path_prefix:
+ default: "gems/"
+---
+.gems:rules:$[[inputs.gem_name]]:
+ rules:
+ - if: '$CI_MERGE_REQUEST_EVENT_TYPE == "merged_result" || $CI_MERGE_REQUEST_EVENT_TYPE == "detached"'
+ changes:
+ - "$[[inputs.gem_path_prefix]]$[[inputs.gem_name]]/**/*"
+ - ".gitlab/ci/gitlab-gems.gitlab-ci.yml"
+ - ".gitlab/ci/templates/gem.gitlab-ci.yml"
+ - "gems/gem.gitlab-ci.yml"
+
+gems $[[inputs.gem_name]]:
+ extends: ".gems:rules:$[[inputs.gem_name]]"
+ needs: []
+ trigger:
+ include: "$[[inputs.gem_path_prefix]]$[[inputs.gem_name]]/.gitlab-ci.yml"
+ strategy: depend
+ inherit:
+ variables: false
diff --git a/.gitlab/ci/test-on-gdk/main.gitlab-ci.yml b/.gitlab/ci/test-on-gdk/main.gitlab-ci.yml
index 767dc8433d2..367579b1999 100644
--- a/.gitlab/ci/test-on-gdk/main.gitlab-ci.yml
+++ b/.gitlab/ci/test-on-gdk/main.gitlab-ci.yml
@@ -3,6 +3,18 @@ include:
- local: .gitlab/ci/qa-common/main.gitlab-ci.yml
- local: .gitlab/ci/qa-common/rules.gitlab-ci.yml
- local: .gitlab/ci/qa-common/variables.gitlab-ci.yml
+ - component: "gitlab.com/gitlab-org/quality/pipeline-common/allure-report@7.3.0"
+ inputs:
+ job_name: "e2e-test-report"
+ job_stage: "report"
+ aws_access_key_id_variable_name: "QA_ALLURE_AWS_ACCESS_KEY_ID"
+ aws_secret_access_key_variable_name: "QA_ALLURE_AWS_SECRET_ACCESS_KEY"
+ gitlab_auth_token_variable_name: "PROJECT_TOKEN_FOR_CI_SCRIPTS_API_USAGE"
+ allure_results_glob: "qa/tmp/allure-results"
+ allure_ref_slug: "${CI_COMMIT_REF_SLUG}"
+ allure_project_path: "${CI_PROJECT_PATH}"
+ allure_merge_request_iid: "${CI_MERGE_REQUEST_IID}"
+ allure_job_name: "${QA_RUN_TYPE}"
variables:
COLORIZED_LOGS: "true"
@@ -20,7 +32,6 @@ variables:
tags:
- e2e
variables:
- DOCKER_DRIVER: overlay2
DOCKER_HOST: tcp://docker:2375
QA_GENERATE_ALLURE_REPORT: "true"
QA_CAN_TEST_PRAEFECT: "false"
@@ -29,6 +40,7 @@ variables:
RSPEC_REPORT_OPTS: "--order random --force-color --format documentation --format RspecJunitFormatter --out tmp/rspec-${CI_JOB_ID}.xml --format QA::Support::JsonFormatter --out tmp/rspec-${CI_JOB_ID}.json --format html --out tmp/rspec-${CI_JOB_ID}.htm"
FF_NETWORK_PER_BUILD: 1
GDK_URL: http://gdk.test:3000
+ KNAPSACK_TEST_FILE_PATTERN: "qa/specs/features/**/*_spec.rb"
before_script:
- echo "SUITE_RAN=true" > suite_status.env
- echo -e "\e[0Ksection_start:`date +%s`:pull_image\r\e[0KPull GDK QA image"
@@ -52,11 +64,11 @@ variables:
- source scripts/utils.sh
- cd qa && bundle install
script:
- - retry_exponential test_url ${GDK_URL}/users/sign_in
+ - retry_exponential test_url $GDK_URL/users/sign_in
- echo -e "\e[0Ksection_end:`date +%s`:launch_gdk\r\e[0K"
- echo -e "\e[0Ksection_start:`date +%s`:run_tests\r\e[0KRun E2E tests"
- - QA_COMMAND="bundle exec bin/qa Test::Instance::All ${GDK_URL} -- ${RSPEC_TAGS} ${RSPEC_REPORT_OPTS}"
- - echo "Running - '${QA_COMMAND}'"
+ - export QA_COMMAND="bundle exec bin/qa ${QA_SCENARIO:=Test::Instance::All} $GDK_URL $GITLAB_QA_OPTS -- $QA_TESTS $QA_RSPEC_TAGS $RSPEC_REPORT_OPTS"
+ - echo "Running - '$QA_COMMAND'"
- eval "$QA_COMMAND"
- echo -e "\e[0Ksection_end:`date +%s`:run_tests\r\e[0K"
after_script:
@@ -76,6 +88,11 @@ variables:
when: always
allow_failure: true
+download-knapsack-report:
+ extends:
+ - .download-knapsack-report
+ - .rules:download-knapsack
+
cache-gems:
extends:
- .ruby-image
@@ -105,9 +122,8 @@ gdk-qa-smoke:
extends:
- .gdk-qa-base
variables:
- TEST_GDK_TAGS: "--tag smoke"
+ QA_SCENARIO: Test::Instance::Smoke
QA_RUN_TYPE: gdk-qa-smoke
- RSPEC_TAGS: --tag smoke
rules:
- when: always
@@ -116,37 +132,41 @@ gdk-qa-smoke-with-load-balancer:
- .gdk-qa-base
- .gdk-with-load-balancer-setup
variables:
- TEST_GDK_TAGS: "--tag smoke"
+ QA_SCENARIO: Test::Instance::Smoke
QA_RUN_TYPE: gdk-qa-smoke
- RSPEC_TAGS: --tag smoke
+ artifacts:
+ paths:
+ - log
+ reports:
+ dotenv: ""
rules:
- changes:
- ".gitlab/ci/test-on-gdk/**"
- "lib/gitlab/database/load_balancing/**/*"
-# TODO: set non manual once smoke tests prove to be stable
gdk-qa-reliable:
extends:
- .gdk-qa-base
- parallel: 5
+ - .parallel
variables:
+ QA_SCENARIO: Test::Instance::Blocking
QA_RUN_TYPE: gdk-qa-blocking
- QA_KNAPSACK_REPORT_NAME: ee-instance-parallel
- RSPEC_TAGS: --tag smoke --tag reliable
- allow_failure: true
rules:
- - when: manual
+ - when: always
gdk-qa-reliable-with-load-balancer:
extends:
- .gdk-qa-base
- .gdk-with-load-balancer-setup
- parallel: 5
+ - .parallel
variables:
+ QA_SCENARIO: Test::Instance::Blocking
QA_RUN_TYPE: gdk-qa-blocking
- QA_KNAPSACK_REPORT_NAME: ee-instance-parallel
- RSPEC_TAGS: --tag smoke --tag reliable
- allow_failure: true
+ artifacts:
+ paths:
+ - log
+ reports:
+ dotenv: ""
rules:
- changes:
- ".gitlab/ci/test-on-gdk/**"
@@ -155,12 +175,10 @@ gdk-qa-reliable-with-load-balancer:
gdk-qa-non-blocking:
extends:
- .gdk-qa-base
- parallel: 5
+ - .parallel
variables:
+ QA_SCENARIO: Test::Instance::NonBlocking
QA_RUN_TYPE: gdk-qa-non-blocking
- QA_KNAPSACK_REPORT_NAME: ee-instance-parallel
- QA_SKIP_SMOKE_RELIABLE: "true"
- allow_failure: true
rules:
- when: manual
@@ -168,11 +186,7 @@ gdk-qa-non-blocking:
# Post test stage
# ==========================================
e2e-test-report:
- extends:
- - .e2e-test-report
- - .rules:report:allure-report
- variables:
- ALLURE_RESULTS_GLOB: qa/tmp/allure-results
+ extends: .rules:report:allure-report
upload-knapsack-report:
extends:
diff --git a/.gitlab/ci/vendored-gems.gitlab-ci.yml b/.gitlab/ci/vendored-gems.gitlab-ci.yml
index 3773a343d6d..915cca2dd29 100644
--- a/.gitlab/ci/vendored-gems.gitlab-ci.yml
+++ b/.gitlab/ci/vendored-gems.gitlab-ci.yml
@@ -1,103 +1,45 @@
-vendor mail-smtp_pool:
- extends:
- - .vendor:rules:mail-smtp_pool
- needs: []
- trigger:
- include: vendor/gems/mail-smtp_pool/.gitlab-ci.yml
- strategy: depend
-
-vendor attr_encrypted:
- extends:
- - .vendor:rules:attr_encrypted
- needs: []
- trigger:
- include: vendor/gems/attr_encrypted/.gitlab-ci.yml
- strategy: depend
-
-vendor microsoft_graph_mailer:
- extends:
- - .vendor:rules:microsoft_graph_mailer
- needs: []
- trigger:
- include: vendor/gems/microsoft_graph_mailer/.gitlab-ci.yml
- strategy: depend
-
-vendor ipynbdiff:
- extends:
- - .vendor:rules:ipynbdiff
- needs: []
- trigger:
- include: vendor/gems/ipynbdiff/.gitlab-ci.yml
- strategy: depend
-
-vendor omniauth-azure-oauth2:
- extends:
- - .vendor:rules:omniauth-azure-oauth2
- needs: []
- trigger:
- include: vendor/gems/omniauth-azure-oauth2/.gitlab-ci.yml
- strategy: depend
-
-vendor omniauth_crowd:
- extends:
- - .vendor:rules:omniauth_crowd
- needs: []
- trigger:
- include: vendor/gems/omniauth_crowd/.gitlab-ci.yml
- strategy: depend
-
-vendor omniauth-gitlab:
- extends:
- - .vendor:rules:omniauth-gitlab
- needs: []
- trigger:
- include: vendor/gems/omniauth-gitlab/.gitlab-ci.yml
- strategy: depend
-
-vendor omniauth-salesforce:
- extends:
- - .vendor:rules:omniauth-salesforce
- needs: []
- trigger:
- include: vendor/gems/omniauth-salesforce/.gitlab-ci.yml
- strategy: depend
-
-vendor devise-pbkdf2-encryptable:
- extends:
- - .vendor:rules:devise-pbkdf2-encryptable
- needs: []
- trigger:
- include: vendor/gems/devise-pbkdf2-encryptable/.gitlab-ci.yml
- strategy: depend
-
-vendor bundler-checksum:
- extends:
- - .vendor:rules:bundler-checksum
- needs: []
- trigger:
- include: vendor/gems/bundler-checksum/.gitlab-ci.yml
- strategy: depend
-
-vendor gitlab_active_record:
- extends:
- - .vendor:rules:gitlab_active_record
- needs: []
- trigger:
- include: vendor/gems/gitlab_active_record/.gitlab-ci.yml
- strategy: depend
-
-vendor cloud_profiler_agent:
- extends:
- - .vendor:rules:cloud_profiler_agent
- needs: []
- trigger:
- include: vendor/gems/cloud_profiler_agent/.gitlab-ci.yml
- strategy: depend
-
-vendor sidekiq-reliable-fetch:
- extends:
- - .vendor:rules:sidekiq-reliable-fetch
- needs: []
- trigger:
- include: vendor/gems/sidekiq-reliable-fetch/.gitlab-ci.yml
- strategy: depend
+include:
+ - local: .gitlab/ci/templates/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "mail-smtp_pool"
+ gem_path_prefix: "vendor/gems/"
+ - local: .gitlab/ci/templates/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "attr_encrypted"
+ gem_path_prefix: "vendor/gems/"
+ - local: .gitlab/ci/templates/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "microsoft_graph_mailer"
+ gem_path_prefix: "vendor/gems/"
+ - local: .gitlab/ci/templates/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "omniauth-azure-oauth2"
+ gem_path_prefix: "vendor/gems/"
+ - local: .gitlab/ci/templates/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "omniauth_crowd"
+ gem_path_prefix: "vendor/gems/"
+ - local: .gitlab/ci/templates/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "omniauth-gitlab"
+ gem_path_prefix: "vendor/gems/"
+ - local: .gitlab/ci/templates/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "omniauth-salesforce"
+ gem_path_prefix: "vendor/gems/"
+ - local: .gitlab/ci/templates/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "devise-pbkdf2-encryptable"
+ gem_path_prefix: "vendor/gems/"
+ - local: .gitlab/ci/templates/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "bundler-checksum"
+ gem_path_prefix: "vendor/gems/"
+ - local: .gitlab/ci/templates/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "cloud_profiler_agent"
+ gem_path_prefix: "vendor/gems/"
+ - local: .gitlab/ci/templates/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "sidekiq-reliable-fetch"
+ gem_path_prefix: "vendor/gems/"
diff --git a/.gitlab/ci/workhorse.gitlab-ci.yml b/.gitlab/ci/workhorse.gitlab-ci.yml
index 603f67079c2..00c4dc6c9a9 100644
--- a/.gitlab/ci/workhorse.gitlab-ci.yml
+++ b/.gitlab/ci/workhorse.gitlab-ci.yml
@@ -17,6 +17,9 @@ workhorse:verify:
needs:
- setup-test-env
before_script:
+ - source scripts/utils.sh
+ - export BUNDLE_WITHOUT="${BUNDLE_WITHOUT}:default:test:puma:kerberos:metrics:omnibus:ed25519"
+ - bundle_install_script
- go version
- scripts/gitaly-test-build
script:
diff --git a/.gitlab/ci/yaml.gitlab-ci.yml b/.gitlab/ci/yaml.gitlab-ci.yml
index 0420f158bbb..194b91ccb07 100644
--- a/.gitlab/ci/yaml.gitlab-ci.yml
+++ b/.gitlab/ci/yaml.gitlab-ci.yml
@@ -23,7 +23,7 @@ lint-pipeline-yaml:
stage: lint
needs: []
variables:
- LINT_PATHS: .gitlab-ci.yml .gitlab/ci lib/gitlab/ci/templates data/deprecations data/removals data/whats_new
+ LINT_PATHS: .gitlab-ci.yml .gitlab/ci lib/gitlab/ci/templates data/deprecations data/whats_new
script:
- 'yamllint -d "{extends: default, rules: {line-length: disable, document-start: disable}}" $LINT_PATHS'
diff --git a/.gitlab/issue_templates/Analytics_Instrumentation_Incident_Template.md b/.gitlab/issue_templates/Analytics_Instrumentation_Incident_Template.md
new file mode 100644
index 00000000000..2ebd5acdcd4
--- /dev/null
+++ b/.gitlab/issue_templates/Analytics_Instrumentation_Incident_Template.md
@@ -0,0 +1,49 @@
+<!-- Please complete the template below as best as you can. Make sure to check if this issue has already been raised by someone else first to avoid duplication.
+
+For each section below, please add screenshots or links or anything that may help visual learners understand the problem better, even if this takes you an extra minute or two this is a great help to some folks.
+
+https://www.learning-styles-online.com/style/visual-spatial/
+
+-->
+
+## Problem
+<!-- High level overview of the Incident -->
+
+## Detection
+
+<!-- How did we learn of the problem? System Error? User? -->
+
+## Impact
+
+<!-- Who was impacted and how were they impacted?
+Please include Teams, Users, Automations, Processes -->
+
+
+## Additional information
+
+<!-- Please fill out any additonal information that may help with resolution -->
+
+
+## Checklist
+<!-- Please ensure all of the below steps are taken -->
+
+* [ ] Assigned severity tags based on this [guidance](https://about.gitlab.com/handbook/engineering/development/analytics/analytics-instrumentation/#incident-detection)
+* [ ] Assigned to PM and EM of ~"group::analytics instrumentation"
+* [ ] Posted link to incident in `g_analyze_analytics_instrumentation` and tagged both PM and EM of the group
+
+
+<---- TO BE FILLED BY ASSIGNEE / RESOLUTION DRI---->
+<!-- The intention of this section is to give stakeholders a high level summary of the issue with whatever information we have at the point of closing the issue or providing a quick fix. For a deeper analysis of the root cause and how we can avoid such incidents in the future please use the RCA template as outlined in the handbook incident resolution guidance and link the issue here -->
+
+## Summary
+<!-- Overall summary of the issue -->
+
+## Root Cause
+
+<!-- To be filled by the assignee. What caused this incident? Link to RCA issue if needed -->
+
+## Resolution
+<!-- To be filled by assignee.Has the issue been resolved? How? Please include any relevant issue and/or MR links in the description -->
+
+
+
diff --git a/.gitlab/issue_templates/Broken Master - Flaky.md b/.gitlab/issue_templates/Broken Master - Flaky.md
index b87d9b5ee1f..5b01e67feab 100644
--- a/.gitlab/issue_templates/Broken Master - Flaky.md
+++ b/.gitlab/issue_templates/Broken Master - Flaky.md
@@ -27,4 +27,8 @@ Please refer to the [Resolution guidance](https://about.gitlab.com/handbook/engi
Once the flaky failure has been fixed on the default branch, open merge requests to cherry-pick the fix to the active stable branches.
+### Logs
+
+<!-- Add here failing job logs -->
+
/label ~"type::maintenance" ~"failure::flaky-test" ~"priority::3" ~"severity::3"
diff --git a/.gitlab/issue_templates/Broken Master - Non-flaky.md b/.gitlab/issue_templates/Broken Master - Non-flaky.md
index d2dc616ead8..0b92326ed42 100644
--- a/.gitlab/issue_templates/Broken Master - Non-flaky.md
+++ b/.gitlab/issue_templates/Broken Master - Non-flaky.md
@@ -21,4 +21,8 @@ Please read the below documentations for a workflow of triaging and resolving br
Please refer to the [Resolution guidance](https://about.gitlab.com/handbook/engineering/workflow/#resolution-of-broken-master) to learn more about resolution of broken master.
+### Logs
+
+<!-- Add here failing job logs -->
+
/label ~"master:broken" ~"Engineering Productivity" ~"priority::1" ~"severity::1" ~"type::maintenance" ~"maintenance::pipelines"
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 c63a5cb0032..b77247954de 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
@@ -69,7 +69,6 @@ Geo secondary sites have a [Geo tracking database](https://gitlab.com/gitlab-org
t.integer :retry_count, default: 0, limit: 2, null: false
t.integer :verification_retry_count, default: 0, limit: 2, null: false
t.boolean :checksum_mismatch, default: false, null: false
- t.boolean :force_to_redownload, default: false, null: false
t.boolean :missing_on_primary, default: false, null: false
t.binary :verification_checksum
t.binary :verification_checksum_mismatched
@@ -146,11 +145,14 @@ The Geo primary site needs to checksum every replicable so secondaries can verif
enable_lock_retries!
def up
- create_table :cool_widget_states, id: false do |t|
+ create_table :cool_widget_states do |t|
t.datetime_with_timezone :verification_started_at
t.datetime_with_timezone :verification_retry_at
t.datetime_with_timezone :verified_at
- t.references :cool_widget, primary_key: true, default: nil, index: false, foreign_key: { on_delete: :cascade }
+ t.references :cool_widget,
+ null: false,
+ index: { unique: true },
+ foreign_key: { on_delete: :cascade }
t.integer :verification_state, default: 0, limit: 2, null: false
t.integer :verification_retry_count, default: 0, limit: 2, null: false
t.binary :verification_checksum, using: 'verification_checksum::bytea'
@@ -292,6 +294,11 @@ That's all of the required database changes.
# Search the codebase for examples, and consult a Geo expert if needed.
end
+ override :verification_state_model_key
+ def verification_state_model_key
+ :cool_widget_id
+ end
+
override :verification_state_table_class
def verification_state_table_class
CoolWidgetState
@@ -391,7 +398,7 @@ That's all of the required database changes.
- [ ] Make sure a Geo secondary site can request and download Cool Widgets on the Geo primary site. You may need to make some changes to `Gitlab::GitAccessCoolWidget`. For example, see [this change for Group-level Wikis](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54914/diffs?commit_id=0f2b36f66697b4addbc69bd377ee2818f648dd33).
-- [ ] Make sure a Geo secondary site can replicate Cool Widgets where repository does not exist on the Geo primary site. The only way to know about this is to parse the error text. You may need to make some changes to `Gitlab::CoolWidgetReplicator.no_repo_message` to return the proper error message. For example, see [this change for Group-level Wikis](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/74133).
+- [ ] Make sure a Geo secondary site marks Cool Widgets as missing on primary when a repository does not exist on the Geo primary site. The only way to know about this is to parse the error text. You may need to make some changes to `Gitlab::CoolWidgetReplicator.no_repo_message` to return the proper error message. For example, see [this change for Group-level Wikis](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/74133). Alternatively, if a repository should *always* exist on the primary, then a Geo-specific workaround is to create an empty repository when verifying on primary. See examples for [project wikis](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/123869) and [design repositories](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/123917).
- [ ] Generate the feature flag definition files by running the feature flag commands and following the command prompts:
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 91a86a96ac9..94c93bd27e4 100644
--- a/.gitlab/issue_templates/Geo Replicate a new blob type.md
+++ b/.gitlab/issue_templates/Geo Replicate a new blob type.md
@@ -148,14 +148,13 @@ The Geo primary site needs to checksum every replicable so secondaries can verif
enable_lock_retries!
def up
- create_table :cool_widget_states, id: false do |t|
+ create_table :cool_widget_states do |t|
t.datetime_with_timezone :verification_started_at
t.datetime_with_timezone :verification_retry_at
t.datetime_with_timezone :verified_at
t.references :cool_widget,
- primary_key: true,
- default: nil,
- index: false,
+ null: false,
+ index: { unique: true },
foreign_key: { on_delete: :cascade }
t.integer :verification_state, default: 0, limit: 2, null: false
t.integer :verification_retry_count, default: 0, limit: 2, null: false
@@ -298,6 +297,11 @@ That's all of the required database changes.
# Search the codebase for examples, and consult a Geo expert if needed.
end
+ override :verification_state_model_key
+ def verification_state_model_key
+ :cool_widget_id
+ end
+
override :verification_state_table_class
def verification_state_table_class
CoolWidgetState
diff --git a/.gitlab/issue_templates/Pipeline Execution Issue Implementation.md b/.gitlab/issue_templates/Pipeline Execution Issue Implementation.md
new file mode 100644
index 00000000000..54a8f0e4153
--- /dev/null
+++ b/.gitlab/issue_templates/Pipeline Execution Issue Implementation.md
@@ -0,0 +1,55 @@
+<!--
+## Author Checklist
+(_NOTE: This section can be removed when the issue is ready for creation_)
+- [ ] Ensure that issue title is concise yet descriptive
+- [ ] Add "~frontend", "~backend", or "~documentation" labels as appropriate
+- [ ] Ensure the issue containing the feature or change proposal and related discussions is linked as related to this implementation issue.
+- [ ] Aside from default labeling, please make sure to include relevant labels for `type::`, `workflow::`, and `~frontend`/`~backend` labeling.
+- [ ] Issues with user-facing changes should include the `~UX` label.
+-->
+
+## Summary
+
+## Proposal
+
+## Additional details
+<!--
+_NOTE: If the issue has addressed all of these questions, this separate section can be removed._
+-->
+
+Some relevant technical details, if applicable, such as:
+
+- Does this need a ~"feature flag"?
+- Does there need to be an associated ~"instrumentation" issue created related to this work?
+- Is there an example response showing the data structure that should be returned (new endpoints only)?
+- What permissions should be used?
+- Is this EE or CE?
+ - [ ] EE
+ - [ ] CE
+- Additional comments:
+
+## Implementation Table
+
+<!--
+_NOTE: If the issue is not part of an epic, the implementation table can be removed. If it is part of an epic, make sure that the implementation table below mirrors the corresponding epic's implementation table content._
+-->
+
+
+| Group | Issue Link |
+| ------ | ------ |
+| ~backend | :point_left: You are here |
+| ~frontend | [#123123](url) |
+
+<!--
+## Documentation
+
+_NOTE: This section is optional, but can be used for easy access to any relevant documentation URLs._
+-->
+
+## Links/References
+
+
+
+
+/label ~"group::pipeline execution" ~"Category:Continuous Integration" ~"section::ci" ~"devops::verify" ~"workflow::planning breakdown" ~"needs weight" ~"cicd::planning"
+/milestone %"Backlog"
diff --git a/.gitlab/issue_templates/Pipeline Execution Refinement Spike.md b/.gitlab/issue_templates/Pipeline Execution Refinement Spike.md
new file mode 100644
index 00000000000..38877ad777a
--- /dev/null
+++ b/.gitlab/issue_templates/Pipeline Execution Refinement Spike.md
@@ -0,0 +1,33 @@
+<
+## Author Checklist
+(_NOTE: This section can be removed when the issue is ready for creation_)
+- [ ] Set title to "Spike: Refine "<original issue title>"
+- [ ] Update the slash commands below with the appropriate issue #.
+- [ ] Update the weight slash command to an appropriate value based on the timebox size
+- [ ] Add `~frontend`, `~backend`, or `~documentation` labels as appropriate
+- [ ] Update the expected outcomes if the default ones don't capture everything that should be done in this spike.
+
+/blocks #<original issue>
+/copy_metadata #<original issue>
+
+/label ~"spike" ~"group::pipeline execution" ~"section::ci" ~"devops::verify" ~"workflow::ready for development" ~"cicd::planning"
+/weight ##
+
+## Summary - Why is this spike needed?
+
+## Timebox Expectations
+
+<How much time should be spent on this spike>
+
+## Expected Outcomes
+
+- [ ] Possible cause(s) are determined
+- [ ] Technical proposal added to #<original issue>
+- [ ] Weight added to #<original issue>
+
+
+## Links/References
+
+
+
+
diff --git a/.gitlab/issue_templates/Pipeline Security issue implementation b/.gitlab/issue_templates/Pipeline Security issue implementation.md
index 72807e98012..72807e98012 100644
--- a/.gitlab/issue_templates/Pipeline Security issue implementation
+++ b/.gitlab/issue_templates/Pipeline Security issue implementation.md
diff --git a/.gitlab/issue_templates/Security developer workflow.md b/.gitlab/issue_templates/Security developer workflow.md
index 294d699ea2f..9cbb74d10d8 100644
--- a/.gitlab/issue_templates/Security developer workflow.md
+++ b/.gitlab/issue_templates/Security developer workflow.md
@@ -24,6 +24,7 @@ MUST be linked for the release bot to know that the associated merge requests sh
- [ ] Create a new branch prefixing it with `security-`.
- [ ] Create a merge request targeting `master` on `gitlab.com/gitlab-org/security` and use the [Security Release merge request template].
- [ ] If this includes a breaking change, make sure to include a mention of it 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)
+ * See if the [breaking changes workflow] applies
After your merge request has been approved according to our [approval guidelines] and by a team member of the AppSec team, you're ready to prepare the backports
@@ -76,5 +77,6 @@ After your merge request has been approved according to our [approval guidelines
[approval guidelines]: https://docs.gitlab.com/ee/development/code_review.html#approval-guidelines
[issue as linked]: https://docs.gitlab.com/ee/user/project/issues/related_issues.html#add-a-linked-issue
[issue really needs to follow the security release workflow]: https://gitlab.com/gitlab-org/release/docs/-/blob/master/general/security/developer.md#making-sure-the-issue-needs-to-follow-the-security-release-workflow
+[breaking changes workflow]: https://gitlab.com/gitlab-org/release/docs/-/blob/master/general/security/far_reaching_impact_fixes_or_breaking_change_fixes.md
/label ~security
diff --git a/.gitlab/merge_request_templates/Deprecations.md b/.gitlab/merge_request_templates/Deprecations.md
index 7e622dbe62c..c1321dd9f96 100644
--- a/.gitlab/merge_request_templates/Deprecations.md
+++ b/.gitlab/merge_request_templates/Deprecations.md
@@ -27,9 +27,9 @@ Deprecation announcements can and should be created and merged into Docs at any
Please review:
-- The definitions of ["Deprecation", "End of Support", and "Removal"](https://docs.gitlab.com/ee/development/deprecation_guidelines/#terminology).
-- The [guidelines for deprecations](https://about.gitlab.com/handbook/marketing/blog/release-posts/#deprecations).
-- The process for [creating a deprecation entry](https://about.gitlab.com/handbook/marketing/blog/release-posts/#creating-a-deprecation-entry).
+- The definitions of ["Deprecation", "End of Support", and "Removal"](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- The [guidelines for deprecations](https://about.gitlab.com/handbook/marketing/blog/release-posts/#deprecations-removals-and-breaking-changes).
+- The process for [creating a deprecation announcement](https://about.gitlab.com/handbook/marketing/blog/release-posts/#creating-the-announcement).
They are frequently updated, and everyone should make sure they are aware of the current standards (PM, PMM, EM, and TW).
@@ -38,7 +38,7 @@ They are frequently updated, and everyone should make sure they are aware of the
- [ ] Set yourself as the Assignee, meaning you are the DRI.
- [ ] If the deprecation is a [breaking change](https://about.gitlab.com/handbook/product/gitlab-the-product/#breaking-change), add label `breaking change`.
- [ ] Confirm this MR is labeled ~"release post item::deprecation"
-- [ ] Follow the process to [create a deprecation YAML file](https://about.gitlab.com/handbook/marketing/blog/release-posts/#creating-a-deprecation-entry).
+- [ ] Follow the process to [create a deprecation YAML file](https://about.gitlab.com/handbook/marketing/blog/release-posts/#creating-the-announcement).
- [ ] Add reviewers by the 10th.
- [ ] Add scoped `devops::` and `group::` labels as necessary.
- [ ] Add the appropriate milestone to this MR.
@@ -48,8 +48,8 @@ They are frequently updated, and everyone should make sure they are aware of the
When the content is ready for review, it must be reviewed by a Technical Writer and Engineering Manager, but can also be reviewed by
Product Marketing, Product Design, and the Product Leaders for this area. Please use the
-[reviewers](https://docs.gitlab.com/ee/user/project/merge_requests/reviews/)
-feature for all reviews. Reviewers will then `approve` the MR and remove themselves from Reviewers when their review is complete.
+[reviewers](https://docs.gitlab.com/ee/development/code_review.html#dogfooding-the-reviewers-feature)
+feature for all reviews. Reviewers will then approve the MR and remove themselves from Reviewers when their review is complete.
- [ ] (Recommended) PMM
- [ ] (Optional) Product Designer
@@ -81,7 +81,7 @@ yourself as a reviewer if it's not ready for merge yet.
- All links must be full URLs, as the deprecation YAML files are used in two different projects. Do not use relative links. The generated doc is an exception to the relative link rule and currently uses absolute links only.
- Make sure all links and anchors are correct. Do not link to the H1 (top) anchor on a docs page.
- [ ] Code. Make sure any included code is wrapped in code blocks.
-- [ ] Capitalization. Make sure to capitalize feature names. Stay consistent with the Documentation Style Guidance on [Capitalization](https://docs.gitlab.com/ee/development/documentation/styleguide.html#capitalization).
+- [ ] Capitalization. Make sure to capitalize feature names. Stay consistent with the Documentation Style Guidance on [Capitalization](https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#capitalization).
- [ ] Blank spaces. Remove unnecessary spaces (end of line spaces, double spaces, extra blank lines, and lines with only spaces).
</details>
diff --git a/.gitlab/merge_request_templates/Removals.md b/.gitlab/merge_request_templates/Removals.md
deleted file mode 100644
index d2224a71e65..00000000000
--- a/.gitlab/merge_request_templates/Removals.md
+++ /dev/null
@@ -1,110 +0,0 @@
-<!-- Set the correct label and milestone using autocomplete for guidance. Please @mention only the DRI(s) for each stage or group rather than an entire department. -->
-
-/label ~"release post" ~"release post item" ~"Technical Writing" ~devops:: ~group:: ~"release post item::removal"
-/label ~"type::maintenance" ~"maintenance::removal"
-/milestone %
-/assign `@EM/PM` (choose the DRI; remove backticks here, and below)
-
-**Be sure to link this MR to the relevant issues.**
-
-- Deprecation issue:
-- Removal issue:
-- MR that removed (or _will_ remove) the feature:
-
-If there is no relevant deprecation issue, hit pause and:
-
-- Review the [process for deprecating and removing features](https://about.gitlab.com/handbook/product/gitlab-the-product/#process-for-deprecating-and-removing-a-feature).
-- Connect with the Product Manager DRI.
-
-Removals must be [announced as deprecations](https://about.gitlab.com/handbook/marketing/blog/release-posts/#deprecations) at least 2 milestones in advance of the planned removal date.
-
-If the removal creates a [breaking change](https://about.gitlab.com/handbook/product/gitlab-the-product/#deprecations-removals-and-breaking-changes), it can only be removed in a major "XX.0" release.
-
-**By the 10th**: Assign this MR to these team members as reviewers, and for approval:
-
-- Required:
- - Product Group Manager or Director: `@PM`
- - Engineering Manager: `@EM`
- - Technical writer: `@TW`
-- Optional:
- - Product Designer(s): `@ProductDesigners`
- - Product Marketing: `@PMM`
-
-**By 7:59 PM UTC 15th (11:59 AM PT)**: EM/PM assigns this MR to the TW reviewer for final review and merge: `@EM/PM`
-
-**By 7:59 AM UTC 18th (11:59 PM PT 17th)**: TW Reviewer updates Docs by merging this MR to `master`: `@TW`
-
----
-
-Please review:
-
-- The definitions of ["Deprecation", "End of Support", and "Removal"](https://docs.gitlab.com/ee/development/deprecation_guidelines/#terminology).
-- The [guidelines for removals](https://about.gitlab.com/handbook/marketing/blog/release-posts/#removals).
-
-## EM/PM release post item checklist
-
-- [ ] Set yourself as the Assignee, meaning you are the DRI.
-- [ ] If the removal is a [breaking change](https://about.gitlab.com/handbook/product/gitlab-the-product/#breaking-change), add label `breaking change`.
-- [ ] 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
-
-When the content is ready for review, the Technical Writer and Engineering Manager _must_
-review it. Optional reviewers can include Product Marketing, Product Design, and the Product Leaders
-for this area. Use the
-[reviewers](https://docs.gitlab.com/ee/user/project/merge_requests/reviews/)
-feature for all reviews. Reviewers will `approve` the MR and remove themselves from the reviewers list when their review is complete.
-
-- [ ] (Recommended) PMM
-- [ ] (Optional) Product Designer
-- [ ] (Optional) Group Manager or Director
-- [ ] Required review and approval: [Technical Writer designated to the corresponding DevOps stage/group](https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments).
-
-### Tech writer review
-
-The TW should review according to the criteria listed below. Review a removal MR
-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).
-- [ ] Consistency:
- - Ensure that all resources (docs, removal, etc.) refer to the feature with the same term / feature name.
-- [ ] Content:
- - Make sure the removal is accurate based on your understanding. Look for typos or grammar mistakes. Work with PM and PMM to ensure a consistent GitLab style and tone for messaging, based on other features and removals.
- - Review use of whitespace and bullet lists. Will the removal item be easily scannable when published? Consider adding line breaks or breaking content into bullets if you have more than a few sentences.
- - Make sure there aren't acronyms readers may not understand per <https://about.gitlab.com/handbook/communication/#writing-style-guidelines>.
-- [ ] Links:
- - All links must be full URLs, as the removal YAML files are used in multiple projects. Do not use relative links. The generated doc is an exception to the relative link rule and currently uses absolute links only.
- - Make sure all links and anchors are correct. Do not link to the H1 (top) anchor on a docs page.
-- [ ] Code. Make sure any included code is wrapped in code blocks.
-- [ ] Capitalization. Make sure to capitalize feature names. Stay consistent with the Documentation Style Guidance on [Capitalization](https://docs.gitlab.com/ee/development/documentation/styleguide.html#capitalization).
-- [ ] Blank spaces. Remove unnecessary spaces (end of line spaces, double spaces, extra blank lines, and lines with only spaces).
-
-</details>
-
-When the PM indicates it is ready for merge and all issues have been addressed, start the merge process.
-
-#### Technical writer merge process
-
-The [removals doc's `.md` file](https://gitlab.com/gitlab-org/gitlab/blob/master/doc/update/removals.md)
-must be updated before this MR is merged:
-
-1. Check out the MR's branch (in the [`gitlab-org/gitlab`](https://gitlab.com/gitlab-org/gitlab) project).
-1. From the command line (in the branch), run `bin/rake gitlab:docs:compile_removals`.
- If you want to double check that it worked, you can run `bin/rake gitlab:docs:check_removals`
- to verify that the doc is up to date.
-1. Commit the updated file and push the changes.
-1. Set the merge request to auto-merge, or if the pipeline is already complete, merge.
-
-If you have trouble running the rake task, check the [troubleshooting steps](https://about.gitlab.com/handbook/marketing/blog/release-posts/#deprecation-rake-task-troubleshooting).
diff --git a/.gitlab/sast-ruleset.toml b/.gitlab/sast-ruleset.toml
index 6bfb4618b73..e247d20da2c 100644
--- a/.gitlab/sast-ruleset.toml
+++ b/.gitlab/sast-ruleset.toml
@@ -7,4 +7,4 @@
type = "git"
value = "https://gitlab.com/gitlab-com/gl-security/appsec/sast-custom-rules.git"
ref = "refs/heads/main"
- subdir = "appsec-pings"
+ subdir = "gitlab-sast-rules"
diff --git a/.gitpod.yml b/.gitpod.yml
index 19785aba125..0a047495ac6 100644
--- a/.gitpod.yml
+++ b/.gitpod.yml
@@ -53,7 +53,7 @@ tasks:
cd /workspace/gitlab-development-kit
# update GDK
echo "$(date) – Updating GDK" | tee -a /workspace/startup.log
- export DEFAULT_BRANCH=$(git branch --show-current)
+ export DEFAULT_BRANCH=$(git --git-dir=gitlab/.git branch --show-current)
gdk config set gitlab.default_branch "$DEFAULT_BRANCH"
gdk update
# ensure gdk.yml has correct instance settings
@@ -92,7 +92,7 @@ tasks:
# Give Gitpod a few more seconds to set up everything ...
sleep 5
printf "$(date) – GitLab is up (took ~%.1f minutes)\n" "$((10*$SECONDS/60))e-1" | tee -a /workspace/startup.log
- gp preview $(gp url 3000) || true
+ gp preview $(gp url 3000) --external || true
PREBUILD_LOG=(/workspace/.gitpod/prebuild-log-*)
[[ -f /workspace/gitpod_start_time.sh ]] && printf "Took %.1f minutes from https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitpod.yml being executed through to completion %s\n" "$((10*(($(date +%s)-${START_UNIXTIME}))/60))e-1" "$([[ -f "$PREBUILD_LOG" ]] && echo "With Prebuilds")"
)
diff --git a/.haml-lint.yml b/.haml-lint.yml
index 24e671eee87..08a2442e1eb 100644
--- a/.haml-lint.yml
+++ b/.haml-lint.yml
@@ -109,7 +109,6 @@ linters:
# These cops should eventually get enabled
- Cop/LineBreakAfterGuardClauses
- Cop/ProjectPathHelper
- - Gitlab/FeatureAvailableUsage
- Gitlab/Json
- GitlabSecurity/PublicSend
- Layout/EmptyLineAfterGuardClause
@@ -121,6 +120,7 @@ linters:
- Layout/SpaceInsideStringInterpolation
- Layout/TrailingEmptyLines
- Lint/AmbiguousOperatorPrecedence
+ - Lint/AssignmentInCondition
- Lint/LiteralInInterpolation
- Lint/ParenthesesAsGroupedExpression
- Lint/SafeNavigationConsistency
@@ -131,13 +131,14 @@ linters:
- Performance/RedundantMatch
- Performance/StringReplacement
- Rails/LinkToBlank
+ - Rails/OutputSafety
- Rails/RequestReferer
- Style/ColonMethodCall
- Style/ConditionalAssignment
- Style/FormatString
- Style/HashSyntax
- - Style/IfInsideElse
- Style/IdenticalConditionalBranches
+ - Style/IfInsideElse
- Style/NegatedIf
- Style/NestedTernaryOperator
- Style/RedundantInterpolation
diff --git a/.markdownlint.yml b/.markdownlint.yml
index 6e6cd235092..bf891177ae8 100644
--- a/.markdownlint.yml
+++ b/.markdownlint.yml
@@ -149,3 +149,4 @@ proper-names:
"YouTrack"
]
code_blocks: false
+ html_elements: false
diff --git a/.nvmrc b/.nvmrc
index 6d80269a4f0..8d2a45160e5 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
-18.16.0
+18.16.1 \ No newline at end of file
diff --git a/.rubocop.yml b/.rubocop.yml
index 95240342be3..d52c1784aae 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -40,6 +40,7 @@ AllCops:
TargetRubyVersion: <%= RUBY_VERSION[/^\d+\.\d+/, 0] %>
TargetRailsVersion: 6.0
Exclude:
+ - 'gems/**/*'
- 'vendor/**/*'
- 'node_modules/**/*'
- 'db/fixtures/**/*'
@@ -273,6 +274,11 @@ Naming/FileName:
- XSS
- GRPC
+# Check for the use of before with let_it_be when using "add_role" methods
+# e.g. add_guest, add_reporter, add_developer
+RSpec/BeforeAllRoleAssignment:
+ Enabled: true
+
Rails/ApplicationRecord:
Enabled: true
Exclude:
@@ -389,7 +395,6 @@ Gitlab/Json:
Exclude:
- 'qa/**/*'
- 'scripts/**/*'
- - 'tooling/rspec_flaky/**/*'
- 'lib/quality/**/*'
- 'tooling/danger/**/*'
@@ -484,11 +489,6 @@ Cop/InjectEnterpriseEditionModule:
Style/ReturnNil:
Enabled: true
-# It isn't always safe to replace `=~` with `.match?`, especially when there are
-# nil values on the left hand side
-Performance/RegexpMatch:
- Enabled: false
-
Cop/ActiveRecordAssociationReload:
Enabled: true
Exclude:
@@ -546,6 +546,7 @@ RSpec/MissingFeatureCategory:
Enabled: true
Exclude:
- 'qa/**/*.rb'
+ - 'gems/**/*.rb'
RSpec/FactoryBot/AvoidCreate:
Enabled: true
@@ -620,15 +621,6 @@ Graphql/AuthorizeTypes:
- 'spec/**/*.rb'
- 'ee/spec/**/*.rb'
-Graphql/GIDExpectedType:
- Enabled: true
- Include:
- - 'app/graphql/**/*'
- - 'ee/app/graphql/**/*'
- Exclude:
- - 'spec/**/*.rb'
- - 'ee/spec/**/*.rb'
-
Graphql/IDType:
Enabled: true
Include:
@@ -675,7 +667,6 @@ RSpec/EnvMocking:
- 'ee/spec/**/fast_spec_helper.rb'
- 'spec/**/spec_helper.rb'
- 'ee/spec/**/spec_helper.rb'
- - 'spec/support/helpers/stub_env.rb'
RSpec/BeSuccessMatcher:
Enabled: true
@@ -926,6 +917,13 @@ Performance/ActiveRecordSubtransactionMethods:
Migration/BackgroundMigrationBaseClass:
Enabled: false
+BackgroundMigration/AvoidSilentRescueExceptions:
+ Enabled: false
+
+Migration/AvoidFinalizeBackgroundMigration:
+ Include:
+ - 'db/post_migrate/*.rb'
+
Style/ClassAndModuleChildren:
Enabled: true
@@ -971,11 +969,6 @@ Cop/SidekiqApiUsage:
- 'config/initializers/sidekiq.rb'
- 'config/initializers/forbid_sidekiq_in_transactions.rb'
-Rake/Require:
- Include:
- - '{,ee/,jh/}lib/**/*.rake'
- - 'qa/tasks/**/*.rake'
-
Cop/FeatureFlagUsage:
Include:
- 'lib/gitlab/redis/**/*.rb'
@@ -1022,3 +1015,10 @@ RSpec/FactoryBot/LocalStaticAssignment:
Rails/TransactionExitStatement:
Enabled: true
+
+Search/AvoidCheckingFinishedOnDeprecatedMigrations:
+ Include:
+ - 'ee/app/models/**/*.rb'
+ - 'ee/lib/elastic/**/*.rb'
+ - 'ee/lib/gitlab/elastic/**/*.rb'
+ - 'ee/spec/support/helpers/elasticsearch_helpers.rb'
diff --git a/.rubocop_todo/background_migration/avoid_silent_rescue_exceptions.yml b/.rubocop_todo/background_migration/avoid_silent_rescue_exceptions.yml
new file mode 100644
index 00000000000..5e8da636254
--- /dev/null
+++ b/.rubocop_todo/background_migration/avoid_silent_rescue_exceptions.yml
@@ -0,0 +1,8 @@
+---
+BackgroundMigration/AvoidSilentRescueExceptions:
+ Exclude:
+ - 'lib/gitlab/background_migration/backfill_imported_issue_search_data.rb'
+ - 'lib/gitlab/background_migration/migrate_links_for_vulnerability_findings.rb'
+ - 'lib/gitlab/background_migration/populate_vulnerability_dismissal_fields.rb'
+ - 'lib/gitlab/background_migration/reset_status_on_container_repositories.rb'
+ - 'lib/gitlab/background_migration/migrate_remediations_for_vulnerability_findings.rb'
diff --git a/.rubocop_todo/factory_bot/create_list.yml b/.rubocop_todo/factory_bot/create_list.yml
new file mode 100644
index 00000000000..289be6ef20b
--- /dev/null
+++ b/.rubocop_todo/factory_bot/create_list.yml
@@ -0,0 +1,83 @@
+---
+# Cop supports --autocorrect.
+FactoryBot/CreateList:
+ Details: grace period
+ Exclude:
+ - 'ee/spec/controllers/ee/search_controller_spec.rb'
+ - 'ee/spec/controllers/projects/licenses_controller_spec.rb'
+ - 'ee/spec/factories/geo_nodes.rb'
+ - 'ee/spec/features/projects/environments/environments_spec.rb'
+ - 'ee/spec/features/projects/licenses/maintainer_views_policies_spec.rb'
+ - 'ee/spec/finders/security/findings_finder_spec.rb'
+ - 'ee/spec/finders/security/pipeline_vulnerabilities_finder_spec.rb'
+ - 'ee/spec/frontend/fixtures/dast_profiles.rb'
+ - 'ee/spec/frontend/fixtures/merge_requests.rb'
+ - 'ee/spec/graphql/types/pipeline_security_report_finding_type_spec.rb'
+ - 'ee/spec/helpers/ee/branches_helper_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/usage_data_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/reports/security/vulnerability_reports_comparer_spec.rb'
+ - 'ee/spec/lib/gitlab/license_scanning/sbom_scanner_spec.rb'
+ - 'ee/spec/lib/gitlab/vulnerabilities/findings_preloader_spec.rb'
+ - 'ee/spec/models/approval_project_rule_spec.rb'
+ - 'ee/spec/models/ci/build_spec.rb'
+ - 'ee/spec/models/ee/project_spec.rb'
+ - 'ee/spec/models/geo_node_spec.rb'
+ - 'ee/spec/models/label_note_spec.rb'
+ - 'ee/spec/models/merge_request_spec.rb'
+ - 'ee/spec/models/merge_requests/external_status_check_spec.rb'
+ - 'ee/spec/models/preloaders/environments/protected_environment_preloader_spec.rb'
+ - 'ee/spec/models/protected_environment_spec.rb'
+ - 'ee/spec/models/sca/license_compliance_spec.rb'
+ - 'ee/spec/models/visible_approvable_spec.rb'
+ - 'ee/spec/models/vulnerabilities/finding_spec.rb'
+ - 'ee/spec/presenters/merge_request_presenter_spec.rb'
+ - 'ee/spec/requests/api/search_spec.rb'
+ - 'ee/spec/requests/api/status_checks_spec.rb'
+ - 'ee/spec/requests/projects/pipelines_controller_spec.rb'
+ - 'ee/spec/serializers/license_compliance/collapsed_comparer_entity_spec.rb'
+ - 'ee/spec/serializers/license_compliance/comparer_entity_spec.rb'
+ - 'ee/spec/services/approval_rules/params_filtering_service_spec.rb'
+ - 'ee/spec/services/ci/compare_license_scanning_reports_service_spec.rb'
+ - 'ee/spec/services/ci/sync_reports_to_approval_rules_service_spec.rb'
+ - 'ee/spec/services/ee/issuable/bulk_update_service_spec.rb'
+ - 'ee/spec/services/epics/epic_links/create_service_spec.rb'
+ - 'ee/spec/services/geo/node_update_service_spec.rb'
+ - 'ee/spec/services/iterations/roll_over_issues_service_spec.rb'
+ - 'ee/spec/services/members/activate_service_spec.rb'
+ - 'ee/spec/services/sbom/ingestion/tasks/ingest_components_spec.rb'
+ - 'ee/spec/services/sbom/ingestion/tasks/ingest_sources_spec.rb'
+ - 'ee/spec/services/security/findings/dismiss_service_spec.rb'
+ - 'ee/spec/services/security/ingestion/ingest_report_slice_service_spec.rb'
+ - 'ee/spec/services/security/ingestion/mark_as_resolved_service_spec.rb'
+ - 'ee/spec/services/vulnerabilities/find_or_create_from_security_finding_service_spec.rb'
+ - 'ee/spec/support/shared_examples/requests/api/graphql/issue_list_shared_examples.rb'
+ - 'spec/controllers/groups/children_controller_spec.rb'
+ - 'spec/features/groups/milestone_spec.rb'
+ - 'spec/features/projects/environments/environments_spec.rb'
+ - 'spec/finders/clusters/agent_tokens_finder_spec.rb'
+ - 'spec/graphql/resolvers/design_management/design_resolver_spec.rb'
+ - 'spec/helpers/branches_helper_spec.rb'
+ - 'spec/helpers/groups/group_members_helper_spec.rb'
+ - 'spec/lib/atlassian/jira_connect/serializers/repository_entity_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/security/report_spec.rb'
+ - 'spec/lib/gitlab/usage_data_spec.rb'
+ - 'spec/mailers/repository_check_mailer_spec.rb'
+ - 'spec/models/ci/group_spec.rb'
+ - 'spec/models/concerns/issuable_spec.rb'
+ - 'spec/models/deploy_key_spec.rb'
+ - 'spec/models/group_spec.rb'
+ - 'spec/models/label_note_spec.rb'
+ - 'spec/models/note_spec.rb'
+ - 'spec/models/work_items/widgets/assignees_spec.rb'
+ - 'spec/models/work_items/widgets/labels_spec.rb'
+ - 'spec/requests/api/graphql/project/pipeline_spec.rb'
+ - 'spec/requests/api/protected_branches_spec.rb'
+ - 'spec/requests/api/protected_tags_spec.rb'
+ - 'spec/services/clusters/management/validate_management_project_permissions_service_spec.rb'
+ - 'spec/services/issuable/bulk_update_service_spec.rb'
+ - 'spec/services/issues/resolve_discussions_spec.rb'
+ - 'spec/services/merge_requests/assign_issues_service_spec.rb'
+ - 'spec/services/projects/fork_service_spec.rb'
+ - 'spec/support/shared_examples/models/concerns/bulk_users_by_email_load_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/graphql/issue_list_shared_examples.rb'
diff --git a/.rubocop_todo/fips/md5.yml b/.rubocop_todo/fips/md5.yml
index d50aaf79502..4a1994635b7 100644
--- a/.rubocop_todo/fips/md5.yml
+++ b/.rubocop_todo/fips/md5.yml
@@ -17,5 +17,3 @@ Fips/MD5:
- 'spec/lib/gitlab/ci/trace/remote_checksum_spec.rb'
- 'spec/models/concerns/checksummable_spec.rb'
- 'spec/services/gravatar_service_spec.rb'
- - 'spec/tooling/rspec_flaky/example_spec.rb'
- - 'tooling/rspec_flaky/example.rb'
diff --git a/.rubocop_todo/gettext/static_identifier.yml b/.rubocop_todo/gettext/static_identifier.yml
index f14c4884102..2db2a2f130f 100644
--- a/.rubocop_todo/gettext/static_identifier.yml
+++ b/.rubocop_todo/gettext/static_identifier.yml
@@ -13,7 +13,6 @@ Gettext/StaticIdentifier:
- 'app/services/users/banned_user_base_service.rb'
- 'app/services/work_items/widgets/hierarchy_service/base_service.rb'
- 'ee/app/controllers/admin/licenses_controller.rb'
- - 'ee/app/controllers/subscriptions/groups_controller.rb'
- 'ee/app/mailers/ee/emails/admin_notification.rb'
- 'ee/app/mailers/emails/namespace_storage_usage_mailer.rb'
- 'ee/app/models/ee/member.rb'
diff --git a/.rubocop_todo/gitlab/doc_url.yml b/.rubocop_todo/gitlab/doc_url.yml
index 119de2296ce..13537a142a1 100644
--- a/.rubocop_todo/gitlab/doc_url.yml
+++ b/.rubocop_todo/gitlab/doc_url.yml
@@ -43,7 +43,6 @@ Gitlab/DocUrl:
- 'lib/gitlab/pagination/keyset/unsupported_scope_order.rb'
- 'lib/gitlab/redis/hll.rb'
- 'lib/gitlab/slash_commands/presenters/help.rb'
- - 'lib/gitlab/utils/strong_memoize.rb'
- 'lib/initializer_connections.rb'
- 'lib/security/ci_configuration/base_build_action.rb'
- 'lib/tasks/db_obsolete_ignored_columns.rake'
diff --git a/.rubocop_todo/gitlab/feature_available_usage.yml b/.rubocop_todo/gitlab/feature_available_usage.yml
index d7eec700a9d..a0c71dec923 100644
--- a/.rubocop_todo/gitlab/feature_available_usage.yml
+++ b/.rubocop_todo/gitlab/feature_available_usage.yml
@@ -38,7 +38,6 @@ Gitlab/FeatureAvailableUsage:
- 'ee/app/models/approval_state.rb'
- 'ee/app/models/concerns/ee/approvable.rb'
- 'ee/app/models/concerns/ee/project_security_scanners_information.rb'
- - 'ee/app/models/concerns/ee/protected_ref_access.rb'
- 'ee/app/models/concerns/insights_feature.rb'
- 'ee/app/models/ee/board.rb'
- 'ee/app/models/ee/ci/build.rb'
@@ -68,7 +67,6 @@ Gitlab/FeatureAvailableUsage:
- 'ee/app/services/ci/audit_variable_change_service.rb'
- 'ee/app/services/dashboard/projects/create_service.rb'
- 'ee/app/services/dashboard/projects/list_service.rb'
- - 'ee/app/services/ee/alert_management/http_integrations/create_service.rb'
- 'ee/app/services/ee/audit_event_service.rb'
- 'ee/app/services/ee/boards/issues/list_service.rb'
- 'ee/app/services/ee/boards/lists/create_service.rb'
@@ -91,6 +89,31 @@ Gitlab/FeatureAvailableUsage:
- 'ee/app/services/projects/mark_for_deletion_service.rb'
- 'ee/app/services/requirements_management/process_test_reports_service.rb'
- 'ee/app/services/security/store_scans_service.rb'
+ - 'ee/app/views/compliance_management/compliance_framework/_project_settings.html.haml.rb'
+ - 'ee/app/views/groups/epics/index.html.haml.rb'
+ - 'ee/app/views/product_analytics/_project_settings.html.haml.rb'
+ - 'ee/app/views/projects/_merge_request_settings.html.haml.rb'
+ - 'ee/app/views/projects/_merge_request_settings_description_text.html.haml.rb'
+ - 'ee/app/views/projects/_remove.html.haml.rb'
+ - 'ee/app/views/projects/audit_events/index.html.haml.rb'
+ - 'ee/app/views/projects/blob/_header_file_locks.html.haml.rb'
+ - 'ee/app/views/projects/branch_defaults/_branch_names_help.html.haml.rb'
+ - 'ee/app/views/projects/merge_requests/show.html.haml.rb'
+ - 'ee/app/views/projects/push_rules/_index.html.haml.rb'
+ - 'ee/app/views/projects/quality/test_cases/index.html.haml.rb'
+ - 'ee/app/views/projects/settings/_default_issue_template.html.haml.rb'
+ - 'ee/app/views/projects/settings/_restore.html.haml.rb'
+ - 'ee/app/views/projects/settings/ci_cd/_auto_rollback.html.haml.rb'
+ - 'ee/app/views/projects/settings/ci_cd/_pipeline_subscriptions.html.haml.rb'
+ - 'ee/app/views/projects/settings/merge_requests/_merge_request_approvals_settings.html.haml.rb'
+ - 'ee/app/views/projects/settings/operations/_status_page.html.haml.rb'
+ - 'ee/app/views/projects/settings/repository/_protected_branches.html.haml.rb'
+ - 'ee/app/views/protected_branches/ee/_code_owner_approval_form.html.haml.rb'
+ - 'ee/app/views/protected_branches/ee/_code_owner_approval_table.html.haml.rb'
+ - 'ee/app/views/protected_branches/ee/_code_owner_approval_table_head.html.haml.rb'
+ - 'ee/app/views/shared/labels/_create_label_help_text.html.haml.rb'
+ - 'ee/app/views/shared/promotions/_promote_mr_features.html.haml.rb'
+ - 'ee/app/views/shared/promotions/_promote_repository_features.html.haml.rb'
- 'ee/app/workers/analytics/code_review_metrics_worker.rb'
- 'ee/app/workers/group_saml_group_sync_worker.rb'
- 'ee/lib/ee/api/entities/approval_state.rb'
diff --git a/.rubocop_todo/gitlab/namespaced_class.yml b/.rubocop_todo/gitlab/namespaced_class.yml
index 8a0dd63ae7c..8c8306124c1 100644
--- a/.rubocop_todo/gitlab/namespaced_class.yml
+++ b/.rubocop_todo/gitlab/namespaced_class.yml
@@ -808,6 +808,7 @@ Gitlab/NamespacedClass:
- 'app/workers/purge_dependency_proxy_cache_worker.rb'
- 'app/workers/reactive_caching_worker.rb'
- 'app/workers/rebase_worker.rb'
+ - 'app/workers/redis_migration_worker.rb'
- 'app/workers/remote_mirror_notification_worker.rb'
- 'app/workers/remove_expired_group_links_worker.rb'
- 'app/workers/remove_expired_members_worker.rb'
@@ -1248,7 +1249,6 @@ Gitlab/NamespacedClass:
- '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'
diff --git a/.rubocop_todo/gitlab/service_response.yml b/.rubocop_todo/gitlab/service_response.yml
index a61bb27ed2e..eef625fed0c 100644
--- a/.rubocop_todo/gitlab/service_response.yml
+++ b/.rubocop_todo/gitlab/service_response.yml
@@ -49,7 +49,6 @@ Gitlab/ServiceResponse:
- 'ee/app/services/external_status_checks/destroy_service.rb'
- 'ee/app/services/external_status_checks/dispatch_service.rb'
- 'ee/app/services/external_status_checks/update_service.rb'
- - 'ee/app/services/gitlab_subscriptions/create_trial_or_lead_service.rb'
- 'ee/app/services/group_saml/saml_group_links/create_service.rb'
- 'ee/app/services/iterations/cadences/create_iterations_in_advance_service.rb'
- 'ee/app/services/iterations/cadences/create_service.rb'
diff --git a/.rubocop_todo/gitlab/strong_memoize_attr.yml b/.rubocop_todo/gitlab/strong_memoize_attr.yml
index 62457a0108e..b30a18be6ba 100644
--- a/.rubocop_todo/gitlab/strong_memoize_attr.yml
+++ b/.rubocop_todo/gitlab/strong_memoize_attr.yml
@@ -1,6 +1,7 @@
---
# Cop supports --autocorrect.
Gitlab/StrongMemoizeAttr:
+ Details: grace period
Exclude:
- 'app/components/pajamas/avatar_component.rb'
- 'app/controllers/application_controller.rb'
@@ -27,7 +28,6 @@ Gitlab/StrongMemoizeAttr:
- 'app/controllers/projects/incidents_controller.rb'
- 'app/controllers/projects/merge_requests/drafts_controller.rb'
- 'app/controllers/projects/merge_requests_controller.rb'
- - 'app/controllers/projects/metrics_dashboard_controller.rb'
- 'app/controllers/projects/milestones_controller.rb'
- 'app/controllers/projects/pipelines/application_controller.rb'
- 'app/controllers/projects/pipelines_controller.rb'
@@ -52,7 +52,6 @@ Gitlab/StrongMemoizeAttr:
- 'app/finders/merge_requests_finder/params.rb'
- 'app/finders/projects/members/effective_access_level_finder.rb'
- 'app/finders/releases/evidence_pipeline_finder.rb'
- - 'app/finders/releases_finder.rb'
- 'app/finders/snippets_finder.rb'
- 'app/finders/todos_finder.rb'
- 'app/graphql/resolvers/issue_status_counts_resolver.rb'
@@ -125,7 +124,6 @@ Gitlab/StrongMemoizeAttr:
- 'app/models/namespaces/traversal/linear.rb'
- 'app/models/namespaces/traversal/recursive.rb'
- 'app/models/note.rb'
- - 'app/models/pages/lookup_path.rb'
- 'app/models/project.rb'
- 'app/models/release.rb'
- 'app/models/resource_event.rb'
@@ -134,7 +132,6 @@ Gitlab/StrongMemoizeAttr:
- 'app/models/snippet_input_action_collection.rb'
- 'app/models/state_note.rb'
- 'app/models/tree.rb'
- - 'app/models/uploads/fog.rb'
- 'app/models/user.rb'
- 'app/models/wiki_page.rb'
- 'app/models/work_item.rb'
@@ -173,7 +170,6 @@ Gitlab/StrongMemoizeAttr:
- 'app/services/ci/queue/build_queue_service.rb'
- 'app/services/ci/update_build_state_service.rb'
- 'app/services/clusters/agents/authorizations/ci_access/refresh_service.rb'
- - 'app/services/clusters/integrations/prometheus_health_check_service.rb'
- 'app/services/concerns/alert_management/alert_processing.rb'
- 'app/services/concerns/incident_management/settings.rb'
- 'app/services/concerns/issues/resolve_discussions.rb'
@@ -250,7 +246,6 @@ Gitlab/StrongMemoizeAttr:
- 'app/workers/merge_request_cleanup_refs_worker.rb'
- 'app/workers/packages/cleanup/execute_policy_worker.rb'
- 'app/workers/packages/debian/generate_distribution_worker.rb'
- - 'app/workers/packages/debian/process_changes_worker.rb'
- 'app/workers/packages/maven/metadata/sync_worker.rb'
- 'app/workers/projects/inactive_projects_deletion_cron_worker.rb'
- 'ee/app/controllers/admin/audit_logs_controller.rb'
@@ -284,10 +279,10 @@ Gitlab/StrongMemoizeAttr:
- 'ee/app/helpers/ee/preferences_helper.rb'
- 'ee/app/helpers/ee/registrations_helper.rb'
- 'ee/app/helpers/ee/timeboxes_helper.rb'
- - 'ee/app/helpers/trials_helper.rb'
- - 'ee/app/helpers/welcome_helper.rb'
- 'ee/app/helpers/license_monitoring_helper.rb'
- 'ee/app/helpers/subscriptions_helper.rb'
+ - 'ee/app/helpers/trials_helper.rb'
+ - 'ee/app/helpers/welcome_helper.rb'
- 'ee/app/models/approval_merge_request_rule.rb'
- 'ee/app/models/approval_state.rb'
- 'ee/app/models/approval_wrapped_any_approver_rule.rb'
@@ -317,7 +312,6 @@ Gitlab/StrongMemoizeAttr:
- 'ee/app/models/ee/namespace.rb'
- 'ee/app/models/ee/project.rb'
- 'ee/app/models/ee/snippet.rb'
- - 'ee/app/models/ee/user.rb'
- 'ee/app/models/ee/work_item.rb'
- 'ee/app/models/gitlab/seat_link_data.rb'
- 'ee/app/models/gitlab_subscription.rb'
@@ -329,6 +323,7 @@ Gitlab/StrongMemoizeAttr:
- 'ee/app/models/vulnerabilities/finding.rb'
- 'ee/app/presenters/approval_rule_presenter.rb'
- 'ee/app/presenters/ci/minutes/usage_presenter.rb'
+ - 'ee/app/presenters/merge_request_approver_presenter.rb'
- 'ee/app/serializers/dashboard_operations_project_entity.rb'
- 'ee/app/serializers/ee/member_user_entity.rb'
- 'ee/app/services/app_sec/dast/pipelines/find_latest_service.rb'
@@ -338,7 +333,6 @@ Gitlab/StrongMemoizeAttr:
- 'ee/app/services/ci/compare_license_scanning_reports_collapsed_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/ci/sync_reports_to_approval_rules_service.rb'
- 'ee/app/services/deployments/approval_service.rb'
- 'ee/app/services/ee/allowed_email_domains/update_service.rb'
- 'ee/app/services/ee/auto_merge_service.rb'
@@ -389,13 +383,11 @@ Gitlab/StrongMemoizeAttr:
- 'ee/app/services/status_page/publish_service.rb'
- 'ee/app/services/status_page/trigger_publish_service.rb'
- 'ee/app/services/timebox_report_service.rb'
- - 'ee/app/services/vulnerabilities/create_service.rb'
- 'ee/app/services/vulnerability_feedback/create_service.rb'
- 'ee/app/services/vulnerability_feedback/destroy_service.rb'
- 'ee/app/workers/auth/saml_group_sync_worker.rb'
- 'ee/app/workers/geo/repository_cleanup_worker.rb'
- 'ee/app/workers/geo/scheduler/scheduler_worker.rb'
- - 'ee/app/workers/group_saml_group_sync_worker.rb'
- 'ee/app/workers/status_page/publish_worker.rb'
- 'ee/lib/api/analytics/project_deployment_frequency.rb'
- 'ee/lib/api/epic_links.rb'
@@ -417,7 +409,6 @@ Gitlab/StrongMemoizeAttr:
- 'ee/lib/ee/gitlab/checks/diff_check.rb'
- 'ee/lib/ee/gitlab/ci/matching/runner_matcher.rb'
- 'ee/lib/ee/gitlab/ci/pipeline/chain/validate/external.rb'
- - 'ee/lib/ee/gitlab/ci/pipeline/quota/activity.rb'
- 'ee/lib/ee/gitlab/ci/pipeline/quota/size.rb'
- 'ee/lib/ee/gitlab/etag_caching/router/rails.rb'
- 'ee/lib/ee/gitlab/git_access.rb'
@@ -427,7 +418,6 @@ Gitlab/StrongMemoizeAttr:
- 'ee/lib/ee/gitlab/security/scan_configuration.rb'
- 'ee/lib/ee/gitlab/web_hooks/rate_limiter.rb'
- 'ee/lib/ee/sidebars/groups/menus/issues_menu.rb'
- - 'ee/lib/ee/sidebars/groups/menus/settings_menu.rb'
- 'ee/lib/elastic/multi_version_util.rb'
- 'ee/lib/gitlab/auth/group_saml/auth_hash.rb'
- 'ee/lib/gitlab/auth/group_saml/membership_updater.rb'
@@ -481,7 +471,6 @@ Gitlab/StrongMemoizeAttr:
- 'lib/atlassian/jira_connect/jwt/symmetric.rb'
- 'lib/banzai/filter/base_sanitization_filter.rb'
- 'lib/banzai/filter/custom_emoji_filter.rb'
- - 'lib/banzai/filter/inline_metrics_redactor_filter.rb'
- 'lib/banzai/filter/issuable_reference_expansion_filter.rb'
- 'lib/banzai/filter/references/reference_cache.rb'
- 'lib/banzai/filter/repository_link_filter.rb'
@@ -571,7 +560,6 @@ Gitlab/StrongMemoizeAttr:
- 'lib/gitlab/config/entry/composable_array.rb'
- 'lib/gitlab/config/loader/yaml.rb'
- 'lib/gitlab/conflict/file.rb'
- - 'lib/gitlab/database/background_migration/health_status/indicators/write_ahead_log.rb'
- 'lib/gitlab/database/bulk_update.rb'
- 'lib/gitlab/database/load_balancing/srv_resolver.rb'
- 'lib/gitlab/database/metrics.rb'
@@ -614,7 +602,6 @@ Gitlab/StrongMemoizeAttr:
- 'lib/gitlab/import_export/importer.rb'
- 'lib/gitlab/import_export/lfs_restorer.rb'
- 'lib/gitlab/import_export/project/sample/date_calculator.rb'
- - 'lib/gitlab/import_export/project/tree_restorer.rb'
- 'lib/gitlab/inactive_projects_deletion_warning_tracker.rb'
- 'lib/gitlab/instrumentation/redis_base.rb'
- 'lib/gitlab/instrumentation/redis_payload.rb'
diff --git a/.rubocop_todo/graphql/resource_not_available_error.yml b/.rubocop_todo/graphql/resource_not_available_error.yml
index 5a9d2f9b1a2..316cd4a99cb 100644
--- a/.rubocop_todo/graphql/resource_not_available_error.yml
+++ b/.rubocop_todo/graphql/resource_not_available_error.yml
@@ -40,4 +40,3 @@ Graphql/ResourceNotAvailableError:
- 'ee/app/graphql/mutations/projects/set_locked.rb'
- 'ee/app/graphql/resolvers/incident_management/oncall_shifts_resolver.rb'
- 'ee/app/graphql/resolvers/product_analytics/visualization_resolver.rb'
- - 'ee/app/graphql/resolvers/remote_development/workspaces_resolver.rb'
diff --git a/.rubocop_todo/internal_affairs/use_restrict_on_send.yml b/.rubocop_todo/internal_affairs/use_restrict_on_send.yml
new file mode 100644
index 00000000000..def67cd71b1
--- /dev/null
+++ b/.rubocop_todo/internal_affairs/use_restrict_on_send.yml
@@ -0,0 +1,13 @@
+---
+InternalAffairs/UseRestrictOnSend:
+ Details: grace period
+ Exclude:
+ - 'rubocop/cop/gitlab/feature_available_usage.rb'
+ - 'rubocop/cop/migration/add_concurrent_foreign_key.rb'
+ - 'rubocop/cop/migration/add_concurrent_index.rb'
+ - 'rubocop/cop/migration/add_timestamps.rb'
+ - 'rubocop/cop/migration/background_migrations.rb'
+ - 'rubocop/cop/migration/remove_concurrent_index.rb'
+ - 'rubocop/cop/migration/with_lock_retries_with_change.rb'
+ - 'rubocop/cop/project_path_helper.rb'
+ - 'rubocop/cop/safe_params.rb'
diff --git a/.rubocop_todo/layout/argument_alignment.yml b/.rubocop_todo/layout/argument_alignment.yml
index ca7dba5c8db..be750a04f7c 100644
--- a/.rubocop_todo/layout/argument_alignment.yml
+++ b/.rubocop_todo/layout/argument_alignment.yml
@@ -1034,53 +1034,6 @@ Layout/ArgumentAlignment:
- 'ee/spec/elastic/migrate/20220119120500_populate_commit_permissions_in_main_index_spec.rb'
- 'ee/spec/elastic/migrate/20221124090600_add_namespace_ancestry_ids_to_original_index_mapping_spec.rb'
- 'ee/spec/elastic/migrate/20221221110300_backfill_traversal_ids_to_blobs_and_wiki_blobs_spec.rb'
- - 'ee/spec/features/account_recovery_regular_check_spec.rb'
- - 'ee/spec/features/admin/admin_emails_spec.rb'
- - 'ee/spec/features/admin/admin_settings_spec.rb'
- - 'ee/spec/features/billings/billing_plans_spec.rb'
- - 'ee/spec/features/boards/boards_spec.rb'
- - 'ee/spec/features/boards/swimlanes/epics_swimlanes_drag_drop_spec.rb'
- - 'ee/spec/features/burndown_charts_spec.rb'
- - 'ee/spec/features/dashboards/todos_spec.rb'
- - 'ee/spec/features/epic_boards/epic_boards_spec.rb'
- - 'ee/spec/features/groups/saml_enforcement_spec.rb'
- - 'ee/spec/features/groups/settings/domain_verification_spec.rb'
- - 'ee/spec/features/groups/settings/protected_environments_spec.rb'
- - 'ee/spec/features/groups/usage_quotas/pipelines_tab_spec.rb'
- - 'ee/spec/features/markdown/metrics_spec.rb'
- - 'ee/spec/features/merge_request/user_sees_approval_widget_spec.rb'
- - 'ee/spec/features/namespace_user_cap_reached_alert_spec.rb'
- - 'ee/spec/features/projects/environments/environment_spec.rb'
- - 'ee/spec/features/projects/environments/environments_spec.rb'
- - 'ee/spec/features/projects/feature_flags/user_deletes_feature_flag_spec.rb'
- - 'ee/spec/features/projects/feature_flags/user_sees_feature_flag_list_spec.rb'
- - 'ee/spec/features/projects/feature_flags/user_updates_feature_flag_spec.rb'
- - 'ee/spec/features/projects/merge_requests/user_edits_merge_request_spec.rb'
- - 'ee/spec/features/projects/milestones/milestone_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/merge_requests/user_manages_approval_settings_spec.rb'
- - 'ee/spec/features/projects/settings/merge_requests/user_manages_merge_pipelines_spec.rb'
- - 'ee/spec/features/projects/settings/merge_requests/user_manages_merge_requests_template_spec.rb'
- - 'ee/spec/features/projects/settings/merge_requests/user_manages_merge_trains_spec.rb'
- - 'ee/spec/features/projects/settings/user_manages_approval_settings_spec.rb'
- - 'ee/spec/features/projects/settings/user_manages_merge_requests_template_spec.rb'
- - 'ee/spec/features/registrations/email_confirmation_spec.rb'
- - 'ee/spec/features/registrations/saas/standard_flow_company_creating_project_spec.rb'
- - 'ee/spec/features/registrations/saas/standard_flow_company_joining_project_spec.rb'
- - 'ee/spec/features/registrations/saas/standard_flow_just_me_creating_project_spec.rb'
- - 'ee/spec/features/registrations/saas/standard_flow_just_me_importing_project_spec.rb'
- - 'ee/spec/features/registrations/saas/standard_flow_just_me_joining_project_spec.rb'
- - 'ee/spec/features/registrations/saas/subscription_flow_paid_plan_spec.rb'
- - 'ee/spec/features/registrations/saas/trial_flow_company_creating_project_spec.rb'
- - 'ee/spec/features/registrations/saas/trial_flow_company_importing_project_spec.rb'
- - 'ee/spec/features/registrations/saas/trial_flow_just_me_creating_project_spec.rb'
- - 'ee/spec/features/registrations/saas/trial_flow_just_me_importing_project_spec.rb'
- - 'ee/spec/features/registrations/sign_up_with_trial_from_external_site_without_confirmation_spec.rb'
- - 'ee/spec/features/search/elastic/global_search_spec.rb'
- - 'ee/spec/features/search/elastic/group_search_spec.rb'
- - 'ee/spec/features/security/project/discover_spec.rb'
- - 'ee/spec/features/users/identity_verification_spec.rb'
- 'ee/spec/frontend/fixtures/dora/metrics.rb'
- 'ee/spec/frontend/fixtures/oncall_schedule.rb'
- 'ee/spec/graphql/ee/mutations/boards/lists/create_spec.rb'
@@ -1143,7 +1096,6 @@ Layout/ArgumentAlignment:
- 'ee/spec/lib/ee/gitlab/scim/provisioning_service_spec.rb'
- 'ee/spec/lib/ee/gitlab/usage/service_ping_report_spec.rb'
- 'ee/spec/lib/ee/gitlab/usage_data_spec.rb'
- - 'ee/spec/lib/elastic/latest/project_wiki_class_proxy_spec.rb'
- 'ee/spec/lib/gitlab/analytics/cycle_analytics/data_collector_spec.rb'
- 'ee/spec/lib/gitlab/analytics/cycle_analytics/distinct_stage_loader_spec.rb'
- 'ee/spec/lib/gitlab/analytics/cycle_analytics/summary/stage_time_summary_spec.rb'
@@ -1326,7 +1278,6 @@ Layout/ArgumentAlignment:
- 'ee/spec/services/vulnerabilities/user_notes_count_service_spec.rb'
- 'ee/spec/services/vulnerability_feedback/create_service_spec.rb'
- 'ee/spec/services/vulnerability_merge_request_links/create_service_spec.rb'
- - 'ee/spec/tasks/gitlab/elastic_rake_spec.rb'
- 'lib/api/access_requests.rb'
- 'lib/api/admin/plan_limits.rb'
- 'lib/api/alert_management_alerts.rb'
@@ -1570,70 +1521,8 @@ Layout/ArgumentAlignment:
- 'spec/components/previews/pajamas/alert_component_preview.rb'
- 'spec/components/previews/pajamas/banner_component_preview.rb'
- 'spec/components/previews/pajamas/button_component_preview.rb'
- - 'spec/features/admin/admin_mode/login_spec.rb'
- - 'spec/features/admin/integrations/user_activates_mattermost_slash_command_spec.rb'
- - 'spec/features/atom/issues_spec.rb'
- - 'spec/features/atom/merge_requests_spec.rb'
- - 'spec/features/atom/users_spec.rb'
- - 'spec/features/boards/issue_ordering_spec.rb'
- - 'spec/features/boards/multi_select_spec.rb'
- - 'spec/features/boards/sidebar_assignee_spec.rb'
- - 'spec/features/calendar_spec.rb'
- - 'spec/features/clusters/cluster_health_dashboard_spec.rb'
- - 'spec/features/commits_spec.rb'
- - 'spec/features/dashboard/activity_spec.rb'
- - 'spec/features/dashboard/datetime_on_tooltips_spec.rb'
- - 'spec/features/dashboard/merge_requests_spec.rb'
- - 'spec/features/dashboard/todos/todos_sorting_spec.rb'
- - 'spec/features/dashboard/todos/todos_spec.rb'
- - 'spec/features/error_tracking/user_filters_errors_by_status_spec.rb'
- - 'spec/features/error_tracking/user_searches_sentry_errors_spec.rb'
- - 'spec/features/error_tracking/user_sees_error_details_spec.rb'
- - 'spec/features/error_tracking/user_sees_error_index_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/incidents/incident_timeline_events_spec.rb'
- - 'spec/features/incidents/user_views_incident_spec.rb'
- - 'spec/features/issuables/issuable_list_spec.rb'
- - 'spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb'
- - 'spec/features/issues/user_creates_branch_and_merge_request_spec.rb'
- - 'spec/features/issues/user_filters_issues_spec.rb'
- 'spec/features/jira_oauth_provider_authorize_spec.rb'
- 'spec/features/markdown/gitlab_flavored_markdown_spec.rb'
- - 'spec/features/merge_request/maintainer_edits_fork_spec.rb'
- - 'spec/features/merge_request/user_allows_commits_from_memebers_who_can_merge_spec.rb'
- - 'spec/features/merge_request/user_closes_reopens_merge_request_state_spec.rb'
- - 'spec/features/merge_request/user_creates_merge_request_spec.rb'
- - 'spec/features/merge_request/user_interacts_with_batched_mr_diffs_spec.rb'
- - 'spec/features/merge_request/user_merges_immediately_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_opens_checkout_branch_modal_spec.rb'
- - 'spec/features/merge_request/user_posts_notes_spec.rb'
- - 'spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb'
- - 'spec/features/merge_request/user_resolves_outdated_diff_discussions_spec.rb'
- - 'spec/features/merge_request/user_resolves_wip_mr_spec.rb'
- - 'spec/features/merge_request/user_sees_deployment_widget_spec.rb'
- - 'spec/features/merge_request/user_sees_discussions_navigation_spec.rb'
- - 'spec/features/merge_request/user_sees_merge_button_depending_on_unresolved_discussions_spec.rb'
- - 'spec/features/merge_request/user_sees_merge_request_pipelines_spec.rb'
- - 'spec/features/merge_request/user_sees_merge_widget_spec.rb'
- - 'spec/features/merge_request/user_sees_mr_from_deleted_forked_project_spec.rb'
- - 'spec/features/merge_request/user_sees_mr_with_deleted_source_branch_spec.rb'
- - 'spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb'
- - 'spec/features/merge_request/user_sees_pipelines_from_forked_project_spec.rb'
- - 'spec/features/merge_request/user_sees_pipelines_spec.rb'
- - 'spec/features/merge_request/user_sees_versions_spec.rb'
- - 'spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb'
- - 'spec/features/merge_request/user_squashes_merge_request_spec.rb'
- - 'spec/features/merge_request/user_suggests_changes_on_diff_spec.rb'
- - 'spec/features/merge_request/user_tries_to_access_private_project_info_through_new_mr_spec.rb'
- - 'spec/features/merge_request/user_uses_quick_actions_spec.rb'
- - 'spec/features/merge_requests/user_lists_merge_requests_spec.rb'
- - 'spec/features/merge_requests/user_views_open_merge_requests_spec.rb'
- 'spec/features/nav/top_nav_tooltip_spec.rb'
- 'spec/features/oauth_provider_authorize_spec.rb'
- 'spec/features/participants_autocomplete_spec.rb'
@@ -1641,45 +1530,6 @@ Layout/ArgumentAlignment:
- 'spec/features/profiles/active_sessions_spec.rb'
- 'spec/features/profiles/keys_spec.rb'
- 'spec/features/profiles/user_changes_notified_of_own_activity_spec.rb'
- - 'spec/features/projects/activity/user_sees_activity_spec.rb'
- - 'spec/features/projects/badges/coverage_spec.rb'
- - 'spec/features/projects/branches/download_buttons_spec.rb'
- - 'spec/features/projects/branches_spec.rb'
- - 'spec/features/projects/commit/builds_spec.rb'
- - 'spec/features/projects/commit/mini_pipeline_graph_spec.rb'
- - 'spec/features/projects/commits/user_browses_commits_spec.rb'
- - 'spec/features/projects/environments/environment_spec.rb'
- - 'spec/features/projects/environments/environments_spec.rb'
- - 'spec/features/projects/feature_flags/user_deletes_feature_flag_spec.rb'
- - 'spec/features/projects/files/download_buttons_spec.rb'
- - 'spec/features/projects/files/editing_a_file_spec.rb'
- - 'spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb'
- - 'spec/features/projects/files/user_browses_a_tree_with_a_folder_containing_only_a_folder_spec.rb'
- - 'spec/features/projects/issues/viewing_issues_with_external_authorization_enabled_spec.rb'
- - 'spec/features/projects/jobs/user_browses_jobs_spec.rb'
- - 'spec/features/projects/members/group_member_cannot_request_access_to_his_group_project_spec.rb'
- - 'spec/features/projects/members/group_requester_cannot_request_access_to_project_spec.rb'
- - 'spec/features/projects/members/user_requests_access_spec.rb'
- - 'spec/features/projects/pipelines/pipeline_spec.rb'
- - 'spec/features/projects/pipelines/pipelines_spec.rb'
- - 'spec/features/projects/releases/user_views_release_spec.rb'
- - 'spec/features/projects/settings/external_authorization_service_settings_spec.rb'
- - 'spec/features/projects/settings/monitor_settings_spec.rb'
- - 'spec/features/projects/settings/registry_settings_cleanup_tags_spec.rb'
- - 'spec/features/projects/settings/registry_settings_spec.rb'
- - 'spec/features/projects/show/download_buttons_spec.rb'
- - 'spec/features/projects/show/user_interacts_with_auto_devops_banner_spec.rb'
- - 'spec/features/projects/tags/download_buttons_spec.rb'
- - 'spec/features/projects/wiki/user_views_wiki_in_project_page_spec.rb'
- - 'spec/features/search/user_searches_for_milestones_spec.rb'
- - 'spec/features/search/user_searches_for_wiki_pages_spec.rb'
- - 'spec/features/snippets/spam_snippets_spec.rb'
- - 'spec/features/snippets/user_creates_snippet_spec.rb'
- - 'spec/features/task_lists_spec.rb'
- - 'spec/features/user_sees_revert_modal_spec.rb'
- - 'spec/features/users/email_verification_on_login_spec.rb'
- - 'spec/features/users/login_spec.rb'
- - 'spec/features/users/overview_spec.rb'
- 'spec/frontend/fixtures/autocomplete.rb'
- 'spec/frontend/fixtures/autocomplete_sources.rb'
- 'spec/frontend/fixtures/environments.rb'
@@ -1906,7 +1756,6 @@ Layout/ArgumentAlignment:
- 'spec/lib/gitlab/usage_data_queries_spec.rb'
- 'spec/lib/gitlab/usage_data_spec.rb'
- 'spec/lib/gitlab/utils/lazy_attributes_spec.rb'
- - 'spec/lib/gitlab/utils_spec.rb'
- 'spec/lib/gitlab/workhorse_spec.rb'
- 'spec/lib/google_api/cloud_platform/client_spec.rb'
- 'spec/lib/peek/views/detailed_view_spec.rb'
@@ -2046,7 +1895,6 @@ Layout/ArgumentAlignment:
- 'spec/requests/recursive_webhook_detection_spec.rb'
- 'spec/requests/users/group_callouts_spec.rb'
- 'spec/requests/users/project_callouts_spec.rb'
- - 'spec/requests/verifies_with_email_spec.rb'
- 'spec/routing/environments_spec.rb'
- 'spec/routing/group_routing_spec.rb'
- 'spec/routing/project_routing_spec.rb'
diff --git a/.rubocop_todo/layout/empty_line_after_magic_comment.yml b/.rubocop_todo/layout/empty_line_after_magic_comment.yml
index 435efc1c5b3..698247e419c 100644
--- a/.rubocop_todo/layout/empty_line_after_magic_comment.yml
+++ b/.rubocop_todo/layout/empty_line_after_magic_comment.yml
@@ -232,7 +232,6 @@ Layout/EmptyLineAfterMagicComment:
- 'ee/app/services/ee/ip_restrictions/update_service.rb'
- 'ee/app/services/ee/projects/autocomplete_service.rb'
- 'ee/app/services/ee/system_notes/issuables_service.rb'
- - 'ee/app/services/gitlab_subscriptions/create_trial_or_lead_service.rb'
- 'ee/app/services/gitlab_subscriptions/fetch_subscription_plans_service.rb'
- 'ee/app/services/gitlab_subscriptions/reconciliations/calculate_seat_count_data_service.rb'
- 'ee/app/services/group_saml/group_managed_accounts/clean_up_members_service.rb'
@@ -290,7 +289,6 @@ Layout/EmptyLineAfterMagicComment:
- 'ee/spec/features/projects/kerberos_clone_instructions_spec.rb'
- 'ee/spec/features/projects/settings/merge_request_approvals_settings_spec.rb'
- 'ee/spec/features/projects/settings/merge_requests_settings_spec.rb'
- - 'ee/spec/features/trial_registrations/company_information_spec.rb'
- 'ee/spec/finders/auth/group_saml_identity_finder_spec.rb'
- 'ee/spec/finders/geo/design_registry_finder_spec.rb'
- 'ee/spec/finders/geo/project_registry_status_finder_spec.rb'
@@ -687,7 +685,6 @@ Layout/EmptyLineAfterMagicComment:
- 'spec/requests/lfs_http_spec.rb'
- 'spec/rubocop/cop/migration/complex_indexes_require_name_spec.rb'
- 'spec/rubocop/cop/migration/refer_to_index_by_name_spec.rb'
- - 'spec/rubocop/formatter/todo_formatter_spec.rb'
- 'spec/scripts/lib/glfm/parse_examples_spec.rb'
- 'spec/scripts/lib/glfm/shared_spec.rb'
- 'spec/scripts/lib/glfm/update_example_snapshots_spec.rb'
diff --git a/.rubocop_todo/layout/extra_spacing.yml b/.rubocop_todo/layout/extra_spacing.yml
new file mode 100644
index 00000000000..6da17195834
--- /dev/null
+++ b/.rubocop_todo/layout/extra_spacing.yml
@@ -0,0 +1,8 @@
+---
+# Cop supports --autocorrect.
+Layout/ExtraSpacing:
+ Details: grace period
+ Exclude:
+ - 'ee/spec/requests/api/debian_project_packages_spec.rb'
+ - 'spec/serializers/admin/abuse_report_details_entity_spec.rb'
+ - 'spec/services/bulk_imports/create_service_spec.rb'
diff --git a/.rubocop_todo/layout/first_hash_element_indentation.yml b/.rubocop_todo/layout/first_hash_element_indentation.yml
index c95fc3010d0..5f586cc6206 100644
--- a/.rubocop_todo/layout/first_hash_element_indentation.yml
+++ b/.rubocop_todo/layout/first_hash_element_indentation.yml
@@ -9,7 +9,6 @@ Layout/FirstHashElementIndentation:
- 'app/controllers/projects/badges_controller.rb'
- 'app/controllers/projects/merge_requests_controller.rb'
- 'app/controllers/repositories/lfs_locks_api_controller.rb'
- - 'app/experiments/concerns/project_commit_count.rb'
- 'app/graphql/mutations/notes/create/diff_note.rb'
- 'app/graphql/mutations/notes/create/image_diff_note.rb'
- 'app/graphql/mutations/notes/create/note.rb'
@@ -98,7 +97,6 @@ Layout/FirstHashElementIndentation:
- 'ee/spec/lib/gitlab/ci/reports/coverage_fuzzing/report_spec.rb'
- 'ee/spec/lib/gitlab/geo/log_cursor/lease_spec.rb'
- 'ee/spec/lib/gitlab/graphql/aggregations/epics/lazy_epic_aggregate_spec.rb'
- - 'ee/spec/lib/gitlab/subscription_portal/clients/graphql_spec.rb'
- 'ee/spec/mailers/credentials_inventory_mailer_spec.rb'
- 'ee/spec/mailers/emails/requirements_spec.rb'
- 'ee/spec/models/concerns/elastic/issue_spec.rb'
diff --git a/.rubocop_todo/layout/line_end_string_concatenation_indentation.yml b/.rubocop_todo/layout/line_end_string_concatenation_indentation.yml
index 7a1dd906310..62bf63d1bb9 100644
--- a/.rubocop_todo/layout/line_end_string_concatenation_indentation.yml
+++ b/.rubocop_todo/layout/line_end_string_concatenation_indentation.yml
@@ -78,7 +78,6 @@ Layout/LineEndStringConcatenationIndentation:
- 'ee/lib/ee/gitlab/auth/ldap/access.rb'
- 'ee/lib/ee/gitlab/ci/pipeline/quota/size.rb'
- 'ee/lib/ee/gitlab/git_access.rb'
- - 'ee/lib/ee/gitlab/namespace_storage_size_error_message.rb'
- 'ee/lib/gitlab/manual_quarterly_co_term_banner.rb'
- 'ee/lib/tasks/gitlab/geo.rake'
- 'ee/spec/controllers/admin/licenses_controller_spec.rb'
@@ -102,7 +101,6 @@ Layout/LineEndStringConcatenationIndentation:
- 'ee/spec/lib/audit/group_merge_request_approval_setting_changes_auditor_spec.rb'
- 'ee/spec/lib/ee/gitlab/ci/parsers/security/validators/schema_validator_spec.rb'
- 'ee/spec/lib/ee/gitlab/ci/pipeline/quota/size_spec.rb'
- - 'ee/spec/lib/ee/gitlab/namespace_storage_size_error_message_spec.rb'
- 'ee/spec/lib/gitlab/ci/pipeline/chain/limit/size_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'
diff --git a/.rubocop_todo/layout/line_length.yml b/.rubocop_todo/layout/line_length.yml
index 8c283bdf6ce..ef2e380ea95 100644
--- a/.rubocop_todo/layout/line_length.yml
+++ b/.rubocop_todo/layout/line_length.yml
@@ -46,7 +46,6 @@ Layout/LineLength:
- 'app/controllers/import/bulk_imports_controller.rb'
- 'app/controllers/import/fogbugz_controller.rb'
- 'app/controllers/import/gitea_controller.rb'
- - 'app/controllers/import/gitlab_controller.rb'
- 'app/controllers/import/gitlab_groups_controller.rb'
- 'app/controllers/import/gitlab_projects_controller.rb'
- 'app/controllers/invites_controller.rb'
@@ -77,11 +76,6 @@ Layout/LineLength:
- 'app/controllers/projects/issues_controller.rb'
- 'app/controllers/projects/jobs_controller.rb'
- 'app/controllers/projects/labels_controller.rb'
- - 'app/controllers/projects/merge_requests/conflicts_controller.rb'
- - 'app/controllers/projects/merge_requests/creations_controller.rb'
- - 'app/controllers/projects/merge_requests/diffs_controller.rb'
- - 'app/controllers/projects/merge_requests/drafts_controller.rb'
- - 'app/controllers/projects/merge_requests_controller.rb'
- 'app/controllers/projects/milestones_controller.rb'
- 'app/controllers/projects/notes_controller.rb'
- 'app/controllers/projects/performance_monitoring/dashboards_controller.rb'
@@ -91,7 +85,6 @@ Layout/LineLength:
- 'app/controllers/projects/settings/ci_cd_controller.rb'
- 'app/controllers/projects/settings/repository_controller.rb'
- 'app/controllers/projects/templates_controller.rb'
- - 'app/controllers/projects/tree_controller.rb'
- 'app/controllers/projects/triggers_controller.rb'
- 'app/controllers/projects/web_ide_schemas_controller.rb'
- 'app/controllers/projects_controller.rb'
@@ -106,7 +99,6 @@ Layout/LineLength:
- 'app/finders/ci/runners_finder.rb'
- 'app/finders/clusters/agents/authorizations/ci_access/finder.rb'
- 'app/finders/group_descendants_finder.rb'
- - 'app/finders/group_members_finder.rb'
- 'app/finders/group_projects_finder.rb'
- 'app/finders/issuable_finder.rb'
- 'app/finders/issuable_finder/params.rb'
@@ -159,7 +151,6 @@ Layout/LineLength:
- 'app/graphql/mutations/snippets/update.rb'
- 'app/graphql/mutations/todos/create.rb'
- 'app/graphql/mutations/todos/mark_all_done.rb'
- - 'app/graphql/resolvers/concerns/time_frame_arguments.rb'
- 'app/graphql/resolvers/container_repository_tags_resolver.rb'
- 'app/graphql/resolvers/project_merge_requests_resolver.rb'
- 'app/graphql/resolvers/user_discussions_count_resolver.rb'
@@ -210,7 +201,6 @@ Layout/LineLength:
- 'app/graphql/types/query_type.rb'
- 'app/graphql/types/repository/blob_type.rb'
- 'app/graphql/types/repository_type.rb'
- - 'app/graphql/types/root_storage_statistics_type.rb'
- 'app/graphql/types/snippets/visibility_scopes_enum.rb'
- 'app/graphql/types/todo_action_enum.rb'
- 'app/helpers/application_helper.rb'
@@ -265,13 +255,11 @@ Layout/LineLength:
- 'app/helpers/sorting_helper.rb'
- 'app/helpers/ssh_keys_helper.rb'
- 'app/helpers/startupjs_helper.rb'
- - 'app/helpers/storage_helper.rb'
- 'app/helpers/submodule_helper.rb'
- 'app/helpers/tags_helper.rb'
- 'app/helpers/timeboxes_helper.rb'
- 'app/helpers/tree_helper.rb'
- 'app/helpers/users_helper.rb'
- - 'app/helpers/version_check_helper.rb'
- 'app/helpers/visibility_level_helper.rb'
- 'app/helpers/whats_new_helper.rb'
- 'app/helpers/wiki_helper.rb'
@@ -329,17 +317,14 @@ Layout/LineLength:
- 'app/models/concerns/packages/debian/distribution.rb'
- 'app/models/concerns/packages/debian/distribution_key.rb'
- 'app/models/concerns/partitioned_table.rb'
- - 'app/models/concerns/protected_ref.rb'
- 'app/models/concerns/redis_cacheable.rb'
- 'app/models/concerns/restricted_signup.rb'
- - 'app/models/concerns/routable.rb'
- 'app/models/concerns/shardable.rb'
- 'app/models/concerns/sortable.rb'
- 'app/models/concerns/storage/legacy_namespace.rb'
- 'app/models/concerns/subscribable.rb'
- 'app/models/concerns/token_authenticatable_strategies/base.rb'
- 'app/models/concerns/token_authenticatable_strategies/encrypted.rb'
- - 'app/models/concerns/token_authenticatable_strategies/encryption_helper.rb'
- 'app/models/concerns/update_highest_role.rb'
- 'app/models/concerns/update_project_statistics.rb'
- 'app/models/concerns/x509_serial_number_attribute.rb'
@@ -348,7 +333,6 @@ Layout/LineLength:
- 'app/models/customer_relations/issue_contact.rb'
- 'app/models/deploy_key.rb'
- 'app/models/deployment.rb'
- - 'app/models/design_management/repository.rb'
- 'app/models/diff_note.rb'
- 'app/models/environment.rb'
- 'app/models/error_tracking/project_error_tracking_setting.rb'
@@ -403,7 +387,6 @@ Layout/LineLength:
- 'app/models/list.rb'
- 'app/models/loose_foreign_keys/modification_tracker.rb'
- 'app/models/member.rb'
- - 'app/models/members_preloader.rb'
- 'app/models/merge_request.rb'
- 'app/models/merge_request_assignee.rb'
- 'app/models/merge_request_diff.rb'
@@ -493,7 +476,6 @@ Layout/LineLength:
- 'app/services/ci/create_pipeline_service.rb'
- 'app/services/ci/drop_pipeline_service.rb'
- 'app/services/ci/generate_coverage_reports_service.rb'
- - 'app/services/ci/job_artifacts/destroy_all_expired_service.rb'
- 'app/services/ci/job_artifacts/expire_project_build_artifacts_service.rb'
- 'app/services/ci/pipeline_artifacts/create_code_quality_mr_diff_report_service.rb'
- 'app/services/ci/pipelines/add_job_service.rb'
@@ -506,7 +488,6 @@ Layout/LineLength:
- 'app/services/clusters/agents/delete_service.rb'
- 'app/services/clusters/build_kubernetes_namespace_service.rb'
- 'app/services/clusters/integrations/create_service.rb'
- - 'app/services/clusters/integrations/prometheus_health_check_service.rb'
- 'app/services/clusters/kubernetes/create_or_update_service_account_service.rb'
- 'app/services/clusters/management/validate_management_project_permissions_service.rb'
- 'app/services/compare_service.rb'
@@ -528,9 +509,7 @@ Layout/LineLength:
- 'app/services/emails/create_service.rb'
- 'app/services/environments/reset_auto_stop_service.rb'
- 'app/services/environments/schedule_to_delete_review_apps_service.rb'
- - 'app/services/event_create_service.rb'
- 'app/services/feature_flags/update_service.rb'
- - 'app/services/git/branch_hooks_service.rb'
- 'app/services/git/process_ref_changes_service.rb'
- 'app/services/google_cloud/create_service_accounts_service.rb'
- 'app/services/google_cloud/generate_pipeline_service.rb'
@@ -564,7 +543,6 @@ Layout/LineLength:
- 'app/services/lfs/unlock_file_service.rb'
- 'app/services/loose_foreign_keys/batch_cleaner_service.rb'
- 'app/services/loose_foreign_keys/cleaner_service.rb'
- - 'app/services/members/destroy_service.rb'
- 'app/services/members/invitation_reminder_email_service.rb'
- 'app/services/merge_requests/add_context_service.rb'
- 'app/services/merge_requests/assign_issues_service.rb'
@@ -585,7 +563,6 @@ Layout/LineLength:
- 'app/services/milestones/destroy_service.rb'
- 'app/services/namespace_settings/update_service.rb'
- 'app/services/notes/build_service.rb'
- - 'app/services/notes/quick_actions_service.rb'
- 'app/services/notes/resolve_service.rb'
- 'app/services/notification_recipients/builder/default.rb'
- 'app/services/notification_service.rb'
@@ -623,7 +600,6 @@ Layout/LineLength:
- 'app/services/projects/hashed_storage/migrate_attachments_service.rb'
- 'app/services/projects/hashed_storage/migrate_repository_service.rb'
- 'app/services/projects/hashed_storage/rollback_repository_service.rb'
- - 'app/services/projects/import_service.rb'
- 'app/services/projects/lfs_pointers/lfs_download_service.rb'
- 'app/services/projects/operations/update_service.rb'
- 'app/services/projects/overwrite_project_service.rb'
@@ -636,7 +612,6 @@ Layout/LineLength:
- '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_service.rb'
- 'app/services/security/ci_configuration/container_scanning_create_service.rb'
- 'app/services/security/ci_configuration/dependency_scanning_create_service.rb'
@@ -680,8 +655,6 @@ Layout/LineLength:
- 'app/workers/container_registry/migration/guard_worker.rb'
- 'app/workers/database/batched_background_migration/single_database_worker.rb'
- 'app/workers/error_tracking_issue_link_worker.rb'
- - 'app/workers/gitlab/github_import/stage/finish_import_worker.rb'
- - 'app/workers/gitlab/github_import/stage/import_repository_worker.rb'
- 'app/workers/gitlab/import/stuck_import_job.rb'
- 'app/workers/gitlab/jira_import/stage/import_attachments_worker.rb'
- 'app/workers/gitlab/jira_import/stage/import_labels_worker.rb'
@@ -691,13 +664,11 @@ Layout/LineLength:
- 'app/workers/issues/rebalancing_worker.rb'
- 'app/workers/jira_connect/sync_branch_worker.rb'
- 'app/workers/jira_connect/sync_merge_request_worker.rb'
- - 'app/workers/jira_connect/sync_project_worker.rb'
- 'app/workers/merge_request_mergeability_check_worker.rb'
- 'app/workers/object_storage/migrate_uploads_worker.rb'
- 'app/workers/packages/maven/metadata/sync_worker.rb'
- 'app/workers/pipeline_metrics_worker.rb'
- 'app/workers/repository_fork_worker.rb'
- - 'app/workers/repository_import_worker.rb'
- 'app/workers/ssh_keys/expired_notification_worker.rb'
- 'config/application.rb'
- 'config/initializers/00_rails_disable_joins.rb'
@@ -723,7 +694,6 @@ Layout/LineLength:
- 'config/initializers/validate_database_config.rb'
- 'config/initializers/validate_puma.rb'
- 'config/initializers/zz_metrics.rb'
- - 'config/object_store_settings.rb'
- 'config/puma.rb'
- 'config/routes.rb'
- 'config/routes/admin.rb'
@@ -742,14 +712,6 @@ Layout/LineLength:
- 'danger/roulette/Dangerfile'
- 'danger/vue_shared_documentation/Dangerfile'
- 'danger/z_metadata/Dangerfile'
- - 'db/migrate/20220314184209_add_group_fk_to_protected_environment_approval_rules.rb'
- - 'db/migrate/20220314204009_add_approval_rule_fk_to_deployment_approvals.rb'
- - 'db/post_migrate/20220315171027_add_tmp_index_to_support_leaky_regex_cleanup.rb'
- - 'db/post_migrate/20220316102902_add_user_foreign_key_to_deploy_tokens.rb'
- - 'db/post_migrate/20220317161914_remove_ci_runners_ci_builds_runner_id_fk.rb'
- - 'db/post_migrate/20220318111729_cleanup_after_fixing_issue_when_admin_changed_primary_email.rb'
- - 'db/post_migrate/20220322205008_change_search_rate_limit_values.rb'
- - 'db/post_migrate/20220323130000_add_temp_index_on_null_project_namespace_ids.rb'
- 'ee/app/controllers/admin/elasticsearch_controller.rb'
- 'ee/app/controllers/admin/geo/application_controller.rb'
- 'ee/app/controllers/admin/geo/projects_controller.rb'
@@ -786,7 +748,6 @@ Layout/LineLength:
- 'ee/app/controllers/projects/requirements_management/requirements_controller.rb'
- 'ee/app/controllers/projects/security/policies_controller.rb'
- 'ee/app/controllers/projects/security/vulnerabilities/notes_controller.rb'
- - 'ee/app/controllers/subscriptions_controller.rb'
- 'ee/app/enums/vulnerabilities/dismissal_reason_enum.rb'
- 'ee/app/finders/compliance_management/merge_requests/compliance_violations_finder.rb'
- 'ee/app/finders/incident_management/escalation_rules_finder.rb'
@@ -878,7 +839,6 @@ Layout/LineLength:
- 'ee/app/helpers/billing_plans_helper.rb'
- 'ee/app/helpers/ee/application_helper.rb'
- 'ee/app/helpers/ee/button_helper.rb'
- - 'ee/app/helpers/ee/feature_flags_helper.rb'
- 'ee/app/helpers/ee/geo_helper.rb'
- 'ee/app/helpers/ee/groups/settings_helper.rb'
- 'ee/app/helpers/ee/groups_helper.rb'
@@ -1000,7 +960,6 @@ Layout/LineLength:
- 'ee/app/models/vulnerabilities/read.rb'
- 'ee/app/models/vulnerabilities/remediation.rb'
- 'ee/app/models/vulnerabilities/scanner.rb'
- - 'ee/app/models/vulnerabilities/stat_diff.rb'
- 'ee/app/policies/ee/group_policy.rb'
- 'ee/app/policies/ee/identity_provider_policy.rb'
- 'ee/app/policies/ee/project_policy.rb'
@@ -1011,7 +970,6 @@ Layout/LineLength:
- 'ee/app/serializers/ee/merge_request_poll_widget_entity.rb'
- 'ee/app/serializers/ee/merge_request_user_entity.rb'
- 'ee/app/serializers/ee/merge_request_widget_entity.rb'
- - 'ee/app/serializers/ee/note_user_entity.rb'
- 'ee/app/serializers/ee/user_entity.rb'
- 'ee/app/serializers/vulnerabilities/feedback_entity.rb'
- 'ee/app/services/analytics/cycle_analytics/consistency_check_service.rb'
@@ -1039,7 +997,6 @@ Layout/LineLength:
- 'ee/app/services/boards/epics/move_service.rb'
- 'ee/app/services/ci/compare_security_reports_service.rb'
- 'ee/app/services/ci/minutes/track_live_consumption_service.rb'
- - 'ee/app/services/ci/sync_reports_to_approval_rules_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/concerns/incident_management/oncall_rotations/shared_rotation_logic.rb'
@@ -1055,7 +1012,6 @@ Layout/LineLength:
- 'ee/app/services/ee/ci/register_job_service.rb'
- 'ee/app/services/ee/ci/retry_pipeline_service.rb'
- 'ee/app/services/ee/groups/autocomplete_service.rb'
- - 'ee/app/services/ee/groups/create_service.rb'
- 'ee/app/services/ee/groups/deploy_tokens/create_service.rb'
- 'ee/app/services/ee/groups/deploy_tokens/destroy_service.rb'
- 'ee/app/services/ee/groups/deploy_tokens/revoke_service.rb'
@@ -1133,7 +1089,6 @@ Layout/LineLength:
- 'ee/app/services/security/report_summary_service.rb'
- 'ee/app/services/security/scanned_resources_counting_service.rb'
- 'ee/app/services/security/scanned_resources_service.rb'
- - 'ee/app/services/security/security_orchestration_policies/fetch_policy_approvers_service.rb'
- 'ee/app/services/security/security_orchestration_policies/on_demand_scan_pipeline_configuration_service.rb'
- 'ee/app/services/security/security_orchestration_policies/policy_commit_service.rb'
- 'ee/app/services/security/security_orchestration_policies/policy_configuration_validation_service.rb'
@@ -1146,7 +1101,6 @@ Layout/LineLength:
- 'ee/app/services/start_pull_mirroring_service.rb'
- 'ee/app/services/system_notes/escalations_service.rb'
- 'ee/app/services/timebox_report_service.rb'
- - 'ee/app/services/vulnerabilities/base_service.rb'
- 'ee/app/services/vulnerabilities/historical_statistics/adjustment_service.rb'
- 'ee/app/services/vulnerabilities/revert_to_detected_service.rb'
- 'ee/app/services/vulnerabilities/statistics/adjustment_service.rb'
@@ -1169,7 +1123,6 @@ Layout/LineLength:
- 'ee/app/workers/geo/batch/project_registry_scheduler_worker.rb'
- 'ee/app/workers/geo/batch/project_registry_worker.rb'
- 'ee/app/workers/geo/destroy_worker.rb'
- - 'ee/app/workers/geo/file_registry_removal_worker.rb'
- 'ee/app/workers/geo/repositories_clean_up_worker.rb'
- 'ee/app/workers/geo/repository_shard_sync_worker.rb'
- 'ee/app/workers/geo/repository_verification/secondary/shard_worker.rb'
@@ -1228,7 +1181,6 @@ Layout/LineLength:
- 'ee/lib/api/resource_iteration_events.rb'
- 'ee/lib/api/status_checks.rb'
- 'ee/lib/api/vulnerability_issue_links.rb'
- - 'ee/lib/banzai/filter/references/iteration_reference_filter.rb'
- 'ee/lib/ee/api/deployments.rb'
- 'ee/lib/ee/api/entities/application_setting.rb'
- 'ee/lib/ee/api/entities/dependency.rb'
@@ -1239,8 +1191,6 @@ Layout/LineLength:
- 'ee/lib/ee/api/entities/namespace.rb'
- 'ee/lib/ee/api/entities/project.rb'
- 'ee/lib/ee/api/entities/project_approval_rule.rb'
- - 'ee/lib/ee/api/entities/user_basic.rb'
- - 'ee/lib/ee/api/entities/user_path.rb'
- 'ee/lib/ee/api/geo.rb'
- 'ee/lib/ee/api/helpers/groups_helpers.rb'
- 'ee/lib/ee/api/helpers/issues_helpers.rb'
@@ -1308,7 +1258,6 @@ Layout/LineLength:
- 'ee/lib/gitlab/analytics/cycle_analytics/summary/base_time.rb'
- 'ee/lib/gitlab/analytics/cycle_analytics/summary/group/deployment_frequency.rb'
- 'ee/lib/gitlab/auth/group_saml/response_check.rb'
- - 'ee/lib/gitlab/auth/group_saml/session_enforcer.rb'
- 'ee/lib/gitlab/auth/group_saml/user.rb'
- 'ee/lib/gitlab/auth/group_saml/xml_response.rb'
- 'ee/lib/gitlab/authority_analyzer.rb'
@@ -1346,7 +1295,6 @@ Layout/LineLength:
- 'ee/lib/gitlab/status_page/storage/s3_client.rb'
- 'ee/lib/gitlab/usage/metrics/instrumentations/approval_project_rules_with_user_metric.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/gitlab/usage_data_counters/license_testing_counter.rb'
- 'ee/lib/system_check/geo/authorized_keys_check.rb'
@@ -1354,11 +1302,9 @@ Layout/LineLength:
- 'ee/lib/system_check/geo/geo_database_configured_check.rb'
- 'ee/lib/tasks/geo.rake'
- 'ee/lib/tasks/geo/git.rake'
- - 'ee/lib/tasks/gitlab/elastic.rake'
- 'ee/lib/tasks/gitlab/elastic/test.rake'
- 'ee/lib/tasks/gitlab/seed/metrics.rake'
- 'ee/lib/world.rb'
- - 'ee/spec/config/metrics/every_metric_definition_spec.rb'
- 'ee/spec/controllers/admin/elasticsearch_controller_spec.rb'
- 'ee/spec/controllers/admin/geo/projects_controller_spec.rb'
- 'ee/spec/controllers/admin/impersonations_controller_spec.rb'
@@ -1401,7 +1347,6 @@ Layout/LineLength:
- 'ee/spec/controllers/projects/subscriptions_controller_spec.rb'
- 'ee/spec/controllers/projects/vulnerability_feedback_controller_spec.rb'
- 'ee/spec/controllers/projects_controller_spec.rb'
- - 'ee/spec/controllers/subscriptions/groups_controller_spec.rb'
- 'ee/spec/controllers/subscriptions_controller_spec.rb'
- 'ee/spec/elastic/migrate/migration_shared_examples.rb'
- 'ee/spec/factories/ci/builds.rb'
@@ -1492,7 +1437,6 @@ Layout/LineLength:
- '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/merge_requests_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/projects_spec.rb'
- 'ee/spec/features/promotion_spec.rb'
@@ -1500,7 +1444,6 @@ Layout/LineLength:
- 'ee/spec/features/search/elastic/project_search_spec.rb'
- 'ee/spec/features/search/elastic/snippet_search_spec.rb'
- 'ee/spec/features/subscriptions_spec.rb'
- - 'ee/spec/features/trial_registrations/company_information_spec.rb'
- 'ee/spec/features/users/login_spec.rb'
- 'ee/spec/finders/analytics/devops_adoption/enabled_namespaces_finder_spec.rb'
- 'ee/spec/finders/analytics/devops_adoption/snapshots_finder_spec.rb'
@@ -1552,7 +1495,6 @@ Layout/LineLength:
- 'ee/spec/graphql/ee/types/board_type_spec.rb'
- 'ee/spec/graphql/ee/types/issue_sort_enum_spec.rb'
- 'ee/spec/graphql/ee/types/merge_request_type_spec.rb'
- - 'ee/spec/graphql/mutations/boards/epic_boards/create_spec.rb'
- 'ee/spec/graphql/mutations/boards/epics/create_spec.rb'
- 'ee/spec/graphql/mutations/boards/lists/update_limit_metrics_spec.rb'
- 'ee/spec/graphql/mutations/compliance_management/frameworks/update_spec.rb'
@@ -1601,7 +1543,6 @@ Layout/LineLength:
- 'ee/spec/graphql/resolvers/security_report_summary_resolver_spec.rb'
- 'ee/spec/graphql/resolvers/timebox_report_resolver_spec.rb'
- 'ee/spec/graphql/resolvers/vulnerabilities/details_resolver_spec.rb'
- - 'ee/spec/graphql/resolvers/vulnerabilities/issue_links_resolver_spec.rb'
- 'ee/spec/graphql/resolvers/vulnerabilities/scanners_resolver_spec.rb'
- 'ee/spec/graphql/resolvers/vulnerabilities_count_per_day_resolver_spec.rb'
- 'ee/spec/graphql/resolvers/vulnerabilities_resolver_spec.rb'
@@ -1614,7 +1555,6 @@ Layout/LineLength:
- 'ee/spec/graphql/types/epic_sort_enum_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/permission_types/vulnerability_spec.rb'
- 'ee/spec/graphql/types/project_type_spec.rb'
- 'ee/spec/graphql/types/security_scanner_type_enum_spec.rb'
- 'ee/spec/graphql/types/vulnerability_details/file_location_type_spec.rb'
@@ -1637,7 +1577,6 @@ Layout/LineLength:
- 'ee/spec/helpers/ee/groups/group_members_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/lock_helper_spec.rb'
- 'ee/spec/helpers/ee/operations_helper_spec.rb'
@@ -1647,7 +1586,6 @@ Layout/LineLength:
- 'ee/spec/helpers/ee/projects/security/dast_configuration_helper_spec.rb'
- 'ee/spec/helpers/ee/subscribable_banner_helper_spec.rb'
- 'ee/spec/helpers/ee/users/callouts_helper_spec.rb'
- - 'ee/spec/helpers/ee/version_check_helper_spec.rb'
- 'ee/spec/helpers/epics_helper_spec.rb'
- 'ee/spec/helpers/gitlab_subscriptions/upcoming_reconciliation_helper_spec.rb'
- 'ee/spec/helpers/groups/security_features_helper_spec.rb'
@@ -1686,8 +1624,6 @@ Layout/LineLength:
- 'ee/spec/lib/ee/gitlab/background_migration/backfill_iteration_cadence_id_for_boards_spec.rb'
- 'ee/spec/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules_check_progress_spec.rb'
- 'ee/spec/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules_spec.rb'
- - 'ee/spec/lib/ee/gitlab/background_migration/populate_latest_pipeline_ids_spec.rb'
- - 'ee/spec/lib/ee/gitlab/background_migration/populate_resolved_on_default_branch_column_spec.rb'
- 'ee/spec/lib/ee/gitlab/checks/push_rule_check_spec.rb'
- 'ee/spec/lib/ee/gitlab/checks/push_rules/branch_check_spec.rb'
- 'ee/spec/lib/ee/gitlab/checks/push_rules/commit_check_spec.rb'
@@ -1696,7 +1632,6 @@ Layout/LineLength:
- 'ee/spec/lib/ee/gitlab/ci/parsers/security/common_spec.rb'
- 'ee/spec/lib/ee/gitlab/ci/parsers/security/validators/schema_validator_spec.rb'
- 'ee/spec/lib/ee/gitlab/ci/pipeline/chain/validate/security_orchestration_policy_spec.rb'
- - 'ee/spec/lib/ee/gitlab/ci/reports/security/reports_spec.rb'
- 'ee/spec/lib/ee/gitlab/ci/status/build/manual_spec.rb'
- 'ee/spec/lib/ee/gitlab/elastic/helper_spec.rb'
- 'ee/spec/lib/ee/gitlab/email/handler/service_desk_handler_spec.rb'
@@ -1707,7 +1642,6 @@ Layout/LineLength:
- 'ee/spec/lib/ee/gitlab/import_export/wiki_repo_saver_spec.rb'
- 'ee/spec/lib/ee/gitlab/repo_path_spec.rb'
- 'ee/spec/lib/ee/gitlab/repository_size_checker_spec.rb'
- - 'ee/spec/lib/ee/gitlab/security/scan_configuration_spec.rb'
- 'ee/spec/lib/ee/gitlab/url_builder_spec.rb'
- 'ee/spec/lib/ee/gitlab/usage/service_ping/payload_keys_processor_spec.rb'
- 'ee/spec/lib/ee/gitlab/usage_data_counters/hll_redis_counter_spec.rb'
@@ -1728,7 +1662,6 @@ Layout/LineLength:
- 'ee/spec/lib/gitlab/analytics/cycle_analytics/data_collector_spec.rb'
- 'ee/spec/lib/gitlab/analytics/cycle_analytics/data_for_duration_chart_spec.rb'
- 'ee/spec/lib/gitlab/analytics/cycle_analytics/distinct_stage_loader_spec.rb'
- - 'ee/spec/lib/gitlab/analytics/cycle_analytics/request_params_spec.rb'
- 'ee/spec/lib/gitlab/analytics/cycle_analytics/stage_events/issue_first_associated_with_milestone_spec.rb'
- 'ee/spec/lib/gitlab/analytics/cycle_analytics/stage_events/issue_label_added_spec.rb'
- 'ee/spec/lib/gitlab/analytics/cycle_analytics/stage_events/issue_label_removed_spec.rb'
@@ -1822,7 +1755,6 @@ Layout/LineLength:
- '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_multipart_upload_spec.rb'
- - 'ee/spec/lib/gitlab/subscription_portal/clients/graphql_spec.rb'
- 'ee/spec/lib/gitlab/usage/metrics/instrumentations/approval_project_rules_with_user_metric_spec.rb'
- 'ee/spec/lib/gitlab/usage/metrics/instrumentations/count_ci_builds_metric_spec.rb'
- 'ee/spec/lib/gitlab/usage/metrics/instrumentations/count_distinct_merged_merge_requests_using_approval_rules_metric_spec.rb'
@@ -1906,7 +1838,6 @@ Layout/LineLength:
- 'ee/spec/models/ee/iterations/cadence_spec.rb'
- 'ee/spec/models/ee/lfs_object_spec.rb'
- 'ee/spec/models/ee/merge_request_diff_spec.rb'
- - 'ee/spec/models/ee/namespace/root_storage_statistics_spec.rb'
- 'ee/spec/models/ee/namespace_spec.rb'
- 'ee/spec/models/ee/namespace_statistics_spec.rb'
- 'ee/spec/models/ee/preloaders/group_policy_preloader_spec.rb'
@@ -1954,7 +1885,6 @@ Layout/LineLength:
- 'ee/spec/models/project_import_state_spec.rb'
- 'ee/spec/models/project_member_spec.rb'
- 'ee/spec/models/project_security_setting_spec.rb'
- - 'ee/spec/models/protected_branch/unprotect_access_level_spec.rb'
- 'ee/spec/models/protected_environment_spec.rb'
- 'ee/spec/models/protected_environments/approval_rule_spec.rb'
- 'ee/spec/models/release_highlight_spec.rb'
@@ -2093,7 +2023,6 @@ Layout/LineLength:
- 'ee/spec/requests/api/ldap_group_links_spec.rb'
- 'ee/spec/requests/api/license_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_approvals_spec.rb'
- 'ee/spec/requests/api/merge_requests_spec.rb'
- 'ee/spec/requests/api/namespaces_spec.rb'
@@ -2255,7 +2184,6 @@ Layout/LineLength:
- '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'
- - 'ee/spec/services/geo/metrics_update_service_spec.rb'
- 'ee/spec/services/geo/project_housekeeping_service_spec.rb'
- 'ee/spec/services/geo/rename_repository_service_spec.rb'
- 'ee/spec/services/geo/repository_destroy_service_spec.rb'
@@ -2357,7 +2285,6 @@ Layout/LineLength:
- 'ee/spec/services/todo_service_spec.rb'
- 'ee/spec/services/user_permissions/export_service_spec.rb'
- 'ee/spec/services/vulnerabilities/dismiss_service_spec.rb'
- - 'ee/spec/services/vulnerabilities/finding_dismiss_service_spec.rb'
- 'ee/spec/services/vulnerabilities/historical_statistics/adjustment_service_spec.rb'
- 'ee/spec/services/vulnerabilities/manually_create_service_spec.rb'
- 'ee/spec/services/vulnerabilities/revert_to_detected_service_spec.rb'
@@ -2371,9 +2298,7 @@ Layout/LineLength:
- 'ee/spec/services/vulnerability_feedback/create_service_spec.rb'
- 'ee/spec/services/vulnerability_feedback/destroy_service_spec.rb'
- 'ee/spec/services/vulnerability_scanners/list_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/features/redacted_search_results_examples.rb'
- 'ee/spec/support/helpers/search_results_helpers.rb'
- 'ee/spec/support/helpers/subscription_portal_helpers.rb'
@@ -2389,7 +2314,6 @@ Layout/LineLength:
- 'ee/spec/support/shared_examples/controllers/analytics/cycle_analytics/shared_stage_shared_examples.rb'
- 'ee/spec/support/shared_examples/controllers/concerns/description_diff_actions_shared_examples.rb'
- 'ee/spec/support/shared_examples/features/epics_filtered_search_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/finders/geo/file_registry_finder_shared_examples.rb'
- 'ee/spec/support/shared_examples/finders/geo/registry_finder_shared_examples.rb'
@@ -2457,7 +2381,6 @@ Layout/LineLength:
- 'ee/spec/workers/concerns/elastic/indexing_control_spec.rb'
- 'ee/spec/workers/elastic/migration_worker_spec.rb'
- 'ee/spec/workers/elastic_association_indexer_worker_spec.rb'
- - 'ee/spec/workers/elastic_commit_indexer_worker_spec.rb'
- 'ee/spec/workers/geo/batch/project_registry_scheduler_worker_spec.rb'
- 'ee/spec/workers/geo/destroy_worker_spec.rb'
- 'ee/spec/workers/geo/project_sync_worker_spec.rb'
@@ -2480,7 +2403,6 @@ Layout/LineLength:
- '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/refresh_license_compliance_checks_worker_spec.rb'
- 'ee/spec/workers/repository_import_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'
@@ -2508,7 +2430,6 @@ Layout/LineLength:
- 'lib/api/concerns/packages/conan_endpoints.rb'
- 'lib/api/concerns/packages/debian_distribution_endpoints.rb'
- 'lib/api/concerns/packages/debian_package_endpoints.rb'
- - 'lib/api/concerns/packages/nuget_endpoints.rb'
- 'lib/api/debian_group_packages.rb'
- 'lib/api/debian_project_packages.rb'
- 'lib/api/deploy_keys.rb'
@@ -2556,7 +2477,6 @@ Layout/LineLength:
- 'lib/api/internal/base.rb'
- 'lib/api/internal/kubernetes.rb'
- 'lib/api/internal/mail_room.rb'
- - 'lib/api/internal/pages.rb'
- 'lib/api/invitations.rb'
- 'lib/api/issues.rb'
- 'lib/api/lint.rb'
@@ -2601,7 +2521,6 @@ Layout/LineLength:
- 'lib/api/templates.rb'
- 'lib/api/terraform/modules/v1/packages.rb'
- 'lib/api/terraform/state.rb'
- - 'lib/api/time_tracking_endpoints.rb'
- 'lib/api/todos.rb'
- 'lib/api/users.rb'
- 'lib/api/wikis.rb'
@@ -2612,7 +2531,6 @@ Layout/LineLength:
- 'lib/backup/gitaly_backup.rb'
- 'lib/backup/manager.rb'
- 'lib/banzai/filter/autolink_filter.rb'
- - 'lib/banzai/filter/inline_diff_filter.rb'
- 'lib/banzai/filter/markdown_post_escape_filter.rb'
- 'lib/banzai/filter/references/external_issue_reference_filter.rb'
- 'lib/banzai/filter/references/issue_reference_filter.rb'
@@ -2645,7 +2563,6 @@ Layout/LineLength:
- 'lib/gitlab/analytics/cycle_analytics/aggregated/records_fetcher.rb'
- 'lib/gitlab/analytics/cycle_analytics/aggregated/stage_query_helpers.rb'
- 'lib/gitlab/analytics/cycle_analytics/base_query_builder.rb'
- - 'lib/gitlab/analytics/cycle_analytics/request_params.rb'
- 'lib/gitlab/analytics/cycle_analytics/stage_events.rb'
- 'lib/gitlab/analytics/cycle_analytics/stage_events/issue_deployed_to_production.rb'
- 'lib/gitlab/analytics/cycle_analytics/stage_events/issue_stage_end.rb'
@@ -2660,7 +2577,6 @@ Layout/LineLength:
- 'lib/gitlab/auth/ldap/adapter.rb'
- 'lib/gitlab/auth/ldap/dn.rb'
- 'lib/gitlab/auth/ldap/person.rb'
- - 'lib/gitlab/auth/o_auth/session.rb'
- 'lib/gitlab/auth/o_auth/user.rb'
- 'lib/gitlab/auth/saml/auth_hash.rb'
- 'lib/gitlab/auth/user_access_denied_reason.rb'
@@ -2678,7 +2594,6 @@ Layout/LineLength:
- 'lib/gitlab/background_migration/migrate_requirements_to_work_items.rb'
- 'lib/gitlab/background_migration/populate_resolved_on_default_branch_column.rb'
- 'lib/gitlab/background_migration/project_namespaces/backfill_project_namespaces.rb'
- - 'lib/gitlab/background_migration/reset_duplicate_ci_runners_token_encrypted_values_on_projects.rb'
- 'lib/gitlab/bitbucket_import/importer.rb'
- 'lib/gitlab/bitbucket_server_import/importer.rb'
- 'lib/gitlab/buffered_io.rb'
@@ -2722,7 +2637,6 @@ Layout/LineLength:
- 'lib/gitlab/ci/runner_releases.rb'
- 'lib/gitlab/ci/runner_upgrade_check.rb'
- 'lib/gitlab/ci/status/build/manual.rb'
- - 'lib/gitlab/ci/status/build/waiting_for_approval.rb'
- 'lib/gitlab/ci/variables/builder.rb'
- 'lib/gitlab/cleanup/project_uploads.rb'
- 'lib/gitlab/composer/version_index.rb'
@@ -2770,7 +2684,6 @@ Layout/LineLength:
- 'lib/gitlab/database/similarity_score.rb'
- 'lib/gitlab/database/with_lock_retries.rb'
- 'lib/gitlab/database/with_lock_retries_outside_transaction.rb'
- - 'lib/gitlab/database_importers/instance_administrators/create_group.rb'
- 'lib/gitlab/dependency_linker/base_linker.rb'
- 'lib/gitlab/dependency_linker/go_mod_linker.rb'
- 'lib/gitlab/dependency_linker/go_sum_linker.rb'
@@ -2844,7 +2757,6 @@ Layout/LineLength:
- 'lib/gitlab/import_export/base/object_builder.rb'
- 'lib/gitlab/import_export/base/relation_factory.rb'
- 'lib/gitlab/import_export/base/relation_object_saver.rb'
- - 'lib/gitlab/import_export/file_importer.rb'
- 'lib/gitlab/import_export/group/relation_tree_restorer.rb'
- 'lib/gitlab/import_export/importer.rb'
- 'lib/gitlab/import_export/json/streaming_serializer.rb'
@@ -2856,7 +2768,6 @@ Layout/LineLength:
- 'lib/gitlab/import_export/snippet_repo_restorer.rb'
- 'lib/gitlab/import_export/version_checker.rb'
- 'lib/gitlab/instrumentation/redis_base.rb'
- - 'lib/gitlab/instrumentation_helper.rb'
- 'lib/gitlab/issues/rebalancing/state.rb'
- 'lib/gitlab/jira/http_client.rb'
- 'lib/gitlab/jira_import.rb'
@@ -2909,9 +2820,7 @@ Layout/LineLength:
- '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/rack_attack.rb'
- - 'lib/gitlab/redis/wrapper.rb'
- 'lib/gitlab/regex.rb'
- 'lib/gitlab/relative_positioning/item_context.rb'
- 'lib/gitlab/repository_size_error_message.rb'
@@ -2955,9 +2864,7 @@ Layout/LineLength:
- 'lib/gitlab/utils/override.rb'
- 'lib/gitlab/utils/usage_data.rb'
- 'lib/gitlab/webpack/manifest.rb'
- - 'lib/gitlab/wiki_pages/front_matter_parser.rb'
- 'lib/gitlab/word_diff/parser.rb'
- - 'lib/gitlab/x509/tag.rb'
- 'lib/google_api/cloud_platform/client.rb'
- 'lib/peek/views/memory.rb'
- 'lib/quality/seeders/issues.rb'
@@ -2997,7 +2904,6 @@ Layout/LineLength:
- 'lib/tasks/migrate/schema_check.rake'
- 'lib/tasks/tanuki_emoji.rake'
- 'lib/tasks/test.rake'
- - 'lib/uploaded_file.rb'
- 'qa/qa/ee/page/group/secure/show.rb'
- 'qa/qa/ee/page/group/settings/general.rb'
- 'qa/qa/ee/page/group/settings/saml_sso.rb'
@@ -3018,7 +2924,6 @@ Layout/LineLength:
- 'qa/qa/page/project/registry/show.rb'
- 'qa/qa/page/project/settings/protected_branches.rb'
- 'qa/qa/page/project/web_ide/edit.rb'
- - 'qa/qa/resource/api_fabricator.rb'
- 'qa/qa/resource/file.rb'
- 'qa/qa/resource/protected_branch.rb'
- 'qa/qa/resource/registry_repository.rb'
@@ -3045,14 +2950,12 @@ Layout/LineLength:
- 'qa/qa/specs/features/api/3_create/repository/push_postreceive_idempotent_spec.rb'
- 'qa/qa/specs/features/api/3_create/snippet/snippet_repository_storage_move_spec.rb'
- 'qa/qa/specs/features/api/4_verify/cancel_pipeline_when_block_user_spec.rb'
- - 'qa/qa/specs/features/api/5_package/container_registry_spec.rb'
- 'qa/qa/specs/features/browser_ui/1_manage/group/create_group_with_mattermost_team_spec.rb'
- 'qa/qa/specs/features/browser_ui/1_manage/login/2fa_ssh_recovery_spec.rb'
- 'qa/qa/specs/features/browser_ui/1_manage/login/log_in_spec.rb'
- 'qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb'
- 'qa/qa/specs/features/browser_ui/1_manage/login/log_into_gitlab_via_ldap_spec.rb'
- 'qa/qa/specs/features/browser_ui/1_manage/login/log_into_mattermost_via_gitlab_spec.rb'
- - 'qa/qa/specs/features/browser_ui/1_manage/login/maintain_log_in_mixed_env_spec.rb'
- 'qa/qa/specs/features/browser_ui/1_manage/login/register_spec.rb'
- 'qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb'
- 'qa/qa/specs/features/browser_ui/2_plan/issue/collapse_comments_in_discussions_spec.rb'
@@ -3103,13 +3006,10 @@ Layout/LineLength:
- '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/merge_mr_when_pipline_is_blocked_spec.rb'
- 'qa/qa/specs/features/browser_ui/4_verify/pipeline/pass_dotenv_variables_to_downstream_via_bridge_spec.rb'
- - 'qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_branch_switcher_spec.rb'
- 'qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_matrix_spec.rb'
- 'qa/qa/specs/features/browser_ui/4_verify/pipeline/update_ci_file_with_pipeline_editor_spec.rb'
- 'qa/qa/specs/features/browser_ui/4_verify/runner/register_runner_spec.rb'
- 'qa/qa/specs/features/browser_ui/4_verify/testing/view_code_coverage_spec.rb'
- - 'qa/qa/specs/features/browser_ui/5_package/container_registry/container_registry_spec.rb'
- - 'qa/qa/specs/features/browser_ui/5_package/container_registry/online_garbage_collection_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/conan_repository_spec.rb'
- 'qa/qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb'
@@ -3153,9 +3053,7 @@ Layout/LineLength:
- 'qa/qa/specs/features/ee/browser_ui/3_create/merge_request/approval_rules_spec.rb'
- 'qa/qa/specs/features/ee/browser_ui/3_create/merge_request/default_merge_request_template_spec.rb'
- 'qa/qa/specs/features/ee/browser_ui/3_create/repository/assign_code_owners_spec.rb'
- - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/code_owners_spec.rb'
- 'qa/qa/specs/features/ee/browser_ui/3_create/repository/code_owners_with_protected_branch_and_squashed_commits_spec.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/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/pull_mirroring_over_http_spec.rb'
@@ -3165,7 +3063,6 @@ Layout/LineLength:
- 'qa/qa/specs/features/ee/browser_ui/4_verify/pipeline_subscription_with_group_owned_project_spec.rb'
- 'qa/qa/specs/features/ee/browser_ui/4_verify/transient/merge_trains_transient_bug_spec.rb'
- 'qa/qa/specs/features/ee/browser_ui/5_package/dependency_proxy_sso_spec.rb'
- - 'qa/qa/specs/helpers/context_selector.rb'
- 'qa/qa/specs/parallel_runner.rb'
- 'qa/qa/support/run.rb'
- 'qa/qa/support/ssh.rb'
@@ -3201,7 +3098,6 @@ Layout/LineLength:
- 'scripts/api/cancel_pipeline.rb'
- 'scripts/api/get_job_id.rb'
- 'scripts/changed-feature-flags'
- - 'scripts/flaky_examples/prune-old-flaky-examples'
- 'scripts/lint_templates_bash.rb'
- 'scripts/no-dir-check'
- 'scripts/perf/query_limiting_report.rb'
@@ -3223,14 +3119,12 @@ Layout/LineLength:
- 'spec/controllers/concerns/check_rate_limit_spec.rb'
- 'spec/controllers/concerns/confirm_email_warning_spec.rb'
- 'spec/controllers/concerns/metrics_dashboard_spec.rb'
- - 'spec/controllers/concerns/product_analytics_tracking_spec.rb'
- 'spec/controllers/concerns/send_file_upload_spec.rb'
- 'spec/controllers/concerns/sourcegraph_decorator_spec.rb'
- 'spec/controllers/concerns/spammable_actions/akismet_mark_as_spam_action_spec.rb'
- 'spec/controllers/concerns/static_object_external_storage_spec.rb'
- 'spec/controllers/dashboard/milestones_controller_spec.rb'
- 'spec/controllers/dashboard/projects_controller_spec.rb'
- - 'spec/controllers/every_controller_spec.rb'
- 'spec/controllers/explore/projects_controller_spec.rb'
- 'spec/controllers/groups/children_controller_spec.rb'
- 'spec/controllers/groups/clusters_controller_spec.rb'
@@ -3239,7 +3133,6 @@ Layout/LineLength:
- 'spec/controllers/groups/milestones_controller_spec.rb'
- 'spec/controllers/groups/releases_controller_spec.rb'
- 'spec/controllers/groups/settings/applications_controller_spec.rb'
- - 'spec/controllers/groups/settings/integrations_controller_spec.rb'
- 'spec/controllers/groups_controller_spec.rb'
- 'spec/controllers/import/bitbucket_controller_spec.rb'
- 'spec/controllers/import/bitbucket_server_controller_spec.rb'
@@ -3254,7 +3147,6 @@ Layout/LineLength:
- 'spec/controllers/passwords_controller_spec.rb'
- 'spec/controllers/profiles/accounts_controller_spec.rb'
- 'spec/controllers/profiles/notifications_controller_spec.rb'
- - 'spec/controllers/profiles/webauthn_registrations_controller_spec.rb'
- 'spec/controllers/profiles_controller_spec.rb'
- 'spec/controllers/projects/alerting/notifications_controller_spec.rb'
- 'spec/controllers/projects/analytics/cycle_analytics/summary_controller_spec.rb'
@@ -3294,7 +3186,6 @@ Layout/LineLength:
- 'spec/controllers/projects/registry/tags_controller_spec.rb'
- 'spec/controllers/projects/repositories_controller_spec.rb'
- 'spec/controllers/projects/runners_controller_spec.rb'
- - 'spec/controllers/projects/service_desk_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'
@@ -3312,7 +3203,6 @@ Layout/LineLength:
- 'spec/controllers/uploads_controller_spec.rb'
- 'spec/db/schema_spec.rb'
- 'spec/deprecation_toolkit_env.rb'
- - 'spec/experiments/concerns/project_commit_count_spec.rb'
- 'spec/factories/ci/job_artifacts.rb'
- 'spec/factories/ci/pipelines.rb'
- 'spec/factories/ci/reports/codequality_degradations.rb'
@@ -3356,7 +3246,6 @@ Layout/LineLength:
- 'spec/features/commits_spec.rb'
- 'spec/features/contextual_sidebar_spec.rb'
- 'spec/features/cycle_analytics_spec.rb'
- - 'spec/features/dashboard/issues_spec.rb'
- 'spec/features/dashboard/projects_spec.rb'
- 'spec/features/dashboard/todos/todos_spec.rb'
- 'spec/features/dashboard/user_filters_projects_spec.rb'
@@ -3406,7 +3295,6 @@ Layout/LineLength:
- 'spec/features/labels_hierarchy_spec.rb'
- 'spec/features/markdown/copy_as_gfm_spec.rb'
- 'spec/features/markdown/gitlab_flavored_markdown_spec.rb'
- - 'spec/features/markdown/metrics_spec.rb'
- 'spec/features/merge_request/batch_comments_spec.rb'
- 'spec/features/merge_request/user_accepts_merge_request_spec.rb'
- 'spec/features/merge_request/user_allows_commits_from_memebers_who_can_merge_spec.rb'
@@ -3506,7 +3394,6 @@ Layout/LineLength:
- 'spec/features/projects/settings/access_tokens_spec.rb'
- 'spec/features/projects/settings/project_settings_spec.rb'
- 'spec/features/projects/settings/registry_settings_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/settings/user_renames_a_project_spec.rb'
- 'spec/features/projects/settings/visibility_settings_spec.rb'
@@ -3551,7 +3438,6 @@ Layout/LineLength:
- 'spec/finders/environments/environments_by_deployments_finder_spec.rb'
- 'spec/finders/environments/environments_finder_spec.rb'
- 'spec/finders/events_finder_spec.rb'
- - 'spec/finders/fork_targets_finder_spec.rb'
- 'spec/finders/group_descendants_finder_spec.rb'
- 'spec/finders/group_members_finder_spec.rb'
- 'spec/finders/group_projects_finder_spec.rb'
@@ -3693,7 +3579,6 @@ Layout/LineLength:
- 'spec/helpers/environments_helper_spec.rb'
- 'spec/helpers/events_helper_spec.rb'
- 'spec/helpers/external_link_helper_spec.rb'
- - 'spec/helpers/feature_flags_helper_spec.rb'
- 'spec/helpers/gitlab_routing_helper_spec.rb'
- 'spec/helpers/gitlab_script_tag_helper_spec.rb'
- 'spec/helpers/groups/group_members_helper_spec.rb'
@@ -3764,9 +3649,7 @@ Layout/LineLength:
- 'spec/lib/banzai/filter/external_link_filter_spec.rb'
- 'spec/lib/banzai/filter/gollum_tags_filter_spec.rb'
- 'spec/lib/banzai/filter/image_link_filter_spec.rb'
- - 'spec/lib/banzai/filter/inline_alert_metrics_filter_spec.rb'
- 'spec/lib/banzai/filter/inline_diff_filter_spec.rb'
- - 'spec/lib/banzai/filter/inline_metrics_filter_spec.rb'
- 'spec/lib/banzai/filter/kroki_filter_spec.rb'
- 'spec/lib/banzai/filter/math_filter_spec.rb'
- 'spec/lib/banzai/filter/mermaid_filter_spec.rb'
@@ -3852,22 +3735,11 @@ Layout/LineLength:
- '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/background_migration/backfill_issue_search_data_spec.rb'
- - 'spec/lib/gitlab/background_migration/backfill_member_namespace_for_group_members_spec.rb'
- 'spec/lib/gitlab/background_migration/backfill_project_repositories_spec.rb'
- - 'spec/lib/gitlab/background_migration/backfill_snippet_repositories_spec.rb'
- - 'spec/lib/gitlab/background_migration/batching_strategies/backfill_project_namespace_per_group_batching_strategy_spec.rb'
- 'spec/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy_spec.rb'
- 'spec/lib/gitlab/background_migration/copy_column_using_background_migration_job_spec.rb'
- - 'spec/lib/gitlab/background_migration/fix_duplicate_project_name_and_path_spec.rb'
- - 'spec/lib/gitlab/background_migration/fix_vulnerability_occurrences_with_hashes_as_raw_metadata_spec.rb'
- 'spec/lib/gitlab/background_migration/job_coordinator_spec.rb'
- 'spec/lib/gitlab/background_migration/legacy_upload_mover_spec.rb'
- - 'spec/lib/gitlab/background_migration/migrate_personal_namespace_project_maintainer_to_owner_spec.rb'
- - 'spec/lib/gitlab/background_migration/populate_container_repository_migration_plan_spec.rb'
- - 'spec/lib/gitlab/background_migration/project_namespaces/backfill_project_namespaces_spec.rb'
- - 'spec/lib/gitlab/background_migration/remove_occurrence_pipelines_and_duplicate_vulnerabilities_findings_spec.rb'
- - 'spec/lib/gitlab/background_migration/remove_vulnerability_finding_links_spec.rb'
- 'spec/lib/gitlab/background_migration/update_jira_tracker_data_deployment_type_based_on_url_spec.rb'
- 'spec/lib/gitlab/bitbucket_import/importer_spec.rb'
- 'spec/lib/gitlab/bitbucket_server_import/importer_spec.rb'
@@ -3885,13 +3757,11 @@ Layout/LineLength:
- 'spec/lib/gitlab/ci/badge/coverage/report_spec.rb'
- 'spec/lib/gitlab/ci/build/releaser_spec.rb'
- 'spec/lib/gitlab/ci/build/step_spec.rb'
- - 'spec/lib/gitlab/ci/config/entry/cache_spec.rb'
- 'spec/lib/gitlab/ci/config/entry/environment_spec.rb'
- 'spec/lib/gitlab/ci/config/entry/reports_spec.rb'
- 'spec/lib/gitlab/ci/config/entry/root_spec.rb'
- 'spec/lib/gitlab/ci/config/entry/services_spec.rb'
- 'spec/lib/gitlab/ci/config/external/file/artifact_spec.rb'
- - 'spec/lib/gitlab/ci/config/external/file/base_spec.rb'
- 'spec/lib/gitlab/ci/config/external/file/local_spec.rb'
- 'spec/lib/gitlab/ci/config/external/file/project_spec.rb'
- 'spec/lib/gitlab/ci/config/external/file/remote_spec.rb'
@@ -3922,7 +3792,6 @@ Layout/LineLength:
- 'spec/lib/gitlab/ci/runner_upgrade_check_spec.rb'
- 'spec/lib/gitlab/ci/status/bridge/factory_spec.rb'
- 'spec/lib/gitlab/ci/status/build/manual_spec.rb'
- - 'spec/lib/gitlab/ci/status/build/waiting_for_approval_spec.rb'
- 'spec/lib/gitlab/ci/status/stage/play_manual_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'
@@ -4186,7 +4055,6 @@ Layout/LineLength:
- 'spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job_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/worker_context/server_spec.rb'
- 'spec/lib/gitlab/slash_commands/presenters/issue_new_spec.rb'
- 'spec/lib/gitlab/spamcheck/client_spec.rb'
- 'spec/lib/gitlab/sql/pattern_spec.rb'
@@ -4194,6 +4062,7 @@ Layout/LineLength:
- 'spec/lib/gitlab/string_range_marker_spec.rb'
- 'spec/lib/gitlab/string_regex_marker_spec.rb'
- 'spec/lib/gitlab/suggestions/commit_message_spec.rb'
+ - 'spec/lib/gitlab/task_helpers_spec.rb'
- 'spec/lib/gitlab/template/issue_template_spec.rb'
- 'spec/lib/gitlab/template/merge_request_template_spec.rb'
- 'spec/lib/gitlab/throttle_spec.rb'
@@ -4231,7 +4100,6 @@ Layout/LineLength:
- 'spec/lib/gitlab/utils/measuring_spec.rb'
- 'spec/lib/gitlab/utils/nokogiri_spec.rb'
- 'spec/lib/gitlab/utils/usage_data_spec.rb'
- - 'spec/lib/gitlab/utils_spec.rb'
- 'spec/lib/gitlab/web_ide/config/entry/global_spec.rb'
- 'spec/lib/gitlab/web_ide/config/entry/terminal_spec.rb'
- 'spec/lib/gitlab/webpack/file_loader_spec.rb'
@@ -4270,9 +4138,6 @@ Layout/LineLength:
- 'spec/mailers/emails/service_desk_spec.rb'
- 'spec/mailers/notify_spec.rb'
- 'spec/migrations/active_record/schema_spec.rb'
- - 'spec/migrations/cleanup_after_fixing_issue_when_admin_changed_primary_email_spec.rb'
- - 'spec/migrations/finalize_project_namespaces_backfill_spec.rb'
- - 'spec/migrations/fix_and_backfill_project_namespaces_for_projects_with_duplicate_name_spec.rb'
- 'spec/models/active_session_spec.rb'
- 'spec/models/acts_as_taggable_on/tag_spec.rb'
- 'spec/models/acts_as_taggable_on/tagging_spec.rb'
@@ -4284,7 +4149,6 @@ Layout/LineLength:
- 'spec/models/authentication_event_spec.rb'
- 'spec/models/award_emoji_spec.rb'
- 'spec/models/blob_viewer/go_mod_spec.rb'
- - 'spec/models/blob_viewer/metrics_dashboard_yml_spec.rb'
- 'spec/models/bulk_import_spec.rb'
- 'spec/models/bulk_imports/entity_spec.rb'
- 'spec/models/bulk_imports/file_transfer/project_config_spec.rb'
@@ -4387,7 +4251,6 @@ Layout/LineLength:
- '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'
@@ -4402,7 +4265,6 @@ Layout/LineLength:
- 'spec/models/packages/dependency_spec.rb'
- 'spec/models/packages/go/module_version_spec.rb'
- 'spec/models/packages/nuget/dependency_link_metadatum_spec.rb'
- - 'spec/models/packages/nuget/metadatum_spec.rb'
- 'spec/models/packages/package_file_spec.rb'
- 'spec/models/packages/package_spec.rb'
- 'spec/models/pages/virtual_domain_spec.rb'
@@ -4426,7 +4288,6 @@ Layout/LineLength:
- 'spec/models/projects/topic_spec.rb'
- 'spec/models/projects/triggered_hooks_spec.rb'
- 'spec/models/prometheus_metric_spec.rb'
- - 'spec/models/protected_branch/merge_access_level_spec.rb'
- 'spec/models/protected_branch/push_access_level_spec.rb'
- 'spec/models/protected_branch_spec.rb'
- 'spec/models/redirect_route_spec.rb'
@@ -4473,13 +4334,11 @@ Layout/LineLength:
- 'spec/presenters/packages/conan/package_presenter_spec.rb'
- 'spec/presenters/packages/detail/package_presenter_spec.rb'
- 'spec/presenters/packages/helm/index_presenter_spec.rb'
- - 'spec/presenters/packages/npm/package_presenter_spec.rb'
- 'spec/presenters/packages/nuget/package_metadata_presenter_spec.rb'
- 'spec/presenters/packages/nuget/packages_metadata_presenter_spec.rb'
- 'spec/presenters/packages/nuget/search_results_presenter_spec.rb'
- 'spec/presenters/projects/security/configuration_presenter_spec.rb'
- 'spec/presenters/prometheus_alert_presenter_spec.rb'
- - 'spec/presenters/service_hook_presenter_spec.rb'
- 'spec/presenters/snippet_blob_presenter_spec.rb'
- 'spec/rack_servers/puma_spec.rb'
- 'spec/requests/admin/background_migrations_controller_spec.rb'
@@ -4584,7 +4443,6 @@ Layout/LineLength:
- 'spec/requests/api/group_clusters_spec.rb'
- 'spec/requests/api/group_debian_distributions_spec.rb'
- 'spec/requests/api/group_labels_spec.rb'
- - 'spec/requests/api/group_milestones_spec.rb'
- 'spec/requests/api/group_packages_spec.rb'
- 'spec/requests/api/group_variables_spec.rb'
- 'spec/requests/api/groups_spec.rb'
@@ -4759,7 +4617,6 @@ Layout/LineLength:
- 'spec/services/ci/update_pending_build_service_spec.rb'
- 'spec/services/clusters/agents/authorizations/ci_access/filter_service_spec.rb'
- 'spec/services/clusters/create_service_spec.rb'
- - 'spec/services/clusters/integrations/prometheus_health_check_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'
@@ -4991,7 +4848,6 @@ Layout/LineLength:
- 'spec/support/database/prevent_cross_database_modification.rb'
- 'spec/support/database/prevent_cross_joins.rb'
- 'spec/support/db_cleaner.rb'
- - 'spec/support/fast_quarantine.rb'
- 'spec/support/helpers/api_helpers.rb'
- 'spec/support/helpers/board_helpers.rb'
- 'spec/support/helpers/cycle_analytics_helpers.rb'
@@ -5022,12 +4878,6 @@ Layout/LineLength:
- 'spec/support/matchers/project_namespace_matcher.rb'
- 'spec/support/matchers/query_matcher.rb'
- 'spec/support/matchers/route_to_route_not_found_matcher.rb'
- - 'spec/support/migrations_helpers/schema_version_finder.rb'
- - 'spec/support/migrations_helpers/vulnerabilities_findings_helper.rb'
- - 'spec/support/prometheus/additional_metrics_shared_examples.rb'
- - 'spec/support/redis/redis_shared_examples.rb'
- - 'spec/support/services/deploy_token_shared_examples.rb'
- - 'spec/support/services/issuable_update_service_shared_examples.rb'
- 'spec/support/shared_contexts/bulk_imports_requests_shared_context.rb'
- 'spec/support/shared_contexts/container_repositories_shared_context.rb'
- 'spec/support/shared_contexts/finders/group_projects_finder_shared_contexts.rb'
@@ -5169,7 +5019,6 @@ Layout/LineLength:
- 'spec/support/shared_examples/services/namespace_package_settings_shared_examples.rb'
- 'spec/support/shared_examples/services/packages/debian/generate_distribution_shared_examples.rb'
- 'spec/support/shared_examples/services/projects/update_repository_storage_service_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/resource_events/change_milestone_service_shared_examples.rb'
- 'spec/support/shared_examples/services/security/ci_configuration/create_service_shared_examples.rb'
@@ -5199,22 +5048,18 @@ Layout/LineLength:
- 'spec/tasks/gitlab/smtp_rake_spec.rb'
- 'spec/tasks/gitlab/snippets_rake_spec.rb'
- 'spec/tasks/gitlab/storage_rake_spec.rb'
- - 'spec/lib/gitlab/task_helpers_spec.rb'
- 'spec/tasks/gitlab/terraform/migrate_rake_spec.rb'
- 'spec/tasks/gitlab/uploads/check_rake_spec.rb'
- 'spec/tasks/gitlab/workhorse_rake_spec.rb'
- 'spec/tasks/migrate/schema_check_rake_spec.rb'
+ - 'spec/tooling/danger/analytics_instrumentation_spec.rb'
- 'spec/tooling/danger/datateam_spec.rb'
- 'spec/tooling/danger/feature_flag_spec.rb'
- - 'spec/tooling/danger/analytics_instrumentation_spec.rb'
- 'spec/tooling/danger/project_helper_spec.rb'
- 'spec/tooling/danger/sidekiq_queues_spec.rb'
- 'spec/tooling/lib/tooling/kubernetes_client_spec.rb'
- 'spec/tooling/lib/tooling/test_map_generator_spec.rb'
- 'spec/tooling/quality/test_level_spec.rb'
- - 'spec/tooling/rspec_flaky/config_spec.rb'
- - 'spec/tooling/rspec_flaky/flaky_examples_collection_spec.rb'
- - 'spec/tooling/rspec_flaky/report_spec.rb'
- 'spec/uploaders/ci/pipeline_artifact_uploader_spec.rb'
- 'spec/uploaders/file_mover_spec.rb'
- 'spec/uploaders/file_uploader_spec.rb'
@@ -5233,7 +5078,6 @@ Layout/LineLength:
- 'spec/views/groups/edit.html.haml_spec.rb'
- 'spec/views/help/index.html.haml_spec.rb'
- 'spec/views/layouts/_head.html.haml_spec.rb'
- - 'spec/views/layouts/application.html.haml_spec.rb'
- 'spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb'
- 'spec/views/notify/push_to_merge_request_email.text.haml_spec.rb'
- 'spec/views/profiles/keys/_form.html.haml_spec.rb'
@@ -5243,7 +5087,6 @@ Layout/LineLength:
- 'spec/views/projects/jobs/_generic_commit_status.html.haml_spec.rb'
- 'spec/views/projects/merge_requests/creations/_new_submit.html.haml_spec.rb'
- 'spec/views/projects/pages_domains/show.html.haml_spec.rb'
- - 'spec/views/projects/pipeline_schedules/_pipeline_schedule.html.haml_spec.rb'
- 'spec/views/projects/settings/ci_cd/_autodevops_form.html.haml_spec.rb'
- 'spec/views/projects/settings/operations/show.html.haml_spec.rb'
- 'spec/views/projects/tags/index.html.haml_spec.rb'
@@ -5269,7 +5112,6 @@ Layout/LineLength:
- 'spec/workers/ci/pipeline_success_unlock_artifacts_worker_spec.rb'
- 'spec/workers/ci/ref_delete_unlock_artifacts_worker_spec.rb'
- 'spec/workers/ci/resource_groups/assign_resource_from_resource_group_worker_spec.rb'
- - 'spec/workers/clusters/integrations/check_prometheus_health_worker_spec.rb'
- 'spec/workers/concerns/application_worker_spec.rb'
- 'spec/workers/concerns/project_import_options_spec.rb'
- 'spec/workers/container_expiration_policies/cleanup_container_repository_worker_spec.rb'
@@ -5323,11 +5165,8 @@ Layout/LineLength:
- 'spec/workers/users/deactivate_dormant_users_worker_spec.rb'
- 'tooling/danger/analytics_instrumentation.rb'
- 'tooling/danger/project_helper.rb'
- - 'tooling/danger/specs.rb'
- 'tooling/graphql/docs/helper.rb'
- 'tooling/lib/tooling/helm3_client.rb'
- 'tooling/lib/tooling/kubernetes_client.rb'
- 'tooling/merge_request_rspec_failure_rake_task.rb'
- 'tooling/quality/test_level.rb'
- - 'tooling/rspec_flaky/listener.rb'
- - 'tooling/rspec_flaky/report.rb'
diff --git a/.rubocop_todo/layout/space_in_lambda_literal.yml b/.rubocop_todo/layout/space_in_lambda_literal.yml
index 3bc63853043..ca6803be7e8 100644
--- a/.rubocop_todo/layout/space_in_lambda_literal.yml
+++ b/.rubocop_todo/layout/space_in_lambda_literal.yml
@@ -46,7 +46,6 @@ Layout/SpaceInLambdaLiteral:
- 'app/models/environment.rb'
- 'app/models/error_tracking/client_key.rb'
- 'app/models/error_tracking/error.rb'
- - 'app/models/external_pull_request.rb'
- 'app/models/group.rb'
- 'app/models/group_group_link.rb'
- 'app/models/incident_management/timeline_event_tag.rb'
diff --git a/.rubocop_todo/lint/ambiguous_regexp_literal.yml b/.rubocop_todo/lint/ambiguous_regexp_literal.yml
index c3b06ede5be..4754e381780 100644
--- a/.rubocop_todo/lint/ambiguous_regexp_literal.yml
+++ b/.rubocop_todo/lint/ambiguous_regexp_literal.yml
@@ -66,7 +66,6 @@ Lint/AmbiguousRegexpLiteral:
- 'spec/lib/gitlab/pagination/keyset/iterator_spec.rb'
- 'spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job_spec.rb'
- 'spec/lib/gitlab/usage/metrics/aggregates/sources/postgres_hll_spec.rb'
- - 'spec/lib/gitlab/utils/strong_memoize_spec.rb'
- 'spec/lib/gitlab/web_ide/config/entry/global_spec.rb'
- 'spec/lib/gitlab/web_ide/config/entry/terminal_spec.rb'
- 'spec/lib/object_storage/direct_upload_spec.rb'
diff --git a/.rubocop_todo/lint/assignment_in_condition.yml b/.rubocop_todo/lint/assignment_in_condition.yml
new file mode 100644
index 00000000000..0d893f4c1a0
--- /dev/null
+++ b/.rubocop_todo/lint/assignment_in_condition.yml
@@ -0,0 +1,259 @@
+---
+# Cop supports --autocorrect.
+Lint/AssignmentInCondition:
+ Details: grace period
+ Exclude:
+ - 'app/controllers/concerns/uploads_actions.rb'
+ - 'app/controllers/concerns/verifies_with_email.rb'
+ - 'app/controllers/omniauth_callbacks_controller.rb'
+ - 'app/controllers/projects/blob_controller.rb'
+ - 'app/controllers/projects/commit_controller.rb'
+ - 'app/controllers/projects/merge_requests/diffs_controller.rb'
+ - 'app/controllers/projects/settings/integrations_controller.rb'
+ - 'app/controllers/repositories/lfs_api_controller.rb'
+ - 'app/controllers/users/terms_controller.rb'
+ - 'app/finders/merge_requests/oldest_per_commit_finder.rb'
+ - 'app/finders/pending_todos_finder.rb'
+ - 'app/finders/repositories/changelog_commits_finder.rb'
+ - 'app/graphql/mutations/ci/runner/bulk_delete.rb'
+ - 'app/graphql/mutations/merge_requests/accept.rb'
+ - 'app/graphql/mutations/notes/create/note.rb'
+ - 'app/graphql/resolvers/deployments_resolver.rb'
+ - 'app/graphql/types/global_id_type.rb'
+ - 'app/helpers/blob_helper.rb'
+ - 'app/helpers/button_helper.rb'
+ - 'app/helpers/issuables_helper.rb'
+ - 'app/helpers/snippets_helper.rb'
+ - 'app/mailers/emails/service_desk.rb'
+ - 'app/mailers/notify.rb'
+ - 'app/models/blob_viewer/go_mod.rb'
+ - 'app/models/ci/build_metadata.rb'
+ - 'app/models/ci/runner.rb'
+ - 'app/models/clusters/platforms/kubernetes.rb'
+ - 'app/models/concerns/after_commit_queue.rb'
+ - 'app/models/concerns/atomic_internal_id.rb'
+ - 'app/models/concerns/bulk_insert_safe.rb'
+ - 'app/models/concerns/has_unique_internal_users.rb'
+ - 'app/models/concerns/subscribable.rb'
+ - 'app/models/design_management/design_collection.rb'
+ - 'app/models/diff_note.rb'
+ - 'app/models/merge_request.rb'
+ - 'app/models/merge_request_diff.rb'
+ - 'app/models/repository.rb'
+ - 'app/models/snippet_repository.rb'
+ - 'app/models/user.rb'
+ - 'app/presenters/ci/pipeline_presenter.rb'
+ - 'app/presenters/commit_status_presenter.rb'
+ - 'app/presenters/project_presenter.rb'
+ - 'app/serializers/fork_namespace_entity.rb'
+ - 'app/serializers/merge_request_poll_cached_widget_entity.rb'
+ - 'app/services/ci/create_pipeline_service.rb'
+ - 'app/services/ci/find_exposed_artifacts_service.rb'
+ - 'app/services/ci/runners/register_runner_service.rb'
+ - 'app/services/clusters/agents/authorize_proxy_user_service.rb'
+ - 'app/services/deployments/create_for_build_service.rb'
+ - 'app/services/deployments/create_service.rb'
+ - 'app/services/deployments/link_merge_requests_service.rb'
+ - 'app/services/deployments/update_environment_service.rb'
+ - 'app/services/design_management/on_success_callbacks.rb'
+ - 'app/services/environments/schedule_to_delete_review_apps_service.rb'
+ - 'app/services/groups/nested_create_service.rb'
+ - 'app/services/issuable_base_service.rb'
+ - 'app/services/issues/zoom_link_service.rb'
+ - 'app/services/lfs/file_transformer.rb'
+ - 'app/services/merge_requests/base_service.rb'
+ - 'app/services/merge_requests/mergeability_check_service.rb'
+ - 'app/services/metrics/dashboard/dynamic_embed_service.rb'
+ - 'app/services/packages/debian/parse_debian822_service.rb'
+ - 'app/services/pages/migrate_from_legacy_storage_service.rb'
+ - 'app/services/projects/operations/update_service.rb'
+ - 'app/services/projects/prometheus/alerts/notify_service.rb'
+ - 'app/services/projects/unlink_fork_service.rb'
+ - 'app/services/releases/update_service.rb'
+ - 'app/services/repositories/changelog_service.rb'
+ - 'app/services/system_notes/incident_service.rb'
+ - 'app/services/system_notes/merge_requests_service.rb'
+ - 'app/services/task_list_toggle_service.rb'
+ - 'app/services/tasks_to_be_done/base_service.rb'
+ - 'app/services/users/last_push_event_service.rb'
+ - 'app/services/users/refresh_authorized_projects_service.rb'
+ - 'app/services/users/update_service.rb'
+ - 'app/uploaders/file_mover.rb'
+ - 'app/uploaders/file_uploader.rb'
+ - 'app/validators/x509_certificate_credentials_validator.rb'
+ - 'app/workers/ci/build_finished_worker.rb'
+ - 'app/workers/clusters/agents/delete_expired_events_worker.rb'
+ - 'app/workers/clusters/agents/notify_git_push_worker.rb'
+ - 'app/workers/concerns/gitlab/bitbucket_server_import/object_importer.rb'
+ - 'app/workers/concerns/gitlab/bitbucket_server_import/stage_methods.rb'
+ - 'app/workers/concerns/gitlab/github_import/object_importer.rb'
+ - 'app/workers/concerns/gitlab/github_import/stage_methods.rb'
+ - 'app/workers/concerns/gitlab/notify_upon_death.rb'
+ - 'app/workers/deployments/hooks_worker.rb'
+ - 'app/workers/deployments/link_merge_request_worker.rb'
+ - 'app/workers/gitlab/github_gists_import/import_gist_worker.rb'
+ - 'app/workers/gitlab/github_import/stage/import_lfs_objects_worker.rb'
+ - 'app/workers/gitlab/import/advance_stage.rb'
+ - 'app/workers/ml/experiment_tracking/associate_ml_candidate_to_package_worker.rb'
+ - 'app/workers/new_note_worker.rb'
+ - 'app/workers/terraform/states/destroy_worker.rb'
+ - 'config/initializers/carrierwave_performance_patch.rb'
+ - 'config/initializers/peek.rb'
+ - 'config/initializers/validate_database_config.rb'
+ - 'config/initializers/zz_metrics.rb'
+ - 'db/post_migrate/20220919080303_delete_migrate_shared_vulnerability_scanners.rb'
+ - 'ee/app/controllers/concerns/gitlab_subscriptions/seat_count_alert.rb'
+ - 'ee/app/controllers/omniauth_kerberos_controller.rb'
+ - 'ee/app/controllers/users/identity_verification_controller.rb'
+ - 'ee/app/finders/ee/projects_finder.rb'
+ - 'ee/app/finders/incident_management/oncall_users_finder.rb'
+ - 'ee/app/graphql/mutations/boards/update_epic_user_preferences.rb'
+ - 'ee/app/graphql/mutations/incident_management/escalation_policy/base.rb'
+ - 'ee/app/models/ee/ci/build.rb'
+ - 'ee/app/models/ee/merge_request.rb'
+ - 'ee/app/models/ee/preloaders/single_hierarchy_project_group_plans_preloader.rb'
+ - 'ee/app/models/productivity_analytics.rb'
+ - 'ee/app/presenters/ee/ci/pipeline_presenter.rb'
+ - 'ee/app/services/app_sec/dast/profiles/create_associations_service.rb'
+ - 'ee/app/services/app_sec/dast/site_profiles/update_service.rb'
+ - 'ee/app/services/deployments/approval_service.rb'
+ - 'ee/app/services/dora/aggregate_metrics_service.rb'
+ - 'ee/app/services/ee/application_settings/update_service.rb'
+ - 'ee/app/services/ee/issues/clone_service.rb'
+ - 'ee/app/services/ee/issues/move_service.rb'
+ - 'ee/app/services/ee/lfs/unlock_file_service.rb'
+ - 'ee/app/services/ee/projects/operations/update_service.rb'
+ - 'ee/app/services/gitlab_subscriptions/fetch_subscription_plans_service.rb'
+ - 'ee/app/services/incident_management/issuable_resource_links/zoom_link_service.rb'
+ - 'ee/app/services/incident_management/pending_escalations/create_service.rb'
+ - 'ee/app/services/security/security_orchestration_policies/rule_schedule_service.rb'
+ - 'ee/app/services/security/security_orchestration_policies/validate_policy_service.rb'
+ - 'ee/app/services/vulnerabilities/starboard_vulnerability_create_service.rb'
+ - 'ee/app/validators/vulnerabilities/cvss_vector_validator.rb'
+ - 'ee/db/fixtures/development/20_burndown.rb'
+ - 'ee/lib/ee/api/entities/approval_state.rb'
+ - 'ee/lib/ee/gitlab/auth/ldap/sync/group.rb'
+ - 'ee/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules.rb'
+ - 'ee/lib/ee/gitlab/checks/diff_check.rb'
+ - 'ee/lib/ee/gitlab/repo_path.rb'
+ - 'ee/lib/gem_extensions/elasticsearch/model/indexing/instance_methods.rb'
+ - 'ee/lib/gitlab/group_plans_preloader.rb'
+ - 'ee/lib/gitlab/llm/content_parser.rb'
+ - 'ee/lib/gitlab/path_locks_finder.rb'
+ - 'ee/lib/gitlab/subscription_portal/clients/graphql.rb'
+ - 'ee/lib/system_check/geo/authorized_keys_check.rb'
+ - 'ee/spec/factories/protected_environments.rb'
+ - 'lib/api/base.rb'
+ - 'lib/api/integrations.rb'
+ - 'lib/banzai/filter/ascii_doc_sanitization_filter.rb'
+ - 'lib/banzai/filter/broadcast_message_placeholders_filter.rb'
+ - 'lib/banzai/filter/footnote_filter.rb'
+ - 'lib/banzai/filter/gollum_tags_filter.rb'
+ - 'lib/banzai/filter/inline_observability_filter.rb'
+ - 'lib/banzai/filter/references/abstract_reference_filter.rb'
+ - 'lib/banzai/filter/references/merge_request_reference_filter.rb'
+ - 'lib/banzai/filter/references/project_reference_filter.rb'
+ - 'lib/banzai/filter/references/user_reference_filter.rb'
+ - 'lib/banzai/filter/table_of_contents_filter.rb'
+ - 'lib/feature/definition.rb'
+ - 'lib/file_size_validator.rb'
+ - 'lib/gitlab/audit/type/definition.rb'
+ - 'lib/gitlab/authorized_keys.rb'
+ - 'lib/gitlab/background_migration/fix_projects_without_project_feature.rb'
+ - 'lib/gitlab/blob_helper.rb'
+ - 'lib/gitlab/buffered_io.rb'
+ - 'lib/gitlab/changelog/config.rb'
+ - 'lib/gitlab/changelog/generator.rb'
+ - 'lib/gitlab/chat/output.rb'
+ - 'lib/gitlab/checks/diff_check.rb'
+ - 'lib/gitlab/ci/ansi2html.rb'
+ - 'lib/gitlab/ci/ansi2json/style.rb'
+ - 'lib/gitlab/ci/build/rules.rb'
+ - 'lib/gitlab/ci/build/rules/rule.rb'
+ - 'lib/gitlab/ci/components/instance_path.rb'
+ - 'lib/gitlab/ci/config/external/rules.rb'
+ - 'lib/gitlab/ci/config/normalizer.rb'
+ - 'lib/gitlab/ci/parsers/coverage/sax_document.rb'
+ - 'lib/gitlab/ci/yaml_processor.rb'
+ - 'lib/gitlab/counters/buffered_counter.rb'
+ - 'lib/gitlab/data_builder/deployment.rb'
+ - 'lib/gitlab/database/background_migration/batched_migration_runner.rb'
+ - 'lib/gitlab/database/gitlab_schema.rb'
+ - 'lib/gitlab/database/load_balancing/configuration.rb'
+ - 'lib/gitlab/database/load_balancing/host.rb'
+ - 'lib/gitlab/database/load_balancing/load_balancer.rb'
+ - 'lib/gitlab/database/load_balancing/wal_tracking_receiver.rb'
+ - 'lib/gitlab/database/load_balancing/wal_tracking_sender.rb'
+ - 'lib/gitlab/database/partitioning/monthly_strategy.rb'
+ - 'lib/gitlab/database/partitioning/partition_manager.rb'
+ - 'lib/gitlab/database/rename_reserved_paths_migration/v1/rename_base.rb'
+ - 'lib/gitlab/database/shared_model.rb'
+ - 'lib/gitlab/diff/formatters/base_formatter.rb'
+ - 'lib/gitlab/diff/lines_unfolder.rb'
+ - 'lib/gitlab/diff/position.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/create_note_on_issuable_handler.rb'
+ - 'lib/gitlab/email/handler/service_desk_handler.rb'
+ - 'lib/gitlab/encoding_helper.rb'
+ - 'lib/gitlab/exception_log_formatter.rb'
+ - 'lib/gitlab/file_markdown_link_builder.rb'
+ - 'lib/gitlab/fogbugz_import/importer.rb'
+ - 'lib/gitlab/git/blame.rb'
+ - 'lib/gitlab/git/pre_receive_error.rb'
+ - 'lib/gitlab/git/repository.rb'
+ - 'lib/gitlab/gitaly_client/cleanup_service.rb'
+ - 'lib/gitlab/gitaly_client/operation_service.rb'
+ - 'lib/gitlab/gitaly_client/repository_service.rb'
+ - 'lib/gitlab/github_import/importer/issue_importer.rb'
+ - 'lib/gitlab/github_import/importer/label_links_importer.rb'
+ - 'lib/gitlab/github_import/importer/note_importer.rb'
+ - 'lib/gitlab/graphql/deprecations_base.rb'
+ - 'lib/gitlab/i18n/metadata_entry.rb'
+ - 'lib/gitlab/i18n/po_linter.rb'
+ - 'lib/gitlab/mail_room.rb'
+ - 'lib/gitlab/metrics/samplers/base_sampler.rb'
+ - 'lib/gitlab/metrics/subscribers/load_balancing.rb'
+ - 'lib/gitlab/metrics/transaction.rb'
+ - 'lib/gitlab/patch/global_id.rb'
+ - 'lib/gitlab/patch/sprockets_base_file_digest_key.rb'
+ - 'lib/gitlab/performance_bar/redis_adapter_when_peek_enabled.rb'
+ - 'lib/gitlab/performance_bar/stats.rb'
+ - 'lib/gitlab/quick_actions/merge_request_actions.rb'
+ - 'lib/gitlab/slash_commands/global_slack_handler.rb'
+ - 'lib/gitlab/slash_commands/presenters/run.rb'
+ - 'lib/gitlab/string_regex_marker.rb'
+ - 'lib/gitlab/task_helpers.rb'
+ - 'lib/gitlab/usage/metric_definition.rb'
+ - 'lib/gitlab/usage_data/topology.rb'
+ - 'lib/gitlab/usage_data_counters/ci_template_unique_counter.rb'
+ - 'lib/gitlab/utils/merge_hash.rb'
+ - 'lib/gitlab/version_info.rb'
+ - 'lib/gitlab/webpack/dev_server_middleware.rb'
+ - 'lib/gitlab/wiki_pages/front_matter_parser.rb'
+ - 'lib/prometheus/pid_provider.rb'
+ - 'lib/tasks/gitlab/banzai.rake'
+ - 'qa/lib/slack/page/chat.rb'
+ - 'qa/qa/resource/registry_repository.rb'
+ - 'qa/qa/scenario/template.rb'
+ - 'qa/qa/vendor/jenkins/helpers.rb'
+ - 'rubocop/cop/gitlab/const_get_inherit_false.rb'
+ - 'rubocop/cop/migration/add_limit_to_text_columns.rb'
+ - 'rubocop/cop/migration/background_migration_missing_active_concern.rb'
+ - 'rubocop/cop/prefer_class_methods_over_module.rb'
+ - 'rubocop/cop/rspec/httparty_basic_auth.rb'
+ - 'scripts/lib/glfm/render_static_html.rb'
+ - 'scripts/lib/glfm/update_example_snapshots.rb'
+ - 'scripts/lint-docs-blueprints.rb'
+ - 'spec/factories/ci/processable.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_root_storage_statistics_fork_storage_sizes_spec.rb'
+ - 'spec/models/packages/go/module_version_spec.rb'
+ - 'spec/models/project_feature_spec.rb'
+ - 'spec/requests/api/go_proxy_spec.rb'
+ - 'spec/services/members/invitation_reminder_email_service_spec.rb'
+ - 'spec/support/helpers/graphql_helpers.rb'
+ - 'spec/support/helpers/next_found_instance_of.rb'
+ - 'spec/support/matchers/request_urgency_matcher.rb'
+ - 'spec/support/shared_contexts/glfm/api_markdown_snapshot_shared_context.rb'
+ - 'tooling/danger/database.rb'
diff --git a/.rubocop_todo/lint/empty_block.yml b/.rubocop_todo/lint/empty_block.yml
index 5751ca7641f..dbcef42eab4 100644
--- a/.rubocop_todo/lint/empty_block.yml
+++ b/.rubocop_todo/lint/empty_block.yml
@@ -4,7 +4,6 @@ Lint/EmptyBlock:
- 'app/controllers/groups/boards_controller.rb'
- 'app/controllers/projects/boards_controller.rb'
- 'app/controllers/projects/pipelines_controller.rb'
- - 'app/experiments/logged_out_marketing_header_experiment.rb'
- 'config/application.rb'
- 'ee/app/controllers/projects/learn_gitlab_controller.rb'
- 'ee/spec/factories/incident_management/escalation_rules.rb'
diff --git a/.rubocop_todo/lint/empty_class.yml b/.rubocop_todo/lint/empty_class.yml
deleted file mode 100644
index c8caff58c35..00000000000
--- a/.rubocop_todo/lint/empty_class.yml
+++ /dev/null
@@ -1,4 +0,0 @@
----
-Lint/EmptyClass:
- Exclude:
- - 'spec/lib/gitlab/multi_destination_logger_spec.rb'
diff --git a/.rubocop_todo/lint/missing_cop_enable_directive.yml b/.rubocop_todo/lint/missing_cop_enable_directive.yml
index 8cfecb87f2b..1522d935008 100644
--- a/.rubocop_todo/lint/missing_cop_enable_directive.yml
+++ b/.rubocop_todo/lint/missing_cop_enable_directive.yml
@@ -139,7 +139,6 @@ Lint/MissingCopEnableDirective:
- 'ee/lib/api/ldap_group_links.rb'
- 'ee/lib/ee/gitlab/background_migration/backfill_project_statistics_container_repository_size.rb'
- 'ee/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules.rb'
- - 'ee/lib/ee/gitlab/usage_data.rb'
- 'ee/lib/gitlab/spdx/license.rb'
- 'ee/spec/helpers/groups/security_features_helper_spec.rb'
- 'ee/spec/helpers/projects/security/discover_helper_spec.rb'
diff --git a/.rubocop_todo/lint/non_atomic_file_operation.yml b/.rubocop_todo/lint/non_atomic_file_operation.yml
index cd700870448..d9d415de923 100644
--- a/.rubocop_todo/lint/non_atomic_file_operation.yml
+++ b/.rubocop_todo/lint/non_atomic_file_operation.yml
@@ -41,5 +41,3 @@ Lint/NonAtomicFileOperation:
- 'spec/services/bulk_imports/repository_bundle_export_service_spec.rb'
- 'spec/services/bulk_imports/uploads_export_service_spec.rb'
- 'spec/support/database/query_recorder.rb'
- - 'spec/tooling/rspec_flaky/report_spec.rb'
- - 'tooling/rspec_flaky/report.rb'
diff --git a/.rubocop_todo/lint/redundant_cop_disable_directive.yml b/.rubocop_todo/lint/redundant_cop_disable_directive.yml
index 29f15deac2e..7a07242ab29 100644
--- a/.rubocop_todo/lint/redundant_cop_disable_directive.yml
+++ b/.rubocop_todo/lint/redundant_cop_disable_directive.yml
@@ -140,7 +140,6 @@ Lint/RedundantCopDisableDirective:
- 'ee/lib/ee/gitlab/background_migration/migrate_shared_vulnerability_scanners.rb'
- 'ee/lib/ee/gitlab/background_migration/migrate_vulnerabilities_feedback_to_vulnerabilities_state_transition.rb'
- 'ee/lib/ee/gitlab/background_migration/purge_stale_security_scans.rb'
- - 'ee/lib/ee/gitlab/usage_data.rb'
- 'ee/lib/gitlab/analytics/type_of_work/tasks_by_type.rb'
- 'ee/lib/gitlab/elastic/bool_expr.rb'
- 'ee/lib/gitlab/spdx/license.rb'
@@ -183,7 +182,6 @@ Lint/RedundantCopDisableDirective:
- 'lib/gitlab/background_migration/backfill_project_statistics_storage_size_without_uploads_size.rb'
- 'lib/gitlab/background_migration/batching_strategies/loose_index_scan_batching_strategy.rb'
- 'lib/gitlab/background_migration/fix_incoherent_packages_size_on_project_statistics.rb'
- - 'lib/gitlab/background_migration/migrate_personal_namespace_project_maintainer_to_owner.rb'
- 'lib/gitlab/background_migration/re_expire_o_auth_tokens.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'
@@ -264,8 +262,6 @@ Lint/RedundantCopDisableDirective:
- 'spec/lib/gitlab/background_migration/backfill_vulnerability_reads_cluster_agent_spec.rb'
- 'spec/lib/gitlab/background_migration/batching_strategies/backfill_project_statistics_with_container_registry_size_batching_strategy_spec.rb'
- 'spec/lib/gitlab/background_migration/batching_strategies/remove_backfilled_job_artifacts_expire_at_batching_strategy_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/ci/reports/security/scanner_spec.rb'
- 'spec/lib/gitlab/database/load_balancing/transaction_leaking_spec.rb'
- 'spec/lib/gitlab/database/migration_helpers/restrict_gitlab_schema_spec.rb'
@@ -284,7 +280,6 @@ Lint/RedundantCopDisableDirective:
- '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/migrations/20220725150127_update_jira_tracker_data_deployment_type_based_on_url_spec.rb'
- 'spec/migrations/add_namespaces_emails_enabled_column_data_spec.rb'
- 'spec/migrations/add_projects_emails_enabled_column_data_spec.rb'
- 'spec/models/ci/build_trace_chunk_spec.rb'
@@ -300,7 +295,6 @@ Lint/RedundantCopDisableDirective:
- 'spec/presenters/packages/pypi/simple_package_versions_presenter_spec.rb'
- 'spec/requests/api/alert_management_alerts_spec.rb'
- 'spec/requests/api/graphql/ci/config_spec.rb'
- - 'spec/rubocop/cop/ruby_interpolation_in_translation_spec.rb'
- 'spec/services/alert_management/metric_images/upload_service_spec.rb'
- 'spec/services/boards/lists/list_service_spec.rb'
- 'spec/services/projects/update_statistics_service_spec.rb'
@@ -322,4 +316,3 @@ Lint/RedundantCopDisableDirective:
- 'tooling/lib/tooling/helm3_client.rb'
- 'tooling/lib/tooling/kubernetes_client.rb'
- 'tooling/quality/test_level.rb'
- - 'tooling/rspec_flaky/listener.rb'
diff --git a/.rubocop_todo/lint/redundant_safe_navigation.yml b/.rubocop_todo/lint/redundant_safe_navigation.yml
new file mode 100644
index 00000000000..8c4b66313eb
--- /dev/null
+++ b/.rubocop_todo/lint/redundant_safe_navigation.yml
@@ -0,0 +1,15 @@
+---
+# Cop supports --autocorrect.
+Lint/RedundantSafeNavigation:
+ Details: grace period
+ Exclude:
+ - 'app/controllers/import/base_controller.rb'
+ - 'app/graphql/resolvers/users_resolver.rb'
+ - 'app/graphql/types/countable_connection_type.rb'
+ - 'app/helpers/search_helper.rb'
+ - 'app/models/deployment.rb'
+ - 'ee/app/graphql/ee/types/issue_connection_type.rb'
+ - 'ee/app/models/search/namespace_index_assignment.rb'
+ - 'lib/api/projects.rb'
+ - 'lib/sidebars/projects/menus/infrastructure_menu.rb'
+ - 'spec/lib/gitlab/redis/multi_store_spec.rb'
diff --git a/.rubocop_todo/lint/redundant_string_coercion.yml b/.rubocop_todo/lint/redundant_string_coercion.yml
new file mode 100644
index 00000000000..8d9bb93395b
--- /dev/null
+++ b/.rubocop_todo/lint/redundant_string_coercion.yml
@@ -0,0 +1,7 @@
+---
+# Cop supports --autocorrect.
+Lint/RedundantStringCoercion:
+ Details: grace period
+ Exclude:
+ - 'ee/bin/geo_log_cursor'
+ - 'ee/db/fixtures/development/31_devops_adoption.rb'
diff --git a/.rubocop_todo/lint/symbol_conversion.yml b/.rubocop_todo/lint/symbol_conversion.yml
index 147cd66f993..0fb6641d2a7 100644
--- a/.rubocop_todo/lint/symbol_conversion.yml
+++ b/.rubocop_todo/lint/symbol_conversion.yml
@@ -10,7 +10,6 @@ Lint/SymbolConversion:
- 'config/puma.rb'
- 'ee/app/components/billing/plan_component.rb'
- 'ee/app/controllers/projects/security/scanned_resources_controller.rb'
- - 'ee/app/models/product_analytics/jitsu_authentication.rb'
- 'ee/app/serializers/integrations/zentao_serializers/issue_entity.rb'
- 'ee/db/fixtures/development/35_merge_request_predictions.rb'
- 'ee/lib/api/analytics/product_analytics.rb'
@@ -34,7 +33,6 @@ Lint/SymbolConversion:
- 'ee/spec/lib/gitlab/ci/parsers/security/dast_spec.rb'
- 'ee/spec/lib/gitlab/search/aggregation_parser_spec.rb'
- 'ee/spec/lib/gitlab/search/aggregation_spec.rb'
- - 'ee/spec/lib/gitlab/subscription_portal/clients/graphql_spec.rb'
- 'ee/spec/models/ee/integrations/jira_spec.rb'
- 'ee/spec/models/integrations/github_spec.rb'
- 'ee/spec/requests/api/analytics/product_analytics_spec.rb'
@@ -117,7 +115,6 @@ Lint/SymbolConversion:
- 'spec/lib/gitlab/search/abuse_validators/no_abusive_coercion_from_string_validator_spec.rb'
- 'spec/lib/gitlab/slug/path_spec.rb'
- 'spec/lib/gitlab/tracking_spec.rb'
- - 'spec/lib/gitlab/utils_spec.rb'
- 'spec/lib/google_api/cloud_platform/client_spec.rb'
- 'spec/lib/service_ping/devops_report_spec.rb'
- 'spec/models/integrations/prometheus_spec.rb'
diff --git a/.rubocop_todo/lint/unused_block_argument.yml b/.rubocop_todo/lint/unused_block_argument.yml
index 0b4120a152c..05e30a7f9ad 100644
--- a/.rubocop_todo/lint/unused_block_argument.yml
+++ b/.rubocop_todo/lint/unused_block_argument.yml
@@ -115,7 +115,6 @@ Lint/UnusedBlockArgument:
- 'ee/lib/gitlab/insights/reducers/count_per_label_reducer.rb'
- 'ee/lib/gitlab/proxy.rb'
- 'ee/lib/tasks/contracts/merge_requests.rake'
- - 'ee/lib/tasks/gitlab/elastic.rake'
- 'ee/lib/tasks/gitlab/indexer.rake'
- 'ee/lib/tasks/gitlab/seed/insights.rake'
- 'ee/spec/elastic/migrate/20220118150500_delete_orphaned_commits_spec.rb'
@@ -427,6 +426,5 @@ Lint/UnusedBlockArgument:
- 'spec/support/shared_examples/uploaders/object_storage_shared_examples.rb'
- 'spec/support/shared_examples/workers/concerns/reenqueuer_shared_examples.rb'
- 'spec/tooling/lib/tooling/find_codeowners_spec.rb'
- - 'spec/tooling/rspec_flaky/config_spec.rb'
- 'spec/workers/projects/git_garbage_collect_worker_spec.rb'
- 'tooling/lib/tooling/find_codeowners.rb'
diff --git a/.rubocop_todo/lint/unused_method_argument.yml b/.rubocop_todo/lint/unused_method_argument.yml
index bbd12e608a9..086882b0f1b 100644
--- a/.rubocop_todo/lint/unused_method_argument.yml
+++ b/.rubocop_todo/lint/unused_method_argument.yml
@@ -316,7 +316,6 @@ Lint/UnusedMethodArgument:
- 'ee/lib/gitlab/package_metadata/connector/gcp.rb'
- 'ee/lib/gitlab/package_metadata/connector/offline.rb'
- 'ee/lib/gitlab/zoekt/search_results.rb'
- - 'ee/lib/tasks/gitlab/elastic.rake'
- 'ee/spec/features/boards/swimlanes/epics_swimlanes_filtering_spec.rb'
- 'ee/spec/features/groups/group_roadmap_spec.rb'
- 'ee/spec/graphql/ee/resolvers/namespace_projects_resolver_spec.rb'
@@ -456,7 +455,6 @@ Lint/UnusedMethodArgument:
- 'lib/gitlab/diff/file_collection/merge_request_diff_base.rb'
- 'lib/gitlab/diff/line.rb'
- 'lib/gitlab/encoding_helper.rb'
- - 'lib/gitlab/error_tracking/error_repository/active_record_strategy.rb'
- 'lib/gitlab/fogbugz_import/importer.rb'
- 'lib/gitlab/git/commit_stats.rb'
- 'lib/gitlab/git/conflict/parser.rb'
@@ -480,7 +478,6 @@ Lint/UnusedMethodArgument:
- 'lib/gitlab/graphql/calls_gitaly/field_extension.rb'
- 'lib/gitlab/graphql/connection_redaction.rb'
- 'lib/gitlab/graphql/extensions/externally_paginated_array_extension.rb'
- - 'lib/gitlab/graphql/generic_tracing.rb'
- 'lib/gitlab/graphql/lazy.rb'
- 'lib/gitlab/graphql/project/dast_profile_connection_extension.rb'
- 'lib/gitlab/graphql/query_analyzers/ast/logger_analyzer.rb'
diff --git a/.rubocop_todo/metrics/cyclomatic_complexity.yml b/.rubocop_todo/metrics/cyclomatic_complexity.yml
index 414f4f6243c..e345c2be451 100644
--- a/.rubocop_todo/metrics/cyclomatic_complexity.yml
+++ b/.rubocop_todo/metrics/cyclomatic_complexity.yml
@@ -8,13 +8,12 @@ Metrics/CyclomaticComplexity:
- 'app/models/concerns/issuable.rb'
- 'app/services/projects/create_service.rb'
- 'ee/app/controllers/ee/groups_controller.rb'
- - 'ee/lib/elastic/latest/git_class_proxy.rb'
- 'ee/lib/gitlab/ci/parsers/security/formatters/dependency_list.rb'
+ - 'ee/spec/support/shared_contexts/remote_development/remote_development_shared_contexts.rb'
- 'lib/banzai/filter/references/abstract_reference_filter.rb'
- 'lib/gitlab/conflict/file.rb'
- 'lib/gitlab/database/query_analyzers/prevent_cross_database_modification.rb'
- 'lib/gitlab/utils/merge_hash.rb'
- 'lib/kramdown/parser/atlassian_document_format.rb'
- - 'qa/qa/runtime/browser.rb'
- 'qa/qa/support/repeater.rb'
- 'sidekiq_cluster/cli.rb'
diff --git a/.rubocop_todo/metrics/perceived_complexity.yml b/.rubocop_todo/metrics/perceived_complexity.yml
index 51ec88c1582..2ad1c1d1f33 100644
--- a/.rubocop_todo/metrics/perceived_complexity.yml
+++ b/.rubocop_todo/metrics/perceived_complexity.yml
@@ -7,13 +7,12 @@ Metrics/PerceivedComplexity:
- 'app/helpers/nav/top_nav_helper.rb'
- 'app/services/projects/create_service.rb'
- 'ee/app/controllers/ee/groups_controller.rb'
- - 'ee/lib/elastic/latest/git_class_proxy.rb'
+ - 'ee/spec/support/shared_contexts/remote_development/remote_development_shared_contexts.rb'
- 'lib/banzai/filter/references/abstract_reference_filter.rb'
- 'lib/banzai/renderer.rb'
- 'lib/gitlab/conflict/file.rb'
- 'lib/gitlab/database/query_analyzers/prevent_cross_database_modification.rb'
- 'lib/gitlab/utils/merge_hash.rb'
- - 'qa/qa/runtime/browser.rb'
- 'qa/qa/support/repeater.rb'
- 'rubocop/cop/gitlab/mark_used_feature_flags.rb'
- 'sidekiq_cluster/cli.rb'
diff --git a/.rubocop_todo/migration/avoid_finalize_background_migration.yml b/.rubocop_todo/migration/avoid_finalize_background_migration.yml
new file mode 100644
index 00000000000..bde85ce3e48
--- /dev/null
+++ b/.rubocop_todo/migration/avoid_finalize_background_migration.yml
@@ -0,0 +1,7 @@
+---
+Migration/AvoidFinalizeBackgroundMigration:
+ Details: grace period
+ Exclude:
+ - 'db/post_migrate/20220502015011_clean_up_fix_merge_request_diff_commit_users.rb'
+ - 'db/post_migrate/20220525131557_cleanup_backfill_integrations_enable_ssl_verification.rb'
+ - 'db/post_migrate/20220713133515_cleanup_backfill_draft_statuses_on_merge_requests.rb'
diff --git a/.rubocop_todo/naming/heredoc_delimiter_naming.yml b/.rubocop_todo/naming/heredoc_delimiter_naming.yml
index 02cc7d2a85c..68129f910d1 100644
--- a/.rubocop_todo/naming/heredoc_delimiter_naming.yml
+++ b/.rubocop_todo/naming/heredoc_delimiter_naming.yml
@@ -25,7 +25,6 @@ Naming/HeredocDelimiterNaming:
- '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/metadata.rb'
- 'lib/backup/helper.rb'
- 'lib/feature/shared.rb'
@@ -91,7 +90,9 @@ Naming/HeredocDelimiterNaming:
- '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/lib/json_web_token/rsa_token_spec.rb'
- 'spec/models/ci/bridge_spec.rb'
+ - 'spec/models/commit_spec.rb'
- 'spec/models/concerns/ci/maskable_spec.rb'
- 'spec/models/integrations/asana_spec.rb'
- 'spec/models/ssh_host_key_spec.rb'
@@ -109,10 +110,11 @@ Naming/HeredocDelimiterNaming:
- '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/repo_helpers.rb'
+ - 'spec/support/helpers/seed_repo.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/tasks/gitlab/db/decomposition/rollback/bump_ci_sequences_rake_spec.rb'
- 'spec/workers/post_receive_spec.rb'
diff --git a/.rubocop_todo/naming/inclusive_language.yml b/.rubocop_todo/naming/inclusive_language.yml
index 8950e2e77f4..271286d4752 100644
--- a/.rubocop_todo/naming/inclusive_language.yml
+++ b/.rubocop_todo/naming/inclusive_language.yml
@@ -1,26 +1,19 @@
---
Naming/InclusiveLanguage:
Exclude:
- - 'app/controllers/admin/application_settings/appearances_controller.rb'
- - 'app/controllers/concerns/requires_whitelisted_monitoring_client.rb'
- - 'app/controllers/health_check_controller.rb'
- - 'app/controllers/health_controller.rb'
- - 'app/controllers/metrics_controller.rb'
+ - 'app/controllers/concerns/requires_allowlisted_monitoring_client.rb'
- 'app/helpers/application_settings_helper.rb'
- - 'app/helpers/blob_helper.rb'
- 'app/helpers/markup_helper.rb'
- 'app/models/application_setting.rb'
- 'app/models/application_setting_implementation.rb'
- 'app/models/concerns/cache_markdown_field.rb'
- 'app/services/application_settings/update_service.rb'
- - 'app/services/projects/download_service.rb'
- 'app/uploaders/avatar_uploader.rb'
- 'app/uploaders/content_type_whitelist.rb'
- 'app/uploaders/design_management/design_v432x230_uploader.rb'
- 'app/uploaders/favicon_uploader.rb'
- 'app/uploaders/gitlab_uploader.rb'
- 'app/uploaders/import_export_uploader.rb'
- - 'app/validators/cron_validator.rb'
- 'app/validators/qualified_domain_array_validator.rb'
- 'config/initializers/1_settings.rb'
- 'config/initializers/doorkeeper.rb'
@@ -28,15 +21,12 @@ Naming/InclusiveLanguage:
- 'ee/app/controllers/projects/push_rules_controller.rb'
- 'ee/lib/arkose/verify_response.rb'
- 'ee/lib/system_check/geo/http_connection_check.rb'
- - 'ee/spec/lib/gitlab/checks/diff_check_spec.rb'
- - 'ee/spec/models/dora/lead_time_for_changes_metric_spec.rb'
- 'lib/api/entities/application_setting.rb'
- 'lib/api/settings.rb'
- 'lib/banzai/filter/asset_proxy_filter.rb'
- 'lib/gitlab/asset_proxy.rb'
- 'lib/gitlab/auth/ip_rate_limiter.rb'
- 'lib/gitlab/ci/config/external/file/base.rb'
- - 'lib/gitlab/git/hook_env.rb'
- 'lib/gitlab/github_import/markdown/attachment.rb'
- 'lib/gitlab/markdown_cache/active_record/extension.rb'
- 'lib/gitlab/markdown_cache/field_data.rb'
@@ -45,48 +35,21 @@ Naming/InclusiveLanguage:
- 'lib/gitlab/sanitizers/svg.rb'
- 'lib/gitlab/sanitizers/svg/whitelist.rb'
- 'lib/system_check/app/git_user_default_ssh_config_check.rb'
- - 'rubocop/cop/active_record_association_reload.rb'
- - 'rubocop/cop/avoid_becomes.rb'
- - 'rubocop/cop/avoid_keyword_arguments_in_sidekiq_workers.rb'
- - 'rubocop/cop/avoid_return_from_blocks.rb'
- - 'rubocop/cop/default_scope.rb'
- - 'rubocop/cop/destroy_all.rb'
- - 'rubocop/cop/graphql/id_type.rb'
- - 'rubocop/cop/group_public_or_visible_to_user.rb'
- - 'rubocop/cop/inject_enterprise_edition_module.rb'
- - 'rubocop/cop/migration/add_columns_to_wide_tables.rb'
- - 'spec/controllers/concerns/issuable_collections_spec.rb'
- 'spec/controllers/health_check_controller_spec.rb'
- 'spec/controllers/metrics_controller_spec.rb'
- - 'spec/features/projects/import_export/export_file_spec.rb'
- 'spec/helpers/markup_helper_spec.rb'
- 'spec/lib/banzai/filter/asset_proxy_filter_spec.rb'
- 'spec/lib/gitlab/asset_proxy_spec.rb'
- 'spec/lib/gitlab/auth/ip_rate_limiter_spec.rb'
- 'spec/lib/gitlab/git/hook_env_spec.rb'
- 'spec/lib/gitlab/github_import/markdown/attachment_spec.rb'
- - 'spec/lib/gitlab/import_export/attribute_configuration_spec.rb'
- - 'spec/lib/gitlab/import_export/references_configuration_spec.rb'
- - 'spec/lib/gitlab/markdown_cache/active_record/extension_spec.rb'
- 'spec/lib/gitlab/middleware/basic_health_check_spec.rb'
- - 'spec/lib/gitlab/middleware/go_spec.rb'
- 'spec/lib/gitlab/sanitizers/exif_spec.rb'
- 'spec/lib/system_check/app/git_user_default_ssh_config_check_spec.rb'
- 'spec/models/application_setting_spec.rb'
- 'spec/requests/api/settings_spec.rb'
- 'spec/requests/health_controller_spec.rb'
- - 'spec/rubocop/cop/avoid_return_from_blocks_spec.rb'
- - 'spec/rubocop/cop/graphql/id_type_spec.rb'
- 'spec/services/application_settings/update_service_spec.rb'
- - 'spec/services/design_management/generate_image_versions_service_spec.rb'
- - 'spec/services/error_tracking/list_issues_service_spec.rb'
- - 'spec/services/projects/download_service_spec.rb'
- - 'spec/support/import_export/export_file_helper.rb'
- 'spec/support/shared_contexts/upload_type_check_shared_context.rb'
- - 'spec/support/shared_examples/lib/banzai/filters/sanitization_filter_shared_examples.rb'
- 'spec/support/shared_examples/models/application_setting_shared_examples.rb'
- - 'spec/uploaders/avatar_uploader_spec.rb'
- 'spec/uploaders/content_type_whitelist_spec.rb'
- - 'spec/uploaders/design_management/design_v432x230_uploader_spec.rb'
- - 'spec/uploaders/favicon_uploader_spec.rb'
- - 'spec/validators/cron_validator_spec.rb'
diff --git a/.rubocop_todo/performance/active_record_subtransaction_methods.yml b/.rubocop_todo/performance/active_record_subtransaction_methods.yml
index 0c0a527a065..a61bac45eff 100644
--- a/.rubocop_todo/performance/active_record_subtransaction_methods.yml
+++ b/.rubocop_todo/performance/active_record_subtransaction_methods.yml
@@ -9,7 +9,7 @@ Performance/ActiveRecordSubtransactionMethods:
- 'app/models/container_repository.rb'
- 'app/models/design_management/design_collection.rb'
- 'app/models/error_tracking/error.rb'
- - 'app/models/external_pull_request.rb'
+ - 'app/models/ci/external_pull_request.rb'
- 'app/models/plan.rb'
- 'app/models/project.rb'
- 'app/models/shard.rb'
diff --git a/.rubocop_todo/performance/regexp_match.yml b/.rubocop_todo/performance/regexp_match.yml
new file mode 100644
index 00000000000..2c80a74c538
--- /dev/null
+++ b/.rubocop_todo/performance/regexp_match.yml
@@ -0,0 +1,60 @@
+---
+# Cop supports --autocorrect.
+Performance/RegexpMatch:
+ Details: grace period
+ Exclude:
+ - 'config/initializers/wikicloth_redos_patch.rb'
+ - 'ee/app/controllers/concerns/audit_events/enforces_valid_date_params.rb'
+ - 'ee/lib/ee/banzai/filter/references/vulnerability_reference_filter.rb'
+ - 'ee/lib/elastic/latest/git_class_proxy.rb'
+ - 'ee/lib/gitlab/llm/chain/utils/text_processing.rb'
+ - 'ee/lib/gitlab/llm/open_ai/response_modifiers/tanuki_bot.rb'
+ - 'ee/lib/gitlab/middleware/ip_restrictor.rb'
+ - 'ee/spec/spec_helper.rb'
+ - 'lib/api/helpers.rb'
+ - 'lib/api/helpers/common_helpers.rb'
+ - 'lib/api/validations/validators/bulk_imports.rb'
+ - 'lib/banzai/color_parser.rb'
+ - 'lib/banzai/filter/ascii_doc_sanitization_filter.rb'
+ - 'lib/banzai/filter/references/abstract_reference_filter.rb'
+ - 'lib/banzai/filter/references/reference_filter.rb'
+ - 'lib/bulk_imports/path_normalization.rb'
+ - 'lib/feature/definition.rb'
+ - 'lib/gitlab/authorized_keys.rb'
+ - 'lib/gitlab/checks/branch_check.rb'
+ - 'lib/gitlab/ci/build/artifacts/metadata.rb'
+ - 'lib/gitlab/ci/build/artifacts/metadata/entry.rb'
+ - 'lib/gitlab/ci/project_config/remote.rb'
+ - 'lib/gitlab/database/postgres_constraint.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/reindex_concurrently.rb'
+ - 'lib/gitlab/dependency_linker/base_linker.rb'
+ - 'lib/gitlab/dependency_linker/composer_json_linker.rb'
+ - 'lib/gitlab/diff/parser.rb'
+ - 'lib/gitlab/email/reply_parser.rb'
+ - 'lib/gitlab/git/gitmodules_parser.rb'
+ - 'lib/gitlab/metrics/samplers/threads_sampler.rb'
+ - 'lib/gitlab/middleware/sidekiq_web_static.rb'
+ - 'lib/gitlab/middleware/static.rb'
+ - 'lib/gitlab/url_blocker.rb'
+ - 'lib/tasks/gitlab/update_templates.rake'
+ - 'lib/uploaded_file.rb'
+ - 'qa/qa/flow/integrations/slack.rb'
+ - 'qa/qa/git/location.rb'
+ - 'qa/qa/resource/api_fabricator.rb'
+ - 'qa/qa/runtime/search.rb'
+ - 'qa/qa/service/cluster_provider/k3d.rb'
+ - 'qa/qa/specs/spec_helper.rb'
+ - 'qa/qa/tools/ci/ff_changes.rb'
+ - 'scripts/changed-feature-flags'
+ - 'scripts/failed_tests.rb'
+ - 'scripts/lib/glfm/parse_examples.rb'
+ - 'scripts/lib/glfm/update_specification.rb'
+ - 'scripts/lint-docs-blueprints.rb'
+ - 'scripts/perf/query_limiting_report.rb'
+ - 'scripts/qa/testcases-check'
+ - 'scripts/trigger-build.rb'
+ - 'sidekiq_cluster/cli.rb'
diff --git a/.rubocop_todo/rails/file_path.yml b/.rubocop_todo/rails/file_path.yml
index 49182a51ea7..eef5e580e43 100644
--- a/.rubocop_todo/rails/file_path.yml
+++ b/.rubocop_todo/rails/file_path.yml
@@ -1,4 +1,5 @@
---
+# Cop supports --autocorrect.
Rails/FilePath:
Exclude:
- 'app/controllers/help_controller.rb'
@@ -12,7 +13,6 @@ Rails/FilePath:
- 'config/initializers/1_settings.rb'
- 'config/initializers/7_prometheus_metrics.rb'
- 'config/initializers/lograge.rb'
- - 'config/initializers_before_autoloader/001_fast_gettext.rb'
- 'ee/app/helpers/ee/application_helper.rb'
- 'ee/app/services/security/security_orchestration_policies/project_create_service.rb'
- 'ee/lib/ee/feature/definition.rb'
@@ -57,7 +57,6 @@ Rails/FilePath:
- '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/db.rake'
- 'lib/tasks/gitlab/metrics_exporter.rake'
- 'lib/tasks/gitlab/usage_data.rake'
- 'lib/tasks/tanuki_emoji.rake'
@@ -66,10 +65,8 @@ Rails/FilePath:
- 'spec/config/object_store_settings_spec.rb'
- 'spec/db/development/add_security_training_providers_spec.rb'
- 'spec/db/development/create_base_work_item_types_spec.rb'
- - 'spec/db/development/import_common_metrics_spec.rb'
- 'spec/db/production/add_security_training_providers_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'
@@ -109,6 +106,7 @@ Rails/FilePath:
- '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/multi_destination_logger_spec.rb'
- 'spec/lib/gitlab/project_transfer_spec.rb'
- 'spec/lib/gitlab/sanitizers/svg_spec.rb'
- 'spec/metrics_server/metrics_server_spec.rb'
diff --git a/.rubocop_todo/rails/output_safety.yml b/.rubocop_todo/rails/output_safety.yml
new file mode 100644
index 00000000000..53f9381099f
--- /dev/null
+++ b/.rubocop_todo/rails/output_safety.yml
@@ -0,0 +1,157 @@
+---
+Rails/OutputSafety:
+ Details: grace period
+ Exclude:
+ - 'app/controllers/concerns/confirm_email_warning.rb'
+ - 'app/controllers/concerns/web_hooks/hook_actions.rb'
+ - 'app/controllers/groups_controller.rb'
+ - 'app/controllers/profiles/two_factor_auths_controller.rb'
+ - 'app/controllers/projects/mirrors_controller.rb'
+ - 'app/controllers/projects/performance_monitoring/dashboards_controller.rb'
+ - 'app/controllers/projects/pipeline_schedules_controller.rb'
+ - 'app/controllers/projects/protected_refs_controller.rb'
+ - 'app/controllers/search_controller.rb'
+ - 'app/graphql/types/ci/job_trace_type.rb'
+ - 'app/graphql/types/project_type.rb'
+ - 'app/helpers/admin/application_settings/settings_helper.rb'
+ - 'app/helpers/appearances_helper.rb'
+ - 'app/helpers/auth_helper.rb'
+ - 'app/helpers/broadcast_messages_helper.rb'
+ - 'app/helpers/commits_helper.rb'
+ - 'app/helpers/diff_helper.rb'
+ - 'app/helpers/dropdowns_helper.rb'
+ - 'app/helpers/emails_helper.rb'
+ - 'app/helpers/emoji_helper.rb'
+ - 'app/helpers/environment_helper.rb'
+ - 'app/helpers/external_link_helper.rb'
+ - 'app/helpers/form_helper.rb'
+ - 'app/helpers/groups/group_members_helper.rb'
+ - 'app/helpers/groups_helper.rb'
+ - 'app/helpers/import_helper.rb'
+ - 'app/helpers/issuables_helper.rb'
+ - 'app/helpers/issues_helper.rb'
+ - 'app/helpers/labels_helper.rb'
+ - 'app/helpers/markup_helper.rb'
+ - 'app/helpers/members_helper.rb'
+ - 'app/helpers/merge_requests_helper.rb'
+ - 'app/helpers/notify_helper.rb'
+ - 'app/helpers/page_layout_helper.rb'
+ - 'app/helpers/profiles_helper.rb'
+ - 'app/helpers/projects_helper.rb'
+ - 'app/helpers/reminder_emails_helper.rb'
+ - 'app/helpers/safe_format_helper.rb'
+ - 'app/helpers/search_helper.rb'
+ - 'app/helpers/sidebars_helper.rb'
+ - 'app/helpers/sourcegraph_helper.rb'
+ - 'app/helpers/tags_helper.rb'
+ - 'app/helpers/timeboxes_helper.rb'
+ - 'app/helpers/todos_helper.rb'
+ - 'app/helpers/tree_helper.rb'
+ - 'app/helpers/version_check_helper.rb'
+ - 'app/helpers/visibility_level_helper.rb'
+ - 'app/helpers/whats_new_helper.rb'
+ - 'app/mailers/notify.rb'
+ - 'app/models/concerns/restricted_signup.rb'
+ - 'app/models/integrations/apple_app_store.rb'
+ - 'app/models/integrations/asana.rb'
+ - 'app/models/integrations/bamboo.rb'
+ - 'app/models/integrations/bugzilla.rb'
+ - 'app/models/integrations/campfire.rb'
+ - 'app/models/integrations/clickup.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/ewm.rb'
+ - 'app/models/integrations/external_wiki.rb'
+ - 'app/models/integrations/google_play.rb'
+ - 'app/models/integrations/hangouts_chat.rb'
+ - 'app/models/integrations/irker.rb'
+ - 'app/models/integrations/jenkins.rb'
+ - 'app/models/integrations/mattermost.rb'
+ - 'app/models/integrations/pivotaltracker.rb'
+ - 'app/models/integrations/pumble.rb'
+ - 'app/models/integrations/redmine.rb'
+ - 'app/models/integrations/squash_tm.rb'
+ - 'app/models/integrations/telegram.rb'
+ - 'app/models/integrations/unify_circuit.rb'
+ - 'app/models/integrations/webex_teams.rb'
+ - 'app/models/integrations/youtrack.rb'
+ - 'app/presenters/ci/pipeline_presenter.rb'
+ - 'app/presenters/key_presenter.rb'
+ - 'app/presenters/project_presenter.rb'
+ - 'app/serializers/analytics/cycle_analytics/stage_entity.rb'
+ - 'app/serializers/build_details_entity.rb'
+ - 'app/serializers/entity_date_helper.rb'
+ - 'app/services/jira/requests/base.rb'
+ - 'app/services/projects/update_service.rb'
+ - 'app/services/security/ci_configuration/base_create_service.rb'
+ - 'app/services/system_notes/commit_service.rb'
+ - 'ee/app/components/namespaces/combined_storage_users/base_alert_component.rb'
+ - 'ee/app/components/namespaces/free_user_cap/base_alert_component.rb'
+ - 'ee/app/components/namespaces/free_user_cap/enforcement_alert_component.rb'
+ - 'ee/app/components/namespaces/free_user_cap/enforcement_at_limit_alert_component.rb'
+ - 'ee/app/components/namespaces/free_user_cap/non_owner_enforcement_alert_component.rb'
+ - 'ee/app/components/namespaces/free_user_cap/non_owner_notification_alert_component.rb'
+ - 'ee/app/components/namespaces/free_user_cap/notification_alert_component.rb'
+ - 'ee/app/components/namespaces/free_user_cap/usage_quota_alert_component.rb'
+ - 'ee/app/components/namespaces/free_user_cap/usage_quota_trial_alert_component.rb'
+ - 'ee/app/components/namespaces/storage/limit_alert_component.rb'
+ - 'ee/app/components/namespaces/storage/pre_enforcement_alert_component.rb'
+ - 'ee/app/components/namespaces/storage/repository_limit_alert_component.rb'
+ - 'ee/app/components/namespaces/storage/user_pre_enforcement_alert_component.rb'
+ - 'ee/app/controllers/admin/elasticsearch_controller.rb'
+ - 'ee/app/controllers/admin/geo/application_controller.rb'
+ - 'ee/app/controllers/admin/licenses_controller.rb'
+ - 'ee/app/controllers/ee/projects/issues_controller.rb'
+ - 'ee/app/controllers/ee/projects/mirrors_controller.rb'
+ - 'ee/app/controllers/ee/repositories/lfs_api_controller.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/import_helper.rb'
+ - 'ee/app/helpers/ee/integrations_helper.rb'
+ - 'ee/app/helpers/ee/labels_helper.rb'
+ - 'ee/app/helpers/ee/members_helper.rb'
+ - 'ee/app/helpers/ee/mirror_helper.rb'
+ - 'ee/app/helpers/ee/search_helper.rb'
+ - 'ee/app/helpers/ee/users_helper.rb'
+ - 'ee/app/helpers/push_rules_helper.rb'
+ - 'ee/app/models/integrations/github.rb'
+ - 'ee/lib/ee/gitlab/namespace_storage_size_error_message.rb'
+ - 'ee/lib/gitlab/email/message/account_validation.rb'
+ - 'ee/lib/gitlab/expiring_subscription_message.rb'
+ - 'ee/lib/gitlab/licenses/submit_license_usage_data_banner.rb'
+ - 'ee/lib/gitlab/manual_quarterly_co_term_banner.rb'
+ - 'ee/spec/controllers/admin/licenses_controller_spec.rb'
+ - 'lib/banzai/filter/autolink_filter.rb'
+ - 'lib/banzai/filter/references/milestone_reference_filter.rb'
+ - 'lib/banzai/filter/spaced_link_filter.rb'
+ - 'lib/banzai/object_renderer.rb'
+ - 'lib/banzai/renderer.rb'
+ - 'lib/gitlab/asciidoc.rb'
+ - 'lib/gitlab/blame.rb'
+ - 'lib/gitlab/ci/trace/stream.rb'
+ - 'lib/gitlab/dependency_linker/base_linker.rb'
+ - 'lib/gitlab/dependency_linker/go_mod_linker.rb'
+ - 'lib/gitlab/dependency_linker/go_sum_linker.rb'
+ - 'lib/gitlab/diff/char_diff.rb'
+ - 'lib/gitlab/diff/highlight.rb'
+ - 'lib/gitlab/diff/inline_diff_marker.rb'
+ - 'lib/gitlab/diff/line.rb'
+ - 'lib/gitlab/diff/rendered/notebook/diff_file_helper.rb'
+ - 'lib/gitlab/email/message/in_product_marketing/helper.rb'
+ - 'lib/gitlab/email/message/in_product_marketing/trial.rb'
+ - 'lib/gitlab/email/message/in_product_marketing/verify.rb'
+ - 'lib/gitlab/highlight.rb'
+ - 'lib/gitlab/observability.rb'
+ - 'lib/gitlab/other_markup.rb'
+ - 'lib/gitlab/string_range_marker.rb'
+ - 'spec/helpers/application_helper_spec.rb'
+ - 'spec/helpers/notify_helper_spec.rb'
+ - 'spec/helpers/profiles_helper_spec.rb'
+ - 'spec/helpers/safe_format_helper_spec.rb'
+ - 'spec/helpers/sidebars_helper_spec.rb'
+ - 'spec/lib/banzai/filter/output_safety_spec.rb'
+ - 'spec/lib/gitlab/string_range_marker_spec.rb'
+ - 'spec/lib/gitlab/string_regex_marker_spec.rb'
diff --git a/.rubocop_todo/rspec/any_instance_of.yml b/.rubocop_todo/rspec/any_instance_of.yml
index e8cc0e77ca9..18c225fb9ec 100644
--- a/.rubocop_todo/rspec/any_instance_of.yml
+++ b/.rubocop_todo/rspec/any_instance_of.yml
@@ -112,7 +112,6 @@ RSpec/AnyInstanceOf:
- 'spec/features/projects/container_registry_spec.rb'
- 'spec/features/projects/files/user_browses_lfs_files_spec.rb'
- 'spec/features/projects/jobs_spec.rb'
- - 'spec/features/projects/settings/service_desk_setting_spec.rb'
- 'spec/features/projects/show/user_sees_setup_shortcut_buttons_spec.rb'
- 'spec/features/snippets/embedded_snippet_spec.rb'
- 'spec/features/usage_stats_consent_spec.rb'
diff --git a/.rubocop_todo/rspec/before_all_role_assignment.yml b/.rubocop_todo/rspec/before_all_role_assignment.yml
new file mode 100644
index 00000000000..4b58f6fc52f
--- /dev/null
+++ b/.rubocop_todo/rspec/before_all_role_assignment.yml
@@ -0,0 +1,1584 @@
+---
+RSpec/BeforeAllRoleAssignment:
+ Details: grace period
+ Exclude:
+ - 'ee/spec/components/namespaces/free_user_cap/non_owner_notification_alert_component_spec.rb'
+ - 'ee/spec/components/namespaces/free_user_cap/notification_alert_component_spec.rb'
+ - 'ee/spec/components/namespaces/storage/pre_enforcement_alert_component_spec.rb'
+ - 'ee/spec/components/namespaces/storage/subgroup_pre_enforcement_alert_component_spec.rb'
+ - 'ee/spec/controllers/autocomplete_controller_spec.rb'
+ - 'ee/spec/controllers/dashboard_controller_spec.rb'
+ - 'ee/spec/controllers/ee/dashboard/projects_controller_spec.rb'
+ - 'ee/spec/controllers/ee/groups/settings/ci_cd_controller_spec.rb'
+ - 'ee/spec/controllers/ee/groups/usage_quotas_controller_spec.rb'
+ - 'ee/spec/controllers/ee/groups_controller_spec.rb'
+ - 'ee/spec/controllers/ee/projects/autocomplete_sources_controller_spec.rb'
+ - 'ee/spec/controllers/ee/projects/jobs_controller_spec.rb'
+ - 'ee/spec/controllers/groups/analytics/coverage_reports_controller_spec.rb'
+ - 'ee/spec/controllers/groups/analytics/productivity_analytics_controller_spec.rb'
+ - 'ee/spec/controllers/groups/analytics/repository_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/clusters_controller_spec.rb'
+ - 'ee/spec/controllers/groups/contribution_analytics_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/insights_controller_spec.rb'
+ - 'ee/spec/controllers/groups/issues_analytics_controller_spec.rb'
+ - 'ee/spec/controllers/groups/merge_requests_controller_spec.rb'
+ - 'ee/spec/controllers/groups/push_rules_controller_spec.rb'
+ - 'ee/spec/controllers/groups/runners_controller_spec.rb'
+ - 'ee/spec/controllers/groups/seat_usage_controller_spec.rb'
+ - 'ee/spec/controllers/groups/security/policies_controller_spec.rb'
+ - 'ee/spec/controllers/groups/todos_controller_spec.rb'
+ - 'ee/spec/controllers/projects/analytics/cycle_analytics/summary_controller_spec.rb'
+ - 'ee/spec/controllers/projects/analytics/issues_analytics_controller_spec.rb'
+ - 'ee/spec/controllers/projects/analytics/merge_request_analytics_controller_spec.rb'
+ - 'ee/spec/controllers/projects/audit_events_controller_spec.rb'
+ - 'ee/spec/controllers/projects/environments_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/insights_controller_spec.rb'
+ - 'ee/spec/controllers/projects/issue_links_controller_spec.rb'
+ - 'ee/spec/controllers/projects/iterations_controller_spec.rb'
+ - 'ee/spec/controllers/projects/learn_gitlab_controller_spec.rb'
+ - 'ee/spec/controllers/projects/licenses_controller_spec.rb'
+ - 'ee/spec/controllers/projects/merge_requests_controller_spec.rb'
+ - 'ee/spec/controllers/projects/pipelines_controller_spec.rb'
+ - 'ee/spec/controllers/projects/repositories_controller_spec.rb'
+ - 'ee/spec/controllers/projects/requirements_management/requirements_controller_spec.rb'
+ - 'ee/spec/controllers/projects/security/configuration_controller_spec.rb'
+ - 'ee/spec/controllers/projects/security/dashboard_controller_spec.rb'
+ - 'ee/spec/controllers/projects/security/scanned_resources_controller_spec.rb'
+ - 'ee/spec/controllers/projects/security/vulnerabilities/notes_controller_spec.rb'
+ - 'ee/spec/controllers/projects/security/vulnerabilities_controller_spec.rb'
+ - 'ee/spec/controllers/projects/security/vulnerability_report_controller_spec.rb'
+ - 'ee/spec/controllers/projects/settings/ci_cd_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/groups_controller_spec.rb'
+ - 'ee/spec/controllers/security/projects_controller_spec.rb'
+ - 'ee/spec/controllers/subscriptions_controller_spec.rb'
+ - 'ee/spec/features/admin/admin_sends_notification_spec.rb'
+ - 'ee/spec/features/analytics/code_analytics_spec.rb'
+ - 'ee/spec/features/analytics/group_analytics_spec.rb'
+ - 'ee/spec/features/boards/board_filters_spec.rb'
+ - 'ee/spec/features/boards/boards_licensed_features_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_sidebar_spec.rb'
+ - 'ee/spec/features/burnup_charts_spec.rb'
+ - 'ee/spec/features/ci/ci_catalog_spec.rb'
+ - 'ee/spec/features/dashboards/todos_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/new_epic_spec.rb'
+ - 'ee/spec/features/epics/epic_show_spec.rb'
+ - 'ee/spec/features/epics/user_uses_quick_actions_spec.rb'
+ - 'ee/spec/features/gitlab_subscriptions/seat_count_alert_spec.rb'
+ - 'ee/spec/features/group_protected_branches_spec.rb'
+ - 'ee/spec/features/groups/analytics/ci_cd_analytics_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/audit_events_spec.rb'
+ - 'ee/spec/features/groups/group_roadmap_spec.rb'
+ - 'ee/spec/features/groups/groups_security_credentials_spec.rb'
+ - 'ee/spec/features/groups/hooks/user_adds_hook_spec.rb'
+ - 'ee/spec/features/groups/hooks/user_edits_hooks_spec.rb'
+ - 'ee/spec/features/groups/hooks/user_views_hooks_spec.rb'
+ - 'ee/spec/features/groups/members/list_members_spec.rb'
+ - 'ee/spec/features/groups/members/manage_members_spec.rb'
+ - 'ee/spec/features/groups/navbar_spec.rb'
+ - 'ee/spec/features/groups/new_spec.rb'
+ - 'ee/spec/features/groups/push_rules_spec.rb'
+ - 'ee/spec/features/groups/saml_group_links_spec.rb'
+ - 'ee/spec/features/groups/scim_token_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/usage_quotas/seats_tab_spec.rb'
+ - 'ee/spec/features/groups/user_interacts_with_unlimited_members_during_trial_alert_spec.rb'
+ - 'ee/spec/features/groups_spec.rb'
+ - 'ee/spec/features/incidents/user_uses_quick_actions_spec.rb'
+ - 'ee/spec/features/issues/epic_in_issue_sidebar_spec.rb'
+ - 'ee/spec/features/issues/filtered_search/filter_issues_by_health_spec.rb'
+ - 'ee/spec/features/issues/filtered_search/filter_issues_epic_spec.rb'
+ - 'ee/spec/features/issues/filtered_search/filter_issues_weight_spec.rb'
+ - 'ee/spec/features/issues/gfm_autocomplete_ee_spec.rb'
+ - 'ee/spec/features/issues/issue_sidebar_spec.rb'
+ - 'ee/spec/features/issues/related_issues_spec.rb'
+ - 'ee/spec/features/issues/user_bulk_edits_issues_spec.rb'
+ - 'ee/spec/features/issues/user_sees_empty_state_spec.rb'
+ - 'ee/spec/features/issues/user_uses_quick_actions_spec.rb'
+ - 'ee/spec/features/markdown/observability_spec.rb'
+ - 'ee/spec/features/merge_request/user_creates_merge_request_spec.rb'
+ - 'ee/spec/features/merge_request/user_edits_approval_rules_mr_spec.rb'
+ - 'ee/spec/features/merge_request/user_sees_mr_approvals_promo_spec.rb'
+ - 'ee/spec/features/merge_request/user_sees_security_widget_spec.rb'
+ - 'ee/spec/features/merge_request/user_sees_status_checks_widget_spec.rb'
+ - 'ee/spec/features/merge_request/user_sets_approval_rules_spec.rb'
+ - 'ee/spec/features/merge_request/user_sets_approvers_spec.rb'
+ - 'ee/spec/features/milestones/user_views_milestone_spec.rb'
+ - 'ee/spec/features/oncall_schedules/user_creates_schedule_spec.rb'
+ - 'ee/spec/features/projects/analytics/cycle_analytics_spec.rb'
+ - 'ee/spec/features/projects/analytics/dashboards_spec.rb'
+ - 'ee/spec/features/projects/analytics/visualization_designer_spec.rb'
+ - 'ee/spec/features/projects/audit_events_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/members/manage_members_spec.rb'
+ - 'ee/spec/features/projects/navbar_spec.rb'
+ - 'ee/spec/features/projects/quality/shortcuts_test_case_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/vulnerability_report_spec.rb'
+ - 'ee/spec/features/projects/settings/disable_merge_trains_setting_spec.rb'
+ - 'ee/spec/features/projects/settings/ee/service_desk_setting_spec.rb'
+ - 'ee/spec/features/projects/settings/merge_request_approvals_settings_spec.rb'
+ - 'ee/spec/features/projects/settings/merge_requests/disable_merge_trains_setting_spec.rb'
+ - 'ee/spec/features/projects/settings/merge_requests_settings_spec.rb'
+ - 'ee/spec/features/projects/settings/user_manages_members_spec.rb'
+ - 'ee/spec/features/projects/show_project_spec.rb'
+ - 'ee/spec/features/projects/user_interacts_with_unlimited_members_during_trial_alert_spec.rb'
+ - 'ee/spec/features/projects/wiki/user_views_wiki_empty_spec.rb'
+ - 'ee/spec/features/projects_spec.rb'
+ - 'ee/spec/features/protected_branches_spec.rb'
+ - 'ee/spec/features/search/user_searches_for_epics_spec.rb'
+ - 'ee/spec/features/search/zoekt/search_spec.rb'
+ - 'ee/spec/features/subscriptions/expiring_subscription_message_spec.rb'
+ - 'ee/spec/features/trials/show_trial_banner_spec.rb'
+ - 'ee/spec/finders/approval_rules/group_finder_spec.rb'
+ - 'ee/spec/finders/compliance_management/merge_requests/compliance_violations_finder_spec.rb'
+ - 'ee/spec/finders/concerns/epics/with_access_check_spec.rb'
+ - 'ee/spec/finders/ee/ci/daily_build_group_report_results_finder_spec.rb'
+ - 'ee/spec/finders/ee/clusters/agents_finder_spec.rb'
+ - 'ee/spec/finders/ee/projects_finder_spec.rb'
+ - 'ee/spec/finders/ee/work_items/work_items_finder_spec.rb'
+ - 'ee/spec/finders/epics/cross_hierarchy_ancestors_finder_spec.rb'
+ - 'ee/spec/finders/epics/cross_hierarchy_children_finder_spec.rb'
+ - 'ee/spec/finders/epics_finder_spec.rb'
+ - 'ee/spec/finders/incident_management/escalation_policies_finder_spec.rb'
+ - 'ee/spec/finders/incident_management/issuable_resource_links_finder_spec.rb'
+ - 'ee/spec/finders/incident_management/oncall_schedules_finder_spec.rb'
+ - 'ee/spec/finders/iterations/cadences_finder_spec.rb'
+ - 'ee/spec/finders/iterations_finder_spec.rb'
+ - 'ee/spec/finders/merge_requests_finder_spec.rb'
+ - 'ee/spec/finders/snippets_finder_spec.rb'
+ - 'ee/spec/frontend/fixtures/analytics/charts.rb'
+ - 'ee/spec/frontend/fixtures/analytics/contributions_spec.rb'
+ - 'ee/spec/frontend/fixtures/dast_profiles.rb'
+ - 'ee/spec/frontend/fixtures/on_demand_dast_scans.rb'
+ - 'ee/spec/frontend/fixtures/users.rb'
+ - 'ee/spec/graphql/ee/mutations/boards/issues/issue_move_list_spec.rb'
+ - 'ee/spec/graphql/ee/mutations/ci/job_token_scope/add_project_spec.rb'
+ - 'ee/spec/graphql/ee/mutations/ci/job_token_scope/remove_project_spec.rb'
+ - 'ee/spec/graphql/ee/resolvers/project_issues_resolver_spec.rb'
+ - 'ee/spec/graphql/ee/types/clusters/agent_type_spec.rb'
+ - 'ee/spec/graphql/ee/types/group_type_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/update_epic_user_preferences_spec.rb'
+ - 'ee/spec/graphql/mutations/ci/ai/generate_config_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/dast/profiles/delete_spec.rb'
+ - 'ee/spec/graphql/mutations/dast/profiles/run_spec.rb'
+ - 'ee/spec/graphql/mutations/dast/profiles/update_spec.rb'
+ - 'ee/spec/graphql/mutations/dast_scanner_profiles/delete_spec.rb'
+ - 'ee/spec/graphql/mutations/dast_scanner_profiles/update_spec.rb'
+ - 'ee/spec/graphql/mutations/dast_site_profiles/create_spec.rb'
+ - 'ee/spec/graphql/mutations/dast_site_profiles/update_spec.rb'
+ - 'ee/spec/graphql/mutations/dast_site_validations/revoke_spec.rb'
+ - 'ee/spec/graphql/mutations/epics/add_issue_spec.rb'
+ - 'ee/spec/graphql/mutations/epics/create_spec.rb'
+ - 'ee/spec/graphql/mutations/epics/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/issuable_resource_link/create_spec.rb'
+ - 'ee/spec/graphql/mutations/incident_management/issuable_resource_link/destroy_spec.rb'
+ - 'ee/spec/graphql/mutations/incident_management/oncall_rotation/create_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/instance_security_dashboard/add_project_spec.rb'
+ - 'ee/spec/graphql/mutations/issues/promote_to_epic_spec.rb'
+ - 'ee/spec/graphql/mutations/issues/set_epic_spec.rb'
+ - 'ee/spec/graphql/mutations/issues/update_spec.rb'
+ - 'ee/spec/graphql/mutations/projects/set_compliance_framework_spec.rb'
+ - 'ee/spec/graphql/mutations/projects/set_locked_spec.rb'
+ - 'ee/spec/graphql/mutations/releases/update_spec.rb'
+ - 'ee/spec/graphql/mutations/requirements_management/create_requirement_spec.rb'
+ - 'ee/spec/graphql/mutations/requirements_management/export_requirements_spec.rb'
+ - 'ee/spec/graphql/mutations/requirements_management/update_requirement_spec.rb'
+ - 'ee/spec/graphql/mutations/security/training_provider_update_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/resolvers/analytics/devops_adoption/enabled_namespaces_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/board_groupings/epics_resolvers_spec.rb'
+ - 'ee/spec/graphql/resolvers/boards/board_list_epics_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/boards/epic_boards_resolvers_spec.rb'
+ - 'ee/spec/graphql/resolvers/boards/epic_list_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/boards/epic_lists_resolvers_spec.rb'
+ - 'ee/spec/graphql/resolvers/ci/catalog/resource_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/ci/catalog/resources_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/ci/catalog/versions_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/clusters/agents_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/compliance_management/merge_requests/compliance_violation_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/dast_site_validation_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/epic_ancestors_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/epic_issues_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/epics/children_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/epics/default_project_for_issue_creation_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/incident_management/escalation_policies_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/incident_management/issuable_resource_links_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/incident_management/oncall_rotations_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/incident_management/oncall_schedule_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/incident_management/oncall_shifts_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/incident_management/oncall_users_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/iterations_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/product_analytics/dashboards_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/product_analytics/state_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/requirements_management/requirements_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/requirements_management/test_reports_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/security_orchestration/scan_execution_policy_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/security_training_urls_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/vulnerabilities/container_images_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/vulnerabilities/scanners_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/vulnerabilities_count_per_day_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/vulnerabilities_grade_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/vulnerabilities_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/vulnerability_severities_count_resolver_spec.rb'
+ - 'ee/spec/graphql/types/asset_type_spec.rb'
+ - 'ee/spec/graphql/types/boards/board_epic_type_spec.rb'
+ - 'ee/spec/graphql/types/ci/pipeline_type_spec.rb'
+ - 'ee/spec/graphql/types/dast_scanner_profile_type_spec.rb'
+ - 'ee/spec/graphql/types/dast_site_validation_type_spec.rb'
+ - 'ee/spec/graphql/types/instance_security_dashboard_type_spec.rb'
+ - 'ee/spec/graphql/types/issue_type_spec.rb'
+ - 'ee/spec/graphql/types/pipeline_security_report_finding_type_spec.rb'
+ - 'ee/spec/graphql/types/project_type_spec.rb'
+ - 'ee/spec/graphql/types/vulnerability_evidence_source_type_spec.rb'
+ - 'ee/spec/graphql/types/vulnerability_evidence_supporting_message_type_spec.rb'
+ - 'ee/spec/graphql/types/vulnerability_evidence_type_spec.rb'
+ - 'ee/spec/graphql/types/vulnerability_location/coverage_fuzzing_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_scanner_type_spec.rb'
+ - 'ee/spec/graphql/types/vulnerability_type_spec.rb'
+ - 'ee/spec/helpers/ee/ci/catalog/resources_helper_spec.rb'
+ - 'ee/spec/helpers/ee/ci/pipeline_editor_helper_spec.rb'
+ - 'ee/spec/helpers/ee/environments_helper_spec.rb'
+ - 'ee/spec/helpers/ee/groups_helper_spec.rb'
+ - 'ee/spec/helpers/ee/projects/pipeline_helper_spec.rb'
+ - 'ee/spec/helpers/gitlab_subscriptions/upcoming_reconciliation_helper_spec.rb'
+ - 'ee/spec/helpers/merge_requests_helper_spec.rb'
+ - 'ee/spec/helpers/projects/on_demand_scans_helper_spec.rb'
+ - 'ee/spec/helpers/projects/project_members_helper_spec.rb'
+ - 'ee/spec/helpers/projects_helper_spec.rb'
+ - 'ee/spec/helpers/subscriptions_helper_spec.rb'
+ - 'ee/spec/helpers/timeboxes_helper_spec.rb'
+ - 'ee/spec/helpers/tree_helper_spec.rb'
+ - 'ee/spec/helpers/vulnerabilities_helper_spec.rb'
+ - 'ee/spec/helpers/web_hooks/web_hooks_helper_spec.rb'
+ - 'ee/spec/lib/analytics/group_activity_calculator_spec.rb'
+ - 'ee/spec/lib/audit/group_push_rules_changes_auditor_spec.rb'
+ - 'ee/spec/lib/audit/project_feature_changes_auditor_spec.rb'
+ - 'ee/spec/lib/bulk_imports/common/pipelines/boards_pipeline_spec.rb'
+ - 'ee/spec/lib/bulk_imports/groups/pipelines/epics_pipeline_spec.rb'
+ - 'ee/spec/lib/bulk_imports/groups/pipelines/iterations_pipeline_spec.rb'
+ - 'ee/spec/lib/bulk_imports/projects/pipelines/issues_pipeline_spec.rb'
+ - 'ee/spec/lib/ee/api/entities/group_detail_spec.rb'
+ - 'ee/spec/lib/ee/api/helpers/issues_helpers_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/analytics/cycle_analytics/base_query_builder_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/pipeline/chain/validate/abilities_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/pipeline/chain/validate/after_config_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/git_access_project_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/import_export/project/tree_saver_spec.rb'
+ - 'ee/spec/lib/elastic/latest/git_class_proxy_spec.rb'
+ - 'ee/spec/lib/elastic/latest/user_instance_proxy_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/cycle_analytics/request_params_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/cycle_analytics/summary/stage_time_summary_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/type_of_work/tasks_by_type_spec.rb'
+ - 'ee/spec/lib/gitlab/code_owners/loader_spec.rb'
+ - 'ee/spec/lib/gitlab/code_owners/validator_spec.rb'
+ - 'ee/spec/lib/gitlab/cycle_analytics/stage_summary_spec.rb'
+ - 'ee/spec/lib/gitlab/elastic/project_search_results_spec.rb'
+ - 'ee/spec/lib/gitlab/git_access_spec.rb'
+ - 'ee/spec/lib/gitlab/git_access_wiki_spec.rb'
+ - 'ee/spec/lib/gitlab/llm/chain/agents/zero_shot/executor_spec.rb'
+ - 'ee/spec/lib/gitlab/llm/chain/tools/gitlab_documentation/executor_spec.rb'
+ - 'ee/spec/lib/gitlab/llm/chain/tools/issue_identifier/executor_spec.rb'
+ - 'ee/spec/lib/gitlab/llm/chain/tools/summarize_comments/executor_spec.rb'
+ - 'ee/spec/lib/gitlab/quick_actions/users_extractor_spec.rb'
+ - 'ee/spec/lib/gitlab/reference_extractor_spec.rb'
+ - 'ee/spec/models/ai/project/conversations_spec.rb'
+ - 'ee/spec/models/analytics/cycle_analytics/group_level_spec.rb'
+ - 'ee/spec/models/dast/profile_schedule_spec.rb'
+ - 'ee/spec/models/ee/award_emoji_spec.rb'
+ - 'ee/spec/models/ee/group_spec.rb'
+ - 'ee/spec/models/ee/namespaces/namespace_ban_spec.rb'
+ - 'ee/spec/models/ee/project_authorization_spec.rb'
+ - 'ee/spec/models/ee/project_group_link_spec.rb'
+ - 'ee/spec/models/ee/user_spec.rb'
+ - 'ee/spec/models/ee/vulnerability_spec.rb'
+ - 'ee/spec/models/epic_issue_spec.rb'
+ - 'ee/spec/models/epic_spec.rb'
+ - 'ee/spec/models/group_member_spec.rb'
+ - 'ee/spec/models/instance_security_dashboard_spec.rb'
+ - 'ee/spec/models/issue_spec.rb'
+ - 'ee/spec/models/merge_request_spec.rb'
+ - 'ee/spec/models/vulnerabilities/projects_grade_spec.rb'
+ - 'ee/spec/policies/app_sec/fuzzing/coverage/corpus_policy_spec.rb'
+ - 'ee/spec/policies/ci/editor/ai_conversation/message_policy_spec.rb'
+ - 'ee/spec/policies/ci/job_artifact_policy_spec.rb'
+ - 'ee/spec/policies/compliance_management/framework_policy_spec.rb'
+ - 'ee/spec/policies/dependencies/dependency_list_export_policy_spec.rb'
+ - 'ee/spec/policies/epic_policy_spec.rb'
+ - 'ee/spec/policies/event_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/issue_policy_spec.rb'
+ - 'ee/spec/policies/merge_request/diff_llm_summary_policy_spec.rb'
+ - 'ee/spec/policies/merge_request_policy_spec.rb'
+ - 'ee/spec/policies/merge_requests/external_status_check_policy_spec.rb'
+ - 'ee/spec/policies/packages/policies/project_policy_spec.rb'
+ - 'ee/spec/policies/project_policy_spec.rb'
+ - 'ee/spec/policies/requirements_management/requirement_policy_spec.rb'
+ - 'ee/spec/policies/resource_iteration_event_policy_spec.rb'
+ - 'ee/spec/policies/resource_weight_event_policy_spec.rb'
+ - 'ee/spec/policies/security/scan_policy_spec.rb'
+ - 'ee/spec/policies/vulnerabilities/issue_link_policy_spec.rb'
+ - 'ee/spec/policies/vulnerabilities/merge_request_link_policy_spec.rb'
+ - 'ee/spec/presenters/approval_rule_presenter_spec.rb'
+ - 'ee/spec/requests/admin/credentials_controller_spec.rb'
+ - 'ee/spec/requests/api/analytics/product_analytics_spec.rb'
+ - 'ee/spec/requests/api/award_emoji_spec.rb'
+ - 'ee/spec/requests/api/ci/jobs_spec.rb'
+ - 'ee/spec/requests/api/ci/triggers_spec.rb'
+ - 'ee/spec/requests/api/commits_spec.rb'
+ - 'ee/spec/requests/api/composer_packages_spec.rb'
+ - 'ee/spec/requests/api/conan_project_packages_spec.rb'
+ - 'ee/spec/requests/api/debian_group_packages_spec.rb'
+ - 'ee/spec/requests/api/debian_project_packages_spec.rb'
+ - 'ee/spec/requests/api/dependencies_spec.rb'
+ - 'ee/spec/requests/api/dependency_list_exports_spec.rb'
+ - 'ee/spec/requests/api/deployments_spec.rb'
+ - 'ee/spec/requests/api/epic_links_spec.rb'
+ - 'ee/spec/requests/api/experiments_spec.rb'
+ - 'ee/spec/requests/api/generic_packages_spec.rb'
+ - 'ee/spec/requests/api/go_proxy_spec.rb'
+ - 'ee/spec/requests/api/graphql/app_sec/fuzzing/api/ci_configuration_type_spec.rb'
+ - 'ee/spec/requests/api/graphql/app_sec/fuzzing/coverage/corpus_type_spec.rb'
+ - 'ee/spec/requests/api/graphql/boards/boards_query_spec.rb'
+ - 'ee/spec/requests/api/graphql/boards/epic_board_list_epics_query_spec.rb'
+ - 'ee/spec/requests/api/graphql/boards/epic_boards_query_spec.rb'
+ - 'ee/spec/requests/api/graphql/boards/epic_lists_query_spec.rb'
+ - 'ee/spec/requests/api/graphql/ci/catalog/resources_spec.rb'
+ - 'ee/spec/requests/api/graphql/ci/minutes/usage_spec.rb'
+ - 'ee/spec/requests/api/graphql/compliance_management/merge_requests/compliance_violations_spec.rb'
+ - 'ee/spec/requests/api/graphql/dora/dora_scores_spec.rb'
+ - 'ee/spec/requests/api/graphql/epics/epic_resolver_spec.rb'
+ - 'ee/spec/requests/api/graphql/gitlab_subscriptions/preview_billable_user_change_spec.rb'
+ - 'ee/spec/requests/api/graphql/group/dast_profile_schedule_spec.rb'
+ - 'ee/spec/requests/api/graphql/group/epic/epic_aggregate_query_spec.rb'
+ - 'ee/spec/requests/api/graphql/group/epic/epic_ancestors_spec.rb'
+ - 'ee/spec/requests/api/graphql/group/epic/epic_children_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/group/external_audit_event_destinations_spec.rb'
+ - 'ee/spec/requests/api/graphql/group_query_spec.rb'
+ - 'ee/spec/requests/api/graphql/incident_management/issuable_resource_links_spec.rb'
+ - 'ee/spec/requests/api/graphql/instance_security_dashboard_spec.rb'
+ - 'ee/spec/requests/api/graphql/issue/issue_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/merge_requests/finding_reports_comparer_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/alert_management/http_integration/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/alert_management/http_integration/update_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/audit_events/google_cloud_logging_configurations/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/audit_events/google_cloud_logging_configurations/destroy_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/audit_events/google_cloud_logging_configurations/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/boards/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/boards/epic_boards/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/boards/epic_boards/destroy_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/boards/epic_boards/epic_move_list_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/boards/epic_boards/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/boards/epics/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/boards/lists/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/boards/update_epic_user_preferences_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/ci/catalog/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/ci/namespace_ci_cd_settings_update_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/epic_tree/reorder_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/epics/add_issue_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/escalation_policy/destroy_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/incident_management/escalation_policy/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/incident_management/issuable_resource_link/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/incident_management/issuable_resource_link/destroy_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/incident_management/oncall_schedule/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/incident_management/oncall_schedule/destroy_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/incident_management/oncall_schedule/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/issues/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/issues/set_epic_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/issues/set_escalation_policy_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/issues/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/iterations/cadences/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/iterations/cadences/destroy_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/iterations/cadences/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/iterations/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/iterations/delete_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/iterations/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/members/groups/ee/bulk_update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/merge_requests/set_assignees_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/merge_requests/update_approval_rule_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/notes/create/note_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/projects/chat_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/projects/initialize_product_analytics_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/projects/lock_path_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/projects/set_compliance_framework_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/releases/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/releases/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/requirements_management/create_requirement_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/requirements_management/export_requirements_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/requirements_management/update_requirement_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/security/finding/create_issue_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/security_policy/assign_security_policy_project_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/users/abuse/namespace_bans/destroy_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/vulnerabilities/create_issue_link_spec.rb'
+ - 'ee/spec/requests/api/graphql/namespace/compliance_frameworks_spec.rb'
+ - 'ee/spec/requests/api/graphql/namespace/projects_spec.rb'
+ - 'ee/spec/requests/api/graphql/pipeline_security_report_finding_spec.rb'
+ - 'ee/spec/requests/api/graphql/product_analytics/dashboards_spec.rb'
+ - 'ee/spec/requests/api/graphql/product_analytics/project_visualizations_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/alert_management/integrations_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/branch_rules/approval_project_rules_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/branch_rules/branch_protection_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/branch_rules/external_status_checks_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/branch_rules_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/compliance_framework_filters_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/dast_profile_schedule_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/dast_profile_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/dast_profiles_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/dast_site_validations_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/incident_management/escalation_policies_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/incident_management/escalation_policy/rules_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/incident_management/oncall_schedules_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/issue_status_counts_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/pipeline/code_quality_report_summary_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/pipeline/code_quality_reports_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/pipeline/dast_profile_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/pipeline/security_report_finding_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/pipeline/security_report_findings_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/pipeline/security_report_summary_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/pipelines/dast_profile_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/product_analytics_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/requirements_management/requirement_counts_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/requirements_management/requirements_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/requirements_management/test_reports_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/security_orchestration/scan_result_policy_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/vulnerability_severities_count_spec.rb'
+ - 'ee/spec/requests/api/graphql/subscriptions/ai_completion_response_spec.rb'
+ - 'ee/spec/requests/api/graphql/vulnerabilities/description_spec.rb'
+ - 'ee/spec/requests/api/graphql/vulnerabilities/details_spec.rb'
+ - 'ee/spec/requests/api/graphql/vulnerabilities/external_issue_links_spec.rb'
+ - 'ee/spec/requests/api/graphql/vulnerabilities/identifiers_spec.rb'
+ - 'ee/spec/requests/api/graphql/vulnerabilities/issue_links_spec.rb'
+ - 'ee/spec/requests/api/graphql/vulnerabilities/location_spec.rb'
+ - 'ee/spec/requests/api/graphql/vulnerabilities/primary_identifier_spec.rb'
+ - 'ee/spec/requests/api/graphql/vulnerabilities/scanner_spec.rb'
+ - 'ee/spec/requests/api/graphql/vulnerabilities/sort_spec.rb'
+ - 'ee/spec/requests/api/group_hooks_spec.rb'
+ - 'ee/spec/requests/api/groups_spec.rb'
+ - 'ee/spec/requests/api/helm_packages_spec.rb'
+ - 'ee/spec/requests/api/internal/base_spec.rb'
+ - 'ee/spec/requests/api/invitations_spec.rb'
+ - 'ee/spec/requests/api/issue_links_spec.rb'
+ - 'ee/spec/requests/api/issues_spec.rb'
+ - 'ee/spec/requests/api/managed_licenses_spec.rb'
+ - 'ee/spec/requests/api/maven_packages_spec.rb'
+ - 'ee/spec/requests/api/member_roles_spec.rb'
+ - 'ee/spec/requests/api/members_spec.rb'
+ - 'ee/spec/requests/api/merge_request_approval_settings_spec.rb'
+ - 'ee/spec/requests/api/merge_requests_spec.rb'
+ - 'ee/spec/requests/api/namespaces_spec.rb'
+ - 'ee/spec/requests/api/npm_project_packages_spec.rb'
+ - 'ee/spec/requests/api/nuget_group_packages_spec.rb'
+ - 'ee/spec/requests/api/nuget_project_packages_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/protected_environments_spec.rb'
+ - 'ee/spec/requests/api/pypi_packages_spec.rb'
+ - 'ee/spec/requests/api/related_epic_links_spec.rb'
+ - 'ee/spec/requests/api/remote_mirrors_spec.rb'
+ - 'ee/spec/requests/api/repositories_spec.rb'
+ - 'ee/spec/requests/api/rubygem_packages_spec.rb'
+ - 'ee/spec/requests/api/saml_group_links_spec.rb'
+ - 'ee/spec/requests/api/search_spec.rb'
+ - 'ee/spec/requests/api/todos_spec.rb'
+ - 'ee/spec/requests/api/v3/github_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/api/vulnerability_issue_links_spec.rb'
+ - 'ee/spec/requests/ee/groups/autocomplete_sources_spec.rb'
+ - 'ee/spec/requests/ee/groups/settings/repository_controller_spec.rb'
+ - 'ee/spec/requests/ee/projects/cycle_analytics_controller_spec.rb'
+ - 'ee/spec/requests/ee/projects/deploy_tokens_controller_spec.rb'
+ - 'ee/spec/requests/ee/projects/repositories_controller_spec.rb'
+ - 'ee/spec/requests/ee/projects/service_desk_controller_spec.rb'
+ - 'ee/spec/requests/git_http_geo_spec.rb'
+ - 'ee/spec/requests/git_http_spec.rb'
+ - 'ee/spec/requests/groups/analytics/devops_adoption_controller_spec.rb'
+ - 'ee/spec/requests/groups/dependencies_controller_spec.rb'
+ - 'ee/spec/requests/groups/epics/epic_links_controller_spec.rb'
+ - 'ee/spec/requests/groups/protected_branches_controller_spec.rb'
+ - 'ee/spec/requests/groups/security/compliance_framework_reports_controller_spec.rb'
+ - 'ee/spec/requests/groups/security/credentials_controller_spec.rb'
+ - 'ee/spec/requests/groups/service_accounts_controller_spec.rb'
+ - 'ee/spec/requests/groups/settings/merge_requests_controller_spec.rb'
+ - 'ee/spec/requests/groups/two_factor_auths_controller_spec.rb'
+ - 'ee/spec/requests/jwt_controller_spec.rb'
+ - 'ee/spec/requests/lfs_locks_api_spec.rb'
+ - 'ee/spec/requests/projects/analytics/cycle_analytics/stages_controller_spec.rb'
+ - 'ee/spec/requests/projects/ci/catalog/resources_controller_spec.rb'
+ - 'ee/spec/requests/projects/dependencies_controller_spec.rb'
+ - 'ee/spec/requests/projects/issues_controller_spec.rb'
+ - 'ee/spec/requests/projects/on_demand_scans_controller_spec.rb'
+ - 'ee/spec/requests/projects/pipelines/email_campaigns_controller_spec.rb'
+ - 'ee/spec/requests/projects/requirements_management/requirements_controller_spec.rb'
+ - 'ee/spec/requests/projects/security/dast_configuration_controller_spec.rb'
+ - 'ee/spec/requests/projects/security/dast_scanner_profiles_controller_spec.rb'
+ - 'ee/spec/requests/projects/security/policies_controller_spec.rb'
+ - 'ee/spec/requests/projects/security/scanned_resources_controller_spec.rb'
+ - 'ee/spec/requests/projects/settings/access_tokens_controller_spec.rb'
+ - 'ee/spec/requests/registrations/groups_controller_spec.rb'
+ - 'ee/spec/requests/repositories/git_http_controller_spec.rb'
+ - 'ee/spec/serializers/clusters/environment_entity_spec.rb'
+ - 'ee/spec/serializers/dependency_list_serializer_spec.rb'
+ - 'ee/spec/serializers/ee/deployment_entity_spec.rb'
+ - 'ee/spec/serializers/ee/issue_sidebar_basic_entity_spec.rb'
+ - 'ee/spec/serializers/epics/related_epic_entity_spec.rb'
+ - 'ee/spec/serializers/merge_request_poll_widget_entity_spec.rb'
+ - 'ee/spec/serializers/security/vulnerability_report_data_entity_spec.rb'
+ - 'ee/spec/serializers/vulnerabilities/feedback_entity_spec.rb'
+ - 'ee/spec/serializers/vulnerabilities/finding_entity_spec.rb'
+ - 'ee/spec/serializers/vulnerabilities/issue_link_entity_spec.rb'
+ - 'ee/spec/serializers/vulnerabilities/merge_request_link_entity_spec.rb'
+ - 'ee/spec/services/alert_management/extract_alert_payload_fields_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/profiles/destroy_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/profiles/update_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/scans/create_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/scans/run_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/site_profile_secret_variables/destroy_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/site_profiles/create_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/site_profiles/update_service_spec.rb'
+ - 'ee/spec/services/approval_rules/create_service_spec.rb'
+ - 'ee/spec/services/approval_rules/update_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/award_emojis/add_service_spec.rb'
+ - 'ee/spec/services/award_emojis/destroy_service_spec.rb'
+ - 'ee/spec/services/boards/epic_lists/destroy_service_spec.rb'
+ - 'ee/spec/services/boards/epics/create_service_spec.rb'
+ - 'ee/spec/services/boards/epics/list_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/update_service_spec.rb'
+ - 'ee/spec/services/ci/catalog/add_resource_service_spec.rb'
+ - 'ee/spec/services/ci/compare_license_scanning_reports_service_spec.rb'
+ - 'ee/spec/services/ci/create_pipeline_service/compliance_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/llm/async_generate_config_service_spec.rb'
+ - 'ee/spec/services/ci/pipeline_trigger_service_spec.rb'
+ - 'ee/spec/services/ci/process_pipeline_service_spec.rb'
+ - 'ee/spec/services/ci/retry_pipeline_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/export_service_spec.rb'
+ - 'ee/spec/services/compliance_management/frameworks/update_service_spec.rb'
+ - 'ee/spec/services/compliance_management/projects/create_ci_config_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/create_alert_issue_service_spec.rb'
+ - 'ee/spec/services/ee/alert_management/http_integrations/create_service_spec.rb'
+ - 'ee/spec/services/ee/alert_management/http_integrations/update_service_spec.rb'
+ - 'ee/spec/services/ee/auth/container_registry_authentication_service_spec.rb'
+ - 'ee/spec/services/ee/authorized_project_update/project_recalculate_service_spec.rb'
+ - 'ee/spec/services/ee/design_management/delete_designs_service_spec.rb'
+ - 'ee/spec/services/ee/design_management/save_designs_service_spec.rb'
+ - 'ee/spec/services/ee/groups/autocomplete_service_spec.rb'
+ - 'ee/spec/services/ee/groups/deploy_tokens/create_service_spec.rb'
+ - 'ee/spec/services/ee/groups/deploy_tokens/destroy_service_spec.rb'
+ - 'ee/spec/services/ee/groups/deploy_tokens/revoke_service_spec.rb'
+ - 'ee/spec/services/ee/groups/group_links/create_service_spec.rb'
+ - 'ee/spec/services/ee/groups/group_links/destroy_service_spec.rb'
+ - 'ee/spec/services/ee/groups/group_links/update_service_spec.rb'
+ - 'ee/spec/services/ee/issuable/bulk_update_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/reopen_service_spec.rb'
+ - 'ee/spec/services/ee/issues/update_service_spec.rb'
+ - 'ee/spec/services/ee/members/approve_access_request_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/merge_requests/update_assignees_service_spec.rb'
+ - 'ee/spec/services/ee/merge_requests/update_reviewers_service_spec.rb'
+ - 'ee/spec/services/ee/notes/quick_actions_service_spec.rb'
+ - 'ee/spec/services/ee/notification_service_spec.rb'
+ - 'ee/spec/services/ee/post_receive_service_spec.rb'
+ - 'ee/spec/services/ee/protected_branches/create_service_spec.rb'
+ - 'ee/spec/services/ee/todos/destroy/entity_leave_service_spec.rb'
+ - 'ee/spec/services/ee/two_factor/destroy_service_spec.rb'
+ - 'ee/spec/services/ee/work_items/import_csv_service_spec.rb'
+ - 'ee/spec/services/epic_issues/create_service_spec.rb'
+ - 'ee/spec/services/epic_issues/update_service_spec.rb'
+ - 'ee/spec/services/epics/close_service_spec.rb'
+ - 'ee/spec/services/epics/create_service_spec.rb'
+ - 'ee/spec/services/epics/epic_links/create_service_spec.rb'
+ - 'ee/spec/services/epics/issue_promote_service_spec.rb'
+ - 'ee/spec/services/epics/related_epic_links/create_service_spec.rb'
+ - 'ee/spec/services/epics/related_epic_links/list_service_spec.rb'
+ - 'ee/spec/services/epics/reopen_service_spec.rb'
+ - 'ee/spec/services/epics/transfer_service_spec.rb'
+ - 'ee/spec/services/epics/tree_reorder_service_spec.rb'
+ - 'ee/spec/services/epics/update_service_spec.rb'
+ - 'ee/spec/services/external_status_checks/retry_service_spec.rb'
+ - 'ee/spec/services/gitlab_subscriptions/preview_billable_user_change_service_spec.rb'
+ - 'ee/spec/services/gitlab_subscriptions/reconciliations/calculate_seat_count_data_service_spec.rb'
+ - 'ee/spec/services/group_saml/saml_group_links/create_service_spec.rb'
+ - 'ee/spec/services/groups/destroy_service_spec.rb'
+ - 'ee/spec/services/groups/enterprise_users/associate_service_spec.rb'
+ - 'ee/spec/services/groups/epics_count_service_spec.rb'
+ - 'ee/spec/services/groups/transfer_service_spec.rb'
+ - 'ee/spec/services/ide/schemas_config_service_spec.rb'
+ - 'ee/spec/services/incident_management/oncall_rotations/destroy_service_spec.rb'
+ - 'ee/spec/services/incident_management/oncall_rotations/edit_service_spec.rb'
+ - 'ee/spec/services/incident_management/oncall_schedules/create_service_spec.rb'
+ - 'ee/spec/services/incident_management/oncall_schedules/destroy_service_spec.rb'
+ - 'ee/spec/services/incident_management/oncall_schedules/update_service_spec.rb'
+ - 'ee/spec/services/issuable/discussions_list_service_spec.rb'
+ - 'ee/spec/services/issues/build_service_spec.rb'
+ - 'ee/spec/services/iterations/cadences/create_iterations_in_advance_service_spec.rb'
+ - 'ee/spec/services/iterations/roll_over_issues_service_spec.rb'
+ - 'ee/spec/services/iterations/update_service_spec.rb'
+ - 'ee/spec/services/llm/analyze_ci_job_failure_service_spec.rb'
+ - 'ee/spec/services/llm/base_service_spec.rb'
+ - 'ee/spec/services/llm/chat_service_spec.rb'
+ - 'ee/spec/services/llm/explain_code_service_spec.rb'
+ - 'ee/spec/services/llm/explain_vulnerability_service_spec.rb'
+ - 'ee/spec/services/llm/fill_in_merge_request_template_service_spec.rb'
+ - 'ee/spec/services/llm/generate_commit_message_service_spec.rb'
+ - 'ee/spec/services/llm/generate_description_service_spec.rb'
+ - 'ee/spec/services/llm/generate_summary_service_spec.rb'
+ - 'ee/spec/services/llm/generate_test_file_service_spec.rb'
+ - 'ee/spec/services/llm/git_command_service_spec.rb'
+ - 'ee/spec/services/llm/merge_requests/summarize_diff_service_spec.rb'
+ - 'ee/spec/services/llm/merge_requests/summarize_review_service_spec.rb'
+ - 'ee/spec/services/members/activate_service_spec.rb'
+ - 'ee/spec/services/merge_trains/create_pipeline_service_spec.rb'
+ - 'ee/spec/services/notes/create_visual_review_service_spec.rb'
+ - 'ee/spec/services/product_analytics/cube_data_query_service_spec.rb'
+ - 'ee/spec/services/product_analytics/initialize_stack_service_spec.rb'
+ - 'ee/spec/services/projects/deregister_suggested_reviewers_project_service_spec.rb'
+ - 'ee/spec/services/projects/group_links/create_service_spec.rb'
+ - 'ee/spec/services/projects/group_links/update_service_spec.rb'
+ - 'ee/spec/services/projects/register_suggested_reviewers_project_service_spec.rb'
+ - 'ee/spec/services/projects/transfer_service_spec.rb'
+ - 'ee/spec/services/projects/update_service_spec.rb'
+ - 'ee/spec/services/protected_environments/base_service_spec.rb'
+ - 'ee/spec/services/quick_actions/interpret_service_spec.rb'
+ - 'ee/spec/services/requirements_management/import_csv_service_spec.rb'
+ - 'ee/spec/services/requirements_management/process_test_reports_service_spec.rb'
+ - 'ee/spec/services/security/orchestration/assign_service_spec.rb'
+ - 'ee/spec/services/security/orchestration/create_bot_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/policy_commit_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/process_scan_result_policy_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/project_create_service_spec.rb'
+ - 'ee/spec/services/status_page/mark_for_publication_service_spec.rb'
+ - 'ee/spec/services/todos/destroy/confidential_epic_service_spec.rb'
+ - 'ee/spec/services/users/abuse/git_abuse/namespace_throttle_service_spec.rb'
+ - 'ee/spec/services/vulnerabilities/destroy_dismissal_feedback_service_spec.rb'
+ - 'ee/spec/services/vulnerabilities/find_or_create_from_security_finding_service_spec.rb'
+ - 'ee/spec/services/vulnerabilities/findings/find_or_create_from_security_finding_service_spec.rb'
+ - 'ee/spec/services/vulnerabilities/security_finding/create_issue_service_spec.rb'
+ - 'ee/spec/services/vulnerability_feedback/create_service_spec.rb'
+ - 'ee/spec/services/vulnerability_issue_links/bulk_create_service_spec.rb'
+ - 'ee/spec/services/vulnerability_issue_links/delete_service_spec.rb'
+ - 'ee/spec/services/vulnerability_merge_request_links/create_service_spec.rb'
+ - 'ee/spec/services/work_items/widgets/health_status_service/update_service_spec.rb'
+ - 'ee/spec/services/work_items/widgets/iteration_service/update_service_spec.rb'
+ - 'ee/spec/services/work_items/widgets/progress_service/update_service_spec.rb'
+ - 'ee/spec/services/work_items/widgets/status_service/update_service_spec.rb'
+ - 'ee/spec/services/work_items/widgets/weight_service/update_service_spec.rb'
+ - 'ee/spec/support/shared_contexts/gitlab_team_member_shared_context.rb'
+ - 'ee/spec/support/shared_contexts/project_approval_rules_shared_context.rb'
+ - 'ee/spec/support/shared_examples/controllers/projects/license_scanning_report_comparison_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/finders/scan_policy_base_finder_examples.rb'
+ - 'ee/spec/support/shared_examples/models/protected_environments/authorizable_examples.rb'
+ - 'ee/spec/support/shared_examples/policies/dast_on_demand_scans_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/serializers/report_status_shared_examples.rb'
+ - 'ee/spec/views/compliance_management/compliance_framework/_project_settings.html.haml_spec.rb'
+ - 'ee/spec/views/layouts/header/_new_dropdown.haml_spec.rb'
+ - 'ee/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb'
+ - 'ee/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb'
+ - 'ee/spec/views/shared/promotions/_promotion_link_project.html.haml_spec.rb'
+ - 'ee/spec/workers/abuse/new_abuse_report_worker_spec.rb'
+ - 'ee/spec/workers/app_sec/dast/profile_schedule_worker_spec.rb'
+ - 'ee/spec/workers/compliance_management/framework_export_mailer_worker_spec.rb'
+ - 'ee/spec/workers/compliance_management/update_default_framework_worker_spec.rb'
+ - 'ee/spec/workers/ee/ci/build_finished_worker_spec.rb'
+ - 'ee/spec/workers/ee/new_issue_worker_spec.rb'
+ - 'ee/spec/workers/groups/export_memberships_worker_spec.rb'
+ - 'ee/spec/workers/llm/completion_worker_spec.rb'
+ - 'ee/spec/workers/merge_requests/llm/summarize_merge_request_worker_spec.rb'
+ - 'ee/spec/workers/security/orchestration_configuration_create_bot_worker_spec.rb'
+ - 'spec/controllers/autocomplete_controller_spec.rb'
+ - 'spec/controllers/concerns/metrics_dashboard_spec.rb'
+ - 'spec/controllers/dashboard_controller_spec.rb'
+ - 'spec/controllers/explore/projects_controller_spec.rb'
+ - 'spec/controllers/graphql_controller_spec.rb'
+ - 'spec/controllers/groups/clusters_controller_spec.rb'
+ - 'spec/controllers/groups/dependency_proxies_controller_spec.rb'
+ - 'spec/controllers/groups/dependency_proxy_for_containers_controller_spec.rb'
+ - 'spec/controllers/groups/group_members_controller_spec.rb'
+ - 'spec/controllers/groups/imports_controller_spec.rb'
+ - 'spec/controllers/groups/labels_controller_spec.rb'
+ - 'spec/controllers/groups/runners_controller_spec.rb'
+ - 'spec/controllers/groups/settings/applications_controller_spec.rb'
+ - 'spec/controllers/groups/settings/ci_cd_controller_spec.rb'
+ - 'spec/controllers/groups/settings/integrations_controller_spec.rb'
+ - 'spec/controllers/groups_controller_spec.rb'
+ - 'spec/controllers/import/manifest_controller_spec.rb'
+ - 'spec/controllers/profiles/notifications_controller_spec.rb'
+ - 'spec/controllers/profiles/slacks_controller_spec.rb'
+ - 'spec/controllers/projects/analytics/cycle_analytics/stages_controller_spec.rb'
+ - 'spec/controllers/projects/analytics/cycle_analytics/summary_controller_spec.rb'
+ - 'spec/controllers/projects/analytics/cycle_analytics/value_streams_controller_spec.rb'
+ - 'spec/controllers/projects/artifacts_controller_spec.rb'
+ - 'spec/controllers/projects/blame_controller_spec.rb'
+ - 'spec/controllers/projects/blob_controller_spec.rb'
+ - 'spec/controllers/projects/ci/lints_controller_spec.rb'
+ - 'spec/controllers/projects/ci/pipeline_editor_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/compare_controller_spec.rb'
+ - 'spec/controllers/projects/environments/sample_metrics_controller_spec.rb'
+ - 'spec/controllers/projects/error_tracking_controller_spec.rb'
+ - 'spec/controllers/projects/feature_flags_clients_controller_spec.rb'
+ - 'spec/controllers/projects/group_links_controller_spec.rb'
+ - 'spec/controllers/projects/import/jira_controller_spec.rb'
+ - 'spec/controllers/projects/issue_links_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/merge_requests_controller_spec.rb'
+ - 'spec/controllers/projects/packages/infrastructure_registry_controller_spec.rb'
+ - 'spec/controllers/projects/performance_monitoring/dashboards_controller_spec.rb'
+ - 'spec/controllers/projects/pipeline_schedules_controller_spec.rb'
+ - 'spec/controllers/projects/pipelines_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/refs_controller_spec.rb'
+ - 'spec/controllers/projects/registry/repositories_controller_spec.rb'
+ - 'spec/controllers/projects/repositories_controller_spec.rb'
+ - 'spec/controllers/projects/runner_projects_controller_spec.rb'
+ - 'spec/controllers/projects/runners_controller_spec.rb'
+ - 'spec/controllers/projects/settings/ci_cd_controller_spec.rb'
+ - 'spec/controllers/projects/settings/integrations_controller_spec.rb'
+ - 'spec/controllers/projects/settings/slacks_controller_spec.rb'
+ - 'spec/controllers/projects/snippets_controller_spec.rb'
+ - 'spec/controllers/projects/terraform_controller_spec.rb'
+ - 'spec/controllers/projects/tree_controller_spec.rb'
+ - 'spec/controllers/projects/usage_quotas_controller_spec.rb'
+ - 'spec/controllers/projects/web_ide_schemas_controller_spec.rb'
+ - 'spec/controllers/projects/work_items_controller_spec.rb'
+ - 'spec/controllers/projects_controller_spec.rb'
+ - 'spec/controllers/repositories/lfs_storage_controller_spec.rb'
+ - 'spec/experiments/ios_specific_templates_experiment_spec.rb'
+ - 'spec/features/admin/admin_projects_spec.rb'
+ - 'spec/features/admin/users/user_spec.rb'
+ - 'spec/features/admin/users/users_spec.rb'
+ - 'spec/features/boards/board_filters_spec.rb'
+ - 'spec/features/boards/new_issue_spec.rb'
+ - 'spec/features/boards/sidebar_assignee_spec.rb'
+ - 'spec/features/boards/sidebar_labels_spec.rb'
+ - 'spec/features/boards/sidebar_spec.rb'
+ - 'spec/features/commit_spec.rb'
+ - 'spec/features/commits/user_view_commits_spec.rb'
+ - 'spec/features/commits_spec.rb'
+ - 'spec/features/dashboard/issues_filter_spec.rb'
+ - 'spec/features/dashboard/todos/todos_spec.rb'
+ - 'spec/features/emails/issues_spec.rb'
+ - 'spec/features/global_search_spec.rb'
+ - 'spec/features/groups/board_spec.rb'
+ - 'spec/features/groups/dependency_proxy_for_containers_spec.rb'
+ - 'spec/features/groups/group_runners_spec.rb'
+ - 'spec/features/groups/import_export/export_file_spec.rb'
+ - 'spec/features/groups/members/manage_groups_spec.rb'
+ - 'spec/features/groups/members/manage_members_spec.rb'
+ - 'spec/features/groups/members/master_adds_member_with_expiration_date_spec.rb'
+ - 'spec/features/groups/new_group_page_spec.rb'
+ - 'spec/features/groups/packages_spec.rb'
+ - 'spec/features/groups/settings/access_tokens_spec.rb'
+ - 'spec/features/groups/settings/manage_applications_spec.rb'
+ - 'spec/features/groups/settings/user_searches_in_settings_spec.rb'
+ - 'spec/features/groups/show_spec.rb'
+ - 'spec/features/groups_spec.rb'
+ - 'spec/features/incidents/user_uses_quick_actions_spec.rb'
+ - 'spec/features/integrations_settings_spec.rb'
+ - 'spec/features/invites_spec.rb'
+ - 'spec/features/issues/filtered_search/dropdown_assignee_spec.rb'
+ - 'spec/features/issues/filtered_search/dropdown_author_spec.rb'
+ - 'spec/features/issues/filtered_search/dropdown_base_spec.rb'
+ - 'spec/features/issues/filtered_search/dropdown_emoji_spec.rb'
+ - 'spec/features/issues/filtered_search/dropdown_hint_spec.rb'
+ - 'spec/features/issues/filtered_search/dropdown_label_spec.rb'
+ - 'spec/features/issues/filtered_search/dropdown_milestone_spec.rb'
+ - 'spec/features/issues/filtered_search/dropdown_release_spec.rb'
+ - 'spec/features/issues/filtered_search/search_bar_spec.rb'
+ - 'spec/features/issues/incident_issue_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/issue_state_spec.rb'
+ - 'spec/features/issues/user_comments_on_issue_spec.rb'
+ - 'spec/features/issues/user_creates_issue_by_email_spec.rb'
+ - 'spec/features/issues/user_creates_issue_spec.rb'
+ - 'spec/features/issues/user_edits_issue_spec.rb'
+ - 'spec/features/issues/user_resets_their_incoming_email_token_spec.rb'
+ - 'spec/features/markdown/keyboard_shortcuts_spec.rb'
+ - 'spec/features/markdown/observability_spec.rb'
+ - 'spec/features/merge_request/user_can_see_draft_toggle_spec.rb'
+ - 'spec/features/merge_request/user_closes_reopens_merge_request_state_spec.rb'
+ - 'spec/features/merge_request/user_comments_on_whitespace_hidden_diff_spec.rb'
+ - 'spec/features/merge_request/user_creates_discussion_on_diff_file_spec.rb'
+ - 'spec/features/merge_request/user_creates_merge_request_spec.rb'
+ - 'spec/features/merge_request/user_edits_reviewers_sidebar_spec.rb'
+ - 'spec/features/merge_request/user_posts_notes_spec.rb'
+ - 'spec/features/merge_request/user_sees_discussions_navigation_spec.rb'
+ - 'spec/features/merge_requests/user_views_open_merge_requests_spec.rb'
+ - 'spec/features/milestones/user_edits_milestone_spec.rb'
+ - 'spec/features/milestones/user_promotes_milestone_spec.rb'
+ - 'spec/features/milestones/user_views_milestones_spec.rb'
+ - 'spec/features/monitor_sidebar_link_spec.rb'
+ - 'spec/features/profiles/user_uses_comment_template_spec.rb'
+ - 'spec/features/projects/blobs/blame_spec.rb'
+ - 'spec/features/projects/blobs/blob_show_spec.rb'
+ - 'spec/features/projects/blobs/edit_spec.rb'
+ - 'spec/features/projects/blobs/user_views_pipeline_editor_button_spec.rb'
+ - 'spec/features/projects/branches/user_creates_branch_spec.rb'
+ - 'spec/features/projects/branches_spec.rb'
+ - 'spec/features/projects/commit/user_sees_pipelines_tab_spec.rb'
+ - 'spec/features/projects/commit/user_views_user_status_on_commit_spec.rb'
+ - 'spec/features/projects/deploy_keys_spec.rb'
+ - 'spec/features/projects/environments/environment_spec.rb'
+ - 'spec/features/projects/feature_flag_user_lists/user_deletes_feature_flag_user_list_spec.rb'
+ - 'spec/features/projects/feature_flag_user_lists/user_edits_feature_flag_user_list_spec.rb'
+ - 'spec/features/projects/feature_flag_user_lists/user_sees_feature_flag_user_list_details_spec.rb'
+ - 'spec/features/projects/infrastructure_registry_spec.rb'
+ - 'spec/features/projects/issues/email_participants_spec.rb'
+ - 'spec/features/projects/jobs/permissions_spec.rb'
+ - 'spec/features/projects/labels/user_creates_labels_spec.rb'
+ - 'spec/features/projects/labels/user_edits_labels_spec.rb'
+ - 'spec/features/projects/labels/user_promotes_label_spec.rb'
+ - 'spec/features/projects/labels/user_views_labels_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/master_adds_member_with_expiration_date_spec.rb'
+ - 'spec/features/projects/members/user_requests_access_spec.rb'
+ - 'spec/features/projects/merge_request_button_spec.rb'
+ - 'spec/features/projects/new_project_spec.rb'
+ - 'spec/features/projects/packages_spec.rb'
+ - 'spec/features/projects/pages/user_adds_domain_spec.rb'
+ - 'spec/features/projects/pages/user_configures_pages_pipeline_spec.rb'
+ - 'spec/features/projects/pages/user_edits_lets_encrypt_settings_spec.rb'
+ - 'spec/features/projects/pages/user_edits_settings_spec.rb'
+ - 'spec/features/projects/pipelines/pipeline_spec.rb'
+ - 'spec/features/projects/releases/user_creates_release_spec.rb'
+ - 'spec/features/projects/releases/user_views_edit_release_spec.rb'
+ - 'spec/features/projects/releases/user_views_releases_spec.rb'
+ - 'spec/features/projects/settings/access_tokens_spec.rb'
+ - 'spec/features/projects/settings/branch_names_settings_spec.rb'
+ - 'spec/features/projects/settings/service_desk_setting_spec.rb'
+ - 'spec/features/projects/show/clone_button_spec.rb'
+ - 'spec/features/projects/snippets/user_comments_on_snippet_spec.rb'
+ - 'spec/features/projects/snippets/user_updates_snippet_spec.rb'
+ - 'spec/features/projects/snippets/user_views_snippets_spec.rb'
+ - 'spec/features/projects/tags/user_edits_tags_spec.rb'
+ - 'spec/features/projects/terraform_spec.rb'
+ - 'spec/features/projects/user_sees_user_popover_spec.rb'
+ - 'spec/features/projects/user_views_empty_project_spec.rb'
+ - 'spec/features/projects/work_items/work_item_children_spec.rb'
+ - 'spec/features/projects/work_items/work_item_spec.rb'
+ - 'spec/features/promotion_spec.rb'
+ - 'spec/features/registrations/oauth_registration_spec.rb'
+ - 'spec/features/reportable_note/snippets_spec.rb'
+ - 'spec/features/runners_spec.rb'
+ - 'spec/features/search/user_searches_for_code_spec.rb'
+ - 'spec/features/search/user_searches_for_comments_spec.rb'
+ - 'spec/features/search/user_searches_for_commits_spec.rb'
+ - 'spec/features/search/user_searches_for_issues_spec.rb'
+ - 'spec/features/search/user_searches_for_milestones_spec.rb'
+ - 'spec/features/search/user_searches_for_users_spec.rb'
+ - 'spec/features/search/user_searches_for_wiki_pages_spec.rb'
+ - 'spec/features/search/user_uses_header_search_field_spec.rb'
+ - 'spec/features/user_can_display_performance_bar_spec.rb'
+ - 'spec/features/user_sorts_things_spec.rb'
+ - 'spec/finders/alert_management/alerts_finder_spec.rb'
+ - 'spec/finders/autocomplete/deploy_keys_with_write_access_finder_spec.rb'
+ - 'spec/finders/autocomplete/routes_finder_spec.rb'
+ - 'spec/finders/autocomplete/users_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/clusters/agent_tokens_finder_spec.rb'
+ - 'spec/finders/concerns/finder_with_group_hierarchy_spec.rb'
+ - 'spec/finders/container_repositories_finder_spec.rb'
+ - 'spec/finders/crm/contacts_finder_spec.rb'
+ - 'spec/finders/crm/organizations_finder_spec.rb'
+ - 'spec/finders/deploy_tokens/tokens_finder_spec.rb'
+ - 'spec/finders/design_management/designs_finder_spec.rb'
+ - 'spec/finders/design_management/versions_finder_spec.rb'
+ - 'spec/finders/environments/environments_finder_spec.rb'
+ - 'spec/finders/group_members_finder_spec.rb'
+ - 'spec/finders/groups/accepting_project_creations_finder_spec.rb'
+ - 'spec/finders/groups/accepting_project_imports_finder_spec.rb'
+ - 'spec/finders/groups/accepting_project_shares_finder_spec.rb'
+ - 'spec/finders/groups/accepting_project_transfers_finder_spec.rb'
+ - 'spec/finders/groups_finder_spec.rb'
+ - 'spec/finders/incident_management/timeline_event_tags_finder_spec.rb'
+ - 'spec/finders/incident_management/timeline_events_finder_spec.rb'
+ - 'spec/finders/labels_finder_spec.rb'
+ - 'spec/finders/merge_request/metrics_finder_spec.rb'
+ - 'spec/finders/merge_requests_finder_spec.rb'
+ - 'spec/finders/packages/composer/packages_finder_spec.rb'
+ - 'spec/finders/packages/group_packages_finder_spec.rb'
+ - 'spec/finders/packages/maven/package_finder_spec.rb'
+ - 'spec/finders/packages/nuget/package_finder_spec.rb'
+ - 'spec/finders/packages/pypi/packages_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_finder_spec.rb'
+ - 'spec/finders/releases_finder_spec.rb'
+ - 'spec/finders/terraform/states_finder_spec.rb'
+ - 'spec/finders/user_group_notification_settings_finder_spec.rb'
+ - 'spec/frontend/fixtures/autocomplete.rb'
+ - 'spec/frontend/fixtures/autocomplete_sources.rb'
+ - 'spec/frontend/fixtures/groups.rb'
+ - 'spec/frontend/fixtures/metrics_dashboard.rb'
+ - 'spec/frontend/fixtures/milestones.rb'
+ - 'spec/frontend/fixtures/pipelines.rb'
+ - 'spec/frontend/fixtures/project.rb'
+ - 'spec/frontend/fixtures/releases.rb'
+ - 'spec/frontend/fixtures/runner.rb'
+ - 'spec/frontend/fixtures/users.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/branches/create_spec.rb'
+ - 'spec/graphql/mutations/ci/job_token_scope/add_project_spec.rb'
+ - 'spec/graphql/mutations/ci/job_token_scope/remove_project_spec.rb'
+ - 'spec/graphql/mutations/commits/create_spec.rb'
+ - 'spec/graphql/mutations/custom_emoji/create_spec.rb'
+ - 'spec/graphql/mutations/custom_emoji/destroy_spec.rb'
+ - 'spec/graphql/mutations/customer_relations/contacts/update_spec.rb'
+ - 'spec/graphql/mutations/customer_relations/organizations/create_spec.rb'
+ - 'spec/graphql/mutations/customer_relations/organizations/update_spec.rb'
+ - 'spec/graphql/mutations/incident_management/timeline_event/create_spec.rb'
+ - 'spec/graphql/mutations/incident_management/timeline_event/destroy_spec.rb'
+ - 'spec/graphql/mutations/incident_management/timeline_event/promote_from_note_spec.rb'
+ - 'spec/graphql/mutations/incident_management/timeline_event/update_spec.rb'
+ - 'spec/graphql/mutations/incident_management/timeline_event_tag/create_spec.rb'
+ - 'spec/graphql/mutations/issues/create_spec.rb'
+ - 'spec/graphql/mutations/issues/move_spec.rb'
+ - 'spec/graphql/mutations/issues/set_subscription_spec.rb'
+ - 'spec/graphql/mutations/issues/update_spec.rb'
+ - 'spec/graphql/mutations/merge_requests/create_spec.rb'
+ - 'spec/graphql/mutations/merge_requests/set_subscription_spec.rb'
+ - 'spec/graphql/mutations/releases/create_spec.rb'
+ - 'spec/graphql/mutations/releases/delete_spec.rb'
+ - 'spec/graphql/mutations/releases/update_spec.rb'
+ - 'spec/graphql/mutations/timelogs/delete_spec.rb'
+ - 'spec/graphql/mutations/users/set_namespace_commit_email_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/blobs_resolver_spec.rb'
+ - 'spec/graphql/resolvers/board_list_resolver_spec.rb'
+ - 'spec/graphql/resolvers/ci/config_resolver_spec.rb'
+ - 'spec/graphql/resolvers/ci/project_pipeline_counts_resolver_spec.rb'
+ - 'spec/graphql/resolvers/clusters/agents_resolver_spec.rb'
+ - 'spec/graphql/resolvers/concerns/resolves_pipelines_spec.rb'
+ - 'spec/graphql/resolvers/crm/contact_state_counts_resolver_spec.rb'
+ - 'spec/graphql/resolvers/crm/contacts_resolver_spec.rb'
+ - 'spec/graphql/resolvers/crm/organization_state_counts_resolver_spec.rb'
+ - 'spec/graphql/resolvers/crm/organizations_resolver_spec.rb'
+ - 'spec/graphql/resolvers/data_transfer/group_data_transfer_resolver_spec.rb'
+ - 'spec/graphql/resolvers/data_transfer/project_data_transfer_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/group_issues_resolver_spec.rb'
+ - 'spec/graphql/resolvers/group_members/notification_email_resolver_spec.rb'
+ - 'spec/graphql/resolvers/group_milestones_resolver_spec.rb'
+ - 'spec/graphql/resolvers/group_releases_resolver_spec.rb'
+ - 'spec/graphql/resolvers/incident_management/timeline_event_tags_resolver_spec.rb'
+ - 'spec/graphql/resolvers/incident_management/timeline_events_resolver_spec.rb'
+ - 'spec/graphql/resolvers/merge_requests_count_resolver_spec.rb'
+ - 'spec/graphql/resolvers/merge_requests_resolver_spec.rb'
+ - 'spec/graphql/resolvers/nested_groups_resolver_spec.rb'
+ - 'spec/graphql/resolvers/project_issues_resolver_spec.rb'
+ - 'spec/graphql/resolvers/project_jobs_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_resolver_spec.rb'
+ - 'spec/graphql/resolvers/project_pipeline_schedules_resolver_spec.rb'
+ - 'spec/graphql/resolvers/project_pipeline_statistics_resolver_spec.rb'
+ - 'spec/graphql/resolvers/project_pipelines_resolver_spec.rb'
+ - 'spec/graphql/resolvers/projects/jira_projects_resolver_spec.rb'
+ - 'spec/graphql/resolvers/projects/services_resolver_spec.rb'
+ - 'spec/graphql/resolvers/release_resolver_spec.rb'
+ - 'spec/graphql/resolvers/releases_resolver_spec.rb'
+ - 'spec/graphql/resolvers/snippets_resolver_spec.rb'
+ - 'spec/graphql/resolvers/user_discussions_count_resolver_spec.rb'
+ - 'spec/graphql/resolvers/user_notes_count_resolver_spec.rb'
+ - 'spec/graphql/resolvers/users/snippets_resolver_spec.rb'
+ - 'spec/graphql/types/ci/pipeline_counts_type_spec.rb'
+ - 'spec/graphql/types/environment_type_spec.rb'
+ - 'spec/graphql/types/issue_type_spec.rb'
+ - 'spec/graphql/types/project_type_spec.rb'
+ - 'spec/graphql/types/terraform/state_version_type_spec.rb'
+ - 'spec/graphql/types/todo_type_spec.rb'
+ - 'spec/graphql/types/user_merge_request_interaction_type_spec.rb'
+ - 'spec/graphql/types/user_type_spec.rb'
+ - 'spec/helpers/admin/user_actions_helper_spec.rb'
+ - 'spec/helpers/broadcast_messages_helper_spec.rb'
+ - 'spec/helpers/ci/pipelines_helper_spec.rb'
+ - 'spec/helpers/clusters_helper_spec.rb'
+ - 'spec/helpers/events_helper_spec.rb'
+ - 'spec/helpers/groups_helper_spec.rb'
+ - 'spec/helpers/issuables_helper_spec.rb'
+ - 'spec/helpers/packages_helper_spec.rb'
+ - 'spec/helpers/projects/pipeline_helper_spec.rb'
+ - 'spec/helpers/projects/project_members_helper_spec.rb'
+ - 'spec/helpers/projects_helper_spec.rb'
+ - 'spec/helpers/search_helper_spec.rb'
+ - 'spec/helpers/timeboxes_helper_spec.rb'
+ - 'spec/helpers/tree_helper_spec.rb'
+ - 'spec/helpers/users/group_callouts_helper_spec.rb'
+ - 'spec/helpers/web_hooks/web_hooks_helper_spec.rb'
+ - 'spec/lib/api/entities/release_spec.rb'
+ - 'spec/lib/api/helpers/packages_helpers_spec.rb'
+ - 'spec/lib/api/helpers_spec.rb'
+ - 'spec/lib/banzai/filter/repository_link_filter_spec.rb'
+ - 'spec/lib/banzai/reference_parser/issue_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/work_item_parser_spec.rb'
+ - 'spec/lib/bulk_imports/common/pipelines/boards_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/common/pipelines/labels_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/common/transformers/user_reference_transformer_spec.rb'
+ - 'spec/lib/bulk_imports/groups/pipelines/group_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/groups/pipelines/namespace_settings_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/groups/pipelines/project_entities_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/ci_pipelines_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/commit_notes_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/project_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/references_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/releases_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/snippets_pipeline_spec.rb'
+ - 'spec/lib/gitlab/alert_management/alert_status_counts_spec.rb'
+ - 'spec/lib/gitlab/analytics/cycle_analytics/base_query_builder_spec.rb'
+ - 'spec/lib/gitlab/auth_spec.rb'
+ - 'spec/lib/gitlab/changelog/config_spec.rb'
+ - 'spec/lib/gitlab/ci/components/instance_path_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/file/project_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/processor_spec.rb'
+ - 'spec/lib/gitlab/ci/config_spec.rb'
+ - 'spec/lib/gitlab/ci/lint_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/build/associations_spec.rb'
+ - 'spec/lib/gitlab/ci/status/build/play_spec.rb'
+ - 'spec/lib/gitlab/ci/variables/builder/pipeline_spec.rb'
+ - 'spec/lib/gitlab/cycle_analytics/stage_summary_spec.rb'
+ - 'spec/lib/gitlab/database/schema_validation/track_inconsistency_spec.rb'
+ - 'spec/lib/gitlab/email/handler/service_desk_handler_spec.rb'
+ - 'spec/lib/gitlab/git/repository_spec.rb'
+ - 'spec/lib/gitlab/git_access_wiki_spec.rb'
+ - 'spec/lib/gitlab/group_search_results_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/tree_saver_spec.rb'
+ - 'spec/lib/gitlab/import_export/wiki_repo_saver_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/finder_spec.rb'
+ - 'spec/lib/gitlab/pipeline_scope_counts_spec.rb'
+ - 'spec/lib/gitlab/project_authorizations_spec.rb'
+ - 'spec/lib/gitlab/project_search_results_spec.rb'
+ - 'spec/lib/gitlab/reference_extractor_spec.rb'
+ - 'spec/lib/gitlab/search_results_spec.rb'
+ - 'spec/lib/gitlab/slash_commands/presenters/issue_move_spec.rb'
+ - 'spec/lib/gitlab/tree_summary_spec.rb'
+ - 'spec/mailers/emails/in_product_marketing_spec.rb'
+ - 'spec/models/ci/bridge_spec.rb'
+ - 'spec/models/ci/catalog/listing_spec.rb'
+ - 'spec/models/ci/pipeline_spec.rb'
+ - 'spec/models/ci/processable_spec.rb'
+ - 'spec/models/concerns/has_user_type_spec.rb'
+ - 'spec/models/concerns/loaded_in_group_list_spec.rb'
+ - 'spec/models/event_spec.rb'
+ - 'spec/models/group_spec.rb'
+ - 'spec/models/integrations/microsoft_teams_spec.rb'
+ - 'spec/models/issue_spec.rb'
+ - 'spec/models/members/group_member_spec.rb'
+ - 'spec/models/members/project_member_spec.rb'
+ - 'spec/models/namespace_spec.rb'
+ - 'spec/models/note_spec.rb'
+ - 'spec/models/preloaders/user_max_access_level_in_projects_preloader_spec.rb'
+ - 'spec/models/preloaders/users_max_access_level_by_project_preloader_spec.rb'
+ - 'spec/models/project_spec.rb'
+ - 'spec/models/project_team_spec.rb'
+ - 'spec/models/protected_branch_spec.rb'
+ - 'spec/models/users/merge_request_interaction_spec.rb'
+ - 'spec/policies/alert_management/alert_policy_spec.rb'
+ - 'spec/policies/ci/pipeline_schedule_policy_spec.rb'
+ - 'spec/policies/incident_management/timeline_event_policy_spec.rb'
+ - 'spec/policies/issuable_policy_spec.rb'
+ - 'spec/policies/merge_request_policy_spec.rb'
+ - 'spec/policies/packages/package_policy_spec.rb'
+ - 'spec/policies/project_snippet_policy_spec.rb'
+ - 'spec/policies/resource_label_event_policy_spec.rb'
+ - 'spec/policies/resource_milestone_event_policy_spec.rb'
+ - 'spec/policies/resource_state_event_policy_spec.rb'
+ - 'spec/policies/timelog_policy_spec.rb'
+ - 'spec/presenters/ci/pipeline_presenter_spec.rb'
+ - 'spec/presenters/ci/trigger_presenter_spec.rb'
+ - 'spec/presenters/milestone_presenter_spec.rb'
+ - 'spec/presenters/project_presenter_spec.rb'
+ - 'spec/presenters/projects/import_export/project_export_presenter_spec.rb'
+ - 'spec/presenters/release_presenter_spec.rb'
+ - 'spec/presenters/snippet_blob_presenter_spec.rb'
+ - 'spec/requests/api/alert_management_alerts_spec.rb'
+ - 'spec/requests/api/api_spec.rb'
+ - 'spec/requests/api/award_emoji_spec.rb'
+ - 'spec/requests/api/bulk_imports_spec.rb'
+ - 'spec/requests/api/ci/pipeline_schedules_spec.rb'
+ - 'spec/requests/api/ci/runner/jobs_artifacts_spec.rb'
+ - 'spec/requests/api/ci/runner/jobs_request_post_spec.rb'
+ - 'spec/requests/api/commits_spec.rb'
+ - 'spec/requests/api/container_repositories_spec.rb'
+ - 'spec/requests/api/deploy_keys_spec.rb'
+ - 'spec/requests/api/deploy_tokens_spec.rb'
+ - 'spec/requests/api/draft_notes_spec.rb'
+ - 'spec/requests/api/environments_spec.rb'
+ - 'spec/requests/api/error_tracking/client_keys_spec.rb'
+ - 'spec/requests/api/files_spec.rb'
+ - 'spec/requests/api/freeze_periods_spec.rb'
+ - 'spec/requests/api/go_proxy_spec.rb'
+ - 'spec/requests/api/graphql/ci/ci_cd_setting_spec.rb'
+ - 'spec/requests/api/graphql/ci/config_variables_spec.rb'
+ - 'spec/requests/api/graphql/ci/group_environment_scopes_spec.rb'
+ - 'spec/requests/api/graphql/ci/group_variables_spec.rb'
+ - 'spec/requests/api/graphql/ci/inherited_ci_variables_spec.rb'
+ - 'spec/requests/api/graphql/ci/manual_variables_spec.rb'
+ - 'spec/requests/api/graphql/ci/project_variables_spec.rb'
+ - 'spec/requests/api/graphql/ci/runner_spec.rb'
+ - 'spec/requests/api/graphql/ci/runners_spec.rb'
+ - 'spec/requests/api/graphql/crm/contacts_spec.rb'
+ - 'spec/requests/api/graphql/custom_emoji_query_spec.rb'
+ - 'spec/requests/api/graphql/group/container_repositories_spec.rb'
+ - 'spec/requests/api/graphql/group/data_transfer_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/merge_requests_spec.rb'
+ - 'spec/requests/api/graphql/group/milestones_spec.rb'
+ - 'spec/requests/api/graphql/group/packages_spec.rb'
+ - 'spec/requests/api/graphql/group/timelogs_spec.rb'
+ - 'spec/requests/api/graphql/group_query_spec.rb'
+ - 'spec/requests/api/graphql/issue/issue_spec.rb'
+ - 'spec/requests/api/graphql/issue_status_counts_spec.rb'
+ - 'spec/requests/api/graphql/merge_request/merge_request_spec.rb'
+ - 'spec/requests/api/graphql/metrics/dashboard/annotations_spec.rb'
+ - 'spec/requests/api/graphql/mutations/alert_management/alerts/create_alert_issue_spec.rb'
+ - 'spec/requests/api/graphql/mutations/alert_management/alerts/todo/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/alert_management/alerts/update_alert_status_spec.rb'
+ - 'spec/requests/api/graphql/mutations/alert_management/http_integration/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/alert_management/http_integration/destroy_spec.rb'
+ - 'spec/requests/api/graphql/mutations/alert_management/http_integration/reset_token_spec.rb'
+ - 'spec/requests/api/graphql/mutations/alert_management/http_integration/update_spec.rb'
+ - 'spec/requests/api/graphql/mutations/alert_management/prometheus_integration/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/alert_management/prometheus_integration/reset_token_spec.rb'
+ - 'spec/requests/api/graphql/mutations/alert_management/prometheus_integration/update_spec.rb'
+ - 'spec/requests/api/graphql/mutations/award_emojis/add_spec.rb'
+ - 'spec/requests/api/graphql/mutations/branches/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/ci/job_token_scope/add_project_spec.rb'
+ - 'spec/requests/api/graphql/mutations/ci/job_token_scope/remove_project_spec.rb'
+ - 'spec/requests/api/graphql/mutations/ci/pipeline_schedule_create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/ci/pipeline_schedule_delete_spec.rb'
+ - 'spec/requests/api/graphql/mutations/ci/pipeline_schedule_play_spec.rb'
+ - 'spec/requests/api/graphql/mutations/ci/pipeline_schedule_update_spec.rb'
+ - 'spec/requests/api/graphql/mutations/ci/project_ci_cd_settings_update_spec.rb'
+ - 'spec/requests/api/graphql/mutations/ci/runner/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/commits/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/custom_emoji/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/custom_emoji/destroy_spec.rb'
+ - 'spec/requests/api/graphql/mutations/groups/update_spec.rb'
+ - 'spec/requests/api/graphql/mutations/incident_management/timeline_event/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/incident_management/timeline_event/destroy_spec.rb'
+ - 'spec/requests/api/graphql/mutations/incident_management/timeline_event/promote_from_note_spec.rb'
+ - 'spec/requests/api/graphql/mutations/incident_management/timeline_event/update_spec.rb'
+ - 'spec/requests/api/graphql/mutations/incident_management/timeline_event_tag/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/issues/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/issues/link_alerts_spec.rb'
+ - 'spec/requests/api/graphql/mutations/issues/move_spec.rb'
+ - 'spec/requests/api/graphql/mutations/issues/set_crm_contacts_spec.rb'
+ - 'spec/requests/api/graphql/mutations/issues/set_locked_spec.rb'
+ - 'spec/requests/api/graphql/mutations/issues/update_spec.rb'
+ - 'spec/requests/api/graphql/mutations/jira_import/import_users_spec.rb'
+ - 'spec/requests/api/graphql/mutations/merge_requests/accept_spec.rb'
+ - 'spec/requests/api/graphql/mutations/merge_requests/set_assignees_spec.rb'
+ - 'spec/requests/api/graphql/mutations/merge_requests/set_reviewers_spec.rb'
+ - 'spec/requests/api/graphql/mutations/metrics/dashboard/annotations/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/metrics/dashboard/annotations/delete_spec.rb'
+ - 'spec/requests/api/graphql/mutations/packages/bulk_destroy_spec.rb'
+ - 'spec/requests/api/graphql/mutations/packages/destroy_files_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/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/graphql/namespace/projects_spec.rb'
+ - 'spec/requests/api/graphql/namespace_query_spec.rb'
+ - 'spec/requests/api/graphql/notes/note_spec.rb'
+ - 'spec/requests/api/graphql/notes/synthetic_note_resolver_spec.rb'
+ - 'spec/requests/api/graphql/packages/package_spec.rb'
+ - 'spec/requests/api/graphql/project/alert_management/alert/assignees_spec.rb'
+ - 'spec/requests/api/graphql/project/alert_management/alert/issue_spec.rb'
+ - 'spec/requests/api/graphql/project/alert_management/alert/metrics_dashboard_url_spec.rb'
+ - 'spec/requests/api/graphql/project/alert_management/alert/notes_spec.rb'
+ - 'spec/requests/api/graphql/project/alert_management/alert/todos_spec.rb'
+ - 'spec/requests/api/graphql/project/alert_management/alert_status_counts_spec.rb'
+ - 'spec/requests/api/graphql/project/alert_management/alerts_spec.rb'
+ - 'spec/requests/api/graphql/project/alert_management/integrations_spec.rb'
+ - 'spec/requests/api/graphql/project/base_service_spec.rb'
+ - 'spec/requests/api/graphql/project/branch_rules/branch_protection_spec.rb'
+ - 'spec/requests/api/graphql/project/branch_rules_spec.rb'
+ - 'spec/requests/api/graphql/project/ci_access_authorized_agents_spec.rb'
+ - 'spec/requests/api/graphql/project/data_transfer_spec.rb'
+ - 'spec/requests/api/graphql/project/grafana_integration_spec.rb'
+ - 'spec/requests/api/graphql/project/incident_management/timeline_events_spec.rb'
+ - 'spec/requests/api/graphql/project/issue/design_collection/version_spec.rb'
+ - 'spec/requests/api/graphql/project/issue/designs/notes_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/jira_service_spec.rb'
+ - 'spec/requests/api/graphql/project/job_spec.rb'
+ - 'spec/requests/api/graphql/project/merge_request_spec.rb'
+ - 'spec/requests/api/graphql/project/milestones_spec.rb'
+ - 'spec/requests/api/graphql/project/project_members_spec.rb'
+ - 'spec/requests/api/graphql/project/project_pipeline_statistics_spec.rb'
+ - 'spec/requests/api/graphql/project/project_statistics_redirect_spec.rb'
+ - 'spec/requests/api/graphql/project/runners_spec.rb'
+ - 'spec/requests/api/graphql/project/user_access_authorized_agents_spec.rb'
+ - 'spec/requests/api/graphql/project/work_items_spec.rb'
+ - 'spec/requests/api/graphql/query_spec.rb'
+ - 'spec/requests/api/graphql/subscriptions/notes/created_spec.rb'
+ - 'spec/requests/api/graphql/subscriptions/notes/deleted_spec.rb'
+ - 'spec/requests/api/graphql/subscriptions/notes/updated_spec.rb'
+ - 'spec/requests/api/graphql/subscriptions/work_item_updated_spec.rb'
+ - 'spec/requests/api/graphql/todo_query_spec.rb'
+ - 'spec/requests/api/graphql/user/starred_projects_query_spec.rb'
+ - 'spec/requests/api/graphql/users/set_namespace_commit_email_spec.rb'
+ - 'spec/requests/api/graphql/work_item_spec.rb'
+ - 'spec/requests/api/group_boards_spec.rb'
+ - 'spec/requests/api/group_container_repositories_spec.rb'
+ - 'spec/requests/api/group_export_spec.rb'
+ - 'spec/requests/api/group_import_spec.rb'
+ - 'spec/requests/api/group_milestones_spec.rb'
+ - 'spec/requests/api/groups_spec.rb'
+ - 'spec/requests/api/issue_links_spec.rb'
+ - 'spec/requests/api/issues/get_group_issues_spec.rb'
+ - 'spec/requests/api/issues/issues_spec.rb'
+ - 'spec/requests/api/labels_spec.rb'
+ - 'spec/requests/api/lint_spec.rb'
+ - 'spec/requests/api/maven_packages_spec.rb'
+ - 'spec/requests/api/merge_request_approvals_spec.rb'
+ - 'spec/requests/api/merge_requests_spec.rb'
+ - 'spec/requests/api/metrics/dashboard/annotations_spec.rb'
+ - 'spec/requests/api/metrics/user_starred_dashboards_spec.rb'
+ - 'spec/requests/api/nuget_group_packages_spec.rb'
+ - 'spec/requests/api/package_files_spec.rb'
+ - 'spec/requests/api/pages/internal_access_spec.rb'
+ - 'spec/requests/api/pages/pages_spec.rb'
+ - 'spec/requests/api/pages/private_access_spec.rb'
+ - 'spec/requests/api/pages/public_access_spec.rb'
+ - 'spec/requests/api/pages_domains_spec.rb'
+ - 'spec/requests/api/project_clusters_spec.rb'
+ - 'spec/requests/api/project_export_spec.rb'
+ - 'spec/requests/api/project_job_token_scope_spec.rb'
+ - 'spec/requests/api/project_milestones_spec.rb'
+ - 'spec/requests/api/project_packages_spec.rb'
+ - 'spec/requests/api/project_snippets_spec.rb'
+ - 'spec/requests/api/project_statistics_spec.rb'
+ - 'spec/requests/api/project_templates_spec.rb'
+ - 'spec/requests/api/projects_spec.rb'
+ - 'spec/requests/api/protected_tags_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/rpm_project_packages_spec.rb'
+ - 'spec/requests/api/rubygem_packages_spec.rb'
+ - 'spec/requests/api/search_spec.rb'
+ - 'spec/requests/api/terraform/modules/v1/packages_spec.rb'
+ - 'spec/requests/api/v3/github_spec.rb'
+ - 'spec/requests/api/wikis_spec.rb'
+ - 'spec/requests/concerns/planning_hierarchy_spec.rb'
+ - 'spec/requests/groups/deploy_tokens_controller_spec.rb'
+ - 'spec/requests/groups/email_campaigns_controller_spec.rb'
+ - 'spec/requests/groups/settings/access_tokens_controller_spec.rb'
+ - 'spec/requests/groups/settings/applications_controller_spec.rb'
+ - 'spec/requests/groups/usage_quotas_controller_spec.rb'
+ - 'spec/requests/groups_controller_spec.rb'
+ - 'spec/requests/lfs_http_spec.rb'
+ - 'spec/requests/lfs_locks_api_spec.rb'
+ - 'spec/requests/projects/aws/configuration_controller_spec.rb'
+ - 'spec/requests/projects/commits_controller_spec.rb'
+ - 'spec/requests/projects/google_cloud/configuration_controller_spec.rb'
+ - 'spec/requests/projects/google_cloud/databases_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/incident_management/timeline_events_spec.rb'
+ - 'spec/requests/projects/issues/discussions_spec.rb'
+ - 'spec/requests/projects/issues_controller_spec.rb'
+ - 'spec/requests/projects/merge_requests/content_spec.rb'
+ - 'spec/requests/projects/merge_requests/context_commit_diffs_spec.rb'
+ - 'spec/requests/projects/merge_requests/diffs_spec.rb'
+ - 'spec/requests/projects/merge_requests_controller_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/work_items_spec.rb'
+ - 'spec/requests/projects_controller_spec.rb'
+ - 'spec/requests/rack_attack_global_spec.rb'
+ - 'spec/serializers/ci/pipeline_entity_spec.rb'
+ - 'spec/serializers/container_repository_entity_spec.rb'
+ - 'spec/serializers/container_tag_entity_spec.rb'
+ - 'spec/serializers/fork_namespace_entity_spec.rb'
+ - 'spec/serializers/group_access_token_entity_spec.rb'
+ - 'spec/serializers/group_access_token_serializer_spec.rb'
+ - 'spec/serializers/merge_request_poll_widget_entity_spec.rb'
+ - 'spec/serializers/profile/event_entity_spec.rb'
+ - 'spec/serializers/project_access_token_entity_spec.rb'
+ - 'spec/serializers/project_access_token_serializer_spec.rb'
+ - 'spec/services/alert_management/create_alert_issue_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/destroy_service_spec.rb'
+ - 'spec/services/boards/issues/list_service_spec.rb'
+ - 'spec/services/boards/issues/move_service_spec.rb'
+ - 'spec/services/bulk_imports/create_service_spec.rb'
+ - 'spec/services/bulk_imports/export_service_spec.rb'
+ - 'spec/services/bulk_imports/relation_export_service_spec.rb'
+ - 'spec/services/ci/build_cancel_service_spec.rb'
+ - 'spec/services/ci/build_unschedule_service_spec.rb'
+ - 'spec/services/ci/components/fetch_service_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/evaluate_runner_tags_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/needs_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/parent_child_pipeline_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/rate_limit_spec.rb'
+ - 'spec/services/ci/create_pipeline_service_spec.rb'
+ - 'spec/services/ci/create_web_ide_terminal_service_spec.rb'
+ - 'spec/services/ci/external_pull_requests/create_pipeline_service_spec.rb'
+ - 'spec/services/ci/job_artifacts/bulk_delete_by_project_service_spec.rb'
+ - 'spec/services/ci/job_token_scope/add_project_service_spec.rb'
+ - 'spec/services/ci/job_token_scope/remove_project_service_spec.rb'
+ - 'spec/services/ci/pipeline_trigger_service_spec.rb'
+ - 'spec/services/ci/retry_pipeline_service_spec.rb'
+ - 'spec/services/ci/runners/assign_runner_service_spec.rb'
+ - 'spec/services/ci/runners/bulk_delete_runners_service_spec.rb'
+ - 'spec/services/ci/runners/create_runner_service_spec.rb'
+ - 'spec/services/design_management/delete_designs_service_spec.rb'
+ - 'spec/services/discussions/resolve_service_spec.rb'
+ - 'spec/services/discussions/unresolve_service_spec.rb'
+ - 'spec/services/environments/schedule_to_delete_review_apps_service_spec.rb'
+ - 'spec/services/files/base_service_spec.rb'
+ - 'spec/services/git/branch_push_service_spec.rb'
+ - 'spec/services/google_cloud/generate_pipeline_service_spec.rb'
+ - 'spec/services/groups/auto_devops_service_spec.rb'
+ - 'spec/services/groups/autocomplete_service_spec.rb'
+ - 'spec/services/groups/group_links/create_service_spec.rb'
+ - 'spec/services/groups/group_links/destroy_service_spec.rb'
+ - 'spec/services/groups/group_links/update_service_spec.rb'
+ - 'spec/services/groups/merge_requests_count_service_spec.rb'
+ - 'spec/services/groups/open_issues_count_service_spec.rb'
+ - 'spec/services/groups/transfer_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/github/cancel_project_import_service_spec.rb'
+ - 'spec/services/incident_management/timeline_event_tags/create_service_spec.rb'
+ - 'spec/services/incident_management/timeline_events/update_service_spec.rb'
+ - 'spec/services/integrations/slack_interactions/incident_management/incident_modal_submit_service_spec.rb'
+ - 'spec/services/integrations/slack_options/label_search_handler_spec.rb'
+ - 'spec/services/integrations/slack_options/user_search_handler_spec.rb'
+ - 'spec/services/issuable/bulk_update_service_spec.rb'
+ - 'spec/services/issue_links/create_service_spec.rb'
+ - 'spec/services/issue_links/destroy_service_spec.rb'
+ - 'spec/services/issues/clone_service_spec.rb'
+ - 'spec/services/issues/create_service_spec.rb'
+ - 'spec/services/issues/move_service_spec.rb'
+ - 'spec/services/issues/reorder_service_spec.rb'
+ - 'spec/services/issues/set_crm_contacts_service_spec.rb'
+ - 'spec/services/issues/update_service_spec.rb'
+ - 'spec/services/jira_connect_subscriptions/create_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/jira_import/users_importer_spec.rb'
+ - 'spec/services/labels/transfer_service_spec.rb'
+ - 'spec/services/members/approve_access_request_service_spec.rb'
+ - 'spec/services/members/destroy_service_spec.rb'
+ - 'spec/services/members/unassign_issuables_service_spec.rb'
+ - 'spec/services/members/update_service_spec.rb'
+ - 'spec/services/merge_requests/add_spent_time_service_spec.rb'
+ - 'spec/services/merge_requests/post_merge_service_spec.rb'
+ - 'spec/services/merge_requests/retarget_chain_service_spec.rb'
+ - 'spec/services/merge_requests/update_assignees_service_spec.rb'
+ - 'spec/services/merge_requests/update_reviewers_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/default_embed_service_spec.rb'
+ - 'spec/services/metrics/dashboard/dynamic_embed_service_spec.rb'
+ - 'spec/services/metrics/dashboard/pod_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/namespaces/in_product_marketing_emails_service_spec.rb'
+ - 'spec/services/notes/build_service_spec.rb'
+ - 'spec/services/notes/create_service_spec.rb'
+ - 'spec/services/notes/quick_actions_service_spec.rb'
+ - 'spec/services/notification_recipients/builder/new_note_spec.rb'
+ - 'spec/services/notification_service_spec.rb'
+ - 'spec/services/packages/conan/search_service_spec.rb'
+ - 'spec/services/packages/mark_packages_for_destruction_service_spec.rb'
+ - 'spec/services/packages/maven/metadata/sync_service_spec.rb'
+ - 'spec/services/packages/nuget/search_service_spec.rb'
+ - 'spec/services/packages/rubygems/dependency_resolver_service_spec.rb'
+ - 'spec/services/pages_domains/create_service_spec.rb'
+ - 'spec/services/post_receive_service_spec.rb'
+ - 'spec/services/projects/autocomplete_service_spec.rb'
+ - 'spec/services/projects/container_repository/destroy_service_spec.rb'
+ - 'spec/services/projects/create_service_spec.rb'
+ - 'spec/services/projects/group_links/create_service_spec.rb'
+ - 'spec/services/projects/group_links/destroy_service_spec.rb'
+ - 'spec/services/projects/group_links/update_service_spec.rb'
+ - 'spec/services/projects/import_export/export_service_spec.rb'
+ - 'spec/services/projects/operations/update_service_spec.rb'
+ - 'spec/services/projects/participants_service_spec.rb'
+ - 'spec/services/projects/transfer_service_spec.rb'
+ - 'spec/services/protected_branches/cache_service_spec.rb'
+ - 'spec/services/quick_actions/interpret_service_spec.rb'
+ - 'spec/services/releases/links/create_service_spec.rb'
+ - 'spec/services/releases/links/destroy_service_spec.rb'
+ - 'spec/services/releases/links/update_service_spec.rb'
+ - 'spec/services/resource_access_tokens/revoke_service_spec.rb'
+ - 'spec/services/search/global_service_spec.rb'
+ - 'spec/services/search_service_spec.rb'
+ - 'spec/services/security/ci_configuration/sast_create_service_spec.rb'
+ - 'spec/services/service_desk/custom_email_verifications/create_service_spec.rb'
+ - 'spec/services/snippets/bulk_destroy_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/tasks_to_be_done/base_service_spec.rb'
+ - 'spec/services/todo_service_spec.rb'
+ - 'spec/services/todos/destroy/entity_leave_service_spec.rb'
+ - 'spec/services/uploads/destroy_service_spec.rb'
+ - 'spec/services/users/set_namespace_commit_email_service_spec.rb'
+ - 'spec/services/work_items/import_csv_service_spec.rb'
+ - 'spec/services/work_items/parent_links/base_service_spec.rb'
+ - 'spec/services/work_items/parent_links/create_service_spec.rb'
+ - 'spec/services/work_items/parent_links/destroy_service_spec.rb'
+ - 'spec/services/work_items/parent_links/reorder_service_spec.rb'
+ - 'spec/services/work_items/update_service_spec.rb'
+ - 'spec/services/work_items/widgets/description_service/update_service_spec.rb'
+ - 'spec/services/work_items/widgets/hierarchy_service/create_service_spec.rb'
+ - 'spec/services/work_items/widgets/hierarchy_service/update_service_spec.rb'
+ - 'spec/support/helpers/cycle_analytics_helpers/test_generation.rb'
+ - 'spec/support/shared_contexts/changes_access_checks_shared_context.rb'
+ - 'spec/support/shared_contexts/design_management_shared_contexts.rb'
+ - 'spec/support/shared_contexts/features/integrations/project_integrations_shared_context.rb'
+ - 'spec/support/shared_contexts/sentry_error_tracking_shared_context.rb'
+ - 'spec/support/shared_examples/features/board_sidebar_labels_examples.rb'
+ - 'spec/support/shared_examples/features/search/redacted_search_results_shared_examples.rb'
+ - 'spec/support/shared_examples/features/snippets_shared_examples.rb'
+ - 'spec/support/shared_examples/finders/issues_finder_shared_examples.rb'
+ - 'spec/support/shared_examples/graphql/members_shared_examples.rb'
+ - 'spec/support/shared_examples/graphql/mutations/security/ci_configuration_shared_examples.rb'
+ - 'spec/support/shared_examples/models/chat_integration_shared_examples.rb'
+ - 'spec/support/shared_examples/quick_actions/issue/issue_links_quick_actions_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/graphql/projects/branch_protections/access_level_request_examples.rb'
+ - 'spec/support/shared_examples/services/container_registry_auth_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/issuable/issuable_import_csv_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/security/ci_configuration/create_service_shared_examples.rb'
+ - 'spec/views/groups/group_members/index.html.haml_spec.rb'
+ - 'spec/views/layouts/header/_new_dropdown.haml_spec.rb'
+ - 'spec/views/projects/issues/_service_desk_info_content.html.haml_spec.rb'
+ - 'spec/views/projects/pages/new.html.haml_spec.rb'
+ - 'spec/views/projects/project_members/index.html.haml_spec.rb'
+ - 'spec/workers/group_destroy_worker_spec.rb'
+ - 'spec/workers/merge_requests/update_head_pipeline_worker_spec.rb'
+ - 'spec/workers/pipeline_schedule_worker_spec.rb'
diff --git a/.rubocop_todo/rspec/context_wording.yml b/.rubocop_todo/rspec/context_wording.yml
index d32abc64f94..c1751ebed4c 100644
--- a/.rubocop_todo/rspec/context_wording.yml
+++ b/.rubocop_todo/rspec/context_wording.yml
@@ -1,5 +1,6 @@
---
RSpec/ContextWording:
+ Details: grace period
Exclude:
- 'ee/spec/controllers/admin/application_settings_controller_spec.rb'
- 'ee/spec/controllers/admin/audit_logs_controller_spec.rb'
@@ -64,10 +65,6 @@ RSpec/ContextWording:
- 'ee/spec/controllers/subscriptions_controller_spec.rb'
- 'ee/spec/controllers/trial_registrations_controller_spec.rb'
- 'ee/spec/controllers/users_controller_spec.rb'
- - 'ee/spec/elastic/migrate/20220119120500_populate_commit_permissions_in_main_index_spec.rb'
- - 'ee/spec/elastic/migrate/20220512150000_pause_indexing_for_unsupported_es_versions_spec.rb'
- - 'ee/spec/elastic/migrate/20220613120500_migrate_commits_to_separate_index_spec.rb'
- - 'ee/spec/elastic/migrate/20220713103500_delete_commits_from_original_index_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'
@@ -87,6 +84,7 @@ RSpec/ContextWording:
- '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_spec.rb'
+ - 'ee/spec/features/boards/user_visits_board_spec.rb'
- 'ee/spec/features/dashboards/todos_spec.rb'
- 'ee/spec/features/discussion_comments/epic_quick_actions_spec.rb'
- 'ee/spec/features/epic_boards/epic_boards_sidebar_spec.rb'
@@ -125,7 +123,6 @@ RSpec/ContextWording:
- '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'
@@ -168,7 +165,6 @@ RSpec/ContextWording:
- 'ee/spec/features/promotion_spec.rb'
- 'ee/spec/features/protected_branches_spec.rb'
- 'ee/spec/features/signup_spec.rb'
- - 'ee/spec/features/trial_registrations/company_information_spec.rb'
- 'ee/spec/features/users/login_spec.rb'
- 'ee/spec/features/users/signup_spec.rb'
- 'ee/spec/finders/approval_rules/group_finder_spec.rb'
@@ -184,7 +180,6 @@ RSpec/ContextWording:
- 'ee/spec/finders/ee/clusters/agents/authorizations/ci_access/finder_spec.rb'
- 'ee/spec/finders/ee/clusters/agents_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'
@@ -207,14 +202,12 @@ RSpec/ContextWording:
- '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/template_finder_spec.rb'
- 'ee/spec/frontend/fixtures/dast_profiles.rb'
- 'ee/spec/frontend/fixtures/on_demand_dast_scans.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/audit_events/streaming/headers/create_spec.rb'
- 'ee/spec/graphql/mutations/audit_events/streaming/headers/destroy_spec.rb'
- 'ee/spec/graphql/mutations/boards/epic_boards/create_spec.rb'
@@ -245,7 +238,6 @@ RSpec/ContextWording:
- 'ee/spec/graphql/resolvers/boards/board_list_epics_resolver_spec.rb'
- 'ee/spec/graphql/resolvers/clusters/agents_resolver_spec.rb'
- 'ee/spec/graphql/resolvers/compliance_management/merge_requests/compliance_violation_resolver_spec.rb'
- - 'ee/spec/graphql/resolvers/dora_metrics_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'
@@ -256,6 +248,7 @@ RSpec/ContextWording:
- 'ee/spec/graphql/resolvers/security_report_summary_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/incident_management/oncall_rotation_date_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'
@@ -276,16 +269,15 @@ RSpec/ContextWording:
- '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/groups/security_features_helper_spec.rb'
- 'ee/spec/helpers/license_helper_spec.rb'
- 'ee/spec/helpers/license_monitoring_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/security_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/helpers/web_hooks/web_hooks_helper_spec.rb'
- 'ee/spec/initializers/1_settings_spec.rb'
- 'ee/spec/initializers/session_store_spec.rb'
- 'ee/spec/lib/audit/details_spec.rb'
@@ -310,7 +302,6 @@ RSpec/ContextWording:
- '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/pipeline/quota/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'
@@ -338,7 +329,6 @@ RSpec/ContextWording:
- 'ee/spec/lib/gitlab/analytics/cycle_analytics/request_params_spec.rb'
- 'ee/spec/lib/gitlab/auth/group_saml/gma_membership_enforcer_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'
@@ -369,8 +359,6 @@ RSpec/ContextWording:
- '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'
@@ -432,6 +420,7 @@ RSpec/ContextWording:
- 'ee/spec/models/boards/epic_board_position_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/concerns/approval_rule_like_spec.rb'
@@ -546,7 +535,6 @@ RSpec/ContextWording:
- 'ee/spec/requests/api/ci/runner_spec.rb'
- 'ee/spec/requests/api/commits_spec.rb'
- 'ee/spec/requests/api/deployments_spec.rb'
- - 'ee/spec/requests/api/dora/metrics_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'
@@ -785,6 +773,7 @@ RSpec/ContextWording:
- 'ee/spec/services/merge_requests/reload_merge_head_diff_service_spec.rb'
- 'ee/spec/services/merge_requests/update_blocks_service_spec.rb'
- 'ee/spec/services/milestones/update_service_spec.rb'
+ - 'ee/spec/services/package_metadata/ingestion/ingestion_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'
@@ -829,6 +818,7 @@ RSpec/ContextWording:
- 'ee/spec/services/status_page/publish_attachments_service_spec.rb'
- 'ee/spec/services/status_page/publish_details_service_spec.rb'
- 'ee/spec/services/system_notes/epics_service_spec.rb'
+ - 'ee/spec/services/system_notes/vulnerabilities_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'
@@ -882,7 +872,6 @@ RSpec/ContextWording:
- '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/tasks/gitlab/elastic_rake_spec.rb'
- 'ee/spec/tasks/gitlab/license_rake_spec.rb'
- 'ee/spec/views/admin/application_settings/_elasticsearch_form.html.haml_spec.rb'
- 'ee/spec/views/admin/users/show.html.haml_spec.rb'
@@ -932,6 +921,7 @@ RSpec/ContextWording:
- 'ee/spec/workers/post_receive_spec.rb'
- 'ee/spec/workers/project_import_schedule_worker_spec.rb'
- 'ee/spec/workers/requirements_management/process_requirements_reports_worker_spec.rb'
+ - 'ee/spec/workers/security/store_scans_worker_spec.rb'
- 'ee/spec/workers/security/track_secure_scans_worker_spec.rb'
- 'ee/spec/workers/sync_seat_link_worker_spec.rb'
- 'qa/qa/specs/features/api/1_manage/user_access_termination_spec.rb'
@@ -949,7 +939,6 @@ RSpec/ContextWording:
- '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/push_rules_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'
@@ -960,6 +949,7 @@ RSpec/ContextWording:
- 'qa/spec/support/page_error_checker_spec.rb'
- 'spec/benchmarks/banzai_benchmark.rb'
- 'spec/bin/feature_flag_spec.rb'
+ - 'spec/commands/metrics_server/metrics_server_spec.rb'
- 'spec/commands/sidekiq_cluster/cli_spec.rb'
- 'spec/components/diffs/overflow_warning_component_spec.rb'
- 'spec/components/pajamas/alert_component_spec.rb'
@@ -1008,7 +998,6 @@ RSpec/ContextWording:
- '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'
@@ -1073,6 +1062,7 @@ RSpec/ContextWording:
- 'spec/controllers/projects/web_ide_terminals_controller_spec.rb'
- 'spec/controllers/projects_controller_spec.rb'
- 'spec/controllers/registrations_controller_spec.rb'
+ - 'spec/controllers/repositories/lfs_storage_controller_spec.rb'
- 'spec/controllers/root_controller_spec.rb'
- 'spec/controllers/search_controller_spec.rb'
- 'spec/controllers/sessions_controller_spec.rb'
@@ -1110,13 +1100,10 @@ RSpec/ContextWording:
- '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_health_dashboard_spec.rb'
- 'spec/features/commits_spec.rb'
- 'spec/features/dashboard/activity_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'
@@ -1181,7 +1168,6 @@ RSpec/ContextWording:
- '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/merge_request_discussion_lock_spec.rb'
@@ -1195,7 +1181,6 @@ RSpec/ContextWording:
- 'spec/features/merge_request/user_manages_subscription_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'
@@ -1281,7 +1266,6 @@ RSpec/ContextWording:
- 'spec/features/projects/settings/project_settings_spec.rb'
- 'spec/features/projects/settings/repository_settings_spec.rb'
- 'spec/features/projects/settings/secure_files_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/visibility_settings_spec.rb'
- 'spec/features/projects/settings/webhooks_settings_spec.rb'
@@ -1315,7 +1299,6 @@ RSpec/ContextWording:
- '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'
@@ -1414,7 +1397,6 @@ RSpec/ContextWording:
- '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'
@@ -1448,6 +1430,7 @@ RSpec/ContextWording:
- '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/alert_management/prometheus_integration_type_spec.rb'
- 'spec/graphql/types/base_field_spec.rb'
- 'spec/graphql/types/global_id_type_spec.rb'
- 'spec/graphql/types/issue_type_spec.rb'
@@ -1470,13 +1453,11 @@ RSpec/ContextWording:
- 'spec/helpers/commits_helper_spec.rb'
- 'spec/helpers/diff_helper_spec.rb'
- 'spec/helpers/emails_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/group_members_helper_spec.rb'
- 'spec/helpers/groups_helper_spec.rb'
- - 'spec/helpers/integrations_helper_spec.rb'
- 'spec/helpers/jira_connect_helper_spec.rb'
- 'spec/helpers/labels_helper_spec.rb'
- 'spec/helpers/listbox_helper_spec.rb'
@@ -1496,13 +1477,11 @@ RSpec/ContextWording:
- 'spec/helpers/timeboxes_helper_spec.rb'
- 'spec/helpers/todos_helper_spec.rb'
- 'spec/helpers/tree_helper_spec.rb'
- - 'spec/helpers/users/callouts_helper_spec.rb'
- 'spec/helpers/users_helper_spec.rb'
- 'spec/helpers/visibility_level_helper_spec.rb'
- 'spec/helpers/web_hooks/web_hooks_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/1_acts_as_taggable_spec.rb'
- 'spec/initializers/carrierwave_s3_encryption_headers_patch_spec.rb'
- 'spec/initializers/enumerator_next_patch_spec.rb'
@@ -1515,6 +1494,7 @@ RSpec/ContextWording:
- 'spec/lib/api/entities/basic_project_details_spec.rb'
- 'spec/lib/api/entities/clusters/agents/authorizations/ci_access_spec.rb'
- 'spec/lib/api/entities/nuget/dependency_group_spec.rb'
+ - 'spec/lib/api/entities/nuget/metadatum_spec.rb'
- 'spec/lib/api/entities/user_spec.rb'
- 'spec/lib/api/every_api_endpoint_spec.rb'
- 'spec/lib/api/helpers/caching_spec.rb'
@@ -1536,7 +1516,7 @@ RSpec/ContextWording:
- 'spec/lib/api/validations/validators/untrusted_regexp_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/build_entity_spec.rb'
- 'spec/lib/atlassian/jira_connect/serializers/feature_flag_entity_spec.rb'
- 'spec/lib/atlassian/jira_connect_spec.rb'
- 'spec/lib/backup/gitaly_backup_spec.rb'
@@ -1552,8 +1532,6 @@ RSpec/ContextWording:
- '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/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'
@@ -1645,9 +1623,7 @@ RSpec/ContextWording:
- 'spec/lib/gitlab/authorized_keys_spec.rb'
- 'spec/lib/gitlab/avatar_cache_spec.rb'
- 'spec/lib/gitlab/background_migration/backfill_imported_issue_search_data_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/project_namespaces/backfill_project_namespaces_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'
@@ -1690,7 +1666,6 @@ RSpec/ContextWording:
- '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/security/common_spec.rb'
@@ -1709,6 +1684,7 @@ RSpec/ContextWording:
- 'spec/lib/gitlab/ci/reports/security/aggregated_report_spec.rb'
- 'spec/lib/gitlab/ci/reports/test_suite_comparer_spec.rb'
- 'spec/lib/gitlab/ci/runner_instructions_spec.rb'
+ - 'spec/lib/gitlab/ci/runner_releases_spec.rb'
- 'spec/lib/gitlab/ci/runner_upgrade_check_spec.rb'
- 'spec/lib/gitlab/ci/status/bridge/factory_spec.rb'
- 'spec/lib/gitlab/ci/status/build/failed_spec.rb'
@@ -1716,7 +1692,6 @@ RSpec/ContextWording:
- 'spec/lib/gitlab/ci/status/factory_spec.rb'
- 'spec/lib/gitlab/ci/templates/Jobs/code_quality_gitlab_ci_yaml_spec.rb'
- 'spec/lib/gitlab/ci/templates/Jobs/sast_iac_gitlab_ci_yaml_spec.rb'
- - 'spec/lib/gitlab/ci/templates/Jobs/sast_iac_latest_gitlab_ci_yaml_spec.rb'
- 'spec/lib/gitlab/ci/templates/Jobs/test_gitlab_ci_yaml_spec.rb'
- 'spec/lib/gitlab/ci/templates/auto_devops_gitlab_ci_yaml_spec.rb'
- 'spec/lib/gitlab/ci/templates/templates_spec.rb'
@@ -1756,6 +1731,7 @@ RSpec/ContextWording:
- '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/gitlab_schema_spec.rb'
- 'spec/lib/gitlab/database/load_balancing/connection_proxy_spec.rb'
- 'spec/lib/gitlab/database/load_balancing/load_balancer_spec.rb'
- 'spec/lib/gitlab/database/load_balancing/rack_middleware_spec.rb'
@@ -1764,6 +1740,7 @@ RSpec/ContextWording:
- '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/restrict_gitlab_schema_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'
@@ -1795,7 +1772,6 @@ RSpec/ContextWording:
- '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'
@@ -1846,6 +1822,7 @@ RSpec/ContextWording:
- 'spec/lib/gitlab/git/diff_collection_spec.rb'
- 'spec/lib/gitlab/git/diff_spec.rb'
- 'spec/lib/gitlab/git/merge_base_spec.rb'
+ - 'spec/lib/gitlab/git/pre_receive_error_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'
@@ -1913,6 +1890,7 @@ RSpec/ContextWording:
- '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/references_configuration_spec.rb'
- 'spec/lib/gitlab/import_export/version_checker_spec.rb'
- 'spec/lib/gitlab/instrumentation/redis_base_spec.rb'
- 'spec/lib/gitlab/instrumentation_helper_spec.rb'
@@ -2035,6 +2013,7 @@ RSpec/ContextWording:
- 'spec/lib/gitlab/ssh_public_key_spec.rb'
- 'spec/lib/gitlab/submodule_links_spec.rb'
- 'spec/lib/gitlab/suggestions/commit_message_spec.rb'
+ - 'spec/lib/gitlab/task_helpers_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'
@@ -2062,10 +2041,10 @@ RSpec/ContextWording:
- 'spec/lib/gitlab/usage_data_counters/search_counter_spec.rb'
- 'spec/lib/gitlab/usage_data_spec.rb'
- 'spec/lib/gitlab/utils/lazy_attributes_spec.rb'
+ - 'spec/lib/gitlab/utils/markdown_spec.rb'
- 'spec/lib/gitlab/utils/mime_type_spec.rb'
- - 'spec/lib/gitlab/utils/strong_memoize_spec.rb'
+ - 'spec/lib/gitlab/utils/sanitize_node_link_spec.rb'
- 'spec/lib/gitlab/utils/usage_data_spec.rb'
- - 'spec/lib/gitlab/utils_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'
@@ -2168,6 +2147,7 @@ RSpec/ContextWording:
- '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/counter_attribute_spec.rb'
- 'spec/models/concerns/deployment_platform_spec.rb'
- 'spec/models/concerns/ignorable_columns_spec.rb'
- 'spec/models/concerns/issuable_spec.rb'
@@ -2177,9 +2157,9 @@ RSpec/ContextWording:
- '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/sensitive_serializable_hash_spec.rb'
- 'spec/models/concerns/token_authenticatable_spec.rb'
- 'spec/models/concerns/triggerable_hooks_spec.rb'
- 'spec/models/concerns/usage_statistics_spec.rb'
@@ -2203,7 +2183,6 @@ RSpec/ContextWording:
- 'spec/models/environment_status_spec.rb'
- 'spec/models/error_tracking/error_spec.rb'
- 'spec/models/event_spec.rb'
- - 'spec/models/external_pull_request_spec.rb'
- 'spec/models/gpg_key_spec.rb'
- 'spec/models/grafana_integration_spec.rb'
- 'spec/models/group_label_spec.rb'
@@ -2214,7 +2193,6 @@ RSpec/ContextWording:
- 'spec/models/import_export_upload_spec.rb'
- 'spec/models/import_failure_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'
@@ -2341,7 +2319,6 @@ RSpec/ContextWording:
- 'spec/presenters/gitlab/blame_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/project_presenter_spec.rb'
- 'spec/presenters/projects/import_export/project_export_presenter_spec.rb'
- 'spec/presenters/projects/security/configuration_presenter_spec.rb'
@@ -2369,7 +2346,6 @@ RSpec/ContextWording:
- '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'
@@ -2464,7 +2440,6 @@ RSpec/ContextWording:
- '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/internal/workhorse_spec.rb'
- 'spec/requests/api/invitations_spec.rb'
- 'spec/requests/api/issue_links_spec.rb'
@@ -2500,6 +2475,7 @@ RSpec/ContextWording:
- 'spec/requests/api/releases_spec.rb'
- 'spec/requests/api/remote_mirrors_spec.rb'
- 'spec/requests/api/repositories_spec.rb'
+ - 'spec/requests/api/resource_access_tokens_spec.rb'
- 'spec/requests/api/rubygem_packages_spec.rb'
- 'spec/requests/api/search_spec.rb'
- 'spec/requests/api/settings_spec.rb'
@@ -2579,6 +2555,8 @@ RSpec/ContextWording:
- '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/be_success_matcher_spec.rb'
+ - 'spec/rubocop/cop/rspec/expect_gitlab_tracking_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'
@@ -2586,7 +2564,6 @@ RSpec/ContextWording:
- 'spec/serializers/deploy_keys/basic_deploy_key_entity_spec.rb'
- 'spec/serializers/diff_file_base_entity_spec.rb'
- 'spec/serializers/diffs_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_link/group_group_link_entity_spec.rb'
@@ -2643,8 +2620,8 @@ RSpec/ContextWording:
- '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/authorizations/ci_access/refresh_service_spec.rb'
+ - 'spec/services/clusters/agents/delete_expired_events_service_spec.rb'
- 'spec/services/clusters/build_kubernetes_namespace_service_spec.rb'
- 'spec/services/clusters/create_service_spec.rb'
- 'spec/services/clusters/kubernetes/create_or_update_namespace_service_spec.rb'
@@ -2671,8 +2648,8 @@ RSpec/ContextWording:
- 'spec/services/draft_notes/publish_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/list_issues_service_spec.rb'
- 'spec/services/error_tracking/list_projects_service_spec.rb'
+ - 'spec/services/event_create_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'
@@ -2799,13 +2776,13 @@ RSpec/ContextWording:
- '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/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/pages/zip_directory_service_spec.rb'
+ - 'spec/services/pages_domains/obtain_lets_encrypt_certificate_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'
@@ -2900,14 +2877,7 @@ RSpec/ContextWording:
- 'spec/services/wikis/create_attachment_service_spec.rb'
- 'spec/services/work_items/create_service_spec.rb'
- 'spec/services/work_items/parent_links/create_service_spec.rb'
- - 'spec/support/banzai/reference_filter_shared_examples.rb'
- - 'spec/support/prometheus/additional_metrics_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/helpers/cycle_analytics_helpers/test_generation.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'
@@ -2927,13 +2897,11 @@ RSpec/ContextWording:
- '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/finders/work_items_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'
@@ -2976,7 +2944,6 @@ RSpec/ContextWording:
- '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_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'
@@ -2988,6 +2955,7 @@ RSpec/ContextWording:
- '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/packages_shared_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'
@@ -3049,6 +3017,7 @@ RSpec/ContextWording:
- '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/issuable/close_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'
@@ -3068,7 +3037,6 @@ RSpec/ContextWording:
- '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'
@@ -3093,7 +3061,6 @@ RSpec/ContextWording:
- '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'
@@ -3119,7 +3086,6 @@ RSpec/ContextWording:
- 'spec/tasks/gitlab/lfs/migrate_rake_spec.rb'
- 'spec/tasks/gitlab/packages/migrate_rake_spec.rb'
- 'spec/tasks/gitlab/storage_rake_spec.rb'
- - 'spec/lib/gitlab/task_helpers_spec.rb'
- 'spec/tasks/gitlab/terraform/migrate_rake_spec.rb'
- 'spec/tasks/gitlab/workhorse_rake_spec.rb'
- 'spec/tooling/danger/project_helper_spec.rb'
@@ -3213,7 +3179,6 @@ RSpec/ContextWording:
- 'spec/workers/integrations/create_external_cross_reference_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/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'
diff --git a/.rubocop_todo/rspec/described_class.yml b/.rubocop_todo/rspec/described_class.yml
index 67f7c365248..5868749048a 100644
--- a/.rubocop_todo/rspec/described_class.yml
+++ b/.rubocop_todo/rspec/described_class.yml
@@ -2,189 +2,10 @@
# Cop supports --autocorrect.
RSpec/DescribedClass:
Exclude:
- - 'ee/spec/models/concerns/elastic/merge_request_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/dast_scanner_profile_spec.rb'
- - 'ee/spec/models/dast_site_profile_spec.rb'
- - 'ee/spec/models/ee/ci/job_artifact_spec.rb'
- - 'ee/spec/models/ee/ci/pending_build_spec.rb'
- - 'ee/spec/models/ee/ci/runner_spec.rb'
- - 'ee/spec/models/ee/gpg_key_spec.rb'
- - 'ee/spec/models/ee/group_spec.rb'
- - 'ee/spec/models/ee/project_spec.rb'
- - 'ee/spec/models/ee/vulnerability_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/package_file_registry_spec.rb'
- - 'ee/spec/models/geo/project_registry_spec.rb'
- - 'ee/spec/models/geo/secondary_usage_data_spec.rb'
- - 'ee/spec/models/issuable_metric_image_spec.rb'
- - 'ee/spec/models/issue_spec.rb'
- - 'ee/spec/models/iteration_spec.rb'
- - 'ee/spec/models/license_spec.rb'
- - 'ee/spec/models/project_import_state_spec.rb'
- - 'ee/spec/models/release_highlight_spec.rb'
- - 'ee/spec/models/requirements_management/test_report_spec.rb'
- - 'ee/spec/models/resource_weight_event_spec.rb'
- - 'ee/spec/models/uploads/local_spec.rb'
- - 'ee/spec/models/vulnerabilities/flag_spec.rb'
- - 'ee/spec/services/arkose/blocked_users_report_service_spec.rb'
- - 'ee/spec/services/ee/resource_events/synthetic_weight_notes_builder_service_spec.rb'
- - 'ee/spec/services/ee/users/reject_service_spec.rb'
- - 'ee/spec/services/security/ingestion/tasks/update_vulnerability_uuids_spec.rb'
- - 'ee/spec/services/users/captcha_challenge_service_spec.rb'
- - 'ee/spec/workers/concerns/elastic/indexing_control_spec.rb'
- - 'ee/spec/workers/geo/secondary/registry_consistency_worker_spec.rb'
- - 'ee/spec/workers/geo/verification_state_backfill_worker_spec.rb'
- 'qa/spec/service/docker_run/base_spec.rb'
- 'qa/spec/support/loglinking_spec.rb'
- 'qa/spec/support/page_error_checker_spec.rb'
- - 'spec/config/settings_spec.rb'
- - 'spec/controllers/repositories/git_http_controller_spec.rb'
- - 'spec/experiments/application_experiment_spec.rb'
- - 'spec/experiments/concerns/project_commit_count_spec.rb'
- - 'spec/frontend/fixtures/timezones.rb'
- - 'spec/graphql/gitlab_schema_spec.rb'
- - 'spec/graphql/graphql_triggers_spec.rb'
- - 'spec/graphql/types/global_id_type_spec.rb'
- - 'spec/initializers/google_api_client_spec.rb'
- - 'spec/lib/api/entities/project_spec.rb'
- - 'spec/lib/api/helpers_spec.rb'
- 'spec/lib/feature_spec.rb'
- - 'spec/lib/gitlab/asciidoc/html5_converter_spec.rb'
- - 'spec/lib/gitlab/buffered_io_spec.rb'
- - 'spec/lib/gitlab/checks/snippet_check_spec.rb'
- - 'spec/lib/gitlab/ci/tags/bulk_insert_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/config/entry/composable_array_spec.rb'
- - 'spec/lib/gitlab/config/entry/composable_hash_spec.rb'
- - 'spec/lib/gitlab/current_settings_spec.rb'
- - 'spec/lib/gitlab/database/background_migration/health_status_spec.rb'
- - 'spec/lib/gitlab/database/load_balancing/host_spec.rb'
- - 'spec/lib/gitlab/database/load_balancing/primary_host_spec.rb'
- - 'spec/lib/gitlab/database/migrations/lock_retry_mixin_spec.rb'
- - 'spec/lib/gitlab/database/reindexing_spec.rb'
- - 'spec/lib/gitlab/database/similarity_score_spec.rb'
- - 'spec/lib/gitlab/database_spec.rb'
- - 'spec/lib/gitlab/email/handler_spec.rb'
- - 'spec/lib/gitlab/email/hook/smime_signature_interceptor_spec.rb'
- - 'spec/lib/gitlab/encrypted_configuration_spec.rb'
- - 'spec/lib/gitlab/error_tracking/logger_spec.rb'
- - 'spec/lib/gitlab/git/blame_spec.rb'
- - 'spec/lib/gitlab/git/blob_spec.rb'
- - 'spec/lib/gitlab/git/commit_spec.rb'
- - 'spec/lib/gitlab/git/compare_spec.rb'
- - 'spec/lib/gitlab/git/diff_collection_spec.rb'
- 'spec/lib/gitlab/git/repository_spec.rb'
- 'spec/lib/gitlab/git/tree_spec.rb'
- - 'spec/lib/gitlab/git_access_snippet_spec.rb'
- - 'spec/lib/gitlab/gl_repository/repo_type_spec.rb'
- - 'spec/lib/gitlab/import_formatter_spec.rb'
- - 'spec/lib/gitlab/inactive_projects_deletion_warning_tracker_spec.rb'
- - 'spec/lib/gitlab/kubernetes/kube_client_spec.rb'
- - 'spec/lib/gitlab/pagination/keyset/order_spec.rb'
- - 'spec/lib/gitlab/relative_positioning/range_spec.rb'
- - 'spec/lib/gitlab/runtime_spec.rb'
- - 'spec/lib/gitlab/seeder_spec.rb'
- - 'spec/lib/gitlab/sidekiq_middleware/size_limiter/client_spec.rb'
- - 'spec/lib/gitlab/usage/metrics/aggregates/sources/redis_hll_spec.rb'
- - 'spec/lib/gitlab/utils/measuring_spec.rb'
- - 'spec/lib/gitlab/webpack/file_loader_spec.rb'
- - 'spec/lib/gitlab/webpack/manifest_spec.rb'
- - 'spec/lib/gitlab/x509/commit_spec.rb'
- - 'spec/lib/gitlab/x509/signature_spec.rb'
- - 'spec/lib/service_ping/devops_report_spec.rb'
- - 'spec/lib/sidebars/panel_spec.rb'
- - 'spec/models/active_session_spec.rb'
- - 'spec/models/alert_management/alert_spec.rb'
- - 'spec/models/application_record_spec.rb'
- - 'spec/models/application_setting_spec.rb'
- - 'spec/models/chat_name_spec.rb'
- - 'spec/models/ci/build_runner_session_spec.rb'
- - 'spec/models/ci/build_spec.rb'
- - 'spec/models/ci/group_variable_spec.rb'
- - 'spec/models/ci/job_artifact_spec.rb'
- - 'spec/models/ci/pipeline_artifact_spec.rb'
- - 'spec/models/ci/pipeline_spec.rb'
- - 'spec/models/ci/processable_spec.rb'
- - 'spec/models/ci/ref_spec.rb'
- - 'spec/models/ci/variable_spec.rb'
- - 'spec/models/ci_platform_metric_spec.rb'
- - 'spec/models/clusters/cluster_spec.rb'
- - 'spec/models/commit_spec.rb'
- - 'spec/models/commit_status_spec.rb'
- - 'spec/models/concerns/counter_attribute_spec.rb'
- - 'spec/models/concerns/has_user_type_spec.rb'
- - 'spec/models/concerns/integrations/enable_ssl_verification_spec.rb'
- - 'spec/models/concerns/integrations/reset_secret_fields_spec.rb'
- - 'spec/models/concerns/resolvable_note_spec.rb'
- - 'spec/models/concerns/token_authenticatable_spec.rb'
- - 'spec/models/customer_relations/contact_spec.rb'
- - 'spec/models/customer_relations/organization_spec.rb'
- - 'spec/models/dependency_proxy/manifest_spec.rb'
- - 'spec/models/deployment_spec.rb'
- - 'spec/models/group_spec.rb'
- - 'spec/models/import_failure_spec.rb'
- - 'spec/models/integration_spec.rb'
- - 'spec/models/internal_id_spec.rb'
- - 'spec/models/issue_assignee_spec.rb'
- - 'spec/models/issue_spec.rb'
- - 'spec/models/label_link_spec.rb'
- - 'spec/models/lfs_objects_project_spec.rb'
- - 'spec/models/loose_foreign_keys/deleted_record_spec.rb'
- - 'spec/models/member_spec.rb'
- - 'spec/models/merge_request_assignee_spec.rb'
- - 'spec/models/merge_request_diff_commit_spec.rb'
- - 'spec/models/merge_request_diff_file_spec.rb'
- - 'spec/models/merge_request_spec.rb'
- - 'spec/models/milestone_spec.rb'
- - 'spec/models/namespace_spec.rb'
- - 'spec/models/oauth_access_token_spec.rb'
- - 'spec/models/packages/dependency_spec.rb'
- - 'spec/models/packages/maven/metadatum_spec.rb'
- - 'spec/models/packages/package_spec.rb'
- - 'spec/models/pages_deployment_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/postgresql/detached_partition_spec.rb'
- - 'spec/models/preloaders/user_max_access_level_in_projects_preloader_spec.rb'
- - 'spec/models/project_spec.rb'
- - 'spec/models/projects/topic_spec.rb'
- - 'spec/models/release_highlight_spec.rb'
- - 'spec/models/release_spec.rb'
- - 'spec/models/route_spec.rb'
- - 'spec/models/todo_spec.rb'
- - 'spec/models/u2f_registration_spec.rb'
- - 'spec/models/user_custom_attribute_spec.rb'
- - 'spec/models/user_spec.rb'
- - 'spec/models/users/merge_request_interaction_spec.rb'
- - 'spec/models/users_statistics_spec.rb'
- - 'spec/models/wiki_directory_spec.rb'
- - 'spec/models/work_items/type_spec.rb'
- - 'spec/serializers/context_commits_diff_entity_spec.rb'
- - 'spec/services/alert_management/alerts/todo/create_service_spec.rb'
- - 'spec/services/auth/dependency_proxy_authentication_service_spec.rb'
- - 'spec/services/ci/register_job_service_spec.rb'
- - 'spec/services/incident_management/issuable_escalation_statuses/after_update_service_spec.rb'
- - 'spec/services/issuable/process_assignees_spec.rb'
- - 'spec/services/merge_requests/update_service_spec.rb'
- - 'spec/services/notification_service_spec.rb'
- - 'spec/services/resource_events/synthetic_label_notes_builder_service_spec.rb'
- - 'spec/services/snippets/update_service_spec.rb'
- - 'spec/services/user_project_access_changed_service_spec.rb'
- - 'spec/services/webauthn/authenticate_service_spec.rb'
- - 'spec/services/webauthn/register_service_spec.rb'
- - 'spec/support_specs/helpers/graphql_helpers_spec.rb'
- - 'spec/validators/html_safety_validator_spec.rb'
- - 'spec/workers/bulk_imports/entity_worker_spec.rb'
- - 'spec/workers/jira_connect/retry_request_worker_spec.rb'
diff --git a/.rubocop_todo/rspec/expect_change.yml b/.rubocop_todo/rspec/expect_change.yml
index abcd80f9b58..02d1427c384 100644
--- a/.rubocop_todo/rspec/expect_change.yml
+++ b/.rubocop_todo/rspec/expect_change.yml
@@ -44,7 +44,6 @@ RSpec/ExpectChange:
- 'ee/spec/models/group_wiki_spec.rb'
- 'ee/spec/models/incident_management/issuable_escalation_status_spec.rb'
- 'ee/spec/models/member_spec.rb'
- - 'ee/spec/models/product_analytics/jitsu_authentication_spec.rb'
- 'ee/spec/models/project_import_state_spec.rb'
- 'ee/spec/models/push_rule_spec.rb'
- 'ee/spec/models/security/orchestration_policy_configuration_spec.rb'
diff --git a/.rubocop_todo/rspec/expect_in_hook.yml b/.rubocop_todo/rspec/expect_in_hook.yml
index 4b588f265c9..b0369d5180d 100644
--- a/.rubocop_todo/rspec/expect_in_hook.yml
+++ b/.rubocop_todo/rspec/expect_in_hook.yml
@@ -13,7 +13,6 @@ RSpec/ExpectInHook:
- '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/signup_spec.rb'
- - 'ee/spec/features/trial_registrations/company_information_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'
@@ -40,7 +39,6 @@ RSpec/ExpectInHook:
- 'ee/spec/lib/gitlab/graphql/aggregations/epics/lazy_epic_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'
@@ -232,7 +230,6 @@ RSpec/ExpectInHook:
- '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'
@@ -368,7 +365,6 @@ RSpec/ExpectInHook:
- '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/integrations/prometheus_health_check_service_spec.rb'
- 'spec/services/container_expiration_policies/cleanup_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'
@@ -470,7 +466,6 @@ RSpec/ExpectInHook:
- 'spec/tasks/gitlab/praefect_rake_spec.rb'
- 'spec/lib/gitlab/task_helpers_spec.rb'
- 'spec/tooling/danger/feature_flag_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'
diff --git a/.rubocop_todo/rspec/factory_bot/excessive_create_list.yml b/.rubocop_todo/rspec/factory_bot/excessive_create_list.yml
new file mode 100644
index 00000000000..39aed947a48
--- /dev/null
+++ b/.rubocop_todo/rspec/factory_bot/excessive_create_list.yml
@@ -0,0 +1,46 @@
+---
+RSpec/FactoryBot/ExcessiveCreateList:
+ Details: grace period
+ Exclude:
+ - 'ee/spec/controllers/groups/hooks_controller_spec.rb'
+ - 'ee/spec/features/search/elastic/global_search_spec.rb'
+ - 'ee/spec/models/audit_events/external_audit_event_destination_spec.rb'
+ - 'ee/spec/models/audit_events/instance_external_audit_event_destination_spec.rb'
+ - 'ee/spec/models/license_spec.rb'
+ - 'ee/spec/models/package_metadata/advisory_spec.rb'
+ - 'ee/spec/models/package_metadata/checkpoint_spec.rb'
+ - 'ee/spec/requests/projects/merge_requests_controller_spec.rb'
+ - 'ee/spec/services/ci/llm/generate_config_service_spec.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/views/admin/application_settings/_elasticsearch_form.html.haml_spec.rb'
+ - 'spec/controllers/admin/clusters_controller_spec.rb'
+ - 'spec/controllers/autocomplete_controller_spec.rb'
+ - 'spec/controllers/explore/projects_controller_spec.rb'
+ - 'spec/controllers/groups/clusters_controller_spec.rb'
+ - 'spec/controllers/projects/clusters_controller_spec.rb'
+ - 'spec/controllers/projects/feature_flags_controller_spec.rb'
+ - 'spec/controllers/projects/hooks_controller_spec.rb'
+ - 'spec/docs_screenshots/container_registry_docs.rb'
+ - 'spec/features/boards/boards_spec.rb'
+ - 'spec/features/issues/csv_spec.rb'
+ - 'spec/features/issues/user_edits_issue_spec.rb'
+ - 'spec/features/issues/user_scrolls_to_deeplinked_note_spec.rb'
+ - 'spec/features/projects/container_registry_spec.rb'
+ - 'spec/features/projects/work_items/work_item_spec.rb'
+ - 'spec/features/users/overview_spec.rb'
+ - 'spec/frontend/fixtures/timelogs.rb'
+ - 'spec/helpers/issuables_helper_spec.rb'
+ - 'spec/lib/gitlab/database/background_migration/batched_migration_spec.rb'
+ - 'spec/lib/gitlab/database/consistency_checker_spec.rb'
+ - 'spec/models/project_spec.rb'
+ - 'spec/models/user_spec.rb'
+ - 'spec/requests/api/graphql/mutations/packages/destroy_files_spec.rb'
+ - 'spec/requests/api/project_packages_spec.rb'
+ - 'spec/services/database/consistency_check_service_spec.rb'
+ - 'spec/services/groups/transfer_service_spec.rb'
+ - 'spec/services/notification_service_spec.rb'
+ - 'spec/services/pages/migrate_from_legacy_storage_service_spec.rb'
+ - 'spec/services/todo_service_spec.rb'
+ - 'spec/support/shared_examples/services/notification_service_shared_examples.rb'
+ - 'spec/workers/ssh_keys/expired_notification_worker_spec.rb'
diff --git a/.rubocop_todo/rspec/missing_feature_category.yml b/.rubocop_todo/rspec/missing_feature_category.yml
index 1f90a4c3ba5..0a559874217 100644
--- a/.rubocop_todo/rspec/missing_feature_category.yml
+++ b/.rubocop_todo/rspec/missing_feature_category.yml
@@ -63,7 +63,6 @@ RSpec/MissingFeatureCategory:
- 'ee/spec/finders/ee/clusters/agents_finder_spec.rb'
- 'ee/spec/finders/ee/fork_targets_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/ee/work_items/work_items_finder_spec.rb'
@@ -155,7 +154,6 @@ RSpec/MissingFeatureCategory:
- 'ee/spec/graphql/ee/types/merge_request_type_spec.rb'
- 'ee/spec/graphql/ee/types/milestone_type_spec.rb'
- 'ee/spec/graphql/ee/types/mutation_type_spec.rb'
- - 'ee/spec/graphql/ee/types/namespace_type_spec.rb'
- 'ee/spec/graphql/ee/types/notes/noteable_interface_spec.rb'
- 'ee/spec/graphql/ee/types/projects/branch_rule_type_spec.rb'
- 'ee/spec/graphql/ee/types/projects/service_type_enum_spec.rb'
@@ -723,8 +721,6 @@ RSpec/MissingFeatureCategory:
- 'ee/spec/lib/elastic/latest/issue_config_spec.rb'
- 'ee/spec/lib/elastic/latest/merge_request_config_spec.rb'
- 'ee/spec/lib/elastic/latest/note_config_spec.rb'
- - 'ee/spec/lib/elastic/latest/project_wiki_class_proxy_spec.rb'
- - 'ee/spec/lib/elastic/latest/project_wiki_instance_proxy_spec.rb'
- 'ee/spec/lib/elastic/latest/routing_spec.rb'
- 'ee/spec/lib/elastic/latest/snippet_instance_proxy_spec.rb'
- 'ee/spec/lib/elastic/latest/user_config_spec.rb'
@@ -926,7 +922,6 @@ RSpec/MissingFeatureCategory:
- 'ee/spec/lib/gitlab/status_page/usage_data_counters/incident_counter_spec.rb'
- 'ee/spec/lib/gitlab/status_page_spec.rb'
- 'ee/spec/lib/gitlab/subscription_portal/client_spec.rb'
- - 'ee/spec/lib/gitlab/subscription_portal/clients/rest_spec.rb'
- 'ee/spec/lib/gitlab/template/custom_templates_spec.rb'
- 'ee/spec/lib/gitlab/tracking/snowplow_schema_validation_spec.rb'
- 'ee/spec/lib/gitlab/tracking/standard_context_spec.rb'
@@ -949,8 +944,6 @@ RSpec/MissingFeatureCategory:
- 'ee/spec/lib/gitlab/usage/metrics/instrumentations/count_projects_with_assigned_security_policy_project_metric_spec.rb'
- 'ee/spec/lib/gitlab/usage/metrics/instrumentations/count_projects_with_external_status_checks_metric_spec.rb'
- 'ee/spec/lib/gitlab/usage/metrics/instrumentations/count_saml_group_links_metric_spec.rb'
- - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/count_slack_app_installations_gbp_metric_spec.rb'
- - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/count_slack_app_installations_metric_spec.rb'
- 'ee/spec/lib/gitlab/usage/metrics/instrumentations/count_user_merge_requests_for_projects_with_applied_scan_result_policies_metric_spec.rb'
- 'ee/spec/lib/gitlab/usage/metrics/instrumentations/count_user_merge_requests_with_applied_scan_result_policies_metric_spec.rb'
- 'ee/spec/lib/gitlab/usage/metrics/instrumentations/count_users_associating_group_milestones_to_releases_metric_spec.rb'
@@ -1192,7 +1185,6 @@ RSpec/MissingFeatureCategory:
- 'ee/spec/models/path_lock_spec.rb'
- 'ee/spec/models/plan_spec.rb'
- 'ee/spec/models/preloaders/environments/protected_environment_preloader_spec.rb'
- - 'ee/spec/models/product_analytics/jitsu_authentication_spec.rb'
- 'ee/spec/models/productivity_analytics_spec.rb'
- 'ee/spec/models/project_alias_spec.rb'
- 'ee/spec/models/project_ci_cd_setting_spec.rb'
@@ -1364,7 +1356,6 @@ RSpec/MissingFeatureCategory:
- 'ee/spec/serializers/licenses_list_serializer_spec.rb'
- 'ee/spec/serializers/linked_feature_flag_issue_entity_spec.rb'
- 'ee/spec/serializers/member_user_entity_spec.rb'
- - 'ee/spec/serializers/merge_request_poll_widget_entity_spec.rb'
- 'ee/spec/serializers/merge_request_sidebar_basic_entity_spec.rb'
- 'ee/spec/serializers/metrics_report_metric_entity_spec.rb'
- 'ee/spec/serializers/metrics_reports_comparer_entity_spec.rb'
@@ -1719,7 +1710,6 @@ RSpec/MissingFeatureCategory:
- 'spec/controllers/profiles/preferences_controller_spec.rb'
- 'spec/controllers/profiles/webauthn_registrations_controller_spec.rb'
- 'spec/controllers/profiles_controller_spec.rb'
- - 'spec/controllers/projects/alert_management_controller_spec.rb'
- 'spec/controllers/projects/alerting/notifications_controller_spec.rb'
- 'spec/controllers/projects/analytics/cycle_analytics/stages_controller_spec.rb'
- 'spec/controllers/projects/analytics/cycle_analytics/summary_controller_spec.rb'
@@ -1749,7 +1739,6 @@ RSpec/MissingFeatureCategory:
- 'spec/controllers/projects/find_file_controller_spec.rb'
- 'spec/controllers/projects/graphs_controller_spec.rb'
- 'spec/controllers/projects/import/jira_controller_spec.rb'
- - 'spec/controllers/projects/incidents_controller_spec.rb'
- 'spec/controllers/projects/issue_links_controller_spec.rb'
- 'spec/controllers/projects/mattermosts_controller_spec.rb'
- 'spec/controllers/projects/merge_requests/conflicts_controller_spec.rb'
@@ -1773,7 +1762,6 @@ RSpec/MissingFeatureCategory:
- 'spec/controllers/projects/releases/evidences_controller_spec.rb'
- 'spec/controllers/projects/releases_controller_spec.rb'
- 'spec/controllers/projects/security/configuration_controller_spec.rb'
- - 'spec/controllers/projects/service_desk_controller_spec.rb'
- 'spec/controllers/projects/service_ping_controller_spec.rb'
- 'spec/controllers/projects/settings/integration_hook_logs_controller_spec.rb'
- 'spec/controllers/projects/settings/merge_requests_controller_spec.rb'
@@ -1809,8 +1797,6 @@ RSpec/MissingFeatureCategory:
- 'spec/dependencies/omniauth_saml_spec.rb'
- 'spec/docs_screenshots/container_registry_docs.rb'
- 'spec/docs_screenshots/wiki_docs.rb'
- - 'spec/experiments/concerns/project_commit_count_spec.rb'
- - 'spec/experiments/force_company_trial_experiment_spec.rb'
- 'spec/experiments/in_product_guidance_environments_webide_experiment_spec.rb'
- 'spec/experiments/ios_specific_templates_experiment_spec.rb'
- 'spec/features/admin/dashboard_spec.rb'
@@ -3062,7 +3048,6 @@ RSpec/MissingFeatureCategory:
- 'spec/lib/gitlab/ci/ansi2json/parser_spec.rb'
- 'spec/lib/gitlab/ci/ansi2json/result_spec.rb'
- 'spec/lib/gitlab/ci/ansi2json/style_spec.rb'
- - 'spec/lib/gitlab/ci/artifact_file_reader_spec.rb'
- 'spec/lib/gitlab/ci/artifacts/logger_spec.rb'
- 'spec/lib/gitlab/ci/artifacts/metrics_spec.rb'
- 'spec/lib/gitlab/ci/badge/coverage/metadata_spec.rb'
@@ -3759,7 +3744,6 @@ RSpec/MissingFeatureCategory:
- 'spec/lib/gitlab/graphql/batch_key_spec.rb'
- 'spec/lib/gitlab/graphql/calls_gitaly/field_extension_spec.rb'
- 'spec/lib/gitlab/graphql/copy_field_description_spec.rb'
- - 'spec/lib/gitlab/graphql/generic_tracing_spec.rb'
- 'spec/lib/gitlab/graphql/known_operations_spec.rb'
- 'spec/lib/gitlab/graphql/lazy_spec.rb'
- 'spec/lib/gitlab/graphql/limit/field_call_count_spec.rb'
@@ -4414,7 +4398,6 @@ RSpec/MissingFeatureCategory:
- 'spec/lib/gitlab/utils/safe_inline_hash_spec.rb'
- 'spec/lib/gitlab/utils/sanitize_node_link_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/verify/job_artifacts_spec.rb'
- 'spec/lib/gitlab/verify/lfs_objects_spec.rb'
@@ -4789,7 +4772,6 @@ RSpec/MissingFeatureCategory:
- 'spec/models/event_collection_spec.rb'
- 'spec/models/exported_protected_branch_spec.rb'
- 'spec/models/external_issue_spec.rb'
- - 'spec/models/external_pull_request_spec.rb'
- 'spec/models/fork_network_member_spec.rb'
- 'spec/models/fork_network_spec.rb'
- 'spec/models/generic_commit_status_spec.rb'
@@ -5009,7 +4991,6 @@ RSpec/MissingFeatureCategory:
- 'spec/models/projects/project_topic_spec.rb'
- 'spec/models/projects/repository_storage_move_spec.rb'
- 'spec/models/projects/topic_spec.rb'
- - 'spec/models/projects/triggered_hooks_spec.rb'
- 'spec/models/projects/wiki_repository_spec.rb'
- 'spec/models/prometheus_alert_event_spec.rb'
- 'spec/models/prometheus_alert_spec.rb'
@@ -5288,7 +5269,6 @@ RSpec/MissingFeatureCategory:
- 'spec/rubocop/cop/graphql/descriptions_spec.rb'
- 'spec/rubocop/cop/graphql/enum_names_spec.rb'
- 'spec/rubocop/cop/graphql/enum_values_spec.rb'
- - 'spec/rubocop/cop/graphql/gid_expected_type_spec.rb'
- 'spec/rubocop/cop/graphql/graphql_name_position_spec.rb'
- 'spec/rubocop/cop/graphql/id_type_spec.rb'
- 'spec/rubocop/cop/graphql/json_type_spec.rb'
@@ -5369,9 +5349,7 @@ RSpec/MissingFeatureCategory:
- 'spec/rubocop/cop/usage_data/instrumentation_superclass_spec.rb'
- 'spec/rubocop/cop/usage_data/large_table_spec.rb'
- 'spec/rubocop/cop/user_admin_spec.rb'
- - 'spec/rubocop/cop_todo_spec.rb'
- 'spec/rubocop/formatter/graceful_formatter_spec.rb'
- - 'spec/rubocop/formatter/todo_formatter_spec.rb'
- 'spec/rubocop/migration_helpers_spec.rb'
- 'spec/rubocop/qa_helpers_spec.rb'
- 'spec/rubocop/todo_dir_spec.rb'
@@ -5584,7 +5562,6 @@ RSpec/MissingFeatureCategory:
- 'spec/support_specs/helpers/stub_method_calls_spec.rb'
- 'spec/support_specs/matchers/be_sorted_spec.rb'
- 'spec/support_specs/matchers/exceed_query_limit_helpers_spec.rb'
- - 'spec/support_specs/time_travel_spec.rb'
- 'spec/tasks/admin_mode_spec.rb'
- 'spec/tasks/config_lint_rake_spec.rb'
- 'spec/tasks/dev_rake_spec.rb'
@@ -5638,12 +5615,6 @@ RSpec/MissingFeatureCategory:
- 'spec/tooling/lib/tooling/test_map_generator_spec.rb'
- 'spec/tooling/lib/tooling/test_map_packer_spec.rb'
- 'spec/tooling/merge_request_spec.rb'
- - 'spec/tooling/rspec_flaky/config_spec.rb'
- - 'spec/tooling/rspec_flaky/example_spec.rb'
- - 'spec/tooling/rspec_flaky/flaky_example_spec.rb'
- - 'spec/tooling/rspec_flaky/flaky_examples_collection_spec.rb'
- - 'spec/tooling/rspec_flaky/listener_spec.rb'
- - 'spec/tooling/rspec_flaky/report_spec.rb'
- 'spec/uploaders/attachment_uploader_spec.rb'
- 'spec/uploaders/avatar_uploader_spec.rb'
- 'spec/uploaders/ci/pipeline_artifact_uploader_spec.rb'
@@ -5747,7 +5718,6 @@ RSpec/MissingFeatureCategory:
- 'spec/views/layouts/nav/sidebar/_profile.html.haml_spec.rb'
- 'spec/views/layouts/profile.html.haml_spec.rb'
- 'spec/views/layouts/signup_onboarding.html.haml_spec.rb'
- - 'spec/views/layouts/simple_registration.html.haml_spec.rb'
- 'spec/views/layouts/terms.html.haml_spec.rb'
- 'spec/views/notify/approved_merge_request_email.html.haml_spec.rb'
- 'spec/views/notify/autodevops_disabled_email.text.erb_spec.rb'
diff --git a/.rubocop_todo/rspec/return_from_stub.yml b/.rubocop_todo/rspec/return_from_stub.yml
index 20e4112da62..0f0a6f5a95a 100644
--- a/.rubocop_todo/rspec/return_from_stub.yml
+++ b/.rubocop_todo/rspec/return_from_stub.yml
@@ -91,7 +91,6 @@ RSpec/ReturnFromStub:
- '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/features/groups/clusters/user_spec.rb'
- 'spec/features/groups/container_registry_spec.rb'
@@ -101,7 +100,6 @@ RSpec/ReturnFromStub:
- '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'
diff --git a/.rubocop_todo/rspec/useless_dynamic_definition.yml b/.rubocop_todo/rspec/useless_dynamic_definition.yml
new file mode 100644
index 00000000000..b3dabf433a0
--- /dev/null
+++ b/.rubocop_todo/rspec/useless_dynamic_definition.yml
@@ -0,0 +1,12 @@
+---
+RSpec/UselessDynamicDefinition:
+ Details: grace period
+ Exclude:
+ - 'ee/spec/factories/ci/builds.rb'
+ - 'ee/spec/factories/ci/job_artifacts.rb'
+ - 'ee/spec/factories/ci/pipelines.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/count_security_scans_metric_spec.rb'
+ - 'ee/spec/support/shared_examples/lib/gitlab/elastic/search_results_shared_examples.rb'
+ - 'spec/models/ci/resource_group_spec.rb'
+ - 'spec/services/packages/nuget/update_package_from_metadata_service_spec.rb'
+ - 'spec/support/helpers/cycle_analytics_helpers/test_generation.rb'
diff --git a/.rubocop_todo/rspec/verified_doubles.yml b/.rubocop_todo/rspec/verified_doubles.yml
index 9b0432f6546..0d66bf5604b 100644
--- a/.rubocop_todo/rspec/verified_doubles.yml
+++ b/.rubocop_todo/rspec/verified_doubles.yml
@@ -73,7 +73,6 @@ RSpec/VerifiedDoubles:
- 'ee/spec/lib/gitlab/import_export/group/relation_factory_spec.rb'
- 'ee/spec/lib/gitlab/middleware/ip_restrictor_spec.rb'
- 'ee/spec/lib/gitlab/prometheus/queries/cluster_query_spec.rb'
- - 'ee/spec/lib/gitlab/subscription_portal/clients/rest_spec.rb'
- 'ee/spec/lib/sidebars/groups/menus/analytics_menu_spec.rb'
- 'ee/spec/lib/system_check/geo/geo_database_configured_check_spec.rb'
- 'ee/spec/models/app_sec/fuzzing/api/ci_configuration_spec.rb'
@@ -261,7 +260,6 @@ RSpec/VerifiedDoubles:
- 'spec/controllers/projects/snippets_controller_spec.rb'
- 'spec/controllers/sessions_controller_spec.rb'
- 'spec/dependencies/omniauth_saml_spec.rb'
- - 'spec/experiments/concerns/project_commit_count_spec.rb'
- 'spec/factories/ci/job_artifacts.rb'
- 'spec/features/admin/admin_system_info_spec.rb'
- 'spec/features/clusters/create_agent_spec.rb'
@@ -580,7 +578,6 @@ RSpec/VerifiedDoubles:
- 'spec/lib/gitlab/grape_logging/loggers/urgency_logger_spec.rb'
- 'spec/lib/gitlab/graphql/authorize/object_authorization_spec.rb'
- 'spec/lib/gitlab/graphql/batch_key_spec.rb'
- - 'spec/lib/gitlab/graphql/generic_tracing_spec.rb'
- 'spec/lib/gitlab/graphql/lazy_spec.rb'
- 'spec/lib/gitlab/graphql/loaders/issuable_loader_spec.rb'
- 'spec/lib/gitlab/graphql/present/field_extension_spec.rb'
@@ -986,8 +983,6 @@ RSpec/VerifiedDoubles:
- 'spec/tooling/danger/project_helper_spec.rb'
- 'spec/tooling/lib/tooling/helm3_client_spec.rb'
- 'spec/tooling/lib/tooling/kubernetes_client_spec.rb'
- - 'spec/tooling/rspec_flaky/example_spec.rb'
- - 'spec/tooling/rspec_flaky/listener_spec.rb'
- 'spec/uploaders/file_uploader_spec.rb'
- 'spec/uploaders/object_storage_spec.rb'
- 'spec/uploaders/personal_file_uploader_spec.rb'
diff --git a/.rubocop_todo/search/namespaced_class.yml b/.rubocop_todo/search/namespaced_class.yml
index ba2dbafb3c7..53dae651959 100644
--- a/.rubocop_todo/search/namespaced_class.yml
+++ b/.rubocop_todo/search/namespaced_class.yml
@@ -26,6 +26,7 @@ Search/NamespacedClass:
- 'ee/app/models/concerns/elastic/projects_search.rb'
- 'ee/app/models/concerns/elastic/repositories_search.rb'
- 'ee/app/models/concerns/elastic/snippets_search.rb'
+ - 'ee/app/models/concerns/elastic/update_associated_epics_on_date_change.rb'
- 'ee/app/models/concerns/elastic/wiki_repositories_search.rb'
- 'ee/app/models/concerns/elasticsearch_indexed_container.rb'
- 'ee/app/models/concerns/zoekt/searchable_repository.rb'
@@ -80,6 +81,7 @@ Search/NamespacedClass:
- 'ee/lib/api/elasticsearch_indexed_namespaces.rb'
- 'ee/lib/ee/api/helpers/search_helpers.rb'
- 'ee/lib/ee/gitlab/group_search_results.rb'
+ - 'ee/lib/ee/gitlab/search/found_wiki_page.rb'
- 'ee/lib/ee/gitlab/search/parsed_query.rb'
- 'ee/lib/ee/gitlab/search_context.rb'
- 'ee/lib/ee/gitlab/search_results.rb'
@@ -93,6 +95,9 @@ Search/NamespacedClass:
- 'ee/lib/elastic/latest/config.rb'
- 'ee/lib/elastic/latest/custom_language_analyzers.rb'
- 'ee/lib/elastic/latest/document_should_be_deleted_from_index_error.rb'
+ - 'ee/lib/elastic/latest/epic_class_proxy.rb'
+ - 'ee/lib/elastic/latest/epic_config.rb'
+ - 'ee/lib/elastic/latest/epic_instance_proxy.rb'
- 'ee/lib/elastic/latest/git_class_proxy.rb'
- 'ee/lib/elastic/latest/git_instance_proxy.rb'
- 'ee/lib/elastic/latest/issue_class_proxy.rb'
@@ -108,8 +113,6 @@ Search/NamespacedClass:
- 'ee/lib/elastic/latest/note_instance_proxy.rb'
- 'ee/lib/elastic/latest/project_class_proxy.rb'
- 'ee/lib/elastic/latest/project_instance_proxy.rb'
- - 'ee/lib/elastic/latest/project_wiki_class_proxy.rb'
- - 'ee/lib/elastic/latest/project_wiki_instance_proxy.rb'
- 'ee/lib/elastic/latest/query_context.rb'
- 'ee/lib/elastic/latest/repository_class_proxy.rb'
- 'ee/lib/elastic/latest/repository_instance_proxy.rb'
@@ -123,6 +126,7 @@ Search/NamespacedClass:
- 'ee/lib/elastic/latest/user_config.rb'
- 'ee/lib/elastic/latest/user_instance_proxy.rb'
- 'ee/lib/elastic/latest/wiki_config.rb'
+ - 'ee/lib/elastic/latest/project_config.rb'
- 'ee/lib/elastic/metrics_update_service.rb'
- 'ee/lib/elastic/migration.rb'
- 'ee/lib/elastic/multi_version_class_proxy.rb'
@@ -132,6 +136,8 @@ Search/NamespacedClass:
- 'ee/lib/elastic/v12p1/application_class_proxy.rb'
- 'ee/lib/elastic/v12p1/application_instance_proxy.rb'
- 'ee/lib/elastic/v12p1/config.rb'
+ - 'ee/lib/elastic/v12p1/epic_class_proxy.rb'
+ - 'ee/lib/elastic/v12p1/epic_instance_proxy.rb'
- 'ee/lib/elastic/v12p1/issue_class_proxy.rb'
- 'ee/lib/elastic/v12p1/issue_instance_proxy.rb'
- 'ee/lib/elastic/v12p1/merge_request_class_proxy.rb'
@@ -142,8 +148,6 @@ Search/NamespacedClass:
- 'ee/lib/elastic/v12p1/note_instance_proxy.rb'
- 'ee/lib/elastic/v12p1/project_class_proxy.rb'
- 'ee/lib/elastic/v12p1/project_instance_proxy.rb'
- - 'ee/lib/elastic/v12p1/project_wiki_class_proxy.rb'
- - 'ee/lib/elastic/v12p1/project_wiki_instance_proxy.rb'
- 'ee/lib/elastic/v12p1/repository_class_proxy.rb'
- 'ee/lib/elastic/v12p1/repository_instance_proxy.rb'
- 'ee/lib/elastic/v12p1/routing.rb'
diff --git a/.rubocop_todo/style/bare_percent_literals.yml b/.rubocop_todo/style/bare_percent_literals.yml
deleted file mode 100644
index 554dc64c39c..00000000000
--- a/.rubocop_todo/style/bare_percent_literals.yml
+++ /dev/null
@@ -1,87 +0,0 @@
----
-# Cop supports --autocorrect.
-Style/BarePercentLiterals:
- Exclude:
- - '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'
- - '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/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/personal_access_token_cache.rb'
- - 'qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb'
- - 'qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_with_image_pull_policy_spec.rb'
- - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/push_rules_spec.rb'
- - 'qa/spec/runtime/feature_spec.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/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/incident_management/timeline_event_pipeline_spec.rb'
- - 'spec/lib/banzai/pipeline/plain_markdown_pipeline_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/incident_management/timeline_event_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/requests/api/graphql/project/incident_management/timeline_events_spec.rb'
- - 'spec/requests/projects/packages/package_files_controller_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/empty_method.yml b/.rubocop_todo/style/empty_method.yml
index 184e0d926d5..723a3adf412 100644
--- a/.rubocop_todo/style/empty_method.yml
+++ b/.rubocop_todo/style/empty_method.yml
@@ -7,12 +7,10 @@ Style/EmptyMethod:
- 'app/controllers/admin/deploy_keys_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/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'
@@ -40,7 +38,6 @@ Style/EmptyMethod:
- 'app/controllers/projects/mattermosts_controller.rb'
- 'app/controllers/projects/pages_domains_controller.rb'
- 'app/controllers/projects/pipeline_schedules_controller.rb'
- - 'app/controllers/projects/runners_controller.rb'
- 'app/controllers/projects/settings/integrations_controller.rb'
- 'app/controllers/projects/settings/packages_and_registries_controller.rb'
- 'app/controllers/projects/terraform_controller.rb'
@@ -94,7 +91,6 @@ Style/EmptyMethod:
- '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/subscriptions/groups_controller.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'
diff --git a/.rubocop_todo/style/format_string.yml b/.rubocop_todo/style/format_string.yml
index 9d202dcd7fb..a45c6b39c25 100644
--- a/.rubocop_todo/style/format_string.yml
+++ b/.rubocop_todo/style/format_string.yml
@@ -170,7 +170,6 @@ Style/FormatString:
- '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'
@@ -237,7 +236,6 @@ Style/FormatString:
- 'ee/lib/gitlab/licenses/submit_license_usage_data_banner.rb'
- 'ee/lib/gitlab/manual_quarterly_co_term_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_settings_spec.rb'
diff --git a/.rubocop_todo/style/guard_clause.yml b/.rubocop_todo/style/guard_clause.yml
index 8613e240d9c..64568649287 100644
--- a/.rubocop_todo/style/guard_clause.yml
+++ b/.rubocop_todo/style/guard_clause.yml
@@ -105,7 +105,6 @@ Style/GuardClause:
- '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/grafana_integration.rb'
- 'app/models/integrations/base_issue_tracker.rb'
@@ -373,7 +372,6 @@ Style/GuardClause:
- '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/namespaces/storage/email_notification_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'
@@ -641,5 +639,3 @@ Style/GuardClause:
- '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/if_unless_modifier.yml b/.rubocop_todo/style/if_unless_modifier.yml
index 2ca9b22f0ad..a1f516a8abe 100644
--- a/.rubocop_todo/style/if_unless_modifier.yml
+++ b/.rubocop_todo/style/if_unless_modifier.yml
@@ -155,7 +155,6 @@ Style/IfUnlessModifier:
- '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/grafana_integration.rb'
- 'app/models/group.rb'
@@ -1075,5 +1074,3 @@ Style/IfUnlessModifier:
- 'tooling/lib/tooling/find_codeowners.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/percent_literal_delimiters.yml b/.rubocop_todo/style/percent_literal_delimiters.yml
index 2e03bbf4557..bb29652fe96 100644
--- a/.rubocop_todo/style/percent_literal_delimiters.yml
+++ b/.rubocop_todo/style/percent_literal_delimiters.yml
@@ -843,7 +843,6 @@ Style/PercentLiteralDelimiters:
- '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'
diff --git a/.rubocop_todo/style/redundant_freeze.yml b/.rubocop_todo/style/redundant_freeze.yml
index c2ff275db69..0877c752827 100644
--- a/.rubocop_todo/style/redundant_freeze.yml
+++ b/.rubocop_todo/style/redundant_freeze.yml
@@ -212,24 +212,3 @@ Style/RedundantFreeze:
- 'lib/gitlab/zoom_link_extractor.rb'
- 'lib/sbom/package_url/argument_validator.rb'
- 'lib/tasks/gitlab/db/decomposition/rollback/bump_ci_sequences.rake'
- - 'qa/qa/support/parallel_pipeline_jobs.rb'
- - 'qa/qa/tools/ci/qa_changes.rb'
- - 'rubocop/cop/gitlab/doc_url.rb'
- - 'rubocop/cop/gitlab/finder_with_find_by.rb'
- - 'rubocop/cop/inject_enterprise_edition_module.rb'
- - 'rubocop/cop/project_path_helper.rb'
- - 'rubocop/cop/qa/selector_usage.rb'
- - 'scripts/lint-docs-blueprints.rb'
- - 'scripts/qa/testcases-check'
- - 'scripts/validate_migration_timestamps'
- - 'spec/contracts/provider/helpers/contract_source_helper.rb'
- - 'spec/initializers/secret_token_spec.rb'
- - 'spec/support/helpers/next_found_instance_of.rb'
- - 'spec/support/helpers/require_migration.rb'
- - 'spec/support/matchers/exceed_query_limit.rb'
- - 'tooling/danger/config_files.rb'
- - 'tooling/danger/customer_success.rb'
- - 'tooling/danger/datateam.rb'
- - 'tooling/danger/stable_branch.rb'
- - 'tooling/lib/tooling/kubernetes_client.rb'
- - 'tooling/lib/tooling/mappings/view_to_js_mappings.rb'
diff --git a/.rubocop_todo/style/redundant_interpolation.yml b/.rubocop_todo/style/redundant_interpolation.yml
index a618632f552..27cd954f506 100644
--- a/.rubocop_todo/style/redundant_interpolation.yml
+++ b/.rubocop_todo/style/redundant_interpolation.yml
@@ -35,4 +35,3 @@ Style/RedundantInterpolation:
- 'qa/qa/tools/generate_perf_testdata.rb'
- 'scripts/perf/gc/print_gc_stats.rb'
- 'scripts/qa/testcases-check'
- - 'tooling/rspec_flaky/flaky_example.rb'
diff --git a/.rubocop_todo/style/redundant_parentheses.yml b/.rubocop_todo/style/redundant_parentheses.yml
new file mode 100644
index 00000000000..540dcfa3ca7
--- /dev/null
+++ b/.rubocop_todo/style/redundant_parentheses.yml
@@ -0,0 +1,9 @@
+---
+# Cop supports --autocorrect.
+Style/RedundantParentheses:
+ Details: grace period
+ Exclude:
+ - 'spec/graphql/types/ci/job_kind_enum_spec.rb'
+ - 'spec/lib/gitlab/import_export/command_line_util_spec.rb'
+ - 'spec/requests/verifies_with_email_spec.rb'
+ - 'spec/services/projects/create_service_spec.rb'
diff --git a/.rubocop_todo/style/sole_nested_conditional.yml b/.rubocop_todo/style/sole_nested_conditional.yml
index 65cac595cde..975da41a69a 100644
--- a/.rubocop_todo/style/sole_nested_conditional.yml
+++ b/.rubocop_todo/style/sole_nested_conditional.yml
@@ -8,7 +8,6 @@ Style/SoleNestedConditional:
- 'app/controllers/projects/blob_controller.rb'
- 'app/helpers/nav_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'
diff --git a/.rubocop_todo/style/string_concatenation.yml b/.rubocop_todo/style/string_concatenation.yml
index 4e3b17fe4c0..a83c0f4d943 100644
--- a/.rubocop_todo/style/string_concatenation.yml
+++ b/.rubocop_todo/style/string_concatenation.yml
@@ -54,7 +54,6 @@ Style/StringConcatenation:
- 'ee/lib/gitlab/elastic/search_results.rb'
- 'ee/lib/gitlab/geo/git_ssh_proxy.rb'
- 'ee/lib/omni_auth/strategies/kerberos.rb'
- - 'ee/lib/tasks/gitlab/elastic.rake'
- 'ee/lib/tasks/gitlab/license.rake'
- 'ee/spec/features/boards/boards_spec.rb'
- 'ee/spec/features/projects/pipelines/pipeline_spec.rb'
@@ -212,7 +211,6 @@ Style/StringConcatenation:
- 'spec/lib/gitlab/themes_spec.rb'
- 'spec/lib/gitlab/throttle_spec.rb'
- 'spec/lib/gitlab/tree_summary_spec.rb'
- - 'spec/lib/gitlab/utils_spec.rb'
- 'spec/lib/gitlab/visibility_level_spec.rb'
- 'spec/lib/gitlab/wiki_pages/front_matter_parser_spec.rb'
- 'spec/lib/gitlab/workhorse_spec.rb'
diff --git a/.rubocop_todo/style/string_literals_in_interpolation.yml b/.rubocop_todo/style/string_literals_in_interpolation.yml
index ceb6a922270..30a649cb4fa 100644
--- a/.rubocop_todo/style/string_literals_in_interpolation.yml
+++ b/.rubocop_todo/style/string_literals_in_interpolation.yml
@@ -18,7 +18,6 @@ Style/StringLiteralsInInterpolation:
- 'ee/app/models/license.rb'
- 'ee/app/services/epics/tree_reorder_service.rb'
- 'ee/lib/ee/api/helpers/issues_helpers.rb'
- - 'ee/lib/tasks/gitlab/elastic.rake'
- 'ee/spec/features/admin/admin_settings_spec.rb'
- 'ee/spec/features/subscriptions/expiring_subscription_message_spec.rb'
- 'ee/spec/lib/gitlab/expiring_subscription_message_spec.rb'
diff --git a/.rubocop_todo/style/symbol_proc.yml b/.rubocop_todo/style/symbol_proc.yml
index 0e4602f9f31..67229a8b704 100644
--- a/.rubocop_todo/style/symbol_proc.yml
+++ b/.rubocop_todo/style/symbol_proc.yml
@@ -241,4 +241,3 @@ Style/SymbolProc:
- '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/CHANGELOG.md b/CHANGELOG.md
index 7c85299b089..4f0ed487109 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -960,6 +960,29 @@ entry.
- [Migrate custom CSS to utility classes](gitlab-org/gitlab@a67999317bec111d523c763fc865665d4ded0aaf) ([merge request](gitlab-org/gitlab!120745)) **GitLab Enterprise Edition**
- [Remove the vsa_group_and_project_parity FF](gitlab-org/gitlab@d090818bdedb0e220928d8e456cf36c8bce81f42) ([merge request](gitlab-org/gitlab!120727)) **GitLab Enterprise Edition**
+## 16.0.7 (2023-07-04)
+
+### Security (1 change)
+
+- [Add authorization to the subscriptions group controller](gitlab-org/security/gitlab@07fa510bd2a18c0c0c35503f2fd9dd421d2b4049) ([merge request](gitlab-org/security/gitlab!3380))
+
+## 16.0.6 (2023-06-28)
+
+### Security (12 changes)
+
+- [Revert 'security-leaked-ci-job-token-permission-16-0' from '16-0'"](gitlab-org/security/gitlab@3c4fdbad26a123c581253fb501b5bace953a5e85) ([merge request](gitlab-org/security/gitlab!3373))
+- [Use fully qualified ref when loading code owner file](gitlab-org/security/gitlab@69c61fcbdc88873b60a217cfd3810364718417e9) ([merge request](gitlab-org/security/gitlab!3355))
+- [Maintainer can leak masked webhook secrets by manipulating URL masking](gitlab-org/security/gitlab@a3e055010523db5a1c346464e2589cc75f73629d) ([merge request](gitlab-org/security/gitlab!3360))
+- [Remove approvals when the only commit gets amended](gitlab-org/security/gitlab@01e59413e2570744dc34dd50efd2601dc91c8d2d) ([merge request](gitlab-org/security/gitlab!3367))
+- [Add authorization validation to GithubController#failures action](gitlab-org/security/gitlab@9eab0689991debab8c8a1afb9e32a3bac9978325) ([merge request](gitlab-org/security/gitlab!3334))
+- [Fix for fork permissions check in compare controller](gitlab-org/security/gitlab@da9bb4c761dfe7e8efdd910ed3fc89f348e47e90) ([merge request](gitlab-org/security/gitlab!3343))
+- [Webhook token leaked in Sidekiq logs if log format is 'default'](gitlab-org/security/gitlab@a9835cb72eddfae1748c66314618b3157a6bcb57) ([merge request](gitlab-org/security/gitlab!3346))
+- [Mitigate epic reference filter ReDOS](gitlab-org/security/gitlab@c8046028a30fe9dca7e141eec2acf3d4b49d93ee) ([merge request](gitlab-org/security/gitlab!3340))
+- [Increasing security for CI_JOB_TOKEN on public and internal projects](gitlab-org/security/gitlab@b67db0cdd9324633f4abb59bc27bca43e94e3362) ([merge request](gitlab-org/security/gitlab!3318))
+- [Adjust access to value stream create, edit and destroy actions](gitlab-org/security/gitlab@ee20f3f3a84a75c7e07e1aa6fde95761636a669f) ([merge request](gitlab-org/security/gitlab!3321))
+- [Sanitize user email addresses in admin confirm user dialog](gitlab-org/security/gitlab@545e0913336e823eb905a8bd86fe2905b321a284) ([merge request](gitlab-org/security/gitlab!3331))
+- [Obfuscate email of service desk issue creator in issue REST API](gitlab-org/security/gitlab@b921f10b565bafbd6d50d93d84d34b5f103839ea) ([merge request](gitlab-org/security/gitlab!3315))
+
## 16.0.5 (2023-06-16)
### Fixed (1 change)
@@ -1795,6 +1818,31 @@ entry.
- [Add index to group_group_links table](gitlab-org/gitlab@9a3f2c1a90b54074e61d0abf07101ce664198e81) ([merge request](gitlab-org/gitlab!117386))
- [Validate the projects.creator_id foregin key synchronously](gitlab-org/gitlab@ed9351984a16f20506babf6eab6706b917904ed1) ([merge request](gitlab-org/gitlab!117147))
+## 15.11.12 (2023-07-14)
+
+No changes.
+
+## 15.11.11 (2023-07-04)
+
+### Security (1 change)
+
+- [Add authorization to the subscriptions group controller](gitlab-org/security/gitlab@a6cb78e56a0e6b08ee7bbabd1687fb43a9f8703b) ([merge request](gitlab-org/security/gitlab!3381))
+
+## 15.11.10 (2023-06-28)
+
+### Security (10 changes)
+
+- [Revert 'security-leaked-ci-job-token-permission-15-11' from '15-11'"](gitlab-org/security/gitlab@19f73bf5494d34b43eb8c807f860d545acae0c32) ([merge request](gitlab-org/security/gitlab!3375))
+- [Use fully qualified ref when loading code owner file](gitlab-org/security/gitlab@d7ffb4cca68373bff38bd05f0b8afc868cda9e04) ([merge request](gitlab-org/security/gitlab!3354))
+- [Maintainer can leak masked webhook secrets by manipulating URL masking](gitlab-org/security/gitlab@3a7ccdac5e41870fdce362c38d0a1d1437906fbd) ([merge request](gitlab-org/security/gitlab!3361))
+- [Remove approvals when the only commit gets amended](gitlab-org/security/gitlab@f8a4ad8be7e5fdf752f525ed58b94b1ce625b9a1) ([merge request](gitlab-org/security/gitlab!3368))
+- [Fix for fork permissions check in compare controller](gitlab-org/security/gitlab@8edf44b13e55ffe0c912f98134d0341a5a6bcd28) ([merge request](gitlab-org/security/gitlab!3344))
+- [Webhook token leaked in Sidekiq logs if log format is 'default'](gitlab-org/security/gitlab@02b58237085930c62ee277c9ebd89a0560f44a98) ([merge request](gitlab-org/security/gitlab!3347))
+- [Mitigate epic reference filter ReDOS](gitlab-org/security/gitlab@4c2cd6e5f7c994aca554be37d9ea9e5e114341f1) ([merge request](gitlab-org/security/gitlab!3339))
+- [Increasing security for CI_JOB_TOKEN on public and internal projects](gitlab-org/security/gitlab@4f8a00b2499e876df5b65eca921812fbb3215800) ([merge request](gitlab-org/security/gitlab!3319))
+- [Sanitize user email addresses in admin confirm user dialog](gitlab-org/security/gitlab@608c8001c349b0a62aae81850de669d3af02ab60) ([merge request](gitlab-org/security/gitlab!3332))
+- [Obfuscate email of service desk issue creator in issue REST API](gitlab-org/security/gitlab@a092ebc54cce4492f87f8ed2bf67c31793b0bd0e) ([merge request](gitlab-org/security/gitlab!3316))
+
## 15.11.9 (2023-06-15)
### Changed (1 change)
diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION
index e45d9a25ceb..ca5b37e6b32 100644
--- a/GITALY_SERVER_VERSION
+++ b/GITALY_SERVER_VERSION
@@ -1 +1 @@
-16.1.2 \ No newline at end of file
+3c713dfedbc90e788a2174037682a7a92ef8aa16
diff --git a/GITLAB_ELASTICSEARCH_INDEXER_VERSION b/GITLAB_ELASTICSEARCH_INDEXER_VERSION
index e198586e42b..43270543f77 100644
--- a/GITLAB_ELASTICSEARCH_INDEXER_VERSION
+++ b/GITLAB_ELASTICSEARCH_INDEXER_VERSION
@@ -1 +1 @@
-4.3.5
+4.3.6
diff --git a/GITLAB_KAS_VERSION b/GITLAB_KAS_VERSION
index e8233db7991..e27f7a8bf60 100644
--- a/GITLAB_KAS_VERSION
+++ b/GITLAB_KAS_VERSION
@@ -1 +1 @@
-v16.1.3
+v16.2.0
diff --git a/GITLAB_PAGES_VERSION b/GITLAB_PAGES_VERSION
index e45d9a25ceb..dfe23a89900 100644
--- a/GITLAB_PAGES_VERSION
+++ b/GITLAB_PAGES_VERSION
@@ -1 +1 @@
-16.1.2 \ No newline at end of file
+2a21892c80bd3b229073f091206247af66344dbe
diff --git a/Gemfile b/Gemfile
index ef5a22d2014..3e01bf6869b 100644
--- a/Gemfile
+++ b/Gemfile
@@ -13,13 +13,22 @@ gem 'bundler-checksum', '~> 0.1.0', path: 'vendor/gems/bundler-checksum', requir
# NOTE: When incrementing the major or minor version here, also increment activerecord_version
# in vendor/gems/attr_encrypted/attr_encrypted.gemspec until we resolve
# https://gitlab.com/gitlab-org/gitlab/-/issues/375713
-gem 'rails', '~> 6.1.7.2'
+#
+# See https://docs.gitlab.com/ee/development/gemfile.html#upgrade-rails for guidelines when upgrading Rails
+gem 'rails', '~> 7.0.6'
+
+gem 'activerecord-gitlab', path: 'gems/activerecord-gitlab'
gem 'bootsnap', '~> 1.16.0', require: false
gem 'openssl', '~> 3.0'
gem 'ipaddr', '~> 1.2.5'
+# GitLab Monorepo Gems
+group :monorepo do
+ gem 'gitlab-utils', path: 'gems/gitlab-utils'
+end
+
# Responders respond_to and respond_with
gem 'responders', '~> 3.0'
@@ -61,7 +70,7 @@ gem 'omniauth-gitlab', '~> 4.0.0', path: 'vendor/gems/omniauth-gitlab' # See ven
gem 'omniauth-google-oauth2', '~> 1.1'
gem 'omniauth-oauth2-generic', '~> 0.2.2'
gem 'omniauth-saml', '~> 2.1.0'
-gem 'omniauth-shibboleth-redux', '~> 2.0'
+gem 'omniauth-shibboleth-redux', '~> 2.0', require: 'omniauth-shibboleth'
gem 'omniauth-twitter', '~> 1.4'
gem 'omniauth_crowd', '~> 2.4.0', path: 'vendor/gems/omniauth_crowd' # See vendor/gems/omniauth_crowd/README.md
gem 'omniauth_openid_connect', '~> 0.6.1'
@@ -106,7 +115,7 @@ gem 'gpgme', '~> 2.0.22'
# GitLab fork with several improvements to original library. For full list of changes
# see https://github.com/intridea/omniauth-ldap/compare/master...gitlabhq:master
gem 'gitlab_omniauth-ldap', '~> 2.2.0', require: 'omniauth-ldap'
-gem 'net-ldap', '~> 0.18.0'
+gem 'net-ldap', '~> 0.17.1'
# API
gem 'grape', '~> 1.7.0'
@@ -173,9 +182,9 @@ gem 'seed-fu', '~> 2.3.7'
gem 'elasticsearch-model', '~> 7.2'
gem 'elasticsearch-rails', '~> 7.2', require: 'elasticsearch/rails/instrumentation'
gem 'elasticsearch-api', '7.13.3'
-gem 'aws-sdk-core', '~> 3.175.0'
+gem 'aws-sdk-core', '~> 3.178.0'
gem 'aws-sdk-cloudformation', '~> 1'
-gem 'aws-sdk-s3', '~> 1.126.0'
+gem 'aws-sdk-s3', '~> 1.130.0'
gem 'faraday_middleware-aws-sigv4', '~>0.3.0'
gem 'typhoeus', '~> 1.4.0' # Used with Elasticsearch to support http keep-alive connections
@@ -240,7 +249,7 @@ gem 'rainbow', '~> 3.0'
gem 'ruby-progressbar', '~> 1.10'
# Linear-time regex library for untrusted regular expressions
-gem 're2', '~> 1.6.0'
+gem 're2', '~> 1.7.0'
# Misc
@@ -317,6 +326,7 @@ gem 'sassc-rails', '~> 2.1.0'
gem 'autoprefixer-rails', '10.2.5.1'
gem 'terser', '1.0.2'
+gem 'click_house-client', path: 'gems/click_house-client', require: 'click_house/client'
gem 'addressable', '~> 2.8'
gem 'tanuki_emoji', '~> 0.6'
gem 'gon', '~> 6.4.0'
@@ -338,6 +348,8 @@ gem 'sentry-sidekiq', '~> 5.8.0'
#
gem 'pg_query', '~> 4.2.1'
+gem 'gitlab-schema-validation', path: 'gems/gitlab-schema-validation'
+
gem 'premailer-rails', '~> 1.10.3'
gem 'gitlab-labkit', '~> 0.33.0'
@@ -346,7 +358,7 @@ gem 'thrift', '>= 0.16.0'
# I18n
gem 'ruby_parser', '~> 3.20', require: false
gem 'rails-i18n', '~> 7.0'
-gem 'gettext_i18n_rails', '~> 1.8.0'
+gem 'gettext_i18n_rails', '~> 1.11.0'
gem 'gettext_i18n_rails_js', '~> 1.3'
gem 'gettext', '~> 3.3', require: false, group: :development
@@ -363,12 +375,12 @@ gem 'snowplow-tracker', '~> 0.8.0'
# Metrics
gem 'webrick', '~> 1.8.1', require: false
-gem 'prometheus-client-mmap', '~> 0.25', require: 'prometheus/client'
+gem 'prometheus-client-mmap', '~> 0.26', '>= 0.26.1', require: 'prometheus/client'
gem 'warning', '~> 1.3.0'
group :development do
- gem 'lefthook', '~> 1.4.2', require: false
+ gem 'lefthook', '~> 1.4.3', require: false
gem 'rubocop'
gem 'solargraph', '~> 0.47.2', require: false
@@ -406,7 +418,7 @@ group :development, :test do
gem 'spring', '~> 4.1.0'
gem 'spring-commands-rspec', '~> 1.0.4'
- gem 'gitlab-styles', '~> 10.0.0', require: false
+ gem 'gitlab-styles', '~> 10.1.0', require: false
gem 'haml_lint', '~> 0.40.0', require: false
gem 'bundler-audit', '~> 0.7.0.1', require: false
@@ -432,7 +444,7 @@ group :development, :test do
end
group :development, :test, :danger do
- gem 'gitlab-dangerfiles', '~> 3.10.0', require: false
+ gem 'gitlab-dangerfiles', '~> 3.11.0', require: false
end
group :development, :test, :coverage do
@@ -447,6 +459,12 @@ group :development, :test, :omnibus do
gem 'license_finder', '~> 7.0', require: false
end
+# Gems required in various pipelines
+group :development, :test, :monorepo do
+ gem 'gitlab-rspec', path: 'gems/gitlab-rspec'
+ gem 'rspec_flaky', path: 'gems/rspec_flaky'
+end
+
group :test do
gem 'fuubar', '~> 2.2.0'
gem 'rspec-retry', '~> 0.6.2'
@@ -454,10 +472,9 @@ group :test do
gem 'rspec-benchmark', '~> 0.6.0'
gem 'rspec-parameterized', '~> 1.0', require: false
- gem 'capybara', '~> 3.39', '>= 3.39.1'
+ gem 'capybara', '~> 3.39', '>= 3.39.2'
gem 'capybara-screenshot', '~> 1.0.26'
- # 4.9.1 drops Ruby 2.7 support. We can upgrade further after we drop Ruby 2.7 support.
- gem 'selenium-webdriver', '= 4.9.0'
+ gem 'selenium-webdriver', '= 4.10.0'
gem 'graphlyte', '~> 1.0.0'
@@ -466,7 +483,7 @@ group :test do
gem 'webmock', '~> 3.18.1'
gem 'rails-controller-testing'
gem 'concurrent-ruby', '~> 1.1'
- gem 'test-prof', '~> 1.2.1'
+ gem 'test-prof', '~> 1.2.2'
gem 'rspec_junit_formatter'
gem 'guard-rspec'
gem 'axe-core-rspec'
@@ -474,7 +491,7 @@ group :test do
# Moved in `test` because https://gitlab.com/gitlab-org/gitlab/-/issues/217527
gem 'derailed_benchmarks', require: false
- gem 'gitlab_quality-test_tooling', '~> 0.8.1', require: false
+ gem 'gitlab_quality-test_tooling', '~> 0.9.1', require: false
end
gem 'octokit', '~> 4.15'
@@ -509,14 +526,14 @@ gem 'ssh_data', '~> 1.3'
gem 'spamcheck', '~> 1.3.0'
# Gitaly GRPC protocol definitions
-gem 'gitaly', '~> 16.1.0-rc2'
+gem 'gitaly', '~> 16.2.0-rc2'
# KAS GRPC protocol definitions
-gem 'kas-grpc', '~> 0.1.0'
+gem 'kas-grpc', '~> 0.2.0'
-gem 'grpc', '~> 1.42.0'
+gem 'grpc', '~> 1.55.0'
-gem 'google-protobuf', '~> 3.23', '>= 3.23.3'
+gem 'google-protobuf', '~> 3.23', '>= 3.23.4'
gem 'toml-rb', '~> 2.2.0'
@@ -561,6 +578,7 @@ gem 'lockbox', '~> 1.1.1'
gem 'valid_email', '~> 0.1'
# JSON
+gem 'jsonb_accessor', '~> 1.3.10'
gem 'json', '~> 2.6.3'
gem 'json_schemer', '~> 0.2.18'
gem 'oj', '~> 3.13.21'
@@ -575,7 +593,7 @@ gem 'ipaddress', '~> 0.8.3'
gem 'parslet', '~> 1.8'
-gem 'ipynbdiff', path: 'vendor/gems/ipynbdiff'
+gem 'ipynbdiff', path: 'gems/ipynbdiff', require: 'ipynb_diff'
gem 'ed25519', '~> 1.3.0'
@@ -590,7 +608,7 @@ gem 'cvss-suite', '~> 3.0.1', require: 'cvss_suite'
gem 'arr-pm', '~> 0.0.12'
# Remote Development
-gem 'devfile', '~> 0.0.19.pre.alpha1'
+gem 'devfile', '~> 0.0.20.pre.alpha1'
# Apple plist parsing
gem 'CFPropertyList', '~> 3.0.0'
diff --git a/Gemfile.checksum b/Gemfile.checksum
index b2c07e5a201..333116430ec 100644
--- a/Gemfile.checksum
+++ b/Gemfile.checksum
@@ -2,18 +2,18 @@
{"name":"CFPropertyList","version":"3.0.5","platform":"ruby","checksum":"a78551cd4768d78ebca98488c27e33652ef818be64697a54676d34e6434674a4"},
{"name":"RedCloth","version":"4.3.2","platform":"ruby","checksum":"1ee7bc55c8dcec92cf7741a2132a9a6cd19e4b884fbc1b3aca23e1a4fcd92d55"},
{"name":"acme-client","version":"2.0.11","platform":"ruby","checksum":"edf6da9f3c5dbe3ab0c6738eb3b97978b7a60e3500445480d2a72fcc610089de"},
-{"name":"actioncable","version":"6.1.7.2","platform":"ruby","checksum":"7af0fda230fba5a8c8d28afff02b6e56e7871269b5799f2bc1c4f5a4f29134f9"},
-{"name":"actionmailbox","version":"6.1.7.2","platform":"ruby","checksum":"76bbf2b0561244dd6fe85c6c31d30edf574b0a976a6c492d48bbeb91b266ea2f"},
-{"name":"actionmailer","version":"6.1.7.2","platform":"ruby","checksum":"444281dcbceb946cf26e42016601de389995c53bcec21597ae8ad0a2c26d4de6"},
-{"name":"actionpack","version":"6.1.7.2","platform":"ruby","checksum":"ea471bc6dbfc793fc3632623807439f58424565f705f747aa6c85875b1365e30"},
-{"name":"actiontext","version":"6.1.7.2","platform":"ruby","checksum":"d237909c98bfc529c8db2895f5e74add2f3cb8e4040e09fad964c46052e4a8cb"},
-{"name":"actionview","version":"6.1.7.2","platform":"ruby","checksum":"ea03ef64da97b295ee498b95a1183ab738ec422a6e7deaf1dbd05502d17ce581"},
-{"name":"activejob","version":"6.1.7.2","platform":"ruby","checksum":"bfa6eef35d855ddfa1686ea46f13e9db384a7d0cb04557ba51a274e2b9a49146"},
-{"name":"activemodel","version":"6.1.7.2","platform":"ruby","checksum":"1217e806dc3c2b48ccf69cdf8a5ec8e6e2af56390faf102cb75e43278e3fc15a"},
-{"name":"activerecord","version":"6.1.7.2","platform":"ruby","checksum":"07f2f05fdd97cdd6fc520a261cb3c921ce5071db7aa32e81e8922c0ad6a8c9cc"},
+{"name":"actioncable","version":"7.0.6","platform":"ruby","checksum":"ac88be1e287cd9f228e6d4c0884278790210e59eaa23b603f58025183a66e2b4"},
+{"name":"actionmailbox","version":"7.0.6","platform":"ruby","checksum":"083ac338246640b13cb10c93777fe734e30ce89f82411f46b3929e7c9bf3b38b"},
+{"name":"actionmailer","version":"7.0.6","platform":"ruby","checksum":"33b442a99408d4b96558365ce92debb6c53204f8eaa8237741c594e7640ca107"},
+{"name":"actionpack","version":"7.0.6","platform":"ruby","checksum":"6c659afbffdbb32323df1d44882830206f5d7dc81ed3d840736ac39c5ae0c634"},
+{"name":"actiontext","version":"7.0.6","platform":"ruby","checksum":"d459eff29352433f5963bd191ff2e22a74cb6b21c2edbed09aef57f01074fe2e"},
+{"name":"actionview","version":"7.0.6","platform":"ruby","checksum":"a7224aca85e7be32997a3e6f12cf96fb529b14b6ec00fbaf4aa25df96e828ec5"},
+{"name":"activejob","version":"7.0.6","platform":"ruby","checksum":"78148bf1f0f011b5d9c8ed66d787728a174cb01a20cebc5e0f2a8352cce25cbd"},
+{"name":"activemodel","version":"7.0.6","platform":"ruby","checksum":"5231fe572d7599237b6b2a4987ebf439d028754a529227630777dd3d1ad8511c"},
+{"name":"activerecord","version":"7.0.6","platform":"ruby","checksum":"38ff1e7bbf57132fe78abf3809e8fe9392b54d00df31ce8972f47bb806b119d0"},
{"name":"activerecord-explain-analyze","version":"0.1.0","platform":"ruby","checksum":"5debb11fe23f35b91953a80677d80ba9284ee737fd9d148c1d7603ce45217f7b"},
-{"name":"activestorage","version":"6.1.7.2","platform":"ruby","checksum":"c3a27b42e7b40a1733b26ca86d83836575ed1437896a581e63d37d1500db6c30"},
-{"name":"activesupport","version":"6.1.7.2","platform":"ruby","checksum":"22eb2a7bb30ff7495de3920955839e62ca1de347185ffb15f70a0773a6c0f292"},
+{"name":"activestorage","version":"7.0.6","platform":"ruby","checksum":"9270183f7fee6ab4677b079a85ec2abeb041b2a7207c49dd81b5965c46dad50c"},
+{"name":"activesupport","version":"7.0.6","platform":"ruby","checksum":"d3abba6b15d8fd7af07f3322c370f00eb8ce6715fb714436342999628c705ab2"},
{"name":"acts-as-taggable-on","version":"9.0.0","platform":"ruby","checksum":"5a409be0eae125b7b02c1a7316264b40d4a583584a13d4ea4a6d82acdb351b86"},
{"name":"addressable","version":"2.8.1","platform":"ruby","checksum":"bc724a176ef02118c8a3ed6b5c04c39cf59209607ffcce77b91d0261dbadedfa"},
{"name":"aes_key_wrap","version":"1.1.0","platform":"ruby","checksum":"b935f4756b37375895db45669e79dfcdc0f7901e12d4e08974d5540c8e0776a5"},
@@ -37,10 +37,10 @@
{"name":"aws-eventstream","version":"1.2.0","platform":"ruby","checksum":"ffa53482c92880b001ff2fb06919b9bb82fd847cbb0fa244985d2ebb6dd0d1df"},
{"name":"aws-partitions","version":"1.761.0","platform":"ruby","checksum":"291e444e1edfc92c5521a6dbdd1236ccc3f122b3520163b2be6ec5b6ef350ef2"},
{"name":"aws-sdk-cloudformation","version":"1.41.0","platform":"ruby","checksum":"31e47539719734413671edf9b1a31f8673fbf9688549f50c41affabbcb1c6b26"},
-{"name":"aws-sdk-core","version":"3.175.0","platform":"ruby","checksum":"4fdf3636c42f99ddad21ebe2ddf9b4ff4960df77856ed7bf175eb6fb35fb6bb9"},
+{"name":"aws-sdk-core","version":"3.178.0","platform":"ruby","checksum":"192485a032536ff8c8eb037f1204b432129a612f4de13e36c0d2cf0dec8165cb"},
{"name":"aws-sdk-kms","version":"1.64.0","platform":"ruby","checksum":"40de596c95047bfc6e1aacea24f3df6241aa716b6f7ce08ac4c5f7e3120395ad"},
-{"name":"aws-sdk-s3","version":"1.126.0","platform":"ruby","checksum":"b1479d25f0268fd79a59244f027c8f5ac8ed3a61741ba93fc4357ec97322ca9f"},
-{"name":"aws-sigv4","version":"1.5.1","platform":"ruby","checksum":"d68c87fff4ee843b4b92b23c7f31f957f254ec6eb064181f7119124aab8b8bb4"},
+{"name":"aws-sdk-s3","version":"1.130.0","platform":"ruby","checksum":"80ac391ede15dcc62f1ada2fec12719a22148cf64ef76e5ec929558bb936c72a"},
+{"name":"aws-sigv4","version":"1.6.0","platform":"ruby","checksum":"ca9e6a15cd424f1f32b524b9760995331459bc22e67d3daad4fcf0c0084b087d"},
{"name":"axe-core-api","version":"4.6.0","platform":"ruby","checksum":"1b0ddec3353f108dc10363baf2282f43a5ff7f13d4e25f99071294e78f8a6c62"},
{"name":"axe-core-rspec","version":"4.6.0","platform":"ruby","checksum":"11c25bc9dd388c137ba4e5e63d64d20092bf22c884d8ffc829a22acfbacd747f"},
{"name":"axiom-types","version":"0.1.1","platform":"ruby","checksum":"c1ff113f3de516fa195b2db7e0a9a95fd1b08475a502ff660d04507a09980383"},
@@ -50,8 +50,8 @@
{"name":"backport","version":"1.2.0","platform":"ruby","checksum":"912c7dfdd9ee4625d013ddfccb6205c3f92da69a8990f65c440e40f5b2fc7f75"},
{"name":"base32","version":"0.3.2","platform":"ruby","checksum":"532e9b19c5dd1fce281df67fc93a803ebd5d26426a93f6dda6612769bc46fe2c"},
{"name":"batch-loader","version":"2.0.1","platform":"ruby","checksum":"93f711df78d316ee0440a7a45daba4f5418d0ee2b5f58f60c9ea038424e7a89d"},
-{"name":"bcrypt","version":"3.1.16","platform":"java","checksum":"2925a1546fa8e85bdb1b10f1fc95c4e1ea15992ada16adea4af82b0978ed662c"},
-{"name":"bcrypt","version":"3.1.16","platform":"ruby","checksum":"0b8bf031ba81aa76c0f10c5a8dac779b6035d84b09af1dbb2b1a32a7e360210b"},
+{"name":"bcrypt","version":"3.1.18","platform":"java","checksum":"5464e06c00cb6bd3ff982feef4cb7f1efc9b302753cbaf12e73512d8f401f2d2"},
+{"name":"bcrypt","version":"3.1.18","platform":"ruby","checksum":"154de0b0b089e56d5980c5037ad85fc9554cfbf4996538673c1ddbc9b61b1f11"},
{"name":"benchmark","version":"0.2.0","platform":"ruby","checksum":"5f7087b794613abdd3ac9c13f4351f65b164bcb15ced2ad29508e365f9b28c77"},
{"name":"benchmark-ips","version":"2.11.0","platform":"ruby","checksum":"1eaa89841073895af0ee7ff72eb069e5c7dda01c6d6a8b3e79e363bace596dec"},
{"name":"benchmark-malloc","version":"0.2.0","platform":"ruby","checksum":"37c68f0435261634026f584d79956a35325a3027e3e6b4cc8d7575aa10537e6b"},
@@ -67,7 +67,7 @@
{"name":"bullet","version":"7.0.2","platform":"ruby","checksum":"4b7986b366f694bb05d5c1b4ea8ba949a99224d4511bf02f0c3944112f719c81"},
{"name":"bundler-audit","version":"0.7.0.1","platform":"ruby","checksum":"12d853cb0b92fa8868abbb539414d7a33da9e48b792e2ff28271d36c8ace8912"},
{"name":"byebug","version":"11.1.3","platform":"ruby","checksum":"2485944d2bb21283c593d562f9ae1019bf80002143cc3a255aaffd4e9cf4a35b"},
-{"name":"capybara","version":"3.39.1","platform":"ruby","checksum":"25831b3860d54b88013e6e41b77412b2e6a80bcc59aa9a1d48b0f8de65210fe2"},
+{"name":"capybara","version":"3.39.2","platform":"ruby","checksum":"d6f0ca5f30897e64789428d4b047a0df105815a302069913578ac35d5ca99884"},
{"name":"capybara-screenshot","version":"1.0.26","platform":"ruby","checksum":"816b9370a07752097c82a05f568aaf5d3b7f45c3db5d3aab2014071e1b3c0c77"},
{"name":"carrierwave","version":"1.3.3","platform":"ruby","checksum":"0f0244de2ece54c80745b755993bd26cf47d4650823e5f89c115dbc9d73a13f1"},
{"name":"cbor","version":"0.5.9.6","platform":"ruby","checksum":"434a147658dd1df24ec9e7b3297c1fd4f8a691c97d0e688b3049df8e728b2114"},
@@ -109,9 +109,9 @@
{"name":"deprecation_toolkit","version":"1.5.1","platform":"ruby","checksum":"a8a1ab1a19ae40ea12560b65010e099f3459ebde390b76621ef0c21c516a04ba"},
{"name":"derailed_benchmarks","version":"2.1.2","platform":"ruby","checksum":"eaadc6206ceeb5538ff8f5e04a0023d54ebdd95d04f33e8960fb95a5f189a14f"},
{"name":"descendants_tracker","version":"0.0.4","platform":"ruby","checksum":"e9c41dd4cfbb85829a9301ea7e7c48c2a03b26f09319db230e6479ccdc780897"},
-{"name":"devfile","version":"0.0.19.pre.alpha1","platform":"arm64-darwin","checksum":"6087103d7e6c6226f2e9209d8619446afdb9bdaaf75cf7f6e06e929622465fe8"},
-{"name":"devfile","version":"0.0.19.pre.alpha1","platform":"ruby","checksum":"d928c4529162c1f2a8434d8509d9d760d15dfb3c133669199de0d12ba3ec9ed8"},
-{"name":"devfile","version":"0.0.19.pre.alpha1","platform":"x86_64-linux","checksum":"8c64e74eb470eedfd9a1754c40f82a6621a26735cdb22fc3d3dad4bc49445b37"},
+{"name":"devfile","version":"0.0.20.pre.alpha1","platform":"arm64-darwin","checksum":"1dcd4a55482f04a0ec308d13fe41358bfbfd95ffe98678a471aa5e0e0c5dba98"},
+{"name":"devfile","version":"0.0.20.pre.alpha1","platform":"ruby","checksum":"6a046be066c1b0392da1387249962d765d1f1a3a242e1ede0459b14a6d6fd760"},
+{"name":"devfile","version":"0.0.20.pre.alpha1","platform":"x86_64-linux","checksum":"d0fa2a05ae7de71a17c6251e853459504ed6a51cb1f90a25ba9d0b7c9cb82074"},
{"name":"device_detector","version":"1.0.0","platform":"ruby","checksum":"b800fb3150b00c23e87b6768011808ac1771fffaae74c3238ebaf2b782947a7d"},
{"name":"devise","version":"4.8.1","platform":"ruby","checksum":"fdd48bbe79a89e7c1152236a70479842ede48bea4fa7f4f2d8da1f872559803e"},
{"name":"devise-two-factor","version":"4.0.2","platform":"ruby","checksum":"6548d2696ed090d27046f888f4fa7380f151e0f823902d46fd9b91e7d0cac511"},
@@ -201,13 +201,13 @@
{"name":"gemoji","version":"3.0.1","platform":"ruby","checksum":"80553f2f4932a7a95fb1b3c7c63f7dd937e7c8c610164bbdea28fd06eba5f36d"},
{"name":"get_process_mem","version":"0.2.7","platform":"ruby","checksum":"4afd3c3641dd6a817c09806c7d6d509d8a9984512ac38dea8b917426bbf77eba"},
{"name":"gettext","version":"3.3.6","platform":"ruby","checksum":"ee6bbd1b2f833ee52d7797fa68acbfecc4726aec6b6280fd7eab92aa0190b413"},
-{"name":"gettext_i18n_rails","version":"1.8.0","platform":"ruby","checksum":"95e5cf8440b1e08705b27f2bccb56143272c5a7a0dabcf54ea1bd701140a496f"},
+{"name":"gettext_i18n_rails","version":"1.11.0","platform":"ruby","checksum":"e19c7e4a256c500f7f38396dca44a282b9838ae278f57c362993a54964b22bbe"},
{"name":"gettext_i18n_rails_js","version":"1.3.0","platform":"ruby","checksum":"5d10afe4be3639bff78c50a56768c20f39aecdabc580c08aa45573911c2bd687"},
{"name":"git","version":"1.11.0","platform":"ruby","checksum":"7e95ba4da8298a0373ef1a6862aa22007d761f3c8274b675aa787966fecea0f1"},
-{"name":"gitaly","version":"16.1.0.pre.rc2","platform":"ruby","checksum":"0007db161bd3f12321813e7095c8d3266d74b0a22b84d7cba8df864c0b88e3af"},
+{"name":"gitaly","version":"16.2.0.pre.rc2","platform":"ruby","checksum":"01fa84470399b4d6abba84cf97d17adb2082ca5eccd3130903a3abbc8cb072a0"},
{"name":"gitlab","version":"4.19.0","platform":"ruby","checksum":"3f645e3e195dbc24f0834fbf83e8ccfb2056d8e9712b01a640aad418a6949679"},
{"name":"gitlab-chronic","version":"0.10.5","platform":"ruby","checksum":"f80f18dc699b708870a80685243331290bc10cfeedb6b99c92219722f729c875"},
-{"name":"gitlab-dangerfiles","version":"3.10.0","platform":"ruby","checksum":"df4cfe051f52529c0256346d89d06d5ef2bb630928754eb620b5233eb9b14041"},
+{"name":"gitlab-dangerfiles","version":"3.11.0","platform":"ruby","checksum":"9a5cfe03e00c9d489782ad330ece4ce109e6cea1dcaae3eb41a5b5aed234a123"},
{"name":"gitlab-experiment","version":"0.7.1","platform":"ruby","checksum":"166dddb3aa83428bcaa93c35684ed01dc4d61f321fd2ae40b020806dc54a7824"},
{"name":"gitlab-fog-azure-rm","version":"1.7.0","platform":"ruby","checksum":"969c67943c54ad4c259a6acd040493f13922fbdf2211bb4eca00e71505263dc2"},
{"name":"gitlab-labkit","version":"0.33.0","platform":"ruby","checksum":"d1fba8d30fde314a3f5dee1921ac31860bed4fecd8aa98ac6671f2627479e05b"},
@@ -215,10 +215,10 @@
{"name":"gitlab-mail_room","version":"0.0.23","platform":"ruby","checksum":"23564fa4dab24ec5011d4c64a801fc0228301d5b0f046a26a1d8e96e36c19997"},
{"name":"gitlab-markup","version":"1.9.0","platform":"ruby","checksum":"7eda045a08ec2d110084252fa13a8c9eac8bdac0e302035ca7db4b82bcbd7ed4"},
{"name":"gitlab-net-dns","version":"0.9.2","platform":"ruby","checksum":"f726d978479d43810819f12a45c0906d775a07e34df111bbe693fffbbef3059d"},
-{"name":"gitlab-styles","version":"10.0.0","platform":"ruby","checksum":"8a1b20f7b5f351605ff4ed4ec648ef37226f2774d1e1377ed99389448d6913f0"},
+{"name":"gitlab-styles","version":"10.1.0","platform":"ruby","checksum":"f42745f5397d042fe24cf2d0eb56c995b37f9f43d8fb79b834d197a1cafdc84a"},
{"name":"gitlab_chronic_duration","version":"0.10.6.2","platform":"ruby","checksum":"6dda4cfe7dca9b958f163ac8835c3d9cc70cf8df8cbb89bb2fbf9ba4375105fb"},
{"name":"gitlab_omniauth-ldap","version":"2.2.0","platform":"ruby","checksum":"bb4d20acb3b123ed654a8f6a47d3fac673ece7ed0b6992edb92dca14bad2838c"},
-{"name":"gitlab_quality-test_tooling","version":"0.8.1","platform":"ruby","checksum":"01108f12c7b67aa0450ce76a4e669722f536250ff696abae9f126d072164bc0b"},
+{"name":"gitlab_quality-test_tooling","version":"0.9.1","platform":"ruby","checksum":"b69c661779f6cf44c336e5e8f73eb95a5b10988bb9158962af44a33a9a831fa2"},
{"name":"globalid","version":"1.1.0","platform":"ruby","checksum":"b337e1746f0c8cb0a6c918234b03a1ddeb4966206ce288fbb57779f59b2d154f"},
{"name":"gon","version":"6.4.0","platform":"ruby","checksum":"e3a618d659392890f1aa7db420f17c75fd7d35aeb5f8fe003697d02c4b88d2f0"},
{"name":"google-apis-androidpublisher_v3","version":"0.34.0","platform":"ruby","checksum":"d7e1d7dd92f79c498fe2082222a1740d788e022e660c135564b3fd299cab5425"},
@@ -241,16 +241,16 @@
{"name":"google-cloud-errors","version":"1.3.0","platform":"ruby","checksum":"450b681e24c089a20721a01acc4408bb4a7b0df28c175aaab488da917480d64b"},
{"name":"google-cloud-profiler-v2","version":"0.4.0","platform":"ruby","checksum":"53fc2ab175d08f54233c644310d47798feac996220916815c4fb44c937b5d3e3"},
{"name":"google-cloud-storage","version":"1.44.0","platform":"ruby","checksum":"299a1e055c9277c8120f7c10d21d37e4d8c17c7b963350c0e0bff7e9d9a570ea"},
-{"name":"google-protobuf","version":"3.23.3","platform":"aarch64-linux","checksum":"e6f432182dd45f6a72420a851f1d75feeb468e2a6a3cdf321f89bb67d24a4ecd"},
-{"name":"google-protobuf","version":"3.23.3","platform":"arm64-darwin","checksum":"1918c417b06fdfecaaa90820bda42cf48fc223b93118aab00f4c359580dfb551"},
-{"name":"google-protobuf","version":"3.23.3","platform":"java","checksum":"d7cb665addc9bf448d7552226f6742f2b415c06d3deace6df01b825233973936"},
-{"name":"google-protobuf","version":"3.23.3","platform":"ruby","checksum":"4dbc0a28db959cd37ccbb040da5c54b7bd672ef3b923d0dd0a99ea26cbdf9fa9"},
-{"name":"google-protobuf","version":"3.23.3","platform":"x64-mingw-ucrt","checksum":"c071371983b13ac5d4fe49c61892f12d76bac29527d43eed0f134f58a3d5edd6"},
-{"name":"google-protobuf","version":"3.23.3","platform":"x64-mingw32","checksum":"dd582a29bab6c6d8609dd7ce2f93c167451b9cb72dceebb7e3a89905de50f8b7"},
-{"name":"google-protobuf","version":"3.23.3","platform":"x86-linux","checksum":"15a618f0978c256bf20c99a71fb923014f5344283eedbc1f27050a1c5c6a9353"},
-{"name":"google-protobuf","version":"3.23.3","platform":"x86-mingw32","checksum":"52f7c824e7e1cf492c8052de1b339d15cdf6cdcf12554c6110d90b93776009cf"},
-{"name":"google-protobuf","version":"3.23.3","platform":"x86_64-darwin","checksum":"83da1ee5866145a692656d7ebedcfdd27cfdec420a6502c93bd61b0a0b72de67"},
-{"name":"google-protobuf","version":"3.23.3","platform":"x86_64-linux","checksum":"a280775e6b3277b4a8e1ebdc91f2bb7837bcf355e3d55085514829a0765f040b"},
+{"name":"google-protobuf","version":"3.23.4","platform":"aarch64-linux","checksum":"f886ff6f24a4de32e08915d398e574e444eda289999124acfc7c5d1fd1eec7f5"},
+{"name":"google-protobuf","version":"3.23.4","platform":"arm64-darwin","checksum":"2637adb0fc734e9f2d0118c37ae1934fac6fe19ad28dabcb49790a4711cdee99"},
+{"name":"google-protobuf","version":"3.23.4","platform":"java","checksum":"a3346070a005c92f9a50c4d3d83964149e8f1bb4edf7e026fc337315f50117f0"},
+{"name":"google-protobuf","version":"3.23.4","platform":"ruby","checksum":"f239ea4b2009976d102e55e808b778abd18ce20721f32c3fcaf829d8e7a305b7"},
+{"name":"google-protobuf","version":"3.23.4","platform":"x64-mingw-ucrt","checksum":"0c7fde44cb23df5905fa4f9f7c1c629f5be10cef3cb36d89f4cb025eee6627e3"},
+{"name":"google-protobuf","version":"3.23.4","platform":"x64-mingw32","checksum":"bc8a2801dfdf73e41565d72ba1d15bcf5cf72e05d34099cc7fcd39727111f3d2"},
+{"name":"google-protobuf","version":"3.23.4","platform":"x86-linux","checksum":"49d380017efcd03972fc007faad9aa9a47cb60dab484094bf233969b7c355b93"},
+{"name":"google-protobuf","version":"3.23.4","platform":"x86-mingw32","checksum":"9583cb050c064ee9adc1eb88f6bf9db081f6d4f4f3accb18653f0c392a5ed999"},
+{"name":"google-protobuf","version":"3.23.4","platform":"x86_64-darwin","checksum":"2d324de99d797287e8845ef1ebf561c9f9b396f7dba4075fa4f34000be94d641"},
+{"name":"google-protobuf","version":"3.23.4","platform":"x86_64-linux","checksum":"73a753b1aa0305d3de31ba5c8f692821efafb8e7f8250a88877bc0fc9a1abea5"},
{"name":"googleapis-common-protos","version":"1.4.0","platform":"ruby","checksum":"da2380fb5ab1563580816c74e8d684ac17512c3654c829a3ee84f6d6139de382"},
{"name":"googleapis-common-protos-types","version":"1.5.0","platform":"ruby","checksum":"5769cf7376abc86ef7f5897a4aaca1d5c5a3c49ddabeddd2c251fcf8155f858b"},
{"name":"googleauth","version":"1.3.0","platform":"ruby","checksum":"51dd7362353cf1e90a2d01e1fb94321ae3926c776d4dc4a79db65230217ffcc2"},
@@ -267,12 +267,13 @@
{"name":"graphql","version":"1.13.12","platform":"ruby","checksum":"1d82666cf201193a8d0cb54cea38576b820418db4869b549f61a35f3a2d97ac3"},
{"name":"graphql-client","version":"0.17.0","platform":"ruby","checksum":"5aaf02ce8f2dbc8e3ba05a7eaeb3ad9336762c4424c6093f4438fbb9490eeb5d"},
{"name":"graphql-docs","version":"2.1.0","platform":"ruby","checksum":"7eb82402f8fda455104b2b60364e9ada145d79d3121a8f915790d49da38bb576"},
-{"name":"grpc","version":"1.42.0","platform":"ruby","checksum":"b3d2649e67c6a636544996843d9ec191699c54c1aca797dbfea4dff36c14584a"},
-{"name":"grpc","version":"1.42.0","platform":"x64-mingw32","checksum":"6aac1b6576134b0a83e000b1269f60d502eb24aee96c64e2658c3f24f8e32ac0"},
-{"name":"grpc","version":"1.42.0","platform":"x86-linux","checksum":"4aa50538aa929f1f3bcefb11c65ee1a1606b5aef838ea4d4e93c100b5f4263a5"},
-{"name":"grpc","version":"1.42.0","platform":"x86-mingw32","checksum":"eeb2a9381bea43fafe879b6ddaa011351a44d0894d48bdc965a07bcb67c6eb56"},
-{"name":"grpc","version":"1.42.0","platform":"x86_64-darwin","checksum":"20fa202d46d8a055628260622e98fb6439529fbac283f0552af620b909f78535"},
-{"name":"grpc","version":"1.42.0","platform":"x86_64-linux","checksum":"92e2ceb2aca335d5755163dd8030082091d5b0e63c117b1ca07051b66c53eb2e"},
+{"name":"grpc","version":"1.55.0","platform":"ruby","checksum":"529332f8e5e98f5b138afd5c4a9c7bdc9e247f4c10c84c1adbf1a114eba161ae"},
+{"name":"grpc","version":"1.55.0","platform":"x64-mingw-ucrt","checksum":"6b5c7b7358476469c5ecb46f35e1eff6983efc9395d9db8db0a2eb4207c82ffb"},
+{"name":"grpc","version":"1.55.0","platform":"x64-mingw32","checksum":"73755c256fc0fe5361a979cd609414ebdaa5862f5821fba20ea31110f1d87405"},
+{"name":"grpc","version":"1.55.0","platform":"x86-linux","checksum":"37c20569a17b1cff91155f193b0df41eb42fd0aed9051fa91ccca273a259e393"},
+{"name":"grpc","version":"1.55.0","platform":"x86-mingw32","checksum":"6b4144b5af8086b46b2e62b5fbda50fc19105a4efefafaca63e15b0384c42274"},
+{"name":"grpc","version":"1.55.0","platform":"x86_64-darwin","checksum":"d7f57eb84811d7ea2a9464ec88d9296a92801f643a4d7cf76cf4896edf12a25c"},
+{"name":"grpc","version":"1.55.0","platform":"x86_64-linux","checksum":"4ee73555759774db22ba23ff79c332cce7ae08b0ba4d4b33ab4747e83e0a8518"},
{"name":"gssapi","version":"1.3.1","platform":"ruby","checksum":"c51cf30842ee39bd93ce7fc33e20405ff8a04cda9dec6092071b61258284aee1"},
{"name":"guard","version":"2.16.2","platform":"ruby","checksum":"71ba7abaddecc8be91ab77bbaf78f767246603652ebbc7b976fda497ebdc8fbb"},
{"name":"guard-compat","version":"1.2.1","platform":"ruby","checksum":"3ad21ab0070107f92edfd82610b5cdc2fb8e368851e72362ada9703443d646fe"},
@@ -316,19 +317,21 @@
{"name":"json","version":"2.6.3","platform":"ruby","checksum":"86aaea16adf346a2b22743d88f8dcceeb1038843989ab93cda44b5176c845459"},
{"name":"json-jwt","version":"1.15.3","platform":"ruby","checksum":"66db4f14e538a774c15502a5b5b26b1f3e7585481bbb96df490aa74b5c2d6110"},
{"name":"json_schemer","version":"0.2.18","platform":"ruby","checksum":"3362c21efbefdd12ce994e541a1e7fdb86fd267a6541dd8715e8a580fe3b6be6"},
+{"name":"jsonb_accessor","version":"1.3.10","platform":"java","checksum":"6630ac69dac46457b03e1352178ed3e2d7ba2d8edb99f2e9b64a0e60cda9ed26"},
+{"name":"jsonb_accessor","version":"1.3.10","platform":"ruby","checksum":"670f80a257ae39e3be9233c6a8ef3b03517e06687affe510dfe61237454c58e0"},
{"name":"jsonpath","version":"1.1.2","platform":"ruby","checksum":"6804124c244d04418218acb85b15c7caa79c592d7d6970195300428458946d3a"},
{"name":"jwt","version":"2.5.0","platform":"ruby","checksum":"b835fe55287572e1f65128d6c12d3ff7402bb4652c4565bf3ecdcb974db7954d"},
{"name":"kaminari","version":"1.2.2","platform":"ruby","checksum":"c4076ff9adccc6109408333f87b5c4abbda5e39dc464bd4c66d06d9f73442a3e"},
{"name":"kaminari-actionview","version":"1.2.2","platform":"ruby","checksum":"1330f6fc8b59a4a4ef6a549ff8a224797289ebf7a3a503e8c1652535287cc909"},
{"name":"kaminari-activerecord","version":"1.2.2","platform":"ruby","checksum":"0dd3a67bab356a356f36b3b7236bcb81cef313095365befe8e98057dd2472430"},
{"name":"kaminari-core","version":"1.2.2","platform":"ruby","checksum":"3bd26fec7370645af40ca73b9426a448d09b8a8ba7afa9ba3c3e0d39cdbb83ff"},
-{"name":"kas-grpc","version":"0.1.0","platform":"ruby","checksum":"b219c79b7bddf1f3ac6a78119e25b0b52c0c29608b3a80c75929c47f32a50dda"},
+{"name":"kas-grpc","version":"0.2.0","platform":"ruby","checksum":"b9a3f787ec9198819034ec358d73b9a3f374d4dd001d673fdaa650eb5ec99a1e"},
{"name":"knapsack","version":"1.21.1","platform":"ruby","checksum":"82f70422adebcacec1b514f6ebff65265fc85d836e3c320718a160d8ac41cf14"},
{"name":"kramdown","version":"2.3.2","platform":"ruby","checksum":"cb4530c2e9d16481591df2c9336723683c354e5416a5dd3e447fa48215a6a71c"},
{"name":"kramdown-parser-gfm","version":"1.1.0","platform":"ruby","checksum":"fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729"},
{"name":"kubeclient","version":"4.11.0","platform":"ruby","checksum":"4985fcd749fb8c364a668a8350a49821647f03aa52d9ee6cbc582beb8e883fcc"},
{"name":"launchy","version":"2.5.0","platform":"ruby","checksum":"954243c4255920982ce682f89a42e76372dba94770bf09c23a523e204bdebef5"},
-{"name":"lefthook","version":"1.4.2","platform":"ruby","checksum":"703fbe4389dddf3833b74e75a83f6ba67c995be53ce6ab247b66e62932760e43"},
+{"name":"lefthook","version":"1.4.3","platform":"ruby","checksum":"6a12e2f2a3c04cbe9c934417f7a0c939429ba8bdb06c2d33a406281343a8045f"},
{"name":"letter_opener","version":"1.7.0","platform":"ruby","checksum":"095bc0d58e006e5b43ea7d219e64ecf2de8d1f7d9dafc432040a845cf59b4725"},
{"name":"letter_opener_web","version":"2.0.0","platform":"ruby","checksum":"33860ad41e1785d75456500e8ca8bba8ed71ee6eaf08a98d06bbab67c5577b6f"},
{"name":"libyajl2","version":"1.2.0","platform":"ruby","checksum":"1117cd1e48db013b626e36269bbf1cef210538ca6d2e62d3fa3db9ded005b258"},
@@ -378,7 +381,7 @@
{"name":"net-http","version":"0.1.1","platform":"ruby","checksum":"75a4e109b6f9af32fad0e98a6180c47aceb415927ca3bd70c8fc3e7dbbabbe86"},
{"name":"net-http-persistent","version":"4.0.1","platform":"ruby","checksum":"2752f4cce05fd1c45e0537c6f3a98fa5a4899efd5f88e63c104ed5f05cbddef9"},
{"name":"net-imap","version":"0.3.4","platform":"ruby","checksum":"a82a59e2a429433dc54cae5a8b2979ffe49da8c66085740811bfa337dc3729b5"},
-{"name":"net-ldap","version":"0.18.0","platform":"ruby","checksum":"59adc934c4ab000c8bb02cffb6d415af6cc17f03e1fee80823a60436ac730c77"},
+{"name":"net-ldap","version":"0.17.1","platform":"ruby","checksum":"52571b55f9157120833ac1667f2969ce0139251811d0a9b64657c1c135069cf9"},
{"name":"net-ntp","version":"2.1.3","platform":"ruby","checksum":"5bc73f4102bde0d1872bd3b293608ae99d9f5007d744f21919c6a565eda9267d"},
{"name":"net-pop","version":"0.1.2","platform":"ruby","checksum":"848b4e982013c15b2f0382792268763b748cce91c9e91e36b0f27ed26420dff3"},
{"name":"net-protocol","version":"0.1.3","platform":"ruby","checksum":"ad43e2be965ede676683c047b2c3d76762aa49a764779d98312a10da04622c14"},
@@ -452,11 +455,11 @@
{"name":"premailer","version":"1.16.0","platform":"ruby","checksum":"03e4402c448e6bae13fb5f6301a8bde4f3508e1bff90ae7c0972c7be94694786"},
{"name":"premailer-rails","version":"1.10.3","platform":"ruby","checksum":"7cdcb97027866f7a81c490c6d15ada7f39666b5f6375f0821b7e97e0483b112f"},
{"name":"proc_to_ast","version":"0.1.0","platform":"ruby","checksum":"92a73fa66e2250a83f8589f818b0751bcf227c68f85916202df7af85082f8691"},
-{"name":"prometheus-client-mmap","version":"0.25.0","platform":"aarch64-linux","checksum":"0548954d183b0749ecd0983ea5e046a22137ae8accd5c86c64bc6d0ec57ef5c6"},
-{"name":"prometheus-client-mmap","version":"0.25.0","platform":"arm64-darwin","checksum":"3d5e5665d9de0488cf09663c5a2583470ab726cead90011b1b11571057507157"},
-{"name":"prometheus-client-mmap","version":"0.25.0","platform":"ruby","checksum":"d75dc28326633d780dc43f93be610253fab654ab35f876138cd35080b54fa092"},
-{"name":"prometheus-client-mmap","version":"0.25.0","platform":"x86_64-darwin","checksum":"c33859d23a5f925a76a79d63b50d94e5e181b4ed03b0f8836d23208aec655446"},
-{"name":"prometheus-client-mmap","version":"0.25.0","platform":"x86_64-linux","checksum":"2ea418c3ac327d28506d01898d9fa9cae967317244c39ebdb34680ac6cb0c1e9"},
+{"name":"prometheus-client-mmap","version":"0.26.1","platform":"aarch64-linux","checksum":"ec4100c06d79f8d8efa35711cb006c7076b346894499fe204ddb606d1f0f0959"},
+{"name":"prometheus-client-mmap","version":"0.26.1","platform":"arm64-darwin","checksum":"6fdf9cc0579f533e10d4421bbde7767659ab30138004bcfea27f28d60a359097"},
+{"name":"prometheus-client-mmap","version":"0.26.1","platform":"ruby","checksum":"44f3b86b2d3fba5be80662102cad5e5d71595e6f579dc37ee040bdfbb6312527"},
+{"name":"prometheus-client-mmap","version":"0.26.1","platform":"x86_64-darwin","checksum":"f7f251f39777fda01cee17e3659db6cca524b5ad38824fd815cf98f142d647c7"},
+{"name":"prometheus-client-mmap","version":"0.26.1","platform":"x86_64-linux","checksum":"0d48749ac8f5045629caed44c89540b0ba62793d99062cd8f474deb83cbb98f1"},
{"name":"pry","version":"0.14.2","platform":"java","checksum":"fd780670977ba04ff7ee32dabd4d02fe4bf02e977afe8809832d5dca1412862e"},
{"name":"pry","version":"0.14.2","platform":"ruby","checksum":"c4fe54efedaca1d351280b45b8849af363184696fcac1c72e0415f9bdac4334d"},
{"name":"pry-byebug","version":"3.10.1","platform":"ruby","checksum":"c8f975c32255bfdb29e151f5532130be64ff3d0042dc858d0907e849125581f8"},
@@ -476,14 +479,14 @@
{"name":"rack-oauth2","version":"1.21.3","platform":"ruby","checksum":"4e72a79dd6a866692e84422a552b27c38a5a1918ded06661e04910f2bbe676ba"},
{"name":"rack-protection","version":"2.2.2","platform":"ruby","checksum":"fd41414dbabbec274af0bdb1f72a48504449de4d979782c9af38cbb5dfff3299"},
{"name":"rack-proxy","version":"0.7.6","platform":"ruby","checksum":"8704c5009bb60eb16dacf4bcc5e067a8484e668321e8443534bb58ded320c2a8"},
-{"name":"rack-test","version":"2.0.2","platform":"ruby","checksum":"adadd0e957f63a34199a9fdf905a920a0b0a50795735095b4ac4bd3c13385466"},
+{"name":"rack-test","version":"2.1.0","platform":"ruby","checksum":"0c61fc61904049d691922ea4bb99e28004ed3f43aa5cfd495024cc345f125dfb"},
{"name":"rack-timeout","version":"0.6.3","platform":"ruby","checksum":"1754892eacc124d405e7f1145731ec9b7421ebd1bee5d51ddc18b72c204d0ab3"},
-{"name":"rails","version":"6.1.7.2","platform":"ruby","checksum":"d50796f4106fe1793e048e80e11bc9aee4af1674c94a24ebe7f7b411217befac"},
+{"name":"rails","version":"7.0.6","platform":"ruby","checksum":"5dfbd481a23556ad425fc8541399a129a08ed550f877294b44d0170ca5b9f421"},
{"name":"rails-controller-testing","version":"1.0.5","platform":"ruby","checksum":"741448db59366073e86fc965ba403f881c636b79a2c39a48d0486f2607182e94"},
{"name":"rails-dom-testing","version":"2.0.3","platform":"ruby","checksum":"b140c4f39f6e609c8113137b9a60dfc2ecb89864e496f87f23a68b3b8f12d8d1"},
{"name":"rails-html-sanitizer","version":"1.5.0","platform":"ruby","checksum":"bf326075e8a968cd882c30b15a4c9100059be3af2356093dc68324ec3bd9ea79"},
{"name":"rails-i18n","version":"7.0.3","platform":"ruby","checksum":"e3158e98c5332d129fd5131f171ac575eb30dbb8919b21595382b08850cf2bd3"},
-{"name":"railties","version":"6.1.7.2","platform":"ruby","checksum":"5390d8aade88fb7452de6798c2385b21cff74219e49989b6b1b484e387b3a356"},
+{"name":"railties","version":"7.0.6","platform":"ruby","checksum":"fb0ee3c7a3beea7f4b353c655f9a055c31ca36c3a2a565afaed415baca5c8a35"},
{"name":"rainbow","version":"3.1.1","platform":"ruby","checksum":"039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a"},
{"name":"rake","version":"13.0.6","platform":"ruby","checksum":"5ce4bf5037b4196c24ac62834d8db1ce175470391026bd9e557d669beeb19097"},
{"name":"rb-fsevent","version":"0.11.2","platform":"ruby","checksum":"43900b972e7301d6570f64b850a5aa67833ee7d87b458ee92805d56b7318aefe"},
@@ -493,7 +496,7 @@
{"name":"rbtree","version":"0.4.6","platform":"ruby","checksum":"14eea4469b24fd2472542e5f3eb105d6344c8ccf36f0b56d55fdcfeb4e0f10fc"},
{"name":"rchardet","version":"1.8.0","platform":"ruby","checksum":"693acd5253d5ade81a51940697955f6dd4bb2f0d245bda76a8e23deec70a52c7"},
{"name":"rdoc","version":"6.3.2","platform":"ruby","checksum":"def4a720235c27d56c176ae73555e647eb04ea58a8bbaa927f8f9f79de7805a6"},
-{"name":"re2","version":"1.6.0","platform":"ruby","checksum":"2e37f27971f6a76223eac688c04f3e48aea374f34b302ec22d75b4635cd64bc1"},
+{"name":"re2","version":"1.7.0","platform":"ruby","checksum":"0ccf19e3b289e67b56bd89a542488075de98d9b101b9946c4133d4b96af4d903"},
{"name":"recaptcha","version":"5.12.3","platform":"ruby","checksum":"37d1894add9e70a54d0c6c7f0ecbeedffbfa7d075acfbd4c509818dfdebdb7ee"},
{"name":"recursive-open-struct","version":"1.1.3","platform":"ruby","checksum":"a3538a72552fcebcd0ada657bdff313641a4a5fbc482c08cfb9a65acb1c9de5a"},
{"name":"redcarpet","version":"3.6.0","platform":"ruby","checksum":"8ad1889c0355ff4c47174af14edd06d62f45a326da1da6e8a121d59bdcd2e9e9"},
@@ -507,7 +510,7 @@
{"name":"regexp_property_values","version":"1.0.0","platform":"ruby","checksum":"162499dc0bba1e66d334273a059f207a61981cc8cc69d2ca743594e7886d080f"},
{"name":"representable","version":"3.2.0","platform":"ruby","checksum":"cc29bf7eebc31653586849371a43ffe36c60b54b0a6365b5f7d95ec34d1ebace"},
{"name":"request_store","version":"1.5.1","platform":"ruby","checksum":"07a204d161590789f2b1d27f9f0eadcdecd6d868cb2f03240250e1bc747df78e"},
-{"name":"responders","version":"3.0.0","platform":"ruby","checksum":"a267b281582802d04cf0968dbc7d60df0d48384915934b3bf9018f811dc3f7dc"},
+{"name":"responders","version":"3.0.1","platform":"ruby","checksum":"613fe28e498987f4feaa3230aa6313ca4bd5f0563a3da83511b0dd6cd8f47292"},
{"name":"rest-client","version":"2.1.0","platform":"ruby","checksum":"35a6400bdb14fae28596618e312776c158f7ebbb0ccad752ff4fa142bf2747e3"},
{"name":"rest-client","version":"2.1.0","platform":"x64-mingw32","checksum":"7cd156496196d90b7d8f5b8de521ef67d8a9e03f06862da80b9b5912ab05a470"},
{"name":"rest-client","version":"2.1.0","platform":"x86-mingw32","checksum":"fb543caf36cb555c05c6186aeb1273c6a1b059896e4cfd394e7269b20c40ca01"},
@@ -533,13 +536,14 @@
{"name":"rspec-support","version":"3.12.0","platform":"ruby","checksum":"dd4d44b247ff679b95b5607ac5641d197a5f9b1d33f916123cb98fc5f917c58b"},
{"name":"rspec_junit_formatter","version":"0.6.0","platform":"ruby","checksum":"40dde674e6ae4e6cc0ff560da25497677e34fefd2338cc467a8972f602b62b15"},
{"name":"rspec_profiling","version":"0.0.6","platform":"ruby","checksum":"7a45697f79dcec9a174a0e26703465f6bd52ee78e8d798741240bfcef38f6e6e"},
-{"name":"rubocop","version":"1.43.0","platform":"ruby","checksum":"d08127ff6d99b7217b9ac27b51be872270bc7f19151706d799e18a5e4777adc6"},
-{"name":"rubocop-ast","version":"1.24.1","platform":"ruby","checksum":"6dd194309d48ebb1c558329ffd46a04e2fdf1652d8cde574f963c392fe52bfdd"},
-{"name":"rubocop-capybara","version":"2.17.0","platform":"ruby","checksum":"bbdc757d091788fafc37a634c54e1a930489498a36f81321c5c50cf0a76498c0"},
+{"name":"rubocop","version":"1.50.2","platform":"ruby","checksum":"7cfeb0616f686ac61d049beae89f31446792d7e9f5728152657548f70aa78650"},
+{"name":"rubocop-ast","version":"1.29.0","platform":"ruby","checksum":"d1da2ab279a074baefc81758ac430c5768a8da8c7438dd4e5819ce5984d00ba1"},
+{"name":"rubocop-capybara","version":"2.18.0","platform":"ruby","checksum":"66b256755101f76dc455ba9694e2414bc957db5200401d204b00bc835401d605"},
+{"name":"rubocop-factory_bot","version":"2.23.1","platform":"ruby","checksum":"c19ee30c02e591f4293c07e943e22b7999c545d5010aac4d79621ee310850c4f"},
{"name":"rubocop-graphql","version":"0.19.0","platform":"ruby","checksum":"ba4b2fc91c9f0fda47e0870a6ae15a1e5525d6caffcb150dc88b00caaacc3e43"},
-{"name":"rubocop-performance","version":"1.16.0","platform":"ruby","checksum":"cc764f84bf37c6ef269973e686c3b33f258ffd612130e40856b25103de06efd8"},
-{"name":"rubocop-rails","version":"2.17.4","platform":"ruby","checksum":"8004149a14372d3d6cededd000357879fa7eb0421403a7a26bc717e2a98bbedb"},
-{"name":"rubocop-rspec","version":"2.18.1","platform":"ruby","checksum":"41c6455630fc98b809ebca047413389e2b7e3f68975028365c07bfea878db5ee"},
+{"name":"rubocop-performance","version":"1.18.0","platform":"ruby","checksum":"4c9d74f1b5bfaffb5b1cdb843279364198ac804e2644ae194615834dd011e02e"},
+{"name":"rubocop-rails","version":"2.20.2","platform":"ruby","checksum":"d20cbd613900fa22bcf85a7fba78ab68b21fc4f90b1e73c97284d40674332417"},
+{"name":"rubocop-rspec","version":"2.22.0","platform":"ruby","checksum":"2d7493222c81c78ad304ddd81aaf64b3543bcfac6d3d8706c220331921753a03"},
{"name":"ruby-fogbugz","version":"0.3.0","platform":"ruby","checksum":"5e04cde474648f498a71cf1e1a7ab42c66b953862fbe224f793ec0a7a1d5f657"},
{"name":"ruby-magic","version":"0.6.0","platform":"ruby","checksum":"7b2138877b7d23aff812c95564eba6473b74b815ef85beb0eb792e729a2b6101"},
{"name":"ruby-openai","version":"3.7.0","platform":"ruby","checksum":"fb735d4c055e282ade264cab9864944c05a8a10e0cddd45a0551e8a9851b1850"},
@@ -563,13 +567,13 @@
{"name":"sawyer","version":"0.9.2","platform":"ruby","checksum":"fa3a72d62a4525517b18857ddb78926aab3424de0129be6772a8e2ba240e7aca"},
{"name":"sd_notify","version":"0.1.1","platform":"ruby","checksum":"cbc7ac6caa7cedd26b30a72b5eeb6f36050dc0752df263452ea24fb5a4ad3131"},
{"name":"seed-fu","version":"2.3.7","platform":"ruby","checksum":"f19673443e9af799b730e3d4eca6a89b39e5a36825015dffd00d02ea3365cf74"},
-{"name":"selenium-webdriver","version":"4.9.0","platform":"ruby","checksum":"0f5fc4118ab231e5ef1895b1e14a4366eb9d73d60a8e42b0d84f69cdfdd8b6cf"},
+{"name":"selenium-webdriver","version":"4.10.0","platform":"ruby","checksum":"a322af38f9a8966a6c3ab85c365b08c5556cdef72f577905b2b42469faee9d43"},
{"name":"semver_dialects","version":"1.2.1","platform":"ruby","checksum":"60a1f67659f79c51a667e8858ec9b089c1e4ce4f6d2a0f0b4ac101916946eb23"},
{"name":"sentry-rails","version":"5.8.0","platform":"ruby","checksum":"c11b2d909de2c2bfda793c45f64180fd784d54c46886338b683ee3f8efa7731b"},
{"name":"sentry-raven","version":"3.1.2","platform":"ruby","checksum":"103d3b122958810d34898ce2e705bcf549ddb9d855a70ce9a3970ee2484f364a"},
{"name":"sentry-ruby","version":"5.8.0","platform":"ruby","checksum":"caeb121433be379fb94e991a45265a287b13a9a9083e7264f539752369d37110"},
{"name":"sentry-sidekiq","version":"5.8.0","platform":"ruby","checksum":"90d1123d16a9fc5fd99dbad190b766dd189eaf9e2baddad641f1334e1877c779"},
-{"name":"set","version":"1.0.1","platform":"ruby","checksum":"d169fe8df4738e9da1118199429a9cf1ce0ac5e8a3cacc481e2ed24d585419dd"},
+{"name":"set","version":"1.0.2","platform":"ruby","checksum":"02ffa4de1f2621495e05b72326040dd014d7abbcb02fea698bc600a389992c02"},
{"name":"sexp_processor","version":"4.16.1","platform":"ruby","checksum":"5caadbf4bbe5ab539cb892a5bcf74ca33a2f2a897cecafdee4a63be79b4819dc"},
{"name":"shellany","version":"0.0.1","platform":"ruby","checksum":"0e127a9132698766d7e752e82cdac8250b6adbd09e6c0a7fbbb6f61964fedee7"},
{"name":"shoulda-matchers","version":"5.1.0","platform":"ruby","checksum":"a01d20589989e9653ab4a28c67d9db2b82bcf0a2496cf01d5e1a95a4aaaf5b07"},
@@ -625,7 +629,7 @@
{"name":"term-ansicolor","version":"1.7.1","platform":"ruby","checksum":"92339ffec77c4bddc786a29385c91601dd52fc68feda23609bba0491229b05f7"},
{"name":"terminal-table","version":"3.0.2","platform":"ruby","checksum":"f951b6af5f3e00203fb290a669e0a85c5dd5b051b3b023392ccfd67ba5abae91"},
{"name":"terser","version":"1.0.2","platform":"ruby","checksum":"80c2e0bc7e2db4e12e8529658f9e0820e13d685ae67d745bf981f269743bb28e"},
-{"name":"test-prof","version":"1.2.1","platform":"ruby","checksum":"ea8ac9b75cecc0be469457f9b4681d6f70e3005ff1313907d8553dd7e5c1f026"},
+{"name":"test-prof","version":"1.2.2","platform":"ruby","checksum":"528af83bcbd1778e1dc1adbbced359fdfe9e65409d10bdd0defddd964d214522"},
{"name":"test_file_finder","version":"0.1.4","platform":"ruby","checksum":"bc36d8339eac4fb9dc36514a7c5f4d389ac2fb6d010716fc715c5c8fbb98eacd"},
{"name":"text","version":"1.3.1","platform":"ruby","checksum":"2fbbbc82c1ce79c4195b13018a87cbb00d762bda39241bb3cdc32792759dd3f4"},
{"name":"thor","version":"1.2.1","platform":"ruby","checksum":"b1752153dc9c6b8d3fcaa665e9e1a00a3e73f28da5e238b81c404502e539d446"},
@@ -694,5 +698,5 @@
{"name":"xpath","version":"3.2.0","platform":"ruby","checksum":"6dfda79d91bb3b949b947ecc5919f042ef2f399b904013eb3ef6d20dd3a4082e"},
{"name":"yajl-ruby","version":"1.4.3","platform":"ruby","checksum":"8c974d9c11ae07b0a3b6d26efea8407269b02e4138118fbe3ef0d2ec9724d1d2"},
{"name":"yard","version":"0.9.26","platform":"ruby","checksum":"30594aa05cf737aa725c73444c7be3d54a443d0e258e1503da4eb1a0822cf963"},
-{"name":"zeitwerk","version":"2.6.6","platform":"ruby","checksum":"bb397b50c31127f8dab372fa9b21da1e7c453c5b57da172ed858136c6283f826"}
+{"name":"zeitwerk","version":"2.6.7","platform":"ruby","checksum":"61767a6158480df290d0d2a3fd860d8ba3a28ba113837668ee94b657716a1409"}
]
diff --git a/Gemfile.lock b/Gemfile.lock
index 3aaf6a45930..3add4cdfda3 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,4 +1,56 @@
PATH
+ remote: gems/activerecord-gitlab
+ specs:
+ activerecord-gitlab (0.2.0)
+ activerecord (>= 7)
+
+PATH
+ remote: gems/click_house-client
+ specs:
+ click_house-client (0.1.0)
+ activesupport (< 8)
+ addressable (~> 2.8)
+ json (~> 2.6.3)
+
+PATH
+ remote: gems/gitlab-rspec
+ specs:
+ gitlab-rspec (0.1.0)
+ activesupport (>= 6.1, < 7.1)
+ rspec (~> 3.0)
+
+PATH
+ remote: gems/gitlab-schema-validation
+ specs:
+ gitlab-schema-validation (0.1.0)
+ diffy
+ pg_query
+
+PATH
+ remote: gems/gitlab-utils
+ specs:
+ gitlab-utils (0.1.0)
+ actionview (>= 6.1.7.2)
+ activesupport (>= 6.1.7.2)
+ addressable (~> 2.8)
+ nokogiri (~> 1.15.2)
+ rake (~> 13.0)
+
+PATH
+ remote: gems/ipynbdiff
+ specs:
+ ipynbdiff (0.4.7)
+ diffy (~> 3.4)
+ oj (~> 3.13.16)
+
+PATH
+ remote: gems/rspec_flaky
+ specs:
+ rspec_flaky (0.1.0)
+ activesupport (>= 6.1, < 7.1)
+ rspec (~> 3.0)
+
+PATH
remote: vendor/gems/attr_encrypted
specs:
attr_encrypted (3.2.4)
@@ -33,13 +85,6 @@ PATH
typhoeus (~> 1.0, >= 1.0.1)
PATH
- remote: vendor/gems/ipynbdiff
- specs:
- ipynbdiff (0.4.7)
- diffy (~> 3.4)
- oj (~> 3.13.16)
-
-PATH
remote: vendor/gems/mail-smtp_pool
specs:
mail-smtp_pool (0.1.0)
@@ -99,68 +144,74 @@ GEM
acme-client (2.0.11)
faraday (>= 1.0, < 3.0.0)
faraday-retry (~> 1.0)
- actioncable (6.1.7.2)
- actionpack (= 6.1.7.2)
- activesupport (= 6.1.7.2)
+ actioncable (7.0.6)
+ actionpack (= 7.0.6)
+ activesupport (= 7.0.6)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
- actionmailbox (6.1.7.2)
- actionpack (= 6.1.7.2)
- activejob (= 6.1.7.2)
- activerecord (= 6.1.7.2)
- activestorage (= 6.1.7.2)
- activesupport (= 6.1.7.2)
+ actionmailbox (7.0.6)
+ actionpack (= 7.0.6)
+ activejob (= 7.0.6)
+ activerecord (= 7.0.6)
+ activestorage (= 7.0.6)
+ activesupport (= 7.0.6)
mail (>= 2.7.1)
- actionmailer (6.1.7.2)
- actionpack (= 6.1.7.2)
- actionview (= 6.1.7.2)
- activejob (= 6.1.7.2)
- activesupport (= 6.1.7.2)
+ net-imap
+ net-pop
+ net-smtp
+ actionmailer (7.0.6)
+ actionpack (= 7.0.6)
+ actionview (= 7.0.6)
+ activejob (= 7.0.6)
+ activesupport (= 7.0.6)
mail (~> 2.5, >= 2.5.4)
+ net-imap
+ net-pop
+ net-smtp
rails-dom-testing (~> 2.0)
- actionpack (6.1.7.2)
- actionview (= 6.1.7.2)
- activesupport (= 6.1.7.2)
- rack (~> 2.0, >= 2.0.9)
+ actionpack (7.0.6)
+ actionview (= 7.0.6)
+ activesupport (= 7.0.6)
+ rack (~> 2.0, >= 2.2.4)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.2.0)
- actiontext (6.1.7.2)
- actionpack (= 6.1.7.2)
- activerecord (= 6.1.7.2)
- activestorage (= 6.1.7.2)
- activesupport (= 6.1.7.2)
+ actiontext (7.0.6)
+ actionpack (= 7.0.6)
+ activerecord (= 7.0.6)
+ activestorage (= 7.0.6)
+ activesupport (= 7.0.6)
+ globalid (>= 0.6.0)
nokogiri (>= 1.8.5)
- actionview (6.1.7.2)
- activesupport (= 6.1.7.2)
+ actionview (7.0.6)
+ activesupport (= 7.0.6)
builder (~> 3.1)
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.1, >= 1.2.0)
- activejob (6.1.7.2)
- activesupport (= 6.1.7.2)
+ activejob (7.0.6)
+ activesupport (= 7.0.6)
globalid (>= 0.3.6)
- activemodel (6.1.7.2)
- activesupport (= 6.1.7.2)
- activerecord (6.1.7.2)
- activemodel (= 6.1.7.2)
- activesupport (= 6.1.7.2)
+ activemodel (7.0.6)
+ activesupport (= 7.0.6)
+ activerecord (7.0.6)
+ activemodel (= 7.0.6)
+ activesupport (= 7.0.6)
activerecord-explain-analyze (0.1.0)
activerecord (>= 4)
pg
- activestorage (6.1.7.2)
- actionpack (= 6.1.7.2)
- activejob (= 6.1.7.2)
- activerecord (= 6.1.7.2)
- activesupport (= 6.1.7.2)
+ activestorage (7.0.6)
+ actionpack (= 7.0.6)
+ activejob (= 7.0.6)
+ activerecord (= 7.0.6)
+ activesupport (= 7.0.6)
marcel (~> 1.0)
mini_mime (>= 1.1.0)
- activesupport (6.1.7.2)
+ activesupport (7.0.6)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 1.6, < 2)
minitest (>= 5.1)
tzinfo (~> 2.0)
- zeitwerk (~> 2.3)
acts-as-taggable-on (9.0.0)
activerecord (>= 6.0, < 7.1)
addressable (2.8.1)
@@ -203,7 +254,7 @@ GEM
aws-sdk-cloudformation (1.41.0)
aws-sdk-core (~> 3, >= 3.99.0)
aws-sigv4 (~> 1.1)
- aws-sdk-core (3.175.0)
+ aws-sdk-core (3.178.0)
aws-eventstream (~> 1, >= 1.0.2)
aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.5)
@@ -211,11 +262,11 @@ GEM
aws-sdk-kms (1.64.0)
aws-sdk-core (~> 3, >= 3.165.0)
aws-sigv4 (~> 1.1)
- aws-sdk-s3 (1.126.0)
- aws-sdk-core (~> 3, >= 3.174.0)
+ aws-sdk-s3 (1.130.0)
+ aws-sdk-core (~> 3, >= 3.177.0)
aws-sdk-kms (~> 1)
- aws-sigv4 (~> 1.4)
- aws-sigv4 (1.5.1)
+ aws-sigv4 (~> 1.6)
+ aws-sigv4 (1.6.0)
aws-eventstream (~> 1, >= 1.0.2)
axe-core-api (4.6.0)
dumb_delegator
@@ -240,7 +291,7 @@ GEM
backport (1.2.0)
base32 (0.3.2)
batch-loader (2.0.1)
- bcrypt (3.1.16)
+ bcrypt (3.1.18)
benchmark (0.2.0)
benchmark-ips (2.11.0)
benchmark-malloc (0.2.0)
@@ -266,7 +317,7 @@ GEM
bundler (>= 1.2.0, < 3)
thor (>= 0.18, < 2)
byebug (11.1.3)
- capybara (3.39.1)
+ capybara (3.39.2)
addressable
matrix
mini_mime (>= 0.1.3)
@@ -367,7 +418,7 @@ GEM
thor (>= 0.19, < 2)
descendants_tracker (0.0.4)
thread_safe (~> 0.3, >= 0.3.1)
- devfile (0.0.19.pre.alpha1)
+ devfile (0.0.20.pre.alpha1)
device_detector (1.0.0)
devise (4.8.1)
bcrypt (~> 3.0)
@@ -566,7 +617,7 @@ GEM
gettext (3.3.6)
locale (>= 2.0.5)
text (>= 1.3.0)
- gettext_i18n_rails (1.8.0)
+ gettext_i18n_rails (1.11.0)
fast_gettext (>= 0.9.0)
gettext_i18n_rails_js (1.3.0)
gettext (>= 3.0.2)
@@ -575,14 +626,14 @@ GEM
rails (>= 3.2.0)
git (1.11.0)
rchardet (~> 1.8)
- gitaly (16.1.0.pre.rc2)
+ gitaly (16.2.0.pre.rc2)
grpc (~> 1.0)
gitlab (4.19.0)
httparty (~> 0.20)
terminal-table (>= 1.5.1)
gitlab-chronic (0.10.5)
numerizer (~> 0.2)
- gitlab-dangerfiles (3.10.0)
+ gitlab-dangerfiles (3.11.0)
danger (>= 8.4.5)
danger-gitlab (>= 8.0.0)
rake
@@ -611,12 +662,12 @@ GEM
oauth2 (>= 1.4.4, < 3)
gitlab-markup (1.9.0)
gitlab-net-dns (0.9.2)
- gitlab-styles (10.0.0)
- rubocop (~> 1.43.0)
+ gitlab-styles (10.1.0)
+ rubocop (~> 1.50.2)
rubocop-graphql (~> 0.18)
rubocop-performance (~> 1.15)
rubocop-rails (~> 2.17)
- rubocop-rspec (~> 2.18)
+ rubocop-rspec (~> 2.22)
gitlab_chronic_duration (0.10.6.2)
numerizer (~> 0.2)
gitlab_omniauth-ldap (2.2.0)
@@ -624,7 +675,7 @@ GEM
omniauth (>= 1.3, < 3)
pyu-ruby-sasl (>= 0.0.3.3, < 0.1)
rubyntlm (~> 0.5)
- gitlab_quality-test_tooling (0.8.1)
+ gitlab_quality-test_tooling (0.9.1)
activesupport (>= 6.1, < 7.1)
gitlab (~> 4.19)
http (~> 5.0)
@@ -694,7 +745,7 @@ GEM
google-cloud-core (~> 1.6)
googleauth (>= 0.16.2, < 2.a)
mini_mime (~> 1.0)
- google-protobuf (3.23.3)
+ google-protobuf (3.23.4)
googleapis-common-protos (1.4.0)
google-protobuf (~> 3.14)
googleapis-common-protos-types (~> 1.2)
@@ -753,8 +804,8 @@ GEM
graphql (~> 1.12)
html-pipeline (~> 2.9)
sass (~> 3.4)
- grpc (1.42.0)
- google-protobuf (~> 3.18)
+ grpc (1.55.0)
+ google-protobuf (~> 3.23)
googleapis-common-protos-types (~> 1.0)
gssapi (1.3.1)
ffi (>= 1.0.1)
@@ -851,6 +902,10 @@ GEM
hana (~> 1.3)
regexp_parser (~> 2.0)
uri_template (~> 0.7)
+ jsonb_accessor (1.3.10)
+ activerecord (>= 5.0)
+ activesupport (>= 5.0)
+ pg (>= 0.18.1)
jsonpath (1.1.2)
multi_json
jwt (2.5.0)
@@ -866,7 +921,7 @@ GEM
activerecord
kaminari-core (= 1.2.2)
kaminari-core (1.2.2)
- kas-grpc (0.1.0)
+ kas-grpc (0.2.0)
grpc (~> 1.0)
knapsack (1.21.1)
rake
@@ -881,7 +936,7 @@ GEM
rest-client (~> 2.0)
launchy (2.5.0)
addressable (~> 2.7)
- lefthook (1.4.2)
+ lefthook (1.4.3)
letter_opener (1.7.0)
launchy (~> 2.2)
letter_opener_web (2.0.0)
@@ -990,7 +1045,7 @@ GEM
net-imap (0.3.4)
date
net-protocol
- net-ldap (0.18.0)
+ net-ldap (0.17.1)
net-ntp (2.1.3)
net-pop (0.1.2)
net-protocol
@@ -1154,7 +1209,7 @@ GEM
coderay
parser
unparser
- prometheus-client-mmap (0.25.0)
+ prometheus-client-mmap (0.26.1)
rb_sys (~> 0.9)
pry (0.14.2)
coderay (~> 1.1)
@@ -1191,24 +1246,23 @@ GEM
rack
rack-proxy (0.7.6)
rack
- rack-test (2.0.2)
+ rack-test (2.1.0)
rack (>= 1.3)
rack-timeout (0.6.3)
- rails (6.1.7.2)
- actioncable (= 6.1.7.2)
- actionmailbox (= 6.1.7.2)
- actionmailer (= 6.1.7.2)
- actionpack (= 6.1.7.2)
- actiontext (= 6.1.7.2)
- actionview (= 6.1.7.2)
- activejob (= 6.1.7.2)
- activemodel (= 6.1.7.2)
- activerecord (= 6.1.7.2)
- activestorage (= 6.1.7.2)
- activesupport (= 6.1.7.2)
+ rails (7.0.6)
+ actioncable (= 7.0.6)
+ actionmailbox (= 7.0.6)
+ actionmailer (= 7.0.6)
+ actionpack (= 7.0.6)
+ actiontext (= 7.0.6)
+ actionview (= 7.0.6)
+ activejob (= 7.0.6)
+ activemodel (= 7.0.6)
+ activerecord (= 7.0.6)
+ activestorage (= 7.0.6)
+ activesupport (= 7.0.6)
bundler (>= 1.15.0)
- railties (= 6.1.7.2)
- sprockets-rails (>= 2.0.0)
+ railties (= 7.0.6)
rails-controller-testing (1.0.5)
actionpack (>= 5.0.1.rc1)
actionview (>= 5.0.1.rc1)
@@ -1221,12 +1275,13 @@ GEM
rails-i18n (7.0.3)
i18n (>= 0.7, < 2)
railties (>= 6.0.0, < 8)
- railties (6.1.7.2)
- actionpack (= 6.1.7.2)
- activesupport (= 6.1.7.2)
+ railties (7.0.6)
+ actionpack (= 7.0.6)
+ activesupport (= 7.0.6)
method_source
rake (>= 12.2)
thor (~> 1.0)
+ zeitwerk (~> 2.5)
rainbow (3.1.1)
rake (13.0.6)
rb-fsevent (0.11.2)
@@ -1240,7 +1295,7 @@ GEM
rbtree (0.4.6)
rchardet (1.8.0)
rdoc (6.3.2)
- re2 (1.6.0)
+ re2 (1.7.0)
recaptcha (5.12.3)
json
recursive-open-struct (1.1.3)
@@ -1265,7 +1320,7 @@ GEM
uber (< 0.2.0)
request_store (1.5.1)
rack (>= 1.4)
- responders (3.0.0)
+ responders (3.0.1)
actionpack (>= 5.0)
railties (>= 5.0)
rest-client (2.1.0)
@@ -1330,32 +1385,35 @@ GEM
pg
rails
sqlite3
- rubocop (1.43.0)
+ rubocop (1.50.2)
json (~> 2.3)
parallel (~> 1.10)
parser (>= 3.2.0.0)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 1.8, < 3.0)
rexml (>= 3.2.5, < 4.0)
- rubocop-ast (>= 1.24.1, < 2.0)
+ rubocop-ast (>= 1.28.0, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 2.4.0, < 3.0)
- rubocop-ast (1.24.1)
- parser (>= 3.1.1.0)
- rubocop-capybara (2.17.0)
+ rubocop-ast (1.29.0)
+ parser (>= 3.2.1.0)
+ rubocop-capybara (2.18.0)
rubocop (~> 1.41)
+ rubocop-factory_bot (2.23.1)
+ rubocop (~> 1.33)
rubocop-graphql (0.19.0)
rubocop (>= 0.87, < 2)
- rubocop-performance (1.16.0)
+ rubocop-performance (1.18.0)
rubocop (>= 1.7.0, < 2.0)
rubocop-ast (>= 0.4.0)
- rubocop-rails (2.17.4)
+ rubocop-rails (2.20.2)
activesupport (>= 4.2.0)
rack (>= 1.1)
rubocop (>= 1.33.0, < 2.0)
- rubocop-rspec (2.18.1)
+ rubocop-rspec (2.22.0)
rubocop (~> 1.33)
rubocop-capybara (~> 2.17)
+ rubocop-factory_bot (~> 2.22)
ruby-fogbugz (0.3.0)
crack (~> 0.4)
multipart-post (~> 2.0)
@@ -1401,7 +1459,7 @@ GEM
seed-fu (2.3.7)
activerecord (>= 3.1)
activesupport (>= 3.1)
- selenium-webdriver (4.9.0)
+ selenium-webdriver (4.10.0)
rexml (~> 3.2, >= 3.2.5)
rubyzip (>= 1.2.2, < 3.0)
websocket (~> 1.0)
@@ -1419,7 +1477,7 @@ GEM
sentry-sidekiq (5.8.0)
sentry-ruby (~> 5.8.0)
sidekiq (>= 3.0)
- set (1.0.1)
+ set (1.0.2)
sexp_processor (4.16.1)
shellany (0.0.1)
shoulda-matchers (5.1.0)
@@ -1522,7 +1580,7 @@ GEM
unicode-display_width (>= 1.1.1, < 3)
terser (1.0.2)
execjs (>= 0.3.0, < 3)
- test-prof (1.2.1)
+ test-prof (1.2.2)
test_file_finder (0.1.4)
faraday (~> 1.0)
text (1.3.1)
@@ -1654,7 +1712,7 @@ GEM
nokogiri (~> 1.8)
yajl-ruby (1.4.3)
yard (0.9.26)
- zeitwerk (2.6.6)
+ zeitwerk (2.6.7)
PLATFORMS
ruby
@@ -1664,6 +1722,7 @@ DEPENDENCIES
RedCloth (~> 4.3.2)
acme-client (~> 2.0)
activerecord-explain-analyze (~> 0.1)
+ activerecord-gitlab!
acts-as-taggable-on (~> 9.0)
addressable (~> 2.8)
akismet (~> 3.0)
@@ -1680,8 +1739,8 @@ DEPENDENCIES
autoprefixer-rails (= 10.2.5.1)
awesome_print
aws-sdk-cloudformation (~> 1)
- aws-sdk-core (~> 3.175.0)
- aws-sdk-s3 (~> 1.126.0)
+ aws-sdk-core (~> 3.178.0)
+ aws-sdk-s3 (~> 1.130.0)
axe-core-rspec
babosa (~> 2.0)
base32 (~> 0.3.0)
@@ -1695,11 +1754,12 @@ DEPENDENCIES
bullet (~> 7.0.2)
bundler-audit (~> 0.7.0.1)
bundler-checksum (~> 0.1.0)!
- capybara (~> 3.39, >= 3.39.1)
+ capybara (~> 3.39, >= 3.39.2)
capybara-screenshot (~> 1.0.26)
carrierwave (~> 1.3)
charlock_holmes (~> 0.7.7)
circuitbox (= 2.0.0)
+ click_house-client!
cloud_profiler_agent (~> 0.0.0)!
commonmarker (~> 0.23.9)
concurrent-ruby (~> 1.1)
@@ -1713,7 +1773,7 @@ DEPENDENCIES
declarative_policy (~> 1.1.0)
deprecation_toolkit (~> 1.5.1)
derailed_benchmarks
- devfile (~> 0.0.19.pre.alpha1)
+ devfile (~> 0.0.20.pre.alpha1)
device_detector
devise (~> 4.8.1)
devise-pbkdf2-encryptable (~> 0.0.0)!
@@ -1747,11 +1807,11 @@ DEPENDENCIES
fugit (~> 1.8.1)
fuubar (~> 2.2.0)
gettext (~> 3.3)
- gettext_i18n_rails (~> 1.8.0)
+ gettext_i18n_rails (~> 1.11.0)
gettext_i18n_rails_js (~> 1.3)
- gitaly (~> 16.1.0.pre.rc2)
+ gitaly (~> 16.2.0.pre.rc2)
gitlab-chronic (~> 0.10.5)
- gitlab-dangerfiles (~> 3.10.0)
+ gitlab-dangerfiles (~> 3.11.0)
gitlab-experiment (~> 0.7.1)
gitlab-fog-azure-rm (~> 1.7.0)
gitlab-labkit (~> 0.33.0)
@@ -1759,11 +1819,14 @@ DEPENDENCIES
gitlab-mail_room (~> 0.0.23)
gitlab-markup (~> 1.9.0)
gitlab-net-dns (~> 0.9.2)
+ gitlab-rspec!
+ gitlab-schema-validation!
gitlab-sidekiq-fetcher!
- gitlab-styles (~> 10.0.0)
+ gitlab-styles (~> 10.1.0)
+ gitlab-utils!
gitlab_chronic_duration (~> 0.10.6.2)
gitlab_omniauth-ldap (~> 2.2.0)
- gitlab_quality-test_tooling (~> 0.8.1)
+ gitlab_quality-test_tooling (~> 0.9.1)
gon (~> 6.4.0)
google-apis-androidpublisher_v3 (~> 0.34.0)
google-apis-cloudbilling_v1 (~> 0.21.0)
@@ -1776,7 +1839,7 @@ DEPENDENCIES
google-apis-serviceusage_v1 (~> 0.28.0)
google-apis-sqladmin_v1beta4 (~> 0.41.0)
google-cloud-storage (~> 1.44.0)
- google-protobuf (~> 3.23, >= 3.23.3)
+ google-protobuf (~> 3.23, >= 3.23.4)
gpgme (~> 2.0.22)
grape (~> 1.7.0)
grape-entity (~> 0.10.0)
@@ -1789,7 +1852,7 @@ DEPENDENCIES
graphlyte (~> 1.0.0)
graphql (~> 1.13.12)
graphql-docs (~> 2.1.0)
- grpc (~> 1.42.0)
+ grpc (~> 1.55.0)
gssapi (~> 1.3.1)
guard-rspec
haml_lint (~> 0.40.0)
@@ -1809,13 +1872,14 @@ DEPENDENCIES
js_regex (~> 3.8)
json (~> 2.6.3)
json_schemer (~> 0.2.18)
+ jsonb_accessor (~> 1.3.10)
jwt (~> 2.5)
kaminari (~> 1.2.2)
- kas-grpc (~> 0.1.0)
+ kas-grpc (~> 0.2.0)
knapsack (~> 1.21.1)
kramdown (~> 2.3.1)
kubeclient (~> 4.11.0)
- lefthook (~> 1.4.2)
+ lefthook (~> 1.4.3)
letter_opener_web (~> 2.0.0)
license_finder (~> 7.0)
licensee (~> 9.15)
@@ -1835,7 +1899,7 @@ DEPENDENCIES
multi_json (~> 1.14.1)
neighbor (~> 0.2.3)
net-http (= 0.1.1)
- net-ldap (~> 0.18.0)
+ net-ldap (~> 0.17.1)
net-ntp
net-protocol (~> 0.1.3)
nokogiri (~> 1.15, >= 1.15.2)
@@ -1874,7 +1938,7 @@ DEPENDENCIES
pg_query (~> 4.2.1)
png_quantizator (~> 0.2.1)
premailer-rails (~> 1.10.3)
- prometheus-client-mmap (~> 0.25)
+ prometheus-client-mmap (~> 0.26, >= 0.26.1)
pry-byebug
pry-rails (~> 0.3.9)
pry-shell (~> 0.6.1)
@@ -1885,13 +1949,13 @@ DEPENDENCIES
rack-oauth2 (~> 1.21.3)
rack-proxy (~> 0.7.6)
rack-timeout (~> 0.6.3)
- rails (~> 6.1.7.2)
+ rails (~> 7.0.6)
rails-controller-testing
rails-i18n (~> 7.0)
rainbow (~> 3.0)
rbtrace (~> 0.4)
rdoc (~> 6.3.2)
- re2 (~> 1.6.0)
+ re2 (~> 1.7.0)
recaptcha (~> 5.12)
redis (~> 4.8.0)
redis-actionpack (~> 5.3.0)
@@ -1906,6 +1970,7 @@ DEPENDENCIES
rspec-parameterized (~> 1.0)
rspec-rails (~> 6.0.1)
rspec-retry (~> 0.6.2)
+ rspec_flaky!
rspec_junit_formatter
rspec_profiling (~> 0.0.6)
rubocop
@@ -1921,7 +1986,7 @@ DEPENDENCIES
sassc-rails (~> 2.1.0)
sd_notify (~> 0.1.0)
seed-fu (~> 2.3.7)
- selenium-webdriver (= 4.9.0)
+ selenium-webdriver (= 4.10.0)
semver_dialects (~> 1.2.1)
sentry-rails (~> 5.8.0)
sentry-raven (~> 3.1)
@@ -1950,7 +2015,7 @@ DEPENDENCIES
tanuki_emoji (~> 0.6)
telesignenterprise (~> 2.2)
terser (= 1.0.2)
- test-prof (~> 1.2.1)
+ test-prof (~> 1.2.2)
test_file_finder (~> 0.1.3)
thrift (>= 0.16.0)
timfel-krb5-auth (~> 0.8)
@@ -1973,4 +2038,4 @@ DEPENDENCIES
yajl-ruby (~> 1.4.3)
BUNDLED WITH
- 2.4.14
+ 2.4.16
diff --git a/Rakefile b/Rakefile
index 9a651fda7a0..4db94c50130 100755
--- a/Rakefile
+++ b/Rakefile
@@ -11,8 +11,6 @@ require File.expand_path('config/application', __dir__)
relative_url_conf = File.expand_path('config/initializers/relative_url', __dir__)
require relative_url_conf if File.exist?("#{relative_url_conf}.rb")
-require File.expand_path('config/initializers/01_active_record_database_tasks_configuration_flag.rb', __dir__)
-
Gitlab::Application.load_tasks
Knapsack.load_tasks if defined?(Knapsack)
diff --git a/app/assets/images/callouts/rich_text_editor_illustration.svg b/app/assets/images/callouts/rich_text_editor_illustration.svg
new file mode 100644
index 00000000000..b07d8871fe6
--- /dev/null
+++ b/app/assets/images/callouts/rich_text_editor_illustration.svg
@@ -0,0 +1,79 @@
+<svg width="280" height="130" viewBox="0 0 280 130" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_191_42179)">
+<circle cx="189.5" cy="-42.5" r="131.5" fill="url(#paint0_radial_191_42179)"/>
+<circle cx="-41.5" cy="-97.5" r="198.5" fill="url(#paint1_radial_191_42179)"/>
+<circle cx="309.5" cy="-7.5" r="121.5" fill="url(#paint2_radial_191_42179)"/>
+<g filter="url(#filter0_b_191_42179)">
+<path d="M0 4C0 1.79086 1.79086 0 4 0H276C278.209 0 280 1.79086 280 4V130H0V4Z" fill="white" fill-opacity="0.01"/>
+</g>
+</g>
+<g transform="translate(64, 16)">
+<path d="M135.455 109.089H47.0349C30.7979 109.089 17.6364 95.8523 17.6364 79.5229V0H106.056C122.293 0 135.455 13.2364 135.455 29.5658V109.091V109.089Z" fill="white"/>
+<path d="M37.0022 29H116C116 46 116 63 116 80C116 84.4183 112.549 88 108.293 88L37 88V29H37.0022Z" fill="white"/>
+<path d="M116 16H37V29H116V16Z" fill="#AEA5D6"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M36 15H101V16H37V42H36V15Z" fill="#171321"/>
+<path d="M53 22.5C53 23.8807 51.8807 25 50.5 25C49.1193 25 48 23.8807 48 22.5C48 21.1193 49.1193 20 50.5 20C51.8807 20 53 21.1193 53 22.5Z" fill="#A888F4"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M50.5 24C51.3284 24 52 23.3284 52 22.5C52 21.6716 51.3284 21 50.5 21C49.6716 21 49 21.6716 49 22.5C49 23.3284 49.6716 24 50.5 24ZM50.5 25C51.8807 25 53 23.8807 53 22.5C53 21.1193 51.8807 20 50.5 20C49.1193 20 48 21.1193 48 22.5C48 23.8807 49.1193 25 50.5 25Z" fill="#171321"/>
+<path d="M60 22.5C60 23.8807 58.8807 25 57.5 25C56.1193 25 55 23.8807 55 22.5C55 21.1193 56.1193 20 57.5 20C58.8807 20 60 21.1193 60 22.5Z" fill="#FF9D73"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M57.5 24C58.3284 24 59 23.3284 59 22.5C59 21.6716 58.3284 21 57.5 21C56.6716 21 56 21.6716 56 22.5C56 23.3284 56.6716 24 57.5 24ZM57.5 25C58.8807 25 60 23.8807 60 22.5C60 21.1193 58.8807 20 57.5 20C56.1193 20 55 21.1193 55 22.5C55 23.8807 56.1193 25 57.5 25Z" fill="#171321"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M22.5 10.5C30.3325 10.5 38.152 14.4668 42.923 22.3723L43 22.5L42.923 22.6277C38.152 30.5332 30.3325 34.5 22.5 34.5C14.6675 34.5 6.84799 30.5332 2.07704 22.6277L2 22.5L2.07704 22.3723C6.84799 14.4668 14.6675 10.5 22.5 10.5Z" fill="white"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M41.8274 22.5C37.2212 15.1579 29.8576 11.5 22.5 11.5C15.1424 11.5 7.77878 15.1579 3.1726 22.5C7.77878 29.8421 15.1424 33.5 22.5 33.5C29.8576 33.5 37.2212 29.8421 41.8274 22.5ZM2 22.5L2.07704 22.6277C6.84799 30.5332 14.6675 34.5 22.5 34.5C30.3325 34.5 38.152 30.5332 42.923 22.6277L43 22.5L42.923 22.3723C38.152 14.4668 30.3325 10.5 22.5 10.5C14.6675 10.5 6.84799 14.4668 2.07704 22.3723L2 22.5Z" fill="#171321"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0 22.5C0 21.3954 0.895434 20.5 2 20.5C3.10457 20.5 4 21.3954 4 22.5C4 23.6046 3.10457 24.5 2 24.5C0.895434 24.5 0 23.6046 0 22.5Z" fill="white"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M2 21.5C1.44772 21.5 1 21.9477 1 22.5C1 23.0523 1.44772 23.5 2 23.5C2.55229 23.5 3 23.0523 3 22.5C3 21.9477 2.55229 21.5 2 21.5ZM2 20.5C0.895434 20.5 0 21.3954 0 22.5C0 23.6046 0.895434 24.5 2 24.5C3.10457 24.5 4 23.6046 4 22.5C4 21.3954 3.10457 20.5 2 20.5Z" fill="#171321"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M41 22.5C41 21.3954 41.8954 20.5 43 20.5C44.1046 20.5 45 21.3954 45 22.5C45 23.6046 44.1046 24.5 43 24.5C41.8954 24.5 41 23.6046 41 22.5Z" fill="white"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M43 21.5C42.4477 21.5 42 21.9477 42 22.5C42 23.0523 42.4477 23.5 43 23.5C43.5523 23.5 44 23.0523 44 22.5C44 21.9477 43.5523 21.5 43 21.5ZM43 20.5C41.8954 20.5 41 21.3954 41 22.5C41 23.6046 41.8954 24.5 43 24.5C44.1046 24.5 45 23.6046 45 22.5C45 21.3954 44.1046 20.5 43 20.5Z" fill="#171321"/>
+<path d="M22.5 30C26.6421 30 30 26.6421 30 22.5C30 18.3579 26.6421 15 22.5 15C18.3579 15 15 18.3579 15 22.5C15 26.6421 18.3579 30 22.5 30Z" fill="#10B1B1"/>
+<path d="M27.0838 22.3192C27.0838 23.5746 25.3096 22.4248 23.8629 20.9715C22.4317 19.5337 21.3192 17.7969 22.5614 17.7969C25.0589 17.7969 27.0838 19.8217 27.0838 22.3192Z" fill="white"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M37 34V65H36V34H37Z" fill="#171321"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M37 93V70.0117H36V94H57V93H37Z" fill="#171321"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M64 93H93V94H64V93Z" fill="#171321"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M116 65V38H117V65H116Z" fill="#171321"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M144 104H122V103H144V104Z" fill="#AEA5D6"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M138 97H129V96H138V97Z" fill="#AEA5D6"/>
+<path d="M104 34H47V46H104V34Z" fill="#E7E4F2"/>
+<path d="M74 51H48V83H74V51Z" fill="#FF9D73"/>
+<path d="M60.5 70C61.8807 70 63 68.8807 63 67.5C63 66.1193 61.8807 65 60.5 65C59.1193 65 58 66.1193 58 67.5C58 68.8807 59.1193 70 60.5 70Z" fill="white"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M60.5 69C61.3284 69 62 68.3284 62 67.5C62 66.6716 61.3284 66 60.5 66C59.6716 66 59 66.6716 59 67.5C59 68.3284 59.6716 69 60.5 69ZM63 67.5C63 68.8807 61.8807 70 60.5 70C59.1193 70 58 68.8807 58 67.5C58 66.1193 59.1193 65 60.5 65C61.8807 65 63 66.1193 63 67.5Z" fill="#171321"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M74 50V84H73V50H74Z" fill="#171321"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M47 84V70H48V84H47Z" fill="#171321"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M47 65V50H48V65H47Z" fill="#171321"/>
+<path d="M104 51H78V71H104V51Z" fill="#E7E4F2"/>
+<path d="M104 76H78V83H104V76Z" fill="#E7E4F2"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M23 34V58.5C23 63.1944 26.8056 67 31.5 67H59V68H31.5C26.2533 68 22 63.7467 22 58.5V34H23Z" fill="#171321"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M46 51H75V52H46V51Z" fill="#171321"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M75 83H46V82H75V83Z" fill="#171321"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M14 67H32V68H14V67Z" fill="#171321"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M2 67H10V68H2V67Z" fill="#AEA5D6"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M58.5 69.5V95.5C58.5 100.194 62.3056 104 67 104H94L93.5 105H67C61.7533 105 57.5 100.747 57.5 95.5V69.5H58.5Z" fill="#171321"/>
+<rect x="130.598" y="54.4473" width="19" height="46" transform="rotate(45 130.598 54.4473)" fill="white"/>
+<path d="M111.506 100.41L98.0714 86.9746L93.4752 105.006L111.506 100.41Z" fill="#FF9D73"/>
+<path d="M140.498 44.5479L144.033 48.0834C146.666 50.7156 147.982 52.0318 148.701 53.443C150.154 56.2951 150.154 59.6706 148.701 62.5228C147.982 63.934 146.666 65.2501 144.033 67.8824L144.033 67.8824L130.598 54.4473L140.498 44.5479Z" fill="#5829CB"/>
+<path d="M130.598 54.4473L131.305 55.1544L98.7785 87.6813L98.0714 86.9742L130.598 54.4473Z" fill="#171321"/>
+<path d="M143.326 67.1758L144.033 67.8829L111.506 100.41L110.799 99.7027L143.326 67.1758Z" fill="#171321"/>
+<path d="M136.962 60.8115L137.669 61.5186L105.142 94.0455L104.435 93.3384L136.962 60.8115Z" fill="#171321"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M95.4861 97.1172L93.4752 105.006L101.364 102.995L95.4861 97.1172Z" fill="#171321"/>
+</g>
+<defs>
+<filter id="filter0_b_191_42179" x="-50" y="-50" width="380" height="230" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feGaussianBlur in="BackgroundImageFix" stdDeviation="25"/>
+<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_191_42179"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur_191_42179" result="shape"/>
+</filter>
+<radialGradient id="paint0_radial_191_42179" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(189.5 -42.5) rotate(89.5818) scale(125.986)">
+<stop stop-color="#7759C2"/>
+<stop offset="1" stop-color="#7759C2" stop-opacity="0"/>
+</radialGradient>
+<radialGradient id="paint1_radial_191_42179" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(-41.5 -97.5) rotate(89.5818) scale(190.176)">
+<stop stop-color="#D64028"/>
+<stop offset="1" stop-color="#D64028" stop-opacity="0"/>
+</radialGradient>
+<radialGradient id="paint2_radial_191_42179" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(309.5 -7.5) rotate(89.5818) scale(116.405)">
+<stop stop-color="#EF76F1"/>
+<stop offset="1" stop-color="#EF76F1" stop-opacity="0"/>
+</radialGradient>
+<clipPath id="clip0_191_42179">
+<path d="M0 4C0 1.79086 1.79086 0 4 0H276C278.209 0 280 1.79086 280 4V130H0V4Z" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/assets/images/service_desk_callout.svg b/app/assets/images/service_desk_callout.svg
new file mode 100644
index 00000000000..2886388279e
--- /dev/null
+++ b/app/assets/images/service_desk_callout.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="78" height="82" viewBox="0 0 78 82"><g fill="none" fill-rule="evenodd"><path fill="#F9F9F9" d="M2.12 42c-.08.99-.12 1.99-.12 3 0 20.435 16.565 37 37 37s37-16.565 37-37c0-1.01-.04-2.01-.12-3C74.353 61.032 58.425 76 39 76 19.575 76 3.647 61.032 2.12 42z"/><path fill="#EEE" fill-rule="nonzero" d="M39 78C17.46 78 0 60.54 0 39S17.46 0 39 0s39 17.46 39 39-17.46 39-39 39zm0-4c19.33 0 35-15.67 35-35S58.33 4 39 4 4 19.67 4 39s15.67 35 35 35z"/><rect width="7" height="1" x="59" y="38" fill="#E1DBF2" rx=".5"/><path fill="#6B4FBB" d="M60.5 42a3.5 3.5 0 0 0 0-7v7z"/><rect width="7" height="1" x="12" y="38" fill="#E1DBF2" transform="matrix(-1 0 0 1 31 0)" rx=".5"/><path fill="#6B4FBB" d="M17.5 42a3.5 3.5 0 0 1 0-7v7z"/><path fill="#E1DBF1" fill-rule="nonzero" d="M39 58c10.493 0 19-8.507 19-19s-8.507-19-19-19-19 8.507-19 19 8.507 19 19 19zm0 4c-12.703 0-23-10.297-23-23s10.297-23 23-23 23 10.297 23 23-10.297 23-23 23z"/><path fill="#6B4FBB" d="M35 56a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm4 0a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm4 0a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/><path fill="#E1DBF1" fill-rule="nonzero" d="M26.5 40c0 4.143 3.355 7.5 7.494 7.5h10.012A7.497 7.497 0 0 0 51.5 40c0-4.143-3.355-7.5-7.494-7.5H33.994A7.497 7.497 0 0 0 26.5 40zm-3 0c0-5.799 4.698-10.5 10.494-10.5h10.012C49.802 29.5 54.5 34.2 54.5 40c0 5.799-4.698 10.5-10.494 10.5H33.994C28.198 50.5 23.5 45.8 23.5 40z"/><path fill="#6B4FBB" fill-rule="nonzero" d="M35.255 42.406a1 1 0 1 1 1.872-.703 2.001 2.001 0 0 0 3.76-.038 1 1 0 1 1 1.886.665 4 4 0 0 1-7.518.076zM31.5 40a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm15 0a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3z"/><path fill="#6B4FBB" d="M38 22h2a1 1 0 0 1 0 2h-2a1 1 0 0 1 0-2zm0 3h2a1 1 0 0 1 0 2h-2a1 1 0 0 1 0-2z" style="mix-blend-mode:multiply"/></g></svg> \ No newline at end of file
diff --git a/app/assets/javascripts/access_tokens/components/access_token_table_app.vue b/app/assets/javascripts/access_tokens/components/access_token_table_app.vue
index 57a237c3e84..d15c8e6e703 100644
--- a/app/assets/javascripts/access_tokens/components/access_token_table_app.vue
+++ b/app/assets/javascripts/access_tokens/components/access_token_table_app.vue
@@ -114,8 +114,7 @@ export default {
<template>
<dom-element-listener :selector="$options.FORM_SELECTOR" @[$options.EVENT_SUCCESS]="onSuccess">
- <div>
- <hr />
+ <div class="gl-pt-6">
<h5>{{ header }}</h5>
<p v-if="information" data-testid="information-section">
diff --git a/app/assets/javascripts/access_tokens/components/token.vue b/app/assets/javascripts/access_tokens/components/token.vue
index 3954e541fe0..23803e82476 100644
--- a/app/assets/javascripts/access_tokens/components/token.vue
+++ b/app/assets/javascripts/access_tokens/components/token.vue
@@ -30,26 +30,19 @@ export default {
</script>
<template>
- <div class="row">
- <div class="col-lg-12">
- <hr />
- </div>
- <div class="col-lg-4">
- <h4 class="gl-mt-0"><slot name="title"></slot></h4>
- <slot name="description"></slot>
- </div>
- <div class="col-lg-8">
- <input-copy-toggle-visibility
- :label="inputLabel"
- :label-for="inputId"
- :form-input-group-props="formInputGroupProps"
- :value="token"
- :copy-button-title="copyButtonTitle"
- >
- <template #description>
- <slot name="input-description"></slot>
- </template>
- </input-copy-toggle-visibility>
- </div>
+ <div>
+ <h4 class="gl-my-0"><slot name="title"></slot></h4>
+ <slot name="description"></slot>
+ <input-copy-toggle-visibility
+ :label="inputLabel"
+ :label-for="inputId"
+ :form-input-group-props="formInputGroupProps"
+ :value="token"
+ :copy-button-title="copyButtonTitle"
+ >
+ <template #description>
+ <slot name="input-description"></slot>
+ </template>
+ </input-copy-toggle-visibility>
</div>
</template>
diff --git a/app/assets/javascripts/access_tokens/components/tokens_app.vue b/app/assets/javascripts/access_tokens/components/tokens_app.vue
index 1f72f5e19e2..88119ed8a84 100644
--- a/app/assets/javascripts/access_tokens/components/tokens_app.vue
+++ b/app/assets/javascripts/access_tokens/components/tokens_app.vue
@@ -79,7 +79,7 @@ export default {
</script>
<template>
- <div class="js-search-settings-section">
+ <div class="settings-section gl-pt-0! js-search-settings-section">
<token
v-for="(tokenData, tokenType) in enabledTokenTypes"
:key="tokenType"
@@ -89,10 +89,18 @@ export default {
:copy-button-title="$options.i18n[tokenType].copyButtonTitle"
:data-testid="$options.htmlAttributes[tokenType].containerTestId"
>
- <template #title>{{ $options.i18n[tokenType].label }}</template>
+ <template #title>
+ <div class="settings-sticky-header">
+ <div class="settings-sticky-header-inner">
+ {{ $options.i18n[tokenType].label }}
+ </div>
+ </div>
+ </template>
<template #description>
- <p>{{ $options.i18n[tokenType].description }}</p>
- <p>{{ $options.i18n.canNotAccessOtherData }}</p>
+ <p class="gl-text-secondary">
+ {{ $options.i18n[tokenType].description }}
+ {{ $options.i18n.canNotAccessOtherData }}
+ </p>
</template>
<template #input-description>
<gl-sprintf :message="$options.i18n[tokenType].inputDescription">
diff --git a/app/assets/javascripts/actioncable_connection_monitor.js b/app/assets/javascripts/actioncable_connection_monitor.js
deleted file mode 100644
index fc4e436c7fb..00000000000
--- a/app/assets/javascripts/actioncable_connection_monitor.js
+++ /dev/null
@@ -1,142 +0,0 @@
-/* eslint-disable no-restricted-globals */
-
-import { logger } from '@rails/actioncable';
-
-// This is based on https://github.com/rails/rails/blob/5a477890c809d4a17dc0dede43c6b8cef81d8175/actioncable/app/javascript/action_cable/connection_monitor.js
-// so that we can take advantage of the improved reconnection logic. We can remove this once we upgrade @rails/actioncable to a version that includes this.
-
-// Responsible for ensuring the cable connection is in good health by validating the heartbeat pings sent from the server, and attempting
-// revival reconnections if things go astray. Internal class, not intended for direct user manipulation.
-
-const now = () => new Date().getTime();
-
-const secondsSince = (time) => (now() - time) / 1000;
-class ConnectionMonitor {
- constructor(connection) {
- this.visibilityDidChange = this.visibilityDidChange.bind(this);
- this.connection = connection;
- this.reconnectAttempts = 0;
- }
-
- start() {
- if (!this.isRunning()) {
- this.startedAt = now();
- delete this.stoppedAt;
- this.startPolling();
- addEventListener('visibilitychange', this.visibilityDidChange);
- logger.log(
- `ConnectionMonitor started. stale threshold = ${this.constructor.staleThreshold} s`,
- );
- }
- }
-
- stop() {
- if (this.isRunning()) {
- this.stoppedAt = now();
- this.stopPolling();
- removeEventListener('visibilitychange', this.visibilityDidChange);
- logger.log('ConnectionMonitor stopped');
- }
- }
-
- isRunning() {
- return this.startedAt && !this.stoppedAt;
- }
-
- recordPing() {
- this.pingedAt = now();
- }
-
- recordConnect() {
- this.reconnectAttempts = 0;
- this.recordPing();
- delete this.disconnectedAt;
- logger.log('ConnectionMonitor recorded connect');
- }
-
- recordDisconnect() {
- this.disconnectedAt = now();
- logger.log('ConnectionMonitor recorded disconnect');
- }
-
- // Private
-
- startPolling() {
- this.stopPolling();
- this.poll();
- }
-
- stopPolling() {
- clearTimeout(this.pollTimeout);
- }
-
- poll() {
- this.pollTimeout = setTimeout(() => {
- this.reconnectIfStale();
- this.poll();
- }, this.getPollInterval());
- }
-
- getPollInterval() {
- const { staleThreshold, reconnectionBackoffRate } = this.constructor;
- const backoff = (1 + reconnectionBackoffRate) ** Math.min(this.reconnectAttempts, 10);
- const jitterMax = this.reconnectAttempts === 0 ? 1.0 : reconnectionBackoffRate;
- const jitter = jitterMax * Math.random();
- return staleThreshold * 1000 * backoff * (1 + jitter);
- }
-
- reconnectIfStale() {
- if (this.connectionIsStale()) {
- logger.log(
- `ConnectionMonitor detected stale connection. reconnectAttempts = ${
- this.reconnectAttempts
- }, time stale = ${secondsSince(this.refreshedAt)} s, stale threshold = ${
- this.constructor.staleThreshold
- } s`,
- );
- this.reconnectAttempts += 1;
- if (this.disconnectedRecently()) {
- logger.log(
- `ConnectionMonitor skipping reopening recent disconnect. time disconnected = ${secondsSince(
- this.disconnectedAt,
- )} s`,
- );
- } else {
- logger.log('ConnectionMonitor reopening');
- this.connection.reopen();
- }
- }
- }
-
- get refreshedAt() {
- return this.pingedAt ? this.pingedAt : this.startedAt;
- }
-
- connectionIsStale() {
- return secondsSince(this.refreshedAt) > this.constructor.staleThreshold;
- }
-
- disconnectedRecently() {
- return (
- this.disconnectedAt && secondsSince(this.disconnectedAt) < this.constructor.staleThreshold
- );
- }
-
- visibilityDidChange() {
- if (document.visibilityState === 'visible') {
- setTimeout(() => {
- if (this.connectionIsStale() || !this.connection.isOpen()) {
- logger.log(
- `ConnectionMonitor reopening stale connection on visibilitychange. visibilityState = ${document.visibilityState}`,
- );
- this.connection.reopen();
- }
- }, 200);
- }
- }
-}
-
-ConnectionMonitor.staleThreshold = 6; // Server::Connections::BEAT_INTERVAL * 2 (missed two pings)
-ConnectionMonitor.reconnectionBackoffRate = 0.15;
-
-export default ConnectionMonitor;
diff --git a/app/assets/javascripts/actioncable_consumer.js b/app/assets/javascripts/actioncable_consumer.js
index aeb61e61a3d..5658ffc1a38 100644
--- a/app/assets/javascripts/actioncable_consumer.js
+++ b/app/assets/javascripts/actioncable_consumer.js
@@ -1,10 +1,3 @@
import { createConsumer } from '@rails/actioncable';
-import ConnectionMonitor from './actioncable_connection_monitor';
-const consumer = createConsumer();
-
-if (consumer.connection) {
- consumer.connection.monitor = new ConnectionMonitor(consumer.connection);
-}
-
-export default consumer;
+export default createConsumer();
diff --git a/app/assets/javascripts/admin/abuse_reports/components/abuse_category.vue b/app/assets/javascripts/admin/abuse_reports/components/abuse_category.vue
new file mode 100644
index 00000000000..f05f96d6302
--- /dev/null
+++ b/app/assets/javascripts/admin/abuse_reports/components/abuse_category.vue
@@ -0,0 +1,33 @@
+<script>
+import { GlLabel } from '@gitlab/ui';
+import { ABUSE_CATEGORIES } from '../constants';
+
+export default {
+ name: 'AbuseCategory',
+ components: {
+ GlLabel,
+ },
+ props: {
+ category: {
+ type: String,
+ required: true,
+ },
+ },
+ computed: {
+ categoryObject() {
+ return ABUSE_CATEGORIES[this.category];
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-label
+ v-if="categoryObject"
+ size="sm"
+ :background-color="categoryObject.backgroundColor"
+ :title="categoryObject.title"
+ :target="null"
+ :class="`gl-text-${categoryObject.color}`"
+ />
+</template>
diff --git a/app/assets/javascripts/admin/abuse_reports/components/abuse_report_row.vue b/app/assets/javascripts/admin/abuse_reports/components/abuse_report_row.vue
index b8a4640de59..b229dd9e993 100644
--- a/app/assets/javascripts/admin/abuse_reports/components/abuse_report_row.vue
+++ b/app/assets/javascripts/admin/abuse_reports/components/abuse_report_row.vue
@@ -5,12 +5,14 @@ import { queryToObject } from '~/lib/utils/url_utility';
import { s__, __, sprintf } from '~/locale';
import ListItem from '~/vue_shared/components/registry/list_item.vue';
import { SORT_UPDATED_AT } from '../constants';
+import AbuseCategory from './abuse_category.vue';
export default {
name: 'AbuseReportRow',
components: {
GlLink,
ListItem,
+ AbuseCategory,
},
props: {
report: {
@@ -44,13 +46,24 @@ export default {
<template>
<list-item data-testid="abuse-report-row">
<template #left-primary>
- <gl-link :href="report.reportPath" class="gl-font-weight-normal gl-mb-2" data-testid="title">
+ <gl-link
+ :href="report.reportPath"
+ class="gl-font-weight-normal gl-pt-4 gl-text-gray-900"
+ data-testid="abuse-report-title"
+ >
{{ title }}
</gl-link>
</template>
+ <template #left-secondary>
+ <abuse-category
+ :category="report.category"
+ class="gl-mt-2 gl-mb-3"
+ data-testid="abuse-report-category"
+ />
+ </template>
<template #right-secondary>
- <div data-testid="abuse-report-date">{{ displayDate }}</div>
+ <div class="gl-mt-7" data-testid="abuse-report-date">{{ displayDate }}</div>
</template>
</list-item>
</template>
diff --git a/app/assets/javascripts/admin/abuse_reports/constants.js b/app/assets/javascripts/admin/abuse_reports/constants.js
index 9458aea299e..acb79293dfb 100644
--- a/app/assets/javascripts/admin/abuse_reports/constants.js
+++ b/app/assets/javascripts/admin/abuse_reports/constants.js
@@ -5,7 +5,7 @@ import {
OPERATORS_IS,
TOKEN_TITLE_STATUS,
} from '~/vue_shared/components/filtered_search_bar/constants';
-import { __ } from '~/locale';
+import { s__, __ } from '~/locale';
const STATUS_OPTIONS = [
{ value: 'closed', title: __('Closed') },
@@ -78,3 +78,46 @@ export const FILTERED_SEARCH_TOKENS = [
FILTERED_SEARCH_TOKEN_REPORTER,
FILTERED_SEARCH_TOKEN_STATUS,
];
+
+export const ABUSE_CATEGORIES = {
+ spam: {
+ backgroundColor: '#f5d9a8',
+ color: 'orange-700',
+ title: s__('AbuseReport|Spam'),
+ },
+ offensive: {
+ backgroundColor: '#e1d8f9',
+ color: 'purple-700',
+ title: s__('AbuseReport|Offensive or Abusive'),
+ },
+ phishing: {
+ backgroundColor: '#7c7ccc',
+ color: 'indigo-800',
+ title: s__('AbuseReport|Phishing'),
+ },
+ crypto: {
+ backgroundColor: '#fdd4cd',
+ color: 'red-700',
+ title: s__('AbuseReport|Crypto Mining'),
+ },
+ credentials: {
+ backgroundColor: '#cbe2f9',
+ color: 'blue-700',
+ title: s__('AbuseReport|Personal information or credentials'),
+ },
+ copyright: {
+ backgroundColor: '#c3e6cd',
+ color: 'green-700',
+ title: s__('AbuseReport|Copyright or trademark violation'),
+ },
+ malware: {
+ backgroundColor: '#fdd4cd',
+ color: 'red-700',
+ title: s__('AbuseReport|Malware'),
+ },
+ other: {
+ backgroundColor: '#dcdcde',
+ color: 'gray-700',
+ title: s__('AbuseReport|Other'),
+ },
+};
diff --git a/app/assets/javascripts/admin/applications/components/delete_application.vue b/app/assets/javascripts/admin/applications/components/delete_application.vue
index 77694296b0a..287a5537cf4 100644
--- a/app/assets/javascripts/admin/applications/components/delete_application.vue
+++ b/app/assets/javascripts/admin/applications/components/delete_application.vue
@@ -26,7 +26,7 @@ export default {
methods: {
buttonEvent(e) {
e.preventDefault();
- this.show(e.target.dataset);
+ this.show(e.currentTarget.dataset);
},
show(dataset) {
const { name, path } = dataset;
diff --git a/app/assets/javascripts/admin/broadcast_messages/components/message_form.vue b/app/assets/javascripts/admin/broadcast_messages/components/message_form.vue
index 427e6c14327..42a959e1b89 100644
--- a/app/assets/javascripts/admin/broadcast_messages/components/message_form.vue
+++ b/app/assets/javascripts/admin/broadcast_messages/components/message_form.vue
@@ -17,7 +17,15 @@ import { createAlert, VARIANT_DANGER } from '~/alert';
import { redirectTo } from '~/lib/utils/url_utility'; // eslint-disable-line import/no-deprecated
import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
import SafeHtml from '~/vue_shared/directives/safe_html';
-import { THEMES, TYPES, TYPE_BANNER } from '../constants';
+import {
+ THEMES,
+ TYPES,
+ TYPE_BANNER,
+ TARGET_OPTIONS,
+ TARGET_ALL,
+ TARGET_ALL_MATCHING_PATH,
+ TARGET_ROLES,
+} from '../constants';
import DatetimePicker from './datetime_picker.vue';
const FORM_HEADERS = { headers: { 'Content-Type': 'application/json; charset=utf-8' } };
@@ -59,10 +67,8 @@ export default {
theme: s__('BroadcastMessages|Theme'),
dismissable: s__('BroadcastMessages|Dismissable'),
dismissableDescription: s__('BroadcastMessages|Allow users to dismiss the broadcast message'),
+ target: s__('BroadcastMessages|Target broadcast message'),
targetRoles: s__('BroadcastMessages|Target roles'),
- targetRolesDescription: s__(
- 'BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles.',
- ),
targetPath: s__('BroadcastMessages|Target Path'),
targetPathDescription: s__('BroadcastMessages|Paths can contain wildcards, like */welcome'),
startsAt: s__('BroadcastMessages|Starts at'),
@@ -79,6 +85,7 @@ export default {
},
messageThemes: THEMES,
messageTypes: TYPES,
+ targetOptions: TARGET_OPTIONS,
props: {
broadcastMessage: {
type: Object,
@@ -92,6 +99,7 @@ export default {
type: this.broadcastMessage.broadcastType,
theme: this.broadcastMessage.theme,
dismissable: this.broadcastMessage.dismissable || false,
+ targetSelected: '',
targetPath: this.broadcastMessage.targetPath,
targetAccessLevels: this.broadcastMessage.targetAccessLevels,
targetAccessLevelOptions: this.targetAccessLevelOptions.map(([text, value]) => ({
@@ -122,6 +130,14 @@ export default {
? this.messagesPath
: `${this.messagesPath}/${this.broadcastMessage.id}`;
},
+ showTargetRoles() {
+ return this.targetSelected === TARGET_ROLES;
+ },
+ showTargetPath() {
+ return (
+ this.targetSelected === TARGET_ROLES || this.targetSelected === TARGET_ALL_MATCHING_PATH
+ );
+ },
formPayload() {
return JSON.stringify({
message: this.message,
@@ -143,6 +159,17 @@ export default {
},
immediate: true,
},
+ targetSelected(newTarget) {
+ if (newTarget === TARGET_ALL) {
+ this.targetPath = '';
+ this.targetAccessLevels = [];
+ } else if (newTarget === TARGET_ALL_MATCHING_PATH) {
+ this.targetAccessLevels = [];
+ }
+ },
+ },
+ created() {
+ this.targetSelected = this.initialTarget();
},
methods: {
async onSubmit() {
@@ -179,6 +206,15 @@ export default {
this.renderedMessage = '';
}
},
+
+ initialTarget() {
+ if (this.targetAccessLevels.length > 0) {
+ return TARGET_ROLES;
+ } else if (this.targetPath !== '') {
+ return TARGET_ALL_MATCHING_PATH;
+ }
+ return TARGET_ALL;
+ },
},
safeHtmlConfig: {
ADD_TAGS: ['use'],
@@ -245,14 +281,29 @@ export default {
</gl-form-group>
</template>
- <gl-form-group :label="$options.i18n.targetRoles" data-testid="target-roles-checkboxes">
+ <gl-form-group :label="$options.i18n.target" label-for="target-select">
+ <gl-form-select
+ id="target-select"
+ v-model="targetSelected"
+ :options="$options.targetOptions"
+ data-testid="target-select"
+ />
+ </gl-form-group>
+
+ <gl-form-group
+ v-show="showTargetRoles"
+ :label="$options.i18n.targetRoles"
+ data-testid="target-roles-checkboxes"
+ >
<gl-form-checkbox-group v-model="targetAccessLevels" :options="targetAccessLevelOptions" />
- <gl-form-text>
- {{ $options.i18n.targetRolesDescription }}
- </gl-form-text>
</gl-form-group>
- <gl-form-group :label="$options.i18n.targetPath" label-for="target-path-input">
+ <gl-form-group
+ v-show="showTargetPath"
+ :label="$options.i18n.targetPath"
+ label-for="target-path-input"
+ data-testid="target-path-input"
+ >
<gl-form-input id="target-path-input" v-model="targetPath" />
<gl-form-text>
{{ $options.i18n.targetPathDescription }}
diff --git a/app/assets/javascripts/admin/broadcast_messages/constants.js b/app/assets/javascripts/admin/broadcast_messages/constants.js
index ed137181a48..76e1cf91c2f 100644
--- a/app/assets/javascripts/admin/broadcast_messages/constants.js
+++ b/app/assets/javascripts/admin/broadcast_messages/constants.js
@@ -21,6 +21,27 @@ export const THEMES = [
{ value: 'light', text: s__('BroadcastMessages|Light') },
];
+export const TARGET_ALL = 'target_all';
+export const TARGET_ALL_MATCHING_PATH = 'target_all_matching_path';
+export const TARGET_ROLES = 'target_roles';
+
+export const TARGET_OPTIONS = [
+ {
+ value: TARGET_ALL,
+ text: s__('BroadcastMessages|Show to all users on all pages'),
+ },
+ {
+ value: TARGET_ALL_MATCHING_PATH,
+ text: s__('BroadcastMessages|Show to all users on specific matching pages'),
+ },
+ {
+ value: TARGET_ROLES,
+ text: s__(
+ 'BroadcastMessages|Show only to users who have specific roles on groups/project pages',
+ ),
+ },
+];
+
export const NEW_BROADCAST_MESSAGE = {
message: '',
broadcastType: TYPES[0].value,
diff --git a/app/assets/javascripts/admin/users/components/actions/ban.vue b/app/assets/javascripts/admin/users/components/actions/ban.vue
index d7bdceb4798..36dcde619cf 100644
--- a/app/assets/javascripts/admin/users/components/actions/ban.vue
+++ b/app/assets/javascripts/admin/users/components/actions/ban.vue
@@ -12,7 +12,7 @@ const messageHtml = `
<li>${s__("AdminUsers|The user can't log in.")}</li>
<li>${s__("AdminUsers|The user can't access git repositories.")}</li>
<li>${s__(
- 'AdminUsers|Issues and merge requests authored by this user are hidden from other users.',
+ 'AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users.',
)}</li>
</ul>
<p>${s__('AdminUsers|You can unban their account in the future. Their data remains intact.')}</p>
diff --git a/app/assets/javascripts/admin/users/components/users_table.vue b/app/assets/javascripts/admin/users/components/users_table.vue
index 2d2c598f953..65737be1e67 100644
--- a/app/assets/javascripts/admin/users/components/users_table.vue
+++ b/app/assets/javascripts/admin/users/components/users_table.vue
@@ -109,7 +109,7 @@ export default {
:empty-text="s__('AdminUsers|No users found')"
show-empty
stacked="md"
- :tbody-tr-attr="{ 'data-qa-selector': 'user_row_content' }"
+ :tbody-tr-attr="{ 'data-testid': 'user-row-content' }"
>
<template #cell(name)="{ item: user }">
<user-avatar :user="user" :admin-user-path="paths.adminUser" />
diff --git a/app/assets/javascripts/alerts_settings/components/alerts_settings_form.vue b/app/assets/javascripts/alerts_settings/components/alerts_settings_form.vue
index 428291f2313..033f48827f1 100644
--- a/app/assets/javascripts/alerts_settings/components/alerts_settings_form.vue
+++ b/app/assets/javascripts/alerts_settings/components/alerts_settings_form.vue
@@ -16,7 +16,7 @@ import {
import * as Sentry from '@sentry/browser';
import { isEqual, isEmpty, omit } from 'lodash';
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
-import { PROMO_URL } from 'jh_else_ce/lib/utils/url_utility';
+import { PROMO_URL, DOCS_URL_IN_EE_DIR } from 'jh_else_ce/lib/utils/url_utility';
import {
integrationTypes,
integrationSteps,
@@ -38,6 +38,7 @@ export default {
placeholders: {
prometheus: targetPrometheusUrlPlaceholder,
},
+ incidentManagementDocsLink: `${DOCS_URL_IN_EE_DIR}/operations/incident_management/integrations.html#configuration`,
JSON_VALIDATE_DELAY,
typeSet,
integrationSteps,
@@ -121,14 +122,12 @@ export default {
name: '',
token: '',
url: '',
- apiUrl: '',
},
activeTabIndex: this.tabIndex,
currentIntegration: null,
parsedPayload: [],
validationState: {
name: true,
- apiUrl: true,
},
pricingLink: `${PROMO_URL}/pricing`,
};
@@ -187,20 +186,14 @@ export default {
);
},
isFormDirty() {
- const { type, active, name, apiUrl, payloadAlertFields = [], payloadAttributeMappings = [] } =
+ const { type, active, name, payloadAlertFields = [], payloadAttributeMappings = [] } =
this.currentIntegration || {};
- const {
- name: formName,
- apiUrl: formApiUrl,
- active: formActive,
- type: formType,
- } = this.integrationForm;
+ const { name: formName, active: formActive, type: formType } = this.integrationForm;
const isDirty =
type !== formType ||
active !== formActive ||
name !== formName ||
- apiUrl !== formApiUrl ||
!isEqual(this.parsedPayload, payloadAlertFields) ||
!isEqual(this.mapping, this.getCleanMapping(payloadAttributeMappings));
@@ -210,25 +203,19 @@ export default {
return this.isFormValid && this.isFormDirty;
},
dataForSave() {
- const { name, apiUrl, active } = this.integrationForm;
+ const { name, active } = this.integrationForm;
const customMappingVariables = {
payloadAttributeMappings: this.mapping,
payloadExample: this.samplePayload.json || '{}',
};
- const variables = this.isHttp
- ? { name, active, ...customMappingVariables }
- : { apiUrl, active };
+ const variables = this.isHttp ? { name, active, ...customMappingVariables } : { active };
return { type: this.integrationForm.type, variables };
},
testAlertModal() {
return this.isFormDirty ? testAlertModalId : null;
},
- prometheusUrlInvalidFeedback() {
- const { blankUrlError, invalidUrlError } = i18n.integrationFormSteps.prometheusFormUrl;
- return this.integrationForm.apiUrl?.length ? invalidUrlError : blankUrlError;
- },
},
watch: {
tabIndex(val) {
@@ -246,13 +233,12 @@ export default {
type,
active,
url,
- apiUrl,
token,
payloadExample,
payloadAlertFields,
payloadAttributeMappings,
} = val;
- this.integrationForm = { type, name, active, url, apiUrl, token };
+ this.integrationForm = { type, name, active, url, token };
if (this.showMappingBuilder) {
this.resetPayloadAndMappingConfirmed = false;
@@ -270,14 +256,6 @@ export default {
validateName() {
this.validationState.name = Boolean(this.integrationForm.name?.length);
},
- validateApiUrl() {
- try {
- const parsedUrl = new URL(this.integrationForm.apiUrl);
- this.validationState.apiUrl = ['http:', 'https:'].includes(parsedUrl.protocol);
- } catch (e) {
- this.validationState.apiUrl = false;
- }
- },
isValidNonEmptyJSON(JSONString) {
if (JSONString) {
let parsed;
@@ -297,14 +275,12 @@ export default {
},
triggerValidation() {
if (this.isHttp) {
- this.validationState.apiUrl = true;
this.validateName();
if (!this.validationState.name) {
this.$refs.integrationName.$el.scrollIntoView({ behavior: 'smooth', block: 'center' });
}
} else if (this.isPrometheus) {
this.validationState.name = true;
- this.validateApiUrl();
}
},
sendTestAlert() {
@@ -331,7 +307,6 @@ export default {
this.integrationForm.type = integrationTypes.none.value;
this.integrationForm.name = '';
this.integrationForm.active = false;
- this.integrationForm.apiUrl = '';
this.samplePayload = {
json: null,
error: null,
@@ -489,28 +464,6 @@ export default {
class="gl-mt-4 gl-font-weight-normal"
/>
</gl-form-group>
-
- <gl-form-group
- v-if="isPrometheus"
- class="gl-my-4"
- :label="$options.i18n.integrationFormSteps.prometheusFormUrl.label"
- label-for="api-url"
- :invalid-feedback="prometheusUrlInvalidFeedback"
- :state="validationState.apiUrl"
- >
- <gl-form-input
- id="api-url"
- v-model="integrationForm.apiUrl"
- type="text"
- :placeholder="$options.placeholders.prometheus"
- data-qa-selector="prometheus_url_field"
- @input="validateApiUrl"
- />
- <span class="gl-text-gray-400">
- {{ $options.i18n.integrationFormSteps.prometheusFormUrl.help }}
- </span>
- </gl-form-group>
-
<template v-if="showMappingBuilder">
<gl-form-group
data-testid="sample-payload-section"
@@ -617,7 +570,7 @@ export default {
>
<alert-settings-form-help-block
:message="viewCredentialsHelpMsg"
- link="https://docs.gitlab.com/ee/operations/incident_management/integrations.html#configuration"
+ :link="$options.incidentManagementDocsLink"
/>
<gl-form-group id="integration-webhook">
diff --git a/app/assets/javascripts/alerts_settings/constants.js b/app/assets/javascripts/alerts_settings/constants.js
index 6d914fe8361..218b09cb1b6 100644
--- a/app/assets/javascripts/alerts_settings/constants.js
+++ b/app/assets/javascripts/alerts_settings/constants.js
@@ -65,12 +65,6 @@ export const i18n = {
proceedWithoutSave: s__('AlertSettings|Send without saving'),
cancel: __('Cancel'),
},
- prometheusFormUrl: {
- label: s__('AlertSettings|Prometheus API base URL'),
- help: s__('AlertSettings|URL cannot be blank and must start with http: or https:.'),
- blankUrlError: __('URL cannot be blank'),
- invalidUrlError: __('URL is invalid'),
- },
restKeyInfo: {
label: s__(
'AlertSettings|If you reset the authorization key for this project, you must update the key in every enabled alert source.',
diff --git a/app/assets/javascripts/alerts_settings/graphql/fragments/integration_item.fragment.graphql b/app/assets/javascripts/alerts_settings/graphql/fragments/integration_item.fragment.graphql
index 6d9307959df..2d8430dbede 100644
--- a/app/assets/javascripts/alerts_settings/graphql/fragments/integration_item.fragment.graphql
+++ b/app/assets/javascripts/alerts_settings/graphql/fragments/integration_item.fragment.graphql
@@ -5,5 +5,4 @@ fragment IntegrationItem on AlertManagementIntegration {
name
url
token
- apiUrl
}
diff --git a/app/assets/javascripts/alerts_settings/graphql/mutations/create_prometheus_integration.mutation.graphql b/app/assets/javascripts/alerts_settings/graphql/mutations/create_prometheus_integration.mutation.graphql
index bb22795ddd5..c2acd928c5c 100644
--- a/app/assets/javascripts/alerts_settings/graphql/mutations/create_prometheus_integration.mutation.graphql
+++ b/app/assets/javascripts/alerts_settings/graphql/mutations/create_prometheus_integration.mutation.graphql
@@ -1,9 +1,7 @@
#import "../fragments/integration_item.fragment.graphql"
-mutation createPrometheusIntegration($projectPath: ID!, $apiUrl: String!, $active: Boolean!) {
- prometheusIntegrationCreate(
- input: { projectPath: $projectPath, apiUrl: $apiUrl, active: $active }
- ) {
+mutation createPrometheusIntegration($projectPath: ID!, $active: Boolean!) {
+ prometheusIntegrationCreate(input: { projectPath: $projectPath, active: $active }) {
errors
integration {
...IntegrationItem
diff --git a/app/assets/javascripts/analytics/cycle_analytics/components/filter_bar.vue b/app/assets/javascripts/analytics/cycle_analytics/components/filter_bar.vue
index 33d6eb139f7..92649477922 100644
--- a/app/assets/javascripts/analytics/cycle_analytics/components/filter_bar.vue
+++ b/app/assets/javascripts/analytics/cycle_analytics/components/filter_bar.vue
@@ -78,6 +78,7 @@ export default {
title: TOKEN_TITLE_AUTHOR,
type: TOKEN_TYPE_AUTHOR,
token: UserToken,
+ dataType: 'user',
initialUsers: this.authorsData,
unique: true,
operators: OPERATORS_IS,
@@ -88,6 +89,7 @@ export default {
title: TOKEN_TITLE_ASSIGNEE,
type: TOKEN_TYPE_ASSIGNEE,
token: UserToken,
+ dataType: 'user',
initialUsers: this.assigneesData,
unique: false,
operators: OPERATORS_IS,
diff --git a/app/assets/javascripts/analytics/shared/constants.js b/app/assets/javascripts/analytics/shared/constants.js
index 25699c17b10..7ec7eac24ec 100644
--- a/app/assets/javascripts/analytics/shared/constants.js
+++ b/app/assets/javascripts/analytics/shared/constants.js
@@ -39,8 +39,8 @@ export const DORA_METRICS = {
};
const VSA_FLOW_METRICS_GROUP = {
- key: 'key_metrics',
- title: s__('ValueStreamAnalytics|Key metrics'),
+ key: 'lifecycle_metrics',
+ title: s__('ValueStreamAnalytics|Lifecycle metrics'),
keys: Object.values(FLOW_METRICS),
};
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 dfe94aeb884..06b83c87985 100644
--- a/app/assets/javascripts/analytics/usage_trends/components/users_chart.vue
+++ b/app/assets/javascripts/analytics/usage_trends/components/users_chart.vue
@@ -49,11 +49,13 @@ export default {
return data.users?.nodes || [];
},
result({ data }) {
- const {
- users: { pageInfo },
- } = data;
- this.pageInfo = pageInfo;
- this.fetchNextPage();
+ if (data) {
+ const {
+ users: { pageInfo },
+ } = data;
+ this.pageInfo = pageInfo;
+ this.fetchNextPage();
+ }
},
error(error) {
this.handleError(error);
diff --git a/app/assets/javascripts/api/groups_api.js b/app/assets/javascripts/api/groups_api.js
index 1b216e6f721..f9edebb9141 100644
--- a/app/assets/javascripts/api/groups_api.js
+++ b/app/assets/javascripts/api/groups_api.js
@@ -18,10 +18,10 @@ const axiosGet = (url, query, options, callback) => {
...options,
},
})
- .then(({ data }) => {
+ .then(({ data, headers }) => {
callback(data);
- return data;
+ return { data, headers };
});
};
diff --git a/app/assets/javascripts/api/user_api.js b/app/assets/javascripts/api/user_api.js
index 17ad1a0b31d..c056b42b5b6 100644
--- a/app/assets/javascripts/api/user_api.js
+++ b/app/assets/javascripts/api/user_api.js
@@ -11,6 +11,7 @@ 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 USER_FOLLOWERS_PATH = '/api/:version/users/:id/followers';
+const USER_FOLLOWING_PATH = '/api/:version/users/:id/following';
const USER_ASSOCIATIONS_COUNT_PATH = '/api/:version/users/:id/associations_count';
export function getUsers(query, options) {
@@ -82,6 +83,16 @@ export function getUserFollowers(userId, params) {
});
}
+export function getUserFollowing(userId, params) {
+ const url = buildApiUrl(USER_FOLLOWING_PATH).replace(':id', encodeURIComponent(userId));
+ return axios.get(url, {
+ params: {
+ per_page: DEFAULT_PER_PAGE,
+ ...params,
+ },
+ });
+}
+
export function associationsCount(userId) {
const url = buildApiUrl(USER_ASSOCIATIONS_COUNT_PATH).replace(':id', encodeURIComponent(userId));
return axios.get(url);
diff --git a/app/assets/javascripts/batch_comments/components/submit_dropdown.vue b/app/assets/javascripts/batch_comments/components/submit_dropdown.vue
index e6c3a0cba58..96889f0059c 100644
--- a/app/assets/javascripts/batch_comments/components/submit_dropdown.vue
+++ b/app/assets/javascripts/batch_comments/components/submit_dropdown.vue
@@ -1,10 +1,14 @@
<script>
import { GlDropdown, GlButton, GlIcon, GlForm, GlFormGroup, GlFormCheckbox } from '@gitlab/ui';
import { mapGetters, mapActions, mapState } from 'vuex';
+import { __ } from '~/locale';
import { createAlert } from '~/alert';
-import MarkdownField from '~/vue_shared/components/markdown/field.vue';
+import MarkdownEditor from '~/vue_shared/components/markdown/markdown_editor.vue';
import { scrollToElement } from '~/lib/utils/common_utils';
-import Autosave from '~/autosave';
+import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import { CLEAR_AUTOSAVE_ENTRY_EVENT } from '~/vue_shared/constants';
+import markdownEditorEventHub from '~/vue_shared/components/markdown/eventhub';
+import { trackSavedUsingEditor } from '~/vue_shared/components/markdown/tracking';
export default {
components: {
@@ -14,9 +18,10 @@ export default {
GlForm,
GlFormGroup,
GlFormCheckbox,
- MarkdownField,
+ MarkdownEditor,
ApprovalPassword: () => import('ee_component/batch_comments/components/approval_password.vue'),
},
+ mixins: [glFeatureFlagsMixin()],
data() {
return {
isSubmitting: false,
@@ -27,11 +32,24 @@ export default {
approve: false,
approval_password: '',
},
+ formFieldProps: {
+ id: 'review-note-body',
+ name: 'review[note]',
+ placeholder: __('Write a comment or drag your files here…'),
+ 'aria-label': __('Comment'),
+ 'data-testid': 'comment-textarea',
+ },
};
},
computed: {
...mapGetters(['getNotesData', 'getNoteableData', 'noteableType', 'getCurrentUserLastNote']),
...mapState('batchComments', ['shouldAnimateReviewButton']),
+ autocompleteDataSources() {
+ return gl.GfmAutoComplete?.dataSources;
+ },
+ autosaveKey() {
+ return `submit_review_dropdown/${this.getNoteableData.id}`;
+ },
},
watch: {
'noteData.approve': function noteDataApproveWatch() {
@@ -41,10 +59,6 @@ export default {
},
},
mounted() {
- this.autosave = new Autosave(
- this.$refs.textarea,
- `submit_review_dropdown/${this.getNoteableData.id}`,
- );
this.noteData.noteable_type = this.noteableType;
this.noteData.noteable_id = this.getNoteableData.id;
@@ -67,10 +81,12 @@ export default {
async submitReview() {
this.isSubmitting = true;
+ trackSavedUsingEditor(this.$refs.markdownEditor.isContentEditorActive, 'MergeRequest_review');
+
try {
await this.publishReview(this.noteData);
- this.autosave.reset();
+ markdownEditorEventHub.$emit(CLEAR_AUTOSAVE_ENTRY_EVENT, this.descriptionAutosaveKey);
if (window.mrTabs && (this.noteData.note || this.noteData.approve)) {
if (this.noteData.note) {
@@ -117,37 +133,26 @@ export default {
{{ __('Summary comment (optional)') }}
</template>
<div class="common-note-form gfm-form">
- <div class="comment-warning-wrapper-large gl-border-0 gl-bg-white gl-overflow-hidden">
- <markdown-field
- :is-submitting="isSubmitting"
- :add-spacing-classes="false"
- :textarea-value="noteData.note"
- :markdown-preview-path="getNoteableData.preview_note_path"
- :markdown-docs-path="getNotesData.markdownDocsPath"
- :quick-actions-docs-path="getNotesData.quickActionsDocsPath"
- :restricted-tool-bar-items="$options.restrictedToolbarItems"
- :force-autosize="false"
- class="js-no-autosize"
- >
- <template #textarea>
- <textarea
- id="review-note-body"
- ref="textarea"
- v-model="noteData.note"
- dir="auto"
- :disabled="isSubmitting"
- name="review[note]"
- class="note-textarea js-gfm-input markdown-area"
- data-supports-quick-actions="true"
- data-testid="comment-textarea"
- :aria-label="__('Comment')"
- :placeholder="__('Write a comment or drag your files here…')"
- @keydown.meta.enter="submitReview"
- @keydown.ctrl.enter="submitReview"
- ></textarea>
- </template>
- </markdown-field>
- </div>
+ <markdown-editor
+ ref="markdownEditor"
+ v-model="noteData.note"
+ :enable-content-editor="Boolean(glFeatures.contentEditorOnIssues)"
+ class="js-no-autosize"
+ :is-submitting="isSubmitting"
+ :render-markdown-path="getNoteableData.preview_note_path"
+ :markdown-docs-path="getNotesData.markdownDocsPath"
+ :form-field-props="formFieldProps"
+ enable-autocomplete
+ :autocomplete-data-sources="autocompleteDataSources"
+ :disabled="isSubmitting"
+ :restricted-tool-bar-items="$options.restrictedToolbarItems"
+ :force-autosize="false"
+ :autosave-key="autosaveKey"
+ supports-quick-actions
+ @input="$emit('input', $event)"
+ @keydown.meta.enter="submitReview"
+ @keydown.ctrl.enter="submitReview"
+ />
</div>
</gl-form-group>
<template v-if="getNoteableData.current_user.can_approve">
diff --git a/app/assets/javascripts/batch_comments/stores/modules/batch_comments/actions.js b/app/assets/javascripts/batch_comments/stores/modules/batch_comments/actions.js
index 45e7256a734..070ce38c8aa 100644
--- a/app/assets/javascripts/batch_comments/stores/modules/batch_comments/actions.js
+++ b/app/assets/javascripts/batch_comments/stores/modules/batch_comments/actions.js
@@ -3,6 +3,7 @@ import { createAlert } from '~/alert';
import { scrollToElement } from '~/lib/utils/common_utils';
import { __ } from '~/locale';
import { FILE_DIFF_POSITION_TYPE } from '~/diffs/constants';
+import { updateNoteErrorMessage } from '~/notes/utils';
import { CHANGES_TAB, DISCUSSION_TAB, SHOW_TAB } from '../../../constants';
import service from '../../../services/drafts_service';
import * as types from './mutation_types';
@@ -18,10 +19,8 @@ export const addDraftToDiscussion = ({ commit }, { endpoint, data }) =>
commit(types.ADD_NEW_DRAFT, res);
return res;
})
- .catch(() => {
- createAlert({
- message: __('An error occurred adding a draft to the thread.'),
- });
+ .catch((e) => {
+ throw e.response;
});
export const createNewDraft = ({ commit, dispatch }, { endpoint, data }) =>
@@ -37,10 +36,8 @@ export const createNewDraft = ({ commit, dispatch }, { endpoint, data }) =>
return res;
})
- .catch(() => {
- createAlert({
- message: __('An error occurred adding a new draft.'),
- });
+ .catch((e) => {
+ throw e.response;
});
export const deleteDraft = ({ commit, getters }, draft) =>
@@ -113,7 +110,7 @@ export const updateDiscussionsAfterPublish = async ({ dispatch, getters, rootGet
export const updateDraft = (
{ commit, getters },
- { note, noteText, resolveDiscussion, position, callback },
+ { note, noteText, resolveDiscussion, position, flashContainer, callback, errorCallback },
) => {
const params = {
draftId: note.id,
@@ -129,11 +126,14 @@ export const updateDraft = (
.then((res) => res.data)
.then((data) => commit(types.RECEIVE_DRAFT_UPDATE_SUCCESS, data))
.then(callback)
- .catch(() =>
+ .catch((e) => {
createAlert({
- message: __('An error occurred while updating the comment'),
- }),
- );
+ message: updateNoteErrorMessage(e),
+ parent: flashContainer,
+ });
+
+ errorCallback();
+ });
};
export const scrollToDraft = ({ dispatch, rootGetters }, draft) => {
diff --git a/app/assets/javascripts/behaviors/gl_emoji.js b/app/assets/javascripts/behaviors/gl_emoji.js
index 29204020058..8849e9f7a11 100644
--- a/app/assets/javascripts/behaviors/gl_emoji.js
+++ b/app/assets/javascripts/behaviors/gl_emoji.js
@@ -1,4 +1,10 @@
-import { initEmojiMap, getEmojiInfo, emojiFallbackImageSrc, emojiImageTag } from '../emoji';
+import {
+ initEmojiMap,
+ getEmojiInfo,
+ emojiFallbackImageSrc,
+ emojiImageTag,
+ findCustomEmoji,
+} from '../emoji';
import isEmojiUnicodeSupported from '../emoji/support';
class GlEmoji extends HTMLElement {
@@ -33,6 +39,7 @@ class GlEmoji extends HTMLElement {
this.childNodes &&
Array.prototype.every.call(this.childNodes, (childNode) => childNode.nodeType === 3);
+ const customEmoji = findCustomEmoji(name);
const hasImageFallback = fallbackSrc?.length > 0;
const hasCssSpriteFallback = fallbackSpriteClass?.length > 0;
@@ -51,7 +58,7 @@ class GlEmoji extends HTMLElement {
this.classList.add(fallbackSpriteClass);
} else if (hasImageFallback) {
this.innerHTML = '';
- this.appendChild(emojiImageTag(name, fallbackSrc));
+ this.appendChild(emojiImageTag(name, customEmoji?.src || fallbackSrc));
} else {
const src = emojiFallbackImageSrc(name);
this.innerHTML = '';
diff --git a/app/assets/javascripts/behaviors/markdown/render_gfm.js b/app/assets/javascripts/behaviors/markdown/render_gfm.js
index 39a7a76e91f..333858f717c 100644
--- a/app/assets/javascripts/behaviors/markdown/render_gfm.js
+++ b/app/assets/javascripts/behaviors/markdown/render_gfm.js
@@ -3,13 +3,12 @@ import highlightCurrentUser from './highlight_current_user';
import { renderKroki } from './render_kroki';
import renderMath from './render_math';
import renderSandboxedMermaid from './render_sandboxed_mermaid';
-import renderMetrics from './render_metrics';
import renderObservability from './render_observability';
import { renderJSONTable } from './render_json_table';
function initPopovers(elements) {
if (!elements.length) return;
- import(/* webpackChunkName: 'IssuablePopoverBundle' */ '~/issuable/popover')
+ import(/* webpackChunkName: 'IssuablePopoverBundle' */ 'ee_else_ce/issuable/popover')
.then(({ default: initIssuablePopovers }) => {
initIssuablePopovers(elements);
})
@@ -30,7 +29,6 @@ export function renderGFM(element) {
tableEls,
userEls,
popoverEls,
- metricsEls,
observabilityEls,
] = [
'.js-syntax-highlight',
@@ -39,8 +37,7 @@ export function renderGFM(element) {
'.js-render-mermaid',
'[lang="json"][data-lang-params="table"]',
'.gfm-project_member',
- '.gfm-issue, .gfm-work_item, .gfm-merge_request',
- '.js-render-metrics',
+ '.gfm-issue, .gfm-work_item, .gfm-merge_request, .gfm-epic',
'.js-render-observability',
].map((selector) => Array.from(element.querySelectorAll(selector)));
@@ -50,9 +47,6 @@ export function renderGFM(element) {
renderSandboxedMermaid(mermaidEls);
renderJSONTable(tableEls.map((e) => e.parentNode));
highlightCurrentUser(userEls);
- if (!window.gon?.features?.removeMonitorMetrics) {
- renderMetrics(metricsEls);
- }
renderObservability(observabilityEls);
initPopovers(popoverEls);
}
diff --git a/app/assets/javascripts/behaviors/markdown/render_metrics.js b/app/assets/javascripts/behaviors/markdown/render_metrics.js
deleted file mode 100644
index e7a2a6ce47c..00000000000
--- a/app/assets/javascripts/behaviors/markdown/render_metrics.js
+++ /dev/null
@@ -1,47 +0,0 @@
-import Vue from 'vue';
-import { createStore } from '~/monitoring/stores/embed_group/';
-
-// TODO: Handle copy-pasting - https://gitlab.com/gitlab-org/gitlab-foss/issues/64369.
-export default function renderMetrics(elements) {
- if (!elements.length) {
- return Promise.resolve();
- }
-
- const wrapperList = [];
-
- elements.forEach((element) => {
- let wrapper;
- const { previousElementSibling } = element;
- const isFirstElementInGroup = !previousElementSibling?.urls;
-
- if (isFirstElementInGroup) {
- wrapper = document.createElement('div');
- wrapper.urls = [element.dataset.dashboardUrl];
- element.parentNode.insertBefore(wrapper, element);
- wrapperList.push(wrapper);
- } else {
- wrapper = previousElementSibling;
- wrapper.urls.push(element.dataset.dashboardUrl);
- }
-
- // Clean up processed element
- element.parentNode.removeChild(element);
- });
-
- return import(
- /* webpackChunkName: 'gfm_metrics' */ '~/monitoring/components/embeds/embed_group.vue'
- ).then(({ default: EmbedGroup }) => {
- const EmbedGroupComponent = Vue.extend(EmbedGroup);
-
- wrapperList.forEach((wrapper) => {
- // eslint-disable-next-line no-new
- new EmbedGroupComponent({
- el: wrapper,
- store: createStore(),
- propsData: {
- urls: wrapper.urls,
- },
- });
- });
- });
-}
diff --git a/app/assets/javascripts/behaviors/preview_markdown.js b/app/assets/javascripts/behaviors/preview_markdown.js
index bcd92d09033..ce77ede9fe4 100644
--- a/app/assets/javascripts/behaviors/preview_markdown.js
+++ b/app/assets/javascripts/behaviors/preview_markdown.js
@@ -139,7 +139,7 @@ $(document).on('markdown-preview:show', (e, $form) => {
// toggle content
$form.find('.md-write-holder').hide();
$form.find('.md-preview-holder').show();
- $form.find('.md-header-toolbar, .js-zen-enter').addClass('gl-display-none!');
+ $form.find('.haml-markdown-button, .js-zen-enter').addClass('gl-display-none!');
markdownPreview.showPreview($form);
});
@@ -162,7 +162,7 @@ $(document).on('markdown-preview:hide', (e, $form) => {
$form.find('.md-write-holder').show();
$form.find('textarea.markdown-area').focus();
$form.find('.md-preview-holder').hide();
- $form.find('.md-header-toolbar, .js-zen-enter').removeClass('gl-display-none!');
+ $form.find('.haml-markdown-button, .js-zen-enter').removeClass('gl-display-none!');
markdownPreview.hideReferencedCommands($form);
});
diff --git a/app/assets/javascripts/blob/line_highlighter.js b/app/assets/javascripts/blob/line_highlighter.js
index a8932f8c73b..1ec204b4034 100644
--- a/app/assets/javascripts/blob/line_highlighter.js
+++ b/app/assets/javascripts/blob/line_highlighter.js
@@ -1,6 +1,5 @@
/* eslint-disable func-names, no-underscore-dangle, no-param-reassign, consistent-return */
-import $ from 'jquery';
import { scrollToElement } from '~/lib/utils/common_utils';
// LineHighlighter
@@ -52,11 +51,12 @@ const LineHighlighter = function (options = {}) {
};
LineHighlighter.prototype.bindEvents = function () {
- const $fileHolder = $(this.options.fileHolderSelector);
-
- $fileHolder.on('click', 'a[data-line-number]', this.clickHandler);
- $fileHolder.on('highlight:line', this.highlightHash);
- window.addEventListener('hashchange', (e) => this.highlightHash(e.target.location.hash));
+ const fileHolder = document.querySelector(this.options.fileHolderSelector);
+ if (fileHolder) {
+ fileHolder.addEventListener('click', this.clickHandler);
+ fileHolder.addEventListener('highlight:line', this.highlightHash);
+ window.addEventListener('hashchange', (e) => this.highlightHash(e.target.location.hash));
+ }
};
LineHighlighter.prototype.highlightHash = function (newHash) {
@@ -82,29 +82,35 @@ LineHighlighter.prototype.highlightHash = function (newHash) {
};
LineHighlighter.prototype.clickHandler = function (event) {
- let range;
- event.preventDefault();
- this.clearHighlight();
- const lineNumber = $(event.target).closest('a').data('lineNumber');
- const current = this.hashToRange(this._hash);
- if (!(current[0] && event.shiftKey)) {
- // If there's no current selection, or there is but Shift wasn't held,
- // treat this like a single-line selection.
- this.setHash(lineNumber);
- return this.highlightLine(lineNumber);
- } else if (event.shiftKey) {
- if (lineNumber < current[0]) {
- range = [lineNumber, current[0]];
- } else {
- range = [current[0], lineNumber];
+ const isLine = event.target.matches('a[data-line-number]');
+ if (isLine) {
+ let range;
+ event.preventDefault();
+ this.clearHighlight();
+ const lineNumber = parseInt(event.target.dataset.lineNumber, 10);
+ const current = this.hashToRange(this._hash);
+ if (!(current[0] && event.shiftKey)) {
+ // If there's no current selection, or there is but Shift wasn't held,
+ // treat this like a single-line selection.
+ this.setHash(lineNumber);
+ return this.highlightLine(lineNumber);
+ } else if (event.shiftKey) {
+ if (lineNumber < current[0]) {
+ range = [lineNumber, current[0]];
+ } else {
+ range = [current[0], lineNumber];
+ }
+ this.setHash(range[0], range[1]);
+ return this.highlightRange(range);
}
- this.setHash(range[0], range[1]);
- return this.highlightRange(range);
}
};
LineHighlighter.prototype.clearHighlight = function () {
- return $(`.${this.highlightLineClass}`).removeClass(this.highlightLineClass);
+ const highlightedLines = document.getElementsByClassName(this.highlightLineClass);
+ Array.from(highlightedLines).forEach(function (line) {
+ line.classList.remove(this.highlightLineClass);
+ }, this);
};
// Convert a URL hash String into line numbers
@@ -133,7 +139,10 @@ LineHighlighter.prototype.hashToRange = function (hash) {
//
// lineNumber - Line number to highlight
LineHighlighter.prototype.highlightLine = function (lineNumber) {
- return $(`#LC${lineNumber}`).addClass(this.highlightLineClass);
+ const lineElement = document.getElementById(`LC${lineNumber}`);
+ if (lineElement) {
+ lineElement.classList.add(this.highlightLineClass);
+ }
};
// Highlight all lines within a range
@@ -144,7 +153,7 @@ LineHighlighter.prototype.highlightRange = function (range) {
const results = [];
const ref = range[0] <= range[1] ? range : range.reverse();
- for (let lineNumber = range[0]; lineNumber <= ref[1]; lineNumber += 1) {
+ for (let lineNumber = ref[0]; lineNumber <= ref[1]; lineNumber += 1) {
results.push(this.highlightLine(lineNumber));
}
diff --git a/app/assets/javascripts/boards/components/board_app.vue b/app/assets/javascripts/boards/components/board_app.vue
index 0b9243c07c5..ca8299ddf80 100644
--- a/app/assets/javascripts/boards/components/board_app.vue
+++ b/app/assets/javascripts/boards/components/board_app.vue
@@ -5,9 +5,11 @@ import { s__ } from '~/locale';
import BoardContent from '~/boards/components/board_content.vue';
import BoardSettingsSidebar from '~/boards/components/board_settings_sidebar.vue';
import BoardTopBar from '~/boards/components/board_top_bar.vue';
+import eventHub from '~/boards/eventhub';
import { listsQuery } from 'ee_else_ce/boards/constants';
import { formatBoardLists } from 'ee_else_ce/boards/boards_util';
import activeBoardItemQuery from 'ee_else_ce/boards/graphql/client/active_board_item.query.graphql';
+import errorQuery from '../graphql/client/error.query.graphql';
export default {
i18n: {
@@ -38,6 +40,7 @@ export default {
addColumnFormVisible: false,
isShowingEpicsSwimlanes: Boolean(queryToObject(window.location.search).group_by),
apolloError: null,
+ error: null,
};
},
apollo: {
@@ -75,6 +78,10 @@ export default {
this.apolloError = this.$options.i18n.fetchError;
},
},
+ error: {
+ query: errorQuery,
+ update: (data) => data.boardsAppError,
+ },
},
computed: {
@@ -106,11 +113,16 @@ export default {
},
created() {
window.addEventListener('popstate', refreshCurrentPage);
+ eventHub.$on('updateBoard', this.refetchLists);
},
destroyed() {
window.removeEventListener('popstate', refreshCurrentPage);
+ eventHub.$off('updateBoard', this.refetchLists);
},
methods: {
+ refetchLists() {
+ this.$apollo.queries.boardListsApollo.refetch();
+ },
setActiveId(id) {
this.activeListId = id;
},
@@ -145,7 +157,7 @@ export default {
:is-swimlanes-on="isSwimlanesOn"
:filter-params="filterParams"
:board-lists-apollo="boardListsApollo"
- :apollo-error="apolloError"
+ :apollo-error="apolloError || error"
:list-query-variables="listQueryVariables"
@setActiveList="setActiveId"
@setAddColumnFormVisibility="addColumnFormVisible = $event"
diff --git a/app/assets/javascripts/boards/components/board_card_inner.vue b/app/assets/javascripts/boards/components/board_card_inner.vue
index befd04c29ae..6036f0c359c 100644
--- a/app/assets/javascripts/boards/components/board_card_inner.vue
+++ b/app/assets/javascripts/boards/components/board_card_inner.vue
@@ -43,7 +43,14 @@ export default {
GlTooltip: GlTooltipDirective,
},
mixins: [boardCardInner],
- inject: ['rootPath', 'scopedLabelsAvailable', 'isEpicBoard', 'issuableType', 'isGroupBoard'],
+ inject: [
+ 'rootPath',
+ 'scopedLabelsAvailable',
+ 'isEpicBoard',
+ 'issuableType',
+ 'isGroupBoard',
+ 'isApolloBoard',
+ ],
props: {
item: {
type: Object,
@@ -78,6 +85,9 @@ export default {
},
computed: {
...mapState(['isShowingLabels', 'allowSubEpics']),
+ isLoading() {
+ return this.item.isLoading || this.item.iid === '-1';
+ },
cappedAssignees() {
// e.g. maxRender is 4,
// Render up to all 4 assignees if there are only 4 assigness
@@ -201,7 +211,9 @@ export default {
updateHistory({
url: `${filterPath}${filter}`,
});
- this.performSearch();
+ if (!this.isApolloBoard) {
+ this.performSearch();
+ }
eventHub.$emit('updateTokens');
}
},
@@ -243,7 +255,7 @@ export default {
<a
:href="item.path || item.webUrl || ''"
:title="item.title"
- :class="{ 'gl-text-gray-400!': item.isLoading }"
+ :class="{ 'gl-text-gray-400!': isLoading }"
class="js-no-trigger gl-text-body gl-hover-text-gray-900"
@mousemove.stop
>{{ item.title }}</a
@@ -272,9 +284,9 @@ export default {
<div
class="gl-display-flex align-items-start flex-wrap-reverse board-card-number-container gl-overflow-hidden"
>
- <gl-loading-icon v-if="item.isLoading" size="lg" class="gl-mt-5" />
+ <gl-loading-icon v-if="isLoading" size="lg" class="gl-mt-5" />
<span
- v-if="item.referencePath"
+ v-if="item.referencePath && !isLoading"
class="board-card-number gl-overflow-hidden gl-display-flex gl-mr-3 gl-mt-3 gl-font-sm gl-text-secondary"
:class="{ 'gl-font-base': isEpicBoard }"
>
diff --git a/app/assets/javascripts/boards/components/board_content.vue b/app/assets/javascripts/boards/components/board_content.vue
index a51e4ddc8f8..14c781f588f 100644
--- a/app/assets/javascripts/boards/components/board_content.vue
+++ b/app/assets/javascripts/boards/components/board_content.vue
@@ -4,7 +4,6 @@ import { sortBy } from 'lodash';
import produce from 'immer';
import Draggable from 'vuedraggable';
import { mapState, mapActions } from 'vuex';
-import eventHub from '~/boards/eventhub';
import BoardAddNewColumn from 'ee_else_ce/boards/components/board_add_new_column.vue';
import { defaultSortableOptions } from '~/sortable/constants';
import {
@@ -107,24 +106,15 @@ export default {
return this.canDragColumns ? options : {};
},
errorToDisplay() {
- return this.isApolloBoard ? this.apolloError : this.error;
+ return this.apolloError || this.error || null;
},
},
- created() {
- eventHub.$on('updateBoard', this.refetchLists);
- },
- beforeDestroy() {
- eventHub.$off('updateBoard', this.refetchLists);
- },
methods: {
...mapActions(['moveList', 'unsetError']),
afterFormEnters() {
const el = this.canDragColumns ? this.$refs.list.$el : this.$refs.list;
el.scrollTo({ left: el.scrollWidth, behavior: 'smooth' });
},
- refetchLists() {
- this.$apollo.queries.boardListsApollo.refetch();
- },
highlightList(listId) {
this.highlightedLists.push(listId);
diff --git a/app/assets/javascripts/boards/components/board_form.vue b/app/assets/javascripts/boards/components/board_form.vue
index 604e71f5993..9ea801dc9a2 100644
--- a/app/assets/javascripts/boards/components/board_form.vue
+++ b/app/assets/javascripts/boards/components/board_form.vue
@@ -226,10 +226,12 @@ export default {
}
this.cancel();
- const param = getParameterByName('group_by')
- ? `?group_by=${getParameterByName('group_by')}`
- : '';
- updateHistory({ url: `${this.boardBaseUrl}/${getIdFromGraphQLId(board.id)}${param}` });
+ if (!this.isApolloBoard) {
+ const param = getParameterByName('group_by')
+ ? `?group_by=${getParameterByName('group_by')}`
+ : '';
+ updateHistory({ url: `${this.boardBaseUrl}/${getIdFromGraphQLId(board.id)}${param}` });
+ }
} catch {
this.setError({ message: this.$options.i18n.saveErrorMessage });
} finally {
diff --git a/app/assets/javascripts/boards/components/board_list.vue b/app/assets/javascripts/boards/components/board_list.vue
index af309ba9912..b4249c63b4d 100644
--- a/app/assets/javascripts/boards/components/board_list.vue
+++ b/app/assets/javascripts/boards/components/board_list.vue
@@ -22,6 +22,7 @@ import {
removeItemFromList,
updateEpicsCount,
updateIssueCountAndWeight,
+ setError,
} from '../graphql/cache_updates';
import { shouldCloneCard, moveItemVariables } from '../boards_util';
import eventHub from '../eventhub';
@@ -33,7 +34,7 @@ export default {
name: 'BoardList',
i18n: {
loading: __('Loading'),
- loadingMoreboardItems: __('Loading more'),
+ loadingMoreBoardItems: __('Loading more'),
showingAllIssues: __('Showing all issues'),
showingAllEpics: __('Showing all epics'),
},
@@ -83,6 +84,7 @@ export default {
isLoadingMore: false,
toListId: null,
toList: {},
+ addItemToListInProgress: false,
};
},
apollo: {
@@ -213,7 +215,8 @@ export default {
return !this.disabled;
},
treeRootWrapper() {
- return this.canMoveIssue && !this.listsFlags[this.list.id]?.addItemToListInProgress
+ return this.canMoveIssue &&
+ (!this.listsFlags[this.list.id]?.addItemToListInProgress || this.addItemToListInProgress)
? Draggable
: 'ul';
},
@@ -468,14 +471,14 @@ export default {
this.updateCountAndWeight({ fromListId, toListId, issuable, cache });
},
- updateCountAndWeight({ fromListId, toListId, issuable, isAddingIssue, cache }) {
+ updateCountAndWeight({ fromListId, toListId, issuable, isAddingItem, cache }) {
if (!this.isEpicBoard) {
updateIssueCountAndWeight({
fromListId,
toListId,
filterParams: this.filterParams,
issuable,
- shouldClone: isAddingIssue || this.shouldCloneCard,
+ shouldClone: isAddingItem || this.shouldCloneCard,
cache,
});
} else {
@@ -486,7 +489,7 @@ export default {
fromListId,
filterParams,
issuable,
- shouldClone: this.shouldCloneCard,
+ shouldClone: isAddingItem || this.shouldCloneCard,
cache,
});
}
@@ -538,6 +541,59 @@ export default {
},
});
},
+ async addListItem(input) {
+ this.toggleForm();
+ this.addItemToListInProgress = true;
+ try {
+ await this.$apollo.mutate({
+ mutation: listIssuablesQueries[this.issuableType].createMutation,
+ variables: {
+ input: this.isEpicBoard ? input : { ...input, moveAfterId: this.boardListItems[0]?.id },
+ withColor: this.isEpicBoard && this.glFeatures.epicColorHighlight,
+ },
+ update: (cache, { data: { createIssuable } }) => {
+ const { issuable } = createIssuable;
+ addItemToList({
+ query: listIssuablesQueries[this.issuableType].query,
+ variables: { ...this.listQueryVariables, id: this.currentList.id },
+ issuable,
+ newIndex: 0,
+ boardType: this.boardType,
+ issuableType: this.issuableType,
+ cache,
+ });
+ this.updateCountAndWeight({
+ fromListId: null,
+ toListId: this.list.id,
+ issuable,
+ isAddingItem: true,
+ cache,
+ });
+ },
+ optimisticResponse: {
+ createIssuable: {
+ errors: [],
+ issuable: {
+ ...listIssuablesQueries[this.issuableType].optimisticResponse,
+ title: input.title,
+ },
+ },
+ },
+ });
+ } catch (error) {
+ setError({
+ message: sprintf(
+ __('An error occurred while creating the %{issuableType}. Please try again.'),
+ {
+ issuableType: this.isEpicBoard ? 'epic' : 'issue',
+ },
+ ),
+ error,
+ });
+ } finally {
+ this.addItemToListInProgress = false;
+ }
+ },
},
};
</script>
@@ -556,8 +612,18 @@ export default {
>
<gl-loading-icon size="sm" />
</div>
- <board-new-issue v-if="issueCreateFormVisible" :list="list" />
- <board-new-epic v-if="epicCreateFormVisible" :list="list" />
+ <board-new-issue
+ v-if="issueCreateFormVisible"
+ :list="list"
+ :board-id="boardId"
+ @addNewIssue="addListItem"
+ />
+ <board-new-epic
+ v-if="epicCreateFormVisible"
+ :list="list"
+ :board-id="boardId"
+ @addNewEpic="addListItem"
+ />
<component
:is="treeRootWrapper"
v-show="!loading"
@@ -610,7 +676,7 @@ export default {
<gl-loading-icon
v-if="loadingMore"
size="sm"
- :label="$options.i18n.loadingMoreboardItems"
+ :label="$options.i18n.loadingMoreBoardItems"
/>
<span v-if="showingAllItems">{{ showingAllItemsText }}</span>
<span v-else>{{ paginatedIssueText }}</span>
diff --git a/app/assets/javascripts/boards/components/board_list_header.vue b/app/assets/javascripts/boards/components/board_list_header.vue
index 61a9b22bfc5..8db86d0e894 100644
--- a/app/assets/javascripts/boards/components/board_list_header.vue
+++ b/app/assets/javascripts/boards/components/board_list_header.vue
@@ -1,12 +1,12 @@
<script>
import {
GlButton,
+ GlButtonGroup,
GlLabel,
GlTooltip,
GlIcon,
GlSprintf,
GlTooltipDirective,
- GlDisclosureDropdown,
} from '@gitlab/ui';
import { mapActions, mapState } from 'vuex';
import { isListDraggable } from '~/boards/boards_util';
@@ -35,15 +35,14 @@ import ItemCount from './item_count.vue';
export default {
i18n: {
newIssue: s__('Boards|Create new issue'),
- listActions: s__('Boards|List actions'),
newEpic: s__('Boards|Create new epic'),
listSettings: s__('Boards|Edit list settings'),
expand: s__('Boards|Expand'),
collapse: s__('Boards|Collapse'),
},
components: {
- GlDisclosureDropdown,
GlButton,
+ GlButtonGroup,
GlLabel,
GlTooltip,
GlIcon,
@@ -194,50 +193,6 @@ export default {
canShowTotalWeight() {
return this.weightFeatureAvailable && !this.isLoading;
},
- actionListItems() {
- const items = [];
-
- if (this.isNewIssueShown) {
- const newIssueText = this.$options.i18n.newIssue;
- items.push({
- text: newIssueText,
- action: this.showNewIssueForm,
- extraAttrs: {
- 'data-testid': 'newIssueBtn',
- title: newIssueText,
- 'aria-label': newIssueText,
- },
- });
- }
-
- if (this.isNewEpicShown) {
- const newEpicText = this.$options.i18n.newEpic;
- items.push({
- text: newEpicText,
- action: this.showNewEpicForm,
- extraAttrs: {
- 'data-testid': 'newEpicBtn',
- title: newEpicText,
- 'aria-label': newEpicText,
- },
- });
- }
-
- if (this.isSettingsShown) {
- const listSettingsText = this.$options.i18n.listSettings;
- items.push({
- text: listSettingsText,
- action: this.openSidebarSettings,
- extraAttrs: {
- 'data-testid': 'settingsBtn',
- title: listSettingsText,
- 'aria-label': listSettingsText,
- },
- });
- }
-
- return items;
- },
},
apollo: {
boardList: {
@@ -525,23 +480,42 @@ export default {
<!-- EE end -->
</span>
</div>
- <gl-disclosure-dropdown
- v-if="showListHeaderActions"
- v-gl-tooltip.hover.top="{
- title: $options.i18n.listActions,
- boundary: 'viewport',
- }"
- data-testid="header-list-actions"
- class="gl-py-2 gl-ml-3"
- :aria-label="$options.i18n.listActions"
- :title="$options.i18n.listActions"
- category="tertiary"
- icon="ellipsis_v"
- :text-sr-only="true"
- :items="actionListItems"
- no-caret
- placement="right"
- />
+ <gl-button-group v-if="showListHeaderActions" class="board-list-button-group gl-pl-2">
+ <gl-button
+ v-if="isNewIssueShown"
+ ref="newIssueBtn"
+ v-gl-tooltip.hover
+ :aria-label="$options.i18n.newIssue"
+ :title="$options.i18n.newIssue"
+ size="small"
+ icon="plus"
+ data-testid="new-issue-btn"
+ @click="showNewIssueForm"
+ />
+
+ <gl-button
+ v-if="isNewEpicShown"
+ v-gl-tooltip.hover
+ :aria-label="$options.i18n.newEpic"
+ :title="$options.i18n.newEpic"
+ size="small"
+ icon="plus"
+ data-testid="new-epic-btn"
+ @click="showNewEpicForm"
+ />
+
+ <gl-button
+ v-if="isSettingsShown"
+ ref="settingsBtn"
+ v-gl-tooltip.hover
+ :aria-label="$options.i18n.listSettings"
+ size="small"
+ :title="$options.i18n.listSettings"
+ icon="settings"
+ data-testid="settings-btn"
+ @click="openSidebarSettings"
+ />
+ </gl-button-group>
</h3>
</header>
</template>
diff --git a/app/assets/javascripts/boards/components/board_new_issue.vue b/app/assets/javascripts/boards/components/board_new_issue.vue
index 8b9fafca306..b68444fb011 100644
--- a/app/assets/javascripts/boards/components/board_new_issue.vue
+++ b/app/assets/javascripts/boards/components/board_new_issue.vue
@@ -1,30 +1,73 @@
<script>
-import { mapActions, mapGetters, mapState } from 'vuex';
-import { getMilestone } from 'ee_else_ce/boards/boards_util';
+import { mapActions, mapGetters } from 'vuex';
+import { s__ } from '~/locale';
+import { getMilestone, formatIssueInput, getBoardQuery } from 'ee_else_ce/boards/boards_util';
import BoardNewIssueMixin from 'ee_else_ce/boards/mixins/board_new_issue';
import { toggleFormEventPrefix } from '../constants';
import eventHub from '../eventhub';
+import { setError } from '../graphql/cache_updates';
import BoardNewItem from './board_new_item.vue';
import ProjectSelect from './project_select.vue';
export default {
name: 'BoardNewIssue',
+ i18n: {
+ errorFetchingBoard: s__('Boards|An error occurred while fetching board. Please try again.'),
+ },
components: {
BoardNewItem,
ProjectSelect,
},
mixins: [BoardNewIssueMixin],
- inject: ['groupId', 'fullPath', 'isGroupBoard'],
+ inject: ['boardType', 'groupId', 'fullPath', 'isGroupBoard', 'isEpicBoard', 'isApolloBoard'],
props: {
list: {
type: Object,
required: true,
},
+ boardId: {
+ type: String,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ selectedProject: {},
+ board: {},
+ };
+ },
+ apollo: {
+ board: {
+ query() {
+ return getBoardQuery(this.boardType, this.isEpicBoard);
+ },
+ variables() {
+ return {
+ fullPath: this.fullPath,
+ boardId: this.boardId,
+ };
+ },
+ skip() {
+ return !this.isApolloBoard;
+ },
+ update(data) {
+ const { board } = data.workspace;
+ return {
+ ...board,
+ labels: board.labels?.nodes,
+ };
+ },
+ error(error) {
+ setError({
+ error,
+ message: this.$options.i18n.errorFetchingBoard,
+ });
+ },
+ },
},
computed: {
- ...mapState(['selectedProject']),
...mapGetters(['getBoardItemsByList']),
formEventPrefix() {
return toggleFormEventPrefix.issue;
@@ -42,8 +85,20 @@ export default {
const labels = this.list.label ? [this.list.label] : [];
const assignees = this.list.assignee ? [this.list.assignee] : [];
const milestone = getMilestone(this.list);
- const firstItemId = this.getBoardItemsByList(this.list.id)[0]?.id;
+ if (this.isApolloBoard) {
+ return this.addNewIssueToList({
+ issueInput: {
+ title,
+ labelIds: labels?.map((l) => l.id),
+ assigneeIds: assignees?.map((a) => a?.id),
+ milestoneId: milestone?.id,
+ projectPath: this.projectPath,
+ },
+ });
+ }
+
+ const firstItemId = this.getBoardItemsByList(this.list.id)[0]?.id;
return this.addListNewIssue({
list: this.list,
issueInput: {
@@ -58,6 +113,22 @@ export default {
this.cancel();
});
},
+ addNewIssueToList({ issueInput }) {
+ const { labels, assignee, milestone, weight } = this.board;
+ const config = {
+ labels,
+ assigneeId: assignee?.id || null,
+ milestoneId: milestone?.id || null,
+ weight,
+ };
+ const input = formatIssueInput(issueInput, config);
+
+ if (!this.isGroupBoard) {
+ input.projectPath = this.fullPath;
+ }
+
+ this.$emit('addNewIssue', input);
+ },
cancel() {
eventHub.$emit(`${this.formEventPrefix}${this.list.id}`);
},
@@ -74,6 +145,6 @@ export default {
@form-submit="submit"
@form-cancel="cancel"
>
- <project-select v-if="isGroupBoard" :group-id="groupId" :list="list" />
+ <project-select v-if="isGroupBoard" v-model="selectedProject" :list="list" />
</board-new-item>
</template>
diff --git a/app/assets/javascripts/boards/components/issue_board_filtered_search.vue b/app/assets/javascripts/boards/components/issue_board_filtered_search.vue
index 3c056f296e1..f60f00be368 100644
--- a/app/assets/javascripts/boards/components/issue_board_filtered_search.vue
+++ b/app/assets/javascripts/boards/components/issue_board_filtered_search.vue
@@ -75,6 +75,7 @@ export default {
type: TOKEN_TYPE_ASSIGNEE,
operators: OPERATORS_IS_NOT,
token: UserToken,
+ dataType: 'user',
unique: true,
fetchUsers,
preloadedUsers: this.preloadedUsers(),
@@ -86,6 +87,7 @@ export default {
operators: OPERATORS_IS_NOT,
symbol: '@',
token: UserToken,
+ dataType: 'user',
unique: true,
fetchUsers,
preloadedUsers: this.preloadedUsers(),
diff --git a/app/assets/javascripts/boards/components/project_select.vue b/app/assets/javascripts/boards/components/project_select.vue
index 960c8e472b8..7bbc444701a 100644
--- a/app/assets/javascripts/boards/components/project_select.vue
+++ b/app/assets/javascripts/boards/components/project_select.vue
@@ -1,11 +1,8 @@
<script>
import { GlCollapsibleListbox } from '@gitlab/ui';
-import { mapActions, mapGetters, mapState } from 'vuex';
-import { debounce } from 'lodash';
import { s__ } from '~/locale';
-import { featureAccessLevel } from '~/pages/projects/shared/permissions/constants';
-import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
-import { ListType } from '../constants';
+import groupProjectsQuery from '../graphql/group_projects.query.graphql';
+import { setError } from '../graphql/cache_updates';
export default {
name: 'ProjectSelect',
@@ -14,6 +11,9 @@ export default {
dropdownText: s__(`BoardNewIssue|Select a project`),
searchPlaceholder: s__(`BoardNewIssue|Search projects`),
emptySearchResult: s__(`BoardNewIssue|No matching results`),
+ errorFetchingProjects: s__(
+ 'Boards|An error occurred while fetching group projects. Please try again.',
+ ),
},
defaultFetchOptions: {
with_issues_enabled: true,
@@ -24,70 +24,107 @@ export default {
components: {
GlCollapsibleListbox,
},
- inject: ['groupId'],
+ inject: ['groupId', 'fullPath'],
+ model: {
+ prop: 'selectedProject',
+ event: 'selectProject',
+ },
props: {
list: {
type: Object,
required: true,
},
+ selectedProject: {
+ type: Object,
+ required: true,
+ },
},
data() {
return {
initialLoading: true,
selectedProjectId: '',
- selectedProject: {},
searchTerm: '',
+ projects: {},
+ isLoadingMore: false,
};
},
+ apollo: {
+ projects: {
+ query: groupProjectsQuery,
+ variables() {
+ return {
+ fullPath: this.fullPath,
+ search: this.searchTerm,
+ };
+ },
+ update(data) {
+ return data.group.projects;
+ },
+ error(error) {
+ setError({
+ error,
+ message: this.$options.i18n.errorFetchingProjects,
+ });
+ },
+ result() {
+ this.initialLoading = false;
+ },
+ },
+ },
computed: {
- ...mapState(['groupProjectsFlags']),
- ...mapGetters(['activeGroupProjects']),
- projects() {
- return this.activeGroupProjects.map((project) => ({
- value: project.id,
- text: project.nameWithNamespace,
- }));
+ isLoading() {
+ return this.$apollo.queries.projects.loading && !this.isLoadingMore;
+ },
+ activeGroupProjects() {
+ return (
+ this.projects?.nodes?.map((project) => ({
+ value: project.id,
+ text: project.nameWithNamespace,
+ })) || []
+ );
},
selectedProjectName() {
return this.selectedProject.name || this.$options.i18n.dropdownText;
},
- fetchOptions() {
- const additionalAttrs = {};
- if (this.list.type && this.list.type !== ListType.backlog) {
- additionalAttrs.min_access_level = featureAccessLevel.EVERYONE;
- }
-
- return {
- ...this.$options.defaultFetchOptions,
- ...additionalAttrs,
- };
- },
isFetchResultEmpty() {
return this.activeGroupProjects.length === 0;
},
hasNextPage() {
- return this.groupProjectsFlags.pageInfo?.hasNextPage;
+ return this.projects.pageInfo?.hasNextPage;
},
},
watch: {
- searchTerm: debounce(function debouncedSearch() {
- this.fetchGroupProjects({ search: this.searchTerm });
- }, DEFAULT_DEBOUNCE_AND_THROTTLE_MS),
- },
- mounted() {
- this.fetchGroupProjects({});
- this.initialLoading = false;
+ endCursor() {
+ return this.projects.pageInfo?.endCursor;
+ },
},
methods: {
- ...mapActions(['fetchGroupProjects', 'setSelectedProject']),
selectProject(projectId) {
this.selectedProjectId = projectId;
- this.selectedProject = this.activeGroupProjects.find((project) => project.id === projectId);
- this.setSelectedProject(this.selectedProject);
+ this.$emit(
+ 'selectProject',
+ this.projects.nodes.find((project) => project.id === projectId),
+ );
},
- loadMoreProjects() {
+ async loadMoreProjects() {
if (!this.hasNextPage) return;
- this.fetchGroupProjects({ search: this.searchTerm, fetchNext: true });
+ this.isLoadingMore = true;
+ try {
+ await this.$apollo.queries.projects.fetchMore({
+ variables: {
+ fullPath: this.fullPath,
+ search: this.searchTerm,
+ after: this.endCursor,
+ },
+ });
+ } catch (error) {
+ setError({
+ error,
+ message: this.$options.i18n.errorFetchingProjects,
+ });
+ } finally {
+ this.isLoadingMore = false;
+ }
},
onSearch(query) {
this.searchTerm = query;
@@ -107,14 +144,14 @@ export default {
searchable
infinite-scroll
data-testid="project-select-dropdown"
- :items="projects"
+ :items="activeGroupProjects"
:toggle-text="selectedProjectName"
:header-text="$options.i18n.headerTitle"
:loading="initialLoading"
- :searching="groupProjectsFlags.isLoading"
+ :searching="isLoading"
:search-placeholder="$options.i18n.searchPlaceholder"
:no-results-text="$options.i18n.emptySearchResult"
- :infinite-scroll-loading="groupProjectsFlags.isLoadingMore"
+ :infinite-scroll-loading="isLoadingMore"
@select="selectProject"
@search="onSearch"
@bottom-reached="loadMoreProjects"
diff --git a/app/assets/javascripts/boards/constants.js b/app/assets/javascripts/boards/constants.js
index d4d1bc7804e..cb607e5220e 100644
--- a/app/assets/javascripts/boards/constants.js
+++ b/app/assets/javascripts/boards/constants.js
@@ -1,6 +1,7 @@
import boardListsQuery from 'ee_else_ce/boards/graphql/board_lists.query.graphql';
import { TYPE_EPIC, TYPE_ISSUE, WORKSPACE_GROUP, WORKSPACE_PROJECT } from '~/issues/constants';
import { s__, __ } from '~/locale';
+import { TYPENAME_ISSUE } from '~/graphql_shared/constants';
import updateEpicSubscriptionMutation from '~/sidebar/queries/update_epic_subscription.mutation.graphql';
import updateEpicTitleMutation from '~/sidebar/queries/update_epic_title.mutation.graphql';
import createBoardListMutation from './graphql/board_list_create.mutation.graphql';
@@ -11,6 +12,7 @@ import toggleListCollapsedMutation from './graphql/client/board_toggle_collapsed
import issueSetSubscriptionMutation from './graphql/issue_set_subscription.mutation.graphql';
import issueSetTitleMutation from './graphql/issue_set_title.mutation.graphql';
import issueMoveListMutation from './graphql/issue_move_list.mutation.graphql';
+import issueCreateMutation from './graphql/issue_create.mutation.graphql';
import groupBoardQuery from './graphql/group_board.query.graphql';
import projectBoardQuery from './graphql/project_board.query.graphql';
import listIssuesQuery from './graphql/lists_issues.query.graphql';
@@ -126,6 +128,30 @@ export const listIssuablesQueries = {
[TYPE_ISSUE]: {
query: listIssuesQuery,
moveMutation: issueMoveListMutation,
+ createMutation: issueCreateMutation,
+ optimisticResponse: {
+ assignees: { nodes: [], __typename: 'UserCoreConnection' },
+ confidential: false,
+ dueDate: null,
+ emailsDisabled: false,
+ hidden: false,
+ humanTimeEstimate: null,
+ humanTotalTimeSpent: null,
+ id: 'gid://gitlab/Issue/-1',
+ iid: '-1',
+ labels: { nodes: [], __typename: 'LabelConnection' },
+ milestone: null,
+ referencePath: '',
+ relativePosition: null,
+ severity: 'UNKNOWN',
+ timeEstimate: 0,
+ title: '',
+ totalTimeSpent: 0,
+ type: 'ISSUE',
+ webUrl: '',
+ weight: null,
+ __typename: TYPENAME_ISSUE,
+ },
},
};
diff --git a/app/assets/javascripts/boards/graphql/cache_updates.js b/app/assets/javascripts/boards/graphql/cache_updates.js
index 084809e4e60..e54701a63c0 100644
--- a/app/assets/javascripts/boards/graphql/cache_updates.js
+++ b/app/assets/javascripts/boards/graphql/cache_updates.js
@@ -1,11 +1,26 @@
+import * as Sentry from '@sentry/browser';
import produce from 'immer';
+import { defaultClient } from '~/graphql_shared/issuable_client';
import listQuery from 'ee_else_ce/boards/graphql/board_lists_deferred.query.graphql';
import { listsDeferredQuery } from 'ee_else_ce/boards/constants';
-export function removeItemFromList({ query, variables, boardType, id, issuableType, cache }) {
+import setErrorMutation from './client/set_error.mutation.graphql';
+
+export function removeItemFromList({
+ query,
+ variables,
+ boardType,
+ id,
+ issuableType,
+ listId = undefined,
+ cache,
+}) {
cache.updateQuery({ query, variables }, (sourceData) =>
produce(sourceData, (draftData) => {
- const { nodes: items } = draftData[boardType].board.lists.nodes[0][`${issuableType}s`];
+ const list = listId
+ ? draftData[boardType]?.board.lists.nodes.find((l) => l.id === listId)
+ : draftData[boardType].board.lists.nodes[0];
+ const { nodes: items } = list[`${issuableType}s`];
items.splice(
items.findIndex((item) => item.id === id),
1,
@@ -21,11 +36,15 @@ export function addItemToList({
issuable,
newIndex,
issuableType,
+ listId = undefined,
cache,
}) {
cache.updateQuery({ query, variables }, (sourceData) =>
produce(sourceData, (draftData) => {
- const { nodes: items } = draftData[boardType].board.lists.nodes[0][`${issuableType}s`];
+ const list = listId
+ ? draftData[boardType]?.board.lists.nodes.find((l) => l.id === listId)
+ : draftData[boardType].board.lists.nodes[0];
+ const { nodes: items } = list[`${issuableType}s`];
items.splice(newIndex, 0, issuable);
}),
);
@@ -116,3 +135,16 @@ export function updateEpicsCount({
}),
);
}
+
+export function setError({ message, error, captureError = true }) {
+ defaultClient.mutate({
+ mutation: setErrorMutation,
+ variables: {
+ error: message,
+ },
+ });
+
+ if (captureError) {
+ Sentry.captureException(error);
+ }
+}
diff --git a/app/assets/javascripts/boards/graphql/client/error.query.graphql b/app/assets/javascripts/boards/graphql/client/error.query.graphql
new file mode 100644
index 00000000000..56f2588f3b9
--- /dev/null
+++ b/app/assets/javascripts/boards/graphql/client/error.query.graphql
@@ -0,0 +1,3 @@
+query boardsAppError {
+ boardsAppError @client
+}
diff --git a/app/assets/javascripts/boards/graphql/client/set_error.mutation.graphql b/app/assets/javascripts/boards/graphql/client/set_error.mutation.graphql
new file mode 100644
index 00000000000..56fc592d21b
--- /dev/null
+++ b/app/assets/javascripts/boards/graphql/client/set_error.mutation.graphql
@@ -0,0 +1,3 @@
+mutation setError($error: String!) {
+ setError(error: $error) @client
+}
diff --git a/app/assets/javascripts/boards/graphql/issue_create.mutation.graphql b/app/assets/javascripts/boards/graphql/issue_create.mutation.graphql
index 643d5dcfe4c..55cb34c0930 100644
--- a/app/assets/javascripts/boards/graphql/issue_create.mutation.graphql
+++ b/app/assets/javascripts/boards/graphql/issue_create.mutation.graphql
@@ -1,8 +1,8 @@
#import "ee_else_ce/boards/graphql/issue.fragment.graphql"
mutation CreateIssue($input: CreateIssueInput!) {
- createIssue(input: $input) {
- issue {
+ createIssuable: createIssue(input: $input) {
+ issuable: issue {
...Issue
}
errors
diff --git a/app/assets/javascripts/boards/stores/actions.js b/app/assets/javascripts/boards/stores/actions.js
index d96d92948be..e044283534a 100644
--- a/app/assets/javascripts/boards/stores/actions.js
+++ b/app/assets/javascripts/boards/stores/actions.js
@@ -743,11 +743,11 @@ export default {
},
})
.then(({ data }) => {
- if (data.createIssue.errors.length) {
+ if (data.createIssuable.errors.length) {
throw new Error();
}
- const rawIssue = data.createIssue?.issue;
+ const rawIssue = data.createIssuable?.issuable;
const formattedIssue = formatIssue(rawIssue);
dispatch('removeListItem', { listId: list.id, itemId: placeholderId });
dispatch('addListItem', { list, item: formattedIssue, position: 0 });
diff --git a/app/assets/javascripts/branches/components/delete_merged_branches.vue b/app/assets/javascripts/branches/components/delete_merged_branches.vue
index 117c15be907..50fe610d335 100644
--- a/app/assets/javascripts/branches/components/delete_merged_branches.vue
+++ b/app/assets/javascripts/branches/components/delete_merged_branches.vue
@@ -69,7 +69,7 @@ export default {
this.openModal();
},
extraAttrs: {
- 'data-qa-selector': 'delete_merged_branches_button',
+ 'data-testid': 'delete-merged-branches-button',
class: 'gl-text-red-500!',
},
},
@@ -102,12 +102,11 @@ export default {
category="tertiary"
no-caret
placement="right"
- data-qa-selector="delete_merged_branches_dropdown_button"
class="gl-display-none gl-md-display-block!"
:items="dropdownItems"
/>
<gl-button
- data-qa-selector="delete_merged_branches_button"
+ data-testid="delete-merged-branches-button"
category="secondary"
variant="danger"
class="gl-display-block gl-md-display-none!"
@@ -153,7 +152,6 @@ export default {
</gl-sprintf>
<gl-form-input
v-model="enteredText"
- data-qa-selector="delete_merged_branches_input"
type="text"
size="sm"
class="gl-mt-2"
@@ -178,7 +176,6 @@ export default {
ref="deleteMergedBrancesButton"
:disabled="isDeleteButtonDisabled"
variant="danger"
- data-qa-selector="delete_merged_branches_confirmation_button"
data-testid="delete-merged-branches-confirmation-button"
@click="submitForm"
>{{ $options.i18n.deleteButtonText }}</gl-button
diff --git a/app/assets/javascripts/ci/ci_variable_list/components/ci_environments_dropdown.vue b/app/assets/javascripts/ci/ci_variable_list/components/ci_environments_dropdown.vue
index 09b02068388..a25f871ac92 100644
--- a/app/assets/javascripts/ci/ci_variable_list/components/ci_environments_dropdown.vue
+++ b/app/assets/javascripts/ci/ci_variable_list/components/ci_environments_dropdown.vue
@@ -24,6 +24,10 @@ export default {
type: Array,
required: true,
},
+ hasEnvScopeQuery: {
+ type: Boolean,
+ required: true,
+ },
selectedEnvironmentScope: {
type: String,
required: false,
@@ -32,6 +36,7 @@ export default {
},
data() {
return {
+ isDropdownShown: false,
selectedEnvironment: '',
searchTerm: '',
};
@@ -46,17 +51,20 @@ export default {
return environment.toLowerCase().includes(lowerCasedSearchTerm);
});
},
- isEnvScopeLimited() {
- return this.glFeatures?.ciLimitEnvironmentScope;
+ isDropdownLoading() {
+ return this.areEnvironmentsLoading && this.hasEnvScopeQuery && !this.isDropdownShown;
+ },
+ isDropdownSearching() {
+ return this.areEnvironmentsLoading && this.hasEnvScopeQuery && this.isDropdownShown;
},
searchedEnvironments() {
- // If FF is enabled, search query will be fired so this component will already
- // receive filtered environments during the refetch.
- // If FF is disabled, search the existing list of environments in the frontend
- let filtered = this.isEnvScopeLimited ? this.environments : this.filteredEnvironments;
+ // If hasEnvScopeQuery (applies only to projects for now), search query will be fired so this
+ // component will already receive filtered environments during the refetch.
+ // Otherwise (applies to groups), search the existing list of environments in the frontend
+ let filtered = this.hasEnvScopeQuery ? this.environments : this.filteredEnvironments;
// If there is no search term, make sure to include *
- if (this.isEnvScopeLimited && !this.searchTerm) {
+ if (this.hasEnvScopeQuery && !this.searchTerm) {
filtered = uniq([...filtered, '*']);
}
@@ -65,15 +73,12 @@ export default {
text: environment,
}));
},
- shouldShowSearchLoading() {
- return this.areEnvironmentsLoading && this.isEnvScopeLimited;
- },
shouldRenderCreateButton() {
return this.searchTerm && !this.environments.includes(this.searchTerm);
},
shouldRenderDivider() {
return (
- (this.isEnvScopeLimited || this.shouldRenderCreateButton) && !this.shouldShowSearchLoading
+ (this.hasEnvScopeQuery || this.shouldRenderCreateButton) && !this.areEnvironmentsLoading
);
},
environmentScopeLabel() {
@@ -84,7 +89,7 @@ export default {
debouncedSearch: debounce(function debouncedSearch(searchTerm) {
const newSearchTerm = searchTerm.trim();
this.searchTerm = newSearchTerm;
- if (this.isEnvScopeLimited) {
+ if (this.hasEnvScopeQuery) {
this.$emit('search-environment-scope', newSearchTerm);
}
}, 500),
@@ -96,6 +101,9 @@ export default {
this.$emit('create-environment-scope', this.searchTerm);
this.selectEnvironment(this.searchTerm);
},
+ toggleDropdownShown(isShown) {
+ this.isDropdownShown = isShown;
+ },
},
ENVIRONMENT_QUERY_LIMIT,
i18n: {
@@ -111,14 +119,17 @@ export default {
block
searchable
:items="searchedEnvironments"
- :searching="shouldShowSearchLoading"
+ :loading="isDropdownLoading"
+ :searching="isDropdownSearching"
:toggle-text="environmentScopeLabel"
@search="debouncedSearch"
@select="selectEnvironment"
+ @shown="toggleDropdownShown(true)"
+ @hidden="toggleDropdownShown(false)"
>
<template #footer>
<gl-dropdown-divider v-if="shouldRenderDivider" />
- <div v-if="isEnvScopeLimited" data-testid="max-envs-notice">
+ <div v-if="hasEnvScopeQuery" data-testid="max-envs-notice">
<gl-dropdown-item class="gl-list-style-none" disabled>
<gl-sprintf :message="$options.i18n.maxEnvsNote" class="gl-font-sm">
<template #limit>
diff --git a/app/assets/javascripts/ci/ci_variable_list/components/ci_group_variables.vue b/app/assets/javascripts/ci/ci_variable_list/components/ci_group_variables.vue
index 9c79adffdae..2045b127a82 100644
--- a/app/assets/javascripts/ci/ci_variable_list/components/ci_group_variables.vue
+++ b/app/assets/javascripts/ci/ci_variable_list/components/ci_group_variables.vue
@@ -3,6 +3,7 @@ import { TYPENAME_GROUP } from '~/graphql_shared/constants';
import { convertToGraphQLId } from '~/graphql_shared/utils';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import { ADD_MUTATION_ACTION, DELETE_MUTATION_ACTION, UPDATE_MUTATION_ACTION } from '../constants';
+import getGroupEnvironments from '../graphql/queries/group_environments.query.graphql';
import getGroupVariables from '../graphql/queries/group_variables.query.graphql';
import addGroupVariable from '../graphql/mutations/group_add_variable.mutation.graphql';
import deleteGroupVariable from '../graphql/mutations/group_delete_variable.mutation.graphql';
@@ -22,6 +23,15 @@ export default {
graphqlId() {
return convertToGraphQLId(TYPENAME_GROUP, this.groupId);
},
+ queriesAvailable() {
+ if (this.glFeatures.ciGroupEnvScopeGraphql) {
+ return this.$options.queryData;
+ }
+
+ return {
+ ciVariables: this.$options.queryData.ciVariables,
+ };
+ },
},
mutationData: {
[ADD_MUTATION_ACTION]: addGroupVariable,
@@ -33,6 +43,10 @@ export default {
lookup: (data) => data?.group?.ciVariables,
query: getGroupVariables,
},
+ environments: {
+ lookup: (data) => data?.group?.environmentScopes,
+ query: getGroupEnvironments,
+ },
},
};
</script>
@@ -45,6 +59,6 @@ export default {
entity="group"
:full-path="groupPath"
:mutation-data="$options.mutationData"
- :query-data="$options.queryData"
+ :query-data="queriesAvailable"
/>
</template>
diff --git a/app/assets/javascripts/ci/ci_variable_list/components/ci_variable_modal.vue b/app/assets/javascripts/ci/ci_variable_list/components/ci_variable_modal.vue
index 41514d2d2f1..3af48635f3f 100644
--- a/app/assets/javascripts/ci/ci_variable_list/components/ci_variable_modal.vue
+++ b/app/assets/javascripts/ci/ci_variable_list/components/ci_variable_modal.vue
@@ -93,6 +93,10 @@ export default {
required: false,
default: false,
},
+ hasEnvScopeQuery: {
+ type: Boolean,
+ required: true,
+ },
mode: {
type: String,
required: true,
@@ -147,7 +151,7 @@ export default {
return !this.isTipDismissed && AWS_TOKEN_CONSTANTS.includes(this.variable.key);
},
environmentsList() {
- if (this.glFeatures?.ciLimitEnvironmentScope) {
+ if (this.hasEnvScopeQuery) {
return this.environments;
}
@@ -385,6 +389,7 @@ export default {
<ci-environments-dropdown
v-if="areScopedVariablesAvailable"
:are-environments-loading="areEnvironmentsLoading"
+ :has-env-scope-query="hasEnvScopeQuery"
:selected-environment-scope="variable.environmentScope"
:environments="environmentsList"
@select-environment="setEnvironmentScope"
diff --git a/app/assets/javascripts/ci/ci_variable_list/components/ci_variable_settings.vue b/app/assets/javascripts/ci/ci_variable_list/components/ci_variable_settings.vue
index 26e20c690bc..b8a95f9081a 100644
--- a/app/assets/javascripts/ci/ci_variable_list/components/ci_variable_settings.vue
+++ b/app/assets/javascripts/ci/ci_variable_list/components/ci_variable_settings.vue
@@ -33,6 +33,10 @@ export default {
required: false,
default: false,
},
+ hasEnvScopeQuery: {
+ type: Boolean,
+ required: true,
+ },
isLoading: {
type: Boolean,
required: false,
@@ -107,6 +111,7 @@ export default {
:are-environments-loading="areEnvironmentsLoading"
:are-scoped-variables-available="areScopedVariablesAvailable"
:environments="environments"
+ :has-env-scope-query="hasEnvScopeQuery"
:hide-environment-scope="hideEnvironmentScope"
:variables="variables"
:mode="mode"
diff --git a/app/assets/javascripts/ci/ci_variable_list/components/ci_variable_shared.vue b/app/assets/javascripts/ci/ci_variable_list/components/ci_variable_shared.vue
index ee2c0a771cf..9786f25ed87 100644
--- a/app/assets/javascripts/ci/ci_variable_list/components/ci_variable_shared.vue
+++ b/app/assets/javascripts/ci/ci_variable_list/components/ci_variable_shared.vue
@@ -159,12 +159,13 @@ export default {
return this.queryData?.environments?.query || {};
},
skip() {
- return !this.queryData?.environments?.query;
+ return !this.hasEnvScopeQuery;
},
variables() {
return {
+ first: ENVIRONMENT_QUERY_LIMIT,
fullPath: this.fullPath,
- ...this.environmentQueryVariables,
+ search: '',
};
},
update(data) {
@@ -179,23 +180,12 @@ export default {
areEnvironmentsLoading() {
return this.$apollo.queries.environments.loading;
},
- environmentQueryVariables() {
- if (this.glFeatures?.ciLimitEnvironmentScope) {
- return {
- first: ENVIRONMENT_QUERY_LIMIT,
- search: '',
- };
- }
-
- return {};
+ hasEnvScopeQuery() {
+ return Boolean(this.queryData?.environments?.query);
},
isLoading() {
- // TODO: Remove areEnvironmentsLoading and show loading icon in dropdown when
- // environment query is loading and FF is enabled
- // https://gitlab.com/gitlab-org/gitlab/-/issues/396990
return (
(this.$apollo.queries.ciVariables.loading && this.isInitialLoading) ||
- this.areEnvironmentsLoading ||
this.isLoadingMoreItems
);
},
@@ -248,9 +238,7 @@ export default {
this.variableMutation(UPDATE_MUTATION_ACTION, variable);
},
async searchEnvironmentScope(searchTerm) {
- if (this.glFeatures?.ciLimitEnvironmentScope) {
- this.$apollo.queries.environments.refetch({ search: searchTerm });
- }
+ this.$apollo.queries.environments.refetch({ search: searchTerm });
},
async variableMutation(mutationAction, variable) {
try {
@@ -296,6 +284,7 @@ export default {
:are-scoped-variables-available="areScopedVariablesAvailable"
:entity="entity"
:environments="environments"
+ :has-env-scope-query="hasEnvScopeQuery"
:hide-environment-scope="hideEnvironmentScope"
:is-loading="isLoading"
:max-variable-limit="maxVariableLimit"
diff --git a/app/assets/javascripts/ci/ci_variable_list/graphql/queries/group_environments.query.graphql b/app/assets/javascripts/ci/ci_variable_list/graphql/queries/group_environments.query.graphql
new file mode 100644
index 00000000000..5768d370474
--- /dev/null
+++ b/app/assets/javascripts/ci/ci_variable_list/graphql/queries/group_environments.query.graphql
@@ -0,0 +1,10 @@
+query getGroupEnvironments($fullPath: ID!, $first: Int, $search: String) {
+ group(fullPath: $fullPath) {
+ id
+ environmentScopes(first: $first, search: $search) {
+ nodes {
+ name
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/ci/pipeline_editor/components/drawer/cards/first_pipeline_card.vue b/app/assets/javascripts/ci/pipeline_editor/components/drawer/cards/first_pipeline_card.vue
index 0b57433e894..8d670cb5389 100644
--- a/app/assets/javascripts/ci/pipeline_editor/components/drawer/cards/first_pipeline_card.vue
+++ b/app/assets/javascripts/ci/pipeline_editor/components/drawer/cards/first_pipeline_card.vue
@@ -2,6 +2,7 @@
import { GlLink, GlSprintf } from '@gitlab/ui';
import { s__ } from '~/locale';
import Tracking from '~/tracking';
+import { DOCS_URL } from 'jh_else_ce/lib/utils/url_utility';
import { pipelineEditorTrackingOptions } from '../../../constants';
export default {
@@ -34,7 +35,7 @@ export default {
this.track(actions.helpDrawerLinks.runners, { label });
},
},
- RUNNER_HELP_URL: 'https://docs.gitlab.com/runner/register/index.html',
+ RUNNER_HELP_URL: `${DOCS_URL}/runner/register/index.html`,
};
</script>
<template>
diff --git a/app/assets/javascripts/ci/pipeline_editor/components/job_assistant_drawer/accordion_items/artifacts_and_cache_item.vue b/app/assets/javascripts/ci/pipeline_editor/components/job_assistant_drawer/accordion_items/artifacts_and_cache_item.vue
index 794763e0cd8..76db9613dc1 100644
--- a/app/assets/javascripts/ci/pipeline_editor/components/job_assistant_drawer/accordion_items/artifacts_and_cache_item.vue
+++ b/app/assets/javascripts/ci/pipeline_editor/components/job_assistant_drawer/accordion_items/artifacts_and_cache_item.vue
@@ -26,7 +26,7 @@ export default {
return [
{
key: 'artifacts.paths',
- title: i18n.ARTIFACTS_AND_CACHE,
+ title: i18n.ARTIFACTS_PATHS,
paths: this.job.artifacts.paths,
generateInputDataTestId: (index) => `artifacts-paths-input-${index}`,
generateDeleteButtonDataTestId: (index) => `delete-artifacts-paths-button-${index}`,
diff --git a/app/assets/javascripts/ci/pipeline_editor/components/job_assistant_drawer/accordion_items/rules_item.vue b/app/assets/javascripts/ci/pipeline_editor/components/job_assistant_drawer/accordion_items/rules_item.vue
index d0f206e767f..460f508ee74 100644
--- a/app/assets/javascripts/ci/pipeline_editor/components/job_assistant_drawer/accordion_items/rules_item.vue
+++ b/app/assets/javascripts/ci/pipeline_editor/components/job_assistant_drawer/accordion_items/rules_item.vue
@@ -54,6 +54,13 @@ export default {
`${this.startInNumber} ${this.startInUnit}${plural}`,
);
},
+ updateWhen(when) {
+ this.$emit('update-job', 'rules[0].when', when);
+
+ if (when === JOB_RULES_WHEN.delayed.value) {
+ this.updateStartIn();
+ }
+ },
},
};
</script>
@@ -73,7 +80,7 @@ export default {
:options="$options.whenOptions"
data-testid="rules-when-select"
:value="job.rules[0].when"
- @input="$emit('update-job', 'rules[0].when', $event)"
+ @input="updateWhen"
/>
</gl-form-group>
<gl-form-group
diff --git a/app/assets/javascripts/ci/pipeline_schedules/components/pipeline_schedules.vue b/app/assets/javascripts/ci/pipeline_schedules/components/pipeline_schedules.vue
index 6695c6179cf..0700d9e5439 100644
--- a/app/assets/javascripts/ci/pipeline_schedules/components/pipeline_schedules.vue
+++ b/app/assets/javascripts/ci/pipeline_schedules/components/pipeline_schedules.vue
@@ -16,6 +16,7 @@ import deletePipelineScheduleMutation from '../graphql/mutations/delete_pipeline
import playPipelineScheduleMutation from '../graphql/mutations/play_pipeline_schedule.mutation.graphql';
import takeOwnershipMutation from '../graphql/mutations/take_ownership.mutation.graphql';
import getPipelineSchedulesQuery from '../graphql/queries/get_pipeline_schedules.query.graphql';
+import { ALL_SCOPE } from '../constants';
import PipelineSchedulesTable from './table/pipeline_schedules_table.vue';
import TakeOwnershipModal from './take_ownership_modal.vue';
import DeletePipelineScheduleModal from './delete_pipeline_schedule_modal.vue';
@@ -58,6 +59,9 @@ export default {
pipelinesPath: {
default: '',
},
+ newSchedulePath: {
+ default: '',
+ },
},
apollo: {
schedules: {
@@ -65,7 +69,9 @@ export default {
variables() {
return {
projectPath: this.fullPath,
- status: this.scope,
+ // we need to ensure we send null to the API when
+ // the scope is 'ALL'
+ status: this.scope === ALL_SCOPE ? null : this.scope,
};
},
update(data) {
@@ -111,7 +117,7 @@ export default {
{
text: s__('PipelineSchedules|All'),
count: limitedCounterWithDelimiter(this.count),
- scope: null,
+ scope: ALL_SCOPE,
showBadge: true,
attrs: { 'data-testid': 'pipeline-schedules-all-tab' },
},
@@ -134,7 +140,7 @@ export default {
// this watcher ensures that the count on the all tab
// is not updated when switching to other tabs
schedulesCount(newCount) {
- if (!this.scope) {
+ if (!this.scope || this.scope === ALL_SCOPE) {
this.count = newCount;
}
},
@@ -253,10 +259,10 @@ export default {
</gl-alert>
<gl-tabs
- v-if="isLoading || count > 0"
+ v-if="isLoading || schedulesCount > 0"
sync-active-tab-with-query-params
query-param-name="scope"
- nav-class="gl-flex-grow-1 gl-align-items-center"
+ nav-class="gl-flex-grow-1 gl-align-items-center gl-mt-2"
>
<gl-tab
v-for="tab in tabs"
@@ -289,13 +295,18 @@ export default {
</gl-tab>
<template #tabs-end>
- <gl-button variant="confirm" class="gl-ml-auto" data-testid="new-schedule-button">
+ <gl-button
+ :href="newSchedulePath"
+ variant="confirm"
+ class="gl-ml-auto"
+ data-testid="new-schedule-button"
+ >
{{ $options.i18n.newSchedule }}
</gl-button>
</template>
</gl-tabs>
- <pipeline-schedule-empty-state v-else-if="!isLoading && count === 0" />
+ <pipeline-schedule-empty-state v-else-if="!isLoading && schedulesCount === 0" />
<take-ownership-modal
:visible="showTakeOwnershipModal"
diff --git a/app/assets/javascripts/ci/pipeline_schedules/components/pipeline_schedules_empty_state.vue b/app/assets/javascripts/ci/pipeline_schedules/components/pipeline_schedules_empty_state.vue
index 39ac55bb9c5..fbdb60f61f1 100644
--- a/app/assets/javascripts/ci/pipeline_schedules/components/pipeline_schedules_empty_state.vue
+++ b/app/assets/javascripts/ci/pipeline_schedules/components/pipeline_schedules_empty_state.vue
@@ -1,5 +1,5 @@
<script>
-import scheduleSvg from '@gitlab/svgs/dist/illustrations/schedule-md.svg?raw';
+import SCHEDULE_MD_SVG_URL from '@gitlab/svgs/dist/illustrations/schedule-md.svg?url';
import { GlEmptyState, GlLink, GlSprintf } from '@gitlab/ui';
import { helpPagePath } from '~/helpers/help_page_helper';
import { s__ } from '~/locale';
@@ -20,15 +20,18 @@ export default {
],
createNew: s__('PipelineSchedules|Create a new pipeline schedule'),
},
+ SCHEDULE_MD_SVG_URL,
components: {
GlEmptyState,
GlLink,
GlSprintf,
},
- computed: {
- scheduleSvgPath() {
- return `data:image/svg+xml;utf8,${encodeURIComponent(scheduleSvg)}`;
+ inject: {
+ newSchedulePath: {
+ default: '',
},
+ },
+ computed: {
schedulesHelpPath() {
return helpPagePath('ci/pipelines/schedules');
},
@@ -37,9 +40,9 @@ export default {
</script>
<template>
<gl-empty-state
- :svg-path="scheduleSvgPath"
+ :svg-path="$options.SCHEDULE_MD_SVG_URL"
:primary-button-text="$options.i18n.createNew"
- primary-button-link="#"
+ :primary-button-link="newSchedulePath"
>
<template #title>
<h3>
diff --git a/app/assets/javascripts/ci/pipeline_schedules/components/pipeline_schedules_form.vue b/app/assets/javascripts/ci/pipeline_schedules/components/pipeline_schedules_form.vue
index 367b1812a27..d84a9a4a4b5 100644
--- a/app/assets/javascripts/ci/pipeline_schedules/components/pipeline_schedules_form.vue
+++ b/app/assets/javascripts/ci/pipeline_schedules/components/pipeline_schedules_form.vue
@@ -8,18 +8,22 @@ import {
GlFormGroup,
GlFormInput,
GlFormTextarea,
- GlLink,
- GlSprintf,
+ GlLoadingIcon,
} from '@gitlab/ui';
-import { uniqueId } from 'lodash';
-import Vue from 'vue';
import { __, s__ } from '~/locale';
+import { createAlert } from '~/alert';
+import { visitUrl, queryToObject } from '~/lib/utils/url_utility';
import { REF_TYPE_BRANCHES, REF_TYPE_TAGS } from '~/ref/constants';
import RefSelector from '~/ref/components/ref_selector.vue';
import TimezoneDropdown from '~/vue_shared/components/timezone_dropdown/timezone_dropdown.vue';
import IntervalPatternInput from '~/pages/projects/pipeline_schedules/shared/components/interval_pattern_input.vue';
+import createPipelineScheduleMutation from '../graphql/mutations/create_pipeline_schedule.mutation.graphql';
+import updatePipelineScheduleMutation from '../graphql/mutations/update_pipeline_schedule.mutation.graphql';
+import getPipelineSchedulesQuery from '../graphql/queries/get_pipeline_schedules.query.graphql';
import { VARIABLE_TYPE, FILE_TYPE } from '../constants';
+const scheduleId = queryToObject(window.location.search).id;
+
export default {
components: {
GlButton,
@@ -30,21 +34,12 @@ export default {
GlFormGroup,
GlFormInput,
GlFormTextarea,
- GlLink,
- GlSprintf,
+ GlLoadingIcon,
RefSelector,
TimezoneDropdown,
IntervalPatternInput,
},
- inject: [
- 'fullPath',
- 'projectId',
- 'defaultBranch',
- 'cron',
- 'cronTimezone',
- 'dailyLimit',
- 'settingsLink',
- ],
+ inject: ['fullPath', 'projectId', 'defaultBranch', 'dailyLimit', 'settingsLink', 'schedulesPath'],
props: {
timezoneData: {
type: Array,
@@ -55,34 +50,79 @@ export default {
required: false,
default: '',
},
+ editing: {
+ type: Boolean,
+ required: true,
+ },
+ },
+ apollo: {
+ schedule: {
+ query: getPipelineSchedulesQuery,
+ variables() {
+ return {
+ projectPath: this.fullPath,
+ ids: scheduleId,
+ };
+ },
+ update(data) {
+ return data.project?.pipelineSchedules?.nodes[0] || {};
+ },
+ result({ data }) {
+ if (data) {
+ const {
+ project: {
+ pipelineSchedules: { nodes },
+ },
+ } = data;
+
+ const schedule = nodes[0];
+ const variables = schedule.variables?.nodes || [];
+
+ this.description = schedule.description;
+ this.cron = schedule.cron;
+ this.cronTimezone = schedule.cronTimezone;
+ this.scheduleRef = schedule.ref;
+ this.variables = variables.map((variable) => {
+ return {
+ id: variable.id,
+ variableType: variable.variableType,
+ key: variable.key,
+ value: variable.value,
+ destroy: false,
+ };
+ });
+ this.addEmptyVariable();
+ this.activated = schedule.active;
+ }
+ },
+ skip() {
+ return !this.editing;
+ },
+ error() {
+ createAlert({ message: this.$options.i18n.scheduleFetchError });
+ },
+ },
},
data() {
return {
- refValue: {
- shortName: this.refParam,
- // this is needed until we add support for ref type in url query strings
- // ensure default branch is called with full ref on load
- // https://gitlab.com/gitlab-org/gitlab/-/issues/287815
- fullName: this.refParam === this.defaultBranch ? `refs/heads/${this.refParam}` : undefined,
- },
+ cron: '',
description: '',
scheduleRef: this.defaultBranch,
activated: true,
- timezone: this.cronTimezone,
- formCiVariables: {},
- // TODO: Add the GraphQL query to help populate the predefined variables
- // app/assets/javascripts/ci/pipeline_new/components/pipeline_new_form.vue#131
- predefinedValueOptions: {},
+ cronTimezone: '',
+ variables: [],
+ schedule: {},
};
},
i18n: {
activated: __('Activated'),
- cronTimezone: s__('PipelineSchedules|Cron timezone'),
+ cronTimezoneText: s__('PipelineSchedules|Cron timezone'),
description: s__('PipelineSchedules|Description'),
shortDescriptionPipeline: s__(
'PipelineSchedules|Provide a short description for this pipeline',
),
- savePipelineSchedule: s__('PipelineSchedules|Save pipeline schedule'),
+ editScheduleBtnText: s__('PipelineSchedules|Edit pipeline schedule'),
+ createScheduleBtnText: s__('PipelineSchedules|Create pipeline schedule'),
cancel: __('Cancel'),
targetBranchTag: __('Select target branch or tag'),
intervalPattern: s__('PipelineSchedules|Interval Pattern'),
@@ -91,6 +131,15 @@ export default {
),
removeVariableLabel: s__('CiVariables|Remove variable'),
variables: s__('Pipeline|Variables'),
+ scheduleCreateError: s__(
+ 'PipelineSchedules|An error occurred while creating the pipeline schedule.',
+ ),
+ scheduleUpdateError: s__(
+ 'PipelineSchedules|An error occurred while updating the pipeline schedule.',
+ ),
+ scheduleFetchError: s__(
+ 'PipelineSchedules|An error occurred while trying to fetch the pipeline schedule.',
+ ),
},
typeOptions: {
[VARIABLE_TYPE]: __('Variable'),
@@ -103,15 +152,6 @@ export default {
dropdownHeader: this.$options.i18n.targetBranchTag,
};
},
- refFullName() {
- return this.refValue.fullName;
- },
- variables() {
- return this.formCiVariables[this.refFullName]?.variables ?? [];
- },
- descriptions() {
- return this.formCiVariables[this.refFullName]?.descriptions ?? {};
- },
typeOptionsListbox() {
return [
{
@@ -127,52 +167,136 @@ export default {
getEnabledRefTypes() {
return [REF_TYPE_BRANCHES, REF_TYPE_TAGS];
},
+ preparedVariablesUpdate() {
+ return this.variables.filter((variable) => variable.key !== '');
+ },
+ preparedVariablesCreate() {
+ return this.preparedVariablesUpdate.map((variable) => {
+ return {
+ key: variable.key,
+ value: variable.value,
+ variableType: variable.variableType,
+ };
+ });
+ },
+ loading() {
+ return this.$apollo.queries.schedule.loading;
+ },
+ buttonText() {
+ return this.editing
+ ? this.$options.i18n.editScheduleBtnText
+ : this.$options.i18n.createScheduleBtnText;
+ },
},
created() {
- Vue.set(this.formCiVariables, this.refFullName, {
- variables: [],
- descriptions: {},
- });
-
- this.addEmptyVariable(this.refFullName);
+ this.addEmptyVariable();
},
methods: {
- addEmptyVariable(refValue) {
- const { variables } = this.formCiVariables[refValue];
+ addEmptyVariable() {
+ const lastVar = this.variables[this.variables.length - 1];
- const lastVar = variables[variables.length - 1];
if (lastVar?.key === '' && lastVar?.value === '') {
return;
}
- variables.push({
- uniqueId: uniqueId(`var-${refValue}`),
- variable_type: VARIABLE_TYPE,
+ this.variables.push({
+ variableType: VARIABLE_TYPE,
key: '',
value: '',
+ destroy: false,
});
},
setVariableAttribute(key, attribute, value) {
- const { variables } = this.formCiVariables[this.refFullName];
- const variable = variables.find((v) => v.key === key);
+ const variable = this.variables.find((v) => v.key === key);
variable[attribute] = value;
},
- shouldShowValuesDropdown(key) {
- return this.predefinedValueOptions[key]?.length > 1;
- },
removeVariable(index) {
- this.variables.splice(index, 1);
+ this.variables[index].destroy = true;
},
canRemove(index) {
return index < this.variables.length - 1;
},
+ async createPipelineSchedule() {
+ try {
+ const {
+ data: {
+ pipelineScheduleCreate: { errors },
+ },
+ } = await this.$apollo.mutate({
+ mutation: createPipelineScheduleMutation,
+ variables: {
+ input: {
+ description: this.description,
+ cron: this.cron,
+ cronTimezone: this.cronTimezone,
+ ref: this.scheduleRef,
+ variables: this.preparedVariablesCreate,
+ active: this.activated,
+ projectPath: this.fullPath,
+ },
+ },
+ });
+
+ if (errors.length > 0) {
+ createAlert({ message: errors[0] });
+ } else {
+ visitUrl(this.schedulesPath);
+ }
+ } catch {
+ createAlert({ message: this.$options.i18n.scheduleCreateError });
+ }
+ },
+ async updatePipelineSchedule() {
+ try {
+ const {
+ data: {
+ pipelineScheduleUpdate: { errors },
+ },
+ } = await this.$apollo.mutate({
+ mutation: updatePipelineScheduleMutation,
+ variables: {
+ input: {
+ id: this.schedule.id,
+ description: this.description,
+ cron: this.cron,
+ cronTimezone: this.cronTimezone,
+ ref: this.scheduleRef,
+ variables: this.preparedVariablesUpdate,
+ active: this.activated,
+ },
+ },
+ });
+
+ if (errors.length > 0) {
+ createAlert({ message: errors[0] });
+ } else {
+ visitUrl(this.schedulesPath);
+ }
+ } catch {
+ createAlert({ message: this.$options.i18n.scheduleUpdateError });
+ }
+ },
+ scheduleHandler() {
+ if (this.editing) {
+ this.updatePipelineSchedule();
+ } else {
+ this.createPipelineSchedule();
+ }
+ },
+ setCronValue(cron) {
+ this.cron = cron;
+ },
+ setTimezone(timezone) {
+ this.cronTimezone = timezone.identifier || '';
+ },
},
};
</script>
<template>
- <div class="col-lg-8">
- <gl-form>
+ <div class="col-lg-8 gl-pl-0">
+ <gl-loading-icon v-if="loading && editing" size="lg" />
+ <gl-form v-else>
<!--Description-->
<gl-form-group :label="$options.i18n.description" label-for="schedule-description">
<gl-form-input
@@ -181,6 +305,7 @@ export default {
type="text"
:placeholder="$options.i18n.shortDescriptionPipeline"
data-testid="schedule-description"
+ required
/>
</gl-form-group>
<!--Interval Pattern-->
@@ -190,21 +315,24 @@ export default {
:initial-cron-interval="cron"
:daily-limit="dailyLimit"
:send-native-errors="false"
+ @cronValue="setCronValue"
/>
</gl-form-group>
<!--Timezone-->
- <gl-form-group :label="$options.i18n.cronTimezone" label-for="schedule-timezone">
+ <gl-form-group :label="$options.i18n.cronTimezoneText" label-for="schedule-timezone">
<timezone-dropdown
id="schedule-timezone"
- :value="timezone"
+ :value="cronTimezone"
:timezone-data="timezoneData"
name="schedule-timezone"
+ @input="setTimezone"
/>
</gl-form-group>
<!--Branch/Tag Selector-->
<gl-form-group :label="$options.i18n.targetBranchTag" label-for="schedule-target-branch-tag">
<ref-selector
id="schedule-target-branch-tag"
+ v-model="scheduleRef"
:enabled-ref-types="getEnabledRefTypes"
:project-id="projectId"
:value="scheduleRef"
@@ -217,23 +345,23 @@ export default {
<gl-form-group :label="$options.i18n.variables">
<div
v-for="(variable, index) in variables"
- :key="variable.uniqueId"
- class="gl-mb-3 gl-pb-2"
- data-testid="ci-variable-row"
+ :key="`var-${index}`"
data-qa-selector="ci_variable_row_container"
>
<div
- class="gl-display-flex gl-align-items-stretch gl-flex-direction-column gl-md-flex-direction-row"
+ v-if="!variable.destroy"
+ class="gl-display-flex gl-align-items-stretch gl-flex-direction-column gl-md-flex-direction-row gl-mb-3 gl-pb-2"
+ data-testid="ci-variable-row"
>
<gl-dropdown
- :text="$options.typeOptions[variable.variable_type]"
+ :text="$options.typeOptions[variable.variableType]"
:class="$options.formElementClasses"
data-testid="pipeline-form-ci-variable-type"
>
<gl-dropdown-item
v-for="type in Object.keys($options.typeOptions)"
:key="type"
- @click="setVariableAttribute(variable.key, 'variable_type', type)"
+ @click="setVariableAttribute(variable.key, 'variableType', type)"
>
{{ $options.typeOptions[type] }}
</gl-dropdown-item>
@@ -244,26 +372,10 @@ export default {
:class="$options.formElementClasses"
data-testid="pipeline-form-ci-variable-key"
data-qa-selector="ci_variable_key_field"
- @change="addEmptyVariable(refFullName)"
+ @change="addEmptyVariable()"
/>
- <gl-dropdown
- v-if="shouldShowValuesDropdown(variable.key)"
- :text="variable.value"
- :class="$options.formElementClasses"
- class="gl-flex-grow-1 gl-mr-0!"
- data-testid="pipeline-form-ci-variable-value-dropdown"
- >
- <gl-dropdown-item
- v-for="value in predefinedValueOptions[variable.key]"
- :key="value"
- data-testid="pipeline-form-ci-variable-value-dropdown-items"
- @click="setVariableAttribute(variable.key, 'value', value)"
- >
- {{ value }}
- </gl-dropdown-item>
- </gl-dropdown>
+
<gl-form-textarea
- v-else
v-model="variable.value"
:placeholder="s__('CiVariables|Input variable value')"
class="gl-mb-3 gl-h-7!"
@@ -292,30 +404,19 @@ export default {
/>
</template>
</div>
- <div v-if="descriptions[variable.key]" class="gl-text-gray-500 gl-mb-3">
- {{ descriptions[variable.key] }}
- </div>
</div>
-
- <template #description
- ><gl-sprintf :message="$options.i18n.variablesDescription">
- <template #link="{ content }">
- <gl-link :href="settingsLink">{{ content }}</gl-link>
- </template>
- </gl-sprintf></template
- >
</gl-form-group>
<!--Activated-->
- <gl-form-checkbox id="schedule-active" v-model="activated" class="gl-mb-3">{{
- $options.i18n.activated
- }}</gl-form-checkbox>
+ <gl-form-checkbox id="schedule-active" v-model="activated" class="gl-mb-3">
+ {{ $options.i18n.activated }}
+ </gl-form-checkbox>
- <gl-button type="submit" variant="confirm" data-testid="schedule-submit-button">{{
- $options.i18n.savePipelineSchedule
- }}</gl-button>
- <gl-button type="reset" data-testid="schedule-cancel-button">{{
- $options.i18n.cancel
- }}</gl-button>
+ <gl-button variant="confirm" data-testid="schedule-submit-button" @click="scheduleHandler">
+ {{ buttonText }}
+ </gl-button>
+ <gl-button :href="schedulesPath" data-testid="schedule-cancel-button">
+ {{ $options.i18n.cancel }}
+ </gl-button>
</gl-form>
</div>
</template>
diff --git a/app/assets/javascripts/ci/pipeline_schedules/components/table/cells/pipeline_schedule_actions.vue b/app/assets/javascripts/ci/pipeline_schedules/components/table/cells/pipeline_schedule_actions.vue
index 5bd58bfd95d..a56da06f5da 100644
--- a/app/assets/javascripts/ci/pipeline_schedules/components/table/cells/pipeline_schedule_actions.vue
+++ b/app/assets/javascripts/ci/pipeline_schedules/components/table/cells/pipeline_schedule_actions.vue
@@ -1,6 +1,7 @@
<script>
import { GlButton, GlButtonGroup, GlTooltipDirective as GlTooltip } from '@gitlab/ui';
import { s__ } from '~/locale';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
export const i18n = {
playTooltip: s__('PipelineSchedules|Run pipeline schedule'),
@@ -44,6 +45,11 @@ export default {
canRemove() {
return this.schedule.userPermissions.adminPipelineSchedule;
},
+ editPathWithIdParam() {
+ const id = getIdFromGraphQLId(this.schedule.id);
+
+ return `${this.schedule.editPath}?id=${id}`;
+ },
},
};
</script>
@@ -67,7 +73,14 @@ export default {
data-testid="take-ownership-pipeline-schedule-btn"
@click="$emit('showTakeOwnershipModal', schedule.id)"
/>
- <gl-button v-if="canUpdate" v-gl-tooltip :title="$options.i18n.editTooltip" icon="pencil" />
+ <gl-button
+ v-if="canUpdate"
+ v-gl-tooltip
+ :href="editPathWithIdParam"
+ :title="$options.i18n.editTooltip"
+ icon="pencil"
+ data-testid="edit-pipeline-schedule-btn"
+ />
<gl-button
v-if="canRemove"
v-gl-tooltip
diff --git a/app/assets/javascripts/ci/pipeline_schedules/constants.js b/app/assets/javascripts/ci/pipeline_schedules/constants.js
index b4ab1143f60..16dab33ce29 100644
--- a/app/assets/javascripts/ci/pipeline_schedules/constants.js
+++ b/app/assets/javascripts/ci/pipeline_schedules/constants.js
@@ -1,2 +1,3 @@
-export const VARIABLE_TYPE = 'env_var';
-export const FILE_TYPE = 'file';
+export const VARIABLE_TYPE = 'ENV_VAR';
+export const FILE_TYPE = 'FILE';
+export const ALL_SCOPE = 'ALL';
diff --git a/app/assets/javascripts/ci/pipeline_schedules/graphql/mutations/create_pipeline_schedule.mutation.graphql b/app/assets/javascripts/ci/pipeline_schedules/graphql/mutations/create_pipeline_schedule.mutation.graphql
new file mode 100644
index 00000000000..0bea1bb8360
--- /dev/null
+++ b/app/assets/javascripts/ci/pipeline_schedules/graphql/mutations/create_pipeline_schedule.mutation.graphql
@@ -0,0 +1,6 @@
+mutation createPipelineSchedule($input: PipelineScheduleCreateInput!) {
+ pipelineScheduleCreate(input: $input) {
+ clientMutationId
+ errors
+ }
+}
diff --git a/app/assets/javascripts/ci/pipeline_schedules/graphql/mutations/update_pipeline_schedule.mutation.graphql b/app/assets/javascripts/ci/pipeline_schedules/graphql/mutations/update_pipeline_schedule.mutation.graphql
new file mode 100644
index 00000000000..a6a937af74a
--- /dev/null
+++ b/app/assets/javascripts/ci/pipeline_schedules/graphql/mutations/update_pipeline_schedule.mutation.graphql
@@ -0,0 +1,6 @@
+mutation updatePipelineSchedule($input: PipelineScheduleUpdateInput!) {
+ pipelineScheduleUpdate(input: $input) {
+ clientMutationId
+ errors
+ }
+}
diff --git a/app/assets/javascripts/ci/pipeline_schedules/graphql/queries/get_pipeline_schedules.query.graphql b/app/assets/javascripts/ci/pipeline_schedules/graphql/queries/get_pipeline_schedules.query.graphql
index 6167c7dc577..29a26be0344 100644
--- a/app/assets/javascripts/ci/pipeline_schedules/graphql/queries/get_pipeline_schedules.query.graphql
+++ b/app/assets/javascripts/ci/pipeline_schedules/graphql/queries/get_pipeline_schedules.query.graphql
@@ -1,16 +1,24 @@
-query getPipelineSchedulesQuery($projectPath: ID!, $status: PipelineScheduleStatus) {
+query getPipelineSchedulesQuery(
+ $projectPath: ID!
+ $status: PipelineScheduleStatus
+ $ids: [ID!] = null
+) {
currentUser {
id
username
}
project(fullPath: $projectPath) {
id
- pipelineSchedules(status: $status) {
+ pipelineSchedules(status: $status, ids: $ids) {
count
nodes {
id
description
+ cron
+ cronTimezone
+ ref
forTag
+ editPath
refPath
refForDisplay
lastPipeline {
@@ -34,6 +42,14 @@ query getPipelineSchedulesQuery($projectPath: ID!, $status: PipelineScheduleStat
name
webPath
}
+ variables {
+ nodes {
+ id
+ variableType
+ key
+ value
+ }
+ }
userPermissions {
playPipelineSchedule
updatePipelineSchedule
diff --git a/app/assets/javascripts/ci/pipeline_schedules/mount_pipeline_schedules_app.js b/app/assets/javascripts/ci/pipeline_schedules/mount_pipeline_schedules_app.js
index 8bca4f85e9f..71db9400909 100644
--- a/app/assets/javascripts/ci/pipeline_schedules/mount_pipeline_schedules_app.js
+++ b/app/assets/javascripts/ci/pipeline_schedules/mount_pipeline_schedules_app.js
@@ -18,7 +18,7 @@ export default () => {
return false;
}
- const { fullPath, pipelinesPath } = containerEl.dataset;
+ const { fullPath, pipelinesPath, newSchedulePath, schedulesPath } = containerEl.dataset;
return new Vue({
el: containerEl,
@@ -27,6 +27,8 @@ export default () => {
provide: {
fullPath,
pipelinesPath,
+ newSchedulePath,
+ schedulesPath,
},
render(createElement) {
return createElement(PipelineSchedules);
diff --git a/app/assets/javascripts/ci/pipeline_schedules/mount_pipeline_schedules_form_app.js b/app/assets/javascripts/ci/pipeline_schedules/mount_pipeline_schedules_form_app.js
index 445161f99cb..6bf121d39b6 100644
--- a/app/assets/javascripts/ci/pipeline_schedules/mount_pipeline_schedules_form_app.js
+++ b/app/assets/javascripts/ci/pipeline_schedules/mount_pipeline_schedules_form_app.js
@@ -9,7 +9,7 @@ const apolloProvider = new VueApollo({
defaultClient: createDefaultClient(),
});
-export default (selector) => {
+export default (selector, editing = false) => {
const containerEl = document.querySelector(selector);
if (!containerEl) {
@@ -18,13 +18,12 @@ export default (selector) => {
const {
fullPath,
- cron,
dailyLimit,
timezoneData,
- cronTimezone,
projectId,
defaultBranch,
settingsLink,
+ schedulesPath,
} = containerEl.dataset;
return new Vue({
@@ -36,15 +35,15 @@ export default (selector) => {
projectId,
defaultBranch,
dailyLimit: dailyLimit ?? '',
- cronTimezone: cronTimezone ?? '',
- cron: cron ?? '',
settingsLink,
+ schedulesPath,
},
render(createElement) {
return createElement(PipelineSchedulesForm, {
props: {
timezoneData: JSON.parse(timezoneData),
refParam: defaultBranch,
+ editing,
},
});
},
diff --git a/app/assets/javascripts/ci/reports/components/grouped_issues_list.vue b/app/assets/javascripts/ci/reports/components/grouped_issues_list.vue
deleted file mode 100644
index b21a486e259..00000000000
--- a/app/assets/javascripts/ci/reports/components/grouped_issues_list.vue
+++ /dev/null
@@ -1,106 +0,0 @@
-<script>
-import { s__ } from '~/locale';
-import ReportItem from '~/ci/reports/components/report_item.vue';
-import SmartVirtualList from '~/vue_shared/components/smart_virtual_list.vue';
-
-export default {
- components: {
- ReportItem,
- SmartVirtualList,
- },
- props: {
- component: {
- type: String,
- required: false,
- default: '',
- },
- nestedLevel: {
- type: Number,
- required: false,
- default: 0,
- validator: (value) => [0, 1, 2].includes(value),
- },
- resolvedIssues: {
- type: Array,
- required: false,
- default: () => [],
- },
- unresolvedIssues: {
- type: Array,
- required: false,
- default: () => [],
- },
- resolvedHeading: {
- type: String,
- required: false,
- default: s__('ciReport|Fixed'),
- },
- unresolvedHeading: {
- type: String,
- required: false,
- default: s__('ciReport|New'),
- },
- },
- groups: ['unresolved', 'resolved'],
- typicalReportItemHeight: 32,
- maxShownReportItems: 20,
- computed: {
- groups() {
- return this.$options.groups
- .map((group) => ({
- name: group,
- issues: this[`${group}Issues`],
- heading: this[`${group}Heading`],
- }))
- .filter(({ issues }) => issues.length > 0);
- },
- listLength() {
- // every group has a header which is rendered as a list item
- const groupsCount = this.groups.length;
- const issuesCount = this.groups.reduce(
- (totalIssues, { issues }) => totalIssues + issues.length,
- 0,
- );
-
- return groupsCount + issuesCount;
- },
- listClasses() {
- return {
- 'gl-pl-9': this.nestedLevel === 1,
- 'gl-pl-11-5': this.nestedLevel === 2,
- };
- },
- },
-};
-</script>
-
-<template>
- <smart-virtual-list
- :length="listLength"
- :remain="$options.maxShownReportItems"
- :size="$options.typicalReportItemHeight"
- :class="listClasses"
- class="report-block-container"
- wtag="ul"
- wclass="report-block-list"
- >
- <template v-for="(group, groupIndex) in groups">
- <h2
- :key="group.name"
- :data-testid="`${group.name}Heading`"
- :class="[groupIndex > 0 ? 'mt-2' : 'mt-0']"
- class="h5 mb-1"
- >
- {{ group.heading }}
- </h2>
- <report-item
- v-for="(issue, issueIndex) in group.issues"
- :key="`${group.name}-${issue.name}-${group.name}-${issueIndex}`"
- :issue="issue"
- :show-report-section-status-icon="false"
- :component="component"
- status="none"
- />
- </template>
- </smart-virtual-list>
-</template>
diff --git a/app/assets/javascripts/ci/reports/components/summary_row.vue b/app/assets/javascripts/ci/reports/components/summary_row.vue
deleted file mode 100644
index ee55368c829..00000000000
--- a/app/assets/javascripts/ci/reports/components/summary_row.vue
+++ /dev/null
@@ -1,93 +0,0 @@
-<script>
-import { GlLoadingIcon } from '@gitlab/ui';
-import CiIcon from '~/vue_shared/components/ci_icon.vue';
-import HelpPopover from '~/vue_shared/components/help_popover.vue';
-import { ICON_WARNING } from '../constants';
-
-/**
- * Renders the summary row for each report
- *
- * Used both in MR widget and Pipeline's view for:
- * - Unit tests reports
- * - Security reports
- */
-
-export default {
- name: 'ReportSummaryRow',
- components: {
- CiIcon,
- HelpPopover,
- GlLoadingIcon,
- },
- props: {
- nestedSummary: {
- type: Boolean,
- required: false,
- default: false,
- },
- summary: {
- type: String,
- required: false,
- default: '',
- },
- statusIcon: {
- type: String,
- required: true,
- },
- popoverOptions: {
- type: Object,
- required: false,
- default: null,
- },
- },
- computed: {
- iconStatus() {
- return {
- group: this.statusIcon,
- icon: `status_${this.statusIcon}`,
- };
- },
- rowClasses() {
- if (!this.nestedSummary) {
- return ['gl-px-5'];
- }
- return ['gl-pl-9', 'gl-pr-5', { 'gl-bg-gray-10': this.statusIcon === ICON_WARNING }];
- },
- statusIconSize() {
- if (!this.nestedSummary) {
- return 24;
- }
- return 16;
- },
- },
-};
-</script>
-<template>
- <div
- class="gl-border-t-solid gl-border-t-gray-100 gl-border-t-1 gl-py-3 gl-display-flex gl-align-items-center"
- :class="rowClasses"
- >
- <div class="gl-mr-3">
- <gl-loading-icon
- v-if="statusIcon === 'loading'"
- css-class="report-block-list-loading-icon"
- size="lg"
- />
- <ci-icon v-else :status="iconStatus" :size="statusIconSize" data-testid="summary-row-icon" />
- </div>
- <div class="report-block-list-issue-description">
- <div class="report-block-list-issue-description-text" data-testid="summary-row-description">
- <slot name="summary">{{ summary }}</slot
- ><span v-if="popoverOptions" class="text-nowrap"
- >&nbsp;<help-popover v-if="popoverOptions" :options="popoverOptions" class="align-top" />
- </span>
- </div>
- </div>
- <div
- v-if="$slots.default /* eslint-disable-line @gitlab/vue-prefer-dollar-scopedslots */"
- class="text-right flex-fill d-flex justify-content-end flex-column flex-sm-row"
- >
- <slot></slot>
- </div>
- </div>
-</template>
diff --git a/app/assets/javascripts/ci/reports/constants.js b/app/assets/javascripts/ci/reports/constants.js
index 1137236d355..3968f8db752 100644
--- a/app/assets/javascripts/ci/reports/constants.js
+++ b/app/assets/javascripts/ci/reports/constants.js
@@ -7,8 +7,6 @@ export const STATUS_SUCCESS = 'success';
export const STATUS_NEUTRAL = 'neutral';
export const STATUS_NOT_FOUND = 'not_found';
-export const ICON_WARNING = 'warning';
-
export const status = {
LOADING,
ERROR,
@@ -22,3 +20,6 @@ export const status = {
export const SLOT_SUCCESS = 'success';
export const SLOT_LOADING = 'loading';
export const SLOT_ERROR = 'error';
+
+export const CODE_QUALITY_SCALE_KEY = 'codeQuality';
+export const SAST_SCALE_KEY = 'sast';
diff --git a/app/assets/javascripts/ci/reports/sast/constants.js b/app/assets/javascripts/ci/reports/sast/constants.js
new file mode 100644
index 00000000000..3800065917b
--- /dev/null
+++ b/app/assets/javascripts/ci/reports/sast/constants.js
@@ -0,0 +1,44 @@
+export const SEVERITY_CLASSES = {
+ info: 'gl-text-blue-400',
+ low: 'gl-text-orange-300',
+ medium: 'gl-text-orange-400',
+ high: 'gl-text-red-600',
+ critical: 'gl-text-red-800',
+ unknown: 'gl-text-gray-400',
+};
+
+export const SEVERITY_ICONS = {
+ info: 'severity-info',
+ low: 'severity-low',
+ medium: 'severity-medium',
+ high: 'severity-high',
+ critical: 'severity-critical',
+ unknown: 'severity-unknown',
+};
+
+export const SEVERITIES = {
+ info: {
+ class: SEVERITY_CLASSES.info,
+ name: SEVERITY_ICONS.info,
+ },
+ low: {
+ class: SEVERITY_CLASSES.low,
+ name: SEVERITY_ICONS.low,
+ },
+ medium: {
+ class: SEVERITY_CLASSES.medium,
+ name: SEVERITY_ICONS.medium,
+ },
+ high: {
+ class: SEVERITY_CLASSES.high,
+ name: SEVERITY_ICONS.high,
+ },
+ critical: {
+ class: SEVERITY_CLASSES.critical,
+ name: SEVERITY_ICONS.critical,
+ },
+ unknown: {
+ class: SEVERITY_CLASSES.unknown,
+ name: SEVERITY_ICONS.unknown,
+ },
+};
diff --git a/app/assets/javascripts/ci/reports/utils.js b/app/assets/javascripts/ci/reports/utils.js
new file mode 100644
index 00000000000..bb6eddf2cce
--- /dev/null
+++ b/app/assets/javascripts/ci/reports/utils.js
@@ -0,0 +1,20 @@
+import { SEVERITIES as SEVERITIES_CODE_QUALITY } from '~/ci/reports/codequality_report/constants';
+import { SEVERITIES as SEVERITIES_SAST } from '~/ci/reports/sast/constants';
+import { SAST_SCALE_KEY } from './constants';
+
+function mapSeverity(findings) {
+ const severityInfo =
+ findings.scale === SAST_SCALE_KEY ? SEVERITIES_SAST : SEVERITIES_CODE_QUALITY;
+ return {
+ ...findings,
+ class: severityInfo[findings.severity].class,
+ name: severityInfo[findings.severity].name,
+ };
+}
+
+export function getSeverity(findings) {
+ if (Array.isArray(findings)) {
+ return findings.map((finding) => mapSeverity(finding));
+ }
+ return mapSeverity(findings);
+}
diff --git a/app/assets/javascripts/ci/runner/admin_runner_show/admin_runner_show_app.vue b/app/assets/javascripts/ci/runner/admin_runner_show/admin_runner_show_app.vue
index d385d32fd9d..c2ec8462a0e 100644
--- a/app/assets/javascripts/ci/runner/admin_runner_show/admin_runner_show_app.vue
+++ b/app/assets/javascripts/ci/runner/admin_runner_show/admin_runner_show_app.vue
@@ -4,10 +4,8 @@ import { TYPENAME_CI_RUNNER } from '~/graphql_shared/constants';
import { convertToGraphQLId } from '~/graphql_shared/utils';
import { visitUrl } 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 RunnerHeaderActions from '../components/runner_header_actions.vue';
import RunnerDetailsTabs from '../components/runner_details_tabs.vue';
import { I18N_FETCH_ERROR } from '../constants';
@@ -18,10 +16,8 @@ import { saveAlertToLocalStorage } from '../local_storage_alert/save_alert_to_lo
export default {
name: 'AdminRunnerShowApp',
components: {
- RunnerDeleteButton,
- RunnerEditButton,
- RunnerPauseButton,
RunnerHeader,
+ RunnerHeaderActions,
RunnerDetailsTabs,
},
props: {
@@ -80,9 +76,11 @@ export default {
<div>
<runner-header v-if="runner" :runner="runner">
<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" />
+ <runner-header-actions
+ :runner="runner"
+ :edit-path="runner.editAdminUrl"
+ @deleted="onDeleted"
+ />
</template>
</runner-header>
<runner-details-tabs v-if="runner" :runner="runner" />
diff --git a/app/assets/javascripts/ci/runner/admin_runners/admin_runners_app.vue b/app/assets/javascripts/ci/runner/admin_runners/admin_runners_app.vue
index 4d88feebe53..2168685e703 100644
--- a/app/assets/javascripts/ci/runner/admin_runners/admin_runners_app.vue
+++ b/app/assets/javascripts/ci/runner/admin_runners/admin_runners_app.vue
@@ -126,10 +126,6 @@ export default {
isSearchFiltered() {
return isSearchFiltered(this.search);
},
- shouldShowCreateRunnerWorkflow() {
- // create_runner_workflow_for_admin feature flag
- return this.glFeatures.createRunnerWorkflowForAdmin;
- },
},
watch: {
search: {
@@ -193,14 +189,14 @@ export default {
/>
<div class="gl-w-full gl-md-w-auto gl-display-flex">
- <gl-button v-if="shouldShowCreateRunnerWorkflow" :href="newRunnerPath" variant="confirm">
+ <gl-button :href="newRunnerPath" variant="confirm">
{{ s__('Runners|New instance runner') }}
</gl-button>
<registration-dropdown
class="gl-ml-3"
:registration-token="registrationToken"
:type="$options.INSTANCE_TYPE"
- right
+ placement="right"
/>
</div>
</div>
diff --git a/app/assets/javascripts/ci/runner/components/cells/runner_summary_cell.vue b/app/assets/javascripts/ci/runner/components/cells/runner_summary_cell.vue
index 9f4ce14f704..cc31afea88c 100644
--- a/app/assets/javascripts/ci/runner/components/cells/runner_summary_cell.vue
+++ b/app/assets/javascripts/ci/runner/components/cells/runner_summary_cell.vue
@@ -1,6 +1,6 @@
<script>
import { GlIcon, GlSprintf, GlTooltipDirective } from '@gitlab/ui';
-import { sprintf, __ } from '~/locale';
+import { sprintf, __, formatNumber } from '~/locale';
import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
import TooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate/tooltip_on_truncate.vue';
@@ -49,6 +49,12 @@ export default {
managersCount() {
return this.runner.managers?.count || 0;
},
+ firstIpAddress() {
+ return this.runner.managers?.nodes?.[0]?.ipAddress || null;
+ },
+ additionalIpAddressCount() {
+ return this.managersCount - 1;
+ },
jobCount() {
return formatJobCount(this.runner.jobCount);
},
@@ -63,6 +69,9 @@ export default {
return null;
},
},
+ methods: {
+ formatNumber,
+ },
i18n: {
I18N_NO_DESCRIPTION,
I18N_LOCKED_RUNNER_DESCRIPTION,
@@ -120,8 +129,11 @@ export default {
</gl-sprintf>
</runner-summary-field>
- <runner-summary-field v-if="runner.ipAddress" icon="disk" :tooltip="__('IP Address')">
- {{ runner.ipAddress }}
+ <runner-summary-field v-if="firstIpAddress" icon="disk" :tooltip="__('IP Address')">
+ {{ firstIpAddress }}
+ <template v-if="additionalIpAddressCount"
+ >(+{{ formatNumber(additionalIpAddressCount) }})</template
+ >
</runner-summary-field>
<runner-summary-field icon="pipeline" data-testid="job-count" :tooltip="__('Jobs')">
diff --git a/app/assets/javascripts/ci/runner/components/registration/registration_dropdown.vue b/app/assets/javascripts/ci/runner/components/registration/registration_dropdown.vue
index 2fdf8456615..0154cd2a3ec 100644
--- a/app/assets/javascripts/ci/runner/components/registration/registration_dropdown.vue
+++ b/app/assets/javascripts/ci/runner/components/registration/registration_dropdown.vue
@@ -1,5 +1,11 @@
<script>
-import { GlDropdown, GlDropdownForm, GlDropdownItem, GlDropdownDivider, GlIcon } from '@gitlab/ui';
+import {
+ GlDisclosureDropdown,
+ GlDropdownForm,
+ GlDisclosureDropdownItem,
+ GlDisclosureDropdownGroup,
+ GlIcon,
+} from '@gitlab/ui';
import { s__ } from '~/locale';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import RunnerInstructionsModal from '~/vue_shared/components/runner_instructions/runner_instructions_modal.vue';
@@ -20,12 +26,15 @@ export default {
showInstallationInstructions: s__(
'Runners|Show runner installation and registration instructions',
),
+ supportForRegistrationTokensDeprecated: s__(
+ 'Runners|Support for registration tokens is deprecated',
+ ),
},
components: {
- GlDropdown,
+ GlDisclosureDropdown,
+ GlDisclosureDropdownItem,
+ GlDisclosureDropdownGroup,
GlDropdownForm,
- GlDropdownItem,
- GlDropdownDivider,
GlIcon,
RegistrationToken,
RunnerInstructionsModal,
@@ -51,14 +60,6 @@ export default {
};
},
computed: {
- isDeprecated() {
- // Show a compact version when used as secondary option
- // create_runner_workflow_for_admin or create_runner_workflow_for_namespace
- return (
- this.glFeatures?.createRunnerWorkflowForAdmin ||
- this.glFeatures?.createRunnerWorkflowForNamespace
- );
- },
actionText() {
switch (this.type) {
case INSTANCE_TYPE:
@@ -71,30 +72,6 @@ export default {
return I18N_REGISTER_RUNNER;
}
},
- dropdownText() {
- if (this.isDeprecated) {
- return '';
- }
- return this.actionText;
- },
- dropdownToggleClass() {
- if (this.isDeprecated) {
- return ['gl-px-3!'];
- }
- return [];
- },
- dropdownCategory() {
- if (this.isDeprecated) {
- return 'tertiary';
- }
- return 'primary';
- },
- dropdownVariant() {
- if (this.isDeprecated) {
- return 'default';
- }
- return 'confirm';
- },
},
methods: {
onShowInstructionsClick() {
@@ -103,46 +80,51 @@ export default {
onTokenReset(token) {
this.currentRegistrationToken = token;
- this.$refs.runnerRegistrationDropdown.hide(true);
+ this.$refs.runnerRegistrationDropdown.close();
+ },
+ onCopy() {
+ this.$refs.runnerRegistrationDropdown.close();
},
},
};
</script>
<template>
- <gl-dropdown
+ <gl-disclosure-dropdown
ref="runnerRegistrationDropdown"
- menu-class="gl-w-auto!"
- :text="dropdownText"
- :toggle-class="dropdownToggleClass"
- :variant="dropdownVariant"
- :category="dropdownCategory"
+ :toggle-text="actionText"
+ toggle-class="gl-px-3!"
+ variant="default"
+ category="tertiary"
v-bind="$attrs"
+ icon="ellipsis_v"
+ text-sr-only
+ no-caret
>
- <template v-if="isDeprecated" #button-content>
- <span class="gl-sr-only">{{ actionText }}</span>
- <gl-icon name="ellipsis_v" />
- </template>
<gl-dropdown-form class="gl-p-4!">
- <registration-token input-id="token-value" :value="currentRegistrationToken">
- <template v-if="isDeprecated" #label-description>
+ <registration-token input-id="token-value" :value="currentRegistrationToken" @copy="onCopy">
+ <template #label-description>
<gl-icon name="warning" class="gl-text-orange-500" />
<span class="gl-text-secondary">
- {{ s__('Runners|Support for registration tokens is deprecated') }}
+ {{ $options.i18n.supportForRegistrationTokensDeprecated }}
</span>
</template>
</registration-token>
</gl-dropdown-form>
- <gl-dropdown-divider />
- <gl-dropdown-item @click.capture.native.stop="onShowInstructionsClick">
- {{ $options.i18n.showInstallationInstructions }}
- <runner-instructions-modal
- ref="runnerInstructionsModal"
- :registration-token="currentRegistrationToken"
- data-testid="runner-instructions-modal"
- />
- </gl-dropdown-item>
- <gl-dropdown-divider />
- <registration-token-reset-dropdown-item :type="type" @tokenReset="onTokenReset" />
- </gl-dropdown>
+ <gl-disclosure-dropdown-group bordered>
+ <gl-disclosure-dropdown-item @action="onShowInstructionsClick">
+ <template #list-item>
+ {{ $options.i18n.showInstallationInstructions }}
+ <runner-instructions-modal
+ ref="runnerInstructionsModal"
+ :registration-token="currentRegistrationToken"
+ data-testid="runner-instructions-modal"
+ />
+ </template>
+ </gl-disclosure-dropdown-item>
+ </gl-disclosure-dropdown-group>
+ <gl-disclosure-dropdown-group bordered>
+ <registration-token-reset-dropdown-item :type="type" @tokenReset="onTokenReset" />
+ </gl-disclosure-dropdown-group>
+ </gl-disclosure-dropdown>
</template>
diff --git a/app/assets/javascripts/ci/runner/components/registration/registration_token.vue b/app/assets/javascripts/ci/runner/components/registration/registration_token.vue
index b196bccf66f..339c92a427f 100644
--- a/app/assets/javascripts/ci/runner/components/registration/registration_token.vue
+++ b/app/assets/javascripts/ci/runner/components/registration/registration_token.vue
@@ -31,6 +31,7 @@ export default {
onCopy() {
// value already in the clipboard, simply notify the user
this.$toast?.show(s__('Runners|Registration token copied!'));
+ this.$emit('copy');
},
},
I18N_COPY_BUTTON_TITLE: s__('Runners|Copy registration token'),
diff --git a/app/assets/javascripts/ci/runner/components/registration/registration_token_reset_dropdown_item.vue b/app/assets/javascripts/ci/runner/components/registration/registration_token_reset_dropdown_item.vue
index 6ce88fc54de..47ca3ed6227 100644
--- a/app/assets/javascripts/ci/runner/components/registration/registration_token_reset_dropdown_item.vue
+++ b/app/assets/javascripts/ci/runner/components/registration/registration_token_reset_dropdown_item.vue
@@ -1,5 +1,5 @@
<script>
-import { GlDropdownItem, GlLoadingIcon, GlModal, GlModalDirective } from '@gitlab/ui';
+import { GlDisclosureDropdownItem, GlLoadingIcon, GlModal, GlModalDirective } from '@gitlab/ui';
import { createAlert } from '~/alert';
import { TYPENAME_GROUP, TYPENAME_PROJECT } from '~/graphql_shared/constants';
import { convertToGraphQLId } from '~/graphql_shared/utils';
@@ -19,7 +19,7 @@ export default {
name: 'RunnerRegistrationTokenReset',
i18n,
components: {
- GlDropdownItem,
+ GlDisclosureDropdownItem,
GlLoadingIcon,
GlModal,
},
@@ -124,18 +124,20 @@ export default {
};
</script>
<template>
- <gl-dropdown-item v-gl-modal="$options.modalId">
- {{ __('Reset registration token') }}
- <gl-modal
- size="sm"
- :modal-id="$options.modalId"
- :action-primary="actionPrimary"
- :action-secondary="actionSecondary"
- :title="$options.i18n.modalTitle"
- @primary="handleModalPrimary"
- >
- <p>{{ $options.i18n.modalCopy }}</p>
- </gl-modal>
- <gl-loading-icon v-if="loading" inline />
- </gl-dropdown-item>
+ <gl-disclosure-dropdown-item v-gl-modal="$options.modalId">
+ <template #list-item>
+ {{ __('Reset registration token') }}
+ <gl-modal
+ size="sm"
+ :modal-id="$options.modalId"
+ :action-primary="actionPrimary"
+ :action-secondary="actionSecondary"
+ :title="$options.i18n.modalTitle"
+ @primary="handleModalPrimary"
+ >
+ <p>{{ $options.i18n.modalCopy }}</p>
+ </gl-modal>
+ <gl-loading-icon v-if="loading" inline />
+ </template>
+ </gl-disclosure-dropdown-item>
</template>
diff --git a/app/assets/javascripts/ci/runner/components/runner_delete_action.vue b/app/assets/javascripts/ci/runner/components/runner_delete_action.vue
new file mode 100644
index 00000000000..db8133c1ccb
--- /dev/null
+++ b/app/assets/javascripts/ci/runner/components/runner_delete_action.vue
@@ -0,0 +1,126 @@
+<script>
+import runnerDeleteMutation from '~/ci/runner/graphql/shared/runner_delete.mutation.graphql';
+import { createAlert } from '~/alert';
+import { sprintf, s__ } from '~/locale';
+import { captureException } from '~/ci/runner/sentry_utils';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
+import { I18N_DELETED_TOAST } from '../constants';
+import RunnerDeleteModal from './runner_delete_modal.vue';
+
+/**
+ * Component that wraps a delete GraphQL mutation for the
+ * runner, given its id.
+ *
+ * You can use the slot to define a presentation for the
+ * delete action, like a button or dropdown item.
+ *
+ * Usage:
+ *
+ * ```vue
+ * <runner-delete-action
+ * #default="{ loading, onClick }"
+ * :runner="runner"
+ * @done="onDeleted"
+ * >
+ * <button :disabled="loading" @click="onClick"> Delete! </button>
+ * </runner-pause-action>
+ * ```
+ *
+ */
+export default {
+ name: 'RunnerDeleteAction',
+ components: {
+ RunnerDeleteModal,
+ },
+ props: {
+ runner: {
+ type: Object,
+ required: true,
+ validator: (runner) => {
+ return runner?.id && runner?.shortSha;
+ },
+ },
+ },
+ emits: ['done'],
+ data() {
+ return {
+ loading: false,
+ };
+ },
+ computed: {
+ runnerId() {
+ return getIdFromGraphQLId(this.runner.id);
+ },
+ runnerName() {
+ return `#${this.runnerId} (${this.runner.shortSha})`;
+ },
+ runnerManagersCount() {
+ return this.runner.managers?.count || 0;
+ },
+ runnerDeleteModalId() {
+ return `delete-runner-modal-${this.runnerId}`;
+ },
+ },
+ methods: {
+ onClick() {
+ this.$refs.modal.show();
+ },
+ async onDelete() {
+ // "loading" stays "true" until this row is removed,
+ // should only change back if the operation fails.
+ this.loading = true;
+ try {
+ await this.$apollo.mutate({
+ mutation: runnerDeleteMutation,
+ variables: {
+ input: {
+ id: this.runner.id,
+ },
+ },
+ update: (cache, { data }) => {
+ const { errors } = data.runnerDelete;
+
+ if (errors?.length) {
+ this.onError(new Error(errors.join(' ')));
+ return;
+ }
+
+ this.$emit('done', {
+ message: sprintf(I18N_DELETED_TOAST, { name: this.runnerName }),
+ });
+
+ // Remove deleted runner from the cache
+ const cacheId = cache.identify(this.runner);
+ cache.evict({ id: cacheId });
+ cache.gc();
+ },
+ });
+ } catch (e) {
+ this.onError(e);
+ }
+ },
+ onError(error) {
+ this.loading = false;
+ const { message } = error;
+ const title = sprintf(s__('Runners|Runner %{runnerName} failed to delete'), {
+ runnerName: this.runnerName,
+ });
+
+ createAlert({ title, message });
+ captureException({ error, component: this.$options.name });
+ },
+ },
+};
+</script>
+<template>
+ <div>
+ <slot :loading="loading" :on-click="onClick"></slot>
+ <runner-delete-modal
+ ref="modal"
+ :modal-id="runnerDeleteModalId"
+ :runner-name="runnerName"
+ :managers-count="runnerManagersCount"
+ @primary="onDelete"
+ />
+ </div>
+</template>
diff --git a/app/assets/javascripts/ci/runner/components/runner_delete_button.vue b/app/assets/javascripts/ci/runner/components/runner_delete_button.vue
index 3560521e8d7..d228a022032 100644
--- a/app/assets/javascripts/ci/runner/components/runner_delete_button.vue
+++ b/app/assets/javascripts/ci/runner/components/runner_delete_button.vue
@@ -1,30 +1,21 @@
<script>
-import { GlButton, GlModalDirective, GlTooltipDirective } from '@gitlab/ui';
-import runnerDeleteMutation from '~/ci/runner/graphql/shared/runner_delete.mutation.graphql';
-import { createAlert } from '~/alert';
-import { sprintf, s__ } from '~/locale';
-import { captureException } from '~/ci/runner/sentry_utils';
-import { getIdFromGraphQLId } from '~/graphql_shared/utils';
-import { I18N_DELETE_RUNNER, I18N_DELETED_TOAST } from '../constants';
-import RunnerDeleteModal from './runner_delete_modal.vue';
+import { GlButton, GlTooltipDirective } from '@gitlab/ui';
+import { I18N_DELETE_RUNNER } from '../constants';
+import RunnerDeleteAction from './runner_delete_action.vue';
export default {
name: 'RunnerDeleteButton',
components: {
GlButton,
- RunnerDeleteModal,
+ RunnerDeleteAction,
},
directives: {
GlTooltip: GlTooltipDirective,
- GlModal: GlModalDirective,
},
props: {
runner: {
type: Object,
required: true,
- validator: (runner) => {
- return runner?.id && runner?.shortSha;
- },
},
compact: {
type: Boolean,
@@ -39,17 +30,11 @@ export default {
};
},
computed: {
- runnerId() {
- return getIdFromGraphQLId(this.runner.id);
- },
- runnerName() {
- return `#${this.runnerId} (${this.runner.shortSha})`;
- },
- runnerManagersCount() {
- return this.runner.managers?.count || 0;
- },
- runnerDeleteModalId() {
- return `delete-runner-modal-${this.runnerId}`;
+ buttonContent() {
+ if (this.compact) {
+ return null;
+ }
+ return I18N_DELETE_RUNNER;
},
icon() {
if (this.compact) {
@@ -57,12 +42,6 @@ export default {
}
return '';
},
- buttonContent() {
- if (this.compact) {
- return null;
- }
- return I18N_DELETE_RUNNER;
- },
buttonClass() {
// Ensure a square button is shown when compact: true.
// Without this class we will have distorted/rectangular button.
@@ -78,83 +57,36 @@ export default {
return null;
},
tooltip() {
- // Only show basic "delete" tooltip when compact.
- // Also prevent a "sticky" tooltip: If this button is
- // loading, mouseout listeners don't run leaving the tooltip stuck
- if (this.compact && !this.deleting) {
+ if (this.compact) {
return I18N_DELETE_RUNNER;
}
return '';
},
},
methods: {
- async onDelete() {
- // Deleting stays "true" until this row is removed,
- // should only change back if the operation fails.
- this.deleting = true;
- try {
- await this.$apollo.mutate({
- mutation: runnerDeleteMutation,
- variables: {
- input: {
- id: this.runner.id,
- },
- },
- update: (cache, { data }) => {
- const { errors } = data.runnerDelete;
-
- if (errors?.length) {
- this.onError(new Error(errors.join(' ')));
- return;
- }
-
- this.$emit('deleted', {
- message: sprintf(I18N_DELETED_TOAST, { name: this.runnerName }),
- });
-
- // Remove deleted runner from the cache
- const cacheId = cache.identify(this.runner);
- cache.evict({ id: cacheId });
- cache.gc();
- },
- });
- } catch (e) {
- this.onError(e);
- }
- },
- onError(error) {
- this.deleting = false;
- const { message } = error;
- const title = sprintf(s__('Runners|Runner %{runnerName} failed to delete'), {
- runnerName: this.runnerName,
- });
-
- createAlert({ title, message });
- captureException({ error, component: this.$options.name });
+ onDone(event) {
+ this.$emit('deleted', event);
},
},
};
</script>
<template>
- <div v-gl-tooltip="tooltip" class="btn-group">
- <gl-button
- v-gl-modal="runnerDeleteModalId"
- :aria-label="ariaLabel"
- :icon="icon"
- :class="buttonClass"
- :loading="deleting"
- variant="danger"
- category="secondary"
- v-bind="$attrs"
- >
- {{ buttonContent }}
- </gl-button>
- <runner-delete-modal
- :modal-id="runnerDeleteModalId"
- :runner-name="runnerName"
- :managers-count="runnerManagersCount"
- @primary="onDelete"
- />
- </div>
+ <runner-delete-action class="btn-group" :runner="runner" @done="onDone">
+ <template #default="{ loading, onClick }">
+ <gl-button
+ v-gl-tooltip="loading ? '' : tooltip"
+ :aria-label="ariaLabel"
+ :icon="icon"
+ :class="buttonClass"
+ :loading="loading"
+ variant="danger"
+ category="secondary"
+ v-bind="$attrs"
+ @click="onClick"
+ >
+ {{ buttonContent }}
+ </gl-button>
+ </template>
+ </runner-delete-action>
</template>
diff --git a/app/assets/javascripts/ci/runner/components/runner_delete_disclosure_dropdown_item.vue b/app/assets/javascripts/ci/runner/components/runner_delete_disclosure_dropdown_item.vue
new file mode 100644
index 00000000000..0a81974a6d0
--- /dev/null
+++ b/app/assets/javascripts/ci/runner/components/runner_delete_disclosure_dropdown_item.vue
@@ -0,0 +1,38 @@
+<script>
+import { GlDisclosureDropdownItem } from '@gitlab/ui';
+import { I18N_DELETE } from '../constants';
+import RunnerDeleteAction from './runner_delete_action.vue';
+
+export default {
+ name: 'RunnerDeleteDisclosureDropdownItem',
+ components: {
+ GlDisclosureDropdownItem,
+ RunnerDeleteAction,
+ },
+ props: {
+ runner: {
+ type: Object,
+ required: true,
+ },
+ },
+ emits: ['deleted'],
+ methods: {
+ onDone(event) {
+ this.$emit('deleted', event);
+ },
+ },
+ I18N_DELETE,
+};
+</script>
+
+<template>
+ <runner-delete-action :runner="runner" @done="onDone">
+ <template #default="{ onClick }">
+ <gl-disclosure-dropdown-item @action="onClick">
+ <template #list-item>
+ <span class="gl-text-red-500">{{ $options.I18N_DELETE }}</span>
+ </template>
+ </gl-disclosure-dropdown-item>
+ </template>
+ </runner-delete-action>
+</template>
diff --git a/app/assets/javascripts/ci/runner/components/runner_delete_modal.vue b/app/assets/javascripts/ci/runner/components/runner_delete_modal.vue
index 93f79fd67ea..124ac0b4e73 100644
--- a/app/assets/javascripts/ci/runner/components/runner_delete_modal.vue
+++ b/app/assets/javascripts/ci/runner/components/runner_delete_modal.vue
@@ -52,6 +52,9 @@ export default {
},
},
methods: {
+ show() {
+ this.$refs.modal.show();
+ },
onPrimary() {
this.$refs.modal.hide();
},
diff --git a/app/assets/javascripts/ci/runner/components/runner_detail.vue b/app/assets/javascripts/ci/runner/components/runner_detail.vue
index 9e8055a8432..496985ff7ac 100644
--- a/app/assets/javascripts/ci/runner/components/runner_detail.vue
+++ b/app/assets/javascripts/ci/runner/components/runner_detail.vue
@@ -40,12 +40,12 @@ export default {
<template>
<div class="gl-display-contents">
- <dt class="gl-mb-5 gl-mr-6 gl-max-w-26">
+ <dt class="gl-mb-5 gl-mr-6 gl-max-w-26" data-testid="label-slot">
<template v-if="label || $scopedSlots.label">
<slot name="label">{{ label }}</slot>
</template>
</dt>
- <dd class="gl-mb-5">
+ <dd class="gl-mb-5" data-testid="value-slot">
<template v-if="value || $scopedSlots.value">
<slot name="value">{{ value }}</slot>
</template>
diff --git a/app/assets/javascripts/ci/runner/components/runner_edit_button.vue b/app/assets/javascripts/ci/runner/components/runner_edit_button.vue
index 33e0acaf5c0..b4efd72b082 100644
--- a/app/assets/javascripts/ci/runner/components/runner_edit_button.vue
+++ b/app/assets/javascripts/ci/runner/components/runner_edit_button.vue
@@ -9,15 +9,23 @@ export default {
directives: {
GlTooltip: GlTooltipDirective,
},
+ props: {
+ href: {
+ type: String,
+ required: false,
+ default: null,
+ },
+ },
I18N_EDIT,
};
</script>
<template>
<gl-button
+ v-if="href"
v-gl-tooltip="$options.I18N_EDIT"
- v-bind="$attrs"
:aria-label="$options.I18N_EDIT"
+ :href="href"
icon="pencil"
v-on="$listeners"
/>
diff --git a/app/assets/javascripts/ci/runner/components/runner_edit_disclosure_dropdown_item.vue b/app/assets/javascripts/ci/runner/components/runner_edit_disclosure_dropdown_item.vue
new file mode 100644
index 00000000000..d0dcc04c3dc
--- /dev/null
+++ b/app/assets/javascripts/ci/runner/components/runner_edit_disclosure_dropdown_item.vue
@@ -0,0 +1,29 @@
+<script>
+import { GlDisclosureDropdownItem } from '@gitlab/ui';
+
+import { I18N_EDIT } from '../constants';
+
+export default {
+ name: 'RunnerEditDisclosureDropdownItem',
+ components: {
+ GlDisclosureDropdownItem,
+ },
+ props: {
+ href: {
+ type: String,
+ required: false,
+ default: null,
+ },
+ },
+ computed: {
+ item() {
+ return { text: I18N_EDIT, href: this.href };
+ },
+ },
+ I18N_EDIT,
+};
+</script>
+
+<template>
+ <gl-disclosure-dropdown-item v-if="href" :item="item" />
+</template>
diff --git a/app/assets/javascripts/ci/runner/components/runner_header.vue b/app/assets/javascripts/ci/runner/components/runner_header.vue
index f46e894bf2e..55a33ef2074 100644
--- a/app/assets/javascripts/ci/runner/components/runner_header.vue
+++ b/app/assets/javascripts/ci/runner/components/runner_header.vue
@@ -32,31 +32,29 @@ export default {
};
</script>
<template>
- <div
- class="gl-display-flex gl-justify-content-space-between gl-align-items-flex-start gl-gap-3 gl-flex-wrap gl-py-5"
- >
- <div>
+ <div class="gl-py-5">
+ <div class="gl-display-flex gl-justify-content-space-between">
<h1 class="gl-font-size-h-display gl-my-0">{{ name }}</h1>
- <div class="gl-display-flex gl-align-items-flex-start gl-gap-3 gl-flex-wrap gl-mt-3">
- <runner-status-badge :contacted-at="runner.contactedAt" :status="runner.status" />
- <runner-type-badge :type="runner.runnerType" />
- <span v-if="runner.createdAt">
- <gl-sprintf :message="__('%{locked} created %{timeago}')">
- <template #locked>
- <gl-icon
- v-if="runner.locked"
- v-gl-tooltip="$options.I18N_LOCKED_RUNNER_DESCRIPTION"
- name="lock"
- :aria-label="$options.I18N_LOCKED_RUNNER_DESCRIPTION"
- />
- </template>
- <template #timeago>
- <time-ago :time="runner.createdAt" />
- </template>
- </gl-sprintf>
- </span>
- </div>
+ <slot name="actions"></slot>
+ </div>
+ <div class="gl-display-flex gl-align-items-flex-start gl-gap-3 gl-flex-wrap gl-mt-3">
+ <runner-status-badge :contacted-at="runner.contactedAt" :status="runner.status" />
+ <runner-type-badge :type="runner.runnerType" />
+ <span v-if="runner.createdAt">
+ <gl-sprintf :message="__('%{locked} created %{timeago}')">
+ <template #locked>
+ <gl-icon
+ v-if="runner.locked"
+ v-gl-tooltip="$options.I18N_LOCKED_RUNNER_DESCRIPTION"
+ name="lock"
+ :aria-label="$options.I18N_LOCKED_RUNNER_DESCRIPTION"
+ />
+ </template>
+ <template #timeago>
+ <time-ago :time="runner.createdAt" />
+ </template>
+ </gl-sprintf>
+ </span>
</div>
- <div class="gl-display-flex gl-gap-3 gl-flex-wrap"><slot name="actions"></slot></div>
</div>
</template>
diff --git a/app/assets/javascripts/ci/runner/components/runner_header_actions.vue b/app/assets/javascripts/ci/runner/components/runner_header_actions.vue
new file mode 100644
index 00000000000..bc6f184bd4d
--- /dev/null
+++ b/app/assets/javascripts/ci/runner/components/runner_header_actions.vue
@@ -0,0 +1,80 @@
+<script>
+import { GlDisclosureDropdown } from '@gitlab/ui';
+
+import RunnerDeleteButton from './runner_delete_button.vue';
+import RunnerEditButton from './runner_edit_button.vue';
+import RunnerPauseButton from './runner_pause_button.vue';
+
+import RunnerEditDisclosureDropdownItem from './runner_edit_disclosure_dropdown_item.vue';
+import RunnerPauseDisclosureDropdownItem from './runner_pause_disclosure_dropdown_item.vue';
+import RunnerDeleteDisclosureDropdownItem from './runner_delete_disclosure_dropdown_item.vue';
+
+export default {
+ name: 'RunnerHeaderActions',
+ components: {
+ GlDisclosureDropdown,
+
+ RunnerDeleteButton,
+ RunnerEditButton,
+ RunnerPauseButton,
+
+ RunnerEditDisclosureDropdownItem,
+ RunnerPauseDisclosureDropdownItem,
+ RunnerDeleteDisclosureDropdownItem,
+ },
+ props: {
+ runner: {
+ type: Object,
+ required: true,
+ },
+ editPath: {
+ type: String,
+ required: false,
+ default: null,
+ },
+ },
+ computed: {
+ canUpdate() {
+ return this.runner.userPermissions?.updateRunner;
+ },
+ canDelete() {
+ return this.runner.userPermissions?.deleteRunner;
+ },
+ },
+ methods: {
+ onDeleted(event) {
+ this.$emit('deleted', event);
+ },
+ },
+};
+</script>
+
+<template>
+ <div v-if="canUpdate || canDelete">
+ <!-- sm and up screens -->
+ <div class="gl-display-none gl-sm-display-flex gl-gap-3">
+ <runner-edit-button v-if="canUpdate" :href="editPath" />
+ <runner-pause-button v-if="canUpdate" :runner="runner" />
+ <runner-delete-button v-if="canDelete" :runner="runner" @deleted="onDeleted" />
+ </div>
+
+ <!-- xs screens -->
+ <div class="gl-sm-display-none">
+ <gl-disclosure-dropdown
+ icon="ellipsis_v"
+ :toggle-text="s__('Runner|Runner actions')"
+ text-sr-only
+ category="tertiary"
+ no-caret
+ >
+ <runner-edit-disclosure-dropdown-item v-if="canUpdate" :href="editPath" />
+ <runner-pause-disclosure-dropdown-item v-if="canUpdate" :runner="runner" />
+ <runner-delete-disclosure-dropdown-item
+ v-if="canDelete"
+ :runner="runner"
+ @deleted="onDeleted"
+ />
+ </gl-disclosure-dropdown>
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/ci/runner/components/runner_list_empty_state.vue b/app/assets/javascripts/ci/runner/components/runner_list_empty_state.vue
index d2836962a97..a4a489074c3 100644
--- a/app/assets/javascripts/ci/runner/components/runner_list_empty_state.vue
+++ b/app/assets/javascripts/ci/runner/components/runner_list_empty_state.vue
@@ -11,7 +11,6 @@ import {
I18N_CREATE_RUNNER_LINK,
I18N_STILL_USING_REGISTRATION_TOKENS,
I18N_CONTACT_ADMIN_TO_REGISTER,
- I18N_FOLLOW_REGISTRATION_INSTRUCTIONS,
I18N_NO_RESULTS,
I18N_EDIT_YOUR_SEARCH,
} from '~/ci/runner/constants';
@@ -44,15 +43,6 @@ export default {
default: null,
},
},
- computed: {
- shouldShowCreateRunnerWorkflow() {
- // create_runner_workflow_for_admin or create_runner_workflow_for_namespace
- return (
- this.glFeatures?.createRunnerWorkflowForAdmin ||
- this.glFeatures?.createRunnerWorkflowForNamespace
- );
- },
- },
modalId: 'runners-empty-state-instructions-modal',
svgHeight: 145,
EMPTY_STATE_SVG_URL,
@@ -63,7 +53,6 @@ export default {
I18N_CREATE_RUNNER_LINK,
I18N_STILL_USING_REGISTRATION_TOKENS,
I18N_CONTACT_ADMIN_TO_REGISTER,
- I18N_FOLLOW_REGISTRATION_INSTRUCTIONS,
I18N_NO_RESULTS,
I18N_EDIT_YOUR_SEARCH,
};
@@ -85,39 +74,22 @@ export default {
>
<template #description>
{{ $options.I18N_RUNNERS_ARE_AGENTS }}
- <template v-if="shouldShowCreateRunnerWorkflow">
- <gl-sprintf v-if="newRunnerPath" :message="$options.I18N_CREATE_RUNNER_LINK">
- <template #link="{ content }">
- <gl-link :href="newRunnerPath">{{ content }}</gl-link>
- </template>
- </gl-sprintf>
- <template v-if="registrationToken">
- <br />
- <gl-link v-gl-modal="$options.modalId">{{
- $options.I18N_STILL_USING_REGISTRATION_TOKENS
- }}</gl-link>
- <runner-instructions-modal
- :modal-id="$options.modalId"
- :registration-token="registrationToken"
- />
- </template>
- <template v-if="!newRunnerPath && !registrationToken">
- {{ $options.I18N_CONTACT_ADMIN_TO_REGISTER }}
- </template>
- </template>
- <gl-sprintf
- v-else-if="registrationToken"
- :message="$options.I18N_FOLLOW_REGISTRATION_INSTRUCTIONS"
- >
+ <gl-sprintf v-if="newRunnerPath" :message="$options.I18N_CREATE_RUNNER_LINK">
<template #link="{ content }">
- <gl-link v-gl-modal="$options.modalId">{{ content }}</gl-link>
- <runner-instructions-modal
- :modal-id="$options.modalId"
- :registration-token="registrationToken"
- />
+ <gl-link :href="newRunnerPath">{{ content }}</gl-link>
</template>
</gl-sprintf>
- <template v-else>
+ <template v-if="registrationToken">
+ <br />
+ <gl-link v-gl-modal="$options.modalId">{{
+ $options.I18N_STILL_USING_REGISTRATION_TOKENS
+ }}</gl-link>
+ <runner-instructions-modal
+ :modal-id="$options.modalId"
+ :registration-token="registrationToken"
+ />
+ </template>
+ <template v-if="!newRunnerPath && !registrationToken">
{{ $options.I18N_CONTACT_ADMIN_TO_REGISTER }}
</template>
</template>
diff --git a/app/assets/javascripts/ci/runner/components/runner_pause_action.vue b/app/assets/javascripts/ci/runner/components/runner_pause_action.vue
new file mode 100644
index 00000000000..184d6a83381
--- /dev/null
+++ b/app/assets/javascripts/ci/runner/components/runner_pause_action.vue
@@ -0,0 +1,89 @@
+<script>
+import runnerTogglePausedMutation from '~/ci/runner/graphql/shared/runner_toggle_paused.mutation.graphql';
+import { createAlert } from '~/alert';
+import { captureException } from '~/ci/runner/sentry_utils';
+
+/**
+ * Renderless component that wraps a GraphQL pause mutation for the
+ * runner, given its id and current "paused" value.
+ *
+ * You can use the slot to define a presentation for the delete action,
+ * like a button or dropdown item.
+
+ * Usage:
+ *
+ * ```vue
+ * <runner-pause-action
+ * #default="{ loading, onClick }"
+ * :runner="runner"
+ * @done="onToggled"
+ * >
+ * <button :disabled="loading" @click="onClick">{{ runner.paused ? 'Go!' : 'Stop!' }}</button>
+ * </runner-pause-action>
+ * ```
+ *
+ */
+export default {
+ name: 'RunnerPauseAction',
+ props: {
+ runner: {
+ type: Object,
+ required: true,
+ },
+ compact: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ },
+ emits: ['done'],
+ data() {
+ return {
+ loading: false,
+ };
+ },
+ methods: {
+ async onClick() {
+ this.loading = true;
+ try {
+ const input = {
+ id: this.runner.id,
+ paused: !this.runner.paused,
+ };
+
+ const {
+ data: {
+ runnerUpdate: { errors },
+ },
+ } = await this.$apollo.mutate({
+ mutation: runnerTogglePausedMutation,
+ variables: {
+ input,
+ },
+ });
+
+ if (errors && errors.length) {
+ throw new Error(errors.join(' '));
+ }
+ this.$emit('done');
+ } catch (e) {
+ this.onError(e);
+ } finally {
+ this.loading = false;
+ }
+ },
+ onError(error) {
+ const { message } = error;
+
+ createAlert({ message });
+ captureException({ error, component: this.$options.name });
+ },
+ },
+ render() {
+ return this.$scopedSlots.default({
+ onClick: this.onClick,
+ loading: this.loading,
+ });
+ },
+};
+</script>
diff --git a/app/assets/javascripts/ci/runner/components/runner_pause_button.vue b/app/assets/javascripts/ci/runner/components/runner_pause_button.vue
index d16c8f98bad..15bb54027c7 100644
--- a/app/assets/javascripts/ci/runner/components/runner_pause_button.vue
+++ b/app/assets/javascripts/ci/runner/components/runner_pause_button.vue
@@ -1,14 +1,14 @@
<script>
import { GlButton, GlTooltipDirective } from '@gitlab/ui';
-import runnerTogglePausedMutation from '~/ci/runner/graphql/shared/runner_toggle_paused.mutation.graphql';
-import { createAlert } from '~/alert';
-import { captureException } from '~/ci/runner/sentry_utils';
-import { I18N_PAUSE, I18N_PAUSE_TOOLTIP, I18N_RESUME, I18N_RESUME_TOOLTIP } from '../constants';
+
+import { I18N_RESUME, I18N_PAUSE, I18N_PAUSE_TOOLTIP, I18N_RESUME_TOOLTIP } from '../constants';
+import RunnerPauseAction from './runner_pause_action.vue';
export default {
name: 'RunnerPauseButton',
components: {
GlButton,
+ RunnerPauseAction,
},
directives: {
GlTooltip: GlTooltipDirective,
@@ -25,96 +25,47 @@ export default {
},
},
emits: ['toggledPaused'],
- data() {
- return {
- updating: false,
- };
- },
computed: {
isPaused() {
return this.runner.paused;
},
+ tooltip() {
+ return this.isPaused ? I18N_RESUME_TOOLTIP : I18N_PAUSE_TOOLTIP;
+ },
icon() {
return this.isPaused ? 'play' : 'pause';
},
label() {
return this.isPaused ? I18N_RESUME : I18N_PAUSE;
},
- buttonContent() {
- if (this.compact) {
- return null;
- }
- return this.label;
- },
ariaLabel() {
if (this.compact) {
return this.label;
}
return null;
},
- tooltip() {
- // Prevent a "sticky" tooltip: If this button is disabled,
- // mouseout listeners don't run leaving the tooltip stuck
- if (!this.updating) {
- return this.isPaused ? I18N_RESUME_TOOLTIP : I18N_PAUSE_TOOLTIP;
- }
- return '';
- },
- },
- methods: {
- async onToggle() {
- this.updating = true;
- try {
- const input = {
- id: this.runner.id,
- paused: !this.isPaused,
- };
-
- const {
- data: {
- runnerUpdate: { errors },
- },
- } = await this.$apollo.mutate({
- mutation: runnerTogglePausedMutation,
- variables: {
- input,
- },
- });
-
- if (errors && errors.length) {
- throw new Error(errors.join(' '));
- }
- this.$emit('toggledPaused');
- } catch (e) {
- this.onError(e);
- } finally {
- this.updating = false;
+ buttonContent() {
+ if (this.compact) {
+ return null;
}
- },
- onError(error) {
- const { message } = error;
-
- createAlert({ message });
- captureException({ error, component: this.$options.name });
+ return this.label;
},
},
};
</script>
<template>
- <gl-button
- v-gl-tooltip="tooltip"
- v-bind="$attrs"
- :aria-label="ariaLabel"
- :icon="icon"
- :loading="updating"
- @click="onToggle"
- v-on="$listeners"
- >
- <!--
- Use <template v-if> to ensure a square button is shown when compact: true.
- Sending empty content will still show a distorted/rectangular button.
- -->
- <template v-if="buttonContent">{{ buttonContent }}</template>
- </gl-button>
+ <runner-pause-action :runner="runner" @done="$emit('toggledPaused')">
+ <template #default="{ loading, onClick }">
+ <gl-button
+ v-gl-tooltip="loading ? '' : tooltip"
+ :icon="icon"
+ :aria-label="ariaLabel"
+ :loading="loading"
+ @click="onClick"
+ >
+ <template v-if="buttonContent">{{ buttonContent }}</template>
+ </gl-button>
+ </template>
+ </runner-pause-action>
</template>
diff --git a/app/assets/javascripts/ci/runner/components/runner_pause_disclosure_dropdown_item.vue b/app/assets/javascripts/ci/runner/components/runner_pause_disclosure_dropdown_item.vue
new file mode 100644
index 00000000000..3dd5e227a4a
--- /dev/null
+++ b/app/assets/javascripts/ci/runner/components/runner_pause_disclosure_dropdown_item.vue
@@ -0,0 +1,34 @@
+<script>
+import { GlDisclosureDropdownItem } from '@gitlab/ui';
+
+import { I18N_RESUME, I18N_PAUSE } from '../constants';
+import RunnerPauseAction from './runner_pause_action.vue';
+
+export default {
+ name: 'RunnerPauseDisclosureDropdownItem',
+ components: {
+ GlDisclosureDropdownItem,
+ RunnerPauseAction,
+ },
+ props: {
+ runner: {
+ type: Object,
+ required: true,
+ },
+ },
+ emits: ['toggledPaused'],
+ computed: {
+ item() {
+ return { text: this.runner.paused ? I18N_RESUME : I18N_PAUSE };
+ },
+ },
+};
+</script>
+
+<template>
+ <runner-pause-action :runner="runner" @done="$emit('toggledPaused')">
+ <template #default="{ onClick }">
+ <gl-disclosure-dropdown-item :item="item" @action="onClick" />
+ </template>
+ </runner-pause-action>
+</template>
diff --git a/app/assets/javascripts/ci/runner/constants.js b/app/assets/javascripts/ci/runner/constants.js
index 40841696ead..203f97876de 100644
--- a/app/assets/javascripts/ci/runner/constants.js
+++ b/app/assets/javascripts/ci/runner/constants.js
@@ -1,4 +1,5 @@
import { __, s__ } from '~/locale';
+import { DOCS_URL } from 'jh_else_ce/lib/utils/url_utility';
export const RUNNER_TYPENAME = 'CiRunner'; // __typename
@@ -90,6 +91,7 @@ export const I18N_PAUSED_DESCRIPTION = s__('Runners|Not accepting jobs');
export const I18N_RESUME = __('Resume');
export const I18N_RESUME_TOOLTIP = s__('Runners|Resume accepting jobs');
+export const I18N_DELETE = s__('Runners|Delete');
export const I18N_DELETE_RUNNER = s__('Runners|Delete runner');
export const I18N_DELETED_TOAST = s__('Runners|Runner %{name} was deleted');
@@ -117,9 +119,6 @@ export const I18N_STILL_USING_REGISTRATION_TOKENS = s__('Runners|Still using reg
export const I18N_CONTACT_ADMIN_TO_REGISTER = s__(
'Runners|To register new runners, contact your administrator.',
);
-export const I18N_FOLLOW_REGISTRATION_INSTRUCTIONS = s__(
- 'Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner.',
-);
// No runners found
export const I18N_NO_RESULTS = s__('Runners|No results found');
@@ -271,12 +270,10 @@ export const DEFAULT_PLATFORM = LINUX_PLATFORM;
// Runner docs are in a separate repository and are not shipped with GitLab
// they are rendered as external URLs.
-export const INSTALL_HELP_URL = 'https://docs.gitlab.com/runner/install';
-export const EXECUTORS_HELP_URL = 'https://docs.gitlab.com/runner/executors/';
-export const SERVICE_COMMANDS_HELP_URL =
- 'https://docs.gitlab.com/runner/commands/#service-related-commands';
-export const CHANGELOG_URL = 'https://gitlab.com/gitlab-org/gitlab-runner/blob/main/CHANGELOG.md';
-export const DOCKER_HELP_URL = 'https://docs.gitlab.com/runner/install/docker.html';
-export const KUBERNETES_HELP_URL = 'https://docs.gitlab.com/runner/install/kubernetes.html';
-export const RUNNER_MANAGERS_HELP_URL =
- 'https://docs.gitlab.com/runner/fleet_scaling/#workers-executors-and-autoscaling-capabilities';
+export const INSTALL_HELP_URL = `${DOCS_URL}/runner/install`;
+export const EXECUTORS_HELP_URL = `${DOCS_URL}/runner/executors/`;
+export const SERVICE_COMMANDS_HELP_URL = `${DOCS_URL}/runner/commands/#service-related-commands`;
+export const CHANGELOG_URL = `https://gitlab.com/gitlab-org/gitlab-runner/blob/main/CHANGELOG.md`;
+export const DOCKER_HELP_URL = `${DOCS_URL}/runner/install/docker.html`;
+export const KUBERNETES_HELP_URL = `${DOCS_URL}/runner/install/kubernetes.html`;
+export const RUNNER_MANAGERS_HELP_URL = `${DOCS_URL}/runner/fleet_scaling/#workers-executors-and-autoscaling-capabilities`;
diff --git a/app/assets/javascripts/ci/runner/graphql/list/list_item_shared.fragment.graphql b/app/assets/javascripts/ci/runner/graphql/list/list_item_shared.fragment.graphql
index c0b888e758b..7ad9605d0a4 100644
--- a/app/assets/javascripts/ci/runner/graphql/list/list_item_shared.fragment.graphql
+++ b/app/assets/javascripts/ci/runner/graphql/list/list_item_shared.fragment.graphql
@@ -6,7 +6,6 @@ fragment ListItemShared on CiRunner {
runnerType
shortSha
version
- ipAddress
paused
locked
jobCount
@@ -22,8 +21,11 @@ fragment ListItemShared on CiRunner {
updateRunner
deleteRunner
}
- managers {
+ managers(first: 1) {
count
+ nodes {
+ ipAddress
+ }
}
groups(first: 1) {
nodes {
diff --git a/app/assets/javascripts/ci/runner/group_runner_show/group_runner_show_app.vue b/app/assets/javascripts/ci/runner/group_runner_show/group_runner_show_app.vue
index e885cf45c5a..4b570db772f 100644
--- a/app/assets/javascripts/ci/runner/group_runner_show/group_runner_show_app.vue
+++ b/app/assets/javascripts/ci/runner/group_runner_show/group_runner_show_app.vue
@@ -4,10 +4,8 @@ import { TYPENAME_CI_RUNNER } from '~/graphql_shared/constants';
import { convertToGraphQLId } from '~/graphql_shared/utils';
import { visitUrl } 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 RunnerHeaderActions from '../components/runner_header_actions.vue';
import RunnerDetailsTabs from '../components/runner_details_tabs.vue';
import { I18N_FETCH_ERROR } from '../constants';
@@ -18,10 +16,8 @@ import { saveAlertToLocalStorage } from '../local_storage_alert/save_alert_to_lo
export default {
name: 'GroupRunnerShowApp',
components: {
- RunnerDeleteButton,
- RunnerEditButton,
- RunnerPauseButton,
RunnerHeader,
+ RunnerHeaderActions,
RunnerDetailsTabs,
},
props: {
@@ -85,9 +81,11 @@ export default {
<div>
<runner-header v-if="runner" :runner="runner">
<template #actions>
- <runner-edit-button v-if="canUpdate && editGroupRunnerPath" :href="editGroupRunnerPath" />
- <runner-pause-button v-if="canUpdate" :runner="runner" />
- <runner-delete-button v-if="canDelete" :runner="runner" @deleted="onDeleted" />
+ <runner-header-actions
+ :runner="runner"
+ :edit-path="editGroupRunnerPath"
+ @deleted="onDeleted"
+ />
</template>
</runner-header>
diff --git a/app/assets/javascripts/ci/runner/group_runners/group_runners_app.vue b/app/assets/javascripts/ci/runner/group_runners/group_runners_app.vue
index 74523bc335f..71584c40a38 100644
--- a/app/assets/javascripts/ci/runner/group_runners/group_runners_app.vue
+++ b/app/assets/javascripts/ci/runner/group_runners/group_runners_app.vue
@@ -155,10 +155,6 @@ export default {
isSearchFiltered() {
return isSearchFiltered(this.search);
},
- shouldShowCreateRunnerWorkflow() {
- // create_runner_workflow_for_namespace feature flag
- return this.glFeatures.createRunnerWorkflowForNamespace;
- },
},
watch: {
search: {
@@ -231,11 +227,7 @@ export default {
/>
<div class="gl-w-full gl-md-w-auto gl-display-flex">
- <gl-button
- v-if="shouldShowCreateRunnerWorkflow && newRunnerPath"
- :href="newRunnerPath"
- variant="confirm"
- >
+ <gl-button v-if="newRunnerPath" :href="newRunnerPath" variant="confirm">
{{ s__('Runners|New group runner') }}
</gl-button>
<registration-dropdown
@@ -243,7 +235,7 @@ export default {
class="gl-ml-3"
:registration-token="registrationToken"
:type="$options.GROUP_TYPE"
- right
+ placement="right"
/>
</div>
</div>
diff --git a/app/assets/javascripts/clusters/forms/show/index.js b/app/assets/javascripts/clusters/forms/show/index.js
index 102b240042f..3cb4376f41a 100644
--- a/app/assets/javascripts/clusters/forms/show/index.js
+++ b/app/assets/javascripts/clusters/forms/show/index.js
@@ -1,11 +1,8 @@
import Vue from 'vue';
-import dirtySubmitFactory from '~/dirty_submit/dirty_submit_factory';
import IntegrationForm from '../components/integration_form.vue';
import { createStore } from '../stores';
export default () => {
- dirtySubmitFactory(document.querySelectorAll('.js-cluster-integrations-form'));
-
const entryPoint = document.querySelector('#js-cluster-details-form');
if (!entryPoint) {
diff --git a/app/assets/javascripts/clusters_list/components/clusters_actions.vue b/app/assets/javascripts/clusters_list/components/clusters_actions.vue
index 2675d46dd16..7b97a5af373 100644
--- a/app/assets/javascripts/clusters_list/components/clusters_actions.vue
+++ b/app/assets/javascripts/clusters_list/components/clusters_actions.vue
@@ -1,5 +1,11 @@
<script>
-import { GlButton, GlDropdown, GlDropdownItem, GlModalDirective, GlTooltip } from '@gitlab/ui';
+import {
+ GlButton,
+ GlButtonGroup,
+ GlModalDirective,
+ GlTooltip,
+ GlDisclosureDropdown,
+} from '@gitlab/ui';
import { INSTALL_AGENT_MODAL_ID, CLUSTERS_ACTIONS } from '../constants';
@@ -8,8 +14,8 @@ export default {
INSTALL_AGENT_MODAL_ID,
components: {
GlButton,
- GlDropdown,
- GlDropdownItem,
+ GlButtonGroup,
+ GlDisclosureDropdown,
GlTooltip,
},
directives: {
@@ -45,13 +51,17 @@ export default {
actionItems() {
const createCluster = {
href: this.newClusterDocsPath,
- title: this.$options.i18n.createCluster,
- testid: 'create-cluster-link',
+ text: this.$options.i18n.createCluster,
+ extraAttrs: {
+ 'data-testid': 'create-cluster-link',
+ },
};
const connectCluster = {
href: this.addClusterPath,
- title: this.$options.i18n.connectClusterCertificate,
- testid: 'connect-cluster-link',
+ text: this.$options.i18n.connectClusterCertificate,
+ extraAttrs: {
+ 'data-testid': 'connect-cluster-link',
+ },
};
const actions = [];
@@ -61,7 +71,6 @@ export default {
if (this.displayClusterAgents && this.certificateBasedClustersEnabled) {
actions.push(connectCluster);
}
-
return actions;
},
},
@@ -81,39 +90,35 @@ export default {
: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
- v-else
+ <!--TODO: Replace button-group workaround once `split` option for new dropdowns is implemented.-->
+ <!-- See issue at https://gitlab.com/gitlab-org/gitlab-ui/-/issues/2263-->
+ <gl-button-group
ref="actions"
- v-gl-modal-directive="shouldTriggerModal && $options.INSTALL_AGENT_MODAL_ID"
data-qa-selector="clusters_actions_button"
- category="primary"
- variant="confirm"
- :text="defaultActionText"
- :disabled="!canAddCluster"
- :split-href="defaultActionUrl"
- split
- right
+ class="gl-w-full gl-mb-3 gl-md-w-auto gl-md-mb-0"
>
- <gl-dropdown-item
- v-for="action in actionItems"
- :key="action.title"
- :href="action.href"
- :data-testid="action.testid"
- @click.stop
+ <gl-button
+ v-gl-modal-directive="shouldTriggerModal && $options.INSTALL_AGENT_MODAL_ID"
+ :href="defaultActionUrl"
+ :disabled="!canAddCluster"
+ data-testid="clusters-default-action-button"
+ category="primary"
+ variant="confirm"
>
- {{ action.title }}
- </gl-dropdown-item>
- </gl-dropdown>
+ {{ defaultActionText }}
+ </gl-button>
+ <gl-disclosure-dropdown
+ v-if="actionItems.length"
+ class="split"
+ toggle-class="gl-rounded-top-left-none! gl-rounded-bottom-left-none! gl-pl-1!"
+ category="primary"
+ variant="confirm"
+ placement="right"
+ :toggle-text="defaultActionText"
+ :items="actionItems"
+ :disabled="!canAddCluster"
+ text-sr-only
+ />
+ </gl-button-group>
</div>
</template>
diff --git a/app/assets/javascripts/comment_templates/components/app.vue b/app/assets/javascripts/comment_templates/components/app.vue
index 9e0d2cc73ec..de3229acc78 100644
--- a/app/assets/javascripts/comment_templates/components/app.vue
+++ b/app/assets/javascripts/comment_templates/components/app.vue
@@ -3,21 +3,21 @@ export default {};
</script>
<template>
- <div class="row gl-mt-5">
- <div class="col-lg-4">
- <h4 class="gl-mt-0">
- {{ __('Comment templates') }}
- </h4>
- <p>
- {{
- __(
- 'Comment templates can be used when creating comments inside issues, merge requests, and epics.',
- )
- }}
- </p>
- </div>
- <div class="col-lg-8">
- <keep-alive><router-view /></keep-alive>
+ <div class="settings-section gl-mt-3">
+ <div class="settings-sticky-header">
+ <div class="settings-sticky-header-inner">
+ <h4 class="gl-my-0">
+ {{ __('Comment templates') }}
+ </h4>
+ </div>
</div>
+ <p class="gl-text-secondary">
+ {{
+ __(
+ 'Comment templates can be used when creating comments inside issues, merge requests, and epics.',
+ )
+ }}
+ </p>
+ <keep-alive><router-view /></keep-alive>
</div>
</template>
diff --git a/app/assets/javascripts/comment_templates/components/form.vue b/app/assets/javascripts/comment_templates/components/form.vue
index 47efccc3d0c..6bdf1b313cb 100644
--- a/app/assets/javascripts/comment_templates/components/form.vue
+++ b/app/assets/javascripts/comment_templates/components/form.vue
@@ -112,7 +112,7 @@ export default {
<template>
<gl-form
- class="new-note common-note-form gl-mb-6"
+ class="new-note common-note-form"
data-testid="comment-template-form"
@submit.prevent="onSubmit"
>
diff --git a/app/assets/javascripts/comment_templates/components/list.vue b/app/assets/javascripts/comment_templates/components/list.vue
index 52bebfd050c..46d6b49297d 100644
--- a/app/assets/javascripts/comment_templates/components/list.vue
+++ b/app/assets/javascripts/comment_templates/components/list.vue
@@ -44,14 +44,18 @@ export default {
</script>
<template>
- <div class="gl-border-t gl-pt-4">
+ <div class="settings-section">
<gl-loading-icon v-if="loading" size="lg" />
<template v-else>
- <h5 class="gl-font-lg" data-testid="title">
- <gl-sprintf :message="__('My comment templates (%{count})')">
- <template #count>{{ count }}</template>
- </gl-sprintf>
- </h5>
+ <div class="settings-sticky-header">
+ <div class="settings-sticky-header-inner">
+ <h4 class="gl-my-0" data-testid="title">
+ <gl-sprintf :message="__('My comment templates (%{count})')">
+ <template #count>{{ count }}</template>
+ </gl-sprintf>
+ </h4>
+ </div>
+ </div>
<ul class="gl-list-style-none gl-p-0 gl-m-0">
<list-item v-for="template in savedReplies" :key="template.id" :template="template" />
</ul>
diff --git a/app/assets/javascripts/comment_templates/components/list_item.vue b/app/assets/javascripts/comment_templates/components/list_item.vue
index d763700db42..70ba449113b 100644
--- a/app/assets/javascripts/comment_templates/components/list_item.vue
+++ b/app/assets/javascripts/comment_templates/components/list_item.vue
@@ -94,7 +94,7 @@ export default {
</gl-tooltip>
</div>
</div>
- <div class="gl-mt-3 gl-font-monospace">{{ template.content }}</div>
+ <div class="gl-mt-3 gl-font-monospace gl-white-space-pre-wrap">{{ template.content }}</div>
<gl-modal
ref="delete-modal"
:title="__('Delete comment template')"
diff --git a/app/assets/javascripts/comment_templates/pages/index.vue b/app/assets/javascripts/comment_templates/pages/index.vue
index 72a94dafc58..daa4ba689a7 100644
--- a/app/assets/javascripts/comment_templates/pages/index.vue
+++ b/app/assets/javascripts/comment_templates/pages/index.vue
@@ -52,10 +52,12 @@ export default {
<template>
<div>
- <h5 class="gl-mt-0 gl-font-lg">
- {{ __('Add new comment template') }}
- </h5>
- <create-form @saved="refetchSavedReplies" />
+ <div class="settings-section">
+ <h5 class="gl-mt-0 gl-font-lg">
+ {{ __('Add new comment template') }}
+ </h5>
+ <create-form @saved="refetchSavedReplies" />
+ </div>
<list
:loading="$apollo.queries.savedReplies.loading"
:saved-replies="savedReplies"
diff --git a/app/assets/javascripts/content_editor/components/bubble_menus/bubble_menu.vue b/app/assets/javascripts/content_editor/components/bubble_menus/bubble_menu.vue
index ce5b566ba20..948c58287fb 100644
--- a/app/assets/javascripts/content_editor/components/bubble_menus/bubble_menu.vue
+++ b/app/assets/javascripts/content_editor/components/bubble_menus/bubble_menu.vue
@@ -44,7 +44,7 @@ export default {
this.menuVisible = false;
},
strategy: 'fixed',
- maxWidth: 'auto',
+ maxWidth: '400px',
},
}),
);
diff --git a/app/assets/javascripts/content_editor/components/bubble_menus/media_bubble_menu.vue b/app/assets/javascripts/content_editor/components/bubble_menus/media_bubble_menu.vue
index 6bb6bdc4e65..6ce6e731551 100644
--- a/app/assets/javascripts/content_editor/components/bubble_menus/media_bubble_menu.vue
+++ b/app/assets/javascripts/content_editor/components/bubble_menus/media_bubble_menu.vue
@@ -69,7 +69,6 @@ export default {
mediaSrc: undefined,
mediaCanonicalSrc: undefined,
mediaAlt: undefined,
- mediaTitle: undefined,
isEditing: false,
isUpdating: false,
@@ -130,16 +129,13 @@ export default {
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();
+ const attrs = {
+ src: this.mediaSrc,
+ alt: this.mediaAlt,
+ canonicalSrc: this.mediaCanonicalSrc,
+ };
+
+ this.tiptapEditor.chain().focus().updateAttributes(this.mediaType, attrs).run();
this.tiptapEditor.commands.setNodeSelection(position);
@@ -155,13 +151,11 @@ export default {
this.isUpdating = true;
- const { src, title, alt, canonicalSrc, uploading } = this.tiptapEditor.getAttributes(
- this.mediaType,
- );
+ const { src, alt, canonicalSrc, uploading } = this.tiptapEditor.getAttributes(this.mediaType);
- this.mediaTitle = title;
this.mediaAlt = alt;
this.mediaCanonicalSrc = canonicalSrc || src;
+
this.uploading = uploading;
this.mediaSrc = await this.contentEditor.resolveUrl(this.mediaCanonicalSrc);
@@ -177,7 +171,6 @@ export default {
},
resetMediaInfo() {
- this.mediaTitle = null;
this.mediaAlt = null;
this.mediaCanonicalSrc = null;
this.uploading = false;
@@ -248,7 +241,6 @@ export default {
data-qa-selector="file_upload_field"
@change="onFileSelect"
/>
-
<gl-link
v-if="!showProgressIndicator"
v-gl-tooltip
@@ -261,17 +253,6 @@ export default {
{{ 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"
@@ -290,8 +271,8 @@ export default {
category="tertiary"
size="medium"
data-testid="edit-diagram"
- :aria-label="replaceLabel"
- title="Edit diagram"
+ :aria-label="editLabel"
+ :title="editLabel"
icon="diagram"
@click="editDiagram"
/>
@@ -307,28 +288,14 @@ export default {
icon="retry"
@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-group :label="__('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"
diff --git a/app/assets/javascripts/content_editor/components/content_editor.vue b/app/assets/javascripts/content_editor/components/content_editor.vue
index 92f3c3fb8fa..1036b6552d1 100644
--- a/app/assets/javascripts/content_editor/components/content_editor.vue
+++ b/app/assets/javascripts/content_editor/components/content_editor.vue
@@ -1,8 +1,9 @@
<script>
+import { GlButton, GlTooltipDirective } from '@gitlab/ui';
import { EditorContent as TiptapEditorContent } from '@tiptap/vue-2';
-import { GlSprintf, GlLink } from '@gitlab/ui';
-import { __, s__ } from '~/locale';
+import { __ } from '~/locale';
import { VARIANT_DANGER } from '~/alert';
+import EditorModeSwitcher from '~/vue_shared/components/markdown/editor_mode_switcher.vue';
import { createContentEditor } from '../services/create_content_editor';
import { ALERT_EVENT, TIPTAP_AUTOFOCUS_OPTIONS } from '../constants';
import ContentEditorAlert from './content_editor_alert.vue';
@@ -17,8 +18,7 @@ import LoadingIndicator from './loading_indicator.vue';
export default {
components: {
- GlSprintf,
- GlLink,
+ GlButton,
LoadingIndicator,
ContentEditorAlert,
ContentEditorProvider,
@@ -29,12 +29,20 @@ export default {
MediaBubbleMenu,
EditorStateObserver,
ReferenceBubbleMenu,
+ EditorModeSwitcher,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
},
props: {
renderMarkdown: {
type: Function,
required: true,
},
+ markdownDocsPath: {
+ type: String,
+ required: true,
+ },
uploadsPath: {
type: String,
required: true,
@@ -65,16 +73,21 @@ export default {
default: false,
validator: (autofocus) => TIPTAP_AUTOFOCUS_OPTIONS.includes(autofocus),
},
- quickActionsDocsPath: {
- type: String,
+ supportsQuickActions: {
+ type: Boolean,
required: false,
- default: '',
+ default: false,
},
drawioEnabled: {
type: Boolean,
required: false,
default: false,
},
+ codeSuggestionsConfig: {
+ type: Object,
+ required: false,
+ default: () => ({}),
+ },
editable: {
type: Boolean,
required: false,
@@ -129,6 +142,7 @@ export default {
editable,
enableAutocomplete,
autocompleteDataSources,
+ codeSuggestionsConfig,
} = this;
// This is a non-reactive attribute intentionally since this is a complex object.
@@ -140,6 +154,7 @@ export default {
drawioEnabled,
enableAutocomplete,
autocompleteDataSources,
+ codeSuggestionsConfig,
tiptapOptions: {
autofocus,
editable,
@@ -204,17 +219,15 @@ export default {
markdown: this.latestMarkdown,
});
},
- },
- i18n: {
- quickActionsText: s__(
- 'ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}.',
- ),
+ handleEditorModeChanged() {
+ this.$emit('enableMarkdownEditor');
+ },
},
};
</script>
<template>
<content-editor-provider :content-editor="contentEditor">
- <div>
+ <div class="md-area gl-overflow-hidden">
<editor-state-observer
@docUpdate="notifyChange"
@focus="focus"
@@ -225,11 +238,11 @@ export default {
<div
data-testid="content-editor"
data-qa-selector="content_editor_container"
- class="md-area gl-border-none! gl-shadow-none!"
:class="{ 'is-focused': focused }"
>
<formatting-toolbar
ref="toolbar"
+ :supports-quick-actions="supportsQuickActions"
:hide-attachment-button="disableAttachments"
@enableMarkdownEditor="$emit('enableMarkdownEditor')"
/>
@@ -237,7 +250,7 @@ export default {
{{ placeholder }}
</div>
<tiptap-editor-content
- class="md gl-px-5"
+ class="md"
data-testid="content_editor_editablebox"
:editor="contentEditor.tiptapEditor"
/>
@@ -249,21 +262,19 @@ export default {
<reference-bubble-menu />
</div>
<div
- v-if="quickActionsDocsPath"
- class="gl-display-flex gl-align-items-center gl-rounded-bottom-left-base gl-rounded-bottom-right-base gl-px-4 gl-mx-2 gl-mb-2 gl-bg-gray-10 gl-text-secondary"
+ class="gl-display-flex gl-display-flex gl-flex-direction-row gl-justify-content-space-between gl-align-items-center gl-rounded-bottom-left-base gl-rounded-bottom-right-base gl-px-2 gl-border-t gl-border-gray-100 gl-text-secondary"
>
- <div class="gl-w-full gl-line-height-32 gl-font-sm">
- <gl-sprintf :message="$options.i18n.quickActionsText">
- <template #keyboard="{ content }">
- <kbd>{{ content }}</kbd>
- </template>
- <template #quickActionsDocsLink="{ content }">
- <gl-link :href="quickActionsDocsPath" target="_blank" class="gl-font-sm">{{
- content
- }}</gl-link>
- </template>
- </gl-sprintf>
- </div>
+ <editor-mode-switcher size="small" value="richText" @switch="handleEditorModeChanged" />
+ <gl-button
+ v-gl-tooltip
+ icon="markdown-mark"
+ :href="markdownDocsPath"
+ target="_blank"
+ category="tertiary"
+ size="small"
+ title="Markdown is supported"
+ class="gl-px-3!"
+ />
</div>
</div>
</content-editor-provider>
diff --git a/app/assets/javascripts/content_editor/components/formatting_toolbar.vue b/app/assets/javascripts/content_editor/components/formatting_toolbar.vue
index c53007b68cf..dc27278d255 100644
--- a/app/assets/javascripts/content_editor/components/formatting_toolbar.vue
+++ b/app/assets/javascripts/content_editor/components/formatting_toolbar.vue
@@ -1,5 +1,7 @@
<script>
-import EditorModeSwitcher from '~/vue_shared/components/markdown/editor_mode_switcher.vue';
+import CommentTemplatesDropdown from '~/vue_shared/components/markdown/comment_templates_dropdown.vue';
+import { __, sprintf } from '~/locale';
+import { getModifierKey } from '~/constants';
import trackUIControl from '../services/track_ui_control';
import ToolbarButton from './toolbar_button.vue';
import ToolbarAttachmentButton from './toolbar_attachment_button.vue';
@@ -14,122 +16,179 @@ export default {
ToolbarTableButton,
ToolbarAttachmentButton,
ToolbarMoreDropdown,
- EditorModeSwitcher,
+ CommentTemplatesDropdown,
+ },
+ inject: {
+ newCommentTemplatePath: { default: null },
+ tiptapEditor: { default: null },
+ contentEditor: { default: null },
},
props: {
+ supportsQuickActions: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
hideAttachmentButton: {
type: Boolean,
default: false,
required: false,
},
},
+ data() {
+ const modifierKey = getModifierKey();
+ const shiftKey = modifierKey === '⌘' ? '⇧' : 'Shift+';
+
+ return {
+ i18n: {
+ bold: sprintf(__('Bold (%{modifierKey}B)'), { modifierKey }),
+ italic: sprintf(__('Italic (%{modifierKey}I)'), { modifierKey }),
+ strike: sprintf(__('Strikethrough (%{modifierKey}%{shiftKey}X)'), {
+ modifierKey,
+ shiftKey,
+ }),
+ quote: __('Insert a quote'),
+ code: __('Code'),
+ link: sprintf(__('Insert link (%{modifierKey}K)'), { modifierKey }),
+ bulletList: __('Add a bullet list'),
+ numberedList: __('Add a numbered list'),
+ taskList: __('Add a checklist'),
+ },
+ };
+ },
+ computed: {
+ codeSuggestionsEnabled() {
+ return this.contentEditor.codeSuggestionsConfig?.canSuggest;
+ },
+ },
methods: {
trackToolbarControlExecution({ contentType, value }) {
trackUIControl({ property: contentType, value });
},
- handleEditorModeChanged() {
- this.$emit('enableMarkdownEditor');
+ insertSavedReply(savedReply) {
+ this.tiptapEditor.chain().focus().pasteContent(savedReply).run();
},
},
};
</script>
<template>
- <div class="gl-mx-2 gl-mt-2">
- <div
- class="gl-w-full gl-display-flex gl-align-items-center gl-flex-wrap gl-bg-gray-50 gl-px-2 gl-rounded-base gl-justify-content-space-between"
- data-testid="formatting-toolbar"
- >
- <div class="gl-py-2 gl-display-flex gl-flex-wrap">
- <toolbar-text-style-dropdown
- data-testid="text-styles"
- @execute="trackToolbarControlExecution"
- />
- <toolbar-button
- data-testid="bold"
- content-type="bold"
- icon-name="bold"
- editor-command="toggleBold"
- :label="__('Bold text')"
- @execute="trackToolbarControlExecution"
- />
- <toolbar-button
- data-testid="italic"
- content-type="italic"
- icon-name="italic"
- editor-command="toggleItalic"
- :label="__('Italic text')"
- @execute="trackToolbarControlExecution"
- />
- <toolbar-button
- data-testid="strike"
- content-type="strike"
- icon-name="strikethrough"
- editor-command="toggleStrike"
- :label="__('Strikethrough')"
- @execute="trackToolbarControlExecution"
- />
- <toolbar-button
- data-testid="blockquote"
- content-type="blockquote"
- icon-name="quote"
- editor-command="toggleBlockquote"
- :label="__('Insert a quote')"
- @execute="trackToolbarControlExecution"
- />
- <toolbar-button
- data-testid="code"
- content-type="code"
- icon-name="code"
- editor-command="toggleCode"
- :label="__('Code')"
- @execute="trackToolbarControlExecution"
- />
- <toolbar-button
- data-testid="link"
- content-type="link"
- icon-name="link"
- editor-command="editLink"
- :label="__('Insert link')"
- @execute="trackToolbarControlExecution"
- />
- <toolbar-button
- data-testid="bullet-list"
- content-type="bulletList"
- icon-name="list-bulleted"
- class="gl-display-none gl-sm-display-inline"
- editor-command="toggleBulletList"
- :label="__('Add a bullet list')"
- @execute="trackToolbarControlExecution"
- />
- <toolbar-button
- data-testid="ordered-list"
- content-type="orderedList"
- icon-name="list-numbered"
- class="gl-display-none gl-sm-display-inline"
- editor-command="toggleOrderedList"
- :label="__('Add a numbered list')"
- @execute="trackToolbarControlExecution"
- />
- <toolbar-button
- data-testid="task-list"
- content-type="taskList"
- icon-name="list-task"
- class="gl-display-none gl-sm-display-inline"
- editor-command="toggleTaskList"
- :label="__('Add a checklist')"
- @execute="trackToolbarControlExecution"
- />
- <toolbar-table-button data-testid="table" @execute="trackToolbarControlExecution" />
- <toolbar-attachment-button
- v-if="!hideAttachmentButton"
- data-testid="attachment"
- @execute="trackToolbarControlExecution"
- />
- <toolbar-more-dropdown data-testid="more" @execute="trackToolbarControlExecution" />
- </div>
- <div class="content-editor-switcher gl-display-flex gl-align-items-center gl-ml-auto">
- <editor-mode-switcher size="small" value="richText" @input="handleEditorModeChanged" />
- </div>
+ <div
+ class="gl-w-full gl-display-flex gl-align-items-center gl-flex-wrap gl-border-b gl-border-gray-100 gl-px-3 gl-rounded-top-base gl-justify-content-space-between"
+ data-testid="formatting-toolbar"
+ >
+ <div class="gl-py-3 gl-display-flex gl-flex-wrap">
+ <toolbar-text-style-dropdown
+ data-testid="text-styles"
+ @execute="trackToolbarControlExecution"
+ />
+ <toolbar-button
+ v-if="codeSuggestionsEnabled"
+ data-testid="code-suggestion"
+ content-type="codeSuggestion"
+ icon-name="doc-code"
+ editor-command="insertCodeSuggestion"
+ :label="__('Insert suggestion')"
+ :show-active-state="false"
+ @execute="trackToolbarControlExecution"
+ />
+ <toolbar-button
+ data-testid="bold"
+ content-type="bold"
+ icon-name="bold"
+ editor-command="toggleBold"
+ :label="i18n.bold"
+ @execute="trackToolbarControlExecution"
+ />
+ <toolbar-button
+ data-testid="italic"
+ content-type="italic"
+ icon-name="italic"
+ editor-command="toggleItalic"
+ :label="i18n.italic"
+ @execute="trackToolbarControlExecution"
+ />
+ <toolbar-button
+ data-testid="strike"
+ content-type="strike"
+ icon-name="strikethrough"
+ editor-command="toggleStrike"
+ :label="i18n.strike"
+ @execute="trackToolbarControlExecution"
+ />
+ <toolbar-button
+ data-testid="blockquote"
+ content-type="blockquote"
+ icon-name="quote"
+ editor-command="toggleBlockquote"
+ :label="i18n.quote"
+ @execute="trackToolbarControlExecution"
+ />
+ <toolbar-button
+ data-testid="code"
+ content-type="code"
+ icon-name="code"
+ editor-command="toggleCode"
+ :label="i18n.code"
+ @execute="trackToolbarControlExecution"
+ />
+ <toolbar-button
+ data-testid="link"
+ content-type="link"
+ icon-name="link"
+ editor-command="editLink"
+ :label="i18n.link"
+ @execute="trackToolbarControlExecution"
+ />
+ <toolbar-button
+ data-testid="bullet-list"
+ content-type="bulletList"
+ icon-name="list-bulleted"
+ class="gl-display-none gl-sm-display-inline"
+ editor-command="toggleBulletList"
+ :label="i18n.bulletList"
+ @execute="trackToolbarControlExecution"
+ />
+ <toolbar-button
+ data-testid="ordered-list"
+ content-type="orderedList"
+ icon-name="list-numbered"
+ class="gl-display-none gl-sm-display-inline"
+ editor-command="toggleOrderedList"
+ :label="i18n.numberedList"
+ @execute="trackToolbarControlExecution"
+ />
+ <toolbar-button
+ data-testid="task-list"
+ content-type="taskList"
+ icon-name="list-task"
+ class="gl-display-none gl-sm-display-inline"
+ editor-command="toggleTaskList"
+ :label="i18n.taskList"
+ @execute="trackToolbarControlExecution"
+ />
+ <toolbar-table-button data-testid="table" @execute="trackToolbarControlExecution" />
+ <toolbar-attachment-button
+ v-if="!hideAttachmentButton"
+ data-testid="attachment"
+ @execute="trackToolbarControlExecution"
+ />
+ <!-- TODO Add icon and trigger functionality from here -->
+ <toolbar-button
+ v-if="supportsQuickActions"
+ data-testid="quick-actions"
+ content-type="quickAction"
+ icon-name="quick-actions"
+ class="gl-display-none gl-sm-display-inline"
+ editor-command="insertQuickAction"
+ :label="__('Add a quick action')"
+ @execute="trackToolbarControlExecution"
+ />
+ <comment-templates-dropdown
+ v-if="newCommentTemplatePath"
+ :new-comment-template-path="newCommentTemplatePath"
+ @select="insertSavedReply"
+ />
+ <toolbar-more-dropdown data-testid="more" @execute="trackToolbarControlExecution" />
</div>
</div>
</template>
diff --git a/app/assets/javascripts/content_editor/components/suggestions_dropdown.vue b/app/assets/javascripts/content_editor/components/suggestions_dropdown.vue
index 4074e50a706..6535d9eaa5d 100644
--- a/app/assets/javascripts/content_editor/components/suggestions_dropdown.vue
+++ b/app/assets/javascripts/content_editor/components/suggestions_dropdown.vue
@@ -1,9 +1,8 @@
<script>
-import { GlDropdownItem, GlAvatarLabeled, GlLoadingIcon } from '@gitlab/ui';
+import { GlAvatarLabeled, GlLoadingIcon } from '@gitlab/ui';
export default {
components: {
- GlDropdownItem,
GlAvatarLabeled,
GlLoadingIcon,
},
@@ -43,7 +42,7 @@ export default {
data() {
return {
- selectedIndex: 0,
+ selectedIndex: -1,
};
},
@@ -95,7 +94,7 @@ export default {
watch: {
items() {
- this.selectedIndex = 0;
+ this.selectedIndex = -1;
},
selectedIndex() {
this.scrollIntoView();
@@ -193,7 +192,7 @@ export default {
},
scrollIntoView() {
- this.$refs.dropdownItems[this.selectedIndex].$el.scrollIntoView({ block: 'nearest' });
+ this.$refs.dropdownItems[this.selectedIndex]?.scrollIntoView({ block: 'nearest' });
},
selectItem(index) {
@@ -215,72 +214,83 @@ export default {
</script>
<template>
- <div>
- <ul
- v-if="!loading"
- :class="{ show: items.length > 0 }"
- class="gl-dropdown dropdown-menu gl-relative gl-m-0!"
- data-testid="content-editor-suggestions-dropdown"
+ <div class="gl-new-dropdown content-editor-suggestions-dropdown">
+ <div
+ v-if="!loading && items.length > 0"
+ class="gl-new-dropdown-panel gl-display-block! gl-absolute"
>
- <div class="gl-dropdown-inner gl-overflow-y-auto">
- <gl-dropdown-item
- v-for="(item, index) in items"
- ref="dropdownItems"
- :key="index"
- :class="{ 'gl-bg-gray-50': index === selectedIndex }"
- @click="selectItem(index)"
- >
- <gl-avatar-labeled
- v-if="isUser"
- :label="item.username"
- :sub-label="avatarSubLabel(item)"
- :src="item.avatar_url"
- :entity-name="item.username"
- :shape="item.type === 'Group' ? 'rect' : 'circle'"
- :size="32"
- />
- <span v-if="isIssue || isMergeRequest">
- <small>{{ item.iid }}</small>
- {{ item.title }}
- </span>
- <span v-if="isVulnerability || isSnippet">
- <small>{{ item.id }}</small>
- {{ item.title }}
- </span>
- <span v-if="isEpic">
- <small>{{ item.reference }}</small>
- {{ item.title }}
- </span>
- <span v-if="isMilestone">
- {{ item.title }}
- </span>
- <span v-if="isLabel" class="gl-display-flex gl-align-items-center">
- <span
- data-testid="label-color-box"
- class="gl-rounded-base gl-display-block gl-w-5 gl-h-5 gl-mr-3"
- :style="{ backgroundColor: item.color }"
- ></span>
- {{ item.title }}
- </span>
- <span v-if="isCommand">
- /{{ item.name }} <small> {{ item.params[0] }} </small><br />
- <em>
- <small> {{ item.description }} </small>
- </em>
- </span>
- <div v-if="isEmoji" class="gl-display-flex gl-align-items-center">
- <div class="gl-pr-4 gl-font-lg">{{ item.e }}</div>
- <div class="gl-flex-grow-1">
- {{ item.name }}<br />
- <small>{{ item.d }}</small>
+ <div class="gl-new-dropdown-inner">
+ <ul class="gl-new-dropdown-contents" data-testid="content-editor-suggestions-dropdown">
+ <li
+ v-for="(item, index) in items"
+ :key="index"
+ role="presentation"
+ class="gl-new-dropdown-item"
+ :class="{ focused: index === selectedIndex }"
+ >
+ <div
+ ref="dropdownItems"
+ type="button"
+ role="menuitem"
+ class="gl-new-dropdown-item-content"
+ @click="selectItem(index)"
+ >
+ <div class="gl-new-dropdown-item-text-wrapper">
+ <gl-avatar-labeled
+ v-if="isUser"
+ :label="item.username"
+ :sub-label="avatarSubLabel(item)"
+ :src="item.avatar_url"
+ :entity-name="item.username"
+ :shape="item.type === 'Group' ? 'rect' : 'circle'"
+ :size="32"
+ />
+ <span v-if="isIssue || isMergeRequest">
+ <small>{{ item.iid }}</small>
+ {{ item.title }}
+ </span>
+ <span v-if="isVulnerability || isSnippet">
+ <small>{{ item.id }}</small>
+ {{ item.title }}
+ </span>
+ <span v-if="isEpic">
+ <small>{{ item.reference }}</small>
+ {{ item.title }}
+ </span>
+ <span v-if="isMilestone">
+ {{ item.title }}
+ </span>
+ <span v-if="isLabel" class="gl-display-flex">
+ <span
+ data-testid="label-color-box"
+ class="dropdown-label-box gl-flex-shrink-0 gl-top-0 gl-mr-3"
+ :style="{ backgroundColor: item.color }"
+ ></span>
+ {{ item.title }}
+ </span>
+ <div v-if="isCommand">
+ <div class="gl-mb-1">
+ <span class="gl-font-weight-bold">/{{ item.name }}</span>
+ <em class="gl-text-gray-500 gl-font-sm">{{ item.params[0] }}</em>
+ </div>
+ <small class="gl-text-gray-500"> {{ item.description }} </small>
+ </div>
+ <div v-if="isEmoji" class="gl-display-flex gl-align-items-center">
+ <div class="gl-pr-4 gl-font-lg">{{ item.e }}</div>
+ <div class="gl-flex-grow-1">
+ {{ item.name }}<br />
+ <small>{{ item.d }}</small>
+ </div>
+ </div>
+ </div>
</div>
- </div>
- </gl-dropdown-item>
+ </li>
+ </ul>
</div>
- </ul>
- <div v-if="loading" class="gl-dropdown show dropdown-menu gl-relative gl-m-0!">
- <div class="gl-dropdown-inner gl-overflow-y-auto">
- <div class="gl-px-5">
+ </div>
+ <div v-if="loading" class="gl-new-dropdown-panel gl-display-block! gl-absolute">
+ <div class="gl-new-dropdown-inner">
+ <div class="gl-px-4 gl-py-3">
<gl-loading-icon size="sm" class="gl-display-inline-block" /> {{ __('Loading...') }}
</div>
</div>
diff --git a/app/assets/javascripts/content_editor/components/toolbar_attachment_button.vue b/app/assets/javascripts/content_editor/components/toolbar_attachment_button.vue
index 1e13c17bc38..4cf150dd948 100644
--- a/app/assets/javascripts/content_editor/components/toolbar_attachment_button.vue
+++ b/app/assets/javascripts/content_editor/components/toolbar_attachment_button.vue
@@ -47,6 +47,7 @@ export default {
category="tertiary"
icon="paperclip"
size="small"
+ class="gl-mr-3"
lazy
@click="openFileUpload"
/>
diff --git a/app/assets/javascripts/content_editor/components/toolbar_button.vue b/app/assets/javascripts/content_editor/components/toolbar_button.vue
index a62f66d8557..60bfaab25a5 100644
--- a/app/assets/javascripts/content_editor/components/toolbar_button.vue
+++ b/app/assets/javascripts/content_editor/components/toolbar_button.vue
@@ -49,6 +49,11 @@ export default {
required: false,
default: 'small',
},
+ showActiveState: {
+ type: Boolean,
+ required: false,
+ default: true,
+ },
},
data() {
return {
@@ -78,7 +83,7 @@ export default {
:variant="variant"
:category="category"
:size="size"
- :class="{ 'gl-bg-gray-100!': isActive }"
+ :class="{ 'gl-bg-gray-100!': showActiveState && isActive }"
:aria-label="label"
:title="label"
:icon="iconName"
diff --git a/app/assets/javascripts/content_editor/components/toolbar_more_dropdown.vue b/app/assets/javascripts/content_editor/components/toolbar_more_dropdown.vue
index 99ba8c51948..b7f419d5840 100644
--- a/app/assets/javascripts/content_editor/components/toolbar_more_dropdown.vue
+++ b/app/assets/javascripts/content_editor/components/toolbar_more_dropdown.vue
@@ -15,10 +15,6 @@ export default {
toggleId: uniqueId('dropdown-toggle-btn-'),
items: [
{
- text: __('Comment'),
- action: () => this.insert('comment'),
- },
- {
text: __('Code block'),
action: () => this.insert('codeBlock'),
},
diff --git a/app/assets/javascripts/content_editor/components/toolbar_table_button.vue b/app/assets/javascripts/content_editor/components/toolbar_table_button.vue
index eb7985f628a..ab1546b9016 100644
--- a/app/assets/javascripts/content_editor/components/toolbar_table_button.vue
+++ b/app/assets/javascripts/content_editor/components/toolbar_table_button.vue
@@ -1,5 +1,6 @@
<script>
-import { GlDisclosureDropdown, GlButton, GlTooltipDirective as GlTooltip } from '@gitlab/ui';
+import { GlDisclosureDropdown, GlButton, GlTooltip } from '@gitlab/ui';
+import { uniqueId } from 'lodash';
import { __, sprintf } from '~/locale';
import { clamp } from '../services/utils';
@@ -14,13 +15,12 @@ export default {
components: {
GlButton,
GlDisclosureDropdown,
- },
- directives: {
GlTooltip,
},
inject: ['tiptapEditor'],
data() {
return {
+ toggleId: uniqueId('dropdown-toggle-btn-'),
maxRows: MIN_ROWS,
maxCols: MIN_COLS,
rows: 1,
@@ -82,43 +82,47 @@ export default {
};
</script>
<template>
- <gl-disclosure-dropdown
- ref="dropdown"
- v-gl-tooltip
- size="small"
- category="tertiary"
- icon="table"
- :aria-label="__('Insert table')"
- :toggle-text="__('Insert table')"
- positioning-strategy="fixed"
- class="content-editor-table-dropdown"
- text-sr-only
- :fluid-width="true"
- @shown="setFocus(1, 1)"
- >
- <div
- class="gl-p-3 gl-pt-2"
- role="grid"
- :aria-colcount="$options.MAX_COLS"
- :aria-rowcount="$options.MAX_ROWS"
+ <div class="gl-display-inline-flex gl-vertical-align-middle">
+ <gl-disclosure-dropdown
+ ref="dropdown"
+ :toggle-id="toggleId"
+ size="small"
+ category="tertiary"
+ icon="table"
+ no-caret
+ :aria-label="__('Insert table')"
+ :toggle-text="__('Insert table')"
+ positioning-strategy="fixed"
+ class="content-editor-table-dropdown gl-mr-3"
+ text-sr-only
+ :fluid-width="true"
+ @shown="setFocus(1, 1)"
>
- <div v-for="r of list(maxRows)" :key="r" class="gl-display-flex" role="row">
- <div v-for="c of list(maxCols)" :key="c" role="gridcell">
- <gl-button
- :ref="`table-${r}-${c}`"
- :class="{ 'active gl-bg-blue-50!': r <= rows && c <= cols }"
- :aria-label="getButtonLabel(r, c)"
- class="table-creator-grid-item gl-display-inline gl-rounded-0! gl-w-6! gl-h-6! gl-p-0!"
- @mouseover="setRowsAndCols(r, c)"
- @focus="setRowsAndCols(r, c)"
- @click="insertTable()"
- @keydown="onKeydown($event.key)"
- />
+ <div
+ class="gl-p-3 gl-pt-2"
+ role="grid"
+ :aria-colcount="$options.MAX_COLS"
+ :aria-rowcount="$options.MAX_ROWS"
+ >
+ <div v-for="r of list(maxRows)" :key="r" class="gl-display-flex" role="row">
+ <div v-for="c of list(maxCols)" :key="c" role="gridcell">
+ <gl-button
+ :ref="`table-${r}-${c}`"
+ :class="{ 'active gl-bg-blue-50!': r <= rows && c <= cols }"
+ :aria-label="getButtonLabel(r, c)"
+ class="table-creator-grid-item gl-display-inline gl-rounded-0! gl-w-6! gl-h-6! gl-p-0!"
+ @mouseover="setRowsAndCols(r, c)"
+ @focus="setRowsAndCols(r, c)"
+ @click="insertTable()"
+ @keydown="onKeydown($event.key)"
+ />
+ </div>
</div>
</div>
- </div>
- <div class="gl-border-t gl-px-4 gl-pt-3 gl-pb-2">
- {{ getButtonLabel(rows, cols) }}
- </div>
- </gl-disclosure-dropdown>
+ <div class="gl-border-t gl-px-4 gl-pt-3 gl-pb-2">
+ {{ getButtonLabel(rows, cols) }}
+ </div>
+ </gl-disclosure-dropdown>
+ <gl-tooltip :target="toggleId" placement="top">{{ __('Insert table') }}</gl-tooltip>
+ </div>
</template>
diff --git a/app/assets/javascripts/content_editor/components/wrappers/code_block.vue b/app/assets/javascripts/content_editor/components/wrappers/code_block.vue
index 4a3dfe3656c..efd0926d7ed 100644
--- a/app/assets/javascripts/content_editor/components/wrappers/code_block.vue
+++ b/app/assets/javascripts/content_editor/components/wrappers/code_block.vue
@@ -1,20 +1,33 @@
<script>
import { debounce } from 'lodash';
+import { GlButton, GlTooltipDirective as GlTooltip, GlSprintf } from '@gitlab/ui';
import { NodeViewWrapper, NodeViewContent } from '@tiptap/vue-2';
-import { __ } from '~/locale';
import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
import SandboxedMermaid from '~/behaviors/components/sandboxed_mermaid.vue';
import codeBlockLanguageLoader from '../../services/code_block_language_loader';
import EditorStateObserver from '../editor_state_observer.vue';
+import { memoizedGet } from '../../services/utils';
+import {
+ lineOffsetToLangParams,
+ langParamsToLineOffset,
+ toAbsoluteLineOffset,
+ getLines,
+ appendNewlines,
+} from '../../services/code_suggestion_utils';
export default {
name: 'CodeBlock',
components: {
+ GlButton,
+ GlSprintf,
NodeViewWrapper,
NodeViewContent,
EditorStateObserver,
SandboxedMermaid,
},
+ directives: {
+ GlTooltip,
+ },
inject: ['contentEditor'],
props: {
editor: {
@@ -39,13 +52,54 @@ export default {
return {
diagramUrl: '',
diagramSource: '',
+
+ allLines: [],
+ deletedLines: [],
+ addedLines: [],
};
},
+ computed: {
+ isCodeSuggestion() {
+ return (
+ this.node.attrs.isCodeSuggestion &&
+ this.contentEditor.codeSuggestionsConfig?.canSuggest &&
+ this.contentEditor.codeSuggestionsConfig?.diffFile
+ );
+ },
+ classList() {
+ return this.isCodeSuggestion
+ ? 'gl-p-0! suggestion-added-input'
+ : `gl-p-3 code highlight ${this.$options.userColorScheme}`;
+ },
+ lineOffset() {
+ return langParamsToLineOffset(this.node.attrs.langParams);
+ },
+ absoluteLineOffset() {
+ if (!this.contentEditor.codeSuggestionsConfig) return [0, 0];
+
+ const { new_line: n } = this.contentEditor.codeSuggestionsConfig.line;
+ return toAbsoluteLineOffset(this.lineOffset, n);
+ },
+ disableDecrementLineStart() {
+ return this.absoluteLineOffset[0] <= 1;
+ },
+ disableIncrementLineStart() {
+ return this.lineOffset[0] >= 0;
+ },
+ disableDecrementLineEnd() {
+ return this.lineOffset[1] <= 0;
+ },
+ disableIncrementLineEnd() {
+ return this.absoluteLineOffset[1] >= this.allLines.length - 1;
+ },
+ },
async mounted() {
- this.updateDiagramPreview = debounce(
- this.updateDiagramPreview,
- DEFAULT_DEBOUNCE_AND_THROTTLE_MS,
- );
+ if (this.isCodeSuggestion) {
+ await this.updateAllLines();
+ this.updateCodeSuggestion();
+ }
+
+ this.updateCodeBlock = debounce(this.updateCodeBlock, DEFAULT_DEBOUNCE_AND_THROTTLE_MS);
const lang = codeBlockLanguageLoader.findOrCreateLanguageBySyntax(this.node.attrs.language);
await codeBlockLanguageLoader.loadLanguage(lang.syntax);
@@ -53,7 +107,26 @@ export default {
this.updateAttributes({ language: this.node.attrs.language });
},
methods: {
- async updateDiagramPreview() {
+ async updateAllLines() {
+ const { diffFile } = this.contentEditor.codeSuggestionsConfig;
+ this.allLines = (await memoizedGet(diffFile.view_path.replace('/blob/', '/raw/'))).split(
+ '\n',
+ );
+ },
+ updateCodeSuggestion() {
+ this.deletedLines = appendNewlines(getLines(this.absoluteLineOffset, this.allLines));
+ this.addedLines = appendNewlines(
+ this.$refs.nodeViewContent?.$el.textContent.split('\n') || [],
+ );
+ },
+ updateNodeView() {
+ if (this.isCodeSuggestion) {
+ this.updateCodeSuggestion();
+ } else {
+ this.updateCodeBlock();
+ }
+ },
+ async updateCodeBlock() {
if (!this.node.attrs.showPreview) {
this.diagramSource = '';
return;
@@ -70,22 +143,34 @@ export default {
);
}
},
- },
- i18n: {
- frontmatter: __('frontmatter'),
+ updateLineOffset(deltaStart = 0, deltaEnd = 0) {
+ const { lineOffset } = this;
+
+ this.editor
+ .chain()
+ .updateAttributes('codeSuggestion', {
+ langParams: lineOffsetToLangParams([
+ lineOffset[0] + deltaStart,
+ lineOffset[1] + deltaEnd,
+ ]),
+ })
+ .run();
+ },
},
userColorScheme: gon.user_color_scheme,
};
</script>
<template>
- <editor-state-observer @transaction="updateDiagramPreview">
+ <editor-state-observer :debounce="0" @transaction="updateNodeView">
<node-view-wrapper
- :class="`content-editor-code-block gl-relative code highlight gl-p-3 ${$options.userColorScheme}`"
+ :class="classList"
+ class="content-editor-code-block gl-relative"
as="pre"
dir="auto"
>
<div
v-if="node.attrs.showPreview"
+ contenteditable="false"
class="gl-mt-n3! gl-ml-n4! gl-mr-n4! gl-mb-3 gl-bg-white! gl-p-4 gl-border-b-1 gl-border-b-solid gl-border-b-gray-100"
>
<sandboxed-mermaid v-if="node.attrs.language === 'mermaid'" :source="diagramSource" />
@@ -93,12 +178,108 @@ export default {
</div>
<span
v-if="node.attrs.isFrontmatter"
+ contenteditable="false"
data-testid="frontmatter-label"
class="gl-absolute gl-top-0 gl-right-3"
+ >{{ __('frontmatter') }}:{{ node.attrs.language }}</span
+ >
+ <div
+ v-if="isCodeSuggestion"
contenteditable="false"
- >{{ $options.i18n.frontmatter }}:{{ node.attrs.language }}</span
+ class="gl-relative gl-z-index-0"
+ data-testid="code-suggestion-box"
>
- <node-view-content ref="nodeViewContent" as="code" />
+ <div
+ class="md-suggestion-header gl-flex-wrap gl-z-index-1 gl-w-full gl-border-none! gl-font-regular gl-px-4 gl-py-3 gl-border-b-1! gl-border-b-solid! gl-mr-n10!"
+ >
+ <div class="gl-font-weight-bold gl-pr-3">
+ {{ __('Suggested change') }}
+ </div>
+
+ <div
+ class="gl-display-flex gl-flex-wrap gl-align-items-center gl-pl-3 gl-gap-2 gl-white-space-nowrap"
+ >
+ <gl-sprintf :message="__('From line %{line1} to %{line2}')">
+ <template #line1>
+ <div class="gl-display-flex gl-bg-gray-50 gl-rounded-base gl-mx-1">
+ <gl-button
+ size="small"
+ icon="dash"
+ variant="confirm"
+ category="tertiary"
+ data-testid="decrement-line-start"
+ :aria-label="__('Decrement suggestion line start')"
+ :disabled="disableDecrementLineStart"
+ @click="updateLineOffset(-1, 0)"
+ />
+ <div
+ class="flex gl-align-items-center gl-justify-content-center gl-px-3 monospace"
+ >
+ <strong>{{ absoluteLineOffset[0] }}</strong>
+ </div>
+ <gl-button
+ size="small"
+ icon="plus"
+ variant="confirm"
+ category="tertiary"
+ data-testid="increment-line-start"
+ :aria-label="__('Increment suggestion line start')"
+ :disabled="disableIncrementLineStart"
+ @click="updateLineOffset(1, 0)"
+ />
+ </div>
+ </template>
+ <template #line2>
+ <div class="gl-display-flex gl-bg-gray-50 gl-rounded-base gl-ml-1">
+ <gl-button
+ size="small"
+ icon="dash"
+ variant="confirm"
+ category="tertiary"
+ data-testid="decrement-line-end"
+ :aria-label="__('Decrement suggestion line end')"
+ :disabled="disableDecrementLineEnd"
+ @click="updateLineOffset(0, -1)"
+ />
+ <div
+ class="flex gl-align-items-center gl-justify-content-center gl-px-3 monospace"
+ >
+ <strong>{{ absoluteLineOffset[1] }}</strong>
+ </div>
+ <gl-button
+ size="small"
+ icon="plus"
+ variant="confirm"
+ category="tertiary"
+ data-testid="increment-line-end"
+ :aria-label="__('Increment suggestion line end')"
+ :disabled="disableIncrementLineEnd"
+ @click="updateLineOffset(0, 1)"
+ />
+ </div>
+ </template>
+ </gl-sprintf>
+ </div>
+ </div>
+
+ <div class="suggestion-deleted" data-testid="suggestion-deleted">
+ <code
+ v-for="(line, i) in deletedLines"
+ :key="i"
+ :data-line-number="absoluteLineOffset[0] + i"
+ >{{ line }}</code
+ >
+ </div>
+ <div class="suggestion-added gl-absolute" data-testid="suggestion-added">
+ <code
+ v-for="(line, i) in addedLines"
+ :key="i"
+ :data-line-number="absoluteLineOffset[0] + i"
+ >{{ line }}</code
+ >
+ </div>
+ </div>
+ <node-view-content ref="nodeViewContent" as="code" class="gl-relative gl-z-index-1" />
</node-view-wrapper>
</editor-state-observer>
</template>
diff --git a/app/assets/javascripts/content_editor/components/wrappers/image.vue b/app/assets/javascripts/content_editor/components/wrappers/image.vue
new file mode 100644
index 00000000000..0b80802d993
--- /dev/null
+++ b/app/assets/javascripts/content_editor/components/wrappers/image.vue
@@ -0,0 +1,103 @@
+<script>
+import { NodeViewWrapper } from '@tiptap/vue-2';
+
+export default {
+ name: 'ImageWrapper',
+ components: {
+ NodeViewWrapper,
+ },
+ props: {
+ getPos: {
+ type: Function,
+ required: true,
+ },
+ editor: {
+ type: Object,
+ required: true,
+ },
+ node: {
+ type: Object,
+ required: true,
+ },
+ selected: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ },
+ data() {
+ return {
+ dragData: {},
+ };
+ },
+ mounted() {
+ document.addEventListener('mousemove', this.onDrag);
+ document.addEventListener('mouseup', this.onDragEnd);
+ },
+ destroyed() {
+ document.removeEventListener('mousemove', this.onDrag);
+ document.removeEventListener('mouseup', this.onDragEnd);
+ },
+ methods: {
+ onDragStart(handle, event) {
+ this.dragData = {
+ handle,
+ startX: event.screenX,
+ startY: event.screenY,
+ width: this.$refs.image.width,
+ height: this.$refs.image.height,
+ };
+ },
+ onDrag(event) {
+ const { handle, startX, width, height } = this.dragData;
+ if (!handle) return;
+
+ const deltaX = event.screenX - startX;
+ const newWidth = handle.includes('w') ? width - deltaX : width + deltaX;
+ const newHeight = (height / width) * newWidth;
+
+ this.$refs.image.setAttribute('width', newWidth);
+ this.$refs.image.setAttribute('height', newHeight);
+ },
+ onDragEnd() {
+ const { handle } = this.dragData;
+ if (!handle) return;
+
+ this.dragData = {};
+
+ this.editor
+ .chain()
+ .focus()
+ .updateAttributes(this.node.type, {
+ width: this.$refs.image.width,
+ height: this.$refs.image.height,
+ })
+ .setNodeSelection(this.getPos())
+ .run();
+ },
+ },
+ resizeHandles: ['ne', 'nw', 'se', 'sw'],
+};
+</script>
+<template>
+ <node-view-wrapper as="span" class="gl-relative gl-display-inline-block">
+ <span
+ v-for="handle in $options.resizeHandles"
+ v-show="selected"
+ :key="handle"
+ class="image-resize"
+ :class="`image-resize-${handle}`"
+ :data-testid="`image-resize-${handle}`"
+ @mousedown="onDragStart(handle, $event)"
+ ></span>
+ <img
+ ref="image"
+ :src="node.attrs.src"
+ :alt="node.attrs.alt"
+ :title="node.attrs.title"
+ :width="node.attrs.width || 'auto'"
+ :height="node.attrs.height || 'auto'"
+ :class="{ 'ProseMirror-selectednode': selected }"
+ />
+ </node-view-wrapper>
+</template>
diff --git a/app/assets/javascripts/content_editor/components/wrappers/reference.vue b/app/assets/javascripts/content_editor/components/wrappers/reference.vue
index 2b4b9891c77..4ec477232d4 100644
--- a/app/assets/javascripts/content_editor/components/wrappers/reference.vue
+++ b/app/assets/javascripts/content_editor/components/wrappers/reference.vue
@@ -3,11 +3,12 @@ import { NodeViewWrapper } from '@tiptap/vue-2';
import { GlLink } from '@gitlab/ui';
export default {
- name: 'DetailsWrapper',
+ name: 'ReferenceWrapper',
components: {
NodeViewWrapper,
GlLink,
},
+ inject: ['contentEditor'],
props: {
node: {
type: Object,
@@ -19,6 +20,11 @@ export default {
default: false,
},
},
+ data() {
+ return {
+ href: '#',
+ };
+ },
computed: {
text() {
return this.node.attrs.text;
@@ -33,6 +39,11 @@ export default {
return gon.current_username === this.text.substring(1);
},
},
+ async mounted() {
+ const text = this.node.attrs.originalText || this.node.attrs.text;
+ const { href } = await this.contentEditor.resolveReference(text);
+ this.href = href || '';
+ },
};
</script>
<template>
@@ -40,7 +51,7 @@ export default {
<span v-if="isCommand">{{ text }}</span>
<gl-link
v-else
- href="#"
+ :href="href"
tabindex="-1"
class="gfm gl-cursor-text"
:class="{
diff --git a/app/assets/javascripts/content_editor/extensions/code_suggestion.js b/app/assets/javascripts/content_editor/extensions/code_suggestion.js
new file mode 100644
index 00000000000..c70a96769fb
--- /dev/null
+++ b/app/assets/javascripts/content_editor/extensions/code_suggestion.js
@@ -0,0 +1,81 @@
+import { lowlight } from 'lowlight/lib/core';
+import { textblockTypeInputRule } from '@tiptap/core';
+import { PARSE_HTML_PRIORITY_HIGHEST } from '../constants';
+import { memoizedGet } from '../services/utils';
+import CodeBlockHighlight from './code_block_highlight';
+
+const backtickInputRegex = /^```suggestion[\s\n]$/;
+
+export default CodeBlockHighlight.extend({
+ name: 'codeSuggestion',
+
+ isolating: true,
+
+ addOptions() {
+ return {
+ lowlight,
+ config: {},
+ };
+ },
+
+ addAttributes() {
+ return {
+ ...this.parent?.(),
+ language: {
+ default: 'suggestion',
+ },
+ isCodeSuggestion: {
+ default: true,
+ },
+ };
+ },
+
+ addCommands() {
+ const ext = this;
+
+ return {
+ insertCodeSuggestion: (attributes) => async ({ editor }) => {
+ // do not insert a new suggestion if already inside a suggestion
+ if (editor.isActive('codeSuggestion')) return false;
+
+ const rawPath = ext.options.config.diffFile.view_path.replace('/blob/', '/raw/');
+ const allLines = (await memoizedGet(rawPath)).split('\n');
+ const { line } = ext.options.config;
+ let { lines } = ext.options.config;
+
+ if (!lines.length) lines = [line];
+
+ const content = lines.map((l) => allLines[l.new_line - 1]).join('\n');
+ const lineNumbers = `-${lines.length - 1}+0`;
+
+ editor.commands.insertContent({
+ type: 'codeSuggestion',
+ attrs: { langParams: lineNumbers, ...attributes },
+ // empty strings are not allowed in text nodes
+ content: [{ type: 'text', text: content || ' ' }],
+ });
+
+ return true;
+ },
+ };
+ },
+
+ parseHTML() {
+ return [
+ {
+ priority: PARSE_HTML_PRIORITY_HIGHEST,
+ tag: 'pre[lang="suggestion"]',
+ },
+ ];
+ },
+
+ addInputRules() {
+ return [
+ textblockTypeInputRule({
+ find: backtickInputRegex,
+ type: this.type,
+ getAttributes: () => ({ language: 'suggestion', langParams: '-0+0' }),
+ }),
+ ];
+ },
+});
diff --git a/app/assets/javascripts/content_editor/extensions/comment.js b/app/assets/javascripts/content_editor/extensions/comment.js
deleted file mode 100644
index 8e247e552a3..00000000000
--- a/app/assets/javascripts/content_editor/extensions/comment.js
+++ /dev/null
@@ -1,49 +0,0 @@
-import { Node, textblockTypeInputRule } from '@tiptap/core';
-
-export const commentInputRegex = /^<!--[\s\n]$/;
-
-export default Node.create({
- name: 'comment',
- content: 'text*',
- marks: '',
- group: 'block',
- code: true,
- isolating: true,
- defining: true,
-
- parseHTML() {
- return [
- {
- tag: 'comment',
- preserveWhitespace: 'full',
- getContent(element, schema) {
- const node = schema.node('paragraph', {}, [
- schema.text(
- element.textContent.replace(/&#x([0-9A-F]{2,4});/gi, (_, code) =>
- String.fromCharCode(parseInt(code, 16)),
- ) || ' ',
- ),
- ]);
- return node.content;
- },
- },
- ];
- },
-
- renderHTML() {
- return [
- 'pre',
- { class: 'gl-p-0 gl-border-0 gl-bg-transparent gl-text-gray-300' },
- ['span', { class: 'content-editor-comment' }, 0],
- ];
- },
-
- addInputRules() {
- return [
- textblockTypeInputRule({
- find: commentInputRegex,
- type: this.type,
- }),
- ];
- },
-});
diff --git a/app/assets/javascripts/content_editor/extensions/copy_paste.js b/app/assets/javascripts/content_editor/extensions/copy_paste.js
new file mode 100644
index 00000000000..f484ce98e90
--- /dev/null
+++ b/app/assets/javascripts/content_editor/extensions/copy_paste.js
@@ -0,0 +1,191 @@
+import OrderedMap from 'orderedmap';
+import { Extension } from '@tiptap/core';
+import { Plugin, PluginKey } from '@tiptap/pm/state';
+import { Schema, DOMParser as ProseMirrorDOMParser, DOMSerializer } from '@tiptap/pm/model';
+import { uniqueId } from 'lodash';
+import { __ } from '~/locale';
+import { VARIANT_DANGER } from '~/alert';
+import createMarkdownDeserializer from '../services/gl_api_markdown_deserializer';
+import { ALERT_EVENT, EXTENSION_PRIORITY_HIGHEST } from '../constants';
+import CodeBlockHighlight from './code_block_highlight';
+import CodeSuggestion from './code_suggestion';
+import Diagram from './diagram';
+import Frontmatter from './frontmatter';
+
+const TEXT_FORMAT = 'text/plain';
+const GFM_FORMAT = 'text/x-gfm';
+const HTML_FORMAT = 'text/html';
+const VS_CODE_FORMAT = 'vscode-editor-data';
+const CODE_BLOCK_NODE_TYPES = [
+ CodeBlockHighlight.name,
+ CodeSuggestion.name,
+ Diagram.name,
+ Frontmatter.name,
+];
+
+function parseHTML(schema, html) {
+ const parser = new DOMParser();
+ const startTag = '<body>';
+ const endTag = '</body>';
+ const { body } = parser.parseFromString(startTag + html + endTag, 'text/html');
+ return { document: ProseMirrorDOMParser.fromSchema(schema).parse(body) };
+}
+
+const findLoader = (editor, loaderId) => {
+ let position;
+
+ editor.view.state.doc.descendants((descendant, pos) => {
+ if (descendant.type.name === 'loading' && descendant.attrs.id === loaderId) {
+ position = pos;
+ return false;
+ }
+
+ return true;
+ });
+
+ return position;
+};
+
+export default Extension.create({
+ name: 'copyPaste',
+ priority: EXTENSION_PRIORITY_HIGHEST,
+ addOptions() {
+ return {
+ renderMarkdown: null,
+ serializer: null,
+ };
+ },
+ addCommands() {
+ return {
+ pasteContent: (content = '', processMarkdown = true) => () => {
+ const { editor, options } = this;
+ const { renderMarkdown, eventHub } = options;
+ const deserializer = createMarkdownDeserializer({ render: renderMarkdown });
+
+ const pasteSchemaSpec = { ...editor.schema.spec };
+ pasteSchemaSpec.marks = OrderedMap.from(pasteSchemaSpec.marks).remove('span');
+ pasteSchemaSpec.nodes = OrderedMap.from(pasteSchemaSpec.nodes).remove('div').remove('pre');
+ const pasteSchema = new Schema(pasteSchemaSpec);
+
+ const promise = processMarkdown
+ ? deserializer.deserialize({ schema: pasteSchema, markdown: content })
+ : Promise.resolve(parseHTML(pasteSchema, content));
+ const loaderId = uniqueId('loading');
+
+ Promise.resolve()
+ .then(() => {
+ editor.commands.insertContent({ type: 'loading', attrs: { id: loaderId } });
+ return promise;
+ })
+ .then(async ({ document }) => {
+ if (!document) return;
+
+ const pos = findLoader(editor, loaderId);
+ if (!pos) return;
+
+ const { firstChild, childCount } = document.content;
+ const toPaste =
+ childCount === 1 && firstChild.type.name === 'paragraph'
+ ? firstChild.content
+ : document.content;
+
+ editor
+ .chain()
+ .deleteRange({ from: pos, to: pos + 1 })
+ .insertContentAt(pos, toPaste.toJSON(), {
+ updateSelection: false,
+ })
+ .run();
+ })
+ .catch(() => {
+ eventHub.$emit(ALERT_EVENT, {
+ message: __('An error occurred while pasting text in the editor. Please try again.'),
+ variant: VARIANT_DANGER,
+ });
+ });
+
+ return true;
+ },
+ };
+ },
+ addProseMirrorPlugins() {
+ let pasteRaw = false;
+
+ const handleCutAndCopy = (view, event) => {
+ const slice = view.state.selection.content();
+ const gfmContent = this.options.serializer.serialize({ doc: slice.content });
+ const documentFragment = DOMSerializer.fromSchema(view.state.schema).serializeFragment(
+ slice.content,
+ );
+ const div = document.createElement('div');
+ div.appendChild(documentFragment);
+
+ event.clipboardData.setData(TEXT_FORMAT, div.innerText);
+ event.clipboardData.setData(HTML_FORMAT, div.innerHTML);
+ event.clipboardData.setData(GFM_FORMAT, gfmContent);
+
+ event.preventDefault();
+ event.stopPropagation();
+ };
+
+ return [
+ new Plugin({
+ key: new PluginKey('copyPaste'),
+ props: {
+ handleDOMEvents: {
+ copy: handleCutAndCopy,
+ cut: (view, event) => {
+ handleCutAndCopy(view, event);
+ this.editor.commands.deleteSelection();
+ },
+ },
+ handleKeyDown: (_, event) => {
+ pasteRaw = event.key === 'v' && (event.metaKey || event.ctrlKey) && event.shiftKey;
+ },
+
+ handlePaste: (view, event) => {
+ const { clipboardData } = event;
+
+ const gfmContent = clipboardData.getData(GFM_FORMAT);
+
+ if (gfmContent) {
+ return this.editor.commands.pasteContent(gfmContent, true);
+ }
+
+ const textContent = clipboardData.getData(TEXT_FORMAT);
+ const htmlContent = clipboardData.getData(HTML_FORMAT);
+
+ const { from, to } = view.state.selection;
+
+ if (pasteRaw) {
+ this.editor.commands.insertContentAt(
+ { from, to },
+ textContent.replace(/^\s+|\s+$/gm, ''),
+ );
+ return true;
+ }
+
+ const hasHTML = clipboardData.types.some((type) => type === HTML_FORMAT);
+ const hasVsCode = clipboardData.types.some((type) => type === VS_CODE_FORMAT);
+ const vsCodeMeta = hasVsCode ? JSON.parse(clipboardData.getData(VS_CODE_FORMAT)) : {};
+ const language = vsCodeMeta.mode;
+
+ // if a code block is active, paste as plain text
+ if (!textContent || CODE_BLOCK_NODE_TYPES.some((type) => this.editor.isActive(type))) {
+ return false;
+ }
+
+ if (hasVsCode) {
+ return this.editor.commands.pasteContent(
+ language === 'markdown' ? textContent : `\`\`\`${language}\n${textContent}\n\`\`\``,
+ true,
+ );
+ }
+
+ return this.editor.commands.pasteContent(hasHTML ? htmlContent : textContent, !hasHTML);
+ },
+ },
+ }),
+ ];
+ },
+});
diff --git a/app/assets/javascripts/content_editor/extensions/hard_break.js b/app/assets/javascripts/content_editor/extensions/hard_break.js
index fb81c6b79b6..6d7ff92e64b 100644
--- a/app/assets/javascripts/content_editor/extensions/hard_break.js
+++ b/app/assets/javascripts/content_editor/extensions/hard_break.js
@@ -2,8 +2,6 @@ import { HardBreak } from '@tiptap/extension-hard-break';
export default HardBreak.extend({
addKeyboardShortcuts() {
- return {
- 'Shift-Enter': () => this.editor.commands.setHardBreak(),
- };
+ return {};
},
});
diff --git a/app/assets/javascripts/content_editor/extensions/image.js b/app/assets/javascripts/content_editor/extensions/image.js
index 58c16297886..d245b86543f 100644
--- a/app/assets/javascripts/content_editor/extensions/image.js
+++ b/app/assets/javascripts/content_editor/extensions/image.js
@@ -1,5 +1,7 @@
import { Image } from '@tiptap/extension-image';
+import { VueNodeViewRenderer } from '@tiptap/vue-2';
import { PARSE_HTML_PRIORITY_HIGH } from '../constants';
+import ImageWrapper from '../components/wrappers/image.vue';
const resolveImageEl = (element) =>
element.nodeName === 'IMG' ? element : element.querySelector('img');
@@ -97,4 +99,7 @@ export default Image.extend({
},
];
},
+ addNodeView() {
+ return VueNodeViewRenderer(ImageWrapper);
+ },
});
diff --git a/app/assets/javascripts/content_editor/extensions/loading.js b/app/assets/javascripts/content_editor/extensions/loading.js
new file mode 100644
index 00000000000..0115fb10d5d
--- /dev/null
+++ b/app/assets/javascripts/content_editor/extensions/loading.js
@@ -0,0 +1,23 @@
+import { Node } from '@tiptap/core';
+
+export default Node.create({
+ name: 'loading',
+ inline: true,
+ group: 'inline',
+
+ addAttributes() {
+ return {
+ id: {
+ default: null,
+ },
+ };
+ },
+
+ renderHTML() {
+ return [
+ 'span',
+ { class: 'gl-display-inline-flex gl-align-items-center' },
+ ['span', { class: 'gl-dots-loader gl-mx-2' }, ['span']],
+ ];
+ },
+});
diff --git a/app/assets/javascripts/content_editor/extensions/paragraph.js b/app/assets/javascripts/content_editor/extensions/paragraph.js
index c63b64fd784..bddd8b38b06 100644
--- a/app/assets/javascripts/content_editor/extensions/paragraph.js
+++ b/app/assets/javascripts/content_editor/extensions/paragraph.js
@@ -9,4 +9,14 @@ export default Paragraph.extend({
},
};
},
+
+ addKeyboardShortcuts() {
+ return {
+ 'Shift-Enter': async () => {
+ // can only delegate one shortcut to another async
+ await Promise.resolve();
+ this.editor.commands.enter();
+ },
+ };
+ },
});
diff --git a/app/assets/javascripts/content_editor/extensions/paste_markdown.js b/app/assets/javascripts/content_editor/extensions/paste_markdown.js
deleted file mode 100644
index db13438de5e..00000000000
--- a/app/assets/javascripts/content_editor/extensions/paste_markdown.js
+++ /dev/null
@@ -1,155 +0,0 @@
-import OrderedMap from 'orderedmap';
-import { Extension } from '@tiptap/core';
-import { Plugin, PluginKey } from '@tiptap/pm/state';
-import { Schema, DOMParser as ProseMirrorDOMParser, DOMSerializer } from '@tiptap/pm/model';
-import { __ } from '~/locale';
-import { VARIANT_DANGER } from '~/alert';
-import createMarkdownDeserializer from '../services/gl_api_markdown_deserializer';
-import { ALERT_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 GFM_FORMAT = 'text/x-gfm';
-const HTML_FORMAT = 'text/html';
-const VS_CODE_FORMAT = 'vscode-editor-data';
-const CODE_BLOCK_NODE_TYPES = [CodeBlockHighlight.name, Diagram.name, Frontmatter.name];
-
-function parseHTML(schema, html) {
- const parser = new DOMParser();
- const startTag = '<body>';
- const endTag = '</body>';
- const { body } = parser.parseFromString(startTag + html + endTag, 'text/html');
- return { document: ProseMirrorDOMParser.fromSchema(schema).parse(body) };
-}
-
-export default Extension.create({
- name: 'pasteMarkdown',
- priority: EXTENSION_PRIORITY_HIGHEST,
- addOptions() {
- return {
- renderMarkdown: null,
- serializer: null,
- };
- },
- addCommands() {
- return {
- pasteContent: (content = '', processMarkdown = true) => async () => {
- const { editor, options } = this;
- const { renderMarkdown, eventHub } = options;
- const deserializer = createMarkdownDeserializer({ render: renderMarkdown });
-
- const pasteSchemaSpec = { ...editor.schema.spec };
- pasteSchemaSpec.marks = OrderedMap.from(pasteSchemaSpec.marks).remove('span');
- pasteSchemaSpec.nodes = OrderedMap.from(pasteSchemaSpec.nodes).remove('div').remove('pre');
- const schema = new Schema(pasteSchemaSpec);
-
- const promise = processMarkdown
- ? deserializer.deserialize({ schema, markdown: content })
- : Promise.resolve(parseHTML(schema, content));
-
- promise
- .then(({ document }) => {
- if (!document) return;
-
- const { firstChild } = document.content;
- const toPaste =
- document.content.childCount === 1 && firstChild.type.name === 'paragraph'
- ? firstChild.content
- : document.content;
-
- editor.commands.insertContent(toPaste.toJSON());
- })
- .catch(() => {
- eventHub.$emit(ALERT_EVENT, {
- message: __('An error occurred while pasting text in the editor. Please try again.'),
- variant: VARIANT_DANGER,
- });
- });
-
- return true;
- },
- };
- },
- addProseMirrorPlugins() {
- let pasteRaw = false;
-
- const handleCutAndCopy = (view, event) => {
- const slice = view.state.selection.content();
- const gfmContent = this.options.serializer.serialize({ doc: slice.content });
- const documentFragment = DOMSerializer.fromSchema(view.state.schema).serializeFragment(
- slice.content,
- );
- const div = document.createElement('div');
- div.appendChild(documentFragment);
-
- event.clipboardData.setData(TEXT_FORMAT, div.innerText);
- event.clipboardData.setData(HTML_FORMAT, div.innerHTML);
- event.clipboardData.setData(GFM_FORMAT, gfmContent);
-
- event.preventDefault();
- event.stopPropagation();
- };
-
- return [
- new Plugin({
- key: new PluginKey('pasteMarkdown'),
- props: {
- handleDOMEvents: {
- copy: handleCutAndCopy,
- cut: (view, event) => {
- handleCutAndCopy(view, event);
- this.editor.commands.deleteSelection();
- },
- },
- handleKeyDown: (_, event) => {
- pasteRaw = event.key === 'v' && (event.metaKey || event.ctrlKey) && event.shiftKey;
- },
-
- handlePaste: (view, event) => {
- const { clipboardData } = event;
-
- const gfmContent = clipboardData.getData(GFM_FORMAT);
-
- if (gfmContent) {
- return this.editor.commands.pasteContent(gfmContent, true);
- }
-
- const textContent = clipboardData.getData(TEXT_FORMAT);
- const htmlContent = clipboardData.getData(HTML_FORMAT);
-
- const { from, to } = view.state.selection;
-
- if (pasteRaw) {
- this.editor.commands.insertContentAt(
- { from, to },
- textContent.replace(/^\s+|\s+$/gm, ''),
- );
- return true;
- }
-
- const hasHTML = clipboardData.types.some((type) => type === HTML_FORMAT);
- const hasVsCode = clipboardData.types.some((type) => type === VS_CODE_FORMAT);
- const vsCodeMeta = hasVsCode ? JSON.parse(clipboardData.getData(VS_CODE_FORMAT)) : {};
- const language = vsCodeMeta.mode;
-
- // if a code block is active, paste as plain text
- if (!textContent || CODE_BLOCK_NODE_TYPES.some((type) => this.editor.isActive(type))) {
- return false;
- }
-
- if (hasVsCode) {
- return this.editor.commands.pasteContent(
- language === 'markdown' ? textContent : `\`\`\`${language}\n${textContent}\n\`\`\``,
- true,
- );
- }
-
- return this.editor.commands.pasteContent(hasHTML ? htmlContent : textContent, !hasHTML);
- },
- },
- }),
- ];
- },
-});
diff --git a/app/assets/javascripts/content_editor/extensions/reference.js b/app/assets/javascripts/content_editor/extensions/reference.js
index ef69b9bbda6..fd248709b5a 100644
--- a/app/assets/javascripts/content_editor/extensions/reference.js
+++ b/app/assets/javascripts/content_editor/extensions/reference.js
@@ -63,6 +63,12 @@ export default Node.create({
};
},
+ addCommands() {
+ return {
+ insertQuickAction: () => ({ commands }) => commands.insertContent('<p>/</p>'),
+ };
+ },
+
addInputRules() {
const { editor } = this;
const { assetResolver } = this.options;
diff --git a/app/assets/javascripts/content_editor/services/code_suggestion_utils.js b/app/assets/javascripts/content_editor/services/code_suggestion_utils.js
new file mode 100644
index 00000000000..836729790ae
--- /dev/null
+++ b/app/assets/javascripts/content_editor/services/code_suggestion_utils.js
@@ -0,0 +1,32 @@
+export function langParamsToLineOffset(langParams) {
+ if (!langParams) return [0, 0];
+ const match = langParams.match(/([-+]\d+)([-+]\d+)/);
+ return match ? [parseInt(match[1], 10), parseInt(match[2], 10)] : [0, 0];
+}
+
+export function lineOffsetToLangParams(lineOffset) {
+ let langParams = '';
+ langParams += lineOffset[0] <= 0 ? `-${-lineOffset[0]}` : `+${lineOffset[0]}`;
+ langParams += lineOffset[1] < 0 ? lineOffset[1] : `+${lineOffset[1]}`;
+ return langParams;
+}
+
+export function toAbsoluteLineOffset(lineOffset, lineNumber) {
+ return [lineOffset[0] + lineNumber, lineOffset[1] + lineNumber];
+}
+
+export function getLines(absoluteLineOffset, allLines) {
+ return allLines.slice(absoluteLineOffset[0] - 1, absoluteLineOffset[1]);
+}
+
+// \u200b is a zero width space character (Alternatively &ZeroWidthSpace;, &#8203; or &#x200B;).
+// Due to the nature of HTML, if you have a blank line in the deleted/inserted code, it would
+// render with 0 height. (Each line is in its <code> element.) This means that blank lines
+// would be skipped when rendering the diff.
+// We append this character to the end of each line to make sure that the line is not empty
+// and the line numbers are rendered correctly.
+const ZERO_WIDTH_SPACE = '\u200b';
+
+export function appendNewlines(lines) {
+ return lines.map((l, i, arr) => `${l}${ZERO_WIDTH_SPACE}${i === arr.length - 1 ? '' : '\n'}`);
+}
diff --git a/app/assets/javascripts/content_editor/services/content_editor.js b/app/assets/javascripts/content_editor/services/content_editor.js
index ec0f2f028d9..bc1ee696323 100644
--- a/app/assets/javascripts/content_editor/services/content_editor.js
+++ b/app/assets/javascripts/content_editor/services/content_editor.js
@@ -1,6 +1,14 @@
/* eslint-disable no-underscore-dangle */
export class ContentEditor {
- constructor({ tiptapEditor, serializer, deserializer, assetResolver, eventHub, drawioEnabled }) {
+ constructor({
+ tiptapEditor,
+ serializer,
+ deserializer,
+ assetResolver,
+ eventHub,
+ drawioEnabled,
+ codeSuggestionsConfig,
+ }) {
this._tiptapEditor = tiptapEditor;
this._serializer = serializer;
this._deserializer = deserializer;
@@ -8,9 +16,13 @@ export class ContentEditor {
this._assetResolver = assetResolver;
this._pristineDoc = null;
+ this.codeSuggestionsConfig = codeSuggestionsConfig;
this.drawioEnabled = drawioEnabled;
}
+ /**
+ * @type {import('@tiptap/core').Editor}
+ */
get tiptapEditor() {
return this._tiptapEditor;
}
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 ee1f706ec7e..51e41ceefaf 100644
--- a/app/assets/javascripts/content_editor/services/create_content_editor.js
+++ b/app/assets/javascripts/content_editor/services/create_content_editor.js
@@ -9,8 +9,9 @@ import Bold from '../extensions/bold';
import BulletList from '../extensions/bullet_list';
import Code from '../extensions/code';
import CodeBlockHighlight from '../extensions/code_block_highlight';
+import CodeSuggestion from '../extensions/code_suggestion';
import ColorChip from '../extensions/color_chip';
-import Comment from '../extensions/comment';
+import CopyPaste from '../extensions/copy_paste';
import DescriptionItem from '../extensions/description_item';
import DescriptionList from '../extensions/description_list';
import Details from '../extensions/details';
@@ -40,10 +41,10 @@ import InlineDiff from '../extensions/inline_diff';
import Italic from '../extensions/italic';
import Link from '../extensions/link';
import ListItem from '../extensions/list_item';
+import Loading from '../extensions/loading';
import MathInline from '../extensions/math_inline';
import OrderedList from '../extensions/ordered_list';
import Paragraph from '../extensions/paragraph';
-import PasteMarkdown from '../extensions/paste_markdown';
import Reference from '../extensions/reference';
import ReferenceLabel from '../extensions/reference_label';
import ReferenceDefinition from '../extensions/reference_definition';
@@ -73,11 +74,6 @@ import trackInputRulesAndShortcuts from './track_input_rules_and_shortcuts';
const createTiptapEditor = ({ extensions = [], ...options } = {}) =>
new Editor({
extensions: [...extensions],
- editorProps: {
- attributes: {
- class: 'gl-shadow-none!',
- },
- },
...options,
});
@@ -90,6 +86,7 @@ export const createContentEditor = ({
drawioEnabled = false,
enableAutocomplete,
autocompleteDataSources = {},
+ codeSuggestionsConfig = {},
} = {}) => {
if (!isFunction(renderMarkdown)) {
throw new Error(PROVIDE_SERIALIZER_OR_RENDERER_ERROR);
@@ -112,8 +109,8 @@ export const createContentEditor = ({
BulletList,
Code,
ColorChip,
- Comment,
CodeBlockHighlight,
+ CodeSuggestion.configure({ config: codeSuggestionsConfig }),
DescriptionItem,
DescriptionList,
Details,
@@ -142,10 +139,11 @@ export const createContentEditor = ({
ExternalKeydownHandler.configure({ eventHub }),
Link,
ListItem,
+ Loading,
MathInline,
OrderedList,
Paragraph,
- PasteMarkdown.configure({ eventHub, renderMarkdown, serializer }),
+ CopyPaste.configure({ eventHub, renderMarkdown, serializer }),
Reference.configure({ assetResolver }),
ReferenceLabel,
ReferenceDefinition,
@@ -181,5 +179,6 @@ export const createContentEditor = ({
deserializer,
assetResolver,
drawioEnabled,
+ codeSuggestionsConfig,
});
};
diff --git a/app/assets/javascripts/content_editor/services/markdown_serializer.js b/app/assets/javascripts/content_editor/services/markdown_serializer.js
index 4dbafd1632d..972b4acf523 100644
--- a/app/assets/javascripts/content_editor/services/markdown_serializer.js
+++ b/app/assets/javascripts/content_editor/services/markdown_serializer.js
@@ -8,12 +8,12 @@ import Bold from '../extensions/bold';
import BulletList from '../extensions/bullet_list';
import Code from '../extensions/code';
import CodeBlockHighlight from '../extensions/code_block_highlight';
+import CodeSuggestion from '../extensions/code_suggestion';
import DescriptionItem from '../extensions/description_item';
import DescriptionList from '../extensions/description_list';
import Details from '../extensions/details';
import DetailsContent from '../extensions/details_content';
import DrawioDiagram from '../extensions/drawio_diagram';
-import Comment from '../extensions/comment';
import Diagram from '../extensions/diagram';
import Emoji from '../extensions/emoji';
import Figure from '../extensions/figure';
@@ -32,6 +32,7 @@ import InlineDiff from '../extensions/inline_diff';
import Italic from '../extensions/italic';
import Link from '../extensions/link';
import ListItem from '../extensions/list_item';
+import Loading from '../extensions/loading';
import MathInline from '../extensions/math_inline';
import OrderedList from '../extensions/ordered_list';
import Paragraph from '../extensions/paragraph';
@@ -52,7 +53,6 @@ import Text from '../extensions/text';
import Video from '../extensions/video';
import WordBreak from '../extensions/word_break';
import {
- renderComment,
renderCodeBlock,
renderHardBreak,
renderTable,
@@ -134,8 +134,8 @@ const defaultSerializerConfig = {
}),
[BulletList.name]: preserveUnchanged(renderBulletList),
[CodeBlockHighlight.name]: preserveUnchanged(renderCodeBlock),
- [Comment.name]: renderComment,
[Diagram.name]: preserveUnchanged(renderCodeBlock),
+ [CodeSuggestion.name]: preserveUnchanged(renderCodeBlock),
[DrawioDiagram.name]: preserveUnchanged({
render: renderImage,
inline: true,
@@ -195,6 +195,7 @@ const defaultSerializerConfig = {
inline: true,
}),
[ListItem.name]: preserveUnchanged(defaultMarkdownSerializer.nodes.list_item),
+ [Loading.name]: () => {},
[OrderedList.name]: preserveUnchanged(renderOrderedList),
[Paragraph.name]: preserveUnchanged(defaultMarkdownSerializer.nodes.paragraph),
[Reference.name]: renderReference,
diff --git a/app/assets/javascripts/content_editor/services/serialization_helpers.js b/app/assets/javascripts/content_editor/services/serialization_helpers.js
index b2cbc9c3fed..17e650644b3 100644
--- a/app/assets/javascripts/content_editor/services/serialization_helpers.js
+++ b/app/assets/javascripts/content_editor/services/serialization_helpers.js
@@ -365,13 +365,6 @@ export function renderPlayable(state, node) {
renderImage(state, node);
}
-export function renderComment(state, node) {
- state.write('<!--');
- state.write(node.textContent);
- state.write('-->');
- state.closeBlock(node);
-}
-
export function renderCodeBlock(state, node) {
state.write(
`\`\`\`${
diff --git a/app/assets/javascripts/content_editor/services/utils.js b/app/assets/javascripts/content_editor/services/utils.js
index 1c128b4aa19..391d3b1a665 100644
--- a/app/assets/javascripts/content_editor/services/utils.js
+++ b/app/assets/javascripts/content_editor/services/utils.js
@@ -1,3 +1,6 @@
+import axios from 'axios';
+import { memoize } from 'lodash';
+
export const hasSelection = (tiptapEditor) => {
const { from, to } = tiptapEditor.state.selection;
@@ -5,3 +8,8 @@ export const hasSelection = (tiptapEditor) => {
};
export const clamp = (n, min, max) => Math.max(Math.min(n, max), min);
+
+export const memoizedGet = memoize(async (path) => {
+ const { data } = await axios(path, { responseType: 'blob' });
+ return data.text();
+});
diff --git a/app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_approved.vue b/app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_approved.vue
index a7787ae84bc..9f166e594b8 100644
--- a/app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_approved.vue
+++ b/app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_approved.vue
@@ -1,8 +1,5 @@
<script>
-import { GlSprintf } from '@gitlab/ui';
import { s__ } from '~/locale';
-import TargetLink from '../target_link.vue';
-import ResourceParentLink from '../resource_parent_link.vue';
import ContributionEventBase from './contribution_event_base.vue';
export default {
@@ -12,7 +9,7 @@ export default {
'ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}.',
),
},
- components: { ContributionEventBase, GlSprintf, TargetLink, ResourceParentLink },
+ components: { ContributionEventBase },
props: {
/**
* Expected format
@@ -52,14 +49,10 @@ export default {
</script>
<template>
- <contribution-event-base :event="event" icon-name="approval-solid" icon-class="gl-text-green-500">
- <gl-sprintf :message="$options.i18n.message">
- <template #targetLink>
- <target-link :event="event" />
- </template>
- <template #resourceParentLink>
- <resource-parent-link :event="event" />
- </template>
- </gl-sprintf>
- </contribution-event-base>
+ <contribution-event-base
+ :event="event"
+ :message="$options.i18n.message"
+ icon-name="approval-solid"
+ icon-class="gl-text-green-500"
+ />
</template>
diff --git a/app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_base.vue b/app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_base.vue
index 93ac94a6f4f..e3d3360cd0c 100644
--- a/app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_base.vue
+++ b/app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_base.vue
@@ -1,9 +1,19 @@
<script>
-import { GlAvatarLabeled, GlAvatarLink, GlIcon } from '@gitlab/ui';
+import { GlAvatarLabeled, GlAvatarLink, GlIcon, GlSprintf } from '@gitlab/ui';
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
+import TargetLink from '../target_link.vue';
+import ResourceParentLink from '../resource_parent_link.vue';
export default {
- components: { GlAvatarLabeled, GlAvatarLink, GlIcon, TimeAgoTooltip },
+ components: {
+ GlAvatarLabeled,
+ GlAvatarLink,
+ GlIcon,
+ GlSprintf,
+ TimeAgoTooltip,
+ TargetLink,
+ ResourceParentLink,
+ },
props: {
event: {
type: Object,
@@ -13,6 +23,11 @@ export default {
type: String,
required: true,
},
+ message: {
+ type: String,
+ required: false,
+ default: '',
+ },
iconClass: {
type: String,
required: false,
@@ -44,7 +59,15 @@ export default {
<div class="gl-pl-8 gl-mt-2" data-testid="event-body">
<div class="gl-text-secondary">
<gl-icon :class="iconClass" :name="iconName" />
- <slot></slot>
+ <gl-sprintf v-if="message" :message="message">
+ <template #targetLink>
+ <target-link :event="event" />
+ </template>
+ <template #resourceParentLink>
+ <resource-parent-link :event="event" />
+ </template>
+ </gl-sprintf>
+ <slot v-else></slot>
</div>
<div v-if="$scopedSlots['additional-info']" class="gl-mt-2">
<slot name="additional-info"></slot>
diff --git a/app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_expired.vue b/app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_expired.vue
new file mode 100644
index 00000000000..8daccd66aeb
--- /dev/null
+++ b/app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_expired.vue
@@ -0,0 +1,46 @@
+<script>
+import { s__ } from '~/locale';
+import ContributionEventBase from './contribution_event_base.vue';
+
+export default {
+ name: 'ContributionEventExpired',
+ i18n: {
+ message: s__(
+ 'ContributionEvent|Removed due to membership expiration from %{resourceParentLink}.',
+ ),
+ },
+ components: { ContributionEventBase },
+ props: {
+ /**
+ * Expected format
+ * {
+ * created_at: string;
+ * action: "expired"
+ * author: {
+ * id: number;
+ * username: string;
+ * name: string;
+ * state: string;
+ * avatar_url: string;
+ * web_url: string;
+ * };
+ * resource_parent: {
+ * type: "project";
+ * full_name: string;
+ * full_path: string;
+ * web_url: string;
+ * avatar_url: string;
+ * };
+ * };
+ */
+ event: {
+ type: Object,
+ required: true,
+ },
+ },
+};
+</script>
+
+<template>
+ <contribution-event-base :event="event" :message="$options.i18n.message" icon-name="expire" />
+</template>
diff --git a/app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_joined.vue b/app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_joined.vue
new file mode 100644
index 00000000000..1b60582e7e1
--- /dev/null
+++ b/app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_joined.vue
@@ -0,0 +1,44 @@
+<script>
+import { s__ } from '~/locale';
+import ContributionEventBase from './contribution_event_base.vue';
+
+export default {
+ name: 'ContributionEventJoined',
+ i18n: {
+ message: s__('ContributionEvent|Joined project %{resourceParentLink}.'),
+ },
+ components: { ContributionEventBase },
+ props: {
+ /**
+ * Expected format
+ * {
+ * created_at: string;
+ * action: "joined"
+ * author: {
+ * id: number;
+ * username: string;
+ * name: string;
+ * state: string;
+ * avatar_url: string;
+ * web_url: string;
+ * };
+ * resource_parent: {
+ * type: "project";
+ * full_name: string;
+ * full_path: string;
+ * web_url: string;
+ * avatar_url: string;
+ * };
+ * };
+ */
+ event: {
+ type: Object,
+ required: true,
+ },
+ },
+};
+</script>
+
+<template>
+ <contribution-event-base :event="event" :message="$options.i18n.message" icon-name="users" />
+</template>
diff --git a/app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_left.vue b/app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_left.vue
new file mode 100644
index 00000000000..701126b4a74
--- /dev/null
+++ b/app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_left.vue
@@ -0,0 +1,44 @@
+<script>
+import { s__ } from '~/locale';
+import ContributionEventBase from './contribution_event_base.vue';
+
+export default {
+ name: 'ContributionEventLeft',
+ i18n: {
+ message: s__('ContributionEvent|Left project %{resourceParentLink}.'),
+ },
+ components: { ContributionEventBase },
+ props: {
+ /**
+ * Expected format
+ * {
+ * created_at: string;
+ * action: "left"
+ * author: {
+ * id: number;
+ * username: string;
+ * name: string;
+ * state: string;
+ * avatar_url: string;
+ * web_url: string;
+ * };
+ * resource_parent: {
+ * type: "project";
+ * full_name: string;
+ * full_path: string;
+ * web_url: string;
+ * avatar_url: string;
+ * };
+ * };
+ */
+ event: {
+ type: Object,
+ required: true,
+ },
+ },
+};
+</script>
+
+<template>
+ <contribution-event-base :event="event" :message="$options.i18n.message" icon-name="leave" />
+</template>
diff --git a/app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_merged.vue b/app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_merged.vue
new file mode 100644
index 00000000000..d2566160b18
--- /dev/null
+++ b/app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_merged.vue
@@ -0,0 +1,29 @@
+<script>
+import { s__ } from '~/locale';
+import ContributionEventBase from './contribution_event_base.vue';
+
+export default {
+ name: 'ContributionEventMerged',
+ i18n: {
+ message: s__(
+ 'ContributionEvent|Accepted merge request %{targetLink} in %{resourceParentLink}.',
+ ),
+ },
+ components: { ContributionEventBase },
+ props: {
+ event: {
+ type: Object,
+ required: true,
+ },
+ },
+};
+</script>
+
+<template>
+ <contribution-event-base
+ :event="event"
+ :message="$options.i18n.message"
+ icon-name="git-merge"
+ icon-class="gl-text-blue-600"
+ />
+</template>
diff --git a/app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_private.vue b/app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_private.vue
new file mode 100644
index 00000000000..ba9bc25e310
--- /dev/null
+++ b/app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_private.vue
@@ -0,0 +1,24 @@
+<script>
+import { s__ } from '~/locale';
+import ContributionEventBase from './contribution_event_base.vue';
+
+export default {
+ name: 'ContributionEventPrivate',
+ i18n: {
+ message: s__('ContributionEvent|Made a private contribution.'),
+ },
+ components: { ContributionEventBase },
+ props: {
+ event: {
+ type: Object,
+ required: true,
+ },
+ },
+};
+</script>
+
+<template>
+ <contribution-event-base :event="event" icon-name="eye-slash">{{
+ $options.i18n.message
+ }}</contribution-event-base>
+</template>
diff --git a/app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_pushed.vue b/app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_pushed.vue
new file mode 100644
index 00000000000..557f2912f17
--- /dev/null
+++ b/app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_pushed.vue
@@ -0,0 +1,110 @@
+<script>
+import { GlSprintf, GlLink } from '@gitlab/ui';
+import { s__ } from '~/locale';
+import { PUSH_EVENT_REF_TYPE_BRANCH, PUSH_EVENT_REF_TYPE_TAG } from '../../constants';
+import ResourceParentLink from '../resource_parent_link.vue';
+import ContributionEventBase from './contribution_event_base.vue';
+
+export default {
+ name: 'ContributionEventPushed',
+ i18n: {
+ new: {
+ [PUSH_EVENT_REF_TYPE_BRANCH]: s__(
+ 'ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}.',
+ ),
+ [PUSH_EVENT_REF_TYPE_TAG]: s__(
+ 'ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}.',
+ ),
+ },
+ removed: {
+ [PUSH_EVENT_REF_TYPE_BRANCH]: s__(
+ 'ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}.',
+ ),
+ [PUSH_EVENT_REF_TYPE_TAG]: s__(
+ 'ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}.',
+ ),
+ },
+ pushed: {
+ [PUSH_EVENT_REF_TYPE_BRANCH]: s__(
+ 'ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}.',
+ ),
+ [PUSH_EVENT_REF_TYPE_TAG]: s__(
+ 'ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}.',
+ ),
+ },
+ multipleCommits: s__(
+ 'ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}.',
+ ),
+ },
+ components: { ContributionEventBase, GlSprintf, GlLink, ResourceParentLink },
+ props: {
+ event: {
+ type: Object,
+ required: true,
+ },
+ },
+ computed: {
+ ref() {
+ return this.event.ref;
+ },
+ commit() {
+ return this.event.commit;
+ },
+ message() {
+ if (this.ref.is_new) {
+ return this.$options.i18n.new[this.ref.type];
+ } else if (this.ref.is_removed) {
+ return this.$options.i18n.removed[this.ref.type];
+ }
+
+ return this.$options.i18n.pushed[this.ref.type];
+ },
+ iconName() {
+ if (this.ref.is_removed) {
+ return 'remove';
+ }
+
+ return 'commit';
+ },
+ hasMultipleCommits() {
+ return this.commit.count > 1;
+ },
+ },
+};
+</script>
+
+<template>
+ <contribution-event-base :event="event" :icon-name="iconName">
+ <gl-sprintf :message="message">
+ <template #refLink>
+ <gl-link v-if="ref.path" :href="ref.path" class="gl-font-monospace">{{ ref.name }}</gl-link>
+ <span v-else class="gl-font-monospace">{{ ref.name }}</span>
+ </template>
+ <template #resourceParentLink>
+ <resource-parent-link :event="event" />
+ </template>
+ </gl-sprintf>
+ <template v-if="!ref.is_removed" #additional-info>
+ <div>
+ <gl-link :href="commit.path" class="gl-font-monospace">{{ commit.truncated_sha }}</gl-link>
+ <template v-if="commit.title">
+ &middot;
+ <span>{{ commit.title }}</span>
+ </template>
+ </div>
+ <div v-if="hasMultipleCommits" class="gl-mt-2">
+ <gl-sprintf :message="$options.i18n.multipleCommits">
+ <template #count>{{ commit.count - 1 }}</template>
+ <template #link="{ content }">
+ <gl-link :href="commit.compare_path"
+ >{{ content }}
+ <span class="gl-font-monospace"
+ >{{ commit.from_truncated_sha }}…{{ commit.to_truncated_sha }}</span
+ ></gl-link
+ >
+ </template>
+ </gl-sprintf>
+ </div>
+ </template>
+ </contribution-event-base>
+</template>
diff --git a/app/assets/javascripts/contribution_events/components/contribution_events.vue b/app/assets/javascripts/contribution_events/components/contribution_events.vue
index 41ec4f5692e..62c803b9217 100644
--- a/app/assets/javascripts/contribution_events/components/contribution_events.vue
+++ b/app/assets/javascripts/contribution_events/components/contribution_events.vue
@@ -1,7 +1,21 @@
<script>
import EmptyComponent from '~/vue_shared/components/empty_component';
-import { EVENT_TYPE_APPROVED } from '../constants';
+import {
+ EVENT_TYPE_APPROVED,
+ EVENT_TYPE_EXPIRED,
+ EVENT_TYPE_JOINED,
+ EVENT_TYPE_LEFT,
+ EVENT_TYPE_PUSHED,
+ EVENT_TYPE_PRIVATE,
+ EVENT_TYPE_MERGED,
+} from '../constants';
import ContributionEventApproved from './contribution_event/contribution_event_approved.vue';
+import ContributionEventExpired from './contribution_event/contribution_event_expired.vue';
+import ContributionEventJoined from './contribution_event/contribution_event_joined.vue';
+import ContributionEventLeft from './contribution_event/contribution_event_left.vue';
+import ContributionEventPushed from './contribution_event/contribution_event_pushed.vue';
+import ContributionEventPrivate from './contribution_event/contribution_event_private.vue';
+import ContributionEventMerged from './contribution_event/contribution_event_merged.vue';
export default {
props: {
@@ -99,6 +113,24 @@ export default {
case EVENT_TYPE_APPROVED:
return ContributionEventApproved;
+ case EVENT_TYPE_EXPIRED:
+ return ContributionEventExpired;
+
+ case EVENT_TYPE_JOINED:
+ return ContributionEventJoined;
+
+ case EVENT_TYPE_LEFT:
+ return ContributionEventLeft;
+
+ case EVENT_TYPE_PUSHED:
+ return ContributionEventPushed;
+
+ case EVENT_TYPE_PRIVATE:
+ return ContributionEventPrivate;
+
+ case EVENT_TYPE_MERGED:
+ return ContributionEventMerged;
+
default:
return EmptyComponent;
}
diff --git a/app/assets/javascripts/contribution_events/components/resource_parent_link.vue b/app/assets/javascripts/contribution_events/components/resource_parent_link.vue
index 5add9d788bb..dd7b20ac794 100644
--- a/app/assets/javascripts/contribution_events/components/resource_parent_link.vue
+++ b/app/assets/javascripts/contribution_events/components/resource_parent_link.vue
@@ -18,5 +18,7 @@ export default {
</script>
<template>
- <gl-link :href="resourceParent.web_url">{{ resourceParent.full_name }}</gl-link>
+ <gl-link v-if="resourceParent" :href="resourceParent.web_url">{{
+ resourceParent.full_name
+ }}</gl-link>
</template>
diff --git a/app/assets/javascripts/contribution_events/components/target_link.vue b/app/assets/javascripts/contribution_events/components/target_link.vue
index a661121b2fb..6559d6c7272 100644
--- a/app/assets/javascripts/contribution_events/components/target_link.vue
+++ b/app/assets/javascripts/contribution_events/components/target_link.vue
@@ -27,5 +27,5 @@ export default {
</script>
<template>
- <gl-link v-bind="targetLinkAttributes">{{ targetLinkText }}</gl-link>
+ <gl-link v-if="target" v-bind="targetLinkAttributes">{{ targetLinkText }}</gl-link>
</template>
diff --git a/app/assets/javascripts/contribution_events/constants.js b/app/assets/javascripts/contribution_events/constants.js
index 05f968e7bc4..d4444e3bede 100644
--- a/app/assets/javascripts/contribution_events/constants.js
+++ b/app/assets/javascripts/contribution_events/constants.js
@@ -12,3 +12,7 @@ export const EVENT_TYPE_DESTROYED = 'destroyed';
export const EVENT_TYPE_EXPIRED = 'expired';
export const EVENT_TYPE_APPROVED = 'approved';
export const EVENT_TYPE_PRIVATE = 'private';
+
+// From app/models/push_event_payload.rb#L22
+export const PUSH_EVENT_REF_TYPE_BRANCH = 'branch';
+export const PUSH_EVENT_REF_TYPE_TAG = 'tag';
diff --git a/app/assets/javascripts/custom_metrics/components/custom_metrics_form.vue b/app/assets/javascripts/custom_metrics/components/custom_metrics_form.vue
index ccd22085470..78d0a9da79a 100644
--- a/app/assets/javascripts/custom_metrics/components/custom_metrics_form.vue
+++ b/app/assets/javascripts/custom_metrics/components/custom_metrics_form.vue
@@ -76,7 +76,7 @@ export default {
@formValidation="formValidation"
/>
<div class="form-actions">
- <gl-button variant="success" category="primary" :disabled="!formIsValid" @click="submit">
+ <gl-button variant="confirm" category="primary" :disabled="!formIsValid" @click="submit">
{{ saveButtonText }}
</gl-button>
<gl-button class="float-right" :href="editIntegrationPath">{{ __('Cancel') }}</gl-button>
diff --git a/app/assets/javascripts/deploy_tokens/components/new_deploy_token.vue b/app/assets/javascripts/deploy_tokens/components/new_deploy_token.vue
index c49ab1ac43c..7ec3ec3f84d 100644
--- a/app/assets/javascripts/deploy_tokens/components/new_deploy_token.vue
+++ b/app/assets/javascripts/deploy_tokens/components/new_deploy_token.vue
@@ -225,7 +225,7 @@ export default {
</div>
</div>
<h5>{{ $options.translations.addTokenHeader }}</h5>
- <p class="profile-settings-content">
+ <p>
<gl-sprintf
:message="$options.translations.addTokenDescription"
:placeholders="placeholders.link"
diff --git a/app/assets/javascripts/deprecated_notes.js b/app/assets/javascripts/deprecated_notes.js
index 08177cd0eac..6dbf12054cf 100644
--- a/app/assets/javascripts/deprecated_notes.js
+++ b/app/assets/javascripts/deprecated_notes.js
@@ -515,9 +515,8 @@ export default class Notes {
}
if (discussionContainer.length === 0) {
if (noteEntity.diff_discussion_html) {
- const discussionElement = document.createElement('table');
+ let discussionElement = document.createElement('table');
let internalNote;
- let discussionDOM;
if (!noteEntity.on_image) {
/*
@@ -536,16 +535,15 @@ export default class Notes {
Curiously, DOMPurify **ADDS** a totally novel <tbody>, so we're actually
inserting a completely as-yet-unseen <tbody> element here.
*/
- discussionDOM = internalNote.querySelector('table').firstChild;
+ discussionElement = internalNote.querySelector('table').querySelector('.notes_holder');
} else {
// Image comments don't need <table> manipulation, they're already <div>s
internalNote = sanitize(noteEntity.diff_discussion_html, {
RETURN_DOM: true,
});
- discussionDOM = internalNote.firstChild;
+ discussionElement.insertAdjacentElement('afterbegin', internalNote.firstElementChild);
}
- discussionElement.insertAdjacentElement('afterbegin', discussionDOM);
renderGFM(discussionElement);
const $discussion = $(discussionElement).unwrap();
@@ -1464,7 +1462,11 @@ export default class Notes {
$note.addClass('fade-in-full');
renderGFM(Notes.getNodeToRender($note));
- $notesList.append($note);
+ if ($notesList.find('.discussion-reply-holder').length) {
+ $notesList.children('.timeline-entry').last().after($note);
+ } else {
+ $notesList.append($note);
+ }
return $note;
}
diff --git a/app/assets/javascripts/design_management/components/design_description/description_form.vue b/app/assets/javascripts/design_management/components/design_description/description_form.vue
index 890d7f80f8d..413442074f0 100644
--- a/app/assets/javascripts/design_management/components/design_description/description_form.vue
+++ b/app/assets/javascripts/design_management/components/design_description/description_form.vue
@@ -1,6 +1,5 @@
<script>
import { GlButton, GlFormGroup, GlAlert, GlTooltipDirective } from '@gitlab/ui';
-
import SafeHtml from '~/vue_shared/directives/safe_html';
import { __, s__ } from '~/locale';
import { helpPagePath } from '~/helpers/help_page_helper';
@@ -9,7 +8,7 @@ import glFeaturesFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import { renderGFM } from '~/behaviors/markdown/render_gfm';
import { toggleMarkCheckboxes } from '~/behaviors/markdown/utils';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
-
+import { trackSavedUsingEditor } from '~/vue_shared/components/markdown/tracking';
import updateDesignDescriptionMutation from '../../graphql/mutations/update_design_description.mutation.graphql';
import { UPDATE_DESCRIPTION_ERROR } from '../../utils/error_messages';
@@ -110,6 +109,11 @@ export default {
async updateDesignDescription() {
this.isSubmitting = true;
+ if (this.$refs.markdownEditor) {
+ // eslint-disable-next-line @gitlab/require-i18n-strings
+ trackSavedUsingEditor(this.$refs.markdownEditor.isContentEditorActive, 'Design');
+ }
+
try {
const designDescriptionInput = { description: this.descriptionText, id: this.design.id };
@@ -165,6 +169,7 @@ export default {
</gl-alert>
</div>
<markdown-editor
+ ref="markdownEditor"
:value="descriptionText"
:render-markdown-path="markdownPreviewPath"
:markdown-docs-path="$options.markdownDocsPath"
diff --git a/app/assets/javascripts/design_management/components/design_notes/design_discussion.vue b/app/assets/javascripts/design_management/components/design_notes/design_discussion.vue
index 5affd448419..45f33967476 100644
--- a/app/assets/javascripts/design_management/components/design_notes/design_discussion.vue
+++ b/app/assets/javascripts/design_management/components/design_notes/design_discussion.vue
@@ -292,7 +292,9 @@ export default {
<design-note-pin :is-resolved="discussion.resolved" :label="discussion.index" />
<ul
class="design-discussion bordered-box gl-relative gl-p-0 gl-list-style-none"
+ :class="{ 'gl-bg-blue-50': isDiscussionActive }"
data-qa-selector="design_discussion_content"
+ data-testid="design-discussion-content"
>
<design-note
:note="firstNote"
@@ -300,7 +302,7 @@ export default {
:is-resolving="isResolving"
:is-discussion="true"
:noteable-id="noteableId"
- :class="{ 'gl-bg-blue-50': isDiscussionActive }"
+ :design-variables="designVariables"
@delete-note="showDeleteNoteConfirmationModal($event)"
>
<template v-if="isLoggedIn && discussion.resolvable" #resolve-discussion>
@@ -343,7 +345,7 @@ export default {
:is-resolving="isResolving"
:noteable-id="noteableId"
:is-discussion="false"
- :class="{ 'gl-bg-blue-50': isDiscussionActive }"
+ :design-variables="designVariables"
@delete-note="showDeleteNoteConfirmationModal($event)"
/>
<li
diff --git a/app/assets/javascripts/design_management/components/design_notes/design_note.vue b/app/assets/javascripts/design_management/components/design_notes/design_note.vue
index 0eac2cad68d..1f2c9f19a95 100644
--- a/app/assets/javascripts/design_management/components/design_notes/design_note.vue
+++ b/app/assets/javascripts/design_management/components/design_notes/design_note.vue
@@ -7,14 +7,21 @@ import {
GlLink,
GlTooltipDirective,
} from '@gitlab/ui';
+import * as Sentry from '@sentry/browser';
+import { produce } from 'immer';
import SafeHtml from '~/vue_shared/directives/safe_html';
-import { getIdFromGraphQLId } from '~/graphql_shared/utils';
+import { getIdFromGraphQLId, convertToGraphQLId } from '~/graphql_shared/utils';
+import { TYPENAME_USER } from '~/graphql_shared/constants';
import { __ } from '~/locale';
import TimelineEntryItem from '~/vue_shared/components/notes/timeline_entry_item.vue';
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
+import EmojiPicker from '~/emoji/components/picker.vue';
+import getDesignQuery from '../../graphql/queries/get_design.query.graphql';
import updateNoteMutation from '../../graphql/mutations/update_note.mutation.graphql';
+import designNoteAwardEmojiToggleMutation from '../../graphql/mutations/design_note_award_emoji_toggle.mutation.graphql';
import { hasErrors } from '../../utils/cache_update';
import { findNoteId, extractDesignNoteId } from '../../utils/design_management_utils';
+import DesignNoteAwardsList from './design_note_awards_list.vue';
import DesignReplyForm from './design_reply_form.vue';
export default {
@@ -24,7 +31,9 @@ export default {
deleteCommentText: __('Delete comment'),
},
components: {
+ DesignNoteAwardsList,
DesignReplyForm,
+ EmojiPicker,
GlAvatar,
GlAvatarLink,
GlButton,
@@ -37,6 +46,7 @@ export default {
GlTooltip: GlTooltipDirective,
SafeHtml,
},
+ inject: ['issueIid', 'projectPath'],
props: {
note: {
type: Object,
@@ -56,6 +66,10 @@ export default {
type: String,
required: true,
},
+ designVariables: {
+ type: Object,
+ required: true,
+ },
},
data() {
return {
@@ -64,6 +78,26 @@ export default {
};
},
computed: {
+ currentUserId() {
+ return window.gon.current_user_id;
+ },
+ currentUserFullName() {
+ return window.gon.current_user_fullname;
+ },
+ canAwardEmoji() {
+ return this.note.userPermissions.awardEmoji;
+ },
+ awards() {
+ return this.note.awardEmoji.nodes.map((award) => {
+ return {
+ ...award,
+ user: {
+ ...award.user,
+ id: getIdFromGraphQLId(award.user.id),
+ },
+ };
+ });
+ },
author() {
return this.note.author;
},
@@ -124,6 +158,93 @@ export default {
this.$emit('error', data.errors[0]);
}
},
+ isEmojiPresentForCurrentUser(name) {
+ return (
+ this.awards.findIndex(
+ (emoji) => emoji.name === name && emoji.user.id === this.currentUserId,
+ ) > -1
+ );
+ },
+ /**
+ * Prepare award emoji nodes based on emoji name
+ * and whether the user has toggled the emoji off or on
+ */
+ getAwardEmojiNodes(name, toggledOn) {
+ // If the emoji toggled on, add the emoji
+ if (toggledOn) {
+ // If emoji is already present in award list, no action is needed
+ if (this.isEmojiPresentForCurrentUser(name)) {
+ return this.note.awardEmoji.nodes;
+ }
+
+ // else make a copy of unmutable list and return the list after adding the new emoji
+ const awardEmojiNodes = [...this.note.awardEmoji.nodes];
+ awardEmojiNodes.push({
+ name,
+ __typename: 'AwardEmoji',
+ user: {
+ id: convertToGraphQLId(TYPENAME_USER, this.currentUserId),
+ name: this.currentUserFullName,
+ __typename: 'UserCore',
+ },
+ });
+
+ return awardEmojiNodes;
+ }
+
+ // else just filter the emoji
+ return this.note.awardEmoji.nodes.filter(
+ (emoji) =>
+ !(emoji.name === name && getIdFromGraphQLId(emoji.user.id) === this.currentUserId),
+ );
+ },
+ handleAwardEmoji(name) {
+ this.$apollo
+ .mutate({
+ mutation: designNoteAwardEmojiToggleMutation,
+ variables: {
+ name,
+ awardableId: this.note.id,
+ },
+ optimisticResponse: {
+ awardEmojiToggle: {
+ errors: [],
+ toggledOn: !this.isEmojiPresentForCurrentUser(name),
+ },
+ },
+ update: (
+ cache,
+ {
+ data: {
+ awardEmojiToggle: { toggledOn },
+ },
+ },
+ ) => {
+ const query = {
+ query: getDesignQuery,
+ variables: this.designVariables,
+ };
+
+ const sourceData = cache.readQuery(query);
+
+ const newData = produce(sourceData, (draftState) => {
+ const {
+ awardEmoji,
+ } = draftState.project.issue.designCollection.designs.nodes[0].discussions.nodes
+ .find((d) => d.id === this.note.discussion.id)
+ .notes.nodes.find((n) => n.id === this.note.id);
+
+ awardEmoji.nodes = this.getAwardEmojiNodes(name, toggledOn);
+ });
+
+ cache.writeQuery({ ...query, data: newData });
+ },
+ })
+ .catch((error) => {
+ Sentry.captureException(error);
+ this.$emit('error', error);
+ });
+ },
},
updateNoteMutation,
};
@@ -131,7 +252,12 @@ export default {
<template>
<timeline-entry-item :id="`note_${noteAnchorId}`" class="design-note note-form">
- <gl-avatar-link :href="author.webUrl" class="gl-float-left gl-mr-3">
+ <gl-avatar-link
+ :href="author.webUrl"
+ :data-user-id="authorId"
+ :data-username="author.username"
+ class="gl-float-left gl-mr-3 link-inherit-color js-user-link"
+ >
<gl-avatar :size="32" :src="author.avatarUrl" :entity-name="author.username" />
</gl-avatar-link>
@@ -140,7 +266,7 @@ export default {
<gl-link
v-once
:href="author.webUrl"
- class="js-user-link"
+ class="js-user-link link-inherit-color"
data-testid="user-link"
:data-user-id="authorId"
:data-username="author.username"
@@ -152,15 +278,23 @@ export default {
<span class="note-headline-light note-headline-meta">
<span class="system-note-message"> <slot></slot> </span>
<gl-link
- class="note-timestamp system-note-separator gl-display-block gl-mb-2 gl-font-sm"
+ class="note-timestamp system-note-separator gl-display-block gl-mb-2 gl-font-sm link-inherit-color"
:href="`#note_${noteAnchorId}`"
>
<time-ago-tooltip :time="note.createdAt" tooltip-placement="bottom" />
</gl-link>
</span>
</div>
- <div class="gl-display-flex gl-align-items-baseline gl-mt-n2 gl-mr-n2">
+ <div class="gl-display-flex gl-align-items-flex-start gl-mt-n2 gl-mr-n2">
<slot name="resolve-discussion"></slot>
+ <emoji-picker
+ v-if="canAwardEmoji"
+ toggle-class="note-action-button note-emoji-button btn-icon btn-default-tertiary"
+ boundary="viewport"
+ :right="false"
+ data-testid="note-emoji-button"
+ @click="handleAwardEmoji"
+ />
<gl-button
v-if="isEditingAndHasPermissions"
v-gl-tooltip
@@ -175,7 +309,6 @@ export default {
<gl-disclosure-dropdown
v-if="isEditingAndHasPermissions"
v-gl-tooltip.hover
- toggle-class="btn-sm"
icon="ellipsis_v"
category="tertiary"
data-qa-selector="design_discussion_actions_ellipsis_dropdown"
@@ -198,8 +331,14 @@ export default {
></div>
<slot name="resolved-status"></slot>
</template>
+ <design-note-awards-list
+ v-if="awards.length"
+ :awards="awards"
+ :can-award-emoji="note.userPermissions.awardEmoji"
+ @award="handleAwardEmoji"
+ />
<design-reply-form
- v-else
+ v-if="isEditing"
:markdown-preview-path="markdownPreviewPath"
:design-note-mutation="$options.updateNoteMutation"
:mutation-variables="mutationVariables"
diff --git a/app/assets/javascripts/design_management/components/design_notes/design_note_awards_list.vue b/app/assets/javascripts/design_management/components/design_notes/design_note_awards_list.vue
new file mode 100644
index 00000000000..f5456f47410
--- /dev/null
+++ b/app/assets/javascripts/design_management/components/design_notes/design_note_awards_list.vue
@@ -0,0 +1,34 @@
+<script>
+import AwardsList from '~/vue_shared/components/awards_list.vue';
+
+export default {
+ components: {
+ AwardsList,
+ },
+ props: {
+ awards: {
+ type: Array,
+ required: true,
+ },
+ canAwardEmoji: {
+ type: Boolean,
+ required: true,
+ },
+ },
+ computed: {
+ currentUserId() {
+ return window.gon.current_user_id;
+ },
+ },
+};
+</script>
+
+<template>
+ <awards-list
+ :awards="awards"
+ :can-award-emoji="canAwardEmoji"
+ :current-user-id="currentUserId"
+ class="gl-px-2 gl-mt-5"
+ @award="$emit('award', $event)"
+ />
+</template>
diff --git a/app/assets/javascripts/design_management/components/design_notes/design_reply_form.vue b/app/assets/javascripts/design_management/components/design_notes/design_reply_form.vue
index 7474f8f3298..764c78ff581 100644
--- a/app/assets/javascripts/design_management/components/design_notes/design_reply_form.vue
+++ b/app/assets/javascripts/design_management/components/design_notes/design_reply_form.vue
@@ -233,7 +233,7 @@ export default {
</template>
</markdown-field>
<slot name="resolve-checkbox"></slot>
- <div class="note-form-actions gl-display-flex">
+ <div class="note-form-actions gl-display-flex gl-mt-4!">
<gl-button
ref="submitButton"
:disabled="!hasValue"
diff --git a/app/assets/javascripts/design_management/graphql/fragments/design_note.fragment.graphql b/app/assets/javascripts/design_management/graphql/fragments/design_note.fragment.graphql
index 28224671326..9af4733d5dc 100644
--- a/app/assets/javascripts/design_management/graphql/fragments/design_note.fragment.graphql
+++ b/app/assets/javascripts/design_management/graphql/fragments/design_note.fragment.graphql
@@ -11,6 +11,15 @@ fragment DesignNote on Note {
bodyHtml
createdAt
resolved
+ awardEmoji {
+ nodes {
+ name
+ user {
+ id
+ name
+ }
+ }
+ }
position {
diffRefs {
...DesignDiffRefs
diff --git a/app/assets/javascripts/design_management/graphql/fragments/note_permissions.fragment.graphql b/app/assets/javascripts/design_management/graphql/fragments/note_permissions.fragment.graphql
index e599ab19c2d..acc52e5de59 100644
--- a/app/assets/javascripts/design_management/graphql/fragments/note_permissions.fragment.graphql
+++ b/app/assets/javascripts/design_management/graphql/fragments/note_permissions.fragment.graphql
@@ -1,4 +1,5 @@
fragment DesignNotePermissions on NotePermissions {
adminNote
repositionNote
+ awardEmoji
}
diff --git a/app/assets/javascripts/design_management/graphql/mutations/design_note_award_emoji_toggle.mutation.graphql b/app/assets/javascripts/design_management/graphql/mutations/design_note_award_emoji_toggle.mutation.graphql
new file mode 100644
index 00000000000..3e274d0b65f
--- /dev/null
+++ b/app/assets/javascripts/design_management/graphql/mutations/design_note_award_emoji_toggle.mutation.graphql
@@ -0,0 +1,6 @@
+mutation designNoteNoteToggleAwardEmoji($awardableId: AwardableID!, $name: String!) {
+ awardEmojiToggle(input: { awardableId: $awardableId, name: $name }) {
+ errors
+ toggledOn
+ }
+}
diff --git a/app/assets/javascripts/design_management/pages/index.vue b/app/assets/javascripts/design_management/pages/index.vue
index e7308aad785..af7c5a25d94 100644
--- a/app/assets/javascripts/design_management/pages/index.vue
+++ b/app/assets/javascripts/design_management/pages/index.vue
@@ -146,12 +146,6 @@ export default {
}
return 'col-12';
},
- designContentWrapperClass() {
- if (this.hasDesigns) {
- return 'gl-bg-gray-10 gl-border gl-border-t-0 gl-rounded-bottom-left-base gl-rounded-bottom-right-base gl-px-5';
- }
- return null;
- },
},
mounted() {
if (this.$route.path === '/designs') {
@@ -359,6 +353,7 @@ export default {
<div
data-testid="designs-root"
class="gl-mt-4"
+ :class="{ 'gl-new-card': showToolbar }"
@mouseenter="toggleOnPasteListener"
@mouseleave="toggleOffPasteListener"
>
@@ -371,11 +366,7 @@ export default {
>
{{ uploadError }}
</gl-alert>
- <header
- v-if="showToolbar"
- class="gl-border gl-px-5 gl-py-4 gl-display-flex gl-justify-content-space-between gl-bg-white gl-rounded-top-base"
- data-testid="design-toolbar-wrapper"
- >
+ <header v-if="showToolbar" class="gl-new-card-header" data-testid="design-toolbar-wrapper">
<div
class="gl-display-flex gl-justify-content-space-between gl-align-items-center gl-w-full gl-flex-wrap gl-gap-3"
>
@@ -427,8 +418,13 @@ export default {
</div>
</div>
</header>
- <div :class="designContentWrapperClass">
- <gl-loading-icon v-if="isLoading" size="lg" />
+ <div
+ :class="{
+ 'gl-mx-5': showToolbar,
+ 'gl-new-card-body gl-mx-3!': hasDesigns,
+ }"
+ >
+ <gl-loading-icon v-if="isLoading" size="sm" class="gl-py-4" />
<gl-alert v-else-if="error" variant="danger" :dismissible="false">
{{ $options.i18n.designLoadingError }}
</gl-alert>
diff --git a/app/assets/javascripts/diffs/components/app.vue b/app/assets/javascripts/diffs/components/app.vue
index c0a9643e59e..5149dcc5d17 100644
--- a/app/assets/javascripts/diffs/components/app.vue
+++ b/app/assets/javascripts/diffs/components/app.vue
@@ -58,7 +58,6 @@ import HiddenFilesWarning from './hidden_files_warning.vue';
import NoChanges from './no_changes.vue';
import TreeList from './tree_list.vue';
import VirtualScrollerScrollSync from './virtual_scroller_scroll_sync';
-import PreRenderer from './pre_renderer.vue';
export default {
name: 'DiffsApp',
@@ -66,7 +65,6 @@ export default {
FindingsDrawer,
DynamicScroller,
DynamicScrollerItem,
- PreRenderer,
VirtualScrollerScrollSync,
CompareVersions,
DiffFile,
@@ -95,6 +93,11 @@ export default {
required: false,
default: '',
},
+ endpointSast: {
+ type: String,
+ required: false,
+ default: '',
+ },
endpointCodequality: {
type: String,
required: false,
@@ -277,6 +280,10 @@ export default {
this.setCodequalityEndpoint(this.endpointCodequality);
}
+ if (this.endpointSast) {
+ this.setSastEndpoint(this.endpointSast);
+ }
+
if (this.shouldShow) {
this.fetchData();
}
@@ -358,11 +365,13 @@ export default {
'moveToNeighboringCommit',
'setBaseConfig',
'setCodequalityEndpoint',
+ 'setSastEndpoint',
'fetchDiffFilesMeta',
'fetchDiffFilesBatch',
'fetchFileByFile',
'fetchCoverageFiles',
'fetchCodequality',
+ 'fetchSast',
'rereadNoteHash',
'startRenderDiffsQueue',
'assignDiscussionsToDiff',
@@ -460,6 +469,10 @@ export default {
this.fetchCodequality();
}
+ if (this.endpointSast) {
+ this.fetchSast();
+ }
+
if (!this.isNotesFetched) {
notesEventHub.$emit('fetchNotesData');
}
@@ -665,22 +678,6 @@ export default {
</dynamic-scroller-item>
</template>
<template #before>
- <pre-renderer :max-length="diffFilesLength">
- <template #default="{ item, index, active }">
- <dynamic-scroller-item :item="item" :active="active">
- <diff-file
- :file="item"
- :reviewed="fileReviews[item.id]"
- :is-first-file="index === 0"
- :is-last-file="index === diffFilesLength - 1"
- :help-page-path="helpPagePath"
- :can-current-user-fork="canCurrentUserFork"
- :view-diffs-file-by-file="viewDiffsFileByFile"
- pre-render
- />
- </dynamic-scroller-item>
- </template>
- </pre-renderer>
<virtual-scroller-scroll-sync v-model="virtualScrollCurrentIndex" />
</template>
</dynamic-scroller>
diff --git a/app/assets/javascripts/diffs/components/commit_item.vue b/app/assets/javascripts/diffs/components/commit_item.vue
index d050f2fb9ae..3746ab9427f 100644
--- a/app/assets/javascripts/diffs/components/commit_item.vue
+++ b/app/assets/javascripts/diffs/components/commit_item.vue
@@ -2,7 +2,7 @@
import { GlButtonGroup, GlButton, GlTooltipDirective, GlFormCheckbox } from '@gitlab/ui';
import SafeHtml from '~/vue_shared/directives/safe_html';
-import CommitPipelineStatus from '~/projects/tree/components/commit_pipeline_status_component.vue';
+import CommitPipelineStatus from '~/projects/tree/components/commit_pipeline_status.vue';
import ModalCopyButton from '~/vue_shared/components/modal_copy_button.vue';
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
@@ -133,7 +133,7 @@ export default {
/>
</div>
<div
- class="commit-detail flex-list gl-display-flex gl-justify-content-space-between gl-align-items-flex-start gl-flex-grow-1 gl-min-w-0"
+ class="commit-detail flex-list gl-display-flex gl-justify-content-space-between gl-align-items-center gl-flex-grow-1 gl-min-w-0"
>
<div class="commit-content" data-qa-selector="commit_content">
<a
diff --git a/app/assets/javascripts/diffs/components/diff_code_quality.vue b/app/assets/javascripts/diffs/components/diff_code_quality.vue
index f3f05e3d9d9..4ed54ecdf66 100644
--- a/app/assets/javascripts/diffs/components/diff_code_quality.vue
+++ b/app/assets/javascripts/diffs/components/diff_code_quality.vue
@@ -1,18 +1,23 @@
<script>
import { GlButton } from '@gitlab/ui';
-import { NEW_CODE_QUALITY_FINDINGS } from '../i18n';
-import DiffCodeQualityItem from './diff_code_quality_item.vue';
+import { NEW_CODE_QUALITY_FINDINGS, NEW_SAST_FINDINGS } from '../i18n';
+import DiffInlineFindings from './diff_inline_findings.vue';
export default {
i18n: {
- newFindings: NEW_CODE_QUALITY_FINDINGS,
+ newCodeQualityFindings: NEW_CODE_QUALITY_FINDINGS,
+ newSastFindings: NEW_SAST_FINDINGS,
},
- components: { GlButton, DiffCodeQualityItem },
+ components: { GlButton, DiffInlineFindings },
props: {
codeQuality: {
type: Array,
required: true,
},
+ sast: {
+ type: Array,
+ required: true,
+ },
},
};
</script>
@@ -22,19 +27,18 @@ export default {
data-testid="diff-codequality"
class="gl-relative codequality-findings-list gl-border-top-1 gl-border-bottom-1 gl-bg-gray-10 gl-text-black-normal gl-pl-5 gl-pt-4 gl-pb-4"
>
- <h4
- data-testid="diff-codequality-findings-heading"
- class="gl-mt-0 gl-mb-0 gl-font-base gl-font-regular"
- >
- {{ $options.i18n.newFindings }}
- </h4>
- <ul class="gl-list-style-none gl-mb-0 gl-p-0">
- <diff-code-quality-item
- v-for="finding in codeQuality"
- :key="finding.description"
- :finding="finding"
- />
- </ul>
+ <diff-inline-findings
+ v-if="codeQuality.length"
+ :title="$options.i18n.newCodeQualityFindings"
+ :findings="codeQuality"
+ />
+
+ <diff-inline-findings
+ v-if="sast.length"
+ :title="$options.i18n.newSastFindings"
+ :findings="sast"
+ />
+
<gl-button
data-testid="diff-codequality-close"
category="tertiary"
diff --git a/app/assets/javascripts/diffs/components/diff_code_quality_item.vue b/app/assets/javascripts/diffs/components/diff_code_quality_item.vue
index eede110f46c..727b2a0c099 100644
--- a/app/assets/javascripts/diffs/components/diff_code_quality_item.vue
+++ b/app/assets/javascripts/diffs/components/diff_code_quality_item.vue
@@ -1,7 +1,7 @@
<script>
import { GlLink, GlIcon } from '@gitlab/ui';
import { mapActions } from 'vuex';
-import { SEVERITY_CLASSES, SEVERITY_ICONS } from '~/ci/reports/codequality_report/constants';
+import { getSeverity } from '~/ci/reports/utils';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
export default {
@@ -12,14 +12,21 @@ export default {
type: Object,
required: true,
},
+ link: {
+ type: Boolean,
+ required: false,
+ default: true,
+ },
},
- methods: {
- severityClass(severity) {
- return SEVERITY_CLASSES[severity] || SEVERITY_CLASSES.unknown;
+ computed: {
+ enhancedFinding() {
+ return getSeverity(this.finding);
},
- severityIcon(severity) {
- return SEVERITY_ICONS[severity] || SEVERITY_ICONS.unknown;
+ listText() {
+ return `${this.finding.severity} - ${this.finding.description}`;
},
+ },
+ methods: {
toggleDrawer() {
this.setDrawer(this.finding);
},
@@ -33,8 +40,8 @@ export default {
<span class="gl-mr-3">
<gl-icon
:size="12"
- :name="severityIcon(finding.severity)"
- :class="severityClass(finding.severity)"
+ :name="enhancedFinding.name"
+ :class="enhancedFinding.class"
class="codequality-severity-icon"
/>
</span>
@@ -43,12 +50,13 @@ export default {
data-testid="description-button-section"
class="gl-display-flex"
>
- <gl-link category="primary" variant="link" @click="toggleDrawer">
- {{ finding.severity }} - {{ finding.description }}</gl-link
+ <gl-link v-if="link" category="primary" variant="link" @click="toggleDrawer">
+ {{ listText }}</gl-link
>
+ <span v-else>{{ listText }}</span>
</span>
<span v-else data-testid="description-plain-text" class="gl-display-flex">
- {{ finding.severity }} - {{ finding.description }}
+ {{ listText }}
</span>
</li>
</template>
diff --git a/app/assets/javascripts/diffs/components/diff_content.vue b/app/assets/javascripts/diffs/components/diff_content.vue
index 4d02fd80ba8..1c93cb4d021 100644
--- a/app/assets/javascripts/diffs/components/diff_content.vue
+++ b/app/assets/javascripts/diffs/components/diff_content.vue
@@ -1,7 +1,9 @@
<script>
import { GlLoadingIcon, GlButton } from '@gitlab/ui';
import { mapActions, mapGetters, mapState } from 'vuex';
-import { mapParallel } from 'ee_else_ce/diffs/components/diff_row_utils';
+import { sprintf } from '~/locale';
+import { createAlert } from '~/alert';
+import { mapParallel, mapParallelNoSast } from 'ee_else_ce/diffs/components/diff_row_utils';
import DiffFileDrafts from '~/batch_comments/components/diff_file_drafts.vue';
import draftCommentsMixin from '~/diffs/mixins/draft_comments';
import { diffViewerModes } from '~/ide/constants';
@@ -12,7 +14,9 @@ import NotDiffableViewer from '~/vue_shared/components/diff_viewer/viewers/not_d
import NoteForm from '~/notes/components/note_form.vue';
import eventHub from '~/notes/event_hub';
import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
+import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import { IMAGE_DIFF_POSITION_TYPE } from '../constants';
+import { SAVING_THE_COMMENT_FAILED, SOMETHING_WENT_WRONG } from '../i18n';
import { getDiffMode } from '../store/utils';
import DiffDiscussions from './diff_discussions.vue';
import DiffView from './diff_view.vue';
@@ -32,7 +36,7 @@ export default {
UserAvatarLink,
DiffFileDrafts,
},
- mixins: [diffLineNoteFormMixin, draftCommentsMixin],
+ mixins: [diffLineNoteFormMixin, draftCommentsMixin, glFeatureFlagsMixin()],
props: {
diffFile: {
type: Object,
@@ -51,6 +55,7 @@ export default {
'getCommentFormForDiffFile',
'diffLines',
'fileLineCodequality',
+ 'fileLineSast',
]),
...mapGetters(['getNoteableData', 'noteableType', 'getUserData']),
diffMode() {
@@ -87,8 +92,11 @@ export default {
return this.getUserData;
},
mappedLines() {
- // TODO: Do this data generation when we receive a response to save a computed property being created
- return this.diffLines(this.diffFile).map(mapParallel(this)) || [];
+ if (this.glFeatures.sastReportsInInlineDiff) {
+ return this.diffLines(this.diffFile).map(mapParallel(this)) || [];
+ }
+
+ return this.diffLines(this.diffFile).map(mapParallelNoSast(this)) || [];
},
imageDiscussions() {
return this.diffFile.discussions.filter(
@@ -103,7 +111,7 @@ export default {
},
methods: {
...mapActions('diffs', ['saveDiffDiscussion', 'closeDiffFileCommentForm']),
- handleSaveNote(note) {
+ handleSaveNote(note, parentElement, errorCallback) {
this.saveDiffDiscussion({
note,
formData: {
@@ -116,6 +124,18 @@ export default {
width: this.diffFileCommentForm.width,
height: this.diffFileCommentForm.height,
},
+ }).catch((e) => {
+ const reason = e.response?.data?.errors;
+ const errorMessage = reason
+ ? sprintf(SAVING_THE_COMMENT_FAILED, { reason })
+ : SOMETHING_WENT_WRONG;
+
+ createAlert({
+ message: errorMessage,
+ parent: parentElement,
+ });
+
+ errorCallback();
});
},
},
@@ -143,7 +163,7 @@ export default {
{{ __('Contains only whitespace changes.') }}
<gl-button
category="tertiary"
- variant="info"
+ variant="confirm"
size="small"
class="gl-ml-3"
data-testid="diff-load-file-button"
diff --git a/app/assets/javascripts/diffs/components/diff_file.vue b/app/assets/javascripts/diffs/components/diff_file.vue
index 8e1c6cecbd1..4e1ccfc530e 100644
--- a/app/assets/javascripts/diffs/components/diff_file.vue
+++ b/app/assets/javascripts/diffs/components/diff_file.vue
@@ -25,7 +25,7 @@ import {
FILE_DIFF_POSITION_TYPE,
} from '../constants';
import eventHub from '../event_hub';
-import { DIFF_FILE, GENERIC_ERROR, CONFLICT_TEXT } from '../i18n';
+import { DIFF_FILE, SOMETHING_WENT_WRONG, SAVING_THE_COMMENT_FAILED, CONFLICT_TEXT } from '../i18n';
import { collapsedType, getShortShaFromFile } from '../utils/diff_file';
import DiffDiscussions from './diff_discussions.vue';
import DiffFileHeader from './diff_file_header.vue';
@@ -88,11 +88,6 @@ export default {
required: false,
default: true,
},
- preRender: {
- type: Boolean,
- required: false,
- default: false,
- },
},
idState() {
return {
@@ -104,7 +99,7 @@ export default {
},
i18n: {
...DIFF_FILE,
- genericError: GENERIC_ERROR,
+ genericError: SOMETHING_WENT_WRONG,
},
computed: {
...mapState('diffs', [
@@ -122,7 +117,7 @@ export default {
return getShortShaFromFile(this.file);
},
showLoadingIcon() {
- return this.idState.isLoadingCollapsedDiff || (!this.file.renderIt && !this.isCollapsed);
+ return this.idState.isLoadingCollapsedDiff;
},
hasDiff() {
return hasDiff(this.file);
@@ -177,9 +172,6 @@ export default {
showLocalFileReviews() {
return Boolean(gon.current_user_id);
},
- codequalityDiffForFile() {
- return this.codequalityDiff?.files?.[this.file.file_path] || [];
- },
isCollapsed() {
if (collapsedType(this.file) !== DIFF_FILE_MANUAL_COLLAPSE) {
return this.viewDiffsFileByFile ? false : this.file.viewer?.automaticallyCollapsed;
@@ -194,9 +186,8 @@ export default {
},
showFileDiscussions() {
return (
- this.glFeatures.commentOnFiles &&
!this.file.viewer?.manuallyCollapsed &&
- (this.fileDiscussions.length || this.file.drafts.length || this.file.hasCommentForm)
+ (this.fileDiscussions.length || this.file.drafts?.length || this.file.hasCommentForm)
);
},
diffFileHash() {
@@ -206,8 +197,6 @@ export default {
watch: {
'file.id': {
handler: function fileIdHandler() {
- if (this.preRender) return;
-
this.manageViewedEffects();
},
},
@@ -220,7 +209,6 @@ export default {
newHash &&
oldHash &&
!this.hasDiff &&
- !this.preRender &&
!this.idState.hasLoadedCollapsedDiff
) {
this.requestDiff();
@@ -229,14 +217,10 @@ export default {
},
},
created() {
- if (this.preRender) return;
-
notesEventHub.$on(`loadCollapsedDiff/${this.file.file_hash}`, this.requestDiff);
eventHub.$on(EVT_EXPAND_ALL_FILES, this.expandAllListener);
},
mounted() {
- if (this.preRender) return;
-
if (this.hasDiff) {
this.postRender();
}
@@ -244,15 +228,12 @@ export default {
this.manageViewedEffects();
},
beforeDestroy() {
- if (this.preRender) return;
-
eventHub.$off(EVT_EXPAND_ALL_FILES, this.expandAllListener);
},
methods: {
...mapActions('diffs', [
'loadCollapsedDiff',
'assignDiscussionsToDiff',
- 'setRenderIt',
'setFileCollapsedByUser',
'saveDiffDiscussion',
'toggleFileCommentForm',
@@ -316,10 +297,6 @@ export default {
.then(() => {
idState.isLoadingCollapsedDiff = false;
idState.hasLoadedCollapsedDiff = true;
-
- if (this.file.file_hash === file.file_hash) {
- this.setRenderIt(this.file);
- }
})
.then(() => {
if (this.file.file_hash !== file.file_hash) return;
@@ -345,7 +322,7 @@ export default {
hideForkMessage() {
this.idState.forkMessageVisible = false;
},
- handleSaveNote(note) {
+ handleSaveNote(note, parentElement, errorCallback) {
this.saveDiffDiscussion({
note,
formData: {
@@ -354,8 +331,23 @@ export default {
diffFile: this.file,
positionType: FILE_DIFF_POSITION_TYPE,
},
+ }).catch((e) => {
+ const reason = e.response?.data?.errors;
+ const errorMessage = reason
+ ? sprintf(SAVING_THE_COMMENT_FAILED, { reason })
+ : SOMETHING_WENT_WRONG;
+
+ createAlert({
+ message: errorMessage,
+ parent: parentElement,
+ });
+
+ errorCallback();
});
},
+ handleSaveDraftNote(note, _, parentElement, errorCallback) {
+ this.addToReview(note, this.$options.FILE_DIFF_POSITION_TYPE, parentElement, errorCallback);
+ },
},
CONFLICT_TEXT,
FILE_DIFF_POSITION_TYPE,
@@ -364,15 +356,14 @@ export default {
<template>
<div
- :id="!preRender && active && file.file_hash"
+ :id="file.file_hash"
:class="{
- 'is-active': currentDiffFileId === file.file_hash,
'comments-disabled': Boolean(file.brokenSymlink),
'has-body': showBody,
'is-virtual-scrolling': isVirtualScrollingEnabled,
}"
:data-path="file.new_path"
- class="diff-file file-holder gl-border-none"
+ class="diff-file file-holder gl-border-none gl-mb-0! gl-pb-5"
>
<diff-file-header
:can-current-user-fork="canCurrentUserFork"
@@ -383,7 +374,6 @@ export default {
:add-merge-request-buttons="true"
:view-diffs-file-by-file="viewDiffsFileByFile"
:show-local-file-reviews="showLocalFileReviews"
- :codequality-diff="codequalityDiffForFile"
class="js-file-title file-title gl-border-1 gl-border-solid gl-border-gray-100"
:class="hasBodyClasses.header"
@toggleFile="handleToggle({ viaUserInteraction: true })"
@@ -412,7 +402,7 @@ export default {
</div>
<template v-else>
<div
- :id="!preRender && active && `diff-content-${file.file_hash}`"
+ :id="`diff-content-${file.file_hash}`"
:class="hasBodyClasses.contentByHash"
data-testid="content-area"
>
@@ -463,7 +453,7 @@ export default {
</template>
</gl-sprintf>
</gl-alert>
- <div v-if="showFileDiscussions" class="gl-border-b" data-testid="file-discussions">
+ <div v-if="showFileDiscussions" data-testid="file-discussions">
<div class="diff-file-discussions-wrapper">
<diff-discussions
v-if="fileDiscussions.length"
@@ -485,9 +475,7 @@ export default {
class="gl-py-3 gl-px-5"
data-testid="file-note-form"
@handleFormUpdate="handleSaveNote"
- @handleFormUpdateAddToReview="
- (note) => addToReview(note, $options.FILE_DIFF_POSITION_TYPE)
- "
+ @handleFormUpdateAddToReview="handleSaveDraftNote"
@cancelForm="toggleFileCommentForm(file.file_path)"
/>
</div>
@@ -538,20 +526,3 @@ export default {
</template>
</div>
</template>
-
-<style>
-@keyframes shadow-fade {
- from {
- box-shadow: 0 0 4px #919191;
- }
-
- to {
- box-shadow: 0 0 0 #dfdfdf;
- }
-}
-
-.diff-file.is-active {
- box-shadow: 0 0 0 #dfdfdf;
- animation: shadow-fade 1.2s 0.1s 1;
-}
-</style>
diff --git a/app/assets/javascripts/diffs/components/diff_file_header.vue b/app/assets/javascripts/diffs/components/diff_file_header.vue
index 494a20045f7..e336161f952 100644
--- a/app/assets/javascripts/diffs/components/diff_file_header.vue
+++ b/app/assets/javascripts/diffs/components/diff_file_header.vue
@@ -101,11 +101,6 @@ export default {
required: false,
default: false,
},
- codequalityDiff: {
- type: Array,
- required: false,
- default: () => [],
- },
},
idState() {
return {
@@ -212,7 +207,7 @@ export default {
return this.expanded ? __('Hide file contents') : __('Show file contents');
},
showCommentButton() {
- return this.getNoteableData.current_user.can_create_note && this.glFeatures.commentOnFiles;
+ return this.getNoteableData.current_user.can_create_note;
},
},
watch: {
@@ -428,6 +423,7 @@ export default {
toggle-class="btn-icon js-diff-more-actions"
class="gl-pt-0!"
data-qa-selector="dropdown_button"
+ lazy
@show="setMoreActionsShown(true)"
@hidden="setMoreActionsShown(false)"
>
diff --git a/app/assets/javascripts/diffs/components/diff_inline_findings.vue b/app/assets/javascripts/diffs/components/diff_inline_findings.vue
new file mode 100644
index 00000000000..1e9a1825d3e
--- /dev/null
+++ b/app/assets/javascripts/diffs/components/diff_inline_findings.vue
@@ -0,0 +1,32 @@
+<script>
+import DiffCodeQualityItem from './diff_code_quality_item.vue';
+
+export default {
+ components: { DiffCodeQualityItem },
+ props: {
+ title: {
+ type: String,
+ required: true,
+ },
+ findings: {
+ type: Array,
+ required: true,
+ },
+ },
+};
+</script>
+
+<template>
+ <div>
+ <h4 data-testid="diff-inline-findings-heading" class="gl-my-0 gl-font-base gl-font-regular">
+ {{ title }}
+ </h4>
+ <ul class="gl-list-style-none gl-mb-0 gl-p-0">
+ <diff-code-quality-item
+ v-for="finding in findings"
+ :key="finding.description"
+ :finding="finding"
+ />
+ </ul>
+ </div>
+</template>
diff --git a/app/assets/javascripts/diffs/components/diff_line.vue b/app/assets/javascripts/diffs/components/diff_line.vue
index 448272549d3..40e53438bc8 100644
--- a/app/assets/javascripts/diffs/components/diff_line.vue
+++ b/app/assets/javascripts/diffs/components/diff_line.vue
@@ -15,13 +15,22 @@ export default {
parsedCodeQuality() {
return (this.line.left ?? this.line.right)?.codequality;
},
+ parsedSast() {
+ return (this.line.left ?? this.line.right)?.sast;
+ },
codeQualityLineNumber() {
- return this.parsedCodeQuality[0].line;
+ return this.parsedCodeQuality[0]?.line;
+ },
+ sastLineNumber() {
+ return this.parsedSast[0]?.line;
},
},
methods: {
hideCodeQualityFindings() {
- this.$emit('hideCodeQualityFindings', this.codeQualityLineNumber);
+ this.$emit(
+ 'hideCodeQualityFindings',
+ this.codeQualityLineNumber ? this.codeQualityLineNumber : this.sastLineNumber,
+ );
},
},
};
@@ -30,6 +39,7 @@ export default {
<template>
<diff-code-quality
:code-quality="parsedCodeQuality"
+ :sast="parsedSast"
@hideCodeQualityFindings="hideCodeQualityFindings"
/>
</template>
diff --git a/app/assets/javascripts/diffs/components/diff_line_note_form.vue b/app/assets/javascripts/diffs/components/diff_line_note_form.vue
index 9ddf5b51c9a..9a3256beff4 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,7 @@
<script>
import { mapState, mapGetters, mapActions } from 'vuex';
-import { s__, __ } from '~/locale';
+import { s__, __, sprintf } from '~/locale';
+import { createAlert } from '~/alert';
import diffLineNoteFormMixin from '~/notes/mixins/diff_line_note_form';
import { confirmAction } from '~/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal';
import { ignoreWhilePending } from '~/lib/utils/ignore_while_pending';
@@ -15,6 +16,7 @@ import {
PARALLEL_DIFF_VIEW_TYPE,
OLD_LINE_TYPE,
} from '../constants';
+import { SAVING_THE_COMMENT_FAILED, SOMETHING_WENT_WRONG } from '../i18n';
export default {
components: {
@@ -207,10 +209,22 @@ export default {
fileHash: this.diffFileHash,
});
}),
- handleSaveNote(note) {
- return this.saveDiffDiscussion({ note, formData: this.formData }).then(() =>
- this.handleCancelCommentForm(),
- );
+ handleSaveNote(note, parentElement, errorCallback) {
+ return this.saveDiffDiscussion({ note, formData: this.formData })
+ .then(() => this.handleCancelCommentForm())
+ .catch((e) => {
+ const reason = e.response?.data?.errors;
+ const errorMessage = reason
+ ? sprintf(SAVING_THE_COMMENT_FAILED, { reason })
+ : SOMETHING_WENT_WRONG;
+
+ createAlert({
+ message: errorMessage,
+ parent: parentElement,
+ });
+
+ errorCallback();
+ });
},
updateStartLine(line) {
this.commentLineStart = line;
diff --git a/app/assets/javascripts/diffs/components/diff_row.vue b/app/assets/javascripts/diffs/components/diff_row.vue
index 1f5c9b4f2f5..3c9770864fa 100644
--- a/app/assets/javascripts/diffs/components/diff_row.vue
+++ b/app/assets/javascripts/diffs/components/diff_row.vue
@@ -141,6 +141,18 @@ export default {
},
(props) => [props.inline, props.line.right?.codequality?.length].join(':'),
),
+ showSecurityLeft: memoize(
+ (props) => {
+ return props.inline && props.line.left?.sast?.length > 0;
+ },
+ (props) => [props.inline, props.line.left?.sast?.length].join(':'),
+ ),
+ showSecurityRight: memoize(
+ (props) => {
+ return !props.inline && props.line.right?.sast?.length > 0;
+ },
+ (props) => [props.inline, props.line.right?.sast?.length].join(':'),
+ ),
classNameMapCellLeft: memoize(
(props) => {
return utils.classNameMapCell({
@@ -180,10 +192,13 @@ export default {
].join(':'),
),
shouldRenderCommentButton: memoize(
- (props) => {
- return isLoggedIn() && !props.line.isContextLineLeft && !props.line.isMetaLineLeft;
+ (props, side) => {
+ return (
+ isLoggedIn() && !props.line[`isContextLine${side}`] && !props.line[`isMetaLine${side}`]
+ );
},
- (props) => [props.line.isContextLineLeft, props.line.isMetaLineLeft].join(':'),
+ (props, side) =>
+ [props.line[`isContextLine${side}`], props.line[`isMetaLine${side}`]].join(':'),
),
interopLeftAttributes(props) {
if (props.inline) {
@@ -237,7 +252,7 @@ export default {
<span
v-if="
!props.line.left.isConflictMarker &&
- $options.shouldRenderCommentButton(props) &&
+ $options.shouldRenderCommentButton(props, 'Left') &&
!props.line.hasDiscussionsLeft
"
class="add-diff-note tooltip-wrapper has-tooltip"
@@ -322,12 +337,17 @@ export default {
>
<component
:is="$options.CodeQualityGutterIcon"
- v-if="$options.showCodequalityLeft(props)"
+ v-if="$options.showCodequalityLeft(props) || $options.showSecurityLeft(props)"
:code-quality-expanded="props.codeQualityExpanded"
:codequality="props.line.left.codequality"
+ :sast="props.line.left.sast"
:file-path="props.filePath"
@showCodeQualityFindings="
- listeners.toggleCodeQualityFindings(props.line.left.codequality[0].line)
+ listeners.toggleCodeQualityFindings(
+ props.line.left.codequality[0]
+ ? props.line.left.codequality[0].line
+ : props.line.left.sast[0].line,
+ )
"
/>
</div>
@@ -384,7 +404,10 @@ export default {
<div :class="$options.classNameMapCellRight(props)" class="diff-td diff-line-num new_line">
<template v-if="props.line.right.type !== $options.CONFLICT_MARKER_THEIR">
<span
- v-if="$options.shouldRenderCommentButton(props) && !props.line.hasDiscussionsRight"
+ v-if="
+ $options.shouldRenderCommentButton(props, 'Right') &&
+ !props.line.hasDiscussionsRight
+ "
class="add-diff-note tooltip-wrapper has-tooltip"
:title="props.line.right.addCommentTooltip"
>
@@ -455,12 +478,17 @@ export default {
>
<component
:is="$options.CodeQualityGutterIcon"
- v-if="$options.showCodequalityRight(props)"
+ v-if="$options.showCodequalityRight(props) || $options.showSecurityRight(props)"
:codequality="props.line.right.codequality"
+ :sast="props.line.right.sast"
:file-path="props.filePath"
data-testid="codeQualityIcon"
@showCodeQualityFindings="
- listeners.toggleCodeQualityFindings(props.line.right.codequality[0].line)
+ listeners.toggleCodeQualityFindings(
+ props.line.right.codequality[0]
+ ? props.line.right.codequality[0].line
+ : props.line.right.sast[0].line,
+ )
"
/>
</div>
diff --git a/app/assets/javascripts/diffs/components/diff_row_utils.js b/app/assets/javascripts/diffs/components/diff_row_utils.js
index a489c96b0c9..28834dab3b3 100644
--- a/app/assets/javascripts/diffs/components/diff_row_utils.js
+++ b/app/assets/javascripts/diffs/components/diff_row_utils.js
@@ -189,3 +189,7 @@ export const mapParallel = (content) => (line) => {
commentRowClasses: hasDiscussions(left) || hasDiscussions(right) ? '' : 'js-temp-notes-holder',
};
};
+
+export const mapParallelNoSast = (content) => {
+ return mapParallel(content);
+};
diff --git a/app/assets/javascripts/diffs/components/diff_view.vue b/app/assets/javascripts/diffs/components/diff_view.vue
index 7c87ea1cbf2..6bacc6839d8 100644
--- a/app/assets/javascripts/diffs/components/diff_view.vue
+++ b/app/assets/javascripts/diffs/components/diff_view.vue
@@ -57,6 +57,7 @@ export default {
...mapGetters('diffs', ['commitId', 'fileLineCoverage']),
...mapState('diffs', [
'codequalityDiff',
+ 'sastDiff',
'highlightedRow',
'coverageLoaded',
'selectedCommentPosition',
@@ -75,7 +76,10 @@ export default {
);
},
hasCodequalityChanges() {
- return this.codequalityDiff?.files?.[this.diffFile.file_path]?.length > 0;
+ return (
+ this.codequalityDiff?.files?.[this.diffFile.file_path]?.length > 0 ||
+ this.sastDiff?.added?.length > 0
+ );
},
},
created() {
@@ -183,7 +187,10 @@ export default {
);
},
getCodeQualityLine(line) {
- return (line.left ?? line.right)?.codequality?.[0]?.line;
+ return (
+ (line.left ?? line.right)?.codequality?.[0]?.line ||
+ (line.left ?? line.right)?.sast?.[0]?.line
+ );
},
lineDrafts(line, side) {
return (line[side]?.lineDrafts || []).filter((entry) => entry.isDraft);
diff --git a/app/assets/javascripts/diffs/components/pre_renderer.vue b/app/assets/javascripts/diffs/components/pre_renderer.vue
deleted file mode 100644
index e4320c40d2c..00000000000
--- a/app/assets/javascripts/diffs/components/pre_renderer.vue
+++ /dev/null
@@ -1,83 +0,0 @@
-<script>
-export default {
- inject: ['vscrollParent'],
- props: {
- maxLength: {
- type: Number,
- required: true,
- },
- },
- data() {
- return {
- nextIndex: -1,
- nextItem: null,
- startedRender: false,
- width: 0,
- };
- },
- mounted() {
- this.width = this.$el.parentNode.offsetWidth;
-
- this.$_itemsWithSizeWatcher = this.$watch('vscrollParent.itemsWithSize', async () => {
- await this.$nextTick();
-
- const nextItem = this.findNextToRender();
-
- if (nextItem) {
- this.startedRender = true;
- requestIdleCallback(() => {
- this.nextItem = nextItem;
-
- if (this.nextIndex === this.maxLength - 1) {
- this.$nextTick(() => {
- if (this.vscrollParent.itemsWithSize[this.maxLength - 1].size !== 0) {
- this.clearRendering();
- }
- });
- }
- });
- } else if (this.startedRender) {
- this.clearRendering();
- }
- });
- },
- beforeDestroy() {
- this.$_itemsWithSizeWatcher();
- },
- methods: {
- clearRendering() {
- this.nextItem = null;
-
- if (this.maxLength === this.vscrollParent.itemsWithSize.length) {
- this.$_itemsWithSizeWatcher();
- }
- },
- findNextToRender() {
- return this.vscrollParent.itemsWithSize.find(({ size }, index) => {
- const isNext = size === 0;
-
- if (isNext) {
- this.nextIndex = index;
- }
-
- return isNext;
- });
- },
- },
-};
-</script>
-
-<template>
- <div v-if="nextItem" :style="{ width: `${width}px` }" class="gl-absolute diff-file-offscreen">
- <slot
- v-bind="{ item: nextItem.item, index: nextIndex, active: true, itemWithSize: nextItem }"
- ></slot>
- </div>
-</template>
-
-<style scoped>
-.diff-file-offscreen {
- top: -200%;
- left: -200%;
-}
-</style>
diff --git a/app/assets/javascripts/diffs/components/settings_dropdown.vue b/app/assets/javascripts/diffs/components/settings_dropdown.vue
index 2d9ac76b3e4..a705f29ff65 100644
--- a/app/assets/javascripts/diffs/components/settings_dropdown.vue
+++ b/app/assets/javascripts/diffs/components/settings_dropdown.vue
@@ -2,23 +2,22 @@
import {
GlButtonGroup,
GlButton,
- GlDropdown,
+ GlDisclosureDropdown,
GlFormCheckbox,
- GlTooltipDirective,
+ GlTooltip,
} from '@gitlab/ui';
import { mapActions, mapGetters, mapState } from 'vuex';
import { SETTINGS_DROPDOWN } from '../i18n';
export default {
i18n: SETTINGS_DROPDOWN,
- directives: {
- GlTooltip: GlTooltipDirective,
- },
+ toggleId: 'js-show-diff-settings',
components: {
GlButtonGroup,
GlButton,
- GlDropdown,
+ GlDisclosureDropdown,
GlFormCheckbox,
+ GlTooltip,
},
computed: {
...mapGetters('diffs', ['isInlineView', 'isParallelView']),
@@ -43,74 +42,87 @@ export default {
</script>
<template>
- <gl-dropdown
- v-gl-tooltip
- icon="settings"
- :title="$options.i18n.preferences"
- :text="$options.i18n.preferences"
- :text-sr-only="true"
- :aria-label="$options.i18n.preferences"
- :header-text="$options.i18n.preferences"
- toggle-class="js-show-diff-settings"
- right
- >
- <div class="gl-px-3">
- <span class="gl-font-weight-bold gl-display-block gl-mb-2">{{ __('File browser') }}</span>
- <gl-button-group class="gl-display-flex">
- <gl-button
- :class="{ selected: !renderTreeList }"
- class="gl-w-half js-list-view"
- @click="setRenderTreeList({ renderTreeList: false })"
- >
- {{ __('List view') }}
- </gl-button>
- <gl-button
- :class="{ selected: renderTreeList }"
- class="gl-w-half js-tree-view"
- @click="setRenderTreeList({ renderTreeList: true })"
- >
- {{ __('Tree view') }}
- </gl-button>
- </gl-button-group>
- </div>
- <div class="gl-mt-3 gl-px-3">
- <span class="gl-font-weight-bold gl-display-block gl-mb-2">{{ __('Compare changes') }}</span>
- <gl-button-group class="gl-display-flex js-diff-view-buttons">
- <gl-button
- id="inline-diff-btn"
- :class="{ selected: isInlineView }"
- class="gl-w-half js-inline-diff-button"
- data-view-type="inline"
- @click="setInlineDiffViewType"
- >
- {{ __('Inline') }}
- </gl-button>
- <gl-button
- id="parallel-diff-btn"
- :class="{ selected: isParallelView }"
- class="gl-w-half js-parallel-diff-button"
- data-view-type="parallel"
- @click="setParallelDiffViewType"
- >
- {{ __('Side-by-side') }}
- </gl-button>
- </gl-button-group>
- </div>
- <gl-form-checkbox
- data-testid="show-whitespace"
- class="gl-mt-3 gl-ml-3"
- :checked="showWhitespace"
- @input="toggleWhitespace"
- >
- {{ $options.i18n.whitespace }}
- </gl-form-checkbox>
- <gl-form-checkbox
- data-testid="file-by-file"
- class="gl-ml-3 gl-mb-0"
- :checked="viewDiffsFileByFile"
- @input="toggleFileByFile"
+ <div>
+ <gl-disclosure-dropdown
+ :toggle-class="$options.toggleId"
+ :toggle-id="$options.toggleId"
+ icon="settings"
+ :text="$options.i18n.preferences"
+ text-sr-only
+ :aria-label="$options.i18n.preferences"
+ placement="right"
+ :auto-close="false"
>
- {{ $options.i18n.fileByFile }}
- </gl-form-checkbox>
- </gl-dropdown>
+ <slot name="header">
+ <span
+ class="gl-font-weight-bold gl-display-block gl-mb-3 gl-pb-2 gl-text-center gl-border-b"
+ >{{ $options.i18n.preferences }}</span
+ >
+ </slot>
+ <div class="gl-px-3">
+ <span class="gl-font-weight-bold gl-display-block gl-mb-2">{{ __('File browser') }}</span>
+ <gl-button-group class="gl-display-flex">
+ <gl-button
+ :class="{ selected: !renderTreeList }"
+ class="gl-w-half js-list-view"
+ @click="setRenderTreeList({ renderTreeList: false })"
+ >
+ {{ __('List view') }}
+ </gl-button>
+ <gl-button
+ :class="{ selected: renderTreeList }"
+ class="gl-w-half js-tree-view"
+ @click="setRenderTreeList({ renderTreeList: true })"
+ >
+ {{ __('Tree view') }}
+ </gl-button>
+ </gl-button-group>
+ </div>
+ <div class="gl-mt-3 gl-px-3">
+ <span class="gl-font-weight-bold gl-display-block gl-mb-2">{{
+ __('Compare changes')
+ }}</span>
+ <gl-button-group class="gl-display-flex js-diff-view-buttons">
+ <gl-button
+ id="inline-diff-btn"
+ :class="{ selected: isInlineView }"
+ class="gl-w-half js-inline-diff-button"
+ data-view-type="inline"
+ @click="setInlineDiffViewType"
+ >
+ {{ __('Inline') }}
+ </gl-button>
+ <gl-button
+ id="parallel-diff-btn"
+ :class="{ selected: isParallelView }"
+ class="gl-w-half js-parallel-diff-button"
+ data-view-type="parallel"
+ @click="setParallelDiffViewType"
+ >
+ {{ __('Side-by-side') }}
+ </gl-button>
+ </gl-button-group>
+ </div>
+ <gl-form-checkbox
+ data-testid="show-whitespace"
+ class="gl-mt-3 gl-ml-3"
+ :checked="showWhitespace"
+ @input="toggleWhitespace"
+ >
+ {{ $options.i18n.whitespace }}
+ </gl-form-checkbox>
+ <gl-form-checkbox
+ data-testid="file-by-file"
+ class="gl-ml-3 gl-mb-0"
+ :checked="viewDiffsFileByFile"
+ @input="toggleFileByFile"
+ >
+ {{ $options.i18n.fileByFile }}
+ </gl-form-checkbox>
+ </gl-disclosure-dropdown>
+
+ <gl-tooltip :target="$options.toggleId" triggers="hover">{{
+ $options.i18n.preferences
+ }}</gl-tooltip>
+ </div>
</template>
diff --git a/app/assets/javascripts/diffs/components/tree_list.vue b/app/assets/javascripts/diffs/components/tree_list.vue
index b9bfceee6b4..6f17d70b952 100644
--- a/app/assets/javascripts/diffs/components/tree_list.vue
+++ b/app/assets/javascripts/diffs/components/tree_list.vue
@@ -186,10 +186,10 @@ export default {
v-show="search"
:aria-label="__('Clear search')"
type="button"
- class="position-absolute bg-transparent tree-list-icon tree-list-clear-icon border-0 p-0"
+ class="gl-absolute gl-top-3 bg-transparent tree-list-icon tree-list-clear-icon border-0 p-0"
@click="clearSearch"
>
- <gl-icon name="close" class="gl-absolute gl-top-3 gl-right-1 tree-list-icon" />
+ <gl-icon name="close" class="gl-top-3 gl-right-1 tree-list-icon" />
</button>
</div>
</div>
diff --git a/app/assets/javascripts/diffs/components/virtual_scroller_scroll_sync.js b/app/assets/javascripts/diffs/components/virtual_scroller_scroll_sync.js
index d44dffecc38..fc36153a870 100644
--- a/app/assets/javascripts/diffs/components/virtual_scroller_scroll_sync.js
+++ b/app/assets/javascripts/diffs/components/virtual_scroller_scroll_sync.js
@@ -18,17 +18,18 @@ export default {
if (index < 0) return;
- if (this.vscrollParent.itemsWithSize[index].size) {
- this.scrollToIndex(index);
- } else {
+ this.scrollToIndex(index);
+
+ if (!this.vscrollParent.itemsWithSize[index].size) {
this.$_itemsWithSizeWatcher = this.$watch('vscrollParent.itemsWithSize', async () => {
await this.$nextTick();
if (this.vscrollParent.itemsWithSize[index].size) {
this.$_itemsWithSizeWatcher();
- this.scrollToIndex(index);
await this.$nextTick();
+
+ this.scrollToIndex(index);
}
});
}
@@ -40,10 +41,12 @@ export default {
if (this.$_itemsWithSizeWatcher) this.$_itemsWithSizeWatcher();
},
methods: {
- scrollToIndex(index) {
+ async scrollToIndex(index) {
this.vscrollParent.scrollToItem(index);
this.$emit('update', -1);
+ await this.$nextTick();
+
setTimeout(() => {
handleLocationHash();
});
diff --git a/app/assets/javascripts/diffs/i18n.js b/app/assets/javascripts/diffs/i18n.js
index e233a0cef0a..15e3893d22a 100644
--- a/app/assets/javascripts/diffs/i18n.js
+++ b/app/assets/javascripts/diffs/i18n.js
@@ -1,6 +1,5 @@
import { __, s__ } from '~/locale';
-export const GENERIC_ERROR = __('Something went wrong on our end. Please try again!');
export const LOAD_SINGLE_DIFF_FAILED = s__(
"MergeRequest|Can't fetch the diff needed to update this view. Please reload this page.",
);
@@ -58,3 +57,18 @@ export const CONFLICT_TEXT = {
export const HIDE_COMMENTS = __('Hide comments');
export const NEW_CODE_QUALITY_FINDINGS = __('New code quality findings');
+export const NEW_SAST_FINDINGS = __('New Security findings');
+
+export const BUILDING_YOUR_MR = __(
+ 'Building your merge request… This page will update when the build is complete.',
+);
+export const SOMETHING_WENT_WRONG = __('Something went wrong on our end. Please try again!');
+export const SAVING_THE_COMMENT_FAILED = s__(
+ 'MergeRequests|Your comment could not be submitted because %{reason}.',
+);
+export const ERROR_LOADING_FULL_DIFF = s__(
+ 'MergeRequest|Error loading full diff. Please try again.',
+);
+export const ERROR_DISMISSING_SUGESTION_POPOVER = s__(
+ 'MergeRequest|Error dismissing suggestion popover. Please try again.',
+);
diff --git a/app/assets/javascripts/diffs/index.js b/app/assets/javascripts/diffs/index.js
index 29cf90dcbe2..b9cf26827f2 100644
--- a/app/assets/javascripts/diffs/index.js
+++ b/app/assets/javascripts/diffs/index.js
@@ -32,6 +32,7 @@ export default function initDiffsApp(store = notesStore) {
return {
endpointCoverage: dataset.endpointCoverage || '',
endpointCodequality: dataset.endpointCodequality || '',
+ endpointSast: dataset.endpointSast || '',
helpPagePath: dataset.helpPagePath,
currentUser: JSON.parse(dataset.currentUserData) || {},
changesEmptyStateIllustration: dataset.changesEmptyStateIllustration,
@@ -79,6 +80,7 @@ export default function initDiffsApp(store = notesStore) {
props: {
endpointCoverage: this.endpointCoverage,
endpointCodequality: this.endpointCodequality,
+ endpointSast: this.endpointSast,
currentUser: this.currentUser,
helpPagePath: this.helpPagePath,
shouldShow: this.activeTab === 'diffs',
diff --git a/app/assets/javascripts/diffs/store/actions.js b/app/assets/javascripts/diffs/store/actions.js
index 029be6ebad9..2a557017953 100644
--- a/app/assets/javascripts/diffs/store/actions.js
+++ b/app/assets/javascripts/diffs/store/actions.js
@@ -6,13 +6,11 @@ import {
scrollToElement,
} from '~/lib/utils/common_utils';
import { createAlert, VARIANT_WARNING } from '~/alert';
-import { diffViewerModes } from '~/ide/constants';
import axios from '~/lib/utils/axios_utils';
import { HTTP_STATUS_NOT_FOUND, HTTP_STATUS_OK } from '~/lib/utils/http_status';
import Poll from '~/lib/utils/poll';
import { mergeUrlParams, getLocationHash } from '~/lib/utils/url_utility';
-import { __, s__ } from '~/locale';
import notesEventHub from '~/notes/event_hub';
import { generateTreeList } from '~/diffs/utils/tree_worker_utils';
import { sortTree } from '~/ide/stores/utils';
@@ -52,9 +50,15 @@ import {
EVT_MR_PREPARED,
FILE_DIFF_POSITION_TYPE,
} from '../constants';
-import { DISCUSSION_SINGLE_DIFF_FAILED, LOAD_SINGLE_DIFF_FAILED } from '../i18n';
+import {
+ DISCUSSION_SINGLE_DIFF_FAILED,
+ LOAD_SINGLE_DIFF_FAILED,
+ BUILDING_YOUR_MR,
+ SOMETHING_WENT_WRONG,
+ ERROR_LOADING_FULL_DIFF,
+ ERROR_DISMISSING_SUGESTION_POPOVER,
+} from '../i18n';
import eventHub from '../event_hub';
-import { isCollapsed } from '../utils/diff_file';
import { markFileReview, setReviewsForMergeRequest } from '../utils/file_reviews';
import { getDerivedMergeRequestInformation } from '../utils/merge_request';
import { queueRedisHllEvents } from '../utils/queue_events';
@@ -84,6 +88,7 @@ export const setBaseConfig = ({ commit }, options) => {
defaultSuggestionCommitMessage,
viewDiffsFileByFile,
mrReviews,
+ diffViewType,
} = options;
commit(types.SET_BASE_CONFIG, {
endpoint,
@@ -98,6 +103,7 @@ export const setBaseConfig = ({ commit }, options) => {
defaultSuggestionCommitMessage,
viewDiffsFileByFile,
mrReviews,
+ diffViewType,
});
Array.from(new Set(Object.values(mrReviews).flat())).forEach((id) => {
@@ -171,7 +177,7 @@ export const fetchDiffFilesBatch = ({ commit, state, dispatch }) => {
};
const hash = window.location.hash.replace('#', '').split('diff-content-').pop();
let totalLoaded = 0;
- let scrolledVirtualScroller = false;
+ let scrolledVirtualScroller = hash === '';
commit(types.SET_BATCH_LOADING_STATE, 'loading');
commit(types.SET_RETRIEVING_BATCHES, true);
@@ -243,8 +249,6 @@ export const fetchDiffFilesBatch = ({ commit, state, dispatch }) => {
return nextPage;
})
.then((nextPage) => {
- dispatch('startRenderDiffsQueue');
-
if (nextPage) {
return getBatch(nextPage);
}
@@ -290,9 +294,7 @@ export const fetchDiffFilesMeta = ({ commit, state }) => {
.catch((error) => {
if (error.response.status === HTTP_STATUS_NOT_FOUND) {
const alert = createAlert({
- message: __(
- 'Building your merge request… This page will update when the build is complete.',
- ),
+ message: BUILDING_YOUR_MR,
variant: VARIANT_WARNING,
});
@@ -318,7 +320,7 @@ export const fetchCoverageFiles = ({ commit, state }) => {
},
errorCallback: () =>
createAlert({
- message: __('Something went wrong on our end. Please try again!'),
+ message: SOMETHING_WENT_WRONG,
}),
});
@@ -379,10 +381,6 @@ export const renderFileForDiscussionId = ({ commit, rootState, state }, discussi
const file = state.diffFiles.find((f) => f.file_hash === discussion.diff_file.file_hash);
if (file) {
- if (!file.renderIt) {
- commit(types.RENDER_FILE, file);
- }
-
if (file.viewer.automaticallyCollapsed) {
notesEventHub.$emit(`loadCollapsedDiff/${file.file_hash}`);
scrollToElement(document.getElementById(file.file_hash));
@@ -400,46 +398,6 @@ export const renderFileForDiscussionId = ({ commit, rootState, state }, discussi
}
};
-export const startRenderDiffsQueue = ({ state, commit }) => {
- const diffFilesToRender = state.diffFiles.filter(
- (file) =>
- !file.renderIt &&
- file.viewer &&
- (!isCollapsed(file) || file.viewer.name !== diffViewerModes.text),
- );
- let currentDiffFileIndex = 0;
-
- const checkItem = () => {
- const nextFile = diffFilesToRender[currentDiffFileIndex];
-
- if (nextFile) {
- let retryCount = 0;
- currentDiffFileIndex += 1;
- commit(types.RENDER_FILE, nextFile);
-
- const requestIdle = () =>
- requestIdleCallback((idleDeadline) => {
- // Wait for at least 5ms before trying to render
- // or for 5 tries and then force render the file
- if (idleDeadline.timeRemaining() >= 5 || retryCount > 4) {
- checkItem();
- } else {
- requestIdle();
- retryCount += 1;
- }
- });
-
- requestIdle();
- }
- };
-
- if (diffFilesToRender.length) {
- checkItem();
- }
-};
-
-export const setRenderIt = ({ commit }, file) => commit(types.RENDER_FILE, file);
-
export const setInlineDiffViewType = ({ commit }) => {
commit(types.SET_DIFF_VIEW_TYPE, INLINE_DIFF_VIEW_TYPE);
@@ -619,12 +577,7 @@ export const saveDiffDiscussion = async ({ state, dispatch }, { note, formData }
if (formData.positionType === FILE_DIFF_POSITION_TYPE) {
dispatch('toggleFileCommentForm', formData.diffFile.file_path);
}
- })
- .catch(() =>
- createAlert({
- message: s__('MergeRequests|Saving the comment failed'),
- }),
- );
+ });
};
export const toggleTreeOpen = ({ commit }, path) => {
@@ -757,7 +710,7 @@ export const cacheTreeListWidth = (_, size) => {
export const receiveFullDiffError = ({ commit }, filePath) => {
commit(types.RECEIVE_FULL_DIFF_ERROR, filePath);
createAlert({
- message: s__('MergeRequest|Error loading full diff. Please try again.'),
+ message: ERROR_LOADING_FULL_DIFF,
});
};
@@ -845,7 +798,7 @@ export const toggleFullDiff = ({ dispatch, commit, getters, state }, filePath) =
}
};
-export function switchToFullDiffFromRenamedFile({ commit, dispatch }, { diffFile }) {
+export function switchToFullDiffFromRenamedFile({ commit }, { diffFile }) {
return axios
.get(diffFile.context_lines_path, {
params: {
@@ -872,8 +825,6 @@ export function switchToFullDiffFromRenamedFile({ commit, dispatch }, { diffFile
},
});
commit(types.SET_CURRENT_VIEW_DIFF_FILE_LINES, { filePath: diffFile.file_path, lines });
-
- dispatch('startRenderDiffsQueue');
});
}
@@ -895,7 +846,7 @@ export const setSuggestPopoverDismissed = ({ commit, state }) =>
})
.catch(() => {
createAlert({
- message: s__('MergeRequest|Error dismissing suggestion popover. Please try again.'),
+ message: ERROR_DISMISSING_SUGESTION_POPOVER,
});
});
diff --git a/app/assets/javascripts/diffs/store/getters.js b/app/assets/javascripts/diffs/store/getters.js
index a8a831fb269..d82959daa9d 100644
--- a/app/assets/javascripts/diffs/store/getters.js
+++ b/app/assets/javascripts/diffs/store/getters.js
@@ -153,6 +153,11 @@ export const fileLineCodequality = () => () => {
return null;
};
+// This function is overwritten for the inline SAST feature in EE
+export const fileLineSast = () => () => {
+ return null;
+};
+
/**
* Returns index of a currently selected diff in diffFiles
* @returns {number}
diff --git a/app/assets/javascripts/diffs/store/modules/diff_state.js b/app/assets/javascripts/diffs/store/modules/diff_state.js
index 593c28f20ec..d5e1a05f4a5 100644
--- a/app/assets/javascripts/diffs/store/modules/diff_state.js
+++ b/app/assets/javascripts/diffs/store/modules/diff_state.js
@@ -1,11 +1,4 @@
-import { getCookie } from '~/lib/utils/common_utils';
-import { getParameterValues } from '~/lib/utils/url_utility';
-import { INLINE_DIFF_VIEW_TYPE, DIFF_VIEW_COOKIE_NAME } from '../../constants';
-
-const getViewTypeFromQueryString = () => getParameterValues('view')[0];
-
-const viewTypeFromCookie = getCookie(DIFF_VIEW_COOKIE_NAME);
-const defaultViewType = INLINE_DIFF_VIEW_TYPE;
+import { INLINE_DIFF_VIEW_TYPE } from '../../constants';
export default () => ({
isLoading: true,
@@ -25,7 +18,7 @@ export default () => ({
coverageLoaded: false,
mergeRequestDiffs: [],
mergeRequestDiff: null,
- diffViewType: getViewTypeFromQueryString() || viewTypeFromCookie || defaultViewType,
+ diffViewType: INLINE_DIFF_VIEW_TYPE,
tree: [],
treeEntries: {},
showTreeList: true,
diff --git a/app/assets/javascripts/diffs/store/mutations.js b/app/assets/javascripts/diffs/store/mutations.js
index 2786e971f4b..4855ca87e91 100644
--- a/app/assets/javascripts/diffs/store/mutations.js
+++ b/app/assets/javascripts/diffs/store/mutations.js
@@ -23,12 +23,6 @@ function updateDiffFilesInState(state, files) {
return Object.assign(state, { diffFiles: files });
}
-function renderFile(file) {
- Object.assign(file, {
- renderIt: true,
- });
-}
-
export default {
[types.SET_BASE_CONFIG](state, options) {
const {
@@ -44,6 +38,7 @@ export default {
defaultSuggestionCommitMessage,
viewDiffsFileByFile,
mrReviews,
+ diffViewType,
} = options;
Object.assign(state, {
endpoint,
@@ -58,6 +53,7 @@ export default {
defaultSuggestionCommitMessage,
viewDiffsFileByFile,
mrReviews,
+ diffViewType,
});
},
@@ -100,10 +96,6 @@ export default {
Object.assign(state, { coverageFiles, coverageLoaded: true });
},
- [types.RENDER_FILE](state, file) {
- renderFile(file);
- },
-
[types.SET_MERGE_REQUEST_DIFFS](state, mergeRequestDiffs) {
Object.assign(state, {
mergeRequestDiffs,
@@ -353,10 +345,6 @@ export default {
file.viewer.manuallyCollapsed = null;
}
}
-
- if (file && !collapsed) {
- renderFile(file);
- }
},
[types.SET_CURRENT_VIEW_DIFF_FILE_LINES](state, { filePath, lines }) {
const file = state.diffFiles.find((f) => f.file_path === filePath);
diff --git a/app/assets/javascripts/diffs/store/utils.js b/app/assets/javascripts/diffs/store/utils.js
index 68536d36ac0..97dfd351e67 100644
--- a/app/assets/javascripts/diffs/store/utils.js
+++ b/app/assets/javascripts/diffs/store/utils.js
@@ -307,7 +307,6 @@ function mergeTwoFiles(target, source) {
...target,
[INLINE_DIFF_LINES_KEY]: missingInline ? source[INLINE_DIFF_LINES_KEY] : originalInline,
parallel_diff_lines: null,
- renderIt: source.renderIt,
collapsed: source.collapsed,
};
}
@@ -388,7 +387,6 @@ function prepareDiffFileLines(file) {
function finalizeDiffFile(file) {
Object.assign(file, {
- renderIt: true,
isShowingFullFile: false,
isLoadingFullFile: false,
discussions: [],
diff --git a/app/assets/javascripts/emoji/components/category.vue b/app/assets/javascripts/emoji/components/category.vue
index 39881979c4f..a72e7df7769 100644
--- a/app/assets/javascripts/emoji/components/category.vue
+++ b/app/assets/javascripts/emoji/components/category.vue
@@ -33,6 +33,9 @@ export default {
this.renderGroup = true;
this.$emit('appear', this.category);
},
+ onClick(emoji) {
+ this.$emit('click', { category: this.category, emoji });
+ },
},
};
</script>
@@ -48,7 +51,7 @@ export default {
:key="index"
:emojis="emojiGroup"
:render-group="renderGroup"
- :click-emoji="(emoji) => $emit('click', emoji)"
+ :click-emoji="(emoji) => onClick(emoji)"
/>
</template>
<p v-else>
diff --git a/app/assets/javascripts/emoji/components/picker.vue b/app/assets/javascripts/emoji/components/picker.vue
index 840297b870a..0e3dd9f7535 100644
--- a/app/assets/javascripts/emoji/components/picker.vue
+++ b/app/assets/javascripts/emoji/components/picker.vue
@@ -2,7 +2,7 @@
import { GlIcon, GlDropdown, GlSearchBoxByType } from '@gitlab/ui';
import { findLastIndex } from 'lodash';
import VirtualList from 'vue-virtual-scroll-list';
-import { CATEGORY_NAMES } from '~/emoji';
+import { CATEGORY_NAMES, getEmojiCategoryMap, state } from '~/emoji';
import { CATEGORY_ICON_MAP, FREQUENTLY_USED_KEY } from '../constants';
import Category from './category.vue';
import EmojiList from './emoji_list.vue';
@@ -49,6 +49,7 @@ export default {
categoryNames() {
return CATEGORY_NAMES.filter((c) => {
if (c === FREQUENTLY_USED_KEY) return hasFrequentlyUsedEmojis();
+ if (c === 'custom') return !state.loading && getEmojiCategoryMap().custom.length > 0;
return true;
}).map((category) => ({
name: category,
@@ -66,10 +67,13 @@ export default {
this.$refs.virtualScoller.setScrollTop(top);
},
- selectEmoji(name) {
- this.$emit('click', name);
+ selectEmoji({ category, emoji }) {
+ this.$emit('click', emoji);
this.$refs.dropdown.hide();
- addToFrequentlyUsed(name);
+
+ if (category !== 'custom') {
+ addToFrequentlyUsed(emoji);
+ }
},
getBoundaryElement() {
return this.boundary || document.querySelector('.content-wrapper') || 'scrollParent';
@@ -102,7 +106,20 @@ export default {
@shown="$emit('shown')"
@hidden="$emit('hidden')"
>
- <template #button-content><slot name="button-content"></slot></template>
+ <template #button-content>
+ <slot name="button-content">
+ <gl-icon class="award-control-icon-neutral gl-button-icon gl-icon" name="slight-smile" />
+ <gl-icon
+ class="award-control-icon-positive gl-button-icon gl-icon gl-left-3!"
+ name="smiley"
+ />
+ <gl-icon
+ class="award-control-icon-super-positive gl-button-icon gl-icon gl-left-3!"
+ name="smile"
+ />
+ </slot>
+ <span class="gl-sr-only">{{ __('Add reaction') }}</span>
+ </template>
<gl-search-box-by-type
v-model="searchValue"
class="gl-mx-5! gl-mb-2!"
diff --git a/app/assets/javascripts/emoji/components/utils.js b/app/assets/javascripts/emoji/components/utils.js
index 5eec0992896..2c1c968878b 100644
--- a/app/assets/javascripts/emoji/components/utils.js
+++ b/app/assets/javascripts/emoji/components/utils.js
@@ -52,7 +52,7 @@ export const getEmojiCategories = memoize(async () => {
return Object.freeze(
Object.keys(categories)
- .filter((c) => c !== FREQUENTLY_USED_KEY)
+ .filter((c) => c !== FREQUENTLY_USED_KEY && categories[c].length)
.reduce((acc, category) => {
const emojis = chunk(categories[category], EMOJIS_PER_ROW);
const height = generateCategoryHeight(emojis.length);
diff --git a/app/assets/javascripts/emoji/constants.js b/app/assets/javascripts/emoji/constants.js
index 7970a932095..215ecbfe605 100644
--- a/app/assets/javascripts/emoji/constants.js
+++ b/app/assets/javascripts/emoji/constants.js
@@ -3,6 +3,7 @@ export const FREQUENTLY_USED_COOKIE_KEY = 'frequently_used_emojis';
export const CATEGORY_ICON_MAP = {
[FREQUENTLY_USED_KEY]: 'history',
+ custom: 'tanuki',
activity: 'dumbbell',
people: 'smiley',
nature: 'nature',
diff --git a/app/assets/javascripts/emoji/index.js b/app/assets/javascripts/emoji/index.js
index 4484bc03737..1fa81a000a5 100644
--- a/app/assets/javascripts/emoji/index.js
+++ b/app/assets/javascripts/emoji/index.js
@@ -1,14 +1,22 @@
+import Vue from 'vue';
import { escape, minBy } from 'lodash';
import emojiRegexFactory from 'emoji-regex';
import emojiAliases from 'emojis/aliases.json';
+import createApolloClient from '~/lib/graphql';
import { setAttributes } from '~/lib/utils/dom_utils';
import { getEmojiScoreWithIntent } from '~/emoji/utils';
import AccessorUtilities from '../lib/utils/accessor';
import axios from '../lib/utils/axios_utils';
+import customEmojiQuery from './queries/custom_emoji.query.graphql';
import { CACHE_KEY, CACHE_VERSION_KEY, CATEGORY_ICON_MAP, FREQUENTLY_USED_KEY } from './constants';
let emojiMap = null;
let validEmojiNames = null;
+
+export const state = Vue.observable({
+ loading: true,
+});
+
export const FALLBACK_EMOJI_KEY = 'grey_question';
// Keep the version in sync with `lib/gitlab/emoji.rb`
@@ -53,9 +61,43 @@ async function loadEmojiWithNames() {
}, {});
}
+export async function loadCustomEmojiWithNames() {
+ if (document.body?.dataset?.groupFullPath && window.gon?.features?.customEmoji) {
+ const client = createApolloClient();
+ const { data } = await client.query({
+ query: customEmojiQuery,
+ variables: {
+ groupPath: document.body.dataset.groupFullPath,
+ },
+ });
+
+ return data?.group?.customEmoji?.nodes?.reduce((acc, e) => {
+ // Map the custom emoji into the format of the normal emojis
+ acc[e.name] = {
+ c: 'custom',
+ d: e.name,
+ e: undefined,
+ name: e.name,
+ src: e.url,
+ u: 'custom',
+ };
+
+ return acc;
+ }, {});
+ }
+
+ return {};
+}
+
async function prepareEmojiMap() {
- emojiMap = await loadEmojiWithNames();
- validEmojiNames = [...Object.keys(emojiMap), ...Object.keys(emojiAliases)];
+ return Promise.all([loadEmojiWithNames(), loadCustomEmojiWithNames()]).then((values) => {
+ emojiMap = {
+ ...values[0],
+ ...values[1],
+ };
+ validEmojiNames = [...Object.keys(emojiMap), ...Object.keys(emojiAliases)];
+ state.loading = false;
+ });
}
export function initEmojiMap() {
@@ -84,6 +126,10 @@ export function getAllEmoji() {
return emojiMap;
}
+export function findCustomEmoji(name) {
+ return emojiMap[name];
+}
+
function getAliasesMatchingQuery(query) {
return Object.keys(emojiAliases)
.filter((alias) => alias.includes(query))
@@ -176,7 +222,7 @@ export const CATEGORY_NAMES = Object.keys(CATEGORY_ICON_MAP);
let emojiCategoryMap;
export function getEmojiCategoryMap() {
- if (!emojiCategoryMap) {
+ if (!emojiCategoryMap && emojiMap) {
emojiCategoryMap = CATEGORY_NAMES.reduce((acc, category) => {
if (category === FREQUENTLY_USED_KEY) {
return acc;
@@ -218,10 +264,11 @@ export function getEmojiInfo(query, fallback = true) {
}
export function emojiFallbackImageSrc(inputName) {
- const { name } = getEmojiInfo(inputName);
- return `${gon.asset_host || ''}${
- gon.relative_url_root || ''
- }/-/emojis/${EMOJI_VERSION}/${name}.png`;
+ const { name, src } = getEmojiInfo(inputName);
+ return (
+ src ||
+ `${gon.asset_host || ''}${gon.relative_url_root || ''}/-/emojis/${EMOJI_VERSION}/${name}.png`
+ );
}
export function emojiImageTag(name, src) {
@@ -232,8 +279,6 @@ export function emojiImageTag(name, src) {
title: `:${name}:`,
alt: `:${name}:`,
src,
- width: '16',
- height: '16',
align: 'absmiddle',
});
diff --git a/app/assets/javascripts/emoji/queries/custom_emoji.query.graphql b/app/assets/javascripts/emoji/queries/custom_emoji.query.graphql
new file mode 100644
index 00000000000..951027ec274
--- /dev/null
+++ b/app/assets/javascripts/emoji/queries/custom_emoji.query.graphql
@@ -0,0 +1,12 @@
+query getCustomEmoji($groupPath: ID!) {
+ group(fullPath: $groupPath) {
+ id
+ customEmoji {
+ nodes {
+ id
+ name
+ url
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/environments/components/edit_environment.vue b/app/assets/javascripts/environments/components/edit_environment.vue
index 7905c5cf572..a2405d23924 100644
--- a/app/assets/javascripts/environments/components/edit_environment.vue
+++ b/app/assets/javascripts/environments/components/edit_environment.vue
@@ -1,10 +1,10 @@
<script>
import { GlLoadingIcon } from '@gitlab/ui';
import { createAlert } from '~/alert';
-import axios from '~/lib/utils/axios_utils';
import { visitUrl } from '~/lib/utils/url_utility';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import getEnvironment from '../graphql/queries/environment.query.graphql';
+import getEnvironmentWithNamespace from '../graphql/queries/environment_with_namespace.graphql';
import updateEnvironment from '../graphql/mutations/update_environment.mutation.graphql';
import EnvironmentForm from './environment_form.vue';
@@ -14,72 +14,42 @@ export default {
EnvironmentForm,
},
mixins: [glFeatureFlagsMixin()],
- inject: ['projectEnvironmentsPath', 'updateEnvironmentPath', 'projectPath'],
- props: {
- environment: {
- required: true,
- type: Object,
- },
- },
+ inject: ['projectEnvironmentsPath', 'projectPath', 'environmentName'],
apollo: {
environment: {
- query: getEnvironment,
+ query() {
+ return this.glFeatures?.kubernetesNamespaceForEnvironment
+ ? getEnvironmentWithNamespace
+ : getEnvironment;
+ },
variables() {
return {
- environmentName: this.environment.name,
+ environmentName: this.environmentName,
projectFullPath: this.projectPath,
};
},
update(data) {
- this.formEnvironment = data?.project?.environment || {};
+ const result = data?.project?.environment || {};
+ this.formEnvironment = { ...result, clusterAgentId: result?.clusterAgent?.id };
},
},
},
data() {
return {
- isQueryLoading: false,
loading: false,
formEnvironment: null,
};
},
- mounted() {
- if (this.glFeatures?.environmentSettingsToGraphql) {
- this.fetchWithGraphql();
- } else {
- this.formEnvironment = {
- id: this.environment.id,
- name: this.environment.name,
- externalUrl: this.environment.external_url,
- };
- }
+ computed: {
+ isQueryLoading() {
+ return this.$apollo.queries.environment.loading;
+ },
},
methods: {
- async fetchWithGraphql() {
- this.$apollo.addSmartQuery('environmentData', {
- variables() {
- return { environmentName: this.environment.name, projectFullPath: this.projectPath };
- },
- query: getEnvironment,
- update(data) {
- const result = data?.project?.environment || {};
- this.formEnvironment = { ...result, clusterAgentId: result?.clusterAgent?.id };
- },
- watchLoading: (isLoading) => {
- this.isQueryLoading = isLoading;
- },
- });
- },
onChange(environment) {
this.formEnvironment = environment;
},
- onSubmit() {
- if (this.glFeatures?.environmentSettingsToGraphql) {
- this.updateWithGraphql();
- } else {
- this.updateWithAxios();
- }
- },
- async updateWithGraphql() {
+ async onSubmit() {
this.loading = true;
try {
const { data } = await this.$apollo.mutate({
@@ -89,6 +59,7 @@ export default {
id: this.formEnvironment.id,
externalUrl: this.formEnvironment.externalUrl,
clusterAgentId: this.formEnvironment.clusterAgentId,
+ kubernetesNamespace: this.formEnvironment.kubernetesNamespace,
},
},
});
@@ -111,20 +82,6 @@ export default {
this.loading = false;
}
},
- updateWithAxios() {
- this.loading = true;
- axios
- .put(this.updateEnvironmentPath, {
- id: this.formEnvironment.id,
- external_url: this.formEnvironment.externalUrl,
- })
- .then(({ data: { path } }) => visitUrl(path))
- .catch((error) => {
- const message = error.response.data.message[0];
- createAlert({ message });
- this.loading = false;
- });
- },
},
};
</script>
diff --git a/app/assets/javascripts/environments/components/environment_form.vue b/app/assets/javascripts/environments/components/environment_form.vue
index 266b221b481..1bff013b9c2 100644
--- a/app/assets/javascripts/environments/components/environment_form.vue
+++ b/app/assets/javascripts/environments/components/environment_form.vue
@@ -7,6 +7,7 @@ import {
GlCollapsibleListbox,
GlLink,
GlSprintf,
+ GlAlert,
} from '@gitlab/ui';
import { helpPagePath } from '~/helpers/help_page_helper';
import { isAbsolute } from '~/lib/utils/url_utility';
@@ -15,7 +16,10 @@ import {
ENVIRONMENT_NEW_HELP_TEXT,
ENVIRONMENT_EDIT_HELP_TEXT,
} from 'ee_else_ce/environments/constants';
+import csrf from '~/lib/utils/csrf';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
+import getNamespacesQuery from '../graphql/queries/k8s_namespaces.query.graphql';
import getUserAuthorizedAgents from '../graphql/queries/user_authorized_agents.query.graphql';
export default {
@@ -27,11 +31,13 @@ export default {
GlCollapsibleListbox,
GlLink,
GlSprintf,
+ GlAlert,
},
mixins: [glFeatureFlagsMixin()],
inject: {
protectedEnvironmentSettingsPath: { default: '' },
projectPath: { default: '' },
+ kasTunnelUrl: { default: '' },
},
props: {
environment: {
@@ -64,11 +70,13 @@ export default {
urlFeedback: __('The URL should start with http:// or https://'),
agentLabel: s__('Environments|GitLab agent'),
agentHelpText: s__('Environments|Select agent'),
+ namespaceLabel: s__('Environments|Kubernetes namespace (optional)'),
+ namespaceHelpText: s__('Environments|Select namespace'),
save: __('Save'),
cancel: __('Cancel'),
reset: __('Reset'),
},
- helpPagePath: helpPagePath('ci/environments/index.md'),
+ environmentsHelpPagePath: helpPagePath('ci/environments/index.md'),
renamingDisabledHelpPagePath: helpPagePath('ci/environments/index.md', {
anchor: 'rename-an-environment',
}),
@@ -81,10 +89,41 @@ export default {
userAccessAuthorizedAgents: [],
loadingAgentsList: false,
selectedAgentId: this.environment.clusterAgentId,
- searchTerm: '',
+ agentSearchTerm: '',
+ selectedNamespace: this.environment.kubernetesNamespace,
+ k8sNamespaces: [],
+ namespaceSearchTerm: '',
+ kubernetesError: '',
};
},
+ apollo: {
+ k8sNamespaces: {
+ query: getNamespacesQuery,
+ skip() {
+ return !this.showNamespaceSelector;
+ },
+ variables() {
+ return {
+ configuration: this.k8sAccessConfiguration,
+ };
+ },
+ update(data) {
+ return data?.k8sNamespaces || [];
+ },
+ error(error) {
+ this.kubernetesError = error.message;
+ },
+ result(result) {
+ if (!result?.error && !result.errors?.length) {
+ this.kubernetesError = null;
+ }
+ },
+ },
+ },
computed: {
+ loadingNamespacesList() {
+ return this.$apollo.queries.k8sNamespaces.loading;
+ },
isNameDisabled() {
return Boolean(this.environment.id);
},
@@ -105,7 +144,7 @@ export default {
};
});
},
- dropdownToggleText() {
+ agentDropdownToggleText() {
if (!this.selectedAgentId) {
return this.$options.i18n.agentHelpText;
}
@@ -115,13 +154,48 @@ export default {
return selectedAgentById?.text || this.environment.clusterAgent?.name;
},
filteredAgentsList() {
- const lowerCasedSearchTerm = this.searchTerm.toLowerCase();
+ const lowerCasedSearchTerm = this.agentSearchTerm.toLowerCase();
return this.agentsList.filter((item) =>
item.text.toLowerCase().includes(lowerCasedSearchTerm),
);
},
- showAgentsSelect() {
- return this.glFeatures?.environmentSettingsToGraphql;
+ namespacesList() {
+ return this.k8sNamespaces.map((item) => {
+ return {
+ value: item.metadata.name,
+ text: item.metadata.name,
+ };
+ });
+ },
+ filteredNamespacesList() {
+ const lowerCasedSearchTerm = this.namespaceSearchTerm.toLowerCase();
+ return this.namespacesList.filter((item) =>
+ item.text.toLowerCase().includes(lowerCasedSearchTerm),
+ );
+ },
+ isKasKubernetesNamespaceAvailable() {
+ return this.glFeatures?.kubernetesNamespaceForEnvironment;
+ },
+ showNamespaceSelector() {
+ return Boolean(this.isKasKubernetesNamespaceAvailable && this.selectedAgentId);
+ },
+ namespaceDropdownToggleText() {
+ return this.selectedNamespace || this.$options.i18n.namespaceHelpText;
+ },
+ k8sAccessConfiguration() {
+ if (!this.showNamespaceSelector) {
+ return null;
+ }
+ return {
+ basePath: this.kasTunnelUrl,
+ baseOptions: {
+ headers: {
+ 'GitLab-Agent-Id': getIdFromGraphQLId(this.selectedAgentId),
+ ...csrf.headers,
+ },
+ withCredentials: true,
+ },
+ };
},
},
watch: {
@@ -151,7 +225,14 @@ export default {
});
},
onAgentSearch(search) {
- this.searchTerm = search;
+ this.agentSearchTerm = search;
+ },
+ onAgentChange($event) {
+ this.selectedNamespace = null;
+ this.onChange({ ...this.environment, clusterAgentId: $event, kubernetesNamespace: null });
+ },
+ onNamespaceSearch(search) {
+ this.namespaceSearchTerm = search;
},
},
};
@@ -171,7 +252,9 @@ export default {
>
<template #link="{ content }">
<gl-link
- :href="showEditHelp ? protectedEnvironmentSettingsPath : $options.helpPagePath"
+ :href="
+ showEditHelp ? protectedEnvironmentSettingsPath : $options.environmentsHelpPagePath
+ "
>{{ content }}</gl-link
>
</template>
@@ -223,29 +306,53 @@ export default {
/>
</gl-form-group>
- <gl-form-group
- v-if="showAgentsSelect"
- :label="$options.i18n.agentLabel"
- label-for="environment_agent"
- >
+ <gl-form-group :label="$options.i18n.agentLabel" label-for="environment_agent">
<gl-collapsible-listbox
id="environment_agent"
v-model="selectedAgentId"
class="gl-w-full"
+ data-testid="agent-selector"
block
:items="filteredAgentsList"
:loading="loadingAgentsList"
- :toggle-text="dropdownToggleText"
+ :toggle-text="agentDropdownToggleText"
:header-text="$options.i18n.agentHelpText"
:reset-button-label="$options.i18n.reset"
:searchable="true"
@shown="getAgentsList"
@search="onAgentSearch"
- @select="onChange({ ...environment, clusterAgentId: $event })"
+ @select="onAgentChange"
@reset="onChange({ ...environment, clusterAgentId: null })"
/>
</gl-form-group>
+ <gl-form-group
+ v-if="showNamespaceSelector"
+ :label="$options.i18n.namespaceLabel"
+ label-for="environment_namespace"
+ >
+ <gl-alert v-if="kubernetesError" variant="warning" :dismissible="false" class="gl-mb-5">
+ {{ kubernetesError }}
+ </gl-alert>
+ <gl-collapsible-listbox
+ v-else
+ id="environment_namespace"
+ v-model="selectedNamespace"
+ class="gl-w-full"
+ data-testid="namespace-selector"
+ block
+ :items="filteredNamespacesList"
+ :loading="loadingNamespacesList"
+ :toggle-text="namespaceDropdownToggleText"
+ :header-text="$options.i18n.namespaceHelpText"
+ :reset-button-label="$options.i18n.reset"
+ :searchable="true"
+ @search="onNamespaceSearch"
+ @select="onChange({ ...environment, kubernetesNamespace: $event })"
+ @reset="onChange({ ...environment, kubernetesNamespace: null })"
+ />
+ </gl-form-group>
+
<div class="gl-mr-6">
<gl-button
:loading="loading"
diff --git a/app/assets/javascripts/environments/components/new_environment.vue b/app/assets/javascripts/environments/components/new_environment.vue
index 3e5f4070066..c6bc94b0b80 100644
--- a/app/assets/javascripts/environments/components/new_environment.vue
+++ b/app/assets/javascripts/environments/components/new_environment.vue
@@ -1,8 +1,6 @@
<script>
import { createAlert } from '~/alert';
-import axios from '~/lib/utils/axios_utils';
import { visitUrl } from '~/lib/utils/url_utility';
-import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import createEnvironment from '../graphql/mutations/create_environment.mutation.graphql';
import EnvironmentForm from './environment_form.vue';
@@ -10,13 +8,13 @@ export default {
components: {
EnvironmentForm,
},
- mixins: [glFeatureFlagsMixin()],
inject: ['projectEnvironmentsPath', 'projectPath'],
data() {
return {
environment: {
name: '',
externalUrl: '',
+ clusterAgentId: null,
},
loading: false,
};
@@ -25,14 +23,7 @@ export default {
onChange(env) {
this.environment = env;
},
- onSubmit() {
- if (this.glFeatures?.environmentSettingsToGraphql) {
- this.createWithGraphql();
- } else {
- this.createWithAxios();
- }
- },
- async createWithGraphql() {
+ async onSubmit() {
this.loading = true;
try {
const { data } = await this.$apollo.mutate({
@@ -43,6 +34,7 @@ export default {
externalUrl: this.environment.externalUrl,
projectPath: this.projectPath,
clusterAgentId: this.environment.clusterAgentId,
+ kubernetesNamespace: this.environment.kubernetesNamespace,
},
},
});
@@ -65,20 +57,6 @@ export default {
this.loading = false;
}
},
- createWithAxios() {
- this.loading = true;
- axios
- .post(this.projectEnvironmentsPath, {
- name: this.environment.name,
- external_url: this.environment.externalUrl,
- })
- .then(({ data: { path } }) => visitUrl(path))
- .catch((error) => {
- const message = error.response.data.message[0];
- createAlert({ message });
- this.loading = false;
- });
- },
},
};
</script>
diff --git a/app/assets/javascripts/environments/components/new_environment_item.vue b/app/assets/javascripts/environments/components/new_environment_item.vue
index 1f3d429cc3e..fda1c85f739 100644
--- a/app/assets/javascripts/environments/components/new_environment_item.vue
+++ b/app/assets/javascripts/environments/components/new_environment_item.vue
@@ -14,6 +14,7 @@ import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import isLastDeployment from '../graphql/queries/is_last_deployment.query.graphql';
import getEnvironmentClusterAgent from '../graphql/queries/environment_cluster_agent.query.graphql';
+import getEnvironmentClusterAgentWithNamespace from '../graphql/queries/environment_cluster_agent_with_namespace.query.graphql';
import ExternalUrl from './environment_external_url.vue';
import Actions from './environment_actions.vue';
import StopComponent from './environment_stop.vue';
@@ -82,7 +83,7 @@ export default {
tierTooltip: s__('Environment|Deployment tier'),
},
data() {
- return { visible: false, clusterAgent: null };
+ return { visible: false, clusterAgent: null, kubernetesNamespace: '' };
},
computed: {
icon() {
@@ -164,11 +165,8 @@ export default {
rolloutStatus() {
return this.environment?.rolloutStatus;
},
- isKubernetesOverviewAvailable() {
- return this.glFeatures?.kasUserAccessProject;
- },
- showKubernetesOverview() {
- return Boolean(this.isKubernetesOverviewAvailable && this.clusterAgent);
+ isKubernetesNamespaceAvailable() {
+ return this.glFeatures?.kubernetesNamespaceForEnvironment;
},
},
methods: {
@@ -180,15 +178,20 @@ export default {
}
},
getClusterAgent() {
- if (!this.isKubernetesOverviewAvailable || this.clusterAgent) return;
+ if (this.clusterAgent) return;
this.$apollo.addSmartQuery('environmentClusterAgent', {
variables() {
return { environmentName: this.environment.name, projectFullPath: this.projectPath };
},
- query: getEnvironmentClusterAgent,
+ query() {
+ return this.isKubernetesNamespaceAvailable
+ ? getEnvironmentClusterAgentWithNamespace
+ : getEnvironmentClusterAgent;
+ },
update(data) {
this.clusterAgent = data?.project?.environment?.clusterAgent;
+ this.kubernetesNamespace = data?.project?.environment?.kubernetesNamespace || '';
},
});
},
@@ -368,11 +371,8 @@ export default {
</template>
</gl-sprintf>
</div>
- <div v-if="showKubernetesOverview" :class="$options.kubernetesOverviewClasses">
- <kubernetes-overview
- :cluster-agent="clusterAgent"
- :namespace="environment.kubernetesNamespace"
- />
+ <div v-if="clusterAgent" :class="$options.kubernetesOverviewClasses">
+ <kubernetes-overview :cluster-agent="clusterAgent" :namespace="kubernetesNamespace" />
</div>
<div v-if="rolloutStatus" :class="$options.deployBoardClasses">
<deploy-board-wrapper
diff --git a/app/assets/javascripts/environments/components/stop_environment_modal.vue b/app/assets/javascripts/environments/components/stop_environment_modal.vue
index 95ece2b653e..b583694e154 100644
--- a/app/assets/javascripts/environments/components/stop_environment_modal.vue
+++ b/app/assets/javascripts/environments/components/stop_environment_modal.vue
@@ -1,10 +1,14 @@
<script>
import { GlSprintf, GlTooltipDirective, GlModal } from '@gitlab/ui';
import { __, s__ } from '~/locale';
+import { DOCS_URL_IN_EE_DIR } from 'jh_else_ce/lib/utils/url_utility';
import eventHub from '../event_hub';
import stopEnvironmentMutation from '../graphql/mutations/stop_environment.mutation.graphql';
export default {
+ yamlDocsLink: `${DOCS_URL_IN_EE_DIR}/ee/ci/yaml/`,
+ stoppingEnvironmentDocsLink: `${DOCS_URL_IN_EE_DIR}/environments/#stopping-an-environment`,
+
id: 'stop-environment-modal',
name: 'StopEnvironmentModal',
@@ -98,18 +102,15 @@ export default {
<strong>{{ content }}</strong>
</template>
<template #ciConfigLink="{ content }">
- <a href="https://docs.gitlab.com/ee/ci/yaml/" target="_blank" rel="noopener noreferrer">
+ <a :href="$options.yamlDocsLink" target="_blank" rel="noopener noreferrer">
{{ content }}</a
>
</template>
</gl-sprintf>
</p>
- <a
- href="https://docs.gitlab.com/ee/ci/environments/#stopping-an-environment"
- target="_blank"
- rel="noopener noreferrer"
- >{{ s__('Environments|Learn more about stopping environments') }}</a
- >
+ <a :href="$options.stoppingEnvironmentDocsLink" target="_blank" rel="noopener noreferrer">{{
+ s__('Environments|Learn more about stopping environments')
+ }}</a>
</div>
</gl-modal>
</template>
diff --git a/app/assets/javascripts/environments/constants.js b/app/assets/javascripts/environments/constants.js
index 2b178964c37..dc9481a5429 100644
--- a/app/assets/javascripts/environments/constants.js
+++ b/app/assets/javascripts/environments/constants.js
@@ -108,3 +108,19 @@ export const PHASE_RUNNING = 'Running';
export const PHASE_PENDING = 'Pending';
export const PHASE_SUCCEEDED = 'Succeeded';
export const PHASE_FAILED = 'Failed';
+
+const ERROR_UNAUTHORIZED = 'unauthorized';
+const ERROR_FORBIDDEN = 'forbidden';
+const ERROR_NOT_FOUND = 'not found';
+const ERROR_OTHER = 'other';
+
+export const CLUSTER_AGENT_ERROR_MESSAGES = {
+ [ERROR_UNAUTHORIZED]: s__(
+ 'Environment|Unauthorized to access the cluster agent from this environment. Check your authentication and try again.',
+ ),
+ [ERROR_FORBIDDEN]: s__(
+ 'Environment|Forbidden to access the cluster agent from this environment.',
+ ),
+ [ERROR_NOT_FOUND]: s__('Environment|Cluster agent not found.'),
+ [ERROR_OTHER]: s__('Environment|There was an error connecting to the cluster agent.'),
+};
diff --git a/app/assets/javascripts/environments/edit.js b/app/assets/javascripts/environments/edit.js
index b26d96e15bd..3f22b83e618 100644
--- a/app/assets/javascripts/environments/edit.js
+++ b/app/assets/javascripts/environments/edit.js
@@ -1,5 +1,6 @@
import Vue from 'vue';
import VueApollo from 'vue-apollo';
+import { removeLastSlashInUrlPath } from '~/lib/utils/url_utility';
import EditEnvironment from './components/edit_environment.vue';
import { apolloProvider } from './graphql/client';
@@ -12,10 +13,10 @@ export default (el) => {
const {
projectEnvironmentsPath,
- updateEnvironmentPath,
protectedEnvironmentSettingsPath,
projectPath,
- environment,
+ environmentName,
+ kasTunnelUrl,
} = el.dataset;
return new Vue({
@@ -23,16 +24,13 @@ export default (el) => {
apolloProvider: apolloProvider(),
provide: {
projectEnvironmentsPath,
- updateEnvironmentPath,
protectedEnvironmentSettingsPath,
projectPath,
+ environmentName,
+ kasTunnelUrl: removeLastSlashInUrlPath(kasTunnelUrl),
},
render(h) {
- return h(EditEnvironment, {
- props: {
- environment: JSON.parse(environment),
- },
- });
+ return h(EditEnvironment);
},
});
};
diff --git a/app/assets/javascripts/environments/graphql/client.js b/app/assets/javascripts/environments/graphql/client.js
index 6d06cff06b9..553b06e632f 100644
--- a/app/assets/javascripts/environments/graphql/client.js
+++ b/app/assets/javascripts/environments/graphql/client.js
@@ -8,6 +8,7 @@ import environmentToStopQuery from './queries/environment_to_stop.query.graphql'
import k8sPodsQuery from './queries/k8s_pods.query.graphql';
import k8sServicesQuery from './queries/k8s_services.query.graphql';
import k8sWorkloadsQuery from './queries/k8s_workloads.query.graphql';
+import k8sNamespacesQuery from './queries/k8s_namespaces.query.graphql';
import { resolvers } from './resolvers';
import typeDefs from './typedefs.graphql';
@@ -161,6 +162,14 @@ export const apolloProvider = (endpoint) => {
},
},
});
+ cache.writeQuery({
+ query: k8sNamespacesQuery,
+ data: {
+ metadata: {
+ name: null,
+ },
+ },
+ });
return new VueApollo({
defaultClient,
});
diff --git a/app/assets/javascripts/environments/graphql/queries/environment_cluster_agent_with_namespace.query.graphql b/app/assets/javascripts/environments/graphql/queries/environment_cluster_agent_with_namespace.query.graphql
new file mode 100644
index 00000000000..5e72c2dac20
--- /dev/null
+++ b/app/assets/javascripts/environments/graphql/queries/environment_cluster_agent_with_namespace.query.graphql
@@ -0,0 +1,20 @@
+query getEnvironmentClusterAgentWithNamespace($projectFullPath: ID!, $environmentName: String) {
+ project(fullPath: $projectFullPath) {
+ id
+ environment(name: $environmentName) {
+ id
+ kubernetesNamespace
+ clusterAgent {
+ id
+ name
+ webPath
+ tokens {
+ nodes {
+ id
+ lastUsedAt
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/environments/graphql/queries/environment_with_namespace.graphql b/app/assets/javascripts/environments/graphql/queries/environment_with_namespace.graphql
new file mode 100644
index 00000000000..42796f982b6
--- /dev/null
+++ b/app/assets/javascripts/environments/graphql/queries/environment_with_namespace.graphql
@@ -0,0 +1,15 @@
+query getEnvironmentWithNamespace($projectFullPath: ID!, $environmentName: String) {
+ project(fullPath: $projectFullPath) {
+ id
+ environment(name: $environmentName) {
+ id
+ name
+ externalUrl
+ kubernetesNamespace
+ clusterAgent {
+ id
+ name
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/environments/graphql/queries/k8s_namespaces.query.graphql b/app/assets/javascripts/environments/graphql/queries/k8s_namespaces.query.graphql
new file mode 100644
index 00000000000..c05d09b6ca2
--- /dev/null
+++ b/app/assets/javascripts/environments/graphql/queries/k8s_namespaces.query.graphql
@@ -0,0 +1,7 @@
+query getK8sNamespaces($configuration: LocalConfiguration) {
+ k8sNamespaces(configuration: $configuration) @client {
+ metadata {
+ name
+ }
+ }
+}
diff --git a/app/assets/javascripts/environments/graphql/resolvers.js b/app/assets/javascripts/environments/graphql/resolvers.js
index 044e7927606..8cfe44c5a05 100644
--- a/app/assets/javascripts/environments/graphql/resolvers.js
+++ b/app/assets/javascripts/environments/graphql/resolvers.js
@@ -6,6 +6,7 @@ import {
parseIntPagination,
normalizeHeaders,
} from '~/lib/utils/common_utils';
+import { humanizeClusterErrors } from '../helpers/k8s_integration_helper';
import pollIntervalQuery from './queries/poll_interval.query.graphql';
import environmentToRollbackQuery from './queries/environment_to_rollback.query.graphql';
@@ -72,6 +73,11 @@ const mapWorkloadItems = (items, kind) => {
});
};
+const handleClusterError = (err) => {
+ const error = err?.response?.data?.message ? new Error(err.response.data.message) : err;
+ throw error;
+};
+
export const resolvers = (endpoint) => ({
Query: {
environmentApp(_context, { page, scope, search }, { cache }) {
@@ -124,8 +130,7 @@ export const resolvers = (endpoint) => ({
return podsApi
.then((res) => res?.data?.items || [])
.catch((err) => {
- const error = err?.response?.data?.message ? new Error(err.response.data.message) : err;
- throw error;
+ handleClusterError(err);
});
},
k8sServices(_, { configuration }) {
@@ -148,8 +153,7 @@ export const resolvers = (endpoint) => ({
});
})
.catch((err) => {
- const error = err?.response?.data?.message ? new Error(err.response.data.message) : err;
- throw error;
+ handleClusterError(err);
});
},
k8sWorkloads(_, { configuration, namespace }) {
@@ -206,6 +210,19 @@ export const resolvers = (endpoint) => ({
return summaryList;
});
},
+ k8sNamespaces(_, { configuration }) {
+ const coreV1Api = new CoreV1Api(new Configuration(configuration));
+ const namespacesApi = coreV1Api.listCoreV1Namespace();
+
+ return namespacesApi
+ .then((res) => {
+ return res?.data?.items || [];
+ })
+ .catch((err) => {
+ const error = err?.response?.data?.reason || err;
+ throw new Error(humanizeClusterErrors(error));
+ });
+ },
},
Mutation: {
stopEnvironmentREST(_, { environment }, { client }) {
diff --git a/app/assets/javascripts/environments/graphql/typedefs.graphql b/app/assets/javascripts/environments/graphql/typedefs.graphql
index 7e46385946f..e2c22dda554 100644
--- a/app/assets/javascripts/environments/graphql/typedefs.graphql
+++ b/app/assets/javascripts/environments/graphql/typedefs.graphql
@@ -160,6 +160,12 @@ type LocalK8sWorkloads {
JobList: [localK8sJob]
CronJobList: [localK8sCronJob]
}
+type k8sNamespaceMetadata {
+ name: String
+}
+type LocalK8sNamespaces {
+ metadata: k8sNamespaceMetadata
+}
extend type Query {
environmentApp(page: Int, scope: String): LocalEnvironmentApp
diff --git a/app/assets/javascripts/environments/helpers/k8s_integration_helper.js b/app/assets/javascripts/environments/helpers/k8s_integration_helper.js
index 45c65c93a91..e49f1451759 100644
--- a/app/assets/javascripts/environments/helpers/k8s_integration_helper.js
+++ b/app/assets/javascripts/environments/helpers/k8s_integration_helper.js
@@ -1,4 +1,5 @@
import { differenceInSeconds } from '~/lib/utils/datetime_utility';
+import { CLUSTER_AGENT_ERROR_MESSAGES } from '../constants';
export function generateServicePortsString(ports) {
if (!ports?.length) return '';
@@ -139,3 +140,9 @@ export function getCronJobsStatuses(items) {
...(ready.length && { ready }),
};
}
+
+export function humanizeClusterErrors(reason) {
+ const errorReason = reason.toLowerCase();
+ const errorMessage = CLUSTER_AGENT_ERROR_MESSAGES[errorReason];
+ return errorMessage || CLUSTER_AGENT_ERROR_MESSAGES.other;
+}
diff --git a/app/assets/javascripts/environments/new.js b/app/assets/javascripts/environments/new.js
index 5dd112ac5e6..652085b1f28 100644
--- a/app/assets/javascripts/environments/new.js
+++ b/app/assets/javascripts/environments/new.js
@@ -1,5 +1,6 @@
import Vue from 'vue';
import VueApollo from 'vue-apollo';
+import { removeLastSlashInUrlPath } from '~/lib/utils/url_utility';
import NewEnvironment from './components/new_environment.vue';
import { apolloProvider } from './graphql/client';
@@ -10,12 +11,16 @@ export default (el) => {
return null;
}
- const { projectEnvironmentsPath, projectPath } = el.dataset;
+ const { projectEnvironmentsPath, projectPath, kasTunnelUrl } = el.dataset;
return new Vue({
el,
apolloProvider: apolloProvider(),
- provide: { projectEnvironmentsPath, projectPath },
+ provide: {
+ projectEnvironmentsPath,
+ projectPath,
+ kasTunnelUrl: removeLastSlashInUrlPath(kasTunnelUrl),
+ },
render(h) {
return h(NewEnvironment);
},
diff --git a/app/assets/javascripts/error_tracking/components/error_details.vue b/app/assets/javascripts/error_tracking/components/error_details.vue
index 0151dbb0bf7..bd8a7257d0c 100644
--- a/app/assets/javascripts/error_tracking/components/error_details.vue
+++ b/app/assets/javascripts/error_tracking/components/error_details.vue
@@ -6,9 +6,7 @@ import {
GlBadge,
GlAlert,
GlSprintf,
- GlDropdown,
- GlDropdownItem,
- GlDropdownDivider,
+ GlDisclosureDropdown,
} from '@gitlab/ui';
import { mapActions, mapGetters, mapState } from 'vuex';
import { createAlert, VARIANT_WARNING } from '~/alert';
@@ -38,9 +36,7 @@ export default {
GlBadge,
GlAlert,
GlSprintf,
- GlDropdown,
- GlDropdownItem,
- GlDropdownDivider,
+ GlDisclosureDropdown,
TimeAgoTooltip,
ErrorDetailsInfo,
TimelineChart,
@@ -167,6 +163,52 @@ export default {
showEmptyStacktraceAlert() {
return !this.loadingStacktrace && !this.showStacktrace && this.isStacktraceEmptyAlertVisible;
},
+ updateDropdownItems() {
+ return [
+ {
+ text: this.ignoreBtnLabel,
+ action: this.onIgnoreStatusUpdate,
+ extraAttrs: {
+ 'data-qa-selector': 'update_ignore_status_button',
+ },
+ },
+ {
+ text: this.resolveBtnLabel,
+ action: this.onResolveStatusUpdate,
+ extraAttrs: {
+ 'data-qa-selector': 'update_resolve_status_button',
+ },
+ },
+ ];
+ },
+ viewIssueDropdownItem() {
+ return {
+ text: __('View issue'),
+ href: this.error.gitlabIssuePath,
+ extraAttrs: {
+ 'data-qa-selector': 'view_issue_button',
+ },
+ };
+ },
+ createIssueDropdownItem() {
+ return {
+ text: __('Create issue'),
+ action: this.createIssue,
+ extraAttrs: {
+ 'data-qa-selector': 'create_issue_button',
+ },
+ };
+ },
+ dropdownItems() {
+ return [
+ { items: this.updateDropdownItems },
+ {
+ items: [
+ this.error.gitlabIssuePath ? this.viewIssueDropdownItem : this.createIssueDropdownItem,
+ ],
+ },
+ ];
+ },
},
watch: {
error(val) {
@@ -331,37 +373,14 @@ export default {
</gl-button>
</form>
</div>
- <gl-dropdown
- text="Options"
- class="gl-w-full gl-md-display-none"
- right
+ <gl-disclosure-dropdown
+ block
+ :toggle-text="__('Options')"
+ toggle-class="gl-md-display-none"
+ placement="right"
:disabled="issueUpdateInProgress"
- >
- <gl-dropdown-item
- data-qa-selector="update_ignore_status_button"
- @click="onIgnoreStatusUpdate"
- >{{ ignoreBtnLabel }}</gl-dropdown-item
- >
- <gl-dropdown-item
- data-qa-selector="update_resolve_status_button"
- @click="onResolveStatusUpdate"
- >{{ resolveBtnLabel }}</gl-dropdown-item
- >
- <gl-dropdown-divider />
- <gl-dropdown-item
- v-if="error.gitlabIssuePath"
- data-qa-selector="view_issue_button"
- :href="error.gitlabIssuePath"
- >{{ __('View issue') }}</gl-dropdown-item
- >
- <gl-dropdown-item
- v-if="!error.gitlabIssuePath"
- :loading="issueCreationInProgress"
- data-qa-selector="create_issue_button"
- @click="createIssue"
- >{{ __('Create issue') }}</gl-dropdown-item
- >
- </gl-dropdown>
+ :items="dropdownItems"
+ />
</div>
</div>
<div>
diff --git a/app/assets/javascripts/error_tracking/components/timeline_chart.vue b/app/assets/javascripts/error_tracking/components/timeline_chart.vue
index 51e0c900e4b..907a6c8557f 100644
--- a/app/assets/javascripts/error_tracking/components/timeline_chart.vue
+++ b/app/assets/javascripts/error_tracking/components/timeline_chart.vue
@@ -1,6 +1,6 @@
<script>
import { GlChart } from '@gitlab/ui/dist/charts';
-import { dataVizBlue500 } from '@gitlab/ui/scss_to_js/scss_variables';
+import { DATA_VIZ_BLUE_500 } from '@gitlab/ui/dist/tokens/js/tokens';
import { hexToRgba } from '@gitlab/ui/dist/utils/utils';
import { isNumber } from 'lodash';
import { formatDate } from '~/lib/utils/datetime/date_format_utility';
@@ -109,7 +109,7 @@ export default {
{
data: yData,
type: 'bar',
- itemStyle: { color: hexToRgba(dataVizBlue500, 0.5) },
+ itemStyle: { color: hexToRgba(DATA_VIZ_BLUE_500, 0.5) },
},
],
tooltip: {
diff --git a/app/assets/javascripts/feature_flags/components/feature_flags_table.vue b/app/assets/javascripts/feature_flags/components/feature_flags_table.vue
index 37a0c679287..257c482cf1d 100644
--- a/app/assets/javascripts/feature_flags/components/feature_flags_table.vue
+++ b/app/assets/javascripts/feature_flags/components/feature_flags_table.vue
@@ -125,13 +125,13 @@ export default {
>
<div class="table-section section-10" role="gridcell">
<div class="table-mobile-header" role="rowheader">{{ s__('FeatureFlags|ID') }}</div>
- <div class="table-mobile-content js-feature-flag-id">
+ <div class="table-mobile-content gl-text-left js-feature-flag-id">
{{ featureFlagIidText(featureFlag) }}
</div>
</div>
<div class="table-section section-10" role="gridcell">
<div class="table-mobile-header" role="rowheader">{{ s__('FeatureFlags|Status') }}</div>
- <div class="table-mobile-content">
+ <div class="table-mobile-content gl-text-left">
<gl-toggle
v-if="featureFlag.update_path"
:value="featureFlag.active"
@@ -156,9 +156,11 @@ export default {
<div class="table-mobile-header" role="rowheader">
{{ s__('FeatureFlags|Feature flag') }}
</div>
- <div class="table-mobile-content d-flex flex-column js-feature-flag-title">
+ <div
+ class="table-mobile-content gl-text-left gl-display-flex flex-column js-feature-flag-title gl-mr-5"
+ >
<div class="gl-display-flex gl-align-items-center">
- <div class="feature-flag-name text-monospace text-truncate">
+ <div class="feature-flag-name text-monospace text-wrap gl-word-break-word">
{{ featureFlag.name }}
</div>
<div class="feature-flag-description">
@@ -178,7 +180,7 @@ export default {
{{ s__('FeatureFlags|Environment Specs') }}
</div>
<div
- class="table-mobile-content d-flex flex-wrap justify-content-end justify-content-md-start js-feature-flag-environments"
+ class="table-mobile-content gl-text-left d-flex flex-wrap justify-content-end justify-content-md-start js-feature-flag-environments"
>
<strategy-label
v-for="strategy in featureFlag.strategies"
diff --git a/app/assets/javascripts/frequent_items/store/mutations.js b/app/assets/javascripts/frequent_items/store/mutations.js
index 65f54e6ed05..9882bef444a 100644
--- a/app/assets/javascripts/frequent_items/store/mutations.js
+++ b/app/assets/javascripts/frequent_items/store/mutations.js
@@ -53,7 +53,7 @@ export default {
});
},
[types.RECEIVE_SEARCHED_ITEMS_SUCCESS](state, results) {
- const rawItems = results.data ? results.data : results; // Api.groups returns array, Api.projects returns object
+ const rawItems = results.data;
Object.assign(state, {
items: rawItems.map((rawItem) => ({
id: rawItem.id,
diff --git a/app/assets/javascripts/gfm_auto_complete.js b/app/assets/javascripts/gfm_auto_complete.js
index b778e05c7b1..9e7006bb6e7 100644
--- a/app/assets/javascripts/gfm_auto_complete.js
+++ b/app/assets/javascripts/gfm_auto_complete.js
@@ -959,7 +959,7 @@ GfmAutoComplete.Emoji = {
return `<li>${escapedFieldValue}</li>`;
}
- return `<li>${escapedFieldValue} ${GfmAutoComplete.glEmojiTag(item.emoji.name)}</li>`;
+ return `<li>${GfmAutoComplete.glEmojiTag(item.emoji.name)} ${escapedFieldValue}</li>`;
},
filter(query) {
if (query.length === 0) {
diff --git a/app/assets/javascripts/gitlab_version_check/constants.js b/app/assets/javascripts/gitlab_version_check/constants.js
index 049397148ab..5cef29d73f3 100644
--- a/app/assets/javascripts/gitlab_version_check/constants.js
+++ b/app/assets/javascripts/gitlab_version_check/constants.js
@@ -1,4 +1,5 @@
import { helpPagePath } from '~/helpers/help_page_helper';
+import { PROMO_URL } from 'jh_else_ce/lib/utils/url_utility';
export const STATUS_TYPES = {
SUCCESS: 'success',
@@ -8,7 +9,7 @@ export const STATUS_TYPES = {
export const UPGRADE_DOCS_URL = helpPagePath('update/index');
-export const ABOUT_RELEASES_PAGE = 'https://about.gitlab.com/releases/categories/releases/';
+export const ABOUT_RELEASES_PAGE = `${PROMO_URL}/releases/categories/releases/`;
export const ALERT_MODAL_ID = 'security-patch-upgrade-alert-modal';
diff --git a/app/assets/javascripts/google_cloud/service_accounts/list.vue b/app/assets/javascripts/google_cloud/service_accounts/list.vue
index c9d9a9a3e8c..4ac788aafbe 100644
--- a/app/assets/javascripts/google_cloud/service_accounts/list.vue
+++ b/app/assets/javascripts/google_cloud/service_accounts/list.vue
@@ -1,6 +1,6 @@
<script>
import { GlAlert, GlButton, GlEmptyState, GlLink, GlSprintf, GlTable } from '@gitlab/ui';
-import { setUrlParams } from '~/lib/utils/url_utility';
+import { setUrlParams, DOCS_URL_IN_EE_DIR } from 'jh_else_ce/lib/utils/url_utility';
import { __ } from '~/locale';
const GOOGLE_CONSOLE_URL = 'https://console.cloud.google.com/iam-admin/serviceaccounts';
@@ -49,6 +49,7 @@ export default {
},
},
GOOGLE_CONSOLE_URL,
+ secretsDocsLink: `${DOCS_URL_IN_EE_DIR}/ci/secrets/`,
};
</script>
@@ -86,7 +87,7 @@ export default {
<gl-alert class="gl-mt-5" :dismissible="false" variant="tip">
<gl-sprintf :message="$options.i18n.secretManagersDescription">
<template #docLink="{ content }">
- <gl-link href="https://docs.gitlab.com/ee/ci/secrets/">
+ <gl-link :href="$options.secretsDocsLink">
{{ content }}
</gl-link>
</template>
diff --git a/app/assets/javascripts/google_tag_manager/index.js b/app/assets/javascripts/google_tag_manager/index.js
index 0a1a7a74d21..a9ae9a5af82 100644
--- a/app/assets/javascripts/google_tag_manager/index.js
+++ b/app/assets/javascripts/google_tag_manager/index.js
@@ -129,6 +129,9 @@ export const trackSaasTrialGroup = () => {
}
const form = document.querySelector('.js-saas-trial-group');
+
+ if (!form) return;
+
form.addEventListener('submit', () => {
pushEvent('saasTrialGroup');
});
diff --git a/app/assets/javascripts/graphql_shared/issuable_client.js b/app/assets/javascripts/graphql_shared/issuable_client.js
index ae7676a3e9e..08733bbe620 100644
--- a/app/assets/javascripts/graphql_shared/issuable_client.js
+++ b/app/assets/javascripts/graphql_shared/issuable_client.js
@@ -2,10 +2,11 @@ import produce from 'immer';
import VueApollo from 'vue-apollo';
import { defaultDataIdFromObject } from '@apollo/client/core';
import { concatPagination } from '@apollo/client/utilities';
+import errorQuery from '~/boards/graphql/client/error.query.graphql';
import getIssueStateQuery from '~/issues/show/queries/get_issue_state.query.graphql';
import createDefaultClient from '~/lib/graphql';
import typeDefs from '~/work_items/graphql/typedefs.graphql';
-import { WIDGET_TYPE_NOTES } from '~/work_items/constants';
+import { WIDGET_TYPE_NOTES, WIDGET_TYPE_AWARD_EMOJI } from '~/work_items/constants';
import activeBoardItemQuery from 'ee_else_ce/boards/graphql/client/active_board_item.query.graphql';
export const config = {
@@ -35,6 +36,15 @@ export const config = {
},
},
},
+ WorkItemWidgetAwardEmoji: {
+ fields: {
+ // If we add any key args, the awardEmoji field becomes awardEmoji({"first":10}) and
+ // kills any possibility to handle it on the widget level without hardcoding a string.
+ awardEmoji: {
+ keyArgs: false,
+ },
+ },
+ },
WorkItemWidgetProgress: {
fields: {
progress: {
@@ -67,10 +77,30 @@ export const config = {
const incomingWidget = incoming.find(
(w) => w.type && w.type === existingWidget.type,
);
- // We don't want to override existing notes with empty widget on work item updates
- if (incomingWidget?.type === WIDGET_TYPE_NOTES && !context.variables.pageSize) {
+ // We don't want to override existing notes or award emojis with empty widget on work item updates
+ if (
+ (incomingWidget?.type === WIDGET_TYPE_NOTES ||
+ incomingWidget?.type === WIDGET_TYPE_AWARD_EMOJI) &&
+ !context.variables.pageSize
+ ) {
return existingWidget;
}
+
+ // we want to concat next page of awardEmoji to the existing ones
+ if (incomingWidget?.type === WIDGET_TYPE_AWARD_EMOJI && context.variables.after) {
+ // concatPagination won't work because we were placing new widget here so we have to do this manually
+ return {
+ ...incomingWidget,
+ awardEmoji: {
+ ...incomingWidget.awardEmoji,
+ nodes: [
+ ...existingWidget.awardEmoji.nodes,
+ ...incomingWidget.awardEmoji.nodes,
+ ],
+ },
+ };
+ }
+
// we want to concat next page of discussions to the existing ones
if (incomingWidget?.type === WIDGET_TYPE_NOTES && context.variables.after) {
// concatPagination won't work because we were placing new widget here so we have to do this manually
@@ -195,6 +225,13 @@ export const resolvers = {
});
return boardItem;
},
+ setError(_, { error }, { cache }) {
+ cache.writeQuery({
+ query: errorQuery,
+ data: { boardsAppError: error },
+ });
+ return error;
+ },
clientToggleListCollapsed(_, { list = {}, collapsed = false }) {
return {
list: {
diff --git a/app/assets/javascripts/groups/components/app.vue b/app/assets/javascripts/groups/components/app.vue
index ebfffdaaf50..c6fe16b13b5 100644
--- a/app/assets/javascripts/groups/components/app.vue
+++ b/app/assets/javascripts/groups/components/app.vue
@@ -114,9 +114,9 @@ export default {
showModal() {
this.isModalVisible = true;
},
- fetchGroups({ parentId, page, filterGroupsBy, sortBy, archived, updatePagination }) {
+ fetchGroups({ parentId, page, filterGroupsBy, sortBy, updatePagination }) {
return this.service
- .getGroups(parentId, page, filterGroupsBy, sortBy, archived)
+ .getGroups(parentId, page, filterGroupsBy, sortBy)
.then((res) => {
if (updatePagination) {
this.updatePagination(res.headers);
@@ -133,7 +133,6 @@ export default {
fetchAllGroups() {
const page = getParameterByName('page') || null;
const sortBy = getParameterByName('sort') || null;
- const archived = getParameterByName('archived') || null;
this.isLoading = true;
@@ -141,7 +140,6 @@ export default {
page,
filterGroupsBy: this.filterGroupsBy,
sortBy,
- archived,
updatePagination: true,
}).then((res) => {
this.isLoading = false;
@@ -160,14 +158,13 @@ export default {
this.updateGroups(res, Boolean(filterGroupsBy));
});
},
- fetchPage({ page, filterGroupsBy, sortBy, archived }) {
+ fetchPage({ page, filterGroupsBy, sortBy }) {
this.isLoading = true;
return this.fetchGroups({
page,
filterGroupsBy,
sortBy,
- archived,
updatePagination: true,
}).then((res) => {
this.isLoading = false;
diff --git a/app/assets/javascripts/groups/components/item_stats.vue b/app/assets/javascripts/groups/components/item_stats.vue
index 5674e28f5da..d87190edfd2 100644
--- a/app/assets/javascripts/groups/components/item_stats.vue
+++ b/app/assets/javascripts/groups/components/item_stats.vue
@@ -36,6 +36,9 @@ export default {
<template>
<div class="stats gl-text-gray-500">
+ <div v-if="isProjectPendingRemoval">
+ <gl-badge class="gl-mr-2" variant="warning">{{ __('pending deletion') }}</gl-badge>
+ </div>
<item-stats-value
v-if="displayValue(item.subgroupCount)"
:title="__('Subgroups')"
@@ -65,9 +68,6 @@ export default {
css-class="project-stars"
icon-name="star"
/>
- <div v-if="isProjectPendingRemoval">
- <gl-badge variant="warning">{{ __('pending deletion') }}</gl-badge>
- </div>
<div v-if="isProject" class="last-updated">
<time-ago-tooltip :time="item.lastActivityAt" tooltip-placement="bottom" />
</div>
diff --git a/app/assets/javascripts/groups/components/overview_tabs.vue b/app/assets/javascripts/groups/components/overview_tabs.vue
index 982dab45117..90a0582cc9f 100644
--- a/app/assets/javascripts/groups/components/overview_tabs.vue
+++ b/app/assets/javascripts/groups/components/overview_tabs.vue
@@ -3,13 +3,17 @@ import { GlTabs, GlTab, GlSearchBoxByType, GlSorting, GlSortingItem } from '@git
import { isString, debounce } from 'lodash';
import { __ } from '~/locale';
import { DEBOUNCE_DELAY } from '~/vue_shared/components/filtered_search_bar/constants';
+import { markRaw } from '~/lib/utils/vue3compat/mark_raw';
import GroupsStore from '../store/groups_store';
import GroupsService from '../service/groups_service';
+import ArchivedProjectsService from '../service/archived_projects_service';
import {
ACTIVE_TAB_SUBGROUPS_AND_PROJECTS,
ACTIVE_TAB_SHARED,
ACTIVE_TAB_ARCHIVED,
+ SORTING_ITEM_NAME,
OVERVIEW_TABS_SORTING_ITEMS,
+ OVERVIEW_TABS_ARCHIVED_PROJECTS_SORTING_ITEMS,
} from '../constants';
import eventHub from '../event_hub';
import GroupsApp from './app.vue';
@@ -17,7 +21,6 @@ import SubgroupsAndProjectsEmptyState from './empty_states/subgroups_and_project
import SharedProjectsEmptyState from './empty_states/shared_projects_empty_state.vue';
import ArchivedProjectsEmptyState from './empty_states/archived_projects_empty_state.vue';
-const [SORTING_ITEM_NAME] = OVERVIEW_TABS_SORTING_ITEMS;
const MIN_SEARCH_LENGTH = 3;
export default {
@@ -32,32 +35,38 @@ export default {
SharedProjectsEmptyState,
ArchivedProjectsEmptyState,
},
- inject: ['endpoints', 'initialSort'],
+ inject: ['endpoints', 'initialSort', 'groupId'],
data() {
const tabs = [
{
title: this.$options.i18n[ACTIVE_TAB_SUBGROUPS_AND_PROJECTS],
key: ACTIVE_TAB_SUBGROUPS_AND_PROJECTS,
- emptyStateComponent: SubgroupsAndProjectsEmptyState,
+ emptyStateComponent: markRaw(SubgroupsAndProjectsEmptyState),
lazy: this.$route.name !== ACTIVE_TAB_SUBGROUPS_AND_PROJECTS,
- service: new GroupsService(this.endpoints[ACTIVE_TAB_SUBGROUPS_AND_PROJECTS]),
+ service: new GroupsService(
+ this.endpoints[ACTIVE_TAB_SUBGROUPS_AND_PROJECTS],
+ this.initialSort,
+ ),
store: new GroupsStore({ showSchemaMarkup: true }),
+ sortingItems: OVERVIEW_TABS_SORTING_ITEMS,
},
{
title: this.$options.i18n[ACTIVE_TAB_SHARED],
key: ACTIVE_TAB_SHARED,
- emptyStateComponent: SharedProjectsEmptyState,
+ emptyStateComponent: markRaw(SharedProjectsEmptyState),
lazy: this.$route.name !== ACTIVE_TAB_SHARED,
- service: new GroupsService(this.endpoints[ACTIVE_TAB_SHARED]),
+ service: new GroupsService(this.endpoints[ACTIVE_TAB_SHARED], this.initialSort),
store: new GroupsStore(),
+ sortingItems: OVERVIEW_TABS_SORTING_ITEMS,
},
{
title: this.$options.i18n[ACTIVE_TAB_ARCHIVED],
key: ACTIVE_TAB_ARCHIVED,
- emptyStateComponent: ArchivedProjectsEmptyState,
+ emptyStateComponent: markRaw(ArchivedProjectsEmptyState),
lazy: this.$route.name !== ACTIVE_TAB_ARCHIVED,
- service: new GroupsService(this.endpoints[ACTIVE_TAB_ARCHIVED]),
+ service: new ArchivedProjectsService(this.groupId, this.initialSort),
store: new GroupsStore(),
+ sortingItems: OVERVIEW_TABS_ARCHIVED_PROJECTS_SORTING_ITEMS,
},
];
return {
@@ -79,15 +88,30 @@ export default {
mounted() {
this.search = this.$route.query?.filter || '';
- const sortQueryStringValue = this.$route.query?.sort || this.initialSort;
- const sort =
- OVERVIEW_TABS_SORTING_ITEMS.find((sortOption) =>
- [sortOption.asc, sortOption.desc].includes(sortQueryStringValue),
- ) || SORTING_ITEM_NAME;
+ const { sort, isAscending } = this.getActiveSort();
+
this.sort = sort;
- this.isAscending = sort.asc === sortQueryStringValue;
+ this.isAscending = isAscending;
},
methods: {
+ getActiveSort() {
+ const sortQueryStringValue = this.$route.query?.sort || this.initialSort;
+ const sort = this.activeTab.sortingItems.find((sortOption) =>
+ [sortOption.asc, sortOption.desc].includes(sortQueryStringValue),
+ );
+
+ if (!sort) {
+ return {
+ sort: SORTING_ITEM_NAME,
+ isAscending: true,
+ };
+ }
+
+ return {
+ sort,
+ isAscending: sort.asc === sortQueryStringValue,
+ };
+ },
handleTabInput(tabIndex) {
if (tabIndex === this.activeTabIndex) {
return;
@@ -105,7 +129,23 @@ export default {
? this.$route.params.group.split('/')
: this.$route.params.group;
- this.$router.push({ name: tab.key, params: { group: groupParam }, query: this.$route.query });
+ const { sort, isAscending } = this.getActiveSort();
+
+ this.sort = sort;
+ this.isAscending = isAscending;
+
+ const sortQuery = isAscending ? sort.asc : sort.desc;
+
+ const query = {
+ ...this.$route.query,
+ ...(this.$route.query?.sort && { sort: sortQuery }),
+ };
+
+ this.$router.push({
+ name: tab.key,
+ params: { group: groupParam },
+ query,
+ });
},
handleSearchOrSortChange() {
// Update query string
@@ -164,7 +204,6 @@ export default {
[ACTIVE_TAB_ARCHIVED]: __('Archived projects'),
searchPlaceholder: __('Search'),
},
- OVERVIEW_TABS_SORTING_ITEMS,
};
</script>
@@ -203,7 +242,7 @@ export default {
@sortDirectionChange="handleSortDirectionChange"
>
<gl-sorting-item
- v-for="sortingItem in $options.OVERVIEW_TABS_SORTING_ITEMS"
+ v-for="sortingItem in activeTab.sortingItems"
:key="sortingItem.label"
:active="sortingItem === sort"
@click="handleSortingItemClick(sortingItem)"
diff --git a/app/assets/javascripts/groups/constants.js b/app/assets/javascripts/groups/constants.js
index a5854632040..574ec8e4e49 100644
--- a/app/assets/javascripts/groups/constants.js
+++ b/app/assets/javascripts/groups/constants.js
@@ -25,25 +25,39 @@ export const ITEM_TYPE = {
GROUP: 'group',
};
+export const SORTING_ITEM_NAME = {
+ label: __('Name'),
+ asc: 'name_asc',
+ desc: 'name_desc',
+};
+
+export const SORTING_ITEM_CREATED = {
+ label: __('Created'),
+ asc: 'created_asc',
+ desc: 'created_desc',
+};
+
+export const SORTING_ITEM_UPDATED = {
+ label: __('Updated'),
+ asc: 'latest_activity_asc',
+ desc: 'latest_activity_desc',
+};
+
+export const SORTING_ITEM_STARS = {
+ label: __('Stars'),
+ asc: 'stars_asc',
+ desc: 'stars_desc',
+};
+
export const OVERVIEW_TABS_SORTING_ITEMS = [
- {
- label: __('Name'),
- asc: 'name_asc',
- desc: 'name_desc',
- },
- {
- label: __('Created'),
- asc: 'created_asc',
- desc: 'created_desc',
- },
- {
- label: __('Updated'),
- asc: 'latest_activity_asc',
- desc: 'latest_activity_desc',
- },
- {
- label: __('Stars'),
- asc: 'stars_asc',
- desc: 'stars_desc',
- },
+ SORTING_ITEM_NAME,
+ SORTING_ITEM_CREATED,
+ SORTING_ITEM_UPDATED,
+ SORTING_ITEM_STARS,
+];
+
+export const OVERVIEW_TABS_ARCHIVED_PROJECTS_SORTING_ITEMS = [
+ SORTING_ITEM_NAME,
+ SORTING_ITEM_CREATED,
+ SORTING_ITEM_UPDATED,
];
diff --git a/app/assets/javascripts/groups/init_overview_tabs.js b/app/assets/javascripts/groups/init_overview_tabs.js
index ced5d76d8b9..b831ae7b9d6 100644
--- a/app/assets/javascripts/groups/init_overview_tabs.js
+++ b/app/assets/javascripts/groups/init_overview_tabs.js
@@ -40,6 +40,7 @@ export const initGroupOverviewTabs = () => {
const router = createRouter();
const {
+ groupId,
newSubgroupPath,
newProjectPath,
newSubgroupIllustration,
@@ -59,6 +60,7 @@ export const initGroupOverviewTabs = () => {
el,
router,
provide: {
+ groupId,
newSubgroupPath,
newProjectPath,
newSubgroupIllustration,
diff --git a/app/assets/javascripts/groups/service/archived_projects_service.js b/app/assets/javascripts/groups/service/archived_projects_service.js
new file mode 100644
index 00000000000..5ffa3f91b06
--- /dev/null
+++ b/app/assets/javascripts/groups/service/archived_projects_service.js
@@ -0,0 +1,56 @@
+import Api from '~/api';
+
+export default class ArchivedProjectsService {
+ constructor(groupId, initialSort) {
+ this.groupId = groupId;
+ this.initialSort = initialSort;
+ }
+
+ async getGroups(parentId, page, query, sortParam) {
+ const supportedOrderBy = {
+ name: 'name',
+ created: 'created_at',
+ latest_activity: 'last_activity_at',
+ };
+
+ const [, orderBy, sort] = (sortParam || this.initialSort)?.match(/(\w+)_(asc|desc)/) || [];
+
+ const { data: projects, headers } = await Api.groupProjects(this.groupId, query, {
+ archived: true,
+ page,
+ order_by: supportedOrderBy[orderBy],
+ sort,
+ });
+
+ return {
+ data: projects.map((project) => {
+ return {
+ id: project.id,
+ name: project.name,
+ full_name: project.name_with_namespace,
+ markdown_description: project.description_html,
+ visibility: project.visibility,
+ avatar_url: project.avatar_url,
+ relative_path: `/${project.path_with_namespace}`,
+ edit_path: null,
+ leave_path: null,
+ can_edit: false,
+ can_leave: false,
+ can_remove: false,
+ type: 'project',
+ permission: null,
+ children: [],
+ parent_id: project.namespace.id,
+ project_count: 0,
+ subgroup_count: 0,
+ number_users_with_delimiter: 0,
+ star_count: project.star_count,
+ updated_at: project.updated_at,
+ marked_for_deletion: project.marked_for_deletion_at !== null,
+ last_activity_at: project.last_activity_at,
+ };
+ }),
+ headers,
+ };
+ }
+}
diff --git a/app/assets/javascripts/groups/service/groups_service.js b/app/assets/javascripts/groups/service/groups_service.js
index 790b581a7c0..28d203bc9c6 100644
--- a/app/assets/javascripts/groups/service/groups_service.js
+++ b/app/assets/javascripts/groups/service/groups_service.js
@@ -1,11 +1,12 @@
import axios from '~/lib/utils/axios_utils';
export default class GroupsService {
- constructor(endpoint) {
+ constructor(endpoint, initialSort) {
this.endpoint = endpoint;
+ this.initialSort = initialSort;
}
- getGroups(parentId, page, filterGroups, sort, archived) {
+ getGroups(parentId, page, filterGroups, sort) {
const params = {};
if (parentId) {
@@ -20,12 +21,8 @@ export default class GroupsService {
params.filter = filterGroups;
}
- if (sort) {
- params.sort = sort;
- }
-
- if (archived) {
- params.archived = archived;
+ if (sort || this.initialSort) {
+ params.sort = sort || this.initialSort;
}
}
diff --git a/app/assets/javascripts/groups/settings/init_access_dropdown.js b/app/assets/javascripts/groups/settings/init_access_dropdown.js
index 24419280fc0..4da38e0e641 100644
--- a/app/assets/javascripts/groups/settings/init_access_dropdown.js
+++ b/app/assets/javascripts/groups/settings/init_access_dropdown.js
@@ -4,7 +4,7 @@ import AccessDropdown from './components/access_dropdown.vue';
export const initAccessDropdown = (el) => {
if (!el) {
- return false;
+ return null;
}
const { label, disabled, preselectedItems } = el.dataset;
diff --git a/app/assets/javascripts/header_search/components/app.vue b/app/assets/javascripts/header_search/components/app.vue
index 8c7612f37ff..3cb0963e561 100644
--- a/app/assets/javascripts/header_search/components/app.vue
+++ b/app/assets/javascripts/header_search/components/app.vue
@@ -225,7 +225,7 @@ export default {
v-model="searchText"
role="searchbox"
class="gl-z-index-1"
- data-qa-selector="global_search_input"
+ data-testid="global_search_input"
autocomplete="off"
:placeholder="$options.i18n.SEARCH_GITLAB"
:aria-activedescendant="currentFocusedId"
diff --git a/app/assets/javascripts/ide/components/ide_status_bar.vue b/app/assets/javascripts/ide/components/ide_status_bar.vue
index 8962bb76926..edc6cc3dcdc 100644
--- a/app/assets/javascripts/ide/components/ide_status_bar.vue
+++ b/app/assets/javascripts/ide/components/ide_status_bar.vue
@@ -105,6 +105,7 @@ export default {
:title="lastCommit.message"
:href="getCommitPath(lastCommit.short_id)"
class="commit-sha"
+ data-testid="commit-sha-content"
data-qa-selector="commit_sha_content"
>{{ lastCommit.short_id }}</a
>
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 fe50cb77eb8..cd07e9fbdd9 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
@@ -664,6 +664,7 @@ export default {
<gl-search-box-by-click
class="gl-ml-auto"
+ data-testid="filter-groups"
:placeholder="s__('BulkImport|Filter by source group')"
@submit="filter = $event"
@clear="filter = ''"
diff --git a/app/assets/javascripts/invite_members/components/group_select.vue b/app/assets/javascripts/invite_members/components/group_select.vue
index 0e9781d77fe..1369deae3f9 100644
--- a/app/assets/javascripts/invite_members/components/group_select.vue
+++ b/app/assets/javascripts/invite_members/components/group_select.vue
@@ -1,29 +1,25 @@
<script>
-import {
- GlAvatarLabeled,
- GlDropdown,
- GlDropdownItem,
- GlDropdownText,
- GlSearchBoxByType,
-} from '@gitlab/ui';
+import { GlAvatarLabeled, GlCollapsibleListbox } from '@gitlab/ui';
import { debounce } from 'lodash';
import { s__ } from '~/locale';
import { getGroups, getDescendentGroups } from '~/rest_api';
+import { normalizeHeaders, parseIntPagination } from '~/lib/utils/common_utils';
import { SEARCH_DELAY, GROUP_FILTERS } from '../constants';
export default {
name: 'GroupSelect',
components: {
GlAvatarLabeled,
- GlDropdown,
- GlDropdownItem,
- GlDropdownText,
- GlSearchBoxByType,
+ GlCollapsibleListbox,
},
model: {
prop: 'selectedGroup',
},
props: {
+ selectedGroup: {
+ type: Object,
+ required: true,
+ },
groupsFilter: {
type: String,
required: false,
@@ -43,40 +39,43 @@ export default {
return {
isFetching: false,
groups: [],
- selectedGroup: {},
searchTerm: '',
+ pagination: {},
+ infiniteScrollLoading: false,
};
},
computed: {
- selectedGroupName() {
+ toggleText() {
return this.selectedGroup.name || this.$options.i18n.dropdownText;
},
isFetchResultEmpty() {
return this.groups.length === 0;
},
- },
- watch: {
- searchTerm() {
- this.retrieveGroups();
+ infiniteScroll() {
+ return Boolean(this.pagination.nextPage);
},
},
mounted() {
this.retrieveGroups();
},
methods: {
- retrieveGroups: debounce(function debouncedRetrieveGroups() {
+ retrieveGroups: debounce(async function debouncedRetrieveGroups() {
this.isFetching = true;
- return this.fetchGroups()
- .then((response) => {
- this.groups = this.processGroups(response);
- this.isFetching = false;
- })
- .catch(() => {
- this.isFetching = false;
- });
+
+ try {
+ const response = await this.fetchGroups();
+ this.pagination = this.processPagination(response);
+ this.groups = this.processGroups(response);
+ } catch {
+ this.onApiError();
+ } finally {
+ this.isFetching = false;
+ }
}, SEARCH_DELAY),
- processGroups(response) {
- const rawGroups = response.map((group) => ({
+ processGroups({ data }) {
+ const rawGroups = data.map((group) => ({
+ // `value` is needed for `GlCollapsibleListbox`
+ value: group.id,
id: group.id,
name: group.full_name,
path: group.path,
@@ -85,31 +84,56 @@ export default {
return this.filterOutInvalidGroups(rawGroups);
},
+ processPagination({ headers }) {
+ return parseIntPagination(normalizeHeaders(headers));
+ },
filterOutInvalidGroups(groups) {
return groups.filter((group) => this.invalidGroups.indexOf(group.id) === -1);
},
- selectGroup(group) {
- this.selectedGroup = group;
-
- this.$emit('input', this.selectedGroup);
+ onSelect(id) {
+ this.$emit('input', this.groups.find((group) => group.value === id) || {});
},
- fetchGroups() {
+ onSearch(searchTerm) {
+ this.searchTerm = searchTerm;
+ this.retrieveGroups();
+ },
+ fetchGroups(options = {}) {
+ const combinedOptions = {
+ ...this.$options.defaultFetchOptions,
+ ...options,
+ };
+
switch (this.groupsFilter) {
case GROUP_FILTERS.DESCENDANT_GROUPS:
- return getDescendentGroups(
- this.parentGroupId,
- this.searchTerm,
- this.$options.defaultFetchOptions,
- );
+ return getDescendentGroups(this.parentGroupId, this.searchTerm, combinedOptions);
default:
- return getGroups(this.searchTerm, this.$options.defaultFetchOptions);
+ return getGroups(this.searchTerm, combinedOptions);
}
},
+ async onBottomReached() {
+ this.infiniteScrollLoading = true;
+
+ try {
+ const response = await this.fetchGroups({ page: this.pagination.page + 1 });
+ this.pagination = this.processPagination(response);
+ this.groups.push(...this.processGroups(response));
+ } catch {
+ this.onApiError();
+ } finally {
+ this.infiniteScrollLoading = false;
+ }
+ },
+ onApiError() {
+ this.$emit('error', this.$options.i18n.errorMessage);
+ },
},
i18n: {
dropdownText: s__('GroupSelect|Select a group'),
searchPlaceholder: s__('GroupSelect|Search groups'),
emptySearchResult: s__('GroupSelect|No matching results'),
+ errorMessage: s__(
+ 'GroupSelect|An error occurred fetching the groups. Please refresh the page to try again.',
+ ),
},
defaultFetchOptions: {
exclude_internal: true,
@@ -120,37 +144,34 @@ export default {
</script>
<template>
<div>
- <gl-dropdown
+ <gl-collapsible-listbox
data-testid="group-select-dropdown"
- :text="selectedGroupName"
+ :selected="selectedGroup.value"
+ :items="groups"
+ :toggle-text="toggleText"
+ searchable
+ :search-placeholder="$options.i18n.searchPlaceholder"
block
- toggle-class="gl-mb-2"
- menu-class="gl-w-full!"
+ fluid-width
+ is-check-centered
+ :searching="isFetching"
+ :no-results-text="$options.i18n.emptySearchResult"
+ :infinite-scroll="infiniteScroll"
+ :infinite-scroll-loading="infiniteScrollLoading"
+ :total-items="pagination.total"
+ @bottom-reached="onBottomReached"
+ @select="onSelect"
+ @search="onSearch"
>
- <gl-search-box-by-type
- v-model="searchTerm"
- :is-loading="isFetching"
- :placeholder="$options.i18n.searchPlaceholder"
- data-qa-selector="group_select_dropdown_search_field"
- />
- <gl-dropdown-item
- v-for="group in groups"
- :key="group.id"
- :name="group.name"
- data-qa-selector="group_select_dropdown_item"
- @click="selectGroup(group)"
- >
+ <template #list-item="{ item }">
<gl-avatar-labeled
- :label="group.name"
- :src="group.avatarUrl"
- :entity-id="group.id"
- :entity-name="group.name"
+ :label="item.name"
+ :src="item.avatarUrl"
+ :entity-id="item.value"
+ :entity-name="item.name"
:size="32"
/>
- </gl-dropdown-item>
- <gl-dropdown-text v-if="isFetchResultEmpty && !isFetching" data-testid="empty-result-message">
- <span class="gl-text-gray-500">{{ $options.i18n.emptySearchResult }}</span>
- </gl-dropdown-text>
- </gl-dropdown>
+ </template>
+ </gl-collapsible-listbox>
</div>
</template>
diff --git a/app/assets/javascripts/invite_members/components/import_project_members_modal.vue b/app/assets/javascripts/invite_members/components/import_project_members_modal.vue
index cc95027f0db..66d4a9ccc07 100644
--- a/app/assets/javascripts/invite_members/components/import_project_members_modal.vue
+++ b/app/assets/javascripts/invite_members/components/import_project_members_modal.vue
@@ -209,7 +209,6 @@ export default {
:invalid-feedback="invalidFeedbackMessage"
:state="validationState"
data-testid="form-group"
- label-cols="auto"
label-class="gl-pt-3!"
:label="$options.i18n.projectLabel"
:label-for="$options.projectSelectLabelId"
diff --git a/app/assets/javascripts/invite_members/components/invite_groups_modal.vue b/app/assets/javascripts/invite_members/components/invite_groups_modal.vue
index 51355baef99..91dbd86418c 100644
--- a/app/assets/javascripts/invite_members/components/invite_groups_modal.vue
+++ b/app/assets/javascripts/invite_members/components/invite_groups_modal.vue
@@ -1,4 +1,6 @@
<script>
+import * as Sentry from '@sentry/browser';
+import { GlAlert } from '@gitlab/ui';
import { uniqueId } from 'lodash';
import Api from '~/api';
import { BV_SHOW_MODAL, BV_HIDE_MODAL } from '~/lib/utils/constants';
@@ -19,6 +21,7 @@ export default {
GroupSelect,
InviteModalBase,
InviteGroupNotification,
+ GlAlert,
},
props: {
id: {
@@ -83,6 +86,7 @@ export default {
isLoading: false,
modalId: uniqueId('invite-groups-modal-'),
groupToBeSharedWith: {},
+ groupSelectError: '',
};
},
computed: {
@@ -165,6 +169,10 @@ export default {
clearValidation() {
this.invalidFeedbackMessage = '';
},
+ onGroupSelectError(error) {
+ this.groupSelectError = error;
+ Sentry.captureException(error);
+ },
},
labels: GROUP_MODAL_LABELS,
};
@@ -197,6 +205,9 @@ export default {
:notification-link="$options.labels[inviteTo].notificationLink"
class="gl-mb-5"
/>
+ <gl-alert v-if="groupSelectError" class="gl-mb-5" variant="danger" :dismissible="false">{{
+ groupSelectError
+ }}</gl-alert>
</template>
<template #select>
@@ -206,6 +217,7 @@ export default {
:parent-group-id="groupSelectParentId"
:invalid-groups="invalidGroups"
@input="clearValidation"
+ @error="onGroupSelectError"
/>
</template>
</invite-modal-base>
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 e0bfa1111e8..8493787f075 100644
--- a/app/assets/javascripts/invite_members/components/members_token_select.vue
+++ b/app/assets/javascripts/invite_members/components/members_token_select.vue
@@ -59,6 +59,7 @@ export default {
return {
loading: false,
query: '',
+ originalInput: '',
users: [],
selectedTokens: [],
hasBeenFocused: false,
@@ -67,9 +68,9 @@ export default {
},
computed: {
emailIsValid() {
- const regex = /.+@/;
+ const regex = /^\S+@\S+$/;
- return this.query.match(regex) !== null;
+ return this.originalInput.match(regex) !== null;
},
placeholderText() {
if (this.selectedTokens.length === 0) {
@@ -116,6 +117,7 @@ export default {
methods: {
handleTextInput(inputQuery) {
this.hideDropdownWithNoItems = false;
+ this.originalInput = inputQuery;
this.query = inputQuery.trim();
this.loading = true;
this.retrieveUsers();
diff --git a/app/assets/javascripts/issuable/components/status_box.vue b/app/assets/javascripts/issuable/components/status_box.vue
index 799c0a18444..0d7d0f020dd 100644
--- a/app/assets/javascripts/issuable/components/status_box.vue
+++ b/app/assets/javascripts/issuable/components/status_box.vue
@@ -4,7 +4,13 @@ import Vue from 'vue';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import { fetchPolicies } from '~/lib/graphql';
import { __ } from '~/locale';
-import { STATUS_CLOSED, STATUS_OPEN, TYPE_ISSUE, TYPE_MERGE_REQUEST } from '~/issues/constants';
+import {
+ STATUS_CLOSED,
+ STATUS_OPEN,
+ TYPE_ISSUE,
+ TYPE_MERGE_REQUEST,
+ TYPE_EPIC,
+} from '~/issues/constants';
export const badgeState = Vue.observable({
state: '',
@@ -18,17 +24,22 @@ const CLASSES = {
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 ICONS = {
+ [TYPE_EPIC]: {
+ opened: 'epic',
+ closed: 'epic-closed',
+ },
+ [TYPE_ISSUE]: {
+ opened: 'issues',
+ locked: 'issues',
+ closed: 'issue-closed',
+ },
+ [TYPE_MERGE_REQUEST]: {
+ opened: 'merge-request-open',
+ locked: 'merge-request-open',
+ closed: 'merge-request-close',
+ merged: 'merge',
+ },
};
const STATUS = {
@@ -91,10 +102,8 @@ export default {
return STATUS[this.state];
},
badgeIcon() {
- if (this.issuableType === TYPE_ISSUE) {
- return ISSUE_ICONS[this.state];
- }
- return MERGE_REQUEST_ICONS[this.state];
+ const type = this.issuableType || TYPE_MERGE_REQUEST;
+ return ICONS[type][this.state];
},
},
created() {
@@ -126,7 +135,7 @@ export default {
<template>
<gl-badge
- class="issuable-status-badge gl-mr-3"
+ class="issuable-status-badge gl-mr-3 gl-align-self-center"
:class="badgeClass"
:variant="badgeVariant"
:aria-label="badgeText"
diff --git a/app/assets/javascripts/issuable/issuable_form.js b/app/assets/javascripts/issuable/issuable_form.js
index a1525ad2bec..1c1acddb90b 100644
--- a/app/assets/javascripts/issuable/issuable_form.js
+++ b/app/assets/javascripts/issuable/issuable_form.js
@@ -7,6 +7,9 @@ import { queryToObject, objectToQuery } from '~/lib/utils/url_utility';
import UsersSelect from '~/users_select';
import ZenMode from '~/zen_mode';
import { containsSensitiveToken, confirmSensitiveAction, i18n } from '~/lib/utils/secret_detection';
+import { trackSavedUsingEditor } from '~/vue_shared/components/markdown/tracking';
+import { EDITING_MODE_CONTENT_EDITOR } from '~/vue_shared/constants';
+import { ISSUE_NOTEABLE_TYPE, MERGE_REQUEST_NOTEABLE_TYPE } from '~/notes/constants';
const MR_SOURCE_BRANCH = 'merge_request[source_branch]';
const MR_TARGET_BRANCH = 'merge_request[target_branch]';
@@ -47,6 +50,13 @@ function getFallbackKey() {
return ['autosave', document.location.pathname, searchTerm].join('/');
}
+function getIssuableType() {
+ if (document.location.pathname.includes('merge_requests')) return MERGE_REQUEST_NOTEABLE_TYPE;
+ if (document.location.pathname.includes('issues')) return ISSUE_NOTEABLE_TYPE;
+ // eslint-disable-next-line @gitlab/require-i18n-strings
+ return 'Other';
+}
+
export default class IssuableForm {
static addAutosave(map, id, element, searchTerm, fallbackKey) {
if (!element) return;
@@ -144,6 +154,11 @@ export default class IssuableForm {
async handleSubmit(event) {
event.preventDefault();
+ trackSavedUsingEditor(
+ localStorage.getItem('gl-markdown-editor-mode') === EDITING_MODE_CONTENT_EDITOR,
+ getIssuableType(),
+ );
+
const form = event.target;
const descriptionText = this.descriptionField().val();
diff --git a/app/assets/javascripts/issuable/issuable_label_selector.js b/app/assets/javascripts/issuable/issuable_label_selector.js
index b4e277a0b31..fc6d850c341 100644
--- a/app/assets/javascripts/issuable/issuable_label_selector.js
+++ b/app/assets/javascripts/issuable/issuable_label_selector.js
@@ -45,6 +45,7 @@ export default () => {
labelsManagePath,
variant: VARIANT_EMBEDDED,
workspaceType: WORKSPACE_PROJECT,
+ toggleAttrs: { 'data-testid': 'issuable_label_dropdown' },
},
render(createElement) {
return createElement(IssuableLabelSelector);
diff --git a/app/assets/javascripts/issuable/popover/components/issue_popover.vue b/app/assets/javascripts/issuable/popover/components/issue_popover.vue
index 55fb3958e82..044a1bba7ad 100644
--- a/app/assets/javascripts/issuable/popover/components/issue_popover.vue
+++ b/app/assets/javascripts/issuable/popover/components/issue_popover.vue
@@ -28,7 +28,7 @@ export default {
type: HTMLAnchorElement,
required: true,
},
- projectPath: {
+ namespacePath: {
type: String,
required: true,
},
@@ -65,10 +65,10 @@ export default {
query,
update: (data) => data.project.issue,
variables() {
- const { projectPath, iid } = this;
+ const { namespacePath, iid } = this;
return {
- projectPath,
+ projectPath: namespacePath,
iid,
};
},
@@ -100,7 +100,7 @@ export default {
<!-- eslint-disable @gitlab/vue-require-i18n-strings -->
<div>
<work-item-type-icon v-if="!$apollo.queries.issue.loading" :work-item-type="issue.type" />
- <span class="gl-text-secondary">{{ `${projectPath}#${iid}` }}</span>
+ <span class="gl-text-secondary">{{ `${namespacePath}#${iid}` }}</span>
</div>
<!-- eslint-enable @gitlab/vue-require-i18n-strings -->
diff --git a/app/assets/javascripts/issuable/popover/components/mr_popover.vue b/app/assets/javascripts/issuable/popover/components/mr_popover.vue
index af93430963e..e2c2181684f 100644
--- a/app/assets/javascripts/issuable/popover/components/mr_popover.vue
+++ b/app/assets/javascripts/issuable/popover/components/mr_popover.vue
@@ -19,7 +19,7 @@ export default {
type: HTMLAnchorElement,
required: true,
},
- projectPath: {
+ namespacePath: {
type: String,
required: true,
},
@@ -76,10 +76,10 @@ export default {
query,
update: (data) => data.project.mergeRequest,
variables() {
- const { projectPath, iid } = this;
+ const { namespacePath, iid } = this;
return {
- projectPath,
+ projectPath: namespacePath,
iid,
};
},
@@ -108,7 +108,7 @@ export default {
<h5 v-if="!$apollo.queries.mergeRequest.loading" class="my-2">{{ title }}</h5>
<!-- eslint-disable @gitlab/vue-require-i18n-strings -->
<div class="gl-text-secondary">
- {{ `${projectPath}!${iid}` }}
+ {{ `${namespacePath}!${iid}` }}
</div>
<!-- eslint-enable @gitlab/vue-require-i18n-strings -->
</div>
diff --git a/app/assets/javascripts/issuable/popover/index.js b/app/assets/javascripts/issuable/popover/index.js
index 9430419685b..58f015fe40e 100644
--- a/app/assets/javascripts/issuable/popover/index.js
+++ b/app/assets/javascripts/issuable/popover/index.js
@@ -4,7 +4,7 @@ import createDefaultClient from '~/lib/graphql';
import IssuePopover from './components/issue_popover.vue';
import MRPopover from './components/mr_popover.vue';
-const componentsByReferenceType = {
+export const componentsByReferenceTypeMap = {
issue: IssuePopover,
work_item: IssuePopover,
merge_request: MRPopover,
@@ -26,9 +26,10 @@ const popoverMountedAttr = 'data-popover-mounted';
* Adds a MergeRequestPopover component to the body, hands over as much data as the target element has in data attributes.
* loads based on data-project-path and data-iid more data about an MR from the API and sets it on the popover
*/
-const handleIssuablePopoverMount = ({
+export const handleIssuablePopoverMount = ({
+ componentsByReferenceType = componentsByReferenceTypeMap,
apolloProvider,
- projectPath,
+ namespacePath,
title,
iid,
referenceType,
@@ -42,7 +43,7 @@ const handleIssuablePopoverMount = ({
new PopoverComponent({
propsData: {
target,
- projectPath,
+ namespacePath,
iid,
cachedTitle: title,
},
@@ -53,7 +54,7 @@ const handleIssuablePopoverMount = ({
}, 200); // 200ms delay so not every mouseover triggers Popover + API Call
};
-export default (elements) => {
+export default (elements, issuablePopoverMount = handleIssuablePopoverMount) => {
if (elements.length > 0) {
Vue.use(VueApollo);
@@ -63,15 +64,16 @@ export default (elements) => {
const listenerAddedAttr = 'data-popover-listener-added';
elements.forEach((el) => {
- const { projectPath, iid, referenceType } = el.dataset;
+ const { projectPath, groupPath, iid, referenceType } = el.dataset;
const title = el.dataset.mrTitle || el.title;
+ const namespacePath = groupPath || projectPath;
- if (!el.getAttribute(listenerAddedAttr) && projectPath && title && iid && referenceType) {
+ if (!el.getAttribute(listenerAddedAttr) && namespacePath && title && iid && referenceType) {
el.addEventListener('mouseenter', ({ target }) => {
if (!el.getAttribute(popoverMountedAttr)) {
- handleIssuablePopoverMount({
+ issuablePopoverMount({
apolloProvider,
- projectPath,
+ namespacePath,
title,
iid,
referenceType,
diff --git a/app/assets/javascripts/issues/constants.js b/app/assets/javascripts/issues/constants.js
index 444ee704521..0a1a1324d7d 100644
--- a/app/assets/javascripts/issues/constants.js
+++ b/app/assets/javascripts/issues/constants.js
@@ -31,4 +31,7 @@ export const issuableStatusText = {
export const IssuableTypeText = {
[TYPE_ISSUE]: __('issue'),
[TYPE_MERGE_REQUEST]: __('merge request'),
+ [TYPE_ALERT]: __('alert'),
+ [TYPE_INCIDENT]: __('incident'),
+ [TYPE_TEST_CASE]: __('test case'),
};
diff --git a/app/assets/javascripts/issues/dashboard/components/issues_dashboard_app.vue b/app/assets/javascripts/issues/dashboard/components/issues_dashboard_app.vue
index 14fe88b8f61..eb73f8e0182 100644
--- a/app/assets/javascripts/issues/dashboard/components/issues_dashboard_app.vue
+++ b/app/assets/javascripts/issues/dashboard/components/issues_dashboard_app.vue
@@ -81,6 +81,7 @@ export default {
},
inject: [
'autocompleteAwardEmojisPath',
+ 'autocompleteUsersPath',
'calendarPath',
'dashboardLabelsPath',
'dashboardMilestonesPath',
@@ -233,6 +234,7 @@ export default {
title: TOKEN_TITLE_ASSIGNEE,
icon: 'user',
token: UserToken,
+ dataType: 'user',
operators: OPERATORS_IS_NOT_OR,
fetchUsers: this.fetchUsers,
preloadedUsers,
@@ -243,6 +245,7 @@ export default {
title: TOKEN_TITLE_AUTHOR,
icon: 'pencil',
token: UserToken,
+ dataType: 'user',
operators: OPERATORS_IS_NOT_OR,
fetchUsers: this.fetchUsers,
defaultUsers: [],
@@ -382,7 +385,9 @@ export default {
});
},
fetchUsers(search) {
- return axios.get('/-/autocomplete/users.json', { params: { active: true, search } });
+ return axios.get(this.autocompleteUsersPath, {
+ params: { active: true, search },
+ });
},
getStatus(issue) {
if (issue.state === STATUS_CLOSED && issue.moved) {
diff --git a/app/assets/javascripts/issues/dashboard/index.js b/app/assets/javascripts/issues/dashboard/index.js
index 999f07781b2..74633b251b2 100644
--- a/app/assets/javascripts/issues/dashboard/index.js
+++ b/app/assets/javascripts/issues/dashboard/index.js
@@ -15,6 +15,7 @@ export async function mountIssuesDashboardApp() {
const {
autocompleteAwardEmojisPath,
+ autocompleteUsersPath,
calendarPath,
dashboardLabelsPath,
dashboardMilestonesPath,
@@ -38,6 +39,7 @@ export async function mountIssuesDashboardApp() {
}),
provide: {
autocompleteAwardEmojisPath,
+ autocompleteUsersPath,
calendarPath,
dashboardLabelsPath,
dashboardMilestonesPath,
diff --git a/app/assets/javascripts/issues/list/components/empty_state_without_any_issues.vue b/app/assets/javascripts/issues/list/components/empty_state_without_any_issues.vue
index 3f29fc66abb..9f7fca0ceca 100644
--- a/app/assets/javascripts/issues/list/components/empty_state_without_any_issues.vue
+++ b/app/assets/javascripts/issues/list/components/empty_state_without_any_issues.vue
@@ -28,6 +28,7 @@ export default {
'newProjectPath',
'showNewIssueLink',
'signInPath',
+ 'groupId',
],
props: {
currentTabCount: {
@@ -95,6 +96,7 @@ export default {
:query="$options.searchProjectsQuery"
:query-variables="newIssueDropdownQueryVariables"
:extract-projects="extractProjects"
+ :group-id="groupId"
/>
</template>
</gl-empty-state>
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 83b0bcebe67..f7693dd7102 100644
--- a/app/assets/javascripts/issues/list/components/issues_list_app.vue
+++ b/app/assets/javascripts/issues/list/components/issues_list_app.vue
@@ -166,6 +166,7 @@ export default {
'releasesPath',
'rssPath',
'showNewIssueLink',
+ 'groupId',
],
props: {
eeSearchTokens: {
@@ -365,6 +366,7 @@ export default {
title: TOKEN_TITLE_AUTHOR,
icon: 'pencil',
token: UserToken,
+ dataType: 'user',
defaultUsers: [],
operators: this.hasOrFeature ? OPERATORS_IS_NOT_OR : OPERATORS_IS_NOT,
fetchUsers: this.fetchUsers,
@@ -376,6 +378,7 @@ export default {
title: TOKEN_TITLE_ASSIGNEE,
icon: 'user',
token: UserToken,
+ dataType: 'user',
operators: this.hasOrFeature ? OPERATORS_IS_NOT_OR : OPERATORS_IS_NOT,
fetchUsers: this.fetchUsers,
recentSuggestionsStorageKey: `${this.fullPath}-issues-recent-tokens-assignee`,
@@ -893,6 +896,7 @@ export default {
:query="$options.searchProjectsQuery"
:query-variables="newIssueDropdownQueryVariables"
:extract-projects="extractProjects"
+ :group-id="groupId"
/>
<gl-disclosure-dropdown
v-gl-tooltip.hover="$options.i18n.actionsLabel"
diff --git a/app/assets/javascripts/issues/list/index.js b/app/assets/javascripts/issues/list/index.js
index a97b59c1e4f..d1b45294026 100644
--- a/app/assets/javascripts/issues/list/index.js
+++ b/app/assets/javascripts/issues/list/index.js
@@ -94,6 +94,7 @@ export async function mountIssuesListApp() {
rssPath,
showNewIssueLink,
signInPath,
+ groupId = '',
} = el.dataset;
return new Vue({
@@ -153,6 +154,7 @@ export async function mountIssuesListApp() {
markdownHelpPath,
quickActionsHelpPath,
resetPath,
+ groupId,
},
render: (createComponent) => createComponent(IssuesListApp),
});
diff --git a/app/assets/javascripts/issues/related_merge_requests/components/related_merge_requests.vue b/app/assets/javascripts/issues/related_merge_requests/components/related_merge_requests.vue
index 8490ffd33cd..cbec10b4ebe 100644
--- a/app/assets/javascripts/issues/related_merge_requests/components/related_merge_requests.vue
+++ b/app/assets/javascripts/issues/related_merge_requests/components/related_merge_requests.vue
@@ -65,61 +65,65 @@ export default {
<template>
<div v-if="isFetchingMergeRequests || (!isFetchingMergeRequests && totalCount)">
- <div class="card card-slim gl-mt-5 gl-mb-0 gl-bg-gray-10">
- <div class="card-header gl-px-5 gl-py-4 gl-bg-white">
- <div
- class="card-title gl-relative gl-display-flex gl-flex-wrap gl-align-items-center gl-line-height-20 gl-font-weight-bold gl-m-0"
- >
+ <div class="gl-new-card">
+ <div class="gl-new-card-header gl-flex-direction-column">
+ <div class="gl-new-card-title-wrapper">
<gl-link
class="anchor gl-absolute gl-text-decoration-none"
href="#related-merge-requests"
aria-labelledby="related-merge-requests"
/>
- <h3 id="related-merge-requests" class="gl-font-base gl-m-0">
+ <h3 id="related-merge-requests" class="gl-new-card-title">
{{ __('Related merge requests') }}
</h3>
- <template v-if="totalCount">
- <gl-icon name="merge-request" class="gl-ml-3 gl-mr-2 gl-text-gray-500" />
- <span data-testid="count" class="gl-text-gray-500">{{ totalCount }}</span>
- </template>
- <p
- v-if="hasClosingMergeRequest && !isFetchingMergeRequests"
- class="gl-font-sm gl-font-weight-normal gl-flex-basis-full gl-mb-0 gl-text-gray-500"
- >
- {{ closingMergeRequestsText }}
- </p>
+ <div class="gl-new-card-count">
+ <template v-if="totalCount">
+ <gl-icon name="merge-request" class="gl-mr-2" />
+ <span data-testid="count">{{ totalCount }}</span>
+ </template>
+ </div>
</div>
- </div>
- <gl-loading-icon
- v-if="isFetchingMergeRequests"
- size="sm"
- label="Fetching related merge requests"
- class="gl-py-4"
- />
- <ul v-else class="content-list related-items-list gl-px-4! gl-py-3!">
- <li
- v-for="mr in mergeRequests"
- :key="mr.id"
- class="list-item gl-m-0! gl-p-0! gl-border-b-0!"
+ <p
+ v-if="hasClosingMergeRequest && !isFetchingMergeRequests"
+ class="gl-new-card-description"
>
- <related-issuable-item
- :id-key="mr.id"
- :display-reference="mr.reference"
- :title="mr.title"
- :milestone="mr.milestone"
- :assignees="getAssignees(mr)"
- :created-at="mr.created_at"
- :closed-at="mr.closed_at"
- :merged-at="mr.merged_at"
- :path="mr.web_url"
- :state="mr.state"
- :is-merge-request="true"
- :pipeline-status="mr.head_pipeline && mr.head_pipeline.detailed_status"
- path-id-separator="!"
- class="gl-mx-n2"
+ {{ closingMergeRequestsText }}
+ </p>
+ </div>
+ <div class="gl-new-card-body">
+ <div class="gl-new-card-content">
+ <gl-loading-icon
+ v-if="isFetchingMergeRequests"
+ size="sm"
+ label="Fetching related merge requests"
+ class="gl-py-2"
/>
- </li>
- </ul>
+ <ul class="content-list related-items-list">
+ <li
+ v-for="mr in mergeRequests"
+ :key="mr.id"
+ class="list-item gl-m-0! gl-p-0! gl-border-b-0!"
+ >
+ <related-issuable-item
+ :id-key="mr.id"
+ :display-reference="mr.reference"
+ :title="mr.title"
+ :milestone="mr.milestone"
+ :assignees="getAssignees(mr)"
+ :created-at="mr.created_at"
+ :closed-at="mr.closed_at"
+ :merged-at="mr.merged_at"
+ :path="mr.web_url"
+ :state="mr.state"
+ :is-merge-request="true"
+ :pipeline-status="mr.head_pipeline && mr.head_pipeline.detailed_status"
+ path-id-separator="!"
+ class="gl-mx-n2"
+ />
+ </li>
+ </ul>
+ </div>
+ </div>
</div>
</div>
</template>
diff --git a/app/assets/javascripts/issues/show/components/fields/description.vue b/app/assets/javascripts/issues/show/components/fields/description.vue
index c8ea8fb7ab2..a1463d0e911 100644
--- a/app/assets/javascripts/issues/show/components/fields/description.vue
+++ b/app/assets/javascripts/issues/show/components/fields/description.vue
@@ -1,14 +1,13 @@
<script>
import { __ } from '~/locale';
-import MarkdownField from '~/vue_shared/components/markdown/field.vue';
-import { helpPagePath } from '~/helpers/help_page_helper';
import MarkdownEditor from '~/vue_shared/components/markdown/markdown_editor.vue';
import glFeaturesFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import { trackSavedUsingEditor } from '~/vue_shared/components/markdown/tracking';
+import { ISSUE_NOTEABLE_TYPE } from '~/notes/constants';
import updateMixin from '../../mixins/update';
export default {
components: {
- MarkdownField,
MarkdownEditor,
},
mixins: [updateMixin, glFeaturesFlagMixin()],
@@ -47,8 +46,8 @@ export default {
};
},
computed: {
- quickActionsDocsPath() {
- return helpPagePath('user/project/quick_actions');
+ autocompleteDataSources() {
+ return gl.GfmAutoComplete?.dataSources;
},
},
mounted() {
@@ -58,6 +57,10 @@ export default {
focus() {
this.$refs.textarea?.focus();
},
+ saveIssuable() {
+ trackSavedUsingEditor(this.$refs.markdownEditor.isContentEditorActive, ISSUE_NOTEABLE_TYPE);
+ this.updateIssuable();
+ },
},
};
</script>
@@ -66,45 +69,21 @@ export default {
<div class="common-note-form">
<label class="sr-only" for="issue-description">{{ __('Description') }}</label>
<markdown-editor
- v-if="glFeatures.contentEditorOnIssues"
+ ref="markdownEditor"
+ :enable-content-editor="Boolean(glFeatures.contentEditorOnIssues)"
class="gl-mt-3"
:value="value"
:render-markdown-path="markdownPreviewPath"
:markdown-docs-path="markdownDocsPath"
:form-field-props="formFieldProps"
- :quick-actions-docs-path="quickActionsDocsPath"
:enable-autocomplete="enableAutocomplete"
+ :autocomplete-data-sources="autocompleteDataSources"
supports-quick-actions
autofocus
+ data-qa-selector="description_field"
@input="$emit('input', $event)"
- @keydown.meta.enter="updateIssuable"
- @keydown.ctrl.enter="updateIssuable"
+ @keydown.meta.enter="saveIssuable"
+ @keydown.ctrl.enter="saveIssuable"
/>
- <markdown-field
- v-else
- class="gl-mt-3"
- :markdown-preview-path="markdownPreviewPath"
- :markdown-docs-path="markdownDocsPath"
- :quick-actions-docs-path="quickActionsDocsPath"
- :can-attach-file="canAttachFile"
- :enable-autocomplete="enableAutocomplete"
- :textarea-value="value"
- >
- <template #textarea>
- <textarea
- v-bind="formFieldProps"
- ref="textarea"
- :value="value"
- class="note-textarea js-gfm-input js-autosize markdown-area"
- data-qa-selector="description_field"
- dir="auto"
- data-supports-quick-actions="true"
- @input="$emit('input', $event.target.value)"
- @keydown.meta.enter="updateIssuable"
- @keydown.ctrl.enter="updateIssuable"
- >
- </textarea>
- </template>
- </markdown-field>
</div>
</template>
diff --git a/app/assets/javascripts/issues/show/components/form.vue b/app/assets/javascripts/issues/show/components/form.vue
index c9e21b296e4..831248d9603 100644
--- a/app/assets/javascripts/issues/show/components/form.vue
+++ b/app/assets/javascripts/issues/show/components/form.vue
@@ -1,6 +1,5 @@
<script>
import { GlAlert } from '@gitlab/ui';
-import ConvertDescriptionModal from 'ee_component/issues/show/components/convert_description_modal.vue';
import { getDraft, updateDraft, getLockVersion, clearDraft } from '~/lib/utils/autosave';
import { convertToGraphQLId } from '~/graphql_shared/utils';
import { TYPENAME_ISSUE, TYPENAME_USER } from '~/graphql_shared/constants';
@@ -16,7 +15,6 @@ import LockedWarning from './locked_warning.vue';
export default {
components: {
- ConvertDescriptionModal,
DescriptionField,
DescriptionTemplateField,
EditActions,
@@ -175,9 +173,6 @@ export default {
updateDraft(this.descriptionAutosaveKey, description, this.formState.lock_version);
}
},
- setDescription(desc) {
- this.formData.description = desc;
- },
},
};
</script>
@@ -219,14 +214,6 @@ export default {
:project-namespace="projectNamespace"
/>
</div>
-
- <convert-description-modal
- v-if="issueId && glFeatures.generateDescriptionAi"
- class="gl-pl-5 gl-md-pl-0"
- :resource-id="resourceId"
- :user-id="userId"
- @contentGenerated="setDescription"
- />
</div>
<description-field
diff --git a/app/assets/javascripts/issues/show/components/header_actions.vue b/app/assets/javascripts/issues/show/components/header_actions.vue
index a36b0c46927..719f252781d 100644
--- a/app/assets/javascripts/issues/show/components/header_actions.vue
+++ b/app/assets/javascripts/issues/show/components/header_actions.vue
@@ -13,7 +13,7 @@ import * as Sentry from '@sentry/browser';
import { mapActions, mapGetters, mapState } from 'vuex';
import { createAlert, VARIANT_SUCCESS } from '~/alert';
import { EVENT_ISSUABLE_VUE_APP_CHANGE } from '~/issuable/constants';
-import { STATUS_CLOSED, TYPE_INCIDENT, TYPE_ISSUE, IssuableTypeText } from '~/issues/constants';
+import { STATUS_CLOSED, TYPE_ISSUE, IssuableTypeText } from '~/issues/constants';
import {
ISSUE_STATE_EVENT_CLOSE,
ISSUE_STATE_EVENT_REOPEN,
@@ -22,7 +22,7 @@ import {
import { capitalizeFirstCharacter } from '~/lib/utils/text_utility';
import { getCookie, parseBoolean, setCookie, isLoggedIn } from '~/lib/utils/common_utils';
import { visitUrl } from '~/lib/utils/url_utility';
-import { s__, __, sprintf } from '~/locale';
+import { __, sprintf } from '~/locale';
import eventHub from '~/notes/event_hub';
import Tracking from '~/tracking';
import toast from '~/vue_shared/plugins/global_toast';
@@ -172,12 +172,9 @@ export default {
return this.openState === STATUS_CLOSED;
},
issueTypeText() {
- const issueTypeTexts = {
- [TYPE_ISSUE]: s__('HeaderAction|issue'),
- [TYPE_INCIDENT]: s__('HeaderAction|incident'),
- };
+ const { issueType } = this;
- return issueTypeTexts[this.issueType] ?? this.issueType;
+ return IssuableTypeText[issueType] ?? issueType;
},
buttonText() {
return this.isClosed
@@ -192,11 +189,11 @@ export default {
},
dropdownText() {
return sprintf(__('%{issueType} actions'), {
- issueType: capitalizeFirstCharacter(this.issueType),
+ issueType: capitalizeFirstCharacter(this.issueTypeText),
});
},
newIssueTypeText() {
- return sprintf(__('New related %{issueType}'), { issueType: this.issueType });
+ return sprintf(__('New related %{issueType}'), { issueType: this.issueTypeText });
},
showToggleIssueStateButton() {
const canClose = !this.isClosed && this.canUpdateIssue;
@@ -217,7 +214,7 @@ export default {
},
copyMailAddressText() {
return sprintf(__('Copy %{issueType} email address'), {
- issueType: IssuableTypeText[this.issueType],
+ issueType: this.issueTypeText,
});
},
isMrSidebarMoved() {
@@ -429,7 +426,7 @@ export default {
</gl-button>
<gl-button
- v-if="showToggleIssueStateButton"
+ v-if="showToggleIssueStateButton && !glFeatures.moveCloseIntoDropdown"
class="gl-display-none gl-sm-display-inline-flex!"
:data-qa-selector="qaSelector"
:loading="isToggleStateButtonLoading"
@@ -465,7 +462,12 @@ export default {
<gl-dropdown-divider />
</template>
-
+ <gl-dropdown-item
+ v-if="showToggleIssueStateButton && glFeatures.moveCloseIntoDropdown"
+ @click="toggleIssueState"
+ >
+ {{ buttonText }}
+ </gl-dropdown-item>
<gl-dropdown-item v-if="canCreateIssue && isUserSignedIn" :href="newIssuePath">
{{ newIssueTypeText }}
</gl-dropdown-item>
@@ -495,6 +497,7 @@ export default {
>{{ copyMailAddressText }}</gl-dropdown-item
>
</template>
+ <gl-dropdown-divider v-if="showToggleIssueStateButton || canDestroyIssue || canReportSpam" />
<gl-dropdown-item
v-if="canReportSpam"
:href="submitAsSpamPath"
@@ -503,8 +506,14 @@ export default {
>
{{ __('Submit as spam') }}
</gl-dropdown-item>
+ <gl-dropdown-item
+ v-if="!isIssueAuthor && isUserSignedIn"
+ data-testid="report-abuse-item"
+ @click="toggleReportAbuseDrawer(true)"
+ >
+ {{ $options.i18n.reportAbuse }}
+ </gl-dropdown-item>
<template v-if="canDestroyIssue">
- <gl-dropdown-divider />
<gl-dropdown-item
v-gl-modal="$options.deleteModalId"
variant="danger"
@@ -514,13 +523,6 @@ export default {
{{ deleteButtonText }}
</gl-dropdown-item>
</template>
- <gl-dropdown-item
- v-if="!isIssueAuthor && isUserSignedIn"
- data-testid="report-abuse-item"
- @click="toggleReportAbuseDrawer(true)"
- >
- {{ $options.i18n.reportAbuse }}
- </gl-dropdown-item>
</gl-dropdown>
<new-header-actions-popover v-if="isMrSidebarMoved" :issue-type="issueType" />
diff --git a/app/assets/javascripts/issues/show/components/incidents/timeline_events_form.vue b/app/assets/javascripts/issues/show/components/incidents/timeline_events_form.vue
index 8267c0130a3..2a59b7a2042 100644
--- a/app/assets/javascripts/issues/show/components/incidents/timeline_events_form.vue
+++ b/app/assets/javascripts/issues/show/components/incidents/timeline_events_form.vue
@@ -229,7 +229,7 @@ export default {
<template #textarea>
<textarea
v-model="timelineText"
- class="note-textarea js-gfm-input js-autosize markdown-area"
+ class="note-textarea note-textarea-rounded-bottom js-gfm-input js-autosize markdown-area gl-bordered"
data-testid="input-note"
dir="auto"
data-supports-quick-actions="false"
diff --git a/app/assets/javascripts/issues/show/components/incidents/timeline_events_item.vue b/app/assets/javascripts/issues/show/components/incidents/timeline_events_item.vue
index d33f3146d64..b776822bd9a 100644
--- a/app/assets/javascripts/issues/show/components/incidents/timeline_events_item.vue
+++ b/app/assets/javascripts/issues/show/components/incidents/timeline_events_item.vue
@@ -1,5 +1,5 @@
<script>
-import { GlDropdown, GlDropdownItem, GlIcon, GlSprintf, GlBadge } from '@gitlab/ui';
+import { GlDisclosureDropdown, GlIcon, GlSprintf, GlBadge } from '@gitlab/ui';
import SafeHtml from '~/vue_shared/directives/safe_html';
import { formatDate } from '~/lib/utils/datetime_utility';
import { timelineItemI18n } from './constants';
@@ -9,8 +9,7 @@ export default {
name: 'IncidentTimelineEventListItem',
i18n: timelineItemI18n,
components: {
- GlDropdown,
- GlDropdownItem,
+ GlDisclosureDropdown,
GlIcon,
GlSprintf,
GlBadge,
@@ -45,6 +44,25 @@ export default {
canEditEvent() {
return this.action === 'comment';
},
+ items() {
+ const items = [];
+
+ if (this.canEditEvent) {
+ items.push({
+ text: this.$options.i18n.edit,
+ action: () => {
+ this.$emit('edit');
+ },
+ });
+ }
+ items.push({
+ text: this.$options.i18n.delete,
+ action: () => {
+ this.$emit('delete');
+ },
+ });
+ return items;
+ },
},
methods: {
getEventIcon,
@@ -76,22 +94,16 @@ export default {
</div>
<div v-safe-html="noteHtml" class="md"></div>
</div>
- <gl-dropdown
+ <gl-disclosure-dropdown
v-if="canUpdateTimelineEvent"
- right
- class="event-note-actions gl-ml-auto gl-align-self-start"
+ placement="right"
+ class="event-note-actions gl-align-self-start"
icon="ellipsis_v"
text-sr-only
- :text="$options.i18n.moreActions"
+ :toggle-text="$options.i18n.moreActions"
category="tertiary"
no-caret
- >
- <gl-dropdown-item v-if="canEditEvent" @click="$emit('edit')">
- {{ $options.i18n.edit }}
- </gl-dropdown-item>
- <gl-dropdown-item @click="$emit('delete')">
- {{ $options.i18n.delete }}
- </gl-dropdown-item>
- </gl-dropdown>
+ :items="items"
+ />
</div>
</template>
diff --git a/app/assets/javascripts/jira_connect/subscriptions/components/add_namespace_button.vue b/app/assets/javascripts/jira_connect/subscriptions/components/add_namespace_button.vue
index 58b15b3eed1..4cd0d1edbcd 100644
--- a/app/assets/javascripts/jira_connect/subscriptions/components/add_namespace_button.vue
+++ b/app/assets/javascripts/jira_connect/subscriptions/components/add_namespace_button.vue
@@ -17,7 +17,7 @@ export default {
<template>
<div>
- <gl-button v-gl-modal="$options.ADD_NAMESPACE_MODAL_ID" category="primary" variant="info">
+ <gl-button v-gl-modal="$options.ADD_NAMESPACE_MODAL_ID" category="primary" variant="confirm">
{{ s__('JiraConnect|Link groups') }}
</gl-button>
<add-namespace-modal />
diff --git a/app/assets/javascripts/jira_connect/subscriptions/components/app.vue b/app/assets/javascripts/jira_connect/subscriptions/components/app.vue
index 7e79572f76d..c5f6f736626 100644
--- a/app/assets/javascripts/jira_connect/subscriptions/components/app.vue
+++ b/app/assets/javascripts/jira_connect/subscriptions/components/app.vue
@@ -10,6 +10,7 @@ import SignInPage from '../pages/sign_in/sign_in_page.vue';
import SubscriptionsPage from '../pages/subscriptions_page.vue';
import UserLink from './user_link.vue';
import BrowserSupportAlert from './browser_support_alert.vue';
+import FeedbackBanner from './feedback_banner.vue';
export default {
name: 'JiraConnectApp',
@@ -18,6 +19,7 @@ export default {
GlLink,
GlSprintf,
BrowserSupportAlert,
+ FeedbackBanner,
SignInPage,
SubscriptionsPage,
UserLink,
@@ -103,39 +105,47 @@ export default {
<user-link v-if="userSignedIn" :user="currentUser" class="gl-fixed gl-right-4" />
</header>
- <main class="jira-connect-app gl-px-5 gl-pt-7 gl-mx-auto">
- <browser-support-alert v-if="!isBrowserSupported" class="gl-mb-7" />
- <div v-else data-testid="jira-connect-app">
- <gl-alert
- v-if="shouldShowAlert"
- :variant="alert.variant"
- :title="alert.title"
- class="gl-mb-5"
- data-testid="jira-connect-persisted-alert"
- @dismiss="setAlert"
- >
- <gl-sprintf v-if="alert.linkUrl" :message="alert.message">
- <template #link="{ content }">
- <gl-link :href="alert.linkUrl" target="_blank">{{ content }}</gl-link>
- </template>
- </gl-sprintf>
+ <main
+ class="jira-connect-app gl-px-5 gl-pt-7 gl-pb-7 gl-mx-auto gl-display-flex gl-flex-direction-column gl-gap-7"
+ >
+ <div class="gl-flex-grow-1">
+ <browser-support-alert v-if="!isBrowserSupported" class="gl-mb-7" />
+ <div v-else data-testid="jira-connect-app">
+ <gl-alert
+ v-if="shouldShowAlert"
+ :variant="alert.variant"
+ :title="alert.title"
+ class="gl-mb-5"
+ data-testid="jira-connect-persisted-alert"
+ @dismiss="setAlert"
+ >
+ <gl-sprintf v-if="alert.linkUrl" :message="alert.message">
+ <template #link="{ content }">
+ <gl-link :href="alert.linkUrl" target="_blank">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
- <template v-else>
- {{ alert.message }}
- </template>
- </gl-alert>
+ <template v-else>
+ {{ alert.message }}
+ </template>
+ </gl-alert>
- <div class="gl-layout-w-limited gl-mx-auto gl-px-5 gl-mb-7">
- <sign-in-page
- v-show="!userSignedIn"
- :has-subscriptions="hasSubscriptions"
- :public-key-storage-enabled="publicKeyStorageEnabled"
- @sign-in-oauth="onSignInOauth"
- @error="onSignInError"
- />
- <subscriptions-page v-if="userSignedIn" :has-subscriptions="hasSubscriptions" />
+ <div class="gl-layout-w-limited gl-mx-auto gl-px-5 gl-mb-7">
+ <sign-in-page
+ v-show="!userSignedIn"
+ :has-subscriptions="hasSubscriptions"
+ :public-key-storage-enabled="publicKeyStorageEnabled"
+ @sign-in-oauth="onSignInOauth"
+ @error="onSignInError"
+ />
+ <subscriptions-page v-if="userSignedIn" :has-subscriptions="hasSubscriptions" />
+ </div>
</div>
</div>
+
+ <div class="gl-flex-grow-2">
+ <feedback-banner class="gl-max-w-80 gl-mx-auto" />
+ </div>
</main>
</div>
</template>
diff --git a/app/assets/javascripts/jira_connect/subscriptions/components/feedback_banner.vue b/app/assets/javascripts/jira_connect/subscriptions/components/feedback_banner.vue
new file mode 100644
index 00000000000..5d6117b836d
--- /dev/null
+++ b/app/assets/javascripts/jira_connect/subscriptions/components/feedback_banner.vue
@@ -0,0 +1,57 @@
+<script>
+import { GlBanner } from '@gitlab/ui';
+import ChatBubbleSvg from '@gitlab/svgs/dist/illustrations/chat-bubble-sm.svg?url';
+import { s__, __ } from '~/locale';
+import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
+
+export default {
+ components: {
+ GlBanner,
+ LocalStorageSync,
+ },
+
+ data() {
+ return {
+ feedbackBannerDismissed: false,
+ };
+ },
+
+ methods: {
+ handleBannerClose() {
+ this.feedbackBannerDismissed = true;
+ },
+ },
+
+ i18n: {
+ title: s__('JiraConnect|Tell us what you think!'),
+ body: s__(
+ 'JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App.',
+ ),
+ dismissLabel: __('Dismiss'),
+ buttonText: __('Give feedback'),
+ },
+ feedbackBannerKey: 'jira_connect_feedback_banner',
+ feedbackIssueUrl: 'https://gitlab.com/gitlab-org/gitlab/-/issues/413652',
+ buttonAttributes: {
+ target: '_blank',
+ },
+ ChatBubbleSvg,
+};
+</script>
+
+<template>
+ <local-storage-sync v-model="feedbackBannerDismissed" :storage-key="$options.feedbackBannerKey">
+ <gl-banner
+ v-if="!feedbackBannerDismissed"
+ :title="$options.i18n.title"
+ :button-attributes="$options.buttonAttributes"
+ :button-text="$options.i18n.buttonText"
+ :button-link="$options.feedbackIssueUrl"
+ :dismiss-label="$options.i18n.dismissLabel"
+ :svg-path="$options.ChatBubbleSvg"
+ @close="handleBannerClose"
+ >
+ <p>{{ $options.i18n.body }}</p>
+ </gl-banner>
+ </local-storage-sync>
+</template>
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 45a39fa5fab..ba264d0be34 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
@@ -187,7 +187,7 @@ export default {
<template>
<gl-button
v-bind="$attrs"
- variant="info"
+ variant="confirm"
:loading="loading"
:disabled="!canUseCrypto"
@click="startOAuthFlow"
diff --git a/app/assets/javascripts/jobs/components/job/job_app.vue b/app/assets/javascripts/jobs/components/job/job_app.vue
index d93b8a8de29..a5a92a3c4ff 100644
--- a/app/assets/javascripts/jobs/components/job/job_app.vue
+++ b/app/assets/javascripts/jobs/components/job/job_app.vue
@@ -3,6 +3,7 @@ import { GlLoadingIcon, GlIcon, GlAlert } from '@gitlab/ui';
import { GlBreakpointInstance as bp } from '@gitlab/ui/dist/utils';
import { throttle, isEmpty } from 'lodash';
import { mapGetters, mapState, mapActions } from 'vuex';
+import LogTopBar from 'ee_else_ce/jobs/components/job/job_log_controllers.vue';
import SafeHtml from '~/vue_shared/directives/safe_html';
import { isScrolledToBottom } from '~/lib/utils/scroll_utils';
import { __, sprintf } from '~/locale';
@@ -13,7 +14,6 @@ import { MANUAL_STATUS } from '~/jobs/constants';
import EmptyState from './empty_state.vue';
import EnvironmentsBlock from './environments_block.vue';
import ErasedBlock from './erased_block.vue';
-import LogTopBar from './job_log_controllers.vue';
import StuckBlock from './stuck_block.vue';
import UnmetPrerequisitesBlock from './unmet_prerequisites_block.vue';
import Sidebar from './sidebar/sidebar.vue';
diff --git a/app/assets/javascripts/jobs/components/job/job_log_controllers.vue b/app/assets/javascripts/jobs/components/job/job_log_controllers.vue
index ea7e13418f2..efd4eed2a9f 100644
--- a/app/assets/javascripts/jobs/components/job/job_log_controllers.vue
+++ b/app/assets/javascripts/jobs/components/job/job_log_controllers.vue
@@ -178,6 +178,7 @@ export default {
</script>
<template>
<div class="top-bar gl-display-flex gl-justify-content-space-between">
+ <slot name="drawers"></slot>
<!-- truncate information -->
<div
class="truncated-info gl-display-none gl-sm-display-flex gl-flex-wrap gl-align-items-center"
@@ -197,6 +198,7 @@ export default {
<!-- eo truncate information -->
<div class="controllers">
+ <slot name="controllers"> </slot>
<gl-search-box-by-click
v-model="searchTerm"
class="gl-mr-3"
diff --git a/app/assets/javascripts/jobs/components/job/sidebar/job_sidebar_retry_button.vue b/app/assets/javascripts/jobs/components/job/sidebar/job_sidebar_retry_button.vue
index 7183a8b5d03..e70f9199b55 100644
--- a/app/assets/javascripts/jobs/components/job/sidebar/job_sidebar_retry_button.vue
+++ b/app/assets/javascripts/jobs/components/job/sidebar/job_sidebar_retry_button.vue
@@ -1,5 +1,5 @@
<script>
-import { GlButton, GlDropdown, GlDropdownItem, GlModalDirective } from '@gitlab/ui';
+import { GlButton, GlDisclosureDropdown, GlModalDirective } from '@gitlab/ui';
import { mapGetters } from 'vuex';
import { JOB_SIDEBAR_COPY } from '~/jobs/constants';
@@ -10,8 +10,7 @@ export default {
},
components: {
GlButton,
- GlDropdown,
- GlDropdownItem,
+ GlDisclosureDropdown,
},
directives: {
GlModal: GlModalDirective,
@@ -32,6 +31,21 @@ export default {
},
computed: {
...mapGetters(['hasForwardDeploymentFailure']),
+ dropdownItems() {
+ return [
+ {
+ text: this.$options.i18n.runAgainJobButtonLabel,
+ href: this.href,
+ extraAttrs: {
+ 'data-method': 'post',
+ },
+ },
+ {
+ text: this.$options.i18n.updateVariables,
+ action: () => this.$emit('updateVariablesClicked'),
+ },
+ ];
+ },
},
};
</script>
@@ -45,20 +59,14 @@ export default {
icon="retry"
data-testid="retry-job-button"
/>
- <gl-dropdown
+ <gl-disclosure-dropdown
v-else-if="isManualJob"
icon="retry"
category="primary"
- :right="true"
+ placement="right"
variant="confirm"
- >
- <gl-dropdown-item :href="href" data-method="post">
- {{ $options.i18n.runAgainJobButtonLabel }}
- </gl-dropdown-item>
- <gl-dropdown-item @click="$emit('updateVariablesClicked')">
- {{ $options.i18n.updateVariables }}
- </gl-dropdown-item>
- </gl-dropdown>
+ :items="dropdownItems"
+ />
<gl-button
v-else
:href="href"
diff --git a/app/assets/javascripts/jobs/components/job/sidebar/stages_dropdown.vue b/app/assets/javascripts/jobs/components/job/sidebar/stages_dropdown.vue
index 9a88018205b..c1f84adf664 100644
--- a/app/assets/javascripts/jobs/components/job/sidebar/stages_dropdown.vue
+++ b/app/assets/javascripts/jobs/components/job/sidebar/stages_dropdown.vue
@@ -161,6 +161,11 @@ export default {
</gl-sprintf>
</div>
- <gl-disclosure-dropdown :toggle-text="selectedStage" :items="dropdownItems" class="gl-mt-3" />
+ <gl-disclosure-dropdown
+ :toggle-text="selectedStage"
+ :items="dropdownItems"
+ block
+ class="gl-mt-3"
+ />
</div>
</template>
diff --git a/app/assets/javascripts/jobs/components/job/stuck_block.vue b/app/assets/javascripts/jobs/components/job/stuck_block.vue
index d7a26d22406..1a678ce69a8 100644
--- a/app/assets/javascripts/jobs/components/job/stuck_block.vue
+++ b/app/assets/javascripts/jobs/components/job/stuck_block.vue
@@ -1,6 +1,7 @@
<script>
import { GlAlert, GlBadge, GlLink, GlSprintf } from '@gitlab/ui';
import { s__ } from '~/locale';
+import { DOCS_URL } from 'jh_else_ce/lib/utils/url_utility';
/**
* Renders Stuck Runners block for job's view.
*/
@@ -31,7 +32,7 @@ export default {
return this.tags.length > 0;
},
protectedBranchSettingsDocsLink() {
- return 'https://docs.gitlab.com/runner/security/index.html#reduce-the-security-risk-of-using-privileged-containers';
+ return `${DOCS_URL}/runner/security/index.html#reduce-the-security-risk-of-using-privileged-containers`;
},
stuckData() {
if (this.hasNoRunnersWithCorrespondingTags) {
diff --git a/app/assets/javascripts/jobs/components/table/cells/job_cell.vue b/app/assets/javascripts/jobs/components/table/cells/job_cell.vue
index b692553fdc2..27d286fc766 100644
--- a/app/assets/javascripts/jobs/components/table/cells/job_cell.vue
+++ b/app/assets/javascripts/jobs/components/table/cells/job_cell.vue
@@ -71,7 +71,7 @@ export default {
<template>
<div>
- <div class="gl-text-truncate">
+ <div class="gl-text-truncate gl-mb-2">
<gl-link
v-if="canReadJob"
class="gl-text-blue-600!"
@@ -92,7 +92,7 @@ export default {
/>
<div
- class="gl-display-flex gl-text-gray-700 gl-align-items-center gl-lg-justify-content-start gl-justify-content-end"
+ class="gl-display-flex gl-text-gray-700 gl-align-items-center gl-lg-justify-content-start gl-justify-content-end gl-mt-2"
>
<div
v-if="jobRef"
diff --git a/app/assets/javascripts/jobs/index.js b/app/assets/javascripts/jobs/index.js
index 44bb1ffb1bc..8cd69f25218 100644
--- a/app/assets/javascripts/jobs/index.js
+++ b/app/assets/javascripts/jobs/index.js
@@ -2,6 +2,7 @@ import { GlToast } from '@gitlab/ui';
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import createDefaultClient from '~/lib/graphql';
+import { parseBoolean } from '~/lib/utils/common_utils';
import JobApp from './components/job/job_app.vue';
import createStore from './store';
@@ -29,6 +30,7 @@ const initializeJobPage = (element) => {
buildStatus,
projectPath,
retryOutdatedJobDocsUrl,
+ aiRootCauseAnalysisAvailable,
} = element.dataset;
return new Vue({
@@ -41,6 +43,7 @@ const initializeJobPage = (element) => {
provide: {
projectPath,
retryOutdatedJobDocsUrl,
+ aiRootCauseAnalysisAvailable: parseBoolean(aiRootCauseAnalysisAvailable),
},
render(createElement) {
return createElement('job-app', {
diff --git a/app/assets/javascripts/layout_nav.js b/app/assets/javascripts/layout_nav.js
index 42682d9b79f..670170ec9b9 100644
--- a/app/assets/javascripts/layout_nav.js
+++ b/app/assets/javascripts/layout_nav.js
@@ -66,15 +66,15 @@ export function initScrollingTabs() {
function initInviteMembers() {
const modalEl = document.querySelector('.js-invite-members-modal');
- if (!modalEl) return;
-
- import(
- /* webpackChunkName: 'initInviteMembersModal' */ '~/invite_members/init_invite_members_modal'
- )
- .then(({ default: initInviteMembersModal }) => {
- initInviteMembersModal();
- })
- .catch(() => {});
+ if (modalEl) {
+ import(
+ /* webpackChunkName: 'initInviteMembersModal' */ '~/invite_members/init_invite_members_modal'
+ )
+ .then(({ default: initInviteMembersModal }) => {
+ initInviteMembersModal();
+ })
+ .catch(() => {});
+ }
const inviteTriggers = document.querySelectorAll('.js-invite-members-trigger');
if (!inviteTriggers) return;
diff --git a/app/assets/javascripts/lib/logger/hello.js b/app/assets/javascripts/lib/logger/hello.js
index ccfdfe91e60..4ad99ec09d8 100644
--- a/app/assets/javascripts/lib/logger/hello.js
+++ b/app/assets/javascripts/lib/logger/hello.js
@@ -1,4 +1,5 @@
import { s__, sprintf } from '~/locale';
+import { PROMO_URL } from 'jh_else_ce/lib/utils/url_utility';
const HANDSHAKE = String.fromCodePoint(0x1f91d);
const MAG = String.fromCodePoint(0x1f50e);
@@ -15,7 +16,7 @@ ${s__(
${sprintf(s__('HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}'), {
handshake_emoji: `${HANDSHAKE}`,
- contribute_link: 'https://about.gitlab.com/community/contribute/',
+ contribute_link: `${PROMO_URL}/community/contribute/`,
})}
${sprintf(s__('HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}'), {
magnifier_emoji: `${MAG}`,
@@ -27,7 +28,7 @@ ${
s__(
'HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}',
),
- { rocket_emoji: `${ROCKET}`, jobs_page_link: 'https://about.gitlab.com/jobs/' },
+ { rocket_emoji: `${ROCKET}`, jobs_page_link: `${PROMO_URL}/jobs/` },
)}`
: ''
}`,
diff --git a/app/assets/javascripts/lib/utils/common_utils.js b/app/assets/javascripts/lib/utils/common_utils.js
index 7795dac18bc..cca4cf68f5e 100644
--- a/app/assets/javascripts/lib/utils/common_utils.js
+++ b/app/assets/javascripts/lib/utils/common_utils.js
@@ -721,3 +721,13 @@ export const getFirstPropertyValue = (data) => {
return data[key];
};
+
+export const isCurrentUser = (userId) => {
+ const currentUserId = window.gon?.current_user_id;
+
+ if (!currentUserId) {
+ return false;
+ }
+
+ return Number(userId) === currentUserId;
+};
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 24be1485379..b61f01590cd 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
@@ -68,7 +68,7 @@ export default {
text: this.primaryText,
attributes: {
variant: this.primaryVariant,
- 'data-qa-selector': 'confirm_ok_button',
+ 'data-testid': 'confirm-ok-button',
},
};
},
@@ -110,6 +110,7 @@ export default {
ref="modal"
modal-id="confirmationModal"
body-class="gl-display-flex"
+ data-testid="confirmation-modal"
:size="size"
:title="title"
:action-primary="primaryAction"
diff --git a/app/assets/javascripts/lib/utils/datetime/date_format_utility.js b/app/assets/javascripts/lib/utils/datetime/date_format_utility.js
index e1a57bf4589..b0264796d90 100644
--- a/app/assets/javascripts/lib/utils/datetime/date_format_utility.js
+++ b/app/assets/javascripts/lib/utils/datetime/date_format_utility.js
@@ -3,6 +3,7 @@ import dateFormat from '~/lib/dateformat';
import { roundToNearestHalf } from '~/lib/utils/common_utils';
import { sanitize } from '~/lib/dompurify';
import { s__, n__, __, sprintf } from '~/locale';
+import { parsePikadayDate } from './pikaday_utility';
/**
* Returns i18n month names array.
@@ -420,3 +421,34 @@ export const formatUtcOffset = (offset) => {
* @returns {String} the UTC timezone with the offset, e.g. `[UTC+2] Berlin, [UTC 0] London`
*/
export const formatTimezone = ({ offset, name }) => `[UTC${formatUtcOffset(offset)}] ${name}`;
+
+/**
+ * Returns humanized string showing date range from provided start and due dates.
+ *
+ * @param {Date} startDate
+ * @param {Date} dueDate
+ * @returns
+ */
+export const humanTimeframe = (startDate, dueDate) => {
+ const start = startDate ? parsePikadayDate(startDate) : null;
+ const due = dueDate ? parsePikadayDate(dueDate) : null;
+
+ if (startDate && dueDate) {
+ const startDateInWords = dateInWords(start, true, start.getFullYear() === due.getFullYear());
+ const dueDateInWords = dateInWords(due, true);
+
+ return sprintf(__('%{startDate} – %{dueDate}'), {
+ startDate: startDateInWords,
+ dueDate: dueDateInWords,
+ });
+ } else if (startDate && !dueDate) {
+ return sprintf(__('%{startDate} – No due date'), {
+ startDate: dateInWords(start, true, false),
+ });
+ } else if (!startDate && dueDate) {
+ return sprintf(__('No start date – %{dueDate}'), {
+ dueDate: dateInWords(due, true, false),
+ });
+ }
+ return '';
+};
diff --git a/app/assets/javascripts/lib/utils/forms.js b/app/assets/javascripts/lib/utils/forms.js
index 1d8c6ee23fc..652ae337506 100644
--- a/app/assets/javascripts/lib/utils/forms.js
+++ b/app/assets/javascripts/lib/utils/forms.js
@@ -18,18 +18,69 @@ export const serializeForm = (form) => {
};
/**
+ * Like trim but without the error for non-string values.
+ *
+ * @param {String, Number, Array} - value
+ * @returns {String, Number, Array} - the trimmed string or the value if it isn't a string
+ */
+export const safeTrim = (value) => (typeof value === 'string' ? value.trim() : value);
+
+/**
* Check if the value provided is empty or not
*
* It is being used to check if a form input
- * value has been set or not
+ * value has been set or not.
*
* @param {String, Number, Array} - Any form value
* @returns {Boolean} - returns false if a value is set
*
* @example
- * returns true for '', [], null, undefined
+ * returns true for '', ' ', [], null, undefined
+ */
+export const isEmptyValue = (value) => value == null || safeTrim(value).length === 0;
+
+/**
+ * Check if the value has a minimum string length
+ *
+ * @param {String, Number, Array} - Any form value
+ * @param {Number} - minLength
+ * @returns {Boolean}
+ */
+export const hasMinimumLength = (value, minLength) =>
+ !isEmptyValue(value) && value.length >= minLength;
+
+/**
+ * Checks if the given value can be parsed as an integer as it is (without cutting off decimals etc.)
+ *
+ * @param {String, Number, Array} - Any form value
+ * @returns {Boolean}
+ */
+export const isParseableAsInteger = (value) =>
+ !isEmptyValue(value) && Number.isInteger(Number(safeTrim(value)));
+
+/**
+ * Checks if the parsed integer value from the given input is greater than a certain number
+ *
+ * @param {String, Number, Array} - Any form value
+ * @param {Number} - greaterThan
+ * @returns {Boolean}
+ */
+export const isIntegerGreaterThan = (value, greaterThan) =>
+ isParseableAsInteger(value) && parseInt(value, 10) > greaterThan;
+
+/**
+ * Regexp that matches email structure.
+ * Taken from app/models/service_desk_setting.rb custom_email
+ */
+export const EMAIL_REGEXP = /^[\w\-._]+@[\w\-.]+\.[a-zA-Z]{2,}$/;
+
+/**
+ * Checks if the input is a valid email address
+ *
+ * @param {String} - value
+ * @returns {Boolean}
*/
-export const isEmptyValue = (value) => value == null || value.length === 0;
+export const isEmail = (value) => EMAIL_REGEXP.test(value);
/**
* A form object serializer
diff --git a/app/assets/javascripts/lib/utils/text_markdown.js b/app/assets/javascripts/lib/utils/text_markdown.js
index a2873622682..e6eb74834c0 100644
--- a/app/assets/javascripts/lib/utils/text_markdown.js
+++ b/app/assets/javascripts/lib/utils/text_markdown.js
@@ -376,8 +376,8 @@ export function updateText({ textArea, tag, cursorOffset, blockTag, wrap, select
textArea = $textArea.get(0);
const text = $textArea.val();
const selected = selectedText(text, textArea) || tagContent;
- $textArea.focus();
- return insertMarkdownText({
+ textArea.focus();
+ insertMarkdownText({
textArea,
text,
tag,
@@ -387,6 +387,7 @@ export function updateText({ textArea, tag, cursorOffset, blockTag, wrap, select
wrap,
select,
});
+ textArea.click();
}
/**
@@ -596,6 +597,7 @@ export function compositionEndNoteText() {
export function updateTextForToolbarBtn($toolbarBtn) {
const $textArea = $toolbarBtn.closest('.md-area').find('textarea');
+ if (!$textArea.length) return;
switch ($toolbarBtn.data('mdCommand')) {
case 'indentLines':
diff --git a/app/assets/javascripts/lib/utils/vue3compat/vue_router.js b/app/assets/javascripts/lib/utils/vue3compat/vue_router.js
index aa2963ece31..62054d5a80d 100644
--- a/app/assets/javascripts/lib/utils/vue3compat/vue_router.js
+++ b/app/assets/javascripts/lib/utils/vue3compat/vue_router.js
@@ -26,24 +26,26 @@ const mode = (value, options) => {
const base = () => null;
-const toNewCatchAllPath = (path) => {
- if (path === '*') return '/:pathMatch(.*)*';
+const toNewCatchAllPath = (path, { isRoot } = {}) => {
+ if (path === '*') {
+ const prefix = isRoot ? '/' : '';
+ return `${prefix}:pathMatch(.*)*`;
+ }
return path;
};
-const routes = (value) => {
+const transformRoutes = (value, _routerOptions, transformOptions = { isRoot: true }) => {
if (!value) return null;
- const newRoutes = value.reduce(function handleRoutes(acc, route) {
+ const newRoutes = value.map(function handleRoutes(route) {
const newRoute = {
...route,
- path: toNewCatchAllPath(route.path),
+ path: toNewCatchAllPath(route.path, transformOptions),
};
if (route.children) {
- newRoute.children = route.children.reduce(handleRoutes, []);
+ newRoute.children = transformRoutes(route.children, _routerOptions, { isRoot: false }).routes;
}
- acc.push(newRoute);
- return acc;
- }, []);
+ return newRoute;
+ });
return { routes: newRoutes };
};
@@ -59,7 +61,7 @@ const scrollBehavior = (value) => {
const transformers = {
mode,
base,
- routes,
+ routes: transformRoutes,
scrollBehavior,
};
@@ -107,7 +109,15 @@ export default class VueRouterCompat {
installed.set(app, new WeakSet());
}
installed.get(app).add(router);
+
+ // Since we're doing "late initialization" we might already have RouterLink
+ // for example, from router stubs. We need to maintain it
+ const originalRouterLink = this.$.appContext.components.RouterLink;
+ delete this.$.appContext.components.RouterLink;
this.$.appContext.app.use(this.$options.router);
+ if (originalRouterLink) {
+ this.$.appContext.components.RouterLink = originalRouterLink;
+ }
}
},
});
diff --git a/app/assets/javascripts/members/components/table/members_table.vue b/app/assets/javascripts/members/components/table/members_table.vue
index c973d58fcd2..f6fd84c46cb 100644
--- a/app/assets/javascripts/members/components/table/members_table.vue
+++ b/app/assets/javascripts/members/components/table/members_table.vue
@@ -127,10 +127,15 @@ export default {
},
actionsFieldTdClass(value, key, member) {
if (this.hasActionButtons(member)) {
- return 'col-actions';
+ return ['col-actions', 'gl-vertical-align-middle!'];
}
- return ['col-actions', 'gl-display-none!', 'gl-lg-display-table-cell!'];
+ return [
+ 'col-actions',
+ 'gl-display-none!',
+ 'gl-lg-display-table-cell!',
+ 'gl-vertical-align-middle!',
+ ];
},
tbodyTrAttr(member) {
return {
diff --git a/app/assets/javascripts/members/components/table/role_dropdown.vue b/app/assets/javascripts/members/components/table/role_dropdown.vue
index 4571c4172e5..c854d865869 100644
--- a/app/assets/javascripts/members/components/table/role_dropdown.vue
+++ b/app/assets/javascripts/members/components/table/role_dropdown.vue
@@ -76,6 +76,7 @@ export default {
newRoleName,
);
if (!confirmed) {
+ this.selectedRoleValue = currentRoleValue;
this.busy = false;
return;
}
diff --git a/app/assets/javascripts/members/constants.js b/app/assets/javascripts/members/constants.js
index 8e5b88d362e..e1f7e81d831 100644
--- a/app/assets/javascripts/members/constants.js
+++ b/app/assets/javascripts/members/constants.js
@@ -32,12 +32,13 @@ export const FIELDS = [
asc: 'name_asc',
desc: 'name_desc',
},
+ tdClass: 'gl-vertical-align-middle!',
},
{
key: FIELD_KEY_SOURCE,
label: __('Source'),
thClass: 'col-meta',
- tdClass: 'col-meta',
+ tdClass: 'col-meta gl-vertical-align-middle!',
},
{
key: FIELD_KEY_GRANTED,
@@ -46,24 +47,25 @@ export const FIELDS = [
asc: 'last_joined',
desc: 'oldest_joined',
},
+ tdClass: 'gl-vertical-align-middle!',
},
{
key: FIELD_KEY_INVITED,
label: __('Invited'),
thClass: 'col-meta',
- tdClass: 'col-meta',
+ tdClass: 'col-meta gl-vertical-align-middle!',
},
{
key: FIELD_KEY_REQUESTED,
label: __('Requested'),
thClass: 'col-meta',
- tdClass: 'col-meta',
+ tdClass: 'col-meta gl-vertical-align-middle!',
},
{
key: FIELD_KEY_MAX_ROLE,
label: __('Max role'),
thClass: 'col-max-role',
- tdClass: 'col-max-role',
+ tdClass: 'col-max-role gl-vertical-align-middle!',
sort: {
asc: 'access_level_asc',
desc: 'access_level_desc',
@@ -73,13 +75,13 @@ export const FIELDS = [
key: FIELD_KEY_EXPIRATION,
label: __('Expiration'),
thClass: 'col-expiration',
- tdClass: 'col-expiration',
+ tdClass: 'col-expiration gl-vertical-align-middle!',
},
{
key: FIELD_KEY_ACTIVITY,
label: s__('Members|Activity'),
thClass: 'col-activity',
- tdClass: 'col-activity',
+ tdClass: 'col-activity gl-vertical-align-middle!',
},
{
key: FIELD_KEY_USER_CREATED_AT,
diff --git a/app/assets/javascripts/merge_request_tabs.js b/app/assets/javascripts/merge_request_tabs.js
index 8307d0a9eed..883b9e6919b 100644
--- a/app/assets/javascripts/merge_request_tabs.js
+++ b/app/assets/javascripts/merge_request_tabs.js
@@ -21,7 +21,12 @@ import syntaxHighlight from './syntax_highlight';
Vue.use(VueApollo);
const apolloProvider = new VueApollo({
- defaultClient: createDefaultClient(),
+ defaultClient: createDefaultClient(
+ {},
+ {
+ useGet: true,
+ },
+ ),
});
// MergeRequestTabs
@@ -96,6 +101,7 @@ function mountPipelines() {
artifactsEndpointPlaceholder: pipelineTableViewEl.dataset.artifactsEndpointPlaceholder,
targetProjectFullPath: mrWidgetData?.target_project_full_path || '',
fullPath: pipelineTableViewEl.dataset.fullPath,
+ graphqlPath: pipelineTableViewEl.dataset.graphqlPath,
manualActionsLimit: 50,
withFailedJobsDetails: true,
},
diff --git a/app/assets/javascripts/merge_requests/components/sticky_header.vue b/app/assets/javascripts/merge_requests/components/sticky_header.vue
index c6e8a9ea582..362ecca6d6c 100644
--- a/app/assets/javascripts/merge_requests/components/sticky_header.vue
+++ b/app/assets/javascripts/merge_requests/components/sticky_header.vue
@@ -113,14 +113,14 @@ export default {
class="issue-sticky-header-text gl-display-flex gl-flex-direction-column gl-align-items-center gl-mx-auto gl-px-5 gl-w-full"
:class="{ 'gl-max-w-container-xl': !isFluidLayout }"
>
- <div class="gl-w-full gl-display-flex gl-align-items-center">
+ <div class="gl-w-full gl-display-flex gl-align-items-baseline">
<status-box :initial-state="getNoteableData.state" issuable-type="merge_request" />
<a
v-safe-html:[$options.safeHtmlConfig]="titleHtml"
href="#top"
class="gl-display-none gl-lg-display-block gl-font-weight-bold gl-overflow-hidden gl-white-space-nowrap gl-text-overflow-ellipsis gl-my-0 gl-mr-4 gl-text-black-normal"
></a>
- <div class="gl-display-flex gl-align-items-center">
+ <div class="gl-display-flex gl-align-items-baseline">
<gl-sprintf :message="__('%{source} %{copyButton} into %{target}')">
<template #copyButton>
<clipboard-button
@@ -129,7 +129,7 @@ export default {
size="small"
category="tertiary"
tooltip-placement="bottom"
- class="gl-m-0! gl-mx-1! js-source-branch-copy"
+ class="gl-m-0! gl-mx-1! js-source-branch-copy gl-align-self-center"
/>
</template>
<template #source>
diff --git a/app/assets/javascripts/merge_requests/generated_content.js b/app/assets/javascripts/merge_requests/generated_content.js
new file mode 100644
index 00000000000..0184801ce80
--- /dev/null
+++ b/app/assets/javascripts/merge_requests/generated_content.js
@@ -0,0 +1,64 @@
+export class MergeRequestGeneratedContent {
+ constructor({ editor } = {}) {
+ this.warningElement = document.querySelector('.js-ai-description-warning');
+ this.markdownEditor = editor;
+ this.generatedContent = null;
+
+ this.connectToDOM();
+ }
+
+ get hasEditor() {
+ return Boolean(this.markdownEditor);
+ }
+ get hasWarning() {
+ return Boolean(this.warningElement);
+ }
+ get canReplaceContent() {
+ return this.hasEditor && Boolean(this.generatedContent);
+ }
+
+ connectToDOM() {
+ let close;
+ let cancel;
+ let approve;
+
+ if (this.hasWarning) {
+ approve = this.warningElement.querySelector('.js-ai-override-description');
+ cancel = this.warningElement.querySelector('.js-cancel-btn');
+ close = this.warningElement.querySelector('.js-close-btn');
+
+ approve.addEventListener('click', () => {
+ this.replaceDescription();
+ this.hideWarning();
+ });
+
+ cancel.addEventListener('click', () => this.hideWarning());
+ close.addEventListener('click', () => this.hideWarning());
+ }
+ }
+
+ setEditor(markdownEditor) {
+ this.markdownEditor = markdownEditor;
+ }
+ setGeneratedContent(newContent) {
+ this.generatedContent = newContent;
+ }
+ clearGeneratedContent() {
+ this.generatedContent = null;
+ }
+
+ showWarning() {
+ if (this.canReplaceContent) {
+ this.warningElement?.classList.remove('hidden');
+ }
+ }
+ hideWarning() {
+ this.warningElement?.classList.add('hidden');
+ }
+ replaceDescription() {
+ if (this.canReplaceContent) {
+ this.markdownEditor.setValue(this.generatedContent);
+ this.clearGeneratedContent();
+ }
+ }
+}
diff --git a/app/assets/javascripts/milestones/index.js b/app/assets/javascripts/milestones/index.js
index 420f7cee4d2..403db0865f0 100644
--- a/app/assets/javascripts/milestones/index.js
+++ b/app/assets/javascripts/milestones/index.js
@@ -1,10 +1,9 @@
-import $ from 'jquery';
import Vue from 'vue';
import initDatePicker from '~/behaviors/date_picker';
-import GLForm from '~/gl_form';
import { BV_SHOW_MODAL } from '~/lib/utils/constants';
import Milestone from '~/milestones/milestone';
import { renderGFM } from '~/behaviors/markdown/render_gfm';
+import { mountMarkdownEditor } from '~/vue_shared/components/markdown/mount_markdown_editor';
import Sidebar from '~/right_sidebar';
import MountMilestoneSidebar from '~/sidebar/mount_milestone_sidebar';
import Translate from '~/vue_shared/translate';
@@ -22,22 +21,10 @@ export const MILESTONE_DESCRIPTION_ELEMENT = '.milestone-detail .description';
export const MILESTONE_DESCRIPTION_TASK_LIST_CONTAINER_ELEMENT = `${MILESTONE_DESCRIPTION_ELEMENT}.js-task-list-container`;
export const MILESTONE_DETAIL_ELEMENT = '.milestone-detail';
-export function initForm(initGFM = true) {
+export function initForm() {
+ mountMarkdownEditor();
new ZenMode(); // eslint-disable-line no-new
initDatePicker();
-
- // eslint-disable-next-line no-new
- new GLForm($('.milestone-form'), {
- emojis: true,
- members: initGFM,
- issues: initGFM,
- mergeRequests: initGFM,
- epics: initGFM,
- milestones: initGFM,
- labels: initGFM,
- snippets: initGFM,
- vulnerabilities: initGFM,
- });
}
export function initShow() {
diff --git a/app/assets/javascripts/ml/model_registry/routes/models/index/components/ml_models_index.vue b/app/assets/javascripts/ml/model_registry/routes/models/index/components/ml_models_index.vue
new file mode 100644
index 00000000000..37e5877ec52
--- /dev/null
+++ b/app/assets/javascripts/ml/model_registry/routes/models/index/components/ml_models_index.vue
@@ -0,0 +1,34 @@
+<script>
+import { GlLink } from '@gitlab/ui';
+import * as translations from '~/ml/model_registry/routes/models/index/translations';
+
+export default {
+ name: 'MlExperimentsIndexApp',
+ components: {
+ GlLink,
+ },
+ props: {
+ models: {
+ type: Array,
+ required: true,
+ },
+ },
+ i18n: translations,
+};
+</script>
+
+<template>
+ <div>
+ <div class="detail-page-header gl-flex-wrap">
+ <div class="detail-page-header-body">
+ <div class="page-title gl-flex-grow-1 gl-display-flex gl-align-items-center">
+ <h2 class="gl-font-size-h-display gl-my-0">{{ $options.i18n.TITLE_LABEL }}</h2>
+ </div>
+ </div>
+ </div>
+
+ <div v-for="model in models" :key="model.name">
+ <gl-link :href="model.path"> {{ model.name }} / {{ model.version }} </gl-link>
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/ml/model_registry/routes/models/index/index.js b/app/assets/javascripts/ml/model_registry/routes/models/index/index.js
new file mode 100644
index 00000000000..d303d9716af
--- /dev/null
+++ b/app/assets/javascripts/ml/model_registry/routes/models/index/index.js
@@ -0,0 +1,3 @@
+import MlModelsIndex from './components/ml_models_index.vue';
+
+export default MlModelsIndex;
diff --git a/app/assets/javascripts/ml/model_registry/routes/models/index/translations.js b/app/assets/javascripts/ml/model_registry/routes/models/index/translations.js
new file mode 100644
index 00000000000..f0f45f9424e
--- /dev/null
+++ b/app/assets/javascripts/ml/model_registry/routes/models/index/translations.js
@@ -0,0 +1,3 @@
+import { s__ } from '~/locale';
+
+export const TITLE_LABEL = s__('MlExperimentTracking|Model registry');
diff --git a/app/assets/javascripts/monitoring/components/charts/annotations.js b/app/assets/javascripts/monitoring/components/charts/annotations.js
deleted file mode 100644
index aac9d2f8a01..00000000000
--- a/app/assets/javascripts/monitoring/components/charts/annotations.js
+++ /dev/null
@@ -1,133 +0,0 @@
-import { graphTypes, symbolSizes, colorValues, annotationsSymbolIcon } from '../../constants';
-
-/**
- * Annotations and deployments are decoration layers on
- * top of the actual chart data. We use a scatter plot to
- * display this information. Each chart has its coordinate
- * system based on data and irrespective of the data, these
- * decorations have to be placed in specific locations.
- * For this reason, annotations have their own coordinate system,
- *
- * As of %12.9, only deployment icons, a type of annotations, need
- * to be displayed on the chart.
- *
- * Annotations and deployments co-exist in the same series as
- * they logically belong together. Annotations are passed as
- * markLines and markPoints while deployments are passed as
- * data points with custom icons.
- */
-
-/**
- * Deployment icons, a type of annotation, are displayed
- * along the [min, max] range at height `pos`.
- */
-const annotationsYAxisCoords = {
- min: 0,
- pos: 3, // 3% height of chart's grid
- max: 100,
-};
-
-/**
- * Annotation y axis min & max allows the deployment
- * icons to position correctly in the chart
- */
-export const annotationsYAxis = {
- show: false,
- min: annotationsYAxisCoords.min,
- max: annotationsYAxisCoords.max,
- axisLabel: {
- // formatter fn required to trigger tooltip re-positioning
- formatter: () => {},
- },
-};
-
-/**
- * Fetched list of annotations are parsed into a
- * format the eCharts accepts to draw markLines
- *
- * If Annotation is a single line, the `startingAt` property
- * has a value and the `endingAt` is null. Because annotations
- * only supports lines the `endingAt` value does not exist yet.
- *
- * @param {Object} annotation object
- * @returns {Object} markLine object
- */
-export const parseAnnotations = (annotations) =>
- annotations.reduce(
- (acc, annotation) => {
- acc.lines.push({
- xAxis: annotation.startingAt,
- lineStyle: {
- color: colorValues.primaryColor,
- },
- });
-
- acc.points.push({
- name: 'annotations',
- xAxis: annotation.startingAt,
- yAxis: annotationsYAxisCoords.min,
- tooltipData: {
- title: annotation.startingAt,
- content: annotation.description,
- },
- });
-
- return acc;
- },
- { lines: [], points: [] },
- );
-
-/**
- * This method generates a decorative series that has
- * deployments as data points with custom icons and
- * annotations as markLines and markPoints
- *
- * @param {Array} deployments deployments data
- * @returns {Object} annotation series object
- */
-export const generateAnnotationsSeries = ({ deployments = [], annotations = [] } = {}) => {
- // deployment data points
- const data = deployments.map((deployment) => {
- return {
- name: 'deployments',
- value: [deployment.createdAt, annotationsYAxisCoords.pos],
- // style options
- symbol: deployment.icon,
- symbolSize: symbolSizes.default,
- itemStyle: {
- color: deployment.color,
- },
- // metadata that are accessible in `formatTooltipText` method
- tooltipData: {
- sha: deployment.sha.substring(0, 8),
- commitUrl: deployment.commitUrl,
- },
- };
- });
-
- const parsedAnnotations = parseAnnotations(annotations);
-
- // markLine option draws the annotations dotted line
- const markLine = {
- symbol: 'none',
- silent: true,
- data: parsedAnnotations.lines,
- };
-
- // markPoints are the arrows under the annotations lines
- const markPoint = {
- symbol: annotationsSymbolIcon,
- symbolSize: '8',
- symbolOffset: [0, ' 60%'],
- data: parsedAnnotations.points,
- };
-
- return {
- name: 'annotations',
- type: graphTypes.annotationsData,
- yAxisIndex: 1, // annotationsYAxis index
- data,
- markLine,
- markPoint,
- };
-};
diff --git a/app/assets/javascripts/monitoring/components/charts/anomaly.vue b/app/assets/javascripts/monitoring/components/charts/anomaly.vue
deleted file mode 100644
index b6eb1a23f87..00000000000
--- a/app/assets/javascripts/monitoring/components/charts/anomaly.vue
+++ /dev/null
@@ -1,230 +0,0 @@
-<script>
-import { GlChartSeriesLabel } from '@gitlab/ui/dist/charts';
-import { hexToRgba } from '@gitlab/ui/dist/utils/utils';
-
-import produce from 'immer';
-import { flattenDeep, isNumber } from 'lodash';
-import { roundOffFloat } from '~/lib/utils/common_utils';
-import { areaOpacityValues, symbolSizes, colorValues, panelTypes } from '../../constants';
-import { graphDataValidatorForAnomalyValues } from '../../utils';
-import MonitorTimeSeriesChart from './time_series.vue';
-
-/**
- * Series indexes
- */
-const METRIC = 0;
-const UPPER = 1;
-const LOWER = 2;
-
-/**
- * Boundary area appearance
- */
-const AREA_COLOR = colorValues.anomalyAreaColor;
-const AREA_OPACITY = areaOpacityValues.default;
-const AREA_COLOR_RGBA = hexToRgba(AREA_COLOR, AREA_OPACITY);
-
-/**
- * The anomaly component highlights when a metric shows
- * some anomalous behavior.
- *
- * It shows both a metric line and a boundary band in a
- * time series chart, the boundary band shows the normal
- * range of values the metric should take.
- *
- * This component accepts 3 metrics, which contain the
- * "metric", "upper" limit and "lower" limit.
- *
- * The upper and lower series are "stacked areas" visually
- * to create the boundary band, and if any "metric" value
- * is outside this band, it is highlighted to warn users.
- *
- * The boundary band stack must be painted above the 0 line
- * so the area is shown correctly. If any of the values of
- * the data are negative, the chart data is shifted to be
- * above 0 line.
- *
- * The data passed to the time series is will always be
- * positive, but reformatted to show the original values of
- * data.
- *
- */
-export default {
- components: {
- GlChartSeriesLabel,
- MonitorTimeSeriesChart,
- },
- inheritAttrs: false,
- props: {
- graphData: {
- type: Object,
- required: true,
- validator: graphDataValidatorForAnomalyValues,
- },
- },
- computed: {
- series() {
- return this.graphData.metrics.map((metric) => {
- const values = metric.result && metric.result[0] ? metric.result[0].values : [];
- return {
- label: metric.label,
- // NaN values may disrupt avg., max. & min. calculations in the legend, filter them out
- data: values.filter(([, value]) => !Number.isNaN(value)),
- };
- });
- },
- /**
- * If any of the values of the data is negative, the
- * chart data is shifted to the lowest value
- *
- * This offset is the lowest value.
- */
- yOffset() {
- const values = flattenDeep(this.series.map((ser) => ser.data.map(([, y]) => y)));
- const min = values.length ? Math.floor(Math.min(...values)) : 0;
- return min < 0 ? -min : 0;
- },
- metricData() {
- const originalMetricQuery = this.graphData.metrics[0];
-
- const metricQuery = produce(originalMetricQuery, (draftQuery) => {
- draftQuery.result[0].values = draftQuery.result[0].values.map(([x, y]) => [
- x,
- y + this.yOffset,
- ]);
- });
- return {
- ...this.graphData,
- type: panelTypes.LINE_CHART,
- metrics: [metricQuery],
- };
- },
- metricSeriesConfig() {
- return {
- type: 'line',
- symbol: 'circle',
- symbolSize: (val, params) => {
- if (this.isDatapointAnomaly(params.dataIndex)) {
- return symbolSizes.anomaly;
- }
- // 0 causes echarts to throw an error, use small number instead
- // see https://gitlab.com/gitlab-org/gitlab-ui/issues/423
- return 0.001;
- },
- showSymbol: true,
- itemStyle: {
- color: (params) => {
- if (this.isDatapointAnomaly(params.dataIndex)) {
- return colorValues.anomalySymbol;
- }
- return colorValues.primaryColor;
- },
- },
- };
- },
- chartOptions() {
- const [, upperSeries, lowerSeries] = this.series;
- const calcOffsetY = (data, offsetCallback) =>
- data.map((value, dataIndex) => {
- const [x, y] = value;
- return [x, y + offsetCallback(dataIndex)];
- });
-
- const yAxisWithOffset = {
- axisLabel: {
- formatter: (num) => roundOffFloat(num - this.yOffset, 3).toString(),
- },
- };
-
- /**
- * Boundary is rendered by 2 series: An invisible
- * series (opacity: 0) stacked on a visible one.
- *
- * Order is important, lower boundary is stacked
- * *below* the upper boundary.
- */
- const boundarySeries = [];
-
- if (upperSeries.data.length && lowerSeries.data.length) {
- // Lower boundary, plus the offset if negative values
- boundarySeries.push(
- this.makeBoundarySeries({
- name: this.formatLegendLabel(lowerSeries),
- data: calcOffsetY(lowerSeries.data, () => this.yOffset),
- }),
- );
- // Upper boundary, minus the lower boundary
- boundarySeries.push(
- this.makeBoundarySeries({
- name: this.formatLegendLabel(upperSeries),
- data: calcOffsetY(upperSeries.data, (i) => -this.yValue(LOWER, i)),
- areaStyle: {
- color: AREA_COLOR,
- opacity: AREA_OPACITY,
- },
- }),
- );
- }
-
- return { yAxis: yAxisWithOffset, series: boundarySeries };
- },
- },
- methods: {
- formatLegendLabel(query) {
- return query.label;
- },
- yValue(seriesIndex, dataIndex) {
- const d = this.series[seriesIndex].data[dataIndex];
- return d && d[1];
- },
- yValueFormatted(seriesIndex, dataIndex) {
- const y = this.yValue(seriesIndex, dataIndex);
- return isNumber(y) ? y.toFixed(3) : '';
- },
- isDatapointAnomaly(dataIndex) {
- const yVal = this.yValue(METRIC, dataIndex);
- const yUpper = this.yValue(UPPER, dataIndex);
- const yLower = this.yValue(LOWER, dataIndex);
- return (isNumber(yUpper) && yVal > yUpper) || (isNumber(yLower) && yVal < yLower);
- },
- makeBoundarySeries(series) {
- const stackKey = 'anomaly-boundary-series-stack';
- return {
- type: 'line',
- stack: stackKey,
- lineStyle: {
- width: 0,
- color: AREA_COLOR_RGBA, // legend color
- },
- color: AREA_COLOR_RGBA, // tooltip color
- symbol: 'none',
- ...series,
- };
- },
- },
-};
-</script>
-
-<template>
- <monitor-time-series-chart
- v-bind="$attrs"
- :graph-data="metricData"
- :option="chartOptions"
- :series-config="metricSeriesConfig"
- >
- <slot></slot>
- <template #tooltip-content="slotProps">
- <div
- v-for="(content, seriesIndex) in slotProps.tooltip.content"
- :key="seriesIndex"
- class="d-flex justify-content-between"
- >
- <gl-chart-series-label :color="content.color">
- {{ content.name }}
- </gl-chart-series-label>
- <div class="gl-ml-7">
- {{ yValueFormatted(seriesIndex, content.dataIndex) }}
- </div>
- </div>
- </template>
- </monitor-time-series-chart>
-</template>
diff --git a/app/assets/javascripts/monitoring/components/charts/bar.vue b/app/assets/javascripts/monitoring/components/charts/bar.vue
deleted file mode 100644
index df91bd078d1..00000000000
--- a/app/assets/javascripts/monitoring/components/charts/bar.vue
+++ /dev/null
@@ -1,87 +0,0 @@
-<script>
-import { GlBarChart } from '@gitlab/ui/dist/charts';
-import { getSvgIconPathContent } from '~/lib/utils/icon_utils';
-import { chartHeight } from '../../constants';
-import { barChartsDataParser, graphDataValidatorForValues } from '../../utils';
-
-export default {
- components: {
- GlBarChart,
- },
- props: {
- graphData: {
- type: Object,
- required: true,
- validator: graphDataValidatorForValues.bind(null, false),
- },
- },
- data() {
- return {
- width: 0,
- height: chartHeight,
- svgs: {},
- };
- },
- computed: {
- chartData() {
- return barChartsDataParser(this.graphData.metrics);
- },
- chartOptions() {
- return {
- dataZoom: [this.dataZoomConfig],
- };
- },
- xAxisTitle() {
- const { xLabel = '' } = this.graphData;
- return xLabel;
- },
- yAxisTitle() {
- const { y_label: yLabel = '' } = this.graphData;
- return yLabel;
- },
- xAxisType() {
- const { x_type: xType = 'value' } = this.graphData;
- return xType;
- },
- dataZoomConfig() {
- const handleIcon = this.svgs['scroll-handle'];
-
- return handleIcon ? { handleIcon } : {};
- },
- },
- created() {
- this.setSvg('scroll-handle');
- },
- methods: {
- formatLegendLabel(query) {
- return query.label;
- },
- setSvg(name) {
- getSvgIconPathContent(name)
- .then((path) => {
- if (path) {
- this.$set(this.svgs, name, `path://${path}`);
- }
- })
- .catch((e) => {
- // eslint-disable-next-line no-console, @gitlab/require-i18n-strings
- console.error('SVG could not be rendered correctly: ', e);
- });
- },
- },
-};
-</script>
-<template>
- <gl-bar-chart
- ref="barChart"
- v-bind="$attrs"
- :responsive="true"
- :data="chartData"
- :option="chartOptions"
- :width="width"
- :height="height"
- :x-axis-title="xAxisTitle"
- :y-axis-title="yAxisTitle"
- :x-axis-type="xAxisType"
- />
-</template>
diff --git a/app/assets/javascripts/monitoring/components/charts/column.vue b/app/assets/javascripts/monitoring/components/charts/column.vue
deleted file mode 100644
index e8f54b1fa34..00000000000
--- a/app/assets/javascripts/monitoring/components/charts/column.vue
+++ /dev/null
@@ -1,107 +0,0 @@
-<script>
-import { GlColumnChart } from '@gitlab/ui/dist/charts';
-import { makeDataSeries } from '~/helpers/monitor_helper';
-import { getSvgIconPathContent } from '~/lib/utils/icon_utils';
-import { chartHeight } from '../../constants';
-import { timezones } from '../../format_date';
-import { graphDataValidatorForValues } from '../../utils';
-import { getTimeAxisOptions, getYAxisOptions, getChartGrid } from './options';
-
-export default {
- components: {
- GlColumnChart,
- },
- props: {
- graphData: {
- type: Object,
- required: true,
- validator: graphDataValidatorForValues.bind(null, false),
- },
- timezone: {
- type: String,
- required: false,
- default: timezones.LOCAL,
- },
- },
- data() {
- return {
- width: 0,
- height: chartHeight,
- svgs: {},
- };
- },
- computed: {
- barChartData() {
- return this.graphData.metrics.reduce((acc, query) => {
- const series = makeDataSeries(query.result || [], {
- name: this.formatLegendLabel(query),
- });
-
- return acc.concat(series);
- }, []);
- },
- chartOptions() {
- const xAxis = getTimeAxisOptions({ timezone: this.timezone });
-
- const yAxis = {
- ...getYAxisOptions(this.graphData.yAxis),
- scale: false,
- };
-
- return {
- grid: getChartGrid(),
- xAxis,
- yAxis,
- dataZoom: [this.dataZoomConfig],
- };
- },
- xAxisTitle() {
- return this.graphData.metrics[0].result[0].x_label !== undefined
- ? this.graphData.metrics[0].result[0].x_label
- : '';
- },
- yAxisTitle() {
- return this.chartOptions.yAxis.name;
- },
- xAxisType() {
- return this.graphData.x_type !== undefined ? this.graphData.x_type : 'category';
- },
- dataZoomConfig() {
- const handleIcon = this.svgs['scroll-handle'];
-
- return handleIcon ? { handleIcon } : {};
- },
- },
- created() {
- this.setSvg('scroll-handle');
- },
- methods: {
- formatLegendLabel(query) {
- return query.label;
- },
- setSvg(name) {
- getSvgIconPathContent(name)
- .then((path) => {
- if (path) {
- this.$set(this.svgs, name, `path://${path}`);
- }
- })
- .catch(() => {});
- },
- },
-};
-</script>
-<template>
- <gl-column-chart
- ref="columnChart"
- v-bind="$attrs"
- :responsive="true"
- :bars="barChartData"
- :option="chartOptions"
- :width="width"
- :height="height"
- :x-axis-title="xAxisTitle"
- :y-axis-title="yAxisTitle"
- :x-axis-type="xAxisType"
- />
-</template>
diff --git a/app/assets/javascripts/monitoring/components/charts/empty_chart.vue b/app/assets/javascripts/monitoring/components/charts/empty_chart.vue
deleted file mode 100644
index 6419c45c20c..00000000000
--- a/app/assets/javascripts/monitoring/components/charts/empty_chart.vue
+++ /dev/null
@@ -1,37 +0,0 @@
-<script>
-import chartEmptyStateIllustration from '@gitlab/svgs/dist/illustrations/chart-empty-state.svg?raw';
-import SafeHtml from '~/vue_shared/directives/safe_html';
-import { chartHeight } from '../../constants';
-
-export default {
- directives: {
- SafeHtml,
- },
- data() {
- return {
- height: chartHeight,
- };
- },
- computed: {
- svgContainerStyle() {
- return {
- height: `${this.height}px`,
- };
- },
- },
- created() {
- this.chartEmptyStateIllustration = chartEmptyStateIllustration;
- },
- safeHtmlConfig: { ADD_TAGS: ['use'] },
-};
-</script>
-<template>
- <div class="d-flex flex-column justify-content-center">
- <div
- v-safe-html:[$options.safeHtmlConfig]="chartEmptyStateIllustration"
- class="gl-mt-3 svg-w-100 d-flex align-items-center"
- :style="svgContainerStyle"
- ></div>
- <h5 class="text-center gl-mt-3">{{ __('No data to display') }}</h5>
- </div>
-</template>
diff --git a/app/assets/javascripts/monitoring/components/charts/gauge.vue b/app/assets/javascripts/monitoring/components/charts/gauge.vue
deleted file mode 100644
index 0477ff19ffe..00000000000
--- a/app/assets/javascripts/monitoring/components/charts/gauge.vue
+++ /dev/null
@@ -1,110 +0,0 @@
-<script>
-import { GlGaugeChart } from '@gitlab/ui/dist/charts';
-import { isFinite, isArray, isInteger } from 'lodash';
-import { getFormatter, SUPPORTED_FORMATS } from '~/lib/utils/unit_format';
-import { graphDataValidatorForValues } from '../../utils';
-import { getValidThresholds } from './options';
-
-export default {
- components: {
- GlGaugeChart,
- },
- props: {
- graphData: {
- type: Object,
- required: true,
- validator: graphDataValidatorForValues.bind(null, true),
- },
- },
- data() {
- return {
- width: 0,
- };
- },
- computed: {
- rangeValues() {
- let min = 0;
- let max = 100;
-
- const { minValue, maxValue } = this.graphData;
-
- const isValidMinMax = () => {
- return isFinite(minValue) && isFinite(maxValue) && minValue < maxValue;
- };
-
- if (isValidMinMax()) {
- min = minValue;
- max = maxValue;
- }
-
- return {
- min,
- max,
- };
- },
- validThresholds() {
- const { mode, values } = this.graphData?.thresholds || {};
- const range = this.rangeValues;
-
- if (!isArray(values)) {
- return [];
- }
-
- return getValidThresholds({ mode, range, values });
- },
- queryResult() {
- return this.graphData?.metrics[0]?.result[0]?.value[1];
- },
- splitValue() {
- const { split } = this.graphData;
- const defaultValue = 10;
-
- return isInteger(split) && split > 0 ? split : defaultValue;
- },
- textValue() {
- const formatFromPanel = this.graphData.format;
- const defaultFormat = SUPPORTED_FORMATS.engineering;
- const format = SUPPORTED_FORMATS[formatFromPanel] ?? defaultFormat;
- const { queryResult } = this;
-
- const formatter = getFormatter(format);
-
- return isFinite(queryResult) ? formatter(queryResult) : '--';
- },
- thresholdsValue() {
- /**
- * If there are no valid thresholds, a default threshold
- * will be set at 90% of the gauge arcs' max value
- */
- const { min, max } = this.rangeValues;
-
- const defaultThresholdValue = [(max - min) * 0.95];
- return this.validThresholds.length ? this.validThresholds : defaultThresholdValue;
- },
- value() {
- /**
- * The gauge chart gitlab-ui component expects a value
- * of type number.
- *
- * So, if the query result is undefined,
- * we pass the gauge chart a value of NaN.
- */
- return this.queryResult || NaN;
- },
- },
-};
-</script>
-<template>
- <gl-gauge-chart
- ref="gaugeChart"
- v-bind="$attrs"
- :responsive="true"
- :value="value"
- :min="rangeValues.min"
- :max="rangeValues.max"
- :thresholds="thresholdsValue"
- :text="textValue"
- :split-number="splitValue"
- :width="width"
- />
-</template>
diff --git a/app/assets/javascripts/monitoring/components/charts/heatmap.vue b/app/assets/javascripts/monitoring/components/charts/heatmap.vue
deleted file mode 100644
index 12add274a90..00000000000
--- a/app/assets/javascripts/monitoring/components/charts/heatmap.vue
+++ /dev/null
@@ -1,74 +0,0 @@
-<script>
-import { GlHeatmap } from '@gitlab/ui/dist/charts';
-import { formatDate, timezones, formats } from '../../format_date';
-import { graphDataValidatorForValues } from '../../utils';
-
-export default {
- components: {
- GlHeatmap,
- },
- props: {
- graphData: {
- type: Object,
- required: true,
- validator: graphDataValidatorForValues.bind(null, false),
- },
- timezone: {
- type: String,
- required: false,
- default: timezones.LOCAL,
- },
- },
- data() {
- return {
- width: 0,
- };
- },
- computed: {
- chartData() {
- return this.metrics.result.reduce(
- (acc, result, i) => [...acc, ...result.values.map((value, j) => [i, j, value[1]])],
- [],
- );
- },
- xAxisName() {
- return this.graphData.xLabel || '';
- },
- yAxisName() {
- return this.graphData.y_label || '';
- },
- xAxisLabels() {
- return this.metrics.result.map((res) => Object.values(res.metric)[0]);
- },
- yAxisLabels() {
- return this.result.values.map((val) => {
- const [yLabel] = val;
-
- return formatDate(new Date(yLabel), {
- format: formats.shortTime,
- timezone: this.timezone,
- });
- });
- },
- result() {
- return this.metrics.result[0];
- },
- metrics() {
- return this.graphData.metrics[0];
- },
- },
-};
-</script>
-<template>
- <gl-heatmap
- ref="heatmapChart"
- v-bind="$attrs"
- :responsive="true"
- :data-series="chartData"
- :x-axis-name="xAxisName"
- :y-axis-name="yAxisName"
- :x-axis-labels="xAxisLabels"
- :y-axis-labels="yAxisLabels"
- :width="width"
- />
-</template>
diff --git a/app/assets/javascripts/monitoring/components/charts/options.js b/app/assets/javascripts/monitoring/components/charts/options.js
deleted file mode 100644
index 643550a7144..00000000000
--- a/app/assets/javascripts/monitoring/components/charts/options.js
+++ /dev/null
@@ -1,175 +0,0 @@
-import { isFinite, uniq, sortBy, includes } from 'lodash';
-import { SUPPORTED_FORMATS, getFormatter } from '~/lib/utils/unit_format';
-import { __, s__ } from '~/locale';
-import { thresholdModeTypes } from '../../constants';
-import { formatDate, timezones, formats } from '../../format_date';
-
-const yAxisBoundaryGap = [0.1, 0.1];
-/**
- * Max string length of formatted axis tick
- */
-const maxDataAxisTickLength = 8;
-// Defaults
-const defaultFormat = SUPPORTED_FORMATS.engineering;
-
-const defaultYAxisFormat = defaultFormat;
-const defaultYAxisPrecision = 2;
-
-const defaultTooltipFormat = defaultFormat;
-const defaultTooltipPrecision = 3;
-
-// Give enough space for y-axis with units and name.
-const chartGridLeft = 63; // larger gap than gitlab-ui's default to fit formatted numbers
-const chartGridRight = 10; // half of the scroll-handle icon for data zoom
-const yAxisNameGap = chartGridLeft - 12; // offset the axis label line-height
-
-// Axis options
-
-/**
- * Axis types
- * @see https://echarts.apache.org/en/option.html#xAxis.type
- */
-export const axisTypes = {
- /**
- * Category axis, suitable for discrete category data.
- */
- category: 'category',
- /**
- * Time axis, suitable for continuous time series data.
- */
- time: 'time',
-};
-
-/**
- * Converts .yml parameters to echarts axis options for data axis
- * @param {Object} param - Dashboard .yml definition options
- */
-const getDataAxisOptions = ({ format, precision, name }) => {
- const formatter = getFormatter(format); // default to engineeringNotation, same as gitlab-ui
- return {
- name,
- nameLocation: 'center', // same as gitlab-ui's default
- scale: true,
- axisLabel: {
- formatter: (val) => formatter(val, precision, maxDataAxisTickLength),
- },
- };
-};
-
-/**
- * Converts .yml parameters to echarts y-axis options
- * @param {Object} param - Dashboard .yml definition options
- */
-export const getYAxisOptions = ({
- name = s__('Metrics|Values'),
- format = defaultYAxisFormat,
- precision = defaultYAxisPrecision,
-} = {}) => {
- return {
- nameGap: yAxisNameGap,
- scale: true,
- boundaryGap: yAxisBoundaryGap,
-
- ...getDataAxisOptions({
- name,
- format,
- precision,
- }),
- };
-};
-
-export const getTimeAxisOptions = ({
- timezone = timezones.LOCAL,
- format = formats.shortDateTime,
-} = {}) => ({
- name: __('Time'),
- type: axisTypes.time,
- axisLabel: {
- formatter: (date) => formatDate(date, { format, timezone }),
- },
- axisPointer: {
- snap: false,
- },
-});
-
-// Chart grid
-
-/**
- * Grid with enough room to display chart.
- */
-export const getChartGrid = ({ left = chartGridLeft, right = chartGridRight } = {}) => ({
- left,
- right,
-});
-
-// Tooltip options
-
-export const getTooltipFormatter = ({
- format = defaultTooltipFormat,
- precision = defaultTooltipPrecision,
-} = {}) => {
- const formatter = getFormatter(format);
- return (num) => formatter(num, precision);
-};
-
-// Thresholds
-
-/**
- *
- * Used to find valid thresholds for the gauge chart
- *
- * An array of thresholds values is
- * - duplicate values are removed;
- * - filtered for invalid values;
- * - sorted in ascending order;
- * - only first two values are used.
- */
-export const getValidThresholds = ({ mode, range = {}, values = [] } = {}) => {
- const supportedModes = [thresholdModeTypes.ABSOLUTE, thresholdModeTypes.PERCENTAGE];
- const { min, max } = range;
-
- /**
- * return early if min and max have invalid values
- * or mode has invalid value
- */
- if (!isFinite(min) || !isFinite(max) || min >= max || !includes(supportedModes, mode)) {
- return [];
- }
-
- const uniqueThresholds = uniq(values);
-
- const numberThresholds = uniqueThresholds.filter((threshold) => isFinite(threshold));
-
- const validThresholds = numberThresholds.filter((threshold) => {
- let isValid;
-
- if (mode === thresholdModeTypes.PERCENTAGE) {
- isValid = threshold > 0 && threshold < 100;
- } else if (mode === thresholdModeTypes.ABSOLUTE) {
- isValid = threshold > min && threshold < max;
- }
-
- return isValid;
- });
-
- const transformedThresholds = validThresholds.map((threshold) => {
- let transformedThreshold;
-
- if (mode === 'percentage') {
- transformedThreshold = (threshold / 100) * (max - min);
- } else {
- transformedThreshold = threshold;
- }
-
- return transformedThreshold;
- });
-
- const sortedThresholds = sortBy(transformedThresholds);
-
- const reducedThresholdsArray =
- sortedThresholds.length > 2
- ? [sortedThresholds[0], sortedThresholds[1]]
- : [...sortedThresholds];
-
- return reducedThresholdsArray;
-};
diff --git a/app/assets/javascripts/monitoring/components/charts/single_stat.vue b/app/assets/javascripts/monitoring/components/charts/single_stat.vue
deleted file mode 100644
index 6d6a7af600b..00000000000
--- a/app/assets/javascripts/monitoring/components/charts/single_stat.vue
+++ /dev/null
@@ -1,71 +0,0 @@
-<script>
-import { GlSingleStat } from '@gitlab/ui/dist/charts';
-import { SUPPORTED_FORMATS, getFormatter } from '~/lib/utils/unit_format';
-import { __ } from '~/locale';
-import { graphDataValidatorForValues } from '../../utils';
-
-const defaultPrecision = 2;
-const emptyStateMsg = __('No data to display');
-
-export default {
- components: {
- GlSingleStat,
- },
- inheritAttrs: false,
- props: {
- graphData: {
- type: Object,
- required: true,
- validator: graphDataValidatorForValues.bind(null, true),
- },
- },
- computed: {
- queryInfo() {
- return this.graphData.metrics[0];
- },
- queryMetric() {
- return this.queryInfo.result[0]?.metric;
- },
- queryResult() {
- return this.queryInfo.result[0]?.value[1];
- },
- /**
- * This method formats the query result from a promQL expression
- * allowing a user to format the data in percentile values
- * by using the `maxValue` inner property from the graphData prop
- * @returns {(String)}
- */
- statValue() {
- let formatter;
-
- // if field is present the metric value is not displayed. Hence
- // the early exit without formatting.
- if (this.graphData?.field) {
- return this.queryMetric?.[this.graphData.field] ?? emptyStateMsg;
- }
-
- if (this.graphData?.maxValue) {
- formatter = getFormatter(SUPPORTED_FORMATS.number);
- return formatter(
- (this.queryResult / Number(this.graphData.maxValue)) * 100,
- defaultPrecision,
- );
- }
-
- formatter = getFormatter(SUPPORTED_FORMATS.number);
- return `${formatter(this.queryResult, defaultPrecision)}`;
- },
- unit() {
- return this.graphData?.maxValue ? '%' : this.queryInfo.unit;
- },
- graphTitle() {
- return this.queryInfo.label;
- },
- },
-};
-</script>
-<template>
- <div>
- <gl-single-stat :value="statValue" :title="graphTitle" :unit="unit" variant="success" />
- </div>
-</template>
diff --git a/app/assets/javascripts/monitoring/components/charts/stacked_column.vue b/app/assets/javascripts/monitoring/components/charts/stacked_column.vue
deleted file mode 100644
index 0cf39448d6b..00000000000
--- a/app/assets/javascripts/monitoring/components/charts/stacked_column.vue
+++ /dev/null
@@ -1,146 +0,0 @@
-<script>
-import { GlStackedColumnChart } from '@gitlab/ui/dist/charts';
-import { getSvgIconPathContent } from '~/lib/utils/icon_utils';
-import { s__ } from '~/locale';
-import { chartHeight, legendLayoutTypes } from '../../constants';
-import { formats, timezones } from '../../format_date';
-import { graphDataValidatorForValues } from '../../utils';
-import { getTimeAxisOptions, axisTypes } from './options';
-
-export default {
- components: {
- GlStackedColumnChart,
- },
- props: {
- graphData: {
- type: Object,
- required: true,
- validator: graphDataValidatorForValues.bind(null, false),
- },
- timezone: {
- type: String,
- required: false,
- default: timezones.LOCAL,
- },
- legendLayout: {
- type: String,
- required: false,
- default: legendLayoutTypes.table,
- },
- legendAverageText: {
- type: String,
- required: false,
- default: s__('Metrics|Avg'),
- },
- legendCurrentText: {
- type: String,
- required: false,
- default: s__('Metrics|Current'),
- },
- legendMaxText: {
- type: String,
- required: false,
- default: s__('Metrics|Max'),
- },
- legendMinText: {
- type: String,
- required: false,
- default: s__('Metrics|Min'),
- },
- },
- data() {
- return {
- width: 0,
- height: chartHeight,
- svgs: {},
- };
- },
- computed: {
- chartData() {
- return this.graphData.metrics
- .map(({ label: name, result }) => {
- // This needs a fix. Not only metrics[0] should be shown.
- // See https://gitlab.com/gitlab-org/gitlab/-/issues/220492
- if (!result || result.length === 0) {
- return [];
- }
- return { name, data: result[0].values.map((val) => val[1]) };
- })
- .slice(0, 1);
- },
- xAxisTitle() {
- return this.graphData.x_label !== undefined ? this.graphData.x_label : '';
- },
- yAxisTitle() {
- return this.graphData.y_label !== undefined ? this.graphData.y_label : '';
- },
- xAxisType() {
- // stacked-column component requires the x-axis to be of type `category`
- return axisTypes.category;
- },
- groupBy() {
- // This needs a fix. Not only metrics[0] should be shown.
- // See https://gitlab.com/gitlab-org/gitlab/-/issues/220492
- const { result } = this.graphData.metrics[0];
- if (!result || result.length === 0) {
- return [];
- }
- return result[0].values.map((val) => val[0]);
- },
- dataZoomConfig() {
- const handleIcon = this.svgs['scroll-handle'];
-
- return handleIcon ? { handleIcon } : {};
- },
- chartOptions() {
- return {
- xAxis: {
- ...getTimeAxisOptions({ timezone: this.timezone, format: formats.shortTime }),
- type: this.xAxisType,
- },
- dataZoom: [this.dataZoomConfig],
- };
- },
- seriesNames() {
- return this.graphData.metrics.map((metric) => metric.label);
- },
- },
- created() {
- this.setSvg('scroll-handle');
- },
- methods: {
- setSvg(name) {
- getSvgIconPathContent(name)
- .then((path) => {
- if (path) {
- this.$set(this.svgs, name, `path://${path}`);
- }
- })
- .catch((e) => {
- // eslint-disable-next-line no-console, @gitlab/require-i18n-strings
- console.error('SVG could not be rendered correctly: ', e);
- });
- },
- },
-};
-</script>
-<template>
- <gl-stacked-column-chart
- ref="chart"
- v-bind="$attrs"
- :responsive="true"
- :bars="chartData"
- :option="chartOptions"
- :x-axis-title="xAxisTitle"
- :y-axis-title="yAxisTitle"
- :x-axis-type="xAxisType"
- :group-by="groupBy"
- :width="width"
- :height="height"
- :legend-layout="legendLayout"
- :legend-average-text="legendAverageText"
- :legend-current-text="legendCurrentText"
- :legend-max-text="legendMaxText"
- :legend-min-text="legendMinText"
- />
-</template>
diff --git a/app/assets/javascripts/monitoring/components/charts/time_series.vue b/app/assets/javascripts/monitoring/components/charts/time_series.vue
deleted file mode 100644
index b74da3ee89b..00000000000
--- a/app/assets/javascripts/monitoring/components/charts/time_series.vue
+++ /dev/null
@@ -1,420 +0,0 @@
-<script>
-import { GlLink, GlTooltip, GlIcon } from '@gitlab/ui';
-import { GlAreaChart, GlLineChart, GlChartSeriesLabel } from '@gitlab/ui/dist/charts';
-import { isEmpty, omit, throttle } from 'lodash';
-import { makeDataSeries } from '~/helpers/monitor_helper';
-import { getSvgIconPathContent } from '~/lib/utils/icon_utils';
-import { s__ } from '~/locale';
-import { panelTypes, chartHeight, lineTypes, lineWidths, legendLayoutTypes } from '../../constants';
-import { formatDate, timezones } from '../../format_date';
-import { graphDataValidatorForValues } from '../../utils';
-import { annotationsYAxis, generateAnnotationsSeries } from './annotations';
-import { getYAxisOptions, getTimeAxisOptions, getChartGrid, getTooltipFormatter } from './options';
-
-export const timestampToISODate = (timestamp) => new Date(timestamp).toISOString();
-
-const THROTTLED_DATAZOOM_WAIT = 1000; // milliseconds
-
-const events = {
- datazoom: 'datazoom',
-};
-
-export default {
- components: {
- GlAreaChart,
- GlLineChart,
- GlTooltip,
- GlChartSeriesLabel,
- GlLink,
- GlIcon,
- },
- inheritAttrs: false,
- props: {
- graphData: {
- type: Object,
- required: true,
- validator: graphDataValidatorForValues.bind(null, false),
- },
- option: {
- type: Object,
- required: false,
- default: () => ({}),
- },
- timeRange: {
- type: Object,
- required: false,
- default: () => ({}),
- },
- seriesConfig: {
- type: Object,
- required: false,
- default: () => ({}),
- },
- deploymentData: {
- type: Array,
- required: false,
- default: () => [],
- },
- annotations: {
- type: Array,
- required: false,
- default: () => [],
- },
- projectPath: {
- type: String,
- required: false,
- default: '',
- },
- height: {
- type: Number,
- required: false,
- default: chartHeight,
- },
- legendLayout: {
- type: String,
- required: false,
- default: legendLayoutTypes.table,
- },
- legendAverageText: {
- type: String,
- required: false,
- default: s__('Metrics|Avg'),
- },
- legendCurrentText: {
- type: String,
- required: false,
- default: s__('Metrics|Current'),
- },
- legendMaxText: {
- type: String,
- required: false,
- default: s__('Metrics|Max'),
- },
- legendMinText: {
- type: String,
- required: false,
- default: s__('Metrics|Min'),
- },
- groupId: {
- type: String,
- required: false,
- default: '',
- },
- timezone: {
- type: String,
- required: false,
- default: timezones.LOCAL,
- },
- },
- data() {
- return {
- tooltip: {
- type: '',
- title: '',
- content: [],
- commitUrl: '',
- sha: '',
- },
- width: 0,
- svgs: {},
- primaryColor: null,
- throttledDatazoom: null,
- };
- },
- computed: {
- chartData() {
- // Transforms & supplements query data to render appropriate labels & styles
- // Input: [{ queryAttributes1 }, { queryAttributes2 }]
- // Output: [{ seriesAttributes1 }, { seriesAttributes2 }]
- return this.graphData.metrics.reduce((acc, query) => {
- const { appearance } = query;
- const lineType =
- appearance && appearance.line && appearance.line.type
- ? appearance.line.type
- : lineTypes.default;
- const lineWidth =
- appearance && appearance.line && appearance.line.width
- ? appearance.line.width
- : lineWidths.default;
- const areaStyle = {
- opacity:
- appearance && appearance.area && typeof appearance.area.opacity === 'number'
- ? appearance.area.opacity
- : undefined,
- };
- const series = makeDataSeries(query.result || [], {
- name: this.formatLegendLabel(query),
- lineStyle: {
- type: lineType,
- width: lineWidth,
- },
- showSymbol: false,
- areaStyle: this.graphData.type === 'area-chart' ? areaStyle : undefined,
- ...this.seriesConfig,
- });
-
- return acc.concat(series);
- }, []);
- },
- chartOptionSeries() {
- // After https://gitlab.com/gitlab-org/gitlab/-/issues/211330 is implemented,
- // this method will have access to annotations data
- return (this.option.series || []).concat(
- generateAnnotationsSeries({
- deployments: this.recentDeployments,
- annotations: this.annotations,
- }),
- );
- },
- chartOptions() {
- const { yAxis, xAxis } = this.option;
- const option = omit(this.option, ['series', 'yAxis', 'xAxis']);
- const xAxisBounds = isEmpty(this.timeRange)
- ? {}
- : {
- min: this.timeRange.start,
- max: this.timeRange.end,
- };
-
- const timeXAxis = {
- ...getTimeAxisOptions({ timezone: this.timezone }),
- ...xAxis,
- ...xAxisBounds,
- };
-
- const dataYAxis = {
- ...getYAxisOptions(this.graphData.yAxis),
- ...yAxis,
- };
-
- return {
- series: this.chartOptionSeries,
- xAxis: timeXAxis,
- yAxis: [dataYAxis, annotationsYAxis],
- grid: getChartGrid(),
- dataZoom: [this.dataZoomConfig],
- ...option,
- };
- },
- dataZoomConfig() {
- const handleIcon = this.svgs['scroll-handle'];
-
- return handleIcon ? { handleIcon } : {};
- },
- /**
- * This method returns the earliest time value in all series of a chart.
- * Takes a chart data with data to populate a timeseries.
- * data should be an array of data points [t, y] where t is a ISO formatted date,
- * and is sorted by t (time).
- * @returns {(String|null)} earliest x value from all series, or null when the
- * chart series data is empty.
- */
- earliestDatapoint() {
- return this.chartData.reduce((acc, series) => {
- const { data } = series;
- const { length } = data;
- if (!length) {
- return acc;
- }
-
- const [first] = data[0];
- const [last] = data[length - 1];
- const seriesEarliest = first < last ? first : last;
-
- return seriesEarliest < acc || acc === null ? seriesEarliest : acc;
- }, null);
- },
- glChartComponent() {
- const chartTypes = {
- [panelTypes.AREA_CHART]: GlAreaChart,
- [panelTypes.LINE_CHART]: GlLineChart,
- };
- return chartTypes[this.graphData.type] || GlAreaChart;
- },
- isMultiSeries() {
- return this.tooltip.content.length > 1;
- },
- recentDeployments() {
- return this.deploymentData.reduce((acc, deployment) => {
- if (deployment.created_at >= this.earliestDatapoint) {
- const { id, created_at: createdAt, sha, ref, tag } = deployment;
- acc.push({
- id,
- createdAt,
- sha,
- commitUrl: `${this.projectPath}/-/commit/${sha}`,
- tag,
- tagUrl: tag ? `${this.tagsPath}/${ref.name}` : null,
- ref: ref.name,
- showDeploymentFlag: false,
- icon: this.svgs.rocket,
- color: this.primaryColor,
- });
- }
-
- return acc;
- }, []);
- },
- tooltipYFormatter() {
- // Use same format as y-axis
- return getTooltipFormatter({ format: this.graphData.yAxis?.format });
- },
- },
- created() {
- this.setSvg('rocket');
- this.setSvg('scroll-handle');
- },
- destroyed() {
- if (this.throttledDatazoom) {
- this.throttledDatazoom.cancel();
- }
- },
- methods: {
- formatLegendLabel(query) {
- return query.label;
- },
- isTooltipOfType(tooltipType, defaultType) {
- return tooltipType === defaultType;
- },
- /**
- * This method is triggered when hovered over a single markPoint.
- *
- * The annotations title timestamp should match the data tooltip
- * title.
- *
- * @params {Object} params markPoint object
- * @returns {Object}
- */
- formatAnnotationsTooltipText(params) {
- return {
- title: formatDate(params.data?.tooltipData?.title, { timezone: this.timezone }),
- content: params.data?.tooltipData?.content,
- };
- },
- formatTooltipText(params) {
- this.tooltip.title = formatDate(params.value, { timezone: this.timezone });
-
- this.tooltip.content = [];
-
- params.seriesData.forEach((dataPoint) => {
- if (dataPoint.value) {
- const [, yVal] = dataPoint.value;
- this.tooltip.type = dataPoint.name;
- if (this.tooltip.type === 'deployments') {
- const { data = {} } = dataPoint;
- this.tooltip.sha = data?.tooltipData?.sha;
- this.tooltip.commitUrl = data?.tooltipData?.commitUrl;
- } else {
- const { seriesName, color, dataIndex } = dataPoint;
-
- this.tooltip.content.push({
- name: seriesName,
- dataIndex,
- value: this.tooltipYFormatter(yVal),
- color,
- });
- }
- }
- });
- },
- setSvg(name) {
- getSvgIconPathContent(name)
- .then((path) => {
- if (path) {
- this.$set(this.svgs, name, `path://${path}`);
- }
- })
- .catch((e) => {
- // eslint-disable-next-line no-console, @gitlab/require-i18n-strings
- console.error('SVG could not be rendered correctly: ', e);
- });
- },
- onChartUpdated(eChart) {
- [this.primaryColor] = eChart.getOption().color;
- },
- onChartCreated(eChart) {
- // Emit a datazoom event that corresponds to the eChart
- // `datazoom` event.
-
- if (this.throttledDatazoom) {
- // Chart can be created multiple times in this component's
- // lifetime, remove previous handlers every time
- // chart is created.
- this.throttledDatazoom.cancel();
- }
-
- // Emitting is throttled to avoid flurries of calls when
- // the user changes or scrolls the zoom bar.
- this.throttledDatazoom = throttle(
- () => {
- const { startValue, endValue } = eChart.getOption().dataZoom[0];
- this.$emit(events.datazoom, {
- start: timestampToISODate(startValue),
- end: timestampToISODate(endValue),
- });
- },
- THROTTLED_DATAZOOM_WAIT,
- {
- leading: false,
- },
- );
-
- // eslint-disable-next-line @gitlab/no-global-event-off
- eChart.off('datazoom');
- eChart.on('datazoom', this.throttledDatazoom);
- },
- },
-};
-</script>
-
-<template>
- <component
- :is="glChartComponent"
- ref="chart"
- v-bind="$attrs"
- :responsive="true"
- :group-id="groupId"
- :data="chartData"
- :option="chartOptions"
- :format-tooltip-text="formatTooltipText"
- :format-annotations-tooltip-text="formatAnnotationsTooltipText"
- :width="width"
- :height="height"
- :legend-layout="legendLayout"
- :legend-average-text="legendAverageText"
- :legend-current-text="legendCurrentText"
- :legend-max-text="legendMaxText"
- :legend-min-text="legendMinText"
- @created="onChartCreated"
- @updated="onChartUpdated"
- >
- <template #tooltip-title>
- <template v-if="tooltip.type === 'deployments'">
- {{ __('Deployed') }}
- </template>
- <div v-else class="text-nowrap">
- {{ tooltip.title }}
- </div>
- </template>
- <template #tooltip-content>
- <div v-if="tooltip.type === 'deployments'" class="d-flex align-items-center">
- <gl-icon name="commit" class="mr-2" />
- <gl-link :href="tooltip.commitUrl">{{ tooltip.sha }}</gl-link>
- </div>
- <template v-else>
- <div
- v-for="(content, key) in tooltip.content"
- :key="key"
- class="d-flex justify-content-between"
- >
- <gl-chart-series-label :color="isMultiSeries ? content.color : ''">
- {{ content.name }}
- </gl-chart-series-label>
- <div class="gl-ml-7">
- {{ content.value }}
- </div>
- </div>
- </template>
- </template>
- </component>
-</template>
diff --git a/app/assets/javascripts/monitoring/components/create_dashboard_modal.vue b/app/assets/javascripts/monitoring/components/create_dashboard_modal.vue
deleted file mode 100644
index 10178366db5..00000000000
--- a/app/assets/javascripts/monitoring/components/create_dashboard_modal.vue
+++ /dev/null
@@ -1,66 +0,0 @@
-<script>
-import { GlButton, GlModal, GlSprintf } from '@gitlab/ui';
-import { isSafeURL } from '~/lib/utils/url_utility';
-import { s__ } from '~/locale';
-
-export default {
- components: { GlButton, GlModal, GlSprintf },
- props: {
- modalId: {
- type: String,
- required: true,
- },
- projectPath: {
- type: String,
- required: true,
- validator: isSafeURL,
- },
- addDashboardDocumentationPath: {
- type: String,
- required: true,
- },
- },
- methods: {
- cancelHandler() {
- this.$refs.modal.hide();
- },
- },
- i18n: {
- titleText: s__('Metrics|Create your dashboard configuration file'),
- mainText: s__(
- 'Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project.',
- ),
- },
-};
-</script>
-
-<template>
- <gl-modal ref="modal" :modal-id="modalId" :title="$options.i18n.titleText">
- <p>
- <gl-sprintf :message="$options.i18n.mainText">
- <template #code="{ content }">
- <code>{{ content }}</code>
- </template>
- </gl-sprintf>
- </p>
- <template #modal-footer>
- <gl-button category="secondary" @click="cancelHandler">{{ s__('Metrics|Cancel') }}</gl-button>
- <gl-button
- category="secondary"
- variant="confirm"
- target="_blank"
- :href="addDashboardDocumentationPath"
- data-testid="create-dashboard-modal-docs-button"
- >
- {{ s__('Metrics|View documentation') }}
- </gl-button>
- <gl-button
- variant="confirm"
- data-testid="create-dashboard-modal-repo-button"
- :href="projectPath"
- >
- {{ s__('Metrics|Open repository') }}
- </gl-button>
- </template>
- </gl-modal>
-</template>
diff --git a/app/assets/javascripts/monitoring/components/dashboard.vue b/app/assets/javascripts/monitoring/components/dashboard.vue
deleted file mode 100644
index cfc20b7b95f..00000000000
--- a/app/assets/javascripts/monitoring/components/dashboard.vue
+++ /dev/null
@@ -1,510 +0,0 @@
-<script>
-import {
- GlButton,
- GlModalDirective,
- GlTooltipDirective,
- GlIcon,
- GlAlert,
- GlSprintf,
- GlLink,
-} from '@gitlab/ui';
-import VueDraggable from 'vuedraggable';
-import { mapActions, mapState, mapGetters } from 'vuex';
-import { createAlert } from '~/alert';
-import invalidUrl from '~/lib/utils/invalid_url';
-import { ESC_KEY } from '~/lib/utils/keys';
-import { mergeUrlParams, updateHistory } from '~/lib/utils/url_utility';
-import { s__ } from '~/locale';
-import { defaultTimeRange } from '~/vue_shared/constants';
-import TrackEventDirective from '~/vue_shared/directives/track_event';
-import { metricStates } from '../constants';
-import {
- timeRangeFromUrl,
- panelToUrl,
- expandedPanelPayloadFromUrl,
- convertVariablesForURL,
-} from '../utils';
-import DashboardHeader from './dashboard_header.vue';
-import DashboardPanel from './dashboard_panel.vue';
-
-import EmptyState from './empty_state.vue';
-import GraphGroup from './graph_group.vue';
-import GroupEmptyState from './group_empty_state.vue';
-import LinksSection from './links_section.vue';
-import VariablesSection from './variables_section.vue';
-
-export default {
- components: {
- VueDraggable,
- DashboardHeader,
- DashboardPanel,
- GlIcon,
- GlButton,
- GraphGroup,
- EmptyState,
- GroupEmptyState,
- VariablesSection,
- LinksSection,
- GlAlert,
- GlSprintf,
- GlLink,
- },
- directives: {
- GlModal: GlModalDirective,
- GlTooltip: GlTooltipDirective,
- TrackEvent: TrackEventDirective,
- },
- props: {
- hasMetrics: {
- type: Boolean,
- required: false,
- default: true,
- },
- showHeader: {
- type: Boolean,
- required: false,
- default: true,
- },
- showPanels: {
- type: Boolean,
- required: false,
- default: true,
- },
- documentationPath: {
- type: String,
- required: true,
- },
- settingsPath: {
- type: String,
- required: true,
- },
- clustersPath: {
- type: String,
- required: true,
- },
- tagsPath: {
- type: String,
- required: true,
- },
- defaultBranch: {
- type: String,
- required: false,
- default: '',
- },
- emptyGettingStartedSvgPath: {
- type: String,
- required: true,
- },
- emptyLoadingSvgPath: {
- type: String,
- required: true,
- },
- emptyNoDataSvgPath: {
- type: String,
- required: true,
- },
- emptyNoDataSmallSvgPath: {
- type: String,
- required: true,
- },
- emptyUnableToConnectSvgPath: {
- type: String,
- required: true,
- },
- customMetricsAvailable: {
- type: Boolean,
- required: false,
- default: false,
- },
- customMetricsPath: {
- type: String,
- required: false,
- default: invalidUrl,
- },
- validateQueryPath: {
- type: String,
- required: false,
- default: invalidUrl,
- },
- smallEmptyState: {
- type: Boolean,
- required: false,
- default: false,
- },
- rearrangePanelsAvailable: {
- type: Boolean,
- required: false,
- default: false,
- },
- },
- data() {
- return {
- selectedTimeRange: timeRangeFromUrl() || defaultTimeRange,
- isRearrangingPanels: false,
- originalDocumentTitle: document.title,
- hoveredPanel: '',
- isDeprecationNoticeDismissed: false,
- };
- },
- computed: {
- ...mapState('monitoringDashboard', [
- 'dashboard',
- 'emptyState',
- 'expandedPanel',
- 'variables',
- 'links',
- 'currentDashboard',
- 'hasDashboardValidationWarnings',
- ]),
- ...mapGetters('monitoringDashboard', ['selectedDashboard', 'getMetricStates']),
- shouldShowEmptyState() {
- return Boolean(this.emptyState);
- },
- shouldShowVariablesSection() {
- return Boolean(this.variables.length);
- },
- shouldShowLinksSection() {
- return Object.keys(this.links).length > 0;
- },
- },
- watch: {
- dashboard(newDashboard) {
- try {
- const expandedPanel = expandedPanelPayloadFromUrl(newDashboard);
- if (expandedPanel) {
- this.setExpandedPanel(expandedPanel);
- }
- } catch {
- createAlert({
- message: s__(
- 'Metrics|Link contains invalid chart information, please verify the link to see the expanded panel.',
- ),
- });
- }
- },
- expandedPanel: {
- handler({ group, panel }) {
- const dashboardPath = this.currentDashboard || this.selectedDashboard?.path;
- updateHistory({
- url: panelToUrl(dashboardPath, convertVariablesForURL(this.variables), group, panel),
- title: document.title,
- });
- },
- deep: true,
- },
- selectedDashboard(dashboard) {
- this.prependToDocumentTitle(dashboard?.display_name);
- },
- hasDashboardValidationWarnings(hasWarnings) {
- /**
- * This watcher is set for future SPA behaviour of the dashboard
- */
- if (hasWarnings) {
- createAlert({
- message: s__(
- 'Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema.',
- ),
-
- type: 'warning',
- });
- }
- },
- },
- mounted() {
- if (!this.hasMetrics) {
- this.setGettingStartedEmptyState();
- } else {
- this.setTimeRange(this.selectedTimeRange);
- this.fetchData();
- }
- },
- methods: {
- ...mapActions('monitoringDashboard', [
- 'setTimeRange',
- 'fetchData',
- 'setGettingStartedEmptyState',
- 'setPanelGroupMetrics',
- 'setExpandedPanel',
- 'clearExpandedPanel',
- ]),
- updatePanels(key, panels) {
- this.setPanelGroupMetrics({
- panels,
- key,
- });
- },
- removePanel(key, panels, graphIndex) {
- this.setPanelGroupMetrics({
- panels: panels.filter((v, i) => i !== graphIndex),
- key,
- });
- },
- generatePanelUrl(groupKey, panel) {
- const dashboardPath = this.currentDashboard || this.selectedDashboard?.path;
- return panelToUrl(dashboardPath, convertVariablesForURL(this.variables), groupKey, panel);
- },
- /**
- * Return a single empty state for a group.
- *
- * If all states are the same a single state is returned to be displayed
- * Except if the state is OK, in which case the group is displayed.
- *
- * @param {String} groupKey - Identifier for group
- * @returns {String} state code from `metricStates`
- */
- groupSingleEmptyState(groupKey) {
- const states = this.getMetricStates(groupKey);
- if (states.length === 1 && states[0] !== metricStates.OK) {
- return states[0];
- }
- return null;
- },
- /**
- * Return true if the entire group is loading.
- * @param {String} groupKey - Identifier for group
- * @returns {boolean}
- */
- isGroupLoading(groupKey) {
- return this.groupSingleEmptyState(groupKey) === metricStates.LOADING;
- },
- /**
- * A group should be not collapsed if any metric is loaded (OK)
- *
- * @param {String} groupKey - Identifier for group
- * @returns {Boolean} If the group should be collapsed
- */
- collapseGroup(groupKey) {
- // Collapse group if no data is available
- return !this.getMetricStates(groupKey).includes(metricStates.OK);
- },
- prependToDocumentTitle(text) {
- if (text) {
- document.title = `${text} · ${this.originalDocumentTitle}`;
- }
- },
- onTimeRangeZoom({ start, end }) {
- updateHistory({
- url: mergeUrlParams({ start, end }, window.location.href),
- title: document.title,
- });
- this.selectedTimeRange = { start, end };
- // keep the current dashboard time range
- // in sync with the Vuex store
- this.setTimeRange(this.selectedTimeRange);
- },
- onExpandPanel(group, panel) {
- this.setExpandedPanel({ group, panel });
- },
- onGoBack() {
- this.clearExpandedPanel();
- },
- onKeyup(event) {
- const { key } = event;
- if (key === ESC_KEY) {
- this.clearExpandedPanel();
- }
- },
- onSetRearrangingPanels(isRearrangingPanels) {
- this.isRearrangingPanels = isRearrangingPanels;
- },
- onDateTimePickerInvalid() {
- createAlert({
- message: s__(
- 'Metrics|Link contains an invalid time window, please verify the link to see the requested time range.',
- ),
- });
- // As a fallback, switch to default time range instead
- this.selectedTimeRange = defaultTimeRange;
- },
- isPanelHalfWidth(panelIndex, totalPanels) {
- /**
- * A single panel on a row should take the full width of its parent.
- * All others should have half the width their parent.
- */
- const isNumberOfPanelsEven = totalPanels % 2 === 0;
- const isLastPanel = panelIndex === totalPanels - 1;
-
- return isNumberOfPanelsEven || !isLastPanel;
- },
- /**
- * TODO: Investigate this to utilize the eventBus from Vue
- * The intention behind this cleanup is to allow for better tests
- * as well as use the correct eventBus facilities that are compatible
- * with Vue 3
- * https://gitlab.com/gitlab-org/gitlab/-/issues/225583
- */
- //
- runShortcut(actionToRun) {
- const panel = this.$refs[this.hoveredPanel];
-
- if (!panel) return;
-
- const [panelInstance] = panel;
- panelInstance[actionToRun]();
- },
- setHoveredPanel(groupKey, graphIndex) {
- this.hoveredPanel = `dashboard-panel-${groupKey}-${graphIndex}`;
- },
- clearHoveredPanel() {
- this.hoveredPanel = '';
- },
- },
- i18n: {
- collapsePanelLabel: s__('Metrics|Collapse panel'),
- collapsePanelTooltip: s__('Metrics|Collapse panel (Esc)'),
- },
-};
-</script>
-<template>
- <div class="prometheus-graphs" data-testid="prometheus-graphs">
- <div>
- <gl-alert
- v-if="!isDeprecationNoticeDismissed"
- :title="__('Feature deprecation')"
- class="mb-3"
- variant="warning"
- @dismiss="isDeprecationNoticeDismissed = true"
- >
- <gl-sprintf
- :message="s__('Deprecations|The metrics feature was deprecated in GitLab 14.7.')"
- >
- <template #epic="{ content }">
- <gl-link href="https://gitlab.com/groups/gitlab-org/-/epics/7188" target="_blank">{{
- content
- }}</gl-link>
- </template>
- </gl-sprintf>
- <gl-sprintf
- :message="
- s__(
- 'Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}.',
- )
- "
- >
- <template #epic="{ content }">
- <gl-link href="https://gitlab.com/groups/gitlab-org/-/epics/6976" target="_blank">{{
- content
- }}</gl-link>
- </template>
- </gl-sprintf>
- </gl-alert>
- </div>
- <dashboard-header
- v-if="showHeader"
- ref="prometheusGraphsHeader"
- class="prometheus-graphs-header d-sm-flex flex-sm-wrap pt-2 pr-1 pb-0 pl-2 border-bottom bg-gray-light"
- :default-branch="defaultBranch"
- :rearrange-panels-available="rearrangePanelsAvailable"
- :custom-metrics-available="customMetricsAvailable"
- :custom-metrics-path="customMetricsPath"
- :validate-query-path="validateQueryPath"
- :is-rearranging-panels="isRearrangingPanels"
- :selected-time-range="selectedTimeRange"
- @dateTimePickerInvalid="onDateTimePickerInvalid"
- @setRearrangingPanels="onSetRearrangingPanels"
- />
- <template v-if="!shouldShowEmptyState">
- <variables-section v-if="shouldShowVariablesSection" />
- <links-section v-if="shouldShowLinksSection" />
- <dashboard-panel
- v-show="expandedPanel.panel"
- ref="expandedPanel"
- :settings-path="settingsPath"
- :clipboard-text="generatePanelUrl(expandedPanel.group, expandedPanel.panel)"
- :graph-data="expandedPanel.panel"
- :height="600"
- @timerangezoom="onTimeRangeZoom"
- >
- <template #top-left>
- <gl-button
- ref="goBackBtn"
- v-gl-tooltip
- class="mr-3 my-3"
- :title="$options.i18n.collapsePanelTooltip"
- @click="onGoBack"
- >
- {{ $options.i18n.collapsePanelLabel }}
- </gl-button>
- </template>
- </dashboard-panel>
-
- <div v-show="!expandedPanel.panel">
- <graph-group
- v-for="groupData in dashboard.panelGroups"
- :key="`${groupData.group}.${groupData.priority}`"
- :name="groupData.group"
- :show-panels="showPanels"
- :is-loading="isGroupLoading(groupData.key)"
- :collapse-group="collapseGroup(groupData.key)"
- >
- <vue-draggable
- v-if="!groupSingleEmptyState(groupData.key)"
- :value="groupData.panels"
- group="metrics-dashboard"
- :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)"
- >
- <div
- v-for="(graphData, graphIndex) in groupData.panels"
- :key="`dashboard-panel-${graphIndex}`"
- data-testid="dashboard-panel-layout-wrapper"
- class="col-12 px-2 mb-2 draggable"
- :class="{
- 'draggable-enabled': isRearrangingPanels,
- 'col-lg-6': isPanelHalfWidth(graphIndex, groupData.panels.length),
- }"
- @mouseover="setHoveredPanel(groupData.key, graphIndex)"
- @mouseout="clearHoveredPanel"
- >
- <div class="position-relative draggable-panel js-draggable-panel">
- <div
- v-if="isRearrangingPanels"
- class="draggable-remove js-draggable-remove p-2 w-100 position-absolute d-flex justify-content-end"
- @click="removePanel(groupData.key, groupData.panels, graphIndex)"
- >
- <a class="mx-2 p-2 draggable-remove-link" :aria-label="__('Remove')">
- <gl-icon name="close" />
- </a>
- </div>
-
- <dashboard-panel
- :ref="`dashboard-panel-${groupData.key}-${graphIndex}`"
- :settings-path="settingsPath"
- :clipboard-text="generatePanelUrl(groupData.group, graphData)"
- :graph-data="graphData"
- @timerangezoom="onTimeRangeZoom"
- @expand="onExpandPanel(groupData.group, graphData)"
- />
- </div>
- </div>
- </vue-draggable>
- <div v-else class="py-5 col col-sm-10 col-md-8 col-lg-7 col-xl-6">
- <group-empty-state
- ref="empty-group"
- :documentation-path="documentationPath"
- :settings-path="settingsPath"
- :selected-state="groupSingleEmptyState(groupData.key)"
- :svg-path="emptyNoDataSmallSvgPath"
- />
- </div>
- </graph-group>
- </div>
- </template>
- <empty-state
- v-else
- :selected-state="emptyState"
- :documentation-path="documentationPath"
- :settings-path="settingsPath"
- :clusters-path="clustersPath"
- :empty-getting-started-svg-path="emptyGettingStartedSvgPath"
- :empty-loading-svg-path="emptyLoadingSvgPath"
- :empty-no-data-svg-path="emptyNoDataSvgPath"
- :empty-no-data-small-svg-path="emptyNoDataSmallSvgPath"
- :empty-unable-to-connect-svg-path="emptyUnableToConnectSvgPath"
- :compact="smallEmptyState"
- />
- </div>
-</template>
diff --git a/app/assets/javascripts/monitoring/components/dashboard_actions_menu.vue b/app/assets/javascripts/monitoring/components/dashboard_actions_menu.vue
deleted file mode 100644
index 29ce8572e9a..00000000000
--- a/app/assets/javascripts/monitoring/components/dashboard_actions_menu.vue
+++ /dev/null
@@ -1,291 +0,0 @@
-<script>
-import {
- GlButton,
- GlDropdown,
- GlDropdownDivider,
- GlDropdownItem,
- GlModal,
- GlIcon,
- GlModalDirective,
- GlTooltipDirective,
-} from '@gitlab/ui';
-import { mapState, mapGetters, mapActions } from 'vuex';
-import CustomMetricsFormFields from '~/custom_metrics/components/custom_metrics_form_fields.vue';
-import invalidUrl from '~/lib/utils/invalid_url';
-import { redirectTo } from '~/lib/utils/url_utility'; // eslint-disable-line import/no-deprecated
-import { s__ } from '~/locale';
-import TrackEventDirective from '~/vue_shared/directives/track_event';
-import { PANEL_NEW_PAGE } from '../router/constants';
-import { getAddMetricTrackingOptions } from '../utils';
-import CreateDashboardModal from './create_dashboard_modal.vue';
-import DuplicateDashboardModal from './duplicate_dashboard_modal.vue';
-
-export default {
- components: {
- GlButton,
- GlDropdown,
- GlDropdownDivider,
- GlDropdownItem,
- GlModal,
- GlIcon,
- DuplicateDashboardModal,
- CreateDashboardModal,
- CustomMetricsFormFields,
- },
- directives: {
- GlModal: GlModalDirective,
- GlTooltip: GlTooltipDirective,
- TrackEvent: TrackEventDirective,
- },
- props: {
- addingMetricsAvailable: {
- type: Boolean,
- required: false,
- default: false,
- },
- customMetricsPath: {
- type: String,
- required: false,
- default: invalidUrl,
- },
- validateQueryPath: {
- type: String,
- required: false,
- default: invalidUrl,
- },
- defaultBranch: {
- type: String,
- required: true,
- },
- isOotbDashboard: {
- type: Boolean,
- required: true,
- },
- },
- data() {
- return { customMetricsFormIsValid: null };
- },
- computed: {
- ...mapState('monitoringDashboard', [
- 'projectPath',
- 'isUpdatingStarredValue',
- 'addDashboardDocumentationPath',
- ]),
- ...mapGetters('monitoringDashboard', ['selectedDashboard']),
- isOutOfTheBoxDashboard() {
- return this.selectedDashboard?.out_of_the_box_dashboard;
- },
- isMenuItemEnabled() {
- return {
- addPanel: !this.isOotbDashboard,
- createDashboard: Boolean(this.projectPath),
- editDashboard: this.selectedDashboard?.can_edit,
- };
- },
- isMenuItemShown() {
- return {
- duplicateDashboard: this.isOutOfTheBoxDashboard,
- };
- },
- newPanelPageLocation() {
- // Retains params/query if any
- const { params, query } = this.$route ?? {};
- return { name: PANEL_NEW_PAGE, params, query };
- },
- },
- methods: {
- ...mapActions('monitoringDashboard', ['toggleStarredValue']),
- setFormValidity(isValid) {
- this.customMetricsFormIsValid = isValid;
- },
- hideAddMetricModal() {
- this.$refs.addMetricModal.hide();
- },
- getAddMetricTrackingOptions,
- submitCustomMetricsForm() {
- this.$refs.customMetricsForm.submit();
- },
- selectDashboard(dashboard) {
- // Once the sidebar See metrics link is updated to the new URL,
- // this sort of hardcoding will not be necessary.
- // https://gitlab.com/gitlab-org/gitlab/-/issues/229277
- const baseURL = `${this.projectPath}/-/metrics`;
- const dashboardPath = encodeURIComponent(
- dashboard.out_of_the_box_dashboard ? dashboard.path : dashboard.display_name,
- );
- redirectTo(`${baseURL}/${dashboardPath}`); // eslint-disable-line import/no-deprecated
- },
- },
-
- modalIds: {
- addMetric: 'addMetric',
- createDashboard: 'createDashboard',
- duplicateDashboard: 'duplicateDashboard',
- },
- i18n: {
- actionsMenu: s__('Metrics|More actions'),
- duplicateDashboard: s__('Metrics|Duplicate current dashboard'),
- starDashboard: s__('Metrics|Star dashboard'),
- unstarDashboard: s__('Metrics|Unstar dashboard'),
- addMetric: s__('Metrics|Add metric'),
- addPanel: s__('Metrics|Add panel'),
- addPanelInfo: s__('Metrics|Duplicate this dashboard to add panel or edit dashboard YAML.'),
- editDashboardInfo: s__('Metrics|Duplicate this dashboard to add panel or edit dashboard YAML.'),
- editDashboard: s__('Metrics|Edit dashboard YAML'),
- createDashboard: s__('Metrics|Create new dashboard'),
- },
-};
-</script>
-
-<template>
- <!--
- This component should be replaced with a variant developed
- as part of https://gitlab.com/gitlab-org/gitlab-ui/-/issues/936
- The variant will create a dropdown with an icon, no text and no caret
- -->
- <gl-dropdown
- v-gl-tooltip
- data-testid="actions-menu"
- right
- no-caret
- toggle-class="gl-px-3!"
- :title="$options.i18n.actionsMenu"
- >
- <template #button-content>
- <gl-icon class="gl-mr-0!" name="ellipsis_v" />
- </template>
-
- <template v-if="addingMetricsAvailable">
- <gl-dropdown-item
- v-gl-modal="$options.modalIds.addMetric"
- data-qa-selector="add_metric_button"
- data-testid="add-metric-item"
- >
- {{ $options.i18n.addMetric }}
- </gl-dropdown-item>
- <gl-modal
- ref="addMetricModal"
- :modal-id="$options.modalIds.addMetric"
- :title="$options.i18n.addMetric"
- data-testid="add-metric-modal"
- >
- <form ref="customMetricsForm" :action="customMetricsPath" method="post">
- <custom-metrics-form-fields
- :validate-query-path="validateQueryPath"
- form-operation="post"
- @formValidation="setFormValidity"
- />
- </form>
- <template #modal-footer>
- <div>
- <gl-button @click="hideAddMetricModal">
- {{ __('Cancel') }}
- </gl-button>
- <gl-button
- v-track-event="getAddMetricTrackingOptions()"
- data-testid="add-metric-modal-submit-button"
- :disabled="!customMetricsFormIsValid"
- variant="confirm"
- @click="submitCustomMetricsForm"
- >
- {{ __('Save changes') }}
- </gl-button>
- </div>
- </template>
- </gl-modal>
- </template>
-
- <gl-dropdown-item
- v-if="isMenuItemEnabled.addPanel"
- data-testid="add-panel-item-enabled"
- :to="newPanelPageLocation"
- >
- {{ $options.i18n.addPanel }}
- </gl-dropdown-item>
-
- <!--
- wrapper for tooltip as button can be `disabled`
- https://bootstrap-vue.org/docs/components/tooltip#disabled-elements
- -->
- <div v-else v-gl-tooltip :title="$options.i18n.addPanelInfo">
- <gl-dropdown-item
- :alt="$options.i18n.addPanelInfo"
- :to="newPanelPageLocation"
- data-testid="add-panel-item-disabled"
- disabled
- class="gl-cursor-not-allowed"
- >
- <span class="gl-text-gray-400">{{ $options.i18n.addPanel }}</span>
- </gl-dropdown-item>
- </div>
-
- <gl-dropdown-item
- v-if="isMenuItemEnabled.editDashboard"
- :href="selectedDashboard ? selectedDashboard.project_blob_path : null"
- data-testid="edit-dashboard-item-enabled"
- >
- {{ $options.i18n.editDashboard }}
- </gl-dropdown-item>
-
- <!--
- wrapper for tooltip as button can be `disabled`
- https://bootstrap-vue.org/docs/components/tooltip#disabled-elements
- -->
- <div v-else v-gl-tooltip :title="$options.i18n.editDashboardInfo">
- <gl-dropdown-item
- :alt="$options.i18n.editDashboardInfo"
- :href="selectedDashboard ? selectedDashboard.project_blob_path : null"
- data-testid="edit-dashboard-item-disabled"
- disabled
- class="gl-cursor-not-allowed"
- >
- <span class="gl-text-gray-400">{{ $options.i18n.editDashboard }}</span>
- </gl-dropdown-item>
- </div>
-
- <template v-if="isMenuItemShown.duplicateDashboard">
- <gl-dropdown-item
- v-gl-modal="$options.modalIds.duplicateDashboard"
- data-testid="duplicate-dashboard-item"
- >
- {{ $options.i18n.duplicateDashboard }}
- </gl-dropdown-item>
-
- <duplicate-dashboard-modal
- :default-branch="defaultBranch"
- :modal-id="$options.modalIds.duplicateDashboard"
- data-testid="duplicate-dashboard-modal"
- @dashboardDuplicated="selectDashboard"
- />
- </template>
-
- <gl-dropdown-item
- v-if="selectedDashboard"
- data-testid="star-dashboard-item"
- :disabled="isUpdatingStarredValue"
- @click="toggleStarredValue()"
- >
- {{ selectedDashboard.starred ? $options.i18n.unstarDashboard : $options.i18n.starDashboard }}
- </gl-dropdown-item>
-
- <gl-dropdown-divider />
-
- <gl-dropdown-item
- v-gl-modal="$options.modalIds.createDashboard"
- data-testid="create-dashboard-item"
- :disabled="!isMenuItemEnabled.createDashboard"
- :class="{ 'monitoring-actions-item-disabled': !isMenuItemEnabled.createDashboard }"
- >
- {{ $options.i18n.createDashboard }}
- </gl-dropdown-item>
-
- <template v-if="isMenuItemEnabled.createDashboard">
- <create-dashboard-modal
- data-testid="create-dashboard-modal"
- :add-dashboard-documentation-path="addDashboardDocumentationPath"
- :modal-id="$options.modalIds.createDashboard"
- :project-path="projectPath"
- />
- </template>
- </gl-dropdown>
-</template>
diff --git a/app/assets/javascripts/monitoring/components/dashboard_header.vue b/app/assets/javascripts/monitoring/components/dashboard_header.vue
deleted file mode 100644
index f4dc29f2184..00000000000
--- a/app/assets/javascripts/monitoring/components/dashboard_header.vue
+++ /dev/null
@@ -1,294 +0,0 @@
-<script>
-import {
- GlButton,
- GlDropdown,
- GlLoadingIcon,
- GlDropdownItem,
- GlDropdownSectionHeader,
- GlSearchBoxByType,
- GlModalDirective,
- GlTooltipDirective,
- GlIcon,
-} from '@gitlab/ui';
-import { debounce } from 'lodash';
-import { mapActions, mapState, mapGetters } from 'vuex';
-import invalidUrl from '~/lib/utils/invalid_url';
-import { mergeUrlParams, redirectTo } from '~/lib/utils/url_utility'; // eslint-disable-line import/no-deprecated
-import { s__ } from '~/locale';
-import DateTimePicker from '~/vue_shared/components/date_time_picker/date_time_picker.vue';
-
-import { timeRanges } from '~/vue_shared/constants';
-import { timezones } from '../format_date';
-import { timeRangeToUrl } from '../utils';
-import ActionsMenu from './dashboard_actions_menu.vue';
-import DashboardsDropdown from './dashboards_dropdown.vue';
-import RefreshButton from './refresh_button.vue';
-
-export default {
- i18n: {
- metricsSettings: s__('Metrics|Metrics Settings'),
- },
- components: {
- GlIcon,
- GlButton,
- GlDropdown,
- GlLoadingIcon,
- GlDropdownItem,
- GlDropdownSectionHeader,
-
- GlSearchBoxByType,
-
- DateTimePicker,
- DashboardsDropdown,
- RefreshButton,
-
- ActionsMenu,
- },
- directives: {
- GlModal: GlModalDirective,
- GlTooltip: GlTooltipDirective,
- },
- props: {
- defaultBranch: {
- type: String,
- required: true,
- },
- rearrangePanelsAvailable: {
- type: Boolean,
- required: false,
- default: false,
- },
- customMetricsAvailable: {
- type: Boolean,
- required: false,
- default: false,
- },
- customMetricsPath: {
- type: String,
- required: false,
- default: invalidUrl,
- },
- validateQueryPath: {
- type: String,
- required: false,
- default: invalidUrl,
- },
- isRearrangingPanels: {
- type: Boolean,
- required: true,
- },
- selectedTimeRange: {
- type: Object,
- required: true,
- },
- },
- computed: {
- ...mapState('monitoringDashboard', [
- 'emptyState',
- 'environmentsLoading',
- 'currentEnvironmentName',
- 'dashboardTimezone',
- 'projectPath',
- 'canAccessOperationsSettings',
- 'operationsSettingsPath',
- 'currentDashboard',
- 'externalDashboardUrl',
- ]),
- ...mapGetters('monitoringDashboard', ['selectedDashboard', 'filteredEnvironments']),
- shouldShowEmptyState() {
- return Boolean(this.emptyState);
- },
- shouldShowEnvironmentsDropdownNoMatchedMsg() {
- return !this.environmentsLoading && this.filteredEnvironments.length === 0;
- },
- addingMetricsAvailable() {
- return (
- this.customMetricsAvailable &&
- !this.shouldShowEmptyState &&
- // Custom metrics only available on system dashboards because
- // they are stored in the database. This can be improved. See:
- // https://gitlab.com/gitlab-org/gitlab/-/issues/28241
- this.selectedDashboard?.out_of_the_box_dashboard
- );
- },
- showRearrangePanelsBtn() {
- return !this.shouldShowEmptyState && this.rearrangePanelsAvailable;
- },
- environmentDropdownText() {
- return this.currentEnvironmentName ?? '';
- },
- displayUtc() {
- return this.dashboardTimezone === timezones.UTC;
- },
- shouldShowSettingsButton() {
- return this.canAccessOperationsSettings && this.operationsSettingsPath;
- },
- isOOTBDashboard() {
- return this.selectedDashboard?.out_of_the_box_dashboard ?? false;
- },
- },
- methods: {
- ...mapActions('monitoringDashboard', ['filterEnvironments']),
- selectDashboard(dashboard) {
- // Once the sidebar See metrics link is updated to the new URL,
- // this sort of hardcoding will not be necessary.
- // https://gitlab.com/gitlab-org/gitlab/-/issues/229277
- const baseURL = `${this.projectPath}/-/metrics`;
- const dashboardPath = encodeURIComponent(
- dashboard.out_of_the_box_dashboard ? dashboard.path : dashboard.display_name,
- );
- redirectTo(`${baseURL}/${dashboardPath}`); // eslint-disable-line import/no-deprecated
- },
- debouncedEnvironmentsSearch: debounce(function environmentsSearchOnInput(searchTerm) {
- this.filterEnvironments(searchTerm);
- }, 500),
- onDateTimePickerInput(timeRange) {
- redirectTo(timeRangeToUrl(timeRange)); // eslint-disable-line import/no-deprecated
- },
- onDateTimePickerInvalid() {
- this.$emit('dateTimePickerInvalid');
- },
-
- toggleRearrangingPanels() {
- this.$emit('setRearrangingPanels', !this.isRearrangingPanels);
- },
- getEnvironmentPath(environment) {
- // Once the sidebar See metrics link is updated to the new URL,
- // this sort of hardcoding will not be necessary.
- // https://gitlab.com/gitlab-org/gitlab/-/issues/229277
- const baseURL = `${this.projectPath}/-/metrics`;
- const dashboardPath = encodeURIComponent(this.currentDashboard || '');
- // The environment_metrics_spec.rb requires the URL to not have
- // slashes. Hence, this additional check.
- const url = dashboardPath ? `${baseURL}/${dashboardPath}` : baseURL;
- return mergeUrlParams({ environment }, url);
- },
- },
- timeRanges,
-};
-</script>
-
-<template>
- <div ref="prometheusGraphsHeader">
- <div class="gl-mb-3 gl-mr-3 gl-display-flex gl-sm-display-block">
- <dashboards-dropdown
- id="monitor-dashboards-dropdown"
- class="flex-grow-1"
- toggle-class="dropdown-menu-toggle"
- :default-branch="defaultBranch"
- @selectDashboard="selectDashboard"
- />
- </div>
-
- <span aria-hidden="true" class="gl-pl-3 border-left gl-mb-3 d-none d-sm-block"></span>
-
- <div class="mb-2 pr-2 d-flex d-sm-block">
- <gl-dropdown
- id="monitor-environments-dropdown"
- ref="monitorEnvironmentsDropdown"
- class="flex-grow-1"
- data-testid="environments-dropdown"
- toggle-class="dropdown-menu-toggle"
- menu-class="monitor-environment-dropdown-menu"
- :text="environmentDropdownText"
- >
- <div class="d-flex flex-column overflow-hidden">
- <gl-dropdown-section-header>{{ __('Environment') }}</gl-dropdown-section-header>
- <gl-search-box-by-type @input="debouncedEnvironmentsSearch" />
-
- <gl-loading-icon v-if="environmentsLoading" size="sm" :inline="true" />
- <div v-else class="flex-fill overflow-auto">
- <gl-dropdown-item
- v-for="environment in filteredEnvironments"
- :key="environment.id"
- is-check-item
- :is-checked="environment.name === currentEnvironmentName"
- :href="getEnvironmentPath(environment.id)"
- >
- {{ environment.name }}
- </gl-dropdown-item>
- </div>
- <div
- v-show="shouldShowEnvironmentsDropdownNoMatchedMsg"
- ref="monitorEnvironmentsDropdownMsg"
- class="text-secondary no-matches-message"
- >
- {{ __('No matching results') }}
- </div>
- </div>
- </gl-dropdown>
- </div>
-
- <div class="mb-2 pr-2 d-flex d-sm-block">
- <date-time-picker
- ref="dateTimePicker"
- class="flex-grow-1 show-last-dropdown"
- :value="selectedTimeRange"
- :options="$options.timeRanges"
- :utc="displayUtc"
- @input="onDateTimePickerInput"
- @invalid="onDateTimePickerInvalid"
- />
- </div>
-
- <div class="mb-2 pr-2 d-flex d-sm-block">
- <refresh-button />
- </div>
-
- <div class="flex-grow-1"></div>
-
- <div class="d-sm-flex">
- <div v-if="showRearrangePanelsBtn" class="gl-mb-3 gl-mr-3 gl-display-flex">
- <gl-button
- :pressed="isRearrangingPanels"
- variant="default"
- class="flex-grow-1 js-rearrange-button"
- @click="toggleRearrangingPanels"
- >
- {{ __('Arrange charts') }}
- </gl-button>
- </div>
-
- <div
- v-if="externalDashboardUrl && externalDashboardUrl.length"
- class="gl-mb-3 gl-mr-3 gl-display-flex gl-sm-display-block"
- >
- <gl-button
- class="flex-grow-1 js-external-dashboard-link"
- variant="confirm"
- category="primary"
- :href="externalDashboardUrl"
- target="_blank"
- rel="noopener noreferrer"
- >
- {{ __('View full dashboard') }} <gl-icon name="external-link" />
- </gl-button>
- </div>
-
- <div class="gl-mb-3 gl-mr-3 d-flex d-sm-block">
- <actions-menu
- :adding-metrics-available="addingMetricsAvailable"
- :custom-metrics-path="customMetricsPath"
- :validate-query-path="validateQueryPath"
- :default-branch="defaultBranch"
- :is-ootb-dashboard="isOOTBDashboard"
- />
- </div>
-
- <template v-if="shouldShowSettingsButton">
- <span aria-hidden="true" class="gl-pl-3 border-left gl-mb-3 d-none d-sm-block"></span>
-
- <div class="gl-mb-3 gl-mr-3 d-flex d-sm-block">
- <gl-button
- v-gl-tooltip
- data-testid="metrics-settings-button"
- icon="settings"
- :href="operationsSettingsPath"
- :title="$options.i18n.metricsSettings"
- :aria-label="$options.i18n.metricsSettings"
- />
- </div>
- </template>
- </div>
- </div>
-</template>
diff --git a/app/assets/javascripts/monitoring/components/dashboard_panel.vue b/app/assets/javascripts/monitoring/components/dashboard_panel.vue
deleted file mode 100644
index 9ad6da35d6b..00000000000
--- a/app/assets/javascripts/monitoring/components/dashboard_panel.vue
+++ /dev/null
@@ -1,388 +0,0 @@
-<script>
-import {
- GlResizeObserverDirective,
- GlIcon,
- GlLink,
- GlLoadingIcon,
- GlDropdown,
- GlDropdownItem,
- GlDropdownDivider,
- GlModal,
- GlModalDirective,
- GlSprintf,
- GlTooltip,
- GlTooltipDirective,
-} from '@gitlab/ui';
-import { mapState } from 'vuex';
-import { convertToFixedRange } from '~/lib/utils/datetime_range';
-import { isSafeURL } from '~/lib/utils/url_utility';
-import { __, n__ } from '~/locale';
-import TrackEventDirective from '~/vue_shared/directives/track_event';
-import { panelTypes } from '../constants';
-
-import { graphDataToCsv } from '../csv_export';
-import { downloadCSVOptions, generateLinkToChartOptions } from '../utils';
-import MonitorAnomalyChart from './charts/anomaly.vue';
-import MonitorBarChart from './charts/bar.vue';
-import MonitorColumnChart from './charts/column.vue';
-import MonitorEmptyChart from './charts/empty_chart.vue';
-import MonitorGaugeChart from './charts/gauge.vue';
-import MonitorHeatmapChart from './charts/heatmap.vue';
-import MonitorSingleStatChart from './charts/single_stat.vue';
-import MonitorStackedColumnChart from './charts/stacked_column.vue';
-import MonitorTimeSeriesChart from './charts/time_series.vue';
-
-const events = {
- timeRangeZoom: 'timerangezoom',
- expand: 'expand',
-};
-
-export default {
- components: {
- MonitorEmptyChart,
- GlIcon,
- GlLink,
- GlLoadingIcon,
- GlTooltip,
- GlDropdown,
- GlDropdownItem,
- GlDropdownDivider,
- GlModal,
- GlSprintf,
- },
- directives: {
- GlResizeObserver: GlResizeObserverDirective,
- GlModal: GlModalDirective,
- GlTooltip: GlTooltipDirective,
- TrackEvent: TrackEventDirective,
- },
- props: {
- clipboardText: {
- type: String,
- required: false,
- default: '',
- },
- graphData: {
- type: Object,
- required: false,
- default: null,
- },
- groupId: {
- type: String,
- required: false,
- default: 'dashboard-panel',
- },
- namespace: {
- type: String,
- required: false,
- default: 'monitoringDashboard',
- },
- settingsPath: {
- type: String,
- required: false,
- default: null,
- },
- },
- data() {
- return {
- showTitleTooltip: false,
- zoomedTimeRange: null,
- expandBtnAvailable: Boolean(this.$listeners[events.expand]),
- };
- },
- computed: {
- // Use functions to support dynamic namespaces in mapXXX helpers. Pattern described
- // in https://github.com/vuejs/vuex/issues/863#issuecomment-329510765
- ...mapState({
- deploymentData(state) {
- return state[this.namespace].deploymentData;
- },
- annotations(state) {
- return state[this.namespace].annotations;
- },
- projectPath(state) {
- return state[this.namespace].projectPath;
- },
- timeRange(state) {
- return state[this.namespace].timeRange;
- },
- dashboardTimezone(state) {
- return state[this.namespace].dashboardTimezone;
- },
- metricsSavedToDb(state, getters) {
- return getters[`${this.namespace}/metricsSavedToDb`];
- },
- selectedDashboard(state, getters) {
- return getters[`${this.namespace}/selectedDashboard`];
- },
- }),
- fixedCurrentTimeRange() {
- // convertToFixedRange throws an error if the time range
- // is not properly set.
- try {
- return convertToFixedRange(this.timeRange);
- } catch {
- return {};
- }
- },
- title() {
- return this.graphData?.title || '';
- },
- graphDataHasResult() {
- const metrics = this.graphData?.metrics || [];
- return metrics.some(({ result }) => result?.length > 0);
- },
- graphDataIsLoading() {
- const metrics = this.graphData?.metrics || [];
- return metrics.some(({ loading }) => loading);
- },
- csvText() {
- if (this.graphData) {
- return graphDataToCsv(this.graphData);
- }
- return null;
- },
- downloadCsv() {
- const data = new Blob([this.csvText], { type: 'text/plain' });
- return window.URL.createObjectURL(data);
- },
-
- /**
- * A chart is "basic" if it doesn't support
- * the same features as the TimeSeries based components
- * such as "annotations".
- *
- * @returns Vue Component wrapping a basic visualization
- */
- basicChartComponent() {
- if (this.isPanelType(panelTypes.SINGLE_STAT)) {
- return MonitorSingleStatChart;
- }
- if (this.isPanelType(panelTypes.GAUGE_CHART)) {
- return MonitorGaugeChart;
- }
- if (this.isPanelType(panelTypes.HEATMAP)) {
- return MonitorHeatmapChart;
- }
- if (this.isPanelType(panelTypes.BAR)) {
- return MonitorBarChart;
- }
- if (this.isPanelType(panelTypes.COLUMN)) {
- return MonitorColumnChart;
- }
- if (this.isPanelType(panelTypes.STACKED_COLUMN)) {
- return MonitorStackedColumnChart;
- }
- if (this.isPanelType(panelTypes.ANOMALY_CHART)) {
- return MonitorAnomalyChart;
- }
- return null;
- },
-
- /**
- * In monitoring, Time Series charts typically support
- * a larger feature set like "annotations", "deployment
- * data" and "datazoom".
- *
- * This is intentional as Time Series are more frequently
- * used.
- *
- * @returns Vue Component wrapping a time series visualization,
- * Area Charts are rendered by default.
- */
- timeSeriesChartComponent() {
- if (this.isPanelType(panelTypes.ANOMALY_CHART)) {
- return MonitorAnomalyChart;
- }
- return MonitorTimeSeriesChart;
- },
- isContextualMenuShown() {
- if (!this.graphDataHasResult) {
- return false;
- }
- // Only a few charts have a contextual menu, support
- // for more chart types planned at:
- // https://gitlab.com/groups/gitlab-org/-/epics/3573
- return (
- this.isPanelType(panelTypes.AREA_CHART) ||
- this.isPanelType(panelTypes.LINE_CHART) ||
- this.isPanelType(panelTypes.SINGLE_STAT) ||
- this.isPanelType(panelTypes.GAUGE_CHART)
- );
- },
- editCustomMetricLink() {
- if (this.graphData.metrics.length > 1) {
- return this.settingsPath;
- }
- return this.graphData?.metrics[0].edit_path;
- },
- editCustomMetricLinkText() {
- return n__('Metrics|Edit metric', 'Metrics|Edit metrics', this.graphData.metrics.length);
- },
- hasMetricsInDb() {
- const { metrics = [] } = this.graphData;
- return metrics.some(({ metricId }) => this.metricsSavedToDb.includes(metricId));
- },
- },
- mounted() {
- this.refreshTitleTooltip();
- },
- methods: {
- isPanelType(type) {
- return this.graphData?.type === type;
- },
- showToast() {
- this.$toast.show(__('Link copied'));
- },
- refreshTitleTooltip() {
- const { graphTitle } = this.$refs;
- this.showTitleTooltip =
- Boolean(graphTitle) && graphTitle.scrollWidth > graphTitle.offsetWidth;
- },
-
- downloadCSVOptions,
- generateLinkToChartOptions,
-
- onResize() {
- this.refreshTitleTooltip();
- },
- onDatazoom({ start, end }) {
- this.zoomedTimeRange = { start, end };
- this.$emit(events.timeRangeZoom, { start, end });
- },
- onExpand() {
- this.$emit(events.expand);
- },
- onExpandFromKeyboardShortcut() {
- if (this.isContextualMenuShown) {
- this.onExpand();
- }
- },
- safeUrl(url) {
- return isSafeURL(url) ? url : '#';
- },
- downloadCsvFromKeyboardShortcut() {
- if (this.csvText && this.isContextualMenuShown) {
- this.$refs.downloadCsvLink.$el.firstChild.click();
- }
- },
- copyChartLinkFromKeyboardShotcut() {
- if (this.clipboardText && this.isContextualMenuShown) {
- this.$refs.copyChartLink.$el.firstChild.click();
- }
- },
- },
- panelTypes,
-};
-</script>
-<template>
- <div v-gl-resize-observer="onResize" class="prometheus-graph">
- <div class="d-flex align-items-center">
- <slot name="top-left"></slot>
- <h5
- ref="graphTitle"
- class="prometheus-graph-title gl-font-lg font-weight-bold text-truncate gl-mr-3"
- >
- {{ title }}
- </h5>
- <gl-tooltip :target="() => $refs.graphTitle" :disabled="!showTitleTooltip">
- {{ title }}
- </gl-tooltip>
- <div class="flex-grow-1"></div>
- <div v-if="graphDataIsLoading" class="mx-1 mt-1">
- <gl-loading-icon size="sm" />
- </div>
- <div v-if="isContextualMenuShown" ref="contextualMenu">
- <div data-testid="dropdown-wrapper" class="d-flex align-items-center">
- <!--
- This component should be replaced with a variant developed
- as part of https://gitlab.com/gitlab-org/gitlab-ui/-/issues/936
- The variant will create a dropdown with an icon, no text and no caret
- -->
- <gl-dropdown
- v-gl-tooltip
- icon="ellipsis_v"
- :text="__('More actions')"
- :text-sr-only="true"
- toggle-class="gl-px-3!"
- no-caret
- right
- :title="__('More actions')"
- >
- <gl-dropdown-item v-if="expandBtnAvailable" ref="expandBtn" @click.prevent="onExpand">
- {{ s__('Metrics|Expand panel') }}
- </gl-dropdown-item>
- <gl-dropdown-item
- v-if="editCustomMetricLink"
- ref="editMetricLink"
- :href="editCustomMetricLink"
- >
- {{ editCustomMetricLinkText }}
- </gl-dropdown-item>
-
- <gl-dropdown-item
- v-if="csvText"
- ref="downloadCsvLink"
- v-track-event="downloadCSVOptions(title)"
- :href="downloadCsv"
- download="chart_metrics.csv"
- >
- {{ __('Download CSV') }}
- </gl-dropdown-item>
- <gl-dropdown-item
- v-if="clipboardText"
- ref="copyChartLink"
- v-track-event="generateLinkToChartOptions(clipboardText)"
- :data-clipboard-text="clipboardText"
- @click="showToast(clipboardText)"
- >
- {{ __('Copy link to chart') }}
- </gl-dropdown-item>
-
- <template v-if="graphData.links && graphData.links.length">
- <gl-dropdown-divider />
- <gl-dropdown-item
- v-for="(link, index) in graphData.links"
- :key="index"
- :href="safeUrl(link.url)"
- class="text-break"
- >{{ link.title }}</gl-dropdown-item
- >
- </template>
- <template v-if="selectedDashboard && selectedDashboard.can_edit">
- <gl-dropdown-divider />
- <gl-dropdown-item ref="manageLinksItem" :href="selectedDashboard.project_blob_path">{{
- s__('Metrics|Manage chart links')
- }}</gl-dropdown-item>
- </template>
- </gl-dropdown>
- </div>
- </div>
- </div>
-
- <monitor-empty-chart v-if="!graphDataHasResult" />
- <component
- :is="basicChartComponent"
- v-else-if="basicChartComponent"
- :graph-data="graphData"
- :timezone="dashboardTimezone"
- v-bind="$attrs"
- v-on="$listeners"
- />
- <component
- :is="timeSeriesChartComponent"
- v-else
- ref="timeSeriesChart"
- :graph-data="graphData"
- :deployment-data="deploymentData"
- :annotations="annotations"
- :project-path="projectPath"
- :group-id="groupId"
- :timezone="dashboardTimezone"
- :time-range="fixedCurrentTimeRange"
- v-bind="$attrs"
- v-on="$listeners"
- @datazoom="onDatazoom"
- />
- </div>
-</template>
diff --git a/app/assets/javascripts/monitoring/components/dashboard_panel_builder.vue b/app/assets/javascripts/monitoring/components/dashboard_panel_builder.vue
deleted file mode 100644
index e8a9c24f5c2..00000000000
--- a/app/assets/javascripts/monitoring/components/dashboard_panel_builder.vue
+++ /dev/null
@@ -1,204 +0,0 @@
-<script>
-import {
- GlCard,
- GlForm,
- GlFormGroup,
- GlFormTextarea,
- GlButton,
- GlSprintf,
- GlAlert,
- GlTooltipDirective,
-} from '@gitlab/ui';
-import { mapActions, mapState } from 'vuex';
-import { s__ } from '~/locale';
-import DateTimePicker from '~/vue_shared/components/date_time_picker/date_time_picker.vue';
-import { timeRanges } from '~/vue_shared/constants';
-import DashboardPanel from './dashboard_panel.vue';
-
-const initialYml = `title: Go heap size
-type: area-chart
-y_axis:
- format: 'bytes'
-metrics:
- - metric_id: 'go_memstats_alloc_bytes_1'
- query_range: 'go_memstats_alloc_bytes'
-`;
-
-export default {
- i18n: {
- refreshButtonLabel: s__('Metrics|Refresh Prometheus data'),
- },
- components: {
- GlCard,
- GlForm,
- GlFormGroup,
- GlFormTextarea,
- GlButton,
- GlSprintf,
- GlAlert,
- DashboardPanel,
- DateTimePicker,
- },
- directives: {
- GlTooltip: GlTooltipDirective,
- },
- data() {
- return {
- yml: initialYml,
- };
- },
- computed: {
- ...mapState('monitoringDashboard', [
- 'panelPreviewIsLoading',
- 'panelPreviewError',
- 'panelPreviewGraphData',
- 'panelPreviewTimeRange',
- 'panelPreviewIsShown',
- 'projectPath',
- 'addDashboardDocumentationPath',
- ]),
- },
- methods: {
- ...mapActions('monitoringDashboard', [
- 'fetchPanelPreview',
- 'fetchPanelPreviewMetrics',
- 'setPanelPreviewTimeRange',
- ]),
- onSubmit() {
- this.fetchPanelPreview(this.yml);
- },
- onDateTimePickerInput(timeRange) {
- this.setPanelPreviewTimeRange(timeRange);
- // refetch data only if preview has been clicked
- // and there are no errors
- if (this.panelPreviewIsShown && !this.panelPreviewError) {
- this.fetchPanelPreviewMetrics();
- }
- },
- onRefresh() {
- // refetch data only if preview has been clicked
- // and there are no errors
- if (this.panelPreviewIsShown && !this.panelPreviewError) {
- this.fetchPanelPreviewMetrics();
- }
- },
- },
- timeRanges,
-};
-</script>
-<template>
- <div class="prometheus-panel-builder">
- <div class="gl-xs-flex-direction-column gl-display-flex gl-mx-n3">
- <gl-card class="gl-flex-grow-1 gl-flex-basis-0 gl-mx-3 gl-mb-5">
- <template #header>
- <h2 class="gl-font-size-h2 gl-my-3">{{ s__('Metrics|1. Define and preview panel') }}</h2>
- </template>
- <template #default>
- <p>{{ s__('Metrics|Define panel YAML below to preview panel.') }}</p>
- <gl-form @submit.prevent="onSubmit">
- <gl-form-group :label="s__('Metrics|Panel YAML')" label-for="panel-yml-input">
- <gl-form-textarea
- id="panel-yml-input"
- v-model="yml"
- class="gl-h-200! gl-font-monospace!"
- />
- </gl-form-group>
- <div class="gl-text-right">
- <gl-button
- ref="clipboardCopyBtn"
- variant="confirm"
- category="secondary"
- :data-clipboard-text="yml"
- class="gl-xs-w-full gl-xs-mb-3"
- @click="$toast.show(s__('Metrics|Panel YAML copied'))"
- >
- {{ s__('Metrics|Copy YAML') }}
- </gl-button>
- <gl-button
- type="submit"
- variant="confirm"
- :disabled="panelPreviewIsLoading"
- class="js-no-auto-disable gl-xs-w-full"
- >
- {{ s__('Metrics|Preview panel') }}
- </gl-button>
- </div>
- </gl-form>
- </template>
- </gl-card>
-
- <gl-card
- class="gl-flex-grow-1 gl-flex-basis-0 gl-mx-3 gl-mb-5"
- body-class="gl-display-flex gl-flex-direction-column"
- >
- <template #header>
- <h2 class="gl-font-size-h2 gl-my-3">
- {{ s__('Metrics|2. Paste panel YAML into dashboard') }}
- </h2>
- </template>
- <template #default>
- <div
- class="gl-flex-grow-1 gl-display-flex gl-flex-direction-column gl-justify-content-center"
- >
- <p>
- {{ s__('Metrics|Copy and paste the panel YAML into your dashboard YAML file.') }}
- <br />
- <gl-sprintf
- :message="
- s__(
- 'Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project.',
- )
- "
- >
- <template #code="{ content }">
- <code>{{ content }}</code>
- </template>
- </gl-sprintf>
- </p>
- </div>
-
- <div class="gl-text-right">
- <gl-button
- ref="viewDocumentationBtn"
- category="secondary"
- class="gl-xs-w-full gl-xs-mb-3"
- variant="confirm"
- target="_blank"
- :href="addDashboardDocumentationPath"
- >
- {{ s__('Metrics|View documentation') }}
- </gl-button>
- <gl-button
- ref="openRepositoryBtn"
- variant="confirm"
- :href="projectPath"
- class="gl-xs-w-full"
- >
- {{ s__('Metrics|Open repository') }}
- </gl-button>
- </div>
- </template>
- </gl-card>
- </div>
-
- <gl-alert v-if="panelPreviewError" variant="warning" :dismissible="false">
- {{ panelPreviewError }}
- </gl-alert>
- <date-time-picker
- ref="dateTimePicker"
- class="gl-flex-grow-1 preview-date-time-picker gl-xs-mb-3"
- :value="panelPreviewTimeRange"
- :options="$options.timeRanges"
- @input="onDateTimePickerInput"
- />
- <gl-button
- v-gl-tooltip
- data-testid="previewRefreshButton"
- icon="retry"
- :title="$options.i18n.refreshButtonLabel"
- :aria-label="$options.i18n.refreshButtonLabel"
- @click="onRefresh"
- />
- <dashboard-panel :graph-data="panelPreviewGraphData" />
- </div>
-</template>
diff --git a/app/assets/javascripts/monitoring/components/dashboards_dropdown.vue b/app/assets/javascripts/monitoring/components/dashboards_dropdown.vue
deleted file mode 100644
index 7fae684315c..00000000000
--- a/app/assets/javascripts/monitoring/components/dashboards_dropdown.vue
+++ /dev/null
@@ -1,127 +0,0 @@
-<script>
-import {
- GlIcon,
- GlDropdown,
- GlDropdownItem,
- GlDropdownSectionHeader,
- GlDropdownDivider,
- GlSearchBoxByType,
- GlModalDirective,
-} from '@gitlab/ui';
-import { mapState, mapGetters } from 'vuex';
-
-const events = {
- selectDashboard: 'selectDashboard',
-};
-
-export default {
- components: {
- GlIcon,
- GlDropdown,
- GlDropdownItem,
- GlDropdownSectionHeader,
- GlDropdownDivider,
- GlSearchBoxByType,
- },
- directives: {
- GlModal: GlModalDirective,
- },
- props: {
- defaultBranch: {
- type: String,
- required: true,
- },
- },
- data() {
- return {
- searchTerm: '',
- };
- },
- computed: {
- ...mapState('monitoringDashboard', ['allDashboards']),
- ...mapGetters('monitoringDashboard', ['selectedDashboard']),
- selectedDashboardText() {
- return this.selectedDashboard?.display_name;
- },
- selectedDashboardPath() {
- return this.selectedDashboard?.path;
- },
-
- filteredDashboards() {
- return this.allDashboards.filter(({ display_name: displayName = '' }) =>
- displayName.toLowerCase().includes(this.searchTerm.toLowerCase()),
- );
- },
- shouldShowNoMsgContainer() {
- return this.filteredDashboards.length === 0;
- },
- starredDashboards() {
- return this.filteredDashboards.filter(({ starred }) => starred);
- },
- nonStarredDashboards() {
- return this.filteredDashboards.filter(({ starred }) => !starred);
- },
- },
- methods: {
- dashboardDisplayName(dashboard) {
- return dashboard.display_name || dashboard.path || '';
- },
- selectDashboard(dashboard) {
- this.$emit(events.selectDashboard, dashboard);
- },
- },
-};
-</script>
-<template>
- <gl-dropdown
- toggle-class="dropdown-menu-toggle"
- menu-class="monitor-dashboard-dropdown-menu"
- :text="selectedDashboardText"
- >
- <div class="d-flex flex-column overflow-hidden">
- <gl-dropdown-section-header>{{ __('Dashboard') }}</gl-dropdown-section-header>
- <gl-search-box-by-type ref="monitorDashboardsDropdownSearch" v-model="searchTerm" />
-
- <div class="flex-fill overflow-auto">
- <gl-dropdown-item
- v-for="dashboard in starredDashboards"
- :key="dashboard.path"
- is-check-item
- :is-checked="dashboard.path === selectedDashboardPath"
- @click="selectDashboard(dashboard)"
- >
- <div class="gl-display-flex">
- <span class="gl-flex-grow-1 gl-min-w-0 gl-overflow-hidden gl-overflow-wrap-break">
- {{ dashboardDisplayName(dashboard) }}
- </span>
- <gl-icon class="text-muted gl-flex-shrink-0 gl-ml-3 gl-align-self-center" name="star" />
- </div>
- </gl-dropdown-item>
- <gl-dropdown-divider
- v-if="starredDashboards.length && nonStarredDashboards.length"
- ref="starredListDivider"
- />
-
- <gl-dropdown-item
- v-for="dashboard in nonStarredDashboards"
- :key="dashboard.path"
- is-check-item
- :is-checked="dashboard.path === selectedDashboardPath"
- @click="selectDashboard(dashboard)"
- >
- <span class="gl-overflow-hidden gl-overflow-wrap-break">
- {{ dashboardDisplayName(dashboard) }}
- </span>
- </gl-dropdown-item>
- </div>
-
- <div
- v-show="shouldShowNoMsgContainer"
- ref="monitorDashboardsDropdownMsg"
- class="text-secondary no-matches-message"
- >
- {{ __('No matching results') }}
- </div>
- </div>
- </gl-dropdown>
-</template>
diff --git a/app/assets/javascripts/monitoring/components/duplicate_dashboard_form.vue b/app/assets/javascripts/monitoring/components/duplicate_dashboard_form.vue
deleted file mode 100644
index 9ad14b3d52e..00000000000
--- a/app/assets/javascripts/monitoring/components/duplicate_dashboard_form.vue
+++ /dev/null
@@ -1,138 +0,0 @@
-<script>
-import { GlFormGroup, GlFormInput, GlFormRadioGroup, GlFormTextarea } from '@gitlab/ui';
-import { escape as esc } from 'lodash';
-import { __, s__, sprintf } from '~/locale';
-
-const defaultFileName = (dashboard) => dashboard.path.split('/').reverse()[0];
-
-export default {
- components: {
- GlFormGroup,
- GlFormInput,
- GlFormRadioGroup,
- GlFormTextarea,
- },
- props: {
- dashboard: {
- type: Object,
- required: true,
- },
- defaultBranch: {
- type: String,
- required: true,
- },
- },
- radioVals: {
- /* Use the default branch (e.g. main) */
- DEFAULT: 'DEFAULT',
- /* Create a new branch */
- NEW: 'NEW',
- },
- data() {
- return {
- form: {
- dashboard: this.dashboard.path,
- fileName: defaultFileName(this.dashboard),
- commitMessage: '',
- },
- branchName: '',
- branchOption: this.$options.radioVals.NEW,
- branchOptions: [
- {
- value: this.$options.radioVals.DEFAULT,
- html: sprintf(
- __('Commit to %{branchName} branch'),
- {
- branchName: `<strong>${esc(this.defaultBranch)}</strong>`,
- },
- false,
- ),
- },
- { value: this.$options.radioVals.NEW, text: __('Create new branch') },
- ],
- };
- },
- computed: {
- defaultCommitMsg() {
- return sprintf(s__('Metrics|Create custom dashboard %{fileName}'), {
- fileName: this.form.fileName,
- });
- },
- fileNameState() {
- // valid if empty or *.yml
- return !(this.form.fileName && !this.form.fileName.endsWith('.yml'));
- },
- fileNameFeedback() {
- return !this.fileNameState ? __('The file name should have a .yml extension') : '';
- },
- },
- mounted() {
- this.change();
- },
- methods: {
- change() {
- this.$emit('change', {
- ...this.form,
- commitMessage: this.form.commitMessage || this.defaultCommitMsg,
- branch:
- this.branchOption === this.$options.radioVals.NEW ? this.branchName : this.defaultBranch,
- });
- },
- focus(option) {
- if (option === this.$options.radioVals.NEW) {
- this.$nextTick(() => {
- this.$refs.branchName.$el.focus();
- });
- }
- },
- },
-};
-</script>
-<template>
- <form @change="change">
- <p class="text-muted">
- {{
- s__(`Metrics|You can save a copy of this dashboard to your repository
- so it can be customized. Select a file name and branch to save it.`)
- }}
- </p>
- <gl-form-group
- ref="fileNameFormGroup"
- :label="__('File name')"
- :state="fileNameState"
- :invalid-feedback="fileNameFeedback"
- label-size="sm"
- label-for="fileName"
- >
- <gl-form-input id="fileName" ref="fileName" v-model="form.fileName" :required="true" />
- </gl-form-group>
- <gl-form-group :label="__('Branch')" label-size="sm" label-for="branch">
- <gl-form-radio-group
- ref="branchOption"
- v-model="branchOption"
- :checked="$options.radioVals.NEW"
- :stacked="true"
- :options="branchOptions"
- @change="focus"
- />
- <gl-form-input
- v-show="branchOption === $options.radioVals.NEW"
- id="branchName"
- ref="branchName"
- v-model="branchName"
- />
- </gl-form-group>
- <gl-form-group
- :label="__('Commit message (optional)')"
- label-size="sm"
- label-for="commitMessage"
- >
- <gl-form-textarea
- id="commitMessage"
- ref="commitMessage"
- v-model="form.commitMessage"
- :placeholder="defaultCommitMsg"
- />
- </gl-form-group>
- </form>
-</template>
diff --git a/app/assets/javascripts/monitoring/components/duplicate_dashboard_modal.vue b/app/assets/javascripts/monitoring/components/duplicate_dashboard_modal.vue
deleted file mode 100644
index d1ce7bad39a..00000000000
--- a/app/assets/javascripts/monitoring/components/duplicate_dashboard_modal.vue
+++ /dev/null
@@ -1,106 +0,0 @@
-<script>
-import { GlAlert, GlModal } from '@gitlab/ui';
-import { mapActions, mapGetters } from 'vuex';
-import { __, s__ } from '~/locale';
-import DuplicateDashboardForm from './duplicate_dashboard_form.vue';
-
-const events = {
- dashboardDuplicated: 'dashboardDuplicated',
-};
-
-export default {
- components: { GlAlert, GlModal, DuplicateDashboardForm },
- props: {
- defaultBranch: {
- type: String,
- required: true,
- },
- modalId: {
- type: String,
- required: true,
- },
- },
- data() {
- return {
- alert: null,
- loading: false,
- form: {},
- };
- },
- computed: {
- ...mapGetters('monitoringDashboard', ['selectedDashboard']),
- okButtonText() {
- return this.loading ? s__('Metrics|Duplicating...') : s__('Metrics|Duplicate');
- },
- actionPrimaryProps() {
- return {
- text: this.okButtonText,
- attributes: {
- loading: this.loading,
- variant: 'confirm',
- },
- };
- },
- actionCancelProps() {
- return {
- text: __('Cancel'),
- };
- },
- },
- methods: {
- ...mapActions('monitoringDashboard', ['duplicateSystemDashboard']),
- ok(bvModalEvt) {
- // Prevent modal from hiding in case submit fails
- bvModalEvt.preventDefault();
-
- this.loading = true;
- this.alert = null;
- this.duplicateSystemDashboard(this.form)
- .then((createdDashboard) => {
- this.loading = false;
- this.alert = null;
-
- // Trigger hide modal as submit is successful
- this.$refs.duplicateDashboardModal.hide();
-
- // Dashboards in the default branch become available immediately.
- // Not so in other branches, so we refresh the current dashboard
- const dashboard =
- this.form.branch === this.defaultBranch ? createdDashboard : this.selectedDashboard;
- this.$emit(events.dashboardDuplicated, dashboard);
- })
- .catch((error) => {
- this.loading = false;
- this.alert = error;
- });
- },
- hide() {
- this.alert = null;
- },
- formChange(form) {
- this.form = form;
- },
- },
-};
-</script>
-
-<template>
- <gl-modal
- ref="duplicateDashboardModal"
- :modal-id="modalId"
- :title="s__('Metrics|Duplicate dashboard')"
- :action-primary="actionPrimaryProps"
- :action-cancel="actionCancelProps"
- @ok="ok"
- @hide="hide"
- >
- <gl-alert v-if="alert" class="mb-3" variant="danger" @dismiss="alert = null">
- {{ alert }}
- </gl-alert>
- <duplicate-dashboard-form
- :dashboard="selectedDashboard"
- :default-branch="defaultBranch"
- @change="formChange"
- />
- </gl-modal>
-</template>
diff --git a/app/assets/javascripts/monitoring/components/embeds/embed_group.vue b/app/assets/javascripts/monitoring/components/embeds/embed_group.vue
deleted file mode 100644
index 8eef3d69a4f..00000000000
--- a/app/assets/javascripts/monitoring/components/embeds/embed_group.vue
+++ /dev/null
@@ -1,102 +0,0 @@
-<script>
-import { GlButton, GlCard, GlIcon } from '@gitlab/ui';
-import sum from 'lodash/sum';
-import { mapState, mapActions, mapGetters } from 'vuex';
-import { n__ } from '~/locale';
-import { monitoringDashboard } from '~/monitoring/stores';
-import MetricEmbed from './metric_embed.vue';
-
-export default {
- components: {
- GlButton,
- GlCard,
- GlIcon,
- MetricEmbed,
- },
- props: {
- urls: {
- type: Array,
- required: true,
- validator: (urls) => urls.length > 0,
- },
- },
- data() {
- return {
- isCollapsed: false,
- };
- },
- computed: {
- ...mapState('embedGroup', ['module']),
- ...mapGetters('embedGroup', ['metricsWithData']),
- arrowIconName() {
- return this.isCollapsed ? 'chevron-right' : 'chevron-down';
- },
- bodyClass() {
- return ['border-top', 'pl-3', 'pt-3', { 'd-none': this.isCollapsed }];
- },
- buttonLabel() {
- return this.isCollapsed
- ? n__('View chart', 'View charts', this.numCharts)
- : n__('Hide chart', 'Hide charts', this.numCharts);
- },
- containerClass() {
- return this.isSingleChart ? 'col-lg-12' : 'col-lg-6';
- },
- numCharts() {
- if (this.metricsWithData === null) {
- return 0;
- }
- return sum(this.metricsWithData);
- },
- isSingleChart() {
- return this.numCharts === 1;
- },
- },
- created() {
- this.urls.forEach((url, index) => {
- const name = this.getNamespace(index);
- this.$store.registerModule(name, monitoringDashboard);
- this.addModule(name);
- });
- },
- methods: {
- ...mapActions('embedGroup', ['addModule']),
- getNamespace(id) {
- return `monitoringDashboard/${id}`;
- },
- toggleCollapsed() {
- this.isCollapsed = !this.isCollapsed;
- },
- },
-};
-</script>
-<template>
- <gl-card
- v-show="numCharts > 0"
- class="collapsible-card border p-0 gl-mb-5"
- header-class="d-flex align-items-center border-bottom-0 py-2"
- :body-class="bodyClass"
- >
- <template #header>
- <gl-button
- class="collapsible-card-btn gl-display-flex gl-text-decoration-none gl-reset-color! gl-hover-text-blue-800! gl-shadow-none!"
- :aria-label="buttonLabel"
- variant="link"
- category="tertiary"
- @click="toggleCollapsed"
- >
- <gl-icon class="mr-1" :name="arrowIconName" />
- {{ buttonLabel }}
- </gl-button>
- </template>
- <div class="d-flex flex-wrap">
- <metric-embed
- v-for="(url, index) in urls"
- :key="`${index}/${url}`"
- :dashboard-url="url"
- :namespace="getNamespace(index)"
- :container-class="containerClass"
- />
- </div>
- </gl-card>
-</template>
diff --git a/app/assets/javascripts/monitoring/components/embeds/metric_embed.vue b/app/assets/javascripts/monitoring/components/embeds/metric_embed.vue
deleted file mode 100644
index 25500747573..00000000000
--- a/app/assets/javascripts/monitoring/components/embeds/metric_embed.vue
+++ /dev/null
@@ -1,125 +0,0 @@
-<script>
-import { mapState, mapActions } from 'vuex';
-import { convertToFixedRange } from '~/lib/utils/datetime_range';
-import DashboardPanel from '~/monitoring/components/dashboard_panel.vue';
-import { defaultTimeRange } from '~/vue_shared/constants';
-import { sidebarAnimationDuration } from '../../constants';
-import { timeRangeFromUrl, removeTimeRangeParams } from '../../utils';
-
-let sidebarMutationObserver;
-
-export default {
- components: {
- DashboardPanel,
- },
- props: {
- containerClass: {
- type: String,
- required: false,
- default: 'col-lg-12',
- },
- dashboardUrl: {
- type: String,
- required: true,
- },
- namespace: {
- type: String,
- required: false,
- default: 'monitoringDashboard',
- },
- },
- data() {
- const timeRange = timeRangeFromUrl(this.dashboardUrl) || defaultTimeRange;
- return {
- timeRange: convertToFixedRange(timeRange),
- elWidth: 0,
- };
- },
- computed: {
- ...mapState({
- dashboard(state) {
- return state[this.namespace].dashboard;
- },
- metricsWithData(state, getters) {
- return getters[`${this.namespace}/metricsWithData`]();
- },
- }),
- charts() {
- if (!this.dashboard || !this.dashboard.panelGroups) {
- return [];
- }
- return this.dashboard.panelGroups.reduce(
- (acc, currentGroup) => acc.concat(currentGroup.panels.filter(this.chartHasData)),
- [],
- );
- },
- isSingleChart() {
- return this.charts.length === 1;
- },
- embedClass() {
- return this.isSingleChart ? this.containerClass : 'col-lg-12';
- },
- panelClass() {
- return this.isSingleChart ? 'col-lg-12' : 'col-lg-6';
- },
- },
- mounted() {
- this.setInitialState({
- dashboardEndpoint: removeTimeRangeParams(this.dashboardUrl),
- });
- this.setShowErrorBanner(false);
- this.setTimeRange(this.timeRange);
- this.fetchDashboard();
-
- sidebarMutationObserver = new MutationObserver(this.onSidebarMutation);
- sidebarMutationObserver.observe(document.querySelector('.layout-page'), {
- attributes: true,
- childList: false,
- subtree: false,
- });
- },
- beforeDestroy() {
- if (sidebarMutationObserver) {
- sidebarMutationObserver.disconnect();
- }
- },
- methods: {
- // Use function args to support dynamic namespaces in mapXXX helpers. Pattern described
- // in https://github.com/vuejs/vuex/issues/863#issuecomment-329510765
- ...mapActions({
- setTimeRange(dispatch, payload) {
- return dispatch(`${this.namespace}/setTimeRange`, payload);
- },
- fetchDashboard(dispatch, payload) {
- return dispatch(`${this.namespace}/fetchDashboard`, payload);
- },
- setInitialState(dispatch, payload) {
- return dispatch(`${this.namespace}/setInitialState`, payload);
- },
- setShowErrorBanner(dispatch, payload) {
- return dispatch(`${this.namespace}/setShowErrorBanner`, payload);
- },
- }),
- chartHasData(chart) {
- return chart.metrics.some((metric) => this.metricsWithData.includes(metric.metricId));
- },
- onSidebarMutation() {
- setTimeout(() => {
- this.elWidth = this.$el.clientWidth;
- }, sidebarAnimationDuration);
- },
- },
-};
-</script>
-<template>
- <div class="metrics-embed p-0 d-flex flex-wrap" :class="embedClass">
- <dashboard-panel
- v-for="(graphData, graphIndex) in charts"
- :key="`dashboard-panel-${graphIndex}`"
- :class="panelClass"
- :graph-data="graphData"
- :group-id="dashboardUrl"
- :namespace="namespace"
- />
- </div>
-</template>
diff --git a/app/assets/javascripts/monitoring/components/empty_state.vue b/app/assets/javascripts/monitoring/components/empty_state.vue
deleted file mode 100644
index 867f7139d71..00000000000
--- a/app/assets/javascripts/monitoring/components/empty_state.vue
+++ /dev/null
@@ -1,114 +0,0 @@
-<script>
-import { GlLoadingIcon, GlEmptyState } from '@gitlab/ui';
-import { __ } from '~/locale';
-import { dashboardEmptyStates } from '../constants';
-
-export default {
- components: {
- GlLoadingIcon,
- GlEmptyState,
- },
- props: {
- selectedState: {
- type: String,
- required: true,
- validator: (state) => Object.values(dashboardEmptyStates).includes(state),
- },
- documentationPath: {
- type: String,
- required: true,
- },
- settingsPath: {
- type: String,
- required: false,
- default: '',
- },
- clustersPath: {
- type: String,
- required: false,
- default: '',
- },
- emptyGettingStartedSvgPath: {
- type: String,
- required: true,
- },
- emptyLoadingSvgPath: {
- type: String,
- required: true,
- },
- emptyNoDataSvgPath: {
- type: String,
- required: true,
- },
- emptyNoDataSmallSvgPath: {
- type: String,
- required: true,
- },
- emptyUnableToConnectSvgPath: {
- type: String,
- required: true,
- },
- compact: {
- type: Boolean,
- required: false,
- default: false,
- },
- },
- data() {
- return {
- /**
- * Possible empty states.
- * Keys in each state must match GlEmptyState props
- */
- states: {
- [dashboardEmptyStates.GETTING_STARTED]: {
- svgPath: this.emptyGettingStartedSvgPath,
- title: __('Get started with performance monitoring'),
- description: __(`Stay updated about the performance and health
- of your environment by configuring Prometheus to monitor your deployments.`),
- primaryButtonText: __('Install on clusters'),
- primaryButtonLink: this.clustersPath,
- secondaryButtonText: __('Configure existing installation'),
- secondaryButtonLink: this.settingsPath,
- },
- [dashboardEmptyStates.NO_DATA]: {
- svgPath: this.emptyNoDataSvgPath,
- title: __('No data found'),
- description: __(`You are connected to the Prometheus server, but there is currently
- no data to display.`),
- primaryButtonText: __('Configure Prometheus'),
- primaryButtonLink: this.settingsPath,
- secondaryButtonText: '',
- secondaryButtonLink: '',
- },
- [dashboardEmptyStates.UNABLE_TO_CONNECT]: {
- svgPath: this.emptyUnableToConnectSvgPath,
- title: __('Unable to connect to Prometheus server'),
- description: __(
- 'Ensure connectivity is available from the GitLab server to the Prometheus server',
- ),
- primaryButtonText: __('View documentation'),
- primaryButtonLink: this.documentationPath,
- secondaryButtonText: __('Configure Prometheus'),
- secondaryButtonLink: this.settingsPath,
- },
- },
- };
- },
- computed: {
- isLoading() {
- return this.selectedState === dashboardEmptyStates.LOADING;
- },
- currentState() {
- return this.states[this.selectedState];
- },
- },
-};
-</script>
-
-<template>
- <div>
- <gl-loading-icon v-if="isLoading" size="xl" class="gl-my-9" />
- <gl-empty-state v-if="currentState" v-bind="currentState" :compact="compact" />
- </div>
-</template>
diff --git a/app/assets/javascripts/monitoring/components/graph_group.vue b/app/assets/javascripts/monitoring/components/graph_group.vue
deleted file mode 100644
index 74a806c50a9..00000000000
--- a/app/assets/javascripts/monitoring/components/graph_group.vue
+++ /dev/null
@@ -1,87 +0,0 @@
-<script>
-import { GlLoadingIcon, GlIcon } from '@gitlab/ui';
-
-export default {
- components: {
- GlLoadingIcon,
- GlIcon,
- },
- props: {
- name: {
- type: String,
- required: true,
- },
- showPanels: {
- type: Boolean,
- required: false,
- default: true,
- },
- isLoading: {
- type: Boolean,
- required: false,
- default: false,
- },
- /**
- * Initial value of collapse on mount.
- */
- collapseGroup: {
- type: Boolean,
- required: false,
- default: false,
- },
- },
- data() {
- return {
- isCollapsed: this.collapseGroup,
- };
- },
- computed: {
- caretIcon() {
- return this.isCollapsed ? 'chevron-lg-right' : 'chevron-lg-down';
- },
- },
- watch: {
- collapseGroup(val) {
- // Respond to changes in collapseGroup but do not
- // collapse it once was opened by the user.
- if (this.showPanels && !val) {
- this.isCollapsed = false;
- }
- },
- },
- methods: {
- collapse() {
- this.isCollapsed = !this.isCollapsed;
- },
- },
-};
-</script>
-
-<template>
- <div v-if="showPanels" ref="graph-group" class="card prometheus-panel">
- <div class="card-header d-flex align-items-center">
- <h4 class="flex-grow-1">{{ name }}</h4>
- <gl-loading-icon v-if="isLoading" size="sm" name="loading" />
- <a
- data-testid="group-toggle-button"
- :aria-label="__('Toggle collapse')"
- :icon="caretIcon"
- role="button"
- class="js-graph-group-toggle gl-display-flex gl-ml-2 gl-text-gray-900"
- tabindex="0"
- @click="collapse"
- @keyup.enter="collapse"
- >
- <gl-icon :name="caretIcon" />
- </a>
- </div>
- <div
- v-show="!isCollapsed"
- ref="graph-group-content"
- class="card-body prometheus-graph-group p-0"
- >
- <slot></slot>
- </div>
- </div>
- <div v-else ref="graph-group-content" class="prometheus-graph-group"><slot></slot></div>
-</template>
diff --git a/app/assets/javascripts/monitoring/components/group_empty_state.vue b/app/assets/javascripts/monitoring/components/group_empty_state.vue
deleted file mode 100644
index a67770b93be..00000000000
--- a/app/assets/javascripts/monitoring/components/group_empty_state.vue
+++ /dev/null
@@ -1,109 +0,0 @@
-<script>
-import { GlEmptyState } from '@gitlab/ui';
-import SafeHtml from '~/vue_shared/directives/safe_html';
-import { __, sprintf } from '~/locale';
-import { metricStates } from '../constants';
-
-export default {
- components: {
- GlEmptyState,
- },
- directives: {
- SafeHtml,
- },
- props: {
- documentationPath: {
- type: String,
- required: true,
- },
- settingsPath: {
- type: String,
- required: true,
- },
- selectedState: {
- type: String,
- required: true,
- },
- svgPath: {
- type: String,
- required: true,
- },
- },
- data() {
- const documentationLink = `<a href="${this.documentationPath}">${__('More information')}</a>`;
- return {
- states: {
- [metricStates.NO_DATA]: {
- title: __('No data to display'),
- slottedDescription: sprintf(
- __(
- 'The data source is connected, but there is no data to display. %{documentationLink}',
- ),
- { documentationLink },
- false,
- ),
- },
- [metricStates.TIMEOUT]: {
- title: __('Connection timed out'),
- slottedDescription: sprintf(
- __(
- "Charts can't be displayed as the request for data has timed out. %{documentationLink}",
- ),
- { documentationLink },
- false,
- ),
- },
- [metricStates.CONNECTION_FAILED]: {
- title: __('Connection failed'),
- description: __(`We couldn't reach the Prometheus server.
- Either the server no longer exists or the configuration details need updating.`),
- buttonText: __('Verify configuration'),
- buttonPath: this.settingsPath,
- },
- [metricStates.BAD_QUERY]: {
- title: __('Query cannot be processed'),
- slottedDescription: sprintf(
- __(
- `The Prometheus server responded with "bad request".
- Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}`,
- ),
- { documentationLink },
- false,
- ),
- buttonText: __('Verify configuration'),
- buttonPath: this.settingsPath,
- },
- [metricStates.LOADING]: {
- title: __('Waiting for performance data'),
- description: __(`Creating graphs uses the data from the Prometheus server.
- If this takes a long time, ensure that data is available.`),
- },
- [metricStates.UNKNOWN_ERROR]: {
- title: __('An error has occurred'),
- description: __('An error occurred while loading the data. Please try again.'),
- },
- },
- };
- },
- computed: {
- currentState() {
- return this.states[this.selectedState] || this.states[metricStates.UNKNOWN_ERROR];
- },
- },
-};
-</script>
-
-<template>
- <gl-empty-state
- :title="currentState.title"
- :primary-button-text="currentState.buttonText"
- :primary-button-link="currentState.buttonPath"
- :description="currentState.description"
- :svg-path="svgPath"
- :compact="true"
- >
- <template v-if="currentState.slottedDescription" #description>
- <div v-safe-html="currentState.slottedDescription"></div>
- </template>
- </gl-empty-state>
-</template>
diff --git a/app/assets/javascripts/monitoring/components/links_section.vue b/app/assets/javascripts/monitoring/components/links_section.vue
deleted file mode 100644
index fb5ab12916e..00000000000
--- a/app/assets/javascripts/monitoring/components/links_section.vue
+++ /dev/null
@@ -1,32 +0,0 @@
-<script>
-import { GlIcon, GlLink } from '@gitlab/ui';
-import { mapGetters } from 'vuex';
-
-export default {
- components: {
- GlIcon,
- GlLink,
- },
- computed: {
- ...mapGetters('monitoringDashboard', { links: 'linksWithMetadata' }),
- },
-};
-</script>
-<template>
- <div
- ref="linksSection"
- class="gl-sm-display-flex gl-sm-flex-wrap gl-mt-5 gl-p-3 gl-bg-gray-10 border gl-rounded-base links-section"
- >
- <div
- v-for="(link, key) in links"
- :key="key"
- class="gl-mb-1 gl-mr-5 gl-display-flex gl-sm-display-block gl-hover-text-blue-600-children gl-word-break-all"
- >
- <gl-link :href="link.url" class="gl-text-gray-900 gl-text-decoration-none!"
- ><gl-icon name="link" class="gl-text-gray-500 gl-vertical-align-text-bottom gl-mr-2" />{{
- link.title
- }}
- </gl-link>
- </div>
- </div>
-</template>
diff --git a/app/assets/javascripts/monitoring/components/refresh_button.vue b/app/assets/javascripts/monitoring/components/refresh_button.vue
deleted file mode 100644
index 55c602db33d..00000000000
--- a/app/assets/javascripts/monitoring/components/refresh_button.vue
+++ /dev/null
@@ -1,168 +0,0 @@
-<script>
-import {
- GlButtonGroup,
- GlButton,
- GlDropdown,
- GlDropdownItem,
- GlDropdownDivider,
- GlTooltipDirective,
-} from '@gitlab/ui';
-import Visibility from 'visibilityjs';
-import { mapActions } from 'vuex';
-import { n__, __, s__ } from '~/locale';
-
-const makeInterval = (length = 0, unit = 's') => {
- const shortLabel = `${length}${unit}`;
- switch (unit) {
- case 'd':
- return {
- interval: length * 24 * 60 * 60 * 1000,
- shortLabel,
- label: n__('%d day', '%d days', length),
- };
- case 'h':
- return {
- interval: length * 60 * 60 * 1000,
- shortLabel,
- label: n__('%d hour', '%d hours', length),
- };
- case 'm':
- return {
- interval: length * 60 * 1000,
- shortLabel,
- label: n__('%d minute', '%d minutes', length),
- };
- case 's':
- default:
- return {
- interval: length * 1000,
- shortLabel,
- label: n__('%d second', '%d seconds', length),
- };
- }
-};
-
-export default {
- i18n: {
- refreshDashboard: s__('Metrics|Refresh dashboard'),
- },
- components: {
- GlButtonGroup,
- GlButton,
- GlDropdown,
- GlDropdownItem,
- GlDropdownDivider,
- },
- directives: {
- GlTooltip: GlTooltipDirective,
- },
- data() {
- return {
- refreshInterval: null,
- timeoutId: null,
- };
- },
- computed: {
- dropdownText() {
- return this.refreshInterval?.shortLabel ?? __('Off');
- },
- },
- watch: {
- refreshInterval() {
- if (this.refreshInterval !== null) {
- this.startAutoRefresh();
- } else {
- this.stopAutoRefresh();
- }
- },
- },
- destroyed() {
- this.stopAutoRefresh();
- },
- methods: {
- ...mapActions('monitoringDashboard', ['fetchDashboardData']),
-
- refresh() {
- this.fetchDashboardData();
- },
- startAutoRefresh() {
- const schedule = () => {
- if (this.refreshInterval) {
- this.timeoutId = setTimeout(this.startAutoRefresh, this.refreshInterval.interval);
- }
- };
-
- this.stopAutoRefresh();
-
- if (Visibility.hidden()) {
- // Inactive tab? Skip fetch and schedule again
- schedule();
- } else {
- // Active tab! Fetch data and then schedule when settled
- // eslint-disable-next-line promise/catch-or-return
- this.fetchDashboardData().finally(schedule);
- }
- },
- stopAutoRefresh() {
- clearTimeout(this.timeoutId);
- this.timeoutId = null;
- },
-
- setRefreshInterval(option) {
- this.refreshInterval = option;
- },
- removeRefreshInterval() {
- this.refreshInterval = null;
- },
- isChecked(option) {
- if (this.refreshInterval) {
- return option.interval === this.refreshInterval.interval;
- }
- return false;
- },
- },
-
- refreshIntervals: [
- makeInterval(5),
- makeInterval(10),
- makeInterval(30),
- makeInterval(5, 'm'),
- makeInterval(30, 'm'),
- makeInterval(1, 'h'),
- makeInterval(2, 'h'),
- makeInterval(12, 'h'),
- makeInterval(1, 'd'),
- ],
-};
-</script>
-
-<template>
- <gl-button-group>
- <gl-button
- v-gl-tooltip
- class="gl-flex-grow-1"
- variant="default"
- :title="$options.i18n.refreshDashboard"
- :aria-label="$options.i18n.refreshDashboard"
- icon="retry"
- @click="refresh"
- />
- <gl-dropdown v-gl-tooltip :title="s__('Metrics|Set refresh rate')" :text="dropdownText">
- <gl-dropdown-item
- is-check-item
- :is-checked="refreshInterval === null"
- @click="removeRefreshInterval()"
- >{{ __('Off') }}</gl-dropdown-item
- >
- <gl-dropdown-divider />
- <gl-dropdown-item
- v-for="(option, i) in $options.refreshIntervals"
- :key="i"
- is-check-item
- :is-checked="isChecked(option)"
- @click="setRefreshInterval(option)"
- >{{ option.label }}</gl-dropdown-item
- >
- </gl-dropdown>
- </gl-button-group>
-</template>
diff --git a/app/assets/javascripts/monitoring/components/variables/dropdown_field.vue b/app/assets/javascripts/monitoring/components/variables/dropdown_field.vue
deleted file mode 100644
index ff0327f5f99..00000000000
--- a/app/assets/javascripts/monitoring/components/variables/dropdown_field.vue
+++ /dev/null
@@ -1,53 +0,0 @@
-<script>
-import { GlFormGroup, GlDropdown, GlDropdownItem } from '@gitlab/ui';
-
-export default {
- components: {
- GlFormGroup,
- GlDropdown,
- GlDropdownItem,
- },
- props: {
- name: {
- type: String,
- required: true,
- },
- label: {
- type: String,
- required: true,
- },
- value: {
- type: String,
- required: false,
- default: '',
- },
- options: {
- type: Object,
- required: true,
- },
- },
- computed: {
- text() {
- const selectedOpt = this.options.values?.find((opt) => opt.value === this.value);
- return selectedOpt?.text || this.value;
- },
- },
- methods: {
- onUpdate(value) {
- this.$emit('input', value);
- },
- },
-};
-</script>
-<template>
- <gl-form-group :label="label">
- <gl-dropdown toggle-class="dropdown-menu-toggle" :text="text || s__('Metrics|Select a value')">
- <gl-dropdown-item
- v-for="val in options.values"
- :key="val.value"
- @click="onUpdate(val.value)"
- >{{ val.text }}</gl-dropdown-item
- >
- </gl-dropdown>
- </gl-form-group>
-</template>
diff --git a/app/assets/javascripts/monitoring/components/variables/text_field.vue b/app/assets/javascripts/monitoring/components/variables/text_field.vue
deleted file mode 100644
index a0418806e5f..00000000000
--- a/app/assets/javascripts/monitoring/components/variables/text_field.vue
+++ /dev/null
@@ -1,39 +0,0 @@
-<script>
-import { GlFormGroup, GlFormInput } from '@gitlab/ui';
-
-export default {
- components: {
- GlFormGroup,
- GlFormInput,
- },
- props: {
- name: {
- type: String,
- required: true,
- },
- label: {
- type: String,
- required: true,
- },
- value: {
- type: String,
- required: true,
- },
- },
- methods: {
- onUpdate(event) {
- this.$emit('input', event.target.value);
- },
- },
-};
-</script>
-<template>
- <gl-form-group :label="label">
- <gl-form-input
- :value="value"
- :name="name"
- @keyup.native.enter="onUpdate"
- @blur.native="onUpdate"
- />
- </gl-form-group>
-</template>
diff --git a/app/assets/javascripts/monitoring/components/variables_section.vue b/app/assets/javascripts/monitoring/components/variables_section.vue
deleted file mode 100644
index 971f188e9f3..00000000000
--- a/app/assets/javascripts/monitoring/components/variables_section.vue
+++ /dev/null
@@ -1,53 +0,0 @@
-<script>
-import { mapState, mapActions } from 'vuex';
-import { VARIABLE_TYPES } from '../constants';
-import { setCustomVariablesFromUrl } from '../utils';
-import DropdownField from './variables/dropdown_field.vue';
-import TextField from './variables/text_field.vue';
-
-export default {
- components: {
- DropdownField,
- TextField,
- },
- computed: {
- ...mapState('monitoringDashboard', ['variables']),
- },
- methods: {
- ...mapActions('monitoringDashboard', ['updateVariablesAndFetchData']),
- refreshDashboard(variable, value) {
- if (variable.value !== value) {
- this.updateVariablesAndFetchData({ name: variable.name, value });
- // update the Vuex store
- // the below calls can ideally be moved out of the
- // component and into the actions and let the
- // mutation respond directly.
- // This can be further investigate in
- // https://gitlab.com/gitlab-org/gitlab/-/issues/217713
- setCustomVariablesFromUrl(this.variables);
- }
- },
- variableField(type) {
- if (type === VARIABLE_TYPES.custom || type === VARIABLE_TYPES.metric_label_values) {
- return DropdownField;
- }
- return TextField;
- },
- },
-};
-</script>
-<template>
- <div ref="variablesSection" class="d-sm-flex flex-sm-wrap pt-2 pr-1 pb-0 pl-2 variables-section">
- <div v-for="variable in variables" :key="variable.name" class="mb-1 pr-2 d-flex d-sm-block">
- <component
- :is="variableField(variable.type)"
- class="mb-0 flex-grow-1"
- :label="variable.label"
- :value="variable.value"
- :name="variable.name"
- :options="variable.options"
- @input="refreshDashboard(variable, $event)"
- />
- </div>
- </div>
-</template>
diff --git a/app/assets/javascripts/monitoring/constants.js b/app/assets/javascripts/monitoring/constants.js
deleted file mode 100644
index e35dcc350f2..00000000000
--- a/app/assets/javascripts/monitoring/constants.js
+++ /dev/null
@@ -1,262 +0,0 @@
-export const PROMETHEUS_TIMEOUT = 120000; // TWO_MINUTES
-
-export const dashboardEmptyStates = {
- GETTING_STARTED: 'gettingStarted',
- LOADING: 'loading',
- NO_DATA: 'noData',
- UNABLE_TO_CONNECT: 'unableToConnect',
-};
-
-/**
- * States and error states in Prometheus Queries (PromQL) for metrics
- */
-export const metricStates = {
- /**
- * Metric data is available
- */
- OK: 'OK',
-
- /**
- * Metric data is being fetched for the first time.
- *
- * Not used during data refresh, if data is available in
- * the metric, the recommneded state is OK.
- */
- LOADING: 'LOADING',
-
- /**
- * Connection timed out to prometheus server
- * the timeout is set to PROMETHEUS_TIMEOUT
- *
- */
- TIMEOUT: 'TIMEOUT',
-
- /**
- * The prometheus server replies with an empty data set
- */
- NO_DATA: 'NO_DATA',
-
- /**
- * The prometheus server cannot be reached
- */
- CONNECTION_FAILED: 'CONNECTION_FAILED',
-
- /**
- * The prometheus server was reached but it cannot process
- * the query. This can happen for several reasons:
- * - PromQL syntax is incorrect
- * - An operator is not supported
- */
- BAD_QUERY: 'BAD_QUERY',
-
- /**
- * No specific reason found for error
- */
- UNKNOWN_ERROR: 'UNKNOWN_ERROR',
-};
-
-/**
- * Supported panel types in dashboards, values of `panel.type`.
- *
- * Values should not be changed as they correspond to
- * values in users the `.yml` dashboard definition.
- */
-export const panelTypes = {
- /**
- * Area Chart
- *
- * Time Series chart with an area
- */
- AREA_CHART: 'area-chart',
- /**
- * Line Chart
- *
- * Time Series chart with a line
- */
- LINE_CHART: 'line-chart',
- /**
- * Anomaly Chart
- *
- * Time Series chart with 3 metrics
- */
- ANOMALY_CHART: 'anomaly-chart',
- /**
- * Single Stat
- *
- * Single data point visualization
- */
- SINGLE_STAT: 'single-stat',
- /**
- * Gauge
- */
- GAUGE_CHART: 'gauge',
- /**
- * Heatmap
- */
- HEATMAP: 'heatmap',
- /**
- * Bar chart
- */
- BAR: 'bar',
- /**
- * Column chart
- */
- COLUMN: 'column',
- /**
- * Stacked column chart
- */
- STACKED_COLUMN: 'stacked-column',
-};
-
-export const sidebarAnimationDuration = 300; // milliseconds.
-export const chartHeight = 300;
-
-export const graphTypes = {
- annotationsData: 'scatter',
-};
-
-export const symbolSizes = {
- anomaly: 8,
- default: 14,
-};
-
-export const areaOpacityValues = {
- default: 0.2,
-};
-
-export const colorValues = {
- primaryColor: '#1f78d1', // $blue-500 (see variables.scss)
- anomalySymbol: '#db3b21',
- anomalyAreaColor: '#1f78d1',
-};
-
-export const lineTypes = {
- default: 'solid',
-};
-
-export const lineWidths = {
- default: 2,
-};
-
-/**
- * User-defined links can be passed in dashboard yml file.
- * These are the supported type of links.
- */
-export const linkTypes = {
- GRAFANA: 'grafana',
-};
-
-/**
- * These are the supported values for the GitLab-UI
- * chart legend layout.
- *
- * Currently defined in
- * https://gitlab.com/gitlab-org/gitlab-ui/-/blob/main/src/utils/charts/constants.js
- *
- */
-export const legendLayoutTypes = {
- inline: 'inline',
- table: 'table',
-};
-
-/**
- * These Vuex store properties are allowed to be
- * replaced dynamically after component has been created
- * and initial state has been set.
- *
- * Currently used in `receiveMetricsDashboardSuccess` action.
- */
-export const endpointKeys = [
- 'deploymentsEndpoint',
- 'dashboardEndpoint',
- 'dashboardsEndpoint',
- 'currentDashboard',
- 'projectPath',
-];
-
-/**
- * These Vuex store properties are set as soon as the
- * dashboard component has been created. The values are
- * passed as data-* attributes and received by dashboard
- * as Vue props.
- */
-export const initialStateKeys = [...endpointKeys, 'currentEnvironmentName'];
-
-/**
- * Constant to indicate if a metric exists in the database
- */
-export const NOT_IN_DB_PREFIX = 'NO_DB';
-
-/**
- * graphQL environments API value for active environments.
- * Used as a value for the 'states' query filter
- */
-export const ENVIRONMENT_AVAILABLE_STATE = 'available';
-
-/**
- * As of %12.10, the svg icon library does not have an annotation
- * arrow icon yet. In order to deliver annotations feature, the icon
- * is hard coded until the icon is added. The below issue is
- * to track the icon.
- *
- * https://gitlab.com/gitlab-org/gitlab-svgs/-/issues/118
- *
- * Once the icon is merged this can be removed.
- * https://gitlab.com/gitlab-org/gitlab/-/issues/214540
- */
-export const annotationsSymbolIcon = 'path://m5 229 5 8h-10z';
-
-/**
- * As of %12.10, dashboard path is required to create annotation.
- * The FE gets the dashboard name from the URL params. It is not
- * ideal to store the path this way but there is no other way to
- * get this path unless annotations fetch is delayed. This could
- * potentially be removed and have the backend send this to the FE.
- *
- * This technical debt is being tracked here
- * https://gitlab.com/gitlab-org/gitlab/-/issues/214671
- */
-export const OVERVIEW_DASHBOARD_PATH = 'config/prometheus/common_metrics.yml';
-
-/**
- * GitLab provide metrics dashboards that are available to a user once
- * the Prometheus managed app has been installed, without any extra setup
- * required. These "out of the box" dashboards are defined under the
- * `config/prometheus` path.
- */
-export const OUT_OF_THE_BOX_DASHBOARDS_PATH_PREFIX = 'config/prometheus/';
-
-/**
- * Dashboard yml files support custom user-defined variables that
- * are rendered as input elements in the monitoring dashboard.
- * These values can be edited by the user and are passed on to the
- * the backend and eventually to Prometheus API proxy.
- *
- * As of 13.0, the supported types are:
- * simple custom -> dropdown elements
- * advanced custom -> dropdown elements
- * text -> text input elements
- *
- * Custom variables have a simple and a advanced variant.
- */
-export const VARIABLE_TYPES = {
- custom: 'custom',
- text: 'text',
- metric_label_values: 'metric_label_values',
-};
-
-/**
- * The names of templating variables defined in the dashboard yml
- * file are prefixed with a constant so that it doesn't collide with
- * other URL params that the monitoring dashboard relies on for
- * features like panel fullscreen etc.
- *
- * The prefix is added before it is appended to the URL and removed
- * before passing the data to the backend.
- */
-export const VARIABLE_PREFIX = 'var-';
-
-export const thresholdModeTypes = {
- ABSOLUTE: 'absolute',
- PERCENTAGE: 'percentage',
-};
diff --git a/app/assets/javascripts/monitoring/csv_export.js b/app/assets/javascripts/monitoring/csv_export.js
deleted file mode 100644
index 7e15b659767..00000000000
--- a/app/assets/javascripts/monitoring/csv_export.js
+++ /dev/null
@@ -1,146 +0,0 @@
-import { getSeriesLabel } from '~/helpers/monitor_helper';
-
-/**
- * Returns a label for a header of the csv.
- *
- * Includes double quotes ("") in case the header includes commas or other separator.
- *
- * @param {String} axisLabel
- * @param {String} metricLabel
- * @param {Object} metricAttributes
- */
-const csvHeader = (axisLabel, metricLabel, metricAttributes = {}) =>
- `${axisLabel} > ${getSeriesLabel(metricLabel, metricAttributes)}`;
-
-/**
- * Returns an array with the header labels given a list of metrics
- *
- * ```
- * metrics = [
- * {
- * label: "..." // user-defined label
- * result: [
- * {
- * metric: { ... } // metricAttributes
- * },
- * ...
- * ]
- * },
- * ...
- * ]
- * ```
- *
- * When metrics have a `label` or `metricAttributes`, they are
- * used to generate the column name.
- *
- * @param {String} axisLabel - Main label
- * @param {Array} metrics - Metrics with results
- */
-const csvMetricHeaders = (axisLabel, metrics) =>
- metrics.flatMap(({ label, result }) =>
- // The `metric` in a `result` is a map of `metricAttributes`
- // contains key-values to identify the series, rename it
- // here for clarity.
- result.map(({ metric: metricAttributes }) => {
- return csvHeader(axisLabel, label, metricAttributes);
- }),
- );
-
-/**
- * Returns a (flat) array with all the values arrays in each
- * metric and series
- *
- * ```
- * metrics = [
- * {
- * result: [
- * {
- * values: [ ... ] // `values`
- * },
- * ...
- * ]
- * },
- * ...
- * ]
- * ```
- *
- * @param {Array} metrics - Metrics with results
- */
-const csvMetricValues = (metrics) =>
- metrics.flatMap(({ result }) => result.map((res) => res.values || []));
-
-/**
- * Returns headers and rows for csv, sorted by their timestamp.
- *
- * {
- * headers: ["timestamp", "<col_1_name>", "col_2_name"],
- * rows: [
- * [ <timestamp>, <col_1_value>, <col_2_value> ],
- * [ <timestamp>, <col_1_value>, <col_2_value> ]
- * ...
- * ]
- * }
- *
- * @param {Array} metricHeaders
- * @param {Array} metricValues
- */
-const csvData = (metricHeaders, metricValues) => {
- const rowsByTimestamp = {};
-
- metricValues.forEach((values, colIndex) => {
- values.forEach(([timestamp, value]) => {
- if (!rowsByTimestamp[timestamp]) {
- rowsByTimestamp[timestamp] = [];
- }
- // `value` should be in the right column
- rowsByTimestamp[timestamp][colIndex] = value;
- });
- });
-
- const rows = Object.keys(rowsByTimestamp)
- .sort()
- .map((timestamp) => {
- // force each row to have the same number of entries
- rowsByTimestamp[timestamp].length = metricHeaders.length;
- // add timestamp as the first entry
- return [timestamp, ...rowsByTimestamp[timestamp]];
- });
-
- // Escape double quotes and enclose headers:
- // "If double-quotes are used to enclose fields, then a double-quote
- // appearing inside a field must be escaped by preceding it with
- // another double quote."
- // https://www.rfc-editor.org/rfc/rfc4180#page-2
- const headers = metricHeaders.map((header) => `"${header.replace(/"/g, '""')}"`);
-
- return {
- headers: ['timestamp', ...headers],
- rows,
- };
-};
-
-/**
- * Returns dashboard panel's data in a string in CSV format
- *
- * @param {Object} graphData - Panel contents
- * @returns {String}
- */
-export const graphDataToCsv = (graphData) => {
- const delimiter = ',';
- const br = '\r\n';
- const { metrics = [], y_label: axisLabel } = graphData;
-
- const metricsWithResults = metrics.filter((metric) => metric.result);
- const metricHeaders = csvMetricHeaders(axisLabel, metricsWithResults);
- const metricValues = csvMetricValues(metricsWithResults);
- const { headers, rows } = csvData(metricHeaders, metricValues);
-
- if (rows.length === 0) {
- return '';
- }
-
- const headerLine = headers.join(delimiter) + br;
- const lines = rows.map((row) => row.join(delimiter));
-
- return headerLine + lines.join(br) + br;
-};
diff --git a/app/assets/javascripts/monitoring/format_date.js b/app/assets/javascripts/monitoring/format_date.js
deleted file mode 100644
index f20fea48084..00000000000
--- a/app/assets/javascripts/monitoring/format_date.js
+++ /dev/null
@@ -1,40 +0,0 @@
-import dateFormat from '~/lib/dateformat';
-
-export const timezones = {
- /**
- * Renders a date with a local timezone
- */
- LOCAL: 'LOCAL',
-
- /**
- * Renders at date with UTC
- */
- UTC: 'UTC',
-};
-
-export const formats = {
- shortTime: 'h:MM TT',
- shortDateTime: 'm/d h:MM TT',
- default: 'dd mmm yyyy, h:MMTT (Z)',
-};
-
-/**
- * Formats a date for a metric dashboard or chart.
- *
- * Convenience wrapper of dateFormat with default formats
- * and settings.
- *
- * dateFormat has some limitations and we could use `toLocaleString` instead
- * See: https://gitlab.com/gitlab-org/gitlab/-/issues/219246
- *
- * @param {Date|String|Number} date
- * @param {Object} options - Formatting options
- * @param {string} options.format - Format or mask from `formats`.
- * @param {string} options.timezone - Timezone abbreviation.
- * Accepts "LOCAL" for the client local timezone.
- */
-export const formatDate = (date, options = {}) => {
- const { format = formats.default, timezone = timezones.LOCAL } = options;
- const useUTC = timezone === timezones.UTC;
- return dateFormat(date, format, useUTC);
-};
diff --git a/app/assets/javascripts/monitoring/monitoring_app.js b/app/assets/javascripts/monitoring/monitoring_app.js
deleted file mode 100644
index ee67e5dd827..00000000000
--- a/app/assets/javascripts/monitoring/monitoring_app.js
+++ /dev/null
@@ -1,49 +0,0 @@
-import { GlToast } from '@gitlab/ui';
-import Vue from 'vue';
-import createRouter from './router';
-import { createStore } from './stores';
-import { stateAndPropsFromDataset } from './utils';
-
-Vue.use(GlToast);
-
-export default (props = {}) => {
- const el = document.getElementById('prometheus-graphs');
-
- if (el && el.dataset) {
- const { metricsDashboardBasePath, ...dataset } = el.dataset;
-
- const { initState, dataProps } = stateAndPropsFromDataset(dataset);
- const store = createStore(initState);
- const router = createRouter(metricsDashboardBasePath);
-
- // eslint-disable-next-line no-new
- new Vue({
- el,
- store,
- router,
- data() {
- return {
- dashboardProps: { ...dataProps, ...props },
- };
- },
- render(h) {
- return h('RouterView', {
- // This is attrs rather than props because:
- // 1. RouterView only actually defines one prop: `name`.
- // 2. The RouterView [throws away other props][1] given to it, in
- // favour of those configured in the route config/params.
- // 3. The Vue template compiler itself in general compiles anything
- // like <some-component :foo="bar" /> into roughly
- // h('some-component', { attrs: { foo: bar } }). Then later, Vue
- // [extract props from attrs and merges them with props][2],
- // matching them up according to the component's definition.
- // [1]: https://github.com/vuejs/vue-router/blob/v3.4.9/src/components/view.js#L124
- // [2]: https://github.com/vuejs/vue/blob/v2.6.12/src/core/vdom/helpers/extract-props.js#L12-L50
- attrs: {
- dashboardProps: this.dashboardProps,
- },
- });
- },
- });
- }
-};
diff --git a/app/assets/javascripts/monitoring/monitoring_tracking_helper.js b/app/assets/javascripts/monitoring/monitoring_tracking_helper.js
deleted file mode 100644
index 5ae1eca10de..00000000000
--- a/app/assets/javascripts/monitoring/monitoring_tracking_helper.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import Tracking from '~/tracking';
-
-const trackDashboardLoad = ({ label, value }) =>
- Tracking.event(document.body.dataset.page, 'dashboard_fetch', {
- label,
- property: 'count',
- value,
- });
-
-export default trackDashboardLoad;
diff --git a/app/assets/javascripts/monitoring/pages/dashboard_page.vue b/app/assets/javascripts/monitoring/pages/dashboard_page.vue
deleted file mode 100644
index df0e2d7f8f6..00000000000
--- a/app/assets/javascripts/monitoring/pages/dashboard_page.vue
+++ /dev/null
@@ -1,29 +0,0 @@
-<script>
-import { mapActions } from 'vuex';
-import Dashboard from '../components/dashboard.vue';
-
-export default {
- components: {
- Dashboard,
- },
- props: {
- dashboardProps: {
- type: Object,
- required: true,
- },
- },
- created() {
- // This is to support the older URL <project>/-/environments/:env_id/metrics?dashboard=:path
- // and the new format <project>/-/metrics/:dashboardPath
- const encodedDashboard = this.$route.query.dashboard || this.$route.params.dashboard;
- const currentDashboard = encodedDashboard ? decodeURIComponent(encodedDashboard) : null;
- this.setCurrentDashboard({ currentDashboard });
- },
- methods: {
- ...mapActions('monitoringDashboard', ['setCurrentDashboard']),
- },
-};
-</script>
-<template>
- <dashboard v-bind="{ ...dashboardProps }" />
-</template>
diff --git a/app/assets/javascripts/monitoring/pages/panel_new_page.vue b/app/assets/javascripts/monitoring/pages/panel_new_page.vue
deleted file mode 100644
index dbda6e80dac..00000000000
--- a/app/assets/javascripts/monitoring/pages/panel_new_page.vue
+++ /dev/null
@@ -1,45 +0,0 @@
-<script>
-import { GlButton, GlTooltipDirective } from '@gitlab/ui';
-import { mapState } from 'vuex';
-import { s__ } from '~/locale';
-import DashboardPanelBuilder from '../components/dashboard_panel_builder.vue';
-import { DASHBOARD_PAGE } from '../router/constants';
-
-export default {
- components: {
- GlButton,
- DashboardPanelBuilder,
- },
- directives: {
- GlTooltip: GlTooltipDirective,
- },
- computed: {
- ...mapState('monitoringDashboard', ['panelPreviewYml']),
- dashboardPageLocation() {
- return {
- ...this.$route,
- name: DASHBOARD_PAGE,
- };
- },
- },
- i18n: {
- backToDashboard: s__('Metrics|Back to dashboard'),
- },
-};
-</script>
-<template>
- <div class="gl-mt-5">
- <div class="gl-display-flex gl-align-items-baseline gl-mb-5">
- <gl-button
- v-gl-tooltip
- icon="go-back"
- :to="dashboardPageLocation"
- :aria-label="$options.i18n.backToDashboard"
- :title="$options.i18n.backToDashboard"
- class="gl-mr-5"
- />
- <h1 class="gl-font-size-h1 gl-my-0">{{ s__('Metrics|Add panel') }}</h1>
- </div>
- <dashboard-panel-builder />
- </div>
-</template>
diff --git a/app/assets/javascripts/monitoring/queries/get_annotations.query.graphql b/app/assets/javascripts/monitoring/queries/get_annotations.query.graphql
deleted file mode 100644
index 32b982ff195..00000000000
--- a/app/assets/javascripts/monitoring/queries/get_annotations.query.graphql
+++ /dev/null
@@ -1,27 +0,0 @@
-query getAnnotations(
- $projectPath: ID!
- $environmentName: String
- $dashboardPath: String!
- $startingFrom: Time!
-) {
- project(fullPath: $projectPath) {
- id
- environments(name: $environmentName) {
- nodes {
- id
- name
- metricsDashboard(path: $dashboardPath) {
- annotations(from: $startingFrom) {
- nodes {
- id
- description
- startingAt
- endingAt
- panelId
- }
- }
- }
- }
- }
- }
-}
diff --git a/app/assets/javascripts/monitoring/queries/get_dashboard_validation_warnings.query.graphql b/app/assets/javascripts/monitoring/queries/get_dashboard_validation_warnings.query.graphql
deleted file mode 100644
index a61d601cd34..00000000000
--- a/app/assets/javascripts/monitoring/queries/get_dashboard_validation_warnings.query.graphql
+++ /dev/null
@@ -1,19 +0,0 @@
-query getDashboardValidationWarnings(
- $projectPath: ID!
- $environmentName: String
- $dashboardPath: String!
-) {
- project(fullPath: $projectPath) {
- id
- environments(name: $environmentName) {
- nodes {
- id
- name
- metricsDashboard(path: $dashboardPath) {
- path
- schemaValidationWarnings
- }
- }
- }
- }
-}
diff --git a/app/assets/javascripts/monitoring/queries/get_environments.query.graphql b/app/assets/javascripts/monitoring/queries/get_environments.query.graphql
deleted file mode 100644
index 48d0a780fc7..00000000000
--- a/app/assets/javascripts/monitoring/queries/get_environments.query.graphql
+++ /dev/null
@@ -1,11 +0,0 @@
-query getEnvironments($projectPath: ID!, $search: String, $states: [String!]) {
- project(fullPath: $projectPath) {
- id
- data: environments(search: $search, states: $states) {
- environments: nodes {
- name
- id
- }
- }
- }
-}
diff --git a/app/assets/javascripts/monitoring/requests/index.js b/app/assets/javascripts/monitoring/requests/index.js
deleted file mode 100644
index 29786a79c56..00000000000
--- a/app/assets/javascripts/monitoring/requests/index.js
+++ /dev/null
@@ -1,51 +0,0 @@
-import axios from '~/lib/utils/axios_utils';
-import { backOff } from '~/lib/utils/common_utils';
-import {
- HTTP_STATUS_BAD_REQUEST,
- HTTP_STATUS_NO_CONTENT,
- HTTP_STATUS_SERVICE_UNAVAILABLE,
- HTTP_STATUS_UNPROCESSABLE_ENTITY,
-} from '~/lib/utils/http_status';
-import { PROMETHEUS_TIMEOUT } from '../constants';
-
-const cancellableBackOffRequest = (makeRequestCallback) =>
- backOff((next, stop) => {
- makeRequestCallback()
- .then((resp) => {
- if (resp.status === HTTP_STATUS_NO_CONTENT) {
- next();
- } else {
- stop(resp);
- }
- })
- // If the request is cancelled by axios
- // then consider it as noop so that its not
- // caught by subsequent catches
- .catch((thrown) => (axios.isCancel(thrown) ? undefined : stop(thrown)));
- }, PROMETHEUS_TIMEOUT);
-
-export const getDashboard = (dashboardEndpoint, params) =>
- cancellableBackOffRequest(() => axios.get(dashboardEndpoint, { params })).then(
- (axiosResponse) => axiosResponse.data,
- );
-
-export const getPrometheusQueryData = (prometheusEndpoint, params, opts) =>
- cancellableBackOffRequest(() => axios.get(prometheusEndpoint, { params, ...opts }))
- .then((axiosResponse) => axiosResponse.data)
- .then((prometheusResponse) => prometheusResponse.data)
- .catch((error) => {
- // Prometheus returns errors in specific cases
- // https://prometheus.io/docs/prometheus/latest/querying/api/#format-overview
- const { response = {} } = error;
- if (
- response.status === HTTP_STATUS_BAD_REQUEST ||
- response.status === HTTP_STATUS_UNPROCESSABLE_ENTITY ||
- response.status === HTTP_STATUS_SERVICE_UNAVAILABLE
- ) {
- const { data } = response;
- if (data?.status === 'error' && data?.error) {
- throw new Error(data.error);
- }
- }
- throw error;
- });
diff --git a/app/assets/javascripts/monitoring/router/constants.js b/app/assets/javascripts/monitoring/router/constants.js
deleted file mode 100644
index 7834c14a65d..00000000000
--- a/app/assets/javascripts/monitoring/router/constants.js
+++ /dev/null
@@ -1,7 +0,0 @@
-export const DASHBOARD_PAGE = 'dashboard';
-export const PANEL_NEW_PAGE = 'panel_new';
-
-export default {
- DASHBOARD_PAGE,
- PANEL_NEW_PAGE,
-};
diff --git a/app/assets/javascripts/monitoring/router/index.js b/app/assets/javascripts/monitoring/router/index.js
deleted file mode 100644
index 12692612bbc..00000000000
--- a/app/assets/javascripts/monitoring/router/index.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import Vue from 'vue';
-import VueRouter from 'vue-router';
-import routes from './routes';
-
-Vue.use(VueRouter);
-
-export default function createRouter(base) {
- const router = new VueRouter({
- base,
- mode: 'history',
- routes,
- });
-
- return router;
-}
diff --git a/app/assets/javascripts/monitoring/router/routes.js b/app/assets/javascripts/monitoring/router/routes.js
deleted file mode 100644
index cc43fd8622a..00000000000
--- a/app/assets/javascripts/monitoring/router/routes.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import DashboardPage from '../pages/dashboard_page.vue';
-import PanelNewPage from '../pages/panel_new_page.vue';
-
-import { DASHBOARD_PAGE, PANEL_NEW_PAGE } from './constants';
-
-/**
- * Because the cluster health page uses the dashboard
- * app instead the of the dashboard component, hitting
- * `/` route is not possible. Hence using `*` until the
- * health page is refactored.
- * https://gitlab.com/gitlab-org/gitlab/-/issues/221096
- */
-export default [
- {
- name: PANEL_NEW_PAGE,
- path: '/:dashboard(.+)?/panel/new',
- component: PanelNewPage,
- },
- {
- name: DASHBOARD_PAGE,
- path: '/:dashboard(.+)?',
- component: DashboardPage,
- },
-];
diff --git a/app/assets/javascripts/monitoring/stores/actions.js b/app/assets/javascripts/monitoring/stores/actions.js
deleted file mode 100644
index 32e85262882..00000000000
--- a/app/assets/javascripts/monitoring/stores/actions.js
+++ /dev/null
@@ -1,576 +0,0 @@
-import * as Sentry from '@sentry/browser';
-import { createAlert } from '~/alert';
-import axios from '~/lib/utils/axios_utils';
-import { convertToFixedRange } from '~/lib/utils/datetime_range';
-import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
-import { s__, sprintf } from '~/locale';
-import { ENVIRONMENT_AVAILABLE_STATE, OVERVIEW_DASHBOARD_PATH, VARIABLE_TYPES } from '../constants';
-import trackDashboardLoad from '../monitoring_tracking_helper';
-import getAnnotations from '../queries/get_annotations.query.graphql';
-import getDashboardValidationWarnings from '../queries/get_dashboard_validation_warnings.query.graphql';
-import getEnvironments from '../queries/get_environments.query.graphql';
-import { getDashboard, getPrometheusQueryData } from '../requests';
-
-import * as types from './mutation_types';
-import {
- gqClient,
- parseEnvironmentsResponse,
- parseAnnotationsResponse,
- removeLeadingSlash,
-} from './utils';
-
-const axiosCancelToken = axios.CancelToken;
-let cancelTokenSource;
-
-function prometheusMetricQueryParams(timeRange) {
- const { start, end } = convertToFixedRange(timeRange);
-
- const timeDiff = (new Date(end) - new Date(start)) / 1000;
- const minStep = 60;
- const queryDataPoints = 600;
-
- return {
- start_time: start,
- end_time: end,
- step: Math.max(minStep, Math.ceil(timeDiff / queryDataPoints)),
- };
-}
-
-/**
- * Extract error messages from API or HTTP request errors.
- *
- * - API errors are in `error.response.data.message`
- * - HTTP (axios) errors are in `error.message`
- *
- * @param {Object} error
- * @returns {String} User friendly error message
- */
-function extractErrorMessage(error) {
- const message = error?.response?.data?.message;
- return message ?? error.message;
-}
-
-// Setup
-
-export const setGettingStartedEmptyState = ({ commit }) => {
- commit(types.SET_GETTING_STARTED_EMPTY_STATE);
-};
-
-export const setInitialState = ({ commit }, initialState) => {
- commit(types.SET_INITIAL_STATE, initialState);
-};
-
-export const setTimeRange = ({ commit }, timeRange) => {
- commit(types.SET_TIME_RANGE, timeRange);
-};
-
-export const filterEnvironments = ({ commit, dispatch }, searchTerm) => {
- commit(types.SET_ENVIRONMENTS_FILTER, searchTerm);
- dispatch('fetchEnvironmentsData');
-};
-
-export const setShowErrorBanner = ({ commit }, enabled) => {
- commit(types.SET_SHOW_ERROR_BANNER, enabled);
-};
-
-export const setExpandedPanel = ({ commit }, { group, panel }) => {
- commit(types.SET_EXPANDED_PANEL, { group, panel });
-};
-
-export const clearExpandedPanel = ({ commit }) => {
- commit(types.SET_EXPANDED_PANEL, {
- group: null,
- panel: null,
- });
-};
-
-export const setCurrentDashboard = ({ commit }, { currentDashboard }) => {
- commit(types.SET_CURRENT_DASHBOARD, currentDashboard);
-};
-
-// All Data
-
-/**
- * Fetch all dashboard data.
- *
- * @param {Object} store
- * @returns A promise that resolves when the dashboard
- * skeleton has been loaded.
- */
-export const fetchData = ({ dispatch }) => {
- dispatch('fetchEnvironmentsData');
- dispatch('fetchDashboard');
- dispatch('fetchAnnotations');
-};
-
-// Metrics dashboard
-
-export const fetchDashboard = ({ state, commit, dispatch, getters }) => {
- dispatch('requestMetricsDashboard');
-
- const params = {};
- if (getters.fullDashboardPath) {
- params.dashboard = getters.fullDashboardPath;
- }
-
- return getDashboard(state.dashboardEndpoint, params)
- .then((response) => {
- dispatch('receiveMetricsDashboardSuccess', { response });
- /**
- * After the dashboard is fetched, there can be non-blocking invalid syntax
- * in the dashboard file. This call will fetch such syntax warnings
- * and surface a warning on the UI. If the invalid syntax is blocking,
- * the `fetchDashboard` returns a 404 with error messages that are displayed
- * on the UI.
- */
- dispatch('fetchDashboardValidationWarnings');
- })
- .catch((error) => {
- Sentry.captureException(error);
-
- commit(types.SET_ALL_DASHBOARDS, error.response?.data?.all_dashboards ?? []);
- dispatch('receiveMetricsDashboardFailure', error);
-
- if (state.showErrorBanner) {
- if (error.response.data && error.response.data.message) {
- const { message } = error.response.data;
- createAlert({
- message: sprintf(
- s__('Metrics|There was an error while retrieving metrics. %{message}'),
- { message },
- false,
- ),
- });
- } else {
- createAlert({
- message: s__('Metrics|There was an error while retrieving metrics'),
- });
- }
- }
- });
-};
-
-export const requestMetricsDashboard = ({ commit }) => {
- commit(types.REQUEST_METRICS_DASHBOARD);
-};
-export const receiveMetricsDashboardSuccess = ({ commit, dispatch }, { response }) => {
- const { all_dashboards, dashboard, metrics_data } = response;
-
- commit(types.SET_ALL_DASHBOARDS, all_dashboards);
- commit(types.RECEIVE_METRICS_DASHBOARD_SUCCESS, dashboard);
- commit(types.SET_ENDPOINTS, convertObjectPropsToCamelCase(metrics_data));
-
- return dispatch('fetchDashboardData');
-};
-export const receiveMetricsDashboardFailure = ({ commit }, error) => {
- commit(types.RECEIVE_METRICS_DASHBOARD_FAILURE, error);
-};
-
-// Metrics
-
-/**
- * Loads timeseries data: Prometheus data points and deployment data from the project
- * @param {Object} Vuex store
- */
-export const fetchDashboardData = ({ state, dispatch, getters }) => {
- dispatch('fetchDeploymentsData');
-
- if (!state.timeRange) {
- createAlert({
- message: s__(`Metrics|Invalid time range, please verify.`),
- type: 'warning',
- });
- return Promise.reject();
- }
-
- // Time range params must be pre-calculated once for all metrics and options
- // A subsequent call, may calculate a different time range
- const defaultQueryParams = prometheusMetricQueryParams(state.timeRange);
-
- dispatch('fetchVariableMetricLabelValues', { defaultQueryParams });
-
- const promises = [];
- state.dashboard.panelGroups.forEach((group) => {
- group.panels.forEach((panel) => {
- panel.metrics.forEach((metric) => {
- promises.push(dispatch('fetchPrometheusMetric', { metric, defaultQueryParams }));
- });
- });
- });
-
- return Promise.all(promises)
- .then(() => {
- const dashboardType = getters.fullDashboardPath === '' ? 'default' : 'custom';
- trackDashboardLoad({
- label: `${dashboardType}_metrics_dashboard`,
- value: getters.metricsWithData().length,
- });
- })
- .catch(() => {
- createAlert({
- message: s__(`Metrics|There was an error while retrieving metrics`),
- type: 'warning',
- });
- });
-};
-
-/**
- * Returns list of metrics in data.result
- * {"status":"success", "data":{"resultType":"matrix","result":[]}}
- *
- * @param {metric} metric
- */
-export const fetchPrometheusMetric = (
- { commit, state, getters },
- { metric, defaultQueryParams },
-) => {
- let queryParams = { ...defaultQueryParams };
- if (metric.step) {
- queryParams.step = metric.step;
- }
-
- if (state.variables.length > 0) {
- queryParams = {
- ...queryParams,
- ...getters.getCustomVariablesParams,
- };
- }
-
- commit(types.REQUEST_METRIC_RESULT, { metricId: metric.metricId });
-
- return getPrometheusQueryData(metric.prometheusEndpointPath, queryParams)
- .then((data) => {
- commit(types.RECEIVE_METRIC_RESULT_SUCCESS, { metricId: metric.metricId, data });
- })
- .catch((error) => {
- Sentry.captureException(error);
-
- commit(types.RECEIVE_METRIC_RESULT_FAILURE, { metricId: metric.metricId, error });
- // Continue to throw error so the dashboard can notify using createAlert
- throw error;
- });
-};
-
-// Deployments
-
-export const fetchDeploymentsData = ({ state, dispatch }) => {
- if (!state.deploymentsEndpoint) {
- return Promise.resolve([]);
- }
- return axios
- .get(state.deploymentsEndpoint)
- .then((resp) => resp.data)
- .then((response) => {
- if (!response || !response.deployments) {
- createAlert({
- message: s__('Metrics|Unexpected deployment data response from prometheus endpoint'),
- });
- }
-
- dispatch('receiveDeploymentsDataSuccess', response.deployments);
- })
- .catch((error) => {
- Sentry.captureException(error);
- dispatch('receiveDeploymentsDataFailure');
- createAlert({
- message: s__('Metrics|There was an error getting deployment information.'),
- });
- });
-};
-export const receiveDeploymentsDataSuccess = ({ commit }, data) => {
- commit(types.RECEIVE_DEPLOYMENTS_DATA_SUCCESS, data);
-};
-export const receiveDeploymentsDataFailure = ({ commit }) => {
- commit(types.RECEIVE_DEPLOYMENTS_DATA_FAILURE);
-};
-
-// Environments
-
-export const fetchEnvironmentsData = ({ state, dispatch }) => {
- dispatch('requestEnvironmentsData');
- return gqClient
- .mutate({
- mutation: getEnvironments,
- variables: {
- projectPath: removeLeadingSlash(state.projectPath),
- search: state.environmentsSearchTerm,
- states: [ENVIRONMENT_AVAILABLE_STATE],
- },
- })
- .then((resp) =>
- parseEnvironmentsResponse(resp.data?.project?.data?.environments, state.projectPath),
- )
- .then((environments) => {
- if (!environments) {
- createAlert({
- message: s__(
- 'Metrics|There was an error fetching the environments data, please try again',
- ),
- });
- }
-
- dispatch('receiveEnvironmentsDataSuccess', environments);
- })
- .catch((err) => {
- Sentry.captureException(err);
- dispatch('receiveEnvironmentsDataFailure');
- createAlert({
- message: s__('Metrics|There was an error getting environments information.'),
- });
- });
-};
-export const requestEnvironmentsData = ({ commit }) => {
- commit(types.REQUEST_ENVIRONMENTS_DATA);
-};
-export const receiveEnvironmentsDataSuccess = ({ commit }, data) => {
- commit(types.RECEIVE_ENVIRONMENTS_DATA_SUCCESS, data);
-};
-export const receiveEnvironmentsDataFailure = ({ commit }) => {
- commit(types.RECEIVE_ENVIRONMENTS_DATA_FAILURE);
-};
-
-export const fetchAnnotations = ({ state, dispatch, getters }) => {
- const { start } = convertToFixedRange(state.timeRange);
- const dashboardPath = getters.fullDashboardPath || OVERVIEW_DASHBOARD_PATH;
- return gqClient
- .mutate({
- mutation: getAnnotations,
- variables: {
- projectPath: removeLeadingSlash(state.projectPath),
- environmentName: state.currentEnvironmentName,
- dashboardPath,
- startingFrom: start,
- },
- })
- .then(
- (resp) => resp.data?.project?.environments?.nodes?.[0].metricsDashboard?.annotations.nodes,
- )
- .then(parseAnnotationsResponse)
- .then((annotations) => {
- if (!annotations) {
- createAlert({
- message: s__('Metrics|There was an error fetching annotations. Please try again.'),
- });
- }
-
- dispatch('receiveAnnotationsSuccess', annotations);
- })
- .catch((err) => {
- Sentry.captureException(err);
- dispatch('receiveAnnotationsFailure');
- createAlert({
- message: s__('Metrics|There was an error getting annotations information.'),
- });
- });
-};
-
-export const receiveAnnotationsSuccess = ({ commit }, data) =>
- commit(types.RECEIVE_ANNOTATIONS_SUCCESS, data);
-export const receiveAnnotationsFailure = ({ commit }) => commit(types.RECEIVE_ANNOTATIONS_FAILURE);
-
-export const fetchDashboardValidationWarnings = ({ state, dispatch, getters }) => {
- /**
- * Normally, the overview dashboard won't throw any validation warnings.
- *
- * However, if a bug sneaks into the overview dashboard making it invalid,
- * this might come handy for our clients
- */
- const dashboardPath = getters.fullDashboardPath || OVERVIEW_DASHBOARD_PATH;
- return gqClient
- .mutate({
- mutation: getDashboardValidationWarnings,
- variables: {
- projectPath: removeLeadingSlash(state.projectPath),
- environmentName: state.currentEnvironmentName,
- dashboardPath,
- },
- })
- .then((resp) => resp.data?.project?.environments?.nodes?.[0]?.metricsDashboard || undefined)
- .then(({ schemaValidationWarnings } = {}) => {
- const hasWarnings = schemaValidationWarnings && schemaValidationWarnings.length !== 0;
- /**
- * The payload of the dispatch is a boolean, because at the moment a standard
- * warning message is shown instead of the warnings the BE returns
- */
- dispatch('receiveDashboardValidationWarningsSuccess', hasWarnings || false);
- })
- .catch((err) => {
- Sentry.captureException(err);
- dispatch('receiveDashboardValidationWarningsFailure');
- createAlert({
- message: s__(
- 'Metrics|There was an error getting dashboard validation warnings information.',
- ),
- });
- });
-};
-
-export const receiveDashboardValidationWarningsSuccess = ({ commit }, hasWarnings) =>
- commit(types.RECEIVE_DASHBOARD_VALIDATION_WARNINGS_SUCCESS, hasWarnings);
-export const receiveDashboardValidationWarningsFailure = ({ commit }) =>
- commit(types.RECEIVE_DASHBOARD_VALIDATION_WARNINGS_FAILURE);
-
-// Dashboard manipulation
-
-export const toggleStarredValue = ({ commit, state, getters }) => {
- const { selectedDashboard } = getters;
-
- if (state.isUpdatingStarredValue) {
- // Prevent repeating requests for the same change
- return;
- }
- if (!selectedDashboard) {
- return;
- }
-
- const method = selectedDashboard.starred ? 'DELETE' : 'POST';
- const url = selectedDashboard.user_starred_path;
- const newStarredValue = !selectedDashboard.starred;
-
- commit(types.REQUEST_DASHBOARD_STARRING);
-
- axios({
- url,
- method,
- })
- .then(() => {
- commit(types.RECEIVE_DASHBOARD_STARRING_SUCCESS, { selectedDashboard, newStarredValue });
- })
- .catch(() => {
- commit(types.RECEIVE_DASHBOARD_STARRING_FAILURE);
- });
-};
-
-/**
- * Set a new array of metrics to a panel group
- * @param {*} data An object containing
- * - `key` with a unique panel key
- * - `metrics` with the metrics array
- */
-export const setPanelGroupMetrics = ({ commit }, data) => {
- commit(types.SET_PANEL_GROUP_METRICS, data);
-};
-
-export const duplicateSystemDashboard = ({ state }, payload) => {
- const params = {
- dashboard: payload.dashboard,
- file_name: payload.fileName,
- branch: payload.branch,
- commit_message: payload.commitMessage,
- };
-
- return axios
- .post(state.dashboardsEndpoint, params)
- .then((response) => response.data)
- .then((data) => data.dashboard)
- .catch((error) => {
- Sentry.captureException(error);
-
- const { response } = error;
-
- if (response && response.data && response.data.error) {
- throw sprintf(s__('Metrics|There was an error creating the dashboard. %{error}'), {
- error: response.data.error,
- });
- } else {
- throw s__('Metrics|There was an error creating the dashboard.');
- }
- });
-};
-
-// Variables manipulation
-
-export const updateVariablesAndFetchData = ({ commit, dispatch }, updatedVariable) => {
- commit(types.UPDATE_VARIABLE_VALUE, updatedVariable);
-
- return dispatch('fetchDashboardData');
-};
-
-export const fetchVariableMetricLabelValues = ({ state, commit }, { defaultQueryParams }) => {
- const { start_time, end_time } = defaultQueryParams;
- const optionsRequests = [];
-
- state.variables.forEach((variable) => {
- if (variable.type === VARIABLE_TYPES.metric_label_values) {
- const { prometheusEndpointPath, label } = variable.options;
-
- const optionsRequest = getPrometheusQueryData(prometheusEndpointPath, {
- start_time,
- end_time,
- })
- .then((data) => {
- commit(types.UPDATE_VARIABLE_METRIC_LABEL_VALUES, { variable, label, data });
- })
- .catch(() => {
- createAlert({
- message: sprintf(
- s__('Metrics|There was an error getting options for variable "%{name}".'),
- {
- name: variable.name,
- },
- ),
- });
- });
- optionsRequests.push(optionsRequest);
- }
- });
-
- return Promise.all(optionsRequests);
-};
-
-// Panel Builder
-
-export const setPanelPreviewTimeRange = ({ commit }, timeRange) => {
- commit(types.SET_PANEL_PREVIEW_TIME_RANGE, timeRange);
-};
-
-export const fetchPanelPreview = ({ state, commit, dispatch }, panelPreviewYml) => {
- if (!panelPreviewYml) {
- return null;
- }
-
- commit(types.SET_PANEL_PREVIEW_IS_SHOWN, true);
- commit(types.REQUEST_PANEL_PREVIEW, panelPreviewYml);
-
- return axios
- .post(state.panelPreviewEndpoint, { panel_yaml: panelPreviewYml })
- .then(({ data }) => {
- commit(types.RECEIVE_PANEL_PREVIEW_SUCCESS, data);
-
- dispatch('fetchPanelPreviewMetrics');
- })
- .catch((error) => {
- commit(types.RECEIVE_PANEL_PREVIEW_FAILURE, extractErrorMessage(error));
- });
-};
-
-export const fetchPanelPreviewMetrics = ({ state, commit }) => {
- if (cancelTokenSource) {
- cancelTokenSource.cancel();
- }
- cancelTokenSource = axiosCancelToken.source();
-
- const defaultQueryParams = prometheusMetricQueryParams(state.panelPreviewTimeRange);
-
- state.panelPreviewGraphData.metrics.forEach((metric, index) => {
- commit(types.REQUEST_PANEL_PREVIEW_METRIC_RESULT, { index });
-
- const params = { ...defaultQueryParams };
- if (metric.step) {
- params.step = metric.step;
- }
- return getPrometheusQueryData(metric.prometheusEndpointPath, params, {
- cancelToken: cancelTokenSource.token,
- })
- .then((data) => {
- commit(types.RECEIVE_PANEL_PREVIEW_METRIC_RESULT_SUCCESS, { index, data });
- })
- .catch((error) => {
- Sentry.captureException(error);
-
- commit(types.RECEIVE_PANEL_PREVIEW_METRIC_RESULT_FAILURE, { index, error });
- // Continue to throw error so the panel builder can notify using createAlert
- throw error;
- });
- });
-};
diff --git a/app/assets/javascripts/monitoring/stores/embed_group/actions.js b/app/assets/javascripts/monitoring/stores/embed_group/actions.js
deleted file mode 100644
index ca0d2e5ba35..00000000000
--- a/app/assets/javascripts/monitoring/stores/embed_group/actions.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import * as types from './mutation_types';
-
-export const addModule = ({ commit }, data) => commit(types.ADD_MODULE, data);
diff --git a/app/assets/javascripts/monitoring/stores/embed_group/getters.js b/app/assets/javascripts/monitoring/stores/embed_group/getters.js
deleted file mode 100644
index 8eddd830c58..00000000000
--- a/app/assets/javascripts/monitoring/stores/embed_group/getters.js
+++ /dev/null
@@ -1,2 +0,0 @@
-export const metricsWithData = (state, getters, rootState, rootGetters) =>
- state.modules.map((module) => rootGetters[`${module}/metricsWithData`]().length);
diff --git a/app/assets/javascripts/monitoring/stores/embed_group/index.js b/app/assets/javascripts/monitoring/stores/embed_group/index.js
deleted file mode 100644
index 66c65adc413..00000000000
--- a/app/assets/javascripts/monitoring/stores/embed_group/index.js
+++ /dev/null
@@ -1,22 +0,0 @@
-import Vue from 'vue';
-import Vuex from 'vuex';
-import * as actions from './actions';
-import * as getters from './getters';
-import mutations from './mutations';
-import state from './state';
-
-Vue.use(Vuex);
-
-// In practice this store will have a number of `monitoringDashboard` modules added dynamically
-export const createStore = () =>
- new Vuex.Store({
- modules: {
- embedGroup: {
- namespaced: true,
- actions,
- getters,
- mutations,
- state,
- },
- },
- });
diff --git a/app/assets/javascripts/monitoring/stores/embed_group/mutation_types.js b/app/assets/javascripts/monitoring/stores/embed_group/mutation_types.js
deleted file mode 100644
index 288e6db4151..00000000000
--- a/app/assets/javascripts/monitoring/stores/embed_group/mutation_types.js
+++ /dev/null
@@ -1 +0,0 @@
-export const ADD_MODULE = 'ADD_MODULE';
diff --git a/app/assets/javascripts/monitoring/stores/embed_group/mutations.js b/app/assets/javascripts/monitoring/stores/embed_group/mutations.js
deleted file mode 100644
index 3c66129f239..00000000000
--- a/app/assets/javascripts/monitoring/stores/embed_group/mutations.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import * as types from './mutation_types';
-
-export default {
- [types.ADD_MODULE](state, module) {
- state.modules.push(module);
- },
-};
diff --git a/app/assets/javascripts/monitoring/stores/embed_group/state.js b/app/assets/javascripts/monitoring/stores/embed_group/state.js
deleted file mode 100644
index 016c7e5dac7..00000000000
--- a/app/assets/javascripts/monitoring/stores/embed_group/state.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export default () => ({
- modules: [],
-});
diff --git a/app/assets/javascripts/monitoring/stores/getters.js b/app/assets/javascripts/monitoring/stores/getters.js
deleted file mode 100644
index d6a04006264..00000000000
--- a/app/assets/javascripts/monitoring/stores/getters.js
+++ /dev/null
@@ -1,174 +0,0 @@
-import { NOT_IN_DB_PREFIX } from '../constants';
-import {
- addPrefixToCustomVariableParams,
- addDashboardMetaDataToLink,
- normalizeCustomDashboardPath,
-} from './utils';
-
-const metricsIdsInPanel = (panel) =>
- panel.metrics
- .filter((metric) => metric.metricId && metric.result)
- .map((metric) => metric.metricId);
-
-/**
- * Returns a reference to the currently selected dashboard
- * from the list of dashboards.
- *
- * @param {Object} state
- */
-export const selectedDashboard = (state, getters) => {
- const { allDashboards } = state;
- return (
- allDashboards.find((d) => d.path === getters.fullDashboardPath) ||
- allDashboards.find((d) => d.default) ||
- null
- );
-};
-
-/**
- * Get all state for metric in the dashboard or a group. The
- * states are not repeated so the dashboard or group can show
- * a global state.
- *
- * @param {Object} state
- * @returns {Function} A function that returns an array of
- * states in all the metric in the dashboard or group.
- */
-export const getMetricStates = (state) => (groupKey) => {
- let groups = state.dashboard.panelGroups;
- if (groupKey) {
- groups = groups.filter((group) => group.key === groupKey);
- }
-
- const metricStates = groups.reduce((acc, group) => {
- group.panels.forEach((panel) => {
- panel.metrics.forEach((metric) => {
- if (metric.state) {
- acc.push(metric.state);
- }
- });
- });
- return acc;
- }, []);
-
- // Deduplicate and sort array
- return Array.from(new Set(metricStates)).sort();
-};
-
-/**
- * Getter to obtain the list of metric ids that have data
- *
- * Useful to understand which parts of the dashboard should
- * be displayed. It is a Vuex Method-Style Access getter.
- *
- * @param {Object} state
- * @returns {Function} A function that returns an array of
- * metrics in the dashboard that contain results, optionally
- * filtered by group key.
- */
-export const metricsWithData = (state) => (groupKey) => {
- let groups = state.dashboard.panelGroups;
- if (groupKey) {
- groups = groups.filter((group) => group.key === groupKey);
- }
-
- const res = [];
- groups.forEach((group) => {
- group.panels.forEach((panel) => {
- res.push(...metricsIdsInPanel(panel));
- });
- });
-
- return res;
-};
-
-/**
- * Metrics loaded from project-defined dashboards do not have a metric_id.
- * This getter checks which metrics are stored in the db (have a metric id)
- * This is hopefully a temporary solution until BE processes metrics before passing to FE
- *
- * Related:
- * https://gitlab.com/gitlab-org/gitlab/-/issues/28241
- * https://gitlab.com/gitlab-org/gitlab/-/merge_requests/27447
- */
-export const metricsSavedToDb = (state) => {
- const metricIds = [];
- state.dashboard.panelGroups.forEach(({ panels }) => {
- panels.forEach(({ metrics }) => {
- const metricIdsInDb = metrics
- .filter(({ metricId }) => !metricId.startsWith(NOT_IN_DB_PREFIX))
- .map(({ metricId }) => metricId);
-
- metricIds.push(...metricIdsInDb);
- });
- });
- return metricIds;
-};
-
-/**
- * Filter environments by names.
- *
- * This is used in the environments dropdown with searchable input.
- *
- * @param {Object} state
- * @returns {Array} List of environments
- */
-export const filteredEnvironments = (state) =>
- state.environments.filter((env) =>
- env.name.toLowerCase().includes((state.environmentsSearchTerm || '').trim().toLowerCase()),
- );
-
-/**
- * User-defined links from the yml file can have other
- * dashboard-related metadata baked into it. This method
- * returns modified links which will get rendered in the
- * metrics dashboard
- *
- * @param {Object} state
- * @returns {Array} modified array of links
- */
-export const linksWithMetadata = (state) => {
- const metadata = {
- timeRange: state.timeRange,
- };
- return state.links?.map(addDashboardMetaDataToLink(metadata));
-};
-
-/**
- * Maps a variables array to an object for replacement in
- * prometheus queries.
- *
- * This method outputs an object in the below format
- *
- * {
- * variables[key1]=value1,
- * variables[key2]=value2,
- * }
- *
- * This is done so that the backend can identify the custom
- * user-defined variables coming through the URL and differentiate
- * from other variables used for Prometheus API endpoint.
- *
- * @param {Object} state - State containing variables provided by the user
- * @returns {Array} The custom variables object to be send to the API
- * in the format of {variables[key1]=value1, variables[key2]=value2}
- */
-
-export const getCustomVariablesParams = (state) =>
- state.variables.reduce((acc, variable) => {
- const { name, value } = variable;
- if (value !== null) {
- acc[addPrefixToCustomVariableParams(name)] = value;
- }
- return acc;
- }, {});
-
-/**
- * For a given custom dashboard file name, this method
- * returns the full file path.
- *
- * @param {Object} state
- * @returns {String} full dashboard path
- */
-export const fullDashboardPath = (state) =>
- normalizeCustomDashboardPath(state.currentDashboard, state.customDashboardBasePath);
diff --git a/app/assets/javascripts/monitoring/stores/index.js b/app/assets/javascripts/monitoring/stores/index.js
deleted file mode 100644
index 213a8508aa2..00000000000
--- a/app/assets/javascripts/monitoring/stores/index.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import Vue from 'vue';
-import Vuex from 'vuex';
-import * as actions from './actions';
-import * as getters from './getters';
-import mutations from './mutations';
-import state from './state';
-
-Vue.use(Vuex);
-
-export const monitoringDashboard = {
- namespaced: true,
- actions,
- getters,
- mutations,
- state,
-};
-
-export const createStore = (initState = {}) =>
- new Vuex.Store({
- modules: {
- monitoringDashboard: {
- ...monitoringDashboard,
- state: {
- ...state(),
- ...initState,
- },
- },
- },
- });
diff --git a/app/assets/javascripts/monitoring/stores/mutation_types.js b/app/assets/javascripts/monitoring/stores/mutation_types.js
deleted file mode 100644
index 1d7279912cc..00000000000
--- a/app/assets/javascripts/monitoring/stores/mutation_types.js
+++ /dev/null
@@ -1,62 +0,0 @@
-// Dashboard "skeleton", groups, panels, metrics, query variables
-export const REQUEST_METRICS_DASHBOARD = 'REQUEST_METRICS_DASHBOARD';
-export const RECEIVE_METRICS_DASHBOARD_SUCCESS = 'RECEIVE_METRICS_DASHBOARD_SUCCESS';
-export const RECEIVE_METRICS_DASHBOARD_FAILURE = 'RECEIVE_METRICS_DASHBOARD_FAILURE';
-export const UPDATE_VARIABLE_VALUE = 'UPDATE_VARIABLE_VALUE';
-export const UPDATE_VARIABLE_METRIC_LABEL_VALUES = 'UPDATE_VARIABLE_METRIC_LABEL_VALUES';
-
-export const REQUEST_DASHBOARD_STARRING = 'REQUEST_DASHBOARD_STARRING';
-export const RECEIVE_DASHBOARD_STARRING_SUCCESS = 'RECEIVE_DASHBOARD_STARRING_SUCCESS';
-export const RECEIVE_DASHBOARD_STARRING_FAILURE = 'RECEIVE_DASHBOARD_STARRING_FAILURE';
-
-export const SET_CURRENT_DASHBOARD = 'SET_CURRENT_DASHBOARD';
-
-// Annotations
-export const RECEIVE_ANNOTATIONS_SUCCESS = 'RECEIVE_ANNOTATIONS_SUCCESS';
-export const RECEIVE_ANNOTATIONS_FAILURE = 'RECEIVE_ANNOTATIONS_FAILURE';
-
-// Dashboard validation warnings
-export const RECEIVE_DASHBOARD_VALIDATION_WARNINGS_SUCCESS =
- 'RECEIVE_DASHBOARD_VALIDATION_WARNINGS_SUCCESS';
-export const RECEIVE_DASHBOARD_VALIDATION_WARNINGS_FAILURE =
- 'RECEIVE_DASHBOARD_VALIDATION_WARNINGS_FAILURE';
-
-// Git project deployments
-export const REQUEST_DEPLOYMENTS_DATA = 'REQUEST_DEPLOYMENTS_DATA';
-export const RECEIVE_DEPLOYMENTS_DATA_SUCCESS = 'RECEIVE_DEPLOYMENTS_DATA_SUCCESS';
-export const RECEIVE_DEPLOYMENTS_DATA_FAILURE = 'RECEIVE_DEPLOYMENTS_DATA_FAILURE';
-
-// Environments
-export const REQUEST_ENVIRONMENTS_DATA = 'REQUEST_ENVIRONMENTS_DATA';
-export const RECEIVE_ENVIRONMENTS_DATA_SUCCESS = 'RECEIVE_ENVIRONMENTS_DATA_SUCCESS';
-export const RECEIVE_ENVIRONMENTS_DATA_FAILURE = 'RECEIVE_ENVIRONMENTS_DATA_FAILURE';
-
-// Metric data points
-export const REQUEST_METRIC_RESULT = 'REQUEST_METRIC_RESULT';
-export const RECEIVE_METRIC_RESULT_SUCCESS = 'RECEIVE_METRIC_RESULT_SUCCESS';
-export const RECEIVE_METRIC_RESULT_FAILURE = 'RECEIVE_METRIC_RESULT_FAILURE';
-
-// Parameters and other information
-export const SET_TIME_RANGE = 'SET_TIME_RANGE';
-export const SET_ALL_DASHBOARDS = 'SET_ALL_DASHBOARDS';
-export const SET_ENDPOINTS = 'SET_ENDPOINTS';
-export const SET_INITIAL_STATE = 'SET_INITIAL_STATE';
-export const SET_GETTING_STARTED_EMPTY_STATE = 'SET_GETTING_STARTED_EMPTY_STATE';
-export const SET_SHOW_ERROR_BANNER = 'SET_SHOW_ERROR_BANNER';
-export const SET_PANEL_GROUP_METRICS = 'SET_PANEL_GROUP_METRICS';
-export const SET_ENVIRONMENTS_FILTER = 'SET_ENVIRONMENTS_FILTER';
-export const SET_EXPANDED_PANEL = 'SET_EXPANDED_PANEL';
-
-// Panel preview
-export const REQUEST_PANEL_PREVIEW = 'REQUEST_PANEL_PREVIEW';
-export const RECEIVE_PANEL_PREVIEW_SUCCESS = 'RECEIVE_PANEL_PREVIEW_SUCCESS';
-export const RECEIVE_PANEL_PREVIEW_FAILURE = 'RECEIVE_PANEL_PREVIEW_FAILURE';
-
-export const REQUEST_PANEL_PREVIEW_METRIC_RESULT = 'REQUEST_PANEL_PREVIEW_METRIC_RESULT';
-export const RECEIVE_PANEL_PREVIEW_METRIC_RESULT_SUCCESS =
- 'RECEIVE_PANEL_PREVIEW_METRIC_RESULT_SUCCESS';
-export const RECEIVE_PANEL_PREVIEW_METRIC_RESULT_FAILURE =
- 'RECEIVE_PANEL_PREVIEW_METRIC_RESULT_FAILURE';
-
-export const SET_PANEL_PREVIEW_TIME_RANGE = 'SET_PANEL_PREVIEW_TIME_RANGE';
-export const SET_PANEL_PREVIEW_IS_SHOWN = 'SET_PANEL_PREVIEW_IS_SHOWN';
diff --git a/app/assets/javascripts/monitoring/stores/mutations.js b/app/assets/javascripts/monitoring/stores/mutations.js
deleted file mode 100644
index 5fab292b6df..00000000000
--- a/app/assets/javascripts/monitoring/stores/mutations.js
+++ /dev/null
@@ -1,273 +0,0 @@
-import { pick } from 'lodash';
-import Vue from 'vue';
-import { BACKOFF_TIMEOUT } from '~/lib/utils/common_utils';
-import { HTTP_STATUS_BAD_REQUEST, HTTP_STATUS_SERVICE_UNAVAILABLE } from '~/lib/utils/http_status';
-import { dashboardEmptyStates, endpointKeys, initialStateKeys, metricStates } from '../constants';
-import * as types from './mutation_types';
-import { mapToDashboardViewModel, mapPanelToViewModel, normalizeQueryResponseData } from './utils';
-import { optionsFromSeriesData } from './variable_mapping';
-
-/**
- * Locate and return a metric in the dashboard by its id
- * as generated by `uniqMetricsId()`.
- * @param {String} metricId Unique id in the dashboard
- * @param {Object} dashboard Full dashboard object
- */
-const findMetricInDashboard = (metricId, dashboard) => {
- let res = null;
- dashboard.panelGroups.forEach((group) => {
- group.panels.forEach((panel) => {
- panel.metrics.forEach((metric) => {
- if (metric.metricId === metricId) {
- res = metric;
- }
- });
- });
- });
- return res;
-};
-
-/**
- * Maps a backened error state to a `metricStates` constant
- * @param {Object} error - Error from backend response
- */
-const emptyStateFromError = (error) => {
- if (!error) {
- return metricStates.UNKNOWN_ERROR;
- }
-
- // Special error responses
- if (error.message === BACKOFF_TIMEOUT) {
- return metricStates.TIMEOUT;
- }
-
- // Axios error responses
- const { response } = error;
- if (response && response.status === HTTP_STATUS_SERVICE_UNAVAILABLE) {
- return metricStates.CONNECTION_FAILED;
- } else if (response && response.status === HTTP_STATUS_BAD_REQUEST) {
- // Note: "error.response.data.error" may contain Prometheus error information
- return metricStates.BAD_QUERY;
- }
-
- return metricStates.UNKNOWN_ERROR;
-};
-
-export const metricStateFromData = (data) => {
- if (data?.result?.length) {
- const result = normalizeQueryResponseData(data);
- return { state: metricStates.OK, result: Object.freeze(result) };
- }
- return { state: metricStates.NO_DATA, result: null };
-};
-
-export default {
- /**
- * Dashboard panels structure and global state
- */
- [types.REQUEST_METRICS_DASHBOARD](state) {
- state.emptyState = dashboardEmptyStates.LOADING;
- },
- [types.RECEIVE_METRICS_DASHBOARD_SUCCESS](state, dashboardYML) {
- const { dashboard, panelGroups, variables, links } = mapToDashboardViewModel(dashboardYML);
- state.dashboard = {
- dashboard,
- panelGroups,
- };
- state.variables = variables;
- state.links = links;
-
- if (!state.dashboard.panelGroups.length) {
- state.emptyState = dashboardEmptyStates.NO_DATA;
- } else {
- state.emptyState = null;
- }
- },
- [types.RECEIVE_METRICS_DASHBOARD_FAILURE](state, error) {
- state.emptyState = error
- ? dashboardEmptyStates.UNABLE_TO_CONNECT
- : dashboardEmptyStates.NO_DATA;
- },
-
- [types.REQUEST_DASHBOARD_STARRING](state) {
- state.isUpdatingStarredValue = true;
- },
- [types.RECEIVE_DASHBOARD_STARRING_SUCCESS](state, { selectedDashboard, newStarredValue }) {
- const index = state.allDashboards.findIndex((d) => d === selectedDashboard);
-
- state.isUpdatingStarredValue = false;
-
- // Trigger state updates in the reactivity system for this change
- // https://vuejs.org/v2/guide/reactivity.html#For-Arrays
- Vue.set(state.allDashboards, index, { ...selectedDashboard, starred: newStarredValue });
- },
- [types.RECEIVE_DASHBOARD_STARRING_FAILURE](state) {
- state.isUpdatingStarredValue = false;
- },
-
- [types.SET_CURRENT_DASHBOARD](state, currentDashboard) {
- state.currentDashboard = currentDashboard;
- },
-
- /**
- * Deployments and environments
- */
- [types.RECEIVE_DEPLOYMENTS_DATA_SUCCESS](state, deployments) {
- state.deploymentData = deployments;
- },
- [types.RECEIVE_DEPLOYMENTS_DATA_FAILURE](state) {
- state.deploymentData = [];
- },
- [types.REQUEST_ENVIRONMENTS_DATA](state) {
- state.environmentsLoading = true;
- },
- [types.RECEIVE_ENVIRONMENTS_DATA_SUCCESS](state, environments) {
- state.environmentsLoading = false;
- state.environments = environments;
- },
- [types.RECEIVE_ENVIRONMENTS_DATA_FAILURE](state) {
- state.environmentsLoading = false;
- state.environments = [];
- },
-
- /**
- * Annotations
- */
- [types.RECEIVE_ANNOTATIONS_SUCCESS](state, annotations) {
- state.annotations = annotations;
- },
- [types.RECEIVE_ANNOTATIONS_FAILURE](state) {
- state.annotations = [];
- },
-
- /**
- * Dashboard Validation Warnings
- */
- [types.RECEIVE_DASHBOARD_VALIDATION_WARNINGS_SUCCESS](state, hasDashboardValidationWarnings) {
- state.hasDashboardValidationWarnings = hasDashboardValidationWarnings;
- },
- [types.RECEIVE_DASHBOARD_VALIDATION_WARNINGS_FAILURE](state) {
- state.hasDashboardValidationWarnings = false;
- },
-
- /**
- * Individual panel/metric results
- */
- [types.REQUEST_METRIC_RESULT](state, { metricId }) {
- const metric = findMetricInDashboard(metricId, state.dashboard);
- metric.loading = true;
- if (!metric.result) {
- metric.state = metricStates.LOADING;
- }
- },
- [types.RECEIVE_METRIC_RESULT_SUCCESS](state, { metricId, data }) {
- const metric = findMetricInDashboard(metricId, state.dashboard);
- const metricState = metricStateFromData(data);
-
- metric.loading = false;
- metric.state = metricState.state;
- metric.result = metricState.result;
- },
- [types.RECEIVE_METRIC_RESULT_FAILURE](state, { metricId, error }) {
- const metric = findMetricInDashboard(metricId, state.dashboard);
-
- metric.state = emptyStateFromError(error);
- metric.loading = false;
- metric.result = null;
- },
-
- // Parameters and other information
- [types.SET_INITIAL_STATE](state, initialState = {}) {
- Object.assign(state, pick(initialState, initialStateKeys));
- },
- [types.SET_ENDPOINTS](state, endpoints = {}) {
- Object.assign(state, pick(endpoints, endpointKeys));
- },
- [types.SET_TIME_RANGE](state, timeRange) {
- state.timeRange = timeRange;
- },
- [types.SET_GETTING_STARTED_EMPTY_STATE](state) {
- state.emptyState = dashboardEmptyStates.GETTING_STARTED;
- },
- [types.SET_ALL_DASHBOARDS](state, dashboards) {
- state.allDashboards = dashboards || [];
- },
- [types.SET_SHOW_ERROR_BANNER](state, enabled) {
- state.showErrorBanner = enabled;
- },
- [types.SET_PANEL_GROUP_METRICS](state, payload) {
- const panelGroup = state.dashboard.panelGroups.find((pg) => payload.key === pg.key);
- panelGroup.panels = payload.panels;
- },
- [types.SET_ENVIRONMENTS_FILTER](state, searchTerm) {
- state.environmentsSearchTerm = searchTerm;
- },
- [types.SET_EXPANDED_PANEL](state, { group, panel }) {
- state.expandedPanel.group = group;
- state.expandedPanel.panel = panel;
- },
- [types.UPDATE_VARIABLE_VALUE](state, { name, value }) {
- const variable = state.variables.find((v) => v.name === name);
- if (variable) {
- Object.assign(variable, {
- value,
- });
- }
- },
- [types.UPDATE_VARIABLE_METRIC_LABEL_VALUES](state, { variable, label, data = [] }) {
- const values = optionsFromSeriesData({ label, data });
-
- // Add new options with assign to ensure Vue reactivity
- Object.assign(variable.options, { values });
- },
-
- [types.REQUEST_PANEL_PREVIEW](state, panelPreviewYml) {
- state.panelPreviewIsLoading = true;
-
- state.panelPreviewYml = panelPreviewYml;
- state.panelPreviewGraphData = null;
- state.panelPreviewError = null;
- },
- [types.RECEIVE_PANEL_PREVIEW_SUCCESS](state, payload) {
- state.panelPreviewIsLoading = false;
-
- state.panelPreviewGraphData = mapPanelToViewModel(payload);
- state.panelPreviewError = null;
- },
- [types.RECEIVE_PANEL_PREVIEW_FAILURE](state, error) {
- state.panelPreviewIsLoading = false;
-
- state.panelPreviewGraphData = null;
- state.panelPreviewError = error;
- },
-
- [types.REQUEST_PANEL_PREVIEW_METRIC_RESULT](state, { index }) {
- const metric = state.panelPreviewGraphData.metrics[index];
-
- metric.loading = true;
- if (!metric.result) {
- metric.state = metricStates.LOADING;
- }
- },
- [types.RECEIVE_PANEL_PREVIEW_METRIC_RESULT_SUCCESS](state, { index, data }) {
- const metric = state.panelPreviewGraphData.metrics[index];
- const metricState = metricStateFromData(data);
-
- metric.loading = false;
- metric.state = metricState.state;
- metric.result = metricState.result;
- },
- [types.RECEIVE_PANEL_PREVIEW_METRIC_RESULT_FAILURE](state, { index, error }) {
- const metric = state.panelPreviewGraphData.metrics[index];
-
- metric.loading = false;
- metric.state = emptyStateFromError(error);
- metric.result = null;
- },
- [types.SET_PANEL_PREVIEW_TIME_RANGE](state, timeRange) {
- state.panelPreviewTimeRange = timeRange;
- },
- [types.SET_PANEL_PREVIEW_IS_SHOWN](state, isPreviewShown) {
- state.panelPreviewIsShown = isPreviewShown;
- },
-};
diff --git a/app/assets/javascripts/monitoring/stores/state.js b/app/assets/javascripts/monitoring/stores/state.js
deleted file mode 100644
index e513b575475..00000000000
--- a/app/assets/javascripts/monitoring/stores/state.js
+++ /dev/null
@@ -1,97 +0,0 @@
-import invalidUrl from '~/lib/utils/invalid_url';
-import { defaultTimeRange } from '~/vue_shared/constants';
-import { dashboardEmptyStates } from '../constants';
-import { timezones } from '../format_date';
-
-export default () => ({
- // API endpoints
- deploymentsEndpoint: null,
- dashboardEndpoint: invalidUrl,
- dashboardsEndpoint: invalidUrl,
- panelPreviewEndpoint: invalidUrl,
-
- // Dashboard request parameters
- timeRange: null,
- /**
- * Currently selected dashboard. For custom dashboards,
- * this could be the filename or the file path.
- *
- * If this is the filename and full path is required,
- * getters.fullDashboardPath should be used.
- */
- currentDashboard: null,
-
- // Dashboard data
- hasDashboardValidationWarnings: false,
-
- /**
- * {?String} If set, dashboard should display a global
- * empty state, there is no way to interact (yet)
- * with the dashboard.
- */
- emptyState: dashboardEmptyStates.GETTING_STARTED,
- showErrorBanner: true,
- isUpdatingStarredValue: false,
- dashboard: {
- panelGroups: [],
- },
- /**
- * Panel that is currently "zoomed" in as
- * a single panel in view.
- */
- expandedPanel: {
- /**
- * {?String} Panel's group name.
- */
- group: null,
- /**
- * {?Object} Panel content from `dashboard`
- * null when no panel is expanded.
- */
- panel: null,
- },
- allDashboards: [],
- /**
- * User-defined custom variables are passed
- * via the dashboard yml file.
- */
- variables: [],
- /**
- * User-defined custom links are passed
- * via the dashboard yml file.
- */
- links: [],
-
- // Panel editor / builder
- panelPreviewYml: '',
- panelPreviewIsLoading: false,
- panelPreviewGraphData: null,
- panelPreviewError: null,
- panelPreviewTimeRange: defaultTimeRange,
- panelPreviewIsShown: false,
-
- // Other project data
- dashboardTimezone: timezones.LOCAL,
- annotations: [],
- deploymentData: [],
- environments: [],
- environmentsSearchTerm: '',
- environmentsLoading: false,
- currentEnvironmentName: null,
-
- // GitLab paths to other pages
- externalDashboardUrl: '',
- projectPath: null,
- operationsSettingsPath: '',
- addDashboardDocumentationPath: '',
-
- // static paths
- customDashboardBasePath: '',
-
- // current user data
- /**
- * Flag that denotes if the currently logged user can access
- * the project Settings -> Operations
- */
- canAccessOperationsSettings: false,
-});
diff --git a/app/assets/javascripts/monitoring/stores/utils.js b/app/assets/javascripts/monitoring/stores/utils.js
deleted file mode 100644
index 02a2435d575..00000000000
--- a/app/assets/javascripts/monitoring/stores/utils.js
+++ /dev/null
@@ -1,505 +0,0 @@
-import { getIdFromGraphQLId } from '~/graphql_shared/utils';
-import createGqClient, { fetchPolicies } from '~/lib/graphql';
-import { DATETIME_RANGE_TYPES } from '~/lib/utils/constants';
-import { timeRangeToParams, getRangeType } from '~/lib/utils/datetime_range';
-import { slugify } from '~/lib/utils/text_utility';
-import { SUPPORTED_FORMATS } from '~/lib/utils/unit_format';
-import { isSafeURL, mergeUrlParams } from '~/lib/utils/url_utility';
-import { NOT_IN_DB_PREFIX, linkTypes, OUT_OF_THE_BOX_DASHBOARDS_PATH_PREFIX } from '../constants';
-import { mergeURLVariables, parseTemplatingVariables } from './variable_mapping';
-
-export const gqClient = createGqClient(
- {},
- {
- fetchPolicy: fetchPolicies.NO_CACHE,
- },
-);
-
-/**
- * Metrics loaded from project-defined dashboards do not have a metricId.
- * This method creates a unique ID combining metricId and id, if either is present.
- * This is hopefully a temporary solution until BE processes metrics before passing to FE
- *
- * Related:
- * https://gitlab.com/gitlab-org/gitlab/-/issues/28241
- * https://gitlab.com/gitlab-org/gitlab/-/merge_requests/27447
- *
- * @param {Object} metric - metric
- * @param {Number} metric.metricId - Database metric id
- * @param {String} metric.id - User-defined identifier
- * @returns {Object} - normalized metric with a uniqueID
- */
-export const uniqMetricsId = ({ metricId, id }) => `${metricId || NOT_IN_DB_PREFIX}_${id}`;
-
-/**
- * Project path has a leading slash that doesn't work well
- * with project full path resolver here
- * https://gitlab.com/gitlab-org/gitlab/blob/5cad4bd721ab91305af4505b2abc92b36a56ad6b/app/graphql/resolvers/full_path_resolver.rb#L10
- *
- * @param {String} str String with leading slash
- * @returns {String}
- */
-export const removeLeadingSlash = (str) => (str || '').replace(/^\/+/, '');
-
-/**
- * GraphQL environments API returns only id and name.
- * For the environments dropdown we need metrics_path.
- * This method parses the results and add necessary attrs
- *
- * @param {Array} response Environments API result
- * @param {String} projectPath Current project path
- * @returns {Array}
- */
-export const parseEnvironmentsResponse = (response = [], projectPath) =>
- (response || []).map((env) => {
- const id = getIdFromGraphQLId(env.id);
- return {
- ...env,
- id,
- metrics_path: `${projectPath}/-/metrics?environment=${id}`,
- };
- });
-
-/**
- * Annotation API returns time in UTC. This method
- * converts time to local time.
- *
- * startingAt always exists but endingAt does not.
- * If endingAt does not exist, a threshold line is
- * drawn.
- *
- * If endingAt exists, a threshold range is drawn.
- * But this is not supported as of %12.10
- *
- * @param {Array} response annotations response
- * @returns {Array} parsed responses
- */
-export const parseAnnotationsResponse = (response) => {
- if (!response) {
- return [];
- }
- return response.map((annotation) => ({
- ...annotation,
- startingAt: new Date(annotation.startingAt),
- endingAt: annotation.endingAt ? new Date(annotation.endingAt) : null,
- }));
-};
-
-/**
- * Maps metrics to its view model
- *
- * This function difers from other in that is maps all
- * non-define properties as-is to the object. This is not
- * advisable as it could lead to unexpected side-effects.
- *
- * Related issue:
- * https://gitlab.com/gitlab-org/gitlab/issues/207198
- *
- * @param {Array} metrics - Array of prometheus metrics
- * @returns {Object}
- */
-const mapToMetricsViewModel = (metrics) =>
- metrics.map(
- ({
- label,
- id,
- metric_id: metricId,
- query_range: queryRange,
- prometheus_endpoint_path: prometheusEndpointPath,
- ...metric
- }) => ({
- label,
- queryRange,
- prometheusEndpointPath,
- metricId: uniqMetricsId({ metricId, id }),
-
- // metric data
- loading: false,
- result: null,
- state: null,
-
- ...metric,
- }),
- );
-
-/**
- * Maps X-axis view model
- *
- * @param {Object} axis
- */
-const mapXAxisToViewModel = ({ name = '' }) => ({ name });
-
-/**
- * Maps Y-axis view model
- *
- * Defaults to a 2 digit precision and `engineering` format. It only allows
- * formats in the SUPPORTED_FORMATS array.
- *
- * @param {Object} axis
- */
-const mapYAxisToViewModel = ({
- name = '',
- format = SUPPORTED_FORMATS.engineering,
- precision = 2,
-}) => {
- return {
- name,
- format: SUPPORTED_FORMATS[format] || SUPPORTED_FORMATS.engineering,
- precision,
- };
-};
-
-/**
- * Maps a link to its view model, expects an url and
- * (optionally) a title.
- *
- * Unsafe URLs are ignored.
- *
- * @param {Object} Link
- * @returns {Object} Link object with a `title`, `url` and `type`
- *
- */
-const mapLinksToViewModel = ({ url = null, title = '', type } = {}) => {
- return {
- title: title || String(url),
- type,
- url: url && isSafeURL(url) ? String(url) : '#',
- };
-};
-
-/**
- * Maps a metrics panel to its view model
- *
- * @param {Object} panel - Metrics panel
- * @returns {Object}
- */
-export const mapPanelToViewModel = ({
- id = null,
- title = '',
- type,
- x_axis: xAxisBase = {},
- x_label: xLabel,
- y_label: yLabel,
- y_axis: yAxisBase = {},
- field,
- metrics = [],
- links = [],
- min_value: minValue,
- max_value: maxValue,
- split,
- thresholds,
- format,
-}) => {
- // Both `x_axis.name` and `x_label` are supported for now
- // https://gitlab.com/gitlab-org/gitlab/issues/210521
- const xAxis = mapXAxisToViewModel({ name: xLabel, ...xAxisBase });
-
- // Both `y_axis.name` and `y_label` are supported for now
- // https://gitlab.com/gitlab-org/gitlab/issues/208385
- const yAxis = mapYAxisToViewModel({ name: yLabel, ...yAxisBase });
-
- return {
- id,
- title,
- type,
- xLabel: xAxis.name,
- y_label: yAxis.name, // Changing y_label to yLabel is pending https://gitlab.com/gitlab-org/gitlab/issues/207198
- yAxis,
- xAxis,
- field,
- minValue,
- maxValue,
- split,
- thresholds,
- format,
- links: links.map(mapLinksToViewModel),
- metrics: mapToMetricsViewModel(metrics),
- };
-};
-
-/**
- * Maps a metrics panel group to its view model
- *
- * @param {Object} panelGroup - Panel Group
- * @returns {Object}
- */
-const mapToPanelGroupViewModel = ({ group = '', panels = [] }, i) => {
- return {
- key: `${slugify(group || 'default')}-${i}`,
- group,
- panels: panels.map(mapPanelToViewModel),
- };
-};
-
-/**
- * Convert dashboard time range to Grafana
- * dashboards time range.
- *
- * @param {Object} timeRange
- * @returns {Object}
- */
-export const convertToGrafanaTimeRange = (timeRange) => {
- const timeRangeType = getRangeType(timeRange);
- if (timeRangeType === DATETIME_RANGE_TYPES.fixed) {
- return {
- from: new Date(timeRange.start).getTime(),
- to: new Date(timeRange.end).getTime(),
- };
- } else if (timeRangeType === DATETIME_RANGE_TYPES.rolling) {
- const { seconds } = timeRange.duration;
- return {
- from: `now-${seconds}s`,
- to: 'now',
- };
- }
- // fallback to returning the time range as is
- return timeRange;
-};
-
-/**
- * Convert dashboard time ranges to other supported
- * link formats.
- *
- * @param {Object} timeRange metrics dashboard time range
- * @param {String} type type of link
- * @returns {String}
- */
-export const convertTimeRanges = (timeRange, type) => {
- if (type === linkTypes.GRAFANA) {
- return convertToGrafanaTimeRange(timeRange);
- }
- return timeRangeToParams(timeRange);
-};
-
-/**
- * Adds dashboard-related metadata to the user-defined links.
- *
- * As of %13.1, metadata only includes timeRange but in the
- * future more info will be added to the links.
- *
- * @param {Object} metadata
- * @returns {Function}
- */
-export const addDashboardMetaDataToLink = (metadata) => (link) => {
- let modifiedLink = { ...link };
- if (metadata.timeRange) {
- modifiedLink = {
- ...modifiedLink,
- url: mergeUrlParams(convertTimeRanges(metadata.timeRange, link.type), link.url),
- };
- }
- return modifiedLink;
-};
-
-/**
- * Maps a dashboard json object to its view model
- *
- * @param {Object} dashboard - Dashboard object
- * @param {String} dashboard.dashboard - Dashboard name object
- * @param {Array} dashboard.panel_groups - Panel groups array
- * @returns {Object}
- */
-export const mapToDashboardViewModel = ({
- dashboard = '',
- templating = {},
- links = [],
- panel_groups: panelGroups = [],
-}) => {
- return {
- dashboard,
- variables: mergeURLVariables(parseTemplatingVariables(templating.variables)),
- links: links.map(mapLinksToViewModel),
- panelGroups: panelGroups.map(mapToPanelGroupViewModel),
- };
-};
-
-// Prometheus Results Parsing
-
-const dateTimeFromUnixTime = (unixTime) => new Date(unixTime * 1000).toISOString();
-
-const mapScalarValue = ([unixTime, value]) => [dateTimeFromUnixTime(unixTime), Number(value)];
-
-// Note: `string` value type is unused as of prometheus 2.19.
-const mapStringValue = ([unixTime, value]) => [dateTimeFromUnixTime(unixTime), value];
-
-/**
- * Processes a scalar result.
- *
- * The corresponding result property has the following format:
- *
- * [ <unix_time>, "<scalar_value>" ]
- *
- * @param {array} result
- * @returns {array}
- */
-const normalizeScalarResult = (result) => [
- {
- metric: {},
- value: mapScalarValue(result),
- values: [mapScalarValue(result)],
- },
-];
-
-/**
- * Processes a string result.
- *
- * The corresponding result property has the following format:
- *
- * [ <unix_time>, "<string_value>" ]
- *
- * Note: This value type is unused as of prometheus 2.19.
- *
- * @param {array} result
- * @returns {array}
- */
-const normalizeStringResult = (result) => [
- {
- metric: {},
- value: mapStringValue(result),
- values: [mapStringValue(result)],
- },
-];
-
-/**
- * Proccesses an instant vector.
- *
- * Instant vectors are returned as result type `vector`.
- *
- * The corresponding result property has the following format:
- *
- * [
- * {
- * "metric": { "<label_name>": "<label_value>", ... },
- * "value": [ <unix_time>, "<sample_value>" ],
- * "values": [ [ <unix_time>, "<sample_value>" ] ]
- * },
- * ...
- * ]
- *
- * `metric` - Key-value pairs object representing metric measured
- * `value` - The vector result
- * `values` - An array with a single value representing the result
- *
- * This method also adds the matrix version of the vector
- * by introducing a `values` array with a single element. This
- * allows charts to default to `values` if needed.
- *
- * @param {array} result
- * @returns {array}
- */
-const normalizeVectorResult = (result) =>
- result.map(({ metric, value }) => {
- const scalar = mapScalarValue(value);
- // Add a single element to `values`, to support matrix
- // style charts.
- return { metric, value: scalar, values: [scalar] };
- });
-
-/**
- * Range vectors are returned as result type matrix.
- *
- * The corresponding result property has the following format:
- *
- * {
- * "metric": { "<label_name>": "<label_value>", ... },
- * "value": [ <unix_time>, "<sample_value>" ],
- * "values": [ [ <unix_time>, "<sample_value>" ], ... ]
- * },
- *
- * `metric` - Key-value pairs object representing metric measured
- * `value` - The last (more recent) result
- * `values` - A range of results for the metric
- *
- * See https://prometheus.io/docs/prometheus/latest/querying/api/#range-vectors
- *
- * @param {array} result
- * @returns {object} Normalized result.
- */
-const normalizeResultMatrix = (result) =>
- result.map(({ metric, values }) => {
- const mappedValues = values.map(mapScalarValue);
- return {
- metric,
- value: mappedValues[mappedValues.length - 1],
- values: mappedValues,
- };
- });
-
-/**
- * Parse response data from a Prometheus Query that comes
- * in the format:
- *
- * {
- * "resultType": "matrix" | "vector" | "scalar" | "string",
- * "result": <value>
- * }
- *
- * @see https://prometheus.io/docs/prometheus/latest/querying/api/#expression-query-result-formats
- *
- * @param {object} data - Data containing results and result type.
- * @returns {object} - A result array of metric results:
- * [
- * {
- * metric: { ... },
- * value: ['2015-07-01T20:10:51.781Z', '1'],
- * values: [['2015-07-01T20:10:51.781Z', '1'] , ... ],
- * },
- * ...
- * ]
- *
- */
-export const normalizeQueryResponseData = (data) => {
- const { resultType, result } = data;
- if (resultType === 'vector') {
- return normalizeVectorResult(result);
- } else if (resultType === 'scalar') {
- return normalizeScalarResult(result);
- } else if (resultType === 'string') {
- return normalizeStringResult(result);
- }
- return normalizeResultMatrix(result);
-};
-
-/**
- * Custom variables defined in the dashboard yml file are
- * eventually passed over the wire to the backend Prometheus
- * API proxy.
- *
- * This method adds a prefix to the URL param keys so that
- * the backend can differential these variables from the other
- * variables.
- *
- * This is currently only used by getters/getCustomVariablesParams
- *
- * @param {String} name Variable key that needs to be prefixed
- * @returns {String}
- */
-export const addPrefixToCustomVariableParams = (name) => `variables[${name}]`;
-
-/**
- * Normalize custom dashboard paths. This method helps support
- * metrics dashboard to work with custom dashboard file names instead
- * of the entire path.
- *
- * If dashboard is empty, it is the overview dashboard.
- * If dashboard is set, it usually is a custom dashboard unless
- * explicitly it is set to overview dashboard path.
- *
- * @param {String} dashboard dashboard path
- * @param {String} dashboardPrefix custom dashboard directory prefix
- * @returns {String} normalized dashboard path
- */
-export const normalizeCustomDashboardPath = (dashboard, dashboardPrefix = '') => {
- const currDashboard = dashboard || '';
- let dashboardPath = `${dashboardPrefix}/${currDashboard}`;
-
- if (!currDashboard) {
- dashboardPath = '';
- } else if (
- currDashboard.startsWith(dashboardPrefix) ||
- currDashboard.startsWith(OUT_OF_THE_BOX_DASHBOARDS_PATH_PREFIX)
- ) {
- dashboardPath = currDashboard;
- }
- return dashboardPath;
-};
diff --git a/app/assets/javascripts/monitoring/stores/variable_mapping.js b/app/assets/javascripts/monitoring/stores/variable_mapping.js
deleted file mode 100644
index 4ca7a0b51d6..00000000000
--- a/app/assets/javascripts/monitoring/stores/variable_mapping.js
+++ /dev/null
@@ -1,273 +0,0 @@
-import { isString } from 'lodash';
-import { VARIABLE_TYPES } from '../constants';
-import { templatingVariablesFromUrl } from '../utils';
-
-/**
- * This file exclusively deals with parsing user-defined variables
- * in dashboard yml file.
- *
- * As of 13.0, simple text, advanced text, simple custom and
- * advanced custom variables are supported.
- *
- * In the future iterations, text and query variables will be
- * supported
- *
- */
-
-/**
- * Simple text variable is a string value only.
- * This method parses such variables to a standard format.
- *
- * @param {String|Object} simpleTextVar
- * @returns {Object}
- */
-const textSimpleVariableParser = (simpleTextVar) => ({
- type: VARIABLE_TYPES.text,
- label: null,
- value: simpleTextVar,
-});
-
-/**
- * Advanced text variable is an object.
- * This method parses such variables to a standard format.
- *
- * @param {Object} advTextVar
- * @returns {Object}
- */
-const textAdvancedVariableParser = (advTextVar) => ({
- type: VARIABLE_TYPES.text,
- label: advTextVar.label,
- value: advTextVar.options.default_value,
-});
-
-/**
- * Normalize simple and advanced custom variable options to a standard
- * format
- * @param {Object} custom variable option
- * @returns {Object} normalized custom variable options
- */
-const normalizeVariableValues = ({ default: defaultOpt = false, text, value = null }) => ({
- default: defaultOpt,
- text: text || value,
- value,
-});
-
-/**
- * Custom advanced variables are rendered as dropdown elements in the dashboard
- * header. This method parses advanced custom variables.
- *
- * The default value is the option with default set to true or the first option
- * if none of the options have default prop true.
- *
- * @param {Object} advVariable advanced custom variable
- * @returns {Object}
- */
-const customAdvancedVariableParser = (advVariable) => {
- const values = (advVariable?.options?.values ?? []).map(normalizeVariableValues);
- const defaultValue = values.find((opt) => opt.default === true) || values[0];
- return {
- type: VARIABLE_TYPES.custom,
- label: advVariable.label,
- options: {
- values,
- },
- value: defaultValue?.value || null,
- };
-};
-
-/**
- * Simple custom variables have an array of values.
- * This method parses such variables options to a standard format.
- *
- * @param {String} opt option from simple custom variable
- * @returns {Object}
- */
-export const parseSimpleCustomValues = (opt) => ({ text: opt, value: opt });
-
-/**
- * Custom simple variables are rendered as dropdown elements in the dashboard
- * header. This method parses simple custom variables.
- *
- * Simple custom variables do not have labels so its set to null here.
- *
- * The default value is set to the first option as the user cannot
- * set a default value for this format
- *
- * @param {Array} customVariable array of options
- * @returns {Object}
- */
-const customSimpleVariableParser = (simpleVar) => {
- const values = (simpleVar || []).map(parseSimpleCustomValues);
- return {
- type: VARIABLE_TYPES.custom,
- label: null,
- value: values[0].value || null,
- options: {
- values: values.map(normalizeVariableValues),
- },
- };
-};
-
-const metricLabelValuesVariableParser = ({ label, options = {} }) => ({
- type: VARIABLE_TYPES.metric_label_values,
- label,
- value: null,
- options: {
- prometheusEndpointPath: options.prometheus_endpoint_path || '',
- label: options.label || null,
- values: [], // values are initially empty
- },
-});
-
-/**
- * Utility method to determine if a custom variable is
- * simple or not. If its not simple, it is advanced.
- *
- * @param {Array|Object} customVar Array if simple, object if advanced
- * @returns {Boolean} true if simple, false if advanced
- */
-const isSimpleCustomVariable = (customVar) => Array.isArray(customVar);
-
-/**
- * This method returns a parser based on the type of the variable.
- * Currently, the supported variables are simple custom and
- * advanced custom only. In the future, this method will support
- * text and query variables.
- *
- * @param {Array|Object} variable
- * @return {Function} parser method
- */
-const getVariableParser = (variable) => {
- if (isString(variable)) {
- return textSimpleVariableParser;
- } else if (isSimpleCustomVariable(variable)) {
- return customSimpleVariableParser;
- } else if (variable.type === VARIABLE_TYPES.text) {
- return textAdvancedVariableParser;
- } else if (variable.type === VARIABLE_TYPES.custom) {
- return customAdvancedVariableParser;
- } else if (variable.type === VARIABLE_TYPES.metric_label_values) {
- return metricLabelValuesVariableParser;
- }
- return () => null;
-};
-
-/**
- * This method parses the templating property in the dashboard yml file.
- * The templating property has variables that are rendered as input elements
- * for the user to edit. The values from input elements are relayed to
- * backend and eventually Prometheus API.
- *
- * @param {Object} templating variables from the dashboard yml file
- * @returns {array} An array of variables to display as inputs
- */
-export const parseTemplatingVariables = (ymlVariables = {}) =>
- Object.entries(ymlVariables).reduce((acc, [name, ymlVariable]) => {
- // get the parser
- const parser = getVariableParser(ymlVariable);
- // parse the variable
- const variable = parser(ymlVariable);
- // for simple custom variable label is null and it should be
- // replace with key instead
- if (variable) {
- acc.push({
- ...variable,
- name,
- label: variable.label || name,
- });
- }
- return acc;
- }, []);
-
-/**
- * Custom variables are defined in the dashboard yml file
- * and their values can be passed through the URL.
- *
- * On component load, this method merges variables data
- * from the yml file with URL data to store in the Vuex store.
- * Not all params coming from the URL need to be stored. Only
- * the ones that have a corresponding variable defined in the
- * yml file.
- *
- * This ensures that there is always a single source of truth
- * for variables
- *
- * This method can be improved further. See the below issue
- * https://gitlab.com/gitlab-org/gitlab/-/issues/217713
- *
- * @param {array} parsedYmlVariables - template variables from yml file
- * @returns {Object}
- */
-export const mergeURLVariables = (parsedYmlVariables = []) => {
- const varsFromURL = templatingVariablesFromUrl();
- parsedYmlVariables.forEach((variable) => {
- const { name } = variable;
- if (Object.prototype.hasOwnProperty.call(varsFromURL, name)) {
- Object.assign(variable, { value: varsFromURL[name] });
- }
- });
- return parsedYmlVariables;
-};
-
-/**
- * Converts series data to options that can be added to a
- * variable. Series data is returned from the Prometheus API
- * `/api/v1/series`.
- *
- * Finds a `label` in the series data, so it can be used as
- * a filter.
- *
- * For example, for the arguments:
- *
- * {
- * "label": "job"
- * "data" : [
- * {
- * "__name__" : "up",
- * "job" : "prometheus",
- * "instance" : "localhost:9090"
- * },
- * {
- * "__name__" : "up",
- * "job" : "node",
- * "instance" : "localhost:9091"
- * },
- * {
- * "__name__" : "process_start_time_seconds",
- * "job" : "prometheus",
- * "instance" : "localhost:9090"
- * }
- * ]
- * }
- *
- * It returns all the different "job" values:
- *
- * [
- * {
- * "label": "node",
- * "value": "node"
- * },
- * {
- * "label": "prometheus",
- * "value": "prometheus"
- * }
- * ]
- *
- * @param {options} options object
- * @param {options.seriesLabel} name of the searched series label
- * @param {options.data} series data from the series API
- * @return {array} Options objects with the shape `{ label, value }`
- *
- * @see https://prometheus.io/docs/prometheus/latest/querying/api/#finding-series-by-label-matchers
- */
-export const optionsFromSeriesData = ({ label, data = [] }) => {
- const optionsSet = data.reduce((set, seriesObject) => {
- // Use `new Set` to deduplicate options
- if (seriesObject[label]) {
- set.add(seriesObject[label]);
- }
- return set;
- }, new Set());
-
- return [...optionsSet].map(parseSimpleCustomValues);
-};
diff --git a/app/assets/javascripts/monitoring/utils.js b/app/assets/javascripts/monitoring/utils.js
deleted file mode 100644
index 5f4d2703d21..00000000000
--- a/app/assets/javascripts/monitoring/utils.js
+++ /dev/null
@@ -1,402 +0,0 @@
-import { pickBy, mapKeys } from 'lodash';
-import { parseBoolean } from '~/lib/utils/common_utils';
-import {
- timeRangeParamNames,
- timeRangeFromParams,
- timeRangeToParams,
-} from '~/lib/utils/datetime_range';
-import {
- queryToObject,
- mergeUrlParams,
- removeParams,
- updateHistory,
-} from '~/lib/utils/url_utility';
-import { VARIABLE_PREFIX } from './constants';
-
-/**
- * Extracts the initial state and props from HTML dataset
- * and places them in separate objects to setup bundle.
- * @param {*} dataset
- */
-export const stateAndPropsFromDataset = (dataset = {}) => {
- const {
- currentDashboard,
- deploymentsEndpoint,
- dashboardEndpoint,
- dashboardsEndpoint,
- panelPreviewEndpoint,
- dashboardTimezone,
- canAccessOperationsSettings,
- operationsSettingsPath,
- projectPath,
- externalDashboardUrl,
- currentEnvironmentName,
- customDashboardBasePath,
- addDashboardDocumentationPath,
- ...dataProps
- } = dataset;
-
- // HTML attributes are always strings, parse other types.
- dataProps.hasMetrics = parseBoolean(dataProps.hasMetrics);
- dataProps.customMetricsAvailable = parseBoolean(dataProps.customMetricsAvailable);
-
- return {
- initState: {
- currentDashboard,
- deploymentsEndpoint,
- dashboardEndpoint,
- dashboardsEndpoint,
- panelPreviewEndpoint,
- dashboardTimezone,
- canAccessOperationsSettings,
- operationsSettingsPath,
- projectPath,
- externalDashboardUrl,
- currentEnvironmentName,
- customDashboardBasePath,
- addDashboardDocumentationPath,
- },
- dataProps,
- };
-};
-
-/**
- * List of non time range url parameters
- * This will be removed once we add support for free text variables
- * via the dashboard yaml files in https://gitlab.com/gitlab-org/gitlab/-/issues/215689
- */
-export const dashboardParams = ['dashboard', 'group', 'title', 'y_label', 'embedded'];
-
-/**
- * This method is used to validate if the graph data format for a chart component
- * that needs a time series as a response from a prometheus query (queryRange) is
- * of a valid format or not.
- * @param {Object} graphData the graph data response from a prometheus request
- * @returns {boolean} whether the graphData format is correct
- */
-export const graphDataValidatorForValues = (isValues, graphData) => {
- const responseValueKeyName = isValues ? 'value' : 'values';
- return (
- Array.isArray(graphData.metrics) &&
- graphData.metrics.filter((query) => {
- if (Array.isArray(query.result)) {
- return (
- query.result.filter((res) => Array.isArray(res[responseValueKeyName])).length ===
- query.result.length
- );
- }
- return false;
- }).length === graphData.metrics.filter((query) => query.result).length
- );
-};
-
-/**
- * Checks that element that triggered event is located on cluster health check dashboard
- * @param {HTMLElement} element to check against
- * @returns {boolean}
- */
-const isClusterHealthBoard = () => (document.body.dataset.page || '').includes(':clusters:show');
-
-/**
- * Tracks snowplow event when user generates link to metric chart
- * @param {String} chart link that will be sent as a property for the event
- * @return {Object} config object for event tracking
- */
-export const generateLinkToChartOptions = (chartLink) => {
- const isCLusterHealthBoard = isClusterHealthBoard();
-
- const category = isCLusterHealthBoard
- ? 'Cluster Monitoring' // eslint-disable-line @gitlab/require-i18n-strings
- : 'Incident Management::Embedded metrics';
- const action = isCLusterHealthBoard
- ? 'generate_link_to_cluster_metric_chart'
- : 'generate_link_to_metrics_chart';
-
- return { category, action, label: 'Chart link', property: chartLink }; // eslint-disable-line @gitlab/require-i18n-strings
-};
-
-/**
- * Tracks snowplow event when user downloads CSV of cluster metric
- * @param {String} chart title that will be sent as a property for the event
- * @return {Object} config object for event tracking
- */
-export const downloadCSVOptions = (title) => {
- const isCLusterHealthBoard = isClusterHealthBoard();
-
- const category = isCLusterHealthBoard
- ? 'Cluster Monitoring' // eslint-disable-line @gitlab/require-i18n-strings
- : 'Incident Management::Embedded metrics';
- const action = isCLusterHealthBoard
- ? 'download_csv_of_cluster_metric_chart'
- : 'download_csv_of_metrics_dashboard_chart';
-
- return { category, action, label: 'Chart title', property: title }; // eslint-disable-line @gitlab/require-i18n-strings
-};
-/* eslint-enable @gitlab/require-i18n-strings */
-
-/**
- * Generate options for snowplow to track adding a new metric via the dashboard
- * custom metric modal
- * @return {Object} config object for event tracking
- */
-export const getAddMetricTrackingOptions = () => ({
- category: document.body.dataset.page,
- action: 'click_button',
- label: 'add_new_metric',
- property: 'modal',
-});
-
-/**
- * This function validates the graph data contains exactly 3 metrics plus
- * value validations from graphDataValidatorForValues.
- * @param {Object} isValues
- * @param {Object} graphData the graph data response from a prometheus request
- * @returns {boolean} true if the data is valid
- */
-export const graphDataValidatorForAnomalyValues = (graphData) => {
- const anomalySeriesCount = 3; // metric, upper, lower
- return (
- graphData.metrics &&
- graphData.metrics.length === anomalySeriesCount &&
- graphDataValidatorForValues(false, graphData)
- );
-};
-
-/**
- * Returns a time range from the current URL params
- *
- * @returns {Object|null} The time range defined by the
- * current URL, reading from search query or `window.location.search`.
- * Returns `null` if no parameters form a time range.
- */
-export const timeRangeFromUrl = (search = window.location.search) => {
- const params = queryToObject(search, { legacySpacesDecode: true });
- return timeRangeFromParams(params);
-};
-
-/**
- * Variable labels are used as names for the dropdowns and also
- * as URL params. Prefixing the name reduces the risk of
- * collision with other URL params
- *
- * @param {String} label label for the template variable
- * @returns {String}
- */
-export const addPrefixToLabel = (label) => `${VARIABLE_PREFIX}${label}`;
-
-/**
- * Before the templating variables are passed to the backend the
- * prefix needs to be removed.
- *
- * This method removes the prefix at the beginning of the string.
- *
- * @param {String} label label to remove prefix from
- * @returns {String}
- */
-export const removePrefixFromLabel = (label) =>
- (label || '').replace(new RegExp(`^${VARIABLE_PREFIX}`), '');
-
-/**
- * Convert parsed template variables to an object
- * with just keys and values. Prepare the variables
- * to be added to the URL. Keys of the object will
- * have a prefix so that these params can be
- * differentiated from other URL params.
- *
- * @param {Object} variables
- * @returns {Object}
- */
-export const convertVariablesForURL = (variables) =>
- variables.reduce((acc, { name, value }) => {
- if (value !== null) {
- acc[addPrefixToLabel(name)] = value;
- }
- return acc;
- }, {});
-
-/**
- * User-defined variables from the URL are extracted. The variables
- * begin with a constant prefix so that it doesn't collide with
- * other URL params.
- *
- * @param {String} search URL
- * @returns {Object} The custom variables defined by the user in the URL
- */
-export const templatingVariablesFromUrl = (search = window.location.search) => {
- const params = queryToObject(search, { legacySpacesDecode: true });
- // pick the params with variable prefix
- const paramsWithVars = pickBy(params, (val, key) => key.startsWith(VARIABLE_PREFIX));
- // remove the prefix before storing in the Vuex store
- return mapKeys(paramsWithVars, (val, key) => removePrefixFromLabel(key));
-};
-
-/**
- * Update the URL with variables. This usually get triggered when
- * the user interacts with the dynamic input elements in the monitoring
- * dashboard header.
- *
- * @param {Object} variables user defined variables
- */
-export const setCustomVariablesFromUrl = (variables) => {
- // prep the variables to append to URL
- const parsedVariables = convertVariablesForURL(variables);
- // update the URL
- updateHistory({
- url: mergeUrlParams(parsedVariables, window.location.href),
- title: document.title,
- });
-};
-
-/**
- * Returns a URL with no time range based on the current URL.
- *
- * @param {String} New URL
- */
-export const removeTimeRangeParams = (url = window.location.href) =>
- removeParams(timeRangeParamNames, url);
-
-/**
- * Returns a URL for the a different time range based on the
- * current URL and a time range.
- *
- * @param {String} New URL
- */
-export const timeRangeToUrl = (timeRange, url = window.location.href) => {
- const toUrl = removeTimeRangeParams(url);
- const params = timeRangeToParams(timeRange);
- return mergeUrlParams(params, toUrl);
-};
-
-/**
- * Locates a panel (and its corresponding group) given a (URL) search query. Returns
- * it as payload for the store to set the right expandaded panel.
- *
- * Params used to locate a panel are:
- * - group: Group identifier
- * - title: Panel title
- * - y_label: Panel y_label
- *
- * @param {Object} dashboard - Dashboard reference from the Vuex store
- * @param {String} search - URL location search query
- * @returns {Object} payload - Payload for expanded panel to be displayed
- * @returns {String} payload.group - Group where panel is located
- * @returns {Object} payload.panel - Dashboard panel (graphData) reference
- * @throws Will throw an error if Panel cannot be located.
- */
-export const expandedPanelPayloadFromUrl = (dashboard, search = window.location.search) => {
- const params = queryToObject(search, { legacySpacesDecode: true });
-
- // Search for the panel if any of the search params is identified
- if (params.group || params.title || params.y_label) {
- const panelGroup = dashboard.panelGroups.find(({ group }) => params.group === group);
- const panel = panelGroup.panels.find(
- // eslint-disable-next-line camelcase
- ({ y_label, title }) => y_label === params.y_label && title === params.title,
- );
-
- if (!panel) {
- // eslint-disable-next-line @gitlab/require-i18n-strings
- throw new Error('Panel could no found by URL parameters.');
- }
- return { group: panelGroup.group, panel };
- }
- return null;
-};
-
-/**
- * Convert panel information to a URL for the user to
- * bookmark or share highlighting a specific panel.
- *
- * If no group/panel is set, the dashboard URL is returned.
- *
- * @param {?String} dashboard - Dashboard path, used as identifier for a dashboard
- * @param {?Object} variables - Custom variables that came from the URL
- * @param {?String} group - Group Identifier
- * @param {?Object} panel - Panel object from the dashboard
- * @param {?String} url - Base URL including current search params
- * @returns Dashboard URL which expands a panel (chart)
- */
-export const panelToUrl = (
- dashboard = null,
- variables,
- group,
- panel,
- url = window.location.href,
-) => {
- const params = {
- dashboard,
- ...variables,
- };
-
- if (group && panel) {
- params.group = group;
- params.title = panel.title;
- params.y_label = panel.y_label;
- } else {
- // Remove existing parameters if any
- params.group = null;
- params.title = null;
- params.y_label = null;
- }
-
- return mergeUrlParams(params, url);
-};
-
-/**
- * Get the metric value from first data point.
- * Currently only used for bar charts
- *
- * @param {Array} values data points
- * @returns {Number}
- */
-const metricValueMapper = (values) => values[0]?.[1];
-
-/**
- * Get the metric name from metric object
- * Currently only used for bar charts
- * e.g. { handler: '/query' }
- * { method: 'get' }
- *
- * @param {Object} metric metric object
- * @returns {String}
- */
-const metricNameMapper = (metric) => Object.values(metric)?.[0];
-
-/**
- * Parse metric object to extract metric value and name in
- * [<metric-value>, <metric-name>] format.
- * Currently only used for bar charts
- *
- * @param {Object} param0 metric object
- * @returns {Array}
- */
-const resultMapper = ({ metric, values = [] }) => [
- metricValueMapper(values),
- metricNameMapper(metric),
-];
-
-/**
- * Bar charts graph data parser to massage data from
- * backend to a format acceptable by bar charts component
- * in GitLab UI
- *
- * e.g.
- * {
- * SLO: [
- * [98, 'api'],
- * [99, 'web'],
- * [99, 'database']
- * ]
- * }
- *
- * @param {Array} data series information
- * @returns {Object}
- */
-export const barChartsDataParser = (data = []) =>
- data?.reduce(
- (acc, { result = [], label }) => ({
- ...acc,
- [label]: result.map(resultMapper),
- }),
- {},
- );
diff --git a/app/assets/javascripts/monitoring/validators.js b/app/assets/javascripts/monitoring/validators.js
deleted file mode 100644
index 05a9d8b9db5..00000000000
--- a/app/assets/javascripts/monitoring/validators.js
+++ /dev/null
@@ -1,55 +0,0 @@
-import { isSafeURL } from '~/lib/utils/url_utility';
-
-const isRunbookUrlValid = (runbookUrl) => {
- if (!runbookUrl) {
- return true;
- }
- return isSafeURL(runbookUrl);
-};
-
-// Prop validator for alert information, expecting an object like the example below.
-//
-// {
-// '/root/autodevops-deploy/prometheus/alerts/16.json?environment_id=37': {
-// alert_path: "/root/autodevops-deploy/prometheus/alerts/16.json?environment_id=37",
-// metricId: '1',
-// operator: ">",
-// query: "rate(http_requests_total[5m])[30m:1m]",
-// threshold: 0.002,
-// title: "Core Usage (Total)",
-// runbookUrl: "https://www.gitlab.com/my-project/-/wikis/runbook"
-// }
-// }
-export function alertsValidator(value) {
- return Object.keys(value).every((key) => {
- const alert = value[key];
- return (
- alert.alert_path &&
- key === alert.alert_path &&
- alert.metricId &&
- typeof alert.metricId === 'string' &&
- alert.operator &&
- typeof alert.threshold === 'number' &&
- isRunbookUrlValid(alert.runbookUrl)
- );
- });
-}
-
-// Prop validator for query information, expecting an array like the example below.
-//
-// [
-// {
-// metricId: '16',
-// label: 'Total Cores'
-// },
-// {
-// metricId: '17',
-// label: 'Sub-total Cores'
-// }
-// ]
-export function queriesValidator(value) {
- return value.every(
- (query) =>
- query.metricId && typeof query.metricId === 'string' && typeof query.label === 'string',
- );
-}
diff --git a/app/assets/javascripts/mr_more_dropdown.js b/app/assets/javascripts/mr_more_dropdown.js
index 720619b72ae..4a9e10be5ad 100644
--- a/app/assets/javascripts/mr_more_dropdown.js
+++ b/app/assets/javascripts/mr_more_dropdown.js
@@ -1,4 +1,5 @@
import Vue from 'vue';
+import { initReportAbuse } from '~/projects/report_abuse';
import MrMoreDropdown from '~/vue_shared/components/mr_more_dropdown.vue';
export const initMrMoreDropdown = () => {
@@ -11,6 +12,7 @@ export const initMrMoreDropdown = () => {
const {
mergeRequest,
projectPath,
+ url,
editUrl,
isCurrentUser,
isLoggedIn,
@@ -20,7 +22,6 @@ export const initMrMoreDropdown = () => {
sourceProjectMissing,
clipboardText,
reportedUserId,
- reportedFromUrl,
} = el.dataset;
let mr;
@@ -35,12 +36,17 @@ export const initMrMoreDropdown = () => {
el,
provide: {
reportAbusePath: el.dataset.reportAbusePath,
+ showSummaryNotesToggle: Boolean(document.querySelector('#js-summary-notes')),
+ },
+ beforeCreate() {
+ initReportAbuse();
},
render: (createElement) =>
createElement(MrMoreDropdown, {
props: {
mr,
projectPath,
+ url,
editUrl,
isCurrentUser,
isLoggedIn: Boolean(isLoggedIn),
@@ -50,7 +56,6 @@ export const initMrMoreDropdown = () => {
sourceProjectMissing,
clipboardText,
reportedUserId: Number(reportedUserId),
- reportedFromUrl,
},
}),
});
diff --git a/app/assets/javascripts/mr_notes/init.js b/app/assets/javascripts/mr_notes/init.js
index e8e3376cee2..28f294589ae 100644
--- a/app/assets/javascripts/mr_notes/init.js
+++ b/app/assets/javascripts/mr_notes/init.js
@@ -1,12 +1,13 @@
-import { parseBoolean } from '~/lib/utils/common_utils';
+import { parseBoolean, getCookie } from '~/lib/utils/common_utils';
import mrNotes from '~/mr_notes/stores';
-import { getLocationHash } from '~/lib/utils/url_utility';
+import { getLocationHash, getParameterValues } from '~/lib/utils/url_utility';
import eventHub from '~/notes/event_hub';
import { initReviewBar } from '~/batch_comments';
import { initDiscussionCounter } from '~/mr_notes/discussion_counter';
import { initOverviewTabCounter } from '~/mr_notes/init_count';
import { getDerivedMergeRequestInformation } from '~/diffs/utils/merge_request';
import { getReviewsForMergeRequest } from '~/diffs/utils/file_reviews';
+import { DIFF_VIEW_COOKIE_NAME, INLINE_DIFF_VIEW_TYPE } from '~/diffs/constants';
function setupMrNotesState(store, notesDataset, diffsDataset) {
const noteableData = JSON.parse(notesDataset.noteableData);
@@ -37,6 +38,8 @@ function setupMrNotesState(store, notesDataset, diffsDataset) {
viewDiffsFileByFile: parseBoolean(diffsDataset.fileByFileDefault),
defaultSuggestionCommitMessage: diffsDataset.defaultSuggestionCommitMessage,
mrReviews: getReviewsForMergeRequest(mrPath),
+ diffViewType:
+ getParameterValues('view')[0] || getCookie(DIFF_VIEW_COOKIE_NAME) || INLINE_DIFF_VIEW_TYPE,
});
}
diff --git a/app/assets/javascripts/nav/components/new_nav_toggle.vue b/app/assets/javascripts/nav/components/new_nav_toggle.vue
index 9db123da405..c36c56d7e43 100644
--- a/app/assets/javascripts/nav/components/new_nav_toggle.vue
+++ b/app/assets/javascripts/nav/components/new_nav_toggle.vue
@@ -71,7 +71,12 @@ export default {
class="gl-new-dropdown-item-text-wrapper gl-display-flex! gl-justify-content-space-between gl-align-items-center gl-py-2!"
>
{{ $options.i18n.toggleMenuItemLabel }}
- <gl-toggle :value="isEnabled" :label="$options.i18n.toggleLabel" label-position="hidden" />
+ <gl-toggle
+ :value="isEnabled"
+ :label="$options.i18n.toggleLabel"
+ label-position="hidden"
+ data-testid="new-navigation-toggle"
+ />
</div>
</div>
</gl-disclosure-dropdown-item>
@@ -92,7 +97,7 @@ export default {
:value="isEnabled"
:label="$options.i18n.toggleLabel"
label-position="hidden"
- data-qa-selector="new_navigation_toggle"
+ data-testid="new_navigation_toggle"
/>
</div>
</li>
diff --git a/app/assets/javascripts/nav/components/responsive_home.vue b/app/assets/javascripts/nav/components/responsive_home.vue
index a80fda96363..371b252a6ba 100644
--- a/app/assets/javascripts/nav/components/responsive_home.vue
+++ b/app/assets/javascripts/nav/components/responsive_home.vue
@@ -55,7 +55,7 @@ export default {
v-gl-tooltip="{ title: newDropdownViewModel.title }"
:view-model="newDropdownViewModel"
class="gl-ml-3"
- data-qa-selector="mobile_new_dropdown"
+ data-testid="mobile_new_dropdown"
/>
</header>
<top-nav-menu-sections class="gl-h-full" :sections="menuSections" v-on="$listeners" />
diff --git a/app/assets/javascripts/nav/components/top_nav_app.vue b/app/assets/javascripts/nav/components/top_nav_app.vue
index ab9313f7041..22c77e9ae32 100644
--- a/app/assets/javascripts/nav/components/top_nav_app.vue
+++ b/app/assets/javascripts/nav/components/top_nav_app.vue
@@ -35,7 +35,7 @@ export default {
<gl-nav class="navbar-sub-nav">
<gl-nav-item-dropdown
v-gl-tooltip.bottom="navData.menuTooltip"
- data-qa-selector="navbar_dropdown"
+ data-testid="navbar_dropdown"
data-qa-title="Menu"
menu-class="gl-mt-3! gl-max-w-none! gl-max-h-none! gl-sm-w-auto! js-top-nav-dropdown-menu"
toggle-class="top-nav-toggle js-top-nav-dropdown-toggle gl-px-3!"
diff --git a/app/assets/javascripts/nav/components/top_nav_dropdown_menu.vue b/app/assets/javascripts/nav/components/top_nav_dropdown_menu.vue
index 0f069670d09..fa202a0574d 100644
--- a/app/assets/javascripts/nav/components/top_nav_dropdown_menu.vue
+++ b/app/assets/javascripts/nav/components/top_nav_dropdown_menu.vue
@@ -87,7 +87,6 @@ export default {
:slot-key="activeView"
class="gl-w-grid-size-40 gl-overflow-hidden gl-p-3"
data-testid="menu-subview"
- data-qa-selector="menu_subview_container"
>
<template #projects>
<top-nav-container-view
diff --git a/app/assets/javascripts/notes/components/comment_field_layout.vue b/app/assets/javascripts/notes/components/comment_field_layout.vue
index bde7d219e9f..cefcc1b0c98 100644
--- a/app/assets/javascripts/notes/components/comment_field_layout.vue
+++ b/app/assets/javascripts/notes/components/comment_field_layout.vue
@@ -66,9 +66,7 @@ export default {
};
</script>
<template>
- <div
- class="comment-warning-wrapper gl-border-solid gl-border-1 gl-rounded-lg gl-border-gray-100 gl-bg-white gl-overflow-hidden"
- >
+ <div class="comment-warning-wrapper">
<div
v-if="withAlertContainer"
class="error-alert"
@@ -76,7 +74,7 @@ export default {
></div>
<noteable-warning
v-if="hasWarning"
- class="gl-py-4 gl-border-b-1 gl-border-b-solid gl-border-b-gray-100 gl-rounded-base gl-rounded-bottom-left-none gl-rounded-bottom-right-none"
+ class="gl-pt-4 gl-pb-5 gl-mb-n3 gl-rounded-lg gl-rounded-bottom-left-none gl-rounded-bottom-right-none"
:is-locked="isLocked"
:is-confidential="isConfidential"
:noteable-type="noteableType"
@@ -84,10 +82,20 @@ export default {
:confidential-noteable-docs-path="noteableData.confidential_issues_docs_path"
/>
<slot></slot>
- <attachments-warning v-if="showAttachmentWarning" />
+ <attachments-warning
+ v-if="showAttachmentWarning"
+ :class="{
+ 'gl-py-3': !showEmailParticipantsWarning,
+ 'gl-pt-4 gl-pb-3 gl-mt-n3': showEmailParticipantsWarning,
+ }"
+ />
<email-participants-warning
v-if="showEmailParticipantsWarning"
- class="gl-border-t-1 gl-border-t-solid gl-border-t-gray-100 gl-rounded-base gl-rounded-top-left-none! gl-rounded-top-right-none!"
+ class="gl-border-t-1 gl-rounded-lg gl-rounded-top-left-none! gl-rounded-top-right-none!"
+ :class="{
+ 'gl-pt-4 gl-pb-3 gl-mt-n3': !showAttachmentWarning,
+ 'gl-py-3 gl-mt-1': showAttachmentWarning,
+ }"
:emails="emailParticipants"
/>
</div>
diff --git a/app/assets/javascripts/notes/components/comment_form.vue b/app/assets/javascripts/notes/components/comment_form.vue
index cba0f960c00..c6d94a3b7b7 100644
--- a/app/assets/javascripts/notes/components/comment_form.vue
+++ b/app/assets/javascripts/notes/components/comment_form.vue
@@ -16,11 +16,12 @@ import { sprintf } from '~/locale';
import MarkdownEditor from '~/vue_shared/components/markdown/markdown_editor.vue';
import TimelineEntryItem from '~/vue_shared/components/notes/timeline_entry_item.vue';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import { trackSavedUsingEditor } from '~/vue_shared/components/markdown/tracking';
import * as constants from '../constants';
import eventHub from '../event_hub';
import { COMMENT_FORM } from '../i18n';
-import { getErrorMessages } from '../utils';
+import { createNoteErrorMessages } from '../utils';
import issuableStateMixin from '../mixins/issuable_state';
import CommentFieldLayout from './comment_field_layout.vue';
@@ -146,9 +147,6 @@ export default {
markdownDocsPath() {
return this.getNotesData.markdownDocsPath;
},
- quickActionsDocsPath() {
- return this.getNotesData.quickActionsDocsPath;
- },
markdownPreviewPath() {
return this.getNoteableData.preview_note_path;
},
@@ -219,7 +217,7 @@ export default {
'toggleIssueLocalState',
]),
handleSaveError({ data, status }) {
- this.errors = getErrorMessages(data, status);
+ this.errors = createNoteErrorMessages(data, status);
},
handleSaveDraft() {
this.handleSave({ isDraft: true });
@@ -258,6 +256,11 @@ export default {
this.isSubmitting = true;
+ trackSavedUsingEditor(
+ this.$refs.markdownEditor.isContentEditorActive,
+ `${this.noteableType}_${this.noteType}`,
+ );
+
this.saveNote(noteData)
.then(() => {
this.restartPolling();
@@ -366,7 +369,6 @@ export default {
:render-markdown-path="markdownPreviewPath"
:markdown-docs-path="markdownDocsPath"
:add-spacing-classes="false"
- :quick-actions-docs-path="quickActionsDocsPath"
:form-field-props="formFieldProps"
:autosave-key="autosaveKey"
:disabled="isSubmitting"
diff --git a/app/assets/javascripts/notes/components/comment_type_dropdown.vue b/app/assets/javascripts/notes/components/comment_type_dropdown.vue
index 543be838920..2e4f925194f 100644
--- a/app/assets/javascripts/notes/components/comment_type_dropdown.vue
+++ b/app/assets/javascripts/notes/components/comment_type_dropdown.vue
@@ -1,16 +1,20 @@
<script>
-import { GlDropdown, GlDropdownItem, GlDropdownDivider } from '@gitlab/ui';
+import { GlButtonGroup, GlButton, GlCollapsibleListbox } from '@gitlab/ui';
-import { sprintf } from '~/locale';
+import { sprintf, __ } from '~/locale';
import { COMMENT_FORM } from '~/notes/i18n';
import * as constants from '../constants';
export default {
- i18n: COMMENT_FORM,
+ name: 'CommentTypeDropdown',
+ i18n: {
+ ...COMMENT_FORM,
+ toggleSrText: __('Comment type'),
+ },
components: {
- GlDropdown,
- GlDropdownItem,
- GlDropdownDivider,
+ GlButtonGroup,
+ GlButton,
+ GlCollapsibleListbox,
},
model: {
prop: 'noteType',
@@ -93,56 +97,63 @@ export default {
noteableDisplayName: this.noteableDisplayName,
});
},
+ dropdownItems() {
+ return [
+ {
+ text: this.dropdownCommentButtonTitle,
+ description: this.commentDescription,
+ value: constants.COMMENT,
+ },
+ {
+ text: this.dropdownStartThreadButtonTitle,
+ description: this.startDiscussionDescription,
+ value: constants.DISCUSSION,
+ qaSelector: 'discussion_menu_item',
+ },
+ ];
+ },
},
methods: {
handleClick() {
this.$emit('click');
},
- setNoteTypeToComment() {
- if (this.noteType !== constants.COMMENT) {
- this.$emit('change', constants.COMMENT);
- }
- },
- setNoteTypeToDiscussion() {
- if (this.noteType !== constants.DISCUSSION) {
- this.$emit('change', constants.DISCUSSION);
- }
+ setNoteType(value) {
+ this.$emit('change', value);
},
},
};
</script>
<template>
- <gl-dropdown
- split
- :text="commentButtonTitle"
- class="gl-mr-3 js-comment-button js-comment-submit-button comment-type-dropdown"
- category="primary"
- variant="confirm"
- :disabled="disabled"
- data-testid="comment-button"
- data-qa-selector="comment_button"
+ <!--TODO: Replace button-group workaround once `split` option for new dropdowns is implemented.-->
+ <!-- See issue at https://gitlab.com/gitlab-org/gitlab-ui/-/issues/2263-->
+ <gl-button-group
+ class="js-comment-button js-comment-submit-button comment-type-dropdown gl-w-full gl-mb-3 gl-md-w-auto gl-md-mb-0"
:data-track-label="trackingLabel"
data-track-action="click_button"
- @click="$emit('click')"
+ data-testid="comment-button"
+ data-qa-selector="comment_button"
>
- <gl-dropdown-item
- is-check-item
- :is-checked="isNoteTypeComment"
- @click.stop.prevent="setNoteTypeToComment"
- >
- <strong>{{ dropdownCommentButtonTitle }}</strong>
- <p class="gl-m-0">{{ commentDescription }}</p>
- </gl-dropdown-item>
- <gl-dropdown-divider />
- <gl-dropdown-item
- is-check-item
- :is-checked="isNoteTypeDiscussion"
- data-qa-selector="discussion_menu_item"
- @click.stop.prevent="setNoteTypeToDiscussion"
+ <gl-button variant="confirm" :disabled="disabled" @click="handleClick">
+ {{ commentButtonTitle }}
+ </gl-button>
+ <gl-collapsible-listbox
+ class="split"
+ toggle-class="gl-rounded-top-left-none! gl-rounded-bottom-left-none! gl-pl-1!"
+ variant="confirm"
+ text-sr-only
+ :toggle-text="$options.i18n.toggleSrText"
+ :disabled="disabled"
+ :items="dropdownItems"
+ :selected="noteType"
+ @select="setNoteType"
>
- <strong>{{ dropdownStartThreadButtonTitle }}</strong>
- <p class="gl-m-0">{{ startDiscussionDescription }}</p>
- </gl-dropdown-item>
- </gl-dropdown>
+ <template #list-item="{ item }">
+ <div :data-qa-selector="item.qaSelector">
+ <strong>{{ item.text }}</strong>
+ <p class="gl-m-0">{{ item.description }}</p>
+ </div>
+ </template>
+ </gl-collapsible-listbox>
+ </gl-button-group>
</template>
diff --git a/app/assets/javascripts/notes/components/diff_discussion_header.vue b/app/assets/javascripts/notes/components/diff_discussion_header.vue
index c53d3203327..e7b7ba7743e 100644
--- a/app/assets/javascripts/notes/components/diff_discussion_header.vue
+++ b/app/assets/javascripts/notes/components/diff_discussion_header.vue
@@ -107,7 +107,13 @@ export default {
<template>
<div class="discussion-header gl-display-flex gl-align-items-center">
<div v-once class="timeline-avatar gl-align-self-start gl-flex-shrink-0 gl-flex-shrink">
- <gl-avatar-link v-if="author" :href="author.path">
+ <gl-avatar-link
+ v-if="author"
+ :href="author.path"
+ :data-user-id="author.id"
+ :data-username="author.username"
+ class="js-user-link"
+ >
<gl-avatar :src="author.avatar_url" :alt="author.name" :size="32" />
</gl-avatar-link>
</div>
diff --git a/app/assets/javascripts/notes/components/discussion_counter.vue b/app/assets/javascripts/notes/components/discussion_counter.vue
index ba5ffc60917..cff1043c258 100644
--- a/app/assets/javascripts/notes/components/discussion_counter.vue
+++ b/app/assets/javascripts/notes/components/discussion_counter.vue
@@ -1,13 +1,6 @@
<script>
-import {
- GlTooltipDirective,
- GlButton,
- GlButtonGroup,
- GlDropdown,
- GlDropdownItem,
- GlIcon,
-} from '@gitlab/ui';
-import { mapGetters, mapActions } from 'vuex';
+import { GlButton, GlButtonGroup, GlDisclosureDropdown, GlTooltipDirective } from '@gitlab/ui';
+import { mapActions, mapGetters } from 'vuex';
import { throttle } from 'lodash';
import { __ } from '~/locale';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
@@ -18,11 +11,9 @@ export default {
GlTooltip: GlTooltipDirective,
},
components: {
+ GlDisclosureDropdown,
GlButton,
GlButtonGroup,
- GlDropdown,
- GlDropdownItem,
- GlIcon,
},
mixins: [glFeatureFlagsMixin(), discussionNavigation],
props: {
@@ -56,6 +47,29 @@ export default {
resolveAllDiscussionsIssuePath() {
return this.getNoteableData.create_issue_to_resolve_discussions_path;
},
+ threadOptions() {
+ const options = [
+ {
+ text: this.toggleThreadsLabel,
+ action: this.handleExpandDiscussions,
+ extraAttrs: {
+ 'data-testid': 'toggle-all-discussions-btn',
+ },
+ },
+ ];
+
+ if (this.resolveAllDiscussionsIssuePath && !this.allResolved) {
+ options.push({
+ text: __('Resolve all with new issue'),
+ href: this.resolveAllDiscussionsIssuePath,
+ extraAttrs: {
+ 'data-testid': 'resolve-all-with-issue-link',
+ },
+ });
+ }
+
+ return options;
+ },
},
methods: {
...mapActions(['setExpandDiscussions']),
@@ -86,32 +100,25 @@ export default {
>
<template v-if="allResolved">
{{ __('All threads resolved!') }}
- <gl-dropdown
- v-gl-tooltip:discussionCounter.hover.bottom
+ <gl-disclosure-dropdown
+ v-gl-tooltip:discussionCounter.hover.top
+ icon="ellipsis_v"
size="small"
category="tertiary"
- right
+ placement="right"
+ no-caret
:title="__('Thread options')"
:aria-label="__('Thread options')"
toggle-class="btn-icon"
class="gl-pt-0! gl-px-2 gl-h-full gl-ml-2"
- >
- <template #button-content>
- <gl-icon name="ellipsis_v" class="mr-0" />
- </template>
- <gl-dropdown-item
- data-testid="toggle-all-discussions-btn"
- @click="handleExpandDiscussions"
- >
- {{ toggleThreadsLabel }}
- </gl-dropdown-item>
- </gl-dropdown>
+ :items="threadOptions"
+ />
</template>
<template v-else>
{{ n__('%d unresolved thread', '%d unresolved threads', unresolvedDiscussionsCount) }}
<gl-button-group class="gl-ml-3">
<gl-button
- v-gl-tooltip:discussionCounter.hover.bottom
+ v-gl-tooltip:discussionCounter.hover.top
:title="__('Go to previous unresolved thread')"
:aria-label="__('Go to previous unresolved thread')"
class="discussion-previous-btn gl-rounded-base! gl-px-2!"
@@ -123,7 +130,7 @@ export default {
@click="jumpPrevious"
/>
<gl-button
- v-gl-tooltip:discussionCounter.hover.bottom
+ v-gl-tooltip:discussionCounter.hover.top
:title="__('Go to next unresolved thread')"
:aria-label="__('Go to next unresolved thread')"
class="discussion-next-btn gl-rounded-base! gl-px-2!"
@@ -134,32 +141,19 @@ export default {
category="tertiary"
@click="jumpNext"
/>
- <gl-dropdown
- v-gl-tooltip:discussionCounter.hover.bottom
+ <gl-disclosure-dropdown
+ v-gl-tooltip:discussionCounter.hover.top
+ icon="ellipsis_v"
size="small"
category="tertiary"
- right
+ placement="right"
+ no-caret
:title="__('Thread options')"
:aria-label="__('Thread options')"
toggle-class="btn-icon"
class="gl-pt-0! gl-px-2"
- >
- <template #button-content>
- <gl-icon name="ellipsis_v" class="mr-0" />
- </template>
- <gl-dropdown-item
- data-testid="toggle-all-discussions-btn"
- @click="handleExpandDiscussions"
- >
- {{ toggleThreadsLabel }}
- </gl-dropdown-item>
- <gl-dropdown-item
- v-if="resolveAllDiscussionsIssuePath && !allResolved"
- :href="resolveAllDiscussionsIssuePath"
- >
- {{ __('Resolve all with new issue') }}
- </gl-dropdown-item>
- </gl-dropdown>
+ :items="threadOptions"
+ />
</gl-button-group>
</template>
</div>
diff --git a/app/assets/javascripts/notes/components/discussion_notes.vue b/app/assets/javascripts/notes/components/discussion_notes.vue
index 9fb027fb955..080787884c8 100644
--- a/app/assets/javascripts/notes/components/discussion_notes.vue
+++ b/app/assets/javascripts/notes/components/discussion_notes.vue
@@ -169,7 +169,6 @@ export default {
v-if="hasReplies"
:collapsed="!isExpanded"
:replies="replies"
- :class="{ 'discussion-toggle-replies': discussion.diff_discussion }"
@toggle="toggleDiscussion({ discussionId: discussion.id })"
/>
<template v-if="isExpanded">
diff --git a/app/assets/javascripts/notes/components/discussion_notes_replies_wrapper.vue b/app/assets/javascripts/notes/components/discussion_notes_replies_wrapper.vue
index 1dd07fe90d2..571928b972b 100644
--- a/app/assets/javascripts/notes/components/discussion_notes_replies_wrapper.vue
+++ b/app/assets/javascripts/notes/components/discussion_notes_replies_wrapper.vue
@@ -21,7 +21,7 @@ export default {
'li',
{
class:
- 'discussion-collapsible gl-border-solid gl-border-gray-100 gl-border-1 gl-rounded-base clearfix',
+ 'discussion-collapsible gl-border-solid gl-border-gray-100 gl-border-1 gl-rounded-base gl-border-top-0',
},
[h('ul', { class: 'notes' }, children)],
);
diff --git a/app/assets/javascripts/notes/components/mr_discussion_filter.vue b/app/assets/javascripts/notes/components/mr_discussion_filter.vue
index 2338c9eef67..7ca0c4730a9 100644
--- a/app/assets/javascripts/notes/components/mr_discussion_filter.vue
+++ b/app/assets/javascripts/notes/components/mr_discussion_filter.vue
@@ -62,6 +62,12 @@ export default {
this.updateMergeRequestFilters(filters);
this.selectedFilters = filters;
},
+ deselectAll() {
+ this.selectedFilters = [];
+ },
+ selectAll() {
+ this.selectedFilters = MR_FILTER_OPTIONS.map((f) => f.value);
+ },
},
MR_FILTER_OPTIONS,
};
@@ -84,9 +90,14 @@ export default {
<gl-collapsible-listbox
v-model="selectedFilters"
:items="$options.MR_FILTER_OPTIONS"
+ :header-text="__('Filter activity')"
+ :show-select-all-button-label="__('Select all')"
+ :reset-button-label="__('Deselect all')"
multiple
placement="right"
@hidden="applyFilters"
+ @reset="deselectAll"
+ @select-all="selectAll"
>
<template #toggle>
<gl-button class="gl-rounded-top-right-none! gl-rounded-bottom-right-none!">
diff --git a/app/assets/javascripts/notes/components/note_actions.vue b/app/assets/javascripts/notes/components/note_actions.vue
index 47e0ace1ea7..8d2d8095a44 100644
--- a/app/assets/javascripts/notes/components/note_actions.vue
+++ b/app/assets/javascripts/notes/components/note_actions.vue
@@ -1,7 +1,6 @@
<script>
import {
GlTooltipDirective,
- GlIcon,
GlButton,
GlDisclosureDropdown,
GlDisclosureDropdownItem,
@@ -30,15 +29,14 @@ export default {
},
name: 'NoteActions',
components: {
- GlIcon,
- ReplyButton,
- TimelineEventButton,
+ AbuseCategorySelector,
+ EmojiPicker: () => import('~/emoji/components/picker.vue'),
GlButton,
GlDisclosureDropdown,
GlDisclosureDropdownItem,
+ ReplyButton,
+ TimelineEventButton,
UserAccessRoleBadge,
- EmojiPicker: () => import('~/emoji/components/picker.vue'),
- AbuseCategorySelector,
},
directives: {
GlTooltip: GlTooltipDirective,
@@ -318,22 +316,12 @@ export default {
/>
<emoji-picker
v-if="canAwardEmoji"
+ v-gl-tooltip
+ :title="$options.i18n.addReactionLabel"
toggle-class="note-action-button note-emoji-button btn-icon btn-default-tertiary"
data-testid="note-emoji-button"
@click="setAwardEmoji"
- >
- <template #button-content>
- <gl-icon class="award-control-icon-neutral gl-button-icon gl-icon" name="slight-smile" />
- <gl-icon
- class="award-control-icon-positive gl-button-icon gl-icon gl-left-3!"
- name="smiley"
- />
- <gl-icon
- class="award-control-icon-super-positive gl-button-icon gl-icon gl-left-3!"
- name="smile"
- />
- </template>
- </emoji-picker>
+ />
<reply-button
v-if="showReply"
ref="replyButton"
@@ -365,7 +353,8 @@ export default {
<gl-disclosure-dropdown
v-gl-tooltip
:title="$options.i18n.moreActionsLabel"
- :aria-label="$options.i18n.moreActionsLabel"
+ :toggle-text="$options.i18n.moreActionsLabel"
+ text-sr-only
icon="ellipsis_v"
category="tertiary"
placement="right"
diff --git a/app/assets/javascripts/notes/components/note_body.vue b/app/assets/javascripts/notes/components/note_body.vue
index b4e5129ca0e..1c6be0cfd77 100644
--- a/app/assets/javascripts/notes/components/note_body.vue
+++ b/app/assets/javascripts/notes/components/note_body.vue
@@ -174,6 +174,7 @@ export default {
:note-id="note.id"
:line="line"
:note="note"
+ :diff-file="file"
:save-button-title="saveButtonTitle"
:help-page-path="helpPagePath"
:discussion="discussion"
diff --git a/app/assets/javascripts/notes/components/note_form.vue b/app/assets/javascripts/notes/components/note_form.vue
index fe7967f1ed0..4e816038539 100644
--- a/app/assets/javascripts/notes/components/note_form.vue
+++ b/app/assets/javascripts/notes/components/note_form.vue
@@ -5,6 +5,7 @@ import { mergeUrlParams } from '~/lib/utils/url_utility';
import { __ } from '~/locale';
import MarkdownEditor from '~/vue_shared/components/markdown/markdown_editor.vue';
import glFeaturesFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import { trackSavedUsingEditor } from '~/vue_shared/components/markdown/tracking';
import eventHub from '../event_hub';
import issuableStateMixin from '../mixins/issuable_state';
import resolvable from '../mixins/resolvable';
@@ -192,9 +193,6 @@ export default {
markdownDocsPath() {
return this.getNotesDataByProp('markdownDocsPath');
},
- quickActionsDocsPath() {
- return this.getNotesDataByProp('quickActionsDocsPath');
- },
currentUserId() {
return this.getUserDataByProp('id');
},
@@ -223,6 +221,15 @@ export default {
enableContentEditor() {
return Boolean(this.glFeatures.contentEditorOnIssues);
},
+ codeSuggestionsConfig() {
+ return {
+ canSuggest: this.canSuggest,
+ line: this.line,
+ lines: this.lines,
+ showPopover: this.showSuggestPopover,
+ diffFile: this.diffFile,
+ };
+ },
},
watch: {
noteBody() {
@@ -290,6 +297,11 @@ export default {
const beforeSubmitDiscussionState = this.discussionResolved;
this.isSubmitting = true;
+ trackSavedUsingEditor(
+ this.$refs.markdownEditor.isContentEditorActive,
+ `${this.getNoteableData.noteableType}_note`,
+ );
+
this.$emit(
'handleFormUpdate',
this.updatedNoteBody,
@@ -321,7 +333,15 @@ export default {
(!this.discussionResolved && this.isResolving);
this.isSubmitting = true;
- this.$emit('handleFormUpdateAddToReview', this.updatedNoteBody, shouldResolve);
+ this.$emit(
+ 'handleFormUpdateAddToReview',
+ this.updatedNoteBody,
+ shouldResolve,
+ this.$refs.editNoteForm,
+ () => {
+ this.isSubmitting = false;
+ },
+ );
},
hasEmailParticipants() {
return this.getNoteableData.issue_email_participants?.length;
@@ -351,15 +371,11 @@ export default {
:value="updatedNoteBody"
:render-markdown-path="markdownPreviewPath"
:markdown-docs-path="markdownDocsPath"
- :line="line"
- :lines="lines"
- :can-suggest="canSuggest"
+ :code-suggestions-config="codeSuggestionsConfig"
:add-spacing-classes="false"
:help-page-path="helpPagePath"
:note="discussionNote"
:form-field-props="formFieldProps"
- :show-suggest-popover="showSuggestPopover"
- :quick-actions-docs-path="quickActionsDocsPath"
:autosave-key="autosaveKey"
:autocomplete-data-sources="autocompleteDataSources"
:disabled="isSubmitting"
diff --git a/app/assets/javascripts/notes/components/noteable_discussion.vue b/app/assets/javascripts/notes/components/noteable_discussion.vue
index 499581653ba..a5939e1023c 100644
--- a/app/assets/javascripts/notes/components/noteable_discussion.vue
+++ b/app/assets/javascripts/notes/components/noteable_discussion.vue
@@ -15,7 +15,7 @@ import { containsSensitiveToken, confirmSensitiveAction } from '~/lib/utils/secr
import eventHub from '../event_hub';
import noteable from '../mixins/noteable';
import resolvable from '../mixins/resolvable';
-import { getErrorMessages } from '../utils';
+import { createNoteErrorMessages } from '../utils';
import DiffDiscussionHeader from './diff_discussion_header.vue';
import DiffWithNote from './diff_with_note.vue';
import DiscussionActions from './discussion_actions.vue';
@@ -96,6 +96,18 @@ export default {
'showJumpToNextDiscussion',
'getUserData',
]),
+ diffFile() {
+ const diffFile = this.discussion.diff_file;
+ if (!diffFile) return null;
+
+ return {
+ ...diffFile,
+ view_path: window.location.href.replace(
+ /\/-\/merge_requests.*/,
+ `/-/blob/${diffFile.content_sha}/${diffFile.new_path}`,
+ ),
+ };
+ },
currentUser() {
return this.getUserData;
},
@@ -270,7 +282,7 @@ export default {
});
},
handleSaveError({ response }) {
- const errorMessage = getErrorMessages(response.data, response.status)[0];
+ const errorMessage = createNoteErrorMessages(response.data, response.status)[0];
createAlert({
message: errorMessage,
@@ -331,7 +343,7 @@ export default {
<li
v-else-if="canShowReplyActions && showReplies"
data-testid="reply-wrapper"
- class="discussion-reply-holder gl-border-t-0! clearfix"
+ class="discussion-reply-holder gl-border-t-0! gl-pb-5! clearfix"
:class="discussionHolderClass"
>
<discussion-actions
@@ -348,6 +360,7 @@ export default {
v-if="isReplying"
ref="noteForm"
:discussion="discussion"
+ :diff-file="diffFile"
:line="diffLine"
:save-button-title="saveButtonTitle"
:autosave-key="autosaveKey"
diff --git a/app/assets/javascripts/notes/components/noteable_note.vue b/app/assets/javascripts/notes/components/noteable_note.vue
index dd135eaee3b..69c41af97ab 100644
--- a/app/assets/javascripts/notes/components/noteable_note.vue
+++ b/app/assets/javascripts/notes/components/noteable_note.vue
@@ -17,8 +17,7 @@ import { containsSensitiveToken, confirmSensitiveAction } from '~/lib/utils/secr
import eventHub from '../event_hub';
import noteable from '../mixins/noteable';
import resolvable from '../mixins/resolvable';
-import { renderMarkdown } from '../utils';
-import { UPDATE_COMMENT_FORM } from '../i18n';
+import { renderMarkdown, updateNoteErrorMessage } from '../utils';
import {
getStartLineNumber,
getEndLineNumber,
@@ -114,7 +113,6 @@ export default {
isResolving: false,
commentLineStart: {},
resolveAsThread: true,
- oldContent: this.note.note_html,
};
},
computed: {
@@ -212,7 +210,8 @@ export default {
return fileResolvedFromAvailableSource || null;
},
isMRDiffView() {
- return this.line && !this.isOverviewTab;
+ const isFileComment = this.note.position?.position_type === 'file';
+ return !this.isOverviewTab && (this.line || isFileComment);
},
},
created() {
@@ -295,7 +294,7 @@ export default {
updateSuccess() {
this.isEditing = false;
this.isRequesting = false;
- this.oldContent = this.note.note_html;
+ this.oldContent = null;
renderGFM(this.$refs.noteBody.$el);
this.$emit('updateSuccess');
},
@@ -317,7 +316,9 @@ export default {
noteText,
resolveDiscussion,
position,
+ flashContainer: this.$el,
callback: () => this.updateSuccess(),
+ errorCallback: () => callback(),
});
if (this.isDraft) return;
@@ -343,6 +344,7 @@ export default {
// https://gitlab.com/gitlab-org/gitlab/-/issues/298827
if (!isEmpty(position)) data.note.note.position = JSON.stringify(position);
this.isRequesting = true;
+ this.oldContent = this.note.note_html;
// eslint-disable-next-line vue/no-mutating-props
this.note.note_html = renderMarkdown(noteText);
@@ -369,14 +371,8 @@ export default {
});
},
handleUpdateError(e) {
- const serverErrorMessage = e?.response?.data?.errors;
-
- const alertMessage = serverErrorMessage
- ? sprintf(UPDATE_COMMENT_FORM.error, { reason: serverErrorMessage.toLowerCase() }, false)
- : UPDATE_COMMENT_FORM.defaultError;
-
createAlert({
- message: alertMessage,
+ message: updateNoteErrorMessage(e),
parent: this.$el,
});
},
@@ -442,7 +438,12 @@ export default {
</div>
<div v-if="isMRDiffView" class="timeline-avatar gl-float-left gl-pt-2">
- <gl-avatar-link :href="author.path">
+ <gl-avatar-link
+ :href="author.path"
+ :data-user-id="author.id"
+ :data-username="author.username"
+ class="js-user-link"
+ >
<gl-avatar
:src="author.avatar_url"
:entity-name="author.username"
@@ -455,7 +456,12 @@ export default {
</div>
<div v-else class="timeline-avatar gl-float-left">
- <gl-avatar-link :href="author.path">
+ <gl-avatar-link
+ :href="author.path"
+ :data-user-id="author.id"
+ :data-username="author.username"
+ class="js-user-link"
+ >
<gl-avatar
:src="author.avatar_url"
:entity-name="author.username"
diff --git a/app/assets/javascripts/notes/components/toggle_replies_widget.vue b/app/assets/javascripts/notes/components/toggle_replies_widget.vue
index b0f7a4a4732..a012b4411bc 100644
--- a/app/assets/javascripts/notes/components/toggle_replies_widget.vue
+++ b/app/assets/javascripts/notes/components/toggle_replies_widget.vue
@@ -39,7 +39,7 @@ export default {
},
liClasses() {
return this.collapsed
- ? 'gl-text-gray-500 gl-rounded-bottom-left-base! gl-rounded-bottom-right-base! replies-widget-collapsed'
+ ? 'gl-text-gray-500 gl-rounded-bottom-left-base! gl-rounded-bottom-right-base!'
: 'gl-border-b';
},
buttonIcon() {
diff --git a/app/assets/javascripts/notes/mixins/diff_line_note_form.js b/app/assets/javascripts/notes/mixins/diff_line_note_form.js
index 55a63212dc5..cb6f72538b9 100644
--- a/app/assets/javascripts/notes/mixins/diff_line_note_form.js
+++ b/app/assets/javascripts/notes/mixins/diff_line_note_form.js
@@ -7,8 +7,9 @@ import {
} from '~/diffs/constants';
import { createAlert } from '~/alert';
import { clearDraft } from '~/lib/utils/autosave';
-import { s__ } from '~/locale';
+import { sprintf } from '~/locale';
import { formatLineRange } from '~/notes/components/multiline_comment_utils';
+import { SAVING_THE_COMMENT_FAILED, SOMETHING_WENT_WRONG } from '~/diffs/i18n';
export default {
computed: {
@@ -24,7 +25,7 @@ export default {
methods: {
...mapActions('diffs', ['cancelCommentForm', 'toggleFileCommentForm']),
...mapActions('batchComments', ['addDraftToReview', 'saveDraft', 'insertDraftIntoDrafts']),
- addReplyToReview(noteText, isResolving) {
+ addReplyToReview(noteText, isResolving, parentElement, errorCallback) {
const postData = getDraftReplyFormData({
in_reply_to_discussion_id: this.discussion.reply_id,
target_type: this.getNoteableData.targetType,
@@ -39,19 +40,26 @@ export default {
postData.note_project_id = this.discussion.project_id;
}
- this.isReplying = false;
-
this.saveDraft(postData)
.then(() => {
+ this.isReplying = false;
this.handleClearForm(this.discussion.line_code);
})
- .catch(() => {
+ .catch((response) => {
+ const reason = response?.data?.errors;
+ const errorMessage = reason
+ ? sprintf(SAVING_THE_COMMENT_FAILED, { reason })
+ : SOMETHING_WENT_WRONG;
+
createAlert({
- message: s__('MergeRequests|An error occurred while saving the draft comment.'),
+ message: errorMessage,
+ parent: parentElement,
});
+
+ errorCallback();
});
},
- addToReview(note, positionType = null) {
+ addToReview(note, positionType = null, parentElement, errorCallback) {
const lineRange =
(this.line && this.commentLineStart && formatLineRange(this.commentLineStart, this.line)) ||
{};
@@ -88,10 +96,18 @@ export default {
this.toggleFileCommentForm(diffFile.file_path);
}
})
- .catch(() => {
+ .catch((response) => {
+ const reason = response?.data?.errors;
+ const errorMessage = reason
+ ? sprintf(SAVING_THE_COMMENT_FAILED, { reason })
+ : SOMETHING_WENT_WRONG;
+
createAlert({
- message: s__('MergeRequests|An error occurred while saving the draft comment.'),
+ message: errorMessage,
+ parent: parentElement,
});
+
+ errorCallback();
});
},
handleClearForm(lineCode) {
diff --git a/app/assets/javascripts/notes/utils.js b/app/assets/javascripts/notes/utils.js
index c5859a89182..a561d26ad56 100644
--- a/app/assets/javascripts/notes/utils.js
+++ b/app/assets/javascripts/notes/utils.js
@@ -4,7 +4,7 @@ import { sanitize } from '~/lib/dompurify';
import { markdownConfig } from '~/lib/utils/text_utility';
import { HTTP_STATUS_UNPROCESSABLE_ENTITY } from '~/lib/utils/http_status';
import { sprintf } from '~/locale';
-import { COMMENT_FORM } from './i18n';
+import { UPDATE_COMMENT_FORM, COMMENT_FORM } from './i18n';
/**
* Tracks snowplow event when User toggles timeline view
@@ -23,7 +23,7 @@ export const renderMarkdown = (rawMarkdown) => {
return sanitize(marked(rawMarkdown), markdownConfig);
};
-export const getErrorMessages = (data, status) => {
+export const createNoteErrorMessages = (data, status) => {
const errors = data?.errors;
if (errors && status === HTTP_STATUS_UNPROCESSABLE_ENTITY) {
@@ -36,3 +36,13 @@ export const getErrorMessages = (data, status) => {
return [COMMENT_FORM.GENERIC_UNSUBMITTABLE_NETWORK];
};
+
+export const updateNoteErrorMessage = (e) => {
+ const errors = e?.response?.data?.errors;
+
+ if (errors) {
+ return sprintf(UPDATE_COMMENT_FORM.error, { reason: errors.toLowerCase() });
+ }
+
+ return UPDATE_COMMENT_FORM.defaultError;
+};
diff --git a/app/assets/javascripts/notifications/components/notification_email_listbox_input.vue b/app/assets/javascripts/notifications/components/notification_email_listbox_input.vue
index 5d5524deb0d..26b8e06a1a7 100644
--- a/app/assets/javascripts/notifications/components/notification_email_listbox_input.vue
+++ b/app/assets/javascripts/notifications/components/notification_email_listbox_input.vue
@@ -5,7 +5,7 @@ export default {
components: {
ListboxInput,
},
- inject: ['label', 'name', 'emails', 'emptyValueText', 'value', 'disabled'],
+ inject: ['label', 'name', 'emails', 'emptyValueText', 'value', 'disabled', 'placement'],
data() {
return {
selected: this.value,
@@ -41,6 +41,8 @@ export default {
:name="name"
:items="options"
:disabled="disabled"
+ :placement="placement"
+ fluid-width
@select="onSelect"
/>
</template>
diff --git a/app/assets/javascripts/notifications/index.js b/app/assets/javascripts/notifications/index.js
index 1395084f68c..d41b1d95854 100644
--- a/app/assets/javascripts/notifications/index.js
+++ b/app/assets/javascripts/notifications/index.js
@@ -7,10 +7,11 @@ import NotificationEmailListboxInput from './components/notification_email_listb
Vue.use(GlToast);
const initNotificationEmailListboxInputs = () => {
- const els = [...document.querySelectorAll('.js-notification-email-listbox-input')];
+ const CLASS_NAME = 'js-notification-email-listbox-input';
+ const els = [...document.querySelectorAll(`.${CLASS_NAME}`)];
els.forEach((el, index) => {
- const { label, name, emptyValueText, value = '' } = el.dataset;
+ const { label, name, emptyValueText, value = '', placement } = el.dataset;
return new Vue({
el,
@@ -22,9 +23,12 @@ const initNotificationEmailListboxInputs = () => {
emptyValueText,
value,
disabled: parseBoolean(el.dataset.disabled),
+ placement,
},
render(h) {
- return h(NotificationEmailListboxInput);
+ return h(NotificationEmailListboxInput, {
+ class: el.className.replace(CLASS_NAME, '').trim(),
+ });
},
});
});
diff --git a/app/assets/javascripts/observability/client.js b/app/assets/javascripts/observability/client.js
new file mode 100644
index 00000000000..251c165e7dd
--- /dev/null
+++ b/app/assets/javascripts/observability/client.js
@@ -0,0 +1,43 @@
+import axios from '~/lib/utils/axios_utils';
+
+function enableTraces() {
+ // TODO remove mocks https://gitlab.com/gitlab-org/opstrace/opstrace/-/issues/2271
+ return new Promise((resolve) => {
+ setTimeout(() => {
+ resolve();
+ }, 1000);
+ });
+}
+
+function isTracingEnabled() {
+ // TODO remove mocks https://gitlab.com/gitlab-org/opstrace/opstrace/-/issues/2271
+ return new Promise((resolve) => {
+ setTimeout(() => {
+ // Currently relying on manual provisioning, hence assuming tracing is enabled
+ resolve(true);
+ }, 1000);
+ });
+}
+
+async function fetchTraces(tracingUrl) {
+ const { data } = await axios.get(tracingUrl, { withCredentials: true });
+ if (!Array.isArray(data.traces)) {
+ throw new Error('traces are missing/invalid in the response.'); // eslint-disable-line @gitlab/require-i18n-strings
+ }
+ return data.traces.map((t) => {
+ // aggregating duration on the client for now, but expecting to be coming from the backend
+ const duration = t.spans.reduce((acc, cur) => acc + cur.duration_nano, 0);
+ return {
+ ...t,
+ duration: duration / 1000,
+ };
+ });
+}
+
+export function buildClient({ provisioningUrl, tracingUrl }) {
+ return {
+ enableTraces: () => enableTraces(provisioningUrl),
+ isTracingEnabled: () => isTracingEnabled(provisioningUrl),
+ fetchTraces: () => fetchTraces(tracingUrl),
+ };
+}
diff --git a/app/assets/javascripts/observability/components/observability_container.vue b/app/assets/javascripts/observability/components/observability_container.vue
new file mode 100644
index 00000000000..4306f531ab5
--- /dev/null
+++ b/app/assets/javascripts/observability/components/observability_container.vue
@@ -0,0 +1,92 @@
+<script>
+import { buildClient } from '../client';
+import { SKELETON_SPINNER_VARIANT } from '../constants';
+import ObservabilitySkeleton from './skeleton/index.vue';
+
+export default {
+ SKELETON_SPINNER_VARIANT,
+ components: {
+ ObservabilitySkeleton,
+ },
+ props: {
+ oauthUrl: {
+ type: String,
+ required: true,
+ },
+ tracingUrl: {
+ type: String,
+ required: true,
+ },
+ provisioningUrl: {
+ type: String,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ observabilityClient: null,
+ authCompleted: false,
+ };
+ },
+ mounted() {
+ window.addEventListener('message', this.messageHandler);
+
+ // TODO Remove once backend work done - just for testing
+ // https://gitlab.com/gitlab-org/opstrace/opstrace/-/issues/2270
+ // setTimeout(() => {
+ // this.messageHandler({
+ // data: { type: 'AUTH_COMPLETION', status: 'success' },
+ // origin: new URL(this.oauthUrl).origin,
+ // });
+ // }, 2000);
+ },
+ destroyed() {
+ window.removeEventListener('message', this.messageHandler);
+ },
+ methods: {
+ messageHandler(e) {
+ const isExpectedOrigin = e.origin === new URL(this.oauthUrl).origin;
+ if (!isExpectedOrigin) return;
+
+ const { data } = e;
+
+ if (data.type === 'AUTH_COMPLETION') {
+ if (this.authCompleted) return;
+
+ const { status, message, statusCode } = data;
+ if (status === 'success') {
+ this.observabilityClient = buildClient({
+ provisioningUrl: this.provisioningUrl,
+ tracingUrl: this.tracingUrl,
+ });
+ this.$refs.observabilitySkeleton?.onContentLoaded();
+ } else if (status === 'error') {
+ // eslint-disable-next-line @gitlab/require-i18n-strings,no-console
+ console.error('GOB auth failed with error:', message, statusCode);
+ this.$refs.observabilitySkeleton?.onError();
+ }
+ this.authCompleted = true;
+ }
+ },
+ },
+};
+</script>
+
+<template>
+ <div>
+ <iframe
+ v-if="!authCompleted"
+ sandbox="allow-same-origin allow-forms allow-scripts"
+ hidden
+ :src="oauthUrl"
+ data-testid="observability-oauth-iframe"
+ ></iframe>
+
+ <observability-skeleton
+ ref="observabilitySkeleton"
+ :variant="$options.SKELETON_SPINNER_VARIANT"
+ >
+ <slot v-if="observabilityClient" :observability-client="observabilityClient"></slot>
+ </observability-skeleton>
+ </div>
+</template>
diff --git a/app/assets/javascripts/observability/components/skeleton/index.vue b/app/assets/javascripts/observability/components/skeleton/index.vue
index d91f2874943..4df0f86be1f 100644
--- a/app/assets/javascripts/observability/components/skeleton/index.vue
+++ b/app/assets/javascripts/observability/components/skeleton/index.vue
@@ -1,5 +1,5 @@
<script>
-import { GlSkeletonLoader, GlAlert } from '@gitlab/ui';
+import { GlSkeletonLoader, GlAlert, GlLoadingIcon } from '@gitlab/ui';
import {
SKELETON_VARIANTS_BY_ROUTE,
@@ -9,6 +9,7 @@ import {
TIMEOUT_ERROR_LABEL,
TIMEOUT_ERROR_MESSAGE,
SKELETON_VARIANT_EMBED,
+ SKELETON_SPINNER_VARIANT,
} from '../../constants';
import DashboardsSkeleton from './dashboards.vue';
import ExploreSkeleton from './explore.vue';
@@ -23,6 +24,7 @@ export default {
ManageSkeleton,
EmbedSkeleton,
GlAlert,
+ GlLoadingIcon,
},
SKELETON_VARIANTS_BY_ROUTE,
SKELETON_STATE,
@@ -46,6 +48,23 @@ export default {
errorTimeout: null,
};
},
+ computed: {
+ skeletonVisible() {
+ return this.state === SKELETON_STATE.VISIBLE;
+ },
+ skeletonHidden() {
+ return this.state === SKELETON_STATE.HIDDEN;
+ },
+ errorVisible() {
+ return this.state === SKELETON_STATE.ERROR;
+ },
+ spinnerVariant() {
+ return this.variant === SKELETON_SPINNER_VARIANT;
+ },
+ embedVariant() {
+ return this.variant === SKELETON_VARIANT_EMBED;
+ },
+ },
mounted() {
this.setLoadingTimeout();
this.setErrorTimeout();
@@ -61,6 +80,12 @@ export default {
this.hideSkeleton();
},
+ onError() {
+ clearTimeout(this.errorTimeout);
+ clearTimeout(this.loadingTimeout);
+
+ this.showError();
+ },
setLoadingTimeout() {
this.loadingTimeout = setTimeout(() => {
/**
@@ -92,8 +117,7 @@ export default {
showError() {
this.state = SKELETON_STATE.ERROR;
},
-
- isSkeletonShown(route) {
+ isVariantByRoute(route) {
return this.variant === SKELETON_VARIANTS_BY_ROUTE[route];
},
},
@@ -102,11 +126,12 @@ export default {
<template>
<div class="gl-flex-grow-1 gl-display-flex gl-flex-direction-column gl-flex-align-items-stretch">
<transition name="fade">
- <div v-if="state === $options.SKELETON_STATE.VISIBLE" class="gl-px-5">
- <dashboards-skeleton v-if="isSkeletonShown($options.OBSERVABILITY_ROUTES.DASHBOARDS)" />
- <explore-skeleton v-else-if="isSkeletonShown($options.OBSERVABILITY_ROUTES.EXPLORE)" />
- <manage-skeleton v-else-if="isSkeletonShown($options.OBSERVABILITY_ROUTES.MANAGE)" />
- <embed-skeleton v-else-if="variant === $options.SKELETON_VARIANT_EMBED" />
+ <div v-if="skeletonVisible" class="gl-px-5 gl-my-5">
+ <dashboards-skeleton v-if="isVariantByRoute($options.OBSERVABILITY_ROUTES.DASHBOARDS)" />
+ <explore-skeleton v-else-if="isVariantByRoute($options.OBSERVABILITY_ROUTES.EXPLORE)" />
+ <manage-skeleton v-else-if="isVariantByRoute($options.OBSERVABILITY_ROUTES.MANAGE)" />
+ <embed-skeleton v-else-if="embedVariant" />
+ <gl-loading-icon v-else-if="spinnerVariant" size="lg" />
<gl-skeleton-loader v-else>
<rect y="2" width="10" height="8" />
@@ -115,10 +140,19 @@ export default {
<rect y="15" width="400" height="30" />
</gl-skeleton-loader>
</div>
+
+ <!-- The double condition is only here temporarily for back-compatibility reasons. Will be removed in next iteration https://gitlab.com/gitlab-org/opstrace/opstrace/-/issues/2275 -->
+ <div
+ v-else-if="spinnerVariant && skeletonHidden"
+ data-testid="content-wrapper"
+ class="gl-flex-grow-1 gl-display-flex gl-flex-direction-column gl-flex-align-items-stretch"
+ >
+ <slot></slot>
+ </div>
</transition>
<gl-alert
- v-if="state === $options.SKELETON_STATE.ERROR"
+ v-if="errorVisible"
:title="$options.i18n.TIMEOUT_ERROR_LABEL"
variant="danger"
:dismissible="false"
@@ -127,10 +161,11 @@ export default {
{{ $options.i18n.TIMEOUT_ERROR_MESSAGE }}
</gl-alert>
- <transition>
+ <!-- This is only kept temporarily for back-compatibility reasons. Will be removed in next iteration https://gitlab.com/gitlab-org/opstrace/opstrace/-/issues/2275 -->
+ <transition v-if="!spinnerVariant">
<div
- v-show="state === $options.SKELETON_STATE.HIDDEN"
- data-testid="observability-wrapper"
+ v-show="skeletonHidden"
+ data-testid="content-wrapper"
class="gl-flex-grow-1 gl-display-flex gl-flex-direction-column gl-flex-align-items-stretch"
>
<slot></slot>
diff --git a/app/assets/javascripts/observability/constants.js b/app/assets/javascripts/observability/constants.js
index 6b97c51e997..b0a0941779d 100644
--- a/app/assets/javascripts/observability/constants.js
+++ b/app/assets/javascripts/observability/constants.js
@@ -18,6 +18,7 @@ export const SKELETON_VARIANTS_BY_ROUTE = Object.freeze({
});
export const SKELETON_VARIANT_EMBED = 'embed';
+export const SKELETON_SPINNER_VARIANT = 'spinner';
export const SKELETON_STATE = Object.freeze({
ERROR: 'error',
diff --git a/app/assets/javascripts/observability/mock_traces.json b/app/assets/javascripts/observability/mock_traces.json
new file mode 100644
index 00000000000..6f83f718d96
--- /dev/null
+++ b/app/assets/javascripts/observability/mock_traces.json
@@ -0,0 +1,2807 @@
+{
+ "project_id": "1",
+ "message": "",
+ "traces": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677538Z",
+ "trace_id": "97e6b7b3-9579-b6e9-eb86-25f1ded2cff0",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677538Z",
+ "span_id": "E2CB9B54BB6FCAC1",
+ "trace_id": "97e6b7b3-9579-b6e9-eb86-25f1ded2cff0",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 147000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677561Z",
+ "span_id": "4B29015A902EF378",
+ "trace_id": "97e6b7b3-9579-b6e9-eb86-25f1ded2cff0",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677538Z",
+ "trace_id": "97e6b7b3-9579-b6e9-eb86-25f1ded2cff0",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677538Z",
+ "span_id": "E2CB9B54BB6FCAC1",
+ "trace_id": "97e6b7b3-9579-b6e9-eb86-25f1ded2cff0",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 147000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677561Z",
+ "span_id": "4B29015A902EF378",
+ "trace_id": "97e6b7b3-9579-b6e9-eb86-25f1ded2cff0",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.67758Z",
+ "trace_id": "36f65703-d085-0674-a589-b35db23f77d5",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.67758Z",
+ "span_id": "F0788D69026E13A1",
+ "trace_id": "36f65703-d085-0674-a589-b35db23f77d5",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677581Z",
+ "span_id": "14987F8F6FDD27AE",
+ "trace_id": "36f65703-d085-0674-a589-b35db23f77d5",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.67758Z",
+ "trace_id": "36f65703-d085-0674-a589-b35db23f77d5",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.67758Z",
+ "span_id": "F0788D69026E13A1",
+ "trace_id": "36f65703-d085-0674-a589-b35db23f77d5",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677581Z",
+ "span_id": "14987F8F6FDD27AE",
+ "trace_id": "36f65703-d085-0674-a589-b35db23f77d5",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677583Z",
+ "trace_id": "219da434-0271-581c-0bfa-1c0e31f7bc03",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677583Z",
+ "span_id": "F5AB66F29F53ECAF",
+ "trace_id": "219da434-0271-581c-0bfa-1c0e31f7bc03",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677584Z",
+ "span_id": "17D79F52E57E9C6A",
+ "trace_id": "219da434-0271-581c-0bfa-1c0e31f7bc03",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677583Z",
+ "trace_id": "219da434-0271-581c-0bfa-1c0e31f7bc03",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677583Z",
+ "span_id": "F5AB66F29F53ECAF",
+ "trace_id": "219da434-0271-581c-0bfa-1c0e31f7bc03",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677584Z",
+ "span_id": "17D79F52E57E9C6A",
+ "trace_id": "219da434-0271-581c-0bfa-1c0e31f7bc03",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677585Z",
+ "trace_id": "e899d9a8-4d54-b131-9580-e540697604b4",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677585Z",
+ "span_id": "468B2959252EDA28",
+ "trace_id": "e899d9a8-4d54-b131-9580-e540697604b4",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677586Z",
+ "span_id": "7AC8860F5CB85E0A",
+ "trace_id": "e899d9a8-4d54-b131-9580-e540697604b4",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677585Z",
+ "trace_id": "e899d9a8-4d54-b131-9580-e540697604b4",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677585Z",
+ "span_id": "468B2959252EDA28",
+ "trace_id": "e899d9a8-4d54-b131-9580-e540697604b4",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677586Z",
+ "span_id": "7AC8860F5CB85E0A",
+ "trace_id": "e899d9a8-4d54-b131-9580-e540697604b4",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677588Z",
+ "trace_id": "057228bd-3c6d-2551-b779-641d71f111c7",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677588Z",
+ "span_id": "3411BDD296DB9370",
+ "trace_id": "057228bd-3c6d-2551-b779-641d71f111c7",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677589Z",
+ "span_id": "1774F16A178B8FCB",
+ "trace_id": "057228bd-3c6d-2551-b779-641d71f111c7",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677588Z",
+ "trace_id": "057228bd-3c6d-2551-b779-641d71f111c7",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677588Z",
+ "span_id": "3411BDD296DB9370",
+ "trace_id": "057228bd-3c6d-2551-b779-641d71f111c7",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677589Z",
+ "span_id": "1774F16A178B8FCB",
+ "trace_id": "057228bd-3c6d-2551-b779-641d71f111c7",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677613Z",
+ "trace_id": "a6d8c574-d1ce-e46d-8634-e12d1251a009",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677613Z",
+ "span_id": "CDACF24BB78C3534",
+ "trace_id": "a6d8c574-d1ce-e46d-8634-e12d1251a009",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677614Z",
+ "span_id": "7B69777569B9EA84",
+ "trace_id": "a6d8c574-d1ce-e46d-8634-e12d1251a009",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677613Z",
+ "trace_id": "a6d8c574-d1ce-e46d-8634-e12d1251a009",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677613Z",
+ "span_id": "CDACF24BB78C3534",
+ "trace_id": "a6d8c574-d1ce-e46d-8634-e12d1251a009",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677614Z",
+ "span_id": "7B69777569B9EA84",
+ "trace_id": "a6d8c574-d1ce-e46d-8634-e12d1251a009",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677616Z",
+ "trace_id": "d29efaa9-f0dd-8ce8-901c-9bb076292144",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677616Z",
+ "span_id": "1265DF31CD5EC4E2",
+ "trace_id": "d29efaa9-f0dd-8ce8-901c-9bb076292144",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677617Z",
+ "span_id": "3E0260222F729537",
+ "trace_id": "d29efaa9-f0dd-8ce8-901c-9bb076292144",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677616Z",
+ "trace_id": "d29efaa9-f0dd-8ce8-901c-9bb076292144",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677616Z",
+ "span_id": "1265DF31CD5EC4E2",
+ "trace_id": "d29efaa9-f0dd-8ce8-901c-9bb076292144",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677617Z",
+ "span_id": "3E0260222F729537",
+ "trace_id": "d29efaa9-f0dd-8ce8-901c-9bb076292144",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677619Z",
+ "trace_id": "175fe57e-ce90-3e58-6e75-ffb37e6ed787",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677619Z",
+ "span_id": "3A06AC7ABCA9D043",
+ "trace_id": "175fe57e-ce90-3e58-6e75-ffb37e6ed787",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677619Z",
+ "span_id": "9C99F917736586E1",
+ "trace_id": "175fe57e-ce90-3e58-6e75-ffb37e6ed787",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677619Z",
+ "trace_id": "175fe57e-ce90-3e58-6e75-ffb37e6ed787",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677619Z",
+ "span_id": "3A06AC7ABCA9D043",
+ "trace_id": "175fe57e-ce90-3e58-6e75-ffb37e6ed787",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677619Z",
+ "span_id": "9C99F917736586E1",
+ "trace_id": "175fe57e-ce90-3e58-6e75-ffb37e6ed787",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677621Z",
+ "trace_id": "5bda0cda-5c5d-ccc6-7266-5e438572bccf",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677621Z",
+ "span_id": "B2417463C771A704",
+ "trace_id": "5bda0cda-5c5d-ccc6-7266-5e438572bccf",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677622Z",
+ "span_id": "897DD866880697F0",
+ "trace_id": "5bda0cda-5c5d-ccc6-7266-5e438572bccf",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677621Z",
+ "trace_id": "5bda0cda-5c5d-ccc6-7266-5e438572bccf",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677621Z",
+ "span_id": "B2417463C771A704",
+ "trace_id": "5bda0cda-5c5d-ccc6-7266-5e438572bccf",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677622Z",
+ "span_id": "897DD866880697F0",
+ "trace_id": "5bda0cda-5c5d-ccc6-7266-5e438572bccf",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677637Z",
+ "trace_id": "1b00f009-80fb-4389-5629-0e6326838a87",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677637Z",
+ "span_id": "AB982E41826E4CB4",
+ "trace_id": "1b00f009-80fb-4389-5629-0e6326838a87",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677638Z",
+ "span_id": "8577639018E3ACE2",
+ "trace_id": "1b00f009-80fb-4389-5629-0e6326838a87",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677637Z",
+ "trace_id": "1b00f009-80fb-4389-5629-0e6326838a87",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677637Z",
+ "span_id": "AB982E41826E4CB4",
+ "trace_id": "1b00f009-80fb-4389-5629-0e6326838a87",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677638Z",
+ "span_id": "8577639018E3ACE2",
+ "trace_id": "1b00f009-80fb-4389-5629-0e6326838a87",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677651Z",
+ "trace_id": "effe5f7a-b902-eb19-cccf-9ac4a0aea683",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677651Z",
+ "span_id": "E4D0C62B763FC25C",
+ "trace_id": "effe5f7a-b902-eb19-cccf-9ac4a0aea683",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677653Z",
+ "span_id": "C059EDEE59610CB1",
+ "trace_id": "effe5f7a-b902-eb19-cccf-9ac4a0aea683",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677651Z",
+ "trace_id": "effe5f7a-b902-eb19-cccf-9ac4a0aea683",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677651Z",
+ "span_id": "E4D0C62B763FC25C",
+ "trace_id": "effe5f7a-b902-eb19-cccf-9ac4a0aea683",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677653Z",
+ "span_id": "C059EDEE59610CB1",
+ "trace_id": "effe5f7a-b902-eb19-cccf-9ac4a0aea683",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677654Z",
+ "trace_id": "9532c21e-1e43-14b3-d5e9-239256361eb4",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677654Z",
+ "span_id": "EF63FD474F6898CE",
+ "trace_id": "9532c21e-1e43-14b3-d5e9-239256361eb4",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677655Z",
+ "span_id": "694494E5AA2A2763",
+ "trace_id": "9532c21e-1e43-14b3-d5e9-239256361eb4",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677654Z",
+ "trace_id": "9532c21e-1e43-14b3-d5e9-239256361eb4",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677654Z",
+ "span_id": "EF63FD474F6898CE",
+ "trace_id": "9532c21e-1e43-14b3-d5e9-239256361eb4",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677655Z",
+ "span_id": "694494E5AA2A2763",
+ "trace_id": "9532c21e-1e43-14b3-d5e9-239256361eb4",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677657Z",
+ "trace_id": "311ab221-6e09-0ec6-e8f4-5bd1a50110f1",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677657Z",
+ "span_id": "A7C41B19AC60C808",
+ "trace_id": "311ab221-6e09-0ec6-e8f4-5bd1a50110f1",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677657Z",
+ "span_id": "57A5EDD6AF5CEB5B",
+ "trace_id": "311ab221-6e09-0ec6-e8f4-5bd1a50110f1",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677657Z",
+ "trace_id": "311ab221-6e09-0ec6-e8f4-5bd1a50110f1",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677657Z",
+ "span_id": "A7C41B19AC60C808",
+ "trace_id": "311ab221-6e09-0ec6-e8f4-5bd1a50110f1",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677657Z",
+ "span_id": "57A5EDD6AF5CEB5B",
+ "trace_id": "311ab221-6e09-0ec6-e8f4-5bd1a50110f1",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677659Z",
+ "trace_id": "d32d61e6-a3c7-ac62-3a54-37b4f82255e4",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677659Z",
+ "span_id": "EA174F950C4D04D8",
+ "trace_id": "d32d61e6-a3c7-ac62-3a54-37b4f82255e4",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.67766Z",
+ "span_id": "BA21BB5236E2EF8E",
+ "trace_id": "d32d61e6-a3c7-ac62-3a54-37b4f82255e4",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677659Z",
+ "trace_id": "d32d61e6-a3c7-ac62-3a54-37b4f82255e4",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677659Z",
+ "span_id": "EA174F950C4D04D8",
+ "trace_id": "d32d61e6-a3c7-ac62-3a54-37b4f82255e4",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.67766Z",
+ "span_id": "BA21BB5236E2EF8E",
+ "trace_id": "d32d61e6-a3c7-ac62-3a54-37b4f82255e4",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677661Z",
+ "trace_id": "43690e3b-acbd-512d-5a4a-a5b2db28e84c",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677661Z",
+ "span_id": "BF7E718C91691CBE",
+ "trace_id": "43690e3b-acbd-512d-5a4a-a5b2db28e84c",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 129000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677666Z",
+ "span_id": "50F782517AF36EA8",
+ "trace_id": "43690e3b-acbd-512d-5a4a-a5b2db28e84c",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677661Z",
+ "trace_id": "43690e3b-acbd-512d-5a4a-a5b2db28e84c",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677661Z",
+ "span_id": "BF7E718C91691CBE",
+ "trace_id": "43690e3b-acbd-512d-5a4a-a5b2db28e84c",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 129000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677666Z",
+ "span_id": "50F782517AF36EA8",
+ "trace_id": "43690e3b-acbd-512d-5a4a-a5b2db28e84c",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677668Z",
+ "trace_id": "36764123-3cff-bc0e-70a5-8b781294556f",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677668Z",
+ "span_id": "3B5B0841228A565D",
+ "trace_id": "36764123-3cff-bc0e-70a5-8b781294556f",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 131000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677669Z",
+ "span_id": "62ADBDBA30734B48",
+ "trace_id": "36764123-3cff-bc0e-70a5-8b781294556f",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 130000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677668Z",
+ "trace_id": "36764123-3cff-bc0e-70a5-8b781294556f",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677668Z",
+ "span_id": "3B5B0841228A565D",
+ "trace_id": "36764123-3cff-bc0e-70a5-8b781294556f",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 131000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677669Z",
+ "span_id": "62ADBDBA30734B48",
+ "trace_id": "36764123-3cff-bc0e-70a5-8b781294556f",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 130000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677685Z",
+ "trace_id": "c891efc0-b266-cb02-4b8e-1085df4ac0c1",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677685Z",
+ "span_id": "8A9D888CF37A3F57",
+ "trace_id": "c891efc0-b266-cb02-4b8e-1085df4ac0c1",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677686Z",
+ "span_id": "388636C7D201F9FB",
+ "trace_id": "c891efc0-b266-cb02-4b8e-1085df4ac0c1",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677685Z",
+ "trace_id": "c891efc0-b266-cb02-4b8e-1085df4ac0c1",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677685Z",
+ "span_id": "8A9D888CF37A3F57",
+ "trace_id": "c891efc0-b266-cb02-4b8e-1085df4ac0c1",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677686Z",
+ "span_id": "388636C7D201F9FB",
+ "trace_id": "c891efc0-b266-cb02-4b8e-1085df4ac0c1",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677688Z",
+ "trace_id": "e78889ea-f202-5c87-e64b-f6db159d9632",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677688Z",
+ "span_id": "9E84A870338BBACA",
+ "trace_id": "e78889ea-f202-5c87-e64b-f6db159d9632",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 128000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677693Z",
+ "span_id": "FC1665CC8A7536B6",
+ "trace_id": "e78889ea-f202-5c87-e64b-f6db159d9632",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677688Z",
+ "trace_id": "e78889ea-f202-5c87-e64b-f6db159d9632",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677688Z",
+ "span_id": "9E84A870338BBACA",
+ "trace_id": "e78889ea-f202-5c87-e64b-f6db159d9632",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 128000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677693Z",
+ "span_id": "FC1665CC8A7536B6",
+ "trace_id": "e78889ea-f202-5c87-e64b-f6db159d9632",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677695Z",
+ "trace_id": "5154401c-5126-856b-9474-29efb69b8588",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677695Z",
+ "span_id": "1B5140A527AC99F8",
+ "trace_id": "5154401c-5126-856b-9474-29efb69b8588",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677695Z",
+ "span_id": "6C328C8E60FBB3A8",
+ "trace_id": "5154401c-5126-856b-9474-29efb69b8588",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677695Z",
+ "trace_id": "5154401c-5126-856b-9474-29efb69b8588",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677695Z",
+ "span_id": "1B5140A527AC99F8",
+ "trace_id": "5154401c-5126-856b-9474-29efb69b8588",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677695Z",
+ "span_id": "6C328C8E60FBB3A8",
+ "trace_id": "5154401c-5126-856b-9474-29efb69b8588",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677697Z",
+ "trace_id": "fe2fab22-75c3-afa2-6046-2c90b1cd6224",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677697Z",
+ "span_id": "BC05CC86EF04A641",
+ "trace_id": "fe2fab22-75c3-afa2-6046-2c90b1cd6224",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 129000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677703Z",
+ "span_id": "3DAF5282D4311F57",
+ "trace_id": "fe2fab22-75c3-afa2-6046-2c90b1cd6224",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677697Z",
+ "trace_id": "fe2fab22-75c3-afa2-6046-2c90b1cd6224",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677697Z",
+ "span_id": "BC05CC86EF04A641",
+ "trace_id": "fe2fab22-75c3-afa2-6046-2c90b1cd6224",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 129000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677703Z",
+ "span_id": "3DAF5282D4311F57",
+ "trace_id": "fe2fab22-75c3-afa2-6046-2c90b1cd6224",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677707Z",
+ "trace_id": "1899b1d8-7f12-e38e-7e7f-e39189ae7c7e",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677707Z",
+ "span_id": "AEAF8AC47E800113",
+ "trace_id": "1899b1d8-7f12-e38e-7e7f-e39189ae7c7e",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677708Z",
+ "span_id": "D6314BCF73DC741F",
+ "trace_id": "1899b1d8-7f12-e38e-7e7f-e39189ae7c7e",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677707Z",
+ "trace_id": "1899b1d8-7f12-e38e-7e7f-e39189ae7c7e",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677707Z",
+ "span_id": "AEAF8AC47E800113",
+ "trace_id": "1899b1d8-7f12-e38e-7e7f-e39189ae7c7e",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677708Z",
+ "span_id": "D6314BCF73DC741F",
+ "trace_id": "1899b1d8-7f12-e38e-7e7f-e39189ae7c7e",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677718Z",
+ "trace_id": "e5655518-6f37-8226-0161-f8cb85eb4ba4",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677718Z",
+ "span_id": "D0BEDA55261815BE",
+ "trace_id": "e5655518-6f37-8226-0161-f8cb85eb4ba4",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677719Z",
+ "span_id": "E1FA20547B7056ED",
+ "trace_id": "e5655518-6f37-8226-0161-f8cb85eb4ba4",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677718Z",
+ "trace_id": "e5655518-6f37-8226-0161-f8cb85eb4ba4",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677718Z",
+ "span_id": "D0BEDA55261815BE",
+ "trace_id": "e5655518-6f37-8226-0161-f8cb85eb4ba4",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677719Z",
+ "span_id": "E1FA20547B7056ED",
+ "trace_id": "e5655518-6f37-8226-0161-f8cb85eb4ba4",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677721Z",
+ "trace_id": "b0717d3c-d555-e6fa-1e4d-1aca7c889c25",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677721Z",
+ "span_id": "B171E7315A8B7FD1",
+ "trace_id": "b0717d3c-d555-e6fa-1e4d-1aca7c889c25",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677721Z",
+ "span_id": "CD8D690AC2924C06",
+ "trace_id": "b0717d3c-d555-e6fa-1e4d-1aca7c889c25",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677721Z",
+ "trace_id": "b0717d3c-d555-e6fa-1e4d-1aca7c889c25",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677721Z",
+ "span_id": "B171E7315A8B7FD1",
+ "trace_id": "b0717d3c-d555-e6fa-1e4d-1aca7c889c25",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677721Z",
+ "span_id": "CD8D690AC2924C06",
+ "trace_id": "b0717d3c-d555-e6fa-1e4d-1aca7c889c25",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677723Z",
+ "trace_id": "0dd663d5-d314-1736-cd5a-90d2811232fc",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677723Z",
+ "span_id": "224B0CB973E7D237",
+ "trace_id": "0dd663d5-d314-1736-cd5a-90d2811232fc",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677724Z",
+ "span_id": "452D473BC85DDBA5",
+ "trace_id": "0dd663d5-d314-1736-cd5a-90d2811232fc",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677723Z",
+ "trace_id": "0dd663d5-d314-1736-cd5a-90d2811232fc",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677723Z",
+ "span_id": "224B0CB973E7D237",
+ "trace_id": "0dd663d5-d314-1736-cd5a-90d2811232fc",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677724Z",
+ "span_id": "452D473BC85DDBA5",
+ "trace_id": "0dd663d5-d314-1736-cd5a-90d2811232fc",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677726Z",
+ "trace_id": "b057b9c7-96dd-337a-ff46-c62254e4b0f8",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677726Z",
+ "span_id": "6491B39AA9F2CB97",
+ "trace_id": "b057b9c7-96dd-337a-ff46-c62254e4b0f8",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677727Z",
+ "span_id": "96C2E96EA8D3AF1D",
+ "trace_id": "b057b9c7-96dd-337a-ff46-c62254e4b0f8",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677726Z",
+ "trace_id": "b057b9c7-96dd-337a-ff46-c62254e4b0f8",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677726Z",
+ "span_id": "6491B39AA9F2CB97",
+ "trace_id": "b057b9c7-96dd-337a-ff46-c62254e4b0f8",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677727Z",
+ "span_id": "96C2E96EA8D3AF1D",
+ "trace_id": "b057b9c7-96dd-337a-ff46-c62254e4b0f8",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677728Z",
+ "trace_id": "c2b52b78-3a3a-0a44-bc73-04288175f112",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677728Z",
+ "span_id": "3A7F5394923A5AF0",
+ "trace_id": "c2b52b78-3a3a-0a44-bc73-04288175f112",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677729Z",
+ "span_id": "24CC4AB1032650CF",
+ "trace_id": "c2b52b78-3a3a-0a44-bc73-04288175f112",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677728Z",
+ "trace_id": "c2b52b78-3a3a-0a44-bc73-04288175f112",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677728Z",
+ "span_id": "3A7F5394923A5AF0",
+ "trace_id": "c2b52b78-3a3a-0a44-bc73-04288175f112",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677729Z",
+ "span_id": "24CC4AB1032650CF",
+ "trace_id": "c2b52b78-3a3a-0a44-bc73-04288175f112",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677743Z",
+ "trace_id": "e25bf442-7823-44e0-4400-0570b4bf525c",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677743Z",
+ "span_id": "F783055E10DA9E2D",
+ "trace_id": "e25bf442-7823-44e0-4400-0570b4bf525c",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677744Z",
+ "span_id": "E581CC7A539137BF",
+ "trace_id": "e25bf442-7823-44e0-4400-0570b4bf525c",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677743Z",
+ "trace_id": "e25bf442-7823-44e0-4400-0570b4bf525c",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677743Z",
+ "span_id": "F783055E10DA9E2D",
+ "trace_id": "e25bf442-7823-44e0-4400-0570b4bf525c",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677744Z",
+ "span_id": "E581CC7A539137BF",
+ "trace_id": "e25bf442-7823-44e0-4400-0570b4bf525c",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677746Z",
+ "trace_id": "7737691c-16f6-8aa4-9326-2114e3a1048e",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677746Z",
+ "span_id": "89BD651A0E16281F",
+ "trace_id": "7737691c-16f6-8aa4-9326-2114e3a1048e",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677747Z",
+ "span_id": "1FADCC9FB8DDE886",
+ "trace_id": "7737691c-16f6-8aa4-9326-2114e3a1048e",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677746Z",
+ "trace_id": "7737691c-16f6-8aa4-9326-2114e3a1048e",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677746Z",
+ "span_id": "89BD651A0E16281F",
+ "trace_id": "7737691c-16f6-8aa4-9326-2114e3a1048e",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677747Z",
+ "span_id": "1FADCC9FB8DDE886",
+ "trace_id": "7737691c-16f6-8aa4-9326-2114e3a1048e",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677749Z",
+ "trace_id": "79cc7e3b-10dc-7f53-03a6-2a5c4417bdc5",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677749Z",
+ "span_id": "09E59AECCEDE7725",
+ "trace_id": "79cc7e3b-10dc-7f53-03a6-2a5c4417bdc5",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.67775Z",
+ "span_id": "9885AAE43420A45B",
+ "trace_id": "79cc7e3b-10dc-7f53-03a6-2a5c4417bdc5",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677749Z",
+ "trace_id": "79cc7e3b-10dc-7f53-03a6-2a5c4417bdc5",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677749Z",
+ "span_id": "09E59AECCEDE7725",
+ "trace_id": "79cc7e3b-10dc-7f53-03a6-2a5c4417bdc5",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.67775Z",
+ "span_id": "9885AAE43420A45B",
+ "trace_id": "79cc7e3b-10dc-7f53-03a6-2a5c4417bdc5",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677751Z",
+ "trace_id": "5e7ba616-863c-a3d9-531d-def5659bfb5f",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677751Z",
+ "span_id": "CC204570C29BDBF4",
+ "trace_id": "5e7ba616-863c-a3d9-531d-def5659bfb5f",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677752Z",
+ "span_id": "D17C651E1245C0F9",
+ "trace_id": "5e7ba616-863c-a3d9-531d-def5659bfb5f",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677751Z",
+ "trace_id": "5e7ba616-863c-a3d9-531d-def5659bfb5f",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677751Z",
+ "span_id": "CC204570C29BDBF4",
+ "trace_id": "5e7ba616-863c-a3d9-531d-def5659bfb5f",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677752Z",
+ "span_id": "D17C651E1245C0F9",
+ "trace_id": "5e7ba616-863c-a3d9-531d-def5659bfb5f",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677755Z",
+ "trace_id": "9be40513-f8ae-1f93-0a2b-043323294f75",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677755Z",
+ "span_id": "B9C3F1DAF9940B7F",
+ "trace_id": "9be40513-f8ae-1f93-0a2b-043323294f75",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677755Z",
+ "span_id": "06A614DD43EC1E9A",
+ "trace_id": "9be40513-f8ae-1f93-0a2b-043323294f75",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677755Z",
+ "trace_id": "9be40513-f8ae-1f93-0a2b-043323294f75",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677755Z",
+ "span_id": "B9C3F1DAF9940B7F",
+ "trace_id": "9be40513-f8ae-1f93-0a2b-043323294f75",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677755Z",
+ "span_id": "06A614DD43EC1E9A",
+ "trace_id": "9be40513-f8ae-1f93-0a2b-043323294f75",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677757Z",
+ "trace_id": "89f98a5b-09d4-0e0b-3f92-3572152ddc3d",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677757Z",
+ "span_id": "46A99707D5225859",
+ "trace_id": "89f98a5b-09d4-0e0b-3f92-3572152ddc3d",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 131000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677763Z",
+ "span_id": "F489DDD88539BDA4",
+ "trace_id": "89f98a5b-09d4-0e0b-3f92-3572152ddc3d",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677757Z",
+ "trace_id": "89f98a5b-09d4-0e0b-3f92-3572152ddc3d",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677757Z",
+ "span_id": "46A99707D5225859",
+ "trace_id": "89f98a5b-09d4-0e0b-3f92-3572152ddc3d",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 131000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677763Z",
+ "span_id": "F489DDD88539BDA4",
+ "trace_id": "89f98a5b-09d4-0e0b-3f92-3572152ddc3d",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677773Z",
+ "trace_id": "b8ea3732-f870-f54c-1b3e-dff49376a1ec",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677773Z",
+ "span_id": "3223B8A1131D2A70",
+ "trace_id": "b8ea3732-f870-f54c-1b3e-dff49376a1ec",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677774Z",
+ "span_id": "82904DC8C7ED5487",
+ "trace_id": "b8ea3732-f870-f54c-1b3e-dff49376a1ec",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677773Z",
+ "trace_id": "b8ea3732-f870-f54c-1b3e-dff49376a1ec",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677773Z",
+ "span_id": "3223B8A1131D2A70",
+ "trace_id": "b8ea3732-f870-f54c-1b3e-dff49376a1ec",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677774Z",
+ "span_id": "82904DC8C7ED5487",
+ "trace_id": "b8ea3732-f870-f54c-1b3e-dff49376a1ec",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677776Z",
+ "trace_id": "a8ed5cde-b713-64ac-e11a-1222134e2857",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677776Z",
+ "span_id": "D9EC63C08230FB02",
+ "trace_id": "a8ed5cde-b713-64ac-e11a-1222134e2857",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677777Z",
+ "span_id": "F504530C5C200E2E",
+ "trace_id": "a8ed5cde-b713-64ac-e11a-1222134e2857",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677776Z",
+ "trace_id": "a8ed5cde-b713-64ac-e11a-1222134e2857",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677776Z",
+ "span_id": "D9EC63C08230FB02",
+ "trace_id": "a8ed5cde-b713-64ac-e11a-1222134e2857",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677777Z",
+ "span_id": "F504530C5C200E2E",
+ "trace_id": "a8ed5cde-b713-64ac-e11a-1222134e2857",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677778Z",
+ "trace_id": "bcbb0a0a-35a4-ff10-65b6-848271d6101a",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677778Z",
+ "span_id": "6F0F8D30DF04BA3E",
+ "trace_id": "bcbb0a0a-35a4-ff10-65b6-848271d6101a",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677779Z",
+ "span_id": "2FF73BB3675EBE65",
+ "trace_id": "bcbb0a0a-35a4-ff10-65b6-848271d6101a",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677778Z",
+ "trace_id": "bcbb0a0a-35a4-ff10-65b6-848271d6101a",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677778Z",
+ "span_id": "6F0F8D30DF04BA3E",
+ "trace_id": "bcbb0a0a-35a4-ff10-65b6-848271d6101a",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677779Z",
+ "span_id": "2FF73BB3675EBE65",
+ "trace_id": "bcbb0a0a-35a4-ff10-65b6-848271d6101a",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.67778Z",
+ "trace_id": "636bfe8f-c6f3-54a7-f828-b1b85740c33f",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.67778Z",
+ "span_id": "3D79FEC1831E8F1A",
+ "trace_id": "636bfe8f-c6f3-54a7-f828-b1b85740c33f",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677781Z",
+ "span_id": "35D99AA84BCD627A",
+ "trace_id": "636bfe8f-c6f3-54a7-f828-b1b85740c33f",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.67778Z",
+ "trace_id": "636bfe8f-c6f3-54a7-f828-b1b85740c33f",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.67778Z",
+ "span_id": "3D79FEC1831E8F1A",
+ "trace_id": "636bfe8f-c6f3-54a7-f828-b1b85740c33f",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677781Z",
+ "span_id": "35D99AA84BCD627A",
+ "trace_id": "636bfe8f-c6f3-54a7-f828-b1b85740c33f",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677783Z",
+ "trace_id": "685185ef-cf46-c7c7-9a00-6553b0171911",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677783Z",
+ "span_id": "0077A5FDB210BAB9",
+ "trace_id": "685185ef-cf46-c7c7-9a00-6553b0171911",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 130000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677783Z",
+ "span_id": "BD4D0517234DC84A",
+ "trace_id": "685185ef-cf46-c7c7-9a00-6553b0171911",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 130000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677783Z",
+ "trace_id": "685185ef-cf46-c7c7-9a00-6553b0171911",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677783Z",
+ "span_id": "0077A5FDB210BAB9",
+ "trace_id": "685185ef-cf46-c7c7-9a00-6553b0171911",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 130000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677783Z",
+ "span_id": "BD4D0517234DC84A",
+ "trace_id": "685185ef-cf46-c7c7-9a00-6553b0171911",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 130000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677793Z",
+ "trace_id": "fb17567a-a567-d0ac-c5f0-bbd5abb66cb8",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677793Z",
+ "span_id": "C148B50CA183BF05",
+ "trace_id": "fb17567a-a567-d0ac-c5f0-bbd5abb66cb8",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677794Z",
+ "span_id": "91C5D79D971A4A6E",
+ "trace_id": "fb17567a-a567-d0ac-c5f0-bbd5abb66cb8",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677793Z",
+ "trace_id": "fb17567a-a567-d0ac-c5f0-bbd5abb66cb8",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677793Z",
+ "span_id": "C148B50CA183BF05",
+ "trace_id": "fb17567a-a567-d0ac-c5f0-bbd5abb66cb8",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677794Z",
+ "span_id": "91C5D79D971A4A6E",
+ "trace_id": "fb17567a-a567-d0ac-c5f0-bbd5abb66cb8",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677804Z",
+ "trace_id": "d35cd179-4e71-8be7-ba39-b7b5ae2fdaa4",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677804Z",
+ "span_id": "948B20672FD5954F",
+ "trace_id": "d35cd179-4e71-8be7-ba39-b7b5ae2fdaa4",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677805Z",
+ "span_id": "529CA18AF8EF5017",
+ "trace_id": "d35cd179-4e71-8be7-ba39-b7b5ae2fdaa4",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677804Z",
+ "trace_id": "d35cd179-4e71-8be7-ba39-b7b5ae2fdaa4",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677804Z",
+ "span_id": "948B20672FD5954F",
+ "trace_id": "d35cd179-4e71-8be7-ba39-b7b5ae2fdaa4",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677805Z",
+ "span_id": "529CA18AF8EF5017",
+ "trace_id": "d35cd179-4e71-8be7-ba39-b7b5ae2fdaa4",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677806Z",
+ "trace_id": "e156a5f9-c203-2979-8fbc-5f50b8a67f32",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677806Z",
+ "span_id": "ADF60B9EFA97AD89",
+ "trace_id": "e156a5f9-c203-2979-8fbc-5f50b8a67f32",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677807Z",
+ "span_id": "03DE70E55CBF857C",
+ "trace_id": "e156a5f9-c203-2979-8fbc-5f50b8a67f32",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677806Z",
+ "trace_id": "e156a5f9-c203-2979-8fbc-5f50b8a67f32",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677806Z",
+ "span_id": "ADF60B9EFA97AD89",
+ "trace_id": "e156a5f9-c203-2979-8fbc-5f50b8a67f32",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677807Z",
+ "span_id": "03DE70E55CBF857C",
+ "trace_id": "e156a5f9-c203-2979-8fbc-5f50b8a67f32",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677809Z",
+ "trace_id": "7637dadf-0405-3e70-e78f-f0fa26d42511",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677809Z",
+ "span_id": "4350413FDF6C0DCD",
+ "trace_id": "7637dadf-0405-3e70-e78f-f0fa26d42511",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 128000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677814Z",
+ "span_id": "BDC8BD58C638FC78",
+ "trace_id": "7637dadf-0405-3e70-e78f-f0fa26d42511",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677809Z",
+ "trace_id": "7637dadf-0405-3e70-e78f-f0fa26d42511",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677809Z",
+ "span_id": "4350413FDF6C0DCD",
+ "trace_id": "7637dadf-0405-3e70-e78f-f0fa26d42511",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 128000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677814Z",
+ "span_id": "BDC8BD58C638FC78",
+ "trace_id": "7637dadf-0405-3e70-e78f-f0fa26d42511",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677815Z",
+ "trace_id": "9fdab630-253f-d030-6f7f-ce1a359fa330",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677815Z",
+ "span_id": "1A9A97C656E06304",
+ "trace_id": "9fdab630-253f-d030-6f7f-ce1a359fa330",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677816Z",
+ "span_id": "5C6D85FF7954A628",
+ "trace_id": "9fdab630-253f-d030-6f7f-ce1a359fa330",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677815Z",
+ "trace_id": "9fdab630-253f-d030-6f7f-ce1a359fa330",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677815Z",
+ "span_id": "1A9A97C656E06304",
+ "trace_id": "9fdab630-253f-d030-6f7f-ce1a359fa330",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677816Z",
+ "span_id": "5C6D85FF7954A628",
+ "trace_id": "9fdab630-253f-d030-6f7f-ce1a359fa330",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677819Z",
+ "trace_id": "f3a4220e-79e8-dc0a-44b0-33642b2561ad",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677819Z",
+ "span_id": "6ED8D4E93C42E03E",
+ "trace_id": "f3a4220e-79e8-dc0a-44b0-33642b2561ad",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.67782Z",
+ "span_id": "E3A02E872E9E95EA",
+ "trace_id": "f3a4220e-79e8-dc0a-44b0-33642b2561ad",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677819Z",
+ "trace_id": "f3a4220e-79e8-dc0a-44b0-33642b2561ad",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677819Z",
+ "span_id": "6ED8D4E93C42E03E",
+ "trace_id": "f3a4220e-79e8-dc0a-44b0-33642b2561ad",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.67782Z",
+ "span_id": "E3A02E872E9E95EA",
+ "trace_id": "f3a4220e-79e8-dc0a-44b0-33642b2561ad",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677824Z",
+ "trace_id": "ac93cf21-6d07-94a2-7e87-f64a637a4a05",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677824Z",
+ "span_id": "2AF1B764C7572560",
+ "trace_id": "ac93cf21-6d07-94a2-7e87-f64a637a4a05",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677825Z",
+ "span_id": "321BA81B83ABAB3C",
+ "trace_id": "ac93cf21-6d07-94a2-7e87-f64a637a4a05",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677824Z",
+ "trace_id": "ac93cf21-6d07-94a2-7e87-f64a637a4a05",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677824Z",
+ "span_id": "2AF1B764C7572560",
+ "trace_id": "ac93cf21-6d07-94a2-7e87-f64a637a4a05",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677825Z",
+ "span_id": "321BA81B83ABAB3C",
+ "trace_id": "ac93cf21-6d07-94a2-7e87-f64a637a4a05",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677835Z",
+ "trace_id": "d0695ec7-66dd-bbdc-9577-86aaeffe9ec5",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677835Z",
+ "span_id": "3A2C3D8803D79AC4",
+ "trace_id": "d0695ec7-66dd-bbdc-9577-86aaeffe9ec5",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677836Z",
+ "span_id": "B44FBDD3FD165A7D",
+ "trace_id": "d0695ec7-66dd-bbdc-9577-86aaeffe9ec5",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677835Z",
+ "trace_id": "d0695ec7-66dd-bbdc-9577-86aaeffe9ec5",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677835Z",
+ "span_id": "3A2C3D8803D79AC4",
+ "trace_id": "d0695ec7-66dd-bbdc-9577-86aaeffe9ec5",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677836Z",
+ "span_id": "B44FBDD3FD165A7D",
+ "trace_id": "d0695ec7-66dd-bbdc-9577-86aaeffe9ec5",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677838Z",
+ "trace_id": "ac155a1f-ab02-d5dc-b77e-65d87e53ab8d",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677838Z",
+ "span_id": "B3541547AC06BBBE",
+ "trace_id": "ac155a1f-ab02-d5dc-b77e-65d87e53ab8d",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677838Z",
+ "span_id": "D9A66F89D75DF7A9",
+ "trace_id": "ac155a1f-ab02-d5dc-b77e-65d87e53ab8d",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677838Z",
+ "trace_id": "ac155a1f-ab02-d5dc-b77e-65d87e53ab8d",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677838Z",
+ "span_id": "B3541547AC06BBBE",
+ "trace_id": "ac155a1f-ab02-d5dc-b77e-65d87e53ab8d",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677838Z",
+ "span_id": "D9A66F89D75DF7A9",
+ "trace_id": "ac155a1f-ab02-d5dc-b77e-65d87e53ab8d",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.67784Z",
+ "trace_id": "51b58b66-f449-6183-7844-7d1c6fb834fd",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.67784Z",
+ "span_id": "6319FEA0EAA4E4C2",
+ "trace_id": "51b58b66-f449-6183-7844-7d1c6fb834fd",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677841Z",
+ "span_id": "ACF1D215C677342D",
+ "trace_id": "51b58b66-f449-6183-7844-7d1c6fb834fd",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.67784Z",
+ "trace_id": "51b58b66-f449-6183-7844-7d1c6fb834fd",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.67784Z",
+ "span_id": "6319FEA0EAA4E4C2",
+ "trace_id": "51b58b66-f449-6183-7844-7d1c6fb834fd",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677841Z",
+ "span_id": "ACF1D215C677342D",
+ "trace_id": "51b58b66-f449-6183-7844-7d1c6fb834fd",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 123000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677847Z",
+ "trace_id": "fcdba2a3-e163-1676-09fd-7e8a579b2d16",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677847Z",
+ "span_id": "BFC1E9D5F3C3DC01",
+ "trace_id": "fcdba2a3-e163-1676-09fd-7e8a579b2d16",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 126000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677848Z",
+ "span_id": "021083418A0CC7D6",
+ "trace_id": "fcdba2a3-e163-1676-09fd-7e8a579b2d16",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677847Z",
+ "trace_id": "fcdba2a3-e163-1676-09fd-7e8a579b2d16",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677847Z",
+ "span_id": "BFC1E9D5F3C3DC01",
+ "trace_id": "fcdba2a3-e163-1676-09fd-7e8a579b2d16",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 126000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677848Z",
+ "span_id": "021083418A0CC7D6",
+ "trace_id": "fcdba2a3-e163-1676-09fd-7e8a579b2d16",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 125000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677877Z",
+ "trace_id": "fb03a9e2-cfb5-cf88-5765-9373285acb88",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677877Z",
+ "span_id": "D732E63B1D99C410",
+ "trace_id": "fb03a9e2-cfb5-cf88-5765-9373285acb88",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677877Z",
+ "span_id": "2115BD5B480ED78A",
+ "trace_id": "fb03a9e2-cfb5-cf88-5765-9373285acb88",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677877Z",
+ "trace_id": "fb03a9e2-cfb5-cf88-5765-9373285acb88",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.677877Z",
+ "span_id": "D732E63B1D99C410",
+ "trace_id": "fb03a9e2-cfb5-cf88-5765-9373285acb88",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677877Z",
+ "span_id": "2115BD5B480ED78A",
+ "trace_id": "fb03a9e2-cfb5-cf88-5765-9373285acb88",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.67788Z",
+ "trace_id": "a1b1e40c-63d1-cd61-c962-e6672540ad11",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.67788Z",
+ "span_id": "479F386B26842545",
+ "trace_id": "a1b1e40c-63d1-cd61-c962-e6672540ad11",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 129000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677885Z",
+ "span_id": "AC44E5C2E91E801A",
+ "trace_id": "a1b1e40c-63d1-cd61-c962-e6672540ad11",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.67788Z",
+ "trace_id": "a1b1e40c-63d1-cd61-c962-e6672540ad11",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "statusCode": "STATUS_CODE_UNSET",
+ "spans": [
+ {
+ "timestamp": "2023-07-10T15:02:30.67788Z",
+ "span_id": "479F386B26842545",
+ "trace_id": "a1b1e40c-63d1-cd61-c962-e6672540ad11",
+ "service_name": "tracegen",
+ "operation": "lets-go",
+ "duration_nano": 129000,
+ "statusCode": "STATUS_CODE_UNSET"
+ },
+ {
+ "timestamp": "2023-07-10T15:02:30.677885Z",
+ "span_id": "AC44E5C2E91E801A",
+ "trace_id": "a1b1e40c-63d1-cd61-c962-e6672540ad11",
+ "service_name": "tracegen",
+ "operation": "okey-dokey",
+ "duration_nano": 124000,
+ "statusCode": "STATUS_CODE_UNSET"
+ }
+ ],
+ "totalSpans": 2
+ }
+ ],
+ "totalTraces": 200
+}
diff --git a/app/assets/javascripts/organizations/groups_and_projects/components/app.vue b/app/assets/javascripts/organizations/groups_and_projects/components/app.vue
new file mode 100644
index 00000000000..2b42c821cd5
--- /dev/null
+++ b/app/assets/javascripts/organizations/groups_and_projects/components/app.vue
@@ -0,0 +1,62 @@
+<script>
+import { GlLoadingIcon } from '@gitlab/ui';
+import { __, s__ } from '~/locale';
+import ProjectsList from '~/vue_shared/components/projects_list/projects_list.vue';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
+import { createAlert } from '~/alert';
+import projectsQuery from '../graphql/queries/projects.query.graphql';
+
+export default {
+ i18n: {
+ pageTitle: __('Groups and projects'),
+ errorMessage: s__(
+ 'Organization|An error occurred loading the projects. Please refresh the page to try again.',
+ ),
+ },
+ components: {
+ ProjectsList,
+ GlLoadingIcon,
+ },
+ data() {
+ return {
+ projects: [],
+ };
+ },
+ apollo: {
+ projects: {
+ query: projectsQuery,
+ update(data) {
+ return data.organization.projects.nodes;
+ },
+ error(error) {
+ createAlert({ message: this.$options.i18n.errorMessage, error, captureError: true });
+ },
+ },
+ },
+ computed: {
+ formattedProjects() {
+ return this.projects.map(({ id, nameWithNamespace, accessLevel, ...project }) => ({
+ ...project,
+ id: getIdFromGraphQLId(id),
+ name: nameWithNamespace,
+ permissions: {
+ projectAccess: {
+ accessLevel: accessLevel.integerValue,
+ },
+ },
+ }));
+ },
+ isLoading() {
+ return this.$apollo.queries.projects?.loading;
+ },
+ },
+};
+</script>
+
+<template>
+ <div>
+ <h1 class="gl-font-size-h-display">{{ $options.i18n.pageTitle }}</h1>
+ <gl-loading-icon v-if="isLoading" class="gl-mt-5" size="md" />
+ <projects-list v-else :projects="formattedProjects" show-project-icon />
+ </div>
+</template>
diff --git a/app/assets/javascripts/organizations/groups_and_projects/graphql/queries/projects.query.graphql b/app/assets/javascripts/organizations/groups_and_projects/graphql/queries/projects.query.graphql
new file mode 100644
index 00000000000..b4cb8c607d4
--- /dev/null
+++ b/app/assets/javascripts/organizations/groups_and_projects/graphql/queries/projects.query.graphql
@@ -0,0 +1,24 @@
+query getOrganizationProjects {
+ organization @client {
+ id
+ projects {
+ nodes {
+ id
+ nameWithNamespace
+ webUrl
+ topics
+ forksCount
+ avatarUrl
+ starCount
+ visibility
+ openIssuesCount
+ descriptionHtml
+ issuesAccessLevel
+ forkingAccessLevel
+ accessLevel {
+ integerValue
+ }
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/organizations/groups_and_projects/graphql/resolvers.js b/app/assets/javascripts/organizations/groups_and_projects/graphql/resolvers.js
new file mode 100644
index 00000000000..794410c2a78
--- /dev/null
+++ b/app/assets/javascripts/organizations/groups_and_projects/graphql/resolvers.js
@@ -0,0 +1,14 @@
+import { organizationProjects } from 'jest/organizations/groups_and_projects/components/mock_data';
+
+export default {
+ Query: {
+ organization: async () => {
+ // Simulate API loading
+ await new Promise((resolve) => {
+ setTimeout(resolve, 1000);
+ });
+
+ return organizationProjects;
+ },
+ },
+};
diff --git a/app/assets/javascripts/organizations/groups_and_projects/index.js b/app/assets/javascripts/organizations/groups_and_projects/index.js
new file mode 100644
index 00000000000..d0790bcc040
--- /dev/null
+++ b/app/assets/javascripts/organizations/groups_and_projects/index.js
@@ -0,0 +1,24 @@
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import createDefaultClient from '~/lib/graphql';
+import resolvers from './graphql/resolvers';
+import App from './components/app.vue';
+
+export const initOrganizationsGroupsAndProjects = () => {
+ const el = document.getElementById('js-organizations-groups-and-projects');
+
+ if (!el) return false;
+
+ const apolloProvider = new VueApollo({
+ defaultClient: createDefaultClient(resolvers),
+ });
+
+ return new Vue({
+ el,
+ name: 'OrganizationsGroupsAndProjects',
+ apolloProvider,
+ render(createElement) {
+ return createElement(App);
+ },
+ });
+};
diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/tags_list_row.vue b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/tags_list_row.vue
index 8e89128a382..a3f58cc3323 100644
--- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/tags_list_row.vue
+++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/tags_list_row.vue
@@ -4,8 +4,7 @@ import {
GlTooltipDirective,
GlSprintf,
GlIcon,
- GlDropdown,
- GlDropdownItem,
+ GlDisclosureDropdown,
} from '@gitlab/ui';
import { formatDate } from '~/lib/utils/datetime_utility';
import { numberToHumanSize } from '~/lib/utils/number_utils';
@@ -33,8 +32,7 @@ export default {
GlSprintf,
GlFormCheckbox,
GlIcon,
- GlDropdown,
- GlDropdownItem,
+ GlDisclosureDropdown,
ListItem,
ClipboardButton,
TimeAgoTooltip,
@@ -76,6 +74,22 @@ export default {
COPY_IMAGE_PATH_TITLE,
},
computed: {
+ items() {
+ return [
+ {
+ text: this.$options.i18n.REMOVE_TAG_BUTTON_TITLE,
+ extraAttrs: {
+ class: 'gl-text-red-500!',
+ 'data-testid': 'single-delete-button',
+ 'data-qa-selector': 'tag_delete_button',
+ },
+ action: () => {
+ this.$emit('delete');
+ },
+ },
+ ];
+ },
+
formattedSize() {
return this.tag.totalSize
? numberToHumanSize(Number(this.tag.totalSize))
@@ -177,31 +191,23 @@ export default {
</span>
</template>
<template v-if="tag.canDelete" #right-action>
- <gl-dropdown
+ <gl-disclosure-dropdown
:disabled="disabled"
icon="ellipsis_v"
- :text="$options.i18n.MORE_ACTIONS_TEXT"
+ :toggle-text="$options.i18n.MORE_ACTIONS_TEXT"
:text-sr-only="true"
category="tertiary"
no-caret
- right
+ placement="right"
:class="{ 'gl-opacity-0 gl-pointer-events-none': disabled }"
data-testid="additional-actions"
data-qa-selector="more_actions_menu"
- >
- <gl-dropdown-item
- variant="danger"
- data-testid="single-delete-button"
- data-qa-selector="tag_delete_button"
- @click="$emit('delete')"
- >
- {{ $options.i18n.REMOVE_TAG_BUTTON_TITLE }}
- </gl-dropdown-item>
- </gl-dropdown>
+ :items="items"
+ />
</template>
<template v-if="!isInvalidTag" #details-published>
- <details-row icon="clock" data-testid="published-date-detail">
+ <details-row icon="clock" padding="gl-py-3" data-testid="published-date-detail">
<gl-sprintf :message="$options.i18n.PUBLISHED_DETAILS_ROW_TEXT">
<template #repositoryPath>
<i>{{ tagLocation }}</i>
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 732d544816b..87a2eb362d5 100644
--- a/app/assets/javascripts/packages_and_registries/dependency_proxy/app.vue
+++ b/app/assets/javascripts/packages_and_registries/dependency_proxy/app.vue
@@ -4,9 +4,9 @@ import {
GlButton,
GlDropdown,
GlDropdownItem,
- GlEmptyState,
GlFormGroup,
GlFormInputGroup,
+ GlSkeletonLoader,
GlModal,
GlModalDirective,
GlSprintf,
@@ -17,7 +17,6 @@ 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_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';
@@ -28,7 +27,7 @@ export default {
GlButton,
GlDropdown,
GlDropdownItem,
- GlEmptyState,
+ GlSkeletonLoader,
GlFormGroup,
GlFormInputGroup,
GlModal,
@@ -41,13 +40,12 @@ export default {
GlModalDirective,
GlTooltip: GlTooltipDirective,
},
- inject: ['groupPath', 'groupId', 'noManifestsIllustration', 'canClearCache', 'settingsPath'],
+ inject: ['groupPath', 'groupId', 'canClearCache', 'settingsPath'],
i18n: {
proxyImagePrefix: s__('DependencyProxy|Dependency Proxy image prefix'),
copyImagePrefixText: s__('DependencyProxy|Copy prefix'),
blobCountAndSize: s__('DependencyProxy|Contains %{count} blobs of images (%{size})'),
pageTitle: s__('DependencyProxy|Dependency Proxy'),
- noManifestTitle: s__('DependencyProxy|There are no images in the cache'),
deleteCacheAlertMessageSuccess: s__(
'DependencyProxy|All items in the cache are scheduled for removal.',
),
@@ -64,9 +62,6 @@ export default {
text: __('Cancel'),
},
},
- links: {
- DEPENDENCY_PROXY_DOCS_PATH,
- },
data() {
return {
group: {},
@@ -90,7 +85,7 @@ export default {
return this.group.dependencyProxyManifests?.pageInfo;
},
manifests() {
- return this.group.dependencyProxyManifests?.nodes;
+ return this.group.dependencyProxyManifests?.nodes ?? [];
},
modalTitleWithCount() {
return sprintf(
@@ -199,10 +194,16 @@ export default {
</template>
</title-area>
- <gl-form-group v-if="showDependencyProxyImagePrefix" :label="$options.i18n.proxyImagePrefix">
+ <gl-form-group
+ v-if="showDependencyProxyImagePrefix"
+ :label="$options.i18n.proxyImagePrefix"
+ label-for="proxy-url"
+ >
<gl-form-input-group
+ id="proxy-url"
readonly
:value="group.dependencyProxyImagePrefix"
+ select-on-click
class="gl-layout-w-limited"
data-testid="proxy-url"
>
@@ -222,9 +223,9 @@ export default {
</span>
</template>
</gl-form-group>
+ <gl-skeleton-loader v-else-if="$apollo.queries.group.loading" />
<manifests-list
- v-if="manifests && manifests.length"
:dependency-proxy-image-prefix="dependencyProxyImagePrefix"
:loading="$apollo.queries.group.loading"
:manifests="manifests"
@@ -233,12 +234,6 @@ export default {
@next-page="fetchNextPage"
/>
- <gl-empty-state
- v-else
- :svg-path="noManifestsIllustration"
- :title="$options.i18n.noManifestTitle"
- />
-
<gl-modal
:modal-id="$options.confirmClearCacheModal"
:title="modalTitleWithCount"
diff --git a/app/assets/javascripts/packages_and_registries/dependency_proxy/components/manifests_empty_state.vue b/app/assets/javascripts/packages_and_registries/dependency_proxy/components/manifests_empty_state.vue
new file mode 100644
index 00000000000..b0d03a7cebe
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/dependency_proxy/components/manifests_empty_state.vue
@@ -0,0 +1,80 @@
+<script>
+import { GlEmptyState, GlFormGroup, GlFormInputGroup, GlLink, GlSprintf } from '@gitlab/ui';
+import { s__ } from '~/locale';
+import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
+import { DEPENDENCY_PROXY_HELP_PAGE_PATH } from '~/packages_and_registries/dependency_proxy/constants';
+
+export default {
+ name: 'ManifestsEmptyState',
+ components: {
+ ClipboardButton,
+ GlEmptyState,
+ GlFormGroup,
+ GlFormInputGroup,
+ GlLink,
+ GlSprintf,
+ },
+ inject: ['noManifestsIllustration'],
+ i18n: {
+ codeExampleLabel: s__('DependencyProxy|Pull image by digest example'),
+ noManifestTitle: s__('DependencyProxy|There are no images in the cache'),
+ emptyText: s__(
+ 'DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}',
+ ),
+ documentationText: s__(
+ 'DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache.',
+ ),
+ copyExample: s__('DependencyProxy|Copy example'),
+ },
+ // eslint-disable-next-line no-template-curly-in-string
+ codeExample: 'image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/alpine:latest',
+ links: {
+ DEPENDENCY_PROXY_HELP_PAGE_PATH,
+ },
+};
+</script>
+
+<template>
+ <gl-empty-state :svg-path="noManifestsIllustration" :title="$options.i18n.noManifestTitle">
+ <template #description>
+ <p class="gl-mb-5">
+ <gl-sprintf :message="$options.i18n.emptyText">
+ <template #code="{ content }">
+ <code>{{ content }}</code>
+ </template>
+ </gl-sprintf>
+ </p>
+
+ <gl-form-group
+ class="gl-mb-5"
+ :label="$options.i18n.codeExampleLabel"
+ label-for="code-example"
+ label-sr-only
+ >
+ <gl-form-input-group
+ id="code-example"
+ readonly
+ :value="$options.codeExample"
+ class="gl-w-70p gl-mx-auto"
+ select-on-click
+ >
+ <template #append>
+ <clipboard-button
+ :text="$options.codeExample"
+ :title="$options.i18n.copyExample"
+ class="gl-m-0!"
+ />
+ </template>
+ </gl-form-input-group>
+ </gl-form-group>
+
+ <p>
+ <gl-sprintf :message="$options.i18n.documentationText">
+ <template #docLink="{ content }">
+ <gl-link :href="$options.links.DEPENDENCY_PROXY_HELP_PAGE_PATH">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </p>
+ </template>
+ </gl-empty-state>
+</template>
diff --git a/app/assets/javascripts/packages_and_registries/dependency_proxy/components/manifests_list.vue b/app/assets/javascripts/packages_and_registries/dependency_proxy/components/manifests_list.vue
index 9870841f1ff..94c958308dd 100644
--- a/app/assets/javascripts/packages_and_registries/dependency_proxy/components/manifests_list.vue
+++ b/app/assets/javascripts/packages_and_registries/dependency_proxy/components/manifests_list.vue
@@ -2,11 +2,13 @@
import { GlKeysetPagination, GlSkeletonLoader } from '@gitlab/ui';
import { s__ } from '~/locale';
import ManifestRow from '~/packages_and_registries/dependency_proxy/components/manifest_row.vue';
+import ManifestsEmptyState from '~/packages_and_registries/dependency_proxy/components/manifests_empty_state.vue';
export default {
name: 'ManifestsLists',
components: {
ManifestRow,
+ ManifestsEmptyState,
GlKeysetPagination,
GlSkeletonLoader,
},
@@ -18,7 +20,8 @@ export default {
},
pagination: {
type: Object,
- required: true,
+ required: false,
+ default: () => ({}),
},
loading: {
type: Boolean,
@@ -44,12 +47,18 @@ export default {
<template>
<div class="gl-mt-6">
- <h3 class="gl-font-base">{{ $options.i18n.listTitle }}</h3>
- <gl-skeleton-loader v-if="loading" />
+ <h3 class="gl-font-base gl-pb-3 gl-mb-0 gl-border-b-1 gl-border-gray-100 gl-border-b-solid">
+ {{ $options.i18n.listTitle }}
+ </h3>
+
+ <div v-if="loading" class="gl-py-3">
+ <gl-skeleton-loader />
+ </div>
+
+ <manifests-empty-state v-else-if="manifests.length === 0" />
+
<div v-else data-testid="main-area">
- <div
- class="gl-border-t-1 gl-border-gray-100 gl-border-t-solid gl-display-flex gl-flex-direction-column"
- >
+ <div class="gl-display-flex gl-flex-direction-column">
<manifest-row
v-for="(manifest, index) in manifests"
:key="index"
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 fdad69204ba..8e88df92155 100644
--- a/app/assets/javascripts/packages_and_registries/dependency_proxy/constants.js
+++ b/app/assets/javascripts/packages_and_registries/dependency_proxy/constants.js
@@ -1,2 +1,11 @@
+import { helpPagePath } from '~/helpers/help_page_helper';
+
export const GRAPHQL_PAGE_SIZE = 20;
export const MANIFEST_PENDING_DESTRUCTION_STATUS = 'PENDING_DESTRUCTION';
+
+export const DEPENDENCY_PROXY_HELP_PAGE_PATH = helpPagePath(
+ 'user/packages/dependency_proxy/index',
+ {
+ anchor: 'store-a-docker-image-in-dependency-proxy-cache',
+ },
+);
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/components/details/package_files.vue b/app/assets/javascripts/packages_and_registries/package_registry/components/details/package_files.vue
index 3157653648b..96d097eff38 100644
--- a/app/assets/javascripts/packages_and_registries/package_registry/components/details/package_files.vue
+++ b/app/assets/javascripts/packages_and_registries/package_registry/components/details/package_files.vue
@@ -3,16 +3,20 @@ import {
GlAlert,
GlLink,
GlTable,
- GlDropdownItem,
- GlDropdown,
+ GlDisclosureDropdown,
+ GlDisclosureDropdownItem,
GlButton,
GlFormCheckbox,
GlLoadingIcon,
GlModal,
GlSprintf,
+ GlKeysetPagination,
} from '@gitlab/ui';
+import * as Sentry from '@sentry/browser';
import { createAlert, VARIANT_SUCCESS, VARIANT_WARNING } from '~/alert';
+import { NEXT, PREV } from '~/vue_shared/components/pagination/constants';
import { numberToHumanSize } from '~/lib/utils/number_utils';
+import { scrollToElement } from '~/lib/utils/common_utils';
import { __, s__ } from '~/locale';
import FileSha from '~/packages_and_registries/package_registry/components/details/file_sha.vue';
import Tracking from '~/tracking';
@@ -47,12 +51,13 @@ export default {
GlAlert,
GlLink,
GlTable,
- GlDropdown,
- GlDropdownItem,
+ GlDisclosureDropdown,
+ GlDisclosureDropdownItem,
GlFormCheckbox,
GlButton,
GlLoadingIcon,
GlModal,
+ GlKeysetPagination,
GlSprintf,
FileIcon,
TimeAgoTooltip,
@@ -94,10 +99,17 @@ export default {
return this.queryVariables;
},
update(data) {
- return data.package?.packageFiles ?? {};
+ return data.package?.packageFiles?.nodes ?? [];
},
- error() {
+ result({ data }) {
+ const { packageFiles } = data?.package ?? {};
+ if (packageFiles?.pageInfo) {
+ this.pageInfo = packageFiles.pageInfo;
+ }
+ },
+ error(error) {
this.fetchPackageFilesError = true;
+ Sentry.captureException(error);
},
},
},
@@ -105,23 +117,21 @@ export default {
return {
fetchPackageFilesError: false,
filesToDelete: [],
- packageFiles: {},
+ packageFiles: [],
mutationLoading: false,
selectedReferences: [],
+ pageInfo: {},
};
},
computed: {
- files() {
- return this.packageFiles?.nodes ?? [];
- },
areFilesSelected() {
return this.selectedReferences.length > 0;
},
areAllFilesSelected() {
- return this.files.length > 0 && this.files.every(this.isSelected);
+ return this.packageFiles.length > 0 && this.packageFiles.every(this.isSelected);
},
filesTableRows() {
- return this.files.map((pf) => ({
+ return this.packageFiles.map((pf) => ({
...pf,
size: this.formatSize(pf.size),
}));
@@ -168,6 +178,10 @@ export default {
first: GRAPHQL_PACKAGE_FILES_PAGE_SIZE,
};
},
+ showPagination() {
+ const { hasPreviousPage, hasNextPage } = this.pageInfo;
+ return hasPreviousPage || hasNextPage;
+ },
tracking() {
return {
category: packageTypeToTrackCategory(this.packageType),
@@ -258,7 +272,7 @@ export default {
},
handleFileDelete(files) {
this.track(REQUEST_DELETE_PACKAGE_FILE_TRACKING_ACTION);
- if (files.length === this.files.length && !this.packageFiles?.pageInfo?.hasNextPage) {
+ if (files.length === this.packageFiles.length && !this.pageInfo.hasNextPage) {
this.$emit(
'delete-all-files',
this.hasOneItem(files)
@@ -281,6 +295,41 @@ export default {
}
this.deletePackageFiles(this.filesToDelete.map((file) => file.id));
},
+ fetchPreviousFilesPage() {
+ return this.$apollo.queries.packageFiles
+ .fetchMore({
+ variables: {
+ first: null,
+ last: GRAPHQL_PACKAGE_FILES_PAGE_SIZE,
+ before: this.pageInfo.startCursor,
+ },
+ })
+ .then(() => {
+ this.scrollAndFocus();
+ });
+ },
+ fetchNextFilesPage() {
+ return this.$apollo.queries.packageFiles
+ .fetchMore({
+ variables: {
+ first: GRAPHQL_PACKAGE_FILES_PAGE_SIZE,
+ last: null,
+ after: this.pageInfo.endCursor,
+ },
+ })
+ .then(() => {
+ this.scrollAndFocus();
+ });
+ },
+ scrollAndFocus() {
+ scrollToElement(this.$el);
+
+ // get first focusable row
+ const focusable = this.$el.querySelector('tbody tr');
+ if (focusable) {
+ focusable.focus();
+ }
+ },
},
i18n: {
deleteFile: s__('PackageRegistry|Delete asset'),
@@ -295,6 +344,8 @@ export default {
deleteSelected: s__('PackageRegistry|Delete selected'),
moreActionsText: __('More actions'),
fetchPackageFilesErrorMessage: FETCH_PACKAGE_FILES_ERROR_MESSAGE,
+ prev: PREV,
+ next: NEXT,
},
modal: {
fileDeletePrimaryAction: {
@@ -334,102 +385,122 @@ export default {
>
{{ $options.i18n.fetchPackageFilesErrorMessage }}
</gl-alert>
- <gl-table
- v-else
- :busy="isLoading"
- :fields="filesTableHeaderFields"
- :items="filesTableRows"
- show-empty
- selectable
- select-mode="multi"
- selected-variant="primary"
- :tbody-tr-attr="{ 'data-testid': 'file-row' }"
- @row-selected="updateSelectedReferences"
- >
- <template #table-busy>
- <gl-loading-icon size="lg" class="gl-my-5" />
- </template>
- <template #head(checkbox)="{ selectAllRows, clearSelected }">
- <gl-form-checkbox
- v-if="canDelete"
- data-testid="package-files-checkbox-all"
- :checked="areAllFilesSelected"
- :indeterminate="hasSelectedSomeFiles"
- @change="areAllFilesSelected ? clearSelected() : selectAllRows()"
- />
- </template>
+ <template v-else>
+ <gl-table
+ ref="table"
+ :busy="isLoading"
+ :fields="filesTableHeaderFields"
+ :items="filesTableRows"
+ show-empty
+ selectable
+ select-mode="multi"
+ selected-variant="primary"
+ :tbody-tr-attr="{ 'data-testid': 'file-row' }"
+ @row-selected="updateSelectedReferences"
+ >
+ <template #table-busy>
+ <gl-loading-icon size="lg" class="gl-my-5" />
+ </template>
+ <template #head(checkbox)="{ selectAllRows, clearSelected }">
+ <gl-form-checkbox
+ v-if="canDelete"
+ data-testid="package-files-checkbox-all"
+ :checked="areAllFilesSelected"
+ :indeterminate="hasSelectedSomeFiles"
+ @change="areAllFilesSelected ? clearSelected() : selectAllRows()"
+ />
+ </template>
- <template #cell(checkbox)="{ rowSelected, selectRow, unselectRow }">
- <gl-form-checkbox
- v-if="canDelete"
- class="gl-mt-1"
- :checked="rowSelected"
- data-testid="package-files-checkbox"
- @change="rowSelected ? unselectRow() : selectRow()"
- />
- </template>
+ <template #cell(checkbox)="{ rowSelected, selectRow, unselectRow }">
+ <gl-form-checkbox
+ v-if="canDelete"
+ class="gl-mt-1"
+ :checked="rowSelected"
+ data-testid="package-files-checkbox"
+ @change="rowSelected ? unselectRow() : selectRow()"
+ />
+ </template>
- <template #cell(name)="{ item, toggleDetails, detailsShowing }">
- <gl-button
- v-if="hasDetails(item)"
- :icon="detailsShowing ? 'chevron-up' : 'chevron-down'"
- :aria-label="detailsShowing ? __('Collapse') : __('Expand')"
- category="tertiary"
- size="small"
- @click="
- toggleDetails();
- trackToggleDetails(detailsShowing);
- "
- />
- <gl-link
- :href="item.downloadPath"
- class="gl-text-gray-500"
- data-testid="download-link"
- @click="track($options.trackingActions.DOWNLOAD_PACKAGE_ASSET_TRACKING_ACTION)"
- >
- <file-icon
- :file-name="item.fileName"
- css-classes="gl-relative file-icon"
- class="gl-mr-1 gl-relative"
+ <template #cell(name)="{ item, toggleDetails, detailsShowing }">
+ <gl-button
+ v-if="hasDetails(item)"
+ :icon="detailsShowing ? 'chevron-up' : 'chevron-down'"
+ :aria-label="detailsShowing ? __('Collapse') : __('Expand')"
+ data-testid="toggle-details-button"
+ category="tertiary"
+ size="small"
+ @click="
+ toggleDetails();
+ trackToggleDetails(detailsShowing);
+ "
/>
- <span>{{ item.fileName }}</span>
- </gl-link>
- </template>
+ <gl-link
+ :href="item.downloadPath"
+ class="gl-text-gray-500"
+ data-testid="download-link"
+ @click="track($options.trackingActions.DOWNLOAD_PACKAGE_ASSET_TRACKING_ACTION)"
+ >
+ <file-icon
+ :file-name="item.fileName"
+ css-classes="gl-relative file-icon"
+ class="gl-mr-1 gl-relative"
+ />
+ <span>{{ item.fileName }}</span>
+ </gl-link>
+ </template>
- <template #cell(created)="{ item }">
- <time-ago-tooltip :time="item.createdAt" />
- </template>
+ <template #cell(created)="{ item }">
+ <time-ago-tooltip :time="item.createdAt" />
+ </template>
- <template #cell(actions)="{ item }">
- <gl-dropdown
- category="tertiary"
- icon="ellipsis_v"
- :text-sr-only="true"
- :text="$options.i18n.moreActionsText"
- no-caret
- right
- >
- <gl-dropdown-item data-testid="delete-file" @click="handleFileDelete([item])">
- {{ $options.i18n.deleteFile }}
- </gl-dropdown-item>
- </gl-dropdown>
- </template>
+ <template #cell(actions)="{ item }">
+ <gl-disclosure-dropdown
+ category="tertiary"
+ icon="ellipsis_v"
+ placement="right"
+ :toggle-text="$options.i18n.moreActionsText"
+ text-sr-only
+ no-caret
+ >
+ <gl-disclosure-dropdown-item
+ data-testid="delete-file"
+ @action="handleFileDelete([item])"
+ >
+ <template #list-item>
+ {{ $options.i18n.deleteFile }}
+ </template>
+ </gl-disclosure-dropdown-item>
+ </gl-disclosure-dropdown>
+ </template>
- <template #row-details="{ item }">
- <div
- class="gl-display-flex gl-flex-direction-column gl-flex-grow-1 gl-bg-gray-10 gl-rounded-base gl-inset-border-1-gray-100"
- >
- <file-sha
- v-if="item.fileSha256"
- data-testid="sha-256"
- title="SHA-256"
- :sha="item.fileSha256"
- />
- <file-sha v-if="item.fileMd5" data-testid="md5" title="MD5" :sha="item.fileMd5" />
- <file-sha v-if="item.fileSha1" data-testid="sha-1" title="SHA-1" :sha="item.fileSha1" />
- </div>
- </template>
- </gl-table>
+ <template #row-details="{ item }">
+ <div
+ class="gl-display-flex gl-flex-direction-column gl-flex-grow-1 gl-bg-gray-10 gl-rounded-base gl-inset-border-1-gray-100"
+ >
+ <file-sha
+ v-if="item.fileSha256"
+ data-testid="sha-256"
+ title="SHA-256"
+ :sha="item.fileSha256"
+ />
+ <file-sha v-if="item.fileMd5" data-testid="md5" title="MD5" :sha="item.fileMd5" />
+ <file-sha v-if="item.fileSha1" data-testid="sha-1" title="SHA-1" :sha="item.fileSha1" />
+ </div>
+ </template>
+ </gl-table>
+ <div class="gl-display-flex gl-justify-content-center">
+ <gl-keyset-pagination
+ v-if="showPagination"
+ :disabled="isLoading"
+ v-bind="pageInfo"
+ :prev-text="$options.i18n.prev"
+ :next-text="$options.i18n.next"
+ class="gl-mt-3"
+ @prev="fetchPreviousFilesPage"
+ @next="fetchNextFilesPage"
+ />
+ </div>
+ </template>
<gl-modal
ref="deleteFilesModal"
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/components/details/version_row.vue b/app/assets/javascripts/packages_and_registries/package_registry/components/details/version_row.vue
index 37a6fe75f15..ca2516810cf 100644
--- a/app/assets/javascripts/packages_and_registries/package_registry/components/details/version_row.vue
+++ b/app/assets/javascripts/packages_and_registries/package_registry/components/details/version_row.vue
@@ -1,7 +1,6 @@
<script>
import {
- GlDropdown,
- GlDropdownItem,
+ GlDisclosureDropdown,
GlFormCheckbox,
GlIcon,
GlLink,
@@ -25,8 +24,7 @@ import {
export default {
name: 'PackageVersionRow',
components: {
- GlDropdown,
- GlDropdownItem,
+ GlDisclosureDropdown,
GlFormCheckbox,
GlIcon,
GlLink,
@@ -61,6 +59,18 @@ export default {
errorStatusRow() {
return this.packageEntity?.status === PACKAGE_ERROR_STATUS;
},
+ dropdownItems() {
+ return [
+ {
+ text: this.$options.i18n.deletePackage,
+ action: () => this.$emit('delete'),
+ extraAttrs: {
+ class: 'gl-text-red-500!',
+ 'data-testid': 'action-delete',
+ },
+ },
+ ];
+ },
},
i18n: {
deletePackage: DELETE_PACKAGE_TEXT,
@@ -129,18 +139,15 @@ export default {
</template>
<template v-if="packageEntity.canDestroy" #right-action>
- <gl-dropdown
+ <gl-disclosure-dropdown
data-testid="delete-dropdown"
icon="ellipsis_v"
- :text="$options.i18n.moreActions"
- :text-sr-only="true"
+ :items="dropdownItems"
+ :toggle-text="$options.i18n.moreActions"
category="tertiary"
+ text-sr-only
no-caret
- >
- <gl-dropdown-item data-testid="action-delete" variant="danger" @click="$emit('delete')">{{
- $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_list_row.vue b/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_list_row.vue
index 4ec83a869b3..c690e8fac43 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
@@ -7,8 +7,9 @@ import {
GlSprintf,
GlTooltipDirective,
GlTruncate,
+ GlLink,
} from '@gitlab/ui';
-import { __ } from '~/locale';
+import { s__, __ } from '~/locale';
import ListItem from '~/vue_shared/components/registry/list_item.vue';
import {
DELETE_PACKAGE_TEXT,
@@ -19,7 +20,6 @@ import {
WARNING_TEXT,
} from '~/packages_and_registries/package_registry/constants';
import { getPackageTypeLabel } from '~/packages_and_registries/package_registry/utils';
-import PackagePath from '~/packages_and_registries/shared/components/package_path.vue';
import PackageTags from '~/packages_and_registries/shared/components/package_tags.vue';
import PublishMethod from '~/packages_and_registries/package_registry/components/list/publish_method.vue';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
@@ -34,8 +34,8 @@ export default {
GlIcon,
GlSprintf,
GlTruncate,
+ GlLink,
PackageTags,
- PackagePath,
PublishMethod,
ListItem,
TimeagoTooltip,
@@ -43,7 +43,7 @@ export default {
directives: {
GlTooltip: GlTooltipDirective,
},
- inject: ['isGroupPage'],
+ inject: ['isGroupPage', 'canDeletePackages'],
props: {
packageEntity: {
type: Object,
@@ -68,9 +68,29 @@ export default {
pipeline() {
return this.packageEntity?.pipelines?.nodes[0];
},
+ projectName() {
+ return this.packageEntity.project.name;
+ },
+ projectLink() {
+ return this.packageEntity.project.webUrl;
+ },
pipelineUser() {
return this.pipeline?.user?.name;
},
+ publishedMessage() {
+ if (this.isGroupPage) {
+ if (this.pipelineUser) {
+ return s__(`PackageRegistry|Published to %{projectName} by %{author}, %{date}`);
+ }
+ return s__(`PackageRegistry|Published to %{projectName}, %{date}`);
+ }
+
+ if (this.pipelineUser) {
+ return s__(`PackageRegistry|Published by %{author}, %{date}`);
+ }
+
+ return s__(`PackageRegistry|Published %{date}`);
+ },
errorStatusRow() {
return this.packageEntity.status === PACKAGE_ERROR_STATUS;
},
@@ -102,7 +122,7 @@ export default {
<list-item data-testid="package-row" :selected="selected" v-bind="$attrs">
<template #left-action>
<gl-form-checkbox
- v-if="packageEntity.canDestroy"
+ v-if="canDeletePackages"
class="gl-m-0"
:checked="selected"
@change="$emit('select')"
@@ -142,20 +162,7 @@ export default {
:text="packageEntity.version"
:with-tooltip="true"
/>
-
- <div v-if="pipelineUser" class="gl-display-none gl-sm-display-flex gl-ml-2">
- <gl-sprintf :message="s__('PackageRegistry|published by %{author}')">
- <template #author>{{ pipelineUser }}</template>
- </gl-sprintf>
- </div>
-
<span class="gl-ml-2" data-testid="package-type">&middot; {{ packageType }}</span>
-
- <package-path
- v-if="isGroupPage"
- :path="packageEntity.project.fullPath"
- :disabled="nonDefaultRow"
- />
</div>
<div v-else>
<gl-icon
@@ -174,11 +181,15 @@ export default {
</template>
<template #right-secondary>
- <span data-testid="created-date">
- <gl-sprintf :message="$options.i18n.createdAt">
- <template #timestamp>
+ <span data-testid="right-secondary">
+ <gl-sprintf :message="publishedMessage">
+ <template v-if="isGroupPage" #projectName>
+ <gl-link data-testid="root-link" :href="projectLink">{{ projectName }}</gl-link>
+ </template>
+ <template #date>
<timeago-tooltip :time="packageEntity.createdAt" />
</template>
+ <template v-if="pipelineUser" #author>{{ pipelineUser }}</template>
</gl-sprintf>
</span>
</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 effed4891d8..a7831ef2588 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
@@ -36,6 +36,7 @@ export default {
RegistryList,
},
mixins: [Tracking.mixin()],
+ inject: ['canDeletePackages'],
props: {
list: {
type: Array,
@@ -175,6 +176,7 @@ export default {
>
<registry-list
data-testid="packages-table"
+ :hidden-delete="!canDeletePackages"
:is-loading="isLoading"
:items="list"
:pagination="pageInfo"
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/constants.js b/app/assets/javascripts/packages_and_registries/package_registry/constants.js
index 80712c2991c..364bd430f07 100644
--- a/app/assets/javascripts/packages_and_registries/package_registry/constants.js
+++ b/app/assets/javascripts/packages_and_registries/package_registry/constants.js
@@ -235,4 +235,4 @@ export const REQUEST_FORWARDING_HELP_PAGE_PATH = helpPagePath(
);
export const GRAPHQL_PACKAGE_PIPELINES_PAGE_SIZE = 10;
-export const GRAPHQL_PACKAGE_FILES_PAGE_SIZE = 100;
+export const GRAPHQL_PACKAGE_FILES_PAGE_SIZE = 20;
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 bcd90b7bee5..0c8af248c43 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
@@ -26,6 +26,7 @@ fragment PackageData on Package {
}
project {
id
+ name
fullPath
webUrl
}
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/graphql/index.js b/app/assets/javascripts/packages_and_registries/package_registry/graphql/index.js
index d05ff5daad4..d630e040d52 100644
--- a/app/assets/javascripts/packages_and_registries/package_registry/graphql/index.js
+++ b/app/assets/javascripts/packages_and_registries/package_registry/graphql/index.js
@@ -22,6 +22,7 @@ export const apolloProvider = new VueApollo({
merge: mergeVariables,
},
packageFiles: {
+ keyArgs: ['id'],
merge: mergeVariables,
},
},
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/graphql/queries/get_package_files.query.graphql b/app/assets/javascripts/packages_and_registries/package_registry/graphql/queries/get_package_files.query.graphql
index e6f292ec1d3..7a389b2aa5c 100644
--- a/app/assets/javascripts/packages_and_registries/package_registry/graphql/queries/get_package_files.query.graphql
+++ b/app/assets/javascripts/packages_and_registries/package_registry/graphql/queries/get_package_files.query.graphql
@@ -1,9 +1,17 @@
-query getPackageFiles($id: PackagesPackageID!, $first: Int) {
+#import "~/graphql_shared/fragments/page_info.fragment.graphql"
+
+query getPackageFiles(
+ $id: PackagesPackageID!
+ $first: Int
+ $last: Int
+ $after: String
+ $before: String
+) {
package(id: $id) {
id
- packageFiles(first: $first) {
+ packageFiles(after: $after, before: $before, first: $first, last: $last) {
pageInfo {
- hasNextPage
+ ...PageInfo
}
nodes {
id
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/index.js b/app/assets/javascripts/packages_and_registries/package_registry/index.js
index e2f8d239bae..ae0f6d18d99 100644
--- a/app/assets/javascripts/packages_and_registries/package_registry/index.js
+++ b/app/assets/javascripts/packages_and_registries/package_registry/index.js
@@ -1,5 +1,6 @@
import Vue from 'vue';
import Translate from '~/vue_shared/translate';
+import { parseBoolean } from '~/lib/utils/common_utils';
import { apolloProvider } from '~/packages_and_registries/package_registry/graphql/index';
import PackageRegistry from '~/packages_and_registries/package_registry/pages/index.vue';
import RegistryBreadcrumb from '~/packages_and_registries/shared/components/registry_breadcrumb.vue';
@@ -20,6 +21,7 @@ export default () => {
projectListUrl,
groupListUrl,
settingsPath,
+ canDeletePackages,
} = el.dataset;
const isGroupPage = pageType === 'groups';
@@ -50,6 +52,7 @@ export default () => {
groupListUrl,
breadCrumbState,
settingsPath,
+ canDeletePackages: parseBoolean(canDeletePackages),
},
render(createElement) {
return createElement(PackageRegistry);
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/pages/list.vue b/app/assets/javascripts/packages_and_registries/package_registry/pages/list.vue
index 14d617a7a3c..486c3ef31c5 100644
--- a/app/assets/javascripts/packages_and_registries/package_registry/pages/list.vue
+++ b/app/assets/javascripts/packages_and_registries/package_registry/pages/list.vue
@@ -2,6 +2,7 @@
import { GlButton, GlEmptyState, GlLink, GlSprintf, GlTooltipDirective } from '@gitlab/ui';
import { createAlert, VARIANT_INFO } from '~/alert';
import { WORKSPACE_GROUP, WORKSPACE_PROJECT } from '~/issues/constants';
+import { fetchPolicies } from '~/lib/graphql';
import { historyReplaceState } from '~/lib/utils/common_utils';
import { s__ } from '~/locale';
import { SHOW_DELETE_SUCCESS_ALERT } from '~/packages_and_registries/shared/constants';
@@ -38,11 +39,13 @@ export default {
sort: '',
filters: {},
mutationLoading: false,
+ pageParams: {},
};
},
apollo: {
packagesResource: {
query: getPackagesQuery,
+ fetchPolicy: fetchPolicies.CACHE_AND_NETWORK,
variables() {
return this.queryVariables;
},
@@ -72,6 +75,7 @@ export default {
packageName: this.filters?.packageName,
packageType: this.filters?.packageType,
first: GRAPHQL_PAGE_SIZE,
+ ...this.pageParams,
};
},
graphqlResource() {
@@ -120,37 +124,22 @@ export default {
}
},
handleSearchUpdate({ sort, filters }) {
+ this.pageParams = {};
this.sort = sort;
this.filters = { ...filters };
},
- updateQuery(_, { fetchMoreResult }) {
- return fetchMoreResult;
- },
fetchNextPage() {
- const variables = {
- ...this.queryVariables,
+ this.pageParams = {
first: GRAPHQL_PAGE_SIZE,
- last: null,
after: this.pageInfo?.endCursor,
};
-
- this.$apollo.queries.packagesResource.fetchMore({
- variables,
- updateQuery: this.updateQuery,
- });
},
fetchPreviousPage() {
- const variables = {
- ...this.queryVariables,
+ this.pageParams = {
first: null,
last: GRAPHQL_PAGE_SIZE,
before: this.pageInfo?.startCursor,
};
-
- this.$apollo.queries.packagesResource.fetchMore({
- variables,
- updateQuery: this.updateQuery,
- });
},
},
i18n: {
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 4c25c0f97de..6ff7d58fd9e 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
@@ -78,6 +78,7 @@ export default {
</gl-alert>
<packages-settings
+ class="settings-section-no-bottom"
:package-settings="packageSettings"
:is-loading="isLoading"
@success="handleSuccess(2)"
diff --git a/app/assets/javascripts/packages_and_registries/settings/project/components/packages_cleanup_policy_form.vue b/app/assets/javascripts/packages_and_registries/settings/project/components/packages_cleanup_policy_form.vue
index 80df8ef81e6..e9b72651c67 100644
--- a/app/assets/javascripts/packages_and_registries/settings/project/components/packages_cleanup_policy_form.vue
+++ b/app/assets/javascripts/packages_and_registries/settings/project/components/packages_cleanup_policy_form.vue
@@ -147,7 +147,7 @@ export default {
<p v-if="value.nextRunAt" data-testid="next-run-at">
{{ nextCleanupMessage }}
</p>
- <div class="gl-mt-7 gl-display-flex gl-align-items-center">
+ <div class="gl-mt-6 gl-display-flex gl-align-items-center">
<gl-button
data-testid="save-button"
type="submit"
diff --git a/app/assets/javascripts/packages_and_registries/shared/components/settings_block.vue b/app/assets/javascripts/packages_and_registries/shared/components/settings_block.vue
index 7740924b058..1a63252a850 100644
--- a/app/assets/javascripts/packages_and_registries/shared/components/settings_block.vue
+++ b/app/assets/javascripts/packages_and_registries/shared/components/settings_block.vue
@@ -1,17 +1,15 @@
<template>
- <section class="settings gl-py-7">
- <div class="row">
- <div class="col-lg-4">
- <h4>
+ <section class="settings-section">
+ <div class="settings-sticky-header">
+ <div class="settings-sticky-header-inner">
+ <h4 class="gl-my-0">
<slot name="title"></slot>
</h4>
- <p>
- <slot name="description"></slot>
- </p>
- </div>
- <div class="col-lg-8 gl-pt-3">
- <slot></slot>
</div>
</div>
+ <p class="gl-text-secondary">
+ <slot name="description"></slot>
+ </p>
+ <slot></slot>
</section>
</template>
diff --git a/app/assets/javascripts/pages/groups/new/components/app.vue b/app/assets/javascripts/pages/groups/new/components/app.vue
index 3ee15077d00..876e85e4a47 100644
--- a/app/assets/javascripts/pages/groups/new/components/app.vue
+++ b/app/assets/javascripts/pages/groups/new/components/app.vue
@@ -1,6 +1,6 @@
<script>
-import importGroupIllustration from '@gitlab/svgs/dist/illustrations/group-import.svg?raw';
-import newGroupIllustration from '@gitlab/svgs/dist/illustrations/group-new.svg?raw';
+import GROUP_IMPORT_SVG_URL from '@gitlab/svgs/dist/illustrations/group-import.svg?url';
+import GROUP_NEW_SVG_URL from '@gitlab/svgs/dist/illustrations/group-new.svg?url';
import { s__ } from '~/locale';
import NewNamespacePage from '~/vue_shared/new_namespace/new_namespace_page.vue';
@@ -69,12 +69,12 @@ export default {
description: s__(
'GroupsNew|Assemble related projects together and grant members access to several projects at once.',
),
- illustration: newGroupIllustration,
details: createGroupDescriptionDetails,
detailProps: {
parentGroupName: this.parentGroupName,
importExistingGroupPath: this.importExistingGroupPath,
},
+ imageSrc: GROUP_NEW_SVG_URL,
},
{
name: 'import-group-pane',
@@ -83,8 +83,8 @@ export default {
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.',
+ imageSrc: GROUP_IMPORT_SVG_URL,
},
];
},
diff --git a/app/assets/javascripts/pages/organizations/organizations/groups_and_projects/index.js b/app/assets/javascripts/pages/organizations/organizations/groups_and_projects/index.js
new file mode 100644
index 00000000000..50afa5a75ae
--- /dev/null
+++ b/app/assets/javascripts/pages/organizations/organizations/groups_and_projects/index.js
@@ -0,0 +1,3 @@
+import { initOrganizationsGroupsAndProjects } from '~/organizations/groups_and_projects';
+
+initOrganizationsGroupsAndProjects();
diff --git a/app/assets/javascripts/pages/profiles/two_factor_auths/index.js b/app/assets/javascripts/pages/profiles/two_factor_auths/index.js
index ea6bca644ed..8fe822e4639 100644
--- a/app/assets/javascripts/pages/profiles/two_factor_auths/index.js
+++ b/app/assets/javascripts/pages/profiles/two_factor_auths/index.js
@@ -7,7 +7,9 @@ const twoFactorNode = document.querySelector('.js-two-factor-auth');
const skippable = twoFactorNode ? parseBoolean(twoFactorNode.dataset.twoFactorSkippable) : false;
if (skippable) {
- const button = `<br/><a class="btn gl-button btn-sm btn-confirm gl-mt-3" data-qa-selector="configure_it_later_button" data-method="patch" href="${twoFactorNode.dataset.two_factor_skip_url}">Configure it later</a>`;
+ const button = `<div class="gl-alert-actions">
+ <a class="btn gl-button btn-md btn-confirm gl-alert-action" data-qa-selector="configure_it_later_button" data-method="patch" href="${twoFactorNode.dataset.two_factor_skip_url}">Configure it later</a>
+ </div>`;
const flashAlert = document.querySelector('.flash-alert');
if (flashAlert) {
// eslint-disable-next-line no-unsanitized/method
@@ -17,7 +19,5 @@ if (skippable) {
mount2faRegistration();
initWebAuthnRegistration();
-
initRecoveryCodes();
-
initManageTwoFactorForm();
diff --git a/app/assets/javascripts/pages/projects/blob/show/index.js b/app/assets/javascripts/pages/projects/blob/show/index.js
index f8dcf1a5c9c..f5e09d972a9 100644
--- a/app/assets/javascripts/pages/projects/blob/show/index.js
+++ b/app/assets/javascripts/pages/projects/blob/show/index.js
@@ -2,6 +2,7 @@ import Vue from 'vue';
import Vuex from 'vuex';
import VueApollo from 'vue-apollo';
import VueRouter from 'vue-router';
+import { provideWebIdeLink } from 'ee_else_ce/pages/projects/shared/web_ide_link/provide_web_ide_link';
import TableOfContents from '~/blob/components/table_contents.vue';
import PipelineTourSuccessModal from '~/blob/pipeline_tour_success_modal.vue';
import { BlobViewer, initAuxiliaryViewer } from '~/blob/viewer/index';
@@ -10,7 +11,7 @@ import createDefaultClient from '~/lib/graphql';
import initBlob from '~/pages/projects/init_blob';
import ForkInfo from '~/repository/components/fork_info.vue';
import initWebIdeLink from '~/pages/projects/shared/web_ide_link';
-import CommitPipelineStatus from '~/projects/tree/components/commit_pipeline_status_component.vue';
+import CommitPipelineStatus from '~/projects/tree/components/commit_pipeline_status.vue';
import BlobContentViewer from '~/repository/components/blob_content_viewer.vue';
import '~/sourcegraph/load';
import createStore from '~/code_navigation/store';
@@ -18,6 +19,7 @@ import { generateRefDestinationPath } from '~/repository/utils/ref_switcher_util
import RefSelector from '~/ref/components/ref_selector.vue';
import { joinPaths, visitUrl } from '~/lib/utils/url_utility';
import { parseBoolean } from '~/lib/utils/common_utils';
+import HighlightWorker from '~/vue_shared/components/source_viewer/workers/highlight_worker?worker';
Vue.use(Vuex);
Vue.use(VueApollo);
@@ -69,6 +71,7 @@ if (viewBlobEl) {
resourceId,
userId,
explainCodeAvailable,
+ ...dataset
} = viewBlobEl.dataset;
// eslint-disable-next-line no-new
@@ -78,11 +81,13 @@ if (viewBlobEl) {
router,
apolloProvider,
provide: {
+ highlightWorker: gon.features.highlightJsWorker ? new HighlightWorker() : null,
targetBranch,
originalBranch,
resourceId,
userId,
explainCodeAvailable: parseBoolean(explainCodeAvailable),
+ ...provideWebIdeLink(dataset),
},
render(createElement) {
return createElement(BlobContentViewer, {
diff --git a/app/assets/javascripts/pages/projects/environments/metrics/index.js b/app/assets/javascripts/pages/projects/environments/metrics/index.js
deleted file mode 100644
index 606439866ea..00000000000
--- a/app/assets/javascripts/pages/projects/environments/metrics/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import monitoringApp from '~/monitoring/monitoring_app';
-
-monitoringApp();
diff --git a/app/assets/javascripts/pages/projects/forks/new/components/fork_form.vue b/app/assets/javascripts/pages/projects/forks/new/components/fork_form.vue
index 9f7a7b436df..9659c927fbf 100644
--- a/app/assets/javascripts/pages/projects/forks/new/components/fork_form.vue
+++ b/app/assets/javascripts/pages/projects/forks/new/components/fork_form.vue
@@ -262,7 +262,6 @@ export default {
try {
const { data } = await axios.post(url, postParams);
redirectTo(data.web_url); // eslint-disable-line import/no-deprecated
- return;
} catch (error) {
createAlert({
message: s__(
diff --git a/app/assets/javascripts/pages/projects/issues/new/index.js b/app/assets/javascripts/pages/projects/issues/new/index.js
index c5b63b74c35..2911069a967 100644
--- a/app/assets/javascripts/pages/projects/issues/new/index.js
+++ b/app/assets/javascripts/pages/projects/issues/new/index.js
@@ -1,5 +1,5 @@
import { initForm } from 'ee_else_ce/issues';
-import { mountMarkdownEditor } from '~/vue_shared/components/markdown/mount_markdown_editor';
+import { mountMarkdownEditor } from 'ee_else_ce/vue_shared/components/markdown/mount_markdown_editor';
import IssuableTemplateSelectors from '~/issuable/issuable_template_selectors';
initForm();
diff --git a/app/assets/javascripts/pages/projects/issues/service_desk/index.js b/app/assets/javascripts/pages/projects/issues/service_desk/index.js
index 7dd128fedb9..0844e322de2 100644
--- a/app/assets/javascripts/pages/projects/issues/service_desk/index.js
+++ b/app/assets/javascripts/pages/projects/issues/service_desk/index.js
@@ -1,3 +1,6 @@
import { initFilteredSearchServiceDesk } from '~/issues';
+import { mountServiceDeskListApp } from '~/service_desk';
initFilteredSearchServiceDesk();
+
+mountServiceDeskListApp();
diff --git a/app/assets/javascripts/pages/projects/merge_requests/creations/new/index.js b/app/assets/javascripts/pages/projects/merge_requests/creations/new/index.js
index 3d81e77f879..f71a1041068 100644
--- a/app/assets/javascripts/pages/projects/merge_requests/creations/new/index.js
+++ b/app/assets/javascripts/pages/projects/merge_requests/creations/new/index.js
@@ -1,9 +1,11 @@
import Vue from 'vue';
+
+import { mountMarkdownEditor } from 'ee_else_ce/vue_shared/components/markdown/mount_markdown_editor';
+
import initPipelines from '~/commit/pipelines/pipelines_bundle';
import MergeRequest from '~/merge_request';
import CompareApp from '~/merge_requests/components/compare_app.vue';
import { __ } from '~/locale';
-import { mountMarkdownEditor } from '~/vue_shared/components/markdown/mount_markdown_editor';
import IssuableTemplateSelectors from '~/issuable/issuable_template_selectors';
const mrNewCompareNode = document.querySelector('.js-merge-request-new-compare');
diff --git a/app/assets/javascripts/pages/projects/merge_requests/diffs/index.js b/app/assets/javascripts/pages/projects/merge_requests/diffs/index.js
index 77294c0fb9e..b15e9a14b6a 100644
--- a/app/assets/javascripts/pages/projects/merge_requests/diffs/index.js
+++ b/app/assets/javascripts/pages/projects/merge_requests/diffs/index.js
@@ -1,5 +1,5 @@
import initDiffsApp from '~/diffs';
-import { initMrPage } from '../page';
+import { initMrPage } from 'ee_else_ce/pages/projects/merge_requests/page';
initMrPage();
initDiffsApp();
diff --git a/app/assets/javascripts/pages/projects/merge_requests/edit/index.js b/app/assets/javascripts/pages/projects/merge_requests/edit/index.js
index 6127adc3584..79d771ab993 100644
--- a/app/assets/javascripts/pages/projects/merge_requests/edit/index.js
+++ b/app/assets/javascripts/pages/projects/merge_requests/edit/index.js
@@ -1,7 +1,8 @@
+import { mountMarkdownEditor } from 'ee_else_ce/vue_shared/components/markdown/mount_markdown_editor';
+
import { createAlert } from '~/alert';
import axios from '~/lib/utils/axios_utils';
import { __ } from '~/locale';
-import { mountMarkdownEditor } from '~/vue_shared/components/markdown/mount_markdown_editor';
import { GitLabDropdown } from '~/deprecated_jquery_dropdown/gl_dropdown';
import initMergeRequest from '~/pages/projects/merge_requests/init_merge_request';
diff --git a/app/assets/javascripts/pages/projects/merge_requests/page.js b/app/assets/javascripts/pages/projects/merge_requests/page.js
index 552e75da9b8..75e308e706f 100644
--- a/app/assets/javascripts/pages/projects/merge_requests/page.js
+++ b/app/assets/javascripts/pages/projects/merge_requests/page.js
@@ -9,6 +9,7 @@ import store from '~/mr_notes/stores';
import initSidebarBundle from '~/sidebar/sidebar_bundle';
import { apolloProvider } from '~/graphql_shared/issuable_client';
import { parseBoolean } from '~/lib/utils/common_utils';
+import { initMrMoreDropdown } from '~/mr_more_dropdown';
import initShow from './init_merge_request_show';
import getStateQuery from './queries/get_state.query.graphql';
@@ -17,6 +18,7 @@ Vue.use(VueApollo);
export function initMrPage() {
initMrNotes();
initShow();
+ initMrMoreDropdown();
startCodeReviewMessaging({ signalBus: diffsEventHub });
}
diff --git a/app/assets/javascripts/pages/projects/merge_requests/show/index.js b/app/assets/javascripts/pages/projects/merge_requests/show/index.js
index 67dc3782a24..9eaf490abb2 100644
--- a/app/assets/javascripts/pages/projects/merge_requests/show/index.js
+++ b/app/assets/javascripts/pages/projects/merge_requests/show/index.js
@@ -1,9 +1,5 @@
import mountNotesApp from 'ee_else_ce/mr_notes/mount_app';
-import { initReportAbuse } from '~/projects/report_abuse';
-import { initMrMoreDropdown } from '~/mr_more_dropdown';
-import { initMrPage } from '../page';
+import { initMrPage } from 'ee_else_ce/pages/projects/merge_requests/page';
initMrPage();
mountNotesApp();
-initReportAbuse();
-initMrMoreDropdown();
diff --git a/app/assets/javascripts/pages/projects/metrics_dashboard/index.js b/app/assets/javascripts/pages/projects/metrics_dashboard/index.js
deleted file mode 100644
index 606439866ea..00000000000
--- a/app/assets/javascripts/pages/projects/metrics_dashboard/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import monitoringApp from '~/monitoring/monitoring_app';
-
-monitoringApp();
diff --git a/app/assets/javascripts/pages/projects/ml/models/index/index.js b/app/assets/javascripts/pages/projects/ml/models/index/index.js
new file mode 100644
index 00000000000..62d326f43a5
--- /dev/null
+++ b/app/assets/javascripts/pages/projects/ml/models/index/index.js
@@ -0,0 +1,4 @@
+import { initSimpleApp } from '~/helpers/init_simple_app_helper';
+import MlModelsIndex from '~/ml/model_registry/routes/models/index';
+
+initSimpleApp('#js-index-ml-models', MlModelsIndex);
diff --git a/app/assets/javascripts/pages/projects/pipeline_schedules/edit/index.js b/app/assets/javascripts/pages/projects/pipeline_schedules/edit/index.js
index e2a782bc5d8..a51c2e9c47b 100644
--- a/app/assets/javascripts/pages/projects/pipeline_schedules/edit/index.js
+++ b/app/assets/javascripts/pages/projects/pipeline_schedules/edit/index.js
@@ -2,7 +2,7 @@ import initPipelineSchedulesFormApp from '~/ci/pipeline_schedules/mount_pipeline
import initForm from '../shared/init_form';
if (gon.features?.pipelineSchedulesVue) {
- initPipelineSchedulesFormApp('#pipeline-schedules-form-edit');
+ initPipelineSchedulesFormApp('#pipeline-schedules-form-edit', true);
} else {
initForm();
}
diff --git a/app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/interval_pattern_input.vue b/app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/interval_pattern_input.vue
index eab4be4dcf1..a79f20d596c 100644
--- a/app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/interval_pattern_input.vue
+++ b/app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/interval_pattern_input.vue
@@ -10,6 +10,7 @@ import {
import { getWeekdayNames } from '~/lib/utils/datetime_utility';
import { __, s__, sprintf } from '~/locale';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import { DOCS_URL_IN_EE_DIR } from 'jh_else_ce/lib/utils/url_utility';
const KEY_EVERY_DAY = 'everyDay';
const KEY_EVERY_WEEK = 'everyWeek';
@@ -54,7 +55,7 @@ export default {
inputNameAttribute: 'schedule[cron]',
radioValue: this.initialCronInterval ? KEY_CUSTOM : KEY_EVERY_DAY,
cronInterval: this.initialCronInterval,
- cronSyntaxUrl: 'https://docs.gitlab.com/ee/topics/cron/',
+ cronSyntaxUrl: `${DOCS_URL_IN_EE_DIR}/topics/cron/`,
};
},
computed: {
@@ -116,7 +117,7 @@ export default {
},
},
watch: {
- cronInterval() {
+ cronInterval(val) {
// updates field validation state when model changes, as
// glFieldError only updates on input.
if (this.sendNativeErrors) {
@@ -124,6 +125,8 @@ export default {
gl.pipelineScheduleFieldErrors.updateFormValidityState();
});
}
+
+ this.$emit('cronValue', val);
},
radioValue: {
immediate: true,
diff --git a/app/assets/javascripts/pages/projects/pipelines/show/index.js b/app/assets/javascripts/pages/projects/pipelines/show/index.js
index 44a384f03c6..d3f46b7e025 100644
--- a/app/assets/javascripts/pages/projects/pipelines/show/index.js
+++ b/app/assets/javascripts/pages/projects/pipelines/show/index.js
@@ -2,4 +2,4 @@ import initPipelineDetails from '~/pipelines/pipeline_details_bundle';
import initPipelines from '../init_pipelines';
initPipelines();
-initPipelineDetails(gon.features.pipelineDetailsHeaderVue);
+initPipelineDetails();
diff --git a/app/assets/javascripts/pages/projects/shared/web_ide_link/index.js b/app/assets/javascripts/pages/projects/shared/web_ide_link/index.js
index ce36ff6a230..8ceea37b701 100644
--- a/app/assets/javascripts/pages/projects/shared/web_ide_link/index.js
+++ b/app/assets/javascripts/pages/projects/shared/web_ide_link/index.js
@@ -1,8 +1,9 @@
import Vue from 'vue';
import VueApollo from 'vue-apollo';
+import { provideWebIdeLink } from 'ee_else_ce/pages/projects/shared/web_ide_link/provide_web_ide_link';
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
import { joinPaths, webIDEUrl } from '~/lib/utils/url_utility';
-import WebIdeButton from '~/vue_shared/components/web_ide_link.vue';
+import WebIdeButton from 'ee_else_ce/vue_shared/components/web_ide_link.vue';
import createDefaultClient from '~/lib/graphql';
Vue.use(VueApollo);
@@ -26,6 +27,7 @@ export default ({ el, router }) => {
apolloProvider,
provide: {
projectPath,
+ ...provideWebIdeLink(options),
},
render(h) {
return h(WebIdeButton, {
@@ -37,6 +39,7 @@ export default ({ el, router }) => {
: webIDEUrl(
joinPaths('/', projectPath, 'edit', ref, '-', this.$route?.params.path || '', '/'),
),
+ projectPath,
...options,
},
});
diff --git a/app/assets/javascripts/pages/projects/shared/web_ide_link/provide_web_ide_link.js b/app/assets/javascripts/pages/projects/shared/web_ide_link/provide_web_ide_link.js
new file mode 100644
index 00000000000..7c64bb6572e
--- /dev/null
+++ b/app/assets/javascripts/pages/projects/shared/web_ide_link/provide_web_ide_link.js
@@ -0,0 +1,9 @@
+/**
+ * Inspects an object and extracts properties
+ * that are relevant to the web_ide_link.vue
+ * component.
+ *
+ * @returns An object with properties that are
+ * relevant to the web_ide_link.vue component. See EE version.
+ */
+export const provideWebIdeLink = () => ({});
diff --git a/app/assets/javascripts/pages/projects/tracing/index/index.js b/app/assets/javascripts/pages/projects/tracing/index/index.js
new file mode 100644
index 00000000000..64ca303f8ba
--- /dev/null
+++ b/app/assets/javascripts/pages/projects/tracing/index/index.js
@@ -0,0 +1,4 @@
+import { initSimpleApp } from '~/helpers/init_simple_app_helper';
+import ListIndex from '~/tracing/list_index.vue';
+
+initSimpleApp('#js-tracing', ListIndex);
diff --git a/app/assets/javascripts/pages/shared/wikis/components/wiki_form.vue b/app/assets/javascripts/pages/shared/wikis/components/wiki_form.vue
index 4f68c7984e8..5bc630c61cb 100644
--- a/app/assets/javascripts/pages/shared/wikis/components/wiki_form.vue
+++ b/app/assets/javascripts/pages/shared/wikis/components/wiki_form.vue
@@ -15,8 +15,8 @@ import { setUrlFragment } from '~/lib/utils/url_utility';
import { s__, sprintf } from '~/locale';
import Tracking from '~/tracking';
import MarkdownEditor from '~/vue_shared/components/markdown/markdown_editor.vue';
+import { trackSavedUsingEditor } from '~/vue_shared/components/markdown/tracking';
import {
- SAVED_USING_CONTENT_EDITOR_ACTION,
WIKI_CONTENT_EDITOR_TRACKING_LABEL,
WIKI_FORMAT_LABEL,
WIKI_FORMAT_UPDATED_ACTION,
@@ -257,9 +257,8 @@ export default {
},
trackFormSubmit() {
- if (this.isContentEditorActive) {
- this.track(SAVED_USING_CONTENT_EDITOR_ACTION);
- }
+ // eslint-disable-next-line @gitlab/require-i18n-strings
+ trackSavedUsingEditor(this.isContentEditorActive, 'Wiki');
},
trackWikiFormat() {
diff --git a/app/assets/javascripts/pages/shared/wikis/constants.js b/app/assets/javascripts/pages/shared/wikis/constants.js
index 94d086158f1..3e685292971 100644
--- a/app/assets/javascripts/pages/shared/wikis/constants.js
+++ b/app/assets/javascripts/pages/shared/wikis/constants.js
@@ -1,5 +1,4 @@
export const CONTENT_EDITOR_LOADED_ACTION = 'content_editor_loaded';
-export const SAVED_USING_CONTENT_EDITOR_ACTION = 'saved_using_content_editor';
export const WIKI_CONTENT_EDITOR_TRACKING_LABEL = 'wiki_content_editor';
export const WIKI_FORMAT_LABEL = 'wiki_format';
export const WIKI_FORMAT_UPDATED_ACTION = 'wiki_format_updated';
diff --git a/app/assets/javascripts/pages/shared/wikis/edit.js b/app/assets/javascripts/pages/shared/wikis/edit.js
index 0044575de62..a0a7cc0b07a 100644
--- a/app/assets/javascripts/pages/shared/wikis/edit.js
+++ b/app/assets/javascripts/pages/shared/wikis/edit.js
@@ -1,5 +1,7 @@
import $ from 'jquery';
import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import createApolloClient from '~/lib/graphql';
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
import csrf from '~/lib/utils/csrf';
import Translate from '~/vue_shared/translate';
@@ -64,9 +66,14 @@ const createWikiFormApp = () => {
if (el) {
const { pageInfo, formatOptions } = el.dataset;
+ Vue.use(VueApollo);
+
+ const apolloProvider = new VueApollo({ defaultClient: createApolloClient() });
+
// eslint-disable-next-line no-new
new Vue({
el,
+ apolloProvider,
provide: {
formatOptions: JSON.parse(formatOptions),
pageInfo: convertObjectPropsToCamelCase(JSON.parse(pageInfo)),
diff --git a/app/assets/javascripts/pages/users/show/index.js b/app/assets/javascripts/pages/users/show/index.js
index 47424ec1dd3..7d612d6cc4e 100644
--- a/app/assets/javascripts/pages/users/show/index.js
+++ b/app/assets/javascripts/pages/users/show/index.js
@@ -1,3 +1,5 @@
import { initUserAchievements } from '~/profile';
+import { initUserActionsApp } from '~/users/profile/actions';
initUserAchievements();
+initUserActionsApp();
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 83cd64c17ed..b2cef7c37b9 100644
--- a/app/assets/javascripts/pipelines/components/graph/graph_component_wrapper.vue
+++ b/app/assets/javascripts/pipelines/components/graph/graph_component_wrapper.vue
@@ -1,8 +1,8 @@
<script>
-import { GlAlert, GlLoadingIcon } from '@gitlab/ui';
+import { GlAlert, GlLoadingIcon, GlSprintf } from '@gitlab/ui';
import getPipelineDetails from 'shared_queries/pipelines/get_pipeline_details.query.graphql';
import getUserCallouts from '~/graphql_shared/queries/get_user_callouts.query.graphql';
-import { __ } from '~/locale';
+import { __, s__ } from '~/locale';
import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
import { DEFAULT, DRAW_FAILURE, LOAD_FAILURE } from '../../constants';
import DismissPipelineGraphCallout from '../../graphql/mutations/dismiss_pipeline_notification.graphql';
@@ -34,6 +34,7 @@ export default {
components: {
GlAlert,
GlLoadingIcon,
+ GlSprintf,
GraphViewSelector,
LocalStorageSync,
PipelineGraph,
@@ -62,6 +63,7 @@ export default {
pipeline: null,
skipRetryModal: false,
showAlert: false,
+ showJobCountWarning: false,
showLinks: false,
};
},
@@ -104,7 +106,7 @@ export default {
},
headerPipeline: {
query: getPipelineQuery,
- // this query is already being called in header_component.vue, which shares the same cache as this component
+ // this query is already being called in pipeline_details_header.vue, which shares the same cache as this component
// the skip here is to prevent sending double network requests on page load
skip() {
return !this.canRefetchHeaderPipeline;
@@ -166,7 +168,12 @@ export default {
},
);
},
- result({ error }) {
+ result({ data, error }) {
+ const stages = data?.project?.pipeline?.stages?.nodes || [];
+
+ this.showJobCountWarning = stages.some((stage) => {
+ return stage.groups.nodes.length >= 100;
+ });
/*
If there is a successful load after a failure, clear
the failure notification to avoid confusion.
@@ -273,14 +280,38 @@ export default {
this.currentViewType = type;
},
},
+ i18n: {
+ jobLimitWarning: {
+ title: s__('Pipeline|Only the first 100 jobs per stage are displayed'),
+ desc: s__('Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab.'),
+ },
+ },
viewTypeKey: VIEW_TYPE_KEY,
};
</script>
<template>
<div>
- <gl-alert v-if="showAlert" :variant="alert.variant" @dismiss="hideAlert">
+ <gl-alert
+ v-if="showAlert"
+ :variant="alert.variant"
+ data-testid="error-alert"
+ @dismiss="hideAlert"
+ >
{{ alert.text }}
</gl-alert>
+ <gl-alert
+ v-if="showJobCountWarning"
+ variant="warning"
+ :dismissible="false"
+ :title="$options.i18n.jobLimitWarning.title"
+ data-testid="job-count-warning"
+ >
+ <gl-sprintf :message="$options.i18n.jobLimitWarning.desc">
+ <template #bold="{ content }">
+ <b>{{ content }}</b>
+ </template>
+ </gl-sprintf>
+ </gl-alert>
<local-storage-sync
:storage-key="$options.viewTypeKey"
:value="currentViewType"
diff --git a/app/assets/javascripts/pipelines/components/graph/linked_pipeline.vue b/app/assets/javascripts/pipelines/components/graph/linked_pipeline.vue
index 9b4e5d471d6..d8b843bdfb0 100644
--- a/app/assets/javascripts/pipelines/components/graph/linked_pipeline.vue
+++ b/app/assets/javascripts/pipelines/components/graph/linked_pipeline.vue
@@ -13,7 +13,7 @@ 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 CiIcon from '~/vue_shared/components/ci_icon.vue';
import { reportToSentry } from '../../utils';
import { ACTION_FAILURE, DOWNSTREAM, UPSTREAM } from './constants';
@@ -22,7 +22,7 @@ export default {
GlTooltip: GlTooltipDirective,
},
components: {
- CiStatus,
+ CiIcon,
GlBadge,
GlButton,
GlLink,
@@ -240,7 +240,7 @@ export default {
</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="" />
+ <ci-icon v-if="!pipelineIsLoading" :status="pipelineStatus" :size="24" />
<div v-else class="gl-pr-3"><gl-loading-icon size="sm" inline /></div>
<div
class="gl-display-flex gl-downstream-pipeline-job-width gl-flex-direction-column gl-line-height-normal"
diff --git a/app/assets/javascripts/pipelines/components/header_component.vue b/app/assets/javascripts/pipelines/components/header_component.vue
deleted file mode 100644
index 27119419060..00000000000
--- a/app/assets/javascripts/pipelines/components/header_component.vue
+++ /dev/null
@@ -1,320 +0,0 @@
-<script>
-import {
- GlAlert,
- GlButton,
- GlLoadingIcon,
- GlModal,
- GlModalDirective,
- GlTooltipDirective,
-} from '@gitlab/ui';
-import { setUrlFragment, redirectTo } from '~/lib/utils/url_utility'; // eslint-disable-line import/no-deprecated
-import { __ } from '~/locale';
-import CiHeader from '~/vue_shared/components/header_ci_component.vue';
-import {
- LOAD_FAILURE,
- POST_FAILURE,
- DELETE_FAILURE,
- DEFAULT,
- BUTTON_TOOLTIP_RETRY,
- BUTTON_TOOLTIP_CANCEL,
-} from '../constants';
-import cancelPipelineMutation from '../graphql/mutations/cancel_pipeline.mutation.graphql';
-import deletePipelineMutation from '../graphql/mutations/delete_pipeline.mutation.graphql';
-import retryPipelineMutation from '../graphql/mutations/retry_pipeline.mutation.graphql';
-import getPipelineQuery from '../graphql/queries/get_pipeline_header_data.query.graphql';
-import { getQueryHeaders } from './graph/utils';
-
-const DELETE_MODAL_ID = 'pipeline-delete-modal';
-const POLL_INTERVAL = 10000;
-
-export default {
- name: 'PipelineHeaderSection',
- BUTTON_TOOLTIP_RETRY,
- BUTTON_TOOLTIP_CANCEL,
- pipelineCancel: 'pipelineCancel',
- pipelineRetry: 'pipelineRetry',
- finishedStatuses: ['FAILED', 'SUCCESS', 'CANCELED'],
- components: {
- CiHeader,
- GlAlert,
- GlButton,
- GlLoadingIcon,
- GlModal,
- },
- directives: {
- GlModal: GlModalDirective,
- GlTooltip: GlTooltipDirective,
- },
- errorTexts: {
- [LOAD_FAILURE]: __('We are currently unable to fetch data for the pipeline header.'),
- [POST_FAILURE]: __('An error occurred while making the request.'),
- [DELETE_FAILURE]: __('An error occurred while deleting the pipeline.'),
- [DEFAULT]: __('An unknown error occurred.'),
- },
- inject: {
- graphqlResourceEtag: {
- default: '',
- },
- paths: {
- default: {},
- },
- pipelineId: {
- default: '',
- },
- pipelineIid: {
- default: '',
- },
- },
- modal: {
- id: DELETE_MODAL_ID,
- actionPrimary: {
- text: __('Delete pipeline'),
- attributes: {
- variant: 'danger',
- },
- },
- actionCancel: {
- text: __('Cancel'),
- },
- },
- apollo: {
- pipeline: {
- context() {
- return getQueryHeaders(this.graphqlResourceEtag);
- },
- query: getPipelineQuery,
- variables() {
- return {
- fullPath: this.paths.fullProject,
- iid: this.pipelineIid,
- };
- },
- update: (data) => data.project.pipeline,
- error() {
- this.reportFailure(LOAD_FAILURE);
- },
- pollInterval: POLL_INTERVAL,
- watchLoading(isLoading) {
- if (!isLoading) {
- // To ensure apollo has updated the cache,
- // we only remove the loading state in sync with GraphQL
- this.isCanceling = false;
- this.isRetrying = false;
- }
- },
- },
- },
- data() {
- return {
- pipeline: null,
- failureMessages: [],
- failureType: null,
- isCanceling: false,
- isRetrying: false,
- isDeleting: false,
- };
- },
- computed: {
- deleteModalConfirmationText() {
- return __(
- 'Are you sure you want to delete this pipeline? Doing so will expire all pipeline caches and delete all related objects, such as builds, logs, artifacts, and triggers. This action cannot be undone.',
- );
- },
- hasError() {
- return this.failureType;
- },
- hasPipelineData() {
- return Boolean(this.pipeline);
- },
- isLoadingInitialQuery() {
- return this.$apollo.queries.pipeline.loading && !this.hasPipelineData;
- },
- status() {
- return this.pipeline?.status;
- },
- isFinished() {
- return this.$options.finishedStatuses.includes(this.status);
- },
- shouldRenderContent() {
- return !this.isLoadingInitialQuery && this.hasPipelineData;
- },
- failure() {
- switch (this.failureType) {
- case LOAD_FAILURE:
- return {
- text: this.$options.errorTexts[LOAD_FAILURE],
- variant: 'danger',
- };
- case POST_FAILURE:
- return {
- text: this.$options.errorTexts[POST_FAILURE],
- variant: 'danger',
- };
- case DELETE_FAILURE:
- return {
- text: this.$options.errorTexts[DELETE_FAILURE],
- variant: 'danger',
- };
- default:
- return {
- text: this.$options.errorTexts[DEFAULT],
- variant: 'danger',
- };
- }
- },
- canRetryPipeline() {
- const { retryable, userPermissions } = this.pipeline;
-
- return retryable && userPermissions.updatePipeline;
- },
- canCancelPipeline() {
- const { cancelable, userPermissions } = this.pipeline;
-
- return cancelable && userPermissions.updatePipeline;
- },
- },
- methods: {
- reportFailure(errorType, errorMessages = []) {
- this.failureType = errorType;
- this.failureMessages = errorMessages;
- },
- async postPipelineAction(name, mutation) {
- try {
- const {
- data: {
- [name]: { errors },
- },
- } = await this.$apollo.mutate({
- mutation,
- variables: { id: this.pipeline.id },
- });
-
- if (errors.length > 0) {
- this.isRetrying = false;
-
- this.reportFailure(POST_FAILURE, errors);
- } else {
- await this.$apollo.queries.pipeline.refetch();
- if (!this.isFinished) {
- this.$apollo.queries.pipeline.startPolling(POLL_INTERVAL);
- }
- }
- } catch {
- this.isRetrying = false;
-
- this.reportFailure(POST_FAILURE);
- }
- },
- cancelPipeline() {
- this.isCanceling = true;
- this.postPipelineAction(this.$options.pipelineCancel, cancelPipelineMutation);
- },
- retryPipeline() {
- this.isRetrying = true;
- this.postPipelineAction(this.$options.pipelineRetry, retryPipelineMutation);
- },
- async deletePipeline() {
- this.isDeleting = true;
- this.$apollo.queries.pipeline.stopPolling();
-
- try {
- const {
- data: {
- pipelineDestroy: { errors },
- },
- } = await this.$apollo.mutate({
- mutation: deletePipelineMutation,
- variables: {
- id: this.pipeline.id,
- },
- });
-
- if (errors.length > 0) {
- this.reportFailure(DELETE_FAILURE, errors);
- this.isDeleting = false;
- } else {
- redirectTo(setUrlFragment(this.paths.pipelinesPath, 'delete_success')); // eslint-disable-line import/no-deprecated
- }
- } catch {
- this.$apollo.queries.pipeline.startPolling(POLL_INTERVAL);
- this.reportFailure(DELETE_FAILURE);
- this.isDeleting = false;
- }
- },
- },
- DELETE_MODAL_ID,
-};
-</script>
-<template>
- <div class="js-pipeline-header-container">
- <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"
- :time="pipeline.createdAt"
- :user="pipeline.user"
- :item-id="pipelineId"
- item-name="Pipeline"
- >
- <gl-button
- v-if="canRetryPipeline"
- v-gl-tooltip
- :aria-label="$options.BUTTON_TOOLTIP_RETRY"
- :title="$options.BUTTON_TOOLTIP_RETRY"
- :loading="isRetrying"
- :disabled="isRetrying"
- variant="confirm"
- data-testid="retryPipeline"
- class="js-retry-button"
- @click="retryPipeline()"
- >
- {{ __('Retry') }}
- </gl-button>
-
- <gl-button
- v-if="canCancelPipeline"
- v-gl-tooltip
- :aria-label="$options.BUTTON_TOOLTIP_CANCEL"
- :title="$options.BUTTON_TOOLTIP_CANCEL"
- :loading="isCanceling"
- :disabled="isCanceling"
- class="gl-ml-3"
- variant="danger"
- data-testid="cancelPipeline"
- @click="cancelPipeline()"
- >
- {{ __('Cancel pipeline') }}
- </gl-button>
-
- <gl-button
- v-if="pipeline.userPermissions.destroyPipeline"
- v-gl-modal="$options.modal.id"
- :loading="isDeleting"
- :disabled="isDeleting"
- class="gl-ml-3"
- variant="danger"
- category="secondary"
- data-testid="deletePipeline"
- >
- {{ __('Delete') }}
- </gl-button>
- </ci-header>
- <gl-loading-icon v-if="isLoadingInitialQuery" size="lg" class="gl-mt-3 gl-mb-3" />
-
- <gl-modal
- :modal-id="$options.modal.id"
- :title="__('Delete pipeline')"
- :action-primary="$options.modal.actionPrimary"
- :action-cancel="$options.modal.actionCancel"
- @primary="deletePipeline()"
- >
- <p>
- {{ deleteModalConfirmationText }}
- </p>
- </gl-modal>
- </div>
-</template>
diff --git a/app/assets/javascripts/pipelines/components/pipeline_details_header.vue b/app/assets/javascripts/pipelines/components/pipeline_details_header.vue
index 8fe6707028a..c53321f82bd 100644
--- a/app/assets/javascripts/pipelines/components/pipeline_details_header.vue
+++ b/app/assets/javascripts/pipelines/components/pipeline_details_header.vue
@@ -17,6 +17,7 @@ import { __, s__, sprintf, formatNumber } from '~/locale';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
import CiBadgeLink from '~/vue_shared/components/ci_badge_link.vue';
+import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
import SafeHtml from '~/vue_shared/directives/safe_html';
import {
LOAD_FAILURE,
@@ -30,7 +31,6 @@ import cancelPipelineMutation from '../graphql/mutations/cancel_pipeline.mutatio
import deletePipelineMutation from '../graphql/mutations/delete_pipeline.mutation.graphql';
import retryPipelineMutation from '../graphql/mutations/retry_pipeline.mutation.graphql';
import getPipelineQuery from '../graphql/queries/get_pipeline_header_data.query.graphql';
-import TimeAgo from './pipelines_list/time_ago.vue';
import { getQueryHeaders } from './graph/utils';
const DELETE_MODAL_ID = 'pipeline-delete-modal';
@@ -54,7 +54,7 @@ export default {
GlLoadingIcon,
GlModal,
GlSprintf,
- TimeAgo,
+ TimeAgoTooltip,
},
directives: {
GlModal: GlModalDirective,
@@ -84,12 +84,14 @@ export default {
),
stuckBadgeText: s__('Pipelines|stuck'),
stuckBadgeTooltip: s__('Pipelines|This pipeline is stuck'),
- computeCreditsTooltip: s__('Pipelines|Total amount of compute credits used for the pipeline'),
+ computeMinutesTooltip: s__('Pipelines|Total amount of compute minutes used for the pipeline'),
totalJobsTooltip: s__('Pipelines|Total number of jobs for the pipeline'),
retryPipelineText: __('Retry'),
cancelPipelineText: __('Cancel pipeline'),
deletePipelineText: __('Delete'),
clipboardTooltip: __('Copy commit SHA'),
+ createdText: s__('Pipelines|created'),
+ finishedText: s__('Pipelines|finished'),
},
errorTexts: {
[LOAD_FAILURE]: __('We are currently unable to fetch data for the pipeline header.'),
@@ -135,7 +137,7 @@ export default {
required: false,
default: '',
},
- computeCredits: {
+ computeMinutes: {
type: String,
required: false,
default: '',
@@ -310,8 +312,8 @@ export default {
return cancelable && userPermissions.updatePipeline;
},
- showComputeCredits() {
- return this.isFinished && this.computeCredits !== '0.0';
+ showComputeMinutes() {
+ return this.isFinished && this.computeMinutes !== '0.0';
},
},
methods: {
@@ -387,7 +389,7 @@ export default {
</script>
<template>
- <div class="gl-my-4">
+ <div class="gl-my-4" data-testid="pipeline-details-header">
<gl-alert
v-if="hasError"
class="gl-mb-4"
@@ -402,17 +404,17 @@ export default {
<gl-loading-icon v-if="loading" class="gl-text-left" size="lg" />
<div
v-else
- class="gl-display-flex gl-justify-content-space-between"
+ class="gl-display-flex gl-justify-content-space-between gl-flex-wrap"
data-qa-selector="pipeline_details_header"
>
<div>
- <h3 v-if="name" class="gl-mt-0 gl-mb-2" data-testid="pipeline-name">{{ name }}</h3>
- <h3 v-else class="gl-mt-0 gl-mb-2" data-testid="pipeline-commit-title">
+ <h3 v-if="name" class="gl-mt-0 gl-mb-3" data-testid="pipeline-name">{{ name }}</h3>
+ <h3 v-else class="gl-mt-0 gl-mb-3" data-testid="pipeline-commit-title">
{{ commitTitle }}
</h3>
<div>
<ci-badge-link :status="detailedStatus" />
- <div class="gl-ml-2 gl-mb-2 gl-display-inline-block gl-h-6">
+ <div class="gl-ml-2 gl-mb-3 gl-display-inline-block gl-h-6">
<gl-link
v-if="user"
:href="user.webUrl"
@@ -441,16 +443,17 @@ export default {
:title="$options.i18n.clipboardTooltip"
size="small"
/>
- <time-ago
- v-if="isFinished"
- :pipeline="pipeline"
- class="gl-display-inline gl-mb-0"
- :display-calendar-icon="false"
- font-size="gl-font-md"
- />
+ <span v-if="inProgress" data-testid="pipeline-created-time-ago">
+ {{ $options.i18n.createdText }}
+ <time-ago-tooltip :time="pipeline.createdAt" />
+ </span>
+ <span v-if="isFinished" data-testid="pipeline-finished-time-ago">
+ {{ $options.i18n.finishedText }}
+ <time-ago-tooltip :time="pipeline.finishedAt" />
+ </span>
</div>
</div>
- <div v-safe-html="refText" class="gl-mb-2" data-testid="pipeline-ref-text"></div>
+ <div v-safe-html="refText" class="gl-mb-3" data-testid="pipeline-ref-text"></div>
<div>
<gl-badge
v-if="badges.schedule"
@@ -527,7 +530,6 @@ export default {
:title="$options.i18n.detachedBadgeTooltip"
variant="info"
size="sm"
- data-qa-selector="merge_request_badge_tag"
>
{{ $options.i18n.detachedBadgeText }}
</gl-badge>
@@ -550,14 +552,14 @@ export default {
{{ totalJobsText }}
</span>
<span
- v-if="showComputeCredits"
+ v-if="showComputeMinutes"
v-gl-tooltip
- :title="$options.i18n.computeCreditsTooltip"
+ :title="$options.i18n.computeMinutesTooltip"
class="gl-ml-2"
- data-testid="compute-credits"
+ data-testid="compute-minutes"
>
<gl-icon name="quota" />
- {{ computeCredits }}
+ {{ computeMinutes }}
</span>
<span v-if="inProgress" class="gl-ml-2" data-testid="pipeline-running-text">
<gl-icon name="timer" />
@@ -569,7 +571,7 @@ export default {
</span>
</div>
</div>
- <div>
+ <div class="gl-mt-5 gl-lg-mt-0">
<gl-button
v-if="canRetryPipeline"
v-gl-tooltip
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
index 8ff311e90e7..5208f9a3ce7 100644
--- 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
@@ -2,7 +2,7 @@
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 { mergeUrlParams, DOCS_URL } 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';
@@ -31,7 +31,7 @@ export default {
apolloProvider,
iOSTemplateName: 'iOS-Fastlane',
modalId: 'runner-instructions-modal',
- runnerDocsLink: 'https://docs.gitlab.com/runner/install/osx',
+ runnerDocsLink: `${DOCS_URL}/runner/install/osx`,
whatElseLink: helpPagePath('ci/index.md'),
i18n: {
title: s__('Pipelines|Get started with GitLab CI/CD'),
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/failure_widget/failed_job_details.vue b/app/assets/javascripts/pipelines/components/pipelines_list/failure_widget/failed_job_details.vue
new file mode 100644
index 00000000000..6b5e3d77b92
--- /dev/null
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/failure_widget/failed_job_details.vue
@@ -0,0 +1,164 @@
+<script>
+import { GlButton, GlCollapse, GlIcon, GlLink, GlTooltip } from '@gitlab/ui';
+import { createAlert } from '~/alert';
+import { __, s__, sprintf } from '~/locale';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
+import CiIcon from '~/vue_shared/components/ci_icon.vue';
+import SafeHtml from '~/vue_shared/directives/safe_html';
+import RetryMrFailedJobMutation from '../../../graphql/mutations/retry_mr_failed_job.mutation.graphql';
+
+export default {
+ components: {
+ CiIcon,
+ GlButton,
+ GlCollapse,
+ GlIcon,
+ GlLink,
+ GlTooltip,
+ },
+ directives: {
+ SafeHtml,
+ },
+ props: {
+ job: {
+ type: Object,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ isHovered: false,
+ isJobLogVisible: false,
+ isLoadingAction: false,
+ };
+ },
+ computed: {
+ activeClass() {
+ return this.isHovered ? 'gl-bg-gray-50' : '';
+ },
+ canReadBuild() {
+ return this.job.userPermissions.readBuild;
+ },
+ canRetryJob() {
+ return this.job.retryable && this.job.userPermissions.updateBuild;
+ },
+ isVisibleId() {
+ return `log-${this.isJobLogVisible ? 'is-visible' : 'is-hidden'}`;
+ },
+ jobChevronName() {
+ return this.isJobLogVisible ? 'chevron-down' : 'chevron-right';
+ },
+ jobTrace() {
+ if (this.canReadBuild) {
+ return this.job?.trace?.htmlSummary || this.$options.i18n.noTraceText;
+ }
+
+ return this.$options.i18n.cannotReadBuild;
+ },
+ parsedJobId() {
+ return getIdFromGraphQLId(this.job.id);
+ },
+ tooltipText() {
+ return sprintf(this.$options.i18n.jobActionTooltipText, { jobName: this.job.name });
+ },
+ },
+ methods: {
+ setActiveRow() {
+ this.isHovered = true;
+ },
+ resetActiveRow() {
+ this.isHovered = false;
+ },
+ async retryJob() {
+ try {
+ this.isLoadingAction = true;
+
+ const {
+ data: {
+ jobRetry: { errors },
+ },
+ } = await this.$apollo.mutate({
+ mutation: RetryMrFailedJobMutation,
+ variables: { id: this.job.id },
+ });
+
+ if (errors.length > 0) {
+ throw new Error(errors[0]);
+ }
+
+ this.$emit('job-retried', this.job.name);
+ } catch (error) {
+ createAlert({ message: error?.message || this.$options.i18n.retryError });
+ } finally {
+ this.isLoadingAction = false;
+ }
+ },
+ toggleJobLog(event) {
+ // Do not toggle the log visibility when clicking on a link
+ if (event.target.tagName === 'A') {
+ return;
+ }
+ this.isJobLogVisible = !this.isJobLogVisible;
+ },
+ },
+ i18n: {
+ cannotReadBuild: s__("Job|You do not have permission to read this job's log"),
+ cannotRetry: s__('Job|You do not have permission to retry this job'),
+ jobActionTooltipText: s__('Pipelines|Retry %{jobName} Job'),
+ noTraceText: s__('Job|No job log'),
+ retry: __('Retry'),
+ retryError: __('There was an error while retrying this job'),
+ },
+};
+</script>
+<template>
+ <div class="container-fluid gl-grid-tpl-rows-auto">
+ <div
+ class="row gl-py-4 gl-cursor-pointer gl-display-flex gl-align-items-center"
+ :class="activeClass"
+ :aria-pressed="isJobLogVisible"
+ role="button"
+ tabindex="0"
+ data-testid="widget-row"
+ @click="toggleJobLog"
+ @keyup.enter="toggleJobLog"
+ @keyup.space="toggleJobLog"
+ @mouseover="setActiveRow"
+ @mouseout="resetActiveRow"
+ >
+ <div class="col-6 gl-text-gray-900 gl-font-weight-bold gl-text-left">
+ <gl-icon :name="jobChevronName" class="gl-fill-blue-500" />
+ <ci-icon :status="job.detailedStatus" />
+ {{ job.name }}
+ </div>
+ <div class="col-2 gl-text-left">{{ job.stage.name }}</div>
+ <div class="col-2 gl-text-left">
+ <gl-link :href="job.webPath">#{{ parsedJobId }}</gl-link>
+ </div>
+ <gl-tooltip v-if="!canRetryJob" :target="() => $refs.retryBtn" placement="top">
+ {{ $options.i18n.cannotRetry }}
+ </gl-tooltip>
+ <div class="col-2 gl-text-left">
+ <span ref="retryBtn">
+ <gl-button
+ :disabled="!canRetryJob"
+ icon="retry"
+ :loading="isLoadingAction"
+ :title="$options.i18n.retry"
+ :aria-label="$options.i18n.retry"
+ @click.stop="retryJob"
+ />
+ </span>
+ </div>
+ </div>
+ <div class="row">
+ <gl-collapse :visible="isJobLogVisible" class="gl-w-full">
+ <pre
+ v-safe-html="jobTrace"
+ class="gl-bg-gray-900 gl-text-white"
+ :data-testid="isVisibleId"
+ ></pre>
+ </gl-collapse>
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/failure_widget/failed_jobs_list.vue b/app/assets/javascripts/pipelines/components/pipelines_list/failure_widget/failed_jobs_list.vue
new file mode 100644
index 00000000000..36687129cdd
--- /dev/null
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/failure_widget/failed_jobs_list.vue
@@ -0,0 +1,166 @@
+<script>
+import { GlLoadingIcon } from '@gitlab/ui';
+import { createAlert } from '~/alert';
+import { __, s__, sprintf } from '~/locale';
+import { getQueryHeaders } from '~/pipelines/components/graph/utils';
+import getPipelineFailedJobs from '../../../graphql/queries/get_pipeline_failed_jobs.query.graphql';
+import { graphqlEtagPipelinePath, sortJobsByStatus } from './utils';
+import FailedJobDetails from './failed_job_details.vue';
+
+const POLL_INTERVAL = 10000;
+
+const JOB_ACTION_HEADER = __('Actions');
+const JOB_ID_HEADER = __('Job ID');
+const JOB_NAME_HEADER = __('Job name');
+const STAGE_HEADER = __('Stage');
+
+export default {
+ components: {
+ GlLoadingIcon,
+ FailedJobDetails,
+ },
+ inject: ['fullPath', 'graphqlPath'],
+ props: {
+ isPipelineActive: {
+ required: true,
+ type: Boolean,
+ },
+ pipelineIid: {
+ type: Number,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ failedJobs: [],
+ isActive: false,
+ isLoadingMore: false,
+ };
+ },
+ apollo: {
+ failedJobs: {
+ context() {
+ return getQueryHeaders(this.graphqlResourceEtag);
+ },
+ query: getPipelineFailedJobs,
+ pollInterval: POLL_INTERVAL,
+ variables() {
+ return {
+ fullPath: this.fullPath,
+ pipelineIid: this.pipelineIid,
+ };
+ },
+ update(data) {
+ const jobs = data?.project?.pipeline?.jobs?.nodes || [];
+ return sortJobsByStatus(jobs);
+ },
+ result({ data }) {
+ const pipeline = data?.project?.pipeline;
+
+ if (pipeline?.jobs?.count) {
+ this.$emit('failed-jobs-count', pipeline.jobs.count);
+ this.isActive = pipeline.active;
+ }
+ },
+ error(e) {
+ createAlert({ message: e?.message || this.$options.i18n.fetchError, variant: 'danger' });
+ },
+ },
+ },
+ computed: {
+ graphqlResourceEtag() {
+ return graphqlEtagPipelinePath(this.graphqlPath, this.pipelineIid);
+ },
+ hasFailedJobs() {
+ return this.failedJobs.length > 0;
+ },
+ isInitialLoading() {
+ return this.isLoading && !this.isLoadingMore;
+ },
+ isLoading() {
+ return this.$apollo.queries.failedJobs.loading;
+ },
+ },
+ watch: {
+ isPipelineActive(flag) {
+ // Turn polling on and off based on REST actions
+ // By refetching jobs, we will get the graphql `active`
+ // field to update properly and cascade the polling changes
+ this.refetchJobs();
+ this.handlePolling(flag);
+ },
+ isActive(flag) {
+ this.handlePolling(flag);
+ },
+ },
+ mounted() {
+ if (!this.isActive && !this.isPipelineActive) {
+ this.handlePolling(false);
+ }
+ },
+ methods: {
+ handlePolling(isActive) {
+ // If the pipeline status has changed and the widget is not expanded,
+ // We start polling.
+ if (isActive) {
+ this.$apollo.queries.failedJobs.startPolling(POLL_INTERVAL);
+ } else {
+ this.$apollo.queries.failedJobs.stopPolling();
+ }
+ },
+ async retryJob(jobName) {
+ await this.refetchJobs();
+
+ this.$toast.show(sprintf(this.$options.i18n.retriedJobsSuccess, { jobName }));
+ },
+ async refetchJobs() {
+ this.isLoadingMore = true;
+
+ try {
+ await this.$apollo.queries.failedJobs.refetch();
+ } catch {
+ createAlert(this.$options.i18n.fetchError);
+ } finally {
+ this.isLoadingMore = false;
+ }
+ },
+ },
+ columns: [
+ { text: JOB_NAME_HEADER, class: 'col-6' },
+ { text: STAGE_HEADER, class: 'col-2' },
+ { text: JOB_ID_HEADER, class: 'col-2' },
+ { text: JOB_ACTION_HEADER, class: 'col-2' },
+ ],
+ i18n: {
+ fetchError: __('There was a problem fetching failed jobs'),
+ noFailedJobs: s__('Pipeline|No failed jobs in this pipeline 🎉'),
+ retriedJobsSuccess: __('%{jobName} job is being retried'),
+ },
+};
+</script>
+
+<template>
+ <div>
+ <gl-loading-icon v-if="isInitialLoading" />
+ <div v-else-if="!hasFailedJobs">{{ $options.i18n.noFailedJobs }}</div>
+ <div v-else class="container-fluid gl-grid-tpl-rows-auto">
+ <div class="row gl-mb-6 gl-text-gray-900">
+ <div
+ v-for="col in $options.columns"
+ :key="col.text"
+ class="gl-font-weight-bold gl-text-left"
+ :class="col.class"
+ data-testid="header"
+ >
+ {{ col.text }}
+ </div>
+ </div>
+ </div>
+ <failed-job-details
+ v-for="job in failedJobs"
+ :key="job.id"
+ :job="job"
+ @job-retried="retryJob"
+ />
+ </div>
+</template>
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/failure_widget/pipeline_failed_jobs_widget.vue b/app/assets/javascripts/pipelines/components/pipelines_list/failure_widget/pipeline_failed_jobs_widget.vue
index fce0b5f525e..5e49c05f47d 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/failure_widget/pipeline_failed_jobs_widget.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/failure_widget/pipeline_failed_jobs_widget.vue
@@ -1,22 +1,7 @@
<script>
-import {
- GlButton,
- GlCollapse,
- GlIcon,
- GlLink,
- GlLoadingIcon,
- GlPopover,
- GlSprintf,
-} from '@gitlab/ui';
-import { createAlert } from '~/alert';
-import { __, s__ } from '~/locale';
-import getPipelineFailedJobs from '../../../graphql/queries/get_pipeline_failed_jobs.query.graphql';
-import WidgetFailedJobRow from './widget_failed_job_row.vue';
-import { sortJobsByStatus } from './utils';
-
-const JOB_ID_HEADER = __('Job ID');
-const JOB_NAME_HEADER = __('Job name');
-const STAGE_HEADER = __('Stage');
+import { GlButton, GlCollapse, GlIcon, GlLink, GlPopover, GlSprintf } from '@gitlab/ui';
+import { __, s__, sprintf } from '~/locale';
+import FailedJobsList from './failed_jobs_list.vue';
export default {
components: {
@@ -24,13 +9,20 @@ export default {
GlCollapse,
GlIcon,
GlLink,
- GlLoadingIcon,
GlPopover,
GlSprintf,
- WidgetFailedJobRow,
+ FailedJobsList,
},
inject: ['fullPath'],
props: {
+ failedJobsCount: {
+ required: true,
+ type: Number,
+ },
+ isPipelineActive: {
+ required: true,
+ type: Boolean,
+ },
pipelineIid: {
required: true,
type: Number,
@@ -42,62 +34,44 @@ export default {
},
data() {
return {
- failedJobs: [],
+ currentFailedJobsCount: this.failedJobsCount,
+ isActive: false,
isExpanded: false,
};
},
- apollo: {
- failedJobs: {
- query: getPipelineFailedJobs,
- skip() {
- return !this.isExpanded;
- },
- variables() {
- return {
- fullPath: this.fullPath,
- pipelineIid: this.pipelineIid,
- };
- },
- update(data) {
- const jobs = data?.project?.pipeline?.jobs?.nodes || [];
- return sortJobsByStatus(jobs);
- },
- error(e) {
- createAlert({ message: e?.message || this.$options.i18n.fetchError, variant: 'danger' });
- },
- },
- },
computed: {
bodyClasses() {
return this.isExpanded ? '' : 'gl-display-none';
},
- failedJobsCount() {
- return this.failedJobs.length;
+ failedJobsCountText() {
+ return sprintf(this.$options.i18n.showFailedJobs, { count: this.currentFailedJobsCount });
},
iconName() {
return this.isExpanded ? 'chevron-down' : 'chevron-right';
},
- isLoading() {
- return this.$apollo.queries.failedJobs.loading;
+ popoverId() {
+ return `popover-${this.pipelineIid}`;
+ },
+ },
+ watch: {
+ failedJobsCount(val) {
+ this.currentFailedJobsCount = val;
},
},
methods: {
+ setFailedJobsCount(count) {
+ this.currentFailedJobsCount = count;
+ },
toggleWidget() {
this.isExpanded = !this.isExpanded;
},
},
- columns: [
- { text: JOB_NAME_HEADER, class: 'col-6' },
- { text: STAGE_HEADER, class: 'col-2' },
- { text: JOB_ID_HEADER, class: 'col-2' },
- ],
i18n: {
additionalInfoPopover: s__(
'Pipelines|You will see a maximum of 100 jobs in this list. To view all failed jobs, %{linkStart}go to the details page%{linkEnd} of this pipeline.',
),
additionalInfoTitle: __('Limitation on this view'),
- fetchError: __('There was a problem fetching failed jobs'),
- showFailedJobs: __('Show failed jobs'),
+ showFailedJobs: __('Show failed jobs (%{count})'),
},
};
</script>
@@ -105,9 +79,9 @@ export default {
<div class="gl-border-none!">
<gl-button variant="link" @click="toggleWidget">
<gl-icon :name="iconName" />
- {{ $options.i18n.showFailedJobs }}
- <gl-icon id="target" name="information-o" />
- <gl-popover target="target" placement="top">
+ {{ failedJobsCountText }}
+ <gl-icon :id="popoverId" name="information-o" />
+ <gl-popover :target="popoverId" placement="top">
<template #title> {{ $options.i18n.additionalInfoTitle }} </template>
<slot>
<gl-sprintf :message="$options.i18n.additionalInfoPopover">
@@ -118,26 +92,16 @@ export default {
</slot>
</gl-popover>
</gl-button>
- <gl-loading-icon v-if="isLoading" />
<gl-collapse
- v-else
v-model="isExpanded"
class="gl-bg-gray-10 gl-border-1 gl-border-t gl-border-color-gray-100 gl-mt-4 gl-pt-3"
>
- <div class="container-fluid gl-grid-tpl-rows-auto">
- <div class="row gl-mb-6 gl-text-gray-900">
- <div
- v-for="col in $options.columns"
- :key="col.text"
- class="gl-font-weight-bold gl-text-left"
- :class="col.class"
- data-testid="header"
- >
- {{ col.text }}
- </div>
- </div>
- </div>
- <widget-failed-job-row v-for="job in failedJobs" :key="job.id" :job="job" />
+ <failed-jobs-list
+ v-if="isExpanded"
+ :is-pipeline-active="isPipelineActive"
+ :pipeline-iid="pipelineIid"
+ @failed-jobs-count="setFailedJobsCount"
+ />
</gl-collapse>
</div>
</template>
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/failure_widget/utils.js b/app/assets/javascripts/pipelines/components/pipelines_list/failure_widget/utils.js
index 3f395fff7e0..2d0c467c54f 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/failure_widget/utils.js
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/failure_widget/utils.js
@@ -13,3 +13,7 @@ export const sortJobsByStatus = (jobs = []) => {
return 1;
});
};
+
+export const graphqlEtagPipelinePath = (graphqlPath, pipelineId) => {
+ return `${graphqlPath}pipelines/id/${pipelineId}`;
+};
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/failure_widget/widget_failed_job_row.vue b/app/assets/javascripts/pipelines/components/pipelines_list/failure_widget/widget_failed_job_row.vue
deleted file mode 100644
index e40e30f2b8d..00000000000
--- a/app/assets/javascripts/pipelines/components/pipelines_list/failure_widget/widget_failed_job_row.vue
+++ /dev/null
@@ -1,107 +0,0 @@
-<script>
-import { GlCollapse, GlIcon, GlLink } from '@gitlab/ui';
-import { s__, sprintf } from '~/locale';
-import { getIdFromGraphQLId } from '~/graphql_shared/utils';
-import CiIcon from '~/vue_shared/components/ci_icon.vue';
-import SafeHtml from '~/vue_shared/directives/safe_html';
-
-export default {
- components: {
- CiIcon,
- GlCollapse,
- GlIcon,
- GlLink,
- },
- directives: {
- SafeHtml,
- },
- props: {
- job: {
- type: Object,
- required: true,
- },
- },
- data() {
- return {
- isJobLogVisible: false,
- isHovered: false,
- };
- },
- computed: {
- activeClass() {
- return this.isHovered ? 'gl-bg-gray-50' : '';
- },
- isVisibleId() {
- return `log-${this.isJobLogVisible ? 'is-visible' : 'is-hidden'}`;
- },
- jobChevronName() {
- return this.isJobLogVisible ? 'chevron-down' : 'chevron-right';
- },
- jobTrace() {
- return this.job?.trace?.htmlSummary || this.$options.i18n.noTraceText;
- },
- parsedJobId() {
- return getIdFromGraphQLId(this.job.id);
- },
- tooltipText() {
- return sprintf(this.$options.i18n.jobActionTooltipText, { jobName: this.job.name });
- },
- },
- methods: {
- setActiveRow() {
- this.isHovered = true;
- },
- resetActiveRow() {
- this.isHovered = false;
- },
- toggleJobLog(e) {
- // Do not toggle the log visibility when clicking on a link
- if (e.target.tagName === 'A') {
- return;
- }
-
- this.isJobLogVisible = !this.isJobLogVisible;
- },
- },
- i18n: {
- jobActionTooltipText: s__('Pipelines|Retry %{jobName} Job'),
- noTraceText: s__('Job|No job log'),
- },
-};
-</script>
-<template>
- <div class="container-fluid gl-grid-tpl-rows-auto">
- <div
- class="row gl-py-4 gl-cursor-pointer gl-display-flex gl-align-items-center"
- :class="activeClass"
- :aria-pressed="isJobLogVisible"
- role="button"
- tabindex="0"
- data-testid="widget-row"
- @click="toggleJobLog"
- @keyup.enter="toggleJobLog"
- @keyup.space="toggleJobLog"
- @mouseover="setActiveRow"
- @mouseout="resetActiveRow"
- >
- <div class="col-6 gl-text-gray-900 gl-font-weight-bold gl-text-left">
- <gl-icon :name="jobChevronName" class="gl-fill-blue-500" />
- <ci-icon :status="job.detailedStatus" />
- {{ job.name }}
- </div>
- <div class="col-2 gl-text-left">{{ job.stage.name }}</div>
- <div class="col-2 gl-text-left">
- <gl-link :href="job.webPath">#{{ parsedJobId }}</gl-link>
- </div>
- </div>
- <div class="row">
- <gl-collapse :visible="isJobLogVisible" class="gl-w-full">
- <pre
- v-safe-html="jobTrace"
- class="gl-bg-gray-900 gl-text-white"
- :data-testid="isVisibleId"
- ></pre>
- </gl-collapse>
- </div>
- </div>
-</template>
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_artifacts.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_artifacts.vue
index 7d0cea67099..4452db64b0a 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_artifacts.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_artifacts.vue
@@ -1,10 +1,5 @@
<script>
-import {
- GlDropdown,
- GlDropdownItem,
- GlDropdownSectionHeader,
- GlTooltipDirective,
-} from '@gitlab/ui';
+import { GlDisclosureDropdown, GlTooltipDirective } from '@gitlab/ui';
import { __ } from '~/locale';
export const i18n = {
@@ -18,9 +13,7 @@ export default {
GlTooltip: GlTooltipDirective,
},
components: {
- GlDropdown,
- GlDropdownItem,
- GlDropdownSectionHeader,
+ GlDisclosureDropdown,
},
inject: {
artifactsEndpoint: {
@@ -42,6 +35,21 @@ export default {
},
},
computed: {
+ items() {
+ return [
+ {
+ name: this.$options.i18n.artifactSectionHeader,
+ items: this.artifacts.map(({ name, path }) => ({
+ text: name,
+ href: path,
+ extraAttrs: {
+ download: '',
+ rel: 'nofollow',
+ },
+ })),
+ },
+ ];
+ },
shouldShowDropdown() {
return this.artifacts?.length;
},
@@ -49,31 +57,16 @@ export default {
};
</script>
<template>
- <gl-dropdown
+ <gl-disclosure-dropdown
v-if="shouldShowDropdown"
v-gl-tooltip
class="build-artifacts js-pipeline-dropdown-download"
:title="$options.i18n.artifacts"
- :text="$options.i18n.artifacts"
+ :toggle-text="$options.i18n.artifacts"
:aria-label="$options.i18n.artifacts"
icon="download"
- right
- lazy
+ placement="right"
text-sr-only
- >
- <gl-dropdown-section-header>{{
- $options.i18n.artifactSectionHeader
- }}</gl-dropdown-section-header>
-
- <gl-dropdown-item
- v-for="(artifact, i) in artifacts"
- :key="i"
- :href="artifact.path"
- rel="nofollow"
- download
- class="gl-word-break-word"
- >
- {{ artifact.name }}
- </gl-dropdown-item>
- </gl-dropdown>
+ :items="items"
+ />
</template>
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 d884935d95b..dbb0b443235 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table.vue
@@ -71,6 +71,9 @@ export default {
};
},
computed: {
+ showFailedJobsWidget() {
+ return this.glFeatures.ciJobFailuresInMr;
+ },
tableFields() {
return [
{
@@ -143,17 +146,14 @@ export default {
const downstream = pipeline.triggered;
return keepLatestDownstreamPipelines(downstream);
},
- hasFailedJobs(pipeline) {
- return pipeline?.failed_builds?.length > 0 || false;
+ failedJobsCount(pipeline) {
+ return pipeline?.failed_builds?.length || 0;
},
setModalData(data) {
this.pipelineId = data.pipeline.id;
this.pipeline = data.pipeline;
this.endpoint = data.endpoint;
},
- showFailedJobsWidget(item) {
- return this.glFeatures.ciJobFailuresInMr && this.hasFailedJobs(item);
- },
onSubmit() {
eventHub.$emit('postAction', this.endpoint);
this.cancelingPipeline = this.pipelineId;
@@ -220,7 +220,9 @@ export default {
<template #row-details="{ item }">
<pipeline-failed-jobs-widget
- v-if="showFailedJobsWidget(item)"
+ v-if="showFailedJobsWidget"
+ :failed-jobs-count="failedJobsCount(item)"
+ :is-pipeline-active="item.active"
:pipeline-iid="item.iid"
:pipeline-path="item.path"
/>
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/time_ago.vue b/app/assets/javascripts/pipelines/components/pipelines_list/time_ago.vue
index bdecbb88a58..70343544638 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/time_ago.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/time_ago.vue
@@ -14,11 +14,6 @@ export default {
type: Object,
required: true,
},
- displayCalendarIcon: {
- type: Boolean,
- required: false,
- default: true,
- },
fontSize: {
type: String,
required: false,
@@ -50,13 +45,7 @@ export default {
</p>
<p v-if="finishedTime" class="finished-at gl-display-inline-flex gl-align-items-center">
- <gl-icon
- v-if="displayCalendarIcon"
- name="calendar"
- class="gl-mr-2"
- :size="12"
- data-testid="calendar-icon"
- />
+ <gl-icon name="calendar" class="gl-mr-2" :size="12" data-testid="calendar-icon" />
<time
v-gl-tooltip
diff --git a/app/assets/javascripts/pipelines/components/test_reports/empty_state.vue b/app/assets/javascripts/pipelines/components/test_reports/empty_state.vue
index e9f7874d3e4..3e7827dc416 100644
--- a/app/assets/javascripts/pipelines/components/test_reports/empty_state.vue
+++ b/app/assets/javascripts/pipelines/components/test_reports/empty_state.vue
@@ -43,7 +43,7 @@ export default {
};
},
testReportDocPath() {
- return helpPagePath('ci/unit_test_reports');
+ return helpPagePath('ci/testing/unit_test_reports');
},
},
};
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 2974bd2dd37..19318cb0c8b 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
@@ -66,7 +66,7 @@ export default {
},
wrapSymbols: ['::', '#', '.', '_', '-', '/', '\\'],
i18n,
- learnMorePath: helpPagePath('ci/unit_test_reports', {
+ learnMorePath: helpPagePath('ci/testing/unit_test_reports', {
anchor: 'viewing-unit-test-reports-on-gitlab',
}),
};
diff --git a/app/assets/javascripts/pipelines/graphql/mutations/retry_mr_failed_job.mutation.graphql b/app/assets/javascripts/pipelines/graphql/mutations/retry_mr_failed_job.mutation.graphql
new file mode 100644
index 00000000000..022d461dbec
--- /dev/null
+++ b/app/assets/javascripts/pipelines/graphql/mutations/retry_mr_failed_job.mutation.graphql
@@ -0,0 +1,5 @@
+mutation retryMrFailedJob($id: CiBuildID!) {
+ jobRetry(input: { id: $id }) {
+ errors
+ }
+}
diff --git a/app/assets/javascripts/pipelines/graphql/queries/get_pipeline_failed_jobs.query.graphql b/app/assets/javascripts/pipelines/graphql/queries/get_pipeline_failed_jobs.query.graphql
index 2c842f1ac77..3d69c5e451b 100644
--- a/app/assets/javascripts/pipelines/graphql/queries/get_pipeline_failed_jobs.query.graphql
+++ b/app/assets/javascripts/pipelines/graphql/queries/get_pipeline_failed_jobs.query.graphql
@@ -3,7 +3,9 @@ query getPipelineFailedJobs($fullPath: ID!, $pipelineIid: ID!) {
id
pipeline(iid: $pipelineIid) {
id
+ active
jobs(statuses: [FAILED], retried: false, jobKind: BUILD) {
+ count
nodes {
id
allowFailure
@@ -19,6 +21,7 @@ query getPipelineFailedJobs($fullPath: ID!, $pipelineIid: ID!) {
}
name
retried
+ retryable
stage {
id
name
@@ -26,6 +29,10 @@ query getPipelineFailedJobs($fullPath: ID!, $pipelineIid: ID!) {
trace {
htmlSummary
}
+ userPermissions {
+ readBuild
+ updateBuild
+ }
webPath
}
}
diff --git a/app/assets/javascripts/pipelines/graphql/queries/get_pipeline_failed_jobs_count.query.graphql b/app/assets/javascripts/pipelines/graphql/queries/get_pipeline_failed_jobs_count.query.graphql
new file mode 100644
index 00000000000..b70e95deab6
--- /dev/null
+++ b/app/assets/javascripts/pipelines/graphql/queries/get_pipeline_failed_jobs_count.query.graphql
@@ -0,0 +1,12 @@
+query getPipelineFailedJobsCount($fullPath: ID!, $pipelineIid: ID!) {
+ project(fullPath: $fullPath) {
+ id
+ pipeline(iid: $pipelineIid) {
+ id
+ active
+ jobs(statuses: [FAILED], retried: false, jobKind: BUILD) {
+ count
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/pipelines/pipeline_details_bundle.js b/app/assets/javascripts/pipelines/pipeline_details_bundle.js
index 5b9bfd53b13..f9c027539f2 100644
--- a/app/assets/javascripts/pipelines/pipeline_details_bundle.js
+++ b/app/assets/javascripts/pipelines/pipeline_details_bundle.js
@@ -2,20 +2,18 @@ import VueRouter from 'vue-router';
import { createAlert } from '~/alert';
import { __ } from '~/locale';
import { pipelineTabName } from './constants';
-import { createPipelineHeaderApp, createPipelineDetailsHeaderApp } from './pipeline_details_header';
+import { createPipelineDetailsHeaderApp } from './pipeline_details_header';
import { apolloProvider } from './pipeline_shared_client';
const SELECTORS = {
- PIPELINE_HEADER: '#js-pipeline-header-vue',
PIPELINE_DETAILS_HEADER: '#js-pipeline-details-header-vue',
PIPELINE_TABS: '#js-pipeline-tabs',
};
-export default async function initPipelineDetailsBundle(flagEnabled) {
- const headerSelector = flagEnabled
- ? SELECTORS.PIPELINE_DETAILS_HEADER
- : SELECTORS.PIPELINE_HEADER;
- const headerApp = flagEnabled ? createPipelineDetailsHeaderApp : createPipelineHeaderApp;
+export default async function initPipelineDetailsBundle() {
+ const headerSelector = SELECTORS.PIPELINE_DETAILS_HEADER;
+
+ const headerApp = createPipelineDetailsHeaderApp;
const headerEl = document.querySelector(headerSelector);
diff --git a/app/assets/javascripts/pipelines/pipeline_details_header.js b/app/assets/javascripts/pipelines/pipeline_details_header.js
index 807ef225edd..c79aaef23e8 100644
--- a/app/assets/javascripts/pipelines/pipeline_details_header.js
+++ b/app/assets/javascripts/pipelines/pipeline_details_header.js
@@ -1,41 +1,10 @@
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import { parseBoolean } from '~/lib/utils/common_utils';
-import PipelineHeader from './components/header_component.vue';
import PipelineDetailsHeader from './components/pipeline_details_header.vue';
Vue.use(VueApollo);
-export const createPipelineHeaderApp = (elSelector, apolloProvider, graphqlResourceEtag) => {
- const el = document.querySelector(elSelector);
-
- if (!el) {
- return;
- }
-
- const { fullPath, pipelineId, pipelineIid, pipelinesPath } = el.dataset;
- // eslint-disable-next-line no-new
- new Vue({
- el,
- components: {
- PipelineHeader,
- },
- apolloProvider,
- provide: {
- paths: {
- fullProject: fullPath,
- graphqlResourceEtag,
- pipelinesPath,
- },
- pipelineId,
- pipelineIid,
- },
- render(createElement) {
- return createElement('pipeline-header', {});
- },
- });
-};
-
export const createPipelineDetailsHeaderApp = (elSelector, apolloProvider, graphqlResourceEtag) => {
const el = document.querySelector(elSelector);
@@ -49,7 +18,7 @@ export const createPipelineDetailsHeaderApp = (elSelector, apolloProvider, graph
pipelinesPath,
name,
totalJobs,
- computeCredits,
+ computeMinutes,
yamlErrors,
failureReason,
triggeredByPath,
@@ -84,7 +53,7 @@ export const createPipelineDetailsHeaderApp = (elSelector, apolloProvider, graph
props: {
name,
totalJobs,
- computeCredits,
+ computeMinutes,
yamlErrors,
failureReason,
refText,
diff --git a/app/assets/javascripts/profile/account/components/delete_account_modal.vue b/app/assets/javascripts/profile/account/components/delete_account_modal.vue
index c64fbc91d12..915f6578ac3 100644
--- a/app/assets/javascripts/profile/account/components/delete_account_modal.vue
+++ b/app/assets/javascripts/profile/account/components/delete_account_modal.vue
@@ -1,5 +1,6 @@
<script>
import { GlModal, GlSprintf } from '@gitlab/ui';
+import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import csrf from '~/lib/utils/csrf';
import { __, s__ } from '~/locale';
@@ -8,6 +9,7 @@ export default {
GlModal,
GlSprintf,
},
+ mixins: [glFeatureFlagMixin()],
props: {
actionUrl: {
type: String,
@@ -67,6 +69,9 @@ export default {
},
},
i18n: {
+ textdelay: s__(`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. You might have to wait seven days before creating a new account with the same username or email.`),
text: s__(`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.`),
@@ -85,7 +90,16 @@ Once you confirm %{deleteAccount}, it cannot be undone or recovered.`),
@primary="onSubmit"
>
<p>
- <gl-sprintf :message="$options.i18n.text">
+ <gl-sprintf v-if="glFeatures.delayDeleteOwnUser" :message="$options.i18n.textdelay">
+ <template #yourAccount>
+ <strong>{{ s__('Profiles|your account') }}</strong>
+ </template>
+
+ <template #deleteAccount>
+ <strong>{{ s__('Profiles|Delete account') }}</strong>
+ </template>
+ </gl-sprintf>
+ <gl-sprintf v-else :message="$options.i18n.text">
<template #yourAccount>
<strong>{{ s__('Profiles|your account') }}</strong>
</template>
diff --git a/app/assets/javascripts/profile/account/components/update_username.vue b/app/assets/javascripts/profile/account/components/update_username.vue
index d96b5748abc..ae017d2a299 100644
--- a/app/assets/javascripts/profile/account/components/update_username.vue
+++ b/app/assets/javascripts/profile/account/components/update_username.vue
@@ -115,7 +115,7 @@ Please update your Git repository remotes as soon as possible.`),
v-model="newUsername"
data-testid="new-username-input"
:disabled="isRequestPending"
- class="form-control"
+ class="form-control gl-md-form-input-lg"
required="required"
/>
</div>
diff --git a/app/assets/javascripts/profile/components/follow.vue b/app/assets/javascripts/profile/components/follow.vue
index 7bab8a1c30d..2673ab6fbf4 100644
--- a/app/assets/javascripts/profile/components/follow.vue
+++ b/app/assets/javascripts/profile/components/follow.vue
@@ -1,7 +1,14 @@
<script>
-import { GlAvatarLabeled, GlAvatarLink, GlLoadingIcon, GlPagination } from '@gitlab/ui';
+import {
+ GlAvatarLabeled,
+ GlAvatarLink,
+ GlLoadingIcon,
+ GlPagination,
+ GlEmptyState,
+} from '@gitlab/ui';
import { DEFAULT_PER_PAGE } from '~/api';
import { NEXT, PREV } from '~/vue_shared/components/pagination/constants';
+import { isCurrentUser } from '~/lib/utils/common_utils';
export default {
i18n: {
@@ -13,7 +20,9 @@ export default {
GlAvatarLink,
GlLoadingIcon,
GlPagination,
+ GlEmptyState,
},
+ inject: ['followEmptyState', 'userId'],
props: {
/**
* Expected format:
@@ -48,12 +57,34 @@ export default {
required: false,
default: DEFAULT_PER_PAGE,
},
+ currentUserEmptyStateTitle: {
+ type: String,
+ required: true,
+ },
+ visitorEmptyStateTitle: {
+ type: String,
+ required: true,
+ },
+ },
+ computed: {
+ emptyStateTitle() {
+ return isCurrentUser(this.userId)
+ ? this.currentUserEmptyStateTitle
+ : this.visitorEmptyStateTitle;
+ },
},
};
</script>
<template>
<gl-loading-icon v-if="loading" class="gl-mt-5" size="md" />
+ <gl-empty-state
+ v-else-if="!users.length"
+ class="gl-mt-5"
+ :svg-path="followEmptyState"
+ :svg-height="144"
+ :title="emptyStateTitle"
+ />
<div v-else>
<div class="gl-my-n3 gl-mx-n3 gl-display-flex gl-flex-wrap">
<div v-for="user in users" :key="user.id" class="gl-p-3 gl-w-full gl-md-w-half gl-lg-w-25p">
diff --git a/app/assets/javascripts/profile/components/followers_tab.vue b/app/assets/javascripts/profile/components/followers_tab.vue
index 1fa579bc611..927424d6c3f 100644
--- a/app/assets/javascripts/profile/components/followers_tab.vue
+++ b/app/assets/javascripts/profile/components/followers_tab.vue
@@ -12,6 +12,8 @@ export default {
errorMessage: s__(
'UserProfile|An error occurred loading the followers. Please refresh the page to try again.',
),
+ currentUserEmptyStateTitle: s__('UserProfile|You do not have any followers'),
+ visitorEmptyStateTitle: s__("UserProfile|This user doesn't have any followers"),
},
components: {
GlBadge,
@@ -68,6 +70,8 @@ export default {
:loading="loading"
:page="page"
:total-items="totalItems"
+ :current-user-empty-state-title="$options.i18n.currentUserEmptyStateTitle"
+ :visitor-empty-state-title="$options.i18n.visitorEmptyStateTitle"
@pagination-input="onPaginationInput"
/>
</gl-tab>
diff --git a/app/assets/javascripts/profile/components/following_tab.vue b/app/assets/javascripts/profile/components/following_tab.vue
index 8ee878e3dcc..66c7ee42a3f 100644
--- a/app/assets/javascripts/profile/components/following_tab.vue
+++ b/app/assets/javascripts/profile/components/following_tab.vue
@@ -1,16 +1,62 @@
<script>
import { GlBadge, GlTab } from '@gitlab/ui';
import { s__ } from '~/locale';
+import { getUserFollowing } from '~/rest_api';
+import { createAlert } from '~/alert';
+import { parseIntPagination, normalizeHeaders } from '~/lib/utils/common_utils';
+import Follow from './follow.vue';
export default {
i18n: {
title: s__('UserProfile|Following'),
+ errorMessage: s__(
+ 'UserProfile|An error occurred loading the following. Please refresh the page to try again.',
+ ),
+ currentUserEmptyStateTitle: s__('UserProfile|You are not following other users'),
+ visitorEmptyStateTitle: s__("UserProfile|This user isn't following other users"),
},
components: {
GlBadge,
GlTab,
+ Follow,
+ },
+ inject: ['followeesCount', 'userId'],
+ data() {
+ return {
+ following: [],
+ loading: true,
+ totalItems: 0,
+ page: 1,
+ };
+ },
+ watch: {
+ page: {
+ async handler() {
+ this.loading = true;
+
+ try {
+ const { data: following, headers } = await getUserFollowing(this.userId, {
+ page: this.page,
+ });
+
+ const { total } = parseIntPagination(normalizeHeaders(headers));
+
+ this.following = following;
+ this.totalItems = total;
+ } catch (error) {
+ createAlert({ message: this.$options.i18n.errorMessage, error, captureError: true });
+ } finally {
+ this.loading = false;
+ }
+ },
+ immediate: true,
+ },
+ },
+ methods: {
+ onPaginationInput(page) {
+ this.page = page;
+ },
},
- inject: ['followeesCount'],
};
</script>
@@ -20,5 +66,14 @@ export default {
<span>{{ $options.i18n.title }}</span>
<gl-badge size="sm" class="gl-ml-2">{{ followeesCount }}</gl-badge>
</template>
+ <follow
+ :users="following"
+ :loading="loading"
+ :page="page"
+ :total-items="totalItems"
+ :current-user-empty-state-title="$options.i18n.currentUserEmptyStateTitle"
+ :visitor-empty-state-title="$options.i18n.visitorEmptyStateTitle"
+ @pagination-input="onPaginationInput"
+ />
</gl-tab>
</template>
diff --git a/app/assets/javascripts/profile/components/profile_tabs.vue b/app/assets/javascripts/profile/components/profile_tabs.vue
index 3a30c3bdc9b..e24167eb4fa 100644
--- a/app/assets/javascripts/profile/components/profile_tabs.vue
+++ b/app/assets/javascripts/profile/components/profile_tabs.vue
@@ -5,6 +5,7 @@ import { getUserProjects } from '~/rest_api';
import { s__ } from '~/locale';
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
import { createAlert } from '~/alert';
+import { VISIBILITY_LEVEL_PUBLIC_STRING } from '~/visibility_level/constants';
import OverviewTab from './overview_tab.vue';
import ActivityTab from './activity_tab.vue';
import GroupsTab from './groups_tab.vue';
@@ -81,7 +82,21 @@ export default {
async mounted() {
try {
const response = await getUserProjects(this.userId, { per_page: 10 });
- this.personalProjects = convertObjectPropsToCamelCase(response.data, { deep: true });
+ this.personalProjects = convertObjectPropsToCamelCase(response.data, { deep: true }).map(
+ (project) => {
+ // This API does not return the `visibility` key if user is signed out.
+ // Because this API only returns public projects when signed out, in this case, we can assume
+ // the `visibility` attribute is `public` if it is missing.
+ if (!project.visibility) {
+ return {
+ ...project,
+ visibility: VISIBILITY_LEVEL_PUBLIC_STRING,
+ };
+ }
+
+ return project;
+ },
+ );
this.personalProjectsLoading = false;
} catch (error) {
createAlert({ message: this.$options.i18n.personalProjectsErrorMessage });
diff --git a/app/assets/javascripts/profile/components/snippets/snippets_tab.vue b/app/assets/javascripts/profile/components/snippets/snippets_tab.vue
index fce5e2f5e78..95649f9645b 100644
--- a/app/assets/javascripts/profile/components/snippets/snippets_tab.vue
+++ b/app/assets/javascripts/profile/components/snippets/snippets_tab.vue
@@ -1,9 +1,11 @@
<script>
import { GlTab, GlKeysetPagination, GlEmptyState } from '@gitlab/ui';
-import { s__ } from '~/locale';
+import { s__, __ } from '~/locale';
import { convertToGraphQLId } from '~/graphql_shared/utils';
import { TYPENAME_USER } from '~/graphql_shared/constants';
import { SNIPPET_MAX_LIST_COUNT } from '~/profile/constants';
+import { isCurrentUser } from '~/lib/utils/common_utils';
+import { helpPagePath } from '~/helpers/help_page_helper';
import getUserSnippets from '../graphql/get_user_snippets.query.graphql';
import SnippetRow from './snippet_row.vue';
@@ -11,7 +13,11 @@ export default {
name: 'SnippetsTab',
i18n: {
title: s__('UserProfile|Snippets'),
- noSnippets: s__('UserProfiles|No snippets found.'),
+ currentUserEmptyStateTitle: s__('UserProfile|Get started with snippets'),
+ visitorEmptyStateTitle: s__("UserProfile|This user doesn't have any snippets"),
+ emptyStateDescription: s__('UserProfile|Store, share, and embed bits of code and text.'),
+ newSnippet: __('New snippet'),
+ learnMore: __('Learn more'),
},
components: {
GlTab,
@@ -19,7 +25,7 @@ export default {
GlEmptyState,
SnippetRow,
},
- inject: ['userId', 'snippetsEmptyState'],
+ inject: ['userId', 'snippetsEmptyState', 'newSnippetPath'],
data() {
return {
userInfo: {},
@@ -57,6 +63,14 @@ export default {
hasSnippets() {
return this.userSnippets?.length;
},
+ emptyStateTitle() {
+ return isCurrentUser(this.userId)
+ ? this.$options.i18n.currentUserEmptyStateTitle
+ : this.$options.i18n.visitorEmptyStateTitle;
+ },
+ emptyStateDescription() {
+ return isCurrentUser(this.userId) ? this.$options.i18n.emptyStateDescription : null;
+ },
},
methods: {
isLastSnippet(index) {
@@ -76,6 +90,7 @@ export default {
beforeToken: this.pageInfo.startCursor,
};
},
+ helpPagePath,
},
};
</script>
@@ -100,11 +115,17 @@ export default {
</div>
</template>
<template v-if="!hasSnippets">
- <gl-empty-state class="gl-mt-5" :svg-height="75" :svg-path="snippetsEmptyState">
- <template #title>
- <p class="gl-font-weight-bold gl-mt-n5">{{ $options.i18n.noSnippets }}</p>
- </template>
- </gl-empty-state>
+ <gl-empty-state
+ class="gl-mt-5"
+ :svg-path="snippetsEmptyState"
+ :svg-height="144"
+ :title="emptyStateTitle"
+ :description="emptyStateDescription"
+ :primary-button-link="newSnippetPath"
+ :primary-button-text="$options.i18n.newSnippet"
+ :secondary-button-text="$options.i18n.learnMore"
+ :secondary-button-link="helpPagePath('user/snippets')"
+ />
</template>
</gl-tab>
</template>
diff --git a/app/assets/javascripts/profile/components/user_achievements.vue b/app/assets/javascripts/profile/components/user_achievements.vue
index 13a1b797a83..7ce6b61c4ac 100644
--- a/app/assets/javascripts/profile/components/user_achievements.vue
+++ b/app/assets/javascripts/profile/components/user_achievements.vue
@@ -85,7 +85,7 @@ export default {
:size="32"
tabindex="0"
shape="rect"
- class="gl-mx-2"
+ class="gl-mx-2 gl-p-1 gl-border-none"
/>
<br />
<gl-badge v-if="showCountBadge(userAchievement.count)" variant="info" size="sm">{{
diff --git a/app/assets/javascripts/profile/index.js b/app/assets/javascripts/profile/index.js
index 198ffdb434b..76430d7b34d 100644
--- a/app/assets/javascripts/profile/index.js
+++ b/app/assets/javascripts/profile/index.js
@@ -21,6 +21,8 @@ export const initProfileTabs = () => {
utcOffset,
userId,
snippetsEmptyState,
+ newSnippetPath,
+ followEmptyState,
} = el.dataset;
const apolloProvider = new VueApollo({
@@ -39,6 +41,8 @@ export const initProfileTabs = () => {
utcOffset,
userId,
snippetsEmptyState,
+ newSnippetPath,
+ followEmptyState,
},
render(createElement) {
return createElement(ProfileTabs);
diff --git a/app/assets/javascripts/profile/preferences/components/profile_preferences.vue b/app/assets/javascripts/profile/preferences/components/profile_preferences.vue
index 164ec46cdb9..aa30192b74b 100644
--- a/app/assets/javascripts/profile/preferences/components/profile_preferences.vue
+++ b/app/assets/javascripts/profile/preferences/components/profile_preferences.vue
@@ -110,34 +110,33 @@ export default {
</script>
<template>
- <div class="row gl-mt-3 js-preferences-form js-search-settings-section">
- <div v-if="integrationViews.length" class="col-sm-12">
- <hr data-testid="profile-preferences-integrations-rule" />
- </div>
- <div v-if="integrationViews.length" class="col-lg-4 profile-settings-sidebar">
- <h4 class="gl-mt-0" data-testid="profile-preferences-integrations-heading">
- {{ $options.i18n.integrations }}
- </h4>
- <p>
+ <div class="gl-display-contents js-preferences-form">
+ <div
+ v-if="integrationViews.length"
+ class="settings-section gl-border-t gl-pt-6! js-search-settings-section"
+ >
+ <div class="settings-sticky-header">
+ <div class="settings-sticky-header-inner">
+ <h4 class="gl-my-0" data-testid="profile-preferences-integrations-heading">
+ {{ $options.i18n.integrations }}
+ </h4>
+ </div>
+ </div>
+ <p class="gl-text-secondary">
{{ $options.i18n.integrationsDescription }}
</p>
+ <div>
+ <integration-view
+ v-for="view in integrationViews"
+ :key="view.name"
+ :help-link="view.help_link"
+ :message="view.message"
+ :message-url="view.message_url"
+ :config="$options.integrationViewConfigs[view.name]"
+ />
+ </div>
</div>
- <div v-if="integrationViews.length" class="col-lg-8">
- <integration-view
- v-for="view in integrationViews"
- :key="view.name"
- :help-link="view.help_link"
- :message="view.message"
- :message-url="view.message_url"
- :config="$options.integrationViewConfigs[view.name]"
- />
- </div>
-
- <div class="col-lg-4"></div>
- <div class="col-lg-8">
- <hr />
- </div>
- <div class="col-sm-12 js-hide-when-nothing-matches-search">
+ <div class="settings-sticky-footer js-hide-when-nothing-matches-search">
<gl-button
category="primary"
variant="confirm"
diff --git a/app/assets/javascripts/projects/clusters_deprecation_alert/components/clusters_deprecation_alert.vue b/app/assets/javascripts/projects/clusters_deprecation_alert/components/clusters_deprecation_alert.vue
index e026b3e1060..750eb5836e1 100644
--- a/app/assets/javascripts/projects/clusters_deprecation_alert/components/clusters_deprecation_alert.vue
+++ b/app/assets/javascripts/projects/clusters_deprecation_alert/components/clusters_deprecation_alert.vue
@@ -10,6 +10,7 @@ export default {
},
inject: ['message'],
docsLink: helpPagePath('user/infrastructure/clusters/migrate_to_gitlab_agent.md'),
+ deprecationEpic: 'https://gitlab.com/groups/gitlab-org/configure/-/epics/8',
};
</script>
<template>
@@ -18,6 +19,9 @@ export default {
<template #link="{ content }">
<gl-link :href="$options.docsLink">{{ content }}</gl-link>
</template>
+ <template #deprecationLink="{ content }">
+ <gl-link :href="$options.deprecationEpic">{{ content }}</gl-link>
+ </template>
</gl-sprintf>
</gl-alert>
</template>
diff --git a/app/assets/javascripts/projects/commits/components/author_select.vue b/app/assets/javascripts/projects/commits/components/author_select.vue
index 2966214e051..cf251bc7465 100644
--- a/app/assets/javascripts/projects/commits/components/author_select.vue
+++ b/app/assets/javascripts/projects/commits/components/author_select.vue
@@ -1,27 +1,18 @@
<script>
-import {
- GlDropdown,
- GlDropdownSectionHeader,
- GlDropdownItem,
- GlSearchBoxByType,
- GlDropdownDivider,
- GlTooltipDirective,
-} from '@gitlab/ui';
+import { GlAvatar, GlCollapsibleListbox, GlTooltipDirective } from '@gitlab/ui';
import { debounce } from 'lodash';
-import { mapState, mapActions } from 'vuex';
-import { redirectTo, queryToObject } from '~/lib/utils/url_utility'; // eslint-disable-line import/no-deprecated
-import { __ } from '~/locale';
+import { mapActions, mapState } from 'vuex';
+import { queryToObject, visitUrl } from '~/lib/utils/url_utility';
+import { n__, __ } from '~/locale';
+import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
const tooltipMessage = __('Searching by both author and message is currently not supported.');
export default {
name: 'AuthorSelect',
components: {
- GlDropdown,
- GlDropdownSectionHeader,
- GlDropdownItem,
- GlSearchBoxByType,
- GlDropdownDivider,
+ GlAvatar,
+ GlCollapsibleListbox,
},
directives: {
GlTooltip: GlTooltipDirective,
@@ -35,9 +26,9 @@ export default {
data() {
return {
hasSearchParam: false,
- searchTerm: '',
- authorInput: '',
currentAuthor: '',
+ searchTerm: '',
+ searching: false,
};
},
computed: {
@@ -45,9 +36,33 @@ export default {
dropdownText() {
return this.currentAuthor || __('Author');
},
+ dropdownItems() {
+ const commitAuthorOptions = this.commitsAuthors.map((author) => ({
+ value: author.name,
+ text: author.name,
+ secondaryText: author.username,
+ avatarUrl: author.avatar_url,
+ }));
+ if (this.searchTerm) return commitAuthorOptions;
+
+ const defaultOptions = {
+ text: '',
+ options: [{ text: __('Any Author'), value: '' }],
+ textSrOnly: true,
+ };
+ const authorOptionsGroup = {
+ text: 'authors',
+ options: commitAuthorOptions,
+ textSrOnly: true,
+ };
+ return [defaultOptions, authorOptionsGroup];
+ },
tooltipTitle() {
return this.hasSearchParam && tooltipMessage;
},
+ searchSummarySrText() {
+ return n__('%d author', '%d authors', this.commitsAuthors.length);
+ },
},
mounted() {
this.fetchAuthors();
@@ -73,9 +88,7 @@ export default {
},
methods: {
...mapActions(['fetchAuthors']),
- selectAuthor(author) {
- const { name: user } = author || {};
-
+ selectAuthor(user) {
// Follow up issue "Remove usage of $.fadeIn from the codebase"
// > https://gitlab.com/gitlab-org/gitlab/-/issues/214395
@@ -89,13 +102,19 @@ export default {
commitListElement.style.transition = 'opacity 200ms';
if (!user) {
- return redirectTo(this.commitsPath); // eslint-disable-line import/no-deprecated
+ return visitUrl(this.commitsPath);
}
- return redirectTo(`${this.commitsPath}?author=${user}`); // eslint-disable-line import/no-deprecated
+ return visitUrl(`${this.commitsPath}?author=${user}`);
},
- searchAuthors() {
- this.fetchAuthors(this.authorInput);
+ searchAuthors: debounce(async function debouncedSearch() {
+ this.searching = true;
+ await this.fetchAuthors(this.searchTerm);
+ this.searching = false;
+ }, DEFAULT_DEBOUNCE_AND_THROTTLE_MS),
+ handleSearch(input) {
+ this.searchTerm = input;
+ this.searchAuthors();
},
setSearchParam(value) {
this.hasSearchParam = Boolean(value);
@@ -105,36 +124,45 @@ export default {
</script>
<template>
- <div ref="dropdownContainer" v-gl-tooltip :title="tooltipTitle" :disabled="!hasSearchParam">
- <gl-dropdown
- :text="dropdownText"
+ <div ref="listboxContainer" v-gl-tooltip :title="tooltipTitle" :disabled="!hasSearchParam">
+ <gl-collapsible-listbox
+ v-model="currentAuthor"
+ block
+ is-check-centered
+ searchable
+ class="gl-mt-3 gl-sm-mt-0"
+ :items="dropdownItems"
+ :header-text="__('Search by author')"
+ :toggle-text="dropdownText"
+ :search-placeholder="__('Search')"
+ :searching="searching"
:disabled="hasSearchParam"
- toggle-class="gl-py-3 gl-border-0"
- class="w-100 gl-mt-3 mt-sm-0"
+ @search="handleSearch"
+ @select="selectAuthor"
>
- <gl-dropdown-section-header>
- {{ __('Search by author') }}
- </gl-dropdown-section-header>
- <gl-dropdown-divider />
- <gl-search-box-by-type
- v-model.trim="authorInput"
- :placeholder="__('Search')"
- @input="searchAuthors"
- />
- <gl-dropdown-item :is-checked="!currentAuthor" @click="selectAuthor(null)">
- {{ __('Any Author') }}
- </gl-dropdown-item>
- <gl-dropdown-divider />
- <gl-dropdown-item
- v-for="author in commitsAuthors"
- :key="author.id"
- :is-checked="author.name === currentAuthor"
- :avatar-url="author.avatar_url"
- :secondary-text="author.username"
- @click="selectAuthor(author)"
- >
- {{ author.name }}
- </gl-dropdown-item>
- </gl-dropdown>
+ <template #search-summary-sr-only>
+ {{ searchSummarySrText }}
+ </template>
+ <template #list-item="{ item }">
+ <span class="gl-display-flex gl-align-items-center">
+ <gl-avatar
+ v-if="item.avatarUrl"
+ class="gl-mr-3"
+ :size="32"
+ :entity-name="item.text"
+ :src="item.avatarUrl"
+ :alt="item.text"
+ />
+ <span
+ class="gl-display-flex gl-flex-direction-column gl-overflow-hidden gl-overflow-break-word"
+ >
+ {{ item.text }}
+ <span v-if="item.secondaryText" class="gl-text-secondary">
+ {{ item.secondaryText }}
+ </span>
+ </span>
+ </span>
+ </template>
+ </gl-collapsible-listbox>
</div>
</template>
diff --git a/app/assets/javascripts/projects/compare/components/app.vue b/app/assets/javascripts/projects/compare/components/app.vue
index e4d5e5bd233..b40b28adab9 100644
--- a/app/assets/javascripts/projects/compare/components/app.vue
+++ b/app/assets/javascripts/projects/compare/components/app.vue
@@ -1,7 +1,21 @@
<script>
-import { GlDropdown, GlDropdownItem, GlButton } from '@gitlab/ui';
+import {
+ GlButton,
+ GlFormGroup,
+ GlFormRadioGroup,
+ GlIcon,
+ GlTooltipDirective,
+ GlSprintf,
+ GlLink,
+} from '@gitlab/ui';
import csrf from '~/lib/utils/csrf';
import { joinPaths } from '~/lib/utils/url_utility';
+import {
+ I18N,
+ COMPARE_OPTIONS,
+ COMPARE_REVISIONS_DOCS_URL,
+ COMPARE_OPTIONS_INPUT_NAME,
+} from '../constants';
import RevisionCard from './revision_card.vue';
export default {
@@ -9,8 +23,14 @@ export default {
components: {
RevisionCard,
GlButton,
- GlDropdown,
- GlDropdownItem,
+ GlFormRadioGroup,
+ GlFormGroup,
+ GlIcon,
+ GlLink,
+ GlSprintf,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
},
props: {
projectCompareIndexPath: {
@@ -76,24 +96,6 @@ export default {
isStraight: this.straight,
};
},
- computed: {
- straightModeDropdownItems() {
- return [
- {
- modeType: 'off',
- isEnabled: false,
- content: '..',
- testId: 'disableStraightModeButton',
- },
- {
- modeType: 'on',
- isEnabled: true,
- content: '...',
- testId: 'enableStraightModeButton',
- },
- ];
- },
- },
methods: {
onSubmit() {
this.$refs.form.submit();
@@ -110,10 +112,11 @@ export default {
onSwapRevision() {
[this.from, this.to] = [this.to, this.from]; // swaps 'from' and 'to'
},
- setStraightMode(isStraight) {
- this.isStraight = isStraight;
- },
},
+ i18n: I18N,
+ compareOptions: COMPARE_OPTIONS,
+ docsLink: COMPARE_REVISIONS_DOCS_URL,
+ inputName: COMPARE_OPTIONS_INPUT_NAME,
};
</script>
@@ -125,13 +128,26 @@ export default {
:action="projectCompareIndexPath"
>
<input :value="$options.csrf.token" type="hidden" name="authenticity_token" />
+ <h1 class="gl-font-size-h1 gl-mt-4">{{ $options.i18n.title }}</h1>
+ <p>
+ <gl-sprintf :message="$options.i18n.subtitle">
+ <template #bold="{ content }">
+ <strong>{{ content }}</strong>
+ </template>
+ <template #link="{ content }">
+ <gl-link target="_blank" :href="$options.docsLink" data-testid="help-link">{{
+ content
+ }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </p>
<div
class="gl-lg-flex-direction-row gl-lg-display-flex gl-align-items-center compare-revision-cards"
>
<revision-card
data-testid="sourceRevisionCard"
:refs-project-path="to.refsProjectPath"
- :revision-text="__('Source')"
+ :revision-text="$options.i18n.source"
params-name="to"
:params-branch="to.revision"
:projects="to.projects"
@@ -139,28 +155,26 @@ export default {
@selectProject="onSelectProject"
@selectRevision="onSelectRevision"
/>
- <div
- class="gl-display-flex gl-justify-content-center gl-align-items-center gl-align-self-end gl-my-3 gl-md-my-0 gl-pl-3 gl-pr-3"
- data-testid="ellipsis"
+ <gl-button
+ v-gl-tooltip="$options.i18n.swapRevisions"
+ class="gl-display-flex gl-mx-3 gl-align-self-end swap-button"
+ data-testid="swapRevisionsButton"
+ category="tertiary"
+ @click="onSwapRevision"
>
- <input :value="isStraight ? 'true' : 'false'" type="hidden" name="straight" />
- <gl-dropdown data-testid="modeDropdown" :text="isStraight ? '...' : '..'" size="small">
- <gl-dropdown-item
- v-for="mode in straightModeDropdownItems"
- :key="mode.modeType"
- :is-check-item="true"
- :is-checked="isStraight == mode.isEnabled"
- :data-testid="mode.testId"
- @click="setStraightMode(mode.isEnabled)"
- >
- <span class="dropdown-menu-inner-content"> {{ mode.content }} </span>
- </gl-dropdown-item>
- </gl-dropdown>
- </div>
+ <gl-icon name="substitute" />
+ </gl-button>
+ <gl-button
+ v-gl-tooltip="$options.i18n.swapRevisions"
+ class="gl-display-none gl-align-self-end gl-my-5 swap-button-mobile"
+ @click="onSwapRevision"
+ >
+ {{ $options.i18n.swap }}
+ </gl-button>
<revision-card
data-testid="targetRevisionCard"
:refs-project-path="from.refsProjectPath"
- :revision-text="__('Target')"
+ :revision-text="$options.i18n.target"
params-name="from"
:params-branch="from.revision"
:projects="from.projects"
@@ -169,22 +183,32 @@ export default {
@selectRevision="onSelectRevision"
/>
</div>
- <div class="gl-display-flex gl-mt-6 gl-gap-3">
- <gl-button category="primary" variant="confirm" @click="onSubmit">
- {{ s__('CompareRevisions|Compare') }}
- </gl-button>
- <gl-button data-testid="swapRevisionsButton" @click="onSwapRevision">
- {{ s__('CompareRevisions|Swap revisions') }}
+ <gl-form-group :label="$options.i18n.optionsLabel" class="gl-mt-4">
+ <gl-form-radio-group
+ v-model="isStraight"
+ :options="$options.compareOptions"
+ :name="$options.inputName"
+ required
+ />
+ </gl-form-group>
+ <div class="gl-display-flex gl-gap-3 gl-pb-4">
+ <gl-button
+ category="primary"
+ variant="confirm"
+ data-testid="compare-button"
+ @click="onSubmit"
+ >
+ {{ $options.i18n.compare }}
</gl-button>
<gl-button
v-if="projectMergeRequestPath"
:href="projectMergeRequestPath"
data-testid="projectMrButton"
>
- {{ s__('CompareRevisions|View open merge request') }}
+ {{ $options.i18n.viewMr }}
</gl-button>
<gl-button v-else-if="createMrPath" :href="createMrPath" data-testid="createMrButton">
- {{ s__('CompareRevisions|Create merge request') }}
+ {{ $options.i18n.openMr }}
</gl-button>
</div>
</form>
diff --git a/app/assets/javascripts/projects/compare/components/revision_card.vue b/app/assets/javascripts/projects/compare/components/revision_card.vue
index 162aca44f9d..212937c87c6 100644
--- a/app/assets/javascripts/projects/compare/components/revision_card.vue
+++ b/app/assets/javascripts/projects/compare/components/revision_card.vue
@@ -40,7 +40,7 @@ export default {
<template>
<div class="revision-card gl-flex-basis-half">
- <h2 class="gl-font-size-h2">
+ <h2 class="gl-font-base gl-mt-0">
{{ s__(`CompareRevisions|${revisionText}`) }}
</h2>
<div class="gl-sm-display-flex gl-align-items-center gl-gap-3">
diff --git a/app/assets/javascripts/projects/compare/constants.js b/app/assets/javascripts/projects/compare/constants.js
new file mode 100644
index 00000000000..2f07cf57521
--- /dev/null
+++ b/app/assets/javascripts/projects/compare/constants.js
@@ -0,0 +1,25 @@
+import { __, s__ } from '~/locale';
+import { DOCS_URL_IN_EE_DIR } from 'jh_else_ce/lib/utils/url_utility';
+
+export const COMPARE_OPTIONS_INPUT_NAME = 'straight';
+export const COMPARE_OPTIONS = [
+ { value: false, text: s__('CompareRevisions|Only incoming changes from source') },
+ { value: true, text: s__('CompareRevisions|Include changes to target since source was created') },
+];
+
+export const I18N = {
+ title: s__('CompareRevisions|Compare revisions'),
+ subtitle: s__(
+ 'CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}',
+ ),
+ source: __('Source'),
+ swap: s__('CompareRevisions|Swap'),
+ target: __('Target'),
+ swapRevisions: s__('CompareRevisions|Swap revisions'),
+ compare: s__('CompareRevisions|Compare'),
+ optionsLabel: s__('CompareRevisions|Show changes'),
+ viewMr: s__('CompareRevisions|View open merge request'),
+ openMr: s__('CompareRevisions|Create merge request'),
+};
+
+export const COMPARE_REVISIONS_DOCS_URL = `${DOCS_URL_IN_EE_DIR}/user/project/repository/branches/#compare-branches`;
diff --git a/app/assets/javascripts/projects/new/components/app.vue b/app/assets/javascripts/projects/new/components/app.vue
index 6ca83b0b500..a841766a93c 100644
--- a/app/assets/javascripts/projects/new/components/app.vue
+++ b/app/assets/javascripts/projects/new/components/app.vue
@@ -1,8 +1,8 @@
<script>
-import createFromTemplateIllustration from '@gitlab/svgs/dist/illustrations/project-create-from-template-sm.svg?raw';
-import blankProjectIllustration from '@gitlab/svgs/dist/illustrations/project-create-new-sm.svg?raw';
-import importProjectIllustration from '@gitlab/svgs/dist/illustrations/project-import-sm.svg?raw';
-import ciCdProjectIllustration from '@gitlab/svgs/dist/illustrations/project-run-CICD-pipelines-sm.svg?raw';
+import PROJECT_CREATE_FROM_TEMPLATE_SVG_URL from '@gitlab/svgs/dist/illustrations/project-create-from-template-sm.svg?url';
+import PROJECT_CREATE_NEW_SVG_URL from '@gitlab/svgs/dist/illustrations/project-create-new-sm.svg?url';
+import PROJECT_IMPORT_SVG_URL from '@gitlab/svgs/dist/illustrations/project-import-sm.svg?url';
+import PROJECT_RUN_CICD_PIPELINES_SVG_URL from '@gitlab/svgs/dist/illustrations/project-run-CICD-pipelines-sm.svg?url';
import SafeHtml from '~/vue_shared/directives/safe_html';
import { s__ } from '~/locale';
import NewNamespacePage from '~/vue_shared/new_namespace/new_namespace_page.vue';
@@ -19,7 +19,7 @@ const PANELS = [
description: s__(
'ProjectsNew|Create a blank project to store your files, plan your work, and collaborate on code, among other things.',
),
- illustration: blankProjectIllustration,
+ imageSrc: PROJECT_CREATE_NEW_SVG_URL,
},
{
key: 'template',
@@ -29,7 +29,7 @@ const PANELS = [
description: s__(
'ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly.',
),
- illustration: createFromTemplateIllustration,
+ imageSrc: PROJECT_CREATE_FROM_TEMPLATE_SVG_URL,
},
{
key: 'import',
@@ -39,7 +39,7 @@ const PANELS = [
description: s__(
'ProjectsNew|Migrate your data from an external source like GitHub, Bitbucket, or another instance of GitLab.',
),
- illustration: importProjectIllustration,
+ imageSrc: PROJECT_IMPORT_SVG_URL,
},
{
key: 'ci',
@@ -47,7 +47,7 @@ const PANELS = [
selector: '#ci-cd-project-pane',
title: s__('ProjectsNew|Run CI/CD for external repository'),
description: s__('ProjectsNew|Connect your external repository to GitLab CI/CD.'),
- illustration: ciCdProjectIllustration,
+ imageSrc: PROJECT_RUN_CICD_PIPELINES_SVG_URL,
},
];
diff --git a/app/assets/javascripts/projects/settings/access_dropdown.js b/app/assets/javascripts/projects/settings/access_dropdown.js
index d8675a851ea..75d72f719e5 100644
--- a/app/assets/javascripts/projects/settings/access_dropdown.js
+++ b/app/assets/javascripts/projects/settings/access_dropdown.js
@@ -3,6 +3,7 @@ import { escape, find, countBy } from 'lodash';
import initDeprecatedJQueryDropdown from '~/deprecated_jquery_dropdown';
import { createAlert } from '~/alert';
import { n__, s__, __, sprintf } from '~/locale';
+import { renderAvatar } from '~/helpers/avatar_helper';
import { getUsers, getGroups, getDeployKeys } from './api/access_dropdown_api';
import { LEVEL_TYPES, LEVEL_ID_PROP, ACCESS_LEVELS, ACCESS_LEVEL_NONE } from './constants';
@@ -534,13 +535,22 @@ export default class AccessDropdown {
userRowHtml(user, isActive) {
const isActiveClass = isActive || '';
+ const avatarEl = renderAvatar(user, {
+ sizeClass: 's32',
+ });
return `
<li>
<a href="#" class="${isActiveClass}">
- <img src="${user.avatar_url}" class="avatar avatar-inline" width="30">
- <strong class="dropdown-menu-user-full-name">${escape(user.name)}</strong>
- <span class="dropdown-menu-user-username">${user.username}</span>
+ <div class="gl-avatar-labeled">
+ ${avatarEl}
+ <div>
+ <strong class="dropdown-menu-user-full-name">${escape(user.name)}</strong>
+ <span class="gl-avatar-labeled-sublabel dropdown-menu-user-username">@${
+ user.username
+ }</span>
+ </div>
+ </div>
</a>
</li>
`;
diff --git a/app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue b/app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue
index 650b60cba4f..ae28694f5d2 100644
--- a/app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue
+++ b/app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue
@@ -7,8 +7,8 @@ import { __, sprintf } from '~/locale';
import ServiceDeskSetting from './service_desk_setting.vue';
export default {
- customEmailHelpPath: helpPagePath('/user/project/service_desk.html', {
- anchor: 'use-a-custom-email-address',
+ serviceDeskEmailHelpPath: helpPagePath('/user/project/service_desk.html', {
+ anchor: 'use-an-additional-service-desk-alias-email',
}),
components: {
GlAlert,
@@ -32,10 +32,10 @@ export default {
initialIncomingEmail: {
default: '',
},
- customEmail: {
+ serviceDeskEmail: {
default: '',
},
- customEmailEnabled: {
+ serviceDeskEmailEnabled: {
default: false,
},
selectedTemplate: {
@@ -65,7 +65,7 @@ export default {
alertVariant: 'danger',
alertMessage: '',
incomingEmail: this.initialIncomingEmail,
- updatedCustomEmail: this.customEmail,
+ updatedServiceDeskEmail: this.serviceDeskEmail,
};
},
methods: {
@@ -110,7 +110,7 @@ export default {
return axios
.put(this.endpoint, body)
.then(({ data }) => {
- this.updatedCustomEmail = data?.service_desk_address;
+ this.updatedServiceDeskEmail = data?.service_desk_address;
this.showAlert(__('Changes saved.'), 'success');
})
.catch((err) => {
@@ -155,7 +155,7 @@ export default {
"
>
<template #link="{ content }">
- <gl-link :href="$options.customEmailHelpPath" target="_blank">
+ <gl-link :href="$options.serviceDeskEmailHelpPath" target="_blank">
{{ content }}
</gl-link>
</template>
@@ -168,8 +168,8 @@ export default {
:is-enabled="isEnabled"
:is-issue-tracker-enabled="isIssueTrackerEnabled"
:incoming-email="incomingEmail"
- :custom-email="updatedCustomEmail"
- :custom-email-enabled="customEmailEnabled"
+ :service-desk-email="updatedServiceDeskEmail"
+ :service-desk-email-enabled="serviceDeskEmailEnabled"
:initial-selected-template="selectedTemplate"
:initial-selected-file-template-project-id="selectedFileTemplateProjectId"
:initial-outgoing-name="outgoingName"
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 38a2c12d137..5078cbbdf59 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
@@ -49,12 +49,12 @@ export default {
required: false,
default: '',
},
- customEmail: {
+ serviceDeskEmail: {
type: String,
required: false,
default: '',
},
- customEmailEnabled: {
+ serviceDeskEmailEnabled: {
type: Boolean,
required: false,
},
@@ -101,22 +101,22 @@ export default {
},
computed: {
hasProjectKeySupport() {
- return Boolean(this.customEmailEnabled);
+ return Boolean(this.serviceDeskEmailEnabled);
},
email() {
- return this.customEmail || this.incomingEmail;
+ return this.serviceDeskEmail || this.incomingEmail;
},
- hasCustomEmail() {
- return this.customEmail && this.customEmail !== this.incomingEmail;
+ hasServiceDeskEmail() {
+ return this.serviceDeskEmail && this.serviceDeskEmail !== this.incomingEmail;
},
emailSuffixHelpUrl() {
return helpPagePath('user/project/service_desk.html', {
- anchor: 'configure-a-custom-email-address-suffix',
+ anchor: 'configure-a-suffix-for-service-desk-alias-email',
});
},
- customEmailAddressHelpUrl() {
+ serviceDeskEmailAddressHelpUrl() {
return helpPagePath('user/project/service_desk.html', {
- anchor: 'use-a-custom-email-address',
+ anchor: 'use-an-additional-service-desk-alias-email',
});
},
issuesHelpPagePath() {
@@ -204,7 +204,7 @@ export default {
<clipboard-button :title="__('Copy')" :text="email" css-class="input-group-text" />
</template>
</gl-form-input-group>
- <template v-if="email && hasCustomEmail" #description>
+ <template v-if="email && hasServiceDeskEmail" #description>
<span class="gl-mt-2 gl-display-inline-block">
<gl-sprintf :message="__('Emails sent to %{email} are also supported.')">
<template #email>
@@ -260,7 +260,7 @@ export default {
>
<template #link="{ content }">
<gl-link
- :href="customEmailAddressHelpUrl"
+ :href="serviceDeskEmailAddressHelpUrl"
target="_blank"
class="gl-text-blue-600 font-size-inherit"
>{{ content }}
diff --git a/app/assets/javascripts/projects/settings_service_desk/index.js b/app/assets/javascripts/projects/settings_service_desk/index.js
index 84229175c0b..0f4c747a7b6 100644
--- a/app/assets/javascripts/projects/settings_service_desk/index.js
+++ b/app/assets/javascripts/projects/settings_service_desk/index.js
@@ -10,8 +10,8 @@ export default () => {
}
const {
- customEmail,
- customEmailEnabled,
+ serviceDeskEmail,
+ serviceDeskEmailEnabled,
enabled,
issueTrackerEnabled,
endpoint,
@@ -27,8 +27,8 @@ export default () => {
return new Vue({
el,
provide: {
- customEmail,
- customEmailEnabled: parseBoolean(customEmailEnabled),
+ serviceDeskEmail,
+ serviceDeskEmailEnabled: parseBoolean(serviceDeskEmailEnabled),
endpoint,
initialIncomingEmail: incomingEmail,
initialIsEnabled: parseBoolean(enabled),
diff --git a/app/assets/javascripts/projects/tree/components/commit_pipeline_status_component.vue b/app/assets/javascripts/projects/tree/components/commit_pipeline_status.vue
index 5b620aa2300..5b620aa2300 100644
--- a/app/assets/javascripts/projects/tree/components/commit_pipeline_status_component.vue
+++ b/app/assets/javascripts/projects/tree/components/commit_pipeline_status.vue
diff --git a/app/assets/javascripts/related_issues/components/related_issues_block.vue b/app/assets/javascripts/related_issues/components/related_issues_block.vue
index f672acda062..1044d25c1a3 100644
--- a/app/assets/javascripts/related_issues/components/related_issues_block.vue
+++ b/app/assets/javascripts/related_issues/components/related_issues_block.vue
@@ -184,21 +184,14 @@ export default {
<template>
<div id="related-issues" class="related-issues-block">
<gl-card
- class="gl-overflow-hidden gl-mt-5 gl-mb-0"
- header-class="gl-p-0 gl-border-0"
- body-class="gl-p-0 gl-bg-gray-10"
+ class="gl-new-card gl-overflow-hidden"
+ header-class="gl-new-card-header"
+ body-class="gl-new-card-body"
+ :aria-expanded="isOpen.toString()"
>
<template #header>
- <div
- :class="{
- 'gl-border-b-1': isOpen,
- 'gl-border-b-0': !isOpen,
- }"
- class="gl-display-flex gl-justify-content-space-between gl-pl-5 gl-pr-4 gl-py-4 gl-bg-white gl-border-b-solid gl-border-b-gray-100"
- >
- <h3
- class="card-title h5 gl-relative gl-my-0 gl-display-flex gl-align-items-center gl-flex-grow-1 gl-line-height-24"
- >
+ <div class="gl-new-card-title-wrapper">
+ <h3 class="gl-new-card-title" data-testid="card-title">
<gl-link
id="user-content-related-issues"
class="anchor position-absolute gl-text-decoration-none"
@@ -206,48 +199,44 @@ export default {
aria-hidden="true"
/>
<slot name="header-text">{{ headerText }}</slot>
-
- <div
- class="js-related-issues-header-issue-count gl-display-inline-flex gl-mx-3 gl-text-gray-500"
- >
- <span class="gl-display-inline-flex gl-align-items-center">
- <gl-icon :name="issuableTypeIcon" class="gl-mr-2 gl-text-gray-500" />
- {{ badgeLabel }}
- </span>
- </div>
</h3>
- <slot name="header-actions"></slot>
+ <div class="gl-new-card-count js-related-issues-header-issue-count">
+ <gl-icon :name="issuableTypeIcon" class="gl-mr-2" />
+ {{ badgeLabel }}
+ </div>
+ </div>
+ <slot name="header-actions"></slot>
+ <gl-button
+ v-if="canAdmin"
+ size="small"
+ data-testid="related-issues-plus-button"
+ :aria-label="addIssuableButtonText"
+ class="gl-ml-3"
+ @click="addButtonClick"
+ >
+ <slot name="add-button-text">{{ __('Add') }}</slot>
+ </gl-button>
+ <div class="gl-new-card-toggle">
<gl-button
- v-if="canAdmin"
+ category="tertiary"
size="small"
- data-testid="related-issues-plus-button"
- :aria-label="addIssuableButtonText"
- class="gl-ml-3"
- @click="addButtonClick"
- >
- <slot name="add-button-text">{{ __('Add') }}</slot>
- </gl-button>
- <div class="gl-pl-3 gl-ml-3 gl-border-l-1 gl-border-l-solid gl-border-l-gray-100">
- <gl-button
- category="tertiary"
- size="small"
- :icon="toggleIcon"
- :aria-label="toggleLabel"
- data-testid="toggle-links"
- @click="handleToggle"
- />
- </div>
+ :icon="toggleIcon"
+ :aria-label="toggleLabel"
+ data-testid="toggle-links"
+ @click="handleToggle"
+ />
</div>
</template>
<div
v-if="isOpen"
- class="linked-issues-card-body gl-py-3 gl-px-4 gl-bg-gray-10"
+ class="linked-issues-card-body gl-new-card-content"
data-testid="related-issues-body"
>
<div
v-if="isFormVisible"
- class="js-add-related-issues-form-area card-body bg-white gl-mt-2 gl-border-1 gl-border-solid gl-border-gray-100 gl-rounded-base"
+ class="js-add-related-issues-form-area gl-new-card-add-form"
:class="{ 'gl-mb-5': shouldShowTokenBody, 'gl-show-field-errors': hasError }"
+ data-testid="add-item-form"
>
<add-issuable-form
:show-categorized-issues="showCategorizedIssues"
@@ -289,8 +278,8 @@ export default {
@saveReorder="$emit('saveReorder', $event)"
/>
</template>
- <div v-if="!shouldShowTokenBody && !isFormVisible" data-testid="related-items-empty">
- <p class="gl-p-2 gl-mb-0 gl-text-gray-500">
+ <div v-if="!shouldShowTokenBody && !isFormVisible">
+ <p class="gl-new-card-empty">
{{ emptyStateMessage }}
<gl-link
v-if="hasHelpPath"
diff --git a/app/assets/javascripts/releases/components/app_edit_new.vue b/app/assets/javascripts/releases/components/app_edit_new.vue
index ff92cdd42c6..516162b57b5 100644
--- a/app/assets/javascripts/releases/components/app_edit_new.vue
+++ b/app/assets/javascripts/releases/components/app_edit_new.vue
@@ -215,14 +215,13 @@ export default {
</gl-form-group>
<gl-form-group data-testid="release-notes">
<label for="release-notes">{{ __('Release notes') }}</label>
- <div class="bordered-box pr-3 pl-3">
+ <div class="common-note-form">
<markdown-field
:can-attach-file="true"
:markdown-preview-path="markdownPreviewPath"
:markdown-docs-path="markdownDocsPath"
:add-spacing-classes="false"
:textarea-value="formattedReleaseNotes"
- class="gl-mt-3 gl-mb-3"
>
<template #textarea>
<textarea
diff --git a/app/assets/javascripts/repository/components/blob_content_viewer.vue b/app/assets/javascripts/repository/components/blob_content_viewer.vue
index e056a822c8b..969036f84b7 100644
--- a/app/assets/javascripts/repository/components/blob_content_viewer.vue
+++ b/app/assets/javascripts/repository/components/blob_content_viewer.vue
@@ -7,14 +7,16 @@ import { SIMPLE_BLOB_VIEWER, RICH_BLOB_VIEWER } from '~/blob/components/constant
import { createAlert } from '~/alert';
import axios from '~/lib/utils/axios_utils';
import { isLoggedIn, handleLocationHash } from '~/lib/utils/common_utils';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { __ } from '~/locale';
import { redirectTo, getLocationHash } from '~/lib/utils/url_utility'; // eslint-disable-line import/no-deprecated
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-import WebIdeLink from '~/vue_shared/components/web_ide_link.vue';
+import WebIdeLink from 'ee_else_ce/vue_shared/components/web_ide_link.vue';
import CodeIntelligence from '~/code_navigation/components/app.vue';
import LineHighlighter from '~/blob/line_highlighter';
import blobInfoQuery from 'shared_queries/repository/blob_info.query.graphql';
import { addBlameLink } from '~/blob/blob_blame_link';
+import highlightMixin from '~/repository/mixins/highlight_mixin';
import projectInfoQuery from '../queries/project_info.query.graphql';
import getRefMixin from '../mixins/get_ref';
import userInfoQuery from '../queries/user_info.query.graphql';
@@ -36,7 +38,7 @@ export default {
CodeIntelligence,
AiGenie: () => import('ee_component/ai/components/ai_genie.vue'),
},
- mixins: [getRefMixin, glFeatureFlagMixin()],
+ mixins: [getRefMixin, glFeatureFlagMixin(), highlightMixin],
inject: {
originalBranch: {
default: '',
@@ -81,7 +83,10 @@ export default {
shouldFetchRawText: Boolean(this.glFeatures.highlightJs),
};
},
- result() {
+ result({ data }) {
+ const blob = data.project?.repository?.blobs?.nodes[0] || {};
+ this.initHighlightWorker(blob);
+
const urlHash = getLocationHash();
const plain = this.$route?.query?.plain;
@@ -170,7 +175,14 @@ export default {
},
blobViewer() {
const { fileType } = this.viewer;
- return this.shouldLoadLegacyViewer ? null : loadViewer(fileType, this.isUsingLfs);
+ return this.shouldLoadLegacyViewer
+ ? null
+ : loadViewer(
+ fileType,
+ this.isUsingLfs,
+ this.glFeatures.highlightJsWorker,
+ this.blobInfo.language,
+ );
},
shouldLoadLegacyViewer() {
const isTextFile = this.viewer.fileType === TEXT_FILE_TYPE && !this.glFeatures.highlightJs;
@@ -215,6 +227,9 @@ export default {
isUsingLfs() {
return this.blobInfo.storedExternally && this.blobInfo.externalStorage === LFS_STORAGE;
},
+ projectIdAsNumber() {
+ return getIdFromGraphQLId(this.project?.id);
+ },
},
watch: {
// Watch the URL 'plain' query value to know if the viewer needs changing.
@@ -345,6 +360,8 @@ export default {
:gitpod-url="blobInfo.gitpodBlobUrl"
:show-gitpod-button="gitpodEnabled"
:gitpod-enabled="currentUser && currentUser.gitpodEnabled"
+ :project-path="projectPath"
+ :project-id="projectIdAsNumber"
:user-preferences-gitpod-path="currentUser && currentUser.preferencesGitpodPath"
:user-profile-enable-gitpod-path="currentUser && currentUser.profileEnableGitpodPath"
is-blob
@@ -386,7 +403,14 @@ export default {
:loading="isLoadingLegacyViewer"
:data-loading="isRenderingLegacyTextViewer"
/>
- <component :is="blobViewer" v-else :blob="blobInfo" class="blob-viewer" @error="onError" />
+ <component
+ :is="blobViewer"
+ v-else
+ :blob="blobInfo"
+ :chunks="chunks"
+ class="blob-viewer"
+ @error="onError"
+ />
<code-intelligence
v-if="blobViewer || legacyViewerLoaded"
:code-navigation-path="blobInfo.codeNavigationPath"
diff --git a/app/assets/javascripts/repository/components/blob_viewers/geo_json/constants.js b/app/assets/javascripts/repository/components/blob_viewers/geo_json/constants.js
index fd4d111b4b0..2c95e63720e 100644
--- a/app/assets/javascripts/repository/components/blob_viewers/geo_json/constants.js
+++ b/app/assets/javascripts/repository/components/blob_viewers/geo_json/constants.js
@@ -7,7 +7,7 @@ export const RENDER_ERROR_MSG = __(
'The map can not be displayed because there was an error loading the GeoJSON file.',
);
-export const OPEN_STREET_TILE_URL = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';
+export const OPEN_STREET_TILE_URL = 'https://tile.openstreetmap.org/{z}/{x}/{y}.png';
export const ICON_CONFIG = { iconUrl, iconRetinaUrl, shadowUrl };
export const MAP_ATTRIBUTION = __('Map data from');
export const OPEN_STREET_COPYRIGHT_LINK =
diff --git a/app/assets/javascripts/repository/components/blob_viewers/index.js b/app/assets/javascripts/repository/components/blob_viewers/index.js
index b749702972f..368f42e0064 100644
--- a/app/assets/javascripts/repository/components/blob_viewers/index.js
+++ b/app/assets/javascripts/repository/components/blob_viewers/index.js
@@ -15,9 +15,15 @@ const viewers = {
geo_json: () => import('./geo_json/geo_json_viewer.vue'),
};
-export const loadViewer = (type, isUsingLfs) => {
+export const loadViewer = (type, isUsingLfs, hljsWorkerEnabled, language) => {
let viewer = viewers[type];
+ if (hljsWorkerEnabled && language === 'json') {
+ // The New Source Viewer currently only supports JSON files.
+ // More language support will be added in: https://gitlab.com/gitlab-org/gitlab/-/issues/415753
+ viewer = () => import('~/vue_shared/components/source_viewer/source_viewer_new.vue');
+ }
+
if (!viewer && isUsingLfs) {
viewer = viewers.lfs;
}
diff --git a/app/assets/javascripts/repository/components/breadcrumbs.vue b/app/assets/javascripts/repository/components/breadcrumbs.vue
index 46dee9db69a..d498be0b2bb 100644
--- a/app/assets/javascripts/repository/components/breadcrumbs.vue
+++ b/app/assets/javascripts/repository/components/breadcrumbs.vue
@@ -1,14 +1,8 @@
<script>
-import {
- GlDropdown,
- GlDropdownDivider,
- GlDropdownSectionHeader,
- GlDropdownItem,
- GlIcon,
- GlModalDirective,
-} from '@gitlab/ui';
+import { GlDisclosureDropdown, GlModalDirective } from '@gitlab/ui';
import permissionsQuery from 'shared_queries/repository/permissions.query.graphql';
import { joinPaths, escapeFileUrl } from '~/lib/utils/url_utility';
+import { BV_SHOW_MODAL } from '~/lib/utils/constants';
import { __ } from '~/locale';
import getRefMixin from '../mixins/get_ref';
import projectPathQuery from '../queries/project_path.query.graphql';
@@ -16,21 +10,12 @@ import projectShortPathQuery from '../queries/project_short_path.query.graphql';
import UploadBlobModal from './upload_blob_modal.vue';
import NewDirectoryModal from './new_directory_modal.vue';
-const ROW_TYPES = {
- header: 'header',
- divider: 'divider',
-};
-
const UPLOAD_BLOB_MODAL_ID = 'modal-upload-blob';
const NEW_DIRECTORY_MODAL_ID = 'modal-new-directory';
export default {
components: {
- GlDropdown,
- GlDropdownDivider,
- GlDropdownSectionHeader,
- GlDropdownItem,
- GlIcon,
+ GlDisclosureDropdown,
UploadBlobModal,
NewDirectoryModal,
},
@@ -171,103 +156,99 @@ export default {
canCreateMrFromFork() {
return this.userPermissions?.forkProject && this.userPermissions?.createMergeRequestIn;
},
+ hasPushCodePermission() {
+ return this.userPermissions?.pushCode;
+ },
showUploadModal() {
return this.canEditTree && !this.$apollo.queries.userPermissions.loading;
},
showNewDirectoryModal() {
return this.canEditTree && !this.$apollo.queries.userPermissions.loading;
},
- dropdownItems() {
- const items = [];
-
+ dropdownDirectoryItems() {
if (this.canEditTree) {
- items.push(
+ return [
{
- type: ROW_TYPES.header,
- text: __('This directory'),
- },
- {
- attrs: {
- href: `${this.newBlobPath}/${
- this.currentPath ? encodeURIComponent(this.currentPath) : ''
- }`,
+ text: __('New file'),
+ href: joinPaths(
+ this.newBlobPath,
+ this.currentPath ? encodeURIComponent(this.currentPath) : '',
+ ),
+ extraAttrs: {
'data-qa-selector': 'new_file_menu_item',
},
- text: __('New file'),
},
{
- attrs: {
- href: '#modal-upload-blob',
- },
text: __('Upload file'),
- modalId: UPLOAD_BLOB_MODAL_ID,
- },
- );
-
- items.push({
- attrs: {
- href: '#modal-create-new-dir',
- },
- text: __('New directory'),
- modalId: NEW_DIRECTORY_MODAL_ID,
- });
- } else if (this.canCreateMrFromFork) {
- items.push(
- {
- attrs: {
- href: this.forkNewBlobPath,
- 'data-method': 'post',
- },
- text: __('New file'),
+ action: () => this.$root.$emit(BV_SHOW_MODAL, UPLOAD_BLOB_MODAL_ID),
},
{
- attrs: {
- href: this.forkUploadBlobPath,
- 'data-method': 'post',
- },
- text: __('Upload file'),
- },
- {
- attrs: {
- href: this.forkNewDirectoryPath,
- 'data-method': 'post',
- },
text: __('New directory'),
+ action: () => this.$root.$emit(BV_SHOW_MODAL, NEW_DIRECTORY_MODAL_ID),
},
- );
+ ];
}
- if (this.userPermissions?.pushCode) {
- items.push(
+ if (this.canCreateMrFromFork) {
+ return [
{
- type: ROW_TYPES.divider,
- },
- {
- type: ROW_TYPES.header,
- text: __('This repository'),
+ text: __('New file'),
+ href: this.forkNewBlobPath,
+ extraAttrs: {
+ 'data-method': 'post',
+ },
},
{
- attrs: {
- href: this.newBranchPath,
+ text: __('Upload file'),
+ href: this.forkUploadBlobPath,
+ extraAttrs: {
+ 'data-method': 'post',
},
- text: __('New branch'),
},
{
- attrs: {
- href: this.newTagPath,
+ text: __('New directory'),
+ href: this.forkNewDirectoryPath,
+ extraAttrs: {
+ 'data-method': 'post',
},
- text: __('New tag'),
},
- );
+ ];
}
- return items;
+ return [];
+ },
+ dropdownRepositoryItems() {
+ if (!this.hasPushCodePermission) return [];
+ return [
+ {
+ text: __('New branch'),
+ href: this.newBranchPath,
+ },
+ {
+ text: __('New tag'),
+ href: this.newTagPath,
+ },
+ ];
+ },
+ dropdownItems() {
+ if (this.isBlobPath) return [];
+ if (!this.canCollaborate && !this.canCreateMrFromFork) return [];
+ return [
+ this.dropdownDirectoryItems?.length && {
+ name: __('This directory'),
+ items: this.dropdownDirectoryItems,
+ },
+ this.dropdownRepositoryItems?.length && {
+ name: __('This repository'),
+ items: this.dropdownRepositoryItems,
+ },
+ ].filter(Boolean);
},
isBlobPath() {
return this.$route.name === 'blobPath' || this.$route.name === 'blobPathDecoded';
},
renderAddToTreeDropdown() {
- return !this.isBlobPath && (this.canCollaborate || this.canCreateMrFromFork);
+ return this.dropdownItems.length;
},
newDirectoryPath() {
return joinPaths(this.newDirPath, this.currentPath);
@@ -277,16 +258,6 @@ export default {
isLast(i) {
return i === this.pathLinks.length - 1;
},
- getComponent(type) {
- switch (type) {
- case ROW_TYPES.divider:
- return 'gl-dropdown-divider';
- case ROW_TYPES.header:
- return 'gl-dropdown-section-header';
- default:
- return 'gl-dropdown-item';
- }
- },
},
};
</script>
@@ -300,27 +271,15 @@ export default {
</router-link>
</li>
<li v-if="renderAddToTreeDropdown" class="breadcrumb-item">
- <gl-dropdown
+ <gl-disclosure-dropdown
+ :toggle-text="__('Add to tree')"
toggle-class="add-to-tree gl-ml-2"
data-testid="add-to-tree"
data-qa-selector="add_to_tree_dropdown"
- >
- <template #button-content>
- <span class="sr-only">{{ __('Add to tree') }}</span>
- <gl-icon name="plus" :size="16" class="float-left" />
- <gl-icon name="chevron-down" :size="16" class="float-left" />
- </template>
- <template v-for="(item, i) in dropdownItems">
- <component
- :is="getComponent(item.type)"
- :key="i"
- v-bind="item.attrs"
- v-gl-modal="item.modalId || null"
- >
- {{ item.text }}
- </component>
- </template>
- </gl-dropdown>
+ text-sr-only
+ icon="plus"
+ :items="dropdownItems"
+ />
</li>
</ol>
<upload-blob-modal
diff --git a/app/assets/javascripts/repository/components/last_commit.vue b/app/assets/javascripts/repository/components/last_commit.vue
index 82dd1fda2a0..bdc9ed210ed 100644
--- a/app/assets/javascripts/repository/components/last_commit.vue
+++ b/app/assets/javascripts/repository/components/last_commit.vue
@@ -138,7 +138,7 @@ export default {
:size="32"
/>
<div
- class="commit-detail flex-list gl-display-flex gl-justify-content-space-between gl-align-items-flex-start gl-flex-grow-1 gl-min-w-0"
+ class="commit-detail flex-list gl-display-flex gl-justify-content-space-between gl-align-items-center gl-flex-grow-1 gl-min-w-0"
>
<div class="commit-content" data-qa-selector="commit_content">
<gl-link
diff --git a/app/assets/javascripts/repository/index.js b/app/assets/javascripts/repository/index.js
index befd731a61b..c1e0104c6ac 100644
--- a/app/assets/javascripts/repository/index.js
+++ b/app/assets/javascripts/repository/index.js
@@ -8,6 +8,7 @@ import initWebIdeLink from '~/pages/projects/shared/web_ide_link';
import PerformancePlugin from '~/performance/vue_performance_plugin';
import createStore from '~/code_navigation/store';
import RefSelector from '~/ref/components/ref_selector.vue';
+import HighlightWorker from '~/vue_shared/components/source_viewer/workers/highlight_worker?worker';
import App from './components/app.vue';
import Breadcrumbs from './components/breadcrumbs.vue';
import DirectoryDownloadLinks from './components/directory_download_links.vue';
@@ -290,7 +291,12 @@ export default function setupVueRepositoryList() {
store: createStore(),
router,
apolloProvider,
- provide: { resourceId, userId, explainCodeAvailable: parseBoolean(explainCodeAvailable) },
+ provide: {
+ resourceId,
+ userId,
+ explainCodeAvailable: parseBoolean(explainCodeAvailable),
+ highlightWorker: gon.features.highlightJsWorker ? new HighlightWorker() : null,
+ },
render(h) {
return h(App);
},
diff --git a/app/assets/javascripts/repository/mixins/highlight_mixin.js b/app/assets/javascripts/repository/mixins/highlight_mixin.js
index 95d0c55bb04..822a8b4ee38 100644
--- a/app/assets/javascripts/repository/mixins/highlight_mixin.js
+++ b/app/assets/javascripts/repository/mixins/highlight_mixin.js
@@ -1,4 +1,3 @@
-import { nextTick } from 'vue';
import {
LEGACY_FALLBACKS,
EVENT_ACTION,
@@ -38,8 +37,8 @@ export default {
this.trackEvent(EVENT_LABEL_FALLBACK, language);
this?.onError();
},
- initHighlightWorker({ rawTextBlob, language, simpleViewer }) {
- if (simpleViewer?.fileType !== TEXT_FILE_TYPE) return;
+ initHighlightWorker({ rawTextBlob, language, simpleViewer, fileType }) {
+ if (simpleViewer?.fileType !== TEXT_FILE_TYPE || !this.glFeatures.highlightJsWorker) return;
if (this.isUnsupportedLanguage(language)) {
this.handleUnsupportedLanguage(language);
@@ -72,14 +71,14 @@ export default {
this.instructWorker(firstSeventyLines, language);
// Instruct the worker to start highlighting all lines in the background.
- this.instructWorker(rawTextBlob, language);
+ this.instructWorker(rawTextBlob, language, fileType);
},
handleWorkerMessage({ data }) {
this.chunks = data;
this.highlightHash(); // highlight the line if a line number hash is present in the URL
},
- instructWorker(content, language) {
- this.highlightWorker.postMessage({ content, language });
+ instructWorker(content, language, fileType) {
+ this.highlightWorker.postMessage({ content, language, fileType });
},
async highlightHash() {
const { hash } = this.$route;
@@ -97,7 +96,7 @@ export default {
}
// Line numbers in the DOM needs to update first based on changes made to `chunks`.
- await nextTick();
+ await this.$nextTick();
const lineHighlighter = new LineHighlighter({ scrollBehavior: 'auto' });
lineHighlighter.highlightHash(hash);
diff --git a/app/assets/javascripts/search/sidebar/components/label_filter/index.vue b/app/assets/javascripts/search/sidebar/components/label_filter/index.vue
index 74855482b5d..eb3556ac2cf 100644
--- a/app/assets/javascripts/search/sidebar/components/label_filter/index.vue
+++ b/app/assets/javascripts/search/sidebar/components/label_filter/index.vue
@@ -14,17 +14,11 @@ import { mapActions, mapState, mapGetters } from 'vuex';
import { uniq } from 'lodash';
import { rgbFromHex } from '@gitlab/ui/dist/utils/utils';
import { slugify } from '~/lib/utils/text_utility';
-import { s__, sprintf } from '~/locale';
+import { sprintf } from '~/locale';
import DropdownKeyboardNavigation from '~/vue_shared/components/dropdown_keyboard_navigation.vue';
-import {
- SEARCH_INPUT_DESCRIBE_BY_NO_DROPDOWN,
- SEARCH_INPUT_DESCRIBE_BY_WITH_DROPDOWN,
- SEARCH_DESCRIBED_BY_DEFAULT,
- SEARCH_DESCRIBED_BY_UPDATED,
- SEARCH_RESULTS_LOADING,
-} from '~/vue_shared/global_search/constants';
+import { I18N } from '~/vue_shared/global_search/constants';
import { HR_DEFAULT_CLASSES, ONLY_SHOW_MD } from '../../constants';
import LabelDropdownItems from './label_dropdown_items.vue';
@@ -60,16 +54,7 @@ export default {
isFocused: false,
};
},
- i18n: {
- SEARCH_LABELS: s__('GlobalSearch|Search labels'),
- DROPDOWN_HEADER: s__('GlobalSearch|Label(s)'),
- AGGREGATIONS_ERROR_MESSAGE: s__('GlobalSearch|Fetching aggregations error.'),
- SEARCH_DESCRIBED_BY_DEFAULT,
- SEARCH_RESULTS_LOADING,
- SEARCH_DESCRIBED_BY_UPDATED,
- SEARCH_INPUT_DESCRIBE_BY_WITH_DROPDOWN,
- SEARCH_INPUT_DESCRIBE_BY_NO_DROPDOWN,
- },
+ i18n: I18N,
computed: {
...mapState(['useSidebarNavigation', 'searchLabelString', 'query', 'aggregations']),
...mapGetters([
@@ -260,7 +245,7 @@ export default {
:default-index="defaultIndex"
:enable-cycle="true"
/>
- <div v-if="!aggregations.error">
+ <div v-if="!aggregations.error && filteredLabels.length > 0">
<gl-dropdown-section-header v-if="hasSelectedLabels || hasUnselectedLabels">{{
$options.i18n.DROPDOWN_HEADER
}}</gl-dropdown-section-header>
@@ -280,7 +265,13 @@ export default {
</gl-form-checkbox-group>
</gl-dropdown-form>
</div>
- <gl-alert v-else :dismissible="false" variant="danger">
+ <span
+ v-if="!aggregations.error && filteredLabels.length === 0"
+ class="gl-px-3"
+ data-testid="no-labels-found-message"
+ >{{ $options.i18n.NO_LABELS_FOUND }}</span
+ >
+ <gl-alert v-if="aggregations.error" :dismissible="false" variant="danger">
{{ $options.i18n.AGGREGATIONS_ERROR_MESSAGE }}
</gl-alert>
<gl-loading-icon v-if="aggregations.fetching" size="lg" class="my-4" />
diff --git a/app/assets/javascripts/search/sidebar/components/label_filter/label_dropdown_items.vue b/app/assets/javascripts/search/sidebar/components/label_filter/label_dropdown_items.vue
index 7a9e6a2e4fc..0b468a60cf0 100644
--- a/app/assets/javascripts/search/sidebar/components/label_filter/label_dropdown_items.vue
+++ b/app/assets/javascripts/search/sidebar/components/label_filter/label_dropdown_items.vue
@@ -26,15 +26,15 @@ export default {
class="gl-px-5 gl-py-3 label-filter-menu-item"
>
<gl-form-checkbox
- class="label-with-color-checkbox gl-display-inline-flex gl-h-5 gl-min-h-5"
+ class="label-with-color-checkbox gl-display-inline-flex gl-min-h-5"
:value="label.key"
>
<span
data-testid="label-color-indicator"
- class="gl-rounded-base gl-w-5 gl-h-5 gl-display-inline-block gl-vertical-align-bottom gl-mr-3"
+ class="gl-rounded-base gl-min-w-5 gl-h-5 gl-display-inline-block gl-vertical-align-bottom gl-mr-3"
:style="{ 'background-color': label.color }"
></span>
- <span class="gl-reset-text-align gl-m-0 gl-p-0 label-title">{{
+ <span class="gl-reset-text-align gl-m-0 gl-p-0 label-title gl-word-break-all">{{
label.title
}}</span></gl-form-checkbox
>
diff --git a/app/assets/javascripts/search/store/constants.js b/app/assets/javascripts/search/store/constants.js
index 91c16616f02..bb112c122ae 100644
--- a/app/assets/javascripts/search/store/constants.js
+++ b/app/assets/javascripts/search/store/constants.js
@@ -23,11 +23,13 @@ export const NUMBER_FORMATING_OPTIONS = { notation: 'compact', compactDisplay: '
export const ICON_MAP = {
blobs: 'code',
issues: 'issues',
+ epics: 'epic',
merge_requests: 'merge-request',
commits: 'commit',
notes: 'comments',
- milestones: 'tag',
+ milestones: 'clock',
users: 'users',
projects: 'project',
- wiki_blobs: 'overview',
+ wiki_blobs: 'book',
+ snippet_titles: 'snippet',
};
diff --git a/app/assets/javascripts/search/topbar/components/group_filter.vue b/app/assets/javascripts/search/topbar/components/group_filter.vue
index e5edb21792a..4798f1127eb 100644
--- a/app/assets/javascripts/search/topbar/components/group_filter.vue
+++ b/app/assets/javascripts/search/topbar/components/group_filter.vue
@@ -19,7 +19,7 @@ export default {
},
computed: {
...mapState(['query', 'groups', 'fetchingGroups']),
- ...mapGetters(['frequentGroups']),
+ ...mapGetters(['frequentGroups', 'currentScope']),
selectedGroup() {
return isEmpty(this.initialData) ? ANY_OPTION : this.initialData;
},
@@ -43,6 +43,7 @@ export default {
[GROUP_DATA.queryParam]: group.id,
[PROJECT_DATA.queryParam]: null,
nav_source: null,
+ scope: this.currentScope,
}),
);
},
diff --git a/app/assets/javascripts/search/topbar/components/project_filter.vue b/app/assets/javascripts/search/topbar/components/project_filter.vue
index 85cf2ddbbff..1cce3e3db8b 100644
--- a/app/assets/javascripts/search/topbar/components/project_filter.vue
+++ b/app/assets/javascripts/search/topbar/components/project_filter.vue
@@ -18,7 +18,7 @@ export default {
},
computed: {
...mapState(['query', 'projects', 'fetchingProjects']),
- ...mapGetters(['frequentProjects']),
+ ...mapGetters(['frequentProjects', 'currentScope']),
selectedProject() {
return this.initialData ? this.initialData : ANY_OPTION;
},
@@ -42,6 +42,7 @@ export default {
...(project.namespace?.id && { [GROUP_DATA.queryParam]: project.namespace.id }),
[PROJECT_DATA.queryParam]: project.id,
nav_source: null,
+ scope: this.currentScope,
};
visitUrl(setUrlParams(queryParams));
diff --git a/app/assets/javascripts/security_configuration/components/training_provider_list.vue b/app/assets/javascripts/security_configuration/components/training_provider_list.vue
index 578d7c8a18c..f5f88e12163 100644
--- a/app/assets/javascripts/security_configuration/components/training_provider_list.vue
+++ b/app/assets/javascripts/security_configuration/components/training_provider_list.vue
@@ -247,7 +247,7 @@ export default {
:label="__('Training mode')"
label-position="hidden"
:disabled="!securityTrainingEnabled"
- data-qa-selector="security_training_toggle"
+ data-testid="security-training-toggle"
:data-qa-training-provider="provider.name"
@change="toggleProvider(provider)"
/>
diff --git a/app/assets/javascripts/service_desk/components/info_banner.vue b/app/assets/javascripts/service_desk/components/info_banner.vue
new file mode 100644
index 00000000000..8aaced839a5
--- /dev/null
+++ b/app/assets/javascripts/service_desk/components/info_banner.vue
@@ -0,0 +1,64 @@
+<script>
+import { GlLink, GlButton } from '@gitlab/ui';
+import {
+ infoBannerTitle,
+ infoBannerAdminNote,
+ infoBannerUserNote,
+ enableServiceDesk,
+ learnMore,
+} from '../constants';
+
+export default {
+ name: 'InfoBanner',
+ components: {
+ GlLink,
+ GlButton,
+ },
+ inject: [
+ 'serviceDeskCalloutSvgPath',
+ 'serviceDeskEmailAddress',
+ 'canAdminIssues',
+ 'canEditProjectSettings',
+ 'serviceDeskSettingsPath',
+ 'isServiceDeskEnabled',
+ 'serviceDeskHelpPath',
+ ],
+ i18n: { infoBannerTitle, infoBannerAdminNote, infoBannerUserNote, enableServiceDesk, learnMore },
+ computed: {
+ canSeeEmailAddress() {
+ return this.canAdminIssues && this.isServiceDeskEnabled;
+ },
+ canEnableServiceDesk() {
+ return this.canEditProjectSettings && !this.isServiceDeskEnabled;
+ },
+ },
+};
+</script>
+
+<template>
+ <div class="gl-border-b gl-pb-3 gl-display-flex gl-align-items-flex-start">
+ <!-- eslint-disable @gitlab/vue-require-i18n-attribute-strings -->
+ <img
+ :src="serviceDeskCalloutSvgPath"
+ alt=""
+ class="gl-display-none gl-sm-display-block gl-p-5"
+ />
+ <!-- eslint-enable @gitlab/vue-require-i18n-attribute-strings -->
+ <div class="gl-mt-3 gl-ml-3">
+ <h5>{{ $options.i18n.infoBannerTitle }}</h5>
+ <p v-if="canSeeEmailAddress">
+ {{ $options.i18n.infoBannerAdminNote }} <code>{{ serviceDeskEmailAddress }}</code>
+ </p>
+ <p>
+ {{ $options.i18n.infoBannerUserNote }}
+ <gl-link :href="serviceDeskHelpPath" target="_blank">{{ $options.i18n.learnMore }}</gl-link
+ >.
+ </p>
+ <p v-if="canEnableServiceDesk" class="gl-mt-3">
+ <gl-button :href="serviceDeskSettingsPath" variant="confirm">{{
+ $options.i18n.enableServiceDesk
+ }}</gl-button>
+ </p>
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/service_desk/components/service_desk_list_app.vue b/app/assets/javascripts/service_desk/components/service_desk_list_app.vue
new file mode 100644
index 00000000000..e8b05642e7d
--- /dev/null
+++ b/app/assets/javascripts/service_desk/components/service_desk_list_app.vue
@@ -0,0 +1,151 @@
+<script>
+import { GlEmptyState } from '@gitlab/ui';
+import * as Sentry from '@sentry/browser';
+import { fetchPolicies } from '~/lib/graphql';
+import IssuableList from '~/vue_shared/issuable/list/components/issuable_list_root.vue';
+import { issuableListTabs } from '~/vue_shared/issuable/list/constants';
+import { STATUS_OPEN, STATUS_CLOSED, STATUS_ALL } from '~/issues/constants';
+import getServiceDeskIssuesQuery from '../queries/get_service_desk_issues.query.graphql';
+import getServiceDeskIssuesCounts from '../queries/get_service_desk_issues_counts.query.graphql';
+import {
+ errorFetchingCounts,
+ errorFetchingIssues,
+ noSearchNoFilterTitle,
+ searchPlaceholder,
+ SERVICE_DESK_BOT_USERNAME,
+} from '../constants';
+import InfoBanner from './info_banner.vue';
+
+export default {
+ i18n: {
+ errorFetchingCounts,
+ errorFetchingIssues,
+ noSearchNoFilterTitle,
+ searchPlaceholder,
+ },
+ issuableListTabs,
+ components: {
+ GlEmptyState,
+ IssuableList,
+ InfoBanner,
+ },
+ inject: [
+ 'emptyStateSvgPath',
+ 'isProject',
+ 'isSignedIn',
+ 'fullPath',
+ 'isServiceDeskSupported',
+ 'hasAnyIssues',
+ ],
+ data() {
+ return {
+ serviceDeskIssues: [],
+ serviceDeskIssuesCounts: {},
+ searchTokens: [],
+ sortOptions: [],
+ state: STATUS_OPEN,
+ issuesError: null,
+ };
+ },
+ apollo: {
+ serviceDeskIssues: {
+ query: getServiceDeskIssuesQuery,
+ variables() {
+ return this.queryVariables;
+ },
+ update(data) {
+ return data.project.issues.nodes ?? [];
+ },
+ fetchPolicy: fetchPolicies.CACHE_AND_NETWORK,
+ // We need this for handling loading state when using frontend cache
+ // See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/106004#note_1217325202 for details
+ notifyOnNetworkStatusChange: true,
+ result({ data }) {
+ if (!data) {
+ return;
+ }
+ this.pageInfo = data?.project.issues.pageInfo ?? {};
+ },
+ error(error) {
+ this.issuesError = this.$options.i18n.errorFetchingIssues;
+ Sentry.captureException(error);
+ },
+ skip() {
+ return !this.hasAnyIssues;
+ },
+ },
+ serviceDeskIssuesCounts: {
+ query: getServiceDeskIssuesCounts,
+ variables() {
+ return this.queryVariables;
+ },
+ update(data) {
+ return data?.project ?? {};
+ },
+ error(error) {
+ this.issuesError = this.$options.i18n.errorFetchingCounts;
+ Sentry.captureException(error);
+ },
+ context: {
+ isSingleRequest: true,
+ },
+ },
+ },
+ computed: {
+ queryVariables() {
+ return {
+ fullPath: this.fullPath,
+ isProject: this.isProject,
+ isSignedIn: this.isSignedIn,
+ authorUsername: SERVICE_DESK_BOT_USERNAME,
+ state: this.state,
+ };
+ },
+ tabCounts() {
+ const { openedIssues, closedIssues, allIssues } = this.serviceDeskIssuesCounts;
+ return {
+ [STATUS_OPEN]: openedIssues?.count,
+ [STATUS_CLOSED]: closedIssues?.count,
+ [STATUS_ALL]: allIssues?.count,
+ };
+ },
+ isInfoBannerVisible() {
+ return this.isServiceDeskSupported && this.hasAnyIssues;
+ },
+ },
+ methods: {
+ handleClickTab(state) {
+ if (this.state === state) {
+ return;
+ }
+ this.state = state;
+ },
+ },
+};
+</script>
+
+<template>
+ <section>
+ <info-banner v-if="isInfoBannerVisible" />
+ <issuable-list
+ namespace="service-desk"
+ recent-searches-storage-key="issues"
+ :error="issuesError"
+ :search-input-placeholder="$options.i18n.searchPlaceholder"
+ :search-tokens="searchTokens"
+ :sort-options="sortOptions"
+ :issuables="serviceDeskIssues"
+ :tabs="$options.issuableListTabs"
+ :tab-counts="tabCounts"
+ :current-tab="state"
+ @click-tab="handleClickTab"
+ >
+ <template #empty-state>
+ <gl-empty-state
+ :svg-path="emptyStateSvgPath"
+ :title="$options.i18n.noSearchNoFilterTitle"
+ />
+ </template>
+ </issuable-list>
+ </section>
+</template>
diff --git a/app/assets/javascripts/service_desk/constants.js b/app/assets/javascripts/service_desk/constants.js
new file mode 100644
index 00000000000..685ad738792
--- /dev/null
+++ b/app/assets/javascripts/service_desk/constants.js
@@ -0,0 +1,17 @@
+import { __, s__ } from '~/locale';
+
+export const SERVICE_DESK_BOT_USERNAME = 'support-bot';
+
+export const errorFetchingCounts = __('An error occurred while getting issue counts');
+export const errorFetchingIssues = __('An error occurred while loading issues');
+export const noSearchNoFilterTitle = __('Please select at least one filter to see results');
+export const searchPlaceholder = __('Search or filter results...');
+export const infoBannerTitle = s__(
+ 'ServiceDesk|Use Service Desk to connect with your users and offer customer support through email right inside GitLab',
+);
+export const infoBannerAdminNote = s__('ServiceDesk|Your users can send emails to this address:');
+export const infoBannerUserNote = s__(
+ 'ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation.',
+);
+export const enableServiceDesk = s__('ServiceDesk|Enable Service Desk');
+export const learnMore = __('Learn more');
diff --git a/app/assets/javascripts/service_desk/graphql.js b/app/assets/javascripts/service_desk/graphql.js
new file mode 100644
index 00000000000..e01973f1e8a
--- /dev/null
+++ b/app/assets/javascripts/service_desk/graphql.js
@@ -0,0 +1,24 @@
+import createDefaultClient, { createApolloClientWithCaching } from '~/lib/graphql';
+
+let client;
+
+const typePolicies = {
+ Project: {
+ fields: {
+ issues: {
+ merge: true,
+ },
+ },
+ },
+};
+
+export async function gqlClient() {
+ if (client) return client;
+ client = gon.features?.frontendCaching
+ ? await createApolloClientWithCaching(
+ {},
+ { localCacheKey: 'service_desk_list', cacheConfig: { typePolicies } },
+ )
+ : createDefaultClient({}, { cacheConfig: { typePolicies } });
+ return client;
+}
diff --git a/app/assets/javascripts/service_desk/index.js b/app/assets/javascripts/service_desk/index.js
new file mode 100644
index 00000000000..a9172f96540
--- /dev/null
+++ b/app/assets/javascripts/service_desk/index.js
@@ -0,0 +1,55 @@
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import { parseBoolean } from '~/lib/utils/common_utils';
+import { gqlClient } from './graphql';
+import ServiceDeskListApp from './components/service_desk_list_app.vue';
+
+export async function mountServiceDeskListApp() {
+ const el = document.querySelector('.js-service-desk-list');
+
+ if (!el) {
+ return null;
+ }
+
+ const {
+ projectDataEmptyStateSvgPath,
+ projectDataFullPath,
+ projectDataIsProject,
+ projectDataIsSignedIn,
+ projectDataHasAnyIssues,
+ serviceDeskEmailAddress,
+ canAdminIssues,
+ canEditProjectSettings,
+ serviceDeskCalloutSvgPath,
+ serviceDeskSettingsPath,
+ serviceDeskHelpPath,
+ isServiceDeskSupported,
+ isServiceDeskEnabled,
+ } = el.dataset;
+
+ Vue.use(VueApollo);
+
+ return new Vue({
+ el,
+ name: 'ServiceDeskListRoot',
+ apolloProvider: new VueApollo({
+ defaultClient: await gqlClient(),
+ }),
+ provide: {
+ emptyStateSvgPath: projectDataEmptyStateSvgPath,
+ fullPath: projectDataFullPath,
+ isProject: parseBoolean(projectDataIsProject),
+ isSignedIn: parseBoolean(projectDataIsSignedIn),
+ serviceDeskEmailAddress,
+ canAdminIssues: parseBoolean(canAdminIssues),
+ canEditProjectSettings: parseBoolean(canEditProjectSettings),
+ serviceDeskCalloutSvgPath,
+ serviceDeskSettingsPath,
+ serviceDeskHelpPath,
+ isServiceDeskSupported: parseBoolean(isServiceDeskSupported),
+ isServiceDeskEnabled: parseBoolean(isServiceDeskEnabled),
+ hasAnyIssues: parseBoolean(projectDataHasAnyIssues),
+ },
+ render: (createComponent) => createComponent(ServiceDeskListApp),
+ });
+}
diff --git a/app/assets/javascripts/service_desk/queries/get_service_desk_issues.query.graphql b/app/assets/javascripts/service_desk/queries/get_service_desk_issues.query.graphql
new file mode 100644
index 00000000000..c678b8dd8ab
--- /dev/null
+++ b/app/assets/javascripts/service_desk/queries/get_service_desk_issues.query.graphql
@@ -0,0 +1,72 @@
+#import "~/graphql_shared/fragments/page_info.fragment.graphql"
+#import "./issue.fragment.graphql"
+
+query getServiceDeskIssues(
+ $hideUsers: Boolean = false
+ $isProject: Boolean = false
+ $isSignedIn: Boolean = false
+ $fullPath: ID!
+ $iid: String
+ $search: String
+ $sort: IssueSort
+ $state: IssuableState
+ $in: [IssuableSearchableField!]
+ $assigneeId: String
+ $assigneeUsernames: [String!]
+ $authorUsername: String
+ $confidential: Boolean
+ $labelName: [String]
+ $milestoneTitle: [String]
+ $milestoneWildcardId: MilestoneWildcardId
+ $myReactionEmoji: String
+ $releaseTag: [String!]
+ $releaseTagWildcardId: ReleaseTagWildcardId
+ $types: [IssueType!]
+ $crmContactId: String
+ $crmOrganizationId: String
+ $not: NegatedIssueFilterInput
+ $or: UnionedIssueFilterInput
+ $beforeCursor: String
+ $afterCursor: String
+ $firstPageSize: Int
+ $lastPageSize: Int
+) {
+ project(fullPath: $fullPath) @include(if: $isProject) @persist {
+ id
+ issues(
+ iid: $iid
+ search: $search
+ sort: $sort
+ state: $state
+ in: $in
+ assigneeId: $assigneeId
+ assigneeUsernames: $assigneeUsernames
+ authorUsername: $authorUsername
+ confidential: $confidential
+ labelName: $labelName
+ milestoneTitle: $milestoneTitle
+ milestoneWildcardId: $milestoneWildcardId
+ myReactionEmoji: $myReactionEmoji
+ releaseTag: $releaseTag
+ releaseTagWildcardId: $releaseTagWildcardId
+ types: $types
+ crmContactId: $crmContactId
+ crmOrganizationId: $crmOrganizationId
+ not: $not
+ or: $or
+ before: $beforeCursor
+ after: $afterCursor
+ first: $firstPageSize
+ last: $lastPageSize
+ ) {
+ __persist
+ pageInfo {
+ ...PageInfo
+ }
+ nodes {
+ __persist
+ ...IssueFragment
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/service_desk/queries/get_service_desk_issues_counts.query.graphql b/app/assets/javascripts/service_desk/queries/get_service_desk_issues_counts.query.graphql
new file mode 100644
index 00000000000..c2ba397d76f
--- /dev/null
+++ b/app/assets/javascripts/service_desk/queries/get_service_desk_issues_counts.query.graphql
@@ -0,0 +1,91 @@
+query getServiceDeskIssuesCount(
+ $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!]
+ $crmContactId: String
+ $crmOrganizationId: String
+ $not: NegatedIssueFilterInput
+ $or: UnionedIssueFilterInput
+) {
+ 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
+ crmContactId: $crmContactId
+ crmOrganizationId: $crmOrganizationId
+ not: $not
+ or: $or
+ ) {
+ 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
+ crmContactId: $crmContactId
+ crmOrganizationId: $crmOrganizationId
+ not: $not
+ or: $or
+ ) {
+ 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
+ crmContactId: $crmContactId
+ crmOrganizationId: $crmOrganizationId
+ not: $not
+ or: $or
+ ) {
+ count
+ }
+ }
+}
diff --git a/app/assets/javascripts/service_desk/queries/issue.fragment.graphql b/app/assets/javascripts/service_desk/queries/issue.fragment.graphql
new file mode 100644
index 00000000000..3b49c0efb14
--- /dev/null
+++ b/app/assets/javascripts/service_desk/queries/issue.fragment.graphql
@@ -0,0 +1,60 @@
+fragment IssueFragment on Issue {
+ id
+ iid
+ confidential
+ createdAt
+ downvotes
+ dueDate
+ hidden
+ humanTimeEstimate
+ mergeRequestsCount
+ moved
+ state
+ title
+ updatedAt
+ closedAt
+ upvotes
+ userDiscussionsCount @include(if: $isSignedIn)
+ webPath
+ webUrl
+ type
+ assignees @skip(if: $hideUsers) {
+ nodes {
+ __persist
+ id
+ avatarUrl
+ name
+ username
+ webUrl
+ }
+ }
+ author @skip(if: $hideUsers) {
+ __persist
+ id
+ avatarUrl
+ name
+ username
+ webUrl
+ }
+ labels {
+ nodes {
+ __persist
+ id
+ color
+ title
+ description
+ }
+ }
+ milestone {
+ __persist
+ id
+ dueDate
+ startDate
+ webPath
+ title
+ }
+ taskCompletionStatus {
+ completedCount
+ count
+ }
+}
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 2c6eb0e5001..820d2e94016 100644
--- a/app/assets/javascripts/sidebar/components/assignees/assignee_avatar_link.vue
+++ b/app/assets/javascripts/sidebar/components/assignees/assignee_avatar_link.vue
@@ -2,46 +2,8 @@
import { GlTooltipDirective, GlLink } from '@gitlab/ui';
import { TYPE_ISSUE, TYPE_MERGE_REQUEST } from '~/issues/constants';
import { isGid, getIdFromGraphQLId } from '~/graphql_shared/utils';
-import { __ } from '~/locale';
-import { isUserBusy } from '~/set_status_modal/utils';
import AssigneeAvatar from './assignee_avatar.vue';
-const I18N = {
- BUSY: __('Busy'),
- CANNOT_MERGE: __('Cannot merge'),
- LC_CANNOT_MERGE: __('cannot merge'),
-};
-
-const paranthesize = (str) => `(${str})`;
-
-const generateAssigneeTooltip = ({
- name,
- availability,
- cannotMerge = true,
- tooltipHasName = false,
-}) => {
- if (!tooltipHasName) {
- return cannotMerge ? I18N.CANNOT_MERGE : '';
- }
-
- const statusInformation = [];
- if (availability && isUserBusy(availability)) {
- statusInformation.push(I18N.BUSY);
- }
-
- if (cannotMerge) {
- statusInformation.push(I18N.LC_CANNOT_MERGE);
- }
-
- if (tooltipHasName && statusInformation.length) {
- const status = statusInformation.map(paranthesize).join(' ');
-
- return `${name} ${status}`;
- }
-
- return name;
-};
-
export default {
components: {
AssigneeAvatar,
@@ -55,16 +17,6 @@ export default {
type: Object,
required: true,
},
- tooltipPlacement: {
- type: String,
- default: 'bottom',
- required: false,
- },
- tooltipHasName: {
- type: Boolean,
- default: true,
- required: false,
- },
issuableType: {
type: String,
default: TYPE_ISSUE,
@@ -79,34 +31,10 @@ export default {
const canMerge = this.user.mergeRequestInteraction?.canMerge || this.user.can_merge;
return this.isMergeRequest && !canMerge;
},
- tooltipTitle() {
- const { name = '', availability = '' } = this.user;
- return generateAssigneeTooltip({
- name,
- availability,
- cannotMerge: this.cannotMerge,
- tooltipHasName: this.tooltipHasName,
- });
- },
- tooltipOption() {
- if (this.isMergeRequest) {
- return null;
- }
-
- return {
- container: 'body',
- placement: this.tooltipPlacement,
- boundary: 'viewport',
- };
- },
assigneeUrl() {
return this.user.web_url || this.user.webUrl;
},
assigneeId() {
- if (this.isMergeRequest) {
- return null;
- }
-
return isGid(this.user.id) ? getIdFromGraphQLId(this.user.id) : this.user.id;
},
},
@@ -116,10 +44,10 @@ export default {
<template>
<!-- must be `d-inline-block` or parent flex-basis causes width issues -->
<gl-link
- v-gl-tooltip="tooltipOption"
:href="assigneeUrl"
- :title="tooltipTitle"
:data-user-id="assigneeId"
+ :data-username="user.username"
+ :data-cannot-merge="cannotMerge"
data-placement="left"
class="gl-display-inline-block js-user-link"
>
diff --git a/app/assets/javascripts/sidebar/components/assignees/assignee_title.vue b/app/assets/javascripts/sidebar/components/assignees/assignee_title.vue
index 2a9100f0cb5..609a9355d20 100644
--- a/app/assets/javascripts/sidebar/components/assignees/assignee_title.vue
+++ b/app/assets/javascripts/sidebar/components/assignees/assignee_title.vue
@@ -1,15 +1,12 @@
<script>
-import { GlLoadingIcon, GlIcon } from '@gitlab/ui';
+import { GlLoadingIcon } from '@gitlab/ui';
import { n__, __ } from '~/locale';
-import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
export default {
name: 'AssigneeTitle',
components: {
GlLoadingIcon,
- GlIcon,
},
- mixins: [glFeatureFlagMixin()],
props: {
loading: {
type: Boolean,
@@ -24,11 +21,6 @@ export default {
type: Boolean,
required: true,
},
- showToggle: {
- type: Boolean,
- required: false,
- default: false,
- },
changing: {
type: Boolean,
required: false,
@@ -62,15 +54,5 @@ export default {
>
{{ titleCopy }}
</a>
- <a
- 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"
- >
- <gl-icon data-hidden="true" name="chevron-double-lg-right" :size="12" />
- </a>
</div>
</template>
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 884edc97016..577c01c50ff 100644
--- a/app/assets/javascripts/sidebar/components/assignees/collapsed_assignee_list.vue
+++ b/app/assets/javascripts/sidebar/components/assignees/collapsed_assignee_list.vue
@@ -17,7 +17,7 @@ const generateCollapsedAssigneeTooltip = ({ renderUsers, allUsers, tooltipTitleM
});
if (!allUsers.length) {
- return __('Assignee(s)');
+ return __('Assignees');
}
if (allUsers.length > names.length) {
names.push(sprintf(__('+ %{amount} more'), { amount: allUsers.length - names.length }));
diff --git a/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees.vue b/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees.vue
index 062f63175a7..0563ed8394c 100644
--- a/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees.vue
+++ b/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees.vue
@@ -27,11 +27,6 @@ export default {
type: String,
required: true,
},
- signedIn: {
- type: Boolean,
- required: false,
- default: false,
- },
issuableType: {
type: String,
required: false,
@@ -143,7 +138,6 @@ export default {
:number-of-assignees="store.assignees.length"
:loading="loading || store.isFetching.assignees"
:editable="store.editable"
- :show-toggle="!signedIn"
:changing="store.changing"
/>
<assignees
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 b424d9074d0..930e7ff12d9 100644
--- a/app/assets/javascripts/sidebar/components/assignees/uncollapsed_assignee_list.vue
+++ b/app/assets/javascripts/sidebar/components/assignees/uncollapsed_assignee_list.vue
@@ -77,14 +77,13 @@ export default {
v-for="(user, index) in uncollapsedUsers"
:key="user.id"
:class="{
- 'gl-mb-3': index !== users.length - 1,
+ 'gl-mb-3': index !== users.length - 1 || users.length > 5,
}"
class="assignee-grid gl-display-grid gl-align-items-center gl-w-full"
>
<assignee-avatar-link
:user="user"
:issuable-type="issuableType"
- :tooltip-has-name="!isMergeRequest"
class="gl-word-break-word"
data-css-area="user"
>
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 916ff70a5ea..398a94356e2 100644
--- a/app/assets/javascripts/sidebar/components/crm_contacts/crm_contacts.vue
+++ b/app/assets/javascripts/sidebar/components/crm_contacts/crm_contacts.vue
@@ -4,10 +4,12 @@ import { __, n__, sprintf } from '~/locale';
import { createAlert } from '~/alert';
import { convertToGraphQLId, getIdFromGraphQLId } from '~/graphql_shared/utils';
import { TYPENAME_ISSUE } from '~/graphql_shared/constants';
+import { DOCS_URL_IN_EE_DIR } from 'jh_else_ce/lib/utils/url_utility';
import getIssueCrmContactsQuery from '../../queries/get_issue_crm_contacts.query.graphql';
import issueCrmContactsSubscription from '../../queries/issue_crm_contacts.subscription.graphql';
export default {
+ crmDocsLink: `${DOCS_URL_IN_EE_DIR}/user/crm/`,
components: {
GlIcon,
GlLink,
@@ -104,9 +106,7 @@ export default {
<span> {{ contactCount }} </span>
</div>
<div class="hide-collapsed help-button gl-float-right">
- <gl-link href="https://docs.gitlab.com/ee/user/crm/" target="_blank"
- ><gl-icon name="question-o"
- /></gl-link>
+ <gl-link :href="$options.crmDocsLink" target="_blank"><gl-icon name="question-o" /></gl-link>
</div>
<div class="title hide-collapsed gl-mb-2 gl-line-height-20 gl-font-weight-bold">
{{ contactsLabel }}
diff --git a/app/assets/javascripts/sidebar/components/labels/labels_select_vue/dropdown_contents.vue b/app/assets/javascripts/sidebar/components/labels/labels_select_vue/dropdown_contents.vue
index 89a976d45fa..1c27df2418d 100644
--- a/app/assets/javascripts/sidebar/components/labels/labels_select_vue/dropdown_contents.vue
+++ b/app/assets/javascripts/sidebar/components/labels/labels_select_vue/dropdown_contents.vue
@@ -40,7 +40,6 @@ export default {
<div
class="labels-select-dropdown-contents gl-w-full gl-my-2 gl-py-3 gl-rounded-base gl-absolute"
data-testid="labels-select-dropdown-contents"
- data-qa-selector="labels_dropdown_content"
:style="directionStyle"
>
<component :is="dropdownContentsView" />
diff --git a/app/assets/javascripts/sidebar/components/labels/labels_select_widget/dropdown_contents.vue b/app/assets/javascripts/sidebar/components/labels/labels_select_widget/dropdown_contents.vue
index b44096c7743..53582aacabd 100644
--- a/app/assets/javascripts/sidebar/components/labels/labels_select_widget/dropdown_contents.vue
+++ b/app/assets/javascripts/sidebar/components/labels/labels_select_widget/dropdown_contents.vue
@@ -20,6 +20,11 @@ export default {
GlDropdownItem,
GlLink,
},
+ inject: {
+ toggleAttrs: {
+ default: () => ({}),
+ },
+ },
props: {
labelsCreateTitle: {
type: String,
@@ -204,7 +209,7 @@ export default {
class="gl-w-full"
block
data-testid="labels-select-dropdown-contents"
- data-qa-selector="labels_dropdown_content"
+ :toggle-attrs="toggleAttrs"
@hide="handleDropdownHide"
@shown="setFocus"
>
@@ -219,7 +224,7 @@ export default {
@toggleDropdownContentsCreateView="toggleDropdownContent"
@closeDropdown="hideDropdown"
@input="debouncedSearchKeyUpdate"
- @searchEnter="selectFirstItem"
+ @searchEnter.prevent="selectFirstItem"
/>
</template>
<template #default>
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 1d9233db361..1ea8ab19012 100644
--- a/app/assets/javascripts/sidebar/components/lock/issuable_lock_form.vue
+++ b/app/assets/javascripts/sidebar/components/lock/issuable_lock_form.vue
@@ -19,12 +19,12 @@ export default {
locked: {
icon: 'lock',
class: 'value',
- iconClass: 'is-active',
+ displayText: __('Locked'),
},
unlocked: {
class: ['no-value hide-collapsed'],
icon: 'lock-open',
- iconClass: '',
+ displayText: __('Unlocked'),
},
components: {
EditForm,
@@ -49,8 +49,6 @@ export default {
issueCapitalized: __('Issue'),
mergeRequest: __('merge request'),
mergeRequestCapitalized: __('Merge request'),
- locked: __('Locked'),
- unlocked: __('Unlocked'),
lockingMergeRequest: __('Locking %{issuableDisplayName}'),
unlockingMergeRequest: __('Unlocking %{issuableDisplayName}'),
lockMergeRequest: __('Lock %{issuableDisplayName}'),
@@ -84,10 +82,7 @@ export default {
return this.getNoteableData.discussion_locked;
},
lockStatus() {
- return this.isLocked ? this.$options.i18n.locked : this.$options.i18n.unlocked;
- },
- tooltipLabel() {
- return this.isLocked ? this.$options.i18n.locked : this.$options.i18n.unlocked;
+ return this.isLocked ? this.$options.locked : this.$options.unlocked;
},
lockToggleInProgressText() {
return this.isLocked ? this.unlockingMergeRequestText : this.lockingMergeRequestText;
@@ -205,7 +200,7 @@ export default {
</gl-disclosure-dropdown-item>
<div v-else class="block issuable-sidebar-item lock">
<div
- v-gl-tooltip.left.viewport="{ title: tooltipLabel }"
+ v-gl-tooltip.left.viewport="{ title: lockStatus.displayText }"
class="sidebar-collapsed-icon"
data-testid="sidebar-collapse-icon"
@click="toggleForm"
@@ -239,7 +234,7 @@ export default {
/>
<div data-testid="lock-status" class="sidebar-item-value" :class="lockStatus.class">
- {{ lockStatus }}
+ {{ lockStatus.displayText }}
</div>
</div>
</div>
diff --git a/app/assets/javascripts/sidebar/components/participants/participants.vue b/app/assets/javascripts/sidebar/components/participants/participants.vue
index bbd3cda0ad3..bad73273409 100644
--- a/app/assets/javascripts/sidebar/components/participants/participants.vue
+++ b/app/assets/javascripts/sidebar/components/participants/participants.vue
@@ -1,6 +1,7 @@
<script>
import { GlButton, GlIcon, GlLoadingIcon, GlTooltipDirective } from '@gitlab/ui';
import { __, n__, sprintf } from '~/locale';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import UserAvatarImage from '~/vue_shared/components/user_avatar/user_avatar_image.vue';
export default {
@@ -81,6 +82,9 @@ export default {
toggleMoreParticipants() {
this.isShowingMoreParticipants = !this.isShowingMoreParticipants;
},
+ getParticipantId(participantId) {
+ return getIdFromGraphQLId(participantId);
+ },
onClickCollapsedIcon() {
this.$emit('toggleSidebar');
},
@@ -118,13 +122,14 @@ export default {
>
<a
:href="participant.web_url || participant.webUrl"
- class="author-link gl-display-inline-block gl-rounded-full"
+ :data-user-id="getParticipantId(participant.id)"
+ :data-username="participant.username"
+ class="author-link js-user-link gl-display-inline-block gl-rounded-full"
>
<user-avatar-image
:lazy="lazy"
:img-src="participant.avatar_url || participant.avatarUrl"
:size="24"
- :tooltip-text="participant.name"
:img-alt="participant.name"
css-classes="gl-mr-0!"
tooltip-placement="bottom"
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 6f82178b6fd..88a74784dd2 100644
--- a/app/assets/javascripts/sidebar/components/reviewers/collapsed_reviewer_list.vue
+++ b/app/assets/javascripts/sidebar/components/reviewers/collapsed_reviewer_list.vue
@@ -67,7 +67,7 @@ export default {
const names = renderUsers.map((u) => u.name);
if (!this.users.length) {
- return __('Reviewer(s)');
+ return __('Reviewers');
}
if (this.users.length > names.length) {
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 80c051f86b5..01787c97bca 100644
--- a/app/assets/javascripts/sidebar/components/reviewers/reviewer_avatar_link.vue
+++ b/app/assets/javascripts/sidebar/components/reviewers/reviewer_avatar_link.vue
@@ -3,7 +3,7 @@
// It will soon be overhauled in Issue https://gitlab.com/gitlab-org/gitlab/-/issues/233736
import { GlTooltipDirective, GlLink } from '@gitlab/ui';
import { TYPE_ISSUE, TYPE_MERGE_REQUEST } from '~/issues/constants';
-import { __, sprintf } from '~/locale';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import ReviewerAvatar from './reviewer_avatar.vue';
export default {
@@ -23,16 +23,6 @@ export default {
type: String,
required: true,
},
- tooltipPlacement: {
- type: String,
- default: 'bottom',
- required: false,
- },
- tooltipHasName: {
- type: Boolean,
- default: true,
- required: false,
- },
issuableType: {
type: String,
default: TYPE_ISSUE,
@@ -45,21 +35,8 @@ export default {
this.issuableType === TYPE_MERGE_REQUEST && !this.user.mergeRequestInteraction?.canMerge
);
},
- tooltipTitle() {
- if (this.cannotMerge && this.tooltipHasName) {
- return sprintf(__('%{userName} (cannot merge)'), { userName: this.user.name });
- } else if (this.cannotMerge) {
- return __('Cannot merge');
- }
-
- return '';
- },
- tooltipOption() {
- return {
- container: 'body',
- placement: this.tooltipPlacement,
- boundary: 'viewport',
- };
+ reviewerId() {
+ return getIdFromGraphQLId(this.user.id);
},
reviewerUrl() {
return this.user.webUrl;
@@ -71,9 +48,11 @@ export default {
<template>
<!-- must be `d-inline-block` or parent flex-basis causes width issues -->
<gl-link
- v-gl-tooltip="tooltipOption"
:href="reviewerUrl"
- :title="tooltipTitle"
+ :data-user-id="reviewerId"
+ :data-username="user.username"
+ :data-cannot-merge="cannotMerge"
+ data-placement="left"
class="gl-display-inline-block js-user-link"
>
<!-- use d-flex so that slot can be appropriately styled -->
diff --git a/app/assets/javascripts/sidebar/components/severity/sidebar_severity_widget.vue b/app/assets/javascripts/sidebar/components/severity/sidebar_severity_widget.vue
index 55de0ceb388..e2a3efa096f 100644
--- a/app/assets/javascripts/sidebar/components/severity/sidebar_severity_widget.vue
+++ b/app/assets/javascripts/sidebar/components/severity/sidebar_severity_widget.vue
@@ -1,5 +1,5 @@
<script>
-import { GlDropdown, GlDropdownItem, GlTooltip, GlSprintf } from '@gitlab/ui';
+import { GlCollapsibleListbox, GlTooltip, GlSprintf } from '@gitlab/ui';
import { createAlert } from '~/alert';
import { TYPE_INCIDENT } from '~/issues/constants';
import SidebarEditableItem from '~/sidebar/components/sidebar_editable_item.vue';
@@ -12,8 +12,7 @@ export default {
components: {
GlTooltip,
GlSprintf,
- GlDropdown,
- GlDropdownItem,
+ GlCollapsibleListbox,
SeverityToken,
SidebarEditableItem,
},
@@ -57,6 +56,13 @@ export default {
return [];
}
},
+ dropdownItems() {
+ return this.severitiesList.map((severity) => ({
+ text: severity.label,
+ value: severity.value,
+ severity,
+ }));
+ },
selectedItem() {
return this.severitiesList.find((severity) => severity.value === this.severity);
},
@@ -99,7 +105,7 @@ export default {
});
},
showDropdown() {
- this.$refs.dropdown.show();
+ this.$refs.dropdown.open();
},
},
};
@@ -131,24 +137,20 @@ export default {
</template>
<template #default>
- <gl-dropdown
+ <gl-collapsible-listbox
ref="dropdown"
class="gl-mt-3"
block
:header-text="__('Assign severity')"
- :text="selectedItem.label"
+ :toggle-text="selectedItem.label"
+ :items="dropdownItems"
+ :selected="severity"
+ @select="updateSeverity"
>
- <gl-dropdown-item
- v-for="option in severitiesList"
- :key="option.value"
- data-testid="severityDropdownItem"
- is-check-item
- :is-checked="option.value === severity"
- @click="updateSeverity(option.value)"
- >
- <severity-token :severity="option" />
- </gl-dropdown-item>
- </gl-dropdown>
+ <template #list-item="{ item }">
+ <severity-token :severity="item.severity" />
+ </template>
+ </gl-collapsible-listbox>
</template>
</sidebar-editable-item>
</div>
diff --git a/app/assets/javascripts/sidebar/mount_sidebar.js b/app/assets/javascripts/sidebar/mount_sidebar.js
index 67e76b575e0..8f6b855ecd6 100644
--- a/app/assets/javascripts/sidebar/mount_sidebar.js
+++ b/app/assets/javascripts/sidebar/mount_sidebar.js
@@ -118,7 +118,6 @@ function mountSidebarAssigneesDeprecated(mediator) {
issuableIid: String(iid),
projectPath: fullPath,
field: el.dataset.field,
- signedIn: Object.prototype.hasOwnProperty.call(el.dataset, 'signedIn'),
issuableType:
isInIssuePage() || isInIncidentPage() || isInDesignPage()
? TYPE_ISSUE
diff --git a/app/assets/javascripts/snippets/constants.js b/app/assets/javascripts/snippets/constants.js
index 2d2eede9137..a4653b75bab 100644
--- a/app/assets/javascripts/snippets/constants.js
+++ b/app/assets/javascripts/snippets/constants.js
@@ -21,6 +21,9 @@ export const SNIPPET_VISIBILITY = {
label: __('Public'),
icon: 'earth',
description: __('The snippet can be accessed without any authentication.'),
+ description_project: __(
+ 'The snippet can be accessed without any authentication. To embed snippets, a project must be public.',
+ ),
},
};
diff --git a/app/assets/javascripts/super_sidebar/components/brand_logo.vue b/app/assets/javascripts/super_sidebar/components/brand_logo.vue
index c017fa8afa2..66381e4da4d 100644
--- a/app/assets/javascripts/super_sidebar/components/brand_logo.vue
+++ b/app/assets/javascripts/super_sidebar/components/brand_logo.vue
@@ -27,7 +27,7 @@ export default {
<template>
<a
v-gl-tooltip:super-sidebar.hover.bottom="$options.i18n.homepage"
- class="tanuki-logo-container"
+ class="brand-logo"
:href="rootPath"
:title="$options.i18n.homepage"
data-track-action="click_link"
diff --git a/app/assets/javascripts/super_sidebar/components/create_menu.vue b/app/assets/javascripts/super_sidebar/components/create_menu.vue
index 0ce856c9af8..82f4fd18e80 100644
--- a/app/assets/javascripts/super_sidebar/components/create_menu.vue
+++ b/app/assets/javascripts/super_sidebar/components/create_menu.vue
@@ -11,10 +11,11 @@ import {
TOP_NAV_INVITE_MEMBERS_COMPONENT,
TRIGGER_ELEMENT_DISCLOSURE_DROPDOWN,
} from '~/invite_members/constants';
-import { DROPDOWN_Y_OFFSET } from '../constants';
+import { DROPDOWN_Y_OFFSET, IMPERSONATING_OFFSET } from '../constants';
// Left offset required for the dropdown to be aligned with the super sidebar
-const DROPDOWN_X_OFFSET = -147;
+const DROPDOWN_X_OFFSET_BASE = -147;
+const DROPDOWN_X_OFFSET_IMPERSONATING = DROPDOWN_X_OFFSET_BASE + IMPERSONATING_OFFSET;
export default {
components: {
@@ -27,6 +28,7 @@ export default {
i18n: {
createNew: __('Create new...'),
},
+ inject: ['isImpersonating'],
props: {
groups: {
type: Array,
@@ -38,13 +40,20 @@ export default {
dropdownOpen: false,
};
},
+ computed: {
+ dropdownOffset() {
+ return {
+ mainAxis: DROPDOWN_Y_OFFSET,
+ crossAxis: this.isImpersonating ? DROPDOWN_X_OFFSET_IMPERSONATING : DROPDOWN_X_OFFSET_BASE,
+ };
+ },
+ },
methods: {
isInvitedMembers(groupItem) {
return groupItem.component === TOP_NAV_INVITE_MEMBERS_COMPONENT;
},
},
toggleId: 'create-menu-toggle',
- dropdownOffset: { mainAxis: DROPDOWN_Y_OFFSET, crossAxis: DROPDOWN_X_OFFSET },
TRIGGER_ELEMENT_DISCLOSURE_DROPDOWN,
};
</script>
@@ -58,7 +67,7 @@ export default {
text-sr-only
:toggle-text="$options.i18n.createNew"
:toggle-id="$options.toggleId"
- :dropdown-offset="$options.dropdownOffset"
+ :dropdown-offset="dropdownOffset"
data-qa-selector="new_menu_toggle"
data-testid="new-menu-toggle"
@shown="dropdownOpen = true"
diff --git a/app/assets/javascripts/super_sidebar/components/frequent_items_list.vue b/app/assets/javascripts/super_sidebar/components/frequent_items_list.vue
index 02adebc50af..342e1284e86 100644
--- a/app/assets/javascripts/super_sidebar/components/frequent_items_list.vue
+++ b/app/assets/javascripts/super_sidebar/components/frequent_items_list.vue
@@ -105,7 +105,6 @@ export default {
icon="dash"
:aria-label="$options.i18n.removeItem"
:title="$options.i18n.removeItem"
- class="gl-align-self-center gl-mr-2"
data-testid="item-remove"
@click.stop.prevent="handleItemRemove(item)"
/>
diff --git a/app/assets/javascripts/super_sidebar/components/global_search/command_palette/command_palette_items.vue b/app/assets/javascripts/super_sidebar/components/global_search/command_palette/command_palette_items.vue
index 96e6c9bab9e..a1d0e400b5f 100644
--- a/app/assets/javascripts/super_sidebar/components/global_search/command_palette/command_palette_items.vue
+++ b/app/assets/javascripts/super_sidebar/components/global_search/command_palette/command_palette_items.vue
@@ -2,21 +2,25 @@
import { debounce } from 'lodash';
import fuzzaldrinPlus from 'fuzzaldrin-plus';
import { GlDisclosureDropdownGroup, GlLoadingIcon } from '@gitlab/ui';
+import * as Sentry from '@sentry/browser';
import axios from '~/lib/utils/axios_utils';
import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
import { getFormattedItem } from '../utils';
+
import {
COMMON_HANDLES,
COMMAND_HANDLE,
USER_HANDLE,
PROJECT_HANDLE,
ISSUE_HANDLE,
- GLOBAL_COMMANDS_GROUP_TITLE,
+ PATH_HANDLE,
PAGES_GROUP_TITLE,
+ PATH_GROUP_TITLE,
GROUP_TITLES,
+ MAX_ROWS,
} from './constants';
import SearchItem from './search_item.vue';
-import { commandMapper, linksReducer, autocompleteQuery } from './utils';
+import { commandMapper, linksReducer, autocompleteQuery, fileMapper } from './utils';
export default {
name: 'CommandPaletteItems',
@@ -25,7 +29,14 @@ export default {
GlLoadingIcon,
SearchItem,
},
- inject: ['commandPaletteCommands', 'commandPaletteLinks', 'autocompletePath', 'searchContext'],
+ inject: [
+ 'commandPaletteCommands',
+ 'commandPaletteLinks',
+ 'autocompletePath',
+ 'searchContext',
+ 'projectFilesPath',
+ 'projectBlobPath',
+ ],
props: {
searchQuery: {
type: String,
@@ -35,21 +46,45 @@ export default {
type: String,
required: true,
validator: (value) => {
- return COMMON_HANDLES.includes(value);
+ return [...COMMON_HANDLES, PATH_HANDLE].includes(value);
},
},
},
data: () => ({
groups: [],
- error: null,
loading: false,
+ projectFiles: [],
+ debouncedSearch: debounce(function debouncedSearch() {
+ switch (this.handle) {
+ case COMMAND_HANDLE:
+ this.getCommandsAndPages();
+ break;
+ /* TODO: Search for recent issues initiated by #(ISSUE_HANDLE) from the command palette scope
+ was removed as using the # in command palette conflicted
+ with the existing global search functionality to search for issue by its id.
+ The code that performs the Recent issues search was not removed from the code base
+ as it would be nice to bring it back when we decide how to combine both search by id and text.
+ In scope of https://gitlab.com/gitlab-org/gitlab/-/issues/417434
+ we either bring back the search by #issue_text or remove the related code completely */
+ case USER_HANDLE:
+ case PROJECT_HANDLE:
+ case ISSUE_HANDLE:
+ this.getScopedItems();
+ break;
+ case PATH_HANDLE:
+ this.getProjectFiles();
+ break;
+ default:
+ break;
+ }
+ }, DEFAULT_DEBOUNCE_AND_THROTTLE_MS),
}),
computed: {
isCommandMode() {
return this.handle === COMMAND_HANDLE;
},
- isUserMode() {
- return this.handle === USER_HANDLE;
+ isPathMode() {
+ return this.handle === PATH_HANDLE;
},
commands() {
return this.commandPaletteCommands.map(commandMapper);
@@ -62,7 +97,7 @@ export default {
? this.commands
.map(({ name, items }) => {
return {
- name: name || GLOBAL_COMMANDS_GROUP_TITLE,
+ name,
items: this.filterBySearchQuery(items, 'text'),
};
})
@@ -73,7 +108,7 @@ export default {
return this.groups?.length && this.groups.some((group) => group.items?.length);
},
hasSearchQuery() {
- if (this.isCommandMode) {
+ if (this.isCommandMode || this.isPathMode) {
return this.searchQuery?.length > 0;
}
return this.searchQuery?.length > 2;
@@ -84,44 +119,58 @@ export default {
}
return this.searchQuery;
},
+ filteredProjectFiles() {
+ if (!this.searchQuery) {
+ return this.projectFiles.slice(0, MAX_ROWS);
+ }
+ return this.filterBySearchQuery(this.projectFiles, 'text').slice(0, MAX_ROWS);
+ },
},
watch: {
searchQuery: {
handler() {
- switch (this.handle) {
- case COMMAND_HANDLE:
- this.getCommandsAndPages();
- break;
- case USER_HANDLE:
- case PROJECT_HANDLE:
- case ISSUE_HANDLE:
- this.getScopedItems();
- break;
- default:
- break;
- }
+ this.debouncedSearch();
},
immediate: true,
},
},
+ updated() {
+ this.$emit('updated');
+ },
methods: {
filterBySearchQuery(items, key = 'keywords') {
return fuzzaldrinPlus.filter(items, this.searchQuery, { key });
},
+ async getProjectFiles() {
+ if (!this.projectFiles.length) {
+ this.loading = true;
+
+ try {
+ const response = await axios.get(this.projectFilesPath);
+ this.projectFiles = response?.data.map(fileMapper.bind(null, this.projectBlobPath));
+ } catch (error) {
+ Sentry.captureException(error);
+ } finally {
+ this.loading = false;
+ }
+ }
+
+ this.groups = [
+ {
+ name: PATH_GROUP_TITLE,
+ items: this.filteredProjectFiles,
+ },
+ ];
+ },
getCommandsAndPages() {
if (!this.searchQuery) {
this.groups = [...this.commands];
return;
}
- const matchedLinks = this.filterBySearchQuery(this.links);
- if (this.filteredCommands.length || matchedLinks.length) {
- this.groups = [];
- }
+ this.groups = [...this.filteredCommands];
- if (this.filteredCommands.length) {
- this.groups = [...this.filteredCommands];
- }
+ const matchedLinks = this.filterBySearchQuery(this.links);
if (matchedLinks.length) {
this.groups.push({
@@ -130,62 +179,57 @@ export default {
});
}
},
- getScopedItems: debounce(function debouncedSearch() {
- if (this.searchQuery && this.searchQuery.length < 3) return null;
+ async getScopedItems() {
+ if (this.searchQuery && this.searchQuery.length < 3) return;
this.loading = true;
- return axios
- .get(
+ try {
+ const response = await axios.get(
autocompleteQuery({
path: this.autocompletePath,
searchTerm: this.searchTerm,
handle: this.handle,
projectId: this.searchContext.project?.id,
}),
- )
- .then(({ data }) => {
- this.groups = this.getGroups(data);
- })
- .catch((error) => {
- this.error = error;
- })
- .finally(() => {
- this.loading = false;
- });
- }, DEFAULT_DEBOUNCE_AND_THROTTLE_MS),
- getGroups(data) {
- return [
- {
- name: GROUP_TITLES[this.handle],
- items: data.map(getFormattedItem),
- },
- ];
+ );
+
+ this.groups = [
+ {
+ name: GROUP_TITLES[this.handle],
+ items: response.data.map(getFormattedItem),
+ },
+ ];
+ } catch (error) {
+ Sentry.captureException(error);
+ } finally {
+ this.loading = false;
+ }
},
},
};
</script>
<template>
- <ul class="gl-p-0 gl-m-0 gl-list-style-none">
+ <div>
<gl-loading-icon v-if="loading" size="lg" class="gl-my-5" />
- <template v-else-if="hasResults">
+ <ul v-else-if="hasResults" class="gl-p-0 gl-m-0 gl-list-style-none">
<gl-disclosure-dropdown-group
v-for="(group, index) in groups"
:key="index"
:group="group"
bordered
- class="{'gl-mt-0!': index===0}"
+ :class="{ 'gl-mt-0!': index === 0 }"
>
<template #list-item="{ item }">
<search-item :item="item" :search-query="searchQuery" />
</template>
</gl-disclosure-dropdown-group>
- </template>
+ </ul>
<div v-else-if="hasSearchQuery && !hasResults" class="gl-text-gray-700 gl-pl-5 gl-py-3">
{{ __('No results found') }}
</div>
- </ul>
+ </div>
</template>
diff --git a/app/assets/javascripts/super_sidebar/components/global_search/command_palette/constants.js b/app/assets/javascripts/super_sidebar/components/global_search/command_palette/constants.js
index 9dab16984f5..a43e621da44 100644
--- a/app/assets/javascripts/super_sidebar/components/global_search/command_palette/constants.js
+++ b/app/assets/javascripts/super_sidebar/components/global_search/command_palette/constants.js
@@ -2,19 +2,21 @@ import { s__, sprintf } from '~/locale';
export const COMMAND_HANDLE = '>';
export const USER_HANDLE = '@';
-export const PROJECT_HANDLE = '&';
+export const PROJECT_HANDLE = ':';
export const ISSUE_HANDLE = '#';
+export const PATH_HANDLE = '/';
-export const COMMON_HANDLES = [COMMAND_HANDLE, USER_HANDLE, PROJECT_HANDLE, ISSUE_HANDLE];
+export const COMMON_HANDLES = [COMMAND_HANDLE, USER_HANDLE, PROJECT_HANDLE];
export const SEARCH_OR_COMMAND_MODE_PLACEHOLDER = sprintf(
s__(
- 'CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{issueHandle} for issue or perform generic search...',
+ 'CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search...',
),
{
commandHandle: COMMAND_HANDLE,
userHandle: USER_HANDLE,
issueHandle: ISSUE_HANDLE,
projectHandle: PROJECT_HANDLE,
+ pathHandle: PATH_HANDLE,
},
false,
);
@@ -24,6 +26,7 @@ export const SEARCH_SCOPE_PLACEHOLDER = {
[USER_HANDLE]: s__('CommandPalette|user (enter at least 3 chars)'),
[PROJECT_HANDLE]: s__('CommandPalette|project (enter at least 3 chars)'),
[ISSUE_HANDLE]: s__('CommandPalette|issue (enter at least 3 chars)'),
+ [PATH_HANDLE]: s__('CommandPalette|go to project file'),
};
export const SEARCH_SCOPE = {
@@ -37,9 +40,13 @@ export const USERS_GROUP_TITLE = s__('GlobalSearch|Users');
export const PAGES_GROUP_TITLE = s__('CommandPalette|Pages');
export const PROJECTS_GROUP_TITLE = s__('GlobalSearch|Projects');
export const ISSUE_GROUP_TITLE = s__('GlobalSearch|Recent issues');
+export const PATH_GROUP_TITLE = s__('CommandPalette|Project files');
export const GROUP_TITLES = {
[USER_HANDLE]: USERS_GROUP_TITLE,
[PROJECT_HANDLE]: PROJECTS_GROUP_TITLE,
[ISSUE_HANDLE]: ISSUE_GROUP_TITLE,
+ [PATH_HANDLE]: PATH_GROUP_TITLE,
};
+
+export const MAX_ROWS = 20;
diff --git a/app/assets/javascripts/super_sidebar/components/global_search/command_palette/fake_search_input.vue b/app/assets/javascripts/super_sidebar/components/global_search/command_palette/fake_search_input.vue
index dce2b24f551..efd93e88fa9 100644
--- a/app/assets/javascripts/super_sidebar/components/global_search/command_palette/fake_search_input.vue
+++ b/app/assets/javascripts/super_sidebar/components/global_search/command_palette/fake_search_input.vue
@@ -1,5 +1,5 @@
<script>
-import { COMMON_HANDLES, SEARCH_SCOPE_PLACEHOLDER } from './constants';
+import { COMMON_HANDLES, PATH_HANDLE, SEARCH_SCOPE_PLACEHOLDER } from './constants';
export default {
name: 'FakeSearchInput',
@@ -11,7 +11,7 @@ export default {
scope: {
type: String,
required: true,
- validator: (value) => COMMON_HANDLES.includes(value),
+ validator: (value) => [...COMMON_HANDLES, PATH_HANDLE].includes(value),
},
},
computed: {
diff --git a/app/assets/javascripts/super_sidebar/components/global_search/command_palette/utils.js b/app/assets/javascripts/super_sidebar/components/global_search/command_palette/utils.js
index 5c8c0e59eaf..347a8ffb0b4 100644
--- a/app/assets/javascripts/super_sidebar/components/global_search/command_palette/utils.js
+++ b/app/assets/javascripts/super_sidebar/components/global_search/command_palette/utils.js
@@ -1,12 +1,12 @@
import { isNil, omitBy } from 'lodash';
-import { objectToQuery } from '~/lib/utils/url_utility';
-import { SEARCH_SCOPE } from './constants';
+import { objectToQuery, joinPaths } from '~/lib/utils/url_utility';
+import { SEARCH_SCOPE, GLOBAL_COMMANDS_GROUP_TITLE } from './constants';
export const commandMapper = ({ name, items }) => {
// TODO: we filter out invite_members for now, because it is complicated to add the invite members modal here
// and is out of scope for the basic command palette items. If it proves to be useful, we can add it later.
return {
- name,
+ name: name || GLOBAL_COMMANDS_GROUP_TITLE,
items: items.filter(({ component }) => component !== 'invite_members'),
};
};
@@ -32,6 +32,14 @@ export const linksReducer = (acc, menuItem) => {
return acc;
};
+export const fileMapper = (projectBlobPath, file) => {
+ return {
+ icon: 'doc-code',
+ text: file,
+ href: joinPaths(projectBlobPath, file),
+ };
+};
+
export const autocompleteQuery = ({ path, searchTerm, handle, projectId }) => {
const query = omitBy(
{
diff --git a/app/assets/javascripts/super_sidebar/components/global_search/components/global_search.vue b/app/assets/javascripts/super_sidebar/components/global_search/components/global_search.vue
index cb34f2b8c26..bec8c191b31 100644
--- a/app/assets/javascripts/super_sidebar/components/global_search/components/global_search.vue
+++ b/app/assets/javascripts/super_sidebar/components/global_search/components/global_search.vue
@@ -25,20 +25,24 @@ import {
SEARCH_RESULTS_SCOPE,
} from '~/vue_shared/global_search/constants';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import { darkModeEnabled } from '~/lib/utils/color_utils';
import {
SEARCH_INPUT_DESCRIPTION,
SEARCH_RESULTS_DESCRIPTION,
SEARCH_SHORTCUTS_MIN_CHARACTERS,
SCOPE_TOKEN_MAX_LENGTH,
INPUT_FIELD_PADDING,
- IS_SEARCHING,
SEARCH_MODAL_ID,
SEARCH_INPUT_SELECTOR,
SEARCH_RESULTS_ITEM_SELECTOR,
} from '../constants';
import CommandPaletteItems from '../command_palette/command_palette_items.vue';
import FakeSearchInput from '../command_palette/fake_search_input.vue';
-import { COMMON_HANDLES, SEARCH_OR_COMMAND_MODE_PLACEHOLDER } from '../command_palette/constants';
+import {
+ COMMON_HANDLES,
+ PATH_HANDLE,
+ SEARCH_OR_COMMAND_MODE_PLACEHOLDER,
+} from '../command_palette/constants';
import GlobalSearchAutocompleteItems from './global_search_autocomplete_items.vue';
import GlobalSearchDefaultItems from './global_search_default_items.vue';
import GlobalSearchScopedItems from './global_search_scoped_items.vue';
@@ -68,6 +72,11 @@ export default {
FakeSearchInput,
},
mixins: [glFeatureFlagMixin()],
+ data() {
+ return {
+ nextFocusedItemIndex: null,
+ };
+ },
computed: {
...mapState(['search', 'loading', 'searchContext']),
...mapGetters(['searchQuery', 'searchOptions', 'scopedSearchOptions']),
@@ -108,34 +117,38 @@ export default {
count: this.searchOptions.length,
});
},
- searchBarClasses() {
- return {
- [IS_SEARCHING]: this.searchTermOverMin,
- };
- },
- showScopeHelp() {
+ showScopeToken() {
return this.searchTermOverMin && !this.isCommandMode;
},
searchBarItem() {
return this.searchOptions?.[0];
},
- infieldHelpContent() {
+ scopeTokenText() {
return this.searchBarItem?.scope || this.searchBarItem?.description;
},
- infieldHelpIcon() {
- return this.searchBarItem?.icon;
+ scopeTokenIcon() {
+ if (!this.isCommandMode) {
+ return this.searchBarItem?.icon;
+ }
+ return null;
},
- scopeTokenTitle() {
+ searchScope() {
return sprintf(this.$options.i18n.SEARCH_RESULTS_SCOPE, {
- scope: this.infieldHelpContent,
+ scope: this.scopeTokenText,
});
},
-
+ truncatedSearchScope() {
+ return truncate(this.searchScope, SCOPE_TOKEN_MAX_LENGTH);
+ },
searchTextFirstChar() {
return this.searchText?.trim().charAt(0);
},
isCommandMode() {
- return this.glFeatures?.commandPalette && COMMON_HANDLES.includes(this.searchTextFirstChar);
+ return (
+ this.glFeatures?.commandPalette &&
+ (COMMON_HANDLES.includes(this.searchTextFirstChar) ||
+ (this.searchContext.project && this.searchTextFirstChar === PATH_HANDLE))
+ );
},
commandPaletteQuery() {
if (this.isCommandMode) {
@@ -143,6 +156,14 @@ export default {
}
return '';
},
+ commandHighlightClass() {
+ return darkModeEnabled() ? 'gl-bg-gray-10!' : 'gl-bg-gray-50!';
+ },
+ },
+ watch: {
+ nextFocusedItemIndex() {
+ this.highlightFirstCommand();
+ },
},
methods: {
...mapActions(['setSearch', 'fetchAutocompleteOptions', 'clearAutocomplete']),
@@ -156,9 +177,6 @@ export default {
this.fetchAutocompleteOptions();
}
}, DEFAULT_DEBOUNCE_AND_THROTTLE_MS),
- getTruncatedScope(scope) {
- return truncate(scope, SCOPE_TOKEN_MAX_LENGTH);
- },
observeTokenWidth({ contentRect: { width } }) {
const inputField = this.$refs?.searchInputBox?.$el?.querySelector('input');
if (!inputField) {
@@ -206,7 +224,7 @@ export default {
}
},
focusSearchInput() {
- this.$refs.searchInputBox.$el.querySelector('input').focus();
+ this.$refs.searchInput.$el.querySelector('input').focus();
},
focusNextItem(event, elements, offset) {
const { target } = event;
@@ -221,11 +239,34 @@ export default {
elements[index]?.focus();
},
submitSearch() {
+ if (this.isCommandMode) {
+ this.runFirstCommand();
+ return;
+ }
if (this.search?.length <= SEARCH_SHORTCUTS_MIN_CHARACTERS) {
return;
}
visitUrl(this.searchQuery);
},
+ runFirstCommand() {
+ this.getFocusableOptions()[0]?.firstChild.click();
+ },
+ onSearchModalShown() {
+ this.$emit('shown');
+ },
+ onSearchModalHidden() {
+ this.searchText = '';
+ this.$emit('hidden');
+ },
+ highlightFirstCommand() {
+ if (this.isCommandMode) {
+ const activeCommand = this.getFocusableOptions()[0]?.firstChild;
+ activeCommand?.classList.toggle(
+ this.commandHighlightClass,
+ Boolean(!this.nextFocusedItemIndex),
+ );
+ }
+ },
},
SEARCH_INPUT_DESCRIPTION,
SEARCH_RESULTS_DESCRIPTION,
@@ -243,24 +284,22 @@ export default {
body-class="gl-p-0!"
modal-class="global-search-modal"
:centered="false"
- @hidden="$emit('hidden')"
- @shown="$emit('shown')"
+ @shown="onSearchModalShown"
+ @hide="onSearchModalHidden"
>
<form
role="search"
:aria-label="searchPlaceholder"
class="gl-relative gl-rounded-base gl-w-full"
- :class="searchBarClasses"
data-testid="global-search-form"
>
<div class="gl-p-1 gl-relative">
<gl-search-box-by-type
id="search"
- ref="searchInputBox"
+ ref="searchInput"
v-model="searchText"
role="searchbox"
data-testid="global-search-input"
- data-qa-selector="global_search_input"
autocomplete="off"
:placeholder="searchPlaceholder"
:aria-describedby="$options.SEARCH_INPUT_DESCRIPTION"
@@ -270,24 +309,20 @@ export default {
@keydown="onKeydown"
/>
<gl-token
- v-if="showScopeHelp"
+ v-if="showScopeToken"
v-gl-resize-observer-directive="observeTokenWidth"
- class="in-search-scope-help gl-sm-display-block gl-display-none"
+ class="search-scope-help gl-absolute gl-sm-display-block gl-display-none"
view-only
- :title="scopeTokenTitle"
+ :title="searchScope"
>
<gl-icon
- v-if="infieldHelpIcon"
+ v-if="scopeTokenIcon"
class="gl-mr-2"
- :aria-label="infieldHelpContent"
- :name="infieldHelpIcon"
+ :aria-label="scopeTokenText"
+ :name="scopeTokenIcon"
:size="16"
/>
- {{
- getTruncatedScope(
- sprintf($options.i18n.SEARCH_RESULTS_SCOPE, { scope: infieldHelpContent }),
- )
- }}
+ {{ truncatedSearchScope }}
</gl-token>
<span :id="$options.SEARCH_INPUT_DESCRIPTION" role="region" class="gl-sr-only">
{{ $options.i18n.SEARCH_DESCRIBED_BY_WITH_RESULTS }}
@@ -319,6 +354,7 @@ export default {
v-if="isCommandMode"
:search-query="commandPaletteQuery"
:handle="searchTextFirstChar"
+ @updated="highlightFirstCommand"
/>
<template v-else>
diff --git a/app/assets/javascripts/super_sidebar/components/global_search/constants.js b/app/assets/javascripts/super_sidebar/components/global_search/constants.js
index cb267df6122..5a860fcd1ab 100644
--- a/app/assets/javascripts/super_sidebar/components/global_search/constants.js
+++ b/app/assets/javascripts/super_sidebar/components/global_search/constants.js
@@ -18,8 +18,6 @@ export const SCOPE_TOKEN_MAX_LENGTH = 36;
export const INPUT_FIELD_PADDING = 84;
-export const IS_SEARCHING = 'is-searching';
-
export const FETCH_TYPES = ['generic', 'search'];
export const SEARCH_MODAL_ID = 'super-sidebar-search-modal';
diff --git a/app/assets/javascripts/super_sidebar/components/help_center.vue b/app/assets/javascripts/super_sidebar/components/help_center.vue
index 1d4c24c6853..8ce82116194 100644
--- a/app/assets/javascripts/super_sidebar/components/help_center.vue
+++ b/app/assets/javascripts/super_sidebar/components/help_center.vue
@@ -38,7 +38,7 @@ export default {
shortcuts: __('Keyboard shortcuts'),
version: __('Your GitLab version'),
whatsnew: __("What's new"),
- chat: s__('TanukiBot|Ask GitLab Chat'),
+ chat: s__('TanukiBot|Ask GitLab Duo'),
},
props: {
sidebarData: {
diff --git a/app/assets/javascripts/super_sidebar/components/items_list.vue b/app/assets/javascripts/super_sidebar/components/items_list.vue
index 7d5af883651..764db490751 100644
--- a/app/assets/javascripts/super_sidebar/components/items_list.vue
+++ b/app/assets/javascripts/super_sidebar/components/items_list.vue
@@ -19,13 +19,7 @@ export default {
<template>
<ul class="gl-p-0 gl-list-style-none">
- <nav-item
- v-for="item in items"
- :key="item.id"
- :item="item"
- :link-classes="{ 'gl-py-2!': true }"
- is-subitem
- >
+ <nav-item v-for="item in items" :key="item.id" :item="item" is-subitem>
<template #icon>
<project-avatar
:project-id="item.id"
@@ -33,7 +27,6 @@ export default {
:project-avatar-url="item.avatar"
:size="24"
aria-hidden="true"
- class="gl-mr-n2"
/>
</template>
<template #actions>
diff --git a/app/assets/javascripts/super_sidebar/components/menu_section.vue b/app/assets/javascripts/super_sidebar/components/menu_section.vue
index b5a8241a286..73a899eeb83 100644
--- a/app/assets/javascripts/super_sidebar/components/menu_section.vue
+++ b/app/assets/javascripts/super_sidebar/components/menu_section.vue
@@ -71,7 +71,7 @@ export default {
<component :is="tag">
<hr v-if="separated" aria-hidden="true" class="gl-mx-4 gl-my-2" />
<button
- class="gl-rounded-base gl-relative gl-display-flex gl-align-items-center gl-line-height-normal gl-mb-2 gl-py-3 gl-px-0 gl-text-black-normal! gl-hover-bg-t-gray-a-08 gl-focus-bg-t-gray-a-08 gl-text-decoration-none! gl-appearance-none gl-border-0 gl-bg-transparent gl-text-left gl-w-full gl-focus--focus"
+ class="gl-rounded-base gl-relative gl-display-flex gl-align-items-center gl-min-h-7 gl-gap-3 gl-mb-2 gl-py-2 gl-px-3 gl-text-black-normal! gl-hover-bg-t-gray-a-08 gl-focus-bg-t-gray-a-08 gl-text-decoration-none! gl-appearance-none gl-border-0 gl-bg-transparent gl-text-left gl-w-full gl-focus--focus"
:class="computedLinkClasses"
data-qa-selector="menu_section_button"
:data-qa-section-name="item.title"
@@ -84,17 +84,17 @@ export default {
aria-hidden="true"
style="width: 3px; border-radius: 3px; margin-right: 1px"
></span>
- <span class="gl-flex-shrink-0 gl-w-6 gl-mx-3">
+ <span class="gl-flex-shrink-0 gl-w-6 gl-display-flex">
<slot name="icon">
- <gl-icon v-if="item.icon" :name="item.icon" class="gl-ml-2 item-icon" />
+ <gl-icon v-if="item.icon" :name="item.icon" class="gl-m-auto item-icon" />
</slot>
</span>
- <span class="gl-pr-3 gl-text-gray-900 gl-truncate-end">
+ <span class="gl-flex-grow-1 gl-text-gray-900 gl-truncate-end">
{{ item.title }}
</span>
- <span class="gl-flex-grow-1 gl-text-right gl-mr-3 gl-text-gray-400">
+ <span class="gl-text-right gl-text-gray-400">
<gl-icon :name="collapseIcon" />
</span>
</button>
diff --git a/app/assets/javascripts/super_sidebar/components/nav_item.vue b/app/assets/javascripts/super_sidebar/components/nav_item.vue
index 0ee9db10ee2..c1e1f64dbc1 100644
--- a/app/assets/javascripts/super_sidebar/components/nav_item.vue
+++ b/app/assets/javascripts/super_sidebar/components/nav_item.vue
@@ -102,9 +102,8 @@ export default {
},
computedLinkClasses() {
return {
- 'gl-py-2': this.isPinnable,
- 'gl-py-3': !this.isPinnable,
- 'gl-mx-2': this.isSubitem,
+ 'gl-px-2 gl-mx-2 gl-line-height-normal': this.isSubitem,
+ 'gl-px-3': !this.isSubitem,
[this.item.link_classes]: this.item.link_classes,
...this.linkClasses,
};
@@ -112,9 +111,6 @@ export default {
navItemLinkComponent() {
return this.item.to ? NavItemRouterLink : NavItemLink;
},
- iconClasses() {
- return this.isSubitem === true ? 'gl-ml-2 gl-mr-4' : 'gl-w-6 gl-mx-3';
- },
},
};
</script>
@@ -125,7 +121,7 @@ export default {
:is="navItemLinkComponent"
#default="{ isActive }"
v-bind="linkProps"
- class="nav-item-link gl-rounded-base gl-relative gl-display-flex gl-align-items-center gl-mb-1 gl-px-0 gl-line-height-normal gl-text-black-normal! gl-hover-bg-t-gray-a-08 gl-focus-bg-t-gray-a-08 gl-text-decoration-none! gl-focus--focus"
+ class="nav-item-link gl-rounded-base gl-relative gl-display-flex gl-align-items-center gl-min-h-7 gl-gap-3 gl-mb-1 gl-py-2 gl-text-black-normal! gl-hover-bg-t-gray-a-08 gl-focus-bg-t-gray-a-08 gl-text-decoration-none! gl-focus--focus"
:class="computedLinkClasses"
data-qa-selector="nav_item_link"
data-testid="nav-item-link"
@@ -137,13 +133,13 @@ export default {
style="width: 3px; border-radius: 3px; margin-right: 1px"
data-testid="active-indicator"
></div>
- <div :class="iconClasses" class="gl-flex-shrink-0">
+ <div class="gl-flex-shrink-0 gl-w-6 gl-display-flex">
<slot name="icon">
- <gl-icon v-if="item.icon" :name="item.icon" class="gl-ml-2 item-icon" />
+ <gl-icon v-if="item.icon" :name="item.icon" class="gl-m-auto item-icon" />
<gl-icon
v-else-if="isInPinnedSection"
name="grip"
- class="gl-text-gray-400 gl-ml-2 draggable-icon"
+ class="gl-m-auto gl-text-gray-400 draggable-icon"
/>
</slot>
</div>
@@ -154,7 +150,7 @@ export default {
</div>
</div>
<slot name="actions"></slot>
- <span v-if="hasPill || isPinnable" class="gl-text-right gl-mr-3 gl-relative">
+ <span v-if="hasPill || isPinnable" class="gl-text-right gl-relative">
<gl-badge
v-if="hasPill"
size="sm"
diff --git a/app/assets/javascripts/super_sidebar/components/sidebar_peek_behavior.vue b/app/assets/javascripts/super_sidebar/components/sidebar_peek_behavior.vue
index 9d2836e9dfa..6058ed3a1cd 100644
--- a/app/assets/javascripts/super_sidebar/components/sidebar_peek_behavior.vue
+++ b/app/assets/javascripts/super_sidebar/components/sidebar_peek_behavior.vue
@@ -1,5 +1,6 @@
<script>
import { getCssClassDimensions } from '~/lib/utils/css_utils';
+import Tracking from '~/tracking';
import { SUPER_SIDEBAR_PEEK_OPEN_DELAY, SUPER_SIDEBAR_PEEK_CLOSE_DELAY } from '../constants';
export const STATE_CLOSED = 'closed';
@@ -9,6 +10,7 @@ export const STATE_WILL_CLOSE = 'will-close';
export default {
name: 'SidebarPeek',
+ mixins: [Tracking.mixin()],
created() {
// Nothing needs to observe these properties, so they are not reactive.
this.state = null;
@@ -88,6 +90,10 @@ export default {
open() {
if (this.changeState(STATE_OPEN)) {
this.clearTimers();
+ this.track('nav_peek', {
+ label: 'nav_hover',
+ property: 'nav_sidebar',
+ });
}
},
close() {
diff --git a/app/assets/javascripts/super_sidebar/components/super_sidebar.vue b/app/assets/javascripts/super_sidebar/components/super_sidebar.vue
index 6b1efc4217c..c194401ce95 100644
--- a/app/assets/javascripts/super_sidebar/components/super_sidebar.vue
+++ b/app/assets/javascripts/super_sidebar/components/super_sidebar.vue
@@ -3,6 +3,7 @@ import { GlButton } from '@gitlab/ui';
import { Mousetrap } from '~/lib/mousetrap';
import { keysFor, TOGGLE_SUPER_SIDEBAR } from '~/behaviors/shortcuts/keybindings';
import { __ } from '~/locale';
+import Tracking from '~/tracking';
import { sidebarState } from '../constants';
import { isCollapsed, toggleSuperSidebarCollapsed } from '../super_sidebar_collapsed_state_manager';
import UserBar from './user_bar.vue';
@@ -26,6 +27,7 @@ export default {
TrialStatusPopover: () =>
import('ee_component/contextual_sidebar/components/trial_status_popover.vue'),
},
+ mixins: [Tracking.mixin()],
i18n: {
skipToMainContent: __('Skip to main content'),
},
@@ -68,6 +70,10 @@ export default {
},
methods: {
toggleSidebar() {
+ this.track(isCollapsed() ? 'nav_show' : 'nav_hide', {
+ label: 'nav_toggle_keyboard_shortcut',
+ property: 'nav_sidebar',
+ });
toggleSuperSidebarCollapsed(!isCollapsed(), true);
},
collapseSidebar() {
diff --git a/app/assets/javascripts/super_sidebar/components/super_sidebar_toggle.vue b/app/assets/javascripts/super_sidebar/components/super_sidebar_toggle.vue
index 4fff5cf832e..87762a62c0f 100644
--- a/app/assets/javascripts/super_sidebar/components/super_sidebar_toggle.vue
+++ b/app/assets/javascripts/super_sidebar/components/super_sidebar_toggle.vue
@@ -1,6 +1,7 @@
<script>
import { GlButton, GlTooltipDirective } from '@gitlab/ui';
import { __ } from '~/locale';
+import Tracking from '~/tracking';
import { JS_TOGGLE_COLLAPSE_CLASS, JS_TOGGLE_EXPAND_CLASS, sidebarState } from '../constants';
import { toggleSuperSidebarCollapsed } from '../super_sidebar_collapsed_state_manager';
@@ -11,6 +12,7 @@ export default {
directives: {
GlTooltip: GlTooltipDirective,
},
+ mixins: [Tracking.mixin()],
props: {
tooltipContainer: {
type: String,
@@ -52,6 +54,10 @@ export default {
},
methods: {
toggle() {
+ this.track(this.isCollapsed ? 'nav_show' : 'nav_hide', {
+ label: 'nav_toggle',
+ property: 'nav_sidebar',
+ });
toggleSuperSidebarCollapsed(!this.isCollapsed, true);
this.focusOtherToggle();
},
diff --git a/app/assets/javascripts/super_sidebar/components/user_bar.vue b/app/assets/javascripts/super_sidebar/components/user_bar.vue
index d3b2143aaa7..a882df057fa 100644
--- a/app/assets/javascripts/super_sidebar/components/user_bar.vue
+++ b/app/assets/javascripts/super_sidebar/components/user_bar.vue
@@ -130,7 +130,6 @@ export default {
v-gl-tooltip.bottom.hover.html="searchTooltip"
v-gl-modal="$options.SEARCH_MODAL_ID"
data-testid="super-sidebar-search-button"
- data-qa-selector="global_search_button"
icon="search"
:aria-label="$options.i18n.search"
category="tertiary"
@@ -150,7 +149,6 @@ export default {
category="tertiary"
data-method="delete"
data-testid="stop-impersonation-btn"
- data-qa-selector="stop_impersonation_link"
/>
</div>
<div class="gl-display-flex gl-justify-content-space-between gl-px-3 gl-py-2 gl-gap-2">
@@ -161,6 +159,7 @@ export default {
:count="userCounts.assigned_issues"
:href="sidebarData.issues_dashboard_path"
:label="$options.i18n.issues"
+ data-testid="issues-shortcut-button"
data-track-action="click_link"
data-track-label="issues_link"
data-track-property="nav_core_menu"
@@ -177,6 +176,7 @@ export default {
icon="merge-request-open"
:count="mergeRequestTotalCount"
:label="$options.i18n.mergeRequests"
+ data-testid="merge-requests-shortcut-button"
data-track-action="click_dropdown"
data-track-label="merge_requests_menu"
data-track-property="nav_core_menu"
@@ -189,7 +189,7 @@ export default {
:count="userCounts.todos"
:href="sidebarData.todos_dashboard_path"
:label="$options.i18n.todoList"
- data-qa-selector="todos_shortcut_button"
+ data-testid="todos-shortcut-button"
data-track-action="click_link"
data-track-label="todos_link"
data-track-property="nav_core_menu"
diff --git a/app/assets/javascripts/super_sidebar/components/user_menu.vue b/app/assets/javascripts/super_sidebar/components/user_menu.vue
index 7d4991fbe96..869f07520a2 100644
--- a/app/assets/javascripts/super_sidebar/components/user_menu.vue
+++ b/app/assets/javascripts/super_sidebar/components/user_menu.vue
@@ -11,11 +11,12 @@ import { s__, __, sprintf } from '~/locale';
import NewNavToggle from '~/nav/components/new_nav_toggle.vue';
import Tracking from '~/tracking';
import PersistentUserCallout from '~/persistent_user_callout';
-import { USER_MENU_TRACKING_DEFAULTS, DROPDOWN_Y_OFFSET } from '../constants';
+import { USER_MENU_TRACKING_DEFAULTS, DROPDOWN_Y_OFFSET, IMPERSONATING_OFFSET } from '../constants';
import UserNameGroup from './user_name_group.vue';
// Left offset required for the dropdown to be aligned with the super sidebar
-const DROPDOWN_X_OFFSET = -211;
+const DROPDOWN_X_OFFSET_BASE = -211;
+const DROPDOWN_X_OFFSET_IMPERSONATING = DROPDOWN_X_OFFSET_BASE + IMPERSONATING_OFFSET;
export default {
feedbackUrl: 'https://gitlab.com/gitlab-org/gitlab/-/issues/409005',
@@ -47,7 +48,7 @@ export default {
SafeHtml,
},
mixins: [Tracking.mixin()],
- inject: ['toggleNewNavEndpoint'],
+ inject: ['toggleNewNavEndpoint', 'isImpersonating'],
props: {
data: {
required: true,
@@ -89,7 +90,7 @@ export default {
text: this.$options.i18n.editProfile,
href: this.data.settings.profile_path,
extraAttrs: {
- 'data-qa-selector': 'edit_profile_link',
+ 'data-testid': 'edit_profile_link',
...USER_MENU_TRACKING_DEFAULTS,
'data-track-label': 'user_edit_profile',
},
@@ -149,7 +150,7 @@ export default {
href: this.data.sign_out_link,
extraAttrs: {
'data-method': 'post',
- 'data-qa-selector': 'sign_out_link',
+ 'data-testid': 'sign_out_link',
class: 'sign-out-link',
},
},
@@ -188,6 +189,12 @@ export default {
showNotificationDot() {
return this.data.pipeline_minutes?.show_notification_dot;
},
+ dropdownOffset() {
+ return {
+ mainAxis: DROPDOWN_Y_OFFSET,
+ crossAxis: this.isImpersonating ? DROPDOWN_X_OFFSET_IMPERSONATING : DROPDOWN_X_OFFSET_BASE,
+ };
+ },
},
methods: {
onShow() {
@@ -221,7 +228,6 @@ export default {
});
},
},
- dropdownOffset: { mainAxis: DROPDOWN_Y_OFFSET, crossAxis: DROPDOWN_X_OFFSET },
};
</script>
@@ -229,9 +235,8 @@ export default {
<div>
<gl-disclosure-dropdown
ref="userDropdown"
- :dropdown-offset="$options.dropdownOffset"
+ :dropdown-offset="dropdownOffset"
data-testid="user-dropdown"
- data-qa-selector="user_menu"
:auto-close="false"
@shown="onShow"
>
@@ -243,7 +248,7 @@ export default {
:entity-name="data.name"
:src="data.avatar_url"
aria-hidden="true"
- data-qa-selector="user_avatar_content"
+ data-testid="user_avatar_content"
/>
<span
v-if="showNotificationDot"
diff --git a/app/assets/javascripts/super_sidebar/components/user_name_group.vue b/app/assets/javascripts/super_sidebar/components/user_name_group.vue
index dfaaaccf4a4..f3e8816cd37 100644
--- a/app/assets/javascripts/super_sidebar/components/user_name_group.vue
+++ b/app/assets/javascripts/super_sidebar/components/user_name_group.vue
@@ -41,7 +41,7 @@ export default {
item.extraAttrs = {
...USER_MENU_TRACKING_DEFAULTS,
'data-track-label': 'user_profile',
- 'data-qa-selector': 'user_profile_link',
+ 'data-testid': 'user_profile_link',
};
}
@@ -74,13 +74,13 @@ export default {
class="gl-display-flex gl-align-items-center gl-mt-2 gl-font-sm"
>
<gl-emoji :data-name="user.status.emoji" class="gl-mr-1" />
- <span v-safe-html="user.status.message" class="gl-text-truncate"></span>
+ <span v-safe-html="user.status.message_html" class="gl-text-truncate"></span>
<gl-tooltip
:target="() => $refs.statusTooltipTarget"
boundary="viewport"
placement="bottom"
>
- <span v-safe-html="user.status.message"></span>
+ <span v-safe-html="user.status.message_html"></span>
</gl-tooltip>
</span>
</span>
diff --git a/app/assets/javascripts/super_sidebar/constants.js b/app/assets/javascripts/super_sidebar/constants.js
index 00ceaebe2cc..757bf9c7459 100644
--- a/app/assets/javascripts/super_sidebar/constants.js
+++ b/app/assets/javascripts/super_sidebar/constants.js
@@ -52,3 +52,5 @@ export const SIDEBAR_COOKIE_EXPIRATION = 365 * 10;
export const DROPDOWN_Y_OFFSET = 4;
export const NAV_ITEM_LINK_ACTIVE_CLASS = 'gl-bg-t-gray-a-08';
+
+export const IMPERSONATING_OFFSET = 32;
diff --git a/app/assets/javascripts/super_sidebar/super_sidebar_bundle.js b/app/assets/javascripts/super_sidebar/super_sidebar_bundle.js
index f6afde02fa5..322eca72016 100644
--- a/app/assets/javascripts/super_sidebar/super_sidebar_bundle.js
+++ b/app/assets/javascripts/super_sidebar/super_sidebar_bundle.js
@@ -65,13 +65,23 @@ export const initSuperSidebar = () => {
if (!el) return false;
- const { rootPath, sidebar, toggleNewNavEndpoint, forceDesktopExpandedSidebar } = el.dataset;
+ const {
+ rootPath,
+ sidebar,
+ toggleNewNavEndpoint,
+ forceDesktopExpandedSidebar,
+ commandPalette,
+ } = el.dataset;
bindSuperSidebarCollapsedEvents(forceDesktopExpandedSidebar);
initSuperSidebarCollapsedState(parseBoolean(forceDesktopExpandedSidebar));
const sidebarData = JSON.parse(sidebar);
const searchData = convertObjectPropsToCamelCase(sidebarData.search);
+
+ const commandPaletteData = JSON.parse(commandPalette);
+ const projectFilesPath = commandPaletteData.project_files_url;
+ const projectBlobPath = commandPaletteData.project_blob_url;
const commandPaletteCommands = sidebarData.create_new_menu_groups || [];
const commandPaletteLinks = convertObjectPropsToCamelCase(sidebarData.current_menu_items || []);
@@ -91,6 +101,8 @@ export const initSuperSidebar = () => {
commandPaletteLinks,
autocompletePath,
searchContext,
+ projectFilesPath,
+ projectBlobPath,
},
store: createStore({
searchPath,
diff --git a/app/assets/javascripts/super_sidebar/super_sidebar_collapsed_state_manager.js b/app/assets/javascripts/super_sidebar/super_sidebar_collapsed_state_manager.js
index 2687ea5ccf8..feb7e274b07 100644
--- a/app/assets/javascripts/super_sidebar/super_sidebar_collapsed_state_manager.js
+++ b/app/assets/javascripts/super_sidebar/super_sidebar_collapsed_state_manager.js
@@ -1,6 +1,7 @@
import { GlBreakpointInstance as bp, breakpoints } from '@gitlab/ui/dist/utils';
import { debounce } from 'lodash';
import { setCookie, getCookie } from '~/lib/utils/common_utils';
+import Tracking from '~/tracking';
import { sidebarState } from './constants';
export const SIDEBAR_COLLAPSED_CLASS = 'page-with-super-sidebar-collapsed';
@@ -50,7 +51,15 @@ export const bindSuperSidebarCollapsedEvents = (forceDesktopExpandedSidebar = fa
const widthChanged = previousWindowWidth !== newWindowWidth;
if (widthChanged) {
+ const collapsedBeforeResize = sidebarState.isCollapsed;
initSuperSidebarCollapsedState(forceDesktopExpandedSidebar);
+ const collapsedAfterResize = sidebarState.isCollapsed;
+ if (!collapsedBeforeResize && collapsedAfterResize) {
+ Tracking.event(undefined, 'nav_hide', {
+ label: 'browser_resize',
+ property: 'nav_sidebar',
+ });
+ }
}
previousWindowWidth = newWindowWidth;
}, 100);
diff --git a/app/assets/javascripts/surveys/merge_request_experience/app.vue b/app/assets/javascripts/surveys/merge_request_experience/app.vue
index 333059b5340..2dd658d62ea 100644
--- a/app/assets/javascripts/surveys/merge_request_experience/app.vue
+++ b/app/assets/javascripts/surveys/merge_request_experience/app.vue
@@ -6,6 +6,7 @@ import { s__, __ } from '~/locale';
import UserCalloutDismisser from '~/vue_shared/components/user_callout_dismisser.vue';
import SatisfactionRate from '~/surveys/components/satisfaction_rate.vue';
import Tracking from '~/tracking';
+import { PROMO_URL } from 'jh_else_ce/lib/utils/url_utility';
const steps = [
{
@@ -50,6 +51,7 @@ export default {
thanks: s__('MrSurvey|Thank you for your feedback!'),
},
gitlabLogo,
+ privacyLink: `${PROMO_URL}/privacy/`,
data() {
return {
visible: false,
@@ -152,7 +154,7 @@ export default {
<template #link="{ content }">
<a
class="gl-text-decoration-underline gl-text-gray-500"
- href="https://about.gitlab.com/privacy/"
+ :href="$options.privacyLink"
target="_blank"
rel="noreferrer nofollow"
v-text="content"
diff --git a/app/assets/javascripts/token_access/components/outbound_token_access.vue b/app/assets/javascripts/token_access/components/outbound_token_access.vue
index 9c9b0d37b68..f70bb77b780 100644
--- a/app/assets/javascripts/token_access/components/outbound_token_access.vue
+++ b/app/assets/javascripts/token_access/components/outbound_token_access.vue
@@ -21,7 +21,6 @@ import getProjectsWithCIJobTokenScopeQuery from '../graphql/queries/get_projects
import TokenProjectsTable from './token_projects_table.vue';
// Note: This component will be removed in 17.0, as the outbound access token is getting deprecated
-// Some warnings are behind the `frozen_outbound_job_token_scopes` feature flag
export default {
i18n: {
toggleLabelTitle: s__('CICD|Limit CI_JOB_TOKEN access'),
@@ -127,14 +126,8 @@ export default {
ciJobTokenHelpPage() {
return helpPagePath('ci/jobs/ci_job_token#limit-your-projects-job-token-access');
},
- disableOutboundToken() {
- return (
- this.glFeatures?.frozenOutboundJobTokenScopes &&
- !this.glFeatures?.frozenOutboundJobTokenScopesOverride
- );
- },
disableTokenToggle() {
- return !this.jobTokenScopeEnabled && this.disableOutboundToken;
+ return !this.jobTokenScopeEnabled;
},
},
methods: {
@@ -226,7 +219,6 @@ export default {
<gl-loading-icon v-if="$apollo.loading" size="lg" class="gl-mt-5" />
<template v-else>
<gl-alert
- v-if="disableOutboundToken"
class="gl-mb-3"
variant="warning"
:dismissible="false"
@@ -260,7 +252,7 @@ export default {
<gl-link :href="ciJobTokenHelpPage" class="inline-link" target="_blank">
{{ content }}
</gl-link>
- <strong v-if="disableOutboundToken">{{ $options.i18n.disableToggleWarning }} </strong>
+ <strong>{{ $options.i18n.disableToggleWarning }} </strong>
</template>
</gl-sprintf>
</template>
@@ -274,7 +266,7 @@ export default {
<template #default>
<gl-form-input
v-model="targetProjectPath"
- :disabled="disableOutboundToken"
+ :disabled="true"
:placeholder="$options.i18n.addProjectPlaceholder"
data-testid="project-path-input"
/>
@@ -286,16 +278,6 @@ export default {
<gl-button @click="clearTargetProjectPath">{{ $options.i18n.cancel }}</gl-button>
</template>
</gl-card>
- <gl-alert
- v-if="!jobTokenScopeEnabled && !disableOutboundToken"
- class="gl-mb-3"
- variant="warning"
- :dismissible="false"
- :show-icon="false"
- data-testid="token-disabled-alert"
- >
- {{ $options.i18n.settingDisabledMessage }}
- </gl-alert>
<token-projects-table
:projects="projects"
:table-fields="$options.fields"
diff --git a/app/assets/javascripts/tracing/components/tracing_empty_state.vue b/app/assets/javascripts/tracing/components/tracing_empty_state.vue
new file mode 100644
index 00000000000..4cb3bd6d9f0
--- /dev/null
+++ b/app/assets/javascripts/tracing/components/tracing_empty_state.vue
@@ -0,0 +1,46 @@
+<script>
+import EMPTY_TRACING_SVG from '@gitlab/svgs/dist/illustrations/monitoring/tracing.svg?url';
+import { GlEmptyState, GlButton } from '@gitlab/ui';
+import { __ } from '~/locale';
+
+export default {
+ EMPTY_TRACING_SVG,
+ name: 'TracingEmptyState',
+ i18n: {
+ title: __('Get started with Tracing'),
+ description: __('Monitor your applications with GitLab Distributed Tracing.'),
+ enableButtonText: __('Enable'),
+ },
+ components: {
+ GlEmptyState,
+ GlButton,
+ },
+ props: {
+ enableTracing: {
+ type: Function,
+ required: true,
+ },
+ },
+ methods: {
+ onEnabledClicked() {
+ this.enableTracing();
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-empty-state :title="$options.i18n.title" :svg-path="$options.EMPTY_TRACING_SVG">
+ <template #description>
+ <div>
+ <span>{{ $options.i18n.description }}</span>
+ </div>
+ </template>
+
+ <template #actions>
+ <gl-button variant="confirm" class="gl-mx-2 gl-mb-3" @click="onEnabledClicked">
+ {{ $options.i18n.enableButtonText }}
+ </gl-button>
+ </template>
+ </gl-empty-state>
+</template>
diff --git a/app/assets/javascripts/tracing/components/tracing_list.vue b/app/assets/javascripts/tracing/components/tracing_list.vue
new file mode 100644
index 00000000000..294e520d7ac
--- /dev/null
+++ b/app/assets/javascripts/tracing/components/tracing_list.vue
@@ -0,0 +1,93 @@
+<script>
+import { GlLoadingIcon } from '@gitlab/ui';
+import { __ } from '~/locale';
+import { createAlert } from '~/alert';
+import TracingEmptyState from './tracing_empty_state.vue';
+import TracingTableList from './tracing_table_list.vue';
+
+export default {
+ components: {
+ GlLoadingIcon,
+ TracingTableList,
+ TracingEmptyState,
+ },
+ props: {
+ observabilityClient: {
+ required: true,
+ type: Object,
+ },
+ },
+ data() {
+ return {
+ loading: true,
+ /**
+ * tracingEnabled: boolean | null.
+ * null identifies a state where we don't know if tracing is enabled or not (e.g. when fetching the status from the API fails)
+ */
+ tracingEnabled: null,
+ traces: [],
+ };
+ },
+ async created() {
+ this.checkEnabled();
+ },
+ methods: {
+ async checkEnabled() {
+ this.loading = true;
+ try {
+ this.tracingEnabled = await this.observabilityClient.isTracingEnabled();
+ if (this.tracingEnabled) {
+ await this.fetchTraces();
+ }
+ } catch (e) {
+ createAlert({
+ message: __('Failed to load page.'),
+ });
+ } finally {
+ this.loading = false;
+ }
+ },
+ async enableTracing() {
+ this.loading = true;
+ try {
+ await this.observabilityClient.enableTraces();
+ this.tracingEnabled = true;
+ await this.fetchTraces();
+ } catch (e) {
+ createAlert({
+ message: __('Failed to enable tracing.'),
+ });
+ } finally {
+ this.loading = false;
+ }
+ },
+ async fetchTraces() {
+ this.loading = true;
+ try {
+ const traces = await this.observabilityClient.fetchTraces();
+ this.traces = traces;
+ } catch (e) {
+ createAlert({
+ message: __('Failed to load traces.'),
+ });
+ } finally {
+ this.loading = false;
+ }
+ },
+ },
+};
+</script>
+
+<template>
+ <div>
+ <div v-if="loading" class="gl-py-5">
+ <gl-loading-icon size="lg" />
+ </div>
+
+ <template v-else-if="tracingEnabled !== null">
+ <tracing-empty-state v-if="tracingEnabled === false" :enable-tracing="enableTracing" />
+
+ <tracing-table-list v-else :traces="traces" @reload="fetchTraces" />
+ </template>
+ </div>
+</template>
diff --git a/app/assets/javascripts/tracing/components/tracing_table_list.vue b/app/assets/javascripts/tracing/components/tracing_table_list.vue
new file mode 100644
index 00000000000..7e8c296a7d4
--- /dev/null
+++ b/app/assets/javascripts/tracing/components/tracing_table_list.vue
@@ -0,0 +1,89 @@
+<script>
+import { GlTable, GlLink } from '@gitlab/ui';
+import { __ } from '~/locale';
+
+export const tableDataClass = 'gl-display-flex gl-md-display-table-cell gl-align-items-center';
+export default {
+ name: 'TracingTableList',
+ i18n: {
+ title: __('Traces'),
+ emptyText: __('No traces to display.'),
+ emptyLinkText: __('Check again'),
+ },
+ fields: [
+ {
+ key: 'date',
+ label: __('Date'),
+ tdClass: tableDataClass,
+ sortable: true,
+ },
+ {
+ key: 'service',
+ label: __('Service'),
+ tdClass: tableDataClass,
+ sortable: true,
+ },
+ {
+ key: 'operation',
+ label: __('Operation'),
+ tdClass: tableDataClass,
+ sortable: true,
+ },
+ {
+ key: 'duration',
+ label: __('Duration'),
+ thClass: 'gl-w-15p',
+ tdClass: tableDataClass,
+ sortable: true,
+ },
+ ],
+ components: {
+ GlTable,
+ GlLink,
+ },
+ props: {
+ traces: {
+ required: true,
+ type: Array,
+ },
+ },
+};
+</script>
+
+<template>
+ <div>
+ <h4 class="gl-display-block gl-md-display-none! gl-my-5">{{ $options.i18n.title }}</h4>
+
+ <gl-table
+ class="gl-mt-5"
+ :items="traces"
+ :fields="$options.fields"
+ show-empty
+ fixed
+ stacked="md"
+ tbody-tr-class="table-row"
+ >
+ <template #cell(date)="data">
+ {{ data.item.timestamp }}
+ </template>
+
+ <template #cell(service)="data">
+ {{ data.item.service_name }}
+ </template>
+
+ <template #cell(operation)="data">
+ {{ data.item.operation }}
+ </template>
+
+ <template #cell(duration)="data">
+ <!-- eslint-disable-next-line @gitlab/vue-require-i18n-strings -->
+ {{ `${data.item.duration} ms` }}
+ </template>
+
+ <template #empty>
+ {{ $options.i18n.emptyText }}
+ <gl-link @click="$emit('reload')">{{ $options.i18n.emptyLinkText }}</gl-link>
+ </template>
+ </gl-table>
+ </div>
+</template>
diff --git a/app/assets/javascripts/tracing/list_index.vue b/app/assets/javascripts/tracing/list_index.vue
new file mode 100644
index 00000000000..432fbb81506
--- /dev/null
+++ b/app/assets/javascripts/tracing/list_index.vue
@@ -0,0 +1,37 @@
+<script>
+import ObservabilityContainer from '~/observability/components/observability_container.vue';
+import TracingList from './components/tracing_list.vue';
+
+export default {
+ components: {
+ ObservabilityContainer,
+ TracingList,
+ },
+ props: {
+ oauthUrl: {
+ type: String,
+ required: true,
+ },
+ tracingUrl: {
+ type: String,
+ required: true,
+ },
+ provisioningUrl: {
+ type: String,
+ required: true,
+ },
+ },
+};
+</script>
+
+<template>
+ <observability-container
+ :oauth-url="oauthUrl"
+ :tracing-url="tracingUrl"
+ :provisioning-url="provisioningUrl"
+ >
+ <template #default="{ observabilityClient }">
+ <tracing-list :observability-client="observabilityClient" />
+ </template>
+ </observability-container>
+</template>
diff --git a/app/assets/javascripts/tracking/constants.js b/app/assets/javascripts/tracking/constants.js
index 968e866eedd..d0447fa167c 100644
--- a/app/assets/javascripts/tracking/constants.js
+++ b/app/assets/javascripts/tracking/constants.js
@@ -19,9 +19,14 @@ export const DEFAULT_SNOWPLOW_OPTIONS = {
export const ACTION_ATTR_SELECTOR = '[data-track-action]';
export const LOAD_ACTION_ATTR_SELECTOR = '[data-track-action="render"]';
+export const INTERNAL_EVENTS_SELECTOR = '[data-event-tracking]';
export const URLS_CACHE_STORAGE_KEY = 'gl-snowplow-pseudonymized-urls';
export const REFERRER_TTL = 24 * 60 * 60 * 1000;
export const GOOGLE_ANALYTICS_ID_COOKIE_NAME = '_ga';
+
+export const GITLAB_INTERNAL_EVENT_CATEGORY = 'InternalEventTracking';
+
+export const SERVICE_PING_SCHEMA = 'iglu:com.gitlab/gitlab_service_ping/jsonschema/1-0-0';
diff --git a/app/assets/javascripts/tracking/index.js b/app/assets/javascripts/tracking/index.js
index 472ce3c5bbf..7c2cd6fde27 100644
--- a/app/assets/javascripts/tracking/index.js
+++ b/app/assets/javascripts/tracking/index.js
@@ -2,8 +2,10 @@ import { getAllExperimentContexts } from '~/experimentation/utils';
import { DEFAULT_SNOWPLOW_OPTIONS } from './constants';
import getStandardContext from './get_standard_context';
import Tracking from './tracking';
+import InternalEvents from './internal_events';
export { Tracking as default };
+export { InternalEvents };
/**
* Tracker initialization as defined in:
@@ -67,4 +69,6 @@ export function initDefaultTrackers() {
Tracking.bindDocument();
Tracking.trackLoadEvents();
+
+ InternalEvents.bindInternalEventDocument();
}
diff --git a/app/assets/javascripts/tracking/internal_events.js b/app/assets/javascripts/tracking/internal_events.js
new file mode 100644
index 00000000000..16cbb3e86e1
--- /dev/null
+++ b/app/assets/javascripts/tracking/internal_events.js
@@ -0,0 +1,58 @@
+import API from '~/api';
+
+import Tracking from './tracking';
+import { GITLAB_INTERNAL_EVENT_CATEGORY, SERVICE_PING_SCHEMA } from './constants';
+import { Tracker } from './tracker';
+import { InternalEventHandler } from './utils';
+
+const InternalEvents = {
+ /**
+ *
+ * @param {string} event
+ */
+ track_event(event) {
+ API.trackRedisHllUserEvent(event);
+ Tracking.event(GITLAB_INTERNAL_EVENT_CATEGORY, event, {
+ context: {
+ schema: SERVICE_PING_SCHEMA,
+ data: {
+ event_name: event,
+ data_source: 'redis_hll',
+ },
+ },
+ });
+ },
+ /**
+ * Returns an implementation of this class in the form of
+ * a Vue mixin.
+ */
+ mixin() {
+ return {
+ methods: {
+ track_event(event) {
+ InternalEvents.track_event(event);
+ },
+ },
+ };
+ },
+ /**
+ * Attaches event handlers for data-attributes powered events.
+ *
+ * @param {HTMLElement} parent - element containing data-attributes
+ * @returns {Object} handler - object containing name of the event and its corresponding function
+ */
+ bindInternalEventDocument(parent = document) {
+ if (!Tracker.enabled() || parent.internalEventsTrackingBound) {
+ return [];
+ }
+
+ // eslint-disable-next-line no-param-reassign
+ parent.internalEventsTrackingBound = true;
+
+ const handler = { name: 'click', func: (e) => InternalEventHandler(e, this.track_event) };
+ parent.addEventListener(handler.name, handler.func);
+ return handler;
+ },
+};
+
+export default InternalEvents;
diff --git a/app/assets/javascripts/tracking/utils.js b/app/assets/javascripts/tracking/utils.js
index cc0d7e7a44a..7cbc0f1843e 100644
--- a/app/assets/javascripts/tracking/utils.js
+++ b/app/assets/javascripts/tracking/utils.js
@@ -6,6 +6,7 @@ import {
LOAD_ACTION_ATTR_SELECTOR,
URLS_CACHE_STORAGE_KEY,
REFERRER_TTL,
+ INTERNAL_EVENTS_SELECTOR,
} from './constants';
export const addExperimentContext = (opts) => {
@@ -69,6 +70,23 @@ export const createEventPayload = (el, { suffix = '' } = {}) => {
};
};
+export const createInternalEventPayload = (el) => {
+ const { eventTracking } = el?.dataset || {};
+
+ return eventTracking;
+};
+
+export const InternalEventHandler = (e, func) => {
+ const el = e.target.closest(INTERNAL_EVENTS_SELECTOR);
+
+ if (!el) {
+ return;
+ }
+ const event = createInternalEventPayload(el);
+
+ func(event);
+};
+
export const eventHandler = (e, func, opts = {}) => {
const actionSelector = `${ACTION_ATTR_SELECTOR}:not(${LOAD_ACTION_ATTR_SELECTOR})`;
const el = e.target.closest(actionSelector);
diff --git a/app/assets/javascripts/usage_quotas/storage/components/usage_graph.vue b/app/assets/javascripts/usage_quotas/storage/components/usage_graph.vue
index cdaba2ad3f9..c1e513d3a00 100644
--- a/app/assets/javascripts/usage_quotas/storage/components/usage_graph.vue
+++ b/app/assets/javascripts/usage_quotas/storage/components/usage_graph.vue
@@ -20,7 +20,6 @@ export default {
const {
containerRegistrySize,
buildArtifactsSize,
- pipelineArtifactsSize,
lfsObjectsSize,
packagesSize,
repositorySize,
@@ -65,12 +64,6 @@ export default {
size: buildArtifactsSize,
},
{
- id: 'pipelineArtifacts',
- style: this.usageStyle(this.barRatio(pipelineArtifactsSize)),
- class: 'gl-bg-data-viz-green-800',
- size: pipelineArtifactsSize,
- },
- {
id: 'wiki',
style: this.usageStyle(this.barRatio(wikiSize)),
class: 'gl-bg-data-viz-magenta-500',
diff --git a/app/assets/javascripts/usage_quotas/storage/constants.js b/app/assets/javascripts/usage_quotas/storage/constants.js
index f08e8db26b9..8926e8c1e86 100644
--- a/app/assets/javascripts/usage_quotas/storage/constants.js
+++ b/app/assets/javascripts/usage_quotas/storage/constants.js
@@ -38,11 +38,6 @@ export const PROJECT_STORAGE_TYPES = [
description: s__('UsageQuota|Job artifacts created by CI/CD.'),
},
{
- id: 'pipelineArtifacts',
- name: __('Pipeline artifacts'),
- description: s__('UsageQuota|Pipeline artifacts created by CI/CD.'),
- },
- {
id: 'lfsObjects',
name: __('LFS'),
description: s__('UsageQuota|Audio samples, videos, datasets, and graphics.'),
@@ -70,19 +65,19 @@ export const PROJECT_STORAGE_TYPES = [
];
export const projectHelpPaths = {
- containerRegistry: helpPagePath(
- 'user/packages/container_registry/reduce_container_registry_storage',
- ),
usageQuotas: helpPagePath('user/usage_quotas'),
usageQuotasNamespaceStorageLimit: helpPagePath('user/usage_quotas', {
anchor: 'namespace-storage-limit',
}),
+ lfsObjects: helpPagePath('/user/project/repository/reducing_the_repo_size_using_git', {
+ anchor: 'repository-cleanup',
+ }),
+ containerRegistry: helpPagePath(
+ 'user/packages/container_registry/reduce_container_registry_storage',
+ ),
buildArtifacts: helpPagePath('ci/pipelines/job_artifacts', {
anchor: 'when-job-artifacts-are-deleted',
}),
- pipelineArtifacts: helpPagePath('/ci/pipelines/pipeline_artifacts', {
- anchor: 'when-pipeline-artifacts-are-deleted',
- }),
packages: helpPagePath('user/packages/package_registry/index.md', {
anchor: 'reduce-storage-usage',
}),
diff --git a/app/assets/javascripts/usage_quotas/storage/queries/project_storage.query.graphql b/app/assets/javascripts/usage_quotas/storage/queries/project_storage.query.graphql
index 85a181d3e01..a6de5ebae16 100644
--- a/app/assets/javascripts/usage_quotas/storage/queries/project_storage.query.graphql
+++ b/app/assets/javascripts/usage_quotas/storage/queries/project_storage.query.graphql
@@ -12,7 +12,6 @@ query getProjectStorageStatistics($fullPath: ID!) {
statistics {
containerRegistrySize
buildArtifactsSize
- pipelineArtifactsSize
lfsObjectsSize
packagesSize
repositorySize
diff --git a/app/assets/javascripts/users/profile/actions/components/user_actions_app.vue b/app/assets/javascripts/users/profile/actions/components/user_actions_app.vue
new file mode 100644
index 00000000000..bf983d911ea
--- /dev/null
+++ b/app/assets/javascripts/users/profile/actions/components/user_actions_app.vue
@@ -0,0 +1,45 @@
+<script>
+import { GlDisclosureDropdown } from '@gitlab/ui';
+import { sprintf, s__ } from '~/locale';
+
+export default {
+ components: {
+ GlDisclosureDropdown,
+ },
+ props: {
+ userId: {
+ type: String,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ // Only implement the copy function in MR for now
+ // https://gitlab.com/gitlab-org/gitlab/-/merge_requests/122971
+ // The rest will be implemented in the upcoming MR.
+ dropdownItems: [
+ {
+ action: this.onUserIdCopy,
+ text: sprintf(this.$options.i18n.userId, { id: this.userId }),
+ extraAttrs: {
+ 'data-clipboard-text': this.userId,
+ },
+ },
+ ],
+ };
+ },
+ methods: {
+ onUserIdCopy() {
+ this.$toast.show(this.$options.i18n.userIdCopied);
+ },
+ },
+ i18n: {
+ userId: s__('UserProfile|Copy user ID: %{id}'),
+ userIdCopied: s__('UserProfile|User ID copied to clipboard'),
+ },
+};
+</script>
+
+<template>
+ <gl-disclosure-dropdown icon="ellipsis_v" category="tertiary" no-caret :items="dropdownItems" />
+</template>
diff --git a/app/assets/javascripts/users/profile/actions/index.js b/app/assets/javascripts/users/profile/actions/index.js
new file mode 100644
index 00000000000..37a3faf82a5
--- /dev/null
+++ b/app/assets/javascripts/users/profile/actions/index.js
@@ -0,0 +1,25 @@
+import Vue from 'vue';
+import { GlToast } from '@gitlab/ui';
+import UserActionsApp from './components/user_actions_app.vue';
+
+export const initUserActionsApp = () => {
+ const mountingEl = document.querySelector('.js-user-profile-actions');
+
+ if (!mountingEl) return false;
+
+ const { userId } = mountingEl.dataset;
+
+ Vue.use(GlToast);
+
+ return new Vue({
+ el: mountingEl,
+ name: 'UserActionsRoot',
+ render(createElement) {
+ return createElement(UserActionsApp, {
+ props: {
+ userId,
+ },
+ });
+ },
+ });
+};
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 028f5370028..f7c0f960c0e 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
@@ -68,7 +68,7 @@ export default {
},
isCollapsible() {
if (!this.isLoadingSummary && this.loadingState !== LOADING_STATES.collapsedError) {
- if (this.shouldCollapse) {
+ if ('shouldCollapse' in this) {
return this.shouldCollapse(this.collapsedData);
}
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 7e329399957..0b8f5ffa397 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
@@ -1,4 +1,5 @@
import Vue from 'vue';
+import { markRaw } from '~/lib/utils/vue3compat/mark_raw';
import ExtensionBase from './base.vue';
// Holds all the currently registered extensions
@@ -7,45 +8,47 @@ export const registeredExtensions = Vue.observable({ extensions: [] });
export const registerExtension = (extension) => {
// Pushes into the extenions array a dynamically created Vue component
// that gets exteneded from `base.vue`
- registeredExtensions.extensions.push({
- extends: ExtensionBase,
- name: extension.name,
- props: {
- mr: {
- type: Object,
- required: true,
+ registeredExtensions.extensions.push(
+ markRaw({
+ extends: ExtensionBase,
+ name: extension.name,
+ props: {
+ mr: {
+ type: Object,
+ required: true,
+ },
},
- },
- telemetry: extension.telemetry,
- i18n: extension.i18n,
- expandEvent: extension.expandEvent,
- enablePolling: extension.enablePolling,
- enableExpandedPolling: extension.enableExpandedPolling,
- modalComponent: extension.modalComponent,
- computed: {
- ...extension.props.reduce(
- (acc, propKey) => ({
- ...acc,
- [propKey]() {
- return this.mr[propKey];
- },
- }),
- {},
- ),
- ...Object.keys(extension.computed).reduce(
- (acc, computedKey) => ({
- ...acc,
- // Making the computed property a method allows us to pass in arguments
- // this allows for each computed property to receive some data
- [computedKey]() {
- return extension.computed[computedKey];
- },
- }),
- {},
- ),
- },
- methods: {
- ...extension.methods,
- },
- });
+ telemetry: extension.telemetry,
+ i18n: extension.i18n,
+ expandEvent: extension.expandEvent,
+ enablePolling: extension.enablePolling,
+ enableExpandedPolling: extension.enableExpandedPolling,
+ modalComponent: extension.modalComponent,
+ computed: {
+ ...extension.props.reduce(
+ (acc, propKey) => ({
+ ...acc,
+ [propKey]() {
+ return this.mr[propKey];
+ },
+ }),
+ {},
+ ),
+ ...Object.keys(extension.computed).reduce(
+ (acc, computedKey) => ({
+ ...acc,
+ // Making the computed property a method allows us to pass in arguments
+ // this allows for each computed property to receive some data
+ [computedKey]() {
+ return extension.computed[computedKey];
+ },
+ }),
+ {},
+ ),
+ },
+ methods: {
+ ...extension.methods,
+ },
+ }),
+ );
};
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/commit_message_dropdown.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/commit_message_dropdown.vue
index 5baeb309f79..8bf4d8816be 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/commit_message_dropdown.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/commit_message_dropdown.vue
@@ -1,10 +1,9 @@
<script>
-import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
+import { GlDisclosureDropdown } from '@gitlab/ui';
export default {
components: {
- GlDropdown,
- GlDropdownItem,
+ GlDisclosureDropdown,
},
props: {
commits: {
@@ -13,28 +12,36 @@ export default {
default: () => [],
},
},
+ computed: {
+ dropdownItems() {
+ return this.commits.map((commit) => ({
+ text: commit.title,
+ extraAttrs: {
+ text: commit.shortId || commit.short_Id,
+ },
+ action: () => {
+ this.$emit('input', commit.message);
+ },
+ }));
+ },
+ },
};
</script>
<template>
<div>
- <gl-dropdown
- right
- text="Use an existing commit message"
+ <gl-disclosure-dropdown
+ placement="right"
+ toggle-text="Use an existing commit message"
category="tertiary"
- variant="confirm"
+ :items="dropdownItems"
size="small"
class="mr-commit-dropdown"
>
- <gl-dropdown-item
- v-for="(commit, index) in commits"
- :key="index"
- class="text-nowrap text-truncate"
- @click="$emit('input', commit.message)"
- >
- <span class="monospace mr-2">{{ commit.shortId || commit.short_id }}</span>
- {{ commit.title }}
- </gl-dropdown-item>
- </gl-dropdown>
+ <template #list-item="{ item }">
+ <span class="gl-mr-2">{{ item.extraAttrs.text }}</span>
+ {{ item.text }}
+ </template>
+ </gl-disclosure-dropdown>
</div>
</template>
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 52cdafd4717..7071759b8bb 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
@@ -27,7 +27,6 @@ import readyToMergeSubscription from '~/vue_merge_request_widget/queries/states/
import HelpPopover from '~/vue_shared/components/help_popover.vue';
import {
AUTO_MERGE_STRATEGIES,
- WARNING,
MT_MERGE_STRATEGY,
PIPELINE_FAILED_STATE,
STATE_MACHINE,
@@ -42,7 +41,6 @@ import CommitMessageDropdown from './commit_message_dropdown.vue';
import SquashBeforeMerge from './squash_before_merge.vue';
import MergeFailedPipelineConfirmationDialog from './merge_failed_pipeline_confirmation_dialog.vue';
-const PIPELINE_RUNNING_STATE = 'running';
const PIPELINE_PENDING_STATE = 'pending';
const PIPELINE_SUCCESS_STATE = 'success';
@@ -133,8 +131,6 @@ export default {
GlFormCheckbox,
GlSkeletonLoader,
MergeFailedPipelineConfirmationDialog,
- MergeTrainHelperIcon: () =>
- import('ee_component/vue_merge_request_widget/components/merge_train_helper_icon.vue'),
MergeImmediatelyConfirmationDialog: () =>
import(
'ee_component/vue_merge_request_widget/components/merge_immediately_confirmation_dialog.vue'
@@ -176,14 +172,11 @@ export default {
};
},
computed: {
- stateData() {
- return this.state;
- },
hasCI() {
- return this.stateData.hasCI || this.stateData.hasCi;
+ return this.state.hasCI || this.state.hasCi;
},
isAutoMergeAvailable() {
- return !isEmpty(this.stateData.availableAutoMergeStrategies);
+ return !isEmpty(this.state.availableAutoMergeStrategies);
},
pipeline() {
return this.state.headPipeline;
@@ -246,30 +239,11 @@ export default {
return PIPELINE_SUCCESS_STATE;
},
- iconClass() {
- if (this.shouldRenderMergeTrainHelperIcon && !this.mr.preventMerge) {
- return PIPELINE_RUNNING_STATE;
- }
-
- if (
- this.status === PIPELINE_FAILED_STATE ||
- !this.commitMessage.length ||
- !this.isMergeAllowed ||
- this.mr.preventMerge
- ) {
- return WARNING;
- }
-
- return PIPELINE_SUCCESS_STATE;
- },
mergeButtonText() {
if (this.isMergingImmediately) {
return __('Merge in progress');
}
- if (this.isAutoMergeAvailable && !this.autoMergeLabelsEnabled) {
- return this.autoMergeTextLegacy;
- }
- if (this.isAutoMergeAvailable && this.autoMergeLabelsEnabled) {
+ if (this.isAutoMergeAvailable) {
return this.autoMergeText;
}
@@ -279,9 +253,6 @@ export default {
return __('Merge');
},
- autoMergeLabelsEnabled() {
- return window.gon?.features?.autoMergeLabelsMrWidget;
- },
showAutoMergeHelperText() {
return (
!(this.status === PIPELINE_FAILED_STATE || this.isPipelineFailed) &&
@@ -289,7 +260,7 @@ export default {
);
},
hasPipelineMustSucceedConflict() {
- return !this.hasCI && this.stateData.onlyAllowMergeIfPipelineSucceeds;
+ return !this.hasCI && this.state.onlyAllowMergeIfPipelineSucceeds;
},
isNotClosed() {
return this.mr.state !== STATUS_CLOSED;
@@ -322,12 +293,7 @@ export default {
return this.preferredAutoMergeStrategy === MT_MERGE_STRATEGY && this.isPipelineFailed;
},
shouldShowMergeControls() {
- return (
- (this.isMergeAllowed || this.isAutoMergeAvailable) &&
- (this.stateData.userPermissions?.canMerge || this.mr.canMerge) &&
- !this.mr.mergeOngoing &&
- !this.mr.autoMergeEnabled
- );
+ return this.state.userPermissions?.canMerge && this.mr.state === 'readyToMerge';
},
sourceBranchDeletedText() {
const isPreMerge = this.mr.state !== STATUS_MERGED;
@@ -354,6 +320,11 @@ export default {
};
},
},
+ watch: {
+ 'mr.state': function mrStateWatcher() {
+ this.isMakingRequest = false;
+ },
+ },
mounted() {
eventHub.$on('ApprovalUpdated', this.updateGraphqlState);
eventHub.$on('MRWidgetUpdateRequested', this.updateGraphqlState);
@@ -441,8 +412,6 @@ export default {
}
this.updateGraphqlState();
-
- this.isMakingRequest = false;
})
.catch(() => {
this.isMakingRequest = false;
@@ -511,13 +480,13 @@ export default {
},
i18n: {
mergeCommitTemplateHintText: s__(
- 'mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}',
+ 'mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}.',
),
squashCommitTemplateHintText: s__(
- 'mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}',
+ 'mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}.',
),
mergeAndSquashCommitTemplatesHintText: s__(
- 'mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}',
+ 'mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}.',
),
sourceDivergedFromTargetText: s__('mrWidget|The source branch is %{link} the target branch'),
divergedCommits: (count) => n__('%d commit behind', '%d commits behind', count),
@@ -619,9 +588,8 @@ export default {
:href="commitTemplateHelpPage"
class="inline-link"
target="_blank"
+ >{{ content }}</gl-link
>
- {{ content }}
- </gl-link>
</template>
</gl-sprintf>
</p>
@@ -692,35 +660,21 @@ export default {
>
{{ __('Merge immediately') }}
</gl-dropdown-item>
- <merge-immediately-confirmation-dialog
- ref="confirmationDialog"
- :docs-url="mr.mergeImmediatelyDocsPath"
- @mergeImmediately="onMergeImmediatelyConfirmation"
- />
</gl-dropdown>
- <merge-train-failed-pipeline-confirmation-dialog
- :visible="isPipelineFailedModalVisibleMergeTrain"
- @startMergeTrain="onStartMergeTrainConfirmation"
- @cancel="isPipelineFailedModalVisibleMergeTrain = false"
- />
- <merge-failed-pipeline-confirmation-dialog
- :visible="isPipelineFailedModalVisibleNormalMerge"
- @mergeWithFailedPipeline="onMergeWithFailedPipelineConfirmation"
- @cancel="isPipelineFailedModalVisibleNormalMerge = false"
- />
</gl-button-group>
- <merge-train-helper-icon
- v-if="shouldRenderMergeTrainHelperIcon && !autoMergeLabelsEnabled"
- class="gl-mx-3"
- />
- <template v-if="showAutoMergeHelperText && autoMergeLabelsEnabled">
+ <template v-if="showAutoMergeHelperText">
<div
class="gl-ml-4 gl-text-gray-500 gl-font-sm"
data-qa-selector="auto_merge_helper_text"
+ data-testid="auto-merge-helper-text"
>
{{ autoMergeHelperText }}
</div>
- <help-popover class="gl-ml-2" :options="autoMergeHelpPopoverOptions">
+ <help-popover
+ class="gl-ml-2"
+ :options="autoMergeHelpPopoverOptions"
+ data-testid="auto-merge-helper-text-icon"
+ >
<gl-sprintf :message="autoMergePopoverSettings.bodyText">
<template #link="{ content }">
<gl-link
@@ -784,6 +738,21 @@ export default {
</div>
</div>
</div>
+ <merge-immediately-confirmation-dialog
+ ref="confirmationDialog"
+ :docs-url="mr.mergeImmediatelyDocsPath"
+ @mergeImmediately="onMergeImmediatelyConfirmation"
+ />
+ <merge-train-failed-pipeline-confirmation-dialog
+ :visible="isPipelineFailedModalVisibleMergeTrain"
+ @startMergeTrain="onStartMergeTrainConfirmation"
+ @cancel="isPipelineFailedModalVisibleMergeTrain = false"
+ />
+ <merge-failed-pipeline-confirmation-dialog
+ :visible="isPipelineFailedModalVisibleNormalMerge"
+ @mergeWithFailedPipeline="onMergeWithFailedPipelineConfirmation"
+ @cancel="isPipelineFailedModalVisibleNormalMerge = false"
+ />
</template>
</div>
</template>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/widget/action_buttons.vue b/app/assets/javascripts/vue_merge_request_widget/components/widget/action_buttons.vue
index 6655af92a55..c38c253564a 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/widget/action_buttons.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/widget/action_buttons.vue
@@ -23,7 +23,7 @@ export default {
default: () => [],
},
},
- data: () => {
+ data() {
return {
timeout: null,
updatingTooltip: false,
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/widget/app.vue b/app/assets/javascripts/vue_merge_request_widget/components/widget/app.vue
index 334fc01c9f7..258fa4edcda 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/widget/app.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/widget/app.vue
@@ -5,16 +5,24 @@ export default {
import(
'~/vue_merge_request_widget/extensions/security_reports/mr_widget_security_reports.vue'
),
+
+ MrTerraformWidget: () => import('~/vue_merge_request_widget/extensions/terraform/index.vue'),
},
+
props: {
mr: {
type: Object,
required: true,
},
},
+
computed: {
+ terraformPlansWidget() {
+ return this.mr.terraformReportsPath && 'MrTerraformWidget';
+ },
+
widgets() {
- return ['MrSecurityWidget'];
+ return [this.terraformPlansWidget, 'MrSecurityWidget'].filter((w) => w);
},
},
};
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/widget/dynamic_content.vue b/app/assets/javascripts/vue_merge_request_widget/components/widget/dynamic_content.vue
index cdce7c6625a..ec979861283 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/widget/dynamic_content.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/widget/dynamic_content.vue
@@ -30,6 +30,11 @@ export default {
required: false,
default: 2,
},
+ rowIndex: {
+ type: Number,
+ required: false,
+ default: -1,
+ },
},
computed: {
statusIcon() {
@@ -44,6 +49,9 @@ export default {
generatedSupportingText() {
return generateText(this.data.supportingText);
},
+ shouldShowThirdLevel() {
+ return this.data.children?.length > 0 && this.level === 2;
+ },
},
methods: {
onClickedAction(action) {
@@ -60,16 +68,19 @@ export default {
:widget-name="widgetName"
:header="data.header"
:help-popover="data.helpPopover"
+ :class="{ 'gl-border-top-0': rowIndex === 0 }"
>
<template #body>
- <div class="gl-display-flex gl-flex-direction-column">
- <div>
- <p v-safe-html="generatedText" class="gl-mb-0"></p>
- <gl-link v-if="data.link" :href="data.link.href">{{ data.link.text }}</gl-link>
- <p v-if="data.supportingText" v-safe-html="generatedSupportingText" class="gl-mb-0"></p>
- <gl-badge v-if="data.badge" :variant="data.badge.variant || 'info'">
- {{ data.badge.text }}
- </gl-badge>
+ <div class="gl-w-full gl-display-flex" :class="{ 'gl-flex-direction-column': level === 1 }">
+ <div class="gl-display-flex gl-flex-grow-1">
+ <div class="gl-display-flex gl-flex-grow-1 gl-flex-direction-column">
+ <p v-safe-html="generatedText" class="gl-mb-0 gl-mr-1"></p>
+ <gl-link v-if="data.link" :href="data.link.href">{{ data.link.text }}</gl-link>
+ <p v-if="data.supportingText" v-safe-html="generatedSupportingText" class="gl-mb-0"></p>
+ <gl-badge v-if="data.badge" :variant="data.badge.variant || 'info'">
+ {{ data.badge.text }}
+ </gl-badge>
+ </div>
<actions
:widget="widgetName"
:tertiary-buttons="data.actions"
@@ -78,10 +89,7 @@ export default {
/>
<p v-if="data.subtext" v-safe-html="generatedSubtext" class="gl-m-0 gl-font-sm"></p>
</div>
- <ul
- v-if="data.children && data.children.length > 0 && level === 2"
- class="gl-m-0 gl-p-0 gl-list-style-none"
- >
+ <ul v-if="shouldShowThirdLevel" class="gl-m-0 gl-p-0 gl-list-style-none">
<li v-for="(childData, index) in data.children" :key="childData.id || index">
<dynamic-content
:data="childData"
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/widget/widget.vue b/app/assets/javascripts/vue_merge_request_widget/components/widget/widget.vue
index 54eb15c8ac8..e327d848d8f 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/widget/widget.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/widget/widget.vue
@@ -10,6 +10,7 @@ import HelpPopover from '~/vue_shared/components/help_popover.vue';
import { DynamicScroller, DynamicScrollerItem } from 'vendor/vue-virtual-scroller';
import { EXTENSION_ICONS } from '../../constants';
import { createTelemetryHub } from '../extensions/telemetry';
+import { generateText } from '../extensions/utils';
import ContentRow from './widget_content_row.vue';
import DynamicContent from './dynamic_content.vue';
import StatusIcon from './status_icon.vue';
@@ -72,9 +73,12 @@ export default {
},
// If the summary slot is not used, this value will be used as a fallback.
summary: {
- type: String,
+ type: Object,
required: false,
default: undefined,
+ validator: (s) => {
+ return Boolean(s.title);
+ },
},
// If the content slot is not used, this value will be used as a fallback.
content: {
@@ -154,7 +158,7 @@ export default {
return {
isExpandedForTheFirstTime: true,
isCollapsed: true,
- isLoading: false,
+ isLoading: true,
isLoadingExpandedContent: false,
summaryError: null,
contentError: null,
@@ -162,6 +166,12 @@ export default {
};
},
computed: {
+ generatedSummary() {
+ return generateText(this.summary?.title || '');
+ },
+ generatedSubSummary() {
+ return generateText(this.summary?.subtitle || '');
+ },
collapseButtonLabel() {
return sprintf(this.isCollapsed ? __('Show details') : __('Hide details'));
},
@@ -171,6 +181,9 @@ export default {
hasActionButtons() {
return this.actionButtons.length > 0 || Boolean(this.$scopedSlots['action-buttons']);
},
+ contentWithKeyField() {
+ return this.content?.map((item, index) => ({ ...item, id: item.id || index }));
+ },
},
watch: {
hasError: {
@@ -289,7 +302,7 @@ export default {
<template>
<section class="media-section" data-testid="widget-extension">
- <div class="gl-px-5 gl-pr-4 gl-py-4 gl-align-items-center gl-display-flex">
+ <div class="gl-px-5 gl-pr-4 gl-py-4 gl-display-flex">
<status-icon
:level="1"
:name="widgetName"
@@ -302,7 +315,14 @@ export default {
>
<div class="gl-flex-grow-1" data-testid="widget-extension-top-level-summary">
<span v-if="summaryError">{{ summaryError }}</span>
- <slot v-else name="summary">{{ isLoading ? loadingText : summary }}</slot>
+ <slot v-else name="summary"
+ ><div v-safe-html="isLoading ? loadingText : generatedSummary"></div>
+ <div
+ v-if="!isLoading && generatedSubSummary"
+ v-safe-html="generatedSubSummary"
+ class="gl-font-sm gl-text-gray-700"
+ ></div
+ ></slot>
</div>
<div class="gl-display-flex">
<help-popover
@@ -336,7 +356,7 @@ export default {
</slot>
</div>
<div
- v-if="isCollapsible"
+ v-if="isCollapsible && !isLoading"
class="gl-border-l-1 gl-border-l-solid gl-border-gray-100 gl-ml-3 gl-pl-3 gl-h-6"
>
<gl-button
@@ -376,8 +396,8 @@ export default {
<div v-else class="gl-w-full">
<slot name="content">
<dynamic-scroller
- v-if="content"
- :items="content"
+ v-if="contentWithKeyField"
+ :items="contentWithKeyField"
:min-item-size="32"
:style="{ maxHeight: '170px' }"
data-testid="dynamic-content-scroller"
@@ -390,6 +410,9 @@ export default {
:data="item"
:widget-name="widgetName"
:level="2"
+ :row-index="index"
+ data-testid="extension-list-item"
+ @clickedAction="onActionClick"
/>
</dynamic-scroller-item>
</template>
diff --git a/app/assets/javascripts/vue_merge_request_widget/constants.js b/app/assets/javascripts/vue_merge_request_widget/constants.js
index db237bc7439..a59f48fb8b2 100644
--- a/app/assets/javascripts/vue_merge_request_widget/constants.js
+++ b/app/assets/javascripts/vue_merge_request_widget/constants.js
@@ -1,5 +1,6 @@
import { s__ } from '~/locale';
import { helpPagePath } from '~/helpers/help_page_helper';
+import { DOCS_URL_IN_EE_DIR } from 'jh_else_ce/lib/utils/url_utility';
import { stateToComponentMap as classStateMap, stateKey } from './stores/state_maps';
export const FOUR_MINUTES_IN_MS = 1000 * 60 * 4;
@@ -26,7 +27,7 @@ export const SP_SHOW_TRACK_VALUE = 10;
export const SP_HELP_CONTENT = s__(
`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.`,
);
-export const SP_HELP_URL = 'https://docs.gitlab.com/ee/ci/quick_start/';
+export const SP_HELP_URL = `${DOCS_URL_IN_EE_DIR}/ci/quick_start/`;
export const SP_ICON_NAME = 'status_notfound';
export const MERGE_ACTIVE_STATUS_PHRASES = [
diff --git a/app/assets/javascripts/vue_merge_request_widget/extensions/security_reports/mr_widget_security_reports.vue b/app/assets/javascripts/vue_merge_request_widget/extensions/security_reports/mr_widget_security_reports.vue
index 6155a912683..e7d8de97f20 100644
--- a/app/assets/javascripts/vue_merge_request_widget/extensions/security_reports/mr_widget_security_reports.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/extensions/security_reports/mr_widget_security_reports.vue
@@ -73,6 +73,9 @@ export default {
hasSecurityReports() {
return this.artifacts.length > 0;
},
+ summary() {
+ return { title: this.$options.i18n.scansHaveRun };
+ },
},
methods: {
handleIsLoading(value) {
@@ -109,7 +112,7 @@ export default {
:widget-name="$options.name"
:is-collapsible="false"
:help-popover="$options.widgetHelpPopover"
- :summary="$options.i18n.scansHaveRun"
+ :summary="summary"
@is-loading="handleIsLoading"
>
<template #action-buttons>
diff --git a/app/assets/javascripts/vue_merge_request_widget/extensions/terraform/index.js b/app/assets/javascripts/vue_merge_request_widget/extensions/terraform/index.js
deleted file mode 100644
index c5cbed4a280..00000000000
--- a/app/assets/javascripts/vue_merge_request_widget/extensions/terraform/index.js
+++ /dev/null
@@ -1,179 +0,0 @@
-import { __, n__, s__, sprintf } from '~/locale';
-import axios from '~/lib/utils/axios_utils';
-import { EXTENSION_ICONS } from '../../constants';
-
-export default {
- name: 'WidgetTerraform',
- enablePolling: true,
- i18n: {
- label: s__('Terraform|Terraform reports'),
- loading: s__('Terraform|Loading Terraform reports...'),
- error: s__('Terraform|Failed to load Terraform reports'),
- reportGenerated: s__('Terraform|A Terraform report was generated in your pipelines.'),
- namedReportGenerated: s__(
- 'Terraform|The job %{strong_start}%{name}%{strong_end} generated a report.',
- ),
- reportChanges: s__(
- 'Terraform|Reported Resource Changes: %{addNum} to add, %{changeNum} to change, %{deleteNum} to delete',
- ),
- reportFailed: s__('Terraform|A Terraform report failed to generate.'),
- namedReportFailed: s__(
- 'Terraform|The job %{strong_start}%{name}%{strong_end} failed to generate a report.',
- ),
- reportErrored: s__('Terraform|Generating the report caused an error.'),
- fullLog: __('Full log'),
- },
- props: ['terraformReportsPath'],
- computed: {
- // Extension computed props
- statusIcon() {
- return EXTENSION_ICONS.warning;
- },
- },
- methods: {
- // Extension methods
- summary({ valid = [], invalid = [] }) {
- let title;
- let subtitle = '';
-
- const validText = sprintf(
- n__(
- 'Terraform|%{strong_start}%{number}%{strong_end} Terraform report was generated in your pipelines',
- 'Terraform|%{strong_start}%{number}%{strong_end} Terraform reports were generated in your pipelines',
- valid.length,
- ),
- {
- number: valid.length,
- },
- false,
- );
-
- const invalidText = sprintf(
- n__(
- 'Terraform|%{strong_start}%{number}%{strong_end} Terraform report failed to generate',
- 'Terraform|%{strong_start}%{number}%{strong_end} Terraform reports failed to generate',
- invalid.length,
- ),
- {
- number: invalid.length,
- },
- false,
- );
-
- if (valid.length) {
- title = validText;
- if (invalid.length) {
- subtitle = invalidText;
- }
- } else {
- title = invalidText;
- }
-
- return {
- subject: title,
- meta: subtitle,
- };
- },
- fetchCollapsedData() {
- return axios
- .get(this.terraformReportsPath)
- .then((res) => {
- const reports = Object.keys(res.data).map((key) => {
- return res.data[key];
- });
-
- const formattedData = this.prepareReports(reports);
-
- return {
- ...res,
- data: formattedData,
- };
- })
- .catch(() => {
- const formattedData = this.prepareReports([{ tf_report_error: 'api_error' }]);
-
- return { data: formattedData };
- });
- },
- fetchFullData() {
- const { valid, invalid } = this.collapsedData;
- return Promise.resolve([...valid, ...invalid]);
- },
- createReportRow(report, iconName) {
- const addNum = Number(report.create);
- const changeNum = Number(report.update);
- const deleteNum = Number(report.delete);
- const validPlanValues = addNum + changeNum + deleteNum >= 0;
-
- const actions = [];
-
- let title;
- let subtitle;
-
- if (report.job_path) {
- const action = {
- href: report.job_path,
- text: this.$options.i18n.fullLog,
- target: '_blank',
- trackFullReportClicked: true,
- };
- actions.push(action);
- }
-
- if (validPlanValues) {
- if (report.job_name) {
- title = sprintf(
- this.$options.i18n.namedReportGenerated,
- {
- name: report.job_name,
- },
- false,
- );
- } else {
- title = this.$options.i18n.reportGenerated;
- }
-
- subtitle = sprintf(`%{small_start}${this.$options.i18n.reportChanges}%{small_end}`, {
- addNum,
- changeNum,
- deleteNum,
- });
- } else {
- if (report.job_name) {
- title = sprintf(
- this.$options.i18n.namedReportFailed,
- {
- name: report.job_name,
- },
- false,
- );
- } else {
- title = this.$options.i18n.reportFailed;
- }
-
- subtitle = sprintf(`%{small_start}${this.$options.i18n.reportErrored}%{small_end}`);
- }
-
- return {
- text: title,
- supportingText: subtitle,
- icon: { name: iconName },
- actions,
- };
- },
- prepareReports(reports) {
- const valid = [];
- const invalid = [];
-
- reports.forEach((report) => {
- if (report.tf_report_error) {
- invalid.push(this.createReportRow(report, EXTENSION_ICONS.error));
- } else {
- valid.push(this.createReportRow(report, EXTENSION_ICONS.success));
- }
- });
-
- return { valid, invalid };
- },
- },
-};
diff --git a/app/assets/javascripts/vue_merge_request_widget/extensions/terraform/index.vue b/app/assets/javascripts/vue_merge_request_widget/extensions/terraform/index.vue
new file mode 100644
index 00000000000..a6d12ed7aec
--- /dev/null
+++ b/app/assets/javascripts/vue_merge_request_widget/extensions/terraform/index.vue
@@ -0,0 +1,200 @@
+<script>
+import { __, n__, s__, sprintf } from '~/locale';
+import axios from '~/lib/utils/axios_utils';
+import MrWidget from '~/vue_merge_request_widget/components/widget/widget.vue';
+import { EXTENSION_ICONS } from '../../constants';
+
+export default {
+ name: 'WidgetTerraform',
+ components: {
+ MrWidget,
+ },
+ props: {
+ mr: {
+ type: Object,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ terraformData: {
+ collapsed: null,
+ expanded: null,
+ },
+ };
+ },
+ i18n: {
+ loading: s__('Terraform|Loading Terraform reports...'),
+ error: s__('Terraform|Failed to load Terraform reports'),
+ reportGenerated: s__('Terraform|A Terraform report was generated in your pipelines.'),
+ namedReportGenerated: s__(
+ 'Terraform|The job %{strong_start}%{name}%{strong_end} generated a report.',
+ ),
+ reportChanges: s__(
+ 'Terraform|Reported Resource Changes: %{addNum} to add, %{changeNum} to change, %{deleteNum} to delete',
+ ),
+ reportFailed: s__('Terraform|A Terraform report failed to generate.'),
+ namedReportFailed: s__(
+ 'Terraform|The job %{strong_start}%{name}%{strong_end} failed to generate a report.',
+ ),
+ reportErrored: s__('Terraform|Generating the report caused an error.'),
+ fullLog: __('Full log'),
+ },
+ computed: {
+ terraformReportsPath() {
+ return this.mr.terraformReportsPath;
+ },
+
+ summary() {
+ const { valid = [], invalid = [] } = this.terraformData.collapsed || {};
+
+ const validText = sprintf(
+ n__(
+ 'Terraform|%{strong_start}%{number}%{strong_end} Terraform report was generated in your pipelines',
+ 'Terraform|%{strong_start}%{number}%{strong_end} Terraform reports were generated in your pipelines',
+ valid.length,
+ ),
+ {
+ number: valid.length,
+ },
+ false,
+ );
+
+ const invalidText = sprintf(
+ n__(
+ 'Terraform|%{strong_start}%{number}%{strong_end} Terraform report failed to generate',
+ 'Terraform|%{strong_start}%{number}%{strong_end} Terraform reports failed to generate',
+ invalid.length,
+ ),
+ {
+ number: invalid.length,
+ },
+ false,
+ );
+
+ return {
+ title: valid.length ? validText : invalidText,
+ subtitle: valid.length && invalid.length ? invalidText : undefined,
+ };
+ },
+ },
+ methods: {
+ fetchCollapsedData() {
+ return axios
+ .get(this.terraformReportsPath)
+ .then((res) => {
+ const reports = Object.keys(res.data).map((key) => {
+ return res.data[key];
+ });
+
+ const formattedData = this.prepareReports(reports);
+
+ const { valid, invalid } = formattedData;
+ this.terraformData.collapsed = formattedData;
+ this.terraformData.expanded = [...valid, ...invalid];
+
+ return {
+ ...res,
+ data: formattedData,
+ };
+ })
+ .catch(() => {
+ const formattedData = this.prepareReports([{ tf_report_error: 'api_error' }]);
+ this.terraformData.collapsed = formattedData;
+ return { data: formattedData };
+ });
+ },
+ createReportRow(report, iconName) {
+ const addNum = Number(report.create);
+ const changeNum = Number(report.update);
+ const deleteNum = Number(report.delete);
+ const validPlanValues = addNum + changeNum + deleteNum >= 0;
+
+ const actions = [];
+
+ let title;
+ let subtitle;
+
+ if (report.job_path) {
+ const action = {
+ href: report.job_path,
+ text: this.$options.i18n.fullLog,
+ target: '_blank',
+ trackFullReportClicked: true,
+ };
+ actions.push(action);
+ }
+
+ if (validPlanValues) {
+ if (report.job_name) {
+ title = sprintf(
+ this.$options.i18n.namedReportGenerated,
+ {
+ name: report.job_name,
+ },
+ false,
+ );
+ } else {
+ title = this.$options.i18n.reportGenerated;
+ }
+
+ subtitle = sprintf(`%{small_start}${this.$options.i18n.reportChanges}%{small_end}`, {
+ addNum,
+ changeNum,
+ deleteNum,
+ });
+ } else {
+ if (report.job_name) {
+ title = sprintf(
+ this.$options.i18n.namedReportFailed,
+ {
+ name: report.job_name,
+ },
+ false,
+ );
+ } else {
+ title = this.$options.i18n.reportFailed;
+ }
+
+ subtitle = sprintf(`%{small_start}${this.$options.i18n.reportErrored}%{small_end}`);
+ }
+
+ return {
+ text: title,
+ supportingText: subtitle,
+ icon: { name: iconName },
+ actions,
+ };
+ },
+ prepareReports(reports) {
+ const valid = [];
+ const invalid = [];
+
+ reports.forEach((report) => {
+ if (report.tf_report_error) {
+ invalid.push(this.createReportRow(report, EXTENSION_ICONS.error));
+ } else {
+ valid.push(this.createReportRow(report, EXTENSION_ICONS.success));
+ }
+ });
+
+ return { valid, invalid };
+ },
+ },
+
+ WARNING_ICON: EXTENSION_ICONS.warning,
+};
+</script>
+
+<template>
+ <mr-widget
+ :error-text="$options.i18n.error"
+ :status-icon-name="$options.WARNING_ICON"
+ :loading-text="$options.i18n.loading"
+ :widget-name="$options.name"
+ :is-collapsible="Boolean(terraformData.collapsed)"
+ :summary="summary"
+ :content="terraformData.expanded"
+ :fetch-collapsed-data="fetchCollapsedData"
+ />
+</template>
diff --git a/app/assets/javascripts/vue_merge_request_widget/mixins/ready_to_merge.js b/app/assets/javascripts/vue_merge_request_widget/mixins/ready_to_merge.js
index 10a54c73273..2f49252a06b 100644
--- a/app/assets/javascripts/vue_merge_request_widget/mixins/ready_to_merge.js
+++ b/app/assets/javascripts/vue_merge_request_widget/mixins/ready_to_merge.js
@@ -31,10 +31,6 @@ export default {
pipelineMustSucceedConflictText() {
return PIPELINE_MUST_SUCCEED_CONFLICT_TEXT;
},
- autoMergeTextLegacy() {
- // MWPS is currently the only auto merge strategy available in CE
- return __('Merge when pipeline succeeds');
- },
autoMergeText() {
return __('Set to auto-merge');
},
@@ -51,7 +47,7 @@ export default {
};
},
shouldShowMergeImmediatelyDropdown() {
- return this.isPipelineActive && !this.stateData.onlyAllowMergeIfPipelineSucceeds;
+ return this.isPipelineActive && !this.state.onlyAllowMergeIfPipelineSucceeds;
},
isMergeImmediatelyDangerous() {
return false;
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 af9e303594a..52a2f42f8ec 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
@@ -55,7 +55,6 @@ import eventHub from './event_hub';
import mergeRequestQueryVariablesMixin from './mixins/merge_request_query_variables';
import getStateQuery from './queries/get_state.query.graphql';
import getStateSubscription from './queries/get_state.subscription.graphql';
-import terraformExtension from './extensions/terraform';
import accessibilityExtension from './extensions/accessibility';
import codeQualityExtension from './extensions/code_quality';
import testReportExtension from './extensions/test_report';
@@ -219,14 +218,6 @@ export default {
shouldRenderCodeQuality() {
return this.mr?.codequalityReportsPath;
},
- shouldRenderSourceBranchRemovalStatus() {
- return (
- !this.mr.canRemoveSourceBranch &&
- this.mr.shouldRemoveSourceBranch &&
- !this.mr.isNothingToMergeState &&
- !this.mr.isMergedState
- );
- },
shouldRenderCollaborationStatus() {
return this.mr.allowCollaboration && this.mr.isOpen;
},
@@ -238,9 +229,6 @@ export default {
this.mr.mergePipelinesEnabled && this.mr.sourceProjectId !== this.mr.targetProjectId,
);
},
- shouldRenderTerraformPlans() {
- return Boolean(this.mr?.terraformReportsPath);
- },
shouldRenderTestReport() {
return Boolean(this.mr?.testResultsPath);
},
@@ -292,11 +280,6 @@ export default {
this.initPostMergeDeploymentsPolling();
}
},
- shouldRenderTerraformPlans(newVal) {
- if (newVal) {
- this.registerTerraformPlans();
- }
- },
shouldRenderCodeQuality(newVal) {
if (newVal) {
this.registerCodeQualityExtension();
@@ -546,11 +529,6 @@ export default {
dismissSuggestPipelines() {
this.mr.isDismissedSuggestPipeline = true;
},
- registerTerraformPlans() {
- if (this.shouldRenderTerraformPlans) {
- registerExtension(terraformExtension);
- }
- },
registerAccessibilityExtension() {
if (this.shouldShowAccessibilityReport) {
registerExtension(accessibilityExtension);
@@ -570,7 +548,7 @@ export default {
};
</script>
<template>
- <div v-if="!loading" class="mr-state-widget gl-mt-3">
+ <div v-if="!loading" id="widget-state" class="mr-state-widget gl-mt-5">
<header
v-if="shouldRenderCollaborationStatus"
class="gl-rounded-base gl-border-solid gl-border-1 gl-border-gray-100 gl-overflow-hidden mr-widget-workflow gl-mt-0!"
@@ -590,7 +568,11 @@ export default {
:user-callout-feature-id="mr.suggestPipelineFeatureId"
@dismiss="dismissSuggestPipelines"
/>
- <mr-widget-pipeline-container v-if="shouldRenderPipelines" :mr="mr" />
+ <mr-widget-pipeline-container
+ v-if="shouldRenderPipelines"
+ :mr="mr"
+ data-testid="pipeline-container"
+ />
<mr-widget-approvals v-if="shouldRenderApprovals" :mr="mr" :service="service" />
<report-widget-container>
<extensions-container v-if="hasExtensions" :mr="mr" />
@@ -637,6 +619,7 @@ export default {
class="js-post-merge-pipeline mr-widget-workflow"
:mr="mr"
:is-post-merge="true"
+ data-testid="merged-pipeline-container"
/>
</div>
<loading v-else />
diff --git a/app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_assignees.vue b/app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_assignees.vue
index 4ec301b946b..2d3815439a6 100644
--- a/app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_assignees.vue
+++ b/app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_assignees.vue
@@ -22,15 +22,15 @@ const DATA_REFETCH_DELAY = 250;
export default {
i18n: {
FETCH_USERS_ERROR: s__(
- 'AlertManagement|There was an error while updating the assignee(s) list. Please try again.',
+ 'AlertManagement|There was an error while updating the assignees list. Please try again.',
),
UPDATE_ALERT_ASSIGNEES_ERROR: s__(
- 'AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again.',
+ 'AlertManagement|There was an error while updating the assignees of the alert. Please try again.',
),
UPDATE_ALERT_ASSIGNEES_GRAPHQL_ERROR: s__(
'AlertManagement|This assignee cannot be assigned to this alert.',
),
- ASSIGNEES_BLOCK: s__('AlertManagement|Alert assignee(s): %{assignees}'),
+ ASSIGNEES_BLOCK: s__('AlertManagement|Alert assignees: %{assignees}'),
},
components: {
GlIcon,
diff --git a/app/assets/javascripts/vue_shared/components/actions_button.vue b/app/assets/javascripts/vue_shared/components/actions_button.vue
index c3f3226c46e..1d6dbef799a 100644
--- a/app/assets/javascripts/vue_shared/components/actions_button.vue
+++ b/app/assets/javascripts/vue_shared/components/actions_button.vue
@@ -45,8 +45,12 @@ export default {
:category="category"
:toggle-text="toggleText"
data-qa-selector="action_dropdown"
+ fluid-width
+ block
+ @shown="$emit('shown')"
+ @hidden="$emit('hidden')"
>
- <gl-disclosure-dropdown-group>
+ <gl-disclosure-dropdown-group class="edit-dropdown-group-width">
<gl-disclosure-dropdown-item
v-for="action in actions"
:key="action.key"
@@ -65,5 +69,6 @@ export default {
</template>
</gl-disclosure-dropdown-item>
</gl-disclosure-dropdown-group>
+ <slot></slot>
</gl-disclosure-dropdown>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/awards_list.vue b/app/assets/javascripts/vue_shared/components/awards_list.vue
index 8f1f7ba0ad8..59f03b41144 100644
--- a/app/assets/javascripts/vue_shared/components/awards_list.vue
+++ b/app/assets/javascripts/vue_shared/components/awards_list.vue
@@ -184,6 +184,7 @@ export default {
class="gl-mr-3 gl-my-2"
:class="awardList.classes"
:title="awardList.title"
+ :data-emoji-name="awardList.name"
data-testid="award-button"
@click="handleAward(awardList.name)"
>
@@ -209,7 +210,6 @@ export default {
@hidden="setIsMenuOpen(false)"
>
<template #button-content>
- <span class="gl-sr-only">{{ __('Add reaction') }}</span>
<span class="reaction-control-icon reaction-control-icon-neutral">
<gl-icon name="slight-smile" />
</span>
diff --git a/app/assets/javascripts/vue_shared/components/blob_viewers/rich_viewer.vue b/app/assets/javascripts/vue_shared/components/blob_viewers/rich_viewer.vue
index 3a3929fba9b..3e24a35ea39 100644
--- a/app/assets/javascripts/vue_shared/components/blob_viewers/rich_viewer.vue
+++ b/app/assets/javascripts/vue_shared/components/blob_viewers/rich_viewer.vue
@@ -12,8 +12,22 @@ export default {
SafeHtml,
},
mixins: [ViewerMixin],
+ data() {
+ return {
+ isLoading: true,
+ };
+ },
mounted() {
- handleBlobRichViewer(this.$refs.content, this.type);
+ window.requestIdleCallback(async () => {
+ /**
+ * Rendering Markdown usually takes long due to the amount of HTML being parsed.
+ * This ensures that content is loaded only when the browser goes into idle.
+ * More details here: https://gitlab.com/gitlab-org/gitlab/-/issues/331448
+ * */
+ this.isLoading = false;
+ await this.$nextTick();
+ handleBlobRichViewer(this.$refs.content, this.type);
+ });
},
safeHtmlConfig: {
ADD_TAGS: ['gl-emoji', 'copy-code'],
@@ -22,6 +36,7 @@ export default {
</script>
<template>
<markdown-field-view
+ v-if="!isLoading"
ref="content"
v-safe-html:[$options.safeHtmlConfig]="richViewer || content"
/>
diff --git a/app/assets/javascripts/vue_shared/components/ci_icon.vue b/app/assets/javascripts/vue_shared/components/ci_icon.vue
index 0d7547d88a1..6670b931416 100644
--- a/app/assets/javascripts/vue_shared/components/ci_icon.vue
+++ b/app/assets/javascripts/vue_shared/components/ci_icon.vue
@@ -36,6 +36,15 @@ export default {
status: {
type: Object,
required: true,
+ validator(status) {
+ const { group, icon } = status;
+ return (
+ typeof group === 'string' &&
+ group.length &&
+ typeof icon === 'string' &&
+ icon.startsWith('status_')
+ );
+ },
},
size: {
type: Number,
@@ -69,7 +78,7 @@ export default {
computed: {
wrapperStyleClasses() {
const status = this.status.group;
- return `ci-status-icon ci-status-icon-${status} js-ci-status-icon-${status} gl-rounded-full gl-justify-content-center gl-line-height-0`;
+ return `ci-status-icon ci-status-icon-${status} gl-rounded-full gl-justify-content-center gl-line-height-0`;
},
icon() {
return this.isBorderless ? `${this.status.icon}_borderless` : this.status.icon;
@@ -84,7 +93,6 @@ export default {
{ interactive: isInteractive, active: isActive, borderless: isBorderless },
]"
:style="{ height: `${size}px`, width: `${size}px` }"
- data-testid="ci-icon-wrapper"
>
<gl-icon :name="icon" :size="size" :class="cssClasses" :aria-label="status.icon" />
</span>
diff --git a/app/assets/javascripts/vue_shared/components/code_block_highlighted.vue b/app/assets/javascripts/vue_shared/components/code_block_highlighted.vue
index 352d03befc3..d98858da95f 100644
--- a/app/assets/javascripts/vue_shared/components/code_block_highlighted.vue
+++ b/app/assets/javascripts/vue_shared/components/code_block_highlighted.vue
@@ -1,6 +1,6 @@
<script>
+import { escape } from 'lodash';
import SafeHtml from '~/vue_shared/directives/safe_html';
-
import languageLoader from '~/content_editor/services/highlight_js_language_loader';
import CodeBlock from './code_block.vue';
@@ -39,7 +39,7 @@ export default {
return this.hljs.highlight(this.code, { language: this.language }).value;
}
- return this.code;
+ return escape(this.code);
},
},
async mounted() {
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 90d55d0f93f..c6b9e61b85f 100644
--- a/app/assets/javascripts/vue_shared/components/confirm_danger/constants.js
+++ b/app/assets/javascripts/vue_shared/components/confirm_danger/constants.js
@@ -6,7 +6,5 @@ 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.',
);
-export const CONFIRM_DANGER_PHRASE_TEXT = __(
- 'Please type %{phrase_code} to proceed or close this modal to cancel.',
-);
+export const CONFIRM_DANGER_PHRASE_TEXT = __('Please type %{phrase_code} to proceed.');
export const CONFIRM_DANGER_MODAL_CANCEL = __('Cancel');
diff --git a/app/assets/javascripts/vue_shared/components/entity_select/entity_select.vue b/app/assets/javascripts/vue_shared/components/entity_select/entity_select.vue
index 1a3220d8db9..970c24c6e87 100644
--- a/app/assets/javascripts/vue_shared/components/entity_select/entity_select.vue
+++ b/app/assets/javascripts/vue_shared/components/entity_select/entity_select.vue
@@ -75,10 +75,13 @@ export default {
computed: {
selected: {
set(value) {
- this.$emit('input', value);
this.selectedValue = value;
this.selectedText =
value === null ? null : this.items.find((item) => item.value === value).text;
+ this.$emit('input', {
+ value: this.selectedValue,
+ text: this.selectedText,
+ });
},
get() {
return this.selectedValue;
@@ -161,7 +164,7 @@ export default {
},
onReset() {
this.selected = null;
- this.$emit('input', null);
+ this.$emit('input', {});
},
onBottomReached() {
this.fetchEntities(this.page + 1);
diff --git a/app/assets/javascripts/vue_shared/components/entity_select/group_select.vue b/app/assets/javascripts/vue_shared/components/entity_select/group_select.vue
index ff137d764ee..71e3bf4ff63 100644
--- a/app/assets/javascripts/vue_shared/components/entity_select/group_select.vue
+++ b/app/assets/javascripts/vue_shared/components/entity_select/group_select.vue
@@ -121,6 +121,7 @@ export default {
:default-toggle-text="$options.i18n.toggleText"
:fetch-items="fetchGroups"
:fetch-initial-selection-text="fetchGroupName"
+ v-on="$listeners"
>
<template #error>
<gl-alert v-if="errorMessage" class="gl-mb-3" variant="danger" @dismiss="dismissError">{{
diff --git a/app/assets/javascripts/vue_shared/components/entity_select/project_select.vue b/app/assets/javascripts/vue_shared/components/entity_select/project_select.vue
index 7af3819f2a5..13a825a68f6 100644
--- a/app/assets/javascripts/vue_shared/components/entity_select/project_select.vue
+++ b/app/assets/javascripts/vue_shared/components/entity_select/project_select.vue
@@ -166,6 +166,7 @@ export default {
:fetch-initial-selection-text="fetchProjectName"
:block="block"
clearable
+ v-on="$listeners"
>
<template v-if="hasHtmlLabel" #label>
<span v-safe-html="label"></span>
diff --git a/app/assets/javascripts/vue_shared/components/header_ci_component.vue b/app/assets/javascripts/vue_shared/components/header_ci_component.vue
index 28baabbdb81..1adda905006 100644
--- a/app/assets/javascripts/vue_shared/components/header_ci_component.vue
+++ b/app/assets/javascripts/vue_shared/components/header_ci_component.vue
@@ -114,11 +114,7 @@ export default {
</script>
<template>
- <header
- class="page-content-header gl-md-display-flex gl-min-h-7"
- data-qa-selector="pipeline_header"
- data-testid="ci-header-content"
- >
+ <header class="page-content-header gl-md-display-flex gl-min-h-7" data-testid="ci-header-content">
<section class="header-main-content gl-mr-3">
<ci-badge-link class="gl-mr-3" :status="status" />
diff --git a/app/assets/javascripts/vue_shared/components/listbox_input/init_listbox_inputs.js b/app/assets/javascripts/vue_shared/components/listbox_input/init_listbox_inputs.js
index ad89b78b521..b447822b1e0 100644
--- a/app/assets/javascripts/vue_shared/components/listbox_input/init_listbox_inputs.js
+++ b/app/assets/javascripts/vue_shared/components/listbox_input/init_listbox_inputs.js
@@ -1,5 +1,6 @@
import Vue from 'vue';
import ListboxInput from '~/vue_shared/components/listbox_input/listbox_input.vue';
+import { parseBoolean } from '~/lib/utils/common_utils';
export const initListboxInputs = () => {
const els = [...document.querySelectorAll('.js-listbox-input')];
@@ -30,6 +31,8 @@ export const initListboxInputs = () => {
name,
defaultToggleText,
selected: this.selected,
+ block: parseBoolean(el.dataset.block),
+ fluidWidth: parseBoolean(el.dataset.fluidWidth),
items,
},
attrs: {
diff --git a/app/assets/javascripts/vue_shared/components/listbox_input/listbox_input.vue b/app/assets/javascripts/vue_shared/components/listbox_input/listbox_input.vue
index 0f8ff5291a4..a59a7494472 100644
--- a/app/assets/javascripts/vue_shared/components/listbox_input/listbox_input.vue
+++ b/app/assets/javascripts/vue_shared/components/listbox_input/listbox_input.vue
@@ -47,6 +47,21 @@ export default {
required: false,
default: false,
},
+ fluidWidth: {
+ type: GlCollapsibleListbox.props.fluidWidth.type,
+ required: false,
+ default: GlCollapsibleListbox.props.fluidWidth.default,
+ },
+ placement: {
+ type: GlCollapsibleListbox.props.placement.type,
+ required: false,
+ default: GlCollapsibleListbox.props.placement.default,
+ },
+ block: {
+ type: GlCollapsibleListbox.props.block.type,
+ required: false,
+ default: GlCollapsibleListbox.props.block.default,
+ },
},
data() {
return {
@@ -123,6 +138,9 @@ export default {
:searchable="isSearchable"
:no-results-text="$options.i18n.noResultsText"
:disabled="disabled"
+ :fluid-width="fluidWidth"
+ :placement="placement"
+ :block="block"
@search="search"
@select="$emit($options.model.event, $event)"
/>
diff --git a/app/assets/javascripts/vue_shared/components/markdown/apply_suggestion.vue b/app/assets/javascripts/vue_shared/components/markdown/apply_suggestion.vue
index f51ec715678..a570abae9d3 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/apply_suggestion.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/apply_suggestion.vue
@@ -12,7 +12,8 @@ export default {
},
defaultCommitMessage: {
type: String,
- required: true,
+ required: false,
+ default: null,
},
batchSuggestionsCount: {
type: Number,
diff --git a/app/assets/javascripts/vue_shared/components/markdown/comment_templates_dropdown.vue b/app/assets/javascripts/vue_shared/components/markdown/comment_templates_dropdown.vue
index 186f5619b87..966a5556d24 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/comment_templates_dropdown.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/comment_templates_dropdown.vue
@@ -1,7 +1,6 @@
<script>
import { GlCollapsibleListbox, GlTooltip, GlButton } from '@gitlab/ui';
import fuzzaldrinPlus from 'fuzzaldrin-plus';
-import { updateText } from '~/lib/utils/text_markdown';
import savedRepliesQuery from './saved_replies.query.graphql';
export default {
@@ -54,20 +53,8 @@ export default {
},
onSelect(id) {
const savedReply = this.savedReplies.find((r) => r.id === id);
- const textArea = this.$el.closest('.md-area')?.querySelector('textarea');
-
- if (savedReply && textArea) {
- updateText({
- textArea,
- tag: savedReply.content,
- cursorOffset: 0,
- wrap: false,
- });
-
- // Wait for text to be added into textarea
- requestAnimationFrame(() => {
- textArea.focus();
- });
+ if (savedReply) {
+ this.$emit('select', savedReply.content);
}
},
},
@@ -81,13 +68,14 @@ export default {
:items="filteredSavedReplies"
:toggle-text="__('Insert comment template')"
text-sr-only
+ no-caret
toggle-class="js-comment-template-toggle"
icon="comment-lines"
category="tertiary"
placement="right"
searchable
size="small"
- class="comment-template-dropdown"
+ class="comment-template-dropdown gl-mr-3"
positioning-strategy="fixed"
:searching="$apollo.queries.savedReplies.loading"
@shown="fetchCommentTemplates"
@@ -104,7 +92,7 @@ export default {
</template>
<template #footer>
<div
- class="gl-border-t-solid gl-border-t-1 gl-border-t-gray-100 gl-display-flex gl-justify-content-center gl-p-3"
+ class="gl-border-t-solid gl-border-t-1 gl-border-t-gray-200 gl-display-flex gl-justify-content-center gl-p-2"
>
<gl-button
:href="newCommentTemplatePath"
@@ -130,4 +118,8 @@ export default {
.comment-template-dropdown .gl-new-dropdown-item-check-icon {
display: none;
}
+
+.comment-template-dropdown input {
+ border-radius: 0;
+}
</style>
diff --git a/app/assets/javascripts/vue_shared/components/markdown/editor_mode_switcher.vue b/app/assets/javascripts/vue_shared/components/markdown/editor_mode_switcher.vue
index 645975ca565..2426a917a53 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/editor_mode_switcher.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/editor_mode_switcher.vue
@@ -1,10 +1,16 @@
<script>
-import { GlButton } from '@gitlab/ui';
+import { GlButton, GlPopover, GlLink } from '@gitlab/ui';
+import UserCalloutDismisser from '~/vue_shared/components/user_callout_dismisser.vue';
import { __ } from '~/locale';
+import RICH_TEXT_EDITOR_ILLUSTRATION from '../../../../images/callouts/rich_text_editor_illustration.svg?url';
+import { counter } from './utils';
export default {
components: {
GlButton,
+ GlLink,
+ GlPopover,
+ UserCalloutDismisser,
},
props: {
value: {
@@ -12,21 +18,102 @@ export default {
required: true,
},
},
+ data() {
+ return {
+ counter: counter(),
+ };
+ },
computed: {
+ showPromoPopover() {
+ return this.markdownEditorSelected && this.counter === 0;
+ },
markdownEditorSelected() {
return this.value === 'markdown';
},
text() {
- return this.markdownEditorSelected ? __('Switch to rich text') : __('Switch to Markdown');
+ return this.markdownEditorSelected
+ ? __('Switch to rich text editing')
+ : __('Switch to plain text editing');
},
},
+ methods: {
+ switchEditorType(insertTemplate = false) {
+ this.$emit('switch', insertTemplate);
+ },
+ },
+ richTextEditorButtonId: 'switch-to-rich-text-editor',
+ RICH_TEXT_EDITOR_ILLUSTRATION,
};
</script>
<template>
- <gl-button
- class="btn btn-default btn-sm gl-button btn-default-tertiary"
- data-qa-selector="editing_mode_switcher"
- @click="$emit('input')"
- >{{ text }}</gl-button
- >
+ <div class="content-editor-switcher gl-display-inline-flex gl-align-items-center">
+ <user-callout-dismisser feature-name="rich_text_editor">
+ <template #default="{ dismiss, shouldShowCallout }">
+ <div>
+ <gl-popover
+ :target="$options.richTextEditorButtonId"
+ :show="Boolean(showPromoPopover && shouldShowCallout)"
+ show-close-button
+ :css-classes="['rich-text-promo-popover gl-p-2']"
+ triggers="manual"
+ data-testid="rich-text-promo-popover"
+ @close-button-clicked="dismiss"
+ >
+ <img
+ :src="$options.RICH_TEXT_EDITOR_ILLUSTRATION"
+ :alt="''"
+ class="rich-text-promo-popover-illustration"
+ width="280"
+ height="130"
+ />
+ <h5 class="gl-mt-3 gl-mb-3">{{ __('Writing just got easier') }}</h5>
+ <p class="gl-m-0">
+ {{
+ __(
+ 'Use the new rich text editor to see your text and tables fully formatted as you type. No need to remember any formatting syntax, or switch between preview and editing modes!',
+ )
+ }}
+ </p>
+ <gl-link
+ class="gl-button btn btn-confirm block gl-mb-2 gl-mt-4"
+ variant="confirm"
+ category="primary"
+ target="_blank"
+ block
+ @click="
+ switchEditorType(showPromoPopover);
+ dismiss();
+ "
+ >
+ {{ __('Try the rich text editor now') }}
+ </gl-link>
+ </gl-popover>
+ <gl-button
+ :id="$options.richTextEditorButtonId"
+ class="btn btn-default btn-sm gl-button btn-default-tertiary gl-font-sm! gl-text-secondary! gl-px-4!"
+ data-qa-selector="editing_mode_switcher"
+ @click="
+ switchEditorType();
+ dismiss();
+ "
+ >{{ text }}</gl-button
+ >
+ </div>
+ </template>
+ </user-callout-dismisser>
+ </div>
</template>
+<style>
+.rich-text-promo-popover {
+ box-shadow: 0 0 18px -1.9px rgba(119, 89, 194, 0.16), 0 0 12.9px -1.7px rgba(119, 89, 194, 0.16),
+ 0 0 9.2px -1.4px rgba(119, 89, 194, 0.16), 0 0 6.4px -1.1px rgba(119, 89, 194, 0.16),
+ 0 0 4.5px -0.8px rgba(119, 89, 194, 0.16), 0 0 3px -0.6px rgba(119, 89, 194, 0.16),
+ 0 0 1.8px -0.3px rgba(119, 89, 194, 0.16), 0 0 0.6px rgba(119, 89, 194, 0.16);
+ z-index: 999;
+}
+
+.rich-text-promo-popover-illustration {
+ width: calc(100% + 32px);
+ margin: -32px -16px 0;
+}
+</style>
diff --git a/app/assets/javascripts/vue_shared/components/markdown/field.vue b/app/assets/javascripts/vue_shared/components/markdown/field.vue
index 602a83132e4..7c569763a75 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/field.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/field.vue
@@ -68,10 +68,10 @@ export default {
required: false,
default: false,
},
- quickActionsDocsPath: {
- type: String,
+ supportsQuickActions: {
+ type: Boolean,
required: false,
- default: '',
+ default: false,
},
canAttachFile: {
type: Boolean,
@@ -355,10 +355,7 @@ export default {
<template>
<div
ref="gl-form"
- :class="{
- 'gl-border-none! gl-shadow-none!': removeBorder,
- }"
- class="js-vue-markdown-field md-area position-relative gfm-form"
+ class="js-vue-markdown-field md-area position-relative gfm-form gl-overflow-hidden"
:data-uploads-path="uploadsPath"
>
<markdown-header
@@ -371,13 +368,12 @@ export default {
:uploads-path="uploadsPath"
:markdown-preview-path="markdownPreviewPath"
:drawio-enabled="drawioEnabled"
+ :supports-quick-actions="supportsQuickActions"
data-testid="markdownHeader"
:restricted-tool-bar-items="restrictedToolBarItems"
- :show-content-editor-switcher="showContentEditorSwitcher"
@showPreview="showPreview"
@hidePreview="hidePreview"
@handleSuggestDismissed="() => $emit('handleSuggestDismissed')"
- @enableContentEditor="$emit('enableContentEditor')"
/>
<div v-show="!previewMarkdown" class="md-write-holder">
<div class="zen-backdrop">
@@ -391,36 +387,31 @@ export default {
</a>
<markdown-toolbar
:markdown-docs-path="markdownDocsPath"
- :quick-actions-docs-path="quickActionsDocsPath"
:can-attach-file="canAttachFile"
:show-comment-tool-bar="showCommentToolBar"
+ :show-content-editor-switcher="showContentEditorSwitcher"
+ @enableContentEditor="$emit('enableContentEditor')"
/>
</div>
</div>
- <template v-if="hasSuggestion">
- <div
- v-show="previewMarkdown"
- ref="markdown-preview"
- class="js-vue-md-preview md-preview-holder gl-px-5"
- >
- <suggestions
- v-if="hasSuggestion"
- :note-html="markdownPreview"
- :line-type="lineType"
- :disabled="true"
- :suggestions="suggestions"
- :help-page-path="helpPagePath"
- />
- </div>
- </template>
- <template v-else>
- <div
- v-show="previewMarkdown"
- ref="markdown-preview"
- v-safe-html:[$options.safeHtmlConfig]="markdownPreview"
- class="js-vue-md-preview md md-preview-holder gl-px-5"
- ></div>
- </template>
+ <div
+ v-show="previewMarkdown"
+ ref="markdown-preview"
+ class="js-vue-md-preview md-preview-holder gl-px-5"
+ :class="{ md: !hasSuggestion }"
+ >
+ <suggestions
+ v-if="hasSuggestion"
+ :note-html="markdownPreview"
+ :line-type="lineType"
+ :disabled="true"
+ :suggestions="suggestions"
+ :help-page-path="helpPagePath"
+ />
+ <template v-else>
+ <div v-safe-html:[$options.safeHtmlConfig]="markdownPreview"></div>
+ </template>
+ </div>
<div
v-if="referencedCommands && previewMarkdown && !markdownPreviewLoading"
v-safe-html:[$options.safeHtmlConfig]="referencedCommands"
diff --git a/app/assets/javascripts/vue_shared/components/markdown/header.vue b/app/assets/javascripts/vue_shared/components/markdown/header.vue
index af0b34f1389..0907e064e01 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/header.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/header.vue
@@ -13,13 +13,13 @@ import {
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import { getModifierKey } from '~/constants';
import { getSelectedFragment } from '~/lib/utils/common_utils';
-import { s__, __ } from '~/locale';
+import { truncateSha } from '~/lib/utils/text_utility';
+import { s__, __, sprintf } from '~/locale';
import { CopyAsGFM } from '~/behaviors/markdown/copy_as_gfm';
import { updateText } from '~/lib/utils/text_markdown';
import ToolbarButton from './toolbar_button.vue';
import DrawioToolbarButton from './drawio_toolbar_button.vue';
import CommentTemplatesDropdown from './comment_templates_dropdown.vue';
-import EditorModeSwitcher from './editor_mode_switcher.vue';
export default {
components: {
@@ -29,7 +29,6 @@ export default {
DrawioToolbarButton,
CommentTemplatesDropdown,
AiActionsDropdown: () => import('ee_component/ai/components/ai_actions_dropdown.vue'),
- EditorModeSwitcher,
},
directives: {
GlTooltip: GlTooltipDirective,
@@ -40,6 +39,7 @@ export default {
default: null,
},
editorAiActions: { default: () => [] },
+ mrGeneratedContent: { default: null },
},
props: {
previewMarkdown: {
@@ -91,17 +91,19 @@ export default {
required: false,
default: false,
},
- showContentEditorSwitcher: {
+ supportsQuickActions: {
type: Boolean,
required: false,
default: false,
},
},
data() {
+ const modifierKey = getModifierKey();
return {
tag: '> ',
suggestPopoverVisible: false,
- modifierKey: getModifierKey(),
+ modifierKey,
+ shiftKey: modifierKey === '⌘' ? '⇧' : 'Shift+',
};
},
computed: {
@@ -126,9 +128,6 @@ export default {
const expandText = s__('MarkdownEditor|Click to expand');
return [`<details><summary>${expandText}</summary>`, `{text}`, '</details>'].join('\n');
},
- showEditorModeSwitcher() {
- return this.showContentEditorSwitcher && !this.previewMarkdown;
- },
},
watch: {
showSuggestPopover() {
@@ -199,17 +198,25 @@ export default {
insertIntoTextarea(text) {
const textArea = this.$el.closest('.md-area')?.querySelector('textarea');
if (textArea) {
- const generatedByText = `${text}\n\n---\n\n_${__('This comment was generated by AI')}_`;
updateText({
textArea,
- tag: generatedByText,
+ tag: text,
cursorOffset: 0,
wrap: false,
});
}
},
- handleEditorModeChanged() {
- this.$emit('enableContentEditor');
+ replaceTextarea(text) {
+ const { description, descriptionForSha } = this.$options.i18n;
+ const headSha = document.getElementById('merge_request_diff_head_sha').value;
+ const addendum = headSha
+ ? sprintf(descriptionForSha, { revision: truncateSha(headSha) })
+ : description;
+
+ if (this.mrGeneratedContent) {
+ this.mrGeneratedContent.setGeneratedContent(`${text}\n\n---\n\n_${addendum}_`);
+ this.mrGeneratedContent.showWarning();
+ }
},
switchPreview() {
if (this.previewMarkdown) {
@@ -218,6 +225,12 @@ export default {
this.showMarkdownPreview();
}
},
+ insertAIAction(text) {
+ this.insertIntoTextarea(`${text}\n\n---\n\n_${__('This comment was generated by AI')}_`);
+ },
+ insertSavedReply(savedReply) {
+ this.insertIntoTextarea(savedReply);
+ },
},
shortcuts: {
bold: keysFor(BOLD_TEXT),
@@ -228,27 +241,36 @@ export default {
outdent: keysFor(OUTDENT_LINE),
},
i18n: {
- preview: __('Preview'),
+ comment: __('This comment was generated by AI'),
+ description: s__('MergeRequest|This description was generated using AI'),
+ descriptionForSha: s__(
+ 'MergeRequest|This description was generated for revision %{revision} using AI',
+ ),
hidePreview: __('Continue editing'),
+ preview: __('Preview'),
},
};
</script>
<template>
- <div class="md-header gl-bg-gray-50 gl-px-2 gl-rounded-base gl-mx-2 gl-mt-2">
- <div
- class="gl-display-flex gl-align-items-center gl-flex-wrap"
- :class="{
- 'gl-justify-content-end': previewMarkdown,
- 'gl-justify-content-space-between': !previewMarkdown,
- }"
- >
+ <div class="md-header gl-border-b gl-border-gray-100 gl-px-3">
+ <div class="gl-display-flex gl-align-items-center gl-flex-wrap">
<div
data-testid="md-header-toolbar"
- class="md-header-toolbar gl-display-flex gl-py-2 gl-flex-wrap"
- :class="{ 'gl-display-none!': previewMarkdown }"
+ class="md-header-toolbar gl-display-flex gl-py-3 gl-flex-wrap gl-row-gap-3"
>
- <template v-if="canSuggest">
+ <gl-button
+ v-if="enablePreview"
+ data-testid="preview-toggle"
+ value="preview"
+ :label="$options.i18n.previewTabTitle"
+ class="js-md-preview-button gl-flex-direction-row-reverse gl-align-items-center gl-font-weight-normal! gl-mr-2"
+ size="small"
+ category="tertiary"
+ @click="switchPreview"
+ >{{ previewMarkdown ? $options.i18n.hidePreview : $options.i18n.preview }}</gl-button
+ >
+ <template v-if="!previewMarkdown && canSuggest">
<toolbar-button
ref="suggestButton"
:tag="mdSuggestion"
@@ -289,11 +311,13 @@ export default {
</gl-popover>
</template>
<ai-actions-dropdown
- v-if="editorAiActions.length"
+ v-if="!previewMarkdown && editorAiActions.length"
:actions="editorAiActions"
- @input="insertIntoTextarea"
+ @input="insertAIAction"
+ @replace="replaceTextarea"
/>
<toolbar-button
+ v-show="!previewMarkdown"
tag="**"
:button-title="
/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */
@@ -305,6 +329,7 @@ export default {
icon="bold"
/>
<toolbar-button
+ v-show="!previewMarkdown"
tag="_"
:button-title="
/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */
@@ -317,11 +342,13 @@ export default {
/>
<toolbar-button
v-if="!restrictedToolBarItems.includes('strikethrough')"
+ v-show="!previewMarkdown"
tag="~~"
:button-title="
/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */
- sprintf(s__('MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)'), {
- modifierKey /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */,
+ sprintf(s__('MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)'), {
+ modifierKey,
+ shiftKey /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */,
})
"
:shortcuts="$options.shortcuts.strikethrough"
@@ -329,14 +356,22 @@ export default {
/>
<toolbar-button
v-if="!restrictedToolBarItems.includes('quote')"
+ v-show="!previewMarkdown"
:prepend="true"
:tag="tag"
:button-title="__('Insert a quote')"
icon="quote"
@click="handleQuote"
/>
- <toolbar-button tag="`" tag-block="```" :button-title="__('Insert code')" icon="code" />
<toolbar-button
+ v-show="!previewMarkdown"
+ tag="`"
+ tag-block="```"
+ :button-title="__('Insert code')"
+ icon="code"
+ />
+ <toolbar-button
+ v-show="!previewMarkdown"
tag="[{text}](url)"
tag-select="url"
:button-title="
@@ -350,6 +385,7 @@ export default {
/>
<toolbar-button
v-if="!restrictedToolBarItems.includes('bullet-list')"
+ v-show="!previewMarkdown"
:prepend="true"
tag="- "
:button-title="__('Add a bullet list')"
@@ -357,6 +393,7 @@ export default {
/>
<toolbar-button
v-if="!restrictedToolBarItems.includes('numbered-list')"
+ v-show="!previewMarkdown"
:prepend="true"
tag="1. "
:button-title="__('Add a numbered list')"
@@ -364,6 +401,7 @@ export default {
/>
<toolbar-button
v-if="!restrictedToolBarItems.includes('task-list')"
+ v-show="!previewMarkdown"
:prepend="true"
tag="- [ ] "
:button-title="__('Add a checklist')"
@@ -371,6 +409,7 @@ export default {
/>
<toolbar-button
v-if="!restrictedToolBarItems.includes('indent')"
+ v-show="!previewMarkdown"
class="gl-display-none"
:button-title="
/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */
@@ -384,6 +423,7 @@ export default {
/>
<toolbar-button
v-if="!restrictedToolBarItems.includes('outdent')"
+ v-show="!previewMarkdown"
class="gl-display-none"
:button-title="
/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */
@@ -397,6 +437,7 @@ export default {
/>
<toolbar-button
v-if="!restrictedToolBarItems.includes('collapsible-section')"
+ v-show="!previewMarkdown"
:tag="mdCollapsibleSection"
:prepend="true"
tag-select="Click to expand"
@@ -405,17 +446,18 @@ export default {
/>
<toolbar-button
v-if="!restrictedToolBarItems.includes('table')"
+ v-show="!previewMarkdown"
:tag="mdTable"
:prepend="true"
:button-title="__('Add a table')"
icon="table"
/>
<gl-button
- v-if="!restrictedToolBarItems.includes('attach-file')"
+ v-if="!previewMarkdown && !restrictedToolBarItems.includes('attach-file')"
v-gl-tooltip
:aria-label="__('Attach a file or image')"
:title="__('Attach a file or image')"
- class="gl-mr-2"
+ class="gl-mr-3"
data-testid="button-attach-file"
category="tertiary"
icon="paperclip"
@@ -423,46 +465,37 @@ export default {
@click="handleAttachFile"
/>
<drawio-toolbar-button
- v-if="drawioEnabled"
+ v-if="!previewMarkdown && drawioEnabled"
:uploads-path="uploadsPath"
:markdown-preview-path="markdownPreviewPath"
/>
+ <!-- TODO Add icon and trigger functionality from here -->
+ <toolbar-button
+ v-if="supportsQuickActions"
+ v-show="!previewMarkdown"
+ :prepend="true"
+ tag="/"
+ :button-title="__('Add a quick action')"
+ icon="quick-actions"
+ />
<comment-templates-dropdown
- v-if="newCommentTemplatePath && glFeatures.savedReplies"
+ v-if="!previewMarkdown && newCommentTemplatePath && glFeatures.savedReplies"
:new-comment-template-path="newCommentTemplatePath"
+ @select="insertSavedReply"
/>
- </div>
- <div class="switch-preview gl-py-2 gl-display-flex gl-align-items-center gl-ml-auto">
- <editor-mode-switcher
- v-if="showEditorModeSwitcher"
- size="small"
- class="gl-mr-2"
- value="markdown"
- @input="handleEditorModeChanged"
- />
- <gl-button
- v-if="enablePreview"
- data-testid="preview-toggle"
- value="preview"
- :label="$options.i18n.previewTabTitle"
- class="js-md-preview-button gl-flex-direction-row-reverse gl-align-items-center gl-font-weight-normal!"
- size="small"
- category="tertiary"
- @click="switchPreview"
- >{{ previewMarkdown ? $options.i18n.hidePreview : $options.i18n.preview }}</gl-button
- >
- <gl-button
- v-if="!restrictedToolBarItems.includes('full-screen')"
- v-gl-tooltip
- :class="{ 'gl-display-none!': previewMarkdown }"
- class="js-zen-enter gl-ml-2"
- category="tertiary"
- icon="maximize"
- size="small"
- :title="__('Go full screen')"
- :prepend="true"
- :aria-label="__('Go full screen')"
- />
+ <div v-if="!previewMarkdown" class="full-screen">
+ <gl-button
+ v-if="!restrictedToolBarItems.includes('full-screen')"
+ v-gl-tooltip
+ class="js-zen-enter"
+ category="tertiary"
+ icon="maximize"
+ size="small"
+ :title="__('Go full screen')"
+ :prepend="true"
+ :aria-label="__('Go full screen')"
+ />
+ </div>
</div>
</div>
</div>
diff --git a/app/assets/javascripts/vue_shared/components/markdown/markdown_editor.vue b/app/assets/javascripts/vue_shared/components/markdown/markdown_editor.vue
index 9fd606d775d..8b8247a5b2c 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/markdown_editor.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/markdown_editor.vue
@@ -5,6 +5,7 @@ import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
import { updateDraft, clearDraft, getDraft } from '~/lib/utils/autosave';
import { setUrlParams, joinPaths } from '~/lib/utils/url_utility';
import {
+ EDITING_MODE_KEY,
EDITING_MODE_MARKDOWN_FIELD,
EDITING_MODE_CONTENT_EDITOR,
CLEAR_AUTOSAVE_ENTRY_EVENT,
@@ -80,11 +81,6 @@ export default {
required: false,
default: '',
},
- quickActionsDocsPath: {
- type: String,
- required: false,
- default: '',
- },
drawioEnabled: {
type: Boolean,
required: false,
@@ -100,6 +96,11 @@ export default {
required: false,
default: false,
},
+ codeSuggestionsConfig: {
+ type: Object,
+ required: false,
+ default: () => ({}),
+ },
},
data() {
return {
@@ -171,7 +172,7 @@ export default {
renderMarkdown(markdown) {
const url = setUrlParams(
{ render_quick_actions: this.supportsQuickActions },
- joinPaths(window.location.origin, gon.relative_url_root, this.renderMarkdownPath),
+ joinPaths(gon.relative_url_root || window.location.origin, this.renderMarkdownPath),
);
return axios.post(url, { text: markdown }).then(({ data }) => data.body);
},
@@ -223,14 +224,15 @@ export default {
}
},
},
+ EDITING_MODE_KEY,
};
</script>
<template>
- <div class="md-area gl-px-0! gl-overflow-hidden">
+ <div class="gl-px-0!">
<local-storage-sync
:value="editingMode"
as-string
- storage-key="gl-markdown-editor-mode"
+ :storage-key="$options.EDITING_MODE_KEY"
@input="onEditingModeRestored"
/>
<markdown-field
@@ -240,12 +242,16 @@ export default {
data-testid="markdown-field"
:markdown-preview-path="renderMarkdownPath"
:can-attach-file="!disableAttachments"
+ :can-suggest="codeSuggestionsConfig.canSuggest"
+ :line="codeSuggestionsConfig.line"
+ :lines="codeSuggestionsConfig.lines"
+ :show-suggest-popover="codeSuggestionsConfig.showPopover"
:textarea-value="markdown"
:uploads-path="uploadsPath"
:enable-autocomplete="enableAutocomplete"
:autocomplete-data-sources="autocompleteDataSources"
:markdown-docs-path="markdownDocsPath"
- :quick-actions-docs-path="quickActionsDocsPath"
+ :supports-quick-actions="supportsQuickActions"
:show-content-editor-switcher="enableContentEditor"
:drawio-enabled="drawioEnabled"
:restricted-tool-bar-items="markdownFieldRestrictedToolBarItems"
@@ -272,9 +278,10 @@ export default {
<content-editor
ref="contentEditor"
:render-markdown="renderMarkdown"
+ :markdown-docs-path="markdownDocsPath"
:uploads-path="uploadsPath"
:markdown="markdown"
- :quick-actions-docs-path="quickActionsDocsPath"
+ :supports-quick-actions="supportsQuickActions"
:autofocus="contentEditorAutofocused"
:placeholder="formFieldProps.placeholder"
:drawio-enabled="drawioEnabled"
@@ -282,6 +289,7 @@ export default {
:autocomplete-data-sources="autocompleteDataSources"
:editable="!disabled"
:disable-attachments="disableAttachments"
+ :code-suggestions-config="codeSuggestionsConfig"
@initialized="setEditorAsAutofocused"
@change="updateMarkdownFromContentEditor"
@keydown="$emit('keydown', $event)"
diff --git a/app/assets/javascripts/vue_shared/components/markdown/mount_markdown_editor.js b/app/assets/javascripts/vue_shared/components/markdown/mount_markdown_editor.js
index 8ff14220eab..0b0867ae84c 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/mount_markdown_editor.js
+++ b/app/assets/javascripts/vue_shared/components/markdown/mount_markdown_editor.js
@@ -1,6 +1,9 @@
import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import createApolloClient from '~/lib/graphql';
import { queryToObject, objectToQuery } from '~/lib/utils/url_utility';
import { parseBoolean } from '~/lib/utils/common_utils';
+
import { CLEAR_AUTOSAVE_ENTRY_EVENT } from '../../constants';
import MarkdownEditor from './markdown_editor.vue';
import eventHub from './eventhub';
@@ -51,8 +54,13 @@ function mountAutosaveClearOnSubmit(autosaveKey) {
}
}
-export function mountMarkdownEditor() {
+export function mountMarkdownEditor(options = {}) {
const el = document.querySelector('.js-markdown-editor');
+ const componentConfiguration = {
+ provide: {
+ ...options.provide,
+ },
+ };
if (!el) {
return null;
@@ -71,6 +79,7 @@ export function mountMarkdownEditor() {
const supportsQuickActions = parseBoolean(el.dataset.supportsQuickActions ?? true);
const enableAutocomplete = parseBoolean(el.dataset.enableAutocomplete ?? true);
const disableAttachments = parseBoolean(el.dataset.disableAttachments ?? false);
+ const autofocus = parseBoolean(el.dataset.autofocus ?? true);
const hiddenInput = el.querySelector('input[type="hidden"]');
const formFieldName = hiddenInput.getAttribute('name');
const formFieldId = hiddenInput.getAttribute('id');
@@ -86,6 +95,9 @@ export function mountMarkdownEditor() {
const setFacade = (props) => Object.assign(facade, props);
const autosaveKey = `autosave/${document.location.pathname}/${searchTerm}/description`;
+ componentConfiguration.apolloProvider =
+ options.apolloProvider || new VueApollo({ defaultClient: createApolloClient() });
+
// eslint-disable-next-line no-new
new Vue({
el,
@@ -110,10 +122,11 @@ export function mountMarkdownEditor() {
autocompleteDataSources: gl.GfmAutoComplete?.dataSources,
supportsQuickActions,
disableAttachments,
- autofocus: true,
+ autofocus,
},
});
},
+ ...componentConfiguration,
});
mountAutosaveClearOnSubmit(autosaveKey);
diff --git a/app/assets/javascripts/vue_shared/components/markdown/non_gfm_markdown.stories.js b/app/assets/javascripts/vue_shared/components/markdown/non_gfm_markdown.stories.js
new file mode 100644
index 00000000000..0ba6a44d153
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/markdown/non_gfm_markdown.stories.js
@@ -0,0 +1,89 @@
+import Markdown from '~/vue_shared/components/markdown/non_gfm_markdown.vue';
+
+export default {
+ title: 'vue_shared/non_gfm_markdown',
+ component: Markdown,
+ parameters: {
+ docs: {
+ description: {
+ component: `
+This component is designed to render the markdown, which is **not** the GitLab Flavored Markdown.
+
+It renders the code snippets the same way GitLab Flavored Markdown code snippets are rendered
+respecting the user's preferred color scheme and featuring a copy-code button.
+
+This component can be used to render client-side markdown that doesn't have GitLab-specific markdown elements such as issue links.
+`,
+ },
+ },
+ },
+};
+
+const Template = (args, { argTypes }) => ({
+ components: { Markdown },
+ props: Object.keys(argTypes),
+ template: '<markdown v-bind="$props" />',
+});
+
+const textWithCodeblock = `
+#### Here is the text with the code block.
+
+\`\`\`javascript
+function sayHi(name) {
+ console.log('Hi ' + name || 'Mark');
+}
+\`\`\`
+
+It *can* have **formatting** as well
+`;
+
+export const OneCodeBlock = Template.bind({});
+OneCodeBlock.args = { markdown: textWithCodeblock };
+
+const textWithMultipleCodeBlocks = `
+#### Here is the text with the code block.
+
+\`\`\`javascript
+function sayHi(name) {
+ console.log('Hi ' + name || 'Mark');
+}
+\`\`\`
+
+Note that the copy buttons are appearing independently
+
+\`\`\`yaml
+stages:
+ - build
+ - test
+ - deploy
+\`\`\`
+`;
+
+export const MultipleCodeBlocks = Template.bind({});
+MultipleCodeBlocks.args = { markdown: textWithMultipleCodeBlocks };
+
+const textUndefinedLanguage = `
+#### Here is the code block with no language provided.
+
+\`\`\`
+function sayHi(name) {
+ console.log('Hi ' + name || 'Mark');
+}
+\`\`\`
+`;
+
+export const UndefinedLanguage = Template.bind({});
+UndefinedLanguage.args = { markdown: textUndefinedLanguage };
+
+const textCodeOneLiner = `
+#### Here is the text with the one-liner code block.
+
+Note that copy button rendering is ok.
+
+\`\`\`javascript
+const foo = 'bar';
+\`\`\`
+`;
+
+export const CodeOneLiner = Template.bind({});
+CodeOneLiner.args = { markdown: textCodeOneLiner };
diff --git a/app/assets/javascripts/vue_shared/components/markdown/non_gfm_markdown.vue b/app/assets/javascripts/vue_shared/components/markdown/non_gfm_markdown.vue
new file mode 100644
index 00000000000..814e59681d0
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/markdown/non_gfm_markdown.vue
@@ -0,0 +1,120 @@
+<script>
+/*
+This component is designed to render the markdown, which is **not** the GitLab Flavored Markdown.
+
+It renders the code snippets the same way GitLab Flavored Markdown code snippets are rendered
+respecting the user's preferred color scheme and featuring a copy-code button.
+
+This component can be used to render client-side markdown that doesn't have GitLab-specific markdown elements such as issue links.
+*/
+import { marked } from 'marked';
+import CodeBlockHighlighted from '~/vue_shared/components/code_block_highlighted.vue';
+import SafeHtml from '~/vue_shared/directives/safe_html';
+import { sanitize } from '~/lib/dompurify';
+import { markdownConfig } from '~/lib/utils/text_utility';
+import { __ } from '~/locale';
+import ModalCopyButton from '~/vue_shared/components/modal_copy_button.vue';
+
+export default {
+ components: {
+ CodeBlockHighlighted,
+ ModalCopyButton,
+ },
+ directives: {
+ SafeHtml,
+ },
+ props: {
+ markdown: {
+ type: String,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ hoverMap: {},
+ };
+ },
+ computed: {
+ markdownBlocks() {
+ // we use lexer https://marked.js.org/using_pro#lexer
+ // to get an array of tokens that marked npm module uses.
+ // We will use these tokens to override rendering of some of them
+ // with our vue components
+ const tokens = marked.lexer(this.markdown);
+
+ // since we only want to differentiate between code and non-code blocks
+ // we want non-code blocks merged together so that the markdown parser could render
+ // them according to the markdown rules.
+ // This way we introduce minimum extra wrapper mark-up
+ const flattenedTokens = [];
+
+ for (const token of tokens) {
+ const lastFlattenedToken = flattenedTokens[flattenedTokens.length - 1];
+ if (token.type === 'code') {
+ flattenedTokens.push(token);
+ } else if (lastFlattenedToken?.type === 'markdown') {
+ lastFlattenedToken.raw += token.raw;
+ } else {
+ flattenedTokens.push({ type: 'markdown', raw: token.raw });
+ }
+ }
+
+ return flattenedTokens;
+ },
+ },
+ methods: {
+ getSafeHtml(markdown) {
+ return sanitize(marked.parse(markdown), markdownConfig);
+ },
+ setHoverOn(key) {
+ this.hoverMap = { ...this.hoverMap, [key]: true };
+ },
+ setHoverOff(key) {
+ this.hoverMap = { ...this.hoverMap, [key]: false };
+ },
+ isLastElement(index) {
+ return index === this.markdownBlocks.length - 1;
+ },
+ },
+ safeHtmlConfig: {
+ ADD_TAGS: ['use', 'gl-emoji', 'copy-code'],
+ },
+ i18n: {
+ copyCodeTitle: __('Copy code'),
+ },
+ fallbackLanguage: 'text',
+};
+</script>
+<template>
+ <div>
+ <template v-for="(block, index) in markdownBlocks">
+ <div
+ v-if="block.type === 'code'"
+ :key="`code-${index}`"
+ :class="{ 'gl-relative': true, 'gl-mb-4': !isLastElement(index) }"
+ data-testid="code-block-wrapper"
+ @mouseenter="setHoverOn(`code-${index}`)"
+ @mouseleave="setHoverOff(`code-${index}`)"
+ >
+ <modal-copy-button
+ v-if="hoverMap[`code-${index}`]"
+ :title="$options.i18n.copyCodeTitle"
+ :text="block.text"
+ class="gl-absolute gl-top-3 gl-right-3 gl-z-index-1 gl-transition-duration-medium"
+ />
+ <code-block-highlighted
+ class="gl-border gl-rounded-0! gl-p-4 gl-mb-0 gl-overflow-y-auto"
+ :language="block.lang || $options.fallbackLanguage"
+ :code="block.text"
+ />
+ </div>
+ <div
+ v-else
+ :key="`text-${index}`"
+ v-safe-html:[$options.safeHtmlConfig]="getSafeHtml(block.raw)"
+ :class="{ 'non-gfm-markdown-block': true, 'gl-mb-4': !isLastElement(index) }"
+ data-testid="non-code-markdown"
+ ></div>
+ </template>
+ </div>
+</template>
diff --git a/app/assets/javascripts/vue_shared/components/markdown/suggestions.vue b/app/assets/javascripts/vue_shared/components/markdown/suggestions.vue
index 6d1cadf15be..4423b26560f 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/suggestions.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/suggestions.vue
@@ -40,7 +40,8 @@ export default {
},
defaultCommitMessage: {
type: String,
- required: true,
+ required: false,
+ default: null,
},
suggestionsCount: {
type: Number,
@@ -124,7 +125,7 @@ export default {
suggestion,
batchSuggestionsInfo,
helpPagePath,
- defaultCommitMessage,
+ defaultCommitMessage: defaultCommitMessage || '',
suggestionsCount,
failedToLoadMetadata,
},
diff --git a/app/assets/javascripts/vue_shared/components/markdown/toolbar.vue b/app/assets/javascripts/vue_shared/components/markdown/toolbar.vue
index 4733afb7504..d4b1abedc02 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/toolbar.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/toolbar.vue
@@ -1,24 +1,26 @@
<script>
-import { GlButton, GlLink, GlLoadingIcon, GlSprintf, GlIcon } from '@gitlab/ui';
+import { GlButton, GlLoadingIcon, GlSprintf, GlIcon, GlTooltipDirective } from '@gitlab/ui';
+import { updateText } from '~/lib/utils/text_markdown';
+import { __, sprintf } from '~/locale';
+import { PROMO_URL } from 'jh_else_ce/lib/utils/url_utility';
+import EditorModeSwitcher from './editor_mode_switcher.vue';
export default {
components: {
GlButton,
- GlLink,
GlLoadingIcon,
GlSprintf,
GlIcon,
+ EditorModeSwitcher,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
},
props: {
markdownDocsPath: {
type: String,
required: true,
},
- quickActionsDocsPath: {
- type: String,
- required: false,
- default: '',
- },
canAttachFile: {
type: Boolean,
required: false,
@@ -29,10 +31,46 @@ export default {
required: false,
default: true,
},
+ showContentEditorSwitcher: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
computed: {
- hasQuickActionsDocsPath() {
- return this.quickActionsDocsPath !== '';
+ showEditorModeSwitcher() {
+ return this.showContentEditorSwitcher;
+ },
+ },
+ methods: {
+ insertIntoTextarea(...lines) {
+ const text = lines.join('\n');
+ const textArea = this.$el.closest('.md-area')?.querySelector('textarea');
+ if (textArea && !textArea.value) {
+ updateText({
+ textArea,
+ tag: text,
+ cursorOffset: 0,
+ wrap: false,
+ });
+ }
+ },
+ handleEditorModeChanged(isFirstSwitch) {
+ if (isFirstSwitch) {
+ this.insertIntoTextarea(
+ __(`### Rich text editor`),
+ '',
+ sprintf(
+ __(
+ 'Try out **styling** _your_ content right here or read the [direction](%{directionUrl}).',
+ ),
+ {
+ directionUrl: `${PROMO_URL}/direction/plan/knowledge/content_editor/`,
+ },
+ ),
+ );
+ }
+ this.$emit('enableContentEditor');
},
},
};
@@ -41,94 +79,80 @@ export default {
<template>
<div
v-if="showCommentToolBar"
- class="comment-toolbar gl-mx-2 gl-mb-2 gl-px-4 gl-bg-gray-10 gl-rounded-bottom-left-base gl-rounded-bottom-right-base clearfix"
+ class="comment-toolbar gl-display-flex gl-flex-direction-row gl-px-2 gl-rounded-bottom-left-base gl-rounded-bottom-right-base"
+ :class="
+ showContentEditorSwitcher
+ ? 'gl-justify-content-space-between gl-align-items-center gl-border-t gl-border-gray-100'
+ : 'gl-justify-content-end gl-my-2'
+ "
>
- <div class="toolbar-text gl-font-sm">
- <template v-if="!hasQuickActionsDocsPath && markdownDocsPath">
- <gl-sprintf
- :message="
- s__('MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}')
- "
- >
- <template #markdownDocsLink="{ content }">
- <gl-link :href="markdownDocsPath" target="_blank" class="gl-font-sm">{{
- content
- }}</gl-link>
- </template>
- </gl-sprintf>
- </template>
- <template v-if="hasQuickActionsDocsPath && markdownDocsPath">
- <gl-sprintf
- :message="
- s__(
- 'NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}.',
- )
- "
- >
- <template #markdownDocsLink="{ content }">
- <gl-link :href="markdownDocsPath" target="_blank" class="gl-font-sm">{{
- content
- }}</gl-link>
- </template>
- <template #keyboard="{ content }">
- <kbd>{{ content }}</kbd>
- </template>
- <template #quickActionsDocsLink="{ content }">
- <gl-link :href="quickActionsDocsPath" target="_blank" class="gl-font-sm">{{
- content
- }}</gl-link>
- </template>
- </gl-sprintf>
- </template>
- </div>
- <span v-if="canAttachFile" class="uploading-container gl-font-sm gl-line-height-32">
- <span class="uploading-progress-container hide">
- <gl-icon name="paperclip" />
- <span class="attaching-file-message"></span>
- <!-- eslint-disable-next-line @gitlab/vue-require-i18n-strings -->
- <span class="uploading-progress">0%</span>
- <gl-loading-icon size="sm" inline />
- </span>
- <span class="uploading-error-container hide">
- <span class="uploading-error-icon">
+ <editor-mode-switcher
+ v-if="showEditorModeSwitcher"
+ size="small"
+ value="markdown"
+ @switch="handleEditorModeChanged"
+ />
+ <div class="gl-display-flex">
+ <div v-if="canAttachFile" class="uploading-container gl-font-sm gl-line-height-32 gl-mr-3">
+ <span class="uploading-progress-container hide">
<gl-icon name="paperclip" />
+ <span class="attaching-file-message"></span>
+ <!-- eslint-disable-next-line @gitlab/vue-require-i18n-strings -->
+ <span class="uploading-progress">0%</span>
+ <gl-loading-icon size="sm" inline />
</span>
- <span class="uploading-error-message"></span>
+ <span class="uploading-error-container hide">
+ <span class="uploading-error-icon">
+ <gl-icon name="paperclip" />
+ </span>
+ <span class="uploading-error-message"></span>
- <gl-sprintf
- :message="
- __(
- '%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}.',
- )
- "
+ <gl-sprintf
+ :message="
+ __(
+ '%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}.',
+ )
+ "
+ >
+ <template #retryButton="{ content }">
+ <gl-button
+ variant="link"
+ category="primary"
+ class="retry-uploading-link gl-vertical-align-baseline gl-font-sm!"
+ >
+ {{ content }}
+ </gl-button>
+ </template>
+ <template #newFileButton="{ content }">
+ <gl-button
+ variant="link"
+ category="primary"
+ class="markdown-selector attach-new-file gl-vertical-align-baseline gl-font-sm!"
+ >
+ {{ content }}
+ </gl-button>
+ </template>
+ </gl-sprintf>
+ </span>
+ <gl-button
+ variant="link"
+ category="primary"
+ class="button-cancel-uploading-files gl-vertical-align-baseline hide gl-font-sm!"
>
- <template #retryButton="{ content }">
- <gl-button
- variant="link"
- category="primary"
- class="retry-uploading-link gl-vertical-align-baseline gl-font-sm!"
- >
- {{ content }}
- </gl-button>
- </template>
- <template #newFileButton="{ content }">
- <gl-button
- variant="link"
- category="primary"
- class="markdown-selector attach-new-file gl-vertical-align-baseline gl-font-sm!"
- >
- {{ content }}
- </gl-button>
- </template>
- </gl-sprintf>
- </span>
+ {{ __('Cancel') }}
+ </gl-button>
+ </div>
<gl-button
- variant="link"
- category="primary"
- class="button-cancel-uploading-files gl-vertical-align-baseline hide gl-font-sm!"
- >
- {{ __('Cancel') }}
- </gl-button>
- </span>
+ v-if="markdownDocsPath"
+ v-gl-tooltip
+ icon="markdown-mark"
+ :href="markdownDocsPath"
+ target="_blank"
+ category="tertiary"
+ size="small"
+ title="Markdown is supported"
+ class="gl-px-3!"
+ />
+ </div>
</div>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/markdown/tracking.js b/app/assets/javascripts/vue_shared/components/markdown/tracking.js
new file mode 100644
index 00000000000..2628054ae5f
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/markdown/tracking.js
@@ -0,0 +1,14 @@
+import Tracking from '~/tracking';
+
+export const EDITOR_TRACKING_LABEL = 'editor_tracking';
+export const EDITOR_TYPE_ACTION = 'editor_type_used';
+export const EDITOR_TYPE_PLAIN_TEXT_EDITOR = 'editor_type_plain_text_editor';
+export const EDITOR_TYPE_RICH_TEXT_EDITOR = 'editor_type_rich_text_editor';
+
+export const trackSavedUsingEditor = (isRichText, context) => {
+ Tracking.event(undefined, EDITOR_TYPE_ACTION, {
+ label: EDITOR_TRACKING_LABEL,
+ editorType: isRichText ? EDITOR_TYPE_RICH_TEXT_EDITOR : EDITOR_TYPE_PLAIN_TEXT_EDITOR,
+ context,
+ });
+};
diff --git a/app/assets/javascripts/vue_shared/components/markdown/utils.js b/app/assets/javascripts/vue_shared/components/markdown/utils.js
new file mode 100644
index 00000000000..0227d5a0fbc
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/markdown/utils.js
@@ -0,0 +1,7 @@
+let i = 0;
+
+export const counter = () => {
+ const n = i;
+ i += 1;
+ return n;
+};
diff --git a/app/assets/javascripts/vue_shared/components/mr_more_dropdown.vue b/app/assets/javascripts/vue_shared/components/mr_more_dropdown.vue
index 064458cfc1f..ba557878246 100644
--- a/app/assets/javascripts/vue_shared/components/mr_more_dropdown.vue
+++ b/app/assets/javascripts/vue_shared/components/mr_more_dropdown.vue
@@ -51,6 +51,8 @@ export default {
SidebarSubscriptionsWidget,
AbuseCategorySelector,
NewHeaderActionsPopover,
+ SummaryNotesToggle: () =>
+ import('ee_component/merge_requests/components/summary_notes_toggle.vue'),
},
directives: {
GlTooltip: GlTooltipDirective,
@@ -60,6 +62,9 @@ export default {
reportAbusePath: {
default: '',
},
+ showSummaryNotesToggle: {
+ default: false,
+ },
},
props: {
mr: {
@@ -71,6 +76,11 @@ export default {
default: '',
required: false,
},
+ url: {
+ type: String,
+ default: '',
+ required: false,
+ },
editUrl: {
type: String,
default: '',
@@ -116,11 +126,6 @@ export default {
default: 0,
required: false,
},
- reportedFromUrl: {
- type: String,
- default: '',
- required: false,
- },
},
data() {
return {
@@ -156,7 +161,7 @@ export default {
this.isLoadingDraft = true;
axios
- .put(`?merge_request[wip_event]=${this.draftState}`, null, {
+ .put(`${this.url}?merge_request[wip_event]=${this.draftState}`, null, {
params: { format: 'json' },
})
.then(({ data }) => {
@@ -226,10 +231,12 @@ export default {
:auto-close="false"
>
<template #toggle>
- <div class="gl-min-h-7 gl-mb-2 gl-md-mb-0!" :aria-label="$options.i18n.mergeRequestActions">
+ <div class="gl-min-h-7 gl-mb-2 gl-md-mb-0!">
<gl-button
class="gl-md-display-none! gl-new-dropdown-toggle gl-absolute gl-top-0 gl-left-0 gl-w-full"
category="secondary"
+ :aria-label="$options.i18n.mergeRequestActions"
+ :title="$options.i18n.mergeRequestActions"
>
<span class="">{{ $options.i18n.mergeRequestActions }}</span>
<gl-icon class="dropdown-chevron" name="chevron-down" />
@@ -238,6 +245,8 @@ export default {
class="gl-display-none gl-md-display-flex! gl-new-dropdown-toggle gl-new-dropdown-icon-only gl-new-dropdown-toggle-no-caret gl-ml-3"
category="tertiary"
icon="ellipsis_v"
+ :aria-label="$options.i18n.mergeRequestActions"
+ :title="$options.i18n.mergeRequestActions"
/>
</div>
</template>
@@ -329,6 +338,8 @@ export default {
{{ $options.i18n.copyReferenceText }}
</template>
</gl-disclosure-dropdown-item>
+
+ <summary-notes-toggle v-if="showSummaryNotesToggle" @action="closeActionsDropdown" />
</gl-disclosure-dropdown-group>
<gl-disclosure-dropdown-group
@@ -353,7 +364,7 @@ export default {
<abuse-category-selector
v-if="!isCurrentUser && isReportAbuseDrawerOpen"
:reported-user-id="reportedUserId"
- :reported-from-url="reportedFromUrl"
+ :reported-from-url="url"
:show-drawer="isReportAbuseDrawerOpen"
@close-drawer="reportAbuseAction(false)"
/>
diff --git a/app/assets/javascripts/vue_shared/components/paginated_table_with_search_and_tabs/paginated_table_with_search_and_tabs.vue b/app/assets/javascripts/vue_shared/components/paginated_table_with_search_and_tabs/paginated_table_with_search_and_tabs.vue
index 57e3a97244e..ab9e6e092d9 100644
--- a/app/assets/javascripts/vue_shared/components/paginated_table_with_search_and_tabs/paginated_table_with_search_and_tabs.vue
+++ b/app/assets/javascripts/vue_shared/components/paginated_table_with_search_and_tabs/paginated_table_with_search_and_tabs.vue
@@ -116,6 +116,7 @@ export default {
unique: true,
symbol: '@',
token: UserToken,
+ dataType: 'user',
operators: OPERATORS_IS,
fetchPath: this.projectPath,
fetchUsers: Api.projectUsers.bind(Api),
@@ -127,6 +128,7 @@ export default {
unique: true,
symbol: '@',
token: UserToken,
+ dataType: 'user',
operators: OPERATORS_IS,
fetchPath: this.projectPath,
fetchUsers: Api.projectUsers.bind(Api),
diff --git a/app/assets/javascripts/vue_shared/components/projects_list/projects_list.vue b/app/assets/javascripts/vue_shared/components/projects_list/projects_list.vue
index 11aa7b91745..cb8220a0407 100644
--- a/app/assets/javascripts/vue_shared/components/projects_list/projects_list.vue
+++ b/app/assets/javascripts/vue_shared/components/projects_list/projects_list.vue
@@ -30,12 +30,22 @@ export default {
type: Array,
required: true,
},
+ showProjectIcon: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
};
</script>
<template>
<ul class="gl-p-0 gl-list-style-none">
- <projects-list-item v-for="project in projects" :key="project.id" :project="project" />
+ <projects-list-item
+ v-for="project in projects"
+ :key="project.id"
+ :project="project"
+ :show-project-icon="showProjectIcon"
+ />
</ul>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/projects_list/projects_list_item.vue b/app/assets/javascripts/vue_shared/components/projects_list/projects_list_item.vue
index 266cce29e50..d919f76e684 100644
--- a/app/assets/javascripts/vue_shared/components/projects_list/projects_list_item.vue
+++ b/app/assets/javascripts/vue_shared/components/projects_list/projects_list_item.vue
@@ -34,6 +34,7 @@ export default {
moreTopics: __('More topics'),
updated: __('Updated'),
},
+ avatarSize: { default: 32, md: 48 },
safeHtmlConfig: {
ADD_TAGS: ['gl-emoji'],
},
@@ -78,6 +79,11 @@ export default {
type: Object,
required: true,
},
+ showProjectIcon: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
data() {
return {
@@ -85,11 +91,14 @@ export default {
};
},
computed: {
+ visibility() {
+ return this.project.visibility;
+ },
visibilityIcon() {
- return VISIBILITY_TYPE_ICON[this.project.visibility];
+ return VISIBILITY_TYPE_ICON[this.visibility];
},
visibilityTooltip() {
- return PROJECT_VISIBILITY_TYPE[this.project.visibility];
+ return PROJECT_VISIBILITY_TYPE[this.visibility];
},
accessLevel() {
return this.project.permissions?.projectAccess?.accessLevel;
@@ -150,71 +159,87 @@ export default {
<template>
<li class="projects-list-item gl-py-5 gl-md-display-flex gl-align-items-center gl-border-b">
- <gl-avatar-labeled
- class="gl-flex-grow-1"
- :entity-id="project.id"
- :entity-name="project.name"
- :label="project.name"
- :label-link="project.webUrl"
- shape="rect"
- :size="48"
- >
- <template #meta>
- <gl-icon
- v-gl-tooltip="visibilityTooltip"
- :name="visibilityIcon"
- class="gl-text-secondary gl-ml-3"
- />
- <user-access-role-badge v-if="shouldShowAccessLevel" class="gl-ml-3">{{
- accessLevelLabel
- }}</user-access-role-badge>
- </template>
- <div
- v-if="project.descriptionHtml"
- v-safe-html:[$options.safeHtmlConfig]="project.descriptionHtml"
- class="gl-font-sm gl-overflow-hidden gl-line-height-20 description"
- data-testid="project-description"
- ></div>
- <div v-if="hasTopics" class="gl-mt-3" data-testid="project-topics">
- <div
- class="gl-w-full gl-display-inline-flex gl-flex-wrap gl-font-base gl-font-weight-normal gl-align-items-center gl-mx-n2 gl-my-n2"
- >
- <span class="gl-p-2 gl-text-secondary">{{ $options.i18n.topics }}:</span>
- <div v-for="topic in visibleTopics" :key="topic" class="gl-p-2">
- <gl-badge v-gl-tooltip="topicTooltipTitle(topic)" :href="topicPath(topic)">
- {{ topicTitle(topic) }}
- </gl-badge>
+ <div class="gl-display-flex gl-flex-grow-1">
+ <gl-icon
+ v-if="showProjectIcon"
+ class="gl-mr-3 gl-mt-3 gl-md-mt-5 gl-flex-shrink-0 gl-text-secondary"
+ name="project"
+ />
+ <gl-avatar-labeled
+ :entity-id="project.id"
+ :entity-name="project.name"
+ :label="project.name"
+ :label-link="project.webUrl"
+ shape="rect"
+ :size="$options.avatarSize"
+ >
+ <template #meta>
+ <div class="gl-px-2">
+ <div class="gl-mx-n2 gl-display-flex gl-align-items-center gl-flex-wrap">
+ <div class="gl-px-2">
+ <gl-icon
+ v-if="visibility"
+ v-gl-tooltip="visibilityTooltip"
+ :name="visibilityIcon"
+ class="gl-text-secondary"
+ />
+ </div>
+ <div class="gl-px-2">
+ <user-access-role-badge v-if="shouldShowAccessLevel">{{
+ accessLevelLabel
+ }}</user-access-role-badge>
+ </div>
+ </div>
</div>
- <template v-if="popoverTopics.length">
- <div
- :id="topicsPopoverTarget"
- class="gl-p-2 gl-text-secondary"
- role="button"
- tabindex="0"
- >
- <gl-sprintf :message="$options.i18n.topicsPopoverTargetText">
- <template #count>{{ popoverTopics.length }}</template>
- </gl-sprintf>
+ </template>
+ <div
+ v-if="project.descriptionHtml"
+ v-safe-html:[$options.safeHtmlConfig]="project.descriptionHtml"
+ class="gl-font-sm gl-overflow-hidden gl-line-height-20 description md"
+ data-testid="project-description"
+ ></div>
+ <div v-if="hasTopics" class="gl-mt-3" data-testid="project-topics">
+ <div
+ class="gl-w-full gl-display-inline-flex gl-flex-wrap gl-font-base gl-font-weight-normal gl-align-items-center gl-mx-n2 gl-my-n2"
+ >
+ <span class="gl-p-2 gl-text-secondary">{{ $options.i18n.topics }}:</span>
+ <div v-for="topic in visibleTopics" :key="topic" class="gl-p-2">
+ <gl-badge v-gl-tooltip="topicTooltipTitle(topic)" :href="topicPath(topic)">
+ {{ topicTitle(topic) }}
+ </gl-badge>
</div>
- <gl-popover :target="topicsPopoverTarget" :title="$options.i18n.moreTopics">
- <div class="gl-font-base gl-font-weight-normal gl-mx-n2 gl-my-n2">
- <div
- v-for="topic in popoverTopics"
- :key="topic"
- class="gl-p-2 gl-display-inline-block"
- >
- <gl-badge v-gl-tooltip="topicTooltipTitle(topic)" :href="topicPath(topic)">
- {{ topicTitle(topic) }}
- </gl-badge>
- </div>
+ <template v-if="popoverTopics.length">
+ <div
+ :id="topicsPopoverTarget"
+ class="gl-p-2 gl-text-secondary"
+ role="button"
+ tabindex="0"
+ >
+ <gl-sprintf :message="$options.i18n.topicsPopoverTargetText">
+ <template #count>{{ popoverTopics.length }}</template>
+ </gl-sprintf>
</div>
- </gl-popover>
- </template>
+ <gl-popover :target="topicsPopoverTarget" :title="$options.i18n.moreTopics">
+ <div class="gl-font-base gl-font-weight-normal gl-mx-n2 gl-my-n2">
+ <div
+ v-for="topic in popoverTopics"
+ :key="topic"
+ class="gl-p-2 gl-display-inline-block"
+ >
+ <gl-badge v-gl-tooltip="topicTooltipTitle(topic)" :href="topicPath(topic)">
+ {{ topicTitle(topic) }}
+ </gl-badge>
+ </div>
+ </div>
+ </gl-popover>
+ </template>
+ </div>
</div>
- </div>
- </gl-avatar-labeled>
+ </gl-avatar-labeled>
+ </div>
<div
- class="gl-md-display-flex gl-flex-direction-column gl-align-items-flex-end gl-flex-shrink-0 gl-mt-3 gl-pl-10 gl-md-pl-0 gl-md-mt-0"
+ class="gl-md-display-flex gl-flex-direction-column gl-align-items-flex-end gl-flex-shrink-0 gl-mt-3 gl-md-pl-0 gl-md-mt-0"
+ :class="showProjectIcon ? 'gl-pl-11' : 'gl-pl-8'"
>
<div class="gl-display-flex gl-align-items-center gl-gap-x-3">
<gl-badge v-if="project.archived" variant="warning">{{ $options.i18n.archived }}</gl-badge>
@@ -248,7 +273,10 @@ export default {
<span>{{ numberToMetricPrefix(project.openIssuesCount) }}</span>
</gl-link>
</div>
- <div class="gl-font-sm gl-white-space-nowrap gl-text-secondary gl-mt-3">
+ <div
+ v-if="project.updatedAt"
+ class="gl-font-sm gl-white-space-nowrap gl-text-secondary gl-mt-3"
+ >
<span>{{ $options.i18n.updated }}</span>
<time-ago-tooltip :time="project.updatedAt" />
</div>
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 5d0ee6adffe..ccda8c5fea7 100644
--- a/app/assets/javascripts/vue_shared/components/registry/list_item.vue
+++ b/app/assets/javascripts/vue_shared/components/registry/list_item.vue
@@ -1,9 +1,13 @@
<script>
-import { GlButton } from '@gitlab/ui';
+import { GlButton, GlTooltipDirective } from '@gitlab/ui';
+import { __ } from '~/locale';
export default {
name: 'ListItem',
components: { GlButton },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
props: {
first: {
type: Boolean,
@@ -27,6 +31,9 @@ export default {
detailsSlots: [],
};
},
+ i18n: {
+ toggleDetailsLabel: __('Toggle details'),
+ },
computed: {
optionalClasses() {
return {
@@ -75,10 +82,14 @@ export default {
<slot name="left-primary"></slot>
<gl-button
v-if="detailsSlots.length > 0"
+ v-gl-tooltip
:selected="isDetailsShown"
icon="ellipsis_h"
size="small"
class="gl-ml-2 gl-display-none gl-sm-display-block"
+ :title="$options.i18n.toggleDetailsLabel"
+ :aria-label="$options.i18n.toggleDetailsLabel"
+ :aria-expanded="isDetailsShown"
@click="toggleDetails"
/>
</div>
diff --git a/app/assets/javascripts/vue_shared/components/runner_instructions/instructions/runner_docker_instructions.vue b/app/assets/javascripts/vue_shared/components/runner_instructions/instructions/runner_docker_instructions.vue
index ff7e803af2a..5d04fd1d8e7 100644
--- a/app/assets/javascripts/vue_shared/components/runner_instructions/instructions/runner_docker_instructions.vue
+++ b/app/assets/javascripts/vue_shared/components/runner_instructions/instructions/runner_docker_instructions.vue
@@ -1,6 +1,7 @@
<script>
import { GlButton, GlIcon } from '@gitlab/ui';
import { s__ } from '~/locale';
+import { DOCS_URL } from 'jh_else_ce/lib/utils/url_utility';
export default {
components: {
@@ -16,7 +17,7 @@ export default {
'Runners|To install Runner in a container follow the instructions described in the GitLab documentation',
),
I18N_VIEW_INSTRUCTIONS: s__('Runners|View installation instructions'),
- HELP_URL: 'https://docs.gitlab.com/runner/install/docker.html',
+ HELP_URL: `${DOCS_URL}/runner/install/docker.html`,
};
</script>
<template>
diff --git a/app/assets/javascripts/vue_shared/components/runner_instructions/instructions/runner_kubernetes_instructions.vue b/app/assets/javascripts/vue_shared/components/runner_instructions/instructions/runner_kubernetes_instructions.vue
index ee41dab0cec..a769b4a6ad8 100644
--- a/app/assets/javascripts/vue_shared/components/runner_instructions/instructions/runner_kubernetes_instructions.vue
+++ b/app/assets/javascripts/vue_shared/components/runner_instructions/instructions/runner_kubernetes_instructions.vue
@@ -1,6 +1,7 @@
<script>
import { GlButton, GlIcon } from '@gitlab/ui';
import { s__ } from '~/locale';
+import { DOCS_URL } from 'jh_else_ce/lib/utils/url_utility';
export default {
components: {
@@ -16,7 +17,7 @@ export default {
'Runners|To install Runner in Kubernetes follow the instructions described in the GitLab documentation.',
),
I18N_VIEW_INSTRUCTIONS: s__('Runners|View installation instructions'),
- HELP_URL: 'https://docs.gitlab.com/runner/install/kubernetes.html',
+ HELP_URL: `${DOCS_URL}/runner/install/kubernetes.html`,
};
</script>
<template>
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 94aa7bd2f88..3b5086b3c7e 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
@@ -122,14 +122,6 @@ export default {
return null;
}
},
- showDeprecationAlert() {
- return (
- // create_runner_workflow_for_admin
- this.glFeatures.createRunnerWorkflowForAdmin ||
- // create_runner_workflow_for_namespace
- this.glFeatures.createRunnerWorkflowForNamespace
- );
- },
},
updated() {
// Refocus on dom changes, after loading data
@@ -200,12 +192,7 @@ export default {
v-on="$listeners"
@shown="onShown"
>
- <gl-alert
- v-if="showDeprecationAlert"
- :title="$options.i18n.deprecationAlertTitle"
- variant="warning"
- :dismissible="false"
- >
+ <gl-alert :title="$options.i18n.deprecationAlertTitle" variant="warning" :dismissible="false">
<gl-sprintf :message="$options.i18n.deprecationAlertContent">
<template #link="{ content }">
<gl-link target="_blank" :href="$options.LEGACY_REGISTER_HELP_URL"
diff --git a/app/assets/javascripts/vue_shared/components/source_viewer/components/chunk_new.vue b/app/assets/javascripts/vue_shared/components/source_viewer/components/chunk_new.vue
index d77061d4b31..b89fa3f8292 100644
--- a/app/assets/javascripts/vue_shared/components/source_viewer/components/chunk_new.vue
+++ b/app/assets/javascripts/vue_shared/components/source_viewer/components/chunk_new.vue
@@ -63,9 +63,6 @@ export default {
shouldHighlight() {
return Boolean(this.highlightedContent) && (this.hasAppeared || this.isHighlighted);
},
- lines() {
- return this.content.split('\n');
- },
pageSearchString() {
const page = getPageParamValue(this.number);
return getPageSearchString(this.blamePath, page);
@@ -123,7 +120,7 @@ export default {
<pre
class="gl-m-0 gl-p-0! gl-w-full gl-overflow-visible! gl-border-none! code highlight gl-line-height-0"
- ><code v-if="shouldHighlight" v-once v-safe-html="highlightedContent" data-testid="content"></code><code v-else-if="!isLoading" v-once class="line gl-white-space-pre-wrap! gl-ml-1" data-testid="content" v-text="rawContent"></code></pre>
+ ><code v-if="shouldHighlight" v-safe-html="highlightedContent" data-testid="content"></code><code v-else-if="!isLoading" v-once class="line gl-white-space-pre-wrap! gl-ml-1" data-testid="content" v-text="rawContent"></code></pre>
</div>
</gl-intersection-observer>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/source_viewer/plugins/index.js b/app/assets/javascripts/vue_shared/components/source_viewer/plugins/index.js
index d694adf7147..3f8a9258fc3 100644
--- a/app/assets/javascripts/vue_shared/components/source_viewer/plugins/index.js
+++ b/app/assets/javascripts/vue_shared/components/source_viewer/plugins/index.js
@@ -1,6 +1,7 @@
import wrapChildNodes from './wrap_child_nodes';
import linkDependencies from './link_dependencies';
import wrapBidiChars from './wrap_bidi_chars';
+import wrapLines from './wrap_lines';
export const HLJS_ON_AFTER_HIGHLIGHT = 'after:highlight';
@@ -11,10 +12,11 @@ export const HLJS_ON_AFTER_HIGHLIGHT = 'after:highlight';
*
* @param {Object} hljs - the Highlight.js instance.
*/
-export const registerPlugins = (hljs, fileType, rawContent) => {
+export const registerPlugins = (hljs, fileType, rawContent, shouldWrapLines) => {
hljs.addPlugin({ [HLJS_ON_AFTER_HIGHLIGHT]: wrapChildNodes });
hljs.addPlugin({ [HLJS_ON_AFTER_HIGHLIGHT]: wrapBidiChars });
hljs.addPlugin({
[HLJS_ON_AFTER_HIGHLIGHT]: (result) => linkDependencies(result, fileType, rawContent),
});
+ if (shouldWrapLines) hljs.addPlugin({ [HLJS_ON_AFTER_HIGHLIGHT]: wrapLines });
};
diff --git a/app/assets/javascripts/vue_shared/components/source_viewer/plugins/wrap_child_nodes.js b/app/assets/javascripts/vue_shared/components/source_viewer/plugins/wrap_child_nodes.js
index a79e88a1132..b972d8ece91 100644
--- a/app/assets/javascripts/vue_shared/components/source_viewer/plugins/wrap_child_nodes.js
+++ b/app/assets/javascripts/vue_shared/components/source_viewer/plugins/wrap_child_nodes.js
@@ -22,7 +22,7 @@ const format = (node, scope = '') => {
.split(newlineRegex)
.map((newline) => generateHLJSTag(scope, newline, true))
.join('\n');
- } else if (node.scope || node.sublanguage) {
+ } else if (node.children) {
const { children } = node;
if (children.length && children.length === 1) {
buffer += format(children[0], node.scope);
diff --git a/app/assets/javascripts/vue_shared/components/source_viewer/plugins/wrap_lines.js b/app/assets/javascripts/vue_shared/components/source_viewer/plugins/wrap_lines.js
new file mode 100644
index 00000000000..384ada30001
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/source_viewer/plugins/wrap_lines.js
@@ -0,0 +1,20 @@
+/**
+ * Highlight.js plugin for wrapping lines in the correct classes and attributes.
+ * Needed for things like hash highlighting to work.
+ *
+ * Plugin API: https://github.com/highlightjs/highlight.js/blob/main/docs/plugin-api.rst
+ *
+ * @param {Object} Result - an object that represents the highlighted result from Highlight.js
+ */
+
+function wrapLine(content, number, language) {
+ return `<div id="LC${number}" lang="${language}" class="line">${content}</div>`;
+}
+
+export default (result) => {
+ // eslint-disable-next-line no-param-reassign
+ result.value = result.value
+ .split(/\r?\n/)
+ .map((content, index) => wrapLine(content, index + 1, result.language))
+ .join('\n');
+};
diff --git a/app/assets/javascripts/vue_shared/components/source_viewer/source_viewer_new.vue b/app/assets/javascripts/vue_shared/components/source_viewer/source_viewer_new.vue
index 7e18c8414d5..8e4c438719e 100644
--- a/app/assets/javascripts/vue_shared/components/source_viewer/source_viewer_new.vue
+++ b/app/assets/javascripts/vue_shared/components/source_viewer/source_viewer_new.vue
@@ -2,6 +2,7 @@
import SafeHtml from '~/vue_shared/directives/safe_html';
import Tracking from '~/tracking';
import addBlobLinksTracking from '~/blob/blob_links_tracking';
+import LineHighlighter from '~/blob/line_highlighter';
import { EVENT_ACTION, EVENT_LABEL_VIEWER } from './constants';
import Chunk from './components/chunk_new.vue';
@@ -19,9 +20,6 @@ export default {
SafeHtml,
},
mixins: [Tracking.mixin()],
- inject: {
- highlightWorker: { default: null },
- },
props: {
blob: {
type: Object,
@@ -33,6 +31,11 @@ export default {
default: () => [],
},
},
+ data() {
+ return {
+ lineHighlighter: new LineHighlighter(),
+ };
+ },
created() {
this.track(EVENT_ACTION, { label: EVENT_LABEL_VIEWER, property: this.blob.language });
addBlobLinksTracking();
diff --git a/app/assets/javascripts/vue_shared/components/source_viewer/workers/highlight_utils.js b/app/assets/javascripts/vue_shared/components/source_viewer/workers/highlight_utils.js
index 142c135e9c1..8d8e945cd5f 100644
--- a/app/assets/javascripts/vue_shared/components/source_viewer/workers/highlight_utils.js
+++ b/app/assets/javascripts/vue_shared/components/source_viewer/workers/highlight_utils.js
@@ -1,9 +1,13 @@
-import hljs from 'highlight.js';
+import hljs from 'highlight.js/lib/core';
+import json from 'highlight.js/lib/languages/json';
import { registerPlugins } from '../plugins/index';
import { LINES_PER_CHUNK, NEWLINE, ROUGE_TO_HLJS_LANGUAGE_MAP } from '../constants';
-const initHighlightJs = (fileType, content) => {
- registerPlugins(hljs, fileType, content);
+const initHighlightJs = (fileType, content, language) => {
+ // The Highlight Worker is currently scoped to JSON files.
+ // See the following issue for more: https://gitlab.com/gitlab-org/gitlab/-/issues/415753
+ hljs.registerLanguage(language, json);
+ registerPlugins(hljs, fileType, content, true);
};
const splitByLineBreaks = (content = '') => content.split(/\r?\n/);
diff --git a/app/assets/javascripts/vue_shared/components/source_viewer/workers/highlight.js b/app/assets/javascripts/vue_shared/components/source_viewer/workers/highlight_worker.js
index 535e857d7a9..535e857d7a9 100644
--- a/app/assets/javascripts/vue_shared/components/source_viewer/workers/highlight.js
+++ b/app/assets/javascripts/vue_shared/components/source_viewer/workers/highlight_worker.js
diff --git a/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_link.vue b/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_link.vue
index 00720f27934..0949071d4dc 100644
--- a/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_link.vue
+++ b/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_link.vue
@@ -18,6 +18,7 @@
*/
import { GlAvatarLink, GlTooltipDirective } from '@gitlab/ui';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import UserAvatarImage from './user_avatar_image.vue';
export default {
@@ -74,6 +75,16 @@ export default {
required: false,
default: 'top',
},
+ popoverUserId: {
+ type: [String, Number],
+ required: false,
+ default: '',
+ },
+ popoverUsername: {
+ type: String,
+ required: false,
+ default: '',
+ },
username: {
type: String,
required: false,
@@ -81,10 +92,17 @@ export default {
},
},
computed: {
+ userId() {
+ return getIdFromGraphQLId(this.popoverUserId);
+ },
shouldShowUsername() {
return this.username.length > 0;
},
avatarTooltipText() {
+ // Prevent showing tooltip when popoverUserId is present
+ if (this.popoverUserId) {
+ return '';
+ }
return this.shouldShowUsername ? '' : this.tooltipText;
},
},
@@ -92,7 +110,12 @@ export default {
</script>
<template>
- <gl-avatar-link :href="linkHref" class="user-avatar-link">
+ <gl-avatar-link
+ :href="linkHref"
+ :data-user-id="userId"
+ :data-username="popoverUsername"
+ class="user-avatar-link js-user-link"
+ >
<user-avatar-image
:class="imgCssWrapperClasses"
:img-src="imgSrc"
diff --git a/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_list.vue b/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_list.vue
index 335f9ab1df4..258e8b1a6c5 100644
--- a/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_list.vue
+++ b/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_list.vue
@@ -81,6 +81,8 @@ export default {
:img-alt="item.name"
:tooltip-text="item.name"
:img-size="imgSize"
+ :popover-user-id="item.id"
+ :popover-username="item.username"
img-css-classes="gl-mr-3"
/>
<template v-if="hasBreakpoint">
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 e09f193310b..446c8c97df0 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
@@ -91,6 +91,9 @@ export default {
return '';
},
+ userCannotMerge() {
+ return this.target.dataset.cannotMerge;
+ },
userIsLoading() {
return !this.user?.loaded;
},
@@ -123,6 +126,15 @@ export default {
username() {
return `@${this.user?.username}`;
},
+ cssClasses() {
+ const classList = ['user-popover', 'gl-max-w-48', 'gl-overflow-hidden'];
+
+ if (this.userCannotMerge) {
+ classList.push('user-popover-cannot-merge');
+ }
+
+ return classList;
+ },
},
methods: {
async toggleFollow() {
@@ -181,7 +193,7 @@ export default {
<template>
<!-- Delayed so not every mouseover triggers Popover -->
<gl-popover
- :css-classes="['gl-max-w-48']"
+ :css-classes="cssClasses"
:show="show"
:target="target"
:delay="$options.USER_POPOVER_DELAY"
@@ -190,6 +202,12 @@ export default {
triggers="hover focus manual"
data-testid="user-popover"
>
+ <template v-if="userCannotMerge" #title>
+ <div class="gl-pb-3 gl-display-flex gl-align-items-center" data-testid="cannot-merge">
+ <gl-icon name="warning-solid" class="gl-mr-2 gl-text-orange-400" />
+ <span class="gl-font-weight-normal">{{ __('Cannot merge') }}</span>
+ </div>
+ </template>
<div class="gl-mb-3">
<div v-if="userIsLoading" class="gl-w-20">
<gl-skeleton-loader :width="160" :height="64">
@@ -204,6 +222,7 @@ export default {
:src="user.avatarUrl"
:label="user.name"
:sub-label="username"
+ class="gl-w-full"
>
<template v-if="isBlocked">
<span class="gl-mt-4 gl-font-style-italic">{{ $options.I18N_USER_BLOCKED }}</span>
diff --git a/app/assets/javascripts/vue_shared/components/web_ide_link.vue b/app/assets/javascripts/vue_shared/components/web_ide_link.vue
index 82f4edcbd5f..9a06c0ecf30 100644
--- a/app/assets/javascripts/vue_shared/components/web_ide_link.vue
+++ b/app/assets/javascripts/vue_shared/components/web_ide_link.vue
@@ -23,6 +23,7 @@ export const i18n = {
};
export default {
+ name: 'CEWebIdeLink',
components: {
ActionsButton,
GlModal,
@@ -319,7 +320,11 @@ export default {
:toggle-text="$options.i18n.toggleText"
:variant="isBlob ? 'confirm' : 'default'"
:category="isBlob ? 'primary' : 'secondary'"
- />
+ @hidden="$emit('hidden')"
+ @shown="$emit('shown')"
+ >
+ <slot></slot>
+ </actions-button>
<gl-modal
v-if="computedShowGitpodButton && !gitpodEnabled"
v-model="showEnableGitpodModal"
diff --git a/app/assets/javascripts/vue_shared/constants.js b/app/assets/javascripts/vue_shared/constants.js
index 3896e963a53..8946a02e663 100644
--- a/app/assets/javascripts/vue_shared/constants.js
+++ b/app/assets/javascripts/vue_shared/constants.js
@@ -94,6 +94,7 @@ export const confidentialityInfoText = (workspaceType, issuableType) =>
},
);
+export const EDITING_MODE_KEY = 'gl-markdown-editor-mode';
export const EDITING_MODE_MARKDOWN_FIELD = 'markdownField';
export const EDITING_MODE_CONTENT_EDITOR = 'contentEditor';
export const CLEAR_AUTOSAVE_ENTRY_EVENT = 'markdown_clear_autosave_entry';
diff --git a/app/assets/javascripts/vue_shared/global_search/constants.js b/app/assets/javascripts/vue_shared/global_search/constants.js
index 4211b9578a2..a693d4f114d 100644
--- a/app/assets/javascripts/vue_shared/global_search/constants.js
+++ b/app/assets/javascripts/vue_shared/global_search/constants.js
@@ -75,3 +75,23 @@ export const SEARCH_RESULTS_ORDER = [
HELP_CATEGORY,
];
export const DROPDOWN_ORDER = SEARCH_RESULTS_ORDER;
+
+export const SEARCH_LABELS = s__('GlobalSearch|Search labels');
+
+export const DROPDOWN_HEADER = s__('GlobalSearch|Labels');
+
+export const AGGREGATIONS_ERROR_MESSAGE = s__('GlobalSearch|Fetching aggregations error.');
+
+export const NO_LABELS_FOUND = s__('GlobalSearch|No labels found');
+
+export const I18N = {
+ SEARCH_DESCRIBED_BY_DEFAULT,
+ SEARCH_RESULTS_LOADING,
+ SEARCH_DESCRIBED_BY_UPDATED,
+ SEARCH_INPUT_DESCRIBE_BY_WITH_DROPDOWN,
+ SEARCH_INPUT_DESCRIBE_BY_NO_DROPDOWN,
+ SEARCH_LABELS,
+ DROPDOWN_HEADER,
+ AGGREGATIONS_ERROR_MESSAGE,
+ NO_LABELS_FOUND,
+};
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 3d4eebb9524..53e976d698b 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
@@ -9,14 +9,16 @@ import {
} from '@gitlab/ui';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
-import { STATUS_OPEN } from '~/issues/constants';
+import { issuableStatusText, STATUS_OPEN } from '~/issues/constants';
import { isExternal } from '~/lib/utils/url_utility';
import { n__, sprintf } from '~/locale';
+import ConfidentialityBadge from '~/vue_shared/components/confidentiality_badge.vue';
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
import WorkItemTypeIcon from '~/work_items/components/work_item_type_icon.vue';
export default {
components: {
+ ConfidentialityBadge,
GlIcon,
GlBadge,
GlButton,
@@ -77,8 +79,16 @@ export default {
required: false,
default: false,
},
+ workspaceType: {
+ type: String,
+ required: false,
+ default: '',
+ },
},
computed: {
+ badgeText() {
+ return issuableStatusText[this.issuableState];
+ },
badgeVariant() {
return this.issuableState === STATUS_OPEN ? 'success' : 'info';
},
@@ -109,6 +119,7 @@ export default {
},
methods: {
handleRightSidebarToggleClick() {
+ this.$emit('toggle');
if (this.toggleSidebarButtonEl) {
this.toggleSidebarButtonEl.dispatchEvent(new Event('click'));
}
@@ -118,21 +129,23 @@ export default {
</script>
<template>
- <div class="detail-page-header">
+ <div class="detail-page-header gl-flex-direction-column gl-sm-flex-direction-row">
<div class="detail-page-header-body">
<gl-badge class="issuable-status-badge gl-mr-3" :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>
+ <span class="gl-display-none gl-sm-display-block gl-ml-2">
+ <slot name="status-badge">{{ badgeText }}</slot>
+ </span>
</gl-badge>
- <div class="issuable-meta gl-display-flex! gl-align-items-center">
- <div v-if="blocked || confidential" class="gl-display-inline-block">
- <div v-if="blocked" data-testid="blocked" class="issuable-warning-icon inline">
- <gl-icon name="lock" :aria-label="__('Blocked')" />
- </div>
- <div v-if="confidential" data-testid="confidential" class="issuable-warning-icon inline">
- <gl-icon name="eye-slash" :aria-label="__('Confidential')" />
- </div>
+ <div class="issuable-meta gl-display-flex! gl-align-items-center gl-flex-wrap">
+ <div v-if="blocked" data-testid="blocked" class="issuable-warning-icon inline">
+ <gl-icon name="lock" :aria-label="__('Blocked')" />
</div>
+ <confidentiality-badge
+ v-if="confidential"
+ :issuable-type="issuableType"
+ :workspace-type="workspaceType"
+ />
<span>
<template v-if="showWorkItemTypeIcon">
<work-item-type-icon :work-item-type="issuableType" show-text />
@@ -182,10 +195,7 @@ export default {
@click="handleRightSidebarToggleClick"
/>
</div>
- <div
- data-testid="header-actions"
- class="detail-page-header-actions gl-display-flex gl-md-display-block"
- >
+ <div data-testid="header-actions" class="detail-page-header-actions gl-display-flex">
<slot name="header-actions"></slot>
</div>
</div>
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 c33e803c7e1..841d92fd63d 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
@@ -81,9 +81,12 @@ export default {
data-testid="header"
>
<div
- class="issue-sticky-header-text gl-display-flex gl-align-items-center gl-mx-auto gl-px-5"
+ class="issue-sticky-header-text gl-display-flex gl-align-items-baseline gl-mx-auto gl-px-5"
>
- <gl-badge class="gl-white-space-nowrap gl-mr-3" :variant="badgeVariant">
+ <gl-badge
+ class="gl-white-space-nowrap gl-mr-3 gl-align-self-center"
+ :variant="badgeVariant"
+ >
<gl-icon v-if="statusIcon" class="gl-sm-display-none" :name="statusIcon" />
<span class="gl-display-none gl-sm-display-block">
<slot name="status-badge"></slot>
diff --git a/app/assets/javascripts/vue_shared/new_namespace/components/welcome.vue b/app/assets/javascripts/vue_shared/new_namespace/components/welcome.vue
index caa85d3eaaf..1b4da047057 100644
--- a/app/assets/javascripts/vue_shared/new_namespace/components/welcome.vue
+++ b/app/assets/javascripts/vue_shared/new_namespace/components/welcome.vue
@@ -1,11 +1,7 @@
<script>
-import SafeHtml from '~/vue_shared/directives/safe_html';
import Tracking from '~/tracking';
export default {
- directives: {
- SafeHtml,
- },
mixins: [Tracking.mixin()],
props: {
title: {
@@ -38,9 +34,10 @@ export default {
@click="track('click_tab', { label: panel.name })"
>
<div
- v-safe-html="panel.illustration"
- class="new-namespace-panel-illustration gl-text-white gl-display-flex gl-flex-shrink-0 gl-justify-content-center"
- ></div>
+ class="new-namespace-panel-illustration gl-display-flex gl-flex-shrink-0 gl-justify-content-center"
+ >
+ <img aria-hidden :src="panel.imageSrc" />
+ </div>
<div class="gl-pl-4">
<h3 class="gl-font-size-h2 gl-reset-color">
{{ panel.title }}
diff --git a/app/assets/javascripts/vue_shared/new_namespace/new_namespace_page.vue b/app/assets/javascripts/vue_shared/new_namespace/new_namespace_page.vue
index 5ab2e346a7a..4503ba6e561 100644
--- a/app/assets/javascripts/vue_shared/new_namespace/new_namespace_page.vue
+++ b/app/assets/javascripts/vue_shared/new_namespace/new_namespace_page.vue
@@ -1,6 +1,5 @@
<script>
import { GlBreadcrumb, GlIcon } from '@gitlab/ui';
-import SafeHtml from '~/vue_shared/directives/safe_html';
import NewTopLevelGroupAlert from '~/groups/components/new_top_level_group_alert.vue';
import SuperSidebarToggle from '~/super_sidebar/components/super_sidebar_toggle.vue';
@@ -18,9 +17,6 @@ export default {
LegacyContainer,
SuperSidebarToggle,
},
- directives: {
- SafeHtml,
- },
props: {
title: {
type: String,
@@ -137,7 +133,9 @@ export default {
<template v-if="activePanel">
<div class="gl-display-flex gl-align-items-center gl-py-5">
- <div v-safe-html="activePanel.illustration" class="gl-text-white col-auto"></div>
+ <div class="col-auto">
+ <img aria-hidden :src="activePanel.imageSrc" />
+ </div>
<div class="col">
<h4>{{ activePanel.title }}</h4>
diff --git a/app/assets/javascripts/vue_shared/security_reports/components/artifact_downloads/merge_request_artifact_download.vue b/app/assets/javascripts/vue_shared/security_reports/components/artifact_downloads/merge_request_artifact_download.vue
deleted file mode 100644
index 4c2b082242b..00000000000
--- a/app/assets/javascripts/vue_shared/security_reports/components/artifact_downloads/merge_request_artifact_download.vue
+++ /dev/null
@@ -1,91 +0,0 @@
-<script>
-import { reportTypeToSecurityReportTypeEnum } from 'ee_else_ce/vue_shared/security_reports/constants';
-import { createAlert } from '~/alert';
-import { s__ } from '~/locale';
-import SecurityReportDownloadDropdown from '~/vue_shared/security_reports/components/security_report_download_dropdown.vue';
-import securityReportMergeRequestDownloadPathsQuery from '~/vue_shared/security_reports/graphql/queries/security_report_merge_request_download_paths.query.graphql';
-import { extractSecurityReportArtifactsFromMergeRequest } from '~/vue_shared/security_reports/utils';
-
-export default {
- components: {
- SecurityReportDownloadDropdown,
- },
- props: {
- reportTypes: {
- type: Array,
- required: true,
- validator: (reportType) => {
- return reportType.every((report) => reportTypeToSecurityReportTypeEnum[report]);
- },
- },
- targetProjectFullPath: {
- type: String,
- required: true,
- },
- mrIid: {
- type: Number,
- required: true,
- },
- injectedArtifacts: {
- type: Array,
- required: false,
- default: () => [],
- },
- },
- data() {
- return {
- reportArtifacts: [],
- };
- },
- apollo: {
- reportArtifacts: {
- query: securityReportMergeRequestDownloadPathsQuery,
- variables() {
- return {
- projectPath: this.targetProjectFullPath,
- iid: String(this.mrIid),
- reportTypes: this.reportTypes.map(
- (reportType) => reportTypeToSecurityReportTypeEnum[reportType],
- ),
- };
- },
- update(data) {
- return extractSecurityReportArtifactsFromMergeRequest(this.reportTypes, data);
- },
- error(error) {
- this.showError(error);
- },
- },
- },
- computed: {
- isLoadingReportArtifacts() {
- return this.$apollo.queries.reportArtifacts.loading;
- },
- mergedReportArtifacts() {
- return [...this.reportArtifacts, ...this.injectedArtifacts];
- },
- },
- methods: {
- showError(error) {
- createAlert({
- message: this.$options.i18n.apiError,
- captureError: true,
- error,
- });
- },
- },
- i18n: {
- apiError: s__(
- 'SecurityReports|Failed to get security report information. Please reload the page or try again later.',
- ),
- },
-};
-</script>
-
-<template>
- <security-report-download-dropdown
- :title="s__('SecurityReports|Download results')"
- :artifacts="mergedReportArtifacts"
- :loading="isLoadingReportArtifacts"
- />
-</template>
diff --git a/app/assets/javascripts/vue_shared/security_reports/components/constants.js b/app/assets/javascripts/vue_shared/security_reports/components/constants.js
deleted file mode 100644
index 5e8199c1bcd..00000000000
--- a/app/assets/javascripts/vue_shared/security_reports/components/constants.js
+++ /dev/null
@@ -1,8 +0,0 @@
-export const SEVERITY_CLASS_NAME_MAP = {
- critical: 'gl-text-red-800',
- high: 'gl-text-red-600',
- medium: 'gl-text-orange-400',
- low: 'gl-text-orange-300',
- info: 'gl-text-blue-400',
- unknown: 'gl-text-gray-400',
-};
diff --git a/app/assets/javascripts/vue_shared/security_reports/components/help_icon.vue b/app/assets/javascripts/vue_shared/security_reports/components/help_icon.vue
deleted file mode 100644
index eed1c86c318..00000000000
--- a/app/assets/javascripts/vue_shared/security_reports/components/help_icon.vue
+++ /dev/null
@@ -1,58 +0,0 @@
-<script>
-import { GlButton, GlIcon, GlLink, GlPopover } from '@gitlab/ui';
-import { s__ } from '~/locale';
-
-export default {
- components: {
- GlButton,
- GlIcon,
- GlLink,
- GlPopover,
- },
- props: {
- helpPath: {
- type: String,
- required: true,
- },
- discoverProjectSecurityPath: {
- type: String,
- required: false,
- default: '',
- },
- },
- i18n: {
- securityReportsHelp: s__('SecurityReports|Security reports help page link'),
- upgradeToManageVulnerabilities: s__('SecurityReports|Upgrade to manage vulnerabilities'),
- upgradeToInteract: s__(
- 'SecurityReports|Upgrade to interact, track and shift left with vulnerability management features in the UI.',
- ),
- },
-};
-</script>
-
-<template>
- <span v-if="discoverProjectSecurityPath">
- <gl-button
- ref="discoverProjectSecurity"
- icon="question-o"
- category="tertiary"
- :aria-label="$options.i18n.upgradeToManageVulnerabilities"
- />
-
- <gl-popover
- :target="() => $refs.discoverProjectSecurity.$el"
- :title="$options.i18n.upgradeToManageVulnerabilities"
- placement="top"
- triggers="click blur"
- >
- {{ $options.i18n.upgradeToInteract }}
- <gl-link :href="discoverProjectSecurityPath" target="_blank" class="gl-font-sm">{{
- __('Learn more')
- }}</gl-link>
- </gl-popover>
- </span>
-
- <gl-link v-else target="_blank" :href="helpPath" :aria-label="$options.i18n.securityReportsHelp">
- <gl-icon name="question-o" />
- </gl-link>
-</template>
diff --git a/app/assets/javascripts/vue_shared/security_reports/components/security_summary.vue b/app/assets/javascripts/vue_shared/security_reports/components/security_summary.vue
deleted file mode 100644
index e3aa25a294e..00000000000
--- a/app/assets/javascripts/vue_shared/security_reports/components/security_summary.vue
+++ /dev/null
@@ -1,59 +0,0 @@
-<script>
-import { GlSprintf } from '@gitlab/ui';
-import { SEVERITY_CLASS_NAME_MAP } from './constants';
-
-export default {
- components: {
- GlSprintf,
- },
- props: {
- message: {
- type: Object,
- required: true,
- },
- },
- computed: {
- shouldShowCountMessage() {
- return !this.message.status && Boolean(this.message.countMessage);
- },
- },
- methods: {
- getSeverityClass(severity) {
- return SEVERITY_CLASS_NAME_MAP[severity];
- },
- },
- slotNames: ['critical', 'high', 'other'],
- spacingClasses: {
- critical: 'gl-pl-4',
- high: 'gl-px-2',
- other: 'gl-px-2',
- },
-};
-</script>
-
-<template>
- <span>
- <gl-sprintf :message="message.message">
- <template #total="{ content }">
- <strong>{{ content }}</strong>
- </template>
- </gl-sprintf>
- <span v-if="shouldShowCountMessage" class="gl-font-sm">
- <gl-sprintf :message="message.countMessage">
- <template v-for="slotName in $options.slotNames" #[slotName]="{ content }">
- <span :key="slotName">
- <strong
- v-if="message[slotName] > 0"
- :class="[getSeverityClass(slotName), $options.spacingClasses[slotName]]"
- >
- {{ content }}
- </strong>
- <span v-else :class="$options.spacingClasses[slotName]">
- {{ content }}
- </span>
- </span>
- </template>
- </gl-sprintf>
- </span>
- </span>
-</template>
diff --git a/app/assets/javascripts/vue_shared/security_reports/constants.js b/app/assets/javascripts/vue_shared/security_reports/constants.js
index a1d75e08be9..56c6affebd7 100644
--- a/app/assets/javascripts/vue_shared/security_reports/constants.js
+++ b/app/assets/javascripts/vue_shared/security_reports/constants.js
@@ -28,7 +28,6 @@ export const REPORT_TYPE_CLUSTER_IMAGE_SCANNING = 'cluster_image_scanning';
export const REPORT_TYPE_COVERAGE_FUZZING = 'coverage_fuzzing';
export const REPORT_TYPE_CORPUS_MANAGEMENT = 'corpus_management';
export const REPORT_TYPE_API_FUZZING = 'api_fuzzing';
-export const REPORT_TYPE_MANUALLY_ADDED = 'generic';
/**
* SecurityReportTypeEnum values for use with GraphQL.
diff --git a/app/assets/javascripts/vue_shared/security_reports/security_reports_app.vue b/app/assets/javascripts/vue_shared/security_reports/security_reports_app.vue
deleted file mode 100644
index 0cff5edf628..00000000000
--- a/app/assets/javascripts/vue_shared/security_reports/security_reports_app.vue
+++ /dev/null
@@ -1,238 +0,0 @@
-<script>
-import { mapActions, mapGetters } from 'vuex';
-import { createAlert } from '~/alert';
-import { s__ } from '~/locale';
-import ReportSection from '~/ci/reports/components/report_section.vue';
-import { ERROR, SLOT_SUCCESS, SLOT_LOADING, SLOT_ERROR } from '~/ci/reports/constants';
-import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-import HelpIcon from './components/help_icon.vue';
-import SecurityReportDownloadDropdown from './components/security_report_download_dropdown.vue';
-import SecuritySummary from './components/security_summary.vue';
-import {
- REPORT_TYPE_SAST,
- REPORT_TYPE_SECRET_DETECTION,
- reportTypeToSecurityReportTypeEnum,
-} from './constants';
-import securityReportMergeRequestDownloadPathsQuery from './graphql/queries/security_report_merge_request_download_paths.query.graphql';
-import store from './store';
-import { MODULE_SAST, MODULE_SECRET_DETECTION } from './store/constants';
-import { extractSecurityReportArtifactsFromMergeRequest } from './utils';
-
-export default {
- store,
- components: {
- ReportSection,
- HelpIcon,
- SecurityReportDownloadDropdown,
- SecuritySummary,
- },
- mixins: [glFeatureFlagsMixin()],
- props: {
- pipelineId: {
- type: Number,
- required: true,
- },
- projectId: {
- type: Number,
- required: true,
- },
- securityReportsDocsPath: {
- type: String,
- required: true,
- },
- discoverProjectSecurityPath: {
- type: String,
- required: false,
- default: '',
- },
- sastComparisonPath: {
- type: String,
- required: false,
- default: '',
- },
- secretDetectionComparisonPath: {
- type: String,
- required: false,
- default: '',
- },
- targetProjectFullPath: {
- type: String,
- required: false,
- default: '',
- },
- mrIid: {
- type: Number,
- required: false,
- default: 0,
- },
- canDiscoverProjectSecurity: {
- type: Boolean,
- required: false,
- default: false,
- },
- },
- data() {
- return {
- availableSecurityReports: [],
- canShowCounts: false,
-
- // When core_security_mr_widget_counts is not enabled, the
- // error state is shown even when successfully loaded, since success
- // state suggests that the security scans detected no security problems,
- // which is not necessarily the case. A future iteration will actually
- // check whether problems were found and display the appropriate status.
- status: ERROR,
- };
- },
- apollo: {
- reportArtifacts: {
- query: securityReportMergeRequestDownloadPathsQuery,
- variables() {
- return {
- projectPath: this.targetProjectFullPath,
- iid: String(this.mrIid),
- reportTypes: this.$options.reportTypes.map(
- (reportType) => reportTypeToSecurityReportTypeEnum[reportType],
- ),
- };
- },
- update(data) {
- return extractSecurityReportArtifactsFromMergeRequest(this.$options.reportTypes, data);
- },
- error(error) {
- this.showError(error);
- },
- result({ loading, data }) {
- if (loading || !data) {
- return;
- }
-
- // Query has completed, so populate the availableSecurityReports.
- this.onCheckingAvailableSecurityReports(
- this.reportArtifacts.map(({ reportType }) => reportType),
- );
- },
- },
- },
- computed: {
- ...mapGetters(['groupedSummaryText', 'summaryStatus']),
- hasSecurityReports() {
- return this.availableSecurityReports.length > 0;
- },
- hasSastReports() {
- return this.availableSecurityReports.includes(REPORT_TYPE_SAST);
- },
- hasSecretDetectionReports() {
- return this.availableSecurityReports.includes(REPORT_TYPE_SECRET_DETECTION);
- },
- isLoadingReportArtifacts() {
- return this.$apollo.queries.reportArtifacts.loading;
- },
- },
- methods: {
- ...mapActions(MODULE_SAST, {
- setSastDiffEndpoint: 'setDiffEndpoint',
- fetchSastDiff: 'fetchDiff',
- }),
- ...mapActions(MODULE_SECRET_DETECTION, {
- setSecretDetectionDiffEndpoint: 'setDiffEndpoint',
- fetchSecretDetectionDiff: 'fetchDiff',
- }),
- fetchCounts() {
- if (!this.glFeatures.coreSecurityMrWidgetCounts) {
- return;
- }
-
- if (this.sastComparisonPath && this.hasSastReports) {
- this.setSastDiffEndpoint(this.sastComparisonPath);
- this.fetchSastDiff();
- this.canShowCounts = true;
- }
-
- if (this.secretDetectionComparisonPath && this.hasSecretDetectionReports) {
- this.setSecretDetectionDiffEndpoint(this.secretDetectionComparisonPath);
- this.fetchSecretDetectionDiff();
- this.canShowCounts = true;
- }
- },
- onCheckingAvailableSecurityReports(availableSecurityReports) {
- this.availableSecurityReports = availableSecurityReports;
- this.fetchCounts();
- },
- showError(error) {
- createAlert({
- message: this.$options.i18n.apiError,
- captureError: true,
- error,
- });
- },
- },
- reportTypes: [REPORT_TYPE_SAST, REPORT_TYPE_SECRET_DETECTION],
- i18n: {
- apiError: s__(
- 'SecurityReports|Failed to get security report information. Please reload the page or try again later.',
- ),
- scansHaveRun: s__('SecurityReports|Security scans have run'),
- },
- summarySlots: [SLOT_SUCCESS, SLOT_LOADING, SLOT_ERROR],
-};
-</script>
-<template>
- <report-section
- v-if="canShowCounts"
- :status="summaryStatus"
- :has-issues="false"
- class="mr-widget-border-top mr-report"
- data-testid="security-mr-widget"
- track-action="users_expanding_secure_security_report"
- >
- <template v-for="slot in $options.summarySlots" #[slot]>
- <span :key="slot">
- <security-summary :message="groupedSummaryText" />
-
- <help-icon
- class="gl-ml-3"
- :help-path="securityReportsDocsPath"
- :discover-project-security-path="discoverProjectSecurityPath"
- />
- </span>
- </template>
-
- <template #action-buttons>
- <security-report-download-dropdown
- :text="s__('SecurityReports|Download results')"
- :artifacts="reportArtifacts"
- :loading="isLoadingReportArtifacts"
- />
- </template>
- </report-section>
-
- <!-- TODO: Remove this section when removing core_security_mr_widget_counts
- feature flag. See https://gitlab.com/gitlab-org/gitlab/-/issues/284097 -->
- <report-section
- v-else-if="hasSecurityReports"
- :status="status"
- :has-issues="false"
- class="mr-widget-border-top mr-report"
- data-testid="security-mr-widget"
- track-action="users_expanding_secure_security_report"
- >
- <template #error>
- {{ $options.i18n.scansHaveRun }}
-
- <help-icon
- class="gl-ml-3"
- :help-path="securityReportsDocsPath"
- :discover-project-security-path="discoverProjectSecurityPath"
- />
- </template>
-
- <template #action-buttons>
- <security-report-download-dropdown
- :text="s__('SecurityReports|Download results')"
- :artifacts="reportArtifacts"
- :loading="isLoadingReportArtifacts"
- />
- </template>
- </report-section>
-</template>
diff --git a/app/assets/javascripts/vue_shared/security_reports/store/constants.js b/app/assets/javascripts/vue_shared/security_reports/store/constants.js
deleted file mode 100644
index 6aeab56eea2..00000000000
--- a/app/assets/javascripts/vue_shared/security_reports/store/constants.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
- * Vuex module names corresponding to security scan types. These are similar to
- * the snake_case report types from the backend, but should not be considered
- * to be equivalent.
- */
-export const MODULE_SAST = 'sast';
-export const MODULE_SECRET_DETECTION = 'secretDetection';
diff --git a/app/assets/javascripts/vue_shared/security_reports/store/getters.js b/app/assets/javascripts/vue_shared/security_reports/store/getters.js
deleted file mode 100644
index c274f531139..00000000000
--- a/app/assets/javascripts/vue_shared/security_reports/store/getters.js
+++ /dev/null
@@ -1,66 +0,0 @@
-import { s__, sprintf } from '~/locale';
-import { LOADING, ERROR, SUCCESS } from '~/ci/reports/constants';
-import { TRANSLATION_IS_LOADING } from './messages';
-import { countVulnerabilities, groupedTextBuilder } from './utils';
-
-export const summaryCounts = (state) =>
- countVulnerabilities(
- state.reportTypes.reduce((acc, reportType) => {
- acc.push(...state[reportType].newIssues);
- return acc;
- }, []),
- );
-
-export const groupedSummaryText = (state, getters) => {
- const reportType = s__('ciReport|Security scanning');
- let status = '';
-
- // All reports are loading
- if (getters.areAllReportsLoading) {
- return { message: sprintf(TRANSLATION_IS_LOADING, { reportType }) };
- }
-
- // All reports returned error
- if (getters.allReportsHaveError) {
- return { message: s__('ciReport|Security scanning failed loading any results') };
- }
-
- if (getters.areReportsLoading && getters.anyReportHasError) {
- status = s__('ciReport|is loading, errors when loading results');
- } else if (getters.areReportsLoading && !getters.anyReportHasError) {
- status = s__('ciReport|is loading');
- } else if (!getters.areReportsLoading && getters.anyReportHasError) {
- status = s__('ciReport|: Loading resulted in an error');
- }
-
- const { critical, high, other } = getters.summaryCounts;
-
- return groupedTextBuilder({ reportType, status, critical, high, other });
-};
-
-export const summaryStatus = (state, getters) => {
- if (getters.areReportsLoading) {
- return LOADING;
- }
-
- if (getters.anyReportHasError || getters.anyReportHasIssues) {
- return ERROR;
- }
-
- return SUCCESS;
-};
-
-export const areReportsLoading = (state) =>
- state.reportTypes.some((reportType) => state[reportType].isLoading);
-
-export const areAllReportsLoading = (state) =>
- state.reportTypes.every((reportType) => state[reportType].isLoading);
-
-export const allReportsHaveError = (state) =>
- state.reportTypes.every((reportType) => state[reportType].hasError);
-
-export const anyReportHasError = (state) =>
- state.reportTypes.some((reportType) => state[reportType].hasError);
-
-export const anyReportHasIssues = (state) =>
- state.reportTypes.some((reportType) => state[reportType].newIssues.length > 0);
diff --git a/app/assets/javascripts/vue_shared/security_reports/store/index.js b/app/assets/javascripts/vue_shared/security_reports/store/index.js
deleted file mode 100644
index 164faa86744..00000000000
--- a/app/assets/javascripts/vue_shared/security_reports/store/index.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import Vuex from 'vuex';
-import { MODULE_SAST, MODULE_SECRET_DETECTION } from './constants';
-import * as getters from './getters';
-import sast from './modules/sast';
-import secretDetection from './modules/secret_detection';
-import state from './state';
-
-export default () =>
- new Vuex.Store({
- modules: {
- [MODULE_SAST]: sast,
- [MODULE_SECRET_DETECTION]: secretDetection,
- },
- getters,
- state,
- });
diff --git a/app/assets/javascripts/vue_shared/security_reports/store/messages.js b/app/assets/javascripts/vue_shared/security_reports/store/messages.js
deleted file mode 100644
index c25e252a768..00000000000
--- a/app/assets/javascripts/vue_shared/security_reports/store/messages.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import { s__ } from '~/locale';
-
-export const TRANSLATION_IS_LOADING = s__('ciReport|%{reportType} is loading');
-export const TRANSLATION_HAS_ERROR = s__('ciReport|%{reportType}: Loading resulted in an error');
diff --git a/app/assets/javascripts/vue_shared/security_reports/store/modules/sast/actions.js b/app/assets/javascripts/vue_shared/security_reports/store/modules/sast/actions.js
deleted file mode 100644
index 8aefc13a5fa..00000000000
--- a/app/assets/javascripts/vue_shared/security_reports/store/modules/sast/actions.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import { REPORT_TYPE_SAST } from '~/vue_shared/security_reports/constants';
-import { fetchDiffData } from '../../utils';
-import * as types from './mutation_types';
-
-export const setDiffEndpoint = ({ commit }, path) => commit(types.SET_DIFF_ENDPOINT, path);
-
-export const requestDiff = ({ commit }) => commit(types.REQUEST_DIFF);
-
-export const receiveDiffSuccess = ({ commit }, response) =>
- commit(types.RECEIVE_DIFF_SUCCESS, response);
-
-export const receiveDiffError = ({ commit }, response) =>
- commit(types.RECEIVE_DIFF_ERROR, response);
-
-export const fetchDiff = ({ state, rootState, dispatch }) => {
- dispatch('requestDiff');
-
- return fetchDiffData(rootState, state.paths.diffEndpoint, REPORT_TYPE_SAST)
- .then((data) => {
- dispatch('receiveDiffSuccess', data);
- return data;
- })
- .catch(() => {
- dispatch('receiveDiffError');
- });
-};
diff --git a/app/assets/javascripts/vue_shared/security_reports/store/modules/sast/index.js b/app/assets/javascripts/vue_shared/security_reports/store/modules/sast/index.js
deleted file mode 100644
index 1d5af1d4fe5..00000000000
--- a/app/assets/javascripts/vue_shared/security_reports/store/modules/sast/index.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import * as actions from './actions';
-import mutations from './mutations';
-import state from './state';
-
-export default {
- namespaced: true,
- state,
- mutations,
- actions,
-};
diff --git a/app/assets/javascripts/vue_shared/security_reports/store/modules/sast/mutation_types.js b/app/assets/javascripts/vue_shared/security_reports/store/modules/sast/mutation_types.js
deleted file mode 100644
index aacec0fb679..00000000000
--- a/app/assets/javascripts/vue_shared/security_reports/store/modules/sast/mutation_types.js
+++ /dev/null
@@ -1,4 +0,0 @@
-export const RECEIVE_DIFF_SUCCESS = 'RECEIVE_DIFF_SUCCESS';
-export const RECEIVE_DIFF_ERROR = 'RECEIVE_DIFF_ERROR';
-export const REQUEST_DIFF = 'REQUEST_DIFF';
-export const SET_DIFF_ENDPOINT = 'SET_DIFF_ENDPOINT';
diff --git a/app/assets/javascripts/vue_shared/security_reports/store/modules/sast/mutations.js b/app/assets/javascripts/vue_shared/security_reports/store/modules/sast/mutations.js
deleted file mode 100644
index 11aa71d2b6b..00000000000
--- a/app/assets/javascripts/vue_shared/security_reports/store/modules/sast/mutations.js
+++ /dev/null
@@ -1,31 +0,0 @@
-import Vue from 'vue';
-import { parseDiff } from '../../utils';
-import * as types from './mutation_types';
-
-export default {
- [types.SET_DIFF_ENDPOINT](state, path) {
- Vue.set(state.paths, 'diffEndpoint', path);
- },
-
- [types.REQUEST_DIFF](state) {
- state.isLoading = true;
- },
-
- [types.RECEIVE_DIFF_SUCCESS](state, { diff, enrichData }) {
- const { added, fixed, existing } = parseDiff(diff, enrichData);
- const baseReportOutofDate = diff.base_report_out_of_date || false;
- const hasBaseReport = Boolean(diff.base_report_created_at);
-
- state.isLoading = false;
- state.newIssues = added;
- state.resolvedIssues = fixed;
- state.allIssues = existing;
- state.baseReportOutofDate = baseReportOutofDate;
- state.hasBaseReport = hasBaseReport;
- },
-
- [types.RECEIVE_DIFF_ERROR](state) {
- state.isLoading = false;
- state.hasError = true;
- },
-};
diff --git a/app/assets/javascripts/vue_shared/security_reports/store/modules/sast/state.js b/app/assets/javascripts/vue_shared/security_reports/store/modules/sast/state.js
deleted file mode 100644
index c1b3f546431..00000000000
--- a/app/assets/javascripts/vue_shared/security_reports/store/modules/sast/state.js
+++ /dev/null
@@ -1,14 +0,0 @@
-export default () => ({
- paths: {
- diffEndpoint: null,
- },
-
- isLoading: false,
- hasError: false,
-
- newIssues: [],
- resolvedIssues: [],
- allIssues: [],
- baseReportOutofDate: false,
- hasBaseReport: false,
-});
diff --git a/app/assets/javascripts/vue_shared/security_reports/store/modules/secret_detection/actions.js b/app/assets/javascripts/vue_shared/security_reports/store/modules/secret_detection/actions.js
deleted file mode 100644
index 13ca154bfa7..00000000000
--- a/app/assets/javascripts/vue_shared/security_reports/store/modules/secret_detection/actions.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import { REPORT_TYPE_SECRET_DETECTION } from '~/vue_shared/security_reports/constants';
-import { fetchDiffData } from '../../utils';
-import * as types from './mutation_types';
-
-export const setDiffEndpoint = ({ commit }, path) => commit(types.SET_DIFF_ENDPOINT, path);
-
-export const requestDiff = ({ commit }) => commit(types.REQUEST_DIFF);
-
-export const receiveDiffSuccess = ({ commit }, response) =>
- commit(types.RECEIVE_DIFF_SUCCESS, response);
-
-export const receiveDiffError = ({ commit }, response) =>
- commit(types.RECEIVE_DIFF_ERROR, response);
-
-export const fetchDiff = ({ state, rootState, dispatch }) => {
- dispatch('requestDiff');
-
- return fetchDiffData(rootState, state.paths.diffEndpoint, REPORT_TYPE_SECRET_DETECTION)
- .then((data) => {
- dispatch('receiveDiffSuccess', data);
- return data;
- })
- .catch(() => {
- dispatch('receiveDiffError');
- });
-};
diff --git a/app/assets/javascripts/vue_shared/security_reports/store/modules/secret_detection/index.js b/app/assets/javascripts/vue_shared/security_reports/store/modules/secret_detection/index.js
deleted file mode 100644
index 1d5af1d4fe5..00000000000
--- a/app/assets/javascripts/vue_shared/security_reports/store/modules/secret_detection/index.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import * as actions from './actions';
-import mutations from './mutations';
-import state from './state';
-
-export default {
- namespaced: true,
- state,
- mutations,
- actions,
-};
diff --git a/app/assets/javascripts/vue_shared/security_reports/store/modules/secret_detection/mutation_types.js b/app/assets/javascripts/vue_shared/security_reports/store/modules/secret_detection/mutation_types.js
deleted file mode 100644
index aacec0fb679..00000000000
--- a/app/assets/javascripts/vue_shared/security_reports/store/modules/secret_detection/mutation_types.js
+++ /dev/null
@@ -1,4 +0,0 @@
-export const RECEIVE_DIFF_SUCCESS = 'RECEIVE_DIFF_SUCCESS';
-export const RECEIVE_DIFF_ERROR = 'RECEIVE_DIFF_ERROR';
-export const REQUEST_DIFF = 'REQUEST_DIFF';
-export const SET_DIFF_ENDPOINT = 'SET_DIFF_ENDPOINT';
diff --git a/app/assets/javascripts/vue_shared/security_reports/store/modules/secret_detection/mutations.js b/app/assets/javascripts/vue_shared/security_reports/store/modules/secret_detection/mutations.js
deleted file mode 100644
index ee943b0621c..00000000000
--- a/app/assets/javascripts/vue_shared/security_reports/store/modules/secret_detection/mutations.js
+++ /dev/null
@@ -1,30 +0,0 @@
-import { parseDiff } from '~/vue_shared/security_reports/store/utils';
-import * as types from './mutation_types';
-
-export default {
- [types.SET_DIFF_ENDPOINT](state, path) {
- state.paths.diffEndpoint = path;
- },
-
- [types.REQUEST_DIFF](state) {
- state.isLoading = true;
- },
-
- [types.RECEIVE_DIFF_SUCCESS](state, { diff, enrichData }) {
- const { added, fixed, existing } = parseDiff(diff, enrichData);
- const baseReportOutofDate = diff.base_report_out_of_date || false;
- const hasBaseReport = Boolean(diff.base_report_created_at);
-
- state.isLoading = false;
- state.newIssues = added;
- state.resolvedIssues = fixed;
- state.allIssues = existing;
- state.baseReportOutofDate = baseReportOutofDate;
- state.hasBaseReport = hasBaseReport;
- },
-
- [types.RECEIVE_DIFF_ERROR](state) {
- state.isLoading = false;
- state.hasError = true;
- },
-};
diff --git a/app/assets/javascripts/vue_shared/security_reports/store/modules/secret_detection/state.js b/app/assets/javascripts/vue_shared/security_reports/store/modules/secret_detection/state.js
deleted file mode 100644
index c1b3f546431..00000000000
--- a/app/assets/javascripts/vue_shared/security_reports/store/modules/secret_detection/state.js
+++ /dev/null
@@ -1,14 +0,0 @@
-export default () => ({
- paths: {
- diffEndpoint: null,
- },
-
- isLoading: false,
- hasError: false,
-
- newIssues: [],
- resolvedIssues: [],
- allIssues: [],
- baseReportOutofDate: false,
- hasBaseReport: false,
-});
diff --git a/app/assets/javascripts/vue_shared/security_reports/store/state.js b/app/assets/javascripts/vue_shared/security_reports/store/state.js
deleted file mode 100644
index 5dc4d1ad2fb..00000000000
--- a/app/assets/javascripts/vue_shared/security_reports/store/state.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import { MODULE_SAST, MODULE_SECRET_DETECTION } from './constants';
-
-export default () => ({
- reportTypes: [MODULE_SAST, MODULE_SECRET_DETECTION],
-});
diff --git a/app/assets/javascripts/vue_shared/security_reports/store/utils.js b/app/assets/javascripts/vue_shared/security_reports/store/utils.js
deleted file mode 100644
index f620bad8dba..00000000000
--- a/app/assets/javascripts/vue_shared/security_reports/store/utils.js
+++ /dev/null
@@ -1,154 +0,0 @@
-import axios from '~/lib/utils/axios_utils';
-import pollUntilComplete from '~/lib/utils/poll_until_complete';
-import { __, n__, sprintf } from '~/locale';
-import { CRITICAL, HIGH } from '~/vulnerabilities/constants';
-import {
- FEEDBACK_TYPE_DISMISSAL,
- FEEDBACK_TYPE_ISSUE,
- FEEDBACK_TYPE_MERGE_REQUEST,
-} from '../constants';
-
-export const fetchDiffData = (state, endpoint, category) => {
- const requests = [pollUntilComplete(endpoint)];
-
- if (state.canReadVulnerabilityFeedback) {
- requests.push(axios.get(state.vulnerabilityFeedbackPath, { params: { category } }));
- }
-
- return Promise.all(requests).then(([diffResponse, enrichResponse]) => ({
- diff: diffResponse.data,
- enrichData: enrichResponse?.data ?? [],
- }));
-};
-
-/**
- * Returns given vulnerability enriched with the corresponding
- * feedback (`dismissal` or `issue` type)
- * @param {Object} vulnerabilityObject
- * @param {Array} feedbackList
- */
-export const enrichVulnerabilityWithFeedback = (vulnerabilityObject, feedbackList = []) => {
- const vulnerability = { ...vulnerabilityObject };
- // Some records may have a null `uuid`, we need to fallback to using `project_fingerprint` in those cases. Once all entries have been fixed, we can remove the fallback.
- // related epic: https://gitlab.com/groups/gitlab-org/-/epics/2791
- feedbackList
- .filter((fb) =>
- fb.finding_uuid
- ? fb.finding_uuid === vulnerability.uuid
- : fb.project_fingerprint === vulnerability.project_fingerprint,
- )
- .forEach((feedback) => {
- if (feedback.feedback_type === FEEDBACK_TYPE_DISMISSAL) {
- vulnerability.isDismissed = true;
- vulnerability.dismissalFeedback = feedback;
- } else if (feedback.feedback_type === FEEDBACK_TYPE_ISSUE && feedback.issue_iid) {
- vulnerability.hasIssue = true;
- vulnerability.issue_feedback = feedback;
- } else if (
- feedback.feedback_type === FEEDBACK_TYPE_MERGE_REQUEST &&
- feedback.merge_request_iid
- ) {
- vulnerability.hasMergeRequest = true;
- vulnerability.merge_request_feedback = feedback;
- }
- });
-
- return vulnerability;
-};
-
-/**
- * Generates the added, fixed, and existing vulnerabilities from the API report.
- *
- * @param {Object} diff The original reports.
- * @param {Object} enrichData Feedback data to add to the reports.
- * @returns {Object}
- */
-export const parseDiff = (diff, enrichData) => {
- const enrichVulnerability = (vulnerability) => ({
- ...enrichVulnerabilityWithFeedback(vulnerability, enrichData),
- category: vulnerability.report_type,
- title: vulnerability.message || vulnerability.name,
- });
-
- return {
- added: diff.added ? diff.added.map(enrichVulnerability) : [],
- fixed: diff.fixed ? diff.fixed.map(enrichVulnerability) : [],
- existing: diff.existing ? diff.existing.map(enrichVulnerability) : [],
- };
-};
-
-const createCountMessage = ({ critical, high, other, total }) => {
- const otherMessage = n__('%d Other', '%d Others', other);
- const countMessage = __(
- '%{criticalStart}%{critical} Critical%{criticalEnd} %{highStart}%{high} High%{highEnd} and %{otherStart}%{otherMessage}%{otherEnd}',
- );
- return total ? sprintf(countMessage, { critical, high, otherMessage }) : '';
-};
-
-const createStatusMessage = ({ reportType, status, total }) => {
- const vulnMessage = n__('vulnerability', 'vulnerabilities', total);
- let message;
- if (status) {
- message = __('%{reportType} %{status}');
- } else if (!total) {
- message = __('%{reportType} detected no new vulnerabilities.');
- } else {
- message = __(
- '%{reportType} detected %{totalStart}%{total}%{totalEnd} potential %{vulnMessage}',
- );
- }
- return sprintf(message, { reportType, status, total, vulnMessage });
-};
-
-/**
- * Counts vulnerabilities.
- * Returns the amount of critical, high, and other vulnerabilities.
- *
- * @param {Array} vulnerabilities The raw vulnerabilities to parse
- * @returns {{critical: number, high: number, other: number}}
- */
-export const countVulnerabilities = (vulnerabilities = []) =>
- vulnerabilities.reduce(
- (acc, { severity }) => {
- if (severity === CRITICAL) {
- acc.critical += 1;
- } else if (severity === HIGH) {
- acc.high += 1;
- } else {
- acc.other += 1;
- }
-
- return acc;
- },
- { critical: 0, high: 0, other: 0 },
- );
-
-/**
- * Takes an object of options and returns the object with an externalized string representing
- * the critical, high, and other severity vulnerabilities for a given report.
- *
- * The resulting string _may_ still contain sprintf-style placeholders. These
- * are left in place so they can be replaced with markup, via the
- * SecuritySummary component.
- * @param {{reportType: string, status: string, critical: number, high: number, other: number}} options
- * @returns {Object} the parameters with an externalized string
- */
-export const groupedTextBuilder = ({
- reportType = '',
- status = '',
- critical = 0,
- high = 0,
- other = 0,
-} = {}) => {
- const total = critical + high + other;
-
- return {
- countMessage: createCountMessage({ critical, high, other, total }),
- message: createStatusMessage({ reportType, status, total }),
- critical,
- high,
- other,
- status,
- total,
- };
-};
diff --git a/app/assets/javascripts/vue_shared/security_reports/utils.js b/app/assets/javascripts/vue_shared/security_reports/utils.js
index 0add91c402e..aa4f6978552 100644
--- a/app/assets/javascripts/vue_shared/security_reports/utils.js
+++ b/app/assets/javascripts/vue_shared/security_reports/utils.js
@@ -39,13 +39,3 @@ export const extractSecurityReportArtifacts = (reportTypes, jobs) => {
return acc;
}, []);
};
-
-export const extractSecurityReportArtifactsFromPipeline = (reportTypes, data) => {
- const jobs = data.project?.pipeline?.jobs?.nodes ?? [];
- return extractSecurityReportArtifacts(reportTypes, jobs);
-};
-
-export const extractSecurityReportArtifactsFromMergeRequest = (reportTypes, data) => {
- const jobs = data.project?.mergeRequest?.headPipeline?.jobs?.nodes ?? [];
- return extractSecurityReportArtifacts(reportTypes, jobs);
-};
diff --git a/app/assets/javascripts/work_items/components/item_state.vue b/app/assets/javascripts/work_items/components/item_state.vue
index 8bb8b6101d4..9053d8972de 100644
--- a/app/assets/javascripts/work_items/components/item_state.vue
+++ b/app/assets/javascripts/work_items/components/item_state.vue
@@ -54,7 +54,7 @@ export default {
:label-for="$options.labelId"
label-cols="3"
label-cols-lg="2"
- label-class="gl-pb-0! gl-overflow-wrap-break"
+ label-class="gl-pb-0! gl-overflow-wrap-break work-item-field-label"
class="gl-align-items-center"
>
<gl-form-select
@@ -63,7 +63,7 @@ export default {
:options="$options.states"
:disabled="disabled"
data-testid="work-item-state-select"
- class="gl-w-auto hide-select-decoration gl-pl-4 gl-my-1"
+ class="gl-w-auto hide-select-decoration gl-pl-4 gl-my-1 work-item-field-value"
:class="{ 'gl-bg-transparent! gl-cursor-text!': disabled }"
@change="setState"
/>
diff --git a/app/assets/javascripts/work_items/components/notes/system_note.vue b/app/assets/javascripts/work_items/components/notes/system_note.vue
index 1fa217f456e..7903adea9bd 100644
--- a/app/assets/javascripts/work_items/components/notes/system_note.vue
+++ b/app/assets/javascripts/work_items/components/notes/system_note.vue
@@ -114,7 +114,7 @@ export default {
:note-id="noteId"
:is-system-note="true"
>
- <span ref="gfm-content" v-safe-html="actionTextHtml"></span>
+ <span ref="gfm-content" v-safe-html="actionTextHtml" class="gl-word-break-word"></span>
<template v-if="canSeeDescriptionVersion" #extra-controls>
&middot;
<gl-button
diff --git a/app/assets/javascripts/work_items/components/notes/work_item_note.vue b/app/assets/javascripts/work_items/components/notes/work_item_note.vue
index 7ad424868c6..a2667a379e1 100644
--- a/app/assets/javascripts/work_items/components/notes/work_item_note.vue
+++ b/app/assets/javascripts/work_items/components/notes/work_item_note.vue
@@ -18,10 +18,12 @@ import updateWorkItemMutation from '~/work_items/graphql/update_work_item.mutati
import updateWorkItemNoteMutation from '../../graphql/notes/update_work_item_note.mutation.graphql';
import workItemByIidQuery from '../../graphql/work_item_by_iid.query.graphql';
import WorkItemCommentForm from './work_item_comment_form.vue';
+import WorkItemNoteAwardsList from './work_item_note_awards_list.vue';
export default {
name: 'WorkItemNoteThread',
components: {
+ WorkItemNoteAwardsList,
TimelineEntryItem,
NoteBody,
NoteHeader,
@@ -101,6 +103,9 @@ export default {
author() {
return this.note.author;
},
+ authorId() {
+ return getIdFromGraphQLId(this.author.id);
+ },
entryClass() {
return {
'note note-wrapper note-comment': true,
@@ -149,10 +154,10 @@ export default {
return window.gon.current_user_id;
},
isCurrentUserAuthorOfNote() {
- return getIdFromGraphQLId(this.author.id) === this.currentUserId;
+ return this.authorId === this.currentUserId;
},
isWorkItemAuthor() {
- return getIdFromGraphQLId(this.workItem?.author?.id) === getIdFromGraphQLId(this.author.id);
+ return getIdFromGraphQLId(this.workItem?.author?.id) === this.authorId;
},
projectName() {
return this.workItem?.project?.name;
@@ -284,7 +289,12 @@ export default {
<template>
<timeline-entry-item :id="noteAnchorId" :class="entryClass">
<div :key="note.id" class="timeline-avatar gl-float-left">
- <gl-avatar-link :href="author.webUrl">
+ <gl-avatar-link
+ :href="author.webUrl"
+ :data-user-id="authorId"
+ :data-username="author.username"
+ class="js-user-link"
+ >
<gl-avatar
:src="author.avatarUrl"
:entity-name="author.username"
@@ -323,6 +333,8 @@ export default {
<div class="gl-display-inline-flex">
<note-actions
:show-award-emoji="hasAwardEmojiPermission"
+ :work-item-iid="workItemIid"
+ :note="note"
:note-url="noteUrl"
:show-reply="showReply"
:show-edit="hasAdminPermission"
@@ -356,6 +368,9 @@ export default {
:class="isFirstNote ? 'gl-pl-3' : 'gl-pl-8'"
/>
</div>
+ <div class="note-awards" :class="isFirstNote ? '' : 'gl-pl-7'">
+ <work-item-note-awards-list :note="note" :work-item-iid="workItemIid" :is-modal="isModal" />
+ </div>
</div>
</timeline-entry-item>
</template>
diff --git a/app/assets/javascripts/work_items/components/notes/work_item_note_actions.vue b/app/assets/javascripts/work_items/components/notes/work_item_note_actions.vue
index b32a8c78c93..e5da3d346ae 100644
--- a/app/assets/javascripts/work_items/components/notes/work_item_note_actions.vue
+++ b/app/assets/javascripts/work_items/components/notes/work_item_note_actions.vue
@@ -1,17 +1,15 @@
<script>
import {
GlButton,
- GlIcon,
GlTooltipDirective,
GlDisclosureDropdown,
GlDisclosureDropdownItem,
} from '@gitlab/ui';
import * as Sentry from '@sentry/browser';
-import { __, s__, sprintf } from '~/locale';
+import { __, sprintf } from '~/locale';
import UserAccessRoleBadge from '~/vue_shared/components/user_access_role_badge.vue';
import ReplyButton from '~/notes/components/note_actions/reply_button.vue';
-import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-import addAwardEmojiMutation from '../../graphql/notes/work_item_note_add_award_emoji.mutation.graphql';
+import { getMutation, optimisticAwardUpdate } from '../../notes/award_utils';
export default {
name: 'WorkItemNoteActions',
@@ -25,19 +23,26 @@ export default {
reportAbuseText: __('Report abuse to administrator'),
},
components: {
+ EmojiPicker: () => import('~/emoji/components/picker.vue'),
GlButton,
- GlIcon,
GlDisclosureDropdown,
GlDisclosureDropdownItem,
ReplyButton,
- EmojiPicker: () => import('~/emoji/components/picker.vue'),
UserAccessRoleBadge,
},
directives: {
GlTooltip: GlTooltipDirective,
},
- mixins: [glFeatureFlagsMixin()],
+ inject: ['fullPath'],
props: {
+ workItemIid: {
+ type: String,
+ required: true,
+ },
+ note: {
+ type: Object,
+ required: true,
+ },
showReply: {
type: Boolean,
required: true,
@@ -126,24 +131,29 @@ export default {
methods: {
async setAwardEmoji(name) {
+ const { mutation, mutationName, errorMessage } = getMutation({ note: this.note, name });
+
try {
- const {
- data: {
- awardEmojiAdd: { errors = [] },
- },
- } = await this.$apollo.mutate({
- mutation: addAwardEmojiMutation,
+ await this.$apollo.mutate({
+ mutation,
variables: {
- awardableId: this.noteId,
+ awardableId: this.note.id,
name,
},
+ optimisticResponse: {
+ [mutationName]: {
+ errors: [],
+ },
+ },
+ update: optimisticAwardUpdate({
+ note: this.note,
+ name,
+ fullPath: this.fullPath,
+ workItemIid: this.workItemIid,
+ }),
});
-
- if (errors.length > 0) {
- throw new Error(errors[0].message);
- }
} catch (error) {
- this.$emit('error', s__('WorkItem|Failed to award emoji'));
+ this.$emit('error', errorMessage);
Sentry.captureException(error);
}
},
@@ -185,23 +195,11 @@ export default {
{{ __('Contributor') }}
</user-access-role-badge>
<emoji-picker
- v-if="showAwardEmoji && glFeatures.workItemsMvc2"
+ v-if="showAwardEmoji"
toggle-class="note-action-button note-emoji-button btn-icon btn-default-tertiary"
data-testid="note-emoji-button"
@click="setAwardEmoji"
- >
- <template #button-content>
- <gl-icon class="award-control-icon-neutral gl-button-icon gl-icon" name="slight-smile" />
- <gl-icon
- class="award-control-icon-positive gl-button-icon gl-icon gl-left-3!"
- name="smiley"
- />
- <gl-icon
- class="award-control-icon-super-positive gl-button-icon gl-icon gl-left-3!"
- name="smile"
- />
- </template>
- </emoji-picker>
+ />
<reply-button v-if="showReply" ref="replyButton" @startReplying="$emit('startReplying')" />
<gl-button
v-if="showEdit"
diff --git a/app/assets/javascripts/work_items/components/notes/work_item_note_awards_list.vue b/app/assets/javascripts/work_items/components/notes/work_item_note_awards_list.vue
new file mode 100644
index 00000000000..3c30c204ab6
--- /dev/null
+++ b/app/assets/javascripts/work_items/components/notes/work_item_note_awards_list.vue
@@ -0,0 +1,95 @@
+<script>
+import * as Sentry from '@sentry/browser';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
+import AwardsList from '~/vue_shared/components/awards_list.vue';
+import { getMutation, optimisticAwardUpdate } from '../../notes/award_utils';
+
+export default {
+ components: {
+ AwardsList,
+ },
+ inject: ['fullPath'],
+ props: {
+ workItemIid: {
+ type: String,
+ required: true,
+ },
+ note: {
+ type: Object,
+ required: true,
+ },
+ isModal: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ },
+ computed: {
+ awardsListBoundary() {
+ return this.isModal ? '.modal-body' : '';
+ },
+ awards() {
+ return this.note.awardEmoji.nodes.map((award) => {
+ return {
+ ...award,
+ user: {
+ ...award.user,
+ id: getIdFromGraphQLId(award.user.id),
+ },
+ };
+ });
+ },
+ hasAwardEmojiPermission() {
+ return this.note.userPermissions.awardEmoji;
+ },
+ currentUserId() {
+ return window.gon.current_user_id;
+ },
+ },
+ methods: {
+ async handleAward(name) {
+ if (!this.hasAwardEmojiPermission) {
+ return;
+ }
+
+ const { mutation, mutationName, errorMessage } = getMutation({ note: this.note, name });
+
+ try {
+ await this.$apollo.mutate({
+ mutation,
+ variables: {
+ awardableId: this.note.id,
+ name,
+ },
+ optimisticResponse: {
+ [mutationName]: {
+ errors: [],
+ },
+ },
+ update: optimisticAwardUpdate({
+ note: this.note,
+ name,
+ fullPath: this.fullPath,
+ workItemIid: this.workItemIid,
+ }),
+ });
+ } catch (error) {
+ this.$emit('error', errorMessage);
+ Sentry.captureException(error);
+ }
+ },
+ },
+};
+</script>
+
+<template>
+ <awards-list
+ v-if="awards.length"
+ :awards="awards"
+ :can-award-emoji="hasAwardEmojiPermission"
+ :current-user-id="currentUserId"
+ :boundary="awardsListBoundary"
+ class="gl-px-2"
+ @award="handleAward($event)"
+ />
+</template>
diff --git a/app/assets/javascripts/work_items/components/widget_wrapper.vue b/app/assets/javascripts/work_items/components/widget_wrapper.vue
index 6ae30e9b084..f343f787358 100644
--- a/app/assets/javascripts/work_items/components/widget_wrapper.vue
+++ b/app/assets/javascripts/work_items/components/widget_wrapper.vue
@@ -27,6 +27,9 @@ export default {
toggleLabel() {
return this.isOpen ? __('Collapse') : __('Expand');
},
+ isOpenString() {
+ return this.isOpen ? 'true' : 'false';
+ },
},
methods: {
hide() {
@@ -43,18 +46,10 @@ export default {
</script>
<template>
- <div
- id="tasks"
- class="gl-rounded-base gl-border-1 gl-border-solid gl-border-gray-100 gl-bg-gray-10 gl-mt-5"
- >
- <div
- class="gl-pl-5 gl-pr-4 gl-py-4 gl-display-flex gl-justify-content-space-between gl-bg-white gl-rounded-base"
- :class="{
- 'gl-border-b-1 gl-border-b-solid gl-border-b-gray-100 gl-rounded-bottom-left-none! gl-rounded-bottom-right-none!': isOpen,
- }"
- >
- <div class="gl-display-flex gl-flex-grow-1">
- <h3 class="card-title h5 gl-m-0 gl-relative gl-line-height-24">
+ <div id="tasks" class="gl-new-card" :aria-expanded="isOpenString">
+ <div class="gl-new-card-header">
+ <div class="gl-new-card-title-wrapper">
+ <h3 class="gl-new-card-title">
<gl-link
id="user-content-tasks-links"
class="anchor position-absolute gl-text-decoration-none"
@@ -66,7 +61,7 @@ export default {
<slot name="header-suffix"></slot>
</div>
<slot name="header-right"></slot>
- <div class="gl-border-l-1 gl-border-l-solid gl-border-l-gray-100 gl-pl-3 gl-ml-3">
+ <div class="gl-new-card-toggle">
<gl-button
category="tertiary"
size="small"
@@ -80,12 +75,7 @@ export default {
<gl-alert v-if="error" variant="danger" @dismiss="$emit('dismissAlert')">
{{ error }}
</gl-alert>
- <div
- v-if="isOpen"
- class="gl-bg-gray-10 gl-rounded-bottom-left-base gl-rounded-bottom-right-base"
- :class="{ 'gl-p-3': !error }"
- data-testid="widget-body"
- >
+ <div v-if="isOpen" class="gl-new-card-body" :class="{ error: error }" data-testid="widget-body">
<slot name="body"></slot>
</div>
</div>
diff --git a/app/assets/javascripts/work_items/components/work_item_assignees.vue b/app/assets/javascripts/work_items/components/work_item_assignees.vue
index d0d520ae5b1..f7ac63e16c3 100644
--- a/app/assets/javascripts/work_items/components/work_item_assignees.vue
+++ b/app/assets/javascripts/work_items/components/work_item_assignees.vue
@@ -303,7 +303,7 @@ export default {
<div class="form-row gl-mb-5 work-item-assignees gl-relative gl-flex-nowrap">
<span
:id="assigneesTitleId"
- class="gl-font-weight-bold gl-mt-2 col-lg-2 col-3 gl-pt-2 min-w-fit-content gl-overflow-wrap-break"
+ class="gl-font-weight-bold gl-mt-2 col-lg-2 col-3 gl-pt-2 min-w-fit-content gl-overflow-wrap-break work-item-field-label"
data-testid="assignees-title"
>{{ assigneeText }}</span
>
@@ -313,11 +313,12 @@ export default {
:selected-tokens="localAssignees"
:container-class="containerClass"
:class="{ 'gl-hover-border-gray-200': canUpdate }"
+ menu-class="token-selector-menu-class"
:dropdown-items="dropdownItems"
:loading="isLoadingUsers && !isLoadingMore"
:view-only="!canUpdate"
:allow-clear-all="isEditing"
- class="assignees-selector gl-flex-grow-1 gl-border gl-border-white gl-rounded-base col-9 gl-align-self-start gl-px-0! gl-mx-2"
+ class="assignees-selector gl-flex-grow-1 gl-border gl-border-white gl-rounded-base col-9 gl-align-self-start gl-px-0! gl-mx-2 work-item-field-value"
data-testid="work-item-assignees-input"
@input="handleAssigneesInput"
@text-input="debouncedSearchKeyUpdate"
@@ -339,7 +340,7 @@ export default {
class="assign-myself"
data-testid="assign-self"
@click.stop="assignToCurrentUser"
- >{{ __('Assign myself') }}</gl-button
+ >{{ __('Assign yourself') }}</gl-button
>
</div>
</template>
diff --git a/app/assets/javascripts/work_items/components/work_item_attributes_wrapper.vue b/app/assets/javascripts/work_items/components/work_item_attributes_wrapper.vue
new file mode 100644
index 00000000000..c727075eaac
--- /dev/null
+++ b/app/assets/javascripts/work_items/components/work_item_attributes_wrapper.vue
@@ -0,0 +1,180 @@
+<script>
+import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import {
+ sprintfWorkItem,
+ WIDGET_TYPE_ASSIGNEES,
+ WIDGET_TYPE_HEALTH_STATUS,
+ WIDGET_TYPE_ITERATION,
+ WIDGET_TYPE_LABELS,
+ WIDGET_TYPE_MILESTONE,
+ WIDGET_TYPE_PROGRESS,
+ WIDGET_TYPE_START_AND_DUE_DATE,
+ WIDGET_TYPE_WEIGHT,
+} from '../constants';
+import WorkItemState from './work_item_state.vue';
+import WorkItemDueDate from './work_item_due_date.vue';
+import WorkItemAssignees from './work_item_assignees.vue';
+import WorkItemLabels from './work_item_labels.vue';
+import WorkItemMilestone from './work_item_milestone.vue';
+
+export default {
+ components: {
+ WorkItemLabels,
+ WorkItemMilestone,
+ WorkItemAssignees,
+ WorkItemDueDate,
+ WorkItemState,
+ WorkItemWeight: () => import('ee_component/work_items/components/work_item_weight.vue'),
+ WorkItemProgress: () => import('ee_component/work_items/components/work_item_progress.vue'),
+ WorkItemIteration: () => import('ee_component/work_items/components/work_item_iteration.vue'),
+ WorkItemHealthStatus: () =>
+ import('ee_component/work_items/components/work_item_health_status.vue'),
+ },
+ mixins: [glFeatureFlagMixin()],
+ inject: ['fullPath'],
+ props: {
+ workItem: {
+ type: Object,
+ required: true,
+ },
+ workItemParentId: {
+ type: String,
+ required: false,
+ default: null,
+ },
+ },
+ computed: {
+ workItemType() {
+ return this.workItem.workItemType?.name;
+ },
+ canUpdate() {
+ return this.workItem?.userPermissions?.updateWorkItem;
+ },
+ canDelete() {
+ return this.workItem?.userPermissions?.deleteWorkItem;
+ },
+ canSetWorkItemMetadata() {
+ return this.workItem?.userPermissions?.setWorkItemMetadata;
+ },
+ canAssignUnassignUser() {
+ return this.workItemAssignees && this.canSetWorkItemMetadata;
+ },
+ confidentialTooltip() {
+ return sprintfWorkItem(this.$options.i18n.confidentialTooltip, this.workItemType);
+ },
+ workItemAssignees() {
+ return this.isWidgetPresent(WIDGET_TYPE_ASSIGNEES);
+ },
+ workItemLabels() {
+ return this.isWidgetPresent(WIDGET_TYPE_LABELS);
+ },
+ workItemDueDate() {
+ return this.isWidgetPresent(WIDGET_TYPE_START_AND_DUE_DATE);
+ },
+ workItemWeight() {
+ return this.isWidgetPresent(WIDGET_TYPE_WEIGHT);
+ },
+ workItemProgress() {
+ return this.isWidgetPresent(WIDGET_TYPE_PROGRESS);
+ },
+ workItemIteration() {
+ return this.isWidgetPresent(WIDGET_TYPE_ITERATION);
+ },
+ workItemHealthStatus() {
+ return this.isWidgetPresent(WIDGET_TYPE_HEALTH_STATUS);
+ },
+ workItemMilestone() {
+ return this.isWidgetPresent(WIDGET_TYPE_MILESTONE);
+ },
+ },
+ methods: {
+ isWidgetPresent(type) {
+ return this.workItem?.widgets?.find((widget) => widget.type === type);
+ },
+ },
+};
+</script>
+
+<template>
+ <div class="work-item-attributes-wrapper">
+ <work-item-state
+ :work-item="workItem"
+ :work-item-parent-id="workItemParentId"
+ :can-update="canUpdate"
+ @error="$emit('error', $event)"
+ />
+ <work-item-assignees
+ v-if="workItemAssignees"
+ :can-update="canUpdate"
+ :work-item-id="workItem.id"
+ :assignees="workItemAssignees.assignees.nodes"
+ :allows-multiple-assignees="workItemAssignees.allowsMultipleAssignees"
+ :work-item-type="workItemType"
+ :can-invite-members="workItemAssignees.canInviteMembers"
+ @error="$emit('error', $event)"
+ />
+ <work-item-labels
+ v-if="workItemLabels"
+ :can-update="canUpdate"
+ :work-item-id="workItem.id"
+ :work-item-iid="workItem.iid"
+ @error="$emit('error', $event)"
+ />
+ <work-item-due-date
+ v-if="workItemDueDate"
+ :can-update="canUpdate"
+ :due-date="workItemDueDate.dueDate"
+ :start-date="workItemDueDate.startDate"
+ :work-item-id="workItem.id"
+ :work-item-type="workItemType"
+ @error="$emit('error', $event)"
+ />
+ <work-item-milestone
+ v-if="workItemMilestone"
+ :work-item-id="workItem.id"
+ :work-item-milestone="workItemMilestone.milestone"
+ :work-item-type="workItemType"
+ :can-update="canUpdate"
+ @error="$emit('error', $event)"
+ />
+ <work-item-weight
+ v-if="workItemWeight"
+ class="gl-mb-5"
+ :can-update="canUpdate"
+ :weight="workItemWeight.weight"
+ :work-item-id="workItem.id"
+ :work-item-iid="workItem.iid"
+ :work-item-type="workItemType"
+ @error="$emit('error', $event)"
+ />
+ <work-item-progress
+ v-if="workItemProgress"
+ class="gl-mb-5"
+ :can-update="canUpdate"
+ :progress="workItemProgress.progress"
+ :work-item-id="workItem.id"
+ :work-item-type="workItemType"
+ @error="$emit('error', $event)"
+ />
+ <work-item-iteration
+ v-if="workItemIteration"
+ class="gl-mb-5"
+ :iteration="workItemIteration.iteration"
+ :can-update="canUpdate"
+ :work-item-id="workItem.id"
+ :work-item-iid="workItem.iid"
+ :work-item-type="workItemType"
+ @error="$emit('error', $event)"
+ />
+ <work-item-health-status
+ v-if="workItemHealthStatus"
+ class="gl-mb-5"
+ :health-status="workItemHealthStatus.healthStatus"
+ :can-update="canUpdate"
+ :work-item-id="workItem.id"
+ :work-item-iid="workItem.iid"
+ :work-item-type="workItemType"
+ @error="$emit('error', $event)"
+ />
+ </div>
+</template>
diff --git a/app/assets/javascripts/work_items/components/work_item_award_emoji.vue b/app/assets/javascripts/work_items/components/work_item_award_emoji.vue
index 144c29b8ec3..3dd3a072d0f 100644
--- a/app/assets/javascripts/work_items/components/work_item_award_emoji.vue
+++ b/app/assets/javascripts/work_items/components/work_item_award_emoji.vue
@@ -7,9 +7,15 @@ import AwardsList from '~/vue_shared/components/awards_list.vue';
import { isLoggedIn } from '~/lib/utils/common_utils';
import { TYPENAME_USER } from '~/graphql_shared/constants';
+import workItemAwardEmojiQuery from '../graphql/award_emoji.query.graphql';
import updateAwardEmojiMutation from '../graphql/update_award_emoji.mutation.graphql';
-import workItemByIidQuery from '../graphql/work_item_by_iid.query.graphql';
-import { EMOJI_THUMBSDOWN, EMOJI_THUMBSUP, WIDGET_TYPE_AWARD_EMOJI } from '../constants';
+import {
+ EMOJI_THUMBSDOWN,
+ EMOJI_THUMBSUP,
+ WIDGET_TYPE_AWARD_EMOJI,
+ DEFAULT_PAGE_SIZE_EMOJIS,
+ I18N_WORK_ITEM_FETCH_AWARD_EMOJI_ERROR,
+} from '../constants';
export default {
defaultAwards: [EMOJI_THUMBSUP, EMOJI_THUMBSDOWN],
@@ -26,16 +32,17 @@ export default {
type: String,
required: true,
},
- awardEmoji: {
- type: Object,
- required: true,
- },
workItemIid: {
type: String,
required: false,
default: null,
},
},
+ data() {
+ return {
+ isLoading: false,
+ };
+ },
computed: {
currentUserId() {
return window.gon.current_user_id;
@@ -47,6 +54,10 @@ export default {
* Parse and convert award emoji list to a format that AwardsList can understand
*/
awards() {
+ if (!this.awardEmoji) {
+ return [];
+ }
+
return this.awardEmoji.nodes.map((emoji) => ({
name: emoji.name,
user: {
@@ -55,16 +66,56 @@ export default {
},
}));
},
+ pageInfo() {
+ return this.awardEmoji?.pageInfo;
+ },
+ hasNextPage() {
+ return this.pageInfo?.hasNextPage;
+ },
+ },
+ apollo: {
+ awardEmoji: {
+ query: workItemAwardEmojiQuery,
+ variables() {
+ return {
+ iid: this.workItemIid,
+ fullPath: this.workItemFullpath,
+ after: this.after,
+ pageSize: DEFAULT_PAGE_SIZE_EMOJIS,
+ };
+ },
+ update(data) {
+ const widgets = data.workspace?.workItems?.nodes[0].widgets;
+ return widgets?.find((widget) => widget.type === WIDGET_TYPE_AWARD_EMOJI).awardEmoji || {};
+ },
+ skip() {
+ return !this.workItemIid;
+ },
+ result() {
+ if (this.hasNextPage) {
+ this.fetchAwardEmojis();
+ } else {
+ this.isLoading = false;
+ }
+ },
+ error() {
+ this.$emit('error', I18N_WORK_ITEM_FETCH_AWARD_EMOJI_ERROR);
+ },
+ },
},
methods: {
- getAwards() {
- return this.awardEmoji.nodes.map((emoji) => ({
- name: emoji.name,
- user: {
- id: getIdFromGraphQLId(emoji.user.id),
- name: emoji.user.name,
- },
- }));
+ async fetchAwardEmojis() {
+ this.isLoading = true;
+ try {
+ await this.$apollo.queries.awardEmoji.fetchMore({
+ variables: {
+ pageSize: DEFAULT_PAGE_SIZE_EMOJIS,
+ after: this.pageInfo?.endCursor,
+ },
+ });
+ } catch (error) {
+ this.$emit('error', I18N_WORK_ITEM_FETCH_AWARD_EMOJI_ERROR);
+ }
},
isEmojiPresentForCurrentUser(name) {
return (
@@ -108,8 +159,12 @@ export default {
},
updateWorkItemAwardEmojiWidgetCache({ cache, name, toggledOn }) {
const query = {
- query: workItemByIidQuery,
- variables: { fullPath: this.workItemFullpath, iid: this.workItemIid },
+ query: workItemAwardEmojiQuery,
+ variables: {
+ fullPath: this.workItemFullpath,
+ iid: this.workItemIid,
+ pageSize: DEFAULT_PAGE_SIZE_EMOJIS,
+ },
};
const sourceData = cache.readQuery(query);
@@ -117,7 +172,6 @@ export default {
const newData = produce(sourceData, (draftState) => {
const { widgets } = draftState.workspace.workItems.nodes[0];
const widgetAwardEmoji = widgets.find((widget) => widget.type === WIDGET_TYPE_AWARD_EMOJI);
-
widgetAwardEmoji.awardEmoji.nodes = this.getAwardEmojiNodes(name, toggledOn);
});
@@ -175,7 +229,7 @@ export default {
</script>
<template>
- <div class="gl-mt-3">
+ <div v-if="!isLoading" class="gl-mt-3">
<awards-list
data-testid="work-item-award-list"
:awards="awards"
diff --git a/app/assets/javascripts/work_items/components/work_item_description.vue b/app/assets/javascripts/work_items/components/work_item_description.vue
index 61dec21cae4..58bf524f450 100644
--- a/app/assets/javascripts/work_items/components/work_item_description.vue
+++ b/app/assets/javascripts/work_items/components/work_item_description.vue
@@ -9,7 +9,6 @@ import EditedAt from '~/issues/show/components/edited.vue';
import Tracking from '~/tracking';
import MarkdownEditor from '~/vue_shared/components/markdown/markdown_editor.vue';
import { autocompleteDataSources, markdownPreviewPath } from '../utils';
-import workItemDescriptionSubscription from '../graphql/work_item_description.subscription.graphql';
import updateWorkItemMutation from '../graphql/update_work_item.mutation.graphql';
import workItemByIidQuery from '../graphql/work_item_by_iid.query.graphql';
import { i18n, TRACKING_CATEGORY_SHOW, WIDGET_TYPE_DESCRIPTION } from '../constants';
@@ -37,8 +36,7 @@ export default {
required: true,
},
},
- markdownDocsPath: helpPagePath('user/project/quick_actions'),
- quickActionsDocsPath: helpPagePath('user/project/quick_actions'),
+ markdownDocsPath: helpPagePath('user/markdown'),
data() {
return {
workItem: {},
@@ -75,14 +73,6 @@ export default {
error() {
this.$emit('error', i18n.fetchError);
},
- subscribeToMore: {
- document: workItemDescriptionSubscription,
- variables() {
- return {
- issuableId: this.workItemId,
- };
- },
- },
},
},
computed: {
diff --git a/app/assets/javascripts/work_items/components/work_item_description_rendered.vue b/app/assets/javascripts/work_items/components/work_item_description_rendered.vue
index 9a2cdc1c172..07e03eba1d1 100644
--- a/app/assets/javascripts/work_items/components/work_item_description_rendered.vue
+++ b/app/assets/javascripts/work_items/components/work_item_description_rendered.vue
@@ -94,7 +94,7 @@ export default {
</script>
<template>
- <div class="gl-mb-5 gl-border-t gl-pt-5">
+ <div class="gl-mb-5">
<div class="gl-display-inline-flex gl-align-items-center gl-mb-3">
<label class="d-block col-form-label gl-mr-5">{{ __('Description') }}</label>
<gl-button
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 1ac40fe7dcb..1402b313cee 100644
--- a/app/assets/javascripts/work_items/components/work_item_detail.vue
+++ b/app/assets/javascripts/work_items/components/work_item_detail.vue
@@ -9,6 +9,7 @@ import {
GlButton,
GlTooltipDirective,
GlEmptyState,
+ GlIntersectionObserver,
} from '@gitlab/ui';
import noAccessSvg from '@gitlab/svgs/dist/illustrations/analytics/no-access.svg?raw';
import { s__ } from '~/locale';
@@ -22,27 +23,17 @@ import {
sprintfWorkItem,
i18n,
WIDGET_TYPE_ASSIGNEES,
- WIDGET_TYPE_LABELS,
WIDGET_TYPE_NOTIFICATIONS,
WIDGET_TYPE_CURRENT_USER_TODOS,
WIDGET_TYPE_DESCRIPTION,
WIDGET_TYPE_AWARD_EMOJI,
- WIDGET_TYPE_START_AND_DUE_DATE,
- WIDGET_TYPE_WEIGHT,
- WIDGET_TYPE_PROGRESS,
WIDGET_TYPE_HIERARCHY,
- WIDGET_TYPE_MILESTONE,
- WIDGET_TYPE_ITERATION,
- WIDGET_TYPE_HEALTH_STATUS,
WORK_ITEM_TYPE_VALUE_ISSUE,
WORK_ITEM_TYPE_VALUE_OBJECTIVE,
WIDGET_TYPE_NOTES,
} from '../constants';
-import workItemDatesSubscription from '../../graphql_shared/subscriptions/work_item_dates.subscription.graphql';
-import workItemTitleSubscription from '../graphql/work_item_title.subscription.graphql';
-import workItemAssigneesSubscription from '../graphql/work_item_assignees.subscription.graphql';
-import workItemMilestoneSubscription from '../graphql/work_item_milestone.subscription.graphql';
+import workItemUpdatedSubscription from '../graphql/work_item_updated.subscription.graphql';
import updateWorkItemMutation from '../graphql/update_work_item.mutation.graphql';
import updateWorkItemTaskMutation from '../graphql/update_work_item_task.mutation.graphql';
import workItemByIidQuery from '../graphql/work_item_by_iid.query.graphql';
@@ -51,17 +42,13 @@ import { findHierarchyWidgetChildren } from '../utils';
import WorkItemTree from './work_item_links/work_item_tree.vue';
import WorkItemActions from './work_item_actions.vue';
import WorkItemTodos from './work_item_todos.vue';
-import WorkItemState from './work_item_state.vue';
import WorkItemTitle from './work_item_title.vue';
+import WorkItemAttributesWrapper from './work_item_attributes_wrapper.vue';
import WorkItemCreatedUpdated from './work_item_created_updated.vue';
import WorkItemDescription from './work_item_description.vue';
-import WorkItemAwardEmoji from './work_item_award_emoji.vue';
-import WorkItemDueDate from './work_item_due_date.vue';
-import WorkItemAssignees from './work_item_assignees.vue';
-import WorkItemLabels from './work_item_labels.vue';
-import WorkItemMilestone from './work_item_milestone.vue';
import WorkItemNotes from './work_item_notes.vue';
import WorkItemDetailModal from './work_item_detail_modal.vue';
+import WorkItemAwardEmoji from './work_item_award_emoji.vue';
export default {
i18n,
@@ -77,27 +64,19 @@ export default {
GlSkeletonLoader,
GlIcon,
GlEmptyState,
- WorkItemAssignees,
WorkItemActions,
WorkItemTodos,
WorkItemCreatedUpdated,
WorkItemDescription,
WorkItemAwardEmoji,
- WorkItemDueDate,
- WorkItemLabels,
WorkItemTitle,
- WorkItemState,
- WorkItemWeight: () => import('ee_component/work_items/components/work_item_weight.vue'),
- WorkItemProgress: () => import('ee_component/work_items/components/work_item_progress.vue'),
+ WorkItemAttributesWrapper,
WorkItemTypeIcon,
- WorkItemIteration: () => import('ee_component/work_items/components/work_item_iteration.vue'),
- WorkItemHealthStatus: () =>
- import('ee_component/work_items/components/work_item_health_status.vue'),
- WorkItemMilestone,
WorkItemTree,
WorkItemNotes,
WorkItemDetailModal,
AbuseCategorySelector,
+ GlIntersectionObserver,
},
mixins: [glFeatureFlagMixin()],
inject: ['fullPath', 'reportAbusePath'],
@@ -129,6 +108,7 @@ export default {
isReportDrawerOpen: false,
reportedUrl: '',
reportedUserId: 0,
+ isStickyHeaderShowing: false,
};
},
apollo: {
@@ -165,52 +145,17 @@ export default {
document.title = `${this.workItem.title} · ${this.workItem?.workItemType?.name}${path}`;
}
},
- subscribeToMore: [
- {
- document: workItemTitleSubscription,
- variables() {
- return {
- issuableId: this.workItem.id,
- };
- },
- skip() {
- return !this.workItem?.id;
- },
- },
- {
- document: workItemDatesSubscription,
- variables() {
- return {
- issuableId: this.workItem.id,
- };
- },
- skip() {
- return !this.isWidgetPresent(WIDGET_TYPE_START_AND_DUE_DATE) || !this.workItem?.id;
- },
- },
- {
- document: workItemAssigneesSubscription,
- variables() {
- return {
- issuableId: this.workItem.id,
- };
- },
- skip() {
- return !this.isWidgetPresent(WIDGET_TYPE_ASSIGNEES) || !this.workItem?.id;
- },
+ subscribeToMore: {
+ document: workItemUpdatedSubscription,
+ variables() {
+ return {
+ id: this.workItem.id,
+ };
},
- {
- document: workItemMilestoneSubscription,
- variables() {
- return {
- issuableId: this.workItem.id,
- };
- },
- skip() {
- return !this.isWidgetPresent(WIDGET_TYPE_MILESTONE) || !this.workItem?.id;
- },
+ skip() {
+ return !this.workItem?.id;
},
- ],
+ },
},
},
computed: {
@@ -289,38 +234,17 @@ export default {
return this.$options.isLoggedIn && this.workItemCurrentUserTodos;
},
currentUserTodos() {
- return this.workItemCurrentUserTodos?.currentUserTodos?.edges;
+ return this.workItemCurrentUserTodos?.currentUserTodos?.nodes;
},
workItemAssignees() {
return this.isWidgetPresent(WIDGET_TYPE_ASSIGNEES);
},
- workItemLabels() {
- return this.isWidgetPresent(WIDGET_TYPE_LABELS);
- },
- workItemDueDate() {
- return this.isWidgetPresent(WIDGET_TYPE_START_AND_DUE_DATE);
- },
- workItemWeight() {
- return this.isWidgetPresent(WIDGET_TYPE_WEIGHT);
- },
- workItemProgress() {
- return this.isWidgetPresent(WIDGET_TYPE_PROGRESS);
- },
workItemAwardEmoji() {
return this.isWidgetPresent(WIDGET_TYPE_AWARD_EMOJI);
},
workItemHierarchy() {
return this.isWidgetPresent(WIDGET_TYPE_HIERARCHY);
},
- workItemIteration() {
- return this.isWidgetPresent(WIDGET_TYPE_ITERATION);
- },
- workItemHealthStatus() {
- return this.isWidgetPresent(WIDGET_TYPE_HEALTH_STATUS);
- },
- workItemMilestone() {
- return this.isWidgetPresent(WIDGET_TYPE_MILESTONE);
- },
workItemNotes() {
return this.isWidgetPresent(WIDGET_TYPE_NOTES);
},
@@ -332,6 +256,9 @@ export default {
'gl-pt-5': !this.updateError && !this.isModal,
};
},
+ showIntersectionObserver() {
+ return !this.isModal && this.workItemsMvc2Enabled;
+ },
},
mounted() {
if (this.modalWorkItemIid) {
@@ -437,6 +364,15 @@ export default {
this.reportedUrl = reply.url || {};
this.reportedUserId = reply.author ? getIdFromGraphQLId(reply.author.id) : 0;
},
+ hideStickyHeader() {
+ this.isStickyHeaderShowing = false;
+ },
+ showStickyHeader() {
+ // only if scrolled under the work item's title
+ if (this.$refs?.title?.$el.offsetTop < window.pageYOffset) {
+ this.isStickyHeaderShowing = true;
+ }
+ },
},
WORK_ITEM_TYPE_VALUE_OBJECTIVE,
@@ -510,7 +446,9 @@ export default {
>
<work-item-todos
v-if="showWorkItemCurrentUserTodos"
- :work-item="workItem"
+ :work-item-id="workItem.id"
+ :work-item-iid="workItemIid"
+ :work-item-fullpath="workItem.project.fullPath"
:current-user-todos="currentUserTodos"
@error="updateError = $event"
/>
@@ -539,141 +477,148 @@ export default {
@click="$emit('close')"
/>
</div>
- <work-item-title
- v-if="workItem.title"
- :work-item-id="workItem.id"
- :work-item-title="workItem.title"
- :work-item-type="workItemType"
- :work-item-parent-id="workItemParentId"
- :can-update="canUpdate"
- @error="updateError = $event"
- />
- <work-item-created-updated :work-item-iid="workItemIid" />
- <work-item-state
- :work-item="workItem"
- :work-item-parent-id="workItemParentId"
- :can-update="canUpdate"
- @error="updateError = $event"
- />
- <work-item-assignees
- v-if="workItemAssignees"
- :can-update="canUpdate"
- :work-item-id="workItem.id"
- :assignees="workItemAssignees.assignees.nodes"
- :allows-multiple-assignees="workItemAssignees.allowsMultipleAssignees"
- :work-item-type="workItemType"
- :can-invite-members="workItemAssignees.canInviteMembers"
- @error="updateError = $event"
- />
- <work-item-labels
- v-if="workItemLabels"
- :can-update="canUpdate"
- :work-item-id="workItem.id"
- :work-item-iid="workItem.iid"
- @error="updateError = $event"
- />
- <work-item-due-date
- v-if="workItemDueDate"
- :can-update="canUpdate"
- :due-date="workItemDueDate.dueDate"
- :start-date="workItemDueDate.startDate"
- :work-item-id="workItem.id"
- :work-item-type="workItemType"
- @error="updateError = $event"
- />
- <work-item-milestone
- v-if="workItemMilestone"
- :work-item-id="workItem.id"
- :work-item-milestone="workItemMilestone.milestone"
- :work-item-type="workItemType"
- :can-update="canUpdate"
- @error="updateError = $event"
- />
- <work-item-weight
- v-if="workItemWeight"
- class="gl-mb-5"
- :can-update="canUpdate"
- :weight="workItemWeight.weight"
- :work-item-id="workItem.id"
- :work-item-iid="workItem.iid"
- :work-item-type="workItemType"
- @error="updateError = $event"
- />
- <work-item-progress
- v-if="workItemProgress"
- class="gl-mb-5"
- :can-update="canUpdate"
- :progress="workItemProgress.progress"
- :work-item-id="workItem.id"
- :work-item-type="workItemType"
- @error="updateError = $event"
- />
- <work-item-iteration
- v-if="workItemIteration"
- class="gl-mb-5"
- :iteration="workItemIteration.iteration"
- :can-update="canUpdate"
- :work-item-id="workItem.id"
- :work-item-iid="workItem.iid"
- :work-item-type="workItemType"
- @error="updateError = $event"
- />
- <work-item-health-status
- v-if="workItemHealthStatus"
- class="gl-mb-5"
- :health-status="workItemHealthStatus.healthStatus"
- :can-update="canUpdate"
- :work-item-id="workItem.id"
- :work-item-iid="workItem.iid"
- :work-item-type="workItemType"
- @error="updateError = $event"
- />
- <work-item-description
- v-if="hasDescriptionWidget"
- :work-item-id="workItem.id"
- :work-item-iid="workItem.iid"
- class="gl-pt-5"
- @error="updateError = $event"
- />
- <work-item-award-emoji
- v-if="workItemAwardEmoji"
- :work-item-id="workItem.id"
- :work-item-fullpath="workItem.project.fullPath"
- :award-emoji="workItemAwardEmoji.awardEmoji"
- :work-item-iid="workItemIid"
- @error="updateError = $event"
- />
- <work-item-tree
- v-if="workItemType === $options.WORK_ITEM_TYPE_VALUE_OBJECTIVE"
- :work-item-type="workItemType"
- :parent-work-item-type="workItem.workItemType.name"
- :work-item-id="workItem.id"
- :work-item-iid="workItemIid"
- :children="children"
- :can-update="canUpdate"
- :confidential="workItem.confidential"
- @show-modal="openInModal"
- />
- <work-item-notes
- v-if="workItemNotes"
- :work-item-id="workItem.id"
- :work-item-iid="workItem.iid"
- :work-item-type="workItemType"
- :is-modal="isModal"
- :assignees="workItemAssignees && workItemAssignees.assignees.nodes"
- :can-set-work-item-metadata="canAssignUnassignUser"
- :report-abuse-path="reportAbusePath"
- class="gl-pt-5"
- @error="updateError = $event"
- @has-notes="updateHasNotes"
- @openReportAbuse="openReportAbuseDrawer"
- />
- <gl-empty-state
- v-if="error"
- :title="$options.i18n.fetchErrorTitle"
- :description="error"
- :svg-path="noAccessSvgPath"
- />
+ <div>
+ <work-item-title
+ v-if="workItem.title"
+ ref="title"
+ :work-item-id="workItem.id"
+ :work-item-title="workItem.title"
+ :work-item-type="workItemType"
+ :work-item-parent-id="workItemParentId"
+ :can-update="canUpdate"
+ @error="updateError = $event"
+ />
+ <work-item-created-updated :work-item-iid="workItemIid" />
+ </div>
+ <gl-intersection-observer
+ v-if="showIntersectionObserver"
+ @appear="hideStickyHeader"
+ @disappear="showStickyHeader"
+ >
+ <transition name="issuable-header-slide">
+ <div
+ v-if="isStickyHeaderShowing"
+ class="issue-sticky-header gl-fixed gl-bg-white gl-border-b gl-z-index-3 gl-py-2"
+ data-testid="work-item-sticky-header"
+ >
+ <div
+ class="gl-align-items-center gl-mx-auto gl-px-5 gl-display-flex gl-max-w-container-xl"
+ >
+ <span class="gl-text-truncate gl-font-weight-bold gl-pr-3 gl-mr-auto">
+ {{ workItem.title }}
+ </span>
+ <gl-loading-icon v-if="updateInProgress" class="gl-mr-3" />
+ <gl-badge
+ v-if="workItem.confidential"
+ v-gl-tooltip.bottom
+ :title="confidentialTooltip"
+ variant="warning"
+ icon="eye-slash"
+ class="gl-mr-3 gl-cursor-help"
+ >{{ __('Confidential') }}</gl-badge
+ >
+ <work-item-todos
+ v-if="showWorkItemCurrentUserTodos"
+ :work-item-id="workItem.id"
+ :work-item-iid="workItemIid"
+ :work-item-fullpath="workItem.project.fullPath"
+ :current-user-todos="currentUserTodos"
+ @error="updateError = $event"
+ />
+ <work-item-actions
+ :work-item-id="workItem.id"
+ :subscribed-to-notifications="workItemNotificationsSubscribed"
+ :work-item-type="workItemType"
+ :work-item-type-id="workItemTypeId"
+ :can-delete="canDelete"
+ :can-update="canUpdate"
+ :is-confidential="workItem.confidential"
+ :is-parent-confidential="parentWorkItemConfidentiality"
+ :work-item-reference="workItem.reference"
+ :work-item-create-note-email="workItem.createNoteEmail"
+ :is-modal="isModal"
+ @deleteWorkItem="
+ $emit('deleteWorkItem', { workItemType, workItemId: workItem.id })
+ "
+ @toggleWorkItemConfidentiality="toggleConfidentiality"
+ @error="updateError = $event"
+ />
+ </div>
+ </div>
+ </transition>
+ </gl-intersection-observer>
+ <div
+ data-testid="work-item-overview"
+ :class="{ 'work-item-overview': workItemsMvc2Enabled }"
+ >
+ <section>
+ <work-item-attributes-wrapper
+ :class="{ 'gl-md-display-none!': workItemsMvc2Enabled }"
+ class="gl-border-b"
+ :work-item="workItem"
+ :work-item-parent-id="workItemParentId"
+ @error="updateError = $event"
+ />
+ <work-item-description
+ v-if="hasDescriptionWidget"
+ :work-item-id="workItem.id"
+ :work-item-iid="workItem.iid"
+ class="gl-pt-5"
+ @error="updateError = $event"
+ />
+ <work-item-award-emoji
+ v-if="workItemAwardEmoji"
+ :work-item-id="workItem.id"
+ :work-item-fullpath="workItem.project.fullPath"
+ :award-emoji="workItemAwardEmoji.awardEmoji"
+ :work-item-iid="workItemIid"
+ @error="updateError = $event"
+ />
+ <work-item-tree
+ v-if="workItemType === $options.WORK_ITEM_TYPE_VALUE_OBJECTIVE"
+ :work-item-type="workItemType"
+ :parent-work-item-type="workItem.workItemType.name"
+ :work-item-id="workItem.id"
+ :work-item-iid="workItemIid"
+ :children="children"
+ :can-update="canUpdate"
+ :confidential="workItem.confidential"
+ @show-modal="openInModal"
+ />
+ <work-item-notes
+ v-if="workItemNotes"
+ :work-item-id="workItem.id"
+ :work-item-iid="workItem.iid"
+ :work-item-type="workItemType"
+ :is-modal="isModal"
+ :assignees="workItemAssignees && workItemAssignees.assignees.nodes"
+ :can-set-work-item-metadata="canAssignUnassignUser"
+ :report-abuse-path="reportAbusePath"
+ class="gl-pt-5"
+ @error="updateError = $event"
+ @has-notes="updateHasNotes"
+ @openReportAbuse="openReportAbuseDrawer"
+ />
+ <gl-empty-state
+ v-if="error"
+ :title="$options.i18n.fetchErrorTitle"
+ :description="error"
+ :svg-path="noAccessSvgPath"
+ />
+ </section>
+ <aside
+ v-if="workItemsMvc2Enabled"
+ data-testid="work-item-overview-right-sidebar"
+ class="work-item-overview-right-sidebar gl-display-none gl-md-display-block"
+ :class="{ 'is-modal': isModal }"
+ >
+ <work-item-attributes-wrapper
+ :work-item="workItem"
+ :work-item-parent-id="workItemParentId"
+ @error="updateError = $event"
+ />
+ </aside>
+ </div>
</template>
<work-item-detail-modal
v-if="!isModal"
diff --git a/app/assets/javascripts/work_items/components/work_item_due_date.vue b/app/assets/javascripts/work_items/components/work_item_due_date.vue
index 3e546598dc2..b4b3049d669 100644
--- a/app/assets/javascripts/work_items/components/work_item_due_date.vue
+++ b/app/assets/javascripts/work_items/components/work_item_due_date.vue
@@ -88,7 +88,11 @@ export default {
return !this.canUpdate && !this.dueDate && !this.startDate;
},
labelClass() {
- return this.isReadonlyWithNoDates ? 'gl-align-self-center gl-pb-0!' : 'gl-mt-3 gl-pb-0!';
+ return {
+ 'work-item-field-label': true,
+ 'gl-align-self-center gl-pb-0!': this.isReadonlyWithNoDates,
+ 'gl-mt-3 gl-pb-0!': !this.isReadonlyWithNoDates,
+ };
},
showDueDateButton() {
return this.canUpdate && !this.showDueDateInput;
diff --git a/app/assets/javascripts/work_items/components/work_item_labels.vue b/app/assets/javascripts/work_items/components/work_item_labels.vue
index 015c86ba043..8676456a6a4 100644
--- a/app/assets/javascripts/work_items/components/work_item_labels.vue
+++ b/app/assets/javascripts/work_items/components/work_item_labels.vue
@@ -7,7 +7,6 @@ import labelSearchQuery from '~/sidebar/components/labels/labels_select_widget/g
import LabelItem from '~/sidebar/components/labels/labels_select_widget/label_item.vue';
import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
import { isScopedLabel } from '~/lib/utils/common_utils';
-import workItemLabelsSubscription from 'ee_else_ce/work_items/graphql/work_item_labels.subscription.graphql';
import updateWorkItemMutation from '../graphql/update_work_item.mutation.graphql';
import workItemByIidQuery from '../graphql/work_item_by_iid.query.graphql';
@@ -87,14 +86,6 @@ export default {
error() {
this.$emit('error', i18n.fetchError);
},
- subscribeToMore: {
- document: workItemLabelsSubscription,
- variables() {
- return {
- issuableId: this.workItemId,
- };
- },
- },
},
searchLabels: {
query: labelSearchQuery,
@@ -268,7 +259,7 @@ export default {
<div class="form-row gl-mb-5 work-item-labels gl-relative gl-flex-nowrap">
<span
:id="labelsTitleId"
- class="gl-font-weight-bold gl-mt-2 col-lg-2 col-3 gl-pt-2 min-w-fit-content gl-overflow-wrap-break"
+ class="gl-font-weight-bold gl-mt-2 col-lg-2 col-3 gl-pt-2 min-w-fit-content gl-overflow-wrap-break work-item-field-label"
data-testid="labels-title"
>{{ __('Labels') }}</span
>
@@ -281,7 +272,8 @@ export default {
:loading="isLoading"
:view-only="!canUpdate"
:allow-clear-all="isEditing"
- class="gl-flex-grow-1 gl-border gl-border-white gl-rounded-base col-9 gl-align-self-start gl-px-0! gl-mx-2!"
+ class="gl-flex-grow-1 gl-border gl-border-white gl-rounded-base col-9 gl-align-self-start gl-px-0! gl-mx-2! work-item-field-value"
+ menu-class="token-selector-menu-class"
data-testid="work-item-labels-input"
:class="{ 'gl-hover-border-gray-200': canUpdate }"
@input="focusTokenSelector"
diff --git a/app/assets/javascripts/work_items/components/work_item_links/work_item_link_child.vue b/app/assets/javascripts/work_items/components/work_item_links/work_item_link_child.vue
index 401c8a53eb0..ec44a654e89 100644
--- a/app/assets/javascripts/work_items/components/work_item_links/work_item_link_child.vue
+++ b/app/assets/javascripts/work_items/components/work_item_links/work_item_link_child.vue
@@ -271,7 +271,7 @@ export default {
@click="toggleItem"
/>
<div
- class="item-body work-item-link-child gl-relative gl-display-flex gl-flex-grow-1 gl-overflow-break-word gl-min-w-0 gl-pl-3 gl-pr-2 gl-py-2 gl-rounded-base"
+ class="item-body work-item-link-child gl-relative gl-display-flex gl-flex-grow-1 gl-overflow-break-word gl-min-w-0 gl-pl-3 gl-pr-2 gl-py-2 gl-mx-n2 gl-rounded-base"
data-testid="links-child"
>
<div class="item-contents gl-display-flex gl-flex-grow-1 gl-flex-wrap gl-min-w-0">
diff --git a/app/assets/javascripts/work_items/components/work_item_links/work_item_links.vue b/app/assets/javascripts/work_items/components/work_item_links/work_item_links.vue
index b9fc92304c0..bfc6ceefccc 100644
--- a/app/assets/javascripts/work_items/components/work_item_links/work_item_links.vue
+++ b/app/assets/javascripts/work_items/components/work_item_links/work_item_links.vue
@@ -113,7 +113,7 @@ export default {
return this.parentIssue?.milestone;
},
children() {
- return this.workItem ? findHierarchyWidgetChildren(this.workItem) : [];
+ return findHierarchyWidgetChildren(this.workItem);
},
canUpdate() {
return this.workItem?.userPermissions.updateWorkItem || false;
@@ -205,10 +205,7 @@ export default {
>
<template #header>{{ $options.i18n.title }}</template>
<template #header-suffix>
- <span
- class="gl-display-inline-flex gl-align-items-center gl-line-height-24 gl-ml-3 gl-font-weight-bold gl-text-gray-500"
- data-testid="children-count"
- >
+ <span class="gl-new-card-count" data-testid="children-count">
<gl-icon :name="$options.WIDGET_TYPE_TASK_ICON" class="gl-mr-2" />
{{ childrenCountLabel }}
</span>
@@ -236,52 +233,53 @@ export default {
</gl-dropdown>
</template>
<template #body>
- <gl-loading-icon v-if="isLoading" color="dark" class="gl-my-2" />
-
- <template v-else>
- <div v-if="isChildrenEmpty && !isShownAddForm && !error" data-testid="links-empty">
- <p class="gl-px-3 gl-py-2 gl-mb-0 gl-text-gray-500">
- {{ $options.i18n.emptyStateMessage }}
- </p>
- </div>
- <work-item-links-form
- v-if="isShownAddForm"
- ref="wiLinksForm"
- data-testid="add-links-form"
- :issuable-gid="issuableGid"
- :work-item-iid="iid"
- :children-ids="childrenIds"
- :parent-confidential="confidential"
- :parent-iteration="issuableIteration"
- :parent-milestone="issuableMilestone"
- :form-type="formType"
- :parent-work-item-type="workItem.workItemType.name"
- @cancel="hideAddForm"
- />
- <work-item-children-wrapper
- :children="children"
- :can-update="canUpdate"
- :work-item-id="issuableGid"
- :work-item-iid="iid"
- @error="error = $event"
- @show-modal="openChild"
- />
- <work-item-detail-modal
- ref="modal"
- :work-item-id="activeChild.id"
- :work-item-iid="activeChild.iid"
- @close="closeModal"
- @workItemDeleted="handleWorkItemDeleted(activeChild)"
- @openReportAbuse="openReportAbuseDrawer"
- />
- <abuse-category-selector
- v-if="isReportDrawerOpen && reportAbusePath"
- :reported-user-id="reportedUserId"
- :reported-from-url="reportedUrl"
- :show-drawer="isReportDrawerOpen"
- @close-drawer="toggleReportAbuseDrawer(false)"
- />
- </template>
+ <div class="gl-new-card-content">
+ <gl-loading-icon v-if="isLoading" color="dark" class="gl-my-2" />
+ <template v-else>
+ <div v-if="isChildrenEmpty && !isShownAddForm && !error" data-testid="links-empty">
+ <p class="gl-new-card-empty">
+ {{ $options.i18n.emptyStateMessage }}
+ </p>
+ </div>
+ <work-item-links-form
+ v-if="isShownAddForm"
+ ref="wiLinksForm"
+ data-testid="add-links-form"
+ :issuable-gid="issuableGid"
+ :work-item-iid="iid"
+ :children-ids="childrenIds"
+ :parent-confidential="confidential"
+ :parent-iteration="issuableIteration"
+ :parent-milestone="issuableMilestone"
+ :form-type="formType"
+ :parent-work-item-type="workItem.workItemType.name"
+ @cancel="hideAddForm"
+ />
+ <work-item-children-wrapper
+ :children="children"
+ :can-update="canUpdate"
+ :work-item-id="issuableGid"
+ :work-item-iid="iid"
+ @error="error = $event"
+ @show-modal="openChild"
+ />
+ <work-item-detail-modal
+ ref="modal"
+ :work-item-id="activeChild.id"
+ :work-item-iid="activeChild.iid"
+ @close="closeModal"
+ @workItemDeleted="handleWorkItemDeleted(activeChild)"
+ @openReportAbuse="openReportAbuseDrawer"
+ />
+ <abuse-category-selector
+ v-if="isReportDrawerOpen && reportAbusePath"
+ :reported-user-id="reportedUserId"
+ :reported-from-url="reportedUrl"
+ :show-drawer="isReportDrawerOpen"
+ @close-drawer="toggleReportAbuseDrawer(false)"
+ />
+ </template>
+ </div>
</template>
</widget-wrapper>
</template>
diff --git a/app/assets/javascripts/work_items/components/work_item_links/work_item_links_form.vue b/app/assets/javascripts/work_items/components/work_item_links/work_item_links_form.vue
index 289a48b5eaf..db649913602 100644
--- a/app/assets/javascripts/work_items/components/work_item_links/work_item_links_form.vue
+++ b/app/assets/javascripts/work_items/components/work_item_links/work_item_links_form.vue
@@ -347,7 +347,8 @@ export default {
<template>
<gl-form
- class="gl-bg-white gl-mt-1 gl-mb-3 gl-p-4 gl-border gl-border-gray-100 gl-rounded-base"
+ class="gl-new-card-add-form"
+ data-testid="add-item-form"
@submit.prevent="addOrCreateMethod"
>
<gl-alert v-if="error" variant="danger" class="gl-mb-3" @dismiss="unsetError">
diff --git a/app/assets/javascripts/work_items/components/work_item_links/work_item_tree.vue b/app/assets/javascripts/work_items/components/work_item_links/work_item_tree.vue
index 44e8dac79c4..83f3c391769 100644
--- a/app/assets/javascripts/work_items/components/work_item_links/work_item_tree.vue
+++ b/app/assets/javascripts/work_items/components/work_item_links/work_item_tree.vue
@@ -127,9 +127,11 @@ export default {
</template>
<template #body>
<div v-if="!isShownAddForm && children.length === 0" data-testid="tree-empty">
- <p class="gl-mb-0 gl-py-2 gl-ml-3 gl-text-gray-500">
- {{ $options.WORK_ITEMS_TREE_TEXT_MAP[workItemType].empty }}
- </p>
+ <div class="gl-new-card-content">
+ <p class="gl-new-card-empty">
+ {{ $options.WORK_ITEMS_TREE_TEXT_MAP[workItemType].empty }}
+ </p>
+ </div>
</div>
<work-item-links-form
v-if="isShownAddForm"
diff --git a/app/assets/javascripts/work_items/components/work_item_milestone.vue b/app/assets/javascripts/work_items/components/work_item_milestone.vue
index 693397686d0..6cc61ed4756 100644
--- a/app/assets/javascripts/work_items/components/work_item_milestone.vue
+++ b/app/assets/javascripts/work_items/components/work_item_milestone.vue
@@ -208,13 +208,13 @@ export default {
class="work-item-dropdown gl-flex-nowrap"
:label="$options.i18n.MILESTONE"
label-for="milestone-value"
- label-class="gl-pb-0! gl-mt-3 gl-overflow-wrap-break"
+ label-class="gl-pb-0! gl-mt-3 gl-overflow-wrap-break work-item-field-label"
label-cols="3"
label-cols-lg="2"
>
<span
v-if="!canUpdate"
- class="gl-text-secondary gl-ml-4 gl-mt-3 gl-display-inline-block gl-line-height-normal"
+ class="gl-text-secondary gl-ml-4 gl-mt-3 gl-display-inline-block gl-line-height-normal work-item-field-value"
data-testid="disabled-text"
>
{{ dropdownText }}
@@ -223,7 +223,7 @@ export default {
v-else
id="milestone-value"
data-testid="work-item-milestone-dropdown"
- class="gl-pl-0 gl-max-w-full"
+ class="gl-pl-0 gl-max-w-full work-item-field-value"
:toggle-class="dropdownClasses"
:text="dropdownText"
:loading="updateInProgress"
diff --git a/app/assets/javascripts/work_items/components/work_item_todos.vue b/app/assets/javascripts/work_items/components/work_item_todos.vue
index 4e787720a42..b21abf21be5 100644
--- a/app/assets/javascripts/work_items/components/work_item_todos.vue
+++ b/app/assets/javascripts/work_items/components/work_item_todos.vue
@@ -1,10 +1,20 @@
<script>
import { GlButton, GlTooltipDirective, GlIcon } from '@gitlab/ui';
+import { produce } from 'immer';
+
import { s__ } from '~/locale';
import { updateGlobalTodoCount } from '~/sidebar/utils';
-import { getWorkItemTodoOptimisticResponse } from '../utils';
-import { ADD, MARK_AS_DONE, TODO_ADD_ICON, TODO_DONE_ICON } from '../constants';
-import updateWorkItemMutation from '../graphql/update_work_item.mutation.graphql';
+import workItemByIidQuery from '~/work_items/graphql/work_item_by_iid.query.graphql';
+import createWorkItemTodosMutation from '~/work_items/graphql/create_work_item_todos.mutation.graphql';
+import markDoneWorkItemTodosMutation from '~/work_items/graphql/mark_done_work_item_todos.mutation.graphql';
+
+import {
+ TODO_ADD_ICON,
+ TODO_DONE_ICON,
+ TODO_PENDING_STATE,
+ TODO_DONE_STATE,
+ WIDGET_TYPE_CURRENT_USER_TODOS,
+} from '../constants';
export default {
i18n: {
@@ -19,8 +29,16 @@ export default {
GlButton,
},
props: {
- workItem: {
- type: Object,
+ workItemId: {
+ type: String,
+ required: true,
+ },
+ workItemIid: {
+ type: String,
+ required: true,
+ },
+ workItemFullpath: {
+ type: String,
required: true,
},
currentUserTodos: {
@@ -39,8 +57,11 @@ export default {
};
},
computed: {
+ todoId() {
+ return this.currentUserTodos[0]?.id || '';
+ },
pendingTodo() {
- return this.currentUserTodos.length > 0;
+ return this.todoId !== '';
},
buttonIcon() {
return this.pendingTodo ? TODO_DONE_ICON : TODO_ADD_ICON;
@@ -50,28 +71,60 @@ export default {
onToggle() {
this.isLoading = true;
this.buttonLabel = '';
- const action = this.pendingTodo ? MARK_AS_DONE : ADD;
- const inputVariables = {
- id: this.workItem.id,
- currentUserTodosWidget: {
- action,
- },
+ let mutation = createWorkItemTodosMutation;
+ let inputVariables = {
+ targetId: this.workItemId,
};
+ if (this.pendingTodo) {
+ mutation = markDoneWorkItemTodosMutation;
+ inputVariables = {
+ id: this.todoId,
+ };
+ }
+
this.$apollo
.mutate({
- mutation: updateWorkItemMutation,
+ mutation,
variables: {
input: inputVariables,
},
- optimisticResponse: getWorkItemTodoOptimisticResponse({
- workItem: this.workItem,
- pendingTodo: this.pendingTodo,
- }),
+ optimisticResponse: {
+ todoMutation: {
+ todo: {
+ id: this.todoId,
+ state: this.pendingTodo ? TODO_DONE_STATE : TODO_PENDING_STATE,
+ },
+ errors: [],
+ },
+ },
+ update: (
+ cache,
+ {
+ data: {
+ todoMutation: { todo = {} },
+ },
+ },
+ ) => {
+ const todos = [];
+
+ if (todo.state === TODO_PENDING_STATE) {
+ todos.push({
+ // eslint-disable-next-line @gitlab/require-i18n-strings
+ __typename: 'Todo',
+ id: todo.id,
+ });
+ }
+
+ this.updateWorkItemCurrentTodosWidgetCache({
+ cache,
+ todos,
+ });
+ },
})
.then(
({
data: {
- workItemUpdate: { errors },
+ todoMutation: { errors },
},
}) => {
if (errors?.length) {
@@ -93,6 +146,26 @@ export default {
this.isLoading = false;
});
},
+ updateWorkItemCurrentTodosWidgetCache({ cache, todos }) {
+ const query = {
+ query: workItemByIidQuery,
+ variables: { fullPath: this.workItemFullpath, iid: this.workItemIid },
+ };
+
+ const sourceData = cache.readQuery(query);
+
+ const newData = produce(sourceData, (draftState) => {
+ const { widgets } = draftState.workspace.workItems.nodes[0];
+
+ const widgetCurrentUserTodos = widgets.find(
+ (widget) => widget.type === WIDGET_TYPE_CURRENT_USER_TODOS,
+ );
+
+ widgetCurrentUserTodos.currentUserTodos.nodes = todos;
+ });
+
+ cache.writeQuery({ ...query, data: newData });
+ },
},
};
</script>
diff --git a/app/assets/javascripts/work_items/constants.js b/app/assets/javascripts/work_items/constants.js
index f3beaebf403..b8324d7d552 100644
--- a/app/assets/javascripts/work_items/constants.js
+++ b/app/assets/javascripts/work_items/constants.js
@@ -79,6 +79,10 @@ export const I18N_WORK_ITEM_FETCH_ITERATIONS_ERROR = s__(
'WorkItem|Something went wrong when fetching iterations. Please try again.',
);
+export const I18N_WORK_ITEM_FETCH_AWARD_EMOJI_ERROR = s__(
+ 'WorkItem|Something went wrong while fetching work item award emojis. Please try again.',
+);
+
export const I18N_WORK_ITEM_CREATE_BUTTON_LABEL = s__('WorkItem|Create %{workItemType}');
export const I18N_WORK_ITEM_ADD_BUTTON_LABEL = s__('WorkItem|Add %{workItemType}');
export const I18N_WORK_ITEM_ADD_MULTIPLE_BUTTON_LABEL = s__('WorkItem|Add %{workItemType}s');
@@ -192,6 +196,7 @@ export const FORM_TYPES = {
export const DEFAULT_PAGE_SIZE_ASSIGNEES = 10;
export const DEFAULT_PAGE_SIZE_NOTES = 30;
+export const DEFAULT_PAGE_SIZE_EMOJIS = 100;
export const WORK_ITEM_NOTES_SORT_ORDER_KEY = 'sort_direction_work_item';
@@ -231,16 +236,12 @@ export const TEST_ID_PROMOTE_ACTION = 'promote-action';
export const TEST_ID_COPY_REFERENCE_ACTION = 'copy-reference-action';
export const TEST_ID_COPY_CREATE_NOTE_EMAIL_ACTION = 'copy-create-note-email-action';
-export const ADD = 'ADD';
-export const MARK_AS_DONE = 'MARK_AS_DONE';
export const TODO_ADD_ICON = 'todo-add';
export const TODO_DONE_ICON = 'todo-done';
-export const TODO_TYPENAME = 'Todo';
-export const TODO_EDGE_TYPENAME = 'TodoEdge';
-export const TODO_CONNECTION_TYPENAME = 'TodoConnection';
+export const TODO_DONE_STATE = 'done';
+export const TODO_PENDING_STATE = 'pending';
+
export const CURRENT_USER_TODOS_TYPENAME = 'WorkItemWidgetCurrentUserTodos';
-export const WORK_ITEM_TYPENAME = 'WorkItem';
-export const WORK_ITEM_UPDATE_PAYLOAD_TYPENAME = 'WorkItemUpdatePayload';
export const EMOJI_ACTION_ADD = 'ADD';
export const EMOJI_ACTION_REMOVE = 'REMOVE';
diff --git a/app/assets/javascripts/work_items/graphql/award_emoji.query.graphql b/app/assets/javascripts/work_items/graphql/award_emoji.query.graphql
new file mode 100644
index 00000000000..82a532e1bea
--- /dev/null
+++ b/app/assets/javascripts/work_items/graphql/award_emoji.query.graphql
@@ -0,0 +1,27 @@
+#import "~/graphql_shared/fragments/page_info.fragment.graphql"
+#import "~/work_items/graphql/award_emoji.fragment.graphql"
+
+query workItemAwardEmojis($fullPath: ID!, $iid: String, $after: String, $pageSize: Int) {
+ workspace: project(fullPath: $fullPath) {
+ id
+ workItems(iid: $iid) {
+ nodes {
+ id
+ iid
+ widgets {
+ ... on WorkItemWidgetAwardEmoji {
+ type
+ awardEmoji(first: $pageSize, after: $after) {
+ pageInfo {
+ ...PageInfo
+ }
+ nodes {
+ ...AwardEmojiFragment
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/work_items/graphql/cache_utils.js b/app/assets/javascripts/work_items/graphql/cache_utils.js
index 03b45a45c39..14eedf5cdd8 100644
--- a/app/assets/javascripts/work_items/graphql/cache_utils.js
+++ b/app/assets/javascripts/work_items/graphql/cache_utils.js
@@ -87,6 +87,46 @@ export const updateCacheAfterDeletingNote = (currentNotes, subscriptionData) =>
});
};
+function updateNoteAwardEmojiCache(currentNotes, note, callback) {
+ if (!note.awardEmoji) {
+ return currentNotes;
+ }
+ const { awardEmoji } = note;
+
+ return produce(currentNotes, (draftData) => {
+ const notesWidget = getNotesWidgetFromSourceData(draftData);
+
+ if (!notesWidget.discussions) {
+ return;
+ }
+
+ notesWidget.discussions.nodes.forEach((discussion) => {
+ discussion.notes.nodes.forEach((n) => {
+ if (n.id === note.id) {
+ callback(n, awardEmoji);
+ }
+ });
+ });
+
+ updateNotesWidgetDataInDraftData(draftData, notesWidget);
+ });
+}
+
+export const updateCacheAfterAddingAwardEmojiToNote = (currentNotes, note) => {
+ return updateNoteAwardEmojiCache(currentNotes, note, (n, awardEmoji) => {
+ n.awardEmoji.nodes.push(awardEmoji);
+ });
+};
+
+export const updateCacheAfterRemovingAwardEmojiFromNote = (currentNotes, note) => {
+ return updateNoteAwardEmojiCache(currentNotes, note, (n, awardEmoji) => {
+ // eslint-disable-next-line no-param-reassign
+ n.awardEmoji.nodes = n.awardEmoji.nodes.filter((emoji) => {
+ return emoji.name !== awardEmoji.name || emoji.user.id !== awardEmoji.user.id;
+ });
+ });
+};
+
export const addHierarchyChild = (cache, fullPath, iid, workItem) => {
const queryArgs = { query: workItemByIidQuery, variables: { fullPath, iid } };
const sourceData = cache.readQuery(queryArgs);
diff --git a/app/assets/javascripts/work_items/graphql/create_work_item_todos.mutation.graphql b/app/assets/javascripts/work_items/graphql/create_work_item_todos.mutation.graphql
new file mode 100644
index 00000000000..1eb08f8bf6f
--- /dev/null
+++ b/app/assets/javascripts/work_items/graphql/create_work_item_todos.mutation.graphql
@@ -0,0 +1,9 @@
+mutation workItemTodoCreate($input: TodoCreateInput!) {
+ todoMutation: todoCreate(input: $input) {
+ todo {
+ id
+ state
+ }
+ errors
+ }
+}
diff --git a/app/assets/javascripts/work_items/graphql/mark_done_work_item_todos.mutation.graphql b/app/assets/javascripts/work_items/graphql/mark_done_work_item_todos.mutation.graphql
new file mode 100644
index 00000000000..2bfeaf93ae8
--- /dev/null
+++ b/app/assets/javascripts/work_items/graphql/mark_done_work_item_todos.mutation.graphql
@@ -0,0 +1,9 @@
+mutation workItemTodoMarkDone($input: TodoMarkDoneInput!) {
+ todoMutation: todoMarkDone(input: $input) {
+ todo {
+ id
+ state
+ }
+ errors
+ }
+}
diff --git a/app/assets/javascripts/work_items/graphql/notes/work_item_note.fragment.graphql b/app/assets/javascripts/work_items/graphql/notes/work_item_note.fragment.graphql
index c8b7d379074..6543e1a52f9 100644
--- a/app/assets/javascripts/work_items/graphql/notes/work_item_note.fragment.graphql
+++ b/app/assets/javascripts/work_items/graphql/notes/work_item_note.fragment.graphql
@@ -1,4 +1,5 @@
#import "~/graphql_shared/fragments/user.fragment.graphql"
+#import "~/work_items/graphql/award_emoji.fragment.graphql"
fragment WorkItemNote on Note {
id
@@ -22,6 +23,11 @@ fragment WorkItemNote on Note {
author {
...User
}
+ awardEmoji {
+ nodes {
+ ...AwardEmojiFragment
+ }
+ }
userPermissions {
adminNote
awardEmoji
diff --git a/app/assets/javascripts/work_items/graphql/notes/work_item_note_add_award_emoji.mutation.graphql b/app/assets/javascripts/work_items/graphql/notes/work_item_note_add_award_emoji.mutation.graphql
index dc51c53428b..bc228c0dd3d 100644
--- a/app/assets/javascripts/work_items/graphql/notes/work_item_note_add_award_emoji.mutation.graphql
+++ b/app/assets/javascripts/work_items/graphql/notes/work_item_note_add_award_emoji.mutation.graphql
@@ -1,17 +1,5 @@
-#import "~/graphql_shared/fragments/user.fragment.graphql"
-
mutation workItemNoteAddAwardEmoji($awardableId: AwardableID!, $name: String!) {
awardEmojiAdd(input: { awardableId: $awardableId, name: $name }) {
- awardEmoji {
- name
- description
- unicode
- emoji
- unicodeVersion
- user {
- ...User
- }
- }
errors
}
}
diff --git a/app/assets/javascripts/work_items/graphql/notes/work_item_note_remove_award_emoji.mutation.graphql b/app/assets/javascripts/work_items/graphql/notes/work_item_note_remove_award_emoji.mutation.graphql
new file mode 100644
index 00000000000..22942fbb823
--- /dev/null
+++ b/app/assets/javascripts/work_items/graphql/notes/work_item_note_remove_award_emoji.mutation.graphql
@@ -0,0 +1,5 @@
+mutation workItemNoteRemoveAwardEmoji($awardableId: AwardableID!, $name: String!) {
+ awardEmojiRemove(input: { awardableId: $awardableId, name: $name }) {
+ errors
+ }
+}
diff --git a/app/assets/javascripts/work_items/graphql/work_item_assignees.subscription.graphql b/app/assets/javascripts/work_items/graphql/work_item_assignees.subscription.graphql
deleted file mode 100644
index d5b2de8c4c6..00000000000
--- a/app/assets/javascripts/work_items/graphql/work_item_assignees.subscription.graphql
+++ /dev/null
@@ -1,21 +0,0 @@
-#import "~/graphql_shared/fragments/user.fragment.graphql"
-
-subscription issuableAssignees($issuableId: IssuableID!) {
- issuableAssigneesUpdated(issuableId: $issuableId) {
- ... on WorkItem {
- id
- widgets {
- ... on WorkItemWidgetAssignees {
- type
- allowsMultipleAssignees
- canInviteMembers
- assignees {
- nodes {
- ...User
- }
- }
- }
- }
- }
- }
-}
diff --git a/app/assets/javascripts/work_items/graphql/work_item_description.subscription.graphql b/app/assets/javascripts/work_items/graphql/work_item_description.subscription.graphql
deleted file mode 100644
index 4eb3d8067d9..00000000000
--- a/app/assets/javascripts/work_items/graphql/work_item_description.subscription.graphql
+++ /dev/null
@@ -1,20 +0,0 @@
-subscription issuableDescription($issuableId: IssuableID!) {
- issuableDescriptionUpdated(issuableId: $issuableId) {
- ... on WorkItem {
- id
- widgets {
- ... on WorkItemWidgetDescription {
- type
- description
- descriptionHtml
- lastEditedAt
- lastEditedBy {
- id
- name
- webPath
- }
- }
- }
- }
- }
-}
diff --git a/app/assets/javascripts/work_items/graphql/work_item_labels.subscription.graphql b/app/assets/javascripts/work_items/graphql/work_item_labels.subscription.graphql
deleted file mode 100644
index 86d936bf4dd..00000000000
--- a/app/assets/javascripts/work_items/graphql/work_item_labels.subscription.graphql
+++ /dev/null
@@ -1,19 +0,0 @@
-#import "~/graphql_shared/fragments/label.fragment.graphql"
-
-subscription workItemLabels($issuableId: IssuableID!) {
- issuableLabelsUpdated(issuableId: $issuableId) {
- ... on WorkItem {
- id
- widgets {
- ... on WorkItemWidgetLabels {
- type
- labels {
- nodes {
- ...Label
- }
- }
- }
- }
- }
- }
-}
diff --git a/app/assets/javascripts/work_items/graphql/work_item_metadata_widgets.fragment.graphql b/app/assets/javascripts/work_items/graphql/work_item_metadata_widgets.fragment.graphql
index 42c057fb8fe..f303a797e9c 100644
--- a/app/assets/javascripts/work_items/graphql/work_item_metadata_widgets.fragment.graphql
+++ b/app/assets/javascripts/work_items/graphql/work_item_metadata_widgets.fragment.graphql
@@ -1,7 +1,6 @@
#import "~/graphql_shared/fragments/label.fragment.graphql"
#import "~/graphql_shared/fragments/user.fragment.graphql"
#import "~/work_items/graphql/milestone.fragment.graphql"
-#import "~/work_items/graphql/award_emoji.fragment.graphql"
fragment WorkItemMetadataWidgets on WorkItemWidget {
... on WorkItemWidgetDescription {
@@ -45,20 +44,12 @@ fragment WorkItemMetadataWidgets on WorkItemWidget {
... on WorkItemWidgetCurrentUserTodos {
type
currentUserTodos(state: pending) {
- edges {
- node {
- id
- state
- }
+ nodes {
+ id
}
}
}
... on WorkItemWidgetAwardEmoji {
type
- awardEmoji {
- nodes {
- ...AwardEmojiFragment
- }
- }
}
}
diff --git a/app/assets/javascripts/work_items/graphql/work_item_milestone.subscription.graphql b/app/assets/javascripts/work_items/graphql/work_item_milestone.subscription.graphql
deleted file mode 100644
index f5163003fe5..00000000000
--- a/app/assets/javascripts/work_items/graphql/work_item_milestone.subscription.graphql
+++ /dev/null
@@ -1,17 +0,0 @@
-#import "~/work_items/graphql/milestone.fragment.graphql"
-
-subscription issuableMilestone($issuableId: IssuableID!) {
- issuableMilestoneUpdated(issuableId: $issuableId) {
- ... on WorkItem {
- id
- widgets {
- ... on WorkItemWidgetMilestone {
- type
- milestone {
- ...MilestoneFragment
- }
- }
- }
- }
- }
-}
diff --git a/app/assets/javascripts/work_items/graphql/work_item_title.subscription.graphql b/app/assets/javascripts/work_items/graphql/work_item_title.subscription.graphql
deleted file mode 100644
index 2ac01b79d6f..00000000000
--- a/app/assets/javascripts/work_items/graphql/work_item_title.subscription.graphql
+++ /dev/null
@@ -1,8 +0,0 @@
-subscription issuableTitleUpdated($issuableId: IssuableID!) {
- issuableTitleUpdated(issuableId: $issuableId) {
- ... on WorkItem {
- id
- title
- }
- }
-}
diff --git a/app/assets/javascripts/work_items/graphql/work_item_updated.subscription.graphql b/app/assets/javascripts/work_items/graphql/work_item_updated.subscription.graphql
new file mode 100644
index 00000000000..8b63f46ab28
--- /dev/null
+++ b/app/assets/javascripts/work_items/graphql/work_item_updated.subscription.graphql
@@ -0,0 +1,7 @@
+#import "./work_item.fragment.graphql"
+
+subscription workItemUpdated($id: WorkItemID!) {
+ workItemUpdated(workItemId: $id) {
+ ...WorkItem
+ }
+}
diff --git a/app/assets/javascripts/work_items/graphql/work_item_widgets.fragment.graphql b/app/assets/javascripts/work_items/graphql/work_item_widgets.fragment.graphql
index bf8dc9ce9b0..383d003e78c 100644
--- a/app/assets/javascripts/work_items/graphql/work_item_widgets.fragment.graphql
+++ b/app/assets/javascripts/work_items/graphql/work_item_widgets.fragment.graphql
@@ -1,7 +1,6 @@
#import "~/graphql_shared/fragments/label.fragment.graphql"
#import "~/graphql_shared/fragments/user.fragment.graphql"
#import "~/work_items/graphql/milestone.fragment.graphql"
-#import "~/work_items/graphql/award_emoji.fragment.graphql"
#import "ee_else_ce/work_items/graphql/work_item_metadata_widgets.fragment.graphql"
fragment WorkItemWidgets on WorkItemWidget {
@@ -93,20 +92,12 @@ fragment WorkItemWidgets on WorkItemWidget {
... on WorkItemWidgetCurrentUserTodos {
type
currentUserTodos(state: pending) {
- edges {
- node {
- id
- state
- }
+ nodes {
+ id
}
}
}
... on WorkItemWidgetAwardEmoji {
type
- awardEmoji {
- nodes {
- ...AwardEmojiFragment
- }
- }
}
}
diff --git a/app/assets/javascripts/work_items/notes/award_utils.js b/app/assets/javascripts/work_items/notes/award_utils.js
new file mode 100644
index 00000000000..5351a22d593
--- /dev/null
+++ b/app/assets/javascripts/work_items/notes/award_utils.js
@@ -0,0 +1,67 @@
+import { __ } from '~/locale';
+import { TYPENAME_USER } from '~/graphql_shared/constants';
+import { convertToGraphQLId, getIdFromGraphQLId } from '~/graphql_shared/utils';
+import {
+ updateCacheAfterAddingAwardEmojiToNote,
+ updateCacheAfterRemovingAwardEmojiFromNote,
+} from '~/work_items/graphql/cache_utils';
+import workItemNotesByIidQuery from '../graphql/notes/work_item_notes_by_iid.query.graphql';
+import addAwardEmojiMutation from '../graphql/notes/work_item_note_add_award_emoji.mutation.graphql';
+import removeAwardEmojiMutation from '../graphql/notes/work_item_note_remove_award_emoji.mutation.graphql';
+
+function awardedByCurrentUser(note) {
+ return (note.awardEmoji?.nodes ?? [])
+ .filter((award) => {
+ return getIdFromGraphQLId(award.user.id) === window.gon.current_user_id;
+ })
+ .map((award) => award.name);
+}
+
+export function getMutation({ note, name }) {
+ if (awardedByCurrentUser(note).includes(name)) {
+ return {
+ mutation: removeAwardEmojiMutation,
+ mutationName: 'awardEmojiRemove',
+ errorMessage: __('Failed to remove emoji. Please try again'),
+ };
+ }
+ return {
+ mutation: addAwardEmojiMutation,
+ mutationName: 'awardEmojiAdd',
+ errorMessage: __('Failed to add emoji. Please try again'),
+ };
+}
+
+export function optimisticAwardUpdate({ note, name, fullPath, workItemIid }) {
+ const { mutation } = getMutation({ note, name });
+
+ const currentUserId = window.gon.current_user_id;
+
+ return (store) => {
+ store.updateQuery(
+ {
+ query: workItemNotesByIidQuery,
+ variables: { fullPath, iid: workItemIid },
+ },
+ (sourceData) => {
+ const updatedNote = {
+ id: note.id,
+ awardEmoji: {
+ __typename: 'AwardEmoji',
+ name,
+ user: {
+ __typename: 'UserCore',
+ id: convertToGraphQLId(TYPENAME_USER, currentUserId),
+ name: null,
+ },
+ },
+ };
+
+ if (mutation === removeAwardEmojiMutation) {
+ return updateCacheAfterRemovingAwardEmojiFromNote(sourceData, updatedNote);
+ }
+ return updateCacheAfterAddingAwardEmojiToNote(sourceData, updatedNote);
+ },
+ );
+ };
+}
diff --git a/app/assets/javascripts/work_items/utils.js b/app/assets/javascripts/work_items/utils.js
index 13fc521464f..81dbe56b2ea 100644
--- a/app/assets/javascripts/work_items/utils.js
+++ b/app/assets/javascripts/work_items/utils.js
@@ -1,20 +1,10 @@
-import { uniqueId } from 'lodash';
-import {
- WIDGET_TYPE_HIERARCHY,
- WIDGET_TYPE_CURRENT_USER_TODOS,
- CURRENT_USER_TODOS_TYPENAME,
- TODO_CONNECTION_TYPENAME,
- TODO_EDGE_TYPENAME,
- TODO_TYPENAME,
- WORK_ITEM_TYPENAME,
- WORK_ITEM_UPDATE_PAYLOAD_TYPENAME,
-} from '~/work_items/constants';
+import { WIDGET_TYPE_HIERARCHY } from '~/work_items/constants';
export const findHierarchyWidgets = (widgets) =>
widgets?.find((widget) => widget.type === WIDGET_TYPE_HIERARCHY);
export const findHierarchyWidgetChildren = (workItem) =>
- findHierarchyWidgets(workItem?.widgets)?.children.nodes;
+ findHierarchyWidgets(workItem?.widgets)?.children?.nodes || [];
const autocompleteSourcesPath = (autocompleteType, fullPath, workItemIid) => {
return `${
@@ -32,38 +22,3 @@ export const markdownPreviewPath = (fullPath, iid) =>
`${
gon.relative_url_root || ''
}/${fullPath}/preview_markdown?target_type=WorkItem&target_id=${iid}`;
-
-export const getWorkItemTodoOptimisticResponse = ({ workItem, pendingTodo }) => {
- const todo = pendingTodo
- ? [
- {
- node: {
- id: -uniqueId(),
- state: 'pending',
- __typename: TODO_TYPENAME,
- },
- __typename: TODO_EDGE_TYPENAME,
- },
- ]
- : [];
- return {
- workItemUpdate: {
- errors: [],
- workItem: {
- ...workItem,
- widgets: [
- {
- type: WIDGET_TYPE_CURRENT_USER_TODOS,
- currentUserTodos: {
- edges: todo,
- __typename: TODO_CONNECTION_TYPENAME,
- },
- __typename: CURRENT_USER_TODOS_TYPENAME,
- },
- ],
- __typename: WORK_ITEM_TYPENAME,
- },
- __typename: WORK_ITEM_UPDATE_PAYLOAD_TYPENAME,
- },
- };
-};
diff --git a/app/assets/stylesheets/components/avatar.scss b/app/assets/stylesheets/components/avatar.scss
index 6a6febbf7b4..23a7beb527b 100644
--- a/app/assets/stylesheets/components/avatar.scss
+++ b/app/assets/stylesheets/components/avatar.scss
@@ -189,3 +189,24 @@ $avatar-sizes: (
.avatar-counter {
@include avatar-counter();
}
+
+.user-popover {
+ // GlAvatarLabeled doesn't expose any prop to override internal classes
+
+ // Max width of popover container is set by gl-max-w-48
+ // so we need to ensure that name/username/status container doesn't overflow
+ .gl-avatar-labeled-labels {
+ max-width: px-to-rem(290px);
+ }
+
+ .gl-avatar-labeled-label,
+ .gl-avatar-labeled-sublabel {
+ @include gl-text-truncate;
+ }
+
+ &.user-popover-cannot-merge {
+ .popover-header {
+ @include gl-bg-orange-50;
+ }
+ }
+}
diff --git a/app/assets/stylesheets/components/content_editor.scss b/app/assets/stylesheets/components/content_editor.scss
index 2ed955a56b6..08a956bf90f 100644
--- a/app/assets/stylesheets/components/content_editor.scss
+++ b/app/assets/stylesheets/components/content_editor.scss
@@ -1,18 +1,38 @@
.ProseMirror {
+ width: calc(100% - 4px);
padding-top: $gl-spacing-scale-4;
+ padding-left: calc(#{$gl-spacing-scale-5} - 2px);
+ padding-right: $gl-spacing-scale-5;
+ margin: 2px;
min-height: 140px;
max-height: 55vh;
+ position: static;
overflow-y: auto;
+ transition: box-shadow ease-in-out 0.15s;
+
+ .gl-dark & {
+ width: calc(100% - 6px);
+ margin: 2px 3px;
+ padding-left: calc(#{$gl-spacing-scale-5} - 3px);
+ }
::selection {
background-color: transparent;
}
+ &:focus {
+ @include gl-focus;
+ }
+
&:not(.ProseMirror-hideselection) .content-editor-selection,
a.ProseMirror-selectednode,
span.ProseMirror-selectednode {
background-color: $blue-100;
- box-shadow: 0 2px 0 $blue-100, 0 -2px 0 $blue-100;
+ box-shadow: 0 2px 0 $blue-100, 0 -2px 0 $blue-100;
+ }
+
+ pre > code {
+ background-color: transparent;
}
td,
@@ -44,6 +64,48 @@
pointer-events: none;
}
+ .image-resize-container {
+ position: relative;
+ }
+
+ .image-resize {
+ display: inline-block;
+ position: absolute;
+ width: 8px;
+ height: 8px;
+ background: $blue-200;
+ outline: 1px solid $white;
+ }
+
+ .image-resize-nw {
+ top: -4px;
+ left: -4px;
+ cursor: nw-resize;
+ }
+
+ .image-resize-ne {
+ top: -4px;
+ right: -4px;
+ cursor: ne-resize;
+ }
+
+ .image-resize-sw {
+ bottom: 4px;
+ left: -4px;
+ cursor: sw-resize;
+ }
+
+ .image-resize-se {
+ bottom: 4px;
+ right: -4px;
+ cursor: se-resize;
+ }
+
+ img.ProseMirror-selectednode {
+ outline: 2px solid $blue-200;
+ outline-offset: -2px;
+ }
+
video {
max-width: 400px;
}
@@ -78,6 +140,81 @@
}
}
+ .suggestion-added,
+ .suggestion-deleted,
+ .suggestion-added-input {
+ white-space: pre-wrap;
+
+ > code {
+ white-space: pre-wrap;
+ padding: 0;
+ display: flex;
+ }
+ }
+
+ .suggestion-added-input {
+ > code {
+ display: block;
+ margin-left: 120px;
+ background-color: transparent !important;
+ }
+ }
+
+ .suggestion-added,
+ .suggestion-deleted {
+ background-color: $line-added;
+ width: 100%;
+
+ > code {
+ border-left: 100px solid $line-number-new;
+ padding-left: 20px;
+ border-radius: 0;
+ background-color: inherit !important;
+ }
+
+ > code::before {
+ content: attr(data-line-number);
+ position: absolute;
+ width: 100px;
+ margin-left: -120px;
+ text-align: right;
+ padding-right: 10px;
+ padding-left: 10px;
+
+ @include gl-text-secondary;
+ }
+
+ > code::after {
+ content: '+';
+ position: absolute;
+ margin-left: -20px;
+ width: 20px;
+ text-align: center;
+
+ @include gl-text-secondary;
+ }
+ }
+
+ .suggestion-added > code {
+ color: rgba($white, 0);
+ }
+
+ .suggestion-deleted {
+ background-color: $line-removed;
+ cursor: not-allowed;
+
+ > code {
+ border-color: $line-number-old;
+ }
+
+ > code::before {
+ padding-right: 60px;
+ }
+
+ > code::after {
+ content: '-';
+ }
+ }
.dl-content {
width: 100%;
@@ -135,6 +272,31 @@
}
}
+.gl-dark .ProseMirror {
+ .suggestion-added-input,
+ .suggestion-deleted {
+ > code {
+ color: $gray-50;
+ }
+ }
+
+ .suggestion-deleted,
+ .suggestion-added {
+ > code::before,
+ > code::after {
+ color: $gray-400;
+ }
+ }
+}
+
+// Fixes a problem with the layout shifting
+// when switching between Markdown and the
+// Richtext editor due to a loosly defined
+// style in typography.scss
+.md > .ProseMirror {
+ margin: 2px;
+}
+
.table-creator-grid-item {
box-shadow: inset 0 0 0 $gl-spacing-scale-2 $white,
inset $gl-spacing-scale-1 $gl-spacing-scale-1 0 #{$gl-spacing-scale-2 * 3 / 4} $gray-100,
@@ -179,6 +341,17 @@
min-width: auto;
}
+.content-editor-suggestions-dropdown {
+ .gl-new-dropdown-panel {
+ width: max-content;
+ }
+
+ li.focused div.gl-new-dropdown-item-content {
+ @include gl-focus($inset: true);
+ @include gl-bg-gray-50;
+ }
+}
+
.bubble-menu-form {
min-width: 320px;
}
diff --git a/app/assets/stylesheets/fonts.scss b/app/assets/stylesheets/fonts.scss
index bc49d17fcbb..0d87d49ac18 100644
--- a/app/assets/stylesheets/fonts.scss
+++ b/app/assets/stylesheets/fonts.scss
@@ -9,15 +9,26 @@ Usage:
font-weight: 100 900;
font-display: optional;
font-style: normal;
- font-named-instance: 'Regular'; /* stylelint-disable property-no-unknown */
+ /* stylelint-disable-next-line property-no-unknown */
+ font-named-instance: 'Regular';
src: font-url('gitlab-sans/GitLabSans.woff2') format('woff2');
}
+@font-face {
+ font-family: 'GitLab Sans';
+ font-weight: 100 900;
+ font-display: optional;
+ font-style: italic;
+ /* stylelint-disable-next-line property-no-unknown */
+ font-named-instance: 'Regular';
+ src: font-url('gitlab-sans/GitLabSans-Italic.woff2') format('woff2');
+}
+
/* -------------------------------------------------------
Monospaced font: GitLab Mono.
Usage:
- html { font-family: 'GitLab Mono', sans-serif; }
+ html { font-family: 'GitLab Mono', monospace; }
*/
@font-face {
font-family: 'GitLab Mono';
@@ -35,45 +46,6 @@ Usage:
src: font-url('gitlab-mono/GitLabMono-Italic.woff2') format('woff2');
}
-/* -------------------------------------------------------
-Monospaced font: JetBrains Mono.
-
-All of the definitions below can be removed once
-`GitLab Mono` is properly rolled out.
-
-Usage:
- html { font-family: 'JetBrains Mono', sans-serif; }
-*/
-@font-face {
- font-family: 'JetBrains Mono';
- font-display: optional;
- font-style: normal;
- src: font-url('jetbrains-mono/JetBrainsMono.woff2') format('woff2');
-}
-
-@font-face {
- font-family: 'JetBrains Mono';
- font-display: optional;
- font-weight: bold;
- src: font-url('jetbrains-mono/JetBrainsMono-Bold.woff2') format('woff2');
-}
-
-@font-face {
- font-family: 'JetBrains Mono';
- font-display: optional;
- font-weight: normal;
- font-style: italic;
- src: font-url('jetbrains-mono/JetBrainsMono-Italic.woff2') format('woff2');
-}
-
-@font-face {
- font-family: 'JetBrains Mono';
- font-display: optional;
- font-weight: bold;
- font-style: italic;
- src: font-url('jetbrains-mono/JetBrainsMono-BoldItalic.woff2') format('woff2');
-}
-
// This isn't the best solution, but we needed a quick fix
// https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107592/
* {
diff --git a/app/assets/stylesheets/framework.scss b/app/assets/stylesheets/framework.scss
index e60353578b0..4d4144fe9dd 100644
--- a/app/assets/stylesheets/framework.scss
+++ b/app/assets/stylesheets/framework.scss
@@ -39,6 +39,7 @@
@import 'framework/contextual_sidebar_header';
@import 'framework/contextual_sidebar';
@import 'framework/super_sidebar';
+@import 'framework/brand_logo';
@import 'framework/tables';
@import 'framework/notes';
@import 'framework/tabs';
@@ -64,3 +65,4 @@
@import 'framework/card';
@import 'framework/source_editor';
@import 'framework/diffs';
+@import 'framework/new_card';
diff --git a/app/assets/stylesheets/framework/brand_logo.scss b/app/assets/stylesheets/framework/brand_logo.scss
new file mode 100644
index 00000000000..1bc1ef797a7
--- /dev/null
+++ b/app/assets/stylesheets/framework/brand_logo.scss
@@ -0,0 +1,29 @@
+$brand-logo-light-background: #e0dfe5;
+$brand-logo-dark-background: #53515b;
+
+.brand-logo {
+ display: inline-block;
+ @include gl-rounded-base;
+ @include gl-p-2;
+ @include gl-bg-transparent;
+ @include gl-border-none;
+
+ .tanuki-logo {
+ @include gl-vertical-align-middle;
+ }
+
+ &:focus,
+ &:active {
+ @include gl-focus;
+ }
+
+ &:hover,
+ &:focus,
+ &:active {
+ background-color: $brand-logo-light-background;
+
+ .gl-dark & {
+ background-color: $brand-logo-dark-background;
+ }
+ }
+}
diff --git a/app/assets/stylesheets/framework/common.scss b/app/assets/stylesheets/framework/common.scss
index 2ec7c891197..7b8d9281148 100644
--- a/app/assets/stylesheets/framework/common.scss
+++ b/app/assets/stylesheets/framework/common.scss
@@ -34,11 +34,7 @@
--mr-review-bar-height: #{$mr-review-bar-height};
}
-@include media-breakpoint-up(md) {
- .page-with-contextual-sidebar {
- --application-bar-left: #{$contextual-sidebar-collapsed-width};
- }
-
+@include media-breakpoint-up(sm) {
.right-sidebar-collapsed {
--application-bar-right: #{$right-sidebar-collapsed-width};
@@ -52,6 +48,12 @@
}
}
+@include media-breakpoint-up(md) {
+ .page-with-contextual-sidebar {
+ --application-bar-left: #{$contextual-sidebar-collapsed-width};
+ }
+}
+
@include media-breakpoint-up(xl) {
.page-with-contextual-sidebar {
--application-bar-left: #{$contextual-sidebar-width};
@@ -330,14 +332,6 @@ li.note {
height: 220px;
}
-.footer-links {
- margin-bottom: 20px;
-
- a {
- margin-right: 15px;
- }
-}
-
.card.card-body {
margin-bottom: $gl-padding;
@@ -555,3 +549,16 @@ li.note {
See https://gitlab.com/gitlab-org/gitlab/issues/36857 for more details.
**/
.gl-line-height-14 { line-height: $gl-line-height-14; }
+
+// TODO: To be removed once `split` option for new dropdowns is implemented.
+// See issue at https://gitlab.com/gitlab-org/gitlab-ui/-/issues/2263
+.gl-new-dropdown.split:nth-child(n+2) {
+ .gl-new-dropdown-toggle {
+ margin-left: 1px;
+
+ &.btn-tertiary,
+ &.disabled {
+ margin-left: -1px;
+ }
+ }
+}
diff --git a/app/assets/stylesheets/framework/diffs.scss b/app/assets/stylesheets/framework/diffs.scss
index 192cb82aaab..7b35659e90a 100644
--- a/app/assets/stylesheets/framework/diffs.scss
+++ b/app/assets/stylesheets/framework/diffs.scss
@@ -1,6 +1,6 @@
// Common
.diff-file {
- padding-bottom: $gl-padding;
+ margin-bottom: $gl-padding;
&.has-body {
.file-title {
@@ -864,19 +864,6 @@ table.code {
}
}
-// Remove border from collapsed replies widget only on diffs
-.diff-grid-comments {
- .replies-widget-collapsed {
- border-bottom: 0;
- }
- // Rounded border radius only on diff comments with no replies
- .discussion-collapsible {
- .discussion-reply-holder:first-of-type {
- border-radius: $gl-border-radius-base;
- }
- }
-}
-
.discussion-body .image .frame {
position: relative;
}
@@ -889,13 +876,6 @@ table.code {
}
}
-.parallel {
- .discussion-collapsible {
- margin: $gl-padding;
- margin-top: 0;
- }
-}
-
.image-diff-overlay,
.image-diff-overlay-add-comment {
top: 0;
diff --git a/app/assets/stylesheets/framework/emojis.scss b/app/assets/stylesheets/framework/emojis.scss
index 16ad6f62c64..358f599e0e9 100644
--- a/app/assets/stylesheets/framework/emojis.scss
+++ b/app/assets/stylesheets/framework/emojis.scss
@@ -3,8 +3,11 @@ gl-emoji {
display: inline-flex;
vertical-align: baseline;
font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
- font-size: 1.2em;
- line-height: 1;
+
+ img {
+ width: 1.2em;
+ height: 1.2em;
+ }
}
.user-status-emoji {
diff --git a/app/assets/stylesheets/framework/header.scss b/app/assets/stylesheets/framework/header.scss
index b2ba1d8830d..f5ed85e8845 100644
--- a/app/assets/stylesheets/framework/header.scss
+++ b/app/assets/stylesheets/framework/header.scss
@@ -8,7 +8,7 @@ $search-input-field-x-min-width: 200px;
min-height: $header-height;
border: 0;
position: fixed;
- top: $calc-application-bars-height;
+ top: $calc-system-headers-height;
left: 0;
right: 0;
border-radius: 0;
@@ -322,7 +322,7 @@ $search-input-field-x-min-width: 200px;
left: var(--application-bar-left);
position: fixed;
right: var(--application-bar-right);
- top: $calc-application-bars-height;
+ top: $calc-system-headers-height;
width: auto;
z-index: $top-bar-z-index;
diff --git a/app/assets/stylesheets/framework/layout.scss b/app/assets/stylesheets/framework/layout.scss
index 7dfbd5485d8..086a16edda2 100644
--- a/app/assets/stylesheets/framework/layout.scss
+++ b/app/assets/stylesheets/framework/layout.scss
@@ -36,7 +36,7 @@ body {
}
.layout-page {
- padding-top: calc(#{$header-height} + #{$calc-application-bars-height});
+ padding-top: $calc-application-bars-height;
padding-bottom: $calc-application-footer-height;
}
@@ -62,11 +62,6 @@ body {
}
}
-.navless-container {
- margin-top: $header-height;
- padding-top: $gl-padding * 2;
-}
-
.container-limited {
max-width: $fixed-layout-width;
diff --git a/app/assets/stylesheets/framework/markdown_area.scss b/app/assets/stylesheets/framework/markdown_area.scss
index 5fdab7891ec..f8f54567ef2 100644
--- a/app/assets/stylesheets/framework/markdown_area.scss
+++ b/app/assets/stylesheets/framework/markdown_area.scss
@@ -91,7 +91,7 @@
}
.md-preview-holder {
- min-height: 176px;
+ min-height: 173px;
padding: 10px 0;
overflow-x: auto;
}
@@ -106,6 +106,7 @@
box-shadow: none;
width: 100%;
resize: none !important;
+ transition: box-shadow $gl-transition-duration-medium ease;
}
.md-suggestion-diff {
diff --git a/app/assets/stylesheets/framework/new_card.scss b/app/assets/stylesheets/framework/new_card.scss
new file mode 100644
index 00000000000..ef8f5cc1d1b
--- /dev/null
+++ b/app/assets/stylesheets/framework/new_card.scss
@@ -0,0 +1,94 @@
+.gl-new-card {
+ @include gl-mt-5;
+ @include gl-bg-gray-10;
+ @include gl-border-1;
+ @include gl-border-solid;
+ @include gl-border-gray-100;
+ @include gl-rounded-base;
+
+ &-header {
+ @include gl-px-5;
+ @include gl-py-4;
+ @include gl-display-flex;
+ @include gl-justify-content-space-between;
+ @include gl-bg-white;
+ @include gl-border-b-1;
+ @include gl-border-b-solid;
+ @include gl-border-b-gray-100;
+ @include gl-rounded-top-base;
+ }
+
+ &[aria-expanded=false] &-header {
+ @include gl-border-bottom-0;
+ @include gl-rounded-base;
+ }
+
+ &-title-wrapper {
+ @include gl-display-flex;
+ @include gl-flex-grow-1;
+ }
+
+ &-title {
+ @include gl-display-flex;
+ @include gl-font-base;
+ @include gl-font-weight-bold;
+ @include gl-relative;
+ @include gl-m-0;
+ @include gl-line-height-24;
+ }
+
+ &-count {
+ @include gl-mx-3;
+ @include gl-font-base;
+ @include gl-font-weight-bold;
+ @include gl-text-gray-500;
+ @include gl-display-inline-flex;
+ @include gl-align-items-center;
+ }
+
+ &-description {
+ @include gl-font-sm;
+ @include gl-text-gray-500;
+ @include gl-m-0;
+ }
+
+ &-toggle {
+ @include gl-pl-3;
+ @include gl-ml-3;
+ @include gl-mr-n2;
+ @include gl-border-l-1;
+ @include gl-border-l-solid;
+ @include gl-border-l-gray-100;
+ }
+
+ &-body {
+ @include gl-rounded-bottom-base;
+ @include gl-px-3;
+ @include gl-py-0;
+ }
+
+ &-content {
+ @include gl-px-2;
+ @include gl-py-3;
+ }
+
+ &-empty {
+ @include gl-p-2;
+ @include gl-mb-0;
+ @include gl-text-gray-500;
+ }
+
+ &-footer {
+ @include gl-bg-white;
+ }
+
+ &-add-form {
+ @include gl-p-4;
+ @include gl-my-2;
+ @include gl-bg-white;
+ @include gl-border-1;
+ @include gl-border-solid;
+ @include gl-border-gray-100;
+ @include gl-rounded-base;
+ }
+}
diff --git a/app/assets/stylesheets/framework/selects.scss b/app/assets/stylesheets/framework/selects.scss
index 98083fbc72a..9bf6ed45483 100644
--- a/app/assets/stylesheets/framework/selects.scss
+++ b/app/assets/stylesheets/framework/selects.scss
@@ -39,6 +39,12 @@
}
.approvers-select {
+ width: calc(70% - #{$gl-spacing-scale-5});
+
+ .gl-new-dropdown-toggle {
+ @include gl-w-full;
+ }
+
.dropdown-menu {
@include gl-w-full;
@include gl-max-w-none;
diff --git a/app/assets/stylesheets/framework/sidebar.scss b/app/assets/stylesheets/framework/sidebar.scss
index b7a674a35e7..5f90dd62426 100644
--- a/app/assets/stylesheets/framework/sidebar.scss
+++ b/app/assets/stylesheets/framework/sidebar.scss
@@ -317,7 +317,7 @@
.right-sidebar {
&:not(.right-sidebar-merge-requests) {
@include right-sidebar;
- top: calc(#{$header-height} + #{$calc-application-bars-height});
+ top: $calc-application-bars-height;
@include media-breakpoint-down(md) {
z-index: 251;
@@ -327,7 +327,7 @@
&.right-sidebar-merge-requests {
@include media-breakpoint-down(md) {
@include right-sidebar;
- top: calc(#{$header-height} + #{$calc-application-bars-height});
+ top: $calc-application-bars-height;
z-index: 251;
}
diff --git a/app/assets/stylesheets/framework/super_sidebar.scss b/app/assets/stylesheets/framework/super_sidebar.scss
index ca67b472322..12801b272e8 100644
--- a/app/assets/stylesheets/framework/super_sidebar.scss
+++ b/app/assets/stylesheets/framework/super_sidebar.scss
@@ -23,7 +23,7 @@ $super-sidebar-transition-hint-duration: $super-sidebar-transition-duration / 4;
}
.super-sidebar-skip-to {
- top: calc(#{$header-height} + #{$calc-application-bars-height});
+ top: $calc-application-bars-height;
width: calc(#{$super-sidebar-width} - #{$gl-spacing-scale-5});
z-index: $super-sidebar-skip-to-z-index;
}
@@ -32,7 +32,7 @@ $super-sidebar-transition-hint-duration: $super-sidebar-transition-duration / 4;
display: flex;
flex-direction: column;
position: fixed;
- top: calc(#{$header-height} + #{$calc-application-bars-height});
+ top: $calc-application-bars-height;
bottom: $calc-application-footer-height;
left: 0;
background-color: var(--gray-10, $gray-10);
@@ -57,12 +57,7 @@ $super-sidebar-transition-hint-duration: $super-sidebar-transition-duration / 4;
.user-bar {
background-color: $t-gray-a-04;
- .tanuki-logo {
- @include gl-vertical-align-middle;
- }
-
- .user-bar-item,
- .tanuki-logo-container {
+ .user-bar-item {
@include gl-rounded-base;
@include gl-p-2;
@include gl-bg-transparent;
@@ -81,21 +76,6 @@ $super-sidebar-transition-hint-duration: $super-sidebar-transition-duration / 4;
@include active-toggle;
}
}
-
- $light-mode-btn-bg: #e0dfe5;
- $dark-mode-btn-bg: #53515b;
-
- .tanuki-logo-container {
- &:hover,
- &:focus,
- &:active {
- background-color: $light-mode-btn-bg;
-
- .gl-dark & {
- background-color: $dark-mode-btn-bg;
- }
- }
- }
}
.counter .gl-icon,
@@ -313,12 +293,9 @@ $super-sidebar-transition-hint-duration: $super-sidebar-transition-duration / 4;
padding: 0.5rem !important;
}
- .is-searching {
- .in-search-scope-help {
- position: absolute;
- top: 0.625rem;
- right: 2.5rem;
- }
+ .search-scope-help {
+ top: 0.625rem;
+ right: 2.5rem;
}
.gl-search-box-by-type-input-borderless {
diff --git a/app/assets/stylesheets/framework/system_messages.scss b/app/assets/stylesheets/framework/system_messages.scss
index 703c2ca0dad..5a8ef077c9b 100644
--- a/app/assets/stylesheets/framework/system_messages.scss
+++ b/app/assets/stylesheets/framework/system_messages.scss
@@ -36,16 +36,6 @@
}
}
-// System Footer
-.with-system-footer {
- // navless pages' footer eg: login page
- // navless pages' footer border eg: login page
- &.devise-layout-html body .footer-container,
- &.devise-layout-html body hr.footer-fixed {
- bottom: $system-footer-height;
- }
-}
-
.fullscreen-layout {
.header-message,
.footer-message {
diff --git a/app/assets/stylesheets/framework/timeline.scss b/app/assets/stylesheets/framework/timeline.scss
index a3b238d657d..921e03f45f3 100644
--- a/app/assets/stylesheets/framework/timeline.scss
+++ b/app/assets/stylesheets/framework/timeline.scss
@@ -31,7 +31,6 @@
&:not(.note-form).internal-note .timeline-content,
&:not(.note-form).draft-note .timeline-content {
background-color: $orange-50 !important;
- border-radius: 3px;
}
.timeline-entry-inner {
@@ -40,9 +39,12 @@
&:target,
&.target {
- .timeline-content,
+ .timeline-content {
+ background-color: $line-target-blue;
+ }
+
+ .public-note.discussion-reply-holder {
- background-color: $line-target-blue !important;
+ padding-top: $gl-padding-12 !important;
}
&.system-note .note-body .note-text.system-note-commit-list::after {
diff --git a/app/assets/stylesheets/framework/typography.scss b/app/assets/stylesheets/framework/typography.scss
index 88f990d2320..25542a86e8c 100644
--- a/app/assets/stylesheets/framework/typography.scss
+++ b/app/assets/stylesheets/framework/typography.scss
@@ -577,17 +577,6 @@
width: 1%;
}
- .metrics-embed {
- h3.popover-header {
- /** Override <h3> .popover-header
- * as embed metrics do not follow the same
- * style as default md <h3> (which are deeply nested)
- */
- margin: 0;
- font-size: $gl-font-size-small;
- }
- }
-
.gl-dropdown-item {
margin: 0;
padding: 0;
diff --git a/app/assets/stylesheets/framework/variables.scss b/app/assets/stylesheets/framework/variables.scss
index f77804fb7fc..ebaaece1281 100644
--- a/app/assets/stylesheets/framework/variables.scss
+++ b/app/assets/stylesheets/framework/variables.scss
@@ -10,7 +10,7 @@ $default-transition-duration: 0.15s;
$contextual-sidebar-width: 256px;
$contextual-sidebar-collapsed-width: 56px;
$toggle-sidebar-height: 48px;
-$super-sidebar-width: 256px;
+$super-sidebar-width: 16rem;
$super-sidebar-z-index: 600;
$super-sidebar-skip-to-z-index: 601;
$super-sidebar-overlay-z-index: 599;
@@ -467,7 +467,6 @@ $ide-statusbar-height: 25px;
$fixed-layout-width: 1280px;
$limited-layout-width: 990px;
$container-text-max-width: 540px;
-$gl-avatar-size: 40px;
$border-radius-default: 4px;
$border-radius-small: 2px;
$border-radius-large: 8px;
@@ -502,8 +501,9 @@ $pages-group-name-color: #4c4e54;
/*
* Calculated heights
*/
-$calc-application-bars-height: calc(var(--system-header-height) + var(--performance-bar-height));
-$calc-application-header-height: calc(#{$header-height} + #{$calc-application-bars-height} + var(--top-bar-height));
+$calc-system-headers-height: calc(var(--system-header-height) + var(--performance-bar-height));
+$calc-application-bars-height: calc(#{$header-height} + #{$calc-system-headers-height});
+$calc-application-header-height: calc(#{$calc-application-bars-height} + var(--top-bar-height));
$calc-application-footer-height: var(--system-footer-height);
$calc-application-viewport-height: calc(100vh - #{$calc-application-header-height} - #{$calc-application-footer-height});
@@ -568,10 +568,12 @@ $diff-jagged-border-gradient-color: darken($white-normal, 8%);
/*
* Fonts
+ * The --default-mono-font and --default-regular-font variables give users
+ * a way to override our font choices for them.
*/
-$monospace-font: 'GitLab Mono', 'JetBrains Mono', 'Menlo', 'DejaVu Sans Mono', 'Liberation Mono', 'Consolas',
+$monospace-font: var(--default-mono-font, 'GitLab Mono'), 'JetBrains Mono', 'Menlo', 'DejaVu Sans Mono', 'Liberation Mono', 'Consolas',
'Ubuntu Mono', 'Courier New', 'andale mono', 'lucida console', monospace;
-$regular-font: 'GitLab Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Noto Sans',
+$regular-font: var(--default-regular-font, 'GitLab Sans'), -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Noto Sans',
Ubuntu, Cantarell, 'Helvetica Neue', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji',
'Segoe UI Symbol', 'Noto Color Emoji';
$gl-monospace-font: $monospace-font;
@@ -704,7 +706,6 @@ $environment-logs-difference-md-up: calc(#{$header-height} + #{$environment-logs
* Avatar
*/
$avatar-radius: 50%;
-$gl-avatar-size: 40px;
$gl-avatar-border-opacity: 0.1;
/*
diff --git a/app/assets/stylesheets/page_bundles/branches.scss b/app/assets/stylesheets/page_bundles/branches.scss
index a5b201c7dac..daf828fb559 100644
--- a/app/assets/stylesheets/page_bundles/branches.scss
+++ b/app/assets/stylesheets/page_bundles/branches.scss
@@ -43,3 +43,15 @@
.branches-list .branch-item:not(:last-of-type) {
border-bottom: 1px solid $border-color;
}
+
+.branch-item {
+ .issuable-reference {
+ max-width: 92px;
+ }
+
+ .right-block {
+ @media (min-width: map-get($grid-breakpoints, md)) {
+ min-width: 200px;
+ }
+ }
+}
diff --git a/app/assets/stylesheets/page_bundles/design_management.scss b/app/assets/stylesheets/page_bundles/design_management.scss
index c19561a5e5e..e206b5e5b8b 100644
--- a/app/assets/stylesheets/page_bundles/design_management.scss
+++ b/app/assets/stylesheets/page_bundles/design_management.scss
@@ -115,11 +115,11 @@ $t-gray-a-16-design-pin: rgba($black, 0.16);
flex-basis: 28%;
.link-inherit-color {
+ &,
&:hover,
&:active,
&:focus {
color: inherit;
- text-decoration: none;
}
}
@@ -159,27 +159,14 @@ $t-gray-a-16-design-pin: rgba($black, 0.16);
transition: background $gl-transition-duration-medium $general-hover-transition-curve;
border-top-left-radius: $border-radius-default; // same border radius used by .bordered-box
border-top-right-radius: $border-radius-default;
-
- a {
- color: inherit;
- }
-
- .note-text a {
- color: var(--blue-600, $blue-600);
- }
}
.reply-wrapper {
- padding: $gl-padding-8 $gl-padding-8 $gl-padding-4;
- background: $gray-10;
+ padding: $gl-padding-8;
border-radius: 0 0 $border-radius-default $border-radius-default;
}
}
- .reply-wrapper {
- border-top: 1px solid var(--border-color, $border-color);
- }
-
.new-discussion-disclaimer {
line-height: 20px;
}
diff --git a/app/assets/stylesheets/page_bundles/issuable.scss b/app/assets/stylesheets/page_bundles/issuable.scss
index 1b98fd4df07..1b5da0368c6 100644
--- a/app/assets/stylesheets/page_bundles/issuable.scss
+++ b/app/assets/stylesheets/page_bundles/issuable.scss
@@ -149,6 +149,10 @@
.gl-search-box-by-type button.gl-clear-icon-button:hover {
@include gl-bg-transparent;
+
+ &:focus {
+ @include gl-focus($inset: true);
+ }
}
.issuable-move-button:not(.disabled):hover {
diff --git a/app/assets/stylesheets/page_bundles/jira_connect.scss b/app/assets/stylesheets/page_bundles/jira_connect.scss
index 2c54c819543..6972e98b0bf 100644
--- a/app/assets/stylesheets/page_bundles/jira_connect.scss
+++ b/app/assets/stylesheets/page_bundles/jira_connect.scss
@@ -9,6 +9,8 @@
@import '@gitlab/ui/src/components/base/alert/alert';
@import '@gitlab/ui/src/components/base/avatar/avatar';
@import '@gitlab/ui/src/components/base/button/button';
+@import '@gitlab/ui/src/components/base/banner/banner';
+@import '@gitlab/ui/src/components/base/card/card';
@import '@gitlab/ui/src/components/base/icon/icon';
@import '@gitlab/ui/src/components/base/link/link';
@import '@gitlab/ui/src/components/base/loading_icon/loading_icon';
@@ -23,7 +25,7 @@
@import '@gitlab/ui/src/components/base/form/form_group/form_group';
@import '@gitlab/ui/src/components/base/search_box_by_type/search_box_by_type';
-$header-height: 40px;
+$header-height: $gl-spacing-scale-8;
.jira-connect-header {
min-height: $header-height;
@@ -35,6 +37,6 @@ $header-height: 40px;
.jira-connect-app {
margin-top: $header-height;
- height: calc(100% - #{$header-height});
- max-width: 1000px;
+ height: 100%;
+ max-height: calc(100% - #{$header-height + $gl-spacing-scale-7 * 2});
}
diff --git a/app/assets/stylesheets/page_bundles/login.scss b/app/assets/stylesheets/page_bundles/login.scss
index 355d2afc0ba..b63f199f7b9 100644
--- a/app/assets/stylesheets/page_bundles/login.scss
+++ b/app/assets/stylesheets/page_bundles/login.scss
@@ -196,10 +196,6 @@
}
}
- .submit-container {
- margin-top: 16px;
- }
-
input[type='submit'] {
margin-bottom: 0;
display: block;
@@ -228,65 +224,33 @@
}
}
-.devise-layout-html {
+.html-devise-layout {
margin: 0;
padding: 0;
height: 100%;
- &.with-system-header {
- .login-page-broadcast {
- margin-top: calc(#{$system-header-height} + #{$header-height});
- }
- }
-
- // Fixes footer container to bottom of viewport
body {
- // offset height of fixed header + 1 to avoid scroll
- height: calc(100% - 51px);
+ padding-top: 48px; // Remove this line when the restyle_login_page feature flag is deleted. Instead, add self-align `center` to container, and maybe a top margin.
- // offset without the header
- &.navless {
- height: calc(100% - 11px);
+ &.with-system-header {
+ padding-top: $system-header-height;
+ padding-top: calc(#{$system-header-height} + 48px); // Remove this line when the restyle_login_page feature flag is deleted
}
- margin: 0;
- padding: 0;
-
- .page-wrap {
- min-height: 100%;
- position: relative;
- }
-
- .footer-container,
- hr.footer-fixed {
- position: fixed;
- bottom: 0;
- left: 0;
- right: 0;
- height: 40px;
- background: var(--white, $white);
- }
-
- .login-page-broadcast {
- margin-top: 40px;
- }
-
- .navless-container {
- padding: 0 15px 65px; // height of footer + bottom padding of email confirmation link
- }
-
- .flash-container {
- padding-bottom: 65px;
-
- @include media-breakpoint-down(xs) {
- padding-bottom: 0;
+ &.with-system-footer {
+ .footer-container {
+ padding-bottom: $system-footer-height;
}
}
}
}
@include media-breakpoint-down(sm) {
- .sm-bg-gray-10 {
+ .sm-bg-gray {
@include gl-bg-gray-10;
+
+ .gl-dark & {
+ background-color: var(--gray-100);
+ }
}
}
diff --git a/app/assets/stylesheets/page_bundles/merge_requests.scss b/app/assets/stylesheets/page_bundles/merge_requests.scss
index fc4a9d3dff9..5e20588dd70 100644
--- a/app/assets/stylesheets/page_bundles/merge_requests.scss
+++ b/app/assets/stylesheets/page_bundles/merge_requests.scss
@@ -226,7 +226,7 @@ $tabs-holder-z-index: 250;
clear: left;
.note-body {
- padding: 0 0 $gl-padding-8;
+ padding: 0 $gl-padding-8 $gl-padding-8 $gl-padding-32;
}
}
@@ -234,14 +234,15 @@ $tabs-holder-z-index: 250;
margin-top: -2px;
margin-right: $gl-padding-8;
}
+}
- // tiny adjustment to vertical align with the note header text
- .discussion-collapsible {
- margin-left: 1rem;
+// tiny adjustment to vertical align with the note header text
+.discussion-collapsible {
+ border: 0 !important;
+ margin: 0;
- .timeline-icon {
- padding-top: 2px;
- }
+ .timeline-icon {
+ padding-top: 2px;
}
}
@@ -1275,20 +1276,12 @@ $tabs-holder-z-index: 250;
.diff-file-discussions-wrapper {
@include gl-w-full;
- max-width: 800px;
-
- .diff-discussions > .notes {
- @include gl-p-5;
- }
-
.diff-discussions:not(:first-child) >.notes {
@include gl-pt-0;
}
.note-discussion {
- @include gl-rounded-base;
-
- border: 1px solid var(--gray-100, $gray-100) !important;
+ border-bottom: 1px solid var(--gray-100, $gray-100) !important;
}
.discussion-collapsible {
diff --git a/app/assets/stylesheets/page_bundles/notifications.scss b/app/assets/stylesheets/page_bundles/notifications.scss
index 88437954f4c..a901235df50 100644
--- a/app/assets/stylesheets/page_bundles/notifications.scss
+++ b/app/assets/stylesheets/page_bundles/notifications.scss
@@ -1,31 +1,7 @@
@import 'mixins_and_variables_and_functions';
.notification-list-item {
- @include media-breakpoint-down(sm) {
- .notification-dropdown {
- width: 100%;
- }
-
- .btn-group {
- width: 100%;
- }
-
- .table-section {
- border-top: 0;
- min-height: unset;
-
- &:not(:first-child) {
- padding-top: 0;
- }
- }
-
- .update-notifications {
- width: 100%;
- }
+ &:not(:last-of-type) {
+ border-bottom: 1px solid $gray-100;
}
}
-
-.notification {
- position: relative;
- top: 1px;
-}
diff --git a/app/assets/stylesheets/page_bundles/profiles/preferences.scss b/app/assets/stylesheets/page_bundles/profiles/preferences.scss
index c9c78a70163..1a59f96c6ee 100644
--- a/app/assets/stylesheets/page_bundles/profiles/preferences.scss
+++ b/app/assets/stylesheets/page_bundles/profiles/preferences.scss
@@ -66,13 +66,8 @@
.syntax-theme {
label {
- margin-right: $gl-padding-32;
- margin-bottom: $gl-padding;
- text-align: center;
-
.preview {
- margin-bottom: 10px;
- width: 160px;
+ margin-bottom: 8px;
img {
border-radius: 4px;
diff --git a/app/assets/stylesheets/page_bundles/project.scss b/app/assets/stylesheets/page_bundles/project.scss
index 68bf2fa0f82..8d8da10268a 100644
--- a/app/assets/stylesheets/page_bundles/project.scss
+++ b/app/assets/stylesheets/page_bundles/project.scss
@@ -47,12 +47,6 @@
}
.project-repo-buttons {
- .btn {
- svg {
- fill: var(--gray-500, $gray-500);
- }
- }
-
.download-button {
@include media-breakpoint-down(md) {
margin-left: 0;
diff --git a/app/assets/stylesheets/page_bundles/prometheus.scss b/app/assets/stylesheets/page_bundles/prometheus.scss
deleted file mode 100644
index 702c0e4dd72..00000000000
--- a/app/assets/stylesheets/page_bundles/prometheus.scss
+++ /dev/null
@@ -1,113 +0,0 @@
-@import 'mixins_and_variables_and_functions';
-
-.date-time-picker {
- .date-time-picker-menu {
- width: 400px;
- }
-}
-
-.prometheus-graphs {
- .dropdown-buttons {
- > div {
- margin-left: auto;
- }
- }
-
- .col-form-label {
- line-height: 1;
- padding-top: 0;
- }
-
- .form-group {
- margin-bottom: map-get($spacing-scale, 3);
- }
-
- .variables-section {
- input {
- @include media-breakpoint-up(sm) {
- width: 160px;
- }
- }
- }
-
- .links-section {
- .gl-hover-text-blue-600-children:hover {
- * {
- @include gl-text-blue-600;
- }
- }
- }
-}
-
-.draggable {
- &.draggable-enabled {
- .draggable-panel {
- border: $gray-100 1px solid;
- border-radius: $border-radius-default;
- margin: -1px;
- cursor: grab;
- }
-
- .prometheus-graph {
- // Make dragging easier by disabling use of chart
- pointer-events: none;
- }
- }
-
- &.sortable-chosen .draggable-panel {
- background: $white;
- box-shadow: 0 0 4px $gray-300;
- }
-
- .draggable-remove {
- z-index: 1;
-
- .draggable-remove-link {
- cursor: pointer;
- color: $gray-400;
- background-color: $white;
- }
- }
-}
-
-.prometheus-graphs-header {
- .monitor-environment-dropdown-menu,
- .monitor-dashboard-dropdown-menu {
- &.show {
- display: flex;
- flex-direction: column;
- overflow: hidden;
- }
-
- .no-matches-message {
- padding: $gl-padding-8 $gl-padding-12;
- }
- }
-
- .show-last-dropdown {
- // same as in .dropdown-menu-toggle
- // see app/assets/stylesheets/framework/dropdowns.scss
- width: 160px;
- }
-}
-
-.prometheus-panel {
- margin-top: 20px;
-}
-
-.prometheus-graph-group {
- display: flex;
- flex-wrap: wrap;
-}
-
-.prometheus-graph {
- padding: $gl-padding-8;
-}
-
-.prometheus-panel-builder {
- .preview-date-time-picker {
- // same as in .dropdown-menu-toggle
- // see app/assets/stylesheets/framework/dropdowns.scss
- width: 160px;
- }
-}
diff --git a/app/assets/stylesheets/page_bundles/search.scss b/app/assets/stylesheets/page_bundles/search.scss
index d1d14cbcddd..a3a62b44e98 100644
--- a/app/assets/stylesheets/page_bundles/search.scss
+++ b/app/assets/stylesheets/page_bundles/search.scss
@@ -69,11 +69,9 @@ $language-filter-max-height: 20rem;
}
.label-with-color-checkbox {
- max-height: $gl-spacing-scale-5;
-
.custom-control-label {
+ display: flex;
margin-bottom: 0;
- max-height: $gl-spacing-scale-5;
.label-title {
margin-left: -$gl-spacing-scale-2;
diff --git a/app/assets/stylesheets/page_bundles/settings.scss b/app/assets/stylesheets/page_bundles/settings.scss
index 9a0d7880734..b906a932e70 100644
--- a/app/assets/stylesheets/page_bundles/settings.scss
+++ b/app/assets/stylesheets/page_bundles/settings.scss
@@ -65,6 +65,8 @@
}
.settings-content {
+ // #416312: Fix white space at bottom of page
+ position: relative;
max-height: 1px;
overflow-y: hidden;
padding-right: 110px;
diff --git a/app/assets/stylesheets/page_bundles/tree.scss b/app/assets/stylesheets/page_bundles/tree.scss
index a13b8704095..e0ee157187b 100644
--- a/app/assets/stylesheets/page_bundles/tree.scss
+++ b/app/assets/stylesheets/page_bundles/tree.scss
@@ -205,17 +205,6 @@
margin-top: $gl-padding;
}
-
-.web-ide-promo-popover {
- box-shadow: 0 0 18px -1.9px rgba(119, 89, 194, 0.16),
- 0 0 12.9px -1.7px rgba(119, 89, 194, 0.16), 0 0 9.2px -1.4px rgba(119, 89, 194, 0.16),
- 0 0 6.4px -1.1px rgba(119, 89, 194, 0.16), 0 0 4.5px -0.8px rgba(119, 89, 194, 0.16),
- 0 0 3px -0.6px rgba(119, 89, 194, 0.16), 0 0 1.8px -0.3px rgba(119, 89, 194, 0.16),
- 0 0 0.6px rgba(119, 89, 194, 0.16);
- z-index: 999;
-}
-
-.web-ide-promo-popover-illustration {
- width: calc(100% + 24px);
- margin: -28px -12px 0;
+.edit-dropdown-group-width {
+ width: 320px;
}
diff --git a/app/assets/stylesheets/page_bundles/work_items.scss b/app/assets/stylesheets/page_bundles/work_items.scss
index ecbb872e1df..013aa064c4e 100644
--- a/app/assets/stylesheets/page_bundles/work_items.scss
+++ b/app/assets/stylesheets/page_bundles/work_items.scss
@@ -1,5 +1,8 @@
@import 'mixins_and_variables_and_functions';
+$work-item-overview-right-sidebar-width: 340px;
+$work-item-sticky-header-height: 52px;
+
.gl-token-selector-token-container {
display: flex;
align-items: center;
@@ -104,3 +107,54 @@
@include gl-font-weight-normal;
}
}
+
+.work-item-overview {
+ @include media-breakpoint-up(md) {
+ display: grid;
+ grid-template-columns: 1fr $work-item-overview-right-sidebar-width;
+ gap: 2rem;
+ }
+}
+
+.work-item-overview-right-sidebar {
+ @include media-breakpoint-up(md) {
+ &.is-modal {
+ .work-item-attributes-wrapper {
+ top: 0;
+ }
+ }
+ }
+}
+
+.work-item-attributes-wrapper {
+ .work-item-overview & {
+ @include media-breakpoint-up(md) {
+ top: calc(#{$calc-application-header-height} + #{$work-item-sticky-header-height});
+ height: calc(#{$calc-application-viewport-height} - #{$work-item-sticky-header-height});
+ margin-bottom: calc(#{$content-wrapper-padding} * -1);
+ position: sticky;
+ overflow-y: auto;
+ overflow-x: hidden;
+ }
+ }
+}
+
+.work-item-field-label {
+ .work-item-overview & {
+ max-width: 30%;
+ flex: none;
+ }
+}
+
+.work-item-field-value {
+ .work-item-overview & {
+ max-width: 65%;
+ }
+}
+
+.token-selector-menu-class {
+ .work-item-overview & {
+ width: 100%;
+ min-width: 100%;
+ }
+}
diff --git a/app/assets/stylesheets/pages/commits.scss b/app/assets/stylesheets/pages/commits.scss
index b25a5b1c493..8b093e7bb7b 100644
--- a/app/assets/stylesheets/pages/commits.scss
+++ b/app/assets/stylesheets/pages/commits.scss
@@ -307,14 +307,6 @@
}
}
-.gpg-popover-user-link {
- display: flex;
- align-items: center;
- margin-bottom: $gl-padding / 2;
- text-decoration: none;
- color: $gl-text-color;
-}
-
.add-review-item {
.gl-tab-nav-item {
height: 100%;
diff --git a/app/assets/stylesheets/pages/note_form.scss b/app/assets/stylesheets/pages/note_form.scss
index 322363d7f4b..0c9d151e3cd 100644
--- a/app/assets/stylesheets/pages/note_form.scss
+++ b/app/assets/stylesheets/pages/note_form.scss
@@ -48,7 +48,7 @@
.common-note-form {
.md-area {
- border: 1px solid $border-color;
+ border: 1px solid $gray-400;
border-radius: $border-radius-large;
transition: border-color ease-in-out 0.15s,
box-shadow ease-in-out 0.15s;
@@ -65,19 +65,41 @@
}
}
- // Disable inner focus
- textarea:focus {
- @include gl-shadow-none;
+ &:hover,
+ &:focus-within {
+ @include gl-shadow-md;
}
- }
- .comment-warning-wrapper:focus-within {
- @include gl-focus;
- }
-}
+ &:hover {
+ border: 1px solid $gray-500;
+ }
-.md-area:focus-within {
- @include gl-focus;
+ &:focus-within {
+ border: 1px solid $gray-900;
+ }
+
+ // Add focus
+ .zen-backdrop:not(.fullscreen) textarea {
+ width: calc(100% - 4px);
+ margin: 2px;
+ padding-left: calc(#{$gl-spacing-scale-5} - 2px);
+
+ .gl-dark & {
+ width: calc(100% - 6px);
+ margin: 2px 3px;
+ padding-left: calc(#{$gl-spacing-scale-5} - 3px);
+ }
+
+ &:focus {
+ @include gl-focus;
+ }
+ }
+
+ .note-textarea-rounded-bottom {
+ border-bottom-left-radius: calc(#{$border-radius-large} - 1px);
+ border-bottom-right-radius: calc(#{$border-radius-large} - 1px);
+ }
+ }
}
.md-header {
@@ -217,6 +239,7 @@ table {
.md-area {
background-color: $white;
+ @include gl-rounded-base;
}
}
@@ -245,24 +268,21 @@ table {
.diff-file,
.commit-diff {
.discussion-reply-holder {
- background-color: $gray-light;
border-radius: 0 0 $gl-border-radius-base $gl-border-radius-base;
- padding: $gl-padding;
+ padding: 0 $gl-padding $gl-padding-12 $gl-padding;
border-top: 1px solid $gray-50;
+ .new-note {
- background-color: $gray-light;
border-top: 1px solid $gray-50;
}
&.is-replying {
- padding-bottom: $gl-padding;
- background-color: $white;
+ padding-top: $gl-padding-12;
}
&.internal-note,
&.internal-note.is-replying {
- background-color: $orange-50;
+ padding-top: $gl-padding-12 !important;
}
.user-avatar-link {
@@ -273,6 +293,11 @@ table {
}
}
+.diff-td > .content > .discussion-reply-holder {
+ padding-top: $gl-padding-12;
+ @include gl-bg-gray-10;
+}
+
.discussion-with-resolve-btn {
@include media-breakpoint-up(sm) {
display: flex;
@@ -307,13 +332,19 @@ table {
resize: none;
padding: $gl-padding-8 $gl-padding-12;
line-height: 1;
- border: 1px solid $border-color;
+ border: 1px solid $gray-200;
background-color: $white;
overflow: hidden;
+ transition: border-color ease-in-out 0.15s,
+ box-shadow ease-in-out 0.15s;
@include media-breakpoint-down(xs) {
margin-bottom: $gl-padding-8;
}
+
+ &:hover {
+ border: 1px solid $gray-500;
+ }
}
}
@@ -348,10 +379,6 @@ table {
.toolbar-text {
font-size: 14px;
line-height: $gl-spacing-scale-7;
-
- @include media-breakpoint-up(md) {
- float: left;
- }
}
.note-form-actions {
@@ -438,9 +465,4 @@ table {
.comment-warning-wrapper {
transition: border-color ease-in-out 0.15s,
box-shadow ease-in-out 0.15s;
-
- .md-area {
- border: 0;
- box-shadow: none;
- }
}
diff --git a/app/assets/stylesheets/pages/notes.scss b/app/assets/stylesheets/pages/notes.scss
index c5b644bd72f..005fbc8b058 100644
--- a/app/assets/stylesheets/pages/notes.scss
+++ b/app/assets/stylesheets/pages/notes.scss
@@ -100,10 +100,13 @@ $system-note-icon-m-left: $avatar-m-left + $icon-size-diff / $avatar-m-ratio;
margin-left: 2.5rem;
border: 1px solid $border-color;
border-radius: $gl-border-radius-base;
- background-color: $white;
padding: $gl-padding-4 $gl-padding-8;
}
+ &:not(.target) .timeline-content:not(.flash-container) {
+ background-color: $white;
+ }
+
&.draft-note .timeline-content:not(.flash-container) {
border: 0;
}
@@ -139,11 +142,14 @@ $system-note-icon-m-left: $avatar-m-left + $icon-size-diff / $avatar-m-ratio;
border-top: 1px solid $border-color;
border-top-left-radius: $gl-border-radius-base;
border-top-right-radius: $gl-border-radius-base;
- background-color: $white;
padding: $gl-padding-4 $gl-padding-8;
}
}
+ &:not(.target) .timeline-content:not(.flash-container) {
+ background-color: $white;
+ }
+
&.draft-note .timeline-content:not(.flash-container) {
margin-left: 0;
border-top-left-radius: 0;
@@ -239,15 +245,6 @@ $system-note-icon-m-left: $avatar-m-left + $icon-size-diff / $avatar-m-ratio;
}
}
- .discussion-toggle-replies {
- border-top: 0;
- border-radius: 4px 4px 0 0;
-
- &.collapsed {
- border-radius: 4px;
- }
- }
-
.note-created-ago,
.note-updated-at {
white-space: normal;
@@ -1090,6 +1087,7 @@ $system-note-icon-m-left: $avatar-m-left + $icon-size-diff / $avatar-m-ratio;
margin-left: 0;
border-left: 0;
border-right: 0;
+ border-radius: 0 !important;
}
.discussion-reply-holder {
diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss
index ff1987f35b3..8cf0bebfc4e 100644
--- a/app/assets/stylesheets/pages/projects.scss
+++ b/app/assets/stylesheets/pages/projects.scss
@@ -518,64 +518,24 @@
}
}
-.project-refs-form .dropdown-menu {
- width: 300px;
- @include media-breakpoint-up(sm) {
- width: 500px;
- }
-
- a {
- white-space: normal;
- }
-}
-
-.compare-form-group {
- .dropdown-menu,
- .inline-input-group {
- width: 100%;
-
- @include media-breakpoint-up(sm) {
- width: 300px;
+.compare-revision-cards {
+ @media (max-width: $breakpoint-lg) {
+ .swap-button {
+ display: none;
}
}
- + .compare-ellipsis {
- width: 100%;
- vertical-align: middle;
- text-align: center;
- margin-top: -20px;
-
- @include media-breakpoint-up(sm) {
- margin: 0 $gl-padding-8;
- width: auto;
+ @media (max-width: $breakpoint-lg) {
+ .swap-button-mobile {
+ display: flex;
}
}
- // Remove once gitlab/ui solution is implemented:
- // https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1157
- // https://gitlab.com/gitlab-org/gitlab/-/issues/300405
- .gl-search-box-by-type-input {
- width: 100%;
- }
-
- // Remove once gitlab/ui solution is implemented
- // https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1158
- // https://gitlab.com/gitlab-org/gitlab/-/issues/300405
- .gl-dropdown-button-text {
- @include str-truncated;
- }
-}
-
-.compare-revision-cards {
@media (min-width: $breakpoint-lg) {
.gl-card {
width: calc(50% - 15px);
}
-
- .compare-ellipsis {
- width: 30px;
- }
}
}
diff --git a/app/assets/stylesheets/pages/settings.scss b/app/assets/stylesheets/pages/settings.scss
index 3b5e234c6b8..728eb1fe441 100644
--- a/app/assets/stylesheets/pages/settings.scss
+++ b/app/assets/stylesheets/pages/settings.scss
@@ -75,3 +75,70 @@
}
}
}
+
+.settings-section {
+ @include gl-pt-6;
+
+ &::after {
+ content: '';
+ display: block;
+ @include gl-pb-5;
+ }
+}
+
+.settings-section,
+.settings-section-no-bottom + .settings-section {
+ @include gl-pt-0;
+}
+
+.settings-section ~ .settings-section {
+ @include gl-pt-6;
+}
+
+.settings-section:not(.settings-section-no-bottom) + .settings-section {
+ @include gl-border-t;
+}
+
+.settings-section-no-bottom::after {
+ @include gl-pb-0;
+
+ @include media-breakpoint-up(sm) {
+ @include gl-pb-5;
+ }
+}
+
+$sticky-header-z-index: 98;
+
+.settings-sticky-header,
+.settings-sticky-footer {
+ position: sticky;
+ z-index: $sticky-header-z-index;
+ background: $body-bg;
+}
+
+.settings-sticky-header {
+ top: $calc-application-header-height;
+
+ &::before {
+ content: '';
+ display: block;
+ height: $gl-padding-8;
+ position: sticky;
+ top: calc(#{$calc-application-header-height} + 40px);
+ box-shadow: 0 1px 1px $gray-200;
+ }
+}
+
+.settings-sticky-header-inner {
+ position: sticky;
+ padding: $gl-padding $gl-padding $gl-padding-12;
+ margin: #{-$gl-padding} #{-$gl-padding} 0;
+ background: $body-bg;
+}
+
+.settings-sticky-footer {
+ bottom: 0;
+ padding-top: $gl-padding-8;
+ padding-bottom: $gl-padding-8;
+ box-shadow: 0 #{-$gl-padding-4} $gl-padding-12 $gl-padding-4 $body-bg;
+}
diff --git a/app/assets/stylesheets/startup/startup-dark.scss b/app/assets/stylesheets/startup/startup-dark.scss
index 7be15c2d8f9..60cbcffd506 100644
--- a/app/assets/stylesheets/startup/startup-dark.scss
+++ b/app/assets/stylesheets/startup/startup-dark.scss
@@ -20,9 +20,10 @@ header {
}
body {
margin: 0;
- font-family: "GitLab Sans", -apple-system, BlinkMacSystemFont, "Segoe UI",
- Roboto, "Noto Sans", Ubuntu, Cantarell, "Helvetica Neue", sans-serif,
- "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-family: var(--default-regular-font, "GitLab Sans"), -apple-system,
+ BlinkMacSystemFont, "Segoe UI", Roboto, "Noto Sans", Ubuntu, Cantarell,
+ "Helvetica Neue", sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
+ "Segoe UI Symbol", "Noto Color Emoji";
font-size: 1rem;
font-weight: 400;
line-height: 1.5;
@@ -50,9 +51,9 @@ a:not([href]):not([class]) {
text-decoration: none;
}
kbd {
- font-family: "GitLab Mono", "JetBrains Mono", "Menlo", "DejaVu Sans Mono",
- "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono",
- "lucida console", monospace;
+ font-family: var(--default-mono-font, "GitLab Mono"), "JetBrains Mono",
+ "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono",
+ "Courier New", "andale mono", "lucida console", monospace;
font-size: 1em;
}
img {
@@ -415,9 +416,10 @@ a.gl-badge.badge-warning:active {
.gl-form-input,
.gl-form-input.form-control {
background-color: #333238;
- font-family: "GitLab Sans", -apple-system, BlinkMacSystemFont, "Segoe UI",
- Roboto, "Noto Sans", Ubuntu, Cantarell, "Helvetica Neue", sans-serif,
- "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-family: var(--default-regular-font, "GitLab Sans"), -apple-system,
+ BlinkMacSystemFont, "Segoe UI", Roboto, "Noto Sans", Ubuntu, Cantarell,
+ "Helvetica Neue", sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
+ "Segoe UI Symbol", "Noto Color Emoji";
font-size: 0.875rem;
line-height: 1rem;
padding-top: 0.5rem;
diff --git a/app/assets/stylesheets/startup/startup-general.scss b/app/assets/stylesheets/startup/startup-general.scss
index 65500800ce3..04c44dd9603 100644
--- a/app/assets/stylesheets/startup/startup-general.scss
+++ b/app/assets/stylesheets/startup/startup-general.scss
@@ -20,9 +20,10 @@ header {
}
body {
margin: 0;
- font-family: "GitLab Sans", -apple-system, BlinkMacSystemFont, "Segoe UI",
- Roboto, "Noto Sans", Ubuntu, Cantarell, "Helvetica Neue", sans-serif,
- "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-family: var(--default-regular-font, "GitLab Sans"), -apple-system,
+ BlinkMacSystemFont, "Segoe UI", Roboto, "Noto Sans", Ubuntu, Cantarell,
+ "Helvetica Neue", sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
+ "Segoe UI Symbol", "Noto Color Emoji";
font-size: 1rem;
font-weight: 400;
line-height: 1.5;
@@ -50,9 +51,9 @@ a:not([href]):not([class]) {
text-decoration: none;
}
kbd {
- font-family: "GitLab Mono", "JetBrains Mono", "Menlo", "DejaVu Sans Mono",
- "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono",
- "lucida console", monospace;
+ font-family: var(--default-mono-font, "GitLab Mono"), "JetBrains Mono",
+ "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono",
+ "Courier New", "andale mono", "lucida console", monospace;
font-size: 1em;
}
img {
@@ -415,9 +416,10 @@ a.gl-badge.badge-warning:active {
.gl-form-input,
.gl-form-input.form-control {
background-color: #fff;
- font-family: "GitLab Sans", -apple-system, BlinkMacSystemFont, "Segoe UI",
- Roboto, "Noto Sans", Ubuntu, Cantarell, "Helvetica Neue", sans-serif,
- "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-family: var(--default-regular-font, "GitLab Sans"), -apple-system,
+ BlinkMacSystemFont, "Segoe UI", Roboto, "Noto Sans", Ubuntu, Cantarell,
+ "Helvetica Neue", sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
+ "Segoe UI Symbol", "Noto Color Emoji";
font-size: 0.875rem;
line-height: 1rem;
padding-top: 0.5rem;
diff --git a/app/assets/stylesheets/startup/startup-signin.scss b/app/assets/stylesheets/startup/startup-signin.scss
index 40e1e4b1996..32da8e1bb6b 100644
--- a/app/assets/stylesheets/startup/startup-signin.scss
+++ b/app/assets/stylesheets/startup/startup-signin.scss
@@ -19,9 +19,10 @@ header {
}
body {
margin: 0;
- font-family: "GitLab Sans", -apple-system, BlinkMacSystemFont, "Segoe UI",
- Roboto, "Noto Sans", Ubuntu, Cantarell, "Helvetica Neue", sans-serif,
- "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-family: var(--default-regular-font, "GitLab Sans"), -apple-system,
+ BlinkMacSystemFont, "Segoe UI", Roboto, "Noto Sans", Ubuntu, Cantarell,
+ "Helvetica Neue", sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
+ "Segoe UI Symbol", "Noto Color Emoji";
font-size: 1rem;
font-weight: 400;
line-height: 1.5;
@@ -382,9 +383,10 @@ input.btn-block[type="submit"] {
.gl-form-input,
.gl-form-input.form-control {
background-color: #fff;
- font-family: "GitLab Sans", -apple-system, BlinkMacSystemFont, "Segoe UI",
- Roboto, "Noto Sans", Ubuntu, Cantarell, "Helvetica Neue", sans-serif,
- "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-family: var(--default-regular-font, "GitLab Sans"), -apple-system,
+ BlinkMacSystemFont, "Segoe UI", Roboto, "Noto Sans", Ubuntu, Cantarell,
+ "Helvetica Neue", sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
+ "Segoe UI Symbol", "Noto Color Emoji";
font-size: 0.875rem;
line-height: 1rem;
padding-top: 0.5rem;
@@ -622,10 +624,6 @@ body.navless {
margin-top: 20px;
}
}
-.navless-container {
- margin-top: var(--header-height, 48px);
- padding-top: 32px;
-}
.btn {
border-radius: 4px;
font-size: 0.875rem;
@@ -685,12 +683,6 @@ hr {
margin: 1.5rem 0;
border-top: 1px solid #ececef;
}
-.footer-links {
- margin-bottom: 20px;
-}
-.footer-links a {
- margin-right: 15px;
-}
.flash-container {
margin: 0;
margin-bottom: 16px;
@@ -777,9 +769,15 @@ svg {
.gl-align-items-center {
align-items: center;
}
+.gl-flex-wrap {
+ flex-wrap: wrap;
+}
.gl-justify-content-space-between {
justify-content: space-between;
}
+.gl-align-self-end {
+ align-self: flex-end;
+}
.gl-w-10 {
width: 3.5rem;
}
@@ -794,6 +792,9 @@ svg {
width: 100%;
}
}
+.gl-h-full {
+ height: 100%;
+}
.gl-p-5 {
padding: 1rem;
}
@@ -805,6 +806,9 @@ svg {
padding-top: 1rem;
padding-bottom: 1rem;
}
+.gl-m-0 {
+ margin: 0;
+}
.gl-mt-3 {
margin-top: 0.5rem;
}
@@ -823,6 +827,9 @@ svg {
.gl-ml-auto {
margin-left: auto;
}
+.gl-gap-5 {
+ gap: 1rem;
+}
@media (min-width: 576px) {
.gl-sm-mt-0 {
margin-top: 0;
diff --git a/app/assets/stylesheets/themes/dark_mode_overrides.scss b/app/assets/stylesheets/themes/dark_mode_overrides.scss
index e004ca4bb4a..030e41046d3 100644
--- a/app/assets/stylesheets/themes/dark_mode_overrides.scss
+++ b/app/assets/stylesheets/themes/dark_mode_overrides.scss
@@ -296,8 +296,7 @@ body.gl-dark {
}
.timeline-entry.internal-note:not(.note-form) .timeline-content,
-.timeline-entry.draft-note:not(.note-form) .timeline-content,
-.discussion-reply-holder.internal-note {
+.timeline-entry.draft-note:not(.note-form) .timeline-content {
// soften on darkmode
background-color: mix($gray-50, $orange-50, 75%) !important;
}
diff --git a/app/assets/stylesheets/utilities.scss b/app/assets/stylesheets/utilities.scss
index 08c4efce542..db9802eeefa 100644
--- a/app/assets/stylesheets/utilities.scss
+++ b/app/assets/stylesheets/utilities.scss
@@ -42,7 +42,7 @@
// Override Bootstrap class with offset for system-header and
// performance bar when present
.fixed-top {
- top: $calc-application-bars-height;
+ top: $calc-system-headers-height;
}
.gl-children-ml-sm-3 > * {
@@ -128,24 +128,6 @@
}
}
-.gl-md-w-15 {
- @include gl-media-breakpoint-up(md) {
- width: $gl-spacing-scale-15;
- }
-}
-
-.gl-md-w-20 {
- @include gl-media-breakpoint-up(md) {
- width: $gl-spacing-scale-20;
- }
-}
-
-.gl-md-w-30 {
- @include gl-media-breakpoint-up(md) {
- width: $gl-spacing-scale-30;
- }
-}
-
.gl-fill-orange-500 {
fill: $orange-500;
}
diff --git a/app/assets/stylesheets/vendors/atwho.scss b/app/assets/stylesheets/vendors/atwho.scss
index b92331facee..cf7dc79c5f5 100644
--- a/app/assets/stylesheets/vendors/atwho.scss
+++ b/app/assets/stylesheets/vendors/atwho.scss
@@ -2,6 +2,11 @@
overflow-y: auto;
overflow-x: hidden;
max-width: calc(100% - 6px);
+ @include gl-border-b-1;
+ @include gl-border-b-solid;
+ @include gl-border-b-gray-100;
+ @include gl-rounded-lg;
+ @include gl-shadow-md;
.name,
small.aliases,
@@ -44,11 +49,15 @@
// TODO: fallback to global style
.atwho-view-ul {
- padding: 8px 1px;
+ @include gl-p-2;
+ max-height: $gl-max-dropdown-max-height;
li {
- padding: 8px 16px;
+ @include gl-px-3;
+ padding-top: $gl-padding-6;
+ padding-bottom: $gl-padding-6;
border: 0;
+ @include gl-rounded-base;
&.cur {
background-color: $gray-darker;
@@ -67,15 +76,25 @@
display: inline-flex;
justify-content: center;
align-items: center;
+ }
- .center {
- line-height: 14px;
- }
+ .center {
+ line-height: 14px;
}
strong {
color: $gl-text-color;
}
+
+ gl-emoji {
+ @include gl-mr-2;
+ }
+
+ .dropdown-label-box {
+ position: relative;
+ top: -1px;
+ @include gl-mr-2;
+ }
}
}
}
diff --git a/app/components/pajamas/banner_component.html.haml b/app/components/pajamas/banner_component.html.haml
index 4fa2ed09cd3..c2eeae2d8c9 100644
--- a/app/components/pajamas/banner_component.html.haml
+++ b/app/components/pajamas/banner_component.html.haml
@@ -14,7 +14,7 @@
- if primary_action?
= primary_action
- else
- = link_to @button_text, @button_link, { **@button_options, class: 'btn btn-md btn-confirm gl-button js-close-callout' }
+ = link_button_to @button_text, @button_link, **@button_options, class: 'js-close-callout', variant: :confirm
- actions.each do |action|
= action
diff --git a/app/components/pajamas/banner_component.rb b/app/components/pajamas/banner_component.rb
index 6082762f22c..1a03f3fdd58 100644
--- a/app/components/pajamas/banner_component.rb
+++ b/app/components/pajamas/banner_component.rb
@@ -49,7 +49,7 @@ module Pajamas
end
end
- delegate :sprite_icon, to: :helpers
+ delegate :sprite_icon, :link_button_to, to: :helpers
renders_one :title
renders_one :illustration
diff --git a/app/components/pajamas/empty_state_component.html.haml b/app/components/pajamas/empty_state_component.html.haml
new file mode 100644
index 00000000000..ecd3498c5cd
--- /dev/null
+++ b/app/components/pajamas/empty_state_component.html.haml
@@ -0,0 +1,29 @@
+- empty_state_class = @compact ? 'gl-flex-direction-row gl-align-items-center' : 'gl-text-center gl-flex-direction-column'
+
+%section.gl-display-flex.empty-state{ **@empty_state_options, class: empty_state_class }
+ - if @svg_path.present?
+ - image_class = @compact ? 'gl-display-none gl-sm-display-block gl-px-4' : 'gl-max-w-full'
+ %div{ class: image_class }
+ = image_tag @svg_path, alt: "", class: 'gl-dark-invert-keep-hue'
+
+ - content_wrapper_class = @compact ? 'gl-flex-grow-1 gl-flex-basis-0 gl-px-4' : 'gl-max-w-full gl-m-auto pl-p-5'
+ %div{ class: content_wrapper_class }
+ - title_class = @compact ? 'gl-mt-0' : 'gl-my-3'
+ %h1.gl-font-size-h-display.gl-line-height-36{ class: title_class }
+ = @title
+
+ - if description?
+ %p.gl-mt-3{ 'data-testid': 'empty-state-description' }
+ = description
+
+ - if @primary_button_text.present? || @secondary_button_text.present?
+ - button_wrapper_class = @compact.present? ? '' : 'gl-justify-content-center'
+ .gl-display-flex.gl-flex-wrap{ class: button_wrapper_class }
+
+ - if @primary_button_text.present?
+ = render Pajamas::ButtonComponent.new(variant: :confirm, href: @primary_button_link, button_options: { class: 'gl-ml-0!' }) do
+ = @primary_button_text
+
+ - if @secondary_button_text.present?
+ = render Pajamas::ButtonComponent.new(variant: :default, href: @secondary_button_link, button_options: { class: ('gl-ml-0!' unless @primary_button_text.present?) }) do
+ = @secondary_button_text
diff --git a/app/components/pajamas/empty_state_component.rb b/app/components/pajamas/empty_state_component.rb
new file mode 100644
index 00000000000..d0c0da12d3b
--- /dev/null
+++ b/app/components/pajamas/empty_state_component.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+module Pajamas
+ class EmptyStateComponent < Pajamas::Component
+ # @param [Boolean] compact
+ # @param [String] title
+ # @param [String] svg_path
+ # @param [String] primary_button_text
+ # @param [String] primary_button_link
+ # @param [String] secondary_button_text
+ # @param [String] secondary_button_link
+ # @param [Hash] empty_state_options
+ def initialize(
+ compact: false,
+ title: nil,
+ svg_path: nil,
+ primary_button_text: nil,
+ primary_button_link: nil,
+ secondary_button_text: nil,
+ secondary_button_link: nil,
+ empty_state_options: {}
+ )
+ @compact = compact
+ @title = title
+ @svg_path = svg_path.to_s
+ @primary_button_text = primary_button_text
+ @primary_button_link = primary_button_link
+ @secondary_button_text = secondary_button_text
+ @secondary_button_link = secondary_button_link
+ @empty_state_options = empty_state_options
+ end
+
+ renders_one :description
+ end
+end
diff --git a/app/controllers/admin/application_settings/appearances_controller.rb b/app/controllers/admin/application_settings/appearances_controller.rb
index 719e8e4a913..1a1e85d48da 100644
--- a/app/controllers/admin/application_settings/appearances_controller.rb
+++ b/app/controllers/admin/application_settings/appearances_controller.rb
@@ -69,7 +69,7 @@ class Admin::ApplicationSettings::AppearancesController < Admin::ApplicationCont
@appearance = Appearance.current || Appearance.new
end
- # Only allow a trusted parameter "white list" through.
+ # Only allow a trusted parameter "allow list" through.
def appearance_params
params.require(:appearance).permit(allowed_appearance_params)
end
diff --git a/app/controllers/admin/application_settings_controller.rb b/app/controllers/admin/application_settings_controller.rb
index dff1c04311d..f0b6d86d48d 100644
--- a/app/controllers/admin/application_settings_controller.rb
+++ b/app/controllers/admin/application_settings_controller.rb
@@ -30,7 +30,7 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController
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 :integrations, [:integrations, :slack_app_manifest_share, :slack_app_manifest_download]
feature_category :pages, [:lets_encrypt_terms_of_service]
feature_category :error_tracking, [:reset_error_tracking_access_token]
@@ -114,6 +114,14 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController
redirect_to ::Gitlab::LetsEncrypt.terms_of_service_url
end
+ def slack_app_manifest_share
+ redirect_to Slack::Manifest.share_url
+ end
+
+ def slack_app_manifest_download
+ send_data Slack::Manifest.to_json, type: :json, disposition: 'attachment', filename: 'slack_manifest.json'
+ end
+
private
def set_application_setting
diff --git a/app/controllers/admin/runners_controller.rb b/app/controllers/admin/runners_controller.rb
index f63616a2bea..b368ba6e495 100644
--- a/app/controllers/admin/runners_controller.rb
+++ b/app/controllers/admin/runners_controller.rb
@@ -3,32 +3,23 @@
class Admin::RunnersController < Admin::ApplicationController
include RunnerSetupScripts
- before_action :runner, except: [:index, :new, :tag_list, :runner_setup_scripts]
-
- before_action only: [:index] do
- push_frontend_feature_flag(:create_runner_workflow_for_admin, current_user)
- end
+ before_action :runner, only: [:show, :edit, :register, :update]
feature_category :runner
urgency :low
- def index
- end
+ def index; end
- def show
- end
+ def show; end
def edit
assign_projects
end
- def new
- render_404 unless Feature.enabled?(:create_runner_workflow_for_admin, current_user)
- end
+ def new; end
def register
- render_404 unless Feature.enabled?(:create_runner_workflow_for_admin, current_user) &&
- runner.registration_available?
+ render_404 unless runner.registration_available?
end
def update
diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb
index 3c96e49499f..b75ca2649c3 100644
--- a/app/controllers/admin/users_controller.rb
+++ b/app/controllers/admin/users_controller.rb
@@ -159,7 +159,7 @@ class Admin::UsersController < Admin::ApplicationController
end
def unlock
- if update_user(&:unlock_access!)
+ if unlock_user
redirect_back_or_admin_user(notice: _("Successfully unlocked"))
else
redirect_back_or_admin_user(alert: _("Error occurred. User was not unlocked"))
@@ -401,6 +401,11 @@ class Admin::UsersController < Admin::ApplicationController
_("You cannot impersonate a user who cannot log in")
end
end
+
+ # method overriden in EE
+ def unlock_user
+ update_user(&:unlock_access!)
+ end
end
Admin::UsersController.prepend_mod_with('Admin::UsersController')
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 08e4f4956df..8588273a41f 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -181,7 +181,7 @@ class ApplicationController < ActionController::Base
payload[:queue_duration_s] = request.env[::Gitlab::Middleware::RailsQueueDuration::GITLAB_RAILS_QUEUE_DURATION_KEY]
- payload[:response_bytes] = response.body_parts.sum(&:bytesize) if Feature.enabled?(:log_response_length)
+ payload[:response_bytes] = response.body_parts.sum(&:bytesize)
store_cloudflare_headers!(payload, request)
end
diff --git a/app/controllers/clusters/clusters_controller.rb b/app/controllers/clusters/clusters_controller.rb
index 2f6331a6822..b012a4e003e 100644
--- a/app/controllers/clusters/clusters_controller.rb
+++ b/app/controllers/clusters/clusters_controller.rb
@@ -2,7 +2,6 @@
class Clusters::ClustersController < Clusters::BaseController
include RoutableActions
- include MetricsDashboard
before_action :cluster, only: [:cluster_status, :show, :update, :destroy, :clear_cache]
before_action :user_cluster, only: [:connect]
diff --git a/app/controllers/concerns/integrations/params.rb b/app/controllers/concerns/integrations/params.rb
index 19e458307a1..53dd06ce638 100644
--- a/app/controllers/concerns/integrations/params.rb
+++ b/app/controllers/concerns/integrations/params.rb
@@ -43,6 +43,8 @@ module Integrations
:external_wiki_url,
:google_iap_service_account_json,
:google_iap_audience_client_id,
+ :group_confidential_mention_events,
+ :group_mention_events,
:incident_events,
:inherit_from_id,
# We're using `issues_events` and `merge_requests_events`
diff --git a/app/controllers/concerns/internal_redirect.rb b/app/controllers/concerns/internal_redirect.rb
index b803be67d2e..c3aa487c805 100644
--- a/app/controllers/concerns/internal_redirect.rb
+++ b/app/controllers/concerns/internal_redirect.rb
@@ -6,7 +6,7 @@ module InternalRedirect
def safe_redirect_path(path)
return unless path
# Verify that the string starts with a `/` and a known route character.
- return unless path =~ %r{\A/[-\w].*\z}
+ return unless %r{\A/[-\w].*\z}.match?(path)
uri = URI(path)
# Ignore anything path of the redirect except for the path, querystring and,
diff --git a/app/controllers/concerns/issuable_actions.rb b/app/controllers/concerns/issuable_actions.rb
index 0ad8a08960a..a326fa308ad 100644
--- a/app/controllers/concerns/issuable_actions.rb
+++ b/app/controllers/concerns/issuable_actions.rb
@@ -12,6 +12,7 @@ module IssuableActions
before_action :authorize_destroy_issuable!, only: :destroy
before_action :check_destroy_confirmation!, only: :destroy
before_action :authorize_admin_issuable!, only: :bulk_update
+ before_action :set_application_context!, only: :show
end
def show
@@ -226,6 +227,10 @@ module IssuableActions
render_404 unless can?(current_user, :"update_#{resource_name}", issuable)
end
+ def set_application_context!
+ # no-op. The logic is defined in EE module.
+ end
+
def bulk_update_params
clean_bulk_update_params(
params.require(:update).permit(bulk_update_permitted_keys)
diff --git a/app/controllers/concerns/membership_actions.rb b/app/controllers/concerns/membership_actions.rb
index 31675a58163..0c15c4d0d3f 100644
--- a/app/controllers/concerns/membership_actions.rb
+++ b/app/controllers/concerns/membership_actions.rb
@@ -16,7 +16,7 @@ module MembershipActions
member_data = if member.expires?
{
expires_soon: member.expires_soon?,
- expires_at_formatted: member.expires_at.to_time.in_time_zone.to_s(:medium)
+ expires_at_formatted: member.expires_at.to_time.in_time_zone.to_fs(:medium)
}
else
{}
diff --git a/app/controllers/concerns/metrics_dashboard.rb b/app/controllers/concerns/metrics_dashboard.rb
deleted file mode 100644
index 7a84c597424..00000000000
--- a/app/controllers/concerns/metrics_dashboard.rb
+++ /dev/null
@@ -1,126 +0,0 @@
-# frozen_string_literal: true
-
-# Provides an action which fetches a metrics dashboard according
-# to the parameters specified by the controller.
-module MetricsDashboard
- include RenderServiceResults
- include ChecksCollaboration
- include EnvironmentsHelper
-
- extend ActiveSupport::Concern
-
- def metrics_dashboard
- return not_found if Feature.enabled?(:remove_monitor_metrics)
-
- result = dashboard_finder.find(
- project_for_dashboard,
- current_user,
- decoded_params
- )
-
- if result
- result[:all_dashboards] = all_dashboards if include_all_dashboards?
- result[:metrics_data] = metrics_data(project_for_dashboard, environment_for_dashboard)
- end
-
- respond_to do |format|
- if result.nil?
- format.json { continue_polling_response }
- elsif result[:status] == :success
- format.json { render dashboard_success_response(result) }
- else
- format.json { render dashboard_error_response(result) }
- end
- end
- end
-
- private
-
- def all_dashboards
- dashboard_finder
- .find_all_paths(project_for_dashboard)
- .map { |dashboard| amend_dashboard(dashboard) }
- end
-
- def amend_dashboard(dashboard)
- project_dashboard = project_for_dashboard && !dashboard[:out_of_the_box_dashboard]
-
- dashboard[:can_edit] = project_dashboard ? can_edit?(dashboard) : false
- dashboard[:project_blob_path] = project_dashboard ? dashboard_project_blob_path(dashboard) : nil
- dashboard[:starred] = starred_dashboards.include?(dashboard[:path])
- dashboard[:user_starred_path] = project_for_dashboard ? user_starred_path(project_for_dashboard, dashboard[:path]) : nil
-
- dashboard
- end
-
- def user_starred_path(project, path)
- expose_path(api_v4_projects_metrics_user_starred_dashboards_path(id: project.id, params: { dashboard_path: path }))
- end
-
- def dashboard_project_blob_path(dashboard)
- project_blob_path(project_for_dashboard, File.join(project_for_dashboard.default_branch, dashboard.fetch(:path, "")))
- end
-
- def can_edit?(dashboard)
- can_collaborate_with_project?(project_for_dashboard, ref: project_for_dashboard.default_branch)
- end
-
- # Override in class to provide arguments to the finder.
- def metrics_dashboard_params
- {}
- end
-
- # Override in class if response requires complete list of
- # dashboards in addition to requested dashboard body.
- def include_all_dashboards?
- false
- end
-
- def dashboard_finder
- ::Gitlab::Metrics::Dashboard::Finder
- end
-
- def starred_dashboards
- @starred_dashboards ||=
- if project_for_dashboard.present?
- ::Metrics::UsersStarredDashboardsFinder
- .new(user: current_user, project: project_for_dashboard)
- .execute
- .map(&:dashboard_path)
- .to_set
- else
- Set.new
- end
- end
-
- # Project is not defined for group and admin level clusters.
- def project_for_dashboard
- defined?(project) ? project : nil
- end
-
- def environment_for_dashboard
- defined?(environment) ? environment : nil
- end
-
- def dashboard_success_response(result)
- {
- status: :ok,
- json: result.slice(:all_dashboards, :dashboard, :status, :metrics_data)
- }
- end
-
- def dashboard_error_response(result)
- {
- status: result[:http_status] || :bad_request,
- json: result.slice(:all_dashboards, :message, :status)
- }
- end
-
- def decoded_params
- params = metrics_dashboard_params
-
- params[:dashboard_path] = CGI.unescape(params[:dashboard_path]) if params[:dashboard_path]
-
- params
- end
-end
diff --git a/app/controllers/concerns/observability/content_security_policy.rb b/app/controllers/concerns/observability/content_security_policy.rb
index 1e25dc492a0..e51d986d36c 100644
--- a/app/controllers/concerns/observability/content_security_policy.rb
+++ b/app/controllers/concerns/observability/content_security_policy.rb
@@ -5,26 +5,23 @@ module Observability
extend ActiveSupport::Concern
included do
- content_security_policy_with_context do |p|
- current_group = if defined?(group)
- group
- else
- defined?(project) ? project&.group : nil
- end
-
- next if p.directives.blank? || !Feature.enabled?(:observability_group_tab, current_group)
+ content_security_policy do |p|
+ next if p.directives.blank?
default_frame_src = p.directives['frame-src'] || p.directives['default-src']
-
- # When ObservabilityUI is not authenticated, it needs to be able
- # to redirect to the GL sign-in page, hence '/users/sign_in' and '/oauth/authorize'
+ # When Gitlab Observability Backend is not authenticated, it needs to be able
+ # to redirect to the GitLab sign-in page, hence '/users/sign_in' and '/oauth/authorize'
frame_src_values = Array.wrap(default_frame_src) | [
Gitlab::Observability.observability_url,
Gitlab::Utils.append_path(Gitlab.config.gitlab.url, '/users/sign_in'),
Gitlab::Utils.append_path(Gitlab.config.gitlab.url, '/oauth/authorize')
]
-
p.frame_src(*frame_src_values)
+
+ default_connect_src = p.directives['connect-src'] || p.directives['default-src']
+ connect_src_values =
+ Array.wrap(default_connect_src) | [Gitlab::Observability.observability_url]
+ p.connect_src(*connect_src_values)
end
end
end
diff --git a/app/controllers/concerns/onboarding/status.rb b/app/controllers/concerns/onboarding/status.rb
new file mode 100644
index 00000000000..986f3f17847
--- /dev/null
+++ b/app/controllers/concerns/onboarding/status.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+module Onboarding
+ class Status
+ def initialize(user)
+ @user = user
+ end
+
+ def continue_full_onboarding?
+ false
+ end
+
+ def single_invite?
+ # If there are more than one member it will mean we have been invited to multiple projects/groups and
+ # are not able to distinguish which one we should putting the user in after registration
+ members.count == 1
+ end
+
+ def last_invited_member
+ members.last
+ end
+
+ def last_invited_member_source
+ last_invited_member&.source
+ end
+
+ def invite_with_tasks_to_be_done?
+ return false if members.empty?
+
+ MemberTask.for_members(members).exists?
+ end
+
+ private
+
+ attr_reader :user
+
+ def members
+ @members ||= user.members
+ end
+ end
+end
diff --git a/app/controllers/concerns/preview_markdown.rb b/app/controllers/concerns/preview_markdown.rb
index a7655efe7a9..7f1b961e92a 100644
--- a/app/controllers/concerns/preview_markdown.rb
+++ b/app/controllers/concerns/preview_markdown.rb
@@ -48,9 +48,7 @@ module PreviewMarkdown
end.merge(
requested_path: params[:path],
ref: params[:ref],
- # Disable comments in markdown for IE browsers because comments in IE
- # could allow script execution.
- allow_comments: !browser.ie?
+ allow_comments: false
)
end
diff --git a/app/controllers/concerns/redirects_for_missing_path_on_tree.rb b/app/controllers/concerns/redirects_for_missing_path_on_tree.rb
index 92574dfade9..97c23a2cf3c 100644
--- a/app/controllers/concerns/redirects_for_missing_path_on_tree.rb
+++ b/app/controllers/concerns/redirects_for_missing_path_on_tree.rb
@@ -1,8 +1,8 @@
# frozen_string_literal: true
module RedirectsForMissingPathOnTree
- def redirect_to_tree_root_for_missing_path(project, ref, path)
- redirect_to project_tree_path(project, ref), notice: missing_path_on_ref(path, ref)
+ def redirect_to_tree_root_for_missing_path(project, ref, path, ref_type: nil)
+ redirect_to project_tree_path(project, ref, ref_type: ref_type), notice: missing_path_on_ref(path, ref)
end
private
diff --git a/app/controllers/concerns/requires_allowlisted_monitoring_client.rb b/app/controllers/concerns/requires_allowlisted_monitoring_client.rb
new file mode 100644
index 00000000000..ad6d4dc548c
--- /dev/null
+++ b/app/controllers/concerns/requires_allowlisted_monitoring_client.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+module RequiresAllowlistedMonitoringClient
+ extend ActiveSupport::Concern
+
+ included do
+ before_action :validate_ip_allowlisted_or_valid_token!
+ end
+
+ private
+
+ def validate_ip_allowlisted_or_valid_token!
+ render_404 unless client_ip_allowlisted? || valid_token?
+ end
+
+ def client_ip_allowlisted?
+ # Always allow developers to access http://localhost:3000/-/metrics for
+ # debugging purposes
+ return true if Rails.env.development? && request.local?
+
+ ip_allowlist.any? { |e| e.include?(Gitlab::RequestContext.instance.client_ip) }
+ end
+
+ def ip_allowlist
+ @ip_allowlist ||= Settings.monitoring.ip_whitelist.map { |ip| IPAddr.new(ip) }
+ end
+
+ def valid_token?
+ token = params[:token].presence || request.headers['TOKEN']
+ token.present? &&
+ ActiveSupport::SecurityUtils.secure_compare(
+ token,
+ Gitlab::CurrentSettings.health_check_access_token
+ )
+ end
+
+ def render_404
+ render "errors/not_found", layout: "errors", status: :not_found
+ end
+end
diff --git a/app/controllers/concerns/requires_whitelisted_monitoring_client.rb b/app/controllers/concerns/requires_whitelisted_monitoring_client.rb
deleted file mode 100644
index ef3d281589a..00000000000
--- a/app/controllers/concerns/requires_whitelisted_monitoring_client.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-# frozen_string_literal: true
-
-module RequiresWhitelistedMonitoringClient
- extend ActiveSupport::Concern
-
- included do
- before_action :validate_ip_whitelisted_or_valid_token!
- end
-
- private
-
- def validate_ip_whitelisted_or_valid_token!
- render_404 unless client_ip_whitelisted? || valid_token?
- end
-
- def client_ip_whitelisted?
- # Always allow developers to access http://localhost:3000/-/metrics for
- # debugging purposes
- return true if Rails.env.development? && request.local?
-
- ip_whitelist.any? { |e| e.include?(Gitlab::RequestContext.instance.client_ip) }
- end
-
- def ip_whitelist
- @ip_whitelist ||= Settings.monitoring.ip_whitelist.map { |ip| IPAddr.new(ip) }
- end
-
- def valid_token?
- token = params[:token].presence || request.headers['TOKEN']
- token.present? &&
- ActiveSupport::SecurityUtils.secure_compare(
- token,
- Gitlab::CurrentSettings.health_check_access_token
- )
- end
-
- def render_404
- render "errors/not_found", layout: "errors", status: :not_found
- end
-end
diff --git a/app/controllers/concerns/uploads_actions.rb b/app/controllers/concerns/uploads_actions.rb
index 222fcc17222..29b61264322 100644
--- a/app/controllers/concerns/uploads_actions.rb
+++ b/app/controllers/concerns/uploads_actions.rb
@@ -110,7 +110,7 @@ module UploadsActions
if uploader_mounted?
model.public_send(upload_mount) # rubocop:disable GitlabSecurity/PublicSend
else
- build_uploader_from_upload || build_uploader_from_params
+ build_uploader_from_upload
end
end
strong_memoize_attr :uploader
@@ -125,21 +125,6 @@ module UploadsActions
end
# rubocop: enable CodeReuse/ActiveRecord
- def build_uploader_from_params
- return unless uploader = build_uploader
-
- uploader.retrieve_from_store!(params[:filename])
-
- Gitlab::AppJsonLogger.info(
- message: 'Deprecated usage of build_uploader_from_params',
- uploader_class: uploader.class.name,
- path: params[:filename],
- exists: uploader.exists?
- )
-
- uploader
- end
-
def build_uploader
return unless params[:secret] && params[:filename]
diff --git a/app/controllers/concerns/verifies_with_email.rb b/app/controllers/concerns/verifies_with_email.rb
index 45869c05f41..13378800ea9 100644
--- a/app/controllers/concerns/verifies_with_email.rb
+++ b/app/controllers/concerns/verifies_with_email.rb
@@ -25,6 +25,7 @@ module VerifiesWithEmail
if user.valid_password?(user_params[:password])
# The user has logged in successfully.
+
if user.unlock_token
# Prompt for the token if it already has been set
prompt_for_email_verification(user)
@@ -32,7 +33,8 @@ module VerifiesWithEmail
# require email verification if:
# - their account has been locked because of too many failed login attempts, or
# - they have logged in before, but never from the current ip address
- send_verification_instructions(user)
+ reason = 'sign in from untrusted IP address' unless user.access_locked?
+ send_verification_instructions(user, reason: reason)
prompt_for_email_verification(user)
end
end
@@ -75,13 +77,13 @@ module VerifiesWithEmail
super
end
- def send_verification_instructions(user)
+ def send_verification_instructions(user, reason: nil)
return if send_rate_limited?(user)
service = Users::EmailVerification::GenerateTokenService.new(attr: :unlock_token, user: user)
raw_token, encrypted_token = service.execute
user.unlock_token = encrypted_token
- user.lock_access!({ send_instructions: false })
+ user.lock_access!({ send_instructions: false, reason: reason })
send_verification_instructions_email(user, raw_token)
end
diff --git a/app/controllers/explore/projects_controller.rb b/app/controllers/explore/projects_controller.rb
index 577bd04d656..b3a1b510db9 100644
--- a/app/controllers/explore/projects_controller.rb
+++ b/app/controllers/explore/projects_controller.rb
@@ -10,6 +10,7 @@ class Explore::ProjectsController < Explore::ApplicationController
MIN_SEARCH_LENGTH = 3
PAGE_LIMIT = 50
+ RSS_ENTRIES_LIMIT = 20
before_action :set_non_archived_param
before_action :set_sorting
@@ -83,6 +84,14 @@ class Explore::ProjectsController < Explore::ApplicationController
params[:topic] = @topic.name
@projects = load_projects
+
+ respond_to do |format|
+ format.html
+ format.atom do
+ @projects = @projects.projects_order_id_desc.limit(RSS_ENTRIES_LIMIT)
+ render layout: 'xml'
+ end
+ end
end
private
diff --git a/app/controllers/graphql_controller.rb b/app/controllers/graphql_controller.rb
index 3d3b7f31dfd..5c0c2b4adf2 100644
--- a/app/controllers/graphql_controller.rb
+++ b/app/controllers/graphql_controller.rb
@@ -14,6 +14,7 @@ class GraphqlController < ApplicationController
# The query string of a standard IntrospectionQuery, used to compare incoming requests for caching
CACHED_INTROSPECTION_QUERY_STRING = CachedIntrospectionQuery.query_string
+ INTROSPECTION_QUERY_OPERATION_NAME = 'IntrospectionQuery'
# If a user is using their session to access GraphQL, we need to have session
# storage, since the admin-mode check is session wide.
@@ -58,7 +59,7 @@ class GraphqlController < ApplicationController
urgency :low, [:execute]
def execute
- result = if Feature.enabled?(:cache_introspection_query) && params[:operationName] == 'IntrospectionQuery'
+ result = if Feature.enabled?(:cache_introspection_query) && introspection_query?
execute_introspection_query
else
multiplex? ? execute_multiplex : execute_query
@@ -276,9 +277,6 @@ class GraphqlController < ApplicationController
def execute_introspection_query
if introspection_query_can_use_cache?
- Gitlab::AppLogger.info(message: "IntrospectionQueryCache hit")
- log_introspection_query_cache_details(true)
-
# Context for caching: https://gitlab.com/gitlab-org/gitlab/-/issues/409448
Rails.cache.fetch(
introspection_query_cache_key,
@@ -286,17 +284,12 @@ class GraphqlController < ApplicationController
execute_query.to_json
end
else
- Gitlab::AppLogger.info(message: "IntrospectionQueryCache miss")
- log_introspection_query_cache_details(false)
-
execute_query
end
end
def introspection_query_can_use_cache?
- graphql_query = GraphQL::Query.new(GitlabSchema, query: query, variables: build_variables(params[:variables]))
-
- CACHED_INTROSPECTION_QUERY_STRING == graphql_query.query_string.squish
+ CACHED_INTROSPECTION_QUERY_STRING == graphql_query_object.query_string.squish
end
def introspection_query_cache_key
@@ -306,13 +299,17 @@ class GraphqlController < ApplicationController
['introspection-query-cache', Gitlab.revision, context[:remove_deprecated]]
end
- def log_introspection_query_cache_details(can_use_introspection_query_cache)
- Gitlab::AppLogger.info(
- message: "IntrospectionQueryCache",
- can_use_introspection_query_cache: can_use_introspection_query_cache.to_s,
- query: query,
- variables: build_variables(params[:variables]).to_s,
- introspection_query_cache_key: introspection_query_cache_key.to_s
- )
+ def introspection_query?
+ if params.key?(:operationName)
+ params[:operationName] == INTROSPECTION_QUERY_OPERATION_NAME
+ else
+ # If we don't provide operationName param, we infer it from the query
+ graphql_query_object.selected_operation_name == INTROSPECTION_QUERY_OPERATION_NAME
+ end
+ end
+
+ def graphql_query_object
+ @graphql_query_object ||= GraphQL::Query.new(GitlabSchema, query: query,
+ variables: build_variables(params[:variables]))
end
end
diff --git a/app/controllers/groups/milestones_controller.rb b/app/controllers/groups/milestones_controller.rb
index 5f6b55ea928..cbed75019f2 100644
--- a/app/controllers/groups/milestones_controller.rb
+++ b/app/controllers/groups/milestones_controller.rb
@@ -9,6 +9,10 @@ class Groups::MilestonesController < Groups::ApplicationController
feature_category :team_planning
urgency :low
+ before_action do
+ push_frontend_feature_flag(:content_editor_on_issues, group)
+ end
+
def index
respond_to do |format|
format.html do
diff --git a/app/controllers/groups/runners_controller.rb b/app/controllers/groups/runners_controller.rb
index 4b52617d287..2dd0e36b65f 100644
--- a/app/controllers/groups/runners_controller.rb
+++ b/app/controllers/groups/runners_controller.rb
@@ -6,10 +6,6 @@ class Groups::RunnersController < Groups::ApplicationController
before_action :authorize_update_runner!, only: [:edit, :update, :destroy, :pause, :resume]
before_action :runner, only: [:edit, :update, :destroy, :pause, :resume, :show, :register]
- before_action only: [:index] do
- push_frontend_feature_flag(:create_runner_workflow_for_namespace, group)
- end
-
feature_category :runner
urgency :low
@@ -20,11 +16,9 @@ class Groups::RunnersController < Groups::ApplicationController
Gitlab::Tracking.event(self.class.name, 'index', user: current_user, namespace: @group)
end
- def show
- end
+ def show; end
- def edit
- end
+ def edit; end
def update
if Ci::Runners::UpdateRunnerService.new(@runner).execute(runner_params).success?
@@ -34,12 +28,10 @@ class Groups::RunnersController < Groups::ApplicationController
end
end
- def new
- render_404 unless create_runner_workflow_for_namespace_enabled?
- end
+ def new; end
def register
- render_404 unless create_runner_workflow_for_namespace_enabled? && runner.registration_available?
+ render_404 unless runner.registration_available?
end
private
@@ -67,10 +59,6 @@ class Groups::RunnersController < Groups::ApplicationController
render_404
end
-
- def create_runner_workflow_for_namespace_enabled?
- Feature.enabled?(:create_runner_workflow_for_namespace, group)
- end
end
Groups::RunnersController.prepend_mod
diff --git a/app/controllers/groups/settings/ci_cd_controller.rb b/app/controllers/groups/settings/ci_cd_controller.rb
index 4bbaf92b126..169caabf9d8 100644
--- a/app/controllers/groups/settings/ci_cd_controller.rb
+++ b/app/controllers/groups/settings/ci_cd_controller.rb
@@ -14,6 +14,7 @@ module Groups
feature_category :continuous_integration
before_action do
+ push_frontend_feature_flag(:ci_group_env_scope_graphql, group)
push_frontend_feature_flag(:ci_variables_pages, current_user)
end
diff --git a/app/controllers/groups/uploads_controller.rb b/app/controllers/groups/uploads_controller.rb
index cd1ebc39411..d29532f9d6f 100644
--- a/app/controllers/groups/uploads_controller.rb
+++ b/app/controllers/groups/uploads_controller.rb
@@ -9,7 +9,7 @@ class Groups::UploadsController < Groups::ApplicationController
before_action :authorize_upload_file!, only: [:create, :authorize]
before_action :verify_workhorse_api!, only: [:authorize]
- feature_category :groups_and_projects
+ feature_category :portfolio_management
urgency :low, [:show]
private
diff --git a/app/controllers/health_check_controller.rb b/app/controllers/health_check_controller.rb
index a2abed7ba4e..a85629985ba 100644
--- a/app/controllers/health_check_controller.rb
+++ b/app/controllers/health_check_controller.rb
@@ -1,5 +1,5 @@
# frozen_string_literal: true
class HealthCheckController < HealthCheck::HealthCheckController
- include RequiresWhitelistedMonitoringClient
+ include RequiresAllowlistedMonitoringClient
end
diff --git a/app/controllers/health_controller.rb b/app/controllers/health_controller.rb
index 5fac7c0d663..1381999ab4c 100644
--- a/app/controllers/health_controller.rb
+++ b/app/controllers/health_controller.rb
@@ -3,7 +3,7 @@
# rubocop:disable Rails/ApplicationController
class HealthController < ActionController::Base
protect_from_forgery with: :exception, prepend: true
- include RequiresWhitelistedMonitoringClient
+ include RequiresAllowlistedMonitoringClient
CHECKS = [
Gitlab::HealthChecks::MasterCheck
diff --git a/app/controllers/import/base_controller.rb b/app/controllers/import/base_controller.rb
index bcb6aed9e38..f3a0ce64839 100644
--- a/app/controllers/import/base_controller.rb
+++ b/app/controllers/import/base_controller.rb
@@ -82,7 +82,7 @@ class Import::BaseController < ApplicationController
# rubocop: disable CodeReuse/ActiveRecord
def find_already_added_projects(import_type)
- current_user.created_projects.where(import_type: import_type).with_import_state
+ current_user.created_projects.inc_routes.where(import_type: import_type).with_import_state
end
# rubocop: enable CodeReuse/ActiveRecord
diff --git a/app/controllers/import/bitbucket_server_controller.rb b/app/controllers/import/bitbucket_server_controller.rb
index 40664922d3d..e17cd00d053 100644
--- a/app/controllers/import/bitbucket_server_controller.rb
+++ b/app/controllers/import/bitbucket_server_controller.rb
@@ -103,8 +103,8 @@ class Import::BitbucketServerController < Import::BaseController
return render_validation_error('Missing project key') unless @project_key.present? && @repo_slug.present?
return render_validation_error('Missing repository slug') unless @repo_slug.present?
- return render_validation_error('Invalid project key') unless @project_key =~ VALID_BITBUCKET_PROJECT_CHARS
- return render_validation_error('Invalid repository slug') unless @repo_slug =~ VALID_BITBUCKET_CHARS
+ return render_validation_error('Invalid project key') unless VALID_BITBUCKET_PROJECT_CHARS.match?(@project_key)
+ return render_validation_error('Invalid repository slug') unless VALID_BITBUCKET_CHARS.match?(@repo_slug)
end
def render_validation_error(message)
diff --git a/app/controllers/metrics_controller.rb b/app/controllers/metrics_controller.rb
index 3dfa8d7b11e..9f41c092fa0 100644
--- a/app/controllers/metrics_controller.rb
+++ b/app/controllers/metrics_controller.rb
@@ -2,7 +2,7 @@
# rubocop:disable Rails/ApplicationController
class MetricsController < ActionController::Base
- include RequiresWhitelistedMonitoringClient
+ include RequiresAllowlistedMonitoringClient
protect_from_forgery with: :exception, prepend: true
diff --git a/app/controllers/oauth/authorizations_controller.rb b/app/controllers/oauth/authorizations_controller.rb
index 96a3fab7e1a..a1d4df6ff48 100644
--- a/app/controllers/oauth/authorizations_controller.rb
+++ b/app/controllers/oauth/authorizations_controller.rb
@@ -1,9 +1,11 @@
# frozen_string_literal: true
class Oauth::AuthorizationsController < Doorkeeper::AuthorizationsController
+ include Gitlab::GonHelper
include InitializesCurrentUserMode
include Gitlab::Utils::StrongMemoize
+ before_action :add_gon_variables
before_action :verify_confirmed_email!, :verify_admin_allowed!
layout 'profile'
diff --git a/app/controllers/organizations/application_controller.rb b/app/controllers/organizations/application_controller.rb
index 5f5a57d176b..43cc7014f62 100644
--- a/app/controllers/organizations/application_controller.rb
+++ b/app/controllers/organizations/application_controller.rb
@@ -4,6 +4,8 @@ module Organizations
class ApplicationController < ::ApplicationController
before_action :organization
+ layout 'organization'
+
private
def organization
diff --git a/app/controllers/organizations/organizations_controller.rb b/app/controllers/organizations/organizations_controller.rb
index 0eb5c3aa6fd..4781ef995b7 100644
--- a/app/controllers/organizations/organizations_controller.rb
+++ b/app/controllers/organizations/organizations_controller.rb
@@ -6,6 +6,8 @@ module Organizations
before_action { authorize_action!(:admin_organization) }
- def directory; end
+ def show; end
+
+ def groups_and_projects; end
end
end
diff --git a/app/controllers/profiles/accounts_controller.rb b/app/controllers/profiles/accounts_controller.rb
index eb64016379d..f618eafea38 100644
--- a/app/controllers/profiles/accounts_controller.rb
+++ b/app/controllers/profiles/accounts_controller.rb
@@ -7,6 +7,7 @@ class Profiles::AccountsController < Profiles::ApplicationController
urgency :low, [:show]
def show
+ push_frontend_feature_flag(:delay_delete_own_user)
render(locals: show_view_variables)
end
diff --git a/app/controllers/profiles/notifications_controller.rb b/app/controllers/profiles/notifications_controller.rb
index b663a75f04a..1477f8e0aac 100644
--- a/app/controllers/profiles/notifications_controller.rb
+++ b/app/controllers/profiles/notifications_controller.rb
@@ -45,7 +45,7 @@ class Profiles::NotificationsController < Profiles::ApplicationController
projects = project_notifications.map(&:source)
ActiveRecord::Associations::Preloader.new(
records: projects,
- associations: { namespace: [:route, :owner], group: [] }
+ associations: { namespace: [:route, :owner], group: [], creator: [] }
).call
Preloaders::UserMaxAccessLevelInProjectsPreloader.new(projects, current_user).execute
diff --git a/app/controllers/projects/alerting/notifications_controller.rb b/app/controllers/projects/alerting/notifications_controller.rb
index 89e8a261288..281ac14d3ce 100644
--- a/app/controllers/projects/alerting/notifications_controller.rb
+++ b/app/controllers/projects/alerting/notifications_controller.rb
@@ -72,7 +72,7 @@ module Projects
end
def endpoint_identifier
- params[:endpoint_identifier] || AlertManagement::HttpIntegration::LEGACY_IDENTIFIER
+ params[:endpoint_identifier] || AlertManagement::HttpIntegration::LEGACY_IDENTIFIERS
end
def notification_payload
diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb
index 28393e1f365..b41e4d11d24 100644
--- a/app/controllers/projects/blob_controller.rb
+++ b/app/controllers/projects/blob_controller.rb
@@ -49,6 +49,7 @@ class Projects::BlobController < Projects::ApplicationController
before_action do
push_frontend_feature_flag(:highlight_js, @project)
+ push_frontend_feature_flag(:highlight_js_worker, @project)
push_frontend_feature_flag(:explain_code_chat, current_user)
push_licensed_feature(:file_locks) if @project.licensed_feature_available?(:file_locks)
end
@@ -160,6 +161,8 @@ class Projects::BlobController < Projects::ApplicationController
end
def check_for_ambiguous_ref
+ return if Feature.enabled?(:redirect_with_ref_type, @project)
+
@ref_type = ref_type
if @ref_type == ExtractsRef::BRANCH_REF_TYPE && ambiguous_ref?(@project, @ref)
@@ -169,7 +172,17 @@ class Projects::BlobController < Projects::ApplicationController
end
def commit
- @commit ||= @repository.commit(@ref)
+ if Feature.enabled?(:redirect_with_ref_type, @project)
+ response = ::ExtractsRef::RequestedRef.new(@repository, ref_type: ref_type, ref: @ref).find
+ @commit = response[:commit]
+ @ref_type = response[:ref_type]
+
+ if response[:ambiguous]
+ return redirect_to(project_blob_path(@project, File.join(@ref_type ? @ref : @commit.id, @path), ref_type: @ref_type))
+ end
+ else
+ @commit ||= @repository.commit(@ref)
+ end
return render_404 unless @commit
end
diff --git a/app/controllers/projects/environments_controller.rb b/app/controllers/projects/environments_controller.rb
index 10d0d03e56d..4cc1ed092d2 100644
--- a/app/controllers/projects/environments_controller.rb
+++ b/app/controllers/projects/environments_controller.rb
@@ -12,12 +12,8 @@ class Projects::EnvironmentsController < Projects::ApplicationController
push_frontend_feature_flag(:environment_details_vue, @project)
end
- before_action only: [:index] do
- push_frontend_feature_flag(:kas_user_access_project, @project)
- end
-
- before_action only: [:edit, :new] do
- push_frontend_feature_flag(:environment_settings_to_graphql, @project)
+ before_action only: [:index, :edit, :new] do
+ push_frontend_feature_flag(:kubernetes_namespace_for_environment)
end
before_action :authorize_read_environment!
@@ -28,7 +24,7 @@ class Projects::EnvironmentsController < Projects::ApplicationController
before_action :environment, only: [:show, :edit, :update, :stop, :terminal, :terminal_websocket_authorize, :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 :set_kas_cookie, only: [:index], if: -> { current_user && request.format.html? }
+ before_action :set_kas_cookie, only: [:index, :edit, :new], if: -> { current_user && request.format.html? }
after_action :expire_etag_cache, only: [:cancel_auto_stop]
track_event :index, :folder, :show, :new, :edit, :create, :update, :stop, :cancel_auto_stop, :terminal,
diff --git a/app/controllers/projects/forks_controller.rb b/app/controllers/projects/forks_controller.rb
index ff3dc71b6cc..de2040afff3 100644
--- a/app/controllers/projects/forks_controller.rb
+++ b/app/controllers/projects/forks_controller.rb
@@ -65,9 +65,8 @@ class Projects::ForksController < Projects::ApplicationController
end
end
- # rubocop: disable CodeReuse/ActiveRecord
def create
- @forked_project = fork_namespace.projects.find_by(path: project.path)
+ @forked_project = fork_namespace.projects.find_by(path: project.path) # rubocop: disable CodeReuse/ActiveRecord
@forked_project = nil unless @forked_project && @forked_project.forked_from_project == project
@forked_project ||= fork_service.execute
@@ -96,7 +95,9 @@ class Projects::ForksController < Projects::ApplicationController
current_user: current_user
).execute
+ # rubocop: disable CodeReuse/ActiveRecord
forks.includes(:route, :creator, :group, :topics, namespace: [:route, :owner])
+ # rubocop: enable CodeReuse/ActiveRecord
end
def fork_service
@@ -130,15 +131,21 @@ class Projects::ForksController < Projects::ApplicationController
end
def load_namespaces_with_associations
+ # rubocop: disable CodeReuse/ActiveRecord
@load_namespaces_with_associations ||= fork_service.valid_fork_targets(only_groups: true).preload(:route)
+ # rubocop: enable CodeReuse/ActiveRecord
end
def memberships_hash
+ # rubocop: disable CodeReuse/ActiveRecord
current_user.members.where(source: load_namespaces_with_associations).index_by(&:source_id)
+ # rubocop: enable CodeReuse/ActiveRecord
end
def forked_projects_by_namespace(namespaces)
+ # rubocop: disable CodeReuse/ActiveRecord
project.forks.where(namespace: namespaces).includes(:namespace).index_by(&:namespace_id)
+ # rubocop: enable CodeReuse/ActiveRecord
end
end
diff --git a/app/controllers/projects/grafana_api_controller.rb b/app/controllers/projects/grafana_api_controller.rb
deleted file mode 100644
index 2cc6c6c35ba..00000000000
--- a/app/controllers/projects/grafana_api_controller.rb
+++ /dev/null
@@ -1,46 +0,0 @@
-# frozen_string_literal: true
-
-class Projects::GrafanaApiController < Projects::ApplicationController
- include RenderServiceResults
- include MetricsDashboard
-
- before_action :authorize_read_grafana!, only: :proxy
-
- feature_category :metrics
- urgency :low
-
- def proxy
- return not_found if Feature.enabled?(:remove_monitor_metrics)
-
- result = ::Grafana::ProxyService.new(
- project,
- params[:datasource_id],
- params[:proxy_path],
- prometheus_params
- ).execute
-
- return continue_polling_response if result.nil?
- return error_response(result) if result[:status] == :error
-
- success_response(result)
- end
-
- private
-
- def metrics_dashboard_params
- params.permit(:embedded, :grafana_url)
- end
-
- def query_params
- params.permit(:query, :start_time, :end_time, :step)
- end
-
- def prometheus_params
- query_params.to_h
- .except(:start_time, :end_time)
- .merge(
- start: query_params[:start_time],
- end: query_params[:end_time]
- )
- end
-end
diff --git a/app/controllers/projects/incidents_controller.rb b/app/controllers/projects/incidents_controller.rb
index 7121096bd77..6109e29b169 100644
--- a/app/controllers/projects/incidents_controller.rb
+++ b/app/controllers/projects/incidents_controller.rb
@@ -11,6 +11,7 @@ class Projects::IncidentsController < Projects::ApplicationController
push_force_frontend_feature_flag(:work_items_mvc, @project&.work_items_mvc_feature_flag_enabled?)
push_force_frontend_feature_flag(:work_items_mvc_2, @project&.work_items_mvc_2_feature_flag_enabled?)
push_frontend_feature_flag(:moved_mr_sidebar, project)
+ push_frontend_feature_flag(:move_close_into_dropdown, project)
end
feature_category :incident_management
diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb
index 6311907a859..6a45595580f 100644
--- a/app/controllers/projects/issues_controller.rb
+++ b/app/controllers/projects/issues_controller.rb
@@ -51,13 +51,14 @@ class Projects::IssuesController < Projects::ApplicationController
push_frontend_feature_flag(:service_desk_new_note_email_native_attachments, project)
push_frontend_feature_flag(:saved_replies, current_user)
push_frontend_feature_flag(:issues_grid_view)
+ push_frontend_feature_flag(:service_desk_ticket)
end
before_action only: [:index, :show] do
push_force_frontend_feature_flag(:work_items, project&.work_items_feature_flag_enabled?)
end
- before_action only: :index do
+ before_action only: [:index, :service_desk] do
push_frontend_feature_flag(:or_issuable_queries, project)
push_frontend_feature_flag(:frontend_caching, project&.group)
end
@@ -69,6 +70,7 @@ class Projects::IssuesController < Projects::ApplicationController
push_force_frontend_feature_flag(:work_items_mvc_2, project&.work_items_mvc_2_feature_flag_enabled?)
push_frontend_feature_flag(:epic_widget_edit_confirmation, project)
push_frontend_feature_flag(:moved_mr_sidebar, project)
+ push_frontend_feature_flag(:move_close_into_dropdown, project)
end
around_action :allow_gitaly_ref_name_caching, only: [:discussions]
diff --git a/app/controllers/projects/jobs_controller.rb b/app/controllers/projects/jobs_controller.rb
index 79ddcbf732d..4e0b304a2ee 100644
--- a/app/controllers/projects/jobs_controller.rb
+++ b/app/controllers/projects/jobs_controller.rb
@@ -21,7 +21,7 @@ class Projects::JobsController < Projects::ApplicationController
before_action :verify_proxy_request!, only: :proxy_websocket_authorize
before_action :push_job_log_jump_to_failures, only: [:show]
before_action :reject_if_build_artifacts_size_refreshing!, only: [:erase]
-
+ before_action :push_ai_build_failure_cause, only: [:show]
layout 'project'
feature_category :continuous_integration
@@ -258,4 +258,8 @@ class Projects::JobsController < Projects::ApplicationController
def push_job_log_jump_to_failures
push_frontend_feature_flag(:job_log_jump_to_failures, @project)
end
+
+ def push_ai_build_failure_cause
+ push_frontend_feature_flag(:ai_build_failure_cause, @project)
+ end
end
diff --git a/app/controllers/projects/merge_requests/conflicts_controller.rb b/app/controllers/projects/merge_requests/conflicts_controller.rb
index 76a233afa13..66a358963e2 100644
--- a/app/controllers/projects/merge_requests/conflicts_controller.rb
+++ b/app/controllers/projects/merge_requests/conflicts_controller.rb
@@ -15,7 +15,8 @@ class Projects::MergeRequests::ConflictsController < Projects::MergeRequests::Ap
respond_to do |format|
format.html do
@issuable_sidebar = serializer.represent(@merge_request, serializer: 'sidebar')
- Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter.track_loading_conflict_ui_action(user: current_user)
+ Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter
+ .track_loading_conflict_ui_action(user: current_user)
end
format.json do
@@ -23,12 +24,14 @@ class Projects::MergeRequests::ConflictsController < Projects::MergeRequests::Ap
render json: @conflicts_list
elsif @merge_request.can_be_merged?
render json: {
- message: _('The merge conflicts for this merge request have already been resolved. Please return to the merge request.'),
+ message: _('The merge conflicts for this merge request have already been resolved. ' \
+ 'Please return to the merge request.'),
type: 'error'
}
else
render json: {
- message: _('The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally.'),
+ message: _('The merge conflicts for this merge request cannot be resolved through GitLab. ' \
+ 'Please try to resolve them locally.'),
type: 'error'
}
end
@@ -52,7 +55,8 @@ class Projects::MergeRequests::ConflictsController < Projects::MergeRequests::Ap
Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter.track_resolve_conflict_action(user: current_user)
if @merge_request.can_be_merged?
- render status: :bad_request, json: { message: _('The merge conflicts for this merge request have already been resolved.') }
+ render status: :bad_request,
+ json: { message: _('The merge conflicts for this merge request have already been resolved.') }
return
end
@@ -71,6 +75,8 @@ class Projects::MergeRequests::ConflictsController < Projects::MergeRequests::Ap
private
+ alias_method :issuable, :merge_request
+
def authorize_can_resolve_conflicts!
@conflicts_list = ::MergeRequests::Conflicts::ListService.new(@merge_request)
diff --git a/app/controllers/projects/merge_requests/creations_controller.rb b/app/controllers/projects/merge_requests/creations_controller.rb
index 06381315614..6a3523b82d9 100644
--- a/app/controllers/projects/merge_requests/creations_controller.rb
+++ b/app/controllers/projects/merge_requests/creations_controller.rb
@@ -11,6 +11,12 @@ class Projects::MergeRequests::CreationsController < Projects::MergeRequests::Ap
before_action :apply_diff_view_cookie!, only: [:diffs, :diff_for_path]
before_action :build_merge_request, except: [:create]
+ before_action only: [:new] do
+ if can?(current_user, :fill_in_merge_request_template, project)
+ push_frontend_feature_flag(:fill_in_mr_template, project)
+ end
+ end
+
urgency :low, [
:new,
:create,
@@ -25,7 +31,9 @@ class Projects::MergeRequests::CreationsController < Projects::MergeRequests::Ap
end
def create
- @merge_request = ::MergeRequests::CreateService.new(project: project, current_user: current_user, params: merge_request_params).execute
+ @merge_request = ::MergeRequests::CreateService
+ .new(project: project, current_user: current_user, params: merge_request_params)
+ .execute
if @merge_request.valid?
incr_count_webide_merge_request
@@ -82,7 +90,10 @@ class Projects::MergeRequests::CreationsController < Projects::MergeRequests::Ap
def branch_to
@target_project = selected_target_project
- if @target_project && params[:ref].present? && Ability.allowed?(current_user, :create_merge_request_in, @target_project)
+ if @target_project &&
+ params[:ref].present? &&
+ Ability.allowed?(current_user, :create_merge_request_in, @target_project)
+
@ref = params[:ref]
@commit = @target_project.commit(Gitlab::Git::BRANCH_REF_PREFIX + @ref)
end
@@ -104,10 +115,13 @@ class Projects::MergeRequests::CreationsController < Projects::MergeRequests::Ap
def build_merge_request
params[:merge_request] ||= ActionController::Parameters.new(source_project: @project)
+ new_params = merge_request_params.merge(diff_options: diff_options)
# Gitaly N+1 issue: https://gitlab.com/gitlab-org/gitlab-foss/issues/58096
Gitlab::GitalyClient.allow_n_plus_1_calls do
- @merge_request = ::MergeRequests::BuildService.new(project: project, current_user: current_user, params: merge_request_params.merge(diff_options: diff_options)).execute
+ @merge_request = ::MergeRequests::BuildService
+ .new(project: project, current_user: current_user, params: new_params)
+ .execute
end
end
diff --git a/app/controllers/projects/merge_requests/diffs_controller.rb b/app/controllers/projects/merge_requests/diffs_controller.rb
index f3a01fd3223..5bd0063ab95 100644
--- a/app/controllers/projects/merge_requests/diffs_controller.rb
+++ b/app/controllers/projects/merge_requests/diffs_controller.rb
@@ -49,7 +49,8 @@ class Projects::MergeRequests::DiffsController < Projects::MergeRequests::Applic
pagination_data: diffs.pagination_data
}
- # NOTE: Any variables that would affect the resulting json needs to be added to the cache_context to avoid stale cache issues.
+ # NOTE: Any variables that would affect the resulting json needs to be added to the cache_context
+ # to avoid stale cache issues.
cache_context = [
current_user&.cache_key,
unfoldable_positions.map(&:to_h),
@@ -130,7 +131,8 @@ class Projects::MergeRequests::DiffsController < Projects::MergeRequests::Applic
# rubocop: disable CodeReuse/ActiveRecord
def commit
return unless commit_id = params[:commit_id].presence
- return unless @merge_request.all_commits.exists?(sha: commit_id) || @merge_request.recent_context_commits.map(&:id).include?(commit_id)
+ return unless @merge_request.all_commits.exists?(sha: commit_id) ||
+ @merge_request.recent_context_commits.map(&:id).include?(commit_id)
@commit ||= @project.commit(commit_id)
end
@@ -160,7 +162,10 @@ class Projects::MergeRequests::DiffsController < Projects::MergeRequests::Applic
end
end
- return @merge_request.context_commits_diff if show_only_context_commits? && !@merge_request.context_commits_diff.empty?
+ if show_only_context_commits? && !@merge_request.context_commits_diff.empty?
+ return @merge_request.context_commits_diff
+ end
+
return @merge_request.merge_head_diff if render_merge_ref_head_diff?
if @start_sha
diff --git a/app/controllers/projects/merge_requests/drafts_controller.rb b/app/controllers/projects/merge_requests/drafts_controller.rb
index ca6ab83b877..74c495261a3 100644
--- a/app/controllers/projects/merge_requests/drafts_controller.rb
+++ b/app/controllers/projects/merge_requests/drafts_controller.rb
@@ -27,17 +27,23 @@ class Projects::MergeRequests::DraftsController < Projects::MergeRequests::Appli
draft_note = create_service.execute
+ if draft_note.errors.present?
+ render json: { errors: draft_note.errors.full_messages.to_sentence }, status: :unprocessable_entity
+ return
+ end
+
prepare_notes_for_rendering(draft_note)
render json: DraftNoteSerializer.new(current_user: current_user).represent(draft_note)
end
def update
- draft_note.update!(draft_note_params)
-
- prepare_notes_for_rendering(draft_note)
-
- render json: DraftNoteSerializer.new(current_user: current_user).represent(draft_note)
+ if draft_note.update(draft_note_params)
+ prepare_notes_for_rendering(draft_note)
+ render json: DraftNoteSerializer.new(current_user: current_user).represent(draft_note)
+ else
+ render json: { errors: draft_note.errors.full_messages.to_sentence }, status: :unprocessable_entity
+ end
end
def destroy
@@ -57,10 +63,13 @@ class Projects::MergeRequests::DraftsController < Projects::MergeRequests::Appli
if Gitlab::Utils.to_boolean(approve_params[:approve])
unless merge_request.approved_by?(current_user)
- success = ::MergeRequests::ApprovalService.new(project: @project, current_user: current_user, params: approve_params).execute(merge_request)
+ success = ::MergeRequests::ApprovalService
+ .new(project: @project, current_user: current_user, params: approve_params)
+ .execute(merge_request)
unless success
- return render json: { message: _('An error occurred while approving, please try again.') }, status: :internal_server_error
+ return render json: { message: _('An error occurred while approving, please try again.') },
+ status: :internal_server_error
end
end
@@ -101,7 +110,9 @@ class Projects::MergeRequests::DraftsController < Projects::MergeRequests::Appli
# rubocop: disable CodeReuse/ActiveRecord
def merge_request
- @merge_request ||= MergeRequestsFinder.new(current_user, project_id: @project.id).find_by!(iid: params[:merge_request_id])
+ @merge_request ||= MergeRequestsFinder
+ .new(current_user, project_id: @project.id)
+ .find_by!(iid: params[:merge_request_id])
end
# rubocop: enable CodeReuse/ActiveRecord
diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index 60f619a8d20..2172c91fc76 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -41,19 +41,23 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
push_force_frontend_feature_flag(:content_editor_on_issues, project&.content_editor_on_issues_feature_flag_enabled?)
push_frontend_feature_flag(:core_security_mr_widget_counts, project)
push_frontend_feature_flag(:issue_assignees_widget, @project)
- push_frontend_feature_flag(:deprecate_vulnerabilities_feedback, @project)
push_frontend_feature_flag(:moved_mr_sidebar, project)
+ push_frontend_feature_flag(:sast_reports_in_inline_diff, project)
push_frontend_feature_flag(:mr_experience_survey, project)
push_frontend_feature_flag(:saved_replies, current_user)
push_frontend_feature_flag(:code_quality_inline_drawer, project)
- push_frontend_feature_flag(:auto_merge_labels_mr_widget, project)
push_force_frontend_feature_flag(:summarize_my_code_review, summarize_my_code_review_enabled?)
push_frontend_feature_flag(:mr_activity_filters, current_user)
push_frontend_feature_flag(:review_apps_redeploy_mr_widget, project)
- push_frontend_feature_flag(:comment_on_files, current_user)
push_frontend_feature_flag(:ci_job_failures_in_mr, project)
end
+ before_action only: [:edit] do
+ if can?(current_user, :fill_in_merge_request_template, project)
+ push_frontend_feature_flag(:fill_in_mr_template, project)
+ end
+ end
+
around_action :allow_gitaly_ref_name_caching, only: [:index, :show, :diffs, :discussions]
after_action :log_merge_request_show, only: [:show, :diffs]
@@ -124,16 +128,31 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
@merge_request.recent_context_commits
)
- per_page = [(params[:per_page] || MergeRequestDiff::COMMITS_SAFE_SIZE).to_i, MergeRequestDiff::COMMITS_SAFE_SIZE].min
- recent_commits = @merge_request.recent_commits(load_from_gitaly: true, limit: per_page, page: params[:page]).with_latest_pipeline(@merge_request.source_branch).with_markdown_cache
+ per_page = [
+ (params[:per_page] || MergeRequestDiff::COMMITS_SAFE_SIZE).to_i,
+ MergeRequestDiff::COMMITS_SAFE_SIZE
+ ].min
+ recent_commits = @merge_request
+ .recent_commits(load_from_gitaly: true, limit: per_page, page: params[:page])
+ .with_latest_pipeline(@merge_request.source_branch)
+ .with_markdown_cache
@next_page = recent_commits.next_page
@commits = set_commits_for_rendering(
recent_commits,
commits_count: @merge_request.commits_count
)
- commits_count = @merge_request.preparing? ? '-' : @merge_request.commits_count + @merge_request.context_commits_count
- render json: { html: view_to_html_string('projects/merge_requests/_commits'), next_page: @next_page, count: commits_count }
+ commits_count = if @merge_request.preparing?
+ '-'
+ else
+ @merge_request.commits_count + @merge_request.context_commits_count
+ end
+
+ render json: {
+ html: view_to_html_string('projects/merge_requests/_commits'),
+ next_page: @next_page,
+ count: commits_count
+ }
end
def pipelines
@@ -221,7 +240,9 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
end
def update
- @merge_request = ::MergeRequests::UpdateService.new(project: project, current_user: current_user, params: merge_request_update_params).execute(@merge_request)
+ @merge_request = ::MergeRequests::UpdateService
+ .new(project: project, current_user: current_user, params: merge_request_update_params)
+ .execute(@merge_request)
respond_to do |format|
format.html do
@@ -287,7 +308,9 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
end
def assign_related_issues
- result = ::MergeRequests::AssignIssuesService.new(project: project, current_user: current_user, params: { merge_request: @merge_request }).execute
+ result = ::MergeRequests::AssignIssuesService
+ .new(project: project, current_user: current_user, params: { merge_request: @merge_request })
+ .execute
case result[:count]
when 0
@@ -317,7 +340,8 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
end
def rebase
- @merge_request.rebase_async(current_user.id, skip_ci: Gitlab::Utils.to_boolean(merge_params[:skip_ci], default: false))
+ @merge_request
+ .rebase_async(current_user.id, skip_ci: Gitlab::Utils.to_boolean(merge_params[:skip_ci], default: false))
head :ok
rescue MergeRequest::RebaseLockTimeout => e
@@ -334,7 +358,8 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
IssuableExportCsvWorker.perform_async(:merge_request, current_user.id, project.id, finder_options.to_h) # rubocop:disable CodeReuse/Worker
index_path = project_merge_requests_path(project)
- message = _('Your CSV export has started. It will be emailed to %{email} when complete.') % { email: current_user.notification_email_or_default }
+ message = _('Your CSV export has started. It will be emailed to %{email} when complete.') %
+ { email: current_user.notification_email_or_default }
redirect_to(index_path, notice: message)
end
@@ -432,10 +457,15 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
@commits_count = @merge_request.commits_count + @merge_request.context_commits_count
@diffs_count = get_diffs_count
@issuable_sidebar = serializer.represent(@merge_request, serializer: 'sidebar')
- @current_user_data = Gitlab::Json.dump(UserSerializer.new(project: @project).represent(current_user, {}, MergeRequestCurrentUserEntity))
+ @current_user_data = Gitlab::Json
+ .dump(UserSerializer.new(project: @project)
+ .represent(current_user, {}, MergeRequestCurrentUserEntity))
@show_whitespace_default = current_user.nil? || current_user.show_whitespace_in_diffs
@file_by_file_default = current_user&.view_diffs_file_by_file
- @coverage_path = coverage_reports_project_merge_request_path(@project, @merge_request, format: :json) if @merge_request.has_coverage_reports?
+ if @merge_request.has_coverage_reports?
+ @coverage_path = coverage_reports_project_merge_request_path(@project, @merge_request, format: :json)
+ end
+
@update_current_user_path = expose_path(api_v4_user_preferences_path)
@endpoint_metadata_url = endpoint_metadata_url(@project, @merge_request)
@endpoint_diff_batch_url = endpoint_diff_batch_url(@project, @merge_request)
@@ -478,12 +508,18 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
def merge!
# Disable the CI check if auto_merge_strategy is specified since we have
# to wait until CI completes to know
- unless @merge_request.mergeable?(skip_ci_check: auto_merge_requested?)
+ skipped_checks = @merge_request.skipped_mergeable_checks(
+ auto_merge_requested: auto_merge_requested?,
+ auto_merge_strategy: params[:auto_merge_strategy]
+ )
+
+ unless @merge_request.mergeable?(**skipped_checks)
return :failed
end
squashing = params.fetch(:squash, false)
- merge_service = ::MergeRequests::MergeService.new(project: @project, current_user: current_user, params: merge_params)
+ merge_service = ::MergeRequests::MergeService
+ .new(project: @project, current_user: current_user, params: merge_params)
unless merge_service.hooks_validation_pass?(@merge_request, validate_squash_message: squashing)
return :hook_validation_error
@@ -500,7 +536,10 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
AutoMergeService.new(project, current_user, merge_params).update(merge_request)
else
AutoMergeService.new(project, current_user, merge_params)
- .execute(merge_request, params[:auto_merge_strategy] || AutoMergeService::STRATEGY_MERGE_WHEN_PIPELINE_SUCCEEDS)
+ .execute(
+ merge_request,
+ params[:auto_merge_strategy] || AutoMergeService::STRATEGY_MERGE_WHEN_PIPELINE_SUCCEEDS
+ )
end
else
@merge_request.merge_async(current_user.id, merge_params)
@@ -595,7 +634,9 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
def endpoint_diff_batch_url(project, merge_request)
per_page = current_user&.view_diffs_file_by_file ? '1' : '5'
- params = request.query_parameters.merge(view: 'inline', diff_head: true, w: show_whitespace, page: '0', per_page: per_page)
+ params = request
+ .query_parameters
+ .merge(view: 'inline', diff_head: true, w: show_whitespace, page: '0', per_page: per_page)
params[:ck] = merge_request.merge_head_diff&.id if merge_request.diffs_batch_cache_with_max_age?
diffs_batch_project_json_merge_request_path(project, merge_request, 'json', params)
diff --git a/app/controllers/projects/milestones_controller.rb b/app/controllers/projects/milestones_controller.rb
index 35b65dbce7e..1f4e5b54500 100644
--- a/app/controllers/projects/milestones_controller.rb
+++ b/app/controllers/projects/milestones_controller.rb
@@ -24,6 +24,10 @@ class Projects::MilestonesController < Projects::ApplicationController
feature_category :team_planning
urgency :low
+ before_action do
+ push_frontend_feature_flag(:content_editor_on_issues, @project)
+ end
+
def index
@sort = params[:sort] || 'due_date_asc'
@milestones = milestones.sort_by_attribute(@sort)
diff --git a/app/controllers/projects/ml/candidates_controller.rb b/app/controllers/projects/ml/candidates_controller.rb
index ed7155fc5f4..9905e454acb 100644
--- a/app/controllers/projects/ml/candidates_controller.rb
+++ b/app/controllers/projects/ml/candidates_controller.rb
@@ -3,7 +3,9 @@
module Projects
module Ml
class CandidatesController < ApplicationController
- before_action :check_feature_enabled, :set_candidate
+ before_action :set_candidate
+ before_action :check_read, only: [:show]
+ before_action :check_write, only: [:destroy]
feature_category :mlops
@@ -26,9 +28,13 @@ module Projects
render_404 unless @candidate.present?
end
- def check_feature_enabled
+ def check_read
render_404 unless can?(current_user, :read_model_experiments, @project)
end
+
+ def check_write
+ render_404 unless can?(current_user, :write_model_experiments, @project)
+ end
end
end
end
diff --git a/app/controllers/projects/ml/experiments_controller.rb b/app/controllers/projects/ml/experiments_controller.rb
index a620e9919e7..85e7f63779c 100644
--- a/app/controllers/projects/ml/experiments_controller.rb
+++ b/app/controllers/projects/ml/experiments_controller.rb
@@ -5,7 +5,8 @@ module Projects
class ExperimentsController < ::Projects::ApplicationController
include Projects::Ml::ExperimentsHelper
- before_action :check_feature_enabled
+ before_action :check_read, only: [:show, :index]
+ before_action :check_write, only: [:destroy]
before_action :set_experiment, only: [:show, :destroy]
feature_category :mlops
@@ -55,10 +56,14 @@ module Projects
private
- def check_feature_enabled
+ def check_read
render_404 unless can?(current_user, :read_model_experiments, @project)
end
+ def check_write
+ render_404 unless can?(current_user, :write_model_experiments, @project)
+ end
+
def set_experiment
@experiment = ::Ml::Experiment.by_project_id_and_iid(@project.id, params[:iid])
diff --git a/app/controllers/projects/ml/models_controller.rb b/app/controllers/projects/ml/models_controller.rb
new file mode 100644
index 00000000000..77855b73cbd
--- /dev/null
+++ b/app/controllers/projects/ml/models_controller.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+module Projects
+ module Ml
+ class ModelsController < ::Projects::ApplicationController
+ before_action :check_feature_enabled
+ feature_category :mlops
+
+ def index
+ @models = ::Projects::Ml::ModelFinder.new(@project).execute
+ end
+
+ private
+
+ def check_feature_enabled
+ render_404 unless can?(current_user, :read_model_registry, @project)
+ end
+ end
+ end
+end
diff --git a/app/controllers/projects/notes_controller.rb b/app/controllers/projects/notes_controller.rb
index 054e8c302c9..7fcdf220bd2 100644
--- a/app/controllers/projects/notes_controller.rb
+++ b/app/controllers/projects/notes_controller.rb
@@ -1,6 +1,7 @@
# frozen_string_literal: true
class Projects::NotesController < Projects::ApplicationController
+ extend Gitlab::Utils::Override
include RendersNotes
include NotesActions
include NotesHelper
@@ -11,10 +12,30 @@ class Projects::NotesController < Projects::ApplicationController
before_action :authorize_create_note!, only: [:create]
before_action :authorize_resolve_note!, only: [:resolve, :unresolve]
- feature_category :team_planning
+ feature_category :team_planning, [:index, :create, :update, :destroy, :delete_attachment, :toggle_award_emoji]
+ feature_category :code_review_workflow, [:resolve, :unresolve, :outdated_line_change]
urgency :medium, [:index]
urgency :low, [:create, :update, :destroy, :resolve, :unresolve, :toggle_award_emoji, :outdated_line_change]
+ override :feature_category
+ def feature_category
+ if %w[index create].include?(params[:action])
+ category = feature_category_override_for_target_type(params[:target_type])
+ return category if category
+ end
+
+ super
+ end
+
+ def feature_category_override_for_target_type(target_type)
+ case target_type
+ when 'merge_request'
+ 'code_review_workflow'
+ when 'commit', 'project_snippet'
+ 'source_code_management'
+ end
+ end
+
def delete_attachment
note.remove_attachment!
note.update_attribute(:attachment, nil)
diff --git a/app/controllers/projects/pages_controller.rb b/app/controllers/projects/pages_controller.rb
index 332d33b8e52..6cfbb61fbb2 100644
--- a/app/controllers/projects/pages_controller.rb
+++ b/app/controllers/projects/pages_controller.rb
@@ -1,8 +1,6 @@
# frozen_string_literal: true
class Projects::PagesController < Projects::ApplicationController
- layout :resolve_layout
-
before_action :require_pages_enabled!
before_action :authorize_read_pages!, only: [:show]
before_action :authorize_update_pages!, except: [:show, :destroy]
@@ -10,10 +8,6 @@ class Projects::PagesController < Projects::ApplicationController
feature_category :pages
- before_action do
- push_frontend_feature_flag(:show_pages_in_deployments_menu, current_user, type: :experiment)
- end
-
def new
@pipeline_wizard_data = {
project_path: @project.full_path,
@@ -66,10 +60,6 @@ class Projects::PagesController < Projects::ApplicationController
private
- def resolve_layout
- 'project_settings' unless Feature.enabled?(:show_pages_in_deployments_menu, current_user, type: :experiment)
- end
-
def project_params
params.require(:project).permit(project_params_attributes)
end
diff --git a/app/controllers/projects/pipeline_schedules_controller.rb b/app/controllers/projects/pipeline_schedules_controller.rb
index fb332fec3b5..4fd307b5105 100644
--- a/app/controllers/projects/pipeline_schedules_controller.rb
+++ b/app/controllers/projects/pipeline_schedules_controller.rb
@@ -25,14 +25,25 @@ class Projects::PipelineSchedulesController < Projects::ApplicationController
end
def create
- @schedule = Ci::CreatePipelineScheduleService
- .new(@project, current_user, schedule_params)
- .execute
-
- if @schedule.persisted?
- redirect_to pipeline_schedules_path(@project)
+ if ::Feature.enabled?(:ci_refactoring_pipeline_schedule_create_service, @project)
+ response = Ci::PipelineSchedules::CreateService.new(@project, current_user, schedule_params).execute
+ @schedule = response.payload
+
+ if response.success?
+ redirect_to pipeline_schedules_path(@project)
+ else
+ render :new
+ end
else
- render :new
+ @schedule = Ci::CreatePipelineScheduleService
+ .new(@project, current_user, schedule_params)
+ .execute
+
+ if @schedule.persisted?
+ redirect_to pipeline_schedules_path(@project)
+ else
+ render :new
+ end
end
end
diff --git a/app/controllers/projects/pipelines_controller.rb b/app/controllers/projects/pipelines_controller.rb
index 98e6459b543..a96ee2215c2 100644
--- a/app/controllers/projects/pipelines_controller.rb
+++ b/app/controllers/projects/pipelines_controller.rb
@@ -22,7 +22,6 @@ class Projects::PipelinesController < Projects::ApplicationController
before_action :authorize_update_pipeline!, only: [:retry, :cancel]
before_action :ensure_pipeline, only: [:show, :downloadable_artifacts]
before_action :reject_if_build_artifacts_size_refreshing!, only: [:destroy]
- before_action :push_frontend_feature_flags, only: [:show, :builds, :dag, :failures, :test_report]
# Will be removed with https://gitlab.com/gitlab-org/gitlab/-/issues/225596
before_action :redirect_for_legacy_scope_filter, only: [:index], if: -> { request.format.html? }
@@ -350,10 +349,6 @@ class Projects::PipelinesController < Projects::ApplicationController
def tracking_project_source
project
end
-
- def push_frontend_feature_flags
- push_frontend_feature_flag(:pipeline_details_header_vue, @project)
- end
end
Projects::PipelinesController.prepend_mod_with('Projects::PipelinesController')
diff --git a/app/controllers/projects/runners_controller.rb b/app/controllers/projects/runners_controller.rb
index 2b2c2cef8e2..db19ca23e9f 100644
--- a/app/controllers/projects/runners_controller.rb
+++ b/app/controllers/projects/runners_controller.rb
@@ -12,8 +12,7 @@ class Projects::RunnersController < Projects::ApplicationController
redirect_to project_settings_ci_cd_path(@project, anchor: 'js-runners-settings')
end
- def edit
- end
+ def edit; end
def update
if Ci::Runners::UpdateRunnerService.new(@runner).execute(runner_params).success?
@@ -23,12 +22,10 @@ class Projects::RunnersController < Projects::ApplicationController
end
end
- def new
- render_404 unless create_runner_workflow_for_namespace_enabled?
- end
+ def new; end
def register
- render_404 unless create_runner_workflow_for_namespace_enabled? && runner.registration_available?
+ render_404 unless runner.registration_available?
end
def destroy
@@ -55,8 +52,7 @@ class Projects::RunnersController < Projects::ApplicationController
end
end
- def show
- end
+ def show; end
def toggle_shared_runners
update_params = { shared_runners_enabled: !project.shared_runners_enabled }
@@ -84,8 +80,4 @@ class Projects::RunnersController < Projects::ApplicationController
def runner_params
params.require(:runner).permit(Ci::Runner::FORM_EDITABLE)
end
-
- def create_runner_workflow_for_namespace_enabled?
- Feature.enabled?(:create_runner_workflow_for_namespace, project.namespace)
- end
end
diff --git a/app/controllers/projects/service_desk/custom_email_controller.rb b/app/controllers/projects/service_desk/custom_email_controller.rb
new file mode 100644
index 00000000000..fb5e87f9a97
--- /dev/null
+++ b/app/controllers/projects/service_desk/custom_email_controller.rb
@@ -0,0 +1,84 @@
+# frozen_string_literal: true
+
+module Projects
+ module ServiceDesk
+ class CustomEmailController < Projects::ApplicationController
+ before_action :check_feature_flag_enabled
+ before_action :authorize_admin_project!
+
+ feature_category :service_desk
+ urgency :low
+
+ def create
+ response = ::ServiceDesk::CustomEmails::CreateService.new(
+ project: project,
+ current_user: current_user,
+ params: params
+ ).execute
+
+ json_response(service_response: response)
+ end
+
+ def update
+ response = ServiceDeskSettings::UpdateService.new(project, current_user, update_setting_params).execute
+
+ if response.error?
+ json_response(
+ error_message: s_("ServiceDesk|Cannot update custom email"),
+ status: :unprocessable_entity
+ )
+ return
+ end
+
+ json_response
+ end
+
+ def destroy
+ response = ::ServiceDesk::CustomEmails::DestroyService.new(
+ project: project,
+ current_user: current_user
+ ).execute
+
+ json_response(service_response: response)
+ end
+
+ def show
+ json_response
+ end
+
+ private
+
+ def update_setting_params
+ params.permit(:custom_email_enabled)
+ end
+
+ def json_response(error_message: nil, status: :ok, service_response: nil)
+ if service_response.present?
+ status = service_response.success? ? :ok : :unprocessable_entity
+ error_message = service_response.message
+ end
+
+ respond_to do |format|
+ format.json { render json: custom_email_attributes(error_message: error_message), status: status }
+ end
+ end
+
+ def custom_email_attributes(error_message:)
+ setting = project.service_desk_setting
+
+ {
+ custom_email: setting&.custom_email,
+ custom_email_enabled: setting&.custom_email_enabled || false,
+ custom_email_verification_state: setting&.custom_email_verification&.state,
+ custom_email_verification_error: setting&.custom_email_verification&.error,
+ custom_email_smtp_address: setting&.custom_email_credential&.smtp_address,
+ error_message: error_message
+ }
+ end
+
+ def check_feature_flag_enabled
+ render_404 unless Feature.enabled?(:service_desk_custom_email, @project)
+ end
+ end
+ end
+end
diff --git a/app/controllers/projects/service_desk_controller.rb b/app/controllers/projects/service_desk_controller.rb
index 8f576b8d72b..b1e30e7a45b 100644
--- a/app/controllers/projects/service_desk_controller.rb
+++ b/app/controllers/projects/service_desk_controller.rb
@@ -13,12 +13,12 @@ class Projects::ServiceDeskController < Projects::ApplicationController
def update
Projects::UpdateService.new(project, current_user, { service_desk_enabled: params[:service_desk_enabled] }).execute
- result = ServiceDeskSettings::UpdateService.new(project, current_user, setting_params).execute
+ response = ServiceDeskSettings::UpdateService.new(project, current_user, setting_params).execute
- if result[:status] == :success
+ if response.success?
json_response
else
- render json: { message: result[:message] }, status: :unprocessable_entity
+ render json: { message: response.message }, status: :unprocessable_entity
end
end
diff --git a/app/controllers/projects/settings/ci_cd_controller.rb b/app/controllers/projects/settings/ci_cd_controller.rb
index ce760051f79..0e892ef3faa 100644
--- a/app/controllers/projects/settings/ci_cd_controller.rb
+++ b/app/controllers/projects/settings/ci_cd_controller.rb
@@ -14,10 +14,6 @@ module Projects
before_action do
push_frontend_feature_flag(:ci_variables_pages, current_user)
- push_frontend_feature_flag(:ci_limit_environment_scope, @project)
- push_frontend_feature_flag(:create_runner_workflow_for_namespace, @project.namespace)
- push_frontend_feature_flag(:frozen_outbound_job_token_scopes, @project)
- push_frontend_feature_flag(:frozen_outbound_job_token_scopes_override, @project)
end
helper_method :highlight_badge
diff --git a/app/controllers/projects/tracing_controller.rb b/app/controllers/projects/tracing_controller.rb
new file mode 100644
index 00000000000..d1218ebf344
--- /dev/null
+++ b/app/controllers/projects/tracing_controller.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Projects
+ class TracingController < Projects::ApplicationController
+ include ::Observability::ContentSecurityPolicy
+
+ feature_category :tracing
+
+ before_action :check_tracing_enabled
+
+ def index; end
+
+ private
+
+ def check_tracing_enabled
+ render_404 unless Gitlab::Observability.tracing_enabled?(project)
+ end
+ end
+end
diff --git a/app/controllers/projects/tree_controller.rb b/app/controllers/projects/tree_controller.rb
index c8f698d6193..b961339111b 100644
--- a/app/controllers/projects/tree_controller.rb
+++ b/app/controllers/projects/tree_controller.rb
@@ -12,12 +12,14 @@ class Projects::TreeController < Projects::ApplicationController
before_action :require_non_empty_project, except: [:new, :create]
before_action :assign_ref_vars
+ before_action :find_requested_ref, only: [:show]
before_action :assign_dir_vars, only: [:create_dir]
before_action :authorize_read_code!
before_action :authorize_edit_tree!, only: [:create_dir]
before_action do
push_frontend_feature_flag(:highlight_js, @project)
+ push_frontend_feature_flag(:highlight_js_worker, @project)
push_frontend_feature_flag(:explain_code_chat, current_user)
push_licensed_feature(:file_locks) if @project.licensed_feature_available?(:file_locks)
end
@@ -28,18 +30,20 @@ class Projects::TreeController < Projects::ApplicationController
def show
return render_404 unless @commit
- @ref_type = ref_type
- if @ref_type == BRANCH_REF_TYPE && ambiguous_ref?(@project, @ref)
- branch = @project.repository.find_branch(@ref)
- if branch
- redirect_to project_tree_path(@project, branch.target)
- return
+ unless Feature.enabled?(:redirect_with_ref_type, @project)
+ @ref_type = ref_type
+ if @ref_type == BRANCH_REF_TYPE && ambiguous_ref?(@project, @ref)
+ branch = @project.repository.find_branch(@ref)
+ if branch
+ redirect_to project_tree_path(@project, branch.target)
+ return
+ end
end
end
if tree.entries.empty?
if @repository.blob_at(@commit.id, @path)
- redirect_to project_blob_path(@project, File.join(@ref, @path))
+ redirect_to project_blob_path(@project, File.join(@ref, @path), ref_type: @ref_type)
elsif @path.present?
redirect_to_tree_root_for_missing_path(@project, @ref, @path)
end
@@ -59,6 +63,23 @@ class Projects::TreeController < Projects::ApplicationController
private
+ def find_requested_ref
+ return unless Feature.enabled?(:redirect_with_ref_type, @project)
+
+ @ref_type = ref_type
+ if @ref_type.present?
+ @tree = @repo.tree(@ref, @path, ref_type: @ref_type)
+ else
+ response = ExtractsPath::RequestedRef.new(@repository, ref_type: nil, ref: @ref).find
+ @ref_type = response[:ref_type]
+ @commit = response[:commit]
+
+ if response[:ambiguous]
+ redirect_to(project_tree_path(@project, File.join(@ref_type ? @ref : @commit.id, @path), ref_type: @ref_type))
+ end
+ end
+ end
+
def redirect_renamed_default_branch?
action_name == 'show'
end
diff --git a/app/controllers/projects/uploads_controller.rb b/app/controllers/projects/uploads_controller.rb
index 8f4987a07f6..48399e17b25 100644
--- a/app/controllers/projects/uploads_controller.rb
+++ b/app/controllers/projects/uploads_controller.rb
@@ -11,7 +11,7 @@ class Projects::UploadsController < Projects::ApplicationController
before_action :authorize_upload_file!, only: [:create, :authorize]
before_action :verify_workhorse_api!, only: [:authorize]
- feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
+ feature_category :team_planning
private
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index 81f205a6457..51f6158d9c0 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -38,9 +38,11 @@ class ProjectsController < Projects::ApplicationController
before_action do
push_frontend_feature_flag(:highlight_js, @project)
+ push_frontend_feature_flag(:highlight_js_worker, @project)
push_frontend_feature_flag(:remove_monitor_metrics, @project)
push_frontend_feature_flag(:explain_code_chat, current_user)
push_frontend_feature_flag(:ci_namespace_catalog_experimental, @project)
+ push_frontend_feature_flag(:service_desk_custom_email, @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?)
@@ -172,7 +174,9 @@ class ProjectsController < Projects::ApplicationController
flash.now[:alert] = _("Project '%{project_name}' queued for deletion.") % { project_name: @project.name }
end
- if ambiguous_ref?(@project, @ref)
+ if Feature.enabled?(:redirect_with_ref_type, @project)
+ @ref_type = 'heads'
+ elsif ambiguous_ref?(@project, @ref)
branch = @project.repository.find_branch(@ref)
# The files view would render a ref other than the default branch
diff --git a/app/controllers/registrations/welcome_controller.rb b/app/controllers/registrations/welcome_controller.rb
index 76aa4afbe80..76f181e3ce8 100644
--- a/app/controllers/registrations/welcome_controller.rb
+++ b/app/controllers/registrations/welcome_controller.rb
@@ -7,10 +7,10 @@ module Registrations
include ::Gitlab::Utils::StrongMemoize
layout 'minimal'
- skip_before_action :authenticate_user!, :required_signup_info, :check_two_factor_requirement, only: [:show, :update]
- before_action :require_current_user
+ skip_before_action :required_signup_info, :check_two_factor_requirement
helper_method :welcome_update_params
+ helper_method :onboarding_status
feature_category :user_management
@@ -25,7 +25,7 @@ module Registrations
if result.success?
track_event('successfully_submitted_form')
- finish_onboarding_on_welcome_page unless complete_signup_onboarding?
+ successful_update_hooks
redirect_to update_success_path
else
@@ -35,14 +35,10 @@ module Registrations
private
- def registering_from_invite?(members)
- # If there are more than one member it will mean we have been invited to multiple projects/groups and
- # are not able to distinguish which one we should putting the user in after registration
- members.count == 1 && members.last.source.present?
- end
+ def authenticate_user!
+ return if current_user
- def require_current_user
- return redirect_to new_user_registration_path unless current_user
+ redirect_to new_user_registration_path
end
def completed_welcome_step?
@@ -54,33 +50,28 @@ module Registrations
end
def path_for_signed_in_user(user)
- stored_location_for(user) || members_activity_path(user.members)
- end
-
- def members_activity_path(members)
- return dashboard_projects_path unless members.any?
- return dashboard_projects_path unless members.last.source.present?
-
- members.last.source.activity_path
+ stored_location_for(user) || last_member_activity_path
end
# overridden in EE
def complete_signup_onboarding?
- false
+ onboarding_status.continue_full_onboarding?
end
- def invites_with_tasks_to_be_done?
- MemberTask.for_members(user_members).exists?
+ def last_member_activity_path
+ return dashboard_projects_path unless onboarding_status.last_invited_member_source.present?
+
+ onboarding_status.last_invited_member_source.activity_path
end
def update_success_path
- if invites_with_tasks_to_be_done?
+ if onboarding_status.invite_with_tasks_to_be_done?
issues_dashboard_path(assignee_username: current_user.username)
elsif complete_signup_onboarding? # trials/regular registration on .com
signup_onboarding_path
- elsif registering_from_invite?(user_members) # invites w/o tasks due to order
- flash[:notice] = helpers.invite_accepted_notice(user_members.last)
- members_activity_path(user_members)
+ elsif onboarding_status.single_invite? # invites w/o tasks due to order
+ flash[:notice] = helpers.invite_accepted_notice(onboarding_status.last_invited_member)
+ onboarding_status.last_invited_member_source.activity_path
else
# Subscription registrations goes through here as well.
# Invites will come here too if there is more than 1.
@@ -88,13 +79,8 @@ module Registrations
end
end
- def user_members
- current_user.members
- end
- strong_memoize_attr :user_members
-
# overridden in EE
- def finish_onboarding_on_welcome_page; end
+ def successful_update_hooks; end
# overridden in EE
def signup_onboarding_path; end
@@ -106,6 +92,11 @@ module Registrations
def welcome_update_params
{}
end
+
+ def onboarding_status
+ Onboarding::Status.new(current_user)
+ end
+ strong_memoize_attr :onboarding_status
end
end
diff --git a/app/controllers/registrations_controller.rb b/app/controllers/registrations_controller.rb
index f481681da02..76b7d30cd51 100644
--- a/app/controllers/registrations_controller.rb
+++ b/app/controllers/registrations_controller.rb
@@ -184,8 +184,6 @@ class RegistrationsController < Devise::RegistrationsController
end
def check_captcha
- ensure_correct_params!
-
return unless show_recaptcha_sign_up?
return unless Gitlab::Recaptcha.load_configurations!
@@ -224,6 +222,7 @@ class RegistrationsController < Devise::RegistrationsController
end
def sign_up_params
+ ensure_correct_params!
params.require(:user).permit(sign_up_params_attributes)
end
diff --git a/app/controllers/uploads_controller.rb b/app/controllers/uploads_controller.rb
index b797a204d7f..6d3811514d9 100644
--- a/app/controllers/uploads_controller.rb
+++ b/app/controllers/uploads_controller.rb
@@ -29,7 +29,7 @@ class UploadsController < ApplicationController
before_action :authorize_create_access!, only: [:create, :authorize]
before_action :verify_workhorse_api!, only: [:authorize]
- feature_category :team_planning
+ feature_category :groups_and_projects
def self.model_classes
MODEL_CLASSES
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 4db5745c005..88a8851607b 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -97,11 +97,11 @@ class UsersController < ApplicationController
end
def groups
- load_groups
-
respond_to do |format|
format.html { render 'show' }
format.json do
+ load_groups
+
render json: {
html: view_to_html_string("shared/groups/_list", groups: @groups)
}
@@ -110,36 +110,36 @@ class UsersController < ApplicationController
end
def projects
- load_projects
-
- present_projects(@projects)
+ present_projects do
+ load_projects
+ end
end
def contributed
- load_contributed_projects
-
- present_projects(@contributed_projects)
+ present_projects do
+ load_contributed_projects
+ end
end
def starred
- load_starred_projects
-
- present_projects(@starred_projects)
+ present_projects do
+ load_starred_projects
+ end
end
def followers
- @user_followers = user.followers.page(params[:page])
-
- present_users(@user_followers)
+ present_users do
+ @user_followers = user.followers.page(params[:page])
+ end
end
def following
- @user_following = user.followees.page(params[:page])
-
- present_users(@user_following)
+ present_users do
+ @user_following = user.followees.page(params[:page])
+ end
end
- def present_projects(projects)
+ def present_projects
skip_pagination = Gitlab::Utils.to_boolean(params[:skip_pagination])
skip_namespace = Gitlab::Utils.to_boolean(params[:skip_namespace])
compact_mode = Gitlab::Utils.to_boolean(params[:compact_mode])
@@ -147,17 +147,19 @@ class UsersController < ApplicationController
respond_to do |format|
format.html { render 'show' }
format.json do
+ projects = yield
+
pager_json("shared/projects/_list", projects.count, projects: projects, skip_pagination: skip_pagination, skip_namespace: skip_namespace, compact_mode: compact_mode)
end
end
end
def snippets
- load_snippets
-
respond_to do |format|
format.html { render 'show' }
format.json do
+ load_snippets
+
render json: {
html: view_to_html_string("snippets/_snippets", collection: @snippets)
}
@@ -281,10 +283,11 @@ class UsersController < ApplicationController
access_denied! unless can?(current_user, :read_user_profile, user)
end
- def present_users(users)
+ def present_users
respond_to do |format|
format.html { render 'show' }
format.json do
+ users = yield
render json: {
html: view_to_html_string("shared/users/index", users: users)
}
diff --git a/app/experiments/concerns/project_commit_count.rb b/app/experiments/concerns/project_commit_count.rb
deleted file mode 100644
index 3f08538c21f..00000000000
--- a/app/experiments/concerns/project_commit_count.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-module ProjectCommitCount
- include Gitlab::Git::WrapsGitalyErrors
-
- def commit_count_for(project, default_count: 0, max_count: nil, **exception_details)
- raw_repo = project.repository&.raw_repository
- root_ref = raw_repo&.root_ref
-
- return default_count unless root_ref
-
- Gitlab::GitalyClient::CommitService.new(raw_repo).commit_count(root_ref, {
- all: true, # include all branches
- max_count: max_count # limit as an optimization
- })
- rescue StandardError => e
- Gitlab::ErrorTracking.track_exception(e, exception_details)
-
- default_count
- end
-end
diff --git a/app/experiments/empty_repo_upload_experiment.rb b/app/experiments/empty_repo_upload_experiment.rb
deleted file mode 100644
index c8c75f32d69..00000000000
--- a/app/experiments/empty_repo_upload_experiment.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-# frozen_string_literal: true
-
-class EmptyRepoUploadExperiment < ApplicationExperiment
- include ProjectCommitCount
-
- TRACKING_START_DATE = DateTime.parse('2021/4/20')
- INITIAL_COMMIT_COUNT = 1
-
- def track_initial_write
- return unless should_track? # early return if we don't need to ask for commit counts
- return unless context.project.created_at > TRACKING_START_DATE # early return for older projects
- return unless commit_count == INITIAL_COMMIT_COUNT
-
- track(:initial_write, project: context.project)
- end
-
- private
-
- def commit_count
- commit_count_for(context.project, max_count: INITIAL_COMMIT_COUNT, experiment: name)
- end
-end
diff --git a/app/experiments/force_company_trial_experiment.rb b/app/experiments/force_company_trial_experiment.rb
deleted file mode 100644
index e7b98bb18ad..00000000000
--- a/app/experiments/force_company_trial_experiment.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class ForceCompanyTrialExperiment < ApplicationExperiment
- exclude :setup_for_personal
-
- private
-
- def setup_for_personal
- !context.user.setup_for_company
- end
-end
diff --git a/app/experiments/logged_out_marketing_header_experiment.rb b/app/experiments/logged_out_marketing_header_experiment.rb
deleted file mode 100644
index 3d88d94aec4..00000000000
--- a/app/experiments/logged_out_marketing_header_experiment.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class LoggedOutMarketingHeaderExperiment < ApplicationExperiment
- # These default behaviors are overriden in ApplicationHelper and header
- # template partial
- control {}
- candidate {}
- variant(:trial_focused) {}
-end
diff --git a/app/finders/award_emojis_finder.rb b/app/finders/award_emojis_finder.rb
index 709d3f3e593..2f34e6ec4d3 100644
--- a/app/finders/award_emojis_finder.rb
+++ b/app/finders/award_emojis_finder.rb
@@ -33,7 +33,7 @@ class AwardEmojisFinder
def validate_params
return unless params.present?
- validate_name_param
+ validate_name_param unless Feature.enabled?(:custom_emoji)
validate_awarded_by_param
end
diff --git a/app/finders/ci/group_variables_finder.rb b/app/finders/ci/group_variables_finder.rb
new file mode 100644
index 00000000000..e4697b07e64
--- /dev/null
+++ b/app/finders/ci/group_variables_finder.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+module Ci
+ class GroupVariablesFinder
+ def initialize(project, sort_key = nil)
+ @project = project
+ @params = sort_to_params_map(sort_key)
+ end
+
+ def execute
+ variables = ::Ci::GroupVariable.for_groups(project.group&.self_and_ancestor_ids)
+
+ return Ci::GroupVariable.none if variables.empty?
+
+ sort(variables)
+ end
+
+ private
+
+ SORT_TO_PARAMS_MAP = {
+ created_desc: { order_by: 'created_at', sort: 'desc' },
+ created_asc: { order_by: 'created_at', sort: 'asc' },
+ key_desc: { order_by: 'key', sort: 'desc' },
+ key_asc: { order_by: 'key', sort: 'asc' }
+ }.freeze
+
+ def sort_to_params_map(sort_key)
+ SORT_TO_PARAMS_MAP[sort_key] || {}
+ end
+
+ def sort(variables)
+ return variables unless params[:order_by]
+
+ variables.sort_by_attribute("#{params[:order_by]}_#{params[:sort]}")
+ end
+
+ attr_reader :project, :params
+ end
+end
diff --git a/app/finders/ci/pipelines_finder.rb b/app/finders/ci/pipelines_finder.rb
index e52fc510628..6ba2ae91d6c 100644
--- a/app/finders/ci/pipelines_finder.rb
+++ b/app/finders/ci/pipelines_finder.rb
@@ -164,7 +164,7 @@ module Ci
:id
end
- sort = if params[:sort] =~ /\A(ASC|DESC)\z/i
+ sort = if /\A(ASC|DESC)\z/i.match?(params[:sort])
params[:sort]
else
:desc
diff --git a/app/finders/ci/runners_finder.rb b/app/finders/ci/runners_finder.rb
index 5f03ae77338..630be17e64b 100644
--- a/app/finders/ci/runners_finder.rb
+++ b/app/finders/ci/runners_finder.rb
@@ -4,7 +4,6 @@ module Ci
class RunnersFinder < UnionFinder
include Gitlab::Allowable
- ALLOWED_SORTS = %w[contacted_asc contacted_desc created_at_asc created_at_desc created_date token_expires_at_asc token_expires_at_desc].freeze
DEFAULT_SORT = 'created_at_desc'
def initialize(current_user:, params:)
@@ -31,11 +30,17 @@ module Ci
end
def sort_key
- ALLOWED_SORTS.include?(@params[:sort]) ? @params[:sort] : DEFAULT_SORT
+ allowed_sorts.include?(@params[:sort]) ? @params[:sort] : DEFAULT_SORT
end
private
+ attr_reader :group, :project
+
+ def allowed_sorts
+ %w[contacted_asc contacted_desc created_at_asc created_at_desc created_date token_expires_at_asc token_expires_at_desc]
+ end
+
def search!
if @project
project_runners
@@ -128,3 +133,5 @@ module Ci
end
end
end
+
+Ci::RunnersFinder.prepend_mod
diff --git a/app/finders/deployments_finder.rb b/app/finders/deployments_finder.rb
index 5241a3b3907..800158dfd0a 100644
--- a/app/finders/deployments_finder.rb
+++ b/app/finders/deployments_finder.rb
@@ -128,6 +128,7 @@ class DeploymentsFinder
def build_sort_params
order_by = ALLOWED_SORT_VALUES.include?(params[:order_by]) ? params[:order_by] : DEFAULT_SORT_VALUE
+ order_by = DEFAULT_SORT_VALUE if order_by == 'ref' && Feature.enabled?(:remove_deployments_api_ref_sort)
order_direction = ALLOWED_SORT_DIRECTIONS.include?(params[:sort]) ? params[:sort] : DEFAULT_SORT_DIRECTION
{ order_by => order_direction }
diff --git a/app/finders/events_finder.rb b/app/finders/events_finder.rb
index 4ed447a90ce..7bccfe453ab 100644
--- a/app/finders/events_finder.rb
+++ b/app/finders/events_finder.rb
@@ -61,6 +61,7 @@ class EventsFinder
def by_current_user_access(events)
events.merge(Project.public_or_visible_to_user(current_user))
.joins(:project)
+ .allow_cross_joins_across_databases(url: "https://gitlab.com/gitlab-org/gitlab/-/issues/417462")
end
# rubocop: enable CodeReuse/ActiveRecord
diff --git a/app/finders/group_descendants_finder.rb b/app/finders/group_descendants_finder.rb
index 07f39f98b12..72ab30cf567 100644
--- a/app/finders/group_descendants_finder.rb
+++ b/app/finders/group_descendants_finder.rb
@@ -109,11 +109,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)
- groups.self_and_ancestors(upto: parent_group.id)
- else
- Gitlab::ObjectHierarchy.new(groups).base_and_ancestors(upto: parent_group.id)
- end
+ groups.self_and_ancestors(upto: parent_group.id)
end
# rubocop: enable CodeReuse/ActiveRecord
diff --git a/app/finders/group_projects_finder.rb b/app/finders/group_projects_finder.rb
index 00b700a101e..db8a0f14fbc 100644
--- a/app/finders/group_projects_finder.rb
+++ b/app/finders/group_projects_finder.rb
@@ -24,6 +24,7 @@
# with_issues_enabled: boolean
# with_merge_requests_enabled: boolean
# min_access_level: int
+# owned: boolean
#
class GroupProjectsFinder < ProjectsFinder
DEFAULT_PROJECTS_LIMIT = 100
@@ -83,7 +84,9 @@ class GroupProjectsFinder < ProjectsFinder
def filter_by_visibility(relation)
if current_user
- if min_access_level?
+ if owned_projects?
+ relation.visible_to_user_and_access_level(current_user, Gitlab::Access::OWNER)
+ elsif min_access_level?
relation.visible_to_user_and_access_level(current_user, params[:min_access_level])
else
relation.public_or_visible_to_user(current_user)
@@ -105,6 +108,10 @@ class GroupProjectsFinder < ProjectsFinder
options.fetch(:only_owned, false)
end
+ def owned_projects?
+ params.fetch(:owned, false)
+ end
+
def only_shared?
options.fetch(:only_shared, false)
end
diff --git a/app/finders/issuable_finder.rb b/app/finders/issuable_finder.rb
index 478a2ba622c..bbbf14bb0d0 100644
--- a/app/finders/issuable_finder.rb
+++ b/app/finders/issuable_finder.rb
@@ -346,8 +346,7 @@ class IssuableFinder
def use_full_text_search?
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)
+ params[:search] =~ FULL_TEXT_SEARCH_TERM_REGEX
end
def filter_by_full_text_search(items)
diff --git a/app/finders/issuables/assignee_filter.rb b/app/finders/issuables/assignee_filter.rb
index 2e58a6b34c9..c97fdffd32e 100644
--- a/app/finders/issuables/assignee_filter.rb
+++ b/app/finders/issuables/assignee_filter.rb
@@ -5,6 +5,8 @@ module Issuables
def filter(issuables)
filtered = by_assignee(issuables)
filtered = by_assignee_union(filtered)
+ # Cross Joins Fails tests in bin/rspec spec/requests/api/graphql/boards/board_list_issues_query_spec.rb
+ filtered = filtered.allow_cross_joins_across_databases(url: "https://gitlab.com/gitlab-org/gitlab/-/issues/417462")
by_negated_assignee(filtered)
end
diff --git a/app/finders/members_finder.rb b/app/finders/members_finder.rb
index 3c0714441b2..6348bceb157 100644
--- a/app/finders/members_finder.rb
+++ b/app/finders/members_finder.rb
@@ -90,8 +90,10 @@ class MembersFinder
# enumerate the columns here since we are enumerating them in the union and want to be immune to
# column caching issues when adding/removing columns
- Member.select(*Member.column_names)
+ members = Member.select(*Member.column_names)
.includes(:user).from([Arel.sql("(#{sql}) AS #{Member.table_name}")]) # rubocop: disable CodeReuse/ActiveRecord
+ # The left join with the table users in the method distinct_on needs to be resolved
+ members.allow_cross_joins_across_databases(url: "https://gitlab.com/gitlab-org/gitlab/-/issues/417456")
end
def distinct_on(union)
diff --git a/app/finders/merge_requests_finder.rb b/app/finders/merge_requests_finder.rb
index f7ee90ab870..95b5b267089 100644
--- a/app/finders/merge_requests_finder.rb
+++ b/app/finders/merge_requests_finder.rb
@@ -73,6 +73,7 @@ class MergeRequestsFinder < IssuableFinder
items = by_deployments(items)
items = by_reviewer(items)
items = by_source_project_id(items)
+ items = items.allow_cross_joins_across_databases(url: "https://gitlab.com/gitlab-org/gitlab/-/issues/417462")
by_approved(items)
end
diff --git a/app/finders/packages/ml_model/package_finder.rb b/app/finders/packages/ml_model/package_finder.rb
new file mode 100644
index 00000000000..a550ad0fa34
--- /dev/null
+++ b/app/finders/packages/ml_model/package_finder.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+module Packages
+ module MlModel
+ class PackageFinder
+ def initialize(project)
+ @project = project
+ end
+
+ def execute!(package_name, package_version)
+ project
+ .packages
+ .installable
+ .ml_model
+ .by_name_and_version!(package_name, package_version)
+ end
+
+ private
+
+ attr_reader :project
+ end
+ end
+end
diff --git a/app/finders/packages/npm/package_finder.rb b/app/finders/packages/npm/package_finder.rb
index 953e8299138..339b3f531c6 100644
--- a/app/finders/packages/npm/package_finder.rb
+++ b/app/finders/packages/npm/package_finder.rb
@@ -5,27 +5,16 @@ module Packages
delegate :find_by_version, to: :execute
delegate :last, to: :execute
- # /!\ CAUTION: don't use last_of_each_version: false with find_by_version. Ordering is not
- # guaranteed!
- def initialize(package_name, project: nil, namespace: nil, last_of_each_version: true)
+ def initialize(package_name, project: nil, namespace: nil)
@package_name = package_name
@project = project
@namespace = namespace
- @last_of_each_version = last_of_each_version
end
def execute
- result = base.npm
- .with_name(@package_name)
- .installable
-
- return result unless @last_of_each_version
-
- if Feature.enabled?(:npm_allow_packages_in_multiple_projects)
- Packages::Package.id_in(result.last_of_each_version_ids)
- else
- result.last_of_each_version
- end
+ base.npm
+ .with_name(@package_name)
+ .installable
end
private
diff --git a/app/finders/projects/ml/model_finder.rb b/app/finders/projects/ml/model_finder.rb
new file mode 100644
index 00000000000..9ef5dacb551
--- /dev/null
+++ b/app/finders/projects/ml/model_finder.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module Projects
+ module Ml
+ class ModelFinder
+ def initialize(project)
+ @project = project
+ end
+
+ def execute
+ @project
+ .packages
+ .installable
+ .ml_model
+ .order_name_desc_version_desc
+ .select_only_first_by_name
+ .limit(100) # This is a temporary limit before we add pagination
+ end
+ end
+ end
+end
diff --git a/app/finders/projects_finder.rb b/app/finders/projects_finder.rb
index 57a9538db15..e6ee4355fd4 100644
--- a/app/finders/projects_finder.rb
+++ b/app/finders/projects_finder.rb
@@ -53,6 +53,10 @@ class ProjectsFinder < UnionFinder
init_collection
end
+ if Feature.enabled?(:hide_projects_of_banned_users)
+ collection = without_created_and_owned_by_banned_user(collection)
+ end
+
use_cte = params.delete(:use_cte)
collection = Project.wrap_with_cte(collection) if use_cte
collection = filter_projects(collection)
@@ -282,6 +286,12 @@ class ProjectsFinder < UnionFinder
{ min_access_level: params[:min_access_level] }
end
+
+ def without_created_and_owned_by_banned_user(projects)
+ return projects if current_user&.can?(:admin_all_resources)
+
+ projects.without_created_and_owned_by_banned_user
+ end
end
ProjectsFinder.prepend_mod_with('ProjectsFinder')
diff --git a/app/finders/users_finder.rb b/app/finders/users_finder.rb
index 57dbeca5c51..88ba635e20b 100644
--- a/app/finders/users_finder.rb
+++ b/app/finders/users_finder.rb
@@ -80,15 +80,11 @@ class UsersFinder
def by_search(users)
return users unless params[:search].present?
- if Feature.enabled?(:autocomplete_users_use_search_service)
- users.search(
- params[:search],
- with_private_emails: current_user&.can_admin_all_resources?,
- use_minimum_char_limit: params[:use_minimum_char_limit]
- )
- else
- users.search(params[:search], with_private_emails: current_user&.can_admin_all_resources?)
- end
+ users.search(
+ params[:search],
+ with_private_emails: current_user&.can_admin_all_resources?,
+ use_minimum_char_limit: params[:use_minimum_char_limit]
+ )
end
def by_blocked(users)
@@ -103,13 +99,11 @@ class UsersFinder
users.active
end
- # rubocop: disable CodeReuse/ActiveRecord
def by_external_identity(users)
- return users unless current_user&.can_admin_all_resources? && params[:extern_uid] && params[:provider]
+ return users unless params[:extern_uid] && params[:provider]
- users.joins(:identities).merge(Identity.with_extern_uid(params[:provider], params[:extern_uid]))
+ users.by_provider_and_extern_uid(params[:provider], params[:extern_uid])
end
- # rubocop: enable CodeReuse/ActiveRecord
# rubocop: disable CodeReuse/ActiveRecord
def by_external(users)
diff --git a/app/graphql/gitlab_schema.rb b/app/graphql/gitlab_schema.rb
index eed7959a2f1..0c7195c5be3 100644
--- a/app/graphql/gitlab_schema.rb
+++ b/app/graphql/gitlab_schema.rb
@@ -15,9 +15,6 @@ class GitlabSchema < GraphQL::Schema
use Gitlab::Graphql::Tracers::MetricsTracer
use Gitlab::Graphql::Tracers::LoggerTracer
- # TODO: Old tracer which will be removed eventually
- # See https://gitlab.com/gitlab-org/gitlab/-/issues/345396
- use Gitlab::Graphql::GenericTracing
use Gitlab::Graphql::Tracers::TimerTracer
use Gitlab::Graphql::Subscriptions::ActionCableWithLoadBalancing
diff --git a/app/graphql/mutations/alert_management/prometheus_integration/create.rb b/app/graphql/mutations/alert_management/prometheus_integration/create.rb
index 9c3aefce033..b06a4f58df5 100644
--- a/app/graphql/mutations/alert_management/prometheus_integration/create.rb
+++ b/app/graphql/mutations/alert_management/prometheus_integration/create.rb
@@ -17,7 +17,7 @@ module Mutations
description: 'Whether the integration is receiving alerts.'
argument :api_url, GraphQL::Types::String,
- required: true,
+ required: false,
description: 'Endpoint at which Prometheus can be queried.'
def resolve(args)
diff --git a/app/graphql/mutations/ci/job_token_scope/add_project.rb b/app/graphql/mutations/ci/job_token_scope/add_project.rb
index 6071d6750c2..0358bb11c58 100644
--- a/app/graphql/mutations/ci/job_token_scope/add_project.rb
+++ b/app/graphql/mutations/ci/job_token_scope/add_project.rb
@@ -35,14 +35,13 @@ module Mutations
def resolve(project_path:, target_project_path:, direction: nil)
project = authorized_find!(project_path)
target_project = Project.find_by_full_path(target_project_path)
- frozen_outbound = project.frozen_outbound_job_token_scopes?
- if direction == :outbound && frozen_outbound
+ if direction == :outbound
raise Gitlab::Graphql::Errors::ArgumentError, 'direction: OUTBOUND scope entries can only be removed. ' \
'Only INBOUND scope can be expanded.'
end
- direction ||= frozen_outbound ? :inbound : :outbound
+ direction ||= :inbound
result = ::Ci::JobTokenScope::AddProjectService
.new(project, current_user)
diff --git a/app/graphql/mutations/ci/pipeline_schedule/create.rb b/app/graphql/mutations/ci/pipeline_schedule/create.rb
index 65b355cd80f..71a366ed342 100644
--- a/app/graphql/mutations/ci/pipeline_schedule/create.rb
+++ b/app/graphql/mutations/ci/pipeline_schedule/create.rb
@@ -51,14 +51,28 @@ module Mutations
params = pipeline_schedule_attrs.merge(variables_attributes: variables.map(&:to_h))
- schedule = ::Ci::CreatePipelineScheduleService
- .new(project, current_user, params)
- .execute
-
- unless schedule.persisted?
- return {
- pipeline_schedule: nil, errors: schedule.errors.full_messages
- }
+ if ::Feature.enabled?(:ci_refactoring_pipeline_schedule_create_service, project)
+ response = ::Ci::PipelineSchedules::CreateService
+ .new(project, current_user, params)
+ .execute
+
+ schedule = response.payload
+
+ unless response.success?
+ return {
+ pipeline_schedule: nil, errors: response.errors
+ }
+ end
+ else
+ schedule = ::Ci::CreatePipelineScheduleService
+ .new(project, current_user, params)
+ .execute
+
+ unless schedule.persisted?
+ return {
+ pipeline_schedule: nil, errors: schedule.errors.full_messages
+ }
+ end
end
{
diff --git a/app/graphql/mutations/ci/pipeline_schedule/update.rb b/app/graphql/mutations/ci/pipeline_schedule/update.rb
index a0b5e793ecb..aff0a5494e7 100644
--- a/app/graphql/mutations/ci/pipeline_schedule/update.rb
+++ b/app/graphql/mutations/ci/pipeline_schedule/update.rb
@@ -43,7 +43,7 @@ module Mutations
def resolve(id:, variables: [], **pipeline_schedule_attrs)
schedule = authorized_find!(id: id)
- params = pipeline_schedule_attrs.merge(variables_attributes: variables.map(&:to_h))
+ params = pipeline_schedule_attrs.merge(variables_attributes: variable_attributes_for(variables))
service_response = ::Ci::PipelineSchedules::UpdateService
.new(schedule, current_user, params)
@@ -54,6 +54,18 @@ module Mutations
errors: service_response.errors
}
end
+
+ private
+
+ def variable_attributes_for(variables)
+ variables.map do |variable|
+ variable.to_h.tap do |hash|
+ hash[:id] = GlobalID::Locator.locate(hash[:id]).id if hash[:id]
+
+ hash[:_destroy] = hash.delete(:destroy)
+ end
+ end
+ end
end
end
end
diff --git a/app/graphql/mutations/ci/pipeline_schedule/variable_input_type.rb b/app/graphql/mutations/ci/pipeline_schedule/variable_input_type.rb
index 54a6ad92448..eb6a78eb67a 100644
--- a/app/graphql/mutations/ci/pipeline_schedule/variable_input_type.rb
+++ b/app/graphql/mutations/ci/pipeline_schedule/variable_input_type.rb
@@ -8,11 +8,18 @@ module Mutations
description 'Attributes for the pipeline schedule variable.'
+ PipelineScheduleVariableID = ::Types::GlobalIDType[::Ci::PipelineScheduleVariable]
+
+ argument :id, PipelineScheduleVariableID, required: false, description: 'ID of the variable to mutate.'
+
argument :key, GraphQL::Types::String, required: true, description: 'Name of the variable.'
argument :value, GraphQL::Types::String, required: true, description: 'Value of the variable.'
argument :variable_type, Types::Ci::VariableTypeEnum, required: true, description: 'Type of the variable.'
+
+ argument :destroy, GraphQL::Types::Boolean, required: false,
+ description: 'Boolean option to destroy the variable.'
end
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
index d4e55fd1792..082c345adf6 100644
--- a/app/graphql/mutations/ci/project_ci_cd_settings_update.rb
+++ b/app/graphql/mutations/ci/project_ci_cd_settings_update.rb
@@ -39,7 +39,7 @@ module Mutations
def resolve(full_path:, **args)
project = authorized_find!(full_path)
- if args[:job_token_scope_enabled] && project.frozen_outbound_job_token_scopes?
+ if args[:job_token_scope_enabled]
raise Gitlab::Graphql::Errors::ArgumentError, 'job_token_scope_enabled can only be set to false'
end
diff --git a/app/graphql/mutations/ci/runner/create.rb b/app/graphql/mutations/ci/runner/create.rb
index 7eca6c27d10..4d4134781a5 100644
--- a/app/graphql/mutations/ci/runner/create.rb
+++ b/app/graphql/mutations/ci/runner/create.rb
@@ -37,8 +37,6 @@ module Mutations
parse_gid(**args)
- check_feature_flag(**args)
-
super
end
@@ -79,28 +77,6 @@ module Mutations
GitlabSchema.parse_gid(args[:project_id], expected_type: ::Project)
end
end
-
- def check_feature_flag(**args)
- case args[:runner_type]
- when 'instance_type'
- if Feature.disabled?(:create_runner_workflow_for_admin, current_user)
- raise Gitlab::Graphql::Errors::ResourceNotAvailable,
- '`create_runner_workflow_for_admin` feature flag is disabled.'
- end
- when 'group_type'
- namespace = find_object(**args).sync
- if Feature.disabled?(:create_runner_workflow_for_namespace, namespace)
- raise Gitlab::Graphql::Errors::ResourceNotAvailable,
- '`create_runner_workflow_for_namespace` feature flag is disabled.'
- end
- when 'project_type'
- project = find_object(**args).sync
- if project && Feature.disabled?(:create_runner_workflow_for_namespace, project.namespace)
- raise Gitlab::Graphql::Errors::ResourceNotAvailable,
- '`create_runner_workflow_for_namespace` feature flag is disabled.'
- end
- end
- end
end
end
end
diff --git a/app/graphql/mutations/environments/create.rb b/app/graphql/mutations/environments/create.rb
index 271585eb06c..f18ce0eba97 100644
--- a/app/graphql/mutations/environments/create.rb
+++ b/app/graphql/mutations/environments/create.rb
@@ -35,6 +35,11 @@ module Mutations
required: false,
description: 'Cluster agent of the environment.'
+ argument :kubernetes_namespace,
+ GraphQL::Types::String,
+ required: false,
+ description: 'Kubernetes namespace of the environment.'
+
field :environment,
Types::EnvironmentType,
null: true,
diff --git a/app/graphql/mutations/environments/update.rb b/app/graphql/mutations/environments/update.rb
index 431a7add00e..07ab22685cc 100644
--- a/app/graphql/mutations/environments/update.rb
+++ b/app/graphql/mutations/environments/update.rb
@@ -28,6 +28,11 @@ module Mutations
required: false,
description: 'Cluster agent of the environment.'
+ argument :kubernetes_namespace,
+ GraphQL::Types::String,
+ required: false,
+ description: 'Kubernetes namespace of the environment.'
+
field :environment,
Types::EnvironmentType,
null: true,
diff --git a/app/graphql/resolvers/alert_management/http_integrations_resolver.rb b/app/graphql/resolvers/alert_management/http_integrations_resolver.rb
index 225e20bab83..ac04e0967e6 100644
--- a/app/graphql/resolvers/alert_management/http_integrations_resolver.rb
+++ b/app/graphql/resolvers/alert_management/http_integrations_resolver.rb
@@ -35,7 +35,7 @@ module Resolvers
end
def http_integrations
- ::AlertManagement::HttpIntegrationsFinder.new(project, {}).execute
+ ::AlertManagement::HttpIntegrationsFinder.new(project, { type_identifier: :http }).execute
end
end
end
diff --git a/app/graphql/resolvers/alert_management/integrations_resolver.rb b/app/graphql/resolvers/alert_management/integrations_resolver.rb
index a97650e95d9..9b20d3367f1 100644
--- a/app/graphql/resolvers/alert_management/integrations_resolver.rb
+++ b/app/graphql/resolvers/alert_management/integrations_resolver.rb
@@ -40,7 +40,7 @@ module Resolvers
def http_integrations
return [] unless http_integrations_allowed?
- ::AlertManagement::HttpIntegrationsFinder.new(project, {}).execute
+ ::AlertManagement::HttpIntegrationsFinder.new(project, { type_identifier: :http }).execute
end
def prometheus_integrations_allowed?
diff --git a/app/graphql/resolvers/ci/inherited_variables_resolver.rb b/app/graphql/resolvers/ci/inherited_variables_resolver.rb
index 01f966942a4..4e83265e247 100644
--- a/app/graphql/resolvers/ci/inherited_variables_resolver.rb
+++ b/app/graphql/resolvers/ci/inherited_variables_resolver.rb
@@ -5,8 +5,12 @@ module Resolvers
class InheritedVariablesResolver < BaseResolver
type Types::Ci::ProjectVariableType.connection_type, null: true
- def resolve
- object.group&.self_and_ancestors&.flat_map(&:variables) || []
+ argument :sort, Types::Ci::GroupVariablesSortEnum,
+ required: false, default_value: :created_desc,
+ description: 'Sort variables by the criteria.'
+
+ def resolve(sort:)
+ ::Ci::GroupVariablesFinder.new(object, sort).execute
end
end
end
diff --git a/app/graphql/resolvers/ci/runner_job_count_resolver.rb b/app/graphql/resolvers/ci/runner_job_count_resolver.rb
new file mode 100644
index 00000000000..a43d3f3a100
--- /dev/null
+++ b/app/graphql/resolvers/ci/runner_job_count_resolver.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+module Resolvers
+ module Ci
+ class RunnerJobCountResolver < BaseResolver
+ include Gitlab::Graphql::Authorize::AuthorizeResource
+
+ type GraphQL::Types::Int, null: true
+
+ authorize :read_runner
+ authorizes_object!
+
+ argument :statuses, [::Types::Ci::JobStatusEnum],
+ required: false,
+ description: 'Filter jobs by status.',
+ alpha: { milestone: '16.2' }
+
+ alias_method :runner, :object
+
+ def resolve(statuses: nil)
+ BatchLoader::GraphQL.for(runner.id).batch(key: [:job_count, statuses]) do |runner_ids, loader, _args|
+ counts_by_runner = calculate_job_count_per_runner(runner_ids, statuses)
+
+ runner_ids.each do |runner_id|
+ loader.call(runner_id, counts_by_runner[runner_id]&.count || 0)
+ end
+ end
+ end
+
+ private
+
+ def calculate_job_count_per_runner(runner_ids, statuses)
+ # rubocop: disable CodeReuse/ActiveRecord
+ builds_tbl = ::Ci::Build.arel_table
+ runners_tbl = ::Ci::Runner.arel_table
+ lateral_query = ::Ci::Build.select(1).where(builds_tbl['runner_id'].eq(runners_tbl['id']))
+ lateral_query = lateral_query.where(status: statuses) if statuses
+ # We limit to 1 above the JOB_COUNT_LIMIT to indicate that more items exist after JOB_COUNT_LIMIT
+ lateral_query = lateral_query.limit(::Types::Ci::RunnerType::JOB_COUNT_LIMIT + 1)
+ ::Ci::Runner.joins("JOIN LATERAL (#{lateral_query.to_sql}) builds_with_limit ON true")
+ .id_in(runner_ids)
+ .select(:id, Arel.star.count.as('count'))
+ .group(:id)
+ .index_by(&:id)
+ # rubocop: enable CodeReuse/ActiveRecord
+ end
+ end
+ end
+end
diff --git a/app/graphql/resolvers/ci/runners_resolver.rb b/app/graphql/resolvers/ci/runners_resolver.rb
index 735e38c1a5c..632655d3681 100644
--- a/app/graphql/resolvers/ci/runners_resolver.rb
+++ b/app/graphql/resolvers/ci/runners_resolver.rb
@@ -4,6 +4,7 @@ module Resolvers
module Ci
class RunnersResolver < BaseResolver
include LooksAhead
+ include Gitlab::Graphql::Authorize::AuthorizeResource
type Types::Ci::RunnerType.connection_type, null: true
@@ -105,3 +106,5 @@ module Resolvers
end
end
end
+
+Resolvers::Ci::RunnersResolver.prepend_mod
diff --git a/app/graphql/resolvers/concerns/issues/look_ahead_preloads.rb b/app/graphql/resolvers/concerns/issues/look_ahead_preloads.rb
index 2ea7a02bf15..d9bcf39b818 100644
--- a/app/graphql/resolvers/concerns/issues/look_ahead_preloads.rb
+++ b/app/graphql/resolvers/concerns/issues/look_ahead_preloads.rb
@@ -20,17 +20,15 @@ module Issues
end
def preloads
- preload_hash = {
+ {
alert_management_alert: [:alert_management_alert],
assignees: [:assignees],
participants: Issue.participant_includes,
timelogs: [:timelogs],
customer_relations_contacts: { customer_relations_contacts: [:group] },
- escalation_status: [:incident_management_issuable_escalation_status]
+ escalation_status: [:incident_management_issuable_escalation_status],
+ type: :work_item_type
}
- preload_hash[:type] = :work_item_type if Feature.enabled?(:issue_type_uses_work_item_types_table)
-
- preload_hash
end
end
end
diff --git a/app/graphql/resolvers/concerns/resolves_merge_requests.rb b/app/graphql/resolvers/concerns/resolves_merge_requests.rb
index b9326015ac0..c0a068097a7 100644
--- a/app/graphql/resolvers/concerns/resolves_merge_requests.rb
+++ b/app/graphql/resolvers/concerns/resolves_merge_requests.rb
@@ -11,6 +11,11 @@ module ResolvesMergeRequests
end
def resolve_with_lookahead(**args)
+ if args[:group_id]
+ args[:group_id] = ::GitlabSchema.parse_gid(args[:group_id], expected_type: ::Group).model_id
+ args[:include_subgroups] = true
+ end
+
mr_finder = MergeRequestsFinder.new(current_user, args.compact)
finder = Gitlab::Graphql::Loaders::IssuableLoader.new(mr_parent, mr_finder)
diff --git a/app/graphql/resolvers/issues/base_resolver.rb b/app/graphql/resolvers/issues/base_resolver.rb
index fefd17d5e20..495b72231fc 100644
--- a/app/graphql/resolvers/issues/base_resolver.rb
+++ b/app/graphql/resolvers/issues/base_resolver.rb
@@ -16,6 +16,9 @@ module Resolvers
argument :assignee_usernames, [GraphQL::Types::String],
required: false,
description: 'Usernames of users assigned to the issue.'
+ argument :assignee_wildcard_id, ::Types::AssigneeWildcardIdEnum,
+ required: false,
+ description: 'Filter by assignee wildcard. Incompatible with assigneeUsername and assigneeUsernames.'
argument :author_username, GraphQL::Types::String,
required: false,
description: 'Username of the author of the issue.'
@@ -148,6 +151,7 @@ module Resolvers
rewrite_param_name(args, :assignee_usernames, :assignee_username)
rewrite_param_name(args[:or], :assignee_usernames, :assignee_username)
rewrite_param_name(args[:not], :assignee_usernames, :assignee_username)
+ rewrite_param_name(args, :assignee_wildcard_id, :assignee_id)
end
def rewrite_param_name(params, old_name, new_name)
@@ -163,7 +167,7 @@ module Resolvers
end
def mutually_exclusive_assignee_username_args
- [:assignee_usernames, :assignee_username]
+ [:assignee_usernames, :assignee_username, :assignee_wildcard_id]
end
def params_not_mutually_exclusive(args, mutually_exclusive_args)
@@ -171,7 +175,7 @@ module Resolvers
arg_str = mutually_exclusive_args.map { |x| x.to_s.camelize(:lower) }.join(', ')
raise ::Gitlab::Graphql::Errors::ArgumentError,
- "only one of [#{arg_str}] arguments is allowed at the same time."
+ "only one of [#{arg_str}] arguments is allowed at the same time."
end
end
# rubocop:enable Graphql/ResolverType
diff --git a/app/graphql/resolvers/metrics/dashboard_resolver.rb b/app/graphql/resolvers/metrics/dashboard_resolver.rb
deleted file mode 100644
index 5abad0de539..00000000000
--- a/app/graphql/resolvers/metrics/dashboard_resolver.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-# frozen_string_literal: true
-
-module Resolvers
- module Metrics
- class DashboardResolver < Resolvers::BaseResolver
- type Types::Metrics::DashboardType, null: true
- calls_gitaly!
-
- argument :path, GraphQL::Types::String,
- required: true,
- description: <<~MD
- Path to a file which defines a metrics dashboard eg: `"config/prometheus/common_metrics.yml"`.
- MD
-
- alias_method :environment, :object
-
- def resolve(path:)
- return if Feature.enabled?(:remove_monitor_metrics)
- return unless environment
-
- ::PerformanceMonitoring::PrometheusDashboard.find_for(path: path, **service_params)
- end
-
- private
-
- def service_params
- {
- project: environment.project,
- user: current_user,
- options: { environment: environment }
- }
- end
- end
- end
-end
diff --git a/app/graphql/resolvers/user_merge_requests_resolver_base.rb b/app/graphql/resolvers/user_merge_requests_resolver_base.rb
index b2d85307c49..72dbc0a93e9 100644
--- a/app/graphql/resolvers/user_merge_requests_resolver_base.rb
+++ b/app/graphql/resolvers/user_merge_requests_resolver_base.rb
@@ -4,6 +4,14 @@ module Resolvers
class UserMergeRequestsResolverBase < MergeRequestsResolver
include ResolvesProject
+ argument :group_id,
+ type: ::Types::GlobalIDType[::Group],
+ required: false,
+ description: <<~DESC
+ The global ID of the group the authored merge requests should be in.
+ Merge requests in subgroups are included.
+ DESC
+
argument :project_path,
type: GraphQL::Types::String,
required: false,
diff --git a/app/graphql/types/alert_management/alert_type.rb b/app/graphql/types/alert_management/alert_type.rb
index 36dd930c3d9..c17406b3e56 100644
--- a/app/graphql/types/alert_management/alert_type.rb
+++ b/app/graphql/types/alert_management/alert_type.rb
@@ -111,13 +111,6 @@ module Types
null: true,
description: 'Assignees of the alert.'
- field :metrics_dashboard_url,
- GraphQL::Types::String,
- null: true,
- description: 'URL for metrics embed for the alert.',
- deprecated: { reason: 'Returns no data. Underlying feature was removed in 16.0',
- milestone: '16.0' }
-
field :runbook,
GraphQL::Types::String,
null: true,
@@ -143,12 +136,6 @@ module Types
method: :details_url,
null: false,
description: 'URL of the alert.'
-
- def metrics_dashboard_url
- return if Feature.enabled?(:remove_monitor_metrics)
-
- object.metrics_dashboard_url
- end
end
end
end
diff --git a/app/graphql/types/assignee_wildcard_id_enum.rb b/app/graphql/types/assignee_wildcard_id_enum.rb
new file mode 100644
index 00000000000..09afab7de37
--- /dev/null
+++ b/app/graphql/types/assignee_wildcard_id_enum.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module Types
+ class AssigneeWildcardIdEnum < BaseEnum
+ graphql_name 'AssigneeWildcardId'
+ description 'Assignee ID wildcard values'
+
+ value 'NONE', 'No assignee is assigned.'
+ value 'ANY', 'An assignee is assigned.'
+ end
+end
diff --git a/app/graphql/types/boards/assignee_wildcard_id_enum.rb b/app/graphql/types/boards/assignee_wildcard_id_enum.rb
deleted file mode 100644
index ba9058a78d9..00000000000
--- a/app/graphql/types/boards/assignee_wildcard_id_enum.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-module Types
- module Boards
- class AssigneeWildcardIdEnum < BaseEnum
- graphql_name 'AssigneeWildcardId'
- description 'Assignee ID wildcard values'
-
- value 'NONE', 'No assignee is assigned.'
- value 'ANY', 'An assignee is assigned.'
- end
- end
-end
diff --git a/app/graphql/types/boards/board_issue_input_type.rb b/app/graphql/types/boards/board_issue_input_type.rb
index 897e3d05948..ea7c207cda2 100644
--- a/app/graphql/types/boards/board_issue_input_type.rb
+++ b/app/graphql/types/boards/board_issue_input_type.rb
@@ -17,9 +17,9 @@ module Types
required: false,
description: 'Search query for issue title or description.'
- argument :assignee_wildcard_id, ::Types::Boards::AssigneeWildcardIdEnum,
+ argument :assignee_wildcard_id, ::Types::AssigneeWildcardIdEnum,
required: false,
- description: 'Filter by assignee wildcard. Incompatible with assigneeUsername.'
+ description: 'Filter by assignee wildcard. Incompatible with assigneeUsername and assigneeUsernames.'
argument :confidential, GraphQL::Types::Boolean,
required: false,
diff --git a/app/graphql/types/ci/config/include_type.rb b/app/graphql/types/ci/config/include_type.rb
index 71eb8f755ab..b5816453a51 100644
--- a/app/graphql/types/ci/config/include_type.rb
+++ b/app/graphql/types/ci/config/include_type.rb
@@ -15,22 +15,22 @@ module Types
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".'
+ description: 'File location. It can be masked if it contains masked variables. For example, ' \
+ '`".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".'
+ description: 'File blob location. It can be masked if it contains masked variables. For example, ' \
+ '`"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".'
+ description: 'File raw location. It can be masked if it contains masked variables. For example, ' \
+ '`"https://gitlab.com/gitlab-org/gitlab/-/raw/e52d6d0246d7375291850e61f0abc101fbda9dc2' \
+ '/.gitlab/ci/build-images.gitlab-ci.yml"`.'
field :extra, # rubocop:disable Graphql/JSONType
GraphQL::Types::JSON,
diff --git a/app/graphql/types/ci/group_variable_type.rb b/app/graphql/types/ci/group_variable_type.rb
index f9ed54f0d10..7e2afba0d53 100644
--- a/app/graphql/types/ci/group_variable_type.rb
+++ b/app/graphql/types/ci/group_variable_type.rb
@@ -21,6 +21,10 @@ module Types
field :protected, GraphQL::Types::Boolean,
null: true,
description: 'Indicates whether the variable is protected.'
+
+ field :description, GraphQL::Types::String,
+ null: true,
+ description: 'Description of the variable.'
end
end
end
diff --git a/app/graphql/types/ci/group_variables_sort_enum.rb b/app/graphql/types/ci/group_variables_sort_enum.rb
new file mode 100644
index 00000000000..5cf9fd4039b
--- /dev/null
+++ b/app/graphql/types/ci/group_variables_sort_enum.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+module Types
+ module Ci
+ # Not inheriting from Types::SortEnum since we only want
+ # to implement a subset of the sort values it defines.
+ class GroupVariablesSortEnum < BaseEnum
+ graphql_name 'CiGroupVariablesSort'
+ description 'Values for sorting inherited variables'
+
+ # Borrowed from Types::SortEnum
+ # These values/descriptions should stay in-sync as much as possible.
+ value 'CREATED_DESC', 'Created at descending order.', value: :created_desc
+ value 'CREATED_ASC', 'Created at ascending order.', value: :created_asc
+
+ value 'KEY_DESC', 'Key by descending order.', value: :key_desc
+ value 'KEY_ASC', 'Key by ascending order.', value: :key_asc
+ end
+ end
+end
diff --git a/app/graphql/types/ci/job_type.rb b/app/graphql/types/ci/job_type.rb
index a779ceb2e2a..02b10f3e4bd 100644
--- a/app/graphql/types/ci/job_type.rb
+++ b/app/graphql/types/ci/job_type.rb
@@ -87,8 +87,10 @@ module Types
description: 'Play path of the job.'
field :playable, GraphQL::Types::Boolean, null: false, method: :playable?,
description: 'Indicates the job can be played.'
- field :previous_stage_jobs_or_needs, Types::Ci::JobNeedUnion.connection_type, null: true,
- description: 'Jobs that must complete before the job runs. Returns `BuildNeed`, which is the needed jobs if the job uses the `needs` keyword, or the previous stage jobs otherwise.'
+ field :previous_stage_jobs_or_needs, Types::Ci::JobNeedUnion.connection_type,
+ null: true,
+ description: 'Jobs that must complete before the job runs. Returns `BuildNeed`, ' \
+ 'which is the needed jobs if the job uses the `needs` keyword, or the previous stage jobs otherwise.'
field :ref_name, GraphQL::Types::String, null: true,
description: 'Ref name of the job.'
field :ref_path, GraphQL::Types::String, null: true,
@@ -179,7 +181,9 @@ module Types
stages = pipeline.stages.by_position(positions)
stages.each do |stage|
- loader.call([pipeline, stage.position], stage.latest_statuses)
+ # Without `.to_a`, the memoization will only preserve the activerecord relation object. And when there is
+ # a call, the SQL query will be executed again.
+ loader.call([pipeline, stage.position], stage.latest_statuses.to_a)
end
end
end
diff --git a/app/graphql/types/ci/project_variable_type.rb b/app/graphql/types/ci/project_variable_type.rb
index 2a5375045e5..a9679000511 100644
--- a/app/graphql/types/ci/project_variable_type.rb
+++ b/app/graphql/types/ci/project_variable_type.rb
@@ -21,6 +21,10 @@ module Types
field :masked, GraphQL::Types::Boolean,
null: true,
description: 'Indicates whether the variable is masked.'
+
+ field :description, GraphQL::Types::String,
+ null: true,
+ description: 'Description of the variable.'
end
end
end
diff --git a/app/graphql/types/ci/runner_sort_enum.rb b/app/graphql/types/ci/runner_sort_enum.rb
index 8f2a13bd699..4195eb043ed 100644
--- a/app/graphql/types/ci/runner_sort_enum.rb
+++ b/app/graphql/types/ci/runner_sort_enum.rb
@@ -15,3 +15,5 @@ module Types
end
end
end
+
+Types::Ci::RunnerSortEnum.prepend_mod
diff --git a/app/graphql/types/ci/runner_type.rb b/app/graphql/types/ci/runner_type.rb
index 8e509cc8493..2baf64ca663 100644
--- a/app/graphql/types/ci/runner_type.rb
+++ b/app/graphql/types/ci/runner_type.rb
@@ -24,8 +24,9 @@ module Types
field :admin_url, GraphQL::Types::String, null: true,
description: 'Admin URL of the runner. Only available for administrators.'
field :architecture_name, GraphQL::Types::String, null: true,
- description: 'Architecture provided by the the runner.',
- method: :architecture
+ deprecated: { reason: "Use field in `manager` object instead", milestone: '16.2' },
+ description: 'Architecture provided by the the runner.',
+ method: :architecture
field :contacted_at, Types::TimeType, null: true,
description: 'Timestamp of last contact from this runner.',
method: :contacted_at
@@ -46,17 +47,20 @@ module Types
description: 'URL of the registration page of the runner manager. Only available for the creator of the runner for a limited time during registration.',
alpha: { milestone: '15.11' }
field :executor_name, GraphQL::Types::String, null: true,
- description: 'Executor last advertised by the runner.',
- method: :executor_name
+ deprecated: { reason: "Use field in `manager` object instead", milestone: '16.2' },
+ description: 'Executor last advertised by the runner.',
+ method: :executor_name
field :groups, null: true,
resolver: ::Resolvers::Ci::RunnerGroupsResolver,
description: 'Groups the runner is associated with. For group runners only.'
field :id, ::Types::GlobalIDType[::Ci::Runner], null: false,
description: 'ID of the runner.'
field :ip_address, GraphQL::Types::String, null: true,
- description: 'IP address of the runner.'
+ deprecated: { reason: "Use field in `manager` object instead", milestone: '16.2' },
+ description: 'IP address of the runner.'
field :job_count, GraphQL::Types::Int, null: true,
- description: "Number of jobs processed by the runner (limited to #{JOB_COUNT_LIMIT}, plus one to indicate that more items exist)."
+ description: "Number of jobs processed by the runner (limited to #{JOB_COUNT_LIMIT}, plus one to indicate that more items exist).",
+ resolver: ::Resolvers::Ci::RunnerJobCountResolver
field :job_execution_status,
Types::Ci::RunnerJobExecutionStatusEnum,
null: true,
@@ -82,8 +86,9 @@ module Types
field :paused, GraphQL::Types::Boolean, null: false,
description: 'Indicates the runner is paused and not available to run jobs.'
field :platform_name, GraphQL::Types::String, null: true,
- description: 'Platform provided by the runner.',
- method: :platform
+ deprecated: { reason: "Use field in `manager` object instead", milestone: '16.2' },
+ description: 'Platform provided by the runner.',
+ method: :platform
field :project_count, GraphQL::Types::Int, null: true,
description: 'Number of projects that the runner is associated with.'
field :projects,
@@ -94,7 +99,8 @@ module Types
field :register_admin_url, GraphQL::Types::String, null: true,
description: 'URL of the temporary registration page of the runner. Only available before the runner is registered. Only available for administrators.'
field :revision, GraphQL::Types::String, null: true,
- description: 'Revision of the runner.'
+ deprecated: { reason: "Use field in `manager` object instead", milestone: '16.2' },
+ description: 'Revision of the runner.'
field :run_untagged, GraphQL::Types::Boolean, null: false,
description: 'Indicates the runner is able to run untagged jobs.'
field :runner_type, ::Types::Ci::RunnerTypeEnum, null: false,
@@ -112,7 +118,8 @@ module Types
description: 'Runner token expiration time.',
method: :token_expires_at
field :version, GraphQL::Types::String, null: true,
- description: 'Version of the runner.'
+ deprecated: { reason: "Use field in `manager` object instead", milestone: '16.2' },
+ description: 'Version of the runner.'
markdown_field :maintenance_note_html, null: true
@@ -120,28 +127,6 @@ module Types
::MarkupHelper.markdown(object.maintenance_note, context.to_h.dup)
end
- def job_count
- BatchLoader::GraphQL.for(runner.id).batch(key: :job_count) do |runner_ids, loader, _args|
- # rubocop: disable CodeReuse/ActiveRecord
- # We limit to 1 above the JOB_COUNT_LIMIT to indicate that more items exist after JOB_COUNT_LIMIT
- builds_tbl = ::Ci::Build.arel_table
- runners_tbl = ::Ci::Runner.arel_table
- lateral_query = ::Ci::Build.select(1)
- .where(builds_tbl['runner_id'].eq(runners_tbl['id']))
- .limit(JOB_COUNT_LIMIT + 1)
- counts = ::Ci::Runner.joins("JOIN LATERAL (#{lateral_query.to_sql}) builds_with_limit ON true")
- .id_in(runner_ids)
- .select(:id, Arel.star.count.as('count'))
- .group(:id)
- .index_by(&:id)
- # rubocop: enable CodeReuse/ActiveRecord
-
- runner_ids.each do |runner_id|
- loader.call(runner_id, counts[runner_id]&.count || 0)
- end
- end
- end
-
def admin_url
Gitlab::Routing.url_helpers.admin_runner_url(runner) if can_admin_runners?
end
diff --git a/app/graphql/types/ci/stage_type.rb b/app/graphql/types/ci/stage_type.rb
index c0f3d1db57b..a9d8075329d 100644
--- a/app/graphql/types/ci/stage_type.rb
+++ b/app/graphql/types/ci/stage_type.rb
@@ -33,7 +33,7 @@ module Types
by_pipeline = keys.group_by(&:pipeline)
include_needs = keys.any? do |k|
k.requires?(%i[nodes jobs nodes needs]) ||
- k.requires?(%i[nodes jobs nodes previousStageJobsAndNeeds])
+ k.requires?(%i[nodes jobs nodes previousStageJobsOrNeeds])
end
by_pipeline.each do |pl, key_group|
diff --git a/app/graphql/types/current_user_todos.rb b/app/graphql/types/current_user_todos.rb
index 4c4cb516979..d5441ea1d15 100644
--- a/app/graphql/types/current_user_todos.rb
+++ b/app/graphql/types/current_user_todos.rb
@@ -17,7 +17,8 @@ module Types
def current_user_todos(state: nil)
state ||= %i[done pending] # TodosFinder treats a `nil` state param as `pending`
- key = [state, unpresented.class.name]
+ target_type_name = unpresented.try(:todoable_target_type_name) || unpresented.class.name
+ key = [state, target_type_name]
BatchLoader::GraphQL.for(unpresented).batch(default_value: [], key: key) do |targets, loader, args|
state, klass_name = args[:key]
diff --git a/app/graphql/types/environment_type.rb b/app/graphql/types/environment_type.rb
index 936ad52200c..aee09e5a143 100644
--- a/app/graphql/types/environment_type.rb
+++ b/app/graphql/types/environment_type.rb
@@ -33,6 +33,9 @@ module Types
field :external_url, GraphQL::Types::String, null: true,
description: 'External URL of the environment.'
+ field :kubernetes_namespace, GraphQL::Types::String, null: true,
+ description: 'Kubernetes namespace of the environment.'
+
field :created_at, Types::TimeType,
description: 'When the environment was created.'
@@ -51,11 +54,6 @@ module Types
field :environment_type, GraphQL::Types::String,
description: 'Folder name of the environment.'
- field :metrics_dashboard, Types::Metrics::DashboardType, null: true,
- description: 'Metrics dashboard schema for the environment.',
- resolver: Resolvers::Metrics::DashboardResolver,
- deprecated: { reason: 'Returns no data. Underlying feature was removed in 16.0', milestone: '16.0' }
-
field :latest_opened_most_severe_alert,
Types::AlertManagement::AlertType,
null: true,
diff --git a/app/graphql/types/ide_type.rb b/app/graphql/types/ide_type.rb
new file mode 100644
index 00000000000..34447577f23
--- /dev/null
+++ b/app/graphql/types/ide_type.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module Types
+ class IdeType < BaseObject
+ graphql_name 'Ide'
+ description 'IDE settings and feature flags.'
+
+ authorize :read_user
+
+ field :code_suggestions_enabled, GraphQL::Types::Boolean, null: false,
+ description: 'Indicates whether AI assisted code suggestions are enabled.'
+
+ def code_suggestions_enabled
+ object.can?(:access_code_suggestions)
+ end
+ end
+end
diff --git a/app/graphql/types/merge_request_type.rb b/app/graphql/types/merge_request_type.rb
index f32dfc0dbcf..99c719f1402 100644
--- a/app/graphql/types/merge_request_type.rb
+++ b/app/graphql/types/merge_request_type.rb
@@ -35,7 +35,7 @@ module Types
field :iid, GraphQL::Types::String, null: false,
description: 'Internal ID of the merge request.'
field :merge_when_pipeline_succeeds, GraphQL::Types::Boolean, null: true,
- description: 'Indicates if the merge has been set to be merged when its pipeline succeeds (MWPS).'
+ description: 'Indicates if the merge has been set to auto-merge.'
field :merged_at, Types::TimeType, null: true, complexity: 5,
description: 'Timestamp of when the merge request was merged, null if not merged.'
field :project, Types::ProjectType, null: false,
@@ -207,7 +207,7 @@ module Types
field :has_ci, GraphQL::Types::Boolean, null: false, method: :has_ci?,
description: 'Indicates if the merge request has CI.'
field :merge_user, Types::UserType, null: true,
- description: 'User who merged this merge request or set it to merge when pipeline succeeds.'
+ description: 'User who merged this merge request or set it to auto-merge.'
field :mergeable, GraphQL::Types::Boolean, null: false, method: :mergeable?, calls_gitaly: true,
description: 'Indicates if the merge request is mergeable.'
field :security_auto_fix, GraphQL::Types::Boolean, null: true,
diff --git a/app/graphql/types/metrics/dashboard_type.rb b/app/graphql/types/metrics/dashboard_type.rb
deleted file mode 100644
index 5570b904d79..00000000000
--- a/app/graphql/types/metrics/dashboard_type.rb
+++ /dev/null
@@ -1,33 +0,0 @@
-# frozen_string_literal: true
-
-module Types
- module Metrics
- # rubocop: disable Graphql/AuthorizeTypes
- # Authorization is performed at environment level
- class DashboardType < ::Types::BaseObject
- graphql_name 'MetricsDashboard'
-
- field :path, GraphQL::Types::String, null: true,
- description: 'Path to a file with the dashboard definition.'
-
- field :schema_validation_warnings,
- [GraphQL::Types::String],
- null: true,
- description: 'Dashboard schema validation warnings.'
-
- field :annotations,
- Types::Metrics::Dashboards::AnnotationType.connection_type,
- null: true,
- description: 'Annotations added to the dashboard.',
- resolver: Resolvers::Metrics::Dashboards::AnnotationResolver
-
- # In order to maintain backward compatibility we need to return NULL when there are no warnings
- # and dashboard validation returns an empty array when there are no issues.
- def schema_validation_warnings
- warnings = object.schema_validation_warnings
- warnings unless warnings.empty?
- end
- end
- # rubocop: enable Graphql/AuthorizeTypes
- end
-end
diff --git a/app/graphql/types/project_statistics_type.rb b/app/graphql/types/project_statistics_type.rb
index a1d721856a9..ef4edcddbe9 100644
--- a/app/graphql/types/project_statistics_type.rb
+++ b/app/graphql/types/project_statistics_type.rb
@@ -35,3 +35,5 @@ module Types
description: 'Wiki size of the project in bytes.'
end
end
+
+Types::ProjectStatisticsType.prepend_mod_with('Types::ProjectStatisticsType')
diff --git a/app/graphql/types/project_type.rb b/app/graphql/types/project_type.rb
index f8a516501c3..992663b4d98 100644
--- a/app/graphql/types/project_type.rb
+++ b/app/graphql/types/project_type.rb
@@ -727,6 +727,8 @@ module Types
if minimum_access_level.nil?
object.forks.public_or_visible_to_user(current_user)
else
+ return [] if current_user.nil?
+
object.forks.visible_to_user_and_access_level(current_user, minimum_access_level)
end
end
diff --git a/app/graphql/types/root_storage_statistics_type.rb b/app/graphql/types/root_storage_statistics_type.rb
index 67ee0589882..dbed51ac71a 100644
--- a/app/graphql/types/root_storage_statistics_type.rb
+++ b/app/graphql/types/root_storage_statistics_type.rb
@@ -8,11 +8,19 @@ module Types
field :build_artifacts_size, GraphQL::Types::Float, null: false, description: 'CI artifacts size in bytes.'
field :container_registry_size, GraphQL::Types::Float, null: false, description: 'Container Registry size in bytes.'
+ field :container_registry_size_is_estimated, GraphQL::Types::Boolean, method: :registry_size_estimated, null: false,
+ description: 'Indicates whether the deduplicated Container Registry size for ' \
+ 'the namespace is an estimated value or not.'
field :dependency_proxy_size, GraphQL::Types::Float, null: false, description: 'Dependency Proxy sizes in bytes.'
field :lfs_objects_size, GraphQL::Types::Float, null: false, description: 'LFS objects size in bytes.'
field :packages_size, GraphQL::Types::Float, null: false, description: 'Packages size in bytes.'
- field :pipeline_artifacts_size, GraphQL::Types::Float, null: false, description: 'CI pipeline artifacts size in bytes.'
- field :registry_size_estimated, GraphQL::Types::Boolean, null: false, description: 'Indicates whether the deduplicated Container Registry size for the namespace is an estimated value or not.'
+ field :pipeline_artifacts_size, GraphQL::Types::Float, null: false,
+ description: 'CI pipeline artifacts size in bytes.'
+ field :registry_size_estimated, GraphQL::Types::Boolean,
+ null: false,
+ deprecated: { reason: 'Use `container_registry_size_is_estimated`', milestone: '16.2' },
+ description: 'Indicates whether the deduplicated Container Registry size for ' \
+ 'the namespace is an estimated value or not.'
field :repository_size, GraphQL::Types::Float, null: false, description: 'Git repository size in bytes.'
field :snippets_size, GraphQL::Types::Float, null: false, description: 'Snippets size in bytes.'
field :storage_size, GraphQL::Types::Float, null: false, description: 'Total storage in bytes.'
@@ -20,3 +28,5 @@ module Types
field :wiki_size, GraphQL::Types::Float, null: false, description: 'Wiki size in bytes.'
end
end
+
+Types::RootStorageStatisticsType.prepend_mod_with('Types::RootStorageStatisticsType')
diff --git a/app/graphql/types/user_interface.rb b/app/graphql/types/user_interface.rb
index 5357f2f8e66..9e5f6810aca 100644
--- a/app/graphql/types/user_interface.rb
+++ b/app/graphql/types/user_interface.rb
@@ -197,6 +197,17 @@ module Types
null: true,
description: 'Timestamp of when the user was created.'
+ field :pronouns,
+ type: ::GraphQL::Types::String,
+ null: true,
+ description: 'Pronouns of the user.'
+
+ field :ide,
+ type: Types::IdeType,
+ null: true,
+ description: 'IDE settings.',
+ method: :itself
+
definition_methods do
def resolve_type(object, context)
# in the absence of other information, we cannot tell - just default to
diff --git a/app/helpers/admin/application_settings/settings_helper.rb b/app/helpers/admin/application_settings/settings_helper.rb
index 0a7f20caa02..9ea07ba4e6e 100644
--- a/app/helpers/admin/application_settings/settings_helper.rb
+++ b/app/helpers/admin/application_settings/settings_helper.rb
@@ -16,12 +16,23 @@ module Admin
project.repository&.gitlab_ci_yml.blank?
end
+ def code_suggestions_description
+ link_start = code_suggestions_link_start(code_suggestions_docs_url)
+
+ # rubocop:disable Layout/LineLength
+ # rubocop:disable Style/FormatString
+ s_('CodeSuggestionsSM|Enable Code Suggestions for users of this instance. %{link_start}What are Code Suggestions?%{link_end}')
+ .html_safe % { link_start: link_start, link_end: '</a>'.html_safe }
+ # rubocop:enable Style/FormatString
+ # rubocop:enable Layout/LineLength
+ end
+
def code_suggestions_token_explanation
link_start = code_suggestions_link_start(code_suggestions_pat_docs_url)
# rubocop:disable Layout/LineLength
# rubocop:disable Style/FormatString
- s_('CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token.')
+ s_('CodeSuggestionsSM|On GitLab.com, create a token. This token is required to use Code Suggestions on your self-managed instance. %{link_start}How do I create a token?%{link_end}')
.html_safe % { link_start: link_start, link_end: '</a>'.html_safe }
# rubocop:enable Style/FormatString
# rubocop:enable Layout/LineLength
@@ -33,8 +44,8 @@ module Admin
# rubocop:disable Layout/LineLength
# rubocop:disable Style/FormatString
- s_('CodeSuggestionsSM|&#8226; Agree to the %{terms_link_start}GitLab Testing Agreement%{link_end}.%{br} &#8226; Acknowledge that GitLab will send data from the instance, including personal data, to Google for cloud hosting.%{br} &nbsp;&nbsp;&nbsp;We may also send data to %{ai_docs_link_start}third-party AI providers%{link_end} to provide this feature.')
- .html_safe % { terms_link_start: terms_link_start, ai_docs_link_start: ai_docs_link_start, link_end: '</a>'.html_safe, br: '</br>'.html_safe }
+ s_('CodeSuggestionsSM|By enabling this feature, you agree to the %{terms_link_start}GitLab Testing Agreement%{link_end} and acknowledge that GitLab will send data from the instance, including personal data, to our %{ai_docs_link_start}AI providers%{link_end} to provide this feature.')
+ .html_safe % { terms_link_start: terms_link_start, ai_docs_link_start: ai_docs_link_start, link_end: '</a>'.html_safe }
# rubocop:enable Style/FormatString
# rubocop:enable Layout/LineLength
end
@@ -53,7 +64,7 @@ module Admin
end
def code_suggestions_ai_docs_url
- 'https://docs.gitlab.com/ee/user/ai_features.html'
+ 'https://docs.gitlab.com/ee/user/ai_features.html#third-party-services'
end
def code_suggestions_pat_docs_url
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 7f1c28de8a7..ce338a8afdc 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -124,7 +124,8 @@ module ApplicationHelper
page: body_data_page,
page_type_id: controller.params[:id],
find_file: find_file_path,
- group: @group&.path
+ group: @group&.path,
+ group_full_path: @group&.full_path
}.merge(project_data)
end
@@ -135,6 +136,7 @@ module ApplicationHelper
project_id: @project.id,
project: @project.path,
group: @project.group&.path,
+ group_full_path: @project.group&.full_path,
namespace_id: @project.namespace&.id
}
end
@@ -274,15 +276,7 @@ module ApplicationHelper
end
def stylesheet_link_tag_defer(path)
- if startup_css_enabled?
- stylesheet_link_tag(path, media: "print", crossorigin: ActionController::Base.asset_host ? 'anonymous' : nil)
- else
- stylesheet_link_tag(path, media: "all", crossorigin: ActionController::Base.asset_host ? 'anonymous' : nil)
- end
- end
-
- def startup_css_enabled?
- !Feature.enabled?(:remove_startup_css) && !params.has_key?(:no_startup_css)
+ stylesheet_link_tag(path, media: "all", crossorigin: ActionController::Base.asset_host ? 'anonymous' : nil)
end
def sign_in_with_redirect?
@@ -336,7 +330,7 @@ module ApplicationHelper
class_names << 'with-system-header' if appearance.show_header?
class_names << 'with-system-footer' if appearance.show_footer?
- class_names
+ class_names.join(' ')
end
# Returns active css class when condition returns true
@@ -354,7 +348,7 @@ module ApplicationHelper
def linkedin_url(user)
name = user.linkedin
- if name =~ %r{\Ahttps?://(www\.)?linkedin\.com/in/}
+ if %r{\Ahttps?://(www\.)?linkedin\.com/in/}.match?(name)
name
else
"https://www.linkedin.com/in/#{name}"
@@ -363,7 +357,7 @@ module ApplicationHelper
def twitter_url(user)
name = user.twitter
- if name =~ %r{\Ahttps?://(www\.)?twitter\.com/}
+ if %r{\Ahttps?://(www\.)?twitter\.com/}.match?(name)
name
else
"https://twitter.com/#{name}"
diff --git a/app/helpers/application_settings_helper.rb b/app/helpers/application_settings_helper.rb
index adbf7ab7cf2..aa2466372e1 100644
--- a/app/helpers/application_settings_helper.rb
+++ b/app/helpers/application_settings_helper.rb
@@ -497,7 +497,8 @@ module ApplicationSettingsHelper
:projects_api_rate_limit_unauthenticated,
:gitlab_dedicated_instance,
:ci_max_includes,
- :allow_account_deletion
+ :allow_account_deletion,
+ :gitlab_shell_operation_limit
].tap do |settings|
next if Gitlab.com?
diff --git a/app/helpers/auth_helper.rb b/app/helpers/auth_helper.rb
index 0feaee2bd93..c928c6479de 100644
--- a/app/helpers/auth_helper.rb
+++ b/app/helpers/auth_helper.rb
@@ -53,7 +53,8 @@ module AuthHelper
saml: 'saml_login_button',
openid_connect: 'oidc_login_button',
github: 'github_login_button',
- gitlab: 'gitlab_oauth_login_button'
+ gitlab: 'gitlab_oauth_login_button',
+ facebook: 'facebook_login_button'
}[provider.to_sym]
end
diff --git a/app/helpers/blob_helper.rb b/app/helpers/blob_helper.rb
index be9306ce80b..6746e6549ec 100644
--- a/app/helpers/blob_helper.rb
+++ b/app/helpers/blob_helper.rb
@@ -118,8 +118,8 @@ module BlobHelper
"#{blob_raw_path.rpartition('/').first}/"
end
- # SVGs can contain malicious JavaScript; only include whitelisted
- # elements and attributes. Note that this whitelist is by no means complete
+ # SVGs can contain malicious JavaScript; only include allowlisted
+ # elements and attributes. Note that this allowlist is by no means complete
# and may omit some elements.
def sanitize_svg_data(data)
Gitlab::Sanitizers::SVG.clean(data)
diff --git a/app/helpers/button_helper.rb b/app/helpers/button_helper.rb
index 64d6ba155cd..6e0ba748d85 100644
--- a/app/helpers/button_helper.rb
+++ b/app/helpers/button_helper.rb
@@ -98,6 +98,68 @@ module ButtonHelper
href: href,
data: data
end
+
+ # Creates a link that looks like a button.
+ #
+ # It renders a Pajamas::ButtonComponent.
+ #
+ # It has the same API as `link_to`, but with some additional options
+ # specific to button rendering.
+ #
+ # Examples:
+ # # Default button
+ # link_button_to _('Foo'), some_path
+ #
+ # # Default button using a block
+ # link_button_to some_path do
+ # _('Foo')
+ # end
+ #
+ # # Confirm variant
+ # link_button_to _('Foo'), some_path, variant: :confirm
+ #
+ # # With icon
+ # link_button_to _('Foo'), some_path, icon: 'pencil'
+ #
+ # # Icon-only
+ # # NOTE: The content must be `nil` in order to correctly render. Use aria-label
+ # # to ensure the link is accessible.
+ # link_button_to nil, some_path, icon: 'pencil', 'aria-label': _('Foo')
+ #
+ # # Small button
+ # link_button_to _('Foo'), some_path, size: :small
+ #
+ # # Secondary category danger button
+ # link_button_to _('Foo'), some_path, variant: :danger, category: :secondary
+ #
+ # For accessibility, ensure that icon-only links have aria-label set.
+ def link_button_to(name = nil, href = nil, options = nil, &block)
+ if block
+ options = href
+ href = name
+ end
+
+ options ||= {}
+
+ # Ignore args that don't make sense for links, like disabled, loading, etc.
+ options_for_button = %i[
+ category
+ variant
+ size
+ block
+ selected
+ icon
+ target
+ method
+ ]
+
+ args = options.slice(*options_for_button)
+ button_options = options.except(*options_for_button)
+
+ render Pajamas::ButtonComponent.new(href: href, **args, button_options: button_options) do
+ block.present? ? yield : name
+ end
+ end
end
ButtonHelper.prepend_mod_with('ButtonHelper')
diff --git a/app/helpers/calendar_helper.rb b/app/helpers/calendar_helper.rb
index ad4116fc3da..d70a860d468 100644
--- a/app/helpers/calendar_helper.rb
+++ b/app/helpers/calendar_helper.rb
@@ -3,7 +3,7 @@
module CalendarHelper
def calendar_url_options
{ format: :ics,
- feed_token: current_user.try(:feed_token),
+ feed_token: generate_feed_token(:ics),
due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
sort: 'closest_future_date' }
end
diff --git a/app/helpers/ci/jobs_helper.rb b/app/helpers/ci/jobs_helper.rb
index a7e1de173bd..991b1f4d74e 100644
--- a/app/helpers/ci/jobs_helper.rb
+++ b/app/helpers/ci/jobs_helper.rb
@@ -2,16 +2,16 @@
module Ci
module JobsHelper
- def jobs_data
+ def jobs_data(project, build)
{
- "endpoint" => project_job_path(@project, @build, format: :json),
- "project_path" => @project.full_path,
+ "endpoint" => project_job_path(project, build, format: :json),
+ "project_path" => project.full_path,
"artifact_help_url" => help_page_path('user/gitlab_com/index.md', anchor: 'gitlab-cicd'),
"deployment_help_url" => help_page_path('user/project/clusters/deploy_to_cluster.md', anchor: 'troubleshooting'),
- "runner_settings_url" => project_runners_path(@build.project, anchor: 'js-runners-settings'),
- "page_path" => project_job_path(@project, @build),
- "build_status" => @build.status,
- "build_stage" => @build.stage_name,
+ "runner_settings_url" => project_runners_path(build.project, anchor: 'js-runners-settings'),
+ "page_path" => project_job_path(project, build),
+ "build_status" => build.status,
+ "build_stage" => build.stage_name,
"log_state" => '',
"build_options" => javascript_build_options,
"retry_outdated_job_docs_url" => help_page_path('ci/pipelines/settings', anchor: 'retry-outdated-jobs')
diff --git a/app/helpers/ci/pipeline_schedules_helper.rb b/app/helpers/ci/pipeline_schedules_helper.rb
new file mode 100644
index 00000000000..e5125353b99
--- /dev/null
+++ b/app/helpers/ci/pipeline_schedules_helper.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Ci
+ module PipelineSchedulesHelper
+ def js_pipeline_schedules_form_data(project, schedule)
+ {
+ full_path: project.full_path,
+ daily_limit: schedule.daily_limit,
+ timezone_data: timezone_data.to_json,
+ project_id: project.id,
+ default_branch: project.default_branch,
+ settings_link: project_settings_ci_cd_path(project),
+ schedules_path: pipeline_schedules_path(project)
+ }
+ end
+ end
+end
+
+Ci::PipelineSchedulesHelper.prepend_mod_with('Ci::PipelineSchedulesHelper')
diff --git a/app/helpers/ci/pipelines_helper.rb b/app/helpers/ci/pipelines_helper.rb
index b222ca5538d..a034e4331c0 100644
--- a/app/helpers/ci/pipelines_helper.rb
+++ b/app/helpers/ci/pipelines_helper.rb
@@ -68,18 +68,6 @@ module Ci
]
end
- def has_pipeline_badges?(pipeline)
- pipeline.schedule? ||
- pipeline.child? ||
- pipeline.latest? ||
- pipeline.merge_train_pipeline? ||
- pipeline.has_yaml_errors? ||
- pipeline.failure_reason? ||
- pipeline.auto_devops_source? ||
- pipeline.detached_merge_request_pipeline? ||
- pipeline.stuck?
- end
-
def pipelines_list_data(project, list_url)
artifacts_endpoint_placeholder = ':pipeline_artifacts_id'
diff --git a/app/helpers/clusters_helper.rb b/app/helpers/clusters_helper.rb
index 458d81b3401..5c410a28229 100644
--- a/app/helpers/clusters_helper.rb
+++ b/app/helpers/clusters_helper.rb
@@ -57,12 +57,6 @@ module ClustersHelper
render_if_exists 'clusters/clusters/environments'
when 'apps'
render 'applications'
- when 'integrations'
- if Feature.enabled?(:remove_monitor_metrics)
- render('details', expanded: expanded)
- else
- render 'integrations'
- end
when 'settings'
render 'advanced_settings_container'
else
diff --git a/app/helpers/colors_helper.rb b/app/helpers/colors_helper.rb
index bc72122220a..80cf6f197e5 100644
--- a/app/helpers/colors_helper.rb
+++ b/app/helpers/colors_helper.rb
@@ -4,7 +4,9 @@ module ColorsHelper
HEX_COLOR_PATTERN = /\A\#(?:[0-9A-Fa-f]{3}){1,2}\Z/.freeze
def hex_color_to_rgb_array(hex_color)
- raise ArgumentError, "invalid hex color `#{hex_color}`" unless hex_color =~ HEX_COLOR_PATTERN
+ unless hex_color.is_a?(String) && HEX_COLOR_PATTERN.match?(hex_color)
+ raise ArgumentError, "invalid hex color `#{hex_color}`"
+ end
hex_color.length == 7 ? hex_color[1, 7].scan(/.{2}/).map(&:hex) : hex_color[1, 4].scan(/./).map { |v| (v * 2).hex }
end
diff --git a/app/helpers/emails_helper.rb b/app/helpers/emails_helper.rb
index 9f4ed6b8150..7213bd074fc 100644
--- a/app/helpers/emails_helper.rb
+++ b/app/helpers/emails_helper.rb
@@ -41,7 +41,7 @@ module EmailsHelper
end
def sanitize_name(name)
- if name =~ URI::DEFAULT_PARSER.regexp[:URI_REF]
+ if URI::DEFAULT_PARSER.regexp[:URI_REF].match?(name)
name.tr('.', '_')
else
name
diff --git a/app/helpers/environment_helper.rb b/app/helpers/environment_helper.rb
index 00109212934..8140ee97291 100644
--- a/app/helpers/environment_helper.rb
+++ b/app/helpers/environment_helper.rb
@@ -79,7 +79,6 @@ module EnvironmentHelper
can_destroy_environment: can_destroy_environment?(environment),
can_stop_environment: can?(current_user, :stop_environment, environment),
can_admin_environment: can?(current_user, :admin_environment, project),
- **environment_metrics_path(project, environment),
environments_fetch_path: project_environments_path(project, format: :json),
environment_edit_path: edit_project_environment_path(project, environment),
environment_stop_path: stop_project_environment_path(project, environment),
@@ -96,10 +95,4 @@ module EnvironmentHelper
def environments_detail_data_json(user, project, environment)
environments_detail_data(user, project, environment).to_json
end
-
- def environment_metrics_path(project, environment)
- return {} if Feature.enabled?(:remove_monitor_metrics)
-
- { environment_metrics_path: project_metrics_dashboard_path(project, environment: environment) }
- end
end
diff --git a/app/helpers/environments_helper.rb b/app/helpers/environments_helper.rb
index 525fdd3e9f6..3360a5256af 100644
--- a/app/helpers/environments_helper.rb
+++ b/app/helpers/environments_helper.rb
@@ -26,7 +26,7 @@ module EnvironmentsHelper
metrics_data = {}
metrics_data.merge!(project_metrics_data(project)) if project
- metrics_data.merge!(environment_metrics_data(environment, project)) if environment
+ metrics_data.merge!(environment_metrics_data(environment)) if environment
metrics_data.merge!(project_and_environment_metrics_data(project, environment)) if project && environment
metrics_data.merge!(static_metrics_data)
@@ -46,14 +46,6 @@ module EnvironmentsHelper
can?(current_user, :destroy_environment, environment)
end
- def environment_data(environment)
- Gitlab::Json.generate({
- id: environment.id,
- name: environment.name,
- external_url: environment.external_url
- })
- end
-
private
def project_metrics_data(project)
@@ -74,34 +66,20 @@ module EnvironmentsHelper
}
end
- def environment_metrics_data(environment, project = nil)
+ def environment_metrics_data(environment)
return {} unless environment
{
- 'metrics_dashboard_base_path' => metrics_dashboard_base_path(environment, project),
'current_environment_name' => environment.name,
'has_metrics' => environment.has_metrics?.to_s,
'environment_state' => environment.state.to_s
}
end
- def metrics_dashboard_base_path(environment, project)
- # This is needed to support our transition from environment scoped metric paths to project scoped.
- if project
- path = project_metrics_dashboard_path(project)
-
- return path if request.path.include?(path)
- end
-
- project_metrics_dashboard_path(project, environment: environment)
- end
-
def project_and_environment_metrics_data(project, environment)
return {} unless project && environment
{
- 'metrics_endpoint' => additional_metrics_project_environment_path(project, environment, format: :json),
- 'dashboard_endpoint' => metrics_dashboard_project_environment_path(project, environment, format: :json),
'deployments_endpoint' => project_environment_deployments_path(project, environment, format: :json),
'operations_settings_path' => project_settings_operations_path(project),
'can_access_operations_settings' => can?(current_user, :admin_operations, project).to_s,
diff --git a/app/helpers/feed_token_helper.rb b/app/helpers/feed_token_helper.rb
new file mode 100644
index 00000000000..751a8df4782
--- /dev/null
+++ b/app/helpers/feed_token_helper.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+module FeedTokenHelper
+ def generate_feed_token(type)
+ feed_token = current_user&.feed_token
+ return unless feed_token
+
+ final_path = "#{current_request.path}.#{type}"
+ digest = OpenSSL::HMAC.hexdigest("SHA256", feed_token, final_path)
+ "#{User::FEED_TOKEN_PREFIX}#{digest}-#{current_user.id}"
+ end
+end
diff --git a/app/helpers/form_helper.rb b/app/helpers/form_helper.rb
index 3d0b899e867..d5f38debae4 100644
--- a/app/helpers/form_helper.rb
+++ b/app/helpers/form_helper.rb
@@ -165,8 +165,8 @@ module FormHelper
def multiple_assignees_dropdown_options(options)
new_options = options.dup
- new_options[:title] = _('Select assignee(s)')
- new_options[:data][:'dropdown-header'] = 'Assignee(s)'
+ new_options[:title] = _('Select assignees')
+ new_options[:data][:'dropdown-header'] = 'Assignees'
new_options[:data][:'max-select'] = ::Issuable::MAX_NUMBER_OF_ASSIGNEES_OR_REVIEWERS
new_options
@@ -175,8 +175,8 @@ module FormHelper
def multiple_reviewers_dropdown_options(options)
new_options = options.dup
- new_options[:title] = _('Select reviewer(s)')
- new_options[:data][:'dropdown-header'] = _('Reviewer(s)')
+ new_options[:title] = _('Select reviewers')
+ new_options[:data][:'dropdown-header'] = _('Reviewers')
new_options[:data][:'max-select'] = ::Issuable::MAX_NUMBER_OF_ASSIGNEES_OR_REVIEWERS
diff --git a/app/helpers/groups_helper.rb b/app/helpers/groups_helper.rb
index a4f463a23be..e552b01f7ba 100644
--- a/app/helpers/groups_helper.rb
+++ b/app/helpers/groups_helper.rb
@@ -25,6 +25,10 @@ module GroupsHelper
Ability.allowed?(current_user, :admin_group_member, group)
end
+ def can_admin_service_accounts?(group)
+ false
+ end
+
def group_icon_url(group, options = {})
if group.is_a?(String)
group = Group.find_by_full_path(group)
@@ -143,6 +147,7 @@ module GroupsHelper
def group_overview_tabs_app_data(group)
{
+ group_id: group.id,
subgroups_and_projects_endpoint: group_children_path(group, format: :json),
shared_projects_endpoint: group_shared_projects_path(group, format: :json),
archived_projects_endpoint: group_children_path(group, format: :json, archived: 'only'),
diff --git a/app/helpers/integrations_helper.rb b/app/helpers/integrations_helper.rb
index ffea23bf55d..4b5fadf3397 100644
--- a/app/helpers/integrations_helper.rb
+++ b/app/helpers/integrations_helper.rb
@@ -30,6 +30,10 @@ module IntegrationsHelper
_("Alert")
when "incident"
_("Incident")
+ when "group_mention"
+ _("Group mention in public")
+ when "group_confidential_mention"
+ _("Group mention in private")
end
end
# rubocop:enable Metrics/CyclomaticComplexity
@@ -290,6 +294,10 @@ module IntegrationsHelper
s_("ProjectService|Trigger event when a new, unique alert is recorded.")
when "incident"
s_("ProjectService|Trigger event when an incident is created.")
+ when "group_mention"
+ s_("ProjectService|Trigger event when a group is mentioned in a public context.")
+ when "group_confidential_mention"
+ s_("ProjectService|Trigger event when a group is mentioned in a confidential context.")
end
end
# rubocop:enable Metrics/CyclomaticComplexity
diff --git a/app/helpers/issuables_helper.rb b/app/helpers/issuables_helper.rb
index e247577aed0..e921e9bae4d 100644
--- a/app/helpers/issuables_helper.rb
+++ b/app/helpers/issuables_helper.rb
@@ -43,14 +43,10 @@ module IssuablesHelper
due_date_with_remaining_days(milestone[:due_date], milestone[:start_date])
end
- def sidebar_due_date_tooltip_label(due_date)
- [_('Due date'), due_date_with_remaining_days(due_date)].compact.join('<br/>')
- end
-
def due_date_with_remaining_days(due_date, start_date = nil)
return unless due_date
- "#{due_date.to_s(:medium)} (#{remaining_days_in_words(due_date, start_date)})"
+ "#{due_date.to_fs(:medium)} (#{remaining_days_in_words(due_date, start_date)})"
end
def multi_label_name(current_labels, default_label)
diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb
index 341c50abf84..d9b9b27d16c 100644
--- a/app/helpers/issues_helper.rb
+++ b/app/helpers/issues_helper.rb
@@ -231,13 +231,15 @@ module IssuesHelper
can_read_crm_organization: can?(current_user, :read_crm_organization, group).to_s,
has_any_issues: @has_issues.to_s,
has_any_projects: @has_projects.to_s,
- new_project_path: new_project_path(namespace_id: group.id)
+ new_project_path: new_project_path(namespace_id: group.id),
+ group_id: group.id
)
end
def dashboard_issues_list_data(current_user)
{
autocomplete_award_emojis_path: autocomplete_award_emojis_path,
+ autocomplete_users_path: autocomplete_users_path,
calendar_path: url_for(safe_params.merge(calendar_url_options)),
dashboard_labels_path: dashboard_labels_path(format: :json, include_ancestor_groups: true),
dashboard_milestones_path: dashboard_milestones_path(format: :json),
diff --git a/app/helpers/namespaces_helper.rb b/app/helpers/namespaces_helper.rb
index 01030690daf..ff5e4248d98 100644
--- a/app/helpers/namespaces_helper.rb
+++ b/app/helpers/namespaces_helper.rb
@@ -5,14 +5,6 @@ module NamespacesHelper
params.dig(:project, :namespace_id) || params[:namespace_id]
end
- def namespace_icon(namespace, size = 40)
- if namespace.is_a?(Group)
- group_icon_url(namespace)
- else
- avatar_icon_for_user(namespace.owner, size)
- end
- end
-
def cascading_namespace_settings_popover_data(attribute, group, settings_path_helper)
locked_by_ancestor = group.namespace_settings.public_send("#{attribute}_locked_by_ancestor?") # rubocop:disable GitlabSecurity/PublicSend
diff --git a/app/helpers/nav/new_dropdown_helper.rb b/app/helpers/nav/new_dropdown_helper.rb
index 201007863b2..306c4d8694e 100644
--- a/app/helpers/nav/new_dropdown_helper.rb
+++ b/app/helpers/nav/new_dropdown_helper.rb
@@ -70,7 +70,7 @@ module Nav
id: 'new_issue',
title: _('New issue'),
href: new_project_issue_path(project),
- data: { track_action: 'click_link_new_issue', track_label: 'plus_menu_dropdown', track_property: 'navigation_top', qa_selector: 'new_issue_link' }
+ data: { track_action: 'click_link_new_issue', track_label: 'plus_menu_dropdown', track_property: 'navigation_top', testid: 'new_issue_link' }
)
)
end
@@ -116,7 +116,7 @@ module Nav
id: 'general_new_project',
title: _('New project/repository'),
href: new_project_path,
- data: { track_action: 'click_link_new_project', track_label: 'plus_menu_dropdown', track_property: 'navigation_top', qa_selector: 'global_new_project_link' }
+ data: { track_action: 'click_link_new_project', track_label: 'plus_menu_dropdown', track_property: 'navigation_top', testid: 'global_new_project_link' }
)
)
end
@@ -127,7 +127,7 @@ module Nav
id: 'general_new_group',
title: _('New group'),
href: new_group_path,
- data: { track_action: 'click_link_new_group', track_label: 'plus_menu_dropdown', track_property: 'navigation_top', qa_selector: 'global_new_group_link' }
+ data: { track_action: 'click_link_new_group', track_label: 'plus_menu_dropdown', track_property: 'navigation_top', testid: 'global_new_group_link' }
)
)
end
@@ -138,7 +138,7 @@ module Nav
id: 'general_new_snippet',
title: _('New snippet'),
href: new_snippet_path,
- data: { track_action: 'click_link_new_snippet_parent', track_label: 'plus_menu_dropdown', track_property: 'navigation_top', qa_selector: 'global_new_snippet_link' }
+ data: { track_action: 'click_link_new_snippet_parent', track_label: 'plus_menu_dropdown', track_property: 'navigation_top', testid: 'global_new_snippet_link' }
)
)
end
diff --git a/app/helpers/nav/top_nav_helper.rb b/app/helpers/nav/top_nav_helper.rb
index c41cf7f500f..d74efac76aa 100644
--- a/app/helpers/nav/top_nav_helper.rb
+++ b/app/helpers/nav/top_nav_helper.rb
@@ -109,7 +109,7 @@ module Nav
builder.add_primary_menu_item_with_shortcut(
header: top_nav_localized_headers[:switch_to],
active: nav == 'project' || active_nav_link?(path: %w[root#index projects#trending projects#starred dashboard/projects#index]),
- data: { track_label: "projects_dropdown", track_action: "click_dropdown", track_property: "navigation_top", qa_selector: "projects_dropdown" },
+ data: { track_label: "projects_dropdown", track_action: "click_dropdown", track_property: "navigation_top", testid: "projects_dropdown" },
view: PROJECTS_VIEW,
shortcut_href: dashboard_projects_path,
**projects_menu_item_attrs
@@ -123,7 +123,7 @@ module Nav
builder.add_primary_menu_item_with_shortcut(
header: top_nav_localized_headers[:switch_to],
active: nav == 'group' || active_nav_link?(path: %w[dashboard/groups explore/groups]),
- data: { track_label: "groups_dropdown", track_action: "click_dropdown", track_property: "navigation_top", qa_selector: "groups_dropdown" },
+ data: { track_label: "groups_dropdown", track_action: "click_dropdown", track_property: "navigation_top", testid: "groups_dropdown" },
view: GROUPS_VIEW,
shortcut_href: dashboard_groups_path,
**groups_menu_item_attrs
@@ -218,7 +218,7 @@ module Nav
active: active_nav_link?(controller: 'admin/sessions'),
icon: 'lock',
href: new_admin_session_path,
- data: { qa_selector: 'menu_item_link', qa_title: title, **menu_data_tracking_attrs(title) }
+ data: { testid: 'menu_item_link', qa_title: title, **menu_data_tracking_attrs(title) }
)
end
end
@@ -316,7 +316,7 @@ module Nav
id: 'your',
title: title,
href: dashboard_projects_path,
- data: { qa_selector: 'menu_item_link', qa_title: title, **menu_data_tracking_attrs(title) }
+ data: { testid: 'menu_item_link', qa_title: title, **menu_data_tracking_attrs(title) }
)
end
@@ -330,7 +330,7 @@ module Nav
id: 'your',
title: title,
href: dashboard_groups_path,
- data: { qa_selector: 'menu_item_link', qa_title: title, **menu_data_tracking_attrs(title) }
+ data: { testid: 'menu_item_link', qa_title: title, **menu_data_tracking_attrs(title) }
)
builder.build
end
diff --git a/app/helpers/packages_helper.rb b/app/helpers/packages_helper.rb
index 8861f1ffe9a..31fcc77925b 100644
--- a/app/helpers/packages_helper.rb
+++ b/app/helpers/packages_helper.rb
@@ -74,6 +74,16 @@ module PackagesHelper
Ability.allowed?(current_user, :admin_group, group)
end
+ def can_delete_packages?(project)
+ Gitlab.config.packages.enabled &&
+ Ability.allowed?(current_user, :destroy_package, project)
+ end
+
+ def can_delete_group_packages?(group)
+ group.packages_feature_enabled? &&
+ Ability.allowed?(current_user, :destroy_package, group)
+ end
+
def cleanup_settings_data
{
project_id: @project.id,
diff --git a/app/helpers/projects/observability_helper.rb b/app/helpers/projects/observability_helper.rb
new file mode 100644
index 00000000000..24bc1928a36
--- /dev/null
+++ b/app/helpers/projects/observability_helper.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+module Projects
+ module ObservabilityHelper
+ def observability_tracing_view_model(project)
+ Gitlab::Json.generate({
+ tracingUrl: Gitlab::Observability.tracing_url(project),
+ provisioningUrl: Gitlab::Observability.provisioning_url(project),
+ oauthUrl: Gitlab::Observability.oauth_url
+ })
+ end
+ end
+end
diff --git a/app/helpers/projects/pages_helper.rb b/app/helpers/projects/pages_helper.rb
index f46c11db1db..d90ea0ec598 100644
--- a/app/helpers/projects/pages_helper.rb
+++ b/app/helpers/projects/pages_helper.rb
@@ -7,5 +7,17 @@ module Projects
(Gitlab.config.pages.external_http || Gitlab.config.pages.external_https) &&
project.can_create_custom_domains?
end
+
+ def pages_subdomain(project)
+ Gitlab::Pages::UrlBuilder
+ .new(project)
+ .project_namespace
+ end
+
+ def build_pages_url(project, with_unique_domain:)
+ Gitlab::Pages::UrlBuilder
+ .new(project)
+ .pages_url(with_unique_domain: with_unique_domain)
+ end
end
end
diff --git a/app/helpers/projects/pipeline_helper.rb b/app/helpers/projects/pipeline_helper.rb
index caebbd5250e..42e8e44c94c 100644
--- a/app/helpers/projects/pipeline_helper.rb
+++ b/app/helpers/projects/pipeline_helper.rb
@@ -44,7 +44,7 @@ module Projects
failed: pipeline.failure_reason?.to_s,
auto_devops: pipeline.auto_devops_source?.to_s,
detached: pipeline.detached_merge_request_pipeline?.to_s,
- stuck: pipeline.stuck?,
+ stuck: pipeline.stuck?.to_s,
ref_text: pipeline.ref_text
}
end
diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb
index 9415e7d4dc3..e27ee1acb22 100644
--- a/app/helpers/projects_helper.rb
+++ b/app/helpers/projects_helper.rb
@@ -172,18 +172,6 @@ module ProjectsHelper
project.fork_source if project.fork_source && can?(current_user, :read_project, project.fork_source)
end
- def project_search_tabs?(tab)
- return false unless @project.present?
-
- abilities = Array(search_tab_ability_map[tab])
-
- if @project.respond_to?(:each) # support multi-project select
- @project.any? { |project| abilities.any? { |ability| can?(current_user, ability, project) } }
- else
- abilities.any? { |ability| can?(current_user, ability, @project) }
- end
- end
-
def can_change_visibility_level?(project, current_user)
can?(current_user, :change_visibility_level, project)
end
@@ -511,9 +499,9 @@ module ProjectsHelper
def clusters_deprecation_alert_message
if has_active_license?
- s_('ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of February 2023. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}. Contact GitLab Support if you have any additional questions.')
+ s_('ClusterIntegration|The certificate-based Kubernetes integration is deprecated and will be removed in the future. You should %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}. For more information, see the %{deprecationLinkStart}deprecation epic%{deprecationLinkEnd}, or contact GitLab support.')
else
- s_('ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of February 2023. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}.')
+ s_('ClusterIntegration|The certificate-based Kubernetes integration is deprecated and will be removed in the future. You should %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}. For more information, see the %{deprecationLinkStart}deprecation epic%{deprecationLinkEnd}.')
end
end
@@ -547,8 +535,32 @@ module ProjectsHelper
project.ssh_url_to_repo
end
+ def can_view_branch_rules?
+ can?(current_user, :maintainer_access, @project)
+ end
+
+ def can_push_code?
+ current_user&.can?(:push_code, @project)
+ end
+
+ def can_admin_associated_clusters?(project)
+ can_admin_project_clusters?(project) || can_admin_group_clusters?(project)
+ end
+
+ def branch_rules_path
+ project_settings_repository_path(@project, anchor: 'js-branch-rules')
+ end
+
private
+ def can_admin_project_clusters?(project)
+ project.clusters.any? && can?(current_user, :admin_cluster, project)
+ end
+
+ def can_admin_group_clusters?(project)
+ project.group && project.group.clusters.any? && can?(current_user, :admin_cluster, project.group)
+ end
+
def create_merge_request_path(project, source_project, ref, merge_request)
return if merge_request.present?
return unless can?(current_user, :create_merge_request_from, project)
@@ -590,41 +602,6 @@ module ProjectsHelper
s_(str).html_safe % { provider: provider, link_start: link_start, link_end: '</a>'.html_safe }
end
- def tab_ability_map
- {
- cycle_analytics: :read_cycle_analytics,
- environments: :read_environment,
- metrics_dashboards: :metrics_dashboard,
- milestones: :read_milestone,
- snippets: :read_snippet,
- settings: :admin_project,
- builds: :read_build,
- clusters: :read_cluster,
- serverless: :read_cluster,
- terraform: :read_terraform_state,
- error_tracking: :read_sentry_issue,
- alert_management: :read_alert_management_alert,
- incidents: :read_issue,
- labels: :read_label,
- issues: :read_issue,
- project_members: :read_project_member,
- wiki: :read_wiki,
- feature_flags: :read_feature_flag,
- analytics: :read_analytics
- }
- end
-
- def search_tab_ability_map
- @search_tab_ability_map ||= tab_ability_map.merge(
- blobs: :read_code,
- commits: :read_code,
- merge_requests: :read_merge_request,
- notes: [:read_merge_request, :read_code, :read_issue, :read_snippet],
- users: :read_project_member,
- wiki_blobs: :read_wiki
- )
- end
-
def project_lfs_status(project)
if project.lfs_enabled?
content_tag(:span, class: 'lfs-enabled') do
@@ -880,24 +857,4 @@ module ProjectsHelper
end
end
-def can_admin_associated_clusters?(project)
- can_admin_project_clusters?(project) || can_admin_group_clusters?(project)
-end
-
-def can_admin_project_clusters?(project)
- project.clusters.any? && can?(current_user, :admin_cluster, project)
-end
-
-def can_admin_group_clusters?(project)
- project.group && project.group.clusters.any? && can?(current_user, :admin_cluster, project.group)
-end
-
-def can_view_branch_rules?
- can?(current_user, :maintainer_access, @project)
-end
-
-def branch_rules_path
- project_settings_repository_path(@project, anchor: 'js-branch-rules')
-end
-
ProjectsHelper.prepend_mod_with('ProjectsHelper')
diff --git a/app/helpers/rss_helper.rb b/app/helpers/rss_helper.rb
index 67c7d244f11..90dd4e8fedb 100644
--- a/app/helpers/rss_helper.rb
+++ b/app/helpers/rss_helper.rb
@@ -2,6 +2,6 @@
module RssHelper
def rss_url_options
- { format: :atom, feed_token: current_user.try(:feed_token) }
+ { format: :atom, feed_token: generate_feed_token(:atom) }
end
end
diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb
index 8fbbd18c9ae..cd32023adb6 100644
--- a/app/helpers/search_helper.rb
+++ b/app/helpers/search_helper.rb
@@ -373,17 +373,10 @@ module SearchHelper
def users_autocomplete(term, limit = 5)
return [] unless current_user && Ability.allowed?(current_user, :read_users_list)
- users = if Feature.enabled?(:autocomplete_users_use_search_service)
- ::SearchService
- .new(current_user, { scope: 'users', per_page: limit, search: term })
- .search_objects
- else
- is_current_user_admin = current_user.can_admin_all_resources?
- scope = is_current_user_admin ? User.all : User.without_forbidden_states
- scope.search(term, with_private_emails: is_current_user_admin, use_minimum_char_limit: false).limit(limit)
- end
-
- users.map do |user|
+ ::SearchService
+ .new(current_user, { scope: 'users', per_page: limit, search: term })
+ .search_objects
+ .map do |user|
{
category: "Users",
id: user.id,
@@ -471,65 +464,15 @@ module SearchHelper
result
end
- def show_code_search_tab?
- return true if project_search_tabs?(:blobs)
-
- @project.nil? && search_service.show_elasticsearch_tabs? && feature_flag_tab_enabled?(:global_search_code_tab)
- end
-
- def show_wiki_search_tab?
- return true if project_search_tabs?(:wiki_blobs)
-
- @project.nil? && search_service.show_elasticsearch_tabs? && feature_flag_tab_enabled?(:global_search_wiki_tab)
- end
-
- def show_commits_search_tab?
- return true if project_search_tabs?(:commits)
-
- @project.nil? && search_service.show_elasticsearch_tabs? && feature_flag_tab_enabled?(:global_search_commits_tab)
- end
-
- def show_issues_search_tab?
- return true if project_search_tabs?(:issues)
-
- @project.nil? && feature_flag_tab_enabled?(:global_search_issues_tab)
- end
-
- def show_merge_requests_search_tab?
- return true if project_search_tabs?(:merge_requests)
-
- @project.nil? && feature_flag_tab_enabled?(:global_search_merge_requests_tab)
- end
-
- def show_comments_search_tab?
- return true if project_search_tabs?(:notes)
-
- @project.nil? && search_service.show_elasticsearch_tabs?
- end
-
- def show_snippets_search_tab?
- search_service.show_snippets? && @project.nil? && feature_flag_tab_enabled?(:global_search_snippet_titles_tab)
- end
-
- # search page scope navigation
- def search_navigation
+ def nav_options
{
- projects: { sort: 1, label: _("Projects"), data: { qa_selector: 'projects_tab' }, condition: @project.nil? },
- blobs: { sort: 2, label: _("Code"), data: { qa_selector: 'code_tab' }, condition: show_code_search_tab? },
- # sort: 3 is reserved for EE items
- issues: { sort: 4, label: _("Issues"), condition: show_issues_search_tab? },
- merge_requests: { sort: 5, label: _("Merge requests"), condition: show_merge_requests_search_tab? },
- wiki_blobs: { sort: 6, label: _("Wiki"), condition: show_wiki_search_tab? },
- commits: { sort: 7, label: _("Commits"), condition: show_commits_search_tab? },
- notes: { sort: 8, label: _("Comments"), condition: show_comments_search_tab? },
- milestones: { sort: 9, label: _("Milestones"), condition: project_search_tabs?(:milestones) || @project.nil? },
- users: { sort: 10, label: _("Users"), condition: show_user_search_tab? },
- snippet_titles: { sort: 11, label: _("Titles and Descriptions"), search: { snippets: true, group_id: nil, project_id: nil }, condition: show_snippets_search_tab? }
+ show_snippets: search_service.show_snippets?
}
end
def search_navigation_json
- sorted_navigation = search_navigation.sort_by { |_, h| h[:sort] }
+ search_navigation = Search::Navigation.new(user: current_user, project: @project, group: @group, options: nav_options)
+ sorted_navigation = search_navigation.tabs.sort_by { |_, h| h[:sort] }
sorted_navigation.each_with_object({}) do |(key, value), hash|
hash[key] = search_filter_link_json(key, value[:label], value[:data], value[:search]) if value[:condition]
@@ -611,14 +554,6 @@ module SearchHelper
simple_search_highlight_and_truncate(issuable.description, search_term, highlighter: '<span class="gl-text-gray-900 gl-font-weight-bold">\1</span>')
end
- def show_user_search_tab?
- return project_search_tabs?(:users) if @project
- return false unless can?(current_user, :read_users_list)
- return true if @group
-
- Feature.enabled?(:global_search_users_tab, current_user, type: :ops)
- end
-
def issuable_state_to_badge_class(issuable)
# Closed is considered "danger" for MR so we need to handle separately
if issuable.is_a?(::MergeRequest)
@@ -647,10 +582,6 @@ module SearchHelper
end
end
- def feature_flag_tab_enabled?(flag)
- @group.present? || Feature.enabled?(flag, current_user, type: :ops)
- end
-
def sanitized_search_params
sanitized_params = params.dup
@@ -664,6 +595,10 @@ module SearchHelper
sanitized_params
end
+
+ def wiki_blob_link(wiki_blob)
+ project_wiki_path(wiki_blob.project, wiki_blob.basename)
+ end
end
SearchHelper.prepend_mod_with('SearchHelper')
diff --git a/app/helpers/sidebars_helper.rb b/app/helpers/sidebars_helper.rb
index 02a912d0227..90917cb96e0 100644
--- a/app/helpers/sidebars_helper.rb
+++ b/app/helpers/sidebars_helper.rb
@@ -23,6 +23,10 @@ module SidebarsHelper
end
end
+ def organization_sidebar_context(organization, user, **args)
+ Sidebars::Context.new(container: organization, current_user: user, **args)
+ end
+
def project_sidebar_context(project, user, current_ref, ref_type: nil, **args)
context_data = project_sidebar_context_data(project, user, current_ref, ref_type: ref_type)
Sidebars::Projects::Context.new(**context_data, **args)
@@ -95,7 +99,7 @@ module SidebarsHelper
def super_sidebar_nav_panel(
nav: nil, project: nil, user: nil, group: nil, current_ref: nil, ref_type: nil,
- viewed_user: nil)
+ viewed_user: nil, organization: nil)
context_adds = { route_is_active: method(:active_nav_link?), is_super_sidebar: true }
case nav
when 'project'
@@ -117,12 +121,25 @@ module SidebarsHelper
Sidebars::Search::Panel.new(context)
when 'admin'
Sidebars::Admin::Panel.new(Sidebars::Context.new(current_user: user, container: nil, **context_adds))
+ when 'organization'
+ context = organization_sidebar_context(organization, user, **context_adds)
+ Sidebars::Organizations::SuperSidebarPanel.new(context)
else
context = your_work_sidebar_context(user, **context_adds)
Sidebars::YourWork::Panel.new(context)
end
end
+ def command_palette_data(project: nil)
+ return {} unless project&.repo_exists?
+ return {} if project.empty_repo?
+
+ {
+ project_files_url: project_files_path(project, project.default_branch, format: :json),
+ project_blob_url: project_blob_path(project, project.default_branch)
+ }
+ end
+
private
def search_data
@@ -142,7 +159,8 @@ module SidebarsHelper
customized: user.status&.customized?,
availability: user.status&.availability.to_s,
emoji: user.status&.emoji,
- message: user.status&.message_html&.html_safe,
+ message_html: user.status&.message_html&.html_safe,
+ message: user.status&.message,
clear_after: user_clear_status_at(user)
}
end
@@ -162,7 +180,7 @@ module SidebarsHelper
'data-track-label': item[:id],
'data-track-action': 'click_link',
'data-track-property': 'nav_create_menu',
- 'data-qa-selector': 'create_menu_item',
+ 'data-testid': 'create_menu_item',
'data-qa-create-menu-item': item[:id]
}
}
diff --git a/app/helpers/sorting_helper.rb b/app/helpers/sorting_helper.rb
index 9038d972f65..1405bc7be37 100644
--- a/app/helpers/sorting_helper.rb
+++ b/app/helpers/sorting_helper.rb
@@ -2,6 +2,7 @@
module SortingHelper
include SortingTitlesValuesHelper
+ include ButtonHelper
# rubocop: disable Metrics/AbcSize
def sort_options_hash
@@ -167,10 +168,6 @@ module SortingHelper
}
end
- def sortable_item(item, path, sorted_by)
- link_to item, path, class: sorted_by == item ? 'is-active' : ''
- end
-
def issuable_sort_option_overrides
{
sort_value_oldest_created => sort_value_created_date,
@@ -275,7 +272,7 @@ module SortingHelper
end
def sort_direction_button(reverse_url, reverse_sort, sort_value)
- link_class = 'gl-button btn btn-default btn-icon has-tooltip reverse-sort-btn rspec-reverse-sort'
+ link_class = 'has-tooltip reverse-sort-btn rspec-reverse-sort'
icon = sort_direction_icon(sort_value)
url = reverse_url
@@ -284,9 +281,7 @@ module SortingHelper
link_class += ' disabled'
end
- link_to(url, type: 'button', class: link_class, title: s_('SortOptions|Sort direction')) do
- sprite_icon(icon)
- end
+ link_button_to nil, url, class: link_class, title: s_('SortOptions|Sort direction'), icon: icon
end
def issuable_sort_direction_button(sort_value)
diff --git a/app/helpers/storage_helper.rb b/app/helpers/storage_helper.rb
index a60143db739..669d13c14c2 100644
--- a/app/helpers/storage_helper.rb
+++ b/app/helpers/storage_helper.rb
@@ -21,6 +21,10 @@ module StorageHelper
counter_uploads: storage_counter(statistics.uploads_size)
}
- _("Repository: %{counter_repositories} / Wikis: %{counter_wikis} / Build Artifacts: %{counter_build_artifacts} / Pipeline Artifacts: %{counter_pipeline_artifacts} / LFS: %{counter_lfs_objects} / Snippets: %{counter_snippets} / Packages: %{counter_packages} / Uploads: %{counter_uploads}") % counters
+ _(
+ "Repository: %{counter_repositories} / Wikis: %{counter_wikis} / Build Artifacts: %{counter_build_artifacts} / " \
+ "Pipeline Artifacts: %{counter_pipeline_artifacts} / LFS: %{counter_lfs_objects} / " \
+ "Snippets: %{counter_snippets} / Packages: %{counter_packages} / Uploads: %{counter_uploads}"
+ ) % counters
end
end
diff --git a/app/helpers/time_helper.rb b/app/helpers/time_helper.rb
index cb6f60ab79b..ad473875a53 100644
--- a/app/helpers/time_helper.rb
+++ b/app/helpers/time_helper.rb
@@ -17,10 +17,6 @@ module TimeHelper
end
end
- def date_from_to(from, to)
- "#{from.to_s(:short)} - #{to.to_s(:short)}"
- end
-
def duration_in_numbers(duration_in_seconds)
seconds = duration_in_seconds % 1.minute
minutes = (duration_in_seconds / 1.minute) % (1.hour / 1.minute)
diff --git a/app/helpers/timeboxes_helper.rb b/app/helpers/timeboxes_helper.rb
index 66c9011fbcc..cb6ed059ec9 100644
--- a/app/helpers/timeboxes_helper.rb
+++ b/app/helpers/timeboxes_helper.rb
@@ -109,7 +109,7 @@ module TimeboxesHelper
content = [
title,
"<br />",
- date.to_s(:medium),
+ date.to_fs(:medium),
"(#{time_ago} #{state})"
].join(" ")
@@ -172,7 +172,7 @@ module TimeboxesHelper
def milestone_tooltip_due_date(milestone)
if milestone.due_date
- "#{milestone.due_date.to_s(:medium)} (#{remaining_days_in_words(milestone.due_date, milestone.start_date)})"
+ "#{milestone.due_date.to_fs(:medium)} (#{remaining_days_in_words(milestone.due_date, milestone.start_date)})"
else
_('Milestone')
end
diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb
index acc7d8a5a10..29998a996e2 100644
--- a/app/helpers/users_helper.rb
+++ b/app/helpers/users_helper.rb
@@ -12,7 +12,7 @@ module UsersHelper
# The user.status can be nil when the user has no status, so we need to protect against that case.
# iso8601 is the official RFC supported format for frontend parsing of date:
# https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date
- user.status&.clear_status_at&.to_s(:iso8601)
+ user.status&.clear_status_at&.to_fs(:iso8601)
end
def user_link(user)
@@ -190,7 +190,9 @@ module UsersHelper
user_activity_path: user_activity_path(user, :json),
utc_offset: local_timezone_instance(user.timezone).now.utc_offset,
user_id: user.id,
- snippets_empty_state: image_path('illustrations/empty-state/empty-snippets-md.svg')
+ snippets_empty_state: image_path('illustrations/empty-state/empty-snippets-md.svg'),
+ new_snippet_path: (new_snippet_path if can?(current_user, :create_snippet)),
+ follow_empty_state: image_path('illustrations/empty-state/empty-friends-md.svg')
}
end
diff --git a/app/helpers/web_ide_button_helper.rb b/app/helpers/web_ide_button_helper.rb
index 9ec22a659d3..185e1b8e0a8 100644
--- a/app/helpers/web_ide_button_helper.rb
+++ b/app/helpers/web_ide_button_helper.rb
@@ -33,10 +33,6 @@ module WebIdeButtonHelper
can_view_pipeline_editor?(project) && path == project.ci_config_path_or_default
end
- def can_push_code?
- current_user&.can?(:push_code, @project)
- end
-
def fork?
!project_fork.nil? && !can_push_code?
end
diff --git a/app/mailers/emails/issues.rb b/app/mailers/emails/issues.rb
index 0328d262dc7..52a16475c07 100644
--- a/app/mailers/emails/issues.rb
+++ b/app/mailers/emails/issues.rb
@@ -190,7 +190,7 @@ module Emails
to: @recipient.notification_email_for(@project.group),
subject: subject("#{@issue.title} (##{@issue.iid})"),
'X-GitLab-NotificationReason' => reason,
- 'X-GitLab-ConfidentialIssue' => confidentiality
+ 'X-GitLab-ConfidentialIssue' => confidentiality.to_s
}
end
end
diff --git a/app/mailers/emails/notes.rb b/app/mailers/emails/notes.rb
index 1e254a32885..bdd63dfc62c 100644
--- a/app/mailers/emails/notes.rb
+++ b/app/mailers/emails/notes.rb
@@ -15,7 +15,14 @@ module Emails
@issue = @note.noteable
@target_url = project_issue_url(*note_target_url_options)
- mail_answer_note_thread(@issue, @note, note_thread_options(reason))
+ mail_answer_note_thread(
+ @issue,
+ @note,
+ note_thread_options(
+ reason,
+ confidentiality: @issue.confidential?
+ )
+ )
end
def note_merge_request_email(recipient_id, note_id, reason = nil)
@@ -62,13 +69,15 @@ module Emails
{ anchor: "note_#{@note.id}" }
end
- def note_thread_options(reason)
+ def note_thread_options(reason, confidentiality: nil)
{
from: sender(@note.author_id),
to: @recipient.notification_email_for(@project&.group || @group),
subject: subject("#{@note.noteable.title} (#{@note.noteable.reference_link_text})"),
'X-GitLab-NotificationReason' => reason
- }
+ }.tap do |options|
+ options['X-GitLab-ConfidentialIssue'] = confidentiality.to_s unless confidentiality.nil?
+ end
end
def setup_note_mail(note_id, recipient_id)
diff --git a/app/mailers/emails/profile.rb b/app/mailers/emails/profile.rb
index 54a4c4be6a8..a382ca15e46 100644
--- a/app/mailers/emails/profile.rb
+++ b/app/mailers/emails/profile.rb
@@ -65,9 +65,7 @@ module Emails
@target_url = profile_personal_access_tokens_url
@token_name = token_name
- Gitlab::I18n.with_locale(@user.preferred_language) do
- mail_with_locale(to: @user.notification_email_or_default, subject: subject(_("A new personal access token has been created")))
- end
+ mail_with_locale(to: @user.notification_email_or_default, subject: subject(_("A new personal access token has been created")))
end
def access_token_about_to_expire_email(user, token_names)
@@ -78,9 +76,7 @@ module Emails
@target_url = profile_personal_access_tokens_url
@days_to_expire = PersonalAccessToken::DAYS_TO_EXPIRE
- Gitlab::I18n.with_locale(@user.preferred_language) do
- mail_with_locale(to: @user.notification_email_or_default, subject: subject(_("Your personal access tokens will expire in %{days_to_expire} days or less") % { days_to_expire: @days_to_expire }))
- end
+ mail_with_locale(to: @user.notification_email_or_default, subject: subject(_("Your personal access tokens will expire in %{days_to_expire} days or less") % { days_to_expire: @days_to_expire }))
end
def access_token_expired_email(user, token_names = [])
@@ -90,9 +86,7 @@ module Emails
@token_names = token_names
@target_url = profile_personal_access_tokens_url
- Gitlab::I18n.with_locale(@user.preferred_language) do
- mail_with_locale(to: @user.notification_email_or_default, subject: subject(_("Your personal access tokens have expired")))
- end
+ email_with_layout(to: @user.notification_email_or_default, subject: subject(_("Your personal access tokens have expired")))
end
def access_token_revoked_email(user, token_name, source = nil)
@@ -103,9 +97,7 @@ module Emails
@target_url = profile_personal_access_tokens_url
@source = source
- Gitlab::I18n.with_locale(@user.preferred_language) do
- mail_with_locale(to: @user.notification_email_or_default, subject: subject(_("A personal access token has been revoked")))
- end
+ mail_with_locale(to: @user.notification_email_or_default, subject: subject(_("A personal access token has been revoked")))
end
def ssh_key_expired_email(user, fingerprints)
@@ -115,9 +107,7 @@ module Emails
@fingerprints = fingerprints
@target_url = profile_keys_url
- Gitlab::I18n.with_locale(@user.preferred_language) do
- mail_with_locale(to: @user.notification_email_or_default, subject: subject(_("Your SSH key has expired")))
- end
+ mail_with_locale(to: @user.notification_email_or_default, subject: subject(_("Your SSH key has expired")))
end
def ssh_key_expiring_soon_email(user, fingerprints)
@@ -127,9 +117,7 @@ module Emails
@fingerprints = fingerprints
@target_url = profile_keys_url
- Gitlab::I18n.with_locale(@user.preferred_language) do
- mail_with_locale(to: @user.notification_email_or_default, subject: subject(_("Your SSH key is expiring soon.")))
- end
+ mail_with_locale(to: @user.notification_email_or_default, subject: subject(_("Your SSH key is expiring soon.")))
end
def unknown_sign_in_email(user, ip, time)
@@ -138,11 +126,9 @@ module Emails
@time = time
@target_url = edit_profile_password_url
- Gitlab::I18n.with_locale(@user.preferred_language) do
- email_with_layout(
- to: @user.notification_email_or_default,
- subject: subject(_("%{host} sign-in from new location") % { host: Gitlab.config.gitlab.host }))
- end
+ email_with_layout(
+ to: @user.notification_email_or_default,
+ subject: subject(_("%{host} sign-in from new location") % { host: Gitlab.config.gitlab.host }))
end
def two_factor_otp_attempt_failed_email(user, ip, time = Time.current)
@@ -150,11 +136,9 @@ module Emails
@ip = ip
@time = time
- Gitlab::I18n.with_locale(@user.preferred_language) do
- email_with_layout(
- to: @user.notification_email_or_default,
- subject: subject(_("Attempted sign in to %{host} using an incorrect verification code") % { host: Gitlab.config.gitlab.host }))
- end
+ email_with_layout(
+ to: @user.notification_email_or_default,
+ subject: subject(_("Attempted sign in to %{host} using an incorrect verification code") % { host: Gitlab.config.gitlab.host }))
end
def disabled_two_factor_email(user)
@@ -162,9 +146,7 @@ module Emails
@user = user
- Gitlab::I18n.with_locale(@user.preferred_language) do
- mail_with_locale(to: @user.notification_email_or_default, subject: subject(_("Two-factor authentication disabled")))
- end
+ mail_with_locale(to: @user.notification_email_or_default, subject: subject(_("Two-factor authentication disabled")))
end
def new_email_address_added_email(user, email)
@@ -173,9 +155,7 @@ module Emails
@user = user
@email = email
- Gitlab::I18n.with_locale(@user.preferred_language) do
- mail_with_locale(to: @user.notification_email_or_default, subject: subject(_("New email address added")))
- end
+ mail_with_locale(to: @user.notification_email_or_default, subject: subject(_("New email address added")))
end
def new_achievement_email(user, achievement)
@@ -184,11 +164,9 @@ module Emails
@user = user
@achievement = achievement
- Gitlab::I18n.with_locale(@user.preferred_language) do
- email_with_layout(
- to: @user.notification_email_or_default,
- subject: subject(s_("Achievements|%{namespace_full_path} awarded you the %{achievement_name} achievement") % { namespace_full_path: @achievement.namespace.full_path, achievement_name: @achievement.name }))
- end
+ email_with_layout(
+ to: @user.notification_email_or_default,
+ subject: subject(s_("Achievements|%{namespace_full_path} awarded you the %{achievement_name} achievement") % { namespace_full_path: @achievement.namespace.full_path, achievement_name: @achievement.name }))
end
end
end
diff --git a/app/mailers/previews/notify_preview.rb b/app/mailers/previews/notify_preview.rb
index d91f69cdd4b..576dbdd8b52 100644
--- a/app/mailers/previews/notify_preview.rb
+++ b/app/mailers/previews/notify_preview.rb
@@ -64,6 +64,11 @@ class NotifyPreview < ActionMailer::Preview
Notify.access_token_created_email(user, 'token_name').message
end
+ def access_token_expired_email
+ token_names = []
+ Notify.access_token_expired_email(user, token_names).message
+ end
+
def access_token_revoked_email
Notify.access_token_revoked_email(user, 'token_name').message
end
diff --git a/app/models/abuse/trust_score.rb b/app/models/abuse/trust_score.rb
index b7ed504a0ba..2e8b7ed6686 100644
--- a/app/models/abuse/trust_score.rb
+++ b/app/models/abuse/trust_score.rb
@@ -2,9 +2,6 @@
module Abuse
class TrustScore < ApplicationRecord
- MAX_EVENTS = 100
- SPAMCHECK_HAM_THRESHOLD = 0.5
-
self.table_name = 'abuse_trust_scores'
enum source: Enums::Abuse::Source.sources
@@ -15,6 +12,9 @@ module Abuse
validates :score, presence: true
validates :source, presence: true
+ scope :order_created_at_asc, -> { order(created_at: :asc) }
+ scope :order_created_at_desc, -> { order(created_at: :desc) }
+
before_create :assign_correlation_id
after_commit :remove_old_scores
@@ -25,14 +25,7 @@ module Abuse
end
def remove_old_scores
- count = user.trust_scores_for_source(source).count
- return unless count > MAX_EVENTS
-
- TrustScore.delete(
- user.trust_scores_for_source(source)
- .order(created_at: :asc)
- .limit(count - MAX_EVENTS)
- )
+ Abuse::UserTrustScore.new(user).remove_old_scores(source)
end
end
end
diff --git a/app/models/abuse/user_trust_score.rb b/app/models/abuse/user_trust_score.rb
new file mode 100644
index 00000000000..3a935e230ae
--- /dev/null
+++ b/app/models/abuse/user_trust_score.rb
@@ -0,0 +1,53 @@
+# frozen_string_literal: true
+
+module Abuse
+ class UserTrustScore
+ MAX_EVENTS = 100
+ SPAMCHECK_HAM_THRESHOLD = 0.5
+
+ def initialize(user)
+ @user = user
+ end
+
+ def spammer?
+ spam_score > SPAMCHECK_HAM_THRESHOLD
+ end
+
+ def spam_score
+ user_scores.spamcheck.average(:score) || 0.0
+ end
+
+ def telesign_score
+ user_scores.telesign.order_created_at_desc.first&.score || 0.0
+ end
+
+ def arkose_global_score
+ user_scores.arkose_global_score.order_created_at_desc.first&.score || 0.0
+ end
+
+ def arkose_custom_score
+ user_scores.arkose_custom_score.order_created_at_desc.first&.score || 0.0
+ end
+
+ def trust_scores_for_source(source)
+ user_scores.where(source: source)
+ end
+
+ def remove_old_scores(source)
+ count = trust_scores_for_source(source).count
+ return unless count > MAX_EVENTS
+
+ Abuse::TrustScore.delete(
+ trust_scores_for_source(source)
+ .order_created_at_asc
+ .limit(count - MAX_EVENTS)
+ )
+ end
+
+ private
+
+ def user_scores
+ Abuse::TrustScore.where(user_id: @user.id)
+ end
+ end
+end
diff --git a/app/models/ai/service_access_token.rb b/app/models/ai/service_access_token.rb
new file mode 100644
index 00000000000..863bdfc7899
--- /dev/null
+++ b/app/models/ai/service_access_token.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module Ai
+ class ServiceAccessToken < ApplicationRecord
+ self.table_name = 'service_access_tokens'
+
+ scope :expired, -> { where('expires_at < :now', now: Time.current) }
+ scope :for_category, ->(category) { where(category: category) }
+
+ attr_encrypted :token,
+ mode: :per_attribute_iv,
+ key: Settings.attr_encrypted_db_key_base_32,
+ algorithm: 'aes-256-gcm',
+ encode: false,
+ encode_iv: false
+
+ validates :token, :expires_at, presence: true
+
+ enum category: {
+ code_suggestions: 1
+ }
+
+ validates :category, presence: true
+ end
+end
diff --git a/app/models/alert_management/http_integration.rb b/app/models/alert_management/http_integration.rb
index d5162865a79..a70168dc0d8 100644
--- a/app/models/alert_management/http_integration.rb
+++ b/app/models/alert_management/http_integration.rb
@@ -4,7 +4,7 @@ module AlertManagement
class HttpIntegration < ApplicationRecord
include ::Gitlab::Routing
- LEGACY_IDENTIFIER = 'legacy'
+ LEGACY_IDENTIFIERS = %w[legacy legacy-prometheus].freeze
belongs_to :project, inverse_of: :alert_management_http_integrations
@@ -20,8 +20,8 @@ module AlertManagement
validates :token, presence: true, format: { with: /\A\h{32}\z/ }
validates :name, presence: true, length: { maximum: 255 }
validates :type_identifier, presence: true
- validates :endpoint_identifier, presence: true, length: { maximum: 255 }, format: { with: /\A[A-Za-z0-9]+\z/ }
- validates :endpoint_identifier, uniqueness: { scope: [:project_id, :active] }, if: :active?
+ validates :endpoint_identifier, presence: true, length: { maximum: 255 }, format: { with: /\A[A-Za-z0-9-]+\z/ }
+ validates :endpoint_identifier, uniqueness: { scope: [:project_id] }
validates :payload_attribute_mapping, json_schema: { filename: 'http_integration_payload_attribute_mapping' }
before_validation :prevent_token_assignment
@@ -33,7 +33,6 @@ module AlertManagement
scope :for_type, ->(type) { where(type_identifier: type) }
scope :for_project, ->(project_ids) { where(project: project_ids) }
scope :active, -> { where(active: true) }
- scope :legacy, -> { for_endpoint_identifier(LEGACY_IDENTIFIER) }
scope :ordered_by_type_and_id, -> { order(:type_identifier, :id) }
enum type_identifier: {
@@ -42,16 +41,18 @@ module AlertManagement
}
def url
- if legacy?
- return project_alerts_notify_url(project, format: :json) if http?
- return notify_project_prometheus_alerts_url(project, format: :json) if prometheus?
+ case endpoint_identifier
+ when 'legacy'
+ project_alerts_notify_url(project, format: :json)
+ when 'legacy-prometheus'
+ notify_project_prometheus_alerts_url(project, format: :json)
+ else
+ project_alert_http_integration_url(project, name_slug, endpoint_identifier, format: :json)
end
-
- project_alert_http_integration_url(project, name_slug, endpoint_identifier, format: :json)
end
def legacy?
- endpoint_identifier == LEGACY_IDENTIFIER
+ LEGACY_IDENTIFIERS.include?(endpoint_identifier)
end
private
diff --git a/app/models/analytics/cycle_analytics/stage.rb b/app/models/analytics/cycle_analytics/stage.rb
index c7bff7c8d7f..6f152e7749e 100644
--- a/app/models/analytics/cycle_analytics/stage.rb
+++ b/app/models/analytics/cycle_analytics/stage.rb
@@ -3,6 +3,8 @@
module Analytics
module CycleAnalytics
class Stage < ApplicationRecord
+ MAX_STAGES_PER_VALUE_STREAM = 15
+
self.table_name = :analytics_cycle_analytics_group_stages
include DatabaseEventTracking
@@ -10,6 +12,8 @@ module Analytics
include Analytics::CycleAnalytics::Parentable
validates :name, uniqueness: { scope: [:group_id, :group_value_stream_id] }
+ validate :max_stages_count, on: :create
+
belongs_to :value_stream, class_name: 'Analytics::CycleAnalytics::ValueStream',
foreign_key: :group_value_stream_id, inverse_of: :stages
@@ -49,6 +53,15 @@ module Analytics
name
group_value_stream_id
].freeze
+
+ private
+
+ def max_stages_count
+ return unless value_stream
+ return unless value_stream.stages.count >= MAX_STAGES_PER_VALUE_STREAM
+
+ errors.add(:value_stream, _('Maximum number of stages per value stream exceeded'))
+ end
end
end
end
diff --git a/app/models/analytics/cycle_analytics/value_stream.rb b/app/models/analytics/cycle_analytics/value_stream.rb
index 31e06075bcb..16446a5b463 100644
--- a/app/models/analytics/cycle_analytics/value_stream.rb
+++ b/app/models/analytics/cycle_analytics/value_stream.rb
@@ -3,6 +3,8 @@
module Analytics
module CycleAnalytics
class ValueStream < ApplicationRecord
+ MAX_VALUE_STREAMS_PER_NAMESPACE = 50
+
self.table_name = :analytics_cycle_analytics_group_value_streams
include Analytics::CycleAnalytics::Parentable
@@ -15,6 +17,7 @@ module Analytics
validates :name, presence: true
validates :name, length: { minimum: 3, maximum: 100, allow_nil: false }, uniqueness: { scope: :group_id }
+ validate :max_value_streams_count, on: :create
accepts_nested_attributes_for :stages, allow_destroy: true
@@ -35,6 +38,13 @@ module Analytics
private
+ def max_value_streams_count
+ return unless namespace
+ return unless namespace.value_streams.count >= MAX_VALUE_STREAMS_PER_NAMESPACE
+
+ errors.add(:namespace, _('Maximum number of value streams per namespace exceeded'))
+ end
+
def ensure_aggregation_record_presence
Analytics::CycleAnalytics::Aggregation.safe_create_for_namespace(namespace)
end
diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb
index a71b47e88d8..827f8bc93be 100644
--- a/app/models/application_setting.rb
+++ b/app/models/application_setting.rb
@@ -38,7 +38,7 @@ class ApplicationSetting < MainClusterwide::ApplicationRecord
encrypted_tofa_url
encrypted_tofa_url_iv
vertex_project
- ], remove_with: '16.2', remove_after: '2023-06-22'
+ ], remove_with: '16.3', remove_after: '2023-07-22'
INSTANCE_REVIEW_MIN_USERS = 50
GRAFANA_URL_ERROR_MESSAGE = 'Please check your Grafana URL setting in ' \
@@ -596,6 +596,13 @@ class ApplicationSetting < MainClusterwide::ApplicationRecord
allow_blank: true,
public_url: ADDRESSABLE_URL_VALIDATION_OPTIONS
+ with_options(presence: true, if: :slack_app_enabled?) do
+ validates :slack_app_id
+ validates :slack_app_secret
+ validates :slack_app_signing_secret
+ validates :slack_app_verification_token
+ end
+
with_options(presence: true, numericality: { only_integer: true, greater_than: 0 }) do
validates :throttle_unauthenticated_api_requests_per_period
validates :throttle_unauthenticated_api_period_in_seconds
diff --git a/app/models/audit_event.rb b/app/models/audit_event.rb
index 9370982be47..163e741d990 100644
--- a/app/models/audit_event.rb
+++ b/app/models/audit_event.rb
@@ -100,40 +100,6 @@ class AuditEvent < ApplicationRecord
super || details[:target_details]
end
- def self.by_group(group)
- group_id = group.id
-
- # Bring entity_type and entity_id from projects and group into one query
- scope1 = Group.find(group_id).all_projects.select("'Project' as entity_type", 'id AS entity_id')
- scope2 = Project.from("(VALUES ('Group', #{group_id})) as projects(entity_type, entity_id)").select('entity_type',
- 'entity_id')
- array_scope = Project.from_union([scope1, scope2], remove_duplicates: false).select(:entity_type, :entity_id)
-
- # order by created_at (id is the tie breaker)
- scope = AuditEvent.order(:created_at, :id)
-
- array_mapping_scope = ->(entity_type_expression, entity_id_expression) do
- AuditEvent.where(AuditEvent.arel_table[:entity_id].eq(entity_id_expression))
- .where(AuditEvent.arel_table[:entity_type].eq(entity_type_expression))
- end
-
- finder_query = ->(created_at_expression, id_expression) do
- # we need to add created_at filter as well because that's the partitioning key
- AuditEvent.where(
- AuditEvent.arel_table[:id].eq(id_expression)
- ).where(
- AuditEvent.arel_table[:created_at].eq(created_at_expression)
- )
- end
-
- Gitlab::Pagination::Keyset::InOperatorOptimization::QueryBuilder.new(
- scope: scope,
- array_scope: array_scope,
- array_mapping_scope: array_mapping_scope,
- finder_query: finder_query
- ).execute
- end
-
private
def sanitize_message
diff --git a/app/models/award_emoji.rb b/app/models/award_emoji.rb
index 31bee8db1b4..ebc43b04b1b 100644
--- a/app/models/award_emoji.rb
+++ b/app/models/award_emoji.rb
@@ -31,6 +31,7 @@ class AwardEmoji < ApplicationRecord
after_destroy :expire_cache
after_save :expire_cache
+ after_commit :broadcast_note_update, if: -> { !importing? && awardable.is_a?(Note) }
class << self
def votes_for_collection(ids, type)
@@ -73,11 +74,19 @@ class AwardEmoji < ApplicationRecord
def expire_cache
awardable.try(:bump_updated_at)
- awardable.expire_etag_cache if awardable.is_a?(Note)
awardable.try(:update_upvotes_count) if upvote?
end
+ def broadcast_note_update
+ awardable.expire_etag_cache
+ awardable.trigger_note_subscription_update
+ end
+
def to_ability_name
'emoji'
end
+
+ def hook_attrs
+ Gitlab::HookData::EmojiBuilder.new(self).build
+ end
end
diff --git a/app/models/broadcast_message.rb b/app/models/broadcast_message.rb
index bf25ea7367c..ccc5ca7395d 100644
--- a/app/models/broadcast_message.rb
+++ b/app/models/broadcast_message.rb
@@ -3,7 +3,6 @@
class BroadcastMessage < MainClusterwide::ApplicationRecord
include CacheMarkdownField
include Sortable
- include IgnorableColumns
ALLOWED_TARGET_ACCESS_LEVELS = [
Gitlab::Access::GUEST,
@@ -13,8 +12,6 @@ class BroadcastMessage < MainClusterwide::ApplicationRecord
Gitlab::Access::OWNER
].freeze
- ignore_column :namespace_id, remove_with: '16.0', remove_after: '2022-06-22'
-
cache_markdown_field :message, pipeline: :broadcast_message, whitelisted: true
validates :message, presence: true
diff --git a/app/models/bulk_import.rb b/app/models/bulk_import.rb
index c2d7529f468..fde528e3fa0 100644
--- a/app/models/bulk_import.rb
+++ b/app/models/bulk_import.rb
@@ -58,6 +58,10 @@ class BulkImport < ApplicationRecord
Gitlab::VersionInfo.new(MIN_MAJOR_VERSION, MIN_MINOR_VERSION_FOR_PROJECT)
end
+ def self.min_gl_version_for_migration_in_batches
+ Gitlab::VersionInfo.new(16, 2)
+ end
+
def self.all_human_statuses
state_machine.states.map(&:human_name)
end
@@ -68,4 +72,8 @@ class BulkImport < ApplicationRecord
update!(has_failures: true)
end
+
+ def supports_batched_export?
+ source_version_info >= self.class.min_gl_version_for_migration_in_batches
+ end
end
diff --git a/app/models/bulk_imports/batch_tracker.rb b/app/models/bulk_imports/batch_tracker.rb
index df1fab89ee6..2e79d41d46e 100644
--- a/app/models/bulk_imports/batch_tracker.rb
+++ b/app/models/bulk_imports/batch_tracker.rb
@@ -25,9 +25,7 @@ module BulkImports
end
event :finish do
- transition started: :finished
- transition failed: :failed
- transition skipped: :skipped
+ transition any => :finished
end
event :skip do
diff --git a/app/models/bulk_imports/entity.rb b/app/models/bulk_imports/entity.rb
index 94e4a8165eb..4f50a112141 100644
--- a/app/models/bulk_imports/entity.rb
+++ b/app/models/bulk_imports/entity.rb
@@ -144,12 +144,27 @@ class BulkImports::Entity < ApplicationRecord
end
end
- def export_relations_url_path
- "#{base_resource_path}/export_relations"
+ def export_relations_url_path_base
+ File.join(base_resource_path, 'export_relations')
end
- def relation_download_url_path(relation)
- "#{export_relations_url_path}/download?relation=#{relation}"
+ def export_relations_url_path(batched: false)
+ if batched && bulk_import.supports_batched_export?
+ Gitlab::Utils.add_url_parameters(export_relations_url_path_base, batched: batched)
+ else
+ export_relations_url_path_base
+ end
+ end
+
+ def relation_download_url_path(relation, batch_number = nil)
+ url = File.join(export_relations_url_path_base, 'download')
+ params = { relation: relation }
+
+ if batch_number && bulk_import.supports_batched_export?
+ params.merge!(batched: true, batch_number: batch_number)
+ end
+
+ Gitlab::Utils.add_url_parameters(url, params)
end
def wikis_url_path
diff --git a/app/models/bulk_imports/export.rb b/app/models/bulk_imports/export.rb
index 93cf047c690..5c3f8e4b8d4 100644
--- a/app/models/bulk_imports/export.rb
+++ b/app/models/bulk_imports/export.rb
@@ -32,9 +32,7 @@ module BulkImports
end
event :finish do
- transition started: :finished
- transition finished: :finished
- transition failed: :failed
+ transition any => :finished
end
event :fail_op do
@@ -63,5 +61,12 @@ module BulkImports
FileTransfer.config_for(portable)
end
end
+
+ def remove_existing_upload!
+ return unless upload&.export_file&.file
+
+ upload.remove_export_file!
+ upload.save!
+ end
end
end
diff --git a/app/models/bulk_imports/export_status.rb b/app/models/bulk_imports/export_status.rb
index cbd7b189007..3d820e65d5b 100644
--- a/app/models/bulk_imports/export_status.rb
+++ b/app/models/bulk_imports/export_status.rb
@@ -13,28 +13,48 @@ module BulkImports
end
def started?
- !empty? && export_status['status'] == Export::STARTED
+ !empty? && status['status'] == Export::STARTED
end
def failed?
- !empty? && export_status['status'] == Export::FAILED
+ !empty? && status['status'] == Export::FAILED
end
def empty?
- export_status.nil?
+ status.nil?
end
def error
- export_status['error']
+ status['error']
+ end
+
+ def batched?
+ status['batched'] == true
+ end
+
+ def batches_count
+ status['batches_count'].to_i
+ end
+
+ def batch(batch_number)
+ raise ArgumentError if batch_number < 1
+
+ return unless batched?
+
+ status['batches'].find { |item| item['batch_number'] == batch_number }
end
private
attr_reader :client, :entity, :relation, :pipeline_tracker
- def export_status
- strong_memoize(:export_status) do
- fetch_export_status&.find { |item| item['relation'] == relation }
+ def status
+ strong_memoize(:status) do
+ status = fetch_status
+
+ next status if status.is_a?(Hash) || status.nil?
+
+ status.find { |item| item['relation'] == relation }
rescue BulkImports::NetworkError => e
raise BulkImports::RetryPipelineError.new(e.message, 2.seconds) if e.retriable?(pipeline_tracker)
@@ -44,12 +64,12 @@ module BulkImports
end
end
- def fetch_export_status
- client.get(status_endpoint).parsed_response
+ def fetch_status
+ client.get(status_endpoint, relation: relation).parsed_response
end
def status_endpoint
- File.join(entity.export_relations_url_path, 'status')
+ File.join(entity.export_relations_url_path_base, 'status')
end
def default_error_response(message)
diff --git a/app/models/bulk_imports/tracker.rb b/app/models/bulk_imports/tracker.rb
index 55502721a76..d1a6f3b9a80 100644
--- a/app/models/bulk_imports/tracker.rb
+++ b/app/models/bulk_imports/tracker.rb
@@ -24,6 +24,7 @@ class BulkImports::Tracker < ApplicationRecord
delegate :file_extraction_pipeline?, to: :pipeline_class
DEFAULT_PAGE_SIZE = 500
+ STALE_AFTER = 4.hours
scope :next_pipeline_trackers_for, -> (entity_id) {
entity_scope = where(bulk_import_entity_id: entity_id)
@@ -89,4 +90,8 @@ class BulkImports::Tracker < ApplicationRecord
transition [:created, :started] => :timeout
end
end
+
+ def stale?
+ created_at < STALE_AFTER.ago
+ end
end
diff --git a/app/models/ci/artifact_blob.rb b/app/models/ci/artifact_blob.rb
index f87b18d516f..1f6d218b015 100644
--- a/app/models/ci/artifact_blob.rb
+++ b/app/models/ci/artifact_blob.rb
@@ -4,8 +4,6 @@ module Ci
class ArtifactBlob
include BlobLike
- EXTENSIONS_SERVED_BY_PAGES = %w[.html .htm .txt .json .xml .log].freeze
-
attr_reader :entry
def initialize(entry)
@@ -35,31 +33,18 @@ module Ci
:build_artifact
end
- def external_url(project, job)
- return unless external_link?(job)
-
- url_project_path = project.full_path.partition('/').last
-
- artifact_path = [
- '-', url_project_path, '-',
- 'jobs', job.id,
- 'artifacts', path
- ].join('/')
-
- "#{project.pages_namespace_url}/#{artifact_path}"
+ def external_url(job)
+ pages_url_builder(job.project).artifact_url(entry, job)
end
def external_link?(job)
- pages_config.enabled &&
- pages_config.artifacts_server &&
- EXTENSIONS_SERVED_BY_PAGES.include?(File.extname(name)) &&
- (pages_config.access_control || job.project.public?)
+ pages_url_builder(job.project).artifact_url_available?(entry, job)
end
private
- def pages_config
- Gitlab.config.pages
+ def pages_url_builder(project)
+ @pages_url_builder ||= Gitlab::Pages::UrlBuilder.new(project)
end
end
end
diff --git a/app/models/ci/bridge.rb b/app/models/ci/bridge.rb
index 7cdd0d56a98..5052d84378f 100644
--- a/app/models/ci/bridge.rb
+++ b/app/models/ci/bridge.rb
@@ -224,15 +224,46 @@ module Ci
end
end
+ def target_revision_ref
+ downstream_pipeline_params.dig(:target_revision, :ref)
+ end
+
def downstream_variables
- calculate_downstream_variables
- .reverse # variables priority
- .uniq { |var| var[:key] } # only one variable key to pass
- .reverse
+ Gitlab::Ci::Variables::Downstream::Generator.new(self).calculate
end
- def target_revision_ref
- downstream_pipeline_params.dig(:target_revision, :ref)
+ def variables
+ strong_memoize(:variables) do
+ Gitlab::Ci::Variables::Collection.new
+ .concat(scoped_variables)
+ .concat(pipeline.persisted_variables)
+ end
+ end
+
+ def pipeline_variables
+ pipeline.variables
+ end
+
+ def pipeline_schedule_variables
+ return [] unless pipeline.pipeline_schedule
+
+ pipeline.pipeline_schedule.variables.to_a
+ end
+
+ def forward_yaml_variables?
+ strong_memoize(:forward_yaml_variables) do
+ result = options&.dig(:trigger, :forward, :yaml_variables)
+
+ result.nil? ? FORWARD_DEFAULTS[:yaml_variables] : result
+ end
+ end
+
+ def forward_pipeline_variables?
+ strong_memoize(:forward_pipeline_variables) do
+ result = options&.dig(:trigger, :forward, :pipeline_variables)
+
+ result.nil? ? FORWARD_DEFAULTS[:pipeline_variables] : result
+ end
end
private
@@ -273,70 +304,6 @@ module Ci
}
}
end
-
- def calculate_downstream_variables
- expand_variables = scoped_variables
- .concat(pipeline.persisted_variables)
- .to_runner_variables
-
- # The order of this list refers to the priority of the variables
- downstream_yaml_variables(expand_variables) +
- downstream_pipeline_variables(expand_variables) +
- downstream_pipeline_schedule_variables(expand_variables)
- end
-
- def downstream_yaml_variables(expand_variables)
- return [] unless forward_yaml_variables?
-
- yaml_variables.to_a.map do |hash|
- if hash[:raw]
- { key: hash[:key], value: hash[:value], raw: true }
- else
- { key: hash[:key], value: ::ExpandVariables.expand(hash[:value], expand_variables) }
- end
- end
- end
-
- def downstream_pipeline_variables(expand_variables)
- return [] unless forward_pipeline_variables?
-
- pipeline.variables.to_a.map do |variable|
- if variable.raw?
- { key: variable.key, value: variable.value, raw: true }
- else
- { key: variable.key, value: ::ExpandVariables.expand(variable.value, expand_variables) }
- end
- end
- end
-
- def downstream_pipeline_schedule_variables(expand_variables)
- return [] unless forward_pipeline_variables?
- return [] unless pipeline.pipeline_schedule
-
- pipeline.pipeline_schedule.variables.to_a.map do |variable|
- if variable.raw?
- { key: variable.key, value: variable.value, raw: true }
- else
- { key: variable.key, value: ::ExpandVariables.expand(variable.value, expand_variables) }
- end
- end
- end
-
- def forward_yaml_variables?
- strong_memoize(:forward_yaml_variables) do
- result = options&.dig(:trigger, :forward, :yaml_variables)
-
- result.nil? ? FORWARD_DEFAULTS[:yaml_variables] : result
- end
- end
-
- def forward_pipeline_variables?
- strong_memoize(:forward_pipeline_variables) do
- result = options&.dig(:trigger, :forward, :pipeline_variables)
-
- result.nil? ? FORWARD_DEFAULTS[:pipeline_variables] : result
- end
- end
end
end
diff --git a/app/models/ci/build_metadata.rb b/app/models/ci/build_metadata.rb
index 382f861a802..4c723bb7c0c 100644
--- a/app/models/ci/build_metadata.rb
+++ b/app/models/ci/build_metadata.rb
@@ -10,11 +10,9 @@ module Ci
include Presentable
include ChronicDurationAttribute
include Gitlab::Utils::StrongMemoize
- include SafelyChangeColumnDefault
self.table_name = 'p_ci_builds_metadata'
self.primary_key = 'id'
- columns_changing_default :partition_id
partitionable scope: :build
diff --git a/app/models/ci/build_need.rb b/app/models/ci/build_need.rb
index 940221619b3..317f2523f69 100644
--- a/app/models/ci/build_need.rb
+++ b/app/models/ci/build_need.rb
@@ -3,8 +3,12 @@
module Ci
class BuildNeed < Ci::ApplicationRecord
include Ci::Partitionable
- include BulkInsertSafe
include IgnorableColumns
+ include SafelyChangeColumnDefault
+ include BulkInsertSafe
+
+ columns_changing_default :partition_id
+ ignore_column :id_convert_to_bigint, remove_with: '16.4', remove_after: '2023-09-22'
belongs_to :build, class_name: "Ci::Processable", foreign_key: :build_id, inverse_of: :needs
diff --git a/app/models/ci/build_pending_state.rb b/app/models/ci/build_pending_state.rb
index 966884ae158..0b88f745d78 100644
--- a/app/models/ci/build_pending_state.rb
+++ b/app/models/ci/build_pending_state.rb
@@ -2,6 +2,9 @@
class Ci::BuildPendingState < Ci::ApplicationRecord
include Ci::Partitionable
+ include SafelyChangeColumnDefault
+
+ columns_changing_default :partition_id
belongs_to :build, class_name: 'Ci::Build', foreign_key: :build_id, inverse_of: :pending_state
diff --git a/app/models/ci/build_report_result.rb b/app/models/ci/build_report_result.rb
index b2d99fab295..90b621b8da1 100644
--- a/app/models/ci/build_report_result.rb
+++ b/app/models/ci/build_report_result.rb
@@ -3,6 +3,9 @@
module Ci
class BuildReportResult < Ci::ApplicationRecord
include Ci::Partitionable
+ include SafelyChangeColumnDefault
+
+ columns_changing_default :partition_id
self.primary_key = :build_id
diff --git a/app/models/ci/build_runner_session.rb b/app/models/ci/build_runner_session.rb
index 5773b6132be..eaa2e1c428e 100644
--- a/app/models/ci/build_runner_session.rb
+++ b/app/models/ci/build_runner_session.rb
@@ -5,6 +5,9 @@ module Ci
# Data will be removed after transitioning from running to any state.
class BuildRunnerSession < Ci::ApplicationRecord
include Ci::Partitionable
+ include SafelyChangeColumnDefault
+
+ columns_changing_default :partition_id
TERMINAL_SUBPROTOCOL = 'terminal.gitlab.com'
DEFAULT_SERVICE_NAME = 'build'
diff --git a/app/models/ci/build_trace_chunk.rb b/app/models/ci/build_trace_chunk.rb
index 03b59b19ef1..0a0f401c9d5 100644
--- a/app/models/ci/build_trace_chunk.rb
+++ b/app/models/ci/build_trace_chunk.rb
@@ -8,6 +8,9 @@ module Ci
include ::Checksummable
include ::Gitlab::ExclusiveLeaseHelpers
include ::Gitlab::OptimisticLocking
+ include SafelyChangeColumnDefault
+
+ columns_changing_default :partition_id
belongs_to :build, class_name: "Ci::Build", foreign_key: :build_id, inverse_of: :trace_chunks
@@ -166,7 +169,7 @@ module Ci
raise FailedToPersistDataError, 'Modifed build trace chunk detected' if has_changes_to_save?
self.class.with_read_consistency(build) do
- reset.then(&:unsafe_persist_data!)
+ reset.unsafe_persist_data!
end
end
rescue FailedToObtainLockError
@@ -242,7 +245,7 @@ module Ci
##
# We need to so persist data then save a new store identifier before we
# remove data from the previous store to make this operation
- # trasnaction-safe. `unsafe_set_data! calls `save!` because of this
+ # transaction-safe. `unsafe_set_data! calls `save!` because of this
# reason.
#
# TODO consider using callbacks and state machine to remove old data
diff --git a/app/models/ci/build_trace_metadata.rb b/app/models/ci/build_trace_metadata.rb
index 4c76089617f..c5ad3d19425 100644
--- a/app/models/ci/build_trace_metadata.rb
+++ b/app/models/ci/build_trace_metadata.rb
@@ -3,6 +3,9 @@
module Ci
class BuildTraceMetadata < Ci::ApplicationRecord
include Ci::Partitionable
+ include SafelyChangeColumnDefault
+
+ columns_changing_default :partition_id
MAX_ATTEMPTS = 5
self.table_name = 'ci_build_trace_metadata'
diff --git a/app/models/ci/catalog/resource.rb b/app/models/ci/catalog/resource.rb
index 77cfe91ddd6..38603ddfe59 100644
--- a/app/models/ci/catalog/resource.rb
+++ b/app/models/ci/catalog/resource.rb
@@ -19,6 +19,8 @@ module Ci
delegate :avatar_path, :description, :name, :star_count, :forks_count, to: :project
+ enum state: { draft: 0, published: 1 }
+
def versions
project.releases.order_released_desc
end
diff --git a/app/models/ci/external_pull_request.rb b/app/models/ci/external_pull_request.rb
new file mode 100644
index 00000000000..bd37aa9f85a
--- /dev/null
+++ b/app/models/ci/external_pull_request.rb
@@ -0,0 +1,106 @@
+# frozen_string_literal: true
+
+# This model stores pull requests coming from external providers, such as
+# GitHub, when GitLab project is set as CI/CD only and remote mirror.
+#
+# When setting up a remote mirror with GitHub we subscribe to push and
+# pull_request webhook events. When a pull request is opened on GitHub,
+# a webhook is sent out, we create or update the status of the pull
+# request locally.
+#
+# When the mirror is updated and changes are pushed to branches we check
+# if there are open pull requests for the source and target branch.
+# If so, we create pipelines for external pull requests.
+module Ci
+ class ExternalPullRequest < Ci::ApplicationRecord
+ include Gitlab::Utils::StrongMemoize
+ include ShaAttribute
+ include EachBatch
+
+ belongs_to :project
+
+ sha_attribute :source_sha
+ sha_attribute :target_sha
+
+ validates :source_branch, presence: true
+ validates :target_branch, presence: true
+ validates :source_sha, presence: true
+ validates :target_sha, presence: true
+ validates :source_repository, presence: true
+ validates :target_repository, presence: true
+ validates :status, presence: true
+
+ enum status: {
+ open: 1,
+ closed: 2
+ }
+
+ # We currently don't support pull requests from fork, so
+ # we are going to return an error to the webhook
+ validate :not_from_fork
+
+ scope :by_source_branch, ->(branch) { where(source_branch: branch) }
+ scope :by_source_repository, ->(repository) { where(source_repository: repository) }
+
+ # Needed to override Ci::ApplicationRecord as this does not have ci_ table prefix
+ self.table_name = 'external_pull_requests'
+
+ def self.create_or_update_from_params(params)
+ find_params = params.slice(:project_id, :source_branch, :target_branch)
+
+ safe_find_or_initialize_and_update(find: find_params, update: params) do |pull_request|
+ yield(pull_request) if block_given?
+ end
+ end
+
+ def actual_branch_head?
+ actual_source_branch_sha == source_sha
+ end
+
+ def from_fork?
+ source_repository != target_repository
+ end
+
+ def source_ref
+ Gitlab::Git::BRANCH_REF_PREFIX + source_branch
+ end
+
+ def predefined_variables
+ Gitlab::Ci::Variables::Collection.new.tap do |variables|
+ variables.append(key: 'CI_EXTERNAL_PULL_REQUEST_IID', value: pull_request_iid.to_s)
+ variables.append(key: 'CI_EXTERNAL_PULL_REQUEST_SOURCE_REPOSITORY', value: source_repository)
+ variables.append(key: 'CI_EXTERNAL_PULL_REQUEST_TARGET_REPOSITORY', value: target_repository)
+ variables.append(key: 'CI_EXTERNAL_PULL_REQUEST_SOURCE_BRANCH_SHA', value: source_sha)
+ variables.append(key: 'CI_EXTERNAL_PULL_REQUEST_TARGET_BRANCH_SHA', value: target_sha)
+ variables.append(key: 'CI_EXTERNAL_PULL_REQUEST_SOURCE_BRANCH_NAME', value: source_branch)
+ variables.append(key: 'CI_EXTERNAL_PULL_REQUEST_TARGET_BRANCH_NAME', value: target_branch)
+ end
+ end
+
+ def modified_paths
+ project.repository.diff_stats(target_sha, source_sha).paths
+ end
+
+ private
+
+ def actual_source_branch_sha
+ project.commit(source_ref)&.sha
+ end
+
+ def not_from_fork
+ return unless from_fork?
+
+ errors.add(:base, _('Pull requests from fork are not supported'))
+ end
+
+ def self.safe_find_or_initialize_and_update(find:, update:)
+ safe_ensure_unique(retries: 1) do
+ model = find_or_initialize_by(find)
+
+ yield(model) if model.update(update) && block_given?
+
+ model
+ end
+ end
+ end
+end
diff --git a/app/models/ci/group_variable.rb b/app/models/ci/group_variable.rb
index 5522a01758f..25d0228beb0 100644
--- a/app/models/ci/group_variable.rb
+++ b/app/models/ci/group_variable.rb
@@ -14,6 +14,7 @@ module Ci
alias_attribute :secret_value, :value
+ validates :description, length: { maximum: 255 }, allow_blank: true
validates :key, uniqueness: {
scope: [:group_id, :environment_scope],
message: "(%{value}) has already been taken"
@@ -36,6 +37,12 @@ module Ci
.pluck(:environment_scope)
end
+ # Sorting
+ scope :order_created_asc, -> { reorder(created_at: :asc) }
+ scope :order_created_desc, -> { reorder(created_at: :desc) }
+ scope :order_key_asc, -> { reorder(key: :asc) }
+ scope :order_key_desc, -> { reorder(key: :desc) }
+
self.limit_name = 'group_ci_variables'
self.limit_scope = :group
@@ -50,5 +57,14 @@ module Ci
def group_ci_cd_settings_path
Gitlab::Routing.url_helpers.group_settings_ci_cd_path(group)
end
+
+ def self.sort_by_attribute(method)
+ case method.to_s
+ when 'created_at_asc' then order_created_asc
+ when 'created_at_desc' then order_created_desc
+ when 'key_asc' then order_key_asc
+ when 'key_desc' then order_key_desc
+ end
+ end
end
end
diff --git a/app/models/ci/job_artifact.rb b/app/models/ci/job_artifact.rb
index 5cd7988837e..11d70e088e9 100644
--- a/app/models/ci/job_artifact.rb
+++ b/app/models/ci/job_artifact.rb
@@ -13,6 +13,9 @@ module Ci
include FileStoreMounter
include EachBatch
include Gitlab::Utils::StrongMemoize
+ include SafelyChangeColumnDefault
+
+ columns_changing_default :partition_id
enum accessibility: { public: 0, private: 1 }, _suffix: true
diff --git a/app/models/ci/job_variable.rb b/app/models/ci/job_variable.rb
index 573999995bc..21c9842399e 100644
--- a/app/models/ci/job_variable.rb
+++ b/app/models/ci/job_variable.rb
@@ -5,8 +5,11 @@ module Ci
include Ci::Partitionable
include Ci::NewHasVariable
include Ci::RawVariable
+ include SafelyChangeColumnDefault
include BulkInsertSafe
+ columns_changing_default :partition_id
+
belongs_to :job, class_name: "Ci::Build", foreign_key: :job_id, inverse_of: :job_variables
partitionable scope: :job
diff --git a/app/models/ci/pending_build.rb b/app/models/ci/pending_build.rb
index 14050a1e78e..dc9a8b7a1bf 100644
--- a/app/models/ci/pending_build.rb
+++ b/app/models/ci/pending_build.rb
@@ -4,6 +4,9 @@ module Ci
class PendingBuild < Ci::ApplicationRecord
include EachBatch
include Ci::Partitionable
+ include SafelyChangeColumnDefault
+
+ columns_changing_default :partition_id
belongs_to :project
belongs_to :build, class_name: 'Ci::Build'
diff --git a/app/models/ci/persistent_ref.rb b/app/models/ci/persistent_ref.rb
index 57aa1962bd2..f713d5952bc 100644
--- a/app/models/ci/persistent_ref.rb
+++ b/app/models/ci/persistent_ref.rb
@@ -19,6 +19,11 @@ module Ci
false
end
+ # This needs to be kept in sync with `Ci::Pipeline#after_transition` calling `pipeline.persistent_ref.delete`
+ def should_delete?
+ pipeline.status.to_sym.in?(::Ci::Pipeline.stopped_statuses)
+ end
+
def create
create_ref(sha, path)
rescue StandardError => e
@@ -27,6 +32,8 @@ module Ci
end
def delete
+ return unless should_delete?
+
delete_refs(path)
rescue Gitlab::Git::Repository::NoRepository
# no-op
diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb
index 6f2939583e0..bd327cfbe7b 100644
--- a/app/models/ci/pipeline.rb
+++ b/app/models/ci/pipeline.rb
@@ -17,6 +17,9 @@ module Ci
include UpdatedAtFilterable
include EachBatch
include FastDestroyAll::Helpers
+ include SafelyChangeColumnDefault
+
+ columns_changing_default :partition_id
include IgnorableColumns
ignore_column :id_convert_to_bigint, remove_with: '16.3', remove_after: '2023-08-22'
@@ -51,7 +54,7 @@ module Ci
belongs_to :auto_canceled_by, class_name: 'Ci::Pipeline', inverse_of: :auto_canceled_pipelines
belongs_to :pipeline_schedule, class_name: 'Ci::PipelineSchedule'
belongs_to :merge_request, class_name: 'MergeRequest'
- belongs_to :external_pull_request
+ belongs_to :external_pull_request, class_name: 'Ci::ExternalPullRequest'
belongs_to :ci_ref, class_name: 'Ci::Ref', foreign_key: :ci_ref_id, inverse_of: :pipelines
has_internal_id :iid, scope: :project, presence: false,
@@ -335,9 +338,14 @@ module Ci
end
end
+ # This needs to be kept in sync with `Ci::PipelineRef#should_delete?`
after_transition any => ::Ci::Pipeline.stopped_statuses do |pipeline|
pipeline.run_after_commit do
- pipeline.persistent_ref.delete
+ if Feature.enabled?(:pipeline_cleanup_ref_worker_async, pipeline.project)
+ ::Ci::PipelineCleanupRefWorker.perform_async(pipeline.id)
+ else
+ pipeline.persistent_ref.delete
+ end
end
end
diff --git a/app/models/ci/pipeline_variable.rb b/app/models/ci/pipeline_variable.rb
index f2457af0074..9747f9ef527 100644
--- a/app/models/ci/pipeline_variable.rb
+++ b/app/models/ci/pipeline_variable.rb
@@ -5,9 +5,12 @@ module Ci
include Ci::Partitionable
include Ci::HasVariable
include Ci::RawVariable
-
include IgnorableColumns
+ include SafelyChangeColumnDefault
+
+ columns_changing_default :partition_id
ignore_column :id_convert_to_bigint, remove_with: '16.3', remove_after: '2023-08-22'
+ ignore_column :pipeline_id_convert_to_bigint, remove_with: '16.5', remove_after: '2023-10-22'
belongs_to :pipeline
diff --git a/app/models/ci/runner.rb b/app/models/ci/runner.rb
index 6319163b0d7..4eb5c3c9ed2 100644
--- a/app/models/ci/runner.rb
+++ b/app/models/ci/runner.rb
@@ -72,6 +72,7 @@ module Ci
has_many :runner_managers, inverse_of: :runner
has_many :builds
+ has_many :running_builds, inverse_of: :runner
has_many :runner_projects, inverse_of: :runner, autosave: true, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
has_many :projects, through: :runner_projects, disable_joins: true
has_many :runner_namespaces, inverse_of: :runner, autosave: true
@@ -198,6 +199,7 @@ module Ci
scope :order_created_at_desc, -> { order(created_at: :desc) }
scope :order_token_expires_at_asc, -> { order(token_expires_at: :asc) }
scope :order_token_expires_at_desc, -> { order(token_expires_at: :desc) }
+
scope :with_tags, -> { preload(:tags) }
scope :with_creator, -> { preload(:creator) }
@@ -456,7 +458,7 @@ module Ci
end
new_version = values[:version]
- schedule_runner_version_update(new_version) if new_version && values[:version] != version
+ schedule_runner_version_update(new_version) if new_version && new_version != version
merge_cache_attributes(values)
diff --git a/app/models/ci/runner_manager.rb b/app/models/ci/runner_manager.rb
index e36024d9f5b..3a3f95a8c69 100644
--- a/app/models/ci/runner_manager.rb
+++ b/app/models/ci/runner_manager.rb
@@ -44,6 +44,10 @@ module Ci
remove_duplicates: false).where(created_some_time_ago)
end
+ scope :for_runner, ->(runner_id) do
+ where(runner_id: runner_id)
+ end
+
def self.online_contact_time_deadline
Ci::Runner.online_contact_time_deadline
end
@@ -52,6 +56,13 @@ module Ci
STALE_TIMEOUT.ago
end
+ def self.aggregate_upgrade_status_by_runner_id
+ joins(:runner_version)
+ .group(:runner_id)
+ .maximum(:status)
+ .transform_values { |s| Ci::RunnerVersion.statuses.key(s).to_sym }
+ end
+
def heartbeat(values, update_contacted_at: true)
##
# We can safely ignore writes performed by a runner heartbeat. We do
@@ -66,7 +77,7 @@ module Ci
end
new_version = values[:version]
- schedule_runner_version_update(new_version) if new_version && values[:version] != version
+ schedule_runner_version_update(new_version) if new_version && new_version != version
merge_cache_attributes(values)
diff --git a/app/models/ci/running_build.rb b/app/models/ci/running_build.rb
index e6f80658f5d..cfdc47de531 100644
--- a/app/models/ci/running_build.rb
+++ b/app/models/ci/running_build.rb
@@ -10,6 +10,9 @@ module Ci
# of the running builds there is worth the additional pressure.
class RunningBuild < Ci::ApplicationRecord
include Ci::Partitionable
+ include SafelyChangeColumnDefault
+
+ columns_changing_default :partition_id
partitionable scope: :build
diff --git a/app/models/ci/sources/pipeline.rb b/app/models/ci/sources/pipeline.rb
index 719d19f4169..4853c57d41f 100644
--- a/app/models/ci/sources/pipeline.rb
+++ b/app/models/ci/sources/pipeline.rb
@@ -5,6 +5,9 @@ module Ci
class Pipeline < Ci::ApplicationRecord
include Ci::Partitionable
include Ci::NamespacedModelName
+ include SafelyChangeColumnDefault
+
+ columns_changing_default :partition_id
self.table_name = "ci_sources_pipelines"
diff --git a/app/models/ci/stage.rb b/app/models/ci/stage.rb
index d61760bd0fc..4f9a2e44562 100644
--- a/app/models/ci/stage.rb
+++ b/app/models/ci/stage.rb
@@ -7,6 +7,9 @@ module Ci
include Ci::HasStatus
include Gitlab::OptimisticLocking
include Presentable
+ include SafelyChangeColumnDefault
+
+ columns_changing_default :partition_id
partitionable scope: :pipeline
@@ -148,7 +151,7 @@ module Ci
end
def manual_playable?
- blocked? || skipped?
+ blocked?
end
# This will be removed with ci_remove_ensure_stage_service
diff --git a/app/models/ci/unit_test_failure.rb b/app/models/ci/unit_test_failure.rb
index cfef1249164..37893f6cdae 100644
--- a/app/models/ci/unit_test_failure.rb
+++ b/app/models/ci/unit_test_failure.rb
@@ -3,6 +3,9 @@
module Ci
class UnitTestFailure < Ci::ApplicationRecord
include Ci::Partitionable
+ include SafelyChangeColumnDefault
+
+ columns_changing_default :partition_id
REPORT_WINDOW = 14.days
diff --git a/app/models/ci/variable.rb b/app/models/ci/variable.rb
index 23fe89c38df..6f5972ebefa 100644
--- a/app/models/ci/variable.rb
+++ b/app/models/ci/variable.rb
@@ -14,6 +14,7 @@ module Ci
alias_attribute :secret_value, :value
+ validates :description, length: { maximum: 255 }, allow_blank: true
validates :key, uniqueness: {
scope: [:project_id, :environment_scope],
message: "(%{value}) has already been taken"
diff --git a/app/models/clusters/agent.rb b/app/models/clusters/agent.rb
index 372fdfda1ea..8dc866929f3 100644
--- a/app/models/clusters/agent.rb
+++ b/app/models/clusters/agent.rb
@@ -66,7 +66,6 @@ module Clusters
def ci_access_authorized_for?(user)
return false unless user
- return false unless ::Feature.enabled?(:expose_authorized_cluster_agents, project)
all_ci_access_authorized_projects_for(user).exists? ||
all_ci_access_authorized_namespaces_for(user).exists?
@@ -74,7 +73,6 @@ module Clusters
def user_access_authorized_for?(user)
return false unless user
- return false unless ::Feature.enabled?(:expose_authorized_cluster_agents, project)
Clusters::Agents::Authorizations::UserAccess::Finder
.new(user, agent: self, preload: false, limit: 1).execute.any?
diff --git a/app/models/clusters/concerns/prometheus_client.rb b/app/models/clusters/concerns/prometheus_client.rb
index 10cb307addd..d2f69b813aa 100644
--- a/app/models/clusters/concerns/prometheus_client.rb
+++ b/app/models/clusters/concerns/prometheus_client.rb
@@ -29,7 +29,7 @@ module Clusters
rescue Kubeclient::HttpError, Errno::ECONNRESET, Errno::ECONNREFUSED, Errno::ENETUNREACH
# If users have mistakenly set parameters or removed the depended clusters,
# `proxy_url` could raise an exception because gitlab can not communicate with the cluster.
- # Since `PrometheusAdapter#can_query?` is eargely loaded on environement pages in gitlab,
+ # Since `PrometheusAdapter#can_query?` is eargely loaded on environment pages in gitlab,
# we need to silence the exceptions
end
diff --git a/app/models/commit.rb b/app/models/commit.rb
index 26412205899..ded4b06a028 100644
--- a/app/models/commit.rb
+++ b/app/models/commit.rb
@@ -149,6 +149,10 @@ class Commit
from_hash(hash, project)
end
+
+ def underscore
+ 'commit'
+ end
end
attr_accessor :raw
diff --git a/app/models/commit_range.rb b/app/models/commit_range.rb
index 90cdd267cbd..c6e507e4b6c 100644
--- a/app/models/commit_range.rb
+++ b/app/models/commit_range.rb
@@ -64,7 +64,7 @@ class CommitRange
range_string = range_string.strip
- unless range_string =~ /\A#{PATTERN}\z/o
+ unless /\A#{PATTERN}\z/o.match?(range_string)
raise ArgumentError, "invalid CommitRange string format: #{range_string}"
end
diff --git a/app/models/commit_status.rb b/app/models/commit_status.rb
index f26831c1049..3f631f583b6 100644
--- a/app/models/commit_status.rb
+++ b/app/models/commit_status.rb
@@ -8,13 +8,11 @@ class CommitStatus < Ci::ApplicationRecord
include Presentable
include BulkInsertableAssociations
include TaggableQueries
- include SafelyChangeColumnDefault
self.table_name = 'ci_builds'
self.sequence_name = 'ci_builds_id_seq'
self.primary_key = :id
partitionable scope: :pipeline
- columns_changing_default :partition_id
belongs_to :user
belongs_to :project
@@ -290,7 +288,7 @@ class CommitStatus < Ci::ApplicationRecord
def sortable_name
name.to_s.split(/(\d+)/).map do |v|
- v =~ /\d+/ ? v.to_i : v
+ /\d+/.match?(v) ? v.to_i : v
end
end
diff --git a/app/models/concerns/commit_signature.rb b/app/models/concerns/commit_signature.rb
index 5dac3c7833a..5bdf6bb31bf 100644
--- a/app/models/concerns/commit_signature.rb
+++ b/app/models/concerns/commit_signature.rb
@@ -16,7 +16,8 @@ module CommitSignature
unverified_key: 4,
unknown_key: 5,
multiple_signatures: 6,
- revoked_key: 7
+ revoked_key: 7,
+ verified_system: 8
}
belongs_to :project, class_name: 'Project', foreign_key: 'project_id', optional: false
diff --git a/app/models/concerns/database_event_tracking.rb b/app/models/concerns/database_event_tracking.rb
index 26e184c202f..7e2f445189e 100644
--- a/app/models/concerns/database_event_tracking.rb
+++ b/app/models/concerns/database_event_tracking.rb
@@ -3,8 +3,6 @@
module DatabaseEventTracking
extend ActiveSupport::Concern
- FEATURE_FLAG_BATCH2_CLASSES = %w[Vulnerability MergeRequest::Metrics].freeze
-
included do
after_create_commit :publish_database_create_event
after_destroy_commit :publish_database_destroy_event
@@ -24,9 +22,6 @@ module DatabaseEventTracking
end
def publish_database_event(name)
- return unless database_events_for_class_enabled?
- return unless database_events_feature_flag_enabled?
-
# Gitlab::Tracking#event is triggering Snowplow event
# Snowplow events are sent with usage of
# https://snowplow.github.io/snowplow-ruby-tracker/SnowplowTracker/AsyncEmitter.html
@@ -54,14 +49,4 @@ module DatabaseEventTracking
.with_indifferent_access
.slice(*self.class::SNOWPLOW_ATTRIBUTES)
end
-
- def database_events_for_class_enabled?
- is_batch2 = FEATURE_FLAG_BATCH2_CLASSES.include?(self.class.to_s)
-
- !is_batch2 || Feature.enabled?(:product_intelligence_database_event_tracking_batch2)
- end
-
- def database_events_feature_flag_enabled?
- Feature.enabled?(:product_intelligence_database_event_tracking)
- end
end
diff --git a/app/models/concerns/enums/ci/pipeline.rb b/app/models/concerns/enums/ci/pipeline.rb
index d798a13741f..f5ffeb8c425 100644
--- a/app/models/concerns/enums/ci/pipeline.rb
+++ b/app/models/concerns/enums/ci/pipeline.rb
@@ -85,7 +85,8 @@ module Enums
external_project_source: 5,
bridge_source: 6,
parameter_source: 7,
- compliance_source: 8
+ compliance_source: 8,
+ security_policies_default_source: 9
}
end
end
diff --git a/app/models/concerns/enums/vulnerability.rb b/app/models/concerns/enums/vulnerability.rb
index 4b325de61bc..dbf05dbc428 100644
--- a/app/models/concerns/enums/vulnerability.rb
+++ b/app/models/concerns/enums/vulnerability.rb
@@ -50,6 +50,10 @@ module Enums
CONFIDENCE_LEVELS
end
+ def self.parse_confidence_level(input)
+ input&.downcase.then { |value| confidence_levels.key?(value) ? value : 'unknown' }
+ end
+
def self.report_types
REPORT_TYPES
end
@@ -58,6 +62,10 @@ module Enums
SEVERITY_LEVELS
end
+ def self.parse_severity_level(input)
+ input&.downcase.then { |value| severity_levels.key?(value) ? value : 'unknown' }
+ end
+
def self.detection_methods
DETECTION_METHODS
end
diff --git a/app/models/concerns/expirable.rb b/app/models/concerns/expirable.rb
index cc55315d6d7..af139e735af 100644
--- a/app/models/concerns/expirable.rb
+++ b/app/models/concerns/expirable.rb
@@ -6,10 +6,8 @@ module Expirable
DAYS_TO_EXPIRE = 7
included do
- scope :not, ->(scope) { where(scope.arel.constraints.reduce(:and).not) }
-
- scope :expired, -> { where.not(expires_at: nil).where(arel_table[:expires_at].lteq(Time.current)) }
- scope :not_expired, -> { self.not(expired) }
+ scope :expired, -> { where(arel_table[:expires_at].lteq(Time.current)) }
+ scope :not_expired, -> { where(arel_table[:expires_at].gt(Time.current)).or(where(expires_at: nil)) }
end
def expired?
diff --git a/app/models/concerns/has_user_type.rb b/app/models/concerns/has_user_type.rb
index 9d4b8328e8d..2d0ff82e624 100644
--- a/app/models/concerns/has_user_type.rb
+++ b/app/models/concerns/has_user_type.rb
@@ -14,7 +14,7 @@ module HasUserType
migration_bot: 7,
security_bot: 8,
automation_bot: 9,
- security_policy_bot: 10, # Currently not in use. See https://gitlab.com/gitlab-org/gitlab/-/issues/384174
+ security_policy_bot: 10,
admin_bot: 11,
suggested_reviewers_bot: 12,
service_account: 13,
diff --git a/app/models/concerns/ignorable_columns.rb b/app/models/concerns/ignorable_columns.rb
index 4cbcb25406d..249d0b99494 100644
--- a/app/models/concerns/ignorable_columns.rb
+++ b/app/models/concerns/ignorable_columns.rb
@@ -18,7 +18,7 @@ module IgnorableColumns
#
# Indicate the earliest date and release we can stop ignoring the column with +remove_after+ (a date string) and +remove_with+ (a release)
def ignore_columns(*columns, remove_after:, remove_with:)
- raise ArgumentError, 'Please indicate when we can stop ignoring columns with remove_after (date string YYYY-MM-DD), example: ignore_columns(:name, remove_after: \'2019-12-01\', remove_with: \'12.6\')' unless remove_after =~ Gitlab::Regex.utc_date_regex
+ raise ArgumentError, 'Please indicate when we can stop ignoring columns with remove_after (date string YYYY-MM-DD), example: ignore_columns(:name, remove_after: \'2019-12-01\', remove_with: \'12.6\')' unless Gitlab::Regex.utc_date_regex.match?(remove_after)
raise ArgumentError, 'Please indicate in which release we can stop ignoring columns with remove_with, example: ignore_columns(:name, remove_after: \'2019-12-01\', remove_with: \'12.6\')' unless remove_with
self.ignored_columns += columns.flatten # rubocop:disable Cop/IgnoredColumns
diff --git a/app/models/concerns/issue_available_features.rb b/app/models/concerns/issue_available_features.rb
index 209456f8b67..3f65e701da7 100644
--- a/app/models/concerns/issue_available_features.rb
+++ b/app/models/concerns/issue_available_features.rb
@@ -19,7 +19,7 @@ module IssueAvailableFeatures
end
included do
- scope :with_feature, ->(feature) { where(issue_type: available_features_for_issue_types[feature]) }
+ scope :with_feature, ->(feature) { with_issue_type(available_features_for_issue_types[feature]) }
end
def issue_type_supports?(feature)
diff --git a/app/models/concerns/issues/forbid_issue_type_column_usage.rb b/app/models/concerns/issues/forbid_issue_type_column_usage.rb
deleted file mode 100644
index 46a8a0278d9..00000000000
--- a/app/models/concerns/issues/forbid_issue_type_column_usage.rb
+++ /dev/null
@@ -1,59 +0,0 @@
-# frozen_string_literal: true
-
-# TODO: Remove with https://gitlab.com/gitlab-org/gitlab/-/issues/402699
-module Issues
- module ForbidIssueTypeColumnUsage
- extend ActiveSupport::Concern
-
- ForbiddenColumnUsed = Class.new(StandardError)
-
- included do
- WorkItems::Type.base_types.each do |base_type, _value|
- define_method "#{base_type}?".to_sym do
- error_message = <<~ERROR
- `#{model_name.element}.#{base_type}?` uses the `issue_type` column underneath. As we want to remove the column,
- its usage is forbidden. You should use the `work_item_types` table instead.
-
- # Before
-
- #{model_name.element}.#{base_type}? => true
-
- # After
-
- #{model_name.element}.work_item_type.#{base_type}? => true
-
- More details in https://gitlab.com/groups/gitlab-org/-/epics/10529
- ERROR
-
- raise ForbiddenColumnUsed, error_message
- end
-
- define_singleton_method base_type.to_sym do
- error = ForbiddenColumnUsed.new(
- <<~ERROR
- `#{name}.#{base_type}` uses the `issue_type` column underneath. As we want to remove the column,
- its usage is forbidden. You should use the `work_item_types` table instead.
-
- # Before
-
- #{name}.#{base_type}
-
- # After
-
- #{name}.with_issue_type(:#{base_type})
-
- More details in https://gitlab.com/groups/gitlab-org/-/epics/10529
- ERROR
- )
-
- Gitlab::ErrorTracking.track_and_raise_for_dev_exception(
- error,
- method_name: "#{name}.#{base_type}"
- )
-
- with_issue_type(base_type.to_sym)
- end
- end
- end
- end
-end
diff --git a/app/models/concerns/milestoneish.rb b/app/models/concerns/milestoneish.rb
index 4f2ea58f36d..3d9e09acf44 100644
--- a/app/models/concerns/milestoneish.rb
+++ b/app/models/concerns/milestoneish.rb
@@ -51,6 +51,7 @@ module Milestoneish
def issue_participants_visible_by_user(user)
User.joins(:issue_assignees)
.where('issue_assignees.issue_id' => issues_visible_to_user(user).select(:id))
+ .allow_cross_joins_across_databases(url: "https://gitlab.com/gitlab-org/gitlab/-/issues/417457")
.distinct
end
@@ -90,9 +91,9 @@ module Milestoneish
def expires_at
if due_date
if due_date.past?
- "expired on #{due_date.to_s(:medium)}"
+ "expired on #{due_date.to_fs(:medium)}"
else
- "expires on #{due_date.to_s(:medium)}"
+ "expires on #{due_date.to_fs(:medium)}"
end
end
end
diff --git a/app/models/concerns/packages/debian/component_file.rb b/app/models/concerns/packages/debian/component_file.rb
index cc7279d05f8..90d3abddbf1 100644
--- a/app/models/concerns/packages/debian/component_file.rb
+++ b/app/models/concerns/packages/debian/component_file.rb
@@ -10,8 +10,6 @@ module Packages
include FileStoreMounter
include IgnorableColumns
- ignore_column :file_md5, remove_with: '16.2', remove_after: '2023-06-22'
-
def self.container_foreign_key
"#{container_type}_id".to_sym
end
diff --git a/app/models/concerns/project_features_compatibility.rb b/app/models/concerns/project_features_compatibility.rb
index 76c733b1c0b..c70100c03c8 100644
--- a/app/models/concerns/project_features_compatibility.rb
+++ b/app/models/concerns/project_features_compatibility.rb
@@ -4,7 +4,7 @@
#
# After migrating issues_enabled merge_requests_enabled builds_enabled snippets_enabled and wiki_enabled
# fields to a new table "project_features", support for the old fields is still needed in the API.
-require 'gitlab/utils'
+require 'gitlab/utils/all'
module ProjectFeaturesCompatibility
extend ActiveSupport::Concern
diff --git a/app/models/concerns/protected_ref.rb b/app/models/concerns/protected_ref.rb
index 7e1ebd1eba3..a87eadb9332 100644
--- a/app/models/concerns/protected_ref.rb
+++ b/app/models/concerns/protected_ref.rb
@@ -32,7 +32,12 @@ module ProtectedRef
# to fail.
has_many :"#{type}_access_levels", inverse_of: self.model_name.singular
- validates :"#{type}_access_levels", length: { is: 1, message: "are restricted to a single instance per #{self.model_name.human}." }, unless: -> { allow_multiple?(type) }
+ validates :"#{type}_access_levels",
+ length: {
+ is: 1,
+ message: "are restricted to a single instance per #{self.model_name.human}."
+ },
+ unless: -> { allow_multiple?(type) }
accepts_nested_attributes_for :"#{type}_access_levels", allow_destroy: true
end
diff --git a/app/models/concerns/protected_ref_access.rb b/app/models/concerns/protected_ref_access.rb
index c1c670db543..f0bb1cc359b 100644
--- a/app/models/concerns/protected_ref_access.rb
+++ b/app/models/concerns/protected_ref_access.rb
@@ -29,14 +29,30 @@ module ProtectedRefAccess
def humanize(access_level)
human_access_levels[access_level]
end
+
+ def non_role_types
+ []
+ end
end
included do
scope :maintainer, -> { where(access_level: Gitlab::Access::MAINTAINER) }
scope :developer, -> { where(access_level: Gitlab::Access::DEVELOPER) }
- scope :for_role, -> { where(user_id: nil, group_id: nil) }
-
- validates :access_level, presence: true, if: :role?, inclusion: { in: allowed_access_levels }
+ scope :for_role, -> {
+ if non_role_types.present?
+ where.missing(*non_role_types)
+ .allow_cross_joins_across_databases(url: "https://gitlab.com/gitlab-org/gitlab/-/issues/417457")
+ else
+ all
+ end
+ }
+
+ protected_ref_fk = "#{module_parent.model_name.singular}_id"
+ validates :access_level,
+ presence: true,
+ inclusion: { in: allowed_access_levels },
+ uniqueness: { scope: protected_ref_fk, conditions: -> { for_role } },
+ if: :role?
end
def humanize
diff --git a/app/models/concerns/protected_ref_deploy_key_access.rb b/app/models/concerns/protected_ref_deploy_key_access.rb
new file mode 100644
index 00000000000..4275476a1ff
--- /dev/null
+++ b/app/models/concerns/protected_ref_deploy_key_access.rb
@@ -0,0 +1,61 @@
+# frozen_string_literal: true
+
+module ProtectedRefDeployKeyAccess
+ extend ActiveSupport::Concern
+
+ included do
+ belongs_to :deploy_key
+
+ protected_ref_fk = "#{module_parent.model_name.singular}_id"
+ validates :deploy_key_id, uniqueness: { scope: protected_ref_fk, allow_nil: true }
+ validate :validate_deploy_key_membership
+ end
+
+ class_methods do
+ def non_role_types
+ super << :deploy_key
+ end
+ end
+
+ def type
+ return :deploy_key if deploy_key.present?
+
+ super
+ end
+
+ def humanize
+ return deploy_key.title if deploy_key?
+
+ super
+ end
+
+ def check_access(current_user)
+ super do
+ break enabled_deploy_key_for_user?(current_user) if deploy_key?
+
+ yield if block_given?
+ end
+ end
+
+ private
+
+ def deploy_key?
+ type == :deploy_key
+ end
+
+ def validate_deploy_key_membership
+ return if deploy_key.nil? || deploy_key_has_write_access_to_project?
+
+ errors.add(:deploy_key, 'is not enabled for this project')
+ end
+
+ def enabled_deploy_key_for_user?(current_user)
+ current_user.can?(:read_project, project) &&
+ deploy_key.user_id == current_user.id &&
+ deploy_key_has_write_access_to_project?
+ end
+
+ def deploy_key_has_write_access_to_project?
+ DeployKey.with_write_access_for_project(project, deploy_key: deploy_key).exists?
+ end
+end
diff --git a/app/models/concerns/spammable.rb b/app/models/concerns/spammable.rb
index 6550c5a94a0..5986f8f5b5f 100644
--- a/app/models/concerns/spammable.rb
+++ b/app/models/concerns/spammable.rb
@@ -138,7 +138,7 @@ module Spammable
result.reject(&:blank?).join("\n")
end
- # Override in Spammable if further checks are necessary
+ # Override in included class if further checks are necessary
def check_for_spam?(*)
spammable_attribute_changed?
end
@@ -153,8 +153,8 @@ module Spammable
end
end
- # Override in Spammable if differs
- def allow_possible_spam?
+ # Override in included class if you want to allow possible spam under specific circumstances
+ def allow_possible_spam?(*)
Gitlab::CurrentSettings.allow_possible_spam
end
end
diff --git a/app/models/concerns/triggerable_hooks.rb b/app/models/concerns/triggerable_hooks.rb
index e3800caa43f..0e72bd30a37 100644
--- a/app/models/concerns/triggerable_hooks.rb
+++ b/app/models/concerns/triggerable_hooks.rb
@@ -17,7 +17,8 @@ module TriggerableHooks
feature_flag_hooks: :feature_flag_events,
release_hooks: :releases_events,
member_hooks: :member_events,
- subgroup_hooks: :subgroup_events
+ subgroup_hooks: :subgroup_events,
+ emoji_hooks: :emoji_events
}.freeze
extend ActiveSupport::Concern
diff --git a/app/models/concerns/vulnerability_finding_helpers.rb b/app/models/concerns/vulnerability_finding_helpers.rb
index a5b69997900..e8a50497b20 100644
--- a/app/models/concerns/vulnerability_finding_helpers.rb
+++ b/app/models/concerns/vulnerability_finding_helpers.rb
@@ -59,6 +59,7 @@ module VulnerabilityFindingHelpers
evidence = Vulnerabilities::Finding::Evidence.new(data: report_finding.evidence.data) if report_finding.evidence
Vulnerabilities::Finding.new(finding_data).tap do |finding|
+ finding.uuid = security_finding.uuid
finding.location_fingerprint = report_finding.location.fingerprint
finding.vulnerability = vulnerability_for(security_finding.uuid)
finding.project = project
diff --git a/app/models/concerns/vulnerability_finding_signature_helpers.rb b/app/models/concerns/vulnerability_finding_signature_helpers.rb
index 71a12b4077b..a225625815b 100644
--- a/app/models/concerns/vulnerability_finding_signature_helpers.rb
+++ b/app/models/concerns/vulnerability_finding_signature_helpers.rb
@@ -2,12 +2,17 @@
module VulnerabilityFindingSignatureHelpers
extend ActiveSupport::Concern
+
# If the location object describes a physical location within a file
# (filename + line numbers), the 'location' algorithm_type should be used
# If the location object describes arbitrary data, then the 'hash'
# algorithm_type should be used.
-
- ALGORITHM_TYPES = { hash: 1, location: 2, scope_offset: 3 }.with_indifferent_access.freeze
+ ALGORITHM_TYPES = {
+ hash: 1,
+ location: 2,
+ scope_offset: 3,
+ scope_offset_compressed: 4
+ }.with_indifferent_access.freeze
class_methods do
def priority(algorithm_type)
diff --git a/app/models/container_repository.rb b/app/models/container_repository.rb
index 0f0abeae795..6a52f6a0112 100644
--- a/app/models/container_repository.rb
+++ b/app/models/container_repository.rb
@@ -403,7 +403,7 @@ class ContainerRepository < ApplicationRecord
end
def migrated?
- Gitlab.com?
+ Gitlab.com_except_jh?
end
def last_import_step_done_at
@@ -526,7 +526,7 @@ class ContainerRepository < ApplicationRecord
def size
strong_memoize(:size) do
- next unless Gitlab.com?
+ next unless Gitlab.com_except_jh?
next if self.created_at.before?(MIGRATION_PHASE_1_STARTED_AT) && self.migration_state != 'import_done'
next unless gitlab_api_client.supports_gitlab_api?
diff --git a/app/models/deployment.rb b/app/models/deployment.rb
index 1e3a80087c8..b59b22c10c4 100644
--- a/app/models/deployment.rb
+++ b/app/models/deployment.rb
@@ -351,7 +351,7 @@ class Deployment < ApplicationRecord
end
def formatted_deployment_time
- deployed_at&.to_time&.in_time_zone&.to_s(:medium)
+ deployed_at&.to_time&.in_time_zone&.to_fs(:medium)
end
def deployed_by
@@ -447,7 +447,7 @@ class Deployment < ApplicationRecord
# when refs_by_oid is passed an SHA, returns refs for that commit
def tags(limit: 100)
strong_memoize_with(:tag, limit) do
- project.repository.refs_by_oid(oid: sha, limit: limit, ref_patterns: [Gitlab::Git::TAG_REF_PREFIX]) || []
+ project.repository.refs_by_oid(oid: sha, limit: limit, ref_patterns: [Gitlab::Git::TAG_REF_PREFIX])
end
end
diff --git a/app/models/design_management/repository.rb b/app/models/design_management/repository.rb
index 39077fdbcb1..7410944e174 100644
--- a/app/models/design_management/repository.rb
+++ b/app/models/design_management/repository.rb
@@ -8,7 +8,7 @@ module DesignManagement
belongs_to :project, inverse_of: :design_management_repository
validates :project, presence: true, uniqueness: true
- delegate :lfs_enabled?, :storage, :repository_storage, to: :project
+ delegate :lfs_enabled?, :storage, :repository_storage, :run_after_commit, to: :project
def repository
::DesignManagement::GitRepository.new(
diff --git a/app/models/environment.rb b/app/models/environment.rb
index 8480272eced..241b454f5ce 100644
--- a/app/models/environment.rb
+++ b/app/models/environment.rb
@@ -18,7 +18,7 @@ class Environment < ApplicationRecord
belongs_to :cluster_agent, class_name: 'Clusters::Agent', optional: true, inverse_of: :environments
use_fast_destroy :all_deployments
- nullify_if_blank :external_url
+ nullify_if_blank :external_url, :kubernetes_namespace
has_many :all_deployments, class_name: 'Deployment'
has_many :deployments, -> { visible }
@@ -70,13 +70,15 @@ class Environment < ApplicationRecord
length: { maximum: 255 },
allow_nil: true
- # Currently, the tier presence is validaed for newly created environments.
- # After the `BackfillEnvironmentTiers` background migration has been completed, we should remove `on: :create`.
- # See https://gitlab.com/gitlab-org/gitlab/-/issues/385253.
- # Todo: Remove along with FF `validate_environment_tier_presence`.
- validates :tier, presence: true, on: :create, unless: :validate_environment_tier_present?
+ validates :kubernetes_namespace,
+ allow_nil: true,
+ length: 1..63,
+ format: {
+ with: Gitlab::Regex.kubernetes_namespace_regex,
+ message: Gitlab::Regex.kubernetes_namespace_regex_message
+ }
- validates :tier, presence: true, if: :validate_environment_tier_present?
+ validates :tier, presence: true
validate :safe_external_url
validate :merge_request_not_changed
@@ -602,10 +604,6 @@ class Environment < ApplicationRecord
self.class.tiers[:other]
end
end
-
- def validate_environment_tier_present?
- Feature.enabled?(:validate_environment_tier_presence, self.project)
- end
end
Environment.prepend_mod_with('Environment')
diff --git a/app/models/external_issue.rb b/app/models/external_issue.rb
index 36030b80370..06dc9cad5f9 100644
--- a/app/models/external_issue.rb
+++ b/app/models/external_issue.rb
@@ -44,7 +44,7 @@ class ExternalIssue
end
def reference_link_text(from = nil)
- return "##{id}" if id =~ /^\d+$/
+ return "##{id}" if /^\d+$/.match?(id)
id
end
diff --git a/app/models/external_pull_request.rb b/app/models/external_pull_request.rb
deleted file mode 100644
index 94c242782c1..00000000000
--- a/app/models/external_pull_request.rb
+++ /dev/null
@@ -1,106 +0,0 @@
-# frozen_string_literal: true
-
-# This model stores pull requests coming from external providers, such as
-# GitHub, when GitLab project is set as CI/CD only and remote mirror.
-#
-# When setting up a remote mirror with GitHub we subscribe to push and
-# pull_request webhook events. When a pull request is opened on GitHub,
-# a webhook is sent out, we create or update the status of the pull
-# request locally.
-#
-# When the mirror is updated and changes are pushed to branches we check
-# if there are open pull requests for the source and target branch.
-# If so, we create pipelines for external pull requests.
-class ExternalPullRequest < Ci::ApplicationRecord
- include Gitlab::Utils::StrongMemoize
- include ShaAttribute
- include EachBatch
-
- belongs_to :project
-
- sha_attribute :source_sha
- sha_attribute :target_sha
-
- validates :source_branch, presence: true
- validates :target_branch, presence: true
- validates :source_sha, presence: true
- validates :target_sha, presence: true
- validates :source_repository, presence: true
- validates :target_repository, presence: true
- validates :status, presence: true
-
- enum status: {
- open: 1,
- closed: 2
- }
-
- # We currently don't support pull requests from fork, so
- # we are going to return an error to the webhook
- validate :not_from_fork
-
- scope :by_source_branch, ->(branch) { where(source_branch: branch) }
- scope :by_source_repository, -> (repository) { where(source_repository: repository) }
-
- # Needed to override Ci::ApplicationRecord as this does not have ci_ table prefix
- self.table_name = 'external_pull_requests'
-
- def self.create_or_update_from_params(params)
- find_params = params.slice(:project_id, :source_branch, :target_branch)
-
- safe_find_or_initialize_and_update(find: find_params, update: params) do |pull_request|
- yield(pull_request) if block_given?
- end
- end
-
- def actual_branch_head?
- actual_source_branch_sha == source_sha
- end
-
- def from_fork?
- source_repository != target_repository
- end
-
- def source_ref
- Gitlab::Git::BRANCH_REF_PREFIX + source_branch
- end
-
- def predefined_variables
- Gitlab::Ci::Variables::Collection.new.tap do |variables|
- variables.append(key: 'CI_EXTERNAL_PULL_REQUEST_IID', value: pull_request_iid.to_s)
- variables.append(key: 'CI_EXTERNAL_PULL_REQUEST_SOURCE_REPOSITORY', value: source_repository)
- variables.append(key: 'CI_EXTERNAL_PULL_REQUEST_TARGET_REPOSITORY', value: target_repository)
- variables.append(key: 'CI_EXTERNAL_PULL_REQUEST_SOURCE_BRANCH_SHA', value: source_sha)
- variables.append(key: 'CI_EXTERNAL_PULL_REQUEST_TARGET_BRANCH_SHA', value: target_sha)
- variables.append(key: 'CI_EXTERNAL_PULL_REQUEST_SOURCE_BRANCH_NAME', value: source_branch)
- variables.append(key: 'CI_EXTERNAL_PULL_REQUEST_TARGET_BRANCH_NAME', value: target_branch)
- end
- end
-
- def modified_paths
- project.repository.diff_stats(target_sha, source_sha).paths
- end
-
- private
-
- def actual_source_branch_sha
- project.commit(source_ref)&.sha
- end
-
- def not_from_fork
- if from_fork?
- errors.add(:base, _('Pull requests from fork are not supported'))
- end
- end
-
- def self.safe_find_or_initialize_and_update(find:, update:)
- safe_ensure_unique(retries: 1) do
- model = find_or_initialize_by(find)
-
- if model.update(update)
- yield(model) if block_given?
- end
-
- model
- end
- end
-end
diff --git a/app/models/group.rb b/app/models/group.rb
index 85971c48567..2b5a392e02c 100644
--- a/app/models/group.rb
+++ b/app/models/group.rb
@@ -510,7 +510,9 @@ class Group < Namespace
members_with_parents(only_active_users: false)
end
- members_from_hiearchy.all_owners.left_outer_joins(:user).merge(User.without_project_bot)
+ members_from_hiearchy.all_owners.left_outer_joins(:user)
+ .merge(User.without_project_bot)
+ .allow_cross_joins_across_databases(url: "https://gitlab.com/gitlab-org/gitlab/-/issues/417455")
end
def ldap_synced?
@@ -663,13 +665,24 @@ class Group < Namespace
# 2. They belong to a project that belongs to the group
# 3. They belong to a sub-group or project in such sub-group
# 4. They belong to an ancestor group
- def direct_and_indirect_users
+ # 5. They belong to a group that is shared with this group, if share_with_groups is true
+ def direct_and_indirect_users(share_with_groups: false)
+ members = if share_with_groups
+ # We only need :user_id column, but
+ # `members_from_self_and_ancestor_group_shares` needs more
+ # columns to make the CTE query work.
+ GroupMember.from_union([
+ direct_and_indirect_members.select(:user_id, :source_type, :type),
+ members_from_self_and_ancestor_group_shares.reselect(:user_id, :source_type, :type)
+ ])
+ else
+ direct_and_indirect_members
+ end
+
User.from_union([
- User
- .where(id: direct_and_indirect_members.select(:user_id))
- .reorder(nil),
- project_users_with_descendants
- ])
+ User.where(id: members.select(:user_id)).reorder(nil),
+ project_users_with_descendants
+ ])
end
# Returns all users (also inactive) that are members of the group because:
@@ -683,7 +696,7 @@ class Group < Namespace
.where(id: direct_and_indirect_members_with_inactive.select(:user_id))
.reorder(nil),
project_users_with_descendants
- ])
+ ]).allow_cross_joins_across_databases(url: "https://gitlab.com/gitlab-org/gitlab/-/issues/417455") # failed in spec/tasks/gitlab/user_management_rake_spec.rb
end
def users_count
@@ -696,6 +709,7 @@ class Group < Namespace
User
.joins(projects: :group)
.where(namespaces: { id: self_and_descendants.select(:id) })
+ .allow_cross_joins_across_databases(url: "https://gitlab.com/gitlab-org/gitlab/-/issues/417455")
end
# Return the highest access level for a user
@@ -802,8 +816,11 @@ class Group < Namespace
end
def execute_integrations(data, hooks_scope)
- # NOOP
- # TODO: group hooks https://gitlab.com/gitlab-org/gitlab/-/issues/216904
+ return unless Feature.enabled?(:group_mentions, self)
+
+ integrations.public_send(hooks_scope).each do |integration| # rubocop:disable GitlabSecurity/PublicSend
+ integration.async_execute(data)
+ end
end
def preload_shared_group_links
@@ -813,16 +830,6 @@ class Group < Namespace
).call
end
- def update_shared_runners_setting!(state)
- raise ArgumentError unless SHARED_RUNNERS_SETTINGS.include?(state)
-
- case state
- when SR_DISABLED_AND_UNOVERRIDABLE then disable_shared_runners! # also disallows override
- when SR_DISABLED_WITH_OVERRIDE, SR_DISABLED_AND_OVERRIDABLE then disable_shared_runners_and_allow_override!
- when SR_ENABLED then enable_shared_runners! # set both to true
- end
- end
-
def first_owner
owners.first || parent&.first_owner || owner
end
@@ -969,12 +976,14 @@ class Group < Namespace
end
def max_member_access(user_ids)
- Gitlab::SafeRequestLoader.execute(
- resource_key: max_member_access_for_resource_key(User),
- resource_ids: user_ids,
- default_value: Gitlab::Access::NO_ACCESS
- ) do |user_ids|
- members_with_parents.where(user_id: user_ids).group(:user_id).maximum(:access_level)
+ ::Gitlab::Database.allow_cross_joins_across_databases(url: "https://gitlab.com/gitlab-org/gitlab/-/issues/417455") do
+ Gitlab::SafeRequestLoader.execute(
+ resource_key: max_member_access_for_resource_key(User),
+ resource_ids: user_ids,
+ default_value: Gitlab::Access::NO_ACCESS
+ ) do |user_ids|
+ members_with_parents.where(user_id: user_ids).group(:user_id).maximum(:access_level)
+ end
end
end
@@ -1057,45 +1066,6 @@ class Group < Namespace
Arel::Nodes::SqlLiteral.new(column_alias))
end
- def disable_shared_runners!
- update!(
- shared_runners_enabled: false,
- allow_descendants_override_disabled_shared_runners: false)
-
- group_ids = descendants
- unless group_ids.empty?
- Group.by_id(group_ids).update_all(
- shared_runners_enabled: false,
- allow_descendants_override_disabled_shared_runners: false)
- end
-
- all_projects.update_all(shared_runners_enabled: false)
- end
-
- def disable_shared_runners_and_allow_override!
- # enabled -> disabled_and_overridable
- if shared_runners_enabled?
- update!(
- shared_runners_enabled: false,
- allow_descendants_override_disabled_shared_runners: true)
-
- group_ids = descendants
- unless group_ids.empty?
- Group.by_id(group_ids).update_all(shared_runners_enabled: false)
- end
-
- all_projects.update_all(shared_runners_enabled: false)
-
- # disabled_and_unoverridable -> disabled_and_overridable
- else
- update!(allow_descendants_override_disabled_shared_runners: true)
- end
- end
-
- def enable_shared_runners!
- update!(shared_runners_enabled: true)
- end
-
def runners_token_prefix
RunnersTokenPrefixable::RUNNERS_TOKEN_PREFIX
end
diff --git a/app/models/hooks/project_hook.rb b/app/models/hooks/project_hook.rb
index 695041f0247..05c5ad22218 100644
--- a/app/models/hooks/project_hook.rb
+++ b/app/models/hooks/project_hook.rb
@@ -21,7 +21,8 @@ class ProjectHook < WebHook
:wiki_page_hooks,
:deployment_hooks,
:feature_flag_hooks,
- :release_hooks
+ :release_hooks,
+ :emoji_hooks
]
belongs_to :project
diff --git a/app/models/hooks/web_hook_log.rb b/app/models/hooks/web_hook_log.rb
index e08294058e4..4c35f699468 100644
--- a/app/models/hooks/web_hook_log.rb
+++ b/app/models/hooks/web_hook_log.rb
@@ -66,7 +66,7 @@ class WebHookLog < ApplicationRecord
def redact_user_emails
self.request_data.deep_transform_values! do |value|
- value.to_s =~ URI::MailTo::EMAIL_REGEXP ? _('[REDACTED]') : value
+ URI::MailTo::EMAIL_REGEXP.match?(value.to_s) ? _('[REDACTED]') : value
end
end
diff --git a/app/models/integration.rb b/app/models/integration.rb
index f2f242136ab..f823a385022 100644
--- a/app/models/integration.rb
+++ b/app/models/integration.rb
@@ -90,6 +90,8 @@ class Integration < ApplicationRecord
attribute :push_events, default: true
attribute :tag_push_events, default: true
attribute :wiki_page_events, default: true
+ attribute :group_mention_events, default: false
+ attribute :group_confidential_mention_events, default: false
after_initialize :initialize_properties
@@ -137,6 +139,8 @@ class Integration < ApplicationRecord
scope :alert_hooks, -> { where(alert_events: true, active: true) }
scope :incident_hooks, -> { where(incident_events: true, active: true) }
scope :deployment, -> { where(category: 'deployment') }
+ scope :group_mention_hooks, -> { where(group_mention_events: true, active: true) }
+ scope :group_confidential_mention_hooks, -> { where(group_confidential_mention_events: true, active: true) }
class << self
private
@@ -586,6 +590,7 @@ class Integration < ApplicationRecord
end
def async_execute(data)
+ return if ::Gitlab::SilentMode.enabled?
return unless supported_events.include?(data[:object_kind])
Integrations::ExecuteWorker.perform_async(id, data)
@@ -600,6 +605,10 @@ class Integration < ApplicationRecord
category == :chat
end
+ def ci?
+ category == :ci
+ end
+
private
# Ancestors sorted by hierarchy depth in bottom-top order.
diff --git a/app/models/integrations/base_chat_notification.rb b/app/models/integrations/base_chat_notification.rb
index 4477f3d207f..c9de4d2b3bb 100644
--- a/app/models/integrations/base_chat_notification.rb
+++ b/app/models/integrations/base_chat_notification.rb
@@ -262,11 +262,11 @@ module Integrations
end
def project_name
- project.full_name
+ project.try(:full_name)
end
def project_url
- project.web_url
+ project.try(:web_url)
end
def update?(data)
diff --git a/app/models/integrations/base_slack_notification.rb b/app/models/integrations/base_slack_notification.rb
index c83a559e0da..29a20419809 100644
--- a/app/models/integrations/base_slack_notification.rb
+++ b/app/models/integrations/base_slack_notification.rb
@@ -7,6 +7,8 @@ module Integrations
].freeze
prop_accessor EVENT_CHANNEL['alert']
+ prop_accessor EVENT_CHANNEL['group_mention']
+ prop_accessor EVENT_CHANNEL['group_confidential_mention']
override :default_channel_placeholder
def default_channel_placeholder
@@ -16,15 +18,20 @@ module Integrations
override :get_message
def get_message(object_kind, data)
return Integrations::ChatMessage::AlertMessage.new(data) if object_kind == 'alert'
+ return Integrations::ChatMessage::GroupMentionMessage.new(data) if object_kind == 'group_mention'
super
end
override :supported_events
def supported_events
- additional = ['alert']
+ additional = %w[alert]
- super + additional
+ if group_level? && Feature.enabled?(:group_mentions, group)
+ additional += %w[group_mention group_confidential_mention]
+ end
+
+ (super + additional).freeze
end
override :configurable_channels?
diff --git a/app/models/integrations/chat_message/group_mention_message.rb b/app/models/integrations/chat_message/group_mention_message.rb
new file mode 100644
index 00000000000..a2bc00ddbd9
--- /dev/null
+++ b/app/models/integrations/chat_message/group_mention_message.rb
@@ -0,0 +1,102 @@
+# frozen_string_literal: true
+
+module Integrations
+ module ChatMessage
+ class GroupMentionMessage < BaseMessage
+ ISSUE_KIND = 'issue'
+ MR_KIND = 'merge_request'
+ NOTE_KIND = 'note'
+
+ KNOWN_KINDS = [ISSUE_KIND, MR_KIND, NOTE_KIND].freeze
+
+ def initialize(params)
+ super
+ params = HashWithIndifferentAccess.new(params)
+
+ @group_name, @group_url = params[:mentioned].values_at(:name, :url)
+ @detail = nil
+
+ obj_attr = params[:object_attributes]
+ obj_kind = obj_attr[:object_kind]
+ raise NotImplementedError unless KNOWN_KINDS.include?(obj_kind)
+
+ case obj_kind
+ when 'issue'
+ @source_name, @title = get_source_for_issue(obj_attr)
+ @detail = obj_attr[:description]
+ when 'merge_request'
+ @source_name, @title = get_source_for_merge_request(obj_attr)
+ @detail = obj_attr[:description]
+ when 'note'
+ if params[:commit]
+ @source_name, @title = get_source_for_commit(params[:commit])
+ elsif params[:issue]
+ @source_name, @title = get_source_for_issue(params[:issue])
+ elsif params[:merge_request]
+ @source_name, @title = get_source_for_merge_request(params[:merge_request])
+ else
+ raise NotImplementedError
+ end
+
+ @detail = obj_attr[:note]
+ end
+
+ @source_url = obj_attr[:url]
+ end
+
+ def attachments
+ if markdown
+ detail
+ else
+ [{ text: format(detail), color: attachment_color }]
+ end
+ end
+
+ def activity
+ {
+ title: "Group #{group_link} was mentioned in #{source_link}",
+ subtitle: "of #{project_link}",
+ text: strip_markup(formatted_title),
+ image: user_avatar
+ }
+ end
+
+ private
+
+ attr_reader :group_name, :group_url, :source_name, :source_url, :title, :detail
+
+ def get_source_for_commit(params)
+ commit_sha = Commit.truncate_sha(params[:id])
+ ["commit #{commit_sha}", params[:title]]
+ end
+
+ def get_source_for_issue(params)
+ ["issue ##{params[:iid]}", params[:title]]
+ end
+
+ def get_source_for_merge_request(params)
+ ["merge request !#{params[:iid]}", params[:title]]
+ end
+
+ def message
+ "Group #{group_link} was mentioned in #{source_link} of #{project_link}: *#{formatted_title}*"
+ end
+
+ def formatted_title
+ strip_markup(title.lines.first.chomp)
+ end
+
+ def group_link
+ link(group_name, group_url)
+ end
+
+ def source_link
+ link(source_name, source_url)
+ end
+
+ def project_link
+ link(project_name, project_url)
+ end
+ end
+ end
+end
diff --git a/app/models/integrations/hangouts_chat.rb b/app/models/integrations/hangouts_chat.rb
index ad82f1b916f..7ba9bbc38e6 100644
--- a/app/models/integrations/hangouts_chat.rb
+++ b/app/models/integrations/hangouts_chat.rb
@@ -2,6 +2,23 @@
module Integrations
class HangoutsChat < BaseChatNotification
+ undef :notify_only_broken_pipelines
+
+ field :webhook,
+ section: SECTION_TYPE_CONNECTION,
+ help: 'https://chat.googleapis.com/v1/spaces…',
+ required: true
+
+ field :notify_only_broken_pipelines,
+ type: 'checkbox',
+ section: SECTION_TYPE_CONFIGURATION
+
+ field :branches_to_be_notified,
+ type: 'select',
+ section: SECTION_TYPE_CONFIGURATION,
+ title: -> { s_('Integrations|Branches for which notifications are to be sent') },
+ choices: -> { branch_choices }
+
def title
'Google Chat'
end
@@ -19,25 +36,15 @@ module Integrations
s_('Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}').html_safe % { docs_link: docs_link.html_safe }
end
- def default_channel_placeholder
+ def fields
+ self.class.fields + build_event_channels
end
- def self.supported_events
- %w[push issue confidential_issue merge_request note confidential_note tag_push
- pipeline wiki_page]
+ def default_channel_placeholder
end
- def default_fields
- [
- { type: 'text', name: 'webhook', help: 'https://chat.googleapis.com/v1/spaces…' },
- { type: 'checkbox', name: 'notify_only_broken_pipelines' },
- {
- type: 'select',
- name: 'branches_to_be_notified',
- title: s_('Integrations|Branches for which notifications are to be sent'),
- choices: self.class.branch_choices
- }
- ]
+ def self.supported_events
+ %w[push issue confidential_issue merge_request note confidential_note tag_push pipeline wiki_page]
end
private
diff --git a/app/models/integrations/microsoft_teams.rb b/app/models/integrations/microsoft_teams.rb
index d6cbe5760e8..a9ed0bd3da1 100644
--- a/app/models/integrations/microsoft_teams.rb
+++ b/app/models/integrations/microsoft_teams.rb
@@ -2,6 +2,24 @@
module Integrations
class MicrosoftTeams < BaseChatNotification
+ undef :notify_only_broken_pipelines
+
+ field :webhook,
+ section: SECTION_TYPE_CONNECTION,
+ help: 'https://outlook.office.com/webhook/…',
+ required: true
+
+ field :notify_only_broken_pipelines,
+ type: 'checkbox',
+ section: SECTION_TYPE_CONFIGURATION,
+ help: 'If selected, successful pipelines do not trigger a notification event.'
+
+ field :branches_to_be_notified,
+ type: 'select',
+ section: SECTION_TYPE_CONFIGURATION,
+ title: -> { s_('Integrations|Branches for which notifications are to be sent') },
+ choices: -> { branch_choices }
+
def title
'Microsoft Teams notifications'
end
@@ -26,23 +44,8 @@ module Integrations
pipeline wiki_page]
end
- def default_fields
- [
- { type: 'text', section: SECTION_TYPE_CONNECTION, name: 'webhook', help: 'https://outlook.office.com/webhook/…', required: true },
- {
- type: 'checkbox',
- section: SECTION_TYPE_CONFIGURATION,
- name: 'notify_only_broken_pipelines',
- help: 'If selected, successful pipelines do not trigger a notification event.'
- },
- {
- type: 'select',
- section: SECTION_TYPE_CONFIGURATION,
- name: 'branches_to_be_notified',
- title: s_('Integrations|Branches for which notifications are to be sent'),
- choices: self.class.branch_choices
- }
- ]
+ def fields
+ self.class.fields + build_event_channels
end
def sections
diff --git a/app/models/integrations/prometheus.rb b/app/models/integrations/prometheus.rb
index 2dc0fd7d011..8969c6c13b2 100644
--- a/app/models/integrations/prometheus.rb
+++ b/app/models/integrations/prometheus.rb
@@ -15,7 +15,7 @@ module Integrations
title: 'API URL',
placeholder: -> { s_('PrometheusService|https://prometheus.example.com/') },
help: -> { s_('PrometheusService|The Prometheus API base URL.') },
- required: true
+ required: false
field :google_iap_audience_client_id,
title: 'Google IAP Audience Client ID',
@@ -34,8 +34,8 @@ module Integrations
# to allow localhost URLs when the following conditions are true:
# 1. api_url is the internal Prometheus URL.
with_options presence: true do
- validates :api_url, public_url: true, if: ->(object) { object.manual_configuration? && !object.allow_local_api_url? }
- validates :api_url, url: true, if: ->(object) { object.manual_configuration? && object.allow_local_api_url? }
+ validates :api_url, public_url: true, if: ->(object) { object.api_url.present? && object.manual_configuration? && !object.allow_local_api_url? }
+ validates :api_url, url: true, if: ->(object) { object.api_url.present? && object.manual_configuration? && object.allow_local_api_url? }
end
before_save :synchronize_service_state
diff --git a/app/models/integrations/unify_circuit.rb b/app/models/integrations/unify_circuit.rb
index aa19133b8c2..6c447c8f4e4 100644
--- a/app/models/integrations/unify_circuit.rb
+++ b/app/models/integrations/unify_circuit.rb
@@ -2,6 +2,23 @@
module Integrations
class UnifyCircuit < BaseChatNotification
+ undef :notify_only_broken_pipelines
+
+ field :webhook,
+ section: SECTION_TYPE_CONNECTION,
+ help: 'https://yourcircuit.com/rest/v2/webhooks/incoming/…',
+ required: true
+
+ field :notify_only_broken_pipelines,
+ type: 'checkbox',
+ section: SECTION_TYPE_CONFIGURATION
+
+ field :branches_to_be_notified,
+ type: 'select',
+ section: SECTION_TYPE_CONFIGURATION,
+ title: -> { s_('Integrations|Branches for which notifications are to be sent') },
+ choices: -> { branch_choices }
+
def title
'Unify Circuit'
end
@@ -14,6 +31,10 @@ module Integrations
'unify_circuit'
end
+ def fields
+ self.class.fields + build_event_channels
+ end
+
def help
docs_link = ActionController::Base.helpers.link_to _('How do I set up this service?'), Rails.application.routes.url_helpers.help_page_url('user/project/integrations/unify_circuit'), target: '_blank', rel: 'noopener noreferrer'
s_('Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}').html_safe % { docs_link: docs_link.html_safe }
@@ -27,19 +48,6 @@ module Integrations
pipeline wiki_page]
end
- def default_fields
- [
- { type: 'text', name: 'webhook', help: 'https://yourcircuit.com/rest/v2/webhooks/incoming/…', required: true },
- { type: 'checkbox', name: 'notify_only_broken_pipelines' },
- {
- type: 'select',
- name: 'branches_to_be_notified',
- title: s_('Integrations|Branches for which notifications are to be sent'),
- choices: self.class.branch_choices
- }
- ]
- end
-
private
def notify(message, opts)
diff --git a/app/models/integrations/webex_teams.rb b/app/models/integrations/webex_teams.rb
index 8e6f5ca6d17..ef1bc81ea58 100644
--- a/app/models/integrations/webex_teams.rb
+++ b/app/models/integrations/webex_teams.rb
@@ -2,6 +2,23 @@
module Integrations
class WebexTeams < BaseChatNotification
+ undef :notify_only_broken_pipelines
+
+ field :webhook,
+ section: SECTION_TYPE_CONNECTION,
+ help: 'https://api.ciscospark.com/v1/webhooks/incoming/...',
+ required: true
+
+ field :notify_only_broken_pipelines,
+ type: 'checkbox',
+ section: SECTION_TYPE_CONFIGURATION
+
+ field :branches_to_be_notified,
+ type: 'select',
+ section: SECTION_TYPE_CONFIGURATION,
+ title: -> { s_('Integrations|Branches for which notifications are to be sent') },
+ choices: -> { branch_choices }
+
def title
s_("WebexTeamsService|Webex Teams")
end
@@ -14,6 +31,10 @@ module Integrations
'webex_teams'
end
+ def fields
+ self.class.fields + build_event_channels
+ end
+
def help
docs_link = ActionController::Base.helpers.link_to _('Learn more.'), Rails.application.routes.url_helpers.help_page_url('user/project/integrations/webex_teams'), target: '_blank', rel: 'noopener noreferrer'
s_("WebexTeamsService|Send notifications about project events to a Webex Teams conversation. %{docs_link}") % { docs_link: docs_link.html_safe }
@@ -23,21 +44,7 @@ module Integrations
end
def self.supported_events
- %w[push issue confidential_issue merge_request note confidential_note tag_push
- pipeline wiki_page]
- end
-
- def default_fields
- [
- { type: 'text', name: 'webhook', help: 'https://api.ciscospark.com/v1/webhooks/incoming/...', required: true },
- { type: 'checkbox', name: 'notify_only_broken_pipelines' },
- {
- type: 'select',
- name: 'branches_to_be_notified',
- title: s_('Integrations|Branches for which notifications are to be sent'),
- choices: self.class.branch_choices
- }
- ]
+ %w[push issue confidential_issue merge_request note confidential_note tag_push pipeline wiki_page]
end
private
diff --git a/app/models/issue.rb b/app/models/issue.rb
index 890af8a27a0..6e48dcab9ed 100644
--- a/app/models/issue.rb
+++ b/app/models/issue.rb
@@ -56,6 +56,8 @@ class Issue < ApplicationRecord
# This default came from the enum `issue_type` column. Defined as default in the DB
DEFAULT_ISSUE_TYPE = :issue
+ ignore_column :issue_type, remove_with: '16.4', remove_after: '2023-08-22'
+
belongs_to :project
belongs_to :namespace, inverse_of: :issues
@@ -133,12 +135,6 @@ class Issue < ApplicationRecord
validate :allowed_work_item_type_change, on: :update, if: :work_item_type_id_changed?
validate :due_date_after_start_date
validate :parent_link_confidentiality
- # using a custom validation since we are overwriting the `issue_type` method to use the work_item_types table
- validate :issue_type_attribute_present
-
- enum issue_type: WorkItems::Type.base_types
- # TODO: Remove with https://gitlab.com/gitlab-org/gitlab/-/issues/402699
- include ::Issues::ForbidIssueTypeColumnUsage
alias_method :issuing_parent, :project
alias_attribute :issuing_parent_id, :project_id
@@ -187,7 +183,10 @@ class Issue < ApplicationRecord
scope :order_closed_at_desc, -> { reorder(arel_table[:closed_at].desc.nulls_last) }
scope :preload_associated_models, -> { preload(:assignees, :labels, project: :namespace) }
- scope :with_web_entity_associations, -> { preload(:author, :namespace, project: [:project_feature, :route, namespace: :route]) }
+ scope :with_web_entity_associations, -> do
+ preload(:author, :namespace, :labels, project: [:project_feature, :route, namespace: :route])
+ end
+
scope :preload_awardable, -> { preload(:award_emoji) }
scope :with_alert_management_alerts, -> { joins(:alert_management_alert) }
scope :with_prometheus_alert_events, -> { joins(:issues_prometheus_alert_events) }
@@ -201,24 +200,17 @@ class Issue < ApplicationRecord
scope :with_issue_type, ->(types) {
types = Array(types)
- if Feature.enabled?(:issue_type_uses_work_item_types_table)
- # Using != 1 since we also want the guard clause to handle empty arrays
- return joins(:work_item_type).where(work_item_types: { base_type: types }) if types.size != 1
+ # Using != 1 since we also want the guard clause to handle empty arrays
+ return joins(:work_item_type).where(work_item_types: { base_type: types }) if types.size != 1
- where(
- '"issues"."work_item_type_id" = (?)',
- WorkItems::Type.by_type(types.first).select(:id).limit(1)
- )
- else
- where(issue_type: types)
- end
+ # This optimization helps the planer use the correct indexes when filtering by a single type
+ where(
+ '"issues"."work_item_type_id" = (?)',
+ WorkItems::Type.by_type(types.first).select(:id).limit(1)
+ )
}
scope :without_issue_type, ->(types) {
- if Feature.enabled?(:issue_type_uses_work_item_types_table)
- joins(:work_item_type).where.not(work_item_types: { base_type: types })
- else
- where.not(issue_type: types)
- end
+ joins(:work_item_type).where.not(work_item_types: { base_type: types })
}
scope :public_only, -> { where(confidential: false) }
@@ -258,7 +250,6 @@ class Issue < ApplicationRecord
scope :with_projects_matching_search_data, -> { where('issue_search_data.project_id = issues.project_id') }
before_validation :ensure_namespace_id, :ensure_work_item_type
- before_save :check_issue_type_in_sync!
after_save :ensure_metrics!, unless: :importing?
after_commit :expire_etag_cache, unless: :importing?
@@ -588,16 +579,12 @@ class Issue < ApplicationRecord
user, project.external_authorization_classification_label)
end
- def check_for_spam?(user:)
- # content created via support bots is always checked for spam, EVEN if
- # the issue is not publicly visible and/or confidential
- return true if user.support_bot? && spammable_attribute_changed?
-
- # Only check for spam on issues which are publicly visible (and thus indexed in search engines)
- return false unless publicly_visible?
+ # Always enforce spam check for support bot but allow for other users when issue is not publicly visible
+ def allow_possible_spam?(user)
+ return true if Gitlab::CurrentSettings.allow_possible_spam
+ return false if user.support_bot?
- # Only check for spam if certain attributes have changed
- spammable_attribute_changed?
+ !publicly_visible?
end
def supports_recaptcha?
@@ -753,11 +740,7 @@ class Issue < ApplicationRecord
end
def issue_type
- if ::Feature.enabled?(:issue_type_uses_work_item_types_table)
- work_item_type_with_default.base_type
- else
- super
- end
+ work_item_type_with_default.base_type
end
def unsubscribe_email_participant(email)
@@ -766,41 +749,11 @@ class Issue < ApplicationRecord
issue_email_participants.find_by_email(email)&.destroy
end
- private
-
- def check_issue_type_in_sync!
- # We might have existing records out of sync, so we need to skip this check unless the value is changed
- # so those records can still be updated until we fix them and remove the issue_type column
- # https://gitlab.com/gitlab-org/gitlab/-/work_items/403158
- return unless (changes.keys & %w[issue_type work_item_type_id]).any?
-
- # Do not replace the use of attributes with `issue_type` here
- if attributes['issue_type'] != work_item_type.base_type
- error = IssueTypeOutOfSyncError.new(
- <<~ERROR
- Issue `issue_type` out of sync with `work_item_type_id` column.
- `issue_type` must be equal to `work_item.base_type`.
- You can assign the correct work_item_type like this for example:
-
- Issue.new(issue_type: :incident, work_item_type: WorkItems::Type.default_by_type(:incident))
-
- More details in https://gitlab.com/gitlab-org/gitlab/-/issues/338005
- ERROR
- )
-
- Gitlab::ErrorTracking.track_and_raise_for_dev_exception(
- error,
- issue_type: attributes['issue_type'],
- work_item_type_id: work_item_type_id
- )
- end
+ def hook_attrs
+ Gitlab::HookData::IssueBuilder.new(self).build
end
- def issue_type_attribute_present
- return if attributes['issue_type'].present?
-
- errors.add(:issue_type, 'Must be present')
- end
+ private
def due_date_after_start_date
return unless start_date.present? && due_date.present?
@@ -834,12 +787,6 @@ class Issue < ApplicationRecord
Issues::SearchData.upsert({ project_id: project_id, issue_id: id, search_vector: search_vector }, unique_by: %i(project_id issue_id))
end
- def spammable_attribute_changed?
- # NOTE: We need to check them for spam when issues are made non-confidential, because spam
- # may have been added while they were confidential and thus not being checked for spam.
- super || confidential_changed?(from: true, to: false)
- end
-
def ensure_metrics!
Issue::Metrics.record!(self)
end
@@ -868,9 +815,7 @@ class Issue < ApplicationRecord
def ensure_work_item_type
return if work_item_type_id.present? || work_item_type_id_change&.last.present?
- # TODO: We should switch to DEFAULT_ISSUE_TYPE here when the issue_type column is dropped
- # https://gitlab.com/gitlab-org/gitlab/-/work_items/402700
- self.work_item_type = WorkItems::Type.default_by_type(attributes['issue_type'])
+ self.work_item_type = WorkItems::Type.default_by_type(DEFAULT_ISSUE_TYPE)
end
def allowed_work_item_type_change
diff --git a/app/models/member.rb b/app/models/member.rb
index 0700b1a8448..f164ea244b4 100644
--- a/app/models/member.rb
+++ b/app/models/member.rb
@@ -66,6 +66,7 @@ class Member < ApplicationRecord
scope :with_invited_user_state, -> do
joins('LEFT JOIN users as invited_user ON invited_user.email = members.invite_email')
.select('members.*', 'invited_user.state as invited_user_state')
+ .allow_cross_joins_across_databases(url: "https://gitlab.com/gitlab-org/gitlab/-/issues/417456")
end
scope :in_hierarchy, ->(source) do
@@ -174,7 +175,10 @@ class Member < ApplicationRecord
scope :by_access_level, -> (access_level) { active.where(access_level: access_level) }
scope :all_by_access_level, -> (access_level) { where(access_level: access_level) }
- scope :preload_user_and_notification_settings, -> { preload(user: :notification_settings) }
+ scope :preload_user_and_notification_settings, -> do
+ preload(user: :notification_settings)
+ .allow_cross_joins_across_databases(url: "https://gitlab.com/gitlab-org/gitlab/-/issues/417456")
+ end
scope :with_source_id, ->(source_id) { where(source_id: source_id) }
scope :including_source, -> { includes(:source) }
@@ -288,7 +292,9 @@ class Member < ApplicationRecord
class << self
def search(query)
- scope = joins(:user).merge(User.search(query, use_minimum_char_limit: false))
+ scope = joins(:user)
+ .merge(User.search(query, use_minimum_char_limit: false))
+ .allow_cross_joins_across_databases(url: "https://gitlab.com/gitlab-org/gitlab/-/issues/417456")
return scope unless Gitlab::Pagination::Keyset::Order.keyset_aware?(scope)
@@ -347,6 +353,7 @@ class Member < ApplicationRecord
def left_join_users
left_outer_joins(:user)
+ .allow_cross_joins_across_databases(url: "https://gitlab.com/gitlab-org/gitlab/-/issues/417456")
end
def access_for_user_ids(user_ids)
diff --git a/app/models/members/group_member.rb b/app/models/members/group_member.rb
index 237054587bc..ada89345a7f 100644
--- a/app/models/members/group_member.rb
+++ b/app/models/members/group_member.rb
@@ -20,7 +20,6 @@ class GroupMember < Member
scope :of_groups, ->(groups) { where(source_id: groups&.select(:id)) }
scope :of_ldap_type, -> { where(ldap: true) }
scope :count_users_by_group_id, -> { group(:source_id).count }
- scope :with_user, -> (user) { where(user: user) }
after_create :update_two_factor_requirement, unless: :invite?
after_destroy :update_two_factor_requirement, unless: :invite?
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 116108ceaf9..2773569161d 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -421,7 +421,9 @@ class MergeRequest < ApplicationRecord
scope :preload_latest_diff_commit, -> { preload(latest_merge_request_diff: { merge_request_diff_commits: [:commit_author, :committer] }) }
scope :preload_milestoneish_associations, -> { preload_routables.preload(:assignees, :labels) }
- scope :with_web_entity_associations, -> { preload(:author, target_project: [:project_feature, group: [:route, :parent], namespace: :route]) }
+ scope :with_web_entity_associations, -> do
+ preload(:author, :labels, target_project: [:project_feature, group: [:route, :parent], namespace: :route])
+ end
scope :with_auto_merge_enabled, -> do
with_state(:opened).where(auto_merge_enabled: true)
@@ -1199,10 +1201,17 @@ class MergeRequest < ApplicationRecord
end
alias_method :wip_title, :draft_title
- def mergeable?(skip_ci_check: false, skip_discussions_check: false)
+ def skipped_mergeable_checks(options = {})
+ {
+ skip_ci_check: options.fetch(:auto_merge_requested, false)
+ }
+ end
+
+ def mergeable?(skip_ci_check: false, skip_discussions_check: false, skip_approved_check: false)
return false unless mergeable_state?(
skip_ci_check: skip_ci_check,
- skip_discussions_check: skip_discussions_check
+ skip_discussions_check: skip_discussions_check,
+ skip_approved_check: skip_approved_check
)
check_mergeability
@@ -1223,11 +1232,12 @@ class MergeRequest < ApplicationRecord
]
end
- def mergeable_state?(skip_ci_check: false, skip_discussions_check: false)
+ def mergeable_state?(skip_ci_check: false, skip_discussions_check: false, skip_approved_check: false)
additional_checks = execute_merge_checks(
params: {
skip_ci_check: skip_ci_check,
- skip_discussions_check: skip_discussions_check
+ skip_discussions_check: skip_discussions_check,
+ skip_approved_check: skip_approved_check
}
)
additional_checks.success?
@@ -1526,6 +1536,14 @@ class MergeRequest < ApplicationRecord
"refs/#{Repository::REF_MERGE_REQUEST}/#{iid}/train"
end
+ def schedule_cleanup_refs(only: :all)
+ if Feature.enabled?(:merge_request_cleanup_ref_worker_async, target_project)
+ MergeRequests::CleanupRefWorker.perform_async(id, only.to_s)
+ else
+ cleanup_refs(only: only)
+ end
+ end
+
def cleanup_refs(only: :all)
target_refs = []
target_refs << ref_path if %i[all head].include?(only)
diff --git a/app/models/merge_request/diff_llm_summary.rb b/app/models/merge_request/diff_llm_summary.rb
deleted file mode 100644
index e13fe5e1f50..00000000000
--- a/app/models/merge_request/diff_llm_summary.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# rubocop:disable Style/ClassAndModuleChildren
-# frozen_string_literal: true
-
-class MergeRequest::DiffLlmSummary < ApplicationRecord
- belongs_to :merge_request_diff
- belongs_to :user, optional: true
-
- validates :merge_request_diff_id, uniqueness: true
- validates :provider, presence: true
- validates :content, presence: true, length: { maximum: 2056 }
-
- enum provider: { openai: 0 }
-end
-# rubocop:enable Style/ClassAndModuleChildren
diff --git a/app/models/merge_request/metrics.rb b/app/models/merge_request/metrics.rb
index 70216144035..a13cb353c7b 100644
--- a/app/models/merge_request/metrics.rb
+++ b/app/models/merge_request/metrics.rb
@@ -13,7 +13,7 @@ class MergeRequest::Metrics < ApplicationRecord
before_save :ensure_target_project_id
scope :merged_after, ->(date) { where(arel_table[:merged_at].gteq(date)) }
- scope :merged_before, ->(date) { where(arel_table[:merged_at].lteq(date)) }
+ scope :merged_before, ->(date) { where(arel_table[:merged_at].lteq(date.is_a?(Time) ? date.end_of_day : date)) }
scope :with_valid_time_to_merge, -> { where(arel_table[:merged_at].gt(arel_table[:created_at])) }
scope :by_target_project, ->(project) { where(target_project_id: project) }
diff --git a/app/models/milestone.rb b/app/models/milestone.rb
index d300b938fc0..8de717fb61d 100644
--- a/app/models/milestone.rb
+++ b/app/models/milestone.rb
@@ -10,6 +10,7 @@ class Milestone < ApplicationRecord
include IidRoutes
include UpdatedAtFilterable
include EachBatch
+ include Spammable
prepend_mod_with('Milestone') # rubocop: disable Cop/InjectEnterpriseEditionModule
@@ -62,6 +63,9 @@ class Milestone < ApplicationRecord
validate :parent_type_check
validate :uniqueness_of_title, if: :title_changed?
+ attr_spammable :title, spam_title: true
+ attr_spammable :description, spam_description: true
+
state_machine :state, initial: :active do
event :close do
transition active: :closed
@@ -255,6 +259,10 @@ class Milestone < ApplicationRecord
end
end
+ def check_for_spam?(*)
+ spammable_attribute_changed? && parent.public?
+ end
+
private
def timebox_format_reference(format = :iid)
diff --git a/app/models/ml/experiment.rb b/app/models/ml/experiment.rb
index d1277efac7b..5c5f8d3b2db 100644
--- a/app/models/ml/experiment.rb
+++ b/app/models/ml/experiment.rb
@@ -11,6 +11,7 @@ module Ml
belongs_to :project
belongs_to :user
+ belongs_to :model, optional: true, inverse_of: :default_experiment
has_many :candidates, class_name: 'Ml::Candidate'
has_many :metadata, class_name: 'Ml::ExperimentMetadata'
@@ -22,10 +23,21 @@ module Ml
has_internal_id :iid, scope: :project
+ before_destroy :stop_destroy
+
def package_name
"#{PACKAGE_PREFIX}#{iid}"
end
+ def stop_destroy
+ return unless model_id
+
+ errors[:base] << "Cannot delete an experiment associated to a model"
+ # According to docs, throw is the correct way to stop on a callback
+ # https://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html#module-ActiveRecord::Callbacks-label-Canceling+callbacks
+ throw :abort # rubocop:disable Cop/BanCatchThrow
+ end
+
class << self
def by_project_id_and_iid(project_id, iid)
find_by(project_id: project_id, iid: iid)
diff --git a/app/models/ml/model.rb b/app/models/ml/model.rb
new file mode 100644
index 00000000000..684b8e1983b
--- /dev/null
+++ b/app/models/ml/model.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module Ml
+ class Model < ApplicationRecord
+ validates :project, :default_experiment, presence: true
+ validates :name,
+ format: Gitlab::Regex.ml_model_name_regex,
+ uniqueness: { scope: :project },
+ presence: true,
+ length: { maximum: 255 }
+
+ validate :valid_default_experiment?
+
+ has_one :default_experiment, class_name: 'Ml::Experiment'
+ belongs_to :project
+ has_many :versions, class_name: 'Ml::ModelVersion'
+
+ def valid_default_experiment?
+ return unless default_experiment
+
+ errors.add(:default_experiment) unless default_experiment.name == name
+ errors.add(:default_experiment) unless default_experiment.project_id == project_id
+ end
+ end
+end
diff --git a/app/models/ml/model_version.rb b/app/models/ml/model_version.rb
new file mode 100644
index 00000000000..540fe6018a1
--- /dev/null
+++ b/app/models/ml/model_version.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+module Ml
+ class ModelVersion < ApplicationRecord
+ validates :project, :model, presence: true
+
+ validates :version,
+ format: Gitlab::Regex.ml_model_version_regex,
+ uniqueness: { scope: [:project, :model_id] },
+ presence: true,
+ length: { maximum: 255 }
+
+ validate :valid_model?, :valid_package?
+
+ belongs_to :model, class_name: 'Ml::Model'
+ belongs_to :project
+ belongs_to :package, class_name: 'Packages::Package', optional: true
+
+ delegate :name, to: :model
+
+ private
+
+ def valid_model?
+ return unless model
+
+ errors.add(:model, 'model project must be the same') unless model.project_id == project_id
+ end
+
+ def valid_package?
+ return unless package
+
+ errors.add(:package, 'package must be ml_model') unless package.ml_model?
+ errors.add(:package, 'package name must be the same') unless package.name == name
+ errors.add(:package, 'package version must be the same') unless package.version == version
+ errors.add(:package, 'package project must be the same') unless package.project_id == project_id
+ end
+ end
+end
diff --git a/app/models/namespace.rb b/app/models/namespace.rb
index 7b3bb04da5b..5449f006a2e 100644
--- a/app/models/namespace.rb
+++ b/app/models/namespace.rb
@@ -57,6 +57,7 @@ class Namespace < ApplicationRecord
# This should _not_ be `inverse_of: :namespace`, because that would also set
# `user.namespace` when this user creates a group with themselves as `owner`.
belongs_to :owner, class_name: 'User'
+ belongs_to :organization, class_name: 'Organizations::Organization'
belongs_to :parent, class_name: "Namespace"
has_many :children, -> { where(type: Group.sti_name) }, class_name: "Namespace", foreign_key: :parent_id
@@ -305,7 +306,7 @@ class Namespace < ApplicationRecord
end
def first_project_with_container_registry_tags
- if ContainerRegistry::GitlabApiClient.supports_gitlab_api?
+ if Gitlab.com_except_jh? && ContainerRegistry::GitlabApiClient.supports_gitlab_api?
ContainerRegistry::GitlabApiClient.one_project_with_container_registry_tag(full_path)
else
all_projects.includes(:container_repositories).find(&:has_container_registry_tags?)
@@ -423,6 +424,10 @@ class Namespace < ApplicationRecord
false
end
+ def all_project_ids
+ all_projects.pluck(:id)
+ end
+
def all_project_ids_except(ids)
all_projects.where.not(id: ids).pluck(:id)
end
@@ -478,7 +483,7 @@ class Namespace < ApplicationRecord
def container_repositories_size
strong_memoize(:container_repositories_size) do
- next unless Gitlab.com?
+ next unless Gitlab.com_except_jh?
next unless root?
next unless ContainerRegistry::GitlabApiClient.supports_gitlab_api?
next 0 if all_container_repositories.empty?
diff --git a/app/models/namespaces/traversal/linear.rb b/app/models/namespaces/traversal/linear.rb
index 9006f104c64..1ca3c8e85f3 100644
--- a/app/models/namespaces/traversal/linear.rb
+++ b/app/models/namespaces/traversal/linear.rb
@@ -96,27 +96,6 @@ module Namespaces
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)
-
- 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)
-
- 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)
-
- traversal_ids.present?
- end
-
def root_ancestor
strong_memoize(:root_ancestor) do
if association(:parent).loaded? && parent.present?
@@ -150,13 +129,13 @@ module Namespaces
end
def self_and_hierarchy
- return super unless use_traversal_ids_for_self_and_hierarchy?
+ return super unless use_traversal_ids?
self_and_descendants.or(ancestors)
end
def ancestors(hierarchy_order: nil)
- return super unless use_traversal_ids_for_ancestors?
+ return super unless use_traversal_ids?
return self.class.none if parent_id.blank?
@@ -164,7 +143,7 @@ module Namespaces
end
def ancestor_ids(hierarchy_order: nil)
- return super unless use_traversal_ids_for_ancestors?
+ return super unless use_traversal_ids?
hierarchy_order == :desc ? traversal_ids[0..-2] : traversal_ids[0..-2].reverse
end
@@ -176,7 +155,7 @@ module Namespaces
# This copies the behavior of the recursive method. We will deprecate
# this behavior soon.
def ancestors_upto(top = nil, hierarchy_order: nil)
- return super unless use_traversal_ids_for_ancestors_upto?
+ return super unless use_traversal_ids?
# We can't use a default value in the method definition above because
# we need to preserve those specific parameters for super.
@@ -198,7 +177,7 @@ module Namespaces
end
def self_and_ancestors(hierarchy_order: nil)
- return super unless use_traversal_ids_for_ancestors?
+ return super unless use_traversal_ids?
return self.class.where(id: id) if parent_id.blank?
@@ -206,7 +185,7 @@ module Namespaces
end
def self_and_ancestor_ids(hierarchy_order: nil)
- return super unless use_traversal_ids_for_ancestors?
+ return super unless use_traversal_ids?
hierarchy_order == :desc ? traversal_ids : traversal_ids.reverse
end
diff --git a/app/models/namespaces/traversal/linear_scopes.rb b/app/models/namespaces/traversal/linear_scopes.rb
index c50d3dd1de6..6e79e3ac9a1 100644
--- a/app/models/namespaces/traversal/linear_scopes.rb
+++ b/app/models/namespaces/traversal/linear_scopes.rb
@@ -18,7 +18,7 @@ module Namespaces
end
def roots
- return super unless use_traversal_ids_roots?
+ return super unless use_traversal_ids?
root_ids = all.select("#{quoted_table_name}.traversal_ids[1]").distinct
unscoped.where(id: root_ids)
@@ -37,13 +37,13 @@ module Namespaces
end
def self_and_descendants(include_self: true)
- return super unless use_traversal_ids_for_descendants_scopes?
+ return super unless use_traversal_ids?
self_and_descendants_with_comparison_operators(include_self: include_self)
end
def self_and_descendant_ids(include_self: true)
- return super unless use_traversal_ids_for_descendants_scopes?
+ return super unless use_traversal_ids?
self_and_descendants(include_self: include_self).as_ids
end
@@ -78,16 +78,6 @@ module Namespaces
Feature.enabled?(:use_traversal_ids)
end
- def use_traversal_ids_roots?
- Feature.enabled?(:use_traversal_ids_roots) &&
- use_traversal_ids?
- end
-
- def use_traversal_ids_for_descendants_scopes?
- 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) &&
use_traversal_ids?
diff --git a/app/models/note.rb b/app/models/note.rb
index 09ff7ad3979..2df643c46aa 100644
--- a/app/models/note.rb
+++ b/app/models/note.rb
@@ -26,7 +26,7 @@ class Note < ApplicationRecord
include IgnorableColumns
include Spammable
- ignore_column :id_convert_to_bigint, remove_with: '16.0', remove_after: '2023-05-22'
+ ignore_column :id_convert_to_bigint, remove_with: '16.3', remove_after: '2023-08-22'
ISSUE_TASK_SYSTEM_NOTE_PATTERN = /\A.*marked\sthe\stask.+as\s(completed|incomplete).*\z/.freeze
@@ -756,7 +756,7 @@ class Note < ApplicationRecord
Ability.users_that_can_read_internal_notes(users, resource_parent).pluck(:id)
end
- # Method necesary while we transition into the new format for task system notes
+ # Method necessary while we transition into the new format for task system notes
# TODO: https://gitlab.com/gitlab-org/gitlab/-/issues/369923
def note
return super unless system? && for_issue? && super&.match?(ISSUE_TASK_SYSTEM_NOTE_PATTERN)
@@ -792,6 +792,14 @@ class Note < ApplicationRecord
true
end
+ # Use attributes.keys instead of attribute_names to filter out the fields that are skipped during export:
+ #
+ # - note_html
+ # - cached_markdown_version
+ def attribute_names_for_serialization
+ attributes.keys
+ end
+
private
def trigger_note_subscription?
diff --git a/app/models/organizations/organization.rb b/app/models/organizations/organization.rb
index ce89f57a73b..8aeca2eb137 100644
--- a/app/models/organizations/organization.rb
+++ b/app/models/organizations/organization.rb
@@ -8,6 +8,14 @@ module Organizations
before_destroy :check_if_default_organization
+ has_many :namespaces
+ has_many :groups
+
+ has_one :settings, class_name: "OrganizationSetting"
+
+ has_many :organization_users, inverse_of: :organization
+ has_many :users, through: :organization_users, inverse_of: :organizations
+
validates :name,
presence: true,
length: { maximum: 255 }
diff --git a/app/models/organizations/organization_setting.rb b/app/models/organizations/organization_setting.rb
new file mode 100644
index 00000000000..108531e6701
--- /dev/null
+++ b/app/models/organizations/organization_setting.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+module Organizations
+ class OrganizationSetting < ApplicationRecord
+ belongs_to :organization
+
+ validates :settings, json_schema: { filename: "organization_settings" }
+
+ jsonb_accessor :settings,
+ restricted_visibility_levels: [:integer, { array: true }]
+
+ validates_each :restricted_visibility_levels do |record, attr, value|
+ value&.each do |level|
+ unless Gitlab::VisibilityLevel.options.value?(level)
+ record.errors.add(attr, format(_("'%{level}' is not a valid visibility level"), level: level))
+ end
+ end
+ end
+ end
+end
diff --git a/app/models/organizations/organization_user.rb b/app/models/organizations/organization_user.rb
new file mode 100644
index 00000000000..5aa1133b017
--- /dev/null
+++ b/app/models/organizations/organization_user.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+module Organizations
+ class OrganizationUser < ApplicationRecord
+ belongs_to :organization, inverse_of: :organization_users, optional: false
+ belongs_to :user, inverse_of: :organization_users, optional: false
+ end
+end
diff --git a/app/models/packages/npm/metadatum.rb b/app/models/packages/npm/metadatum.rb
index ccbf056ec7b..2fc1c05cd48 100644
--- a/app/models/packages/npm/metadatum.rb
+++ b/app/models/packages/npm/metadatum.rb
@@ -26,6 +26,11 @@ class Packages::Npm::Metadatum < ApplicationRecord
def ensure_package_json_size
return if package_json.to_s.size < MAX_PACKAGE_JSON_SIZE
- errors.add(:package_json, _('structure is too large'))
+ errors.add(:package_json, :too_large,
+ message: format(
+ _('structure is too large. Maximum size is %{max_size} characters'),
+ max_size: MAX_PACKAGE_JSON_SIZE
+ )
+ )
end
end
diff --git a/app/models/packages/package.rb b/app/models/packages/package.rb
index 58305b45457..b618c7c20c4 100644
--- a/app/models/packages/package.rb
+++ b/app/models/packages/package.rb
@@ -83,7 +83,7 @@ class Packages::Package < ApplicationRecord
validates :name, format: { with: Gitlab::Regex.conan_recipe_component_regex }, if: :conan?
validates :name, format: { with: Gitlab::Regex.generic_package_name_regex }, if: :generic?
validates :name, format: { with: Gitlab::Regex.helm_package_regex }, if: :helm?
- validates :name, format: { with: Gitlab::Regex.npm_package_name_regex }, if: :npm?
+ validates :name, format: { with: Gitlab::Regex.npm_package_name_regex, message: Gitlab::Regex.npm_package_name_regex_message }, if: :npm?
validates :name, format: { with: Gitlab::Regex.nuget_package_name_regex }, if: :nuget?
validates :name, format: { with: Gitlab::Regex.terraform_module_package_name_regex }, if: :terraform_module?
validates :name, format: { with: Gitlab::Regex.debian_package_name_regex }, if: :debian_package?
@@ -94,7 +94,8 @@ class Packages::Package < ApplicationRecord
validates :version, format: { with: Gitlab::Regex.pypi_version_regex }, if: :pypi?
validates :version, format: { with: Gitlab::Regex.prefixed_semver_regex }, if: :golang?
validates :version, format: { with: Gitlab::Regex.helm_version_regex }, if: :helm?
- validates :version, format: { with: Gitlab::Regex.semver_regex }, if: -> { composer_tag_version? || npm? || terraform_module? }
+ validates :version, format: { with: Gitlab::Regex.semver_regex, message: Gitlab::Regex.semver_regex_message },
+ if: -> { composer_tag_version? || npm? || terraform_module? }
validates :version,
presence: true,
@@ -166,16 +167,16 @@ class Packages::Package < ApplicationRecord
scope :preload_files, -> { preload(:installable_package_files) }
scope :preload_nuget_files, -> { preload(:installable_nuget_package_files) }
scope :preload_pipelines, -> { preload(pipelines: :user) }
- scope :last_of_each_version, -> { where(id: all.last_of_each_version_ids) }
- scope :last_of_each_version_ids, -> { select('MAX(id) AS id').unscope(where: :id).group(:version) }
scope :limit_recent, ->(limit) { order_created_desc.limit(limit) }
scope :select_distinct_name, -> { select(:name).distinct }
+ scope :select_only_first_by_name, -> { select('DISTINCT ON (name) *') }
# Sorting
scope :order_created, -> { reorder(created_at: :asc) }
scope :order_created_desc, -> { reorder(created_at: :desc) }
scope :order_name, -> { reorder(name: :asc) }
scope :order_name_desc, -> { reorder(name: :desc) }
+ scope :order_name_desc_version_desc, -> { reorder(name: :desc, version: :desc) }
scope :order_version, -> { reorder(version: :asc) }
scope :order_version_desc, -> { reorder(version: :desc) }
scope :order_type, -> { reorder(package_type: :asc) }
diff --git a/app/models/pages/lookup_path.rb b/app/models/pages/lookup_path.rb
index 864ea04c019..2ffb2e84cbf 100644
--- a/app/models/pages/lookup_path.rb
+++ b/app/models/pages/lookup_path.rb
@@ -46,7 +46,7 @@ module Pages
strong_memoize_attr :source
def prefix
- if project.pages_namespace_url == project.pages_url
+ if url_builder.namespace_pages?
'/'
else
"#{project.full_path.delete_prefix(trim_prefix)}/"
@@ -55,9 +55,7 @@ module Pages
strong_memoize_attr :prefix
def unique_host
- return unless project.project_setting.pages_unique_domain_enabled?
-
- project.pages_unique_host
+ url_builder.unique_host
end
strong_memoize_attr :unique_host
@@ -76,5 +74,10 @@ module Pages
project.pages_metadatum.pages_deployment
end
strong_memoize_attr :deployment
+
+ def url_builder
+ Gitlab::Pages::UrlBuilder.new(project)
+ end
+ strong_memoize_attr :url_builder
end
end
diff --git a/app/models/personal_access_token.rb b/app/models/personal_access_token.rb
index 2749404b7b5..08f725de980 100644
--- a/app/models/personal_access_token.rb
+++ b/app/models/personal_access_token.rb
@@ -20,6 +20,7 @@ class PersonalAccessToken < ApplicationRecord
serialize :scopes, Array # rubocop:disable Cop/ActiveRecordSerialize
belongs_to :user
+ belongs_to :previous_personal_access_token, class_name: 'PersonalAccessToken'
after_initialize :set_default_scopes, if: :persisted?
before_save :ensure_token
@@ -99,9 +100,13 @@ class PersonalAccessToken < ApplicationRecord
def expires_at_before_instance_max_expiry_date
return unless expires_at
- if expires_at > MAX_PERSONAL_ACCESS_TOKEN_LIFETIME_IN_DAYS.days.from_now
- errors.add(:expires_at, _('must expire in 365 days'))
- end
+ max_expiry_date = Date.current.advance(days: MAX_PERSONAL_ACCESS_TOKEN_LIFETIME_IN_DAYS)
+ return unless expires_at > max_expiry_date
+
+ errors.add(
+ :expires_at,
+ format(_("must be before %{expiry_date}"), expiry_date: max_expiry_date)
+ )
end
end
diff --git a/app/models/plan_limits.rb b/app/models/plan_limits.rb
index 6795e7a3049..245c0719439 100644
--- a/app/models/plan_limits.rb
+++ b/app/models/plan_limits.rb
@@ -2,6 +2,9 @@
class PlanLimits < ApplicationRecord
include IgnorableColumns
+ ALLOWED_LIMITS_HISTORY_ATTRIBUTES = %i[notification_limit enforcement_limit storage_size_limit
+ dashboard_limit_enabled_at].freeze
+
ignore_column :ci_max_artifact_size_running_container_scanning, remove_with: '14.3', remove_after: '2021-08-22'
ignore_column :web_hook_calls_high, remove_with: '15.10', remove_after: '2022-02-22'
ignore_column :ci_active_pipelines, remove_with: '16.3', remove_after: '2022-07-22'
@@ -50,32 +53,23 @@ class PlanLimits < ApplicationRecord
false
end
- def log_limits_changes(user, new_limits)
- new_limits.each do |attribute, value|
+ def format_limits_history(user, new_limits)
+ allowed_limits = new_limits.slice(*ALLOWED_LIMITS_HISTORY_ATTRIBUTES)
+ return {} if allowed_limits.empty?
+
+ allowed_limits.each do |attribute, value|
+ next if value == self[attribute]
+
limits_history[attribute] ||= []
limits_history[attribute] << {
- user_id: user&.id,
- username: user&.username,
- timestamp: Time.current.utc.to_i,
- value: value
+ "user_id" => user.id,
+ "username" => user.username,
+ "timestamp" => Time.current.utc.to_i,
+ "value" => value
}
end
- update(limits_history: limits_history)
- end
-
- def limit_attribute_changes(attribute)
- limit_history = limits_history[attribute]
- return [] unless limit_history
-
- limit_history.map do |entry|
- {
- timestamp: entry[:timestamp],
- value: entry[:value],
- username: entry[:username],
- user_id: entry[:user_id]
- }
- end
+ limits_history
end
end
diff --git a/app/models/project.rb b/app/models/project.rb
index 452a5c8973c..931f4db3a54 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -415,7 +415,7 @@ class Project < ApplicationRecord
has_one :ci_cd_settings, class_name: 'ProjectCiCdSetting', inverse_of: :project, autosave: true, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
has_many :remote_mirrors, inverse_of: :project
- has_many :external_pull_requests, inverse_of: :project
+ has_many :external_pull_requests, inverse_of: :project, class_name: 'Ci::ExternalPullRequest'
has_many :sourced_pipelines, class_name: 'Ci::Sources::Pipeline', foreign_key: :source_project_id
has_many :source_pipelines, class_name: 'Ci::Sources::Pipeline', foreign_key: :project_id
@@ -692,6 +692,10 @@ class Project < ApplicationRecord
scope :with_integration, -> (integration_class) { joins(:integrations).merge(integration_class.all) }
scope :with_active_integration, -> (integration_class) { with_integration(integration_class).merge(integration_class.active) }
scope :with_shared_runners_enabled, -> { where(shared_runners_enabled: true) }
+ # .with_slack_integration can generate poorly performing queries. It is intended only for UsagePing.
+ scope :with_slack_integration, -> { joins(:slack_integration) }
+ # .with_slack_slash_commands_integration can generate poorly performing queries. It is intended only for UsagePing.
+ scope :with_slack_slash_commands_integration, -> { joins(:slack_slash_commands_integration) }
scope :inside_path, ->(path) do
# We need routes alias rs for JOIN so it does not conflict with
# includes(:route) which we use in ProjectsFinder.
@@ -775,6 +779,7 @@ class Project < ApplicationRecord
scope :pending_data_repair_analysis, -> do
left_outer_joins(:container_registry_data_repair_detail)
.where(container_registry_data_repair_details: { project_id: nil })
+ .order(id: :desc)
end
enum auto_cancel_pending_pipelines: { disabled: 0, enabled: 1 }
@@ -904,6 +909,16 @@ class Project < ApplicationRecord
scope :for_group_and_its_ancestor_groups, ->(group) { where(namespace_id: group.self_and_ancestors.select(:id)) }
scope :is_importing, -> { with_import_state.where(import_state: { status: %w[started scheduled] }) }
+ scope :without_created_and_owned_by_banned_user, -> do
+ where_not_exists(
+ Users::BannedUser.joins(
+ 'INNER JOIN project_authorizations ON project_authorizations.user_id = banned_users.user_id'
+ ).where('projects.creator_id = banned_users.user_id')
+ .where('project_authorizations.project_id = projects.id')
+ .where(project_authorizations: { access_level: Gitlab::Access::OWNER })
+ )
+ end
+
class << self
# Searches for a list of projects based on the query given in `query`.
#
@@ -1840,10 +1855,12 @@ class Project < ApplicationRecord
triggered.add_hooks(hooks)
end
- def execute_integrations(data, hooks_scope = :push_hooks)
+ def execute_integrations(data, hooks_scope = :push_hooks, skip_ci: false)
# Call only service hooks that are active for this scope
run_after_commit_or_now do
association("#{hooks_scope}_integrations").reader.each do |integration|
+ next if skip_ci && integration.ci?
+
integration.async_execute(data)
end
end
@@ -2201,42 +2218,6 @@ class Project < ApplicationRecord
pages_metadatum&.deployed?
end
- def pages_url(with_unique_domain: false)
- return pages_unique_url if with_unique_domain && pages_unique_domain_enabled?
-
- url = pages_namespace_url
- url_path = full_path.partition('/').last
- namespace_url = "#{Settings.pages.protocol}://#{url_path}".downcase
-
- if Rails.env.development?
- url_without_port = URI.parse(url)
- url_without_port.port = nil
-
- return url if url_without_port.to_s == namespace_url
- end
-
- # If the project path is the same as host, we serve it as group page
- return url if url == namespace_url
-
- "#{url}/#{url_path}"
- end
-
- def pages_unique_url
- pages_url_for(project_setting.pages_unique_domain)
- end
-
- def pages_unique_host
- URI(pages_unique_url).host
- end
-
- def pages_namespace_url
- pages_url_for(pages_subdomain)
- end
-
- def pages_subdomain
- full_path.partition('/').first
- end
-
def pages_path
# TODO: when we migrate Pages to work with new storage types, change here to use disk_path
File.join(Settings.pages.path, full_path)
@@ -2483,7 +2464,7 @@ class Project < ApplicationRecord
break unless pages_enabled?
variables.append(key: 'CI_PAGES_DOMAIN', value: Gitlab.config.pages.host)
- variables.append(key: 'CI_PAGES_URL', value: pages_url)
+ variables.append(key: 'CI_PAGES_URL', value: Gitlab::Pages::UrlBuilder.new(self).pages_url)
end
end
@@ -3167,6 +3148,10 @@ class Project < ApplicationRecord
pending_delete? || hidden?
end
+ def created_and_owned_by_banned_user?
+ creator.banned? && team.max_member_access(creator.id) == Gitlab::Access::OWNER
+ end
+
def content_editor_on_issues_feature_flag_enabled?
group&.content_editor_on_issues_feature_flag_enabled? || Feature.enabled?(:content_editor_on_issues, self)
end
@@ -3236,25 +3221,8 @@ class Project < ApplicationRecord
group.crm_enabled?
end
- def frozen_outbound_job_token_scopes?
- Feature.enabled?(:frozen_outbound_job_token_scopes, self) && Feature.disabled?(:frozen_outbound_job_token_scopes_override, self)
- end
- strong_memoize_attr :frozen_outbound_job_token_scopes?
-
private
- def pages_unique_domain_enabled?
- Feature.enabled?(:pages_unique_domain, self) &&
- project_setting.pages_unique_domain_enabled?
- end
-
- def pages_url_for(domain)
- # The host in URL always needs to be downcased
- Gitlab.config.pages.url.sub(%r{^https?://}) do |prefix|
- "#{prefix}#{domain}."
- end.downcase
- end
-
# overridden in EE
def project_group_links_with_preload
project_group_links
diff --git a/app/models/project_ci_cd_setting.rb b/app/models/project_ci_cd_setting.rb
index aa65f27870d..cc9003423be 100644
--- a/app/models/project_ci_cd_setting.rb
+++ b/app/models/project_ci_cd_setting.rb
@@ -2,7 +2,6 @@
class ProjectCiCdSetting < ApplicationRecord
include ChronicDurationAttribute
- include IgnorableColumns
belongs_to :project, inverse_of: :ci_cd_settings
@@ -23,8 +22,6 @@ class ProjectCiCdSetting < ApplicationRecord
chronic_duration_attr :runner_token_expiration_interval_human_readable, :runner_token_expiration_interval
- ignore_column :opt_in_jwt, remove_with: '16.2', remove_after: '2023-07-01'
-
def keep_latest_artifacts_available?
# The project level feature can only be enabled when the feature is enabled instance wide
Gitlab::CurrentSettings.current_application_settings.keep_latest_artifact? && keep_latest_artifact?
diff --git a/app/models/project_statistics.rb b/app/models/project_statistics.rb
index 14f6a90e5ed..365bb5237c3 100644
--- a/app/models/project_statistics.rb
+++ b/app/models/project_statistics.rb
@@ -34,7 +34,6 @@ class ProjectStatistics < ApplicationRecord
:build_artifacts_size,
:packages_size,
:snippets_size,
- :pipeline_artifacts_size,
:uploads_size
].freeze
diff --git a/app/models/projects/topic.rb b/app/models/projects/topic.rb
index ed1795b43e0..347d65841ed 100644
--- a/app/models/projects/topic.rb
+++ b/app/models/projects/topic.rb
@@ -71,7 +71,7 @@ module Projects
# /\R/ - A linebreak: \n, \v, \f, \r \u0085 (NEXT LINE),
# \u2028 (LINE SEPARATOR), \u2029 (PARAGRAPH SEPARATOR) or \r\n.
- return unless name =~ /\R/
+ return unless /\R/.match?(name)
errors.add(:name, 'has characters that are not allowed')
end
diff --git a/app/models/projects/triggered_hooks.rb b/app/models/projects/triggered_hooks.rb
index e3aa3d106b7..1f51ced5b57 100644
--- a/app/models/projects/triggered_hooks.rb
+++ b/app/models/projects/triggered_hooks.rb
@@ -17,6 +17,8 @@ module Projects
# Assumes that the relations implement TriggerableHooks
@relations.each do |hooks|
hooks.hooks_for(@scope).select_active(@scope, @data).each do |hook|
+ next if @scope == :emoji_hooks && Feature.disabled?(:emoji_webhooks, hook.parent)
+
hook.async_execute(@data, @scope.to_s)
end
end
diff --git a/app/models/protected_branch/push_access_level.rb b/app/models/protected_branch/push_access_level.rb
index c86ca5723fa..53cec0c5511 100644
--- a/app/models/protected_branch/push_access_level.rb
+++ b/app/models/protected_branch/push_access_level.rb
@@ -3,49 +3,7 @@
class ProtectedBranch::PushAccessLevel < ApplicationRecord
include Importable
include ProtectedBranchAccess
+ include ProtectedRefDeployKeyAccess
# default value for the access_level column
GITLAB_DEFAULT_ACCESS_LEVEL = Gitlab::Access::MAINTAINER
-
- belongs_to :deploy_key
-
- validates :access_level, uniqueness: { scope: :protected_branch_id, if: :role?,
- conditions: -> { where(user_id: nil, group_id: nil, deploy_key_id: nil) } }
- validates :deploy_key_id, uniqueness: { scope: :protected_branch_id, allow_nil: true }
- validate :validate_deploy_key_membership
-
- def type
- if self.deploy_key.present?
- :deploy_key
- else
- super
- end
- end
-
- def humanize
- return "Deploy key" if deploy_key.present?
-
- super
- end
-
- def check_access(user)
- if user && deploy_key.present?
- return user.can?(:read_project, project) && enabled_deploy_key_for_user?(deploy_key, user)
- end
-
- super
- end
-
- private
-
- def validate_deploy_key_membership
- return unless deploy_key
-
- unless project.deploy_keys_projects.where(deploy_key: deploy_key).exists?
- self.errors.add(:deploy_key, 'is not enabled for this project')
- end
- end
-
- def enabled_deploy_key_for_user?(deploy_key, user)
- deploy_key.user_id == user.id && DeployKey.with_write_access_for_project(protected_branch.project, deploy_key: deploy_key).any?
- end
end
diff --git a/app/models/protected_tag/create_access_level.rb b/app/models/protected_tag/create_access_level.rb
index 5837f3a5afb..0eff9924153 100644
--- a/app/models/protected_tag/create_access_level.rb
+++ b/app/models/protected_tag/create_access_level.rb
@@ -3,48 +3,5 @@
class ProtectedTag::CreateAccessLevel < ApplicationRecord
include Importable
include ProtectedTagAccess
-
- belongs_to :deploy_key
-
- validates :access_level, uniqueness: { scope: :protected_tag_id, if: :role?,
- conditions: -> { where(user_id: nil, group_id: nil, deploy_key_id: nil) } }
- validates :deploy_key_id, uniqueness: { scope: :protected_tag_id, allow_nil: true }
- validate :validate_deploy_key_membership
-
- def type
- return :deploy_key if deploy_key.present?
-
- super
- end
-
- def humanize
- return "Deploy key" if deploy_key.present?
-
- super
- end
-
- def check_access(current_user)
- super do
- break enabled_deploy_key_for_user?(current_user) if deploy_key?
- end
- end
-
- private
-
- def deploy_key?
- type == :deploy_key
- end
-
- def validate_deploy_key_membership
- return unless deploy_key
- return if project.deploy_keys_projects.where(deploy_key: deploy_key).exists?
-
- errors.add(:deploy_key, 'is not enabled for this project')
- end
-
- def enabled_deploy_key_for_user?(current_user)
- current_user.can?(:read_project, project) &&
- deploy_key.user_id == current_user.id &&
- DeployKey.with_write_access_for_project(protected_tag.project, deploy_key: deploy_key).any?
- end
+ include ProtectedRefDeployKeyAccess
end
diff --git a/app/models/release.rb b/app/models/release.rb
index 7f74872cf67..f0ba56390ab 100644
--- a/app/models/release.rb
+++ b/app/models/release.rb
@@ -64,10 +64,10 @@ class Release < ApplicationRecord
end
# This query uses LATERAL JOIN to find the latest release for each project. To avoid
- # joining the `releases` table, we build an in-memory table using the project ids.
+ # joining the `projects` table, we build an in-memory table using the project ids.
# Example:
# SELECT ...
- # FROM (VALUES (PROJECT_ID_1),(PROJECT_ID_2)) project_ids (id)
+ # FROM (VALUES (PROJECT_ID_1),(PROJECT_ID_2)) projects (id)
# INNER JOIN LATERAL (...)
def latest_for_projects(projects, order_by: 'released_at')
return Release.none if projects.empty?
diff --git a/app/models/remote_mirror.rb b/app/models/remote_mirror.rb
index 8b2f3bdcedf..934053cb92d 100644
--- a/app/models/remote_mirror.rb
+++ b/app/models/remote_mirror.rb
@@ -137,6 +137,7 @@ class RemoteMirror < ApplicationRecord
return false unless project.remote_mirror_available?
return false unless project.repository_exists?
return false if project.pending_delete?
+ return false if Gitlab::SilentMode.enabled?
true
end
diff --git a/app/models/repository.rb b/app/models/repository.rb
index b21df6baf0e..1321c9da780 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -838,7 +838,7 @@ class Repository
files = ls_files(options[:branch_name])
options[:actions] = files.each_with_object([]) do |item, list|
- next unless item =~ regex
+ next unless regex.match?(item)
list.push(
action: :move,
diff --git a/app/models/service_desk_setting.rb b/app/models/service_desk_setting.rb
index 4216ad7e70f..6560b25b39c 100644
--- a/app/models/service_desk_setting.rb
+++ b/app/models/service_desk_setting.rb
@@ -21,6 +21,7 @@ class ServiceDeskSetting < ApplicationRecord
validates :project_id, presence: true
validate :valid_issue_template
validate :valid_project_key
+ validate :custom_email_enabled_state
validates :outgoing_name, length: { maximum: 255 }, allow_blank: true
validates :project_key,
length: { maximum: 255 },
@@ -86,6 +87,14 @@ class ServiceDeskSetting < ApplicationRecord
end
end
+ def custom_email_enabled_state
+ return unless custom_email_enabled?
+
+ if custom_email_verification.blank? || !custom_email_verification.finished?
+ errors.add(:custom_email_enabled, 'cannot be enabled until verification process has finished.')
+ end
+ end
+
private
def source_template_project
diff --git a/app/models/system_access.rb b/app/models/system_access.rb
new file mode 100644
index 00000000000..9ffc63c5ca8
--- /dev/null
+++ b/app/models/system_access.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+module SystemAccess
+ def self.table_name_prefix
+ 'system_access_'
+ end
+end
diff --git a/app/models/todo.rb b/app/models/todo.rb
index 724f97c4812..f202e1a266d 100644
--- a/app/models/todo.rb
+++ b/app/models/todo.rb
@@ -117,7 +117,18 @@ class Todo < ApplicationRecord
# target - The value of the `target_type` column, such as `Issue`.
# state - The value of the `state` column, such as `pending` or `done`.
def any_for_target?(target, state = nil)
- state.nil? ? exists?(target: target) : exists?(target: target, state: state)
+ conditions = {}
+
+ if target.respond_to?(:todoable_target_type_name)
+ conditions[:target_type] = target.todoable_target_type_name
+ conditions[:target_id] = target.id
+ else
+ conditions[:target] = target
+ end
+
+ conditions[:state] = state unless state.nil?
+
+ exists?(conditions)
end
# Updates attributes of a relation of todos to the new state.
diff --git a/app/models/user.rb b/app/models/user.rb
index 96cdbb192bc..4a57cc2e2e2 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -60,7 +60,7 @@ class User < ApplicationRecord
INCOMING_MAIL_TOKEN_PREFIX = 'glimt-'
FEED_TOKEN_PREFIX = 'glft-'
- columns_changing_default :notified_of_own_activity
+ columns_changing_default :project_view
# lib/tasks/tokens.rake needs to be updated when changing mail and feed tokens
add_authentication_token_field :incoming_email_token, token_generator: -> { self.generate_incoming_mail_token }
@@ -170,8 +170,11 @@ class User < ApplicationRecord
has_many :following_users, foreign_key: :followee_id, class_name: 'Users::UserFollowUser'
has_many :followers, through: :following_users
- # Groups
+ # Namespaces
has_many :members
+ has_many :member_namespaces, through: :members
+
+ # Groups
has_many :group_members, -> { where(requested_at: nil).where("access_level >= ?", Gitlab::Access::GUEST) }, class_name: 'GroupMember'
has_many :groups, through: :group_members
has_many :groups_with_active_memberships, -> { where(members: { state: ::Member::STATE_ACTIVE }) }, through: :group_members, source: :group
@@ -256,6 +259,9 @@ class User < ApplicationRecord
has_many :term_agreements
belongs_to :accepted_term, class_name: 'ApplicationSetting::Term'
+ has_many :organization_users, class_name: 'Organizations::OrganizationUser', inverse_of: :user
+ has_many :organizations, through: :organization_users, class_name: 'Organizations::Organization', inverse_of: :users
+
has_many :metrics_users_starred_dashboards, class_name: 'Metrics::UsersStarredDashboard', inverse_of: :user
has_one :status, class_name: 'UserStatus'
@@ -1541,7 +1547,7 @@ class User < ApplicationRecord
end
def full_website_url
- return "http://#{website_url}" if website_url !~ %r{\Ahttps?://}
+ return "http://#{website_url}" unless %r{\Ahttps?://}.match?(website_url)
website_url
end
@@ -1827,8 +1833,12 @@ class User < ApplicationRecord
Project.where(id: events).not_aimed_for_deletion
end
+ # Returns true if the user can be removed, false otherwise.
+ # A user can be removed if they do not own any groups where they are the sole owner
+ # Method `none?` is used to ensure faster retrieval, See https://gitlab.com/gitlab-org/gitlab/-/issues/417105
+
def can_be_removed?
- !solo_owned_groups.present?
+ solo_owned_groups.none?
end
def can_remove_self?
@@ -2063,9 +2073,17 @@ class User < ApplicationRecord
# override, from Devise
def lock_access!(opts = {})
Gitlab::AppLogger.info("Account Locked: username=#{username}")
+ audit_lock_access(reason: opts.delete(:reason))
super
end
+ # override, from Devise
+ def unlock_access!(unlocked_by: self)
+ audit_unlock_access(author: unlocked_by)
+
+ super()
+ end
+
# Determine the maximum access level for a group of projects in bulk.
#
# Returns a Hash mapping project ID -> maximum access level.
@@ -2103,7 +2121,7 @@ class User < ApplicationRecord
end
def terms_accepted?
- return true if project_bot?
+ return true if project_bot? || service_account? || security_policy_bot?
accepted_term_id.present?
end
@@ -2279,30 +2297,6 @@ class User < ApplicationRecord
namespace_commit_emails.find_by(namespace: project.root_namespace)
end
- def spammer?
- spam_score > Abuse::TrustScore::SPAMCHECK_HAM_THRESHOLD
- end
-
- def spam_score
- abuse_trust_scores.spamcheck.average(:score) || 0.0
- end
-
- def telesign_score
- abuse_trust_scores.telesign.order(created_at: :desc).first&.score || 0.0
- end
-
- def arkose_global_score
- abuse_trust_scores.arkose_global_score.order(created_at: :desc).first&.score || 0.0
- end
-
- def arkose_custom_score
- abuse_trust_scores.arkose_custom_score.order(created_at: :desc).first&.score || 0.0
- end
-
- def trust_scores_for_source(source)
- abuse_trust_scores.where(source: source)
- end
-
def abuse_metadata
{
account_age: account_age_in_days,
@@ -2310,6 +2304,10 @@ class User < ApplicationRecord
}
end
+ def allow_possible_spam?
+ custom_attributes.by_key(UserCustomAttribute::ALLOW_POSSIBLE_SPAM).exists?
+ end
+
def namespace_commit_email_for_namespace(namespace)
return if namespace.nil?
@@ -2330,7 +2328,7 @@ class User < ApplicationRecord
return super if ::Gitlab::CurrentSettings.email_confirmation_setting_soft?
# Following devise logic for method, we want to return `true`
- # See: https://github.com/heartcombo/devise/blob/main/lib/devise/models/confirmable.rb#L191-L218
+ # See: https://github.com/heartcombo/devise/blob/ec0674523e7909579a5a008f16fb9fe0c3a71712/lib/devise/models/confirmable.rb#L191-L218
true
end
alias_method :in_confirmation_period?, :confirmation_period_valid?
@@ -2355,7 +2353,8 @@ class User < ApplicationRecord
private
def block_or_ban
- if spammer? && account_age_in_days < 7
+ user_scores = Abuse::UserTrustScore.new(self)
+ if user_scores.spammer? && account_age_in_days < 7
ban_and_report
else
block
@@ -2608,6 +2607,12 @@ class User < ApplicationRecord
def prefix_for_feed_token
FEED_TOKEN_PREFIX
end
+
+ # method overriden in EE
+ def audit_lock_access(reason: nil); end
+
+ # method overriden in EE
+ def audit_unlock_access(author: self); end
end
User.prepend_mod_with('User')
diff --git a/app/models/user_custom_attribute.rb b/app/models/user_custom_attribute.rb
index 63a5ee9770f..425f2cc062b 100644
--- a/app/models/user_custom_attribute.rb
+++ b/app/models/user_custom_attribute.rb
@@ -15,6 +15,8 @@ class UserCustomAttribute < ApplicationRecord
UNBLOCKED_BY = 'unblocked_by'
ARKOSE_RISK_BAND = 'arkose_risk_band'
AUTO_BANNED_BY_ABUSE_REPORT_ID = 'auto_banned_by_abuse_report_id'
+ ALLOW_POSSIBLE_SPAM = 'allow_possible_spam'
+ IDENTITY_VERIFICATION_PHONE_EXEMPT = 'identity_verification_phone_exempt'
class << self
def upsert_custom_attributes(custom_attributes)
diff --git a/app/models/user_preference.rb b/app/models/user_preference.rb
index 4d517408154..c263d552d40 100644
--- a/app/models/user_preference.rb
+++ b/app/models/user_preference.rb
@@ -2,15 +2,12 @@
class UserPreference < ApplicationRecord
include IgnorableColumns
- include SafelyChangeColumnDefault
# We could use enums, but Rails 4 doesn't support multiple
# enum options with same name for multiple fields, also it creates
# extra methods that aren't really needed here.
NOTES_FILTERS = { all_notes: 0, only_comments: 1, only_activity: 2 }.freeze
- columns_changing_default :tab_width, :time_display_relative, :render_whitespace_in_code
-
belongs_to :user
scope :with_user, -> { joins(:user) }
@@ -31,7 +28,6 @@ class UserPreference < ApplicationRecord
validates :pinned_nav_items, json_schema: { filename: 'pinned_nav_items' }
ignore_columns :experience_level, remove_with: '14.10', remove_after: '2021-03-22'
- ignore_columns :time_format_in_24h, remove_with: '16.2', remove_after: '2023-07-22'
# 2023-06-22 is after 16.1 release and during 16.2 release https://docs.gitlab.com/ee/development/database/avoiding_downtime_in_migrations.html#ignoring-the-column-release-m
ignore_columns :use_legacy_web_ide, remove_with: '16.2', remove_after: '2023-06-22'
diff --git a/app/models/users/callout.rb b/app/models/users/callout.rb
index 38e518b6d3e..0d02a3b99aa 100644
--- a/app/models/users/callout.rb
+++ b/app/models/users/callout.rb
@@ -55,10 +55,10 @@ module Users
submit_license_usage_data_banner: 52, # EE-only
personal_project_limitations_banner: 53, # EE-only
mr_experience_survey: 54,
- namespace_storage_limit_banner_info_threshold: 55, # EE-only
- namespace_storage_limit_banner_warning_threshold: 56, # EE-only
- namespace_storage_limit_banner_alert_threshold: 57, # EE-only
- namespace_storage_limit_banner_error_threshold: 58, # EE-only
+ # 55 removed in https://gitlab.com/gitlab-org/gitlab/-/merge_requests/121920
+ namespace_storage_limit_alert_warning_threshold: 56, # EE-only
+ namespace_storage_limit_alert_alert_threshold: 57, # EE-only
+ namespace_storage_limit_alert_error_threshold: 58, # EE-only
project_quality_summary_feedback: 59, # EE-only
merge_request_settings_moved_callout: 60,
new_top_level_group_alert: 61,
@@ -66,13 +66,14 @@ module Users
# 63 and 64 were removed with https://gitlab.com/gitlab-org/gitlab/-/merge_requests/120233
branch_rules_info_callout: 65,
create_runner_workflow_banner: 66,
- repository_storage_limit_banner_info_threshold: 67, # EE-only
- repository_storage_limit_banner_warning_threshold: 68, # EE-only
- repository_storage_limit_banner_alert_threshold: 69, # EE-only
- repository_storage_limit_banner_error_threshold: 70, # EE-only
+ # 67 removed in https://gitlab.com/gitlab-org/gitlab/-/merge_requests/121920
+ project_repository_limit_alert_warning_threshold: 68, # EE-only
+ project_repository_limit_alert_alert_threshold: 69, # EE-only
+ project_repository_limit_alert_error_threshold: 70, # EE-only
new_navigation_callout: 71,
code_suggestions_third_party_callout: 72, # EE-only
- namespace_over_storage_users_combined_alert: 73 # EE-only
+ namespace_over_storage_users_combined_alert: 73, # EE-only
+ rich_text_editor: 74
}
validates :feature_name,
diff --git a/app/models/users/group_callout.rb b/app/models/users/group_callout.rb
index c5946197b6f..74b653b5777 100644
--- a/app/models/users/group_callout.rb
+++ b/app/models/users/group_callout.rb
@@ -17,19 +17,19 @@ module Users
preview_user_over_limit_free_plan_alert: 7, # EE-only
user_reached_limit_free_plan_alert: 8, # EE-only
free_group_limited_alert: 9, # EE-only
- namespace_storage_limit_banner_info_threshold: 10, # EE-only
- namespace_storage_limit_banner_warning_threshold: 11, # EE-only
- namespace_storage_limit_banner_alert_threshold: 12, # EE-only
- namespace_storage_limit_banner_error_threshold: 13, # EE-only
+ # 10 removed in https://gitlab.com/gitlab-org/gitlab/-/merge_requests/121920
+ namespace_storage_limit_alert_warning_threshold: 11, # EE-only
+ namespace_storage_limit_alert_alert_threshold: 12, # EE-only
+ namespace_storage_limit_alert_error_threshold: 13, # EE-only
usage_quota_trial_alert: 14, # EE-only
preview_usage_quota_free_plan_alert: 15, # EE-only
enforcement_at_limit_alert: 16, # EE-only
web_hook_disabled: 17, # EE-only
unlimited_members_during_trial_alert: 18, # EE-only
- repository_storage_limit_banner_info_threshold: 19, # EE-only
- repository_storage_limit_banner_warning_threshold: 20, # EE-only
- repository_storage_limit_banner_alert_threshold: 21, # EE-only
- repository_storage_limit_banner_error_threshold: 22, # EE-only
+ # 19 removed in https://gitlab.com/gitlab-org/gitlab/-/merge_requests/121920
+ project_repository_limit_alert_warning_threshold: 20, # EE-only
+ project_repository_limit_alert_alert_threshold: 21, # EE-only
+ project_repository_limit_alert_error_threshold: 22, # EE-only
namespace_over_storage_users_combined_alert: 23 # EE-only
}
diff --git a/app/models/webauthn_registration.rb b/app/models/webauthn_registration.rb
index c8b2513e702..5480b9e9c4a 100644
--- a/app/models/webauthn_registration.rb
+++ b/app/models/webauthn_registration.rb
@@ -3,10 +3,6 @@
# Registration information for WebAuthn credentials
class WebauthnRegistration < ApplicationRecord
- include IgnorableColumns
-
- ignore_column :u2f_registration_id, remove_with: '16.2', remove_after: '2023-06-22'
-
belongs_to :user
validates :credential_xid, :public_key, :counter, presence: true
diff --git a/app/models/work_item.rb b/app/models/work_item.rb
index 9f28ffbf7b6..adf424a1d94 100644
--- a/app/models/work_item.rb
+++ b/app/models/work_item.rb
@@ -65,6 +65,12 @@ class WorkItem < Issue
'issue'
end
+ # Todo: remove method after target_type cleanup
+ # See https://gitlab.com/gitlab-org/gitlab/-/issues/416009
+ def todoable_target_type_name
+ %w[Issue WorkItem]
+ end
+
def widgets
strong_memoize(:widgets) do
work_item_type.widgets.map do |widget_class|
@@ -114,7 +120,9 @@ class WorkItem < Issue
.filter { |param_name| common_params.key?(param_name) }
.each do |param_name|
widget_params[widget.api_symbol] ||= {}
- widget_params[widget.api_symbol][param_name] = common_params.delete(param_name)
+ param_value = common_params.delete(param_name)
+
+ widget_params[widget.api_symbol].merge!(widget.process_quick_action_param(param_name, param_value))
end
end
diff --git a/app/models/work_items/widgets/base.rb b/app/models/work_items/widgets/base.rb
index a8b1b3f9a59..c4e87decdbf 100644
--- a/app/models/work_items/widgets/base.rb
+++ b/app/models/work_items/widgets/base.rb
@@ -15,6 +15,10 @@ module WorkItems
[]
end
+ def self.process_quick_action_param(param_name, value)
+ { param_name => value }
+ end
+
def self.callback_class
WorkItems::Callbacks.const_get(name.demodulize, false)
rescue NameError
diff --git a/app/models/work_items/widgets/current_user_todos.rb b/app/models/work_items/widgets/current_user_todos.rb
index 61c4fcb453b..64297b433dd 100644
--- a/app/models/work_items/widgets/current_user_todos.rb
+++ b/app/models/work_items/widgets/current_user_todos.rb
@@ -3,6 +3,19 @@
module WorkItems
module Widgets
class CurrentUserTodos < Base
+ def self.quick_action_commands
+ [:todo, :done]
+ end
+
+ def self.quick_action_params
+ [:todo_event]
+ end
+
+ def self.process_quick_action_param(param_name, value)
+ return super unless param_name == :todo_event
+
+ { action: value == 'done' ? 'mark_as_done' : 'add' }
+ end
end
end
end
diff --git a/app/policies/global_policy.rb b/app/policies/global_policy.rb
index b96ad9a73c8..bf7bfe36254 100644
--- a/app/policies/global_policy.rb
+++ b/app/policies/global_policy.rb
@@ -22,10 +22,6 @@ class GlobalPolicy < BasePolicy
condition(:project_bot, scope: :user) { @user&.project_bot? }
condition(:migration_bot, scope: :user) { @user&.migration_bot? }
- condition(:create_runner_workflow_enabled, scope: :user) do
- Feature.enabled?(:create_runner_workflow_for_admin, @user)
- end
-
condition(:service_account, scope: :user) { @user&.service_account? }
rule { anonymous }.policy do
@@ -128,10 +124,6 @@ class GlobalPolicy < BasePolicy
enable :create_instance_runner
end
- rule { ~create_runner_workflow_enabled }.policy do
- prevent :create_instance_runner
- end
-
# We can't use `read_statistics` because the user may have different permissions for different projects
rule { admin }.enable :use_project_statistics_filters
diff --git a/app/policies/group_policy.rb b/app/policies/group_policy.rb
index 94a67f5b5c8..29b966b43e2 100644
--- a/app/policies/group_policy.rb
+++ b/app/policies/group_policy.rb
@@ -97,10 +97,6 @@ class GroupPolicy < Namespaces::GroupProjectNamespaceSharedPolicy
with_scope :subject
condition(:crm_enabled, score: 0, scope: :subject) { @subject.crm_enabled? }
- condition(:create_runner_workflow_enabled) do
- Feature.enabled?(:create_runner_workflow_for_namespace, group)
- end
-
condition(:achievements_enabled, scope: :subject) do
Feature.enabled?(:achievements, @subject)
end
@@ -375,10 +371,6 @@ class GroupPolicy < Namespaces::GroupProjectNamespaceSharedPolicy
enable :admin_observability
end
- rule { ~create_runner_workflow_enabled }.policy do
- prevent :create_runner
- end
-
# Should be matched with ProjectPolicy#read_internal_note
rule { admin | reporter }.enable :read_internal_note
diff --git a/app/policies/merge_request_policy.rb b/app/policies/merge_request_policy.rb
index 49f9225a1d3..090be645b21 100644
--- a/app/policies/merge_request_policy.rb
+++ b/app/policies/merge_request_policy.rb
@@ -16,6 +16,10 @@ class MergeRequestPolicy < IssuablePolicy
prevent :accept_merge_request
end
+ rule { can?(:read_merge_request) }.policy do
+ enable :generate_diff_summary
+ end
+
rule { can_approve }.policy do
enable :approve_merge_request
end
@@ -43,6 +47,10 @@ class MergeRequestPolicy < IssuablePolicy
enable :set_merge_request_metadata
end
+ rule { llm_bot }.policy do
+ enable :generate_diff_summary
+ end
+
private
def can_approve?
diff --git a/app/policies/project_policy.rb b/app/policies/project_policy.rb
index c70dc288710..ad6155258ab 100644
--- a/app/policies/project_policy.rb
+++ b/app/policies/project_policy.rb
@@ -253,12 +253,12 @@ class ProjectPolicy < BasePolicy
!Gitlab.config.terraform_state.enabled
end
- condition(:create_runner_workflow_enabled) do
- Feature.enabled?(:create_runner_workflow_for_namespace, project.namespace)
- end
-
condition(:namespace_catalog_available) { namespace_catalog_available? }
+ condition(:created_and_owned_by_banned_user, scope: :subject) do
+ Feature.enabled?(:hide_projects_of_banned_users) && @subject.created_and_owned_by_banned_user?
+ end
+
# `:read_project` may be prevented in EE, but `:read_project_for_iids` should
# not.
rule { guest | admin }.enable :read_project_for_iids
@@ -886,10 +886,6 @@ class ProjectPolicy < BasePolicy
enable :read_code
end
- rule { ~create_runner_workflow_enabled }.policy do
- prevent :create_runner
- end
-
# Should be matched with GroupPolicy#read_internal_note
rule { admin | can?(:reporter_access) }.enable :read_internal_note
@@ -909,6 +905,14 @@ class ProjectPolicy < BasePolicy
enable :read_model_experiments
end
+ rule { can?(:reporter_access) & model_experiments_enabled }.policy do
+ enable :write_model_experiments
+ end
+
+ rule { ~admin & created_and_owned_by_banned_user }.policy do
+ prevent :read_project
+ end
+
private
def user_is_user?
diff --git a/app/presenters/alert_management/alert_presenter.rb b/app/presenters/alert_management/alert_presenter.rb
index 659e991e9d8..60fa351b449 100644
--- a/app/presenters/alert_management/alert_presenter.rb
+++ b/app/presenters/alert_management/alert_presenter.rb
@@ -10,7 +10,7 @@ module AlertManagement
MARKDOWN_LINE_BREAK = " \n"
HORIZONTAL_LINE = "\n\n---\n\n"
- delegate :metrics_dashboard_url, :runbook, to: :parsed_payload
+ delegate :runbook, to: :parsed_payload
def initialize(alert, **attributes)
super
@@ -44,22 +44,10 @@ module AlertManagement
project.incident_management_setting&.create_issue?
end
- def show_performance_dashboard_link?
- prometheus_alert.present?
- end
-
def incident_issues_link
project_incidents_url(project)
end
- def performance_dashboard_link
- if environment
- metrics_project_environment_url(project, environment)
- else
- metrics_project_environments_url(project)
- end
- end
-
def email_title
[environment&.name, query_title].compact.join(': ')
end
@@ -72,8 +60,7 @@ module AlertManagement
def issue_summary_markdown
<<~MARKDOWN.chomp
- #{metadata_list}
- #{metric_embed_for_alert}
+ #{metadata_list}\n
MARKDOWN
end
@@ -92,10 +79,6 @@ module AlertManagement
metadata.join(MARKDOWN_LINE_BREAK)
end
- def metric_embed_for_alert
- "\n[](#{metrics_dashboard_url})" if metrics_dashboard_url
- end
-
def list_item(key, value)
"**#{key}:** #{value}".strip
end
diff --git a/app/presenters/blob_presenter.rb b/app/presenters/blob_presenter.rb
index cd473152b41..bc12d210334 100644
--- a/app/presenters/blob_presenter.rb
+++ b/app/presenters/blob_presenter.rb
@@ -86,7 +86,7 @@ class BlobPresenter < Gitlab::View::Presenter::Delegated
end
def find_file_path
- url_helpers.project_find_file_path(project, blob.commit_id)
+ url_helpers.project_find_file_path(project, commit_id, ref_type: ref_type)
end
def blame_path
@@ -131,13 +131,13 @@ class BlobPresenter < Gitlab::View::Presenter::Delegated
end
def can_modify_blob?
- super(blob, project, blob.commit_id)
+ super(blob, project, commit_id)
end
def can_current_user_push_to_branch?
- return false unless current_user && project.repository.branch_exists?(blob.commit_id)
+ return false unless current_user && project.repository.branch_exists?(commit_id)
- user_access(project).can_push_to_branch?(blob.commit_id)
+ user_access(project).can_push_to_branch?(commit_id)
end
def archived?
@@ -145,7 +145,7 @@ class BlobPresenter < Gitlab::View::Presenter::Delegated
end
def ide_edit_path
- super(project, blob.commit_id, blob.path)
+ super(project, commit_id, blob.path)
end
def external_storage_url
@@ -159,7 +159,7 @@ class BlobPresenter < Gitlab::View::Presenter::Delegated
end
def project_blob_path_root
- project_blob_path(project, blob.commit_id)
+ project_blob_path(project, commit_id)
end
private
@@ -181,7 +181,7 @@ class BlobPresenter < Gitlab::View::Presenter::Delegated
end
def environment
- environment_params = project.repository.branch_exists?(blob.commit_id) ? { ref: blob.commit_id } : { sha: blob.commit_id }
+ environment_params = project.repository.branch_exists?(commit_id) ? { ref: commit_id } : { sha: commit_id }
environment_params[:find_latest] = true
::Environments::EnvironmentsByDeploymentsFinder.new(project, current_user, environment_params).execute.last
end
@@ -190,12 +190,13 @@ class BlobPresenter < Gitlab::View::Presenter::Delegated
blob.repository.project
end
- def ref_qualified_path
+ def commit_id
# If `ref_type` is present the commit_id will include the ref qualifier e.g. `refs/heads/`.
# We only accept/return unqualified refs so we need to remove the qualifier from the `commit_id`.
+ ExtractsRef.unqualify_ref(blob.commit_id, ref_type)
+ end
- commit_id = ExtractsRef.unqualify_ref(blob.commit_id, ref_type)
-
+ def ref_qualified_path
File.join(commit_id, blob.path)
end
diff --git a/app/presenters/ci/pipeline_presenter.rb b/app/presenters/ci/pipeline_presenter.rb
index 3aba5a2c7ed..762ee0d92cd 100644
--- a/app/presenters/ci/pipeline_presenter.rb
+++ b/app/presenters/ci/pipeline_presenter.rb
@@ -65,28 +65,6 @@ module Ci
'%.2f' % pipeline.coverage
end
- def ref_text_legacy
- if pipeline.detached_merge_request_pipeline?
- _("for %{link_to_merge_request} with %{link_to_merge_request_source_branch}")
- .html_safe % {
- link_to_merge_request: link_to_merge_request,
- link_to_merge_request_source_branch: link_to_merge_request_source_branch
- }
- elsif pipeline.merged_result_pipeline?
- _("for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}")
- .html_safe % {
- link_to_merge_request: link_to_merge_request,
- link_to_merge_request_source_branch: link_to_merge_request_source_branch,
- link_to_merge_request_target_branch: link_to_merge_request_target_branch
- }
- elsif pipeline.ref && pipeline.ref_exists?
- _("for %{link_to_pipeline_ref}")
- .html_safe % { link_to_pipeline_ref: link_to_pipeline_ref }
- elsif pipeline.ref
- _("for %{ref}").html_safe % { ref: plain_ref_name }
- end
- end
-
def ref_text
if pipeline.detached_merge_request_pipeline?
_("Related merge request %{link_to_merge_request} to merge %{link_to_merge_request_source_branch}")
@@ -109,22 +87,6 @@ module Ci
end
end
- def all_related_merge_request_text(limit: nil)
- if all_related_merge_requests.none?
- _("No related merge requests found.")
- else
- (_("%{count} related %{pluralized_subject}: %{links}") % {
- count: all_related_merge_requests.count,
- pluralized_subject: n_('merge request', 'merge requests', all_related_merge_requests.count),
- links: all_related_merge_request_links(limit: limit).join(', ')
- }).html_safe
- end
- end
-
- def has_many_merge_requests?
- all_related_merge_requests.count > 1
- end
-
def link_to_pipeline_ref
ApplicationController.helpers.link_to(pipeline.ref,
project_commits_path(pipeline.project, pipeline.ref),
diff --git a/app/presenters/ml/models_index_presenter.rb b/app/presenters/ml/models_index_presenter.rb
new file mode 100644
index 00000000000..e2cb8e2d6c1
--- /dev/null
+++ b/app/presenters/ml/models_index_presenter.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module Ml
+ class ModelsIndexPresenter
+ def initialize(models)
+ @models = models
+ end
+
+ def present
+ data = @models.map do |m|
+ {
+ name: m.name,
+ version: m.version,
+ path: Gitlab::Routing.url_helpers.project_package_path(m.project, m)
+ }
+ end
+
+ Gitlab::Json.generate({ models: data })
+ end
+ end
+end
diff --git a/app/presenters/project_presenter.rb b/app/presenters/project_presenter.rb
index 856eba5aadc..4533ef3633d 100644
--- a/app/presenters/project_presenter.rb
+++ b/app/presenters/project_presenter.rb
@@ -28,6 +28,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
[
commits_anchor_data,
branches_anchor_data,
+ terraform_states_anchor_data,
tags_anchor_data,
storage_anchor_data,
releases_anchor_data,
@@ -236,6 +237,21 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
)
end
+ def terraform_states_anchor_data
+ if project.terraform_states.exists? && can_read_terraform_state?
+ AnchorData.new(
+ true,
+ statistic_icon('terraform') +
+ n_('%{strong_start}%{terraform_states_count}%{strong_end} Terraform State', '%{strong_start}%{terraform_states_count}%{strong_end} Terraform States', project.terraform_states.count).html_safe % {
+ terraform_states_count: number_with_delimiter(project.terraform_states.count),
+ strong_start: '<strong class="project-stat-value">'.html_safe,
+ strong_end: '</strong>'.html_safe
+ },
+ project_terraform_index_path(project)
+ )
+ end
+ end
+
def tags_anchor_data
AnchorData.new(
true,
@@ -488,6 +504,10 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
end
end
+ def can_read_terraform_state?
+ current_user && can?(current_user, :read_terraform_state, project)
+ end
+
# Avoid including ActionView::Helpers::UrlHelper
def content_tag(...)
ActionController::Base.helpers.content_tag(...)
diff --git a/app/serializers/diff_viewer_entity.rb b/app/serializers/diff_viewer_entity.rb
index 8ff9d9612c6..f8d9778a3ee 100644
--- a/app/serializers/diff_viewer_entity.rb
+++ b/app/serializers/diff_viewer_entity.rb
@@ -5,7 +5,7 @@ class DiffViewerEntity < Grape::Entity
expose :render_error, as: :error
expose :render_error_message, as: :error_message
expose :collapsed?, as: :collapsed
- expose :whitespace_only, if: ->(_, _) { Feature.enabled?(:add_ignore_all_white_spaces) } do |_, options|
+ expose :whitespace_only do |_, options|
options[:whitespace_only]
end
end
diff --git a/app/serializers/environment_entity.rb b/app/serializers/environment_entity.rb
index 6457127d831..0a3bf4c2a7b 100644
--- a/app/serializers/environment_entity.rb
+++ b/app/serializers/environment_entity.rb
@@ -27,10 +27,6 @@ class EnvironmentEntity < Grape::Entity
ops.merge(except: UNNECESSARY_ENTRIES_FOR_UPCOMING_DEPLOYMENT))
end
- expose :metrics_path, if: -> (*) { expose_metrics_path? } do |environment|
- metrics_project_environment_path(environment.project, environment)
- end
-
expose :environment_path do |environment|
project_environment_path(environment.project, environment)
end
@@ -101,10 +97,6 @@ class EnvironmentEntity < Grape::Entity
def cluster
deployment_platform.cluster
end
-
- def expose_metrics_path?
- !Feature.enabled?(:remove_monitor_metrics) && environment.has_metrics?
- end
end
EnvironmentEntity.prepend_mod_with('EnvironmentEntity')
diff --git a/app/serializers/environment_status_entity.rb b/app/serializers/environment_status_entity.rb
index 9318e0c1de8..8865c030d94 100644
--- a/app/serializers/environment_status_entity.rb
+++ b/app/serializers/environment_status_entity.rb
@@ -15,10 +15,6 @@ class EnvironmentStatusEntity < Grape::Entity
metrics_project_environment_deployment_path(es.project, es.environment, es.deployment)
end
- expose :metrics_monitoring_url, if: ->(*) { can_read_environment? } do |es|
- project_metrics_dashboard_path(es.project, environment: es.environment)
- end
-
expose :stop_url, if: ->(*) { can_stop_environment? } do |es|
stop_project_environment_path(es.project, es.environment)
end
diff --git a/app/serializers/lfs_file_lock_entity.rb b/app/serializers/lfs_file_lock_entity.rb
index 7961c4e666b..dd109cba015 100644
--- a/app/serializers/lfs_file_lock_entity.rb
+++ b/app/serializers/lfs_file_lock_entity.rb
@@ -5,9 +5,9 @@ class LfsFileLockEntity < Grape::Entity
expose :path
expose(:id) { |entity| entity.id.to_s }
- expose(:created_at, as: :locked_at) { |entity| entity.created_at.to_s(:iso8601) }
+ expose(:created_at, as: :locked_at) { |entity| entity.created_at.to_fs(:iso8601) }
expose :owner do
- expose(:name) { |entity| entity.user&.name }
+ expose(:name) { |entity| entity.user&.username }
end
end
diff --git a/app/serializers/prometheus_alert_entity.rb b/app/serializers/prometheus_alert_entity.rb
deleted file mode 100644
index fb25889e4db..00000000000
--- a/app/serializers/prometheus_alert_entity.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-class PrometheusAlertEntity < Grape::Entity
- include RequestAwareEntity
-
- expose :id
- expose :title
- expose :query
- expose :threshold
- expose :runbook_url
-
- expose :operator do |prometheus_alert|
- prometheus_alert.computed_operator
- end
-
- private
-
- alias_method :prometheus_alert, :object
-
- def can_read_prometheus_alerts?
- can?(request.current_user, :read_prometheus_alerts, prometheus_alert.project)
- end
-end
diff --git a/app/serializers/prometheus_alert_serializer.rb b/app/serializers/prometheus_alert_serializer.rb
deleted file mode 100644
index 4dafb7216db..00000000000
--- a/app/serializers/prometheus_alert_serializer.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-# frozen_string_literal: true
-
-class PrometheusAlertSerializer < BaseSerializer
- entity PrometheusAlertEntity
-end
diff --git a/app/services/admin/plan_limits/update_service.rb b/app/services/admin/plan_limits/update_service.rb
index a71d1f14112..cda9a7e7f8c 100644
--- a/app/services/admin/plan_limits/update_service.rb
+++ b/app/services/admin/plan_limits/update_service.rb
@@ -7,26 +7,34 @@ module Admin
@current_user = current_user
@params = params
@plan = plan
+ @plan_limits = plan.actual_limits
end
def execute
return error(_('Access denied'), :forbidden) unless can_update?
- if plan.actual_limits.update(parsed_params)
+ add_history_to_params!
+
+ if plan_limits.update(parsed_params)
success
else
- error(plan.actual_limits.errors.full_messages, :bad_request)
+ error(plan_limits.errors.full_messages, :bad_request)
end
end
private
- attr_accessor :current_user, :params, :plan
+ attr_accessor :current_user, :params, :plan, :plan_limits
def can_update?
current_user.can_admin_all_resources?
end
+ def add_history_to_params!
+ formatted_limits_history = plan_limits.format_limits_history(current_user, parsed_params)
+ parsed_params.merge!(limits_history: formatted_limits_history) unless formatted_limits_history.empty?
+ end
+
# Overridden in EE
def parsed_params
params
diff --git a/app/services/application_settings/update_service.rb b/app/services/application_settings/update_service.rb
index 7728982779e..6d484c4fa22 100644
--- a/app/services/application_settings/update_service.rb
+++ b/app/services/application_settings/update_service.rb
@@ -26,6 +26,7 @@ module ApplicationSettings
end
update_terms(@params.delete(:terms))
+ update_default_branch_protection_defaults(@params[:default_branch_protection])
add_to_outbound_local_requests_whitelist(@params.delete(:add_to_outbound_local_requests_whitelist))
@@ -77,6 +78,19 @@ module ApplicationSettings
@application_setting.reset_memoized_terms
end
+ def update_default_branch_protection_defaults(default_branch_protection)
+ return unless default_branch_protection.present?
+
+ # We are migrating default_branch_protection from an integer
+ # column to a jsonb column. While completing the rest of the
+ # work, we want to start translating the updates sent to the
+ # existing column into the json. Eventually, we will be updating
+ # the jsonb column directly and deprecating the original update
+ # path. Until then, we want to sync up both columns.
+ protection = Gitlab::Access::BranchProtection.new(default_branch_protection.to_i)
+ @application_setting.default_branch_protection_defaults = protection.to_hash
+ end
+
def process_performance_bar_allowed_group_id
group_full_path = params.delete(:performance_bar_allowed_group_path)
enable_param_on = Gitlab::Utils.to_boolean(params.delete(:performance_bar_enabled))
diff --git a/app/services/auto_merge/merge_when_pipeline_succeeds_service.rb b/app/services/auto_merge/merge_when_pipeline_succeeds_service.rb
index 2bbb8f925a4..cb8e531f0e1 100644
--- a/app/services/auto_merge/merge_when_pipeline_succeeds_service.rb
+++ b/app/services/auto_merge/merge_when_pipeline_succeeds_service.rb
@@ -4,9 +4,7 @@ module AutoMerge
class MergeWhenPipelineSucceedsService < AutoMerge::BaseService
def execute(merge_request)
super do
- if merge_request.saved_change_to_auto_merge_enabled?
- SystemNoteService.merge_when_pipeline_succeeds(merge_request, project, current_user, merge_request.actual_head_pipeline.sha)
- end
+ add_system_note(merge_request)
end
end
@@ -36,12 +34,20 @@ module AutoMerge
def available_for?(merge_request)
super do
- merge_request.actual_head_pipeline&.active?
+ check_availability(merge_request)
end
end
private
+ def add_system_note(merge_request)
+ SystemNoteService.merge_when_pipeline_succeeds(merge_request, project, current_user, merge_request.actual_head_pipeline.sha) if merge_request.saved_change_to_auto_merge_enabled?
+ end
+
+ def check_availability(merge_request)
+ merge_request.actual_head_pipeline&.active?
+ end
+
def notify(merge_request)
notification_service.async.merge_when_pipeline_succeeds(merge_request, current_user) if merge_request.saved_change_to_auto_merge_enabled?
end
diff --git a/app/services/award_emojis/add_service.rb b/app/services/award_emojis/add_service.rb
index f45a4330c09..065ef9dc708 100644
--- a/app/services/award_emojis/add_service.rb
+++ b/app/services/award_emojis/add_service.rb
@@ -27,6 +27,8 @@ module AwardEmojis
def after_create(award)
TodoService.new.new_award_emoji(todoable, current_user) if todoable
+
+ execute_hooks(award, 'award')
end
def todoable
diff --git a/app/services/award_emojis/base_service.rb b/app/services/award_emojis/base_service.rb
index 626e26d63b5..274c528acf2 100644
--- a/app/services/award_emojis/base_service.rb
+++ b/app/services/award_emojis/base_service.rb
@@ -11,6 +11,13 @@ module AwardEmojis
super(awardable.project, current_user)
end
+ def execute_hooks(award_emoji, action)
+ return unless awardable.project&.has_active_hooks?(:emoji_hooks)
+
+ hook_data = Gitlab::DataBuilder::Emoji.build(award_emoji, current_user, action)
+ awardable.project.execute_hooks(hook_data, :emoji_hooks)
+ end
+
private
def normalize_name(name)
diff --git a/app/services/award_emojis/destroy_service.rb b/app/services/award_emojis/destroy_service.rb
index 47dc8418e07..b7146d69bf0 100644
--- a/app/services/award_emojis/destroy_service.rb
+++ b/app/services/award_emojis/destroy_service.rb
@@ -22,6 +22,7 @@ module AwardEmojis
private
def after_destroy(award)
+ execute_hooks(award, 'revoke')
end
end
end
diff --git a/app/services/boards/base_items_list_service.rb b/app/services/boards/base_items_list_service.rb
index bf68aee2c1f..a4b1be1e599 100644
--- a/app/services/boards/base_items_list_service.rb
+++ b/app/services/boards/base_items_list_service.rb
@@ -13,14 +13,17 @@ module Boards
# rubocop: disable CodeReuse/ActiveRecord
def metadata(required_fields = [:issue_count, :total_issue_weight])
- fields = metadata_fields(required_fields)
- keys = fields.keys
- # TODO: eliminate need for SQL literal fragment
- columns = Arel.sql(fields.values_at(*keys).join(', '))
- results = item_model.where(id: collection_ids)
- results = results.select(columns)
-
- Hash[keys.zip(results.pluck(columns).flatten)]
+ # Failing tests in spec/requests/api/graphql/boards/board_lists_query_spec.rb
+ ::Gitlab::Database.allow_cross_joins_across_databases(url: "https://gitlab.com/gitlab-org/gitlab/-/issues/417465") do
+ fields = metadata_fields(required_fields)
+ keys = fields.keys
+ # TODO: eliminate need for SQL literal fragment
+ columns = Arel.sql(fields.values_at(*keys).join(', '))
+ results = item_model.where(id: collection_ids)
+ results = results.select(columns)
+
+ Hash[keys.zip(results.pluck(columns).flatten)]
+ end
end
# rubocop: enable CodeReuse/ActiveRecord
diff --git a/app/services/bulk_imports/create_service.rb b/app/services/bulk_imports/create_service.rb
index 636c636255f..7fc3511a253 100644
--- a/app/services/bulk_imports/create_service.rb
+++ b/app/services/bulk_imports/create_service.rb
@@ -105,7 +105,7 @@ module BulkImports
def validate_setting_enabled!
source_full_path, source_type = Array.wrap(params)[0].values_at(:source_full_path, :source_type)
entity_type = ENTITY_TYPES_MAPPING.fetch(source_type)
- if source_full_path =~ /^[0-9]+$/
+ if /^[0-9]+$/.match?(source_full_path)
query = query_type(entity_type)
response = graphql_client.execute(
graphql_client.parse(query.to_s),
@@ -154,7 +154,7 @@ module BulkImports
end
def validate_destination_slug(destination_slug)
- return if destination_slug =~ Gitlab::Regex.oci_repository_path_regex
+ return if Gitlab::Regex.oci_repository_path_regex.match?(destination_slug)
raise BulkImports::Error.destination_slug_validation_failure
end
diff --git a/app/services/bulk_imports/relation_export_service.rb b/app/services/bulk_imports/relation_export_service.rb
index 142bc48efe3..ed71c09420b 100644
--- a/app/services/bulk_imports/relation_export_service.rb
+++ b/app/services/bulk_imports/relation_export_service.rb
@@ -16,7 +16,7 @@ module BulkImports
def execute
find_or_create_export! do |export|
- remove_existing_export_file!(export)
+ export.remove_existing_upload!
export_service.execute
compress_exported_relation
upload_compressed_file(export)
@@ -45,15 +45,6 @@ module BulkImports
fail_export!(export, e)
end
- def remove_existing_export_file!(export)
- upload = export.upload
-
- return unless upload&.export_file&.file
-
- upload.remove_export_file!
- upload.save!
- end
-
def export_service
@export_service ||= if config.tree_relation?(relation) || config.self_relation?(relation)
TreeExportService.new(portable, export_path, relation, user)
diff --git a/app/services/ci/create_pipeline_schedule_service.rb b/app/services/ci/create_pipeline_schedule_service.rb
index 0d5f50c26a1..4fdd65bcdb4 100644
--- a/app/services/ci/create_pipeline_schedule_service.rb
+++ b/app/services/ci/create_pipeline_schedule_service.rb
@@ -1,6 +1,7 @@
# frozen_string_literal: true
module Ci
+ # This class is deprecated and will be removed with the FF ci_refactoring_pipeline_schedule_create_service
class CreatePipelineScheduleService < BaseService
def execute
project.pipeline_schedules.create(pipeline_schedule_params)
diff --git a/app/services/ci/create_pipeline_service.rb b/app/services/ci/create_pipeline_service.rb
index a8da83e84a1..fe0e842f542 100644
--- a/app/services/ci/create_pipeline_service.rb
+++ b/app/services/ci/create_pipeline_service.rb
@@ -40,22 +40,22 @@ module Ci
# Create a new pipeline in the specified project.
#
- # @param [Symbol] source What event (Ci::Pipeline.sources) triggers the pipeline
- # creation.
- # @param [Boolean] ignore_skip_ci Whether skipping a pipeline creation when `[skip ci]` comment
- # is present in the commit body
- # @param [Boolean] save_on_errors Whether persisting an invalid pipeline when it encounters an
- # error during creation (e.g. invalid yaml)
- # @param [Ci::TriggerRequest] trigger_request The pipeline trigger triggers the pipeline creation.
- # @param [Ci::PipelineSchedule] schedule The pipeline schedule triggers the pipeline creation.
- # @param [MergeRequest] merge_request The merge request triggers the pipeline creation.
- # @param [ExternalPullRequest] external_pull_request The external pull request triggers the pipeline creation.
- # @param [Ci::Bridge] bridge The bridge job that triggers the downstream pipeline creation.
- # @param [String] content The content of .gitlab-ci.yml to override the default config
- # contents (e.g. .gitlab-ci.yml in repostiry). Mainly used for
- # generating a dangling pipeline.
+ # @param [Symbol] source What event (Ci::Pipeline.sources) triggers the pipeline
+ # creation.
+ # @param [Boolean] ignore_skip_ci Whether skipping a pipeline creation when `[skip ci]` comment
+ # is present in the commit body
+ # @param [Boolean] save_on_errors Whether persisting an invalid pipeline when it encounters an
+ # error during creation (e.g. invalid yaml)
+ # @param [Ci::TriggerRequest] trigger_request The pipeline trigger triggers the pipeline creation.
+ # @param [Ci::PipelineSchedule] schedule The pipeline schedule triggers the pipeline creation.
+ # @param [MergeRequest] merge_request The merge request triggers the pipeline creation.
+ # @param [Ci::ExternalPullRequest] external_pull_request The external pull request triggers the pipeline creation.
+ # @param [Ci::Bridge] bridge The bridge job that triggers the downstream pipeline creation.
+ # @param [String] content The content of .gitlab-ci.yml to override the default config
+ # contents (e.g. .gitlab-ci.yml in repostiry). Mainly used for
+ # generating a dangling pipeline.
#
- # @return [Ci::Pipeline] The created Ci::Pipeline object.
+ # @return [Ci::Pipeline] The created Ci::Pipeline object.
# rubocop: disable Metrics/ParameterLists
def execute(source, ignore_skip_ci: false, save_on_errors: true, trigger_request: nil, schedule: nil, merge_request: nil, external_pull_request: nil, bridge: nil, **options, &block)
@logger = build_logger
diff --git a/app/services/ci/destroy_pipeline_service.rb b/app/services/ci/destroy_pipeline_service.rb
index bdec13f98a7..a9d2e17657e 100644
--- a/app/services/ci/destroy_pipeline_service.rb
+++ b/app/services/ci/destroy_pipeline_service.rb
@@ -7,7 +7,7 @@ module Ci
Ci::ExpirePipelineCacheService.new.execute(pipeline, delete: true)
- # ensure cancellation happens sync so we accumulate compute credits successfully
+ # ensure cancellation happens sync so we accumulate compute minutes successfully
# before deleting the pipeline.
::Ci::CancelPipelineService.new(
pipeline: pipeline,
diff --git a/app/services/ci/pipeline_processing/atomic_processing_service.rb b/app/services/ci/pipeline_processing/atomic_processing_service.rb
index c0ffbb401f6..8211507fb95 100644
--- a/app/services/ci/pipeline_processing/atomic_processing_service.rb
+++ b/app/services/ci/pipeline_processing/atomic_processing_service.rb
@@ -23,14 +23,12 @@ module Ci
success = try_obtain_lease { process! }
if success
- if ::Feature.enabled?(:ci_reset_skipped_jobs_in_atomic_processing, project)
- # If any jobs changed from stopped to alive status during pipeline processing, we must
- # re-reset their dependent jobs; see https://gitlab.com/gitlab-org/gitlab/-/issues/388539.
- new_alive_jobs.group_by(&:user).each do |user, jobs|
- log_running_reset_skipped_jobs_service(jobs)
-
- ResetSkippedJobsService.new(project, user).execute(jobs)
- end
+ # If any jobs changed from stopped to alive status during pipeline processing, we must
+ # re-reset their dependent jobs; see https://gitlab.com/gitlab-org/gitlab/-/issues/388539.
+ new_alive_jobs.group_by(&:user).each do |user, jobs|
+ log_running_reset_skipped_jobs_service(jobs)
+
+ ResetSkippedJobsService.new(project, user).execute(jobs)
end
# Re-schedule if we need further processing
diff --git a/app/services/ci/pipeline_schedules/create_service.rb b/app/services/ci/pipeline_schedules/create_service.rb
new file mode 100644
index 00000000000..c1825865bc0
--- /dev/null
+++ b/app/services/ci/pipeline_schedules/create_service.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+module Ci
+ module PipelineSchedules
+ class CreateService
+ def initialize(project, user, params)
+ @project = project
+ @user = user
+ @params = params
+
+ @schedule = project.pipeline_schedules.new
+ end
+
+ def execute
+ return forbidden unless allowed?
+
+ schedule.assign_attributes(params.merge(owner: user))
+
+ if schedule.save
+ ServiceResponse.success(payload: schedule)
+ else
+ ServiceResponse.error(payload: schedule, message: schedule.errors.full_messages)
+ end
+ end
+
+ private
+
+ attr_reader :project, :user, :params, :schedule
+
+ def allowed?
+ user.can?(:create_pipeline_schedule, schedule)
+ end
+
+ def forbidden
+ # We add the error to the base object too
+ # because model errors are used in the API responses and the `form_errors` helper.
+ schedule.errors.add(:base, forbidden_message)
+
+ ServiceResponse.error(payload: schedule, message: [forbidden_message], reason: :forbidden)
+ end
+
+ def forbidden_message
+ _('The current user is not authorized to create the pipeline schedule')
+ end
+ end
+ end
+end
diff --git a/app/services/ci/pipeline_schedules/update_service.rb b/app/services/ci/pipeline_schedules/update_service.rb
index 2412b5cbd81..28c22e0a868 100644
--- a/app/services/ci/pipeline_schedules/update_service.rb
+++ b/app/services/ci/pipeline_schedules/update_service.rb
@@ -12,7 +12,9 @@ module Ci
def execute
return forbidden unless allowed?
- if schedule.update(@params)
+ schedule.assign_attributes(params)
+
+ if schedule.save
ServiceResponse.success(payload: schedule)
else
ServiceResponse.error(message: schedule.errors.full_messages)
@@ -21,17 +23,22 @@ module Ci
private
- attr_reader :schedule, :user
+ attr_reader :schedule, :user, :params
def allowed?
user.can?(:update_pipeline_schedule, schedule)
end
def forbidden
- ServiceResponse.error(
- message: _('The current user is not authorized to update the pipeline schedule'),
- reason: :forbidden
- )
+ # We add the error to the base object too
+ # because model errors are used in the API responses and the `form_errors` helper.
+ schedule.errors.add(:base, forbidden_message)
+
+ ServiceResponse.error(message: [forbidden_message], reason: :forbidden)
+ end
+
+ def forbidden_message
+ _('The current user is not authorized to update the pipeline schedule')
end
end
end
diff --git a/app/services/clusters/agent_tokens/create_service.rb b/app/services/clusters/agent_tokens/create_service.rb
index efa9716d2c8..136afd108e7 100644
--- a/app/services/clusters/agent_tokens/create_service.rb
+++ b/app/services/clusters/agent_tokens/create_service.rb
@@ -40,8 +40,6 @@ module Clusters
end
def active_tokens_limit_reached?
- return false unless Feature.enabled?(:cluster_agents_limit_tokens_created)
-
::Clusters::AgentTokensFinder.new(agent, current_user, status: :active).execute.count >= ACTIVE_TOKENS_LIMIT
end
diff --git a/app/services/clusters/agents/authorize_proxy_user_service.rb b/app/services/clusters/agents/authorize_proxy_user_service.rb
index fbcf25153c1..abf451ed350 100644
--- a/app/services/clusters/agents/authorize_proxy_user_service.rb
+++ b/app/services/clusters/agents/authorize_proxy_user_service.rb
@@ -11,17 +11,14 @@ module Clusters
end
def execute
- return forbidden unless user_access_config.present?
+ return forbidden('`user_access` keyword is not found in agent config file.') unless user_access_config.present?
access_as = user_access_config['access_as']
- return forbidden unless access_as.present?
- return forbidden if access_as.size != 1
- if payload = handle_access(access_as)
- return success(payload: payload)
- end
+ return forbidden('`access_as` is not found under the `user_access` keyword.') unless access_as.present?
+ return forbidden('`access_as` must exist only once under the `user_access` keyword.') if access_as.size != 1
- forbidden
+ handle_access(access_as)
end
private
@@ -52,9 +49,11 @@ module Clusters
end
def access_as_agent
- return if authorizations.empty?
+ if authorizations.empty?
+ return forbidden('You must be a member of `projects` or `groups` under the `user_access` keyword.')
+ end
- response_base.merge(access_as: { agent: {} })
+ success(payload: response_base.merge(access_as: { agent: {} }))
end
def user_access_config
@@ -64,8 +63,8 @@ module Clusters
delegate :success, to: ServiceResponse, private: true
- def forbidden
- ServiceResponse.error(reason: :forbidden, message: '403 Forbidden')
+ def forbidden(message)
+ ServiceResponse.error(reason: :forbidden, message: message)
end
end
end
diff --git a/app/services/clusters/cleanup/project_namespace_service.rb b/app/services/clusters/cleanup/project_namespace_service.rb
index 80192aa14ab..f6ac06d0594 100644
--- a/app/services/clusters/cleanup/project_namespace_service.rb
+++ b/app/services/clusters/cleanup/project_namespace_service.rb
@@ -29,7 +29,7 @@ module Clusters
rescue Kubeclient::HttpError => e
# unauthorized, forbidden: GitLab's access has been revoked
# certificate verify failed: Cluster is probably gone forever
- raise unless e.message =~ /unauthorized|forbidden|certificate verify failed/i
+ raise unless /unauthorized|forbidden|certificate verify failed/i.match?(e.message)
end
kubernetes_namespace.destroy!
diff --git a/app/services/clusters/cleanup/service_account_service.rb b/app/services/clusters/cleanup/service_account_service.rb
index dce41d2a39c..0ce4bf9bb9c 100644
--- a/app/services/clusters/cleanup/service_account_service.rb
+++ b/app/services/clusters/cleanup/service_account_service.rb
@@ -27,7 +27,7 @@ module Clusters
rescue Kubeclient::HttpError => e
# unauthorized, forbidden: GitLab's access has been revoked
# certificate verify failed: Cluster is probably gone forever
- raise unless e.message =~ /unauthorized|forbidden|certificate verify failed/i
+ raise unless /unauthorized|forbidden|certificate verify failed/i.match?(e.message)
end
end
end
diff --git a/app/services/clusters/integrations/prometheus_health_check_service.rb b/app/services/clusters/integrations/prometheus_health_check_service.rb
deleted file mode 100644
index cd06e59449c..00000000000
--- a/app/services/clusters/integrations/prometheus_health_check_service.rb
+++ /dev/null
@@ -1,101 +0,0 @@
-# frozen_string_literal: true
-
-module Clusters
- module Integrations
- class PrometheusHealthCheckService
- include Gitlab::Utils::StrongMemoize
- include Gitlab::Routing
-
- def initialize(cluster)
- @cluster = cluster
- @logger = Gitlab::AppJsonLogger.build
- end
-
- def execute
- raise 'Invalid cluster type. Only project types are allowed.' unless @cluster.project_type?
-
- return unless prometheus_integration.enabled
-
- project = @cluster.clusterable
-
- @logger.info(
- message: 'Prometheus health check',
- cluster_id: @cluster.id,
- newly_unhealthy: became_unhealthy?,
- currently_healthy: currently_healthy?,
- was_healthy: was_healthy?
- )
-
- send_notification(project) if became_unhealthy?
-
- prometheus_integration.update_columns(health_status: current_health_status) if health_changed?
- end
-
- private
-
- def prometheus_integration
- strong_memoize(:prometheus_integration) do
- @cluster.integration_prometheus
- end
- end
-
- def current_health_status
- if currently_healthy?
- :healthy
- else
- :unhealthy
- end
- end
-
- def currently_healthy?
- strong_memoize(:currently_healthy) do
- prometheus_integration.prometheus_client.healthy?
- end
- end
-
- def became_unhealthy?
- strong_memoize(:became_unhealthy) do
- (was_healthy? || was_unknown?) && !currently_healthy?
- end
- end
-
- def was_healthy?
- strong_memoize(:was_healthy) do
- prometheus_integration.healthy?
- end
- end
-
- def was_unknown?
- strong_memoize(:was_unknown) do
- prometheus_integration.unknown?
- end
- end
-
- def health_changed?
- was_healthy? != currently_healthy?
- end
-
- def send_notification(project)
- notification_payload = build_notification_payload(project)
- integration = project.alert_management_http_integrations.active.first
-
- Projects::Alerting::NotifyService.new(project, notification_payload).execute(integration&.token, integration)
-
- @logger.info(message: 'Successfully notified of Prometheus newly unhealthy', cluster_id: @cluster.id, project_id: project.id)
- end
-
- def build_notification_payload(project)
- cluster_path = namespace_project_cluster_path(
- project_id: project.path,
- namespace_id: project.namespace.path,
- id: @cluster.id
- )
-
- {
- title: "Prometheus is Unhealthy. Cluster Name: #{@cluster.name}",
- description: "Prometheus is unhealthy for the cluster: [#{@cluster.name}](#{cluster_path}) attached to project #{project.name}."
- }
- end
- end
- end
-end
diff --git a/app/services/concerns/integrations/project_test_data.rb b/app/services/concerns/integrations/project_test_data.rb
index b3427697052..fcef22a8cab 100644
--- a/app/services/concerns/integrations/project_test_data.rb
+++ b/app/services/concerns/integrations/project_test_data.rb
@@ -77,5 +77,20 @@ module Integrations
release.to_hook_data('create')
end
+
+ def emoji_events_data
+ no_data_error(s_('TestHooks|Ensure the project has notes.')) unless project.notes.any?
+
+ award_emoji = AwardEmoji.new(
+ id: 1,
+ name: 'thumbsup',
+ user: current_user,
+ awardable: project.notes.last,
+ created_at: Time.zone.now,
+ updated_at: Time.zone.now
+ )
+
+ Gitlab::DataBuilder::Emoji.build(award_emoji, current_user, 'award')
+ end
end
end
diff --git a/app/services/concerns/projects/remove_refs.rb b/app/services/concerns/projects/remove_refs.rb
new file mode 100644
index 00000000000..d133aa0ced6
--- /dev/null
+++ b/app/services/concerns/projects/remove_refs.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+module Projects
+ module RemoveRefs
+ extend ActiveSupport::Concern
+ include Gitlab::ExclusiveLeaseHelpers
+
+ LOCK_RETRY = 3
+ LOCK_TTL = 5.minutes
+ LOCK_SLEEP = 0.5.seconds
+
+ def serialized_remove_refs(project_id, &blk)
+ in_lock("projects/#{project_id}/serialized_remove_refs", **lock_params, &blk)
+ end
+
+ def lock_params
+ {
+ ttl: LOCK_TTL,
+ retries: LOCK_RETRY,
+ sleep_sec: LOCK_SLEEP
+ }
+ end
+ end
+end
diff --git a/app/services/draft_notes/create_service.rb b/app/services/draft_notes/create_service.rb
index 5ff971b66c1..e5a070e9db7 100644
--- a/app/services/draft_notes/create_service.rb
+++ b/app/services/draft_notes/create_service.rb
@@ -25,7 +25,8 @@ module DraftNotes
draft_note = DraftNote.new(params)
draft_note.merge_request = merge_request
draft_note.author = current_user
- draft_note.save
+
+ return draft_note unless draft_note.save
if in_reply_to_discussion_id.blank? && draft_note.diff_file&.unfolded?
merge_request.diffs.clear_cache
diff --git a/app/services/draft_notes/publish_service.rb b/app/services/draft_notes/publish_service.rb
index 9e1e381c568..a7a2ad63c1c 100644
--- a/app/services/draft_notes/publish_service.rb
+++ b/app/services/draft_notes/publish_service.rb
@@ -49,6 +49,7 @@ module DraftNotes
notification_service.async.new_review(review)
MergeRequests::ResolvedDiscussionNotificationService.new(project: project, current_user: current_user).execute(merge_request)
GraphqlTriggers.merge_request_merge_status_updated(merge_request)
+ after_publish(review)
end
def create_note_from_draft(draft, skip_capture_diff_note_position: false, skip_keep_around_commits: false, skip_merge_status_trigger: false)
@@ -108,5 +109,11 @@ module DraftNotes
project.repository.keep_around(*shas)
end
end
+
+ def after_publish(review)
+ # Overridden in EE
+ end
end
end
+
+DraftNotes::PublishService.prepend_mod
diff --git a/app/services/environments/create_service.rb b/app/services/environments/create_service.rb
index 760c8a6e306..fd78a886e29 100644
--- a/app/services/environments/create_service.rb
+++ b/app/services/environments/create_service.rb
@@ -2,7 +2,7 @@
module Environments
class CreateService < BaseService
- ALLOWED_ATTRIBUTES = %i[name external_url tier cluster_agent].freeze
+ ALLOWED_ATTRIBUTES = %i[name external_url tier cluster_agent kubernetes_namespace].freeze
def execute
unless can?(current_user, :create_environment, project)
diff --git a/app/services/environments/update_service.rb b/app/services/environments/update_service.rb
index 5eb4880ec4b..52f6198bada 100644
--- a/app/services/environments/update_service.rb
+++ b/app/services/environments/update_service.rb
@@ -2,7 +2,7 @@
module Environments
class UpdateService < BaseService
- ALLOWED_ATTRIBUTES = %i[external_url tier cluster_agent].freeze
+ ALLOWED_ATTRIBUTES = %i[external_url tier cluster_agent kubernetes_namespace].freeze
def execute(environment)
unless can?(current_user, :update_environment, environment)
diff --git a/app/services/git/base_hooks_service.rb b/app/services/git/base_hooks_service.rb
index acf54dec51b..f9280be7ee2 100644
--- a/app/services/git/base_hooks_service.rb
+++ b/app/services/git/base_hooks_service.rb
@@ -67,7 +67,10 @@ module Git
# Creating push_data invokes one CommitDelta RPC per commit. Only
# build this data if we actually need it.
project.execute_hooks(push_data, hook_name) if project.has_active_hooks?(hook_name)
- project.execute_integrations(push_data, hook_name) if project.has_active_integrations?(hook_name)
+
+ return unless project.has_active_integrations?(hook_name)
+
+ project.execute_integrations(push_data, hook_name, skip_ci: integration_push_options&.fetch(:skip_ci).present?)
end
def enqueue_invalidate_cache
@@ -101,7 +104,19 @@ module Git
def ci_variables_from_push_options
strong_memoize(:ci_variables_from_push_options) do
- params[:push_options]&.deep_symbolize_keys&.dig(:ci, :variable)
+ push_options&.dig(:ci, :variable)
+ end
+ end
+
+ def integration_push_options
+ strong_memoize(:integration_push_options) do
+ push_options&.dig(:integrations)
+ end
+ end
+
+ def push_options
+ strong_memoize(:push_options) do
+ params[:push_options]&.deep_symbolize_keys
end
end
diff --git a/app/services/groups/participants_service.rb b/app/services/groups/participants_service.rb
index 1de2b3c5a2e..e939d27d464 100644
--- a/app/services/groups/participants_service.rb
+++ b/app/services/groups/participants_service.rb
@@ -2,6 +2,7 @@
module Groups
class ParticipantsService < Groups::BaseService
+ include Gitlab::Utils::StrongMemoize
include Users::ParticipableService
def execute(noteable)
@@ -17,15 +18,20 @@ module Groups
render_participants_as_hash(participants.uniq)
end
+ private
+
def all_members
- count = group_members.count
- [{ username: "all", name: "All Group Members", count: count }]
+ return [] if group.nil? || Feature.enabled?(:disable_all_mention)
+
+ [{ username: "all", name: "All Group Members", count: group.users_count }]
end
def group_members
return [] unless group
- @group_members ||= sorted(group.direct_and_indirect_users)
+ sorted(
+ group.direct_and_indirect_users(share_with_groups: group.member?(current_user))
+ )
end
end
end
diff --git a/app/services/groups/transfer_service.rb b/app/services/groups/transfer_service.rb
index 16454360ee2..81d4dfddaab 100644
--- a/app/services/groups/transfer_service.rb
+++ b/app/services/groups/transfer_service.rb
@@ -197,6 +197,11 @@ module Groups
return if @new_parent_group
return unless @group.owners.empty?
+ add_owner_on_transferred_group
+ end
+
+ # Overridden in EE
+ def add_owner_on_transferred_group
@group.add_owner(current_user)
end
diff --git a/app/services/groups/update_service.rb b/app/services/groups/update_service.rb
index 925a2acbb58..df6ede87ef9 100644
--- a/app/services/groups/update_service.rb
+++ b/app/services/groups/update_service.rb
@@ -117,6 +117,7 @@ module Groups
def handle_settings_update
settings_params = params.slice(*allowed_settings_params)
+ settings_params.merge!({ default_branch_protection: params[:default_branch_protection] }.compact)
allowed_settings_params.each { |param| params.delete(param) }
::NamespaceSettings::UpdateService.new(current_user, group, settings_params).execute
diff --git a/app/services/groups/update_shared_runners_service.rb b/app/services/groups/update_shared_runners_service.rb
index c09dce0761f..08b43037c4c 100644
--- a/app/services/groups/update_shared_runners_service.rb
+++ b/app/services/groups/update_shared_runners_service.rb
@@ -25,7 +25,14 @@ module Groups
end
def update_shared_runners
- group.update_shared_runners_setting!(params[:shared_runners_setting])
+ case params[:shared_runners_setting]
+ when Namespace::SR_DISABLED_AND_UNOVERRIDABLE
+ set_shared_runners_enabled!(false)
+ when Namespace::SR_DISABLED_WITH_OVERRIDE, Namespace::SR_DISABLED_AND_OVERRIDABLE
+ disable_shared_runners_and_allow_override!
+ when Namespace::SR_ENABLED
+ set_shared_runners_enabled!(true)
+ end
end
def update_pending_builds?
@@ -41,5 +48,38 @@ module Groups
::Ci::UpdatePendingBuildService.new(group, pending_builds_params).execute
end
end
+
+ def set_shared_runners_enabled!(enabled)
+ group.update!(
+ shared_runners_enabled: enabled,
+ allow_descendants_override_disabled_shared_runners: false)
+
+ group_ids = group.descendants
+ unless group_ids.empty?
+ Group.by_id(group_ids).update_all(
+ shared_runners_enabled: enabled,
+ allow_descendants_override_disabled_shared_runners: false)
+ end
+
+ group.all_projects.update_all(shared_runners_enabled: enabled)
+ end
+
+ def disable_shared_runners_and_allow_override!
+ # enabled -> disabled_and_overridable
+ if group.shared_runners_enabled?
+ group.update!(
+ shared_runners_enabled: false,
+ allow_descendants_override_disabled_shared_runners: true)
+
+ group_ids = group.descendants
+ Group.by_id(group_ids).update_all(shared_runners_enabled: false) unless group_ids.empty?
+
+ group.all_projects.update_all(shared_runners_enabled: false)
+
+ # disabled_and_unoverridable -> disabled_and_overridable
+ else
+ group.update!(allow_descendants_override_disabled_shared_runners: true)
+ end
+ end
end
end
diff --git a/app/services/import/github_service.rb b/app/services/import/github_service.rb
index 7e7f7ea9810..df255a7ae24 100644
--- a/app/services/import/github_service.rb
+++ b/app/services/import/github_service.rb
@@ -16,7 +16,7 @@ module Import
track_access_level('github')
if project.persisted?
- store_import_settings(project)
+ store_import_settings(project, access_params)
success(project)
elsif project.errors[:import_source_disabled].present?
error(project.errors[:import_source_disabled], :forbidden)
@@ -134,8 +134,13 @@ module Import
error(translated_message, http_status)
end
- def store_import_settings(project)
- Gitlab::GithubImport::Settings.new(project).write(params[:optional_stages])
+ def store_import_settings(project, access_params)
+ Gitlab::GithubImport::Settings
+ .new(project)
+ .write(
+ optional_stages: params[:optional_stages],
+ additional_access_tokens: access_params[:additional_access_tokens]
+ )
end
end
end
diff --git a/app/services/import_csv/base_service.rb b/app/services/import_csv/base_service.rb
index cfaf3e831eb..9c1bad9e7da 100644
--- a/app/services/import_csv/base_service.rb
+++ b/app/services/import_csv/base_service.rb
@@ -8,7 +8,7 @@ module ImportCsv
@user = user
@project = project
@csv_io = csv_io
- @results = { success: 0, error_lines: [], parse_error: false }
+ @results = { success: 0, error_lines: [], parse_error: false, preprocess_errors: {} }
end
PreprocessError = Class.new(StandardError)
diff --git a/app/services/import_csv/preprocess_milestones_service.rb b/app/services/import_csv/preprocess_milestones_service.rb
new file mode 100644
index 00000000000..97fb381c58e
--- /dev/null
+++ b/app/services/import_csv/preprocess_milestones_service.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+module ImportCsv
+ class PreprocessMilestonesService < BaseService
+ def initialize(user, project, provided_titles)
+ @user = user
+ @project = project
+ @provided_titles = provided_titles
+
+ @results = { success: 0, errors: nil }
+ @milestone_errors = { missing: { header: {}, titles: [] } }
+ end
+
+ attr_reader :user, :project, :provided_titles, :results, :milestone_errors
+
+ def execute
+ available_milestones = find_milestones_by_titles
+ return ServiceResponse.success if provided_titles.sort == available_milestones.sort
+
+ milestone_errors[:missing][:header] = 'Milestone'
+ milestone_errors[:missing][:titles] = provided_titles.difference(available_milestones) || []
+ ServiceResponse.error(message: "", payload: milestone_errors)
+ end
+
+ def find_milestones_by_titles
+ # Find if these milestones exist in the project or its group and group ancestors
+ finder_params = {
+ project_ids: [project.id],
+ title: provided_titles
+ }
+ finder_params[:group_ids] = project.group.self_and_ancestors.select(:id) if project.group
+ MilestonesFinder.new(finder_params).execute.map(&:title).uniq
+ end
+ end
+end
diff --git a/app/services/integrations/group_mention_service.rb b/app/services/integrations/group_mention_service.rb
new file mode 100644
index 00000000000..2389bf33432
--- /dev/null
+++ b/app/services/integrations/group_mention_service.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+# GroupMentionService class
+#
+# Used for sending group mention notifications
+#
+# Ex.
+# Integrations::GroupMentionService.new(mentionable, hook_data: data, is_confidential: true).execute
+#
+module Integrations
+ class GroupMentionService
+ def initialize(mentionable, hook_data:, is_confidential:)
+ @mentionable = mentionable
+ @hook_data = hook_data
+ @is_confidential = is_confidential
+ end
+
+ def execute
+ return ServiceResponse.success if mentionable.nil? || hook_data.nil?
+
+ @hook_data = hook_data.clone
+ # Fake a "group_mention" object kind so integrations can handle this as a separate class of event
+ hook_data[:object_attributes][:object_kind] = hook_data[:object_kind]
+ hook_data[:object_kind] = 'group_mention'
+
+ if confidential?
+ hook_data[:event_type] = 'group_confidential_mention'
+ hook_scope = :group_confidential_mention_hooks
+ else
+ hook_data[:event_type] = 'group_mention'
+ hook_scope = :group_mention_hooks
+ end
+
+ groups = mentionable.referenced_groups(mentionable.author)
+ groups.each do |group|
+ group_hook_data = hook_data.merge(
+ mentioned: {
+ object_kind: 'group',
+ name: group.full_path,
+ url: group.web_url
+ }
+ )
+ group.execute_integrations(group_hook_data, hook_scope)
+ end
+
+ ServiceResponse.success
+ end
+
+ private
+
+ attr_reader :mentionable, :hook_data, :is_confidential
+
+ def confidential?
+ return is_confidential if is_confidential.present?
+
+ mentionable.project.visibility_level != Gitlab::VisibilityLevel::PUBLIC
+ end
+ end
+end
diff --git a/app/services/integrations/test/project_service.rb b/app/services/integrations/test/project_service.rb
index 31c8f02c7b6..48240f297fe 100644
--- a/app/services/integrations/test/project_service.rb
+++ b/app/services/integrations/test/project_service.rb
@@ -35,6 +35,8 @@ module Integrations
deployment_events_data
when 'release'
releases_events_data
+ when 'award_emoji'
+ emoji_events_data
end
end
end
diff --git a/app/services/issuable/import_csv/base_service.rb b/app/services/issuable/import_csv/base_service.rb
index 9ef9fb76e3c..95338374ca6 100644
--- a/app/services/issuable/import_csv/base_service.rb
+++ b/app/services/issuable/import_csv/base_service.rb
@@ -23,6 +23,24 @@ module Issuable
raise CSV::MalformedCSVError.new('Invalid CSV format - missing required headers.', 1)
end
+
+ def preprocess!
+ preprocess_milestones!
+
+ raise PreprocessError if results[:preprocess_errors].any?
+ end
+
+ def preprocess_milestones!
+ # Pre-Process Milestone if header is present
+ return unless csv_data.lines.first.downcase.include?('milestone')
+
+ provided_titles = with_csv_lines.filter_map { |row| row[:milestone]&.strip&.downcase }.uniq
+ result = ::ImportCsv::PreprocessMilestonesService.new(user, project, provided_titles).execute
+ return if result.success?
+
+ # collate errors here and throw errors
+ results[:preprocess_errors][:milestone_errors] = result.payload
+ end
end
end
end
diff --git a/app/services/issues/base_service.rb b/app/services/issues/base_service.rb
index f982d66eb08..b9b7cd08b68 100644
--- a/app/services/issues/base_service.rb
+++ b/app/services/issues/base_service.rb
@@ -111,6 +111,10 @@ module Issues
issue.namespace.execute_integrations(issue_data, hooks_scope)
execute_incident_hooks(issue, issue_data) if issue.work_item_type&.incident?
+
+ return unless Feature.enabled?(:group_mentions, issue.project)
+
+ execute_group_mention_hooks(issue, issue_data) if action == 'open'
end
# We can remove this code after proposal in
@@ -121,6 +125,21 @@ module Issues
issue.namespace.execute_integrations(issue_data, :incident_hooks)
end
+ def execute_group_mention_hooks(issue, issue_data)
+ return unless issue.instance_of?(Issue)
+
+ args = {
+ mentionable_type: 'Issue',
+ mentionable_id: issue.id,
+ hook_data: issue_data,
+ is_confidential: issue.confidential?
+ }
+
+ issue.run_after_commit_or_now do
+ Integrations::GroupMentionWorker.perform_async(args)
+ end
+ end
+
def update_project_counter_caches?(issue)
super || issue.confidential_changed?
end
diff --git a/app/services/issues/build_service.rb b/app/services/issues/build_service.rb
index a65fc0c7c87..63cad593936 100644
--- a/app/services/issues/build_service.rb
+++ b/app/services/issues/build_service.rb
@@ -83,18 +83,17 @@ module Issues
params.delete(:work_item_type)
end
- base_type = work_item_type&.base_type
-
- if create_issue_type_allowed?(container, base_type)
- issue.work_item_type = work_item_type
- # Up to this point issue_type might be set to the default, so we need to sync if a work item type is provided
- issue.issue_type = base_type
- else
- # If no work item type was provided or not allowed, we need to set it to issue_type,
- # and that includes the column default
- issue_type = issue_params[:issue_type] || ::Issue::DEFAULT_ISSUE_TYPE
- issue.work_item_type = WorkItems::Type.default_by_type(issue_type)
- end
+ # We need to support the legacy input params[:issue_type] even if we don't have the issue_type column anymore.
+ # In the future only params[:work_item_type] should be provided
+ base_type = work_item_type&.base_type || params[:issue_type]
+
+ issue.work_item_type = if create_issue_type_allowed?(container, base_type)
+ work_item_type || WorkItems::Type.default_by_type(base_type)
+ else
+ # If no work item type was provided or not allowed, we need to set it to
+ # the default issue_type
+ WorkItems::Type.default_by_type(::Issue::DEFAULT_ISSUE_TYPE)
+ end
end
def model_klass
@@ -109,8 +108,6 @@ module Issues
:confidential
]
- public_issue_params << :issue_type if create_issue_type_allowed?(container, params[:issue_type])
-
params.slice(*public_issue_params)
end
diff --git a/app/services/issues/create_service.rb b/app/services/issues/create_service.rb
index 17b6866773e..e1ddfe47439 100644
--- a/app/services/issues/create_service.rb
+++ b/app/services/issues/create_service.rb
@@ -51,6 +51,7 @@ module Issues
# current_user (defined in BaseService) is not available within run_after_commit block
user = current_user
+ assign_description_from_template(issue)
issue.run_after_commit do
NewIssueWorker.perform_async(issue.id, user.id, issue.class.to_s)
Issues::PlacementWorker.perform_async(nil, issue.project_id)
@@ -127,6 +128,35 @@ module Issues
set_crm_contacts(issue, contacts)
end
+
+ def assign_description_from_template(issue)
+ return if issue.description.present?
+
+ # Find the exact name for the default template (if the project has one).
+ # Since there are multiple possibilities regarding the capitalization(s) that the
+ # default template file name can have, getting the exact template name here will
+ # allow us to extract the contents later, and bail early if the project does not have
+ # a default template
+ templates = TemplateFinder.all_template_names(project, :issues)
+ template = templates.values.flatten.find { |tmpl| tmpl[:name].casecmp?('default') }
+
+ return unless template
+
+ begin
+ default_template = TemplateFinder.build(
+ :issues,
+ issue.project,
+ {
+ name: template[:name],
+ source_template_project_id: issue.project.id
+ }
+ ).execute
+ rescue ::Gitlab::Template::Finders::RepoTemplateFinder::FileNotFoundError
+ nil
+ end
+
+ issue.description = default_template.content if default_template.present?
+ end
end
end
diff --git a/app/services/issues/export_csv_service.rb b/app/services/issues/export_csv_service.rb
index 9e524d90505..99c0e9f1a37 100644
--- a/app/services/issues/export_csv_service.rb
+++ b/app/services/issues/export_csv_service.rb
@@ -34,14 +34,14 @@ module Issues
'Assignee Username' => -> (issue) { issue.assignees.map(&:username).join(', ') },
'Confidential' => -> (issue) { issue.confidential? ? 'Yes' : 'No' },
'Locked' => -> (issue) { issue.discussion_locked? ? 'Yes' : 'No' },
- 'Due Date' => -> (issue) { issue.due_date&.to_s(:csv) },
- 'Created At (UTC)' => -> (issue) { issue.created_at&.to_s(:csv) },
- 'Updated At (UTC)' => -> (issue) { issue.updated_at&.to_s(:csv) },
- 'Closed At (UTC)' => -> (issue) { issue.closed_at&.to_s(:csv) },
+ 'Due Date' => -> (issue) { issue.due_date&.to_fs(:csv) },
+ 'Created At (UTC)' => -> (issue) { issue.created_at&.to_fs(:csv) },
+ 'Updated At (UTC)' => -> (issue) { issue.updated_at&.to_fs(:csv) },
+ 'Closed At (UTC)' => -> (issue) { issue.closed_at&.to_fs(:csv) },
'Milestone' => -> (issue) { issue.milestone&.title },
'Weight' => -> (issue) { issue.weight },
'Labels' => -> (issue) { issue_labels(issue) },
- 'Time Estimate' => ->(issue) { issue.time_estimate.to_s(:csv) },
+ 'Time Estimate' => ->(issue) { issue.time_estimate.to_fs(:csv) },
'Time Spent' => -> (issue) { issue_time_spent(issue) }
}
end
diff --git a/app/services/issues/update_service.rb b/app/services/issues/update_service.rb
index 7ad56d5a755..839d0e664a4 100644
--- a/app/services/issues/update_service.rb
+++ b/app/services/issues/update_service.rb
@@ -32,10 +32,9 @@ module Issues
end
def change_work_item_type(issue)
- return unless issue.changed_attributes['issue_type']
+ return unless params[:issue_type].present?
- issue_type = params[:issue_type] || ::Issue::DEFAULT_ISSUE_TYPE
- type_id = find_work_item_type_id(issue_type)
+ type_id = find_work_item_type_id(params[:issue_type])
issue.work_item_type_id = type_id
end
@@ -180,16 +179,22 @@ module Issues
end
def handle_issue_type_change(issue)
- return unless issue.previous_changes.include?('issue_type')
+ return unless issue.previous_changes.include?('work_item_type_id')
do_handle_issue_type_change(issue)
end
def do_handle_issue_type_change(issue)
- SystemNoteService.change_issue_type(issue, current_user, issue.issue_type_before_last_save)
+ old_work_item_type = ::WorkItems::Type.find(issue.work_item_type_id_before_last_save).base_type
+ SystemNoteService.change_issue_type(issue, current_user, old_work_item_type)
::IncidentManagement::IssuableEscalationStatuses::CreateService.new(issue).execute if issue.supports_escalation?
end
+
+ override :allowed_update_params
+ def allowed_update_params(params)
+ super.except(:issue_type)
+ end
end
end
diff --git a/app/services/members/creator_service.rb b/app/services/members/creator_service.rb
index 699c5b94c53..a6fff3003ac 100644
--- a/app/services/members/creator_service.rb
+++ b/app/services/members/creator_service.rb
@@ -34,16 +34,7 @@ module Members
# @param sources [Group, Project, Array<Group>, Array<Project>, Group::ActiveRecord_Relation,
# Project::ActiveRecord_Relation] - Can't be an array of source ids because we don't know the type of source.
# @return Array<Member>
- def add_members(
- sources,
- invitees,
- access_level,
- current_user: nil,
- expires_at: nil,
- tasks_to_be_done: [],
- tasks_project_id: nil,
- ldap: nil
- ) # rubocop:disable Metrics/ParameterLists
+ def add_members(sources, invitees, access_level, **args)
return [] unless invitees.present?
sources = Array.wrap(sources) if sources.is_a?(ApplicationRecord) # For single source
@@ -51,7 +42,9 @@ module Members
Member.transaction do
sources.flat_map do |source|
# If this user is attempting to manage Owner members and doesn't have permission, do not allow
- next [] if managing_owners?(current_user, access_level) && cannot_manage_owners?(source, current_user)
+ if managing_owners?(args[:current_user], access_level) && cannot_manage_owners?(source, args[:current_user])
+ next []
+ end
emails, users, existing_members = parse_users_list(source, invitees)
@@ -59,12 +52,8 @@ module Members
source: source,
access_level: access_level,
existing_members: existing_members,
- current_user: current_user,
- expires_at: expires_at,
- tasks_to_be_done: tasks_to_be_done,
- tasks_project_id: tasks_project_id,
- ldap: ldap
- }
+ tasks_to_be_done: args[:tasks_to_be_done] || []
+ }.merge(parsed_args(args))
members = emails.map do |email|
new(invitee: email, builder: InviteMemberBuilder, **common_arguments).execute
@@ -79,26 +68,21 @@ module Members
end
end
- def add_member(
- source,
- invitee,
- access_level,
- current_user: nil,
- expires_at: nil,
- ldap: nil
- ) # rubocop:disable Metrics/ParameterLists
- add_members(
- source,
- [invitee],
- access_level,
- current_user: current_user,
- expires_at: expires_at,
- ldap: ldap
- ).first
+ def add_member(source, invitee, access_level, **args)
+ add_members(source, [invitee], access_level, **args).first
end
private
+ def parsed_args(args)
+ {
+ current_user: args[:current_user],
+ expires_at: args[:expires_at],
+ tasks_project_id: args[:tasks_project_id],
+ ldap: args[:ldap]
+ }
+ end
+
def managing_owners?(current_user, access_level)
current_user && Gitlab::Access.sym_options_with_owner[access_level] == Gitlab::Access::OWNER
end
diff --git a/app/services/members/groups/creator_service.rb b/app/services/members/groups/creator_service.rb
index dd3d44e4d96..864be01a96d 100644
--- a/app/services/members/groups/creator_service.rb
+++ b/app/services/members/groups/creator_service.rb
@@ -21,3 +21,5 @@ module Members
end
end
end
+
+Members::Groups::CreatorService.prepend_mod_with('Members::Groups::CreatorService')
diff --git a/app/services/merge_requests/base_service.rb b/app/services/merge_requests/base_service.rb
index ec8a17162ca..aaa91548d19 100644
--- a/app/services/merge_requests/base_service.rb
+++ b/app/services/merge_requests/base_service.rb
@@ -36,6 +36,10 @@ module MergeRequests
execute_external_hooks(merge_request, merge_data)
+ if action == 'open' && Feature.enabled?(:group_mentions, merge_request.project)
+ execute_group_mention_hooks(merge_request, merge_data)
+ end
+
enqueue_jira_connect_messages_for(merge_request)
end
@@ -43,6 +47,21 @@ module MergeRequests
# Implemented in EE
end
+ def execute_group_mention_hooks(merge_request, merge_data)
+ return unless merge_request.instance_of?(MergeRequest)
+
+ args = {
+ mentionable_type: 'MergeRequest',
+ mentionable_id: merge_request.id,
+ hook_data: merge_data,
+ is_confidential: false
+ }
+
+ merge_request.run_after_commit_or_now do
+ Integrations::GroupMentionWorker.perform_async(args)
+ end
+ end
+
def handle_changes(merge_request, options)
old_associations = options.fetch(:old_associations, {})
old_assignees = old_associations.fetch(:assignees, [])
diff --git a/app/services/merge_requests/cleanup_refs_service.rb b/app/services/merge_requests/cleanup_refs_service.rb
index 2094ea00160..5081655601b 100644
--- a/app/services/merge_requests/cleanup_refs_service.rb
+++ b/app/services/merge_requests/cleanup_refs_service.rb
@@ -16,7 +16,6 @@ module MergeRequests
@merge_request = merge_request
@repository = merge_request.project.repository
@ref_path = merge_request.ref_path
- @merge_ref_path = merge_request.merge_ref_path
@ref_head_sha = @repository.commit(merge_request.ref_path)&.id
@merge_ref_sha = merge_request.merge_ref_head&.id
end
@@ -42,7 +41,7 @@ module MergeRequests
private
- attr_reader :repository, :ref_path, :merge_ref_path, :ref_head_sha, :merge_ref_sha
+ attr_reader :repository, :ref_path, :ref_head_sha, :merge_ref_sha
def scheduled?
merge_request.cleanup_schedule.present? && merge_request.cleanup_schedule.scheduled_at <= Time.current
@@ -79,7 +78,7 @@ module MergeRequests
end
def delete_refs
- repository.delete_refs(ref_path, merge_ref_path)
+ merge_request.schedule_cleanup_refs
end
def update_schedule
diff --git a/app/services/merge_requests/merge_to_ref_service.rb b/app/services/merge_requests/merge_to_ref_service.rb
index 1bd26f06e41..acd3bc36e1d 100644
--- a/app/services/merge_requests/merge_to_ref_service.rb
+++ b/app/services/merge_requests/merge_to_ref_service.rb
@@ -56,13 +56,6 @@ module MergeRequests
params[:first_parent_ref] || merge_request.target_branch_ref
end
- ##
- # The parameter `allow_conflicts` is a flag whether merge conflicts should be merged into diff
- # Default is false
- def allow_conflicts
- params[:allow_conflicts] || false
- end
-
def commit(cache_merge_to_ref_calls = false)
if cache_merge_to_ref_calls
Rails.cache.fetch(cache_key, expires_in: 1.day) do
@@ -79,8 +72,7 @@ module MergeRequests
branch: merge_request.target_branch,
target_ref: target_ref,
message: commit_message,
- first_parent_ref: first_parent_ref,
- allow_conflicts: allow_conflicts)
+ first_parent_ref: first_parent_ref)
rescue Gitlab::Git::PreReceiveError, Gitlab::Git::CommandError => error
raise MergeError, error.message
end
diff --git a/app/services/merge_requests/mergeability_check_batch_service.rb b/app/services/merge_requests/mergeability_check_batch_service.rb
new file mode 100644
index 00000000000..7697b596a83
--- /dev/null
+++ b/app/services/merge_requests/mergeability_check_batch_service.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+module MergeRequests
+ class MergeabilityCheckBatchService
+ def initialize(merge_requests, user)
+ @merge_requests = merge_requests
+ @user = user
+ end
+
+ def execute
+ return unless merge_requests.present?
+
+ MergeRequests::MergeabilityCheckBatchWorker.perform_async(merge_requests.map(&:id), user&.id)
+ end
+
+ private
+
+ attr_reader :merge_requests, :user
+ end
+end
diff --git a/app/services/merge_requests/refresh_service.rb b/app/services/merge_requests/refresh_service.rb
index d6740cdf1ac..447f4f9428c 100644
--- a/app/services/merge_requests/refresh_service.rb
+++ b/app/services/merge_requests/refresh_service.rb
@@ -169,7 +169,13 @@ module MergeRequests
@outdate_service ||= Suggestions::OutdateService.new
end
+ def abort_auto_merges?(merge_request)
+ merge_request.merge_params.with_indifferent_access[:sha] != @push.newrev
+ end
+
def abort_auto_merges(merge_request)
+ return unless abort_auto_merges?(merge_request)
+
abort_auto_merge(merge_request, 'source branch was updated')
end
diff --git a/app/services/milestones/create_service.rb b/app/services/milestones/create_service.rb
index 6c3edd2e147..e8a14adc10d 100644
--- a/app/services/milestones/create_service.rb
+++ b/app/services/milestones/create_service.rb
@@ -5,11 +5,19 @@ module Milestones
def execute
milestone = parent.milestones.new(params)
+ before_create(milestone)
+
if milestone.save && milestone.project_milestone?
event_service.open_milestone(milestone, current_user)
end
milestone
end
+
+ private
+
+ def before_create(milestone)
+ milestone.check_for_spam(user: current_user, action: :create)
+ end
end
end
diff --git a/app/services/milestones/update_service.rb b/app/services/milestones/update_service.rb
index b9a12a35d31..90cb8ea9f5c 100644
--- a/app/services/milestones/update_service.rb
+++ b/app/services/milestones/update_service.rb
@@ -13,11 +13,22 @@ module Milestones
end
if params.present?
- milestone.update(params.except(:state_event))
+ milestone.assign_attributes(params.except(:state_event))
end
+ if milestone.changed?
+ before_update(milestone)
+ end
+
+ milestone.save
milestone
end
+
+ private
+
+ def before_update(milestone)
+ milestone.check_for_spam(user: current_user, action: :update)
+ end
end
end
diff --git a/app/services/namespace_settings/update_service.rb b/app/services/namespace_settings/update_service.rb
index 25525265e1c..c391320db5e 100644
--- a/app/services/namespace_settings/update_service.rb
+++ b/app/services/namespace_settings/update_service.rb
@@ -23,6 +23,12 @@ module NamespaceSettings
param_key: :new_user_signups_cap,
user_policy: :change_new_user_signups_cap
)
+ validate_settings_param_for_root_group(
+ param_key: :default_branch_protection,
+ user_policy: :update_default_branch_protection
+ )
+
+ handle_default_branch_protection unless settings_params[:default_branch_protection].blank?
if group.namespace_settings
group.namespace_settings.attributes = settings_params
@@ -33,6 +39,17 @@ module NamespaceSettings
private
+ def handle_default_branch_protection
+ # We are migrating default_branch_protection from an integer
+ # column to a jsonb column. While completing the rest of the
+ # work, we want to start translating the updates sent to the
+ # existing column into the json. Eventually, we will be updating
+ # the jsonb column directly and deprecating the original update
+ # path. Until then, we want to sync up both columns.
+ protection = Gitlab::Access::BranchProtection.new(settings_params.delete(:default_branch_protection).to_i)
+ settings_params[:default_branch_protection_defaults] = protection.to_hash
+ end
+
def validate_resource_access_token_creation_allowed_param
return if settings_params[:resource_access_token_creation_allowed].nil?
diff --git a/app/services/notes/post_process_service.rb b/app/services/notes/post_process_service.rb
index c9375fe14a1..9465b5218b0 100644
--- a/app/services/notes/post_process_service.rb
+++ b/app/services/notes/post_process_service.rb
@@ -36,10 +36,19 @@ module Notes
return unless note.project
note_data = hook_data
- hooks_scope = note.confidential?(include_noteable: true) ? :confidential_note_hooks : :note_hooks
+ is_confidential = note.confidential?(include_noteable: true)
+ hooks_scope = is_confidential ? :confidential_note_hooks : :note_hooks
note.project.execute_hooks(note_data, hooks_scope)
note.project.execute_integrations(note_data, hooks_scope)
+
+ return unless Feature.enabled?(:group_mentions, note.project)
+
+ execute_group_mention_hooks(note, note_data, is_confidential)
+ end
+
+ def execute_group_mention_hooks(note, note_data, is_confidential)
+ Integrations::GroupMentionService.new(note, hook_data: note_data, is_confidential: is_confidential).execute
end
end
end
diff --git a/app/services/packages/debian/find_or_create_package_service.rb b/app/services/packages/debian/find_or_create_package_service.rb
deleted file mode 100644
index a9481504d2b..00000000000
--- a/app/services/packages/debian/find_or_create_package_service.rb
+++ /dev/null
@@ -1,42 +0,0 @@
-# frozen_string_literal: true
-
-module Packages
- module Debian
- class FindOrCreatePackageService < ::Packages::CreatePackageService
- include Gitlab::Utils::StrongMemoize
-
- def execute
- packages = project.packages
- .existing_debian_packages_with(name: params[:name], version: params[:version])
-
- package = packages.with_debian_codename_or_suite(params[:distribution_name]).first
-
- unless package
- package_in_other_distribution = packages.first
-
- if package_in_other_distribution
- raise ArgumentError, "Debian package #{params[:name]} #{params[:version]} exists " \
- "in distribution #{package_in_other_distribution.debian_distribution.codename}"
- end
- end
-
- package ||= create_package!(
- :debian,
- debian_publication_attributes: { distribution_id: distribution.id }
- )
-
- ServiceResponse.success(payload: { package: package })
- end
-
- private
-
- def distribution
- Packages::Debian::DistributionsFinder.new(
- project,
- codename_or_suite: params[:distribution_name]
- ).execute.last!
- end
- strong_memoize_attr :distribution
- end
- end
-end
diff --git a/app/services/packages/debian/process_changes_service.rb b/app/services/packages/debian/process_changes_service.rb
deleted file mode 100644
index eb88e7c9b59..00000000000
--- a/app/services/packages/debian/process_changes_service.rb
+++ /dev/null
@@ -1,113 +0,0 @@
-# frozen_string_literal: true
-
-module Packages
- module Debian
- class ProcessChangesService
- include ExclusiveLeaseGuard
- include Gitlab::Utils::StrongMemoize
-
- # used by ExclusiveLeaseGuard
- DEFAULT_LEASE_TIMEOUT = 1.hour.to_i.freeze
-
- def initialize(package_file, creator)
- @package_file = package_file
- @creator = creator
- end
-
- def execute
- # return if changes file has already been processed
- return if package_file.debian_file_metadatum&.changes?
-
- validate!
-
- try_obtain_lease do
- package_file.transaction do
- update_files_metadata
- update_changes_metadata
- end
-
- ::Packages::Debian::GenerateDistributionWorker.perform_async(:project, package.debian_distribution.id)
- end
- end
-
- private
-
- attr_reader :package_file, :creator
-
- def validate!
- raise ArgumentError, 'invalid package file' unless package_file.debian_file_metadatum
- raise ArgumentError, 'invalid package file' unless package_file.debian_file_metadatum.unknown?
- raise ArgumentError, 'invalid package file' unless metadata[:file_type] == :changes
- raise ArgumentError, 'missing Source field' unless metadata.dig(:fields, 'Source').present?
- raise ArgumentError, 'missing Version field' unless metadata.dig(:fields, 'Version').present?
- raise ArgumentError, 'missing Distribution field' unless metadata.dig(:fields, 'Distribution').present?
- end
-
- def update_files_metadata
- files.each do |filename, entry|
- file_metadata = ::Packages::Debian::ExtractMetadataService.new(entry.package_file).execute
-
- ::Packages::UpdatePackageFileService.new(entry.package_file, package_id: package.id)
- .execute
-
- # Force reload from database, as package has changed
- entry.package_file.reload_package
-
- entry.package_file.debian_file_metadatum.update!(
- file_type: file_metadata[:file_type],
- component: files[filename].component,
- architecture: file_metadata[:architecture],
- fields: file_metadata[:fields]
- )
- end
- end
-
- def update_changes_metadata
- ::Packages::UpdatePackageFileService.new(package_file, package_id: package.id)
- .execute
-
- # Force reload from database, as package has changed
- package_file.reload_package
-
- package_file.debian_file_metadatum.update!(
- file_type: metadata[:file_type],
- fields: metadata[:fields]
- )
- end
-
- def metadata
- ::Packages::Debian::ExtractChangesMetadataService.new(package_file).execute
- end
- strong_memoize_attr :metadata
-
- def files
- metadata[:files]
- end
-
- def project
- package_file.package.project
- end
-
- def package
- params = {
- name: metadata[:fields]['Source'],
- version: metadata[:fields]['Version'],
- distribution_name: metadata[:fields]['Distribution']
- }
- response = Packages::Debian::FindOrCreatePackageService.new(project, creator, params).execute
- response.payload[:package]
- end
- strong_memoize_attr :package
-
- # used by ExclusiveLeaseGuard
- def lease_key
- "packages:debian:process_changes_service:package_file:#{package_file.id}"
- end
-
- # used by ExclusiveLeaseGuard
- def lease_timeout
- DEFAULT_LEASE_TIMEOUT
- end
- end
- end
-end
diff --git a/app/services/packages/npm/create_metadata_cache_service.rb b/app/services/packages/npm/create_metadata_cache_service.rb
index 75cff5c5453..f470b9f1202 100644
--- a/app/services/packages/npm/create_metadata_cache_service.rb
+++ b/app/services/packages/npm/create_metadata_cache_service.rb
@@ -30,7 +30,7 @@ module Packages
attr_reader :package_name, :project
def metadata_content
- metadata.payload.to_json
+ ::API::Entities::NpmPackage.represent(metadata.payload).to_json
end
strong_memoize_attr :metadata_content
diff --git a/app/services/packages/npm/create_package_service.rb b/app/services/packages/npm/create_package_service.rb
index 2c578760cc5..f6f2dbb8415 100644
--- a/app/services/packages/npm/create_package_service.rb
+++ b/app/services/packages/npm/create_package_service.rb
@@ -18,7 +18,7 @@ module Packages
ApplicationRecord.transaction { create_npm_package! }
end
- return error('Could not obtain package lease.', 400) unless package
+ return error('Could not obtain package lease. Please try again.', 400) unless package
package
end
@@ -40,7 +40,7 @@ module Packages
def create_npm_metadatum!(package)
package.create_npm_metadatum!(package_json: package_json)
rescue ActiveRecord::RecordInvalid => e
- if package.npm_metadatum && package.npm_metadatum.errors.added?(:package_json, 'structure is too large')
+ if package.npm_metadatum && package.npm_metadatum.errors.where(:package_json, :too_large).any? # rubocop: disable CodeReuse/ActiveRecord
Gitlab::ErrorTracking.track_exception(e, field_sizes: field_sizes_for_error_tracking)
end
diff --git a/app/services/packages/npm/deprecate_package_service.rb b/app/services/packages/npm/deprecate_package_service.rb
index 2633e9f877c..bca81ebe1de 100644
--- a/app/services/packages/npm/deprecate_package_service.rb
+++ b/app/services/packages/npm/deprecate_package_service.rb
@@ -31,7 +31,7 @@ module Packages
def packages
::Packages::Npm::PackageFinder
- .new(params['package_name'], project: project, last_of_each_version: false)
+ .new(params['package_name'], project: project)
.execute
end
diff --git a/app/services/packages/npm/generate_metadata_service.rb b/app/services/packages/npm/generate_metadata_service.rb
index 800c3ce19b4..e1795079513 100644
--- a/app/services/packages/npm/generate_metadata_service.rb
+++ b/app/services/packages/npm/generate_metadata_service.rb
@@ -98,7 +98,7 @@ module Packages
end
def package_tags
- Packages::Tag.for_package_ids(packages.last_of_each_version_ids)
+ Packages::Tag.for_package_ids(packages)
.preload_package
end
diff --git a/app/services/packages/nuget/extract_metadata_content_service.rb b/app/services/packages/nuget/extract_metadata_content_service.rb
new file mode 100644
index 00000000000..28653654018
--- /dev/null
+++ b/app/services/packages/nuget/extract_metadata_content_service.rb
@@ -0,0 +1,85 @@
+# frozen_string_literal: true
+
+module Packages
+ module Nuget
+ class ExtractMetadataContentService
+ ROOT_XPATH = '//xmlns:package/xmlns:metadata/xmlns'
+
+ XPATHS = {
+ package_name: "#{ROOT_XPATH}:id",
+ package_version: "#{ROOT_XPATH}:version",
+ authors: "#{ROOT_XPATH}:authors",
+ description: "#{ROOT_XPATH}:description",
+ license_url: "#{ROOT_XPATH}:licenseUrl",
+ project_url: "#{ROOT_XPATH}:projectUrl",
+ icon_url: "#{ROOT_XPATH}:iconUrl"
+ }.freeze
+
+ XPATH_DEPENDENCIES = "#{ROOT_XPATH}:dependencies/xmlns:dependency".freeze
+ XPATH_DEPENDENCY_GROUPS = "#{ROOT_XPATH}:dependencies/xmlns:group".freeze
+ XPATH_TAGS = "#{ROOT_XPATH}:tags".freeze
+ XPATH_PACKAGE_TYPES = "#{ROOT_XPATH}:packageTypes/xmlns:packageType".freeze
+
+ def initialize(nuspec_file_content)
+ @nuspec_file_content = nuspec_file_content
+ end
+
+ def execute
+ ServiceResponse.success(payload: extract_metadata(nuspec_file_content))
+ end
+
+ private
+
+ attr_reader :nuspec_file_content
+
+ def extract_metadata(file)
+ doc = Nokogiri::XML(file)
+
+ XPATHS.transform_values { |query| doc.xpath(query).text.presence }
+ .compact
+ .tap do |metadata|
+ metadata[:package_dependencies] = extract_dependencies(doc)
+ metadata[:package_tags] = extract_tags(doc)
+ metadata[:package_types] = extract_package_types(doc)
+ end
+ end
+
+ def extract_dependencies(doc)
+ dependencies = []
+
+ doc.xpath(XPATH_DEPENDENCIES).each do |node|
+ dependencies << extract_dependency(node)
+ end
+
+ doc.xpath(XPATH_DEPENDENCY_GROUPS).each do |group_node|
+ target_framework = group_node.attr('targetFramework')
+
+ group_node.xpath('xmlns:dependency').each do |node|
+ dependencies << extract_dependency(node).merge(target_framework: target_framework)
+ end
+ end
+
+ dependencies
+ end
+
+ def extract_dependency(node)
+ {
+ name: node.attr('id'),
+ version: node.attr('version')
+ }.compact
+ end
+
+ def extract_tags(doc)
+ tags = doc.xpath(XPATH_TAGS).text
+
+ return [] if tags.blank?
+
+ tags.split(::Packages::Tag::NUGET_TAGS_SEPARATOR)
+ end
+
+ def extract_package_types(doc)
+ doc.xpath(XPATH_PACKAGE_TYPES).map { |node| node.attr('name') }.uniq
+ end
+ end
+ end
+end
diff --git a/app/services/packages/nuget/extract_metadata_file_service.rb b/app/services/packages/nuget/extract_metadata_file_service.rb
new file mode 100644
index 00000000000..61e4892fee7
--- /dev/null
+++ b/app/services/packages/nuget/extract_metadata_file_service.rb
@@ -0,0 +1,62 @@
+# frozen_string_literal: true
+
+module Packages
+ module Nuget
+ class ExtractMetadataFileService
+ include Gitlab::Utils::StrongMemoize
+
+ ExtractionError = Class.new(StandardError)
+
+ MAX_FILE_SIZE = 4.megabytes.freeze
+
+ def initialize(package_file_id)
+ @package_file_id = package_file_id
+ end
+
+ def execute
+ raise ExtractionError, 'invalid package file' unless valid_package_file?
+
+ ServiceResponse.success(payload: nuspec_file_content)
+ end
+
+ private
+
+ attr_reader :package_file_id
+
+ def package_file
+ ::Packages::PackageFile.find_by_id(package_file_id)
+ end
+ strong_memoize_attr :package_file
+
+ def valid_package_file?
+ package_file &&
+ package_file.package&.nuget? &&
+ package_file.file.size > 0 # rubocop:disable Style/ZeroLengthPredicate
+ end
+
+ def nuspec_file_content
+ with_zip_file do |zip_file|
+ entry = zip_file.glob('*.nuspec').first
+
+ raise ExtractionError, 'nuspec file not found' unless entry
+ raise ExtractionError, 'nuspec file too big' if MAX_FILE_SIZE < entry.size
+
+ Tempfile.open("nuget_extraction_package_file_#{package_file_id}") do |file|
+ entry.extract(file.path) { true } # allow #extract to overwrite the file
+ file.unlink
+ file.read
+ end
+ rescue Zip::EntrySizeError => e
+ raise ExtractionError, "nuspec file has the wrong entry size: #{e.message}"
+ end
+ end
+
+ def with_zip_file
+ package_file.file.use_open_file do |open_file|
+ zip_file = Zip::File.new(open_file, false, true) # rubocop:disable Performance/Rubyzip
+ yield(zip_file)
+ end
+ end
+ end
+ end
+end
diff --git a/app/services/packages/nuget/metadata_extraction_service.rb b/app/services/packages/nuget/metadata_extraction_service.rb
index 5c60a2912ae..e1ee29ef2c6 100644
--- a/app/services/packages/nuget/metadata_extraction_service.rb
+++ b/app/services/packages/nuget/metadata_extraction_service.rb
@@ -3,123 +3,30 @@
module Packages
module Nuget
class MetadataExtractionService
- include Gitlab::Utils::StrongMemoize
-
- ExtractionError = Class.new(StandardError)
-
- ROOT_XPATH = '//xmlns:package/xmlns:metadata/xmlns'
-
- XPATHS = {
- package_name: "#{ROOT_XPATH}:id",
- package_version: "#{ROOT_XPATH}:version",
- authors: "#{ROOT_XPATH}:authors",
- description: "#{ROOT_XPATH}:description",
- license_url: "#{ROOT_XPATH}:licenseUrl",
- project_url: "#{ROOT_XPATH}:projectUrl",
- icon_url: "#{ROOT_XPATH}:iconUrl"
- }.freeze
-
- XPATH_DEPENDENCIES = "#{ROOT_XPATH}:dependencies/xmlns:dependency".freeze
- XPATH_DEPENDENCY_GROUPS = "#{ROOT_XPATH}:dependencies/xmlns:group".freeze
- XPATH_TAGS = "#{ROOT_XPATH}:tags".freeze
- XPATH_PACKAGE_TYPES = "#{ROOT_XPATH}:packageTypes/xmlns:packageType".freeze
-
- MAX_FILE_SIZE = 4.megabytes.freeze
-
def initialize(package_file_id)
@package_file_id = package_file_id
end
def execute
- raise ExtractionError, 'invalid package file' unless valid_package_file?
-
- extract_metadata(nuspec_file_content)
+ ServiceResponse.success(payload: metadata)
end
private
- def package_file
- ::Packages::PackageFile.find_by_id(@package_file_id)
- end
- strong_memoize_attr :package_file
-
- def valid_package_file?
- package_file &&
- package_file.package&.nuget? &&
- package_file.file.size > 0 # rubocop:disable Style/ZeroLengthPredicate
- end
-
- def extract_metadata(file)
- doc = Nokogiri::XML(file)
-
- XPATHS.transform_values { |query| doc.xpath(query).text.presence }
- .compact
- .tap do |metadata|
- metadata[:package_dependencies] = extract_dependencies(doc)
- metadata[:package_tags] = extract_tags(doc)
- metadata[:package_types] = extract_package_types(doc)
- end
- end
-
- def extract_dependencies(doc)
- dependencies = []
-
- doc.xpath(XPATH_DEPENDENCIES).each do |node|
- dependencies << extract_dependency(node)
- end
-
- doc.xpath(XPATH_DEPENDENCY_GROUPS).each do |group_node|
- target_framework = group_node.attr("targetFramework")
-
- group_node.xpath("xmlns:dependency").each do |node|
- dependencies << extract_dependency(node).merge(target_framework: target_framework)
- end
- end
-
- dependencies
- end
-
- def extract_dependency(node)
- {
- name: node.attr('id'),
- version: node.attr('version')
- }.compact
- end
-
- def extract_package_types(doc)
- doc.xpath(XPATH_PACKAGE_TYPES).map { |node| node.attr('name') }.uniq
- end
-
- def extract_tags(doc)
- tags = doc.xpath(XPATH_TAGS).text
-
- return [] if tags.blank?
-
- tags.split(::Packages::Tag::NUGET_TAGS_SEPARATOR)
- end
+ attr_reader :package_file_id
def nuspec_file_content
- with_zip_file do |zip_file|
- entry = zip_file.glob('*.nuspec').first
-
- raise ExtractionError, 'nuspec file not found' unless entry
- raise ExtractionError, 'nuspec file too big' if MAX_FILE_SIZE < entry.size
-
- Tempfile.open("nuget_extraction_package_file_#{@package_file_id}") do |file|
- entry.extract(file.path) { true } # allow #extract to overwrite the file
- file.unlink
- file.read
- end
- rescue Zip::EntrySizeError => e
- raise ExtractionError, "nuspec file has the wrong entry size: #{e.message}"
- end
+ ExtractMetadataFileService
+ .new(package_file_id)
+ .execute
+ .payload
end
- def with_zip_file(&block)
- package_file.file.use_open_file do |open_file|
- zip_file = Zip::File.new(open_file, false, true)
- yield(zip_file)
- end
+ def metadata
+ ExtractMetadataContentService
+ .new(nuspec_file_content)
+ .execute
+ .payload
end
end
end
diff --git a/app/services/packages/nuget/update_package_from_metadata_service.rb b/app/services/packages/nuget/update_package_from_metadata_service.rb
index 8e2679db31b..d82509fff5e 100644
--- a/app/services/packages/nuget/update_package_from_metadata_service.rb
+++ b/app/services/packages/nuget/update_package_from_metadata_service.rb
@@ -145,7 +145,7 @@ module Packages
end
def metadata
- ::Packages::Nuget::MetadataExtractionService.new(@package_file.id).execute
+ ::Packages::Nuget::MetadataExtractionService.new(@package_file.id).execute.payload
end
strong_memoize_attr :metadata
diff --git a/app/services/personal_access_tokens/last_used_service.rb b/app/services/personal_access_tokens/last_used_service.rb
index 6fc3110a70b..3b075364458 100644
--- a/app/services/personal_access_tokens/last_used_service.rb
+++ b/app/services/personal_access_tokens/last_used_service.rb
@@ -24,12 +24,7 @@ module PersonalAccessTokens
return true if last_used.nil?
- if Feature.enabled?(:update_personal_access_token_usage_information_every_10_minutes) &&
- last_used <= 10.minutes.ago
- return true
- end
-
- last_used <= 1.day.ago
+ last_used <= 10.minutes.ago
end
end
end
diff --git a/app/services/personal_access_tokens/revoke_token_family_service.rb b/app/services/personal_access_tokens/revoke_token_family_service.rb
new file mode 100644
index 00000000000..547ba6c3bdc
--- /dev/null
+++ b/app/services/personal_access_tokens/revoke_token_family_service.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+module PersonalAccessTokens
+ class RevokeTokenFamilyService
+ def initialize(token)
+ @token = token
+ end
+
+ def execute
+ # Despite using #update_all, there should only be a single active token.
+ # A token family is a chain of rotated tokens. Once rotated, the
+ # previous token is revoked.
+ pat_family.active.update_all(revoked: true)
+
+ ServiceResponse.success
+ end
+
+ private
+
+ attr_reader :token
+
+ def pat_family
+ # rubocop: disable CodeReuse/ActiveRecord
+ cte = Gitlab::SQL::RecursiveCTE.new(:personal_access_tokens_cte)
+ personal_access_token_table = Arel::Table.new(:personal_access_tokens)
+
+ cte << PersonalAccessToken
+ .where(personal_access_token_table[:previous_personal_access_token_id].eq(token.id))
+ cte << PersonalAccessToken
+ .from([personal_access_token_table, cte.table])
+ .where(personal_access_token_table[:previous_personal_access_token_id].eq(cte.table[:id]))
+ PersonalAccessToken.with.recursive(cte.to_arel).from(cte.alias_to(personal_access_token_table))
+ # rubocop: enable CodeReuse/ActiveRecord
+ end
+ end
+end
diff --git a/app/services/personal_access_tokens/rotate_service.rb b/app/services/personal_access_tokens/rotate_service.rb
index 64b0c5c98a9..b765aacef68 100644
--- a/app/services/personal_access_tokens/rotate_service.rb
+++ b/app/services/personal_access_tokens/rotate_service.rb
@@ -41,6 +41,7 @@ module PersonalAccessTokens
def create_token_params(token)
{ name: token.name,
+ previous_personal_access_token_id: token.id,
impersonation: token.impersonation,
scopes: token.scopes,
expires_at: Date.today + EXPIRATION_PERIOD }
diff --git a/app/services/projects/destroy_service.rb b/app/services/projects/destroy_service.rb
index 2279ab301dc..a5c12384b59 100644
--- a/app/services/projects/destroy_service.rb
+++ b/app/services/projects/destroy_service.rb
@@ -58,6 +58,10 @@ module Projects
unless remove_repository(project.wiki.repository)
raise_error(s_('DeleteProject|Failed to remove wiki repository. Please try again or contact administrator.'))
end
+
+ unless remove_repository(project.design_repository)
+ raise_error(s_('DeleteProject|Failed to remove design repository. Please try again or contact administrator.'))
+ end
end
def trash_relation_repositories!
diff --git a/app/services/projects/download_service.rb b/app/services/projects/download_service.rb
index 72cb3997045..22104409199 100644
--- a/app/services/projects/download_service.rb
+++ b/app/services/projects/download_service.rb
@@ -2,7 +2,7 @@
module Projects
class DownloadService < BaseService
- WHITELIST = [
+ ALLOWLIST = [
/^[^.]+\.fogbugz.com$/
].freeze
@@ -33,7 +33,7 @@ module Projects
def valid_domain?(url)
host = URI.parse(url).host
- WHITELIST.any? { |entry| entry === host }
+ ALLOWLIST.any? { |entry| entry === host }
end
end
end
diff --git a/app/services/projects/participants_service.rb b/app/services/projects/participants_service.rb
index 8c807e0016b..44cd6e9926f 100644
--- a/app/services/projects/participants_service.rb
+++ b/app/services/projects/participants_service.rb
@@ -30,6 +30,8 @@ module Projects
end
def all_members
+ return [] if Feature.enabled?(:disable_all_mention)
+
[{ username: "all", name: "All Project and Group Members", count: project_members.count }]
end
diff --git a/app/services/projects/prometheus/alerts/notify_service.rb b/app/services/projects/prometheus/alerts/notify_service.rb
index f1c093c89b7..22a882c4648 100644
--- a/app/services/projects/prometheus/alerts/notify_service.rb
+++ b/app/services/projects/prometheus/alerts/notify_service.rb
@@ -89,7 +89,9 @@ module Projects
# AlertManagement::HttpIntegrations is complete,
# we should use use the HttpIntegration as SSOT.
# Remove with https://gitlab.com/gitlab-org/gitlab/-/issues/409734
- return false if project.alert_management_http_integrations.legacy.prometheus.any?
+ return false if project.alert_management_http_integrations
+ .for_endpoint_identifier('legacy-prometheus')
+ .any?
prometheus = project.find_or_initialize_integration('prometheus')
return false unless prometheus.manual_configuration?
diff --git a/app/services/projects/update_remote_mirror_service.rb b/app/services/projects/update_remote_mirror_service.rb
index b048ec128d8..d5c8e958bbd 100644
--- a/app/services/projects/update_remote_mirror_service.rb
+++ b/app/services/projects/update_remote_mirror_service.rb
@@ -93,7 +93,7 @@ module Projects
# TODO: Support LFS sync over SSH
# https://gitlab.com/gitlab-org/gitlab/-/issues/249587
- return unless remote_mirror.url =~ %r{\Ahttps?://}i
+ return unless %r{\Ahttps?://}i.match?(remote_mirror.url)
return unless remote_mirror.password_auth?
Lfs::PushService.new(
diff --git a/app/services/quick_actions/interpret_service.rb b/app/services/quick_actions/interpret_service.rb
index b5f6bff756b..d1798ce6fc0 100644
--- a/app/services/quick_actions/interpret_service.rb
+++ b/app/services/quick_actions/interpret_service.rb
@@ -188,7 +188,8 @@ module QuickActions
next unless definition
definition.execute(self, arg)
- usage_ping_tracking(definition.name, arg)
+ # summarize_diff will be removed https://gitlab.com/gitlab-org/gitlab/-/issues/407258#note_1385269274
+ usage_ping_tracking(definition.name, arg) unless definition.name == :summarize_diff
end
end
diff --git a/app/services/search/project_service.rb b/app/services/search/project_service.rb
index 71314f85984..73d46a9ba70 100644
--- a/app/services/search/project_service.rb
+++ b/app/services/search/project_service.rb
@@ -4,7 +4,6 @@ module Search
class ProjectService
include Search::Filter
include Gitlab::Utils::StrongMemoize
- include ProjectsHelper
ALLOWED_SCOPES = %w(blobs issues merge_requests wiki_blobs commits notes milestones users).freeze
@@ -18,13 +17,13 @@ module Search
def execute
Gitlab::ProjectSearchResults.new(current_user,
- params[:search],
- project: project,
- repository_ref: params[:repository_ref],
- order_by: params[:order_by],
- sort: params[:sort],
- filters: filters
- )
+ params[:search],
+ project: project,
+ repository_ref: params[:repository_ref],
+ order_by: params[:order_by],
+ sort: params[:sort],
+ filters: filters
+ )
end
def allowed_scopes
@@ -33,10 +32,12 @@ module Search
def scope
strong_memoize(:scope) do
- next params[:scope] if allowed_scopes.include?(params[:scope]) && project_search_tabs?(params[:scope].to_sym)
+ search_navigation = Search::Navigation.new(user: current_user, project: project)
+ scope = params[:scope]
+ next scope if allowed_scopes.include?(scope) && search_navigation.tab_enabled_for_project?(scope.to_sym)
- allowed_scopes.find do |scope|
- project_search_tabs?(scope.to_sym)
+ allowed_scopes.find do |s|
+ search_navigation.tab_enabled_for_project?(s.to_sym)
end
end
end
diff --git a/app/services/search_service.rb b/app/services/search_service.rb
index 5705e4c7cef..433e9b0da6d 100644
--- a/app/services/search_service.rb
+++ b/app/services/search_service.rb
@@ -102,16 +102,6 @@ class SearchService
end
end
- def show_elasticsearch_tabs?
- # overridden in EE
- false
- end
-
- def show_epics?
- # overridden in EE
- false
- end
-
def global_search_enabled_for_scope?
return false if show_snippets? && Feature.disabled?(:global_search_snippet_titles_tab, current_user, type: :ops)
diff --git a/app/services/service_desk/custom_emails/base_service.rb b/app/services/service_desk/custom_emails/base_service.rb
new file mode 100644
index 00000000000..62152f31012
--- /dev/null
+++ b/app/services/service_desk/custom_emails/base_service.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+module ServiceDesk
+ module CustomEmails
+ class BaseService < ::BaseProjectService
+ private
+
+ def legitimate_user?
+ can?(current_user, :admin_project, project)
+ end
+
+ def setting?
+ project.service_desk_setting.present?
+ end
+
+ def credential?
+ project.service_desk_custom_email_verification.present?
+ end
+
+ def verification?
+ project.service_desk_custom_email_credential.present?
+ end
+
+ def feature_flag_enabled?
+ Feature.enabled?(:service_desk_custom_email, project)
+ end
+
+ def error_user_not_authorized
+ error_response(s_('ServiceDesk|User cannot manage project.'))
+ end
+
+ def error_feature_flag_disabled
+ error_response('Feature flag service_desk_custom_email is not enabled')
+ end
+
+ def error_response(message)
+ ServiceResponse.error(message: message)
+ end
+ end
+ end
+end
diff --git a/app/services/service_desk/custom_emails/create_service.rb b/app/services/service_desk/custom_emails/create_service.rb
new file mode 100644
index 00000000000..c3ca98a0259
--- /dev/null
+++ b/app/services/service_desk/custom_emails/create_service.rb
@@ -0,0 +1,85 @@
+# frozen_string_literal: true
+
+module ServiceDesk
+ module CustomEmails
+ class CreateService < BaseService
+ def execute
+ return error_feature_flag_disabled unless feature_flag_enabled?
+ return error_user_not_authorized unless legitimate_user?
+ return error_params_missing unless has_required_params?
+ return error_custom_email_exists if credential? || verification?
+
+ return error_cannot_create_custom_email unless create_credential
+
+ if update_settings.error?
+ # We don't warp everything in a single transaction here and roll it back
+ # because ServiceDeskSettings::UpdateService uses safe_find_or_create_by!
+ rollback_credential
+ return error_cannot_create_custom_email
+ end
+
+ project.reset
+
+ # The create service may return an error response if the verification fails early.
+ # Here We want to indicate whether adding a custom email address was successful, so
+ # we don't use its response here.
+ create_verification
+
+ ServiceResponse.success
+ end
+
+ private
+
+ def update_settings
+ ServiceDeskSettings::UpdateService.new(project, current_user, create_setting_params).execute
+ end
+
+ def rollback_credential
+ ::ServiceDesk::CustomEmailCredential.find_by_project_id(project.id)&.destroy
+ end
+
+ def create_credential
+ credential = ::ServiceDesk::CustomEmailCredential.new(create_credential_params.merge(project: project))
+ credential.save
+ end
+
+ def create_verification
+ ::ServiceDesk::CustomEmailVerifications::CreateService.new(project: project, current_user: current_user).execute
+ end
+
+ def create_setting_params
+ ensure_params.permit(:custom_email)
+ end
+
+ def create_credential_params
+ ensure_params.permit(:smtp_address, :smtp_port, :smtp_username, :smtp_password)
+ end
+
+ def ensure_params
+ return params if params.is_a?(ActionController::Parameters)
+
+ ActionController::Parameters.new(params)
+ end
+
+ def has_required_params?
+ required_keys.all? { |key| params.key?(key) && params[key].present? }
+ end
+
+ def required_keys
+ %i[custom_email smtp_address smtp_port smtp_username smtp_password]
+ end
+
+ def error_custom_email_exists
+ error_response(s_('ServiceDesk|Custom email already exists'))
+ end
+
+ def error_params_missing
+ error_response(s_('ServiceDesk|Parameters missing'))
+ end
+
+ def error_cannot_create_custom_email
+ error_response(s_('ServiceDesk|Cannot create custom email'))
+ end
+ end
+ end
+end
diff --git a/app/services/service_desk/custom_emails/destroy_service.rb b/app/services/service_desk/custom_emails/destroy_service.rb
new file mode 100644
index 00000000000..1aa5994edd8
--- /dev/null
+++ b/app/services/service_desk/custom_emails/destroy_service.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+module ServiceDesk
+ module CustomEmails
+ class DestroyService < BaseService
+ def execute
+ return error_feature_flag_disabled unless feature_flag_enabled?
+ return error_user_not_authorized unless legitimate_user?
+ return error_does_not_exist unless verification? || credential? || setting?
+
+ project.service_desk_custom_email_verification&.destroy
+ project.service_desk_custom_email_credential&.destroy
+ project.reset
+ project.service_desk_setting&.update!(custom_email: nil, custom_email_enabled: false)
+
+ ServiceResponse.success
+ end
+
+ private
+
+ def error_does_not_exist
+ error_response(s_('ServiceDesk|Custom email does not exist'))
+ end
+ end
+ end
+end
diff --git a/app/services/service_desk_settings/update_service.rb b/app/services/service_desk_settings/update_service.rb
index 5fe74f1f2ff..61cb6fce11f 100644
--- a/app/services/service_desk_settings/update_service.rb
+++ b/app/services/service_desk_settings/update_service.rb
@@ -8,9 +8,9 @@ module ServiceDeskSettings
params[:project_key] = nil if params[:project_key].blank?
if settings.update(params)
- success
+ ServiceResponse.success
else
- error(settings.errors.full_messages.to_sentence)
+ ServiceResponse.error(message: settings.errors.full_messages.to_sentence)
end
end
end
diff --git a/app/services/service_response.rb b/app/services/service_response.rb
index da4773ab9c7..86efc01bd30 100644
--- a/app/services/service_response.rb
+++ b/app/services/service_response.rb
@@ -56,6 +56,10 @@ class ServiceResponse
reason: reason)
end
+ def deconstruct_keys(keys)
+ to_h.slice(*keys)
+ end
+
def success?
status == :success
end
diff --git a/app/services/spam/spam_verdict_service.rb b/app/services/spam/spam_verdict_service.rb
index 2ecd431fd91..e0a6d58b904 100644
--- a/app/services/spam/spam_verdict_service.rb
+++ b/app/services/spam/spam_verdict_service.rb
@@ -85,7 +85,7 @@ module Spam
# than the override verdict's priority value), then we don't need to override it.
return false if SUPPORTED_VERDICTS[verdict][:priority] > SUPPORTED_VERDICTS[OVERRIDE_VIA_ALLOW_POSSIBLE_SPAM][:priority]
- target.allow_possible_spam?
+ target.allow_possible_spam?(user) || user.allow_possible_spam?
end
def spamcheck_client
diff --git a/app/services/system_notes/merge_requests_service.rb b/app/services/system_notes/merge_requests_service.rb
index 7758c1e8597..d71388a1552 100644
--- a/app/services/system_notes/merge_requests_service.rb
+++ b/app/services/system_notes/merge_requests_service.rb
@@ -181,3 +181,5 @@ module SystemNotes
end
end
end
+
+SystemNotes::MergeRequestsService.prepend_mod_with('SystemNotes::MergeRequestsService')
diff --git a/app/services/system_notes/time_tracking_service.rb b/app/services/system_notes/time_tracking_service.rb
index b7a2afbaf15..f9084ed67d3 100644
--- a/app/services/system_notes/time_tracking_service.rb
+++ b/app/services/system_notes/time_tracking_service.rb
@@ -147,9 +147,9 @@ module SystemNotes
readable_date = date_key.humanize.downcase
if changed_date.nil?
- "removed #{readable_date} #{changed_dates[date_key].first.to_s(:long)}"
+ "removed #{readable_date} #{changed_dates[date_key].first.to_fs(:long)}"
else
- "changed #{readable_date} to #{changed_date.to_s(:long)}"
+ "changed #{readable_date} to #{changed_date.to_fs(:long)}"
end
end
diff --git a/app/services/test_hooks/project_service.rb b/app/services/test_hooks/project_service.rb
index dcd92ac2b8c..42af65ebd57 100644
--- a/app/services/test_hooks/project_service.rb
+++ b/app/services/test_hooks/project_service.rb
@@ -32,6 +32,8 @@ module TestHooks
wiki_page_events_data
when 'releases_events'
releases_events_data
+ when 'emoji_events'
+ emoji_events_data
end
end
end
diff --git a/app/services/todo_service.rb b/app/services/todo_service.rb
index c55e1680bfe..1f6cf2c83c9 100644
--- a/app/services/todo_service.rb
+++ b/app/services/todo_service.rb
@@ -377,7 +377,7 @@ class TodoService
attributes = {
project_id: target&.project&.id,
target_id: target.id,
- target_type: target.class.name,
+ target_type: target.class.try(:polymorphic_name) || target.class.name,
commit_id: nil
}
diff --git a/app/services/users/allow_possible_spam_service.rb b/app/services/users/allow_possible_spam_service.rb
new file mode 100644
index 00000000000..d9273fe0fc1
--- /dev/null
+++ b/app/services/users/allow_possible_spam_service.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+module Users
+ class AllowPossibleSpamService < BaseService
+ def initialize(current_user)
+ @current_user = current_user
+ end
+
+ def execute(user)
+ custom_attribute = {
+ user_id: user.id,
+ key: UserCustomAttribute::ALLOW_POSSIBLE_SPAM,
+ value: "#{current_user.username}/#{current_user.id}+#{Time.current}"
+ }
+ UserCustomAttribute.upsert_custom_attributes([custom_attribute])
+ end
+ end
+end
diff --git a/app/services/users/ban_service.rb b/app/services/users/ban_service.rb
index 5ed31cdb778..20c34b15f15 100644
--- a/app/services/users/ban_service.rb
+++ b/app/services/users/ban_service.rb
@@ -2,6 +2,8 @@
module Users
class BanService < BannedUserBaseService
+ extend ::Gitlab::Utils::Override
+
private
def update_user(user)
@@ -15,6 +17,11 @@ module Users
def action
:ban
end
+
+ override :track_event
+ def track_event(user)
+ experiment(:phone_verification_for_low_risk_users, user: user).track(:banned)
+ end
end
end
diff --git a/app/services/users/banned_user_base_service.rb b/app/services/users/banned_user_base_service.rb
index 74c10581a6e..cec351904a9 100644
--- a/app/services/users/banned_user_base_service.rb
+++ b/app/services/users/banned_user_base_service.rb
@@ -12,6 +12,7 @@ module Users
if update_user(user)
log_event(user)
+ track_event(user)
success
else
messages = user.errors.full_messages
@@ -23,6 +24,9 @@ module Users
attr_reader :current_user
+ # Overridden in Users::BanService
+ def track_event(_); end
+
def state_error(user)
error(_("You cannot %{action} %{state} users." % { action: action.to_s, state: user.state }), :forbidden)
end
diff --git a/app/services/users/disallow_possible_spam_service.rb b/app/services/users/disallow_possible_spam_service.rb
new file mode 100644
index 00000000000..e31ba7ddff0
--- /dev/null
+++ b/app/services/users/disallow_possible_spam_service.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+module Users
+ class DisallowPossibleSpamService < BaseService
+ def initialize(current_user)
+ @current_user = current_user
+ end
+
+ def execute(user)
+ user.custom_attributes.by_key(UserCustomAttribute::ALLOW_POSSIBLE_SPAM).delete_all
+ end
+ end
+end
diff --git a/app/services/web_hook_service.rb b/app/services/web_hook_service.rb
index 9ab6fcc9832..6837bc47035 100644
--- a/app/services/web_hook_service.rb
+++ b/app/services/web_hook_service.rb
@@ -189,6 +189,7 @@ class WebHookService
'Content-Type' => 'application/json',
'User-Agent' => "GitLab/#{Gitlab::VERSION}",
Gitlab::WebHooks::GITLAB_EVENT_HEADER => self.class.hook_to_event(hook_name),
+ Gitlab::WebHooks::GITLAB_UUID_HEADER => SecureRandom.uuid,
Gitlab::WebHooks::GITLAB_INSTANCE_HEADER => Gitlab.config.gitlab.base_url
}
diff --git a/app/services/work_items/export_csv_service.rb b/app/services/work_items/export_csv_service.rb
index ee20a2832ce..74bc1f526bf 100644
--- a/app/services/work_items/export_csv_service.rb
+++ b/app/services/work_items/export_csv_service.rb
@@ -28,7 +28,7 @@ module WorkItems
'Type' => ->(work_item) { work_item.work_item_type.name },
'Author' => 'author_name',
'Author Username' => ->(work_item) { work_item.author.username },
- 'Created At (UTC)' => ->(work_item) { work_item.created_at.to_s(:csv) }
+ 'Created At (UTC)' => ->(work_item) { work_item.created_at.to_fs(:csv) }
}
end
diff --git a/app/uploaders/file_uploader.rb b/app/uploaders/file_uploader.rb
index f947f70985c..87a624ddb60 100644
--- a/app/uploaders/file_uploader.rb
+++ b/app/uploaders/file_uploader.rb
@@ -165,7 +165,7 @@ class FileUploader < GitlabUploader
def secret
@secret ||= self.class.generate_secret
- raise InvalidSecret unless @secret =~ VALID_SECRET_PATTERN
+ raise InvalidSecret unless VALID_SECRET_PATTERN.match?(@secret)
@secret
end
diff --git a/app/validators/abstract_path_validator.rb b/app/validators/abstract_path_validator.rb
index ff390a624c5..29620543a0f 100644
--- a/app/validators/abstract_path_validator.rb
+++ b/app/validators/abstract_path_validator.rb
@@ -21,7 +21,7 @@ class AbstractPathValidator < ActiveModel::EachValidator
end
def validate_each(record, attribute, value)
- unless value =~ self.class.format_regex
+ unless self.class.format_regex.match?(value)
record.errors.add(attribute, self.class.format_error_message)
return
end
diff --git a/app/validators/cluster_name_validator.rb b/app/validators/cluster_name_validator.rb
index 79c9c67ae58..527116ba69b 100644
--- a/app/validators/cluster_name_validator.rb
+++ b/app/validators/cluster_name_validator.rb
@@ -16,7 +16,7 @@ class ClusterNameValidator < ActiveModel::EachValidator
record.errors.add(attribute, " is invalid syntax")
end
- unless value =~ Gitlab::Regex.kubernetes_namespace_regex
+ unless Gitlab::Regex.kubernetes_namespace_regex.match(value)
record.errors.add(attribute, Gitlab::Regex.kubernetes_namespace_regex_message)
end
end
diff --git a/app/validators/cron_validator.rb b/app/validators/cron_validator.rb
index 91b9cfcccc4..c12b29410d4 100644
--- a/app/validators/cron_validator.rb
+++ b/app/validators/cron_validator.rb
@@ -1,16 +1,16 @@
# frozen_string_literal: true
class CronValidator < ActiveModel::EachValidator
- ATTRIBUTE_WHITELIST = %i[cron freeze_start freeze_end].freeze
+ ATTRIBUTE_ALLOWLIST = %i[cron freeze_start freeze_end].freeze
- NonWhitelistedAttributeError = Class.new(StandardError)
+ NonAllowlistedAttributeError = Class.new(StandardError)
def validate_each(record, attribute, value)
- if ATTRIBUTE_WHITELIST.include?(attribute)
+ if ATTRIBUTE_ALLOWLIST.include?(attribute)
cron_parser = Gitlab::Ci::CronParser.new(record.public_send(attribute), record.cron_timezone) # rubocop:disable GitlabSecurity/PublicSend
record.errors.add(attribute, " is invalid syntax") unless cron_parser.cron_valid?
else
- raise NonWhitelistedAttributeError, "Non-whitelisted attribute"
+ raise NonAllowlistedAttributeError, "Non-allowlisted attribute"
end
end
end
diff --git a/app/validators/devise_email_validator.rb b/app/validators/devise_email_validator.rb
index 6ca921ca7fa..b91cfe23f08 100644
--- a/app/validators/devise_email_validator.rb
+++ b/app/validators/devise_email_validator.rb
@@ -31,6 +31,6 @@ class DeviseEmailValidator < ActiveModel::EachValidator
end
def validate_each(record, attribute, value)
- record.errors.add(attribute, :invalid) unless value =~ options[:regexp]
+ record.errors.add(attribute, :invalid) unless options[:regexp].match?(value)
end
end
diff --git a/app/validators/json_schemas/default_branch_protection_defaults.json b/app/validators/json_schemas/default_branch_protection_defaults.json
index bd2945c08fb..d93527ad0a4 100644
--- a/app/validators/json_schemas/default_branch_protection_defaults.json
+++ b/app/validators/json_schemas/default_branch_protection_defaults.json
@@ -62,14 +62,8 @@
"code_owner_approval_required": {
"type": "boolean"
},
- "merge_access_level": {
- "type": "integer"
- },
- "push_access_level": {
- "type": "integer"
- },
- "unprotect_access_level": {
- "type": "integer"
+ "developer_can_initial_push": {
+ "type": "boolean"
}
},
"additionalProperties": false
diff --git a/app/validators/json_schemas/organization_settings.json b/app/validators/json_schemas/organization_settings.json
new file mode 100644
index 00000000000..350ce7d9066
--- /dev/null
+++ b/app/validators/json_schemas/organization_settings.json
@@ -0,0 +1,14 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "description": "Settings for Organizations",
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "restricted_visibility_levels": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ }
+ }
+}
diff --git a/app/validators/json_schemas/scan_result_policy_vulnerability_attributes.json b/app/validators/json_schemas/scan_result_policy_vulnerability_attributes.json
new file mode 100644
index 00000000000..e0051179a1d
--- /dev/null
+++ b/app/validators/json_schemas/scan_result_policy_vulnerability_attributes.json
@@ -0,0 +1,14 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "description": "Scan result policy vulnerability_attributes",
+ "type": "object",
+ "properties": {
+ "false_positive": {
+ "type": "boolean"
+ },
+ "fix_available": {
+ "type": "boolean"
+ }
+ },
+ "additionalProperties": false
+}
diff --git a/app/validators/json_schemas/security_ci_configuration_schemas/sast_ui_schema.json b/app/validators/json_schemas/security_ci_configuration_schemas/sast_ui_schema.json
index fb6b80e0725..9cfb62d4439 100644
--- a/app/validators/json_schemas/security_ci_configuration_schemas/sast_ui_schema.json
+++ b/app/validators/json_schemas/security_ci_configuration_schemas/sast_ui_schema.json
@@ -32,12 +32,12 @@
},
{
"field": "SEARCH_MAX_DEPTH",
- "label": "Search maximum depth",
+ "label": "Search Maximum Depth",
"type": "string",
"default_value": "",
"value": "",
"size": "SMALL",
- "description": "Maximum depth of language and framework detection"
+ "description": "Specifies the number of directory levels to be included in the repository search phase during SAST analysis. SAST scanner searches through the repository to detect the programming languages used and selects the corresponding analyzers. After that, the entire repository is analyzed."
}
],
"analyzers": [
@@ -80,56 +80,72 @@
"label": "Kubesec",
"enabled": true,
"description": "Kubernetes manifests, Helm Charts",
- "variables": []
+ "variables": [
+
+ ]
},
{
"name": "nodejs-scan",
"label": "Node.js Scan",
"enabled": true,
"description": "Node.js",
- "variables": []
+ "variables": [
+
+ ]
},
{
"name": "phpcs-security-audit",
"label": "PHP Security Audit",
"enabled": true,
"description": "PHP",
- "variables": []
+ "variables": [
+
+ ]
},
{
"name": "pmd-apex",
"label": "PMD APEX",
"enabled": true,
"description": "Apex (Salesforce)",
- "variables": []
+ "variables": [
+
+ ]
},
{
"name": "security-code-scan",
"label": "Security Code Scan",
"enabled": true,
"description": ".NET Core, .NET Framework",
- "variables": []
+ "variables": [
+
+ ]
},
{
"name": "semgrep",
"label": "Semgrep",
"enabled": true,
"description": "Multi-language scanning",
- "variables": []
+ "variables": [
+
+ ]
},
{
"name": "sobelow",
"label": "Sobelow",
"enabled": true,
"description": "Elixir (Phoenix)",
- "variables": []
+ "variables": [
+
+ ]
},
{
"name": "spotbugs",
"label": "Spotbugs",
"enabled": true,
"description": "Groovy, Java, Scala",
- "variables": []
+ "variables": [
+
+ ]
}
]
-} \ No newline at end of file
+}
diff --git a/app/validators/line_code_validator.rb b/app/validators/line_code_validator.rb
index a351180790e..e1abccc1dff 100644
--- a/app/validators/line_code_validator.rb
+++ b/app/validators/line_code_validator.rb
@@ -7,7 +7,7 @@ class LineCodeValidator < ActiveModel::EachValidator
PATTERN = /\A[a-z0-9]+_\d+_\d+\z/.freeze
def validate_each(record, attribute, value)
- unless value =~ PATTERN
+ unless PATTERN.match?(value)
record.errors.add(attribute, "must be a valid line code")
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 d29fa9c5b85..af67ed28309 100644
--- a/app/views/admin/application_settings/_account_and_limit.html.haml
+++ b/app/views/admin/application_settings/_account_and_limit.html.haml
@@ -51,11 +51,11 @@
= f.text_field :user_default_internal_regex, placeholder: _('Regex pattern'), class: 'form-control gl-form-input gl-mt-2'
.help-block
= _('Specify an email address regex pattern to identify default internal users.')
- = link_to _('Learn more.'), help_page_path('user/admin_area/external_users', anchor: 'set-a-new-user-to-external'), target: '_blank', rel: 'noopener noreferrer'
+ = link_to _('Learn more.'), help_page_path('administration/external_users', anchor: 'set-a-new-user-to-external'), target: '_blank', rel: 'noopener noreferrer'
- unless Gitlab.com?
.form-group
= f.label :deactivate_dormant_users, _('Dormant users'), class: 'label-bold'
- - dormant_users_help_link = help_page_path('user/admin_area/moderate_users', anchor: 'automatically-deactivate-dormant-users')
+ - dormant_users_help_link = help_page_path('administration/moderate_users', anchor: 'automatically-deactivate-dormant-users')
- dormant_users_help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: dormant_users_help_link }
= f.gitlab_ui_checkbox_component :deactivate_dormant_users, _('Deactivate dormant users after a period of inactivity'), help_text: _('Users can reactivate their account by signing in. %{link_start}Learn more.%{link_end}').html_safe % { link_start: dormant_users_help_link_start, link_end: '</a>'.html_safe }
.form-group
diff --git a/app/views/admin/application_settings/_ai_access.html.haml b/app/views/admin/application_settings/_ai_access.html.haml
index 41b0a08128e..97f46adef51 100644
--- a/app/views/admin/application_settings/_ai_access.html.haml
+++ b/app/views/admin/application_settings/_ai_access.html.haml
@@ -12,8 +12,7 @@
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded ? _('Collapse') : _('Expand')
%p
- = s_('CodeSuggestionsSM|Enable Code Suggestion for users of this GitLab instance.')
- = link_to sprite_icon('question-o'), code_suggestions_docs_url, target: '_blank', class: 'has-tooltip', title: _('More information')
+ = code_suggestions_description
.settings-content
= gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-ai-access-settings'), html: { class: 'fieldset-form', id: 'ai-access-settings' } do |f|
@@ -22,7 +21,7 @@
%fieldset
.form-group
= f.gitlab_ui_checkbox_component :instance_level_code_suggestions_enabled,
- s_('CodeSuggestionsSM|Turn on Code Suggestions for this instance. By turning on this feature, you:'),
+ s_('CodeSuggestionsSM|Enable Code Suggestions for this instance %{beta}').html_safe % { beta: gl_badge_tag(_('Beta'), variant: :neutral, size: :sm) },
help_text: code_suggestions_agreement
= f.label :ai_access_token, token_label, class: 'label-bold'
= f.password_field :ai_access_token, value: token_value, autocomplete: 'on', class: 'form-control gl-form-input', aria: { describedby: 'code_suggestions_token_explanation' }
diff --git a/app/views/admin/application_settings/_ci_cd.html.haml b/app/views/admin/application_settings/_ci_cd.html.haml
index 0c9d5a5a8df..0125c83dc72 100644
--- a/app/views/admin/application_settings/_ci_cd.html.haml
+++ b/app/views/admin/application_settings/_ci_cd.html.haml
@@ -28,13 +28,13 @@
= f.number_field :max_artifacts_size, class: 'form-control gl-form-input'
.form-text.text-muted
= _("The maximum file size for job artifacts.")
- = link_to _('Learn more.'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'maximum-artifacts-size')
+ = link_to _('Learn more.'), help_page_path('administration/settings/continuous_integration', anchor: 'maximum-artifacts-size')
.form-group
= f.label :default_artifacts_expire_in, _('Default artifacts expiration'), class: 'label-bold'
= f.text_field :default_artifacts_expire_in, class: 'form-control gl-form-input'
.form-text.text-muted
= html_escape(_("Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}.")) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
- = link_to _('Learn more.'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'default-artifacts-expiration')
+ = link_to _('Learn more.'), help_page_path('administration/settings/continuous_integration', anchor: 'default-artifacts-expiration')
.form-group
= f.gitlab_ui_checkbox_component :keep_latest_artifact, s_('AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines'), help_text: s_('AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire.')
.form-group
@@ -42,7 +42,7 @@
= f.text_field :archive_builds_in_human_readable, class: 'form-control gl-form-input'
.form-text.text-muted
= html_escape(_("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.")) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
- = link_to _('Learn more.'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'archive-jobs')
+ = link_to _('Learn more.'), help_page_path('administration/settings/continuous_integration', anchor: 'archive-jobs')
.form-group
= f.gitlab_ui_checkbox_component :protected_ci_variables, s_('AdminSettings|Protect CI/CD variables by default'), help_text: s_('AdminSettings|New CI/CD variables in projects and groups default to protected.')
.form-group
diff --git a/app/views/admin/application_settings/_diff_limits.html.haml b/app/views/admin/application_settings/_diff_limits.html.haml
index 153600f1299..f8bd5b68431 100644
--- a/app/views/admin/application_settings/_diff_limits.html.haml
+++ b/app/views/admin/application_settings/_diff_limits.html.haml
@@ -9,7 +9,7 @@
= _("Diff files surpassing this limit will be presented as 'too large' and won't be expandable.")
= link_to sprite_icon('question-o'),
- help_page_path('user/admin_area/diff_limits',
+ help_page_path('administration/diff_limits',
anchor: 'diff-limits-administration')
= f.label :diff_max_files, _('Maximum files in a diff'), class: 'label-light'
@@ -18,7 +18,7 @@
= _("Diff files surpassing this limit will be presented as 'too large' and won't be expandable.")
= link_to sprite_icon('question-o'),
- help_page_path('user/admin_area/diff_limits',
+ help_page_path('administration/diff_limits',
anchor: 'diff-limits-administration')
= f.label :diff_max_lines, _('Maximum lines in a diff'), class: 'label-light'
@@ -27,6 +27,6 @@
= _("Diff files surpassing this limit will be presented as 'too large' and won't be expandable.")
= link_to sprite_icon('question-o'),
- help_page_path('user/admin_area/diff_limits',
+ help_page_path('administration/diff_limits',
anchor: 'diff-limits-administration')
= f.submit _('Save changes'), pajamas_button: true
diff --git a/app/views/admin/application_settings/_email.html.haml b/app/views/admin/application_settings/_email.html.haml
index 80a7d3607ef..2f31eb5f6d1 100644
--- a/app/views/admin/application_settings/_email.html.haml
+++ b/app/views/admin/application_settings/_email.html.haml
@@ -10,7 +10,7 @@
= f.label :commit_email_hostname, _('Custom hostname (for private commit emails)'), class: 'label-bold'
= f.text_field :commit_email_hostname, class: 'form-control gl-form-input'
.form-text.text-muted
- - commit_email_hostname_docs_link = link_to _('Learn more'), help_page_path('user/admin_area/settings/email.md', anchor: 'custom-hostname-for-private-commit-emails'), target: '_blank', rel: 'noopener noreferrer'
+ - commit_email_hostname_docs_link = link_to _('Learn more'), help_page_path('administration/settings/email.md', anchor: 'custom-hostname-for-private-commit-emails'), target: '_blank', rel: 'noopener noreferrer'
= _("Hostname used in private commit emails. %{learn_more}").html_safe % { learn_more: commit_email_hostname_docs_link }
= render_if_exists 'admin/application_settings/email_additional_text_setting', form: f
diff --git a/app/views/admin/application_settings/_error_tracking.html.haml b/app/views/admin/application_settings/_error_tracking.html.haml
index aa42cd99e89..b57371286d5 100644
--- a/app/views/admin/application_settings/_error_tracking.html.haml
+++ b/app/views/admin/application_settings/_error_tracking.html.haml
@@ -20,9 +20,9 @@
%p.text-secondary
= s_("ErrorTracking|Access token is %{token_in_code_tag}").html_safe % { token_in_code_tag: content_tag(:code, Gitlab::CurrentSettings.error_tracking_access_token, id: 'error-tracking-access-token') }
.form-inline
- = button_to _("Reset error tracking access token"), reset_error_tracking_access_token_admin_application_settings_path,
- method: :put, class: 'gl-button btn btn-danger btn-sm',
- data: { confirm: _('Are you sure you want to reset the error tracking access token?') }
+ - reset_url = reset_error_tracking_access_token_admin_application_settings_url
+ = render Pajamas::ButtonComponent.new(method: :put, href: reset_url, variant: :danger, size: :small, button_options: { data: { confirm: _('Are you sure you want to reset the error tracking access token?') }}) do
+ = _("Reset error tracking access token")
= gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-error-tracking-settings'), html: { class: 'fieldset-form', id: 'error-tracking-settings' } do |f|
= form_errors(@application_setting) if expanded
diff --git a/app/views/admin/application_settings/_gitlab_shell_operation_limits.html.haml b/app/views/admin/application_settings/_gitlab_shell_operation_limits.html.haml
new file mode 100644
index 00000000000..4bd44b922fa
--- /dev/null
+++ b/app/views/admin/application_settings/_gitlab_shell_operation_limits.html.haml
@@ -0,0 +1,19 @@
+%section.settings.no-animate#js-gitlab-shell-operation-limits-settings{ class: ('expanded' if expanded_by_default?), 'data-testid': 'gitlab-shell-operation-limits' }
+ .settings-header
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
+ = s_('ShellOperations|Git SSH operations rate limit')
+ = render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
+ = expanded_by_default? ? _('Collapse') : _('Expand')
+ %p
+ = s_('ShellOperations|Limit the number of Git operations a user can perform per minute, per repository.')
+ = link_to _('Learn more.'), help_page_path('user/admin_area/settings/rate_limits_on_git_ssh_operations.md'), target: '_blank', rel: 'noopener noreferrer'
+ .settings-content
+ = gitlab_ui_form_for @application_setting, url: network_admin_application_settings_path(anchor: 'js-gitlab-shell-operation-limits-settings'), html: { class: 'fieldset-form' } do |f|
+ = form_errors(@application_setting)
+
+ %fieldset
+ .form-group
+ = f.label :gitlab_shell_operation_limit, s_('ShellOperations|Maximum number of Git operations per minute'), class: 'gl-font-bold'
+ = f.number_field :gitlab_shell_operation_limit, class: 'form-control gl-form-input'
+
+ = f.submit _('Save changes'), pajamas_button: true
diff --git a/app/views/admin/application_settings/_help_page.html.haml b/app/views/admin/application_settings/_help_page.html.haml
index e76a83662af..9509806fc41 100644
--- a/app/views/admin/application_settings/_help_page.html.haml
+++ b/app/views/admin/application_settings/_help_page.html.haml
@@ -18,7 +18,7 @@
.form-group
= f.label :help_page_documentation_base_url, _('Documentation pages URL'), class: 'gl-font-weight-bold'
= f.text_field :help_page_documentation_base_url, class: 'form-control gl-form-input', placeholder: 'https://docs.gitlab.com'
- - docs_link_url = help_page_path('user/admin_area/settings/help_page', anchor: 'destination-requirements')
+ - docs_link_url = help_page_path('administration/settings/help_page', anchor: 'destination-requirements')
- docs_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: docs_link_url }
%span.form-text.text-muted#support_help_block= html_escape(_('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}')) % { code_start: '<code>'.html_safe, help_text_url: help_url, code_end: '</code>'.html_safe, docs_link_start: docs_link_start, docs_link_end: '</a>'.html_safe }
= f.submit _('Save changes'), pajamas_button: true
diff --git a/app/views/admin/application_settings/_localization.html.haml b/app/views/admin/application_settings/_localization.html.haml
index 669c47bafba..19d321ca205 100644
--- a/app/views/admin/application_settings/_localization.html.haml
+++ b/app/views/admin/application_settings/_localization.html.haml
@@ -7,7 +7,7 @@
= f.select :first_day_of_week, first_day_of_week_choices, {}, class: 'form-control'
.form-text.text-muted
= _('Default first day of the week in calendars and date pickers.')
- = link_to _('Learn more.'), help_page_path('user/admin_area/settings/index.md', anchor: 'default-first-day-of-the-week'), target: '_blank', rel: 'noopener noreferrer'
+ = link_to _('Learn more.'), help_page_path('administration/settings/index.md', anchor: 'default-first-day-of-the-week'), target: '_blank', rel: 'noopener noreferrer'
.form-group
= f.label :time_tracking, _('Time tracking'), class: 'label-bold'
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 53832e93ed2..b112c273aad 100644
--- a/app/views/admin/application_settings/_runner_registrars_form.html.haml
+++ b/app/views/admin/application_settings/_runner_registrars_form.html.haml
@@ -7,7 +7,7 @@
= s_('Runners|Runner version management')
%span.form-text.gl-mb-3.gl-mt-0
- help_text = s_('Runners|Official runner version data is periodically fetched from GitLab.com to determine whether the runners need upgrades.')
- - learn_more_link = link_to _('Learn more.'), help_page_path('ci/runners/configure_runners.md', anchor: 'determine-which-runners-need-to-be-upgraded'), target: '_blank', rel: 'noopener noreferrer'
+ - learn_more_link = link_to _('Learn more.'), help_page_path('ci/runners/runners_scope.md', anchor: 'determine-which-runners-need-to-be-upgraded'), target: '_blank', rel: 'noopener noreferrer'
= f.gitlab_ui_checkbox_component :update_runner_versions_enabled,
s_('Runners|Fetch GitLab Runner release version data from GitLab.com'),
help_text: '%{help_text} %{learn_more_link}'.html_safe % { help_text: help_text, learn_more_link: learn_more_link }
@@ -16,7 +16,7 @@
= s_('Runners|Runner registration')
%span.form-text.gl-mb-3.gl-mt-0
= s_('Runners|If both settings are disabled, new runners cannot be registered.')
- = link_to _('Learn more.'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'restrict-runner-registration-by-all-users-in-an-instance'), target: '_blank', rel: 'noopener noreferrer'
+ = link_to _('Learn more.'), help_page_path('administration/settings/continuous_integration', anchor: 'restrict-runner-registration-by-all-users-in-an-instance'), 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 },
diff --git a/app/views/admin/application_settings/_signin.html.haml b/app/views/admin/application_settings/_signin.html.haml
index 85841059c5e..5518122b5cf 100644
--- a/app/views/admin/application_settings/_signin.html.haml
+++ b/app/views/admin/application_settings/_signin.html.haml
@@ -32,7 +32,7 @@
= f.label :admin_mode, _('Admin mode'), class: 'label-bold'
= sprite_icon('lock', css_class: 'gl-icon')
- 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'
+ - help_link = link_to _('Learn more.'), help_page_path('administration/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 }
diff --git a/app/views/admin/application_settings/_slack.html.haml b/app/views/admin/application_settings/_slack.html.haml
index 69a5e284b4c..e4f46fdf7f2 100644
--- a/app/views/admin/application_settings/_slack.html.haml
+++ b/app/views/admin/application_settings/_slack.html.haml
@@ -1,33 +1,66 @@
-- return unless Gitlab.dev_or_test_env? || Gitlab.com?
-
+- gitlab_com = Gitlab.com?
- expanded = integration_expanded?('slack_app_')
+
%section.settings.as-slack.no-animate#js-slack-settings{ class: ('expanded' if expanded) }
.settings-header
%h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
- = _('Slack application')
+ = s_('Integrations|GitLab for Slack app')
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded ? _('Collapse') : _('Expand')
%p
- = _('Slack integration allows you to interact with GitLab via slash commands in a chat window.')
+ = s_('SlackIntegration|Configure your GitLab for Slack app.')
+ = link_to(_('Learn more.'), help_page_path('user/admin_area/settings/slack_app'), target: '_blank', rel: 'noopener noreferrer')
+
.settings-content
+ - unless gitlab_com
+ %h5
+ = s_('SlackIntegration|Step 1: Create your GitLab for Slack app')
+ %p
+ = s_('SlackIntegration|You must do this step only once.')
+ %p
+ = render Pajamas::ButtonComponent.new(href: slack_app_manifest_share_admin_application_settings_path) do
+ = s_("SlackIntegration|Create Slack app")
+ %hr
+ %h5
+ = s_('SlackIntegration|Step 2: Configure the app settings')
+ %p
+ - tag_pair_slack_apps = tag_pair(link_to('', 'https://api.slack.com/apps', target: '_blank', rel: 'noopener noreferrer'), :link_start, :link_end)
+ - tag_pair_strong = tag_pair(tag.strong, :strong_open, :strong_close)
+ = safe_format(s_('SlackIntegration|Copy the %{link_start}settings%{link_end} from %{strong_open}%{settings_heading}%{strong_close} in your GitLab for Slack app.'), tag_pair_slack_apps, tag_pair_strong, settings_heading: 'App Credentials')
+ = link_to(_('Learn more.'), help_page_path('user/admin_area/settings/slack_app', anchor: 'configure-the-settings'), target: '_blank', rel: 'noopener noreferrer')
= gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-slack-settings'), html: { class: 'fieldset-form' } do |f|
= form_errors(@application_setting) if expanded
-
%fieldset
.form-group
- = f.gitlab_ui_checkbox_component :slack_app_enabled, s_('ApplicationSettings|Enable Slack application'),
- help_text: s_('ApplicationSettings|This option is only available on GitLab.com')
+ = f.gitlab_ui_checkbox_component :slack_app_enabled, s_('ApplicationSettings|Enable GitLab for Slack app')
.form-group
= f.label :slack_app_id, s_('SlackIntegration|Client ID'), class: 'label-bold'
= f.text_field :slack_app_id, class: 'form-control gl-form-input'
.form-group
= f.label :slack_app_secret, s_('SlackIntegration|Client secret'), class: 'label-bold'
= f.text_field :slack_app_secret, class: 'form-control gl-form-input'
+ .form-text.text-muted
+ = s_('SlackIntegration|Used for authenticating OAuth requests from the GitLab for Slack app.')
.form-group
= f.label :slack_app_signing_secret, s_('SlackIntegration|Signing secret'), class: 'label-bold'
= f.text_field :slack_app_signing_secret, class: 'form-control gl-form-input'
+ .form-text.text-muted
+ = s_('SlackIntegration|Used for authenticating API requests from the GitLab for Slack app.')
.form-group
= f.label :slack_app_verification_token, s_('SlackIntegration|Verification token'), class: 'label-bold'
= f.text_field :slack_app_verification_token, class: 'form-control gl-form-input'
-
+ .form-text.text-muted
+ = s_('SlackIntegration|Used only for authenticating slash commands from the GitLab for Slack app. This method of authentication is deprecated by Slack.')
= f.submit _('Save changes'), pajamas_button: true
+
+ - unless gitlab_com
+ %hr
+ %h5
+ = s_('SlackIntegration|Update your Slack app')
+ %p
+ = s_('SlackIntegration|When GitLab releases new features for the GitLab for Slack app, you might have to manually update your copy to use the new features.')
+ = link_to(_('Learn more.'), help_page_path('user/admin_area/settings/slack_app', anchor: 'update-the-gitlab-for-slack-app'), target: '_blank', rel: 'noopener noreferrer')
+ %p
+ = render Pajamas::ButtonComponent.new(href: slack_app_manifest_download_admin_application_settings_path, icon: 'download') do
+ = s_("SlackIntegration|Download latest manifest file")
+
diff --git a/app/views/admin/application_settings/_usage.html.haml b/app/views/admin/application_settings/_usage.html.haml
index 2eda3eab8c7..91cd6fe7ca0 100644
--- a/app/views/admin/application_settings/_usage.html.haml
+++ b/app/views/admin/application_settings/_usage.html.haml
@@ -7,13 +7,13 @@
%fieldset
.form-group
- - help_link_start = link_start % { url: help_page_path('user/admin_area/settings/usage_statistics', anchor: 'version-check') }
+ - help_link_start = link_start % { url: help_page_path('administration/settings/usage_statistics', anchor: 'version-check') }
= f.gitlab_ui_checkbox_component :version_check_enabled, _('Enable version check'),
help_text: _("GitLab informs you if a new version is available. %{link_start}What information does GitLab Inc. collect?%{link_end}").html_safe % { link_start: help_link_start, link_end: link_end }
.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('user/admin_area/settings/usage_statistics', anchor: 'disable-usage-statistics-with-the-configuration-file') }
+ - deactivating_service_ping_link_start = link_start % { url: help_page_path('administration/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('user/admin_area/settings/usage_statistics', anchor: 'registration-features-program')
+ - label_link = link_to sprite_icon('question-o'), help_page_path('administration/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 },
@@ -37,7 +37,7 @@
.form-text.gl-text-gray-500.gl-pl-6
%p.gl-mb-3= s_('AdminSettings|Registration Features include:')
- email_from_gitlab_path = help_page_path('user/admin_area/email_from_gitlab')
- - repo_size_limit_path = help_page_path('user/admin_area/settings/account_and_limit_settings', anchor: 'repository-size-limit')
+ - repo_size_limit_path = help_page_path('administration/settings/account_and_limit_settings', anchor: 'repository-size-limit')
- restrict_ip_path = help_page_path('user/group/access_and_permissions', anchor: 'restrict-group-access-by-ip-address')
- email_from_gitlab_link = link_start % { url: email_from_gitlab_path }
- repo_size_limit_link = link_start % { url: repo_size_limit_path }
diff --git a/app/views/admin/application_settings/appearances/_form.html.haml b/app/views/admin/application_settings/appearances/_form.html.haml
index 1b0e974a0ca..fb5c320268e 100644
--- a/app/views/admin/application_settings/appearances/_form.html.haml
+++ b/app/views/admin/application_settings/appearances/_form.html.haml
@@ -3,9 +3,8 @@
= gitlab_ui_form_for @appearance, url: admin_application_settings_appearances_path, html: { class: 'gl-mt-3' } do |f|
= form_errors(@appearance)
-
.row
- .col-lg-4.profile-settings-sidebar
+ .col-lg-4
%h4.gl-mt-0= _('Navigation bar')
.col-lg-8
@@ -25,7 +24,7 @@
= _('Maximum file size is 1MB. Pages are optimized for a 24px tall header logo')
%hr
.row
- .col-lg-4.profile-settings-sidebar
+ .col-lg-4
%h4.gl-mt-0 Favicon
.col-lg-8
@@ -50,7 +49,7 @@
%hr
.row
- .col-lg-4.profile-settings-sidebar
+ .col-lg-4
%h4.gl-mt-0= _('Sign in/Sign up pages')
.col-lg-8
@@ -79,7 +78,7 @@
%hr
.row
- .col-lg-4.profile-settings-sidebar
+ .col-lg-4
%h4.gl-mt-0= _('Progressive Web App (PWA)')
.col-lg-8
@@ -111,7 +110,7 @@
%hr
.row
- .col-lg-4.profile-settings-sidebar
+ .col-lg-4
%h4.gl-mt-0= _('New project pages')
.col-lg-8
@@ -124,7 +123,7 @@
%hr
.row
- .col-lg-4.profile-settings-sidebar
+ .col-lg-4
%h4.gl-mt-0= _('Profile image guideline')
.col-lg-8
diff --git a/app/views/admin/application_settings/appearances/_system_header_footer_form.html.haml b/app/views/admin/application_settings/appearances/_system_header_footer_form.html.haml
index d7bb3a85f3a..2ca037db532 100644
--- a/app/views/admin/application_settings/appearances/_system_header_footer_form.html.haml
+++ b/app/views/admin/application_settings/appearances/_system_header_footer_form.html.haml
@@ -2,7 +2,7 @@
%hr
.row
- .col-lg-4.profile-settings-sidebar
+ .col-lg-4
%h4.gl-mt-0
= _('System header and footer')
diff --git a/app/views/admin/application_settings/general.html.haml b/app/views/admin/application_settings/general.html.haml
index 022930bd6b4..2d56e9dd0dd 100644
--- a/app/views/admin/application_settings/general.html.haml
+++ b/app/views/admin/application_settings/general.html.haml
@@ -96,7 +96,6 @@
= render 'admin/application_settings/plantuml'
= render 'admin/application_settings/diagramsnet'
= render 'admin/application_settings/sourcegraph'
-= render_if_exists 'admin/application_settings/slack'
-# this partial is from JiHu, see details in https://jihulab.com/gitlab-cn/gitlab/-/merge_requests/417
= render_if_exists 'admin/application_settings/dingtalk_integration'
-# this partial is from JiHu, see details in https://jihulab.com/gitlab-cn/gitlab/-/merge_requests/640
@@ -109,4 +108,5 @@
= render 'admin/application_settings/floc'
= render_if_exists 'admin/application_settings/add_license'
= render 'admin/application_settings/jira_connect'
+= render 'admin/application_settings/slack'
= render_if_exists 'admin/application_settings/ai_access'
diff --git a/app/views/admin/application_settings/network.html.haml b/app/views/admin/application_settings/network.html.haml
index 18ce7c1ceba..3b9fb930fd7 100644
--- a/app/views/admin/application_settings/network.html.haml
+++ b/app/views/admin/application_settings/network.html.haml
@@ -84,6 +84,9 @@
.settings-content
= render 'git_lfs_limits'
+
+= render 'gitlab_shell_operation_limits'
+
%section.settings.as-outbound.no-animate#js-outbound-settings{ class: ('expanded' if expanded_by_default?), data: { qa_selector: 'outbound_requests_content' } }
.settings-header
%h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
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 24f132b982a..634d006e736 100644
--- a/app/views/admin/application_settings/service_usage_data.html.haml
+++ b/app/views/admin/application_settings/service_usage_data.html.haml
@@ -23,7 +23,7 @@
title: _('Service Ping payload not found in the application cache')) do |c|
- c.with_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_url = help_page_path('administration/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('development/internal_analytics/service_ping/troubleshooting', anchor: 'generate-service-ping')
- generate_manually_link = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: generate_manually_link_url }
diff --git a/app/views/admin/applications/_delete_form.html.haml b/app/views/admin/applications/_delete_form.html.haml
index f9fd5864176..82544d36ba0 100644
--- a/app/views/admin/applications/_delete_form.html.haml
+++ b/app/views/admin/applications/_delete_form.html.haml
@@ -1,4 +1,2 @@
-- submit_btn_css ||= 'gl-button btn btn-danger btn-danger-secondary btn-sm js-application-delete-button'
-
-%button{ class: submit_btn_css, data: { path: admin_application_path(application), name: application.name } }
+= render Pajamas::ButtonComponent.new(variant: :danger, category: :secondary, size: :small, button_options: { data: { path: admin_application_path(application), name: application.name }, class: 'js-application-delete-button' }) do
= _('Destroy')
diff --git a/app/views/admin/applications/_form.html.haml b/app/views/admin/applications/_form.html.haml
index a8d5a45041d..27622dfa0bb 100644
--- a/app/views/admin/applications/_form.html.haml
+++ b/app/views/admin/applications/_form.html.haml
@@ -32,4 +32,4 @@
.gl-mt-5
= f.submit _('Save application'), pajamas_button: true, data: { qa_selector: 'save_application_button' }
- = link_to _('Cancel'), admin_applications_path, class: "gl-button btn btn-default btn-cancel"
+ = link_button_to _('Cancel'), admin_applications_path
diff --git a/app/views/admin/cohorts/_cohorts_table.html.haml b/app/views/admin/cohorts/_cohorts_table.html.haml
index 4e2292a9f67..c39e8fb0057 100644
--- a/app/views/admin/cohorts/_cohorts_table.html.haml
+++ b/app/views/admin/cohorts/_cohorts_table.html.haml
@@ -2,7 +2,7 @@
.bs-callout.clearfix
%p
= s_("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.") % { months_included: @cohorts[:months_included] }
- = link_to sprite_icon('question-o'), help_page_path('user/admin_area/user_cohorts', anchor: 'cohorts'), title: 'About this feature', target: '_blank', rel: 'noopener noreferrer'
+ = link_to sprite_icon('question-o'), help_page_path('administration/user_cohorts', anchor: 'cohorts'), title: 'About this feature', target: '_blank', rel: 'noopener noreferrer'
.table-holder.d-xl-table
%table.table
diff --git a/app/views/admin/groups/show.html.haml b/app/views/admin/groups/show.html.haml
index 4ba69126906..5f5f6c98663 100644
--- a/app/views/admin/groups/show.html.haml
+++ b/app/views/admin/groups/show.html.haml
@@ -43,7 +43,7 @@
%li
%span.light= _('Created on:')
%strong
- = @group.created_at.to_s(:medium)
+ = @group.created_at.to_fs(:medium)
%li
%span.light= _('ID:')
diff --git a/app/views/admin/hooks/_form.html.haml b/app/views/admin/hooks/_form.html.haml
index a309e874317..92a664e1ca8 100644
--- a/app/views/admin/hooks/_form.html.haml
+++ b/app/views/admin/hooks/_form.html.haml
@@ -6,10 +6,10 @@
%p.form-text.text-muted= _('URL must be percent-encoded if necessary.')
.form-group
= form.label :token, _('Secret token'), class: 'label-bold'
- = form.text_field :token, class: 'form-control gl-form-input'
+ = form.password_field :token, value: hook.masked_token, autocomplete: 'new-password', class: 'form-control gl-form-input gl-max-w-48'
%p.form-text.text-muted= _('Use this token to validate received payloads.')
.form-group
- = form.label :url, _('Trigger'), class: 'label-bold'
+ = form.label :url, _('Trigger'), class: 'label-bold gl-mb-0'
.form-text.text-secondary.gl-mb-5= _('System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events.')
%fieldset.form-group
= form.gitlab_ui_checkbox_component :repository_update_events, _('Repository update events'),
diff --git a/app/views/admin/hooks/edit.html.haml b/app/views/admin/hooks/edit.html.haml
index 14d37b77a41..29b90f69800 100644
--- a/app/views/admin/hooks/edit.html.haml
+++ b/app/views/admin/hooks/edit.html.haml
@@ -3,17 +3,17 @@
= render 'shared/web_hooks/hook_errors', hook: @hook
-.row.gl-mt-3
- .col-lg-3
- = render 'shared/web_hooks/title_and_docs', hook: @hook
+.gl-mt-5
+ = render 'shared/web_hooks/title_and_docs', hook: @hook
- .col-lg-9.gl-mb-3
- = gitlab_ui_form_for @hook, as: :hook, url: admin_hook_path do |f|
- = render partial: 'form', locals: { form: f, hook: @hook }
- .form-actions
- %span>= f.submit _('Save changes'), class: 'gl-mr-3', pajamas_button: true
+ = gitlab_ui_form_for @hook, as: :hook, url: admin_hook_path do |f|
+ = render partial: 'form', locals: { form: f, hook: @hook }
+
+ .gl-display-flex.gl-justify-content-space-between
+ %div
+ = f.submit _('Save changes'), pajamas_button: true, class: 'gl-sm-mr-3'
= render 'shared/web_hooks/test_button', hook: @hook
- = link_to _('Delete'), admin_hook_path(@hook), method: :delete, class: 'btn gl-button btn-danger float-right', aria: { label: s_('Webhooks|Delete webhook') }, data: { confirm: s_('Webhooks|Are you sure you want to delete this webhook?'), confirm_btn_variant: 'danger' }
+ = link_button_to _('Delete'), admin_hook_path(@hook), method: :delete, aria: { label: s_('Webhooks|Delete webhook') }, data: { confirm: s_('Webhooks|Are you sure you want to delete this webhook?'), confirm_btn_variant: 'danger' }, variant: :danger
%hr
diff --git a/app/views/admin/hooks/index.html.haml b/app/views/admin/hooks/index.html.haml
index d4aeb8dc7e8..14137e788bc 100644
--- a/app/views/admin/hooks/index.html.haml
+++ b/app/views/admin/hooks/index.html.haml
@@ -1,14 +1,7 @@
- page_title @hook.pluralized_name
-.row.gl-mt-3
- .col-lg-4
- = render 'shared/web_hooks/title_and_docs', hook: @hook
-
- .col-lg-8.gl-mb-3
- = gitlab_ui_form_for @hook, as: :hook, url: admin_hooks_path do |f|
- = render partial: 'form', locals: { form: f, hook: @hook }
- = f.submit _('Add system hook'), pajamas_button: true
-
- = render 'shared/web_hooks/index', hooks: @hooks, hook_class: @hook.class
+.settings-section
+ = render 'shared/web_hooks/title_and_docs', hook: @hook
+ = render 'shared/web_hooks/index', hooks: @hooks, hook_class: @hook.class, partial: 'form', url: admin_hooks_path
= render 'shared/file_hooks/index'
diff --git a/app/views/admin/labels/_label.html.haml b/app/views/admin/labels/_label.html.haml
index f4f64eadf21..19460ddb0e5 100644
--- a/app/views/admin/labels/_label.html.haml
+++ b/app/views/admin/labels/_label.html.haml
@@ -10,8 +10,8 @@
.dropdown-menu.dropdown-menu-right
%ul
%li
- = link_to edit_admin_label_path(label), class: 'btn gl-btn label-action dropdown-item btn-link' do
+ = link_to edit_admin_label_path(label), class: 'btn label-action dropdown-item btn-link' do
= _('Edit')
%li
- = link_to admin_label_path(label), class: 'btn gl-btn js-remove-label dropdown-item btn-link gl-text-red-500!', data: { confirm: _('Are you sure you want to delete this label?'), confirm_btn_variant: 'danger' }, aria: { label: _('Delete label') }, method: :delete, remote: true do
+ = link_to admin_label_path(label), class: 'btn js-remove-label dropdown-item btn-link gl-text-red-500!', data: { confirm: _('Are you sure you want to delete this label?'), confirm_btn_variant: 'danger' }, aria: { label: _('Delete label') }, method: :delete, remote: true do
= _('Delete')
diff --git a/app/views/admin/projects/show.html.haml b/app/views/admin/projects/show.html.haml
index 8eb72fa281e..0637b0eae47 100644
--- a/app/views/admin/projects/show.html.haml
+++ b/app/views/admin/projects/show.html.haml
@@ -60,7 +60,7 @@
%span.light
= _('Created on:')
%strong
- = @project.created_at.to_s(:medium)
+ = @project.created_at.to_fs(:medium)
%li{ class: 'gl-px-5!' }
%span.light
@@ -158,10 +158,10 @@
= _("This repository has never been checked.")
- elsif @project.last_repository_check_failed?
- failed_message = _("This repository was last checked %{last_check_timestamp}. The check %{strong_start}failed.%{strong_end} See the 'repocheck.log' file for error messages.")
- - failed_message = failed_message % { last_check_timestamp: @project.last_repository_check_at.to_s(:medium), strong_start: "<strong class='cred'>", strong_end: "</strong>" }
+ - failed_message = failed_message % { last_check_timestamp: @project.last_repository_check_at.to_fs(:medium), strong_start: "<strong class='cred'>", strong_end: "</strong>" }
= failed_message.html_safe
- else
- = _("This repository was last checked %{last_check_timestamp}. The check passed.") % { last_check_timestamp: @project.last_repository_check_at.to_s(:medium) }
+ = _("This repository was last checked %{last_check_timestamp}. The check passed.") % { last_check_timestamp: @project.last_repository_check_at.to_fs(:medium) }
= link_to sprite_icon('question-o'), help_page_path('administration/repository_checks')
diff --git a/app/views/admin/runners/edit.html.haml b/app/views/admin/runners/edit.html.haml
index 3d245722270..6ce094bacf1 100644
--- a/app/views/admin/runners/edit.html.haml
+++ b/app/views/admin/runners/edit.html.haml
@@ -39,7 +39,8 @@
.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'
+ = render Pajamas::ButtonComponent.new(type: 'submit', variant: :default) do
+ = _('Search')
%td
- @projects.each do |project|
diff --git a/app/views/admin/sessions/_new_base.html.haml b/app/views/admin/sessions/_new_base.html.haml
index d0ee3acf0b8..f880c2631ed 100644
--- a/app/views/admin/sessions/_new_base.html.haml
+++ b/app/views/admin/sessions/_new_base.html.haml
@@ -1,7 +1,7 @@
-= form_tag(admin_session_path, method: :post, class: 'new_user gl-show-field-errors', 'aria-live': 'assertive') do
+= gitlab_ui_form_for(:user, url: admin_session_path, html: { class: 'gl-p-5 gl-show-field-errors', aria: { live: 'assertive' } }) do |f|
.form-group
- = label_tag :user_password, _('Password'), class: 'label-bold'
- = password_field_tag 'user[password]', nil, { class: 'form-control js-password', data: { id: 'user_password', name: 'user[password]', qa_selector: 'password_field', testid: 'password-field' } }
+ = f.label :password, _('Password')
+ = f.password_field :password, class: 'form-control js-password', data: { id: 'user_password', name: 'user[password]', qa_selector: 'password_field', testid: 'password-field' }
- .submit-container
- = submit_tag _('Enter admin mode'), class: 'gl-button btn btn-confirm', data: { qa_selector: 'enter_admin_mode_button' }
+ = render Pajamas::ButtonComponent.new(type: :submit, variant: :confirm, block: true, button_options: { data: { qa_selector: 'enter_admin_mode_button' } }) do
+ = _('Enter admin mode')
diff --git a/app/views/admin/sessions/_signin_box.html.haml b/app/views/admin/sessions/_signin_box.html.haml
index 70cad880293..114b32ca581 100644
--- a/app/views/admin/sessions/_signin_box.html.haml
+++ b/app/views/admin/sessions/_signin_box.html.haml
@@ -12,6 +12,6 @@
= render_if_exists 'devise/sessions/new_smartcard'
- if allow_admin_mode_password_authentication_for_web?
- .login-box.tab-pane.gl-p-5{ id: 'login-pane', role: 'tabpanel', class: active_when(!any_form_based_providers_enabled?) }
+ .login-box.tab-pane{ 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/new.html.haml b/app/views/admin/sessions/new.html.haml
index 7301b0f6e04..b3e24d5b3ac 100644
--- a/app/views/admin/sessions/new.html.haml
+++ b/app/views/admin/sessions/new.html.haml
@@ -1,8 +1,8 @@
- page_title _('Enter admin mode')
- add_page_specific_style 'page_bundles/login'
-.row.justify-content-center
- .col-md-5.new-session-forms-container
+.row.gl-mt-5.justify-content-center
+ .col-md-5
.login-page
#signin-container{ class: ('borderless' if Feature.enabled?(:restyle_login_page, @project)) }
- if any_form_based_providers_enabled?
diff --git a/app/views/admin/sessions/two_factor.html.haml b/app/views/admin/sessions/two_factor.html.haml
index bfe66e2477e..ef004004227 100644
--- a/app/views/admin/sessions/two_factor.html.haml
+++ b/app/views/admin/sessions/two_factor.html.haml
@@ -2,7 +2,7 @@
- add_page_specific_style 'page_bundles/login'
.row.justify-content-center
- .col-md-5.new-session-forms-container
+ .col-md-5
.login-page
#signin-container{ class: ('borderless' if Feature.enabled?(:restyle_login_page, @project)) }
= render 'devise/shared/tab_single', tab_title: _('Enter admin mode') if Feature.disabled?(:restyle_login_page, @project)
diff --git a/app/views/admin/topics/_topic.html.haml b/app/views/admin/topics/_topic.html.haml
index ce2b5ad793c..3e8a023ec9f 100644
--- a/app/views/admin/topics/_topic.html.haml
+++ b/app/views/admin/topics/_topic.html.haml
@@ -16,5 +16,5 @@
= number_with_delimiter(topic.total_projects_count)
.controls.gl-flex-shrink-0.gl-ml-5
- = link_to _('Edit'), edit_admin_topic_path(topic), id: "edit_#{dom_id(topic)}", class: 'btn gl-button btn-default'
- = link_to _('Remove'), admin_topic_path(topic), aria: { label: _('Remove') }, data: { confirm: _("Are you sure you want to remove %{topic_name}?") % { topic_name: title }, confirm_btn_variant: 'danger' }, method: :delete, class: 'gl-button btn btn-danger'
+ = link_button_to _('Edit'), edit_admin_topic_path(topic), id: "edit_#{dom_id(topic)}"
+ = link_button_to _('Remove'), admin_topic_path(topic), aria: { label: _('Remove') }, data: { confirm: _("Are you sure you want to remove %{topic_name}?") % { topic_name: title }, confirm_btn_variant: 'danger' }, method: :delete, variant: :danger
diff --git a/app/views/admin/users/_profile.html.haml b/app/views/admin/users/_profile.html.haml
index b4f61a1b665..bb89b5baf28 100644
--- a/app/views/admin/users/_profile.html.haml
+++ b/app/views/admin/users/_profile.html.haml
@@ -5,7 +5,7 @@
%ul.content-list
%li
%span.light= _('Member since')
- %strong= user.created_at.to_s(:medium)
+ %strong= user.created_at.to_fs(:medium)
- unless user.public_email.blank?
%li
%span.light= _('E-mail:')
diff --git a/app/views/admin/users/projects.html.haml b/app/views/admin/users/projects.html.haml
index 1f3e8f4bba2..fa89c3d4b4f 100644
--- a/app/views/admin/users/projects.html.haml
+++ b/app/views/admin/users/projects.html.haml
@@ -18,8 +18,7 @@
.float-right
%span.light.vertical-align-middle= group_member.human_access
- unless group_member.owner?
- = link_to group_group_member_path(group, group_member), data: { confirm: remove_member_message(group_member), confirm_btn_variant: 'danger', testid: 'remove-user' }, aria: { label: _('Remove') }, method: :delete, remote: true, class: "btn btn-sm btn-danger gl-button btn-icon gl-ml-3", title: _('Remove user from group') do
- = sprite_icon('remove', size: 16, css_class: 'gl-icon')
+ = link_button_to nil, group_group_member_path(group, group_member), data: { confirm: remove_member_message(group_member), confirm_btn_variant: 'danger', testid: 'remove-user' }, aria: { label: _('Remove') }, method: :delete, remote: true, class: 'gl-ml-3', title: _('Remove user from group'), variant: :danger, size: :small, icon: 'remove'
.row
.col-md-6
@@ -50,5 +49,4 @@
%span.light.vertical-align-middle= member.human_access
- if member.respond_to? :project
- = link_to project_project_member_path(project, member), data: { confirm: remove_member_message(member), confirm_btn_variant: 'danger' }, aria: { label: _('Remove') }, remote: true, method: :delete, class: "btn btn-sm btn-danger gl-button btn-icon gl-ml-3", title: _('Remove user from project') do
- = sprite_icon('remove', size: 16, css_class: 'gl-icon')
+ = link_button_to nil, project_project_member_path(project, member), data: { confirm: remove_member_message(member), confirm_btn_variant: 'danger' }, aria: { label: _('Remove') }, remote: true, method: :delete, class: 'gl-ml-3', title: _('Remove user from project'), variant: :danger, size: :small, icon: 'remove'
diff --git a/app/views/admin/users/show.html.haml b/app/views/admin/users/show.html.haml
index ea6525e1b96..a4ae29bed81 100644
--- a/app/views/admin/users/show.html.haml
+++ b/app/views/admin/users/show.html.haml
@@ -42,8 +42,7 @@
%span.light= _('Secondary email:')
%strong
= render partial: 'shared/email_with_badge', locals: { email: email.email, verified: email.confirmed? }
- = link_to remove_email_admin_user_path(@user, email), data: { confirm: _("Are you sure you want to remove %{email}?") % { email: email.email }, 'confirm-btn-variant': 'danger' }, method: :delete, class: "btn btn-sm btn-danger gl-button btn-icon float-right", title: _('Remove secondary email'), id: "remove_email_#{email.id}" do
- = sprite_icon('close', size: 16, css_class: 'gl-icon')
+ = link_button_to nil, remove_email_admin_user_path(@user, email), data: { confirm: _("Are you sure you want to remove %{email}?") % { email: email.email }, 'confirm-btn-variant': 'danger' }, method: :delete, class: 'float-right', title: _('Remove secondary email'), id: "remove_email_#{email.id}", variant: :danger, size: :small, icon: 'close'
%li
%span.light ID:
%strong{ data: { qa_selector: 'user_id_content' } }
@@ -58,7 +57,7 @@
%strong{ class: @user.two_factor_enabled? ? 'cgreen' : 'cred' }
- if @user.two_factor_enabled?
= _('Enabled')
- = link_to _('Disable'), disable_two_factor_admin_user_path(@user), aria: { label: _('Disable') }, data: { confirm: _('Are you sure?'), 'confirm-btn-variant': 'danger' }, method: :patch, class: 'btn gl-button btn-sm btn-danger float-right', title: _('Disable Two-factor Authentication')
+ = link_button_to _('Disable'), disable_two_factor_admin_user_path(@user), aria: { label: _('Disable') }, data: { confirm: _('Are you sure?'), 'confirm-btn-variant': 'danger' }, method: :patch, class: 'float-right', title: _('Disable Two-factor Authentication'), variant: :danger, size: :small
- else
= _('Disabled')
@@ -86,12 +85,12 @@
%li
%span.light= _('Member since:')
%strong
- = @user.created_at.to_s(:medium)
+ = @user.created_at.to_fs(:medium)
- if @user.confirmed_at
%li
%span.light= _('Confirmed at:')
%strong
- = @user.confirmed_at.to_s(:medium)
+ = @user.confirmed_at.to_fs(:medium)
- else
%li
%span.ligh= _('Confirmed:')
@@ -106,7 +105,7 @@
%li
%span.light= _('Current sign-in at:')
%strong
- = @user.current_sign_in_at&.to_s(:medium) || _('never')
+ = @user.current_sign_in_at&.to_fs(:medium) || _('never')
%li
%span.light= _('Last sign-in IP:')
@@ -116,7 +115,7 @@
%li
%span.light= _('Last sign-in at:')
%strong
- = @user.last_sign_in_at&.to_s(:medium) || _('never')
+ = @user.last_sign_in_at&.to_fs(:medium) || _('never')
%li
%span.light= _('Sign-in count:')
diff --git a/app/views/clusters/clusters/_integrations.html.haml b/app/views/clusters/clusters/_integrations.html.haml
deleted file mode 100644
index 4d36c5094a3..00000000000
--- a/app/views/clusters/clusters/_integrations.html.haml
+++ /dev/null
@@ -1,16 +0,0 @@
-.settings.expanded.border-0.m-0
- %p
- = s_('ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow.')
- = link_to _('Learn more'), help_page_path('user/clusters/integrations.md'), target: '_blank', rel: 'noopener noreferrer'
- .settings-content#integrations-settings-section
- - if can?(current_user, :admin_cluster, @cluster)
- .sub-section.form-group
- = gitlab_ui_form_for @prometheus_integration, as: :integration, namespace: :prometheus, url: @cluster.integrations_path, method: :post, html: { class: 'js-cluster-integrations-form' } do |prometheus_form|
- = prometheus_form.hidden_field :application_type, value: @prometheus_integration.application_type
- .form-group.gl-form-group
- - help_text = s_('ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics.')
- - help_link = link_to(_('More information.'), help_page_path("user/clusters/integrations"), target: '_blank', rel: 'noopener noreferrer')
- = 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-confirm'
diff --git a/app/views/clusters/clusters/_integrations_tab.html.haml b/app/views/clusters/clusters/_integrations_tab.html.haml
deleted file mode 100644
index e229c1fbe1e..00000000000
--- a/app/views/clusters/clusters/_integrations_tab.html.haml
+++ /dev/null
@@ -1,4 +0,0 @@
-- active = params[:tab] == 'integrations'
-
-= gl_tab_link_to clusterable.cluster_path(@cluster.id, params: { tab: 'integrations' }), { item_active: active } do
- = _('Integrations')
diff --git a/app/views/clusters/clusters/show.html.haml b/app/views/clusters/clusters/show.html.haml
index 57de6d980f8..1287f4e689f 100644
--- a/app/views/clusters/clusters/show.html.haml
+++ b/app/views/clusters/clusters/show.html.haml
@@ -32,7 +32,6 @@
= gl_tabs_nav do
= render 'clusters/clusters/details_tab'
= render_if_exists 'clusters/clusters/environments_tab'
- = render 'clusters/clusters/integrations_tab' if !Feature.enabled?(:remove_monitor_metrics)
= render 'clusters/clusters/advanced_settings_tab'
.tab-content.py-3
diff --git a/app/views/dashboard/todos/_todo.html.haml b/app/views/dashboard/todos/_todo.html.haml
index ebd7f20c54a..e20fccc218a 100644
--- a/app/views/dashboard/todos/_todo.html.haml
+++ b/app/views/dashboard/todos/_todo.html.haml
@@ -20,7 +20,7 @@
- else
= _("(removed)")
- .todo-body.gl-mb-2.gl-px-2.gl-display-flex.gl-align-items-flex-start.gl-lg-align-items-center
+ .todo-body.gl-mb-2.gl-px-2.gl-display-flex.gl-align-items-flex-start
.todo-avatar.gl-display-none.gl-sm-display-inline-block
= author_avatar(todo, size: 24)
.todo-note
@@ -47,6 +47,8 @@
%span.action-description<
= first_line_in_markdown(todo, :body, 125, is_todo: true, project: todo.project, group: todo.group)
+ = render_if_exists "dashboard/todos/diff_summary", local_assigns: { todo: todo }
+
.todo-timestamp.gl-white-space-nowrap.gl-sm-ml-3.gl-mt-2.gl-mb-2.gl-sm-my-0.gl-px-2.gl-sm-px-0
%span.todo-timestamp.gl-font-sm.gl-text-secondary
= todo_due_date(todo)
diff --git a/app/views/dashboard/todos/index.html.haml b/app/views/dashboard/todos/index.html.haml
index ca6b1071f03..c5f70397fad 100644
--- a/app/views/dashboard/todos/index.html.haml
+++ b/app/views/dashboard/todos/index.html.haml
@@ -53,7 +53,7 @@
- if params[:action_id].present?
= hidden_field_tag(:action_id, params[:action_id])
= dropdown_tag(todo_actions_dropdown_label(params[:action_id], _("Action")), options: { toggle_class: 'js-action-search js-filter-submit gl-xs-w-full!', dropdown_class: 'dropdown-menu-selectable dropdown-menu-action js-filter-submit', data: { data: todo_actions_options, default_label: _("Action") } })
- .filter-item.sort-filter.gl-mt-3.gl-sm-mt-0.gl-mb-0.gl-sm-mb-0
+ .filter-item.sort-filter.gl-my-2
.dropdown
%button.dropdown-menu-toggle.dropdown-menu-toggle-sort{ type: 'button', class: 'gl-xs-w-full!', 'data-toggle' => 'dropdown' }
%span.light
diff --git a/app/views/devise/sessions/_new_crowd.html.haml b/app/views/devise/sessions/_new_crowd.html.haml
index bb398eaf4be..4b1441662ab 100644
--- a/app/views/devise/sessions/_new_crowd.html.haml
+++ b/app/views/devise/sessions/_new_crowd.html.haml
@@ -7,7 +7,7 @@
= f.text_field :username, name: :username, autocomplete: :username, class: 'form-control gl-form-input', title: _('This field is required.'), autofocus: 'autofocus', required: true
.form-group
= f.label :password, _('Password')
- = f.text_field :vue_password_placeholder, class: 'form-control gl-form-input js-password', data: { id: "#{:crowd}_password", name: 'password' }
+ %input.form-control.gl-form-input.js-password{ data: { id: 'crowd_password', name: 'password' } }
- if render_remember_me
= f.gitlab_ui_checkbox_component :remember_me, _('Remember me'), checkbox_options: { name: :remember_me, autocomplete: 'off' }
diff --git a/app/views/devise/sessions/_new_ldap.html.haml b/app/views/devise/sessions/_new_ldap.html.haml
index f9b6f462661..471cc053e6e 100644
--- a/app/views/devise/sessions/_new_ldap.html.haml
+++ b/app/views/devise/sessions/_new_ldap.html.haml
@@ -9,7 +9,7 @@
= f.text_field :username, name: :username, autocomplete: :username, class: 'form-control gl-form-input', title: _('This field is required.'), autofocus: 'autofocus', data: { qa_selector: 'username_field' }, required: true
.form-group
= f.label :password, _('Password')
- = f.text_field :vue_password_placeholder, class: 'form-control gl-form-input js-password', data: { id: "#{provider}_password", name: 'password', qa_selector: 'password_field' }
+ %input.form-control.gl-form-input.js-password{ data: { id: "#{provider}_password", name: 'password', qa_selector: 'password_field' } }
- if render_remember_me
= f.gitlab_ui_checkbox_component :remember_me, _('Remember me'), checkbox_options: { name: :remember_me, autocomplete: 'off' }
diff --git a/app/views/devise/shared/_footer.html.haml b/app/views/devise/shared/_footer.html.haml
index 0744faa148c..c35e43b909e 100644
--- a/app/views/devise/shared/_footer.html.haml
+++ b/app/views/devise/shared/_footer.html.haml
@@ -1,10 +1,11 @@
-%hr.footer-fixed
-.container.footer-container.gl-display-flex.gl-justify-content-space-between
- .footer-links
- - unless public_visibility_restricted?
- = link_to _("Explore"), explore_root_path
- = link_to _("Help"), help_path
- = link_to _("About GitLab"), "https://#{ApplicationHelper.promo_host}"
- = link_to _("Community forum"), ApplicationHelper.community_forum, target: '_blank', class: 'text-nowrap', rel: 'noopener noreferrer'
- = render 'devise/shared/language_switcher'
+.footer-container.gl-w-full.gl-align-self-end
+ %hr.gl-m-0
+ .container.gl-py-5.gl-display-flex.gl-justify-content-space-between
+ .gl-display-flex.gl-gap-5.gl-flex-wrap
+ - unless public_visibility_restricted?
+ = link_to _("Explore"), explore_root_path
+ = link_to _("Help"), help_path
+ = link_to _("About GitLab"), "https://#{ApplicationHelper.promo_host}"
+ = link_to _("Community forum"), ApplicationHelper.community_forum, target: '_blank', class: 'text-nowrap', rel: 'noopener noreferrer'
+ = render 'devise/shared/language_switcher'
= footer_message
diff --git a/app/views/devise/shared/_signup_box.html.haml b/app/views/devise/shared/_signup_box.html.haml
index 684ade87720..6d37257232b 100644
--- a/app/views/devise/shared/_signup_box.html.haml
+++ b/app/views/devise/shared/_signup_box.html.haml
@@ -5,14 +5,14 @@
.gl-mb-3.gl-p-4{ class: (borderless ? '' : 'gl-border-gray-100 gl-border-1 gl-border-solid gl-rounded-base') }
= yield :omniauth_providers_top if show_omniauth_providers
- = gitlab_ui_form_for(resource, as: form_resource_name, url: url, html: { class: 'new_user gl-show-field-errors js-arkose-labs-form', 'aria-live' => 'assertive' }, data: { testid: 'signup-form' }) do |f|
+ = gitlab_ui_form_for(resource, as: form_resource_name, url: url, html: { class: 'gl-show-field-errors js-arkose-labs-form', aria: { live: 'assertive' }}, data: { testid: 'signup-form' }) do |f|
.devise-errors
= render 'devise/shared/error_messages', resource: resource
- if Gitlab::CurrentSettings.invisible_captcha_enabled
= invisible_captcha nonce: true, autocomplete: SecureRandom.alphanumeric(12)
.name.form-row
.col.form-group
- = f.label :first_name, _('First name'), for: 'new_user_first_name', class: "label-bold #{'gl-mb-1' if Feature.enabled?(:restyle_login_page, @project)}"
+ = f.label :first_name, _('First name'), for: 'new_user_first_name'
= f.text_field :first_name,
class: 'form-control gl-form-input top js-block-emoji js-validate-length',
data: { max_length: max_first_name_length,
@@ -21,7 +21,7 @@
required: true,
title: _('This field is required.')
.col.form-group
- = f.label :last_name, _('Last name'), for: 'new_user_last_name', class: "label-bold #{'gl-mb-1' if Feature.enabled?(:restyle_login_page, @project)}"
+ = f.label :last_name, _('Last name'), for: 'new_user_last_name'
= f.text_field :last_name,
class: 'form-control gl-form-input top js-block-emoji js-validate-length',
data: { max_length: max_last_name_length,
@@ -30,7 +30,7 @@
required: true,
title: _('This field is required.')
.username.form-group
- = f.label :username, class: "label-bold #{'gl-mb-1' if Feature.enabled?(:restyle_login_page, @project)}"
+ = f.label :username, _('Username')
= f.text_field :username,
class: 'form-control gl-form-input middle js-block-emoji js-validate-length js-validate-username',
data: signup_username_data_attributes,
@@ -41,7 +41,7 @@
%p.validation-success.gl-text-green-600.gl-field-error-ignore.gl-mt-2.field-validation.hide= _('Username is available.')
%p.validation-pending.gl-field-error-ignore.gl-mt-2.field-validation.hide= _('Checking username availability...')
.form-group
- = f.label :email, class: "label-bold #{'gl-mb-1' if Feature.enabled?(:restyle_login_page, @project)}"
+ = f.label :email, _('Email')
= f.email_field :email,
class: 'form-control gl-form-input middle js-validate-email',
data: { qa_selector: 'new_user_email_field' },
@@ -52,7 +52,7 @@
-# This is used for providing entry to Jihu on email verification
= render_if_exists 'devise/shared/signup_email_additional_info'
.form-group.gl-mb-5
- = f.label :password, class: "label-bold #{'gl-mb-1' if Feature.enabled?(:restyle_login_page, @project)}"
+ = f.label :password, _('Password')
%input.form-control.gl-form-input.js-password{ data: { id: "#{form_resource_name}_password",
title: s_('SignUp|Minimum length is %{minimum_password_length} characters.') % { minimum_password_length: @minimum_password_length },
minimum_password_length: @minimum_password_length,
@@ -62,18 +62,16 @@
%p.gl-field-hint-valid.text-secondary= s_('SignUp|Minimum length is %{minimum_password_length} characters.') % { minimum_password_length: @minimum_password_length }
= render_if_exists 'shared/password_requirements_list'
= render_if_exists 'devise/shared/phone_verification', form: f
- %div
- - if arkose_labs_enabled?
- = render_if_exists 'devise/registrations/arkose_labs'
- - elsif show_recaptcha_sign_up?
- = recaptcha_tags nonce: content_security_policy_nonce
+ .form-group
+ - if arkose_labs_enabled?
+ = render_if_exists 'devise/registrations/arkose_labs'
+ - elsif show_recaptcha_sign_up?
+ = recaptcha_tags nonce: content_security_policy_nonce
+
+ = render Pajamas::ButtonComponent.new(type: :submit, variant: :confirm, block: true, button_options: { data: { qa_selector: 'new_user_register_button' }}) do
+ = button_text
- .submit-container.gl-mt-5
- = f.submit button_text, pajamas_button: true, class: 'gl-w-full', data: { qa_selector: 'new_user_register_button' }
- - if Gitlab::CurrentSettings.sign_in_text.present? && Feature.enabled?(:restyle_login_page, @project)
- .gl-pt-5
- = markdown_field(Gitlab::CurrentSettings.current_application_settings, :sign_in_text)
= render 'devise/shared/terms_of_service_notice', button_text: button_text
= yield :omniauth_providers_bottom if show_omniauth_providers
diff --git a/app/views/devise/shared/_signup_omniauth_provider_list.haml b/app/views/devise/shared/_signup_omniauth_provider_list.haml
index e8c82e456ae..60c37316c62 100644
--- a/app/views/devise/shared/_signup_omniauth_provider_list.haml
+++ b/app/views/devise/shared/_signup_omniauth_provider_list.haml
@@ -4,7 +4,7 @@
= _("Register with:")
.gl-text-center.gl-ml-auto.gl-mr-auto
- providers.each do |provider|
- = button_to omniauth_authorize_path(:user, provider, register_omniauth_params(local_assigns)), class: "btn gl-button btn-default gl-w-full gl-mb-4 js-oauth-login #{qa_selector_for_provider(provider)}", data: { provider: provider, track_action: "#{provider}_sso", track_label: tracking_label }, id: "oauth-login-#{provider}" do
+ = render Pajamas::ButtonComponent.new(href: omniauth_authorize_path(:user, provider, register_omniauth_params(local_assigns)), method: :post, variant: :default, button_options: { class: "gl-w-full gl-mb-4 js-oauth-login #{qa_selector_for_provider(provider)}", data: { provider: provider, track_action: "#{provider}_sso", track_label: tracking_label}, id: "oauth-login-#{provider}" }) do
- if provider_has_icon?(provider)
= provider_image_tag(provider)
%span.gl-button-text
@@ -14,7 +14,7 @@
= _("Create an account using:")
.gl-display-flex.gl-justify-content-between.gl-flex-wrap
- providers.each do |provider|
- = button_to omniauth_authorize_path(:user, provider, register_omniauth_params(local_assigns)), class: "btn gl-button btn-default gl-w-full gl-mb-4 js-oauth-login #{qa_selector_for_provider(provider)}", data: { provider: provider, track_action: "#{provider}_sso", track_label: tracking_label }, id: "oauth-login-#{provider}" do
+ = render Pajamas::ButtonComponent.new(href: omniauth_authorize_path(:user, provider, register_omniauth_params(local_assigns)), method: :post, variant: :default, button_options: { class: "gl-w-full gl-mb-4 js-oauth-login #{qa_selector_for_provider(provider)}", data: { provider: provider, track_action: "#{provider}_sso", track_label: tracking_label}, id: "oauth-login-#{provider}" }) do
- if provider_has_icon?(provider)
= provider_image_tag(provider)
%span.gl-button-text
diff --git a/app/views/devise/unlocks/new.html.haml b/app/views/devise/unlocks/new.html.haml
index b9d50e48d05..8bae27020c2 100644
--- a/app/views/devise/unlocks/new.html.haml
+++ b/app/views/devise/unlocks/new.html.haml
@@ -1,14 +1,18 @@
= render 'devise/shared/tab_single', tab_title: _('Resend unlock instructions')
.login-box
.login-body
- = gitlab_ui_form_for(resource, as: resource_name, url: unlock_path(resource_name), html: { method: :post, class: 'gl-show-field-errors' }) do |f|
+ = gitlab_ui_form_for(resource, as: resource_name, url: unlock_path(resource_name), html: { method: :post, class: 'gl-p-5 gl-show-field-errors' }) do |f|
.devise-errors
= render "devise/shared/error_messages", resource: resource
- .form-group.gl-mb-6
- = f.label :email
- = f.email_field :email, class: 'form-control', autofocus: 'autofocus', autocapitalize: 'off', autocorrect: 'off', title: _('Please provide a valid email address.')
- .clearfix
- = f.submit _('Resend unlock instructions'), pajamas_button: true, class: 'gl-w-full'
+ .form-group
+ = f.label :email, _('Email')
+ = f.email_field :email, class: 'form-control gl-form-input', autofocus: 'autofocus', autocapitalize: 'off', autocorrect: 'off', title: _('Please provide a valid email address.')
-.clearfix.prepend-top-20
+ = render Pajamas::ButtonComponent.new(type: :submit, variant: :confirm, block: true) do
+ = _('Resend unlock instructions')
+
+- if Feature.enabled?(:restyle_login_page, @project)
= render 'devise/shared/sign_in_link'
+- else
+ .gl-mt-3
+ = render 'devise/shared/sign_in_link'
diff --git a/app/views/discussions/_notes.html.haml b/app/views/discussions/_notes.html.haml
index a35ba12dd52..e34a5cebe78 100644
--- a/app/views/discussions/_notes.html.haml
+++ b/app/views/discussions/_notes.html.haml
@@ -15,16 +15,14 @@
= badge_counter
= render partial: "shared/notes/note", collection: discussion.notes, as: :note, locals: { badge_counter: badge_counter, show_image_comment_badge: show_image_comment_badge }
- .flash-container
-
- .discussion-reply-holder
- - if can_create_note?
- .discussion-with-resolve-btn
- = link_to_reply_discussion(discussion)
- - elsif !current_user
- .disabled-comment.text-center
- Please
- = link_to "register", new_session_path(:user, redirect_to_referer: 'yes')
- or
- = link_to "sign in", new_session_path(:user, redirect_to_referer: 'yes')
- to reply
+ %li.discussion-reply-holder.clearfix{ class: 'gl-border-t-0! gl-pb-5!' }
+ - if can_create_note?
+ .discussion-with-resolve-btn
+ = link_to_reply_discussion(discussion)
+ - elsif !current_user
+ .disabled-comment.text-center
+ Please
+ = link_to "register", new_session_path(:user, redirect_to_referer: 'yes')
+ or
+ = link_to "sign in", new_session_path(:user, redirect_to_referer: 'yes')
+ to reply
diff --git a/app/views/events/_event_push.atom.haml b/app/views/events/_event_push.atom.haml
index c3786d7c16d..51b60fe0152 100644
--- a/app/views/events/_event_push.atom.haml
+++ b/app/views/events/_event_push.atom.haml
@@ -6,7 +6,7 @@
= link_to "(#{truncate_sha(event.commit_id)})", event_url if event_url
%i
at
- = event.created_at.to_s(:short)
+ = event.created_at.to_fs(:short)
- unless event.rm_ref?
.blockquote= markdown(escape_once(event.commit_title), pipeline: :atom, project: event.project, author: event.author)
- if event.commits_count > 1
diff --git a/app/views/explore/projects/_project.atom.builder b/app/views/explore/projects/_project.atom.builder
new file mode 100644
index 00000000000..f0500901a73
--- /dev/null
+++ b/app/views/explore/projects/_project.atom.builder
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+xml.entry do
+ xml.title project.name
+ xml.link href: project_url(project), rel: "alternate", type: "text/html"
+ xml.id project_url(project)
+ xml.updated project.created_at
+
+ if project.description.present?
+ xml.summary(type: "xhtml") do |summary|
+ summary << project.description
+ end
+ end
+end
diff --git a/app/views/explore/projects/topic.atom.builder b/app/views/explore/projects/topic.atom.builder
new file mode 100644
index 00000000000..4712d415daa
--- /dev/null
+++ b/app/views/explore/projects/topic.atom.builder
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+xml.title @topic.name
+xml.link href: topic_explore_projects_url(@topic.name, rss_url_options), rel: "self", type: "application/atom+xml"
+xml.link href: topic_explore_projects_url(@topic.name), rel: "alternate", type: "text/html"
+xml.id topic_explore_projects_url(@topic.id)
+xml.updated @projects[0].updated_at.xmlschema if @projects[0]
+
+xml << render(@projects) if @projects.any?
diff --git a/app/views/explore/projects/topic.html.haml b/app/views/explore/projects/topic.html.haml
index b26abefcb0e..329e7cc161c 100644
--- a/app/views/explore/projects/topic.html.haml
+++ b/app/views/explore/projects/topic.html.haml
@@ -22,9 +22,10 @@
%div{ class: container_class }
.gl-py-5.gl-border-gray-100.gl-border-b-solid.gl-border-b-1
%h3.gl-m-0= _('Projects with this topic')
- .top-area.gl-pt-2.gl-pb-2
+ .top-area.gl-pt-2.gl-pb-2.gl-justify-content-space-between
.nav-controls
= render 'shared/projects/search_form'
= render 'filter'
+ = link_button_to nil, topic_explore_projects_path(@topic.name, rss_url_options), title: s_("Topics|Subscribe to the new projects feed"), class: 'd-none d-sm-inline-flex has-tooltip', icon: 'rss'
= render 'projects', projects: @projects
diff --git a/app/views/groups/group_members/index.html.haml b/app/views/groups/group_members/index.html.haml
index 04bf3f98a1e..e5c66c2c432 100644
--- a/app/views/groups/group_members/index.html.haml
+++ b/app/views/groups/group_members/index.html.haml
@@ -3,16 +3,18 @@
.row.gl-mt-3
.col-lg-12
- .gl-display-flex.gl-flex-wrap
+ .gl-display-flex.gl-flex-wrap.gl-justify-content-space-between
- if can_admin_group_member?(@group)
%h4
= _('Group members')
%p.gl-w-full.order-md-1
= group_member_header_subtext(@group)
- .gl-display-flex.gl-flex-wrap.gl-align-items-flex-start.gl-ml-auto.gl-md-w-auto.gl-w-full.gl-mt-3
+ .gl-display-flex.gl-flex-wrap.gl-align-items-center.gl-gap-3.gl-md-w-auto.gl-w-full
.js-invite-group-trigger{ data: { classes: 'gl-md-w-auto gl-w-full', display_text: _('Invite a group') } }
+ - if can_admin_service_accounts?(@group)
+ = render_if_exists 'groups/group_members/create_service_account'
.js-invite-members-trigger{ data: { variant: 'confirm',
- classes: 'gl-md-w-auto gl-w-full gl-md-ml-3 gl-md-mt-0 gl-mt-3',
+ classes: 'gl-md-w-auto gl-w-full',
trigger_source: 'group-members-page',
display_text: _('Invite members') } }
= render 'groups/invite_groups_modal', group: @group, reload_page_on_submit: true
diff --git a/app/views/groups/milestones/_form.html.haml b/app/views/groups/milestones/_form.html.haml
index 89f460606cb..e84fd7a8692 100644
--- a/app/views/groups/milestones/_form.html.haml
+++ b/app/views/groups/milestones/_form.html.haml
@@ -10,12 +10,16 @@
= render "shared/milestones/form_dates", f: f
.form-group
= f.label :description, _("Description")
- = render layout: 'shared/md_preview', locals: { url: group_preview_markdown_path } do
- = render 'shared/zen', f: f, attr: :description,
- classes: 'note-textarea',
- qa_selector: 'milestone_description_field',
- supports_autocomplete: true,
- placeholder: _('Write milestone description...')
+ - @gfm_form = true
+ .js-markdown-editor{ data: { render_markdown_path: group_preview_markdown_path,
+ markdown_docs_path: help_page_path('user/markdown'),
+ qa_selector: 'milestone_description_field',
+ form_field_placeholder: _('Write milestone description...'),
+ supports_quick_actions: 'false',
+ enable_autocomplete: 'true',
+ autofocus: 'false',
+ form_field_classes: 'note-textarea js-gfm-input markdown-area' } }
+ = f.hidden_field :description
.clearfix
.error-alert
diff --git a/app/views/groups/packages/index.html.haml b/app/views/groups/packages/index.html.haml
index b6cf26c3677..6d0f24bf08c 100644
--- a/app/views/groups/packages/index.html.haml
+++ b/app/views/groups/packages/index.html.haml
@@ -10,4 +10,5 @@
npm_instance_url: package_registry_instance_url(:npm),
project_list_url: '',
settings_path: show_group_package_registry_settings(@group) ? group_settings_packages_and_registries_path(@group) : '',
+ can_delete_packages: can_delete_group_packages?(@group).to_s,
group_list_url: group_packages_path(@group) } }
diff --git a/app/views/groups/settings/_general.html.haml b/app/views/groups/settings/_general.html.haml
index 8c73fc95544..22ed6ea4403 100644
--- a/app/views/groups/settings/_general.html.haml
+++ b/app/views/groups/settings/_general.html.haml
@@ -33,7 +33,7 @@
= render 'shared/choose_avatar_button', f: f
- if @group.avatar?
%hr
- = link_to s_('Groups|Remove avatar'), group_avatar_path(@group.to_param), aria: { label: s_('Groups|Remove avatar') }, data: { confirm: s_('Groups|Avatar will be removed. Are you sure?'), 'confirm-btn-variant': 'danger' }, method: :delete, class: 'gl-button btn btn-danger-secondary'
+ = link_button_to s_('Groups|Remove avatar'), group_avatar_path(@group.to_param), aria: { label: s_('Groups|Remove avatar') }, data: { confirm: s_('Groups|Avatar will be removed. Are you sure?'), 'confirm-btn-variant': 'danger' }, method: :delete, variant: :danger, category: :secondary
.form-group.gl-form-group
= render 'shared/visibility_level', f: f, visibility_level: @group.visibility_level, can_change_visibility_level: can_change_group_visibility_level?(@group), form_model: @group
= f.submit s_('Groups|Save changes'), pajamas_button: true, class: 'js-dirty-submit', data: { qa_selector: 'save_name_visibility_settings_button' }
diff --git a/app/views/groups/settings/access_tokens/index.html.haml b/app/views/groups/settings/access_tokens/index.html.haml
index 96a492e599e..ac3be429461 100644
--- a/app/views/groups/settings/access_tokens/index.html.haml
+++ b/app/views/groups/settings/access_tokens/index.html.haml
@@ -4,40 +4,39 @@
- type_plural = _('group access tokens')
- @force_desktop_expanded_sidebar = true
-.row.gl-mt-3.js-search-settings-section
- .col-lg-4
- %h4.gl-mt-0
- = page_title
- %p
- - link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/group/settings/group_access_tokens') }
+.settings-section.js-search-settings-section
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0
+ = page_title
+ %p.gl-text-secondary
+ - help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/group/settings/group_access_tokens') }
- if current_user.can?(:create_resource_access_tokens, @group)
= _('Generate group access tokens scoped to this group for your applications that need access to the GitLab API.')
- %p
- = html_escape(_('You can also use group access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}')) % { link_start: link_start, link_end: '</a>'.html_safe }
+ = html_escape(_('You can also use group access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}')) % { link_start: help_link_start, link_end: '</a>'.html_safe }
- else
- = html_escape(_('Group access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}')) % { link_start: link_start, link_end: '</a>'.html_safe }
- %p
+ = _('Group access token creation is disabled in this group.')
- root_group = @group.root_ancestor
- if current_user.can?(:admin_group, root_group)
- group_settings_link = edit_group_path(root_group)
- link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: group_settings_link }
= html_escape(_('You can enable group access token creation in %{link_start}group settings%{link_end}.')) % { link_start: link_start, link_end: '</a>'.html_safe }
+ = html_escape(_('You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}')) % { link_start: help_link_start, link_end: '</a>'.html_safe }
- .col-lg-8
- #js-new-access-token-app{ data: { access_token_type: type } }
+ #js-new-access-token-app{ data: { access_token_type: type } }
- - if current_user.can?(:create_resource_access_tokens, @group)
- = render 'shared/access_tokens/form',
- ajax: true,
- type: type,
- path: group_settings_access_tokens_path(@group),
- resource: @group,
- token: @resource_access_token,
- scopes: @scopes,
- access_levels: GroupMember.access_level_roles,
- default_access_level: Gitlab::Access::GUEST,
- prefix: :resource_access_token,
- help_path: help_page_path('user/group/settings/group_access_tokens', anchor: 'scopes-for-a-group-access-token')
+ - if current_user.can?(:create_resource_access_tokens, @group)
+ = render 'shared/access_tokens/form',
+ ajax: true,
+ type: type,
+ path: group_settings_access_tokens_path(@group),
+ resource: @group,
+ token: @resource_access_token,
+ scopes: @scopes,
+ access_levels: GroupMember.access_level_roles,
+ default_access_level: Gitlab::Access::GUEST,
+ prefix: :resource_access_token,
+ help_path: help_page_path('user/group/settings/group_access_tokens', anchor: 'scopes-for-a-group-access-token')
- #js-access-token-table-app{ data: { access_token_type: type, access_token_type_plural: type_plural, initial_active_access_tokens: @active_access_tokens.to_json, no_active_tokens_message: _('This group has no active access tokens.'), show_role: true
+ #js-access-token-table-app{ data: { access_token_type: type, access_token_type_plural: type_plural, initial_active_access_tokens: @active_access_tokens.to_json, no_active_tokens_message: _('This group has no active access tokens.'), show_role: true
} }
diff --git a/app/views/groups/settings/ci_cd/_form.html.haml b/app/views/groups/settings/ci_cd/_form.html.haml
index d31d22c61be..9b23a8c5e0e 100644
--- a/app/views/groups/settings/ci_cd/_form.html.haml
+++ b/app/views/groups/settings/ci_cd/_form.html.haml
@@ -7,5 +7,5 @@
= f.number_field :max_artifacts_size, class: 'form-control'
%p.form-text.text-muted
= _("The maximum file size in megabytes for individual job artifacts.")
- = link_to _('Learn more.'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'maximum-artifacts-size'), target: '_blank', rel: 'noopener noreferrer'
+ = link_to _('Learn more.'), help_page_path('administration/settings/continuous_integration', anchor: 'maximum-artifacts-size'), target: '_blank', rel: 'noopener noreferrer'
= f.submit _('Save changes'), pajamas_button: true
diff --git a/app/views/import/fogbugz/new.html.haml b/app/views/import/fogbugz/new.html.haml
index bd0e4b51a63..2edd9cd5592 100644
--- a/app/views/import/fogbugz/new.html.haml
+++ b/app/views/import/fogbugz/new.html.haml
@@ -24,4 +24,5 @@
.col-md-4
= password_field_tag :password, nil, class: 'form-control gl-form-input'
.form-actions
- = submit_tag _('Continue to the next step'), class: 'gl-button btn btn-confirm'
+ = render Pajamas::ButtonComponent.new(type: :submit, variant: :confirm) do
+ = _('Continue to the next step')
diff --git a/app/views/invites/show.html.haml b/app/views/invites/show.html.haml
index 5f65405c8bc..d368f013e6b 100644
--- a/app/views/invites/show.html.haml
+++ b/app/views/invites/show.html.haml
@@ -6,7 +6,7 @@
%p
= _("You are already a member of this %{member_source}.") % { member_source: @invite_details[:title] }
.actions
- = link_to _("Go to %{source_name}") % { source_name: @invite_details[:title] }, @invite_details[:url], class: "btn gl-button btn-confirm"
+ = link_button_to _("Go to %{source_name}") % { source_name: @invite_details[:title] }, @invite_details[:url], variant: :confirm
- else
%p
diff --git a/app/views/layouts/_google_tag_manager_head.html.haml b/app/views/layouts/_google_tag_manager_head.html.haml
index 21b9a604a35..711a3d66ff7 100644
--- a/app/views/layouts/_google_tag_manager_head.html.haml
+++ b/app/views/layouts/_google_tag_manager_head.html.haml
@@ -1,4 +1,5 @@
- return unless google_tag_manager_enabled?
+
- if Feature.enabled?(:gitlab_gtm_datalayer, type: :ops)
= javascript_tag do
:plain
diff --git a/app/views/layouts/_head.html.haml b/app/views/layouts/_head.html.haml
index d3a4c5c5ba8..53ecad1b474 100644
--- a/app/views/layouts/_head.html.haml
+++ b/app/views/layouts/_head.html.haml
@@ -3,12 +3,11 @@
- omit_og = sign_in_with_redirect?
%head{ omit_og ? { } : { 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' }
+ %meta{ name: 'viewport', content: 'width=device-width, initial-scale=1, maximum-scale=1' }
+ %title= page_title(site_name)
+ = Gon::Base.render_data(nonce: content_security_policy_nonce)
+ = yield :project_javascripts
= render 'layouts/startup_js'
= yield :startup_js
@@ -18,14 +17,9 @@
= yield :prefetch_asset_tags
- = favicon_link_tag favicon, id: 'favicon', data: { original_href: favicon }, type: 'image/png'
-
- - if startup_css_enabled?
- = render 'layouts/startup_css', { startup_filename: local_assigns.fetch(:startup_filename, nil) }
- - else
- - diffs_colors = user_diffs_colors
- = stylesheet_link_tag "themes/#{user_application_theme_css_filename}" if user_application_theme_css_filename
- = render 'layouts/diffs_colors_css', diffs_colors if diffs_colors.present? || request.path == profile_preferences_path
+ - diffs_colors = user_diffs_colors
+ = stylesheet_link_tag "themes/#{user_application_theme_css_filename}" if user_application_theme_css_filename
+ = render 'layouts/diffs_colors_css', diffs_colors if diffs_colors.present? || request.path == profile_preferences_path
- if user_application_theme == 'gl-dark'
%meta{ name: 'color-scheme', content: 'dark light' }
@@ -43,13 +37,9 @@
= stylesheet_link_tag_defer "highlight/themes/#{user_color_scheme}"
- - if startup_css_enabled?
- = render 'layouts/startup_css_activation'
-
= stylesheet_link_tag 'performance_bar' if performance_bar_enabled?
= render 'layouts/snowplow'
-
- = Gon::Base.render_data(nonce: content_security_policy_nonce)
+ = render 'layouts/loading_hints'
= render_if_exists 'layouts/header/translations'
- if Feature.enabled?(:enable_new_sentry_clientside_integration, current_user) && Gitlab::CurrentSettings.sentry_enabled
@@ -64,8 +54,6 @@
= webpack_controller_bundle_tags
- = yield :project_javascripts
-
- unless omit_og
-# Open Graph - http://ogp.me/
%meta{ property: 'og:type', content: "object" }
@@ -84,16 +72,13 @@
%meta{ property: 'twitter:image', content: page_image }
= page_card_meta_tags
- %meta{ name: "description", content: page_description }
-
- %link{ rel: 'manifest', href: manifest_path(format: :json) }
- %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
+ %link{ rel: 'manifest', href: manifest_path(format: :json) }
+ = favicon_link_tag favicon, id: 'favicon', data: { original_href: favicon }, type: 'image/png'
+
-# Apple Safari/iOS home screen icons
= favicon_link_tag 'apple-touch-icon.png', rel: 'apple-touch-icon'
@@ -106,3 +91,5 @@
= render 'layouts/matomo' if extra_config.has_key?('matomo_url') && extra_config.has_key?('matomo_site_id')
-# This is needed by [GitLab JH](https://gitlab.com/gitlab-jh/gitlab/-/issues/184)
= render_if_exists "layouts/frontend_monitor"
+ %meta{ name: "description", content: page_description }
+ %meta{ name: 'theme-color', content: user_theme_primary_color }
diff --git a/app/views/layouts/_header_search.html.haml b/app/views/layouts/_header_search.html.haml
index 1d5f2583bbd..add518723e5 100644
--- a/app/views/layouts/_header_search.html.haml
+++ b/app/views/layouts/_header_search.html.haml
@@ -9,7 +9,7 @@
%input{ id: 'search', name: 'search', type: "text", placeholder: s_('GlobalSearch|Search GitLab'),
class: 'form-control gl-form-input gl-search-box-by-type-input',
autocomplete: 'off',
- data: { qa_selector: 'search_box' } }
+ data: { testid: 'search_box' } }
= hidden_field_tag :group_id, header_search_context[:group][:id] if header_search_context[:group]
= hidden_field_tag :project_id, header_search_context[:project][:id] if header_search_context[:project]
diff --git a/app/views/layouts/_img_loader.html.haml b/app/views/layouts/_img_loader.html.haml
index 979ebeb0a02..c1fe3ae0924 100644
--- a/app/views/layouts/_img_loader.html.haml
+++ b/app/views/layouts/_img_loader.html.haml
@@ -13,6 +13,6 @@
img.removeAttribute('data-src');
img.classList.remove('lazy');
img.classList.add('js-lazy-loaded');
- img.dataset.qa_selector = 'js_lazy_loaded_content';
+ img.dataset.testid = 'js_lazy_loaded_content';
});
}
diff --git a/app/views/layouts/_mailer.html.haml b/app/views/layouts/_mailer.html.haml
index 95ebe09a2e6..8b864c2685e 100644
--- a/app/views/layouts/_mailer.html.haml
+++ b/app/views/layouts/_mailer.html.haml
@@ -1,5 +1,5 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-%html{ lang: "en" }
+%html{ lang: I18n.locale }
%head
%meta{ content: "text/html; charset=UTF-8", "http-equiv" => "Content-Type" }/
%meta{ content: "width=device-width, initial-scale=1", name: "viewport" }/
diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml
index 8e52f973e9e..3bb59db32aa 100644
--- a/app/views/layouts/_page.html.haml
+++ b/app/views/layouts/_page.html.haml
@@ -5,9 +5,9 @@
-# Render the parent group sidebar while creating a new subgroup/project, see GroupsController#new.
- group = @parent_group || @group
- - sidebar_panel = super_sidebar_nav_panel(nav: nav, user: current_user, group: group, project: @project, current_ref: current_ref, ref_type: @ref_type, viewed_user: @user)
+ - sidebar_panel = super_sidebar_nav_panel(nav: nav, user: current_user, group: group, project: @project, current_ref: current_ref, ref_type: @ref_type, viewed_user: @user, organization: @organization)
- sidebar_data = super_sidebar_context(current_user, group: group, project: @project, panel: sidebar_panel, panel_type: nav).to_json
- %aside.js-super-sidebar.super-sidebar.super-sidebar-loading{ data: { root_path: root_path, sidebar: sidebar_data, toggle_new_nav_endpoint: profile_preferences_url, force_desktop_expanded_sidebar: @force_desktop_expanded_sidebar.to_s } }
+ %aside.js-super-sidebar.super-sidebar.super-sidebar-loading{ data: { root_path: root_path, sidebar: sidebar_data, toggle_new_nav_endpoint: profile_preferences_url, force_desktop_expanded_sidebar: @force_desktop_expanded_sidebar.to_s, command_palette: command_palette_data(project: @project).to_json } }
- if display_whats_new?
#whats-new-app{ data: { version_digest: whats_new_version_digest } }
diff --git a/app/views/layouts/_startup_css.haml b/app/views/layouts/_startup_css.haml
deleted file mode 100644
index 64a86cf319e..00000000000
--- a/app/views/layouts/_startup_css.haml
+++ /dev/null
@@ -1,9 +0,0 @@
-- startup_filename_default = user_application_theme == 'gl-dark' ? 'dark' : 'general'
-- startup_filename = local_assigns.fetch(:startup_filename, nil) || startup_filename_default
-- diffs_colors = user_diffs_colors
-
-%style
- = Rails.application.assets_manifest.find_sources("themes/#{user_application_theme_css_filename}.css").first.to_s.html_safe if user_application_theme_css_filename
- = Rails.application.assets_manifest.find_sources("startup/startup-#{startup_filename}.css").first.to_s.html_safe
-
-= render 'layouts/diffs_colors_css', diffs_colors if diffs_colors.present? || request.path == profile_preferences_path
diff --git a/app/views/layouts/_startup_css_activation.haml b/app/views/layouts/_startup_css_activation.haml
deleted file mode 100644
index 7dfb9cd1530..00000000000
--- a/app/views/layouts/_startup_css_activation.haml
+++ /dev/null
@@ -1,7 +0,0 @@
-= javascript_tag do
- :plain
- document.querySelectorAll('link[media="print"]').forEach(linkTag => {
- linkTag.setAttribute('data-startupcss', 'loading');
- const startupLinkLoadedEvent = new CustomEvent('CSSStartupLinkLoaded');
- linkTag.addEventListener('load',function(){this.media='all';this.setAttribute('data-startupcss', 'loaded');document.dispatchEvent(startupLinkLoadedEvent);},{once: true});
- })
diff --git a/app/views/layouts/devise.html.haml b/app/views/layouts/devise.html.haml
index 6e1d3ba678c..94f25a9f0ae 100644
--- a/app/views/layouts/devise.html.haml
+++ b/app/views/layouts/devise.html.haml
@@ -1,19 +1,19 @@
- add_page_specific_style 'page_bundles/login'
- custom_text = custom_sign_in_description
!!! 5
-%html.devise-layout-html{ class: system_message_class }
+%html.html-devise-layout{ lang: I18n.locale }
= render "layouts/head", { startup_filename: 'signin' }
- %body.login-page.application.navless{ class: "#{user_application_theme} #{client_class_list}", data: { page: body_data_page, qa_selector: 'login_page' } }
+ %body.gl-h-full.login-page.navless{ class: "#{system_message_class} #{user_application_theme} #{client_class_list}", data: { page: body_data_page, qa_selector: 'login_page' } }
= header_message
= render "layouts/init_client_detection_flags"
- if Feature.enabled?(:restyle_login_page, @project)
- .page-wrap.borderless
- .container.navless-container
+ .gl-h-full.borderless.gl-display-flex.gl-flex-wrap
+ .container
.content
= render "layouts/flash"
- if custom_text.present?
.row
- .col-md.order-12.sm-bg-gray-10
+ .col-md.order-12.sm-bg-gray
.col-sm-12
%h1.mb-3.gl-font-size-h2
= brand_title
@@ -33,11 +33,11 @@
.gl-w-half.gl-xs-w-full.gl-ml-auto.gl-mr-auto.bar
= yield
- = render 'devise/shared/footer', footer_message: footer_message
+ = render 'devise/shared/footer'
- else
- .page-wrap
- = render "layouts/header/empty"
- .container.navless-container
+ = render "layouts/header/empty"
+ .gl-h-full.gl-display-flex.gl-flex-wrap
+ .container
.content
= render "layouts/flash"
.row.mt-3
@@ -60,7 +60,7 @@
%p
= _('This is a self-managed instance of GitLab.')
- .col-md-6.order-1.new-session-forms-container{ class: recently_confirmed_com? ? 'order-sm-first' : 'order-sm-12' }
+ .col-md-6.order-1{ class: recently_confirmed_com? ? 'order-sm-first' : 'order-sm-12' }
= yield
- = render 'devise/shared/footer', footer_message: footer_message
+ = render 'devise/shared/footer'
diff --git a/app/views/layouts/devise_empty.html.haml b/app/views/layouts/devise_empty.html.haml
index 89aba85984f..3e969b866a6 100644
--- a/app/views/layouts/devise_empty.html.haml
+++ b/app/views/layouts/devise_empty.html.haml
@@ -1,15 +1,15 @@
- add_page_specific_style 'page_bundles/login'
!!! 5
-%html.devise-layout-html{ lang: "en", class: system_message_class }
+%html.html-devise-layout{ lang: I18n.locale }
= render "layouts/head"
- %body.login-page.application.navless{ class: "#{user_application_theme} #{client_class_list}" }
+ %body.gl-h-full.login-page.navless{ class: "#{system_message_class} #{user_application_theme} #{client_class_list}" }
= header_message
= render "layouts/init_client_detection_flags"
= render "layouts/header/empty"
- = render "layouts/broadcast"
- .container.navless-container
- .content
- = render "layouts/flash"
- = yield
+ .gl-h-full.gl-display-flex.gl-flex-wrap
+ .container
+ .content
+ = render "layouts/flash"
+ = yield
- = render 'devise/shared/footer', footer_message: footer_message
+ = render 'devise/shared/footer'
diff --git a/app/views/layouts/errors.html.haml b/app/views/layouts/errors.html.haml
index 3ddd8c6780f..5ad20478f51 100644
--- a/app/views/layouts/errors.html.haml
+++ b/app/views/layouts/errors.html.haml
@@ -1,5 +1,5 @@
!!! 5
-%html{ lang: "en" }
+%html{ lang: I18n.locale }
%head
%meta{ :content => "width=device-width, initial-scale=1, maximum-scale=1", :name => "viewport" }
%title= yield(:title)
diff --git a/app/views/layouts/header/_current_user_dropdown.html.haml b/app/views/layouts/header/_current_user_dropdown.html.haml
index 65dbafc19da..e04ffc2e88a 100644
--- a/app/views/layouts/header/_current_user_dropdown.html.haml
+++ b/app/views/layouts/header/_current_user_dropdown.html.haml
@@ -3,7 +3,7 @@
%ul
%li.current-user
- if current_user_menu?(:profile)
- = link_to current_user, class: 'gl-line-height-20!', data: { user: current_user.username, testid: 'user-profile-link', track_action: "click_link", track_label: "user_profile", track_property: "navigation_top", qa_selector: 'user_profile_link' } do
+ = link_to current_user, class: 'gl-line-height-20!', data: { user: current_user.username, testid: 'user-profile-link', track_action: "click_link", track_label: "user_profile", track_property: "navigation_top" } do
= render 'layouts/header/current_user_dropdown_item'
- else
.gl-py-3.gl-px-4
@@ -19,7 +19,7 @@
= dispensable_render_if_exists 'layouts/header/start_trial'
- if current_user_menu?(:settings)
%li
- = link_to s_("CurrentUser|Edit profile"), profile_path, data: { qa_selector: 'edit_profile_link', track_action: "click_link", track_label: "user_edit_profile", track_property: "navigation_top" }
+ = link_to s_("CurrentUser|Edit profile"), profile_path, data: { testid: 'edit_profile_link', track_action: "click_link", track_label: "user_edit_profile", track_property: "navigation_top" }
%li
= link_to s_("CurrentUser|Preferences"), profile_preferences_path, data: { track_action: "click_link", track_label: "user_preferences", track_property: "navigation_top" }
= render_if_exists 'layouts/header/buy_pipeline_minutes', project: @project, namespace: @group
@@ -48,4 +48,4 @@
- if current_user_menu?(:sign_out)
%li.divider
%li
- = link_to _("Sign out"), destroy_user_session_path, method: :post, class: "sign-out-link", data: { qa_selector: 'sign_out_link', track_action: "click_link", track_label: "user_sign_out", track_property: "navigation_top" }
+ = link_to _("Sign out"), destroy_user_session_path, method: :post, class: "sign-out-link", data: { testid: 'sign_out_link', track_action: "click_link", track_label: "user_sign_out", track_property: "navigation_top" }
diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml
index 2c6ccb4abaf..1c22a853dd0 100644
--- a/app/views/layouts/header/_default.html.haml
+++ b/app/views/layouts/header/_default.html.haml
@@ -1,7 +1,7 @@
- has_impersonation_link = header_link?(:admin_impersonation)
- user_status_data = user_status_properties(current_user)
-%header.navbar.navbar-gitlab.navbar-expand-sm.js-navbar{ data: { qa_selector: 'navbar' } }
+%header.navbar.navbar-gitlab.navbar-expand-sm.js-navbar{ data: { testid: 'navbar' } }
%a.gl-sr-only.gl-accessibility{ href: "#content-body" } Skip to content
.container-fluid
.header-content.js-header-content
@@ -12,7 +12,7 @@
= brand_header_logo
.gl-display-flex.gl-align-items-center
- if Gitlab.com_and_canary?
- = gl_badge_tag({ variant: :success, size: :sm }, { href: Gitlab::Saas.canary_toggle_com_url, data: { qa_selector: 'canary_badge_link' }, target: :_blank, rel: 'noopener noreferrer', class: 'canary-badge' }) do
+ = gl_badge_tag({ variant: :success, size: :sm }, { href: Gitlab::Saas.canary_toggle_com_url, data: { testid: 'canary_badge_link' }, target: :_blank, rel: 'noopener noreferrer', class: 'canary-badge' }) do
= _('Next')
- if current_user
@@ -47,7 +47,7 @@
- if header_link?(:issues)
= nav_link(path: 'dashboard#issues', html_options: { class: "user-counter" }) do
= link_to assigned_issues_dashboard_path, title: _('Issues'), class: 'dashboard-shortcuts-issues js-prefetch-document', aria: { label: _('Issues') },
- data: { qa_selector: 'issues_shortcut_button', toggle: 'tooltip', placement: 'bottom',
+ data: { testid: 'issues_shortcut_button', toggle: 'tooltip', placement: 'bottom',
track_label: 'main_navigation',
track_action: 'click_issues_link',
track_property: 'navigation_top',
@@ -60,7 +60,7 @@
= nav_link(path: 'dashboard#merge_requests', html_options: { class: "user-counter dropdown" }) do
- top_level_link = assigned_mrs_dashboard_path
= link_to top_level_link, class: 'dashboard-shortcuts-merge_requests has-tooltip', title: _('Merge requests'), aria: { label: _('Merge requests') },
- data: { qa_selector: 'merge_requests_shortcut_button',
+ data: { testid: 'merge_requests_shortcut_button',
toggle: "dropdown",
placement: 'bottom',
track_label: 'merge_requests_menu',
@@ -92,7 +92,7 @@
- if header_link?(:todos)
= nav_link(controller: 'dashboard/todos', html_options: { class: "user-counter" }) do
= link_to dashboard_todos_path, title: _('To-Do List'), aria: { label: _('To-Do List') }, class: 'shortcuts-todos js-prefetch-document',
- data: { qa_selector: 'todos_shortcut_button', toggle: 'tooltip', placement: 'bottom',
+ data: { testid: 'todos_shortcut_button', toggle: 'tooltip', placement: 'bottom',
track_label: 'main_navigation',
track_action: 'click_to_do_link',
track_property: 'navigation_top',
@@ -115,16 +115,16 @@
%li.nav-item.gl-display-none.gl-sm-display-block
= render "layouts/nav/top_nav"
- if header_link?(:user_dropdown)
- %li.nav-item.header-user.js-nav-user-dropdown.dropdown{ data: { qa_selector: 'user_menu', testid: 'user-menu' }, class: ('mr-0' if has_impersonation_link) }
+ %li.nav-item.header-user.js-nav-user-dropdown.dropdown{ data: { testid: 'user-dropdown' }, class: ('mr-0' if has_impersonation_link) }
= link_to current_user, class: user_dropdown_class, data: { toggle: "dropdown", track_label: "profile_dropdown", track_action: "click_dropdown", track_property: "navigation_top" } do
- = render Pajamas::AvatarComponent.new(current_user, size: 24, class: 'header-user-avatar', avatar_options: { data: { qa_selector: 'user_avatar_content' } })
+ = render Pajamas::AvatarComponent.new(current_user, size: 24, class: 'header-user-avatar', avatar_options: { data: { testid: 'user_avatar_content' } })
= render_if_exists 'layouts/header/user_notification_dot', project: project, namespace: group
= sprite_icon('chevron-down', css_class: 'caret-down')
.dropdown-menu.dropdown-menu-right
= render 'layouts/header/current_user_dropdown'
- if has_impersonation_link
%li.nav-item.impersonation.ml-0
- = render Pajamas::ButtonComponent.new(href: admin_impersonation_path, icon: 'incognito', button_options: { title: _('Stop impersonation'), class: 'impersonation-btn', aria: { label: _('Stop impersonation') }, data: { method: :delete, toggle: 'tooltip', placement: 'bottom', container: 'body', qa_selector: 'stop_impersonation_link' } })
+ = render Pajamas::ButtonComponent.new(href: admin_impersonation_path, icon: 'incognito', button_options: { title: _('Stop impersonation'), class: 'impersonation-btn', aria: { label: _('Stop impersonation') }, data: { method: :delete, toggle: 'tooltip', placement: 'bottom', container: 'body', testid: 'stop_impersonation_btn' } })
- if header_link?(:sign_in)
- if allow_signup?
%li.nav-item
@@ -133,7 +133,7 @@
%li.nav-item{ class: 'gl-flex-grow-0! gl-flex-basis-half!' }
= link_to _('Sign in'), new_session_path(:user, redirect_to_referer: 'yes')
- %button.navbar-toggler.d-block.d-sm-none{ type: 'button', class: 'gl-border-none!', data: { testid: 'top-nav-responsive-toggle', qa_selector: 'mobile_navbar_button' } }
+ %button.navbar-toggler.d-block.d-sm-none{ type: 'button', class: 'gl-border-none!', data: { testid: 'mobile_navbar_button' } }
%span.sr-only= _('Toggle navigation')
%span.more-icon.gl-px-3.gl-font-sm.gl-font-weight-bold
%span.gl-pr-2= _('Menu')
diff --git a/app/views/layouts/header/_new_dropdown.html.haml b/app/views/layouts/header/_new_dropdown.html.haml
index 50a2b45aa7e..3fe2894f236 100644
--- a/app/views/layouts/header/_new_dropdown.html.haml
+++ b/app/views/layouts/header/_new_dropdown.html.haml
@@ -13,7 +13,7 @@
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', testid: 'new-dropdown' } do
+ testid: '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/in_product_marketing_mailer.html.haml b/app/views/layouts/in_product_marketing_mailer.html.haml
index 65c68c95d9a..312e1811e3c 100644
--- a/app/views/layouts/in_product_marketing_mailer.html.haml
+++ b/app/views/layouts/in_product_marketing_mailer.html.haml
@@ -1,5 +1,5 @@
!!!
-%html{ lang: "en" }
+%html{ lang: I18n.locale }
%head
%meta{ content: "text/html; charset=utf-8", "http-equiv" => "Content-Type" }
%meta{ content: "width=device-width, initial-scale=1", name: "viewport" }
diff --git a/app/views/layouts/jira_connect.html.haml b/app/views/layouts/jira_connect.html.haml
index 80bbe578510..89d5abd4266 100644
--- a/app/views/layouts/jira_connect.html.haml
+++ b/app/views/layouts/jira_connect.html.haml
@@ -1,4 +1,4 @@
-%html{ lang: "en" }
+%html{ lang: I18n.locale }
%head
%meta{ content: "text/html; charset=utf-8", "http-equiv" => "Content-Type" }
%title
diff --git a/app/views/layouts/nav/_ask_duo_button.html.haml b/app/views/layouts/nav/_ask_duo_button.html.haml
new file mode 100644
index 00000000000..f17ccfc8afe
--- /dev/null
+++ b/app/views/layouts/nav/_ask_duo_button.html.haml
@@ -0,0 +1,13 @@
+- if Gitlab.ee? && ::Gitlab::Llm::TanukiBot.show_breadcrumbs_entry_point_for?(user: current_user)
+ - label = s_('TanukiBot|Ask GitLab Duo')
+ = render Pajamas::ButtonComponent.new(variant: :confirm,
+ category: :secondary,
+ icon: 'tanuki-ai',
+ size: 'small',
+ button_options: { class: 'js-tanuki-bot-chat-toggle gl-ml-3 gl-display-none gl-md-display-inline', data: { track_action: 'click_button', track_label: 'tanuki_bot_breadcrumbs_button' }, aria: { label: label }}) do
+ = label
+ = render Pajamas::ButtonComponent.new(variant: :confirm,
+ category: :secondary,
+ icon: 'tanuki-ai',
+ size: 'small',
+ button_options: { class: 'js-tanuki-bot-chat-toggle has-tooltip gl-ml-3 gl-md-display-none', title: label, data: { track_action: 'click_button', track_label: 'tanuki_bot_breadcrumbs_button', placement: 'left' }, aria: { label: label }})
diff --git a/app/views/layouts/nav/_top_bar.html.haml b/app/views/layouts/nav/_top_bar.html.haml
index a0e03c9c0cf..73b253e18bd 100644
--- a/app/views/layouts/nav/_top_bar.html.haml
+++ b/app/views/layouts/nav/_top_bar.html.haml
@@ -5,10 +5,11 @@
- top_bar_class = [@no_top_bar_container ? 'container-fluid' : container_class, @content_class]
- top_bar_container_class = 'gl-border-b'
-%div{ class: top_bar_class }
- .top-bar-container.gl-display-flex.gl-align-items-center{ :class => top_bar_container_class }
+%div{ class: top_bar_class, data: { testid: 'top-bar' } }
+ .top-bar-container.gl-display-flex.gl-align-items-center.gl-gap-2{ :class => top_bar_container_class }
- if show_super_sidebar?
- = render Pajamas::ButtonComponent.new(icon: 'sidebar', category: :tertiary, button_options: { class: 'js-super-sidebar-toggle-expand super-sidebar-toggle gl-ml-n3 gl-mr-2', title: _('Expand sidebar'), aria: { controls: 'super-sidebar', expanded: 'false', label: _('Navigation sidebar') } })
+ = render Pajamas::ButtonComponent.new(icon: 'sidebar', category: :tertiary, button_options: { class: 'js-super-sidebar-toggle-expand super-sidebar-toggle gl-ml-n3', title: _('Expand sidebar'), aria: { controls: 'super-sidebar', expanded: 'false', label: _('Navigation sidebar') } })
- elsif defined?(@left_sidebar)
- = render Pajamas::ButtonComponent.new(icon: 'sidebar', category: :tertiary, button_options: { class: 'toggle-mobile-nav gl-ml-n3 gl-mr-2', data: { qa_selector: 'toggle_mobile_nav_button' }, aria: { label: _('Open sidebar') } })
+ = render Pajamas::ButtonComponent.new(icon: 'sidebar', category: :tertiary, button_options: { class: 'toggle-mobile-nav gl-ml-n3', data: { testid: 'toggle_mobile_nav_button' }, aria: { label: _('Open sidebar') } })
= render "layouts/nav/breadcrumbs/breadcrumbs"
+ = render "layouts/nav/ask_duo_button"
diff --git a/app/views/layouts/nav/sidebar/_organization.html.haml b/app/views/layouts/nav/sidebar/_organization.html.haml
new file mode 100644
index 00000000000..de6c87f97d7
--- /dev/null
+++ b/app/views/layouts/nav/sidebar/_organization.html.haml
@@ -0,0 +1 @@
+= render partial: 'shared/nav/sidebar', object: Sidebars::Organizations::Panel.new(organization_sidebar_context(@organization, current_user))
diff --git a/app/views/layouts/notify.html.haml b/app/views/layouts/notify.html.haml
index c557dc36534..1f526ec221d 100644
--- a/app/views/layouts/notify.html.haml
+++ b/app/views/layouts/notify.html.haml
@@ -1,4 +1,4 @@
-%html{ lang: "en" }
+%html{ lang: I18n.locale }
%head
%meta{ content: "text/html; charset=utf-8", "http-equiv" => "Content-Type" }
%title
diff --git a/app/views/layouts/oauth_error.html.haml b/app/views/layouts/oauth_error.html.haml
index 8d241dfd207..d5e0e8e9c1d 100644
--- a/app/views/layouts/oauth_error.html.haml
+++ b/app/views/layouts/oauth_error.html.haml
@@ -1,5 +1,5 @@
!!! 5
-%html{ lang: "en" }
+%html{ lang: I18n.locale }
%head
%meta{ :content => "width=device-width, initial-scale=1, maximum-scale=1", :name => "viewport" }
%title= yield(:title)
diff --git a/app/views/layouts/organization.html.haml b/app/views/layouts/organization.html.haml
new file mode 100644
index 00000000000..5a357c6f805
--- /dev/null
+++ b/app/views/layouts/organization.html.haml
@@ -0,0 +1,6 @@
+- page_title @organization.name
+- header_title @organization.name, organization_path(@organization)
+- nav "organization"
+- @left_sidebar = true
+
+= render template: "layouts/application"
diff --git a/app/views/layouts/service_desk.html.haml b/app/views/layouts/service_desk.html.haml
index 7ac108e7f31..13e9785317c 100644
--- a/app/views/layouts/service_desk.html.haml
+++ b/app/views/layouts/service_desk.html.haml
@@ -1,4 +1,4 @@
-%html{ lang: "en" }
+%html{ lang: I18n.locale }
%head
%meta{ content: "text/html; charset=utf-8", "http-equiv" => "Content-Type" }
-# haml-lint:disable NoPlainNodes
diff --git a/app/views/layouts/signup_onboarding.html.haml b/app/views/layouts/signup_onboarding.html.haml
index 8cbea686d51..a5953021671 100644
--- a/app/views/layouts/signup_onboarding.html.haml
+++ b/app/views/layouts/signup_onboarding.html.haml
@@ -1,13 +1,14 @@
+- add_page_specific_style 'page_bundles/signup'
+- add_page_specific_style 'page_bundles/login'
!!! 5
-%html.devise-layout-html.navless{ class: system_message_class }
- - add_page_specific_style 'page_bundles/signup'
- - add_page_specific_style 'page_bundles/login'
+%html.html-devise-layout{ lang: I18n.locale }
= render "layouts/head"
- %body.signup-page{ class: "#{user_application_theme} #{client_class_list}", data: { page: body_data_page, qa_selector: 'signup_page' } }
- = render "layouts/header/logo_with_title"
+ %body.signup-page.navless{ class: "#{system_message_class} #{user_application_theme} #{client_class_list}", data: { page: body_data_page, qa_selector: 'signup_page' } }
+ = header_message
= render "layouts/init_client_detection_flags"
- .page-wrap
- .container.signup-box-container.navless-container
- = render "layouts/broadcast"
- .content
- = yield
+ = render "layouts/header/logo_with_title"
+ .container
+ .content
+ = yield
+
+ = footer_message
diff --git a/app/views/layouts/simple_registration.html.haml b/app/views/layouts/simple_registration.html.haml
deleted file mode 100644
index a68941b031f..00000000000
--- a/app/views/layouts/simple_registration.html.haml
+++ /dev/null
@@ -1,11 +0,0 @@
-!!! 5
-%html{ lang: "en" }
- = render "layouts/head"
- - add_page_specific_style 'page_bundles/login'
- %body.login-page.application.navless{ class: user_application_theme, data: { page: body_data_page } }
- = render "layouts/header/logo_with_title"
- = render "layouts/broadcast"
- .container.navless-container.pt-0
- .content.mw-460.mx-auto
- = render "layouts/flash"
- = yield
diff --git a/app/views/notify/_successful_pipeline.html.haml b/app/views/notify/_successful_pipeline.html.haml
index 88e0bbf6125..683ee97aca3 100644
--- a/app/views/notify/_successful_pipeline.html.haml
+++ b/app/views/notify/_successful_pipeline.html.haml
@@ -100,7 +100,8 @@
%tbody
%tr
- common_style = "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;"
- - pipeline_link = content_tag(:a, "\##{@pipeline.id}", href: pipeline_url(@pipeline), style: "color:#3777b0;text-decoration:none;").html_safe
+ - pipeline_link_text = sanitize_name(@pipeline.name) || "##{@pipeline.id}"
+ - pipeline_link = content_tag(:a, pipeline_link_text, href: pipeline_url(@pipeline), style: "color:#3777b0;text-decoration:none;").html_safe
%td{ style: "#{common_style} font-weight:500;vertical-align:baseline;" }
= s_('Notify|Pipeline %{pipeline_link} triggered by').html_safe % { pipeline_link: pipeline_link }
- if @pipeline.user
diff --git a/app/views/notify/_successful_pipeline.text.erb b/app/views/notify/_successful_pipeline.text.erb
index 5798a2346fa..fcdeda5a213 100644
--- a/app/views/notify/_successful_pipeline.text.erb
+++ b/app/views/notify/_successful_pipeline.text.erb
@@ -24,9 +24,12 @@ Committed by: <%= commit.committer_name %>
<% job_count = @pipeline.total_size -%>
<% stage_count = @pipeline.stages_count -%>
+
+<% pipeline_link_text = sanitize_name(@pipeline.name) || "##{@pipeline.id}" %>
+
<% if @pipeline.user -%>
-Pipeline #<%= @pipeline.id %> ( <%= pipeline_url(@pipeline) %> ) triggered by <%= sanitize_name(@pipeline.user.name) %> ( <%= user_url(@pipeline.user) %> )
+Pipeline <%= pipeline_link_text %> ( <%= pipeline_url(@pipeline) %> ) triggered by <%= sanitize_name(@pipeline.user.name) %> ( <%= user_url(@pipeline.user) %> )
<% else -%>
-Pipeline #<%= @pipeline.id %> ( <%= pipeline_url(@pipeline) %> ) triggered by API
+Pipeline <%= pipeline_link_text %> ( <%= pipeline_url(@pipeline) %> ) triggered by API
<% end -%>
successfully completed <%= job_count %> <%= 'job'.pluralize(job_count) %> in <%= stage_count %> <%= 'stage'.pluralize(stage_count) %>.
diff --git a/app/views/notify/approved_merge_request_email.html.haml b/app/views/notify/approved_merge_request_email.html.haml
index 0b20d4f3d3a..0b856f87175 100644
--- a/app/views/notify/approved_merge_request_email.html.haml
+++ b/app/views/notify/approved_merge_request_email.html.haml
@@ -1,5 +1,5 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional //EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-%html{ lang: "en" }
+%html{ lang: I18n.locale }
%head
%meta{ content: "text/html; charset=UTF-8", "http-equiv" => "Content-Type" }/
%meta{ content: "width=device-width, initial-scale=1", name: "viewport" }/
diff --git a/app/views/notify/import_issues_csv_email.html.haml b/app/views/notify/import_issues_csv_email.html.haml
index 0008085025b..771495b57ba 100644
--- a/app/views/notify/import_issues_csv_email.html.haml
+++ b/app/views/notify/import_issues_csv_email.html.haml
@@ -1,4 +1,5 @@
- text_style = 'font-size:16px; text-align:center; line-height:30px;'
+- error_style = 'font-size:13px; text-align:center; line-height:16px; color:#dd2b0e;'
%p{ style: text_style }
- project_link = link_to(@project.full_name, project_url(@project), style: "color:#3777b0; text-decoration:none;")
@@ -16,3 +17,18 @@
- if @results[:parse_error]
%p{ style: text_style }
= s_('Notify|Error parsing CSV file. Please make sure it has the correct format: a delimited text file that uses a comma to separate values.')
+
+- preprocess_errors = @results[:preprocess_errors]
+- if preprocess_errors.present?
+
+ - missing_milestone_errors = preprocess_errors.dig(:milestone_errors, :missing) || []
+
+ - if missing_milestone_errors.present?
+ %p{ style: error_style }
+ = s_('Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}') % { error_lines: missing_milestone_errors[:titles].join(', '),
+ column: missing_milestone_errors[:header].downcase, project: @project.full_name,
+ parent_groups_clause: @project.group.present? ? ' or its parent groups' : ''}
+
+- if @results[:error_lines].present? || preprocess_errors.present?
+ %p{ style: text_style }
+ = s_('Notify|Please fix the errors above and try the CSV import again.')
diff --git a/app/views/notify/import_issues_csv_email.text.erb b/app/views/notify/import_issues_csv_email.text.erb
index 1117f90714d..ef99914a821 100644
--- a/app/views/notify/import_issues_csv_email.text.erb
+++ b/app/views/notify/import_issues_csv_email.text.erb
@@ -9,3 +9,20 @@ Errors found on line <%= 'number'.pluralize(@results[:error_lines].size) %>: <%=
<% if @results[:parse_error] %>
Error parsing CSV file. Please make sure it has the correct format: a delimited text file that uses a comma to separate values.
<% end %>
+
+<% preprocess_errors = @results[:preprocess_errors] %>
+<%
+ if preprocess_errors.present?
+ missing_milestone_errors = preprocess_errors.dig(:milestone_errors, :missing) || []
+%>
+
+ <% if missing_milestone_errors.present? %>
+ <%= s_('Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}') % { error_lines: missing_milestone_errors[:titles].join(', '),
+ column: missing_milestone_errors[:header].downcase, project: @project.full_name,
+ parent_groups_clause: @project.group.present? ? ' or its parent groups' : ''} %>
+ <% end %>
+<% end %>
+
+<% if @results[:error_lines].present? || preprocess_errors.present? %>
+ <%= s_('Notify|Please fix the errors above and try the CSV import again.') %>
+<% end %>
diff --git a/app/views/notify/issue_due_email.html.haml b/app/views/notify/issue_due_email.html.haml
index 9dd501022dd..f1959ce2557 100644
--- a/app/views/notify/issue_due_email.html.haml
+++ b/app/views/notify/issue_due_email.html.haml
@@ -5,7 +5,7 @@
%p
= assignees_label(@issue)
%p
- = sprintf(s_('Notify|This issue is due on: %{issue_due_date}'), { issue_due_date: @issue.due_date.to_s(:medium) }).html_safe
+ = sprintf(s_('Notify|This issue is due on: %{issue_due_date}'), { issue_due_date: @issue.due_date.to_fs(:medium) }).html_safe
- if @issue.description
.md
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 9c25567696f..d376a1fdecf 100644
--- a/app/views/notify/merge_when_pipeline_succeeds_email.html.haml
+++ b/app/views/notify/merge_when_pipeline_succeeds_email.html.haml
@@ -1,5 +1,5 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional //EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-%html{ lang: "en" }
+%html{ lang: I18n.locale }
%head
%meta{ content: "text/html; charset=UTF-8", "http-equiv" => "Content-Type" }
%meta{ content: "width=device-width, initial-scale=1", name: "viewport" }
diff --git a/app/views/notify/pipeline_failed_email.html.haml b/app/views/notify/pipeline_failed_email.html.haml
index 5d4d2c0fcd8..bffb9f4ee5a 100644
--- a/app/views/notify/pipeline_failed_email.html.haml
+++ b/app/views/notify/pipeline_failed_email.html.haml
@@ -6,7 +6,7 @@
%td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;vertical-align:middle;color:#ffffff;text-align:center;padding-right:5px;line-height:1;" }
%img{ alt: "✖", height: "13", src: image_url('mailers/ci_pipeline_notif_v1/icon-x-red-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;" }
- = s_('Notify|Pipeline #%{pipeline_id} has failed!') % { pipeline_id: @pipeline.id }
+ = s_('Notify|Pipeline %{pipeline_name_or_id} has failed!') % { pipeline_name_or_id: sanitize_name(@pipeline.name) || "##{@pipeline.id}" }
%tr.spacer
%td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;height:18px;font-size:18px;line-height:18px;" }
&nbsp;
@@ -98,7 +98,8 @@
%tbody
%tr
- common_style = "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;font-weight:500;line-height:1.4;vertical-align:baseline;"
- - pipeline_link = link_to "##{@pipeline.id}", pipeline_url(@pipeline), style: "color:#3777b0;text-decoration:none;"
+ - pipeline_link_text = sanitize_name(@pipeline.name) || "##{@pipeline.id}"
+ - pipeline_link = link_to pipeline_link_text, pipeline_url(@pipeline), style: "color:#3777b0;text-decoration:none;"
%td{ style: "#{common_style}" }
= s_('Notify|Pipeline %{pipeline_link} triggered by').html_safe % { pipeline_link: pipeline_link }
- if @pipeline.user
diff --git a/app/views/notify/pipeline_failed_email.text.erb b/app/views/notify/pipeline_failed_email.text.erb
index c82b7a8dd2a..97823bf3998 100644
--- a/app/views/notify/pipeline_failed_email.text.erb
+++ b/app/views/notify/pipeline_failed_email.text.erb
@@ -1,4 +1,4 @@
-Pipeline #<%= @pipeline.id %> has failed!
+<%= "Pipeline #{sanitize_name(@pipeline.name) || "##{@pipeline.id}"} has failed!" %>
Project: <%= @project.name %> ( <%= project_url(@project) %> )
Branch: <%= @pipeline.source_ref %> ( <%= commits_url(@pipeline) %> )
@@ -22,16 +22,18 @@ Committed by: <%= commit.committer_name %>
<% end -%>
<% end -%>
-<% if @pipeline.user -%>
-Pipeline #<%= @pipeline.id %> ( <%= pipeline_url(@pipeline) %> ) triggered by <%= sanitize_name(@pipeline.user.name) %> ( <%= user_url(@pipeline.user) %> )
-<% else -%>
-Pipeline #<%= @pipeline.id %> ( <%= pipeline_url(@pipeline) %> ) triggered by API
-<% end -%>
-<% failed = @pipeline.latest_statuses.failed -%>
+<% pipeline_link_text = sanitize_name(@pipeline.name) || "##{@pipeline.id}" %>
+
+<% if @pipeline.user %>
+Pipeline <%= pipeline_link_text %> ( <%= pipeline_url(@pipeline) %> ) triggered by <%= sanitize_name(@pipeline.user.name) %> ( <%= user_url(@pipeline.user) %> )
+<% else %>
+Pipeline <%= pipeline_link_text %> ( <%= pipeline_url(@pipeline) %> ) triggered by API
+<% end %>
+<% failed = @pipeline.latest_statuses.failed %>
had <%= failed.size %> failed <%= 'job'.pluralize(failed.size) %>.
<% failed.each do |build| -%>
<%= render "notify/links/#{build.to_partial_path}", pipeline: @pipeline, build: build %>
Stage: <%= build.stage_name %>
Name: <%= build.name %>
-<% end -%>
+<% end -%> \ No newline at end of file
diff --git a/app/views/notify/pipeline_fixed_email.html.haml b/app/views/notify/pipeline_fixed_email.html.haml
index 33b83b104b1..cf5ebb0649a 100644
--- a/app/views/notify/pipeline_fixed_email.html.haml
+++ b/app/views/notify/pipeline_fixed_email.html.haml
@@ -1 +1 @@
-= render 'notify/successful_pipeline', title: s_('Notify|Pipeline has been fixed and #%{pipeline_id} has passed!') % {pipeline_id: @pipeline.id}
+= render 'notify/successful_pipeline', title: s_('Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!') % { pipeline_name_or_id: sanitize_name(@pipeline.name) || "##{@pipeline.id}" }
diff --git a/app/views/notify/pipeline_fixed_email.text.erb b/app/views/notify/pipeline_fixed_email.text.erb
index 32334260a5e..3b8be0cf7a0 100644
--- a/app/views/notify/pipeline_fixed_email.text.erb
+++ b/app/views/notify/pipeline_fixed_email.text.erb
@@ -1 +1 @@
-<%= render 'notify/successful_pipeline', title: "Pipeline has been fixed and ##{@pipeline.id} has passed!" -%>
+<%= render 'notify/successful_pipeline', title: "Pipeline has been fixed and #{sanitize_name(@pipeline.name) || "##{@pipeline.id}"} has passed!" -%>
diff --git a/app/views/notify/pipeline_success_email.html.haml b/app/views/notify/pipeline_success_email.html.haml
index 47832907663..3139741b5c1 100644
--- a/app/views/notify/pipeline_success_email.html.haml
+++ b/app/views/notify/pipeline_success_email.html.haml
@@ -1 +1 @@
-= render 'notify/successful_pipeline', title: "Pipeline ##{@pipeline.id} has passed!"
+= render 'notify/successful_pipeline', title: s_('Notify|Pipeline %{pipeline_name_or_id} has passed!') % { pipeline_name_or_id: sanitize_name(@pipeline.name) || "##{@pipeline.id}" }
diff --git a/app/views/notify/pipeline_success_email.text.erb b/app/views/notify/pipeline_success_email.text.erb
index 83cdb72d252..58999614d05 100644
--- a/app/views/notify/pipeline_success_email.text.erb
+++ b/app/views/notify/pipeline_success_email.text.erb
@@ -1 +1 @@
-<%= render 'notify/successful_pipeline', title: "Pipeline ##{@pipeline.id} has passed!" -%>
+<%= render 'notify/successful_pipeline', title: "Pipeline #{sanitize_name(@pipeline.name) || "##{@pipeline.id}"} has passed!" -%>
diff --git a/app/views/notify/prometheus_alert_fired_email.html.haml b/app/views/notify/prometheus_alert_fired_email.html.haml
index cdc97d583df..25dc8e59073 100644
--- a/app/views/notify/prometheus_alert_fired_email.html.haml
+++ b/app/views/notify/prometheus_alert_fired_email.html.haml
@@ -25,7 +25,3 @@
- if @alert.show_incident_issues_link?
%p
= link_to(_('View incident issues.'), @alert.incident_issues_link)
-
-- if @alert.show_performance_dashboard_link?
- %p
- = link_to(_('View performance dashboard.'), @alert.performance_dashboard_link)
diff --git a/app/views/notify/prometheus_alert_fired_email.text.erb b/app/views/notify/prometheus_alert_fired_email.text.erb
index b23cd8b6ccc..a9c1d98a396 100644
--- a/app/views/notify/prometheus_alert_fired_email.text.erb
+++ b/app/views/notify/prometheus_alert_fired_email.text.erb
@@ -18,7 +18,3 @@
<% if @alert.show_incident_issues_link? %>
<%= _('View incident issues.') %> <%= @alert.incident_issues_link %>
<% end %>
-
-<% if @alert.show_performance_dashboard_link? %>
-<%= _('View the performance dashboard at') %> <%= @alert.performance_dashboard_link %>
-<% end %>
diff --git a/app/views/notify/repository_push_email.html.haml b/app/views/notify/repository_push_email.html.haml
index d493f9d5d98..199865ba644 100644
--- a/app/views/notify/repository_push_email.html.haml
+++ b/app/views/notify/repository_push_email.html.haml
@@ -19,7 +19,7 @@
%li
%strong= link_to(commit.short_id, project_commit_url(@message.project, commit))
%div
- = html_escape(s_('Notify|%{committed_by_start} by %{author_name} %{committed_by_end} %{committed_at_start} at %{committed_date} %{committed_at_end}')) % {committed_by_start: '<span>'.html_safe, author_name: commit.author_name, committed_by_end: '</span>'.html_safe, committed_at_start: '<i>'.html_safe, committed_date: commit.committed_date.to_s(:iso8601), committed_at_end: '</i>'.html_safe}
+ = html_escape(s_('Notify|%{committed_by_start} by %{author_name} %{committed_by_end} %{committed_at_start} at %{committed_date} %{committed_at_end}')) % {committed_by_start: '<span>'.html_safe, author_name: commit.author_name, committed_by_end: '</span>'.html_safe, committed_at_start: '<i>'.html_safe, committed_date: commit.committed_date.to_fs(:iso8601), committed_at_end: '</i>'.html_safe}
%pre.commit-message
= commit.safe_message
diff --git a/app/views/notify/repository_push_email.text.haml b/app/views/notify/repository_push_email.text.haml
index 2ba0a2cf4ab..38a439864b7 100644
--- a/app/views/notify/repository_push_email.text.haml
+++ b/app/views/notify/repository_push_email.text.haml
@@ -8,7 +8,7 @@
\
= @message.reverse_compare? ? "Deleted commits:" : "Commits:"
- @message.commits.each do |commit|
- #{commit.short_id} by #{commit.author_name} at #{commit.committed_date.to_s(:iso8601)}
+ #{commit.short_id} by #{commit.author_name} at #{commit.committed_date.to_fs(:iso8601)}
#{commit.safe_message}
\- - - - -
\
diff --git a/app/views/notify/unapproved_merge_request_email.html.haml b/app/views/notify/unapproved_merge_request_email.html.haml
index 94e2d0377aa..b0573251fd3 100644
--- a/app/views/notify/unapproved_merge_request_email.html.haml
+++ b/app/views/notify/unapproved_merge_request_email.html.haml
@@ -1,5 +1,5 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional //EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-%html{ lang: "en" }
+%html{ lang: I18n.locale }
%head
%meta{ content: "text/html; charset=UTF-8", "http-equiv" => "Content-Type" }/
%meta{ content: "width=device-width, initial-scale=1", name: "viewport" }/
diff --git a/app/views/organizations/organizations/directory.html.haml b/app/views/organizations/organizations/directory.html.haml
deleted file mode 100644
index 1d2fb66112b..00000000000
--- a/app/views/organizations/organizations/directory.html.haml
+++ /dev/null
@@ -1,2 +0,0 @@
-- breadcrumb_title @organization.name
-- page_title @organization.name
diff --git a/app/views/organizations/organizations/groups_and_projects.html.haml b/app/views/organizations/organizations/groups_and_projects.html.haml
new file mode 100644
index 00000000000..8890f4b1ce5
--- /dev/null
+++ b/app/views/organizations/organizations/groups_and_projects.html.haml
@@ -0,0 +1,3 @@
+- page_title _('Groups and projects')
+
+#js-organizations-groups-and-projects
diff --git a/app/views/organizations/organizations/show.html.haml b/app/views/organizations/organizations/show.html.haml
new file mode 100644
index 00000000000..8ba2a3d96ac
--- /dev/null
+++ b/app/views/organizations/organizations/show.html.haml
@@ -0,0 +1,2 @@
+- page_title s_('Organization|Organization overview')
+- @skip_current_level_breadcrumb = true
diff --git a/app/views/profiles/accounts/_providers.html.haml b/app/views/profiles/accounts/_providers.html.haml
index 6c6fa32f736..6f0c091dfdb 100644
--- a/app/views/profiles/accounts/_providers.html.haml
+++ b/app/views/profiles/accounts/_providers.html.haml
@@ -1,6 +1,6 @@
-- button_class = 'btn btn-default gl-button gl-mb-3 gl-mr-3'
+- button_class = 'btn btn-default gl-button'
-%label.label-bold
+%label.label-bold.gl-mb-0
= s_('Profiles|Connected Accounts')
%p= s_('Profiles|Select a service to sign in with.')
- providers.each do |provider|
diff --git a/app/views/profiles/accounts/show.html.haml b/app/views/profiles/accounts/show.html.haml
index fec5d2d5ff5..799dfaae8c5 100644
--- a/app/views/profiles/accounts/show.html.haml
+++ b/app/views/profiles/accounts/show.html.haml
@@ -14,90 +14,88 @@
- c.with_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
- .col-lg-4.profile-settings-sidebar
- %h4.gl-mt-0
- = s_('Profiles|Two-factor authentication')
+.settings-section.js-search-settings-section
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0
+ = s_('Profiles|Two-factor authentication')
+ %p.gl-text-secondary
+ = s_("Profiles|Increase your account's security by enabling two-factor authentication (2FA).")
+ %div
%p
- = s_("Profiles|Increase your account's security by enabling two-factor authentication (2FA).")
- .col-lg-8
- %p
- #{_('Status')}: #{current_user.two_factor_enabled? ? _('Enabled') : _('Disabled')}
+ %span.gl-font-weight-bold
+ #{_('Status')}:
+ #{current_user.two_factor_enabled? ? _('Enabled') : _('Disabled')}
- if current_user.two_factor_enabled?
= render Pajamas::ButtonComponent.new(variant: :confirm, href: profile_two_factor_auth_path) do
= _('Manage two-factor authentication')
- else
- .gl-mb-3
- = render Pajamas::ButtonComponent.new(variant: :confirm, href: profile_two_factor_auth_path, button_options: { data: { qa_selector: 'enable_2fa_button' }}) do
- = _('Enable two-factor authentication')
- .col-lg-12
- %hr
+ = render Pajamas::ButtonComponent.new(variant: :confirm, href: profile_two_factor_auth_path, button_options: { data: { qa_selector: 'enable_2fa_button' }}) do
+ = _('Enable two-factor authentication')
- if display_providers_on_profile?
- .row.gl-mt-3.js-search-settings-section
- .col-lg-4.profile-settings-sidebar
- %h4.gl-mt-0
- = s_('Profiles|Service sign-in')
- %p
- = s_('Profiles|Connect a service for sign-in.')
- .col-lg-8
- = render 'providers', providers: button_based_providers, group_saml_identities: local_assigns[:group_saml_identities]
- .col-lg-12
- %hr
+ .settings-section.js-search-settings-section
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0
+ = s_('Profiles|Service sign-in')
+ %p.gl-text-secondary
+ = s_('Profiles|Connect a service for sign-in.')
+ = render 'providers', providers: button_based_providers, group_saml_identities: local_assigns[:group_saml_identities]
+
- if current_user.can_change_username?
- .row.gl-mt-3.js-search-settings-section
- .col-lg-4.profile-settings-sidebar
- %h4.gl-mt-0.warning-title
- = s_('Profiles|Change username')
- %p
- = s_('Profiles|Changing your username can have unintended side effects.')
- = succeed '.' do
- = link_to _('Learn more'), help_page_path('user/profile/index', anchor: 'change-your-username'), target: '_blank', rel: 'noopener noreferrer'
- .col-lg-8
- - data = { initial_username: current_user.username, root_url: root_url, action_url: update_username_profile_path(format: :json) }
- #update-username{ data: data }
- .col-lg-12
- %hr
+ .settings-section.js-search-settings-section
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0.warning-title
+ = s_('Profiles|Change username')
+ %p.gl-text-secondary
+ = s_('Profiles|Changing your username can have unintended side effects.')
+ = succeed '.' do
+ = link_to _('Learn more'), help_page_path('user/profile/index', anchor: 'change-your-username'), target: '_blank', rel: 'noopener noreferrer'
+ - data = { initial_username: current_user.username, root_url: root_url, action_url: update_username_profile_path(format: :json) }
+ #update-username{ data: data }
- if prevent_delete_account?
- .row.gl-mt-3.js-search-settings-section
- .col-lg-4.profile-settings-sidebar
- %h4.gl-mt-0.danger-title
- = s_('Profiles|Delete account')
- .col-lg-8
- %p
- = s_('Profiles|Account deletion is not allowed by your administrator.')
+ .settings-section.js-search-settings-section
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0.danger-title
+ = s_('Profiles|Delete account')
+ %p.gl-text-secondary
+ = s_('Profiles|Account deletion is not allowed by your administrator.')
- else
- .row.gl-mt-3.js-search-settings-section
- .col-lg-4.profile-settings-sidebar
- %h4.gl-mt-0.danger-title
- = s_('Profiles|Delete account')
- .col-lg-8
- - if current_user.can_be_removed? && can?(current_user, :destroy_user, current_user)
- %p
- = s_('Profiles|Deleting an account has the following effects:')
- = render 'users/deletion_guidance', user: current_user
-
- -# Delete button here
- = render Pajamas::ButtonComponent.new(variant: :danger, button_options: { id: 'delete-account-button', disabled: true, data: { qa_selector: 'delete_account_button' }}) do
+ .settings-section.js-search-settings-section
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-mt-0.danger-title
= s_('Profiles|Delete account')
+ - if current_user.can_be_removed? && can?(current_user, :destroy_user, current_user)
+ %p.gl-text-secondary
+ = s_('Profiles|Deleting an account has the following effects:')
+ = render 'users/deletion_guidance', user: current_user
- #delete-account-modal{ data: { action_url: user_registration_path,
- confirm_with_password: ('true' if current_user.confirm_deletion_with_password?),
- username: current_user.username } }
+ -# Delete button here
+ = render Pajamas::ButtonComponent.new(variant: :danger, button_options: { id: 'delete-account-button', disabled: true, data: { qa_selector: 'delete_account_button' }}) do
+ = s_('Profiles|Delete account')
+
+ #delete-account-modal{ data: { action_url: user_registration_path,
+ confirm_with_password: ('true' if current_user.confirm_deletion_with_password?),
+ username: current_user.username } }
+ - else
+ - if current_user.solo_owned_groups.present?
+ %p
+ = s_('Profiles|Your account is currently an owner in these groups:')
+ %ul
+ - current_user.solo_owned_groups.each do |group|
+ %li= group.name
+ %p
+ = s_('Profiles|You must transfer ownership or delete these groups before you can delete your account.')
+ - elsif !current_user.can_remove_self?
+ %p
+ = s_('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.').html_safe % { openingTag: "<a href='#{reset_profile_password_path}' rel=\"nofollow\" data-method=\"put\">".html_safe, closingTag: '</a>'.html_safe}
+ %p
+ = s_('Profiles|If after setting a password, the option to delete your account is still not available, please %{link_start}submit a request%{link_end} to begin the account deletion process.').html_safe % { link_start: '<a href="https://support.gitlab.io/account-deletion/" rel="nofollow noreferrer noopener" target="_blank">'.html_safe, link_end: '</a>'.html_safe}
- else
- - if current_user.solo_owned_groups.present?
- %p
- = s_('Profiles|Your account is currently an owner in these groups:')
- %strong= current_user.solo_owned_groups.map(&:name).join(', ')
- %p
- = s_('Profiles|You must transfer ownership or delete these groups before you can delete your account.')
- - elsif !current_user.can_remove_self?
- %p
- = s_('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.').html_safe % { openingTag: "<a href='#{reset_profile_password_path}' rel=\"nofollow\" data-method=\"put\">".html_safe, closingTag: '</a>'.html_safe}
- %p
- = s_('Profiles|If after setting a password, the option to delete your account is still not available, please %{link_start}submit a request%{link_end} to begin the account deletion process.').html_safe % { link_start: '<a href="https://support.gitlab.io/account-deletion/" rel="nofollow noreferrer noopener" target="_blank">'.html_safe, link_end: '</a>'.html_safe}
- - else
- %p
- = s_("Profiles|You don't have access to delete this user.")
-.gl-mb-3
+ %p
+ = s_("Profiles|You don't have access to delete this user.")
diff --git a/app/views/profiles/active_sessions/_active_session.html.haml b/app/views/profiles/active_sessions/_active_session.html.haml
index 9ec8d694dac..e91c28e6e84 100644
--- a/app/views/profiles/active_sessions/_active_session.html.haml
+++ b/app/views/profiles/active_sessions/_active_session.html.haml
@@ -27,9 +27,5 @@
- unless is_current_session
.float-right
- = link_to(revoke_session_path(active_session),
- { data: { confirm: _('Are you sure? The device will be signed out of GitLab and all remember me tokens revoked.') },
- method: :delete,
- class: "gl-button btn btn-danger gl-ml-3" }) do
- %span.sr-only= _('Revoke')
+ = link_button_to revoke_session_path(active_session), data: { confirm: _('Are you sure? The device will be signed out of GitLab and all remember me tokens revoked.'), confirm_btn_variant: :danger }, method: :delete, class: 'gl-ml-3', variant: :danger, 'aria-label': _('Revoke') do
= _('Revoke')
diff --git a/app/views/profiles/active_sessions/index.html.haml b/app/views/profiles/active_sessions/index.html.haml
index 1952655937e..baca9559e08 100644
--- a/app/views/profiles/active_sessions/index.html.haml
+++ b/app/views/profiles/active_sessions/index.html.haml
@@ -1,16 +1,15 @@
- page_title _('Active Sessions')
- @force_desktop_expanded_sidebar = true
-.row.gl-mt-3.js-search-settings-section
- .col-lg-4.profile-settings-sidebar
- %h4.gl-mt-0
- = page_title
- %p
- = _('This is a list of devices that have logged into your account. Revoke any sessions that you do not recognize.')
- .col-lg-8
- .gl-mb-3
+.settings-section.js-search-settings-section
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0
+ = page_title
+ %p.gl-text-secondary
+ = _('This is a list of devices that have logged into your account. Revoke any sessions that you do not recognize.')
- = render Pajamas::CardComponent.new(card_options: { class: 'gl-border-0' }, body_options: { class: 'gl-p-0' }) do |c|
- - c.with_body do
- %ul.list-group.list-group-flush
- = render partial: 'profiles/active_sessions/active_session', collection: @sessions
+ = render Pajamas::CardComponent.new(card_options: { class: 'gl-border-0' }, body_options: { class: 'gl-p-0' }) do |c|
+ - c.with_body do
+ %ul.list-group.list-group-flush
+ = render partial: 'profiles/active_sessions/active_session', collection: @sessions
diff --git a/app/views/profiles/audit_log.html.haml b/app/views/profiles/audit_log.html.haml
index 44cfbc1f74f..d47f1ea7c25 100644
--- a/app/views/profiles/audit_log.html.haml
+++ b/app/views/profiles/audit_log.html.haml
@@ -1,11 +1,12 @@
- page_title _('Authentication log')
- @force_desktop_expanded_sidebar = true
-.row.gl-mt-3.js-search-settings-section
- .col-lg-4.profile-settings-sidebar
- %h4.gl-mt-0
- = page_title
- %p
- = _('This is a security log of authentication events involving your account.')
- .col-lg-8
- = render 'event_table', events: @events
+.settings-section.js-search-settings-section
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0
+ = page_title
+ %p.gl-text-secondary
+ = _('This is a security log of authentication events involving your account.')
+
+ = render 'event_table', events: @events
diff --git a/app/views/profiles/chat_names/_chat_name.html.haml b/app/views/profiles/chat_names/_chat_name.html.haml
index afc3894c23b..0ac8ede3c62 100644
--- a/app/views/profiles/chat_names/_chat_name.html.haml
+++ b/app/views/profiles/chat_names/_chat_name.html.haml
@@ -10,4 +10,4 @@
= _('Never')
%td
- = link_to _('Remove'), profile_chat_name_path(chat_name), method: :delete, class: 'gl-button btn btn-danger float-right', aria: { label: _('Remove') }, data: { confirm: _('Are you sure you want to remove this nickname?'), confirm_btn_variant: 'danger' }
+ = link_button_to _('Remove'), profile_chat_name_path(chat_name), method: :delete, class: 'float-right', aria: { label: _('Remove') }, data: { confirm: _('Are you sure you want to remove this nickname?'), confirm_btn_variant: 'danger' }, variant: :danger
diff --git a/app/views/profiles/chat_names/index.html.haml b/app/views/profiles/chat_names/index.html.haml
index 264ee040d7d..7a63fc30d9c 100644
--- a/app/views/profiles/chat_names/index.html.haml
+++ b/app/views/profiles/chat_names/index.html.haml
@@ -2,29 +2,27 @@
- @hide_search_settings = true
- @force_desktop_expanded_sidebar = true
-.row.gl-mt-5.js-search-settings-section
- .col-lg-4.profile-settings-sidebar
- %h4.gl-mt-0
- = page_title
- %p
- = _('You can see your chat accounts.')
+.settings-section.js-search-settings-section.gl-mt-3
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0
+ = page_title
- .col-lg-8
- %h5.gl-mt-0
- = sprintf(_('Active chat names (%{count})'), { count: @chat_names.size })
+ %h5.gl-font-lg.gl-mt-0
+ = sprintf(_('Active chat names (%{count})'), { count: @chat_names.size })
- - if @chat_names.present?
- .table-responsive
- %table.table
- %thead
- %tr
- %th= _('Team domain')
- %th= _('Nickname')
- %th= _('Last used')
- %th
- %tbody
- = render @chat_names
+ - if @chat_names.present?
+ .table-responsive
+ %table.table
+ %thead
+ %tr
+ %th= _('Team domain')
+ %th= _('Nickname')
+ %th= _('Last used')
+ %th
+ %tbody
+ = render @chat_names
- - else
- .settings-message.text-center
- = _("You don't have any active chat names.")
+ - else
+ .gl-text-secondary.settings-message
+ = _("You don't have any active chat names.")
diff --git a/app/views/profiles/comment_templates/index.html.haml b/app/views/profiles/comment_templates/index.html.haml
index dd5b43aa802..0692f5d8ebb 100644
--- a/app/views/profiles/comment_templates/index.html.haml
+++ b/app/views/profiles/comment_templates/index.html.haml
@@ -1,10 +1,11 @@
-- page_title _('Comment Templates')
+- page_title _('Comment templates')
-#js-comment-templates-root.row.gl-mt-5{ data: { base_path: profile_comment_templates_path } }
- .col-lg-4
- %h4.gl-mt-0
- = page_title
- %p
- = _('Comment templates can be used when creating comments inside issues, merge requests, and epics.')
- .col-lg-8
- = gl_loading_icon(size: 'lg')
+#js-comment-templates-root.settings-section.gl-mt-3{ data: { base_path: profile_comment_templates_path } }
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0
+ = page_title
+ %p.gl-text-secondary
+ = _('Comment templates can be used when creating comments inside issues, merge requests, and epics.')
+
+ = gl_loading_icon(size: 'lg')
diff --git a/app/views/profiles/emails/index.html.haml b/app/views/profiles/emails/index.html.haml
index c16f3c3b12b..743c26260e4 100644
--- a/app/views/profiles/emails/index.html.haml
+++ b/app/views/profiles/emails/index.html.haml
@@ -1,24 +1,26 @@
- page_title _('Emails')
- @force_desktop_expanded_sidebar = true
-.row.gl-mt-3.js-search-settings-section
- .col-lg-4.profile-settings-sidebar
- %h4.gl-mt-0
- = page_title
- %p
- = _('Control emails linked to your account')
- .col-lg-8
- %h4.gl-mt-0
- = _('Add email address')
+.settings-section.js-search-settings-section
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0
+ = _('Add email address')
+ %p.gl-text-secondary
+ = _('Control emails linked to your account')
+ %div
= gitlab_ui_form_for 'email', url: profile_emails_path do |f|
.form-group
= f.label :email, _('Email'), class: 'label-bold'
= f.text_field :email, class: 'form-control gl-form-input', data: { qa_selector: 'email_address_field' }
.gl-mt-3
= f.submit _('Add email address'), data: { qa_selector: 'add_email_address_button' }, pajamas_button: true
- %hr
- %h4.gl-mt-0
- = _('Linked emails (%{email_count})') % { email_count: @emails.load.size }
+
+.settings-section.js-search-settings-section
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0
+ = _('Linked emails (%{email_count})') % { email_count: @emails.load.size }
.account-well.gl-mb-3
%ul
%li
@@ -59,8 +61,6 @@
.gl-display-flex.gl-justify-content-end.gl-align-items-flex-end.gl-flex-grow-1.gl-flex-wrap-reverse.gl-gap-3
- unless email.confirmed?
- confirm_title = "#{email.confirmation_sent_at ? _('Resend confirmation email') : _('Send confirmation email')}"
- = link_to confirm_title, resend_confirmation_instructions_profile_email_path(email), method: :put, class: 'gl-button btn btn-sm btn-default'
+ = link_button_to confirm_title, resend_confirmation_instructions_profile_email_path(email), method: :put, size: :small
- = link_to profile_email_path(email), data: { confirm: _('Are you sure?'), qa_selector: 'delete_email_link'}, method: :delete, class: 'gl-button btn btn-sm btn-danger' do
- %span.sr-only= _('Remove')
- = sprite_icon('remove')
+ = link_button_to nil, profile_email_path(email), data: { confirm: _('Are you sure?'), qa_selector: 'delete_email_link'}, method: :delete, variant: :danger, size: :small, icon: 'remove', 'aria-label': _('Remove')
diff --git a/app/views/profiles/gpg_keys/_key.html.haml b/app/views/profiles/gpg_keys/_key.html.haml
index d52b16814c0..d8b8dda29dc 100644
--- a/app/views/profiles/gpg_keys/_key.html.haml
+++ b/app/views/profiles/gpg_keys/_key.html.haml
@@ -19,9 +19,6 @@
.float-right
%span.key-created-at
= html_escape(s_('Profiles|Created %{time_ago}')) % { time_ago: time_ago_with_tooltip(key.created_at) }
- = link_to profile_gpg_key_path(key), data: { confirm: _('Are you sure? Removing this GPG key does not affect already signed commits.') }, method: :delete, class: "gl-button btn btn-icon btn-danger gl-ml-3" do
- %span.sr-only= _('Remove')
- = sprite_icon('remove')
- = link_to revoke_profile_gpg_key_path(key), data: { confirm: _('Are you sure? All commits that were signed with this GPG key will be unverified.') }, method: :put, class: "gl-button btn btn-danger gl-ml-3" do
- %span.sr-only= _('Revoke')
+ = link_button_to nil, profile_gpg_key_path(key), data: { confirm: _('Are you sure? Removing this GPG key does not affect already signed commits.') }, method: :delete, class: 'gl-ml-3', variant: :danger, icon: 'remove', 'aria-label': _('Remove')
+ = link_button_to revoke_profile_gpg_key_path(key), data: { confirm: _('Are you sure? All commits that were signed with this GPG key will be unverified.') }, method: :put, class: 'gl-ml-3', variant: :danger, 'aria-label': _('Revoke') do
= _('Revoke')
diff --git a/app/views/profiles/gpg_keys/index.html.haml b/app/views/profiles/gpg_keys/index.html.haml
index b21a4da16b9..2dfd6c7860f 100644
--- a/app/views/profiles/gpg_keys/index.html.haml
+++ b/app/views/profiles/gpg_keys/index.html.haml
@@ -2,21 +2,25 @@
- add_page_specific_style 'page_bundles/profile'
- @force_desktop_expanded_sidebar = true
-.row.gl-mt-3.js-search-settings-section
- .col-lg-4.profile-settings-sidebar
- %h4.gl-mt-0
- = page_title
- %p
- = _('GPG keys allow you to verify signed commits.')
- .col-lg-8
- %h5.gl-mt-0
- = _('Add a GPG key')
- %p.profile-settings-content
- - help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/project/repository/gpg_signed_commits/index.md') }
- = _('Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}').html_safe % {help_link_start: help_link_start, help_link_end: '</a>'.html_safe }
- = render 'form'
- %hr
- %h5
- = _('Your GPG keys (%{count})') % { count: @gpg_keys.count }
- .gl-mb-3
- = render 'key_table'
+.settings-section.js-search-settings-section
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0
+ = page_title
+ %p.gl-text-secondary
+ = _('GPG keys allow you to verify signed commits.')
+
+ %h5.gl-font-lg.gl-mt-0
+ = _('Add a GPG key')
+ %p
+ - help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/project/repository/gpg_signed_commits/index.md') }
+ = _('Add a GPG key for secure access to GitLab. %{help_link_start}Learn more%{help_link_end}.').html_safe % {help_link_start: help_link_start, help_link_end: '</a>'.html_safe }
+ = render 'form'
+
+.settings-section.js-search-settings-section
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0
+ = _('Your GPG keys (%{count})') % { count: @gpg_keys.count }
+ .gl-mb-3
+ = render 'key_table'
diff --git a/app/views/profiles/keys/_key_details.html.haml b/app/views/profiles/keys/_key_details.html.haml
index 4f3d97fb90c..f1d5a127728 100644
--- a/app/views/profiles/keys/_key_details.html.haml
+++ b/app/views/profiles/keys/_key_details.html.haml
@@ -14,13 +14,13 @@
%strong= ssh_key_usage_types.invert[@key.usage_type]
%li
%span.light= _('Created on:')
- %strong= @key.created_at.to_s(:medium)
+ %strong= @key.created_at.to_fs(:medium)
%li
%span.light= _('Expires:')
- %strong= @key.expires_at.try(:to_s, :medium) || _('Never')
+ %strong= @key.expires_at&.to_fs(:medium) || _('Never')
%li
%span.light= _('Last used on:')
- %strong= @key.last_used_at.try(:to_s, :medium) || _('Never')
+ %strong= @key.last_used_at&.to_fs(:medium) || _('Never')
.col-md-8
= form_errors(@key, type: 'key') unless @key.valid?
diff --git a/app/views/profiles/keys/index.html.haml b/app/views/profiles/keys/index.html.haml
index e7c0cf813b5..c2e65dcc8ef 100644
--- a/app/views/profiles/keys/index.html.haml
+++ b/app/views/profiles/keys/index.html.haml
@@ -2,27 +2,27 @@
- add_page_specific_style 'page_bundles/profile'
- @force_desktop_expanded_sidebar = true
-.row.gl-mt-3.js-search-settings-section
- .col-lg-4.profile-settings-sidebar
- %h4.gl-mt-0
- = page_title
- %p
- = _('SSH keys allow you to establish a secure connection between your computer and GitLab.')
- %br
- %h4.gl-mt-0
- = _('SSH Fingerprints')
- %p
- - config_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_instance_configuration_url }
- = html_escape(s_('SSH fingerprints verify that the client is connecting to the correct host. Check the %{config_link_start}current instance configuration%{config_link_end}.')) % { config_link_start: config_link_start, config_link_end: '</a>'.html_safe }
- .col-lg-8
- %h5.gl-mt-0
- = _('Add an SSH key')
- %p.profile-settings-content
- - help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/ssh.md') }
- = _('Add an SSH key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}').html_safe % {help_link_start: help_link_start, help_link_end: '</a>'.html_safe }
- = render 'form'
- %hr
- %h5
- = _('Your SSH keys (%{count})') % { count: @keys.count }
- .gl-mb-3
- = render 'key_table'
+.settings-section.js-search-settings-section
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0
+ = page_title
+ %p.gl-text-secondary
+ = _('SSH keys allow you to establish a secure connection between your computer and GitLab.')
+ - config_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_instance_configuration_url }
+ = html_escape(s_('SSH fingerprints verify that the client is connecting to the correct host. Check the %{config_link_start}current instance configuration%{config_link_end}.')) % { config_link_start: config_link_start, config_link_end: '</a>'.html_safe }
+
+ %h5.gl-font-lg.gl-mt-0
+ = _('Add an SSH key')
+ %p
+ - help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/ssh.md') }
+ = _('Add an SSH key for secure access to GitLab. %{help_link_start}Learn more%{help_link_end}.').html_safe % {help_link_start: help_link_start, help_link_end: '</a>'.html_safe }
+ = render 'form'
+
+.settings-section.js-search-settings-section
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0
+ = _('Your SSH keys (%{count})') % { count: @keys.count }
+ .gl-mb-3
+ = render 'key_table'
diff --git a/app/views/profiles/notifications/_email_settings.html.haml b/app/views/profiles/notifications/_email_settings.html.haml
index cd7a7ced1d4..60f366f8878 100644
--- a/app/views/profiles/notifications/_email_settings.html.haml
+++ b/app/views/profiles/notifications/_email_settings.html.haml
@@ -1,7 +1,6 @@
- form = local_assigns.fetch(:form)
-.form-group
- .js-notification-email-listbox-input{ data: { label: _('Notification Email'), name: 'user[notification_email]', emails: @user.public_verified_emails.to_json, empty_value_text: _('Use primary email (%{email})') % { email: @user.email }, value: @user.notification_email, disabled: local_assigns.fetch(:email_change_disabled, nil) } }
- .help-block
- = local_assigns.fetch(:help_text, nil)
+.js-notification-email-listbox-input.gl-mb-3{ data: { label: _('Global notification email'), name: 'user[notification_email]', emails: @user.public_verified_emails.to_json, empty_value_text: _('Use primary email (%{email})') % { email: @user.email }, value: @user.notification_email, disabled: local_assigns.fetch(:email_change_disabled, nil) } }
+.help-block
+ = local_assigns.fetch(:help_text, nil)
.form-group
= form.gitlab_ui_checkbox_component :email_opted_in, _('Receive product marketing emails')
diff --git a/app/views/profiles/notifications/_group_settings.html.haml b/app/views/profiles/notifications/_group_settings.html.haml
index 898762ca78a..1878634e56c 100644
--- a/app/views/profiles/notifications/_group_settings.html.haml
+++ b/app/views/profiles/notifications/_group_settings.html.haml
@@ -1,17 +1,15 @@
- emails_disabled = group.emails_disabled?
-.gl-responsive-table-row.notification-list-item
- .table-section.section-40
- %span.notification.gl-mr-2
+.notification-list-item.gl-md-display-flex.gl-justify-content-space-between.gl-align-items-center.gl-px-3.gl-py-4
+ .gl-mb-2.gl-md-mb-0
+ %span.gl-mr-2
= notification_icon(notification_icon_level(setting, emails_disabled))
- %span.str-truncated
+ %span
= link_to group.name, group_path(group)
- .table-section.section-30.text-right
+ .gl-display-flex.gl-gap-3.gl-flex-wrap
- if setting
- .js-vue-notification-dropdown{ data: { disabled: emails_disabled.to_s, dropdown_items: notification_dropdown_items(setting).to_json, notification_level: setting.level, group_id: group.id, container_class: 'gl-mr-3', show_label: "true" } }
-
- .table-section.section-30
+ .js-vue-notification-dropdown{ data: { disabled: emails_disabled.to_s, dropdown_items: notification_dropdown_items(setting).to_json, notification_level: setting.level, group_id: group.id, show_label: "true" } }
= form_for setting, url: profile_group_notifications_path(group), method: :put, html: { class: 'update-notifications gl-display-flex' } do |f|
- .js-notification-email-listbox-input{ data: { name: 'notification_setting[notification_email]', emails: @user.public_verified_emails.to_json, empty_value_text: _('Global notification email') , value: setting.notification_email } }
+ .js-notification-email-listbox-input{ data: { name: 'notification_setting[notification_email]', emails: @user.public_verified_emails.to_json, empty_value_text: _('Global notification email') , value: setting.notification_email, placement: 'right' } }
diff --git a/app/views/profiles/notifications/_project_settings.html.haml b/app/views/profiles/notifications/_project_settings.html.haml
index e6953d1b32e..955449f0ba1 100644
--- a/app/views/profiles/notifications/_project_settings.html.haml
+++ b/app/views/profiles/notifications/_project_settings.html.haml
@@ -1,12 +1,13 @@
- emails_disabled = project.emails_disabled?
-%li.notification-list-item
- %span.notification.gl-mr-2
- = notification_icon(notification_icon_level(setting, emails_disabled))
+.notification-list-item.gl-md-display-flex.gl-justify-content-space-between.gl-align-items-center.gl-px-3.gl-py-4
+ .gl-mb-2.gl-md-mb-0
+ %span.gl-mr-2
+ = notification_icon(notification_icon_level(setting, emails_disabled))
- %span.str-truncated
- = link_to_project(project)
+ %span
+ = link_to_project(project)
- .float-right
+ .gl-display-flex.gl-gap-3.gl-flex-wrap
- if setting
.js-vue-notification-dropdown{ data: { disabled: emails_disabled.to_s, dropdown_items: notification_dropdown_items(setting).to_json, notification_level: setting.level, project_id: project.id, container_class: 'gl-mr-3', show_label: "true" } }
diff --git a/app/views/profiles/notifications/show.html.haml b/app/views/profiles/notifications/show.html.haml
index 06d37787d2e..2c7ef2b7e0e 100644
--- a/app/views/profiles/notifications/show.html.haml
+++ b/app/views/profiles/notifications/show.html.haml
@@ -2,55 +2,59 @@
- page_title _('Notifications')
- @force_desktop_expanded_sidebar = true
-%div
- - if @user.errors.any?
- = render Pajamas::AlertComponent.new(variant: :danger) do |c|
- - c.with_body do
- %ul
- - @user.errors.full_messages.each do |msg|
- %li= msg
-
- = hidden_field_tag :notification_type, 'global'
- .row.gl-mt-3.js-search-settings-section
- .col-lg-4.profile-settings-sidebar
- %h4.gl-mt-0
+- if @user.errors.any?
+ = render Pajamas::AlertComponent.new(variant: :danger) do |c|
+ - c.with_body do
+ %ul
+ - @user.errors.full_messages.each do |msg|
+ %li= msg
+
+= hidden_field_tag :notification_type, 'global'
+.settings-section.js-search-settings-section
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0
= page_title
- %p
- = _('You can specify notification level per group or per project.')
- %p
- = _('By default, all projects and groups will use the global notifications setting.')
- .col-lg-8
- %h5.gl-mt-0
- = _('Global notification settings')
-
- = gitlab_ui_form_for @user, url: profile_notifications_path, method: :put, html: { class: 'update-notifications gl-mt-3' } do |f|
- = render_if_exists 'profiles/notifications/email_settings', form: f
-
- = label_tag :global_notification_level, _('Global notification level'), class: "label-bold"
- %br
- .clearfix
- .form-group.float-left.global-notification-setting
- - if @global_notification_setting
- .js-vue-notification-dropdown{ data: { dropdown_items: notification_dropdown_items(@global_notification_setting).to_json, notification_level: @global_notification_setting.level, help_page_path: help_page_path('user/profile/notifications'), show_label: 'true' } }
-
- .clearfix
-
- = gitlab_ui_form_for @user, url: profile_notifications_path, method: :put do |f|
- .form-group
- = f.gitlab_ui_checkbox_component :notified_of_own_activity, _('Receive notifications about your own activity')
-
- %hr
- %h5
- = _('Groups (%{count})') % { count: @user_groups.total_count }
- %div
- - @group_notifications.each do |setting|
- = render 'group_settings', setting: setting, group: setting.source
- = paginate @user_groups, theme: 'gitlab'
- %h5
- = _('Projects (%{count})') % { count: @project_notifications.size }
- %p.account-well
- = _('To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there.')
- .gl-mb-3
- %ul.bordered-list
+ %p.gl-text-secondary
+ = _('You can specify notification level per group or per project.')
+
+ .gl-mt-0
+ = gitlab_ui_form_for @user, url: profile_notifications_path, method: :put, html: { class: 'update-notifications gl-mt-3' } do |f|
+ = render_if_exists 'profiles/notifications/email_settings', form: f
+
+ = label_tag :global_notification_level, _('Global notification level'), class: "label-bold gl-mb-0"
+ .gl-text-secondary.gl-mb-3
+ = _('By default, all projects and groups use the global notifications setting.')
+
+ .form-group.global-notification-setting.gl-mb-3
+ - if @global_notification_setting
+ .js-vue-notification-dropdown{ data: { dropdown_items: notification_dropdown_items(@global_notification_setting).to_json, notification_level: @global_notification_setting.level, help_page_path: help_page_path('user/profile/notifications'), show_label: 'true' } }
+
+ = gitlab_ui_form_for @user, url: profile_notifications_path, method: :put do |f|
+ .form-group
+ = f.gitlab_ui_checkbox_component :notified_of_own_activity, _('Receive notifications about your own activity')
+
+ = render Pajamas::CardComponent.new(card_options: { class: 'gl-new-card' }, header_options: { class: 'gl-new-card-header'}, body_options: { class: 'gl-new-card-body' }) do |c|
+ - c.with_header do
+ %h3.gl-new-card-title
+ = _('Groups (%{count})') % { count: @user_groups.total_count }
+ - c.with_body do
+ - if @user_groups.total_count > 0
+ - @group_notifications.each do |setting|
+ = render 'group_settings', setting: setting, group: setting.source
+ = paginate @user_groups, theme: 'gitlab'
+ - else
+ .gl-new-card-empty.gl-px-3.gl-py-4= _("You do not belong to any groups yet.")
+
+ = render Pajamas::CardComponent.new(card_options: { class: 'gl-new-card' }, header_options: { class: 'gl-new-card-header gl-display-block'}, body_options: { class: 'gl-new-card-body' }) do |c|
+ - c.with_header do
+ %h3.gl-new-card-title
+ = _('Projects (%{count})') % { count: @project_notifications.size }
+ .gl-new-card-description
+ = _('To specify the notification level per project of a group you belong to, visit the project page and change the notification level there.')
+ - c.with_body do
+ - if @project_notifications.size > 0
- @project_notifications.each do |setting|
= render 'project_settings', setting: setting, project: setting.source
+ - else
+ .gl-new-card-empty.gl-px-3.gl-py-4= _("You do not belong to any projects yet.")
diff --git a/app/views/profiles/passwords/edit.html.haml b/app/views/profiles/passwords/edit.html.haml
index 4fdf80c1eb1..4848a9dc595 100644
--- a/app/views/profiles/passwords/edit.html.haml
+++ b/app/views/profiles/passwords/edit.html.haml
@@ -2,36 +2,34 @@
- page_title _('Password')
- @force_desktop_expanded_sidebar = true
-.row.gl-mt-3.js-search-settings-section
- .col-lg-4.profile-settings-sidebar
- %h4.gl-mt-0
- = page_title
- %p
- = _('After a successful password update, you will be redirected to the login page where you can log in with your new password.')
- .col-lg-8
- %h5.gl-mt-0
- - if @user.password_automatically_set
- = _('Change your password')
- - else
- = _('Change your password or recover your current one')
- = gitlab_ui_form_for @user, url: profile_password_path, method: :put, html: {class: "update-password"} do |f|
- = form_errors(@user)
+.settings-section.js-search-settings-section
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0
+ = page_title
+ %p.gl-text-secondary
+ - if @user.password_automatically_set
+ = _('Change your password.')
+ - else
+ = _('Change your password or recover your current one.')
+ = gitlab_ui_form_for @user, url: profile_password_path, method: :put, html: {class: "update-password"} do |f|
+ = form_errors(@user)
- - unless @user.password_automatically_set?
- .form-group
- = f.label :password, _('Current password'), class: 'label-bold'
- = f.password_field :password, required: true, autocomplete: 'current-password', class: 'form-control gl-form-input', data: { qa_selector: 'current_password_field' }
- %p.form-text.text-muted
- = _('You must provide your current password in order to change it.')
- .form-group
- = f.label :new_password, _('New password'), class: 'label-bold'
- = f.password_field :new_password, required: true, autocomplete: 'new-password', class: 'form-control gl-form-input js-password-complexity-validation', data: { qa_selector: 'new_password_field' }
- = render_if_exists 'shared/password_requirements_list'
+ - unless @user.password_automatically_set?
.form-group
- = f.label :password_confirmation, _('Password confirmation'), class: 'label-bold'
- = f.password_field :password_confirmation, required: true, autocomplete: 'new-password', class: 'form-control gl-form-input', data: { qa_selector: 'confirm_password_field' }
- .gl-mt-3.gl-mb-3
- = f.submit _('Save password'), class: "gl-mr-3", data: { qa_selector: 'save_password_button' }, pajamas_button: true
- - unless @user.password_automatically_set?
- = render Pajamas::ButtonComponent.new(href: reset_profile_password_path, variant: :link, method: :put) do
- = _('I forgot my password')
+ = f.label :password, _('Current password'), class: 'label-bold'
+ = f.password_field :password, required: true, autocomplete: 'current-password', class: 'form-control gl-form-input gl-max-w-80', data: { qa_selector: 'current_password_field' }
+ %p.form-text.text-muted
+ = _('You must provide your current password in order to change it.')
+ .form-group
+ = f.label :new_password, _('New password'), class: 'label-bold'
+ = f.password_field :new_password, required: true, autocomplete: 'new-password', class: 'form-control gl-form-input js-password-complexity-validation gl-max-w-80', data: { qa_selector: 'new_password_field' }
+ = render_if_exists 'shared/password_requirements_list'
+ .form-group
+ = f.label :password_confirmation, _('Password confirmation'), class: 'label-bold'
+ = f.password_field :password_confirmation, required: true, autocomplete: 'new-password', class: 'form-control gl-form-input gl-max-w-80', data: { qa_selector: 'confirm_password_field' }
+ .gl-mt-3.gl-mb-3
+ = f.submit _('Save password'), class: "gl-mr-3", data: { qa_selector: 'save_password_button' }, pajamas_button: true
+ - unless @user.password_automatically_set?
+ = render Pajamas::ButtonComponent.new(href: reset_profile_password_path, variant: :link, method: :put) do
+ = _('I forgot my password')
diff --git a/app/views/profiles/personal_access_tokens/index.html.haml b/app/views/profiles/personal_access_tokens/index.html.haml
index 57c0badd033..5020f6cbb22 100644
--- a/app/views/profiles/personal_access_tokens/index.html.haml
+++ b/app/views/profiles/personal_access_tokens/index.html.haml
@@ -4,27 +4,26 @@
- type_plural = _('personal access tokens')
- @force_desktop_expanded_sidebar = true
-.row.gl-mt-3.js-search-settings-section
- .col-lg-4.profile-settings-sidebar
- %h4.gl-mt-0
- = page_title
- %p
- = s_('AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API.')
- %p
- = s_('AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP.')
- = s_('AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled.')
+.settings-section.settings-section-no-bottom.js-search-settings-section
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0
+ = page_title
+ %p.gl-text-secondary
+ = s_('AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API.')
+ = s_('AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP.')
+ = s_('AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled.')
- .col-lg-8
- #js-new-access-token-app{ data: { access_token_type: type } }
+ #js-new-access-token-app{ data: { access_token_type: type } }
- = render 'shared/access_tokens/form',
- ajax: true,
- type: type,
- path: profile_personal_access_tokens_path,
- token: @personal_access_token,
- scopes: @scopes,
- help_path: help_page_path('user/profile/personal_access_tokens.md', anchor: 'personal-access-token-scopes')
+ = render 'shared/access_tokens/form',
+ ajax: true,
+ type: type,
+ path: profile_personal_access_tokens_path,
+ token: @personal_access_token,
+ scopes: @scopes,
+ help_path: help_page_path('user/profile/personal_access_tokens.md', anchor: 'personal-access-token-scopes')
- #js-access-token-table-app{ data: { access_token_type: type, access_token_type_plural: type_plural, initial_active_access_tokens: @active_access_tokens.to_json } }
+ #js-access-token-table-app{ data: { access_token_type: type, access_token_type_plural: type_plural, initial_active_access_tokens: @active_access_tokens.to_json } }
#js-tokens-app{ data: { tokens_data: tokens_app_data } }
diff --git a/app/views/profiles/preferences/show.html.haml b/app/views/profiles/preferences/show.html.haml
index a085840ee84..e5e7c1dc3f4 100644
--- a/app/views/profiles/preferences/show.html.haml
+++ b/app/views/profiles/preferences/show.html.haml
@@ -11,165 +11,152 @@
= stylesheet_link_tag "themes/#{theme.css_filename}" if theme.css_filename
= gitlab_ui_form_for @user, url: profile_preferences_path, remote: true, method: :put, html: { id: "profile-preferences-form" } do |f|
- .row.gl-mt-3.js-preferences-form.js-search-settings-section
- .col-lg-4.application-theme#navigation-theme
- %h4.gl-mt-0
- = s_('Preferences|Color theme')
+ .settings-section.js-preferences-form.js-search-settings-section.application-theme#navigation-theme
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0
+ = s_('Preferences|Color theme')
+ %p.gl-text-secondary
+ = s_('Preferences|Customize the color of GitLab.')
+ - if show_super_sidebar?
%p
- = s_('Preferences|Customize the color of GitLab.')
- - if show_super_sidebar?
- %p
- = s_('Preferences|Note: You have the new navigation enabled, so only Dark Mode theme significantly changes GitLab\'s appearance.')
- .col-lg-8.application-theme
- .row
- - Gitlab::Themes.each do |theme|
- %label.col-6.col-sm-4.col-md-3.gl-mb-5.gl-text-center
- .preview{ class: theme.css_class }
- = f.gitlab_ui_radio_component :theme_id, theme.id,
- theme.name,
- radio_options: { checked: user_theme_id == theme.id }
+ = s_('Preferences|Note: You have the new navigation enabled, so only Dark Mode theme significantly changes GitLab\'s appearance.')
+ .application-theme.row
+ - Gitlab::Themes.each do |theme|
+ %label.col-6.col-sm-4.col-md-3.col-xl-2.gl-mb-5
+ .preview{ class: theme.css_class }
+ = f.gitlab_ui_radio_component :theme_id, theme.id,
+ theme.name,
+ radio_options: { checked: user_theme_id == theme.id }
- .col-sm-12
- %hr
-
- .row.js-preferences-form.js-search-settings-section
- .col-lg-4.profile-settings-sidebar#syntax-highlighting-theme
- %h4.gl-mt-0
- = s_('Preferences|Syntax highlighting theme')
- %p
- = s_('Preferences|Customize the appearance of the syntax.')
- = succeed '.' do
- = link_to _('Learn more'), help_page_path('user/profile/preferences', anchor: 'syntax-highlighting-theme'), target: '_blank', rel: 'noopener noreferrer'
- .col-lg-8.syntax-theme
+ .settings-section.js-preferences-form.js-search-settings-section#syntax-highlighting-theme
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0
+ = s_('Preferences|Syntax highlighting theme')
+ %p.gl-text-secondary
+ = s_('Preferences|Customize the appearance of the syntax.')
+ = succeed '.' do
+ = link_to _('Learn more'), help_page_path('user/profile/preferences', anchor: 'syntax-highlighting-theme'), target: '_blank', rel: 'noopener noreferrer'
+ .syntax-theme.row
- Gitlab::ColorSchemes.each do |scheme|
- = label_tag do
+ %label.col-6.col-sm-4.col-md-3.col-lg-auto.gl-mb-5
.preview= image_tag "#{scheme.css_class}-scheme-preview.png"
= f.gitlab_ui_radio_component :color_scheme_id, scheme.id,
- scheme.name,
- radio_options: { checked: user_color_schema_id == scheme.id }
+ scheme.name,
+ radio_options: { checked: user_color_schema_id == scheme.id }
- .col-sm-12
- %hr
+ .settings-section.js-preferences-form.js-search-settings-section#diffs-colors
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0
+ = s_('Preferences|Diff colors')
+ %p.gl-text-secondary
+ = s_('Preferences|Customize the colors of removed and added lines in diffs.')
+ .form-group
+ #js-profile-preferences-diffs-colors-app{ data: user_diffs_colors }
- .row.js-preferences-form.js-search-settings-section
- .col-lg-4.profile-settings-sidebar#diffs-colors
- %h4.gl-mt-0
- = s_('Preferences|Diff colors')
- %p
- = s_('Preferences|Customize the colors of removed and added lines in diffs.')
- .col-lg-8
- .form-group
- #js-profile-preferences-diffs-colors-app{ data: user_diffs_colors }
+ .settings-section.js-preferences-form.js-search-settings-section#behavior
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0
+ = s_('Preferences|Behavior')
+ %p.gl-text-secondary
+ = s_('Preferences|Customize the behavior of the system layout and default views.')
+ = succeed '.' do
+ = link_to _('Learn more'), help_page_path('user/profile/preferences', anchor: 'behavior'), target: '_blank', rel: 'noopener noreferrer'
+ .form-group
+ = f.label :layout, class: 'label-bold' do
+ = s_('Preferences|Layout width')
+ = f.select :layout, layout_choices, {}, class: 'gl-form-select custom-select'
+ .form-text.text-muted
+ = s_('Preferences|Choose between fixed (max. 1280px) and fluid (%{percentage}) application layout.').html_safe % { percentage: '100%' }
+ .js-listbox-input{ data: { label: s_('Preferences|Homepage'), description: s_('Preferences|Choose what content you want to see by default on your homepage.'), name: 'user[dashboard]', items: dashboard_choices.to_json, value: current_user.dashboard, block: true.to_s, fluid_width: true.to_s } }
- .col-sm-12
- %hr
+ = render_if_exists 'profiles/preferences/group_overview_selector', f: f # EE-specific
- .row.js-preferences-form.js-search-settings-section
- .col-lg-4.profile-settings-sidebar#behavior
- %h4.gl-mt-0
- = s_('Preferences|Behavior')
- %p
- = s_('Preferences|Customize the behavior of the system layout and default views.')
- = succeed '.' do
- = link_to _('Learn more'), help_page_path('user/profile/preferences', anchor: 'behavior'), target: '_blank', rel: 'noopener noreferrer'
- .col-lg-8
- .form-group
- = f.label :layout, class: 'label-bold' do
- = s_('Preferences|Layout width')
- = f.select :layout, layout_choices, {}, class: 'gl-form-select custom-select'
- .form-text.text-muted
- = s_('Preferences|Choose between fixed (max. 1280px) and fluid (%{percentage}) application layout.').html_safe % { percentage: '100%' }
- .js-listbox-input{ data: { label: s_('Preferences|Homepage'), description: s_('Preferences|Choose what content you want to see by default on your homepage.'), name: 'user[dashboard]', items: dashboard_choices.to_json, value: current_user.dashboard } }
+ .form-group
+ = f.label :project_view, class: 'label-bold' do
+ = s_('Preferences|Project overview content')
+ = f.select :project_view, project_view_choices, {}, class: 'gl-form-select custom-select'
+ .form-text.text-muted
+ = s_('Preferences|Choose what content you want to see on a project’s overview page.')
+ .form-group
+ = f.gitlab_ui_checkbox_component :project_shortcut_buttons, s_('Preferences|Show shortcut buttons above files on project overview')
+ .form-group
+ = f.gitlab_ui_checkbox_component :render_whitespace_in_code, s_('Preferences|Render whitespace characters in the Web IDE')
+ .form-group
+ = f.gitlab_ui_checkbox_component :show_whitespace_in_diffs, s_('Preferences|Show whitespace changes in diffs')
+ .form-group
+ = f.gitlab_ui_checkbox_component :view_diffs_file_by_file,
+ s_("Preferences|Show one file at a time on merge request's Changes tab"),
+ help_text: s_("Preferences|Instead of all the files changed, show only one file at a time. To switch between files, use the file browser.")
+ .form-group
+ - supported_characters = %w(" ' ` &#40; [ { < * _).map { |char| "<code>#{char}</code>" }.join(', ')
+ = f.gitlab_ui_checkbox_component :markdown_surround_selection,
+ s_('Preferences|Surround text selection when typing quotes or brackets'),
+ help_text: sprintf(s_("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}."), { supported_characters: supported_characters }).html_safe
+ .form-group
+ = f.gitlab_ui_checkbox_component :markdown_automatic_lists,
+ s_('Preferences|Automatically add new list items'),
+ help_text: html_escape(s_('Preferences|When you type in a description or comment box, pressing %{kbdOpen}Enter%{kbdClose} in a list adds a new item below.')) % { kbdOpen: '<kbd>'.html_safe, kbdClose: '</kbd>'.html_safe }
- = render_if_exists 'profiles/preferences/group_overview_selector', f: f # EE-specific
+ .form-group
+ = f.label :tab_width, s_('Preferences|Tab width'), class: 'label-bold'
+ = f.number_field :tab_width,
+ class: 'form-control gl-form-input',
+ min: Gitlab::TabWidth::MIN,
+ max: Gitlab::TabWidth::MAX,
+ required: true
+ .form-text.text-muted
+ = s_('Preferences|Must be a number between %{min} and %{max}') % { min: Gitlab::TabWidth::MIN, max: Gitlab::TabWidth::MAX }
- .form-group
- = f.label :project_view, class: 'label-bold' do
- = s_('Preferences|Project overview content')
- = f.select :project_view, project_view_choices, {}, class: 'gl-form-select custom-select'
- .form-text.text-muted
- = s_('Preferences|Choose what content you want to see on a project’s overview page.')
- .form-group
- = f.gitlab_ui_checkbox_component :project_shortcut_buttons, s_('Preferences|Show shortcut buttons above files on project overview')
- .form-group
- = f.gitlab_ui_checkbox_component :render_whitespace_in_code, s_('Preferences|Render whitespace characters in the Web IDE')
- .form-group
- = f.gitlab_ui_checkbox_component :show_whitespace_in_diffs, s_('Preferences|Show whitespace changes in diffs')
- .form-group
- = f.gitlab_ui_checkbox_component :view_diffs_file_by_file,
- s_("Preferences|Show one file at a time on merge request's Changes tab"),
- help_text: s_("Preferences|Instead of all the files changed, show only one file at a time. To switch between files, use the file browser.")
- .form-group
- - supported_characters = %w(" ' ` &#40; [ { < * _).map { |char| "<code>#{char}</code>" }.join(', ')
- = f.gitlab_ui_checkbox_component :markdown_surround_selection,
- s_('Preferences|Surround text selection when typing quotes or brackets'),
- help_text: sprintf(s_("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}."), { supported_characters: supported_characters }).html_safe
- .form-group
- = f.gitlab_ui_checkbox_component :markdown_automatic_lists,
- s_('Preferences|Automatically add new list items'),
- help_text: html_escape(s_('Preferences|When you type in a description or comment box, pressing %{kbdOpen}Enter%{kbdClose} in a list adds a new item below.')) % { kbdOpen: '<kbd>'.html_safe, kbdClose: '</kbd>'.html_safe }
+ .settings-section.js-preferences-form.js-search-settings-section#localization
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0
+ = _('Localization')
+ %p.gl-text-secondary
+ = _('Customize language and region related settings.')
+ = succeed '.' do
+ = link_to _('Learn more'), help_page_path('user/profile/preferences', anchor: 'localization'), target: '_blank', rel: 'noopener noreferrer'
+ .js-listbox-input{ data: { label: _('Language'), description: s_('Preferences|This feature is experimental and translations are not yet complete.'), name: 'user[preferred_language]', items: language_choices.to_json, value: current_user.preferred_language, block: true.to_s, fluid_width: true.to_s } }
+ %p.gl-mt-n5
+ = 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')
+ = f.select :first_day_of_week, first_day_of_week_choices_with_default, {}, class: 'gl-form-select custom-select'
- .form-group
- = f.label :tab_width, s_('Preferences|Tab width'), class: 'label-bold'
- = f.number_field :tab_width,
- class: 'form-control gl-form-input',
- min: Gitlab::TabWidth::MIN,
- max: Gitlab::TabWidth::MAX,
- required: true
- .form-text.text-muted
- = s_('Preferences|Must be a number between %{min} and %{max}') % { min: Gitlab::TabWidth::MIN, max: Gitlab::TabWidth::MAX }
-
- .col-sm-12
- %hr
- .row.js-preferences-form.js-search-settings-section
- .col-lg-4.profile-settings-sidebar#localization
- %h4.gl-mt-0
- = _('Localization')
- %p
- = _('Customize language and region related settings.')
- = succeed '.' do
- = link_to _('Learn more'), help_page_path('user/profile/preferences', anchor: 'localization'), target: '_blank', rel: 'noopener noreferrer'
- .col-lg-8
- .js-listbox-input{ data: { label: _('Language'), description: s_('Preferences|This feature is experimental and translations are not yet complete.'), name: 'user[preferred_language]', items: language_choices.to_json, value: current_user.preferred_language } }
- %p.gl-mt-n5
- = 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')
- = f.select :first_day_of_week, first_day_of_week_choices_with_default, {}, class: 'gl-form-select custom-select'
- .col-sm-12
- %hr
- .row.js-preferences-form.js-search-settings-section
- .col-lg-4.profile-settings-sidebar#time-preferences
- %h4.gl-mt-0
- = s_('Preferences|Time preferences')
- %p
- = s_('Preferences|Configure how dates and times display for you.')
+ .settings-section.js-preferences-form.js-search-settings-section#time-preferences
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0
+ = s_('Preferences|Time preferences')
+ %p.gl-text-secondary
+ = s_('Preferences|Configure how dates and times display for you.')
+ = succeed '.' do
+ = link_to _('Learn more'), help_page_path('user/profile/preferences', anchor: 'time-preferences'), target: '_blank', rel: 'noopener noreferrer'
+ .form-group
+ = f.gitlab_ui_checkbox_component :time_display_relative,
+ s_('Preferences|Use relative times'),
+ help_text: s_('Preferences|For example: 30 minutes ago.')
+ - if Feature.enabled?(:disable_follow_users, @user)
+ .settings-section.js-preferences-form.js-search-settings-section#enabled_following
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0
+ = s_('Preferences|Enable follow users feature')
+ %p.gl-text-secondary
+ = s_('Preferences|Turns on or off the ability to follow or be followed by other users.')
= succeed '.' do
- = link_to _('Learn more'), help_page_path('user/profile/preferences', anchor: 'time-preferences'), target: '_blank', rel: 'noopener noreferrer'
- .col-lg-8
+ = link_to _('Learn more'), help_page_path('user/profile/index', anchor: 'follow-users'), target: '_blank', rel: 'noopener noreferrer'
.form-group
- = f.gitlab_ui_checkbox_component :time_display_relative,
- s_('Preferences|Use relative times'),
- help_text: s_('Preferences|For example: 30 minutes ago.')
- - if Feature.enabled?(:disable_follow_users, @user)
- .row.js-preferences-form.js-search-settings-section
- .col-sm-12
- %hr
- .col-lg-4.profile-settings-sidebar#enabled_following
- %h4.gl-mt-0
- = s_('Preferences|Enable follow users feature')
- %p
- = s_('Preferences|Turns on or off the ability to follow or be followed by other users.')
- = succeed '.' do
- = link_to _('Learn more'), help_page_path('user/profile/index', anchor: 'follow-users'), target: '_blank', rel: 'noopener noreferrer'
- .col-lg-8
- .form-group
- = f.gitlab_ui_checkbox_component :enabled_following,
- s_('Preferences|Enable follow users')
+ = f.gitlab_ui_checkbox_component :enabled_following,
+ s_('Preferences|Enable follow users')
= render_if_exists 'profiles/preferences/code_suggestions_settings', form: f
= render_if_exists 'profiles/preferences/zoekt_settings', form: f
diff --git a/app/views/profiles/show.html.haml b/app/views/profiles/show.html.haml
index 1a932ed7b35..ebdea5786f5 100644
--- a/app/views/profiles/show.html.haml
+++ b/app/views/profiles/show.html.haml
@@ -7,50 +7,50 @@
- if Feature.enabled?(:edit_user_profile_vue, current_user)
.js-user-profile
- else
- = gitlab_ui_form_for @user, url: profile_path, method: :put, html: { multipart: true, class: 'edit-user js-edit-user gl-mt-3 js-quick-submit gl-show-field-errors js-password-prompt-form', remote: true }, authenticity_token: true do |f|
- .row.js-search-settings-section
- .col-lg-4.profile-settings-sidebar
- %h4.gl-mt-0
- = s_("Profiles|Public avatar")
- %p
- - if @user.avatar?
- - if gravatar_enabled?
- = s_("Profiles|You can change your avatar here or remove the current avatar to revert to %{gravatar_link}").html_safe % { gravatar_link: gravatar_link }
- - else
- = s_("Profiles|You can change your avatar here")
- - else
- - if gravatar_enabled?
- = s_("Profiles|You can upload your avatar here or change it at %{gravatar_link}").html_safe % { gravatar_link: gravatar_link }
- - else
- = s_("Profiles|You can upload your avatar here")
- - if current_appearance&.profile_image_guidelines?
- .md
- = brand_profile_image_guidelines
- .col-lg-8
- .avatar-image
- = link_to avatar_icon_for_user(@user, 400), target: '_blank', rel: 'noopener noreferrer' do
- = render Pajamas::AvatarComponent.new(@user, size: 96, alt: "", class: 'gl-float-left gl-mr-5')
- %h5.gl-mt-0= s_("Profiles|Upload new avatar")
- .gl-display-flex.gl-align-items-center.gl-my-3
- = render Pajamas::ButtonComponent.new(button_options: { class: 'js-choose-user-avatar-button' }) do
- = s_("Profiles|Choose file...")
- %span.gl-ml-3.js-avatar-filename= s_("Profiles|No file chosen.")
- = 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.")
+ = gitlab_ui_form_for @user, url: profile_path, method: :put, html: { multipart: true, class: 'edit-user js-edit-user js-quick-submit gl-show-field-errors js-password-prompt-form', remote: true }, authenticity_token: true do |f|
+ .settings-section.js-search-settings-section
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0
+ = s_("Profiles|Public avatar")
+ %p.gl-text-secondary
- if @user.avatar?
- = render Pajamas::ButtonComponent.new(variant: :danger,
- category: :secondary,
- href: profile_avatar_path,
- button_options: { class: 'gl-mt-3', data: { confirm: s_("Profiles|Avatar will be removed. Are you sure?") } },
- method: :delete) do
- = s_("Profiles|Remove avatar")
- .col-lg-12
- %hr
- .row.js-search-settings-section
- .col-lg-4.profile-settings-sidebar
- %h4.gl-mt-0= s_("Profiles|Current status")
- %p= s_("Profiles|This emoji and message will appear on your profile and throughout the interface.")
- .col-lg-8
+ - if gravatar_enabled?
+ = s_("Profiles|You can change your avatar here or remove the current avatar to revert to %{gravatar_link}").html_safe % { gravatar_link: gravatar_link }
+ - else
+ = s_("Profiles|You can change your avatar here")
+ - else
+ - if gravatar_enabled?
+ = s_("Profiles|You can upload your avatar here or change it at %{gravatar_link}").html_safe % { gravatar_link: gravatar_link }
+ - else
+ = s_("Profiles|You can upload your avatar here")
+ - if current_appearance&.profile_image_guidelines?
+ .md
+ = brand_profile_image_guidelines
+ .avatar-image
+ = link_to avatar_icon_for_user(@user, 400), target: '_blank', rel: 'noopener noreferrer' do
+ = render Pajamas::AvatarComponent.new(@user, size: 96, alt: "", class: 'gl-float-left gl-mr-5')
+ %h5.gl-mt-0= s_("Profiles|Upload new avatar")
+ .gl-display-flex.gl-align-items-center.gl-my-3
+ = render Pajamas::ButtonComponent.new(button_options: { class: 'js-choose-user-avatar-button' }) do
+ = s_("Profiles|Choose file...")
+ %span.gl-ml-3.js-avatar-filename= s_("Profiles|No file chosen.")
+ = 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?
+ = render Pajamas::ButtonComponent.new(variant: :danger,
+ category: :secondary,
+ href: profile_avatar_path,
+ button_options: { class: 'gl-mt-3', data: { confirm: s_("Profiles|Avatar will be removed. Are you sure?") } },
+ method: :delete) do
+ = s_("Profiles|Remove avatar")
+
+ .settings-section.js-search-settings-section.gl-border-t.gl-pt-6
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0= s_("Profiles|Current status")
+ %p.gl-text-secondary= s_("Profiles|This emoji and message will appear on your profile and throughout the interface.")
+ .gl-max-w-80
#js-user-profile-set-status-form
= f.fields_for :status, @user.status do |status_form|
= status_form.hidden_field :emoji, data: { js_name: 'emoji' }
@@ -59,121 +59,117 @@
= status_form.hidden_field :clear_status_after,
value: user_clear_status_at(@user),
data: { js_name: 'clearStatusAfter' }
- .col-lg-12
- %hr
- .row.user-time-preferences.js-search-settings-section
- .col-lg-4.profile-settings-sidebar
- %h4.gl-mt-0= s_("Profiles|Time settings")
- %p= s_("Profiles|Set your local time zone.")
- .col-lg-8
- = f.label :user_timezone, _("Time zone")
- .js-timezone-dropdown{ data: { timezone_data: timezone_data.to_json, initial_value: @user.timezone, name: 'user[timezone]' } }
- .col-lg-12
- %hr
- .row.js-search-settings-section
- .col-lg-4.profile-settings-sidebar
- %h4.gl-mt-0
- = s_("Profiles|Main settings")
- %p
- = s_("Profiles|This information will appear on your profile.")
- - if current_user.ldap_user?
- = s_("Profiles|Some options are unavailable for LDAP accounts")
- .col-lg-8
- .row
- .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-md-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-md-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
- .form-group.gl-form-group
- = f.label :skype
- = f.text_field :skype, class: 'gl-form-input form-control gl-md-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-md-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-md-form-input-lg', placeholder: s_("Profiles|@username")
- .form-group.gl-form-group
- - external_accounts_help_url = help_page_path('user/profile/index', anchor: 'add-external-accounts-to-your-user-profile-page')
- - external_accounts_link = link_to '', external_accounts_help_url, target: "_blank", rel: "noopener noreferrer"
- - external_accounts_docs_link = safe_format(s_('Profiles|Your Discord user ID. %{external_accounts_link_start}Learn more.%{external_accounts_link_end}'), tag_pair(external_accounts_link, :external_accounts_link_start, :external_accounts_link_end))
- - min_discord_length = 17
- - max_discord_length = 20
- = f.label :discord
- = f.text_field :discord,
- class: 'gl-form-input form-control gl-md-form-input-lg js-validate-length',
- placeholder: s_("Profiles|User ID"),
- data: { min_length: min_discord_length,
- min_length_message: s_('Profiles|Discord ID is too short (minimum is %{min_length} characters).') % { min_length: min_discord_length },
- max_length: max_discord_length,
- max_length_message: s_('Profiles|Discord ID is too long (maximum is %{max_length} characters).') % { max_length: max_discord_length },
- allow_empty: true}
- %small.form-text.text-gl-muted
- = external_accounts_docs_link
- .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-md-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-md-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-md-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-md-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-md-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
+ .settings-section.user-time-preferences.js-search-settings-section.gl-border-t.gl-pt-6
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0= s_("Profiles|Time settings")
+ %p.gl-text-secondary= s_("Profiles|Set your local time zone.")
+ = f.label :user_timezone, _("Time zone")
+ .js-timezone-dropdown{ data: { timezone_data: timezone_data.to_json, initial_value: @user.timezone, name: 'user[timezone]' } }
+
+ .settings-section.js-search-settings-section.gl-border-t.gl-pt-6
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0
+ = s_("Profiles|Main settings")
+ %p.gl-text-secondary
+ = s_("Profiles|This information will appear on your profile.")
+ - if current_user.ldap_user?
+ = s_("Profiles|Some options are unavailable for LDAP accounts")
+ .form-group.gl-form-group.rspec-full-name.gl-max-w-80
+ = render 'profiles/name', form: f, user: @user
+ .form-group.gl-form-group.gl-md-form-input-lg
+ = 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-md-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-md-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
+ .form-group.gl-form-group
+ = f.label :skype
+ = f.text_field :skype, class: 'gl-form-input form-control gl-md-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-md-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-md-form-input-lg', placeholder: s_("Profiles|@username")
+ .form-group.gl-form-group
+ - external_accounts_help_url = help_page_path('user/profile/index', anchor: 'add-external-accounts-to-your-user-profile-page')
+ - external_accounts_link = link_to '', external_accounts_help_url, target: "_blank", rel: "noopener noreferrer"
+ - external_accounts_docs_link = safe_format(s_('Profiles|Your Discord user ID. %{external_accounts_link_start}Learn more.%{external_accounts_link_end}'), tag_pair(external_accounts_link, :external_accounts_link_start, :external_accounts_link_end))
+ - min_discord_length = 17
+ - max_discord_length = 20
+ = f.label :discord
+ = f.text_field :discord,
+ class: 'gl-form-input form-control gl-md-form-input-lg js-validate-length',
+ placeholder: s_("Profiles|User ID"),
+ data: { min_length: min_discord_length,
+ min_length_message: s_('Profiles|Discord ID is too short (minimum is %{min_length} characters).') % { min_length: min_discord_length },
+ max_length: max_discord_length,
+ max_length_message: s_('Profiles|Discord ID is too long (maximum is %{max_length} characters).') % { max_length: max_discord_length },
+ allow_empty: true}
+ %small.form-text.text-gl-muted
+ = external_accounts_docs_link
+
+ .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-md-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-md-form-input-lg', readonly: true
%small.form-text.text-gl-muted
- = s_("Profiles|Tell us about yourself in fewer than 250 characters.")
- %hr
+ = 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-md-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-md-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-md-form-input-lg'
+ %small.form-text.text-gl-muted
+ = s_("Profiles|Who you represent or work for.")
+ .form-group.gl-form-group.gl-mb-6.gl-max-w-80
+ = 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.")
+ .gl-border-t.gl-pt-6
%fieldset.form-group.gl-form-group
- %legend.col-form-label.col-form-label
+ %legend.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
+ %legend.col-form-label
= s_("Profiles|Private contributions")
= f.gitlab_ui_checkbox_component :include_private_contributions,
s_('Profiles|Include private contributions on your profile'),
help_text: 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
+ %fieldset.form-group.gl-form-group.gl-mb-0
+ %legend.col-form-label
= s_("Profiles|Achievements")
= f.gitlab_ui_checkbox_component :achievements_enabled,
s_('Profiles|Display achievements on your profile')
- .row.js-hide-when-nothing-matches-search
- .col-lg-12
- %hr
- = f.submit s_("Profiles|Update profile settings"), class: 'gl-mr-3 js-password-prompt-btn', pajamas_button: true
- = render Pajamas::ButtonComponent.new(href: user_path(current_user)) do
- = s_('TagsPage|Cancel')
+
+ .js-hide-when-nothing-matches-search.settings-sticky-footer
+ = f.submit s_("Profiles|Update profile settings"), class: 'gl-mr-3 js-password-prompt-btn', pajamas_button: true
+ = render Pajamas::ButtonComponent.new(href: user_path(current_user)) do
+ = s_('TagsPage|Cancel')
#password-prompt-modal
diff --git a/app/views/profiles/two_factor_auths/show.html.haml b/app/views/profiles/two_factor_auths/show.html.haml
index 461164e1ae9..42297a0cf3d 100644
--- a/app/views/profiles/two_factor_auths/show.html.haml
+++ b/app/views/profiles/two_factor_auths/show.html.haml
@@ -55,7 +55,8 @@
= label_tag :pin_code, _('Enter verification code'), class: "label-bold"
= text_field_tag :pin_code, nil, autocomplete: 'off', inputmode: 'numeric', class: "form-control gl-form-input", required: true, data: { qa_selector: 'pin_code_field' }
.gl-mt-3
- = submit_tag _('Register with two-factor app'), class: 'gl-button btn btn-confirm', data: { qa_selector: 'register_2fa_app_button' }
+ = render Pajamas::ButtonComponent.new(type: :submit, variant: :confirm, button_options: { data: { qa_selector: 'register_2fa_app_button' } }) do
+ = _('Register with two-factor app')
%hr
@@ -101,7 +102,7 @@
- else
%span.gl-text-gray-500
= _("no name set")
- %td= registration[:created_at].to_date.to_s(:medium)
+ %td= registration[:created_at].to_date.to_fs(:medium)
%td
= render Pajamas::ButtonComponent.new(variant: :danger,
href: registration[:delete_path],
diff --git a/app/views/projects/_activity.html.haml b/app/views/projects/_activity.html.haml
index 118f6fb1296..00da6c73081 100644
--- a/app/views/projects/_activity.html.haml
+++ b/app/views/projects/_activity.html.haml
@@ -3,8 +3,7 @@
.nav-block.d-none.d-sm-flex.activities.gl-static
= render 'shared/event_filter'
.controls.gl-display-flex
- = link_to project_path(@project, rss_url_options), title: s_("ProjectActivityRSS|Subscribe"), class: 'btn gl-button btn-default btn-icon d-none d-sm-inline-flex has-tooltip' do
- = sprite_icon('rss', css_class: 'gl-icon')
+ = link_button_to nil, project_path(@project, rss_url_options), title: s_("ProjectActivityRSS|Subscribe"), class: 'd-none d-sm-inline-flex has-tooltip', icon: 'rss'
- if is_project_overview && can?(current_user, :download_code, @project)
.project-clone-holder.d-none.d-md-inline-flex.gl-ml-2
= render "projects/buttons/clone", dropdown_class: 'dropdown-menu-right'
diff --git a/app/views/projects/_customize_workflow.html.haml b/app/views/projects/_customize_workflow.html.haml
index ded43a34b48..da4b257f224 100644
--- a/app/views/projects/_customize_workflow.html.haml
+++ b/app/views/projects/_customize_workflow.html.haml
@@ -5,4 +5,4 @@
%p
Get started with GitLab by enabling features that work best for your project. From issues and wikis, to merge requests and pipelines, GitLab can help manage your workflow from idea to production!
- if can?(current_user, :admin_project, @project)
- = link_to "Get started", edit_project_path(@project), class: "gl-button btn btn-confirm"
+ = link_button_to "Get started", edit_project_path(@project), variant: :confirm
diff --git a/app/views/projects/_export.html.haml b/app/views/projects/_export.html.haml
index 97f5cdb54e5..3ef2c722e98 100644
--- a/app/views/projects/_export.html.haml
+++ b/app/views/projects/_export.html.haml
@@ -20,10 +20,12 @@
%li= _('Webhooks')
%li= _('Any encrypted tokens')
- if project.export_status == :finished
- = link_to _('Download export'), download_export_project_path(project),
- rel: 'nofollow', download: '', method: :get, class: "btn gl-button btn-default", data: { qa_selector: 'download_export_link' }
- = link_to _('Generate new export'), generate_new_export_project_path(project),
- method: :post, class: "btn gl-button btn-default"
+ = render Pajamas::ButtonComponent.new(href: download_export_project_path(project),
+ method: :get,
+ button_options: { ref: 'nofollow', download: '', data: { qa_selector: 'download_export_link' } }) do
+ = _('Download export')
+ = render Pajamas::ButtonComponent.new(href: generate_new_export_project_path(project), method: :post) do
+ = _('Generate new export')
- else
- = link_to _('Export project'), export_project_path(project),
- method: :post, class: "btn gl-button btn-default", data: { qa_selector: 'export_project_link' }
+ = render Pajamas::ButtonComponent.new(href: export_project_path(project), method: :post, button_options: { data: { qa_selector: 'export_project_link' } }) do
+ = _('Export project')
diff --git a/app/views/projects/_find_file_link.html.haml b/app/views/projects/_find_file_link.html.haml
index a4bf72edf12..4ad2c339bcc 100644
--- a/app/views/projects/_find_file_link.html.haml
+++ b/app/views/projects/_find_file_link.html.haml
@@ -1,2 +1,2 @@
-= link_to project_find_file_path(@project, @ref), class: 'gl-button btn btn-default shortcuts-find-file', rel: 'nofollow' do
+= link_button_to project_find_file_path(@project, @ref), class: 'shortcuts-find-file', rel: 'nofollow' do
= _('Find file')
diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml
index 9cb5ec39de2..59147138834 100644
--- a/app/views/projects/_home_panel.html.haml
+++ b/app/views/projects/_home_panel.html.haml
@@ -27,9 +27,7 @@
.project-repo-buttons.gl-display-flex.gl-justify-content-md-end.gl-align-items-center.gl-flex-wrap.gl-gap-3
- if current_user
- if current_user.admin?
- = link_to [:admin, @project], class: 'btn btn-default gl-button btn-icon', title: _('View project in admin area'),
- data: {toggle: 'tooltip', placement: 'top', container: 'body'} do
- = sprite_icon('admin')
+ = link_button_to nil, [:admin, @project], icon: 'admin', title: _('View project in admin area'), data: {toggle: 'tooltip', placement: 'top', container: 'body'}
- if @notification_setting
.js-vue-notification-dropdown{ data: { disabled: emails_disabled.to_s, dropdown_items: notification_dropdown_items(@notification_setting).to_json, notification_level: @notification_setting.level, help_page_path: help_page_path('user/profile/notifications'), project_id: @project.id, no_flip: 'true' } }
diff --git a/app/views/projects/_import_project_pane.html.haml b/app/views/projects/_import_project_pane.html.haml
index 947a1007fd5..6315c6dc52d 100644
--- a/app/views/projects/_import_project_pane.html.haml
+++ b/app/views/projects/_import_project_pane.html.haml
@@ -43,9 +43,7 @@
- if gitea_import_enabled?
%div
- = link_to new_import_gitea_path(namespace_id: namespace_id), class: 'gl-button btn-default btn import_gitea js-import-project-btn', data: { platform: 'gitea', **tracking_attrs_data(track_label, 'click_button', 'gitea') } do
- .gl-button-icon
- = custom_icon('gitea_logo')
+ = render Pajamas::ButtonComponent.new(href: new_import_gitea_path(namespace_id: namespace_id), icon: 'gitea', button_options: { class: 'import_gitea js-import-project-btn', data: { platform: 'gitea', **tracking_attrs_data(track_label, 'click_button', 'gitea') } }) do
Gitea
- if git_import_enabled?
diff --git a/app/views/projects/_new_project_fields.html.haml b/app/views/projects/_new_project_fields.html.haml
index 6049d1cc110..983b8056358 100644
--- a/app/views/projects/_new_project_fields.html.haml
+++ b/app/views/projects/_new_project_fields.html.haml
@@ -98,4 +98,4 @@
-# this partial is from JiHu, see details in https://jihulab.com/gitlab-cn/gitlab/-/merge_requests/675
= render_if_exists 'shared/other_project_options', f: f, visibility_level: visibility_level, track_label: track_label
= f.submit _('Create project'), class: "js-create-project-button", data: { qa_selector: 'project_create_button', track_label: "#{track_label}", track_action: "click_button", track_property: "create_project", track_value: "" }, pajamas_button: true
-= link_to _('Cancel'), @parent_group || dashboard_groups_path, class: 'btn gl-button btn-default btn-cancel', data: { track_label: "#{track_label}", track_action: "click_button", track_property: "cancel", track_value: "" }
+= link_button_to _('Cancel'), @parent_group || dashboard_groups_path, data: { track_label: "#{track_label}", track_action: "click_button", track_property: "cancel", track_value: "" }
diff --git a/app/views/projects/_readme.html.haml b/app/views/projects/_readme.html.haml
index 85a53edc160..c3d66396256 100644
--- a/app/views/projects/_readme.html.haml
+++ b/app/views/projects/_readme.html.haml
@@ -24,4 +24,4 @@
distributed with computer software, forming part of its documentation.
GitLab will render it here instead of this message.
%p
- = link_to "Add Readme", @project.add_readme_path, class: 'gl-button btn btn-confirm'
+ = link_button_to "Add Readme", @project.add_readme_path, variant: :confirm
diff --git a/app/views/projects/_service_desk_settings.html.haml b/app/views/projects/_service_desk_settings.html.haml
index 14991ce3824..0a83efdb3b8 100644
--- a/app/views/projects/_service_desk_settings.html.haml
+++ b/app/views/projects/_service_desk_settings.html.haml
@@ -12,8 +12,8 @@
enabled: "#{@project.service_desk_enabled}",
issue_tracker_enabled: "#{@project.project_feature.issues_enabled?}",
incoming_email: (@project.service_desk_incoming_address if @project.service_desk_enabled),
- custom_email: (@project.service_desk_custom_address if @project.service_desk_enabled),
- custom_email_enabled: "#{Gitlab::Email::ServiceDeskEmail.enabled?}",
+ service_desk_email: (@project.service_desk_custom_address if @project.service_desk_enabled),
+ service_desk_email_enabled: "#{Gitlab::Email::ServiceDeskEmail.enabled?}",
selected_template: "#{@project.service_desk_setting&.issue_template_key}",
selected_file_template_project_id: "#{@project.service_desk_setting&.file_template_project_id}",
outgoing_name: "#{@project.service_desk_setting&.outgoing_name}",
diff --git a/app/views/projects/_wiki.html.haml b/app/views/projects/_wiki.html.haml
index 45d0aee4332..e82e0972d82 100644
--- a/app/views/projects/_wiki.html.haml
+++ b/app/views/projects/_wiki.html.haml
@@ -14,4 +14,4 @@
- if can_create_wiki
%p
= _("Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message.")
- = link_to _("Create your first page"), wiki_path(@project.wiki) + '?view=create', class: "btn gl-button btn-confirm"
+ = link_button_to _("Create your first page"), wiki_path(@project.wiki) + '?view=create', variant: :confirm
diff --git a/app/views/projects/artifacts/browse.html.haml b/app/views/projects/artifacts/browse.html.haml
index ccda06c7e4c..ebeeaed7ae9 100644
--- a/app/views/projects/artifacts/browse.html.haml
+++ b/app/views/projects/artifacts/browse.html.haml
@@ -18,10 +18,8 @@
= link_to truncate(title, length: 40), browse_project_job_artifacts_path(@project, @build, path)
.tree-controls<
- = link_to download_project_job_artifacts_path(@project, @build),
- rel: 'nofollow', download: '', class: 'gl-button btn btn-default download' do
- = sprite_icon('download', css_class: 'gl-mr-2')
- Download artifacts archive
+ = link_button_to download_project_job_artifacts_path(@project, @build), rel: 'nofollow', download: '', class: 'download', icon: 'download' do
+ = _('Download artifacts archive')
.tree-content-holder
%table.table.tree-table
diff --git a/app/views/projects/artifacts/external_file.html.haml b/app/views/projects/artifacts/external_file.html.haml
index a014d134e31..67f6ccd5695 100644
--- a/app/views/projects/artifacts/external_file.html.haml
+++ b/app/views/projects/artifacts/external_file.html.haml
@@ -1,3 +1,4 @@
+- external_url = @blob.external_url(@build)
- page_title @path, _('Artifacts'), "#{@build.name} (##{@build.id})", _('Jobs')
= render "projects/jobs/header"
@@ -8,8 +9,8 @@
%h2= _("You are being redirected away from GitLab")
%p= _("This page is hosted on GitLab pages but contains user-generated content and may contain malicious code. Do not accept unless you trust the author and source.")
- = link_to @blob.external_url(@project, @build),
- @blob.external_url(@project, @build),
+ = link_to external_url,
+ external_url,
target: '_blank',
title: _('Opens in a new window'),
rel: 'noopener noreferrer'
diff --git a/app/views/projects/blob/_breadcrumb.html.haml b/app/views/projects/blob/_breadcrumb.html.haml
index 79b13dc861a..417c11ba37a 100644
--- a/app/views/projects/blob/_breadcrumb.html.haml
+++ b/app/views/projects/blob/_breadcrumb.html.haml
@@ -22,14 +22,11 @@
-# only show normal/blame view links for text files
- if blob.readable_text?
- if blame
- = link_to 'Normal view', project_blob_path(@project, @id),
- class: 'gl-button btn btn-default'
+ = link_button_to _('Normal view'), project_blob_path(@project, @id)
- else
- = link_to 'Blame', project_blame_path(@project, @id),
- class: 'gl-button btn btn-default js-blob-blame-link' unless blob.empty?
+ = link_button_to _('Blame'), project_blame_path(@project, @id), class: 'js-blob-blame-link' unless blob.empty?
- = link_to 'History', project_commits_path(@project, @id),
- class: 'gl-button btn btn-default'
+ = link_button_to _('History'), project_commits_path(@project, @id)
- = link_to 'Permalink', project_blob_path(@project,
- tree_join(@commit.sha, @path)), class: 'gl-button btn btn-default js-data-file-blob-permalink-url'
+ = link_button_to _('Permalink'), project_blob_path(@project, tree_join(@commit.sha, @path)),
+ class: 'js-data-file-blob-permalink-url'
diff --git a/app/views/projects/blob/_new_dir.html.haml b/app/views/projects/blob/_new_dir.html.haml
index 3ae7741d24d..f1da9154df9 100644
--- a/app/views/projects/blob/_new_dir.html.haml
+++ b/app/views/projects/blob/_new_dir.html.haml
@@ -16,6 +16,6 @@
.form-actions
= submit_tag _("Create directory"), class: 'btn gl-button btn-confirm'
- = link_to _('Cancel'), '#', class: "btn gl-button btn-default btn-cancel", "data-dismiss" => "modal"
+ = link_button_to _('Cancel'), '#', "data-dismiss" => "modal"
= render 'shared/projects/edit_information'
diff --git a/app/views/projects/branches/_branch.html.haml b/app/views/projects/branches/_branch.html.haml
index adff64fad5a..ae8d230f356 100644
--- a/app/views/projects/branches/_branch.html.haml
+++ b/app/views/projects/branches/_branch.html.haml
@@ -11,13 +11,13 @@
= branch.name
= clipboard_button(text: branch.name, title: _("Copy branch name"))
- if is_default_branch
- = gl_badge_tag s_('DefaultBranchLabel|default'), { variant: :neutral, size: :sm }, { class: 'gl-ml-2', data: { qa_selector: 'badge_content' } }
+ = gl_badge_tag s_('DefaultBranchLabel|default'), { variant: :neutral, size: :sm }, { class: 'gl-ml-2' }
- if protected_branch?(@project, branch)
- = gl_badge_tag s_('Branches|protected'), { variant: :muted, size: :sm }, { class: 'gl-ml-2', data: { qa_selector: 'badge_content' } }
+ = gl_badge_tag s_('Branches|protected'), { variant: :muted, size: :sm }, { class: 'gl-ml-2' }
= render_if_exists 'projects/branches/diverged_from_upstream', branch: branch
- .block-truncated
+ .gl-text-truncate
- if commit
= render 'projects/branches/commit', commit: commit, project: @project
- else
@@ -28,35 +28,33 @@
.pipeline-status.d-none.d-md-block<
- if commit_status
- = render 'ci/status/icon', size: 16, status: commit_status, option_css_classes: 'gl-display-inline-flex gl-vertical-align-middle gl-mr-5'
+ = render 'ci/status/icon', size: 16, status: commit_status, option_css_classes: 'gl-display-inline-flex gl-vertical-align-middle gl-mr-3'
- elsif show_commit_status
- .gl-display-inline-flex.gl-vertical-align-middle.gl-mr-5
+ .gl-display-inline-flex.gl-vertical-align-middle.gl-mr-3
%svg.s16
-
- - if mr_status.present?
- .issuable-reference.gl-display-flex.gl-justify-content-end.gl-min-w-10.gl-ml-5.gl-mr-4
- = gl_badge_tag issuable_reference(related_merge_request),
- { icon: mr_status[:icon], variant: mr_status[:variant], size: :md, href: merge_request_path(related_merge_request) },
- { class: 'gl-mr-2', title: mr_status[:title], data: { toggle: 'tooltip', container: 'body', qa_selector: 'badge_content' } }
-
- .controls.d-none.d-md-block<
- - if mr_status.nil? && create_mr_button?(from: branch.name, source_project: @project)
- = render Pajamas::ButtonComponent.new(icon: 'merge-request', href: create_mr_path(from: branch.name, source_project: @project), button_options: { class: 'has-tooltip gl-mr-2!', title: _('New merge request') }) do
- = _('New')
-
- = render 'projects/buttons/download', project: @project, ref: branch.name, pipeline: @refs_pipelines[branch.name], css_class: 'gl-mr-1!'
-
- - if !is_default_branch
- .js-branch-more-actions{ data: {
- branch_name: branch.name,
- default_branch_name: @repository.root_ref,
- can_delete_branch: user_access(@project).can_delete_branch?(branch.name).to_s,
- is_protected_branch: protected_branch?(@project, branch).to_s,
- merged: merged.to_s,
- compare_path: project_compare_index_path(@project, from: @repository.root_ref, to: branch.name),
- delete_path: project_branch_path(@project, branch.name),
- } }
- - else
- .gl-display-inline-flex.gl-w-7
- &nbsp;
+ .right-block.gl-display-flex.gl-align-items-center.gl-justify-content-end
+ .gl-mr-3
+ - if mr_status.present?
+ .issuable-reference.gl-display-flex.gl-justify-content-end.gl-overflow-hidden
+ = gl_badge_tag issuable_reference(related_merge_request),
+ { icon: mr_status[:icon], variant: mr_status[:variant], size: :md, href: merge_request_path(related_merge_request) },
+ { class: 'gl-display-block gl-text-truncate', title: mr_status[:title], data: { toggle: 'tooltip', container: 'body' } }
+
+ - elsif mr_status.nil? && create_mr_button?(from: branch.name, source_project: @project)
+ = render Pajamas::ButtonComponent.new(icon: 'merge-request', href: create_mr_path(from: branch.name, source_project: @project), button_options: { class: 'has-tooltip', title: _('New merge request') }) do
+ = _('New')
+
+ = render 'projects/buttons/download', project: @project, ref: branch.name, pipeline: @refs_pipelines[branch.name], css_class: 'gl-mr-2!'
+
+ .gl-w-7
+ - if !is_default_branch
+ .js-branch-more-actions{ data: {
+ branch_name: branch.name,
+ default_branch_name: @repository.root_ref,
+ can_delete_branch: user_access(@project).can_delete_branch?(branch.name).to_s,
+ is_protected_branch: protected_branch?(@project, branch).to_s,
+ merged: merged.to_s,
+ compare_path: project_compare_index_path(@project, from: @repository.root_ref, to: branch.name),
+ delete_path: project_branch_path(@project, branch.name),
+ } }
diff --git a/app/views/projects/branches/_commit.html.haml b/app/views/projects/branches/_commit.html.haml
index 6bbd0617598..7662caceb15 100644
--- a/app/views/projects/branches/_commit.html.haml
+++ b/app/views/projects/branches/_commit.html.haml
@@ -1,7 +1,7 @@
-.branch-commit.gl-font-sm.gl-text-gray-500
+.branch-commit.gl-font-sm.gl-text-gray-500.gl-text-truncate
= link_to commit.short_id, project_commit_path(project, commit.id), class: "commit-sha"
&middot;
- %span.str-truncated
+ %span
= link_to_markdown commit.title, project_commit_path(project, commit.id), class: "commit-row-message gl-text-gray-500!"
&middot;
%span.gl-text-secondary= time_ago_with_tooltip(commit.committed_date)
diff --git a/app/views/projects/branches/_panel.html.haml b/app/views/projects/branches/_panel.html.haml
index a632e29d34f..c01e3677c19 100644
--- a/app/views/projects/branches/_panel.html.haml
+++ b/app/views/projects/branches/_panel.html.haml
@@ -7,9 +7,9 @@
- return unless branches.any?
-= render Pajamas::CardComponent.new(card_options: {class: 'gl-mt-5 gl-bg-gray-10'}, header_options: {class: 'gl-px-5 gl-py-4 gl-bg-white'}, body_options: {class: 'gl-px-3 gl-py-0'}, footer_options: {class: 'gl-bg-white'}) do |c|
+= render Pajamas::CardComponent.new(card_options: { class: 'gl-new-card' }, header_options: { class: 'gl-new-card-header' }, body_options: { class: 'gl-new-card-body' }, footer_options: { class: 'gl-new-card-footer' }) do |c|
- c.with_header do
- %h3.card-title.h5.gl-line-height-24.gl-m-0
+ %h3.gl-new-card-title.h5
= panel_title
- c.with_body do
%ul.content-list.branches-list.all-branches{ data: { qa_selector: 'all_branches_container' } }
diff --git a/app/views/projects/branches/index.html.haml b/app/views/projects/branches/index.html.haml
index 8992753c676..c03de6646cf 100644
--- a/app/views/projects/branches/index.html.haml
+++ b/app/views/projects/branches/index.html.haml
@@ -1,8 +1,6 @@
- add_page_specific_style 'page_bundles/branches'
- page_title _('Branches')
- add_to_breadcrumbs(_('Repository'), project_tree_path(@project))
-- can_access_branch_rules = can?(current_user, :maintainer_access, @project)
-- can_push_code = (can? current_user, :push_code, @project)
-# Possible values for variables passed down from the projects/branches_controller.rb
-#
@@ -24,21 +22,21 @@
sorted_by: @sort }
}
- - if can_access_branch_rules
- = link_to project_settings_repository_path(@project, anchor: 'js-branch-rules'), class: 'gl-button btn btn-default' do
+ - if can_view_branch_rules?
+ = link_button_to project_settings_repository_path(@project, anchor: 'js-branch-rules') do
= s_('Branches|View branch rules')
- - if can_push_code
- = link_to new_project_branch_path(@project), class: 'gl-button btn btn-confirm' do
+ - if can_push_code?
+ = link_button_to new_project_branch_path(@project), variant: :confirm do
= s_('Branches|New branch')
- .js-delete-merged-branches{ data: {
+ .js-delete-merged-branches.gl-w-7{ data: {
default_branch: @project.repository.root_ref,
form_path: project_merged_branches_path(@project) }
}
= render_if_exists 'projects/commits/mirror_status'
-- if can_access_branch_rules
+- if can_view_branch_rules?
= render 'branch_rules_info'
.js-branch-list{ data: { diverging_counts_endpoint: diverging_commit_counts_namespace_project_branches_path(@project.namespace, @project, format: :json), default_branch: @project.default_branch } }
diff --git a/app/views/projects/branches/new.html.haml b/app/views/projects/branches/new.html.haml
index 9fd9943fd26..7f6a37fc210 100644
--- a/app/views/projects/branches/new.html.haml
+++ b/app/views/projects/branches/new.html.haml
@@ -20,4 +20,4 @@
= _('Existing branch name, tag, or commit SHA')
= render Pajamas::ButtonComponent.new(variant: :confirm, button_options: { type: 'submit', class: 'gl-mr-3' }) do
= _('Create branch')
- = link_to _('Cancel'), project_branches_path(@project), class: 'gl-button btn btn-default btn-cancel'
+ = link_button_to _('Cancel'), project_branches_path(@project)
diff --git a/app/views/projects/buttons/_clone.html.haml b/app/views/projects/buttons/_clone.html.haml
index ab026d9c6ac..db5d1ff5693 100644
--- a/app/views/projects/buttons/_clone.html.haml
+++ b/app/views/projects/buttons/_clone.html.haml
@@ -3,7 +3,7 @@
- if can?(current_user, :download_code, @project)
.git-clone-holder.js-git-clone-holder
- %a#clone-dropdown.gl-button.btn.btn-confirm.clone-dropdown-btn{ href: '#', data: { toggle: 'dropdown', qa_selector: 'clone_dropdown' } }
+ = render Pajamas::ButtonComponent.new(variant: :confirm, button_options: { id: 'clone-dropdown', class: 'clone-dropdown-btn', data: { toggle: 'dropdown', qa_selector: 'clone_dropdown' } }) do
%span.gl-mr-2.js-clone-dropdown-label
= _('Clone')
= sprite_icon("chevron-down", css_class: "icon")
diff --git a/app/views/projects/buttons/_download.html.haml b/app/views/projects/buttons/_download.html.haml
index bbee7d66dcb..23d18236738 100644
--- a/app/views/projects/buttons/_download.html.haml
+++ b/app/views/projects/buttons/_download.html.haml
@@ -6,7 +6,7 @@
- if !project.empty_repo? && can?(current_user, :download_code, project)
- archive_prefix = "#{project.path}-#{ref.tr('/', '-')}"
.project-action-button.dropdown.gl-dropdown.inline{ class: css_class }>
- %button.gl-button.btn.btn-default.dropdown-toggle.gl-dropdown-toggle.dropdown-icon-only.has-tooltip{ title: s_('DownloadSource|Download'), 'data-toggle' => 'dropdown', 'aria-label' => s_('DownloadSource|Download'), 'data-display' => 'static', data: { qa_selector: 'download_source_code_button' } }
+ = render Pajamas::ButtonComponent.new(button_options: { class: 'dropdown-toggle gl-dropdown-toggle dropdown-icon-only has-tooltip', title: s_('DownloadSource|Download'), 'data-toggle' => 'dropdown', 'aria-label' => s_('DownloadSource|Download'), 'data-display' => 'static', data: { qa_selector: 'download_source_code_button' } }) do
= sprite_icon('download', css_class: 'gl-icon dropdown-icon')
%span.sr-only= _('Select Archive Format')
= sprite_icon('chevron-down', css_class: 'gl-icon dropdown-chevron')
diff --git a/app/views/projects/buttons/_download_links.html.haml b/app/views/projects/buttons/_download_links.html.haml
index d36aed44e18..31185fc1532 100644
--- a/app/views/projects/buttons/_download_links.html.haml
+++ b/app/views/projects/buttons/_download_links.html.haml
@@ -1,4 +1,4 @@
.btn-group.ml-0.w-100
- Gitlab::Workhorse::ARCHIVE_FORMATS.each_with_index do |fmt, index|
- archive_path = project_archive_path(project, id: tree_join(ref, archive_prefix), path: path, format: fmt)
- = link_to fmt, external_storage_url_or_path(archive_path), rel: 'nofollow', download: '', class: "gl-button btn btn-sm #{index == 0 ? 'btn-confirm' : 'btn-default'}"
+ = link_button_to fmt, external_storage_url_or_path(archive_path), rel: 'nofollow', download: '', variant: index == 0 ? :confirm : :default, size: :small
diff --git a/app/views/projects/buttons/_fork.html.haml b/app/views/projects/buttons/_fork.html.haml
index 6d05f1dc955..c9dcfaff8c6 100644
--- a/app/views/projects/buttons/_fork.html.haml
+++ b/app/views/projects/buttons/_fork.html.haml
@@ -2,17 +2,15 @@
- if current_user
.count-badge.btn-group
- if current_user.already_forked?(@project) && current_user.forkable_namespaces.size < 2
- = link_to namespace_project_path(current_user, current_user.fork_of(@project)), title: s_('ProjectOverview|Go to your fork'), class: 'gl-button btn btn-default has-tooltip fork-btn' do
- = sprite_icon('fork', css_class: 'icon')
- %span= s_('ProjectOverview|Fork')
+ = link_button_to namespace_project_path(current_user, current_user.fork_of(@project)), title: s_('ProjectOverview|Go to your fork'), class: 'has-tooltip fork-btn', icon: 'fork' do
+ = s_('ProjectOverview|Fork')
- else
- disabled_tooltip = fork_button_disabled_tooltip(@project)
- count_class = 'disabled' unless can?(current_user, :read_code, @project)
- button_class = 'disabled' if disabled_tooltip
%span.btn-group{ class: ('has-tooltip' if disabled_tooltip), title: disabled_tooltip }
- = link_to new_project_fork_path(@project), class: "gl-button btn btn-default fork-btn #{button_class}", data: { qa_selector: 'fork_button' } do
- = sprite_icon('fork', css_class: 'icon')
- %span= s_('ProjectOverview|Fork')
- = link_to project_forks_path(@project), title: n_(s_('ProjectOverview|Forks'), s_('ProjectOverview|Forks'), @project.forks_count), class: "gl-button btn btn-default count has-tooltip fork-count #{count_class}" do
+ = link_button_to new_project_fork_path(@project), class: "fork-btn #{button_class}", data: { qa_selector: 'fork_button' }, icon: 'fork' do
+ = s_('ProjectOverview|Fork')
+ = link_button_to project_forks_path(@project), title: n_(s_('ProjectOverview|Forks'), s_('ProjectOverview|Forks'), @project.forks_count), class: "count has-tooltip fork-count #{count_class}" do
= @project.forks_count
diff --git a/app/views/projects/buttons/_star.html.haml b/app/views/projects/buttons/_star.html.haml
index d4dcfbdff54..35318f68f57 100644
--- a/app/views/projects/buttons/_star.html.haml
+++ b/app/views/projects/buttons/_star.html.haml
@@ -6,12 +6,11 @@
.count-badge.d-inline-flex.align-item-stretch.btn-group
= render Pajamas::ButtonComponent.new(size: :medium, icon: icon, button_text_classes: button_text_classes, button_options: { class: 'star-btn toggle-star', data: { endpoint: toggle_star_project_path(@project, :json) } }) do
- button_text
- = link_to project_starrers_path(@project), title: n_(s_('ProjectOverview|Starrer'), s_('ProjectOverview|Starrers'), @project.star_count), class: 'gl-button btn btn-default has-tooltip star-count count' do
+ = link_button_to project_starrers_path(@project), title: n_(s_('ProjectOverview|Starrer'), s_('ProjectOverview|Starrers'), @project.star_count), class: 'has-tooltip star-count count' do
= @project.star_count
- else
.count-badge.d-inline-flex.align-item-stretch.btn-group
- = link_to new_user_session_path, class: 'gl-button btn btn-default has-tooltip star-btn', title: s_('ProjectOverview|You must sign in to star a project') do
- = sprite_icon('star-o', css_class: 'icon')
- %span= s_('ProjectOverview|Star')
- = link_to project_starrers_path(@project), title: n_(s_('ProjectOverview|Starrer'), s_('ProjectOverview|Starrers'), @project.star_count), class: 'gl-button btn btn-default has-tooltip star-count count' do
+ = link_button_to new_user_session_path, class: 'has-tooltip star-btn', title: s_('ProjectOverview|You must sign in to star a project'), icon: 'star-o' do
+ = s_('ProjectOverview|Star')
+ = link_button_to project_starrers_path(@project), title: n_(s_('ProjectOverview|Starrer'), s_('ProjectOverview|Starrers'), @project.star_count), class: 'has-tooltip star-count count' do
= @project.star_count
diff --git a/app/views/projects/ci/builds/_build.html.haml b/app/views/projects/ci/builds/_build.html.haml
index ecdd43a54f9..4017db459a9 100644
--- a/app/views/projects/ci/builds/_build.html.haml
+++ b/app/views/projects/ci/builds/_build.html.haml
@@ -103,33 +103,28 @@
.gl-text-right
.btn-group
- if can?(current_user, :read_job_artifacts, job) && job.artifacts?
- = link_to download_project_job_artifacts_path(job.project, job), rel: 'nofollow', download: '', title: _('Download artifacts'), class: 'gl-button btn btn-default btn-icon' do
- = sprite_icon('download', css_class: 'gl-icon')
+ = link_button_to nil, download_project_job_artifacts_path(job.project, job), rel: 'nofollow', download: '', title: _('Download artifacts'), icon: 'download'
- if can?(current_user, :update_build, job)
- if job.active?
- = link_to cancel_project_job_path(job.project, job, continue: { to: request.fullpath }), method: :post, title: _('Cancel'), class: 'gl-button btn btn-default btn-icon' do
- = sprite_icon('cancel', css_class: 'gl-icon')
+ = link_button_to nil, cancel_project_job_path(job.project, job, continue: { to: request.fullpath }), method: :post, title: _('Cancel'), icon: 'cancel'
- elsif job.scheduled?
- .gl-button.btn.btn-default.btn-icon.disabled{ disabled: true }
- = sprite_icon('planning', css_class: 'gl-icon')
+ = render Pajamas::ButtonComponent.new(disabled: true, icon: 'planning') do
%time.js-remaining-time{ datetime: job.scheduled_at.utc.iso8601 }
= duration_in_numbers(job.execute_in)
- confirmation_message = s_("DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes.") % { job_name: job.name }
- = link_to play_project_job_path(job.project, job, return_to: request.original_url),
+ = link_button_to nil, play_project_job_path(job.project, job, return_to: request.original_url),
method: :post,
title: s_('DelayedJobs|Start now'),
- class: 'gl-button btn btn-default btn-icon has-tooltip',
- data: { confirm: confirmation_message } do
- = sprite_icon('play', css_class: 'gl-icon')
- = link_to unschedule_project_job_path(job.project, job, return_to: request.original_url),
+ class: 'has-tooltip',
+ data: { confirm: confirmation_message },
+ icon: 'play'
+ = link_button_to nil, unschedule_project_job_path(job.project, job, return_to: request.original_url),
method: :post,
title: s_('DelayedJobs|Unschedule'),
- class: 'gl-button btn btn-default btn-icon has-tooltip' do
- = sprite_icon('time-out', css_class: 'gl-icon')
+ class: 'has-tooltip',
+ icon: 'time-out'
- elsif allow_retry
- if job.playable? && !admin && can?(current_user, :update_build, job)
- = link_to play_project_job_path(job.project, job, return_to: request.original_url), method: :post, title: _('Play'), class: 'gl-button btn btn-default btn-icon' do
- = sprite_icon('play', css_class: 'gl-icon')
+ = link_button_to nil, play_project_job_path(job.project, job, return_to: request.original_url), method: :post, title: _('Play'), icon: 'play'
- elsif job.retryable?
- = link_to retry_project_job_path(job.project, job, return_to: request.original_url), method: :post, title: _('Retry'), class: 'gl-button btn btn-default btn-icon' do
- = sprite_icon('retry', css_class: 'gl-icon')
+ = link_button_to nil, retry_project_job_path(job.project, job, return_to: request.original_url), method: :post, title: _('Retry'), icon: 'retry'
diff --git a/app/views/projects/commit/_commit_box.html.haml b/app/views/projects/commit/_commit_box.html.haml
index c161e1c9d2a..24d063d3b4d 100644
--- a/app/views/projects/commit/_commit_box.html.haml
+++ b/app/views/projects/commit/_commit_box.html.haml
@@ -19,7 +19,7 @@
#{time_ago_with_tooltip(@commit.committed_date)}
#js-commit-comments-button{ data: { comments_count: @notes_count.to_i } }
- = link_to _('Browse files'), project_tree_path(@project, @commit), class: "btn gl-button btn-default gl-mr-3 gl-xs-w-full gl-xs-mb-3"
+ = link_button_to _('Browse files'), project_tree_path(@project, @commit), class: 'gl-mr-3 gl-xs-w-full gl-xs-mb-3'
#js-commit-options-dropdown{ data: commit_options_dropdown_data(@project, @commit) }
.commit-box{ data: { project_path: project_path(@project) } }
diff --git a/app/views/projects/commit/_pipelines_list.haml b/app/views/projects/commit/_pipelines_list.haml
index f7ae462e8f9..382cb499fe1 100644
--- a/app/views/projects/commit/_pipelines_list.haml
+++ b/app/views/projects/commit/_pipelines_list.haml
@@ -4,6 +4,7 @@
#commit-pipeline-table-view{ data: { disable_initialization: disable_initialization,
endpoint: endpoint,
full_path: @project.full_path,
+ graphql_path: api_graphql_path,
"empty-state-svg-path" => image_path('illustrations/empty-state/empty-pipeline-md.svg'),
"error-state-svg-path" => image_path('illustrations/pipelines_failed.svg'),
"project-id": @project.id,
diff --git a/app/views/projects/commit/_signature_badge_user.html.haml b/app/views/projects/commit/_signature_badge_user.html.haml
deleted file mode 100644
index 656adef6a72..00000000000
--- a/app/views/projects/commit/_signature_badge_user.html.haml
+++ /dev/null
@@ -1,21 +0,0 @@
-- user = signature.signed_by_user
-
-- if user
- = link_to user_path(user), class: 'gpg-popover-user-link' do
- %div
- = user_avatar_without_link(user: user, size: 32)
-
- %div
- %strong= user.name
- %div= user.to_reference
-- elsif signature.gpg? # SSH signatures do not have an email embedded in them
- - user_name = signature.gpg_key_user_name
- - user_email = signature.gpg_key_user_email
- - if user_name && user_email
- = mail_to user_email do
- %div
- = user_avatar_without_link(user_name: user_name, user_email: user_email, size: 32)
-
- %div
- %strong= user_name
- %div= user_email
diff --git a/app/views/projects/commit/_verified_system_signature_badge.html.haml b/app/views/projects/commit/_verified_system_signature_badge.html.haml
new file mode 100644
index 00000000000..96ff26ecbd7
--- /dev/null
+++ b/app/views/projects/commit/_verified_system_signature_badge.html.haml
@@ -0,0 +1,5 @@
+- title = _('Verified commit')
+- description = _('This commit was created in the GitLab UI, and signed with a GitLab-verified signature.')
+- locals = { signature: signature, title: title, description: description, label: _('Verified'), variant: 'success' }
+
+= render partial: 'projects/commit/signature_badge', locals: locals
diff --git a/app/views/projects/commit/x509/_signature_badge_user.html.haml b/app/views/projects/commit/x509/_signature_badge_user.html.haml
deleted file mode 100644
index da749172369..00000000000
--- a/app/views/projects/commit/x509/_signature_badge_user.html.haml
+++ /dev/null
@@ -1,19 +0,0 @@
-- user_email = signature.x509_certificate.email
-- user = signature.signed_by_user
-
-- if user
- = link_to user_path(user), class: 'gpg-popover-user-link' do
- %div
- = user_avatar_without_link(user: user, size: 32)
-
- %div
- %strong= user.name
- %div= user.to_reference
-
-- else
- = mail_to user_email do
- %div
- = user_avatar_without_link(user_email: user_email, size: 32)
-
- %div
- %strong= user_email
diff --git a/app/views/projects/commits/_commit.html.haml b/app/views/projects/commits/_commit.html.haml
index 6209ef48f96..13a406d442d 100644
--- a/app/views/projects/commits/_commit.html.haml
+++ b/app/views/projects/commits/_commit.html.haml
@@ -25,7 +25,7 @@
.avatar-cell.d-none.d-sm-block
= author_avatar(commit, size: 40, has_tooltip: false)
- .commit-detail.flex-list.gl-display-flex.gl-justify-content-space-between.gl-align-items-flex-start.gl-flex-grow-1.gl-min-w-0
+ .commit-detail.flex-list.gl-display-flex.gl-justify-content-space-between.gl-align-items-center.gl-flex-grow-1.gl-min-w-0
.commit-content{ data: { qa_selector: 'commit_content' } }
- if view_details && merge_request
= link_to commit.title, project_commit_path(project, commit.id, merge_request_iid: merge_request.iid), class: ["commit-row-message item-title js-onboarding-commit-item", ("font-italic" if commit.message.empty?)]
diff --git a/app/views/projects/commits/_commit_list.html.haml b/app/views/projects/commits/_commit_list.html.haml
index 22f4594c1d5..721040f9a09 100644
--- a/app/views/projects/commits/_commit_list.html.haml
+++ b/app/views/projects/commits/_commit_list.html.haml
@@ -4,7 +4,7 @@
= render Pajamas::CardComponent.new(card_options: { class: 'gl-mb-5'}, body_options: { class: 'gl-py-0'}) do |c|
- c.with_header do
- Commits (#{@total_commit_count})
+ = s_('CompareRevisions|Commits on Source (%{commits_amount})').html_safe % { commits_amount: @total_commit_count }
- c.with_body do
- if hidden > 0
%ul.content-list
diff --git a/app/views/projects/commits/show.html.haml b/app/views/projects/commits/show.html.haml
index 4c5a9acdf83..8afc9ade3e1 100644
--- a/app/views/projects/commits/show.html.haml
+++ b/app/views/projects/commits/show.html.haml
@@ -18,7 +18,7 @@
.tree-controls
- if @merge_request.present?
.control.d-none.d-md-block
- = link_to _("View open merge request"), project_merge_request_path(@project, @merge_request), class: 'btn gl-button'
+ = link_button_to _("View open merge request"), project_merge_request_path(@project, @merge_request)
- elsif create_mr_button?(from: @ref, source_project: @project)
.control.d-none.d-md-block
= render Pajamas::ButtonComponent.new(variant: :confirm, href: create_mr_path(from: @ref, source_project: @project)) do
@@ -28,8 +28,7 @@
= form_tag(project_commits_path(@project, @id, ref_type: @ref_type), method: :get, class: 'commits-search-form js-signature-container', data: { 'signatures-path' => namespace_project_signatures_path(ref_type: @ref_type)}) do
= search_field_tag :search, params[:search], { placeholder: _('Search by message'), id: 'commits-search', class: 'form-control gl-form-input input-short gl-mt-3 gl-sm-mt-0 gl-min-w-full', spellcheck: false }
.control.d-none.d-md-block
- = link_to project_commits_path(@project, @id, rss_url_options), title: _("Commits feed"), class: 'btn gl-button btn-default btn-icon' do
- = sprite_icon('rss')
+ = link_button_to nil, project_commits_path(@project, @id, rss_url_options), title: _("Commits feed"), icon: 'rss'
= render_if_exists 'projects/commits/mirror_status'
diff --git a/app/views/projects/compare/index.html.haml b/app/views/projects/compare/index.html.haml
index 58da76a3231..4a29402bfe7 100644
--- a/app/views/projects/compare/index.html.haml
+++ b/app/views/projects/compare/index.html.haml
@@ -1,16 +1,6 @@
-- breadcrumb_title _("Compare revisions")
-- page_title _("Compare revisions")
+- breadcrumb_title s_("CompareRevisions|Compare revisions")
-%h1.page-title.gl-font-size-h-display
- = _("Compare Git revisions")
-%div
- - example_branch = capture do
- %code.ref-name= @project.default_branch_or_main
- - example_sha = capture do
- %code.ref-name 4eedf23
- = html_escape(_("To see what's changed or create a merge request, choose a branch or tag (like %{branch}), or enter a commit (like %{sha}).")) % { branch: example_branch.html_safe, sha: example_sha.html_safe }
- %br
- = html_escape(_("Changes are shown as if the %{b_open}source%{b_close} revision was being merged into the %{b_open}target%{b_close} revision.")) % { b_open: '<b>'.html_safe, b_close: '</b>'.html_safe }
+- page_title _("CompareRevisions|Compare revisions")
.prepend-top-20
#js-compare-selector{ data: project_compare_selector_data(@project, @merge_request, @compare_params) }
diff --git a/app/views/projects/compare/show.html.haml b/app/views/projects/compare/show.html.haml
index 9185afc0771..5b6f7c392dd 100644
--- a/app/views/projects/compare/show.html.haml
+++ b/app/views/projects/compare/show.html.haml
@@ -1,7 +1,7 @@
-- add_to_breadcrumbs _("Compare revisions"), project_compare_index_path(@project)
-- page_title "#{params[:from]}...#{params[:to]}"
+- add_to_breadcrumbs s_("CompareRevisions|Compare revisions"), project_compare_index_path(@project)
+- page_title "#{params[:from]} to #{params[:to]}"
-.sub-header-block.gl-border-b-0.gl-mb-0
+.sub-header-block.gl-border-b-0.gl-mb-0.gl-pt-4
.js-signature-container{ data: { 'signatures-path' => signatures_namespace_project_compare_index_path } }
#js-compare-selector{ data: project_compare_selector_data(@project, @merge_request, params) }
@@ -20,13 +20,13 @@
= render Pajamas::CardComponent.new(card_options: { class: "gl-bg-gray-50 gl-mb-5 gl-border-none gl-text-center" }) do |c|
- c.with_body do
%h4
- = s_("CompareBranches|There isn't anything to compare.")
+ = s_("CompareRevisions|There isn't anything to compare.")
%p.gl-mb-4.gl-line-height-24
- if params[:to] == params[:from]
- source_branch = capture do
%span.ref-name= params[:from]
- target_branch = capture do
%span.ref-name= params[:to]
- = (s_("CompareBranches|%{source_branch} and %{target_branch} are the same.") % { source_branch: source_branch, target_branch: target_branch }).html_safe
+ = (s_("CompareRevisions|%{source_branch} and %{target_branch} are the same.") % { source_branch: source_branch, target_branch: target_branch }).html_safe
- else
= _("You'll need to use different branch names to get a valid comparison.")
diff --git a/app/views/projects/confluences/show.html.haml b/app/views/projects/confluences/show.html.haml
index 6fec9b501ea..283408ffa63 100644
--- a/app/views/projects/confluences/show.html.haml
+++ b/app/views/projects/confluences/show.html.haml
@@ -8,6 +8,6 @@
- wiki_confluence_epic_link_url = 'https://gitlab.com/groups/gitlab-org/-/epics/3629'
- wiki_confluence_epic_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: wiki_confluence_epic_link_url }
= html_escape(s_("WikiEmpty|You've enabled the Confluence Workspace integration. Your wiki will be viewable directly within Confluence. We are hard at work integrating Confluence more seamlessly into GitLab. If you'd like to stay up to date, follow our %{wiki_confluence_epic_link_start}Confluence epic%{wiki_confluence_epic_link_end}.")) % { wiki_confluence_epic_link_start: wiki_confluence_epic_link_start, wiki_confluence_epic_link_end: '</a>'.html_safe }
- = link_to @project.confluence_integration.confluence_url, target: '_blank', rel: 'noopener noreferrer', class: 'gl-button btn btn-confirm external-url', title: s_('WikiEmpty|Go to Confluence') do
+ = link_button_to @project.confluence_integration.confluence_url, target: '_blank', rel: 'noopener noreferrer', class: 'external-url', title: s_('WikiEmpty|Go to Confluence'), variant: :confirm do
= s_('WikiEmpty|Go to Confluence')
= sprite_icon('external-link')
diff --git a/app/views/projects/deploy_keys/edit.html.haml b/app/views/projects/deploy_keys/edit.html.haml
index 91444a00334..997443d5fa9 100644
--- a/app/views/projects/deploy_keys/edit.html.haml
+++ b/app/views/projects/deploy_keys/edit.html.haml
@@ -7,4 +7,4 @@
= render partial: 'shared/deploy_keys/form', locals: { form: f, deploy_key: @deploy_key }
.form-actions
= f.submit _('Save changes'), pajamas_button: true
- = link_to _('Cancel'), project_settings_repository_path(@project), class: 'gl-button btn btn-default btn-cancel'
+ = link_button_to _('Cancel'), project_settings_repository_path(@project)
diff --git a/app/views/projects/diffs/_diffs.html.haml b/app/views/projects/diffs/_diffs.html.haml
index 982ecbbae51..9193fc4ef25 100644
--- a/app/views/projects/diffs/_diffs.html.haml
+++ b/app/views/projects/diffs/_diffs.html.haml
@@ -12,7 +12,7 @@
.files-changed-inner
.inline-parallel-buttons.gl-display-none.gl-md-display-flex.gl-relative
- if !diffs_expanded? && diff_files.any?(&:collapsed?)
- = link_to _('Expand all'), url_for(safe_params.merge(expanded: 1, format: nil)), class: 'gl-button btn btn-default'
+ = link_button_to _('Expand all'), url_for(safe_params.merge(expanded: 1, format: nil))
- if show_whitespace_toggle
- if current_controller?(:commit)
= commit_diff_whitespace_link(diffs.project, @commit, class: 'd-none d-sm-inline-block')
diff --git a/app/views/projects/diffs/_file.html.haml b/app/views/projects/diffs/_file.html.haml
index 5ec95c3095d..3db1467df60 100644
--- a/app/views/projects/diffs/_file.html.haml
+++ b/app/views/projects/diffs/_file.html.haml
@@ -18,9 +18,7 @@
#js-diff-stats{ data: diff_file_stats_data(diff_file) }
- if diff_file.blob&.readable_text?
- unless @diff_notes_disabled
- %span.has-tooltip{ title: _("Toggle comments for this file") }
- = link_to '#', class: 'js-toggle-diff-comments btn gl-button btn-default btn-icon selected' do
- = sprite_icon('comment')
+ = link_button_to nil, '#', class: 'js-toggle-diff-comments has-tooltip', icon: 'comment', title: _("Toggle comments for this file")
\
- if editable_diff?(diff_file)
- link_opts = @merge_request.persisted? ? { from_merge_request_iid: @merge_request.iid } : {}
diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml
index a5224db1be9..98e8c2dd61b 100644
--- a/app/views/projects/edit.html.haml
+++ b/app/views/projects/edit.html.haml
@@ -7,12 +7,10 @@
= render_if_exists 'shared/ultimate_feature_removal_banner', project: @project
-- if Feature.enabled?(:show_pages_in_deployments_menu, current_user, type: :experiment)
- = render Pajamas::AlertComponent.new(variant: :info,
- title: _('GitLab Pages has moved'),
- alert_options: { class: 'gl-my-5', data: { feature_id: Users::CalloutsHelper::PAGES_MOVED_CALLOUT, dismiss_endpoint: callouts_path, defer_links: 'true' } }) do |c|
- - c.with_body do
- = _('To go to GitLab Pages, on the left sidebar, select %{pages_link}.').html_safe % {pages_link: link_to('Deployments > Pages', project_pages_path(@project)).html_safe}
+= render Pajamas::AlertComponent.new(title: _('GitLab Pages has moved'),
+ alert_options: { class: 'gl-my-5', data: { feature_id: Users::CalloutsHelper::PAGES_MOVED_CALLOUT, dismiss_endpoint: callouts_path, defer_links: 'true' } }) do |c|
+ - c.with_body do
+ = _('To go to GitLab Pages, on the left sidebar, select %{pages_link}.').html_safe % {pages_link: link_to('Deploy > Pages', project_pages_path(@project)).html_safe}
%section.settings.general-settings.no-animate.expanded#js-general-settings
.settings-header
@@ -79,8 +77,8 @@
%p
= _('Runs a number of housekeeping tasks within the current repository, such as compressing file revisions and removing unreachable objects.')
= link_to _('Learn more.'), help_page_path('administration/housekeeping'), target: '_blank', rel: 'noopener noreferrer'
- = link_to _('Run housekeeping'), housekeeping_project_path(@project),
- method: :post, class: "btn gl-button btn-default"
+ = render Pajamas::ButtonComponent.new(method: :post, href: housekeeping_project_path(@project)) do
+ = _('Run housekeeping')
.gl-display-inline-flex
#js-project-prune-unreachable-objects-button{ data: { prune_objects_path: housekeeping_project_path(@project, prune: true), prune_objects_doc_path: help_page_path('administration/housekeeping', anchor: 'prune-unreachable-objects') } }
diff --git a/app/views/projects/environments/edit.html.haml b/app/views/projects/environments/edit.html.haml
index c7752a45c63..1c107784e08 100644
--- a/app/views/projects/environments/edit.html.haml
+++ b/app/views/projects/environments/edit.html.haml
@@ -2,7 +2,7 @@
- add_page_specific_style 'page_bundles/environments'
#js-edit-environment{ data: { project_environments_path: project_environments_path(@project),
- update_environment_path: project_environment_path(@project, @environment),
protected_environment_settings_path: (project_settings_ci_cd_path(@project, anchor: 'js-protected-environments-settings') if @project.licensed_feature_available?(:protected_environments)),
project_path: @project.full_path,
- environment: environment_data(@environment) } }
+ environment_name: @environment.name,
+ kas_tunnel_url: ::Gitlab::Kas.tunnel_url } }
diff --git a/app/views/projects/environments/empty_metrics.html.haml b/app/views/projects/environments/empty_metrics.html.haml
deleted file mode 100644
index df05909e8ef..00000000000
--- a/app/views/projects/environments/empty_metrics.html.haml
+++ /dev/null
@@ -1,14 +0,0 @@
-- page_title _("Metrics")
-
-.row.empty-state
- .col-sm-12
- .svg-content
- = image_tag 'illustrations/operations_metrics_empty.svg'
- .col-12
- .text-content
- %h4.text-center
- = s_('Environments|No deployed environments')
- %p.state-description
- = s_('Metrics|Check out the CI/CD documentation on deploying to an environment')
- .text-center
- = link_to s_("Environments|Learn about environments"), help_page_path('ci/environments/index.md'), class: 'gl-button btn btn-confirm'
diff --git a/app/views/projects/environments/metrics.html.haml b/app/views/projects/environments/metrics.html.haml
deleted file mode 100644
index 31041d124e4..00000000000
--- a/app/views/projects/environments/metrics.html.haml
+++ /dev/null
@@ -1,6 +0,0 @@
-- add_page_specific_style 'page_bundles/prometheus'
-
-- page_title _("Metrics Dashboard"), @environment.name
-
-.prometheus-container
- #prometheus-graphs{ data: metrics_data(@project, @environment) }
diff --git a/app/views/projects/environments/new.html.haml b/app/views/projects/environments/new.html.haml
index 9e8484b88b9..301c19ee6f0 100644
--- a/app/views/projects/environments/new.html.haml
+++ b/app/views/projects/environments/new.html.haml
@@ -3,4 +3,4 @@
- page_title s_("Environments|New Environment")
- add_page_specific_style 'page_bundles/environments'
-#js-new-environment{ data: { project_environments_path: project_environments_path(@project), project_path: @project.full_path, } }
+#js-new-environment{ data: { project_environments_path: project_environments_path(@project), project_path: @project.full_path, kas_tunnel_url: ::Gitlab::Kas.tunnel_url } }
diff --git a/app/views/projects/environments/terminal.html.haml b/app/views/projects/environments/terminal.html.haml
index 7c837d4ded0..c2ad9191800 100644
--- a/app/views/projects/environments/terminal.html.haml
+++ b/app/views/projects/environments/terminal.html.haml
@@ -13,8 +13,7 @@
.col-sm-6
.nav-controls
- if @environment.external_url.present?
- = link_to @environment.external_url, class: 'gl-button btn btn-default', target: '_blank', rel: 'noopener noreferrer nofollow' do
- = sprite_icon('external-link')
+ = link_button_to nil, @environment.external_url, target: '_blank', rel: 'noopener noreferrer nofollow', icon: 'external-link'
= render 'projects/deployments/actions', deployment: @environment.last_deployment
.terminal-container{ class: container_class }
diff --git a/app/views/projects/find_file/show.html.haml b/app/views/projects/find_file/show.html.haml
index afb49c48146..7e93e44c463 100644
--- a/app/views/projects/find_file/show.html.haml
+++ b/app/views/projects/find_file/show.html.haml
@@ -2,11 +2,11 @@
- add_page_specific_style 'page_bundles/tree'
.file-finder-holder.tree-holder.clearfix.js-file-finder{ 'data-file-find-url': "#{escape_javascript(project_files_path(@project, @ref, format: :json))}", 'data-find-tree-url': escape_javascript(project_tree_path(@project, @ref)), 'data-blob-url-template': escape_javascript(project_blob_path(@project, @ref)) }
- .nav-block
- .tree-ref-holder
+ .nav-block.gl-xs-mr-0
+ .tree-ref-holder.gl-xs-mb-3.gl-xs-w-full
#js-blob-ref-switcher{ data: { project_id: @project.id, ref: @ref, namespace: "/-/find_file" } }
- %ul.breadcrumb.repo-breadcrumb
- %li.breadcrumb-item
+ %ul.breadcrumb.repo-breadcrumb.gl-flex-nowrap
+ %li.breadcrumb-item.gl-white-space-nowrap
= link_to project_tree_path(@project, @ref) do
= @project.path
%li.file-finder.breadcrumb-item
diff --git a/app/views/projects/forks/error.html.haml b/app/views/projects/forks/error.html.haml
index cff5899b960..f589c8f9566 100644
--- a/app/views/projects/forks/error.html.haml
+++ b/app/views/projects/forks/error.html.haml
@@ -18,4 +18,4 @@
= error
- c.with_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"
+ = link_button_to _('Try to fork again'), new_project_fork_path(@project), title: _("Fork"), class: 'gl-alert-action', variant: :confirm
diff --git a/app/views/projects/forks/index.html.haml b/app/views/projects/forks/index.html.haml
index d28ee30b6f9..49047749b71 100644
--- a/app/views/projects/forks/index.html.haml
+++ b/app/views/projects/forks/index.html.haml
@@ -20,12 +20,10 @@
- if current_user && can?(current_user, :fork_project, @project)
- if current_user.already_forked?(@project) && current_user.forkable_namespaces.size < 2
- = link_to namespace_project_path(current_user, current_user.fork_of(@project)), title: _('Go to your fork'), class: 'btn gl-button btn-confirm gl-md-ml-3' do
- = sprite_icon('fork', size: 12)
- %span= _('Fork')
+ = link_button_to namespace_project_path(current_user, current_user.fork_of(@project)), title: _('Go to your fork'), class: 'gl-md-ml-3', variant: :confirm, icon: 'fork' do
+ = _('Fork')
- else
- = link_to new_project_fork_path(@project), title: _("Fork project"), class: 'btn gl-button btn-confirm gl-md-ml-3 gl-mt-3 gl-md-mt-0' do
- = sprite_icon('fork', size: 12)
- %span= _('Fork')
+ = link_button_to new_project_fork_path(@project), title: _("Fork project"), class: 'gl-md-ml-3 gl-mt-3 gl-md-mt-0', variant: :confirm, icon: 'fork' do
+ = _('Fork')
= render 'projects', projects: @forks
diff --git a/app/views/projects/hook_logs/show.html.haml b/app/views/projects/hook_logs/show.html.haml
index 0f4dc4b5e32..30084e3310b 100644
--- a/app/views/projects/hook_logs/show.html.haml
+++ b/app/views/projects/hook_logs/show.html.haml
@@ -9,6 +9,6 @@
- if @hook_log.oversize?
= button_tag _("Resend Request"), class: "btn gl-button btn-default float-right gl-ml-3 has-tooltip", disabled: true, title: _("Request data is too large")
- else
- = link_to _("Resend Request"), @hook_log.present.retry_path, method: :post, class: "btn gl-button btn-default float-right gl-ml-3"
+ = link_button_to _("Resend Request"), @hook_log.present.retry_path, method: :post, class: 'float-right gl-ml-3'
= render partial: 'shared/hook_logs/content', locals: { hook_log: @hook_log }
diff --git a/app/views/projects/hooks/edit.html.haml b/app/views/projects/hooks/edit.html.haml
index b553249c4b8..26ec09c76db 100644
--- a/app/views/projects/hooks/edit.html.haml
+++ b/app/views/projects/hooks/edit.html.haml
@@ -3,17 +3,16 @@
= render 'shared/web_hooks/hook_errors', hook: @hook
-.row.gl-mt-3
- .col-lg-3
- = render 'shared/web_hooks/title_and_docs', hook: @hook
+.gl-mt-5
+ = render 'shared/web_hooks/title_and_docs', hook: @hook
- .col-lg-9.gl-mb-3
- = gitlab_ui_form_for [@project, @hook], as: :hook, url: project_hook_path(@project, @hook), html: { class: 'js-webhook-form' } do |f|
- = render partial: 'shared/web_hooks/form', locals: { form: f, hook: @hook }
+ = gitlab_ui_form_for [@project, @hook], as: :hook, url: project_hook_path(@project, @hook), html: { class: 'js-webhook-form' } do |f|
+ = render partial: 'shared/web_hooks/form', locals: { form: f, hook: @hook }
- = f.submit _('Save changes'), pajamas_button: true
+ %div
+ = f.submit _('Save changes'), pajamas_button: true, class: 'gl-sm-mr-3'
= render 'shared/web_hooks/test_button', hook: @hook
- = link_to _('Delete'), project_hook_path(@project, @hook), method: :delete, class: 'btn gl-button btn-danger float-right', aria: { label: s_('Webhooks|Delete webhook') }, data: { confirm: s_('Webhooks|Are you sure you want to delete this project hook?'), confirm_btn_variant: 'danger' }
+ = link_button_to _('Delete'), project_hook_path(@project, @hook), method: :delete, class: 'gl-float-right', aria: { label: s_('Webhooks|Delete webhook') }, data: { confirm: s_('Webhooks|Are you sure you want to delete this project hook?'), confirm_btn_variant: 'danger' }, variant: :danger
%hr
diff --git a/app/views/projects/hooks/index.html.haml b/app/views/projects/hooks/index.html.haml
index 4d71161c96e..b57adc0ef0d 100644
--- a/app/views/projects/hooks/index.html.haml
+++ b/app/views/projects/hooks/index.html.haml
@@ -2,13 +2,6 @@
- page_title _('Webhooks')
- @force_desktop_expanded_sidebar = true
-.row.gl-mt-3.js-search-settings-section
- .col-lg-4
- = render 'shared/web_hooks/title_and_docs', hook: @hook
-
- .col-lg-8.gl-mb-3
- = gitlab_ui_form_for @hook, as: :hook, url: polymorphic_path([@project, :hooks]), html: { class: 'js-webhook-form' } do |f|
- = render partial: 'shared/web_hooks/form', locals: { form: f, hook: @hook }
- = f.submit _('Add webhook'), pajamas_button: true, data: { qa_selector: "create_webhook_button" }
-
- = render 'shared/web_hooks/index', hooks: @hooks, hook_class: @hook.class
+.gl-mt-3.js-search-settings-section
+ = render 'shared/web_hooks/title_and_docs', hook: @hook
+ = render 'shared/web_hooks/index', hooks: @hooks, hook_class: @hook.class, partial: 'shared/web_hooks/form', url: polymorphic_path([@project, :hooks])
diff --git a/app/views/projects/integrations/shimos/show.html.haml b/app/views/projects/integrations/shimos/show.html.haml
index 92b9e03d5bd..e6cd8c15809 100644
--- a/app/views/projects/integrations/shimos/show.html.haml
+++ b/app/views/projects/integrations/shimos/show.html.haml
@@ -6,5 +6,5 @@
= s_('Shimo|Shimo Workspace integration is enabled')
%p
= s_("Shimo|You've enabled the Shimo Workspace integration. You can view your wiki directly in Shimo.")
- = link_to @project.shimo_integration.external_wiki_url, target: '_blank', rel: 'noopener noreferrer', class: 'gl-button btn btn-confirm', title: s_('Shimo|Go to Shimo Workspace') do
+ = link_button_to @project.shimo_integration.external_wiki_url, target: '_blank', rel: 'noopener noreferrer', title: s_('Shimo|Go to Shimo Workspace'), variant: :confirm do
= s_('Shimo|Go to Shimo Workspace')
diff --git a/app/views/projects/issues/_related_branches.html.haml b/app/views/projects/issues/_related_branches.html.haml
index 3d6a266dc4d..21f1a4d19fa 100644
--- a/app/views/projects/issues/_related_branches.html.haml
+++ b/app/views/projects/issues/_related_branches.html.haml
@@ -1,24 +1,25 @@
- if @related_branches.any?
- if @related_branches.any?
- = render Pajamas::CardComponent.new(card_options: { class: 'gl-bg-gray-10 gl-mt-5 gl-mb-0' }, header_options: { class: 'gl-bg-white gl-pl-5 gl-pr-4 gl-py-4' } , body_options: { class: 'gl-py-3 gl-px-4' }) do |c|
+ = render Pajamas::CardComponent.new(card_options: { class: 'gl-new-card' }, header_options: { class: 'gl-new-card-header' } , body_options: { class: 'gl-new-card-body' }) do |c|
- c.with_header do
- %h3.card-title.h5.gl-my-0.gl-display-flex.gl-align-items-center.gl-flex-grow-1.gl-relative.gl-line-height-24
- = link_to "", "#related-branches", class: "gl-link anchor position-absolute gl-text-decoration-none", "aria-hidden": true
- = _('Related branches')
- .gl-display-inline-flex.gl-mx-3.gl-text-gray-500
- .gl-display-inline-flex.gl-align-items-center
- = sprite_icon('branch', css_class: "gl-mr-2 gl-text-gray-500 gl-icon")
- = @related_branches.size
+ .gl-new-card-title-wrapper
+ %h3.gl-new-card-title
+ = link_to "", "#related-branches", class: "gl-link anchor position-absolute gl-text-decoration-none", "aria-hidden": true
+ = _('Related branches')
+ .gl-new-card-count
+ = sprite_icon('branch', css_class: "gl-mr-2 gl-text-gray-500 gl-icon")
+ = @related_branches.size
- c.with_body do
- %ul.related-merge-requests.content-list.gl-p-3!
- - @related_branches.each do |branch|
- %li.list-item{ class: "gl-py-0! gl-border-0!" }
- .item-body.gl-display-flex.align-items-center.gl-px-3.gl-pr-2.gl-mx-n2
- .item-contents.gl-display-flex.gl-align-items-center.gl-flex-wrap.gl-flex-grow-1.gl-min-h-7
- .item-title.gl-display-flex.mb-xl-0.gl-min-w-0
- - if branch[:pipeline_status].present?
- %span.related-branch-ci-status
- = render 'ci/status/icon', status: branch[:pipeline_status]
- %span.related-branch-info
- %strong
- = link_to branch[:name], branch[:link], class: "ref-name"
+ .gl-new-card-content
+ %ul.related-merge-requests.content-list
+ - @related_branches.each do |branch|
+ %li.list-item{ class: "gl-py-0! gl-border-0!" }
+ .item-body.gl-display-flex.align-items-center.gl-px-3.gl-pr-2.gl-mx-n2
+ .item-contents.gl-display-flex.gl-align-items-center.gl-flex-wrap.gl-flex-grow-1.gl-min-h-7
+ .item-title.gl-display-flex.mb-xl-0.gl-min-w-0
+ - if branch[:pipeline_status].present?
+ %span.related-branch-ci-status
+ = render 'ci/status/icon', status: branch[:pipeline_status]
+ %span.related-branch-info
+ %strong
+ = link_to branch[:name], branch[:link], class: "ref-name"
diff --git a/app/views/projects/issues/service_desk.html.haml b/app/views/projects/issues/service_desk.html.haml
index 3cc419716e5..9793f21e4a9 100644
--- a/app/views/projects/issues/service_desk.html.haml
+++ b/app/views/projects/issues/service_desk.html.haml
@@ -8,15 +8,26 @@
- support_bot_attrs = { service_desk_enabled: @project.service_desk_enabled?, **UserSerializer.new.represent(User.support_bot) }.to_json
.js-service-desk-issues.service-desk-issues{ data: { support_bot: support_bot_attrs } }
- .top-area
- = render 'shared/issuable/nav', type: :issues
- .nav-controls.d-block.d-sm-none
- = render "projects/issues/service_desk/nav_btns", show_feed_buttons: false, show_import_button: false, show_export_button: false
+ - if ::Feature.enabled?(:service_desk_vue_list, @project)
+ .js-service-desk-list{ data: { project_data: project_issues_list_data(@project, current_user),
+ service_desk_email_address: @project.service_desk_address,
+ can_admin_issues: can?(current_user, :admin_issue, @project).to_s,
+ can_edit_project_settings: can?(current_user, :admin_project, @project).to_s,
+ service_desk_callout_svg_path: image_path('service_desk_callout.svg'),
+ service_desk_settings_path: edit_project_path(@project, anchor: 'js-service-desk'),
+ service_desk_help_path: help_page_path('user/project/service_desk'),
+ is_service_desk_supported: Gitlab::ServiceDesk.supported?.to_s,
+ is_service_desk_enabled: @project.service_desk_enabled?.to_s } }
+ - else
+ .top-area
+ = render 'shared/issuable/nav', type: :issues
+ .nav-controls.gl-display-block.gl-sm-display-none
+ = render "projects/issues/service_desk/nav_btns", show_feed_buttons: false, show_import_button: false, show_export_button: false
- - if @issues.present?
- = render 'shared/issuable/search_bar', type: :issues
- - if Gitlab::ServiceDesk.supported?
- = render 'projects/issues/service_desk/service_desk_info_content'
+ - if @issues.present?
+ = render 'shared/issuable/search_bar', type: :issues
+ - if Gitlab::ServiceDesk.supported?
+ = render 'projects/issues/service_desk/service_desk_info_content'
- .issues-holder
- = render 'projects/issues/issues', empty_state_path: 'projects/issues/service_desk/service_desk_empty_state'
+ .issues-holder
+ = render 'projects/issues/issues', empty_state_path: 'projects/issues/service_desk/service_desk_empty_state'
diff --git a/app/views/projects/issues/service_desk/_issue.html.haml b/app/views/projects/issues/service_desk/_issue.html.haml
index 04ea6103b83..5b98712d3eb 100644
--- a/app/views/projects/issues/service_desk/_issue.html.haml
+++ b/app/views/projects/issues/service_desk/_issue.html.haml
@@ -33,7 +33,7 @@
%span.issuable-due-date.d-none.d-sm-inline-block.has-tooltip{ class: "#{'cred' if issue.overdue? && !issue.closed?}", title: _('Due date') }
&nbsp;
= sprite_icon('calendar')
- = issue.due_date.to_s(:medium)
+ = issue.due_date.to_fs(:medium)
= render_if_exists "projects/issues/issue_weight", issue: issue
= render_if_exists "projects/issues/health_status", issue: issue
diff --git a/app/views/projects/issues/service_desk/_nav_btns.html.haml b/app/views/projects/issues/service_desk/_nav_btns.html.haml
index a0a290f340a..3b7b3f57abd 100644
--- a/app/views/projects/issues/service_desk/_nav_btns.html.haml
+++ b/app/views/projects/issues/service_desk/_nav_btns.html.haml
@@ -7,12 +7,13 @@
.nav-controls.issues-nav-controls.gl-font-size-0
- if @can_bulk_update
- = button_tag _("Bulk edit"), class: "gl-button btn btn-default gl-mr-3 js-bulk-update-toggle"
+ = render Pajamas::ButtonComponent.new(button_options: { class: 'gl-mr-3 js-bulk-update-toggle' }) do
+ = _("Bulk edit")
- if show_new_issue_link?(@project)
- = link_to _("New issue"), new_project_issue_path(@project,
- issue: { milestone_id: finder.milestones.first.try(:id) }),
- class: "gl-button btn btn-confirm gl-mr-3",
- id: "new_issue_link"
+ = render Pajamas::ButtonComponent.new(variant: :confirm,
+ href: new_project_issue_path(@project, issue: { milestone_id: finder.milestones.first.try(:id) }),
+ button_options: { id: 'new_issue_link', class: 'gl-mr-3' }) do
+ = _("New issue")
.dropdown.gl-dropdown
= button_tag type: 'button', class: "btn dropdown-toggle btn-default btn-md gl-button gl-dropdown gl-dropdown-toggle btn-default-tertiary dropdown-icon-only dropdown-toggle-no-caret has-tooltip gl-display-none! gl-md-display-inline-flex!", data: { toggle: 'dropdown', title: _('Actions') } do
diff --git a/app/views/projects/issues/service_desk/_service_desk_empty_state.html.haml b/app/views/projects/issues/service_desk/_service_desk_empty_state.html.haml
index 855625368a9..831bd107961 100644
--- a/app/views/projects/issues/service_desk/_service_desk_empty_state.html.haml
+++ b/app/views/projects/issues/service_desk/_service_desk_empty_state.html.haml
@@ -21,7 +21,7 @@
- if can_edit_project_settings && !service_desk_enabled
.text-center
- = link_to s_("ServiceDesk|Enable Service Desk"), edit_project_path(@project), class: 'gl-button btn btn-confirm'
+ = link_button_to s_("ServiceDesk|Enable Service Desk"), edit_project_path(@project), variant: :confirm
- else
.empty-state
.svg-content
diff --git a/app/views/projects/issues/service_desk/_service_desk_info_content.html.haml b/app/views/projects/issues/service_desk/_service_desk_info_content.html.haml
index 95837748c7f..093a47e63be 100644
--- a/app/views/projects/issues/service_desk/_service_desk_info_content.html.haml
+++ b/app/views/projects/issues/service_desk/_service_desk_info_content.html.haml
@@ -21,4 +21,4 @@
- if can_edit_project_settings && !service_desk_enabled
.gl-mt-3
- = link_to s_("ServiceDesk|Enable Service Desk"), edit_project_path(@project), class: 'gl-button btn btn-confirm'
+ = link_button_to s_("ServiceDesk|Enable Service Desk"), edit_project_path(@project), variant: :confirm
diff --git a/app/views/projects/jobs/_table.html.haml b/app/views/projects/jobs/_table.html.haml
index 954c77a21f3..0bb512b4035 100644
--- a/app/views/projects/jobs/_table.html.haml
+++ b/app/views/projects/jobs/_table.html.haml
@@ -12,7 +12,7 @@
= s_('Jobs|Use jobs to automate your tasks')
%p
= s_('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.')
- = link_to s_('Jobs|Create CI/CD configuration file'), project_ci_pipeline_editor_path(project), class: 'btn gl-button btn-confirm js-empty-state-button'
+ = link_button_to s_('Jobs|Create CI/CD configuration file'), project_ci_pipeline_editor_path(project), class: 'js-empty-state-button', variant: :confirm
- else
.nothing-here-block= s_('Jobs|No jobs to show')
- else
diff --git a/app/views/projects/jobs/show.html.haml b/app/views/projects/jobs/show.html.haml
index 5f249f693ff..b151c355b3e 100644
--- a/app/views/projects/jobs/show.html.haml
+++ b/app/views/projects/jobs/show.html.haml
@@ -7,4 +7,4 @@
= render_if_exists "shared/shared_runners_minutes_limit_flash_message"
-#js-job-page{ data: jobs_data }
+#js-job-page{ data: jobs_data(@project, @build) }
diff --git a/app/views/projects/labels/index.html.haml b/app/views/projects/labels/index.html.haml
index 7a4ae409ee2..e1c904d000f 100644
--- a/app/views/projects/labels/index.html.haml
+++ b/app/views/projects/labels/index.html.haml
@@ -16,12 +16,13 @@
.labels-container
-# Only show it in the first page
- hide = @available_labels.empty? || (params[:page].present? && params[:page] != '1')
- .prioritized-labels.gl-rounded-base.gl-border.gl-bg-gray-10.gl-mt-4{ class: [('hide' if hide), ('is-not-draggable' unless can_admin_label)] }
- .gl-px-5.gl-py-4.gl-bg-white.gl-rounded-top-base.gl-border-b
- %h3.card-title.h5.gl-m-0.gl-relative.gl-line-height-24
- = _('Prioritized labels')
- .gl-font-sm.gl-font-weight-semibold.gl-text-gray-500
- = _('Drag to reorder prioritized labels and change their relative priority.')
+ .prioritized-labels.gl-new-card{ class: [('hide' if hide), ('is-not-draggable' unless can_admin_label)] }
+ .gl-new-card-header
+ .gl-new-card-title-wrapper.gl-flex-direction-column
+ %h3.gl-new-card-title
+ = _('Prioritized labels')
+ .gl-new-card-description
+ = _('Drag to reorder prioritized labels and change their relative priority.')
.js-prioritized-labels.gl-px-3.gl-rounded-base.manage-labels-list{ data: { url: set_priorities_project_labels_path(@project), sortable: can_admin_label } }
#js-priority-labels-empty-state.priority-labels-empty-state{ class: "#{'hidden' unless @prioritized_labels.empty? && search.blank?}" }
= render 'shared/empty_states/priority_labels'
@@ -32,12 +33,14 @@
= _('No prioritized labels with such name or description')
- if @labels.any?
- .other-labels.gl-rounded-base.gl-border.gl-bg-gray-10.gl-mt-4
- .gl-px-5.gl-py-4.gl-bg-white.gl-rounded-top-base.gl-border-b
- %h3.card-title.h5.gl-m-0.gl-relative.gl-line-height-24{ class: ('hide' if hide) }= _('Other labels')
- .js-other-labels.gl-px-3.gl-rounded-base.manage-labels-list
- = render partial: 'shared/label', collection: @labels, as: :label, locals: { subject: @project }
- = paginate @labels, theme: 'gitlab'
+ .other-labels.gl-new-card
+ .gl-new-card-header
+ .gl-new-card-title-wrapper
+ %h3.gl-new-card-title{ class: ('hide' if hide) }= _('Other labels')
+ .gl-new-card-body
+ .js-other-labels.manage-labels-list.gl-new-card-content
+ = render partial: 'shared/label', collection: @labels, as: :label, locals: { subject: @project }
+ = paginate @labels, theme: 'gitlab'
- elsif search.present?
.other-labels
diff --git a/app/views/projects/mattermosts/_no_teams.html.haml b/app/views/projects/mattermosts/_no_teams.html.haml
index 5886c0565b1..c53e805fae1 100644
--- a/app/views/projects/mattermosts/_no_teams.html.haml
+++ b/app/views/projects/mattermosts/_no_teams.html.haml
@@ -9,4 +9,4 @@
and try again.
%hr
.clearfix
- = link_to 'Go back', edit_project_settings_integration_path(@project, @integration), class: 'gl-button btn btn-lg float-right'
+ = link_button_to 'Go back', edit_project_settings_integration_path(@project, @integration), class: 'float-right'
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 a3536ead240..ab841d4f1b2 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,6 +1,7 @@
.js-mr-more-dropdown{ data: {
merge_request: @merge_request.to_json,
project_path: @project.full_path,
+ url: merge_request_url(@merge_request),
edit_url: edit_project_merge_request_path(@project, @merge_request),
is_current_user: issuable_author_is_current_user(@merge_request),
is_logged_in: current_user,
@@ -11,5 +12,4 @@
clipboard_text: @merge_request.to_reference(full: true),
report_abuse_path: add_category_abuse_reports_path,
reported_user_id: @merge_request.author.id,
- reported_from_url: merge_request_url(@merge_request),
} }
diff --git a/app/views/projects/merge_requests/_form.html.haml b/app/views/projects/merge_requests/_form.html.haml
index 5f1c72156eb..6d2e2cfcc54 100644
--- a/app/views/projects/merge_requests/_form.html.haml
+++ b/app/views/projects/merge_requests/_form.html.haml
@@ -1,3 +1,4 @@
= gitlab_ui_form_for [@project, @merge_request],
html: { class: 'merge-request-form common-note-form js-requires-input js-quick-submit' } do |f|
+ = render 'source_and_target', mr: @merge_request
= render 'shared/issuable/form', f: f, issuable: @merge_request, presenter: @mr_presenter
diff --git a/app/views/projects/merge_requests/_mr_box.html.haml b/app/views/projects/merge_requests/_mr_box.html.haml
index 6f662b81dd7..1774401ed78 100644
--- a/app/views/projects/merge_requests/_mr_box.html.haml
+++ b/app/views/projects/merge_requests/_mr_box.html.haml
@@ -1,3 +1,3 @@
-.detail-page-description.gl-pt-2.gl-pb-4.gl-display-flex.gl-align-items-center.gl-flex-wrap{ class: "#{'is-merge-request' if moved_mr_sidebar_enabled? && !fluid_layout}" }
+.detail-page-description.gl-pt-2.gl-pb-4.gl-display-flex.gl-align-items-baseline.gl-flex-wrap{ class: "#{'is-merge-request' if moved_mr_sidebar_enabled? && !fluid_layout}" }
= render 'shared/issuable/status_box', issuable: @merge_request
= merge_request_header(@project, @merge_request)
diff --git a/app/views/projects/merge_requests/_source_and_target.html.haml b/app/views/projects/merge_requests/_source_and_target.html.haml
new file mode 100644
index 00000000000..68cd4fe9372
--- /dev/null
+++ b/app/views/projects/merge_requests/_source_and_target.html.haml
@@ -0,0 +1,10 @@
+%span{
+ id: "js-merge-request-metadata",
+ class: ["js-merge-request-metadata", "gl-display-none"],
+ data: {
+ "source-project-id": mr.source_project_id,
+ "source-branch": mr.source_branch,
+ "target-project-id": mr.target_project_id,
+ "target-branch": mr.target_branch
+ }
+}
diff --git a/app/views/projects/merge_requests/_widget.html.haml b/app/views/projects/merge_requests/_widget.html.haml
index 576fed58609..606d4e06d33 100644
--- a/app/views/projects/merge_requests/_widget.html.haml
+++ b/app/views/projects/merge_requests/_widget.html.haml
@@ -23,4 +23,9 @@
window.gl.mrWidgetData.user_preferences_gitpod_path = '#{profile_preferences_path(anchor: 'user_gitpod_enabled')}';
window.gl.mrWidgetData.user_profile_enable_gitpod_path = '#{profile_path(user: { gitpod_enabled: true })}';
-#js-vue-mr-widget.mr-widget
+%h2#merge-request-widgets-heading.gl-sr-only
+ = _("Merge request reports")
+#js-vue-mr-widget.mr-widget{
+ role: 'region',
+ 'aria-labelledby': 'merge-request-widgets-heading'
+}
diff --git a/app/views/projects/merge_requests/creations/_new_submit.html.haml b/app/views/projects/merge_requests/creations/_new_submit.html.haml
index bec7cb3fd34..a7151421acb 100644
--- a/app/views/projects/merge_requests/creations/_new_submit.html.haml
+++ b/app/views/projects/merge_requests/creations/_new_submit.html.haml
@@ -1,6 +1,7 @@
%h1.page-title.gl-font-size-h-display
= _('New merge request')
= gitlab_ui_form_for [@project, @merge_request], html: { class: 'merge-request-form common-note-form js-requires-input js-quick-submit' } do |f|
+ = render "projects/merge_requests/source_and_target", mr: @merge_request
= render 'shared/issuable/form', f: f, issuable: @merge_request, commits: @commits, presenter: @mr_presenter
= f.hidden_field :source_project_id
= f.hidden_field :source_branch
diff --git a/app/views/projects/milestones/_form.html.haml b/app/views/projects/milestones/_form.html.haml
index be6f9ac83dc..a592062a17d 100644
--- a/app/views/projects/milestones/_form.html.haml
+++ b/app/views/projects/milestones/_form.html.haml
@@ -12,13 +12,16 @@
= render 'shared/milestones/form_dates', f: f
.form-group
= f.label :description, _('Description')
- = render layout: 'shared/md_preview', locals: { url: preview_markdown_path(@project) } do
- = render 'shared/zen', f: f, attr: :description,
- classes: 'note-textarea',
- qa_selector: 'milestone_description_field',
- supports_autocomplete: true,
- placeholder: _('Write milestone description...')
- = render 'shared/notes/hints'
+ - @gfm_form = true
+ .js-markdown-editor{ data: { render_markdown_path: preview_markdown_path(@project),
+ markdown_docs_path: help_page_path('user/markdown'),
+ qa_selector: 'milestone_description_field',
+ form_field_placeholder: _('Write milestone description...'),
+ supports_quick_actions: 'false',
+ enable_autocomplete: 'true',
+ autofocus: 'false',
+ form_field_classes: 'note-textarea js-gfm-input markdown-area' } }
+ = f.hidden_field :description
.clearfix
.error-alert
@@ -26,7 +29,7 @@
- if @milestone.new_record?
= f.submit _('Create milestone'), data: { qa_selector: 'create_milestone_button' }, class: 'gl-mr-2', pajamas_button: true
- = link_to _('Cancel'), project_milestones_path(@project), class: 'gl-button btn btn-default btn-cancel'
+ = link_button_to _('Cancel'), project_milestones_path(@project)
- else
= f.submit _('Save changes'), class: 'gl-mr-2', pajamas_button: true
- = link_to _('Cancel'), project_milestone_path(@project, @milestone), class: 'gl-button btn btn-default btn-cancel'
+ = link_button_to _('Cancel'), project_milestone_path(@project, @milestone)
diff --git a/app/views/projects/milestones/index.html.haml b/app/views/projects/milestones/index.html.haml
index 326a7c4027f..a7a21ef0440 100644
--- a/app/views/projects/milestones/index.html.haml
+++ b/app/views/projects/milestones/index.html.haml
@@ -9,14 +9,14 @@
= 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 gl-ml-3', data: { qa_selector: "new_project_milestone_link" }, title: _('New milestone') do
+ = link_button_to new_project_milestone_path(@project), class: 'gl-ml-3', data: { qa_selector: "new_project_milestone_link" }, title: _('New milestone'), variant: :confirm do
= _('New milestone')
- if @milestones.blank?
= render 'shared/empty_states/milestones_tab' do
- if can?(current_user, :admin_milestone, @project)
.text-center
- = 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_button_to new_project_milestone_path(@project), data: { qa_selector: "new_project_milestone_link" }, title: _('New milestone'), variant: :confirm do
= _('New milestone')
- else
@@ -32,5 +32,5 @@
= render 'shared/empty_states/milestones' do
- if can?(current_user, :admin_milestone, @project)
.text-center
- = 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_button_to new_project_milestone_path(@project), data: { qa_selector: "new_project_milestone_link" }, title: _('New milestone'), variant: :confirm do
= _('New milestone')
diff --git a/app/views/projects/ml/models/index.html.haml b/app/views/projects/ml/models/index.html.haml
new file mode 100644
index 00000000000..2caba2ae9be
--- /dev/null
+++ b/app/views/projects/ml/models/index.html.haml
@@ -0,0 +1,5 @@
+- breadcrumb_title s_('ModelRegistry|Model registry')
+- page_title s_('ModelRegistry|Model registry')
+- presenter = ::Ml::ModelsIndexPresenter.new(@models)
+
+#js-index-ml-models{ data: { view_model: presenter.present } }
diff --git a/app/views/projects/no_repo.html.haml b/app/views/projects/no_repo.html.haml
index e3f46d601a3..3abec75b971 100644
--- a/app/views/projects/no_repo.html.haml
+++ b/app/views/projects/no_repo.html.haml
@@ -13,14 +13,14 @@
%hr
.no-repo-actions
- = link_to project_repository_path(@project), method: :post, class: 'btn gl-button btn-confirm' do
- #{ _('Create empty repository') }
+ = link_button_to project_repository_path(@project), method: :post, variant: :confirm do
+ = _('Create empty repository')
%strong.gl-ml-3.gl-mr-3 or
- = link_to new_project_import_path(@project), class: 'btn gl-button btn-default' do
- #{ _('Import repository') }
+ = link_button_to new_project_import_path(@project) do
+ = _('Import repository')
- if can? current_user, :remove_project, @project
.prepend-top-20
- = link_to _('Delete project'), project_path(@project), data: { confirm: remove_project_message(@project), confirm_btn_variant: 'danger' }, aria: { label: _('Delete project') }, method: :delete, class: "btn gl-button btn-danger float-right"
+ = link_button_to _('Delete project'), project_path(@project), data: { confirm: remove_project_message(@project), confirm_btn_variant: 'danger' }, aria: { label: _('Delete project') }, method: :delete, class: 'float-right', variant: :danger
diff --git a/app/views/projects/packages/packages/index.html.haml b/app/views/projects/packages/packages/index.html.haml
index 48aaf0884c8..5397828d48e 100644
--- a/app/views/projects/packages/packages/index.html.haml
+++ b/app/views/projects/packages/packages/index.html.haml
@@ -10,4 +10,5 @@
npm_instance_url: package_registry_instance_url(:npm),
project_list_url: project_packages_path(@project),
settings_path: show_package_registry_settings(@project) ? project_settings_packages_and_registries_path(@project) : '',
+ can_delete_packages: can_delete_packages?(@project).to_s,
group_list_url: '' } }
diff --git a/app/views/projects/pages/_access.html.haml b/app/views/projects/pages/_access.html.haml
index 50e48187be3..6eab31075d4 100644
--- a/app/views/projects/pages/_access.html.haml
+++ b/app/views/projects/pages/_access.html.haml
@@ -1,5 +1,5 @@
- if @project.pages_deployed?
- - pages_url = @project.pages_url(with_unique_domain: true)
+ - pages_url = build_pages_url(@project, with_unique_domain: true)
= render Pajamas::CardComponent.new(card_options: { class: 'gl-mb-5', data: { qa_selector: 'access_page_container' } }, footer_options: { class: 'gl-alert-warning' }) do |c|
- c.with_header do
diff --git a/app/views/projects/pages/_list.html.haml b/app/views/projects/pages/_list.html.haml
index 57371aa49f6..38e15d02a39 100644
--- a/app/views/projects/pages/_list.html.haml
+++ b/app/views/projects/pages/_list.html.haml
@@ -26,8 +26,8 @@
- if domain.expired?
= 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?'), 'confirm-btn-variant': 'danger'}, "aria-label": s_("GitLabPages|Remove domain"), method: :delete, class: "btn gl-button btn-danger btn-sm btn-grouped"
+ = link_button_to s_('GitLabPages|Edit'), project_pages_domain_path(@project, domain), class: 'btn-grouped', variant: :confirm, category: :secondary, size: :small
+ = link_button_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-grouped', variant: :danger, size: :small
- 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/new.html.haml b/app/views/projects/pages/new.html.haml
index b9d2af9cf19..89f8f62ea83 100644
--- a/app/views/projects/pages/new.html.haml
+++ b/app/views/projects/pages/new.html.haml
@@ -1,9 +1,5 @@
-- if Feature.enabled?(:show_pages_in_deployments_menu, current_user, type: :experiment)
- - @breadcrumb_link = project_pages_path(@project)
- - breadcrumb_title s_('GitLabPages|Pages')
- - page_title s_('GitLabPages|Pages')
-- else
- %section.js-search-settings-section
+- @breadcrumb_link = project_pages_path(@project)
+- page_title s_('GitLabPages|Pages')
- if Feature.enabled?(:use_pipeline_wizard_for_pages, @project.group)
#js-pages{ data: @pipeline_wizard_data }
diff --git a/app/views/projects/pages/show.html.haml b/app/views/projects/pages/show.html.haml
index 01477967394..698ce404be8 100644
--- a/app/views/projects/pages/show.html.haml
+++ b/app/views/projects/pages/show.html.haml
@@ -1,4 +1,4 @@
-- page_title _('Pages')
+- page_title s_('GitLabPages|Pages')
- unless @project.pages_deployed?
= render 'waiting'
@@ -11,7 +11,7 @@
= render 'pages_settings'
%hr.clearfix
- = render 'ssl_limitations_warning' if @project.pages_subdomain.include?(".")
+ = render 'ssl_limitations_warning' if pages_subdomain(@project).include?(".")
= render 'access'
- if Gitlab.config.pages.external_http || Gitlab.config.pages.external_https
= render 'list'
diff --git a/app/views/projects/pages_domains/_dns.html.haml b/app/views/projects/pages_domains/_dns.html.haml
index 3e6a92d8bc0..0edce28bb9d 100644
--- a/app/views/projects/pages_domains/_dns.html.haml
+++ b/app/views/projects/pages_domains/_dns.html.haml
@@ -1,5 +1,5 @@
- verification_enabled = Gitlab::CurrentSettings.pages_domain_verification_enabled?
-- dns_record = "#{domain_presenter.domain} ALIAS #{domain_presenter.project.pages_subdomain}.#{Settings.pages.host}."
+- dns_record = "#{domain_presenter.domain} ALIAS #{pages_subdomain(domain_presenter.project)}.#{Settings.pages.host}."
.form-group.border-section
.row
@@ -21,11 +21,11 @@
.gl-mb-3
- text, status = domain_presenter.unverified? ? [_('Unverified'), :danger] : [_('Verified'), :success]
= gl_badge_tag text, variant: status
- = link_to sprite_icon("redo"), verify_project_pages_domain_path(@project, domain_presenter), method: :post, class: "gl-ml-2 gl-button btn btn-sm btn-default has-tooltip", title: _("Retry verification")
+ = link_button_to sprite_icon("redo"), verify_project_pages_domain_path(@project, domain_presenter), method: :post, class: 'gl-ml-2 has-tooltip', title: _("Retry verification"), size: :small
.input-group
= text_field_tag :domain_verification, domain_presenter.verification_record, class: "monospace js-select-on-focus form-control", readonly: true
.input-group-append
= clipboard_button(target: '#domain_verification', class: 'btn-default d-none d-sm-block')
%p.form-text.text-muted
- link_to_help = link_to(_('verify ownership'), help_page_path('user/project/pages/custom_domains_ssl_tls_certification/index.md', anchor: '4-verify-the-domains-ownership'))
- = _("To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration.").html_safe % { link_to_help: link_to_help }
+ = _("To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days.").html_safe % { link_to_help: link_to_help }
diff --git a/app/views/projects/pages_domains/_lets_encrypt_callout.html.haml b/app/views/projects/pages_domains/_lets_encrypt_callout.html.haml
index d6c213571f2..68b6884c4f5 100644
--- a/app/views/projects/pages_domains/_lets_encrypt_callout.html.haml
+++ b/app/views/projects/pages_domains/_lets_encrypt_callout.html.haml
@@ -9,7 +9,7 @@
= sprite_icon('warning-solid', css_class: ' mr-2 gl-text-orange-600')
= _("Something went wrong while obtaining the Let's Encrypt certificate.")
.row.mx-0.mt-3
- = link_to s_('GitLabPagesDomains|Retry'), retry_auto_ssl_project_pages_domain_path(@project, domain_presenter), class: "gl-button btn btn-default btn-sm btn-grouped", method: :post
+ = link_button_to s_('GitLabPagesDomains|Retry'), retry_auto_ssl_project_pages_domain_path(@project, domain_presenter), class: 'btn-grouped', method: :post, size: :small
- elsif !domain_presenter.certificate_gitlab_provided?
.form-group.border-section.js-shown-if-auto-ssl{ class: ("d-none" unless auto_ssl_available_and_enabled) }
.row
diff --git a/app/views/projects/pages_domains/new.html.haml b/app/views/projects/pages_domains/new.html.haml
index c88255e23f9..c58209f8806 100644
--- a/app/views/projects/pages_domains/new.html.haml
+++ b/app/views/projects/pages_domains/new.html.haml
@@ -8,4 +8,4 @@
= render 'form', { f: f }
.form-actions.gl-display-flex
= f.submit _('Create New Domain'), class: 'gl-mr-3', pajamas_button: true
- = link_to _('Cancel'), project_pages_path(@project), class: 'gl-button btn btn-default btn-cancel'
+ = link_button_to _('Cancel'), project_pages_path(@project)
diff --git a/app/views/projects/pages_domains/show.html.haml b/app/views/projects/pages_domains/show.html.haml
index b8de364babc..d34650d3f5a 100644
--- a/app/views/projects/pages_domains/show.html.haml
+++ b/app/views/projects/pages_domains/show.html.haml
@@ -10,4 +10,4 @@
= render 'form', { f: f }
.form-actions.gl-display-flex
= f.submit _('Save Changes'), class: 'gl-mr-3', pajamas_button: true
- = link_to _('Cancel'), project_pages_path(@project), class: 'gl-button btn btn-default btn-inverse'
+ = link_button_to _('Cancel'), project_pages_path(@project)
diff --git a/app/views/projects/pipeline_schedules/_form.html.haml b/app/views/projects/pipeline_schedules/_form.html.haml
index 235b89b8c5b..df85963218d 100644
--- a/app/views/projects/pipeline_schedules/_form.html.haml
+++ b/app/views/projects/pipeline_schedules/_form.html.haml
@@ -40,4 +40,4 @@
= f.gitlab_ui_checkbox_component :active, _('Active'), checkbox_options: { value: @schedule.active, required: false }
.footer-block
= f.submit _('Save pipeline schedule'), pajamas_button: true
- = link_to _('Cancel'), pipeline_schedules_path(@project), class: 'btn gl-button btn-default btn-cancel'
+ = link_button_to _('Cancel'), pipeline_schedules_path(@project)
diff --git a/app/views/projects/pipeline_schedules/_pipeline_schedule.html.haml b/app/views/projects/pipeline_schedules/_pipeline_schedule.html.haml
index 37b2b3ecfde..a050808f13c 100644
--- a/app/views/projects/pipeline_schedules/_pipeline_schedule.html.haml
+++ b/app/views/projects/pipeline_schedules/_pipeline_schedule.html.haml
@@ -35,14 +35,11 @@
%td{ role: 'cell', data: { label: _('Actions') } }
.float-right.btn-group
- if can?(current_user, :play_pipeline_schedule, pipeline_schedule)
- = link_to play_pipeline_schedule_path(pipeline_schedule), method: :post, title: _('Play'), class: 'btn gl-button btn-default btn-icon' do
- = sprite_icon('play')
+ = link_button_to nil, play_pipeline_schedule_path(pipeline_schedule), method: :post, title: _('Play'), icon: 'play'
- if can?(current_user, :admin_pipeline_schedule, pipeline_schedule) && pipeline_schedule.owner != current_user
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-take-ownership-button has-tooltip', title: s_('PipelineSchedule|Take ownership to edit'), data: { url: take_ownership_pipeline_schedule_path(pipeline_schedule) } }) do
= s_('PipelineSchedules|Take ownership')
- if can?(current_user, :update_pipeline_schedule, pipeline_schedule)
- = link_to edit_pipeline_schedule_path(pipeline_schedule), title: _('Edit'), class: 'btn gl-button btn-default btn-icon' do
- = sprite_icon('pencil')
+ = link_button_to nil, edit_pipeline_schedule_path(pipeline_schedule), title: _('Edit'), icon: 'pencil'
- if can?(current_user, :admin_pipeline_schedule, pipeline_schedule)
- = link_to pipeline_schedule_path(pipeline_schedule), title: _('Delete'), method: :delete, class: 'btn gl-button btn-danger btn-icon', aria: { label: _('Delete pipeline schedule') }, data: { confirm: _("Are you sure you want to delete this pipeline schedule?"), confirm_btn_variant: 'danger' } do
- = sprite_icon('remove')
+ = link_button_to nil, pipeline_schedule_path(pipeline_schedule), title: _('Delete'), method: :delete, aria: { label: _('Delete pipeline schedule') }, data: { confirm: _("Are you sure you want to delete this pipeline schedule?"), confirm_btn_variant: 'danger' }, variant: :danger, icon: 'remove'
diff --git a/app/views/projects/pipeline_schedules/edit.html.haml b/app/views/projects/pipeline_schedules/edit.html.haml
index 3f843ce6aec..4e1ae53a101 100644
--- a/app/views/projects/pipeline_schedules/edit.html.haml
+++ b/app/views/projects/pipeline_schedules/edit.html.haml
@@ -5,9 +5,8 @@
%h1.page-title.gl-font-size-h-display
= _("Edit Pipeline Schedule")
-%hr
- if Feature.enabled?(:pipeline_schedules_vue, @project)
- #pipeline-schedules-form-edit{ data: { full_path: @project.full_path } }
+ #pipeline-schedules-form-edit{ data: js_pipeline_schedules_form_data(@project, @schedule) }
- else
= render "form"
diff --git a/app/views/projects/pipeline_schedules/index.html.haml b/app/views/projects/pipeline_schedules/index.html.haml
index ab86d505f0f..88a60b1fb06 100644
--- a/app/views/projects/pipeline_schedules/index.html.haml
+++ b/app/views/projects/pipeline_schedules/index.html.haml
@@ -6,7 +6,7 @@
#pipeline-schedules-callout{ data: { docs_url: help_page_path('ci/pipelines/schedules'), illustration_url: image_path('illustrations/pipeline_schedule_callout.svg') } }
- if Feature.enabled?(:pipeline_schedules_vue, @project)
- #pipeline-schedules-app{ data: { full_path: @project.full_path, pipelines_path: project_pipelines_path(@project) } }
+ #pipeline-schedules-app{ data: { full_path: @project.full_path, pipelines_path: project_pipelines_path(@project), new_schedule_path: new_project_pipeline_schedule_path(@project) } }
- else
.top-area
- schedule_path_proc = ->(scope) { pipeline_schedules_path(@project, scope: scope) }
@@ -14,8 +14,8 @@
- if can?(current_user, :create_pipeline_schedule, @project)
.nav-controls
- = link_to new_project_pipeline_schedule_path(@project), class: 'btn gl-button btn-confirm' do
- %span= _('New schedule')
+ = link_button_to new_project_pipeline_schedule_path(@project), variant: :confirm do
+ = _('New schedule')
- if @schedules.present?
%ul.content-list
diff --git a/app/views/projects/pipeline_schedules/new.html.haml b/app/views/projects/pipeline_schedules/new.html.haml
index 2d4ed5a9872..ef99a79b06f 100644
--- a/app/views/projects/pipeline_schedules/new.html.haml
+++ b/app/views/projects/pipeline_schedules/new.html.haml
@@ -9,6 +9,6 @@
= _("Schedule a new pipeline")
- if Feature.enabled?(:pipeline_schedules_vue, @project)
- #pipeline-schedules-form-new{ data: { full_path: @project.full_path, cron: @schedule.cron, daily_limit: @schedule.daily_limit, timezone_data: timezone_data.to_json, cron_timezone: @schedule.cron_timezone, project_id: @project.id, default_branch: @project.default_branch, settings_link: project_settings_ci_cd_path(@project), } }
+ #pipeline-schedules-form-new{ data: js_pipeline_schedules_form_data(@project, @schedule) }
- else
= render "form"
diff --git a/app/views/projects/pipelines/_info.html.haml b/app/views/projects/pipelines/_info.html.haml
deleted file mode 100644
index 753bb77e755..00000000000
--- a/app/views/projects/pipelines/_info.html.haml
+++ /dev/null
@@ -1,75 +0,0 @@
-- if @pipeline.name
- .gl-border-t.gl-p-5.gl-px-0
- %h3.gl-m-0.gl-text-body
- = @pipeline.name
-- else
- .commit-box
- %h3.commit-title
- = markdown(commit.title, pipeline: :single_line)
- - if commit.description.present?
- %pre.commit-description<
- = preserve(markdown(commit.description, pipeline: :single_line))
-
-.info-well
- .well-segment.pipeline-info{ class: "gl-align-items-baseline! gl-flex-direction-column" }
- %div
- .icon-container
- = sprite_icon('clock', css_class: 'gl-top-0!')
- = n_('%d job', '%d jobs', @pipeline.total_size) % @pipeline.total_size
- = @pipeline.ref_text_legacy
- - if @pipeline.finished_at
- - duration = time_interval_in_words(@pipeline.duration)
- - queued_duration = time_interval_in_words(@pipeline.queued_duration)
- %span.gl-pl-7{ 'data-testid': 'pipeline-stats-text' }
- = render_if_exists 'projects/pipelines/pipeline_stats_text', duration: duration, pipeline: @pipeline, queued_duration: queued_duration
-
- - if has_pipeline_badges?(@pipeline)
- .well-segment
- .icon-container
- = sprite_icon('flag', css_class: 'gl-top-0!')
- - if @pipeline.schedule?
- = gl_badge_tag _('Scheduled'), { variant: :info, size: :sm }, { class: 'js-pipeline-url-scheduled', title: _('This pipeline was triggered by a schedule.') }
- - if @pipeline.child?
- - text = sprintf(s_('Pipelines|Child pipeline (%{link_start}parent%{link_end})'), { link_start: "<a href='#{pipeline_path(@pipeline.triggered_by_pipeline)}' class='text-underline'>", link_end: "</a>"}).html_safe
- = gl_badge_tag text, { variant: :info, size: :sm }, { class: 'js-pipeline-child has-tooltip', title: s_("Pipelines|This is a child pipeline within the parent pipeline") }
- - if @pipeline.latest?
- = gl_badge_tag s_('Pipelines|latest'), { variant: :success, size: :sm }, { class: 'js-pipeline-url-latest has-tooltip', title: _("Latest pipeline for the most recent commit on this branch") }
- - if @pipeline.merge_train_pipeline?
- = gl_badge_tag s_('Pipelines|merge train'), { variant: :info, size: :sm }, { class: 'js-pipeline-url-train has-tooltip', title: s_("Pipelines|This pipeline ran on the contents of this merge request combined with the contents of all other merge requests queued for merging into the target branch.") }
- - if @pipeline.has_yaml_errors?
- = gl_badge_tag s_('Pipelines|yaml invalid'), { variant: :danger, size: :sm }, { class: 'js-pipeline-url-yaml has-tooltip', title: @pipeline.yaml_errors }
- - if @pipeline.failure_reason?
- = gl_badge_tag s_('Pipelines|error'), { variant: :danger, size: :sm }, { class: 'js-pipeline-url-failure has-tooltip', title: @pipeline.failure_reason }
- - if @pipeline.auto_devops_source?
- - popover_title_text = html_escape(_('This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}')) % { b_open: '<b>'.html_safe, b_close: '</b>'.html_safe }
- - popover_content_url = help_page_path('topics/autodevops/index.md')
- - popover_content_text = _('Learn more about Auto DevOps')
- = gl_badge_tag s_('Pipelines|Auto DevOps'), { variant: :info, size: :sm }, { class: 'js-pipeline-url-autodevops', href: "#", tabindex: "0", role: "button", data: { container: 'body', toggle: 'popover', placement: 'top', html: 'true', triggers: 'focus', title: "<div class='gl-font-weight-normal gl-line-height-normal'>#{popover_title_text}</div>", content: "<a href='#{popover_content_url}' target='_blank' rel='noopener noreferrer nofollow'>#{popover_content_text}</a>" } }
- - if @pipeline.detached_merge_request_pipeline?
- = gl_badge_tag s_('Pipelines|merge request'), { variant: :info, size: :sm }, { class: 'js-pipeline-url-mergerequest has-tooltip', data: { qa_selector: 'merge_request_badge_tag' }, title: s_("Pipelines|This pipeline ran on the contents of this merge request's source branch, not the target branch.") }
- - if @pipeline.stuck?
- = gl_badge_tag s_('Pipelines|stuck'), { variant: :warning, size: :sm }, { class: 'js-pipeline-url-stuck has-tooltip' }
-
- .well-segment{ 'data-testid': 'commit-row' }
- .icon-container.commit-icon
- = sprite_icon('commit', css_class: 'gl-top-0!')
- - if @pipeline.name
- = markdown(commit.title, pipeline: :single_line)
- = clipboard_button(text: @pipeline.sha, title: _("Copy commit SHA"))
- = link_to commit.short_id, project_commit_path(@project, @pipeline.sha), class: "commit-sha"
- - else
- = link_to commit.short_id, project_commit_path(@project, @pipeline.sha), class: "commit-sha"
- = clipboard_button(text: @pipeline.sha, title: _("Copy commit SHA"))
-
- .well-segment.related-merge-request-info
- .icon-container
- = sprite_icon("git-merge", css_class: 'gl-top-0!')
- %span.related-merge-requests
- %span.js-truncated-mr-list
- = @pipeline.all_related_merge_request_text(limit: 1)
- - if @pipeline.has_many_merge_requests?
- = link_to("#", class: "js-toggle-mr-list") do
- %span.text-expander
- = sprite_icon('ellipsis_h', size: 12)
- %span.js-full-mr-list.hide
- = @pipeline.all_related_merge_request_text
diff --git a/app/views/projects/pipelines/show.html.haml b/app/views/projects/pipelines/show.html.haml
index 46e1cd07a17..bdf09e5356f 100644
--- a/app/views/projects/pipelines/show.html.haml
+++ b/app/views/projects/pipelines/show.html.haml
@@ -9,16 +9,10 @@
- add_page_startup_graphql_call('pipelines/get_pipeline_details', { projectPath: @project.full_path, iid: @pipeline.iid })
.js-pipeline-container{ data: { controller_action: "#{controller.action_name}" } }
- - if Feature.enabled?(:pipeline_details_header_vue, @project)
- #js-pipeline-details-header-vue{ data: js_pipeline_details_header_data(@project, @pipeline) }
- - else
- #js-pipeline-header-vue.pipeline-header-container{ data: { full_path: @project.full_path, graphql_resource_etag: graphql_etag_pipeline_path(@pipeline), pipeline_iid: @pipeline.iid, pipeline_id: @pipeline.id, pipelines_path: project_pipelines_path(@project) } }
+ #js-pipeline-details-header-vue{ data: js_pipeline_details_header_data(@project, @pipeline) }
= render_if_exists 'projects/pipelines/cc_validation_required_alert', pipeline: @pipeline
- - if @pipeline.commit.present? && !Feature.enabled?(:pipeline_details_header_vue, @project)
- = render "projects/pipelines/info", commit: @pipeline.commit
-
- if pipeline_has_errors
= render Pajamas::AlertComponent.new(title: s_('Pipelines|Unable to create pipeline'),
variant: :danger,
diff --git a/app/views/projects/project_templates/_template.html.haml b/app/views/projects/project_templates/_template.html.haml
index 9dde86f77b4..93c53fc99fc 100644
--- a/app/views/projects/project_templates/_template.html.haml
+++ b/app/views/projects/project_templates/_template.html.haml
@@ -8,7 +8,7 @@
.text-muted
= template.description
.controls.d-flex.align-items-center
- %a.btn.gl-button.btn-default.gl-mr-3{ href: template.preview, rel: 'noopener noreferrer', target: '_blank', data: { track_label: "template_preview", track_property: template.name, track_action: "click_button", track_value: "" } }
+ = render Pajamas::ButtonComponent.new(button_options: { class: 'gl-mr-3', data: { track_label: "template_preview", track_property: template.name, track_action: "click_button", track_value: "" }, rel: 'noopener noreferrer' }, href: template.preview, target: '_blank') do
= _("Preview")
%label.btn.gl-button.btn-confirm.template-button.choose-template.gl-mb-0{ for: template.name,
'data-testid': "use_template_#{template.name}" }
diff --git a/app/views/projects/protected_tags/shared/_index.html.haml b/app/views/projects/protected_tags/shared/_index.html.haml
index 11e09d843e0..a016ccf8656 100644
--- a/app/views/projects/protected_tags/shared/_index.html.haml
+++ b/app/views/projects/protected_tags/shared/_index.html.haml
@@ -8,7 +8,7 @@
= expanded ? _('Collapse') : _('Expand')
%p
= s_("ProtectedTag|Limit access to creating and updating tags.")
- = link_to s_("ProtectedTag|What are protected tags?"), help_page_path("user/project/protected_tags")
+ = link_to s_("ProtectedTag|What are protected tags?"), help_page_path("user/project/protected_tags")
.settings-content
%p
= s_("ProtectedTag|By default, protected tags restrict who can modify the tag.")
diff --git a/app/views/projects/protected_tags/shared/_protected_tag.html.haml b/app/views/projects/protected_tags/shared/_protected_tag.html.haml
index ed5b5b17942..4fe1c8bd3cb 100644
--- a/app/views/projects/protected_tags/shared/_protected_tag.html.haml
+++ b/app/views/projects/protected_tags/shared/_protected_tag.html.haml
@@ -19,4 +19,4 @@
- if can? current_user, :admin_project, @project
%td
- = link_to 'Unprotect', [@project, protected_tag, { update_section: 'js-protected-tags-settings' }], aria: { label: s_('ProtectedTags|Unprotect tag') }, data: { confirm: 'Tag will be writable for developers. Are you sure?', confirm_btn_variant: 'danger' }, method: :delete, class: 'gl-button btn btn-danger-secondary'
+ = link_button_to 'Unprotect', [@project, protected_tag, { update_section: 'js-protected-tags-settings' }], aria: { label: s_('ProtectedTags|Unprotect tag') }, data: { confirm: 'Tag will be writable for developers. Are you sure?', confirm_btn_variant: 'danger' }, method: :delete, variant: :danger, category: :secondary
diff --git a/app/views/projects/runners/_group_runners.html.haml b/app/views/projects/runners/_group_runners.html.haml
index d71bcd12e64..32a2e36c779 100644
--- a/app/views/projects/runners/_group_runners.html.haml
+++ b/app/views/projects/runners/_group_runners.html.haml
@@ -13,10 +13,10 @@
%br
%br
- if @project.group_runners_enabled?
- = link_to toggle_group_runners_project_runners_path(@project), class: 'btn gl-button btn-default', method: :post do
+ = link_button_to toggle_group_runners_project_runners_path(@project), method: :post do
= _('Disable group runners')
- else
- = link_to toggle_group_runners_project_runners_path(@project), class: 'btn gl-button btn-confirm-secondary', method: :post do
+ = link_button_to toggle_group_runners_project_runners_path(@project), method: :post, variant: :confirm, category: :secondary do
= _('Enable group runners')
&nbsp;
= _('for this project')
diff --git a/app/views/projects/runners/_project_runners.html.haml b/app/views/projects/runners/_project_runners.html.haml
index af8f39ce0ad..0f2f0c3f21c 100644
--- a/app/views/projects/runners/_project_runners.html.haml
+++ b/app/views/projects/runners/_project_runners.html.haml
@@ -3,26 +3,14 @@
.bs-callout.help-callout
%p= s_('Runners|These runners are assigned to this project.')
- - if Feature.enabled?(:create_runner_workflow_for_namespace, @project.namespace)
- - if can?(current_user, :create_runner, @project)
- = render Pajamas::ButtonComponent.new(href: new_project_runner_path(@project), variant: :confirm) do
- = s_('Runners|New project runner')
- .gl-display-inline
- #js-project-runner-registration-dropdown{ data: { registration_token: @project.runners_token, project_id: @project.id } }
- - else
- = _('Please contact an admin to create runners.')
- = link_to _('Learn more.'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'restrict-runner-registration-by-all-users-in-an-instance'), target: '_blank', rel: 'noopener noreferrer'
+ - if can?(current_user, :create_runner, @project)
+ = render Pajamas::ButtonComponent.new(href: new_project_runner_path(@project), variant: :confirm) do
+ = s_('Runners|New project runner')
+ .gl-display-inline
+ #js-project-runner-registration-dropdown{ data: { registration_token: @project.runners_token, project_id: @project.id } }
- else
- - if can?(current_user, :register_project_runners, @project)
- = render partial: 'ci/runner/how_to_setup_runner',
- locals: { registration_token: @project.runners_token,
- type: _('project'),
- reset_token_url: reset_registration_token_namespace_project_settings_ci_cd_path,
- project_path: @project.path_with_namespace,
- group_path: '' }
- - else
- = _('Please contact an admin to register runners.')
- = link_to _('Learn more.'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'restrict-runner-registration-by-all-users-in-an-instance'), target: '_blank', rel: 'noopener noreferrer'
+ = _('Please contact an admin to create runners.')
+ = link_to _('Learn more.'), help_page_path('administration/settings/continuous_integration', anchor: 'restrict-runner-registration-by-all-users-in-an-instance'), target: '_blank', rel: 'noopener noreferrer'
%hr
diff --git a/app/views/projects/runners/_runner.html.haml b/app/views/projects/runners/_runner.html.haml
index e517b37aae9..12432cd3484 100644
--- a/app/views/projects/runners/_runner.html.haml
+++ b/app/views/projects/runners/_runner.html.haml
@@ -13,19 +13,16 @@
.gl-ml-2
.btn-group.btn-group-sm
- if @project_runners.include?(runner)
- = link_to edit_project_runner_path(@project, runner), class: 'btn gl-button btn-icon', title: _('Edit'), aria: { label: _('Edit') }, data: { testid: 'edit-runner-link', toggle: 'tooltip', placement: 'top', container: 'body' } do
- = sprite_icon('pencil')
+ = link_button_to nil, edit_project_runner_path(@project, runner), title: _('Edit'), aria: { label: _('Edit') }, data: { testid: 'edit-runner-link', toggle: 'tooltip', placement: 'top', container: 'body' }, icon: 'pencil'
- if runner.active?
- = link_to pause_project_runner_path(@project, runner), method: :post, class: 'btn gl-button btn-icon', title: s_('Runners|Pause from accepting jobs'), aria: { label: _('Pause') }, data: { toggle: 'tooltip', container: 'body', confirm: _("Are you sure?") } do
- = sprite_icon('pause')
+ = link_button_to nil, pause_project_runner_path(@project, runner), method: :post, title: s_('Runners|Pause from accepting jobs'), aria: { label: _('Pause') }, data: { toggle: 'tooltip', container: 'body', confirm: _("Are you sure?") }, icon: 'pause'
- else
- = link_to resume_project_runner_path(@project, runner), method: :post, class: 'btn gl-button btn-icon', title: s_('Runners|Resume accepting jobs'), aria: { label: _('Resume') }, data: { toggle: 'tooltip', container: 'body' } do
- = sprite_icon('play')
+ = link_button_to nil, resume_project_runner_path(@project, runner), method: :post, title: s_('Runners|Resume accepting jobs'), aria: { label: _('Resume') }, data: { toggle: 'tooltip', container: 'body' }, icon: 'play'
- if runner.belongs_to_one_project?
- = link_to _('Remove runner'), project_runner_path(@project, runner), aria: { label: _('Remove') }, data: { confirm: _("Are you sure?"), 'confirm-btn-variant': 'danger' }, method: :delete, class: 'btn gl-button btn-danger'
+ = link_button_to _('Remove runner'), project_runner_path(@project, runner), aria: { label: _('Remove') }, data: { confirm: _("Are you sure?"), 'confirm-btn-variant': 'danger' }, method: :delete, variant: :danger
- else
- runner_project = @project.runner_projects.find_by(runner_id: runner) # rubocop: disable CodeReuse/ActiveRecord
- = link_to _('Disable for this project'), project_runner_project_path(@project, runner_project), aria: { label: _('Disable') }, data: { confirm: _("Are you sure?"), 'confirm-btn-variant': 'danger' }, method: :delete, class: 'btn gl-button btn-danger'
+ = link_button_to _('Disable for this project'), project_runner_project_path(@project, runner_project), aria: { label: _('Disable') }, data: { confirm: _("Are you sure?"), 'confirm-btn-variant': 'danger' }, method: :delete, variant: :danger
- elsif runner.project_type?
= form_for [@project, @project.runner_projects.new] do |f|
= f.hidden_field :runner_id, value: runner.id
diff --git a/app/views/projects/settings/_archive.html.haml b/app/views/projects/settings/_archive.html.haml
index 70e14eadaf9..05685c26ac5 100644
--- a/app/views/projects/settings/_archive.html.haml
+++ b/app/views/projects/settings/_archive.html.haml
@@ -9,14 +9,10 @@
- if @project.archived?
- link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/project/settings/index', anchor: 'unarchive-a-project') }
%p= _("Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}").html_safe % { strong_start: '<strong>'.html_safe, strong_end: '</strong>'.html_safe, link_start: link_start, link_end: '</a>'.html_safe }
- = link_to _('Unarchive project'), unarchive_project_path(@project),
- aria: { label: _('Unarchive project') },
- data: { confirm: _("Are you sure that you want to unarchive this project?"), qa_selector: 'unarchive_project_link' },
- method: :post, class: "gl-button btn btn-confirm"
+ = render Pajamas::ButtonComponent.new(method: :post, href: unarchive_project_path(@project), variant: :confirm, button_options: { aria: { label: _('Unarchive project') }, data: { confirm: _("Are you sure that you want to unarchive this project?"), qa_selector: 'unarchive_project_link' } }) do
+ = _('Unarchive project')
- else
- link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/project/settings/index', anchor: 'archive-a-project') }
%p= _("Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}").html_safe % { strong_start: '<strong>'.html_safe, strong_end: '</strong>'.html_safe, link_start: link_start, link_end: '</a>'.html_safe }
- = link_to _('Archive project'), archive_project_path(@project),
- aria: { label: _('Archive project') },
- data: { confirm: _("Are you sure that you want to archive this project?"), qa_selector: 'archive_project_link', 'confirm-btn-variant': 'confirm' },
- method: :post, class: "gl-button btn btn-confirm"
+ = render Pajamas::ButtonComponent.new(method: :post, href: archive_project_path(@project), variant: :confirm, button_options: { aria: { label: _('Archive project') }, data: { confirm: _("Are you sure that you want to archive this project?"), qa_selector: 'archive_project_link', 'confirm-btn-variant': 'confirm' } }) do
+ = _('Archive project')
diff --git a/app/views/projects/settings/_general.html.haml b/app/views/projects/settings/_general.html.haml
index 847f9ad3e2a..f5c275827fc 100644
--- a/app/views/projects/settings/_general.html.haml
+++ b/app/views/projects/settings/_general.html.haml
@@ -35,6 +35,6 @@
= render 'shared/choose_avatar_button', f: f
- if @project.avatar?
%hr
- = link_to _('Remove avatar'), project_avatar_path(@project), aria: { label: _('Remove avatar') }, data: { confirm: _('Avatar will be removed. Are you sure?'), 'confirm-btn-variant': 'danger' }, method: :delete, class: 'gl-button btn btn-danger-secondary'
+ = link_button_to _('Remove avatar'), project_avatar_path(@project), aria: { label: _('Remove avatar') }, data: { confirm: _('Avatar will be removed. Are you sure?'), 'confirm-btn-variant': 'danger' }, method: :delete, variant: :danger, category: :secondary
= f.submit _('Save changes'), pajamas_button: true, class: "gl-mt-6", data: { qa_selector: 'save_naming_topics_avatar_button' }
diff --git a/app/views/projects/settings/access_tokens/index.html.haml b/app/views/projects/settings/access_tokens/index.html.haml
index df517b5d642..e4af6d59cad 100644
--- a/app/views/projects/settings/access_tokens/index.html.haml
+++ b/app/views/projects/settings/access_tokens/index.html.haml
@@ -4,31 +4,28 @@
- type_plural = _('project access tokens')
- @force_desktop_expanded_sidebar = true
-.row.gl-mt-3.js-search-settings-section
- .col-lg-4
- %h4.gl-mt-0
- = page_title
- %p
- - link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/project/settings/project_access_tokens') }
+.gl-mt-5.js-search-settings-section
+ %h4.gl-my-0
+ = page_title
+ %p.gl-text-secondary
+ - help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/project/settings/project_access_tokens') }
- if current_user.can?(:create_resource_access_tokens, @project)
= _('Generate project access tokens scoped to this project for your applications that need access to the GitLab API.')
- %p
- = _('You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}').html_safe % { link_start: link_start, link_end: '</a>'.html_safe }
+ = _('You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}').html_safe % { link_start: help_link_start, link_end: '</a>'.html_safe }
- else
- = _('Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}').html_safe % { link_start: link_start, link_end: '</a>'.html_safe }
- %p
+ = _('Project access token creation is disabled in this group.')
- root_group = @project.group.root_ancestor
- if current_user.can?(:admin_group, root_group)
- group_settings_link = edit_group_path(root_group)
- link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: group_settings_link }
= _('You can enable project access token creation in %{link_start}group settings%{link_end}.').html_safe % { link_start: link_start, link_end: '</a>'.html_safe }
+ = html_escape(_('You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}')) % { link_start: help_link_start, link_end: '</a>'.html_safe }
- .col-lg-8
- #js-new-access-token-app{ data: { access_token_type: type } }
+ #js-new-access-token-app{ data: { access_token_type: type } }
- - if current_user.can?(:create_resource_access_tokens, @project)
- = render_if_exists 'projects/settings/access_tokens/form',
- type: type
+ - if current_user.can?(:create_resource_access_tokens, @project)
+ = render_if_exists 'projects/settings/access_tokens/form',
+ type: type
- #js-access-token-table-app{ data: { access_token_type: type, access_token_type_plural: type_plural, initial_active_access_tokens: @active_access_tokens.to_json, no_active_tokens_message: _('This project has no active access tokens.'), show_role: true
+ #js-access-token-table-app{ data: { access_token_type: type, access_token_type_plural: type_plural, initial_active_access_tokens: @active_access_tokens.to_json, no_active_tokens_message: _('This project has no active access tokens.'), show_role: true
} }
diff --git a/app/views/projects/settings/ci_cd/_form.html.haml b/app/views/projects/settings/ci_cd/_form.html.haml
index 6f64d3f3f76..6eccbd245af 100644
--- a/app/views/projects/settings/ci_cd/_form.html.haml
+++ b/app/views/projects/settings/ci_cd/_form.html.haml
@@ -75,7 +75,7 @@
= f.number_field :max_artifacts_size, class: 'form-control gl-form-input'
%p.form-text.text-muted
= _("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'
+ = link_to sprite_icon('question-o'), help_page_path('administration/settings/continuous_integration', anchor: 'maximum-artifacts-size'), target: '_blank', rel: 'noopener noreferrer'
= f.submit _('Save changes'), pajamas_button: true
diff --git a/app/views/projects/settings/ci_cd/show.html.haml b/app/views/projects/settings/ci_cd/show.html.haml
index c7bb6a7f5da..007169809c9 100644
--- a/app/views/projects/settings/ci_cd/show.html.haml
+++ b/app/views/projects/settings/ci_cd/show.html.haml
@@ -33,12 +33,13 @@
= render_if_exists 'projects/settings/ci_cd/protected_environments', expanded: expanded
-%section.settings.no-animate#js-runners-settings{ class: ('expanded' if expanded || params[:expand_runners]), data: { qa_selector: 'runners_settings_content' } }
+- expand_runners = expanded || params[:expand_runners]
+%section.settings.no-animate#js-runners-settings{ class: ('expanded' if expand_runners), data: { qa_selector: 'runners_settings_content' } }
.settings-header
%h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _("Runners")
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
- = expanded ? _('Collapse') : _('Expand')
+ = expand_runners ? _('Collapse') : _('Expand')
%p
= _("Runners are processes that pick up and execute CI/CD jobs for GitLab.")
= link_to s_('What is GitLab Runner?'), 'https://docs.gitlab.com/runner/', target: '_blank', rel: 'noopener noreferrer'
diff --git a/app/views/projects/settings/slacks/edit.html.haml b/app/views/projects/settings/slacks/edit.html.haml
index 867b90655e3..537ae767b1d 100644
--- a/app/views/projects/settings/slacks/edit.html.haml
+++ b/app/views/projects/settings/slacks/edit.html.haml
@@ -17,4 +17,4 @@
.footer-block.row-content-block
= form.submit _('Save changes'), pajamas_button: true
&nbsp;
- = link_to _('Cancel'), edit_project_settings_integration_path(@project, @service), class: 'btn gl-button btn-cancel'
+ = link_button_to _('Cancel'), edit_project_settings_integration_path(@project, @service)
diff --git a/app/views/projects/snippets/index.html.haml b/app/views/projects/snippets/index.html.haml
index 7c936c849d0..ae9a8307eb9 100644
--- a/app/views/projects/snippets/index.html.haml
+++ b/app/views/projects/snippets/index.html.haml
@@ -9,7 +9,7 @@
- if new_project_snippet_link.present?
.nav-controls
- = link_to _("New snippet"), new_project_snippet_link, class: "gl-button btn btn-confirm", title: _("New snippet")
+ = link_button_to _("New snippet"), new_project_snippet_link, title: _("New snippet"), variant: :confirm
= render 'shared/snippets/list'
- else
diff --git a/app/views/projects/tags/_edit_release_button.html.haml b/app/views/projects/tags/_edit_release_button.html.haml
index 9a6c18df2ca..42af8d4f59f 100644
--- a/app/views/projects/tags/_edit_release_button.html.haml
+++ b/app/views/projects/tags/_edit_release_button.html.haml
@@ -1,9 +1,8 @@
- release_btn_text = s_('TagsPage|Create release')
- release_btn_path = new_project_release_path(project, tag_name: tag.name)
- option_css_classes = local_assigns.fetch(:option_css_classes, '')
-- css_classes = "btn gl-button btn-default btn-icon btn-edit has-tooltip #{option_css_classes}"
- if release
- release_btn_text = s_('TagsPage|Edit release')
- release_btn_path = edit_project_release_path(project, release)
-= link_to release_btn_path, class: css_classes do
+= render Pajamas::ButtonComponent.new(href: release_btn_path, button_options: { class: option_css_classes }) do
= release_btn_text
diff --git a/app/views/projects/tags/index.html.haml b/app/views/projects/tags/index.html.haml
index fda797f3228..b0be748eb36 100644
--- a/app/views/projects/tags/index.html.haml
+++ b/app/views/projects/tags/index.html.haml
@@ -9,10 +9,9 @@
.nav-controls
#js-tags-sort-dropdown{ data: { filter_tags_path: filter_tags_path(search: @search, sort: @sort), sort_options: tags_sort_options_hash.to_json } }
- = link_to project_tags_path(@project, rss_url_options), title: _("Tags feed"), class: 'btn gl-button btn-default btn-icon has-tooltip gl-ml-auto' do
- = sprite_icon('rss', css_class: 'gl-icon')
+ = link_button_to nil, project_tags_path(@project, rss_url_options), title: _("Tags feed"), class: 'has-tooltip gl-ml-auto', icon: 'rss'
- if can?(current_user, :admin_tag, @project)
- = link_to new_project_tag_path(@project), class: 'btn gl-button btn-confirm', data: { qa_selector: "new_tag_button" } do
+ = link_button_to new_project_tag_path(@project), data: { qa_selector: "new_tag_button" }, variant: :confirm do
= s_('TagsPage|New tag')
= render_if_exists 'projects/commits/mirror_status'
diff --git a/app/views/projects/tags/show.html.haml b/app/views/projects/tags/show.html.haml
index 5127972c406..1649e56043e 100644
--- a/app/views/projects/tags/show.html.haml
+++ b/app/views/projects/tags/show.html.haml
@@ -45,10 +45,8 @@
= render partial: 'projects/commit/signature', object: @tag.signature
- if can?(current_user, :admin_tag, @project)
= render 'edit_release_button', tag: @tag, project: @project, release: @release
- = link_to project_tree_path(@project, @tag.name), class: 'btn btn-icon gl-button btn-default has-tooltip', title: s_('TagsPage|Browse files') do
- = sprite_icon('folder-open', css_class: 'gl-icon')
- = link_to project_commits_path(@project, @tag.name), class: 'btn btn-icon gl-button btn-default has-tooltip', title: s_('TagsPage|Browse commits') do
- = sprite_icon('history', css_class: 'gl-icon')
+ = link_button_to nil, project_tree_path(@project, @tag.name), class: 'has-tooltip', title: s_('TagsPage|Browse files'), icon: 'folder-open'
+ = link_button_to nil, project_commits_path(@project, @tag.name), class: 'has-tooltip', title: s_('TagsPage|Browse commits'), icon: 'history'
= render 'projects/buttons/download', project: @project, ref: @tag.name
- if can?(current_user, :admin_tag, @project)
= render 'projects/buttons/remove_tag', project: @project, tag: @tag
diff --git a/app/views/projects/tracing/index.html.haml b/app/views/projects/tracing/index.html.haml
new file mode 100644
index 00000000000..ae6608cf343
--- /dev/null
+++ b/app/views/projects/tracing/index.html.haml
@@ -0,0 +1,4 @@
+- page_title _('Tracing')
+
+#js-tracing{ data: { view_model: observability_tracing_view_model(@project) } }
+
diff --git a/app/views/protected_branches/shared/_protected_branch.html.haml b/app/views/protected_branches/shared/_protected_branch.html.haml
index c2a5dd8a9b0..69969b7f848 100644
--- a/app/views/protected_branches/shared/_protected_branch.html.haml
+++ b/app/views/protected_branches/shared/_protected_branch.html.haml
@@ -27,4 +27,4 @@
%span.has-tooltip{ data: { container: 'body' }, title: s_('ProtectedBranch|Inherited - This setting can be changed at the group level'), 'aria-hidden': 'true' }
= sprite_icon 'lock'
- else
- = link_to s_('ProtectedBranch|Unprotect'), [protected_branch_entity, protected_branch, { update_section: 'js-protected-branches-settings' }], disabled: local_assigns[:disabled], aria: { label: s_('ProtectedBranch|Unprotect branch') }, data: { confirm: s_('ProtectedBranch|Branch will be writable for developers. Are you sure?'), confirm_btn_variant: 'danger' }, method: :delete, class: "btn gl-button btn-danger btn-sm"
+ = link_button_to s_('ProtectedBranch|Unprotect'), [protected_branch_entity, protected_branch, { update_section: 'js-protected-branches-settings' }], disabled: local_assigns[:disabled], aria: { label: s_('ProtectedBranch|Unprotect branch') }, data: { confirm: s_('ProtectedBranch|Branch will be writable for developers. Are you sure?'), confirm_btn_variant: 'danger' }, method: :delete, variant: :danger, size: :small
diff --git a/app/views/registrations/welcome/show.html.haml b/app/views/registrations/welcome/show.html.haml
index 986bc53fd81..caaa209a702 100644
--- a/app/views/registrations/welcome/show.html.haml
+++ b/app/views/registrations/welcome/show.html.haml
@@ -8,6 +8,7 @@
= render "layouts/one_trust"
= render "layouts/bizible"
= render "layouts/google_tag_manager_body"
+
.row.gl-flex-grow-1
.d-flex.gl-flex-direction-column.gl-align-items-center.gl-w-full.gl-px-5.gl-pb-5
.edit-profile.login-page.d-flex.flex-column.gl-align-items-center
diff --git a/app/views/search/results/_issuable.html.haml b/app/views/search/results/_issuable.html.haml
index 188ead4008e..a896cbc5cba 100644
--- a/app/views/search/results/_issuable.html.haml
+++ b/app/views/search/results/_issuable.html.haml
@@ -1,4 +1,4 @@
-%div{ class: 'search-result-row gl-display-flex gl-sm-flex-direction-row gl-flex-direction-column gl-align-items-center gl-pb-3! gl-mt-5 gl-mb-0!' }
+%div{ class: 'search-result-row gl-display-flex gl-sm-flex-direction-row gl-flex-direction-column gl-align-items-center gl-pb-5! gl-mt-5 gl-mb-0!' }
.col-sm-9
%span.gl-display-flex.gl-align-items-center
= gl_badge_tag issuable_state_text(issuable), variant: issuable_state_to_badge_class(issuable), size: :sm
@@ -11,6 +11,11 @@
= sprintf(s_('created %{issuable_created} by %{author}'), { issuable_created: time_ago_with_tooltip(issuable.created_at, placement: 'bottom'), author: link_to_member(@project, issuable.author, avatar: false) }).html_safe
.description.term.gl-px-0
= highlight_and_truncate_issuable(issuable, @search_term, @search_highlight)
+ - if issuable.labels.any?
+ .gl-mt-3
+ - presented_labels_sorted_by_title(issuable.labels, issuable.project).each do |label|
+ = link_to_label(label, small: true)
+
.col-sm-3.gl-mt-3.gl-sm-mt-0.gl-text-right
- if issuable.respond_to?(:upvotes_count) && issuable.upvotes_count > 0
%li.gl-list-style-none
diff --git a/app/views/search/results/_wiki_blob.html.haml b/app/views/search/results/_wiki_blob.html.haml
index d6900c397a0..08d8ffcf250 100644
--- a/app/views/search/results/_wiki_blob.html.haml
+++ b/app/views/search/results/_wiki_blob.html.haml
@@ -1,9 +1,6 @@
-- project = wiki_blob.project
-- wiki_blob_link = project_wiki_path(project, wiki_blob.basename)
-
%div{ class: 'search-result-row gl-pb-3! gl-mt-5 gl-mb-0!' }
%span.gl-display-flex.gl-align-items-center
- = link_to wiki_blob_link, data: { track_action: 'click_text', track_label: "wiki_title", track_property: 'search_result' }, class: 'gl-w-full' do
+ = link_to wiki_blob_link(wiki_blob), data: { track_action: 'click_text', track_label: "wiki_title", track_property: 'search_result' }, class: 'gl-w-full' do
%span.term.str-truncated.gl-font-weight-bold= ::Wiki.canonicalize_filename(wiki_blob.path)
.description.term.col-sm-10.gl-px-0
= simple_search_highlight_and_truncate(wiki_blob.data, @search_term)
diff --git a/app/views/sent_notifications/unsubscribe.html.haml b/app/views/sent_notifications/unsubscribe.html.haml
index 03b030eb257..16e4ff4d17f 100644
--- a/app/views/sent_notifications/unsubscribe.html.haml
+++ b/app/views/sent_notifications/unsubscribe.html.haml
@@ -16,4 +16,4 @@
%p
= link_to _('Unsubscribe'), unsubscribe_sent_notification_path(@sent_notification, force: true),
class: 'gl-button btn btn-confirm gl-mr-3'
- = link_to _('Cancel'), new_user_session_path, class: 'gl-button btn gl-mr-3'
+ = link_button_to _('Cancel'), new_user_session_path, class: 'gl-mr-3'
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 f4af3ea70d4..79a9bafc4f0 100644
--- a/app/views/shared/_auto_devops_implicitly_enabled_banner.html.haml
+++ b/app/views/shared/_auto_devops_implicitly_enabled_banner.html.haml
@@ -8,5 +8,5 @@
%div
= _('Container registry is not enabled on this GitLab instance. Ask an administrator to enable it in order for Auto DevOps to work.')
- c.with_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'
+ = link_button_to _('Settings'), project_settings_ci_cd_path(project), class: 'alert-link', variant: :confirm
+ = link_button_to _('More information'), help_page_path('topics/autodevops/index.md'), target: '_blank', class: 'alert-link gl-ml-3'
diff --git a/app/views/shared/_md_preview.html.haml b/app/views/shared/_md_preview.html.haml
index dd3a31f5a59..1fd430527a1 100644
--- a/app/views/shared/_md_preview.html.haml
+++ b/app/views/shared/_md_preview.html.haml
@@ -1,4 +1,5 @@
- referenced_users = local_assigns.fetch(:referenced_users, nil)
+- supports_quick_actions = local_assigns.fetch(:supports_quick_actions, false)
- if @merge_request&.discussion_locked?
.issuable-note-warning
@@ -8,14 +9,14 @@
= _('Only project members can comment.')
.md-area.position-relative
- .md-header.gl-bg-gray-50.gl-px-2.gl-rounded-base.gl-mx-2.gl-mt-2
+ .md-header.gl-px-3.gl-rounded-top-base.gl-border-b.gl-border-gray-100
.gl-display-flex.gl-align-items-center.gl-flex-wrap.gl-justify-content-space-between
- .md-header-toolbar.gl-display-flex.gl-py-2.gl-flex-wrap
- = render 'shared/blob/markdown_buttons'
- .switch-preview.gl-py-2.gl-display-flex.gl-align-items-center.gl-ml-auto
+ .md-header-toolbar.gl-display-flex.gl-py-3.gl-flex-wrap.gl-row-gap-3
= render Pajamas::ButtonComponent.new(category: :tertiary, size: :small, button_options: { class: 'js-md-preview-button', value: 'preview' }) do
= _('Preview')
- = render Pajamas::ButtonComponent.new(icon: 'maximize', category: :tertiary, size: :small, button_options: { 'tabindex': -1, 'aria-label': _("Go full screen"), class: 'has-tooltip js-zen-enter gl-ml-2', data: { container: 'body' } })
+ = render 'shared/blob/markdown_buttons', supports_quick_actions: supports_quick_actions
+ .full-screen
+ = render Pajamas::ButtonComponent.new(icon: 'maximize', category: :tertiary, size: :small, button_options: { 'tabindex': -1, 'aria-label': _("Go full screen"), class: 'has-tooltip js-zen-enter', data: { container: 'body' } })
.md-write-holder
= yield
diff --git a/app/views/shared/_new_merge_request_checkbox.html.haml b/app/views/shared/_new_merge_request_checkbox.html.haml
index fb3dfba2691..b84efd2d577 100644
--- a/app/views/shared/_new_merge_request_checkbox.html.haml
+++ b/app/views/shared/_new_merge_request_checkbox.html.haml
@@ -2,7 +2,8 @@
- nonce = SecureRandom.hex
= render Pajamas::CheckboxTagComponent.new(name: 'create_merge_request',
checked: true,
- checkbox_options: { class: 'js-create-merge-request', id: "create_merge_request-#{nonce}" }) do |c|
+ checkbox_options: { class: 'js-create-merge-request', id: "create_merge_request-#{nonce}" },
+ label_options: { for: "create_merge_request-#{nonce}" }) do |c|
- c.with_label do
- translation_variables = { new_merge_request: "<strong>#{_('new merge request')}</strong>" }
- translation = _('Start a %{new_merge_request} with these changes') % translation_variables
diff --git a/app/views/shared/_no_ssh.html.haml b/app/views/shared/_no_ssh.html.haml
index e9c0858e090..a3f24da5d7c 100644
--- a/app/views/shared/_no_ssh.html.haml
+++ b/app/views/shared/_no_ssh.html.haml
@@ -5,5 +5,5 @@
- c.with_body do
= s_("MissingSSHKeyWarningLink|You can't push or pull repositories using SSH until you add an SSH key to your profile.")
- c.with_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'
+ = link_button_to s_('MissingSSHKeyWarningLink|Add SSH key'), profile_keys_path, class: 'gl-alert-action', variant: :confirm
+ = link_button_to s_("MissingSSHKeyWarningLink|Don't show again"), profile_path(user: { hide_no_ssh_key: true }), method: :put, role: 'button', class: 'gl-alert-action'
diff --git a/app/views/shared/_project_limit.html.haml b/app/views/shared/_project_limit.html.haml
index ce49193e27b..a99db32c40e 100644
--- a/app/views/shared/_project_limit.html.haml
+++ b/app/views/shared/_project_limit.html.haml
@@ -5,5 +5,5 @@
- c.with_body do
= _("You won't be able to create new projects because you have reached your project limit.")
- c.with_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'
+ = link_button_to _('Remind later'), '#', class: 'alert-link hide-project-limit-message', variant: :confirm
+ = link_button_to _("Don't show again"), profile_path(user: {hide_project_limit: true}), method: :put, class: 'alert-link gl-ml-3'
diff --git a/app/views/shared/_prometheus_configuration_banner.html.haml b/app/views/shared/_prometheus_configuration_banner.html.haml
index 2d948cf28a6..7469260a997 100644
--- a/app/views/shared/_prometheus_configuration_banner.html.haml
+++ b/app/views/shared/_prometheus_configuration_banner.html.haml
@@ -17,11 +17,11 @@
.col-sm-10
%p.text-success.gl-mt-3
= s_('PrometheusService|You have a cluster with the Prometheus integration enabled.')
- = link_to s_('PrometheusService|Manage clusters'), project_clusters_path(project), class: 'btn gl-button btn-default'
+ = link_button_to s_('PrometheusService|Manage clusters'), project_clusters_path(project)
- else
.col-sm-2
= image_tag 'illustrations/monitoring/loading.svg'
.col-sm-10
%p.gl-mt-3
= s_('PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters.')
- = link_to s_('PrometheusService|Manage clusters'), project_clusters_path(project), class: 'btn gl-button btn-confirm'
+ = link_button_to s_('PrometheusService|Manage clusters'), project_clusters_path(project), variant: :confirm
diff --git a/app/views/shared/_registration_features_discovery_message.html.haml b/app/views/shared/_registration_features_discovery_message.html.haml
index 053c511830c..6e386866dfb 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('user/admin_area/settings/usage_statistics.md', anchor: 'registration-features-program')
+- registration_features_docs_path = help_page_path('administration/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/_remote_mirror_update_button.html.haml b/app/views/shared/_remote_mirror_update_button.html.haml
index bc80ebe3950..fa5c862b768 100644
--- a/app/views/shared/_remote_mirror_update_button.html.haml
+++ b/app/views/shared/_remote_mirror_update_button.html.haml
@@ -3,5 +3,4 @@
button_options: { class: 'disabled', title: _('Updating'), data: { toggle: 'tooltip', container: 'body' } },
icon_classes: 'spin')
- elsif remote_mirror.enabled?
- = link_to update_now_project_mirror_path(@project, sync_remote: true), method: :post, class: "btn btn-icon gl-button rspec-update-now-button", data: { toggle: 'tooltip', container: 'body', qa_selector: 'update_now_button' }, title: _('Update now') do
- = sprite_icon("retry")
+ = link_button_to nil, update_now_project_mirror_path(@project, sync_remote: true), method: :post, class: 'rspec-update-now-button', data: { toggle: 'tooltip', container: 'body', qa_selector: 'update_now_button' }, title: _('Update now'), icon: 'retry'
diff --git a/app/views/shared/_service_ping_consent.html.haml b/app/views/shared/_service_ping_consent.html.haml
index 108d846e3ee..e0313710736 100644
--- a/app/views/shared/_service_ping_consent.html.haml
+++ b/app/views/shared/_service_ping_consent.html.haml
@@ -1,11 +1,14 @@
- if session[:ask_for_usage_stats_consent]
= render Pajamas::AlertComponent.new(alert_options: { class: 'service-ping-consent-message' }) do |c|
- c.with_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 }
+ - docs_link = link_to '', help_page_path('user/admin_area/settings/usage_statistics.md'), class: 'gl-link'
+ - settings_link = link_to '', metrics_and_profiling_admin_application_settings_path(anchor: 'js-usage-settings'), class: 'gl-link'
+ = safe_format s_('ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}.'), tag_pair(docs_link, :link_start, :link_end)
+ = safe_format s_('ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}.'), tag_pair(settings_link, :link_start, :link_end)
- c.with_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-confirm'
- = link_to _("Don't send service data"), not_now_path, 'data-url' => admin_application_settings_path, method: :put, 'data-check-enabled': false, 'data-service-ping-enabled': false, class: 'js-service-ping-consent-action alert-link btn gl-button btn-default gl-ml-3'
+ = render Pajamas::ButtonComponent.new(href: send_service_data_path, method: :put, variant: :confirm, button_options: { 'data-url' => admin_application_settings_path, 'data-check-enabled': true, 'data-service-ping-enabled': true, class: 'js-service-ping-consent-action alert-link' }) do
+ = _('Send service data')
+ = render Pajamas::ButtonComponent.new(href: not_now_path, method: :put, button_options: { 'data-url' => admin_application_settings_path, 'data-check-enabled': false, 'data-service-ping-enabled': false, class: 'js-service-ping-consent-action alert-link gl-ml-3' }) do
+ = _("Don't send service data")
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 290152d5803..e372dbd983c 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
@@ -8,5 +8,5 @@
= 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'
- c.with_actions do
- = link_to profile_two_factor_auth_path, class: 'deferred-link btn gl-alert-action btn-confirm btn-md gl-button' do
+ = link_button_to profile_two_factor_auth_path, class: 'deferred-link gl-alert-action', variant: :confirm do
= s_('Profiles|Manage two-factor authentication')
diff --git a/app/views/shared/access_tokens/_form.html.haml b/app/views/shared/access_tokens/_form.html.haml
index ac359d37c49..54af364aca3 100644
--- a/app/views/shared/access_tokens/_form.html.haml
+++ b/app/views/shared/access_tokens/_form.html.haml
@@ -7,36 +7,27 @@
- access_levels = local_assigns.fetch(:access_levels, false)
- default_access_level = local_assigns.fetch(:default_access_level, false)
-%h5.gl-mt-0
+%h5.gl-font-lg.gl-mt-0
= title
-%p.profile-settings-content
- = s_("AccessTokens|Enter the name of your application, and we'll return a unique %{type}.") % { type: type }
= gitlab_ui_form_for token, as: prefix, url: path, method: :post, html: { id: 'js-new-access-token-form', class: 'js-requires-input' }, remote: ajax do |f|
-
= form_errors(token)
- .row
- .form-group.col
- .row
- = f.label :name, s_('AccessTokens|Token name'), class: 'label-bold col-md-12'
- .col-md-6
- - resource_type = resource.is_a?(Group) ? "group" : "project"
- = f.text_field :name, class: 'form-control gl-form-input', required: true, data: { qa_selector: 'access_token_name_field' }, :'aria-describedby' => 'access_token_help_text'
- %span.form-text.text-muted.col-md-12#access_token_help_text= s_("AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members.") % { resource_type: resource_type }
+ .form-group
+ = f.label :name, s_('AccessTokens|Token name'), class: 'label-bold'
+ - resource_type = resource.is_a?(Group) ? "group" : "project"
+ = f.text_field :name, class: 'form-control gl-form-input gl-max-w-80', required: true, data: { qa_selector: 'access_token_name_field' }, :'aria-describedby' => 'access_token_help_text'
+ %span.form-text.text-muted#access_token_help_text= s_("AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members.") % { resource_type: resource_type }
- .row
- .col
- .js-access-tokens-expires-at{ data: expires_at_field_data }
- = f.text_field :expires_at, class: 'gl-datepicker-input form-control gl-form-input', placeholder: 'YYYY-MM-DD', autocomplete: 'off', data: { js_name: 'expiresAt' }
+ .js-access-tokens-expires-at{ data: expires_at_field_data }
+ = f.text_field :expires_at, class: 'gl-datepicker-input form-control gl-form-input', placeholder: 'YYYY-MM-DD', autocomplete: 'off', data: { js_name: 'expiresAt' }
- if resource
- .row
- .form-group.col-md-6
- = label_tag :access_level, s_("AccessTokens|Select a role"), class: "label-bold"
- .select-wrapper
- = select_tag :"#{prefix}[access_level]", options_for_select(access_levels, default_access_level), class: "form-control select-control", data: { qa_selector: 'access_token_access_level' }
- = sprite_icon('chevron-down', css_class: "gl-icon gl-absolute gl-top-3 gl-right-3 gl-text-gray-200")
+ .form-group
+ = label_tag :access_level, s_("AccessTokens|Select a role"), class: "label-bold"
+ .select-wrapper.gl-form-input-md
+ = select_tag :"#{prefix}[access_level]", options_for_select(access_levels, default_access_level), class: "form-control select-control", data: { qa_selector: 'access_token_access_level' }
+ = sprite_icon('chevron-down', css_class: "gl-icon gl-absolute gl-top-3 gl-right-3 gl-text-gray-200")
.form-group
%b{ :'aria-describedby' => 'select_scope_help_text' }
diff --git a/app/views/shared/blob/_markdown_buttons.html.haml b/app/views/shared/blob/_markdown_buttons.html.haml
index a3d3c1c8231..16bffaca810 100644
--- a/app/views/shared/blob/_markdown_buttons.html.haml
+++ b/app/views/shared/blob/_markdown_buttons.html.haml
@@ -1,32 +1,33 @@
- modifier_key = client_js_flags[:isMac] ? '⌘' : s_('KeyboardKey|Ctrl+')
- supports_file_upload = local_assigns.fetch(:supports_file_upload, true)
+- supports_quick_actions = local_assigns.fetch(:supports_quick_actions, false)
= markdown_toolbar_button({ icon: "bold",
- css_class: 'gl-mr-3',
+ css_class: 'haml-markdown-button gl-mr-3',
data: { "md-tag" => "**", "md-shortcuts": '["mod+b"]' },
title: sprintf(s_("MarkdownEditor|Add bold text (%{modifier_key}B)") % { modifier_key: modifier_key }) })
= markdown_toolbar_button({ icon: "italic",
- css_class: 'gl-mr-3',
+ css_class: 'haml-markdown-button gl-mr-3',
data: { "md-tag" => "_", "md-shortcuts": '["mod+i"]' },
title: sprintf(s_("MarkdownEditor|Add italic text (%{modifier_key}I)") % { modifier_key: modifier_key }) })
= markdown_toolbar_button({ icon: "strikethrough",
- css_class: 'gl-mr-3',
+ css_class: 'haml-markdown-button gl-mr-3',
data: { "md-tag" => "~~", "md-shortcuts": '["mod+shift+x"]' },
title: sprintf(s_("MarkdownEditor|Add strikethrough text (%{modifier_key}⇧X)") % { modifier_key: modifier_key }) })
-= markdown_toolbar_button({ icon: "quote", css_class: 'gl-mr-3', data: { "md-tag" => "> ", "md-prepend" => true }, title: _("Insert a quote") })
-= markdown_toolbar_button({ icon: "code", css_class: 'gl-mr-3', data: { "md-tag" => "`", "md-block" => "```" }, title: _("Insert code") })
+= markdown_toolbar_button({ icon: "quote", css_class: 'haml-markdown-button gl-mr-3', data: { "md-tag" => "> ", "md-prepend" => true }, title: _("Insert a quote") })
+= markdown_toolbar_button({ icon: "code", css_class: 'haml-markdown-button gl-mr-3', data: { "md-tag" => "`", "md-block" => "```" }, title: _("Insert code") })
= markdown_toolbar_button({ icon: "link",
- css_class: 'gl-mr-3',
+ css_class: 'haml-markdown-button gl-mr-3',
data: { "md-tag" => "[{text}](url)", "md-select" => "url", "md-shortcuts": '["mod+k"]' },
title: sprintf(s_("MarkdownEditor|Add a link (%{modifier_key}K)") % { modifier_key: modifier_key }) })
-= markdown_toolbar_button({ icon: "list-bulleted", css_class: 'gl-mr-3', data: { "md-tag" => "- ", "md-prepend" => true }, title: _("Add a bullet list") })
-= markdown_toolbar_button({ icon: "list-numbered", css_class: 'gl-mr-3', data: { "md-tag" => "1. ", "md-prepend" => true }, title: _("Add a numbered list") })
-= markdown_toolbar_button({ icon: "list-task", css_class: 'gl-mr-3', data: { "md-tag" => "- [ ] ", "md-prepend" => true }, title: _("Add a checklist") })
+= markdown_toolbar_button({ icon: "list-bulleted", css_class: 'haml-markdown-button gl-mr-3', data: { "md-tag" => "- ", "md-prepend" => true }, title: _("Add a bullet list") })
+= markdown_toolbar_button({ icon: "list-numbered", css_class: 'haml-markdown-button gl-mr-3', data: { "md-tag" => "1. ", "md-prepend" => true }, title: _("Add a numbered list") })
+= markdown_toolbar_button({ icon: "list-task", css_class: 'haml-markdown-button gl-mr-3', data: { "md-tag" => "- [ ] ", "md-prepend" => true }, title: _("Add a checklist") })
= markdown_toolbar_button({ icon: "list-indent",
css_class: 'gl-display-none gl-mr-3',
data: { "md-command" => 'indentLines', "md-shortcuts": '["mod+]"]' },
@@ -36,9 +37,11 @@
data: { "md-command" => 'outdentLines', "md-shortcuts": '["mod+["]' },
title: sprintf(s_("MarkdownEditor|Outdent line (%{modifier_key}[)") % { modifier_key: modifier_key }) })
= markdown_toolbar_button({ icon: "details-block",
- css_class: 'gl-mr-3',
+ css_class: 'haml-markdown-button gl-mr-3',
data: { "md-tag" => "<details><summary>Click to expand</summary>\n{text}\n</details>", "md-prepend" => true, "md-select" => "Click to expand" },
title: _("Add a collapsible section") })
-= markdown_toolbar_button({ icon: "table", css_class: 'gl-mr-3', data: { "md-tag" => "| header | header |\n| ------ | ------ |\n| | |\n| | |", "md-prepend" => true }, title: _("Add a table") })
+= markdown_toolbar_button({ icon: "table", css_class: 'haml-markdown-button gl-mr-3', data: { "md-tag" => "| header | header |\n| ------ | ------ |\n| | |\n| | |", "md-prepend" => true }, title: _("Add a table") })
- if supports_file_upload
- = render Pajamas::ButtonComponent.new(icon: 'paperclip', category: :tertiary, size: :small, button_options: { 'aria-label': _("Attach a file or image"), class: 'has-tooltip js-attach-file-button gl-mr-3', data: { testid: 'button-attach-file', container: 'body' } })
+ = render Pajamas::ButtonComponent.new(icon: 'paperclip', category: :tertiary, size: :small, button_options: { 'aria-label': _("Attach a file or image"), class: 'has-tooltip js-attach-file-button haml-markdown-button gl-mr-3', data: { testid: 'button-attach-file', container: 'body' } })
+- if supports_quick_actions
+ = markdown_toolbar_button({ icon: "quick-actions", css_class: 'haml-markdown-button gl-mr-3', data: { "md-tag" => "/", "md-prepend" => true }, title: _("Add a quick action") })
diff --git a/app/views/shared/deploy_tokens/_form.html.haml b/app/views/shared/deploy_tokens/_form.html.haml
index 0f290f34a95..8821804ce6b 100644
--- a/app/views/shared/deploy_tokens/_form.html.haml
+++ b/app/views/shared/deploy_tokens/_form.html.haml
@@ -1,4 +1,4 @@
-%p.profile-settings-content
+%p
- group_deploy_tokens_help_link_url = help_page_path('user/project/deploy_tokens/index.md')
- 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 }
diff --git a/app/views/shared/deploy_tokens/_table.html.haml b/app/views/shared/deploy_tokens/_table.html.haml
index a7bf3bfb81e..3827ecf73a4 100644
--- a/app/views/shared/deploy_tokens/_table.html.haml
+++ b/app/views/shared/deploy_tokens/_table.html.haml
@@ -16,7 +16,7 @@
%tr
%td= token.name
%td= token.username
- %td= token.created_at.to_date.to_s(:medium)
+ %td= token.created_at.to_date.to_fs(:medium)
%td
- if token.expires?
%span{ class: ('text-warning' if token.expires_soon?) }
diff --git a/app/views/shared/doorkeeper/applications/_form.html.haml b/app/views/shared/doorkeeper/applications/_form.html.haml
index 628a34e1278..ae539c46cf1 100644
--- a/app/views/shared/doorkeeper/applications/_form.html.haml
+++ b/app/views/shared/doorkeeper/applications/_form.html.haml
@@ -1,4 +1,4 @@
-= gitlab_ui_form_for @application, url: url, html: { role: 'form', class: 'doorkeeper-app-form' } do |f|
+= gitlab_ui_form_for @application, url: url, html: { role: 'form', class: 'doorkeeper-app-form gl-max-w-80' } do |f|
= form_errors(@application)
.form-group
diff --git a/app/views/shared/doorkeeper/applications/_index.html.haml b/app/views/shared/doorkeeper/applications/_index.html.haml
index abfe3baf8b4..bf78f275d65 100644
--- a/app/views/shared/doorkeeper/applications/_index.html.haml
+++ b/app/views/shared/doorkeeper/applications/_index.html.haml
@@ -1,88 +1,86 @@
- @force_desktop_expanded_sidebar = true
-.row.gl-mt-3.js-search-settings-section
- .col-lg-4.profile-settings-sidebar
- %h4.gl-mt-0
- = page_title
- %p
- - if oauth_applications_enabled
- - if oauth_authorized_applications_enabled
- = _("Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account.")
- - else
- = _("Manage applications that use GitLab as an OAuth provider.")
- - else
- = _("Manage applications that you've authorized to use your account.")
- .col-lg-8
+.settings-section.js-search-settings-section
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0
+ = page_title
+ %p.gl-text-secondary
- if oauth_applications_enabled
- %h5.gl-mt-0
- = _('Add new application')
- = render 'shared/doorkeeper/applications/form', url: form_url
- %hr
+ - if oauth_authorized_applications_enabled
+ = _("Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account.")
+ - else
+ = _("Manage applications that use GitLab as an OAuth provider.")
- else
- .bs-callout.bs-callout-disabled
- = _('Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission')
- - if oauth_applications_enabled
- .oauth-applications
- %h5
- = _("Your applications (%{size})") % { size: @applications.size }
- - if @applications.any?
- .table-responsive
- %table.table
- %thead
- %tr
- %th= _('Name')
- %th= _('Callback URL')
- %th= _('Clients')
- %th.last-heading
- %tbody
- - @applications.each do |application|
- %tr{ id: "application_#{application.id}" }
- %td= link_to application.name, application_url.call(application)
- %td
- - application.redirect_uri.split.each do |uri|
- %div= uri
- %td= application.access_tokens.count
- %td.gl-display-flex
- = link_to edit_application_url.call(application), class: "gl-button btn btn-default btn-icon gl-mr-3" do
- %span.sr-only
- = _('Edit')
- = sprite_icon('pencil')
- = render 'shared/doorkeeper/applications/delete_form', path: application_url.call(application), small: true
- - else
- .settings-message.text-center
- = _("You don't have any applications")
- - if oauth_authorized_applications_enabled
- .oauth-authorized-applications.prepend-top-20.gl-mb-3
- - if oauth_applications_enabled
- %h5
- = _("Authorized applications (%{size})") % { size: @authorized_tokens.size }
+ = _("Manage applications that you've authorized to use your account.")
+ - if oauth_applications_enabled
+ %h5.gl-mt-0
+ = _('Add new application')
+ .gl-border-b.gl-pb-6
+ = render 'shared/doorkeeper/applications/form', url: form_url
+
+ - else
+ .bs-callout.bs-callout-disabled
+ = _('Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission')
+ - if oauth_applications_enabled
+ .oauth-applications.gl-pt-6
+ %h5.gl-mt-0
+ = _("Your applications (%{size})") % { size: @applications.size }
+ - if @applications.any?
+ .table-responsive
+ %table.table
+ %thead
+ %tr
+ %th= _('Name')
+ %th= _('Callback URL')
+ %th= _('Clients')
+ %th.last-heading
+ %tbody
+ - @applications.each do |application|
+ %tr{ id: "application_#{application.id}" }
+ %td= link_to application.name, application_url.call(application)
+ %td
+ - application.redirect_uri.split.each do |uri|
+ %div= uri
+ %td= application.access_tokens.count
+ %td.gl-display-flex
+ = link_button_to nil, edit_application_url.call(application), class: 'gl-mr-3', icon: 'pencil', 'aria-label': _('Edit')
+ = render 'shared/doorkeeper/applications/delete_form', path: application_url.call(application), small: true
+ - else
+ .settings-message
+ = _("You don't have any applications")
+ - if oauth_authorized_applications_enabled
+ .oauth-authorized-applications.gl-mt-4
+ - if oauth_applications_enabled
+ %h5.gl-mt-0
+ = _("Authorized applications (%{size})") % { size: @authorized_tokens.size }
- - if @authorized_tokens.any?
- .table-responsive
- %table.table.table-striped
- %thead
- %tr
- %th= _('Name')
- %th= _('Authorized At')
- %th= _('Scope')
- %th
- %tbody
- - @authorized_tokens.each do |token|
- %tr{ id: ("application_#{token.application.id}" if token.application) }
- %td
- - if token.application
- = token.application.name
- - else
- = _('Anonymous')
- .form-text.text-muted
- %em= _("Authorization was granted by entering your username and password in the application.")
- %td= token.created_at
- %td= token.scopes
- %td
- - if token.application
- = render 'doorkeeper/authorized_applications/delete_form', application: token.application
- - else
- = render 'doorkeeper/authorized_applications/delete_form', token: token
- - else
- .settings-message.text-center
- = _("You don't have any authorized applications")
+ - if @authorized_tokens.any?
+ .table-responsive
+ %table.table.table-striped
+ %thead
+ %tr
+ %th= _('Name')
+ %th= _('Authorized At')
+ %th= _('Scope')
+ %th
+ %tbody
+ - @authorized_tokens.each do |token|
+ %tr{ id: ("application_#{token.application.id}" if token.application) }
+ %td
+ - if token.application
+ = token.application.name
+ - else
+ = _('Anonymous')
+ .form-text.text-muted
+ %em= _("Authorization was granted by entering your username and password in the application.")
+ %td= token.created_at
+ %td= token.scopes
+ %td
+ - if token.application
+ = render 'doorkeeper/authorized_applications/delete_form', application: token.application
+ - else
+ = render 'doorkeeper/authorized_applications/delete_form', token: token
+ - else
+ .settings-message
+ = _("You don't have any authorized applications")
diff --git a/app/views/shared/doorkeeper/applications/_show.html.haml b/app/views/shared/doorkeeper/applications/_show.html.haml
index b9095e2a1a1..b075cece877 100644
--- a/app/views/shared/doorkeeper/applications/_show.html.haml
+++ b/app/views/shared/doorkeeper/applications/_show.html.haml
@@ -43,8 +43,8 @@
.form-actions.gl-display-flex.gl-justify-content-space-between
%div
- if @created
- = link_to _('Continue'), index_path, class: 'btn btn-confirm btn-md gl-button gl-mr-3'
- = link_to _('Edit'), edit_path, class: 'btn btn-default btn-md gl-button'
+ = link_button_to _('Continue'), index_path, class: 'gl-mr-3', variant: :confirm
+ = link_button_to _('Edit'), edit_path
= render 'shared/doorkeeper/applications/delete_form', path: delete_path
-# Create a hidden field to save the ID of application created
diff --git a/app/views/shared/empty_states/_issues.html.haml b/app/views/shared/empty_states/_issues.html.haml
index 387a83873b5..a4ea98a0fb7 100644
--- a/app/views/shared/empty_states/_issues.html.haml
+++ b/app/views/shared/empty_states/_issues.html.haml
@@ -19,7 +19,7 @@
= _("To widen your search, change or remove filters above")
- if show_new_issue_link?(@project)
.text-center
- = link_to _("New issue"), new_project_issue_path(@project), class: "gl-button btn btn-confirm"
+ = link_button_to _("New issue"), new_project_issue_path(@project), variant: :confirm
- elsif is_opened_state && opened_issues_count == 0 && closed_issues_count > 0
%h4.text-center
= _("There are no open issues")
@@ -27,7 +27,7 @@
= _("To keep this project going, create a new issue")
- if show_new_issue_link?(@project)
.text-center
- = link_to _("New issue"), new_project_issue_path(@project), class: "gl-button btn btn-confirm"
+ = link_button_to _("New issue"), new_project_issue_path(@project), variant: :confirm
- elsif is_closed_state && opened_issues_count > 0 && closed_issues_count == 0
%h4.text-center
= _("There are no closed issues")
@@ -39,7 +39,7 @@
- if button_path
.text-center
- if show_new_issue_link?(@project)
- = link_to _('New issue'), button_path, class: 'gl-button btn btn-confirm', id: 'new_issue_link'
+ = link_button_to _('New issue'), button_path, id: 'new_issue_link', variant: :confirm
- if show_import_button
.js-csv-import-export-buttons{ data: { show_import_button: 'true', issuable_type: 'issue', import_csv_issues_path: import_csv_namespace_project_issues_path, can_edit: can_edit.to_s, project_import_jira_path: project_import_jira_path(@project), max_attachment_size: number_to_human_size(Gitlab::CurrentSettings.max_attachment_size.megabytes) } }
@@ -59,4 +59,4 @@
%p
= _("The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project.")
.text-center
- = link_to _('Register / Sign In'), new_user_session_path, class: 'gl-button btn btn-confirm'
+ = link_button_to _('Register / Sign In'), new_user_session_path, variant: :confirm
diff --git a/app/views/shared/empty_states/_labels.html.haml b/app/views/shared/empty_states/_labels.html.haml
index da88c139a6e..4d2127c0161 100644
--- a/app/views/shared/empty_states/_labels.html.haml
+++ b/app/views/shared/empty_states/_labels.html.haml
@@ -8,7 +8,7 @@
%p= _("You can also star a label to make it a priority label.")
.text-center
- if can?(current_user, :admin_label, @project)
- = link_to _('New label'), new_project_label_path(@project), class: 'btn gl-button btn-confirm', title: _('New label'), id: 'new_label_link'
- = link_to _('Generate a default set of labels'), generate_project_labels_path(@project), method: :post, class: 'btn gl-button btn-confirm-secondary', title: _('Generate a default set of labels'), id: 'generate_labels_link'
+ = link_button_to _('New label'), new_project_label_path(@project), title: _('New label'), id: 'new_label_link', variant: :confirm
+ = link_button_to _('Generate a default set of labels'), generate_project_labels_path(@project), method: :post, title: _('Generate a default set of labels'), id: 'generate_labels_link', variant: :confirm, category: :secondary
- if can?(current_user, :admin_label, @group)
- = link_to _('New label'), new_group_label_path(@group), class: 'btn gl-button btn-confirm', title: _('New label'), id: 'new_label_link'
+ = link_button_to _('New label'), new_group_label_path(@group), title: _('New label'), id: 'new_label_link', variant: :confirm
diff --git a/app/views/shared/empty_states/_merge_requests.html.haml b/app/views/shared/empty_states/_merge_requests.html.haml
index 94589996c3a..5b377818c6e 100644
--- a/app/views/shared/empty_states/_merge_requests.html.haml
+++ b/app/views/shared/empty_states/_merge_requests.html.haml
@@ -18,7 +18,7 @@
= _("To widen your search, change or remove filters above")
.text-center
- if can_create_merge_request
- = link_to _("New merge request"), button_path || project_new_merge_request_path(@project), class: "gl-button btn btn-confirm", title: _("New merge request")
+ = link_button_to _("New merge request"), button_path || project_new_merge_request_path(@project), title: _("New merge request"), variant: :confirm
- elsif is_opened_state && opened_merged_count == 0 && closed_merged_count > 0
%h4.text-center
= _("There are no open merge requests")
@@ -26,7 +26,7 @@
= _("To keep this project going, create a new merge request")
.text-center
- if can_create_merge_request
- = link_to _("New merge request"), button_path || project_new_merge_request_path(@project), class: "gl-button btn btn-confirm", title: _("New merge request")
+ = link_button_to _("New merge request"), button_path || project_new_merge_request_path(@project), title: _("New merge request"), variant: :confirm
- elsif is_closed_state && opened_merged_count > 0 && closed_merged_count == 0
%h4.text-center
= _("There are no closed merge requests")
@@ -37,4 +37,4 @@
= _("Interested parties can even contribute by pushing commits if they want to.")
- if button_path
.text-center
- = 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" }
+ = link_button_to _('New merge request'), button_path, title: _('New merge request'), id: 'new_merge_request_link', data: { qa_selector: "new_merge_request_button" }, variant: :confirm
diff --git a/app/views/shared/empty_states/_priority_labels.html.haml b/app/views/shared/empty_states/_priority_labels.html.haml
index b24fa0b3bdb..688df1705aa 100644
--- a/app/views/shared/empty_states/_priority_labels.html.haml
+++ b/app/views/shared/empty_states/_priority_labels.html.haml
@@ -1,8 +1,8 @@
-.text-center.gl-mt-1.gl-mb-6
+.text-center.gl-mt-1.gl-mb-5
.svg-content{ data: { qa_selector: 'label_svg_content' } }
= image_tag 'illustrations/empty-state/empty-labels-starred-md.svg'
- if can?(current_user, :admin_label, @project)
- %div
+ %h5.gl-my-0
= _("No prioritized labels yet!")
- %div
+ %p.gl-text-secondary
= _("Star labels to start sorting by priority.")
diff --git a/app/views/shared/empty_states/_profile_tabs.html.haml b/app/views/shared/empty_states/_profile_tabs.html.haml
index c813fd691f1..ba5fbd90528 100644
--- a/app/views/shared/empty_states/_profile_tabs.html.haml
+++ b/app/views/shared/empty_states/_profile_tabs.html.haml
@@ -13,9 +13,9 @@
%p= current_user_empty_message_description
- if secondary_button_link.present?
- = link_to secondary_button_label, secondary_button_link, class: 'gl-button btn btn-confirm btn-inverted'
+ = link_button_to secondary_button_label, secondary_button_link, variant: :confirm, category: :secondary
- if primary_button_link.present?
- = link_to primary_button_label, primary_button_link, class: 'gl-button btn btn-confirm'
+ = link_button_to primary_button_label, primary_button_link, variant: :confirm
- else
%h5= visitor_empty_message
diff --git a/app/views/shared/empty_states/_snippets.html.haml b/app/views/shared/empty_states/_snippets.html.haml
index 87de756093d..6fe36d75453 100644
--- a/app/views/shared/empty_states/_snippets.html.haml
+++ b/app/views/shared/empty_states/_snippets.html.haml
@@ -12,7 +12,7 @@
= s_('SnippetsEmptyState|Store, share, and embed small pieces of code and text.')
.gl-mt-3<
- if button_path
- = link_to s_('SnippetsEmptyState|New snippet'), button_path, class: 'btn gl-button btn-confirm', title: s_('SnippetsEmptyState|New snippet'), id: 'new_snippet_link', data: { qa_selector: 'create_first_snippet_link' }
- = link_to s_('SnippetsEmptyState|Documentation'), help_page_path('user/snippets.md'), class: 'btn gl-button btn-default', title: s_('SnippetsEmptyState|Documentation')
+ = link_button_to s_('SnippetsEmptyState|New snippet'), button_path, title: s_('SnippetsEmptyState|New snippet'), id: 'new_snippet_link', data: { qa_selector: 'create_first_snippet_link' }, variant: :confirm
+ = link_button_to s_('SnippetsEmptyState|Documentation'), help_page_path('user/snippets.md'), title: s_('SnippetsEmptyState|Documentation')
- else
%h4.gl-text-center= s_('SnippetsEmptyState|There are no snippets to show.')
diff --git a/app/views/shared/empty_states/_wikis.html.haml b/app/views/shared/empty_states/_wikis.html.haml
index 57f1c9d381e..9e628a1f409 100644
--- a/app/views/shared/empty_states/_wikis.html.haml
+++ b/app/views/shared/empty_states/_wikis.html.haml
@@ -4,7 +4,7 @@
- if !hide_create && can?(current_user, :create_wiki, @wiki.container)
- create_path = wiki_page_path(@wiki, params[:id], view: 'create')
- - create_link = link_to s_('WikiEmpty|Create your first page'), create_path, class: 'btn gl-button btn-confirm', title: s_('WikiEmpty|Create your first page'), data: { qa_selector: 'create_first_page_link' }
+ - create_link = link_button_to s_('WikiEmpty|Create your first page'), create_path, title: s_('WikiEmpty|Create your first page'), data: { qa_selector: 'create_first_page_link' }, variant: :confirm
= render layout: layout_path, locals: { image_path: 'illustrations/wiki_login_empty.svg' } do
%h4.text-left
@@ -26,7 +26,7 @@
%p.text-left
= messages.dig(:issuable, :body).html_safe % { issues_link: issues_link }
- if show_new_issue_link?(@project)
- = link_to s_('WikiEmpty|Suggest wiki improvement'), new_project_issue_path(@project), class: 'btn gl-button btn-confirm', title: s_('WikiEmptyIssueMessage|Suggest wiki improvement')
+ = link_button_to s_('WikiEmpty|Suggest wiki improvement'), new_project_issue_path(@project), title: s_('WikiEmptyIssueMessage|Suggest wiki improvement'), variant: :confirm
- else
= render layout: layout_path, locals: { image_path: 'illustrations/wiki_logout_empty.svg' } do
diff --git a/app/views/shared/file_hooks/_index.html.haml b/app/views/shared/file_hooks/_index.html.haml
index ba968c6b2d2..9f1b11d6ab5 100644
--- a/app/views/shared/file_hooks/_index.html.haml
+++ b/app/views/shared/file_hooks/_index.html.haml
@@ -1,26 +1,30 @@
- file_hooks = Gitlab::FileHook.files
-.row.gl-mt-3
- .col-lg-4
- %h4.gl-mt-0
- = _('File Hooks')
- %p
- = _('File hooks are similar to system hooks but are executed as files instead of sending data to a URL.')
- = link_to _('For more information, see the File Hooks documentation.'), help_page_path('administration/file_hooks')
+.settings-section
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0
+ = _('File Hooks')
+ %p.gl-text-secondary
+ = _('File hooks are similar to system hooks but are executed as files instead of sending data to a URL.')
+ = link_to _('For more information, see the File Hooks documentation.'), help_page_path('administration/file_hooks')
-
- .col-lg-8.gl-mb-3
- - if file_hooks.any?
- = render Pajamas::CardComponent.new do |c|
- - c.with_header do
- = _('File Hooks (%{count})') % { count: file_hooks.count }
- - c.with_body do
- %ul.content-list
- - file_hooks.each do |file|
- %li
- .monospace
- = File.basename(file)
- - else
- = render Pajamas::CardComponent.new do |c|
- - c.with_body do
- .nothing-here-block= _('No file hooks found.')
+ .gl-mb-3
+ = render Pajamas::CardComponent.new(card_options: { class: 'gl-new-card' }, header_options: { class: 'gl-new-card-header'}, body_options: { class: 'gl-new-card-body'}) do |c|
+ - c.with_header do
+ .gl-new-card-title-wrapper
+ %h3.gl-new-card-title
+ = _('File Hooks')
+ %span.gl-new-card-count
+ = sprite_icon('hook', css_class: 'gl-mr-2')
+ #{file_hooks.count}
+ - c.with_body do
+ .gl-new-card-content
+ - if file_hooks.any?
+ %ul.content-list{ class: 'gl-my-n3!' }
+ - file_hooks.each do |file|
+ %li.label-list-item
+ .monospace
+ = File.basename(file)
+ - else
+ .gl-new-card-empty.gl-text-center= _('No file hooks found.')
diff --git a/app/views/shared/form_elements/_apply_generated_description_warning.haml b/app/views/shared/form_elements/_apply_generated_description_warning.haml
new file mode 100644
index 00000000000..906f60d01e6
--- /dev/null
+++ b/app/views/shared/form_elements/_apply_generated_description_warning.haml
@@ -0,0 +1,13 @@
+.form-group.row.js-ai-description-warning.hidden.js-issuable-ai-description-warning
+ .col-sm-12
+ .warning_message.mb-0{ role: 'alert' }
+ %btn.js-close-btn.js-dismiss-btn.close{ type: "button", "aria-hidden": "true", "aria-label": _("Close") }
+ = sprite_icon("close")
+
+ %p
+ = s_("AI|Replace the existing description with an AI-generated description? Any changes you have made will be lost.")
+
+ = render Pajamas::ButtonComponent.new(variant: :confirm, button_options: { class: 'gl-mr-3 js-ai-override-description' }) do
+ = s_("AI|Apply AI-generated description")
+ = render Pajamas::ButtonComponent.new(button_options: { class: 'js-cancel-btn' }) do
+ = _("Cancel")
diff --git a/app/views/shared/form_elements/_description.html.haml b/app/views/shared/form_elements/_description.html.haml
index 415849672b6..75f678dea5c 100644
--- a/app/views/shared/form_elements/_description.html.haml
+++ b/app/views/shared/form_elements/_description.html.haml
@@ -15,12 +15,15 @@
= render 'shared/issuable/form/template_selector', issuable: model
= render 'shared/form_elements/apply_template_warning', issuable: model
+ - if model.is_a?(MergeRequest)
+ = render 'shared/form_elements/apply_generated_description_warning', issuable: model
.js-markdown-editor{ data: { render_markdown_path: preview_url,
markdown_docs_path: help_page_path('user/markdown'),
quick_actions_docs_path: help_page_path('user/project/quick_actions'),
qa_selector: 'issuable_form_description_field',
form_field_placeholder: placeholder,
+ autofocus: 'false',
form_field_classes: 'js-gfm-input markdown-area note-textarea rspec-issuable-form-description' } }
= form.hidden_field :description
diff --git a/app/views/shared/hook_logs/_index.html.haml b/app/views/shared/hook_logs/_index.html.haml
index 7dab14b95c1..ee7d5b79560 100644
--- a/app/views/shared/hook_logs/_index.html.haml
+++ b/app/views/shared/hook_logs/_index.html.haml
@@ -2,10 +2,9 @@
- link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: docs_link_url }
- link_end = '</a>'.html_safe
-.row.gl-mt-3.gl-mb-3
- .col-lg-3
- %h4.gl-mt-0
- = _('Recent events')
- %p= _('GitLab events trigger webhooks. Use the request details of a webhook to help troubleshoot problems. %{link_start}How do I troubleshoot?%{link_end}').html_safe % { link_start: link_start, link_end: link_end }
- .col-lg-9
- = render partial: 'shared/hook_logs/recent_deliveries_table', locals: { hook: hook, hook_logs: hook_logs }
+.settings-section
+ .settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0= _('Recent events')
+ %p.gl-text-secondary= _('GitLab events trigger webhooks. Use the request details of a webhook to help troubleshoot problems. %{link_start}How do I troubleshoot?%{link_end}').html_safe % { link_start: link_start, link_end: link_end }
+ = render partial: 'shared/hook_logs/recent_deliveries_table', locals: { hook: hook, hook_logs: hook_logs }
diff --git a/app/views/shared/integrations/gitlab_slack_application/_slack_button.html.haml b/app/views/shared/integrations/gitlab_slack_application/_slack_button.html.haml
deleted file mode 100644
index b22a6eeca90..00000000000
--- a/app/views/shared/integrations/gitlab_slack_application/_slack_button.html.haml
+++ /dev/null
@@ -1,4 +0,0 @@
-= link_to add_to_slack_link(project, slack_app_id), class: 'btn btn-default gl-button gl-pr-6!' do
- = image_tag 'illustrations/slack_logo.svg', class: 'gl-icon gl-button-icon gl-w-9! gl-h-9! gl-my-n3! gl-mr-0!'
- %strong.gl-button-text
- = label
diff --git a/app/views/shared/integrations/gitlab_slack_application/_slack_integration_form.html.haml b/app/views/shared/integrations/gitlab_slack_application/_slack_integration_form.html.haml
index 5c9f77f8c12..e5d05a8a83d 100644
--- a/app/views/shared/integrations/gitlab_slack_application/_slack_integration_form.html.haml
+++ b/app/views/shared/integrations/gitlab_slack_application/_slack_integration_form.html.haml
@@ -20,13 +20,16 @@
%td{ class: 'gl-py-3!' }
= time_ago_with_tooltip(slack_integration.created_at)
%td{ class: 'gl-py-3!' }
- .controls
+ .controls.gl-display-flex.gl-gap-3
- project = integration.project
- = link_to _('Edit'), edit_project_settings_slack_path(project), class: 'btn gl-button btn-default'
- = link_to sprite_icon('remove', css_class: 'gl-icon'), project_settings_slack_path(project), method: :delete, class: 'btn gl-button btn-danger btn-danger-secondary', aria: { label: s_('SlackIntegration|Remove project') }, data: { confirm_btn_variant: "danger", confirm: s_('SlackIntegration|Are you sure you want to remove this project from the GitLab for Slack app?') }
+ = render Pajamas::ButtonComponent.new(href: edit_project_settings_slack_path(project)) do
+ = _('Edit')
+ = render Pajamas::ButtonComponent.new(method: :delete, category: 'secondary', variant: "danger", href: project_settings_slack_path(project), icon: 'remove', button_options: { aria: { label: s_('SlackIntegration|Remove project') }, data: { confirm_btn_variant: "danger", confirm: s_('SlackIntegration|Are you sure you want to remove this project from the GitLab for Slack app?') }})
.gl-my-5
- = render 'shared/integrations/gitlab_slack_application/slack_button', project: @project, label: s_('SlackIntegration|Reinstall GitLab for Slack app')
+ = render Pajamas::ButtonComponent.new(href: add_to_slack_link(@project, slack_app_id)) do
+ = s_('SlackIntegration|Reinstall GitLab for Slack app…')
%p
= html_escape(s_('SlackIntegration|You may need to reinstall the GitLab for Slack app when we %{linkStart}make updates or change permissions%{linkEnd}.')) % { linkStart: %(<a href="#{help_page_path('user/project/integrations/gitlab_slack_application.md', anchor: 'update-the-gitlab-for-slack-app')}">).html_safe, linkEnd: '</a>'.html_safe}
- else
- = render 'shared/integrations/gitlab_slack_application/slack_button', project: @project, label: s_('SlackIntegration|Install GitLab for Slack app')
+ = render Pajamas::ButtonComponent.new(href: add_to_slack_link(@project, slack_app_id)) do
+ = s_('SlackIntegration|Install GitLab for Slack app…')
diff --git a/app/views/shared/integrations/prometheus/_custom_metrics.html.haml b/app/views/shared/integrations/prometheus/_custom_metrics.html.haml
index 0264196f60c..a7a650aa95d 100644
--- a/app/views/shared/integrations/prometheus/_custom_metrics.html.haml
+++ b/app/views/shared/integrations/prometheus/_custom_metrics.html.haml
@@ -11,7 +11,7 @@
%strong
= s_('PrometheusService|Custom metrics')
= gl_badge_tag 0, nil, class: 'gl-ml-2 js-custom-monitored-count'
- = link_to s_('PrometheusService|New metric'), new_project_prometheus_metric_path(project), class: 'btn gl-button btn-confirm gl-ml-auto js-new-metric-button hidden'
+ = link_button_to s_('PrometheusService|New metric'), new_project_prometheus_metric_path(project), class: 'gl-ml-auto js-new-metric-button hidden', variant: :confirm
- c.with_body do
.flash-container.hidden
.flash-warning
diff --git a/app/views/shared/integrations/slack_slash_commands/_help.html.haml b/app/views/shared/integrations/slack_slash_commands/_help.html.haml
index fee0ca15808..43a240fa6fe 100644
--- a/app/views/shared/integrations/slack_slash_commands/_help.html.haml
+++ b/app/views/shared/integrations/slack_slash_commands/_help.html.haml
@@ -57,7 +57,7 @@
= label_tag nil, _('Customize icon'), class: 'col-12 col-form-label label-bold'
.col-12
= image_tag(asset_url('slash-command-logo.png', skip_pipeline: true), width: 36, height: 36, class: 'mr-3')
- = link_to(_('Download image'), asset_url('gitlab_logo.png'), class: 'gl-button btn btn-default btn-sm', target: '_blank', rel: 'noopener noreferrer')
+ = link_button_to _('Download image'), asset_url('gitlab_logo.png'), target: '_blank', rel: 'noopener noreferrer', size: :small
.form-group
= label_tag nil, _('Autocomplete'), class: 'col-12 col-form-label label-bold'
diff --git a/app/views/shared/issuable/_form.html.haml b/app/views/shared/issuable/_form.html.haml
index b6bd691213c..42f035b99aa 100644
--- a/app/views/shared/issuable/_form.html.haml
+++ b/app/views/shared/issuable/_form.html.haml
@@ -61,14 +61,14 @@
= form.submit _('Save changes'), pajamas_button: true, class: 'gl-mr-2 js-issuable-submit-button js-reset-autosave', data: { track_action: 'click_button', track_label: 'submit_mr', track_value: 0 }
- if issuable.new_record?
- = link_to _('Cancel'), polymorphic_path([@project, issuable.class]), class: 'btn gl-button btn-default js-reset-autosave'
+ = link_button_to _('Cancel'), polymorphic_path([@project, issuable.class]), class: 'js-reset-autosave'
- else
- = link_to _('Cancel'), polymorphic_path([@project, issuable]), class: 'gl-button btn btn-default js-reset-autosave'
+ = link_button_to _('Cancel'), polymorphic_path([@project, issuable]), class: 'js-reset-autosave'
- if can?(current_user, :"destroy_#{issuable.to_ability_name}", @project)
- confirm_title = _('Delete %{issuableType}?') % { issuableType: issuable.human_class_name }
- confirm_body = _('You’re about to permanently delete the %{issuableType} ‘%{strongOpen}%{issuableTitle}%{strongClose}’. To avoid data loss, consider %{strongOpen}closing this %{issuableType}%{strongClose} instead. Once deleted, it cannot be undone or recovered.') % { issuableType: issuable.human_class_name, issuableTitle: issuable.title, strongOpen: '<strong>', strongClose: '</strong>' }
- confirm_primary_btn_text = _('Delete %{issuableType}') % { issuableType: issuable.human_class_name }
- = link_to _('Delete'), polymorphic_path([@project, issuable], params: { destroy_confirm: true }), data: { title: confirm_title, confirm: confirm_body, is_html_message: true, confirm_btn_variant: 'danger'}, method: :delete, class: 'btn gl-button btn-danger btn-danger-secondary gl-float-right js-reset-autosave', "aria-label": confirm_primary_btn_text
+ = link_button_to _('Delete'), polymorphic_path([@project, issuable], params: { destroy_confirm: true }), data: { title: confirm_title, confirm: confirm_body, is_html_message: true, confirm_btn_variant: 'danger'}, method: :delete, class: 'gl-float-right js-reset-autosave', "aria-label": confirm_primary_btn_text, variant: :danger, category: :secondary
- if issuable.respond_to?(:issue_type)
= form.hidden_field :issue_type
diff --git a/app/views/shared/issuable/_search_bar.html.haml b/app/views/shared/issuable/_search_bar.html.haml
index b8f98c28574..d590c859945 100644
--- a/app/views/shared/issuable/_search_bar.html.haml
+++ b/app/views/shared/issuable/_search_bar.html.haml
@@ -34,7 +34,7 @@
#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.gl-button.btn.btn-link{ type: 'button' }
+ %button.btn.btn-link{ type: 'button' }
-# Encapsulate static class name `{{icon}}` inside #{} to bypass
-# haml lint's ClassAttributeWithStaticValue
%svg
@@ -44,7 +44,7 @@
#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.gl-button.btn.btn-link{ type: 'button' }
+ %button.btn.btn-link{ type: 'button' }
{{ title }}
%span.btn-helptext
{{ help }}
@@ -60,10 +60,10 @@
#js-dropdown-assignee.filtered-search-input-dropdown-menu.dropdown-menu
%ul{ data: { dropdown: true } }
%li.filter-dropdown-item{ data: { value: 'None' } }
- %button.gl-button.btn.btn-link{ type: 'button' }
+ %button.btn.btn-link{ type: 'button' }
= _('None')
%li.filter-dropdown-item{ data: { value: 'Any' } }
- %button.gl-button.btn.btn-link{ type: 'button' }
+ %button.btn.btn-link{ type: 'button' }
= _('Any')
%li.divider.droplab-item-ignore
- if current_user
@@ -76,10 +76,10 @@
#js-dropdown-reviewer.filtered-search-input-dropdown-menu.dropdown-menu
%ul{ data: { dropdown: true } }
%li.filter-dropdown-item{ data: { value: 'None' } }
- %button.gl-button.btn.btn-link{ type: 'button' }
+ %button.btn.btn-link{ type: 'button' }
= _('None')
%li.filter-dropdown-item{ data: { value: 'Any' } }
- %button.gl-button.btn.btn-link{ type: 'button' }
+ %button.btn.btn-link{ type: 'button' }
= _('Any')
%li.divider.droplab-item-ignore
- if current_user
@@ -94,101 +94,101 @@
#js-dropdown-milestone.filtered-search-input-dropdown-menu.dropdown-menu
%ul{ data: { dropdown: true } }
%li.filter-dropdown-item{ data: { value: 'None' } }
- %button.gl-button.btn.btn-link{ type: 'button' }
+ %button.btn.btn-link{ type: 'button' }
= _('None')
%li.filter-dropdown-item{ data: { value: 'Any' } }
- %button.gl-button.btn.btn-link{ type: 'button' }
+ %button.btn.btn-link{ type: 'button' }
= _('Any')
%li.filter-dropdown-item{ data: { value: 'Upcoming' } }
- %button.gl-button.btn.btn-link{ type: 'button' }
+ %button.btn.btn-link{ type: 'button' }
= _('Upcoming')
%li.filter-dropdown-item{ data: { value: 'Started' } }
- %button.gl-button.btn.btn-link{ type: 'button' }
+ %button.btn.btn-link{ type: 'button' }
= _('Started')
%li.divider.droplab-item-ignore
%ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
%li.filter-dropdown-item
- %button.gl-button.btn.btn-link.js-data-value{ type: 'button' }
+ %button.btn.btn-link.js-data-value{ type: 'button' }
{{title}}
= render_if_exists 'shared/issuable/filter_iteration', type: type
#js-dropdown-release.filtered-search-input-dropdown-menu.dropdown-menu
%ul{ data: { dropdown: true } }
%li.filter-dropdown-item{ data: { value: 'None' } }
- %button.gl-button.btn.btn-link{ type: 'button' }
+ %button.btn.btn-link{ type: 'button' }
= _('None')
%li.filter-dropdown-item{ data: { value: 'Any' } }
- %button.gl-button.btn.btn-link{ type: 'button' }
+ %button.btn.btn-link{ type: 'button' }
= _('Any')
%li.divider.droplab-item-ignore
%ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
%li.filter-dropdown-item
- %button.gl-button.btn.btn-link.js-data-value{ type: 'button' }
+ %button.btn.btn-link.js-data-value{ type: 'button' }
{{title}}
#js-dropdown-label.filtered-search-input-dropdown-menu.dropdown-menu
%ul{ data: { dropdown: true } }
%li.filter-dropdown-item{ data: { value: 'None' } }
- %button.gl-button.btn.btn-link{ type: 'button' }
+ %button.btn.btn-link{ type: 'button' }
= _('None')
%li.filter-dropdown-item{ data: { value: 'Any' } }
- %button.gl-button.btn.btn-link{ type: 'button' }
+ %button.btn.btn-link{ type: 'button' }
= _('Any')
%li.divider.droplab-item-ignore
%ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
%li.filter-dropdown-item
- %button.gl-button.btn.btn-link{ type: 'button' }
+ %button.btn.btn-link{ type: 'button' }
%span.dropdown-label-box{ style: 'background: {{color}}' }
%span.label-title.js-data-value
{{title}}
#js-dropdown-my-reaction.filtered-search-input-dropdown-menu.dropdown-menu
%ul{ data: { dropdown: true } }
%li.filter-dropdown-item{ data: { value: 'None' } }
- %button.gl-button.btn.btn-link{ type: 'button' }
+ %button.btn.btn-link{ type: 'button' }
= _('None')
%li.filter-dropdown-item{ data: { value: 'Any' } }
- %button.gl-button.btn.btn-link{ type: 'button' }
+ %button.btn.btn-link{ type: 'button' }
= _('Any')
%li.divider.droplab-item-ignore
%ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
%li.filter-dropdown-item
- %button.gl-button.btn.btn-link{ type: 'button' }
+ %button.btn.btn-link{ type: 'button' }
%gl-emoji
%span.js-data-value.gl-ml-3
{{name}}
#js-dropdown-wip.filtered-search-input-dropdown-menu.dropdown-menu
%ul.filter-dropdown{ data: { dropdown: true } }
%li.filter-dropdown-item{ data: { value: 'yes', capitalize: true } }
- %button.gl-button.btn.btn-link{ type: 'button' }
+ %button.btn.btn-link{ type: 'button' }
= _('Yes')
%li.filter-dropdown-item{ data: { value: 'no', capitalize: true } }
- %button.gl-button.btn.btn-link{ type: 'button' }
+ %button.btn.btn-link{ type: 'button' }
= _('No')
- if ::Feature.enabled?(:mr_approved_filter, type: :ops)
#js-dropdown-approved.filtered-search-input-dropdown-menu.dropdown-menu
%ul.filter-dropdown{ data: { dropdown: true } }
%li.filter-dropdown-item{ data: { value: 'yes', capitalize: true } }
- %button.gl-button.btn.btn-link{ type: 'button' }
+ %button.btn.btn-link{ type: 'button' }
= _('Yes')
%li.filter-dropdown-item{ data: { value: 'no', capitalize: true } }
- %button.gl-button.btn.btn-link{ type: 'button' }
+ %button.btn.btn-link{ type: 'button' }
= _('No')
#js-dropdown-confidential.filtered-search-input-dropdown-menu.dropdown-menu
%ul.filter-dropdown{ data: { dropdown: true } }
%li.filter-dropdown-item{ data: { value: 'yes', capitalize: true } }
- %button.gl-button.btn.btn-link{ type: 'button' }
+ %button.btn.btn-link{ type: 'button' }
= _('Yes')
%li.filter-dropdown-item{ data: { value: 'no', capitalize: true } }
- %button.gl-button.btn.btn-link{ type: 'button' }
+ %button.btn.btn-link{ type: 'button' }
= _('No')
- unless disable_target_branch
#js-dropdown-target-branch.filtered-search-input-dropdown-menu.dropdown-menu
%ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
%li.filter-dropdown-item
- %button.gl-button.btn.btn-link.js-data-value.monospace
+ %button.btn.btn-link.js-data-value.monospace
{{title}}
#js-dropdown-environment.filtered-search-input-dropdown-menu.dropdown-menu
%ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
%li.filter-dropdown-item
- %button.gl-button.btn.btn-link.js-data-value{ type: 'button' }
+ %button.btn.btn-link.js-data-value{ type: 'button' }
{{title}}
= render_if_exists 'shared/issuable/filter_weight', type: type
diff --git a/app/views/shared/issuable/_sidebar.html.haml b/app/views/shared/issuable/_sidebar.html.haml
index ee1ca364b07..fadaeafeaf6 100644
--- a/app/views/shared/issuable/_sidebar.html.haml
+++ b/app/views/shared/issuable/_sidebar.html.haml
@@ -12,10 +12,10 @@
- moved_sidebar_enabled = moved_mr_sidebar_enabled?
- is_merge_request_with_flag = is_merge_request && moved_sidebar_enabled
-%aside.right-sidebar.js-right-sidebar.js-issuable-sidebar{ data: { signed: { in: signed_in }, issuable_type: issuable_type }, class: "#{sidebar_gutter_collapsed_class(is_merge_request_with_flag)} #{'right-sidebar-merge-requests' if is_merge_request_with_flag}", 'aria-live' => 'polite', 'aria-label': issuable_type }
+%aside.right-sidebar.js-right-sidebar.js-issuable-sidebar{ data: { always_show_toggle: true, signed: { in: signed_in }, issuable_type: issuable_type }, class: "#{sidebar_gutter_collapsed_class(is_merge_request_with_flag)} #{'right-sidebar-merge-requests' if is_merge_request_with_flag}", 'aria-live' => 'polite', 'aria-label': issuable_type }
.issuable-sidebar{ class: "#{'is-merge-request' if is_merge_request_with_flag}" }
.issuable-sidebar-header{ class: "#{'gl-pb-2! gl-md-display-flex gl-justify-content-end gl-lg-display-none!' if is_merge_request_with_flag}" }
- %button.btn.gl-button.gutter-toggle.float-right.js-sidebar-toggle.has-tooltip{ type: "reset", class: "gl-shadow-none! #{'gl-display-block' if moved_sidebar_enabled}", "aria-label" => _('Toggle sidebar'), title: sidebar_gutter_tooltip_text, data: { container: 'body', placement: 'left', boundary: 'viewport' } }
+ = render Pajamas::ButtonComponent.new(button_options: { class: "gutter-toggle float-right js-sidebar-toggle has-tooltip gl-shadow-none! #{'gl-display-block' if moved_sidebar_enabled}", type: 'button', 'aria-label' => _('Toggle sidebar'), title: sidebar_gutter_tooltip_text, data: { container: 'body', placement: 'left', boundary: 'viewport' } }) do
= sidebar_gutter_toggle_icon
- if signed_in && !is_merge_request_with_flag
.js-sidebar-todo-widget-root{ data: { project_path: issuable_sidebar[:project_full_path], iid: issuable_sidebar[:iid], id: issuable_sidebar[:id] } }
diff --git a/app/views/shared/issuable/_sidebar_assignees.html.haml b/app/views/shared/issuable/_sidebar_assignees.html.haml
index c6f3e4d97a8..a27bb506c87 100644
--- a/app/views/shared/issuable/_sidebar_assignees.html.haml
+++ b/app/views/shared/issuable/_sidebar_assignees.html.haml
@@ -2,7 +2,6 @@
- dropdown_options = assignees_dropdown_options(issuable_type)
.js-sidebar-assignees-root{ data: { field: issuable_type,
- signed_in: signed_in,
max_assignees: dropdown_options[:data][:"max-select"],
directly_invite_members: can_admin_project_member?(@project) } }
.title.hide-collapsed
diff --git a/app/views/shared/issuable/_status_box.html.haml b/app/views/shared/issuable/_status_box.html.haml
index 125ef921cfa..cca51b48322 100644
--- a/app/views/shared/issuable/_status_box.html.haml
+++ b/app/views/shared/issuable/_status_box.html.haml
@@ -2,7 +2,7 @@
- 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'
-- badge_classes = "js-mr-status-box issuable-status-badge gl-mr-3 #{badge_status_class} #{'gl-vertical-align-bottom' if issuable.is_a?(MergeRequest)}"
+- badge_classes = "js-mr-status-box issuable-status-badge gl-mr-3 gl-align-self-center #{badge_status_class} #{'gl-vertical-align-bottom' if issuable.is_a?(MergeRequest)}"
= 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
diff --git a/app/views/shared/issue_type/_details_header.html.haml b/app/views/shared/issue_type/_details_header.html.haml
index b6c0b73a83d..4997d429587 100644
--- a/app/views/shared/issue_type/_details_header.html.haml
+++ b/app/views/shared/issue_type/_details_header.html.haml
@@ -16,7 +16,6 @@
#js-issuable-header-warnings{ data: { hidden: issue_hidden?(issuable).to_s } }
= issuable_meta(issuable, @project)
- %a.btn.gl-button.btn-default.btn-icon.float-right.gl-display-block.d-sm-none.gutter-toggle.issuable-gutter-toggle.js-sidebar-toggle{ href: "#" }
- = sprite_icon('chevron-double-lg-left')
+ = render Pajamas::ButtonComponent.new(href: '#', icon: 'chevron-double-lg-left', button_options: { class: 'gl-float-right gl-display-block gl-sm-display-none! gutter-toggle issuable-gutter-toggle js-sidebar-toggle' })
.js-issue-header-actions{ data: issue_header_actions_data(@project, issuable, current_user, @issuable_sidebar) }
diff --git a/app/views/shared/members/_manage_access_button.html.haml b/app/views/shared/members/_manage_access_button.html.haml
index c88198ec380..910d62d4dc4 100644
--- a/app/views/shared/members/_manage_access_button.html.haml
+++ b/app/views/shared/members/_manage_access_button.html.haml
@@ -1,7 +1,5 @@
- path = local_assigns.fetch(:path, nil)
.gl-float-right
- = link_to path, class: 'btn btn-default btn-sm gl-button' do
- = sprite_icon('pencil', css_class: 'gl-icon gl-button-icon')
- %span.gl-button-text
- = _('Manage access')
+ = link_button_to path, size: :small, icon: 'pencil' do
+ = _('Manage access')
diff --git a/app/views/shared/members/_member.html.haml b/app/views/shared/members/_member.html.haml
index 376e51a6b15..c86993f5b77 100644
--- a/app/views/shared/members/_member.html.haml
+++ b/app/views/shared/members/_member.html.haml
@@ -43,7 +43,7 @@
= _("Given access %{time_ago}").html_safe % { time_ago: time_ago_with_tooltip(member.created_at) }
%span.js-expires-in{ class: ('gl-display-none' unless member.expires?) }
&middot;
- %span.js-expires-in-text{ class: "has-tooltip#{' text-warning' if member.expires_soon?}", title: (member.expires_at.to_time.in_time_zone.to_s(:medium) if member.expires?) }
+ %span.js-expires-in-text{ class: "has-tooltip#{' text-warning' if member.expires_soon?}", title: (member.expires_at.to_time.in_time_zone.to_fs(:medium) if member.expires?) }
- if member.expires?
- preposition = current_user.time_display_relative ? '' : 'on'
= _("Expires %{preposition} %{expires_at}").html_safe % { expires_at: time_ago_with_tooltip(member.expires_at), preposition: preposition }
diff --git a/app/views/shared/milestones/_labels_tab.html.haml b/app/views/shared/milestones/_labels_tab.html.haml
index d2bee57992d..1e856bf4355 100644
--- a/app/views/shared/milestones/_labels_tab.html.haml
+++ b/app/views/shared/milestones/_labels_tab.html.haml
@@ -8,7 +8,7 @@
= markdown_field(label, :description)
.float-right.d-none.d-lg-block
- = link_to milestones_issues_path(options.merge(state: 'opened')), class: 'btn gl-button btn-default-tertiary' do
- - pluralize milestone_issues_by_label_count(@milestone, label, state: :opened), _('open issue')
- = link_to milestones_issues_path(options.merge(state: 'closed')), class: 'btn gl-button btn-default-tertiary' do
- - pluralize milestone_issues_by_label_count(@milestone, label, state: :closed), _('closed issue')
+ = link_button_to milestones_issues_path(options.merge(state: 'opened')), category: :tertiary do
+ = n_('open issue', 'open issues', milestone_issues_by_label_count(@milestone, label, state: :opened))
+ = link_button_to milestones_issues_path(options.merge(state: 'closed')), category: :tertiary do
+ = n_('closed issue', 'closed issues', milestone_issues_by_label_count(@milestone, label, state: :closed))
diff --git a/app/views/shared/milestones/_milestone.html.haml b/app/views/shared/milestones/_milestone.html.haml
index 01548325c83..c36d3a8b92b 100644
--- a/app/views/shared/milestones/_milestone.html.haml
+++ b/app/views/shared/milestones/_milestone.html.haml
@@ -52,6 +52,6 @@
= render Pajamas::ButtonComponent.new(icon: 'level-up', category: :tertiary, size: :small, button_options: { class: 'js-promote-project-milestone-button', title: s_('Milestones|Promote to Group Milestone'), disabled: true, data: { toggle: 'tooltip', container: 'body', url: promote_project_milestone_path(milestone.project, milestone), milestone_title: milestone.title, group_name: @project.group.name } })
- if can?(current_user, :admin_milestone, milestone)
- if milestone.closed?
- = link_to s_('Milestones|Reopen Milestone'), milestone_path(milestone, milestone: { state_event: :activate }), method: :put, class: "btn gl-button btn-sm gl-ml-3"
+ = link_button_to s_('Milestones|Reopen Milestone'), milestone_path(milestone, milestone: { state_event: :activate }), method: :put, class: 'gl-ml-3', size: :small
- else
- = link_to s_('Milestones|Close Milestone'), milestone_path(milestone, milestone: { state_event: :close }), method: :put, class: "btn gl-button btn-default btn-default-secondary btn-sm gl-ml-3"
+ = link_button_to s_('Milestones|Close Milestone'), milestone_path(milestone, milestone: { state_event: :close }), method: :put, class: 'gl-ml-3', category: :secondary, size: :small
diff --git a/app/views/shared/milestones/_sidebar.html.haml b/app/views/shared/milestones/_sidebar.html.haml
index 5477b9395ea..1b0eeb424c2 100644
--- a/app/views/shared/milestones/_sidebar.html.haml
+++ b/app/views/shared/milestones/_sidebar.html.haml
@@ -26,7 +26,7 @@
.value
%span.value-content{ data: { qa_selector: 'start_date_content' } }
- if milestone.start_date
- %span.bold= milestone.start_date.to_s(:medium)
+ %span.bold= milestone.start_date.to_fs(:medium)
- else
%span.no-value= s_('MilestoneSidebar|No start date')
@@ -63,7 +63,7 @@
.value.hide-collapsed
%span.value-content{ data: { qa_selector: 'due_date_content' } }
- if milestone.due_date
- %span.bold= milestone.due_date.to_s(:medium)
+ %span.bold= milestone.due_date.to_fs(:medium)
- else
%span.no-value= s_('MilestoneSidebar|No due date')
- remaining_days = remaining_days_in_words(milestone.due_date, milestone.start_date)
diff --git a/app/views/shared/nav/_sidebar.html.haml b/app/views/shared/nav/_sidebar.html.haml
index 915352996d9..91b0582e04a 100644
--- a/app/views/shared/nav/_sidebar.html.haml
+++ b/app/views/shared/nav/_sidebar.html.haml
@@ -1,6 +1,6 @@
%aside.nav-sidebar{ class: ('sidebar-collapsed-desktop' if collapsed_sidebar?), **sidebar_tracking_attributes_by_object(sidebar.container), 'aria-label': sidebar.aria_label }
.nav-sidebar-inner-scroll
- %ul.sidebar-top-level-items{ data: { qa_selector: sidebar_qa_selector(sidebar.container) } }
+ %ul.sidebar-top-level-items{ data: { testid: sidebar_qa_selector(sidebar.container) } }
- if sidebar.render_raw_scope_menu_partial
= render sidebar.render_raw_scope_menu_partial
- elsif sidebar.scope_menu
diff --git a/app/views/shared/nav/_sidebar_menu.html.haml b/app/views/shared/nav/_sidebar_menu.html.haml
index bc0648c14e0..27f77ed4813 100644
--- a/app/views/shared/nav/_sidebar_menu.html.haml
+++ b/app/views/shared/nav/_sidebar_menu.html.haml
@@ -2,7 +2,7 @@
- if sidebar_menu.menu_with_partial?
= render_if_exists sidebar_menu.menu_partial, **sidebar_menu.menu_partial_options
- else
- = link_to sidebar_menu.link, **sidebar_menu.link_html_options, data: { qa_selector: 'sidebar_menu_link', qa_menu_item: sidebar_menu.title } do
+ = link_to sidebar_menu.link, **sidebar_menu.link_html_options, data: { testid: 'sidebar_menu_link', qa_menu_item: sidebar_menu.title } do
- if sidebar_menu.icon_or_image?
%span.nav-icon-container
- if sidebar_menu.image_path
diff --git a/app/views/shared/nav/_sidebar_menu_item.html.haml b/app/views/shared/nav/_sidebar_menu_item.html.haml
index eea36127745..ef488d06e87 100644
--- a/app/views/shared/nav/_sidebar_menu_item.html.haml
+++ b/app/views/shared/nav/_sidebar_menu_item.html.haml
@@ -1,5 +1,5 @@
= nav_link(**sidebar_menu_item.active_routes, html_options: sidebar_menu_item.nav_link_html_options) do
- = link_to sidebar_menu_item.link, **sidebar_menu_item.link_html_options, data: { qa_selector: 'sidebar_menu_item_link', qa_menu_item: sidebar_menu_item.title } do
+ = link_to sidebar_menu_item.link, **sidebar_menu_item.link_html_options, data: { testid: 'sidebar_menu_item_link', qa_menu_item: sidebar_menu_item.title } do
%span.gl-flex-grow-1
= sidebar_menu_item.title
- if sidebar_menu_item.sprite_icon
diff --git a/app/views/shared/notes/_form.html.haml b/app/views/shared/notes/_form.html.haml
index 98008fede90..9a5e9b2179f 100644
--- a/app/views/shared/notes/_form.html.haml
+++ b/app/views/shared/notes/_form.html.haml
@@ -5,7 +5,7 @@
- else
- preview_url = preview_markdown_path(@project)
-= form_for form_resources, url: new_form_url, remote: true, html: { :'data-type' => 'json', multipart: true, id: nil, class: "new-note js-new-note-form js-quick-submit common-note-form discussion-reply-holder", "data-noteable-iid" => @note.noteable.try(:iid), }, authenticity_token: true do |f|
+= form_for form_resources, url: new_form_url, remote: true, html: { :'data-type' => 'json', multipart: true, id: nil, class: "new-note js-new-note-form js-quick-submit common-note-form discussion-reply-holder gl-border-top-0!", "data-noteable-iid" => @note.noteable.try(:iid), }, authenticity_token: true do |f|
= hidden_field_tag :view, diff_view
= hidden_field_tag :line_type
= hidden_field_tag :merge_request_diff_head_sha, @note.noteable.try(:diff_head_sha)
@@ -25,14 +25,14 @@
= f.hidden_field :position
.discussion-form-container.discussion-with-resolve-btn.flex-column.p-0
- = render layout: 'shared/md_preview', locals: { url: preview_url, referenced_users: true } do
+ = render layout: 'shared/md_preview', locals: { url: preview_url, referenced_users: true, supports_quick_actions: supports_quick_actions } do
= render 'shared/zen', f: f, qa_selector: 'note_field',
attr: :note,
classes: 'note-textarea js-note-text',
placeholder: _("Write a comment or drag your files here…"),
supports_quick_actions: supports_quick_actions,
supports_autocomplete: supports_autocomplete
- = render 'shared/notes/hints', supports_quick_actions: supports_quick_actions
+ = render 'shared/notes/hints'
.error-alert
.note-form-actions.clearfix.gl-display-flex.gl-flex-wrap
diff --git a/app/views/shared/notes/_hints.html.haml b/app/views/shared/notes/_hints.html.haml
index d7d6e477ab1..23ce38d50e0 100644
--- a/app/views/shared/notes/_hints.html.haml
+++ b/app/views/shared/notes/_hints.html.haml
@@ -1,13 +1,7 @@
-- supports_quick_actions = local_assigns.fetch(:supports_quick_actions, false)
- supports_file_upload = local_assigns.fetch(:supports_file_upload, true)
-.comment-toolbar.gl-mx-2.gl-mb-2.gl-px-4.gl-bg-gray-10.gl-rounded-bottom-left-base.gl-rounded-bottom-right-base.clearfix
- .toolbar-text.gl-font-sm
- - 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
- = 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
- = html_escape(s_('MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}')) % { markdownDocsLinkStart: markdownLinkStart, markdownDocsLinkEnd: '</a>'.html_safe }
+.comment-toolbar.gl-px-2.gl-display-flex.gl-justify-content-end.gl-rounded-bottom-left-base.gl-rounded-bottom-right-base.clearfix
+ .content-editor-switcher.gl-display-inline-flex.gl-align-items-center
+ = render Pajamas::ButtonComponent.new(category: :tertiary, icon: 'markdown-mark', size: :small, href: help_page_path('user/markdown'), target: '_blank', button_options: { class: 'gl-px-3!' })
- if supports_file_upload
%span.uploading-container.gl-line-height-32.gl-font-sm
%span.uploading-progress-container.hide
diff --git a/app/views/shared/projects/_search_form.html.haml b/app/views/shared/projects/_search_form.html.haml
index 72709b3ed2f..2388bf2f0be 100644
--- a/app/views/shared/projects/_search_form.html.haml
+++ b/app/views/shared/projects/_search_form.html.haml
@@ -51,5 +51,5 @@
.gl-display-flex.gl-w-full.gl-md-w-auto{ class: 'gl-m-0!' }
.js-namespace-select{ data: { field_name: 'namespace_id', selected_id: namespace&.id, selected_text: selected_text, update_location: 'true' } }
- = link_to new_project_path, class: 'gl-button btn btn-confirm gl-display-inline gl-mb-0!' do
+ = link_button_to new_project_path, class: 'gl-display-inline gl-mb-0!', variant: :confirm do
= _('New Project')
diff --git a/app/views/shared/web_hooks/_form.html.haml b/app/views/shared/web_hooks/_form.html.haml
index 7eafd6ae092..a0e55cd5723 100644
--- a/app/views/shared/web_hooks/_form.html.haml
+++ b/app/views/shared/web_hooks/_form.html.haml
@@ -3,7 +3,7 @@
.js-vue-webhook-form{ data: webhook_form_data(hook) }
.form-group
= form.label :token, s_('Webhooks|Secret token'), class: 'label-bold'
- = form.password_field :token, value: hook.masked_token, autocomplete: 'new-password', class: 'form-control gl-form-input'
+ = form.password_field :token, value: hook.masked_token, autocomplete: 'new-password', class: 'form-control gl-form-input gl-max-w-48'
%p.form-text.text-muted
- code_start = '<code>'.html_safe
- code_end = '</code>'.html_safe
@@ -11,59 +11,66 @@
.form-group
= form.label :url, s_('Webhooks|Trigger'), class: 'label-bold'
%ul.list-unstyled
- %li.gl-pb-5
+ %li.gl-pb-3
.js-vue-push-events{ data: { push_events: hook.push_events.to_s, strategy: hook.branch_filter_strategy, is_new_hook: hook.new_record?.to_s, push_events_branch_filter: hook.push_events_branch_filter } }
- %li.gl-pb-5
+ %li.gl-pb-3
= form.gitlab_ui_checkbox_component :tag_push_events,
integration_webhook_event_human_name(:tag_push_events),
help_text: s_('Webhooks|A new tag is pushed to the repository.')
- %li.gl-pb-5
+ %li.gl-pb-3
= form.gitlab_ui_checkbox_component :note_events,
integration_webhook_event_human_name(:note_events),
help_text: s_('Webhooks|A comment is added to an issue or merge request.')
- %li.gl-pb-5
+ %li.gl-pb-3
= form.gitlab_ui_checkbox_component :confidential_note_events,
integration_webhook_event_human_name(:confidential_note_events),
help_text: s_('Webhooks|A comment is added to a confidential issue.')
- %li.gl-pb-5
+ %li.gl-pb-3
= form.gitlab_ui_checkbox_component :issues_events,
integration_webhook_event_human_name(:issues_events),
help_text: s_('Webhooks|An issue is created, updated, closed, or reopened.')
- %li.gl-pb-5
+ %li.gl-pb-3
= form.gitlab_ui_checkbox_component :confidential_issues_events,
integration_webhook_event_human_name(:confidential_issues_events),
help_text: s_('Webhooks|A confidential issue is created, updated, closed, or reopened.')
- if @group
= render_if_exists 'groups/hooks/member_events', form: form
= render_if_exists 'groups/hooks/subgroup_events', form: form
- %li.gl-pb-5
+ %li.gl-pb-3
= form.gitlab_ui_checkbox_component :merge_requests_events,
integration_webhook_event_human_name(:merge_requests_events),
help_text: s_('Webhooks|A merge request is created, updated, or merged.')
- %li.gl-pb-5
+ %li.gl-pb-3
= form.gitlab_ui_checkbox_component :job_events,
integration_webhook_event_human_name(:job_events),
help_text: s_("Webhooks|A job's status changes.")
- %li.gl-pb-5
+ %li.gl-pb-3
= form.gitlab_ui_checkbox_component :pipeline_events,
integration_webhook_event_human_name(:pipeline_events),
help_text: s_("Webhooks|A pipeline's status changes.")
- %li.gl-pb-5
+ %li.gl-pb-3
= form.gitlab_ui_checkbox_component :wiki_page_events,
integration_webhook_event_human_name(:wiki_page_events),
help_text: s_('Webhooks|A wiki page is created or updated.')
- %li.gl-pb-5
+ %li.gl-pb-3
= form.gitlab_ui_checkbox_component :deployment_events,
integration_webhook_event_human_name(:deployment_events),
help_text: s_('Webhooks|A deployment starts, finishes, fails, or is canceled.')
- %li.gl-pb-5
+ %li.gl-pb-3
= form.gitlab_ui_checkbox_component :feature_flag_events,
integration_webhook_event_human_name(:feature_flag_events),
help_text: s_('Webhooks|A feature flag is turned on or off.')
- %li.gl-pb-5
+ %li.gl-pb-3
= form.gitlab_ui_checkbox_component :releases_events,
integration_webhook_event_human_name(:releases_events),
help_text: s_('Webhooks|A release is created or updated.')
+ - if Feature.enabled?(:emoji_webhooks, hook.parent)
+ %li.gl-pb-5
+ - emoji_help_link = link_to s_('Which emoji events trigger webhooks'), help_page_path('user/project/integrations/webhook_events.md', anchor: 'emoji-events')
+ = form.gitlab_ui_checkbox_component :emoji_events,
+ integration_webhook_event_human_name(:emoji_events),
+ help_text: s_('Webhooks|An emoji is awarded or revoked. %{help_link}?').html_safe % { help_link: emoji_help_link }
+
.form-group
= form.label :enable_ssl_verification, s_('Webhooks|SSL verification'), class: 'label-bold checkbox'
%ul.list-unstyled
diff --git a/app/views/shared/web_hooks/_hook.html.haml b/app/views/shared/web_hooks/_hook.html.haml
index 155a7b1827f..50ce6552616 100644
--- a/app/views/shared/web_hooks/_hook.html.haml
+++ b/app/views/shared/web_hooks/_hook.html.haml
@@ -1,10 +1,10 @@
- sslStatus = hook.enable_ssl_verification ? _('enabled') : _('disabled')
- sslBadgeText = _('SSL Verification:') + ' ' + sslStatus
-%li
- .row
- .col-md-8.col-lg-7
- %strong.light-header
+%li.label-list-item
+ .gl-display-flex.lgl-align-items-center.row.gl-mx-n1
+ .col-md-8.col-lg-7.gl-px-3
+ .light-header.gl-mb-2
= hook.url
- if hook.rate_limited?
= gl_badge_tag(_('Disabled'), variant: :danger, size: :sm)
@@ -19,7 +19,7 @@
= gl_badge_tag(integration_webhook_event_human_name(trigger), size: :sm)
= gl_badge_tag(sslBadgeText, size: :sm)
- .col-md-4.col-lg-5.gl-mt-2.gl-display-flex.gl-md-justify-content-end.gl-align-items-baseline.gl-gap-3
+ .col-md-4.col-lg-5.gl-mt-2.gl-px-3.gl-gap-3.gl-display-flex.gl-md-justify-content-end.gl-align-items-baseline
= render 'shared/web_hooks/test_button', hook: hook, size: 'small'
= render Pajamas::ButtonComponent.new(href: edit_hook_path(hook), size: :small) do
= _('Edit')
diff --git a/app/views/shared/web_hooks/_index.html.haml b/app/views/shared/web_hooks/_index.html.haml
index 8a81e697a59..0ea6a0307ba 100644
--- a/app/views/shared/web_hooks/_index.html.haml
+++ b/app/views/shared/web_hooks/_index.html.haml
@@ -1,13 +1,24 @@
-%hr
-= render Pajamas::CardComponent.new(card_options: { id: 'webhooks-index' }, body_options: { class: 'gl-py-0'}) do |c|
+= render Pajamas::CardComponent.new(card_options: { id: 'webhooks-index', class: 'gl-new-card js-toggle-container' }, header_options: { class: 'gl-new-card-header'}, body_options: { class: 'gl-new-card-body'}) do |c|
- c.with_header do
- = hook_class.underscore.humanize.titleize.pluralize
- (#{hooks.size})
+ .gl-new-card-title-wrapper
+ %h3.gl-new-card-title
+ = hook_class.underscore.humanize.titleize.pluralize
+ %span.gl-new-card-count
+ = sprite_icon('hook', css_class: 'gl-mr-2')
+ #{hooks.size}
+ = render Pajamas::ButtonComponent.new(size: :small, button_options: { class: 'js-toggle-button js-toggle-content' }) do
+ = _('Add new webhook')
- c.with_body do
- - if hooks.any?
- %ul.content-list
- - hooks.each do |hook|
- = render 'shared/web_hooks/hook', hook: hook
- - else
- %p.text-center.gl-mt-3.gl-mb-3
- = _('No webhooks enabled. Select trigger events above.')
+ .gl-new-card-content
+ = gitlab_ui_form_for @hook, as: :hook, url: url, html: { class: 'js-webhook-form gl-new-card-add-form gl-mb-3 gl-display-none js-toggle-content' } do |f|
+ = render partial: partial, locals: { form: f, hook: @hook }
+ = f.submit _('Add webhook'), pajamas_button: true, data: { qa_selector: "create_webhook_button" }
+ = render Pajamas::ButtonComponent.new(button_options: { type: 'reset', class: 'js-webhook-edit-close gl-ml-2 js-toggle-button' }) do
+ = _('Cancel')
+ - if hooks.any?
+ %ul.content-list{ class: 'gl-my-n3!' }
+ - hooks.each do |hook|
+ = render 'shared/web_hooks/hook', hook: hook
+ - else
+ %p.gl-new-card-empty.gl-text-center
+ = _('No webhooks enabled. Select trigger events above.')
diff --git a/app/views/shared/web_hooks/_title_and_docs.html.haml b/app/views/shared/web_hooks/_title_and_docs.html.haml
index c220b46f70f..ae32dcea7cb 100644
--- a/app/views/shared/web_hooks/_title_and_docs.html.haml
+++ b/app/views/shared/web_hooks/_title_and_docs.html.haml
@@ -1,10 +1,12 @@
- webhooks_link_start = '<a href="%{url}">'.html_safe % { url: help_page_path(hook.help_path) }
-%h4.gl-mt-0
- = page_title
+.settings-sticky-header
+ .settings-sticky-header-inner
+ %h4.gl-my-0
+ = page_title
- if @project
- integrations_link_start = '<a href="%{url}">'.html_safe % { url: scoped_integrations_path(project: @project) }
- %p= _("%{webhooks_link_start}%{webhook_type}%{link_end} enable you to send notifications to web applications in response to events in a group or project. We recommend using an %{integrations_link_start}integration%{link_end} in preference to a webhook.").html_safe % { webhooks_link_start: webhooks_link_start, webhook_type: hook.pluralized_name, integrations_link_start: integrations_link_start, link_end: '</a>'.html_safe }
+ %p.gl-text-secondary= _("%{webhooks_link_start}%{webhook_type}%{link_end} enable you to send notifications to web applications in response to events in a group or project. We recommend using an %{integrations_link_start}integration%{link_end} in preference to a webhook.").html_safe % { webhooks_link_start: webhooks_link_start, webhook_type: hook.pluralized_name, integrations_link_start: integrations_link_start, link_end: '</a>'.html_safe }
- else
- %p= _("%{webhooks_link_start}%{webhook_type}%{link_end} enable you to send notifications to web applications in response to events in a group or project.").html_safe % { webhooks_link_start: webhooks_link_start, webhook_type: hook.pluralized_name, link_end: '</a>'.html_safe }
+ %p.gl-text-secondary= _("%{webhooks_link_start}%{webhook_type}%{link_end} enable you to send notifications to web applications in response to events in a group or project.").html_safe % { webhooks_link_start: webhooks_link_start, webhook_type: hook.pluralized_name, link_end: '</a>'.html_safe }
diff --git a/app/views/shared/web_hooks/_web_hook_disabled_alert.html.haml b/app/views/shared/web_hooks/_web_hook_disabled_alert.html.haml
index cbbb2f51fd5..1580fc0bd6d 100644
--- a/app/views/shared/web_hooks/_web_hook_disabled_alert.html.haml
+++ b/app/views/shared/web_hooks/_web_hook_disabled_alert.html.haml
@@ -10,4 +10,4 @@
= succeed '.' do
= link_to _('Learn more'), help_page_path('user/project/integrations/webhooks', anchor: 'troubleshooting'), target: '_blank', rel: 'noopener noreferrer'
- c.with_actions do
- = link_to s_('Webhooks|Go to webhooks'), project_hooks_path(@project, anchor: 'webhooks-index'), class: 'btn gl-alert-action btn-confirm gl-button'
+ = link_button_to s_('Webhooks|Go to webhooks'), project_hooks_path(@project, anchor: 'webhooks-index'), class: 'gl-alert-action', variant: :confirm
diff --git a/app/views/shared/wikis/_main_links.html.haml b/app/views/shared/wikis/_main_links.html.haml
index c1fd8c48c60..41831c95198 100644
--- a/app/views/shared/wikis/_main_links.html.haml
+++ b/app/views/shared/wikis/_main_links.html.haml
@@ -1,6 +1,6 @@
- if @page&.persisted?
- = link_to wiki_page_path(@wiki, @page, action: :history), class: "btn gl-button btn-default", role: "button", data: { qa_selector: 'page_history_button' } do
+ = link_button_to wiki_page_path(@wiki, @page, action: :history), role: "button", data: { qa_selector: 'page_history_button' } do
= s_("Wiki|Page history")
- if can?(current_user, :create_wiki, @wiki.container)
- = link_to wiki_path(@wiki, action: :new), class: "btn gl-button btn-confirm-secondary", role: "button", data: { qa_selector: 'new_page_button' } do
+ = link_button_to wiki_path(@wiki, action: :new), role: "button", data: { qa_selector: 'new_page_button' }, variant: :confirm, category: :secondary do
= s_("Wiki|New page")
diff --git a/app/views/shared/wikis/_sidebar.html.haml b/app/views/shared/wikis/_sidebar.html.haml
index 8b8c981da96..a34827602ab 100644
--- a/app/views/shared/wikis/_sidebar.html.haml
+++ b/app/views/shared/wikis/_sidebar.html.haml
@@ -32,5 +32,5 @@
= render partial: entry.to_partial_path, object: entry, locals: { context: 'sidebar' }
.block.w-100
- if @sidebar_limited
- = link_to wiki_path(@wiki, action: :pages), class: 'btn gl-button btn-block', data: { qa_selector: 'view_all_pages_button' } do
+ = link_button_to wiki_path(@wiki, action: :pages), data: { qa_selector: 'view_all_pages_button' }, block: true do
= s_("Wiki|View All Pages")
diff --git a/app/views/shared/wikis/diff.html.haml b/app/views/shared/wikis/diff.html.haml
index ee6c7f307a7..67772ec40c1 100644
--- a/app/views/shared/wikis/diff.html.haml
+++ b/app/views/shared/wikis/diff.html.haml
@@ -12,7 +12,7 @@
= _('Changes')
.nav-controls.pb-md-3.pb-lg-0
- = link_to wiki_page_path(@wiki, @page, action: :history), class: 'btn gl-button', role: 'button', data: { qa_selector: 'page_history_button' } do
+ = link_button_to wiki_page_path(@wiki, @page, action: :history), role: 'button', data: { qa_selector: 'page_history_button' } do
= s_('Wiki|Page history')
.page-content-header
diff --git a/app/views/shared/wikis/pages.html.haml b/app/views/shared/wikis/pages.html.haml
index f35649d031c..4656bb8d453 100644
--- a/app/views/shared/wikis/pages.html.haml
+++ b/app/views/shared/wikis/pages.html.haml
@@ -8,8 +8,7 @@
= s_("Wiki|Wiki Pages")
.nav-controls.pb-md-3.pb-lg-0
- = link_to wiki_path(@wiki, action: :git_access), class: 'btn gl-button' do
- = sprite_icon('download')
+ = link_button_to wiki_path(@wiki, action: :git_access), icon: 'download' do
= _("Clone repository")
.dropdown.inline.wiki-sort-dropdown
diff --git a/app/views/shared/wikis/show.html.haml b/app/views/shared/wikis/show.html.haml
index 3841113231c..28699ca27f3 100644
--- a/app/views/shared/wikis/show.html.haml
+++ b/app/views/shared/wikis/show.html.haml
@@ -14,18 +14,23 @@
= render 'shared/wikis/main_links'
- if @page.historical?
- .warning_message
- = s_("WikiHistoricalPage|This is an old version of this page.")
- - most_recent_link = link_to s_("WikiHistoricalPage|most recent version"), wiki_page_path(@wiki, @page)
- - history_link = link_to s_("WikiHistoricalPage|history"), wiki_page_path(@wiki, @page, action: :history)
- = (s_("WikiHistoricalPage|You can view the %{most_recent_link} or browse the %{history_link}.") % { most_recent_link: most_recent_link, history_link: history_link }).html_safe
+ = render Pajamas::AlertComponent.new(variant: :warning,
+ dismissible: false) do |c|
+ - c.with_body do
+ = s_("WikiHistoricalPage|This is an old version of this page.")
+ - c.with_actions do
+ .gl-display-flex.gl-gap-3
+ = render Pajamas::ButtonComponent.new(category: :primary, variant: :confirm, href: wiki_page_path(@wiki, @page)) do
+ = s_('WikiHistoricalPage|Go to most recent version')
+ = render Pajamas::ButtonComponent.new(href: wiki_page_path(@wiki, @page, action: :history)) do
+ = s_('WikiHistoricalPage|Browse history')
.gl-mt-5.gl-mb-3
.gl-display-flex.gl-justify-content-space-between
%h2.gl-mt-0.gl-mb-5{ data: { qa_selector: 'wiki_page_title', testid: 'wiki_page_title' } }= @page.human_title
%div
- if can?(current_user, :create_wiki, @wiki.container) && @page.latest? && @valid_encoding
- = link_to sprite_icon('pencil', css_class: 'gl-icon'), wiki_page_path(@wiki, @page, action: :edit), title: 'Edit', role: "button", class: 'btn gl-button btn-icon btn-default js-wiki-edit', data: { qa_selector: 'edit_page_button', testid: 'wiki_edit_button' }
+ = render Pajamas::ButtonComponent.new(href: wiki_page_path(@wiki, @page, action: :edit), icon: 'pencil', button_options: { class: 'js-wiki-edit', title: "Edit", data: { qa_selector: 'edit_page_button', testid: 'wiki_edit_button' }})
.js-async-wiki-page-content.md.gl-pt-2{ data: { qa_selector: 'wiki_page_content', testid: 'wiki-page-content', tracking_context: wiki_page_tracking_context(@page).to_json, get_wiki_content_url: wiki_page_render_api_endpoint(@page) } }
diff --git a/app/views/users/_follow_user.html.haml b/app/views/users/_follow_user.html.haml
new file mode 100644
index 00000000000..3ee8c81496c
--- /dev/null
+++ b/app/views/users/_follow_user.html.haml
@@ -0,0 +1,11 @@
+- link_classes = "flex-grow-1 gl-display-inline-block"
+
+- if current_user&.following_users_allowed?(@user)
+ - if current_user.following?(@user)
+ = form_tag user_unfollow_path(@user, :json), class: link_classes do
+ = render Pajamas::ButtonComponent.new(type: :submit, button_options: { class: 'gl-w-full', data: { track_action: 'click_button', track_label: 'unfollow_from_profile' } }) do
+ = _('Unfollow')
+ - else
+ = form_tag user_follow_path(@user, :json), class: link_classes do
+ = render Pajamas::ButtonComponent.new(variant: :confirm, type: :submit, button_options: { class: 'gl-w-full', data: { qa_selector: 'follow_user_link', track_action: 'click_button', track_label: 'follow_from_profile' } }) do
+ = _('Follow')
diff --git a/app/views/users/_overview.html.haml b/app/views/users/_overview.html.haml
index ce82a5e1614..0b76ed6c086 100644
--- a/app/views/users/_overview.html.haml
+++ b/app/views/users/_overview.html.haml
@@ -13,12 +13,10 @@
.col-12.col-md-10.col-lg-8.gl-my-6
.gl-display-flex
%ol.breadcrumb.gl-breadcrumb-list.gl-mb-4
- %li.breadcrumb-item.gl-breadcrumb-item
+ %li.gl-breadcrumb-item
= link_to project_path(@user.user_project) do
= @user.username
- %span.gl-breadcrumb-separator
- = sprite_icon("chevron-right", size: 16)
- %li.breadcrumb-item.gl-breadcrumb-item
+ %li.gl-breadcrumb-item
= link_to @user.user_readme.path, @user.user_project.readme_url
- if current_user == @user
.gl-ml-auto
diff --git a/app/views/users/_profile_basic_info.html.haml b/app/views/users/_profile_basic_info.html.haml
index 7c50031598c..6de9e80008e 100644
--- a/app/views/users/_profile_basic_info.html.haml
+++ b/app/views/users/_profile_basic_info.html.haml
@@ -2,8 +2,9 @@
= render 'middle_dot_divider', stacking: true do
@#{@user.username}
- if can?(current_user, :read_user_profile, @user)
- = render 'middle_dot_divider', stacking: true do
- = s_('UserProfile|User ID: %{id}') % { id: @user.id }
- = clipboard_button(title: s_('UserProfile|Copy user ID'), text: @user.id)
+ - unless Feature.enabled?(:user_profile_overflow_menu_vue)
+ = render 'middle_dot_divider', stacking: true do
+ = s_('UserProfile|User ID: %{id}') % { id: @user.id }
+ = clipboard_button(title: s_('UserProfile|Copy user ID'), text: @user.id)
= render 'middle_dot_divider', stacking: true do
= s_('Member since %{date}') % { date: l(@user.created_at.to_date, format: :long) }
diff --git a/app/views/users/_view_gpg_keys.html.haml b/app/views/users/_view_gpg_keys.html.haml
new file mode 100644
index 00000000000..aa0f69ffe3c
--- /dev/null
+++ b/app/views/users/_view_gpg_keys.html.haml
@@ -0,0 +1,5 @@
+- verified_gpg_keys = @user.gpg_keys.select(&:verified?)
+- if verified_gpg_keys.any?
+ = render Pajamas::ButtonComponent.new(href: user_gpg_keys_path,
+ icon: 'key',
+ button_options: { class: 'gl-flex-grow-1 gl-mx-1 has-tooltip', title: n_('View public GPG key', 'View public GPG keys', verified_gpg_keys.length), data: { toggle: 'tooltip', placement: 'bottom', container: 'body' }})
diff --git a/app/views/users/_view_user_in_admin_area.html.haml b/app/views/users/_view_user_in_admin_area.html.haml
new file mode 100644
index 00000000000..b13f22956f6
--- /dev/null
+++ b/app/views/users/_view_user_in_admin_area.html.haml
@@ -0,0 +1,4 @@
+- if current_user && current_user.admin?
+ = render Pajamas::ButtonComponent.new(href: [:admin, @user],
+ icon: 'user',
+ button_options: { class: 'gl-flex-grow-1 gl-mx-1 has-tooltip', title: s_('UserProfile|View user in admin area'), data: { toggle: 'tooltip', placement: 'bottom', container: 'body' } })
diff --git a/app/views/users/calendar_activities.html.haml b/app/views/users/calendar_activities.html.haml
index 3571031fbfa..e98dd87a307 100644
--- a/app/views/users/calendar_activities.html.haml
+++ b/app/views/users/calendar_activities.html.haml
@@ -1,5 +1,5 @@
%h4.prepend-top-20
- = html_escape(_("Contributions for %{calendar_date}")) % { calendar_date: tag.strong(@calendar_date.to_s(:medium)) }
+ = html_escape(_("Contributions for %{calendar_date}")) % { calendar_date: tag.strong(@calendar_date.to_fs(:medium)) }
- if @events.any?
%ul.bordered-list
diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml
index 4113a276416..380d6aacb84 100644
--- a/app/views/users/show.html.haml
+++ b/app/views/users/show.html.haml
@@ -5,7 +5,6 @@
- page_description @user.bio unless @user.blocked? || !@user.confirmed?
- page_itemtype 'http://schema.org/Person'
- add_page_specific_style 'page_bundles/profile'
-- link_classes = "flex-grow-1 mx-1 "
- if show_super_sidebar?
- @left_sidebar = true
- @force_desktop_expanded_sidebar = true
@@ -17,35 +16,32 @@
.user-profile
.cover-block.user-cover-block.gl-border-t.gl-border-b.gl-mt-n1
%div{ class: container_class }
- = render layout: 'users/cover_controls' do
- - if @user == current_user
- = render Pajamas::ButtonComponent.new(href: profile_path,
- icon: 'pencil',
- button_options: { class: 'gl-flex-grow-1 gl-mx-1 has-tooltip', title: s_('UserProfile|Edit profile'), 'aria-label': 'Edit profile', data: { toggle: 'tooltip', placement: 'bottom', container: 'body' }})
- - elsif current_user
- #js-report-abuse{ data: { report_abuse_path: add_category_abuse_reports_path, reported_user_id: @user.id, reported_from_url: user_url(@user) } }
- - verified_gpg_keys = @user.gpg_keys.select(&:verified?)
- - if verified_gpg_keys.any?
- = render Pajamas::ButtonComponent.new(href: user_gpg_keys_path,
- icon: 'key',
- button_options: { class: 'gl-flex-grow-1 gl-mx-1 has-tooltip', title: n_('View public GPG key', 'View public GPG keys', verified_gpg_keys.length), data: { toggle: 'tooltip', placement: 'bottom', container: 'body' }})
- - if can?(current_user, :read_user_profile, @user)
- = render Pajamas::ButtonComponent.new(href: user_path(@user, rss_url_options),
- icon: 'rss',
- button_options: { class: 'gl-flex-grow-1 gl-mx-1 has-tooltip', title: s_('UserProfile|Subscribe'), data: { toggle: 'tooltip', placement: 'bottom', container: 'body' }})
- - if current_user && current_user.admin?
- = render Pajamas::ButtonComponent.new(href: [:admin, @user],
- icon: 'user',
- button_options: { class: 'gl-flex-grow-1 gl-mx-1 has-tooltip', title: s_('UserProfile|View user in admin area'), data: {toggle: 'tooltip', placement: 'bottom', container: 'body'}})
- - if current_user && current_user.following_users_allowed?(@user)
- - if current_user.following?(@user)
- = form_tag user_unfollow_path(@user, :json), class: link_classes + 'gl-display-inline-block' do
- = render Pajamas::ButtonComponent.new(type: :submit, button_options: { class: 'gl-w-full', data: { track_action: 'click_button', track_label: 'unfollow_from_profile' } }) do
- = _('Unfollow')
- - else
- = form_tag user_follow_path(@user, :json), class: link_classes + 'gl-display-inline-block' do
- = render Pajamas::ButtonComponent.new(variant: :confirm, type: :submit, button_options: { class: 'gl-w-full', data: { qa_selector: 'follow_user_link', track_action: 'click_button', track_label: 'follow_from_profile' } }) do
- = _('Follow')
+ - if Feature.enabled?(:user_profile_overflow_menu_vue)
+ .cover-controls.d-flex.px-2.pb-4.d-sm-block.p-sm-0
+ = render 'users/follow_user'
+ -# The following edit button is mutually exclusive to the follow user button, they won't be shown together
+ - if @user == current_user
+ = render Pajamas::ButtonComponent.new(href: profile_path,
+ button_options: { class: 'gl-flex-grow-1', title: s_('UserProfile|Edit profile') }) do
+ = s_("UserProfile|Edit profile")
+ = render 'users/view_gpg_keys'
+ = render 'users/view_user_in_admin_area'
+ .js-user-profile-actions{ data: { user_id: @user.id } }
+ - else
+ = render layout: 'users/cover_controls' do
+ - if @user == current_user
+ = render Pajamas::ButtonComponent.new(href: profile_path,
+ icon: 'pencil',
+ button_options: { class: 'gl-flex-grow-1 gl-mx-1 has-tooltip', title: s_('UserProfile|Edit profile'), 'aria-label': 'Edit profile', data: { toggle: 'tooltip', placement: 'bottom', container: 'body' }})
+ - elsif current_user
+ #js-report-abuse{ data: { report_abuse_path: add_category_abuse_reports_path, reported_user_id: @user.id, reported_from_url: user_url(@user) } }
+ = render 'users/view_gpg_keys'
+ - if can?(current_user, :read_user_profile, @user)
+ = render Pajamas::ButtonComponent.new(href: user_path(@user, rss_url_options),
+ icon: 'rss',
+ button_options: { class: 'gl-flex-grow-1 gl-mx-1 has-tooltip', title: s_('UserProfile|Subscribe'), data: { toggle: 'tooltip', placement: 'bottom', container: 'body' }})
+ = render 'users/view_user_in_admin_area'
+ = render 'users/follow_user'
.profile-header{ class: [('with-no-profile-tabs' if profile_tabs.empty?), ('gl-mb-4!' if show_super_sidebar?)] }
.gl-display-inline-block.gl-mx-8.gl-vertical-align-top
diff --git a/app/workers/all_queues.yml b/app/workers/all_queues.yml
index f8aa06943ee..6f6fd9ddb65 100644
--- a/app/workers/all_queues.yml
+++ b/app/workers/all_queues.yml
@@ -318,15 +318,6 @@
:weight: 1
:idempotent: false
:tags: []
-- :name: cronjob:clusters_integrations_check_prometheus_health
- :worker_name: Clusters::Integrations::CheckPrometheusHealthWorker
- :feature_category: :incident_management
- :has_external_dependencies: true
- :urgency: :low
- :resource_boundary: :unknown
- :weight: 1
- :idempotent: true
- :tags: []
- :name: cronjob:container_expiration_policy
:worker_name: ContainerExpirationPolicyWorker
:feature_category: :container_registry
@@ -561,15 +552,6 @@
:weight: 1
:idempotent: false
:tags: []
-- :name: cronjob:metrics_dashboard_schedule_annotations_prune
- :worker_name: Metrics::Dashboard::ScheduleAnnotationsPruneWorker
- :feature_category: :metrics
- :has_external_dependencies: false
- :urgency: :low
- :resource_boundary: :unknown
- :weight: 1
- :idempotent: true
- :tags: []
- :name: cronjob:metrics_global_metrics_update
:worker_name: Metrics::GlobalMetricsUpdateWorker
:feature_category: :metrics
@@ -1740,15 +1722,6 @@
:weight: 1
:idempotent: true
:tags: []
-- :name: package_repositories:packages_debian_process_changes
- :worker_name: Packages::Debian::ProcessChangesWorker
- :feature_category: :package_registry
- :has_external_dependencies: false
- :urgency: :low
- :resource_boundary: :unknown
- :weight: 1
- :idempotent: true
- :tags: []
- :name: package_repositories:packages_debian_process_package_file
:worker_name: Packages::Debian::ProcessPackageFileWorker
:feature_category: :package_registry
@@ -2001,6 +1974,15 @@
:weight: 3
:idempotent: false
:tags: []
+- :name: pipeline_default:ci_pipeline_cleanup_ref
+ :worker_name: Ci::PipelineCleanupRefWorker
+ :feature_category: :continuous_integration
+ :has_external_dependencies: false
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 3
+ :idempotent: true
+ :tags: []
- :name: pipeline_default:ci_retry_pipeline
:worker_name: Ci::RetryPipelineWorker
:feature_category: :continuous_integration
@@ -2424,6 +2406,15 @@
:weight: 1
:idempotent: true
:tags: []
+- :name: bulk_imports_finish_batched_pipeline
+ :worker_name: BulkImports::FinishBatchedPipelineWorker
+ :feature_category: :importers
+ :has_external_dependencies: false
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: bulk_imports_finish_batched_relation_export
:worker_name: BulkImports::FinishBatchedRelationExportWorker
:feature_category: :importers
@@ -2442,6 +2433,15 @@
:weight: 1
:idempotent: false
:tags: []
+- :name: bulk_imports_pipeline_batch
+ :worker_name: BulkImports::PipelineBatchWorker
+ :feature_category: :importers
+ :has_external_dependencies: true
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: false
+ :tags: []
- :name: bulk_imports_relation_batch_export
:worker_name: BulkImports::RelationBatchExportWorker
:feature_category: :importers
@@ -2856,6 +2856,15 @@
:weight: 1
:idempotent: false
:tags: []
+- :name: integrations_group_mention
+ :worker_name: Integrations::GroupMentionWorker
+ :feature_category: :integrations
+ :has_external_dependencies: true
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: integrations_irker
:worker_name: Integrations::IrkerWorker
:feature_category: :integrations
@@ -2973,6 +2982,15 @@
:weight: 1
:idempotent: true
:tags: []
+- :name: merge_requests_cleanup_ref
+ :worker_name: MergeRequests::CleanupRefWorker
+ :feature_category: :code_review_workflow
+ :has_external_dependencies: false
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: merge_requests_close_issue
:worker_name: MergeRequests::CloseIssueWorker
:feature_category: :code_review_workflow
@@ -3072,24 +3090,6 @@
:weight: 1
:idempotent: true
:tags: []
-- :name: metrics_dashboard_prune_old_annotations
- :worker_name: Metrics::Dashboard::PruneOldAnnotationsWorker
- :feature_category: :metrics
- :has_external_dependencies: false
- :urgency: :low
- :resource_boundary: :unknown
- :weight: 1
- :idempotent: true
- :tags: []
-- :name: metrics_dashboard_sync_dashboards
- :worker_name: Metrics::Dashboard::SyncDashboardsWorker
- :feature_category: :metrics
- :has_external_dependencies: false
- :urgency: :low
- :resource_boundary: :unknown
- :weight: 1
- :idempotent: true
- :tags: []
- :name: migrate_external_diffs
:worker_name: MigrateExternalDiffsWorker
:feature_category: :code_review_workflow
@@ -3486,6 +3486,15 @@
:weight: 2
:idempotent: false
:tags: []
+- :name: redis_migration
+ :worker_name: RedisMigrationWorker
+ :feature_category: :redis
+ :has_external_dependencies: false
+ :urgency: :throttled
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: releases_create_evidence
:worker_name: Releases::CreateEvidenceWorker
:feature_category: :release_evidence
diff --git a/app/workers/bulk_imports/export_request_worker.rb b/app/workers/bulk_imports/export_request_worker.rb
index 530419dac26..44759916f99 100644
--- a/app/workers/bulk_imports/export_request_worker.rb
+++ b/app/workers/bulk_imports/export_request_worker.rb
@@ -15,35 +15,40 @@ module BulkImports
end
def perform(entity_id)
- entity = BulkImports::Entity.find(entity_id)
+ @entity = BulkImports::Entity.find(entity_id)
- entity.update!(source_xid: entity_source_xid(entity)) if entity.source_xid.nil?
-
- request_export(entity)
+ set_source_xid
+ request_export
BulkImports::EntityWorker.perform_async(entity_id)
end
def perform_failure(exception, entity_id)
- entity = BulkImports::Entity.find(entity_id)
+ @entity = BulkImports::Entity.find(entity_id)
- log_and_fail(exception, entity)
+ log_and_fail(exception)
end
private
- def request_export(entity)
- http_client(entity).post(entity.export_relations_url_path)
+ attr_reader :entity
+
+ def set_source_xid
+ entity.update!(source_xid: entity_source_xid) if entity.source_xid.nil?
+ end
+
+ def request_export
+ http_client.post(export_url)
end
- def http_client(entity)
+ def http_client
@client ||= Clients::HTTP.new(
url: entity.bulk_import.configuration.url,
token: entity.bulk_import.configuration.access_token
)
end
- def failure_attributes(exception, entity)
+ def failure_attributes(exception)
{
bulk_import_entity_id: entity.id,
pipeline_class: 'ExportRequestWorker',
@@ -53,23 +58,20 @@ module BulkImports
}
end
- def graphql_client(entity)
+ def graphql_client
@graphql_client ||= BulkImports::Clients::Graphql.new(
url: entity.bulk_import.configuration.url,
token: entity.bulk_import.configuration.access_token
)
end
- def entity_source_xid(entity)
- query = entity_query(entity)
- client = graphql_client(entity)
-
- response = client.execute(
- client.parse(query.to_s),
+ def entity_source_xid
+ response = graphql_client.execute(
+ graphql_client.parse(entity_query.to_s),
{ full_path: entity.source_full_path }
).original_hash
- ::GlobalID.parse(response.dig(*query.data_path, 'id')).model_id
+ ::GlobalID.parse(response.dig(*entity_query.data_path, 'id')).model_id
rescue StandardError => e
log_exception(e,
{
@@ -86,12 +88,12 @@ module BulkImports
nil
end
- def entity_query(entity)
- if entity.group?
- BulkImports::Groups::Graphql::GetGroupQuery.new(context: nil)
- else
- BulkImports::Projects::Graphql::GetProjectQuery.new(context: nil)
- end
+ def entity_query
+ @entity_query ||= if entity.group?
+ BulkImports::Groups::Graphql::GetGroupQuery.new(context: nil)
+ else
+ BulkImports::Projects::Graphql::GetProjectQuery.new(context: nil)
+ end
end
def logger
@@ -104,7 +106,7 @@ module BulkImports
logger.error(structured_payload(payload))
end
- def log_and_fail(exception, entity)
+ def log_and_fail(exception)
log_exception(exception,
{
bulk_import_entity_id: entity.id,
@@ -117,9 +119,13 @@ module BulkImports
}
)
- BulkImports::Failure.create(failure_attributes(exception, entity))
+ BulkImports::Failure.create(failure_attributes(exception))
entity.fail_op!
end
+
+ def export_url
+ entity.export_relations_url_path(batched: Feature.enabled?(:bulk_imports_batched_import_export))
+ end
end
end
diff --git a/app/workers/bulk_imports/finish_batched_pipeline_worker.rb b/app/workers/bulk_imports/finish_batched_pipeline_worker.rb
new file mode 100644
index 00000000000..4200d0e4a0f
--- /dev/null
+++ b/app/workers/bulk_imports/finish_batched_pipeline_worker.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+module BulkImports
+ class FinishBatchedPipelineWorker
+ include ApplicationWorker
+ include ExceptionBacktrace
+
+ REQUEUE_DELAY = 5.seconds
+
+ idempotent!
+ deduplicate :until_executing
+ data_consistency :always # rubocop:disable SidekiqLoadBalancing/WorkerDataConsistency
+ feature_category :importers
+
+ def perform(pipeline_tracker_id)
+ @tracker = Tracker.find(pipeline_tracker_id)
+
+ return unless tracker.batched?
+ return unless tracker.started?
+ return re_enqueue if import_in_progress?
+
+ if tracker.stale?
+ tracker.batches.map(&:fail_op!)
+ tracker.fail_op!
+ else
+ tracker.finish!
+ end
+
+ ensure
+ ::BulkImports::EntityWorker.perform_async(tracker.entity.id, tracker.stage)
+ end
+
+ private
+
+ attr_reader :tracker
+
+ def re_enqueue
+ self.class.perform_in(REQUEUE_DELAY, tracker.id)
+ end
+
+ def import_in_progress?
+ tracker.batches.any?(&:started?)
+ end
+ end
+end
diff --git a/app/workers/bulk_imports/finish_batched_relation_export_worker.rb b/app/workers/bulk_imports/finish_batched_relation_export_worker.rb
index aa7bbffa732..92a33a971e7 100644
--- a/app/workers/bulk_imports/finish_batched_relation_export_worker.rb
+++ b/app/workers/bulk_imports/finish_batched_relation_export_worker.rb
@@ -5,7 +5,7 @@ module BulkImports
include ApplicationWorker
idempotent!
- data_consistency :always # rubocop:disable SidekiqLoadBalancing/WorkerDataConsistency
+ data_consistency :sticky
feature_category :importers
REENQUEUE_DELAY = 5.seconds
diff --git a/app/workers/bulk_imports/pipeline_batch_worker.rb b/app/workers/bulk_imports/pipeline_batch_worker.rb
new file mode 100644
index 00000000000..378eff99b52
--- /dev/null
+++ b/app/workers/bulk_imports/pipeline_batch_worker.rb
@@ -0,0 +1,81 @@
+# frozen_string_literal: true
+
+module BulkImports
+ class PipelineBatchWorker # rubocop:disable Scalability/IdempotentWorker
+ include ApplicationWorker
+ include ExclusiveLeaseGuard
+
+ data_consistency :always # rubocop:disable SidekiqLoadBalancing/WorkerDataConsistency
+ feature_category :importers
+ sidekiq_options retry: false, dead: false
+ worker_has_external_dependencies!
+
+ def perform(batch_id)
+ @batch = ::BulkImports::BatchTracker.find(batch_id)
+ @tracker = @batch.tracker
+
+ try_obtain_lease { run }
+ ensure
+ ::BulkImports::FinishBatchedPipelineWorker.perform_async(tracker.id)
+ end
+
+ private
+
+ attr_reader :batch, :tracker
+
+ def run
+ return batch.skip! if tracker.failed? || tracker.finished?
+
+ batch.start!
+ tracker.pipeline_class.new(context).run
+ batch.finish!
+ rescue BulkImports::RetryPipelineError => e
+ retry_batch(e)
+ rescue StandardError => e
+ fail_batch(e)
+ end
+
+ def fail_batch(exception)
+ batch.fail_op!
+
+ Gitlab::ErrorTracking.track_exception(
+ exception,
+ batch_id: batch.id,
+ tracker_id: tracker.id,
+ pipeline_class: tracker.pipeline_name,
+ pipeline_step: 'pipeline_batch_worker_run'
+ )
+
+ BulkImports::Failure.create(
+ bulk_import_entity_id: batch.tracker.entity.id,
+ pipeline_class: tracker.pipeline_name,
+ pipeline_step: 'pipeline_batch_worker_run',
+ exception_class: exception.class.to_s,
+ exception_message: exception.message.truncate(255),
+ correlation_id_value: Labkit::Correlation::CorrelationId.current_or_new_id
+ )
+ end
+
+ def context
+ @context ||= ::BulkImports::Pipeline::Context.new(tracker, batch_number: batch.batch_number)
+ end
+
+ def retry_batch(exception)
+ batch.retry!
+
+ re_enqueue(exception.retry_delay)
+ end
+
+ def lease_timeout
+ 30
+ end
+
+ def lease_key
+ "gitlab:bulk_imports:pipeline_batch_worker:#{batch.id}"
+ end
+
+ def re_enqueue(delay = FILE_EXTRACTION_PIPELINE_PERFORM_DELAY)
+ self.class.perform_in(delay, batch.id)
+ end
+ end
+end
diff --git a/app/workers/bulk_imports/pipeline_worker.rb b/app/workers/bulk_imports/pipeline_worker.rb
index f03e0bc0656..e0db18cb987 100644
--- a/app/workers/bulk_imports/pipeline_worker.rb
+++ b/app/workers/bulk_imports/pipeline_worker.rb
@@ -31,7 +31,6 @@ module BulkImports
fail_tracker(StandardError.new(message)) unless pipeline_tracker.finished? || pipeline_tracker.skipped?
end
end
-
ensure
::BulkImports::EntityWorker.perform_async(entity_id, stage)
end
@@ -49,9 +48,17 @@ module BulkImports
return re_enqueue if export_empty? || export_started?
- pipeline_tracker.update!(status_event: 'start', jid: jid)
- pipeline_tracker.pipeline_class.new(context).run
- pipeline_tracker.finish!
+ if file_extraction_pipeline? && export_status.batched?
+ pipeline_tracker.update!(status_event: 'start', jid: jid, batched: true)
+
+ return pipeline_tracker.finish! if export_status.batches_count < 1
+
+ enqueue_batches
+ else
+ pipeline_tracker.update!(status_event: 'start', jid: jid)
+ pipeline_tracker.pipeline_class.new(context).run
+ pipeline_tracker.finish!
+ end
rescue BulkImports::RetryPipelineError => e
retry_tracker(e)
rescue StandardError => e
@@ -179,5 +186,13 @@ module BulkImports
time_since_tracker_created > Pipeline::NDJSON_EXPORT_TIMEOUT
end
+
+ def enqueue_batches
+ 1.upto(export_status.batches_count) do |batch_number|
+ batch = pipeline_tracker.batches.find_or_create_by!(batch_number: batch_number) # rubocop:disable CodeReuse/ActiveRecord
+
+ ::BulkImports::PipelineBatchWorker.perform_async(batch.id)
+ end
+ end
end
end
diff --git a/app/workers/bulk_imports/relation_export_worker.rb b/app/workers/bulk_imports/relation_export_worker.rb
index b6693f0b07d..531edc6c7a7 100644
--- a/app/workers/bulk_imports/relation_export_worker.rb
+++ b/app/workers/bulk_imports/relation_export_worker.rb
@@ -18,9 +18,7 @@ module BulkImports
portable = portable(portable_id, portable_class)
config = BulkImports::FileTransfer.config_for(portable)
- if Feature.enabled?(:bulk_imports_batched_import_export) &&
- Gitlab::Utils.to_boolean(batched) &&
- config.batchable_relation?(relation)
+ if Gitlab::Utils.to_boolean(batched) && config.batchable_relation?(relation)
BatchedRelationExportService.new(user, portable, relation, jid).execute
else
RelationExportService.new(user, portable, relation, jid).execute
diff --git a/app/workers/ci/pipeline_cleanup_ref_worker.rb b/app/workers/ci/pipeline_cleanup_ref_worker.rb
new file mode 100644
index 00000000000..291e1090c18
--- /dev/null
+++ b/app/workers/ci/pipeline_cleanup_ref_worker.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+module Ci
+ class PipelineCleanupRefWorker
+ include ApplicationWorker
+ include Projects::RemoveRefs
+
+ sidekiq_options retry: 3
+ include PipelineQueue
+
+ idempotent!
+ deduplicate :until_executed, if_deduplicated: :reschedule_once, ttl: 1.minute
+ data_consistency :always # rubocop:disable SidekiqLoadBalancing/WorkerDataConsistency
+
+ urgency :low
+
+ # Even though this worker is de-duplicated we need to acquire lock
+ # on a project to avoid running many concurrent refs removals
+ #
+ # TODO: Once underlying fix is done we can remove `in_lock`
+ #
+ # Related to:
+ # - https://gitlab.com/gitlab-org/gitaly/-/issues/5368
+ # - https://gitlab.com/gitlab-org/gitaly/-/issues/5369
+ def perform(pipeline_id)
+ pipeline = Ci::Pipeline.find_by_id(pipeline_id)
+ return unless pipeline
+ return unless pipeline.persistent_ref.should_delete?
+
+ serialized_remove_refs(pipeline.project_id) do
+ pipeline.reset.persistent_ref.delete
+ end
+ end
+ end
+end
diff --git a/app/workers/clusters/integrations/check_prometheus_health_worker.rb b/app/workers/clusters/integrations/check_prometheus_health_worker.rb
deleted file mode 100644
index b65b3424c3a..00000000000
--- a/app/workers/clusters/integrations/check_prometheus_health_worker.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-module Clusters
- module Integrations
- class CheckPrometheusHealthWorker
- 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 :incident_management
- urgency :low
-
- idempotent!
- worker_has_external_dependencies!
-
- def perform; end
- end
- end
-end
diff --git a/app/workers/container_registry/cleanup_worker.rb b/app/workers/container_registry/cleanup_worker.rb
index 448a16ad309..9ec02dd613e 100644
--- a/app/workers/container_registry/cleanup_worker.rb
+++ b/app/workers/container_registry/cleanup_worker.rb
@@ -16,8 +16,6 @@ module ContainerRegistry
BATCH_SIZE = 200
def perform
- log_counts
-
reset_stale_deletes
delete_stale_ongoing_repair_details
@@ -54,26 +52,13 @@ module ContainerRegistry
end
def should_enqueue_record_detail_jobs?
- return false unless Gitlab.com?
+ return false unless Gitlab.com_except_jh?
return false unless Feature.enabled?(:registry_data_repair_worker)
return false unless ContainerRegistry::GitlabApiClient.supports_gitlab_api?
Project.pending_data_repair_analysis.exists?
end
- def log_counts
- ::Gitlab::Database::LoadBalancing::Session.current.use_replicas_for_read_queries do
- log_extra_metadata_on_done(
- :delete_scheduled_container_repositories_count,
- ContainerRepository.delete_scheduled.count
- )
- log_extra_metadata_on_done(
- :stale_delete_container_repositories_count,
- stale_delete_container_repositories.count
- )
- end
- end
-
def stale_delete_container_repositories
ContainerRepository.delete_ongoing.with_stale_delete_at(STALE_DELETE_THRESHOLD.ago)
end
diff --git a/app/workers/container_registry/record_data_repair_detail_worker.rb b/app/workers/container_registry/record_data_repair_detail_worker.rb
index 390481f8e01..3e40dbbb99a 100644
--- a/app/workers/container_registry/record_data_repair_detail_worker.rb
+++ b/app/workers/container_registry/record_data_repair_detail_worker.rb
@@ -17,7 +17,7 @@ module ContainerRegistry
LEASE_TIMEOUT = 1.hour.to_i
def perform_work
- return unless Gitlab.com?
+ return unless Gitlab.com_except_jh?
return unless next_project
return if next_project.container_registry_data_repair_detail
@@ -51,7 +51,7 @@ module ContainerRegistry
end
def remaining_work_count
- return 0 unless Gitlab.com?
+ return 0 unless Gitlab.com_except_jh?
return 0 unless Feature.enabled?(:registry_data_repair_worker)
return 0 unless ContainerRegistry::GitlabApiClient.supports_gitlab_api?
@@ -69,7 +69,7 @@ module ContainerRegistry
end
def next_project
- Project.pending_data_repair_analysis.first
+ Project.pending_data_repair_analysis.limit(max_running_jobs * 2).sample
end
strong_memoize_attr :next_project
diff --git a/app/workers/integrations/execute_worker.rb b/app/workers/integrations/execute_worker.rb
index 443f1d9fe8e..6fe1937a222 100644
--- a/app/workers/integrations/execute_worker.rb
+++ b/app/workers/integrations/execute_worker.rb
@@ -13,6 +13,8 @@ module Integrations
worker_has_external_dependencies!
def perform(hook_id, data)
+ return if ::Gitlab::SilentMode.enabled?
+
data = data.with_indifferent_access
integration = Integration.find_by_id(hook_id)
return unless integration
diff --git a/app/workers/integrations/group_mention_worker.rb b/app/workers/integrations/group_mention_worker.rb
new file mode 100644
index 00000000000..6cde1657ccd
--- /dev/null
+++ b/app/workers/integrations/group_mention_worker.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+module Integrations
+ class GroupMentionWorker
+ include ApplicationWorker
+
+ idempotent!
+ feature_category :integrations
+ deduplicate :until_executed
+ data_consistency :delayed
+ urgency :low
+
+ worker_has_external_dependencies!
+
+ def perform(args)
+ args = args.with_indifferent_access
+
+ mentionable_type = args[:mentionable_type]
+ mentionable_id = args[:mentionable_id]
+ hook_data = args[:hook_data]
+ is_confidential = args[:is_confidential]
+
+ mentionable = case mentionable_type
+ when 'Issue'
+ Issue.find(mentionable_id)
+ when 'MergeRequest'
+ MergeRequest.find(mentionable_id)
+ end
+
+ if mentionable.nil?
+ Sidekiq.logger.error(
+ message: 'Integrations::GroupMentionWorker: mentionable not supported',
+ mentionable_type: mentionable_type,
+ mentionable_id: mentionable_id
+ )
+ return
+ end
+
+ Integrations::GroupMentionService.new(mentionable, hook_data: hook_data, is_confidential: is_confidential).execute
+ end
+ end
+end
diff --git a/app/workers/merge_requests/cleanup_ref_worker.rb b/app/workers/merge_requests/cleanup_ref_worker.rb
new file mode 100644
index 00000000000..c714b976a2b
--- /dev/null
+++ b/app/workers/merge_requests/cleanup_ref_worker.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+module MergeRequests
+ class CleanupRefWorker
+ include ApplicationWorker
+ include Projects::RemoveRefs
+
+ sidekiq_options retry: 3
+ loggable_arguments 2
+ feature_category :code_review_workflow
+
+ idempotent!
+ deduplicate :until_executed, if_deduplicated: :reschedule_once, ttl: 1.minute
+ data_consistency :delayed
+
+ urgency :low
+
+ # Even though this worker is de-duplicated we need to acquire lock
+ # on a project to avoid running many concurrent refs removals
+ #
+ # TODO: Once underlying fix is done we can remove `in_lock`
+ #
+ # Related to:
+ # - https://gitlab.com/gitlab-org/gitaly/-/issues/5368
+ # - https://gitlab.com/gitlab-org/gitaly/-/issues/5369
+ def perform(merge_request_id, only)
+ merge_request = MergeRequest.find_by_id(merge_request_id)
+ return unless merge_request
+
+ serialized_remove_refs(merge_request.target_project_id) do
+ merge_request.cleanup_refs(only: only.to_sym)
+ end
+ end
+ end
+end
diff --git a/app/workers/merge_requests/mergeability_check_batch_worker.rb b/app/workers/merge_requests/mergeability_check_batch_worker.rb
index cbe34ac3790..f48e9c234ab 100644
--- a/app/workers/merge_requests/mergeability_check_batch_worker.rb
+++ b/app/workers/merge_requests/mergeability_check_batch_worker.rb
@@ -15,10 +15,16 @@ module MergeRequests
@logger ||= Sidekiq.logger
end
- def perform(merge_request_ids)
+ def perform(merge_request_ids, user_id)
merge_requests = MergeRequest.id_in(merge_request_ids)
+ user = User.find_by_id(user_id)
merge_requests.each do |merge_request|
+ # Skip projects that user doesn't have update_merge_request access
+ next if merge_status_recheck_not_allowed?(merge_request, user)
+
+ merge_request.mark_as_checking
+
result = merge_request.check_mergeability
next unless result&.error?
@@ -30,5 +36,12 @@ module MergeRequests
)
end
end
+
+ private
+
+ def merge_status_recheck_not_allowed?(merge_request, user)
+ ::Feature.enabled?(:restrict_merge_status_recheck, merge_request.project) &&
+ !Ability.allowed?(user, :update_merge_request, merge_request.project)
+ end
end
end
diff --git a/app/workers/metrics/dashboard/prune_old_annotations_worker.rb b/app/workers/metrics/dashboard/prune_old_annotations_worker.rb
deleted file mode 100644
index 5b34f85606d..00000000000
--- a/app/workers/metrics/dashboard/prune_old_annotations_worker.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-# frozen_string_literal: true
-
-module Metrics
- module Dashboard
- class PruneOldAnnotationsWorker
- include ApplicationWorker
-
- data_consistency :always
-
- sidekiq_options retry: 3
-
- DELETE_LIMIT = 10_000
- DEFAULT_CUT_OFF_PERIOD = 2.weeks
-
- feature_category :metrics
-
- idempotent! # in the scope of 24 hours
-
- def perform; end
- end
- end
-end
diff --git a/app/workers/metrics/dashboard/schedule_annotations_prune_worker.rb b/app/workers/metrics/dashboard/schedule_annotations_prune_worker.rb
deleted file mode 100644
index fe002ffa4a0..00000000000
--- a/app/workers/metrics/dashboard/schedule_annotations_prune_worker.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-# frozen_string_literal: true
-
-module Metrics
- module Dashboard
- class ScheduleAnnotationsPruneWorker
- 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 :metrics
-
- idempotent! # PruneOldAnnotationsWorker worker is idempotent in the scope of 24 hours
-
- def perform; end
- end
- end
-end
diff --git a/app/workers/metrics/dashboard/sync_dashboards_worker.rb b/app/workers/metrics/dashboard/sync_dashboards_worker.rb
deleted file mode 100644
index 668542e51a5..00000000000
--- a/app/workers/metrics/dashboard/sync_dashboards_worker.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-module Metrics
- module Dashboard
- class SyncDashboardsWorker
- include ApplicationWorker
-
- data_consistency :always
-
- sidekiq_options retry: 3
-
- feature_category :metrics
-
- idempotent!
-
- def perform(project_id); end
- end
- end
-end
diff --git a/app/workers/packages/debian/process_changes_worker.rb b/app/workers/packages/debian/process_changes_worker.rb
deleted file mode 100644
index 0a716c61203..00000000000
--- a/app/workers/packages/debian/process_changes_worker.rb
+++ /dev/null
@@ -1,46 +0,0 @@
-# frozen_string_literal: true
-
-module Packages
- module Debian
- class ProcessChangesWorker
- include ApplicationWorker
-
- data_consistency :always
- include Gitlab::Utils::StrongMemoize
-
- deduplicate :until_executed
- idempotent!
-
- queue_namespace :package_repositories
- feature_category :package_registry
-
- def perform(package_file_id, user_id)
- @package_file_id = package_file_id
- @user_id = user_id
-
- return unless package_file && user
-
- ::Packages::Debian::ProcessChangesService.new(package_file, user).execute
- rescue StandardError => e
- Gitlab::ErrorTracking.log_exception(e, package_file_id: @package_file_id, user_id: @user_id)
- package_file.destroy!
- end
-
- private
-
- attr_reader :package_file_id, :user_id
-
- def package_file
- strong_memoize(:package_file) do
- ::Packages::PackageFile.find_by_id(package_file_id)
- end
- end
-
- def user
- strong_memoize(:user) do
- ::User.find_by_id(user_id)
- end
- end
- end
- end
-end
diff --git a/app/workers/redis_migration_worker.rb b/app/workers/redis_migration_worker.rb
new file mode 100644
index 00000000000..bad9baeac70
--- /dev/null
+++ b/app/workers/redis_migration_worker.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+class RedisMigrationWorker
+ include ApplicationWorker
+
+ idempotent!
+ data_consistency :delayed
+ feature_category :redis
+ urgency :throttled
+ loggable_arguments 0
+
+ SCAN_START_STOP = '0'
+
+ def perform(job_class_name, cursor, options = {})
+ migrator = self.class.fetch_migrator!(job_class_name)
+
+ scan_size = options[:scan_size] || 1000
+ deadline = Time.now.utc + 3.minutes
+
+ while Time.now.utc < deadline
+ cursor, keys = migrator.redis.scan(cursor, match: migrator.scan_match_pattern, count: scan_size)
+
+ migrator.perform(keys) if keys.any?
+
+ sleep(0.01)
+ break if cursor == SCAN_START_STOP
+ end
+
+ self.class.perform_async(job_class_name, cursor, options) unless cursor == SCAN_START_STOP
+ end
+
+ class << self
+ def fetch_migrator!(job_class_name)
+ job_class = "Gitlab::BackgroundMigration::Redis::#{job_class_name}".safe_constantize
+ raise NotImplementedError, "#{job_class_name} does not exist" if job_class.nil?
+
+ job_class.new
+ end
+ end
+end
diff --git a/app/workers/run_pipeline_schedule_worker.rb b/app/workers/run_pipeline_schedule_worker.rb
index 4ca366efcad..dab92e16ee3 100644
--- a/app/workers/run_pipeline_schedule_worker.rb
+++ b/app/workers/run_pipeline_schedule_worker.rb
@@ -33,10 +33,15 @@ class RunPipelineScheduleWorker # rubocop:disable Scalability/IdempotentWorker
def run_pipeline_schedule(schedule, user)
response = Ci::CreatePipelineService
.new(schedule.project, user, ref: schedule.ref)
- .execute(:schedule, ignore_skip_ci: true, save_on_errors: false, schedule: schedule)
+ .execute(
+ :schedule,
+ save_on_errors: Feature.enabled?(:persist_failed_pipelines_from_schedules, schedule.project),
+ ignore_skip_ci: true, schedule: schedule
+ )
return response if response.payload.persisted?
+ # Remove with FF persist_failed_pipelines_from_schedules enabled, as corrupted yml is not longer logged
# This is a user operation error such as corrupted .gitlab-ci.yml. Log the error for debugging purpose.
log_extra_metadata_on_done(:pipeline_creation_error, response.message)
rescue StandardError => e
diff --git a/bin/audit-event-type b/bin/audit-event-type
index fec34724c7c..e9d72aaba46 100755
--- a/bin/audit-event-type
+++ b/bin/audit-event-type
@@ -11,9 +11,10 @@ require 'yaml'
require 'fileutils'
require 'uri'
require 'readline'
+require_relative '../config/bundler_setup'
+require 'gitlab/utils/all'
require_relative '../lib/gitlab/audit/type/shared' unless defined?(::Gitlab::Audit::Type::Shared)
-require_relative '../lib/gitlab/utils' unless defined?(::Gitlab::Utils)
module AuditEventTypeHelpers
Abort = Class.new(StandardError)
diff --git a/config/application.rb b/config/application.rb
index 7eeb75a73cd..1e2a6a69dc8 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -12,14 +12,13 @@ require 'action_mailer/railtie'
require 'action_cable/engine'
require 'rails/test_unit/railtie'
+require 'gitlab/utils/all'
+
Bundler.require(*Rails.groups)
module Gitlab
class Application < Rails::Application
- config.load_defaults 6.1
-
- config.active_support.hash_digest_class = ::OpenSSL::Digest::SHA256
-
+ config.load_defaults 7.0
# This section contains configuration from Rails upgrades to override the new defaults so that we
# keep existing behavior.
#
@@ -29,6 +28,22 @@ module Gitlab
#
# To switch a setting to the new default value, we just need to delete the specific line here.
+ # Rails 7.0
+ config.action_controller.raise_on_open_redirects = false
+ config.action_dispatch.return_only_request_media_type_on_content_type = true
+ config.action_mailer.smtp_timeout = nil # New default is 5
+ config.action_view.button_to_generates_button_tag = nil # New default is true
+ config.active_record.automatic_scope_inversing = nil # New default is true
+ config.active_record.verify_foreign_keys_for_fixtures = nil # New default is true
+ config.active_record.partial_inserts = true # New default is false
+ config.active_support.cache_format_version = nil # New default is 7.0
+ config.active_support.disable_to_s_conversion = false # New default is true
+ config.active_support.executor_around_test_case = nil # New default is true
+ config.active_support.isolation_level = nil # New default is thread
+ config.active_support.key_generator_hash_digest_class = nil # New default is OpenSSL::Digest::SHA256
+ config.active_support.remove_deprecated_time_with_zone_name = nil # New default is true
+ config.active_support.use_rfc4122_namespaced_uuids = nil # New default is true
+
# Rails 6.1
config.action_dispatch.cookies_same_site_protection = nil # New default is :lax
ActiveSupport.utc_to_local_returns_utc_offset_times = false
@@ -49,7 +64,6 @@ module Gitlab
ActiveSupport.to_time_preserves_timezone = false
require_dependency Rails.root.join('lib/gitlab')
- require_dependency Rails.root.join('lib/gitlab/utils')
require_dependency Rails.root.join('lib/gitlab/action_cable/config')
require_dependency Rails.root.join('lib/gitlab/redis/wrapper')
require_dependency Rails.root.join('lib/gitlab/redis/cache')
@@ -216,6 +230,9 @@ module Gitlab
sharedSecret
)
+ # This config option can be removed after Rails 7.1 by https://gitlab.com/gitlab-org/gitlab/-/issues/416270
+ config.active_support.use_rfc4122_namespaced_uuids = true
+
# Enable escaping HTML in JSON.
config.active_support.escape_html_entities_in_json = true
@@ -318,7 +335,6 @@ module Gitlab
config.assets.precompile << "page_bundles/project.css"
config.assets.precompile << "page_bundles/projects_edit.css"
config.assets.precompile << "page_bundles/projects_usage_quotas.css"
- config.assets.precompile << "page_bundles/prometheus.css"
config.assets.precompile << "page_bundles/promotions.css"
config.assets.precompile << "page_bundles/releases.css"
config.assets.precompile << "page_bundles/remote_development.css"
@@ -361,7 +377,6 @@ module Gitlab
# Import woff2 for fonts
config.assets.paths << "#{config.root}/node_modules/@gitlab/fonts/"
config.assets.precompile << "gitlab-sans/*.woff2"
- config.assets.precompile << "jetbrains-mono/*.woff2"
config.assets.precompile << "gitlab-mono/*.woff2"
# Import gitlab-svgs directly from vendored directory
@@ -546,15 +561,15 @@ module Gitlab
app.config.assets.precompile << LOOSE_APP_ASSETS
end
- # This empty initializer forces the :let_zeitwerk_take_over initializer to run before we load
+ # This empty initializer forces the :setup_main_autoloader initializer to run before we load
# initializers in config/initializers. This is done because autoloading before Zeitwerk takes
# over is deprecated but our initializers do a lot of autoloading.
# See https://gitlab.com/gitlab-org/gitlab/issues/197346 for more details
- initializer :move_initializers, before: :load_config_initializers, after: :let_zeitwerk_take_over do
+ initializer :move_initializers, before: :load_config_initializers, after: :setup_main_autoloader do
end
# We need this for initializers that need to be run before Zeitwerk is loaded
- initializer :before_zeitwerk, before: :let_zeitwerk_take_over, after: :prepend_helpers_path do
+ initializer :before_zeitwerk, before: :setup_main_autoloader, after: :prepend_helpers_path do
Dir[Rails.root.join('config/initializers_before_autoloader/*.rb')].sort.each do |initializer|
load_config_initializer(initializer)
end
@@ -627,7 +642,7 @@ module Gitlab
# [0]: https://github.com/rails/rails/commit/94d81c3c39e3ddc441c3af3f874e53b197cf3f54
# [1]: https://salsa.debian.org/ruby-team/rails/-/commit/5663e598b41dc4e2058db22e1ee0d678e5c483ba
#
- ActiveRecord::Base.yaml_column_permitted_classes = config.active_record.yaml_column_permitted_classes
+ ActiveRecord.yaml_column_permitted_classes = config.active_record.yaml_column_permitted_classes
# on_master_start yields immediately in unclustered environments and runs
# when the primary process is done initializing otherwise.
diff --git a/config/click_house.yml.example b/config/click_house.yml.example
new file mode 100644
index 00000000000..aa790115f10
--- /dev/null
+++ b/config/click_house.yml.example
@@ -0,0 +1,6 @@
+test:
+ main:
+ database: gitlab_clickhouse_test
+ url: 'http://localhost:8123'
+ username: clickhouse
+ password: clickhouse
diff --git a/config/database.yml.decomposed-clusterwide-postgresql b/config/database.yml.decomposed-clusterwide-postgresql
new file mode 100644
index 00000000000..6439788524e
--- /dev/null
+++ b/config/database.yml.decomposed-clusterwide-postgresql
@@ -0,0 +1,86 @@
+# Defaults
+
+defaults: &defaults
+ adapter: postgresql
+ encoding: unicode
+ host: localhost
+ username: git
+ password: "secure password"
+
+#
+# PRODUCTION
+#
+production:
+ main: &main
+ <<: *defaults
+ database: gitlabhq_production
+ ci:
+ <<: *defaults
+ database: gitlabhq_production_ci
+ main_clusterwide:
+ <: *main
+ database_tasks: false
+ geo:
+ <<: *defaults
+ database: gitlabhq_geo_production
+
+#
+# Development specific
+#
+development:
+ main: &main
+ <<: *defaults
+ database: gitlabhq_development
+ username: postgres
+ variables:
+ statement_timeout: 15s
+ ci:
+ <<: *defaults
+ database: gitlabhq_development_ci
+ username: postgres
+ variables:
+ statement_timeout: 15s
+ main_clusterwide:
+ <<: *main
+ database_tasks: false
+ variables:
+ statement_timeout: 15s
+ geo:
+ <<: *defaults
+ database: gitlabhq_geo_development
+ username: postgres
+
+# Warning: The database defined as "test" will be erased and
+# re-generated from your development database when you run "rake".
+# Do not set this db to the same as development or production.
+test:
+ main: &main
+ <<: *defaults
+ database: gitlabhq_test
+ username: postgres
+ password:
+ prepared_statements: false
+ variables:
+ statement_timeout: 15s
+ ci:
+ <<: *defaults
+ database: gitlabhq_test_ci
+ username: postgres
+ password:
+ prepared_statements: false
+ variables:
+ statement_timeout: 15s
+ main_clusterwide:
+ <<: *main
+ database_tasks: false
+ geo:
+ <<: *defaults
+ database: gitlabhq_geo_test
+ username: postgres
+ password:
+ embedding:
+ <<: *defaults
+ database: gitlabhq_embedding_test
+ username: postgres
+ password:
+
diff --git a/config/environments/test.rb b/config/environments/test.rb
index da91752549e..e29fcf31664 100644
--- a/config/environments/test.rb
+++ b/config/environments/test.rb
@@ -4,7 +4,8 @@ require 'gitlab/testing/request_blocker_middleware'
require 'gitlab/testing/robots_blocker_middleware'
require 'gitlab/testing/request_inspector_middleware'
require 'gitlab/testing/clear_process_memory_cache_middleware'
-require 'gitlab/utils'
+require 'gitlab/testing/action_cable_blocker'
+require 'gitlab/utils/all'
Rails.application.configure do
# Make sure the middleware is inserted first in middleware chain
@@ -13,6 +14,8 @@ Rails.application.configure do
config.middleware.insert_before(ActionDispatch::Static, Gitlab::Testing::RequestInspectorMiddleware)
config.middleware.insert_before(ActionDispatch::Static, Gitlab::Testing::ClearProcessMemoryCacheMiddleware)
+ Gitlab::Testing::ActionCableBlocker.install
+
# Settings specified here will take precedence over those in config/application.rb
# The test environment is used exclusively to run your application's
diff --git a/config/events/g_project_management_issue_created.yml b/config/events/g_project_management_issue_created.yml
new file mode 100644
index 00000000000..0fe5dd5f82e
--- /dev/null
+++ b/config/events/g_project_management_issue_created.yml
@@ -0,0 +1,24 @@
+---
+description: An issue has been created
+category: InternalEventTracking
+action: g_project_management_issue_created
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+ - namespace
+ - project
+ - user
+product_section: dev
+product_stage: plan
+product_group: project_management
+milestone: "16.1"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/123184
+distributions:
+ - ce
+ - ee
+tiers:
+ - free
+ - premium
+ - ultimate
diff --git a/config/feature_flags/development/adapt_deprecated_approvals.yml b/config/feature_flags/development/adapt_deprecated_approvals.yml
deleted file mode 100644
index 0f2ba559033..00000000000
--- a/config/feature_flags/development/adapt_deprecated_approvals.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: adapt_deprecated_approvals
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/118036
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/409686
-milestone: '16.0'
-type: development
-group: group::source code
-default_enabled: true
diff --git a/config/feature_flags/development/add_ignore_all_white_spaces.yml b/config/feature_flags/development/add_ignore_all_white_spaces.yml
deleted file mode 100644
index 6d343500fa6..00000000000
--- a/config/feature_flags/development/add_ignore_all_white_spaces.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: add_ignore_all_white_spaces
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/111055
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/390657
-milestone: '15.9'
-type: development
-group: group::code review
-default_enabled: false
diff --git a/config/feature_flags/development/ai_chat_history_context.yml b/config/feature_flags/development/ai_chat_history_context.yml
deleted file mode 100644
index cc264093cd5..00000000000
--- a/config/feature_flags/development/ai_chat_history_context.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ai_chat_history_context
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/122920
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/414606
-milestone: '16.1'
-type: development
-group: group::ai-enablement
-default_enabled: false
diff --git a/config/feature_flags/development/ai_chat_prompt_alternative.yml b/config/feature_flags/development/ai_chat_prompt_alternative.yml
new file mode 100644
index 00000000000..f568abcec24
--- /dev/null
+++ b/config/feature_flags/development/ai_chat_prompt_alternative.yml
@@ -0,0 +1,8 @@
+---
+name: ai_chat_prompt_alternative
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/125092
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/417230
+milestone: '16.2'
+type: development
+group: group::ai-enablement
+default_enabled: false
diff --git a/config/feature_flags/development/allow_protected_branches_for_group.yml b/config/feature_flags/development/allow_protected_branches_for_group.yml
index 16b06182f7c..88695ddf245 100644
--- a/config/feature_flags/development/allow_protected_branches_for_group.yml
+++ b/config/feature_flags/development/allow_protected_branches_for_group.yml
@@ -4,5 +4,5 @@ introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/116779
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/383178
milestone: '15.11'
type: development
-group: group::compliance
+group: group::source code
default_enabled: false
diff --git a/config/feature_flags/development/auto_merge_labels_mr_widget.yml b/config/feature_flags/development/auto_merge_labels_mr_widget.yml
deleted file mode 100644
index ea689058ee2..00000000000
--- a/config/feature_flags/development/auto_merge_labels_mr_widget.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: auto_merge_labels_mr_widget
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/115436
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/409530
-milestone: '15.11'
-type: development
-group: group::pipeline execution
-default_enabled: true
diff --git a/config/feature_flags/development/autocomplete_users_use_search_service.yml b/config/feature_flags/development/autocomplete_users_use_search_service.yml
deleted file mode 100644
index 1fe9b295076..00000000000
--- a/config/feature_flags/development/autocomplete_users_use_search_service.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: autocomplete_users_use_search_service
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/122289
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/413972
-milestone: '16.1'
-type: development
-group: group::global search
-default_enabled: false
diff --git a/config/feature_flags/development/batch_delay_jira_branch_sync_worker.yml b/config/feature_flags/development/batch_delay_jira_branch_sync_worker.yml
index f10403e98e9..171af0a1690 100644
--- a/config/feature_flags/development/batch_delay_jira_branch_sync_worker.yml
+++ b/config/feature_flags/development/batch_delay_jira_branch_sync_worker.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/411865
milestone: '16.1'
type: development
group: group::source code
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/batched_api_mergeability_checks.yml b/config/feature_flags/development/batched_api_mergeability_checks.yml
new file mode 100644
index 00000000000..2a5e85f7566
--- /dev/null
+++ b/config/feature_flags/development/batched_api_mergeability_checks.yml
@@ -0,0 +1,8 @@
+---
+name: batched_api_mergeability_checks
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/121980
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/413232
+milestone: '16.1'
+type: development
+group: group::code review
+default_enabled: false
diff --git a/config/feature_flags/development/bulk_imports_batched_import_export.yml b/config/feature_flags/development/bulk_imports_batched_import_export.yml
index 45c6c07c720..4afb715b1ee 100644
--- a/config/feature_flags/development/bulk_imports_batched_import_export.yml
+++ b/config/feature_flags/development/bulk_imports_batched_import_export.yml
@@ -1,8 +1,8 @@
---
name: bulk_imports_batched_import_export
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/117243
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124434
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/406559
-milestone: '16.0'
+milestone: '16.2'
type: development
group: group::import and integrate
default_enabled: false
diff --git a/config/feature_flags/development/ci_group_env_scope_graphql.yml b/config/feature_flags/development/ci_group_env_scope_graphql.yml
new file mode 100644
index 00000000000..04b080c67d4
--- /dev/null
+++ b/config/feature_flags/development/ci_group_env_scope_graphql.yml
@@ -0,0 +1,8 @@
+---
+name: ci_group_env_scope_graphql
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124134
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/416385
+milestone: '16.2'
+type: development
+group: group::pipeline security
+default_enabled: false
diff --git a/config/feature_flags/development/ci_includable_files_interpolation.yml b/config/feature_flags/development/ci_includable_files_interpolation.yml
deleted file mode 100644
index 7a6eef0f27c..00000000000
--- a/config/feature_flags/development/ci_includable_files_interpolation.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_includable_files_interpolation
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/113211
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/399146
-milestone: '15.11'
-type: development
-group: group::pipeline authoring
-default_enabled: true
diff --git a/config/feature_flags/development/ci_limit_environment_scope.yml b/config/feature_flags/development/ci_limit_environment_scope.yml
deleted file mode 100644
index 0beed23a151..00000000000
--- a/config/feature_flags/development/ci_limit_environment_scope.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_limit_environment_scope
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/113171
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/395003
-milestone: '15.10'
-type: development
-group: group::pipeline security
-default_enabled: false
diff --git a/config/feature_flags/development/ci_refactoring_pipeline_schedule_create_service.yml b/config/feature_flags/development/ci_refactoring_pipeline_schedule_create_service.yml
new file mode 100644
index 00000000000..40f2af0cc34
--- /dev/null
+++ b/config/feature_flags/development/ci_refactoring_pipeline_schedule_create_service.yml
@@ -0,0 +1,8 @@
+---
+name: ci_refactoring_pipeline_schedule_create_service
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124696
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/416359
+milestone: '16.2'
+type: development
+group: group::pipeline authoring
+default_enabled: false
diff --git a/config/feature_flags/development/ci_reset_skipped_jobs_in_atomic_processing.yml b/config/feature_flags/development/ci_reset_skipped_jobs_in_atomic_processing.yml
deleted file mode 100644
index 3d6a863a6ba..00000000000
--- a/config/feature_flags/development/ci_reset_skipped_jobs_in_atomic_processing.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_reset_skipped_jobs_in_atomic_processing
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/118269
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/410203
-milestone: '16.1'
-type: development
-group: group::pipeline authoring
-default_enabled: false
diff --git a/config/feature_flags/development/ci_support_include_rules_when_never.yml b/config/feature_flags/development/ci_support_include_rules_when_never.yml
deleted file mode 100644
index 594da30ec97..00000000000
--- a/config/feature_flags/development/ci_support_include_rules_when_never.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_support_include_rules_when_never
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/122810
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/414517
-milestone: '16.1'
-type: development
-group: group::pipeline authoring
-default_enabled: false
diff --git a/config/feature_flags/development/cluster_agents_limit_tokens_created.yml b/config/feature_flags/development/cluster_agents_limit_tokens_created.yml
deleted file mode 100644
index 77a4bae6a56..00000000000
--- a/config/feature_flags/development/cluster_agents_limit_tokens_created.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: cluster_agents_limit_tokens_created
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/120825
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/412399
-milestone: '16.1'
-type: development
-group: group::environments
-default_enabled: true
diff --git a/config/feature_flags/development/code_suggestions_tokens_from_customers_dot.yml b/config/feature_flags/development/code_suggestions_tokens_from_customers_dot.yml
new file mode 100644
index 00000000000..4abbd56482c
--- /dev/null
+++ b/config/feature_flags/development/code_suggestions_tokens_from_customers_dot.yml
@@ -0,0 +1,8 @@
+---
+name: code_suggestions_tokens_from_customers_dot
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/125405
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/417762
+milestone: '16.3'
+type: development
+group: group::application performance
+default_enabled: false
diff --git a/config/feature_flags/development/command_palette.yml b/config/feature_flags/development/command_palette.yml
index cba513c305e..3a7935e6bf5 100644
--- a/config/feature_flags/development/command_palette.yml
+++ b/config/feature_flags/development/command_palette.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/413060
milestone: '16.1'
type: development
group: group::foundations
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/comment_on_files.yml b/config/feature_flags/development/comment_on_files.yml
deleted file mode 100644
index 3482486eefa..00000000000
--- a/config/feature_flags/development/comment_on_files.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: comment_on_files
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/121429
-rollout_issue_url:
-milestone: '16.1'
-type: development
-group: group::code review
-default_enabled: true
diff --git a/config/feature_flags/development/complete_p_ci_builds_partitioning.yml b/config/feature_flags/development/complete_p_ci_builds_partitioning.yml
new file mode 100644
index 00000000000..bd6ed2644af
--- /dev/null
+++ b/config/feature_flags/development/complete_p_ci_builds_partitioning.yml
@@ -0,0 +1,8 @@
+---
+name: complete_p_ci_builds_partitioning
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/126701
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/414396
+milestone: '16.2'
+type: development
+group: group::pipeline execution
+default_enabled: false
diff --git a/config/feature_flags/development/compliance_adherence_report.yml b/config/feature_flags/development/compliance_adherence_report.yml
new file mode 100644
index 00000000000..b4a19625a5d
--- /dev/null
+++ b/config/feature_flags/development/compliance_adherence_report.yml
@@ -0,0 +1,8 @@
+---
+name: compliance_adherence_report
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124167
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/416988
+milestone: '16.2'
+type: development
+group: group::compliance
+default_enabled: false
diff --git a/config/feature_flags/development/config/feature_flags/development/ci_jwt_v2_ref_uri_claim.yml b/config/feature_flags/development/config/feature_flags/development/ci_jwt_v2_ref_uri_claim.yml
deleted file mode 100644
index 9f3e3d7143b..00000000000
--- a/config/feature_flags/development/config/feature_flags/development/ci_jwt_v2_ref_uri_claim.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_jwt_v2_ref_uri_claim
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/122373
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/412926
-milestone: '16.1'
-type: development
-group: group::security policies
-default_enabled: false
diff --git a/config/feature_flags/development/content_editor_on_issues.yml b/config/feature_flags/development/content_editor_on_issues.yml
index 4527ea3b807..79aaccee828 100644
--- a/config/feature_flags/development/content_editor_on_issues.yml
+++ b/config/feature_flags/development/content_editor_on_issues.yml
@@ -4,5 +4,5 @@ introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/98703
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/375172
milestone: '15.5'
type: development
-group: group::editor
-default_enabled: false
+group: group::knowledge
+default_enabled: true
diff --git a/config/feature_flags/development/create_runner_workflow_for_admin.yml b/config/feature_flags/development/create_runner_workflow_for_admin.yml
deleted file mode 100644
index 7d13be6760b..00000000000
--- a/config/feature_flags/development/create_runner_workflow_for_admin.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: create_runner_workflow_for_admin
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/109497
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/389269
-milestone: '15.9'
-type: development
-group: group::runner
-default_enabled: true
diff --git a/config/feature_flags/development/create_runner_workflow_for_namespace.yml b/config/feature_flags/development/create_runner_workflow_for_namespace.yml
deleted file mode 100644
index 032a5b49ffd..00000000000
--- a/config/feature_flags/development/create_runner_workflow_for_namespace.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: create_runner_workflow_for_namespace
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/113535
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/393919
-milestone: '15.10'
-type: development
-group: group::runner
-default_enabled: true
diff --git a/config/feature_flags/development/deprecate_vulnerabilities_feedback.yml b/config/feature_flags/development/deprecate_vulnerabilities_feedback.yml
deleted file mode 100644
index 25e33effa1d..00000000000
--- a/config/feature_flags/development/deprecate_vulnerabilities_feedback.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: deprecate_vulnerabilities_feedback
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86497
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/361797
-milestone: '15.0'
-type: development
-group: group::threat insights
-default_enabled: true
diff --git a/config/feature_flags/development/emoji_webhooks.yml b/config/feature_flags/development/emoji_webhooks.yml
new file mode 100644
index 00000000000..98d1918d365
--- /dev/null
+++ b/config/feature_flags/development/emoji_webhooks.yml
@@ -0,0 +1,8 @@
+---
+name: emoji_webhooks
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/123952
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/417288
+milestone: '16.2'
+type: development
+group: group::import and integrate
+default_enabled: false
diff --git a/config/feature_flags/development/enable_vulnerability_remediations_from_records.yml b/config/feature_flags/development/enable_vulnerability_remediations_from_records.yml
deleted file mode 100644
index c557ad751f2..00000000000
--- a/config/feature_flags/development/enable_vulnerability_remediations_from_records.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: enable_vulnerability_remediations_from_records
-introduced_by_url:
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/362283
-milestone: '15.1'
-type: development
-group: group::threat insights
-default_enabled: false
diff --git a/config/feature_flags/development/environment_settings_to_graphql.yml b/config/feature_flags/development/environment_settings_to_graphql.yml
deleted file mode 100644
index fc9d54eb3b3..00000000000
--- a/config/feature_flags/development/environment_settings_to_graphql.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: environment_settings_to_graphql
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/121091
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/412332
-milestone: '16.1'
-type: development
-group: group::environments
-default_enabled: true
diff --git a/config/feature_flags/development/explain_code_vertex_ai.yml b/config/feature_flags/development/explain_code_vertex_ai.yml
new file mode 100644
index 00000000000..4eb4d64ed30
--- /dev/null
+++ b/config/feature_flags/development/explain_code_vertex_ai.yml
@@ -0,0 +1,8 @@
+---
+name: explain_code_vertex_ai
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/125292
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/416907
+milestone: '16.2'
+type: development
+group: group::source code
+default_enabled: false
diff --git a/config/feature_flags/development/expose_authorized_cluster_agents.yml b/config/feature_flags/development/expose_authorized_cluster_agents.yml
deleted file mode 100644
index b5a44d5d309..00000000000
--- a/config/feature_flags/development/expose_authorized_cluster_agents.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: expose_authorized_cluster_agents
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/117128
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/407841
-milestone: '16.0'
-type: development
-group: group::environments
-default_enabled: true
diff --git a/config/feature_flags/development/filter_vulnerability_findings_dismissed_on_default.yml b/config/feature_flags/development/filter_vulnerability_findings_dismissed_on_default.yml
deleted file mode 100644
index 93d79757511..00000000000
--- a/config/feature_flags/development/filter_vulnerability_findings_dismissed_on_default.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: filter_vulnerability_findings_dismissed_on_default
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/113711
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/396747
-milestone: '15.11'
-type: development
-group: group::threat insights
-default_enabled: true
diff --git a/config/feature_flags/development/find_changed_paths_new_format.yml b/config/feature_flags/development/find_changed_paths_new_format.yml
deleted file mode 100644
index 1964edf38da..00000000000
--- a/config/feature_flags/development/find_changed_paths_new_format.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: find_changed_paths_new_format
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/122768
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/414463
-milestone: '16.1'
-type: development
-group: group::source code
-default_enabled: false
diff --git a/config/feature_flags/development/frozen_outbound_job_token_scopes.yml b/config/feature_flags/development/frozen_outbound_job_token_scopes.yml
deleted file mode 100644
index f8ebc46d7f9..00000000000
--- a/config/feature_flags/development/frozen_outbound_job_token_scopes.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: frozen_outbound_job_token_scopes
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/118254
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/407401
-milestone: '16.0'
-type: development
-group: group::pipeline execution
-default_enabled: true
diff --git a/config/feature_flags/development/frozen_outbound_job_token_scopes_override.yml b/config/feature_flags/development/frozen_outbound_job_token_scopes_override.yml
deleted file mode 100644
index 44dcb134318..00000000000
--- a/config/feature_flags/development/frozen_outbound_job_token_scopes_override.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: frozen_outbound_job_token_scopes_override
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/118254
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/407401
-milestone: '16.0'
-type: development
-group: group::pipeline execution
-default_enabled: false
diff --git a/config/feature_flags/development/global_file_size_check.yml b/config/feature_flags/development/global_file_size_check.yml
new file mode 100644
index 00000000000..eea775cdad5
--- /dev/null
+++ b/config/feature_flags/development/global_file_size_check.yml
@@ -0,0 +1,8 @@
+---
+name: global_file_size_check
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/125956
+rollout_issue_url:
+milestone: '16.2'
+type: development
+group: group::source code
+default_enabled: false
diff --git a/config/feature_flags/development/graphql_generic_tracing_metrics_deactivate.yml b/config/feature_flags/development/graphql_generic_tracing_metrics_deactivate.yml
deleted file mode 100644
index c2954e791d6..00000000000
--- a/config/feature_flags/development/graphql_generic_tracing_metrics_deactivate.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: graphql_generic_tracing_metrics_deactivate
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/123228
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/415004
-milestone: '16.1'
-type: development
-group: group::application performance
-default_enabled: false
diff --git a/config/feature_flags/development/group_analytics_dashboards.yml b/config/feature_flags/development/group_analytics_dashboards.yml
new file mode 100644
index 00000000000..55001b99452
--- /dev/null
+++ b/config/feature_flags/development/group_analytics_dashboards.yml
@@ -0,0 +1,8 @@
+---
+name: group_analytics_dashboards
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/125337
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/416970
+milestone: '16.2'
+type: development
+group: group::optimize
+default_enabled: false
diff --git a/config/feature_flags/development/group_mentions.yml b/config/feature_flags/development/group_mentions.yml
new file mode 100644
index 00000000000..4f536b2b583
--- /dev/null
+++ b/config/feature_flags/development/group_mentions.yml
@@ -0,0 +1,8 @@
+---
+name: group_mentions
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/96684
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/414856
+milestone: '16.2'
+type: development
+group: group::import and integrate
+default_enabled: false
diff --git a/config/feature_flags/development/group_protected_branches.yml b/config/feature_flags/development/group_protected_branches.yml
index 4d580734dc4..5c1a39a0e3b 100644
--- a/config/feature_flags/development/group_protected_branches.yml
+++ b/config/feature_flags/development/group_protected_branches.yml
@@ -4,5 +4,5 @@ introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/issues/372816
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/383178
milestone: '15.7'
type: development
-group: group::compliance
+group: group::source code
default_enabled: false
diff --git a/config/feature_flags/development/hide_projects_of_banned_users.yml b/config/feature_flags/development/hide_projects_of_banned_users.yml
new file mode 100644
index 00000000000..374782c359a
--- /dev/null
+++ b/config/feature_flags/development/hide_projects_of_banned_users.yml
@@ -0,0 +1,8 @@
+---
+name: hide_projects_of_banned_users
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/121488
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/412621
+milestone: '16.2'
+type: development
+group: group::anti-abuse
+default_enabled: false
diff --git a/config/feature_flags/development/highlight_js_worker.yml b/config/feature_flags/development/highlight_js_worker.yml
new file mode 100644
index 00000000000..ee74cbb7004
--- /dev/null
+++ b/config/feature_flags/development/highlight_js_worker.yml
@@ -0,0 +1,8 @@
+---
+name: highlight_js_worker
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124276
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/415755
+milestone: '16.2'
+type: development
+group: group::source code
+default_enabled: false
diff --git a/config/feature_flags/development/introduce_rules_with_needs.yml b/config/feature_flags/development/introduce_rules_with_needs.yml
deleted file mode 100644
index 8b2940438ee..00000000000
--- a/config/feature_flags/development/introduce_rules_with_needs.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: introduce_rules_with_needs
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/112725
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/394769
-milestone: '16.0'
-type: development
-group: group::pipeline authoring
-default_enabled: false
diff --git a/config/feature_flags/development/issue_type_uses_work_item_types_table.yml b/config/feature_flags/development/issue_type_uses_work_item_types_table.yml
deleted file mode 100644
index 4ce66b7ab33..00000000000
--- a/config/feature_flags/development/issue_type_uses_work_item_types_table.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: issue_type_uses_work_item_types_table
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107690
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/386603
-milestone: '15.8'
-type: development
-group: group::project management
-default_enabled: false
diff --git a/config/feature_flags/development/issues_full_text_search.yml b/config/feature_flags/development/issues_full_text_search.yml
deleted file mode 100644
index 31fe543e35e..00000000000
--- a/config/feature_flags/development/issues_full_text_search.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: issues_full_text_search
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71913
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/354784
-milestone: '14.5'
-type: development
-group: group::project management
-default_enabled: true
diff --git a/config/feature_flags/development/jira_deployment_issue_keys.yml b/config/feature_flags/development/jira_deployment_issue_keys.yml
new file mode 100644
index 00000000000..e2b9db8020d
--- /dev/null
+++ b/config/feature_flags/development/jira_deployment_issue_keys.yml
@@ -0,0 +1,8 @@
+---
+name: jira_deployment_issue_keys
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/123455
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/415025
+milestone: '16.2'
+type: development
+group: group::import and integrate
+default_enabled: true
diff --git a/config/feature_flags/development/job_webhook_retries_count.yml b/config/feature_flags/development/job_webhook_retries_count.yml
deleted file mode 100644
index 96b33695440..00000000000
--- a/config/feature_flags/development/job_webhook_retries_count.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: job_webhook_retries_count
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/101618
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/382046
-milestone: '15.6'
-type: development
-group: group::delivery
-default_enabled: false
diff --git a/config/feature_flags/development/kas_user_access.yml b/config/feature_flags/development/kas_user_access.yml
deleted file mode 100644
index 47ce7cd660a..00000000000
--- a/config/feature_flags/development/kas_user_access.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: kas_user_access
-introduced_by_url: 'https://gitlab.com/gitlab-org/gitlab/-/merge_requests/104504'
-rollout_issue_url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/391201'
-milestone: '15.10'
-type: development
-group: group::environments
-default_enabled: true
diff --git a/config/feature_flags/development/kas_user_access_project.yml b/config/feature_flags/development/kas_user_access_project.yml
deleted file mode 100644
index 16106a36d8d..00000000000
--- a/config/feature_flags/development/kas_user_access_project.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: kas_user_access_project
-introduced_by_url: 'https://gitlab.com/gitlab-org/gitlab/-/merge_requests/104504'
-rollout_issue_url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/391211'
-milestone: '15.10'
-type: development
-group: group::environments
-default_enabled: true
diff --git a/config/feature_flags/development/kubernetes_namespace_for_environment.yml b/config/feature_flags/development/kubernetes_namespace_for_environment.yml
new file mode 100644
index 00000000000..f5da9ea7c9a
--- /dev/null
+++ b/config/feature_flags/development/kubernetes_namespace_for_environment.yml
@@ -0,0 +1,8 @@
+---
+name: kubernetes_namespace_for_environment
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/125191
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/417129
+milestone: '16.2'
+type: development
+group: group::environments
+default_enabled: false
diff --git a/config/feature_flags/development/linear_group_descendants_finder_upto.yml b/config/feature_flags/development/linear_group_descendants_finder_upto.yml
deleted file mode 100644
index 3955332bd90..00000000000
--- a/config/feature_flags/development/linear_group_descendants_finder_upto.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: linear_group_descendants_finder_upto
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78991
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/350972
-milestone: '14.8'
-type: development
-group: group::tenant scale
-default_enabled: true
diff --git a/config/feature_flags/development/load_merge_request_via_links.yml b/config/feature_flags/development/load_merge_request_via_links.yml
deleted file mode 100644
index a9db587a7a9..00000000000
--- a/config/feature_flags/development/load_merge_request_via_links.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: load_merge_request_via_links
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/117321
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/412177
-milestone: '16.1'
-type: development
-group: group::threat insights
-default_enabled: false
diff --git a/config/feature_flags/development/log_response_length.yml b/config/feature_flags/development/log_response_length.yml
deleted file mode 100644
index 83cafe20de9..00000000000
--- a/config/feature_flags/development/log_response_length.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: log_response_length
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91448
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/366854
-milestone: '15.3'
-type: development
-group: group::tenant scale
-default_enabled: true
diff --git a/config/feature_flags/development/merge_request_cleanup_ref_worker_async.yml b/config/feature_flags/development/merge_request_cleanup_ref_worker_async.yml
new file mode 100644
index 00000000000..75d7541fdef
--- /dev/null
+++ b/config/feature_flags/development/merge_request_cleanup_ref_worker_async.yml
@@ -0,0 +1,8 @@
+---
+name: merge_request_cleanup_ref_worker_async
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/125109
+rollout_issue_url: https://gitlab.com/gitlab-org/gitaly/-/issues/5369
+milestone: '16.2'
+type: development
+group: group::tenant scale
+default_enabled: false
diff --git a/config/feature_flags/development/mirror_only_branches_match_regex.yml b/config/feature_flags/development/mirror_only_branches_match_regex.yml
deleted file mode 100644
index 3311187e3b4..00000000000
--- a/config/feature_flags/development/mirror_only_branches_match_regex.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: mirror_only_branches_match_regex
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/99201
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/381667
-milestone: '15.6'
-type: development
-group: "group::source code"
-default_enabled: true
diff --git a/config/feature_flags/development/ml_experiment_tracking.yml b/config/feature_flags/development/ml_experiment_tracking.yml
index 19f14196591..b39c7395bbc 100644
--- a/config/feature_flags/development/ml_experiment_tracking.yml
+++ b/config/feature_flags/development/ml_experiment_tracking.yml
@@ -5,5 +5,5 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/371669
milestone: '15.6'
type: development
group: group::incubation
-default_enabled: false
+default_enabled: true
log_state_changes: true
diff --git a/config/feature_flags/development/move_close_into_dropdown.yml b/config/feature_flags/development/move_close_into_dropdown.yml
new file mode 100644
index 00000000000..65777f09eb7
--- /dev/null
+++ b/config/feature_flags/development/move_close_into_dropdown.yml
@@ -0,0 +1,8 @@
+---
+name: move_close_into_dropdown
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/125173
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/416861
+milestone: '16.2'
+type: development
+group: group::ux paper cuts
+default_enabled: false
diff --git a/config/feature_flags/development/moved_mr_sidebar.yml b/config/feature_flags/development/moved_mr_sidebar.yml
index 1e542a5a60e..0a54e51e57f 100644
--- a/config/feature_flags/development/moved_mr_sidebar.yml
+++ b/config/feature_flags/development/moved_mr_sidebar.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/385460
milestone: '14.10'
type: development
group: group::code review
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/notify_kas_on_git_push.yml b/config/feature_flags/development/notify_kas_on_git_push.yml
index df90a4d1942..32806418bce 100644
--- a/config/feature_flags/development/notify_kas_on_git_push.yml
+++ b/config/feature_flags/development/notify_kas_on_git_push.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/410429
milestone: '16.0'
type: development
group: group::environments
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/observability_tracing.yml b/config/feature_flags/development/observability_tracing.yml
new file mode 100644
index 00000000000..a32d8409608
--- /dev/null
+++ b/config/feature_flags/development/observability_tracing.yml
@@ -0,0 +1,8 @@
+---
+name: observability_tracing
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124966
+rollout_issue_url: https://gitlab.com/gitlab-org/opstrace/opstrace/-/issues/2252
+milestone: '16.2'
+type: development
+group: group::observability
+default_enabled: false
diff --git a/config/feature_flags/development/packages_dependency_proxy_maven.yml b/config/feature_flags/development/packages_dependency_proxy_maven.yml
new file mode 100644
index 00000000000..8cf2f5a2879
--- /dev/null
+++ b/config/feature_flags/development/packages_dependency_proxy_maven.yml
@@ -0,0 +1,8 @@
+---
+name: packages_dependency_proxy_maven
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/123491
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/415218
+milestone: '16.2'
+type: development
+group: group::package registry
+default_enabled: false
diff --git a/config/feature_flags/development/pat_reuse_detection.yml b/config/feature_flags/development/pat_reuse_detection.yml
new file mode 100644
index 00000000000..8000b362296
--- /dev/null
+++ b/config/feature_flags/development/pat_reuse_detection.yml
@@ -0,0 +1,8 @@
+---
+name: pat_reuse_detection
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/126600
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/418336
+milestone: '16.2'
+type: development
+group: group::authentication and authorization
+default_enabled: false
diff --git a/config/feature_flags/development/persist_failed_pipelines_from_schedules.yml b/config/feature_flags/development/persist_failed_pipelines_from_schedules.yml
new file mode 100644
index 00000000000..8912e30c2e8
--- /dev/null
+++ b/config/feature_flags/development/persist_failed_pipelines_from_schedules.yml
@@ -0,0 +1,8 @@
+---
+name: persist_failed_pipelines_from_schedules
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124371
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/416297
+milestone: '16.2'
+type: development
+group: group::pipeline execution
+default_enabled: true
diff --git a/config/feature_flags/development/pipeline_cleanup_ref_worker_async.yml b/config/feature_flags/development/pipeline_cleanup_ref_worker_async.yml
new file mode 100644
index 00000000000..e8e97404556
--- /dev/null
+++ b/config/feature_flags/development/pipeline_cleanup_ref_worker_async.yml
@@ -0,0 +1,8 @@
+---
+name: pipeline_cleanup_ref_worker_async
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/123976
+rollout_issue_url: https://gitlab.com/gitlab-org/gitaly/-/issues/5369
+milestone: '16.1'
+type: development
+group: group::tenant scale
+default_enabled: false
diff --git a/config/feature_flags/development/pipeline_details_header_vue.yml b/config/feature_flags/development/pipeline_details_header_vue.yml
deleted file mode 100644
index 4e4968bc686..00000000000
--- a/config/feature_flags/development/pipeline_details_header_vue.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: pipeline_details_header_vue
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/120634
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/411442
-milestone: '16.0'
-type: development
-group: group::pipeline execution
-default_enabled: false
diff --git a/config/feature_flags/development/product_intelligence_database_event_tracking.yml b/config/feature_flags/development/product_intelligence_database_event_tracking.yml
deleted file mode 100644
index 63b53996eea..00000000000
--- a/config/feature_flags/development/product_intelligence_database_event_tracking.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: product_intelligence_database_event_tracking
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92079
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/368976
-milestone: '15.3'
-type: development
-group: group::product intelligence
-default_enabled: true
diff --git a/config/feature_flags/development/product_intelligence_database_event_tracking_batch2.yml b/config/feature_flags/development/product_intelligence_database_event_tracking_batch2.yml
deleted file mode 100644
index 825f684ed8c..00000000000
--- a/config/feature_flags/development/product_intelligence_database_event_tracking_batch2.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: product_intelligence_database_event_tracking_batch2
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/116125
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/403041
-milestone: '16.0'
-type: development
-group: group::analytics instrumentation
-default_enabled: true
diff --git a/config/feature_flags/development/redirect_with_ref_type.yml b/config/feature_flags/development/redirect_with_ref_type.yml
new file mode 100644
index 00000000000..74a4d31eb2f
--- /dev/null
+++ b/config/feature_flags/development/redirect_with_ref_type.yml
@@ -0,0 +1,8 @@
+---
+name: redirect_with_ref_type
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/122237
+rollout_issue_url:
+milestone: '16.2'
+type: development
+group: group::source code
+default_enabled: false
diff --git a/config/feature_flags/development/remove_deployments_api_ref_sort.yml b/config/feature_flags/development/remove_deployments_api_ref_sort.yml
new file mode 100644
index 00000000000..584012ba2bf
--- /dev/null
+++ b/config/feature_flags/development/remove_deployments_api_ref_sort.yml
@@ -0,0 +1,8 @@
+---
+name: remove_deployments_api_ref_sort
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124229
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/416305
+milestone: '16.2'
+type: development
+group: group::environments
+default_enabled: true
diff --git a/config/feature_flags/development/remove_startup_css.yml b/config/feature_flags/development/remove_startup_css.yml
deleted file mode 100644
index 91e78682755..00000000000
--- a/config/feature_flags/development/remove_startup_css.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: remove_startup_css
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/117495
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/407140
-milestone: '15.11'
-type: development
-group: group::project management
-default_enabled: false
diff --git a/config/feature_flags/development/runners_dashboard.yml b/config/feature_flags/development/runners_dashboard.yml
new file mode 100644
index 00000000000..dd773c5e337
--- /dev/null
+++ b/config/feature_flags/development/runners_dashboard.yml
@@ -0,0 +1,8 @@
+---
+name: runners_dashboard
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/125301
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/417002
+milestone: '16.2'
+type: development
+group: group::runner
+default_enabled: false
diff --git a/config/feature_flags/development/scan_execution_policy_pipelines.yml b/config/feature_flags/development/scan_execution_policy_pipelines.yml
new file mode 100644
index 00000000000..b062b9940c3
--- /dev/null
+++ b/config/feature_flags/development/scan_execution_policy_pipelines.yml
@@ -0,0 +1,8 @@
+---
+name: scan_execution_policy_pipelines
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/121087
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/415607
+milestone: '16.1'
+type: development
+group: group::security policies
+default_enabled: true
diff --git a/config/feature_flags/development/service_desk_ticket.yml b/config/feature_flags/development/service_desk_ticket.yml
new file mode 100644
index 00000000000..119dbac61b7
--- /dev/null
+++ b/config/feature_flags/development/service_desk_ticket.yml
@@ -0,0 +1,8 @@
+---
+name: service_desk_ticket
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124681
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/416343
+milestone: '16.2'
+type: development
+group: group::respond
+default_enabled: false
diff --git a/config/feature_flags/development/service_desk_vue_list.yml b/config/feature_flags/development/service_desk_vue_list.yml
new file mode 100644
index 00000000000..8cd260289cf
--- /dev/null
+++ b/config/feature_flags/development/service_desk_vue_list.yml
@@ -0,0 +1,8 @@
+---
+name: service_desk_vue_list
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/123064
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/415385
+milestone: '16.1'
+type: development
+group: group::respond
+default_enabled: false
diff --git a/config/feature_flags/development/sidekiq_queueing_application_slis.yml b/config/feature_flags/development/sidekiq_queueing_application_slis.yml
new file mode 100644
index 00000000000..9968948e42b
--- /dev/null
+++ b/config/feature_flags/development/sidekiq_queueing_application_slis.yml
@@ -0,0 +1,8 @@
+---
+name: sidekiq_queueing_application_slis
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/121141
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/412092
+milestone: '16.2'
+type: development
+group: group::scalability
+default_enabled: false
diff --git a/config/feature_flags/development/support_group_level_merge_checks_setting.yml b/config/feature_flags/development/support_group_level_merge_checks_setting.yml
index 66cb9830261..282fa289c91 100644
--- a/config/feature_flags/development/support_group_level_merge_checks_setting.yml
+++ b/config/feature_flags/development/support_group_level_merge_checks_setting.yml
@@ -4,5 +4,5 @@ introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/102864
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/377723
milestone: '15.8'
type: development
-group: group::compliance
+group: group::code review
default_enabled: false
diff --git a/config/feature_flags/development/tanuki_bot_breadcrumbs_entry_point.yml b/config/feature_flags/development/tanuki_bot_breadcrumbs_entry_point.yml
new file mode 100644
index 00000000000..92fbcddd3cc
--- /dev/null
+++ b/config/feature_flags/development/tanuki_bot_breadcrumbs_entry_point.yml
@@ -0,0 +1,8 @@
+---
+name: tanuki_bot_breadcrumbs_entry_point
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/123530
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/416423
+milestone: '16.2'
+type: development
+group: group::foundations
+default_enabled: false
diff --git a/config/feature_flags/development/update_personal_access_token_usage_information_every_10_minutes.yml b/config/feature_flags/development/update_personal_access_token_usage_information_every_10_minutes.yml
deleted file mode 100644
index fbcd7bb15ae..00000000000
--- a/config/feature_flags/development/update_personal_access_token_usage_information_every_10_minutes.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: update_personal_access_token_usage_information_every_10_minutes
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/123154
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/414945
-milestone: '16.1'
-type: development
-group: group::authentication and authorization
-default_enabled: true
diff --git a/config/feature_flags/development/use_metric_definitions_for_events_list.yml b/config/feature_flags/development/use_metric_definitions_for_events_list.yml
new file mode 100644
index 00000000000..fee19608502
--- /dev/null
+++ b/config/feature_flags/development/use_metric_definitions_for_events_list.yml
@@ -0,0 +1,8 @@
+---
+name: use_metric_definitions_for_events_list
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/122840
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/416893
+milestone: '16.2'
+type: development
+group: group::analytics instrumentation
+default_enabled: false
diff --git a/config/feature_flags/development/use_repository_info_for_repository_size.yml b/config/feature_flags/development/use_repository_info_for_repository_size.yml
new file mode 100644
index 00000000000..0de415d4d36
--- /dev/null
+++ b/config/feature_flags/development/use_repository_info_for_repository_size.yml
@@ -0,0 +1,8 @@
+---
+name: use_repository_info_for_repository_size
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124477
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/416490
+milestone: '16.1'
+type: development
+group: group::source code
+default_enabled: false
diff --git a/config/feature_flags/development/use_traversal_ids_for_ancestors.yml b/config/feature_flags/development/use_traversal_ids_for_ancestors.yml
deleted file mode 100644
index 64ba5b17513..00000000000
--- a/config/feature_flags/development/use_traversal_ids_for_ancestors.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: use_traversal_ids_for_ancestors
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/57137
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/334952
-milestone: '13.12'
-type: development
-group: group::tenant scale
-default_enabled: true
diff --git a/config/feature_flags/development/use_traversal_ids_for_ancestors_upto.yml b/config/feature_flags/development/use_traversal_ids_for_ancestors_upto.yml
deleted file mode 100644
index 910cf3e2d83..00000000000
--- a/config/feature_flags/development/use_traversal_ids_for_ancestors_upto.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: use_traversal_ids_for_ancestors_upto
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/72662
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/343619
-milestone: '14.6'
-type: development
-group: group::tenant scale
-default_enabled: true
diff --git a/config/feature_flags/development/use_traversal_ids_for_descendants_scopes.yml b/config/feature_flags/development/use_traversal_ids_for_descendants_scopes.yml
deleted file mode 100644
index 74b6d6d2f70..00000000000
--- a/config/feature_flags/development/use_traversal_ids_for_descendants_scopes.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: use_traversal_ids_for_descendants_scopes
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78542
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/350637
-milestone: '14.8'
-type: development
-group: group::tenant scale
-default_enabled: true
diff --git a/config/feature_flags/development/use_traversal_ids_for_self_and_hierarchy.yml b/config/feature_flags/development/use_traversal_ids_for_self_and_hierarchy.yml
deleted file mode 100644
index e1f1ec0df35..00000000000
--- a/config/feature_flags/development/use_traversal_ids_for_self_and_hierarchy.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: use_traversal_ids_for_self_and_hierarchy
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/76814
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/348527
-milestone: '14.7'
-type: development
-group: group::tenant scale
-default_enabled: true
diff --git a/config/feature_flags/development/use_traversal_ids_roots.yml b/config/feature_flags/development/use_traversal_ids_roots.yml
deleted file mode 100644
index d1f4cec7517..00000000000
--- a/config/feature_flags/development/use_traversal_ids_roots.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: use_traversal_ids_roots
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/74148
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/345438
-milestone: '14.5'
-type: development
-group: group::tenant scale
-default_enabled: true
diff --git a/config/feature_flags/development/user_profile_overflow_menu_vue.yml b/config/feature_flags/development/user_profile_overflow_menu_vue.yml
new file mode 100644
index 00000000000..42a792414cf
--- /dev/null
+++ b/config/feature_flags/development/user_profile_overflow_menu_vue.yml
@@ -0,0 +1,8 @@
+---
+name: user_profile_overflow_menu_vue
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/122971
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/414773
+milestone: '16.1'
+type: development
+group: group::tenant scale
+default_enabled: false
diff --git a/config/feature_flags/development/validate_environment_tier_presence.yml b/config/feature_flags/development/validate_environment_tier_presence.yml
deleted file mode 100644
index 5cc16b36f19..00000000000
--- a/config/feature_flags/development/validate_environment_tier_presence.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-name: validate_environment_tier_presence
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/111011
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/391293
-milestone: '15.9'
-type: development
-group: group::configure
-default_enabled: true
diff --git a/config/feature_flags/development/vsd_graphql_dora_and_flow_metrics.yml b/config/feature_flags/development/vsd_graphql_dora_and_flow_metrics.yml
index 16d0bffb151..c0588ce992d 100644
--- a/config/feature_flags/development/vsd_graphql_dora_and_flow_metrics.yml
+++ b/config/feature_flags/development/vsd_graphql_dora_and_flow_metrics.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/409499
milestone: '16.1'
type: development
group: group::optimize
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/experiment/phone_verification_for_low_risk_users.yml b/config/feature_flags/experiment/phone_verification_for_low_risk_users.yml
new file mode 100644
index 00000000000..9e4b76980b7
--- /dev/null
+++ b/config/feature_flags/experiment/phone_verification_for_low_risk_users.yml
@@ -0,0 +1,8 @@
+---
+name: phone_verification_for_low_risk_users
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124090
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/415674
+milestone: '16.2'
+type: experiment
+group: group::anti-abuse
+default_enabled: false
diff --git a/config/feature_flags/experiment/show_pages_in_deployments_menu.yml b/config/feature_flags/experiment/show_pages_in_deployments_menu.yml
deleted file mode 100644
index e72e5fd3af9..00000000000
--- a/config/feature_flags/experiment/show_pages_in_deployments_menu.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: show_pages_in_deployments_menu
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/97783
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/373561
-milestone: '15.4'
-type: experiment
-group: group::incubation
-default_enabled: false
diff --git a/config/feature_flags/ops/disable_keep_around_refs.yml b/config/feature_flags/ops/disable_keep_around_refs.yml
new file mode 100644
index 00000000000..2a894defd65
--- /dev/null
+++ b/config/feature_flags/ops/disable_keep_around_refs.yml
@@ -0,0 +1,8 @@
+---
+name: disable_keep_around_refs
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124123
+rollout_issue_url:
+milestone: '16.1'
+type: ops
+group: group::gitaly
+default_enabled: false
diff --git a/config/feature_flags/ops/gtm_nonce.yml b/config/feature_flags/ops/gtm_nonce.yml
index b4007732aa2..c206efd2a08 100644
--- a/config/feature_flags/ops/gtm_nonce.yml
+++ b/config/feature_flags/ops/gtm_nonce.yml
@@ -1,7 +1,7 @@
---
name: gtm_nonce
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/58494
-rollout_issue_url:
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/346322
milestone: '14.6'
type: ops
group: group::product intelligence
diff --git a/config/feature_flags/ops/search_index_curation_epics.yml b/config/feature_flags/ops/search_index_curation_epics.yml
new file mode 100644
index 00000000000..73eab662cb6
--- /dev/null
+++ b/config/feature_flags/ops/search_index_curation_epics.yml
@@ -0,0 +1,8 @@
+---
+name: search_index_curation_epics
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/121635
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/413605
+milestone: '16.2'
+type: ops
+group: group::global search
+default_enabled: false
diff --git a/config/feature_flags/ops/search_index_curation_projects.yml b/config/feature_flags/ops/search_index_curation_projects.yml
new file mode 100644
index 00000000000..fb8dcaed778
--- /dev/null
+++ b/config/feature_flags/ops/search_index_curation_projects.yml
@@ -0,0 +1,8 @@
+---
+name: search_index_curation_projects
+introduced_by_url: "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/122193"
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/383093
+milestone: '16.2'
+type: ops
+group: group::global search
+default_enabled: false
diff --git a/config/gitlab_loose_foreign_keys.yml b/config/gitlab_loose_foreign_keys.yml
index 1f97975a806..dfc4861d1f7 100644
--- a/config/gitlab_loose_foreign_keys.yml
+++ b/config/gitlab_loose_foreign_keys.yml
@@ -247,6 +247,10 @@ ml_candidates:
- table: ci_builds
column: ci_build_id
on_delete: async_nullify
+namespaces:
+ - table: organizations
+ column: organization_id
+ on_delete: async_nullify
p_ci_builds_metadata:
- table: projects
column: project_id
diff --git a/config/initializers/00_deprecations.rb b/config/initializers/00_deprecations.rb
index c45f7ab7a5a..3d6a6491176 100644
--- a/config/initializers/00_deprecations.rb
+++ b/config/initializers/00_deprecations.rb
@@ -42,7 +42,9 @@ else
# https://gitlab.com/gitlab-org/gitlab/-/issues/410086
/Using `return`, `break` or `throw` to exit a transaction block/,
# https://gitlab.com/gitlab-org/gitlab/-/issues/414556
- /Merging .* no longer maintain both conditions, and will be replaced by the latter in Rails 7\.0/
+ /Merging .* no longer maintain both conditions, and will be replaced by the latter in Rails 7\.0/,
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/415890
+ /(Date|Time|TimeWithZone)#to_s.+ is deprecated/
]
view_component_3_warnings = [
diff --git a/config/initializers/00_rails_disable_joins.rb b/config/initializers/00_rails_disable_joins.rb
deleted file mode 100644
index 4274365ccad..00000000000
--- a/config/initializers/00_rails_disable_joins.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-# Backported from Rails 7.0
-# Initial support for has_many :through was implemented in https://github.com/rails/rails/pull/41937
-# Support for has_one :through was implemented in https://github.com/rails/rails/pull/42079
-raise 'DisableJoins patch is only to be used with versions of Rails < 7.0' unless Rails::VERSION::MAJOR < 7
-
-ActiveRecord::Associations::Association.prepend(GemExtensions::ActiveRecord::Association)
-# Temporarily allow :disable_joins to accept a lambda argument, to control rollout with feature flags
-ActiveRecord::Associations::Association.prepend(GemExtensions::ActiveRecord::ConfigurableDisableJoins)
-ActiveRecord::Associations::Builder::HasOne.prepend(GemExtensions::ActiveRecord::Associations::Builder::HasOne)
-ActiveRecord::Associations::Builder::HasMany.prepend(GemExtensions::ActiveRecord::Associations::Builder::HasMany)
-ActiveRecord::Associations::HasOneThroughAssociation.prepend(GemExtensions::ActiveRecord::Associations::HasOneThroughAssociation)
-ActiveRecord::Associations::HasManyThroughAssociation.prepend(GemExtensions::ActiveRecord::Associations::HasManyThroughAssociation)
-ActiveRecord::Associations::Preloader::ThroughAssociation.prepend(GemExtensions::ActiveRecord::Associations::Preloader::ThroughAssociation)
-ActiveRecord::Base.extend(GemExtensions::ActiveRecord::DelegateCache)
diff --git a/config/initializers/01_active_record_database_tasks_configuration_flag.rb b/config/initializers/01_active_record_database_tasks_configuration_flag.rb
deleted file mode 100644
index 37374a41a30..00000000000
--- a/config/initializers/01_active_record_database_tasks_configuration_flag.rb
+++ /dev/null
@@ -1,37 +0,0 @@
-# frozen_string_literal: true
-
-if Rails::VERSION::MAJOR >= 7
- raise "Remove `#{__FILE__}`. This is backport of `database_tasks:` Rails 7.x feature."
-end
-
-# This backports `database_tasks:` feature to skip running migrations for some databases
-# PR: https://github.com/rails/rails/pull/42794/files
-
-module DatabaseTasks
- module ActiveRecordDatabaseConfigurations
- def configs_for(env_name: nil, name: nil, include_replicas: false)
- configs = super
-
- unless include_replicas
- if name
- configs = nil unless configs&.database_tasks?
- else
- configs = configs.select do |db_config|
- db_config.database_tasks?
- end
- end
- end
-
- configs
- end
- end
-
- module ActiveRecordDatabaseConfigurationsHashConfig
- def database_tasks? # :nodoc:
- !replica? && !!configuration_hash.fetch(:database_tasks, true)
- end
- end
-end
-
-ActiveRecord::DatabaseConfigurations.prepend(DatabaseTasks::ActiveRecordDatabaseConfigurations)
-ActiveRecord::DatabaseConfigurations::HashConfig.prepend(DatabaseTasks::ActiveRecordDatabaseConfigurationsHashConfig)
diff --git a/config/initializers/1_active_record_data_types.rb b/config/initializers/1_active_record_data_types.rb
index ba4ca8b3b5c..5c0671f2ca3 100644
--- a/config/initializers/1_active_record_data_types.rb
+++ b/config/initializers/1_active_record_data_types.rb
@@ -26,14 +26,16 @@ module RegisterDateTimeWithTimeZone
#
# When schema dumping, `timestamptz` columns will be output as
# `t.datetime_with_timezone`.
- def initialize_type_map(mapping = type_map)
- super mapping
-
- register_class_with_precision(
- mapping,
- 'timestamptz',
- ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::OID::DateTimeWithTimeZone
- )
+ class << self
+ def initialize_type_map(mapping = type_map)
+ super mapping
+
+ register_class_with_precision(
+ mapping,
+ 'timestamptz',
+ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::OID::DateTimeWithTimeZone
+ )
+ end
end
end
diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb
index 33225c1945d..50d26236a29 100644
--- a/config/initializers/1_settings.rb
+++ b/config/initializers/1_settings.rb
@@ -807,6 +807,9 @@ Gitlab.ee do
Settings.cron_jobs['vulnerability_historical_statistics_deletion_worker'] ||= {}
Settings.cron_jobs['vulnerability_historical_statistics_deletion_worker']['cron'] ||= '15 3 * * *'
Settings.cron_jobs['vulnerability_historical_statistics_deletion_worker']['job_class'] = 'Vulnerabilities::HistoricalStatistics::DeletionWorker'
+ Settings.cron_jobs['vulnerability_orphaned_remediations_cleanup_worker'] ||= {}
+ Settings.cron_jobs['vulnerability_orphaned_remediations_cleanup_worker']['job_class'] = 'Vulnerabilities::OrphanedRemediationsCleanupWorker'
+ Settings.cron_jobs['vulnerability_orphaned_remediations_cleanup_worker']['cron'] ||= '15 3 3 * *'
Settings.cron_jobs['security_create_orchestration_policy_worker'] ||= {}
Settings.cron_jobs['security_create_orchestration_policy_worker']['cron'] ||= '*/10 * * * *'
Settings.cron_jobs['security_create_orchestration_policy_worker']['job_class'] = 'Security::CreateOrchestrationPolicyWorker'
@@ -837,15 +840,18 @@ Gitlab.ee do
Settings.cron_jobs['abandoned_trial_emails'] ||= {}
Settings.cron_jobs['abandoned_trial_emails']['cron'] ||= "0 1 * * *"
Settings.cron_jobs['abandoned_trial_emails']['job_class'] = 'Emails::AbandonedTrialEmailsCronWorker'
- Settings.cron_jobs['package_metadata_sync_worker'] ||= {}
- Settings.cron_jobs['package_metadata_sync_worker']['cron'] ||= "*/5 * * * *"
- Settings.cron_jobs['package_metadata_sync_worker']['job_class'] = 'PackageMetadata::SyncWorker'
+ Settings.cron_jobs['package_metadata_licenses_sync_worker'] ||= {}
+ Settings.cron_jobs['package_metadata_licenses_sync_worker']['cron'] ||= "*/5 * * * *"
+ Settings.cron_jobs['package_metadata_licenses_sync_worker']['job_class'] = 'PackageMetadata::LicensesSyncWorker'
Settings.cron_jobs['compliance_violations_consistency_worker'] ||= {}
Settings.cron_jobs['compliance_violations_consistency_worker']['cron'] ||= '0 1 * * *'
Settings.cron_jobs['compliance_violations_consistency_worker']['job_class'] = 'ComplianceManagement::MergeRequests::ComplianceViolationsConsistencyWorker'
Settings.cron_jobs['users_delete_unconfirmed_users_worker'] ||= {}
Settings.cron_jobs['users_delete_unconfirmed_users_worker']['cron'] ||= '0 * * * *'
Settings.cron_jobs['users_delete_unconfirmed_users_worker']['job_class'] = 'Users::UnconfirmedUsersDeletionCronWorker'
+ Settings.cron_jobs['package_metadata_advisories_sync_worker'] ||= {}
+ Settings.cron_jobs['package_metadata_advisories_sync_worker']['cron'] ||= "*/5 * * * *"
+ Settings.cron_jobs['package_metadata_advisories_sync_worker']['job_class'] = 'PackageMetadata::AdvisoriesSyncWorker'
Gitlab.com do
Settings.cron_jobs['free_user_cap_backfill_notification_jobs_worker'] ||= {}
diff --git a/config/initializers/7_redis.rb b/config/initializers/7_redis.rb
index 61b660ec6a3..b66a5e70f56 100644
--- a/config/initializers/7_redis.rb
+++ b/config/initializers/7_redis.rb
@@ -4,6 +4,23 @@ require 'gitlab/redis'
Redis.raise_deprecations = true unless Rails.env.production?
+# rubocop:disable Gitlab/NoCodeCoverageComment
+# :nocov: This snippet is for local development only, reloading in specs would raise NameError
+if Rails.env.development?
+ # reset all pools in the event of a reload
+ # This makes sure that there are no stale references to classes in the `Gitlab::Redis` namespace
+ # that also got reloaded.
+ Gitlab::Application.config.to_prepare do
+ Gitlab::Redis::ALL_CLASSES.each do |redis_instance|
+ redis_instance.instance_variable_set(:@pool, nil)
+ end
+
+ Rails.cache = ActiveSupport::Cache::RedisCacheStore.new(**Gitlab::Redis::Cache.active_support_config)
+ end
+end
+# :nocov:
+# rubocop:enable Gitlab/NoCodeCoverageComment
+
Redis::Client.prepend(Gitlab::Instrumentation::RedisInterceptor)
Redis::Cluster::NodeLoader.prepend(Gitlab::Patch::NodeLoader)
Redis::Cluster.prepend(Gitlab::Patch::RedisCluster)
diff --git a/config/initializers/action_cable.rb b/config/initializers/action_cable.rb
index 3f9ceb7cfa7..0d2073586be 100644
--- a/config/initializers/action_cable.rb
+++ b/config/initializers/action_cable.rb
@@ -10,7 +10,6 @@ Rails.application.configure do
end
ActionCable::SubscriptionAdapter::Base.prepend(Gitlab::Patch::ActionCableSubscriptionAdapterIdentifier)
-ActionCable::SubscriptionAdapter::Redis::Listener.prepend(Gitlab::Patch::ActionCableRedisListener)
# https://github.com/rails/rails/blob/bb5ac1623e8de08c1b7b62b1368758f0d3bb6379/actioncable/lib/action_cable/subscription_adapter/redis.rb#L18
ActionCable::SubscriptionAdapter::Redis.redis_connector = lambda do |config|
diff --git a/config/initializers/action_dispatch_journey_router.rb b/config/initializers/action_dispatch_journey_router.rb
new file mode 100644
index 00000000000..14f5ee367a6
--- /dev/null
+++ b/config/initializers/action_dispatch_journey_router.rb
@@ -0,0 +1,51 @@
+# frozen_string_literal: true
+
+module ActionDispatch
+ module Journey
+ class Router
+ private
+
+ # Besides the patch, this method is a duplicate for the original method defined in Rails:
+ # https://github.com/rails/rails/blob/v7.0.5/actionpack/lib/action_dispatch/journey/router.rb#L109-L132
+ # See https://github.com/rails/rails/issues/47244
+ def find_routes(req)
+ path_info = req.path_info
+ routes = filter_routes(path_info).concat custom_routes.find_all { |r|
+ r.path.match?(path_info)
+ }
+
+ if req.head?
+ routes = match_head_routes(routes, req)
+ else
+ routes.select! { |r| r.matches?(req) }
+ end
+
+ routes.sort_by!(&:precedence)
+
+ routes.map! do |r|
+ match_data = r.path.match(path_info)
+ path_parameters = {}
+
+ # This is the patch we are adding. This handles routes where `r.matches?` above is true
+ # but the route does not actually match due to other constraints
+ #
+ # Without this line the following error is raised:
+ #
+ # NoMethodError:
+ # undefined method `names' for nil:NilClass
+ #
+ # The behavior is covered by spec/initializers/action_dispatch_journey_router_spec.rb
+ next if match_data.nil?
+
+ match_data.names.each_with_index do |name, i|
+ val = match_data[i + 1]
+ path_parameters[name.to_sym] = Utils.unescape_uri(val) if val
+ end
+ [match_data, path_parameters, r]
+ end.compact!
+
+ routes
+ end
+ end
+ end
+end
diff --git a/config/initializers/active_record_migrations.rb b/config/initializers/active_record_migrations.rb
index 6e5d519e11b..6465753aa2e 100644
--- a/config/initializers/active_record_migrations.rb
+++ b/config/initializers/active_record_migrations.rb
@@ -3,3 +3,24 @@
Gitlab::Database::Migrations::LockRetryMixin.patch!
Gitlab::Database::Migrations::PgBackendPid.patch!
Gitlab::Database::Migrations::RunnerBackoff::ActiveRecordMixin.patch!
+
+# This patch rolls back to Rails 6.1 behavior:
+#
+# https://github.com/rails/rails/blob/v6.1.4.3/activerecord/lib/active_record/migration.rb#L1044
+#
+# It fixes the tests that relies on the fact that the same constants have the same object_id.
+# For example to make sure that stub_const works correctly.
+#
+# It overrides the new behavior that removes the constant first:
+#
+# https://github.com/rails/rails/blob/v7.0.5/activerecord/lib/active_record/migration.rb#L1054
+module ActiveRecord
+ class MigrationProxy
+ private
+
+ def load_migration
+ require(File.expand_path(filename))
+ name.constantize.new(name, version)
+ end
+ end
+end
diff --git a/config/initializers/active_record_postgresql_adapter.rb b/config/initializers/active_record_postgresql_adapter.rb
index 14bc7153f44..7bb03a0af96 100644
--- a/config/initializers/active_record_postgresql_adapter.rb
+++ b/config/initializers/active_record_postgresql_adapter.rb
@@ -1,9 +1,5 @@
# frozen_string_literal: true
-if Gitlab::Utils.to_boolean(ENV['ENABLE_ACTIVERECORD_EMPTY_PING'], default: true)
- ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.prepend(Gitlab::Database::PostgresqlAdapter::EmptyQueryPing)
-end
-
if Gitlab::Utils.to_boolean(ENV['ENABLE_ACTIVERECORD_TYPEMAP_CACHE'], default: true)
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.prepend(Gitlab::Database::PostgresqlAdapter::TypeMapCache)
end
diff --git a/config/initializers/active_record_preloader.rb b/config/initializers/active_record_preloader.rb
index 19ca380a866..6443ce66b51 100644
--- a/config/initializers/active_record_preloader.rb
+++ b/config/initializers/active_record_preloader.rb
@@ -1,42 +1,64 @@
# frozen_string_literal: true
+# Some polymorphic associations may refer to an object which is not a subclass of ActiveRecord.
+# This patch skips preloading of these associations.
+#
+# For example, a note's noteable can be an Issue, Merge Request, or Commit, where Commit is
+# not a subclass of ActiveRecord. When you run something like:
+#
+# Note.includes(noteable: :assignees).to_a
+#
+# This patch allows preloading of issues, merge requests, and their assignees while skipping
+# commits.
+
module ActiveRecord
module Associations
class Preloader
- def initialize(records: nil, associations: nil)
- super()
-
- @records = records
- @associations = associations
- end
+ class Association
+ class LoaderQuery
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/385739
+ module HandlePreloadsForDifferentClassesSeparately
+ def eql?(other)
+ scope.klass == other.scope.klass && super
+ end
- def call
- preload(@records, @associations)
- end
+ def hash
+ [scope.klass, association_key_name, scope.table_name, scope.values_for_queries].hash
+ end
+ end
- class NullPreloader
- def self.new(*args, **kwargs)
- self
+ prepend HandlePreloadsForDifferentClassesSeparately
end
- def self.run
- self
- end
+ module NonActiveRecordPreloader
+ # https://github.com/rails/rails/blob/v7.0.5/activerecord/lib/active_record/associations/preloader/association.rb#L114-L116
+ def run?
+ return true unless klass < ActiveRecord::Base
- def self.preloaded_records
- []
- end
- end
+ super
+ end
- module NoCommitPreloader
- def preloader_for(reflection, owners)
- return NullPreloader if owners.first.association(reflection.name).klass == ::Commit
+ # https://github.com/rails/rails/blob/v7.0.5/activerecord/lib/active_record/associations/preloader/association.rb#L137-L141
+ def preloaded_records
+ return [] unless klass < ActiveRecord::Base
- super
+ super
+ end
end
+
+ prepend NonActiveRecordPreloader
end
- prepend NoCommitPreloader
+ class Branch
+ module NonActiveRecordPreloader
+ # https://github.com/rails/rails/blob/v7.0.5/activerecord/lib/active_record/associations/preloader/branch.rb#L37-L45
+ def target_classes
+ super.delete_if { |klass| !(klass < ActiveRecord::Base) }
+ end
+ end
+
+ prepend NonActiveRecordPreloader
+ end
end
end
end
diff --git a/config/initializers/click_house.rb b/config/initializers/click_house.rb
new file mode 100644
index 00000000000..c1bec683c6b
--- /dev/null
+++ b/config/initializers/click_house.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+return unless File.exist?(Rails.root.join('config/click_house.yml'))
+
+raw_config = Rails.application.config_for(:click_house)
+
+return if raw_config.blank?
+
+ClickHouse::Client.configure do |config|
+ raw_config.each do |database_identifier, db_config|
+ config.register_database(database_identifier,
+ database: db_config[:database],
+ url: db_config[:url],
+ username: db_config[:username],
+ password: db_config[:password],
+ variables: db_config[:variables] || {}
+ )
+ end
+
+ config.json_parser = Gitlab::Json
+ config.http_post_proc = ->(url, headers, body) do
+ options = {
+ headers: headers,
+ body: body,
+ allow_local_requests: Rails.env.development? || Rails.env.test?
+ }
+
+ response = Gitlab::HTTP.post(url, options)
+ ClickHouse::Client::Response.new(response.body, response.code)
+ end
+end
diff --git a/config/initializers/grpc_patch.rb b/config/initializers/grpc_patch.rb
new file mode 100644
index 00000000000..a6094f85c94
--- /dev/null
+++ b/config/initializers/grpc_patch.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+require 'grpc'
+
+# grpc v1.42 and up introduced a regression where a non-standard
+# exception, `GRPC::Core::CallError`, is raised instead of
+# DeadlineExceeded: https://github.com/grpc/grpc/issues/33283.
+# This patch applies https://github.com/grpc/grpc/pull/33565.
+module Gitlab
+ module GRPCPatch
+ module ActiveCall
+ def remote_read
+ super
+ ensure
+ # Ensure we don't attempt to request the initial metadata again
+ # in case an exception occurs.
+ @metadata_received = true # rubocop:disable Gitlab/ModuleWithInstanceVariables
+ end
+
+ def receive_and_check_status
+ super
+ ensure
+ # Ensure we don't attempt to request the initial metadata again
+ # in case an exception occurs.
+ @metadata_received = true # rubocop:disable Gitlab/ModuleWithInstanceVariables
+ end
+ end
+ end
+end
+
+GRPC::ActiveCall.prepend Gitlab::GRPCPatch::ActiveCall
diff --git a/config/initializers/internal_events.rb b/config/initializers/internal_events.rb
new file mode 100644
index 00000000000..6101bf84f3d
--- /dev/null
+++ b/config/initializers/internal_events.rb
@@ -0,0 +1,3 @@
+# frozen_string_literal: true
+
+Gitlab::InternalEvents::EventDefinitions.load_configurations
diff --git a/config/initializers/remove_active_job_execute_callback.rb b/config/initializers/remove_active_job_execute_callback.rb
index c8efcb11202..c8fc9a6b98b 100644
--- a/config/initializers/remove_active_job_execute_callback.rb
+++ b/config/initializers/remove_active_job_execute_callback.rb
@@ -16,8 +16,8 @@ Rails.application.configure do
callbacks &&
callbacks.send(:chain).size == 1 &&
callbacks.first.kind == :around &&
- callbacks.first.raw_filter.is_a?(Proc) &&
- callbacks.first.raw_filter.source_location.first.ends_with?('lib/active_job/railtie.rb')
+ callbacks.first.filter.is_a?(Proc) &&
+ callbacks.first.filter.source_location.first.ends_with?('lib/active_job/railtie.rb')
end
if active_job_railtie_callback?
diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb
index 40c56d27eb9..2b47455f17f 100644
--- a/config/initializers/sidekiq.rb
+++ b/config/initializers/sidekiq.rb
@@ -53,7 +53,7 @@ Sidekiq.configure_server do |config|
config.server_middleware(&Gitlab::SidekiqMiddleware.server_configurator(
metrics: Settings.monitoring.sidekiq_exporter,
arguments_logger: SidekiqLogArguments.enabled? && !enable_json_logs,
- defer_jobs: Gitlab::Utils.to_boolean(ENV['SIDEKIQ_DEFER_JOBS'], default: true)
+ skip_jobs: Gitlab::Utils.to_boolean(ENV['SIDEKIQ_SKIP_JOBS'], default: true)
))
config.client_middleware(&Gitlab::SidekiqMiddleware.client_configurator)
diff --git a/config/initializers/wrap_parameters.rb b/config/initializers/wrap_parameters.rb
deleted file mode 100644
index 85b2d840618..00000000000
--- a/config/initializers/wrap_parameters.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-# Be sure to restart your server when you modify this file.
-#
-# This file contains settings for ActionController::ParamsWrapper which
-# is enabled by default.
-
-# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
-ActiveSupport.on_load(:action_controller) do
- wrap_parameters format: [:json]
-end
-
-# Disable root element in JSON by default.
-ActiveSupport.on_load(:active_record) do
- self.include_root_in_json = false
-end
diff --git a/config/initializers_before_autoloader/000_inflections.rb b/config/initializers_before_autoloader/000_inflections.rb
index 41ffa454b4f..178fb50b7f3 100644
--- a/config/initializers_before_autoloader/000_inflections.rb
+++ b/config/initializers_before_autoloader/000_inflections.rb
@@ -34,6 +34,7 @@ ActiveSupport::Inflector.inflections do |inflect|
project_auto_devops
project_registry
project_wiki_repository_registry
+ project_repository_registry
project_statistics
snippet_repository_registry
system_note_metadata
diff --git a/config/locales/doorkeeper.en.yml b/config/locales/doorkeeper.en.yml
index 63bbab67039..b571801c006 100644
--- a/config/locales/doorkeeper.en.yml
+++ b/config/locales/doorkeeper.en.yml
@@ -76,6 +76,7 @@ en:
profile: Allows read-only access to the user's personal information using OpenID Connect
email: Allows read-only access to the user's primary email address using OpenID Connect
admin_mode: Admin Mode is a functionality designed to limit the access level of administrator's personal access tokens.
+ create_runner: Grants create access to the runners
scope_desc:
api:
Grants complete read/write access to the API, including all groups and projects, the container registry, and the package registry.
@@ -105,6 +106,8 @@ en:
Grants read-only access to the user's primary email address using OpenID Connect.
admin_mode:
Grants permission to perform API actions as an administrator, when Admin Mode is enabled.
+ create_runner:
+ Grants create access to the runners.
project_access_token_scope_desc:
api:
Grants complete read and write access to the scoped project API, including the Package Registry.
@@ -118,6 +121,8 @@ en:
Grants read access (pull) to the Container Registry images if a project is private and authorization is required.
write_registry:
Grants write access (push) to the Container Registry.
+ create_runner:
+ Grants create access to the runners.
flash:
applications:
create:
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 1de1c20259d..9f00439294c 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -25,6 +25,8 @@ en:
member:
user: "The member's email address"
invite_email: "The member's email address"
+ personal_access_token:
+ expires_at: "Expiration date"
project/error_tracking_setting:
token: "Auth Token"
project: "Project"
@@ -37,6 +39,11 @@ en:
grafana_enabled: "Grafana integration enabled"
service_desk_setting:
project_key: "Project name suffix"
+ system_access/microsoft_application:
+ tenant_xid: "Tenant ID"
+ client_xid: "Client ID"
+ login_endpoint: "Login API endpoint"
+ graph_endpoint: "Graph API endpoint"
user/user_detail:
job_title: 'Job title'
bio: 'Bio'
diff --git a/config/metrics/counts_28d/20210216175132_i_code_review_user_create_mr_monthly.yml b/config/metrics/counts_28d/20210216175132_i_code_review_user_create_mr_monthly.yml
index fbcacf73dfc..400d7f2600d 100644
--- a/config/metrics/counts_28d/20210216175132_i_code_review_user_create_mr_monthly.yml
+++ b/config/metrics/counts_28d/20210216175132_i_code_review_user_create_mr_monthly.yml
@@ -8,7 +8,7 @@ product_group: code_review
value_type: number
status: active
time_frame: 28d
-data_source: redis_hll
+data_source: internal_events
instrumentation_class: RedisHLLMetric
options:
events:
diff --git a/config/metrics/counts_28d/20210216175436_projects_slack_notifications_active.yml b/config/metrics/counts_28d/20210216175436_projects_slack_notifications_active.yml
new file mode 100644
index 00000000000..46dbe74dde4
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175436_projects_slack_notifications_active.yml
@@ -0,0 +1,21 @@
+---
+data_category: optional
+key_path: usage_activity_by_stage_monthly.configure.projects_slack_notifications_active
+description: Unique projects created in the past 28 days that have Slack notifications
+ enabled
+product_section: dev
+product_stage: manage
+product_group: integrations
+value_type: number
+status: active
+time_frame: 28d
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+performance_indicator_type: []
+milestone: "<13.9"
diff --git a/config/metrics/counts_28d/20210216175437_projects_slack_slash_active.yml b/config/metrics/counts_28d/20210216175437_projects_slack_slash_active.yml
new file mode 100644
index 00000000000..cdb00803aad
--- /dev/null
+++ b/config/metrics/counts_28d/20210216175437_projects_slack_slash_active.yml
@@ -0,0 +1,21 @@
+---
+data_category: optional
+key_path: usage_activity_by_stage_monthly.configure.projects_slack_slash_active
+description: Unique projects created in the past 28 days that have Slack ‘/’ commands
+ enabled
+product_section: dev
+product_stage: manage
+product_group: integrations
+value_type: number
+status: active
+time_frame: 28d
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+performance_indicator_type: []
+milestone: "<13.9"
diff --git a/config/metrics/counts_28d/20210216181147_service_desk_enabled_projects.yml b/config/metrics/counts_28d/20210216181147_service_desk_enabled_projects.yml
index f45f7be3022..0e9945546f3 100644
--- a/config/metrics/counts_28d/20210216181147_service_desk_enabled_projects.yml
+++ b/config/metrics/counts_28d/20210216181147_service_desk_enabled_projects.yml
@@ -1,7 +1,7 @@
---
data_category: optional
key_path: usage_activity_by_stage_monthly.plan.service_desk_enabled_projects
-description: Count creator ids from projects with service desk enabled
+description: Count unique users who created projects (creator_id) with service desk enabled
product_section: ops
product_stage: monitor
product_group: respond
diff --git a/config/metrics/counts_28d/20210216181323_g_project_management_issue_created_monthly.yml b/config/metrics/counts_28d/20210216181323_g_project_management_issue_created_monthly.yml
index 0389fe6a513..1171cf48812 100644
--- a/config/metrics/counts_28d/20210216181323_g_project_management_issue_created_monthly.yml
+++ b/config/metrics/counts_28d/20210216181323_g_project_management_issue_created_monthly.yml
@@ -8,11 +8,14 @@ product_group: project_management
value_type: number
status: active
time_frame: 28d
-data_source: redis_hll
+data_source: internal_events
instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_created
+events:
+ - name: g_project_management_issue_created
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20211118200530_p_ci_templates_security_dast_on_demand_api_scan_monthly.yml b/config/metrics/counts_28d/20211118200530_p_ci_templates_security_dast_on_demand_api_scan_monthly.yml
new file mode 100644
index 00000000000..b15681e4ec9
--- /dev/null
+++ b/config/metrics/counts_28d/20211118200530_p_ci_templates_security_dast_on_demand_api_scan_monthly.yml
@@ -0,0 +1,26 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_security_dast_on_demand_api_scan_monthly
+name: "dast_on_demand_api_scan"
+description: Count of pipelines using the latest DAST API template
+product_section: sec
+product_stage: secure
+product_group: "dynamic_analysis"
+value_type: number
+status: active
+milestone: "14.7"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/73564
+time_frame: 28d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+options:
+ events:
+ - p_ci_templates_security_dast_on_demand_api_scan
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20220729001651_agent_users_using_ci_tunnel_monthly.yml b/config/metrics/counts_28d/20220729001651_agent_users_using_ci_tunnel_monthly.yml
index 6952fdc5ba6..a16dbc17f05 100644
--- a/config/metrics/counts_28d/20220729001651_agent_users_using_ci_tunnel_monthly.yml
+++ b/config/metrics/counts_28d/20220729001651_agent_users_using_ci_tunnel_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.kubernetes_agent.agent_users_using_ci_tunnel_monthl
description: MAU of the Agent for Kubernetes CI/CD Tunnel
product_section: ops
product_stage: deploy
-product_group: environment
+product_group: environments
product_category: deployment_management
value_type: number
status: active
diff --git a/config/metrics/counts_28d/20230620070723_k8s_api_proxy_requests_unique_agents_via_ci_access_monthly.yml b/config/metrics/counts_28d/20230620070723_k8s_api_proxy_requests_unique_agents_via_ci_access_monthly.yml
new file mode 100644
index 00000000000..7520def5bda
--- /dev/null
+++ b/config/metrics/counts_28d/20230620070723_k8s_api_proxy_requests_unique_agents_via_ci_access_monthly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.kubernetes_agent.k8s_api_proxy_requests_unique_agents_via_ci_access_monthly
+description: MAU of the unique Agents using the CI/CD Tunnel via Ci Access
+product_section: ops
+product_stage: deploy
+product_group: environment
+value_type: number
+status: active
+milestone: "16.2"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124147
+time_frame: 28d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+options:
+ events:
+ - k8s_api_proxy_requests_unique_agents_via_ci_access
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20230620070723_k8s_api_proxy_requests_unique_agents_via_user_access_monthly.yml b/config/metrics/counts_28d/20230620070723_k8s_api_proxy_requests_unique_agents_via_user_access_monthly.yml
new file mode 100644
index 00000000000..53b6914b8e0
--- /dev/null
+++ b/config/metrics/counts_28d/20230620070723_k8s_api_proxy_requests_unique_agents_via_user_access_monthly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.kubernetes_agent.k8s_api_proxy_requests_unique_agents_via_user_access_monthly
+description: MAU of the unique Agents using the CI/CD Tunnel via User Access
+product_section: ops
+product_stage: deploy
+product_group: environment
+value_type: number
+status: active
+milestone: "16.2"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124147
+time_frame: 28d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+options:
+ events:
+ - k8s_api_proxy_requests_unique_agents_via_user_access
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20230620070723_k8s_api_proxy_requests_unique_users_via_ci_access_monthly.yml b/config/metrics/counts_28d/20230620070723_k8s_api_proxy_requests_unique_users_via_ci_access_monthly.yml
new file mode 100644
index 00000000000..10e0c13e8e3
--- /dev/null
+++ b/config/metrics/counts_28d/20230620070723_k8s_api_proxy_requests_unique_users_via_ci_access_monthly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.kubernetes_agent.k8s_api_proxy_requests_unique_users_via_ci_access_monthly
+description: MAU of the unique Users using the CI/CD Tunnel via Ci Access
+product_section: ops
+product_stage: deploy
+product_group: environment
+value_type: number
+status: active
+milestone: "16.2"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124147
+time_frame: 28d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+options:
+ events:
+ - k8s_api_proxy_requests_unique_users_via_ci_access
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20230620070723_k8s_api_proxy_requests_unique_users_via_user_access_monthly.yml b/config/metrics/counts_28d/20230620070723_k8s_api_proxy_requests_unique_users_via_user_access_monthly.yml
new file mode 100644
index 00000000000..0ffcd3e9c75
--- /dev/null
+++ b/config/metrics/counts_28d/20230620070723_k8s_api_proxy_requests_unique_users_via_user_access_monthly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.kubernetes_agent.k8s_api_proxy_requests_unique_users_via_user_access_monthly
+description: MAU of the unique Users using the CI/CD Tunnel via User Access
+product_section: ops
+product_stage: deploy
+product_group: environment
+value_type: number
+status: active
+milestone: "16.2"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124147
+time_frame: 28d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+options:
+ events:
+ - k8s_api_proxy_requests_unique_users_via_user_access
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20230630153556_flux_git_push_notified_unique_projects_monthly.yml b/config/metrics/counts_28d/20230630153556_flux_git_push_notified_unique_projects_monthly.yml
new file mode 100644
index 00000000000..90cee0ab415
--- /dev/null
+++ b/config/metrics/counts_28d/20230630153556_flux_git_push_notified_unique_projects_monthly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.kubernetes_agent.flux_git_push_notified_unique_projects_monthly
+description: MAU of the unique projects which were notified by agentk about new Git push events in order to reconcile their Flux workloads
+product_section: ops
+product_stage: deploy
+product_group: environment
+value_type: number
+status: active
+milestone: "16.2"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/125146
+time_frame: 28d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+options:
+ events:
+ - flux_git_push_notified_unique_projects
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210216175130_i_code_review_user_create_mr_weekly.yml b/config/metrics/counts_7d/20210216175130_i_code_review_user_create_mr_weekly.yml
index ab96036053d..71a0be2fe13 100644
--- a/config/metrics/counts_7d/20210216175130_i_code_review_user_create_mr_weekly.yml
+++ b/config/metrics/counts_7d/20210216175130_i_code_review_user_create_mr_weekly.yml
@@ -8,11 +8,14 @@ product_group: code_review
value_type: number
status: active
time_frame: 7d
-data_source: redis_hll
+data_source: internal_events
instrumentation_class: RedisHLLMetric
options:
events:
- i_code_review_user_create_mr
+events:
+ - name: i_code_review_user_create_mr
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_7d/20210216181321_g_project_management_issue_created_weekly.yml b/config/metrics/counts_7d/20210216181321_g_project_management_issue_created_weekly.yml
index e12d8240d5f..97c32f8f7ae 100644
--- a/config/metrics/counts_7d/20210216181321_g_project_management_issue_created_weekly.yml
+++ b/config/metrics/counts_7d/20210216181321_g_project_management_issue_created_weekly.yml
@@ -8,11 +8,14 @@ product_group: project_management
value_type: number
status: active
time_frame: 7d
-data_source: redis_hll
+data_source: internal_events
instrumentation_class: RedisHLLMetric
options:
events:
- g_project_management_issue_created
+events:
+ - name: g_project_management_issue_created
+ unique: user.id
distribution:
- ce
- ee
diff --git a/config/metrics/counts_7d/20211118200524_p_ci_templates_security_dast_on_demand_api_scan_weekly.yml b/config/metrics/counts_7d/20211118200524_p_ci_templates_security_dast_on_demand_api_scan_weekly.yml
new file mode 100644
index 00000000000..8509bf20835
--- /dev/null
+++ b/config/metrics/counts_7d/20211118200524_p_ci_templates_security_dast_on_demand_api_scan_weekly.yml
@@ -0,0 +1,26 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_security_dast_on_demand_api_scan_weekly
+name: "dast_on_demand_api_scan"
+description: Count of pipelines using the latest DAST API template
+product_section: sec
+product_stage: secure
+product_group: "dynamic_analysis"
+value_type: number
+status: active
+milestone: "14.7"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/73564
+time_frame: 7d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+options:
+ events:
+ - p_ci_templates_security_dast_on_demand_api_scan
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20230620070722_k8s_api_proxy_requests_unique_agents_via_ci_access_weekly.yml b/config/metrics/counts_7d/20230620070722_k8s_api_proxy_requests_unique_agents_via_ci_access_weekly.yml
new file mode 100644
index 00000000000..41f97e698a2
--- /dev/null
+++ b/config/metrics/counts_7d/20230620070722_k8s_api_proxy_requests_unique_agents_via_ci_access_weekly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.kubernetes_agent.k8s_api_proxy_requests_unique_agents_via_ci_access_weekly
+description: WAU of the unique Agents using the CI/CD Tunnel via Ci Access
+product_section: ops
+product_stage: deploy
+product_group: environment
+value_type: number
+status: active
+milestone: "16.2"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124147
+time_frame: 7d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+options:
+ events:
+ - k8s_api_proxy_requests_unique_agents_via_ci_access
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20230620070722_k8s_api_proxy_requests_unique_users_via_ci_access_weekly.yml b/config/metrics/counts_7d/20230620070722_k8s_api_proxy_requests_unique_users_via_ci_access_weekly.yml
new file mode 100644
index 00000000000..22580c0cf4a
--- /dev/null
+++ b/config/metrics/counts_7d/20230620070722_k8s_api_proxy_requests_unique_users_via_ci_access_weekly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.kubernetes_agent.k8s_api_proxy_requests_unique_users_via_ci_access_weekly
+description: WAU of the unique Users using the CI/CD Tunnel via Ci Access
+product_section: ops
+product_stage: deploy
+product_group: environment
+value_type: number
+status: active
+milestone: "16.2"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124147
+time_frame: 7d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+options:
+ events:
+ - k8s_api_proxy_requests_unique_users_via_ci_access
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20230620070723_k8s_api_proxy_requests_unique_agents_via_user_access_weekly.yml b/config/metrics/counts_7d/20230620070723_k8s_api_proxy_requests_unique_agents_via_user_access_weekly.yml
new file mode 100644
index 00000000000..5bd58ecd99d
--- /dev/null
+++ b/config/metrics/counts_7d/20230620070723_k8s_api_proxy_requests_unique_agents_via_user_access_weekly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.kubernetes_agent.k8s_api_proxy_requests_unique_agents_via_user_access_weekly
+description: WAU of the unique Agents using the CI/CD Tunnel via User Access
+product_section: ops
+product_stage: deploy
+product_group: environment
+value_type: number
+status: active
+milestone: "16.2"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124147
+time_frame: 7d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+options:
+ events:
+ - k8s_api_proxy_requests_unique_agents_via_user_access
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20230620070723_k8s_api_proxy_requests_unique_users_via_user_access_weekly.yml b/config/metrics/counts_7d/20230620070723_k8s_api_proxy_requests_unique_users_via_user_access_weekly.yml
new file mode 100644
index 00000000000..35d1fe7346b
--- /dev/null
+++ b/config/metrics/counts_7d/20230620070723_k8s_api_proxy_requests_unique_users_via_user_access_weekly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.kubernetes_agent.k8s_api_proxy_requests_unique_users_via_user_access_weekly
+description: WAU of the unique Users using the CI/CD Tunnel via User Access
+product_section: ops
+product_stage: deploy
+product_group: environment
+value_type: number
+status: active
+milestone: "16.2"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124147
+time_frame: 7d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+options:
+ events:
+ - k8s_api_proxy_requests_unique_users_via_user_access
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20230630153554_flux_git_push_notified_unique_projects_weekly.yml b/config/metrics/counts_7d/20230630153554_flux_git_push_notified_unique_projects_weekly.yml
new file mode 100644
index 00000000000..3618404d21b
--- /dev/null
+++ b/config/metrics/counts_7d/20230630153554_flux_git_push_notified_unique_projects_weekly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.kubernetes_agent.flux_git_push_notified_unique_projects_weekly
+description: WAU of the unique projects which were notified by agentk about new Git push events in order to reconcile their Flux workloads
+product_section: ops
+product_stage: deploy
+product_group: environment
+value_type: number
+status: active
+milestone: "16.2"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/125146
+time_frame: 7d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+options:
+ events:
+ - flux_git_push_notified_unique_projects
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20210216175400_projects_slack_notifications_active.yml b/config/metrics/counts_all/20210216175400_projects_slack_notifications_active.yml
new file mode 100644
index 00000000000..603fcb34053
--- /dev/null
+++ b/config/metrics/counts_all/20210216175400_projects_slack_notifications_active.yml
@@ -0,0 +1,20 @@
+---
+data_category: optional
+key_path: usage_activity_by_stage.configure.projects_slack_notifications_active
+description: Unique projects with Slack webhook enabled
+product_section: dev
+product_stage: manage
+product_group: integrations
+value_type: number
+status: active
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+performance_indicator_type: []
+milestone: "<13.9"
diff --git a/config/metrics/counts_all/20210216175402_projects_slack_slash_active.yml b/config/metrics/counts_all/20210216175402_projects_slack_slash_active.yml
new file mode 100644
index 00000000000..4bbeabd7c87
--- /dev/null
+++ b/config/metrics/counts_all/20210216175402_projects_slack_slash_active.yml
@@ -0,0 +1,20 @@
+---
+data_category: optional
+key_path: usage_activity_by_stage.configure.projects_slack_slash_active
+description: Unique projects with Slack ‘/’ commands enabled
+product_section: dev
+product_stage: manage
+product_group: integrations
+value_type: number
+status: active
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+performance_indicator_type: []
+milestone: "<13.9"
diff --git a/config/metrics/counts_all/20210216180232_projects_jira_dvcs_cloud_active.yml b/config/metrics/counts_all/20210216180232_projects_jira_dvcs_cloud_active.yml
index 29edaa6ab3b..5bf8e1d6e78 100644
--- a/config/metrics/counts_all/20210216180232_projects_jira_dvcs_cloud_active.yml
+++ b/config/metrics/counts_all/20210216180232_projects_jira_dvcs_cloud_active.yml
@@ -9,6 +9,9 @@ value_type: number
status: active
time_frame: all
data_source: database
+instrumentation_class: CountProjectsWithJiraDvcsIntegrationMetric
+options:
+ cloud: true
distribution:
- ce
- ee
diff --git a/config/metrics/counts_all/20210216180234_projects_jira_dvcs_server_active.yml b/config/metrics/counts_all/20210216180234_projects_jira_dvcs_server_active.yml
index 9673956c7e1..bfb402c257e 100644
--- a/config/metrics/counts_all/20210216180234_projects_jira_dvcs_server_active.yml
+++ b/config/metrics/counts_all/20210216180234_projects_jira_dvcs_server_active.yml
@@ -9,6 +9,9 @@ value_type: number
status: active
time_frame: all
data_source: database
+instrumentation_class: CountProjectsWithJiraDvcsIntegrationMetric
+options:
+ cloud: false
distribution:
- ce
- ee
diff --git a/config/metrics/counts_all/20210216181122_service_desk_enabled_projects.yml b/config/metrics/counts_all/20210216181122_service_desk_enabled_projects.yml
index 30318cd2d3c..83f259a6473 100644
--- a/config/metrics/counts_all/20210216181122_service_desk_enabled_projects.yml
+++ b/config/metrics/counts_all/20210216181122_service_desk_enabled_projects.yml
@@ -1,7 +1,7 @@
---
data_category: optional
key_path: usage_activity_by_stage.plan.service_desk_enabled_projects
-description: Count creator ids from projects with service desk enabled
+description: Count unique users who created projects (creator_id) with service desk enabled
product_section: ops
product_stage: monitor
product_group: respond
diff --git a/config/metrics/counts_all/20220607141129_slack_app_installations_gbp.yml b/config/metrics/counts_all/20220607141129_slack_app_installations_gbp.yml
new file mode 100644
index 00000000000..70ac24bbe36
--- /dev/null
+++ b/config/metrics/counts_all/20220607141129_slack_app_installations_gbp.yml
@@ -0,0 +1,21 @@
+---
+key_path: counts.slack_app_installations_gbp
+description: Count of Slack app installations using the new GBP version
+product_section: dev
+product_stage: manage
+product_group: integrations
+value_type: number
+status: active
+milestone: "15.1"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/89130
+time_frame: all
+data_source: database
+data_category: optional
+instrumentation_class: CountSlackAppInstallationsGbpMetric
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20220607141417_slack_app_installations.yml b/config/metrics/counts_all/20220607141417_slack_app_installations.yml
new file mode 100644
index 00000000000..232b3a9ae56
--- /dev/null
+++ b/config/metrics/counts_all/20220607141417_slack_app_installations.yml
@@ -0,0 +1,21 @@
+---
+key_path: counts.slack_app_installations
+description: Count of Slack app installations
+product_section: dev
+product_stage: manage
+product_group: integrations
+value_type: number
+status: active
+milestone: "15.1"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/89130
+time_frame: all
+data_source: database
+data_category: optional
+instrumentation_class: CountSlackAppInstallationsMetric
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20230620073845_kubernetes_agent_k8s_api_proxy_requests_via_ci_access.yml b/config/metrics/counts_all/20230620073845_kubernetes_agent_k8s_api_proxy_requests_via_ci_access.yml
new file mode 100644
index 00000000000..5724755ad55
--- /dev/null
+++ b/config/metrics/counts_all/20230620073845_kubernetes_agent_k8s_api_proxy_requests_via_ci_access.yml
@@ -0,0 +1,25 @@
+---
+key_path: counts.kubernetes_agent_k8s_api_proxy_requests_via_ci_access
+description: Count of Kubernetes API proxy requests using the CI tunnel via Ci Access
+product_section: ops
+product_stage: deploy
+product_group: environments
+value_type: number
+status: active
+milestone: "16.2"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124147
+time_frame: all
+data_source: redis
+data_category: optional
+instrumentation_class: RedisMetric
+performance_indicator_type: []
+options:
+ prefix: kubernetes_agent
+ event: k8s_api_proxy_requests_via_ci_access
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20230620074102_kubernetes_agent_k8s_api_proxy_requests_via_user_access.yml b/config/metrics/counts_all/20230620074102_kubernetes_agent_k8s_api_proxy_requests_via_user_access.yml
new file mode 100644
index 00000000000..d480bbb922b
--- /dev/null
+++ b/config/metrics/counts_all/20230620074102_kubernetes_agent_k8s_api_proxy_requests_via_user_access.yml
@@ -0,0 +1,25 @@
+---
+key_path: counts.kubernetes_agent_k8s_api_proxy_requests_via_user_access
+description: Count of Kubernetes API proxy requests using the CI tunnel via User Access
+product_section: ops
+product_stage: deploy
+product_group: environments
+value_type: number
+status: active
+milestone: "16.2"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124147
+time_frame: all
+data_source: redis
+data_category: optional
+instrumentation_class: RedisMetric
+performance_indicator_type: []
+options:
+ prefix: kubernetes_agent
+ event: k8s_api_proxy_requests_via_user_access
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/objects_schemas/batched_background_migrations_metric.json b/config/metrics/objects_schemas/batched_background_migrations_metric.json
new file mode 100644
index 00000000000..968e804f600
--- /dev/null
+++ b/config/metrics/objects_schemas/batched_background_migrations_metric.json
@@ -0,0 +1,18 @@
+{
+ "type": "array",
+ "items": {
+ "type": [
+ {
+ "type": "object",
+ "properties": {
+ "job_class_name": {
+ "type": "string"
+ },
+ "elapsed_time": {
+ "type": "integer"
+ }
+ }
+ }
+ ]
+ }
+}
diff --git a/config/metrics/objects_schemas/schema_inconsistencies_metric.json b/config/metrics/objects_schemas/schema_inconsistencies_metric.json
new file mode 100644
index 00000000000..533d753bec1
--- /dev/null
+++ b/config/metrics/objects_schemas/schema_inconsistencies_metric.json
@@ -0,0 +1,22 @@
+{
+ "type": "array",
+ "items": {
+ "type": [
+ {
+ "type": "object",
+ "properties": {
+ "object_name": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of inconsistency"
+ },
+ "object_type": {
+ "type": "string"
+ }
+ }
+ }
+ ]
+ }
+}
diff --git a/config/metrics/schema.json b/config/metrics/schema.json
index d3afc779e14..90951f1b3dc 100644
--- a/config/metrics/schema.json
+++ b/config/metrics/schema.json
@@ -95,6 +95,29 @@
"options": {
"type": "object"
},
+ "events": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "unique"
+ ],
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "unique": {
+ "type": "string",
+ "enum": [
+ "user.id",
+ "project.id",
+ "namespace.id"
+ ]
+ }
+ }
+ }
+ },
"time_frame": {
"type": "string",
"enum": [
@@ -112,7 +135,8 @@
"redis_hll",
"prometheus",
"system",
- "license"
+ "license",
+ "internal_events"
]
},
"data_category": {
diff --git a/config/metrics/settings/20210216175606_ldap_encrypted_secrets_enabled.yml b/config/metrics/settings/20210216175606_ldap_encrypted_secrets_enabled.yml
index b5880566d5e..1840bba6a64 100644
--- a/config/metrics/settings/20210216175606_ldap_encrypted_secrets_enabled.yml
+++ b/config/metrics/settings/20210216175606_ldap_encrypted_secrets_enabled.yml
@@ -9,6 +9,7 @@ value_type: boolean
status: active
time_frame: none
data_source: system
+instrumentation_class: LdapEncryptedSecretsMetric
distribution:
- ce
- ee
diff --git a/config/metrics/settings/20210225045628_operating_system.yml b/config/metrics/settings/20210225045628_operating_system.yml
index e1249aee2a7..b6d2d761c8d 100644
--- a/config/metrics/settings/20210225045628_operating_system.yml
+++ b/config/metrics/settings/20210225045628_operating_system.yml
@@ -11,6 +11,7 @@ milestone: "13.10"
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54778
time_frame: none
data_source: system
+instrumentation_class: OperatingSystemMetric
distribution:
- ce
- ee
diff --git a/config/metrics/settings/20210321224827_gitaly_apdex.yml b/config/metrics/settings/20210321224827_gitaly_apdex.yml
index 3dcb8340628..b7c5ebec4a9 100644
--- a/config/metrics/settings/20210321224827_gitaly_apdex.yml
+++ b/config/metrics/settings/20210321224827_gitaly_apdex.yml
@@ -11,6 +11,7 @@ milestone: "13.11"
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/47040
time_frame: none
data_source: prometheus
+instrumentation_class: GitalyApdexMetric
distribution:
- ce
- ee
diff --git a/config/metrics/settings/20210812202137_smtp_encrypted_secrets_enabled.yml b/config/metrics/settings/20210812202137_smtp_encrypted_secrets_enabled.yml
index 934daf472fa..e12bdb34aee 100644
--- a/config/metrics/settings/20210812202137_smtp_encrypted_secrets_enabled.yml
+++ b/config/metrics/settings/20210812202137_smtp_encrypted_secrets_enabled.yml
@@ -11,6 +11,7 @@ introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67802
time_frame: none
data_source: system
data_category: Optional
+instrumentation_class: SmtpEncryptedSecretsMetric
distribution:
- ce
- ee
diff --git a/config/metrics/settings/20230602180038_batched_background_migrations_metric.yml b/config/metrics/settings/20230602180038_batched_background_migrations_metric.yml
new file mode 100644
index 00000000000..aa96cb8da50
--- /dev/null
+++ b/config/metrics/settings/20230602180038_batched_background_migrations_metric.yml
@@ -0,0 +1,24 @@
+---
+key_path: batched_background_migrations_metric
+name: "batched_background_migrations"
+description: "Tracks the execution time of batched background migrations"
+product_section: enablement
+product_stage: data_stores
+product_group: database
+value_type: object
+status: active
+milestone: "16.2"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/122510
+time_frame: 7d
+data_source: database
+data_category: optional
+instrumentation_class: BatchedBackgroundMigrationsMetric
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+value_json_schema: "config/metrics/objects_schemas/batched_background_migrations_metric.json"
diff --git a/config/metrics/settings/20230612132238_schema_inconsistencies_metric.yml b/config/metrics/settings/20230612132238_schema_inconsistencies_metric.yml
new file mode 100644
index 00000000000..1a154b4a2b0
--- /dev/null
+++ b/config/metrics/settings/20230612132238_schema_inconsistencies_metric.yml
@@ -0,0 +1,24 @@
+---
+key_path: schema_inconsistencies_metric
+name: "schema_inconsistencies"
+description: "List the schema inconsistencies in the database"
+product_section: enablement
+product_stage: enablement
+product_group: database
+value_type: boolean
+status: active
+milestone: "16.2"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/123383
+time_frame: none
+data_source: system
+data_category: optional
+instrumentation_class: SchemaInconsistenciesMetric
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+value_json_schema: "config/metrics/objects_schemas/schema_inconsistencies_metric.json"
diff --git a/config/object_store_settings.rb b/config/object_store_settings.rb
index 22194d8c2de..4e8e950c797 100644
--- a/config/object_store_settings.rb
+++ b/config/object_store_settings.rb
@@ -31,8 +31,6 @@ class ObjectStoreSettings
object_store['proxy_download'] = false if object_store['proxy_download'].nil?
object_store['storage_options'] ||= {}
- # Convert upload connection settings to use string keys, to make Fog happy
- object_store['connection']&.deep_stringify_keys!
object_store
end
@@ -131,8 +129,7 @@ class ObjectStoreSettings
main_config = settings['object_store']
common_config = main_config.slice('enabled', 'connection', 'proxy_download', 'storage_options')
- # Convert connection settings to use string keys, to make Fog happy
- common_config['connection']&.deep_stringify_keys!
+
# These are no longer configurable if common config is used
common_config['direct_upload'] = true
common_config['storage_options'] ||= {}
diff --git a/config/redis.yml.example b/config/redis.yml.example
index fd54f32a068..950a98c9fd6 100644
--- a/config/redis.yml.example
+++ b/config/redis.yml.example
@@ -6,6 +6,9 @@ development:
cluster_cache:
cluster:
- redis://localhost:7001
+ feature_flag:
+ cluster:
+ - redis://localhost:7001
rate_limiting:
cluster:
- redis://localhost:7001
@@ -17,6 +20,9 @@ test:
cluster_cache:
cluster:
- redis://localhost:7001
+ feature_flag:
+ cluster:
+ - redis://localhost:7001
rate_limiting:
cluster:
- redis://localhost:7001
diff --git a/config/routes.rb b/config/routes.rb
index 3a9b6c1c0bf..740911f2e3f 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -246,7 +246,6 @@ InitializerConnections.raise_if_new_database_connection do
end
get :metrics_dashboard
- get :'/prometheus/api/v1/*proxy_path', to: 'clusters#prometheus_proxy', as: :prometheus_api
get :cluster_status, format: :json
delete :clear_cache
end
diff --git a/config/routes/admin.rb b/config/routes/admin.rb
index d9cd60f8086..0123bf0627c 100644
--- a/config/routes/admin.rb
+++ b/config/routes/admin.rb
@@ -155,7 +155,8 @@ namespace :admin do
put :clear_repository_check_states
match :general, :integrations, :repository, :ci_cd, :reporting, :metrics_and_profiling, :network, :preferences, via: [:get, :patch]
get :lets_encrypt_terms_of_service
-
+ get :slack_app_manifest_download, format: :json
+ get :slack_app_manifest_share
get :service_usage_data
resource :appearances, only: [:show, :create, :update], path: 'appearance', module: 'application_settings' do
diff --git a/config/routes/directs/subscription_portal.rb b/config/routes/directs/subscription_portal.rb
index 188725d16c1..cc6a3d6b5c0 100644
--- a/config/routes/directs/subscription_portal.rb
+++ b/config/routes/directs/subscription_portal.rb
@@ -1,14 +1,14 @@
# frozen_string_literal: true
direct :subscription_portal_staging do
- ENV.fetch('STAGING_CUSTOMER_PORTAL_URL', 'https://customers.staging.gitlab.com')
+ ENV.fetch('STAGING_CUSTOMER_PORTAL_URL', Gitlab::SubscriptionPortal.default_staging_customer_portal_url)
end
direct :subscription_portal do
default_subscriptions_url = if ::Gitlab.dev_or_test_env?
subscription_portal_staging_url
else
- 'https://customers.gitlab.com'
+ Gitlab::SubscriptionPortal.default_production_customer_portal_url
end
ENV.fetch('CUSTOMER_PORTAL_URL', default_subscriptions_url)
diff --git a/config/routes/explore.rb b/config/routes/explore.rb
index 6ddf4d23138..6777571bb68 100644
--- a/config/routes/explore.rb
+++ b/config/routes/explore.rb
@@ -6,7 +6,7 @@ namespace :explore do
get :trending
get :starred
get :topics
- get 'topics/:topic_name', action: :topic, as: :topic, constraints: { topic_name: /.+/ }
+ get 'topics/:topic_name', action: :topic, as: :topic, constraints: { format: /(html|atom)/, topic_name: /.+?/ }
end
end
diff --git a/config/routes/organizations.rb b/config/routes/organizations.rb
index c35059cf411..4a8c9c25363 100644
--- a/config/routes/organizations.rb
+++ b/config/routes/organizations.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
-resources :organizations, only: [], param: :organization_path, controller: 'organizations/organizations' do
+resources :organizations, only: [:show], param: :organization_path, controller: 'organizations/organizations' do
member do
- get :directory
+ get :groups_and_projects
end
end
diff --git a/config/routes/project.rb b/config/routes/project.rb
index bf73f461629..73e4ed2fb8b 100644
--- a/config/routes/project.rb
+++ b/config/routes/project.rb
@@ -29,10 +29,6 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
# Use this scope for all new project routes.
scope '-' do
get 'archive/*id', format: true, constraints: { format: Gitlab::PathRegex.archive_formats_regex, id: /.+?/ }, to: 'repositories#archive', as: 'archive'
- get 'metrics(/:dashboard_path)', constraints: { dashboard_path: /.+\.yml/ },
- to: 'metrics_dashboard#show', as: :metrics_dashboard, format: false
- get 'metrics(/:dashboard_path)/panel/new', constraints: { dashboard_path: /.+\.yml/ },
- to: 'metrics_dashboard#show', as: :new_metrics_dashboard, format: false
namespace :metrics, module: :metrics do
namespace :dashboards do
@@ -250,11 +246,6 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
resource :import, only: [:new, :create, :show]
resource :avatar, only: [:show, :destroy]
- scope :grafana, as: :grafana_api do
- get 'proxy/:datasource_id/*proxy_path', to: 'grafana_api#proxy'
- get :metrics_dashboard, to: 'grafana_api#metrics_dashboard'
- end
-
resource :mattermost, only: [:new, :create]
resource :variables, only: [:show, :update]
resources :triggers, only: [:index, :create, :edit, :update, :destroy]
@@ -330,9 +321,6 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
post :stop
post :cancel_auto_stop
get :terminal
- get :metrics
- get :additional_metrics
- get :metrics_dashboard
# This route is also defined in gitlab-workhorse. Make sure to update accordingly.
get '/terminal.ws/authorize', to: 'environments#terminal_websocket_authorize', format: false
@@ -343,7 +331,6 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
end
collection do
- get :metrics, action: :metrics_redirect
get :folder, path: 'folders/*id', constraints: { format: /(html|json)/ }
get :search
end
@@ -412,6 +399,8 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
end
end
+ resources :tracing, only: [:index], controller: :tracing
+
namespace :design_management do
namespace :designs, path: 'designs/:design_id(/:sha)', constraints: -> (params) { params[:sha].nil? || Gitlab::Git.commit_id?(params[:sha]) } do
resource :raw_image, only: :show
@@ -493,6 +482,11 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
namespace :ml do
resources :experiments, only: [:index, :show, :destroy], controller: 'experiments', param: :iid
resources :candidates, only: [:show, :destroy], controller: 'candidates', param: :iid
+ resources :models, only: [:index], controller: 'models'
+ end
+
+ namespace :service_desk do
+ resource :custom_email, only: [:show, :create, :update, :destroy], controller: 'custom_email'
end
end
# End of the /-/ scope.
diff --git a/config/sidekiq_queues.yml b/config/sidekiq_queues.yml
index dc0b77ef99a..7f05b8af7bf 100644
--- a/config/sidekiq_queues.yml
+++ b/config/sidekiq_queues.yml
@@ -101,10 +101,14 @@
- 1
- - bulk_imports_export_request
- 1
+- - bulk_imports_finish_batched_pipeline
+ - 1
- - bulk_imports_finish_batched_relation_export
- 1
- - bulk_imports_pipeline
- 1
+- - bulk_imports_pipeline_batch
+ - 1
- - bulk_imports_relation_batch_export
- 1
- - bulk_imports_relation_export
@@ -137,6 +141,10 @@
- 1
- - compliance_management_merge_requests_compliance_violations
- 1
+- - compliance_management_standards_gitlab_prevent_approval_by_author
+ - 1
+- - compliance_management_standards_gitlab_prevent_approval_by_author_group
+ - 1
- - compliance_management_update_default_framework
- 1
- - container_repository
@@ -299,6 +307,8 @@
- 1
- - integrations_execute
- 1
+- - integrations_group_mention
+ - 1
- - integrations_irker
- 1
- - integrations_slack_event
@@ -343,6 +353,8 @@
- 1
- - merge_requests_capture_suggested_reviewers_accepted
- 1
+- - merge_requests_cleanup_ref
+ - 1
- - merge_requests_close_issue
- 1
- - merge_requests_create_approval_event
@@ -373,10 +385,6 @@
- 1
- - merge_requests_update_head_pipeline
- 1
-- - metrics_dashboard_prune_old_annotations
- - 1
-- - metrics_dashboard_sync_dashboards
- - 1
- - migrate_external_diffs
- 1
- - ml_experiment_tracking_associate_ml_candidate_to_package
@@ -403,6 +411,8 @@
- 1
- - object_storage
- 1
+- - onboarding_create_iterable_trigger
+ - 1
- - onboarding_issue_created
- 1
- - onboarding_pipeline_created
@@ -511,6 +521,8 @@
- 1
- - rebase
- 2
+- - redis_migration
+ - 1
- - refresh_license_compliance_checks
- 2
- - releases_create_evidence
@@ -535,6 +547,8 @@
- 1
- - sbom_reports
- 1
+- - search_elastic_group_association_deletion
+ - 1
- - search_namespace_index_integrity
- 1
- - search_project_index_integrity
@@ -577,6 +591,8 @@
- 1
- - sync_seat_link_request
- 1
+- - system_access_group_saml_microsoft_group_sync
+ - 1
- - system_hook_push
- 1
- - tasks_to_be_done_create
diff --git a/config/webpack.config.js b/config/webpack.config.js
index 39052d29287..39dc08d15c6 100644
--- a/config/webpack.config.js
+++ b/config/webpack.config.js
@@ -311,6 +311,7 @@ let shouldExcludeFromCompliling = (modulePath) =>
if (EXPLICIT_VUE_VERSION) {
Object.assign(alias, {
'@gitlab/ui/scss_to_js': path.join(ROOT_PATH, 'node_modules/@gitlab/ui/scss_to_js'),
+ '@gitlab/ui/dist/tokens/js': path.join(ROOT_PATH, 'node_modules/@gitlab/ui/dist/tokens/js'),
'@gitlab/ui/dist': '@gitlab/ui/src',
'@gitlab/ui': '@gitlab/ui/src',
});
@@ -371,6 +372,20 @@ module.exports = {
loader: 'babel-loader',
},
{
+ test: /_worker\.js$/,
+ resourceQuery: /worker/,
+ use: [
+ {
+ loader: 'worker-loader',
+ options: {
+ name: '[name].[contenthash:8].worker.js',
+ inline: IS_DEV_SERVER,
+ },
+ },
+ 'babel-loader',
+ ],
+ },
+ {
test: /mermaid\/.*\.js?$/,
include: /node_modules/,
loader: 'babel-loader',
@@ -439,20 +454,6 @@ module.exports = {
options: { limit: 2048 },
},
{
- test: /_worker\.js$/,
- resourceQuery: /worker/,
- use: [
- {
- loader: 'worker-loader',
- options: {
- name: '[name].[contenthash:8].worker.js',
- inline: IS_DEV_SERVER,
- },
- },
- 'babel-loader',
- ],
- },
- {
test: /\.(worker(\.min)?\.js|pdf)$/,
exclude: /node_modules/,
loader: 'file-loader',
diff --git a/danger/experiments/Dangerfile b/danger/experiments/Dangerfile
new file mode 100644
index 00000000000..3a206bc876e
--- /dev/null
+++ b/danger/experiments/Dangerfile
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+unless experiments.class_files_removed?
+ msg = "This merge request removes experiment: `#{experiments.removed_experiments.join(',')}`" \
+ ", please also remove the class file."
+ fail msg # rubocop:disable Style/SignalException
+end
diff --git a/danger/plugins/experiments.rb b/danger/plugins/experiments.rb
new file mode 100644
index 00000000000..b7fd6573c30
--- /dev/null
+++ b/danger/plugins/experiments.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+require_relative '../../tooling/danger/experiments'
+
+module Danger
+ class Experiments < ::Danger::Plugin
+ # Put the helper code somewhere it can be tested
+ include Tooling::Danger::Experiments
+ end
+end
diff --git a/danger/roulette/Dangerfile b/danger/roulette/Dangerfile
index a987a98acee..39b79745ead 100644
--- a/danger/roulette/Dangerfile
+++ b/danger/roulette/Dangerfile
@@ -58,7 +58,7 @@ NOT_AVAILABLE_TEMPLATES = {
analytics_instrumentation: group_not_available_template('#g_analyze_analytics_instrumentation', '@gitlab-org/analytics-section/analytics-instrumentation/engineers'),
import_integrate_be: group_not_available_template('#g_manage_import_and_integrate', '@gitlab-org/manage/import-and-integrate'),
import_integrate_fe: group_not_available_template('#g_manage_import_and_integrate', '@gitlab-org/manage/import-and-integrate'),
- remote_development: group_not_available_template('#f_remote_development', '@gitlab-org/remote-development')
+ remote_development_be: group_not_available_template('#f_remote_development', '@gitlab-org/maintainers/remote-development/backend')
}.freeze
def note_for_spin_role(spin, role, category)
@@ -91,19 +91,8 @@ changes.delete(:docs)
changes.delete(:changelog)
# No special review for feature flags needed.
changes.delete(:feature_flag)
-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 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') # rubocop:disable Rails/NegateInclude
-
-# Ensure to spin for Analytics Instrumentation reviewer when ~"analytics instrumentation::review pending" is applied
-categories << :analytics_instrumentation if helper.mr_labels.include?("analytics instrumentation::review pending")
-
-# Skip Analytics Instrumentation reviews for growth experiment MRs
-categories.delete(:analytics_instrumentation) if helper.mr_labels.include?("growth experiment")
+categories = roulette.prepare_categories(changes.keys - [:unknown])
# Skip specialty reviews for stable branch MRs since they have already been merged to the default branch
categories.subtract([:database, :ux, :analytics_instrumentation]) if stable_branch.valid_stable_branch?
@@ -111,6 +100,10 @@ categories.subtract([:database, :ux, :analytics_instrumentation]) if stable_bran
if changes.any?
random_roulette_spins = roulette.spin(nil, categories, timezone_experiment: false)
+ if categories.include?(:ux) # rubocop:disable Style/IfUnlessModifier
+ roulette.assign_pedroms_for_ux_wider_community_contribution(random_roulette_spins)
+ end
+
rows = random_roulette_spins.map do |spin|
markdown_row_for_spin(spin.category, spin)
end
diff --git a/data/deprecations/ 16-2-cirunner_fields.yml b/data/deprecations/ 16-2-cirunner_fields.yml
new file mode 100644
index 00000000000..1d43ed1b7c9
--- /dev/null
+++ b/data/deprecations/ 16-2-cirunner_fields.yml
@@ -0,0 +1,13 @@
+- title: "Deprecate `CiRunner` GraphQL fields duplicated in `CiRunnerManager`" # (required) The name of the feature to be deprecated
+ announcement_milestone: "16.2" # (required) The milestone when this feature was first announced as deprecated.
+ announcement_date: "2023-07-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
+ removal_milestone: "17.0" # (required) The milestone when this feature is planned to be removed
+ removal_date: "2024-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
+ breaking_change: true # (required) If this deprecation is a breaking change, set this value to true
+ reporter: DarrenEastman # (required) GitLab username of the person reporting the deprecation
+ stage: Verify # (required) String value of the stage that the feature was created in. e.g., Growth
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/41518 # (required) Link to the deprecation issue in GitLab
+ body: | # (required) Do not modify this line, instead modify the lines below.
+ These fields (`architectureName`, `ipAddress`, `platformName`, `revision`, `version`) are now deprecated from the [GraphQL `CiRunner`](https://docs.gitlab.com/ee/api/graphql/reference/#cirunner) type as they are duplicated with the introduction of runner managers grouped within a runner configuration.
+ end_of_support_milestone: "17.0" # (optional) Use "XX.YY" format. The milestone when support for this feature will end.
+ end_of_support_date: "2024-05-22" # (optional) The date of the milestone release when support for this feature will end.
diff --git a/data/deprecations/14-10-old-search-migration-removal.yml b/data/deprecations/14-10-old-search-migration-removal.yml
index 4700063e68f..260880dda57 100644
--- a/data/deprecations/14-10-old-search-migration-removal.yml
+++ b/data/deprecations/14-10-old-search-migration-removal.yml
@@ -3,7 +3,10 @@
removal_milestone: "15.0"
breaking_change: true
body: |
- 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.
+ 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.
stage: enablement
tiers: premium, ultimate
issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/359133
diff --git a/data/deprecations/14-8-compliance-required-pipeline-configuration-premium.yml b/data/deprecations/14-8-compliance-required-pipeline-configuration-premium.yml
index cd94adca75f..67d2c94e776 100644
--- a/data/deprecations/14-8-compliance-required-pipeline-configuration-premium.yml
+++ b/data/deprecations/14-8-compliance-required-pipeline-configuration-premium.yml
@@ -4,7 +4,7 @@
breaking_change: true
reporter: sam.white
body: | # Do not modify this line, instead modify the lines below.
- The [required pipeline configuration](https://docs.gitlab.com/ee/user/admin_area/settings/continuous_integration.html#required-pipeline-configuration) feature is deprecated in GitLab 14.8 for Premium customers and is scheduled for removal in GitLab 15.0. This feature is not deprecated for GitLab Ultimate customers.
+ The [required pipeline configuration](https://docs.gitlab.com/ee/administration/settings/continuous_integration.html#required-pipeline-configuration) feature is deprecated in GitLab 14.8 for Premium customers and is scheduled for removal in GitLab 15.0. This feature is not deprecated for GitLab Ultimate customers.
This change to move the feature to GitLab's Ultimate tier is intended to help our features better align with our [pricing philosophy](https://about.gitlab.com/company/pricing/#three-tiers) as we see demand for this feature originating primarily from executives.
diff --git a/data/deprecations/14-8-enforce-pat-expiration.yml b/data/deprecations/14-8-enforce-pat-expiration.yml
index 37cf4d827d1..a420f19387d 100644
--- a/data/deprecations/14-8-enforce-pat-expiration.yml
+++ b/data/deprecations/14-8-enforce-pat-expiration.yml
@@ -9,4 +9,4 @@
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
+ documentation_url: "https://docs.gitlab.com/ee/administration/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 6a67eee4b5f..c2662aaf3d0 100644
--- a/data/deprecations/14-8-enforce-ssh-expiration.yml
+++ b/data/deprecations/14-8-enforce-ssh-expiration.yml
@@ -9,4 +9,4 @@
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
+ documentation_url: "https://docs.gitlab.com/ee/administration/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-sast-analyzer-removals.yml b/data/deprecations/14-8-sast-analyzer-removals.yml
index 3ebfd23beb5..427833d569e 100644
--- a/data/deprecations/14-8-sast-analyzer-removals.yml
+++ b/data/deprecations/14-8-sast-analyzer-removals.yml
@@ -17,7 +17,6 @@
NOTE:
This change was originally planned for GitLab 15.0 and was postponed to GitLab 15.4.
- See [the removal notice](./removals.md#sast-analyzer-consolidation-and-cicd-template-changes) for further details.
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).
Effective immediately, they will receive only security updates; other routine improvements or updates are not guaranteed.
@@ -30,8 +29,8 @@
If you've already dismissed a vulnerability finding from one of the deprecated analyzers, the replacement attempts to respect your previous dismissal. The system behavior depends on:
- - whether you’ve excluded the Semgrep-based analyzer from running in the past.
- - which analyzer first discovered the vulnerabilities shown in the project’s Vulnerability Report.
+ - whether you've excluded the Semgrep-based analyzer from running in the past.
+ - which analyzer first discovered the vulnerabilities shown in the project's Vulnerability Report.
See [Vulnerability translation documentation](https://docs.gitlab.com/ee/user/application_security/sast/analyzers.html#vulnerability-translation) for further details.
diff --git a/data/deprecations/14-9-deprecate-testcoveragesetting.yml b/data/deprecations/14-9-deprecate-testcoveragesetting.yml
index 1f50aab1c27..52f58fc707e 100644
--- a/data/deprecations/14-9-deprecate-testcoveragesetting.yml
+++ b/data/deprecations/14-9-deprecate-testcoveragesetting.yml
@@ -8,6 +8,6 @@
[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
+ 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/15-0-oauth-noexpiry.yml b/data/deprecations/15-0-oauth-noexpiry.yml
index e27ac4d8725..1eeb912a588 100644
--- a/data/deprecations/15-0-oauth-noexpiry.yml
+++ b/data/deprecations/15-0-oauth-noexpiry.yml
@@ -11,7 +11,7 @@
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.
+ 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.
reporter: hsutor
diff --git a/data/deprecations/15-3-pipeline_activity_limit.yml b/data/deprecations/15-3-pipeline_activity_limit.yml
index ea7d0476910..c0e37292d06 100644
--- a/data/deprecations/15-3-pipeline_activity_limit.yml
+++ b/data/deprecations/15-3-pipeline_activity_limit.yml
@@ -25,7 +25,7 @@
stage: Verify # (required) String value of the stage that the feature was created in. e.g., Growth
issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/368195 # (required) Link to the deprecation issue in GitLab
body: | # (required) Do not modify this line, instead modify the lines below.
- The [**Maximum number of active pipelines per project** limit](https://docs.gitlab.com/ee/user/admin_area/settings/continuous_integration.html#set-cicd-limits) was never enabled by default and will be removed in GitLab 16.0. This limit can also be configured in the Rails console under [`ci_active_pipelines`](https://docs.gitlab.com/ee/administration/instance_limits.html#number-of-pipelines-running-concurrently). Instead, use the other recommended rate limits that offer similar protection:
+ The [**Maximum number of active pipelines per project** limit](https://docs.gitlab.com/ee/administration/settings/continuous_integration.html#set-cicd-limits) was never enabled by default and will be removed in GitLab 16.0. This limit can also be configured in the Rails console under [`ci_active_pipelines`](https://docs.gitlab.com/ee/administration/instance_limits.html#number-of-pipelines-running-concurrently). Instead, use the other recommended rate limits that offer similar protection:
- - [**Pipelines rate limits**](https://docs.gitlab.com/ee/user/admin_area/settings/rate_limit_on_pipelines_creation.html).
- - [**Total number of jobs in currently active pipelines**](https://docs.gitlab.com/ee/user/admin_area/settings/continuous_integration.html#set-cicd-limits).
+ - [**Pipelines rate limits**](https://docs.gitlab.com/ee/administration/settings/rate_limit_on_pipelines_creation.html).
+ - [**Total number of jobs in currently active pipelines**](https://docs.gitlab.com/ee/administration/settings/continuous_integration.html#set-cicd-limits).
diff --git a/data/deprecations/15-9-accessibility-testing-deprecation.yml b/data/deprecations/15-9-accessibility-testing-deprecation.yml
deleted file mode 100644
index 74fb61ed2fc..00000000000
--- a/data/deprecations/15-9-accessibility-testing-deprecation.yml
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# REQUIRED FIELDS
-#
-- title: "Accessibility Testing is deprecated" # (required) Clearly explain the change, or planned change. For example, "The `confidential` field for a `Note` is deprecated" or "CI/CD job names will be limited to 250 characters."
- announcement_milestone: "15.9" # (required) The milestone when this feature was first announced as deprecated.
- removal_milestone: "17.0" # (required) The milestone when this feature is planned to be removed
- breaking_change: true # (required) Change to false if this is not a breaking change.
- reporter: jocelynjane # (required) GitLab username of the person reporting the change
- stage: Verify # (required) String value of the stage that the feature was created in. e.g., Growth
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/390424 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- Due to low customer usage, Accessibility Testing is deprecated and will be removed. There is no planned replacement and users should stop using Accessibility Testing before GitLab 17.0.
-#
-# OPTIONAL END OF SUPPORT FIELDS
-#
-# If an End of Support period applies, the announcement should be shared with GitLab Support
-# in the `#spt_managers` channel in Slack, and mention `@gitlab-com/support` in this MR.
-#
- end_of_support_milestone: # (optional) Use "XX.YY" format. The milestone when support for this feature will end.
- #
- # OTHER OPTIONAL FIELDS
- #
- 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/ci/testing/accessibility_testing.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/deprecations/15-9-browser-performance-testing-deprecation.yml b/data/deprecations/15-9-browser-performance-testing-deprecation.yml
deleted file mode 100644
index a5d7429b56b..00000000000
--- a/data/deprecations/15-9-browser-performance-testing-deprecation.yml
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# REQUIRED FIELDS
-#
-- title: "Browser Performance Testing is deprecated" # (required) Clearly explain the change, or planned change. For example, "The `confidential` field for a `Note` is deprecated" or "CI/CD job names will be limited to 250 characters."
- announcement_milestone: "15.9" # (required) The milestone when this feature was first announced as deprecated.
- removal_milestone: "17.0" # (required) The milestone when this feature is planned to be removed
- breaking_change: true # (required) Change to false if this is not a breaking change.
- reporter: jocelynjane # (required) GitLab username of the person reporting the change
- stage: Verify # (required) String value of the stage that the feature was created in. e.g., Growth
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/388719 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- Due to limited customer usage, Browser Performance Testing is deprecated and will be removed. There is no planned replacement and users should stop using Browser Performance Testing before GitLab 17.0.
-#
-# OPTIONAL END OF SUPPORT FIELDS
-#
-# If an End of Support period applies, the announcement should be shared with GitLab Support
-# in the `#spt_managers` channel in Slack, and mention `@gitlab-com/support` in this MR.
-#
- end_of_support_milestone: # (optional) Use "XX.YY" format. The milestone when support for this feature will end.
- #
- # OTHER OPTIONAL FIELDS
- #
- tiers: Premium # (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/ci/testing/browser_performance_testing.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/deprecations/15-9-license-compliance-ci-template.yml b/data/deprecations/15-9-license-compliance-ci-template.yml
index edce1062883..9b2ab1cbe90 100644
--- a/data/deprecations/15-9-license-compliance-ci-template.yml
+++ b/data/deprecations/15-9-license-compliance-ci-template.yml
@@ -1,16 +1,16 @@
- title: "License Compliance CI Template"
announcement_milestone: "15.9"
- removal_milestone: "16.1"
+ removal_milestone: "16.3"
breaking_change: true
reporter: sam.white
stage: secure
issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/387561
body: |
- **Update:** We previously announced we would remove the existing License Compliance CI template in GitLab 16.0. However, due to performance issues with the [license scanning of CycloneDX files](https://docs.gitlab.com/ee/user/compliance/license_scanning_of_cyclonedx_files/) we will do this change in 16.1 instead.
+ **Update:** We previously announced we would remove the existing License Compliance CI template in GitLab 16.0. However, due to performance issues with the [license scanning of CycloneDX files](https://docs.gitlab.com/ee/user/compliance/license_scanning_of_cyclonedx_files/) we will do this change in 16.3 instead.
The GitLab [License Compliance](https://docs.gitlab.com/ee/user/compliance/license_compliance/) CI template is now deprecated and is scheduled for removal in the GitLab 16.1 release. Users who wish to continue using GitLab for License Compliance should remove the License Compliance template from their CI pipeline and add the [Dependency Scanning template](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#configuration). The Dependency Scanning template is now capable of gathering the required license information so it is no longer necessary to run a separate License Compliance job. The License Compliance CI template should not be removed prior to verifying that the `license_scanning_sbom_scanner` and `package_metadata_synchronization` flags are enabled for the instance and that the instance has been upgraded to a version that supports [the new method of license scanning](https://docs.gitlab.com/ee/user/compliance/license_scanning_of_cyclonedx_files/).
- | CI Pipeline Includes | GitLab <= 15.8 | 15.9 <= GitLab < 16.1 | GitLab >= 16.1 |
+ | CI Pipeline Includes | GitLab <= 15.8 | 15.9 <= GitLab < 16.3 | GitLab >= 16.3 |
| ------------- | ------------- | ------------- | ------------- |
| Both DS and LS templates | License data from LS job is used | License data from LS job is used | License data from DS job is used |
| DS template is included but LS template is not | No license data | License data from DS job is used | License data from DS job is used |
diff --git a/data/deprecations/15-9-load-performance-testing-deprecation.yml b/data/deprecations/15-9-load-performance-testing-deprecation.yml
deleted file mode 100644
index 77b56c69f92..00000000000
--- a/data/deprecations/15-9-load-performance-testing-deprecation.yml
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# REQUIRED FIELDS
-#
-- title: "Load Performance Testing is deprecated" # (required) Clearly explain the change, or planned change. For example, "The `confidential` field for a `Note` is deprecated" or "CI/CD job names will be limited to 250 characters."
- announcement_milestone: "15.9" # (required) The milestone when this feature was first announced as deprecated.
- removal_milestone: "17.0" # (required) The milestone when this feature is planned to be removed
- breaking_change: true # (required) Change to false if this is not a breaking change.
- reporter: jocelynjane # (required) GitLab username of the person reporting the change
- stage: Verify # (required) String value of the stage that the feature was created in. e.g., Growth
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/388723 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- Due to low customer usage, Load Performance Testing is deprecated and will be removed. There is no planned replacement and users should stop using Load Performance Testing before GitLab 17.0.
-#
-# OPTIONAL END OF SUPPORT FIELDS
-#
-# If an End of Support period applies, the announcement should be shared with GitLab Support
-# in the `#spt_managers` channel in Slack, and mention `@gitlab-com/support` in this MR.
-#
- end_of_support_milestone: # (optional) Use "XX.YY" format. The milestone when support for this feature will end.
- #
- # OTHER OPTIONAL FIELDS
- #
- tiers: Premium # (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/ci/testing/load_performance_testing.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/deprecations/15-9-required-pipeline-configuration.yml b/data/deprecations/15-9-required-pipeline-configuration.yml
index 03ebaab555d..f43c7dd068a 100644
--- a/data/deprecations/15-9-required-pipeline-configuration.yml
+++ b/data/deprecations/15-9-required-pipeline-configuration.yml
@@ -24,6 +24,6 @@
# OTHER OPTIONAL FIELDS
#
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/admin_area/settings/continuous_integration.html#required-pipeline-configuration # (optional) This is a link to the current documentation page
+ documentation_url: https://docs.gitlab.com/ee/administration/settings/continuous_integration.html#required-pipeline-configuration # (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/16-0-deprecate-sidekiq-delivery-method-for-mailroom.yml b/data/deprecations/16-0-deprecate-sidekiq-delivery-method-for-mailroom.yml
index a7715f89abb..d0795687b50 100644
--- a/data/deprecations/16-0-deprecate-sidekiq-delivery-method-for-mailroom.yml
+++ b/data/deprecations/16-0-deprecate-sidekiq-delivery-method-for-mailroom.yml
@@ -34,7 +34,10 @@
If you run GitLab on more than one machine, you need to provide the secret key file for each machine.
- We highly encourage GitLab administrators to start using the `webhook` delivery method for
+ We encourage GitLab administrators to switch to the webhook delivery method for
`incoming_email_delivery_method` and `service_desk_email_delivery_method` instead of `sidekiq`.
+
+ [Issue 393157](https://gitlab.com/gitlab-org/gitlab/-/issues/393157) tracks improving email ingestion in general.
+ We hope this will simplify infrastructure setup and add several improvements to how you manage GitLab in the near future.
tiers: [Free, Silver, Gold, Core, Premium, Ultimate]
documentation_url: https://docs.gitlab.com/ee/user/project/service_desk.html#use-a-custom-email-address
diff --git a/data/deprecations/16-1-deprecate-message-from-vulnerabilitycreate.yml b/data/deprecations/16-1-deprecate-message-from-vulnerabilitycreate.yml
new file mode 100644
index 00000000000..505a6b1bdd9
--- /dev/null
+++ b/data/deprecations/16-1-deprecate-message-from-vulnerabilitycreate.yml
@@ -0,0 +1,10 @@
+- title: "Deprecate `message` field from Vulnerability Management features"
+ announcement_milestone: "16.1"
+ removal_milestone: "17.0"
+ breaking_change: true
+ reporter: abellucci
+ stage: Govern
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/411573
+ body: | # (required) Do not modify this line, instead modify the lines below.
+ This MR deprecates the `message` field on the `VulnerabilityCreate` GraphQL mutation, and in the `AdditionalInfo` column of the vulnerability export.
+ The message field was removed from security reports schema in GitLab 16.0 and is no longer being used elsewhere.
diff --git a/data/deprecations/16-1-non-decomposed-mode-deprecation.yml b/data/deprecations/16-1-non-decomposed-mode-deprecation.yml
index 963fc0d8230..83f99fc2dbd 100644
--- a/data/deprecations/16-1-non-decomposed-mode-deprecation.yml
+++ b/data/deprecations/16-1-non-decomposed-mode-deprecation.yml
@@ -6,4 +6,12 @@
stage: data_stores
issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/411239
body: |
- The option to run self-managed installations of GitLab on a single database is now deprecated. From GitLab 17.0, we will require a [separate database for CI features](https://gitlab.com/groups/gitlab-org/-/epics/7509). With this change, self-managed versions of GitLab will behave similarly to GitLab.com. This change applies to installation methods with Omnibus GitLab, GitLab Helm chart, GitLab Operator, GitLab Docker images, and installation from source. Before upgrading to GitLab 17.0, please ensure [migration](https://docs.gitlab.com/ee/administration/postgresql/multiple_databases.html) to two databases.
+ From GitLab 17.0, we will require a [separate database for CI features](https://gitlab.com/groups/gitlab-org/-/epics/7509).
+ We recommend running both databases on the same Postgres instance(s) due to ease of management for most deployments.
+
+ We are providing this as an informational advance notice but we do not recommend taking action yet.
+ We will have another update communicated (as well as the deprecation note) when we recommend admins to start the migration process.
+
+ This change provides additional scalability for the largest of GitLab instances, like GitLab.com.
+ This change applies to all installation methods: Omnibus GitLab, GitLab Helm chart, GitLab Operator, GitLab Docker images, and installation from source.
+ Before upgrading to GitLab 17.0, please ensure you have [migrated](https://docs.gitlab.com/ee/administration/postgresql/multiple_databases.html) to two databases.
diff --git a/data/deprecations/16-2-agentk-builtin-gitops.yml b/data/deprecations/16-2-agentk-builtin-gitops.yml
new file mode 100644
index 00000000000..297c069bc47
--- /dev/null
+++ b/data/deprecations/16-2-agentk-builtin-gitops.yml
@@ -0,0 +1,13 @@
+- title: "The pull-based deployment features of the GitLab agent for Kubernetes is deprecated"
+ removal_milestone: "17.0"
+ announcement_milestone: "16.2"
+ breaking_change: true # (required) Change to false if this is not a breaking change.
+ reporter: nagyv-gitlab # (required) GitLab username of the person reporting the change
+ stage: deploy
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/406545
+ body: | # (required) Do not modify this line, instead modify the lines below.
+ We are deprecating the built-in pull-based deployment features of the GitLab agent for Kubernetes in favor of Flux and related integrations.
+
+ The GitLab agent for Kubernetes **is not deprecated**. This change affects only the pull-based functionality of the agent. All other functionality will remain intact, and GitLab will continue to support the agent for Kubernetes.
+
+ If you use the agent for pull-based deployments, you should [migrate to Flux](https://docs.gitlab.com/ee/user/clusters/agent/gitops/agent.html#migrate-to-flux). Because Flux is a mature CNCF project for GitOps, we decided to [integrate Flux with GitLab in February 2023](https://about.gitlab.com/blog/2023/02/08/why-did-we-choose-to-integrate-fluxcd-with-gitlab/).
diff --git a/data/deprecations/16-2-deprecation-omniauth-facebook.yml b/data/deprecations/16-2-deprecation-omniauth-facebook.yml
new file mode 100644
index 00000000000..f0ef0429a9c
--- /dev/null
+++ b/data/deprecations/16-2-deprecation-omniauth-facebook.yml
@@ -0,0 +1,11 @@
+- title: "OmniAuth Facebook is deprecated" # (required) Clearly explain the change, or planned change. For example, "The `confidential` field for a `Note` is deprecated" or "CI/CD job names will be limited to 250 characters."
+ removal_milestone: "17.0" # (required) The milestone when this feature is planned to be removed
+ announcement_milestone: "16.2" # (required) The milestone when this feature was first announced as deprecated.
+ announcement_date: "2023-07-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
+ removal_date: "2024-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
+ breaking_change: true # (required) Change to false if this is not a breaking change.
+ reporter: hsutor # (required) GitLab username of the person reporting the change
+ stage: Manage # (required) String value of the stage that the feature was created in. e.g., Growth
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/416000 # (required) Link to the deprecation issue in GitLab
+ body: | # (required) Do not modify this line, instead modify the lines below.
+ OmniAuth Facebook support will be removed in GitLab 17.0. The last gem release was in 2021 and it is currently unmaintained. The current usage is less than 0.1%. If you use OmniAuth Facebook, switch to a [supported provider](https://docs.gitlab.com/ee/integration/omniauth.html#supported-providers) in advance of support removal.
diff --git a/data/deprecations/16-2-registry-size-estimated-graphql-field.yml b/data/deprecations/16-2-registry-size-estimated-graphql-field.yml
new file mode 100644
index 00000000000..a0251040203
--- /dev/null
+++ b/data/deprecations/16-2-registry-size-estimated-graphql-field.yml
@@ -0,0 +1,11 @@
+- title: "GraphQL field `registrySizeEstimated` has been deprecated" # (required) Actionable title. e.g., The `confidential` field for a `Note` is deprecated. Use `internal` instead.
+ announcement_milestone: "16.2" # (required) The milestone when this feature was first announced as deprecated.
+ removal_milestone: "17.0" # (required) The milestone when this feature is planned to be removed
+ breaking_change: true # (required) If this deprecation is a breaking change, set this value to true
+ reporter: kpalchyk # (required) GitLab username of the person reporting the deprecation
+ stage: Package # (required) String value of the stage that the feature was created in. e.g., Growth
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/416509 # (required) Link to the deprecation issue in GitLab
+ body: | # (required) Do not modify this line, instead modify the lines below.
+ For clarity, the GraphQL field `registrySizeEstimated` was renamed to `containerRegistrySizeIsEstimated`, to match its counterpart.
+ `registrySizeEstimated` was deprecated in GitLab 16.2 and will be removed in GitLab 17.0.
+ Use `containerRegistrySizeIsEstimated` introduced in GitLab 16.2 instead.
diff --git a/data/deprecations/16_2-custom_sign_in_fields.yml b/data/deprecations/16_2-custom_sign_in_fields.yml
new file mode 100644
index 00000000000..80184a3c096
--- /dev/null
+++ b/data/deprecations/16_2-custom_sign_in_fields.yml
@@ -0,0 +1,11 @@
+- title: 'Deprecated parameters related to custom text in the sign-in page' # (required) The name of the feature to be deprecated
+ announcement_milestone: '16.2' # (required) The milestone when this feature was first announced as deprecated.
+ announcement_date: '2023-07-22' # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
+ removal_milestone: '17.0' # (required) The milestone when this feature is planned to be removed
+ removal_date: '2024-04-22' # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
+ breaking_change: true # (required) If this deprecation is a breaking change, set this value to true
+ reporter: eduardosanz # (required) GitLab username of the person reporting the deprecation
+ stage: Manage # (required) String value of the stage that the feature was created in. e.g., Growth
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124461 # (required) Link to the deprecation issue in GitLab
+ body: | # (required) Do not modify this line, instead modify the lines below.
+ The parameters, `sign_in_text` and `help_text`, are deprecated in the [Settings API](https://docs.gitlab.com/ee/api/settings.html). To add a custom text to the sign-in and sign-up pages, use the `description` field in the [Appearance API](https://docs.gitlab.com/ee/api/appearance.html).
diff --git a/data/deprecations/templates/_deprecation_template.md.erb b/data/deprecations/templates/_deprecation_template.md.erb
index 1817942eac5..5261806f49a 100644
--- a/data/deprecations/templates/_deprecation_template.md.erb
+++ b/data/deprecations/templates/_deprecation_template.md.erb
@@ -5,9 +5,9 @@ info: "See the Technical Writers assigned to Development Guidelines: https://abo
toc: false
---
-# Deprecations by version
+# Deprecations and removals by version
-These GitLab features are deprecated and no longer recommended for use.
+The following GitLab features are deprecated and no longer recommended for use.
Each deprecated feature will be removed in a future release.
Some features cause breaking changes when they are removed.
@@ -24,8 +24,10 @@ and [GraphQL](https://docs.gitlab.com/ee/api/graphql/removed_items.html) depreca
<!--
DO NOT EDIT THIS PAGE DIRECTLY
-This page is automatically generated from the YAML files in `/data/deprecations` by the rake task
-located at `lib/tasks/gitlab/docs/compile_deprecations.rake`.
+This page is automatically generated from the template located at
+`data/deprecations/templates/_deprecation_template.md.erb`, using
+the YAML files in `/data/deprecations` by the rake task
+located at `lib/tasks/gitlab/docs/compile_deprecations.rake`,
For deprecation authors (usually Product Managers and Engineering Managers):
@@ -59,7 +61,7 @@ For deprecation reviewers (Technical Writers only):
- End of Support: GitLab <span class="milestone"><%= deprecation["end_of_support_milestone"]%></span>
<% end -%>
<% if deprecation["breaking_change"] -%>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
<%- end -%>
<% if deprecation["issue_url"] -%>
- To discuss this change or learn more, see the [deprecation issue](<%= deprecation["issue_url"]%>).
diff --git a/data/removals/14_0/14_0-ds-deprecations.yml b/data/removals/14_0/14_0-ds-deprecations.yml
deleted file mode 100644
index ba47a9d1ed4..00000000000
--- a/data/removals/14_0/14_0-ds-deprecations.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-- title: "Dependency Scanning"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: nicoleschwartz
- breaking_change: true
- body: |
- As mentioned in [13.9](https://about.gitlab.com/releases/2021/02/22/gitlab-13-9-released/#deprecations-for-dependency-scanning) and [this blog post](https://about.gitlab.com/blog/2021/02/08/composition-analysis-14-deprecations-and-removals/) several removals for Dependency Scanning take effect.
-
- Previously, to exclude a DS analyzer, you needed to remove it from the default list of analyzers, and use that to set the `DS_DEFAULT_ANALYZERS` variable in your project’s CI template. We determined it should be easier to avoid running a particular analyzer without losing the benefit of newly added analyzers. As a result, we ask you to migrate from `DS_DEFAULT_ANALYZERS` to `DS_EXCLUDED_ANALYZERS` when it is available. Read about it in [issue #287691](https://gitlab.com/gitlab-org/gitlab/-/issues/287691).
-
- Previously, to prevent the Gemnasium analyzers to fetch the advisory database at runtime, you needed to set the `GEMNASIUM_DB_UPDATE` variable. However, this is not documented properly, and its naming is inconsistent with the equivalent `BUNDLER_AUDIT_UPDATE_DISABLED` variable. As a result, we ask you to migrate from `GEMNASIUM_DB_UPDATE` to `GEMNASIUM_UPDATE_DISABLED` when it is available. Read about it in [issue #215483](https://gitlab.com/gitlab-org/gitlab/-/issues/215483).
diff --git a/data/removals/14_0/14_0-lc-deprecations.yml b/data/removals/14_0/14_0-lc-deprecations.yml
deleted file mode 100644
index d5d1b6f422b..00000000000
--- a/data/removals/14_0/14_0-lc-deprecations.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-- title: "License Compliance"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: nicoleschwartz
- breaking_change: true
- body: |
- In 13.0, we deprecated the License-Management CI template and renamed it License-Scanning. We have been providing backward compatibility by warning users of the old template to switch. Now in 14.0, we are completely removing the License-Management CI template. Read about it in [issue #216261](https://gitlab.com/gitlab-org/gitlab/-/issues/216261) or [this blog post](https://about.gitlab.com/blog/2021/02/08/composition-analysis-14-deprecations-and-removals/).
diff --git a/data/removals/14_0/change_default_branch_name_to_main.yml b/data/removals/14_0/change_default_branch_name_to_main.yml
deleted file mode 100644
index 30bac5e5bf8..00000000000
--- a/data/removals/14_0/change_default_branch_name_to_main.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-- title: "Default branch name for new repositories now `main`"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: sarahwaldner
- breaking_change: true
- body: |
- Every Git repository has an initial branch, which is named `master` by default. It's the first branch to be created automatically when you create a new repository. Future [Git versions](https://lore.kernel.org/git/pull.656.v4.git.1593009996.gitgitgadget@gmail.com/) will change the default branch name in Git from `master` to `main`. In coordination with the Git project and the broader community, [GitLab has changed the default branch name](https://gitlab.com/gitlab-org/gitlab/-/issues/223789) for new projects on both our SaaS (GitLab.com) and self-managed offerings starting with GitLab 14.0. This will not affect existing projects.
-
- GitLab has already introduced changes that allow you to change the default branch name both at the [instance level](https://docs.gitlab.com/ee/user/project/repository/branches/default.html#instance-level-custom-initial-branch-name) (for self-managed users) and at the [group level](https://docs.gitlab.com/ee/user/group/#use-a-custom-name-for-the-initial-branch) (for both SaaS and self-managed users). We encourage you to make use of these features to set default branch names on new projects.
-
- For more information, check out our [blog post](https://about.gitlab.com/blog/2021/03/10/new-git-default-branch-name/).
diff --git a/data/removals/14_0/create-code-review-draft-wip.yml b/data/removals/14_0/create-code-review-draft-wip.yml
deleted file mode 100644
index aab9f86b711..00000000000
--- a/data/removals/14_0/create-code-review-draft-wip.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-- title: "WIP merge requests renamed 'draft merge requests'"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: phikai
- breaking_change: true
- body: |
- The WIP (work in progress) status for merge requests signaled to reviewers that the merge request in question wasn't ready to merge. We've renamed the WIP feature to **Draft**, a more inclusive and self-explanatory term. **Draft** clearly communicates the merge request in question isn't ready for review, and makes no assumptions about the progress being made toward it. **Draft** also reduces the cognitive load for new users, non-English speakers, and anyone unfamiliar with the WIP acronym.
diff --git a/data/removals/14_0/create-code-review-w-parameter-removal.yml b/data/removals/14_0/create-code-review-w-parameter-removal.yml
deleted file mode 100644
index cb10e1a583d..00000000000
--- a/data/removals/14_0/create-code-review-w-parameter-removal.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-- title: "`?w=1` URL parameter to ignore whitespace changes"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: phikai
- breaking_change: true
- body: |
- To create a consistent experience for users based on their preferences, support for toggling whitespace changes via URL parameter has been removed in GitLab 14.0.
diff --git a/data/removals/14_0/deprecation_bump_terraform_template_version.yml b/data/removals/14_0/deprecation_bump_terraform_template_version.yml
deleted file mode 100644
index 3ccba65553d..00000000000
--- a/data/removals/14_0/deprecation_bump_terraform_template_version.yml
+++ /dev/null
@@ -1,19 +0,0 @@
-- title: "Terraform template version"
- removal_date: "2021-06-22"
- removal_milestone: "14.0" # example
- issue_url: ""
- reporter: nagyv-gitlab
- breaking_change: true
- body: |
- As we continuously [develop GitLab's Terraform integrations](https://gitlab.com/gitlab-org/gitlab/-/issues/325312), to minimize customer disruption, we maintain two GitLab CI/CD templates for Terraform:
-
- - The ["latest version" template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform.latest.gitlab-ci.yml), which is updated frequently between minor releases of GitLab (such as 13.10, 13.11, etc).
- - The ["major version" template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform.gitlab-ci.yml), which is updated only at major releases (such as 13.0, 14.0, etc).
-
- At every major release of GitLab, the "latest version" template becomes the "major version" template, inheriting the "latest template" setup.
- As we have added many new features to the Terraform integration, the new setup for the "major version" template can be considered a breaking change.
-
- The latest template supports the [Terraform Merge Request widget](https://docs.gitlab.com/ee/user/infrastructure/iac/mr_integration.html) and
- doesn't need additional setup to work with the [GitLab managed Terraform state](https://docs.gitlab.com/ee/user/infrastructure/iac/terraform_state.html).
-
- To check the new changes, see the [new "major version" template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform.gitlab-ci.yml).
diff --git a/data/removals/14_0/deprecation_manage_access_14_0.yml b/data/removals/14_0/deprecation_manage_access_14_0.yml
deleted file mode 100644
index 5de9e31c44e..00000000000
--- a/data/removals/14_0/deprecation_manage_access_14_0.yml
+++ /dev/null
@@ -1,19 +0,0 @@
-- title: Limit projects returned in `GET /groups/:id/`
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: ogolowisnki
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/257829
- breaking_change: true
- body: |
- To improve performance, we are limiting the number of projects returned from the `GET /groups/:id/` API call to 100. A complete list of projects can still be retrieved with the `GET /groups/:id/projects` API call.
-
-- title: "GitLab OAuth implicit grant"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: ogolowinski
- issue_url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/288516'
- breaking_change: true
- body: |
- GitLab is deprecating the [OAuth 2 implicit grant flow](https://docs.gitlab.com/ee/api/oauth2.html#implicit-grant-flow) as it has been removed for [OAuth 2.1](https://oauth.net/2.1/).
-
- Migrate your existing applications to other supported [OAuth2 flows](https://docs.gitlab.com/ee/api/oauth2.html#supported-oauth2-flows).
diff --git a/data/removals/14_0/deprecation_update_cicd_templates_to_stop_using_hardcode_master.yml b/data/removals/14_0/deprecation_update_cicd_templates_to_stop_using_hardcode_master.yml
deleted file mode 100644
index d7ac8818476..00000000000
--- a/data/removals/14_0/deprecation_update_cicd_templates_to_stop_using_hardcode_master.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-- title: "Hardcoded `master` in CI/CD templates"
- reporter: dhershkovitch
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- breaking_change: true
- body: |
- Our CI/CD templates have been updated to no longer use hard-coded references to a `master` branch. In 14.0, they all use a variable that points to your project's configured default branch instead. If your CI/CD pipeline relies on our built-in templates, verify that this change works with your current configuration. For example, if you have a `master` branch and a different default branch, the updates to the templates may cause changes to your pipeline behavior. For more information, [read the issue](https://gitlab.com/gitlab-org/gitlab/-/issues/324131).
diff --git a/data/removals/14_0/deuley_servicetemplates_removal.yml b/data/removals/14_0/deuley_servicetemplates_removal.yml
deleted file mode 100644
index 4854911b8ac..00000000000
--- a/data/removals/14_0/deuley_servicetemplates_removal.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-- title: "Service Templates"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: deuley
- breaking_change: true
- body: |
- Service Templates are [removed in GitLab 14.0](https://gitlab.com/groups/gitlab-org/-/epics/5672). They were used to apply identical settings to a large number of projects, but they only did so at the time of project creation.
-
- While they solved part of the problem, _updating_ those values later proved to be a major pain point. [Project Integration Management](https://docs.gitlab.com/ee/user/admin_area/settings/project_integration_management.html) solves this problem by enabling you to create settings at the Group or Instance level, and projects within that namespace inheriting those settings.
diff --git a/data/removals/14_0/release_announce_deprecation_of_release_notes_api.yml b/data/removals/14_0/release_announce_deprecation_of_release_notes_api.yml
deleted file mode 100644
index 7f1133f12d0..00000000000
--- a/data/removals/14_0/release_announce_deprecation_of_release_notes_api.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-- title: "Release description in the Tags API"
- reporter: kbychu
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- issue_url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/300887'
- breaking_change: true
- body: |
- GitLab 14.0 removes support for the release description in the Tags API. You can no longer add a release description when [creating a new tag](https://docs.gitlab.com/ee/api/tags.html#create-a-new-tag). You also can no longer [create](https://docs.gitlab.com/ee/api/tags.html#create-a-new-release) or [update](https://docs.gitlab.com/ee/api/tags.html#update-a-release) a release through the Tags API. Please migrate to use the [Releases API](https://docs.gitlab.com/ee/api/releases/#create-a-release) instead.
diff --git a/data/removals/14_0/release_deprecation_auto-deploy-image.yml b/data/removals/14_0/release_deprecation_auto-deploy-image.yml
deleted file mode 100644
index b68388e0a9a..00000000000
--- a/data/removals/14_0/release_deprecation_auto-deploy-image.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-- title: "Auto Deploy CI template v1"
- reporter: kbychu
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- issue_url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/300862'
- breaking_change: true
- body: |
- In GitLab 14.0, we will update the [Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/stages.html#auto-deploy) CI template to the latest version. This includes new features, bug fixes, and performance improvements with a dependency on the v2 [auto-deploy-image](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image). Auto Deploy CI template v1 is deprecated going forward.
-
- Since the v1 and v2 versions are not backward-compatible, your project might encounter an unexpected failure if you already have a deployed application. Follow the [upgrade guide](https://docs.gitlab.com/ee/topics/autodevops/upgrading_auto_deploy_dependencies.html#upgrade-guide) to upgrade your environments. You can also start using the latest template today by following the [early adoption guide](https://docs.gitlab.com/ee/topics/autodevops/upgrading_auto_deploy_dependencies.html#early-adopters).
diff --git a/data/removals/14_0/release_domainsource_configuration_for_gitlab_pages_deprecation.yml b/data/removals/14_0/release_domainsource_configuration_for_gitlab_pages_deprecation.yml
deleted file mode 100644
index 902c36b8e96..00000000000
--- a/data/removals/14_0/release_domainsource_configuration_for_gitlab_pages_deprecation.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-- title: "Disk source configuration for GitLab Pages"
- reporter: kbychu
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- issue_url: 'https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5993'
- breaking_change: true
- body: |
- GitLab Pages [API-based configuration](https://docs.gitlab.com/ee/administration/pages/#gitlab-api-based-configuration) has been available since GitLab 13.0. It replaces the unsupported `disk` source configuration removed in GitLab 14.0, which can no longer be chosen. You should stop using `disk` source configuration, and move to `gitlab` for an API-based configuration. To migrate away from the 'disk' source configuration, set `gitlab_pages['domain_config_source'] = "gitlab"` in your `/etc/gitlab/gitlab.rb` file. We recommend you migrate before updating to GitLab 14.0, to identify and troubleshoot any potential problems before upgrading.
diff --git a/data/removals/14_0/release_legacy_feature_flags_deprecation.yml b/data/removals/14_0/release_legacy_feature_flags_deprecation.yml
deleted file mode 100644
index 4bf95e4ed35..00000000000
--- a/data/removals/14_0/release_legacy_feature_flags_deprecation.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-- title: "Legacy feature flags"
- reporter: kbychu
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- issue_url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/254324'
- breaking_change: true
- body: |
- Legacy feature flags became read-only in GitLab 13.4. GitLab 14.0 removes support for legacy feature flags, so you must migrate them to the [new version](https://docs.gitlab.com/ee/operations/feature_flags.html). You can do this by first taking a note (screenshot) of the legacy flag, then deleting the flag through the API or UI (you don't need to alter the code), and finally create a new Feature Flag with the same name as the legacy flag you deleted. Also, make sure the strategies and environments match the deleted flag. We created a [video tutorial](https://www.youtube.com/watch?v=CAJY2IGep7Y) to help with this migration.
diff --git a/data/removals/14_0/release_remove_redundant_keyvalue_pair_from_the_payload_of_dora.yml b/data/removals/14_0/release_remove_redundant_keyvalue_pair_from_the_payload_of_dora.yml
deleted file mode 100644
index 3679242d33a..00000000000
--- a/data/removals/14_0/release_remove_redundant_keyvalue_pair_from_the_payload_of_dora.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-- title: "Redundant timestamp field from DORA metrics API payload"
- reporter: kbychu
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- issue_url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/325931'
- breaking_change: true
- body: |
- The [deployment frequency project-level API](https://docs.gitlab.com/ee/api/dora/metrics.html#list-project-deployment-frequencies) endpoint has been deprecated in favor of the [DORA 4 API](https://docs.gitlab.com/ee/api/dora/metrics.html), which consolidates all the metrics under one API with the specific metric as a required field. As a result, the timestamp field, which doesn't allow adding future extensions and causes performance issues, will be removed. With the old API, an example response would be `{ "2021-03-01": 3, "date": "2021-03-01", "value": 3 }`. The first key/value (`"2021-03-01": 3`) will be removed and replaced by the last two (`"date": "2021-03-01", "value": 3`).
diff --git a/data/removals/14_0/removal-geo-fdw-settings.yml b/data/removals/14_0/removal-geo-fdw-settings.yml
deleted file mode 100644
index b2d035921c9..00000000000
--- a/data/removals/14_0/removal-geo-fdw-settings.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-- title: "Geo Foreign Data Wrapper settings"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: fzimmer
- breaking_change: true
- body: |
- As [announced in GitLab 13.3](https://about.gitlab.com/releases/2020/08/22/gitlab-13-3-released/#geo-foreign-data-wrapper-settings-deprecated), the following configuration settings in `/etc/gitlab/gitlab.rb` have been removed in 14.0:
-
- - `geo_secondary['db_fdw']`
- - `geo_postgresql['fdw_external_user']`
- - `geo_postgresql['fdw_external_password']`
- - `gitlab-_rails['geo_migrated_local_files_clean_up_worker_cron']`
diff --git a/data/removals/14_0/removal-graphql-fields.yml b/data/removals/14_0/removal-graphql-fields.yml
deleted file mode 100644
index bf73c427f96..00000000000
--- a/data/removals/14_0/removal-graphql-fields.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-- title: "Deprecated GraphQL fields"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: gweaver
- breaking_change: true
- body: |
- In accordance with our [GraphQL deprecation and removal process](https://docs.gitlab.com/ee/api/graphql/#deprecation-process), the following fields that were deprecated prior to 13.7 are [fully removed in 14.0](https://gitlab.com/gitlab-org/gitlab/-/issues/267966):
-
- - `Mutations::Todos::MarkAllDone`, `Mutations::Todos::RestoreMany` - `:updated_ids`
- - `Mutations::DastScannerProfiles::Create`, `Types::DastScannerProfileType` - `:global_id`
- - `Types::SnippetType` - `:blob`
- - `EE::Types::GroupType`, `EE::Types::QueryType` - `:vulnerabilities_count_by_day_and_severity`
- - `DeprecatedMutations (concern**)` - `AddAwardEmoji`, `RemoveAwardEmoji`, `ToggleAwardEmoji`
- - `EE::Types::DeprecatedMutations (concern***)` - `Mutations::Pipelines::RunDastScan`, `Mutations::Vulnerabilities::Dismiss`, `Mutations::Vulnerabilities::RevertToDetected`
diff --git a/data/removals/14_0/removal-legacy-storage.yml b/data/removals/14_0/removal-legacy-storage.yml
deleted file mode 100644
index 4c229c9e9d9..00000000000
--- a/data/removals/14_0/removal-legacy-storage.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-- title: "Legacy storage"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: fzimmer
- breaking_change: true
- body: |
- As [announced in GitLab 13.0](https://about.gitlab.com/releases/2020/05/22/gitlab-13-0-released/#planned-removal-of-legacy-storage-in-14.0), [legacy storage](https://docs.gitlab.com/ee/administration/repository_storage_types.html#legacy-storage) has been removed in GitLab 14.0.
diff --git a/data/removals/14_0/removal-protect-features.yml b/data/removals/14_0/removal-protect-features.yml
deleted file mode 100644
index 71fcaddaa06..00000000000
--- a/data/removals/14_0/removal-protect-features.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-- title: Container Scanning Engine Clair
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: sam.white
- breaking_change: true
- body: |
- Clair, the default container scanning engine, was deprecated in GitLab 13.9 and is removed from GitLab 14.0 and replaced by Trivy. We advise customers who are customizing variables for their container scanning job to [follow these instructions](https://docs.gitlab.com/ee/user/application_security/container_scanning/#change-scanners) to ensure that their container scanning jobs continue to work.
-
-- title: Web Application Firewall (WAF)
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: sam.white
- breaking_change: true
- body: |
- The Web Application Firewall (WAF) was deprecated in GitLab 13.6 and is removed from GitLab 14.0. The WAF had limitations inherent in the architectural design that made it difficult to meet the requirements traditionally expected of a WAF. By removing the WAF, GitLab is able to focus on improving other areas in the product where more value can be provided to users. Users who currently rely on the WAF can continue to use the free and open source [ModSecurity](https://github.com/SpiderLabs/ModSecurity) project, which is independent from GitLab. Additional details are available in the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/271276).
diff --git a/data/removals/14_0/removal-sidekiq_experimental_queue_selector.yml b/data/removals/14_0/removal-sidekiq_experimental_queue_selector.yml
deleted file mode 100644
index bbff9c56dda..00000000000
--- a/data/removals/14_0/removal-sidekiq_experimental_queue_selector.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-- title: Experimental prefix in Sidekiq queue selector options
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: smcgivern
- breaking_change: true
- body: |
- GitLab supports a [queue selector](https://docs.gitlab.com/ee/administration/operations/extra_sidekiq_processes.html#queue-selector) to run only a subset of background jobs for a given process. When it was introduced, this option had an 'experimental' prefix (`experimental_queue_selector` in Omnibus, `experimentalQueueSelector` in Helm charts).
-
- As announced in the [13.6 release post](https://about.gitlab.com/releases/2020/11/22/gitlab-13-6-released/#sidekiq-cluster-queue-selector-configuration-option-has-been-renamed), the 'experimental' prefix is no longer supported. Instead, `queue_selector` for Omnibus and `queueSelector` in Helm charts should be used.
diff --git a/data/removals/14_0/removal-unicorn.yml b/data/removals/14_0/removal-unicorn.yml
deleted file mode 100644
index 737c1fa53aa..00000000000
--- a/data/removals/14_0/removal-unicorn.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-- title: "Unicorn in GitLab self-managed"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: fzimmer
- breaking_change: true
- body: |
- [Support for Unicorn](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/6078) has been removed in GitLab 14.0 in favor of Puma. [Puma has a multi-threaded architecture](https://docs.gitlab.com/ee/administration/operations/puma.html) which uses less memory than a multi-process application server like Unicorn. On GitLab.com, we saw a 40% reduction in memory consumption by using Puma.
diff --git a/data/removals/14_0/removal_ci_project_config_path.yml b/data/removals/14_0/removal_ci_project_config_path.yml
deleted file mode 100644
index a54722c5923..00000000000
--- a/data/removals/14_0/removal_ci_project_config_path.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-- title: "`CI_PROJECT_CONFIG_PATH` variable"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: stkerr
- breaking_change: true
- body: |
- The `CI_PROJECT_CONFIG_PATH` [predefined project variable](https://docs.gitlab.com/ee/ci/variables/predefined_variables.html)
- has been removed in favor of `CI_CONFIG_PATH`, which is functionally the same.
-
- If you are using `CI_PROJECT_CONFIG_PATH` in your pipeline configurations,
- please update them to use `CI_CONFIG_PATH` instead.
diff --git a/data/removals/14_0/removal_enablement_helm2.yml b/data/removals/14_0/removal_enablement_helm2.yml
deleted file mode 100644
index 57ed67851c3..00000000000
--- a/data/removals/14_0/removal_enablement_helm2.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-- title: "Helm v2 support"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: joshlambert
- breaking_change: true
- body: |
- Helm v2 was [officially deprecated](https://helm.sh/blog/helm-v2-deprecation-timeline/) in November of 2020, with the `stable` repository being [de-listed from the Helm Hub](https://about.gitlab.com/blog/2020/11/09/ensure-auto-devops-work-after-helm-stable-repo/) shortly thereafter. With the release of GitLab 14.0, which will include the 5.0 release of the [GitLab Helm chart](https://docs.gitlab.com/charts/), Helm v2 will no longer be supported.
-
- Users of the chart should [upgrade to Helm v3](https://helm.sh/docs/topics/v2_v3_migration/) to deploy GitLab 14.0 and later.
diff --git a/data/removals/14_0/removal_enablement_opensuse_15_1.yml b/data/removals/14_0/removal_enablement_opensuse_15_1.yml
deleted file mode 100644
index c9da3535f41..00000000000
--- a/data/removals/14_0/removal_enablement_opensuse_15_1.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-- title: "OpenSUSE Leap 15.1"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: dorrino
- breaking_change: true
- body: |
- Support for [OpenSUSE Leap 15.1 is being deprecated](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/5135). Support for 15.1 will be dropped in 14.0. We are now providing support for openSUSE Leap 15.2 packages.
diff --git a/data/removals/14_0/removal_enablement_pg11.yml b/data/removals/14_0/removal_enablement_pg11.yml
deleted file mode 100644
index a7f9d3910be..00000000000
--- a/data/removals/14_0/removal_enablement_pg11.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-- title: "PostgreSQL 11 support"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: joshlambert
- breaking_change: true
- body: |
- 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 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_0/removal_enablement_ubuntu_16.yml b/data/removals/14_0/removal_enablement_ubuntu_16.yml
deleted file mode 100644
index 4c345c23e9c..00000000000
--- a/data/removals/14_0/removal_enablement_ubuntu_16.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-- title: "Ubuntu 16.04 support"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: joshlambert
- breaking_change: true
- body: |
- Ubuntu 16.04 [reached end-of-life in April 2021](https://ubuntu.com/about/release-cycle), and no longer receives maintenance updates. We strongly recommend users to upgrade to a newer release, such as 20.04.
-
- GitLab 13.12 will be the last release with Ubuntu 16.04 support.
diff --git a/data/removals/14_0/removal_repost_static_analysis_notices.yml b/data/removals/14_0/removal_repost_static_analysis_notices.yml
deleted file mode 100644
index 6ee59f72c4e..00000000000
--- a/data/removals/14_0/removal_repost_static_analysis_notices.yml
+++ /dev/null
@@ -1,42 +0,0 @@
-- title: "Migrate from `SAST_DEFAULT_ANALYZERS` to `SAST_EXCLUDED_ANALYZERS`"
- reporter: tmccaslin
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- issue_url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/229974'
- breaking_change: true
- body: |
- Until GitLab 13.9, if you wanted to avoid running one particular GitLab SAST analyzer, you needed to remove it from the [long string of analyzers in the `SAST.gitlab-ci.yml` file](https://gitlab.com/gitlab-org/gitlab/-/blob/390afc431e7ce1ac253b35beb39f19e49c746bff/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml#L12) and use that to set the [`SAST_DEFAULT_ANALYZERS`](https://docs.gitlab.com/ee/user/application_security/sast/#docker-images) variable in your project's CI file. If you did this, it would exclude you from future new analyzers because this string hard codes the list of analyzers to execute. We avoid this problem by inverting this variable's logic to exclude, rather than choose default analyzers.
- Beginning with 13.9, [we migrated](https://gitlab.com/gitlab-org/gitlab/-/blob/14fed7a33bfdbd4663d8928e46002a5ef3e3282c/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml#L13) to `SAST_EXCLUDED_ANALYZERS` in our `SAST.gitlab-ci.yml` file. We encourage anyone who uses a [customized SAST configuration](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) in their project CI file to migrate to this new variable. If you have not overridden `SAST_DEFAULT_ANALYZERS`, no action is needed. The CI/CD variable `SAST_DEFAULT_ANALYZERS` has been removed in GitLab 14.0, which released on June 22, 2021.
-
-- title: "`secret_detection_default_branch` job"
- reporter: tmccaslin
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- issue_url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/297269'
- breaking_change: true
- body: |
- To ensure Secret Detection was scanning both default branches and feature branches, we introduced two separate secret detection CI jobs (`secret_detection_default_branch` and `secret_detection`) in our managed [`Secret-Detection.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/Secret-Detection.gitlab-ci.yml) template. These two CI jobs created confusion and complexity in the CI rules logic. This deprecation moves the `rule` logic into the `script` section, which then determines how the `secret_detection` job is run (historic, on a branch, commits, etc).
- If you override or maintain custom versions of `SAST.gitlab-ci.yml` or `Secret-Detection.gitlab-ci.yml`, you must update your CI templates. We strongly encourage [inheriting and overriding our managed CI templates](https://docs.gitlab.com/ee/user/application_security/secret_detection/#custom-settings-example) to future-proof your CI templates. GitLab 14.0 no longer supports the old `secret_detection_default_branch` job.
-
-- title: "SAST analyzer `SAST_GOSEC_CONFIG` variable"
- reporter: tmccaslin
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- issue_url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/301215'
- breaking_change: true
- body: |
- With the release of [SAST Custom Rulesets](https://docs.gitlab.com/ee/user/application_security/sast/#customize-rulesets) in GitLab 13.5 we allow greater flexibility in configuration options for our Go analyzer (GoSec). As a result we no longer plan to support our less flexible [`SAST_GOSEC_CONFIG`](https://docs.gitlab.com/ee/user/application_security/sast/#analyzer-settings) analyzer setting. This variable was deprecated in GitLab 13.10.
- GitLab 14.0 removes the old `SAST_GOSEC_CONFIG variable`. If you use or override `SAST_GOSEC_CONFIG` in your CI file, update your SAST CI configuration or pin to an older version of the GoSec analyzer. We strongly encourage [inheriting and overriding our managed CI templates](https://docs.gitlab.com/ee/user/application_security/sast/#overriding-sast-jobs) to future-proof your CI templates.
-
-- title: "Global `SAST_ANALYZER_IMAGE_TAG` in SAST CI template"
- reporter: tmccaslin
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- issue_url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/301216'
- breaking_change: true
- body: |
- With the maturity of GitLab Secure scanning tools, we've needed to add more granularity to our release process. Previously, GitLab shared a major version number for [all analyzers and tools](https://docs.gitlab.com/ee/user/application_security/sast/#supported-languages-and-frameworks). This requires all tools to share a major version, and prevents the use of [semantic version numbering](https://semver.org/). In GitLab 14.0, SAST removes the `SAST_ANALYZER_IMAGE_TAG` global variable in our [managed `SAST.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml) CI template, in favor of the analyzer job variable setting the `major.minor` tag in the SAST vendored template.
-
- Each analyzer job now has a scoped `SAST_ANALYZER_IMAGE_TAG` variable, which will be actively managed by GitLab and set to the `major` tag for the respective analyzer. To pin to a specific version, [change the variable value to the specific version tag](https://docs.gitlab.com/ee/user/application_security/sast/#pinning-to-minor-image-version).
- If you override or maintain custom versions of `SAST.gitlab-ci.yml`, update your CI templates to stop referencing the global `SAST_ANALYZER_IMAGE_TAG`, and move it to a scoped analyzer job tag. We strongly encourage [inheriting and overriding our managed CI templates](https://docs.gitlab.com/ee/user/application_security/sast/#overriding-sast-jobs) to future-proof your CI templates. This change allows you to more granularly control future analyzer updates with a pinned `major.minor` version.
- This deprecation and removal changes our [previously announced plan](https://about.gitlab.com/releases/2021/02/22/gitlab-13-9-released/#pin-static-analysis-analyzers-and-tools-to-minor-versions) to pin the Static Analysis tools.
diff --git a/data/removals/14_0/removal_runner_25555.yml b/data/removals/14_0/removal_runner_25555.yml
deleted file mode 100644
index 13c4d41989c..00000000000
--- a/data/removals/14_0/removal_runner_25555.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-- title: "Off peak time mode configuration for Docker Machine autoscaling"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: deastman
- breaking_change: true
- body: |
- In GitLab Runner 13.0, [issue #5069](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/5069), we introduced new timing options for the GitLab Docker Machine executor. In GitLab Runner 14.0, we have removed the old configuration option, [off peak time mode](https://docs.gitlab.com/runner/configuration/autoscale.html#off-peak-time-mode-configuration-deprecated).
diff --git a/data/removals/14_0/removal_runner_26036.yml b/data/removals/14_0/removal_runner_26036.yml
deleted file mode 100644
index c806b2b54f1..00000000000
--- a/data/removals/14_0/removal_runner_26036.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-- title: "Ubuntu 19.10 (Eoan Ermine) package"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: deastman
- breaking_change: true
- body: |
- Ubuntu 19.10 (Eoan Ermine) reached end of life on Friday, July 17, 2020. In GitLab Runner 14.0, Ubuntu 19.10 (Eoan Ermine) is no longer available from our package distribution. Refer to [issue #26036](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/26036) for details.
diff --git a/data/removals/14_0/removal_runner_26419.yml b/data/removals/14_0/removal_runner_26419.yml
deleted file mode 100644
index 83690f807ba..00000000000
--- a/data/removals/14_0/removal_runner_26419.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-- title: "Make `pwsh` the default shell for newly-registered Windows Runners"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: deastman
- breaking_change: true
- body: |
- In GitLab Runner 13.2, PowerShell Core support was added to the Shell executor. In 14.0, PowerShell Core, `pwsh` is now the default shell for newly-registered Windows runners. Windows `CMD` will still be available as a shell option for Windows runners. Refer to [issue #26419](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/26419) for details.
diff --git a/data/removals/14_0/removal_runner_4845.yml b/data/removals/14_0/removal_runner_4845.yml
deleted file mode 100644
index 7aab67e3d41..00000000000
--- a/data/removals/14_0/removal_runner_4845.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-- title: "GitLab Runner installation to ignore the `skel` directory"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: deastman
- breaking_change: true
- body: |
- In GitLab Runner 14.0, the installation process will ignore the `skel` directory by default when creating the user home directory. Refer to [issue #4845](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/4845) for details.
diff --git a/data/removals/14_0/removal_runner_6413.yml b/data/removals/14_0/removal_runner_6413.yml
deleted file mode 100644
index e511b792fe7..00000000000
--- a/data/removals/14_0/removal_runner_6413.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-- title: "`FF_SHELL_EXECUTOR_USE_LEGACY_PROCESS_KILL` feature flag"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: deastman
- breaking_change: true
- body: |
- In [GitLab Runner 13.1](https://docs.gitlab.com/runner/executors/shell.html#gitlab-131-and-later), [issue #3376](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/3376), we introduced `sigterm` and then `sigkill` to a process in the Shell executor. We also introduced a new feature flag, `FF_SHELL_EXECUTOR_USE_LEGACY_PROCESS_KILL`, so you can use the previous process termination sequence. In GitLab Runner 14.0, [issue #6413](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/6413), the feature flag has been removed.
diff --git a/data/removals/14_0/removals-14-testing-team.yml b/data/removals/14_0/removals-14-testing-team.yml
deleted file mode 100644
index 4146bfe916c..00000000000
--- a/data/removals/14_0/removals-14-testing-team.yml
+++ /dev/null
@@ -1,29 +0,0 @@
-- title: "Default Browser Performance testing job renamed in GitLab 14.0"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: jheimbuck_gl
- breaking_change: true
- body: |
- Browser Performance Testing has run in a job named `performance` by default. With the introduction of [Load Performance Testing](https://docs.gitlab.com/ee/ci/testing/code_quality.html) in GitLab 13.2, this naming could be confusing. To make it clear which job is running [Browser Performance Testing](https://docs.gitlab.com/ee/ci/testing/browser_performance_testing.html), the default job name is changed from `performance` to `browser_performance` in the template in GitLab 14.0.
-
- Relevant Issue: [Rename default Browser Performance Testing job](https://gitlab.com/gitlab-org/gitlab/-/issues/225914)
-- title: "Code Quality RuboCop support changed"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: jheimbuck_gl
- breaking_change: true
- body: |
- By default, the Code Quality feature has not provided support for Ruby 2.6+ if you're using the Code Quality template. To better support the latest versions of Ruby, the default RuboCop version is updated to add support for Ruby 2.4 through 3.0. As a result, support for Ruby 2.1, 2.2, and 2.3 is removed. You can re-enable support for older versions by [customizing your configuration](https://docs.gitlab.com/ee/ci/testing/code_quality.html#rubocop-errors).
-
- Relevant Issue: [Default `codeclimate-rubocop` engine does not support Ruby 2.6+](https://gitlab.com/gitlab-org/ci-cd/codequality/-/issues/28)
-- title: "Ruby version changed in `Ruby.gitlab-ci.yml`"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: jheimbuck_gl
- breaking_change: true
- body: |
- By default, the `Ruby.gitlab-ci.yml` file has included Ruby 2.5.
-
- To better support the latest versions of Ruby, the template is changed to use `ruby:latest`, which is currently 3.0. To better understand the changes in Ruby 3.0, please reference the [Ruby-lang.org release announcement](https://www.ruby-lang.org/en/news/2020/12/25/ruby-3-0-0-released/).
-
- Relevant Issue: [Updates Ruby version 2.5 to 3.0](https://gitlab.com/gitlab-org/gitlab/-/issues/329160)
diff --git a/data/removals/14_0/removals_runner_26651.yml b/data/removals/14_0/removals_runner_26651.yml
deleted file mode 100644
index c2c0f88728a..00000000000
--- a/data/removals/14_0/removals_runner_26651.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-- title: "`/usr/lib/gitlab-runner` symlink from package"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: deastman
- breaking_change: true
- body: |
- In GitLab Runner 13.3, a symlink was added from `/user/lib/gitlab-runner/gitlab-runner` to `/usr/bin/gitlab-runner`. In 14.0, the symlink has been removed and the runner is now installed in `/usr/bin/gitlab-runner`. Refer to [issue #26651](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/26651) for details.
diff --git a/data/removals/14_0/removals_runner_26679.yml b/data/removals/14_0/removals_runner_26679.yml
deleted file mode 100644
index 1827992a801..00000000000
--- a/data/removals/14_0/removals_runner_26679.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-- title: "`FF_RESET_HELPER_IMAGE_ENTRYPOINT` feature flag"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: deastman
- breaking_change: true
- body: |
- In 14.0, we have deactivated the `FF_RESET_HELPER_IMAGE_ENTRYPOINT` feature flag. Refer to issue [#26679](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/26679) for details.
diff --git a/data/removals/14_0/removals_runner_26900.yml b/data/removals/14_0/removals_runner_26900.yml
deleted file mode 100644
index a823d797c1a..00000000000
--- a/data/removals/14_0/removals_runner_26900.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-- title: "Success and failure for finished build metric conversion"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: deastman
- breaking_change: true
- body: |
- In GitLab Runner 13.5, we introduced `failed` and `success` states for a job. To support Prometheus rules, we chose to convert `success/failure` to `finished` for the metric. In 14.0, the conversion has now been removed. Refer to [issue #26900](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/26900) for details.
diff --git a/data/removals/14_0/removals_runner_27175.yml b/data/removals/14_0/removals_runner_27175.yml
deleted file mode 100644
index c164f50a973..00000000000
--- a/data/removals/14_0/removals_runner_27175.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-- title: "`FF_USE_GO_CLOUD_WITH_CACHE_ARCHIVER` feature flag"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: deastman
- breaking_change: true
- body: |
- GitLab Runner 14.0 removes the `FF_USE_GO_CLOUD_WITH_CACHE_ARCHIVER` feature flag. Refer to [issue #27175](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/27175) for details.
diff --git a/data/removals/14_0/removals_runner_27218.yml b/data/removals/14_0/removals_runner_27218.yml
deleted file mode 100644
index 8c18551d68b..00000000000
--- a/data/removals/14_0/removals_runner_27218.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-- title: "GitLab Runner helper image in GitLab.com Container Registry"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: deastman
- breaking_change: true
- body: |
- In 14.0, we are now pulling the GitLab Runner [helper image](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#helper-image) from the GitLab Container Registry instead of Docker Hub. Refer to [issue #27218](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/27218) for details.
diff --git a/data/removals/14_0/removals_runner_27551.yml b/data/removals/14_0/removals_runner_27551.yml
deleted file mode 100644
index 0165a541420..00000000000
--- a/data/removals/14_0/removals_runner_27551.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-- title: "Windows Server 1903 image support"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: deastman
- breaking_change: true
- body: |
- In 14.0, we have removed Windows Server 1903. Microsoft ended support for this version on 2020-08-12. Refer to [issue #27551](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/27551) for details.
diff --git a/data/removals/14_0/removals_runner_27899.yml b/data/removals/14_0/removals_runner_27899.yml
deleted file mode 100644
index 8eef3009df8..00000000000
--- a/data/removals/14_0/removals_runner_27899.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-- title: "Windows Server 1909 image support"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: deastman
- breaking_change: true
- body: |
- In 14.0, we have removed Windows Server 1909. Microsoft ended support for this version on 2021-05-11. Refer to [issue #27899](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/27899) for details.
diff --git a/data/removals/14_0/remove-sql-elector.yml b/data/removals/14_0/remove-sql-elector.yml
deleted file mode 100644
index 2628f23129c..00000000000
--- a/data/removals/14_0/remove-sql-elector.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-- title: "Gitaly Cluster SQL primary elector"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: mjwood
- breaking_change: true
- body: |
- Now that Praefect supports a [primary election strategy](https://docs.gitlab.com/ee/administration/gitaly/praefect.html#repository-specific-primary-nodes) for each repository, we have removed the `sql` election strategy.
- The `per_repository` election strategy is the new default, which is automatically used if no election strategy was specified.
-
- If you had configured the `sql` election strategy, you must follow the [migration instructions](https://docs.gitlab.com/ee/administration/gitaly/praefect.html#migrate-to-repository-specific-primary-gitaly-nodes) before upgrading to 14.0.
diff --git a/data/removals/14_0/remove_dast_env_variables.yml b/data/removals/14_0/remove_dast_env_variables.yml
deleted file mode 100644
index 8ed23aae6fa..00000000000
--- a/data/removals/14_0/remove_dast_env_variables.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-- title: "DAST environment variable renaming and removal"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: derekferguson
- breaking_change: true
- body: |
- GitLab 13.8 renamed multiple environment variables to support their broader usage in different workflows. In GitLab 14.0, the old variables have been permanently removed and will no longer work. Any configurations using these variables must be updated to the new variable names. Any scans using these variables in GitLab 14.0 and later will fail to be configured correctly. These variables are:
-
- - `DAST_AUTH_EXCLUDE_URLS` becomes `DAST_EXCLUDE_URLS`.
- - `AUTH_EXCLUDE_URLS` becomes `DAST_EXCLUDE_URLS`.
- - `AUTH_USERNAME` becomes `DAST_USERNAME`.
- - `AUTH_PASSWORD` becomes `DAST_PASSWORD`.
- - `AUTH_USERNAME_FIELD` becomes `DAST_USERNAME_FIELD`.
- - `AUTH_PASSWORD_FIELD` becomes `DAST_PASSWORD_FIELD`.
- - `DAST_ZAP_USE_AJAX_SPIDER` will now be `DAST_USE_AJAX_SPIDER`.
- - `DAST_FULL_SCAN_DOMAIN_VALIDATION_REQUIRED` will be removed, since the feature is being removed.
diff --git a/data/removals/14_0/remove_dast_legacy_domain_validation.yml b/data/removals/14_0/remove_dast_legacy_domain_validation.yml
deleted file mode 100644
index ffb2ec1118e..00000000000
--- a/data/removals/14_0/remove_dast_legacy_domain_validation.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-- title: "Legacy DAST domain validation"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: derekferguson
- breaking_change: true
- body: |
- The legacy method of DAST Domain Validation for CI/CD scans was deprecated in GitLab 13.8, and is removed in GitLab 14.0. This method of domain validation only disallows scans if the `DAST_FULL_SCAN_DOMAIN_VALIDATION_REQUIRED` environment variable is set to `true` in the `gitlab-ci.yml` file, and a `Gitlab-DAST-Permission` header on the site is not set to `allow`. This two-step method required users to opt in to using the variable before they could opt out from using the header.
-
- For more information, see the [removal issue](https://gitlab.com/gitlab-org/gitlab/-/issues/293595).
diff --git a/data/removals/14_0/remove_dast_legacy_report_fields.yml b/data/removals/14_0/remove_dast_legacy_report_fields.yml
deleted file mode 100644
index cf885ca521d..00000000000
--- a/data/removals/14_0/remove_dast_legacy_report_fields.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-- title: "Legacy fields from DAST report"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: derekferguson
- breaking_change: true
- body: |
- As a part of the migration to a common report format for all of the Secure scanners in GitLab, DAST is making changes to the DAST JSON report. Certain legacy fields were deprecated in 13.8 and have been completely removed in 14.0. These fields are `@generated`, `@version`, `site`, and `spider`. This should not affect any normal DAST operation, but does affect users who consume the JSON report in an automated way and use these fields. Anyone affected by these changes, and needs these fields for business reasons, is encouraged to open a new GitLab issue and explain the need.
-
- For more information, see [the removal issue](https://gitlab.com/gitlab-org/gitlab/-/issues/33915).
diff --git a/data/removals/14_0/remove_dast_spider_host_reset.yml b/data/removals/14_0/remove_dast_spider_host_reset.yml
deleted file mode 100644
index 6a44a70655e..00000000000
--- a/data/removals/14_0/remove_dast_spider_host_reset.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-- title: "Default DAST spider begins crawling at target URL"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: derekferguson
- breaking_change: true
- body: |
- In GitLab 14.0, DAST has removed the current method of resetting the scan to the hostname when starting to spider. Prior to GitLab 14.0, the spider would not begin at the specified target path for the URL but would instead reset the URL to begin crawling at the host root. GitLab 14.0 changes the default for the new variable `DAST_SPIDER_START_AT_HOST` to `false` to better support users' intention of beginning spidering and scanning at the specified target URL, rather than the host root URL. This change has an added benefit: scans can take less time, if the specified path does not contain links to the entire site. This enables easier scanning of smaller sections of an application, rather than crawling the entire app during every scan.
diff --git a/data/removals/14_0/remove_dast_template_stages.yml b/data/removals/14_0/remove_dast_template_stages.yml
deleted file mode 100644
index 4a7c9f13fc8..00000000000
--- a/data/removals/14_0/remove_dast_template_stages.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-- title: "DAST default template stages"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: derekferguson
- breaking_change: true
- body: |
- In GitLab 14.0, we've removed the stages defined in the current `DAST.gitlab-ci.yml` template to avoid the situation where the template overrides manual changes made by DAST users. We're making this change in response to customer issues where the stages in the template cause problems when used with customized DAST configurations. Because of this removal, `gitlab-ci.yml` configurations that do not specify a `dast` stage must be updated to include this stage.
diff --git a/data/removals/14_0/remove_optimize_api.yml b/data/removals/14_0/remove_optimize_api.yml
deleted file mode 100644
index aa50a4ce7d2..00000000000
--- a/data/removals/14_0/remove_optimize_api.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-- title: "DevOps Adoption API Segments"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: ljlane
- breaking_change: true
- body: |
- The first release of the DevOps Adoption report had a concept of **Segments**. Segments were [quickly removed from the report](https://gitlab.com/groups/gitlab-org/-/epics/5251) because they introduced an additional layer of complexity on top of **Groups** and **Projects**. Subsequent iterations of the DevOps Adoption report focus on comparing adoption across groups rather than segments. GitLab 14.0 removes all references to **Segments** [from the GraphQL API](https://gitlab.com/gitlab-org/gitlab/-/issues/324414) and replaces them with **Enabled groups**.
diff --git a/data/removals/14_0/remove_terraform_template.yml b/data/removals/14_0/remove_terraform_template.yml
deleted file mode 100644
index 77fade19fc5..00000000000
--- a/data/removals/14_0/remove_terraform_template.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-- title: "Breaking changes to Terraform CI template"
- reporter: nagyv-gitlab
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- issue_url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/328500'
- breaking_change: true
- body: |
- GitLab 14.0 renews the Terraform CI template to the latest version. The new template is set up for the GitLab Managed Terraform state, with a dependency on the GitLab `terraform-images` image, to provide a good user experience around GitLab's Infrastructure-as-Code features.
-
- The current stable and latest templates are not compatible, and the current latest template becomes the stable template beginning with GitLab 14.0, your Terraform pipeline might encounter an unexpected failure if you run a custom `init` job.
diff --git a/data/removals/14_0/verify-ci-removal-parametertrace.yml b/data/removals/14_0/verify-ci-removal-parametertrace.yml
deleted file mode 100644
index 7dd74bac53c..00000000000
--- a/data/removals/14_0/verify-ci-removal-parametertrace.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-- title: "`trace` parameter in `jobs` API"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: jreporter
- breaking_change: true
- body: |
- GitLab Runner was updated in GitLab 13.4 to internally stop passing the `trace` parameter to the `/api/jobs/:id` endpoint. GitLab 14.0 deprecates the `trace` parameter entirely for all other requests of this endpoint. Make sure your [GitLab Runner version matches your GitLab version](https://docs.gitlab.com/runner/#gitlab-runner-versions) to ensure consistent behavior.
diff --git a/data/removals/14_0/verify-ci-removalpipelineservice.yml b/data/removals/14_0/verify-ci-removalpipelineservice.yml
deleted file mode 100644
index 74c10f8fbbe..00000000000
--- a/data/removals/14_0/verify-ci-removalpipelineservice.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-- title: "External Pipeline Validation Service Code Changes"
- removal_date: "2021-06-22"
- removal_milestone: "14.0"
- reporter: jreporter
- breaking_change: true
- body: |
- For self-managed instances using the experimental [external pipeline validation service](https://docs.gitlab.com/ee/administration/external_pipeline_validation.html), the range of error codes GitLab accepts will be reduced. Currently, pipelines are invalidated when the validation service returns a response code from `400` to `499`. In GitLab 14.0 and later, pipelines will be invalidated for the `406: Not Accepted` response code only.
diff --git a/data/removals/14_1/removal-memory-prometheus-options-source.yml b/data/removals/14_1/removal-memory-prometheus-options-source.yml
deleted file mode 100644
index a98dc74bbaf..00000000000
--- a/data/removals/14_1/removal-memory-prometheus-options-source.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-- title: "Remove support for `prometheus.listen_address` and `prometheus.enable`"
- removal_date: July 22, 2021
- removal_milestone: "14.1"
- reporter: fzimmer
- breaking_change: false
- body: |
- The support for `prometheus.listen_address` and `prometheus.enable` has been removed from `gitlab.yml`. Use `prometheus.enabled` and `prometheus.server_address` to set up Prometheus server that GitLab instance connects to. Refer to [our documentation](https://docs.gitlab.com/ee/install/installation.html#prometheus-server-setup) for details.
-
- This only affects new installations from source where users might use the old configurations.
diff --git a/data/removals/14_1/removal-outdated-browser-support.yml b/data/removals/14_1/removal-outdated-browser-support.yml
deleted file mode 100644
index 8ef732564a8..00000000000
--- a/data/removals/14_1/removal-outdated-browser-support.yml
+++ /dev/null
@@ -1,21 +0,0 @@
-- title: "Remove support for older browsers"
- removal_date: July 22, 2021
- removal_milestone: "14.1"
- reporter: leipert
- breaking_change: false
- body: |
- In GitLab 14.1, we are cleaning up and [removing old code](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63994) that was specific for browsers that we no longer support. This has no impact on users when one of our [supported web browsers](https://docs.gitlab.com/ee/install/requirements.html#supported-web-browsers) is used.
-
- Most notably, support for the following browsers has been removed:
-
- - Apple Safari 13 and older.
- - Mozilla Firefox 68.
- - Pre-Chromium Microsoft Edge.
-
- The minimum supported browser versions are:
-
- - Apple Safari 13.1.
- - Mozilla Firefox 78.
- - Google Chrome 84.
- - Chromium 84.
- - Microsoft Edge 84.
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
deleted file mode 100644
index 47e1502c466..00000000000
--- a/data/removals/14_10/14-10-package-permissions-composer-change.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-- title: "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/14_2/removal-verify-build-log.yml b/data/removals/14_2/removal-verify-build-log.yml
deleted file mode 100644
index 8ef41231543..00000000000
--- a/data/removals/14_2/removal-verify-build-log.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-- title: "Max job log file size of 100 MB"
- removal_date: August 22, 2021 # day the removal was released
- removal_milestone: "14.2"
- reporter: jreporter # GitLab username of the person reporting the removal
- breaking_change: false
- body: |
- GitLab values efficiency for all users in our wider community of contributors, so we're always working hard to make sure the application performs at a high level with a lovable UX.
- In GitLab 14.2, we have introduced a [job log file size limit](https://docs.gitlab.com/ee/administration/instance_limits.html#maximum-file-size-for-job-logs), set to 100 megabytes by default. Administrators of self-managed GitLab instances can customize this to any value. All jobs that exceed this limit are dropped and marked as failed, helping prevent performance impacts or over-use of resources. This ensures that everyone using GitLab has the best possible experience.
diff --git a/data/removals/14_3/removal-limit-tags-to-50.yml b/data/removals/14_3/removal-limit-tags-to-50.yml
deleted file mode 100644
index b75fa440ff6..00000000000
--- a/data/removals/14_3/removal-limit-tags-to-50.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-- title: "Introduced limit of 50 tags for jobs"
- removal_date: September 22nd, 2021
- removal_milestone: "14.3"
- reporter: jreporter
- breaking_change: false
- body: |
- GitLab values efficiency and is prioritizing reliability for [GitLab.com in FY22](https://about.gitlab.com/direction/#gitlab-hosted-first). In 14.3, GitLab CI/CD jobs must have less than 50 [tags](https://docs.gitlab.com/ee/ci/yaml/index.html#tags). If a pipeline contains a job with 50 or more tags, you will receive an error and the pipeline will not be created.
diff --git a/data/removals/14_3/removal-verify-pe-pipelinefindername.yml b/data/removals/14_3/removal-verify-pe-pipelinefindername.yml
deleted file mode 100644
index ad069308045..00000000000
--- a/data/removals/14_3/removal-verify-pe-pipelinefindername.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-- title: "List project pipelines API endpoint removes `name` support in 14.3"
- removal_date: September 22, 2021 # day the removal was released
- removal_milestone: "14.3"
- reporter: jreporter # GitLab username of the person reporting the removal
- breaking_change: false
- body: |
- In GitLab 14.3, we will remove the ability to filter by `name` in the [list project pipelines API endpoint](https://docs.gitlab.com/ee/api/pipelines.html#list-project-pipelines) to improve performance. If you currently use this parameter with this endpoint, you must switch to `username`.
diff --git a/data/removals/14_3/removal_legacy_storage_setting.yml b/data/removals/14_3/removal_legacy_storage_setting.yml
deleted file mode 100644
index ded32188e56..00000000000
--- a/data/removals/14_3/removal_legacy_storage_setting.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-- title: Use of legacy storage setting
- removal_date: September 22nd, 2021 # day the removal was released
- removal_milestone: "14.3"
- reporter: dorrino # GitLab username of the person reporting the removal
- breaking_change: false
- body: | # example (supports markdown)
- The support for [`gitlab_pages['use_legacy_storage']` setting](https://docs.gitlab.com/ee/administration/pages/index.html#domain-source-configuration-before-140) in Omnibus installations has been removed.
-
- In 14.0 we removed [`domain_config_source`](https://docs.gitlab.com/ee/administration/pages/index.html#domain-source-configuration-before-140) which had been previously deprecated, and allowed users to specify disk storage. In 14.0 we added `use_legacy_storage` as a **temporary** flag to unblock upgrades, and allow us to debug issues with our users and it was deprecated and communicated for removal in 14.3.
diff --git a/data/removals/14_6/limit_trigger_pipelines.yml b/data/removals/14_6/limit_trigger_pipelines.yml
deleted file mode 100644
index f893ebf7643..00000000000
--- a/data/removals/14_6/limit_trigger_pipelines.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-- title: "Limit the number of triggered pipeline to 25K in free tier"
- removal_date: Dec 22, 2021 # day the removal was released
- removal_milestone: "14.6"
- reporter: dhershkovitch # GitLab username of the person reporting the removal
- body: |
- A large amount of triggered pipelines in a single project impacts the performance of GitLab.com. In GitLab 14.6, we are limiting the number of triggered pipelines in a single project on GitLab.com at any given moment to 25,000. This change applies to projects in the free tier only, Premium and Ultimate are not affected by this change.
diff --git a/data/removals/14_6/removal-release-cli-s3.yml b/data/removals/14_6/removal-release-cli-s3.yml
deleted file mode 100644
index 458c027c4c0..00000000000
--- a/data/removals/14_6/removal-release-cli-s3.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-- title: "Release CLI distributed as a generic package"
- removal_date: Dec 22, 2021 # day the removal was released
- removal_milestone: "14.6"
- reporter: kbychu # GitLab username of the person reporting the removal
- body: |
- 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.
diff --git a/data/removals/14_9/removal_monitor_respond_integrated_error_tracking.yml b/data/removals/14_9/removal_monitor_respond_integrated_error_tracking.yml
deleted file mode 100644
index 93824a4e68b..00000000000
--- a/data/removals/14_9/removal_monitor_respond_integrated_error_tracking.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-- title: "Integrated error tracking disabled by default"
- announcement_milestone: "14.9"
- announcement_date: "2022-02-23" # This is the date customers were notified about the change in rate limits, making integrated error tracking unusable, see https://gitlab.com/groups/gitlab-org/-/epics/7580#communication-to-rate-limit-impacted-users
- removal_milestone: "14.9"
- removal_date: "2022-03-10" # The MR was merged on this date, outside of the normal release cycle, https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81767
- breaking_change: true
- reporter: abellucci
- body: |
- In GitLab 14.4, GitLab released an integrated error tracking backend that replaces Sentry. This feature caused database performance issues. In GitLab 14.9, integrated error tracking is removed from GitLab.com, and turned off by default in GitLab self-managed. While we explore the future development of this feature, please consider switching to the Sentry backend by [changing your error tracking to Sentry in your project settings](https://docs.gitlab.com/ee/operations/error_tracking.html#sentry-error-tracking).
-
- For additional background on this removal, please reference [Disable Integrated Error Tracking by Default](https://gitlab.com/groups/gitlab-org/-/epics/7580). If you have feedback please add a comment to [Feedback: Removal of Integrated Error Tracking](https://gitlab.com/gitlab-org/gitlab/-/issues/355493).
- stage: monitor
- tiers: [Free, Silver, Gold, Core, Premium, Ultimate]
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/353639
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
deleted file mode 100644
index 81e9df8d761..00000000000
--- a/data/removals/15_0/15-0-Legacy-approval-status-names-from-License-Compliance-API.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-- title: "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
deleted file mode 100644
index 6d0bb6e358c..00000000000
--- a/data/removals/15_0/15-0-Pseudonymizer.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-- title: "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
deleted file mode 100644
index fa744ca1951..00000000000
--- a/data/removals/15_0/15-0-Retire-js-analyzer.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-- title: "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
deleted file mode 100644
index b6499455574..00000000000
--- a/data/removals/15_0/15-0-SLES-12-SP2.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-- title: "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
deleted file mode 100644
index d920c54a786..00000000000
--- a/data/removals/15_0/15-0-advanced-search-elasticsearch-6-8.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-- title: "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/advanced_search/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
deleted file mode 100644
index 397b18580c6..00000000000
--- a/data/removals/15_0/15-0-bundler-audit.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-- title: "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-configure-self-managed-cert-based-kube-feature-flag.yml b/data/removals/15_0/15-0-configure-self-managed-cert-based-kube-feature-flag.yml
deleted file mode 100644
index 7905e0b6dbe..00000000000
--- a/data/removals/15_0/15-0-configure-self-managed-cert-based-kube-feature-flag.yml
+++ /dev/null
@@ -1,24 +0,0 @@
-- title: "Self-managed certificate-based integration with Kubernetes feature flagged"
- announcement_milestone: "14.5"
- announcement_date: "2021-11-15"
- removal_milestone: "15.0"
- removal_date: "2022-05-22"
- breaking_change: true
- reporter: nagyv-gitlab
- stage: Configure
- issue_url: https://gitlab.com/groups/gitlab-org/configure/-/epics/8
- body: | # (required) Do not modify this line, instead modify the lines below.
- In 15.0 the certificate-based integration with Kubernetes will be disabled by default.
-
- After 15.0, you should use the [agent for Kubernetes](https://docs.gitlab.com/ee/user/clusters/agent/) to connect Kubernetes clusters with GitLab. The agent for Kubernetes is a more robust, secure, and reliable integration with Kubernetes. [How do I migrate to the agent?](https://docs.gitlab.com/ee/user/infrastructure/clusters/migrate_to_gitlab_agent.html)
-
- If you need more time to migrate, you can enable the `certificate_based_clusters` [feature flag](https://docs.gitlab.com/ee/administration/feature_flags.html), which re-enables the certificate-based integration.
-
- In GitLab 17.0, we will [remove the feature, its related code, and the feature flag](https://about.gitlab.com/blog/2021/11/15/deprecating-the-cert-based-kubernetes-integration/). GitLab will continue to fix any security or critical issues until 17.0.
-
- For updates and details, follow [this epic](https://gitlab.com/groups/gitlab-org/configure/-/epics/8).
-#
-# OPTIONAL FIELDS
-#
- tiers: [Core, Premium, Ultimate]
- documentation_url: 'https://docs.gitlab.com/ee/user/infrastructure/clusters/#certificate-based-kubernetes-integration-deprecated'
diff --git a/data/removals/15_0/15-0-container-registry-htpasswd.yml b/data/removals/15_0/15-0-container-registry-htpasswd.yml
deleted file mode 100644
index 78a28c4e615..00000000000
--- a/data/removals/15_0/15-0-container-registry-htpasswd.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-- title: "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
deleted file mode 100644
index 55f63c9bef7..00000000000
--- a/data/removals/15_0/15-0-custom_hooks_dir.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-- title: "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
deleted file mode 100644
index 4b203b61649..00000000000
--- a/data/removals/15_0/15-0-database-deprecate-legacy-database-conf.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-- title: "Support for legacy format of `config/database.yml`"
- 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
deleted file mode 100644
index 8576b1e0deb..00000000000
--- a/data/removals/15_0/15-0-dependency-scanning-default-java-version.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-- title: "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
deleted file mode 100644
index 1ffd3a4b78e..00000000000
--- a/data/removals/15_0/15-0-dependency-scanning-python-image.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-- title: "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
deleted file mode 100644
index a1cbed6366b..00000000000
--- a/data/removals/15_0/15-0-ds-default-analyzers.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-- title: "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
deleted file mode 100644
index 66d50a7ba67..00000000000
--- a/data/removals/15_0/15-0-geo-remove-db-rake-tasks.yml
+++ /dev/null
@@ -1,31 +0,0 @@
-- title: "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
deleted file mode 100644
index 73459b04515..00000000000
--- a/data/removals/15_0/15-0-geo-remove-promote-db.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-- title: "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
deleted file mode 100644
index 38e1a87104f..00000000000
--- a/data/removals/15_0/15-0-geo-remove-promote-to-primary-node.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-- title: "`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
deleted file mode 100644
index 509d034263c..00000000000
--- a/data/removals/15_0/15-0-gitaly-internal-socket-dir.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-- title: "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
deleted file mode 100644
index 74fd72d5d2d..00000000000
--- a/data/removals/15_0/15-0-managed-cluster-applications.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-- title: "`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-merge-commit-message.yml b/data/removals/15_0/15-0-merge-commit-message.yml
deleted file mode 100644
index 5e2f82f1fa0..00000000000
--- a/data/removals/15_0/15-0-merge-commit-message.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-- title: "`defaultMergeCommitMessageWithDescription` GraphQL API field"
- 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 # (required) Change to true if this removal is a breaking change.
- reporter: phikai # (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/345451 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- The GraphQL API field `defaultMergeCommitMessageWithDescription` has been 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.
- 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/api/graphql/removed_items.html#graphql-types # (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-implicit-grant.yml b/data/removals/15_0/15-0-oauth-implicit-grant.yml
deleted file mode 100644
index 73e4fdae0f5..00000000000
--- a/data/removals/15_0/15-0-oauth-implicit-grant.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-- title: "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
deleted file mode 100644
index 54f60cc64d2..00000000000
--- a/data/removals/15_0/15-0-oauth-tokens-no-expiry.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-- title: "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
deleted file mode 100644
index cf8e9b8ea50..00000000000
--- a/data/removals/15_0/15-0-omniauth-kerberos-gem.yml
+++ /dev/null
@@ -1,21 +0,0 @@
-- title: "`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
deleted file mode 100644
index 0adba1afa0b..00000000000
--- a/data/removals/15_0/15-0-package-container-registry-group-api.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-- title: "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
deleted file mode 100644
index 0c649439459..00000000000
--- a/data/removals/15_0/15-0-package-settings-permissions.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-- title: "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
deleted file mode 100644
index d25eda37612..00000000000
--- a/data/removals/15_0/15-0-praefect-database-no-proxy.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-- title: "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
deleted file mode 100644
index 2b37a324001..00000000000
--- a/data/removals/15_0/15-0-praefect-virtual-storage.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-- title: "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
deleted file mode 100644
index bdf509dba33..00000000000
--- a/data/removals/15_0/15-0-protect-cns-chs.yml
+++ /dev/null
@@ -1,21 +0,0 @@
-- title: "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
deleted file mode 100644
index dc448f3fb54..00000000000
--- a/data/removals/15_0/15-0-protect-vulnerability-check.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-- title: "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
deleted file mode 100644
index 6f5eb4804d7..00000000000
--- a/data/removals/15_0/15-0-removal-artifacts-keyword.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-- title: "`artifacts:reports:cobertura` keyword"
- announcement_milestone: "14.7"
- announcement_date: "2022-02-22"
- removal_milestone: "15.0"
- removal_date: "2022-05-22"
- breaking_change: true
- body: |
- As of GitLab 15.0, the [`artifacts:reports:cobertura`](https://docs.gitlab.com/ee/ci/yaml/artifacts_reports.html#artifactsreportscobertura-removed)
- keyword has been [replaced](https://gitlab.com/gitlab-org/gitlab/-/issues/344533) by
- [`artifacts:reports:coverage_report`](https://docs.gitlab.com/ee/ci/yaml/artifacts_reports.html#artifactsreportscoverage_report).
- Cobertura is the only supported report file, but this is the first step towards GitLab supporting other report types.
-
-# 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
deleted file mode 100644
index 67dd7aed8ce..00000000000
--- a/data/removals/15_0/15-0-removal-testcoveragesetting.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-- title: "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
deleted file mode 100644
index 223e967073b..00000000000
--- a/data/removals/15_0/15-0-remove-background-upload-object-storage.yml
+++ /dev/null
@@ -1,52 +0,0 @@
-- title: "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.
- By default [direct upload](https://docs.gitlab.com/ee/development/uploads/index.html#direct-upload) will be used.
-
- This impacts a subset of object storage providers, including but not limited to:
-
- - **OpenStack** Customers using OpenStack need to change their configuration to use the S3 API instead of Swift.
- - **RackSpace** Customers using RackSpace-based object storage need to migrate data to a different provider.
-
- If your object storage provider does not support `background_upload`, please [migrate objects to a supported object storage provider](https://docs.gitlab.com/ee/administration/object_storage.html#migrate-objects-to-a-different-object-storage-provider).
-
- #### Encrypted S3 buckets
-
- Additionally, this also breaks the use of [encrypted S3 buckets](https://docs.gitlab.com/ee/administration/object_storage.html#encrypted-s3-buckets) with [storage-specific configuration form](https://docs.gitlab.com/ee/administration/object_storage.html#configure-each-object-type-to-define-its-own-storage-connection-storage-specific-form).
-
- If your S3 buckets have [SSE-S3 or SSE-KMS encryption enabled](https://docs.aws.amazon.com/kms/latest/developerguide/services-s3.html), please [migrate your configuration to use consolidated object storage form](https://docs.gitlab.com/ee/administration/object_storage.html#transition-to-consolidated-form) before upgrading to GitLab 15.0. Otherwise, you may start getting `ETag mismatch` errors during objects upload.
-
- #### 403 errors
-
- If you see 403 errors when uploading to object storage after
- upgrading to GitLab 15.0, check that the [correct permissions](https://docs.gitlab.com/ee/administration/object_storage.html#iam-permissions)
- are assigned to the bucket. Direct upload needs the ability to delete an
- object (example: `s3:DeleteObject`), but background uploads do not.
-
- #### `remote_directory` with a path prefix
-
- If the object storage `remote_directory` configuration contains a slash (`/`) after the bucket (example: `gitlab/uploads`), be aware that this [was never officially supported](https://gitlab.com/gitlab-org/gitlab/-/issues/292958).
- Some users found that they could specify a path prefix to the bucket. In direct upload mode, object storage uploads will fail if a slash is present in GitLab 15.0.
-
- If you have set a prefix, you can use a workaround to revert to background uploads:
-
- 1. Continue to use [storage-specific configuration](https://docs.gitlab.com/ee/administration/object_storage.html#configure-each-object-type-to-define-its-own-storage-connection-storage-specific-form).
- 1. In Omnibus GitLab, set the `GITLAB_LEGACY_BACKGROUND_UPLOADS` to re-enable background uploads:
-
- ```ruby
- gitlab_rails['env'] = { 'GITLAB_LEGACY_BACKGROUND_UPLOADS' => 'artifacts,external_diffs,lfs,uploads,packages,dependency_proxy,terraform_state,pages' }
- ```
-
- Support for prefixes was restored in GitLab 15.2 via [this MR](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91307).
- Support for setting `GITLAB_LEGACY_BACKGROUND_UPLOADS` will be removed in GitLab 15.4.
-
- 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
deleted file mode 100644
index f8f1cd62966..00000000000
--- a/data/removals/15_0/15-0-remove-dependency-proxy-feature-flag.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-- title: "`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
deleted file mode 100644
index 59775a66534..00000000000
--- a/data/removals/15_0/15-0-remove-replicaiton-detail-routes.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-- title: "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
deleted file mode 100644
index 0e1155d3067..00000000000
--- a/data/removals/15_0/15-0-remove-versions-packagetype.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-- title: "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
deleted file mode 100644
index 4dd658eb195..00000000000
--- a/data/removals/15_0/15-0-remove_ff_push_rules_supersede_code_owners.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-- title: "`push_rules_supersede_code_owners` feature flag" # 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 `push_rules_supersede_code_owners` feature flag has been removed in GitLab 15.0. From now on, push rules will supersede the `CODEOWNERS` file. Even if Code Owner approval is required, a push rule that explicitly allows a specific user to push code supersedes the Code Owners setting.
-# 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
deleted file mode 100644
index 16f4f09e1c1..00000000000
--- a/data/removals/15_0/15-0-request-profiling.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-- title: "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/index.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
deleted file mode 100644
index 32de20469bf..00000000000
--- a/data/removals/15_0/15-0-runner-api-status-renames-not_connected.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-- title: "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
deleted file mode 100644
index a8ec1080766..00000000000
--- a/data/removals/15_0/15-0-runner-disable-strict-host-key-check.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-- title: "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
deleted file mode 100644
index 1d4c79bc40e..00000000000
--- a/data/removals/15_0/15-0-runner_api_new_stale_status_breaking_change.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-- title: "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.
- The Runner [API](https://docs.gitlab.com/ee/api/runners.html#runners-api) endpoints have changed in 15.0.
-
- If a runner has not contacted the GitLab instance in more than three months, the API returns `stale` instead of `offline` or `not_connected`.
- The `stale` status was introduced in 14.6.
-
- The `not_connected` status is no longer valid. It was replaced with `never_contacted`. Available statuses are `online`, `offline`, `stale`, and `never_contacted`.
- 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
deleted file mode 100644
index 8c1bf5dfcae..00000000000
--- a/data/removals/15_0/15-0-sast-dotnet-21.yml
+++ /dev/null
@@ -1,33 +0,0 @@
-- title: "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
deleted file mode 100644
index 1a636cf15e3..00000000000
--- a/data/removals/15_0/15-0-sast-spotbugs-java-8.yml
+++ /dev/null
@@ -1,28 +0,0 @@
-- title: "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
deleted file mode 100644
index 1bdecd49118..00000000000
--- a/data/removals/15_0/15-0-secret-detection-configurations.yml
+++ /dev/null
@@ -1,30 +0,0 @@
-- title: "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
deleted file mode 100644
index ed517e6808c..00000000000
--- a/data/removals/15_0/15-0-serverless.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-- title: "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
deleted file mode 100644
index efe8636143f..00000000000
--- a/data/removals/15_0/15-0-sidekiq-metrics-health-check-config.yml
+++ /dev/null
@@ -1,24 +0,0 @@
-- title: "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
deleted file mode 100644
index 5ea43041734..00000000000
--- a/data/removals/15_0/15-0-static-site-editor.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-- title: "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/web_ide/index.html) 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/web_ide/index.html
- 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
deleted file mode 100644
index fdda6d8faaf..00000000000
--- a/data/removals/15_0/15-0-tracing.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-- title: "Jaeger integration" # 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
deleted file mode 100644
index 184bd6fb2e6..00000000000
--- a/data/removals/15_0/15-0-type.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-- title: "`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
deleted file mode 100644
index 5db77a90b78..00000000000
--- a/data/removals/15_0/15_0-logging.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-- title: "ELK stack logging" # 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
deleted file mode 100644
index e826943f7f1..00000000000
--- a/data/removals/15_0/15_0-remove-pipelines-from-version-field.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-- title: "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
deleted file mode 100644
index 4a9105bf63d..00000000000
--- a/data/removals/15_0/removal-manage-premium-required-pipelines.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-- title: "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_optional_pat_expiration.yml b/data/removals/15_0/removal_manage_optional_pat_expiration.yml
deleted file mode 100644
index e1e6a125186..00000000000
--- a/data/removals/15_0/removal_manage_optional_pat_expiration.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-- title: "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_repository_push_audit_event.yml b/data/removals/15_0/removal_manage_repository_push_audit_event.yml
deleted file mode 100644
index c1c47823325..00000000000
--- a/data/removals/15_0/removal_manage_repository_push_audit_event.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-- title: "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_ssh_expiration.yml b/data/removals/15_0/removal_manage_ssh_expiration.yml
deleted file mode 100644
index 889d79c8a29..00000000000
--- a/data/removals/15_0/removal_manage_ssh_expiration.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-- title: "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
deleted file mode 100644
index b5e63812d7c..00000000000
--- a/data/removals/15_0/removal_manage_status_check_passed_status.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-- title: "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/15_10/15_10-non-public-artifacts.yml b/data/removals/15_10/15_10-non-public-artifacts.yml
deleted file mode 100644
index 4a21cf8b612..00000000000
--- a/data/removals/15_10/15_10-non-public-artifacts.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-#
-# REQUIRED FIELDS
-#
-- title: "`artifacts:public` CI/CD keyword refactored" # (required) Clearly explain the change. For example, "The `confidential` field for a `Note` is removed" or "CI/CD job names are limited to 250 characters."
- announcement_milestone: "15.10" # (required) The milestone when this feature was deprecated.
- announcement_date: "2023-03-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.8" # (required) The milestone when this feature is being removed.
- removal_date: "2023-01-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: true # (required) Change to false if this is not a breaking change.
- reporter: jocelynjane # (required) GitLab username of the person reporting the removal
- stage: Verify # (required) String value of the stage that the feature was created in. e.g., Growth
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/322454 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- The [`artifacts:public` CI/CD keyword](https://docs.gitlab.com/ee/ci/yaml/#artifactspublic) was discovered to be not working properly since GitLab 15.8 and needed to be refactored. This feature is disabled on GitLab.com, and disabled by default on self-managed instances. If an administrator for an instance running GitLab 15.8 or 15.9 enabled this feature via the `non_public_artifacts` feature flag, it is likely that artifacts created with the `public:false` setting are being treated as `public:true`.
-
- If you have projects that use this setting, you should delete artifacts that must not be public, or [change the visibility](https://docs.gitlab.com/ee/user/public_access.html#change-project-visibility) of affected projects to private, before updating to GitLab 15.8 or later.
-
- In GitLab 15.10, this feature's code was refactored. On instances with this feature enabled, new artifacts created with `public:false` are now working as expected, though still disabled by default. Avoid testing this feature with production data until it is enabled by default and made generally available.
-#
-# OPTIONAL FIELDS
-#
- 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]
- documentation_url: https://docs.gitlab.com/ee/ci/yaml/#artifactspublic # (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_11/15-11-opensuse-15-3.yml b/data/removals/15_11/15-11-opensuse-15-3.yml
deleted file mode 100644
index 53dc0f050e2..00000000000
--- a/data/removals/15_11/15-11-opensuse-15-3.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-- title: "openSUSE Leap 15.3 packages" # (required) Clearly explain the change, or planned change. For example, "The `confidential` field for a `Note` is deprecated" or "CI/CD job names will be limited to 250 characters."
- announcement_milestone: "15.8" # (required) The milestone when this feature was first announced as deprecated.
- removal_milestone: "15.11" # (required) The milestone when this feature is planned to be removed
- breaking_change: false # (required) Change to false if this is not a breaking change.
- reporter: twk3 # (required) GitLab username of the person reporting the change
- stage: distribution # (required) String value of the stage that the feature was created in. e.g., Growth
- issue_url: https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/7371 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- Distribution support and security updates for openSUSE Leap 15.3 [ended December 2022](https://en.opensuse.org/Lifetime#Discontinued_distributions).
-
- Starting in GitLab 15.7 we started providing packages for openSUSE Leap 15.4, and in GitLab 15.11 we stopped providing packages for openSUSE Leap 15.3.
-
- To continue using GitLab, [upgrade](https://en.opensuse.org/SDB:System_upgrade) to openSUSE Leap 15.4.
- documentation_url: https://docs.gitlab.com/ee/administration/package_information/supported_os.html
diff --git a/data/removals/15_11/15-11-project-export-import-ndjson.yml b/data/removals/15_11/15-11-project-export-import-ndjson.yml
deleted file mode 100644
index 2a098f7e9f3..00000000000
--- a/data/removals/15_11/15-11-project-export-import-ndjson.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-- title: "Exporting and importing projects in JSON format not supported"
- announcement_milestone: "15.10"
- announcement_date: "2023-04-22"
- removal_milestone: "15.11"
- removal_date: "2023-04-22"
- breaking_change: false
- reporter: wortschi
- stage: manage
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/389888
- body: |
- GitLab previously created project file exports in JSON format. In GitLab 12.10, NDJSON was added as the preferred format.
-
- To support transitions, importing JSON-formatted project file exports was still possible if you configured the
- relevant feature flags.
-
- From GitLab 15.11, importing a JSON-formatted project file exports is not supported.
diff --git a/data/removals/15_2/removal-outdated-browser-support.yml b/data/removals/15_2/removal-outdated-browser-support.yml
deleted file mode 100644
index bbe6892a5f5..00000000000
--- a/data/removals/15_2/removal-outdated-browser-support.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-- title: "Support for older browsers"
- removal_date: July 22, 2022
- removal_milestone: "15.2"
- reporter: leipert
- breaking_change: false
- body: |
- In GitLab 15.2, we are cleaning up and [removing old code](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86003) that was specific for browsers that we no longer support. This has no impact on users if they use one of our [supported web browsers](https://docs.gitlab.com/ee/install/requirements.html#supported-web-browsers).
-
- Most notably, support for the following browsers has been removed:
-
- - Apple Safari 14 and older.
- - Mozilla Firefox 78.
-
- The minimum supported browser versions are:
-
- - Apple Safari 14.1.
- - Mozilla Firefox 91.
- - Google Chrome 92.
- - Chromium 92.
- - Microsoft Edge 92.
diff --git a/data/removals/15_3/15-3-vulnerability-report-state-sort.yml b/data/removals/15_3/15-3-vulnerability-report-state-sort.yml
deleted file mode 100644
index a9c84827b7c..00000000000
--- a/data/removals/15_3/15-3-vulnerability-report-state-sort.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-#
-# REQUIRED FIELDS
-#
-- title: "Vulnerability Report sort by State" # (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: "15.0" # (required) The milestone when this feature was deprecated.
- announcement_date: "2022-05-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.3" # (required) The milestone when this feature is being removed.
- removal_date: "2022-08-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: matt_wilson # (required) GitLab username of the person reporting the removal
- 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 is instead removed in 15.3 to simplify the codebase and prevent any unwanted performance degradation.
-#
-# OPTIONAL FIELDS
-#
- end_of_support_milestone: # (optional) Use "XX.YY" format. The milestone when support for this feature will end.
- end_of_support_date: # (optional) The date of the milestone release when support for this feature will end.
- tiers: # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
- documentation_url: # (optional) This is a link to the current documentation page
- image_url: # (optional) This is a link to a thumbnail image depicting the feature
- video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg
diff --git a/data/removals/15_3/15-3-vulnerability-report-tool-sort.yml b/data/removals/15_3/15-3-vulnerability-report-tool-sort.yml
deleted file mode 100644
index 6743a43d4b3..00000000000
--- a/data/removals/15_3/15-3-vulnerability-report-tool-sort.yml
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# REQUIRED FIELDS
-#
-- title: "Vulnerability Report sort by Tool" # (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: "15.1" # (required) The milestone when this feature was deprecated.
- announcement_date: "2022-06-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.3" # (required) The milestone when this feature is being removed.
- removal_date: "2022-08-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: matt_wilson # (required) GitLab username of the person reporting the removal
- 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/363138 # (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 `Tool` column (scan type) 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 `Tool` column for sorting, the feature flag is instead removed in
- GitLab 15.3 to simplify the codebase and prevent any unwanted performance degradation.
-#
-# OPTIONAL FIELDS
-#
- end_of_support_milestone: # (optional) Use "XX.YY" format. The milestone when support for this feature will end.
- end_of_support_date: # (optional) The date of the milestone release when support for this feature will end.
- tiers: # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
- documentation_url: # (optional) This is a link to the current documentation page
- image_url: # (optional) This is a link to a thumbnail image depicting the feature
- video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg
diff --git a/data/removals/15_3/removal_debian9.yml b/data/removals/15_3/removal_debian9.yml
deleted file mode 100644
index eca198d6b18..00000000000
--- a/data/removals/15_3/removal_debian9.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-- title: "Support for Debian 9"
- removal_date: Aug 22, 2022 # day the removal was released
- removal_milestone: "15.3"
- reporter: dorrino # GitLab username of the person reporting the removal
- body: |
- Long term service and support (LTSS) for [Debian 9 Stretch ended 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.
diff --git a/data/removals/15_4/15-4-sast-analyzer-consolidation.yml b/data/removals/15_4/15-4-sast-analyzer-consolidation.yml
deleted file mode 100644
index 61358d3653b..00000000000
--- a/data/removals/15_4/15-4-sast-analyzer-consolidation.yml
+++ /dev/null
@@ -1,30 +0,0 @@
-- title: "SAST analyzer consolidation and CI/CD template changes"
- announcement_milestone: "14.8"
- announcement_date: "2022-02-22"
- removal_milestone: "15.4"
- removal_date: "2022-09-22"
- breaking_change: true
- reporter: connorgilbert
- stage: Secure
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/352554
- body: | # (required) Do not modify this line, instead modify the lines below.
- We have replaced the GitLab SAST [analyzers](https://docs.gitlab.com/ee/user/application_security/sast/analyzers/) for certain languages in GitLab 15.4 as part of our long-term strategy to deliver a more consistent user experience, faster scan times, and reduced CI minute usage.
-
- Starting from GitLab 15.4, the [GitLab-managed SAST CI/CD template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml) uses [Semgrep-based scanning](https://docs.gitlab.com/ee/user/application_security/sast/analyzers.html#transition-to-semgrep-based-scanning) instead of the following analyzers:
-
- - [ESLint](https://gitlab.com/gitlab-org/security-products/analyzers/eslint) for JavaScript, TypeScript, React
- - [Gosec](https://gitlab.com/gitlab-org/security-products/analyzers/gosec) for Go
- - [Bandit](https://gitlab.com/gitlab-org/security-products/analyzers/bandit) for Python
- - [SpotBugs](https://gitlab.com/gitlab-org/security-products/analyzers/spotbugs) for Java
-
- We will no longer make any updates to the ESLint-, Gosec-, and Bandit-based analyzers.
- The SpotBugs-based analyzer will continue to be used for Groovy, Kotlin, and Scala scanning.
-
- We won't delete container images previously published for these analyzers, so older versions of the CI/CD template will continue to work.
-
- If you changed the default GitLab SAST configuration, you may need to update your configuration as detailed in the [deprecation issue for this change](https://gitlab.com/gitlab-org/gitlab/-/issues/352554#actions-required).
-# 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/analyzers.html#transition-to-semgrep-based-scanning # (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_6/15-6-nfs-git-repository-storage.yml b/data/removals/15_6/15-6-nfs-git-repository-storage.yml
deleted file mode 100644
index 95d9298fa4f..00000000000
--- a/data/removals/15_6/15-6-nfs-git-repository-storage.yml
+++ /dev/null
@@ -1,32 +0,0 @@
-- title: "NFS as Git repository storage is no longer supported"
- announcement_milestone: "14.0"
- announcement_date: "2021-06-22"
- removal_milestone: "15.6"
- removal_date: "2022-11-22"
- breaking_change: false
- reporter: mjwood
- stage: create
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/351243
- body: |
- As of November 22, 2022, we have removed support for customers using NFS for Git repository storage. This was
- originally planned for May 22, 2022, but in an effort to allow continued maturity of Gitaly Cluster, we delayed
- our removal of support date until now. Please see our official [Statement of Support](https://about.gitlab.com/support/statement-of-support/#gitaly-and-nfs)
- for further information.
-
- This change in support follows the development deprecation for NFS for Git repository storage that occurred in GitLab 14.0.
-
- Gitaly Cluster offers tremendous benefits for our customers such as:
-
- - [Variable replication factors](https://docs.gitlab.com/ee/administration/gitaly/index.html#replication-factor).
- - [Strong consistency](https://docs.gitlab.com/ee/administration/gitaly/index.html#strong-consistency).
- - [Distributed read capabilities](https://docs.gitlab.com/ee/administration/gitaly/index.html#distributed-reads).
-
- We encourage customers currently using NFS for Git repositories to migrate as soon as possible by reviewing our documentation on
- [migrating to Gitaly Cluster](https://docs.gitlab.com/ee/administration/gitaly/index.html#migrate-to-gitaly-cluster).
-#
-# OPTIONAL FIELDS
-#
- tiers: # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
- documentation_url: # (optional) This is a link to the current documentation page
- image_url: # (optional) This is a link to a thumbnail image depicting the feature
- video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg
diff --git a/data/removals/15_7/15-7-remove-expansion-file-type-variables-ci-pipeline.yml b/data/removals/15_7/15-7-remove-expansion-file-type-variables-ci-pipeline.yml
deleted file mode 100644
index 018f66a19ce..00000000000
--- a/data/removals/15_7/15-7-remove-expansion-file-type-variables-ci-pipeline.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-- title: "File Type variable expansion in `.gitlab-ci.yml`" # (required) The name of the feature to be deprecated
- announcement_milestone: "15.5" # (required) The milestone when this feature was first announced as deprecated.
- removal_milestone: "15.7" # (required) The milestone when this feature is planned to be removed
- removal_date: "2022-12-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: true # (required) If this deprecation is a breaking change, set this value to true
- reporter: DarrenEastman # (required) GitLab username of the person reporting the deprecation
- stage: Verify # (required) String value of the stage that the feature was created in. e.g., Growth
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/29407 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- Prior to this change, variables that referenced or applied alias file variables expanded the value of the `File` type variable. For example, the file contents. This behavior was incorrect because it did not comply with typical shell variable expansion rules. A user could run an $echo command with the variable as an input parameter to leak secrets or sensitive information stored in 'File' type variables.
-
- In 15.7, we are removing file type variable expansion from GitLab. It is essential to check your CI pipelines to confirm if your scripts reference a file variable. If your CI job relies on the previous expansion functionality, that CI job will not work and generate an error as of 15.7. The new behavior is that variable expansion that reference or apply alias file variables expand to the file name or path of the `File` type variable, instead of its value, such as the file contents.
-
-
- # OPTIONAL FIELDS
- #
- tiers: # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
- documentation_url: # (optional) This is a link to the current documentation page
- image_url: # (optional) This is a link to a thumbnail image depicting the feature
- video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg
diff --git a/data/removals/15_7/15-7-remove-flowdock-integration.yml b/data/removals/15_7/15-7-remove-flowdock-integration.yml
deleted file mode 100644
index 46f8ed6bdf9..00000000000
--- a/data/removals/15_7/15-7-remove-flowdock-integration.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-- title: "Flowdock integration" # (required) Actionable title. e.g., The `confidential` field for a `Note` is deprecated. Use `internal` instead.
- announcement_milestone: "15.7" # (required) The milestone when this feature was deprecated.
- announcement_date: "2022-12-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.7" # (required) The milestone when this feature is being removed.
- removal_date: "2022-12-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: arturoherrero # (required) GitLab username of the person reporting the removal
- stage: manage # (required) String value of the stage that the feature was created in. e.g., Growth
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/379197 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- As of December 22, 2022, we are removing the Flowdock integration because the service was shut down on August 15, 2022.
-#
-# OPTIONAL FIELDS
-#
- tiers: # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
- documentation_url: # (optional) This is a link to the current documentation page
- image_url: # (optional) This is a link to a thumbnail image depicting the feature
- video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg
diff --git a/data/removals/15_8/15-8-auto-deploy-helm-chart-cilium-policy.yml b/data/removals/15_8/15-8-auto-deploy-helm-chart-cilium-policy.yml
deleted file mode 100644
index 40f7a57b6ec..00000000000
--- a/data/removals/15_8/15-8-auto-deploy-helm-chart-cilium-policy.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-- title: "CiliumNetworkPolicy within the auto deploy Helm chart is removed" # (required) Actionable title. e.g., The `confidential` field for a `Note` is deprecated. Use `internal` instead.
- 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
- removal_milestone: "15.8" # The milestone when this feature is planned to be removed
- removal_date: "2023-01-22" # (optional - may be required in the future) YYYY-MM-DD format - the date of the milestone release when this feature is planned to be removed
- breaking_change: false # (required) Change to true if this removal is a breaking change.
- reporter: sam.white # (required) GitLab username of the person reporting the removal
- stage: govern # (required) String value of the stage that the feature was created in. e.g., Growth
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/382044
- body: | # (required) Do not modify this line, instead modify the lines below.
- All functionality related to the GitLab Container Network Security and Container Host Security categories was deprecated in GitLab 14.8 and scheduled for removal in GitLab 15.0. The [CiliumNetworkPolicy definition](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/blob/master/assets/auto-deploy-app/values.yaml#L175) that exists as part of the [GitLab Auto Deploy Helm chart](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/tree/master/assets/auto-deploy-app) was not removed as scheduled in GitLab 15.0. This policy is planned to be removed in the GitLab 15.8 release.
-
- If you want to preserve this functionality, you can follow one of these two paths:
-
- 1. Fork the [GitLab Auto Deploy Helm chart](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/tree/master/assets/auto-deploy-app) into the `chart/` path within your project
- 1. Set `AUTO_DEPLOY_IMAGE_VERSION` and `DAST_AUTO_DEPLOY_IMAGE_VERSION` to the most recent version of the image that included the CiliumNetworkPolicy
diff --git a/data/removals/15_8/15-8-group-export-import-ndjson.yml b/data/removals/15_8/15-8-group-export-import-ndjson.yml
deleted file mode 100644
index 58e37dff63b..00000000000
--- a/data/removals/15_8/15-8-group-export-import-ndjson.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-- title: "Exporting and importing groups in JSON format not supported"
- announcement_milestone: "15.10"
- announcement_date: "2023-04-22"
- removal_milestone: "15.8"
- removal_date: "2023-04-22"
- breaking_change: false
- reporter: wortschi
- stage: manage
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/389888
- body: |
- GitLab previously created group file exports in JSON format. In GitLab 13.10, NDJSON was added as the preferred format.
-
- To support transitions, importing JSON-formatted group file exports was still possible if you configured the
- relevant feature flags.
-
- From GitLab 15.8, importing a JSON-formatted group file exports is not supported.
diff --git a/data/removals/15_9/15-9-live-preview.yml b/data/removals/15_9/15-9-live-preview.yml
deleted file mode 100644
index 139d7829d72..00000000000
--- a/data/removals/15_9/15-9-live-preview.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-- title: "Live Preview no longer available in the Web IDE" # (required) Clearly explain the change. For example, "The `confidential` field for a `Note` is removed" or "CI/CD job names are limited to 250 characters."
- announcement_milestone: "15.8" # (required) The milestone when this feature was deprecated.
- announcement_date: "2023-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.9" # (required) The milestone when this feature is being removed.
- removal_date: "2023-02-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: true # (required) Change to false if this is not 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/383889 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- The Live Preview feature of the Web IDE was intended to provide a client-side preview of static web applications. However, complex configuration steps and a narrow set of supported project types have limited its utility. With the introduction of the Web IDE Beta in GitLab 15.7, you can now connect to a full server-side runtime environment. With upcoming support for installing extensions in the Web IDE, we’ll also support more advanced workflows than those available with Live Preview. As of GitLab 15.9, Live Preview is no longer available in the Web IDE.
diff --git a/data/removals/15_9/15-9-omniauth-authentiq.yml b/data/removals/15_9/15-9-omniauth-authentiq.yml
deleted file mode 100644
index 2a2e2601704..00000000000
--- a/data/removals/15_9/15-9-omniauth-authentiq.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-- title: "`omniauth-authentiq` gem no longer available" # (required) Clearly explain the change. For example, "The `confidential` field for a `Note` is removed" or "CI/CD job names are limited to 250 characters."
- announcement_milestone: "15.9" # (required) The milestone when this feature was deprecated.
- announcement_date: "2023-02-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.9" # (required) The milestone when this feature is being removed.
- removal_date: "2023-02-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: true # (required) Change to false if this is not a breaking change.
- reporter: adil.farrukh # (required) GitLab username of the person reporting the removal
- stage: manage # (required) String value of the stage that the feature was created in. e.g., Growth
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/389452 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- `omniauth-authentiq` is an OmniAuth strategy gem that was part of GitLab. The company providing authentication services, Authentiq, has shut down. Therefore the gem is being removed.
diff --git a/data/removals/15_9/15-9-omniauth-shibboleth.yml b/data/removals/15_9/15-9-omniauth-shibboleth.yml
deleted file mode 100644
index a3923211244..00000000000
--- a/data/removals/15_9/15-9-omniauth-shibboleth.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-- title: "`omniauth-shibboleth` gem no longer available" # (required) Clearly explain the change. For example, "The `confidential` field for a `Note` is removed" or "CI/CD job names are limited to 250 characters."
- announcement_milestone: "10.0" # (required) The milestone when this feature was deprecated.
- announcement_date: "2017-09-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.9" # (required) The milestone when this feature is being removed.
- removal_date: "2023-02-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: true # (required) Change to false if this is not a breaking change.
- reporter: adil.farrukh # (required) GitLab username of the person reporting the removal
- stage: manage # (required) String value of the stage that the feature was created in. e.g., Growth
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/388959 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- `omniauth-shibboleth` is an OmniAuth strategy gem that was part of GitLab. The gem has not received security updates and does not meet GitLab quality guidance criteria. This gem was originally scheduled for removal by 14.1, but it was not removed at that time. The gem is being removed now. In GitLab 16.1 or later, use the `omniauth-shibboleth-redux` gem instead.
diff --git a/data/removals/16_0/16-0-PipelineSecurityReportFinding-name-GraphQL-field.yml b/data/removals/16_0/16-0-PipelineSecurityReportFinding-name-GraphQL-field.yml
deleted file mode 100644
index 8d535040686..00000000000
--- a/data/removals/16_0/16-0-PipelineSecurityReportFinding-name-GraphQL-field.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-- title: "PipelineSecurityReportFinding name GraphQL field"
- announcement_milestone: "15.1"
- removal_milestone: "16.0"
- breaking_change: true
- reporter: abellucci
- stage: Govern
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/346335
- body: |
- Previously, the [PipelineSecurityReportFinding GraphQL type was updated](https://gitlab.com/gitlab-org/gitlab/-/issues/335372) to include a new `title` field. This field is an alias for the current `name` field, making the less specific `name` field redundant. The `name` field is removed from the PipelineSecurityReportFinding type in GitLab 16.0.
- tiers: [Ultimate]
diff --git a/data/removals/16_0/16-0-Security-report-schemas-version-14.yml b/data/removals/16_0/16-0-Security-report-schemas-version-14.yml
deleted file mode 100644
index 14d5dd7acd2..00000000000
--- a/data/removals/16_0/16-0-Security-report-schemas-version-14.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-- title: "Security report schemas version 14.x.x"
- announcement_milestone: "15.3"
- removal_milestone: "16.0"
- breaking_change: true
- reporter: abellucci
- stage: Govern
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/366477
- body: |
- Version 14.x.x [security report schemas](https://gitlab.com/gitlab-org/security-products/security-report-schemas) have been removed.
- Security reports that use schema version 14.x.x will cause an error in the pipeline's **Security** tab. For more information, refer to [security report validation](https://docs.gitlab.com/ee/user/application_security/#security-report-validation).
- tiers: [Ultimate]
diff --git a/data/removals/16_0/16-0-api-lint-removal.yml b/data/removals/16_0/16-0-api-lint-removal.yml
deleted file mode 100644
index 86e3f70a4bf..00000000000
--- a/data/removals/16_0/16-0-api-lint-removal.yml
+++ /dev/null
@@ -1,41 +0,0 @@
-# This is a template for a feature deprecation.
-#
-# Please refer to the deprecation guidelines to confirm your understanding of the
-# definitions for "Deprecation", "End of Support", and "Removal":
-# https://docs.gitlab.com/ee/development/deprecation_guidelines/#terminology
-#
-# Deprecations must be announced at least three releases prior to removal.
-# See the OPTIONAL END OF SUPPORT FIELDS section below if an End of Support period also applies.
-#
-# Breaking changes must happen in a major release.
-#
-# For more information please refer to the handbook documentation here:
-# https://about.gitlab.com/handbook/marketing/blog/release-posts/#deprecations
-#
-# Please delete this line and above before submitting your merge request.
-#
-# REQUIRED FIELDS
-#
-- title: "`POST ci/lint` API endpoint removed" # (required) The name of the feature to be deprecated
- announcement_milestone: "15.7" # (required) The milestone when this feature was first announced as deprecated.
- removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
- breaking_change: true # (required) If this deprecation is a breaking change, set this value to true
- reporter: dhershkovitch # (required) GitLab username of the person reporting the deprecation
- stage: verify # (required) String value of the stage that the feature was created in. e.g., Growth
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/381669 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- The `POST ci/lint` API endpoint was deprecated in 15.7, and removed in 16.0. This endpoint did not validate the full range of CI/CD configuration options. Instead, use [`POST /projects/:id/ci/lint`](https://docs.gitlab.com/ee/api/lint.html#validate-a-ci-yaml-configuration-with-a-namespace), which properly validates CI/CD configuration.
-#
-# OPTIONAL END OF SUPPORT FIELDS
-#
-# If an End of Support period applies, the announcement should be shared with GitLab Support
-# in the `#spt_managers` channel in Slack, and mention `@gitlab-com/support` in this MR.
-#
- end_of_support_milestone: # (optional) Use "XX.YY" format. The milestone when support for this feature will end.
- #
- # OTHER OPTIONAL FIELDS
- #
- tiers: # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
- documentation_url: # (optional) This is a link to the current documentation page
- image_url: # (optional) This is a link to a thumbnail image depicting the feature
- video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg
diff --git a/data/removals/16_0/16-0-auto-deploy-postgres-enabled.yml b/data/removals/16_0/16-0-auto-deploy-postgres-enabled.yml
deleted file mode 100644
index 97162dc56f1..00000000000
--- a/data/removals/16_0/16-0-auto-deploy-postgres-enabled.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-- title: "Auto DevOps no longer provisions a database by default"
- announcement_milestone: "15.8"
- removal_milestone: "16.0"
- breaking_change: true
- reporter: tigerwnz
- stage: Environments
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/343988
- body: |
- Currently, Auto DevOps provisions an in-cluster PostgreSQL database by default.
- In GitLab 16.0, databases will be provisioned only for users who opt in. This
- change supports production deployments that require more robust database management.
-
- If you want Auto DevOps to provision an in-cluster database,
- set the `POSTGRES_ENABLED` CI/CD variable to `true`.
- tiers: [Core, Premium, Ultimate]
- documentation_url: https://docs.gitlab.com/ee/topics/autodevops/stages.html#auto-deploy
diff --git a/data/removals/16_0/16-0-azure-storage-driver-registry.yml b/data/removals/16_0/16-0-azure-storage-driver-registry.yml
deleted file mode 100644
index 029d82a6c08..00000000000
--- a/data/removals/16_0/16-0-azure-storage-driver-registry.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-#
-- title: "Azure Storage Driver defaults to the correct root prefix" # (required) Clearly explain the change. For example, "The `confidential` field for a `Note` is removed" or "CI/CD job names are limited to 250 characters."
- announcement_milestone: "15.8" # (required) The milestone when this feature was deprecated.
- removal_milestone: "16.0" # (required) The milestone when this feature is being removed.
- breaking_change: true # (required) Change to false if this is not a breaking change.
- reporter: trizzi # (required) GitLab username of the person reporting the removal
- stage: Package # (required) String value of the stage that the feature was created in. e.g., Growth
- issue_url: https://gitlab.com/gitlab-org/container-registry/-/issues/854 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- The Azure Storage Driver used to write to `//` as the default root directory. This default root directory appeared in some places in the Azure UI as `/<no-name>/`. We maintained this legacy behavior to support older deployments using this storage driver. However, when moving to Azure from another storage driver, this behavior hides all your data until you configure the storage driver with `trimlegacyrootprefix: true` to build root paths without an extra leading slash.
-
- In GitLab 16.0, the new default configuration for the storage driver uses `trimlegacyrootprefix: true`, and `/` is the default root directory. You can set your configuration to `trimlegacyrootprefix: false` if needed, to revert to the previous behavior.
diff --git a/data/removals/16_0/16-0-cas3-authentication.yml b/data/removals/16_0/16-0-cas3-authentication.yml
deleted file mode 100644
index cd85f1bd38d..00000000000
--- a/data/removals/16_0/16-0-cas3-authentication.yml
+++ /dev/null
@@ -1,23 +0,0 @@
-# This is a template for announcing a feature removal or other important change.
-#
-# Please refer to the deprecation guidelines to confirm your understanding of GitLab's definitions.
-# https://docs.gitlab.com/ee/development/deprecation_guidelines/#terminology
-#
-# If this is a breaking change, it must happen in a major release.
-#
-# For more information please refer to the handbook documentation here:
-# https://about.gitlab.com/handbook/marketing/blog/release-posts/#deprecations-and-other-planned-breaking-change-announcements
-#
-# Please delete this line and above before submitting your merge request.
-#
-# REQUIRED FIELDS
-#
-- title: "CAS OmniAuth provider is removed" # (required) Clearly explain the change. For example, "The `confidential` field for a `Note` is removed" or "CI/CD job names are limited to 250 characters."
- announcement_milestone: "15.3" # (required) The milestone when this feature was deprecated.
- removal_milestone: "16.0" # (required) The milestone when this feature is being removed.
- breaking_change: true # (required) Change to false if this is not a breaking change.
- reporter: jessieay # (required) GitLab username of the person reporting the removal
- stage: Manage # (required) String value of the stage that the feature was created in. e.g., Growth
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/369127 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- The `omniauth-cas3` gem that provides GitLab with the CAS OmniAuth provider is being removed. You can no longer authenticate into a GitLab instance through CAS. This gem sees very little use. [The gem](https://rubygems.org/gems/omniauth-cas3/) has not had a new release in almost 5 years, which means that its dependencies are out of date and required manual patching during GitLab's [upgrade to OmniAuth 2.0](https://gitlab.com/gitlab-org/gitlab/-/issues/30073).
diff --git a/data/removals/16_0/16-0-ci-builds-column-validations.yml b/data/removals/16_0/16-0-ci-builds-column-validations.yml
deleted file mode 100644
index 7b8bf455ef0..00000000000
--- a/data/removals/16_0/16-0-ci-builds-column-validations.yml
+++ /dev/null
@@ -1,24 +0,0 @@
-- title: "Enforced validation of CI/CD parameter character lengths" # (required) Clearly explain the change. For example, "The `confidential` field for a `Note` is removed" or "CI/CD job names are limited to 250 characters."
- announcement_milestone: "15.9" # (required) The milestone when this feature was deprecated.
- removal_milestone: "16.0" # (required) The milestone when this feature is being removed.
- breaking_change: true # (required) Change to false if this is not a breaking change.
- reporter: jreporter # (required) GitLab username of the person reporting the removal
- stage: Verify # (required) String value of the stage that the feature was created in. e.g., Growth
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/372770 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- Previously, only CI/CD [job names](https://docs.gitlab.com/ee/ci/jobs/index.html#job-name-limitations) had a strict 255-character limit. Now, more CI/CD keywords are validated to ensure they stay under the limit.
-
- The following to 255 characters are now strictly limited to 255 characters:
-
- - The `stage` keyword.
- - The `ref` parameter, which is the Git branch or tag name for the pipeline.
- - The `description` and `target_url` parameters, used by external CI/CD integrations.
-
- Users on self-managed instances should update their pipelines to ensure they do not use parameters that exceed 255 characters. Users on GitLab.com do not need to make any changes, as these parameters are already limited in that database.
-
-# OPTIONAL FIELDS
-#
- tiers: # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
- documentation_url: # (optional) This is a link to the current documentation page
- image_url: # (optional) This is a link to a thumbnail image depicting the feature
- video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg
diff --git a/data/removals/16_0/16-0-ci-cd-settings-update-mutation-renamed.yml b/data/removals/16_0/16-0-ci-cd-settings-update-mutation-renamed.yml
deleted file mode 100644
index b506816a54b..00000000000
--- a/data/removals/16_0/16-0-ci-cd-settings-update-mutation-renamed.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-- title: "CiCdSettingsUpdate mutation renamed to ProjectCiCdSettingsUpdate"
- announcement_milestone: "15.0"
- removal_milestone: "16.0"
- 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/removals/16_0/16-0-conan-search-limited-to-project.yml b/data/removals/16_0/16-0-conan-search-limited-to-project.yml
deleted file mode 100644
index bf77ca38ba0..00000000000
--- a/data/removals/16_0/16-0-conan-search-limited-to-project.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-# REQUIRED FIELDS
-#
-- title: Conan project-level search returns only project-specific results" # (required) Clearly explain the change. For example, "The `confidential` field for a `Note` is removed" or "CI/CD job names are limited to 250 characters."
- announcement_milestone: "15.8" # (required) The milestone when this feature was deprecated.
- removal_milestone: "16.0" # (required) The milestone when this feature is being removed.
- breaking_change: true # (required) Change to false if this is not a breaking change.
- reporter: trizzi # (required) GitLab username of the person reporting the removal
- stage: Package # (required) String value of the stage that the feature was created in. e.g., Growth
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/384455 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- The [GitLab Conan repository](https://docs.gitlab.com/ee/user/packages/conan_repository/) supports the `conan search` command, but when searching a project-level endpoint, instance-level Conan packages could have been returned. This unintended functionality is removed in GitLab 16.0. The search endpoint for the project level now only returns packages from the target project.
diff --git a/data/removals/16_0/16-0-cs-docker-variables.yml b/data/removals/16_0/16-0-cs-docker-variables.yml
deleted file mode 100644
index 05102270a22..00000000000
--- a/data/removals/16_0/16-0-cs-docker-variables.yml
+++ /dev/null
@@ -1,31 +0,0 @@
-#
-# REQUIRED FIELDS
-#
-- title: "Container Scanning variables that reference Docker removed" # (required) Clearly explain the change. For example, "The `confidential` field for a `Note` is removed" or "CI/CD job names are limited to 250 characters."
- announcement_milestone: "15.4" # (required) The milestone when this feature was deprecated.
- removal_milestone: "16.0" # (required) The milestone when this feature is being removed.
- breaking_change: true # (required) Change to false if this is not a breaking change.
- reporter: gonzoyumo # (required) GitLab username of the person reporting the removal
- 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/371840 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- All Container Scanning variables with a name prefixed by `DOCKER_` have been removed. This includes:
-
- - `DOCKER_IMAGE`
- - `DOCKER_PASSWORD`
- - `DOCKER_USER`
- - `DOCKERFILE_PATH`
-
- Instead, use the [new variable names](https://docs.gitlab.com/ee/user/application_security/container_scanning/#available-cicd-variables):
-
- - `CS_IMAGE`
- - `CS_REGISTRY_PASSWORD`
- - `CS_REGISTRY_USER`
- - `CS_DOCKERFILE_PATH`
-#
-# OPTIONAL FIELDS
-#
- tiers: # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
- documentation_url: # (optional) This is a link to the current documentation page
- image_url: # (optional) This is a link to a thumbnail image depicting the feature
- video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg
diff --git a/data/removals/16_0/16-0-dast-api-variable-removal.yml b/data/removals/16_0/16-0-dast-api-variable-removal.yml
deleted file mode 100644
index 1b67eeb0fa7..00000000000
--- a/data/removals/16_0/16-0-dast-api-variable-removal.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-- title: "Two DAST API variables have been removed" # (required) Clearly explain the change. For example, "The `confidential` field for a `Note` is removed" or "CI/CD job names are limited to 250 characters."
- announcement_milestone: "15.7" # (required) The milestone when this feature was deprecated.
- removal_milestone: "16.0" # (required) The milestone when this feature is being removed.
- breaking_change: true # (required) Change to false if this is not a breaking change.
- reporter: derekferguson # (required) GitLab username of the person reporting the removal
- 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/383467 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- The variables `DAST_API_HOST_OVERRIDE` and `DAST_API_SPECIFICATION` have been removed from use for DAST API scans.
-
- `DAST_API_HOST_OVERRIDE` has been removed in favor of using the `DAST_API_TARGET_URL` to automatically override the host in the OpenAPI specification.
-
- `DAST_API_SPECIFICATION` has been removed in favor of `DAST_API_OPENAPI`. To continue using an OpenAPI specification to guide the test, users must replace the `DAST_API_SPECIFICATION` variable with the `DAST_API_OPENAPI` variable. The value can remain the same, but the variable name must be replaced.
diff --git a/data/removals/16_0/16-0-dependency-scanning-java-versions.yml b/data/removals/16_0/16-0-dependency-scanning-java-versions.yml
deleted file mode 100644
index dbbb4efb212..00000000000
--- a/data/removals/16_0/16-0-dependency-scanning-java-versions.yml
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# REQUIRED FIELDS
-#
-- title: "Dependency Scanning ends support for Java 13, 14, 15, and 16" # (required) Clearly explain the change. For example, "The `confidential` field for a `Note` is removed" or "CI/CD job names are limited to 250 characters."
- announcement_milestone: "15.8" # (required) The milestone when this feature was deprecated.
- removal_milestone: "16.0" # (required) The milestone when this feature is being removed.
- breaking_change: true # (required) Change to false if this is not a breaking change.
- reporter: gonzoyumo # (required) GitLab username of the person reporting the removal
- 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/387560 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- Dependency Scanning no longer supports projects that use Java versions 13, 14, 15, and 16.
-#
-# OPTIONAL FIELDS
-#
- tiers: # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
- documentation_url: # (optional) This is a link to the current documentation page
- image_url: # (optional) This is a link to a thumbnail image depicting the feature
- video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg
diff --git a/data/removals/16_0/16-0-external-field-grapql-release-asset-link-type.yml b/data/removals/16_0/16-0-external-field-grapql-release-asset-link-type.yml
deleted file mode 100644
index 310415ad845..00000000000
--- a/data/removals/16_0/16-0-external-field-grapql-release-asset-link-type.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-- title: "Removed `external` field from GraphQL `ReleaseAssetLink` type"
- announcement_milestone: "15.9"
- announcement_date: "2023-02-22"
- removal_milestone: "16.0"
- removal_date: "2023-05-22"
- breaking_change: true
- reporter: missy-davies
- stage: Deploy
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/388983
- body: | # (required) Do not modify this line, instead modify the lines below.
- From GitLab 15.9, all Release links are external. The `external` field of the `ReleaseAssetLink` type was deprecated in 15.9, and removed in GitLab 16.0.
diff --git a/data/removals/16_0/16-0-external-field-releases-release-links-api.yml b/data/removals/16_0/16-0-external-field-releases-release-links-api.yml
deleted file mode 100644
index 9047bfd4adb..00000000000
--- a/data/removals/16_0/16-0-external-field-releases-release-links-api.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-- title: "Removed `external` field from Releases and Release link APIs"
- announcement_milestone: "15.9"
- announcement_date: "2023-02-22"
- removal_milestone: "16.0"
- removal_date: "2023-05-22"
- breaking_change: true
- reporter: missy-davies
- stage: Deploy
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/388984
- body: | # (required) Do not modify this line, instead modify the lines below.
- From GitLab 15.9, all Release links are external. The `external` field in the Releases and Release link APIs was deprecated in 15.9, and removed in GitLab 16.0.
diff --git a/data/removals/16_0/16-0-gitaly-legacy-config-vars.yml b/data/removals/16_0/16-0-gitaly-legacy-config-vars.yml
deleted file mode 100644
index 05bc10114aa..00000000000
--- a/data/removals/16_0/16-0-gitaly-legacy-config-vars.yml
+++ /dev/null
@@ -1,19 +0,0 @@
----
-- title: "Legacy Gitaly configuration methods with variables"
- announcement_milestone: "14.8"
- removal_milestone: "16.0"
- breaking_change: true
- reporter: mjwood
- stage: Gitaly
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/352609
- body: |
- The environment variables `GIT_CONFIG_SYSTEM` and `GIT_CONFIG_GLOBAL` were deprecated in GitLab 14.8 and are removed
- in GitLab 16.0. These variables are replaced with standard
- [`config.toml` Gitaly configuration](https://docs.gitlab.com/ee/administration/gitaly/reference.html).
-
- GitLab instances that use `GIT_CONFIG_SYSTEM` and `GIT_CONFIG_GLOBAL` to configure Gitaly must switch to configuring
- using `config.toml`.
- 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/administration/gitaly/reference.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/16_0/16-0-gitlab-com-importer.yml b/data/removals/16_0/16-0-gitlab-com-importer.yml
deleted file mode 100644
index 7a64bb4a185..00000000000
--- a/data/removals/16_0/16-0-gitlab-com-importer.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-- title: "GitLab.com importer"
- announcement_milestone: "15.8"
- removal_milestone: "16.0"
- breaking_change: false
- reporter: m_frankiewicz
- stage: Manage
- issue_url: https://gitlab.com/gitlab-com/Product/-/issues/4895
- body: |
- The [GitLab.com importer](https://docs.gitlab.com/ee/user/project/import/gitlab_com.html) was deprecated in GitLab 15.8 and is removed in GitLab 16.0.
-
- The GitLab.com importer was introduced in 2015 for importing a project from GitLab.com to a self-managed GitLab instance through the UI.
-
- This feature was available on self-managed instances only. [Migrating GitLab groups and projects by direct transfer](https://docs.gitlab.com/ee/user/group/import/#migrate-groups-by-direct-transfer-recommended)
- supersedes the GitLab.com importer and provides a more cohesive importing functionality.
-
- See [migrated group items](https://docs.gitlab.com/ee/user/group/import/#migrated-group-items) and [migrated project items](https://docs.gitlab.com/ee/user/group/import/#migrated-project-items) for an overview.
diff --git a/data/removals/16_0/16-0-grafana-chart.yml b/data/removals/16_0/16-0-grafana-chart.yml
deleted file mode 100644
index 7d26fc1764e..00000000000
--- a/data/removals/16_0/16-0-grafana-chart.yml
+++ /dev/null
@@ -1,19 +0,0 @@
-- title: "Bundled Grafana Helm Chart"
- announcement_milestone: "15.10"
- removal_milestone: "16.0"
- breaking_change: true
- reporter: twk3
- stage: Enablement
- issue_url: https://gitlab.com/gitlab-org/charts/gitlab/-/issues/4353
- body: | # (required) Do not modify this line, instead modify the lines below.
- The Grafana Helm chart that was bundled with the GitLab Helm Chart is removed in the GitLab Helm Chart 7.0 release (releasing along with GitLab 16.0).
-
- The `global.grafana.enabled` setting for the GitLab Helm Chart has also been removed alongside the Grafana Helm chart.
-
- If you're using the bundled Grafana, you should switch to the [newer chart version from Grafana Labs](https://artifacthub.io/packages/helm/grafana/grafana)
- or a Grafana Operator from a trusted provider.
-
- In your new Grafana instance, [configure the GitLab provided Prometheus as a data source](https://docs.gitlab.com/ee/administration/monitoring/performance/grafana_configuration.html#configure-grafana)
- and [connect Grafana to the GitLab UI](https://docs.gitlab.com/ee/administration/monitoring/performance/grafana_configuration.html#integrate-with-gitlab-ui).
- 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/administration/monitoring/performance/grafana_configuration.html
diff --git a/data/removals/16_0/16-0-graphql-dora-environment-tier-param.yml b/data/removals/16_0/16-0-graphql-dora-environment-tier-param.yml
deleted file mode 100644
index a4428534cb1..00000000000
--- a/data/removals/16_0/16-0-graphql-dora-environment-tier-param.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-#
-- title: "Remove the deprecated `environment_tier` parameter from the DORA API"
- announcement_milestone: "15.2"
- removal_milestone: "16.0"
- breaking_change: true
- reporter: ahegyi
- stage: Plan
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/365939
- body: | # (required) Do not modify this line, instead modify the lines below.
- The `environment_tier` parameter has been superseded by the `environment_tiers` parameter.
-
- If you use the `environment_tier` parameter in your integration (REST or GraphQL) then you need to replace it with the `environment_tiers` parameter which accepts an array of strings.
- tiers: [Ultimate]
- documentation_url: https://docs.gitlab.com/ee/api/dora/metrics.html
diff --git a/data/removals/16_0/16-0-import-bare-repositories-rake-task.yml b/data/removals/16_0/16-0-import-bare-repositories-rake-task.yml
deleted file mode 100644
index c3095ef6ff9..00000000000
--- a/data/removals/16_0/16-0-import-bare-repositories-rake-task.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-- title: "Rake task for importing bare repositories"
- announcement_milestone: "15.8"
- removal_milestone: "16.0"
- breaking_change: false
- reporter: m_frankiewicz
- stage: Manage
- issue_url: https://gitlab.com/gitlab-com/Product/-/issues/5255
- body: |
- The [Rake task for importing bare repositories](https://docs.gitlab.com/ee/raketasks/import.html) `gitlab:import:repos` was deprecated in GitLab 15.8 and is removed in GitLab 16.0.
-
- This Rake task imported a directory tree of repositories into a GitLab instance. These repositories must have been
- managed by GitLab previously, because the Rake task relied on the specific directory structure or a specific custom Git setting in order to work (`gitlab.fullpath`).
-
- Importing repositories using this Rake task had limitations. The Rake task:
-
- - Only knew about project and project wiki repositories and didn't support repositories for designs, group wikis, or snippets.
- - Permitted you to import non-hashed storage projects even though these aren't supported.
- - Relied on having Git config `gitlab.fullpath` set. [Epic 8953](https://gitlab.com/groups/gitlab-org/-/epics/8953) proposes removing support for this setting.
-
- Alternatives to using the `gitlab:import:repos` Rake task include:
-
- - Migrating projects using either [an export file](https://docs.gitlab.com/ee/user/project/settings/import_export.html) or
- [direct transfer](https://docs.gitlab.com/ee/user/group/import/#migrate-groups-by-direct-transfer-recommended) migrate repositories as well.
- - Importing a [repository by URL](https://docs.gitlab.com/ee/user/project/import/repo_by_url.html).
- - Importing a [repositories from a non-GitLab source](https://docs.gitlab.com/ee/user/project/import/).
diff --git a/data/removals/16_0/16-0-jira-github-enterprise-dvcs-connector.yml b/data/removals/16_0/16-0-jira-github-enterprise-dvcs-connector.yml
deleted file mode 100644
index 7538bf77da6..00000000000
--- a/data/removals/16_0/16-0-jira-github-enterprise-dvcs-connector.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-- title: "Jira DVCS connector for Jira Cloud and Jira 8.13 and earlier"
- announcement_milestone: "15.1"
- removal_milestone: "16.0"
- breaking_change: true
- reporter: m_frankiewicz
- stage: Manage
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/362168
- body: |
- The [Jira DVCS connector](https://docs.gitlab.com/ee/integration/jira/dvcs/) for Jira Cloud was deprecated in GitLab 15.1 and has been removed in 16.0. Use the [GitLab for Jira Cloud app](https://docs.gitlab.com/ee/integration/jira/connect-app.html) instead. The Jira DVCS connector was also deprecated for Jira 8.13 and earlier. You can only use the Jira DVCS connector with Jira Data Center or Jira Server in Jira 8.14 and later. Upgrade your Jira instance to Jira 8.14 or later, and reconfigure the Jira integration in your GitLab instance.
- If you cannot upgrade your Jira instance in time and are on GitLab self-managed version, we offer a workaround until GitLab 16.6. This breaking change is deployed in GitLab 16.0 behind a feature flag named `jira_dvcs_end_of_life_amnesty`. The flag is disabled by default, but you can ask an administrator to enable the flag at any time. For questions related to this announcement, see the [feedback issue](https://gitlab.com/gitlab-org/gitlab/-/issues/408185).
diff --git a/data/removals/16_0/16-0-job_age.yml b/data/removals/16_0/16-0-job_age.yml
deleted file mode 100644
index 8a31b1ad870..00000000000
--- a/data/removals/16_0/16-0-job_age.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-- title: "Removal of job_age parameter in `POST /jobs/request` Runner endpoint"
- announcement_milestone: "15.2" # (required) The milestone when this feature was deprecated.
- removal_milestone: "16.0" # (required) The milestone when this feature is being removed.
- breaking_change: true # (required) Change to false if this is not a breaking change.
- reporter: jreporter # (required) GitLab username of the person reporting the removal
- stage: Verify # (required) String value of the stage that the feature was created in. e.g., Growth
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/334253 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- The `job_age` parameter, returned from the `POST /jobs/request` API endpoint used in communication with GitLab Runner, has been removed in GitLab 16.0.
-
- This could be a breaking change for anyone that developed their own runner that relies on this parameter being returned by the endpoint. This is not a breaking change for anyone using an officially released version of GitLab Runner, including public shared runners on GitLab.com.
diff --git a/data/removals/16_0/16-0-licenses-check.yml b/data/removals/16_0/16-0-licenses-check.yml
deleted file mode 100644
index 88ebbeb710a..00000000000
--- a/data/removals/16_0/16-0-licenses-check.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-- title: "License-Check and the Policies tab on the License Compliance page"
- announcement_milestone: "15.9"
- removal_milestone: "16.0"
- breaking_change: true
- reporter: sam.white
- stage: govern
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/390417
- tiers: [Ultimate]
- body: |
- The License Check Policies feature has been removed. Additionally, the Policies tab on the License Compliance page and all APIs related to the License Check feature have been removed. To enforce approvals based on detected licenses, use the [License Approval policy](https://docs.gitlab.com/ee/user/compliance/license_approval_policies.html) feature instead.
diff --git a/data/removals/16_0/16-0-limit-ci-job-token.yml b/data/removals/16_0/16-0-limit-ci-job-token.yml
deleted file mode 100644
index 1409677233c..00000000000
--- a/data/removals/16_0/16-0-limit-ci-job-token.yml
+++ /dev/null
@@ -1,32 +0,0 @@
-- title: "Limit CI_JOB_TOKEN scope is disabled" # (required) Clearly explain the change, or planned change. For example, "The `confidential` field for a `Note` is deprecated" or "CI/CD job names will be limited to 250 characters."
- announcement_milestone: "15.9" # (required) The milestone when this feature was first announced as deprecated.
- removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
- breaking_change: true # (required) If this deprecation is a breaking change, set this value to true
- reporter: jreporter # (required) GitLab username of the person reporting the deprecation
- stage: Verify # (required) String value of the stage that the feature was created in. e.g., Growth
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/395708 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- In GitLab 14.4 we introduced the ability to [limit your project's CI/CD job token](https://docs.gitlab.com/ee/ci/jobs/ci_job_token.html#limit-your-projects-job-token-access) (`CI_JOB_TOKEN`) access to make it more secure. You could use the **Limit CI_JOB_TOKEN access** setting to prevent job tokens from your project's pipelines from being used to **access other projects**. When enabled with no other configuration, your pipelines could not access any other projects. To use job tokens to access other projects from your project's pipelines, you needed to list those other projects explicitly in the setting's allowlist, and you needed to be a maintainer in _all_ the projects. You might have seen this mentioned as the "outbound scope" of the job token.
-
- The job token functionality was updated in 15.9 with a [better security setting](https://docs.gitlab.com/ee/ci/jobs/ci_job_token.html#allow-access-to-your-project-with-a-job-token). Instead of securing your own project's job tokens from accessing other projects, the new workflow is to secure your own project from being accessed by other projects' job tokens without authorization. You can see this as an "inbound scope" for job tokens. When this new **Allow access to this project with a CI_JOB_TOKEN** setting is enabled with no other configuration, job tokens from other projects cannot **access your project**. If you want a project to have access to your own project, you must list it in the new setting's allowlist. You must be a maintainer in your own project to control the new allowlist, but you only need to have the Guest role in the other projects. This new setting is enabled by default for all new projects.
-
- In GitLab 16.0, the old **Limit CI_JOB_TOKEN access** setting is disabled by default for all **new** projects. In existing projects with this setting currently enabled, it will continue to function as expected, but you are unable to add any more projects to the old allowlist. If the setting is disabled in any project, it is not possible to re-enable this setting in 16.0 or later. To control access between your projects, use the new **Allow access** setting instead.
-
- In 17.0, we plan to remove the **Limit** setting completely, and set the **Allow access** setting to enabled for all projects. This change ensures a higher level of security between projects. If you currently use the **Limit** setting, you should update your projects to use the **Allow access** setting instead. If other projects access your project with a job token, you must add them to the **Allow access** setting's allowlist.
-
- To prepare for this change, users on GitLab.com or self-managed GitLab 15.9 or later can enable the **Allow access** setting now and add the other projects. It will not be possible to disable the setting in 17.0 or later.
- #
- # OPTIONAL END OF SUPPORT FIELDS
- #
- # If an End of Support period applies, the announcement should be shared with GitLab Support
- # in the `#spt_managers` channel in Slack, and mention `@gitlab-com/support` in this MR.
- #
- end_of_support_milestone: # (optional) Use "XX.YY" format. The milestone when support for this feature will end.
- end_of_support_date: # (optional) The date of the milestone release when support for this feature will end.
- #
- # OTHER OPTIONAL FIELDS
- #
- 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/ci/jobs/ci_job_token.html#configure-the-job-token-scope-limit" # (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/16_0/16-0-managed-licenses-api.yml b/data/removals/16_0/16-0-managed-licenses-api.yml
deleted file mode 100644
index 6e5b8626eb9..00000000000
--- a/data/removals/16_0/16-0-managed-licenses-api.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-- title: "Managed Licenses API"
- announcement_milestone: "15.9"
- removal_milestone: "16.0"
- breaking_change: true
- reporter: sam.white
- stage: govern
- tiers: [Ultimate]
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/390417
- body: |
- The [Managed Licenses API](https://archives.docs.gitlab.com/15.8/ee/api/managed_licenses.html) has been removed. To enforce approvals in merge requests when non-compliant licenses are detected, use the [License Approval policy](https://docs.gitlab.com/ee/user/compliance/license_approval_policies.html) feature instead.
-
- Our [GraphQL APIs](https://docs.gitlab.com/ee/api/graphql/reference/) can be used to create a Security Policy Project, [update the policy.yml](https://docs.gitlab.com/ee/api/graphql/reference/#mutationscanexecutionpolicycommit) in the Security Policy Project, and enforce those policies.
-
- To query a list of dependencies and components, use our [Dependencies REST API](https://docs.gitlab.com/ee/api/dependencies.html) or [export from the Dependency List](https://docs.gitlab.com/ee/user/application_security/dependency_list/).
diff --git a/data/removals/16_0/16-0-non-expiring-access-tokens.yml b/data/removals/16_0/16-0-non-expiring-access-tokens.yml
deleted file mode 100644
index 5ef7df3a131..00000000000
--- a/data/removals/16_0/16-0-non-expiring-access-tokens.yml
+++ /dev/null
@@ -1,19 +0,0 @@
-- title: "Non-expiring access tokens no longer supported"
- announcement_milestone: "15.4" # (required) The milestone when this feature was deprecated.
- removal_milestone: "16.0" # (required) The milestone when this feature is being removed.
- breaking_change: true # (required) Change to false if this is not a breaking change.
- reporter: jessieay # (required) GitLab username of the person reporting the removal
- stage: Manage # (required) String value of the stage that the feature was created in. e.g., Growth
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/369123
- body: | # (required) Do not modify this line, instead modify the lines below.
- Currently, you can create access tokens that have no expiration date. These access tokens are valid indefinitely, which presents a security risk if the access token is
- divulged. Because expiring access tokens are better, from GitLab 15.4 we [populate a default expiration date](https://gitlab.com/gitlab-org/gitlab/-/issues/348660).
-
- In GitLab 16.0, any personal, project, or group access token that does not have an expiration date will automatically have an expiration date set at 365 days later than the current date.
-#
-# OPTIONAL FIELDS
-#
- tiers: # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
- documentation_url: # (optional) This is a link to the current documentation page
- image_url: # (optional) This is a link to a thumbnail image depicting the feature
- video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg
diff --git a/data/removals/16_0/16-0-operations-access-level-api-field.yml b/data/removals/16_0/16-0-operations-access-level-api-field.yml
deleted file mode 100644
index dfae80e0393..00000000000
--- a/data/removals/16_0/16-0-operations-access-level-api-field.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-- title: "Project REST API field `operations_access_level` removed" # (required) Clearly explain the change. For example, "The `confidential` field for a `Note` is removed" or "CI/CD job names are limited to 250 characters."
- announcement_milestone: "15.8" # (required) The milestone when this feature was deprecated.
- removal_milestone: "16.0" # (required) The milestone when this feature is being removed.
- breaking_change: true # (required) Change to false if this is not a breaking change.
- reporter: timofurrer # (required) GitLab username of the person reporting the removal
- stage: deploy # (required) String value of the stage that the feature was created in. e.g., Growth
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/385798 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- In project REST API endpoints, the `operations_access_level` field
- is removed in favor of more specialized fields like:
-
- - `releases_access_level`
- - `environments_access_level`
- - `feature_flags_access_level`
- - `infrastructure_access_level`
- - `monitor_access_level`
diff --git a/data/removals/16_0/16-0-phabricator-importer.yml b/data/removals/16_0/16-0-phabricator-importer.yml
deleted file mode 100644
index a46e6d81a9c..00000000000
--- a/data/removals/16_0/16-0-phabricator-importer.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-- title: "The Phabricator task importer"
- announcement_milestone: "15.7"
- removal_milestone: "16.0"
- breaking_change: true
- reporter: m_frankiewicz
- stage: Manage
- issue_url: https://gitlab.com/gitlab-com/Product/-/issues/4894
- body: |
- The [Phabricator task importer](https://docs.gitlab.com/ee/user/project/import/phabricator.html) was deprecated in
- GitLab 15.7 and is removed in 16.0.
-
- The Phabricator project hasn't been actively maintained since June 1, 2021. We haven't observed imports using this
- tool. There has been no activity on the open related issues on GitLab.
diff --git a/data/removals/16_0/16-0-pipeline_activity_limit.yml b/data/removals/16_0/16-0-pipeline_activity_limit.yml
deleted file mode 100644
index d8644b00deb..00000000000
--- a/data/removals/16_0/16-0-pipeline_activity_limit.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-- title: "Maximum number of active pipelines per project limit (`ci_active_pipelines`)" # (required) Clearly explain the change. For example, "The `confidential` field for a `Note` is removed" or "CI/CD job names are limited to 250 characters."
- announcement_milestone: "15.3" # (required) The milestone when this feature was deprecated.
- removal_milestone: "16.0" # (required) The milestone when this feature is being removed.
- breaking_change: false # (required) Change to false if this is not a breaking change.
- reporter: jreporter # (required) GitLab username of the person reporting the removal
- stage: Verify # (required) String value of the stage that the feature was created in. e.g., Growth
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/368195 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- The [**Maximum number of active pipelines per project** limit](https://docs.gitlab.com/ee/user/admin_area/settings/continuous_integration.html#set-cicd-limits) has been removed. Instead, use the other recommended rate limits that offer similar protection:
-
- - [**Pipelines rate limits**](https://docs.gitlab.com/ee/user/admin_area/settings/rate_limit_on_pipelines_creation.html).
- - [**Total number of jobs in currently active pipelines**](https://docs.gitlab.com/ee/user/admin_area/settings/continuous_integration.html#set-cicd-limits).
diff --git a/data/removals/16_0/16-0-postgresql-12.yml b/data/removals/16_0/16-0-postgresql-12.yml
deleted file mode 100644
index 9c860af7dbc..00000000000
--- a/data/removals/16_0/16-0-postgresql-12.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-- title: "PostgreSQL 12 compatibility"
- announcement_milestone: "15.0"
- removal_milestone: "16.0"
- breaking_change: true
- reporter: twk3
- stage: Enablement
- issue_url: https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/7395
- body: |
- In GitLab 16.0, PostgreSQL 13 is the minimum supported PostgreSQL version. PostgreSQL 12 is no longer shipped with the GitLab Omnibus package.
- Before upgrading to GitLab 16.0, if you are:
-
- - Still using GitLab-packaged PostgreSQL 12, you must [perform a database upgrade](https://docs.gitlab.com/omnibus/settings/database.html#upgrade-packaged-postgresql-server)
- to PostgreSQL 13.
- - Using an externally-provided PostgreSQL 12, you must upgrade to PostgreSQL 13 or later to meet the
- [minimum version requirements](https://docs.gitlab.com/ee/install/requirements.html#postgresql-requirements).
- 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/administration/package_information/postgresql_versions.html
diff --git a/data/removals/16_0/16-0-pull-thru-cache-container-registry.yml b/data/removals/16_0/16-0-pull-thru-cache-container-registry.yml
deleted file mode 100644
index 88f8c31eeef..00000000000
--- a/data/removals/16_0/16-0-pull-thru-cache-container-registry.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-# REQUIRED FIELDS
-#
-- title: "Container Registry pull-through cache is removed" # (required) Clearly explain the change. For example, "The `confidential` field for a `Note` is removed" or "CI/CD job names are limited to 250 characters."
- announcement_milestone: "15.8" # (required) The milestone when this feature was deprecated.
- removal_milestone: "16.0" # (required) The milestone when this feature is being removed.
- breaking_change: true # (required) Change to false if this is not a breaking change.
- reporter: trizzi # (required) GitLab username of the person reporting the removal
- stage: Package # (required) String value of the stage that the feature was created in. e.g., Growth
- issue_url: https://gitlab.com/gitlab-org/container-registry/-/issues/937 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- The Container Registry [pull-through cache](https://docs.docker.com/registry/recipes/mirror/) was deprecated in GitLab 15.8 and removed in GitLab 16.0. This feature is part of the upstream [Docker Distribution project](https://github.com/distribution/distribution) but we are removing that code in favor of the GitLab Dependency Proxy. Use the GitLab Dependency Proxy to proxy and cache container images from Docker Hub.
diff --git a/data/removals/16_0/16-0-redis-5.yml b/data/removals/16_0/16-0-redis-5.yml
deleted file mode 100644
index 2c539c5775e..00000000000
--- a/data/removals/16_0/16-0-redis-5.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-- title: "Redis 5 compatibility"
- announcement_milestone: "15.3"
- removal_milestone: "16.0"
- breaking_change: true
- reporter: twk3
- stage: Enablement
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/331468
- body: |
- In GitLab 13.9, we updated the Omnibus GitLab package and GitLab Helm chart 4.9 to Redis 6. Redis 5 reached end of life in April 2022 and is not supported.
-
- GitLab 16.0, we have removed support for Redis 5. If you are using your own Redis 5.0 instance, you must upgrade it to Redis 6.0 or later before upgrading to GitLab 16.0
- or later.
- 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/install/requirements.html
diff --git a/data/removals/16_0/16-0-redis-config-env.yml b/data/removals/16_0/16-0-redis-config-env.yml
deleted file mode 100644
index 956639edc1f..00000000000
--- a/data/removals/16_0/16-0-redis-config-env.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-- title: "Configuring Redis config file paths using environment variables is no longer supported"
- announcement_milestone: "15.8"
- removal_milestone: "16.0"
- breaking_change: true
- reporter: marcogreg
- stage: platforms
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/388255
- body: |
- You can no longer specify Redis configuration file locations
- using the environment variables like `GITLAB_REDIS_CACHE_CONFIG_FILE` or
- `GITLAB_REDIS_QUEUES_CONFIG_FILE`. Use the default
- configuration file locations instead, for example `config/redis.cache.yml` or
- `config/redis.queues.yml`.
diff --git a/data/removals/16_0/16-0-redis-localhost.yml b/data/removals/16_0/16-0-redis-localhost.yml
deleted file mode 100644
index 1b15efe4749..00000000000
--- a/data/removals/16_0/16-0-redis-localhost.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-- title: "Non-standard default Redis ports are no longer supported"
- announcement_milestone: "15.8"
- removal_milestone: "16.0"
- breaking_change: true
- reporter: marcogreg
- stage: platforms # (required) String value of the stage that the feature was created in. e.g., Growth
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/388269
- body: |
- If GitLab starts without any Redis configuration file present,
- GitLab assumes it can connect to three Redis servers at `localhost:6380`,
- `localhost:6381` and `localhost:6382`. We are changing this behavior
- so GitLab assumes there is one Redis server at `localhost:6379`.
-
- If you want to keep using the three servers, you must configure
- the Redis URLs by editing the `config/redis.cache.yml`,`config/redis.queues.yml`,
- and `config/redis.shared_state.yml` files.
diff --git a/data/removals/16_0/16-0-removal-variables.yml b/data/removals/16_0/16-0-removal-variables.yml
deleted file mode 100644
index f8dd09c36e5..00000000000
--- a/data/removals/16_0/16-0-removal-variables.yml
+++ /dev/null
@@ -1,29 +0,0 @@
-- title: "`CI_BUILD_*` predefined variables removed"
- announcement_milestone: "14.8"
- removal_milestone: "16.0"
- breaking_change: true
- reporter: dhershkovitch
- body: |
- The predefined CI/CD variables that start with `CI_BUILD_*` were deprecated in GitLab 9.0, and removed in GitLab 16.0. If you still use these variables, you must change to the replacement [predefined variables](https://docs.gitlab.com/ee/ci/variables/predefined_variables.html) which are functionally identical:
-
- | Removed variable | Replacement variable |
- | --------------------- |------------------------ |
- | `CI_BUILD_BEFORE_SHA` | `CI_COMMIT_BEFORE_SHA` |
- | `CI_BUILD_ID` | `CI_JOB_ID` |
- | `CI_BUILD_MANUAL` | `CI_JOB_MANUAL` |
- | `CI_BUILD_NAME` | `CI_JOB_NAME` |
- | `CI_BUILD_REF` | `CI_COMMIT_SHA` |
- | `CI_BUILD_REF_NAME` | `CI_COMMIT_REF_NAME` |
- | `CI_BUILD_REF_SLUG` | `CI_COMMIT_REF_SLUG` |
- | `CI_BUILD_REPO` | `CI_REPOSITORY_URL` |
- | `CI_BUILD_STAGE` | `CI_JOB_STAGE` |
- | `CI_BUILD_TAG` | `CI_COMMIT_TAG` |
- | `CI_BUILD_TOKEN` | `CI_JOB_TOKEN` |
- | `CI_BUILD_TRIGGERED` | `CI_PIPELINE_TRIGGERED` |
-# The following items are not published on the docs page, but may be used in the future.
- stage: Verify
- tiers: [Free, Premium, Ultimate]
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/352957
- documentation_url: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html
- 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/16_0/16-0-remove-embed-grafana-panels-in-markdown.yml b/data/removals/16_0/16-0-remove-embed-grafana-panels-in-markdown.yml
deleted file mode 100644
index 2872eb6abe9..00000000000
--- a/data/removals/16_0/16-0-remove-embed-grafana-panels-in-markdown.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-- title: "Embedding Grafana panels in Markdown is removed"
- announcement_milestone: "15.9"
- removal_milestone: "16.0"
- breaking_change: true
- reporter: kbychu
- stage: monitor
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/389477
- body: |
- The ability to add Grafana panels in GitLab Flavored Markdown is removed.
- We intend to replace this feature with the ability to [embed charts](https://gitlab.com/groups/gitlab-org/opstrace/-/epics/33)
- with the [GitLab Observability UI](https://gitlab.com/gitlab-org/opstrace/opstrace-ui).
- tiers: [Free, Silver, Gold, Core, Premium, Ultimate]
- documentation_url: https://docs.gitlab.com/ee/operations/metrics/embed_grafana.html#embed-grafana-panels-in-markdown-deprecated
diff --git a/data/removals/16_0/16-0-remove-legacy-gitaly-config-structure.yml b/data/removals/16_0/16-0-remove-legacy-gitaly-config-structure.yml
deleted file mode 100644
index 13f6669bd10..00000000000
--- a/data/removals/16_0/16-0-remove-legacy-gitaly-config-structure.yml
+++ /dev/null
@@ -1,22 +0,0 @@
----
-- title: "Legacy Gitaly configuration method"
- announcement_milestone: "15.10"
- removal_milestone: "16.0"
- breaking_change: true
- reporter: mjwood
- stage: gitaly
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/393574
- body: |
- Previously, Gitaly configuration keys for Omnibus GitLab were scattered throughout the configuration file. In GitLab
- 15.10, we added support for a single configuration structure that matches Gitaly internal configuration. Both methods
- of configuring Gitaly were supported in parallel.
-
- In GitLab 16.0, we removed support for the former configuration method and now only support the new configuration
- method.
-
- Before upgrading to GitLab 16.0, administrators must migrate to the new single configuration structure. For
- instructions, see [Gitaly - Omnibus GitLab configuration structure change](https://docs.gitlab.com/ee/update/#gitaly-omnibus-gitlab-configuration-structure-change).
- tiers: # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
- documentation_url: # (optional) This is a link to the current documentation page
- image_url: # (optional) This is a link to a thumbnail image depicting the feature
- video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg
diff --git a/data/removals/16_0/16-0-remove-legacy-praefect-config-structure.yml b/data/removals/16_0/16-0-remove-legacy-praefect-config-structure.yml
deleted file mode 100644
index 0b8a745a822..00000000000
--- a/data/removals/16_0/16-0-remove-legacy-praefect-config-structure.yml
+++ /dev/null
@@ -1,22 +0,0 @@
----
-- title: "Legacy Praefect configuration method"
- announcement_milestone: "15.9"
- removal_milestone: "16.0"
- breaking_change: true
- reporter: mjwood
- stage: gitaly
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/390291
- body: |
- Previously, Praefect configuration keys for Omnibus GitLab were scattered throughout the configuration file. In GitLab
- 15.9, we added support for a single configuration structure that matches Praefect internal configuration. Both methods
- of configuring Praefect were supported in parallel.
-
- In GitLab 16.0, we removed support for the former configuration method and now only support the new configuration
- method.
-
- Before upgrading to GitLab 16.0, administrators must migrate to the new single configuration structure. For
- instructions, see [Praefect - Omnibus GitLab configuration structure change](https://docs.gitlab.com/ee/update/#praefect-omnibus-gitlab-configuration-structure-change).
- 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/administration/gitaly/praefect.html
- 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/16_0/16-0-remove-metrics.yml b/data/removals/16_0/16-0-remove-metrics.yml
deleted file mode 100644
index 0e2df8a3ecd..00000000000
--- a/data/removals/16_0/16-0-remove-metrics.yml
+++ /dev/null
@@ -1,24 +0,0 @@
-- title: "Monitoring performance metrics through Prometheus is removed"
- announcement_milestone: "14.7"
- removal_milestone: "16.0"
- breaking_change: true
- reporter: kbychu
- stage: monitor
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/346541
- body: |
- We previously launched a solution that allows you to view performance metrics by displaying data stored in a Prometheus instance.
- The Prometheus instance can be set up as a GitLab-managed app or you can connect a previously configured Prometheus instance.
- The latter is known as an "external Prometheus" in GitLab. The value we provided was to enable you to easily set up monitoring
- (using GitLab Managed Apps) and have the visualization of the metrics all in the same tool you used to build the application.
-
- However, as we are removing certificate-based integrations, the full monitoring experience is also deprecated as you will not
- have the option to easily set up Prometheus from GitLab. Furthermore, we plan to consolidate on
- a focused observability dashboard experience instead of having multiple paths to view metrics. Because of this, we are also removing the external
- Prometheus experience, together with the metrics visualization capability.
-
- This removal only refers to the GitLab Metrics capabilities, and **does not** include:
-
- - Deprecating [alerts for Prometheus](https://gitlab.com/gitlab-org/gitlab/-/issues/338834).
- - [Capabilities that GitLab comes with that allow operators of GitLab to retrieve metrics from those instances](https://docs.gitlab.com/ee/administration/monitoring/prometheus/gitlab_metrics.html).
-
- tiers: [Free, Silver, Gold, Core, Premium, Ultimate]
diff --git a/data/removals/16_0/16-0-remove-praefect-custom-metric-endpoint.yml b/data/removals/16_0/16-0-remove-praefect-custom-metric-endpoint.yml
deleted file mode 100644
index 6642e707c29..00000000000
--- a/data/removals/16_0/16-0-remove-praefect-custom-metric-endpoint.yml
+++ /dev/null
@@ -1,18 +0,0 @@
----
-- title: "Praefect custom metrics endpoint configuration"
- announcement_milestone: "15.9"
- removal_milestone: "16.0"
- breaking_change: true
- reporter: mjwood
- stage: Gitaly
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/390266
- body: |
- Support for using the `prometheus_exclude_database_from_default_metrics` configuration value was deprecated in
- GitLab 15.9 and is removed in GitLab 16.0. We made this change to improve the performance of Praefect.
- All metrics that scrape the Praefect database are now exported to the `/db_metrics` endpoint.
-
- You must update your metrics collection targets to use the `/db_metrics` endpoint.
- tiers: # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
- documentation_url: # (optional) This is a link to the current documentation page
- image_url: # (optional) This is a link to a thumbnail image depicting the feature
- video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg
diff --git a/data/removals/16_0/16-0-restrict-imports-to-maintainers-and-above.yml b/data/removals/16_0/16-0-restrict-imports-to-maintainers-and-above.yml
deleted file mode 100644
index 2572ec9d6a4..00000000000
--- a/data/removals/16_0/16-0-restrict-imports-to-maintainers-and-above.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-- title: "Developer role providing the ability to import projects to a group"
- announcement_milestone: "15.8"
- removal_milestone: "16.0"
- breaking_change: true
- reporter: m_frankiewicz
- stage: Manage
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/387891
- body: |
- The ability for users with the Developer role for a group to import projects to that group was deprecated in GitLab
- 15.8 and is removed in GitLab 16.0.
-
- From GitLab 16.0, only users with at least the Maintainer role for a group can import projects to that group.
diff --git a/data/removals/16_0/16-0-sast-analyzer-consolidation.yml b/data/removals/16_0/16-0-sast-analyzer-consolidation.yml
deleted file mode 100644
index 6235e9619ae..00000000000
--- a/data/removals/16_0/16-0-sast-analyzer-consolidation.yml
+++ /dev/null
@@ -1,21 +0,0 @@
-- title: "The Security Code Scan-based GitLab SAST analyzer is now removed" # (required) Clearly explain the change. For example, "The `confidential` field for a `Note` is removed" or "CI/CD job names are limited to 250 characters."
- announcement_milestone: "15.9" # (required) The milestone when this feature was first announced as deprecated.
- removal_milestone: "16.0" # (required) The milestone when this feature is being removed.
- breaking_change: true # (required) Change to false if this is not a breaking change.
- reporter: connorgilbert # (required) GitLab username of the person reporting the change
- 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/390416 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- GitLab SAST uses various [analyzers](https://docs.gitlab.com/ee/user/application_security/sast/analyzers/) to scan code for vulnerabilities.
- We've reduced the number of supported analyzers used by default in GitLab SAST.
- This is part of our long-term strategy to deliver a faster, more consistent user experience across different programming languages.
-
- As of GitLab 16.0, the [SAST CI/CD template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml) no longer uses the [Security Code Scan](https://gitlab.com/gitlab-org/security-products/analyzers/security-code-scan)-based analyzer for .NET.
- We've removed this analyzer from the SAST CI/CD template and replaced it with GitLab-supported detection rules for C# in the [Semgrep-based analyzer](https://gitlab.com/gitlab-org/security-products/analyzers/semgrep).
-
- Because this analyzer has reached End of Support in GitLab 16.0, we won't provide further updates to it.
- However, we won't delete any container images we previously published for this analyzer or remove the ability to run it by using a [custom CI/CD pipeline job](https://docs.gitlab.com/ee/ci/yaml/artifacts_reports.html#artifactsreportssast).
-
- If you've already dismissed a vulnerability finding from the deprecated analyzer, the replacement attempts to respect your previous dismissal. See [Vulnerability translation documentation](https://docs.gitlab.com/ee/user/application_security/sast/analyzers.html#vulnerability-translation) for further details.
-
- If you customize the behavior of GitLab SAST by disabling the Semgrep-based analyzer or depending on specific SAST jobs in your pipelines, you must take action as detailed in the [deprecation issue for this change](https://gitlab.com/gitlab-org/gitlab/-/issues/390416#actions-required).
diff --git a/data/removals/16_0/16-0-secure-template-changes.yml b/data/removals/16_0/16-0-secure-template-changes.yml
deleted file mode 100644
index c7ec5a2f894..00000000000
--- a/data/removals/16_0/16-0-secure-template-changes.yml
+++ /dev/null
@@ -1,27 +0,0 @@
-- title: Secure scanning `_DISABLED` variables now require the value `"true"` # (required) Clearly explain the change, or planned change. For example, "The `confidential` field for a `Note` is deprecated" or "CI/CD job names will be limited to 250 characters."
- announcement_milestone: "15.9" # (required) The milestone when this feature was first announced as deprecated.
- removal_milestone: "16.0" # (required) The milestone when this feature is being removed.
- breaking_change: true # (required) Change to false if this is not a breaking change.
- reporter: connorgilbert # (required) GitLab username of the person reporting the change
- 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/391822 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- In GitLab 16.0, we've changed how values for CI/CD variables like `SAST_DISABLED` and `DEPENDENCY_SCANNING_DISABLED` are handled.
-
- Now, scanning is disabled only if the value is `"true"`, for example `SAST_DISABLED: "true"`. Previously, even if the value were `"false"`, like `SAST_DISABLED: "false"`, scanning would still be disabled.
-
- This change was previously released in the Latest versions of the CI/CD templates because of the potential to disrupt customized CI/CD pipeline configurations.
-
- The following templates have been updated:
-
- - API Fuzzing: [`API-Fuzzing.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/API-Fuzzing.gitlab-ci.yml)
- - Container Scanning: [`Container-Scanning.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/Container-Scanning.gitlab-ci.yml)
- - Coverage-Guided Fuzzing: [`Coverage-Fuzzing.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/Coverage-Fuzzing.gitlab-ci.yml)
- - DAST: [`DAST.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/DAST.gitlab-ci.yml)
- - DAST API: [`DAST-API.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/DAST-API.gitlab-ci.yml)
- - Dependency Scanning: [`Dependency-Scanning.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/Dependency-Scanning.gitlab-ci.yml)
- - IaC Scanning: [`SAST-IaC.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/SAST-IaC.gitlab-ci.yml)
- - SAST: [`SAST.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml)
- - Secret Detection: [`Secret-Detection.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/Secret-Detection.gitlab-ci.yml)
-
- If you currently use the `_DISABLED` variables but set a value other than `"true"` to disable scanning, change the value to `"true"`.
diff --git a/data/removals/16_0/16-0-self-monitor-removal.yml b/data/removals/16_0/16-0-self-monitor-removal.yml
deleted file mode 100644
index 3d97d1a417d..00000000000
--- a/data/removals/16_0/16-0-self-monitor-removal.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-- title: "Self-monitoring project is removed"
- removal_milestone: "16.0"
- announcement_milestone: "14.9"
- breaking_change: true
- reporter: kbychu
- stage: monitor
- issue_url: https://gitlab.com/groups/gitlab-org/-/epics/10030
- body: |
- GitLab self-monitoring project was meant to enable self-hosted GitLab administrators to visualize performance metrics of GitLab within GitLab itself. This feature relied on GitLab Metrics dashboards. With metrics dashboard being removed, self-monitoring project is also removed. We recommended that self-hosted users monitor their GitLab instance with alternative visualization tools, such as Grafana.
diff --git a/data/removals/16_0/16-0-source-code-approvals-endpoint.yml b/data/removals/16_0/16-0-source-code-approvals-endpoint.yml
deleted file mode 100644
index 786ed39566b..00000000000
--- a/data/removals/16_0/16-0-source-code-approvals-endpoint.yml
+++ /dev/null
@@ -1,30 +0,0 @@
-# This is a template for announcing a feature removal or other important change.
-#
-# Please refer to the deprecation guidelines to confirm your understanding of GitLab's definitions.
-# https://docs.gitlab.com/ee/development/deprecation_guidelines/#terminology
-#
-# If this is a breaking change, it must happen in a major release.
-#
-# For more information please refer to the handbook documentation here:
-# https://about.gitlab.com/handbook/marketing/blog/release-posts/#deprecations-and-other-planned-breaking-change-announcements
-#
-# Please delete this line and above before submitting your merge request.
-#
-# REQUIRED FIELDS
-#
-- title: "`POST /projects/:id/merge_requests/:merge_request_iid/approvals` removed" # (required) Clearly explain the change. For example, "The `confidential` field for a `Note` is removed" or "CI/CD job names are limited to 250 characters."
- announcement_milestone: "12.3" # (required) The milestone when this feature was deprecated.
- removal_milestone: "16.0" # (required) The milestone when this feature is being removed.
- breaking_change: true # (required) Change to false if this is not a breaking change.
- reporter: tlinz # (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/353097 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- The `/approvals` endpoint was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/11132) in GitLab 12.3. To change the approvals required for a merge request via the API, use the `/approval_rules` endpoint described in [Create merge request level rule](https://docs.gitlab.com/ee/api/merge_request_approvals.html#create-merge-request-level-rule).
-#
-# OPTIONAL FIELDS
-#
- tiers: [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]
- documentation_url: https://docs.gitlab.com/ee/api/merge_request_approvals.html#create-merge-request-level-rule # (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/16_0/16-0-source-code-branch-push.yml b/data/removals/16_0/16-0-source-code-branch-push.yml
deleted file mode 100644
index ee32a486db1..00000000000
--- a/data/removals/16_0/16-0-source-code-branch-push.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-- title: "GitLab administrators must have permission to modify protected branches or tags"
- announcement_milestone: "16.0"
- removal_milestone: "16.0"
- breaking_change: true
- reporter: tlinz
- stage: Create
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/12776
- body: | # (required) Do not modify this line, instead modify the lines below.
- GitLab administrators can no longer perform actions on protected branches or tags unless they have been explicitly granted that permission. These actions include pushing and merging into a [protected branch](https://docs.gitlab.com/ee/user/project/protected_branches.html), unprotecting a branch, and creating [protected tags](https://docs.gitlab.com/ee/user/project/protected_tags.html).
-#
-# OPTIONAL FIELDS
-#
- 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/protected_branches.html
- 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/16_0/16-0-source-code-routes.yml b/data/removals/16_0/16-0-source-code-routes.yml
deleted file mode 100644
index d45d15e2e00..00000000000
--- a/data/removals/16_0/16-0-source-code-routes.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-# This is a template for announcing a feature removal or other important change.
-#
-# Please refer to the deprecation guidelines to confirm your understanding of GitLab's definitions.
-# https://docs.gitlab.com/ee/development/deprecation_guidelines/#terminology
-#
-# If this is a breaking change, it must happen in a major release.
-#
-# For more information please refer to the handbook documentation here:
-# https://about.gitlab.com/handbook/marketing/blog/release-posts/#deprecations-and-other-planned-breaking-change-announcements
-#
-# Please delete this line and above before submitting your merge request.
-#
-# REQUIRED FIELDS
-#
-- title: "Legacy routes removed" # (required) Clearly explain the change. For example, "The `confidential` field for a `Note` is removed" or "CI/CD job names are limited to 250 characters."
- announcement_milestone: "15.9" # (required) The milestone when this feature was deprecated.
- removal_milestone: "16.0" # (required) The milestone when this feature is being removed.
- breaking_change: true # (required) Change to false if this is not a breaking change.
- reporter: tlinz # (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/214217 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- GitLab 16.0 removes legacy URLs from the GitLab application.
-
- When subgroups were introduced in GitLab 9.0, a `/-/` delimiter was added to URLs to signify the end of a group path. All GitLab URLs now use this delimiter for project, group, and instance level features.
-
- URLs that do not use the `/-/` delimiter are planned for removal in GitLab 16.0. For the full list of these URLs, along with their replacements, see [issue 28848](https://gitlab.com/gitlab-org/gitlab/-/issues/28848#release-notes).
-
- Update any scripts or bookmarks that reference the legacy URLs. GitLab APIs are not affected by this change.
-#
-# OPTIONAL FIELDS
-#
- 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://gitlab.com/gitlab-org/gitlab/-/issues/28848#release-notes # (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/16_0/16-0-starboard-directive.yml b/data/removals/16_0/16-0-starboard-directive.yml
deleted file mode 100644
index af968e3af76..00000000000
--- a/data/removals/16_0/16-0-starboard-directive.yml
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# REQUIRED FIELDS
-#
-- title: "Starboard directive in the config for the GitLab agent for Kubernetes removed" # (required) Clearly explain the change. For example, "The `confidential` field for a `Note` is removed" or "CI/CD job names are limited to 250 characters."
- announcement_milestone: "15.4" # (required) The milestone when this feature was deprecated.
- removal_milestone: "16.0" # (required) The milestone when this feature is being removed.
- breaking_change: true # (required) Change to false if this is not a breaking change.
- reporter: gonzoyumo # (required) GitLab username of the person reporting the removal
- 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/368828 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- The GitLab operational container scanning feature no longer requires you to install Starboard. The `starboard:` directive in configuration files for the GitLab agent for Kubernetes has been removed. Use the `container_scanning:` directive instead.
-#
-# OPTIONAL FIELDS
-#
- tiers: # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
- documentation_url: # (optional) This is a link to the current documentation page
- image_url: # (optional) This is a link to a thumbnail image depicting the feature
- video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg
diff --git a/data/removals/16_0/16-0-terraform-latest-stable-change.yml b/data/removals/16_0/16-0-terraform-latest-stable-change.yml
deleted file mode 100644
index 0025a575a1d..00000000000
--- a/data/removals/16_0/16-0-terraform-latest-stable-change.yml
+++ /dev/null
@@ -1,21 +0,0 @@
-- title: "The stable Terraform CI/CD template has been replaced with the latest template"
- announcement_milestone: "15.8" # (required) The milestone when this feature was deprecated.
- removal_milestone: "16.0" # (required) The milestone when this feature is being removed.
- breaking_change: true # (required) Change to false if this is not a breaking change.
- reporter: timofurrer # (required) GitLab username of the person reporting the removal
- stage: deploy # (required) String value of the stage that the feature was created in. e.g., Growth
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/386001 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- With every major GitLab version, we update the stable Terraform templates with the current latest templates.
- This change affects the [quickstart](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform.gitlab-ci.yml)
- and the [base](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform/Base.gitlab-ci.yml) templates.
-
- The new templates do not change the directory to `$TF_ROOT` explicitly: `gitlab-terraform` gracefully
- handles directory changing. If you altered the job scripts to assume that the current working directory is `$TF_ROOT`, you must manually add `cd "$TF_ROOT"` now.
-
- Because the latest template introduces Merge Request Pipeline support which is not supported in Auto DevOps,
- those rules are not yet integrated into the stable template.
- However, we may introduce them later on, which may break your Terraform pipelines in regards to which jobs are executed.
-
- To accommodate the changes, you might need to adjust the [`rules`](https://docs.gitlab.com/ee/ci/yaml/#rules) in your
- `.gitlab-ci.yml` file.
diff --git a/data/removals/16_0/16-0-ttl-days-removal.yml b/data/removals/16_0/16-0-ttl-days-removal.yml
deleted file mode 100644
index 213e58017c4..00000000000
--- a/data/removals/16_0/16-0-ttl-days-removal.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-- title: "Default value of `ttl_days` now 30 days"
- announcement_milestone: "15.4" # (required) The milestone when this feature was deprecated.
- removal_milestone: "16.0" # (required) The milestone when this feature is being removed.
- breaking_change: true # (required) Change to false if this is not a breaking change.
- reporter: tlinz
- 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/369122 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- From GitLab 16.0, any personal, project, or group access token [must have an expiration date](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/96594). If you create a personal access token with the GitLab Shell command `personal_access_token` without specifying `ttl_days`, a default value of 30 days is now applied.
-#
-# OPTIONAL FIELDS
-#
- tiers: [Core, Premium, Ultimate]
- documentation_url: https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html
- image_url:
- video_url:
diff --git a/data/removals/16_0/16-0-vulnerability-confidence-field.yml b/data/removals/16_0/16-0-vulnerability-confidence-field.yml
deleted file mode 100644
index fe34947386d..00000000000
--- a/data/removals/16_0/16-0-vulnerability-confidence-field.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-- title: "Vulnerability confidence field"
- announcement_milestone: "15.4"
- removal_milestone: "16.0"
- breaking_change: true
- reporter: abellucci
- stage: Govern
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/372332
- body: |
- In GitLab 15.3, [security report schemas below version 15 were deprecated](https://docs.gitlab.com/ee/update/deprecations.html#security-report-schemas-version-14xx).
- The `confidence` attribute on vulnerability findings exists only in schema versions before `15-0-0` and in GitLab prior to 15.4. To maintain consistency
- between the reports and our public APIs, the `confidence` attribute on any vulnerability-related components of our GraphQL API is now removed.
diff --git a/data/removals/16_0/16-0-vulnerabilityFindingDismiss-GraphQL-mutation.yml b/data/removals/16_0/16-0-vulnerabilityFindingDismiss-GraphQL-mutation.yml
deleted file mode 100644
index cb5bb21ea74..00000000000
--- a/data/removals/16_0/16-0-vulnerabilityFindingDismiss-GraphQL-mutation.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-- title: "vulnerabilityFindingDismiss GraphQL mutation"
- announcement_milestone: "15.5"
- removal_milestone: "16.0"
- breaking_change: true
- reporter: abellucci
- stage: Govern
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/375645
- body: |
- The `VulnerabilityFindingDismiss` GraphQL mutation has been removed. This mutation was not used often as the Vulnerability Finding ID was not available to users (this field was [deprecated in 15.3](https://docs.gitlab.com/ee/update/deprecations.html#use-of-id-field-in-vulnerabilityfindingdismiss-mutation)). Instead of `VulnerabilityFindingDismiss`, you should use `VulnerabilityDismiss` to dismiss vulnerabilities in the Vulnerability Report or `SecurityFindingDismiss` for security findings in the CI Pipeline Security tab.
- tiers: [Ultimate]
- documentation_url: https://docs.gitlab.com/ee/api/graphql/reference/index.html#mutationvulnerabilityfindingdismiss
diff --git a/data/removals/16_0/16-0-vulnerabilityFindingDismiss-mutation.yml b/data/removals/16_0/16-0-vulnerabilityFindingDismiss-mutation.yml
deleted file mode 100644
index dd9de9e118b..00000000000
--- a/data/removals/16_0/16-0-vulnerabilityFindingDismiss-mutation.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-- title: "Use of `id` field in vulnerabilityFindingDismiss mutation"
- announcement_milestone: "15.3"
- removal_milestone: "16.0"
- breaking_change: true
- reporter: abellucci
- stage: Govern
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/367166
- body: |
- You can use the vulnerabilityFindingDismiss GraphQL mutation to set the status of a vulnerability finding to `Dismissed`. Previously, this mutation used the `id` field to identify findings uniquely. However, this did not work for dismissing findings from the pipeline security tab. Therefore, using the `id` field as an identifier has been dropped in favor of the `uuid` field. Using the 'uuid' field as an identifier allows you to dismiss the finding from the pipeline security tab.
- tiers: Ultimate
- documentation_url: https://docs.gitlab.com/ee/api/graphql/reference/index.html#mutationvulnerabilityfindingdismiss
diff --git a/data/removals/16_0/16-00-JWT-limit-setting.yml b/data/removals/16_0/16-00-JWT-limit-setting.yml
deleted file mode 100644
index d8e3ccb359a..00000000000
--- a/data/removals/16_0/16-00-JWT-limit-setting.yml
+++ /dev/null
@@ -1,21 +0,0 @@
-#
-# REQUIRED FIELDS
-#
-- title: "Secure JWT token setting is removed" # (required) Clearly explain the change. For example, "The `confidential` field for a `Note` is removed" or "CI/CD job names are limited to 250 characters."
- announcement_milestone: "15.9" # (required) The milestone when this feature was deprecated.
- removal_milestone: "16.0" # (required) The milestone when this feature is being removed.
- breaking_change: true # (required) Change to false if this is not a breaking change.
- reporter: jocelynjane # (required) GitLab username of the person reporting the removal
- stage: verify # (required) String value of the stage that the feature was created in. e.g., Growth
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/366798 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- As part of [the deprecation of old versions of JSON web tokens](https://docs.gitlab.com/ee/update/deprecations.html#old-versions-of-json-web-tokens-are-deprecated), the **Limit JSON Web Token (JWT)** project setting has been removed. This setting was a temporary solution to help users transition to [ID tokens](https://docs.gitlab.com/ee/ci/secrets/id_token_authentication.html), as a way to switch between the old and new tokens, but the setting is no longer needed. In GitLab 16.0 and later, you can simply start using ID tokens in any job. When you use the `id_tokens` keyword in a job, that job uses only ID tokens and the old `CI_JOB_JWT*` tokens are not available. In jobs that do not use the `id_tokens` keyword, the old behavior remains unchanged.
-
- The old `CI_JOB_JWT*` tokens will be completely removed in GitLab 16.5, so you must switch to ID tokens before that release.
-#
-# OPTIONAL FIELDS
-#
- tiers: # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
- documentation_url: # (optional) This is a link to the current documentation page
- image_url: # (optional) This is a link to a thumbnail image depicting the feature
- video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg
diff --git a/data/removals/16_0/16.0-config-fields-runner-helm-chart.yml b/data/removals/16_0/16.0-config-fields-runner-helm-chart.yml
deleted file mode 100644
index 63c50842a0d..00000000000
--- a/data/removals/16_0/16.0-config-fields-runner-helm-chart.yml
+++ /dev/null
@@ -1,39 +0,0 @@
-- title: "Remove legacy configuration fields in GitLab Runner Helm Chart" # (required) Clearly explain the change. For example, "The `confidential` field for a `Note` is removed" or "CI/CD job names are limited to 250 characters."
- announcement_milestone: "15.6" # (required) The milestone when this feature was deprecated.
- removal_milestone: "16.0" # (required) The milestone when this feature is being removed.
- breaking_change: false # (required) Change to false if this is not a breaking change.
- reporter: DarrenEastman # (required) GitLab username of the person reporting the removal
- stage: Verify # (required) String value of the stage that the feature was created in. e.g., Growth
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/379064 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- In GitLab 13.6 and later, users can [specify any runner configuration in the GitLab Runner Helm chart](https://docs.gitlab.com/runner/install/kubernetes.html). When this features was released, we deprecated the fields in the GitLab Helm Chart configuration specific to the runner. As of v1.0 of the GitLab Runner Helm chart (GitLab 16.0), the following fields have been removed and are no longer supported:
-
- - `image`
- - `rbac.resources`
- - `rbac.verbs`
- - `runners.image`
- - `runners.imagePullSecrets`
- - `runners.imagePullPolicy`
- - `runners.requestConcurrency`
- - `runners.privileged`
- - `runners.namespace`
- - `runners.pollTimeout`
- - `runners.outputLimit`
- - `runners.cache.cacheType`
- - `runners.cache.cachePath`
- - `runners.cache.cacheShared`
- - `runners.cache.s3ServerAddress`
- - `runners.cache.s3BucketLocation`
- - `runners.cache.s3CacheInsecure`
- - `runners.cache.gcsBucketName`
- - `runners.builds`
- - `runners.services`
- - `runners.helpers`
- - `runners.pod_security_context`
- - `runners.serviceAccountName`
- - `runners.cloneUrl`
- - `runners.nodeSelector`
- - `runners.nodeTolerations`
- - `runners.podLabels`
- - `runners.podAnnotations`
- - `runners.env`
diff --git a/data/removals/16_0/16.0-docker-ssh-executors.yml b/data/removals/16_0/16.0-docker-ssh-executors.yml
deleted file mode 100644
index ec3650c1d1c..00000000000
--- a/data/removals/16_0/16.0-docker-ssh-executors.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-- title: "`docker-ssh` and `docker-ssh+machine` executors are removed" # (required) Clearly explain the change. For example, "The `confidential` field for a `Note` is removed" or "CI/CD job names are limited to 250 characters."
- announcement_milestone: "10.0" # (required) The milestone when this feature was deprecated.
- removal_milestone: "16.0" # (required) The milestone when this feature is being removed.
- breaking_change: false # (required) Change to false if this is not a breaking change.
- reporter: DarrenEastman # (required) GitLab username of the person reporting the removal
- stage: Verify # (required) String value of the stage that the feature was created in. e.g., Growth
- issue_url: https://gitlab.com/gitlab-org/gitlab-runner/-/issues/29406 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- In GitLab 16.0 and later, the `docker-ssh` and `docker+machine-ssh` executors for GitLab Runner have been removed from the GitLab Runner [code base](https://gitlab.com/gitlab-org/gitlab-runner).
diff --git a/data/removals/16_0/16.0-eol-windows-server-2004-and-20H2.yml b/data/removals/16_0/16.0-eol-windows-server-2004-and-20H2.yml
deleted file mode 100644
index 267304f6a13..00000000000
--- a/data/removals/16_0/16.0-eol-windows-server-2004-and-20H2.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-- title: "Stop publishing GitLab Runner images based on Windows Server 2004 and 20H2" # (required) Clearly explain the change. For example, "The `confidential` field for a `Note` is removed" or "CI/CD job names are limited to 250 characters."
- announcement_milestone: "16.0" # (required) The milestone when this feature was deprecated.
- removal_milestone: "16.0" # (required) The milestone when this feature is being removed.
- breaking_change: false # (required) Change to false if this is not a breaking change.
- reporter: DarrenEastman # (required) GitLab username of the person reporting the removal
- stage: Verify # (required) String value of the stage that the feature was created in. e.g., Growth
- issue_url: https://gitlab.com/gitlab-org/gitlab-runner/-/issues/31001 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- As of GitLab 16.0, GitLab Runner images based on Windows Server 2004 and 20H2 will not be provided as these operating systems are end-of-life.
diff --git a/data/removals/16_0/16.0-pre-clone-script-gitlab-saas.yml b/data/removals/16_0/16.0-pre-clone-script-gitlab-saas.yml
deleted file mode 100644
index 062c86e1fd3..00000000000
--- a/data/removals/16_0/16.0-pre-clone-script-gitlab-saas.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-- title: "`CI_PRE_CLONE_SCRIPT` variable on GitLab SaaS Runners has been removed" # (required) Clearly explain the change. For example, "The `confidential` field for a `Note` is removed" or "CI/CD job names are limited to 250 characters."
- announcement_milestone: "15.9" # (required) The milestone when this feature was deprecated.
- removal_milestone: "16.0" # (required) The milestone when this feature is being removed.
- breaking_change: true # (required) Change to false if this is not a breaking change.
- reporter: DarrenEastman # (required) GitLab username of the person reporting the removal
- stage: Verify # (required) String value of the stage that the feature was created in. e.g., Growth
- issue_url: https://gitlab.com/gitlab-org/gitlab-runner/-/issues/29405 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- In GitLab 16.0 and later, the `CI_PRE_CLONE_SCRIPT` variable option on GitLab SaaS Runners has been removed. The `CI_PRE_CLONE_SCRIPT` variable enabled you to run commands in your CI/CD job before the runner executed `git-init` and `git-fetch`. You should use the `pre_get_sources_script` hook instead. For more information, see the blog post, [Guide to pre_clone_script changes on GitLab SaaS Linux Runners](https://about.gitlab.com/blog/2023/03/27/changes-to-the-preclonescript/).
diff --git a/data/removals/16_0/16.0-runner-api-does-not-return-paused-active.yml b/data/removals/16_0/16.0-runner-api-does-not-return-paused-active.yml
deleted file mode 100644
index 7da64404eb3..00000000000
--- a/data/removals/16_0/16.0-runner-api-does-not-return-paused-active.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-- title: "GraphQL API: Runner status no longer returns `PAUSED` and `ACTIVE` values" # (required) Clearly explain the change. For example, "The `confidential` field for a `Note` is removed" or "CI/CD job names are limited to 250 characters."
- announcement_milestone: "14.8" # (required) The milestone when this feature was deprecated.
- removal_milestone: "16.0" # (required) The milestone when this feature is being removed.
- breaking_change: true # (required) Change to false if this is not a breaking change.
- reporter: DarrenEastman # (required) GitLab username of the person reporting the removal
- stage: Verify # (required) String value of the stage that the feature was created in. e.g., Growth
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/344648 # (required) Link to the deprecation issue in GitLab
- body: | # (required) Do not modify this line, instead modify the lines below.
- In GitLab 16.0 and later, the GraphQL query for runners will no longer return the statuses `PAUSED` and `ACTIVE`.
-
- - `PAUSED` has been replaced with the field, `paused: true`.
- - `ACTIVE` has been replaced with the field, `paused: false`.
diff --git a/data/removals/templates/_removal_template.md.erb b/data/removals/templates/_removal_template.md.erb
deleted file mode 100644
index aa2ae993f45..00000000000
--- a/data/removals/templates/_removal_template.md.erb
+++ /dev/null
@@ -1,57 +0,0 @@
----
-stage: none
-group: none
-info: "See the Technical Writers assigned to Development Guidelines: https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments-to-development-guidelines"
----
-
-# Removals by version
-
-In each release, GitLab removes features that were [deprecated](deprecations.md) in an earlier release.
-Some features cause breaking changes when they are removed.
-
-**{rss}** **To be notified of upcoming breaking changes**,
-add this URL to your RSS feed reader: `https://about.gitlab.com/breaking-changes.xml`
-
-<!-- vale off -->
-
-<!--
-DO NOT EDIT THIS PAGE DIRECTLY
-
-This page is automatically generated from the YAML files in `/data/removals` by the rake task
-located at `lib/tasks/gitlab/docs/compile_removals.rake`.
-
-For removal authors (usually Product Managers and Engineering Managers):
-
-- To add a removal, use the example.yml file in `/data/removals/templates` as a template.
-- For more information about authoring removals, check the the removal item guidance:
- https://about.gitlab.com/handbook/marketing/blog/release-posts/#creating-a-removal-entry
-
-For removal reviewers (Technical Writers only):
-
-- To update the removal doc, run: `bin/rake gitlab:docs:compile_removals`
-- To verify the removals doc is up to date, run: `bin/rake gitlab:docs:check_removals`
-- For more information about updating the removal doc, see the removal doc update guidance:
- https://about.gitlab.com/handbook/marketing/blog/release-posts/#update-the-removals-doc
--->
-
-{::options parse_block_html="true" /}
-<% if milestones.any? -%>
- <%- milestones.each do |milestone| %>
-## Removed in <%= milestone %>
- <%- entries.select{|entry| entry["removal_milestone"] == milestone}.each do |removal| %>
-### <%= removal["title"]%>
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"><%= removal["announcement_milestone"]%></span>
-<% if removal["breaking_change"] -%>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-<%- end -%>
-<% if removal["issue_url"] -%>
-- To discuss this change or learn more, see the [deprecation issue](<%= removal["issue_url"]%>).
-<%- end -%>
-</div>
-
-<%= removal["body"] -%><%- end -%><%- end -%>
-<%- else -%>
-Features scheduled for removal will be listed here, sorted by GitLab version.
-<% end -%>
diff --git a/data/removals/templates/example.yml b/data/removals/templates/example.yml
deleted file mode 100644
index c536d8276d9..00000000000
--- a/data/removals/templates/example.yml
+++ /dev/null
@@ -1,45 +0,0 @@
-# This is a template for announcing a feature removal or other important change.
-#
-# Please refer to the deprecation guidelines to confirm your understanding of GitLab's definitions.
-# https://docs.gitlab.com/ee/development/deprecation_guidelines/#terminology
-#
-# If this is a breaking change, it must happen in a major release.
-#
-# For more information please refer to the handbook documentation here:
-# https://about.gitlab.com/handbook/marketing/blog/release-posts/#deprecations-and-other-planned-breaking-change-announcements
-#
-# Please delete this line and above before submitting your merge request.
-#
-# REQUIRED FIELDS
-#
-- title: "Feature A is removed." # (required) Clearly explain the change. For example, "The `confidential` field for a `Note` is removed" or "CI/CD job names are limited to 250 characters."
- announcement_milestone: "XX.YY" # (required) The milestone when this feature was deprecated.
- removal_milestone: "XX.YY" # (required) The milestone when this feature is being removed.
- breaking_change: true # (required) Change to false if this is not 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
-
- Be clear and concise. Give a brief explanation of the details or reasons for the change.
-
- Additionally, removals and other planned changes should be actionable, so add details that explain what users need to do to address the change. For example:
-
- - "Use the `internal` keyword instead of `confidential`."
- - "Reduce the number of characters in all job names to be 250 characters or less."
- - "Give an expiration date to any access tokens that have no expiration date."
- - "Stop using the `omniauth_crowd` gem. It has been removed and will not be replaced."
-
- When ready, assign to your tech writer for review. When ready, they will run `bin/rake gitlab:docs:compile_removals` to update the removals doc, then merge.
-
- This area supports markdown. Delete this entire comment and replace it with your markdown content.
-
- END OF BODY COMMENT -->
-#
-# OPTIONAL FIELDS
-#
- tiers: # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
- documentation_url: # (optional) This is a link to the current documentation page
- image_url: # (optional) This is a link to a thumbnail image depicting the feature
- video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg
diff --git a/data/whats_new/202011230001_13_06.yml b/data/whats_new/202011230001_13_06.yml
index 8701a050d4c..d5c3ebc9696 100644
--- a/data/whats_new/202011230001_13_06.yml
+++ b/data/whats_new/202011230001_13_06.yml
@@ -59,7 +59,7 @@
self-managed: true
gitlab-com: true
available_in: [Free, Premium, Ultimate]
- documentation_link: https://docs.gitlab.com/ee/user/admin_area/settings/project_integration_management.html
+ documentation_link: https://docs.gitlab.com/ee/administration/settings/project_integration_management.html
image_url: https://about.gitlab.com/images/13_6/project-integration-inheriting-settings.png
published_at: 2020-11-22
release: 13.6
diff --git a/data/whats_new/202105220001_13_12.yml b/data/whats_new/202105220001_13_12.yml
index bcb2da40f63..78faf0dde8d 100644
--- a/data/whats_new/202105220001_13_12.yml
+++ b/data/whats_new/202105220001_13_12.yml
@@ -121,7 +121,7 @@
self-managed: true
gitlab-com: true
available_in: [Free, Premium, Ultimate]
- documentation_link: https://docs.gitlab.com/ee/user/admin_area/settings/floc.html
+ documentation_link: https://docs.gitlab.com/ee/administration/settings/floc.html
image_url: https://about.gitlab.com/images/growth/enablement.png
published_at: 2021-05-22
release: 13.12
diff --git a/data/whats_new/202106220001_14_0.yml b/data/whats_new/202106220001_14_0.yml
index 62bb78cecbb..56244eb65c1 100644
--- a/data/whats_new/202106220001_14_0.yml
+++ b/data/whats_new/202106220001_14_0.yml
@@ -43,12 +43,12 @@
description: |
Code Owners are an important piece of the code review process in GitLab. When code owners are clearly identified, contributors can see who should review contributions to a file or repository. The Code Owners feature can also be used to establish a merge request approval process. Now, you can track which teams across your organization are using the Code Owners feature in their development workflow.
- If you would like to drive adoption of Code Owners, sort the DevOps Adoption table by the Code Owners column to find teams that haven't yet adopted the feature so you can easily identify which teams need help getting started. Alternatively, find teams that have successfully configured Code Owners and get tips and feedback. The DevOps Adoption table is available at [the group level](https://docs.gitlab.com/ee/user/group/devops_adoption/) and [the instance level](https://docs.gitlab.com/ee/user/admin_area/analytics/dev_ops_report.html#devops-adoption).
+ If you would like to drive adoption of Code Owners, sort the DevOps Adoption table by the Code Owners column to find teams that haven't yet adopted the feature so you can easily identify which teams need help getting started. Alternatively, find teams that have successfully configured Code Owners and get tips and feedback. The DevOps Adoption table is available at [the group level](https://docs.gitlab.com/ee/user/group/devops_adoption/) and [the instance level](https://docs.gitlab.com/ee/administration/analytics/dev_ops_report.html#devops-adoption).
stage: Manage
self-managed: true
gitlab-com: true
available_in: [Ultimate]
- documentation_link: https://docs.gitlab.com/ee/user/admin_area/analytics/dev_ops_report#devops-adoption
+ documentation_link: https://docs.gitlab.com/ee/administration/analytics/dev_ops_report#devops-adoption
image_url: https://about.gitlab.com/images/14_0/codeownersadoption.png
published_at: 2021-06-22
release: 14.0
diff --git a/data/whats_new/202107220001_14_1.yml b/data/whats_new/202107220001_14_1.yml
index 32764b98803..328aed1629e 100644
--- a/data/whats_new/202107220001_14_1.yml
+++ b/data/whats_new/202107220001_14_1.yml
@@ -47,7 +47,7 @@
self-managed: true
gitlab-com: true
available_in: [Premium, Ultimate]
- documentation_link: 'https://docs.gitlab.com/ee/ci/pipelines/settings.html#coverage-check-approval-rule'
+ documentation_link: 'https://docs.gitlab.com/ee/ci/testing/code_coverage.html#coverage-check-approval-rule'
image_url: https://about.gitlab.com/images/14_1/coverage-mr-approval-rule.png
published_at: 2021-07-22
release: 14.1
diff --git a/data/whats_new/202108190001_14_02.yml b/data/whats_new/202108190001_14_02.yml
index bb9c8becd06..cac7ae77a2e 100644
--- a/data/whats_new/202108190001_14_02.yml
+++ b/data/whats_new/202108190001_14_02.yml
@@ -11,7 +11,7 @@
release: 14.2
- name: View historical CI pipeline minute usage
description: |
- Before GitLab 14.2, the CI pipeline minutes usage on the [Usage Quotas](https://docs.gitlab.com/ee/user/admin_area/settings/continuous_integration.html#shared-runners-pipeline-minutes-quota) page only showed the current month's usage. This data would reset every month and there was no way to view activity from the past months for analyzing historical usage.
+ Before GitLab 14.2, the CI pipeline minutes usage on the [Usage Quotas](https://docs.gitlab.com/ee/administration/settings/continuous_integration.html#shared-runners-pipeline-minutes-quota) page only showed the current month's usage. This data would reset every month and there was no way to view activity from the past months for analyzing historical usage.
Now there are two charts that show historical CI pipeline minutes usage by month or by project, so you can make informed decisions about your pipeline usage.
stage: Verify
diff --git a/data/whats_new/202202210001_14_08.yml b/data/whats_new/202202210001_14_08.yml
index 206fec03359..778529ffa86 100644
--- a/data/whats_new/202202210001_14_08.yml
+++ b/data/whats_new/202202210001_14_08.yml
@@ -55,7 +55,7 @@
- name: "User impersonation audit events for groups"
description: |
GitLab now provides audit events on the group audit events page for
- [user impersonation](https://docs.gitlab.com/ee/user/admin_area/#user-impersonation) starting and stopping. This was previously
+ [user impersonation](https://docs.gitlab.com/ee/administration/#user-impersonation) starting and stopping. This was previously
only available on a page unavailable to GitLab SaaS customers. We are excited to bring
it to the group page which allows both self-managed and SaaS users to view these events!
diff --git a/data/whats_new/2022082200001_15_03.yml b/data/whats_new/2022082200001_15_03.yml
index b0a2bf3b6e2..a04db2381ad 100644
--- a/data/whats_new/2022082200001_15_03.yml
+++ b/data/whats_new/2022082200001_15_03.yml
@@ -53,7 +53,7 @@
self-managed: true
gitlab-com: false
available_in: [Premium, Ultimate]
- documentation_link: https://docs.gitlab.com/ee/user/admin_area/settings/sign_up_restrictions.html#password-complexity-requirements
+ documentation_link: https://docs.gitlab.com/ee/administration/settings/sign_up_restrictions.html#password-complexity-requirements
image_url: https://about.gitlab.com/images/15_3/manage-password-complexity-policy.png
published_at: 2022-08-22
release: 15.3
diff --git a/data/whats_new/20230220001_15_08.yml b/data/whats_new/20230220001_15_08.yml
index 30f1f1ea8d7..605b32025b8 100644
--- a/data/whats_new/20230220001_15_08.yml
+++ b/data/whats_new/20230220001_15_08.yml
@@ -24,7 +24,7 @@
self-managed: true
gitlab-com: false
available_in: [Premium, Ultimate]
- documentation_link: https://docs.gitlab.com/ee/user/admin_area/settings/scim_setup.html
+ documentation_link: https://docs.gitlab.com/ee/administration/settings/scim_setup.html
image_url: https://about.gitlab.com/images/15_8/manage-scim-token.png
published_at: 2023-01-22
release: 15.8
diff --git a/data/whats_new/202306220001_16_1.yml b/data/whats_new/202306220001_16_1.yml
new file mode 100644
index 00000000000..cd14713143a
--- /dev/null
+++ b/data/whats_new/202306220001_16_1.yml
@@ -0,0 +1,98 @@
+- name: All new navigation experience
+ description: | # Do not modify this line, instead modify the lines below.
+ GitLab 16.1 features an all-new navigation experience! We've defaulted this experience to on for all users. To get started, go to your avatar in the top right of the UI and turn on the **New navigation** toggle.
+
+ The new navigation was designed to solve three key areas of feedback: navigating GitLab can be overwhelming, it can be hard to pick up where you left off, and you can't customize the navigation.
+
+ The new navigation includes a streamlined and improved left sidebar, where you can:
+
+ * Pin 📌 frequently accessed items.
+ * Completely hide the sidebar and "peek" it back into view.
+ * Easily switch contexts, search, and view subsets of data with the new **Your Work** and **Explore** options.
+ * Scan more quickly because of fewer top-level menu items.
+
+ We are proud of the new navigation and can't wait to see what you think. Review a [list of what's changed](https://gitlab.com/groups/gitlab-org/-/epics/9044#whats-different) and read our blog posts about the navigation [vision](https://about.gitlab.com/blog/2023/05/01/gitlab-product-navigation/) and [design](https://about.gitlab.com/blog/2023/05/15/overhauling-the-navigation-is-like-building-a-dream-home/).
+
+ Please try the new navigation and let us know about your experience in [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/409005). We are already [addressing](https://gitlab.com/gitlab-org/gitlab/-/issues/409005#actions-we-are-taking-from-the-feedback) the feedback and will eventually remove the toggle.
+ stage: Manage
+ self-managed: true
+ gitlab-com: true
+ available_in: [Free, Premium, Ultimate]
+ documentation_link: https://docs.gitlab.com/ee/tutorials/left_sidebar/index.html
+ image_url: https://img.youtube.com/vi/rGTl9_HIpbY/hqdefault.jpg
+ published_at: 2023-06-22
+ release: 16.1
+
+- name: Visualize Kubernetes resources in GitLab
+ description: | # Do not modify this line, instead modify the lines below.
+ How do you check the status of the applications running in your clusters? The pipeline status and environment pages provide insights about the latest deployment runs. However, previous versions of GitLab lacked insights about the state of your deployments. In GitLab 16.1, you can see an overview of the primary resources in your Kubernetes deployments.
+
+ This feature works with every connected Kubernetes cluster. It doesn't matter if you deploy your workloads with the CI/CD integration or GitOps. To further improve the feature for Flux users, support for showing the synchronization status of an environment is proposed in [issue 391581](https://gitlab.com/gitlab-org/gitlab/-/issues/391581). There are many use cases for which a non-human user might need to authenticate. Previously, depending on the desired scope, users could use personal, project, or group access tokens to meet this need. These tokens were not ideal, due to still being either tied to a human (for personal access tokens), or an unnecessarily privileged role (for group and project access tokens).
+ stage: Deploy
+ self-managed: true
+ gitlab-com: true
+ available_in: [Free, Premium, Ultimate]
+ documentation_link: https://docs.gitlab.com/ee/ci/environments/kubernetes_dashboard.html
+ image_url: https://about.gitlab.com/images/16_1/whats-new-k8s-visualization.png
+ published_at: 2023-06-22
+ release: 16.1
+
+- name: Authenticate with service accounts
+ description: | # Do not modify this line, instead modify the lines below.
+ There are many use cases for which a non-human user might need to authenticate. Previously, depending on the desired scope, users could use personal, project, or group access tokens to meet this need. These tokens were not ideal, due to still being either tied to a human (for personal access tokens), or an unnecessarily privileged role (for group and project access tokens).
+
+ Service accounts are not tied to a human user, and are more granular in scope. Service account creation and management is API-only. Support for a UI option is proposed in [issue 9965](https://gitlab.com/groups/gitlab-org/-/epics/9965).
+ stage: Manage
+ self-managed: true
+ gitlab-com: true
+ available_in: [Premium, Ultimate]
+ documentation_link: https://docs.gitlab.com/ee/api/groups.html#service-accounts
+ image_url: https://img.youtube.com/vi/oZvjg0SCsqY/hqdefault.jpg
+ published_at: 2023-06-22
+ release: 16.1
+
+- name: GitLab Dedicated is now generally available
+ description: | # Do not modify this line, instead modify the lines below.
+ GitLab Dedicated is a fully managed, single-tenant SaaS deployment of our comprehensive DevSecOps platform designed to address the needs of customers with stringent compliance requirements.
+
+ Customers in highly-regulated industries are unable to adopt multi-tenant SaaS offerings due to strict compliance requirements like data isolation. With GitLab Dedicated, organizations can access all of the benefits of the DevSecOps platform – including faster releases, better security, and more productive developers – while satisfying compliance requirements such as data residency, isolation, and private networking.
+
+ [Learn more](https://about.gitlab.com/dedicated/) about GitLab Dedicated today.
+ stage: Platforms
+ self-managed: true
+ gitlab-com: false
+ available_in: [Ultimate]
+ documentation_link: https://docs.gitlab.com/ee/subscriptions/gitlab_dedicated/
+ image_url: https://about.gitlab.com/images/16_1/gitlab-dedicated.png
+ published_at: 2023-06-22
+ release: 16.1
+
+- name: Manage job artifacts though the Artifacts page
+ description: | # Do not modify this line, instead modify the lines below.
+ Previously, if you wanted to view or manage job artifacts, you had to go to each job's detail page, or use the API. Now, you can view and manage job artifacts through the **Artifacts** page accessed at **Build > Artifacts**.
+
+ Users with at least the Maintainer role can use this new interface to delete artifacts too. You can delete individual artifacts, or bulk delete up to 100 artifacts at a time through either manual selection or checking the **Select all** option at the top of the page.
+
+ Please use the survey at the top of the Artifacts page to share any feedback you have about this new functionality. To view additional UI features under consideration, you can check out the [Build Artifacts page enhancements epic](https://gitlab.com/groups/gitlab-org/-/epics/8311).
+ stage: Verify
+ self-managed: true
+ gitlab-com: true
+ available_in: [Free, Premium, Ultimate]
+ documentation_link: https://docs.gitlab.com/ee/ci/jobs/job_artifacts.html#view-all-job-artifacts-in-a-project
+ image_url: https://about.gitlab.com/images/16_1/artifacts-bulk-delete.png
+ published_at: 2023-06-22
+ release: 16.1
+
+- name: Improved CI/CD variables list view
+ description: | # Do not modify this line, instead modify the lines below.
+ CI/CD variables are a key part of all pipelines and can be defined in multiple places, including in the project and group settings. To prepare for making bigger improvements that will help users intuitively navigate between variables at different hierarchy, we are starting out with improving the usability and layout of the variable list.
+
+ In GitLab 16.1, you will see the first iteration of these improvements. We have merged the "Type" and "Options" columns into a new **Attributes** column, which better represents these related attributes. We appreciate your feedback on how we can continue to improve the CI/CD variable experience, you are welcome to comment in our [variables improvement epic](https://gitlab.com/groups/gitlab-org/-/epics/10506).
+ stage: Verify
+ self-managed: true
+ gitlab-com: true
+ available_in: [Free, Premium, Ultimate]
+ documentation_link: https://docs.gitlab.com/ee/ci/variables/#define-a-cicd-variable-in-the-ui
+ image_url: https://about.gitlab.com/images/16_1/layout_changes.png
+ published_at: 2023-06-22
+ release: 16.1
diff --git a/db/click_house/main/20230705124511_create_events.sql b/db/click_house/main/20230705124511_create_events.sql
new file mode 100644
index 00000000000..45e0139165a
--- /dev/null
+++ b/db/click_house/main/20230705124511_create_events.sql
@@ -0,0 +1,15 @@
+CREATE TABLE events
+(
+ id UInt64 DEFAULT 0,
+ path String DEFAULT '',
+ author_id UInt64 DEFAULT 0,
+ target_id UInt64 DEFAULT 0,
+ target_type LowCardinality(String) DEFAULT '',
+ action UInt8 DEFAULT 0,
+ created_at DateTime64(6, 'UTC') DEFAULT now(),
+ updated_at DateTime64(6, 'UTC') DEFAULT now()
+)
+ENGINE = ReplacingMergeTree(updated_at)
+PRIMARY KEY (id)
+ORDER BY (id)
+PARTITION BY toYear(created_at)
diff --git a/db/database_connections/ci.yaml b/db/database_connections/ci.yaml
index daa155dcb00..5331765214e 100644
--- a/db/database_connections/ci.yaml
+++ b/db/database_connections/ci.yaml
@@ -4,6 +4,11 @@ gitlab_schemas:
- gitlab_internal
- gitlab_shared
- gitlab_ci
+lock_gitlab_schemas:
+ - gitlab_main
+ - gitlab_main_clusterwide
+ - gitlab_main_cell
+ - gitlab_pm
klass: Ci::ApplicationRecord
# if CI database is not configured, use this database
fallback_database: main
diff --git a/db/database_connections/main.yaml b/db/database_connections/main.yaml
index dfdd50eb085..9eadd26ec26 100644
--- a/db/database_connections/main.yaml
+++ b/db/database_connections/main.yaml
@@ -6,6 +6,8 @@ gitlab_schemas:
- gitlab_main
- gitlab_main_cell
- gitlab_pm
+lock_gitlab_schemas:
+ - gitlab_ci
# Note that we use ActiveRecord::Base here and not ApplicationRecord.
# This is deliberate, as:
# - the load balancer must be enabled for _all_ models
diff --git a/db/docs/batched_background_migrations/backfill_missing_ci_cd_settings.yml b/db/docs/batched_background_migrations/backfill_missing_ci_cd_settings.yml
new file mode 100644
index 00000000000..aa6ba2684af
--- /dev/null
+++ b/db/docs/batched_background_migrations/backfill_missing_ci_cd_settings.yml
@@ -0,0 +1,6 @@
+---
+migration_job_name: BackfillMissingCiCdSettings
+description: Backfills ci_cd_settings for projects that do not have them
+feature_category: source_code_management
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/issues/393502
+milestone: 16.2
diff --git a/db/docs/batched_background_migrations/backfill_uuid_conversion_column_in_vulnerability_occurrences.yml b/db/docs/batched_background_migrations/backfill_uuid_conversion_column_in_vulnerability_occurrences.yml
new file mode 100644
index 00000000000..43171193f28
--- /dev/null
+++ b/db/docs/batched_background_migrations/backfill_uuid_conversion_column_in_vulnerability_occurrences.yml
@@ -0,0 +1,6 @@
+---
+migration_job_name: BackfillUuidConversionColumnInVulnerabilityOccurrences
+description: backfill values for `uuid_convert_string_to_uuid` column in vulnerability_occurrences table
+feature_category: vulnerability_management
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124986
+milestone: 16.2
diff --git a/db/docs/deleted_tables/sbom_vulnerable_component_versions.yml b/db/docs/deleted_tables/sbom_vulnerable_component_versions.yml
new file mode 100644
index 00000000000..7642cb5ea53
--- /dev/null
+++ b/db/docs/deleted_tables/sbom_vulnerable_component_versions.yml
@@ -0,0 +1,12 @@
+---
+table_name: sbom_vulnerable_component_versions
+classes:
+- Sbom::VulnerableComponentVersion
+feature_categories:
+- dependency_management
+description: Stores information about vulnerable SBoM components
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/95622
+milestone: '15.4'
+removed_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/125426
+removed_in_milestone: '16.2'
+gitlab_schema: gitlab_main
diff --git a/db/docs/deleted_tables/u2f_registrations.yml b/db/docs/deleted_tables/u2f_registrations.yml
new file mode 100644
index 00000000000..a41f0f092b7
--- /dev/null
+++ b/db/docs/deleted_tables/u2f_registrations.yml
@@ -0,0 +1,12 @@
+---
+table_name: u2f_registrations
+classes:
+- U2fRegistration
+feature_categories:
+- system_access
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/791cc9138be6ea1783e3c3853370cf0290f4d41e
+milestone: '8.9'
+removed_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/114576
+removed_in_milestone: '16.1'
+gitlab_schema: gitlab_main
diff --git a/db/docs/deleted_tables/vulnerability_advisories.yml b/db/docs/deleted_tables/vulnerability_advisories.yml
new file mode 100644
index 00000000000..613ab678f35
--- /dev/null
+++ b/db/docs/deleted_tables/vulnerability_advisories.yml
@@ -0,0 +1,13 @@
+---
+table_name: vulnerability_advisories
+classes:
+- Vulnerabilities::Advisory
+feature_categories:
+- container_scanning
+- software_composition_analysis
+description: Stores vulnerability advisories
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/95622
+milestone: '15.4'
+removed_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/125426
+removed_in_milestone: '16.2'
+gitlab_schema: gitlab_main
diff --git a/db/docs/dependency_proxy_packages_settings.yml b/db/docs/dependency_proxy_packages_settings.yml
index dcb43553f81..b506848e899 100644
--- a/db/docs/dependency_proxy_packages_settings.yml
+++ b/db/docs/dependency_proxy_packages_settings.yml
@@ -3,7 +3,7 @@ table_name: dependency_proxy_packages_settings
classes:
- DependencyProxy::Packages::Setting
feature_categories:
-- dependency_proxy
+- package_registry
description: Settings for the dependency proxy for packages.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/120894
milestone: '16.1'
diff --git a/db/docs/external_pull_requests.yml b/db/docs/external_pull_requests.yml
index e3777ae67ba..d0e6bf15eb5 100644
--- a/db/docs/external_pull_requests.yml
+++ b/db/docs/external_pull_requests.yml
@@ -1,7 +1,7 @@
---
table_name: external_pull_requests
classes:
-- ExternalPullRequest
+- Ci::ExternalPullRequest
feature_categories:
- continuous_integration
description: TODO
diff --git a/db/docs/group_wiki_repository_states.yml b/db/docs/group_wiki_repository_states.yml
new file mode 100644
index 00000000000..574224173c9
--- /dev/null
+++ b/db/docs/group_wiki_repository_states.yml
@@ -0,0 +1,10 @@
+---
+table_name: group_wiki_repository_states
+description: Separate table for group wiki verification states
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/126753
+milestone: '16.3'
+feature_categories:
+- geo_replication
+classes:
+- Geo::GroupWikiRepositoryState
+gitlab_schema: gitlab_main
diff --git a/db/docs/merge_request_review_llm_summaries.yml b/db/docs/merge_request_review_llm_summaries.yml
new file mode 100644
index 00000000000..ca8f67cc27b
--- /dev/null
+++ b/db/docs/merge_request_review_llm_summaries.yml
@@ -0,0 +1,11 @@
+---
+table_name: merge_request_review_llm_summaries
+classes:
+- MergeRequest::ReviewLlmSummary
+feature_categories:
+- code_review_workflow
+description: This is the table that stores information about the review summaries
+ produced from different LLM's.
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124402
+milestone: '16.2'
+gitlab_schema: gitlab_main
diff --git a/db/docs/ml_model_versions.yml b/db/docs/ml_model_versions.yml
new file mode 100644
index 00000000000..9e86c9d0bdc
--- /dev/null
+++ b/db/docs/ml_model_versions.yml
@@ -0,0 +1,10 @@
+---
+table_name: ml_model_versions
+classes:
+ - Ml::ModelVersion
+feature_categories:
+ - mlops
+description: A version of a machine learning model for the model registry
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/125729
+milestone: '16.2'
+gitlab_schema: gitlab_main
diff --git a/db/docs/ml_models.yml b/db/docs/ml_models.yml
new file mode 100644
index 00000000000..112a1f9263c
--- /dev/null
+++ b/db/docs/ml_models.yml
@@ -0,0 +1,10 @@
+---
+table_name: ml_models
+classes:
+ - Ml::Model
+feature_categories:
+ - mlops
+description: A machine learning model for the model registry
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/125302
+milestone: '16.2'
+gitlab_schema: gitlab_main
diff --git a/db/docs/organization_settings.yml b/db/docs/organization_settings.yml
new file mode 100644
index 00000000000..669aafc9ed7
--- /dev/null
+++ b/db/docs/organization_settings.yml
@@ -0,0 +1,10 @@
+---
+table_name: organization_settings
+classes:
+- Organizations::OrganizationSetting
+feature_categories:
+- cell
+description: Settings related to Organizations
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/123380
+milestone: '16.2'
+gitlab_schema: gitlab_main
diff --git a/db/docs/organization_users.yml b/db/docs/organization_users.yml
new file mode 100644
index 00000000000..6a1ccb7210b
--- /dev/null
+++ b/db/docs/organization_users.yml
@@ -0,0 +1,10 @@
+---
+table_name: organization_users
+classes:
+- Organizations::OrganizationUser
+feature_categories:
+- cell
+description: User who has joined an organization
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/123804
+milestone: '16.2'
+gitlab_schema: gitlab_main_clusterwide
diff --git a/db/docs/organizations.yml b/db/docs/organizations.yml
index ebc7e8b68d1..c0e4697fb37 100644
--- a/db/docs/organizations.yml
+++ b/db/docs/organizations.yml
@@ -7,4 +7,4 @@ feature_categories:
description: Define ownership of namespaces, projects, and users by organizations
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/119421
milestone: '16.0'
-gitlab_schema: gitlab_main
+gitlab_schema: gitlab_main_clusterwide
diff --git a/db/docs/sbom_vulnerable_component_versions.yml b/db/docs/sbom_vulnerable_component_versions.yml
deleted file mode 100644
index 8747b6c6588..00000000000
--- a/db/docs/sbom_vulnerable_component_versions.yml
+++ /dev/null
@@ -1,10 +0,0 @@
----
-table_name: sbom_vulnerable_component_versions
-classes:
-- Sbom::VulnerableComponentVersion
-feature_categories:
-- dependency_management
-description: Stores information about vulnerable SBoM components
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/95622
-milestone: '15.4'
-gitlab_schema: gitlab_main
diff --git a/db/docs/service_access_tokens.yml b/db/docs/service_access_tokens.yml
new file mode 100644
index 00000000000..2acd0d33c7d
--- /dev/null
+++ b/db/docs/service_access_tokens.yml
@@ -0,0 +1,11 @@
+---
+table_name: service_access_tokens
+classes:
+- Ai::ServiceAccessToken
+feature_categories:
+- application_performance
+description: Persists JWT tokens for AI features (e.g. Code Suggestions) to authenticate
+ the GitLab instance
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/125383
+milestone: '16.2'
+gitlab_schema: gitlab_main
diff --git a/db/docs/subscription_user_add_on_assignments.yml b/db/docs/subscription_user_add_on_assignments.yml
new file mode 100644
index 00000000000..acd9b821115
--- /dev/null
+++ b/db/docs/subscription_user_add_on_assignments.yml
@@ -0,0 +1,10 @@
+---
+table_name: subscription_user_add_on_assignments
+description: Tracks the assignment of an add-on to a user within a namespace
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/123967
+milestone: '16.2'
+feature_categories:
+- seat_cost_management
+classes:
+- GitlabSubscriptions::UserAddOnAssignment
+gitlab_schema: gitlab_main
diff --git a/db/docs/system_access_microsoft_applications.yml b/db/docs/system_access_microsoft_applications.yml
new file mode 100644
index 00000000000..e168c9f41e4
--- /dev/null
+++ b/db/docs/system_access_microsoft_applications.yml
@@ -0,0 +1,10 @@
+---
+table_name: system_access_microsoft_applications
+classes:
+ - SystemAccess::MicrosoftApplication
+feature_categories:
+ - system_access
+description: Integration with Microsoft Azure application
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124101
+milestone: '16.2'
+gitlab_schema: gitlab_main
diff --git a/db/docs/system_access_microsoft_graph_access_tokens.yml b/db/docs/system_access_microsoft_graph_access_tokens.yml
new file mode 100644
index 00000000000..a8a81a836ba
--- /dev/null
+++ b/db/docs/system_access_microsoft_graph_access_tokens.yml
@@ -0,0 +1,10 @@
+---
+table_name: system_access_microsoft_graph_access_tokens
+classes:
+ - SystemAccess::MicrosoftGraphAccessToken
+feature_categories:
+ - system_access
+description: Access tokens for the Microsoft Graph API
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124101
+milestone: '16.2'
+gitlab_schema: gitlab_main
diff --git a/db/docs/u2f_registrations.yml b/db/docs/u2f_registrations.yml
deleted file mode 100644
index b1aaa8148bd..00000000000
--- a/db/docs/u2f_registrations.yml
+++ /dev/null
@@ -1,10 +0,0 @@
----
-table_name: u2f_registrations
-classes:
-- U2fRegistration
-feature_categories:
-- system_access
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/791cc9138be6ea1783e3c3853370cf0290f4d41e
-milestone: '8.9'
-gitlab_schema: gitlab_main
diff --git a/db/docs/verification_codes.yml b/db/docs/verification_codes.yml
index b34818070b1..9d0e3f53830 100644
--- a/db/docs/verification_codes.yml
+++ b/db/docs/verification_codes.yml
@@ -1,7 +1,6 @@
---
table_name: verification_codes
-classes:
--
+classes: []
feature_categories:
- jihu
description: Used by the JiHu edition for user verification
diff --git a/db/docs/vulnerability_advisories.yml b/db/docs/vulnerability_advisories.yml
deleted file mode 100644
index 6ce7f30aa7c..00000000000
--- a/db/docs/vulnerability_advisories.yml
+++ /dev/null
@@ -1,11 +0,0 @@
----
-table_name: vulnerability_advisories
-classes:
-- Vulnerabilities::Advisory
-feature_categories:
-- container_scanning
-- software_composition_analysis
-description: Stores vulnerability advisories
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/95622
-milestone: '15.4'
-gitlab_schema: gitlab_main
diff --git a/db/gitlab_schemas/gitlab_main_cell.yaml b/db/gitlab_schemas/gitlab_main_cell.yaml
index 0f85cfdf5d3..7bc140ffecb 100644
--- a/db/gitlab_schemas/gitlab_main_cell.yaml
+++ b/db/gitlab_schemas/gitlab_main_cell.yaml
@@ -3,9 +3,6 @@ description: Schema for all Cell-local tables, ex. namespaces, projects, etc.
allow_cross_joins:
- gitlab_shared
- gitlab_main
- # Temporarily allow cross-joins between clusterwide and cell schemas
- # This is to be removed once we annotate all cross-joins between those
- - gitlab_main_clusterwide
allow_cross_transactions:
- gitlab_internal
- gitlab_shared
diff --git a/db/migrate/20230522162742_cleanup_bigint_conversion_for_merge_request_metrics_for_self_hosts.rb b/db/migrate/20230522162742_cleanup_bigint_conversion_for_merge_request_metrics_for_self_hosts.rb
new file mode 100644
index 00000000000..5e56f8486f1
--- /dev/null
+++ b/db/migrate/20230522162742_cleanup_bigint_conversion_for_merge_request_metrics_for_self_hosts.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+class CleanupBigintConversionForMergeRequestMetricsForSelfHosts < Gitlab::Database::Migration[2.1]
+ include Gitlab::Database::MigrationHelpers::ConvertToBigint
+
+ enable_lock_retries!
+
+ TABLE = :merge_request_metrics
+
+ def up
+ return if should_skip?
+ return unless column_exists?(TABLE, :id_convert_to_bigint)
+
+ # rubocop:disable Migration/WithLockRetriesDisallowedMethod
+ with_lock_retries do
+ cleanup_conversion_of_integer_to_bigint(TABLE, :id)
+ end
+ # rubocop:enable Migration/WithLockRetriesDisallowedMethod
+ end
+
+ def down
+ return if should_skip?
+ return if column_exists?(TABLE, :id_convert_to_bigint)
+
+ restore_conversion_of_integer_to_bigint(TABLE, :id)
+ end
+
+ def should_skip?
+ com_or_dev_or_test_but_not_jh?
+ end
+end
diff --git a/db/migrate/20230523101514_finalize_user_type_migration.rb b/db/migrate/20230523101514_finalize_user_type_migration.rb
deleted file mode 100644
index f8ae4c7bb2c..00000000000
--- a/db/migrate/20230523101514_finalize_user_type_migration.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class FinalizeUserTypeMigration < Gitlab::Database::Migration[2.1]
- MIGRATION = 'MigrateHumanUserType'
-
- disable_ddl_transaction!
-
- def up
- finalize_background_migration(MIGRATION)
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/migrate/20230605125735_add_tracking_columns_to_namespace_limits.rb b/db/migrate/20230605125735_add_tracking_columns_to_namespace_limits.rb
new file mode 100644
index 00000000000..68f75ddf767
--- /dev/null
+++ b/db/migrate/20230605125735_add_tracking_columns_to_namespace_limits.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+class AddTrackingColumnsToNamespaceLimits < Gitlab::Database::Migration[2.1]
+ def change
+ add_column :namespace_limits, :pre_enforcement_notification_at, :datetime_with_timezone
+ add_column :namespace_limits, :first_enforced_at, :datetime_with_timezone
+ end
+end
diff --git a/db/migrate/20230607124754_create_organization_settings.rb b/db/migrate/20230607124754_create_organization_settings.rb
new file mode 100644
index 00000000000..15d3fa3159f
--- /dev/null
+++ b/db/migrate/20230607124754_create_organization_settings.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class CreateOrganizationSettings < Gitlab::Database::Migration[2.1]
+ enable_lock_retries!
+
+ def change
+ create_table :organization_settings, id: false do |t|
+ t.references :organization, primary_key: true, default: nil, index: false, foreign_key: { on_delete: :cascade }
+ t.timestamps_with_timezone null: false
+ t.jsonb :settings, default: {}, null: false
+ end
+ end
+end
diff --git a/db/migrate/20230608113106_create_organization_users.rb b/db/migrate/20230608113106_create_organization_users.rb
new file mode 100644
index 00000000000..305765bc9df
--- /dev/null
+++ b/db/migrate/20230608113106_create_organization_users.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class CreateOrganizationUsers < Gitlab::Database::Migration[2.1]
+ enable_lock_retries!
+
+ def up
+ create_table :organization_users do |t|
+ t.bigint :organization_id,
+ null: false
+ t.bigint :user_id,
+ null: false,
+ index: true
+ t.timestamps_with_timezone null: false
+ t.index 'organization_id, user_id',
+ name: 'index_organization_users_on_organization_id_and_user_id', unique: true
+ end
+ end
+
+ def down
+ drop_table :organization_users
+ end
+end
diff --git a/db/migrate/20230609065641_initialize_conversion_of_ci_pipeline_variables_pipeline_id.rb b/db/migrate/20230609065641_initialize_conversion_of_ci_pipeline_variables_pipeline_id.rb
new file mode 100644
index 00000000000..09dfda68851
--- /dev/null
+++ b/db/migrate/20230609065641_initialize_conversion_of_ci_pipeline_variables_pipeline_id.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class InitializeConversionOfCiPipelineVariablesPipelineId < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ TABLE = :ci_pipeline_variables
+ COLUMNS = %i[pipeline_id]
+
+ def up
+ initialize_conversion_of_integer_to_bigint(TABLE, COLUMNS)
+ end
+
+ def down
+ revert_initialize_conversion_of_integer_to_bigint(TABLE, COLUMNS)
+ end
+end
diff --git a/db/migrate/20230612074428_add_name_to_external_audit_event_destination.rb b/db/migrate/20230612074428_add_name_to_external_audit_event_destination.rb
new file mode 100644
index 00000000000..4fe61c4caad
--- /dev/null
+++ b/db/migrate/20230612074428_add_name_to_external_audit_event_destination.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class AddNameToExternalAuditEventDestination < Gitlab::Database::Migration[2.1]
+ # rubocop:disable Migration/AddLimitToTextColumns
+ # text limit is added in a 20230612091526_add_text_limit_to_external_audit_event_destination_name.rb migration
+ def change
+ add_column :audit_events_external_audit_event_destinations, :name, :text
+ end
+
+ # rubocop:enable Migration/AddLimitToTextColumns
+end
diff --git a/db/migrate/20230612091526_add_text_limit_to_external_audit_event_destination_name.rb b/db/migrate/20230612091526_add_text_limit_to_external_audit_event_destination_name.rb
new file mode 100644
index 00000000000..d469c7cc964
--- /dev/null
+++ b/db/migrate/20230612091526_add_text_limit_to_external_audit_event_destination_name.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddTextLimitToExternalAuditEventDestinationName < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ add_text_limit :audit_events_external_audit_event_destinations, :name, 72
+ end
+
+ def down
+ remove_text_limit :audit_events_external_audit_event_destinations, :name
+ end
+end
diff --git a/db/migrate/20230612091747_add_name_to_instance_audit_event_destination.rb b/db/migrate/20230612091747_add_name_to_instance_audit_event_destination.rb
new file mode 100644
index 00000000000..7a99654bd66
--- /dev/null
+++ b/db/migrate/20230612091747_add_name_to_instance_audit_event_destination.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class AddNameToInstanceAuditEventDestination < Gitlab::Database::Migration[2.1]
+ # rubocop:disable Migration/AddLimitToTextColumns
+ # text limit is added in a 20230612091910_add_text_limit_to_instance_audit_event_destination_name.rb migration
+ def change
+ add_column :audit_events_instance_external_audit_event_destinations, :name, :text
+ end
+
+ # rubocop:enable Migration/AddLimitToTextColumns
+end
diff --git a/db/migrate/20230612091910_add_text_limit_to_instance_audit_event_destination_name.rb b/db/migrate/20230612091910_add_text_limit_to_instance_audit_event_destination_name.rb
new file mode 100644
index 00000000000..0bdfd4baff7
--- /dev/null
+++ b/db/migrate/20230612091910_add_text_limit_to_instance_audit_event_destination_name.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddTextLimitToInstanceAuditEventDestinationName < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ add_text_limit :audit_events_instance_external_audit_event_destinations, :name, 72
+ end
+
+ def down
+ remove_text_limit :audit_events_instance_external_audit_event_destinations, :name
+ end
+end
diff --git a/db/migrate/20230613122211_add_vulnerability_attributes_to_scan_result_policies.rb b/db/migrate/20230613122211_add_vulnerability_attributes_to_scan_result_policies.rb
new file mode 100644
index 00000000000..c3467efe4af
--- /dev/null
+++ b/db/migrate/20230613122211_add_vulnerability_attributes_to_scan_result_policies.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddVulnerabilityAttributesToScanResultPolicies < Gitlab::Database::Migration[2.1]
+ def change
+ add_column :scan_result_policies, :vulnerability_attributes, :jsonb, default: {}
+ end
+end
diff --git a/db/migrate/20230614180651_add_organization_id_to_namespaces.rb b/db/migrate/20230614180651_add_organization_id_to_namespaces.rb
new file mode 100644
index 00000000000..6a0048b5fc3
--- /dev/null
+++ b/db/migrate/20230614180651_add_organization_id_to_namespaces.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class AddOrganizationIdToNamespaces < Gitlab::Database::Migration[2.1]
+ DEFAULT_ORGANIZATION_ID = 1
+
+ enable_lock_retries!
+
+ def up
+ # This column already exists on some environments and it was reverted
+ # in MR: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/122809
+ return if column_exists?(:namespaces, :organization_id)
+
+ add_column :namespaces, :organization_id, :bigint, default: DEFAULT_ORGANIZATION_ID, null: true # rubocop:disable Migration/AddColumnsToWideTables
+ end
+
+ def down
+ remove_column :namespaces, :organization_id
+ end
+end
diff --git a/db/migrate/20230615074515_add_index_to_audit_event_external_destination.rb b/db/migrate/20230615074515_add_index_to_audit_event_external_destination.rb
new file mode 100644
index 00000000000..b1846c8abed
--- /dev/null
+++ b/db/migrate/20230615074515_add_index_to_audit_event_external_destination.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class AddIndexToAuditEventExternalDestination < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'unique_external_audit_event_destination_namespace_id_and_name'
+
+ def up
+ add_concurrent_index :audit_events_external_audit_event_destinations, [:namespace_id, :name], unique: true,
+ name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :audit_events_external_audit_event_destinations, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20230615074544_add_index_to_instance_audit_event_destination.rb b/db/migrate/20230615074544_add_index_to_instance_audit_event_destination.rb
new file mode 100644
index 00000000000..4e14bb537a3
--- /dev/null
+++ b/db/migrate/20230615074544_add_index_to_instance_audit_event_destination.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddIndexToInstanceAuditEventDestination < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'unique_instance_audit_event_destination_name'
+
+ def up
+ add_concurrent_index :audit_events_instance_external_audit_event_destinations, :name, unique: true, name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :audit_events_instance_external_audit_event_destinations, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20230615104902_add_user_id_foreign_key_to_organization_users.rb b/db/migrate/20230615104902_add_user_id_foreign_key_to_organization_users.rb
new file mode 100644
index 00000000000..0f8d18ee384
--- /dev/null
+++ b/db/migrate/20230615104902_add_user_id_foreign_key_to_organization_users.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddUserIdForeignKeyToOrganizationUsers < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :organization_users, :users, column: :user_id, on_delete: :cascade
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key :organization_users, column: :user_id
+ end
+ end
+end
diff --git a/db/migrate/20230616164309_create_subscription_user_add_on_assignments.rb b/db/migrate/20230616164309_create_subscription_user_add_on_assignments.rb
new file mode 100644
index 00000000000..cb184cd1987
--- /dev/null
+++ b/db/migrate/20230616164309_create_subscription_user_add_on_assignments.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class CreateSubscriptionUserAddOnAssignments < Gitlab::Database::Migration[2.1]
+ UNIQUE_INDEX_NAME = 'uniq_idx_user_add_on_assignments_on_add_on_purchase_and_user'
+
+ def change
+ create_table :subscription_user_add_on_assignments do |t|
+ t.bigint :add_on_purchase_id, null: false
+ t.bigint :user_id, null: false
+
+ t.timestamps_with_timezone null: false
+
+ t.index [:add_on_purchase_id, :user_id], unique: true, name: UNIQUE_INDEX_NAME
+ t.index :user_id
+ end
+ end
+end
diff --git a/db/migrate/20230616164705_add_foreign_key_add_on_purchase_id_on_subscription_user_add_on_assignments.rb b/db/migrate/20230616164705_add_foreign_key_add_on_purchase_id_on_subscription_user_add_on_assignments.rb
new file mode 100644
index 00000000000..d0d89bd5027
--- /dev/null
+++ b/db/migrate/20230616164705_add_foreign_key_add_on_purchase_id_on_subscription_user_add_on_assignments.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class AddForeignKeyAddOnPurchaseIdOnSubscriptionUserAddOnAssignments < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :subscription_user_add_on_assignments, :subscription_add_on_purchases,
+ column: :add_on_purchase_id, on_delete: :cascade
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key :subscription_user_add_on_assignments, column: :add_on_purchase_id
+ end
+ end
+end
diff --git a/db/migrate/20230616164731_add_foreign_key_user_id_on_subscription_user_add_on_assignments.rb b/db/migrate/20230616164731_add_foreign_key_user_id_on_subscription_user_add_on_assignments.rb
new file mode 100644
index 00000000000..a28c798deec
--- /dev/null
+++ b/db/migrate/20230616164731_add_foreign_key_user_id_on_subscription_user_add_on_assignments.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddForeignKeyUserIdOnSubscriptionUserAddOnAssignments < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :subscription_user_add_on_assignments, :users, column: :user_id, on_delete: :cascade
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key :subscription_user_add_on_assignments, column: :user_id
+ end
+ end
+end
diff --git a/db/migrate/20230616200440_create_system_access_microsoft_application.rb b/db/migrate/20230616200440_create_system_access_microsoft_application.rb
new file mode 100644
index 00000000000..d58dd8f88d9
--- /dev/null
+++ b/db/migrate/20230616200440_create_system_access_microsoft_application.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class CreateSystemAccessMicrosoftApplication < Gitlab::Database::Migration[2.1]
+ enable_lock_retries!
+
+ def change
+ create_table :system_access_microsoft_applications do |t|
+ t.timestamps_with_timezone null: false
+ t.references :namespace, index: { unique: true }, foreign_key: { on_delete: :cascade }
+ t.boolean :enabled, null: false, default: false
+ t.text :tenant_xid, null: false, limit: 255
+ t.text :client_xid, null: false, limit: 255
+ t.text :login_endpoint, null: false, limit: 255, default: 'https://login.microsoftonline.com'
+ t.text :graph_endpoint, null: false, limit: 255, default: 'https://graph.microsoft.com'
+ t.binary :encrypted_client_secret, null: false
+ t.binary :encrypted_client_secret_iv, null: false
+ end
+ end
+end
diff --git a/db/migrate/20230616214220_create_system_access_microsoft_graph_access_tokens.rb b/db/migrate/20230616214220_create_system_access_microsoft_graph_access_tokens.rb
new file mode 100644
index 00000000000..df196280d0c
--- /dev/null
+++ b/db/migrate/20230616214220_create_system_access_microsoft_graph_access_tokens.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class CreateSystemAccessMicrosoftGraphAccessTokens < Gitlab::Database::Migration[2.1]
+ def change
+ create_table :system_access_microsoft_graph_access_tokens do |t|
+ t.timestamps_with_timezone null: false
+ t.references :system_access_microsoft_application,
+ index: { name: 'unique_index_sysaccess_ms_access_tokens_on_sysaccess_ms_app_id', unique: true },
+ foreign_key: { on_delete: :cascade }
+ t.integer :expires_in, null: false
+ t.binary :encrypted_token, null: false
+ t.binary :encrypted_token_iv, null: false
+ end
+ end
+end
diff --git a/db/migrate/20230620101808_change_default_value_for_distro_version.rb b/db/migrate/20230620101808_change_default_value_for_distro_version.rb
new file mode 100644
index 00000000000..f0da7cfaba7
--- /dev/null
+++ b/db/migrate/20230620101808_change_default_value_for_distro_version.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class ChangeDefaultValueForDistroVersion < Gitlab::Database::Migration[2.1]
+ def up
+ change_column_default :pm_affected_packages, :distro_version, from: nil, to: ''
+ change_column_null :pm_affected_packages, :distro_version, false
+ end
+
+ def down
+ change_column_default :pm_affected_packages, :distro_version, from: '', to: nil
+ change_column_null :pm_affected_packages, :distro_version, true
+ end
+end
diff --git a/db/migrate/20230620104217_add_organization_id_foreign_key_to_organization_users.rb b/db/migrate/20230620104217_add_organization_id_foreign_key_to_organization_users.rb
new file mode 100644
index 00000000000..0a9757d2e14
--- /dev/null
+++ b/db/migrate/20230620104217_add_organization_id_foreign_key_to_organization_users.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddOrganizationIdForeignKeyToOrganizationUsers < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :organization_users, :organizations, column: :organization_id, on_delete: :cascade
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key :organization_users, column: :organization_id
+ end
+ end
+end
diff --git a/db/migrate/20230621065943_add_elasticsearch_requeue_workers_to_application_settings.rb b/db/migrate/20230621065943_add_elasticsearch_requeue_workers_to_application_settings.rb
new file mode 100644
index 00000000000..2297cc5cdc2
--- /dev/null
+++ b/db/migrate/20230621065943_add_elasticsearch_requeue_workers_to_application_settings.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddElasticsearchRequeueWorkersToApplicationSettings < Gitlab::Database::Migration[2.1]
+ def change
+ add_column :application_settings, :elasticsearch_requeue_workers, :boolean, null: false, default: false
+ end
+end
diff --git a/db/migrate/20230621070810_update_requeue_workers_in_application_settings_for_gitlab_com.rb b/db/migrate/20230621070810_update_requeue_workers_in_application_settings_for_gitlab_com.rb
new file mode 100644
index 00000000000..9ed9af71066
--- /dev/null
+++ b/db/migrate/20230621070810_update_requeue_workers_in_application_settings_for_gitlab_com.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class UpdateRequeueWorkersInApplicationSettingsForGitlabCom < Gitlab::Database::Migration[2.1]
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ def up
+ return unless Gitlab.com?
+
+ execute 'UPDATE application_settings SET elasticsearch_requeue_workers = true'
+ end
+
+ def down
+ return unless Gitlab.com?
+
+ execute 'UPDATE application_settings SET elasticsearch_requeue_workers = false'
+ end
+end
diff --git a/db/migrate/20230621072726_add_description_to_ci_variable.rb b/db/migrate/20230621072726_add_description_to_ci_variable.rb
new file mode 100644
index 00000000000..c14afca60bb
--- /dev/null
+++ b/db/migrate/20230621072726_add_description_to_ci_variable.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+class AddDescriptionToCiVariable < Gitlab::Database::Migration[2.1]
+ enable_lock_retries!
+
+ # rubocop:disable Migration/AddLimitToTextColumns
+ # text limit is added in a 20230621072848_add_text_limit_to_ci_variable_description.rb migration
+ def change
+ add_column(:ci_variables, :description, :text)
+ end
+ # rubocop:enable Migration/AddLimitToTextColumns
+end
diff --git a/db/migrate/20230621074446_add_elasticsearch_number_of_shards_to_application_settings.rb b/db/migrate/20230621074446_add_elasticsearch_number_of_shards_to_application_settings.rb
new file mode 100644
index 00000000000..6eed0f8cf15
--- /dev/null
+++ b/db/migrate/20230621074446_add_elasticsearch_number_of_shards_to_application_settings.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AddElasticsearchNumberOfShardsToApplicationSettings < Gitlab::Database::Migration[2.1]
+ enable_lock_retries!
+
+ def change
+ add_column :application_settings, :elasticsearch_worker_number_of_shards, :integer, null: false, default: 2
+ end
+end
diff --git a/db/migrate/20230621074611_update_elasticsearch_number_of_shards_in_application_settings_for_gitlab_com.rb b/db/migrate/20230621074611_update_elasticsearch_number_of_shards_in_application_settings_for_gitlab_com.rb
new file mode 100644
index 00000000000..666d4a2e096
--- /dev/null
+++ b/db/migrate/20230621074611_update_elasticsearch_number_of_shards_in_application_settings_for_gitlab_com.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class UpdateElasticsearchNumberOfShardsInApplicationSettingsForGitlabCom < Gitlab::Database::Migration[2.1]
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ enable_lock_retries!
+
+ def up
+ return unless Gitlab.com?
+
+ execute 'UPDATE application_settings SET elasticsearch_worker_number_of_shards = 16'
+ end
+
+ def down
+ return unless Gitlab.com?
+
+ execute 'UPDATE application_settings SET elasticsearch_worker_number_of_shards = 2'
+ end
+end
diff --git a/db/migrate/20230621083004_add_description_to_ci_group_variable.rb b/db/migrate/20230621083004_add_description_to_ci_group_variable.rb
new file mode 100644
index 00000000000..933c4079c4c
--- /dev/null
+++ b/db/migrate/20230621083004_add_description_to_ci_group_variable.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+class AddDescriptionToCiGroupVariable < Gitlab::Database::Migration[2.1]
+ enable_lock_retries!
+
+ # rubocop:disable Migration/AddLimitToTextColumns
+ # text limit is added in a 20230621083052_add_text_limit_to_ci_group_variable_description.rb migration
+ def change
+ add_column(:ci_group_variables, :description, :text)
+ end
+ # rubocop:enable Migration/AddLimitToTextColumns
+end
diff --git a/db/migrate/20230622044119_create_merge_request_review_llm_summary.rb b/db/migrate/20230622044119_create_merge_request_review_llm_summary.rb
new file mode 100644
index 00000000000..19b9cf27d90
--- /dev/null
+++ b/db/migrate/20230622044119_create_merge_request_review_llm_summary.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class CreateMergeRequestReviewLlmSummary < Gitlab::Database::Migration[2.1]
+ INDEX_NAME = "index_merge_request_review_llm_summaries_on_mr_diff_id"
+
+ def change
+ create_table :merge_request_review_llm_summaries do |t|
+ t.references :user, null: true, index: true
+ t.references :review, null: false, index: true
+ t.references :merge_request_diff, null: false, index: { name: INDEX_NAME }
+ t.timestamps_with_timezone null: false
+ t.integer :provider, null: false, limit: 2
+ t.text :content, null: false, limit: 2056
+ end
+ end
+end
diff --git a/db/migrate/20230622051925_add_user_foreign_key_to_merge_request_review_llm_summary.rb b/db/migrate/20230622051925_add_user_foreign_key_to_merge_request_review_llm_summary.rb
new file mode 100644
index 00000000000..1fa19317913
--- /dev/null
+++ b/db/migrate/20230622051925_add_user_foreign_key_to_merge_request_review_llm_summary.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddUserForeignKeyToMergeRequestReviewLlmSummary < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :merge_request_review_llm_summaries, :users, column: :user_id, on_delete: :cascade
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key :merge_request_review_llm_summaries, column: :user_id
+ end
+ end
+end
diff --git a/db/migrate/20230622051943_add_review_foreign_key_to_merge_request_review_llm_summary.rb b/db/migrate/20230622051943_add_review_foreign_key_to_merge_request_review_llm_summary.rb
new file mode 100644
index 00000000000..ec4eb6b3f91
--- /dev/null
+++ b/db/migrate/20230622051943_add_review_foreign_key_to_merge_request_review_llm_summary.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddReviewForeignKeyToMergeRequestReviewLlmSummary < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :merge_request_review_llm_summaries, :reviews, column: :review_id, on_delete: :cascade
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key :merge_request_review_llm_summaries, column: :review_id
+ end
+ end
+end
diff --git a/db/migrate/20230622052015_add_merge_request_diff_foreign_key_to_merge_request_review_llm_summary.rb b/db/migrate/20230622052015_add_merge_request_diff_foreign_key_to_merge_request_review_llm_summary.rb
new file mode 100644
index 00000000000..f5409aa48e9
--- /dev/null
+++ b/db/migrate/20230622052015_add_merge_request_diff_foreign_key_to_merge_request_review_llm_summary.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class AddMergeRequestDiffForeignKeyToMergeRequestReviewLlmSummary < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :merge_request_review_llm_summaries, :merge_request_diffs,
+ column: :merge_request_diff_id,
+ on_delete: :cascade
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key :merge_request_review_llm_summaries, column: :merge_request_diff_id
+ end
+ end
+end
diff --git a/db/migrate/20230622093921_remove_deprecated_metric_worker_instances.rb b/db/migrate/20230622093921_remove_deprecated_metric_worker_instances.rb
new file mode 100644
index 00000000000..ac2bc02ec3f
--- /dev/null
+++ b/db/migrate/20230622093921_remove_deprecated_metric_worker_instances.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class RemoveDeprecatedMetricWorkerInstances < Gitlab::Database::Migration[2.1]
+ DEPRECATED_JOB_CLASSES = %w[
+ Clusters::Integrations::CheckPrometheusHealthWorker
+ Metrics::Dashboard::PruneOldAnnotationsWorker
+ Metrics::Dashboard::ScheduleAnnotationsPruneWorker
+ Metrics::Dashboard::SyncDashboardsWorker
+ ]
+
+ disable_ddl_transaction!
+
+ def up
+ sidekiq_remove_jobs(job_klasses: DEPRECATED_JOB_CLASSES)
+ end
+
+ def down
+ # This migration removes any instances of deprecated workers and cannot be undone.
+ end
+end
diff --git a/db/migrate/20230626065725_backfill_instance_audit_event_name.rb b/db/migrate/20230626065725_backfill_instance_audit_event_name.rb
new file mode 100644
index 00000000000..082a57fcc99
--- /dev/null
+++ b/db/migrate/20230626065725_backfill_instance_audit_event_name.rb
@@ -0,0 +1,18 @@
+# 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 BackfillInstanceAuditEventName < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ class InstanceDestination < MigrationRecord
+ self.table_name = 'audit_events_instance_external_audit_event_destinations'
+ end
+
+ def change
+ InstanceDestination.update_all("name = 'Destination ' || id")
+ end
+end
diff --git a/db/migrate/20230626065755_backfill_external_audit_event_name.rb b/db/migrate/20230626065755_backfill_external_audit_event_name.rb
new file mode 100644
index 00000000000..1c983e802d8
--- /dev/null
+++ b/db/migrate/20230626065755_backfill_external_audit_event_name.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class BackfillExternalAuditEventName < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ class ExternalDestination < MigrationRecord
+ self.table_name = 'audit_events_external_audit_event_destinations'
+ end
+
+ def change
+ ExternalDestination.update_all("name = 'Destination ' || id")
+ end
+end
diff --git a/db/migrate/20230626070959_add_not_null_to_external_audit_event.rb b/db/migrate/20230626070959_add_not_null_to_external_audit_event.rb
new file mode 100644
index 00000000000..e6d75c1dc68
--- /dev/null
+++ b/db/migrate/20230626070959_add_not_null_to_external_audit_event.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddNotNullToExternalAuditEvent < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ change_column_null :audit_events_external_audit_event_destinations, :name, false
+ end
+
+ def down
+ change_column_null :audit_events_external_audit_event_destinations, :name, true
+ end
+end
diff --git a/db/migrate/20230626071100_add_not_null_to_instance_audit_event.rb b/db/migrate/20230626071100_add_not_null_to_instance_audit_event.rb
new file mode 100644
index 00000000000..6a67dcf1a24
--- /dev/null
+++ b/db/migrate/20230626071100_add_not_null_to_instance_audit_event.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddNotNullToInstanceAuditEvent < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ change_column_null :audit_events_instance_external_audit_event_destinations, :name, false
+ end
+
+ def down
+ change_column_null :audit_events_instance_external_audit_event_destinations, :name, true
+ end
+end
diff --git a/db/migrate/20230626113908_add_project_id_to_scan_result_policies.rb b/db/migrate/20230626113908_add_project_id_to_scan_result_policies.rb
new file mode 100644
index 00000000000..6066b945edf
--- /dev/null
+++ b/db/migrate/20230626113908_add_project_id_to_scan_result_policies.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class AddProjectIdToScanResultPolicies < Gitlab::Database::Migration[2.1]
+ def up
+ add_column :scan_result_policies, :project_id, :bigint
+ end
+
+ def down
+ remove_column :scan_result_policies, :project_id
+ end
+end
diff --git a/db/migrate/20230626113909_add_index_to_scan_result_policies_on_project_id.rb b/db/migrate/20230626113909_add_index_to_scan_result_policies_on_project_id.rb
new file mode 100644
index 00000000000..63416765bfa
--- /dev/null
+++ b/db/migrate/20230626113909_add_index_to_scan_result_policies_on_project_id.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddIndexToScanResultPoliciesOnProjectId < Gitlab::Database::Migration[2.1]
+ INDEX_NAME = 'index_scan_result_policies_on_project_id'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :scan_result_policies, :project_id, name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :scan_result_policies, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20230626113910_add_project_id_foreign_key_to_scan_result_policies.rb b/db/migrate/20230626113910_add_project_id_foreign_key_to_scan_result_policies.rb
new file mode 100644
index 00000000000..c5446e17ef3
--- /dev/null
+++ b/db/migrate/20230626113910_add_project_id_foreign_key_to_scan_result_policies.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class AddProjectIdForeignKeyToScanResultPolicies < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :scan_result_policies,
+ :projects,
+ column: :project_id,
+ on_delete: :cascade
+ end
+
+ def down
+ remove_foreign_key_if_exists :scan_result_policies, column: :project_id
+ end
+end
diff --git a/db/migrate/20230629071427_add_last_enforced_at_to_namespace_limits.rb b/db/migrate/20230629071427_add_last_enforced_at_to_namespace_limits.rb
new file mode 100644
index 00000000000..4f005c42228
--- /dev/null
+++ b/db/migrate/20230629071427_add_last_enforced_at_to_namespace_limits.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddLastEnforcedAtToNamespaceLimits < Gitlab::Database::Migration[2.1]
+ def change
+ add_column :namespace_limits, :last_enforced_at, :datetime_with_timezone
+ end
+end
diff --git a/db/migrate/20230629112833_create_fk_ml_candidates_on_user_id.rb b/db/migrate/20230629112833_create_fk_ml_candidates_on_user_id.rb
new file mode 100644
index 00000000000..85545c41529
--- /dev/null
+++ b/db/migrate/20230629112833_create_fk_ml_candidates_on_user_id.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+class CreateFkMlCandidatesOnUserId < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ NEW_CONSTRAINT_NAME = 'fk_ml_candidates_on_user_id'
+
+ def up
+ add_concurrent_foreign_key(
+ :ml_candidates,
+ :users,
+ column: :user_id,
+ on_delete: :nullify,
+ validate: false,
+ name: NEW_CONSTRAINT_NAME
+ )
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key_if_exists(
+ :ml_candidates,
+ column: :user_id,
+ on_delete: :nullify,
+ name: NEW_CONSTRAINT_NAME
+ )
+ end
+ end
+end
diff --git a/db/migrate/20230629113029_validate_fk_ml_candidates_on_user_id.rb b/db/migrate/20230629113029_validate_fk_ml_candidates_on_user_id.rb
new file mode 100644
index 00000000000..dce7f8eeb47
--- /dev/null
+++ b/db/migrate/20230629113029_validate_fk_ml_candidates_on_user_id.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class ValidateFkMlCandidatesOnUserId < Gitlab::Database::Migration[2.1]
+ NEW_CONSTRAINT_NAME = 'fk_ml_candidates_on_user_id'
+
+ def up
+ validate_foreign_key(:ml_candidates, :user_id, name: NEW_CONSTRAINT_NAME)
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/migrate/20230629113133_remove_old_fk_ml_candidates_on_user_id.rb b/db/migrate/20230629113133_remove_old_fk_ml_candidates_on_user_id.rb
new file mode 100644
index 00000000000..73ed826ec75
--- /dev/null
+++ b/db/migrate/20230629113133_remove_old_fk_ml_candidates_on_user_id.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class RemoveOldFkMlCandidatesOnUserId < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ OLD_CONSTRAINT_NAME = 'fk_rails_1b37441fe5'
+
+ def up
+ remove_foreign_key_if_exists(:ml_candidates, column: :user_id, name: OLD_CONSTRAINT_NAME)
+ end
+
+ def down
+ add_concurrent_foreign_key(
+ :ml_candidates,
+ :users,
+ column: :user_id,
+ validate: false,
+ name: OLD_CONSTRAINT_NAME
+ )
+ end
+end
diff --git a/db/migrate/20230630101337_add_previous_personal_access_token_to_personal_access_tokens.rb b/db/migrate/20230630101337_add_previous_personal_access_token_to_personal_access_tokens.rb
new file mode 100644
index 00000000000..870723abea9
--- /dev/null
+++ b/db/migrate/20230630101337_add_previous_personal_access_token_to_personal_access_tokens.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddPreviousPersonalAccessTokenToPersonalAccessTokens < Gitlab::Database::Migration[2.1]
+ enable_lock_retries!
+
+ def up
+ add_column :personal_access_tokens, :previous_personal_access_token_id, :bigint, null: true
+ end
+
+ def down
+ remove_column :personal_access_tokens, :previous_personal_access_token_id
+ end
+end
diff --git a/db/migrate/20230630101342_add_index_to_personal_access_tokens_on_previous_personal_access_token_id.rb b/db/migrate/20230630101342_add_index_to_personal_access_tokens_on_previous_personal_access_token_id.rb
new file mode 100644
index 00000000000..9d07d9f4118
--- /dev/null
+++ b/db/migrate/20230630101342_add_index_to_personal_access_tokens_on_previous_personal_access_token_id.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddIndexToPersonalAccessTokensOnPreviousPersonalAccessTokenId < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'idx_personal_access_tokens_on_previous_personal_access_token_id'
+
+ def up
+ add_concurrent_index :personal_access_tokens, :previous_personal_access_token_id, name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :personal_access_tokens, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20230630101347_add_fk_to_personal_access_tokens_on_previous_personal_access_token_id.rb b/db/migrate/20230630101347_add_fk_to_personal_access_tokens_on_previous_personal_access_token_id.rb
new file mode 100644
index 00000000000..a740b386e47
--- /dev/null
+++ b/db/migrate/20230630101347_add_fk_to_personal_access_tokens_on_previous_personal_access_token_id.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class AddFkToPersonalAccessTokensOnPreviousPersonalAccessTokenId < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key(
+ :personal_access_tokens,
+ :personal_access_tokens,
+ column: :previous_personal_access_token_id,
+ on_delete: :nullify)
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key_if_exists :personal_access_tokens, column: :previous_personal_access_token_id
+ end
+ end
+end
diff --git a/db/migrate/20230630170515_add_state_to_catalog_resources.rb b/db/migrate/20230630170515_add_state_to_catalog_resources.rb
new file mode 100644
index 00000000000..ff0a5fda6c9
--- /dev/null
+++ b/db/migrate/20230630170515_add_state_to_catalog_resources.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AddStateToCatalogResources < Gitlab::Database::Migration[2.1]
+ DRAFT = 0
+
+ def change
+ add_column :catalog_resources, :state, :smallint, null: false, limit: 1, default: DRAFT
+ end
+end
diff --git a/db/migrate/20230701195315_add_kubernetes_namespace_column_to_environments.rb b/db/migrate/20230701195315_add_kubernetes_namespace_column_to_environments.rb
new file mode 100644
index 00000000000..e05feca2c64
--- /dev/null
+++ b/db/migrate/20230701195315_add_kubernetes_namespace_column_to_environments.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class AddKubernetesNamespaceColumnToEnvironments < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ with_lock_retries do
+ add_column :environments, :kubernetes_namespace, :text unless column_exists?(:environments, :kubernetes_namespace)
+ end
+
+ add_text_limit :environments, :kubernetes_namespace, 63
+ end
+
+ def down
+ remove_column :environments, :kubernetes_namespace
+ end
+end
diff --git a/db/migrate/20230703115902_add_relay_state_allowlist_application_settings.rb b/db/migrate/20230703115902_add_relay_state_allowlist_application_settings.rb
new file mode 100644
index 00000000000..3de7470f113
--- /dev/null
+++ b/db/migrate/20230703115902_add_relay_state_allowlist_application_settings.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class AddRelayStateAllowlistApplicationSettings < Gitlab::Database::Migration[2.1]
+ def change
+ add_column :application_settings, :relay_state_domain_allowlist,
+ :text,
+ array: true,
+ default: [],
+ null: false
+ end
+end
diff --git a/db/migrate/20230703121859_add_relay_state_allowlist_saml_providers.rb b/db/migrate/20230703121859_add_relay_state_allowlist_saml_providers.rb
new file mode 100644
index 00000000000..b05059d1d61
--- /dev/null
+++ b/db/migrate/20230703121859_add_relay_state_allowlist_saml_providers.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class AddRelayStateAllowlistSamlProviders < Gitlab::Database::Migration[2.1]
+ def change
+ add_column :saml_providers, :relay_state_domain_allowlist,
+ :text,
+ array: true,
+ default: [],
+ null: false
+ end
+end
diff --git a/db/migrate/20230705085223_create_service_access_tokens.rb b/db/migrate/20230705085223_create_service_access_tokens.rb
new file mode 100644
index 00000000000..b934ef5d60a
--- /dev/null
+++ b/db/migrate/20230705085223_create_service_access_tokens.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+class CreateServiceAccessTokens < Gitlab::Database::Migration[2.1]
+ def change
+ create_table :service_access_tokens do |t|
+ t.timestamps_with_timezone null: false
+ t.integer :category, limit: 2, null: false, default: 0
+ t.binary :encrypted_token, null: false
+ t.binary :encrypted_token_iv, null: false
+ end
+ end
+end
diff --git a/db/migrate/20230705092150_create_ml_models.rb b/db/migrate/20230705092150_create_ml_models.rb
new file mode 100644
index 00000000000..df8827a781f
--- /dev/null
+++ b/db/migrate/20230705092150_create_ml_models.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class CreateMlModels < Gitlab::Database::Migration[2.1]
+ enable_lock_retries!
+
+ def up
+ create_table :ml_models do |t|
+ t.timestamps_with_timezone null: false
+ t.references :project, foreign_key: true, index: true, on_delete: :cascade, null: false
+ t.text :name, limit: 255, null: false
+
+ t.index [:project_id, :name], unique: true
+ end
+ end
+
+ def down
+ drop_table :ml_models
+ end
+end
diff --git a/db/migrate/20230705155000_add_group_mention_events_to_integrations.rb b/db/migrate/20230705155000_add_group_mention_events_to_integrations.rb
new file mode 100644
index 00000000000..82c2c714022
--- /dev/null
+++ b/db/migrate/20230705155000_add_group_mention_events_to_integrations.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+class AddGroupMentionEventsToIntegrations < Gitlab::Database::Migration[2.1]
+ def change
+ add_column :integrations, :group_mention_events, :boolean, null: false, default: false
+ add_column :integrations, :group_confidential_mention_events, :boolean, null: false, default: false
+ end
+end
diff --git a/db/migrate/20230706130217_add_column_model_id_to_ml_experiments.rb b/db/migrate/20230706130217_add_column_model_id_to_ml_experiments.rb
new file mode 100644
index 00000000000..4eab027bc22
--- /dev/null
+++ b/db/migrate/20230706130217_add_column_model_id_to_ml_experiments.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+class AddColumnModelIdToMlExperiments < Gitlab::Database::Migration[2.1]
+ def change
+ # rubocop:disable Migration/AddReference
+ add_reference :ml_experiments,
+ :model,
+ index: true,
+ null: true,
+ unique: true,
+ foreign_key: { on_delete: :cascade, to_table: :ml_models }
+ # rubocop:enable Migration/AddReference
+ end
+end
diff --git a/db/migrate/20230706192435_remove_debian_process_changes_worker_job_instances.rb b/db/migrate/20230706192435_remove_debian_process_changes_worker_job_instances.rb
new file mode 100644
index 00000000000..48c992b5e3c
--- /dev/null
+++ b/db/migrate/20230706192435_remove_debian_process_changes_worker_job_instances.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class RemoveDebianProcessChangesWorkerJobInstances < Gitlab::Database::Migration[2.1]
+ DEPRECATED_JOB_CLASSES = %w[Packages::Debian::ProcessChangesWorker]
+
+ disable_ddl_transaction!
+
+ def up
+ sidekiq_remove_jobs(job_klasses: DEPRECATED_JOB_CLASSES)
+ end
+
+ def down
+ # This migration removes any instances of deprecated workers and cannot be undone.
+ end
+end
diff --git a/db/migrate/20230707090835_create_ml_model_versions.rb b/db/migrate/20230707090835_create_ml_model_versions.rb
new file mode 100644
index 00000000000..f7be6ec4681
--- /dev/null
+++ b/db/migrate/20230707090835_create_ml_model_versions.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+class CreateMlModelVersions < Gitlab::Database::Migration[2.1]
+ enable_lock_retries!
+
+ def up
+ create_table :ml_model_versions do |t|
+ t.timestamps_with_timezone null: false
+ t.references :project, foreign_key: { on_delete: :cascade }, index: true, null: false
+
+ t.bigint :model_id, null: false # fk cascade
+ t.bigint :package_id, null: true # fk nullify
+
+ t.text :version, limit: 255, null: false
+
+ t.index :model_id
+ t.index :package_id
+ t.index [:project_id, :model_id, :version], unique: true
+ end
+ end
+
+ def down
+ drop_table :ml_model_versions
+ end
+end
diff --git a/db/migrate/20230707094002_add_fk_on_ml_model_versions_to_ml_models.rb b/db/migrate/20230707094002_add_fk_on_ml_model_versions_to_ml_models.rb
new file mode 100644
index 00000000000..04e7b9c2e6a
--- /dev/null
+++ b/db/migrate/20230707094002_add_fk_on_ml_model_versions_to_ml_models.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddFkOnMlModelVersionsToMlModels < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key(:ml_model_versions, :ml_models, column: :model_id, on_delete: :cascade)
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key_if_exists(:ml_model_versions, column: :model_id, on_delete: :cascade)
+ end
+ end
+end
diff --git a/db/migrate/20230707094003_add_fk_on_ml_model_versions_to_packages.rb b/db/migrate/20230707094003_add_fk_on_ml_model_versions_to_packages.rb
new file mode 100644
index 00000000000..03c1af1af66
--- /dev/null
+++ b/db/migrate/20230707094003_add_fk_on_ml_model_versions_to_packages.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddFkOnMlModelVersionsToPackages < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key(:ml_model_versions, :packages_packages, column: :package_id, on_delete: :nullify)
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key_if_exists(:ml_model_versions, column: :package_id, on_delete: :nullify)
+ end
+ end
+end
diff --git a/db/migrate/20230710160232_add_expires_at_to_service_access_tokens.rb b/db/migrate/20230710160232_add_expires_at_to_service_access_tokens.rb
new file mode 100644
index 00000000000..f9e4e014ff4
--- /dev/null
+++ b/db/migrate/20230710160232_add_expires_at_to_service_access_tokens.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class AddExpiresAtToServiceAccessTokens < Gitlab::Database::Migration[2.1]
+ def change
+ # Code using this table has not been implemented yet.
+ # During we run the migration, the table will be empty.
+ # rubocop:disable Rails/NotNullColumn
+ add_column :service_access_tokens, :expires_at, :datetime_with_timezone, null: false
+ # rubocop:enable Rails/NotNullColumn
+ end
+end
diff --git a/db/migrate/20230710200434_add_emoji_events_to_web_hooks.rb b/db/migrate/20230710200434_add_emoji_events_to_web_hooks.rb
new file mode 100644
index 00000000000..45a6d15cefb
--- /dev/null
+++ b/db/migrate/20230710200434_add_emoji_events_to_web_hooks.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AddEmojiEventsToWebHooks < Gitlab::Database::Migration[2.1]
+ enable_lock_retries!
+
+ def change
+ add_column :web_hooks, :emoji_events, :boolean, null: false, default: false
+ end
+end
diff --git a/db/migrate/20230712214613_add_read_dependency_to_member_roles.rb b/db/migrate/20230712214613_add_read_dependency_to_member_roles.rb
new file mode 100644
index 00000000000..c6c9f3a0611
--- /dev/null
+++ b/db/migrate/20230712214613_add_read_dependency_to_member_roles.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddReadDependencyToMemberRoles < Gitlab::Database::Migration[2.1]
+ def change
+ add_column :member_roles, :read_dependency, :boolean, default: false, null: false
+ end
+end
diff --git a/db/migrate/20230714195649_add_namespace_storage_forks_cost_factor_to_application_settings.rb b/db/migrate/20230714195649_add_namespace_storage_forks_cost_factor_to_application_settings.rb
new file mode 100644
index 00000000000..3388b934668
--- /dev/null
+++ b/db/migrate/20230714195649_add_namespace_storage_forks_cost_factor_to_application_settings.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class AddNamespaceStorageForksCostFactorToApplicationSettings < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ CONSTRAINT_NAME = 'check_app_settings_namespace_storage_forks_cost_factor_range'
+
+ def up
+ with_lock_retries do
+ add_column :application_settings, :namespace_storage_forks_cost_factor,
+ :float, default: 1.0, null: false, if_not_exists: true
+ end
+
+ add_check_constraint :application_settings,
+ 'namespace_storage_forks_cost_factor >= 0 AND namespace_storage_forks_cost_factor <= 1',
+ CONSTRAINT_NAME
+ end
+
+ def down
+ remove_column :application_settings, :namespace_storage_forks_cost_factor
+ end
+end
diff --git a/db/migrate/20230717200940_create_group_wiki_repository_states.rb b/db/migrate/20230717200940_create_group_wiki_repository_states.rb
new file mode 100644
index 00000000000..36b2173ab24
--- /dev/null
+++ b/db/migrate/20230717200940_create_group_wiki_repository_states.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+class CreateGroupWikiRepositoryStates < Gitlab::Database::Migration[2.1]
+ VERIFICATION_STATE_INDEX_NAME = "index_group_wiki_repository_states_on_verification_state"
+ PENDING_VERIFICATION_INDEX_NAME = "index_group_wiki_repository_states_pending_verification"
+ FAILED_VERIFICATION_INDEX_NAME = "index_group_wiki_repository_states_failed_verification"
+ NEEDS_VERIFICATION_INDEX_NAME = "index_group_wiki_repository_states_needs_verification"
+
+ enable_lock_retries!
+
+ def up
+ create_table :group_wiki_repository_states do |t|
+ t.datetime_with_timezone :verification_started_at
+ t.datetime_with_timezone :verification_retry_at
+ t.datetime_with_timezone :verified_at
+ t.references :group_wiki_repository,
+ null: false,
+ index: { unique: true },
+ foreign_key: { primary_key: :group_id, on_delete: :cascade }
+ t.integer :verification_state, default: 0, limit: 2, null: false
+ t.integer :verification_retry_count, default: 0, limit: 2, null: false
+ t.binary :verification_checksum, using: 'verification_checksum::bytea'
+ t.text :verification_failure, limit: 255
+
+ t.index :verification_state, name: VERIFICATION_STATE_INDEX_NAME
+ t.index :verified_at,
+ where: "(verification_state = 0)",
+ order: { verified_at: 'ASC NULLS FIRST' },
+ name: PENDING_VERIFICATION_INDEX_NAME
+ t.index :verification_retry_at,
+ where: "(verification_state = 3)",
+ order: { verification_retry_at: 'ASC NULLS FIRST' },
+ name: FAILED_VERIFICATION_INDEX_NAME
+ t.index :verification_state,
+ where: "(verification_state = 0 OR verification_state = 3)",
+ name: NEEDS_VERIFICATION_INDEX_NAME
+ end
+ end
+
+ def down
+ drop_table :group_wiki_repository_states
+ end
+end
diff --git a/db/post_migrate/20230314094213_remove_foreign_keys_from_u2f_registrations_table.rb b/db/post_migrate/20230314094213_remove_foreign_keys_from_u2f_registrations_table.rb
new file mode 100644
index 00000000000..d6185d6674d
--- /dev/null
+++ b/db/post_migrate/20230314094213_remove_foreign_keys_from_u2f_registrations_table.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class RemoveForeignKeysFromU2fRegistrationsTable < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ with_lock_retries do
+ remove_foreign_key :u2f_registrations, :users
+ end
+ end
+
+ def down
+ add_concurrent_foreign_key :u2f_registrations, :users, column: :user_id
+ end
+end
diff --git a/db/post_migrate/20230314094215_drop_u2f_registrations_table.rb b/db/post_migrate/20230314094215_drop_u2f_registrations_table.rb
new file mode 100644
index 00000000000..9a57c424592
--- /dev/null
+++ b/db/post_migrate/20230314094215_drop_u2f_registrations_table.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class DropU2fRegistrationsTable < Gitlab::Database::Migration[2.1]
+ enable_lock_retries!
+
+ def up
+ drop_table :u2f_registrations
+ end
+
+ def down
+ create_table :u2f_registrations do |t| # rubocop: disable Migration/SchemaAdditionMethodsNoPost
+ t.text :certificate
+ t.string :key_handle
+ t.string :public_key
+ t.integer :counter
+ t.references :user, foreign_key: false
+ t.datetime_with_timezone :created_at, null: false
+ t.datetime_with_timezone :updated_at, null: false
+ t.string :name
+ t.index [:key_handle], name: 'index_u2f_registrations_on_key_handle'
+ end
+ end
+end
diff --git a/db/post_migrate/20230317004428_migrate_daily_redis_hll_events_to_weekly_aggregation.rb b/db/post_migrate/20230317004428_migrate_daily_redis_hll_events_to_weekly_aggregation.rb
index 59bff26f964..168354cd946 100644
--- a/db/post_migrate/20230317004428_migrate_daily_redis_hll_events_to_weekly_aggregation.rb
+++ b/db/post_migrate/20230317004428_migrate_daily_redis_hll_events_to_weekly_aggregation.rb
@@ -3,6 +3,12 @@
class MigrateDailyRedisHllEventsToWeeklyAggregation < Gitlab::Database::Migration[2.1]
disable_ddl_transaction!
+ # Due to the feature flag `use_metric_definitions_for_events_list`, this makes a `SELECT` call
+ # so this migration is now considered a DML (data manipulation) migration.
+ # For the time being, we need to specify only `main` database because it is now technically retriving DB data.
+ # Should be removed with <issue link>
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
DAILY_EVENTS =
%w[g_edit_by_web_ide
g_edit_by_sfe
diff --git a/db/post_migrate/20230523101514_finalize_user_type_migration.rb b/db/post_migrate/20230523101514_finalize_user_type_migration.rb
new file mode 100644
index 00000000000..c6533bec587
--- /dev/null
+++ b/db/post_migrate/20230523101514_finalize_user_type_migration.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class FinalizeUserTypeMigration < Gitlab::Database::Migration[2.1]
+ MIGRATION = 'MigrateHumanUserType'
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ disable_ddl_transaction!
+
+ def up
+ ensure_batched_background_migration_is_finished(
+ job_class_name: MIGRATION,
+ table_name: :users,
+ column_name: :id,
+ job_arguments: []
+ )
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20230528203340_drop_message_from_vulnerability_occurrences.rb b/db/post_migrate/20230528203340_drop_message_from_vulnerability_occurrences.rb
new file mode 100644
index 00000000000..4214ba803f6
--- /dev/null
+++ b/db/post_migrate/20230528203340_drop_message_from_vulnerability_occurrences.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class DropMessageFromVulnerabilityOccurrences < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ remove_column :vulnerability_occurrences, :message
+ end
+
+ def down
+ unless column_exists?(:vulnerability_occurrences, :message)
+ add_column :vulnerability_occurrences, :message, :text # rubocop:disable Migration/SchemaAdditionMethodsNoPost
+ end
+
+ add_check_constraint(:vulnerability_occurrences, 'char_length(message) <= 3000', 'check_df6dd20219')
+ end
+end
diff --git a/db/post_migrate/20230530012406_finalize_backfill_resource_link_events.rb b/db/post_migrate/20230530012406_finalize_backfill_resource_link_events.rb
new file mode 100644
index 00000000000..c86a341392f
--- /dev/null
+++ b/db/post_migrate/20230530012406_finalize_backfill_resource_link_events.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class FinalizeBackfillResourceLinkEvents < Gitlab::Database::Migration[2.1]
+ MIGRATION = 'BackfillResourceLinkEvents'
+ disable_ddl_transaction!
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ def up
+ ensure_batched_background_migration_is_finished(
+ job_class_name: MIGRATION,
+ table_name: :system_note_metadata,
+ column_name: :id,
+ job_arguments: [],
+ finalize: true
+ )
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20230601211635_add_detected_at_id_index_to_vulnerabilities.rb b/db/post_migrate/20230601211635_add_detected_at_id_index_to_vulnerabilities.rb
new file mode 100644
index 00000000000..e7ccfad1fd3
--- /dev/null
+++ b/db/post_migrate/20230601211635_add_detected_at_id_index_to_vulnerabilities.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddDetectedAtIdIndexToVulnerabilities < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_vulnerabilities_on_detected_at_and_id'
+
+ def up
+ add_concurrent_index :vulnerabilities, [:id, :detected_at], name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :vulnerabilities, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20230601213750_add_uuid_project_id_state_id_index_to_vulnerability_reads.rb b/db/post_migrate/20230601213750_add_uuid_project_id_state_id_index_to_vulnerability_reads.rb
new file mode 100644
index 00000000000..f91394eb783
--- /dev/null
+++ b/db/post_migrate/20230601213750_add_uuid_project_id_state_id_index_to_vulnerability_reads.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddUuidProjectIdStateIdIndexToVulnerabilityReads < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_vulnerability_reads_on_uuid_project_id_and_state'
+
+ def up
+ add_concurrent_index :vulnerability_reads, [:uuid, :project_id, :state], name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :vulnerability_reads, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20230608145500_add_prepared_at_index_to_merge_requests.rb b/db/post_migrate/20230608145500_add_prepared_at_index_to_merge_requests.rb
new file mode 100644
index 00000000000..3d3557ce543
--- /dev/null
+++ b/db/post_migrate/20230608145500_add_prepared_at_index_to_merge_requests.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class AddPreparedAtIndexToMergeRequests < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_merge_requests_on_id_and_prepared_at'
+
+ # TODO: Index to be created synchronously in https://gitlab.com/gitlab-org/gitlab/-/issues/415721
+
+ def up
+ prepare_async_index(:merge_requests,
+ :id,
+ name: INDEX_NAME,
+ where: "prepared_at IS NULL")
+ end
+
+ def down
+ unprepare_async_index(:merge_requests, :id, name: INDEX_NAME)
+ end
+end
diff --git a/db/post_migrate/20230609065942_backfill_ci_pipeline_variables_for_pipeline_id_bigint_conversion.rb b/db/post_migrate/20230609065942_backfill_ci_pipeline_variables_for_pipeline_id_bigint_conversion.rb
new file mode 100644
index 00000000000..c09820ad9d4
--- /dev/null
+++ b/db/post_migrate/20230609065942_backfill_ci_pipeline_variables_for_pipeline_id_bigint_conversion.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class BackfillCiPipelineVariablesForPipelineIdBigintConversion < Gitlab::Database::Migration[2.1]
+ restrict_gitlab_migration gitlab_schema: :gitlab_ci
+
+ TABLE = :ci_pipeline_variables
+ COLUMNS = %i[pipeline_id]
+
+ def up
+ backfill_conversion_of_integer_to_bigint(TABLE, COLUMNS, sub_batch_size: 500)
+ end
+
+ def down
+ revert_backfill_conversion_of_integer_to_bigint(TABLE, COLUMNS)
+ end
+end
diff --git a/db/post_migrate/20230613192703_ensure_ci_build_needs_big_int_backfill_is_finished_for_self_hosts.rb b/db/post_migrate/20230613192703_ensure_ci_build_needs_big_int_backfill_is_finished_for_self_hosts.rb
new file mode 100644
index 00000000000..7616944567e
--- /dev/null
+++ b/db/post_migrate/20230613192703_ensure_ci_build_needs_big_int_backfill_is_finished_for_self_hosts.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+class EnsureCiBuildNeedsBigIntBackfillIsFinishedForSelfHosts < Gitlab::Database::Migration[2.1]
+ include Gitlab::Database::MigrationHelpers::ConvertToBigint
+
+ disable_ddl_transaction!
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_ci
+
+ TABLE_NAME = 'ci_build_needs'
+
+ def up
+ ensure_batched_background_migration_is_finished(
+ job_class_name: 'CopyColumnUsingBackgroundMigrationJob',
+ table_name: TABLE_NAME,
+ column_name: 'id',
+ job_arguments: [['id'], ['id_convert_to_bigint']]
+ )
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20230613192802_swap_ci_build_needs_to_big_int_for_self_hosts.rb b/db/post_migrate/20230613192802_swap_ci_build_needs_to_big_int_for_self_hosts.rb
new file mode 100644
index 00000000000..7533de86a2a
--- /dev/null
+++ b/db/post_migrate/20230613192802_swap_ci_build_needs_to_big_int_for_self_hosts.rb
@@ -0,0 +1,74 @@
+# frozen_string_literal: true
+
+class SwapCiBuildNeedsToBigIntForSelfHosts < Gitlab::Database::Migration[2.1]
+ include Gitlab::Database::MigrationHelpers::ConvertToBigint
+
+ disable_ddl_transaction!
+
+ TABLE_NAME = 'ci_build_needs'
+
+ def up
+ return if should_skip?
+ return if temporary_column_already_dropped?
+ return if columns_already_swapped?
+
+ swap
+ end
+
+ def down
+ return if should_skip?
+ return if temporary_column_already_dropped?
+ return unless columns_already_swapped?
+
+ swap
+ end
+
+ private
+
+ def swap
+ add_concurrent_index TABLE_NAME, :id_convert_to_bigint, unique: true, name:
+ 'index_ci_build_needs_on_id_convert_to_bigint'
+
+ with_lock_retries(raise_on_exhaustion: true) do
+ execute "LOCK TABLE #{TABLE_NAME} IN ACCESS EXCLUSIVE MODE"
+
+ execute "ALTER TABLE #{TABLE_NAME} RENAME COLUMN id TO id_tmp"
+ execute "ALTER TABLE #{TABLE_NAME} RENAME COLUMN id_convert_to_bigint TO id"
+ execute "ALTER TABLE #{TABLE_NAME} RENAME COLUMN id_tmp TO id_convert_to_bigint"
+
+ function_name = Gitlab::Database::UnidirectionalCopyTrigger.on_table(
+ TABLE_NAME, connection: Ci::ApplicationRecord.connection
+ ).name(
+ :id, :id_convert_to_bigint
+ )
+
+ execute "ALTER FUNCTION #{quote_table_name(function_name)} RESET ALL"
+
+ execute "ALTER SEQUENCE ci_build_needs_id_seq OWNED BY #{TABLE_NAME}.id"
+ change_column_default TABLE_NAME, :id, -> { "nextval('ci_build_needs_id_seq'::regclass)" }
+ change_column_default TABLE_NAME, :id_convert_to_bigint, 0
+
+ execute "ALTER TABLE #{TABLE_NAME} DROP CONSTRAINT ci_build_needs_pkey CASCADE"
+ rename_index TABLE_NAME, 'index_ci_build_needs_on_id_convert_to_bigint', 'ci_build_needs_pkey'
+ execute "ALTER TABLE #{TABLE_NAME} ADD CONSTRAINT ci_build_needs_pkey PRIMARY KEY USING INDEX ci_build_needs_pkey"
+ end
+ end
+
+ def should_skip?
+ com_or_dev_or_test_but_not_jh?
+ end
+
+ def columns_already_swapped?
+ table_columns = columns(TABLE_NAME)
+ column_id = table_columns.find { |c| c.name == 'id' }
+ column_id_convert_to_bigint = table_columns.find { |c| c.name == 'id_convert_to_bigint' }
+
+ column_id.sql_type == 'bigint' && column_id_convert_to_bigint.sql_type == 'integer'
+ end
+
+ def temporary_column_already_dropped?
+ table_columns = columns(TABLE_NAME)
+
+ !table_columns.find { |c| c.name == 'id_convert_to_bigint' }
+ end
+end
diff --git a/db/post_migrate/20230614181310_track_organization_deletions.rb b/db/post_migrate/20230614181310_track_organization_deletions.rb
new file mode 100644
index 00000000000..9e936d6d285
--- /dev/null
+++ b/db/post_migrate/20230614181310_track_organization_deletions.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class TrackOrganizationDeletions < Gitlab::Database::Migration[2.1]
+ include Gitlab::Database::MigrationHelpers::LooseForeignKeyHelpers
+
+ enable_lock_retries!
+
+ def up
+ # This LFK trigger already exists on some environments and it was reverted
+ # in MR: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/122809
+ track_record_deletions(:organizations) unless has_loose_foreign_key?('organizations')
+ end
+
+ def down
+ untrack_record_deletions(:organizations)
+ end
+end
diff --git a/db/post_migrate/20230614182049_add_index_to_namespaces_organization_id.rb b/db/post_migrate/20230614182049_add_index_to_namespaces_organization_id.rb
new file mode 100644
index 00000000000..edbb0a8b953
--- /dev/null
+++ b/db/post_migrate/20230614182049_add_index_to_namespaces_organization_id.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class AddIndexToNamespacesOrganizationId < Gitlab::Database::Migration[2.1]
+ INDEX_NAME = 'index_namespaces_on_organization_id'
+ TABLE = :namespaces
+
+ disable_ddl_transaction!
+
+ # This index was added on GitLab SaaS in
+ # https://gitlab.com/gitlab-org/gitlab/-/merge_requests/120822
+
+ def up
+ add_concurrent_index TABLE, :organization_id, name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name TABLE, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20230615030402_remove_audit_events_group_index.rb b/db/post_migrate/20230615030402_remove_audit_events_group_index.rb
new file mode 100644
index 00000000000..9a77d7a4d0d
--- /dev/null
+++ b/db/post_migrate/20230615030402_remove_audit_events_group_index.rb
@@ -0,0 +1,40 @@
+# 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 RemoveAuditEventsGroupIndex < Gitlab::Database::Migration[2.1]
+ include Gitlab::Database::PartitioningMigrationHelpers
+
+ TABLE_NAME = :audit_events
+ COLUMN_NAMES = [:entity_id, :entity_type, :created_at, :id]
+ INDEX_NAME = 'index_audit_events_on_entity_id_and_entity_type_and_created_at'
+
+ # TODO: Index to be destroyed synchronously in https://gitlab.com/gitlab-org/gitlab/-/issues/415424
+ def up
+ each_partition(TABLE_NAME) do |partition, partition_index_name|
+ unprepare_async_index_by_name(partition.identifier, partition_index_name)
+ end
+ end
+
+ def down
+ each_partition(TABLE_NAME) do |partition, partition_index_name|
+ prepare_async_index(
+ partition.identifier,
+ COLUMN_NAMES,
+ name: partition_index_name
+ )
+ end
+ end
+
+ private
+
+ def each_partition(table_name)
+ partitioned_table = find_partitioned_table(table_name)
+ partitioned_table.postgres_partitions.order(:name).each do |partition|
+ partition_index_name = generated_index_name(partition.identifier, INDEX_NAME)
+
+ yield partition, partition_index_name
+ end
+ end
+end
diff --git a/db/post_migrate/20230615113748_replace_ci_job_artifacts_foreign_key_v3.rb b/db/post_migrate/20230615113748_replace_ci_job_artifacts_foreign_key_v3.rb
new file mode 100644
index 00000000000..92b3008ff00
--- /dev/null
+++ b/db/post_migrate/20230615113748_replace_ci_job_artifacts_foreign_key_v3.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class ReplaceCiJobArtifactsForeignKeyV3 < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :ci_job_artifacts, :p_ci_builds,
+ name: 'temp_fk_rails_c5137cb2c1_p',
+ column: [:partition_id, :job_id],
+ target_column: [:partition_id, :id],
+ on_update: :cascade,
+ on_delete: :cascade,
+ validate: true,
+ reverse_lock_order: true
+ end
+
+ def down
+ remove_foreign_key_if_exists :ci_job_artifacts, name: 'temp_fk_rails_c5137cb2c1_p'
+ end
+end
diff --git a/db/post_migrate/20230615113840_replace_ci_running_builds_foreign_key_v3.rb b/db/post_migrate/20230615113840_replace_ci_running_builds_foreign_key_v3.rb
new file mode 100644
index 00000000000..ef8f252bbf7
--- /dev/null
+++ b/db/post_migrate/20230615113840_replace_ci_running_builds_foreign_key_v3.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class ReplaceCiRunningBuildsForeignKeyV3 < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :ci_running_builds, :p_ci_builds,
+ name: 'temp_fk_rails_da45cfa165_p',
+ column: [:partition_id, :build_id],
+ target_column: [:partition_id, :id],
+ on_update: :cascade,
+ on_delete: :cascade,
+ validate: true,
+ reverse_lock_order: true
+ end
+
+ def down
+ remove_foreign_key_if_exists :ci_running_builds, name: 'temp_fk_rails_da45cfa165_p'
+ end
+end
diff --git a/db/post_migrate/20230615113858_replace_ci_job_variables_foreign_key_v3.rb b/db/post_migrate/20230615113858_replace_ci_job_variables_foreign_key_v3.rb
new file mode 100644
index 00000000000..76c83c90ad0
--- /dev/null
+++ b/db/post_migrate/20230615113858_replace_ci_job_variables_foreign_key_v3.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class ReplaceCiJobVariablesForeignKeyV3 < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :ci_job_variables, :p_ci_builds,
+ name: 'temp_fk_rails_fbf3b34792_p',
+ column: [:partition_id, :job_id],
+ target_column: [:partition_id, :id],
+ on_update: :cascade,
+ on_delete: :cascade,
+ validate: true,
+ reverse_lock_order: true
+ end
+
+ def down
+ remove_foreign_key_if_exists :ci_job_variables, name: 'temp_fk_rails_fbf3b34792_p'
+ end
+end
diff --git a/db/post_migrate/20230615121103_replace_p_ci_builds_metadata_foreign_key_v3.rb b/db/post_migrate/20230615121103_replace_p_ci_builds_metadata_foreign_key_v3.rb
new file mode 100644
index 00000000000..dca891fc064
--- /dev/null
+++ b/db/post_migrate/20230615121103_replace_p_ci_builds_metadata_foreign_key_v3.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+class ReplacePCiBuildsMetadataForeignKeyV3 < Gitlab::Database::Migration[2.1]
+ include Gitlab::Database::PartitioningMigrationHelpers
+ include Gitlab::Database::MigrationHelpers::WraparoundAutovacuum
+
+ disable_ddl_transaction!
+
+ def up
+ return unless should_run?
+
+ add_concurrent_partitioned_foreign_key :p_ci_builds_metadata, :p_ci_builds,
+ name: :temp_fk_e20479742e_p,
+ column: [:partition_id, :build_id],
+ target_column: [:partition_id, :id],
+ on_update: :cascade,
+ on_delete: :cascade,
+ validate: true,
+ reverse_lock_order: true
+ end
+
+ def down
+ return unless should_run?
+
+ with_lock_retries do
+ remove_foreign_key_if_exists :p_ci_builds_metadata, :p_ci_builds,
+ name: :temp_fk_e20479742e_p,
+ reverse_lock_order: true
+ end
+ end
+
+ private
+
+ def should_run?
+ can_execute_on?(:ci_builds_metadata, :ci_builds)
+ end
+end
diff --git a/db/post_migrate/20230615121122_replace_p_ci_runner_machine_builds_foreign_key_v3.rb b/db/post_migrate/20230615121122_replace_p_ci_runner_machine_builds_foreign_key_v3.rb
new file mode 100644
index 00000000000..854d7358e5e
--- /dev/null
+++ b/db/post_migrate/20230615121122_replace_p_ci_runner_machine_builds_foreign_key_v3.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+class ReplacePCiRunnerMachineBuildsForeignKeyV3 < Gitlab::Database::Migration[2.1]
+ include Gitlab::Database::PartitioningMigrationHelpers
+ include Gitlab::Database::MigrationHelpers::WraparoundAutovacuum
+
+ disable_ddl_transaction!
+
+ def up
+ return unless should_run?
+
+ add_concurrent_partitioned_foreign_key :p_ci_runner_machine_builds, :p_ci_builds,
+ name: :temp_fk_bb490f12fe_p,
+ column: [:partition_id, :build_id],
+ target_column: [:partition_id, :id],
+ on_update: :cascade,
+ on_delete: :cascade,
+ validate: true,
+ reverse_lock_order: true
+ end
+
+ def down
+ return unless should_run?
+
+ with_lock_retries do
+ remove_foreign_key_if_exists :p_ci_runner_machine_builds, :p_ci_builds,
+ name: :temp_fk_bb490f12fe_p,
+ reverse_lock_order: true
+ end
+ end
+
+ private
+
+ def should_run?
+ can_execute_on?(:ci_builds)
+ end
+end
diff --git a/db/post_migrate/20230615144627_remove_temporary_container_repository_indexes.rb b/db/post_migrate/20230615144627_remove_temporary_container_repository_indexes.rb
new file mode 100644
index 00000000000..c4d01f35607
--- /dev/null
+++ b/db/post_migrate/20230615144627_remove_temporary_container_repository_indexes.rb
@@ -0,0 +1,82 @@
+# frozen_string_literal: true
+
+class RemoveTemporaryContainerRepositoryIndexes < Gitlab::Database::Migration[2.1]
+ INDEX_CONTAINER_REPOS_ON_NON_MIGRATED = 'tmp_index_container_repos_on_non_migrated'
+ INDEX_CONTAINER_REPOSITORIES_ON_ID_MIGRATION_STATE = 'tmp_index_container_repositories_on_id_migration_state'
+ INDEX_MIGRATED_CONTAINER_REGISTRIES = 'tmp_index_migrated_container_registries'
+ INDEX_CONTAINER_REPOS_ON_IMPORT_STARTED_AT_WHEN_IMPORTING = 'idx_container_repos_on_import_started_at_when_importing'
+ INDEX_CONTAINER_REPOS_ON_MIGRATION_STATE_MIGRATION_PLAN_CREATED =
+ 'idx_container_repos_on_migration_state_migration_plan_created'
+ INDEX_CONTAINER_REPOS_ON_PRE_IMPORT_DONE_AT_WHEN_PRE_IMPORT_DONE =
+ 'idx_container_repos_on_pre_import_done_at_when_pre_import_done'
+ INDEX_CONTAINER_REPOS_ON_PRE_IMPORT_STARTED_AT_WHEN_PRE_IMPORTING =
+ 'idx_container_repos_on_pre_import_started_at_when_pre_importing'
+ INDEX_CONTAINER_REPOSITORIES_ON_GREATEST_COMPLETED_AT = 'index_container_repositories_on_greatest_completed_at'
+ INDEX_CONTAINER_REPOSITORIES_ON_MIGRATION_STATE_IMPORT_DONE_AT =
+ 'index_container_repositories_on_migration_state_import_done_at'
+
+ disable_ddl_transaction!
+
+ def up
+ remove_concurrent_index_by_name :container_repositories, INDEX_CONTAINER_REPOS_ON_NON_MIGRATED
+ remove_concurrent_index_by_name :container_repositories, INDEX_CONTAINER_REPOSITORIES_ON_ID_MIGRATION_STATE
+ remove_concurrent_index_by_name :container_repositories, INDEX_MIGRATED_CONTAINER_REGISTRIES
+ remove_concurrent_index_by_name :container_repositories, INDEX_CONTAINER_REPOS_ON_IMPORT_STARTED_AT_WHEN_IMPORTING
+ remove_concurrent_index_by_name :container_repositories,
+ INDEX_CONTAINER_REPOS_ON_MIGRATION_STATE_MIGRATION_PLAN_CREATED
+ remove_concurrent_index_by_name :container_repositories,
+ INDEX_CONTAINER_REPOS_ON_PRE_IMPORT_DONE_AT_WHEN_PRE_IMPORT_DONE
+ remove_concurrent_index_by_name :container_repositories,
+ INDEX_CONTAINER_REPOS_ON_PRE_IMPORT_STARTED_AT_WHEN_PRE_IMPORTING
+ remove_concurrent_index_by_name :container_repositories, INDEX_CONTAINER_REPOSITORIES_ON_GREATEST_COMPLETED_AT
+ remove_concurrent_index_by_name :container_repositories,
+ INDEX_CONTAINER_REPOSITORIES_ON_MIGRATION_STATE_IMPORT_DONE_AT
+ end
+
+ def down
+ add_concurrent_index :container_repositories,
+ [:project_id, :id],
+ name: INDEX_CONTAINER_REPOS_ON_NON_MIGRATED,
+ where: "migration_state != 'import_done'"
+
+ add_concurrent_index :container_repositories,
+ [:id, :migration_state],
+ name: INDEX_CONTAINER_REPOSITORIES_ON_ID_MIGRATION_STATE
+
+ add_concurrent_index :container_repositories,
+ [:project_id],
+ name: INDEX_MIGRATED_CONTAINER_REGISTRIES,
+ where: "migration_state = 'import_done' OR created_at >= '2022-01-23'"
+
+ add_concurrent_index :container_repositories,
+ [:migration_import_started_at],
+ name: INDEX_CONTAINER_REPOS_ON_IMPORT_STARTED_AT_WHEN_IMPORTING,
+ where: "migration_state = 'importing'::text"
+
+ add_concurrent_index :container_repositories,
+ [:migration_state, :migration_plan, :created_at],
+ name: INDEX_CONTAINER_REPOS_ON_MIGRATION_STATE_MIGRATION_PLAN_CREATED
+
+ add_concurrent_index :container_repositories,
+ [:migration_pre_import_done_at],
+ name: INDEX_CONTAINER_REPOS_ON_PRE_IMPORT_DONE_AT_WHEN_PRE_IMPORT_DONE,
+ where: "migration_state = 'pre_import_done'::text"
+
+ add_concurrent_index :container_repositories,
+ [:migration_pre_import_started_at],
+ name: INDEX_CONTAINER_REPOS_ON_PRE_IMPORT_STARTED_AT_WHEN_PRE_IMPORTING,
+ where: "migration_state = 'pre_importing'::text"
+
+ execute(
+ <<-SQL
+ CREATE INDEX CONCURRENTLY #{INDEX_CONTAINER_REPOSITORIES_ON_GREATEST_COMPLETED_AT} ON container_repositories
+ USING btree (GREATEST(migration_pre_import_done_at, migration_import_done_at, migration_aborted_at, migration_skipped_at))
+ WHERE (migration_state = ANY (ARRAY['import_done'::text, 'pre_import_done'::text, 'import_aborted'::text, 'import_skipped'::text]));
+ SQL
+ )
+
+ add_concurrent_index :container_repositories,
+ [:migration_state, :migration_import_done_at],
+ name: INDEX_CONTAINER_REPOSITORIES_ON_MIGRATION_STATE_IMPORT_DONE_AT
+ end
+end
diff --git a/db/post_migrate/20230616082958_add_unique_index_for_npm_packages_on_project_id_name_version.rb b/db/post_migrate/20230616082958_add_unique_index_for_npm_packages_on_project_id_name_version.rb
new file mode 100644
index 00000000000..646bbf414e2
--- /dev/null
+++ b/db/post_migrate/20230616082958_add_unique_index_for_npm_packages_on_project_id_name_version.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class AddUniqueIndexForNpmPackagesOnProjectIdNameVersion < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'idx_packages_on_project_id_name_version_unique_when_npm'
+ PACKAGE_TYPE_NPM = 2
+
+ def up
+ add_concurrent_index(
+ :packages_packages,
+ %i[project_id name version],
+ name: INDEX_NAME,
+ unique: true,
+ where: "package_type = #{PACKAGE_TYPE_NPM} AND status <> 4"
+ )
+ end
+
+ def down
+ remove_concurrent_index_by_name :packages_packages, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20230618020202_finish_user_type_migration.rb b/db/post_migrate/20230618020202_finish_user_type_migration.rb
new file mode 100644
index 00000000000..4a729d5d408
--- /dev/null
+++ b/db/post_migrate/20230618020202_finish_user_type_migration.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class FinishUserTypeMigration < Gitlab::Database::Migration[2.1]
+ MIGRATION = 'MigrateHumanUserType'
+
+ disable_ddl_transaction!
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ def up
+ ensure_batched_background_migration_is_finished(
+ job_class_name: MIGRATION,
+ table_name: :users,
+ column_name: :id,
+ job_arguments: []
+ )
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20230619005223_change_unconfirmed_created_at_index_on_users.rb b/db/post_migrate/20230619005223_change_unconfirmed_created_at_index_on_users.rb
new file mode 100644
index 00000000000..5b9b4e36512
--- /dev/null
+++ b/db/post_migrate/20230619005223_change_unconfirmed_created_at_index_on_users.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+class ChangeUnconfirmedCreatedAtIndexOnUsers < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ OLD_INDEX_NAME = 'index_users_on_unconfirmed_and_created_at_for_active_humans'
+ NEW_INDEX_NAME = 'index_users_on_unconfirmed_created_at_active_type_sign_in_count'
+
+ def up
+ add_concurrent_index :users, [:created_at, :id],
+ name: NEW_INDEX_NAME,
+ where: "confirmed_at IS NULL AND state = 'active' AND user_type IN (0) AND sign_in_count = 0"
+
+ remove_concurrent_index_by_name :users, OLD_INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :users, [:created_at, :id],
+ name: OLD_INDEX_NAME,
+ where: "confirmed_at IS NULL AND state = 'active' AND user_type IN (0)"
+
+ remove_concurrent_index_by_name :users, NEW_INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20230619072744_schedule_index_events_on_project_id_and_id_desc_on_merged_action_for_removal.rb b/db/post_migrate/20230619072744_schedule_index_events_on_project_id_and_id_desc_on_merged_action_for_removal.rb
new file mode 100644
index 00000000000..b73ddfffad6
--- /dev/null
+++ b/db/post_migrate/20230619072744_schedule_index_events_on_project_id_and_id_desc_on_merged_action_for_removal.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class ScheduleIndexEventsOnProjectIdAndIdDescOnMergedActionForRemoval < Gitlab::Database::Migration[2.1]
+ INDEX_NAME = 'index_events_on_project_id_and_id_desc_on_merged_action'
+
+ # TODO: Index to be destroyed synchronously in https://gitlab.com/gitlab-org/gitlab/-/issues/415091
+
+ def up
+ prepare_async_index_removal :events, [:project_id, :id], order: { id: :desc },
+ where: "action = 7", name: INDEX_NAME
+ end
+
+ def down
+ unprepare_async_index :events, [:project_id, :id], order: { id: :desc },
+ where: "action = 7", name: INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20230619081412_add_index_to_ci_triggers_token.rb b/db/post_migrate/20230619081412_add_index_to_ci_triggers_token.rb
new file mode 100644
index 00000000000..861c9eafd9f
--- /dev/null
+++ b/db/post_migrate/20230619081412_add_index_to_ci_triggers_token.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddIndexToCiTriggersToken < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_ci_triggers_on_token'
+
+ def up
+ add_concurrent_index :ci_triggers, :token, unique: true, name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name(:ci_triggers, INDEX_NAME)
+ end
+end
diff --git a/db/post_migrate/20230619123701_schedule_removal_index_job_artifacts_id_and_expire_at.rb b/db/post_migrate/20230619123701_schedule_removal_index_job_artifacts_id_and_expire_at.rb
new file mode 100644
index 00000000000..0473032bb98
--- /dev/null
+++ b/db/post_migrate/20230619123701_schedule_removal_index_job_artifacts_id_and_expire_at.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class ScheduleRemovalIndexJobArtifactsIdAndExpireAt < Gitlab::Database::Migration[2.1]
+ INDEX_NAME = :tmp_index_ci_job_artifacts_on_id_expire_at_file_type_trace
+ TABLE_NAME = :ci_job_artifacts
+ COLUMN = :id
+
+ # Index to be destroyed synchronously in https://gitlab.com/gitlab-org/gitlab/-/issues/368979
+ def up
+ prepare_async_index_removal(TABLE_NAME, COLUMN, name: INDEX_NAME)
+ end
+
+ def down
+ unprepare_async_index(TABLE_NAME, COLUMN, name: INDEX_NAME)
+ end
+end
diff --git a/db/post_migrate/20230619134106_prepare_index_for_vulnerability_reads_on_common_project_filters.rb b/db/post_migrate/20230619134106_prepare_index_for_vulnerability_reads_on_common_project_filters.rb
new file mode 100644
index 00000000000..60335f572d5
--- /dev/null
+++ b/db/post_migrate/20230619134106_prepare_index_for_vulnerability_reads_on_common_project_filters.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class PrepareIndexForVulnerabilityReadsOnCommonProjectFilters < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_project_vulnerability_reads_common_finder_query_desc'
+
+ def up
+ prepare_async_index :vulnerability_reads,
+ [:project_id, :state, :report_type, :severity, :vulnerability_id],
+ order: { severity: :desc, vulnerability_id: :desc },
+ name: INDEX_NAME
+ end
+
+ def down
+ unprepare_async_index_by_name :vulnerability_reads, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20230620072854_replace_old_fk_ci_build_pending_states_to_builds_v2.rb b/db/post_migrate/20230620072854_replace_old_fk_ci_build_pending_states_to_builds_v2.rb
new file mode 100644
index 00000000000..dd6acb8a365
--- /dev/null
+++ b/db/post_migrate/20230620072854_replace_old_fk_ci_build_pending_states_to_builds_v2.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+class ReplaceOldFkCiBuildPendingStatesToBuildsV2 < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ return if new_foreign_key_exists?
+
+ with_lock_retries do
+ remove_foreign_key_if_exists :ci_build_pending_states, :ci_builds,
+ name: :fk_861cd17da3_p, reverse_lock_order: true
+
+ rename_constraint :ci_build_pending_states, :temp_fk_861cd17da3_p, :fk_861cd17da3_p
+ end
+ end
+
+ def down
+ return unless new_foreign_key_exists?
+
+ add_concurrent_foreign_key :ci_build_pending_states, :ci_builds,
+ name: :temp_fk_861cd17da3_p,
+ column: [:partition_id, :build_id],
+ target_column: [:partition_id, :id],
+ on_update: :cascade,
+ on_delete: :cascade,
+ validate: true,
+ reverse_lock_order: true
+
+ switch_constraint_names :ci_build_pending_states, :fk_861cd17da3_p, :temp_fk_861cd17da3_p
+ end
+
+ private
+
+ def new_foreign_key_exists?
+ foreign_key_exists?(:ci_build_pending_states, :p_ci_builds, name: :fk_861cd17da3_p)
+ end
+end
diff --git a/db/post_migrate/20230620072856_replace_old_fk_ci_build_trace_chunks_to_builds_v2.rb b/db/post_migrate/20230620072856_replace_old_fk_ci_build_trace_chunks_to_builds_v2.rb
new file mode 100644
index 00000000000..d715ba11500
--- /dev/null
+++ b/db/post_migrate/20230620072856_replace_old_fk_ci_build_trace_chunks_to_builds_v2.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+class ReplaceOldFkCiBuildTraceChunksToBuildsV2 < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ return if new_foreign_key_exists?
+
+ with_lock_retries do
+ remove_foreign_key_if_exists :ci_build_trace_chunks, :ci_builds,
+ name: :fk_89e29fa5ee_p, reverse_lock_order: true
+
+ rename_constraint :ci_build_trace_chunks, :temp_fk_89e29fa5ee_p, :fk_89e29fa5ee_p
+ end
+ end
+
+ def down
+ return unless new_foreign_key_exists?
+
+ add_concurrent_foreign_key :ci_build_trace_chunks, :ci_builds,
+ name: :temp_fk_89e29fa5ee_p,
+ column: [:partition_id, :build_id],
+ target_column: [:partition_id, :id],
+ on_update: :cascade,
+ on_delete: :cascade,
+ validate: true,
+ reverse_lock_order: true
+
+ switch_constraint_names :ci_build_trace_chunks, :fk_89e29fa5ee_p, :temp_fk_89e29fa5ee_p
+ end
+
+ private
+
+ def new_foreign_key_exists?
+ foreign_key_exists?(:ci_build_trace_chunks, :p_ci_builds, name: :fk_89e29fa5ee_p)
+ end
+end
diff --git a/db/post_migrate/20230620072900_replace_old_fk_ci_unit_test_failures_to_builds_v2.rb b/db/post_migrate/20230620072900_replace_old_fk_ci_unit_test_failures_to_builds_v2.rb
new file mode 100644
index 00000000000..fe305ccd29d
--- /dev/null
+++ b/db/post_migrate/20230620072900_replace_old_fk_ci_unit_test_failures_to_builds_v2.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+class ReplaceOldFkCiUnitTestFailuresToBuildsV2 < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ return if new_foreign_key_exists?
+
+ with_lock_retries do
+ remove_foreign_key_if_exists :ci_unit_test_failures, :ci_builds,
+ name: :fk_9e0fc58930_p, reverse_lock_order: true
+
+ rename_constraint :ci_unit_test_failures, :temp_fk_9e0fc58930_p, :fk_9e0fc58930_p
+ end
+ end
+
+ def down
+ return unless new_foreign_key_exists?
+
+ add_concurrent_foreign_key :ci_unit_test_failures, :ci_builds,
+ name: :temp_fk_9e0fc58930_p,
+ column: [:partition_id, :build_id],
+ target_column: [:partition_id, :id],
+ on_update: :cascade,
+ on_delete: :cascade,
+ validate: true,
+ reverse_lock_order: true
+
+ switch_constraint_names :ci_unit_test_failures, :fk_9e0fc58930_p, :temp_fk_9e0fc58930_p
+ end
+
+ private
+
+ def new_foreign_key_exists?
+ foreign_key_exists?(:ci_unit_test_failures, :p_ci_builds, name: :fk_9e0fc58930_p)
+ end
+end
diff --git a/db/post_migrate/20230620072905_replace_old_fk_ci_sources_pipelines_to_builds_v2.rb b/db/post_migrate/20230620072905_replace_old_fk_ci_sources_pipelines_to_builds_v2.rb
new file mode 100644
index 00000000000..44a24182382
--- /dev/null
+++ b/db/post_migrate/20230620072905_replace_old_fk_ci_sources_pipelines_to_builds_v2.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+class ReplaceOldFkCiSourcesPipelinesToBuildsV2 < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ return if new_foreign_key_exists?
+
+ with_lock_retries do
+ remove_foreign_key_if_exists :ci_sources_pipelines, :ci_builds,
+ name: :fk_be5624bf37_p, reverse_lock_order: true
+
+ rename_constraint :ci_sources_pipelines, :temp_fk_be5624bf37_p, :fk_be5624bf37_p
+ end
+ end
+
+ def down
+ return unless new_foreign_key_exists?
+
+ add_concurrent_foreign_key :ci_sources_pipelines, :ci_builds,
+ name: :temp_fk_be5624bf37_p,
+ column: [:source_partition_id, :source_job_id],
+ target_column: [:partition_id, :id],
+ on_update: :cascade,
+ on_delete: :cascade,
+ validate: true,
+ reverse_lock_order: true
+
+ switch_constraint_names :ci_sources_pipelines, :fk_be5624bf37_p, :temp_fk_be5624bf37_p
+ end
+
+ private
+
+ def new_foreign_key_exists?
+ foreign_key_exists?(:ci_sources_pipelines, :p_ci_builds, name: :fk_be5624bf37_p)
+ end
+end
diff --git a/db/post_migrate/20230620072908_replace_old_fk_ci_resources_to_builds_v2.rb b/db/post_migrate/20230620072908_replace_old_fk_ci_resources_to_builds_v2.rb
new file mode 100644
index 00000000000..ad4773f5b9d
--- /dev/null
+++ b/db/post_migrate/20230620072908_replace_old_fk_ci_resources_to_builds_v2.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+class ReplaceOldFkCiResourcesToBuildsV2 < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ return if new_foreign_key_exists?
+
+ with_lock_retries do
+ remove_foreign_key_if_exists :ci_resources, :ci_builds,
+ name: :fk_e169a8e3d5_p, reverse_lock_order: true
+
+ rename_constraint :ci_resources, :temp_fk_e169a8e3d5_p, :fk_e169a8e3d5_p
+ end
+ end
+
+ def down
+ return unless new_foreign_key_exists?
+
+ add_concurrent_foreign_key :ci_resources, :ci_builds,
+ name: :temp_fk_e169a8e3d5_p,
+ column: [:partition_id, :build_id],
+ target_column: [:partition_id, :id],
+ on_update: :cascade,
+ on_delete: :nullify,
+ validate: true,
+ reverse_lock_order: true
+
+ switch_constraint_names :ci_resources, :fk_e169a8e3d5_p, :temp_fk_e169a8e3d5_p
+ end
+
+ private
+
+ def new_foreign_key_exists?
+ foreign_key_exists?(:ci_resources, :p_ci_builds, name: :fk_e169a8e3d5_p)
+ end
+end
diff --git a/db/post_migrate/20230620072911_replace_old_fk_ci_build_report_results_to_builds_v2.rb b/db/post_migrate/20230620072911_replace_old_fk_ci_build_report_results_to_builds_v2.rb
new file mode 100644
index 00000000000..f7d5e703e61
--- /dev/null
+++ b/db/post_migrate/20230620072911_replace_old_fk_ci_build_report_results_to_builds_v2.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+class ReplaceOldFkCiBuildReportResultsToBuildsV2 < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ return if new_foreign_key_exists?
+
+ with_lock_retries do
+ remove_foreign_key_if_exists :ci_build_report_results, :ci_builds,
+ name: :fk_rails_16cb1ff064_p, reverse_lock_order: true
+
+ rename_constraint :ci_build_report_results, :temp_fk_rails_16cb1ff064_p, :fk_rails_16cb1ff064_p
+ end
+ end
+
+ def down
+ return unless new_foreign_key_exists?
+
+ add_concurrent_foreign_key :ci_build_report_results, :ci_builds,
+ name: :temp_fk_rails_16cb1ff064_p,
+ column: [:partition_id, :build_id],
+ target_column: [:partition_id, :id],
+ on_update: :cascade,
+ on_delete: :cascade,
+ validate: true,
+ reverse_lock_order: true
+
+ switch_constraint_names :ci_build_report_results, :fk_rails_16cb1ff064_p, :temp_fk_rails_16cb1ff064_p
+ end
+
+ private
+
+ def new_foreign_key_exists?
+ foreign_key_exists?(:ci_build_report_results, :p_ci_builds, name: :fk_rails_16cb1ff064_p)
+ end
+end
diff --git a/db/post_migrate/20230620072915_replace_old_fk_ci_build_needs_to_builds_v2.rb b/db/post_migrate/20230620072915_replace_old_fk_ci_build_needs_to_builds_v2.rb
new file mode 100644
index 00000000000..a6f93eee035
--- /dev/null
+++ b/db/post_migrate/20230620072915_replace_old_fk_ci_build_needs_to_builds_v2.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+class ReplaceOldFkCiBuildNeedsToBuildsV2 < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ return if new_foreign_key_exists?
+
+ with_lock_retries do
+ remove_foreign_key_if_exists :ci_build_needs, :ci_builds,
+ name: :fk_rails_3cf221d4ed_p, reverse_lock_order: true
+
+ rename_constraint :ci_build_needs, :temp_fk_rails_3cf221d4ed_p, :fk_rails_3cf221d4ed_p
+ end
+ end
+
+ def down
+ return unless new_foreign_key_exists?
+
+ add_concurrent_foreign_key :ci_build_needs, :ci_builds,
+ name: :temp_fk_rails_3cf221d4ed_p,
+ column: [:partition_id, :build_id],
+ target_column: [:partition_id, :id],
+ on_update: :cascade,
+ on_delete: :cascade,
+ validate: true,
+ reverse_lock_order: true
+
+ switch_constraint_names :ci_build_needs, :fk_rails_3cf221d4ed_p, :temp_fk_rails_3cf221d4ed_p
+ end
+
+ private
+
+ def new_foreign_key_exists?
+ foreign_key_exists?(:ci_build_needs, :p_ci_builds, name: :fk_rails_3cf221d4ed_p)
+ end
+end
diff --git a/db/post_migrate/20230620072917_replace_old_fk_ci_builds_runner_session_to_builds_v2.rb b/db/post_migrate/20230620072917_replace_old_fk_ci_builds_runner_session_to_builds_v2.rb
new file mode 100644
index 00000000000..01b9bbee633
--- /dev/null
+++ b/db/post_migrate/20230620072917_replace_old_fk_ci_builds_runner_session_to_builds_v2.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+class ReplaceOldFkCiBuildsRunnerSessionToBuildsV2 < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ return if new_foreign_key_exists?
+
+ with_lock_retries do
+ remove_foreign_key_if_exists :ci_builds_runner_session, :ci_builds,
+ name: :fk_rails_70707857d3_p, reverse_lock_order: true
+
+ rename_constraint :ci_builds_runner_session, :temp_fk_rails_70707857d3_p, :fk_rails_70707857d3_p
+ end
+ end
+
+ def down
+ return unless new_foreign_key_exists?
+
+ add_concurrent_foreign_key :ci_builds_runner_session, :ci_builds,
+ name: :temp_fk_rails_70707857d3_p,
+ column: [:partition_id, :build_id],
+ target_column: [:partition_id, :id],
+ on_update: :cascade,
+ on_delete: :cascade,
+ validate: true,
+ reverse_lock_order: true
+
+ switch_constraint_names :ci_builds_runner_session, :fk_rails_70707857d3_p, :temp_fk_rails_70707857d3_p
+ end
+
+ private
+
+ def new_foreign_key_exists?
+ foreign_key_exists?(:ci_builds_runner_session, :p_ci_builds, name: :fk_rails_70707857d3_p)
+ end
+end
diff --git a/db/post_migrate/20230620072920_replace_old_fk_ci_pending_builds_to_builds_v2.rb b/db/post_migrate/20230620072920_replace_old_fk_ci_pending_builds_to_builds_v2.rb
new file mode 100644
index 00000000000..4861bb646f5
--- /dev/null
+++ b/db/post_migrate/20230620072920_replace_old_fk_ci_pending_builds_to_builds_v2.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+class ReplaceOldFkCiPendingBuildsToBuildsV2 < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ return if new_foreign_key_exists?
+
+ with_lock_retries do
+ remove_foreign_key_if_exists :ci_pending_builds, :ci_builds,
+ name: :fk_rails_725a2644a3_p, reverse_lock_order: true
+
+ rename_constraint :ci_pending_builds, :temp_fk_rails_725a2644a3_p, :fk_rails_725a2644a3_p
+ end
+ end
+
+ def down
+ return unless new_foreign_key_exists?
+
+ add_concurrent_foreign_key :ci_pending_builds, :ci_builds,
+ name: :temp_fk_rails_725a2644a3_p,
+ column: [:partition_id, :build_id],
+ target_column: [:partition_id, :id],
+ on_update: :cascade,
+ on_delete: :cascade,
+ validate: true,
+ reverse_lock_order: true
+
+ switch_constraint_names :ci_pending_builds, :fk_rails_725a2644a3_p, :temp_fk_rails_725a2644a3_p
+ end
+
+ private
+
+ def new_foreign_key_exists?
+ foreign_key_exists?(:ci_pending_builds, :p_ci_builds, name: :fk_rails_725a2644a3_p)
+ end
+end
diff --git a/db/post_migrate/20230620072925_replace_old_fk_ci_build_trace_metadata_to_builds_v2.rb b/db/post_migrate/20230620072925_replace_old_fk_ci_build_trace_metadata_to_builds_v2.rb
new file mode 100644
index 00000000000..be004eb5121
--- /dev/null
+++ b/db/post_migrate/20230620072925_replace_old_fk_ci_build_trace_metadata_to_builds_v2.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+class ReplaceOldFkCiBuildTraceMetadataToBuildsV2 < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ return if new_foreign_key_exists?
+
+ with_lock_retries do
+ remove_foreign_key_if_exists :ci_build_trace_metadata, :ci_builds,
+ name: :fk_rails_aebc78111f_p, reverse_lock_order: true
+
+ rename_constraint :ci_build_trace_metadata, :temp_fk_rails_aebc78111f_p, :fk_rails_aebc78111f_p
+ end
+ end
+
+ def down
+ return unless new_foreign_key_exists?
+
+ add_concurrent_foreign_key :ci_build_trace_metadata, :ci_builds,
+ name: :temp_fk_rails_aebc78111f_p,
+ column: [:partition_id, :build_id],
+ target_column: [:partition_id, :id],
+ on_update: :cascade,
+ on_delete: :cascade,
+ validate: true,
+ reverse_lock_order: true
+
+ switch_constraint_names :ci_build_trace_metadata, :fk_rails_aebc78111f_p, :temp_fk_rails_aebc78111f_p
+ end
+
+ private
+
+ def new_foreign_key_exists?
+ foreign_key_exists?(:ci_build_trace_metadata, :p_ci_builds, name: :fk_rails_aebc78111f_p)
+ end
+end
diff --git a/db/post_migrate/20230620105919_replace_old_fk_ci_job_artifacts_to_builds.rb b/db/post_migrate/20230620105919_replace_old_fk_ci_job_artifacts_to_builds.rb
new file mode 100644
index 00000000000..33aca3bc858
--- /dev/null
+++ b/db/post_migrate/20230620105919_replace_old_fk_ci_job_artifacts_to_builds.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+class ReplaceOldFkCiJobArtifactsToBuilds < Gitlab::Database::Migration[2.1]
+ include Gitlab::Database::MigrationHelpers::WraparoundAutovacuum
+
+ disable_ddl_transaction!
+
+ def up
+ return unless should_run?
+ return if new_foreign_key_exists?
+
+ with_lock_retries do
+ remove_foreign_key_if_exists :ci_job_artifacts, :ci_builds,
+ name: :fk_rails_c5137cb2c1_p, reverse_lock_order: true
+
+ rename_constraint :ci_job_artifacts, :temp_fk_rails_c5137cb2c1_p, :fk_rails_c5137cb2c1_p
+ end
+ end
+
+ def down
+ return unless should_run?
+ return unless new_foreign_key_exists?
+
+ add_concurrent_foreign_key :ci_job_artifacts, :ci_builds,
+ name: :temp_fk_rails_c5137cb2c1_p,
+ column: [:partition_id, :job_id],
+ target_column: [:partition_id, :id],
+ on_update: :cascade,
+ on_delete: :cascade,
+ validate: true,
+ reverse_lock_order: true
+
+ switch_constraint_names :ci_job_artifacts, :fk_rails_c5137cb2c1_p, :temp_fk_rails_c5137cb2c1_p
+ end
+
+ private
+
+ def should_run?
+ can_execute_on?(:ci_job_artifacts, :ci_builds)
+ end
+
+ def new_foreign_key_exists?
+ foreign_key_exists?(:ci_job_artifacts, :p_ci_builds, name: :fk_rails_c5137cb2c1_p)
+ end
+end
diff --git a/db/post_migrate/20230620110004_replace_old_fk_ci_running_builds_to_builds.rb b/db/post_migrate/20230620110004_replace_old_fk_ci_running_builds_to_builds.rb
new file mode 100644
index 00000000000..77a6e24f4fa
--- /dev/null
+++ b/db/post_migrate/20230620110004_replace_old_fk_ci_running_builds_to_builds.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+class ReplaceOldFkCiRunningBuildsToBuilds < Gitlab::Database::Migration[2.1]
+ include Gitlab::Database::MigrationHelpers::WraparoundAutovacuum
+
+ disable_ddl_transaction!
+
+ def up
+ return unless should_run?
+ return if new_foreign_key_exists?
+
+ with_lock_retries do
+ remove_foreign_key_if_exists :ci_running_builds, :ci_builds,
+ name: :fk_rails_da45cfa165_p, reverse_lock_order: true
+
+ rename_constraint :ci_running_builds, :temp_fk_rails_da45cfa165_p, :fk_rails_da45cfa165_p
+ end
+ end
+
+ def down
+ return unless should_run?
+ return unless new_foreign_key_exists?
+
+ add_concurrent_foreign_key :ci_running_builds, :ci_builds,
+ name: :temp_fk_rails_da45cfa165_p,
+ column: [:partition_id, :build_id],
+ target_column: [:partition_id, :id],
+ on_update: :cascade,
+ on_delete: :cascade,
+ validate: true,
+ reverse_lock_order: true
+
+ switch_constraint_names :ci_running_builds, :fk_rails_da45cfa165_p, :temp_fk_rails_da45cfa165_p
+ end
+
+ private
+
+ def should_run?
+ can_execute_on?(:ci_running_builds, :ci_builds)
+ end
+
+ def new_foreign_key_exists?
+ foreign_key_exists?(:ci_running_builds, :p_ci_builds, name: :fk_rails_da45cfa165_p)
+ end
+end
diff --git a/db/post_migrate/20230620110021_replace_old_fk_ci_job_variables_to_builds.rb b/db/post_migrate/20230620110021_replace_old_fk_ci_job_variables_to_builds.rb
new file mode 100644
index 00000000000..9d90c03d38a
--- /dev/null
+++ b/db/post_migrate/20230620110021_replace_old_fk_ci_job_variables_to_builds.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+class ReplaceOldFkCiJobVariablesToBuilds < Gitlab::Database::Migration[2.1]
+ include Gitlab::Database::MigrationHelpers::WraparoundAutovacuum
+
+ disable_ddl_transaction!
+
+ def up
+ return unless should_run?
+ return if new_foreign_key_exists?
+
+ with_lock_retries do
+ remove_foreign_key_if_exists :ci_job_variables, :ci_builds,
+ name: :fk_rails_fbf3b34792_p, reverse_lock_order: true
+
+ rename_constraint :ci_job_variables, :temp_fk_rails_fbf3b34792_p, :fk_rails_fbf3b34792_p
+ end
+ end
+
+ def down
+ return unless should_run?
+ return unless new_foreign_key_exists?
+
+ add_concurrent_foreign_key :ci_job_variables, :ci_builds,
+ name: :temp_fk_rails_fbf3b34792_p,
+ column: [:partition_id, :job_id],
+ target_column: [:partition_id, :id],
+ on_update: :cascade,
+ on_delete: :cascade,
+ validate: true,
+ reverse_lock_order: true
+
+ switch_constraint_names :ci_job_variables, :fk_rails_fbf3b34792_p, :temp_fk_rails_fbf3b34792_p
+ end
+
+ private
+
+ def should_run?
+ can_execute_on?(:ci_job_variables, :ci_builds)
+ end
+
+ def new_foreign_key_exists?
+ foreign_key_exists?(:ci_job_variables, :p_ci_builds, name: :fk_rails_fbf3b34792_p)
+ end
+end
diff --git a/db/post_migrate/20230620134708_validate_user_type_constraint.rb b/db/post_migrate/20230620134708_validate_user_type_constraint.rb
new file mode 100644
index 00000000000..cf06e3562d5
--- /dev/null
+++ b/db/post_migrate/20230620134708_validate_user_type_constraint.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class ValidateUserTypeConstraint < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ validate_not_null_constraint(:users, :user_type)
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20230620201738_add_index_issues_on_project_health_status_asc_work_item_type.rb b/db/post_migrate/20230620201738_add_index_issues_on_project_health_status_asc_work_item_type.rb
new file mode 100644
index 00000000000..a1777baa1c2
--- /dev/null
+++ b/db/post_migrate/20230620201738_add_index_issues_on_project_health_status_asc_work_item_type.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddIndexIssuesOnProjectHealthStatusAscWorkItemType < Gitlab::Database::Migration[2.1]
+ INDEX_NAME = 'index_issues_on_project_health_status_asc_work_item_type'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :issues,
+ [:project_id, :health_status, :id, :state_id, :work_item_type_id],
+ order: { health_status: 'ASC NULLS LAST', id: :desc },
+ name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :issues, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20230620201817_add_index_issues_on_project_health_status_desc_work_item_type.rb b/db/post_migrate/20230620201817_add_index_issues_on_project_health_status_desc_work_item_type.rb
new file mode 100644
index 00000000000..7eaa85bff56
--- /dev/null
+++ b/db/post_migrate/20230620201817_add_index_issues_on_project_health_status_desc_work_item_type.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddIndexIssuesOnProjectHealthStatusDescWorkItemType < Gitlab::Database::Migration[2.1]
+ INDEX_NAME = 'index_issues_on_project_health_status_desc_work_item_type'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :issues,
+ [:project_id, :health_status, :id, :state_id, :work_item_type_id],
+ order: { health_status: 'DESC NULLS LAST', id: :desc },
+ name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :issues, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20230621072848_add_text_limit_to_ci_variable_description.rb b/db/post_migrate/20230621072848_add_text_limit_to_ci_variable_description.rb
new file mode 100644
index 00000000000..485ac8bae61
--- /dev/null
+++ b/db/post_migrate/20230621072848_add_text_limit_to_ci_variable_description.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class AddTextLimitToCiVariableDescription < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ TABLE_NAME = :ci_variables
+ COLUMN_NAME = :description
+
+ def up
+ add_text_limit(TABLE_NAME, COLUMN_NAME, 255)
+ end
+
+ def down
+ remove_text_limit(TABLE_NAME, COLUMN_NAME)
+ end
+end
diff --git a/db/post_migrate/20230621083052_add_text_limit_to_ci_group_variable_description.rb b/db/post_migrate/20230621083052_add_text_limit_to_ci_group_variable_description.rb
new file mode 100644
index 00000000000..b0a5a3d539b
--- /dev/null
+++ b/db/post_migrate/20230621083052_add_text_limit_to_ci_group_variable_description.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class AddTextLimitToCiGroupVariableDescription < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ TABLE_NAME = :ci_group_variables
+ COLUMN_NAME = :description
+
+ def up
+ add_text_limit(TABLE_NAME, COLUMN_NAME, 255)
+ end
+
+ def down
+ remove_text_limit(TABLE_NAME, COLUMN_NAME)
+ end
+end
diff --git a/db/post_migrate/20230621102941_replace_old_fk_ci_job_artifacts_to_builds_v2.rb b/db/post_migrate/20230621102941_replace_old_fk_ci_job_artifacts_to_builds_v2.rb
new file mode 100644
index 00000000000..416b1c629c0
--- /dev/null
+++ b/db/post_migrate/20230621102941_replace_old_fk_ci_job_artifacts_to_builds_v2.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+class ReplaceOldFkCiJobArtifactsToBuildsV2 < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ return if new_foreign_key_exists?
+
+ with_lock_retries do
+ remove_foreign_key_if_exists :ci_job_artifacts, :ci_builds,
+ name: :fk_rails_c5137cb2c1_p, reverse_lock_order: true
+
+ rename_constraint :ci_job_artifacts, :temp_fk_rails_c5137cb2c1_p, :fk_rails_c5137cb2c1_p
+ end
+ end
+
+ def down
+ return unless new_foreign_key_exists?
+
+ add_concurrent_foreign_key :ci_job_artifacts, :ci_builds,
+ name: :temp_fk_rails_c5137cb2c1_p,
+ column: [:partition_id, :job_id],
+ target_column: [:partition_id, :id],
+ on_update: :cascade,
+ on_delete: :cascade,
+ validate: true,
+ reverse_lock_order: true
+
+ switch_constraint_names :ci_job_artifacts, :fk_rails_c5137cb2c1_p, :temp_fk_rails_c5137cb2c1_p
+ end
+
+ private
+
+ def new_foreign_key_exists?
+ foreign_key_exists?(:ci_job_artifacts, :p_ci_builds, name: :fk_rails_c5137cb2c1_p)
+ end
+end
diff --git a/db/post_migrate/20230621103000_replace_old_fk_ci_running_builds_to_builds_v2.rb b/db/post_migrate/20230621103000_replace_old_fk_ci_running_builds_to_builds_v2.rb
new file mode 100644
index 00000000000..32702eceb17
--- /dev/null
+++ b/db/post_migrate/20230621103000_replace_old_fk_ci_running_builds_to_builds_v2.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+class ReplaceOldFkCiRunningBuildsToBuildsV2 < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ return if new_foreign_key_exists?
+
+ with_lock_retries do
+ remove_foreign_key_if_exists :ci_running_builds, :ci_builds,
+ name: :fk_rails_da45cfa165_p, reverse_lock_order: true
+
+ rename_constraint :ci_running_builds, :temp_fk_rails_da45cfa165_p, :fk_rails_da45cfa165_p
+ end
+ end
+
+ def down
+ return unless new_foreign_key_exists?
+
+ add_concurrent_foreign_key :ci_running_builds, :ci_builds,
+ name: :temp_fk_rails_da45cfa165_p,
+ column: [:partition_id, :build_id],
+ target_column: [:partition_id, :id],
+ on_update: :cascade,
+ on_delete: :cascade,
+ validate: true,
+ reverse_lock_order: true
+
+ switch_constraint_names :ci_running_builds, :fk_rails_da45cfa165_p, :temp_fk_rails_da45cfa165_p
+ end
+
+ private
+
+ def new_foreign_key_exists?
+ foreign_key_exists?(:ci_running_builds, :p_ci_builds, name: :fk_rails_da45cfa165_p)
+ end
+end
diff --git a/db/post_migrate/20230621103043_replace_old_fk_ci_job_variables_to_builds_v2.rb b/db/post_migrate/20230621103043_replace_old_fk_ci_job_variables_to_builds_v2.rb
new file mode 100644
index 00000000000..68ae3dc56af
--- /dev/null
+++ b/db/post_migrate/20230621103043_replace_old_fk_ci_job_variables_to_builds_v2.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+class ReplaceOldFkCiJobVariablesToBuildsV2 < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ return if new_foreign_key_exists?
+
+ with_lock_retries do
+ remove_foreign_key_if_exists :ci_job_variables, :ci_builds,
+ name: :fk_rails_fbf3b34792_p, reverse_lock_order: true
+
+ rename_constraint :ci_job_variables, :temp_fk_rails_fbf3b34792_p, :fk_rails_fbf3b34792_p
+ end
+ end
+
+ def down
+ return unless new_foreign_key_exists?
+
+ add_concurrent_foreign_key :ci_job_variables, :ci_builds,
+ name: :temp_fk_rails_fbf3b34792_p,
+ column: [:partition_id, :job_id],
+ target_column: [:partition_id, :id],
+ on_update: :cascade,
+ on_delete: :cascade,
+ validate: true,
+ reverse_lock_order: true
+
+ switch_constraint_names :ci_job_variables, :fk_rails_fbf3b34792_p, :temp_fk_rails_fbf3b34792_p
+ end
+
+ private
+
+ def new_foreign_key_exists?
+ foreign_key_exists?(:ci_job_variables, :p_ci_builds, name: :fk_rails_fbf3b34792_p)
+ end
+end
diff --git a/db/post_migrate/20230622052046_remove_ci_pipeline_variables_trigger_and_old_column.rb b/db/post_migrate/20230622052046_remove_ci_pipeline_variables_trigger_and_old_column.rb
new file mode 100644
index 00000000000..81ce42c3aab
--- /dev/null
+++ b/db/post_migrate/20230622052046_remove_ci_pipeline_variables_trigger_and_old_column.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class RemoveCiPipelineVariablesTriggerAndOldColumn < Gitlab::Database::Migration[2.1]
+ enable_lock_retries!
+
+ TABLE = :ci_pipeline_variables
+ COLUMNS = [:id]
+
+ def up
+ cleanup_conversion_of_integer_to_bigint(TABLE, COLUMNS)
+ end
+
+ def down
+ restore_conversion_of_integer_to_bigint(TABLE, COLUMNS)
+ end
+end
diff --git a/db/post_migrate/20230622073752_ensure_backfill_ci_pipelines_bigint_id_is_completed.rb b/db/post_migrate/20230622073752_ensure_backfill_ci_pipelines_bigint_id_is_completed.rb
new file mode 100644
index 00000000000..56aeafc0a66
--- /dev/null
+++ b/db/post_migrate/20230622073752_ensure_backfill_ci_pipelines_bigint_id_is_completed.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class EnsureBackfillCiPipelinesBigintIdIsCompleted < Gitlab::Database::Migration[2.1]
+ include Gitlab::Database::MigrationHelpers::ConvertToBigint
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_ci
+ disable_ddl_transaction!
+
+ TABLE_NAME = :ci_pipelines
+
+ def up
+ ensure_batched_background_migration_is_finished(
+ job_class_name: 'CopyColumnUsingBackgroundMigrationJob',
+ table_name: TABLE_NAME,
+ column_name: 'id',
+ job_arguments: [['id'], ['id_convert_to_bigint']]
+ )
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20230623073906_prepare_async_index_for_ci_pipelines_bigint_id.rb b/db/post_migrate/20230623073906_prepare_async_index_for_ci_pipelines_bigint_id.rb
new file mode 100644
index 00000000000..57d4e37ca7c
--- /dev/null
+++ b/db/post_migrate/20230623073906_prepare_async_index_for_ci_pipelines_bigint_id.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class PrepareAsyncIndexForCiPipelinesBigintId < Gitlab::Database::Migration[2.1]
+ TABLE_NAME = :ci_pipelines
+ INDEX_NAME = "index_#{TABLE_NAME}_on_id_convert_to_bigint"
+
+ # TODO: Index to be created synchronously in https://gitlab.com/gitlab-org/gitlab/-/issues/397000
+ def up
+ prepare_async_index TABLE_NAME, :id_convert_to_bigint, unique: true, name: INDEX_NAME
+ end
+
+ def down
+ unprepare_async_index TABLE_NAME, :id_convert_to_bigint, unique: true, name: INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20230626070723_drop_unused_sent_notification_columns.rb b/db/post_migrate/20230626070723_drop_unused_sent_notification_columns.rb
new file mode 100644
index 00000000000..82a125c1ff5
--- /dev/null
+++ b/db/post_migrate/20230626070723_drop_unused_sent_notification_columns.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class DropUnusedSentNotificationColumns < Gitlab::Database::Migration[2.1]
+ enable_lock_retries!
+
+ def up
+ remove_column :sent_notifications, :line_code
+ remove_column :sent_notifications, :note_type
+ remove_column :sent_notifications, :position
+ end
+
+ def down
+ add_column :sent_notifications, :line_code, :string
+ add_column :sent_notifications, :note_type, :string
+ add_column :sent_notifications, :position, :text
+ end
+end
diff --git a/db/post_migrate/20230626072436_drop_tmp_index_job_artifacts_id_and_expire_at.rb b/db/post_migrate/20230626072436_drop_tmp_index_job_artifacts_id_and_expire_at.rb
new file mode 100644
index 00000000000..3b986a0dc5d
--- /dev/null
+++ b/db/post_migrate/20230626072436_drop_tmp_index_job_artifacts_id_and_expire_at.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+class DropTmpIndexJobArtifactsIdAndExpireAt < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ TABLE_NAME = :ci_job_artifacts
+ INDEX_NAME = :tmp_index_ci_job_artifacts_on_id_expire_at_file_type_trace
+
+ EXPIRE_AT_ON_22_MIDNIGHT_IN_TIMEZONE_OR_TRACE = <<~SQL
+ (EXTRACT(day FROM timezone('UTC', expire_at)) IN (21, 22, 23)
+ AND EXTRACT(minute FROM timezone('UTC', expire_at)) IN (0, 30, 45)
+ AND EXTRACT(second FROM timezone('UTC', expire_at)) = 0)
+ OR file_type = 3
+ SQL
+
+ def up
+ remove_concurrent_index_by_name(TABLE_NAME, INDEX_NAME)
+ end
+
+ def down
+ add_concurrent_index(
+ TABLE_NAME,
+ :id,
+ where: EXPIRE_AT_ON_22_MIDNIGHT_IN_TIMEZONE_OR_TRACE,
+ name: INDEX_NAME
+ )
+ end
+end
diff --git a/db/post_migrate/20230626101519_create_index_for_vulnerability_reads_on_common_project_filters.rb b/db/post_migrate/20230626101519_create_index_for_vulnerability_reads_on_common_project_filters.rb
new file mode 100644
index 00000000000..209a2295f22
--- /dev/null
+++ b/db/post_migrate/20230626101519_create_index_for_vulnerability_reads_on_common_project_filters.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class CreateIndexForVulnerabilityReadsOnCommonProjectFilters < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_project_vulnerability_reads_common_finder_query_desc'
+
+ def up
+ add_concurrent_index :vulnerability_reads,
+ [:project_id, :state, :report_type, :severity, :vulnerability_id],
+ order: { severity: :desc, vulnerability_id: :desc },
+ name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :vulnerability_reads, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20230626115046_add_temporary_index_on_vulnerability_reads.rb b/db/post_migrate/20230626115046_add_temporary_index_on_vulnerability_reads.rb
new file mode 100644
index 00000000000..8aa5cff2b96
--- /dev/null
+++ b/db/post_migrate/20230626115046_add_temporary_index_on_vulnerability_reads.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+class AddTemporaryIndexOnVulnerabilityReads < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = "tmp_idx_vuln_reads_where_dismissal_reason_null"
+ DISMISSED_STATE = 2
+
+ def up
+ add_concurrent_index(
+ :vulnerability_reads,
+ %i[id],
+ where: "state = #{DISMISSED_STATE} AND dismissal_reason IS NULL",
+ name: INDEX_NAME
+ )
+ end
+
+ def down
+ remove_concurrent_index_by_name(
+ :vulnerability_reads,
+ INDEX_NAME
+ )
+ end
+end
diff --git a/db/post_migrate/20230627115305_replace_p_ci_builds_metadata_foreign_key_v4.rb b/db/post_migrate/20230627115305_replace_p_ci_builds_metadata_foreign_key_v4.rb
new file mode 100644
index 00000000000..cb5a5c96b3c
--- /dev/null
+++ b/db/post_migrate/20230627115305_replace_p_ci_builds_metadata_foreign_key_v4.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+class ReplacePCiBuildsMetadataForeignKeyV4 < Gitlab::Database::Migration[2.1]
+ include Gitlab::Database::MigrationHelpers::WraparoundAutovacuum
+
+ disable_ddl_transaction!
+
+ def up
+ return unless should_run?
+ return if foreign_key_exists?(:p_ci_builds_metadata, :p_ci_builds, name: :temp_fk_e20479742e_p)
+
+ with_lock_retries do
+ execute(<<~SQL.squish)
+ LOCK TABLE ci_builds, p_ci_builds, p_ci_builds_metadata IN ACCESS EXCLUSIVE MODE;
+
+ ALTER TABLE p_ci_builds_metadata
+ ADD CONSTRAINT temp_fk_e20479742e_p
+ FOREIGN KEY (partition_id, build_id)
+ REFERENCES p_ci_builds (partition_id, id)
+ ON UPDATE CASCADE ON DELETE CASCADE;
+ SQL
+ end
+ end
+
+ def down
+ return unless should_run?
+
+ with_lock_retries do
+ remove_foreign_key_if_exists :p_ci_builds_metadata, :p_ci_builds,
+ name: :temp_fk_e20479742e_p,
+ reverse_lock_order: true
+ end
+ end
+
+ private
+
+ def should_run?
+ can_execute_on?(:ci_builds_metadata, :ci_builds)
+ end
+end
diff --git a/db/post_migrate/20230627140707_async_index_for_vulnerabilities_uuid_type_migration.rb b/db/post_migrate/20230627140707_async_index_for_vulnerabilities_uuid_type_migration.rb
new file mode 100644
index 00000000000..cfca60eb02c
--- /dev/null
+++ b/db/post_migrate/20230627140707_async_index_for_vulnerabilities_uuid_type_migration.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+class AsyncIndexForVulnerabilitiesUuidTypeMigration < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = "tmp_idx_vulns_on_converted_uuid"
+ WHERE_CLAUSE = "uuid_convert_string_to_uuid = '00000000-0000-0000-0000-000000000000'::uuid"
+
+ def up
+ prepare_async_index(
+ :vulnerability_occurrences,
+ %i[id uuid_convert_string_to_uuid],
+ name: INDEX_NAME,
+ where: WHERE_CLAUSE
+ )
+ end
+
+ def down
+ unprepare_async_index(
+ :vulnerability_occurrences,
+ %i[id uuid_convert_string_to_uuid],
+ name: INDEX_NAME
+ )
+ end
+end
diff --git a/db/post_migrate/20230627174139_add_index_to_pool_repositories.rb b/db/post_migrate/20230627174139_add_index_to_pool_repositories.rb
new file mode 100644
index 00000000000..bb0ea0609da
--- /dev/null
+++ b/db/post_migrate/20230627174139_add_index_to_pool_repositories.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class AddIndexToPoolRepositories < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ TABLE_NAME = :pool_repositories
+ OLD_INDEX_NAME = :index_pool_repositories_on_disk_path
+ NEW_INDEX_NAME = :unique_pool_repositories_on_disk_path_and_shard_id
+
+ def up
+ add_concurrent_index(TABLE_NAME, [:disk_path, :shard_id], name: NEW_INDEX_NAME, unique: true)
+
+ remove_concurrent_index_by_name(TABLE_NAME, OLD_INDEX_NAME)
+ end
+
+ def down
+ add_concurrent_index(TABLE_NAME, [:disk_path], name: OLD_INDEX_NAME, unique: true)
+
+ remove_concurrent_index_by_name(TABLE_NAME, NEW_INDEX_NAME)
+ end
+end
diff --git a/db/post_migrate/20230628023103_queue_backfill_missing_ci_cd_settings.rb b/db/post_migrate/20230628023103_queue_backfill_missing_ci_cd_settings.rb
new file mode 100644
index 00000000000..0fc39e96e18
--- /dev/null
+++ b/db/post_migrate/20230628023103_queue_backfill_missing_ci_cd_settings.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+class QueueBackfillMissingCiCdSettings < Gitlab::Database::Migration[2.1]
+ MIGRATION = "BackfillMissingCiCdSettings"
+ DELAY_INTERVAL = 2.minutes
+ BATCH_SIZE = 10_000
+ SUB_BATCH_SIZE = 500
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ def up
+ queue_batched_background_migration(
+ MIGRATION,
+ :projects,
+ :id,
+ job_interval: DELAY_INTERVAL,
+ batch_size: BATCH_SIZE,
+ sub_batch_size: SUB_BATCH_SIZE
+ )
+ end
+
+ def down
+ delete_batched_background_migration(MIGRATION, :projects, :id, [])
+ end
+end
diff --git a/db/post_migrate/20230629011859_cleanup_bigint_conversion_for_notes_for_gitlab_com.rb b/db/post_migrate/20230629011859_cleanup_bigint_conversion_for_notes_for_gitlab_com.rb
new file mode 100644
index 00000000000..5b99f4e4778
--- /dev/null
+++ b/db/post_migrate/20230629011859_cleanup_bigint_conversion_for_notes_for_gitlab_com.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+class CleanupBigintConversionForNotesForGitlabCom < Gitlab::Database::Migration[2.1]
+ include Gitlab::Database::MigrationHelpers::ConvertToBigint
+
+ enable_lock_retries!
+
+ TABLE = :notes
+ COLUMNS = [:id]
+
+ def up
+ return unless should_run?
+
+ cleanup_conversion_of_integer_to_bigint(TABLE, COLUMNS)
+ end
+
+ def down
+ return unless should_run?
+
+ restore_conversion_of_integer_to_bigint(TABLE, COLUMNS)
+ end
+
+ private
+
+ def should_run?
+ com_or_dev_or_test_but_not_jh?
+ end
+end
diff --git a/db/post_migrate/20230629024032_ensure_events_bigint_backfill_is_finished_for_gitlab_dot_com.rb b/db/post_migrate/20230629024032_ensure_events_bigint_backfill_is_finished_for_gitlab_dot_com.rb
new file mode 100644
index 00000000000..236b785c163
--- /dev/null
+++ b/db/post_migrate/20230629024032_ensure_events_bigint_backfill_is_finished_for_gitlab_dot_com.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+class EnsureEventsBigintBackfillIsFinishedForGitlabDotCom < Gitlab::Database::Migration[2.1]
+ include Gitlab::Database::MigrationHelpers::ConvertToBigint
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+ disable_ddl_transaction!
+
+ def up
+ return unless should_run?
+
+ ensure_batched_background_migration_is_finished(
+ job_class_name: 'CopyColumnUsingBackgroundMigrationJob',
+ table_name: 'events',
+ column_name: 'id',
+ job_arguments: [['target_id'], ['target_id_convert_to_bigint']]
+ )
+ end
+
+ def down
+ # no-op
+ end
+
+ private
+
+ def should_run?
+ com_or_dev_or_test_but_not_jh?
+ end
+end
diff --git a/db/post_migrate/20230629024403_events_bigint_create_indexe_async_for_gitlab_dot_com.rb b/db/post_migrate/20230629024403_events_bigint_create_indexe_async_for_gitlab_dot_com.rb
new file mode 100644
index 00000000000..13691034fd7
--- /dev/null
+++ b/db/post_migrate/20230629024403_events_bigint_create_indexe_async_for_gitlab_dot_com.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+class EventsBigintCreateIndexeAsyncForGitlabDotCom < Gitlab::Database::Migration[2.1]
+ include Gitlab::Database::MigrationHelpers::ConvertToBigint
+
+ def up
+ return unless should_run?
+
+ prepare_async_index :events,
+ [:target_type, :target_id_convert_to_bigint, :fingerprint],
+ name: :index_events_on_target_type_and_target_id_bigint_fingerprint,
+ unique: true
+ end
+
+ def down
+ return unless should_run?
+
+ unprepare_async_index :events,
+ [:target_type, :target_id_convert_to_bigint, :fingerprint],
+ name: :index_events_on_target_type_and_target_id_bigint_fingerprint
+ end
+
+ private
+
+ def should_run?
+ com_or_dev_or_test_but_not_jh?
+ end
+end
diff --git a/db/post_migrate/20230629095819_queue_backfill_uuid_conversion_column_in_vulnerability_occurrences.rb b/db/post_migrate/20230629095819_queue_backfill_uuid_conversion_column_in_vulnerability_occurrences.rb
new file mode 100644
index 00000000000..0ea7e2da38c
--- /dev/null
+++ b/db/post_migrate/20230629095819_queue_backfill_uuid_conversion_column_in_vulnerability_occurrences.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+class QueueBackfillUuidConversionColumnInVulnerabilityOccurrences < Gitlab::Database::Migration[2.1]
+ MIGRATION = "BackfillUuidConversionColumnInVulnerabilityOccurrences"
+ DELAY_INTERVAL = 2.minutes
+ BATCH_SIZE = 10_000
+ SUB_BATCH_SIZE = 1000
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ def up
+ queue_batched_background_migration(
+ MIGRATION,
+ :vulnerability_occurrences,
+ :id,
+ job_interval: DELAY_INTERVAL,
+ batch_size: BATCH_SIZE,
+ sub_batch_size: SUB_BATCH_SIZE
+ )
+ end
+
+ def down
+ delete_batched_background_migration(MIGRATION, :vulnerability_occurrences, :id, [])
+ end
+end
diff --git a/db/post_migrate/20230703024031_cleanup_project_pipeline_status_key.rb b/db/post_migrate/20230703024031_cleanup_project_pipeline_status_key.rb
new file mode 100644
index 00000000000..cb7fc04166f
--- /dev/null
+++ b/db/post_migrate/20230703024031_cleanup_project_pipeline_status_key.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class CleanupProjectPipelineStatusKey < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ MIGRATION_WORKER_CLASS = 'BackfillProjectPipelineStatusTtl'
+
+ def up
+ queue_redis_migration_job(MIGRATION_WORKER_CLASS)
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20230703122803_create_vulnerability_uuid_type_migration_index.rb b/db/post_migrate/20230703122803_create_vulnerability_uuid_type_migration_index.rb
new file mode 100644
index 00000000000..f5ac2c2d0b9
--- /dev/null
+++ b/db/post_migrate/20230703122803_create_vulnerability_uuid_type_migration_index.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class CreateVulnerabilityUuidTypeMigrationIndex < Gitlab::Database::Migration[2.1]
+ def up
+ # no-op due to https://gitlab.com/gitlab-com/gl-infra/production/-/issues/15983
+ end
+
+ def down
+ # no-op due to https://gitlab.com/gitlab-com/gl-infra/production/-/issues/15983
+ end
+end
diff --git a/db/post_migrate/20230704042302_prepare_removal_index_deployments_on_project_id_sha.rb b/db/post_migrate/20230704042302_prepare_removal_index_deployments_on_project_id_sha.rb
new file mode 100644
index 00000000000..77ddd909215
--- /dev/null
+++ b/db/post_migrate/20230704042302_prepare_removal_index_deployments_on_project_id_sha.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 PrepareRemovalIndexDeploymentsOnProjectIdSha < Gitlab::Database::Migration[2.1]
+ INDEX_NAME = 'index_deployments_on_project_id_sha'
+
+ # TODO: Index to be destroyed synchronously in https://gitlab.com/gitlab-org/gitlab/-/issues/402512
+ def up
+ prepare_async_index_removal :deployments, %i[project_id sha], name: INDEX_NAME
+ end
+
+ def down
+ unprepare_async_index :deployments, %i[project_id sha], name: INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20230704044541_prepare_removal_index_deployments_on_project_id_and_status.rb b/db/post_migrate/20230704044541_prepare_removal_index_deployments_on_project_id_and_status.rb
new file mode 100644
index 00000000000..0c9a292eb8c
--- /dev/null
+++ b/db/post_migrate/20230704044541_prepare_removal_index_deployments_on_project_id_and_status.rb
@@ -0,0 +1,16 @@
+# 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 PrepareRemovalIndexDeploymentsOnProjectIdAndStatus < Gitlab::Database::Migration[2.1]
+ INDEX_NAME = 'index_deployments_on_project_id_and_status'
+
+ def up
+ prepare_async_index_removal :deployments, %i[project_id status], name: INDEX_NAME
+ end
+
+ def down
+ unprepare_async_index :deployments, %i[project_id status], name: INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20230704050739_prepare_removal_index_deployments_on_environment_id_and_iid_and_project_id.rb b/db/post_migrate/20230704050739_prepare_removal_index_deployments_on_environment_id_and_iid_and_project_id.rb
new file mode 100644
index 00000000000..6171b58ac53
--- /dev/null
+++ b/db/post_migrate/20230704050739_prepare_removal_index_deployments_on_environment_id_and_iid_and_project_id.rb
@@ -0,0 +1,16 @@
+# 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 PrepareRemovalIndexDeploymentsOnEnvironmentIdAndIidAndProjectId < Gitlab::Database::Migration[2.1]
+ INDEX_NAME = 'index_deployments_on_environment_id_and_iid_and_project_id'
+
+ def up
+ prepare_async_index_removal :deployments, %i[environment_id iid project_id], name: INDEX_NAME
+ end
+
+ def down
+ unprepare_async_index :deployments, %i[environment_id iid project_id], name: INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20230704062132_replace_p_ci_builds_metadata_foreign_key_v5.rb b/db/post_migrate/20230704062132_replace_p_ci_builds_metadata_foreign_key_v5.rb
new file mode 100644
index 00000000000..c535c54b022
--- /dev/null
+++ b/db/post_migrate/20230704062132_replace_p_ci_builds_metadata_foreign_key_v5.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+class ReplacePCiBuildsMetadataForeignKeyV5 < Gitlab::Database::Migration[2.1]
+ include Gitlab::Database::PartitioningMigrationHelpers
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_partitioned_foreign_key :p_ci_builds_metadata, :p_ci_builds,
+ name: :temp_fk_e20479742e_p,
+ column: [:partition_id, :build_id],
+ target_column: [:partition_id, :id],
+ on_update: :cascade,
+ on_delete: :cascade,
+ validate: true,
+ reverse_lock_order: true
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key_if_exists :p_ci_builds_metadata, :p_ci_builds,
+ name: :temp_fk_e20479742e_p,
+ reverse_lock_order: true
+ end
+ end
+end
diff --git a/db/post_migrate/20230704062136_replace_p_ci_runner_machine_builds_foreign_key_v4.rb b/db/post_migrate/20230704062136_replace_p_ci_runner_machine_builds_foreign_key_v4.rb
new file mode 100644
index 00000000000..6cb8440bee8
--- /dev/null
+++ b/db/post_migrate/20230704062136_replace_p_ci_runner_machine_builds_foreign_key_v4.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+class ReplacePCiRunnerMachineBuildsForeignKeyV4 < Gitlab::Database::Migration[2.1]
+ include Gitlab::Database::PartitioningMigrationHelpers
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_partitioned_foreign_key :p_ci_runner_machine_builds, :p_ci_builds,
+ name: :temp_fk_bb490f12fe_p,
+ column: [:partition_id, :build_id],
+ target_column: [:partition_id, :id],
+ on_update: :cascade,
+ on_delete: :cascade,
+ validate: true,
+ reverse_lock_order: true
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key_if_exists :p_ci_runner_machine_builds, :p_ci_builds,
+ name: :temp_fk_bb490f12fe_p,
+ reverse_lock_order: true
+ end
+ end
+end
diff --git a/db/post_migrate/20230704074120_replace_old_fk_p_ci_builds_metadata_to_builds.rb b/db/post_migrate/20230704074120_replace_old_fk_p_ci_builds_metadata_to_builds.rb
new file mode 100644
index 00000000000..49f2066d7bf
--- /dev/null
+++ b/db/post_migrate/20230704074120_replace_old_fk_p_ci_builds_metadata_to_builds.rb
@@ -0,0 +1,54 @@
+# frozen_string_literal: true
+
+class ReplaceOldFkPCiBuildsMetadataToBuilds < Gitlab::Database::Migration[2.1]
+ include Gitlab::Database::PartitioningMigrationHelpers
+ include Gitlab::Database::MigrationHelpers::WraparoundAutovacuum
+
+ disable_ddl_transaction!
+
+ def up
+ return unless should_run?
+ return if new_foreign_key_exists?
+
+ with_lock_retries do
+ remove_foreign_key_if_exists :p_ci_builds_metadata, :ci_builds,
+ name: :fk_e20479742e_p, reverse_lock_order: true
+
+ rename_constraint :p_ci_builds_metadata, :temp_fk_e20479742e_p, :fk_e20479742e_p
+
+ Gitlab::Database::PostgresPartitionedTable.each_partition(:p_ci_builds_metadata) do |partition|
+ rename_constraint partition.identifier, :temp_fk_e20479742e_p, :fk_e20479742e_p
+ end
+ end
+ end
+
+ def down
+ return unless should_run?
+ return unless new_foreign_key_exists?
+
+ add_concurrent_partitioned_foreign_key :p_ci_builds_metadata, :ci_builds,
+ name: :temp_fk_e20479742e_p,
+ column: [:partition_id, :build_id],
+ target_column: [:partition_id, :id],
+ on_update: :cascade,
+ on_delete: :cascade,
+ validate: true,
+ reverse_lock_order: true
+
+ switch_constraint_names :p_ci_builds_metadata, :fk_e20479742e_p, :temp_fk_e20479742e_p
+
+ Gitlab::Database::PostgresPartitionedTable.each_partition(:p_ci_builds_metadata) do |partition|
+ switch_constraint_names partition.identifier, :fk_e20479742e_p, :temp_fk_e20479742e_p
+ end
+ end
+
+ private
+
+ def should_run?
+ can_execute_on?(:ci_builds_metadata, :ci_builds)
+ end
+
+ def new_foreign_key_exists?
+ foreign_key_exists?(:p_ci_builds_metadata, :p_ci_builds, name: :fk_e20479742e_p)
+ end
+end
diff --git a/db/post_migrate/20230704074124_replace_old_fk_p_ci_runner_machine_builds_to_builds.rb b/db/post_migrate/20230704074124_replace_old_fk_p_ci_runner_machine_builds_to_builds.rb
new file mode 100644
index 00000000000..b1d58058cef
--- /dev/null
+++ b/db/post_migrate/20230704074124_replace_old_fk_p_ci_runner_machine_builds_to_builds.rb
@@ -0,0 +1,54 @@
+# frozen_string_literal: true
+
+class ReplaceOldFkPCiRunnerMachineBuildsToBuilds < Gitlab::Database::Migration[2.1]
+ include Gitlab::Database::PartitioningMigrationHelpers
+ include Gitlab::Database::MigrationHelpers::WraparoundAutovacuum
+
+ disable_ddl_transaction!
+
+ def up
+ return unless should_run?
+ return if new_foreign_key_exists?
+
+ with_lock_retries do
+ remove_foreign_key_if_exists :p_ci_runner_machine_builds, :ci_builds,
+ name: :fk_bb490f12fe_p, reverse_lock_order: true
+
+ rename_constraint :p_ci_runner_machine_builds, :temp_fk_bb490f12fe_p, :fk_bb490f12fe_p
+
+ Gitlab::Database::PostgresPartitionedTable.each_partition(:p_ci_runner_machine_builds) do |partition|
+ rename_constraint partition.identifier, :temp_fk_bb490f12fe_p, :fk_bb490f12fe_p
+ end
+ end
+ end
+
+ def down
+ return unless should_run?
+ return unless new_foreign_key_exists?
+
+ add_concurrent_partitioned_foreign_key :p_ci_runner_machine_builds, :ci_builds,
+ name: :temp_fk_bb490f12fe_p,
+ column: [:partition_id, :build_id],
+ target_column: [:partition_id, :id],
+ on_update: :cascade,
+ on_delete: :cascade,
+ validate: true,
+ reverse_lock_order: true
+
+ switch_constraint_names :p_ci_runner_machine_builds, :fk_bb490f12fe_p, :temp_fk_bb490f12fe_p
+
+ Gitlab::Database::PostgresPartitionedTable.each_partition(:p_ci_runner_machine_builds) do |partition|
+ switch_constraint_names partition.identifier, :fk_bb490f12fe_p, :temp_fk_bb490f12fe_p
+ end
+ end
+
+ private
+
+ def should_run?
+ can_execute_on?(:ci_builds)
+ end
+
+ def new_foreign_key_exists?
+ foreign_key_exists?(:p_ci_runner_machine_builds, :p_ci_builds, name: :fk_bb490f12fe_p)
+ end
+end
diff --git a/db/post_migrate/20230705115215_remove_user_details_provisioned_by_group_at_column.rb b/db/post_migrate/20230705115215_remove_user_details_provisioned_by_group_at_column.rb
new file mode 100644
index 00000000000..33844f6714e
--- /dev/null
+++ b/db/post_migrate/20230705115215_remove_user_details_provisioned_by_group_at_column.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class RemoveUserDetailsProvisionedByGroupAtColumn < Gitlab::Database::Migration[2.1]
+ enable_lock_retries!
+
+ def change
+ remove_column :user_details, :provisioned_by_group_at, :datetime_with_timezone
+ end
+end
diff --git a/db/post_migrate/20230705141703_rollback_vulnerability_advisories_foreign_key_on_vulnerable_component_versions.rb b/db/post_migrate/20230705141703_rollback_vulnerability_advisories_foreign_key_on_vulnerable_component_versions.rb
new file mode 100644
index 00000000000..92feca76511
--- /dev/null
+++ b/db/post_migrate/20230705141703_rollback_vulnerability_advisories_foreign_key_on_vulnerable_component_versions.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class RollbackVulnerabilityAdvisoriesForeignKeyOnVulnerableComponentVersions < Gitlab::Database::Migration[2.1]
+ SOURCE_TABLE = :sbom_vulnerable_component_versions
+ TARGET_TABLE = :vulnerability_advisories
+ COLUMN = :vulnerability_advisory_id
+
+ disable_ddl_transaction!
+
+ def up
+ # Foreign key is removed when the table is dropped in the next migration.
+ end
+
+ def down
+ add_concurrent_foreign_key SOURCE_TABLE, TARGET_TABLE, column: COLUMN, on_delete: :cascade
+ end
+end
diff --git a/db/post_migrate/20230705141733_rollback_component_version_foreign_key_on_vulnerable_component_versions.rb b/db/post_migrate/20230705141733_rollback_component_version_foreign_key_on_vulnerable_component_versions.rb
new file mode 100644
index 00000000000..c54d4ebd1e3
--- /dev/null
+++ b/db/post_migrate/20230705141733_rollback_component_version_foreign_key_on_vulnerable_component_versions.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class RollbackComponentVersionForeignKeyOnVulnerableComponentVersions < Gitlab::Database::Migration[2.1]
+ SOURCE_TABLE = :sbom_vulnerable_component_versions
+ TARGET_TABLE = :sbom_component_versions
+ COLUMN = :sbom_component_version_id
+
+ disable_ddl_transaction!
+
+ def up
+ # Foreign key is removed when the table is dropped in the next migration.
+ end
+
+ def down
+ add_concurrent_foreign_key SOURCE_TABLE, TARGET_TABLE, column: COLUMN, on_delete: :cascade
+ end
+end
diff --git a/db/post_migrate/20230705142241_drop_vulnerable_component_versions.rb b/db/post_migrate/20230705142241_drop_vulnerable_component_versions.rb
new file mode 100644
index 00000000000..10432f6b515
--- /dev/null
+++ b/db/post_migrate/20230705142241_drop_vulnerable_component_versions.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class DropVulnerableComponentVersions < Gitlab::Database::Migration[2.1]
+ ADVISORY_INDEX_NAME = "index_vulnerable_component_versions_on_vulnerability_advisory"
+ SBOM_COMPONENT_INDEX_NAME = "index_vulnerable_component_versions_on_sbom_component_version"
+
+ def up
+ drop_table :sbom_vulnerable_component_versions
+ end
+
+ def down
+ create_table :sbom_vulnerable_component_versions do |t|
+ t.references :vulnerability_advisory,
+ index: { name: ADVISORY_INDEX_NAME }
+
+ t.references :sbom_component_version,
+ index: { name: SBOM_COMPONENT_INDEX_NAME }
+
+ t.timestamps_with_timezone null: false
+ end
+ end
+end
diff --git a/db/post_migrate/20230705142334_drop_vulnerabilities_advisories.rb b/db/post_migrate/20230705142334_drop_vulnerabilities_advisories.rb
new file mode 100644
index 00000000000..e6bee52eb0c
--- /dev/null
+++ b/db/post_migrate/20230705142334_drop_vulnerabilities_advisories.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+class DropVulnerabilitiesAdvisories < Gitlab::Database::Migration[2.1]
+ def up
+ drop_table :vulnerability_advisories
+ end
+
+ def down
+ create_table :vulnerability_advisories, id: false do |t|
+ t.uuid :uuid, null: false
+ t.timestamps_with_timezone null: false
+ t.primary_key :id
+ t.date :created_date, null: false
+ t.date :published_date, null: false
+ t.text :description, limit: 2048
+ t.text :title, limit: 2048
+ t.text :component_name, limit: 2048
+ t.text :solution, limit: 2048
+ t.text :not_impacted, limit: 2048
+ t.text :cvss_v2, limit: 128
+ t.text :cvss_v3, limit: 128
+ t.text :affected_range, limit: 32
+ t.text :identifiers, array: true, default: []
+ t.text :fixed_versions, array: true, default: []
+ t.text :urls, array: true, default: []
+ t.text :links, array: true, default: []
+ end
+ end
+end
diff --git a/db/post_migrate/20230705145827_drop_wrong_index_on_vulnerability_occurrences.rb b/db/post_migrate/20230705145827_drop_wrong_index_on_vulnerability_occurrences.rb
new file mode 100644
index 00000000000..6b4089f72fe
--- /dev/null
+++ b/db/post_migrate/20230705145827_drop_wrong_index_on_vulnerability_occurrences.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class DropWrongIndexOnVulnerabilityOccurrences < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'tmp_idx_vulns_on_converted_uuid'
+
+ def up
+ # We do not want to drop this from Gitlab.com
+ # because it was created correctly there
+ return if Gitlab.com? && !Gitlab.dev_or_test_env?
+
+ remove_concurrent_index_by_name(
+ :vulnerability_occurrences,
+ INDEX_NAME
+ )
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20230705150100_recreate_type_migration_index_on_vulnerability_occurrences.rb b/db/post_migrate/20230705150100_recreate_type_migration_index_on_vulnerability_occurrences.rb
new file mode 100644
index 00000000000..9e426c61874
--- /dev/null
+++ b/db/post_migrate/20230705150100_recreate_type_migration_index_on_vulnerability_occurrences.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+class RecreateTypeMigrationIndexOnVulnerabilityOccurrences < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'tmp_idx_vulns_on_converted_uuid'
+ WHERE_CLAUSE = "uuid_convert_string_to_uuid = '00000000-0000-0000-0000-000000000000'::uuid"
+
+ def up
+ add_concurrent_index(
+ :vulnerability_occurrences,
+ %i[id uuid_convert_string_to_uuid],
+ name: INDEX_NAME,
+ where: WHERE_CLAUSE
+ )
+ end
+
+ def down
+ remove_concurrent_index_by_name(
+ :vulnerability_occurrences,
+ INDEX_NAME
+ )
+ end
+end
diff --git a/db/post_migrate/20230706011541_add_user_id_foreign_key_to_ml_experiments.rb b/db/post_migrate/20230706011541_add_user_id_foreign_key_to_ml_experiments.rb
new file mode 100644
index 00000000000..77059d89d30
--- /dev/null
+++ b/db/post_migrate/20230706011541_add_user_id_foreign_key_to_ml_experiments.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+class AddUserIdForeignKeyToMlExperiments < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ NEW_FK_NAME = 'fk_ml_experiments_on_user_id'
+ OLD_FK_NAME = 'fk_rails_1fbc5e001f'
+
+ def up
+ add_concurrent_foreign_key(:ml_experiments, :users, column: :user_id, on_delete: :nullify,
+ name: NEW_FK_NAME, validate: true)
+
+ with_lock_retries do
+ remove_foreign_key_if_exists(:ml_experiments, name: OLD_FK_NAME)
+ end
+ end
+
+ def down
+ unless foreign_key_exists?(:ml_experiments, :users, name: OLD_FK_NAME)
+ with_lock_retries do
+ execute(<<~SQL.squish)
+ ALTER TABLE ml_experiments ADD CONSTRAINT #{OLD_FK_NAME} FOREIGN KEY (user_id) REFERENCES users (id)
+ SQL
+ end
+ end
+
+ with_lock_retries do
+ remove_foreign_key_if_exists(:ml_experiments, name: NEW_FK_NAME)
+ end
+ end
+end
diff --git a/db/post_migrate/20230706073937_remove_index_events_on_project_id_and_id_desc_on_merged_action.rb b/db/post_migrate/20230706073937_remove_index_events_on_project_id_and_id_desc_on_merged_action.rb
new file mode 100644
index 00000000000..4d7cdc000d5
--- /dev/null
+++ b/db/post_migrate/20230706073937_remove_index_events_on_project_id_and_id_desc_on_merged_action.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class RemoveIndexEventsOnProjectIdAndIdDescOnMergedAction < Gitlab::Database::Migration[2.1]
+ INDEX_NAME = 'index_events_on_project_id_and_id_desc_on_merged_action'
+
+ disable_ddl_transaction!
+
+ def up
+ remove_concurrent_index(:events, [:project_id, :id], order: { id: :desc },
+ where: "action = 7", name: INDEX_NAME)
+ end
+
+ def down
+ add_concurrent_index(:events, [:project_id, :id], order: { id: :desc },
+ where: "action = 7", name: INDEX_NAME)
+ end
+end
diff --git a/db/post_migrate/20230706080234_add_trigger_on_organizations.rb b/db/post_migrate/20230706080234_add_trigger_on_organizations.rb
new file mode 100644
index 00000000000..e21a5e0eb23
--- /dev/null
+++ b/db/post_migrate/20230706080234_add_trigger_on_organizations.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+class AddTriggerOnOrganizations < Gitlab::Database::Migration[2.1]
+ include Gitlab::Database::SchemaHelpers
+
+ TABLE_NAME = 'organizations'
+ FUNCTION_NAME = 'prevent_delete_of_default_organization'
+ TRIGGER_NAME = 'prevent_delete_of_default_organization_before_destroy'
+
+ def up
+ default_org_id = Organizations::Organization::DEFAULT_ORGANIZATION_ID
+
+ create_trigger_function(FUNCTION_NAME) do
+ <<~SQL
+ IF OLD.id = #{default_org_id} THEN
+ RAISE EXCEPTION 'Deletion of the default Organization is not allowed.';
+ END IF;
+ RETURN OLD;
+ SQL
+ end
+
+ create_trigger(TABLE_NAME, TRIGGER_NAME, FUNCTION_NAME, fires: 'BEFORE DELETE')
+ end
+
+ def down
+ drop_trigger(TABLE_NAME, TRIGGER_NAME)
+ drop_function(FUNCTION_NAME)
+ end
+end
diff --git a/db/post_migrate/20230707114012_change_project_view_default.rb b/db/post_migrate/20230707114012_change_project_view_default.rb
new file mode 100644
index 00000000000..6437a650261
--- /dev/null
+++ b/db/post_migrate/20230707114012_change_project_view_default.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class ChangeProjectViewDefault < Gitlab::Database::Migration[2.1]
+ enable_lock_retries!
+
+ def change
+ change_column_default(:users, :project_view, from: 0, to: 2)
+ end
+end
diff --git a/db/post_migrate/20230707211358_deduplicate_inactive_alert_integrations.rb b/db/post_migrate/20230707211358_deduplicate_inactive_alert_integrations.rb
new file mode 100644
index 00000000000..041ce659da6
--- /dev/null
+++ b/db/post_migrate/20230707211358_deduplicate_inactive_alert_integrations.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+class DeduplicateInactiveAlertIntegrations < Gitlab::Database::Migration[2.1]
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ class HttpIntegration < MigrationRecord
+ self.table_name = 'alert_management_http_integrations'
+ end
+
+ # Existing unique index ensures that all active integrations are already unique.
+ # Any non-unique records must be inactive by definition, but dups are unlikely.
+ # At time of writing, gitlab.com has 0 records in this state.
+ # Of the ~1600 integrations, only ~100 are even inactive.
+ def up
+ duplicated_identifiers.each do |(project_id, endpoint_identifier)|
+ find_inactive_integrations(project_id, endpoint_identifier).delete_all
+ end
+ end
+
+ def down
+ # no-op -> unable to identify duplicates retroactively
+ end
+
+ private
+
+ def duplicated_identifiers
+ HttpIntegration
+ .group(:project_id, :endpoint_identifier)
+ .having('count(id) > 1')
+ .pluck(:project_id, :endpoint_identifier)
+ end
+
+ def find_inactive_integrations(project_id, endpoint_identifier)
+ HttpIntegration.where(
+ project_id: project_id,
+ endpoint_identifier: endpoint_identifier,
+ active: false
+ )
+ end
+end
diff --git a/db/post_migrate/20230707211359_change_alert_integrations_unique_index.rb b/db/post_migrate/20230707211359_change_alert_integrations_unique_index.rb
new file mode 100644
index 00000000000..eac5d057b40
--- /dev/null
+++ b/db/post_migrate/20230707211359_change_alert_integrations_unique_index.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+# Swaps the unique index for AlertManagement::HttpIntegration to include
+# inactive integrations, making performance optimizations easier.
+#
+# At time of writing, gitlab.com has 0 records which would be invalidated
+# by the new index. Of the ~1600 integrations, only ~100 are inactive, so the
+# size of the index will not significantly change.
+class ChangeAlertIntegrationsUniqueIndex < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ UNIQUE_INDEX_NAME = 'index_http_integrations_on_project_and_endpoint'
+ OLD_INDEX_NAME = 'index_http_integrations_on_active_and_project_and_endpoint'
+
+ def up
+ add_concurrent_index :alert_management_http_integrations,
+ [:project_id, :endpoint_identifier],
+ name: UNIQUE_INDEX_NAME,
+ unique: true
+
+ remove_concurrent_index_by_name :alert_management_http_integrations, OLD_INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :alert_management_http_integrations,
+ [:active, :project_id, :endpoint_identifier],
+ unique: true,
+ name: OLD_INDEX_NAME,
+ where: 'active'
+
+ remove_concurrent_index_by_name :alert_management_http_integrations, UNIQUE_INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20230707220646_add_index_to_vulnerability_findings_on_uuid_again.rb b/db/post_migrate/20230707220646_add_index_to_vulnerability_findings_on_uuid_again.rb
new file mode 100644
index 00000000000..06d0117d50e
--- /dev/null
+++ b/db/post_migrate/20230707220646_add_index_to_vulnerability_findings_on_uuid_again.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class AddIndexToVulnerabilityFindingsOnUuidAgain < Gitlab::Database::Migration[2.1]
+ INDEX_NAME = 'index_vuln_findings_on_uuid_including_vuln_id'
+
+ def up
+ Gitlab::Database::AsyncIndexes::PostgresAsyncIndex.where(name: INDEX_NAME).find_each do |record|
+ record.definition = record.definition.strip
+ record.save!
+ end
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20230711093010_drop_default_partition_id_value_for_ci_tables.rb b/db/post_migrate/20230711093010_drop_default_partition_id_value_for_ci_tables.rb
new file mode 100644
index 00000000000..733cab057f6
--- /dev/null
+++ b/db/post_migrate/20230711093010_drop_default_partition_id_value_for_ci_tables.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+class DropDefaultPartitionIdValueForCiTables < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ TABLES = {
+ ci_build_needs: [:partition_id],
+ ci_build_pending_states: [:partition_id],
+ ci_build_report_results: [:partition_id],
+ ci_build_trace_chunks: [:partition_id],
+ ci_builds_runner_session: [:partition_id],
+ ci_job_variables: [:partition_id],
+ ci_pending_builds: [:partition_id],
+ ci_pipelines: [:partition_id],
+ ci_running_builds: [:partition_id],
+ ci_sources_pipelines: [:partition_id, :source_partition_id],
+ ci_unit_test_failures: [:partition_id]
+ }
+
+ def up
+ TABLES.each do |table_name, columns|
+ with_lock_retries do
+ columns.each do |column_name| # rubocop:disable Migration/WithLockRetriesDisallowedMethod
+ change_column_default(table_name, column_name, from: 100, to: nil)
+ end
+ end
+ end
+ end
+
+ def down
+ TABLES.each do |table_name, columns|
+ with_lock_retries do
+ columns.each do |column_name| # rubocop:disable Migration/WithLockRetriesDisallowedMethod
+ change_column_default(table_name, column_name, from: nil, to: 100)
+ end
+ end
+ end
+ end
+end
diff --git a/db/post_migrate/20230712020407_remove_temporary_index_from_system_note_metadata.rb b/db/post_migrate/20230712020407_remove_temporary_index_from_system_note_metadata.rb
new file mode 100644
index 00000000000..9000ef208d6
--- /dev/null
+++ b/db/post_migrate/20230712020407_remove_temporary_index_from_system_note_metadata.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class RemoveTemporaryIndexFromSystemNoteMetadata < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'tmp_index_for_backfilling_resource_link_events'
+ CONDITION = "action='relate_to_parent' OR action='unrelate_from_parent'"
+
+ def up
+ remove_concurrent_index_by_name :system_note_metadata, INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :system_note_metadata, :id,
+ where: CONDITION,
+ name: INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20230712064637_replace_old_fk_p_ci_builds_metadata_to_builds_v2.rb b/db/post_migrate/20230712064637_replace_old_fk_p_ci_builds_metadata_to_builds_v2.rb
new file mode 100644
index 00000000000..6165029d855
--- /dev/null
+++ b/db/post_migrate/20230712064637_replace_old_fk_p_ci_builds_metadata_to_builds_v2.rb
@@ -0,0 +1,54 @@
+# frozen_string_literal: true
+
+class ReplaceOldFkPCiBuildsMetadataToBuildsV2 < Gitlab::Database::Migration[2.1]
+ include Gitlab::Database::PartitioningMigrationHelpers
+ include Gitlab::Database::MigrationHelpers::WraparoundAutovacuum
+
+ disable_ddl_transaction!
+
+ def up
+ return unless should_run?
+ return if new_foreign_key_exists?
+
+ with_lock_retries do
+ remove_foreign_key_if_exists :p_ci_builds_metadata, :ci_builds,
+ name: :fk_e20479742e_p, reverse_lock_order: true
+
+ rename_constraint :p_ci_builds_metadata, :temp_fk_e20479742e_p, :fk_e20479742e_p
+
+ Gitlab::Database::PostgresPartitionedTable.each_partition(:p_ci_builds_metadata) do |partition|
+ rename_constraint partition.identifier, :temp_fk_e20479742e_p, :fk_e20479742e_p
+ end
+ end
+ end
+
+ def down
+ return unless should_run?
+ return unless new_foreign_key_exists?
+
+ add_concurrent_partitioned_foreign_key :p_ci_builds_metadata, :ci_builds,
+ name: :temp_fk_e20479742e_p,
+ column: [:partition_id, :build_id],
+ target_column: [:partition_id, :id],
+ on_update: :cascade,
+ on_delete: :cascade,
+ validate: true,
+ reverse_lock_order: true
+
+ switch_constraint_names :p_ci_builds_metadata, :fk_e20479742e_p, :temp_fk_e20479742e_p
+
+ Gitlab::Database::PostgresPartitionedTable.each_partition(:p_ci_builds_metadata) do |partition|
+ switch_constraint_names partition.identifier, :fk_e20479742e_p, :temp_fk_e20479742e_p
+ end
+ end
+
+ private
+
+ def should_run?
+ can_execute_on?(:ci_builds_metadata, :ci_builds)
+ end
+
+ def new_foreign_key_exists?
+ foreign_key_exists?(:p_ci_builds_metadata, :p_ci_builds, name: :fk_e20479742e_p)
+ end
+end
diff --git a/db/post_migrate/20230712064655_replace_old_fk_p_ci_runner_machine_builds_to_builds_v2.rb b/db/post_migrate/20230712064655_replace_old_fk_p_ci_runner_machine_builds_to_builds_v2.rb
new file mode 100644
index 00000000000..8f1c1872e04
--- /dev/null
+++ b/db/post_migrate/20230712064655_replace_old_fk_p_ci_runner_machine_builds_to_builds_v2.rb
@@ -0,0 +1,54 @@
+# frozen_string_literal: true
+
+class ReplaceOldFkPCiRunnerMachineBuildsToBuildsV2 < Gitlab::Database::Migration[2.1]
+ include Gitlab::Database::PartitioningMigrationHelpers
+ include Gitlab::Database::MigrationHelpers::WraparoundAutovacuum
+
+ disable_ddl_transaction!
+
+ def up
+ return unless should_run?
+ return if new_foreign_key_exists?
+
+ with_lock_retries do
+ remove_foreign_key_if_exists :p_ci_runner_machine_builds, :ci_builds,
+ name: :fk_bb490f12fe_p, reverse_lock_order: true
+
+ rename_constraint :p_ci_runner_machine_builds, :temp_fk_bb490f12fe_p, :fk_bb490f12fe_p
+
+ Gitlab::Database::PostgresPartitionedTable.each_partition(:p_ci_runner_machine_builds) do |partition|
+ rename_constraint partition.identifier, :temp_fk_bb490f12fe_p, :fk_bb490f12fe_p
+ end
+ end
+ end
+
+ def down
+ return unless should_run?
+ return unless new_foreign_key_exists?
+
+ add_concurrent_partitioned_foreign_key :p_ci_runner_machine_builds, :ci_builds,
+ name: :temp_fk_bb490f12fe_p,
+ column: [:partition_id, :build_id],
+ target_column: [:partition_id, :id],
+ on_update: :cascade,
+ on_delete: :cascade,
+ validate: true,
+ reverse_lock_order: true
+
+ switch_constraint_names :p_ci_runner_machine_builds, :fk_bb490f12fe_p, :temp_fk_bb490f12fe_p
+
+ Gitlab::Database::PostgresPartitionedTable.each_partition(:p_ci_runner_machine_builds) do |partition|
+ switch_constraint_names partition.identifier, :fk_bb490f12fe_p, :temp_fk_bb490f12fe_p
+ end
+ end
+
+ private
+
+ def should_run?
+ can_execute_on?(:ci_builds)
+ end
+
+ def new_foreign_key_exists?
+ foreign_key_exists?(:p_ci_runner_machine_builds, :p_ci_builds, name: :fk_bb490f12fe_p)
+ end
+end
diff --git a/db/post_migrate/20230712145323_drop_ci_job_artifacts_partition_id_default.rb b/db/post_migrate/20230712145323_drop_ci_job_artifacts_partition_id_default.rb
new file mode 100644
index 00000000000..af475ba62d0
--- /dev/null
+++ b/db/post_migrate/20230712145323_drop_ci_job_artifacts_partition_id_default.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+class DropCiJobArtifactsPartitionIdDefault < Gitlab::Database::Migration[2.1]
+ include Gitlab::Database::MigrationHelpers::WraparoundAutovacuum
+
+ enable_lock_retries!
+
+ TABLE_NAME = :ci_job_artifacts
+ COLUMN_NAME = :partition_id
+
+ def up
+ change_column_default(TABLE_NAME, COLUMN_NAME, from: 100, to: nil) if should_run?
+ end
+
+ def down
+ change_column_default(TABLE_NAME, COLUMN_NAME, from: nil, to: 100) if should_run?
+ end
+
+ private
+
+ def should_run?
+ can_execute_on?(TABLE_NAME)
+ end
+end
diff --git a/db/post_migrate/20230712145821_drop_ci_stages_partition_id_default.rb b/db/post_migrate/20230712145821_drop_ci_stages_partition_id_default.rb
new file mode 100644
index 00000000000..a7c23ac35d2
--- /dev/null
+++ b/db/post_migrate/20230712145821_drop_ci_stages_partition_id_default.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+class DropCiStagesPartitionIdDefault < Gitlab::Database::Migration[2.1]
+ include Gitlab::Database::MigrationHelpers::WraparoundAutovacuum
+
+ enable_lock_retries!
+
+ TABLE_NAME = :ci_stages
+ COLUMN_NAME = :partition_id
+
+ def up
+ change_column_default(TABLE_NAME, COLUMN_NAME, from: 100, to: nil) if should_run?
+ end
+
+ def down
+ change_column_default(TABLE_NAME, COLUMN_NAME, from: nil, to: 100) if should_run?
+ end
+
+ private
+
+ def should_run?
+ can_execute_on?(TABLE_NAME)
+ end
+end
diff --git a/db/post_migrate/20230712145926_drop_ci_build_trace_metadata_partition_id_default.rb b/db/post_migrate/20230712145926_drop_ci_build_trace_metadata_partition_id_default.rb
new file mode 100644
index 00000000000..dad647246a5
--- /dev/null
+++ b/db/post_migrate/20230712145926_drop_ci_build_trace_metadata_partition_id_default.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+class DropCiBuildTraceMetadataPartitionIdDefault < Gitlab::Database::Migration[2.1]
+ include Gitlab::Database::MigrationHelpers::WraparoundAutovacuum
+
+ enable_lock_retries!
+
+ TABLE_NAME = :ci_build_trace_metadata
+ COLUMN_NAME = :partition_id
+
+ def up
+ change_column_default(TABLE_NAME, COLUMN_NAME, from: 100, to: nil) if should_run?
+ end
+
+ def down
+ change_column_default(TABLE_NAME, COLUMN_NAME, from: nil, to: 100) if should_run?
+ end
+
+ private
+
+ def should_run?
+ can_execute_on?(TABLE_NAME)
+ end
+end
diff --git a/db/post_migrate/20230713020247_change_pm_advisories_urls_constraint.rb b/db/post_migrate/20230713020247_change_pm_advisories_urls_constraint.rb
new file mode 100644
index 00000000000..4611f657d0d
--- /dev/null
+++ b/db/post_migrate/20230713020247_change_pm_advisories_urls_constraint.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class ChangePmAdvisoriesUrlsConstraint < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ CONSTRAINT_NAME = "chk_rails_e73af9de76"
+
+ def up
+ remove_check_constraint :pm_advisories, CONSTRAINT_NAME
+ add_check_constraint :pm_advisories, "CARDINALITY(urls) <= 20", CONSTRAINT_NAME
+ end
+
+ def down
+ remove_check_constraint :pm_advisories, CONSTRAINT_NAME
+ add_check_constraint :pm_advisories, "CARDINALITY(urls) <= 10", CONSTRAINT_NAME
+ end
+end
diff --git a/db/post_migrate/20230713100100_drop_ci_pipeline_variable_partition_id_default.rb b/db/post_migrate/20230713100100_drop_ci_pipeline_variable_partition_id_default.rb
new file mode 100644
index 00000000000..5ef3a2caa82
--- /dev/null
+++ b/db/post_migrate/20230713100100_drop_ci_pipeline_variable_partition_id_default.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+class DropCiPipelineVariablePartitionIdDefault < Gitlab::Database::Migration[2.1]
+ include Gitlab::Database::MigrationHelpers::WraparoundAutovacuum
+
+ enable_lock_retries!
+
+ TABLE_NAME = :ci_pipeline_variables
+ COLUMN_NAME = :partition_id
+
+ def up
+ change_column_default(TABLE_NAME, COLUMN_NAME, from: 100, to: nil) if should_run?
+ end
+
+ def down
+ change_column_default(TABLE_NAME, COLUMN_NAME, from: nil, to: 100) if should_run?
+ end
+
+ private
+
+ def should_run?
+ can_execute_on?(TABLE_NAME)
+ end
+end
diff --git a/db/schema_migrations/20230314094213 b/db/schema_migrations/20230314094213
new file mode 100644
index 00000000000..e2741f5ea30
--- /dev/null
+++ b/db/schema_migrations/20230314094213
@@ -0,0 +1 @@
+ccf7548dc1916a60da14f9545039d7ac3666e44e96ccd59c0f6db4117b15515a \ No newline at end of file
diff --git a/db/schema_migrations/20230314094215 b/db/schema_migrations/20230314094215
new file mode 100644
index 00000000000..a030527fac4
--- /dev/null
+++ b/db/schema_migrations/20230314094215
@@ -0,0 +1 @@
+5549548b53710624294aed31af6ed8aeb26263e538d2e2d7eac254a5c105d08a \ No newline at end of file
diff --git a/db/schema_migrations/20230522162742 b/db/schema_migrations/20230522162742
new file mode 100644
index 00000000000..ba41bc2a54d
--- /dev/null
+++ b/db/schema_migrations/20230522162742
@@ -0,0 +1 @@
+ae56cc5feed51f3b48bf2f2d51bb32bf140e2ade7d7bdbfec16bb5ce2fead5c1 \ No newline at end of file
diff --git a/db/schema_migrations/20230528203340 b/db/schema_migrations/20230528203340
new file mode 100644
index 00000000000..27e5d44f480
--- /dev/null
+++ b/db/schema_migrations/20230528203340
@@ -0,0 +1 @@
+0503c864e706c1255a9dbb27d7d83fe2be7e9b8690bb26bbbe327654a090cc90 \ No newline at end of file
diff --git a/db/schema_migrations/20230530012406 b/db/schema_migrations/20230530012406
new file mode 100644
index 00000000000..ec6210939c5
--- /dev/null
+++ b/db/schema_migrations/20230530012406
@@ -0,0 +1 @@
+bef78410f5088ab1e230ff21118dae186f363ee215f1cdab7cbff4e223bf20ec \ No newline at end of file
diff --git a/db/schema_migrations/20230601211635 b/db/schema_migrations/20230601211635
new file mode 100644
index 00000000000..a92c327bce6
--- /dev/null
+++ b/db/schema_migrations/20230601211635
@@ -0,0 +1 @@
+c987632b4c7628e5fef9d5c6c0876ae2af7a34db2bdd87df8560c82adbdb604f \ No newline at end of file
diff --git a/db/schema_migrations/20230601213750 b/db/schema_migrations/20230601213750
new file mode 100644
index 00000000000..494b48356ca
--- /dev/null
+++ b/db/schema_migrations/20230601213750
@@ -0,0 +1 @@
+f3e1bffc9586ee332497c3b6a72f86a8678b171c8a3eb538df4c4a5147bec04b \ No newline at end of file
diff --git a/db/schema_migrations/20230605125735 b/db/schema_migrations/20230605125735
new file mode 100644
index 00000000000..7592cd8ffa1
--- /dev/null
+++ b/db/schema_migrations/20230605125735
@@ -0,0 +1 @@
+348128b62afecd48dc65f1cf2c4f5ad37e98e837aca183c1283189283e074890 \ No newline at end of file
diff --git a/db/schema_migrations/20230607124754 b/db/schema_migrations/20230607124754
new file mode 100644
index 00000000000..2c49744ec26
--- /dev/null
+++ b/db/schema_migrations/20230607124754
@@ -0,0 +1 @@
+3aca70a09ce278454f38740817bba4e88501b8e68d719b9ef3f922cb09b7c7d3 \ No newline at end of file
diff --git a/db/schema_migrations/20230608113106 b/db/schema_migrations/20230608113106
new file mode 100644
index 00000000000..82a65911642
--- /dev/null
+++ b/db/schema_migrations/20230608113106
@@ -0,0 +1 @@
+137039d31d0e8b4abce8260f067783334538787c3f22c638d5c65c8b7016aad7 \ No newline at end of file
diff --git a/db/schema_migrations/20230608145500 b/db/schema_migrations/20230608145500
new file mode 100644
index 00000000000..ddf0ac83819
--- /dev/null
+++ b/db/schema_migrations/20230608145500
@@ -0,0 +1 @@
+e8070bd79c6c523fe5565951877f2f44ff25c6f7e0ce8713ac9887cd1296f087 \ No newline at end of file
diff --git a/db/schema_migrations/20230609065641 b/db/schema_migrations/20230609065641
new file mode 100644
index 00000000000..31bfe4d1d94
--- /dev/null
+++ b/db/schema_migrations/20230609065641
@@ -0,0 +1 @@
+8dbbe0c959e263ba04e2b68dd4b868fb4f5e4809c0724fe1c14aebee6e924132 \ No newline at end of file
diff --git a/db/schema_migrations/20230609065942 b/db/schema_migrations/20230609065942
new file mode 100644
index 00000000000..5b6454c7cf1
--- /dev/null
+++ b/db/schema_migrations/20230609065942
@@ -0,0 +1 @@
+08b97855a2d1bfe7f1cb2118744b6968eb117eda2521e2287ec5b201114e9eec \ No newline at end of file
diff --git a/db/schema_migrations/20230612074428 b/db/schema_migrations/20230612074428
new file mode 100644
index 00000000000..a763ffafa46
--- /dev/null
+++ b/db/schema_migrations/20230612074428
@@ -0,0 +1 @@
+65df1d9bfc31a41210d9a18a63786d35bde456d0fd94520be186e8eb06214d7e \ No newline at end of file
diff --git a/db/schema_migrations/20230612091526 b/db/schema_migrations/20230612091526
new file mode 100644
index 00000000000..04fa44523f9
--- /dev/null
+++ b/db/schema_migrations/20230612091526
@@ -0,0 +1 @@
+f03f81f50c0777502aeb1040f5e2805b296d77979760156f5e2e1e184792d503 \ No newline at end of file
diff --git a/db/schema_migrations/20230612091747 b/db/schema_migrations/20230612091747
new file mode 100644
index 00000000000..fbc9998118a
--- /dev/null
+++ b/db/schema_migrations/20230612091747
@@ -0,0 +1 @@
+ca928191459eeeeed6c10b444053eedb5e7236e94403a36ee8aa86a448d352c6 \ No newline at end of file
diff --git a/db/schema_migrations/20230612091910 b/db/schema_migrations/20230612091910
new file mode 100644
index 00000000000..8446746db36
--- /dev/null
+++ b/db/schema_migrations/20230612091910
@@ -0,0 +1 @@
+6e534b91092c00e405dd621ea4d05b732b075007563f776b1fb88087f7edeaf9 \ No newline at end of file
diff --git a/db/schema_migrations/20230613122211 b/db/schema_migrations/20230613122211
new file mode 100644
index 00000000000..ccdecf69019
--- /dev/null
+++ b/db/schema_migrations/20230613122211
@@ -0,0 +1 @@
+da2cc429052e2db307e8eff2de61049ce93db4a7f6321a265889edeff1e7897d \ No newline at end of file
diff --git a/db/schema_migrations/20230613192703 b/db/schema_migrations/20230613192703
new file mode 100644
index 00000000000..0b4525d8e2c
--- /dev/null
+++ b/db/schema_migrations/20230613192703
@@ -0,0 +1 @@
+9a59cadd56d144591e828f8b64a7aa7887c156e86c75e1d57cc1e83fb8afbd01 \ No newline at end of file
diff --git a/db/schema_migrations/20230613192802 b/db/schema_migrations/20230613192802
new file mode 100644
index 00000000000..5184009df5c
--- /dev/null
+++ b/db/schema_migrations/20230613192802
@@ -0,0 +1 @@
+3cf9c170bd70e70f0eef49c13317dcfbf79630d166417a61c6a2029ae40490c9 \ No newline at end of file
diff --git a/db/schema_migrations/20230614180651 b/db/schema_migrations/20230614180651
new file mode 100644
index 00000000000..6aa4a30f5e4
--- /dev/null
+++ b/db/schema_migrations/20230614180651
@@ -0,0 +1 @@
+e29861e9c43ad7b225a077f1026fe2cbf569b8caebd5c9949200220cb2b68fd6 \ No newline at end of file
diff --git a/db/schema_migrations/20230614181310 b/db/schema_migrations/20230614181310
new file mode 100644
index 00000000000..6bdfc2ccb8f
--- /dev/null
+++ b/db/schema_migrations/20230614181310
@@ -0,0 +1 @@
+4433251c5085ac4e9c74a3dedc08a153cad82e8c6e7484e47538948a0d28185a \ No newline at end of file
diff --git a/db/schema_migrations/20230614182049 b/db/schema_migrations/20230614182049
new file mode 100644
index 00000000000..6454c1c88df
--- /dev/null
+++ b/db/schema_migrations/20230614182049
@@ -0,0 +1 @@
+0154e8ee8108b47dd1ff6913f3697e996e6c98a41b5b9a04c660086f5d1a31d7 \ No newline at end of file
diff --git a/db/schema_migrations/20230615030402 b/db/schema_migrations/20230615030402
new file mode 100644
index 00000000000..1139ca531f1
--- /dev/null
+++ b/db/schema_migrations/20230615030402
@@ -0,0 +1 @@
+47b6c521709eb4b514965fa6e59eb10ff93a31ce4a56debc81e8959f04e32b15 \ No newline at end of file
diff --git a/db/schema_migrations/20230615074515 b/db/schema_migrations/20230615074515
new file mode 100644
index 00000000000..22f8ca20d74
--- /dev/null
+++ b/db/schema_migrations/20230615074515
@@ -0,0 +1 @@
+bfbb49d6b6b263be1fc669807ceb5f2e6cedb0e68221cb17a9e4fe5c2bedb439 \ No newline at end of file
diff --git a/db/schema_migrations/20230615074544 b/db/schema_migrations/20230615074544
new file mode 100644
index 00000000000..f9079d090a8
--- /dev/null
+++ b/db/schema_migrations/20230615074544
@@ -0,0 +1 @@
+45c76efa0091f7b63ce476cd7d6909d3c11aec2d96e51087f44060d5192b76a5 \ No newline at end of file
diff --git a/db/schema_migrations/20230615104902 b/db/schema_migrations/20230615104902
new file mode 100644
index 00000000000..9d52b635ff0
--- /dev/null
+++ b/db/schema_migrations/20230615104902
@@ -0,0 +1 @@
+f96102edb32531bda4828af85709f7510f730617aea6c80859da697595c96fcc \ No newline at end of file
diff --git a/db/schema_migrations/20230615113748 b/db/schema_migrations/20230615113748
new file mode 100644
index 00000000000..63fd03faa08
--- /dev/null
+++ b/db/schema_migrations/20230615113748
@@ -0,0 +1 @@
+886e52579245dc9d3dafbfca97bb7398c776fa343946f38d58c7b10d081752e1 \ No newline at end of file
diff --git a/db/schema_migrations/20230615113840 b/db/schema_migrations/20230615113840
new file mode 100644
index 00000000000..073f6870397
--- /dev/null
+++ b/db/schema_migrations/20230615113840
@@ -0,0 +1 @@
+703e63f9a84e94ed87938f47952d661a626f156aa8325322abab8f9a9b9fcb8f \ No newline at end of file
diff --git a/db/schema_migrations/20230615113858 b/db/schema_migrations/20230615113858
new file mode 100644
index 00000000000..338d26a7f62
--- /dev/null
+++ b/db/schema_migrations/20230615113858
@@ -0,0 +1 @@
+c115e35b6b8f6e422bc1832671016f5956b524709aec36bb6d4d1707545d20d5 \ No newline at end of file
diff --git a/db/schema_migrations/20230615121103 b/db/schema_migrations/20230615121103
new file mode 100644
index 00000000000..9c77e1512c1
--- /dev/null
+++ b/db/schema_migrations/20230615121103
@@ -0,0 +1 @@
+37634ac8f82ed0fa043036b1aab2dffbd7a4f9a2fc51f18d53511f8a834eb312 \ No newline at end of file
diff --git a/db/schema_migrations/20230615121122 b/db/schema_migrations/20230615121122
new file mode 100644
index 00000000000..0704b5d0c8d
--- /dev/null
+++ b/db/schema_migrations/20230615121122
@@ -0,0 +1 @@
+7014d18db20d925d1bc41b4104b1ce57f2033f7c8debed8fd31e6afbba8efd78 \ No newline at end of file
diff --git a/db/schema_migrations/20230615144627 b/db/schema_migrations/20230615144627
new file mode 100644
index 00000000000..2baac116d9b
--- /dev/null
+++ b/db/schema_migrations/20230615144627
@@ -0,0 +1 @@
+1d9bf54e8214caefcc0a5f851c2a644df97f047b4cc9d3e7fe6e7ca34fef8f41 \ No newline at end of file
diff --git a/db/schema_migrations/20230616082958 b/db/schema_migrations/20230616082958
new file mode 100644
index 00000000000..6def484b012
--- /dev/null
+++ b/db/schema_migrations/20230616082958
@@ -0,0 +1 @@
+2155cb2efd8a43c774f48b4d87dddf9f6d5a33fb9c0ee804590e12b3713cc4dd \ No newline at end of file
diff --git a/db/schema_migrations/20230616164309 b/db/schema_migrations/20230616164309
new file mode 100644
index 00000000000..b9fbdc7d33e
--- /dev/null
+++ b/db/schema_migrations/20230616164309
@@ -0,0 +1 @@
+f3b14748f1702972e7f5069edd9ed25d9896dfb11f4fc4a4386ca9c94533e10a \ No newline at end of file
diff --git a/db/schema_migrations/20230616164705 b/db/schema_migrations/20230616164705
new file mode 100644
index 00000000000..1bcb723524b
--- /dev/null
+++ b/db/schema_migrations/20230616164705
@@ -0,0 +1 @@
+75310614bb98a598b8425aa87a0a4a6561fa1b166461d55329c21aff849d71fc \ No newline at end of file
diff --git a/db/schema_migrations/20230616164731 b/db/schema_migrations/20230616164731
new file mode 100644
index 00000000000..2588271d9ac
--- /dev/null
+++ b/db/schema_migrations/20230616164731
@@ -0,0 +1 @@
+e6308ee437b6e57da16e1b8aff1d6a571ef849c4c7cccafe940710c799fa6eea \ No newline at end of file
diff --git a/db/schema_migrations/20230616200440 b/db/schema_migrations/20230616200440
new file mode 100644
index 00000000000..b67a9da8a99
--- /dev/null
+++ b/db/schema_migrations/20230616200440
@@ -0,0 +1 @@
+de2c254df58e13ffba7fef9bbf4fff2e244aa46ce58f8245646ed7ce4ab51770 \ No newline at end of file
diff --git a/db/schema_migrations/20230616214220 b/db/schema_migrations/20230616214220
new file mode 100644
index 00000000000..7f006c6e985
--- /dev/null
+++ b/db/schema_migrations/20230616214220
@@ -0,0 +1 @@
+29cf1dfb1429cb177f5b6cb2fae2a0bc388c0c6cbda5c4405456afcee8374a54 \ No newline at end of file
diff --git a/db/schema_migrations/20230618020202 b/db/schema_migrations/20230618020202
new file mode 100644
index 00000000000..f07ea0b2994
--- /dev/null
+++ b/db/schema_migrations/20230618020202
@@ -0,0 +1 @@
+aedea1ec886b1831a94831185aa493e42c777c8c1614f6541580cdaa4f76946e \ No newline at end of file
diff --git a/db/schema_migrations/20230619005223 b/db/schema_migrations/20230619005223
new file mode 100644
index 00000000000..ce79f7ceed0
--- /dev/null
+++ b/db/schema_migrations/20230619005223
@@ -0,0 +1 @@
+e728befa42eb6749929e758ece0f29ec57cd7614a378b8c5e4dc24f134f39185 \ No newline at end of file
diff --git a/db/schema_migrations/20230619072744 b/db/schema_migrations/20230619072744
new file mode 100644
index 00000000000..ba71e5cd392
--- /dev/null
+++ b/db/schema_migrations/20230619072744
@@ -0,0 +1 @@
+6bf4fa6d2e43f1b589204f3b58323f32d9db2344882507e14bc487913cbe6f8e \ No newline at end of file
diff --git a/db/schema_migrations/20230619081412 b/db/schema_migrations/20230619081412
new file mode 100644
index 00000000000..e3a200aad1c
--- /dev/null
+++ b/db/schema_migrations/20230619081412
@@ -0,0 +1 @@
+31e437da1c65308037bace06492ac1995979abf061717aadb84dca22708dccff \ No newline at end of file
diff --git a/db/schema_migrations/20230619123701 b/db/schema_migrations/20230619123701
new file mode 100644
index 00000000000..f1bee23e3b9
--- /dev/null
+++ b/db/schema_migrations/20230619123701
@@ -0,0 +1 @@
+44dba614ff8883e5f8446e4c5f05964bb8ab7915d9caa06c908a9c24dd1dc1b1 \ No newline at end of file
diff --git a/db/schema_migrations/20230619134106 b/db/schema_migrations/20230619134106
new file mode 100644
index 00000000000..a23db7839fa
--- /dev/null
+++ b/db/schema_migrations/20230619134106
@@ -0,0 +1 @@
+248e7dabf83e225c5f5ee0de87e0842e8c3ec13f6098720830ce3b817a4d36a8 \ No newline at end of file
diff --git a/db/schema_migrations/20230620072854 b/db/schema_migrations/20230620072854
new file mode 100644
index 00000000000..dd1b2f51792
--- /dev/null
+++ b/db/schema_migrations/20230620072854
@@ -0,0 +1 @@
+2cfb38d13f843e13b770e1598bb221555e09c05b785c30989626857a0dc396e8 \ No newline at end of file
diff --git a/db/schema_migrations/20230620072856 b/db/schema_migrations/20230620072856
new file mode 100644
index 00000000000..614eb900d50
--- /dev/null
+++ b/db/schema_migrations/20230620072856
@@ -0,0 +1 @@
+f7917d437de6d3cc76c183c6682bf18b545ed5b10c2c1212dac46be6f5dfa505 \ No newline at end of file
diff --git a/db/schema_migrations/20230620072900 b/db/schema_migrations/20230620072900
new file mode 100644
index 00000000000..e6f7bfe614d
--- /dev/null
+++ b/db/schema_migrations/20230620072900
@@ -0,0 +1 @@
+cdd264bae9968d1a54cdbd2a848161070c91e4fd25b55de072b4822d99bf9b09 \ No newline at end of file
diff --git a/db/schema_migrations/20230620072905 b/db/schema_migrations/20230620072905
new file mode 100644
index 00000000000..14a8b5db052
--- /dev/null
+++ b/db/schema_migrations/20230620072905
@@ -0,0 +1 @@
+c846d009e014869a969ba637440bc7d8ea9482aac12a567e888dd69582c8467e \ No newline at end of file
diff --git a/db/schema_migrations/20230620072908 b/db/schema_migrations/20230620072908
new file mode 100644
index 00000000000..01a4fc67810
--- /dev/null
+++ b/db/schema_migrations/20230620072908
@@ -0,0 +1 @@
+39c8125b1d159ff84627cd897830dcbe7be87fe0675b6f6582380019de7d05e5 \ No newline at end of file
diff --git a/db/schema_migrations/20230620072911 b/db/schema_migrations/20230620072911
new file mode 100644
index 00000000000..4010199d8fa
--- /dev/null
+++ b/db/schema_migrations/20230620072911
@@ -0,0 +1 @@
+d16c032a8dfaecb6fc61f00b273b539cf0ba6a27b36e6b8119e66c9ee323f4a1 \ No newline at end of file
diff --git a/db/schema_migrations/20230620072915 b/db/schema_migrations/20230620072915
new file mode 100644
index 00000000000..9e8d8f80b0c
--- /dev/null
+++ b/db/schema_migrations/20230620072915
@@ -0,0 +1 @@
+c0a830c3fac01580d2e938fbbd618d6b28fba7f721bffb7861d4c2ac0206e862 \ No newline at end of file
diff --git a/db/schema_migrations/20230620072917 b/db/schema_migrations/20230620072917
new file mode 100644
index 00000000000..ef80924ff25
--- /dev/null
+++ b/db/schema_migrations/20230620072917
@@ -0,0 +1 @@
+9ae676e0670c484b7ba385901d654eb6d05a9cedc550ee124121f0974158e2b3 \ No newline at end of file
diff --git a/db/schema_migrations/20230620072920 b/db/schema_migrations/20230620072920
new file mode 100644
index 00000000000..37ee5e05783
--- /dev/null
+++ b/db/schema_migrations/20230620072920
@@ -0,0 +1 @@
+1fb33bd7af08a6213447e1f87531d4e285b69092ff5181276de0dfa9d1f40cc0 \ No newline at end of file
diff --git a/db/schema_migrations/20230620072925 b/db/schema_migrations/20230620072925
new file mode 100644
index 00000000000..46a5ca4c776
--- /dev/null
+++ b/db/schema_migrations/20230620072925
@@ -0,0 +1 @@
+fa58b6885924405f9556340ffc2625da5f94f4b68942bcca4927adc0fc74ebd7 \ No newline at end of file
diff --git a/db/schema_migrations/20230620101808 b/db/schema_migrations/20230620101808
new file mode 100644
index 00000000000..ecb74b18870
--- /dev/null
+++ b/db/schema_migrations/20230620101808
@@ -0,0 +1 @@
+8c797f079ce4536559bbe73b9c18540f5793dc725eb970ac23bfeb1578f8adc2 \ No newline at end of file
diff --git a/db/schema_migrations/20230620104217 b/db/schema_migrations/20230620104217
new file mode 100644
index 00000000000..f07e758bdbd
--- /dev/null
+++ b/db/schema_migrations/20230620104217
@@ -0,0 +1 @@
+cd2692308d23e12450ff96bf7a0cde9866b8d920babc1187e9e4b50fa5b2d43a \ No newline at end of file
diff --git a/db/schema_migrations/20230620105919 b/db/schema_migrations/20230620105919
new file mode 100644
index 00000000000..b5922e4afc3
--- /dev/null
+++ b/db/schema_migrations/20230620105919
@@ -0,0 +1 @@
+fa1729c74f96263143b15e9a08fd4bf723dd55a75ee295ff7390020030fc1355 \ No newline at end of file
diff --git a/db/schema_migrations/20230620110004 b/db/schema_migrations/20230620110004
new file mode 100644
index 00000000000..4bfe9bdc623
--- /dev/null
+++ b/db/schema_migrations/20230620110004
@@ -0,0 +1 @@
+ca9564bcb051593478180c42c107be4f49a31df4a15ada3cba52a5779754b812 \ No newline at end of file
diff --git a/db/schema_migrations/20230620110021 b/db/schema_migrations/20230620110021
new file mode 100644
index 00000000000..646362e1905
--- /dev/null
+++ b/db/schema_migrations/20230620110021
@@ -0,0 +1 @@
+2ba72a003cb2a6560caa1351dc46113f370a59767c629127da6f7bfe43b8cbde \ No newline at end of file
diff --git a/db/schema_migrations/20230620134708 b/db/schema_migrations/20230620134708
new file mode 100644
index 00000000000..2a5da955fe1
--- /dev/null
+++ b/db/schema_migrations/20230620134708
@@ -0,0 +1 @@
+5380771d2c97c44978ff78a310f682b185d97c56d80620ccda4322a22d000978 \ No newline at end of file
diff --git a/db/schema_migrations/20230620201738 b/db/schema_migrations/20230620201738
new file mode 100644
index 00000000000..1bc9933c362
--- /dev/null
+++ b/db/schema_migrations/20230620201738
@@ -0,0 +1 @@
+99ee0372604bb5cd0778407b4af5ff2971136583166e90aba37fadd8e90e4109 \ No newline at end of file
diff --git a/db/schema_migrations/20230620201817 b/db/schema_migrations/20230620201817
new file mode 100644
index 00000000000..04ab99b2d9b
--- /dev/null
+++ b/db/schema_migrations/20230620201817
@@ -0,0 +1 @@
+a4b69d82118f3cacd310a3dc369769e5ea767e763852ac4a27c138bccd500990 \ No newline at end of file
diff --git a/db/schema_migrations/20230621065943 b/db/schema_migrations/20230621065943
new file mode 100644
index 00000000000..4c918e07f34
--- /dev/null
+++ b/db/schema_migrations/20230621065943
@@ -0,0 +1 @@
+f51d14579ace7c0b843c1371086218770c2c2083fec5d1088a49bf9bd6c6e572 \ No newline at end of file
diff --git a/db/schema_migrations/20230621070810 b/db/schema_migrations/20230621070810
new file mode 100644
index 00000000000..e080764583d
--- /dev/null
+++ b/db/schema_migrations/20230621070810
@@ -0,0 +1 @@
+87393271016f643e4df201322e26f703ce9cf74d2189f0e0e586ff48697f994a \ No newline at end of file
diff --git a/db/schema_migrations/20230621072726 b/db/schema_migrations/20230621072726
new file mode 100644
index 00000000000..333aeda18b3
--- /dev/null
+++ b/db/schema_migrations/20230621072726
@@ -0,0 +1 @@
+56bf488ec781f8db5ec1723c6a749c0d80140781a1eb3a07984abeddd7d6e88e \ No newline at end of file
diff --git a/db/schema_migrations/20230621072848 b/db/schema_migrations/20230621072848
new file mode 100644
index 00000000000..0c69a850bd5
--- /dev/null
+++ b/db/schema_migrations/20230621072848
@@ -0,0 +1 @@
+4add5ff0aacac0f287e7aad63a5c0361091d9467bbabc03117750fdbd83681b5 \ No newline at end of file
diff --git a/db/schema_migrations/20230621074446 b/db/schema_migrations/20230621074446
new file mode 100644
index 00000000000..6344e8a2153
--- /dev/null
+++ b/db/schema_migrations/20230621074446
@@ -0,0 +1 @@
+f40ca52d92fd6c2c3a64b5b3c46c46f1f690b67b5320e84f55f62d4723c7d7e6 \ No newline at end of file
diff --git a/db/schema_migrations/20230621074611 b/db/schema_migrations/20230621074611
new file mode 100644
index 00000000000..4a7ac63ed34
--- /dev/null
+++ b/db/schema_migrations/20230621074611
@@ -0,0 +1 @@
+b44a08db74d15671a63afff9c41da67c0486c57bb893dc147ae073d78541457c \ No newline at end of file
diff --git a/db/schema_migrations/20230621083004 b/db/schema_migrations/20230621083004
new file mode 100644
index 00000000000..9cf899b3495
--- /dev/null
+++ b/db/schema_migrations/20230621083004
@@ -0,0 +1 @@
+e5b653b4cdee96f1160950ca6885609f393d49f9b7a4cdd3be3e1dac07fc3add \ No newline at end of file
diff --git a/db/schema_migrations/20230621083052 b/db/schema_migrations/20230621083052
new file mode 100644
index 00000000000..edd3c6df2fe
--- /dev/null
+++ b/db/schema_migrations/20230621083052
@@ -0,0 +1 @@
+7aa6e43678d3e7421fc80c6705daab68c219fa715b8a18ef6c9fdc5df304f8c0 \ No newline at end of file
diff --git a/db/schema_migrations/20230621102941 b/db/schema_migrations/20230621102941
new file mode 100644
index 00000000000..10d052d6055
--- /dev/null
+++ b/db/schema_migrations/20230621102941
@@ -0,0 +1 @@
+d7e664cb16c66f72c409a5738a48f06a5b56d52409cd41095dedab7f5e9ea065 \ No newline at end of file
diff --git a/db/schema_migrations/20230621103000 b/db/schema_migrations/20230621103000
new file mode 100644
index 00000000000..1d0aee1217e
--- /dev/null
+++ b/db/schema_migrations/20230621103000
@@ -0,0 +1 @@
+9d96b459795c8850ada522769855e2ab6c554ea774a78272baf1db873589f556 \ No newline at end of file
diff --git a/db/schema_migrations/20230621103043 b/db/schema_migrations/20230621103043
new file mode 100644
index 00000000000..707105b67c4
--- /dev/null
+++ b/db/schema_migrations/20230621103043
@@ -0,0 +1 @@
+b1c7f95cfa972fb23c536d5607b9b1d067e0e8af9e8036170cba6ca913a9c9e0 \ No newline at end of file
diff --git a/db/schema_migrations/20230622044119 b/db/schema_migrations/20230622044119
new file mode 100644
index 00000000000..31c5297f030
--- /dev/null
+++ b/db/schema_migrations/20230622044119
@@ -0,0 +1 @@
+b95691099886021c131b3ef04ce21a5610a31a635e9a95eee1d31a558b7dae8b \ No newline at end of file
diff --git a/db/schema_migrations/20230622051925 b/db/schema_migrations/20230622051925
new file mode 100644
index 00000000000..54d986fde1d
--- /dev/null
+++ b/db/schema_migrations/20230622051925
@@ -0,0 +1 @@
+c171fb3fd46cd8b015bc173e94e3e413aefb9a2afa58d556e357454717978313 \ No newline at end of file
diff --git a/db/schema_migrations/20230622051943 b/db/schema_migrations/20230622051943
new file mode 100644
index 00000000000..206327d89c2
--- /dev/null
+++ b/db/schema_migrations/20230622051943
@@ -0,0 +1 @@
+be537d6f8024b067c302cd96429d1bccca410c13c9ea4392c0642af4ddd4eb19 \ No newline at end of file
diff --git a/db/schema_migrations/20230622052015 b/db/schema_migrations/20230622052015
new file mode 100644
index 00000000000..d25ccb2099e
--- /dev/null
+++ b/db/schema_migrations/20230622052015
@@ -0,0 +1 @@
+6d6e5a996e7a7abcf5f1b6e019a8e86a3d4e9aab0052c6f7620ff02091527229 \ No newline at end of file
diff --git a/db/schema_migrations/20230622052046 b/db/schema_migrations/20230622052046
new file mode 100644
index 00000000000..7faab404d2b
--- /dev/null
+++ b/db/schema_migrations/20230622052046
@@ -0,0 +1 @@
+2649850f5ea46578753c4b6d30cbc64e40d1b0f85d24b1de58791d21d1837379 \ No newline at end of file
diff --git a/db/schema_migrations/20230622073752 b/db/schema_migrations/20230622073752
new file mode 100644
index 00000000000..5dcd11379dc
--- /dev/null
+++ b/db/schema_migrations/20230622073752
@@ -0,0 +1 @@
+0bf41a90a42bd448727459b22f94b24f78e933fc2f5d1f4b27cf37c40cc7bbe6 \ No newline at end of file
diff --git a/db/schema_migrations/20230622093921 b/db/schema_migrations/20230622093921
new file mode 100644
index 00000000000..696104cce80
--- /dev/null
+++ b/db/schema_migrations/20230622093921
@@ -0,0 +1 @@
+1947fe30ac91f67fc863879e4adbc46dbe6ef84c9daa7de8133a81a15eb0e6ce \ No newline at end of file
diff --git a/db/schema_migrations/20230623073906 b/db/schema_migrations/20230623073906
new file mode 100644
index 00000000000..0783428a741
--- /dev/null
+++ b/db/schema_migrations/20230623073906
@@ -0,0 +1 @@
+d76cadfee80a039889d8abe1a0d62f37db683d7c82f7b2bc9a5882af6c65cdf9 \ No newline at end of file
diff --git a/db/schema_migrations/20230626065725 b/db/schema_migrations/20230626065725
new file mode 100644
index 00000000000..5e0d178a73b
--- /dev/null
+++ b/db/schema_migrations/20230626065725
@@ -0,0 +1 @@
+1f9cc4c9d10fa666d5c30dcf7752cac335878565b8e49084960a9fc137be98fc \ No newline at end of file
diff --git a/db/schema_migrations/20230626065755 b/db/schema_migrations/20230626065755
new file mode 100644
index 00000000000..491f61fe3ec
--- /dev/null
+++ b/db/schema_migrations/20230626065755
@@ -0,0 +1 @@
+1284418dccf0e96d281f9ffea3048fc74d145be9ea1f20e443c91707559105d9 \ No newline at end of file
diff --git a/db/schema_migrations/20230626070723 b/db/schema_migrations/20230626070723
new file mode 100644
index 00000000000..c0528c8a9b5
--- /dev/null
+++ b/db/schema_migrations/20230626070723
@@ -0,0 +1 @@
+3154c7f63689ab430342229b526380cdc02ab9e11f855cf914cb382ba2850ab1 \ No newline at end of file
diff --git a/db/schema_migrations/20230626070959 b/db/schema_migrations/20230626070959
new file mode 100644
index 00000000000..3445b9e6f2e
--- /dev/null
+++ b/db/schema_migrations/20230626070959
@@ -0,0 +1 @@
+fe4406579d2f6be5e422ce359cf7995d4d601088c85d04b9c0d7b95d41111e23 \ No newline at end of file
diff --git a/db/schema_migrations/20230626071100 b/db/schema_migrations/20230626071100
new file mode 100644
index 00000000000..60c3b5c045d
--- /dev/null
+++ b/db/schema_migrations/20230626071100
@@ -0,0 +1 @@
+4cab810df6576b2daf0264b961180cffb581c6b421c53d88c69ebfa4ecd90bc5 \ No newline at end of file
diff --git a/db/schema_migrations/20230626072436 b/db/schema_migrations/20230626072436
new file mode 100644
index 00000000000..1800699ff54
--- /dev/null
+++ b/db/schema_migrations/20230626072436
@@ -0,0 +1 @@
+7169f6ef838ca3992d32b92a8cda4063d147c7ffe64cc382d69ae92eca525d0b \ No newline at end of file
diff --git a/db/schema_migrations/20230626101519 b/db/schema_migrations/20230626101519
new file mode 100644
index 00000000000..874d3eec0ee
--- /dev/null
+++ b/db/schema_migrations/20230626101519
@@ -0,0 +1 @@
+7060d1ed7be6fce2e398d9ac042d6e67826742e639df8eee43245d66b8b87ea3 \ No newline at end of file
diff --git a/db/schema_migrations/20230626113908 b/db/schema_migrations/20230626113908
new file mode 100644
index 00000000000..2d3f3205189
--- /dev/null
+++ b/db/schema_migrations/20230626113908
@@ -0,0 +1 @@
+542e2345a171e46512d793cc764fdbb279d9bf40e65e021d249953b29ff66dcb \ No newline at end of file
diff --git a/db/schema_migrations/20230626113909 b/db/schema_migrations/20230626113909
new file mode 100644
index 00000000000..2edeec73a10
--- /dev/null
+++ b/db/schema_migrations/20230626113909
@@ -0,0 +1 @@
+633753a79a9d4f251c89b7fdbbf5fa17d2c85ceba091c450d377ab4e50bd9bce \ No newline at end of file
diff --git a/db/schema_migrations/20230626113910 b/db/schema_migrations/20230626113910
new file mode 100644
index 00000000000..ee86f5c77c4
--- /dev/null
+++ b/db/schema_migrations/20230626113910
@@ -0,0 +1 @@
+a702fd86f25c3044e7eb8195349aec6f0627e258946c996164880c0f72998176 \ No newline at end of file
diff --git a/db/schema_migrations/20230626115046 b/db/schema_migrations/20230626115046
new file mode 100644
index 00000000000..f33fe2cb20d
--- /dev/null
+++ b/db/schema_migrations/20230626115046
@@ -0,0 +1 @@
+ebc346341318ad1c6f3d10876d2a7ee1943f8795a407f0048d4cc92b4efba431 \ No newline at end of file
diff --git a/db/schema_migrations/20230627115305 b/db/schema_migrations/20230627115305
new file mode 100644
index 00000000000..148cbb9c6a9
--- /dev/null
+++ b/db/schema_migrations/20230627115305
@@ -0,0 +1 @@
+7c2149b427416d98e8fdacf703b4c100d135546bf700fbc06561c7dd74a60918 \ No newline at end of file
diff --git a/db/schema_migrations/20230627140707 b/db/schema_migrations/20230627140707
new file mode 100644
index 00000000000..39739131a93
--- /dev/null
+++ b/db/schema_migrations/20230627140707
@@ -0,0 +1 @@
+9568e3084ed45c6a818dbf4aa9d88b9489beac706f15e470e022cde38b97a327 \ No newline at end of file
diff --git a/db/schema_migrations/20230627174139 b/db/schema_migrations/20230627174139
new file mode 100644
index 00000000000..af37ba0baaa
--- /dev/null
+++ b/db/schema_migrations/20230627174139
@@ -0,0 +1 @@
+22ab53f5c190f37f37a3e3e57742b1dde3c0c724492b63f938bfdcb7c2a09fa1 \ No newline at end of file
diff --git a/db/schema_migrations/20230628023103 b/db/schema_migrations/20230628023103
new file mode 100644
index 00000000000..57a9e342467
--- /dev/null
+++ b/db/schema_migrations/20230628023103
@@ -0,0 +1 @@
+59e4b358359514dbb49b2b73c829a99f646100442f02aa36287935d6e8fa76ab \ No newline at end of file
diff --git a/db/schema_migrations/20230629011859 b/db/schema_migrations/20230629011859
new file mode 100644
index 00000000000..310d898c2ed
--- /dev/null
+++ b/db/schema_migrations/20230629011859
@@ -0,0 +1 @@
+ad9a274264ce640df6c8d3c035b34de960766b7ff71095c6ad63e882cc4a3d5a \ No newline at end of file
diff --git a/db/schema_migrations/20230629024032 b/db/schema_migrations/20230629024032
new file mode 100644
index 00000000000..f1ca84565e1
--- /dev/null
+++ b/db/schema_migrations/20230629024032
@@ -0,0 +1 @@
+5d66f87307ec80cd7695646b69a2002b4f78d892d8ce30f9de7d2583a6233ae7 \ No newline at end of file
diff --git a/db/schema_migrations/20230629024403 b/db/schema_migrations/20230629024403
new file mode 100644
index 00000000000..24d68f7c38a
--- /dev/null
+++ b/db/schema_migrations/20230629024403
@@ -0,0 +1 @@
+3de2d94ddd3f3df3ba8d0aefb4ad137c586abcc4fef065074c4087d866a0420d \ No newline at end of file
diff --git a/db/schema_migrations/20230629071427 b/db/schema_migrations/20230629071427
new file mode 100644
index 00000000000..6312e130669
--- /dev/null
+++ b/db/schema_migrations/20230629071427
@@ -0,0 +1 @@
+4f11acd2381e999cf81c7fe05a75f718a4ef735b7ada01140af67a5a1282e909 \ No newline at end of file
diff --git a/db/schema_migrations/20230629095819 b/db/schema_migrations/20230629095819
new file mode 100644
index 00000000000..13c1b53ca4b
--- /dev/null
+++ b/db/schema_migrations/20230629095819
@@ -0,0 +1 @@
+4e169ac2e0dd9df9f3f8ebf6041189ccdde1d683d9e64ced6743abdcc22eea7b \ No newline at end of file
diff --git a/db/schema_migrations/20230629112833 b/db/schema_migrations/20230629112833
new file mode 100644
index 00000000000..f147e88a01d
--- /dev/null
+++ b/db/schema_migrations/20230629112833
@@ -0,0 +1 @@
+90b19651bc3f69a2e104a94ec4b9c4a758b4e258b49dad19b9795d1574c51946 \ No newline at end of file
diff --git a/db/schema_migrations/20230629113029 b/db/schema_migrations/20230629113029
new file mode 100644
index 00000000000..b0908feca28
--- /dev/null
+++ b/db/schema_migrations/20230629113029
@@ -0,0 +1 @@
+1cca0c19cc117465e14bf52ad8aadbf61c4c6e4c3fbc17a77138dd1f40fad902 \ No newline at end of file
diff --git a/db/schema_migrations/20230629113133 b/db/schema_migrations/20230629113133
new file mode 100644
index 00000000000..56f6c7e167e
--- /dev/null
+++ b/db/schema_migrations/20230629113133
@@ -0,0 +1 @@
+fc7195a78541583e95a007594b393d0cd67f942c275efb8a43c6953128e8b4ec \ No newline at end of file
diff --git a/db/schema_migrations/20230630101337 b/db/schema_migrations/20230630101337
new file mode 100644
index 00000000000..1473c1bf651
--- /dev/null
+++ b/db/schema_migrations/20230630101337
@@ -0,0 +1 @@
+53020e29ac265baaca73fe0b5e861d3bafbadc7cc082ac49f766ba7f4e5ae912 \ No newline at end of file
diff --git a/db/schema_migrations/20230630101342 b/db/schema_migrations/20230630101342
new file mode 100644
index 00000000000..a8fdc05fabc
--- /dev/null
+++ b/db/schema_migrations/20230630101342
@@ -0,0 +1 @@
+6b3518efb850118b371ae2806557201ba3fa657a6d631d1225feaf77fe6dff85 \ No newline at end of file
diff --git a/db/schema_migrations/20230630101347 b/db/schema_migrations/20230630101347
new file mode 100644
index 00000000000..aa87ba3ebf9
--- /dev/null
+++ b/db/schema_migrations/20230630101347
@@ -0,0 +1 @@
+f1413f18b4efc28d0f23582a7a6bc0f27b1bb44eb44d471561cf6447410158cf \ No newline at end of file
diff --git a/db/schema_migrations/20230630170515 b/db/schema_migrations/20230630170515
new file mode 100644
index 00000000000..7c0f42235af
--- /dev/null
+++ b/db/schema_migrations/20230630170515
@@ -0,0 +1 @@
+838865785ae99586e6c4017b5c51dee845208501a66fd4a3890641be0c076dfc \ No newline at end of file
diff --git a/db/schema_migrations/20230701195315 b/db/schema_migrations/20230701195315
new file mode 100644
index 00000000000..fab65f8edb9
--- /dev/null
+++ b/db/schema_migrations/20230701195315
@@ -0,0 +1 @@
+5aa32c9cc47402adbb622bb7e8a2cd4f7714973d25a5b787c1156f3dee517433 \ No newline at end of file
diff --git a/db/schema_migrations/20230703024031 b/db/schema_migrations/20230703024031
new file mode 100644
index 00000000000..4e68e593e67
--- /dev/null
+++ b/db/schema_migrations/20230703024031
@@ -0,0 +1 @@
+bfbb862d6d7c54ebfa110a6266c99b9c264f4ae2d4c3b9cf07d47beb642bbb2b \ No newline at end of file
diff --git a/db/schema_migrations/20230703115902 b/db/schema_migrations/20230703115902
new file mode 100644
index 00000000000..471eb5becbb
--- /dev/null
+++ b/db/schema_migrations/20230703115902
@@ -0,0 +1 @@
+8a16b05cd573528b6e8baa2d86e761a2b431584c026918e3eda9a630b30ec727 \ No newline at end of file
diff --git a/db/schema_migrations/20230703121859 b/db/schema_migrations/20230703121859
new file mode 100644
index 00000000000..f72e3201352
--- /dev/null
+++ b/db/schema_migrations/20230703121859
@@ -0,0 +1 @@
+149cdb7863460246fb89d02d3c8e1709bdb1d38378304d44c9a916c4bd4ee4ed \ No newline at end of file
diff --git a/db/schema_migrations/20230703122803 b/db/schema_migrations/20230703122803
new file mode 100644
index 00000000000..18e7e752956
--- /dev/null
+++ b/db/schema_migrations/20230703122803
@@ -0,0 +1 @@
+af0a79450261909c0280ea5a7c747c5ec997062f33c0f2bc75891c2e99f61da8 \ No newline at end of file
diff --git a/db/schema_migrations/20230704042302 b/db/schema_migrations/20230704042302
new file mode 100644
index 00000000000..0a016cd7bb2
--- /dev/null
+++ b/db/schema_migrations/20230704042302
@@ -0,0 +1 @@
+d4c93417aef4587ba892f81b0339c5213cd6b5270478edcb1378138fd74e2787 \ No newline at end of file
diff --git a/db/schema_migrations/20230704044541 b/db/schema_migrations/20230704044541
new file mode 100644
index 00000000000..1d0765f22b4
--- /dev/null
+++ b/db/schema_migrations/20230704044541
@@ -0,0 +1 @@
+a10daabd1b354eaea1a6fb6c4b709d137e096c6aa667dea16f82661f20b716a3 \ No newline at end of file
diff --git a/db/schema_migrations/20230704050739 b/db/schema_migrations/20230704050739
new file mode 100644
index 00000000000..b19ba35fc6e
--- /dev/null
+++ b/db/schema_migrations/20230704050739
@@ -0,0 +1 @@
+93c012068f6f6f025cc2ed1c5670f0704010e13f1eec1bff6c5fb917ec6549a0 \ No newline at end of file
diff --git a/db/schema_migrations/20230704062132 b/db/schema_migrations/20230704062132
new file mode 100644
index 00000000000..807788250b0
--- /dev/null
+++ b/db/schema_migrations/20230704062132
@@ -0,0 +1 @@
+b103d237ee15e12602d656dca33abde5e6849ac4e81df606ba5578db9023f890 \ No newline at end of file
diff --git a/db/schema_migrations/20230704062136 b/db/schema_migrations/20230704062136
new file mode 100644
index 00000000000..62964934621
--- /dev/null
+++ b/db/schema_migrations/20230704062136
@@ -0,0 +1 @@
+74a1d7edb1319534d2853fc94726dae0e28944395c2fb30e0fc4597eb5ba1330 \ No newline at end of file
diff --git a/db/schema_migrations/20230704074120 b/db/schema_migrations/20230704074120
new file mode 100644
index 00000000000..c411bda0d73
--- /dev/null
+++ b/db/schema_migrations/20230704074120
@@ -0,0 +1 @@
+ec9cd530b8fe033c16865adf6494cc3e568c4bfa513e616398da737a68291cb5 \ No newline at end of file
diff --git a/db/schema_migrations/20230704074124 b/db/schema_migrations/20230704074124
new file mode 100644
index 00000000000..d672b7db2ef
--- /dev/null
+++ b/db/schema_migrations/20230704074124
@@ -0,0 +1 @@
+d7f3642897ee44f18c2b809f3936a951c715f3021454349117e22e387d18945a \ No newline at end of file
diff --git a/db/schema_migrations/20230705085223 b/db/schema_migrations/20230705085223
new file mode 100644
index 00000000000..cdbed593c44
--- /dev/null
+++ b/db/schema_migrations/20230705085223
@@ -0,0 +1 @@
+dd4cb988fa1451dfac5f6c4ae0990be05472d1a8beee05fdd18a9bc137f07ee2 \ No newline at end of file
diff --git a/db/schema_migrations/20230705092150 b/db/schema_migrations/20230705092150
new file mode 100644
index 00000000000..96e51e689e2
--- /dev/null
+++ b/db/schema_migrations/20230705092150
@@ -0,0 +1 @@
+5954829dd244b4536beeb9b92a157539feb5207bc1309e177310895f269f54d8 \ No newline at end of file
diff --git a/db/schema_migrations/20230705115215 b/db/schema_migrations/20230705115215
new file mode 100644
index 00000000000..ec12c32117d
--- /dev/null
+++ b/db/schema_migrations/20230705115215
@@ -0,0 +1 @@
+3035da4873093dd7c8cee94398c3b4a70a696e1e765d102cfe657b53e3b65be9 \ No newline at end of file
diff --git a/db/schema_migrations/20230705141703 b/db/schema_migrations/20230705141703
new file mode 100644
index 00000000000..51c3cd350c1
--- /dev/null
+++ b/db/schema_migrations/20230705141703
@@ -0,0 +1 @@
+dafb3395a28180da275eceddb87af4deb0008b2d0793dd0ea3f34d2ae8bd5c10 \ No newline at end of file
diff --git a/db/schema_migrations/20230705141733 b/db/schema_migrations/20230705141733
new file mode 100644
index 00000000000..2b5870f2ba5
--- /dev/null
+++ b/db/schema_migrations/20230705141733
@@ -0,0 +1 @@
+2cea22d62a5a08a643b3043bea1e14e4965f57201db559995cab8616d7586f55 \ No newline at end of file
diff --git a/db/schema_migrations/20230705142241 b/db/schema_migrations/20230705142241
new file mode 100644
index 00000000000..4d4ee24d798
--- /dev/null
+++ b/db/schema_migrations/20230705142241
@@ -0,0 +1 @@
+ae094cd61e252b30c1ebe0e5369ff2c061aa96079bbc1addde160003e2263886 \ No newline at end of file
diff --git a/db/schema_migrations/20230705142334 b/db/schema_migrations/20230705142334
new file mode 100644
index 00000000000..ace38aed2f7
--- /dev/null
+++ b/db/schema_migrations/20230705142334
@@ -0,0 +1 @@
+33de9f678eb493070ceaae0e50461cffbcdbb5a542740b9fc595cba2c8c32808 \ No newline at end of file
diff --git a/db/schema_migrations/20230705145827 b/db/schema_migrations/20230705145827
new file mode 100644
index 00000000000..48bf419a084
--- /dev/null
+++ b/db/schema_migrations/20230705145827
@@ -0,0 +1 @@
+c6bd06a0e306916809474790126ba90089c8f0dd8d25e3858f2e7b416996c9c8 \ No newline at end of file
diff --git a/db/schema_migrations/20230705150100 b/db/schema_migrations/20230705150100
new file mode 100644
index 00000000000..07da63247f9
--- /dev/null
+++ b/db/schema_migrations/20230705150100
@@ -0,0 +1 @@
+62ea862f8911a5114cfa8140862e1a3c5be7cf4f80064d72c453f8c81d8a7623 \ No newline at end of file
diff --git a/db/schema_migrations/20230705155000 b/db/schema_migrations/20230705155000
new file mode 100644
index 00000000000..e2f6d13e31e
--- /dev/null
+++ b/db/schema_migrations/20230705155000
@@ -0,0 +1 @@
+4f3d64c52ac1b46bab194be78cadeaa36abf3faf26de1c7d7ca3c03cc64b876f \ No newline at end of file
diff --git a/db/schema_migrations/20230706011541 b/db/schema_migrations/20230706011541
new file mode 100644
index 00000000000..4cebe9198b3
--- /dev/null
+++ b/db/schema_migrations/20230706011541
@@ -0,0 +1 @@
+fad04601d706468f7e77a232e07125c152373f9fe2c443a661e0d5ee68ea6e7b \ No newline at end of file
diff --git a/db/schema_migrations/20230706073937 b/db/schema_migrations/20230706073937
new file mode 100644
index 00000000000..56c214818d7
--- /dev/null
+++ b/db/schema_migrations/20230706073937
@@ -0,0 +1 @@
+e7cf459527a96936684778c46bfc3b3490d314f4dbf5e3a3daca8670f1fcaeaf \ No newline at end of file
diff --git a/db/schema_migrations/20230706080234 b/db/schema_migrations/20230706080234
new file mode 100644
index 00000000000..a188efbf3ca
--- /dev/null
+++ b/db/schema_migrations/20230706080234
@@ -0,0 +1 @@
+a76b57ff9a9e62c1e8d73c46a9bdf6512f0fe48d3b95b4c9a291d602d54d7a33 \ No newline at end of file
diff --git a/db/schema_migrations/20230706130217 b/db/schema_migrations/20230706130217
new file mode 100644
index 00000000000..8d2a74a3fc2
--- /dev/null
+++ b/db/schema_migrations/20230706130217
@@ -0,0 +1 @@
+3a355ebb2299786d9aa5ce9bf1f07b2bbd3b6aca719c12c78c4a945c4a96cfe3 \ No newline at end of file
diff --git a/db/schema_migrations/20230706192435 b/db/schema_migrations/20230706192435
new file mode 100644
index 00000000000..190b795da80
--- /dev/null
+++ b/db/schema_migrations/20230706192435
@@ -0,0 +1 @@
+92018d19330a9808bf1ee93c8a950d68794213fb600b040ebe5fbb7420c0d1f0 \ No newline at end of file
diff --git a/db/schema_migrations/20230707090835 b/db/schema_migrations/20230707090835
new file mode 100644
index 00000000000..8add6e8e125
--- /dev/null
+++ b/db/schema_migrations/20230707090835
@@ -0,0 +1 @@
+500559ce2b6a3ef8dbf33c6e1ebd1e11b4645d19b52139eaa247fc06c00a1f7c \ No newline at end of file
diff --git a/db/schema_migrations/20230707094002 b/db/schema_migrations/20230707094002
new file mode 100644
index 00000000000..1d19e5bc29e
--- /dev/null
+++ b/db/schema_migrations/20230707094002
@@ -0,0 +1 @@
+7e946c03c02800868016387682c3f4146edcd604c8007747ff64b6e4ef4badb2 \ No newline at end of file
diff --git a/db/schema_migrations/20230707094003 b/db/schema_migrations/20230707094003
new file mode 100644
index 00000000000..56442a983ee
--- /dev/null
+++ b/db/schema_migrations/20230707094003
@@ -0,0 +1 @@
+bf71e6fec331ea1b38a79fc376f63ce30c896f197ffa335b0ec8a914317a391f \ No newline at end of file
diff --git a/db/schema_migrations/20230707114012 b/db/schema_migrations/20230707114012
new file mode 100644
index 00000000000..b9525ad8a67
--- /dev/null
+++ b/db/schema_migrations/20230707114012
@@ -0,0 +1 @@
+dc0b3017e7dc807b18382cc0a19725be652eea6210c4b5b716093557deace62d \ No newline at end of file
diff --git a/db/schema_migrations/20230707211358 b/db/schema_migrations/20230707211358
new file mode 100644
index 00000000000..2f1f6a3d370
--- /dev/null
+++ b/db/schema_migrations/20230707211358
@@ -0,0 +1 @@
+1f2ae1ac4c26b8fe257c158e9c1b9a99a590176e8566d7b9f22c4265177c861a \ No newline at end of file
diff --git a/db/schema_migrations/20230707211359 b/db/schema_migrations/20230707211359
new file mode 100644
index 00000000000..00cc079594c
--- /dev/null
+++ b/db/schema_migrations/20230707211359
@@ -0,0 +1 @@
+7b319745b746418deedc6130cf6ed2860e0c4a01af9b15548dfacac314cdabe2 \ No newline at end of file
diff --git a/db/schema_migrations/20230707220646 b/db/schema_migrations/20230707220646
new file mode 100644
index 00000000000..7577fce9131
--- /dev/null
+++ b/db/schema_migrations/20230707220646
@@ -0,0 +1 @@
+6f801df7ed92d70e6f603d36b8c23c4e133e09b05040f848ca8d71581b8a793f \ No newline at end of file
diff --git a/db/schema_migrations/20230710160232 b/db/schema_migrations/20230710160232
new file mode 100644
index 00000000000..08f2ba7fa32
--- /dev/null
+++ b/db/schema_migrations/20230710160232
@@ -0,0 +1 @@
+1f894fea060c0abee05799f161665214d66c8e8f0509b464b2bf6a35964f457b \ No newline at end of file
diff --git a/db/schema_migrations/20230710200434 b/db/schema_migrations/20230710200434
new file mode 100644
index 00000000000..f58e9cdc060
--- /dev/null
+++ b/db/schema_migrations/20230710200434
@@ -0,0 +1 @@
+ee8f60421aed0a748b55efce7292c319159f21d9112cd61012a771654f70a769 \ No newline at end of file
diff --git a/db/schema_migrations/20230711093010 b/db/schema_migrations/20230711093010
new file mode 100644
index 00000000000..7fcdd69e7df
--- /dev/null
+++ b/db/schema_migrations/20230711093010
@@ -0,0 +1 @@
+1634c4bbe3fd813098a4865db2d84e83fd9eac967723c4500da4c78e9255af46 \ No newline at end of file
diff --git a/db/schema_migrations/20230712020407 b/db/schema_migrations/20230712020407
new file mode 100644
index 00000000000..d31382ed737
--- /dev/null
+++ b/db/schema_migrations/20230712020407
@@ -0,0 +1 @@
+3dc44ced12562d7846fcdc0ad956993705b13f0ecc2418d6ef1853337eea2fff \ No newline at end of file
diff --git a/db/schema_migrations/20230712064637 b/db/schema_migrations/20230712064637
new file mode 100644
index 00000000000..7b541ed714d
--- /dev/null
+++ b/db/schema_migrations/20230712064637
@@ -0,0 +1 @@
+b39d83cc2257d75ece3dfa1c5f6faa1ef6eb1c40d3de0a1899a2860d5a1c7ed1 \ No newline at end of file
diff --git a/db/schema_migrations/20230712064655 b/db/schema_migrations/20230712064655
new file mode 100644
index 00000000000..860b5183a04
--- /dev/null
+++ b/db/schema_migrations/20230712064655
@@ -0,0 +1 @@
+25d0b4c560dcec564a268d96e969b07fbfe18f1d902fdafe415cf747bdb1302c \ No newline at end of file
diff --git a/db/schema_migrations/20230712145323 b/db/schema_migrations/20230712145323
new file mode 100644
index 00000000000..00d938eb599
--- /dev/null
+++ b/db/schema_migrations/20230712145323
@@ -0,0 +1 @@
+3102bb4fb27322ca9a0b2f60757a0bb90d7fce74a8607226f2e2bcf336563ceb \ No newline at end of file
diff --git a/db/schema_migrations/20230712145821 b/db/schema_migrations/20230712145821
new file mode 100644
index 00000000000..8282462f0de
--- /dev/null
+++ b/db/schema_migrations/20230712145821
@@ -0,0 +1 @@
+cf697183d364abeab6c9701f51db570f153d88949b51a8e157a502c0a38f007e \ No newline at end of file
diff --git a/db/schema_migrations/20230712145926 b/db/schema_migrations/20230712145926
new file mode 100644
index 00000000000..b0666ce0cf6
--- /dev/null
+++ b/db/schema_migrations/20230712145926
@@ -0,0 +1 @@
+992137f8611e57d44b4b3a861fce07353f0eccfafa894dd3cede02554bcde424 \ No newline at end of file
diff --git a/db/schema_migrations/20230712214613 b/db/schema_migrations/20230712214613
new file mode 100644
index 00000000000..f9afbe825d6
--- /dev/null
+++ b/db/schema_migrations/20230712214613
@@ -0,0 +1 @@
+56415a907d3bba749b9d42b5f37919981e779f0422c86793028d128350875f2d \ No newline at end of file
diff --git a/db/schema_migrations/20230713020247 b/db/schema_migrations/20230713020247
new file mode 100644
index 00000000000..a11206d6e55
--- /dev/null
+++ b/db/schema_migrations/20230713020247
@@ -0,0 +1 @@
+8fcab29ea25760d876c2b985cf9e4f2a62e25450322a92fe769533b0882b5402 \ No newline at end of file
diff --git a/db/schema_migrations/20230713100100 b/db/schema_migrations/20230713100100
new file mode 100644
index 00000000000..ee77da01273
--- /dev/null
+++ b/db/schema_migrations/20230713100100
@@ -0,0 +1 @@
+9787c717ecf74dd05277bde331b554fb824d6d39df83b5d46bac45ba1962e96a \ No newline at end of file
diff --git a/db/schema_migrations/20230714195649 b/db/schema_migrations/20230714195649
new file mode 100644
index 00000000000..7d0954f5ed8
--- /dev/null
+++ b/db/schema_migrations/20230714195649
@@ -0,0 +1 @@
+d47e6e46f9c70ae93c929e93bc361f3ca88ae86d1139110ddda341564a465b60 \ No newline at end of file
diff --git a/db/schema_migrations/20230717200940 b/db/schema_migrations/20230717200940
new file mode 100644
index 00000000000..6e25e66b8f8
--- /dev/null
+++ b/db/schema_migrations/20230717200940
@@ -0,0 +1 @@
+970898c369a13483eab732969f1ef3a63f7bcaf041fdb8a2b8c10e93da0de7c1 \ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index a1ca2147c8c..408d9d851aa 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -191,6 +191,18 @@ CREATE FUNCTION postgres_pg_stat_activity_autovacuum() RETURNS TABLE(query text,
AND backend_type = 'autovacuum worker'
$$;
+CREATE FUNCTION prevent_delete_of_default_organization() RETURNS trigger
+ LANGUAGE plpgsql
+ AS $$
+BEGIN
+IF OLD.id = 1 THEN
+ RAISE EXCEPTION 'Deletion of the default Organization is not allowed.';
+END IF;
+RETURN OLD;
+
+END
+$$;
+
CREATE FUNCTION set_has_external_issue_tracker() RETURNS trigger
LANGUAGE plpgsql
AS $$
@@ -237,29 +249,20 @@ RETURN NULL;
END
$$;
-CREATE FUNCTION trigger_023e82d8e257() RETURNS trigger
- LANGUAGE plpgsql
- AS $$
-BEGIN
- NEW."id_convert_to_bigint" := NEW."id";
- RETURN NEW;
-END;
-$$;
-
-CREATE FUNCTION trigger_080e73845bfd() RETURNS trigger
+CREATE FUNCTION trigger_1a857e8db6cd() RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
- NEW."id_convert_to_bigint" := NEW."id";
+ NEW."uuid_convert_string_to_uuid" := NEW."uuid";
RETURN NEW;
END;
$$;
-CREATE FUNCTION trigger_1a857e8db6cd() RETURNS trigger
+CREATE FUNCTION trigger_7f3d66a7d7f5() RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
- NEW."uuid_convert_string_to_uuid" := NEW."uuid";
+ NEW."pipeline_id_convert_to_bigint" := NEW."pipeline_id";
RETURN NEW;
END;
$$;
@@ -11766,6 +11769,10 @@ CREATE TABLE application_settings (
unconfirmed_users_delete_after_days integer DEFAULT 7 NOT NULL,
default_branch_protection_defaults jsonb DEFAULT '{}'::jsonb NOT NULL,
gitlab_shell_operation_limit integer DEFAULT 600,
+ elasticsearch_requeue_workers boolean DEFAULT false NOT NULL,
+ elasticsearch_worker_number_of_shards integer DEFAULT 2 NOT NULL,
+ relay_state_domain_allowlist text[] DEFAULT '{}'::text[] NOT NULL,
+ namespace_storage_forks_cost_factor double precision DEFAULT 1.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_container_registry_pre_import_tags_rate_positive CHECK ((container_registry_pre_import_tags_rate >= (0)::numeric)),
CONSTRAINT app_settings_dep_proxy_ttl_policies_worker_capacity_positive CHECK ((dependency_proxy_ttl_group_policy_worker_capacity >= 0)),
@@ -11809,6 +11816,7 @@ CREATE TABLE application_settings (
CONSTRAINT check_9c6c447a13 CHECK ((char_length(maintenance_mode_message) <= 255)),
CONSTRAINT check_a5704163cc CHECK ((char_length(secret_detection_revocation_token_types_url) <= 255)),
CONSTRAINT check_ae53cf7f82 CHECK ((char_length(vertex_ai_host) <= 255)),
+ CONSTRAINT check_app_settings_namespace_storage_forks_cost_factor_range CHECK (((namespace_storage_forks_cost_factor >= (0)::double precision) AND (namespace_storage_forks_cost_factor <= (1)::double precision))),
CONSTRAINT check_b8c74ea5b3 CHECK ((char_length(deactivation_email_additional_text) <= 1000)),
CONSTRAINT check_d03919528d CHECK ((char_length(container_registry_vendor) <= 255)),
CONSTRAINT check_d820146492 CHECK ((char_length(spam_check_endpoint_url) <= 255)),
@@ -12120,8 +12128,10 @@ CREATE TABLE audit_events_external_audit_event_destinations (
created_at timestamp with time zone NOT NULL,
updated_at timestamp with time zone NOT NULL,
verification_token text,
+ name text NOT NULL,
CONSTRAINT check_2feafb9daf CHECK ((char_length(destination_url) <= 255)),
- CONSTRAINT check_8ec80a7d06 CHECK ((char_length(verification_token) <= 24))
+ CONSTRAINT check_8ec80a7d06 CHECK ((char_length(verification_token) <= 24)),
+ CONSTRAINT check_c52ff8e90e CHECK ((char_length(name) <= 72))
);
CREATE SEQUENCE audit_events_external_audit_event_destinations_id_seq
@@ -12173,6 +12183,8 @@ CREATE TABLE audit_events_instance_external_audit_event_destinations (
destination_url text NOT NULL,
encrypted_verification_token bytea NOT NULL,
encrypted_verification_token_iv bytea NOT NULL,
+ name text NOT NULL,
+ CONSTRAINT check_433fbb3305 CHECK ((char_length(name) <= 72)),
CONSTRAINT check_4dc67167ce CHECK ((char_length(destination_url) <= 255))
);
@@ -12925,7 +12937,8 @@ ALTER SEQUENCE bulk_imports_id_seq OWNED BY bulk_imports.id;
CREATE TABLE catalog_resources (
id bigint NOT NULL,
project_id bigint NOT NULL,
- created_at timestamp with time zone NOT NULL
+ created_at timestamp with time zone NOT NULL,
+ state smallint DEFAULT 0 NOT NULL
);
CREATE SEQUENCE catalog_resources_id_seq
@@ -12982,7 +12995,7 @@ CREATE TABLE ci_build_needs (
artifacts boolean DEFAULT true NOT NULL,
optional boolean DEFAULT false NOT NULL,
build_id bigint NOT NULL,
- partition_id bigint DEFAULT 100 NOT NULL,
+ partition_id bigint NOT NULL,
id bigint NOT NULL
);
@@ -13004,7 +13017,7 @@ CREATE TABLE ci_build_pending_states (
failure_reason smallint,
trace_checksum bytea,
trace_bytesize bigint,
- partition_id bigint DEFAULT 100 NOT NULL
+ partition_id bigint NOT NULL
);
CREATE SEQUENCE ci_build_pending_states_id_seq
@@ -13020,7 +13033,7 @@ CREATE TABLE ci_build_report_results (
build_id bigint NOT NULL,
project_id bigint NOT NULL,
data jsonb DEFAULT '{}'::jsonb NOT NULL,
- partition_id bigint DEFAULT 100 NOT NULL
+ partition_id bigint NOT NULL
);
CREATE TABLE ci_build_trace_chunks (
@@ -13031,7 +13044,7 @@ CREATE TABLE ci_build_trace_chunks (
checksum bytea,
lock_version integer DEFAULT 0 NOT NULL,
build_id bigint NOT NULL,
- partition_id bigint DEFAULT 100 NOT NULL
+ partition_id bigint NOT NULL
);
CREATE SEQUENCE ci_build_trace_chunks_id_seq
@@ -13051,7 +13064,7 @@ CREATE TABLE ci_build_trace_metadata (
remote_checksum bytea,
last_archival_attempt_at timestamp with time zone,
archived_at timestamp with time zone,
- partition_id bigint DEFAULT 100 NOT NULL
+ partition_id bigint NOT NULL
);
CREATE TABLE p_ci_builds (
@@ -13216,7 +13229,7 @@ CREATE TABLE ci_builds_runner_session (
certificate character varying,
"authorization" character varying,
build_id bigint NOT NULL,
- partition_id bigint DEFAULT 100 NOT NULL
+ partition_id bigint NOT NULL
);
CREATE SEQUENCE ci_builds_runner_session_id_seq
@@ -13332,7 +13345,9 @@ CREATE TABLE ci_group_variables (
variable_type smallint DEFAULT 1 NOT NULL,
environment_scope text DEFAULT '*'::text NOT NULL,
raw boolean DEFAULT false NOT NULL,
- CONSTRAINT check_dfe009485a CHECK ((char_length(environment_scope) <= 255))
+ description text,
+ CONSTRAINT check_dfe009485a CHECK ((char_length(environment_scope) <= 255)),
+ CONSTRAINT check_e2e50ff879 CHECK ((char_length(description) <= 255))
);
CREATE SEQUENCE ci_group_variables_id_seq
@@ -13394,7 +13409,7 @@ CREATE TABLE ci_job_artifacts (
id bigint NOT NULL,
job_id bigint NOT NULL,
locked smallint DEFAULT 2,
- partition_id bigint DEFAULT 100 NOT NULL,
+ partition_id bigint NOT NULL,
accessibility smallint DEFAULT 0 NOT NULL,
file_final_path text,
CONSTRAINT check_27f0f6dbab CHECK ((file_store IS NOT NULL)),
@@ -13437,7 +13452,7 @@ CREATE TABLE ci_job_variables (
variable_type smallint DEFAULT 1 NOT NULL,
source smallint DEFAULT 0 NOT NULL,
raw boolean DEFAULT false NOT NULL,
- partition_id bigint DEFAULT 100 NOT NULL
+ partition_id bigint NOT NULL
);
CREATE SEQUENCE ci_job_variables_id_seq
@@ -13530,7 +13545,7 @@ CREATE TABLE ci_pending_builds (
minutes_exceeded boolean DEFAULT false NOT NULL,
tag_ids integer[] DEFAULT '{}'::integer[],
namespace_traversal_ids integer[] DEFAULT '{}'::integer[],
- partition_id bigint DEFAULT 100 NOT NULL
+ partition_id bigint NOT NULL
);
CREATE SEQUENCE ci_pending_builds_id_seq
@@ -13664,7 +13679,6 @@ CREATE SEQUENCE ci_pipeline_schedules_id_seq
ALTER SEQUENCE ci_pipeline_schedules_id_seq OWNED BY ci_pipeline_schedules.id;
CREATE TABLE ci_pipeline_variables (
- id_convert_to_bigint integer DEFAULT 0 NOT NULL,
key character varying NOT NULL,
value text,
encrypted_value text,
@@ -13672,9 +13686,10 @@ CREATE TABLE ci_pipeline_variables (
encrypted_value_iv character varying,
pipeline_id integer NOT NULL,
variable_type smallint DEFAULT 1 NOT NULL,
- partition_id bigint DEFAULT 100 NOT NULL,
+ partition_id bigint NOT NULL,
raw boolean DEFAULT false NOT NULL,
- id bigint NOT NULL
+ id bigint NOT NULL,
+ pipeline_id_convert_to_bigint bigint DEFAULT 0 NOT NULL
);
CREATE SEQUENCE ci_pipeline_variables_id_seq
@@ -13716,7 +13731,7 @@ CREATE TABLE ci_pipelines (
external_pull_request_id bigint,
ci_ref_id bigint,
locked smallint DEFAULT 1 NOT NULL,
- partition_id bigint DEFAULT 100 NOT NULL,
+ partition_id bigint NOT NULL,
id_convert_to_bigint bigint DEFAULT 0 NOT NULL,
CONSTRAINT check_d7e99a025e CHECK ((lock_version IS NOT NULL))
);
@@ -13958,7 +13973,7 @@ CREATE TABLE ci_running_builds (
runner_id bigint NOT NULL,
created_at timestamp with time zone DEFAULT now() NOT NULL,
runner_type smallint NOT NULL,
- partition_id bigint DEFAULT 100 NOT NULL
+ partition_id bigint NOT NULL
);
CREATE SEQUENCE ci_running_builds_id_seq
@@ -14024,8 +14039,8 @@ CREATE TABLE ci_sources_pipelines (
source_project_id integer,
source_pipeline_id integer,
source_job_id bigint,
- partition_id bigint DEFAULT 100 NOT NULL,
- source_partition_id bigint DEFAULT 100 NOT NULL
+ partition_id bigint NOT NULL,
+ source_partition_id bigint NOT NULL
);
CREATE SEQUENCE ci_sources_pipelines_id_seq
@@ -14062,7 +14077,7 @@ CREATE TABLE ci_stages (
lock_version integer DEFAULT 0,
"position" integer,
id bigint NOT NULL,
- partition_id bigint DEFAULT 100 NOT NULL,
+ partition_id bigint NOT NULL,
CONSTRAINT check_81b431e49b CHECK ((lock_version IS NOT NULL))
);
@@ -14135,7 +14150,7 @@ CREATE TABLE ci_unit_test_failures (
failed_at timestamp with time zone NOT NULL,
unit_test_id bigint NOT NULL,
build_id bigint NOT NULL,
- partition_id bigint DEFAULT 100 NOT NULL
+ partition_id bigint NOT NULL
);
CREATE SEQUENCE ci_unit_test_failures_id_seq
@@ -14179,7 +14194,9 @@ CREATE TABLE ci_variables (
environment_scope character varying DEFAULT '*'::character varying NOT NULL,
masked boolean DEFAULT false NOT NULL,
variable_type smallint DEFAULT 1 NOT NULL,
- raw boolean DEFAULT false NOT NULL
+ raw boolean DEFAULT false NOT NULL,
+ description text,
+ CONSTRAINT check_7e46c006aa CHECK ((char_length(description) <= 255))
);
CREATE SEQUENCE ci_variables_id_seq
@@ -15680,7 +15697,9 @@ CREATE TABLE environments (
auto_delete_at timestamp with time zone,
tier smallint,
merge_request_id bigint,
- cluster_agent_id bigint
+ cluster_agent_id bigint,
+ kubernetes_namespace text,
+ CONSTRAINT check_b5373a1804 CHECK ((char_length(kubernetes_namespace) <= 63))
);
CREATE SEQUENCE environments_id_seq
@@ -16721,6 +16740,28 @@ CREATE TABLE group_wiki_repositories (
CONSTRAINT check_07f1c81806 CHECK ((char_length(disk_path) <= 80))
);
+CREATE TABLE group_wiki_repository_states (
+ id bigint NOT NULL,
+ verification_started_at timestamp with time zone,
+ verification_retry_at timestamp with time zone,
+ verified_at timestamp with time zone,
+ group_wiki_repository_id bigint NOT NULL,
+ verification_state smallint DEFAULT 0 NOT NULL,
+ verification_retry_count smallint DEFAULT 0 NOT NULL,
+ verification_checksum bytea,
+ verification_failure text,
+ CONSTRAINT check_14d288436d CHECK ((char_length(verification_failure) <= 255))
+);
+
+CREATE SEQUENCE group_wiki_repository_states_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE group_wiki_repository_states_id_seq OWNED BY group_wiki_repository_states.id;
+
CREATE TABLE historical_data (
id integer NOT NULL,
date date,
@@ -17135,6 +17176,8 @@ CREATE TABLE integrations (
encrypted_properties bytea,
encrypted_properties_iv bytea,
incident_events boolean DEFAULT false NOT NULL,
+ group_mention_events boolean DEFAULT false NOT NULL,
+ group_confidential_mention_events boolean DEFAULT false NOT NULL,
CONSTRAINT check_a948a0aa7e CHECK ((char_length(type_new) <= 255))
);
@@ -17866,7 +17909,8 @@ CREATE TABLE member_roles (
base_access_level integer NOT NULL,
read_code boolean DEFAULT false,
read_vulnerability boolean DEFAULT false NOT NULL,
- admin_vulnerability boolean DEFAULT false NOT NULL
+ admin_vulnerability boolean DEFAULT false NOT NULL,
+ read_dependency boolean DEFAULT false NOT NULL
);
CREATE SEQUENCE member_roles_id_seq
@@ -18210,6 +18254,27 @@ CREATE SEQUENCE merge_request_predictions_merge_request_id_seq
ALTER SEQUENCE merge_request_predictions_merge_request_id_seq OWNED BY merge_request_predictions.merge_request_id;
+CREATE TABLE merge_request_review_llm_summaries (
+ id bigint NOT NULL,
+ user_id bigint,
+ review_id bigint NOT NULL,
+ merge_request_diff_id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ provider smallint NOT NULL,
+ content text NOT NULL,
+ CONSTRAINT check_72802358e9 CHECK ((char_length(content) <= 2056))
+);
+
+CREATE SEQUENCE merge_request_review_llm_summaries_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE merge_request_review_llm_summaries_id_seq OWNED BY merge_request_review_llm_summaries.id;
+
CREATE TABLE merge_request_reviewers (
id bigint NOT NULL,
user_id bigint NOT NULL,
@@ -18552,6 +18617,7 @@ CREATE TABLE ml_experiments (
user_id bigint,
name text NOT NULL,
deleted_on timestamp with time zone,
+ model_id bigint,
CONSTRAINT check_ee07a0be2c CHECK ((char_length(name) <= 255))
);
@@ -18564,6 +18630,44 @@ CREATE SEQUENCE ml_experiments_id_seq
ALTER SEQUENCE ml_experiments_id_seq OWNED BY ml_experiments.id;
+CREATE TABLE ml_model_versions (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ project_id bigint NOT NULL,
+ model_id bigint NOT NULL,
+ package_id bigint,
+ version text NOT NULL,
+ CONSTRAINT check_28b2d892c8 CHECK ((char_length(version) <= 255))
+);
+
+CREATE SEQUENCE ml_model_versions_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ml_model_versions_id_seq OWNED BY ml_model_versions.id;
+
+CREATE TABLE ml_models (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ project_id bigint NOT NULL,
+ name text NOT NULL,
+ CONSTRAINT check_1fd2cc7d93 CHECK ((char_length(name) <= 255))
+);
+
+CREATE SEQUENCE ml_models_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ml_models_id_seq OWNED BY ml_models.id;
+
CREATE TABLE namespace_admin_notes (
id bigint NOT NULL,
created_at timestamp with time zone NOT NULL,
@@ -18656,7 +18760,10 @@ CREATE TABLE namespace_limits (
additional_purchased_storage_size bigint DEFAULT 0 NOT NULL,
additional_purchased_storage_ends_on date,
namespace_id integer NOT NULL,
- temporary_storage_increase_ends_on date
+ temporary_storage_increase_ends_on date,
+ pre_enforcement_notification_at timestamp with time zone,
+ first_enforced_at timestamp with time zone,
+ last_enforced_at timestamp with time zone
);
CREATE TABLE namespace_package_settings (
@@ -18805,7 +18912,8 @@ CREATE TABLE namespaces (
push_rule_id bigint,
shared_runners_enabled boolean DEFAULT true NOT NULL,
allow_descendants_override_disabled_shared_runners boolean DEFAULT false NOT NULL,
- traversal_ids integer[] DEFAULT '{}'::integer[] NOT NULL
+ traversal_ids integer[] DEFAULT '{}'::integer[] NOT NULL,
+ organization_id bigint DEFAULT 1
);
CREATE SEQUENCE namespaces_id_seq
@@ -18889,7 +18997,6 @@ CREATE SEQUENCE note_metadata_note_id_seq
ALTER SEQUENCE note_metadata_note_id_seq OWNED BY note_metadata.note_id;
CREATE TABLE notes (
- id_convert_to_bigint integer DEFAULT 0 NOT NULL,
note text,
noteable_type character varying,
author_id integer,
@@ -19231,6 +19338,30 @@ CREATE SEQUENCE operations_user_lists_id_seq
ALTER SEQUENCE operations_user_lists_id_seq OWNED BY operations_user_lists.id;
+CREATE TABLE organization_settings (
+ organization_id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ settings jsonb DEFAULT '{}'::jsonb NOT NULL
+);
+
+CREATE TABLE organization_users (
+ id bigint NOT NULL,
+ organization_id bigint NOT NULL,
+ user_id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL
+);
+
+CREATE SEQUENCE organization_users_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE organization_users_id_seq OWNED BY organization_users.id;
+
CREATE TABLE organizations (
id bigint NOT NULL,
created_at timestamp with time zone NOT NULL,
@@ -20054,7 +20185,8 @@ CREATE TABLE personal_access_tokens (
token_digest character varying,
expire_notification_delivered boolean DEFAULT false NOT NULL,
last_used_at timestamp with time zone,
- after_expiry_notification_delivered boolean DEFAULT false NOT NULL
+ after_expiry_notification_delivered boolean DEFAULT false NOT NULL,
+ previous_personal_access_token_id bigint
);
CREATE SEQUENCE personal_access_tokens_id_seq
@@ -20199,7 +20331,7 @@ CREATE TABLE pm_advisories (
CONSTRAINT check_bed97fa77a CHECK ((char_length(cvss_v3) <= 128)),
CONSTRAINT check_e4bfd3ffbf CHECK ((char_length(title) <= 256)),
CONSTRAINT check_fee880f7aa CHECK ((char_length(description) <= 8192)),
- CONSTRAINT chk_rails_e73af9de76 CHECK ((cardinality(urls) <= 10))
+ CONSTRAINT chk_rails_e73af9de76 CHECK ((cardinality(urls) <= 20))
);
CREATE SEQUENCE pm_advisories_id_seq
@@ -20218,7 +20350,7 @@ CREATE TABLE pm_affected_packages (
updated_at timestamp with time zone NOT NULL,
purl_type smallint NOT NULL,
package_name text NOT NULL,
- distro_version text,
+ distro_version text DEFAULT ''::text NOT NULL,
solution text,
affected_range text NOT NULL,
fixed_versions text[] DEFAULT '{}'::text[],
@@ -22166,7 +22298,8 @@ CREATE TABLE saml_providers (
enforced_group_managed_accounts boolean DEFAULT false NOT NULL,
prohibited_outer_forks boolean DEFAULT true NOT NULL,
default_membership_role smallint DEFAULT 10 NOT NULL,
- git_check_enforced boolean DEFAULT false NOT NULL
+ git_check_enforced boolean DEFAULT false NOT NULL,
+ relay_state_domain_allowlist text[] DEFAULT '{}'::text[] NOT NULL
);
CREATE SEQUENCE saml_providers_id_seq
@@ -22274,23 +22407,6 @@ CREATE SEQUENCE sbom_sources_id_seq
ALTER SEQUENCE sbom_sources_id_seq OWNED BY sbom_sources.id;
-CREATE TABLE sbom_vulnerable_component_versions (
- id bigint NOT NULL,
- vulnerability_advisory_id bigint,
- sbom_component_version_id bigint,
- created_at timestamp with time zone NOT NULL,
- updated_at timestamp with time zone NOT NULL
-);
-
-CREATE SEQUENCE sbom_vulnerable_component_versions_id_seq
- START WITH 1
- INCREMENT BY 1
- NO MINVALUE
- NO MAXVALUE
- CACHE 1;
-
-ALTER SEQUENCE sbom_vulnerable_component_versions_id_seq OWNED BY sbom_vulnerable_component_versions.id;
-
CREATE TABLE scan_result_policies (
id bigint NOT NULL,
security_orchestration_policy_configuration_id bigint NOT NULL,
@@ -22303,6 +22419,8 @@ CREATE TABLE scan_result_policies (
age_value integer,
age_operator smallint,
age_interval smallint,
+ vulnerability_attributes jsonb DEFAULT '{}'::jsonb,
+ project_id bigint,
CONSTRAINT age_value_null_or_positive CHECK (((age_value IS NULL) OR (age_value >= 0)))
);
@@ -22571,9 +22689,6 @@ CREATE TABLE sent_notifications (
recipient_id integer,
commit_id character varying,
reply_key character varying NOT NULL,
- line_code character varying,
- note_type character varying,
- "position" text,
in_reply_to_discussion_id character varying,
id bigint NOT NULL
);
@@ -22602,6 +22717,25 @@ CREATE SEQUENCE sentry_issues_id_seq
ALTER SEQUENCE sentry_issues_id_seq OWNED BY sentry_issues.id;
+CREATE TABLE service_access_tokens (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ category smallint DEFAULT 0 NOT NULL,
+ encrypted_token bytea NOT NULL,
+ encrypted_token_iv bytea NOT NULL,
+ expires_at timestamp with time zone NOT NULL
+);
+
+CREATE SEQUENCE service_access_tokens_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE service_access_tokens_id_seq OWNED BY service_access_tokens.id;
+
CREATE TABLE service_desk_custom_email_credentials (
project_id bigint NOT NULL,
created_at timestamp with time zone NOT NULL,
@@ -23026,6 +23160,23 @@ CREATE SEQUENCE subscription_add_ons_id_seq
ALTER SEQUENCE subscription_add_ons_id_seq OWNED BY subscription_add_ons.id;
+CREATE TABLE subscription_user_add_on_assignments (
+ id bigint NOT NULL,
+ add_on_purchase_id bigint NOT NULL,
+ user_id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL
+);
+
+CREATE SEQUENCE subscription_user_add_on_assignments_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE subscription_user_add_on_assignments_id_seq OWNED BY subscription_user_add_on_assignments.id;
+
CREATE TABLE subscriptions (
id integer NOT NULL,
user_id integer,
@@ -23068,6 +23219,52 @@ CREATE SEQUENCE suggestions_id_seq
ALTER SEQUENCE suggestions_id_seq OWNED BY suggestions.id;
+CREATE TABLE system_access_microsoft_applications (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ namespace_id bigint,
+ enabled boolean DEFAULT false NOT NULL,
+ tenant_xid text NOT NULL,
+ client_xid text NOT NULL,
+ login_endpoint text DEFAULT 'https://login.microsoftonline.com'::text NOT NULL,
+ graph_endpoint text DEFAULT 'https://graph.microsoft.com'::text NOT NULL,
+ encrypted_client_secret bytea NOT NULL,
+ encrypted_client_secret_iv bytea NOT NULL,
+ CONSTRAINT check_042f6b21aa CHECK ((char_length(login_endpoint) <= 255)),
+ CONSTRAINT check_1e8b2d405f CHECK ((char_length(tenant_xid) <= 255)),
+ CONSTRAINT check_339c3ffca8 CHECK ((char_length(graph_endpoint) <= 255)),
+ CONSTRAINT check_ee72fb5459 CHECK ((char_length(client_xid) <= 255))
+);
+
+CREATE SEQUENCE system_access_microsoft_applications_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE system_access_microsoft_applications_id_seq OWNED BY system_access_microsoft_applications.id;
+
+CREATE TABLE system_access_microsoft_graph_access_tokens (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ system_access_microsoft_application_id bigint,
+ expires_in integer NOT NULL,
+ encrypted_token bytea NOT NULL,
+ encrypted_token_iv bytea NOT NULL
+);
+
+CREATE SEQUENCE system_access_microsoft_graph_access_tokens_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE system_access_microsoft_graph_access_tokens_id_seq OWNED BY system_access_microsoft_graph_access_tokens.id;
+
CREATE TABLE system_note_metadata (
id integer NOT NULL,
commit_count integer,
@@ -23325,27 +23522,6 @@ CREATE SEQUENCE trending_projects_id_seq
ALTER SEQUENCE trending_projects_id_seq OWNED BY trending_projects.id;
-CREATE TABLE u2f_registrations (
- id integer NOT NULL,
- certificate text,
- key_handle character varying,
- public_key character varying,
- counter integer,
- user_id integer,
- created_at timestamp without time zone NOT NULL,
- updated_at timestamp without time zone NOT NULL,
- name character varying
-);
-
-CREATE SEQUENCE u2f_registrations_id_seq
- START WITH 1
- INCREMENT BY 1
- NO MINVALUE
- NO MAXVALUE
- CACHE 1;
-
-ALTER SEQUENCE u2f_registrations_id_seq OWNED BY u2f_registrations.id;
-
CREATE TABLE upcoming_reconciliations (
id bigint NOT NULL,
namespace_id bigint,
@@ -23532,7 +23708,6 @@ CREATE TABLE user_details (
password_last_changed_at timestamp with time zone DEFAULT now() NOT NULL,
onboarding_step_url text,
discord text DEFAULT ''::text NOT NULL,
- provisioned_by_group_at timestamp with time zone,
enterprise_group_id bigint,
enterprise_group_associated_at timestamp with time zone,
CONSTRAINT check_245664af82 CHECK ((char_length(webauthn_xid) <= 100)),
@@ -23796,7 +23971,7 @@ CREATE TABLE users (
otp_backup_codes text,
public_email character varying,
dashboard integer DEFAULT 0,
- project_view integer DEFAULT 0,
+ project_view integer DEFAULT 2,
consumed_timestep integer,
layout integer DEFAULT 0,
hide_project_limit boolean DEFAULT false,
@@ -23832,6 +24007,7 @@ CREATE TABLE users (
static_object_token_encrypted text,
otp_secret_expires_at timestamp with time zone,
onboarding_in_progress boolean DEFAULT false NOT NULL,
+ CONSTRAINT check_0dd5948e38 CHECK ((user_type IS NOT NULL)),
CONSTRAINT check_7bde697e8e CHECK ((char_length(static_object_token_encrypted) <= 255))
);
@@ -23969,44 +24145,6 @@ CREATE SEQUENCE vulnerabilities_id_seq
ALTER SEQUENCE vulnerabilities_id_seq OWNED BY vulnerabilities.id;
-CREATE TABLE vulnerability_advisories (
- uuid uuid NOT NULL,
- created_at timestamp with time zone NOT NULL,
- updated_at timestamp with time zone NOT NULL,
- id bigint NOT NULL,
- created_date date NOT NULL,
- published_date date NOT NULL,
- description text,
- title text,
- component_name text,
- solution text,
- not_impacted text,
- cvss_v2 text,
- cvss_v3 text,
- affected_range text,
- identifiers text[] DEFAULT '{}'::text[],
- fixed_versions text[] DEFAULT '{}'::text[],
- urls text[] DEFAULT '{}'::text[],
- links text[] DEFAULT '{}'::text[],
- CONSTRAINT check_3ab0544d19 CHECK ((char_length(title) <= 2048)),
- CONSTRAINT check_3b57023409 CHECK ((char_length(affected_range) <= 32)),
- CONSTRAINT check_4d5cd7be9c CHECK ((char_length(component_name) <= 2048)),
- CONSTRAINT check_962f256a51 CHECK ((char_length(solution) <= 2048)),
- CONSTRAINT check_aae93955fb CHECK ((char_length(cvss_v3) <= 128)),
- CONSTRAINT check_b8a17497f3 CHECK ((char_length(cvss_v2) <= 128)),
- CONSTRAINT check_c05a35f418 CHECK ((char_length(not_impacted) <= 2048)),
- CONSTRAINT check_ff9f6483b6 CHECK ((char_length(description) <= 2048))
-);
-
-CREATE SEQUENCE vulnerability_advisories_id_seq
- START WITH 1
- INCREMENT BY 1
- NO MINVALUE
- NO MAXVALUE
- CACHE 1;
-
-ALTER SEQUENCE vulnerability_advisories_id_seq OWNED BY vulnerability_advisories.id;
-
CREATE TABLE vulnerability_exports (
id bigint NOT NULL,
created_at timestamp with time zone NOT NULL,
@@ -24310,7 +24448,6 @@ CREATE TABLE vulnerability_occurrences (
vulnerability_id bigint,
details jsonb DEFAULT '{}'::jsonb NOT NULL,
description text,
- message text,
solution text,
cve text,
location jsonb,
@@ -24318,7 +24455,6 @@ CREATE TABLE vulnerability_occurrences (
uuid_convert_string_to_uuid uuid DEFAULT '00000000-0000-0000-0000-000000000000'::uuid NOT NULL,
CONSTRAINT check_4a3a60f2ba CHECK ((char_length(solution) <= 7000)),
CONSTRAINT check_ade261da6b CHECK ((char_length(description) <= 15000)),
- CONSTRAINT check_df6dd20219 CHECK ((char_length(message) <= 3000)),
CONSTRAINT check_f602da68dd CHECK ((char_length(cve) <= 48400))
);
@@ -24513,7 +24649,8 @@ CREATE TABLE web_hooks (
encrypted_url_variables bytea,
encrypted_url_variables_iv bytea,
integration_id integer,
- branch_filter_strategy smallint DEFAULT 0 NOT NULL
+ branch_filter_strategy smallint DEFAULT 0 NOT NULL,
+ emoji_events boolean DEFAULT false NOT NULL
);
CREATE SEQUENCE web_hooks_id_seq
@@ -25335,6 +25472,8 @@ ALTER TABLE ONLY group_import_states ALTER COLUMN group_id SET DEFAULT nextval('
ALTER TABLE ONLY group_repository_storage_moves ALTER COLUMN id SET DEFAULT nextval('group_repository_storage_moves_id_seq'::regclass);
+ALTER TABLE ONLY group_wiki_repository_states ALTER COLUMN id SET DEFAULT nextval('group_wiki_repository_states_id_seq'::regclass);
+
ALTER TABLE ONLY historical_data ALTER COLUMN id SET DEFAULT nextval('historical_data_id_seq'::regclass);
ALTER TABLE ONLY identities ALTER COLUMN id SET DEFAULT nextval('identities_id_seq'::regclass);
@@ -25471,6 +25610,8 @@ ALTER TABLE ONLY merge_request_metrics ALTER COLUMN id SET DEFAULT nextval('merg
ALTER TABLE ONLY merge_request_predictions ALTER COLUMN merge_request_id SET DEFAULT nextval('merge_request_predictions_merge_request_id_seq'::regclass);
+ALTER TABLE ONLY merge_request_review_llm_summaries ALTER COLUMN id SET DEFAULT nextval('merge_request_review_llm_summaries_id_seq'::regclass);
+
ALTER TABLE ONLY merge_request_reviewers ALTER COLUMN id SET DEFAULT nextval('merge_request_reviewers_id_seq'::regclass);
ALTER TABLE ONLY merge_request_user_mentions ALTER COLUMN id SET DEFAULT nextval('merge_request_user_mentions_id_seq'::regclass);
@@ -25501,6 +25642,10 @@ ALTER TABLE ONLY ml_experiment_metadata ALTER COLUMN id SET DEFAULT nextval('ml_
ALTER TABLE ONLY ml_experiments ALTER COLUMN id SET DEFAULT nextval('ml_experiments_id_seq'::regclass);
+ALTER TABLE ONLY ml_model_versions ALTER COLUMN id SET DEFAULT nextval('ml_model_versions_id_seq'::regclass);
+
+ALTER TABLE ONLY ml_models ALTER COLUMN id SET DEFAULT nextval('ml_models_id_seq'::regclass);
+
ALTER TABLE ONLY namespace_admin_notes ALTER COLUMN id SET DEFAULT nextval('namespace_admin_notes_id_seq'::regclass);
ALTER TABLE ONLY namespace_bans ALTER COLUMN id SET DEFAULT nextval('namespace_bans_id_seq'::regclass);
@@ -25549,6 +25694,8 @@ ALTER TABLE ONLY operations_strategies_user_lists ALTER COLUMN id SET DEFAULT ne
ALTER TABLE ONLY operations_user_lists ALTER COLUMN id SET DEFAULT nextval('operations_user_lists_id_seq'::regclass);
+ALTER TABLE ONLY organization_users ALTER COLUMN id SET DEFAULT nextval('organization_users_id_seq'::regclass);
+
ALTER TABLE ONLY organizations ALTER COLUMN id SET DEFAULT nextval('organizations_id_seq'::regclass);
ALTER TABLE ONLY p_ci_builds ALTER COLUMN id SET DEFAULT nextval('ci_builds_id_seq'::regclass);
@@ -25783,8 +25930,6 @@ ALTER TABLE ONLY sbom_occurrences ALTER COLUMN id SET DEFAULT nextval('sbom_occu
ALTER TABLE ONLY sbom_sources ALTER COLUMN id SET DEFAULT nextval('sbom_sources_id_seq'::regclass);
-ALTER TABLE ONLY sbom_vulnerable_component_versions ALTER COLUMN id SET DEFAULT nextval('sbom_vulnerable_component_versions_id_seq'::regclass);
-
ALTER TABLE ONLY scan_result_policies ALTER COLUMN id SET DEFAULT nextval('scan_result_policies_id_seq'::regclass);
ALTER TABLE ONLY schema_inconsistencies ALTER COLUMN id SET DEFAULT nextval('schema_inconsistencies_id_seq'::regclass);
@@ -25815,6 +25960,8 @@ ALTER TABLE ONLY sent_notifications ALTER COLUMN id SET DEFAULT nextval('sent_no
ALTER TABLE ONLY sentry_issues ALTER COLUMN id SET DEFAULT nextval('sentry_issues_id_seq'::regclass);
+ALTER TABLE ONLY service_access_tokens ALTER COLUMN id SET DEFAULT nextval('service_access_tokens_id_seq'::regclass);
+
ALTER TABLE ONLY shards ALTER COLUMN id SET DEFAULT nextval('shards_id_seq'::regclass);
ALTER TABLE ONLY slack_api_scopes ALTER COLUMN id SET DEFAULT nextval('slack_api_scopes_id_seq'::regclass);
@@ -25851,10 +25998,16 @@ ALTER TABLE ONLY subscription_add_on_purchases ALTER COLUMN id SET DEFAULT nextv
ALTER TABLE ONLY subscription_add_ons ALTER COLUMN id SET DEFAULT nextval('subscription_add_ons_id_seq'::regclass);
+ALTER TABLE ONLY subscription_user_add_on_assignments ALTER COLUMN id SET DEFAULT nextval('subscription_user_add_on_assignments_id_seq'::regclass);
+
ALTER TABLE ONLY subscriptions ALTER COLUMN id SET DEFAULT nextval('subscriptions_id_seq'::regclass);
ALTER TABLE ONLY suggestions ALTER COLUMN id SET DEFAULT nextval('suggestions_id_seq'::regclass);
+ALTER TABLE ONLY system_access_microsoft_applications ALTER COLUMN id SET DEFAULT nextval('system_access_microsoft_applications_id_seq'::regclass);
+
+ALTER TABLE ONLY system_access_microsoft_graph_access_tokens ALTER COLUMN id SET DEFAULT nextval('system_access_microsoft_graph_access_tokens_id_seq'::regclass);
+
ALTER TABLE ONLY system_note_metadata ALTER COLUMN id SET DEFAULT nextval('system_note_metadata_id_seq'::regclass);
ALTER TABLE ONLY taggings ALTER COLUMN id SET DEFAULT nextval('taggings_id_seq'::regclass);
@@ -25879,8 +26032,6 @@ ALTER TABLE ONLY topics ALTER COLUMN id SET DEFAULT nextval('topics_id_seq'::reg
ALTER TABLE ONLY trending_projects ALTER COLUMN id SET DEFAULT nextval('trending_projects_id_seq'::regclass);
-ALTER TABLE ONLY u2f_registrations ALTER COLUMN id SET DEFAULT nextval('u2f_registrations_id_seq'::regclass);
-
ALTER TABLE ONLY upcoming_reconciliations ALTER COLUMN id SET DEFAULT nextval('upcoming_reconciliations_id_seq'::regclass);
ALTER TABLE ONLY upload_states ALTER COLUMN upload_id SET DEFAULT nextval('upload_states_upload_id_seq'::regclass);
@@ -25925,8 +26076,6 @@ ALTER TABLE ONLY value_stream_dashboard_counts ALTER COLUMN id SET DEFAULT nextv
ALTER TABLE ONLY vulnerabilities ALTER COLUMN id SET DEFAULT nextval('vulnerabilities_id_seq'::regclass);
-ALTER TABLE ONLY vulnerability_advisories ALTER COLUMN id SET DEFAULT nextval('vulnerability_advisories_id_seq'::regclass);
-
ALTER TABLE ONLY vulnerability_exports ALTER COLUMN id SET DEFAULT nextval('vulnerability_exports_id_seq'::regclass);
ALTER TABLE ONLY vulnerability_external_issue_links ALTER COLUMN id SET DEFAULT nextval('vulnerability_external_issue_links_id_seq'::regclass);
@@ -26848,9 +26997,6 @@ ALTER TABLE ONLY chat_names
ALTER TABLE ONLY chat_teams
ADD CONSTRAINT chat_teams_pkey PRIMARY KEY (id);
-ALTER TABLE users
- ADD CONSTRAINT check_0dd5948e38 CHECK ((user_type IS NOT NULL)) NOT VALID;
-
ALTER TABLE vulnerability_scanners
ADD CONSTRAINT check_37608c9db5 CHECK ((char_length(vendor) <= 255)) NOT VALID;
@@ -27436,6 +27582,9 @@ ALTER TABLE ONLY group_repository_storage_moves
ALTER TABLE ONLY group_wiki_repositories
ADD CONSTRAINT group_wiki_repositories_pkey PRIMARY KEY (group_id);
+ALTER TABLE ONLY group_wiki_repository_states
+ ADD CONSTRAINT group_wiki_repository_states_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY historical_data
ADD CONSTRAINT historical_data_pkey PRIMARY KEY (id);
@@ -27664,6 +27813,9 @@ ALTER TABLE ONLY merge_request_metrics
ALTER TABLE ONLY merge_request_predictions
ADD CONSTRAINT merge_request_predictions_pkey PRIMARY KEY (merge_request_id);
+ALTER TABLE ONLY merge_request_review_llm_summaries
+ ADD CONSTRAINT merge_request_review_llm_summaries_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY merge_request_reviewers
ADD CONSTRAINT merge_request_reviewers_pkey PRIMARY KEY (id);
@@ -27712,6 +27864,12 @@ ALTER TABLE ONLY ml_experiment_metadata
ALTER TABLE ONLY ml_experiments
ADD CONSTRAINT ml_experiments_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY ml_model_versions
+ ADD CONSTRAINT ml_model_versions_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY ml_models
+ ADD CONSTRAINT ml_models_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY namespace_admin_notes
ADD CONSTRAINT namespace_admin_notes_pkey PRIMARY KEY (id);
@@ -27808,6 +27966,12 @@ ALTER TABLE ONLY operations_strategies_user_lists
ALTER TABLE ONLY operations_user_lists
ADD CONSTRAINT operations_user_lists_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY organization_settings
+ ADD CONSTRAINT organization_settings_pkey PRIMARY KEY (organization_id);
+
+ALTER TABLE ONLY organization_users
+ ADD CONSTRAINT organization_users_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY organizations
ADD CONSTRAINT organizations_pkey PRIMARY KEY (id);
@@ -28216,9 +28380,6 @@ ALTER TABLE ONLY sbom_occurrences
ALTER TABLE ONLY sbom_sources
ADD CONSTRAINT sbom_sources_pkey PRIMARY KEY (id);
-ALTER TABLE ONLY sbom_vulnerable_component_versions
- ADD CONSTRAINT sbom_vulnerable_component_versions_pkey PRIMARY KEY (id);
-
ALTER TABLE ONLY scan_result_policies
ADD CONSTRAINT scan_result_policies_pkey PRIMARY KEY (id);
@@ -28270,6 +28431,9 @@ ALTER TABLE ONLY sentry_issues
ALTER TABLE ONLY sprints
ADD CONSTRAINT sequence_is_unique_per_iterations_cadence_id UNIQUE (iterations_cadence_id, sequence) DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE ONLY service_access_tokens
+ ADD CONSTRAINT service_access_tokens_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY service_desk_custom_email_credentials
ADD CONSTRAINT service_desk_custom_email_credentials_pkey PRIMARY KEY (project_id);
@@ -28339,12 +28503,21 @@ ALTER TABLE ONLY subscription_add_on_purchases
ALTER TABLE ONLY subscription_add_ons
ADD CONSTRAINT subscription_add_ons_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY subscription_user_add_on_assignments
+ ADD CONSTRAINT subscription_user_add_on_assignments_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY subscriptions
ADD CONSTRAINT subscriptions_pkey PRIMARY KEY (id);
ALTER TABLE ONLY suggestions
ADD CONSTRAINT suggestions_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY system_access_microsoft_applications
+ ADD CONSTRAINT system_access_microsoft_applications_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY system_access_microsoft_graph_access_tokens
+ ADD CONSTRAINT system_access_microsoft_graph_access_tokens_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY system_note_metadata
ADD CONSTRAINT system_note_metadata_pkey PRIMARY KEY (id);
@@ -28381,9 +28554,6 @@ ALTER TABLE ONLY topics
ALTER TABLE ONLY trending_projects
ADD CONSTRAINT trending_projects_pkey PRIMARY KEY (id);
-ALTER TABLE ONLY u2f_registrations
- ADD CONSTRAINT u2f_registrations_pkey PRIMARY KEY (id);
-
ALTER TABLE ONLY upcoming_reconciliations
ADD CONSTRAINT upcoming_reconciliations_pkey PRIMARY KEY (id);
@@ -28474,9 +28644,6 @@ ALTER TABLE ONLY verification_codes
ALTER TABLE ONLY vulnerabilities
ADD CONSTRAINT vulnerabilities_pkey PRIMARY KEY (id);
-ALTER TABLE ONLY vulnerability_advisories
- ADD CONSTRAINT vulnerability_advisories_pkey PRIMARY KEY (id);
-
ALTER TABLE ONLY vulnerability_exports
ADD CONSTRAINT vulnerability_exports_pkey PRIMARY KEY (id);
@@ -29767,14 +29934,6 @@ CREATE INDEX idx_container_exp_policies_on_project_id_next_run_at_enabled ON con
CREATE INDEX idx_container_repos_on_exp_cleanup_status_project_id_start_date ON container_repositories USING btree (expiration_policy_cleanup_status, project_id, expiration_policy_started_at);
-CREATE INDEX idx_container_repos_on_import_started_at_when_importing ON container_repositories USING btree (migration_import_started_at) WHERE (migration_state = 'importing'::text);
-
-CREATE INDEX idx_container_repos_on_migration_state_migration_plan_created ON container_repositories USING btree (migration_state, migration_plan, created_at);
-
-CREATE INDEX idx_container_repos_on_pre_import_done_at_when_pre_import_done ON container_repositories USING btree (migration_pre_import_done_at) WHERE (migration_state = 'pre_import_done'::text);
-
-CREATE INDEX idx_container_repos_on_pre_import_started_at_when_pre_importing ON container_repositories USING btree (migration_pre_import_started_at) WHERE (migration_state = 'pre_importing'::text);
-
CREATE INDEX idx_deployment_clusters_on_cluster_id_and_kubernetes_namespace ON deployment_clusters USING btree (cluster_id, kubernetes_namespace);
CREATE INDEX idx_devops_adoption_segments_namespace_end_time ON analytics_devops_adoption_snapshots USING btree (namespace_id, end_time);
@@ -29869,8 +30028,12 @@ CREATE UNIQUE INDEX idx_packages_on_project_id_name_version_unique_when_golang O
CREATE UNIQUE INDEX idx_packages_on_project_id_name_version_unique_when_helm ON packages_packages USING btree (project_id, name, version) WHERE ((package_type = 11) AND (status <> 4));
+CREATE UNIQUE INDEX idx_packages_on_project_id_name_version_unique_when_npm ON packages_packages USING btree (project_id, name, version) WHERE ((package_type = 2) AND (status <> 4));
+
CREATE INDEX idx_packages_packages_on_project_id_name_version_package_type ON packages_packages USING btree (project_id, name, version, package_type);
+CREATE INDEX idx_personal_access_tokens_on_previous_personal_access_token_id ON personal_access_tokens USING btree (previous_personal_access_token_id);
+
CREATE INDEX idx_pkgs_debian_group_distribution_keys_on_distribution_id ON packages_debian_group_distribution_keys USING btree (distribution_id);
CREATE INDEX idx_pkgs_debian_project_distribution_keys_on_distribution_id ON packages_debian_project_distribution_keys USING btree (distribution_id);
@@ -30657,6 +30820,8 @@ CREATE INDEX index_ci_triggers_on_owner_id ON ci_triggers USING btree (owner_id)
CREATE INDEX index_ci_triggers_on_project_id ON ci_triggers USING btree (project_id);
+CREATE UNIQUE INDEX index_ci_triggers_on_token ON ci_triggers USING btree (token);
+
CREATE INDEX index_ci_unit_test_failures_on_build_id ON ci_unit_test_failures USING btree (build_id);
CREATE INDEX index_ci_unit_test_failures_on_partition_id_build_id ON ci_unit_test_failures USING btree (partition_id, build_id);
@@ -30729,10 +30894,6 @@ CREATE INDEX index_container_expiration_policies_on_next_run_at_and_enabled ON c
CREATE INDEX index_container_registry_data_repair_details_on_status ON container_registry_data_repair_details USING btree (status);
-CREATE INDEX index_container_repositories_on_greatest_completed_at ON container_repositories USING btree (GREATEST(migration_pre_import_done_at, migration_import_done_at, migration_aborted_at, migration_skipped_at)) WHERE (migration_state = ANY (ARRAY['import_done'::text, 'pre_import_done'::text, 'import_aborted'::text, 'import_skipped'::text]));
-
-CREATE INDEX index_container_repositories_on_migration_state_import_done_at ON container_repositories USING btree (migration_state, migration_import_done_at);
-
CREATE INDEX index_container_repositories_on_project_id_and_id ON container_repositories USING btree (project_id, id);
CREATE UNIQUE INDEX index_container_repositories_on_project_id_and_name ON container_repositories USING btree (project_id, name);
@@ -31109,8 +31270,6 @@ CREATE INDEX index_events_on_project_id_and_created_at ON events USING btree (pr
CREATE INDEX index_events_on_project_id_and_id ON events USING btree (project_id, id);
-CREATE INDEX index_events_on_project_id_and_id_desc_on_merged_action ON events USING btree (project_id, id DESC) WHERE (action = 7);
-
CREATE UNIQUE INDEX index_events_on_target_type_and_target_id_and_fingerprint ON events USING btree (target_type, target_id, fingerprint);
CREATE INDEX index_evidences_on_release_id ON evidences USING btree (release_id);
@@ -31289,13 +31448,23 @@ CREATE UNIQUE INDEX index_group_wiki_repositories_on_disk_path ON group_wiki_rep
CREATE INDEX index_group_wiki_repositories_on_shard_id ON group_wiki_repositories USING btree (shard_id);
+CREATE INDEX index_group_wiki_repository_states_failed_verification ON group_wiki_repository_states USING btree (verification_retry_at NULLS FIRST) WHERE (verification_state = 3);
+
+CREATE INDEX index_group_wiki_repository_states_needs_verification ON group_wiki_repository_states USING btree (verification_state) WHERE ((verification_state = 0) OR (verification_state = 3));
+
+CREATE UNIQUE INDEX index_group_wiki_repository_states_on_group_wiki_repository_id ON group_wiki_repository_states USING btree (group_wiki_repository_id);
+
+CREATE INDEX index_group_wiki_repository_states_on_verification_state ON group_wiki_repository_states USING btree (verification_state);
+
+CREATE INDEX index_group_wiki_repository_states_pending_verification ON group_wiki_repository_states USING btree (verified_at NULLS FIRST) WHERE (verification_state = 0);
+
CREATE INDEX index_groups_on_parent_id_id ON namespaces USING btree (parent_id, id) WHERE ((type)::text = 'Group'::text);
CREATE INDEX index_groups_on_path_and_id ON namespaces USING btree (path, id) WHERE ((type)::text = 'Group'::text);
CREATE INDEX index_historical_data_on_recorded_at ON historical_data USING btree (recorded_at);
-CREATE UNIQUE INDEX index_http_integrations_on_active_and_project_and_endpoint ON alert_management_http_integrations USING btree (active, project_id, endpoint_identifier) WHERE active;
+CREATE UNIQUE INDEX index_http_integrations_on_project_and_endpoint ON alert_management_http_integrations USING btree (project_id, endpoint_identifier);
CREATE INDEX index_identities_on_saml_provider_id ON identities USING btree (saml_provider_id) WHERE (saml_provider_id IS NOT NULL);
@@ -31467,6 +31636,10 @@ CREATE INDEX index_issues_on_moved_to_id ON issues USING btree (moved_to_id) WHE
CREATE INDEX index_issues_on_namespace_id ON issues USING btree (namespace_id);
+CREATE INDEX index_issues_on_project_health_status_asc_work_item_type ON issues USING btree (project_id, health_status, id DESC, state_id, work_item_type_id);
+
+CREATE INDEX index_issues_on_project_health_status_desc_work_item_type ON issues USING btree (project_id, health_status DESC NULLS LAST, id DESC, state_id, work_item_type_id);
+
CREATE INDEX index_issues_on_project_id_and_created_at_issue_type_incident ON issues USING btree (project_id, created_at) WHERE (issue_type = 1);
CREATE UNIQUE INDEX index_issues_on_project_id_and_external_key ON issues USING btree (project_id, external_key) WHERE (external_key IS NOT NULL);
@@ -31701,6 +31874,12 @@ CREATE INDEX index_merge_request_metrics_on_pipeline_id ON merge_request_metrics
CREATE INDEX index_merge_request_metrics_on_target_project_id ON merge_request_metrics USING btree (target_project_id);
+CREATE INDEX index_merge_request_review_llm_summaries_on_mr_diff_id ON merge_request_review_llm_summaries USING btree (merge_request_diff_id);
+
+CREATE INDEX index_merge_request_review_llm_summaries_on_review_id ON merge_request_review_llm_summaries USING btree (review_id);
+
+CREATE INDEX index_merge_request_review_llm_summaries_on_user_id ON merge_request_review_llm_summaries USING btree (user_id);
+
CREATE UNIQUE INDEX index_merge_request_reviewers_on_merge_request_id_and_user_id ON merge_request_reviewers USING btree (merge_request_id, user_id);
CREATE INDEX index_merge_request_reviewers_on_user_id ON merge_request_reviewers USING btree (user_id);
@@ -31823,12 +32002,26 @@ CREATE INDEX index_ml_candidates_on_user_id ON ml_candidates USING btree (user_i
CREATE UNIQUE INDEX index_ml_experiment_metadata_on_experiment_id_and_name ON ml_experiment_metadata USING btree (experiment_id, name);
+CREATE INDEX index_ml_experiments_on_model_id ON ml_experiments USING btree (model_id);
+
CREATE UNIQUE INDEX index_ml_experiments_on_project_id_and_iid ON ml_experiments USING btree (project_id, iid);
CREATE UNIQUE INDEX index_ml_experiments_on_project_id_and_name ON ml_experiments USING btree (project_id, name);
CREATE INDEX index_ml_experiments_on_user_id ON ml_experiments USING btree (user_id);
+CREATE INDEX index_ml_model_versions_on_model_id ON ml_model_versions USING btree (model_id);
+
+CREATE INDEX index_ml_model_versions_on_package_id ON ml_model_versions USING btree (package_id);
+
+CREATE INDEX index_ml_model_versions_on_project_id ON ml_model_versions USING btree (project_id);
+
+CREATE UNIQUE INDEX index_ml_model_versions_on_project_id_and_model_id_and_version ON ml_model_versions USING btree (project_id, model_id, version);
+
+CREATE INDEX index_ml_models_on_project_id ON ml_models USING btree (project_id);
+
+CREATE UNIQUE INDEX index_ml_models_on_project_id_and_name ON ml_models USING btree (project_id, name);
+
CREATE UNIQUE INDEX index_mr_blocks_on_blocking_and_blocked_mr_ids ON merge_request_blocks USING btree (blocking_merge_request_id, blocked_merge_request_id);
CREATE INDEX index_mr_cleanup_schedules_timestamps_status ON merge_request_cleanup_schedules USING btree (scheduled_at) WHERE ((completed_at IS NULL) AND (status = 0));
@@ -31871,6 +32064,8 @@ CREATE INDEX index_namespaces_on_ldap_sync_last_update_at ON namespaces USING bt
CREATE INDEX index_namespaces_on_name_trigram ON namespaces USING gin (name gin_trgm_ops);
+CREATE INDEX index_namespaces_on_organization_id ON namespaces USING btree (organization_id);
+
CREATE INDEX index_namespaces_on_owner_id ON namespaces USING btree (owner_id);
CREATE UNIQUE INDEX index_namespaces_on_parent_id_and_id ON namespaces USING btree (parent_id, id);
@@ -32061,6 +32256,10 @@ CREATE UNIQUE INDEX index_ops_feature_flags_issues_on_feature_flag_id_and_issue_
CREATE UNIQUE INDEX index_ops_strategies_user_lists_on_strategy_id_and_user_list_id ON operations_strategies_user_lists USING btree (strategy_id, user_list_id);
+CREATE UNIQUE INDEX index_organization_users_on_organization_id_and_user_id ON organization_users USING btree (organization_id, user_id);
+
+CREATE INDEX index_organization_users_on_user_id ON organization_users USING btree (user_id);
+
CREATE UNIQUE INDEX index_organizations_on_unique_name_per_group ON customer_relations_organizations USING btree (group_id, lower(name), id);
CREATE UNIQUE INDEX index_p_ci_job_annotations_on_partition_id_job_id_name ON ONLY p_ci_job_annotations USING btree (partition_id, job_id, name);
@@ -32245,8 +32444,6 @@ CREATE INDEX index_pm_package_version_licenses_on_pm_package_version_id ON pm_pa
CREATE INDEX index_pm_package_versions_on_pm_package_id ON pm_package_versions USING btree (pm_package_id);
-CREATE UNIQUE INDEX index_pool_repositories_on_disk_path ON pool_repositories USING btree (disk_path);
-
CREATE INDEX index_pool_repositories_on_shard_id ON pool_repositories USING btree (shard_id);
CREATE UNIQUE INDEX index_pool_repositories_on_source_project_id_and_shard_id ON pool_repositories USING btree (source_project_id, shard_id);
@@ -32393,6 +32590,8 @@ CREATE INDEX index_project_topics_on_topic_id ON project_topics USING btree (top
CREATE UNIQUE INDEX index_project_user_callouts_feature ON user_project_callouts USING btree (user_id, feature_name, project_id);
+CREATE INDEX index_project_vulnerability_reads_common_finder_query_desc ON vulnerability_reads USING btree (project_id, state, report_type, severity DESC, vulnerability_id DESC);
+
CREATE UNIQUE INDEX index_project_wiki_repositories_on_project_id ON project_wiki_repositories USING btree (project_id);
CREATE INDEX index_projects_aimed_for_deletion ON projects USING btree (marked_for_deletion_at) WHERE ((marked_for_deletion_at IS NOT NULL) AND (pending_delete = false));
@@ -32721,6 +32920,8 @@ CREATE UNIQUE INDEX index_sbom_sources_on_source_type_and_source ON sbom_sources
CREATE INDEX index_scan_result_policies_on_policy_configuration_id ON scan_result_policies USING btree (security_orchestration_policy_configuration_id);
+CREATE INDEX index_scan_result_policies_on_project_id ON scan_result_policies USING btree (project_id);
+
CREATE INDEX index_schema_inconsistencies_on_issue_id ON schema_inconsistencies USING btree (issue_id);
CREATE INDEX index_scim_identities_on_group_id ON scim_identities USING btree (group_id);
@@ -32903,6 +33104,8 @@ CREATE INDEX index_subscription_add_on_purchases_on_subscription_add_on_id ON su
CREATE UNIQUE INDEX index_subscription_add_ons_on_name ON subscription_add_ons USING btree (name);
+CREATE INDEX index_subscription_user_add_on_assignments_on_user_id ON subscription_user_add_on_assignments USING btree (user_id);
+
CREATE INDEX index_subscriptions_on_project_id ON subscriptions USING btree (project_id);
CREATE UNIQUE INDEX index_subscriptions_on_subscribable_and_user_id_and_project_id ON subscriptions USING btree (subscribable_id, subscribable_type, user_id, project_id);
@@ -32913,6 +33116,8 @@ CREATE INDEX index_successful_deployments_on_cluster_id_and_environment_id ON de
CREATE UNIQUE INDEX index_suggestions_on_note_id_and_relative_order ON suggestions USING btree (note_id, relative_order);
+CREATE UNIQUE INDEX index_system_access_microsoft_applications_on_namespace_id ON system_access_microsoft_applications USING btree (namespace_id);
+
CREATE UNIQUE INDEX index_system_note_metadata_on_description_version_id ON system_note_metadata USING btree (description_version_id) WHERE (description_version_id IS NOT NULL);
CREATE UNIQUE INDEX index_system_note_metadata_on_note_id ON system_note_metadata USING btree (note_id);
@@ -32999,10 +33204,6 @@ CREATE INDEX index_topics_total_projects_count ON topics USING btree (total_proj
CREATE UNIQUE INDEX index_trending_projects_on_project_id ON trending_projects USING btree (project_id);
-CREATE INDEX index_u2f_registrations_on_key_handle ON u2f_registrations USING btree (key_handle);
-
-CREATE INDEX index_u2f_registrations_on_user_id ON u2f_registrations USING btree (user_id);
-
CREATE UNIQUE INDEX index_uniq_ci_runners_on_token ON ci_runners USING btree (token);
CREATE UNIQUE INDEX index_uniq_ci_runners_on_token_encrypted ON ci_runners USING btree (token_encrypted);
@@ -33147,7 +33348,7 @@ CREATE INDEX index_users_on_state_and_user_type ON users USING btree (state, use
CREATE UNIQUE INDEX index_users_on_static_object_token ON users USING btree (static_object_token);
-CREATE INDEX index_users_on_unconfirmed_and_created_at_for_active_humans ON users USING btree (created_at, id) WHERE ((confirmed_at IS NULL) AND ((state)::text = 'active'::text) AND (user_type = 0));
+CREATE INDEX index_users_on_unconfirmed_created_at_active_type_sign_in_count ON users USING btree (created_at, id) WHERE ((confirmed_at IS NULL) AND ((state)::text = 'active'::text) AND (user_type = 0) AND (sign_in_count = 0));
CREATE INDEX index_users_on_unconfirmed_email ON users USING btree (unconfirmed_email) WHERE (unconfirmed_email IS NOT NULL);
@@ -33195,6 +33396,8 @@ CREATE INDEX index_vulnerabilities_on_author_id ON vulnerabilities USING btree (
CREATE INDEX index_vulnerabilities_on_confirmed_by_id ON vulnerabilities USING btree (confirmed_by_id);
+CREATE INDEX index_vulnerabilities_on_detected_at_and_id ON vulnerabilities USING btree (id, detected_at);
+
CREATE INDEX index_vulnerabilities_on_dismissed_by_id ON vulnerabilities USING btree (dismissed_by_id);
CREATE INDEX index_vulnerabilities_on_due_date_sourcing_milestone_id ON vulnerabilities USING btree (due_date_sourcing_milestone_id);
@@ -33315,6 +33518,8 @@ CREATE INDEX index_vulnerability_reads_on_scanner_id ON vulnerability_reads USIN
CREATE UNIQUE INDEX index_vulnerability_reads_on_uuid ON vulnerability_reads USING btree (uuid);
+CREATE INDEX index_vulnerability_reads_on_uuid_project_id_and_state ON vulnerability_reads USING btree (uuid, project_id, state);
+
CREATE UNIQUE INDEX index_vulnerability_reads_on_vulnerability_id ON vulnerability_reads USING btree (vulnerability_id);
CREATE UNIQUE INDEX index_vulnerability_remediations_on_project_id_and_checksum ON vulnerability_remediations USING btree (project_id, checksum);
@@ -33335,10 +33540,6 @@ CREATE UNIQUE INDEX index_vulnerability_statistics_on_unique_project_id ON vulne
CREATE UNIQUE INDEX index_vulnerability_user_mentions_on_note_id ON vulnerability_user_mentions USING btree (note_id) WHERE (note_id IS NOT NULL);
-CREATE INDEX index_vulnerable_component_versions_on_sbom_component_version ON sbom_vulnerable_component_versions USING btree (sbom_component_version_id);
-
-CREATE INDEX index_vulnerable_component_versions_on_vulnerability_advisory ON sbom_vulnerable_component_versions USING btree (vulnerability_advisory_id);
-
CREATE UNIQUE INDEX index_vulns_user_mentions_on_vulnerability_id ON vulnerability_user_mentions USING btree (vulnerability_id) WHERE (note_id IS NULL);
CREATE UNIQUE INDEX index_vulns_user_mentions_on_vulnerability_id_and_note_id ON vulnerability_user_mentions USING btree (vulnerability_id, note_id);
@@ -33521,28 +33722,22 @@ CREATE INDEX tmp_idx_for_vulnerability_feedback_migration ON vulnerability_feedb
CREATE INDEX tmp_idx_packages_on_project_id_when_npm_not_pending_destruction ON packages_packages USING btree (project_id) WHERE ((package_type = 2) AND (status <> 4));
+CREATE INDEX tmp_idx_vuln_reads_where_dismissal_reason_null ON vulnerability_reads USING btree (id) WHERE ((state = 2) AND (dismissal_reason IS NULL));
+
CREATE INDEX tmp_idx_vulnerability_occurrences_on_id_where_report_type_7_99 ON vulnerability_occurrences USING btree (id) WHERE (report_type = ANY (ARRAY[7, 99]));
-CREATE INDEX tmp_index_ci_job_artifacts_on_expire_at_where_locked_unknown ON ci_job_artifacts USING btree (expire_at, job_id) WHERE ((locked = 2) AND (expire_at IS NOT NULL));
+CREATE INDEX tmp_idx_vulns_on_converted_uuid ON vulnerability_occurrences USING btree (id, uuid_convert_string_to_uuid) WHERE (uuid_convert_string_to_uuid = '00000000-0000-0000-0000-000000000000'::uuid);
-CREATE INDEX tmp_index_ci_job_artifacts_on_id_expire_at_file_type_trace ON ci_job_artifacts USING btree (id) WHERE (((date_part('day'::text, timezone('UTC'::text, expire_at)) = ANY (ARRAY[(21)::double precision, (22)::double precision, (23)::double precision])) AND (date_part('minute'::text, timezone('UTC'::text, expire_at)) = ANY (ARRAY[(0)::double precision, (30)::double precision, (45)::double precision])) AND (date_part('second'::text, timezone('UTC'::text, expire_at)) = (0)::double precision)) OR (file_type = 3));
+CREATE INDEX tmp_index_ci_job_artifacts_on_expire_at_where_locked_unknown ON ci_job_artifacts USING btree (expire_at, job_id) WHERE ((locked = 2) AND (expire_at IS NOT NULL));
CREATE INDEX tmp_index_cis_vulnerability_reads_on_id ON vulnerability_reads USING btree (id) WHERE (report_type = 7);
-CREATE INDEX tmp_index_container_repos_on_non_migrated ON container_repositories USING btree (project_id, id) WHERE (migration_state <> 'import_done'::text);
-
-CREATE INDEX tmp_index_container_repositories_on_id_migration_state ON container_repositories USING btree (id, migration_state);
-
-CREATE INDEX tmp_index_for_backfilling_resource_link_events ON system_note_metadata USING btree (id) WHERE (((action)::text = 'relate_to_parent'::text) OR ((action)::text = 'unrelate_from_parent'::text));
-
CREATE INDEX tmp_index_for_null_member_namespace_id ON members USING btree (member_namespace_id) WHERE (member_namespace_id IS NULL);
CREATE INDEX tmp_index_for_project_namespace_id_migration_on_routes ON routes USING btree (id) WHERE ((namespace_id IS NULL) AND ((source_type)::text = 'Project'::text));
CREATE INDEX tmp_index_members_on_state ON members USING btree (state) WHERE (state = 2);
-CREATE INDEX tmp_index_migrated_container_registries ON container_repositories USING btree (project_id) WHERE ((migration_state = 'import_done'::text) OR (created_at >= '2022-01-23 00:00:00'::timestamp without time zone));
-
CREATE INDEX tmp_index_on_vulnerabilities_non_dismissed ON vulnerabilities USING btree (id) WHERE (state <> 2);
CREATE INDEX tmp_index_project_statistics_cont_registry_size ON project_statistics USING btree (project_id) WHERE (container_registry_size = 0);
@@ -33555,6 +33750,8 @@ CREATE UNIQUE INDEX u_project_compliance_standards_adherence_for_reporting ON pr
CREATE UNIQUE INDEX uniq_idx_packages_packages_on_project_id_name_version_ml_model ON packages_packages USING btree (project_id, name, version) WHERE (package_type = 14);
+CREATE UNIQUE INDEX uniq_idx_user_add_on_assignments_on_add_on_purchase_and_user ON subscription_user_add_on_assignments USING btree (add_on_purchase_id, user_id);
+
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);
@@ -33573,6 +33770,8 @@ CREATE UNIQUE INDEX uniq_pkgs_debian_project_distributions_project_id_and_suite
CREATE UNIQUE INDEX unique_ci_builds_token_encrypted_and_partition_id ON ci_builds USING btree (token_encrypted, partition_id) WHERE (token_encrypted IS NOT NULL);
+CREATE UNIQUE INDEX unique_external_audit_event_destination_namespace_id_and_name ON audit_events_external_audit_event_destinations USING btree (namespace_id, name);
+
CREATE UNIQUE INDEX unique_google_cloud_logging_configurations_on_namespace_id ON audit_events_google_cloud_logging_configurations USING btree (namespace_id, google_project_id_name, log_id_name);
CREATE UNIQUE INDEX unique_idx_namespaces_storage_limit_exclusions_on_namespace_id ON namespaces_storage_limit_exclusions USING btree (namespace_id);
@@ -33583,6 +33782,10 @@ CREATE UNIQUE INDEX unique_index_for_project_pages_unique_domain ON project_sett
CREATE UNIQUE INDEX unique_index_on_system_note_metadata_id ON resource_link_events USING btree (system_note_metadata_id);
+CREATE UNIQUE INDEX unique_index_sysaccess_ms_access_tokens_on_sysaccess_ms_app_id ON system_access_microsoft_graph_access_tokens USING btree (system_access_microsoft_application_id);
+
+CREATE UNIQUE INDEX unique_instance_audit_event_destination_name ON audit_events_instance_external_audit_event_destinations USING btree (name);
+
CREATE UNIQUE INDEX unique_merge_request_diff_llm_summaries_on_mr_diff_id ON merge_request_diff_llm_summaries USING btree (merge_request_diff_id);
CREATE UNIQUE INDEX unique_merge_request_metrics_by_merge_request_id ON merge_request_metrics USING btree (merge_request_id);
@@ -33591,6 +33794,8 @@ CREATE UNIQUE INDEX unique_organizations_on_path ON organizations USING btree (p
CREATE UNIQUE INDEX unique_packages_project_id_and_name_and_version_when_debian ON packages_packages USING btree (project_id, name, version) WHERE ((package_type = 9) AND (status <> 4));
+CREATE UNIQUE INDEX unique_pool_repositories_on_disk_path_and_shard_id ON pool_repositories USING btree (disk_path, shard_id);
+
CREATE UNIQUE INDEX unique_postgres_async_fk_validations_name_and_table_name ON postgres_async_foreign_key_validations USING btree (name, table_name);
CREATE UNIQUE INDEX unique_projects_on_name_namespace_id ON projects USING btree (name, namespace_id);
@@ -35095,20 +35300,22 @@ CREATE TRIGGER namespaces_loose_fk_trigger AFTER DELETE ON namespaces REFERENCIN
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 organizations_loose_fk_trigger AFTER DELETE ON organizations REFERENCING OLD TABLE AS old_table FOR EACH STATEMENT EXECUTE FUNCTION insert_into_loose_foreign_keys_deleted_records();
+
CREATE TRIGGER p_ci_builds_loose_fk_trigger AFTER DELETE ON p_ci_builds REFERENCING OLD TABLE AS old_table FOR EACH STATEMENT EXECUTE FUNCTION insert_into_loose_foreign_keys_deleted_records();
+CREATE TRIGGER prevent_delete_of_default_organization_before_destroy BEFORE DELETE ON organizations FOR EACH ROW EXECUTE FUNCTION prevent_delete_of_default_organization();
+
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 push_rules_loose_fk_trigger AFTER DELETE ON push_rules REFERENCING OLD TABLE AS old_table FOR EACH STATEMENT EXECUTE FUNCTION insert_into_loose_foreign_keys_deleted_records();
CREATE TRIGGER tags_loose_fk_trigger AFTER DELETE ON tags REFERENCING OLD TABLE AS old_table FOR EACH STATEMENT EXECUTE FUNCTION insert_into_loose_foreign_keys_deleted_records();
-CREATE TRIGGER trigger_023e82d8e257 BEFORE INSERT OR UPDATE ON ci_pipeline_variables FOR EACH ROW EXECUTE FUNCTION trigger_023e82d8e257();
-
-CREATE TRIGGER trigger_080e73845bfd BEFORE INSERT OR UPDATE ON notes FOR EACH ROW EXECUTE FUNCTION trigger_080e73845bfd();
-
CREATE TRIGGER trigger_1a857e8db6cd BEFORE INSERT OR UPDATE ON vulnerability_occurrences FOR EACH ROW EXECUTE FUNCTION trigger_1a857e8db6cd();
+CREATE TRIGGER trigger_7f3d66a7d7f5 BEFORE INSERT OR UPDATE ON ci_pipeline_variables FOR EACH ROW EXECUTE FUNCTION trigger_7f3d66a7d7f5();
+
CREATE TRIGGER trigger_b2d852e1e2cb BEFORE INSERT OR UPDATE ON ci_pipelines FOR EACH ROW EXECUTE FUNCTION trigger_b2d852e1e2cb();
CREATE TRIGGER trigger_cd1aeb22b34a BEFORE INSERT OR UPDATE ON events FOR EACH ROW EXECUTE FUNCTION trigger_cd1aeb22b34a();
@@ -35220,6 +35427,9 @@ ALTER TABLE ONLY notification_settings
ALTER TABLE ONLY lists
ADD CONSTRAINT fk_0d3f677137 FOREIGN KEY (board_id) REFERENCES boards(id) ON DELETE CASCADE;
+ALTER TABLE ONLY subscription_user_add_on_assignments
+ ADD CONSTRAINT fk_0d89020c49 FOREIGN KEY (add_on_purchase_id) REFERENCES subscription_add_on_purchases(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY deployment_approvals
ADD CONSTRAINT fk_0f58311058 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
@@ -35403,6 +35613,9 @@ ALTER TABLE ONLY incident_management_timeline_events
ALTER TABLE ONLY bulk_import_exports
ADD CONSTRAINT fk_39c726d3b5 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+ALTER TABLE ONLY ml_model_versions
+ ADD CONSTRAINT fk_39f8aa0b8a FOREIGN KEY (package_id) REFERENCES packages_packages(id) ON DELETE SET NULL;
+
ALTER TABLE p_ci_builds
ADD CONSTRAINT fk_3a9eaa254d FOREIGN KEY (stage_id) REFERENCES ci_stages(id) ON DELETE CASCADE;
@@ -35469,6 +35682,9 @@ ALTER TABLE ONLY sbom_occurrences
ALTER TABLE ONLY namespace_commit_emails
ADD CONSTRAINT fk_4d6ba63ba5 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+ALTER TABLE ONLY ml_model_versions
+ ADD CONSTRAINT fk_4e8b59e7a8 FOREIGN KEY (model_id) REFERENCES ml_models(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY user_achievements
ADD CONSTRAINT fk_4efde02858 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
@@ -35535,6 +35751,9 @@ ALTER TABLE ONLY user_achievements
ALTER TABLE ONLY merge_requests
ADD CONSTRAINT fk_6149611a04 FOREIGN KEY (assignee_id) REFERENCES users(id) ON DELETE SET NULL;
+ALTER TABLE ONLY merge_request_review_llm_summaries
+ ADD CONSTRAINT fk_6154a9cb89 FOREIGN KEY (review_id) REFERENCES reviews(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY work_item_widget_definitions
ADD CONSTRAINT fk_61bfa96db5 FOREIGN KEY (work_item_type_id) REFERENCES work_item_types(id) ON DELETE CASCADE;
@@ -35589,6 +35808,9 @@ ALTER TABLE ONLY integrations
ALTER TABLE ONLY user_interacted_projects
ADD CONSTRAINT fk_722ceba4f7 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+ALTER TABLE ONLY subscription_user_add_on_assignments
+ ADD CONSTRAINT fk_724c2df9a8 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY vulnerabilities
ADD CONSTRAINT fk_725465b774 FOREIGN KEY (dismissed_by_id) REFERENCES users(id) ON DELETE SET NULL;
@@ -35625,6 +35847,9 @@ ALTER TABLE ONLY lists
ALTER TABLE ONLY protected_branches
ADD CONSTRAINT fk_7a9c6d93e7 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+ALTER TABLE ONLY scan_result_policies
+ ADD CONSTRAINT fk_7aa24439f1 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY vulnerabilities
ADD CONSTRAINT fk_7ac31eacb9 FOREIGN KEY (updated_by_id) REFERENCES users(id) ON DELETE SET NULL;
@@ -35658,6 +35883,9 @@ ALTER TABLE ONLY import_export_uploads
ALTER TABLE ONLY push_rules
ADD CONSTRAINT fk_83b29894de FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+ALTER TABLE ONLY organization_users
+ ADD CONSTRAINT fk_8471abad75 FOREIGN KEY (organization_id) REFERENCES organizations(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY merge_request_diffs
ADD CONSTRAINT fk_8483f3258f FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE;
@@ -35691,21 +35919,24 @@ ALTER TABLE ONLY issues
ALTER TABLE ONLY ci_build_trace_chunks
ADD CONSTRAINT fk_89e29fa5ee_p FOREIGN KEY (partition_id, build_id) REFERENCES p_ci_builds(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE;
-ALTER TABLE ONLY sbom_vulnerable_component_versions
- ADD CONSTRAINT fk_8a2a1197f9 FOREIGN KEY (sbom_component_version_id) REFERENCES sbom_component_versions(id) ON DELETE CASCADE;
-
ALTER TABLE ONLY protected_branch_merge_access_levels
ADD CONSTRAINT fk_8a3072ccb3 FOREIGN KEY (protected_branch_id) REFERENCES protected_branches(id) ON DELETE CASCADE;
ALTER TABLE ONLY bulk_import_exports
ADD CONSTRAINT fk_8c6f33cebe FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+ALTER TABLE ONLY organization_users
+ ADD CONSTRAINT fk_8d9b20725d FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY releases
ADD CONSTRAINT fk_8e4456f90f FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE SET NULL;
ALTER TABLE ONLY protected_tags
ADD CONSTRAINT fk_8e4af87648 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+ALTER TABLE ONLY merge_request_review_llm_summaries
+ ADD CONSTRAINT fk_8ec009c6ab FOREIGN KEY (merge_request_diff_id) REFERENCES merge_request_diffs(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY todos
ADD CONSTRAINT fk_91d1f47b13 FOREIGN KEY (note_id) REFERENCES notes(id) ON DELETE CASCADE;
@@ -35893,7 +36124,7 @@ ALTER TABLE ONLY routes
ADD CONSTRAINT fk_bb2e5b8968 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
ALTER TABLE p_ci_runner_machine_builds
- ADD CONSTRAINT fk_bb490f12fe_p FOREIGN KEY (partition_id, build_id) REFERENCES ci_builds(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE;
+ ADD CONSTRAINT fk_bb490f12fe_p FOREIGN KEY (partition_id, build_id) REFERENCES p_ci_builds(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE;
ALTER TABLE ONLY namespace_bans
ADD CONSTRAINT fk_bcc024eef2 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
@@ -35961,6 +36192,9 @@ ALTER TABLE ONLY agent_activity_events
ALTER TABLE ONLY issue_links
ADD CONSTRAINT fk_c900194ff2 FOREIGN KEY (source_id) REFERENCES issues(id) ON DELETE CASCADE;
+ALTER TABLE ONLY personal_access_tokens
+ ADD CONSTRAINT fk_c951fbf57e FOREIGN KEY (previous_personal_access_token_id) REFERENCES personal_access_tokens(id) ON DELETE SET NULL;
+
ALTER TABLE ONLY jira_tracker_data
ADD CONSTRAINT fk_c98abcd54c FOREIGN KEY (integration_id) REFERENCES integrations(id) ON DELETE CASCADE;
@@ -35997,6 +36231,9 @@ ALTER TABLE ONLY custom_emoji
ALTER TABLE ONLY bulk_import_entities
ADD CONSTRAINT fk_d06d023c30 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+ALTER TABLE ONLY merge_request_review_llm_summaries
+ ADD CONSTRAINT fk_d07eeb6392 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY project_mirror_data
ADD CONSTRAINT fk_d1aad367d7 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -36018,9 +36255,6 @@ ALTER TABLE ONLY lists
ALTER TABLE ONLY agent_activity_events
ADD CONSTRAINT fk_d6f785c9fc FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL;
-ALTER TABLE ONLY sbom_vulnerable_component_versions
- ADD CONSTRAINT fk_d720a1959a FOREIGN KEY (vulnerability_advisory_id) REFERENCES vulnerability_advisories(id) ON DELETE CASCADE;
-
ALTER TABLE ONLY user_achievements
ADD CONSTRAINT fk_d7653ef780 FOREIGN KEY (revoked_by_user_id) REFERENCES users(id) ON DELETE SET NULL;
@@ -36082,7 +36316,7 @@ ALTER TABLE ONLY ci_sources_pipelines
ADD CONSTRAINT fk_e1bad85861 FOREIGN KEY (pipeline_id) REFERENCES ci_pipelines(id) ON DELETE CASCADE;
ALTER TABLE p_ci_builds_metadata
- ADD CONSTRAINT fk_e20479742e_p FOREIGN KEY (partition_id, build_id) REFERENCES ci_builds(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE;
+ ADD CONSTRAINT fk_e20479742e_p FOREIGN KEY (partition_id, build_id) REFERENCES p_ci_builds(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE;
ALTER TABLE ONLY gitlab_subscriptions
ADD CONSTRAINT fk_e2595d00a1 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
@@ -36213,6 +36447,12 @@ ALTER TABLE ONLY ml_candidate_metrics
ALTER TABLE ONLY ml_candidate_params
ADD CONSTRAINT fk_ml_candidate_params_on_candidate_id FOREIGN KEY (candidate_id) REFERENCES ml_candidates(id) ON DELETE CASCADE;
+ALTER TABLE ONLY ml_candidates
+ ADD CONSTRAINT fk_ml_candidates_on_user_id FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY ml_experiments
+ ADD CONSTRAINT fk_ml_experiments_on_user_id FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL;
+
ALTER TABLE ONLY path_locks
ADD CONSTRAINT fk_path_locks_user_id FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
@@ -36408,9 +36648,6 @@ ALTER TABLE ONLY vulnerability_user_mentions
ALTER TABLE ONLY packages_debian_file_metadata
ADD CONSTRAINT fk_rails_1ae85be112 FOREIGN KEY (package_file_id) REFERENCES packages_package_files(id) ON DELETE CASCADE;
-ALTER TABLE ONLY ml_candidates
- ADD CONSTRAINT fk_rails_1b37441fe5 FOREIGN KEY (user_id) REFERENCES users(id);
-
ALTER TABLE ONLY issuable_slas
ADD CONSTRAINT fk_rails_1b8768cd63 FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
@@ -36438,9 +36675,6 @@ ALTER TABLE ONLY geo_repository_created_events
ALTER TABLE ONLY external_status_checks
ADD CONSTRAINT fk_rails_1f5a8aa809 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
-ALTER TABLE ONLY ml_experiments
- ADD CONSTRAINT fk_rails_1fbc5e001f FOREIGN KEY (user_id) REFERENCES users(id);
-
ALTER TABLE ONLY dora_daily_metrics
ADD CONSTRAINT fk_rails_1fd07aff6f FOREIGN KEY (environment_id) REFERENCES environments(id) ON DELETE CASCADE;
@@ -36774,6 +37008,9 @@ ALTER TABLE ONLY project_repository_storage_moves
ALTER TABLE ONLY ml_candidate_metadata
ADD CONSTRAINT fk_rails_5117dddf22 FOREIGN KEY (candidate_id) REFERENCES ml_candidates(id) ON DELETE CASCADE;
+ALTER TABLE ONLY ml_models
+ ADD CONSTRAINT fk_rails_51e87f7c50 FOREIGN KEY (project_id) REFERENCES projects(id);
+
ALTER TABLE ONLY elastic_group_index_statuses
ADD CONSTRAINT fk_rails_52b9969b12 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
@@ -36864,6 +37101,9 @@ ALTER TABLE ONLY incident_management_oncall_participants
ALTER TABLE ONLY work_item_parent_links
ADD CONSTRAINT fk_rails_601d5bec3a FOREIGN KEY (work_item_id) REFERENCES issues(id) ON DELETE CASCADE;
+ALTER TABLE ONLY system_access_microsoft_graph_access_tokens
+ ADD CONSTRAINT fk_rails_604908851f FOREIGN KEY (system_access_microsoft_application_id) REFERENCES system_access_microsoft_applications(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY vulnerability_state_transitions
ADD CONSTRAINT fk_rails_60e4899648 FOREIGN KEY (vulnerability_id) REFERENCES vulnerabilities(id) ON DELETE CASCADE;
@@ -37086,6 +37326,9 @@ ALTER TABLE ONLY required_code_owners_sections
ALTER TABLE ONLY namespace_ldap_settings
ADD CONSTRAINT fk_rails_82cd0ad4bb FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+ALTER TABLE ONLY group_wiki_repository_states
+ ADD CONSTRAINT fk_rails_832511c9f1 FOREIGN KEY (group_wiki_repository_id) REFERENCES group_wiki_repositories(group_id) ON DELETE CASCADE;
+
ALTER TABLE ONLY cluster_enabled_grants
ADD CONSTRAINT fk_rails_8336ce35af FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
@@ -37134,6 +37377,9 @@ ALTER TABLE ONLY achievements
ALTER TABLE ONLY protected_environment_deploy_access_levels
ADD CONSTRAINT fk_rails_898a13b650 FOREIGN KEY (protected_environment_id) REFERENCES protected_environments(id) ON DELETE CASCADE;
+ALTER TABLE ONLY ml_model_versions
+ ADD CONSTRAINT fk_rails_8a481bd22e FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY snippet_repositories
ADD CONSTRAINT fk_rails_8afd7e2f71 FOREIGN KEY (snippet_id) REFERENCES snippets(id) ON DELETE CASCADE;
@@ -37230,6 +37476,9 @@ ALTER TABLE ONLY boards_epic_board_recent_visits
ALTER TABLE ONLY packages_dependency_links
ADD CONSTRAINT fk_rails_96ef1c00d3 FOREIGN KEY (package_id) REFERENCES packages_packages(id) ON DELETE CASCADE;
+ALTER TABLE ONLY ml_experiments
+ ADD CONSTRAINT fk_rails_97194a054e FOREIGN KEY (model_id) REFERENCES ml_models(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY group_repository_storage_moves
ADD CONSTRAINT fk_rails_982bb5daf1 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
@@ -37549,7 +37798,13 @@ ALTER TABLE ONLY boards_epic_board_recent_visits
ADD CONSTRAINT fk_rails_c4dcba4a3e FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
ALTER TABLE ONLY ci_job_artifacts
- ADD CONSTRAINT fk_rails_c5137cb2c1_p FOREIGN KEY (partition_id, job_id) REFERENCES ci_builds(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE;
+ ADD CONSTRAINT fk_rails_c5137cb2c1_p FOREIGN KEY (partition_id, job_id) REFERENCES p_ci_builds(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE;
+
+ALTER TABLE ONLY organization_settings
+ ADD CONSTRAINT fk_rails_c56e4690c0 FOREIGN KEY (organization_id) REFERENCES organizations(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY system_access_microsoft_applications
+ ADD CONSTRAINT fk_rails_c5b7765d04 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
ALTER TABLE ONLY project_settings
ADD CONSTRAINT fk_rails_c6df6e6328 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -37663,7 +37918,7 @@ ALTER TABLE ONLY merge_request_reviewers
ADD CONSTRAINT fk_rails_d9fec24b9d FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE;
ALTER TABLE ONLY ci_running_builds
- ADD CONSTRAINT fk_rails_da45cfa165_p FOREIGN KEY (partition_id, build_id) REFERENCES ci_builds(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE;
+ ADD CONSTRAINT fk_rails_da45cfa165_p FOREIGN KEY (partition_id, build_id) REFERENCES p_ci_builds(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE;
ALTER TABLE ONLY resource_link_events
ADD CONSTRAINT fk_rails_da5dd8a56f FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
@@ -37915,7 +38170,7 @@ ALTER TABLE ONLY board_project_recent_visits
ADD CONSTRAINT fk_rails_fb6fc419cb FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
ALTER TABLE ONLY ci_job_variables
- ADD CONSTRAINT fk_rails_fbf3b34792_p FOREIGN KEY (partition_id, job_id) REFERENCES ci_builds(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE;
+ ADD CONSTRAINT fk_rails_fbf3b34792_p FOREIGN KEY (partition_id, job_id) REFERENCES p_ci_builds(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE;
ALTER TABLE ONLY packages_nuget_metadata
ADD CONSTRAINT fk_rails_fc0c19f5b4 FOREIGN KEY (package_id) REFERENCES packages_packages(id) ON DELETE CASCADE;
@@ -37956,9 +38211,6 @@ ALTER TABLE ONLY timelogs
ALTER TABLE ONLY timelogs
ADD CONSTRAINT fk_timelogs_note_id FOREIGN KEY (note_id) REFERENCES notes(id) ON DELETE SET NULL;
-ALTER TABLE ONLY u2f_registrations
- ADD CONSTRAINT fk_u2f_registrations_user_id FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
-
ALTER TABLE issue_search_data
ADD CONSTRAINT issue_search_data_issue_id_fkey FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
@@ -37968,18 +38220,6 @@ ALTER TABLE issue_search_data
ALTER TABLE product_analytics_events_experimental
ADD CONSTRAINT product_analytics_events_experimental_project_id_fkey FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
-ALTER TABLE ONLY ci_builds_metadata
- ADD CONSTRAINT temp_fk_e20479742e_p FOREIGN KEY (partition_id, build_id) REFERENCES p_ci_builds(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE NOT VALID;
-
-ALTER TABLE ONLY ci_job_artifacts
- ADD CONSTRAINT temp_fk_rails_c5137cb2c1_p FOREIGN KEY (partition_id, job_id) REFERENCES p_ci_builds(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE NOT VALID;
-
-ALTER TABLE ONLY ci_running_builds
- ADD CONSTRAINT temp_fk_rails_da45cfa165_p FOREIGN KEY (partition_id, build_id) REFERENCES p_ci_builds(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE NOT VALID;
-
-ALTER TABLE ONLY ci_job_variables
- ADD CONSTRAINT temp_fk_rails_fbf3b34792_p FOREIGN KEY (partition_id, job_id) REFERENCES p_ci_builds(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE NOT VALID;
-
ALTER TABLE ONLY user_follow_users
ADD CONSTRAINT user_follow_users_followee_id_fkey FOREIGN KEY (followee_id) REFERENCES users(id) ON DELETE CASCADE;
diff --git a/doc/.vale/gitlab/FirstPerson.yml b/doc/.vale/gitlab/FirstPerson.yml
deleted file mode 100644
index e97b886b5ed..00000000000
--- a/doc/.vale/gitlab/FirstPerson.yml
+++ /dev/null
@@ -1,16 +0,0 @@
----
-# Warning: gitlab.FirstPerson
-#
-# Checks for use of first person pronouns.
-#
-# For a list of all options, see https://vale.sh/docs/topics/styles/
-extends: existence
-message: "Instead of '%s', speak directly to the reader. Use 'you' or re-write to remove."
-level: warning
-ignorecase: true
-link: https://docs.gitlab.com/ee/development/documentation/styleguide/index.html
-tokens:
- - '\bI[ ,;:?!"]|\bI\x27.{1,2}'
- - me
- - myself
- - mine
diff --git a/doc/.vale/gitlab/Markdown_emoji.yml b/doc/.vale/gitlab/Markdown_emoji.yml
index 9873fb8becd..20f3ed0f5cb 100644
--- a/doc/.vale/gitlab/Markdown_emoji.yml
+++ b/doc/.vale/gitlab/Markdown_emoji.yml
@@ -1,11 +1,11 @@
---
# Warning: gitlab.Markdown_emoji
#
-# Check for use of GLFM emoji syntax (https://docs.gitlab.com/ee/user/markdown.html#emojis), which doesn't render correctly in documentation.
+# Check for use of GLFM emoji syntax (https://docs.gitlab.com/ee/user/markdown.html#emoji), which doesn't render correctly in documentation.
#
# For a list of all options, see https://vale.sh/docs/topics/styles/
extends: existence
-message: "Replace '%s' with GitLab SVGs or Unicode emojis."
+message: "Replace '%s' with GitLab SVGs or Unicode emoji."
link: https://docs.gitlab.com/ee/development/documentation/styleguide/#gitlab-svg-icons
level: warning
scope: text
diff --git a/doc/.vale/gitlab/SubstitutionWarning.yml b/doc/.vale/gitlab/SubstitutionWarning.yml
index fa4a0960d9c..d9d4200e88b 100644
--- a/doc/.vale/gitlab/SubstitutionWarning.yml
+++ b/doc/.vale/gitlab/SubstitutionWarning.yml
@@ -18,11 +18,15 @@ swap:
click: "select"
code base: "codebase"
config: "configuration"
+ confirmation box: "confirmation dialog"
+ confirmation dialog box: "confirmation dialog"
deselect: "clear"
deselected: "cleared"
+ dialog box: "dialog"
distro: "distribution"
docs: "documentation"
e-mail: "email"
+ emojis: "emoji"
ex: "for example"
file name: "filename"
filesystem: "file system"
@@ -30,6 +34,9 @@ swap:
it is recommended: "you should"
logged in user: "authenticated user"
logged-in user: "authenticated user"
+ modal dialog: "dialog"
+ modal window: "dialog"
+ modal: "dialog"
n/a: "not applicable"
navigate to: "go to"
OAuth2: "OAuth 2.0"
@@ -38,6 +45,9 @@ swap:
once that: "after that"
once the: "after the"
once you: "after you"
+ pop-up window: "dialog"
+ pop-up: "dialog"
+ popup: "dialog"
repo: "repository"
signed in user: "authenticated user"
signed-in user: "authenticated user"
diff --git a/doc/.vale/gitlab/Zip.yml b/doc/.vale/gitlab/Zip.yml
new file mode 100644
index 00000000000..69ff980b822
--- /dev/null
+++ b/doc/.vale/gitlab/Zip.yml
@@ -0,0 +1,15 @@
+---
+# Warning: gitlab.Zip
+#
+# Recommends all instances of something.zip be wrapped in backticks
+# due to the .zip top-level domain
+#
+# For a list of all options, see https://vale.sh/docs/topics/styles/
+extends: existence
+message: "Wrap '%s' in backticks to prevent unintentional links to .zip domain names."
+link: 'https://docs.gitlab.com/ee/development/documentation/styleguide/index.md#backticks-in-markdown'
+nonword: true
+level: error
+ignorecase: true
+tokens:
+ - '\b\w*\.zip'
diff --git a/doc/.vale/gitlab/spelling-exceptions.txt b/doc/.vale/gitlab/spelling-exceptions.txt
index 4bed441ba9d..ed505094e75 100644
--- a/doc/.vale/gitlab/spelling-exceptions.txt
+++ b/doc/.vale/gitlab/spelling-exceptions.txt
@@ -193,6 +193,7 @@ Consul
Contentful
Corosync
corpuses
+Cosign
Coursier
CPU
CPUs
@@ -374,6 +375,7 @@ FQDNs
FreshBooks
frontend
Fugit
+Fulcio
fuzzer
fuzzing
Gantt
@@ -516,6 +518,7 @@ Kubernetes
Kubesec
Kucoin
Kustomize
+Kustomization
kwargs
Laravel
LaunchDarkly
@@ -785,6 +788,7 @@ reindexes
reindexing
reinitialize
reinitializing
+Rekor
relicensing
remediations
renderers
@@ -879,6 +883,7 @@ Shimo
Shippo
Shopify
Sidekiq
+Sigstore
Silverlight
Sisense
Sitespeed
diff --git a/doc/administration/admin_area.md b/doc/administration/admin_area.md
new file mode 100644
index 00000000000..1e103bb55c8
--- /dev/null
+++ b/doc/administration/admin_area.md
@@ -0,0 +1,489 @@
+---
+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/product/ux/technical-writing/#assignments
+type: reference
+---
+
+# GitLab Admin Area **(FREE SELF)**
+
+The Admin Area provides a web UI to manage and configure features of GitLab
+self-managed instances. If you are an administrator,to access the Admin Area:
+
+- In GitLab 16.1 and later: on the left sidebar, expand the top-most chevron (**{chevron-down}**), then select **Admin Area**.
+- In GitLab 16.0 and earlier: on the top bar, select **Main menu > Admin**.
+
+NOTE:
+Only administrators can access the Admin Area.
+
+## Administering projects
+
+You can administer all projects in the GitLab instance from the Admin Area's Projects page.
+
+To access the Projects page:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Overview > Projects**.
+1. Select the **All**, **Private**, **Internal**, or **Public** tab to list only
+ projects of that criteria.
+
+By default, all projects are listed, in reverse order of when they were last updated. For each
+project, the following information is listed:
+
+- Name
+- Namespace
+- Description
+- Size, updated every 15 minutes at most
+
+Projects can be edited or deleted.
+
+To edit a project's name or description:
+
+1. In the Projects overview, next to the project you want to edit, select **Edit**.
+1. Edit the **Project name** or **Project description**.
+1. Select **Save Changes**.
+
+To delete a project:
+
+1. In the Projects overview, next to the project you want to delete, select **Delete**.
+
+The list of projects can be sorted by:
+
+- Updated date
+- Last created
+- Name
+- Most stars
+- Oldest created
+- Oldest updated
+- Largest repository
+
+A user can choose to hide or show archived projects in the list.
+
+In the **Filter by name** field, type the project name you want to find, and GitLab filters
+them as you type.
+
+To filter only projects in that namespace, select from the **Namespace** dropdown list.
+
+You can combine the filter options. For example, to list only public projects with `score` in their name:
+
+1. Select the **Public** tab.
+1. Enter `score` in the **Filter by name...** input box.
+
+## Administering users
+
+You can administer all users in the GitLab instance from the Admin Area's Users page:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Overview > Users**.
+
+To list users matching a specific criteria, select one of the following tabs on the **Users** page:
+
+- **Active**
+- **Admins**
+- **2FA Enabled**
+- **2FA Disabled**
+- **External**
+- **[Blocked](../administration/moderate_users.md#block-a-user)**
+- **[Deactivated](../administration/moderate_users.md#deactivate-a-user)**
+- **Without projects**
+
+For each user, the following are listed:
+
+1. Username
+1. Email address
+1. Project membership count
+1. Group membership count ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/276215) in GitLab 13.12)
+1. Date of account creation
+1. Date of last activity
+
+To edit a user, in the user's row, select **Edit**. To delete the user, or delete the user and their contributions, select the cog dropdown list in
+that user's row, and select the desired option.
+
+To change the sort order:
+
+1. Select the sort dropdown list.
+1. Select the desired order.
+
+By default the sort dropdown list shows **Name**.
+
+To search for users, enter your criteria in the search field. The user search is case
+insensitive, and applies partial matching to name and username. To search for an email address,
+you must provide the complete email address.
+
+### User impersonation
+
+An administrator can "impersonate" any other user, including other administrators.
+This allows the administrator to "see what the user sees," and take actions on behalf of the user.
+You can impersonate a user in the following ways:
+
+- Through the UI:
+ 1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+ 1. Select **Admin Area**.
+ 1. On the left sidebar, select **Overview > Users**.
+ 1. From the list of users, select a user.
+ 1. Select **Impersonate**.
+- With the API, using [impersonation tokens](../api/rest/index.md#impersonation-tokens).
+
+All impersonation activities are [captured with audit events](audit_events.md#user-impersonation).
+
+By default, impersonation is enabled. GitLab can be configured to [disable impersonation](../api/rest/index.md#disable-impersonation).
+
+![user impersonation button](img/impersonate_user_button_v13_8.png)
+
+### User identities
+
+> The ability to see a user's SCIM identity was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/294608) in GitLab 15.3.
+
+When using authentication providers, administrators can see the identities for a user:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Overview > Users**.
+1. From the list of users, select a user.
+1. Select **Identities**.
+
+This list shows the user's identities, including SCIM identities. Administrators can use this information to troubleshoot SCIM-related issues and confirm
+the identities being used for an account.
+
+### User Permission Export **(PREMIUM SELF)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/1772) in GitLab 13.8.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/292436) in GitLab 13.9.
+
+An administrator can export user permissions for all users in the GitLab instance from the Admin Area's Users page.
+The export lists direct membership the users have in groups and projects.
+
+The following data is included in the export:
+
+- Username
+- Email
+- Type
+- Path
+- Access level ([Project](../user/permissions.md#project-members-permissions) and [Group](../user/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).
+
+Only the first 100,000 user accounts are exported.
+
+![user permission export button](img/export_permissions_v13_11.png)
+
+### Users statistics
+
+The **Users statistics** page provides an overview of user accounts by role. These statistics are
+calculated daily, so user changes made since the last update are not reflected.
+
+The following totals are also included:
+
+- Billable users
+- Blocked users
+- Total users
+
+GitLab billing is based on the number of [**Billable users**](../subscriptions/self_managed/index.md#billable-users).
+
+### Add email to user
+
+You must be an administrator to manually add emails to users:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Overview > Users**.
+1. Locate the user and select them.
+1. Select **Edit**.
+1. In **Email**, enter the new email address. This adds the new email address to the
+ user and sets the previous email address to be a secondary.
+1. Select **Save changes**.
+
+## User cohorts
+
+The [Cohorts](user_cohorts.md) tab displays the monthly cohorts of new users and their activities over time.
+
+## Prevent a user from creating groups
+
+By default, users can create groups. To prevent a user from creating a top level group:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Overview > Users**.
+1. Locate the user and select them.
+1. Select **Edit**.
+1. Clear the **Can create group** checkbox.
+1. Select **Save changes**.
+
+It is also possible to [limit which roles can create a subgroup within a group](../user/group/subgroups/index.md#change-who-can-create-subgroups).
+
+## Administering groups
+
+You can administer all groups in the GitLab instance from the Admin Area's Groups page.
+
+To access the Groups page:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Overview > Groups**.
+
+For each group, the page displays their name, description, size, number of projects in the group,
+number of members, and whether the group is private, internal, or public. To edit a group, in the group's row, select **Edit**. To delete the group, in the group's row, select **Delete**.
+
+To change the sort order, select the sort dropdown list and select the desired order. The default
+sort order is by **Last created**.
+
+To search for groups by name, enter your criteria in the search field. The group search is case
+insensitive, and applies partial matching.
+
+To [Create a new group](../user/group/index.md#create-a-group) select **New group**.
+
+## Administering topics
+
+- > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/340920) in GitLab 14.4.
+- > Merging topics [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/366884) in GitLab 15.5.
+
+[Topics](../user/project/working_with_projects.md#explore-topics) are used to categorize and find similar projects.
+
+### View all topics
+
+To view all topics in the GitLab instance:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Overview > Topics**.
+
+For each topic, the page displays its name and the number of projects labeled with the topic.
+
+### Search for topics
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Overview > Topics**.
+1. In the search box, enter your search criteria.
+ The topic search is case-insensitive and applies partial matching.
+
+### Create a topic
+
+To create a topic:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Overview > Topics**.
+1. Select **New topic**.
+1. Enter the **Topic slug (name)** and **Topic title**.
+1. Optional. Enter a **Description** and add a **Topic avatar**.
+1. Select **Save changes**.
+
+The created topics are displayed on the **Explore topics** page.
+
+NOTE:
+The assigned topics are visible only to everyone with access to the project,
+but everyone can see which topics exist on the GitLab instance.
+Do not include sensitive information in the name of a topic.
+
+### Edit a topic
+
+You can edit a topic's name, title, description, and avatar at any time.
+To edit a topic:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Overview > Topics**.
+1. Select **Edit** in that topic's row.
+1. Edit the topic slug (name), title, description, or avatar.
+1. Select **Save changes**.
+
+### Remove a topic
+
+If you no longer need a topic, you can permanently remove it.
+To remove a topic:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Overview > Topics**.
+1. To remove a topic, select **Remove** in that topic's row.
+
+### Merge topics
+
+You can move all projects assigned to a topic to another topic.
+The source topic is then permanently deleted.
+After a merged topic is deleted, you cannot restore it.
+
+To merge topics:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Overview > Topics**.
+1. Select **Merge topics**.
+1. From the **Source topic** dropdown list, select the topic you want to merge and remove.
+1. From the **Target topic** dropdown list, select the topic you want to merge the source topic into.
+1. Select **Merge**.
+
+## Administering Gitaly servers
+
+You can list all Gitaly servers in the GitLab instance from the Admin Area's **Gitaly Servers**
+page. For more details, see [Gitaly](gitaly/index.md).
+
+To access the **Gitaly Servers** page:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Overview > Gitaly Servers**.
+
+For each Gitaly server, the following details are listed:
+
+| Field | Description |
+|----------------|-------------|
+| Storage | Repository storage |
+| Address | Network address on which the Gitaly server is listening |
+| Server version | Gitaly version |
+| Git version | Version of Git installed on the Gitaly server |
+| Up to date | Indicates if the Gitaly server version is the latest version available. A green dot indicates the server is up to date. |
+
+## CI/CD section
+
+### Administering runners
+
+> [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/340859) from **Overview > Runners** to **CI/CD > Runners** in GitLab 15.8.
+
+You can administer all runners in the GitLab instance from the Admin Area's **Runners** page. See
+[GitLab Runner](https://docs.gitlab.com/runner/) for more information.
+
+To access the **Runners** page:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Overview > Runners**.
+
+#### Search and filter runners
+
+To search runners' descriptions:
+
+1. In the **Search or filter results...** field, type the description of the runner you want to
+ find.
+1. Press <kbd>Enter</kbd>.
+
+You can also filter runners by status, type, and tag. To filter:
+
+1. Select a tab or the **Search or filter results...** field.
+1. Select any **Type**, or filter by **Status** or **Tags**.
+1. Select or enter your search criteria.
+
+![Attributes of a runner, with the **Search or filter results...** field active](img/index_runners_search_or_filter_v14_5.png)
+
+#### Bulk delete runners
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/370241) in GitLab 15.4.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/353981) in GitLab 15.5.
+
+You can delete multiple runners at the same time.
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Overview > Runners**.
+1. To the left of the runners you want to delete, select the checkbox.
+ To select all of the runners on the page, select the checkbox above
+ the list.
+1. Select **Delete selected**.
+
+#### Runner attributes
+
+For each runner, the following attributes are listed:
+
+| Attribute | Description |
+|--------------|-------------|
+| Status | The status of the runner. In [GitLab 15.1 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/22224), for the **Ultimate** tier, the upgrade status is available. |
+| Runner details | Information about the runner, including partial token and details about the computer the runner was registered from. |
+| Version | GitLab Runner version. |
+| Jobs | Total number of jobs run by the runner. |
+| Tags | Tags associated with the runner. |
+| Last contact | Timestamp indicating when the runner last contacted the GitLab instance. |
+
+You can also edit, pause, or remove each runner.
+
+### Administering Jobs
+
+> [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/386311) from **Overview > Jobs** to **CI/CD > Jobs** in GitLab 15.8.
+
+You can administer all jobs in the GitLab instance from the Admin Area's Jobs page.
+
+To access the Jobs page:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **CI/CD > Jobs**. All jobs are listed, in descending order of job ID.
+1. Select the **All** tab to list all jobs. Select the **Pending**, **Running**, or **Finished**
+ tab to list only jobs of that status.
+
+For each job, the following details are listed:
+
+| Field | Description |
+|----------|-------------|
+| Status | Job status, either **passed**, **skipped**, or **failed**. |
+| Job | Includes links to the job, branch, and the commit that started the job. |
+| Pipeline | Includes a link to the specific pipeline. |
+| Project | Name of the project, and organization, to which the job belongs. |
+| Runner | Name of the CI runner assigned to execute the job. |
+| Stage | Stage that the job is declared in a `.gitlab-ci.yml` file. |
+| Name | Name of the job specified in a `.gitlab-ci.yml` file. |
+| Timing | Duration of the job, and how long ago the job completed. |
+| Coverage | Percentage of tests coverage. |
+
+## Monitoring section
+
+The following topics document the **Monitoring** section of the Admin Area.
+
+### System Information
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/341248) in GitLab 15.2, support for relative time. "Uptime" statistic was renamed to "System started".
+
+The **System Info** page provides the following statistics:
+
+| Field | Description |
+|:---------------|:--------------------------------------------------|
+| CPU | Number of CPU cores available |
+| Memory Usage | Memory in use, and total memory available |
+| Disk Usage | Disk space in use, and total disk space available |
+| System started | When the system hosting GitLab was started. In GitLab 15.1 and earlier, this was an uptime statistic. |
+
+These statistics are updated only when you navigate to the **System Info** page, or you refresh the page in your browser.
+
+### Background Jobs
+
+The **Background Jobs** page displays the Sidekiq dashboard. Sidekiq is used by GitLab to
+perform processing in the background.
+
+The Sidekiq dashboard consists of the following elements:
+
+- A tab per jobs' status.
+- A breakdown of background job statistics.
+- A live graph of **Processed** and **Failed** jobs, with a selectable polling interval.
+- An historical graph of **Processed** and **Failed** jobs, with a selectable time span.
+- Redis statistics, including:
+ - Version number
+ - Uptime, measured in days
+ - Number of connections
+ - Current memory usage, measured in MB
+ - Peak memory usage, measured in MB
+
+### Logs
+
+Since GitLab 13.0, **Log** view has been removed from the Admin Area dashboard since the logging does not work in multi-node setups and could cause confusion for administrators by displaying partial information.
+
+For multi-node systems we recommend ingesting the logs into services like Elasticsearch and Splunk.
+
+| Log file | Contents |
+|:------------------------|:---------|
+| `application_json.log` | GitLab user activity |
+| `git_json.log` | Failed GitLab interaction with Git repositories |
+| `production.log` | Requests received from Puma, and the actions taken to serve those requests |
+| `sidekiq.log` | Background jobs |
+| `repocheck.log` | Repository activity |
+| `integrations_json.log` | Activity between GitLab and integrated systems |
+| `kubernetes.log` | Kubernetes activity |
+
+The contents of these log files can be useful when troubleshooting a problem.
+
+For details of these log files and their contents, see [Log system](logs/index.md).
+
+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.
+
+### 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/administration/analytics/dev_ops_reports.md b/doc/administration/analytics/dev_ops_reports.md
new file mode 100644
index 00000000000..1dcee5ec03d
--- /dev/null
+++ b/doc/administration/analytics/dev_ops_reports.md
@@ -0,0 +1,74 @@
+---
+stage: Plan
+group: Optimize
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# DevOps Reports **(FREE SELF)**
+
+DevOps Reports give you an overview of your entire instance's adoption of
+[Concurrent DevOps](https://about.gitlab.com/topics/concurrent-devops/)
+from planning to monitoring.
+
+To see DevOps Reports:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Analytics > DevOps Reports**.
+
+## DevOps Score
+
+> [Renamed](https://gitlab.com/gitlab-org/gitlab/-/issues/20976) from Conversational Development Index in GitLab 12.6.
+
+NOTE:
+To see the DevOps score, you must activate your GitLab instance's [Service Ping](../settings/usage_statistics.md#service-ping). DevOps Score is a comparative tool, so your score data must be centrally processed by GitLab Inc. first.
+
+You can use the DevOps score to compare your DevOps status to other organizations.
+
+The DevOps Score tab displays usage of major GitLab features on your instance over
+the last 30 days, averaged over the number of billable users in that time period.
+You can also see the Leader usage score, calculated from top-performing instances based on
+[Service Ping data](../settings/usage_statistics.md#service-ping) that GitLab has collected.
+Your score is compared to the lead score of each feature and then expressed
+as a percentage at the bottom of said feature. Your overall **DevOps Score** is an average of your
+feature scores.
+
+Service Ping data is aggregated on GitLab servers for analysis. Your usage
+information is **not sent** to any other GitLab instances.
+If you have just started using GitLab, it might take a few weeks for data to be collected before this
+feature is available.
+
+## DevOps Adoption **(ULTIMATE SELF)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/247112) in GitLab 13.7 as a [Beta feature](../../policy/experiment-beta-support.md#beta).
+> - The Overview tab [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/330401) in GitLab 14.1.
+> - DAST and SAST metrics [added](https://gitlab.com/gitlab-org/gitlab/-/issues/328033) in GitLab 14.1.
+> - Fuzz Testing metrics [added](https://gitlab.com/gitlab-org/gitlab/-/issues/330398) in GitLab 14.2.
+> - Dependency Scanning metrics [added](https://gitlab.com/gitlab-org/gitlab/-/issues/328034) in GitLab 14.2.
+> - Multi-select [added](https://gitlab.com/gitlab-org/gitlab/-/issues/333586) in GitLab 14.2.
+> - Overview table [added](https://gitlab.com/gitlab-org/gitlab/-/issues/335638) in GitLab 14.3.
+
+DevOps Adoption shows feature adoption for development, security, and operations.
+
+| Category | Feature |
+| --- | --- |
+| Development | Approvals<br>Code owners<br>Issues<br>Merge requests |
+| Security | DAST<br>Dependency Scanning<br>Fuzz Testing<br>SAST |
+| Operations | Deployments<br>Pipelines<br>Runners |
+
+You can use Group DevOps Adoption to:
+
+- Identify specific subgroups that are lagging in their adoption of GitLab features, so you can guide them on
+their DevOps journey.
+- Find subgroups that have adopted certain features, and provide guidance to other subgroups on
+how to use those features.
+- Verify if you are getting the return on investment that you expected from GitLab.
+
+## Add or remove a group
+
+To add or remove a subgroup from the DevOps Adoption report:
+
+1. Select **Add or remove groups**.
+1. Select the subgroup you want to add or remove and select **Save changes**.
+
+![DevOps Adoption](img/admin_devops_adoption_v14_2.png)
diff --git a/doc/user/admin_area/analytics/img/admin_devops_adoption_v14_2.png b/doc/administration/analytics/img/admin_devops_adoption_v14_2.png
index 666e03f1d9d..666e03f1d9d 100644
--- a/doc/user/admin_area/analytics/img/admin_devops_adoption_v14_2.png
+++ b/doc/administration/analytics/img/admin_devops_adoption_v14_2.png
Binary files differ
diff --git a/doc/user/admin_area/analytics/img/instance_activity_pipelines_chart_v13_6_a.png b/doc/administration/analytics/img/instance_activity_pipelines_chart_v13_6_a.png
index bd02065556c..bd02065556c 100644
--- a/doc/user/admin_area/analytics/img/instance_activity_pipelines_chart_v13_6_a.png
+++ b/doc/administration/analytics/img/instance_activity_pipelines_chart_v13_6_a.png
Binary files differ
diff --git a/doc/administration/analytics/index.md b/doc/administration/analytics/index.md
new file mode 100644
index 00000000000..6441cd866c8
--- /dev/null
+++ b/doc/administration/analytics/index.md
@@ -0,0 +1,26 @@
+---
+stage: Plan
+group: Optimize
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Instance-level analytics **(FREE SELF)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/41416) in GitLab 11.2.
+
+Instance-level analytics provide insights into the feature and data usage of your entire instance.
+
+## View instance-level analytics
+
+Prerequisite:
+
+- You must have administrator access to the instance.
+
+To view instance-level analytics:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Analytics**, then one of the available analytics:
+
+ - [DevOps Reports](dev_ops_reports.md): Provides an overview of your entire instance's feature usage.
+ - [Usage Trends](usage_trends.md): Shows how much data your instance contains, and how the data is changing.
diff --git a/doc/administration/analytics/usage_trends.md b/doc/administration/analytics/usage_trends.md
new file mode 100644
index 00000000000..49e82f71a3a
--- /dev/null
+++ b/doc/administration/analytics/usage_trends.md
@@ -0,0 +1,46 @@
+---
+stage: Plan
+group: Optimize
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Usage Trends **(FREE SELF)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/235754) in GitLab 13.5 behind a feature flag, disabled by default.
+> - [Became enabled by default](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/46962) in GitLab 13.6.
+> - [Renamed](https://gitlab.com/gitlab-org/gitlab/-/issues/285220) from Instance Statistics to Usage Trends in GitLab 13.6.
+> - It's enabled on GitLab.com.
+> - It's recommended for production use.
+
+Usage Trends gives you an overview of how much data your instance contains, and how quickly this volume is changing over time.
+Usage Trends data refreshes daily.
+
+## View Usage Trends
+
+To view Usage Trends:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Analytics > Usage Trends**.
+
+## Total counts
+
+At the top of the page, Usage Trends shows total counts for:
+
+- Users
+- Projects
+- Groups
+- Issues
+- Merge requests
+- Pipelines
+
+These figures can be useful for understanding how much data your instance contains in total.
+
+## Past year trend charts
+
+Usage Trends also displays line charts that show total counts per month, over the past 12 months,
+in the categories shown in [Total counts](#total-counts).
+
+These charts help you visualize how rapidly these records are being created on your instance.
+
+![Instance Activity Pipelines chart](img/instance_activity_pipelines_chart_v13_6_a.png)
diff --git a/doc/administration/appearance.md b/doc/administration/appearance.md
new file mode 100644
index 00000000000..c5c50d95eb6
--- /dev/null
+++ b/doc/administration/appearance.md
@@ -0,0 +1,123 @@
+---
+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/product/ux/technical-writing/#assignments
+---
+
+# GitLab Appearance **(FREE SELF)**
+
+Several options are available for customizing the appearance of a self-managed instance
+of GitLab. To access these settings:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Appearance**.
+
+## Navigation bar
+
+By default, the navigation bar has the GitLab logo, but this can be customized with
+any image desired. It is optimized for images 28px high (any width), but any image can be
+used (less than 1 MB) and it is automatically resized.
+
+After you select and upload an image, select **Update appearance settings** at the bottom
+of the page to activate it in the GitLab instance.
+
+NOTE:
+GitLab pipeline emails also display the custom logo, unless the logo is in SVG format. If the
+custom logo is in SVG format, the default logo is used instead because the SVG format is not
+supported by many email clients.
+
+## Favicon
+
+By default, the favicon (used by the browser as the tab icon, as well as the CI status icon)
+uses the GitLab logo. This can be customized with any icon desired. It must be a
+32x32 `.png` or `.ico` image.
+
+After you select and upload an icon, select **Update appearance settings** at the bottom
+of the page to activate it in the GitLab instance.
+
+## System header and footer messages
+
+> **Enable header and footer in emails** checkbox [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/344819) in GitLab 15.9.
+
+You can add a small header message, a small footer message, or both, to the interface
+of your GitLab instance. These messages appear on all projects and pages of the
+instance, including the sign in / sign up page. The default color is white text on
+an orange background, but this can be customized by selecting **Customize colors**.
+
+Limited [Markdown](../user/markdown.md) is supported, such as bold, italics, and links, for
+example. Other Markdown features, including lists, images, and quotes are not supported
+as the header and footer messages can only be a single line.
+
+You can select **Enable header and footer in emails** to have the text of
+the header and footer added to all emails sent by the GitLab instance.
+
+After you add a message, select **Update appearance settings** at the bottom of the page
+to activate it in the GitLab instance.
+
+## Sign in / Sign up pages
+
+You can replace the default message on the sign in / sign up page with your own message
+and logo. You can make full use of [Markdown](../user/markdown.md) in the description.
+
+The optimal size for the logo is 128 x 128 pixels, but any image can be used (below 1 MB)
+and it is resized automatically. The logo image appears between the title and
+the description, on the left of the sign-up page.
+
+After you add a message, select **Update appearance settings** at the bottom of the page
+to activate it in the GitLab instance. You can also select **Sign-in page**,
+to review the saved appearance settings:
+
+NOTE:
+You can add also add a [customized hcelp message](settings/help_page.md) below the sign in message or add [a Sign in text message](settings/sign_in_restrictions.md#sign-in-information).
+
+## Progressive Web App
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/375708) in GitLab 15.9.
+
+GitLab can be installed as a [Progressive Web App](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps) (PWA).
+Use the Progressive Web App settings to customize its appearance, including its name,
+description, and icon.
+
+### Configure the PWA settings
+
+To configure the PWA settings:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Appearance**.
+1. Scroll to the **Progressive Web App (PWA)** section.
+1. Complete the fields.
+ - **Icon**: If you use the standard GitLab icon, it is available in sizes 192x192 pixels,
+ 512x512 pixels, also as a maskable icon. If you use a custom icon, it must be in either size
+ 192x192 pixels, or 512x512 pixels.
+1. Select **Update appearance settings**.
+
+## New project pages
+
+You can add a new project guidelines message to the **New project page** in GitLab.
+You can make full use of [Markdown](../user/markdown.md) in the description:
+
+The message is displayed below the **New Project** message, on the left side
+of the **New project page**.
+
+After you add a message, select **Update appearance settings** at the bottom of the page
+to activate it in the GitLab instance. You can also select **New project page**,
+which brings you to the new project page so you can review the change.
+
+## Libravatar
+
+[Libravatar](https://www.libravatar.org) is supported by GitLab for avatar images, but you must
+[manually enable Libravatar support on the GitLab instance](../administration/libravatar.md) to use the service.
+
+<!-- ## 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, for example `### Getting error message X`.
+If you have none to add when creating a doc, leave this section in place
+but commented out to help encourage others to add to it in the future. -->
diff --git a/doc/administration/audit_event_streaming/graphql_api.md b/doc/administration/audit_event_streaming/graphql_api.md
index f5a31f073dc..9f8fef0e3ca 100644
--- a/doc/administration/audit_event_streaming/graphql_api.md
+++ b/doc/administration/audit_event_streaming/graphql_api.md
@@ -14,6 +14,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - Custom HTTP headers API [made generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/366524) in GitLab 15.3. [Feature flag `streaming_audit_event_headers`](https://gitlab.com/gitlab-org/gitlab/-/issues/362941) removed.
> - User-specified verification token API support [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/360813) in GitLab 15.4.
> - APIs for custom HTTP headers for instance level streaming destinations [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/404560) in GitLab 16.1 [with a flag](../feature_flags.md) named `ff_external_audit_events`. Disabled by default.
+> - [Feature flag `ff_external_audit_events`](https://gitlab.com/gitlab-org/gitlab/-/issues/393772) enabled by default in GitLab 16.2.
+> - User-specified destination name API support [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/413894) in GitLab 16.2.
Audit event streaming destinations can be maintained using a GraphQL API.
@@ -38,6 +40,7 @@ mutation {
errors
externalAuditEventDestination {
id
+ name
destinationUrl
verificationToken
group {
@@ -59,6 +62,28 @@ mutation {
errors
externalAuditEventDestination {
id
+ name
+ destinationUrl
+ verificationToken
+ group {
+ name
+ }
+ }
+ }
+}
+```
+
+You can optionally specify your own destination name (instead of the default GitLab-generated one) using the GraphQL
+`externalAuditEventDestinationCreate`
+mutation. Name length must not exceed 72 characters and trailing whitespace are not trimmed. This value should be unique scoped to a group. For example:
+
+```graphql
+mutation {
+ externalAuditEventDestinationCreate(input: { destinationUrl: "https://mydomain.io/endpoint/ingest", name: "destination-name-here", groupPath: "my-group" }) {
+ errors
+ externalAuditEventDestination {
+ id
+ name
destinationUrl
verificationToken
group {
@@ -90,11 +115,12 @@ The header is created if the returned `errors` object is empty.
### Instance streaming destinations
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/335175) in GitLab 16.0 [with a flag](../feature_flags.md) named `ff_external_audit_events`. Disabled by default.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/335175) in GitLab 16.0 [with a flag](../feature_flags.md) named `ff_external_audit_events`. Disabled by default.
+> - [Feature flag `ff_external_audit_events`](https://gitlab.com/gitlab-org/gitlab/-/issues/393772) enabled by default in GitLab 16.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](../feature_flags.md) named
-`ff_external_audit_events`. On GitLab.com, this feature is not available. The feature is not ready for production use.
+On self-managed GitLab, by default this feature is enabled. To disable it, an administrator can [disable the feature flag](../feature_flags.md) named
+`ff_external_audit_events`. On GitLab.com, this feature is available but can be configured by GitLab.com administrators only. The feature is ready for production use.
Prerequisites:
@@ -110,6 +136,7 @@ mutation {
instanceExternalAuditEventDestination {
destinationUrl
id
+ name
verificationToken
}
}
@@ -121,6 +148,24 @@ Event streaming is enabled if:
- The returned `errors` object is empty.
- The API responds with `200 OK`.
+You can optionally specify your own destination name (instead of the default GitLab-generated one) using the GraphQL
+`instanceExternalAuditEventDestinationCreate`
+mutation. Name length must not exceed 72 characters and trailing whitespace are not trimmed. This value should be unique. For example:
+
+```graphql
+mutation {
+ instanceExternalAuditEventDestinationCreate(input: { destinationUrl: "https://mydomain.io/endpoint/ingest", name: "destination-name-here"}) {
+ errors
+ instanceExternalAuditEventDestination {
+ destinationUrl
+ id
+ name
+ verificationToken
+ }
+ }
+}
+```
+
Instance administrators can add an HTTP header using the GraphQL `auditEventsStreamingInstanceHeadersCreate` mutation. You can retrieve the destination ID
by [listing all the streaming destinations](#list-streaming-destinations) for the instance or from the mutation above.
@@ -144,6 +189,39 @@ mutation {
The header is created if the returned `errors` object is empty.
+### Google Cloud Logging streaming
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/409422) in GitLab 16.1.
+
+Prerequisites:
+
+- Owner role for a top-level group.
+- A Google Cloud project with the necessary permissions to create service accounts and enable Google Cloud Logging.
+
+To enable streaming and add a configuration, use the
+`googleCloudLoggingConfigurationCreate` mutation in the GraphQL API.
+
+```graphql
+mutation {
+ googleCloudLoggingConfigurationCreate(input: { groupPath: "my-group", googleProjectIdName: "my-google-project", clientEmail: "my-email@my-google-project.iam.gservice.account.com", privateKey: "YOUR_PRIVATE_KEY", logIdName: "audit-events" } ) {
+ errors
+ googleCloudLoggingConfiguration {
+ id
+ googleProjectIdName
+ logIdName
+ privateKey
+ clientEmail
+ }
+ errors
+ }
+}
+```
+
+Event streaming is enabled if:
+
+- The returned `errors` object is empty.
+- The API responds with `200 OK`.
+
## List streaming destinations
List new streaming destinations for top-level groups or an entire instance.
@@ -166,6 +244,7 @@ query {
destinationUrl
verificationToken
id
+ name
headers {
nodes {
key
@@ -184,11 +263,12 @@ If the resulting list is empty, then audit streaming is not enabled for that gro
### Instance streaming destinations
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/335175) in GitLab 16.0 [with a flag](../feature_flags.md) named `ff_external_audit_events`. Disabled by default.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/335175) in GitLab 16.0 [with a flag](../feature_flags.md) named `ff_external_audit_events`. Disabled by default.
+> - [Feature flag `ff_external_audit_events`](https://gitlab.com/gitlab-org/gitlab/-/issues/393772) enabled by default in GitLab 16.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](../feature_flags.md) named
-`ff_external_audit_events`. On GitLab.com, this feature is not available. The feature is not ready for production use.
+On self-managed GitLab, by default this feature is enabled. To disable it, an administrator can [disable the feature flag](../feature_flags.md) named
+`ff_external_audit_events`. On GitLab.com, this feature is available but can be configured by GitLab.com administrators only. The feature is ready for production use.
Prerequisites:
@@ -202,6 +282,7 @@ query {
instanceExternalAuditEventDestinations {
nodes {
id
+ name
destinationUrl
verificationToken
headers {
@@ -220,6 +301,38 @@ If the resulting list is empty, then audit streaming is not enabled for the inst
You need the ID values returned by this query for the update and delete mutations.
+### Google Cloud Logging configurations
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/409422) in GitLab 16.1.
+
+Prerequisite:
+
+- Owner role for a top-level group.
+
+You can view a list of streaming configurations for a top-level group using the `googleCloudLoggingConfigurations` query
+type.
+
+```graphql
+query {
+ group(fullPath: "my-group") {
+ id
+ googleCloudLoggingConfigurations {
+ nodes {
+ id
+ logIdName
+ googleProjectIdName
+ privateKey
+ clientEmail
+ }
+ }
+ }
+}
+```
+
+If the resulting list is empty, then audit streaming is not enabled for the group.
+
+You need the ID values returned by this query for the update and delete mutations.
+
## Update streaming destinations
Update streaming destinations for a top-level group or an entire instance.
@@ -236,8 +349,20 @@ by [listing all the custom HTTP headers](#list-streaming-destinations) for the g
```graphql
mutation {
- externalAuditEventDestinationDestroy(input: { id: destination }) {
+ externalAuditEventDestinationUpdate(input: {
+ id:"gid://gitlab/AuditEvents::ExternalAuditEventDestination/1",
+ destinationUrl: "https://www.new-domain.com/webhook",
+ name: "destination-name"} ) {
errors
+ externalAuditEventDestination {
+ id
+ name
+ destinationUrl
+ verificationToken
+ group {
+ name
+ }
+ }
}
}
```
@@ -262,11 +387,12 @@ The header is deleted if the returned `errors` object is empty.
### Instance streaming destinations
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/335175) in GitLab 16.0 [with a flag](../feature_flags.md) named `ff_external_audit_events`. Disabled by default.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/335175) in GitLab 16.0 [with a flag](../feature_flags.md) named `ff_external_audit_events`. Disabled by default.
+> - [Feature flag `ff_external_audit_events`](https://gitlab.com/gitlab-org/gitlab/-/issues/393772) enabled by default in GitLab 16.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](../feature_flags.md) named
-`ff_external_audit_events`. On GitLab.com, this feature is not available. The feature is not ready for production use.
+On self-managed GitLab, by default this feature is enabled. To disable it, an administrator can [disable the feature flag](../feature_flags.md) named
+`ff_external_audit_events`. On GitLab.com, this feature is available but can be configured by GitLab.com administrators only. The feature is ready for production use.
Prerequisites:
@@ -278,11 +404,15 @@ by [listing all the external destinations](#list-streaming-destinations) for the
```graphql
mutation {
- instanceExternalAuditEventDestinationUpdate(input: { id: "gid://gitlab/AuditEvents::InstanceExternalAuditEventDestination/1", destinationUrl: "https://www.new-domain.com/webhook"}) {
+ instanceExternalAuditEventDestinationUpdate(input: {
+ id: "gid://gitlab/AuditEvents::InstanceExternalAuditEventDestination/1",
+ destinationUrl: "https://www.new-domain.com/webhook",
+ name: "destination-name"}) {
errors
instanceExternalAuditEventDestination {
destinationUrl
id
+ name
verificationToken
}
}
@@ -313,6 +443,40 @@ mutation {
The header is updated if the returned `errors` object is empty.
+### Google Cloud Logging configurations
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/409422) in GitLab 16.1.
+
+Prerequisite:
+
+- Owner role for a top-level group.
+
+To update streaming configuration for a top-level group, use the
+`googleCloudLoggingConfigurationUpdate` mutation type. You can retrieve the configuration ID
+by [listing all the external destinations](#list-streaming-destinations).
+
+```graphql
+mutation {
+ googleCloudLoggingConfigurationUpdate(
+ input: {id: "gid://gitlab/AuditEvents::GoogleCloudLoggingConfiguration/1", googleProjectIdName: "my-google-project", clientEmail: "my-email@my-google-project.iam.gservice.account.com", privateKey: "YOUR_PRIVATE_KEY", logIdName: "audit-events"}
+ ) {
+ errors
+ googleCloudLoggingConfiguration {
+ id
+ logIdName
+ privateKey
+ googleProjectIdName
+ clientEmail
+ }
+ }
+}
+```
+
+Streaming configuration is updated if:
+
+- The returned `errors` object is empty.
+- The API responds with `200 OK`.
+
## Delete streaming destinations
Delete streaming destinations for a top-level group or an entire instance.
@@ -357,11 +521,12 @@ The header is deleted if the returned `errors` object is empty.
### Instance streaming destinations
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/335175) in GitLab 16.0 [with a flag](../feature_flags.md) named `ff_external_audit_events`. Disabled by default.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/335175) in GitLab 16.0 [with a flag](../feature_flags.md) named `ff_external_audit_events`. Disabled by default.
+> - [Feature flag `ff_external_audit_events`](https://gitlab.com/gitlab-org/gitlab/-/issues/393772) enabled by default in GitLab 16.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](../feature_flags.md) named
-`ff_external_audit_events`. On GitLab.com, this feature is not available. The feature is not ready for production use.
+On self-managed GitLab, by default this feature is enabled. To disable it, an administrator can [disable the feature flag](../feature_flags.md) named
+`ff_external_audit_events`. On GitLab.com, this feature is available but can be configured by GitLab.com administrators only. The feature is ready for production use.
Prerequisites:
@@ -384,6 +549,45 @@ Streaming destination is deleted if:
- The returned `errors` object is empty.
- The API responds with `200 OK`.
+To remove an HTTP header, use the GraphQL `auditEventsStreamingInstanceHeadersDestroy` mutation.
+To retrieve the header ID,
+[list all the custom HTTP headers](#list-streaming-destinations) for the instance.
+
+```graphql
+mutation {
+ auditEventsStreamingInstanceHeadersDestroy(input: { headerId: "gid://gitlab/AuditEvents::Streaming::InstanceHeader/<id>" }) {
+ errors
+ }
+}
+```
+
+The header is deleted if the returned `errors` object is empty.
+
+### Google Cloud Logging configurations
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/409422) in GitLab 16.1.
+
+Prerequisite:
+
+- Owner role for a top-level group.
+
+Users with the Owner role for a group can delete streaming configurations using the
+`googleCloudLoggingConfigurationDestroy` mutation type. You can retrieve the configurations ID
+by [listing all the streaming destinations](#list-streaming-destinations) for the group.
+
+```graphql
+mutation {
+ googleCloudLoggingConfigurationDestroy(input: { id: "gid://gitlab/AuditEvents::GoogleCloudLoggingConfiguration/1" }) {
+ errors
+ }
+}
+```
+
+Streaming configuration is deleted if:
+
+- The returned `errors` object is empty.
+- The API responds with `200 OK`.
+
## Event type filters
> Event type filters API [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/344845) in GitLab 15.7.
diff --git a/doc/administration/audit_event_streaming/index.md b/doc/administration/audit_event_streaming/index.md
index 44c6cff7455..622d29fa9a7 100644
--- a/doc/administration/audit_event_streaming/index.md
+++ b/doc/administration/audit_event_streaming/index.md
@@ -41,7 +41,7 @@ To add streaming destinations to a top-level group:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your group.
1. Select **Secure > Audit events**.
1. On the main area, select **Streams** tab.
-1. Select **Add streaming destination** to show the section for adding destinations.
+1. Select **Add streaming destination** and select **HTTP endpoint** to show the section for adding destinations.
1. Enter the destination URL to add.
1. Optional. Locate the **Custom HTTP headers** table.
1. Ignore the **Active** checkbox because it isn't functional. To track progress on adding functionality to the
@@ -50,13 +50,14 @@ To add streaming destinations to a top-level group:
20 headers per streaming destination.
1. After all headers have been filled out, select **Add** to add the new streaming destination.
-### Instance streaming destinations
+### Instance streaming destinations **(ULTIMATE SELF)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/398107) in GitLab 16.1 [with a flag](../feature_flags.md) named `instance_streaming_audit_events`. Disabled by default.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/398107) in GitLab 16.1 [with a flag](../feature_flags.md) named `ff_external_audit_events`. Disabled by default.
+> - [Feature flag `ff_external_audit_events`](https://gitlab.com/gitlab-org/gitlab/-/issues/393772) enabled by default in GitLab 16.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](../feature_flags.md) named
-`instance_streaming_audit_events`. On GitLab.com, this feature is not available. The feature is not ready for production use.
+On self-managed GitLab, by default this feature is enabled. To disable it, an administrator can [disable the feature flag](../feature_flags.md) named
+`ff_external_audit_events`. On GitLab.com, this feature is available but can be configured by GitLab.com administrators only. The feature is ready for production use.
Prerequisites:
@@ -68,8 +69,30 @@ To add a streaming destination for an instance:
1. Select **Admin Area**.
1. On the left sidebar, select **Monitoring > Audit Events**.
1. On the main area, select **Streams** tab.
-1. Select **Add streaming destination** to show the section for adding destinations.
+1. Select **Add streaming destination** and select **HTTP endpoint** to show the section for adding destinations.
1. Enter the destination URL to add.
+1. Optional. To add custom HTTP headers, select **Add header** to create a new name and value pair, and input their values. Repeat this step for as many name and value pairs are required. You can add up to 20 headers per streaming destination.
+1. Ignore the **Active** checkbox because it isn't functional. To track progress on adding functionality to the
+ **Active** checkbox, see [issue 367509](https://gitlab.com/gitlab-org/gitlab/-/issues/367509).
+1. Select **Add header** to create a new name and value pair. Repeat this step for as many name and value pairs are required. You can add up to
+ 20 headers per streaming destination.
+1. After all headers have been filled out, select **Add** to add the new streaming destination.
+
+### Google Cloud Logging streaming
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124384) in GitLab 16.2.
+
+Prerequisites:
+
+- Owner role for a top-level group.
+
+To add Google Cloud Logging streaming destinations to a top-level group:
+
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your group.
+1. Select **Secure > Audit events**.
+1. On the main area, select **Streams** tab.
+1. Select **Add streaming destination** and select **Google Cloud Logging** to show the section for adding destinations.
+1. Enter the Google Project ID, Google Client Email, Log ID, and Google Private Key to add.
1. Select **Add** to add the new streaming destination.
## List streaming destinations
@@ -87,15 +110,16 @@ To list the streaming destinations for a top-level group:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your group.
1. Select **Secure > Audit events**.
1. On the main area, select **Streams** tab.
-1. To the right of the item, select **Edit** (**{pencil}**) to see all the custom HTTP headers.
+1. Select the stream URL to expand it and see all the custom HTTP headers.
### For instance streaming destinations
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/398107) in GitLab 16.1 [with a flag](../feature_flags.md) named `instance_streaming_audit_events`. Disabled by default.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/398107) in GitLab 16.1 [with a flag](../feature_flags.md) named `ff_external_audit_events`. Disabled by default.
+> - [Feature flag `ff_external_audit_events`](https://gitlab.com/gitlab-org/gitlab/-/issues/393772) enabled by default in GitLab 16.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](../feature_flags.md) named
-`instance_streaming_audit_events`. On GitLab.com, this feature is not available. The feature is not ready for production use.
+On self-managed GitLab, by default this feature is enabled. To disable it, an administrator can [disable the feature flag](../feature_flags.md) named
+`ff_external_audit_events`. On GitLab.com, this feature is available but can be configured by GitLab.com administrators only. The feature is ready for production use.
Prerequisites:
@@ -108,6 +132,21 @@ To list the streaming destinations for an instance:
1. On the left sidebar, select **Monitoring > Audit Events**.
1. On the main area, select **Streams** tab.
+### Google Cloud Logging streaming
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124384) in GitLab 16.2.
+
+Prerequisites:
+
+- Owner role for a top-level group.
+
+To list Google Cloud Logging streaming destinations for a top-level group:
+
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your group.
+1. Select **Secure > Audit events**.
+1. On the main area, select **Streams** tab.
+1. Select the Google Cloud Logging stream to expand and see all the fields.
+
## Update streaming destinations
Update streaming destinations for a top-level group or an entire instance.
@@ -123,6 +162,33 @@ To update a streaming destination's custom HTTP headers:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your group.
1. Select **Secure > Audit events**.
1. On the main area, select **Streams** tab.
+1. Select the stream URL to expand.
+1. Locate the **Custom HTTP headers** table.
+1. Locate the header that you wish to update.
+1. Ignore the **Active** checkbox because it isn't functional. To track progress on adding functionality to the
+ **Active** checkbox, see [issue 367509](https://gitlab.com/gitlab-org/gitlab/-/issues/367509).
+1. Select **Add header** to create a new name and value pair. Enter as many name and value pairs as required. You can add up to
+ 20 headers per streaming destination.
+1. Select **Save** to update the streaming destination.
+
+### Instance streaming destinations **(ULTIMATE SELF)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/398107) in GitLab 16.1 [with a flag](../feature_flags.md) named `ff_external_audit_events`. Disabled by default.
+> - [Feature flag `ff_external_audit_events`](https://gitlab.com/gitlab-org/gitlab/-/issues/393772) enabled by default in GitLab 16.2.
+
+FLAG:
+On self-managed GitLab, by default this feature is enabled. To disable it, an administrator can [disable the feature flag](../feature_flags.md) named
+`ff_external_audit_events`. On GitLab.com, this feature is available but can be configured by GitLab.com administrators only. The feature is ready for production use.
+
+Prerequisites:
+
+- Administrator access on the instance.
+
+To update the streaming destinations for an instance:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Secure > Audit events**.
+1. On the main area, select the **Streams** tab.
1. To the right of the item, select **Edit** (**{pencil}**).
1. Locate the **Custom HTTP headers** table.
1. Locate the header that you wish to update.
@@ -132,6 +198,23 @@ To update a streaming destination's custom HTTP headers:
20 headers per streaming destination.
1. Select **Save** to update the streaming destination.
+### Google Cloud Logging streaming
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124384) in GitLab 16.2.
+
+Prerequisites:
+
+- Owner role for a top-level group.
+
+To update Google Cloud Logging streaming destinations to a top-level group:
+
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your group.
+1. Select **Secure > Audit events**.
+1. On the main area, select **Streams** tab.
+1. Select the Google Cloud Logging stream to expand.
+1. Enter the Google Project ID, Google Client Email, Log ID, and Google Private Key to update.
+1. Select **Save** to update the streaming destination.
+
## Delete streaming destinations
Delete streaming destinations for a top-level group or an entire instance. When the last destination is successfully
@@ -148,14 +231,16 @@ To delete a streaming destination:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your group.
1. Select **Secure > Audit events**.
1. On the main area, select the **Streams** tab.
-1. To the right of the item, select **Delete** (**{remove}**).
+1. Select the stream URL to expand.
+1. Select **Delete destination**.
+1. Confirm by selecting **Delete destination** in the modal.
To delete only the custom HTTP headers for a streaming destination:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your group.
1. Select **Secure > Audit events**.
1. On the main area, select the **Streams** tab.
-1. To the right of the item, **Edit** (**{pencil}**).
+1. Select the stream URL to expand.
1. Locate the **Custom HTTP headers** table.
1. Locate the header that you wish to remove.
1. To the right of the header, select **Delete** (**{remove}**).
@@ -163,11 +248,12 @@ To delete only the custom HTTP headers for a streaming destination:
### Instance streaming destinations
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/398107) in GitLab 16.1 [with a flag](../feature_flags.md) named `instance_streaming_audit_events`. Disabled by default.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/398107) in GitLab 16.1 [with a flag](../feature_flags.md) named `ff_external_audit_events`. Disabled by default.
+> - [Feature flag `ff_external_audit_events`](https://gitlab.com/gitlab-org/gitlab/-/issues/393772) enabled by default in GitLab 16.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](../feature_flags.md) named
-`instance_streaming_audit_events`. On GitLab.com, this feature is not available. The feature is not ready for production use.
+On self-managed GitLab, by default this feature is enabled. To disable it, an administrator can [disable the feature flag](../feature_flags.md) named
+`ff_external_audit_events`. On GitLab.com, this feature is available but can be configured by GitLab.com administrators only. The feature is ready for production use.
Prerequisites:
@@ -179,7 +265,38 @@ To delete the streaming destinations for an instance:
1. Select **Admin Area**.
1. On the left sidebar, select **Monitoring > Audit Events**.
1. On the main area, select the **Streams** tab.
-1. To the right of the item, select **Delete** (**{remove}**).
+1. Select the stream URL to expand.
+1. Select **Delete destination**.
+1. Confirm by selecting **Delete destination** in the modal.
+
+To delete only the custom HTTP headers for a streaming destination:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. On the left sidebar, select **Monitoring > Audit Events**.
+1. On the main area, select the **Streams** tab.
+1. To the right of the item, **Edit** (**{pencil}**).
+1. Locate the **Custom HTTP headers** table.
+1. Locate the header that you wish to remove.
+1. To the right of the header, select **Delete** (**{remove}**).
+1. Select **Save** to update the streaming destination.
+
+### Google Cloud Logging streaming
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124384) in GitLab 16.2.
+
+Prerequisites:
+
+- Owner role for a top-level group.
+
+To delete Google Cloud Logging streaming destinations to a top-level group:
+
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your group.
+1. Select **Secure > Audit events**.
+1. On the main area, select the **Streams** tab.
+1. Select the Google Cloud Logging stream to expand.
+1. Select **Delete destination**.
+1. Confirm by selecting **Delete destination** in the modal.
## Verify event authenticity
@@ -204,15 +321,17 @@ To list streaming destinations and see the verification tokens:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your group.
1. Select **Secure > Audit events**.
1. On the main area, select the **Streams**.
-1. View the verification token on the right side of each item.
+1. Select the stream URL to expand.
+1. Locate the **Verification token** input.
### Instance streaming destinations
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/398107) in GitLab 16.1 [with a flag](../feature_flags.md) named `instance_streaming_audit_events`. Disabled by default.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/398107) in GitLab 16.1 [with a flag](../feature_flags.md) named `ff_external_audit_events`. Disabled by default.
+> - [Feature flag `ff_external_audit_events`](https://gitlab.com/gitlab-org/gitlab/-/issues/393772) enabled by default in GitLab 16.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](../feature_flags.md) named
-`instance_streaming_audit_events`. On GitLab.com, this feature is not available. The feature is not ready for production use.
+On self-managed GitLab, by default this feature is enabled. To disable it, an administrator can [disable the feature flag](../feature_flags.md) named
+`ff_external_audit_events`. On GitLab.com, this feature is available but can be configured by GitLab.com administrators only. The feature is ready for production use.
Prerequisites:
@@ -226,6 +345,25 @@ To list streaming destinations for an instance and see the verification tokens:
1. On the main area, select the **Streams**.
1. View the verification token on the right side of each item.
+## Event type filters
+
+> Event type filtering in the UI with a defined list of audit event types [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/413581) in GitLab 16.1.
+
+When this feature is enabled for a group, you can permit users to filter streamed audit events per destination.
+If the feature is enabled with no filters, the destination receives all audit events.
+
+A streaming destination that has an event type filter set has a **filtered** (**{filter}**) label.
+
+To update a streaming destination's event filters:
+
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your group.
+1. Select **Secure > Audit events**.
+1. On the main area, select the **Streams** tab.
+1. Select the stream URL to expand.
+1. Locate the **Filter by audit event type** dropdown.
+1. Select the dropdown list and select or clear the required event types.
+1. Select **Save** to update the event filters.
+
## Override default content type header
By default, streaming destinations use a `content-type` header of `application/x-www-form-urlencoded`. However, you
diff --git a/doc/administration/audit_events.md b/doc/administration/audit_events.md
index e924da39145..69c97982562 100644
--- a/doc/administration/audit_events.md
+++ b/doc/administration/audit_events.md
@@ -49,7 +49,7 @@ You can view audit events scoped to a group or project.
To view a group's audit events:
1. Go to the group.
-1. On the left sidebar, select **Security and Compliance > Audit Events**.
+1. On the left sidebar, select **Secure > Audit events**.
Group events do not include project audit events. Group events can also be accessed using the
[Group Audit Events API](../api/audit_events.md#group-audit-events). Group event queries are limited to a maximum of 30
@@ -58,7 +58,7 @@ days.
To view a project's audit events:
1. Go to the project.
-1. On the left sidebar, select **Security & Compliance > Audit Events**.
+1. On the left sidebar, select **Secure > Audit events**.
Project events can also be accessed using the [Project Audit Events API](../api/audit_events.md#project-audit-events).
Project event queries are limited to a maximum of 30 days.
@@ -119,7 +119,7 @@ The first row contains the headers, which are listed in the following table alon
Successful sign-in events are the only audit events available at all tiers. To see successful sign-in events:
-1. Select your avatar.
+1. On the left sidebar, select your avatar.
1. Select **Edit profile > Authentication log**.
After upgrading to a paid tier, you can also see successful sign-in events on audit event pages.
@@ -140,7 +140,7 @@ From audit events pages, different filters are available depending on the page y
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/536) in GitLab 13.0.
> - Impersonation session events included in group audit events in GitLab 14.8.
-When a user is [impersonated](../user/admin_area/index.md#user-impersonation), their actions are logged as audit events
+When a user is [impersonated](../administration/admin_area.md#user-impersonation), their actions are logged as audit events
with additional details:
- Audit events include information about the impersonating administrator. These audit events are visible in audit event
@@ -362,6 +362,10 @@ GitLab generates audit events when a cluster agent token is created or revoked.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/276250) in GitLab 13.6, audit events for when a user is approved using the Admin Area.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/276921) in GitLab 13.6, audit events for when a user's personal access token is successfully or unsuccessfully created or revoked.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/298783) in GitLab 13.9, audit events for when a user requests access to an instance or is rejected using the Admin Area.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/238177) in
+ GitLab 15.1, audit events when a user's two-factor authentication is disabled.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124169) in GitLab 16.2, audit events when a user's access is locked.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124973) in GitLab 16.2, audit events when a user's access is unlocked.
The following user actions on a GitLab instance generate instance audit events:
@@ -373,8 +377,9 @@ The following user actions on a GitLab instance generate instance audit events:
- Grant OAuth access.
- Failed second-factor authentication attempt.
- A user's personal access token was successfully or unsuccessfully created or revoked.
-- A user's two-factor authentication was disabled. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/238177) in
- GitLab 15.1.
+- A user's two-factor authentication was disabled.
+- A user's access is locked.
+- A user's access is unlocked.
#### User management
@@ -400,6 +405,13 @@ The following user actions on a GitLab instance generate instance audit events:
Instance events can also be accessed using the [Instance Audit Events API](../api/audit_events.md#instance-audit-events).
+#### Application settings **(PREMIUM)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/282428) in GitLab 16.2.
+
+When a user changes an application setting in an instance, project, or group,
+that change and the user that made the change are recorded in the audit log.
+
### GitLab Runner events
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/335509) in GitLab 14.8, audit events for when a runner is registered.
diff --git a/doc/administration/auditor_users.md b/doc/administration/auditor_users.md
index 3b6992c92e0..e8ed0eb4313 100644
--- a/doc/administration/auditor_users.md
+++ b/doc/administration/auditor_users.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
Users with auditor access have read-only access to all groups, projects, and other resources except:
-- The [Admin Area](../user/admin_area/index.md).
+- The [Admin Area](../administration/admin_area.md).
- Project and group settings.
For more information, see [Auditor user permissions and restrictions](#auditor-user-permissions-and-restrictions)
@@ -50,9 +50,9 @@ users with auditor access have the same [permissions](../user/permissions.md) as
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,
+- Have full access to the projects and groups you own.
+- Have read-only access to the projects and groups you are not a member of.
+- Have [permissions](../user/permissions.md) based on your role to projects and groups 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 a4484da5940..1905a009eb6 100644
--- a/doc/administration/auth/ldap/index.md
+++ b/doc/administration/auth/ldap/index.md
@@ -25,7 +25,7 @@ Users added through LDAP:
- Usually use a [licensed seat](../../../subscriptions/self_managed/index.md#billable-users).
- Can authenticate with Git using either their GitLab username or their email and LDAP password,
even if password authentication for Git
- [is disabled](../../../user/admin_area/settings/sign_in_restrictions.md#password-authentication-enabled).
+ [is disabled](../../settings/sign_in_restrictions.md#password-authentication-enabled).
The LDAP DN is associated with existing GitLab users when:
@@ -1000,13 +1000,13 @@ authenticated with the TLS protocol.
Users deleted from the LDAP server:
- Are immediately blocked from signing in to GitLab.
-- [No longer consume a license](../../../user/admin_area/moderate_users.md).
+- [No longer consume a license](../../../administration/moderate_users.md).
However, these users can continue to use Git with SSH until the next time the
[LDAP check cache runs](ldap_synchronization.md#adjust-ldap-user-sync-schedule).
To delete the account immediately, you can manually
-[block the user](../../../user/admin_area/moderate_users.md#block-a-user).
+[block the user](../../../administration/moderate_users.md#block-a-user).
## Update user email addresses
diff --git a/doc/administration/auth/ldap/ldap-troubleshooting.md b/doc/administration/auth/ldap/ldap-troubleshooting.md
index 9fb3888b995..8cffff7b725 100644
--- a/doc/administration/auth/ldap/ldap-troubleshooting.md
+++ b/doc/administration/auth/ldap/ldap-troubleshooting.md
@@ -378,7 +378,7 @@ things to debug the situation.
an LDAP DN as the `Identifier`. If not, this user hasn't signed in with
LDAP yet and must do so first.
- You've waited an hour or [the configured interval](ldap_synchronization.md#adjust-ldap-group-sync-schedule) for
- the group to sync. To speed up the process, either go to the GitLab group **Group information > Members**
+ the group to sync. To speed up the process, either go to the GitLab group **Manage > Members**
and press **Sync now** (sync one group) or [run the group sync Rake task](../../raketasks/ldap.md#run-a-group-sync)
(sync all groups).
@@ -447,7 +447,7 @@ A displayed error can identify the problem and point to a solution. For example,
```ruby
irb(main):018:0> group.members.map(&:errors).map(&:full_messages)
-=> [["The member's email address is not allowed for this group. Go to the group’s &#39;Settings &gt; General&#39; page, and check &#39;Restrict membership by email domain&#39;."]]
+=> [["The member's email address is not allowed for this group. Go to the group's &#39;Settings &gt; General&#39; page, and check &#39;Restrict membership by email domain&#39;."]]
```
This error showed that an Administrator chose to [restrict group membership by email domain](../../../user/group/access_and_permissions.md#restrict-group-access-by-domain),
@@ -737,7 +737,7 @@ To resolve this error, you must apply a new license to the GitLab instance witho
1. Remove or comment out the GitLab configuration lines for all non-primary LDAP servers.
1. [Reconfigure GitLab](../../restart_gitlab.md#reconfigure-a-linux-package-installation) so that it temporarily uses only one LDAP server.
-1. Enter the [Rails console and add the license key](../../../user/admin_area/license_file.md#add-a-license-through-the-console).
+1. Enter the [Rails console and add the license key](../../../administration/license_file.md#add-a-license-through-the-console).
1. Re-enable the additional LDAP servers in the GitLab configuration and reconfigure GitLab again.
## Users are being removed from group and re-added again
diff --git a/doc/administration/auth/ldap/ldap_synchronization.md b/doc/administration/auth/ldap/ldap_synchronization.md
index e4b43feacc2..9d9ed563fe5 100644
--- a/doc/administration/auth/ldap/ldap_synchronization.md
+++ b/doc/administration/auth/ldap/ldap_synchronization.md
@@ -40,7 +40,7 @@ For more information, see [Bitmask Searches in LDAP](https://ctovswild.com/2009/
The process also updates the following user information:
- Name. Because of a [sync issue](https://gitlab.com/gitlab-org/gitlab/-/issues/342598), `name` is not synchronized if
- [**Prevent users from changing their profile name**](../../../user/admin_area/settings/account_and_limit_settings.md#disable-user-profile-name-changes) is enabled or `sync_name` is set to `false`.
+ [**Prevent users from changing their profile name**](../../../administration/settings/account_and_limit_settings.md#disable-user-profile-name-changes) is enabled or `sync_name` is set to `false`.
- Email address.
- SSH public keys if `sync_ssh_keys` is set.
- Kerberos identity if Kerberos is enabled.
@@ -627,7 +627,7 @@ sync to run once every two hours at the top of the hour.
### External groups
Using the `external_groups` setting allows you to mark all users belonging
-to these groups as [external users](../../../user/admin_area/external_users.md).
+to these groups as [external users](../../../administration/external_users.md).
Group membership is checked periodically through the `LdapGroupSync` background
task.
diff --git a/doc/administration/auth/oidc.md b/doc/administration/auth/oidc.md
index 23d2ab512db..d48de109bd0 100644
--- a/doc/administration/auth/oidc.md
+++ b/doc/administration/auth/oidc.md
@@ -757,8 +757,8 @@ For more information, see the [GitLab API user method documentation](https://pyt
You can configure OIDC group membership to:
- Require users to be members of a certain group.
-- Assign users [external roles](../../user/admin_area/external_users.md), or as
- administrators based on group membership.
+- Assign users [external](../external_users.md), administrator or
+ [auditor](../auditor_users.md) roles based on group membership.
GitLab checks these groups on each sign in and updates user attributes as necessary.
This feature **does not** allow you to automatically add users to GitLab
@@ -845,12 +845,12 @@ For self-compiled installations:
### External groups
Your IdP must pass group information to GitLab in the OIDC response. To use this
-response to identify users as [external users](../../user/admin_area/external_users.md)
+response to identify users as [external users](../external_users.md)
based on group membership, configure GitLab to identify:
- Where to look for the groups in the OIDC response, using the `groups_attribute` setting.
- Which group memberships should identify a user as an
- [external user](../../user/admin_area/external_users.md), using the
+ [external user](../external_users.md), using the
`external_groups` setting.
For Linux package installations:
@@ -921,6 +921,83 @@ For self-compiled installations:
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#installations-from-source)
for the changes to take effect.
+### Auditor groups **(PREMIUM SELF)**
+
+Your IdP must pass group information to GitLab in the OIDC response. To use this
+response to assign users as auditors based on group membership, configure GitLab to identify:
+
+- Where to look for the groups in the OIDC response, using the `groups_attribute` setting.
+- Which group memberships grant the user auditor access, using the `auditor_groups`
+ setting.
+
+For Linux package installations:
+
+1. Edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitlab_rails['omniauth_providers'] = [
+ {
+ name: "openid_connect",
+ label: "Provider name",
+ args: {
+ name: "openid_connect",
+ scope: ["openid","profile","email","groups"],
+ response_type: "code",
+ issuer: "<your_oidc_url>",
+ discovery: true,
+ client_auth_method: "query",
+ uid_field: "<uid_field>",
+ client_options: {
+ identifier: "<your_oidc_client_id>",
+ secret: "<your_oidc_client_secret>",
+ redirect_uri: "<your_gitlab_url>/users/auth/openid_connect/callback",
+ gitlab: {
+ groups_attribute: "groups",
+ auditor_groups: ["Auditor"]
+ }
+ }
+ }
+ }
+ ]
+ ```
+
+1. Save the file and [reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-package-installation)
+ for the changes to take effect.
+
+For self-compiled installations:
+
+1. Edit `/home/git/gitlab/config/gitlab.yml`:
+
+ ```yaml
+ production: &base
+ omniauth:
+ providers:
+ - { name: 'openid_connect',
+ label: 'Provider name',
+ args: {
+ name: 'openid_connect',
+ scope: ['openid','profile','email','groups'],
+ response_type: 'code',
+ issuer: '<your_oidc_url>',
+ discovery: true,
+ client_auth_method: 'query',
+ uid_field: '<uid_field>',
+ client_options: {
+ identifier: '<your_oidc_client_id>',
+ secret: '<your_oidc_client_secret>',
+ redirect_uri: '<your_gitlab_url>/users/auth/openid_connect/callback',
+ gitlab: {
+ groups_attribute: "groups",
+ auditor_groups: ["Auditor"]
+ }
+ }
+ }
+ }
+ ```
+
+1. Save the file and [reconfigure GitLab](../restart_gitlab.md#installations-from-source)
+ for the changes to take effect.
+
### Administrator groups
Your IdP must pass group information to GitLab in the OIDC response. To use this
diff --git a/doc/administration/auth/smartcard.md b/doc/administration/auth/smartcard.md
index 9432a627ed7..5802db78dd6 100644
--- a/doc/administration/auth/smartcard.md
+++ b/doc/administration/auth/smartcard.md
@@ -17,7 +17,7 @@ By default, existing users can continue to sign in with a username and password
authentication is enabled.
To force existing users to use only smartcard authentication,
-[disable username and password authentication](../../user/admin_area/settings/sign_in_restrictions.md#password-authentication-enabled).
+[disable username and password authentication](../settings/sign_in_restrictions.md#password-authentication-enabled).
## Authentication methods
diff --git a/doc/administration/backup_restore/backup_gitlab.md b/doc/administration/backup_restore/backup_gitlab.md
new file mode 100644
index 00000000000..24b7b453517
--- /dev/null
+++ b/doc/administration/backup_restore/backup_gitlab.md
@@ -0,0 +1,1925 @@
+---
+stage: Systems
+group: Geo
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Back up GitLab **(FREE SELF)**
+
+The exact procedure for backing up GitLab depends on many factors. Your particular deployment's usage and configuration determine what kind of data exists, where it is located, and how much there is. These factors influence your options for how to perform a back up, how to store it, and how to restore it.
+
+## Simple back up procedure
+
+As a rough guideline, if you are using a [1k reference architecture](../reference_architectures/1k_users.md) with less than 100 GB of data, then follow these steps:
+
+1. Run the [backup command](#backup-command).
+1. Back up [object storage](#object-storage), if applicable.
+1. Manually back up [configuration files](#storing-configuration-files).
+
+## Scaling backups
+
+As the volume of GitLab data grows, the [backup command](#backup-command) takes longer to execute. At some point, the execution time becomes impractical. For example, it can take 24 hours or more.
+
+For more information, see [alternative backup strategies](#alternative-backup-strategies).
+
+## What data needs to be backed up?
+
+- [PostgreSQL databases](#postgresql-databases)
+- [Git repositories](#git-repositories)
+- [Blobs](#blobs)
+- [Configuration files](#storing-configuration-files)
+- [Other data](#other-data)
+
+### PostgreSQL databases
+
+In the simplest case, GitLab has one PostgreSQL database in one PostgreSQL server on the same VM as all other GitLab services. But depending on configuration, GitLab may use multiple PostgreSQL databases in multiple PostgreSQL servers.
+
+In general, this data is the single source of truth for most user-generated content in the Web interface, such as issue and merge request content, comments, permissions, and credentials.
+
+PostgreSQL also holds some cached data like HTML-rendered Markdown, and by default, merge request diffs.
+However, merge request diffs can also be configured to be offloaded to the file system or object storage, see [Blobs](#blobs).
+
+Gitaly Cluster's Praefect service uses a PostgreSQL database as a single source of truth to manage its Gitaly nodes.
+
+A common PostgreSQL utility, [`pg_dump`](https://www.postgresql.org/docs/current/app-pgdump.html), produces a backup file which can be used to restore a PostgreSQL database. The [backup command](#backup-command) uses this utility under the hood.
+
+Unfortunately, the larger the database, the longer it takes `pg_dump` to execute. Depending on your situation, the duration becomes impractical at some point (days, for example). If your database is over 100 GB, `pg_dump`, and by extension the [backup command](#backup-command), is likely not usable. For more information, see [alternative backup strategies](#alternative-backup-strategies).
+
+### Git repositories
+
+A GitLab instance can have one or more repository shards. Each shard is a Gitaly instance or Gitaly Cluster that
+is responsible for allowing access and operations on the locally stored Git repositories. Gitaly can run
+on a machine:
+
+- With a single disk.
+- With multiple disks mounted as a single mount-point (like with a RAID array).
+- Using LVM.
+
+Each project can have up to 3 different repositories:
+
+- A project repository, where the source code is stored.
+- A wiki repository, where the wiki content is stored.
+- A design repository, where design artifacts are indexed (assets are actually in LFS).
+
+They all live in the same shard and share the same base name with a `-wiki` and `-design` suffix
+for Wiki and Design Repository cases.
+
+Personal and project snippets, and group wiki content, are stored in Git repositories.
+
+Project forks are deduplicated in live a GitLab site using pool repositories.
+
+The [backup command](#backup-command) produces a Git bundle for each repository and tars them all up. This duplicates pool repository data into every fork. In [our testing](https://gitlab.com/gitlab-org/gitlab/-/issues/396343), 100 GB of Git repositories took a little over 2 hours to back up and upload to S3. At around 400 GB of Git data, the backup command is likely not viable for regular backups. For more information, see [alternative backup strategies](#alternative-backup-strategies).
+
+### Blobs
+
+GitLab stores blobs (or files) such as issue attachments or LFS objects into either:
+
+- The file system in a specific location.
+- An [Object Storage](../object_storage.md) solution. Object Storage solutions can be:
+ - Cloud based like Amazon S3 and Google Cloud Storage.
+ - Hosted by you (like MinIO).
+ - A Storage Appliance that exposes an Object Storage-compatible API.
+
+#### Object storage
+
+The [backup command](#backup-command) doesn't back up blobs that aren't stored on the file system. If you're using [object storage](../object_storage.md), be sure to enable backups with your object storage provider. For example, see:
+
+- [Amazon S3 backups](https://docs.aws.amazon.com/aws-backup/latest/devguide/s3-backups.html)
+- [Google Cloud Storage Transfer Service](https://cloud.google.com/storage-transfer-service) and [Google Cloud Storage Object Versioning](https://cloud.google.com/storage/docs/object-versioning)
+
+### Storing configuration files
+
+WARNING:
+The [backup Rake task](#back-up-gitlab) GitLab provides does _not_ store your configuration files. The primary reason for this is that your database contains items including encrypted information for two-factor authentication and the CI/CD _secure variables_. Storing encrypted information in the same location as its key defeats the purpose of using encryption in the first place. For example, the secrets file contains your database encryption key. If you lose it, then the GitLab application will not be able to decrypt any encrypted values in the database.
+
+WARNING:
+The secrets file may change after upgrades.
+
+You should back up the configuration directory. At the very **minimum**, you must back up:
+
+::Tabs
+
+:::TabTitle Linux package
+
+- `/etc/gitlab/gitlab-secrets.json`
+- `/etc/gitlab/gitlab.rb`
+
+For more information, see [Backup and restore Linux package (Omnibus) configuration](https://docs.gitlab.com/omnibus/settings/backups.html#backup-and-restore-omnibus-gitlab-configuration).
+
+:::TabTitle Self-compiled
+
+- `/home/git/gitlab/config/secrets.yml`
+- `/home/git/gitlab/config/gitlab.yml`
+
+:::TabTitle Docker
+
+- Back up the volume where the configuration files are stored. If you created
+the GitLab container according to the documentation, it should be in the
+`/srv/gitlab/config` directory.
+
+:::TabTitle GitLab Helm chart
+
+- Follow the [Back up the secrets](https://docs.gitlab.com/charts/backup-restore/backup.html#back-up-the-secrets)
+instructions.
+
+::EndTabs
+
+You may also want to back up any TLS keys and certificates (`/etc/gitlab/ssl`, `/etc/gitlab/trusted-certs`), and your
+[SSH host keys](https://superuser.com/questions/532040/copy-ssh-keys-from-one-server-to-another-server/532079#532079)
+to avoid man-in-the-middle attack warnings if you have to perform a full machine restore.
+
+In the unlikely event that the secrets file is lost, see the
+[troubleshooting section](#when-the-secrets-file-is-lost).
+
+### Other data
+
+GitLab uses Redis both as a cache store and to hold persistent data for our background jobs system, Sidekiq. The provided [backup command](#backup-command) does _not_ back up Redis data. This means that in order to take a consistent backup with the [backup command](#backup-command), there must be no pending or running background jobs. It is possible to [manually back up Redis](https://redis.io/docs/management/persistence/#backing-up-redis-data).
+
+Elasticsearch is an optional database for advanced search. It can improve search
+in both source-code level, and user generated content in issues, merge requests, and discussions. The [backup command](#backup-command) does _not_ back up Elasticsearch data. Elasticsearch data can be regenerated from PostgreSQL data after a restore. It is possible to [manually back up Elasticsearch](https://www.elastic.co/guide/en/elasticsearch/reference/current/snapshot-restore.html).
+
+## Command line interface
+
+GitLab provides a command line interface to back up your entire instance,
+including:
+
+- Database
+- Attachments
+- Git repositories data
+- CI/CD job output logs
+- CI/CD job artifacts
+- LFS objects
+- Terraform states ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/331806) in GitLab 14.7)
+- Container Registry images
+- GitLab Pages content
+- Packages ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/332006) in GitLab 14.7)
+- Snippets
+- [Group wikis](../../user/project/wiki/group.md)
+- Project-level Secure Files ([introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/121142) in GitLab 16.1)
+
+Backups do not include:
+
+- [Mattermost data](https://docs.mattermost.com/administration/config-settings.html#file-storage)
+- Redis (and thus Sidekiq jobs)
+- [Object storage](#object-storage)
+
+WARNING:
+GitLab does not back up any configuration files (`/etc/gitlab`), TLS keys and certificates, or system
+files. You are highly advised to read about [storing configuration files](#storing-configuration-files).
+
+### Requirements
+
+To be able to back up and restore, ensure that Rsync is installed on your
+system. If you installed GitLab:
+
+- Using the Linux package, Rsync is already installed.
+- Using self-compiled, check if `rsync` is installed. If Rsync is not installed, install it. For example:
+
+ ```shell
+ # Debian/Ubuntu
+ sudo apt-get install rsync
+
+ # RHEL/CentOS
+ sudo yum install rsync
+ ```
+
+### Backup command
+
+WARNING:
+The backup command does not back up items in [object storage](#object-storage).
+
+WARNING:
+The backup command requires [additional parameters](#back-up-and-restore-for-installations-using-pgbouncer) when
+your installation is using PgBouncer, for either performance reasons or when using it with a Patroni cluster.
+
+WARNING:
+Before GitLab 15.5.0, the backup command doesn't verify if another backup is already running, as described in
+[issue 362593](https://gitlab.com/gitlab-org/gitlab/-/issues/362593). We strongly recommend
+you make sure that all backups are complete before starting a new one.
+
+NOTE:
+You can only restore a backup to **exactly the same version and type (CE/EE)**
+of GitLab on which it was created.
+
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
+
+```shell
+sudo gitlab-backup create
+```
+
+:::TabTitle Helm chart (Kubernetes)
+
+Run the backup task by using `kubectl` to run the `backup-utility` script on the GitLab toolbox pod. For more details, see the [charts backup documentation](https://docs.gitlab.com/charts/backup-restore/backup.html).
+
+:::TabTitle Docker
+
+Run the backup from the host.
+
+- GitLab 12.2 or later:
+
+```shell
+docker exec -t <container name> gitlab-backup create
+```
+
+:::TabTitle Self-compiled
+
+```shell
+sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production
+```
+
+::EndTabs
+
+If your GitLab deployment has multiple nodes, you need to pick a node for running the backup command. You must ensure that the designated node:
+
+- is persistent, and not subject to auto-scaling.
+- has the GitLab Rails application already installed. If Puma or Sidekiq is running, then Rails is installed.
+- has sufficient storage and memory to produce the backup file.
+
+Example output:
+
+```plaintext
+Dumping database tables:
+- Dumping table events... [DONE]
+- Dumping table issues... [DONE]
+- Dumping table keys... [DONE]
+- Dumping table merge_requests... [DONE]
+- Dumping table milestones... [DONE]
+- Dumping table namespaces... [DONE]
+- Dumping table notes... [DONE]
+- Dumping table projects... [DONE]
+- Dumping table protected_branches... [DONE]
+- Dumping table schema_migrations... [DONE]
+- Dumping table services... [DONE]
+- Dumping table snippets... [DONE]
+- Dumping table taggings... [DONE]
+- Dumping table tags... [DONE]
+- Dumping table users... [DONE]
+- Dumping table users_projects... [DONE]
+- Dumping table web_hooks... [DONE]
+- Dumping table wikis... [DONE]
+Dumping repositories:
+- Dumping repository abcd... [DONE]
+Creating backup archive: $TIMESTAMP_gitlab_backup.tar [DONE]
+Deleting tmp directories...[DONE]
+Deleting old backups... [SKIPPING]
+```
+
+### Backup timestamp
+
+The backup archive is saved in `backup_path`, which is specified in the
+`config/gitlab.yml` file. The default path is `/var/opt/gitlab/backups`. The filename is `[TIMESTAMP]_gitlab_backup.tar`,
+where `TIMESTAMP` identifies the time at which each backup was created, plus
+the GitLab version. The timestamp is needed if you need to restore GitLab and
+multiple backups are available.
+
+For example, if the backup name is `1493107454_2018_04_25_10.6.4-ce_gitlab_backup.tar`,
+the timestamp is `1493107454_2018_04_25_10.6.4-ce`.
+
+### Backup options
+
+The command line tool GitLab provides to back up your instance can accept more
+options.
+
+#### Backup strategy option
+
+The default backup strategy is to essentially stream data from the respective
+data locations to the backup using the Linux command `tar` and `gzip`. This works
+fine in most cases, but can cause problems when data is rapidly changing.
+
+When data changes while `tar` is reading it, the error `file changed as we read
+it` may occur, and causes the backup process to fail. In that case, you can use
+the backup strategy called `copy`. The strategy copies data files
+to a temporary location before calling `tar` and `gzip`, avoiding the error.
+
+A side-effect is that the backup process takes up to an additional 1X disk
+space. The process does its best to clean up the temporary files at each stage
+so the problem doesn't compound, but it could be a considerable change for large
+installations.
+
+To use the `copy` strategy instead of the default streaming strategy, specify
+`STRATEGY=copy` in the Rake task command. For example:
+
+```shell
+sudo gitlab-backup create STRATEGY=copy
+```
+
+#### Backup filename
+
+WARNING:
+If you use a custom backup filename, you can't
+[limit the lifetime of the backups](#limit-backup-lifetime-for-local-files-prune-old-backups).
+
+By default, a backup file is created according to the specification in the
+previous [Backup timestamp](#backup-timestamp) section. You can, however,
+override the `[TIMESTAMP]` portion of the filename by setting the `BACKUP`
+environment variable. For example:
+
+```shell
+sudo gitlab-backup create BACKUP=dump
+```
+
+The resulting file is named `dump_gitlab_backup.tar`. This is useful for
+systems that make use of rsync and incremental backups, and results in
+considerably faster transfer speeds.
+
+#### Confirm archive can be transferred
+
+To ensure the generated archive is transferable by rsync, you can set the `GZIP_RSYNCABLE=yes`
+option. This sets the `--rsyncable` option to `gzip`, which is useful only in
+combination with setting [the Backup filename option](#backup-filename).
+
+The `--rsyncable` option in `gzip` isn't guaranteed to be available
+on all distributions. To verify that it's available in your distribution, run
+`gzip --help` or consult the man pages.
+
+```shell
+sudo gitlab-backup create BACKUP=dump GZIP_RSYNCABLE=yes
+```
+
+#### Excluding specific directories from the backup
+
+You can exclude specific directories from the backup by adding the environment variable `SKIP`, whose values are a comma-separated list of the following options:
+
+- `db` (database)
+- `uploads` (attachments)
+- `builds` (CI job output logs)
+- `artifacts` (CI job artifacts)
+- `lfs` (LFS objects)
+- `terraform_state` (Terraform states)
+- `registry` (Container Registry images)
+- `pages` (Pages content)
+- `repositories` (Git repositories data)
+- `packages` (Packages)
+- `ci_secure_files` (Project-level Secure Files)
+
+NOTE:
+When [backing up and restoring Helm Charts](https://docs.gitlab.com/charts/architecture/backup-restore.html), there is an additional option `packages`, which refers to any packages managed by the GitLab [package registry](../../user/packages/package_registry/index.md).
+For more information see [command line arguments](https://docs.gitlab.com/charts/architecture/backup-restore.html#command-line-arguments).
+
+All wikis are backed up as part of the `repositories` group. Non-existent
+wikis are skipped during a backup.
+
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
+
+```shell
+sudo gitlab-backup create SKIP=db,uploads
+```
+
+:::TabTitle Self-compiled
+
+```shell
+sudo -u git -H bundle exec rake gitlab:backup:create SKIP=db,uploads RAILS_ENV=production
+```
+
+::EndTabs
+
+`SKIP=` is also used to:
+
+- [Skip creation of the tar file](#skipping-tar-creation) (`SKIP=tar`).
+- [Skip uploading the backup to remote storage](#skip-uploading-backups-to-remote-storage) (`SKIP=remote`).
+
+#### Skipping tar creation
+
+NOTE:
+It is not possible to skip the tar creation when using [object storage](#upload-backups-to-a-remote-cloud-storage) for backups.
+
+The last part of creating a backup is generation of a `.tar` file containing all the parts. In some cases, creating a `.tar` file might be wasted effort or even directly harmful, so you can skip this step by adding `tar` to the `SKIP` environment variable. Example use-cases:
+
+- When the backup is picked up by other backup software.
+- To speed up incremental backups by avoiding having to extract the backup every time. (In this case, `PREVIOUS_BACKUP` and `BACKUP` must not be specified, otherwise the specified backup is extracted, but no `.tar` file is generated at the end.)
+
+Adding `tar` to the `SKIP` variable leaves the files and directories containing the
+backup in the directory used for the intermediate files. These files are
+overwritten when a new backup is created, so you should make sure they are copied
+elsewhere, because you can only have one backup on the system.
+
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
+
+```shell
+sudo gitlab-backup create SKIP=tar
+```
+
+:::TabTitle Self-compiled
+
+```shell
+sudo -u git -H bundle exec rake gitlab:backup:create SKIP=tar RAILS_ENV=production
+```
+
+::EndTabs
+
+#### Back up Git repositories concurrently
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37158) in GitLab 13.3.
+> - [Concurrent restore introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69330) in GitLab 14.3
+
+When using [multiple repository storages](../repository_storage_paths.md),
+repositories can be backed up or restored concurrently to help fully use CPU time. The
+following variables are available to modify the default behavior of the Rake
+task:
+
+- `GITLAB_BACKUP_MAX_CONCURRENCY`: The maximum number of projects to back up at
+ the same time. Defaults to the number of logical CPUs (in GitLab 14.1 and
+ earlier, defaults to `1`).
+- `GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY`: The maximum number of projects to
+ back up at the same time on each storage. This allows the repository backups
+ to be spread across storages. Defaults to `2` (in GitLab 14.1 and earlier,
+ defaults to `1`).
+
+For example, with 4 repository storages:
+
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
+
+```shell
+sudo gitlab-backup create GITLAB_BACKUP_MAX_CONCURRENCY=4 GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY=1
+```
+
+:::TabTitle Self-compiled
+
+```shell
+sudo -u git -H bundle exec rake gitlab:backup:create GITLAB_BACKUP_MAX_CONCURRENCY=4 GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY=1
+```
+
+::EndTabs
+
+#### Incremental repository backups
+
+> - Introduced in GitLab 14.9 [with a flag](../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, an administrator can [disable the feature flag](../feature_flags.md) named `incremental_repository_backup`.
+On GitLab.com, this feature is not available.
+
+NOTE:
+Only repositories support incremental backups. Therefore, if you use `INCREMENTAL=yes`, the task
+creates a self-contained backup tar archive. This is because all subtasks except repositories are
+still creating full backups (they overwrite the existing full backup).
+See [issue 19256](https://gitlab.com/gitlab-org/gitlab/-/issues/19256) for a feature request to
+support incremental backups for all subtasks.
+
+Incremental repository backups can be faster than full repository backups because they only pack changes since the last backup into the backup bundle for each repository.
+The incremental backup archives are not linked to each other: each archive is a self-contained backup of the instance. 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:
+
+- In GitLab 15.0 or later:
+
+ ```shell
+ sudo gitlab-backup create INCREMENTAL=yes PREVIOUS_BACKUP=<timestamp_of_backup>
+ ```
+
+- In GitLab 14.9 and 14.10:
+
+ ```shell
+ sudo gitlab-backup create INCREMENTAL=yes BACKUP=<timestamp_of_backup>
+ ```
+
+To create an [untarred](#skipping-tar-creation) incremental backup from a tarred backup, use `SKIP=tar`:
+
+```shell
+sudo gitlab-backup create INCREMENTAL=yes SKIP=tar
+```
+
+#### Back up specific repository storages
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86896) in GitLab 15.0.
+
+When using [multiple repository storages](../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:
+
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
+
+```shell
+sudo gitlab-backup create REPOSITORIES_STORAGES=storage1,storage2
+```
+
+:::TabTitle Self-compiled
+
+```shell
+sudo -u git -H bundle exec rake gitlab:backup:create REPOSITORIES_STORAGES=storage1,storage2
+```
+
+::EndTabs
+
+#### Back up specific repositories
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/88094) in GitLab 15.1.
+
+You can back up specific repositories using the `REPOSITORIES_PATHS` option.
+Similarly, you can use `SKIP_REPOSITORIES_PATHS` to skip certain repositories.
+Both options accept a comma-separated list of project or group paths. If you
+specify a group path, all repositories in all projects in the group and
+descendent groups are included or skipped, depending on which option you used.
+
+For example, to back up all repositories for all projects in **Group A** (`group-a`), the repository for **Project C** in **Group B** (`group-b/project-c`),
+and skip the **Project D** in **Group A** (`group-a/project-d`):
+
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
+
+ ```shell
+ sudo gitlab-backup create REPOSITORIES_PATHS=group-a,group-b/project-c SKIP_REPOSITORIES_PATHS=group-a/project-d
+ ```
+
+:::TabTitle Self-compiled
+
+ ```shell
+ sudo -u git -H bundle exec rake gitlab:backup:create REPOSITORIES_PATHS=group-a,group-b/project-c SKIP_REPOSITORIES_PATHS=group-a/project-d
+ ```
+
+::EndTabs
+
+#### Upload backups to a remote (cloud) storage
+
+NOTE:
+It is not possible to [skip the tar creation](#skipping-tar-creation) when using object storage for backups.
+
+You can let the backup script upload (using the [Fog library](https://fog.io/))
+the `.tar` file it creates. In the following example, we use Amazon S3 for
+storage, but Fog also lets you use [other storage providers](https://fog.io/storage/).
+GitLab also [imports cloud drivers](https://gitlab.com/gitlab-org/gitlab/-/blob/da46c9655962df7d49caef0e2b9f6bbe88462a02/Gemfile#L113)
+for AWS, Google, and Aliyun. A local driver is
+[also available](#upload-to-locally-mounted-shares).
+
+[Read more about using object storage with GitLab](../object_storage.md).
+
+##### Using Amazon S3
+
+For Linux package (Omnibus):
+
+1. Add the following to `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitlab_rails['backup_upload_connection'] = {
+ 'provider' => 'AWS',
+ 'region' => 'eu-west-1',
+ 'aws_access_key_id' => 'AKIAKIAKI',
+ 'aws_secret_access_key' => 'secret123'
+ # If using an IAM Profile, don't configure aws_access_key_id & aws_secret_access_key
+ # 'use_iam_profile' => true
+ }
+ gitlab_rails['backup_upload_remote_directory'] = 'my.s3.bucket'
+ # Consider using multipart uploads when file size reaches 100MB. Enter a number in bytes.
+ # gitlab_rails['backup_multipart_chunk_size'] = 104857600
+ ```
+
+1. [Reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-package-installation)
+ for the changes to take effect
+
+##### S3 Encrypted Buckets
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64765) in GitLab 14.3.
+
+AWS supports these [modes for server side encryption](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html):
+
+- Amazon S3-Managed Keys (SSE-S3)
+- Customer Master Keys (CMKs) Stored in AWS Key Management Service (SSE-KMS)
+- Customer-Provided Keys (SSE-C)
+
+Use your mode of choice with GitLab. Each mode has similar, but slightly
+different, configuration methods.
+
+###### SSE-S3
+
+To enable SSE-S3, in the backup storage options set the `server_side_encryption`
+field to `AES256`. For example, in the Linux package (Omnibus):
+
+```ruby
+gitlab_rails['backup_upload_storage_options'] = {
+ 'server_side_encryption' => 'AES256'
+}
+```
+
+###### SSE-KMS
+
+To enable SSE-KMS, you need the
+[KMS key via its Amazon Resource Name (ARN) in the `arn:aws:kms:region:acct-id:key/key-id` format](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html).
+Under the `backup_upload_storage_options` configuration setting, set:
+
+- `server_side_encryption` to `aws:kms`.
+- `server_side_encryption_kms_key_id` to the ARN of the key.
+
+For example, in the Linux package (Omnibus):
+
+```ruby
+gitlab_rails['backup_upload_storage_options'] = {
+ 'server_side_encryption' => 'aws:kms',
+ 'server_side_encryption_kms_key_id' => 'arn:aws:<YOUR KMS KEY ID>:'
+}
+```
+
+###### SSE-C
+
+SSE-C requires you to set these encryption options:
+
+- `backup_encryption`: AES256.
+- `backup_encryption_key`: Unencoded, 32-byte (256 bits) key. The upload fails if this isn't exactly 32 bytes.
+
+For example, in the Linux package (Omnibus):
+
+```ruby
+gitlab_rails['backup_encryption'] = 'AES256'
+gitlab_rails['backup_encryption_key'] = '<YOUR 32-BYTE KEY HERE>'
+```
+
+If the key contains binary characters and cannot be encoded in UTF-8,
+instead, specify the key with the `GITLAB_BACKUP_ENCRYPTION_KEY` environment variable.
+For example:
+
+```ruby
+gitlab_rails['env'] = { 'GITLAB_BACKUP_ENCRYPTION_KEY' => "\xDE\xAD\xBE\xEF" * 8 }
+```
+
+##### Digital Ocean Spaces
+
+This example can be used for a bucket in Amsterdam (AMS3):
+
+1. Add the following to `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitlab_rails['backup_upload_connection'] = {
+ 'provider' => 'AWS',
+ 'region' => 'ams3',
+ 'aws_access_key_id' => 'AKIAKIAKI',
+ 'aws_secret_access_key' => 'secret123',
+ 'endpoint' => 'https://ams3.digitaloceanspaces.com'
+ }
+ gitlab_rails['backup_upload_remote_directory'] = 'my.s3.bucket'
+ ```
+
+1. [Reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-package-installation)
+ for the changes to take effect
+
+If you see a `400 Bad Request` error message when using Digital Ocean Spaces,
+the cause may be the use of backup encryption. Because Digital Ocean Spaces
+doesn't support encryption, remove or comment the line that contains
+`gitlab_rails['backup_encryption']`.
+
+##### Other S3 Providers
+
+Not all S3 providers are fully compatible with the Fog library. For example,
+if you see a `411 Length Required` error message after attempting to upload,
+you may need to downgrade the `aws_signature_version` value from the default
+value to `2`, [due to this issue](https://github.com/fog/fog-aws/issues/428).
+
+For installations from source:
+
+1. Edit `home/git/gitlab/config/gitlab.yml`:
+
+ ```yaml
+ backup:
+ # snip
+ upload:
+ # Fog storage connection settings, see https://fog.io/storage/ .
+ connection:
+ provider: AWS
+ region: eu-west-1
+ aws_access_key_id: AKIAKIAKI
+ aws_secret_access_key: 'secret123'
+ # If using an IAM Profile, leave aws_access_key_id & aws_secret_access_key empty
+ # ie. aws_access_key_id: ''
+ # use_iam_profile: 'true'
+ # The remote 'directory' to store your backups. For S3, this would be the bucket name.
+ remote_directory: 'my.s3.bucket'
+ # Specifies Amazon S3 storage class to use for backups, this is optional
+ # storage_class: 'STANDARD'
+ #
+ # Turns on AWS Server-Side Encryption with Amazon Customer-Provided Encryption Keys for backups, this is optional
+ # 'encryption' must be set in order for this to have any effect.
+ # 'encryption_key' should be set to the 256-bit encryption key for Amazon S3 to use to encrypt or decrypt.
+ # To avoid storing the key on disk, the key can also be specified via the `GITLAB_BACKUP_ENCRYPTION_KEY` your data.
+ # encryption: 'AES256'
+ # encryption_key: '<key>'
+ #
+ #
+ # Turns on AWS Server-Side Encryption with Amazon S3-Managed keys (optional)
+ # https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html
+ # For SSE-S3, set 'server_side_encryption' to 'AES256'.
+ # For SS3-KMS, set 'server_side_encryption' to 'aws:kms'. Set
+ # 'server_side_encryption_kms_key_id' to the ARN of customer master key.
+ # storage_options:
+ # server_side_encryption: 'aws:kms'
+ # server_side_encryption_kms_key_id: 'arn:aws:kms:YOUR-KEY-ID-HERE'
+ ```
+
+1. [Restart GitLab](../restart_gitlab.md#installations-from-source)
+ for the changes to take effect
+
+If you're uploading your backups to S3, you should create a new
+IAM user with restricted access rights. To give the upload user access only for
+uploading backups create the following IAM profile, replacing `my.s3.bucket`
+with the name of your bucket:
+
+```json
+{
+ "Version": "2012-10-17",
+ "Statement": [
+ {
+ "Sid": "Stmt1412062044000",
+ "Effect": "Allow",
+ "Action": [
+ "s3:AbortMultipartUpload",
+ "s3:GetBucketAcl",
+ "s3:GetBucketLocation",
+ "s3:GetObject",
+ "s3:GetObjectAcl",
+ "s3:ListBucketMultipartUploads",
+ "s3:PutObject",
+ "s3:PutObjectAcl"
+ ],
+ "Resource": [
+ "arn:aws:s3:::my.s3.bucket/*"
+ ]
+ },
+ {
+ "Sid": "Stmt1412062097000",
+ "Effect": "Allow",
+ "Action": [
+ "s3:GetBucketLocation",
+ "s3:ListAllMyBuckets"
+ ],
+ "Resource": [
+ "*"
+ ]
+ },
+ {
+ "Sid": "Stmt1412062128000",
+ "Effect": "Allow",
+ "Action": [
+ "s3:ListBucket"
+ ],
+ "Resource": [
+ "arn:aws:s3:::my.s3.bucket"
+ ]
+ }
+ ]
+}
+```
+
+##### Using Google Cloud Storage
+
+To use Google Cloud Storage to save backups, you must first create an
+access key from the Google console:
+
+1. Go to the [Google storage settings page](https://console.cloud.google.com/storage/settings).
+1. Select **Interoperability**, and then create an access key.
+1. Make note of the **Access Key** and **Secret** and replace them in the
+ following configurations.
+1. In the buckets advanced settings ensure the Access Control option
+ **Set object-level and bucket-level permissions** is selected.
+1. Ensure you have already created a bucket.
+
+For the Linux package (Omnibus):
+
+1. Edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitlab_rails['backup_upload_connection'] = {
+ 'provider' => 'Google',
+ 'google_storage_access_key_id' => 'Access Key',
+ 'google_storage_secret_access_key' => 'Secret',
+
+ ## If you have CNAME buckets (foo.example.com), you might run into SSL issues
+ ## when uploading backups ("hostname foo.example.com.storage.googleapis.com
+ ## does not match the server certificate"). In that case, uncomnent the following
+ ## setting. See: https://github.com/fog/fog/issues/2834
+ #'path_style' => true
+ }
+ gitlab_rails['backup_upload_remote_directory'] = 'my.google.bucket'
+ ```
+
+1. [Reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-package-installation)
+ for the changes to take effect
+
+For installations from source:
+
+1. Edit `home/git/gitlab/config/gitlab.yml`:
+
+ ```yaml
+ backup:
+ upload:
+ connection:
+ provider: 'Google'
+ google_storage_access_key_id: 'Access Key'
+ google_storage_secret_access_key: 'Secret'
+ remote_directory: 'my.google.bucket'
+ ```
+
+1. [Restart GitLab](../restart_gitlab.md#installations-from-source)
+ for the changes to take effect
+
+##### Using Azure Blob storage
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/25877) in GitLab 13.4.
+
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
+
+1. Edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitlab_rails['backup_upload_connection'] = {
+ 'provider' => 'AzureRM',
+ 'azure_storage_account_name' => '<AZURE STORAGE ACCOUNT NAME>',
+ 'azure_storage_access_key' => '<AZURE STORAGE ACCESS KEY>',
+ 'azure_storage_domain' => 'blob.core.windows.net', # Optional
+ }
+ gitlab_rails['backup_upload_remote_directory'] = '<AZURE BLOB CONTAINER>'
+ ```
+
+1. [Reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-package-installation)
+ for the changes to take effect
+
+:::TabTitle Self-compiled
+
+1. Edit `home/git/gitlab/config/gitlab.yml`:
+
+ ```yaml
+ backup:
+ upload:
+ connection:
+ provider: 'AzureRM'
+ azure_storage_account_name: '<AZURE STORAGE ACCOUNT NAME>'
+ azure_storage_access_key: '<AZURE STORAGE ACCESS KEY>'
+ remote_directory: '<AZURE BLOB CONTAINER>'
+ ```
+
+1. [Restart GitLab](../restart_gitlab.md#installations-from-source)
+ for the changes to take effect
+
+::EndTabs
+
+For more details, see the [table of Azure parameters](../object_storage.md#azure-blob-storage).
+
+##### Specifying a custom directory for backups
+
+This option works only for remote storage. If you want to group your backups,
+you can pass a `DIRECTORY` environment variable:
+
+```shell
+sudo gitlab-backup create DIRECTORY=daily
+sudo gitlab-backup create DIRECTORY=weekly
+```
+
+#### Skip uploading backups to remote storage
+
+If you have configured GitLab to [upload backups in a remote storage](#upload-backups-to-a-remote-cloud-storage),
+you can use the `SKIP=remote` option to skip uploading your backups to the remote storage.
+
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
+
+```shell
+sudo gitlab-backup create SKIP=remote
+```
+
+:::TabTitle Self-compiled
+
+```shell
+sudo -u git -H bundle exec rake gitlab:backup:create SKIP=remote RAILS_ENV=production
+```
+
+::EndTabs
+
+#### Upload to locally-mounted shares
+
+You can send backups to a locally-mounted share (for example, `NFS`,`CIFS`, or `SMB`) using the Fog
+[`Local`](https://github.com/fog/fog-local#usage) storage provider.
+
+To do this, you must set the following configuration keys:
+
+- `backup_upload_connection.local_root`: mounted directory that backups are copied to.
+- `backup_upload_remote_directory`: subdirectory of the `backup_upload_connection.local_root` directory. It is created if it doesn't exist.
+ If you want to copy the tarballs to the root of your mounted directory, use `.`.
+
+When mounted, the directory set in the `local_root` key must be owned by either:
+
+- The `git` user. So, mounting with the `uid=` of the `git` user for `CIFS` and `SMB`.
+- The user that you are executing the backup tasks as. For the Linux package (Omnibus), this is the `git` user.
+
+Because file system performance may affect overall GitLab performance,
+[we don't recommend using cloud-based file systems for storage](../nfs.md#avoid-using-cloud-based-file-systems).
+
+##### Avoid conflicting configuration
+
+Don't set the following configuration keys to the same path:
+
+- `gitlab_rails['backup_path']` (`backup.path` for source installations).
+- `gitlab_rails['backup_upload_connection'].local_root` (`backup.upload.connection.local_root` for source installations).
+
+The `backup_path` configuration key sets the local location of the backup file. The `upload` configuration key is
+intended for use when the backup file is uploaded to a separate server, perhaps for archival purposes.
+
+If these configuration keys are set to the same location, the upload feature fails because a backup already exists at
+the upload location. This failure causes the upload feature to delete the backup because it assumes it's a residual file
+remaining after the failed upload attempt.
+
+##### Configure uploads to locally-mounted shares
+
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
+
+1. Edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitlab_rails['backup_upload_connection'] = {
+ :provider => 'Local',
+ :local_root => '/mnt/backups'
+ }
+
+ # The directory inside the mounted folder to copy backups to
+ # Use '.' to store them in the root directory
+ gitlab_rails['backup_upload_remote_directory'] = 'gitlab_backups'
+ ```
+
+1. [Reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-package-installation)
+ for the changes to take effect.
+
+:::TabTitle Self-compiled
+
+1. Edit `home/git/gitlab/config/gitlab.yml`:
+
+ ```yaml
+ backup:
+ upload:
+ # Fog storage connection settings, see https://fog.io/storage/ .
+ connection:
+ provider: Local
+ local_root: '/mnt/backups'
+ # The directory inside the mounted folder to copy backups to
+ # Use '.' to store them in the root directory
+ remote_directory: 'gitlab_backups'
+ ```
+
+1. [Restart GitLab](../restart_gitlab.md#installations-from-source)
+ for the changes to take effect.
+
+::EndTabs
+
+#### Backup archive permissions
+
+The backup archives created by GitLab (`1393513186_2014_02_27_gitlab_backup.tar`)
+have the owner/group `git`/`git` and 0600 permissions by default. This is
+meant to avoid other system users reading GitLab data. If you need the backup
+archives to have different permissions, you can use the `archive_permissions`
+setting.
+
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
+
+1. Edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitlab_rails['backup_archive_permissions'] = 0644 # Makes the backup archives world-readable
+ ```
+
+1. [Reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-package-installation)
+ for the changes to take effect.
+
+:::TabTitle Self-compiled
+
+1. Edit `/home/git/gitlab/config/gitlab.yml`:
+
+ ```yaml
+ backup:
+ archive_permissions: 0644 # Makes the backup archives world-readable
+ ```
+
+1. [Restart GitLab](../restart_gitlab.md#installations-from-source)
+ for the changes to take effect.
+
+::EndTabs
+
+#### Configuring cron to make daily backups
+
+WARNING:
+The following cron jobs do not [back up your GitLab configuration files](#storing-configuration-files)
+or [SSH host keys](https://superuser.com/questions/532040/copy-ssh-keys-from-one-server-to-another-server/532079#532079).
+
+You can schedule a cron job that backs up your repositories and GitLab metadata.
+
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
+
+1. Edit the crontab for the `root` user:
+
+ ```shell
+ sudo su -
+ crontab -e
+ ```
+
+1. There, add the following line to schedule the backup for everyday at 2 AM:
+
+ ```plaintext
+ 0 2 * * * /opt/gitlab/bin/gitlab-backup create CRON=1
+ ```
+
+:::TabTitle Self-compiled
+
+1. Edit the crontab for the `git` user:
+
+ ```shell
+ sudo -u git crontab -e
+ ```
+
+1. Add the following lines at the bottom:
+
+ ```plaintext
+ # Create a full backup of the GitLab repositories and SQL database every day at 2am
+ 0 2 * * * cd /home/git/gitlab && PATH=/usr/local/bin:/usr/bin:/bin bundle exec rake gitlab:backup:create RAILS_ENV=production CRON=1
+ ```
+
+::EndTabs
+
+The `CRON=1` environment setting directs the backup script to hide all progress
+output if there aren't any errors. This is recommended to reduce cron spam.
+When troubleshooting backup problems, however, replace `CRON=1` with `--trace` to log verbosely.
+
+#### Limit backup lifetime for local files (prune old backups)
+
+WARNING:
+The process described in this section doesn't work if you used a [custom filename](#backup-filename)
+for your backups.
+
+To prevent regular backups from using all your disk space, you may want to set a limited lifetime
+for backups. The next time the backup task runs, backups older than the `backup_keep_time` are
+pruned.
+
+This configuration option manages only local files. GitLab doesn't prune old
+files stored in a third-party [object storage](#upload-backups-to-a-remote-cloud-storage)
+because the user may not have permission to list and delete files. It's
+recommended that you configure the appropriate retention policy for your object
+storage (for example, [AWS S3](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-lifecycle.html)).
+
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
+
+1. Edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ ## Limit backup lifetime to 7 days - 604800 seconds
+ gitlab_rails['backup_keep_time'] = 604800
+ ```
+
+1. [Reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-package-installation)
+ for the changes to take effect.
+
+:::TabTitle Self-compiled
+
+1. Edit `/home/git/gitlab/config/gitlab.yml`:
+
+ ```yaml
+ backup:
+ ## Limit backup lifetime to 7 days - 604800 seconds
+ keep_time: 604800
+ ```
+
+1. [Restart GitLab](../restart_gitlab.md#installations-from-source)
+ for the changes to take effect.
+
+::EndTabs
+
+#### Back up and restore for installations using PgBouncer
+
+Do not back up or restore GitLab through a PgBouncer connection. These
+tasks must [bypass PgBouncer and connect directly to the PostgreSQL primary database node](#bypassing-pgbouncer),
+or they cause a GitLab outage.
+
+When the GitLab backup or restore task is used with PgBouncer, the
+following error message is shown:
+
+```ruby
+ActiveRecord::StatementInvalid: PG::UndefinedTable
+```
+
+Each time the GitLab backup runs, GitLab starts generating 500 errors and errors about missing
+tables will [be logged by PostgreSQL](../logs/index.md#postgresql-logs):
+
+```plaintext
+ERROR: relation "tablename" does not exist at character 123
+```
+
+This happens because the task uses `pg_dump`, which
+[sets a null search path and explicitly includes the schema in every SQL query](https://gitlab.com/gitlab-org/gitlab/-/issues/23211)
+to address [CVE-2018-1058](https://www.postgresql.org/about/news/postgresql-103-968-9512-9417-and-9322-released-1834/).
+
+Because connections are reused with PgBouncer in transaction pooling mode,
+PostgreSQL fails to search the default `public` schema. As a result,
+this clearing of the search path causes tables and columns to appear
+missing.
+
+##### Bypassing PgBouncer
+
+There are two ways to fix this:
+
+1. [Use environment variables to override the database settings](#environment-variable-overrides) for the backup task.
+1. Reconfigure a node to [connect directly to the PostgreSQL primary database node](../postgresql/pgbouncer.md#procedure-for-bypassing-pgbouncer).
+
+###### Environment variable overrides
+
+By default, GitLab uses the database configuration stored in a
+configuration file (`database.yml`). However, you can override the database settings
+for the backup and restore task by setting environment
+variables that are prefixed with `GITLAB_BACKUP_`:
+
+- `GITLAB_BACKUP_PGHOST`
+- `GITLAB_BACKUP_PGUSER`
+- `GITLAB_BACKUP_PGPORT`
+- `GITLAB_BACKUP_PGPASSWORD`
+- `GITLAB_BACKUP_PGSSLMODE`
+- `GITLAB_BACKUP_PGSSLKEY`
+- `GITLAB_BACKUP_PGSSLCERT`
+- `GITLAB_BACKUP_PGSSLROOTCERT`
+- `GITLAB_BACKUP_PGSSLCRL`
+- `GITLAB_BACKUP_PGSSLCOMPRESSION`
+
+For example, to override the database host and port to use 192.168.1.10
+and port 5432 with the Linux package (Omnibus):
+
+```shell
+sudo GITLAB_BACKUP_PGHOST=192.168.1.10 GITLAB_BACKUP_PGPORT=5432 /opt/gitlab/bin/gitlab-backup create
+```
+
+See the [PostgreSQL documentation](https://www.postgresql.org/docs/12/libpq-envars.html)
+for more details on what these parameters do.
+
+#### `gitaly-backup` for repository backup and restore
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/333034) in GitLab 14.2.
+> - [Deployed behind a feature flag](../../user/feature_flags.md), enabled by default.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/333034) in GitLab 14.10. [Feature flag `gitaly_backup`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83254) removed.
+
+The `gitaly-backup` binary is used by the backup Rake task to create and restore repository backups from Gitaly.
+`gitaly-backup` replaces the previous backup method that directly calls RPCs on Gitaly from GitLab.
+
+The backup Rake task must be able to find this executable. In most cases, you don't need to change
+the path to the binary as it should work fine with the default path `/opt/gitlab/embedded/bin/gitaly-backup`.
+If you have a specific reason to change the path, it can be configured in the Linux package (Omnibus):
+
+1. Add the following to `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitlab_rails['backup_gitaly_backup_path'] = '/path/to/gitaly-backup'
+ ```
+
+1. [Reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-package-installation)
+ for the changes to take effect.
+
+## Alternative backup strategies
+
+Because every deployment may have different capabilities, you should first review [what data needs to be backed up](#what-data-needs-to-be-backed-up) to better understand if, and how, you can leverage them.
+
+For example, if you use Amazon RDS, you might choose to use its built-in backup and restore features to handle your GitLab [PostgreSQL data](#postgresql-databases), and [exclude PostgreSQL data](#excluding-specific-directories-from-the-backup) when using the [backup command](#backup-command).
+
+In the following cases, consider using file system data transfer or snapshots as part of your backup strategy:
+
+- Your GitLab instance contains a lot of Git repository data and the GitLab backup script is too slow.
+- Your GitLab instance has a lot of forked projects and the regular backup task duplicates the Git data for all of them.
+- Your GitLab instance has a problem and using the regular backup and import Rake tasks isn't possible.
+
+WARNING:
+Gitaly Cluster [does not support snapshot backups](../gitaly/index.md#snapshot-backup-and-recovery-limitations).
+
+When considering using file system data transfer or snapshots:
+
+- Don't use these methods to migrate from one operating system to another. The operating systems of the source and destination should be as similar as possible. For example,
+ don't use these methods to migrate from Ubuntu to Fedora.
+- Data consistency is very important. You should stop GitLab with `sudo gitlab-ctl stop` before taking doing a file system transfer (with `rsync`, for example) or taking a
+ snapshot.
+
+Example: Amazon Elastic Block Store (EBS)
+
+- A GitLab server using the Linux package (Omnibus) hosted on Amazon AWS.
+- An EBS drive containing an ext4 file system is mounted at `/var/opt/gitlab`.
+- In this case you could make an application backup by taking an EBS snapshot.
+- The backup includes all repositories, uploads and PostgreSQL data.
+
+Example: Logical Volume Manager (LVM) snapshots + rsync
+
+- A GitLab server using the Linux package (Omnibus), with an LVM logical volume mounted at `/var/opt/gitlab`.
+- Replicating the `/var/opt/gitlab` directory using rsync would not be reliable because too many files would change while rsync is running.
+- Instead of rsync-ing `/var/opt/gitlab`, we create a temporary LVM snapshot, which we mount as a read-only file system at `/mnt/gitlab_backup`.
+- Now we can have a longer running rsync job which creates a consistent replica on the remote server.
+- The replica includes all repositories, uploads and PostgreSQL data.
+
+If you're running GitLab on a virtualized server, you can possibly also create
+VM snapshots of the entire GitLab server. It's not uncommon however for a VM
+snapshot to require you to power down the server, which limits this solution's
+practical use.
+
+### Back up repository data separately
+
+First, ensure you back up existing GitLab data while [skipping repositories](#excluding-specific-directories-from-the-backup):
+
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
+
+```shell
+sudo gitlab-backup create SKIP=repositories
+```
+
+:::TabTitle Self-compiled
+
+```shell
+sudo -u git -H bundle exec rake gitlab:backup:create SKIP=repositories RAILS_ENV=production
+```
+
+::EndTabs
+
+For manually backing up the Git repository data on disk, there are multiple possible strategies:
+
+- Use snapshots, such as the previous examples of Amazon EBS drive snapshots, or LVM snapshots + rsync.
+- Use [GitLab Geo](../geo/index.md) and rely on the repository data on a Geo secondary site.
+- [Prevent writes and copy the Git repository data](#prevent-writes-and-copy-the-git-repository-data).
+- [Create an online backup by marking repositories as read-only (experimental)](#online-backup-through-marking-repositories-as-read-only-experimental).
+
+#### Prevent writes and copy the Git repository data
+
+Git repositories must be copied in a consistent way. They should not be copied during concurrent write
+operations, as this can lead to inconsistencies or corruption issues. For more details,
+[issue #270422](https://gitlab.com/gitlab-org/gitlab/-/issues/270422 "Provide documentation on preferred method of migrating Gitaly servers")
+has a longer discussion explaining the potential problems.
+
+To prevent writes to the Git repository data, there are two possible approaches:
+
+- Use [maintenance mode](../maintenance_mode/index.md) to place GitLab in a read-only state.
+- Create explicit downtime by stopping all Gitaly services before backing up the repositories:
+
+ ```shell
+ sudo gitlab-ctl stop gitaly
+ # execute git data copy step
+ sudo gitlab-ctl start gitaly
+ ```
+
+You can copy Git repository data using any method, as long as writes are prevented on the data being copied
+(to prevent inconsistencies and corruption issues). In order of preference and safety, the recommended methods are:
+
+1. Use `rsync` with archive-mode, delete, and checksum options, for example:
+
+ ```shell
+ rsync -aR --delete --checksum source destination # be extra safe with the order as it will delete existing data if inverted
+ ```
+
+1. Use a [`tar` pipe to copy the entire repository's directory to another server or location](../operations/moving_repositories.md#tar-pipe-to-another-server).
+
+1. Use `sftp`, `scp`, `cp`, or any other copying method.
+
+#### Online backup through marking repositories as read-only (experimental)
+
+One way of backing up repositories without requiring instance-wide downtime
+is to programmatically mark projects as read-only while copying the underlying data.
+
+There are a few possible downsides to this:
+
+- Repositories are read-only for a period of time that scales with the size of the repository.
+- Backups take a longer time to complete due to marking each project as read-only, potentially leading to inconsistencies. For example,
+ a possible date discrepancy between the last data available for the first project that gets backed up compared to
+ the last project that gets backed up.
+- Fork networks should be entirely read-only while the projects inside get backed up to prevent potential changes to the pool repository.
+
+There is an **experimental** script that attempts to automate this process in
+[the Geo team Runbooks project](https://gitlab.com/gitlab-org/geo-team/runbooks/-/tree/main/experimental-online-backup-through-rsync).
+
+## Troubleshooting
+
+The following are possible problems you might encounter, along with potential
+solutions.
+
+### When the secrets file is lost
+
+If you didn't [back up the secrets file](#storing-configuration-files), you
+must complete several steps to get GitLab working properly again.
+
+The secrets file is responsible for storing the encryption key for the columns
+that contain required, sensitive information. If the key is lost, GitLab can't
+decrypt those columns, preventing access to the following items:
+
+- [CI/CD variables](../../ci/variables/index.md)
+- [Kubernetes / GCP integration](../../user/infrastructure/clusters/index.md)
+- [Custom Pages domains](../../user/project/pages/custom_domains_ssl_tls_certification/index.md)
+- [Project error tracking](../../operations/error_tracking.md)
+- [Runner authentication](../../ci/runners/index.md)
+- [Project mirroring](../../user/project/repository/mirror/index.md)
+- [Integrations](../../user/project/integrations/index.md)
+- [Web hooks](../../user/project/integrations/webhooks.md)
+
+In cases like CI/CD variables and runner authentication, you can experience
+unexpected behaviors, such as:
+
+- Stuck jobs.
+- 500 errors.
+
+In this case, you must reset all the tokens for CI/CD variables and
+runner authentication, which is described in more detail in the following
+sections. After resetting the tokens, you should be able to visit your project
+and the jobs begin running again.
+
+WARNING:
+The steps in this section can potentially lead to **data loss** on the above listed items.
+Consider opening a [Support Request](https://support.gitlab.com/hc/en-us/requests/new) if you're a Premium or Ultimate customer.
+
+#### Verify that all values can be decrypted
+
+You can determine if your database contains values that can't be decrypted by using a
+[Rake task](../raketasks/check.md#verify-database-values-can-be-decrypted-using-the-current-secrets).
+
+#### Take a backup
+
+You must directly modify GitLab data to work around your lost secrets file.
+
+WARNING:
+Be sure to create a full database backup before attempting any changes.
+
+#### Disable user two-factor authentication (2FA)
+
+Users with 2FA enabled can't sign in to GitLab. In that case, you must
+[disable 2FA for everyone](../../security/two_factor_authentication.md#for-all-users),
+after which users must reactivate 2FA.
+
+#### Reset CI/CD variables
+
+1. Enter the database console:
+
+ For the Linux package (Omnibus) GitLab 14.1 and earlier:
+
+ ```shell
+ sudo gitlab-rails dbconsole
+ ```
+
+ For the Linux package (Omnibus) GitLab 14.2 and later:
+
+ ```shell
+ sudo gitlab-rails dbconsole --database main
+ ```
+
+ For installations from source, GitLab 14.1 and earlier:
+
+ ```shell
+ sudo -u git -H bundle exec rails dbconsole -e production
+ ```
+
+ For installations from source, GitLab 14.2 and later:
+
+ ```shell
+ sudo -u git -H bundle exec rails dbconsole -e production --database main
+ ```
+
+1. Examine the `ci_group_variables` and `ci_variables` tables:
+
+ ```sql
+ SELECT * FROM public."ci_group_variables";
+ SELECT * FROM public."ci_variables";
+ ```
+
+ These are the variables that you need to delete.
+
+1. Delete all variables:
+
+ ```sql
+ DELETE FROM ci_group_variables;
+ DELETE FROM ci_variables;
+ ```
+
+1. If you know the specific group or project from which you wish to delete variables, you can include a `WHERE` statement to specify that in your `DELETE`:
+
+ ```sql
+ DELETE FROM ci_group_variables WHERE group_id = <GROUPID>;
+ DELETE FROM ci_variables WHERE project_id = <PROJECTID>;
+ ```
+
+You may need to reconfigure or restart GitLab for the changes to take effect.
+
+#### Reset runner registration tokens
+
+1. Enter the database console:
+
+ For the Linux package (Omnibus) GitLab 14.1 and earlier:
+
+ ```shell
+ sudo gitlab-rails dbconsole
+ ```
+
+ For the Linux package (Omnibus) GitLab 14.2 and later:
+
+ ```shell
+ sudo gitlab-rails dbconsole --database main
+ ```
+
+ For installations from source, GitLab 14.1 and earlier:
+
+ ```shell
+ sudo -u git -H bundle exec rails dbconsole -e production
+ ```
+
+ For installations from source, GitLab 14.2 and later:
+
+ ```shell
+ sudo -u git -H bundle exec rails dbconsole -e production --database main
+ ```
+
+1. Clear all tokens for projects, groups, and the entire instance:
+
+ WARNING:
+ The final `UPDATE` operation stops the runners from being able to pick
+ up new jobs. You must register new runners.
+
+ ```sql
+ -- Clear project tokens
+ UPDATE projects SET runners_token = null, runners_token_encrypted = null;
+ -- Clear group tokens
+ UPDATE namespaces SET runners_token = null, runners_token_encrypted = null;
+ -- Clear instance tokens
+ UPDATE application_settings SET runners_registration_token_encrypted = null;
+ -- Clear key used for JWT authentication
+ -- This may break the $CI_JWT_TOKEN job variable:
+ -- https://gitlab.com/gitlab-org/gitlab/-/issues/325965
+ UPDATE application_settings SET encrypted_ci_jwt_signing_key = null;
+ -- Clear runner tokens
+ UPDATE ci_runners SET token = null, token_encrypted = null;
+ ```
+
+#### Reset pending pipeline jobs
+
+1. Enter the database console:
+
+ For the Linux package (Omnibus) GitLab 14.1 and earlier:
+
+ ```shell
+ sudo gitlab-rails dbconsole
+ ```
+
+ For the Linux package (Omnibus) GitLab 14.2 and later:
+
+ ```shell
+ sudo gitlab-rails dbconsole --database main
+ ```
+
+ For installations from source, GitLab 14.1 and earlier:
+
+ ```shell
+ sudo -u git -H bundle exec rails dbconsole -e production
+ ```
+
+ For installations from source, GitLab 14.2 and later:
+
+ ```shell
+ sudo -u git -H bundle exec rails dbconsole -e production --database main
+ ```
+
+1. Clear all the tokens for pending jobs:
+
+ For GitLab 15.3 and earlier:
+
+ ```sql
+ -- Clear build tokens
+ UPDATE ci_builds SET token = null, token_encrypted = null;
+ ```
+
+ For GitLab 15.4 and later:
+
+ ```sql
+ -- Clear build tokens
+ UPDATE ci_builds SET token_encrypted = null;
+ ```
+
+A similar strategy can be employed for the remaining features. By removing the
+data that can't be decrypted, GitLab can be returned to operation, and the
+lost data can be manually replaced.
+
+#### Fix integrations and webhooks
+
+If you've lost your secrets, the [integrations settings](../../user/project/integrations/index.md)
+and [webhooks settings](../../user/project/integrations/webhooks.md) pages might display `500` error messages. Lost secrets might also produce `500` errors when you try to access a repository in a project with a previously configured integration or webhook.
+
+The fix is to truncate the affected tables (those containing encrypted columns).
+This deletes all your configured integrations, webhooks, and related metadata.
+You should verify that the secrets are the root cause before deleting any data.
+
+1. Enter the database console:
+
+ For the Linux package (Omnibus) GitLab 14.1 and earlier:
+
+ ```shell
+ sudo gitlab-rails dbconsole
+ ```
+
+ For the Linux package (Omnibus) GitLab 14.2 and later:
+
+ ```shell
+ sudo gitlab-rails dbconsole --database main
+ ```
+
+ For installations from source, GitLab 14.1 and earlier:
+
+ ```shell
+ sudo -u git -H bundle exec rails dbconsole -e production
+ ```
+
+ For installations from source, GitLab 14.2 and later:
+
+ ```shell
+ sudo -u git -H bundle exec rails dbconsole -e production --database main
+ ```
+
+1. Truncate the following tables:
+
+ ```sql
+ -- truncate web_hooks table
+ TRUNCATE integrations, chat_names, issue_tracker_data, jira_tracker_data, slack_integrations, web_hooks, zentao_tracker_data, web_hook_logs CASCADE;
+ ```
+
+### Container Registry push failures after restoring from a backup
+
+If you use the [Container Registry](../../user/packages/container_registry/index.md),
+pushes to the registry may fail after restoring your backup on a Linux package (Omnibus)
+instance after restoring the registry data.
+
+These failures mention permission issues in the registry logs, similar to:
+
+```plaintext
+level=error
+msg="response completed with error"
+err.code=unknown
+err.detail="filesystem: mkdir /var/opt/gitlab/gitlab-rails/shared/registry/docker/registry/v2/repositories/...: permission denied"
+err.message="unknown error"
+```
+
+This issue is caused by the restore running as the unprivileged user `git`,
+which is unable to assign the correct ownership to the registry files during
+the restore process ([issue #62759](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/62759 "Incorrect permissions on registry filesystem after restore")).
+
+To get your registry working again:
+
+```shell
+sudo chown -R registry:registry /var/opt/gitlab/gitlab-rails/shared/registry/docker
+```
+
+If you changed the default file system location for the registry, run `chown`
+against your custom location, instead of `/var/opt/gitlab/gitlab-rails/shared/registry/docker`.
+
+### Backup fails to complete with Gzip error
+
+When running the backup, you may receive a Gzip error message:
+
+```shell
+sudo /opt/gitlab/bin/gitlab-backup create
+...
+Dumping ...
+...
+gzip: stdout: Input/output error
+
+Backup failed
+```
+
+If this happens, examine the following:
+
+- Confirm there is sufficient disk space for the Gzip operation. It's not uncommon for backups that
+ use the [default strategy](#backup-strategy-option) to require half the instance size
+ in free disk space during backup creation.
+- If NFS is being used, check if the mount option `timeout` is set. The
+ default is `600`, and changing this to smaller values results in this error.
+
+### Backup fails with `File name too long` error
+
+During backup, you can get the `File name too long` error ([issue #354984](https://gitlab.com/gitlab-org/gitlab/-/issues/354984)). For example:
+
+```plaintext
+Problem: <class 'OSError: [Errno 36] File name too long:
+```
+
+This problem stops the backup script from completing. To fix this problem, you must truncate the filenames causing the problem. A maximum of 246 characters, including the file extension, is permitted.
+
+WARNING:
+The steps in this section can potentially lead to **data loss**. All steps must be followed strictly in the order given.
+Consider opening a [Support Request](https://support.gitlab.com/hc/en-us/requests/new) if you're a Premium or Ultimate customer.
+
+Truncating filenames to resolve the error involves:
+
+- Cleaning up remote uploaded files that aren't tracked in the database.
+- Truncating the filenames in the database.
+- Rerunning the backup task.
+
+#### Clean up remote uploaded files
+
+A [known issue](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/45425) caused object store uploads to remain after a parent resource was deleted. This issue was [resolved](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/18698).
+
+To fix these files, you must clean up all remote uploaded files that are in the storage but not tracked in the `uploads` database table.
+
+1. List all the object store upload files that can be moved to a lost and found directory if they don't exist in the GitLab database:
+
+ ```shell
+ bundle exec rake gitlab:cleanup:remote_upload_files RAILS_ENV=production
+ ```
+
+1. If you are sure you want to delete these files and remove all non-referenced uploaded files, run:
+
+ WARNING:
+ The following action is **irreversible**.
+
+ ```shell
+ bundle exec rake gitlab:cleanup:remote_upload_files RAILS_ENV=production DRY_RUN=false
+ ```
+
+#### Truncate the filenames referenced by the database
+
+You must truncate the files referenced by the database that are causing the problem. The filenames referenced by the database are stored:
+
+- In the `uploads` table.
+- In the references found. Any reference found from other database tables and columns.
+- On the file system.
+
+Truncate the filenames in the `uploads` table:
+
+1. Enter the database console:
+
+ For the Linux package (Omnibus) GitLab 14.2 and later:
+
+ ```shell
+ sudo gitlab-rails dbconsole --database main
+ ```
+
+ For the Linux package (Omnibus) GitLab 14.1 and earlier:
+
+ ```shell
+ sudo gitlab-rails dbconsole
+ ```
+
+ For installations from source, GitLab 14.2 and later:
+
+ ```shell
+ sudo -u git -H bundle exec rails dbconsole -e production --database main
+ ```
+
+ For installations from source, GitLab 14.1 and earlier:
+
+ ```shell
+ sudo -u git -H bundle exec rails dbconsole -e production
+ ```
+
+1. Search the `uploads` table for filenames longer than 246 characters:
+
+ The following query selects the `uploads` records with filenames longer than 246 characters in batches of 0 to 10000. This improves the performance on large GitLab instances with tables having thousand of records.
+
+ ```sql
+ CREATE TEMP TABLE uploads_with_long_filenames AS
+ SELECT ROW_NUMBER() OVER(ORDER BY id) row_id, id, path
+ FROM uploads AS u
+ WHERE LENGTH((regexp_match(u.path, '[^\\/:*?"<>|\r\n]+$'))[1]) > 246;
+
+ CREATE INDEX ON uploads_with_long_filenames(row_id);
+
+ SELECT
+ u.id,
+ u.path,
+ -- Current filename
+ (regexp_match(u.path, '[^\\/:*?"<>|\r\n]+$'))[1] AS current_filename,
+ -- New filename
+ CONCAT(
+ LEFT(SPLIT_PART((regexp_match(u.path, '[^\\/:*?"<>|\r\n]+$'))[1], '.', 1), 242),
+ COALESCE(SUBSTRING((regexp_match(u.path, '[^\\/:*?"<>|\r\n]+$'))[1] FROM '\.(?:.(?!\.))+$'))
+ ) AS new_filename,
+ -- New path
+ CONCAT(
+ COALESCE((regexp_match(u.path, '(.*\/).*'))[1], ''),
+ CONCAT(
+ LEFT(SPLIT_PART((regexp_match(u.path, '[^\\/:*?"<>|\r\n]+$'))[1], '.', 1), 242),
+ COALESCE(SUBSTRING((regexp_match(u.path, '[^\\/:*?"<>|\r\n]+$'))[1] FROM '\.(?:.(?!\.))+$'))
+ )
+ ) AS new_path
+ FROM uploads_with_long_filenames AS u
+ WHERE u.row_id > 0 AND u.row_id <= 10000;
+ ```
+
+ Output example:
+
+ ```postgresql
+ -[ RECORD 1 ]----+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ id | 34
+ path | public/@hashed/loremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididuntutlaboreetdoloremagnaaliquaauctorelitsedvulputatemisitloremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididuntutlaboreetdoloremagnaaliquaauctorelitsedvulputatemisit.txt
+ current_filename | loremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididuntutlaboreetdoloremagnaaliquaauctorelitsedvulputatemisitloremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididuntutlaboreetdoloremagnaaliquaauctorelitsedvulputatemisit.txt
+ new_filename | loremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididuntutlaboreetdoloremagnaaliquaauctorelitsedvulputatemisitloremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididuntutlaboreetdoloremagnaaliquaauctorelits.txt
+ new_path | public/@hashed/loremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididuntutlaboreetdoloremagnaaliquaauctorelitsedvulputatemisitloremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididuntutlaboreetdoloremagnaaliquaauctorelits.txt
+ ```
+
+ Where:
+
+ - `current_filename`: a filename that is currently more than 246 characters long.
+ - `new_filename`: a filename that has been truncated to 246 characters maximum.
+ - `new_path`: new path considering the `new_filename` (truncated).
+
+ After you validate the batch results, you must change the batch size (`row_id`) using the following sequence of numbers (10000 to 20000). Repeat this process until you reach the last record in the `uploads` table.
+
+1. Rename the files found in the `uploads` table from long filenames to new truncated filenames. The following query rolls back the update so you can check the results safely in a transaction wrapper:
+
+ ```sql
+ CREATE TEMP TABLE uploads_with_long_filenames AS
+ SELECT ROW_NUMBER() OVER(ORDER BY id) row_id, path, id
+ FROM uploads AS u
+ WHERE LENGTH((regexp_match(u.path, '[^\\/:*?"<>|\r\n]+$'))[1]) > 246;
+
+ CREATE INDEX ON uploads_with_long_filenames(row_id);
+
+ BEGIN;
+ WITH updated_uploads AS (
+ UPDATE uploads
+ SET
+ path =
+ CONCAT(
+ COALESCE((regexp_match(updatable_uploads.path, '(.*\/).*'))[1], ''),
+ CONCAT(
+ LEFT(SPLIT_PART((regexp_match(updatable_uploads.path, '[^\\/:*?"<>|\r\n]+$'))[1], '.', 1), 242),
+ COALESCE(SUBSTRING((regexp_match(updatable_uploads.path, '[^\\/:*?"<>|\r\n]+$'))[1] FROM '\.(?:.(?!\.))+$'))
+ )
+ )
+ FROM
+ uploads_with_long_filenames AS updatable_uploads
+ WHERE
+ uploads.id = updatable_uploads.id
+ AND updatable_uploads.row_id > 0 AND updatable_uploads.row_id <= 10000
+ RETURNING uploads.*
+ )
+ SELECT id, path FROM updated_uploads;
+ ROLLBACK;
+ ```
+
+ After you validate the batch update results, you must change the batch size (`row_id`) using the following sequence of numbers (10000 to 20000). Repeat this process until you reach the last record in the `uploads` table.
+
+1. Validate that the new filenames from the previous query are the expected ones. If you are sure you want to truncate the records found in the previous step to 246 characters, run the following:
+
+ WARNING:
+ The following action is **irreversible**.
+
+ ```sql
+ CREATE TEMP TABLE uploads_with_long_filenames AS
+ SELECT ROW_NUMBER() OVER(ORDER BY id) row_id, path, id
+ FROM uploads AS u
+ WHERE LENGTH((regexp_match(u.path, '[^\\/:*?"<>|\r\n]+$'))[1]) > 246;
+
+ CREATE INDEX ON uploads_with_long_filenames(row_id);
+
+ UPDATE uploads
+ SET
+ path =
+ CONCAT(
+ COALESCE((regexp_match(updatable_uploads.path, '(.*\/).*'))[1], ''),
+ CONCAT(
+ LEFT(SPLIT_PART((regexp_match(updatable_uploads.path, '[^\\/:*?"<>|\r\n]+$'))[1], '.', 1), 242),
+ COALESCE(SUBSTRING((regexp_match(updatable_uploads.path, '[^\\/:*?"<>|\r\n]+$'))[1] FROM '\.(?:.(?!\.))+$'))
+ )
+ )
+ FROM
+ uploads_with_long_filenames AS updatable_uploads
+ WHERE
+ uploads.id = updatable_uploads.id
+ AND updatable_uploads.row_id > 0 AND updatable_uploads.row_id <= 10000;
+ ```
+
+ After you finish the batch update, you must change the batch size (`updatable_uploads.row_id`) using the following sequence of numbers (10000 to 20000). Repeat this process until you reach the last record in the `uploads` table.
+
+Truncate the filenames in the references found:
+
+1. Check if those records are referenced somewhere. One way to do this is to dump the database and search for the parent directory name and filename:
+
+ 1. To dump your database, you can use the following command as an example:
+
+ ```shell
+ pg_dump -h /var/opt/gitlab/postgresql/ -d gitlabhq_production > gitlab-dump.tmp
+ ```
+
+ 1. Then you can search for the references using the `grep` command. Combining the parent directory and the filename can be a good idea. For example:
+
+ ```shell
+ grep public/alongfilenamehere.txt gitlab-dump.tmp
+ ```
+
+1. Replace those long filenames using the new filenames obtained from querying the `uploads` table.
+
+Truncate the filenames on the file system. You must manually rename the files in your file system to the new filenames obtained from querying the `uploads` table.
+
+#### Re-run the backup task
+
+After following all the previous steps, re-run the backup task.
+
+### Restoring database backup fails when `pg_stat_statements` was previously enabled
+
+The GitLab backup of the PostgreSQL database includes all SQL statements required to enable extensions that were
+previously enabled in the database.
+
+The `pg_stat_statements` extension can only be enabled or disabled by a PostgreSQL user with `superuser` role.
+As the restore process uses a database user with limited permissions, it can't execute the following SQL statements:
+
+```sql
+DROP EXTENSION IF EXISTS pg_stat_statements;
+CREATE EXTENSION IF NOT EXISTS pg_stat_statements WITH SCHEMA public;
+```
+
+When trying to restore the backup in a PostgreSQL instance that doesn't have the `pg_stats_statements` extension,
+the following error message is displayed:
+
+```plaintext
+ERROR: permission denied to create extension "pg_stat_statements"
+HINT: Must be superuser to create this extension.
+ERROR: extension "pg_stat_statements" does not exist
+```
+
+When trying to restore in an instance that has the `pg_stats_statements` extension enabled, the cleaning up step
+fails with an error message similar to the following:
+
+```plaintext
+rake aborted!
+ActiveRecord::StatementInvalid: PG::InsufficientPrivilege: ERROR: must be owner of view pg_stat_statements
+/opt/gitlab/embedded/service/gitlab-rails/lib/tasks/gitlab/db.rake:42:in `block (4 levels) in <top (required)>'
+/opt/gitlab/embedded/service/gitlab-rails/lib/tasks/gitlab/db.rake:41:in `each'
+/opt/gitlab/embedded/service/gitlab-rails/lib/tasks/gitlab/db.rake:41:in `block (3 levels) in <top (required)>'
+/opt/gitlab/embedded/service/gitlab-rails/lib/tasks/gitlab/backup.rake:71:in `block (3 levels) in <top (required)>'
+/opt/gitlab/embedded/bin/bundle:23:in `load'
+/opt/gitlab/embedded/bin/bundle:23:in `<main>'
+Caused by:
+PG::InsufficientPrivilege: ERROR: must be owner of view pg_stat_statements
+/opt/gitlab/embedded/service/gitlab-rails/lib/tasks/gitlab/db.rake:42:in `block (4 levels) in <top (required)>'
+/opt/gitlab/embedded/service/gitlab-rails/lib/tasks/gitlab/db.rake:41:in `each'
+/opt/gitlab/embedded/service/gitlab-rails/lib/tasks/gitlab/db.rake:41:in `block (3 levels) in <top (required)>'
+/opt/gitlab/embedded/service/gitlab-rails/lib/tasks/gitlab/backup.rake:71:in `block (3 levels) in <top (required)>'
+/opt/gitlab/embedded/bin/bundle:23:in `load'
+/opt/gitlab/embedded/bin/bundle:23:in `<main>'
+Tasks: TOP => gitlab:db:drop_tables
+(See full trace by running task with --trace)
+```
+
+#### Prevent the dump file to include `pg_stat_statements`
+
+To prevent the inclusion of the extension in the PostgreSQL dump file that is part of the backup bundle,
+enable the extension in any schema except the `public` schema:
+
+```sql
+CREATE SCHEMA adm;
+CREATE EXTENSION pg_stat_statements SCHEMA adm;
+```
+
+If the extension was previously enabled in the `public` schema, move it to a new one:
+
+```sql
+CREATE SCHEMA adm;
+ALTER EXTENSION pg_stat_statements SET SCHEMA adm;
+```
+
+To query the `pg_stat_statements` data after changing the schema, prefix the view name with the new schema:
+
+```sql
+SELECT * FROM adm.pg_stat_statements limit 0;
+```
+
+To make it compatible with third-party monitoring solutions that expect it to be enabled in the `public` schema,
+you need to include it in the `search_path`:
+
+```sql
+set search_path to public,adm;
+```
+
+#### Fix an existing dump file to remove references to `pg_stat_statements`
+
+To fix an existing backup file, do the following changes:
+
+1. Extract from the backup the following file: `db/database.sql.gz`.
+1. Decompress the file or use an editor that is capable of handling it compressed.
+1. Remove the following lines, or similar ones:
+
+ ```sql
+ CREATE EXTENSION IF NOT EXISTS pg_stat_statements WITH SCHEMA public;
+ ```
+
+ ```sql
+ COMMENT ON EXTENSION pg_stat_statements IS 'track planning and execution statistics of all SQL statements executed';
+ ```
+
+1. Save the changes and recompress the file.
+1. Update the backup file with the modified `db/database.sql.gz`.
diff --git a/doc/administration/backup_restore/index.md b/doc/administration/backup_restore/index.md
new file mode 100644
index 00000000000..72a0176adc1
--- /dev/null
+++ b/doc/administration/backup_restore/index.md
@@ -0,0 +1,232 @@
+---
+stage: Systems
+group: Geo
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Back up and restore GitLab **(FREE SELF)**
+
+Your software or organization depends on the data in your GitLab instance. You need to ensure this data is protected from adverse events such as:
+
+- Corrupted data
+- Accidental deletion of data
+- Ransomware attacks
+- Unexpected cloud provider downtime
+
+You can mitigate all of these risks with a disaster recovery plan that includes backups.
+
+## Back up GitLab
+
+For detailed information on backing up GitLab, see [Backup GitLab](backup_gitlab.md).
+
+## Restore GitLab
+
+For detailed information on restoring GitLab, see [Restore GitLab](restore_gitlab.md).
+
+## Migrate to a new server
+
+<!-- some details borrowed from GitLab.com move from Azure to GCP detailed at https://gitlab.com/gitlab-com/migration/-/blob/master/.gitlab/issue_templates/failover.md -->
+
+You can use GitLab backup and restore to migrate your instance to a new server. This section outlines a typical procedure for a GitLab deployment running on a single server.
+If you're running GitLab Geo, an alternative option is [Geo disaster recovery for planned failover](../geo/disaster_recovery/planned_failover.md).
+
+WARNING:
+Avoid uncoordinated data processing by both the new and old servers, where multiple
+servers could connect concurrently and process the same data. For example, when using
+[incoming email](../incoming_email.md), if both GitLab instances are
+processing email at the same time, then both instances miss some data.
+This type of problem can occur with other services as well, such as a
+[non-packaged database](https://docs.gitlab.com/omnibus/settings/database.html#using-a-non-packaged-postgresql-database-management-server),
+a non-packaged Redis instance, or non-packaged Sidekiq.
+
+Prerequisites:
+
+- Some time before your migration, consider notifying your users of upcoming
+ scheduled maintenance with a [broadcast message banner](../broadcast_messages.md).
+- Ensure your backups are complete and current. Create a complete system-level backup, or
+ take a snapshot of all servers involved in the migration, in case destructive commands
+ (like `rm`) are run incorrectly.
+
+### Prepare the new server
+
+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](../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](../incoming_email.md):
+ 1. Install GitLab.
+ 1. Configure by copying `/etc/gitlab` files from the old server to the new server, and update as necessary.
+ Read the
+ [Omnibus configuration backup and restore instructions](https://docs.gitlab.com/omnibus/settings/backups.html) for more detail.
+ 1. If applicable, disable [incoming email](../incoming_email.md).
+ 1. Block new CI/CD jobs from starting upon initial startup after the backup and restore.
+ Edit `/etc/gitlab/gitlab.rb` and set the following:
+
+ ```ruby
+ nginx['custom_gitlab_server_config'] = "location = /api/v4/jobs/request {\n deny all;\n return 503;\n }\n"
+ ```
+
+ 1. Reconfigure GitLab:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
+
+1. Stop GitLab to avoid any potential unnecessary and unintentional data processing:
+
+ ```shell
+ sudo gitlab-ctl stop
+ ```
+
+1. Configure the new server to allow receiving the Redis database and GitLab backup files:
+
+ ```shell
+ sudo rm -f /var/opt/gitlab/redis/dump.rdb
+ sudo chown <your-linux-username> /var/opt/gitlab/redis /var/opt/gitlab/backups
+ ```
+
+### Prepare and transfer content from the old server
+
+1. Ensure you have an up-to-date system-level backup or snapshot of the old server.
+1. Enable [maintenance mode](../maintenance_mode/index.md),
+ if supported by your GitLab edition.
+1. Block new CI/CD jobs from starting:
+ 1. Edit `/etc/gitlab/gitlab.rb`, and set the following:
+
+ ```ruby
+ nginx['custom_gitlab_server_config'] = "location = /api/v4/jobs/request {\n deny all;\n return 503;\n }\n"
+ ```
+
+ 1. Reconfigure GitLab:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
+
+1. Disable periodic background jobs:
+ 1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+ 1. Select **Admin Area**.
+ 1. On the left sidebar, select **Monitoring > Background Jobs**.
+ 1. Under the Sidekiq dashboard, select **Cron** tab and then
+ **Disable All**.
+1. Wait for the currently running CI/CD jobs to finish, or accept that jobs that have not completed may be lost.
+ To view jobs currently running, on the left sidebar, select **Overviews > Jobs**,
+ and then select **Running**.
+1. Wait for Sidekiq jobs to finish:
+ 1. On the left sidebar, select **Monitoring > Background Jobs**.
+ 1. Under the Sidekiq dashboard, select **Queues** and then **Live Poll**.
+ Wait for **Busy** and **Enqueued** to drop to 0.
+ These queues contain work that has been submitted by your users;
+ shutting down before these jobs complete may cause the work to be lost.
+ Make note of the numbers shown in the Sidekiq dashboard for post-migration verification.
+1. Flush the Redis database to disk, and stop GitLab other than the services needed for migration:
+
+ ```shell
+ sudo /opt/gitlab/embedded/bin/redis-cli -s /var/opt/gitlab/redis/redis.socket save && sudo gitlab-ctl stop && sudo gitlab-ctl start postgresql && sudo gitlab-ctl start gitaly
+ ```
+
+1. Create a GitLab backup:
+
+ ```shell
+ sudo gitlab-backup create
+ ```
+
+1. Disable the following GitLab services and prevent unintentional restarts by adding the following to the bottom of `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ alertmanager['enable'] = false
+ gitlab_exporter['enable'] = false
+ gitlab_pages['enable'] = false
+ gitlab_workhorse['enable'] = false
+ grafana['enable'] = false
+ logrotate['enable'] = false
+ gitlab_rails['incoming_email_enabled'] = false
+ nginx['enable'] = false
+ node_exporter['enable'] = false
+ postgres_exporter['enable'] = false
+ postgresql['enable'] = false
+ prometheus['enable'] = false
+ puma['enable'] = false
+ redis['enable'] = false
+ redis_exporter['enable'] = false
+ registry['enable'] = false
+ sidekiq['enable'] = false
+ ```
+
+1. Reconfigure GitLab:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
+
+1. Verify everything is stopped, and confirm no services are running:
+
+ ```shell
+ sudo gitlab-ctl status
+ ```
+
+1. Transfer the Redis database and GitLab backups to the new server:
+
+ ```shell
+ sudo scp /var/opt/gitlab/redis/dump.rdb <your-linux-username>@new-server:/var/opt/gitlab/redis
+ sudo scp /var/opt/gitlab/backups/your-backup.tar <your-linux-username>@new-server:/var/opt/gitlab/backups
+ ```
+
+### Restore data on the new server
+
+1. Restore appropriate file system permissions:
+
+ ```shell
+ sudo chown gitlab-redis /var/opt/gitlab/redis
+ sudo chown gitlab-redis:gitlab-redis /var/opt/gitlab/redis/dump.rdb
+ sudo chown git:root /var/opt/gitlab/backups
+ sudo chown git:git /var/opt/gitlab/backups/your-backup.tar
+ ```
+
+1. [Restore the GitLab backup](#restore-gitlab).
+1. Verify that the Redis database restored correctly:
+ 1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+ 1. Select **Admin Area**.
+ 1. On the left sidebar, select **Monitoring > Background Jobs**.
+ 1. Under the Sidekiq dashboard, verify that the numbers
+ match with what was shown on the old server.
+ 1. While still under the Sidekiq dashboard, select **Cron** and then **Enable All**
+ to re-enable periodic background jobs.
+1. Test that read-only operations on the GitLab instance work as expected. For example, browse through project repository files, merge requests, and issues.
+1. Disable [Maintenance Mode](../maintenance_mode/index.md), if previously enabled.
+1. Test that the GitLab instance is working as expected.
+1. If applicable, re-enable [incoming email](../incoming_email.md) and test it is working as expected.
+1. Update your DNS or load balancer to point at the new server.
+1. Unblock new CI/CD jobs from starting by removing the custom NGINX configuration
+ you added previously:
+
+ ```ruby
+ # The following line must be removed
+ nginx['custom_gitlab_server_config'] = "location = /api/v4/jobs/request {\n deny all;\n return 503;\n }\n"
+ ```
+
+1. Reconfigure GitLab:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
+
+1. Remove the scheduled maintenance [broadcast message banner](../broadcast_messages.md).
+
+## Additional notes
+
+This documentation is for GitLab Community and Enterprise Edition. We back up
+GitLab.com and ensure your data is secure. You can't, however, use these
+methods to export or back up your data yourself from GitLab.com.
+
+Issues are stored in the database, and can't be stored in Git itself.
+
+## Related features
+
+- [Geo](../geo/index.md)
+- [Disaster Recovery (Geo)](../geo/disaster_recovery/index.md)
+- [Migrating GitLab groups](../../user/group/import/index.md)
+- [Import and migrate projects](../../user/project/import/index.md)
diff --git a/doc/administration/backup_restore/restore_gitlab.md b/doc/administration/backup_restore/restore_gitlab.md
new file mode 100644
index 00000000000..2cc0c68c66b
--- /dev/null
+++ b/doc/administration/backup_restore/restore_gitlab.md
@@ -0,0 +1,432 @@
+---
+stage: Systems
+group: Geo
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Restore GitLab **(FREE SELF)**
+
+GitLab provides a command line interface to restore your entire installation,
+and is flexible enough to fit your needs.
+
+The [restore prerequisites section](#restore-prerequisites) includes crucial
+information. Be sure to read and test the complete restore process at least
+once before attempting to perform it in a production environment.
+
+NOTE:
+You can only restore a backup to **exactly the same version and type (CE/EE)**
+of GitLab on which it was created (for example CE 15.1.4).
+
+If your backup is a different version than the current installation, you must
+[downgrade](../../update/package/downgrade.md) or [upgrade](../../update/package/index.md#upgrade-to-a-specific-version-using-the-official-repositories) your GitLab installation
+before restoring the backup.
+
+Each backup archive contains a full self-contained backup, including those created through the [incremental repository backup procedure](backup_gitlab.md#incremental-repository-backups). To restore an incremental repository backup, use the same instructions as restoring any other regular backup archive.
+
+## Restore prerequisites
+
+You need to have a working GitLab installation before you can perform a
+restore. This is because the system user performing the restore actions (`git`)
+is usually not allowed to create or delete the SQL database needed to import
+data into (`gitlabhq_production`). All existing data is either erased
+(SQL) or moved to a separate directory (such as repositories and uploads).
+Restoring SQL data skips views owned by PostgreSQL extensions.
+
+To restore a backup, **you must also restore the GitLab secrets**.
+These include the database encryption key, [CI/CD variables](../../ci/variables/index.md), and
+variables used for [two-factor authentication](../../user/profile/account/two_factor_authentication.md).
+Without the keys, [multiple issues occur](backup_gitlab.md#when-the-secrets-file-is-lost),
+including loss of access by users with [two-factor authentication enabled](../../user/profile/account/two_factor_authentication.md),
+and GitLab Runners cannot log in.
+
+Restore:
+
+- `/etc/gitlab/gitlab-secrets.json` (Linux package)
+- `/home/git/gitlab/.secret` (self-compiled installations)
+- Rails secret (cloud-native GitLab)
+ - [This can be converted to the Linux package format](https://docs.gitlab.com/charts/installation/migration/helm_to_package.html), if required.
+
+You may also want to restore your previous `/etc/gitlab/gitlab.rb` (for Omnibus packages)
+or `/home/git/gitlab/config/gitlab.yml` (for installations from source) and
+any TLS keys, certificates (`/etc/gitlab/ssl`, `/etc/gitlab/trusted-certs`), or
+[SSH host keys](https://superuser.com/questions/532040/copy-ssh-keys-from-one-server-to-another-server/532079#532079).
+
+Depending on your case, you might want to run the restore command with one or
+more of the following options:
+
+- `BACKUP=timestamp_of_backup`: Required if more than one backup exists.
+ Read what the [backup timestamp is about](backup_gitlab.md#backup-timestamp).
+- `force=yes`: Doesn't ask if the `authorized_keys` file should get regenerated,
+ and assumes 'yes' for warning about database tables being removed,
+ enabling the `Write to authorized_keys file` setting, and updating LDAP
+ providers.
+
+If you're restoring into directories that are mount points, you must ensure these directories are
+empty before attempting a restore. Otherwise, GitLab attempts to move these directories before
+restoring the new data, which causes an error.
+
+Read more about [configuring NFS mounts](../nfs.md)
+
+Restoring a backup from an instance using local storage restores to local storage even if the target instance uses object storage.
+Migrations to object storage must be done before or after restoration.
+
+## Restore for Omnibus GitLab installations
+
+This procedure assumes that:
+
+- You have installed the **exact same version and type (CE/EE)** of GitLab
+ Omnibus with which the backup was created.
+- You have run `sudo gitlab-ctl reconfigure` at least once.
+- GitLab is running. If not, start it using `sudo gitlab-ctl start`.
+
+First ensure your backup tar file is in the backup directory described in the
+`gitlab.rb` configuration `gitlab_rails['backup_path']`. The default is
+`/var/opt/gitlab/backups`. The backup file needs to be owned by the `git` user.
+
+```shell
+sudo cp 11493107454_2018_04_25_10.6.4-ce_gitlab_backup.tar /var/opt/gitlab/backups/
+sudo chown git:git /var/opt/gitlab/backups/11493107454_2018_04_25_10.6.4-ce_gitlab_backup.tar
+```
+
+Stop the processes that are connected to the database. Leave the rest of GitLab
+running:
+
+```shell
+sudo gitlab-ctl stop puma
+sudo gitlab-ctl stop sidekiq
+# Verify
+sudo gitlab-ctl status
+```
+
+Next, ensure you have completed the [restore prerequisites](#restore-prerequisites) steps and have run `gitlab-ctl reconfigure`
+after copying over the GitLab secrets file from the original installation.
+
+Next, restore the backup, specifying the timestamp of the backup you wish to
+restore:
+
+```shell
+# This command will overwrite the contents of your GitLab database!
+# NOTE: "_gitlab_backup.tar" is omitted from the name
+sudo gitlab-backup restore BACKUP=11493107454_2018_04_25_10.6.4-ce
+```
+
+If there's a GitLab version mismatch between your backup tar file and the
+installed version of GitLab, the restore command aborts with an error
+message. Install the [correct GitLab version](https://packages.gitlab.com/gitlab/),
+and then try again.
+
+WARNING:
+The restore command requires [additional parameters](backup_gitlab.md#back-up-and-restore-for-installations-using-pgbouncer) when
+your installation is using PgBouncer, for either performance reasons or when using it with a Patroni cluster.
+
+Next, restart and [check](../raketasks/maintenance.md#check-gitlab-configuration) GitLab:
+
+```shell
+sudo gitlab-ctl restart
+sudo gitlab-rake gitlab:check SANITIZE=true
+```
+
+In GitLab 13.1 and later, check [database values can be decrypted](../raketasks/check.md#verify-database-values-can-be-decrypted-using-the-current-secrets)
+especially if `/etc/gitlab/gitlab-secrets.json` was restored, or if a different server is
+the target for the restore.
+
+```shell
+sudo gitlab-rake gitlab:doctor:secrets
+```
+
+For added assurance, you can perform [an integrity check on the uploaded files](../raketasks/check.md#uploaded-files-integrity):
+
+```shell
+sudo gitlab-rake gitlab:artifacts:check
+sudo gitlab-rake gitlab:lfs:check
+sudo gitlab-rake gitlab:uploads:check
+```
+
+## Restore for Docker image and GitLab Helm chart installations
+
+For GitLab installations using the Docker image or the GitLab Helm chart on a
+Kubernetes cluster, the restore task expects the restore directories to be
+empty. However, with Docker and Kubernetes volume mounts, some system level
+directories may be created at the volume roots, such as the `lost+found`
+directory found in Linux operating systems. These directories are usually owned
+by `root`, which can cause access permission errors since the restore Rake task
+runs as the `git` user. To restore a GitLab installation, users have to confirm
+the restore target directories are empty.
+
+For both these installation types, the backup tarball has to be available in
+the backup location (default location is `/var/opt/gitlab/backups`).
+
+### Restore for Helm chart installations
+
+The GitLab Helm chart uses the process documented in
+[restoring a GitLab Helm chart installation](https://docs.gitlab.com/charts/backup-restore/restore.html#restoring-a-gitlab-installation)
+
+### Restore for Docker image installations
+
+If you're using [Docker Swarm](../../install/docker.md#install-gitlab-using-docker-swarm-mode),
+the container might restart during the restore process because Puma is shut down,
+and so the container health check fails. To work around this problem,
+temporarily disable the health check mechanism.
+
+1. Edit `docker-compose.yml`:
+
+ ```yaml
+ healthcheck:
+ disable: true
+ ```
+
+1. Deploy the stack:
+
+ ```shell
+ docker stack deploy --compose-file docker-compose.yml mystack
+ ```
+
+For more information, see [issue 6846](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/6846 "GitLab restore can fail owing to `gitlab-healthcheck`").
+
+The restore task can be run from the host:
+
+```shell
+# Stop the processes that are connected to the database
+docker exec -it <name of container> gitlab-ctl stop puma
+docker exec -it <name of container> gitlab-ctl stop sidekiq
+
+# Verify that the processes are all down before continuing
+docker exec -it <name of container> gitlab-ctl status
+
+# Run the restore. NOTE: "_gitlab_backup.tar" is omitted from the name
+docker exec -it <name of container> gitlab-backup restore BACKUP=11493107454_2018_04_25_10.6.4-ce
+
+# Restart the GitLab container
+docker restart <name of container>
+
+# Check GitLab
+docker exec -it <name of container> gitlab-rake gitlab:check SANITIZE=true
+```
+
+## Restore for installation from source
+
+First, ensure your backup tar file is in the backup directory described in the
+`gitlab.yml` configuration:
+
+```yaml
+## Backup settings
+backup:
+ path: "tmp/backups" # Relative paths are relative to Rails.root (default: tmp/backups/)
+```
+
+The default is `/home/git/gitlab/tmp/backups`, and it needs to be owned by the `git` user. Now, you can begin the backup procedure:
+
+```shell
+# Stop processes that are connected to the database
+sudo service gitlab stop
+
+sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production
+```
+
+Example output:
+
+```plaintext
+Unpacking backup... [DONE]
+Restoring database tables:
+-- create_table("events", {:force=>true})
+ -> 0.2231s
+[...]
+- Loading fixture events...[DONE]
+- Loading fixture issues...[DONE]
+- Loading fixture keys...[SKIPPING]
+- Loading fixture merge_requests...[DONE]
+- Loading fixture milestones...[DONE]
+- Loading fixture namespaces...[DONE]
+- Loading fixture notes...[DONE]
+- Loading fixture projects...[DONE]
+- Loading fixture protected_branches...[SKIPPING]
+- Loading fixture schema_migrations...[DONE]
+- Loading fixture services...[SKIPPING]
+- Loading fixture snippets...[SKIPPING]
+- Loading fixture taggings...[SKIPPING]
+- Loading fixture tags...[SKIPPING]
+- Loading fixture users...[DONE]
+- Loading fixture users_projects...[DONE]
+- Loading fixture web_hooks...[SKIPPING]
+- Loading fixture wikis...[SKIPPING]
+Restoring repositories:
+- Restoring repository abcd... [DONE]
+- Object pool 1 ...
+Deleting tmp directories...[DONE]
+```
+
+Next, restore `/home/git/gitlab/.secret` if necessary, [as previously mentioned](#restore-prerequisites).
+
+Restart GitLab:
+
+```shell
+sudo service gitlab restart
+```
+
+## Restoring only one or a few projects or groups from a backup
+
+Although the Rake task used to restore a GitLab instance doesn't support
+restoring a single project or group, you can use a workaround by restoring
+your backup to a separate, temporary GitLab instance, and then export your
+project or group from there:
+
+1. [Install a new GitLab](../../install/index.md) instance at the same version as
+ the backed-up instance from which you want to restore.
+1. [Restore the backup](#restore-gitlab) into this new instance, then
+ export your [project](../../user/project/settings/import_export.md)
+ or [group](../../user/group/import/index.md#migrate-groups-by-uploading-an-export-file-deprecated). For more information about what is and isn't exported, see the export feature's documentation.
+1. After the export is complete, go to the old instance and then import it.
+1. After importing the projects or groups that you wanted is complete, you may
+ delete the new, temporary GitLab instance.
+
+A feature request to provide direct restore of individual projects or groups
+is being discussed in [issue #17517](https://gitlab.com/gitlab-org/gitlab/-/issues/17517).
+
+## Restore options
+
+The command line tool GitLab provides to restore from backup can accept more
+options.
+
+### Disabling prompts during restore
+
+During a restore from backup, the restore script may ask for confirmation before
+proceeding. If you wish to disable these prompts, you can set the `GITLAB_ASSUME_YES`
+environment variable to `1`.
+
+For Omnibus GitLab packages:
+
+```shell
+sudo GITLAB_ASSUME_YES=1 gitlab-backup restore
+```
+
+For installations from source:
+
+```shell
+sudo -u git -H GITLAB_ASSUME_YES=1 bundle exec rake gitlab:backup:restore RAILS_ENV=production
+```
+
+### Excluding tasks on restore
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/19347) in GitLab 14.10.
+
+You can exclude specific tasks on restore by adding the environment variable `SKIP`, whose values are a comma-separated list of the following options:
+
+- `db` (database)
+- `uploads` (attachments)
+- `builds` (CI job output logs)
+- `artifacts` (CI job artifacts)
+- `lfs` (LFS objects)
+- `terraform_state` (Terraform states)
+- `registry` (Container Registry images)
+- `pages` (Pages content)
+- `repositories` (Git repositories data)
+- `packages` (Packages)
+
+For Omnibus GitLab packages:
+
+```shell
+sudo gitlab-backup restore BACKUP=timestamp_of_backup SKIP=db,uploads
+```
+
+For installations from source:
+
+```shell
+sudo -u git -H bundle exec rake gitlab:backup:restore BACKUP=timestamp_of_backup SKIP=db,uploads RAILS_ENV=production
+```
+
+### Restore specific repository storages
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86896) in GitLab 15.0.
+
+When using [multiple repository storages](../repository_storage_paths.md),
+repositories from specific repository storages can be restored separately
+using the `REPOSITORIES_STORAGES` option. The option accepts a comma-separated list of
+storage names.
+
+For example, for Omnibus GitLab installations:
+
+```shell
+sudo gitlab-backup restore BACKUP=timestamp_of_backup REPOSITORIES_STORAGES=storage1,storage2
+```
+
+For example, for installations from source:
+
+```shell
+sudo -u git -H bundle exec rake gitlab:backup:restore BACKUP=timestamp_of_backup REPOSITORIES_STORAGES=storage1,storage2
+```
+
+### Restore specific repositories
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/88094) in GitLab 15.1.
+
+You can restore specific repositories using the `REPOSITORIES_PATHS` and the `SKIP_REPOSITORIES_PATHS` options.
+Both options accept a comma-separated list of project and group paths. If you
+specify a group path, all repositories in all projects in the group and
+descendent groups are included or skipped, depending on which option you used. The project and group repositories must exist within the specified backup.
+
+For example, to restore all repositories for all projects in **Group A** (`group-a`), the repository for **Project C** in **Group B** (`group-b/project-c`),
+and skip the **Project D** in **Group A** (`group-a/project-d`):
+
+- Omnibus GitLab installations:
+
+ ```shell
+ sudo gitlab-backup restore BACKUP=timestamp_of_backup REPOSITORIES_PATHS=group-a,group-b/project-c SKIP_REPOSITORIES_PATHS=group-a/project-d
+ ```
+
+- Installations from source:
+
+ ```shell
+ sudo -u git -H bundle exec rake gitlab:backup:restore BACKUP=timestamp_of_backup REPOSITORIES_PATHS=group-a,group-b/project-c SKIP_REPOSITORIES_PATHS=group-a/project-d
+ ```
+
+### Restore untarred backups
+
+If an [untarred backup](backup_gitlab.md#skipping-tar-creation) (made with `SKIP=tar`) is found,
+and no backup is chosen with `BACKUP=<timestamp>`, the untarred backup is used.
+
+For example, for Omnibus GitLab installations:
+
+```shell
+sudo gitlab-backup restore
+```
+
+For example, for installations from source:
+
+```shell
+sudo -u git -H bundle exec rake gitlab:backup:restore
+```
+
+## Troubleshooting
+
+The following are possible problems you might encounter, along with potential
+solutions.
+
+### Restoring database backup using Omnibus packages outputs warnings
+
+If you're using backup restore procedures, you may encounter the following
+warning messages:
+
+```plaintext
+ERROR: must be owner of extension pg_trgm
+ERROR: must be owner of extension btree_gist
+ERROR: must be owner of extension plpgsql
+WARNING: no privileges could be revoked for "public" (two occurrences)
+WARNING: no privileges were granted for "public" (two occurrences)
+```
+
+Be advised that the backup is successfully restored in spite of these warning
+messages.
+
+The Rake task runs this as the `gitlab` user, which doesn't have superuser
+access to the database. When restore is initiated, it also runs as the `gitlab`
+user, but it also tries to alter the objects it doesn't have access to.
+Those objects have no influence on the database backup or restore, but display
+a warning message.
+
+For more information, see:
+
+- PostgreSQL issue tracker:
+ - [Not being a superuser](https://www.postgresql.org/message-id/201110220712.30886.adrian.klaver@gmail.com).
+ - [Having different owners](https://www.postgresql.org/message-id/2039.1177339749@sss.pgh.pa.us).
+
+- Stack Overflow: [Resulting errors](https://stackoverflow.com/questions/4368789/error-must-be-owner-of-language-plpgsql).
diff --git a/doc/administration/broadcast_messages.md b/doc/administration/broadcast_messages.md
new file mode 100644
index 00000000000..556edbd3e5e
--- /dev/null
+++ b/doc/administration/broadcast_messages.md
@@ -0,0 +1,120 @@
+---
+stage: Growth
+group: Acquisition
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+type: reference, howto
+---
+
+# Broadcast messages **(FREE SELF)**
+
+> - Target roles [introduced](https://gitlab.com/gitlab-org/growth/team-tasks/-/issues/461) in GitLab 14.8 [with a flag](../administration/feature_flags.md) named `role_targeted_broadcast_messages`. Disabled by default.
+> - Theme [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83251) and background color removed in GitLab 14.10.
+
+GitLab can display broadcast messages to users of a GitLab instance. There are two types of broadcast messages:
+
+- Banners
+- Notifications
+
+Broadcast messages can be managed using the [broadcast messages API](../api/broadcast_messages.md).
+
+## Banners
+
+Banners are shown on the top of a page and optionally in the command line as a Git remote response.
+
+![Broadcast Message Banner](img/broadcast_messages_banner_v15_0.png)
+
+```shell
+$ git push
+...
+remote:
+remote: **Welcome** to GitLab :wave:
+remote:
+...
+```
+
+If more than one banner is active at one time, they are displayed at the top of the page in order of creation. In the command line, only the latest banner is shown.
+
+## Notifications
+
+Notifications are shown on the bottom right of a page and can contain placeholders. A placeholder is replaced with an attribute of the active user. Placeholders must be surrounded by curly braces, for example `{{name}}`.
+The available placeholders are:
+
+- `{{email}}`
+- `{{name}}`
+- `{{user_id}}`
+- `{{username}}`
+- `{{instance_id}}`
+
+If the user is not signed in, user related values are empty.
+
+![Broadcast Message Notification](img/broadcast_messages_notification_v12_10.png)
+
+If more than one notification is active at one time, only the newest is shown.
+
+## Add a broadcast message
+
+To display messages to users on your GitLab instance, add a broadcast message.
+
+To add a broadcast message:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Messages**.
+1. Add the text for the message to the **Message** field. You can style a message's content using Markdown, emoji, and the `a` and `br` HTML tags.
+ The `br` tag inserts a line break. The `a` HTML tag accepts `class` and `style` attributes with the following CSS properties:
+ - `color`
+ - `border`
+ - `background`
+ - `padding`
+ - `margin`
+ - `text-decoration`
+1. Select a **Theme**. The default theme is `indigo`.
+1. Select the **Dismissable** checkbox to enable users to dismiss the broadcast message.
+1. Optional. Clear the **Git remote responses** checkbox to prevent broadcast messages from being displayed in the command line as Git remote responses.
+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 and time (UTC) for the message to start and end.
+1. Select **Add broadcast message**.
+
+When a broadcast message expires, it no longer displays in the user interface but is still listed in the
+list of broadcast messages.
+
+## Edit a broadcast message
+
+If you must make changes to a broadcast message, you can edit it.
+
+To edit a broadcast message:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Messages**.
+1. From the list of broadcast messages, select the edit button for the message.
+1. After making the required changes, select **Update broadcast message**.
+
+Expired messages can be made active again by changing their end date.
+
+## Delete a broadcast message
+
+If you no longer require a broadcast message, you can delete it.
+You can delete a broadcast message while it's active.
+
+To delete a broadcast message:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Messages**.
+1. From the list of broadcast messages, select the delete button for the message.
+
+When a broadcast message is deleted, it's removed from the list of broadcast messages.
+
+<!-- ## 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, for example `### Getting error message X`.
+If you have none to add when creating a doc, leave this section in place
+but commented out to help encourage others to add to it in the future. -->
diff --git a/doc/administration/clusters/kas.md b/doc/administration/clusters/kas.md
index b44c9571715..583a6401c05 100644
--- a/doc/administration/clusters/kas.md
+++ b/doc/administration/clusters/kas.md
@@ -142,10 +142,9 @@ For details, see [how to use the GitLab-KAS chart](https://docs.gitlab.com/chart
## Kubernetes API proxy cookie
-> Introduced in GitLab 15.10 [with feature flags](../feature_flags.md) named `kas_user_access` and `kas_user_access_project`. Disabled by default.
-
-FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to [enable the feature flags](../feature_flags.md) named `kas_user_access` and `kas_user_access_project`.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/104504) in GitLab 15.10 [with feature flags](../feature_flags.md) named `kas_user_access` and `kas_user_access_project`. Disabled by default.
+> - Feature flags `kas_user_access` and `kas_user_access_project` [enabled](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/123479) in GitLab 16.1.
+> - Feature flags `kas_user_access` and `kas_user_access_project` [removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/125835) in GitLab 16.2.
KAS proxies Kubernetes API requests to the GitLab agent with either:
diff --git a/doc/administration/compliance.md b/doc/administration/compliance.md
index 79133d5a6c7..978e43b2e2c 100644
--- a/doc/administration/compliance.md
+++ b/doc/administration/compliance.md
@@ -20,7 +20,7 @@ and secure supply chain best practices:
| Feature | Instances | Groups | Projects | Description |
|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-----------------------|:-----------------------|:-----------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| [Credentials inventory](../user/admin_area/credentials_inventory.md) | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Keep track of the credentials used by all of the users in a GitLab instance. |
+| [Credentials inventory](credentials_inventory.md) | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Keep track of the credentials used by all of the users in a GitLab instance. |
| [Granular user roles<br/>and flexible permissions](../user/permissions.md) | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Manage access and permissions with five different user roles and settings for external users. Set permissions according to people's role, rather than either read or write access to a repository. Don't share the source code with people that only need access to the issue tracker. |
| [Merge request approvals](../user/project/merge_requests/approvals/index.md) | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Configure approvals required for merge requests. |
| [Push rules](../user/project/repository/push_rules.md) | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Control pushes to your repositories. |
@@ -65,10 +65,10 @@ These features can also help with compliance requirements:
| Feature | Instances | Groups | Projects | Description |
|:------------------------------------------------------------------------------------------------------------------------------------|:-----------------------|:-----------------------|:-----------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| [Email all users of a project,<br/>group, or entire server](../user/admin_area/email_from_gitlab.md) | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Email groups of users based on project or group membership, or email everyone using the GitLab instance. These emails are great for scheduled maintenance or upgrades. |
-| [Enforce ToS acceptance](../user/admin_area/settings/terms.md) | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Enforce your users accepting new terms of service by blocking GitLab traffic. |
+| [Email all users of a project,<br/>group, or entire server](email_from_gitlab.md) | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Email groups of users based on project or group membership, or email everyone using the GitLab instance. These emails are great for scheduled maintenance or upgrades. |
+| [Enforce ToS acceptance](settings/terms.md) | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Enforce your users accepting new terms of service by blocking GitLab traffic. |
| [External Status Checks](../user/project/merge_requests/status_checks.md) | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | Interface with third-party systems you already use during development to ensure you remain compliant. |
-| [Generate reports on permission<br/>levels of users](../user/admin_area/index.md#user-permission-export) | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Generate a report listing all users' access permissions for groups and projects in the instance. |
+| [Generate reports on permission<br/>levels of users](../administration/admin_area.md#user-permission-export) | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Generate a report listing all users' access permissions for groups and projects in the instance. |
| [License compliance](../user/compliance/license_compliance/index.md) | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | Search dependencies for their licenses. This lets you determine if the licenses of your project's dependencies are compatible with your project's license. |
| [Lock project membership to group](../user/group/access_and_permissions.md#prevent-members-from-being-added-to-projects-in-a-group) | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Group owners can prevent new members from being added to projects in a group. |
| [LDAP group sync](auth/ldap/ldap_synchronization.md#group-sync) | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Automatically synchronize groups and manage SSH keys, permissions, and authentication, so you can focus on building your product, not configuring your tools. |
diff --git a/doc/administration/configure.md b/doc/administration/configure.md
index d68e81ebf69..8ff2ae5aa9d 100644
--- a/doc/administration/configure.md
+++ b/doc/administration/configure.md
@@ -11,7 +11,7 @@ Customize and configure your self-managed GitLab installation.
- [Authentication](auth/index.md)
- [CI/CD](../administration/cicd.md)
-- [Configuration](../user/admin_area/index.md)
+- [Configuration](../administration/admin_area.md)
- [Consul](../administration/consul.md)
- [Environment variables](../administration/environment_variables.md)
- [File hooks](../administration/file_hooks.md)
@@ -35,7 +35,7 @@ Customize and configure your self-managed GitLab installation.
- [Agent server for Kubernetes](../administration/clusters/kas.md)
- [Server hooks](../administration/server_hooks.md)
- [Terraform state](../administration/terraform_state.md)
-- [Terraform limits](../user/admin_area/settings/terraform_limits.md)
+- [Terraform limits](settings/terraform_limits.md)
- [Packages](../administration/packages/index.md)
- [Web terminals](../administration/integration/terminal.md)
- [Wikis](../administration/wikis/index.md)
diff --git a/doc/administration/credentials_inventory.md b/doc/administration/credentials_inventory.md
new file mode 100644
index 00000000000..482d46498e3
--- /dev/null
+++ b/doc/administration/credentials_inventory.md
@@ -0,0 +1,86 @@
+---
+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/product/ux/technical-writing/#assignments
+type: howto
+---
+
+# Credentials inventory **(ULTIMATE SELF)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20912) in GitLab 12.6.
+> - [Bot-created access tokens not displayed in personal access token list](https://gitlab.com/gitlab-org/gitlab/-/issues/351759) in GitLab 14.9.
+
+GitLab administrators are responsible for the overall security of their instance. To assist, GitLab
+provides a Credentials inventory to keep track of all the credentials that can be used to access
+their self-managed instance.
+
+Use Credentials inventory to see for your GitLab instance all:
+
+- Personal access tokens (PAT).
+- Project access tokens (GitLab 14.8 and later).
+- SSH keys.
+- GPG keys.
+
+You can also [revoke](#revoke-a-users-personal-access-token) and [delete](#delete-a-users-ssh-key) and see:
+
+- Who they belong to.
+- Their access scope.
+- Their usage pattern.
+- When they expire. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/214809) in GitLab 13.2.
+- When they were revoked. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/214809) in GitLab 13.2.
+
+To access the Credentials inventory:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Credentials**.
+
+## Revoke a user's personal access token
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/214811) in GitLab 13.4.
+
+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 | 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.
+
+![Credentials inventory page - Personal access tokens](img/credentials_inventory_personal_access_tokens_v14_9.png)
+
+## Revoke a user's project access token
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/243833) in GitLab 14.8.
+
+The **Revoke** button next to a project access token can be selected to revoke that particular project access token. This both:
+
+- Revokes the token project access token.
+- Enqueues a background worker to delete the project bot user.
+
+![Credentials inventory page - Project access tokens](img/credentials_inventory_project_access_tokens_v14_9.png)
+
+## Delete a user's SSH key
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/225248) in GitLab 13.5.
+
+You can **Delete** a user's SSH key by navigating to the credentials inventory's SSH Keys tab.
+The instance then notifies the user.
+
+![Credentials inventory page - SSH keys](img/credentials_inventory_ssh_keys_v14_9.png)
+
+## Review existing GPG keys
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/282429) in GitLab 13.10.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/292961) in GitLab 13.12.
+
+You can view all existing GPG in your GitLab instance by navigating to the
+credentials inventory GPG Keys tab, as well as the following properties:
+
+- Who the GPG key belongs to.
+- The ID of the GPG key.
+- Whether the GPG key is [verified or unverified](../user/project/repository/gpg_signed_commits/index.md)
+
+![Credentials inventory page - GPG keys](img/credentials_inventory_gpg_keys_v14_9.png)
diff --git a/doc/administration/custom_project_templates.md b/doc/administration/custom_project_templates.md
new file mode 100644
index 00000000000..2bbbb5649e6
--- /dev/null
+++ b/doc/administration/custom_project_templates.md
@@ -0,0 +1,73 @@
+---
+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/product/ux/technical-writing/#assignments
+---
+
+# Custom instance-level project templates **(PREMIUM SELF)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/6860) in GitLab 11.2.
+
+GitLab administrators can set a group to be the source of project templates that are
+selectable when a new project is created on the instance. These templates can be selected
+when you go to **New project > Create from template** and select the **Instance** tab.
+
+Every project in the group, but not its subgroups, can be selected when a new project
+is created, based on the user's access permissions:
+
+- Public projects can be selected by any authenticated user as a template for a new project,
+ if all enabled [project features](../user/project/settings/index.md#configure-project-visibility-features-and-permissions)
+ except for **GitLab Pages** and **Security and Compliance** are set to **Everyone With Access**.
+ The same applies to internal projects.
+- Private projects can be selected only by users who are members of the projects.
+
+The **Metrics Dashboard** is set to **Only Project Members** when you create a new project. Make
+sure you change it to **Everyone With Access** before making it a project template.
+
+Repository and database information that are copied over to each new project are
+identical to the data exported with the [GitLab Project Import/Export](../user/project/settings/import_export.md).
+
+To set project templates at the group level, see [Custom group-level project templates](../user/group/custom_project_templates.md).
+
+## Select instance-level project template group
+
+To select the group to use as the source for the project templates:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Templates**.
+1. Expand **Custom project templates**.
+1. Select a group to use.
+1. Select **Save changes**.
+
+Projects in subgroups of the template group are **not** included in the template list.
+
+## What is copied from the templates
+
+The entire custom instance-level project templates repository is copied, including:
+
+- Branches
+- Commits
+- Tags
+
+If the user:
+
+- Has the Owner role on the custom instance-level project templates project or is a GitLab administrator, all project settings are copied over to the new
+ project.
+- Doesn't have the Owner role or is not a GitLab administrator, project [deploy keys](../user/project/deploy_keys/index.md#view-deploy-keys) and project
+ [webhooks](../user/project/integrations/webhooks.md) aren't copied over because they contain sensitive data.
+
+To learn more about what is migrated, see
+[Items that are exported](../user/project/settings/import_export.md#items-that-are-exported).
+
+<!-- ## 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, for example `### Getting error message X`.
+If you have none to add when creating a doc, leave this section in place
+but commented out to help encourage others to add to it in the future. -->
diff --git a/doc/administration/dedicated/index.md b/doc/administration/dedicated/index.md
index f2caa5fa368..db30684ab1c 100644
--- a/doc/administration/dedicated/index.md
+++ b/doc/administration/dedicated/index.md
@@ -14,7 +14,11 @@ The instructions on this page guide you through:
1. Onboarding and initial setup of your GitLab Dedicated instance.
1. Configuring your GitLab Dedicated instance including enabling and updating the settings for [available functionality](../../subscriptions/gitlab_dedicated/index.md#available-features).
-Any functionality in the GitLab application that is not controlled by the SaaS environment can be configured by using the [Admin Panel](../../user/admin_area/index.md).
+Any functionality in the GitLab application that is not controlled by the SaaS environment can be configured by using the [Admin Panel](../../administration/admin_area.md).
+
+Examples of SaaS environment settings include `gitlab.rb` configurations and access to shell, Rails console, and PostgreSQL console.
+These environment settings cannot be changed by tenants.
+GitLab Dedicated Engineers also don't have direct access to tenant environments, except for [break glass situations](../../subscriptions/gitlab_dedicated/index.md#access-controls).
## Onboarding
@@ -68,8 +72,9 @@ To create a KMS key using the AWS Console:
1. Key material origin: **KMS**
1. Regionality: **Multi-Region key**
1. Enter your values for key alias, description, and tags.
-1. Select Key administrators (optionally allow or deny key administrators to delete the key).
-1. For Key usage permissions, add the GitLab AWS account using the **Other AWS accounts** dialog.
+1. Select key administrators.
+1. Optional. Allow or prevent key administrators from deleting the key.
+1. On the **Define key usage permissions** page, under **Other AWS accounts**, add the GitLab AWS account.
The last page asks you to confirm the KMS key policy. It should look similar to the following example, populated with your account IDs and usernames:
diff --git a/doc/administration/diff_limits.md b/doc/administration/diff_limits.md
new file mode 100644
index 00000000000..48b52950ee3
--- /dev/null
+++ b/doc/administration/diff_limits.md
@@ -0,0 +1,53 @@
+---
+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/product/ux/technical-writing/#assignments
+type: reference
+---
+
+# Diff limits administration **(FREE SELF)**
+
+You can set a maximum size for display of diff files (patches).
+
+For details about diff files, [view changes between files](../user/project/merge_requests/changes.md).
+Read more about the [built-in limits for merge requests and diffs](../administration/instance_limits.md#merge-requests).
+
+## Configure diff limits
+
+WARNING:
+These settings are experimental. An increased maximum increases resource
+consumption of your instance. Keep this in mind when adjusting the maximum.
+
+To speed the loading time of merge request views and branch comparison views
+on your instance, you can configure three instance-level maximum values for diffs:
+
+| Value | Definition | Default value | Maximum value |
+| ----- | ---------- | :-----------: | :-----------: |
+| **Maximum diff patch size** | The total size, in bytes, of the entire diff. | 200 KB | 500 KB |
+| **Maximum diff files** | The total number of files changed in a diff. | 1000 | 3000 |
+| **Maximum diff lines** | The total number of lines changed in a diff. | 50,000 | 100,000 |
+
+When a diff reaches 10% of any of these values, the files are shown in a
+collapsed view, with a link to expand the diff. Diffs that exceed any of the
+set values are presented as **Too large** are cannot be expanded in the UI.
+
+To configure these values:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand **Diff limits**.
+1. Enter a value for the diff limit.
+1. Select **Save changes**.
+
+<!-- ## 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, for example `### Getting error message X`.
+If you have none to add when creating a doc, leave this section in place
+but commented out to help encourage others to add to it in the future. -->
diff --git a/doc/administration/docs_self_host.md b/doc/administration/docs_self_host.md
index 54f8c15a922..1eecc139d1f 100644
--- a/doc/administration/docs_self_host.md
+++ b/doc/administration/docs_self_host.md
@@ -163,7 +163,7 @@ To extract the HTML files of the documentation site:
## Redirect the `/help` links to the new Docs site
After your local product documentation site is running,
-[redirect the help links](../user/admin_area/settings/help_page.md#redirect-help-pages)
+[redirect the help links](../administration/settings/help_page.md#redirect-help-pages)
in the GitLab application to your local site, by using the fully qualified domain
name as the documentation URL. For example, if you used the
[Docker method](#self-host-the-product-documentation-with-docker), enter `http://0.0.0.0:4000`.
@@ -173,9 +173,9 @@ documentation URL requests as needed. For example, if your GitLab version is
14.5:
- The GitLab documentation URL becomes `http://0.0.0.0:4000/14.5/`.
-- The link in GitLab displays as `<instance_url>/help/user/admin_area/settings/help_page#destination-requirements`.
+- The link in GitLab displays as `<instance_url>/help/administration/settings/help_page#destination-requirements`.
- When you select the link, you are redirected to
-`http://0.0.0.0:4000/14.5/ee/user/admin_area/settings/help_page/#destination-requirements`.
+`http://0.0.0.0:4000/14.5/ee/administration/settings/help_page/#destination-requirements`.
To test the setting, in GitLab, select a **Learn more** link. For example:
diff --git a/doc/administration/email_from_gitlab.md b/doc/administration/email_from_gitlab.md
new file mode 100644
index 00000000000..9272f58d2b9
--- /dev/null
+++ b/doc/administration/email_from_gitlab.md
@@ -0,0 +1,61 @@
+---
+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/product/ux/technical-writing/#assignments
+type: howto, reference
+---
+
+# Email from GitLab **(PREMIUM SELF)**
+
+GitLab provides a tool to administrators for emailing all users, or users of
+a chosen group or project, right from the Admin Area. Users receive the email
+at their primary email address.
+
+For information about email notifications originating from GitLab, read
+[GitLab notification emails](../user/profile/notifications.md).
+
+## Use-cases
+
+- Notify your users about a new project, a new feature, or a new product launch.
+- Notify your users about a new deployment, or that downtime is expected
+ for a particular reason.
+
+## Sending emails to users from GitLab
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Overview > Users**.
+1. Select **Send email to users**.
+
+ ![administrators](img/email1.png)
+
+1. Compose an email and choose where to send it (all users or users of a
+ chosen group or project). The email body only supports plain text messages.
+ HTML, Markdown, and other rich text formats are not supported, and is
+ sent as plain text to users.
+
+ ![compose an email](img/email2.png)
+
+NOTE:
+[Starting with GitLab 13.0](https://gitlab.com/gitlab-org/gitlab/-/issues/31509), email notifications can be sent only once every 10 minutes. This helps minimize performance issues.
+
+## Unsubscribing from emails
+
+Users can choose to unsubscribe from receiving emails from GitLab by following
+the unsubscribe link in the email. Unsubscribing is unauthenticated in order
+to keep this feature simple.
+
+On unsubscribe, users receive an email notification that unsubscribe happened.
+The endpoint that provides the unsubscribe option is rate-limited.
+
+<!-- ## 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, for example `### Getting error message X`.
+If you have none to add when creating a doc, leave this section in place
+but commented out to help encourage others to add to it in the future. -->
diff --git a/doc/administration/external_users.md b/doc/administration/external_users.md
new file mode 100644
index 00000000000..f8ca379d10c
--- /dev/null
+++ b/doc/administration/external_users.md
@@ -0,0 +1,80 @@
+---
+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/product/ux/technical-writing/#assignments
+---
+
+# External users **(FREE SELF)**
+
+In cases where it is desired that a user has access only to some internal or
+private projects, there is the option of creating **External Users**. This
+feature may be useful when for example a contractor is working on a given
+project and should only have access to that project.
+
+External users:
+
+- Cannot create project, groups, and snippets in their personal namespaces.
+- Can only create projects (including forks), subgroups, and snippets within top-level groups to which they are explicitly granted access.
+- Can only access public projects and projects to which they are explicitly granted access,
+ thus hiding all other internal or private ones from them (like being
+ logged out).
+- Can only access public groups and groups to which they are explicitly granted access,
+ thus hiding all other internal or private ones from them (like being
+ logged out).
+- Can only access public snippets.
+
+Access can be granted by adding the user as member to the project or group.
+Like usual users, they receive a role in the project or group with all
+the abilities that are mentioned in the [permissions table](../user/permissions.md#project-members-permissions).
+For example, if an external user is added as Guest, and your project is internal or
+private, they do not have access to the code; you need to grant the external
+user access at the Reporter level or above if you want them to have access to the code. You should
+always take into account the
+[project's visibility and permissions settings](../user/project/settings/index.md#configure-project-visibility-features-and-permissions)
+as well as the permission level of the user.
+
+NOTE:
+External users still count towards a license seat.
+
+An administrator can flag a user as external by either of the following methods:
+
+- [Through the API](../api/users.md#user-modification).
+- Using the GitLab UI:
+ 1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+ 1. Select **Admin Area**.
+ 1. On the left sidebar, select **Overview > Users** to create a new user or edit an existing one.
+ There, you can find the option to flag the user as external.
+
+Additionally, users can be set as external users using:
+
+- [SAML groups](../integration/saml.md#external-groups).
+- [LDAP groups](../administration/auth/ldap/ldap_synchronization.md#external-groups).
+- the [External providers list](../integration/omniauth.md#create-an-external-providers-list).
+
+## Set a new user to external
+
+By default, new users are not set as external users. This behavior can be changed
+by an administrator:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand the **Account and limit** section.
+
+If you change the default behavior of creating new users as external, you
+have the option to narrow it down by defining a set of internal users.
+The **Internal users** field allows specifying an email address regex pattern to
+identify default internal users. New users whose email address matches the regex
+pattern are set to internal by default rather than an external collaborator.
+
+The regex pattern format is in Ruby, but it needs to be convertible to JavaScript,
+and the ignore case flag is set (`/regex pattern/i`). Here are some examples:
+
+- Use `\.internal@domain\.com$` to mark email addresses ending with
+ `.internal@domain.com` as internal.
+- Use `^(?:(?!\.ext@domain\.com).)*$\r?` to mark users with email addresses
+ not including `.ext@domain.com` as internal.
+
+WARNING:
+Be aware that this regex could lead to a
+[regular expression denial of service (ReDoS) attack](https://en.wikipedia.org/wiki/ReDoS).
diff --git a/doc/administration/geo/disaster_recovery/planned_failover.md b/doc/administration/geo/disaster_recovery/planned_failover.md
index 13e0938fa59..6ac67c3d21e 100644
--- a/doc/administration/geo/disaster_recovery/planned_failover.md
+++ b/doc/administration/geo/disaster_recovery/planned_failover.md
@@ -56,12 +56,12 @@ site you are about to failover to:
rsync --archive --perms --delete root@<geo-primary>:/var/opt/gitlab/gitlab-rails/shared/registry/. /var/opt/gitlab/gitlab-rails/shared/registry
```
-Alternatively, you can [back up](../../../raketasks/backup_restore.md#back-up-gitlab)
+Alternatively, you can [back up](../../../administration/backup_restore/index.md#back-up-gitlab)
the container registry on the primary site and restore it onto the secondary
site:
1. On your primary site, back up only the registry and
- [exclude specific directories from the backup](../../../raketasks/backup_gitlab.md#excluding-specific-directories-from-the-backup):
+ [exclude specific directories from the backup](../../../administration/backup_restore/backup_gitlab.md#excluding-specific-directories-from-the-backup):
```shell
# Create a backup in the /var/opt/gitlab/backups folder
@@ -71,7 +71,7 @@ site:
1. Copy the backup tarball generated from your primary site to the `/var/opt/gitlab/backups` folder
on your secondary site.
-1. On your secondary site, restore the registry following the [Restore GitLab](../../../raketasks/backup_restore.md#restore-gitlab)
+1. On your secondary site, restore the registry following the [Restore GitLab](../../../administration/backup_restore/index.md#restore-gitlab)
documentation.
## Preflight checks
diff --git a/doc/administration/geo/glossary.md b/doc/administration/geo/glossary.md
index 9abd7ea9347..2e9a637eb5c 100644
--- a/doc/administration/geo/glossary.md
+++ b/doc/administration/geo/glossary.md
@@ -19,19 +19,20 @@ these definitions yet.
We provide example diagrams and statements to demonstrate correct usage of terms.
-| Term | Definition | Scope | Discouraged synonyms |
-|---------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|-------------------------------------------------|
-| Node | An individual server that runs GitLab either with a specific role or as a whole (for example a Rails application node). In a cloud context this can be a specific machine type. | GitLab | instance, server |
-| Site | One or a collection of nodes running a single GitLab application. A site can be single-node or multi-node. | GitLab | deployment, installation instance |
-| Single-node site | A specific configuration of GitLab that uses exactly one node. | GitLab | single-server, single-instance
-| Multi-node site | A specific configuration of GitLab that uses more than one node. | GitLab | multi-server, multi-instance, high availability |
-| 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 | 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 | 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 | |
+| Term | Definition | Scope | Discouraged synonyms |
+|------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|-------------------------------------------------|
+| Node | An individual server that runs GitLab either with a specific role or as a whole (for example a Rails application node). In a cloud context this can be a specific machine type. | GitLab | instance, server |
+| Site | One or a collection of nodes running a single GitLab application. A site can be single-node or multi-node. | GitLab | deployment, installation instance |
+| Single-node site | A specific configuration of GitLab that uses exactly one node. | GitLab | single-server, single-instance |
+| Multi-node site | A specific configuration of GitLab that uses more than one node. | GitLab | multi-server, multi-instance, high availability |
+| 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 | 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 | 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 | |
+| Replication | Also called "synchronization". The uni-directional process that updates a resource on a secondary site to match the resource on the primary site. | Geo-specific | |
## Examples
diff --git a/doc/administration/geo/index.md b/doc/administration/geo/index.md
index ae2cc262160..0ab24cc4fb8 100644
--- a/doc/administration/geo/index.md
+++ b/doc/administration/geo/index.md
@@ -203,6 +203,7 @@ This list of limitations only reflects the latest version of GitLab. If you are
- [Disaster recovery](disaster_recovery/index.md) for multi-secondary sites causes downtime due to the complete re-synchronization and re-configuration of all non-promoted secondaries.
- For Git over SSH, to make the project clone URL display correctly regardless of which site you are browsing, secondary sites must use the same port as the primary. [GitLab issue #339262](https://gitlab.com/gitlab-org/gitlab/-/issues/339262) proposes to remove this limitation.
- Git push over SSH against a secondary site does not work for pushes over 1.86 GB. [GitLab issue #413109](https://gitlab.com/gitlab-org/gitlab/-/issues/413109) tracks this bug.
+- Backups [cannot be run on secondaries](replication/troubleshooting.md#message-error-canceling-statement-due-to-conflict-with-recovery).
### Limitations on replication/verification
@@ -217,7 +218,7 @@ If you try to view replication data on the primary site, you receive a warning t
The only way to view projects replication data for a particular secondary site is to visit that secondary site directly. For example, `https://<IP of your secondary site>/admin/geo/replication/projects`.
An [epic exists](https://gitlab.com/groups/gitlab-org/-/epics/4623) to fix this limitation.
-Keep in mind that mentioned URLs don't work when [Admin Mode](../../user/admin_area/settings/sign_in_restrictions.md#admin-mode) is enabled.
+Keep in mind that mentioned URLs don't work when [Admin Mode](../settings/sign_in_restrictions.md#admin-mode) is enabled.
When using Unified URL, visiting the secondary site directly means you must route your requests to the secondary site. Exactly how this might be done depends on your networking configuration. If using DNS to route requests to the appropriate site, then you can, for example, edit your local machine's `/etc/hosts` file to route your requests to the desired secondary site. If the Geo sites are all behind a load balancer, then depending on the load balancer, you might be able to configure all requests from your IP to go to a particular secondary site.
diff --git a/doc/administration/geo/replication/configuration.md b/doc/administration/geo/replication/configuration.md
index 18d0440965e..a5d85187812 100644
--- a/doc/administration/geo/replication/configuration.md
+++ b/doc/administration/geo/replication/configuration.md
@@ -190,7 +190,7 @@ keys must be manually replicated to the **secondary** site.
```ruby
##
## The unique identifier for the Geo site. See
- ## https://docs.gitlab.com/ee/user/admin_area/geo_nodes.html#common-settings
+ ## https://docs.gitlab.com/ee/administration/geo_nodes.html#common-settings
##
gitlab_rails['geo_node_name'] = '<site_name_here>'
```
@@ -332,7 +332,7 @@ the **primary** site. After you sign in:
1. Verify that it's correctly identified as a **secondary** Geo site, and that
Geo is enabled.
-The initial replication may take some time. The status of the site or the ‘backfill’ may still in progress. You
+The initial replication may take some time. The status of the site or the 'backfill' may still in progress. You
can monitor the synchronization process on each Geo site from the **primary**
site's **Geo Sites** dashboard in your browser.
diff --git a/doc/administration/geo/replication/datatypes.md b/doc/administration/geo/replication/datatypes.md
index f038bfd705c..b25700ccd29 100644
--- a/doc/administration/geo/replication/datatypes.md
+++ b/doc/administration/geo/replication/datatypes.md
@@ -80,10 +80,8 @@ on a machine:
- With multiple disks mounted as a single mount-point (like with a RAID array).
- Using LVM.
-GitLab does not require a special file system and can work with:
-
-- NFS.
-- A mounted Storage Appliance (there may be performance limitations when using a remote file system).
+GitLab does not require a special file system and can work with a mounted Storage Appliance. However, there can be
+performance limitations and consistency issues when using a remote file system.
Geo triggers garbage collection in Gitaly to [deduplicate forked repositories](../../../development/git_object_deduplication.md#git-object-deduplication-and-gitlab-geo) on Geo secondary sites.
@@ -111,7 +109,7 @@ GitLab stores files and blobs such as Issue attachments or LFS objects into eith
- The file system in a specific location.
- An [Object Storage](../../object_storage.md) solution. Object Storage solutions can be:
- - Cloud based like Amazon S3 Google Cloud Storage.
+ - Cloud based like Amazon S3 and Google Cloud Storage.
- Hosted by you (like MinIO).
- A Storage Appliance that exposes an Object Storage-compatible API.
@@ -192,7 +190,7 @@ successfully, you must replicate their data using some other means.
|:--------------------------------------------------------------------------------------------------------------|:------------------------------------------------------------------------|:---------------------------------------------------------------------------|:--------------------------------------------------------------------|:----------------------------------------------------------------|:------|
|[Application data in PostgreSQL](../../postgresql/index.md) | **Yes** (10.2) | **Yes** (10.2) | N/A | N/A | |
|[Project repository](../../../user/project/repository/index.md) | **Yes** (10.2) | **Yes** (10.7) | N/A | N/A | |
-|[Project wiki repository](../../../user/project/wiki/index.md) | **Yes** (10.2)<sup>2</sup> | **Yes** (10.7)<sup>2</sup> | N/A | N/A | Migrated to [self-service framework](../../../development/geo/framework.md) in 15.11. See GitLab issue [#367925](https://gitlab.com/gitlab-org/gitlab/-/issues/367925) for more details.<br /><br />Behind feature flag geo_project_wiki_repository_replication, enabled by default in (15.11). |
+|[Project wiki repository](../../../user/project/wiki/index.md) | **Yes** (10.2)<sup>2</sup> | **Yes** (10.7)<sup>2</sup> | N/A | N/A | Migrated to [self-service framework](../../../development/geo/framework.md) in 15.11. See GitLab issue [#367925](https://gitlab.com/gitlab-org/gitlab/-/issues/367925) for more details.<br /><br />Behind feature flag `geo_project_wiki_repository_replication`, enabled by default in (15.11). |
|[Group wiki repository](../../../user/project/wiki/group.md) | [**Yes** (13.10)](https://gitlab.com/gitlab-org/gitlab/-/issues/208147) | No | N/A | N/A | Behind feature flag `geo_group_wiki_repository_replication`, enabled by default. |
|[Uploads](../../uploads.md) | **Yes** (10.2) | **Yes** (14.6) | [**Yes** (15.1)](https://gitlab.com/groups/gitlab-org/-/epics/5551) | [No](object_storage.md#verification-of-files-in-object-storage) | Replication is behind the feature flag `geo_upload_replication`, enabled by default. Verification was behind the feature flag `geo_upload_verification`, removed in 14.8. |
|[LFS objects](../../lfs/index.md) | **Yes** (10.2) | **Yes** (14.6) | [**Yes** (15.1)](https://gitlab.com/groups/gitlab-org/-/epics/5551) | [No](object_storage.md#verification-of-files-in-object-storage) | GitLab versions 11.11.x and 12.0.x are affected by [a bug that prevents any new LFS objects from replicating](https://gitlab.com/gitlab-org/gitlab/-/issues/32696).<br /><br />Replication is behind the feature flag `geo_lfs_object_replication`, enabled by default. Verification was behind the feature flag `geo_lfs_object_verification`, removed in 14.7. |
@@ -203,7 +201,7 @@ successfully, you must replicate their data using some other means.
|[CI Secure Files](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/models/ci/secure_file.rb) | [**Yes** (15.3)](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91430) | [**Yes** (15.3)](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91430) | [**Yes** (15.3)](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91430) | [No](object_storage.md#verification-of-files-in-object-storage) | Verification is behind the feature flag `geo_ci_secure_file_replication`, enabled by default in 15.3. |
|[Container Registry](../../packages/container_registry.md) | **Yes** (12.3)<sup>1</sup> | **Yes** (15.10) | **Yes** (12.3)<sup>1</sup> | **Yes** (15.10) | See [instructions](container_registry.md) to set up the Container Registry replication. |
|[Terraform Module Registry](../../../user/packages/terraform_module_registry/index.md) | **Yes** (14.0) | **Yes** (14.0) | [**Yes** (15.1)](https://gitlab.com/groups/gitlab-org/-/epics/5551) | [No](object_storage.md#verification-of-files-in-object-storage) | Behind feature flag `geo_package_file_replication`, enabled by default. |
-|[Project designs repository](../../../user/project/issues/design_management.md) | **Yes** (12.7) | **Yes** (16.1) | N/A | N/A | Designs also require replication of LFS objects and Uploads. Replication is behind the feature flag geo_design_management_repository_replication, enabled by default.|
+|[Project designs repository](../../../user/project/issues/design_management.md) | **Yes** (12.7) | **Yes** (16.1) | N/A | N/A | Designs also require replication of LFS objects and Uploads. Replication is behind the feature flag `geo_design_management_repository_replication`, enabled by default.|
|[Package Registry](../../../user/packages/package_registry/index.md) | **Yes** (13.2) | **Yes** (13.10) | [**Yes** (15.1)](https://gitlab.com/groups/gitlab-org/-/epics/5551) | [No](object_storage.md#verification-of-files-in-object-storage) | Behind feature flag `geo_package_file_replication`, enabled by default. |
|[Versioned Terraform State](../../terraform_state.md) | **Yes** (13.5) | **Yes** (13.12) | [**Yes** (15.1)](https://gitlab.com/groups/gitlab-org/-/epics/5551) | [No](object_storage.md#verification-of-files-in-object-storage) | Replication is behind the feature flag `geo_terraform_state_version_replication`, enabled by default. Verification was behind the feature flag `geo_terraform_state_version_verification`, which was removed in 14.0. |
|[External merge request diffs](../../merge_request_diffs.md) | **Yes** (13.5) | **Yes** (14.6) | [**Yes** (15.1)](https://gitlab.com/groups/gitlab-org/-/epics/5551) | [No](object_storage.md#verification-of-files-in-object-storage) | Replication is behind the feature flag `geo_merge_request_diff_replication`, enabled by default. Verification was behind the feature flag `geo_merge_request_diff_verification`, removed in 14.7.|
diff --git a/doc/administration/geo/replication/location_aware_git_url.md b/doc/administration/geo/replication/location_aware_git_url.md
index 4a3f9c86041..a3abc945288 100644
--- a/doc/administration/geo/replication/location_aware_git_url.md
+++ b/doc/administration/geo/replication/location_aware_git_url.md
@@ -107,7 +107,7 @@ You can customize the:
- SSH remote URL to use the location-aware `git.example.com`. To do so, change the SSH remote URL
host by setting `gitlab_rails['gitlab_ssh_host']` in `gitlab.rb` of web nodes.
- HTTP remote URL as shown in
- [Custom Git clone URL for HTTP(S)](../../../user/admin_area/settings/visibility_and_access_controls.md#customize-git-clone-url-for-https).
+ [Custom Git clone URL for HTTP(S)](../../settings/visibility_and_access_controls.md#customize-git-clone-url-for-https).
## Example Git request handling behavior
diff --git a/doc/administration/geo/replication/multiple_servers.md b/doc/administration/geo/replication/multiple_servers.md
index 4e597a21922..29edac1be83 100644
--- a/doc/administration/geo/replication/multiple_servers.md
+++ b/doc/administration/geo/replication/multiple_servers.md
@@ -67,7 +67,7 @@ The following steps enable a GitLab site to serve as the Geo **primary** site.
```ruby
##
## The unique identifier for the Geo site. See
- ## https://docs.gitlab.com/ee/user/admin_area/geo_nodes.html#common-settings
+ ## https://docs.gitlab.com/ee/administration/geo_nodes.html#common-settings
##
gitlab_rails['geo_node_name'] = '<site_name_here>'
@@ -217,7 +217,7 @@ then make the following modifications:
##
## The unique identifier for the Geo site. See
- ## https://docs.gitlab.com/ee/user/admin_area/geo_nodes.html#common-settings
+ ## https://docs.gitlab.com/ee/administration/geo_nodes.html#common-settings
##
gitlab_rails['geo_node_name'] = '<site_name_here>'
@@ -318,7 +318,7 @@ application nodes above, with some changes to run only the `sidekiq` service:
##
## The unique identifier for the Geo site. See
- ## https://docs.gitlab.com/ee/user/admin_area/geo_nodes.html#common-settings
+ ## https://docs.gitlab.com/ee/administration/geo_nodes.html#common-settings
##
gitlab_rails['geo_node_name'] = '<site_name_here>'
diff --git a/doc/administration/geo/replication/single_sign_on.md b/doc/administration/geo/replication/single_sign_on.md
index 55e77d5657c..15e24cdcefb 100644
--- a/doc/administration/geo/replication/single_sign_on.md
+++ b/doc/administration/geo/replication/single_sign_on.md
@@ -31,6 +31,10 @@ If you have configured SAML on the primary site correctly, then it should work o
### SAML with separate URL with proxying enabled
+NOTE:
+When proxying is enabled, SAML can only be used to sign in the secondary site if your SAML Identity Provider (IdP) allows an
+application to have multiple callback URLs configured. Check with your IdP provider support team to confirm if this is the case.
+
If a secondary site uses a different `external_url` to the primary site, then configure your SAML Identity Provider (IdP) to allow the secondary site's SAML callback URL. For example, to configure Okta:
1. [Sign in to Okta](https://www.okta.com/login/).
diff --git a/doc/administration/geo/replication/troubleshooting.md b/doc/administration/geo/replication/troubleshooting.md
index 4047167e4af..c63480db389 100644
--- a/doc/administration/geo/replication/troubleshooting.md
+++ b/doc/administration/geo/replication/troubleshooting.md
@@ -51,7 +51,7 @@ Geo::MetricsUpdateWorker.new.perform
If it raises an error, then the error is probably also preventing the jobs from completing. If it takes longer than 10 minutes, then there may be a performance issue, and the UI may always show "Unhealthy" even if the status eventually does get updated.
-If it successfully updates the status, then something may be wrong with Sidekiq. Is it running? Do the logs show errors? This job is supposed to be enqueued every minute. It takes an exclusive lease in Redis to ensure that only one of these jobs can run at a time. The primary site updates its status directly in the PostgreSQL database. Secondary sites send an HTTP Post request to the primary site with their status data.
+If it successfully updates the status, then something may be wrong with Sidekiq. Is it running? Do the logs show errors? This job is supposed to be enqueued every minute and might not run if a [job deduplication idempotency](../../sidekiq/sidekiq_troubleshooting.md#clearing-a-sidekiq-job-deduplication-idempotency-key) key was not cleared properly. It takes an exclusive lease in Redis to ensure that only one of these jobs can run at a time. The primary site updates its status directly in the PostgreSQL database. Secondary sites send an HTTP Post request to the primary site with their status data.
A site also shows as "Unhealthy" if certain health checks fail. You can reveal the failure by running the following in the [Rails console](../../operations/rails_console.md) on the affected secondary site:
@@ -240,7 +240,7 @@ This machine's Geo node name matches a database record ... no
```
For more information about recommended site names in the description of the Name field, see
-[Geo Admin Area Common Settings](../../../user/admin_area/geo_sites.md#common-settings).
+[Geo Admin Area Common Settings](../../../administration/geo_sites.md#common-settings).
### Reverify all uploads (or any SSF data type which is verified)
@@ -622,7 +622,7 @@ This happens on wrongly-formatted addresses in `postgresql['md5_auth_cidr_addres
```
To fix this, update the IP addresses in `/etc/gitlab/gitlab.rb` under `postgresql['md5_auth_cidr_addresses']`
-to respect the CIDR format (that is, `1.2.3.4/32`).
+to respect the CIDR format (for example, `10.0.0.1/32`).
### Message: `LOG: invalid IP mask "md5": Name or service not known`
@@ -634,7 +634,7 @@ This happens when you have added IP addresses without a subnet mask in `postgres
```
To fix this, add the subnet mask in `/etc/gitlab/gitlab.rb` under `postgresql['md5_auth_cidr_addresses']`
-to respect the CIDR format (that is, `1.2.3.4/32`).
+to respect the CIDR format (for example, `10.0.0.1/32`).
### Message: `Found data in the gitlabhq_production database!` when running `gitlab-ctl replicate-geo-database`
@@ -1295,7 +1295,7 @@ When [Geo proxying for secondary sites](../secondary_proxy/index.md) is enabled,
Check the NGINX logs for errors similar to this example:
```plaintext
-2022/01/26 00:02:13 [error] 26641#0: *829148 upstream sent too big header while reading response header from upstream, client: 1.2.3.4, server: geo.staging.gitlab.com, request: "POST /users/sign_in HTTP/2.0", upstream: "http://unix:/var/opt/gitlab/gitlab-workhorse/sockets/socket:/users/sign_in", host: "geo.staging.gitlab.com", referrer: "https://geo.staging.gitlab.com/users/sign_in"
+2022/01/26 00:02:13 [error] 26641#0: *829148 upstream sent too big header while reading response header from upstream, client: 10.0.2.2, server: geo.staging.gitlab.com, request: "POST /users/sign_in HTTP/2.0", upstream: "http://unix:/var/opt/gitlab/gitlab-workhorse/sockets/socket:/users/sign_in", host: "geo.staging.gitlab.com", referrer: "https://geo.staging.gitlab.com/users/sign_in"
```
To resolve this issue:
@@ -1345,15 +1345,8 @@ To fix this issue, set the primary site's internal URL to a URL that is:
- Unique to the primary site.
- Accessible from all secondary sites.
-1. Enter the [Rails console](../../operations/rails_console.md) on the primary site.
-
-1. Run the following, replacing `https://unique.url.for.primary.site` with your specific internal URL.
- For example, depending on your network configuration, you could use an IP address, like
- `http://1.2.3.4`.
-
- ```ruby
- GeoNode.where(primary: true).first.update!(internal_url: "https://unique.url.for.primary.site")
- ```
+1. Visit the primary site.
+1. [Set up the internal URLs](../../../administration/geo_sites.md#set-up-the-internal-urls).
### Secondary site returns `Received HTTP code 403 from proxy after CONNECT`
@@ -1404,6 +1397,27 @@ In this case, make sure to update the changed URL on all your sites:
1. On the left sidebar, select **Geo > Sites**.
1. Change the URL and save the change.
+### Message: `ERROR: canceling statement due to conflict with recovery` during backup
+
+Running a backup on a Geo **secondary** [is not supported](https://gitlab.com/gitlab-org/gitlab/-/issues/211668).
+
+When running a backup on a **secondary** you might encounter the following error message:
+
+```plaintext
+Dumping PostgreSQL database gitlabhq_production ...
+pg_dump: error: Dumping the contents of table "notes" failed: PQgetResult() failed.
+pg_dump: error: Error message from server: ERROR: canceling statement due to conflict with recovery
+DETAIL: User query might have needed to see row versions that must be removed.
+pg_dump: error: The command was: COPY public.notes (id, note, [...], last_edited_at) TO stdout;
+```
+
+To prevent a database backup being made automatically during GitLab upgrades on your Geo **secondaries**,
+create the following empty file:
+
+```shell
+sudo touch /etc/gitlab/skip-auto-backup
+```
+
## Fixing non-PostgreSQL replication failures
If you notice replication failures in `Admin > Geo > Sites` or the [Sync status Rake task](#sync-status-rake-task), you can try to resolve the failures with the following general steps:
@@ -1665,7 +1679,7 @@ Repository check failures on a Geo secondary site do not necessarily imply a rep
1. Find affected repositories as mentioned below, as well as their [logged errors](../../repository_checks.md#what-to-do-if-a-check-failed).
1. Try to diagnose specific `git fsck` errors. The range of possible errors is wide, try putting them into search engines.
-1. Test normal functions of the affected repositories. Pull from the secondary, view the files.
+1. Test typical functions of the affected repositories. Pull from the secondary, view the files.
1. Check if the primary site's copy of the repository has an identical `git fsck` error. If you are planning a failover, then consider prioritizing that the secondary site has the same information that the primary site has. Ensure you have a backup of the primary, and follow [planned failover guidelines](../disaster_recovery/planned_failover.md).
1. Push to the primary and check if the change gets replicated to the secondary site.
1. If replication is not automatically working, try to manually sync the repository.
@@ -1806,3 +1820,30 @@ If the output differs on some hosts, PostgreSQL replication does not work proper
A full index rebuild is required if the on-disk data is transferred 'at rest' to an operating system with an incompatible locale, or through replication.
This check is also required when using a mixture of GitLab deployments. The locale might be different between an Linux package install, a GitLab Docker container, a Helm chart deployment, or external database services.
+
+## Investigate causes of database replication lag
+
+If the output of `sudo gitlab-rake geo:status` shows that `Database replication lag` remains significantly high over time, the primary node in database replication can be checked to determine the status of lag for
+different parts of the database replication process. These values are known as `write_lag`, `flush_lag`, and `replay_lag`. For more information, see
+[the official PostgreSQL documentation](https://www.postgresql.org/docs/current/monitoring-stats.html#MONITORING-PG-STAT-REPLICATION-VIEW).
+
+Run the following command from the primary Geo node's database to provide relevant output:
+
+```shell
+gitlab-psql -xc 'SELECT write_lag,flush_lag,replay_lag FROM pg_stat_replication;'
+
+-[ RECORD 1 ]---------------
+write_lag | 00:00:00.072392
+flush_lag | 00:00:00.108168
+replay_lag | 00:00:00.108283
+```
+
+If one or more of these values is significantly high, this could indicate a problem and should be investigated further. When determining the cause, consider that:
+
+- `write_lag` indicates the time since when WAL bytes have been sent by the primary, then received to the secondary, but not yet flushed or applied.
+- A high `write_lag` value may indicate degraded network performance or insufficient network speed between the primary and secondary nodes.
+- A high `flush_lag` value may indicate degraded or sub-optimal disk I/O performance with the secondary node's storage device.
+- A high `replay_lag` value may indicate long running transactions in PostgreSQL, or the saturation of a needed resource like the CPU.
+- The difference in time between `write_lag` and `flush_lag` indicates that WAL bytes have been sent to the underlying storage system, but it has not reported that they were flushed.
+ This data is most likely not fully written to a persistent storage, and likely held in some kind of volatile write cache.
+- The difference between `flush_lag` and `replay_lag` indicates WAL bytes that have been successfully persisted to storage, but could not be replayed by the database system.
diff --git a/doc/administration/geo/replication/upgrading_the_geo_sites.md b/doc/administration/geo/replication/upgrading_the_geo_sites.md
index 644232a2c9e..ce0ad736071 100644
--- a/doc/administration/geo/replication/upgrading_the_geo_sites.md
+++ b/doc/administration/geo/replication/upgrading_the_geo_sites.md
@@ -33,7 +33,7 @@ and all **secondary** sites:
1. SSH into each node of the **primary** site.
1. [Upgrade GitLab on the **primary** site](../../../update/package/index.md#upgrade-using-the-official-repositories).
1. Perform testing on the **primary** site, particularly if you paused replication in step 1 to protect DR. [There are some suggestions for post-upgrade testing](../../../update/plan_your_upgrade.md#pre-upgrade-and-post-upgrade-checks) in the upgrade documentation.
-1. Ensure that the secrets in the `/etc/gitlab/gitlab-secrets.json` file of both the primary site and the secondary site are the same. The file must be the same on all of a site’s nodes.
+1. Ensure that the secrets in the `/etc/gitlab/gitlab-secrets.json` file of both the primary site and the secondary site are the same. The file must be the same on all of a site's nodes.
1. SSH into each node of **secondary** sites.
1. [Upgrade GitLab on each **secondary** site](../../../update/package/index.md#upgrade-using-the-official-repositories).
1. If you paused replication in step 1, [resume replication on each **secondary**](../index.md#pausing-and-resuming-replication).
diff --git a/doc/administration/geo/secondary_proxy/index.md b/doc/administration/geo/secondary_proxy/index.md
index 3081d1c2485..2ab96a3d33d 100644
--- a/doc/administration/geo/secondary_proxy/index.md
+++ b/doc/administration/geo/secondary_proxy/index.md
@@ -131,6 +131,10 @@ and cannot be configured per Geo site. Therefore, all runners clone from the pri
which Geo site they register on. For information about GitLab CI using a specific Geo secondary to clone from, see issue
[3294](https://gitlab.com/gitlab-org/gitlab/-/issues/3294#note_1009488466).
+- When secondary proxying is used together with separate URLs,
+ [signing in the secondary site using SAML](../replication/single_sign_on.md#saml-with-separate-url-with-proxying-enabled)
+ is only supported if the SAML Identity Provider (IdP) allows an application to be configured with multiple callback URLs.
+
## Behavior of secondary sites when the primary Geo site is down
Considering that web traffic is proxied to the primary, the behavior of the secondary sites differs when the primary
diff --git a/doc/administration/geo/setup/database.md b/doc/administration/geo/setup/database.md
index 31d0fbdffe0..be6e327732d 100644
--- a/doc/administration/geo/setup/database.md
+++ b/doc/administration/geo/setup/database.md
@@ -75,7 +75,7 @@ There is an [issue where support is being discussed](https://gitlab.com/gitlab-o
```ruby
##
## The unique identifier for the Geo site. See
- ## https://docs.gitlab.com/ee/user/admin_area/geo_nodes.html#common-settings
+ ## https://docs.gitlab.com/ee/administration/geo_nodes.html#common-settings
##
gitlab_rails['geo_node_name'] = '<site_name_here>'
```
@@ -193,8 +193,8 @@ There is an [issue where support is being discussed](https://gitlab.com/gitlab-o
| `postgresql['md5_auth_cidr_addresses']` | **Primary** and **Secondary** sites' public or VPC private addresses. |
If you are using Google Cloud Platform, SoftLayer, or any other vendor that
- provides a virtual private cloud (VPC), you can use the **primary** and **secondary** sites'
- private addresses (corresponds to "internal address" for Google Cloud Platform) for
+ provides a virtual private cloud (VPC), we recommend using the **primary**
+ and **secondary** sites' "private" or "internal" addresses for
`postgresql['md5_auth_cidr_addresses']` and `postgresql['listen_address']`.
The `listen_address` option opens PostgreSQL up to network connections with the interface
@@ -468,7 +468,8 @@ data before running `pg_basebackup`.
sudo -i
```
-1. Choose a database-friendly name to use for your **secondary** site to
+1. Choose a [database-friendly name](https://www.postgresql.org/docs/13/warm-standby.html#STREAMING-REPLICATION-SLOTS-MANIPULATION)
+ to use for your **secondary** site to
use as the replication slot name. For example, if your domain is
`secondary.geo.example.com`, use `secondary_example` as the slot
name as shown in the commands below.
diff --git a/doc/administration/geo/setup/external_database.md b/doc/administration/geo/setup/external_database.md
index 81541d1cb9c..50383546da3 100644
--- a/doc/administration/geo/setup/external_database.md
+++ b/doc/administration/geo/setup/external_database.md
@@ -39,7 +39,7 @@ developed and tested. We aim to be compatible with most external
##
## The unique identifier for the Geo site. See
- ## https://docs.gitlab.com/ee/user/admin_area/geo_nodes.html#common-settings
+ ## https://docs.gitlab.com/ee/administration/geo_nodes.html#common-settings
##
gitlab_rails['geo_node_name'] = '<site_name_here>'
```
diff --git a/doc/administration/geo/setup/index.md b/doc/administration/geo/setup/index.md
index 359f706a8aa..8ac64a963bb 100644
--- a/doc/administration/geo/setup/index.md
+++ b/doc/administration/geo/setup/index.md
@@ -34,8 +34,8 @@ If both Geo sites are based on the [1K reference architecture](../../reference_a
- [Using Linux package PostgreSQL instances](database.md) .
- [Using external PostgreSQL instances](external_database.md)
1. [Configure GitLab](../replication/configuration.md) to set the **primary** and **secondary** sites.
-1. Recommended: [Configure unified URLs](../secondary_proxy/index.md) to use a single, unified URL for all Geo sites.
-1. Optional: [Configure Object storage replication](../../object_storage.md)
+1. Recommended: [Configure unified URLs](../secondary_proxy/index.md#set-up-a-unified-url-for-geo-sites) to use a single, unified URL for all Geo sites.
+1. Optional: [Configure Object storage replication](../replication/object_storage.md)
1. Optional: [Configure a secondary LDAP server](../../auth/ldap/index.md) for the **secondary** sites. See [notes on LDAP](../index.md#ldap).
1. Optional: [Configure Container Registry for the secondary site](../replication/container_registry.md).
1. Follow the [Using a Geo Site](../replication/usage.md) guide.
diff --git a/doc/administration/geo_sites.md b/doc/administration/geo_sites.md
new file mode 100644
index 00000000000..81cc3a87941
--- /dev/null
+++ b/doc/administration/geo_sites.md
@@ -0,0 +1,119 @@
+---
+stage: Systems
+group: Geo
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Geo sites Admin Area **(PREMIUM SELF)**
+
+You can configure various settings for GitLab Geo sites. For more information, see
+[Geo documentation](../administration/geo/index.md).
+
+On either the primary or secondary site:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Geo > Sites**.
+
+## Common settings
+
+All Geo sites have the following settings:
+
+| Setting | Description |
+| --------| ----------- |
+| Primary | This marks a Geo site as **primary** site. There can be only one **primary** site. |
+| Name | The unique identifier for the Geo site. It's highly recommended to use a physical location as a name. Good examples are "London Office" or "us-east-1". Avoid words like "primary", "secondary", "Geo", or "DR". This makes the failover process easier because the physical location does not change, but the Geo site role can. All nodes in a single Geo site use the same site name. Nodes use the `gitlab_rails['geo_node_name']` setting in `/etc/gitlab/gitlab.rb` to lookup their Geo site record in the PostgreSQL database. If `gitlab_rails['geo_node_name']` is not set, the node's `external_url` with trailing slash is used as fallback. The value of `Name` is case-sensitive, and most characters are allowed. |
+| URL | The instance's user-facing URL. |
+
+The site you're currently browsing is indicated with a blue `Current` label, and
+the **primary** node is listed first as `Primary site`.
+
+## Secondary site settings
+
+**Secondary** sites have a number of additional settings available:
+
+| Setting | Description |
+|---------------------------|-------------|
+| Selective synchronization | Enable Geo [selective sync](../administration/geo/replication/configuration.md#selective-synchronization) for this **secondary** site. |
+| Repository sync capacity | Number of concurrent requests this **secondary** site makes to the **primary** site when backfilling repositories. |
+| File sync capacity | Number of concurrent requests this **secondary** site makes to the **primary** site when backfilling files. |
+
+## Geo backfill
+
+**Secondary** sites are notified of changes to repositories and files by the **primary** site,
+and always attempt to synchronize those changes as quickly as possible.
+
+Backfill is the act of populating the **secondary** site with repositories and files that
+existed *before* the **secondary** site was added to the database. Because there may be
+extremely large numbers of repositories and files, it's not feasible to attempt to
+download them all at once; so, GitLab places an upper limit on the concurrency of
+these operations.
+
+How long the backfill takes is dependent on the maximum concurrency, but higher
+values place more strain on the **primary** site. The limits are configurable.
+If your **primary** site has lots of surplus capacity,
+you can increase the values to complete backfill in a shorter time. If it's
+under heavy load and backfill reduces its availability for standard requests,
+you can decrease them.
+
+## Set up the internal URLs
+
+> Setting up internal URLs in secondary sites was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/77179) in GitLab 14.7.
+
+You can set up a different URL for synchronization between the primary and secondary site.
+
+The **primary** site's Internal URL is used by **secondary** sites to contact it
+(to sync repositories, for example). The name Internal URL distinguishes it from
+[External URL](https://docs.gitlab.com/omnibus/settings/configuration.html#configuring-the-external-url-for-gitlab),
+which is used by users. Internal URL does not need to be a private address.
+
+When [Geo secondary proxying](../administration/geo/secondary_proxy/index.md) is enabled,
+the primary uses the secondary's internal URL to contact it directly.
+
+The internal URL defaults to external URL. To change it:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Geo > Sites**.
+1. Select **Edit** on the site you want to customize.
+1. Edit the internal URL.
+1. Select **Save changes**.
+
+When enabled, the Admin Area for Geo shows replication details for each site directly
+from the primary site's UI, and through the Geo secondary proxy, if enabled.
+
+WARNING:
+We recommend using an HTTPS connection while configuring the Geo sites. To avoid
+breaking communication between **primary** and **secondary** sites when using
+HTTPS, customize your Internal URL to point to a load balancer with TLS
+terminated at the load balancer.
+
+WARNING:
+Starting with GitLab 13.3 and [until 13.11](https://gitlab.com/gitlab-org/gitlab/-/issues/325522),
+if you use an internal URL that is not accessible to the users, the
+OAuth authorization flow does not work properly, because users are redirected
+to the internal URL instead of the external one.
+
+## Multiple secondary sites behind a load balancer
+
+**Secondary** sites can use identical external URLs if
+a unique `name` is set for each Geo site. The `gitlab.rb` setting
+`gitlab_rails['geo_node_name']` must:
+
+- Be set for each GitLab instance that runs `puma`, `sidekiq`, or `geo_logcursor`.
+- Match a Geo site name.
+
+The load balancer must use sticky sessions to avoid authentication
+failures and cross-site request errors.
+
+<!-- ## Troubleshooting
+
+Include any troubleshooting steps that you can foresee. If you know beforehand what issues
+one might have when setting this up, or when something is changed, or on upgrading, it's
+important to describe those, too. Think of things that may go wrong and include them here.
+This is important to minimize requests for support, and to avoid doc comments with
+questions that you know someone might ask.
+
+Each scenario can be a third-level heading, for example `### Getting error message X`.
+If you have none to add when creating a doc, leave this section in place
+but commented out to help encourage others to add to it in the future. -->
diff --git a/doc/administration/get_started.md b/doc/administration/get_started.md
index 60291732a20..bf3d38657f8 100644
--- a/doc/administration/get_started.md
+++ b/doc/administration/get_started.md
@@ -41,7 +41,7 @@ Get started:
- [Add members](../user/group/index.md#add-users-to-a-group) to the group.
- Create a [subgroup](../user/group/subgroups/index.md#create-a-subgroup).
- [Add members](../user/group/subgroups/index.md#subgroup-membership) to the subgroup.
-- Enable [external authorization control](../user/admin_area/settings/external_authorization.md#configuration).
+- Enable [external authorization control](../administration/settings/external_authorization.md#configuration).
**More resources**
@@ -76,16 +76,16 @@ While this isn't an exhaustive list, following these steps gives you a solid sta
- Use a long root password, stored in a vault.
- Install trusted SSL certificate and establish a process for renewal and revocation.
- [Configure SSH key restrictions](../security/ssh_keys_restrictions.md#restrict-allowed-ssh-key-technologies-and-minimum-length) per your organization's guidelines.
-- [Disable new sign-ups](../user/admin_area/settings/sign_up_restrictions.md#disable-new-sign-ups).
+- [Disable new sign-ups](settings/sign_up_restrictions.md#disable-new-sign-ups).
- Require email confirmation.
- Set password length limit, configure SSO or SAML user management.
- Limit email domains if allowing sign-up.
- Require two-factor authentication (2FA).
-- [Disable password authentication](../user/admin_area/settings/sign_in_restrictions.md#password-authentication-enabled) for Git over HTTPS.
-- Set up [email notification for unknown sign-ins](../user/admin_area/settings/sign_in_restrictions.md#email-notification-for-unknown-sign-ins).
+- [Disable password authentication](settings/sign_in_restrictions.md#password-authentication-enabled) for Git over HTTPS.
+- Set up [email notification for unknown sign-ins](settings/sign_in_restrictions.md#email-notification-for-unknown-sign-ins).
- Configure [user and IP rate limits](https://about.gitlab.com/blog/2020/05/20/gitlab-instance-security-best-practices/#user-and-ip-rate-limits).
- Limit [webhooks local access](https://about.gitlab.com/blog/2020/05/20/gitlab-instance-security-best-practices/#webhooks).
-- Set [rate limits for protected paths](../user/admin_area/settings/protected_paths.md).
+- Set [rate limits for protected paths](settings/protected_paths.md).
- Sign up for [Security Alerts](https://about.gitlab.com/company/preference-center/) from the Communication Preference Center.
- Keep track of security best practices on our [blog page](https://about.gitlab.com/blog/2020/05/20/gitlab-instance-security-best-practices/).
@@ -130,7 +130,7 @@ The routine differs, depending on whether you deployed with the Linux package or
When backing up (single node) GitLab server installed using the Linux package, you can use a single Rake task.
-Learn about [backing up Linux package or Helm variations](../raketasks/backup_restore.md).
+Learn about [backing up Linux package or Helm variations](../administration/backup_restore/index.md).
This process backs up your entire instance, but does not back up the configuration files. Ensure those are backed up separately.
Keep your configuration files and backup archives in a separate location to ensure the encryption keys are not kept with the encrypted data.
@@ -163,7 +163,7 @@ For more information about GitLab SaaS backups, see our [Backup FAQ page](https:
### Alternative backup strategies
In some situations the Rake task for backups may not be the most optimal solution. Here are some
-[alternatives](../raketasks/backup_restore.md) to consider if the Rake task does not work for you.
+[alternatives](../administration/backup_restore/index.md) to consider if the Rake task does not work for you.
#### Option 1: File system snapshot
@@ -236,10 +236,10 @@ Rate limits also improve the security of your application.
You can make changes to your default rate limits from the Admin Area. For more information about configuration, see the [Admin Area page](../security/rate_limits.md#configurable-limits).
-- Define [issues rate limits](../user/admin_area/settings/rate_limit_on_issues_creation.md) to set a maximum number of issue creation requests per minute, per user.
-- Enforce [user and IP rate limits](../user/admin_area/settings/user_and_ip_rate_limits.md) for unauthenticated web requests.
-- Review the [rate limit on raw endpoints](../user/admin_area/settings/rate_limits_on_raw_endpoints.md). The default setting is 300 requests per minute for raw file access.
-- Review the [import/export rate limits](../user/admin_area/settings/import_export_rate_limits.md) of the six active defaults.
+- Define [issues rate limits](settings/rate_limit_on_issues_creation.md) to set a maximum number of issue creation requests per minute, per user.
+- Enforce [user and IP rate limits](settings/user_and_ip_rate_limits.md) for unauthenticated web requests.
+- Review the [rate limit on raw endpoints](settings/rate_limits_on_raw_endpoints.md). The default setting is 300 requests per minute for raw file access.
+- Review the [import/export rate limits](settings/import_export_rate_limits.md) of the six active defaults.
For more information about API and rate limits, see our [API page](../api/rest/index.md).
diff --git a/doc/administration/gitaly/configure_gitaly.md b/doc/administration/gitaly/configure_gitaly.md
index 5c6fc370052..c7fa40014d0 100644
--- a/doc/administration/gitaly/configure_gitaly.md
+++ b/doc/administration/gitaly/configure_gitaly.md
@@ -377,9 +377,6 @@ This can be risky because anything that prevents your Gitaly clients from reachi
servers causes all Gitaly requests to fail. For example, any sort of network, firewall, or name
resolution problems.
-Additionally, you must [disable Rugged](../nfs.md#improving-nfs-performance-with-gitlab)
-if previously enabled manually.
-
Gitaly makes the following assumptions:
- Your `gitaly1.internal` Gitaly server can be reached at `gitaly1.internal:8075` from your Gitaly
@@ -835,7 +832,7 @@ For consistent and stable performance, you should first explore other options su
adjusting node specifications, and [reviewing large repositories](../../user/project/repository/managing_large_repositories.md) or workloads.
FLAG:
-On self-managed GitLab, by default repository cgroups are not available. To make it available, ask an administrator to
+On self-managed GitLab, by default repository cgroups are not available. To make it available, an administrator can
[enable the feature flag](../feature_flags.md) named `gitaly_run_cmds_in_cgroup`.
When enabling cgroups for memory, you should ensure that no swap is configured on the Gitaly nodes as
diff --git a/doc/administration/gitaly/gitaly_geo_capabilities.md b/doc/administration/gitaly/gitaly_geo_capabilities.md
index e4147eec162..a98477318f2 100644
--- a/doc/administration/gitaly/gitaly_geo_capabilities.md
+++ b/doc/administration/gitaly/gitaly_geo_capabilities.md
@@ -17,7 +17,6 @@ The following tables are intended to guide you to choose the right combination o
|------------|--------------|----------------|-----------------|-------------|-----------------|
|Gitaly Cluster | Very high - tolerant of node failures | RTO for a single node of 10 s with no manual intervention | Data is stored on multiple nodes | Good - While writes may take slightly longer due to voting, read distribution improves read speeds | **Trade-off** - Slight decrease in write speed for redundant, strongly-consistent storage solution. **Risks** - [Does not support snapshot backups](../gitaly/index.md#snapshot-backup-and-recovery-limitations), GitLab backup task can be slow for large data sets |
|Gitaly Shards | Single storage location is a single point of failure | Would need to restore only shards which failed | Single point of failure | Good - can allocate repositories to shards to spread load | **Trade-off** - Need to manually configure repositories into different shards to balance loads / storage space **Risks** - Single point of failure relies on recovery process when single-node failure occurs |
-|Gitaly + NFS | Single storage location is a single point of failure | Single node failure requires restoration from backup | Single point of failure | Average - NFS is not ideally suited to large quantities of small reads / writes which can have a detrimental impact on performance | **Trade-off** - Familiar administration though NFS is not ideally suited to Git demands **Risks** - Many instances of NFS compatibility issues which provide very poor customer experiences |
## Geo capabilities
diff --git a/doc/administration/gitaly/index.md b/doc/administration/gitaly/index.md
index 2a3c3da24b3..db11ac8c769 100644
--- a/doc/administration/gitaly/index.md
+++ b/doc/administration/gitaly/index.md
@@ -52,13 +52,10 @@ Before deploying Gitaly Cluster, review:
- [Configuration guidance](configure_gitaly.md) and [Repository storage options](../repository_storage_paths.md) to make
sure that Gitaly Cluster is the best setup for you.
-If you have:
+If you have not yet migrated to Gitaly Cluster, you have two options:
-- Not yet migrated to Gitaly Cluster and want to continue using NFS, remain on the service you are using. However, NFS
- is [no longer supported](../../update/removals.md#nfs-as-git-repository-storage-is-no-longer-supported).
-- Not yet migrated to Gitaly Cluster but want to migrate away from NFS, you have two options:
- - A sharded Gitaly instance.
- - Gitaly Cluster.
+- A sharded Gitaly instance.
+- Gitaly Cluster.
Contact your [Customer Success Manager](https://about.gitlab.com/job-families/sales/customer-success-management/) or customer support if you have any questions.
@@ -72,15 +69,15 @@ the current status of these issues, refer to the referenced issues and epics.
| 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. | No known solution prior to GitLab 15.0. In GitLab 15.0 to 15.2, enable the [`gitaly_praefect_generated_replica_paths` feature flag](#praefect-generated-replica-paths-gitlab-150-and-later) on your Geo primary site. In GitLab 15.3, the feature flag is enabled by default. |
| 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 standard operation. | Make sure the Praefect database is up and running with all migrations completed (For example: `/opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml sql-migrate-status` should show a list of all applied migrations). Consider [requesting upgrade assistance](https://about.gitlab.com/support/scheduling-upgrade-assistance/) so your upgrade plan can be reviewed by support. |
| Restoring a Gitaly Cluster node from a snapshot in a running cluster | Because the Gitaly Cluster runs with consistent state, introducing a single node that is behind results 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:<br/><br/>1. [Shut down GitLab](../read_only_gitlab.md#shut-down-the-gitlab-ui).<br/>2. Snapshot all Gitaly Cluster nodes at the same time.<br/>3. Take a database dump of the Praefect database. |
-| Rebuilding or replacing an existing Gitaly Cluster node | There is no way to replace existing nodes in place because the Praefect database is relied on to determine the current state of each Gitaly node. Changing how Gitaly Cluster stores repositories is proposed in issue [4218](https://gitlab.com/gitlab-org/gitaly/-/issues/4218). Turning on [repository verification](praefect.md#repository-verification) is proposed in issue [4429](https://gitlab.com/gitlab-org/gitaly/-/issues/4429) so Praefect can detect that data is missing and needs to replicated to a new Gitaly node. | No known solution at this time. |
+| Limitations when running in Kubernetes, Amazon ECS, or similar | Praefect (Gitaly Cluster) is not supported and Gitaly has known limitations. For more information, see [epic 6127](https://gitlab.com/groups/gitlab-org/-/epics/6127). | Use our [reference architectures](../reference_architectures/index.md). |
### Snapshot backup and recovery limitations
Gitaly Cluster does not support snapshot backups. Snapshot backups can cause issues where the Praefect database becomes
out of sync with the disk storage. Because of how Praefect rebuilds the replication metadata of Gitaly disk information
-during a restore, you should use the [official backup and restore Rake tasks](../../raketasks/backup_restore.md).
+during a restore, you should use the [official backup and restore Rake tasks](../../administration/backup_restore/index.md).
-The [incremental backup method](../../raketasks/backup_gitlab.md#incremental-repository-backups)
+The [incremental backup method](../../administration/backup_restore/backup_gitlab.md#incremental-repository-backups)
can be used to speed up Gitaly Cluster backups.
If you are unable to use either method, contact customer support for restoration help.
@@ -175,7 +172,7 @@ best suited by using Gitaly Cluster.
### Backing up repositories
-When backing up or syncing repositories using tools other than GitLab, you must [prevent writes](../../raketasks/backup_restore.md#prevent-writes-and-copy-the-git-repository-data)
+When backing up or syncing repositories using tools other than GitLab, you must [prevent writes](../../administration/backup_restore/backup_gitlab.md#prevent-writes-and-copy-the-git-repository-data)
while copying repository data.
## Gitaly Cluster
@@ -641,7 +638,7 @@ code. This re-introduced code is informally referred to as the "Rugged patches".
FLAG:
On self-managed GitLab, by default automatic detection of whether Rugged should be used (per storage) is not available.
-To make it available, ask an administrator to [disable the feature flag](../../administration/feature_flags.md) named
+To make it available, an administrator can [disable the feature flag](../../administration/feature_flags.md) named
`skip_rugged_auto_detect`.
The Ruby methods that perform direct Git access are behind
diff --git a/doc/administration/gitaly/praefect.md b/doc/administration/gitaly/praefect.md
index f80a5192c55..9577c4a4cb2 100644
--- a/doc/administration/gitaly/praefect.md
+++ b/doc/administration/gitaly/praefect.md
@@ -19,6 +19,10 @@ Configure Gitaly Cluster using either:
Smaller GitLab installations may need only [Gitaly itself](index.md).
+NOTE:
+Gitaly Cluster is not yet supported in Kubernetes, Amazon ECS, or similar container environments. For more information, see
+[epic 6127](https://gitlab.com/groups/gitlab-org/-/epics/6127).
+
## Requirements
The minimum recommended configuration for a Gitaly Cluster requires:
@@ -1107,8 +1111,8 @@ For more information on Gitaly server configuration, see our
```ruby
# Configure the gitlab-shell API callback URL. Without this, `git push` will
# fail. This can be your front door GitLab URL or an internal load balancer.
- # Examples: 'https://gitlab.example.com', 'http://1.2.3.4'
- gitlab_rails['internal_api_url'] = 'http://GITLAB_HOST'
+ # Examples: 'https://gitlab.example.com', 'http://10.0.2.2'
+ gitlab_rails['internal_api_url'] = 'https://gitlab.example.com'
```
1. Configure the storage location for Git data by setting `gitaly['configuration'][:storage]` in
@@ -1487,7 +1491,7 @@ repository storage redundancy.
For a replication factor:
-- Of `1`: NFS, Gitaly, and Gitaly Cluster have roughly the same storage requirements.
+- Of `1`: Gitaly and Gitaly Cluster have roughly the same storage requirements.
- More than `1`: The amount of required storage is `used space * replication factor`. `used space`
should include any planned future growth.
@@ -1628,20 +1632,8 @@ You should use [repository-specific primary nodes](#repository-specific-primary-
> - [Introduced](https://gitlab.com/gitlab-org/gitaly/-/issues/3492) in GitLab 13.12, with primary elections run when Praefect starts or the cluster's consensus of a Gitaly node's health changes.
> - [Changed](https://gitlab.com/gitlab-org/gitaly/-/merge_requests/3543) in GitLab 14.1, primary elections are run lazily.
-Gitaly Cluster supports electing repository-specific primary Gitaly nodes. Repository-specific
-Gitaly primary nodes are enabled in `/etc/gitlab/gitlab.rb` by setting
-`praefect['failover_election_strategy'] = 'per_repository'`.
-
-Praefect's [deprecated election strategies](#deprecated-election-strategies):
-
-- Elected a primary Gitaly node for each virtual storage, which was used as the primary node for
- each repository in the virtual storage.
-- Prevented horizontal scaling of a virtual storage. The primary Gitaly node needed a replica of
- each repository and thus became the bottleneck.
-
-The `per_repository` election strategy solves this problem by electing a primary Gitaly node separately for each
-repository. Combined with [configurable replication factors](#configure-replication-factor), you can
-horizontally scale storage capacity and distribute write load across Gitaly nodes.
+Gitaly Cluster elects a primary Gitaly node separately for each repository. Combined with
+[configurable replication factors](#configure-replication-factor), you can horizontally scale storage capacity and distribute write load across Gitaly nodes.
Primary elections are run lazily. Praefect doesn't immediately elect a new primary node if the current
one is unhealthy. A new primary is elected if a request must be served while the current primary is unavailable.
diff --git a/doc/administration/gitaly/recovery.md b/doc/administration/gitaly/recovery.md
index dbbed0f60ba..aa487917ef0 100644
--- a/doc/administration/gitaly/recovery.md
+++ b/doc/administration/gitaly/recovery.md
@@ -432,6 +432,11 @@ sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.t
> - [Introduced](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/5658) in GitLab 14.4.
> - [Introduced](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/5789) in GitLab 14.6, support for immediate replication.
+WARNING:
+Because of a [known issue](https://gitlab.com/gitlab-org/gitaly/-/issues/5402), you can't add repositories to the
+Praefect tracking database with Praefect-generated replica paths (`@cluster`). These repositories are not associated with the repository path used by GitLab and are
+inaccessible.
+
The `track-repository` Praefect sub-command adds repositories on disk to the Praefect tracking database to be tracked.
```shell
@@ -484,6 +489,11 @@ This command fails if:
> [Introduced](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/6319) in GitLab 15.4.
+WARNING:
+Because of a [known issue](https://gitlab.com/gitlab-org/gitaly/-/issues/5402), you can't add repositories to the
+Praefect tracking database with Praefect-generated replica paths (`@cluster`). These repositories are not associated with the repository path used by GitLab and are
+inaccessible.
+
Migrations using the API automatically add repositories to the Praefect tracking database.
If you are instead manually copying repositories over from existing infrastructure, you can use the `track-repositories`
diff --git a/doc/administration/gitaly/troubleshooting.md b/doc/administration/gitaly/troubleshooting.md
index afef787e9c3..3d8110e1dab 100644
--- a/doc/administration/gitaly/troubleshooting.md
+++ b/doc/administration/gitaly/troubleshooting.md
@@ -12,7 +12,7 @@ Refer to the information below when troubleshooting Gitaly and Gitaly Cluster.
The following sections provide possible solutions to Gitaly errors.
-See also [Gitaly timeout](../../user/admin_area/settings/gitaly_timeouts.md) settings,
+See also [Gitaly timeout](../settings/gitaly_timeouts.md) settings,
and our advice on [parsing the `gitaly/current` file](../logs/log_parsing.md#parsing-gitalycurrent).
### Check versions when using standalone Gitaly servers
diff --git a/doc/user/admin_area/img/abuse_report_blocked_user.png b/doc/administration/img/abuse_report_blocked_user.png
index 435d8dfe821..435d8dfe821 100644
--- a/doc/user/admin_area/img/abuse_report_blocked_user.png
+++ b/doc/administration/img/abuse_report_blocked_user.png
Binary files differ
diff --git a/doc/user/admin_area/img/abuse_reports_page_v13_11.png b/doc/administration/img/abuse_reports_page_v13_11.png
index ef57f45ab77..ef57f45ab77 100644
--- a/doc/user/admin_area/img/abuse_reports_page_v13_11.png
+++ b/doc/administration/img/abuse_reports_page_v13_11.png
Binary files differ
diff --git a/doc/user/admin_area/img/admin_labels_v14_7.png b/doc/administration/img/admin_labels_v14_7.png
index 01a4ea0c2cc..01a4ea0c2cc 100644
--- a/doc/user/admin_area/img/admin_labels_v14_7.png
+++ b/doc/administration/img/admin_labels_v14_7.png
Binary files differ
diff --git a/doc/user/admin_area/img/broadcast_messages_banner_v15_0.png b/doc/administration/img/broadcast_messages_banner_v15_0.png
index e1b350142b3..e1b350142b3 100644
--- a/doc/user/admin_area/img/broadcast_messages_banner_v15_0.png
+++ b/doc/administration/img/broadcast_messages_banner_v15_0.png
Binary files differ
diff --git a/doc/user/admin_area/img/broadcast_messages_notification_v12_10.png b/doc/administration/img/broadcast_messages_notification_v12_10.png
index fb03748c892..fb03748c892 100644
--- a/doc/user/admin_area/img/broadcast_messages_notification_v12_10.png
+++ b/doc/administration/img/broadcast_messages_notification_v12_10.png
Binary files differ
diff --git a/doc/user/admin_area/img/cohorts_v13_9_a.png b/doc/administration/img/cohorts_v13_9_a.png
index 1a4590290b9..1a4590290b9 100644
--- a/doc/user/admin_area/img/cohorts_v13_9_a.png
+++ b/doc/administration/img/cohorts_v13_9_a.png
Binary files differ
diff --git a/doc/user/admin_area/img/credentials_inventory_gpg_keys_v14_9.png b/doc/administration/img/credentials_inventory_gpg_keys_v14_9.png
index 6c4c8f30df6..6c4c8f30df6 100644
--- a/doc/user/admin_area/img/credentials_inventory_gpg_keys_v14_9.png
+++ b/doc/administration/img/credentials_inventory_gpg_keys_v14_9.png
Binary files differ
diff --git a/doc/user/admin_area/img/credentials_inventory_personal_access_tokens_v14_9.png b/doc/administration/img/credentials_inventory_personal_access_tokens_v14_9.png
index 254d520d538..254d520d538 100644
--- a/doc/user/admin_area/img/credentials_inventory_personal_access_tokens_v14_9.png
+++ b/doc/administration/img/credentials_inventory_personal_access_tokens_v14_9.png
Binary files differ
diff --git a/doc/user/admin_area/img/credentials_inventory_project_access_tokens_v14_9.png b/doc/administration/img/credentials_inventory_project_access_tokens_v14_9.png
index ae204ac09ef..ae204ac09ef 100644
--- a/doc/user/admin_area/img/credentials_inventory_project_access_tokens_v14_9.png
+++ b/doc/administration/img/credentials_inventory_project_access_tokens_v14_9.png
Binary files differ
diff --git a/doc/user/admin_area/img/credentials_inventory_ssh_keys_v14_9.png b/doc/administration/img/credentials_inventory_ssh_keys_v14_9.png
index 8f2f11515eb..8f2f11515eb 100644
--- a/doc/user/admin_area/img/credentials_inventory_ssh_keys_v14_9.png
+++ b/doc/administration/img/credentials_inventory_ssh_keys_v14_9.png
Binary files differ
diff --git a/doc/user/admin_area/img/email1.png b/doc/administration/img/email1.png
index e79ccc3e9a9..e79ccc3e9a9 100644
--- a/doc/user/admin_area/img/email1.png
+++ b/doc/administration/img/email1.png
Binary files differ
diff --git a/doc/user/admin_area/img/email2.png b/doc/administration/img/email2.png
index d073c0e42da..d073c0e42da 100644
--- a/doc/user/admin_area/img/email2.png
+++ b/doc/administration/img/email2.png
Binary files differ
diff --git a/doc/user/admin_area/img/export_permissions_v13_11.png b/doc/administration/img/export_permissions_v13_11.png
index d9bbe8c3daf..d9bbe8c3daf 100644
--- a/doc/user/admin_area/img/export_permissions_v13_11.png
+++ b/doc/administration/img/export_permissions_v13_11.png
Binary files differ
diff --git a/doc/user/admin_area/img/impersonate_user_button_v13_8.png b/doc/administration/img/impersonate_user_button_v13_8.png
index 475315a0c0f..475315a0c0f 100644
--- a/doc/user/admin_area/img/impersonate_user_button_v13_8.png
+++ b/doc/administration/img/impersonate_user_button_v13_8.png
Binary files differ
diff --git a/doc/user/admin_area/img/index_runners_search_or_filter_v14_5.png b/doc/administration/img/index_runners_search_or_filter_v14_5.png
index 10b8cc01103..10b8cc01103 100644
--- a/doc/user/admin_area/img/index_runners_search_or_filter_v14_5.png
+++ b/doc/administration/img/index_runners_search_or_filter_v14_5.png
Binary files differ
diff --git a/doc/administration/instance_limits.md b/doc/administration/instance_limits.md
index df364a3f737..679042c3114 100644
--- a/doc/administration/instance_limits.md
+++ b/doc/administration/instance_limits.md
@@ -19,11 +19,9 @@ Read more about [configuring rate limits](../security/rate_limits.md).
### Issue creation
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/28129) in GitLab 12.10.
-
This setting limits the request rate to the issue creation endpoint.
-Read more about [issue creation rate limits](../user/admin_area/settings/rate_limit_on_issues_creation.md).
+Read more about [issue creation rate limits](settings/rate_limit_on_issues_creation.md).
- **Default rate limit**: Disabled by default.
@@ -31,17 +29,15 @@ Read more about [issue creation rate limits](../user/admin_area/settings/rate_li
This setting limits the request rate per user or IP.
-Read more about [User and IP rate limits](../user/admin_area/settings/user_and_ip_rate_limits.md).
+Read more about [User and IP rate limits](settings/user_and_ip_rate_limits.md).
- **Default rate limit**: Disabled by default.
### By raw endpoint
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/30829) in GitLab 12.2.
-
This setting limits the request rate per endpoint.
-Read more about [raw endpoint rate limits](../user/admin_area/settings/rate_limits_on_raw_endpoints.md).
+Read more about [raw endpoint rate limits](settings/rate_limits_on_raw_endpoints.md).
- **Default rate limit**: 300 requests per project, per commit and per file path.
@@ -63,16 +59,14 @@ GitLab rate limits the following paths by default:
'/admin/session'
```
-Read more about [protected path rate limits](../user/admin_area/settings/protected_paths.md).
+Read more about [protected path rate limits](settings/protected_paths.md).
- **Default rate limit**: After 10 requests, the client must wait 60 seconds before trying again.
### Package Registry
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/57029) in GitLab 13.12.
-
This setting limits the request rate on the Packages API per user or IP. For more information, see
-[Package Registry Rate Limits](../user/admin_area/settings/package_registry_rate_limits.md).
+[Package Registry Rate Limits](settings/package_registry_rate_limits.md).
- **Default rate limit**: Disabled by default.
@@ -92,7 +86,7 @@ requests per user. For more information, read
> - [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.
This setting limits the request rate on the Packages API per user or IP address. For more information, read
-[Files API rate limits](../user/admin_area/settings/files_api_rate_limits.md).
+[Files API rate limits](settings/files_api_rate_limits.md).
- **Default rate limit**: Disabled by default.
@@ -101,26 +95,24 @@ This setting limits the request rate on the Packages API per user or IP address.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68645) in GitLab 14.4.
This setting limits the request rate on deprecated API endpoints per user or IP address. For more information, read
-[Deprecated API rate limits](../user/admin_area/settings/deprecated_api_rate_limits.md).
+[Deprecated API rate limits](settings/deprecated_api_rate_limits.md).
- **Default rate limit**: Disabled by default.
### Import/Export
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35728) in GitLab 13.2.
-
This setting limits the import/export actions for groups and projects.
| Limit | Default (per minute per user) |
|-------------------------|-------------------------------|
-| Project Import | 6 |
-| Project Export | 6 |
-| Project Export Download | 1 |
-| Group Import | 6 |
-| Group Export | 6 |
-| Group Export Download | 1 |
+| Project Import | 6 |
+| Project Export | 6 |
+| Project Export Download | 1 |
+| Group Import | 6 |
+| Group Export | 6 |
+| Group Export Download | 1 |
-Read more about [import/export rate limits](../user/admin_area/settings/import_export_rate_limits.md).
+Read more about [import/export rate limits](settings/import_export_rate_limits.md).
### Member Invitations
@@ -162,10 +154,10 @@ Set the limit to `0` to disable it.
This setting limits search requests as follows:
-| Limit | Default (requests per minute) |
-|-------------------------|-------------------------------|
-| Authenticated user | 300 |
-| Unauthenticated user | 100 |
+| Limit | Default (requests per minute) |
+|----------------------|-------------------------------|
+| Authenticated user | 300 |
+| Unauthenticated user | 100 |
Search requests that exceed the search rate limit per minute return the following error:
@@ -179,7 +171,7 @@ This endpoint has been requested too many times. Try again later.
This setting limits the request rate to the pipeline creation endpoints.
-Read more about [pipeline creation rate limits](../user/admin_area/settings/rate_limit_on_pipelines_creation.md).
+Read more about [pipeline creation rate limits](settings/rate_limit_on_pipelines_creation.md).
## Gitaly concurrency limit
@@ -191,8 +183,6 @@ Read more about [Gitaly concurrency limits](gitaly/configure_gitaly.md#limit-rpc
## Number of comments per issue, merge request, or commit
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/22388) in GitLab 12.4.
-
There's a limit to the number of comments that can be submitted on an issue,
merge request, or commit. When the limit is reached, system notes can still be
added so that the history of events is not lost, but the user-submitted
@@ -202,8 +192,6 @@ comment fails.
## Size of comments and descriptions of issues, merge requests, and epics
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/61974) in GitLab 12.2.
-
There is a limit to the size of comments and descriptions of issues, merge requests, and epics.
Attempting to add a body of text larger than the limit, results in an error, and the
item is also not created.
@@ -214,8 +202,6 @@ It's possible that this limit changes to a lower number in the future.
## Size of commit titles and descriptions
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/292039) in GitLab 13.9.
-
Commits with arbitrarily large messages may be pushed to GitLab, but the following
display limits apply:
@@ -231,9 +217,6 @@ are processed.
## Number of issues in the milestone overview
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/39453) in GitLab 12.10.
-> - [Set](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/58168) to 500 in GitLab 13.11.
-
The maximum number of issues loaded on the milestone overview page is 500.
When the number exceeds the limit the page displays an alert and links to a paginated
[issue list](../user/project/issues/managing_issues.md) of all issues in the milestone.
@@ -242,8 +225,6 @@ When the number exceeds the limit the page displays an alert and links to a pagi
## Number of pipelines per Git push
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/51401) in GitLab 11.10.
-
When pushing multiple changes with a single Git push, like multiple tags or branches,
only four tag or branch pipelines can be triggered. This limit prevents the accidental
creation of a large number of pipelines when using `git push --all` or `git push --mirror`.
@@ -259,12 +240,10 @@ instance if too many changes are pushed at once and a flood of pipelines are cre
## Retention of activity history
-Activity history for projects and individuals' profiles was limited to one year until [GitLab 11.4](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/52246) when it was extended to two years, and in [GitLab 12.4](https://gitlab.com/gitlab-org/gitlab/-/issues/33840) to three years.
+Activity history for projects and individuals' profiles is limited to three years.
## Number of embedded metrics
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/14939) in GitLab 12.7.
-
There is a limit when embedding metrics in GitLab Flavored Markdown (GLFM) for performance reasons.
- **Max limit**: 100 embeds.
@@ -343,8 +322,6 @@ Blocked recursive webhook calls are logged in `auth.log` with the message `"Recu
## Pull Mirroring Interval
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/237891) in GitLab 13.7.
-
The [minimum wait time between pull refreshes](../user/project/repository/mirror/index.md)
defaults to 300 seconds (5 minutes). For example, a pull refresh only runs once in a given 300 second period, regardless of how many times you trigger it.
@@ -362,8 +339,6 @@ Plan.default.actual_limits.update!(pull_mirror_interval_seconds: 200)
## Incoming emails from auto-responders
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/30327) in GitLab 12.4.
-
GitLab ignores all incoming emails sent from auto-responders by looking for the `X-Autoreply`
header. Such emails don't create comments on issues or merge requests.
@@ -376,8 +351,6 @@ and to limit memory consumption.
## Max offset allowed by the REST API for offset-based pagination
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/34565) in GitLab 13.0.
-
When using offset-based pagination in the REST API, there is a limit to the maximum
requested offset into the set of results. This limit is only applied to endpoints that
also support keyset-based pagination. More information about pagination options can be
@@ -401,8 +374,6 @@ Set the limit to `0` to disable it.
### Number of jobs in active pipelines
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/32823) in GitLab 12.6.
-
The total number of jobs in active pipelines can be limited per project. This limit is checked
each time a new pipeline is created. An active pipeline is any pipeline in one of the following states:
@@ -433,8 +404,6 @@ Set the limit to `0` to disable it.
### Maximum time jobs can run
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/16777) in GitLab 12.3.
-
The default maximum time that jobs can run for is 60 minutes. Jobs that run for
more than 60 minutes time out.
@@ -447,8 +416,6 @@ You can change the maximum time a job can run before it times out:
### Maximum number of deployment jobs in a pipeline
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/46931) in GitLab 13.7.
-
You can limit the maximum number of deployment jobs in a pipeline. A deployment is
any job with an [`environment`](../ci/environments/index.md) specified. The number
of deployments in a pipeline is checked at pipeline creation. Pipelines that have
@@ -470,8 +437,6 @@ Set the limit to `0` to disable it.
### Number of CI/CD subscriptions to a project
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9045) in GitLab 12.9.
-
The total number of subscriptions can be limited per project. This limit is
checked each time a new subscription is created.
@@ -516,8 +481,6 @@ This limit is [enabled on GitLab.com](../user/gitlab_com/index.md#gitlab-cicd).
### Number of pipeline schedules
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/29566) in GitLab 12.10.
-
The total number of pipeline schedules can be limited per project. This limit is
checked each time a new pipeline schedule is created. If a new pipeline schedule
would cause the total number of pipeline schedules to exceed the limit, the
@@ -585,8 +548,6 @@ This limit is [enabled on GitLab.com](../user/gitlab_com/index.md#gitlab-cicd).
### Number of instance level variables
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/216097) in GitLab 13.1.
-
The total number of instance level CI/CD variables is limited at the instance level.
This limit is checked each time a new instance level variable is created. If a new variable
would cause the total number of variables to exceed the limit, the new variable is not created.
@@ -639,12 +600,10 @@ Plan.default.actual_limits.update!(project_ci_variables: 10000)
### Maximum file size per type of artifact
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37226) in GitLab 13.3.
-
Job artifacts defined with [`artifacts:reports`](../ci/yaml/index.md#artifactsreports)
that are uploaded by the runner are rejected if the file size exceeds the maximum
file size limit. The limit is determined by comparing the project's
-[maximum artifact size setting](../user/admin_area/settings/continuous_integration.md#maximum-artifacts-size)
+[maximum artifact size setting](../administration/settings/continuous_integration.md#maximum-artifacts-size)
with the instance limit for the given artifact type, and choosing the smaller value.
Limits are set in megabytes, so the smallest possible value that can be defined is `1 MB`.
@@ -655,35 +614,35 @@ setting is used:
| Artifact limit name | Default value |
|---------------------------------------------|---------------|
-| `ci_max_artifact_size_accessibility` | 0 |
-| `ci_max_artifact_size_api_fuzzing` | 0 |
-| `ci_max_artifact_size_archive` | 0 |
-| `ci_max_artifact_size_browser_performance` | 0 |
-| `ci_max_artifact_size_cluster_applications` | 0 |
-| `ci_max_artifact_size_cobertura` | 0 |
-| `ci_max_artifact_size_codequality` | 0 |
-| `ci_max_artifact_size_container_scanning` | 0 |
-| `ci_max_artifact_size_coverage_fuzzing` | 0 |
-| `ci_max_artifact_size_dast` | 0 |
-| `ci_max_artifact_size_dependency_scanning` | 0 |
-| `ci_max_artifact_size_dotenv` | 0 |
-| `ci_max_artifact_size_junit` | 0 |
-| `ci_max_artifact_size_license_management` | 0 |
-| `ci_max_artifact_size_license_scanning` | 0 |
-| `ci_max_artifact_size_load_performance` | 0 |
-| `ci_max_artifact_size_lsif` | 100 MB ([Introduced at 20 MB](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37226) in GitLab 13.3 and [raised to 100 MB](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/46980) in GitLab 13.6.) |
-| `ci_max_artifact_size_metadata` | 0 |
-| `ci_max_artifact_size_metrics_referee` | 0 |
-| `ci_max_artifact_size_metrics` | 0 |
-| `ci_max_artifact_size_network_referee` | 0 |
-| `ci_max_artifact_size_performance` | 0 |
-| `ci_max_artifact_size_requirements` | 0 |
-| `ci_max_artifact_size_requirements_v2` | 0 |
-| `ci_max_artifact_size_sast` | 0 |
-| `ci_max_artifact_size_secret_detection` | 0 |
-| `ci_max_artifact_size_terraform` | 5 MB ([introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37018) in GitLab 13.3) |
-| `ci_max_artifact_size_trace` | 0 |
-| `ci_max_artifact_size_cyclonedx` | 1 MB |
+| `ci_max_artifact_size_accessibility` | 0 |
+| `ci_max_artifact_size_api_fuzzing` | 0 |
+| `ci_max_artifact_size_archive` | 0 |
+| `ci_max_artifact_size_browser_performance` | 0 |
+| `ci_max_artifact_size_cluster_applications` | 0 |
+| `ci_max_artifact_size_cobertura` | 0 |
+| `ci_max_artifact_size_codequality` | 0 |
+| `ci_max_artifact_size_container_scanning` | 0 |
+| `ci_max_artifact_size_coverage_fuzzing` | 0 |
+| `ci_max_artifact_size_dast` | 0 |
+| `ci_max_artifact_size_dependency_scanning` | 0 |
+| `ci_max_artifact_size_dotenv` | 0 |
+| `ci_max_artifact_size_junit` | 0 |
+| `ci_max_artifact_size_license_management` | 0 |
+| `ci_max_artifact_size_license_scanning` | 0 |
+| `ci_max_artifact_size_load_performance` | 0 |
+| `ci_max_artifact_size_lsif` | 100 MB |
+| `ci_max_artifact_size_metadata` | 0 |
+| `ci_max_artifact_size_metrics_referee` | 0 |
+| `ci_max_artifact_size_metrics` | 0 |
+| `ci_max_artifact_size_network_referee` | 0 |
+| `ci_max_artifact_size_performance` | 0 |
+| `ci_max_artifact_size_requirements` | 0 |
+| `ci_max_artifact_size_requirements_v2` | 0 |
+| `ci_max_artifact_size_sast` | 0 |
+| `ci_max_artifact_size_secret_detection` | 0 |
+| `ci_max_artifact_size_terraform` | 5 MB |
+| `ci_max_artifact_size_trace` | 0 |
+| `ci_max_artifact_size_cyclonedx` | 1 MB |
For example, to set the `ci_max_artifact_size_junit` limit to 10 MB on a self-managed
installation, run the following in the [GitLab Rails console](operations/rails_console.md#starting-a-rails-console-session):
@@ -732,10 +691,10 @@ GitLab SaaS subscribers have different limits defined per plan, affecting all pr
Self-managed GitLab Premium and Ultimate limits are defined by a default plan that affects all projects:
-| Runner scope | Default value |
-|---------------------------------------------|---------------|
-| `ci_registered_group_runners` | 1000 |
-| `ci_registered_project_runners` | 1000 |
+| Runner scope | Default value |
+|---------------------------------|---------------|
+| `ci_registered_group_runners` | 1000 |
+| `ci_registered_project_runners` | 1000 |
To update these limits, run the following in the
[GitLab Rails console](operations/rails_console.md#starting-a-rails-console-session):
@@ -808,7 +767,7 @@ You can change these limits in the [GitLab Rails console](operations/rails_conso
You can set a limit on the maximum number of variables inside of a dotenv artifact.
This limit is checked every time a dotenv file is exported as an artifact.
-Set the limit to `0` to disable it. Defaults to `0` on self-managed instances.
+Set the limit to `0` to disable it. Defaults to `20` on self-managed instances.
To set this limit to `100` on a self-managed instance, run the following command in the
[GitLab Rails console](operations/rails_console.md#starting-a-rails-console-session):
@@ -839,28 +798,20 @@ Plan.default.actual_limits.update!(dotenv_size: 5.kilobytes)
### Limit inbound incident management alerts
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/17859) in GitLab 12.5.
-
This setting limits the number of inbound alert payloads over a period of time.
-Read more about [incident management rate limits](../user/admin_area/settings/rate_limit_on_pipelines_creation.md).
+Read more about [incident management rate limits](settings/rate_limit_on_pipelines_creation.md).
### Prometheus Alert JSON payloads
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/19940) in GitLab 12.6.
-
Prometheus alert payloads sent to the `notify.json` endpoint are limited to 1 MB in size.
### Generic Alert JSON payloads
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/16441) in GitLab 12.4.
-
Alert payloads sent to the `notify.json` endpoint are limited to 1 MB in size.
### Metrics dashboard YAML files
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/34834) in GitLab 13.2.
-
The memory occupied by a parsed metrics dashboard YAML file cannot exceed 1 MB.
The maximum depth of each YAML file is limited to 100. The maximum depth of a YAML
@@ -891,8 +842,6 @@ panel_groups:
## Environment Dashboard limits **(PREMIUM)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/33895) in GitLab 13.4.
-
See [Environment Dashboard](../ci/environments/environments_dashboard.md#adding-a-project-to-the-dashboard) for the maximum number of displayed projects.
## Environment data on deploy boards
@@ -907,7 +856,7 @@ Kubernetes aren't shown.
GitLab has limits around:
-- The patch size for a single file. [This is configurable on self-managed instance](../user/admin_area/diff_limits.md).
+- The patch size for a single file. [This is configurable on self-managed instance](../administration/diff_limits.md).
- The total size of all the diffs for a merge request.
An upper and lower limit applies to each of these:
@@ -932,8 +881,6 @@ Reports that go over the 20 MB limit aren't loaded. Affected reports:
### Maximum file size indexed
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/8638) in GitLab 13.3.
-
You can set a limit on the content of repository files that are indexed in
Elasticsearch. Any files larger than this limit only index the filename.
The file content is neither indexed nor searchable.
@@ -949,8 +896,6 @@ is pre-allocated during indexing.
### Maximum field length
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/201826) in GitLab 12.8.
-
You can set a limit on the content of text fields indexed for advanced search.
Setting a maximum helps to reduce the load of the indexing processes. If any
text field exceeds this limit, then the text is truncated to this number of
@@ -983,12 +928,10 @@ See the limits in the [Add a design to an issue](../user/project/issues/design_m
### 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.
+The maximum allowed [push size](../administration/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.
-
Total number of changes (branches or tags) in a single push. If changes are more
than the specified limit, hooks are not executed.
@@ -999,19 +942,15 @@ More information can be found in these documentations:
### Activities
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31007) in GitLab 12.4.
-
Total number of changes (branches or tags) in a single push to determine whether
individual push events or a bulk push event are created.
-More information can be found in the [Push event activities limit and bulk push events documentation](../user/admin_area/settings/push_event_activities_limit.md).
+More information can be found in the [Push event activities limit and bulk push events documentation](settings/push_event_activities_limit.md).
## Package Registry Limits
### File Size Limits
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/218017) in GitLab 13.4.
-
The default maximum file size for a package that's uploaded to the [GitLab Package Registry](../user/packages/package_registry/index.md) varies by format:
- Conan: 3 GB
@@ -1074,14 +1013,6 @@ varies by file type:
- Image blob: 5 GB
- Image manifest: 10 MB
-## Branch retargeting on merge
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/320902) in GitLab 13.9.
-
-If a branch is merged while open merge requests still point to it, GitLab can
-retarget merge requests pointing to the now-merged branch. For more information, see
-[Update merge requests when target branch merges](../user/project/merge_requests/index.md#update-merge-requests-when-target-branch-merges).
-
## Maximum number of assignees and reviewers
> - Maximum assignees [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/368936) in GitLab 15.6.
@@ -1117,3 +1048,108 @@ The [secure files API](../api/secure_files.md) enforces the following limits:
The [changelog API](../api/repositories.md#add-changelog-data-to-a-changelog-file) enforces the following limits:
- The commit range between `from` and `to` cannot exceed 15000 commits.
+
+## Value Stream Analytics limits
+
+- Each namespace (such as a group or a project) can have a maximum of 50 value streams.
+- Each value stream can have a maximum of 15 stages.
+
+## List all instance limits
+
+To list all instance limit values, run the following from the [GitLab Rails console](operations/rails_console.md#starting-a-rails-console-session):
+
+```ruby
+Plan.default.actual_limits
+```
+
+Sample output:
+
+```ruby
+id: 1,
+plan_id: 1,
+ci_pipeline_size: 0,
+ci_active_jobs: 0,
+project_hooks: 100,
+group_hooks: 50,
+ci_project_subscriptions: 3,
+ci_pipeline_schedules: 10,
+offset_pagination_limit: 50000,
+ci_instance_level_variables: "[FILTERED]",
+storage_size_limit: 0,
+ci_max_artifact_size_lsif: 100,
+ci_max_artifact_size_archive: 0,
+ci_max_artifact_size_metadata: 0,
+ci_max_artifact_size_trace: "[FILTERED]",
+ci_max_artifact_size_junit: 0,
+ci_max_artifact_size_sast: 0,
+ci_max_artifact_size_dependency_scanning: 350,
+ci_max_artifact_size_container_scanning: 150,
+ci_max_artifact_size_dast: 0,
+ci_max_artifact_size_codequality: 0,
+ci_max_artifact_size_license_management: 0,
+ci_max_artifact_size_license_scanning: 100,
+ci_max_artifact_size_performance: 0,
+ci_max_artifact_size_metrics: 0,
+ci_max_artifact_size_metrics_referee: 0,
+ci_max_artifact_size_network_referee: 0,
+ci_max_artifact_size_dotenv: 0,
+ci_max_artifact_size_cobertura: 0,
+ci_max_artifact_size_terraform: 5,
+ci_max_artifact_size_accessibility: 0,
+ci_max_artifact_size_cluster_applications: 0,
+ci_max_artifact_size_secret_detection: "[FILTERED]",
+ci_max_artifact_size_requirements: 0,
+ci_max_artifact_size_coverage_fuzzing: 0,
+ci_max_artifact_size_browser_performance: 0,
+ci_max_artifact_size_load_performance: 0,
+ci_needs_size_limit: 2,
+conan_max_file_size: 3221225472,
+maven_max_file_size: 3221225472,
+npm_max_file_size: 524288000,
+nuget_max_file_size: 524288000,
+pypi_max_file_size: 3221225472,
+generic_packages_max_file_size: 5368709120,
+golang_max_file_size: 104857600,
+debian_max_file_size: 3221225472,
+project_feature_flags: 200,
+ci_max_artifact_size_api_fuzzing: 0,
+ci_pipeline_deployments: 500,
+pull_mirror_interval_seconds: 300,
+daily_invites: 0,
+rubygems_max_file_size: 3221225472,
+terraform_module_max_file_size: 1073741824,
+helm_max_file_size: 5242880,
+ci_registered_group_runners: 1000,
+ci_registered_project_runners: 1000,
+ci_daily_pipeline_schedule_triggers: 0,
+ci_max_artifact_size_cluster_image_scanning: 0,
+ci_jobs_trace_size_limit: "[FILTERED]",
+pages_file_entries: 200000,
+dast_profile_schedules: 1,
+external_audit_event_destinations: 5,
+dotenv_variables: "[FILTERED]",
+dotenv_size: 5120,
+pipeline_triggers: 25000,
+project_ci_secure_files: 100,
+repository_size: 0,
+security_policy_scan_execution_schedules: 0,
+web_hook_calls_mid: 0,
+web_hook_calls_low: 0,
+project_ci_variables: "[FILTERED]",
+group_ci_variables: "[FILTERED]",
+ci_max_artifact_size_cyclonedx: 1,
+rpm_max_file_size: 5368709120,
+pipeline_hierarchy_size: 1000,
+ci_max_artifact_size_requirements_v2: 0,
+enforcement_limit: 0,
+notification_limit: 0,
+dashboard_limit_enabled_at: nil,
+web_hook_calls: 0,
+project_access_token_limit: 0,
+google_cloud_logging_configurations: 5,
+ml_model_max_file_size: 10737418240,
+limits_history: {}
+```
+
+Some limit values display as `[FILTERED]` in the list due to
+[filtering in the Rails console](operations/rails_console.md#filtered-console-output).
diff --git a/doc/administration/integration/diagrams_net.md b/doc/administration/integration/diagrams_net.md
index a4e8528fb25..335b26565e6 100644
--- a/doc/administration/integration/diagrams_net.md
+++ b/doc/administration/integration/diagrams_net.md
@@ -8,7 +8,7 @@ type: reference, howto
# Diagrams.net **(FREE)**
With the [diagrams.net](https://www.diagrams.net/) integration, you can create and embed SVG diagrams in wikis.
-The diagram editor is available in both the Markdown editor and the content editor.
+The diagram editor is available in both the plain text editor and the rich text editor.
On GitLab.com, this integration is enabled for all SaaS users and does not require any additional configuration.
diff --git a/doc/administration/integration/plantuml.md b/doc/administration/integration/plantuml.md
index 9c5e07eedaa..f05197d45e7 100644
--- a/doc/administration/integration/plantuml.md
+++ b/doc/administration/integration/plantuml.md
@@ -157,7 +157,6 @@ using Tomcat or Jetty.
Prerequisites:
- JRE/JDK version 11 or later.
-- Apache Maven version 3.0.2 or later.
- (Recommended) Jetty version 11 or later.
- (Recommended) Tomcat version 10 or later.
@@ -167,11 +166,11 @@ PlantUML recommends to install Tomcat 10 or above. The scope of this page only
includes setting up a basic Tomcat server. For more production-ready configurations,
see the [Tomcat Documentation](https://tomcat.apache.org/tomcat-10.1-doc/index.html).
-1. Install JDK/JRE 11 and Maven:
+1. Install JDK/JRE 11:
```shell
sudo apt update
- sudo apt-get install graphviz default-jdk git-core maven
+ sudo apt-get install graphviz default-jdk git-core
```
1. Add a user for Tomcat:
@@ -183,8 +182,8 @@ see the [Tomcat Documentation](https://tomcat.apache.org/tomcat-10.1-doc/index.h
1. Install and configure Tomcat 10:
```shell
- cd /tmp & wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.9/bin/apache-tomcat-10.1.9.tar.gz
- sudo tar xzvf apache-tomcat-10*tar.gz -C /opt/tomcat --strip-components=1
+ wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.9/bin/apache-tomcat-10.1.9.tar.gz -P /tmp
+ sudo tar xzvf /tmp/apache-tomcat-10*tar.gz -C /opt/tomcat --strip-components=1
sudo chown -R tomcat:tomcat /opt/tomcat/
sudo chmod -R u+x /opt/tomcat/bin
```
@@ -248,7 +247,7 @@ see the [Tomcat Documentation](https://tomcat.apache.org/tomcat-10.1-doc/index.h
tcp6 0 0 :::8005 :::* LISTEN 14935/java
```
-1. Modify your NGINX configuration. The `proxy_pass` port matches the Connector port in the `server.xml`:
+1. Modify your NGINX configuration in `/etc/gitlab/gitlab.rb`. Ensure the `proxy_pass` port matches the Connector port in `server.xml`:
```shell
nginx['custom_gitlab_server_config'] = "location /-/plantuml {
@@ -269,19 +268,22 @@ see the [Tomcat Documentation](https://tomcat.apache.org/tomcat-10.1-doc/index.h
1. Install PlantUML and copy the `.war` file:
+ Use the [latest release](https://github.com/plantuml/plantuml-server/releases) of plantuml-jsp (example: plantuml-jsp-v1.2023.8.war). For context, see [this issue](https://github.com/plantuml/plantuml-server/issues/265).
+
```shell
- cd / & git clone https://github.com/plantuml/plantuml-server.git
- cd plantuml-server
- mvn package
- cp /plantuml-server/target/plantuml.war /opt/tomcat/webapps/plantuml.war
- chown tomcat:tomcat /opt/tomcat/webapps/plantuml.war
- systemctl restart tomcat
+ cd /
+ wget https://github.com/plantuml/plantuml-server/releases/download/v1.2023.8/plantuml-jsp-v1.2023.8.war
+ sudo cp plantuml-jsp-v1.2023.8.war /opt/tomcat/webapps/plantuml.war
+ sudo chown tomcat:tomcat /opt/tomcat/webapps/plantuml.war
+ sudo systemctl restart tomcat
```
The Tomcat service should restart. After the restart is complete, the
PlantUML integration is ready and listening for requests on port `8005`:
`http://localhost:8005/plantuml`
+To test if the PlantUML server is working, run `curl --location --verbose "http://localhost:8005/plantuml/"`.
+
To change the Tomcat defaults, edit the `/opt/tomcat/conf/server.xml` file.
NOTE:
@@ -293,6 +295,7 @@ the configuration below accordingly.
PlantUML has features that allow fetching network resources. If you self-host the
PlantUML server, put network controls in place to isolate it.
+For example, make use of PlantUML's [security profiles](https://plantuml.com/security).
```plaintext
@startuml
@@ -320,7 +323,7 @@ these steps:
- For PlantUML servers running v1.2020.9 and above, such as [plantuml.com](https://plantuml.com),
you must set the `PLANTUML_ENCODING` environment variable to enable the `deflate`
- compression. In Linux package installations, you can set this value in `/etc/gitlab.rb` with
+ compression. In Linux package installations, you can set this value in `/etc/gitlab/gitlab.rb` with
this command:
```ruby
@@ -337,6 +340,6 @@ these steps:
PLANTUML_ENCODING: deflate
```
-- For GitLab versions 13.1 and later, PlantUML integration now
- [requires a header prefix in the URL](https://github.com/plantuml/plantuml/issues/117#issuecomment-6235450160)
+- `deflate` is the default encoding type for PlantUML. To use a different encoding type, PlantUML integration
+ [requires a header prefix in the URL](https://plantuml.com/text-encoding)
to distinguish different encoding types.
diff --git a/doc/administration/integration/terminal.md b/doc/administration/integration/terminal.md
index e5920520be7..1ab45d6ce99 100644
--- a/doc/administration/integration/terminal.md
+++ b/doc/administration/integration/terminal.md
@@ -13,7 +13,7 @@ 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`.
+On self-managed GitLab, by default this feature is not available. To make it available, an administrator can [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).
@@ -114,5 +114,5 @@ lifetime in your GitLab instance:
1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
1. Select **Admin Area**.
-1. Select [**Settings > Web terminal**](../../user/admin_area/settings/index.md#general).
+1. Select [**Settings > Web terminal**](../../administration/settings/index.md#general).
1. Set a `max session time`.
diff --git a/doc/administration/job_artifacts.md b/doc/administration/job_artifacts.md
index 099e7ec9e6f..106334b226d 100644
--- a/doc/administration/job_artifacts.md
+++ b/doc/administration/job_artifacts.md
@@ -282,7 +282,7 @@ To migrate back to local storage, you must
If [`artifacts:expire_in`](../ci/yaml/index.md#artifactsexpire_in) is used to set
an expiry for the artifacts, they are marked for deletion right after that date passes.
-Otherwise, they expire per the [default artifacts expiration setting](../user/admin_area/settings/continuous_integration.md).
+Otherwise, they expire per the [default artifacts expiration setting](../administration/settings/continuous_integration.md).
Artifacts are cleaned up by the `expire_build_artifacts_worker` cron job which Sidekiq
runs every 7 minutes (`*/7 * * * *` in [Cron](../topics/cron/index.md) syntax).
@@ -376,7 +376,7 @@ To change the default schedule on which the artifacts are expired:
## Set the maximum file size of the artifacts
If artifacts are enabled, you can change the maximum file size of the
-artifacts through the [Admin Area settings](../user/admin_area/settings/continuous_integration.md#maximum-artifacts-size).
+artifacts through the [Admin Area settings](../administration/settings/continuous_integration.md#maximum-artifacts-size).
## Storage statistics
diff --git a/doc/administration/labels.md b/doc/administration/labels.md
new file mode 100644
index 00000000000..adc621a2982
--- /dev/null
+++ b/doc/administration/labels.md
@@ -0,0 +1,28 @@
+---
+stage: Plan
+group: Project Management
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+type: reference
+---
+
+# Labels administration **(FREE SELF)**
+
+To manage labels for the GitLab instance, select **Labels** (**{labels}**) from the Admin Area sidebar. For more details on how to manage labels, see [Labels](../user/project/labels.md).
+
+Labels created in the Admin Area are automatically added to new projects.
+They are not available to new groups.
+Updating or adding labels in the Admin Area does not modify labels in existing projects.
+
+![Default label set](img/admin_labels_v14_7.png)
+
+<!-- ## 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, for example `### Getting error message X`.
+If you have none to add when creating a doc, leave this section in place
+but commented out to help encourage others to add to it in the future. -->
diff --git a/doc/administration/lfs/index.md b/doc/administration/lfs/index.md
index e4475e877d8..4659917cf8b 100644
--- a/doc/administration/lfs/index.md
+++ b/doc/administration/lfs/index.md
@@ -391,9 +391,11 @@ To delete these references:
ls -al /var/opt/gitlab/gitlab-rails/shared/lfs-objects/00/66/22269c61b41bf14a22bbe0e43be3acf86a4a446afb4250c3794ea47541a7
```
-1. If the file is not present, remove the database record via the rails console:
+1. If the file is not present, remove the database records via the rails console:
```ruby
+ # First delete the parent records and then destroy the record itself
+ lfs_object.lfs_objects_projects.destroy_all
lfs_object.destroy
```
diff --git a/doc/administration/license.md b/doc/administration/license.md
new file mode 100644
index 00000000000..732c2840217
--- /dev/null
+++ b/doc/administration/license.md
@@ -0,0 +1,83 @@
+---
+stage: Fulfillment
+group: Provision
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Activate GitLab Enterprise Edition (EE) **(PREMIUM SELF)**
+
+When you install a new GitLab instance without a license, only Free features
+are enabled. To enable more features in GitLab Enterprise Edition (EE), activate
+your instance with an activation code.
+
+## Activate GitLab EE
+
+In GitLab Enterprise Edition 14.1 and later, you need an activation code to activate
+your instance.
+
+Prerequisite:
+
+- You must [purchase a subscription](https://about.gitlab.com/pricing/).
+- You must be running GitLab Enterprise Edition (EE).
+- You must have GitLab 14.1 or later.
+- Your instance must be connected to the internet.
+
+To activate your instance with an activation code:
+
+1. Copy the activation code, a 24-character alphanumeric string, from either:
+ - Your subscription confirmation email.
+ - The [Customers Portal](https://customers.gitlab.com/customers/sign_in), on the **Manage Purchases** page.
+1. Sign in to your GitLab self-managed instance.
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Subscription**.
+1. Paste the activation code in **Activation code**.
+1. Read and accept the terms of service.
+1. Select **Activate**.
+
+The subscription is activated.
+
+If you have an offline environment,
+[activate GitLab EE with a license file or key](license_file.md) instead.
+
+If you have questions or need assistance activating your instance,
+[contact GitLab Support](https://about.gitlab.com/support/#contact-support).
+
+When [the license expires](../administration/license_file.md#what-happens-when-your-license-expires),
+some functionality is locked.
+
+## Verify your GitLab edition
+
+To verify the edition, sign in to GitLab and select
+**Help** (**{question-o}**) > **Help**. The GitLab edition and version are listed
+at the top of the page.
+
+If you are running GitLab Community Edition, you can upgrade your installation to GitLab
+EE. For more details, see [Upgrading between editions](../update/index.md#upgrading-between-editions).
+If you have questions or need assistance upgrading from GitLab Community Edition (CE) to EE,
+[contact GitLab Support](https://about.gitlab.com/support/#contact-support).
+
+## Troubleshooting
+
+### Cannot activate instance due to connectivity error
+
+This error occurs when you use an activation code to activate your instance, but your instance is unable to connect to the GitLab servers.
+
+You may have connectivity issues due to the following reasons:
+
+- **You have an offline environment**:
+ - Configure your setup to allow connection to GitLab servers. If connection to GitLab servers is not possible, contact your Sales Representative to request a license key. You can also contact [GitLab support](https://about.gitlab.com/support/#contact-support) if you need help finding your Sales Representative.
+- **Customers Portal is not operational**:
+ - To check for performance or service disruptions, check the Customers Portal [status](https://status.gitlab.com/).
+- **Firewall settings**:
+ - Check if your GitLab instance has an encrypted connection to `customers.gitlab.com` (with IP addresses 172.64.146.11 and 104.18.41.245) on port 443:
+
+ ```shell
+ curl --verbose "https://customers.gitlab.com/"
+ ```
+
+ - If the curl command returns a failure, either:
+ - [Configure a proxy](https://docs.gitlab.com/omnibus/settings/environment-variables.html) in `gitlab.rb` to point to your server.
+ - Contact your network administrator to make changes to the proxy.
+ - If an SSL inspection appliance is used, you must add the appliance's root CA certificate to `/etc/gitlab/trusted-certs` on the server, then run `gitlab-ctl reconfigure`.
+ \ No newline at end of file
diff --git a/doc/administration/license_file.md b/doc/administration/license_file.md
new file mode 100644
index 00000000000..5f82536698b
--- /dev/null
+++ b/doc/administration/license_file.md
@@ -0,0 +1,269 @@
+---
+stage: Fulfillment
+group: Provision
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+<!-- To promote the workflow described in license.md, this page is not included in global left nav. -->
+
+# Activate GitLab EE with a license file or key
+
+If you receive a license file from GitLab (for example, for a trial), you can
+upload it to your instance or add it during installation. The license file is
+a base64-encoded ASCII text file with a `.gitlab-license` extension.
+
+The first time you sign in to your GitLab instance, a note with a
+link to the **Add license** page should be displayed.
+
+Otherwise, to add your license:
+
+1. Sign in to GitLab as an administrator.
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+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**.
+
+NOTE:
+In GitLab 14.7.x to 14.9.x, you can add the license file with the UI.
+In GitLab 14.1.x to 14.7, if you have already activated your subscription with an activation code, you cannot access **Add License** from the Admin Area. You must access **Add License** directly from the URL, `<YourGitLabURL>/admin/license/new`.
+
+## Activate subscription during installation
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/114572) in GitLab 16.0.
+
+To activate your subscription during installation, set the `GITLAB_ACTIVATION_CODE` environment variable with the activation code:
+
+```shell
+export GITLAB_ACTIVATION_CODE=your_activation_code
+```
+
+## Add license file during installation
+
+If you have a license, you can also import it when you install GitLab.
+
+- For self-compiled installations:
+ - Place the `Gitlab.gitlab-license` file in the `config/` directory.
+ - To specify a custom location and filename for the license, set the
+ `GITLAB_LICENSE_FILE` environment variable with the path to the file:
+
+ ```shell
+ export GITLAB_LICENSE_FILE="/path/to/license/file"
+ ```
+
+- For Linux package installations:
+ - Place the `Gitlab.gitlab-license` file in the `/etc/gitlab/` directory.
+ - To specify a custom location and filename for the license, add this entry to `gitlab.rb`:
+
+ ```ruby
+ gitlab_rails['initial_license_file'] = "/path/to/license/file"
+ ```
+
+WARNING:
+These methods only add a license at the time of installation. To renew or upgrade
+a license, add the license in the **Admin Area** in the web user interface.
+
+## Submit license usage data
+
+If you use a license file or key to activate your instance in an offline environment, you must submit your license
+usage data monthly.
+To submit the data, [export your license usage](../subscriptions/self_managed/index.md#export-your-license-usage)
+and send it by email to the renewals service, `renewals-service@customers.gitlab.com`.
+
+If you don't submit your data each month after your subscription start date, an email is sent to the address
+associated with your subscription and a banner displays to remind you to submit your data. The banner displays
+in the **Admin Area** on the **Dashboard** and on the **Subscription** pages. You can only dismiss it until the
+following month after you submit your license usage data.
+
+## What happens when your license expires
+
+Fifteen days before the license expires, a notification banner with the upcoming expiration
+date displays to GitLab administrators.
+
+When your license expires, GitLab locks features, like Git pushes
+and issue creation. Your instance becomes read-only and
+an expiration message displays to all administrators. You have a 14-day grace period
+before this occurs.
+
+To resume functionality, [renew your subscription](../subscriptions/self_managed/index.md#renew-subscription-manually).
+
+If the license has been expired for more than 30 days, you must purchase a [new subscription](../subscriptions/self_managed/index.md) to resume functionality.
+
+To go back to Free features, [delete all expired licenses](#remove-a-license).
+
+## Remove a license
+
+To remove a license from a self-managed instance:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Subscription**.
+1. Select **Remove license**.
+
+Repeat these steps to remove all licenses, including those applied in the past.
+
+## View license details and history
+
+To view your license details:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Subscription**.
+
+You can add and view more than one license, but only the latest license in
+the current date range is the active license.
+
+When you add a future-dated license, it doesn't take effect until its applicable date.
+You can view all active subscriptions in the **Subscription history** table.
+
+You can also [export](../subscriptions/self_managed/index.md) your license usage information to a CSV file.
+
+NOTE:
+In GitLab 13.6 and earlier, a banner about an expiring license may continue to display
+when you add a new license. This happens when the start date of the new license
+is in the future and the expiring one is still active.
+The banner disappears after the new license becomes active.
+
+## License commands in the Rails console
+
+The following commands can be run in the [Rails console](../administration/operations/rails_console.md#starting-a-rails-console-session).
+
+WARNING:
+Any command that changes data directly could be damaging if not run correctly, or under the right conditions.
+We highly recommend running them in a test environment with a backup of the instance ready to be restored, just in case.
+
+### See current license information
+
+```ruby
+# License information (name, company, email address)
+License.current.licensee
+
+# Plan:
+License.current.plan
+
+# Uploaded:
+License.current.created_at
+
+# Started:
+License.current.starts_at
+
+# Expires at:
+License.current.expires_at
+
+# Is this a trial license?
+License.current.trial?
+
+# License ID for lookup on CustomersDot
+License.current.license_id
+
+# License data in Base64-encoded ASCII format
+License.current.data
+
+# Confirm the current billable seat count excluding guest users. This is useful for customers who use an Ultimate subscription tier where Guest seats are not counted.
+User.active.without_bots.excluding_guests.count
+
+```
+
+#### Interaction with licenses that start in the future
+
+```ruby
+# Future license data follows the same format as current license data it just uses a different modifier for the License prefix
+License.future_dated
+```
+
+### Check if a project feature is available on the instance
+
+Features listed in [`features.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/app/models/gitlab_subscriptions/features.rb).
+
+```ruby
+License.current.feature_available?(:jira_dev_panel_integration)
+```
+
+#### Check if a project feature is available in a project
+
+Features listed in [`features.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/app/models/gitlab_subscriptions/features.rb).
+
+```ruby
+p = Project.find_by_full_path('<group>/<project>')
+p.feature_available?(:jira_dev_panel_integration)
+```
+
+### Add a license through the console
+
+#### Using a `key` variable
+
+```ruby
+key = "<key>"
+license = License.new(data: key)
+license.save
+License.current # check to make sure it applied
+```
+
+#### Using a license file
+
+```ruby
+license_file = File.open("/tmp/Gitlab.license")
+
+key = license_file.read.gsub("\r\n", "\n").gsub(/\n+$/, '') + "\n"
+
+license = License.new(data: key)
+license.save
+License.current # check to make sure it applied
+```
+
+These snippets can be saved to a file and executed [using the Rails Runner](operations/rails_console.md#using-the-rails-runner) so the
+license can be applied via shell automation scripts.
+
+This is needed for example in a known edge-case with
+[expired license and multiple LDAP servers](../administration/auth/ldap/ldap-troubleshooting.md#expired-license-causes-errors-with-multiple-ldap-servers).
+
+### Remove licenses
+
+To clean up the [License History table](../administration/license_file.md#view-license-details-and-history):
+
+```ruby
+TYPE = :trial?
+# or :expired?
+
+License.select(&TYPE).each(&:destroy!)
+
+# or even License.all.each(&:destroy!)
+```
+
+## Troubleshooting
+
+### No Subscription area in the Admin Area
+
+You cannot add your license because there is no **Subscription** area.
+This issue might occur if:
+
+- You're running GitLab Community Edition. Before you add your license, you
+ must [upgrade to Enterprise Edition](../update/index.md#community-to-enterprise-edition).
+- You're using GitLab.com. You cannot add a self-managed license to GitLab.com.
+ To use paid features on GitLab.com, [purchase a separate subscription](../subscriptions/gitlab_com/index.md).
+
+### Users exceed license limit upon renewal
+
+GitLab displays a message prompting you to purchase
+additional users. This issue occurs if you add a license that does not have enough
+users to cover the number of users in your instance.
+
+To fix this issue, purchase additional seats to cover those users.
+For more information, read the [licensing FAQ](https://about.gitlab.com/pricing/licensing-faq/).
+
+In GitLab 14.2 and later, for instances that use a license file, the following
+rules apply:
+
+- If the users over license are less than or equal to 10% of the users in the license
+ file, the license is applied and you pay the overage in the next renewal.
+- If the users over license are more than 10% of the users in the license file,
+ you cannot apply the license without purchasing more users.
+
+For example, if you purchase a license for 100 users, you can have 110 users when you add
+your license. However, if you have 111 users, you must purchase more users before you can add
+the license.
+
+### `Start GitLab Ultimate trial` still displays after adding license
+
+To fix this issue, restart [Puma or your entire GitLab instance](../administration/restart_gitlab.md).
diff --git a/doc/administration/load_balancer.md b/doc/administration/load_balancer.md
index e43fe851aa2..a862fd46a3f 100644
--- a/doc/administration/load_balancer.md
+++ b/doc/administration/load_balancer.md
@@ -113,7 +113,7 @@ Configure DNS for an alternate SSH hostname such as `altssh.gitlab.example.com`.
## Readiness check
-It is strongly recommend that multi-node deployments configure load balancers to use the [readiness check](../user/admin_area/monitoring/health_check.md#readiness) to ensure a node is ready to accept traffic, before routing traffic to it. This is especially important when utilizing Puma, as there is a brief period during a restart where Puma doesn't accept requests.
+It is strongly recommend that multi-node deployments configure load balancers to use the [readiness check](../administration/monitoring/health_check.md#readiness) to ensure a node is ready to accept traffic, before routing traffic to it. This is especially important when utilizing Puma, as there is a brief period during a restart where Puma doesn't accept requests.
WARNING:
Using the `all=1` parameter with the readiness check in GitLab versions 15.4 to 15.8 may cause [increased Praefect memory usage](https://gitlab.com/gitlab-org/gitaly/-/issues/4751) and lead to memory errors.
diff --git a/doc/administration/logs/index.md b/doc/administration/logs/index.md
index 8dcb25e22df..449f33fbbef 100644
--- a/doc/administration/logs/index.md
+++ b/doc/administration/logs/index.md
@@ -754,8 +754,8 @@ This file is located at:
This log records:
-- Requests over the [Rate Limit](../../user/admin_area/settings/rate_limits_on_raw_endpoints.md) on raw endpoints.
-- [Protected paths](../../user/admin_area/settings/protected_paths.md) abusive requests.
+- Requests over the [Rate Limit](../settings/rate_limits_on_raw_endpoints.md) on raw endpoints.
+- [Protected paths](../settings/protected_paths.md) abusive requests.
- In GitLab versions [12.3](https://gitlab.com/gitlab-org/gitlab/-/issues/29239) and later,
user ID and username, if available.
@@ -1129,7 +1129,7 @@ GitLab also tracks [Prometheus metrics for Praefect](../gitaly/monitoring.md#mon
For Omnibus installations, the backup log is located at `/var/log/gitlab/gitlab-rails/backup_json.log`.
-This log is populated when a [GitLab backup is created](../../raketasks/backup_restore.md). You can use this log to understand how the backup process performed.
+This log is populated when a [GitLab backup is created](../../administration/backup_restore/index.md). You can use this log to understand how the backup process performed.
## Performance bar stats
diff --git a/doc/administration/maintenance_mode/index.md b/doc/administration/maintenance_mode/index.md
index 3bbebe7ecce..336067d1891 100644
--- a/doc/administration/maintenance_mode/index.md
+++ b/doc/administration/maintenance_mode/index.md
@@ -128,8 +128,12 @@ For most JSON requests, `POST`, `PUT`, `PATCH`, and `DELETE` are blocked, and th
### GraphQL API
+> The `GeoRegistriesUpdate` mutation addition in the allowlist was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124259) in GitLab 16.2.
+
`POST /api/graphql` requests are allowed but mutations are blocked with the error message `You cannot perform write operations on a read-only instance`.
+The only mutation that is allowed is the `GeoRegistriesUpdate` which is used to resync and reverify registries.
+
### Continuous Integration
- No new jobs or pipelines start, scheduled or otherwise.
@@ -194,7 +198,8 @@ When primary is in Maintenance Mode, secondary also automatically goes into Main
It is important that you do not disable replication before enabling Maintenance Mode.
-Replication and verification continues to work but proxied Git pushes to primary do not work.
+Replication, verification and manual actions to resync and reverify registries through the Admin UI
+continue to work, but proxied Git pushes to primary don't.
### Secure features
diff --git a/doc/administration/merge_requests_approvals.md b/doc/administration/merge_requests_approvals.md
new file mode 100644
index 00000000000..6cd0edf22eb
--- /dev/null
+++ b/doc/administration/merge_requests_approvals.md
@@ -0,0 +1,43 @@
+---
+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/product/ux/technical-writing/#assignments
+type: reference, concepts
+---
+
+# Merge request approvals **(PREMIUM SELF)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/39060) in GitLab 12.8.
+
+Merge request approval rules prevent users from overriding certain settings on the project level.
+When enabled at the instance level, these settings [cascade](../user/project/merge_requests/approvals/settings.md#settings-cascading)
+and can no longer be changed:
+
+- In projects.
+- In groups. Cascading to groups was [enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/285410)
+ in GitLab 14.5.
+
+To enable merge request approval settings for an instance:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Push Rules**.
+1. Expand **Merge request approvals**.
+1. Choose the required options.
+1. Select **Save changes**.
+
+## Available rules
+
+Merge request approval settings that can be set at an instance level are:
+
+- **Prevent approval by author**. Prevents project maintainers from allowing request authors to
+ merge their own merge requests.
+- **Prevent approvals by users who add commits**. Prevents project maintainers from allowing users
+ to approve merge requests if they have submitted any commits to the source branch.
+- **Prevent editing approval rules in projects and merge requests**. Prevents users from modifying
+ the approvers list in project settings or in individual merge requests.
+
+See also the following, which are affected by instance-level rules:
+
+- [Project merge request approval rules](../user/project/merge_requests/approvals/index.md).
+- [Group merge request approval settings](../user/group/manage.md#group-merge-request-approval-settings) available in GitLab 13.9 and later.
diff --git a/doc/administration/moderate_users.md b/doc/administration/moderate_users.md
new file mode 100644
index 00000000000..42f1f26586f
--- /dev/null
+++ b/doc/administration/moderate_users.md
@@ -0,0 +1,393 @@
+---
+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/product/ux/technical-writing/#assignments
+type: howto
+---
+
+# Moderate users (administration) **(FREE SELF)**
+
+This is the administration documentation. For information about moderating users at the group level, see the [group-level documentation](../user/group/moderate_users.md).
+
+GitLab administrators can moderate user access by approving, blocking, banning, or deactivating
+users.
+
+## Users pending approval
+
+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 administrator approval for new sign-ups](../administration/settings/sign_up_restrictions.md#require-administrator-approval-for-new-sign-ups) setting.
+- [User cap](../administration/settings/sign_up_restrictions.md#user-cap).
+- [Block auto-created users (OmniAuth)](../integration/omniauth.md#configure-common-settings)
+- [Block auto-created users (LDAP)](../administration/auth/ldap/index.md#basic-configuration-settings)
+
+When a user registers for an account while this setting is enabled:
+
+- The user is placed in a **Pending approval** state.
+- The user sees a message telling them their account is awaiting approval by an administrator.
+
+A user pending approval:
+
+- Is functionally identical to a [blocked](#block-a-user) user.
+- Cannot sign in.
+- Cannot access Git repositories or the GitLab API.
+- Does not receive any notifications from GitLab.
+- Does not consume a [seat](../subscriptions/self_managed/index.md#billable-users).
+
+An administrator must [approve their sign up](#approve-or-reject-a-user-sign-up) to allow them to
+sign in.
+
+### View user sign ups pending approval
+
+To view user sign ups pending approval:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Overview > Users**.
+1. Select the **Pending approval** tab.
+
+### Approve or reject a user sign up
+
+A user sign up pending approval can be approved or rejected from the Admin Area.
+
+To approve or reject a user sign up:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Overview > Users**.
+1. Select the **Pending approval** tab.
+1. Optional. Select a user.
+1. Select the **{settings}** **User administration** dropdown list.
+1. Select **Approve** or **Reject**.
+
+Approving a user:
+
+- Activates their account.
+- Changes the user's state to active.
+- Consumes a subscription [seat](../subscriptions/self_managed/index.md#billable-users).
+
+## Block and unblock users
+
+GitLab administrators can block and unblock users.
+
+### Block a user
+
+To completely prevent access of a user to the GitLab instance,
+administrators can choose to block the user.
+
+Users can be blocked [via an abuse report](../administration/review_abuse_reports.md#blocking-users),
+by removing them in LDAP, or directly from the Admin Area. To do this:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Overview > Users**.
+1. Optional. Select a user.
+1. Select the **{settings}** **User administration** dropdown list.
+1. Select **Block**.
+
+A blocked user:
+
+- Cannot sign in.
+- Cannot access Git repositories or the API.
+- Does not receive any notifications from GitLab.
+- Cannot use [slash commands](../user/project/integrations/gitlab_slack_application.md#slash-commands).
+- Does not consume a [seat](../subscriptions/self_managed/index.md#billable-users).
+
+Personal projects, and group and user history of the blocked user are left intact.
+
+NOTE:
+Users can also be blocked using the [GitLab API](../api/users.md#block-user).
+
+### Unblock a user
+
+A blocked user can be unblocked from the Admin Area. To do this:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Overview > Users**.
+1. Select the **Blocked** tab.
+1. Optional. Select a user.
+1. Select the **{settings}** **User administration** dropdown list.
+1. Select **Unblock**.
+
+The user's state is set to active and they consume a
+[seat](../subscriptions/self_managed/index.md#billable-users).
+
+NOTE:
+Users can also be unblocked using the [GitLab API](../api/users.md#unblock-user).
+
+The unblock option may be unavailable for LDAP users. To enable the unblock option,
+the LDAP identity first needs to be deleted:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Overview > Users**.
+1. Select the **Blocked** tab.
+1. Select a user.
+1. Select the **Identities** tab.
+1. Find the LDAP provider and select **Delete**.
+
+## Activate and deactivate users
+
+GitLab administrators can deactivate and activate users.
+
+### Deactivate a user
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/22257) in GitLab 12.4.
+
+To temporarily prevent access by a GitLab user that has no recent activity,
+administrators can choose to deactivate the user.
+
+Deactivating a user is functionally identical to [blocking a user](#block-and-unblock-users),
+with the following differences:
+
+- It does not prohibit the user from logging back in via the UI.
+- Once a deactivated user logs back into the GitLab UI, their account is set to active.
+
+A deactivated user:
+
+- Cannot access Git repositories or the API.
+- Does not receive any notifications from GitLab.
+- Cannot use [slash commands](../user/project/integrations/gitlab_slack_application.md#slash-commands).
+- Does not consume a [seat](../subscriptions/self_managed/index.md#billable-users).
+
+Personal projects, and group and user history of the deactivated user are left intact.
+
+NOTE:
+Users are notified about account deactivation if
+[user deactivation emails](../administration/settings/email.md#user-deactivation-emails) are enabled.
+
+A user can be deactivated from the Admin Area. To do this:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Overview > Users**.
+1. Optional. Select a user.
+1. Select the **{settings}** **User administration** dropdown list.
+1. Select **Deactivate**.
+
+For the deactivation option to be visible to an administrator, the user:
+
+- Must have a state of active.
+- Must be [dormant](#automatically-deactivate-dormant-users).
+
+NOTE:
+Users can also be deactivated using the [GitLab API](../api/users.md#deactivate-user).
+
+### Automatically deactivate dormant users
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/320875) in GitLab 14.0.
+> - Exclusion of GitLab generate bots [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/340346) in GitLab 14.5
+> - Customizable time period [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/336747) in GitLab 15.4
+> - The lower limit for inactive period set to 90 days [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/100793) in GitLab 15.5
+
+Administrators can enable automatic deactivation of users who either:
+
+- Were created more than a week ago and have not signed in.
+- Have no activity for a specified period of time (default and minimum is 90 days).
+
+To do this:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand the **Account and limit** section.
+1. Under **Dormant users**, check **Deactivate dormant users after a period of inactivity**.
+1. Under **Days of inactivity before deactivation**, enter the number of days before deactivation. Minimum value is 90 days.
+1. Select **Save changes**.
+
+When this feature is enabled, GitLab runs a job once a day to deactivate the dormant users.
+
+A maximum of 100,000 users can be deactivated per day.
+
+NOTE:
+GitLab generated bots are excluded from the automatic deactivation of dormant users.
+
+### Automatically delete unconfirmed users **(PREMIUM SELF)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/352514) in GitLab 16.1 [with a flag](../administration/feature_flags.md) named `delete_unconfirmed_users_setting`. Disabled by default.
+> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124982) in GitLab 16.2.
+
+Prerequisites:
+
+- You must be an administrator.
+
+You can enable automatic deletion of users who both:
+
+- Never confirmed their email address.
+- Signed up for GitLab more than a specified number of days in the past.
+
+You can configure these settings using either the [Settings API](../api/settings.md) or in a Rails console:
+
+```ruby
+ Gitlab::CurrentSettings.update(delete_unconfirmed_users: true)
+ Gitlab::CurrentSettings.update(unconfirmed_users_delete_after_days: 365)
+```
+
+When the `delete_unconfirmed_users` setting is enabled, GitLab runs a job once an hour to delete the unconfirmed users.
+The job only deletes users who signed up more than `unconfirmed_users_delete_after_days` days in the past.
+
+This job only runs when the `email_confirmation_setting` is set to `soft` or `hard`.
+
+A maximum of 240,000 users can be deleted per day.
+
+### Activate a user
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/22257) in GitLab 12.4.
+
+A deactivated user can be activated from the Admin Area.
+
+To do this:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Overview > Users**.
+1. Select the **Deactivated** tab.
+1. Optional. Select a user.
+1. Select the **{settings}** **User administration** dropdown list.
+1. Select **Activate**.
+
+The user's state is set to active and they consume a
+[seat](../subscriptions/self_managed/index.md#billable-users).
+
+NOTE:
+A deactivated user can also activate their account themselves by logging back in via the UI.
+Users can also be activated using the [GitLab API](../api/users.md#activate-user).
+
+## Ban and unban users
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/327353) in GitLab 14.2 [with a flag](../administration/feature_flags.md) named `ban_user_feature_flag`. Disabled by default.
+> - Ban and unban users [generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/327353) in GitLab 14.8. Feature flag `ban_user_feature_flag` removed.
+> - Hiding merge requests of banned users [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107836) in GitLab 15.8 [with a flag](../administration/feature_flags.md) named `hide_merge_requests_from_banned_users`. Disabled by default.
+> - Hiding comments of banned users [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/112973) in GitLab 15.11 [with a flag](../administration/feature_flags.md) named `hidden_notes`. Disabled by default.
+> - Hiding projects of banned users [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/121488) in GitLab 16.2 [with a flag](../administration/feature_flags.md) named `hide_projects_of_banned_users`. Disabled by default.
+
+GitLab administrators can ban and unban users. Banned users are blocked, and their projects, issues, merge requests, and comments are hidden.
+
+### Ban a user
+
+To block a user and hide their contributions, administrators can ban the user.
+
+Users can be banned using the Admin Area. To do this:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Overview > Users**.
+1. Optional. Select a user.
+1. Select the **{settings}** **User administration** dropdown list.
+1. Select **Ban user**.
+
+The banned user does not consume a [seat](../subscriptions/self_managed/index.md#billable-users).
+
+### Unban a user
+
+A banned user can be unbanned using the Admin Area. To do this:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Overview > Users**.
+1. Select the **Banned** tab.
+1. Optional. Select a user.
+1. Select the **{settings}** **User administration** dropdown list.
+1. Select **Unban user**.
+
+The user's state is set to active and they consume a
+[seat](../subscriptions/self_managed/index.md#billable-users).
+
+### Delete a user
+
+Use the Admin Area to delete users.
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Overview > Users**.
+1. Select the **Banned** tab.
+1. Optional. Select a user.
+1. Select the **{settings}** **User administration** dropdown list.
+1. Select **Delete user**.
+1. Type the username.
+1. Select **Delete user**.
+
+NOTE:
+You can only delete a user if there are inherited or direct owners of a group. You cannot delete a user if they are the only group owner.
+
+You can also delete a user and their contributions, such as merge requests, issues, and groups of which they are the only group owner.
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Overview > Users**.
+1. Select the **Banned** tab.
+1. Optional. Select a user.
+1. Select the **{settings}** **User administration** dropdown list.
+1. Select **Delete user and contributions**.
+1. Type the username.
+1. Select **Delete user and contributions**.
+
+NOTE:
+Before 15.1, additionally groups of which deleted user were the only owner among direct members were deleted.
+
+## Troubleshooting
+
+When moderating users, you may need to perform bulk actions on them based on certain conditions. The following rails console scripts show some examples of this. You may [start a rails console session](../administration/operations/rails_console.md#starting-a-rails-console-session) and use scripts similar to the following:
+
+### Deactivate users that have no recent activity
+
+Administrators can deactivate users that have no recent activity.
+
+WARNING:
+Commands that change data can cause damage if not run correctly or under the right conditions. Always run commands in a test environment first and have a backup instance ready to restore.
+
+```ruby
+days_inactive = 90
+inactive_users = User.active.where("last_activity_on <= ?", days_inactive.days.ago)
+
+inactive_users.each do |user|
+ puts "user '#{user.username}': #{user.last_activity_on}"
+ user.deactivate!
+end
+```
+
+### Block users that have no recent activity
+
+Administrators can block users that have no recent activity.
+
+WARNING:
+Commands that change data can cause damage if not run correctly or under the right conditions. Always run commands in a test environment first and have a backup instance ready to restore.
+
+```ruby
+days_inactive = 90
+inactive_users = User.active.where("last_activity_on <= ?", days_inactive.days.ago)
+
+inactive_users.each do |user|
+ puts "user '#{user.username}': #{user.last_activity_on}"
+ user.block!
+end
+```
+
+### Block or delete users that have no projects or groups
+
+Administrators can block or delete users that have no projects or groups.
+
+WARNING:
+Commands that change data can cause damage if not run correctly or under the right conditions. Always run commands in a test environment first and have a backup instance ready to restore.
+
+```ruby
+users = User.where('id NOT IN (select distinct(user_id) from project_authorizations)')
+
+# How many users are removed?
+users.count
+
+# If that count looks sane:
+
+# You can either block the users:
+users.each { |user| user.blocked? ? nil : user.block! }
+
+# Or you can delete them:
+ # need 'current user' (your user) for auditing purposes
+current_user = User.find_by(username: '<your username>')
+
+users.each do |user|
+ DeleteUserWorker.perform_async(current_user.id, user.id)
+end
+```
diff --git a/doc/administration/monitoring/health_check.md b/doc/administration/monitoring/health_check.md
new file mode 100644
index 00000000000..4dbbdf6f3c9
--- /dev/null
+++ b/doc/administration/monitoring/health_check.md
@@ -0,0 +1,146 @@
+---
+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/product/ux/technical-writing/#assignments
+---
+
+# Health Check **(FREE SELF)**
+
+GitLab provides liveness and readiness probes to indicate service health and
+reachability to required services. These probes report on the status of the
+database connection, Redis connection, and access to the file system. These
+endpoints [can be provided to schedulers like Kubernetes](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/) to hold
+traffic until the system is ready or restart the container as needed.
+
+## IP allowlist
+
+To access monitoring resources, the requesting client IP needs to be included in the allowlist.
+For details, see [how to add IPs to the allowlist for the monitoring endpoints](../../administration/monitoring/ip_allowlist.md).
+
+## Using the endpoints locally
+
+With default allowlist settings, the probes can be accessed from localhost using the following URLs:
+
+```plaintext
+GET http://localhost/-/health
+```
+
+```plaintext
+GET http://localhost/-/readiness
+```
+
+```plaintext
+GET http://localhost/-/liveness
+```
+
+## Health
+
+Checks whether the application server is running.
+It does not verify the database or other services
+are running. This endpoint circumvents Rails Controllers
+and is implemented as additional middleware `BasicHealthCheck`
+very early into the request processing lifecycle.
+
+```plaintext
+GET /-/health
+```
+
+Example request:
+
+```shell
+curl "https://gitlab.example.com/-/health"
+```
+
+Example response:
+
+```plaintext
+GitLab OK
+```
+
+## Readiness
+
+The readiness probe checks whether the GitLab instance is ready
+to accept traffic via Rails Controllers. The check by default
+does validate only instance-checks.
+
+If the `all=1` parameter is specified, the check also validates
+the dependent services (Database, Redis, Gitaly etc.)
+and gives a status for each.
+
+```plaintext
+GET /-/readiness
+GET /-/readiness?all=1
+```
+
+Example request:
+
+```shell
+curl "https://gitlab.example.com/-/readiness"
+```
+
+Example response:
+
+```json
+{
+ "master_check":[{
+ "status":"failed",
+ "message": "unexpected Master check result: false"
+ }],
+ ...
+}
+```
+
+On failure, the endpoint returns a `503` HTTP status code.
+
+This check is being exempt from Rack Attack.
+
+## Liveness
+
+WARNING:
+In GitLab [12.4](https://about.gitlab.com/upcoming-releases/)
+the response body of the Liveness check was changed
+to match the example below.
+
+Checks whether the application server is running.
+This probe is used to know if Rails Controllers
+are not deadlocked due to a multi-threading.
+
+```plaintext
+GET /-/liveness
+```
+
+Example request:
+
+```shell
+curl "https://gitlab.example.com/-/liveness"
+```
+
+Example response:
+
+On success, the endpoint returns a `200` HTTP status code, and a response like below.
+
+```json
+{
+ "status": "ok"
+}
+```
+
+On failure, the endpoint returns a `503` HTTP status code.
+
+This check is being exempt from Rack Attack.
+
+## Sidekiq
+
+Learn how to configure the [Sidekiq health checks](../../administration/sidekiq/sidekiq_health_check.md).
+
+<!-- ## 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, for example `### Getting error message X`.
+If you have none to add when creating a doc, leave this section in place
+but commented out to help encourage others to add to it in the future. -->
diff --git a/doc/administration/monitoring/index.md b/doc/administration/monitoring/index.md
index 1b23d6b7f49..622a772a638 100644
--- a/doc/administration/monitoring/index.md
+++ b/doc/administration/monitoring/index.md
@@ -15,7 +15,7 @@ Explore our features to monitor your GitLab instance:
products.
- [GitHub imports](github_imports.md): Monitor the health and progress of the GitHub
importer with various Prometheus metrics.
-- [Monitoring uptime](../../user/admin_area/monitoring/health_check.md): Check the
+- [Monitoring uptime](health_check.md): Check the
server status using the health check endpoint.
- [IP allowlists](ip_allowlist.md): Configure GitLab for monitoring endpoints that
provide health check information when probed.
diff --git a/doc/administration/monitoring/ip_allowlist.md b/doc/administration/monitoring/ip_allowlist.md
index 72640cd6218..364c1b27d33 100644
--- a/doc/administration/monitoring/ip_allowlist.md
+++ b/doc/administration/monitoring/ip_allowlist.md
@@ -6,13 +6,15 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# IP whitelist **(FREE SELF)**
-GitLab provides some [monitoring endpoints](../../user/admin_area/monitoring/health_check.md)
+GitLab provides some [monitoring endpoints](health_check.md)
that provide health check information when probed.
To control access to those endpoints via IP whitelisting, you can add single
hosts or use IP ranges:
-**Omnibus**
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
1. Open `/etc/gitlab/gitlab.rb` and add or uncomment the following:
@@ -22,9 +24,7 @@ hosts or use IP ranges:
1. Save the file and [reconfigure](../restart_gitlab.md#reconfigure-a-linux-package-installation) GitLab for the changes to take effect.
----
-
-**Helm chart**
+:::TabTitle Helm chart (Kubernetes)
You can set the required IPs under the `gitlab.webservice.monitoring.ipWhitelist` key. For example:
@@ -37,9 +37,7 @@ gitlab:
- 0.0.0.0/0 # Default
```
----
-
-**Source**
+:::TabTitle Self-compiled (source)
1. Edit `config/gitlab.yml`:
@@ -52,3 +50,5 @@ gitlab:
```
1. Save the file and [restart](../restart_gitlab.md#installations-from-source) GitLab for the changes to take effect.
+
+::EndTabs
diff --git a/doc/administration/monitoring/performance/gitlab_configuration.md b/doc/administration/monitoring/performance/gitlab_configuration.md
index 0d2037f3a92..a1def4764f6 100644
--- a/doc/administration/monitoring/performance/gitlab_configuration.md
+++ b/doc/administration/monitoring/performance/gitlab_configuration.md
@@ -16,8 +16,8 @@ settings:
1. Add the necessary configuration changes.
1. Restart all GitLab for the changes to take effect:
- - For Omnibus GitLab installations: `sudo gitlab-ctl restart`
- - For installations from source: `sudo service gitlab restart`
+ - For Linux package installations: `sudo gitlab-ctl restart`
+ - For self-compiled installations: `sudo service gitlab restart`
NOTE:
Removed [in GitLab 13.0](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/30786). Use the
diff --git a/doc/administration/monitoring/performance/grafana_configuration.md b/doc/administration/monitoring/performance/grafana_configuration.md
index b448ac461c8..8b3720ca8a9 100644
--- a/doc/administration/monitoring/performance/grafana_configuration.md
+++ b/doc/administration/monitoring/performance/grafana_configuration.md
@@ -18,10 +18,10 @@ and Grafana allows you to query the data to display graphs.
## Deprecation of bundled Grafana
-Bundled Grafana was an optional Omnibus GitLab service that provided a user interface to GitLab metrics.
+Bundled Grafana was an optional service for Linux package installations that provided a user interface to GitLab metrics.
-The version of Grafana that is bundled with Omnibus GitLab is no longer supported. If you're using the bundled Grafana, you
-should switch to a newer version from [Grafana Labs](https://grafana.com/grafana/).
+The version of Grafana that is bundled with Linux package installations is no longer supported. If you're using the
+bundled Grafana, you should switch to a newer version from [Grafana Labs](https://grafana.com/grafana/).
### Switch to new Grafana instance
@@ -34,7 +34,8 @@ To switch away from bundled Grafana to a newer version of Grafana from Grafana L
### Temporary workaround
-In GitLab versions 16.0 to 16.2, you can still force Omnibus GitLab to enable and configure Grafana by setting the following:
+In GitLab versions 16.0 to 16.2, you can still force Linux package installations to enable and configure Grafana by
+setting the following:
- `grafana['enable'] = true`.
- `grafana['enable_deprecated_service'] = true`.
@@ -92,9 +93,9 @@ GitLab sidebar:
and expand **Metrics - Grafana**.
1. Select the **Add a link to Grafana** checkbox.
1. Configure the **Grafana URL**:
- - *If Grafana is enabled through Omnibus GitLab and on the same server,*
+ - If Grafana is enabled through a Linux package installation and on the same server,
leave **Grafana URL** unchanged. It should be `/-/grafana`.
- - *Otherwise,* enter the full URL of the Grafana instance.
+ - Otherwise, enter the full URL of the Grafana instance.
1. Select **Save changes**.
GitLab displays your link in the **Main menu > Admin > Monitoring > Metrics Dashboard**.
diff --git a/doc/administration/monitoring/performance/performance_bar.md b/doc/administration/monitoring/performance/performance_bar.md
index 3fdd4c24177..8afec54dab2 100644
--- a/doc/administration/monitoring/performance/performance_bar.md
+++ b/doc/administration/monitoring/performance/performance_bar.md
@@ -22,7 +22,7 @@ From left to right, the performance bar displays:
- **Current Host**: the current host serving the page.
- **Database queries**: the time taken (in milliseconds) and the total number
of database queries, displayed in the format `00ms / 00 (00 cached) pg`. Select to display
- a modal window with more details. You can use this to see the following
+ a dialog with more details. You can use this to see the following
details for each query:
- **In a transaction**: shows up below the query if it was executed in
the context of a transaction
@@ -38,8 +38,7 @@ From left to right, the performance bar displays:
[Gitaly](../../gitaly/index.md) calls. Select to display a modal window with more
details.
- **Rugged calls**: the time taken (in milliseconds) and the total number of
- [Rugged](../../nfs.md#improving-nfs-performance-with-gitlab) calls.
- Select to display a modal window with more details.
+ Rugged calls. Select to display a modal window with more details.
- **Redis calls**: the time taken (in milliseconds) and the total number of
Redis calls. Select to display a modal window with more details.
- **Elasticsearch calls**: the time taken (in milliseconds) and the total number of
diff --git a/doc/administration/monitoring/prometheus/gitlab_exporter.md b/doc/administration/monitoring/prometheus/gitlab_exporter.md
index 0bd13fe5a87..22b73378cab 100644
--- a/doc/administration/monitoring/prometheus/gitlab_exporter.md
+++ b/doc/administration/monitoring/prometheus/gitlab_exporter.md
@@ -9,12 +9,12 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> Renamed from `GitLab monitor exporter` to `GitLab exporter` in [GitLab 12.3](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/16511).
The [GitLab exporter](https://gitlab.com/gitlab-org/gitlab-exporter) enables you to
-measure various GitLab metrics pulled from Redis and the database in Omnibus GitLab
+measure various GitLab metrics pulled from Redis and the database in Linux package
instances.
For installations from source you must install and configure it yourself.
-To enable the GitLab exporter in an Omnibus GitLab instance:
+To enable the GitLab exporter in a Linux package instance:
1. [Enable Prometheus](index.md#configuring-prometheus).
1. Edit `/etc/gitlab/gitlab.rb`.
@@ -32,7 +32,7 @@ the GitLab exporter exposed at `localhost:9168`.
## Use a different Rack server
-> - Introduced in [Omnibus GitLab 13.8](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/4896).
+> - Introduced in [GitLab 13.8](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/4896).
> - WEBrick is now the default Rack server instead of Puma.
By default, the GitLab exporter runs on [WEBrick](https://github.com/ruby/webrick), a single-threaded Ruby web server.
diff --git a/doc/administration/monitoring/prometheus/gitlab_metrics.md b/doc/administration/monitoring/prometheus/gitlab_metrics.md
index 5d6827b79ee..713a1fb3b5d 100644
--- a/doc/administration/monitoring/prometheus/gitlab_metrics.md
+++ b/doc/administration/monitoring/prometheus/gitlab_metrics.md
@@ -23,8 +23,8 @@ GitLab monitors its own internal service metrics, and makes them available at th
`/-/metrics` endpoint. Unlike other [Prometheus](https://prometheus.io) exporters, to access
the metrics, the client IP address must be [explicitly allowed](../ip_allowlist.md).
-These metrics are enabled and collected for [Omnibus GitLab](https://docs.gitlab.com/omnibus/)
-and Chart installations. For source installations, these metrics must be enabled
+These metrics are enabled and collected for [Linux package](https://docs.gitlab.com/omnibus/)
+and Helm chart installations. For self-compiled installations, these metrics must be enabled
manually and collected by a Prometheus server.
For enabling and viewing metrics from Sidekiq nodes, see [Sidekiq metrics](#sidekiq-metrics).
@@ -206,7 +206,7 @@ configuration option in `gitlab.yml`. These metrics are served from the
| `sidekiq_jobs_dead_total` | Counter | 13.7 | Sidekiq dead jobs (jobs that have run out of retries) | `queue`, `boundary`, `external_dependencies`, `feature_category`, `urgency` |
| `sidekiq_redis_requests_total` | Counter | 13.1 | Redis requests during a Sidekiq job execution | `queue`, `boundary`, `external_dependencies`, `feature_category`, `job_status`, `urgency` |
| `sidekiq_elasticsearch_requests_total` | Counter | 13.1 | Elasticsearch requests during a Sidekiq job execution | `queue`, `boundary`, `external_dependencies`, `feature_category`, `job_status`, `urgency` |
-| `sidekiq_jobs_deferred_total` | Counter | 16.1 | Number of jobs being deferred when `defer_sidekiq_jobs` feature flag is enabled | `worker` |
+| `sidekiq_jobs_skipped_total` | Counter | 16.2 | Number of jobs being skipped (dropped or deferred) when `drop_sidekiq_jobs` feature flag is enabled or `run_sidekiq_jobs` feature flag is disabled | `worker`, `action` |
| `sidekiq_running_jobs` | Gauge | 12.2 | Number of Sidekiq jobs running | `queue`, `boundary`, `external_dependencies`, `feature_category`, `urgency` |
| `sidekiq_concurrency` | Gauge | 12.5 | Maximum number of Sidekiq jobs | |
| `sidekiq_mem_total_bytes` | Gauge | 15.3 | Number of bytes allocated for both objects consuming an object slot and objects that required a malloc'| |
@@ -371,6 +371,17 @@ configuration option in `gitlab.yml`. These metrics are served from the
| `geo_project_wiki_repositories_verification_total` | Gauge | 15.10 | Number of Project Wiki Repositories to attempt to verify on secondary | `url` |
| `geo_project_wiki_repositories_verified` | Gauge | 15.10 | Number of Project Wiki Repositories successfully verified on secondary | `url` |
| `geo_project_wiki_repositories_verification_failed` | Gauge | 15.10 | Number of Project Wiki Repositories that failed verification on secondary | `url` |
+| `geo_project_repositories` | Gauge | 16.2 | Number of Project Repositories on primary | `url` |
+| `geo_project_repositories_checksum_total` | Gauge | 16.2 | Number of Project Repositories to checksum on primary | `url` |
+| `geo_project_repositories_checksummed` | Gauge | 16.2 | Number of Project Repositories that successfully calculated the checksum on primary | `url` |
+| `geo_project_repositories_checksum_failed` | Gauge | 16.2 | Number of Project Repositories that failed to calculate the checksum on primary | `url` |
+| `geo_project_repositories_synced` | Gauge | 16.2 | Number of syncable Project Repositories synced on secondary | `url` |
+| `geo_project_repositories_failed` | Gauge | 16.2 | Number of syncable Project Repositories failed to sync on secondary | `url` |
+| `geo_project_repositories_registry` | Gauge | 16.2 | Number of Project Repositories in the registry | `url` |
+| `geo_project_repositories_verification_total` | Gauge | 16.2 | Number of Project Repositories to attempt to verify on secondary | `url` |
+| `geo_project_repositories_verified` | Gauge | 16.2 | Number of Project Repositories successfully verified on secondary | `url` |
+| `geo_project_repositories_verification_failed` | Gauge | 16.2 | Number of Project Repositories that failed verification on secondary | `url` |
+
| `gitlab_memwd_violations_total` | Counter | 15.9 | Total number of times a Sidekiq process violated a memory threshold | |
| `gitlab_memwd_violations_handled_total` | Counter | 15.9 | Total number of times Sidekiq process memory violations were handled | |
| `sidekiq_watchdog_running_jobs_total` | Counter | 15.9 | Current running jobs when RSS limit was reached | `worker_class` |
@@ -460,7 +471,6 @@ Some basic Ruby runtime metrics are available:
| `puma_pool_capacity` | Gauge | 12.0 | Number of requests the worker is capable of taking right now |
| `puma_max_threads` | Gauge | 12.0 | Maximum number of worker threads |
| `puma_idle_threads` | Gauge | 12.0 | Number of spawned threads which are not processing a request |
-| `puma_killer_terminations_total` | Gauge | 12.0 | Number of workers terminated by PumaWorkerKiller |
## Redis metrics
@@ -487,5 +497,5 @@ metrics can't function correctly.
This directory's location is configured using environment variable `prometheus_multiproc_dir`.
For best performance, create this directory in `tmpfs`.
-If GitLab is installed using [Omnibus GitLab](https://docs.gitlab.com/omnibus/)
+If GitLab is installed using the [Linux package](https://docs.gitlab.com/omnibus/)
and `tmpfs` is available, then GitLab configures the metrics directory for you.
diff --git a/doc/administration/monitoring/prometheus/index.md b/doc/administration/monitoring/prometheus/index.md
index 0e8315e528a..a9b393aab33 100644
--- a/doc/administration/monitoring/prometheus/index.md
+++ b/doc/administration/monitoring/prometheus/index.md
@@ -9,12 +9,11 @@ info: To determine the technical writer assigned to the Stage/Group associated w
[Prometheus](https://prometheus.io) is a powerful time-series monitoring service, providing a flexible
platform for monitoring GitLab and other software products.
-GitLab provides out-of-the-box monitoring with Prometheus, providing easy
-access to high quality time-series monitoring of GitLab services.
+GitLab provides out-of-the-box monitoring with Prometheus, providing access to high quality time-series monitoring of
+GitLab services.
-Prometheus and the various exporters listed in this page are bundled in the
-Omnibus GitLab package. Check each exporter's documentation for the timeline
-they got added. For installations from source you must install them
+Prometheus and the various exporters listed in this page are bundled in Linux packages. Check each exporter's
+documentation for the timeline they got added. For installations from source you must install them
yourself. Over subsequent releases additional GitLab metrics are captured.
Prometheus services are on by default.
@@ -85,7 +84,7 @@ listens on:
### Adding custom scrape configurations
-You can configure additional scrape targets for the Omnibus GitLab-bundled
+You can configure additional scrape targets for the Linux package-bundled
Prometheus by editing `prometheus['scrape_configs']` in `/etc/gitlab/gitlab.rb`
using the [Prometheus scrape target configuration](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#%3Cscrape_config%3E)
syntax.
@@ -108,16 +107,16 @@ prometheus['scrape_configs'] = [
]
```
-### Standalone Prometheus using Omnibus GitLab
+### Standalone Prometheus using the Linux package
-The Omnibus GitLab package can be used to configure a standalone Monitoring node running Prometheus and [Grafana](../performance/grafana_configuration.md).
+The Linux package can be used to configure a standalone Monitoring node running Prometheus and [Grafana](../performance/grafana_configuration.md).
-The steps below are the minimum necessary to configure a Monitoring node running Prometheus and Grafana with Omnibus GitLab:
+The steps below are the minimum necessary to configure a Monitoring node running Prometheus and Grafana with the Linux
+package:
1. SSH into the Monitoring node.
-1. [Install](https://about.gitlab.com/install/) the Omnibus GitLab
- package you want using **steps 1 and 2** from the GitLab downloads page, but
- do not follow the remaining steps.
+1. [Install](https://about.gitlab.com/install/) the Linux package you want using **steps 1 and 2** from the GitLab
+ downloads page, but do not follow the remaining steps.
1. Make sure to collect the IP addresses or DNS records of the Consul server nodes, for the next step.
1. Edit `/etc/gitlab/gitlab.rb` and add the contents:
@@ -388,8 +387,7 @@ Read more about the [GitLab Metrics](gitlab_metrics.md).
## Bundled software metrics
-Many of the GitLab dependencies bundled in Omnibus GitLab are preconfigured to
-export Prometheus metrics.
+Many of the GitLab dependencies bundled in the Linux package are preconfigured to export Prometheus metrics.
### Node exporter
@@ -435,22 +433,6 @@ The GitLab exporter allows you to measure various GitLab metrics, pulled from Re
[Read more about the GitLab exporter](gitlab_exporter.md).
-## Configuring Prometheus to monitor Kubernetes
-
-If your GitLab server is running within Kubernetes, Prometheus collects metrics from the Nodes and [annotated Pods](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config) in the cluster, including performance data on each container. This is particularly helpful if your CI/CD environments run in the same cluster, as you can use the [Prometheus project integration](../../../user/project/integrations/prometheus.md) to monitor them.
-
-To disable the monitoring of Kubernetes:
-
-1. Edit `/etc/gitlab/gitlab.rb`.
-1. Add (or find and uncomment) the following line and set it to `false`:
-
- ```ruby
- prometheus['monitor_kubernetes'] = false
- ```
-
-1. Save the file and [reconfigure GitLab](../../restart_gitlab.md#reconfigure-a-linux-package-installation) for the changes to
- take effect.
-
## Troubleshooting
### `/var/opt/gitlab/prometheus` consumes too much disk space
diff --git a/doc/administration/nfs.md b/doc/administration/nfs.md
index 3e3712c9645..0273c4b03b1 100644
--- a/doc/administration/nfs.md
+++ b/doc/administration/nfs.md
@@ -15,35 +15,10 @@ is recommended over NFS where possible, due to better performance.
When eliminating the usage of NFS, there are [additional steps you need to take](object_storage.md#alternatives-to-file-system-storage)
in addition to moving to Object Storage.
-File system performance can impact overall GitLab performance, especially for
-actions that read or write to Git repositories. For steps you can use to test
-file system performance, see
-[File System Performance Benchmarking](operations/filesystem_benchmarking.md).
-
-## Gitaly with NFS not supported
-
-Technical and engineering support for using NFS to store Git repository data is officially at end-of-life. No product
-changes or troubleshooting is provided through engineering, security or paid support channels.
-
-If an issue is reproducible, or if it happens intermittently but regularly, GitLab Support can investigate providing the
-issue can be reproduced without NFS. To reproduce without NFS, migrate the affected repositories to a different Gitaly
-shard. For example, a Gitaly Cluster or a standalone Gitaly VM, backed with block storage.
-
-## Known kernel version incompatibilities
-
-RedHat Enterprise Linux (RHEL) and CentOS v7.7 and v7.8 ship with kernel
-version `3.10.0-1127`, which [contains a bug](https://bugzilla.redhat.com/show_bug.cgi?id=1783554) that causes
-[uploads to fail to copy over NFS](https://gitlab.com/gitlab-org/gitlab/-/issues/218999). The
-following GitLab versions include a fix to work properly with that
-kernel version:
-
-- [12.10.12](https://about.gitlab.com/releases/2020/06/25/gitlab-12-10-12-released/)
-- [13.0.7](https://about.gitlab.com/releases/2020/06/25/gitlab-13-0-7-released/)
-- [13.1.1](https://about.gitlab.com/releases/2020/06/24/gitlab-13-1-1-released/)
-- 13.2 and up
+NFS cannot be used for repository storage.
-If you are using that kernel version, be sure to upgrade GitLab to avoid
-errors.
+For steps you can use to test file system performance, see
+[File System Performance Benchmarking](operations/filesystem_benchmarking.md).
## Fast lookup of authorized SSH keys
@@ -59,26 +34,6 @@ is moved to NFS.
We are investigating the use of
[fast lookup as the default](https://gitlab.com/groups/gitlab-org/-/epics/3104).
-## Improving NFS performance with GitLab
-
-NFS performance with GitLab can in some cases be improved with
-[direct Git access](gitaly/index.md#direct-access-to-git-in-gitlab) using [Rugged](https://github.com/libgit2/rugged).
-
-Depending on the GitLab version, GitLab [automatically detects](gitaly/index.md#automatic-detection) if Rugged can and should
-be used per storage.
-
-If the Rugged feature flag is explicitly set to either `true` or `false`, GitLab uses the value explicitly set. If you
-previously enabled Rugged using the feature flag and you want to use automatic detection instead, you must unset
-the feature flag:
-
-```shell
-sudo gitlab-rake gitlab:features:unset_rugged
-```
-
-From GitLab 12.7, Rugged is only automatically enabled for use with Puma if the
-[Puma thread count is set to `1`](../install/requirements.md#puma-settings). To use Rugged with a Puma thread count of
-more than `1`, enable Rugged using the [feature flag](../development/gitaly.md#legacy-rugged-code).
-
## NFS server
Installing the `nfs-kernel-server` package allows you to share directories with
@@ -293,7 +248,7 @@ NFS mount point is `/gitlab-nfs`. Then, add the following bind mounts in
Using bind mounts requires you to manually make sure the data directories
are empty before attempting a restore. Read more about the
-[restore prerequisites](../raketasks/backup_restore.md).
+[restore prerequisites](../administration/backup_restore/index.md).
### Multiple NFS mounts
@@ -315,7 +270,7 @@ provide configuration for [UDP log shipping](https://docs.gitlab.com/omnibus/set
Having multiple NFS mounts requires you to manually make sure the data directories
are empty before attempting a restore. Read more about the
-[restore prerequisites](../raketasks/backup_restore.md).
+[restore prerequisites](../administration/backup_restore/index.md).
## Testing NFS
@@ -361,33 +316,6 @@ sudo ufw allow from <client_ip_address> to any port nfs
## Known issues
-### Upgrade to Gitaly Cluster or disable caching if experiencing data loss
-
-WARNING:
-Engineering support for NFS for Git repositories
-[is unavailable](../update/removals.md#nfs-as-git-repository-storage-is-no-longer-supported).
-
-Customers and users have reported data loss on high-traffic repositories when using NFS for Git repositories.
-For example, we have seen:
-
-- [Inconsistent updates after a push](https://gitlab.com/gitlab-org/gitaly/-/issues/2589).
-- `git ls-remote` [returning the wrong (or no branches)](https://gitlab.com/gitlab-org/gitaly/-/issues/3083)
-causing Jenkins to intermittently re-run all pipelines for a repository.
-
-The problem may be partially mitigated by adjusting caching using the following NFS client mount options:
-
-| Setting | Description |
-| ------- | ----------- |
-| `lookupcache=positive` | Tells the NFS client to honor `positive` cache results but invalidates any `negative` cache results. Negative cache results cause problems with Git. Specifically, a `git push` can fail to register uniformly across all NFS clients. The negative cache causes the clients to 'remember' that the files did not exist previously.
-| `actimeo=0` | Sets the time to zero that the NFS client caches files and directories before requesting fresh information from a server. |
-| `noac` | Tells the NFS client not to cache file attributes and forces application writes to become synchronous so that local changes to a file become visible on the server immediately. |
-
-WARNING:
-The `actimeo=0` and `noac` options both result in a significant reduction in performance, possibly leading to timeouts.
-You may be able to avoid timeouts and data loss using `actimeo=0` and `lookupcache=positive` _without_ `noac`, however
-we expect the performance reduction is still significant. Upgrade to
-[Gitaly Cluster](gitaly/praefect.md) as soon as possible.
-
### Avoid using cloud-based file systems
GitLab strongly recommends against using cloud-based file systems such as:
@@ -447,10 +375,3 @@ 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/index.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 f2b966bd180..2bf3ef0275c 100644
--- a/doc/administration/object_storage.md
+++ b/doc/administration/object_storage.md
@@ -68,7 +68,7 @@ automatically. Thus, only the following providers can be used:
The consolidated form configuration can't be used for backups or
Mattermost. Backups can be configured with
-[server side encryption](../raketasks/backup_gitlab.md#s3-encrypted-buckets)
+[server side encryption](../administration/backup_restore/backup_gitlab.md#s3-encrypted-buckets)
separately. See the
[table for a complete list](#configure-each-object-type-to-define-its-own-storage-connection-storage-specific-form)
of supported object storage types.
@@ -163,7 +163,7 @@ supported by consolidated form, refer to the following guides:
| Object storage type | Supported by consolidated form? |
|---------------------|------------------------------------------|
| [Project-level Secure Files](secure_files.md#using-object-storage) | **{dotted-circle}** No |
-| [Backups](../raketasks/backup_gitlab.md#upload-backups-to-a-remote-cloud-storage) | **{dotted-circle}** No |
+| [Backups](../administration/backup_restore/backup_gitlab.md#upload-backups-to-a-remote-cloud-storage) | **{dotted-circle}** No |
| [Container Registry](packages/container_registry.md#use-object-storage) (optional feature) | **{dotted-circle}** No |
| [Mattermost](https://docs.mattermost.com/configure/file-storage-configuration-settings.html)| **{dotted-circle}** No |
| [Autoscale runner caching](https://docs.gitlab.com/runner/configuration/autoscale.html#distributed-runners-caching) (optional for improved performance) | **{dotted-circle}** No |
@@ -174,7 +174,7 @@ supported by consolidated form, refer to the following guides:
| [Packages](packages/index.md#use-object-storage) (optional feature) | **{check-circle}** Yes |
| [Dependency Proxy](packages/dependency_proxy.md#using-object-storage) (optional feature) | **{check-circle}** Yes |
| [Terraform state files](terraform_state.md#using-object-storage) | **{check-circle}** Yes |
-| [Pages content](pages/index.md#using-object-storage) | **{check-circle}** Yes |
+| [Pages content](pages/index.md#object-storage-settings) | **{check-circle}** Yes |
## Configure the connection settings
@@ -825,7 +825,7 @@ See the following additional guides:
### Objects are not included in GitLab backups
-As noted in [the backup documentation](../raketasks/backup_restore.md),
+As noted in [the backup documentation](../administration/backup_restore/index.md),
objects are not included in GitLab backups. You can enable backups with
your object storage provider instead.
@@ -848,7 +848,7 @@ Helm-based installs require separate buckets to
### S3 API compatibility issues
-Not all S3 providers [are fully compatible](../raketasks/backup_gitlab.md#other-s3-providers)
+Not all S3 providers [are fully compatible](../administration/backup_restore/backup_gitlab.md#other-s3-providers)
with the Fog library that GitLab uses. Symptoms include an error in `production.log`:
```plaintext
diff --git a/doc/administration/operations/fast_ssh_key_lookup.md b/doc/administration/operations/fast_ssh_key_lookup.md
index d54d286c19d..8382f3aa8b5 100644
--- a/doc/administration/operations/fast_ssh_key_lookup.md
+++ b/doc/administration/operations/fast_ssh_key_lookup.md
@@ -27,8 +27,8 @@ lookup of authorized SSH keys.
## Fast lookup is required for Geo **(PREMIUM)**
-Unlike [Cloud Native GitLab](https://docs.gitlab.com/charts/), Omnibus GitLab by default
-manages an `authorized_keys` file that is located in the
+Unlike [Cloud Native GitLab](https://docs.gitlab.com/charts/), by default Linux package installations
+manage an `authorized_keys` file that is located in the
`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:
@@ -74,7 +74,7 @@ able to accept a fingerprint. Check the version of OpenSSH on your server with `
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:
+Docker from a Linux package installation:
```plaintext
Match User git # Apply the AuthorizedKeysCommands to the git user only
@@ -146,7 +146,8 @@ This overview is brief. Refer to the above instructions for more context.
1. On the left sidebar, select **Settings > Network**.
1. Expand **Performance optimization**.
1. Select the **Use authorized_keys file to authenticate SSH keys** checkbox.
-1. Remove the `AuthorizedKeysCommand` lines from `/etc/ssh/sshd_config` or from `/assets/sshd_config` if you are using Omnibus Docker.
+1. Remove the `AuthorizedKeysCommand` lines from `/etc/ssh/sshd_config` or from `/assets/sshd_config` if you are using Docker
+ from a Linux package installation.
1. Reload `sshd`: `sudo service sshd reload`.
## SELinux support and limitations
diff --git a/doc/administration/operations/filesystem_benchmarking.md b/doc/administration/operations/filesystem_benchmarking.md
index cd4ab1a9cf8..bd37bd4b1a8 100644
--- a/doc/administration/operations/filesystem_benchmarking.md
+++ b/doc/administration/operations/filesystem_benchmarking.md
@@ -11,7 +11,7 @@ especially for actions that read or write to Git repositories. This information
helps benchmark file system performance against known good and bad real-world
systems.
-Normally when talking about file system performance the biggest concern is
+When talking about file system performance the biggest concern is
with Network File Systems (NFS). However, even some local disks can have slow
I/O. The information on this page can be used for either scenario.
diff --git a/doc/administration/operations/gitlab_sshd.md b/doc/administration/operations/gitlab_sshd.md
index 5c4af32fc3d..2707c8f08a0 100644
--- a/doc/administration/operations/gitlab_sshd.md
+++ b/doc/administration/operations/gitlab_sshd.md
@@ -7,7 +7,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# `gitlab-sshd` **(FREE SELF)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/299109) in GitLab 14.5 as an Experiment for self-managed customers.
-> - Ready for production use with [Cloud Native GitLab in GitLab 15.1](https://gitlab.com/gitlab-org/charts/gitlab/-/issues/2540) and [Omnibus GitLab in GitLab 15.9](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5937).
+> - Ready for production use with [Cloud Native GitLab in GitLab 15.1](https://gitlab.com/gitlab-org/charts/gitlab/-/issues/2540) and [Linux packages in GitLab 15.9](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5937).
`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 the `gitlab-shell` package. It has a lower memory
@@ -47,7 +47,7 @@ The following instructions enable `gitlab-sshd` on a different port than OpenSSH
gitlab_sshd['listen_address'] = '[::]:2222' # Adjust the port accordingly
```
-1. Optional. By default, Omnibus GitLab generates SSH host keys for `gitlab-sshd` if
+1. Optional. By default, Linux package installations generate SSH host keys for `gitlab-sshd` if
they do not exist in `/var/opt/gitlab/gitlab-sshd`. If you wish to disable this automatic generation, add this line:
```ruby
diff --git a/doc/administration/operations/index.md b/doc/administration/operations/index.md
index 867ef3236ee..be90b0a073f 100644
--- a/doc/administration/operations/index.md
+++ b/doc/administration/operations/index.md
@@ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
Keep your GitLab instance up and running.
- [Housekeeping](../../administration/housekeeping.md)
-- [Activate GitLab EE with license](../../user/admin_area/license_file.md)
+- [Activate GitLab EE with license](../../administration/license_file.md)
- [Fast SSH key lookup](../../administration/operations/fast_ssh_key_lookup.md)
- [File system benchmarking](../../administration/operations/filesystem_benchmarking.md)
- [`gitlab-sshd`](../../administration/operations/gitlab_sshd.md)
@@ -17,7 +17,7 @@ Keep your GitLab instance up and running.
- [Use SSH certificates](../../administration/operations/ssh_certificates.md)
- [Enable encrypted configuration](../../administration/encrypted_configuration.md)
- [Rake tasks](../../raketasks/index.md)
-- [Backup and restore](../../raketasks/backup_restore.md)
+- [Backup and restore](../../administration/backup_restore/index.md)
- [Inactive project deletion](../../administration/inactive_project_deletion.md)
- [Move repositories](../../administration/operations/moving_repositories.md)
- [Read-only state](../../administration/read_only_gitlab.md)
diff --git a/doc/administration/operations/moving_repositories.md b/doc/administration/operations/moving_repositories.md
index e9d829f3f08..c27bedd39de 100644
--- a/doc/administration/operations/moving_repositories.md
+++ b/doc/administration/operations/moving_repositories.md
@@ -188,14 +188,14 @@ Each of the approaches we list can or does overwrite data in the target director
### Recommended approach in all cases
-For either Gitaly or Gitaly Cluster targets, the GitLab [backup and restore capability](../../raketasks/backup_restore.md)
+For either Gitaly or Gitaly Cluster targets, the GitLab [backup and restore capability](../../administration/backup_restore/index.md)
should be used. Git repositories are accessed, managed, and stored on GitLab servers by Gitaly as a database. Data loss
can result from directly accessing and copying Gitaly files using tools like `rsync`.
- From GitLab 13.3, backup performance can be improved by
- [processing multiple repositories concurrently](../../raketasks/backup_gitlab.md#back-up-git-repositories-concurrently).
+ [processing multiple repositories concurrently](../../administration/backup_restore/backup_gitlab.md#back-up-git-repositories-concurrently).
- Backups can be created of just the repositories using the
- [skip feature](../../raketasks/backup_gitlab.md#excluding-specific-directories-from-the-backup).
+ [skip feature](../../administration/backup_restore/backup_gitlab.md#excluding-specific-directories-from-the-backup).
No other method works for Gitaly Cluster targets.
diff --git a/doc/administration/operations/puma.md b/doc/administration/operations/puma.md
index d7d6f6228f9..f471dcd44b0 100644
--- a/doc/administration/operations/puma.md
+++ b/doc/administration/operations/puma.md
@@ -173,7 +173,7 @@ optimal configuration:
## Configuring Puma to listen over SSL
-Puma, when deployed with Omnibus GitLab, listens over a Unix socket by
+Puma, when deployed with a Linux package installation, listens over a Unix socket by
default. To configure Puma to listen over an HTTPS port instead, follow the
steps below:
@@ -283,7 +283,7 @@ For Helm-based deployments, see the
[`webservice` chart documentation](https://docs.gitlab.com/charts/charts/gitlab/webservice/index.html).
Starting with GitLab 13.0, Puma is the default web server and Unicorn has been disabled.
-In GitLab 14.0, [Unicorn was removed](../../update/removals.md#unicorn-in-gitlab-self-managed)
+In GitLab 14.0, [Unicorn was removed](https://docs.gitlab.com/omnibus/update/gitlab_14_changes.html)
from the Linux package and is no longer supported.
Puma has a multi-thread architecture that uses less memory than a multi-process
@@ -386,7 +386,7 @@ downtime. Otherwise, skip to the next section.
GDB reports an error if the Puma process terminates before you can run these commands.
To buy more time, you can always raise the
-Puma worker timeout. For omnibus users, you can edit `/etc/gitlab/gitlab.rb` and
+Puma worker timeout. For Linux package installation users, you can edit `/etc/gitlab/gitlab.rb` and
increase it from 60 seconds to 600:
```ruby
diff --git a/doc/administration/operations/rails_console.md b/doc/administration/operations/rails_console.md
index ac550d30566..ac0a7e5870b 100644
--- a/doc/administration/operations/rails_console.md
+++ b/doc/administration/operations/rails_console.md
@@ -25,28 +25,34 @@ Rails experience is useful but not required.
## Starting a Rails console session
-**For Omnibus installations**
+The process for starting a Rails console session depends on the type of GitLab installation.
+
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
```shell
sudo gitlab-rails console
```
-**For Docker installations**
+:::TabTitle Docker
```shell
docker exec -it <container-id> gitlab-rails console
```
-**For installations from source**
+:::TabTitle Self-compiled (source)
```shell
sudo -u git -H bundle exec rails console -e production
```
-**For Kubernetes deployments**
+:::TabTitle Helm chart (Kubernetes)
The console is in the toolbox pod. Refer to our [Kubernetes cheat sheet](https://docs.gitlab.com/charts/troubleshooting/kubernetes_cheat_sheet.html#gitlab-specific-kubernetes-information) for details.
+::EndTabs
+
To exit the console, type: `quit`.
## Enable Active Record logging
@@ -130,31 +136,31 @@ environment, you can do so using the [Rails Runner](https://guides.rubyonrails.o
When executing a script file, the script must be accessible by the `git` user.
When the command or script completes, the Rails Runner process finishes.
-It is useful for running within other scripts or cron jobs for example.
+It is useful for running in other scripts or cron jobs for example.
-**For Omnibus installations**
+- For Linux package installations:
-```shell
-sudo gitlab-rails runner "RAILS_COMMAND"
+ ```shell
+ sudo gitlab-rails runner "RAILS_COMMAND"
-# Example with a two-line Ruby script
-sudo gitlab-rails runner "user = User.first; puts user.username"
+ # Example with a two-line Ruby script
+ sudo gitlab-rails runner "user = User.first; puts user.username"
-# Example with a ruby script file (make sure to use the full path)
-sudo gitlab-rails runner /path/to/script.rb
-```
+ # Example with a ruby script file (make sure to use the full path)
+ sudo gitlab-rails runner /path/to/script.rb
+ ```
-**For installations from source**
+- For self-compiled installations:
-```shell
-sudo -u git -H bundle exec rails runner -e production "RAILS_COMMAND"
+ ```shell
+ sudo -u git -H bundle exec rails runner -e production "RAILS_COMMAND"
-# Example with a two-line Ruby script
-sudo -u git -H bundle exec rails runner -e production "user = User.first; puts user.username"
+ # Example with a two-line Ruby script
+ sudo -u git -H bundle exec rails runner -e production "user = User.first; puts user.username"
-# Example with a ruby script file (make sure to use the full path)
-sudo -u git -H bundle exec rails runner -e production /path/to/script.rb
-```
+ # Example with a ruby script file (make sure to use the full path)
+ sudo -u git -H bundle exec rails runner -e production /path/to/script.rb
+ ```
Rails Runner does not produce the same output as the console.
@@ -180,68 +186,6 @@ Some basic knowledge of Ruby is very useful. Try
[this 30-minute tutorial](https://try.ruby-lang.org/) for a quick introduction.
Rails experience is helpful but not essential.
-### Troubleshooting Rails Runner
-
-The `gitlab-rails` command executes Rails Runner using a non-root account and group, by default: `git:git`.
-
-If the non-root account cannot find the Ruby script filename passed to `gitlab-rails runner`
-you may get a syntax error, not an error that the file couldn't be accessed.
-
-A common reason for this is that the script has been put in the root account's home directory.
-
-`runner` tries to parse the path and file parameter as Ruby code.
-
-For example:
-
-```plaintext
-[root ~]# echo 'puts "hello world"' > ./helloworld.rb
-[root ~]# sudo gitlab-rails runner ./helloworld.rb
-Please specify a valid ruby command or the path of a script to run.
-Run 'rails runner -h' for help.
-
-/opt/gitlab/..../runner_command.rb:45: syntax error, unexpected '.'
-./helloworld.rb
-^
-[root ~]# sudo gitlab-rails runner /root/helloworld.rb
-Please specify a valid ruby command or the path of a script to run.
-Run 'rails runner -h' for help.
-
-/opt/gitlab/..../runner_command.rb:45: unknown regexp options - hllwrld
-[root ~]# mv ~/helloworld.rb /tmp
-[root ~]# sudo gitlab-rails runner /tmp/helloworld.rb
-hello world
-```
-
-A meaningful error should be generated if the directory can be accessed, but the file cannot:
-
-```plaintext
-[root ~]# chmod 400 /tmp/helloworld.rb
-[root ~]# sudo gitlab-rails runner /tmp/helloworld.rb
-Traceback (most recent call last):
- [traceback removed]
-/opt/gitlab/..../runner_command.rb:42:in `load': cannot load such file -- /tmp/helloworld.rb (LoadError)
-```
-
-In case you encounter a similar error to this:
-
-```plaintext
-[root ~]# sudo gitlab-rails runner helloworld.rb
-Please specify a valid ruby command or the path of a script to run.
-Run 'rails runner -h' for help.
-
-undefined local variable or method `helloworld' for main:Object
-```
-
-You can either move the file to the `/tmp` directory or create a new directory owned by the user `git` and save the script in that directory as illustrated below:
-
-```shell
-sudo mkdir /scripts
-sudo mv /script_path/helloworld.rb /scripts
-sudo chown -R git:git /scripts
-sudo chmod 700 /scripts
-sudo gitlab-rails runner /scripts/helloworld.rb
-```
-
## Find specific methods for an object
```ruby
@@ -264,7 +208,7 @@ Adding a semicolon(`;`) and a follow-up statement at the end of a statement prev
```ruby
puts ActiveRecord::Base.descendants; :ok
-Project.select(&:pages_deployed?).each {|p| puts p.pages_url }; true
+Project.select(&:pages_deployed?).each {|p| puts p.path }; true
```
## Get or store the result of last operation
@@ -756,3 +700,84 @@ project.irb
irb(#<Project>)> web_url
# => "https://gitlab-example/root/discard"
```
+
+## Troubleshooting
+
+### Rails Runner `syntax error`
+
+The `gitlab-rails` command executes Rails Runner using a non-root account and group, by default: `git:git`.
+
+If the non-root account cannot find the Ruby script filename passed to `gitlab-rails runner`
+you may get a syntax error, not an error that the file couldn't be accessed.
+
+A common reason for this is that the script has been put in the root account's home directory.
+
+`runner` tries to parse the path and file parameter as Ruby code.
+
+For example:
+
+```plaintext
+[root ~]# echo 'puts "hello world"' > ./helloworld.rb
+[root ~]# sudo gitlab-rails runner ./helloworld.rb
+Please specify a valid ruby command or the path of a script to run.
+Run 'rails runner -h' for help.
+
+/opt/gitlab/..../runner_command.rb:45: syntax error, unexpected '.'
+./helloworld.rb
+^
+[root ~]# sudo gitlab-rails runner /root/helloworld.rb
+Please specify a valid ruby command or the path of a script to run.
+Run 'rails runner -h' for help.
+
+/opt/gitlab/..../runner_command.rb:45: unknown regexp options - hllwrld
+[root ~]# mv ~/helloworld.rb /tmp
+[root ~]# sudo gitlab-rails runner /tmp/helloworld.rb
+hello world
+```
+
+A meaningful error should be generated if the directory can be accessed, but the file cannot:
+
+```plaintext
+[root ~]# chmod 400 /tmp/helloworld.rb
+[root ~]# sudo gitlab-rails runner /tmp/helloworld.rb
+Traceback (most recent call last):
+ [traceback removed]
+/opt/gitlab/..../runner_command.rb:42:in `load': cannot load such file -- /tmp/helloworld.rb (LoadError)
+```
+
+In case you encounter a similar error to this:
+
+```plaintext
+[root ~]# sudo gitlab-rails runner helloworld.rb
+Please specify a valid ruby command or the path of a script to run.
+Run 'rails runner -h' for help.
+
+undefined local variable or method `helloworld' for main:Object
+```
+
+You can either move the file to the `/tmp` directory or create a new directory owned by the user `git` and save the script in that directory as illustrated below:
+
+```shell
+sudo mkdir /scripts
+sudo mv /script_path/helloworld.rb /scripts
+sudo chown -R git:git /scripts
+sudo chmod 700 /scripts
+sudo gitlab-rails runner /scripts/helloworld.rb
+```
+
+### Filtered console output
+
+Some output in the console might be filtered by default to prevent leaks of certain values
+like variables, logs, or secrets. This output displays as `[FILTERED]`. For example:
+
+```plain_text
+> Plan.default.actual_limits
+=> ci_instance_level_variables: "[FILTERED]",
+```
+
+To work around the filtering, read the values directly from the object. For example:
+
+```plain_text
+> Plan.default.limits.ci_instance_level_variables
+=> 25
+```
diff --git a/doc/administration/package_information/defaults.md b/doc/administration/package_information/defaults.md
index ac183afdc2f..f85ada3c782 100644
--- a/doc/administration/package_information/defaults.md
+++ b/doc/administration/package_information/defaults.md
@@ -11,8 +11,7 @@ the package assumes the defaults as noted below.
## Ports
-See the table below for the list of ports that the Omnibus GitLab assigns
-by default:
+See the table below for the list of ports that the Linux package assigns by default:
| Component | On by default | Communicates via | Alternative | Connection port |
|:--------------------:|:-------------:|:----------------:|:-----------:|:------------------------------------------:|
@@ -47,7 +46,7 @@ by default:
| Mattermost | No | Port | X | 8065 |
| Mattermost | No | Port | X | 80 or 443 |
| PgBouncer | No | Port | X | 6432 |
-| Consul | No | Port | X | 8300, 8301(UDP), 8500, 8600[^Consul-notes] |
+| Consul | No | Port | X | 8300, 8301(TCP and UDP), 8500, 8600[^Consul-notes] |
| Patroni | No | Port | X | 8008 |
| GitLab KAS | Yes | Port | X | 8150 |
| Gitaly | Yes | Socket | Port (8075) | 8075 or 9999 (TLS) |
diff --git a/doc/administration/package_information/deprecation_policy.md b/doc/administration/package_information/deprecation_policy.md
index d8f4551ca09..f2d23da2b7e 100644
--- a/doc/administration/package_information/deprecation_policy.md
+++ b/doc/administration/package_information/deprecation_policy.md
@@ -4,9 +4,9 @@ group: Distribution
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
-# Omnibus GitLab deprecation policy **(FREE SELF)**
+# Linux package deprecation policy **(FREE SELF)**
-The Omnibus GitLab packages come with number of different libraries and services which offers users plethora of configuration options.
+The Linux packages come with number of different libraries and services which offers users plethora of configuration options.
As libraries and services get updated, their configuration options change
and become obsolete. To increase maintainability and preserve a working
@@ -16,7 +16,7 @@ setup, various configuration requires removal.
### Policy
-The Omnibus GitLab package retains configuration for at least **one major**
+The Linux package retains configuration for at least **one major**
version. We can't guarantee that deprecated configuration
is available in the next major release. See [example](#example) for more details.
@@ -49,7 +49,8 @@ Deprecation procedure is similar for both `sensitive` and `regular` configuratio
Common steps:
-1. Create an issue at the [Omnibus GitLab issue tracker](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues) with details on deprecation type and other necessary information. Apply the label `deprecation`.
+1. Create an issue at the [`omnibus-gitlab` issue tracker](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues) with
+ details on deprecation type and other necessary information. Apply the label `deprecation`.
1. Decide on the removal target for the deprecated configuration
1. Formulate deprecation notice for each item as noted in [Notice section](#notice)
diff --git a/doc/administration/package_information/index.md b/doc/administration/package_information/index.md
index bfa751a051f..503fdfe3ba8 100644
--- a/doc/administration/package_information/index.md
+++ b/doc/administration/package_information/index.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Package information **(FREE SELF)**
-The Omnibus GitLab package is bundled with all dependencies required for GitLab
+The Linux package is bundled with all dependencies required for GitLab
to function correctly. More details can be found
at [bundling dependencies document](omnibus_packages.md).
@@ -14,11 +14,11 @@ at [bundling dependencies document](omnibus_packages.md).
The released package versions are in the format `MAJOR.MINOR.PATCH-EDITION.OMNIBUS_RELEASE`
-| Component | Meaning | Example |
-|---------------------|---------|---------|
-| `MAJOR.MINOR.PATCH` | The GitLab version this corresponds to. | `13.3.0` |
-| `EDITION` | The edition of GitLab this corresponds to. | `ee` |
-| `OMNIBUS_RELEASE` | The Omnibus GitLab release. Usually, this is 0. This is incremented if we need to build a new package without changing the GitLab version. | `0` |
+| Component | Meaning | Example |
+|:--------------------|:------------------------------------------------------------------------------------------------------------------------------------------|:---------|
+| `MAJOR.MINOR.PATCH` | The GitLab version this corresponds to. | `13.3.0` |
+| `EDITION` | The edition of GitLab this corresponds to. | `ee` |
+| `OMNIBUS_RELEASE` | The Linux package release. Usually, this is `0`. We increment this if we need to build a new package without changing the GitLab version. | `0` |
## Licenses
@@ -26,7 +26,7 @@ See [licensing](licensing.md)
## Defaults
-The Omnibus GitLab package requires various configuration to get the components
+The Linux package requires various configuration to get the components
in working order. If the configuration is not provided, the package uses
the default values assumed in the package.
@@ -34,10 +34,10 @@ These defaults are noted in the package [defaults document](defaults.md).
## Checking the versions of bundled software
-After the Omnibus GitLab package is installed, you can find the version of
+After the Linux package is installed, you can find the version of
GitLab and all bundled libraries in `/opt/gitlab/version-manifest.txt`.
-If you don't have the package installed, you can always check the Omnibus GitLab
+If you don't have the package installed, you can always check the Linux package
[source repository](https://gitlab.com/gitlab-org/omnibus-gitlab/tree/master), specifically the
[configuration directory](https://gitlab.com/gitlab-org/omnibus-gitlab/tree/master/config).
@@ -51,15 +51,14 @@ Documentation on package signatures can be found at [Signed Packages](signed_pac
## Checking for newer configuration options on upgrade
-Configuration file in `/etc/gitlab/gitlab.rb` is created on initial installation
-of the Omnibus GitLab package. On subsequent package upgrades, the configuration
-file is not updated with new configuration. This is done to avoid
-accidental overwrite of user configuration provided in `/etc/gitlab/gitlab.rb`.
+The `/etc/gitlab/gitlab.rb` configuration file is created when the Linux package is initially installed.
+To avoid accidental overwrites of user configuration, the `/etc/gitlab/gitlab.rb` configuration file is not updated
+with new configuration when the Linux package installation is upgraded.
New configuration options are noted in the
[`gitlab.rb.template` file](https://gitlab.com/gitlab-org/omnibus-gitlab/raw/master/files/gitlab-config-template/gitlab.rb.template).
-The Omnibus GitLab package also provides convenience command which
+The Linux package also provides a convenience command which
compares the existing user configuration with the latest version of the
template contained in the package.
@@ -76,7 +75,7 @@ characters on each line.
## Init system detection
-Omnibus GitLab attempts to query the underlying system to
+The Linux package attempts to query the underlying system to
check which init system it uses.
This manifests itself as a `WARNING` during the `sudo gitlab-ctl reconfigure`
run.
diff --git a/doc/administration/package_information/licensing.md b/doc/administration/package_information/licensing.md
index bbc0e864e95..cad9c0e6075 100644
--- a/doc/administration/package_information/licensing.md
+++ b/doc/administration/package_information/licensing.md
@@ -8,12 +8,12 @@ info: To determine the technical writer assigned to the Stage/Group associated w
## License
-While GitLab itself is MIT, the Omnibus GitLab sources are licensed under the Apache-2.0.
+While GitLab itself is MIT, the Linux package sources are licensed under the Apache-2.0.
## License file location
-Starting with version 8.11, the Omnibus GitLab package contains license
-information of all software that is bundled within the package.
+Starting with version 8.11, the Linux package contains license
+information of all software that is bundled in the package.
After installing the package, licenses for each individual bundled library
can be found in `/opt/gitlab/LICENSES` directory.
@@ -21,11 +21,11 @@ can be found in `/opt/gitlab/LICENSES` directory.
There is also one `LICENSE` file which contains all licenses compiled together.
This compiled license can be found in `/opt/gitlab/LICENSE` file.
-Starting with version 9.2, the Omnibus GitLab package ships a
+Starting with version 9.2, the Linux package ships with a
`dependency_licenses.json` file containing version and license information of
all bundled software, including software libraries, Ruby gems that the rails
application uses, and JavaScript libraries that is required for the frontend
-components. Because it's in JSON format, GitLab can parse this file easily and use it for automated checks or validations. The file may be found at
+components. Because it's in JSON format, GitLab can parse this file and use it for automated checks or validations. The file may be found at
`/opt/gitlab/dependency_licenses.json`.
Starting with version 11.3, we have also made the license information available
@@ -33,28 +33,28 @@ online, at: <https://gitlab-org.gitlab.io/omnibus-gitlab/licenses.html>
## Checking licenses
-The Omnibus GitLab package is made up of many pieces of software, comprising code
+The Linux package is made up of many pieces of software, comprising code
that is covered by many different licenses. Those licenses are provided and
compiled as stated above.
Starting with version 8.13, GitLab has placed an additional step into
-Omnibus GitLab. The `license_check` step calls
+Linux package installation. The `license_check` step calls
`lib/gitlab/tasks/license_check.rake`, which checks the compiled `LICENSE` file
against the current list of approved and questionable licenses as denoted in the
arrays at the top of the script. This script outputs one of `Good`,
`Unknown` or `Check` for each piece of software that is a part of the
-Omnibus GitLab package.
+Linux package.
-- `Good`: denotes a license that is approved for all usage types, within GitLab and
- Omnibus GitLab.
+- `Good`: denotes a license that is approved for all usage types, in GitLab and
+ the Linux package.
- `Unknown`: denotes a license that is not recognized in the list of 'good' or 'bad',
which should be immediately reviewed for implications of use.
- `Check`: denotes a license that has the potential be incompatible with GitLab itself,
- and thus should be checked for how it is used as a part of the Omnibus GitLab package
+ and thus should be checked for how it is used as a part of the Linux package
to ensure compliance.
-This list is currently sourced from the [GitLab development documentation on licensing](https://gitlab.com/gitlab-org/gitlab-foss/blob/master/doc/development/licensing.md).
-However, due to the nature of the Omnibus GitLab package the licenses may not apply
+This list is sourced from the [GitLab development documentation on licensing](https://gitlab.com/gitlab-org/gitlab-foss/blob/master/doc/development/licensing.md).
+However, due to the nature of the Linux package, the licenses may not apply
in the same way. Such as with `git` and `rsync`. See the [GNU License FAQ](https://www.gnu.org/licenses/gpl-faq.en.html#MereAggregation)
## License acknowledgements
diff --git a/doc/administration/package_information/omnibus_packages.md b/doc/administration/package_information/omnibus_packages.md
index 222341c7308..d16783034dc 100644
--- a/doc/administration/package_information/omnibus_packages.md
+++ b/doc/administration/package_information/omnibus_packages.md
@@ -4,7 +4,7 @@ group: Distribution
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
-# Omnibus based packages and images **(FREE SELF)**
+# Packages and images from the Linux package **(FREE SELF)**
Below you can find some basic information on why GitLab provides packages and
a Docker image that come with bundled dependencies.
@@ -19,7 +19,7 @@ We have a few core goals with these packages:
1. Support for a wide variety of operating systems
1. Wide support of cloud service providers
-## Omnibus GitLab Architecture
+## Linux package architecture
GitLab in its core is a Ruby on Rails project. However, GitLab as a whole
application is more complex and has multiple components. If these components are
@@ -72,7 +72,7 @@ Some drawbacks of a package with bundled dependencies:
1. Duplication with possibly existing software.
1. Less flexibility in configuration.
-## Why would you install an omnibus package when you can use a system package?
+## Why would you install a package from the Linux package when you can use a system package?
The answer can be simplified to: less maintenance required. Instead of handling
multiple packages that *can* break existing functionality if the versions are
@@ -83,23 +83,24 @@ Keeping configuration in sync can be error prone.
If you have the skill set to maintain all current dependencies and enough time
to handle any future dependencies that might get introduced, the above listed
-reasons might not be good enough for you to not use the omnibus package.
+reasons might not be good enough for you to not use a package from the Linux package.
There are two things to keep in mind before going down this route:
1. Getting support for any problems
you encounter might be more difficult due to the number of possibilities that exist
when using a library version that is not tested by majority of users.
-1. Omnibus package also allows shutting off of any services that you do not need,
+1. Packages from the Linux package also allow shutting off of any services that you do not need,
if you need to run a component independently. For example, you can use a
- [non-bundled PostgreSQL database](https://docs.gitlab.com/omnibus/settings/database.html#using-a-non-packaged-postgresql-database-management-server) with the omnibus package.
+ [non-bundled PostgreSQL database](https://docs.gitlab.com/omnibus/settings/database.html#using-a-non-packaged-postgresql-database-management-server)
+ with a Linux package installation.
-Keep in mind that a non-standard solution like the omnibus package
+Keep in mind that a non-standard solution like the Linux package
might be a better fit when the application has a number of moving parts.
## Docker image with multiple services
-[GitLab Docker image](../../install/docker.md#gitlab-docker-images) is based on the omnibus package.
+[GitLab Docker image](../../install/docker.md#gitlab-docker-images) is based on the Linux package.
Considering that container spawned from this image contains multiple processes,
these types of containers are also referred to as 'fat containers'.
diff --git a/doc/administration/package_information/postgresql_versions.md b/doc/administration/package_information/postgresql_versions.md
index 44032883eb4..101e1549d19 100644
--- a/doc/administration/package_information/postgresql_versions.md
+++ b/doc/administration/package_information/postgresql_versions.md
@@ -4,23 +4,24 @@ group: Distribution
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
-# PostgreSQL versions shipped with Omnibus GitLab **(FREE SELF)**
+# PostgreSQL versions shipped with the Linux package **(FREE SELF)**
NOTE:
This table lists only GitLab versions where a significant change happened in the
package regarding PostgreSQL versions, not all.
Usually, PostgreSQL versions change with major or minor GitLab releases. However, patch versions
-of Omnibus GitLab sometimes update the patch level of PostgreSQL. We've established a
+of the Linux package sometimes update the patch level of PostgreSQL. We've established a
[yearly cadence for PostgreSQL upgrades](https://about.gitlab.com/handbook/engineering/development/enablement/data_stores/database/postgresql-upgrade-cadence.html)
and trigger automatic database upgrades in the release before the new version is required.
For example:
-- Omnibus 12.7.6 shipped with PostgreSQL 9.6.14 and 10.9.
-- Omnibus 12.7.7 shipped with PostgreSQL 9.6.17 and 10.12.
+- Linux package 12.7.6 shipped with PostgreSQL 9.6.14 and 10.9.
+- Linux package 12.7.7 shipped with PostgreSQL 9.6.17 and 10.12.
-[Find out which versions of PostgreSQL (and other components) ship with each Omnibus GitLab release](https://gitlab-org.gitlab.io/omnibus-gitlab/licenses.html).
+Find out [which versions of PostgreSQL (and other components) ship](https://gitlab-org.gitlab.io/omnibus-gitlab/licenses.html)
+with each Linux package release.
The lowest supported PostgreSQL versions are listed in the
[installation requirements](../../install/requirements.md#postgresql-requirements).
@@ -29,13 +30,16 @@ Read more about update policies and warnings in the PostgreSQL
[upgrade docs](https://docs.gitlab.com/omnibus/settings/database.html#upgrade-packaged-postgresql-server).
| GitLab version | PostgreSQL versions | Default version for fresh installs | Default version for upgrades | Notes |
-| -------------- | --------------------- | ---------------------------------- | ---------------------------- | ----- |
-| 16.0 | 13.11 | 13.11 | 13.11 | |
+| -------------- | ------------------- | ---------------------------------- | ---------------------------- | ----- |
+| 16.0.2 | 13.11 | 13.11 | 13.11 | |
+| 16.0.0 | 13.8 | 13.8 | 13.8 | |
+| 15.11.7 | 13.11 | 13.11 | 12.12 | |
+| 15.10.8 | 13.11 | 13.11 | 12.12 | |
| 15.6 | 12.12, 13.8 | 13.8 | 12.12 | For upgrades, users can manually upgrade to 13.8 following the [upgrade documentation](https://docs.gitlab.com/omnibus/settings/database.html#gitlab-150-and-later). |
| 15.0 | 12.10, 13.6 | 13.6 | 12.10 | For upgrades, users can manually upgrade to 13.6 following the [upgrade documentation](https://docs.gitlab.com/omnibus/settings/database.html#gitlab-150-and-later). |
-| 14.1 | 12.7, 13.3 | 12.7 | 12.7 | PostgreSQL 13 available for fresh installations if not using [Geo](../geo/index.md#requirements-for-running-geo) or [Patroni](../postgresql/index.md#postgresql-replication-and-failover-with-omnibus-gitlab).
-| 14.0 | 12.7 | 12.7 | 12.7 | HA installations with repmgr are no longer supported and are prevented from upgrading to Omnibus GitLab 14.0 |
-| 13.8 | 11.9, 12.4 | 12.4 | 12.4 | Package upgrades automatically performed PostgreSQL upgrade for nodes that are not part of a Geo or HA cluster.). |
+| 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-for-linux-package-installations).
+| 14.0 | 12.7 | 12.7 | 12.7 | HA installations with repmgr are no longer supported and are prevented from upgrading to Linux package 14.0 |
+| 13.8 | 11.9, 12.4 | 12.4 | 12.4 | Package upgrades automatically performed PostgreSQL upgrade for nodes that are not part of a Geo or HA cluster. |
| 13.7 | 11.9, 12.4 | 12.4 | 11.9 | For upgrades users can manually upgrade to 12.4 following the [upgrade documentation](https://docs.gitlab.com/omnibus/settings/database.html#gitlab-133-and-later). |
| 13.4 | 11.9, 12.4 | 11.9 | 11.9 | Package upgrades aborted if users not running PostgreSQL 11 already |
| 13.3 | 11.7, 12.3 | 11.7 | 11.7 | Package upgrades aborted if users not running PostgreSQL 11 already |
diff --git a/doc/administration/package_information/signed_packages.md b/doc/administration/package_information/signed_packages.md
index 638dd7820b8..b2aab96e52c 100644
--- a/doc/administration/package_information/signed_packages.md
+++ b/doc/administration/package_information/signed_packages.md
@@ -6,13 +6,22 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Package Signatures **(FREE SELF)**
-Omnibus GitLab packages produced by GitLab are created via the [Omnibus](https://github.com/chef/omnibus) tool, for which GitLab has added DEB signing via `debsigs` in [our own fork](https://gitlab.com/gitlab-org/omnibus). This addition, combined with the existing functionality of RPM signing, allows GitLab to provide signed packages for all supported distributions using DEB or RPM.
+Linux packages produced by GitLab are created using [Omnibus](https://github.com/chef/omnibus), for which GitLab
+has added DEB signing using `debsigs` in [our own fork](https://gitlab.com/gitlab-org/omnibus).
-These packages are produced by the GitLab CI process, as found in the [Omnibus GitLab project](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/.gitlab-ci.yml), prior to their delivery to <https://packages.gitlab.com> to ensure provide assurance that the packages are not altered prior to delivery to our community.
+Combined with the existing functionality of RPM signing, this addition allows GitLab to provide signed packages for all
+supported distributions using DEB or RPM.
+
+These packages are produced by the GitLab CI process, as found in the
+[`omnibus-gitlab` project](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/.gitlab-ci.yml),
+prior to their delivery to <https://packages.gitlab.com> to provide assurance that the packages are not altered prior
+to delivery to our community.
## 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 [MIT PGP Public Key Server](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/package_information/supported_os.md b/doc/administration/package_information/supported_os.md
index 8ad3a656e05..16f4c2cdeab 100644
--- a/doc/administration/package_information/supported_os.md
+++ b/doc/administration/package_information/supported_os.md
@@ -83,7 +83,7 @@ running GitLab on ARM.
## OS Versions that are no longer supported
-GitLab provides omnibus packages for operating systems only until their
+GitLab provides Linux packages for operating systems only until their
EOL (End-Of-Life). After the EOL date of the OS, GitLab stops releasing
official packages. The list of deprecated operating systems and the final GitLab
release for them can be found below:
diff --git a/doc/administration/packages/container_registry.md b/doc/administration/packages/container_registry.md
index e3867a25846..007072647a2 100644
--- a/doc/administration/packages/container_registry.md
+++ b/doc/administration/packages/container_registry.md
@@ -16,9 +16,11 @@ Registry, see the [user documentation](../../user/packages/container_registry/in
## Enable the Container Registry
-**Omnibus GitLab installations**
+The process for enabling the Container Registry depends on the type of installation you use.
-If you installed GitLab by using the Omnibus installation package, the Container Registry
+### Linux package installations
+
+If you installed GitLab by using the Linux package, the Container Registry
may or may not be available by default.
The Container Registry is automatically enabled and available on your GitLab domain, port 5050 if
@@ -34,9 +36,9 @@ but it's not recommended and is beyond the scope of this document.
Read the [insecure Registry documentation](https://docs.docker.com/registry/insecure/)
if you want to implement this.
-**Installations from source**
+### Self-compiled installations
-If you have installed GitLab from source:
+If you self-compiled your GitLab installation:
1. You must [deploy a registry](https://docs.docker.com/registry/deploying/) using the image corresponding to the
version of GitLab you are installing
@@ -115,8 +117,8 @@ certificate.
If the GitLab domain is `https://gitlab.example.com` and the port to the outside world is `5050`,
to configure the Container Registry:
-- Edit `gitlab.rb` if you are using Omnibus GitLab.
-- Edit `gitlab.yml` if you installed GitLab from source.
+- Edit `gitlab.rb` if you are using a Linux package installation.
+- Edit `gitlab.yml` if you are using a self-compiled installation.
Ensure you choose a port different than the one that Registry listens to (`5000` by default),
otherwise conflicts occur.
@@ -126,7 +128,9 @@ Host and container firewall rules must be configured to allow traffic in through
under the `registry_external_url` line, rather than the port listed under
`gitlab_rails['registry_port']` (default `5000`).
-**Omnibus GitLab installations**
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
1. Your `/etc/gitlab/gitlab.rb` should contain the Registry URL as well as the
path to the existing TLS certificate and key used by GitLab:
@@ -171,7 +175,7 @@ registry_nginx['redirect_http_to_https'] = true
registry_nginx['listen_port'] = 5678
```
-**Installations from source**
+:::TabTitle Self-compiled (source)
1. Open `/home/git/gitlab/config/gitlab.yml`, find the `registry` entry and
configure it with the following settings:
@@ -186,6 +190,8 @@ registry_nginx['listen_port'] = 5678
1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source) for the changes to take effect.
1. Make the relevant changes in NGINX as well (domain, port, TLS certificates path).
+::EndTabs
+
Users should now be able to sign in to the Container Registry with their GitLab
credentials using:
@@ -202,12 +208,14 @@ domain. For example, `*.gitlab.example.com`, is a wildcard that matches `registr
and is distinct from `*.example.com`.
As well as manually generated SSL certificates (explained here), certificates automatically
-generated by Let's Encrypt are also [supported in Omnibus installs](https://docs.gitlab.com/omnibus/settings/ssl/index.html).
+generated by Let's Encrypt are also [supported in Linux package installations](https://docs.gitlab.com/omnibus/settings/ssl/index.html).
Let's assume that you want the container Registry to be accessible at
`https://registry.gitlab.example.com`.
-**Omnibus GitLab installations**
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
1. Place your TLS certificate and key in
`/etc/gitlab/ssl/registry.gitlab.example.com.crt` and
@@ -237,7 +245,7 @@ registry_nginx['ssl_certificate'] = "/etc/gitlab/ssl/certificate.pem"
registry_nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/certificate.key"
```
-**Installations from source**
+:::TabTitle Self-compiled (source)
1. Open `/home/git/gitlab/config/gitlab.yml`, find the `registry` entry and
configure it with the following settings:
@@ -251,6 +259,8 @@ registry_nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/certificate.key"
1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source) for the changes to take effect.
1. Make the relevant changes in NGINX as well (domain, port, TLS certificates path).
+::EndTabs
+
Users should now be able to sign in to the Container Registry using their GitLab
credentials:
@@ -264,7 +274,9 @@ When you disable the Registry by following these steps, you do not
remove any existing Docker images. Docker image removal is handled by the
Registry application itself.
-**Omnibus GitLab**
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
1. Open `/etc/gitlab/gitlab.rb` and set `registry['enable']` to `false`:
@@ -274,7 +286,7 @@ Registry application itself.
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-package-installation) for the changes to take effect.
-**Installations from source**
+:::TabTitle Self-compiled (source)
1. Open `/home/git/gitlab/config/gitlab.yml`, find the `registry` entry and
set `enabled` to `false`:
@@ -286,13 +298,17 @@ Registry application itself.
1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source) for the changes to take effect.
+::EndTabs
+
## Disable Container Registry for new projects site-wide
If the Container Registry is enabled, then it should be available on all new
projects. To disable this function and let the owners of a project to enable
the Container Registry by themselves, follow the steps below.
-**Omnibus GitLab installations**
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
1. Edit `/etc/gitlab/gitlab.rb` and add the following line:
@@ -302,7 +318,7 @@ the Container Registry by themselves, follow the steps below.
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-package-installation) for the changes to take effect.
-**Installations from source**
+:::TabTitle Self-compiled (source)
1. Open `/home/git/gitlab/config/gitlab.yml`, find the `default_projects_features`
entry and configure it so that `container_registry` is set to `false`:
@@ -320,6 +336,8 @@ the Container Registry by themselves, follow the steps below.
1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source) for the changes to take effect.
+::EndTabs
+
### Increase token duration
In GitLab, tokens for the Container Registry expire every five minutes.
@@ -381,9 +399,11 @@ This path is accessible to:
All GitLab, Registry, and web server users must
have access to this directory.
-**Omnibus GitLab installations**
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
-The default location where images are stored in Omnibus, is
+The default location where images are stored in Linux package installations is
`/var/opt/gitlab/gitlab-rails/shared/registry`. To change it:
1. Edit `/etc/gitlab/gitlab.rb`:
@@ -394,9 +414,9 @@ The default location where images are stored in Omnibus, is
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-package-installation) for the changes to take effect.
-**Installations from source**
+:::TabTitle Self-compiled (source)
-The default location where images are stored in source installations, is
+The default location where images are stored in self-compiled installations is
`/home/git/gitlab/shared/registry`. To change it:
1. Open `/home/git/gitlab/config/gitlab.yml`, find the `registry` entry and
@@ -409,6 +429,8 @@ The default location where images are stored in source installations, is
1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source) for the changes to take effect.
+::EndTabs
+
### Use object storage
If you want to store your images on object storage, you can change the storage
@@ -421,9 +443,9 @@ GitLab does not back up Docker images that are not stored on the
file system. Enable backups with your object storage provider if
desired.
-**Omnibus GitLab installations**
+#### Linux package installations
-To configure the `s3` storage driver in Omnibus:
+To configure the `s3` storage driver for a Linux package installation:
1. Edit `/etc/gitlab/gitlab.rb`:
@@ -493,7 +515,7 @@ To configure the `s3` storage driver in Omnibus:
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-package-installation) for the changes to take effect.
-**Installations from source**
+#### Self-compiled installations
Configuring the storage driver is done in the registry configuration YAML file created
when you [deployed your Docker registry](https://docs.docker.com/registry/deploying/).
@@ -602,7 +624,9 @@ When moving from an existing file system or another object storage provider to A
Configure it by setting [`trimlegacyrootprefix: true`](https://gitlab.com/gitlab-org/container-registry/-/blob/a3f64464c3ec1c5a599c0a2daa99ebcbc0100b9a/docs-gitlab/README.md#azure-storage-driver) in the Azure storage driver section of the registry configuration.
Without this configuration, the Azure storage driver uses `//` instead of `/` as the first section of the root path, rendering the migrated images inaccessible.
-**Omnibus GitLab installations**
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
```ruby
registry['storage'] = {
@@ -616,7 +640,7 @@ registry['storage'] = {
}
```
-**Installations from source**
+:::TabTitle Self-compiled (source)
```yaml
storage:
@@ -628,6 +652,8 @@ storage:
trimlegacyrootprefix: true
```
+::EndTabs
+
By default, Azure Storage Driver uses the `core.windows.net` realm. You can set another value for `realm` in the `azure` section (for example, `core.usgovcloudapi.net` for Azure Government Cloud). For more information, see the [Docker documentation](https://docs.docker.com/registry/storage-drivers/azure/).
### Disable redirect for storage driver
@@ -636,7 +662,9 @@ By default, users accessing a registry configured with a remote backend are redi
However, this behavior is undesirable for registries used by internal hosts that usually can't access public servers. To disable redirects and [proxy download](../object_storage.md#proxy-download), set the `disable` flag to true as follows. This makes all traffic always go through the Registry service. This results in improved security (less surface attack as the storage backend is not publicly accessible), but worse performance (all traffic is redirected via the service).
-**Omnibus GitLab installations**
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
1. Edit `/etc/gitlab/gitlab.rb`:
@@ -657,7 +685,7 @@ However, this behavior is undesirable for registries used by internal hosts that
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-package-installation) for the changes to take effect.
-**Installations from source**
+:::TabTitle Self-compiled (source)
1. Add the `redirect` flag to your registry configuration YAML file:
@@ -679,6 +707,8 @@ However, this behavior is undesirable for registries used by internal hosts that
1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source) for the changes to take effect.
+::EndTabs
+
#### Encrypted S3 buckets
You can use server-side encryption with AWS KMS for S3 buckets that have
@@ -689,7 +719,9 @@ encryption keys in every request.
For SSE-S3, you must enable the `encrypt` option in the registry settings. How you do this depends
on how you installed GitLab. Follow the instructions here that match your installation method.
-For Omnibus GitLab installations:
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
1. Edit `/etc/gitlab/gitlab.rb`:
@@ -709,7 +741,7 @@ For Omnibus GitLab installations:
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-package-installation)
for the changes to take effect.
-For installations from source:
+:::TabTitle Self-compiled (source)
1. Edit your registry configuration YAML file:
@@ -727,6 +759,8 @@ For installations from source:
1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source)
for the changes to take effect.
+::EndTabs
+
### Storage limitations
There is no storage limitation, which means a user can upload an
@@ -739,7 +773,9 @@ The Registry server listens on localhost at port `5000` by default,
which is the address for which the Registry server should accept connections.
In the examples below we set the Registry's port to `5010`.
-**Omnibus GitLab**
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
1. Open `/etc/gitlab/gitlab.rb` and set `registry['registry_http_addr']`:
@@ -749,7 +785,7 @@ In the examples below we set the Registry's port to `5010`.
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-package-installation) for the changes to take effect.
-**Installations from source**
+:::TabTitle Self-compiled (source)
1. Open the configuration file of your Registry server and edit the
[`http:addr`](https://docs.docker.com/registry/configuration/#http) value:
@@ -761,6 +797,8 @@ In the examples below we set the Registry's port to `5010`.
1. Save the file and restart the Registry server.
+::EndTabs
+
## Disable Container Registry per project
If Registry is enabled in your GitLab instance, but you don't need it for your
@@ -799,7 +837,7 @@ under the project hierarchy, like
`registry.example.com/group/project/my/image-name:tag`, and only recognizes
`registry.example.com/group/project:tag`.
-**Omnibus GitLab**
+### Linux package installations
You can use GitLab as an auth endpoint with an external container registry.
@@ -832,14 +870,14 @@ You can use GitLab as an auth endpoint with an external container registry.
# Example:
registry['internal_key'] = "---BEGIN RSA PRIVATE KEY---\nMIIEpQIBAA\n"
- # Optionally define a custom file for Omnibus GitLab to write the contents
+ # Optionally define a custom file for a Linux package installation to write the contents
# of registry['internal_key'] to.
gitlab_rails['registry_key_path'] = "/custom/path/to/registry-key.key"
```
Each time reconfigure is executed, the file specified at `registry_key_path`
gets populated with the content specified by `internal_key`. If
- no file is specified, Omnibus GitLab defaults it to
+ no file is specified, Linux package installations default it to
`/var/opt/gitlab/gitlab-rails/etc/gitlab-registry.key` and populates
it.
@@ -854,7 +892,7 @@ You can use GitLab as an auth endpoint with an external container registry.
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-package-installation)
for the changes to take effect.
-**Installations from source**
+### Self-compiled installations
1. Open `/home/git/gitlab/config/gitlab.yml`, and edit the configuration settings under `registry`:
@@ -885,9 +923,11 @@ Read more about the Container Registry notifications configuration options in th
You can configure multiple endpoints for the Container Registry.
-**Omnibus GitLab installations**
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
-To configure a notification endpoint in Omnibus:
+To configure a notification endpoint for a Linux package installation:
1. Edit `/etc/gitlab/gitlab.rb`:
@@ -908,7 +948,7 @@ To configure a notification endpoint in Omnibus:
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-package-installation) for the changes to take effect.
-**Installations from source**
+:::TabTitle Self-compiled (source)
Configuring the notification endpoint is done in your registry configuration YAML file created
when you [deployed your Docker registry](https://docs.docker.com/registry/deploying/).
@@ -927,6 +967,8 @@ notifications:
backoff: 1000
```
+::EndTabs
+
## Run the Cleanup policy now
WARNING:
@@ -1007,28 +1049,27 @@ NOTE:
Retention policies in your object storage provider, such as Amazon S3 Lifecycle, may prevent
objects from being properly deleted.
-Container Registry can use considerable amounts of disk space. To clear up
-some unused layers, the registry includes a garbage collect command.
+The container registry can use considerable amounts of storage space, and you might want to
+[reduce storage usage](../../user/packages/container_registry/reduce_container_registry_storage.md).
+Among the listed options, deleting tags is the most effective option. However, tag deletion
+alone does not delete image layers, it only leaves the underlying image manifests untagged.
+
+To more effectively free up space, the Container Registry has a garbage collector that can
+delete unreferenced layers and (optionally) untagged manifests.
-GitLab offers a set of APIs to manipulate the Container Registry and aid the process
-of removing unused tags. Currently, this is exposed using the API, but in the future,
-these controls should migrate to the GitLab interface.
+To start the garbage collector, use the `registry-garbage-collect` command provided by `gitlab-ctl`.
-Users who have the [Maintainer role](../../user/permissions.md) for the project can
-[delete Container Registry tags in bulk](../../api/container_registry.md#delete-registry-repository-tags-in-bulk)
-periodically based on their own criteria. However, deleting the tags alone does not recycle data,
-it only unlinks tags from manifests and image blobs. To recycle the Container
-Registry data in the whole GitLab instance, you can use the built-in garbage collection command
-provided by `gitlab-ctl`.
+WARNING:
+This command shuts down the Container Registry prior to the garbage collection and
+only starts it again after garbage collection completes. If you prefer to avoid downtime,
+you can manually set the Container Registry to [read-only mode and bypass `gitlab-ctl`](#performing-garbage-collection-without-downtime).
+
+The time required to perform garbage collection is proportional to the Container Registry data size.
Prerequisites:
-- You must have installed GitLab by using an Omnibus package or the
+- You must have installed GitLab by using a Linux package or the
[GitLab Helm chart](https://docs.gitlab.com/charts/charts/registry/#garbage-collection).
-- You must set the Registry to [read-only mode](#performing-garbage-collection-without-downtime).
- Running garbage collection causes downtime for the Container Registry. When you run this command
- on an instance in an environment where another instance is still writing to the Registry storage,
- referenced manifests are removed.
### Understanding the content-addressable layers
@@ -1053,16 +1094,11 @@ Due to the architecture of registry, this data is still accessible when pulling
image `my.registry.com/my.group/my.project@sha256:111111`, though it is
no longer directly accessible via the `:latest` tag.
-### Recycling unused tags
-
-Before you run the built-in command, note the following:
+### Remove unreferenced layers
-- The built-in command stops the registry before it starts the garbage collection.
-- The garbage collect command takes some time to complete, depending on the
- amount of data that exists.
-- If you changed the location of registry configuration file, you must
- specify its path.
-- After the garbage collection is done, the registry should start automatically.
+Image layers are the bulk of the Container Registry storage. A layer is considered
+unreferenced when no image manifest references it. Unreferenced layers are the
+default target of the Container Registry garbage collector.
If you did not change the default location of the configuration file, run:
@@ -1070,51 +1106,37 @@ If you did not change the default location of the configuration file, run:
sudo gitlab-ctl registry-garbage-collect
```
-This command takes some time to complete, depending on the amount of
-layers you have stored.
-
If you changed the location of the Container Registry `config.yml`:
```shell
sudo gitlab-ctl registry-garbage-collect /path/to/config.yml
```
-You may also [remove all untagged manifests and unreferenced layers](#removing-untagged-manifests-and-unreferenced-layers),
-although this is a way more destructive operation, and you should first
-understand the implications.
+You can also [remove all untagged manifests and unreferenced layers](#removing-untagged-manifests-and-unreferenced-layers)
+to recover additional space.
### Removing untagged manifests and unreferenced layers
-WARNING:
-This is a destructive operation.
-
-The GitLab Container Registry follows the same default workflow as Docker Distribution:
-retain untagged manifests and all layers, even ones that are not referenced directly. All content
-can be accessed by using context addressable identifiers.
+By default the Container Registry garbage collector ignores images that are untagged,
+and users can keep pulling untagged images by digest. Users can also re-tag images
+in the future, making them visible again in the GitLab UI and API.
-However, in most workflows, you don't care about untagged manifests and old layers if they are not directly
-referenced by a tagged manifest. The `registry-garbage-collect` command supports the
-`-m` switch to allow you to remove all unreferenced manifests and layers that are
-not directly accessible via `tag`:
+If you do not care about untagged images and the layers exclusively referenced by these images,
+you can delete them all. Use the `-m` flag on the `registry-garbage-collect` command:
```shell
sudo gitlab-ctl registry-garbage-collect -m
```
-Since this is a way more destructive operation, this behavior is disabled by default.
-You are likely expecting this way of operation, but before doing that, ensure
-that you have backed up all registry data.
-
-When the command is used without the `-m` flag, the Container Registry only removes layers that are not referenced by any manifest, tagged or not.
+If you are unsure about deleting untagged images, back up your registry data before proceeding.
### Performing garbage collection without downtime
-You can perform garbage collection without stopping the Container Registry by putting
-it in read-only mode and by not using the built-in command. On large instances
-this could require Container Registry to be in read-only mode for a while.
-During this time,
-you are able to pull from the Container Registry, but you are not able to
-push.
+To do garbage collection while keeping the Container Registry online, put the registry
+in read-only mode and bypass the built-in `gitlab-ctl registry-garbage-collect` command.
+
+You can pull but not push images while the Container Registry is in read-only mode. The Container
+Registry must remain in read-only for the full duration of the garbage collection.
By default, the [registry storage path](#configure-storage-for-the-container-registry)
is `/var/opt/gitlab/gitlab-rails/shared/registry`.
@@ -1146,18 +1168,15 @@ To enable the read-only mode:
1. Next, trigger one of the garbage collect commands:
- WARNING:
- You must use `/opt/gitlab/embedded/bin/registry` to recycle unused tags. If you use `gitlab-ctl registry-garbage-collect`, **the container registry goes down**.
-
```shell
- # Recycling unused tags
+ # Remove unreferenced layers
sudo /opt/gitlab/embedded/bin/registry garbage-collect /var/opt/gitlab/registry/config.yml
- # Removing unused layers not referenced by manifests
+ # Remove untagged manifests and unreferenced layers
sudo /opt/gitlab/embedded/bin/registry garbage-collect -m /var/opt/gitlab/registry/config.yml
```
- This command starts the garbage collection, which might take some time to complete.
+ This command starts the garbage collection. The time to complete is proportional to the registry data size.
1. Once done, in `/etc/gitlab/gitlab.rb` change it back to read-write mode:
@@ -1212,13 +1231,13 @@ itself on the system so that the `gitlab-ctl` command can bring the registry ser
Also, there's no way to save progress or results during the mark phase of the process. Only once
blobs start being deleted is anything permanent done.
-## Configuring GitLab and Registry to run on separate nodes (Omnibus GitLab)
+## Configure GitLab and Registry to run on separate nodes (Linux package installations)
By default, package assumes that both services are running on the same node.
To get GitLab and Registry to run on a separate nodes, separate configuration
is necessary for Registry and GitLab.
-### Configuring Registry
+### Configure Registry
Below you can find configuration options you should set in `/etc/gitlab/gitlab.rb`,
for Registry to run separately from GitLab:
@@ -1235,7 +1254,7 @@ for Registry to run separately from GitLab:
- `registry['health_storagedriver_enabled']`, default [set programmatically](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/10-7-stable/files/gitlab-cookbooks/gitlab/libraries/registry.rb#L88). Configure whether health checks on the configured storage driver are enabled.
- `gitlab_rails['registry_issuer']`, [default value](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/10-3-stable/files/gitlab-cookbooks/gitlab/attributes/default.rb#L153). This setting needs to be set the same between Registry and GitLab.
-### Configuring GitLab
+### Configure GitLab
Below you can find configuration options you should set in `/etc/gitlab/gitlab.rb`,
for GitLab to run separately from Registry:
@@ -1435,7 +1454,9 @@ level=error msg="response completed with error" err.code=unknown err.detail="une
To resolve the error specify a `chunksize` value in the Registry configuration.
Start with a value between `25000000` (25 MB) and `50000000` (50 MB).
-**For Omnibus installations**
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
1. Edit `/etc/gitlab/gitlab.rb`:
@@ -1452,7 +1473,7 @@ Start with a value between `25000000` (25 MB) and `50000000` (50 MB).
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-package-installation) for the changes to take effect.
-**For installations from source**
+:::TabTitle Self-compiled (source)
1. Edit `config/gitlab.yml`:
@@ -1467,16 +1488,20 @@ Start with a value between `25000000` (25 MB) and `50000000` (50 MB).
1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source) for the changes to take effect.
+::EndTabs
+
### Supporting older Docker clients
The Docker container registry shipped with GitLab disables the schema1 manifest
by default. If you are still using older Docker clients (1.9 or older), you may
experience an error pushing images. See
-[omnibus-4145](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/4145) for more details.
+[issue 4145](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/4145) for more details.
You can add a configuration option for backwards compatibility.
-**For Omnibus installations**
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
1. Edit `/etc/gitlab/gitlab.rb`:
@@ -1486,7 +1511,7 @@ You can add a configuration option for backwards compatibility.
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-package-installation) for the changes to take effect.
-**For installations from source**
+:::TabTitle Self-compiled (source)
1. Edit the YAML configuration file you created when you [deployed the registry](https://docs.docker.com/registry/deploying/). Add the following snippet:
@@ -1498,6 +1523,8 @@ You can add a configuration option for backwards compatibility.
1. Restart the registry for the changes to take affect.
+::EndTabs
+
### Docker connection error
A Docker connection error can occur when there are special characters in either the group,
@@ -1522,7 +1549,9 @@ offloaded to a third party reverse proxy.
This problem was discussed in a [Docker project issue](https://github.com/docker/distribution/issues/970)
and a simple solution would be to enable relative URLs in the Registry.
-**For Omnibus installations**
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
1. Edit `/etc/gitlab/gitlab.rb`:
@@ -1534,7 +1563,7 @@ and a simple solution would be to enable relative URLs in the Registry.
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-package-installation) for the changes to take effect.
-**For installations from source**
+:::TabTitle Self-compiled (source)
1. Edit the YAML configuration file you created when you [deployed the registry](https://docs.docker.com/registry/deploying/). Add the following snippet:
@@ -1545,6 +1574,8 @@ and a simple solution would be to enable relative URLs in the Registry.
1. Save the file and [restart GitLab](../restart_gitlab.md#installations-from-source) for the changes to take effect.
+::EndTabs
+
### Enable the Registry debug server
You can use the Container Registry debug server to diagnose problems. The debug endpoint can monitor metrics and health, as well as do profiling.
@@ -1602,7 +1633,9 @@ for more information.
The following sections provide additional details about each installation method.
-#### Helm chart installations
+::Tabs
+
+:::TabTitle Helm chart (Kubernetes)
For Helm chart installations:
@@ -1614,9 +1647,9 @@ For Helm chart installations:
No other registry configuration changes are required.
-#### Omnibus installations
+:::TabTitle Linux package (Omnibus)
-For Omnibus installations:
+For Linux package installations:
1. Temporarily replace the registry binary that ships with GitLab 13.9+ for one prior to
`v3.0.0-gitlab`. To do so, pull a previous version of the Docker image for the GitLab Container
@@ -1629,20 +1662,21 @@ For Omnibus installations:
docker rm $id
```
-1. Replace the binary embedded in the Omnibus install, located at
+1. Replace the binary embedded in the Linux package installation located at
`/opt/gitlab/embedded/bin/registry`, with `registry-2.13.1-gitlab`. Make sure to start by backing
- up the original binary embedded in Omnibus, and restore it after performing the
- [image upgrade](#images-upgrade)) steps. You should [stop](https://docs.gitlab.com/omnibus/maintenance/#starting-and-stopping)
+ up the original binary embedded in the Linux package, and restore it after performing the
+ [image upgrade](#images-upgrade) steps. You should [stop](https://docs.gitlab.com/omnibus/maintenance/#starting-and-stopping)
the registry service before replacing its binary and start it right after. No registry
configuration changes are required.
-#### Source installations
+:::TabTitle Self-compiled (source)
For source installations, locate your `registry` binary and temporarily replace it with the one
-obtained from `v3.0.0-gitlab`, as explained for [Omnibus installations](#omnibus-installations).
+obtained from `v3.0.0-gitlab`, as explained for Linux package installations.
Make sure to start by backing up the original registry binary, and restore it after performing the
-[images upgrade](#images-upgrade))
-steps.
+[images upgrade](#images-upgrade) steps.
+
+::EndTabs
#### Images upgrade
diff --git a/doc/administration/packages/dependency_proxy.md b/doc/administration/packages/dependency_proxy.md
index 5e770c2464b..ee352a82058 100644
--- a/doc/administration/packages/dependency_proxy.md
+++ b/doc/administration/packages/dependency_proxy.md
@@ -25,13 +25,11 @@ The GitLab Dependency Proxy:
The Dependency Proxy is enabled by default. If you are an administrator, you
can turn off the Dependency Proxy. To turn off the Dependency Proxy, follow the instructions that
-correspond to your GitLab installation:
+correspond to your GitLab installation.
-- [Omnibus GitLab installations](#omnibus-gitlab-installations)
-- [Helm chart installations](#helm-chart-installations)
-- [Installations from source](#installations-from-source)
+::Tabs
-### Omnibus GitLab installations
+:::TabTitle Linux package (Omnibus)
1. Edit `/etc/gitlab/gitlab.rb` and add the following line:
@@ -42,7 +40,7 @@ correspond to your GitLab installation:
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-package-installation)
for the changes to take effect.
-### Helm chart installations
+:::TabTitle Helm chart (Kubernetes)
After the installation is complete, update the global `appConfig` to turn off the Dependency Proxy:
@@ -59,7 +57,7 @@ global:
For more information, see [Configure Charts using Globals](https://docs.gitlab.com/charts/charts/globals.html#configure-appconfig-settings).
-### Installations from source
+:::TabTitle Self-compiled (source)
1. After the installation is complete, configure the `dependency_proxy` section in
`config/gitlab.yml`. Set `enabled` to `false` to turn off the Dependency Proxy:
@@ -69,13 +67,13 @@ For more information, see [Configure Charts using Globals](https://docs.gitlab.c
enabled: false
```
-1. [Restart GitLab](../restart_gitlab.md#installations-from-source "How to restart GitLab")
- for the changes to take effect.
+1. [Restart GitLab](../restart_gitlab.md#installations-from-source) for the changes to take effect.
+
+::EndTabs
### Multi-node GitLab installations
-Follow the steps for [Omnibus GitLab installations](#omnibus-gitlab-installations)
-for each Web and Sidekiq node.
+Follow the steps for Linux package installations for each Web and Sidekiq node.
## Turn on the Dependency Proxy
@@ -91,12 +89,13 @@ local location or even use object storage.
### Changing the local storage path
-The Dependency Proxy files for Omnibus GitLab installations are stored under
+The Dependency Proxy files for Linux package installations are stored under
`/var/opt/gitlab/gitlab-rails/shared/dependency_proxy/` and for source
installations under `shared/dependency_proxy/` (relative to the Git home directory).
-To change the local storage path:
-**Omnibus GitLab installations**
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
1. Edit `/etc/gitlab/gitlab.rb` and add the following line:
@@ -106,7 +105,7 @@ To change the local storage path:
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-package-installation) for the changes to take effect.
-**Installations from source**
+:::TabTitle Self-compiled (source)
1. Edit the `dependency_proxy` section in `config/gitlab.yml`:
@@ -116,7 +115,9 @@ To change the local storage path:
storage_path: shared/dependency_proxy
```
-1. [Restart GitLab](../restart_gitlab.md#installations-from-source "How to restart GitLab") for the changes to take effect.
+1. [Restart GitLab](../restart_gitlab.md#installations-from-source) for the changes to take effect.
+
+::EndTabs
### Using object storage
@@ -127,7 +128,9 @@ This section describes the earlier configuration format. [Migration steps still
[Read more about using object storage with GitLab](../object_storage.md).
-**Omnibus GitLab installations**
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
1. Edit `/etc/gitlab/gitlab.rb` and add the following lines (uncomment where
necessary):
@@ -158,7 +161,7 @@ This section describes the earlier configuration format. [Migration steps still
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-package-installation) for the changes to take effect.
-**Installations from source**
+:::TabTitle Self-compiled (source)
1. Edit the `dependency_proxy` section in `config/gitlab.yml` (uncomment where necessary):
@@ -190,7 +193,9 @@ This section describes the earlier configuration format. [Migration steps still
# path_style: false # If true, use 'host/bucket_name/object' instead of 'bucket_name.host/object'.
```
-1. [Restart GitLab](../restart_gitlab.md#installations-from-source "How to restart GitLab") for the changes to take effect.
+1. [Restart GitLab](../restart_gitlab.md#installations-from-source) for the changes to take effect.
+
+::EndTabs
#### Migrate local Dependency Proxy blobs and manifests to object storage
@@ -200,24 +205,24 @@ After [configuring object storage](#using-object-storage),
use the following task to migrate existing Dependency Proxy blobs and manifests from local storage
to remote storage. The processing is done in a background worker and requires no downtime.
-For Omnibus GitLab:
+- For Linux package installations:
-```shell
-sudo gitlab-rake "gitlab:dependency_proxy:migrate"
-```
+ ```shell
+ sudo gitlab-rake "gitlab:dependency_proxy:migrate"
+ ```
-For installations from source:
+- For installations from source:
-```shell
-RAILS_ENV=production sudo -u git -H bundle exec rake gitlab:dependency_proxy:migrate
-```
+ ```shell
+ RAILS_ENV=production sudo -u git -H bundle exec rake gitlab:dependency_proxy:migrate
+ ```
You can optionally track progress and verify that all Dependency Proxy blobs and manifests migrated successfully using the
[PostgreSQL console](https://docs.gitlab.com/omnibus/settings/database.html#connecting-to-the-bundled-postgresql-database):
-- `sudo gitlab-rails dbconsole` for Omnibus GitLab 14.1 and earlier.
-- `sudo gitlab-rails dbconsole --database main` for Omnibus GitLab 14.2 and later.
-- `sudo -u git -H psql -d gitlabhq_production` for source-installed instances.
+- `sudo gitlab-rails dbconsole` for Linux package installations running version 14.1 and earlier.
+- `sudo gitlab-rails dbconsole --database main` for Linux package installations running version 14.2 and later.
+- `sudo -u git -H psql -d gitlabhq_production` for self-compiled instances.
Verify that `objectstg` (where `file_store = '2'`) has the count of all Dependency Proxy blobs and
manifests for each respective query:
diff --git a/doc/administration/packages/index.md b/doc/administration/packages/index.md
index b735204c323..77730384623 100644
--- a/doc/administration/packages/index.md
+++ b/doc/administration/packages/index.md
@@ -55,7 +55,7 @@ guides you through the process.
When downloading packages as dependencies in downstream projects, many requests are made through the
Packages API. You may therefore reach enforced user and IP rate limits. To address this issue, you
-can define specific rate limits for the Packages API. For more details, see [Package Registry Rate Limits](../../user/admin_area/settings/package_registry_rate_limits.md).
+can define specific rate limits for the Packages API. For more details, see [Package Registry Rate Limits](../settings/package_registry_rate_limits.md).
## Enable or disable the Package Registry
diff --git a/doc/administration/pages/index.md b/doc/administration/pages/index.md
index e86726524d0..726307229d6 100644
--- a/doc/administration/pages/index.md
+++ b/doc/administration/pages/index.md
@@ -10,9 +10,8 @@ GitLab Pages allows for hosting of static sites. It must be configured by an
administrator. Separate [user documentation](../../user/project/pages/index.md) is available.
NOTE:
-This guide is for Omnibus GitLab installations. If you have installed
-GitLab from source, see
-[GitLab Pages administration for source installations](source.md).
+This guide is for Linux package installations. If you have a self-compiled GitLab installation, see
+[GitLab Pages administration for self-compiled installations](source.md).
## The GitLab Pages daemon
@@ -225,88 +224,89 @@ This setup is primarily intended to be used when [installing a GitLab POC on Ama
### Global settings
-Below is a table of all configuration settings known to Pages in Omnibus GitLab,
+Below is a table of all configuration settings known to Pages in a Linux package installation,
and what they do. These options can be adjusted in `/etc/gitlab/gitlab.rb`,
and take effect after you [reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-package-installation).
Most of these settings don't have to be configured manually unless you need more granular
control over how the Pages daemon runs and serves content in your environment.
-| Setting | Description |
-|-----------------------------------------|-------------|
+| Setting | Description |
+|-----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `pages_external_url` | The URL where GitLab Pages is accessible, including protocol (HTTP / HTTPS). If `https://` is used, additional configuration is required. See [Wildcard domains with TLS support](#wildcard-domains-with-tls-support) and [Custom domains with TLS support](#custom-domains-with-tls-support) for details. |
-| **`gitlab_pages[]`** | |
-| `access_control` | Whether to enable [access control](index.md#access-control). |
-| `api_secret_key` | Full path to file with secret key used to authenticate with the GitLab API. Auto-generated when left unset. |
-| `artifacts_server` | Enable viewing [artifacts](../job_artifacts.md) in GitLab Pages. |
-| `artifacts_server_timeout` | Timeout (in seconds) for a proxied request to the artifacts server. |
-| `artifacts_server_url` | API URL to proxy artifact requests to. Defaults to GitLab `external URL` + `/api/v4`, for example `https://gitlab.com/api/v4`. When running a [separate Pages server](#running-gitlab-pages-on-a-separate-server), this URL must point to the main GitLab server's API. |
-| `auth_redirect_uri` | Callback URL for authenticating with GitLab. Defaults to project's subdomain of `pages_external_url` + `/auth`. |
-| `auth_secret` | Secret key for signing authentication requests. Leave blank to pull automatically from GitLab during OAuth registration. |
-| `dir` | Working directory for configuration and secrets files. |
-| `enable` | Enable or disable GitLab Pages on the current system. |
-| `external_http` | Configure Pages to bind to one or more secondary IP addresses, serving HTTP requests. Multiple addresses can be given as an array, along with exact ports, for example `['1.2.3.4', '1.2.3.5:8063']`. Sets value for `listen_http`. |
-| `external_https` | Configure Pages to bind to one or more secondary IP addresses, serving HTTPS requests. Multiple addresses can be given as an array, along with exact ports, for example `['1.2.3.4', '1.2.3.5:8063']`. Sets value for `listen_https`. |
-| `server_shutdown_timeout` | GitLab Pages server shutdown timeout in seconds (default: `30s`). |
-| `gitlab_client_http_timeout` | GitLab API HTTP client connection timeout in seconds (default: `10s`). |
-| `gitlab_client_jwt_expiry` | JWT Token expiry time in seconds (default: `30s`). |
-| `gitlab_cache_expiry` | The maximum time a domain's configuration is stored in the cache (default: `600s`). |
-| `gitlab_cache_refresh` | The interval at which a domain's configuration is set to be due to refresh (default: `60s`). |
-| `gitlab_cache_cleanup` | The interval at which expired items are removed from the cache (default: `60s`). |
-| `gitlab_retrieval_timeout` | The maximum time to wait for a response from the GitLab API per request (default: `30s`). |
-| `gitlab_retrieval_interval` | The interval to wait before retrying to resolve a domain's configuration via the GitLab API (default: `1s`). |
-| `gitlab_retrieval_retries` | The maximum number of times to retry to resolve a domain's configuration via the API (default: 3). |
-| `domain_config_source` | This parameter was removed in 14.0, on earlier versions it can be used to enable and test API domain configuration source |
-| `gitlab_id` | The OAuth application public ID. Leave blank to automatically fill when Pages authenticates with GitLab. |
-| `gitlab_secret` | The OAuth application secret. Leave blank to automatically fill when Pages authenticates with GitLab. |
-| `auth_scope` | The OAuth application scope to use for authentication. Must match GitLab Pages OAuth application settings. Leave blank to use `api` scope by default. |
-| `auth_cookie_session_timeout` | Authentication cookie session timeout in seconds (default: `10m`). A value of `0` means the cookie is deleted after the browser session ends. |
-| `gitlab_server` | Server to use for authentication when access control is enabled; defaults to GitLab `external_url`. |
-| `headers` | Specify any additional http headers that should be sent to the client with each response. Multiple headers can be given as an array, header and value as one string, for example `['my-header: myvalue', 'my-other-header: my-other-value']` |
-| `enable_disk` | Allows the GitLab Pages daemon to serve content from disk. Shall be disabled if shared disk storage isn't available. |
-| `insecure_ciphers` | Use default list of cipher suites, may contain insecure ones like 3DES and RC4. |
-| `internal_gitlab_server` | Internal GitLab server address used exclusively for API requests. Useful if you want to send that traffic over an internal load balancer. Defaults to GitLab `external_url`. |
-| `listen_proxy` | The addresses to listen on for reverse-proxy requests. Pages binds to these addresses' network sockets and receives incoming requests from them. Sets the value of `proxy_pass` in `$nginx-dir/conf/gitlab-pages.conf`. |
-| `log_directory` | Absolute path to a log directory. |
-| `log_format` | The log output format: `text` or `json`. |
-| `log_verbose` | Verbose logging, true/false. |
-| `propagate_correlation_id` | Set to true (false by default) to re-use existing Correlation ID from the incoming request header `X-Request-ID` if present. If a reverse proxy sets this header, the value is propagated in the request chain. |
-| `max_connections` | Limit on the number of concurrent connections to the HTTP, HTTPS or proxy listeners. |
+| **`gitlab_pages[]`** | |
+| `access_control` | Whether to enable [access control](index.md#access-control). |
+| `api_secret_key` | Full path to file with secret key used to authenticate with the GitLab API. Auto-generated when left unset. |
+| `artifacts_server` | Enable viewing [artifacts](../job_artifacts.md) in GitLab Pages. |
+| `artifacts_server_timeout` | Timeout (in seconds) for a proxied request to the artifacts server. |
+| `artifacts_server_url` | API URL to proxy artifact requests to. Defaults to GitLab `external URL` + `/api/v4`, for example `https://gitlab.com/api/v4`. When running a [separate Pages server](#running-gitlab-pages-on-a-separate-server), this URL must point to the main GitLab server's API. |
+| `auth_redirect_uri` | Callback URL for authenticating with GitLab. Defaults to project's subdomain of `pages_external_url` + `/auth`. |
+| `auth_secret` | Secret key for signing authentication requests. Leave blank to pull automatically from GitLab during OAuth registration. |
+| `dir` | Working directory for configuration and secrets files. |
+| `enable` | Enable or disable GitLab Pages on the current system. |
+| `external_http` | Configure Pages to bind to one or more secondary IP addresses, serving HTTP requests. Multiple addresses can be given as an array, along with exact ports, for example `['1.2.3.4', '1.2.3.5:8063']`. Sets value for `listen_http`. |
+| `external_https` | Configure Pages to bind to one or more secondary IP addresses, serving HTTPS requests. Multiple addresses can be given as an array, along with exact ports, for example `['1.2.3.4', '1.2.3.5:8063']`. Sets value for `listen_https`. |
+| `server_shutdown_timeout` | GitLab Pages server shutdown timeout in seconds (default: `30s`). |
+| `gitlab_client_http_timeout` | GitLab API HTTP client connection timeout in seconds (default: `10s`). |
+| `gitlab_client_jwt_expiry` | JWT Token expiry time in seconds (default: `30s`). |
+| `gitlab_cache_expiry` | The maximum time a domain's configuration is stored in the cache (default: `600s`). |
+| `gitlab_cache_refresh` | The interval at which a domain's configuration is set to be due to refresh (default: `60s`). |
+| `gitlab_cache_cleanup` | The interval at which expired items are removed from the cache (default: `60s`). |
+| `gitlab_retrieval_timeout` | The maximum time to wait for a response from the GitLab API per request (default: `30s`). |
+| `gitlab_retrieval_interval` | The interval to wait before retrying to resolve a domain's configuration via the GitLab API (default: `1s`). |
+| `gitlab_retrieval_retries` | The maximum number of times to retry to resolve a domain's configuration via the API (default: 3). |
+| `domain_config_source` | This parameter was removed in 14.0, on earlier versions it can be used to enable and test API domain configuration source |
+| `gitlab_id` | The OAuth application public ID. Leave blank to automatically fill when Pages authenticates with GitLab. |
+| `gitlab_secret` | The OAuth application secret. Leave blank to automatically fill when Pages authenticates with GitLab. |
+| `auth_scope` | The OAuth application scope to use for authentication. Must match GitLab Pages OAuth application settings. Leave blank to use `api` scope by default. |
+| `auth_cookie_session_timeout` | Authentication cookie session timeout in seconds (default: `10m`). A value of `0` means the cookie is deleted after the browser session ends. |
+| `gitlab_server` | Server to use for authentication when access control is enabled; defaults to GitLab `external_url`. |
+| `headers` | Specify any additional http headers that should be sent to the client with each response. Multiple headers can be given as an array, header and value as one string, for example `['my-header: myvalue', 'my-other-header: my-other-value']` |
+| `enable_disk` | Allows the GitLab Pages daemon to serve content from disk. Shall be disabled if shared disk storage isn't available. |
+| `insecure_ciphers` | Use default list of cipher suites, may contain insecure ones like 3DES and RC4. |
+| `internal_gitlab_server` | Internal GitLab server address used exclusively for API requests. Useful if you want to send that traffic over an internal load balancer. Defaults to GitLab `external_url`. |
+| `listen_proxy` | The addresses to listen on for reverse-proxy requests. Pages binds to these addresses' network sockets and receives incoming requests from them. Sets the value of `proxy_pass` in `$nginx-dir/conf/gitlab-pages.conf`. |
+| `log_directory` | Absolute path to a log directory. |
+| `log_format` | The log output format: `text` or `json`. |
+| `log_verbose` | Verbose logging, true/false. |
+| `propagate_correlation_id` | Set to true (false by default) to re-use existing Correlation ID from the incoming request header `X-Request-ID` if present. If a reverse proxy sets this header, the value is propagated in the request chain. |
+| `max_connections` | Limit on the number of concurrent connections to the HTTP, HTTPS or proxy listeners. |
| `max_uri_length` | The maximum length of URIs accepted by GitLab Pages. Set to 0 for unlimited length. [Introduced](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/5729) in GitLab 14.5.
-| `metrics_address` | The address to listen on for metrics requests. |
-| `redirect_http` | Redirect pages from HTTP to HTTPS, true/false. |
-| `redirects_max_config_size` | The maximum size of the `_redirects` file, in bytes (default: 65536). |
-| `redirects_max_path_segments` | The maximum number of path segments allowed in `_redirects` rules URLs (default: 25). |
-| `redirects_max_rule_count` | The maximum number of rules allowed in `_redirects` (default: 1000). |
-| `sentry_dsn` | The address for sending Sentry crash reporting to. |
-| `sentry_enabled` | Enable reporting and logging with Sentry, true/false. |
-| `sentry_environment` | The environment for Sentry crash reporting. |
-| `status_uri` | The URL path for a status page, for example, `/@status`. |
-| `tls_max_version` | Specifies the maximum TLS version ("tls1.2" or "tls1.3"). |
-| `tls_min_version` | Specifies the minimum TLS version ("tls1.2" or "tls1.3"). |
-| `use_http2` | Enable HTTP2 support. |
-| **`gitlab_pages['env'][]`** | |
-| `http_proxy` | Configure GitLab Pages to use an HTTP Proxy to mediate traffic between Pages and GitLab. Sets an environment variable `http_proxy` when starting Pages daemon. |
-| **`gitlab_rails[]`** | |
-| `pages_domain_verification_cron_worker` | Schedule for verifying custom GitLab Pages domains. |
-| `pages_domain_ssl_renewal_cron_worker` | Schedule for obtaining and renewing SSL certificates through Let's Encrypt for GitLab Pages domains. |
-| `pages_domain_removal_cron_worker` | Schedule for removing unverified custom GitLab Pages domains. |
-| `pages_path` | The directory on disk where pages are stored, defaults to `GITLAB-RAILS/shared/pages`. |
-| **`pages_nginx[]`** | |
-| `enable` | Include a virtual host `server{}` block for Pages inside NGINX. Needed for NGINX to proxy traffic back to the Pages daemon. Set to `false` if the Pages daemon should directly receive all requests, for example, when using [custom domains](index.md#custom-domains). |
-| `FF_ENABLE_PLACEHOLDERS` | Feature flag for rewrites (enabled by default). See [Rewrites](../../user/project/pages/redirects.md#rewrites) for more information. |
-| `use_legacy_storage` | Temporarily-introduced parameter allowing to use legacy domain configuration source and storage. [Removed in 14.3](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/6166). |
-| `rate_limit_source_ip` | Rate limit per source IP in number of requests per second. Set to `0` to disable this feature. |
-| `rate_limit_source_ip_burst` | Rate limit per source IP maximum burst allowed per second. |
-| `rate_limit_domain` | Rate limit per domain in number of requests per second. Set to `0` to disable this feature. |
-| `rate_limit_domain_burst` | Rate limit per domain maximum burst allowed per second. |
-| `rate_limit_tls_source_ip` | Rate limit per source IP in number of TLS connections per second. Set to `0` to disable this feature. |
-| `rate_limit_tls_source_ip_burst` | Rate limit per source IP maximum TLS connections burst allowed per second. |
-| `rate_limit_tls_domain` | Rate limit per domain in number of TLS connections per second. Set to `0` to disable this feature. |
-| `rate_limit_tls_domain_burst` | Rate limit per domain maximum TLS connections 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: `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` |
+| `metrics_address` | The address to listen on for metrics requests. |
+| `redirect_http` | Redirect pages from HTTP to HTTPS, true/false. |
+| `redirects_max_config_size` | The maximum size of the `_redirects` file, in bytes (default: 65536). |
+| `redirects_max_path_segments` | The maximum number of path segments allowed in `_redirects` rules URLs (default: 25). |
+| `redirects_max_rule_count` | The maximum number of rules allowed in `_redirects` (default: 1000). |
+| `sentry_dsn` | The address for sending Sentry crash reporting to. |
+| `sentry_enabled` | Enable reporting and logging with Sentry, true/false. |
+| `sentry_environment` | The environment for Sentry crash reporting. |
+| `status_uri` | The URL path for a status page, for example, `/@status`. |
+| `tls_max_version` | Specifies the maximum TLS version ("tls1.2" or "tls1.3"). |
+| `tls_min_version` | Specifies the minimum TLS version ("tls1.2" or "tls1.3"). |
+| `use_http2` | Enable HTTP2 support. |
+| **`gitlab_pages['env'][]`** | |
+| `http_proxy` | Configure GitLab Pages to use an HTTP Proxy to mediate traffic between Pages and GitLab. Sets an environment variable `http_proxy` when starting Pages daemon. |
+| **`gitlab_rails[]`** | |
+| `pages_domain_verification_cron_worker` | Schedule for verifying custom GitLab Pages domains. |
+| `pages_domain_ssl_renewal_cron_worker` | Schedule for obtaining and renewing SSL certificates through Let's Encrypt for GitLab Pages domains. |
+| `pages_domain_removal_cron_worker` | Schedule for removing unverified custom GitLab Pages domains. |
+| `pages_path` | The directory on disk where pages are stored, defaults to `GITLAB-RAILS/shared/pages`. |
+| **`pages_nginx[]`** | |
+| `enable` | Include a virtual host `server{}` block for Pages inside NGINX. Needed for NGINX to proxy traffic back to the Pages daemon. Set to `false` if the Pages daemon should directly receive all requests, for example, when using [custom domains](index.md#custom-domains). |
+| `FF_CONFIGURABLE_ROOT_DIR` | Feature flag to [customize the default folder](../../user/project/pages/introduction.md#customize-the-default-folder) (enabled by default). |
+| `FF_ENABLE_PLACEHOLDERS` | Feature flag for rewrites (enabled by default). See [Rewrites](../../user/project/pages/redirects.md#rewrites) for more information. |
+| `use_legacy_storage` | Temporarily-introduced parameter allowing to use legacy domain configuration source and storage. [Removed in 14.3](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/6166). |
+| `rate_limit_source_ip` | Rate limit per source IP in number of requests per second. Set to `0` to disable this feature. |
+| `rate_limit_source_ip_burst` | Rate limit per source IP maximum burst allowed per second. |
+| `rate_limit_domain` | Rate limit per domain in number of requests per second. Set to `0` to disable this feature. |
+| `rate_limit_domain_burst` | Rate limit per domain maximum burst allowed per second. |
+| `rate_limit_tls_source_ip` | Rate limit per source IP in number of TLS connections per second. Set to `0` to disable this feature. |
+| `rate_limit_tls_source_ip_burst` | Rate limit per source IP maximum TLS connections burst allowed per second. |
+| `rate_limit_tls_domain` | Rate limit per domain in number of TLS connections per second. Set to `0` to disable this feature. |
+| `rate_limit_tls_domain_burst` | Rate limit per domain maximum TLS connections 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: `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
@@ -530,7 +530,7 @@ This usually results in this error:
For installation from source, this can be fixed by installing the custom Certificate
Authority (CA) in the system certificate store.
-For Omnibus, this is fixed by [installing a custom CA in Omnibus GitLab](https://docs.gitlab.com/omnibus/settings/ssl/index.html#install-custom-public-certificates).
+For Linux package installations, this is fixed by [installing a custom CA](https://docs.gitlab.com/omnibus/settings/ssl/index.html#install-custom-public-certificates).
### ZIP serving and cache configuration
@@ -590,6 +590,27 @@ gitlab_pages['redirects_max_path_segments'] = 50
gitlab_pages['redirects_max_rule_count'] = 2000
```
+## Use environment variables
+
+You can pass an environment variable to the Pages daemon (for example,
+to enable or disable a feature flag).
+
+To disable the configurable directory feature:
+
+1. Edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitlab_pages['env'] = {
+ 'FF_CONFIGURABLE_ROOT_DIR' => "false"
+ }
+ ```
+
+1. Save the file and reconfigure GitLab:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
+
## Activate verbose logging for daemon
Follow the steps below to configure verbose logging of GitLab Pages daemon.
@@ -698,10 +719,7 @@ Prerequisite:
To set the maximum size of GitLab Pages site in a project, overriding the inherited setting:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
-1. On the left sidebar, select **Settings > Pages**.
-
- If this path is not visible, select **Deployments > Pages**.
- [This location is part of an experiment](../../user/project/pages/index.md#menu-position-test).
+1. On the left sidebar, select **Deploy > Pages**.
1. In **Maximum size of pages**, enter the size in MB.
1. Select **Save changes**.
@@ -758,7 +776,7 @@ database encryption. Proceed with caution.
gitlab_pages['access_control'] = true
```
-1. Configure [the object storage and migrate pages data to it](#using-object-storage).
+1. Configure [the object storage and migrate pages data to it](#object-storage-settings).
1. [Reconfigure the **GitLab server**](../restart_gitlab.md#reconfigure-a-linux-package-installation) for the
changes to take effect. The `gitlab-secrets.json` file is now updated with the
@@ -766,7 +784,7 @@ database encryption. Proceed with caution.
1. Set up a new server. This becomes the **Pages server**.
-1. On the **Pages server**, install Omnibus GitLab and modify `/etc/gitlab/gitlab.rb`
+1. On the **Pages server**, install GitLab by using the Linux package and modify `/etc/gitlab/gitlab.rb`
to include:
```ruby
@@ -832,45 +850,12 @@ This approach had several disadvantages and was replaced with GitLab Pages using
every time a new domain is requested.
The domain information is also cached by the Pages daemon to speed up subsequent requests.
-From [GitLab 13.3 to GitLab 13.12](#domain-source-configuration-before-140) GitLab Pages supported both ways of obtaining domain information.
-
Starting from [GitLab 14.0](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5993) GitLab Pages uses API
by default and fails to start if it can't connect to it.
For common issues, see [troubleshooting](troubleshooting.md#failed-to-connect-to-the-internal-gitlab-api).
For more details see this [blog post](https://about.gitlab.com/blog/2020/08/03/how-gitlab-pages-uses-the-gitlab-api-to-serve-content/).
-### Domain source configuration before 14.0
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217912) in GitLab 13.3.
-
-WARNING:
-`domain_config_source` parameter is removed and has no effect starting from [GitLab 14.0](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5993)
-
-From [GitLab 13.3](https://gitlab.com/gitlab-org/gitlab/-/issues/217912) to [GitLab 13.12](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5993) GitLab Pages can either use `disk` or `gitlab` domain configuration source.
-
-We highly advise you to use `gitlab` configuration source as it makes transitions to newer versions easier.
-
-To explicitly enable API source:
-
-1. Add the following to your `/etc/gitlab/gitlab.rb` file:
-
- ```ruby
- gitlab_pages['domain_config_source'] = "gitlab"
- ```
-
-1. [Reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-package-installation) for the changes to take effect.
-
-Or if you want to use legacy configuration source you can:
-
-1. Add the following to your `/etc/gitlab/gitlab.rb` file:
-
- ```ruby
- gitlab_pages['domain_config_source'] = "disk"
- ```
-
-1. [Reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-package-installation) for the changes to take effect.
-
### GitLab API cache configuration
> [Introduced](https://gitlab.com/gitlab-org/gitlab-pages/-/issues/520) in GitLab 13.10.
@@ -909,18 +894,12 @@ only when there is an error response from the API, for example a connection time
- Decreasing `gitlab_retrieval_retries` reduces the number of times a domain's
configuration is tried to be resolved automatically before reporting an error.
-## Using object storage
-
-> [Introduced](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5577) in GitLab 13.6.
+## Object storage settings
-For more information, see [object storage](../object_storage.md).
+The following [object storage](../object_storage.md) settings are:
-### Object storage settings
-
-The following settings are:
-
-- Nested under `pages:` and then `object_store:` on source installations.
-- Prefixed by `pages_object_store_` on Omnibus GitLab installations.
+- Nested under `pages:` and then `object_store:` on self-compiled installations.
+- Prefixed by `pages_object_store_` on Linux package installations.
| Setting | Description | Default |
|---------|-------------|---------|
@@ -932,7 +911,7 @@ NOTE:
If you want to stop using and disconnect the NFS server, you need to
[explicitly disable local storage](#disable-pages-local-storage), and it's only possible after upgrading to GitLab 13.11.
-#### S3-compatible connection settings
+### S3-compatible connection settings
In GitLab 13.2 and later, you should use the
[consolidated object storage settings](../object_storage.md#configure-a-single-storage-connection-for-all-object-types-consolidated-form).
@@ -940,7 +919,9 @@ This section describes the earlier configuration format.
See [the available connection settings for different providers](../object_storage.md#configure-the-connection-settings).
-In Omnibus installations:
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
1. Add the following lines to `/etc/gitlab/gitlab.rb` and replace the values with the ones you want:
@@ -971,7 +952,7 @@ In Omnibus installations:
1. [Migrate existing Pages deployments to object storage.](#migrate-pages-deployments-to-object-storage)
-In installations from source:
+:::TabTitle Self-compiled (source)
1. Edit `/home/git/gitlab/config/gitlab.yml` and add or amend the following lines:
@@ -992,75 +973,14 @@ In installations from source:
1. [Migrate existing Pages deployments to object storage.](#migrate-pages-deployments-to-object-storage)
-## ZIP storage
-
-In GitLab 14.0 the underlying storage format of GitLab Pages is changing from
-files stored directly in disk to a single ZIP archive per project.
-
-These ZIP archives can be stored either locally on disk storage or on [object storage](#using-object-storage) if it is configured.
-
-[Starting from GitLab 13.5](https://gitlab.com/gitlab-org/gitlab/-/issues/245308) ZIP archives are stored every time pages site is updated.
-
-### Migrate legacy storage to ZIP storage
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59003) in GitLab 13.11.
-
-GitLab tries to
-[automatically migrate](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54578)
-the old storage format to the new ZIP-based one when you upgrade to GitLab 13.11 or further.
-However, some projects may fail to be migrated for different reasons.
-To verify that all projects have been migrated successfully, you can manually run the migration:
-
-```shell
-sudo gitlab-rake gitlab:pages:migrate_legacy_storage
-```
-
-It's safe to interrupt this task and run it multiple times.
-
-There are two most common problems this task can report:
-
-- `Missing public directory` error:
-
- ```txt
- E, [2021-04-09T13:11:52.534768 #911919] ERROR -- : project_id: 1 /home/vlad/gdk/gitlab/shared/pages/gitlab-org/gitlab-test failed to be migrated in 0.07 seconds: Archive not created. Missing public directory in /home/vlad/gdk/gitlab/shared/pages/gitlab-org/gitlab-test
- ```
-
- In this case, you should verify that these projects don't have pages deployed, and re-run the migration with an additional flag to mark those projects as not deployed with GitLab Pages:
-
- ```shell
- sudo PAGES_MIGRATION_MARK_PROJECTS_AS_NOT_DEPLOYED=true gitlab-rake gitlab:pages:migrate_legacy_storage
- ```
-
-- File `is invalid` error:
-
- ```txt
- E, [2021-04-09T14:43:05.821767 #923322] ERROR -- : project_id: 1 /home/vlad/gdk/gitlab/shared/pages/gitlab-org/gitlab-test failed to be migrated: /home/vlad/gdk/gitlab/shared/pages/gitlab-org/gitlab-test/public/link is invalid, input_dir: /home/vlad/gdk/gitlab/shared/pages/gitlab-org/gitlab-test
- ```
-
- This error indicates invalid files on disk storage, most commonly symlinks leading outside of the `public` directory.
- You can manually remove these files, or just ignore them during migration:
-
- ```shell
- sudo PAGES_MIGRATION_IGNORE_INVALID_ENTRIES=true gitlab-rake gitlab:pages:migrate_legacy_storage
- ```
-
-### Rolling back ZIP migration
-
-If you find that migrated data is invalid, you can remove all migrated data by running:
-
-```shell
-sudo gitlab-rake gitlab:pages:clean_migrated_zip_storage
-```
-
-This does not remove any data from the legacy disk storage and the GitLab Pages daemon automatically falls back
-to using that.
+::EndTabs
### Migrate Pages deployments to object storage
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/325285) in GitLab 13.11.
+Existing Pages deployment objects (zip archives) can be stored in either:
-Existing Pages deployment objects (which store [ZIP archives](#zip-storage)) can similarly be
-migrated to [object storage](#using-object-storage).
+- Local storage
+- [Object storage](../object_storage.md)
Migrate your existing Pages deployments from local storage to object storage:
@@ -1071,9 +991,9 @@ sudo gitlab-rake gitlab:pages:deployments:migrate_to_object_storage
You can track progress and verify that all Pages deployments migrated successfully using the
[PostgreSQL console](https://docs.gitlab.com/omnibus/settings/database.html#connecting-to-the-bundled-postgresql-database):
-- `sudo gitlab-rails dbconsole` for Omnibus GitLab 14.1 and earlier.
-- `sudo gitlab-rails dbconsole --database main` for Omnibus GitLab 14.2 and later.
-- `sudo -u git -H psql -d gitlabhq_production` for source-installed instances.
+- `sudo gitlab-rails dbconsole` for Linux package installations running GitLab 14.1 and earlier.
+- `sudo gitlab-rails dbconsole --database main` for Linux package installations running 14.2 and later.
+- `sudo -u git -H psql -d gitlabhq_production` for self-compiled installations.
Verify `objectstg` below (where `store=2`) has count of all Pages deployments:
@@ -1100,7 +1020,7 @@ sudo gitlab-rake gitlab:pages:deployments:migrate_to_local
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/301159) in GitLab 13.11.
-If you use [object storage](#using-object-storage), you can disable local storage to avoid unnecessary disk usage/writes:
+If you use [object storage](#object-storage-settings), you can disable local storage to avoid unnecessary disk usage/writes:
1. Edit `/etc/gitlab/gitlab.rb`:
@@ -1110,34 +1030,18 @@ If you use [object storage](#using-object-storage), you can disable local storag
1. [Reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-package-installation) for the changes to take effect.
-Starting from GitLab 13.12, this setting also disables the [legacy storage](#migrate-legacy-storage-to-zip-storage), so if you were using NFS to serve Pages, you can completely disconnect from it.
-
-## Prepare GitLab Pages for 14.0
-
-In GitLab 14.0 a number of breaking changes were introduced which may require some user intervention.
-The steps below describe the best way to migrate without causing any downtime for your GitLab instance.
+## ZIP storage
-A GitLab instance running on a single server typically upgrades to 14.0 smoothly, and there should be minimal issues after the upgrade is complete.
-Regardless, you should follow the migration steps to ensure a successful upgrade.
-For common issues, see [troubleshooting](troubleshooting.md).
+In GitLab 14.0 the underlying storage format of GitLab Pages changed from
+files stored directly in disk to a single ZIP archive per project.
-If your current GitLab version is lower than 13.12, then you must first update to 13.12.
-Updating directly to 14.0 is [not supported](../../update/index.md#upgrade-paths)
-and may cause downtime for some web-sites hosted on GitLab Pages. After you update to 13.12,
-migrate GitLab Pages to prepare them for GitLab 14.0:
+These ZIP archives can be stored either locally on disk storage or on [object storage](#object-storage-settings) if it is configured.
-1. Set [`domain_config_source` to `gitlab`](#domain-source-configuration-before-140), which
-is the default starting from GitLab 14.0. Skip this step if you're already running GitLab 14.0 or above.
-1. If you want to store your pages content in [object storage](#using-object-storage), make sure to configure it.
-If you want to store the pages content locally or continue using an NFS server, skip this step.
-1. [Migrate legacy storage to ZIP storage.](#migrate-legacy-storage-to-zip-storage)
-1. If you have configured GitLab to store your pages content in [object storage](#using-object-storage),
- [migrate Pages deployments to object storage](#migrate-pages-deployments-to-object-storage)
-1. Upgrade GitLab to 14.0.
+[Starting from GitLab 13.5](https://gitlab.com/gitlab-org/gitlab/-/issues/245308) ZIP archives are stored every time pages site is updated.
## Backup
-GitLab Pages are part of the [regular backup](../../raketasks/backup_restore.md), so there is no separate backup to configure.
+GitLab Pages are part of the [regular backup](../../administration/backup_restore/index.md), so there is no separate backup to configure.
## Security
diff --git a/doc/administration/pages/source.md b/doc/administration/pages/source.md
index 2ee9dd653f0..26dedd47473 100644
--- a/doc/administration/pages/source.md
+++ b/doc/administration/pages/source.md
@@ -4,21 +4,17 @@ group: Knowledge
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
-# GitLab Pages administration for source installations **(FREE SELF)**
+# GitLab Pages administration for self-compiled installations **(FREE SELF)**
NOTE:
Before attempting to enable GitLab Pages, first make sure you have
[installed GitLab](../../install/installation.md) successfully.
-This document explains how to configure GitLab Pages when you have installed
-GitLab from source and not the Omnibus packages.
+This document explains how to configure GitLab Pages for self-compiled GitLab installations.
-You are encouraged to read the [Omnibus documentation](index.md) as it provides
-invaluable information about the configuration of GitLab Pages.
+For more information about configuring GitLab Pages for Linux Package installations (recommended), see the [Linux package documentation](index.md).
-We also highly recommend that you use the Omnibus GitLab packages. We
-optimize them specifically for GitLab, and we take care of upgrading GitLab
-Pages to the latest supported version.
+The advantage of using the Linux package installation is that it contains the latest supported version of GitLab Pages.
## How GitLab Pages works
@@ -491,7 +487,7 @@ To change this value:
## Backup
-Pages are part of the [regular backup](../../raketasks/backup_restore.md) so there is nothing to configure.
+Pages are part of the [regular backup](../../administration/backup_restore/index.md) so there is nothing to configure.
## Security
diff --git a/doc/administration/pages/troubleshooting.md b/doc/administration/pages/troubleshooting.md
index e829943f270..7e184631515 100644
--- a/doc/administration/pages/troubleshooting.md
+++ b/doc/administration/pages/troubleshooting.md
@@ -250,7 +250,7 @@ the shared pages directory is mounted on a different path on the main GitLab ser
GitLab Pages server.
In that case, it's highly recommended you to configure
-[object storage and migrate any existing pages data to it](index.md#using-object-storage).
+[object storage and migrate any existing pages data to it](index.md#object-storage-settings).
Alternatively, you can mount the GitLab Pages shared directory to the same path on
both servers.
@@ -259,7 +259,7 @@ both servers.
GitLab 14.0 introduces a number of changes to GitLab Pages which may require manual intervention.
-1. Firstly [follow the migration guide](index.md#prepare-gitlab-pages-for-140).
+1. Firstly [follow the migration guide](https://archives.docs.gitlab.com/14.10/ee/administration/pages/#prepare-gitlab-pages-for-140).
1. Try to upgrade to GitLab 14.3 or above. Some of the issues were fixed in GitLab 14.1, 14.2 and 14.3.
1. If it doesn't work, see [GitLab Pages logs](#how-to-see-gitlab-pages-logs), and if you see any errors there then search them on this page.
diff --git a/doc/administration/postgresql/database_load_balancing.md b/doc/administration/postgresql/database_load_balancing.md
index cc550dbe389..f8b6be1fb21 100644
--- a/doc/administration/postgresql/database_load_balancing.md
+++ b/doc/administration/postgresql/database_load_balancing.md
@@ -64,7 +64,7 @@ To enable Database Load Balancing, make sure that:
- The HA PostgreSQL setup has one or more secondary nodes replicating the primary.
- Each PostgreSQL node is connected with the same credentials and on the same port.
-For Omnibus GitLab, you also need PgBouncer configured on each PostgreSQL node to pool
+For Linux package installations, you also need PgBouncer configured on each PostgreSQL node to pool
all load-balanced connections when [configuring a multi-node setup](replication_and_failover.md).
## Configuring Database Load Balancing
@@ -112,7 +112,7 @@ checks a DNS `A` record, using the IPs returned by this record as the addresses
for the secondaries. For service discovery to work, all you need is a DNS server
and an `A` record containing the IP addresses of your secondaries.
-When using Omnibus GitLab the provided [Consul](../consul.md) service works as
+When using a Linux package installation, the provided [Consul](../consul.md) service works as
a DNS server and returns PostgreSQL addresses via the `postgresql-ha.service.consul`
record. For example:
diff --git a/doc/administration/postgresql/external.md b/doc/administration/postgresql/external.md
index 8f664f9809e..9c44d53213b 100644
--- a/doc/administration/postgresql/external.md
+++ b/doc/administration/postgresql/external.md
@@ -11,7 +11,7 @@ managed service for PostgreSQL. For example, AWS offers a managed Relational
Database Service (RDS) that runs PostgreSQL.
Alternatively, you may opt to manage your own PostgreSQL instance or cluster
-separate from the Omnibus GitLab package.
+separate from the Linux package.
If you use a cloud-managed service, or provide your own PostgreSQL instance:
diff --git a/doc/administration/postgresql/index.md b/doc/administration/postgresql/index.md
index e829397abc1..af0a86c3d72 100644
--- a/doc/administration/postgresql/index.md
+++ b/doc/administration/postgresql/index.md
@@ -13,32 +13,32 @@ be used with GitLab in one of our [reference architectures](../reference_archite
Choose one of the following PostgreSQL configuration options:
-### Standalone PostgreSQL using Omnibus GitLab
+### Standalone PostgreSQL for Linux package installations
-This setup is for when you have installed the
-[Omnibus GitLab packages](https://about.gitlab.com/install/) (CE or EE),
+This setup is for when you have installed GitLab by using the
+[Linux package](https://about.gitlab.com/install/) (CE or EE),
to use the bundled PostgreSQL having only its service enabled.
-Read how to [set up a standalone PostgreSQL instance](standalone.md) using Omnibus GitLab.
+Read how to [set up a standalone PostgreSQL instance](standalone.md) for Linux package installations.
### Provide your own PostgreSQL instance
This setup is for when you have installed GitLab using the
-[Omnibus GitLab packages](https://about.gitlab.com/install/) (CE or EE),
-or installed it [from source](../../install/installation.md), but you want to use
+[Linux package](https://about.gitlab.com/install/) (CE or EE),
+or [self-compiled](../../install/installation.md) your installation, but you want to use
your own external PostgreSQL server.
Read how to [set up an external PostgreSQL instance](external.md).
-### PostgreSQL replication and failover with Omnibus GitLab **(PREMIUM SELF)**
+### PostgreSQL replication and failover for Linux package installations **(PREMIUM SELF)**
This setup is for when you have installed GitLab using the
-[Omnibus GitLab **Enterprise Edition** (EE) package](https://about.gitlab.com/install/?version=ee).
+[Linux **Enterprise Edition** (EE) package](https://about.gitlab.com/install/?version=ee).
All the tools that are needed like PostgreSQL, PgBouncer, and Patroni are bundled in
the package, so you can use it to set up the whole PostgreSQL infrastructure (primary, replica).
-Read how to [set up PostgreSQL replication and failover](replication_and_failover.md) using Omnibus GitLab.
+Read how to [set up PostgreSQL replication and failover](replication_and_failover.md) for Linux package installations.
## Related topics
diff --git a/doc/administration/postgresql/multiple_databases.md b/doc/administration/postgresql/multiple_databases.md
index f03781d0ee2..5dcb080d707 100644
--- a/doc/administration/postgresql/multiple_databases.md
+++ b/doc/administration/postgresql/multiple_databases.md
@@ -65,7 +65,7 @@ copy the database across.
1. Configure GitLab to [use multiple databases](#set-up-multiple-databases).
-### Existing Omnibus installation
+### Existing Linux package installations
1. Stop GitLab, except for PostgreSQL:
@@ -103,7 +103,7 @@ the other way around.
1. For existing installations,
[migrate the data](#migrate-existing-installations) first.
-1. [Back up GitLab](../../raketasks/backup_restore.md)
+1. [Back up GitLab](../../administration/backup_restore/index.md)
in case of unforeseen issues.
1. Stop GitLab:
@@ -152,12 +152,12 @@ the other way around.
sudo service gitlab restart
```
-### Omnibus GitLab installations
+### Linux package installations
1. For existing installations,
[migrate the data](#migrate-existing-installations) first.
-1. [Back up GitLab](../../raketasks/backup_restore.md)
+1. [Back up GitLab](../../administration/backup_restore/index.md)
in case of unforeseen issues.
1. Stop GitLab:
diff --git a/doc/administration/postgresql/pgbouncer.md b/doc/administration/postgresql/pgbouncer.md
index 59aac9141a4..7e46933113b 100644
--- a/doc/administration/postgresql/pgbouncer.md
+++ b/doc/administration/postgresql/pgbouncer.md
@@ -25,9 +25,9 @@ This content has been moved to a [new location](replication_and_failover.md#conf
## PgBouncer as part of a non-fault-tolerant GitLab installation
-1. Generate PGBOUNCER_USER_PASSWORD_HASH with the command `gitlab-ctl pg-password-md5 pgbouncer`
+1. Generate `PGBOUNCER_USER_PASSWORD_HASH` with the command `gitlab-ctl pg-password-md5 pgbouncer`
-1. Generate SQL_USER_PASSWORD_HASH with the command `gitlab-ctl pg-password-md5 gitlab`. Enter the plaintext SQL_USER_PASSWORD later.
+1. Generate `SQL_USER_PASSWORD_HASH` with the command `gitlab-ctl pg-password-md5 gitlab`. Enter the plaintext SQL_USER_PASSWORD later.
1. On your database node, ensure the following is set in your `/etc/gitlab/gitlab.rb`
@@ -88,7 +88,7 @@ This content has been moved to a [new location](replication_and_failover.md#conf
Do not backup or restore GitLab through a PgBouncer connection: it causes a GitLab outage.
-[Read more about this and how to reconfigure backups](../../raketasks/backup_restore.md#back-up-and-restore-for-installations-using-pgbouncer).
+[Read more about this and how to reconfigure backups](../../administration/backup_restore/backup_gitlab.md#back-up-and-restore-for-installations-using-pgbouncer).
## Enable Monitoring
@@ -119,7 +119,7 @@ If you enable Monitoring, it must be enabled on **all** PgBouncer servers.
## Administrative console
-As part of Omnibus GitLab, a command is provided to automatically connect to the
+In Linux package installations, a command is provided to automatically connect to the
PgBouncer administrative console. See the
[PgBouncer documentation](https://www.pgbouncer.org/usage.html#admin-console)
for detailed instructions on how to interact with the console.
@@ -174,11 +174,11 @@ ote_pid | tls
## Procedure for bypassing PgBouncer
-### Omnibus installations
+### Linux package installations
Some database changes have to be done directly, and not through PgBouncer.
-The main affected tasks are [database restores](../../raketasks/backup_restore.md#back-up-and-restore-for-installations-using-pgbouncer)
+The main affected tasks are [database restores](../../administration/backup_restore/backup_gitlab.md#back-up-and-restore-for-installations-using-pgbouncer)
and [GitLab upgrades with database migrations](../../update/zero_downtime.md#postgresql).
1. To find the primary node, run the following on a database node:
@@ -208,8 +208,8 @@ After you've performed the tasks or procedure, switch back to using PgBouncer:
### Helm chart installations
-High-availability deployments also need to bypass PgBouncer for the same reasons as Omnibus-based ones.
-For this type of installation:
+High-availability deployments also need to bypass PgBouncer for the same reasons as Linux package-based ones.
+For Helm chart installations:
- Database backup and restore tasks are performed by the toolbox container.
- Migration tasks are performed by the migrations container.
@@ -226,7 +226,7 @@ In specific cases you may want to change the performance-specific and resource-s
throughput or to limit resource utilization that could cause memory exhaustion on the database.
You can find the parameters and respective documentation on the [official PgBouncer documentation](https://www.pgbouncer.org/config.html).
-Listed below are the most relevant ones and their defaults on an Omnibus GitLab installation:
+Listed below are the most relevant ones and their defaults on a Linux package installation:
- `pgbouncer['max_client_conn']` (default: `2048`, depends on server file descriptor limits)
This is the "frontend" pool in PgBouncer: connections from Rails to PgBouncer.
diff --git a/doc/administration/postgresql/replication_and_failover.md b/doc/administration/postgresql/replication_and_failover.md
index 392f9f2b89c..05ff6fa8a4a 100644
--- a/doc/administration/postgresql/replication_and_failover.md
+++ b/doc/administration/postgresql/replication_and_failover.md
@@ -4,21 +4,21 @@ group: Database
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
-# PostgreSQL replication and failover with Omnibus GitLab **(PREMIUM SELF)**
+# PostgreSQL replication and failover for Linux package installations **(PREMIUM SELF)**
If you're a Free user of GitLab self-managed, consider using a cloud-hosted solution.
This document doesn't cover installations from source.
If a setup with replication and failover isn't what you were looking for, see
the [database configuration document](https://docs.gitlab.com/omnibus/settings/database.html)
-for the Omnibus GitLab packages.
+for the Linux packages.
It's recommended to read this document fully before attempting to configure PostgreSQL with
replication and failover for GitLab.
## Architecture
-The Omnibus GitLab recommended configuration for a PostgreSQL cluster with
+The Linux pacakage-recommended configuration for a PostgreSQL cluster with
replication failover requires:
- A minimum of three PostgreSQL nodes.
@@ -73,9 +73,9 @@ sure you have redundant connectivity between all Database and GitLab instances
to avoid the network becoming a single point of failure.
NOTE:
-As of GitLab 13.3, PostgreSQL 12 is shipped with Omnibus GitLab. Clustering for PostgreSQL 12 is supported only with
+As of GitLab 13.3, PostgreSQL 12 is shipped with Linux package installations. Clustering for PostgreSQL 12 is supported only with
Patroni. See the [Patroni](#patroni) section for further details. Starting with GitLab 14.0, only PostgreSQL 12 is
-shipped with Omnibus GitLab, and thus Patroni becomes mandatory for replication and failover.
+shipped with Linux package installations, and thus Patroni becomes mandatory for replication and failover.
### Database node
@@ -152,7 +152,7 @@ This is why you need:
When using default setup, minimum configuration requires:
-- `CONSUL_USERNAME`. The default user for Omnibus GitLab is `gitlab-consul`
+- `CONSUL_USERNAME`. The default user for Linux package installations is `gitlab-consul`
- `CONSUL_DATABASE_PASSWORD`. Password for the database user.
- `CONSUL_PASSWORD_HASH`. This is a hash generated out of Consul username/password pair. It can be generated with:
@@ -192,7 +192,7 @@ server nodes on hand.
You need the following password information for the application's database user:
-- `POSTGRESQL_USERNAME`. The default user for Omnibus GitLab is `gitlab`
+- `POSTGRESQL_USERNAME`. The default user for Linux package installations is `gitlab`
- `POSTGRESQL_USER_PASSWORD`. The password for the database user
- `POSTGRESQL_PASSWORD_HASH`. This is a hash generated out of the username/password pair.
It can be generated with:
@@ -212,7 +212,7 @@ You need the following password information for the Patroni API:
When using a default setup, the minimum configuration requires:
-- `PGBOUNCER_USERNAME`. The default user for Omnibus GitLab is `pgbouncer`
+- `PGBOUNCER_USERNAME`. The default user for Linux package installations is `pgbouncer`
- `PGBOUNCER_PASSWORD`. This is a password for PgBouncer service.
- `PGBOUNCER_PASSWORD_HASH`. This is a hash generated out of PgBouncer username/password pair. It can be generated with:
@@ -230,10 +230,9 @@ Few things to remember about the service itself:
- `/etc/gitlab/gitlab.rb`: hashed, and in plain text
- `/var/opt/gitlab/pgbouncer/pg_auth`: hashed
-### Installing Omnibus GitLab
+### Installing the Linux package
-First, make sure to [download/install](https://about.gitlab.com/install/)
-Omnibus GitLab **on each node**.
+First, make sure to [download and install](https://about.gitlab.com/install/) the Linux package **on each node**.
Make sure you install the necessary dependencies from step 1,
add GitLab package repository from step 2.
@@ -373,7 +372,7 @@ patroni['tls_key_password'] = 'private-key-password' # This is the plain-text pa
```
If you are using a self-signed certificate or an internal CA, you need to either disable the TLS verification or pass the certificate of the
-internal CA, otherwise you may run into an unexpected error when using the `gitlab-ctl patroni ....` commands. Omnibus ensures that Patroni API
+internal CA, otherwise you may run into an unexpected error when using the `gitlab-ctl patroni ....` commands. The Linux package ensures that Patroni API
clients honor this configuration.
TLS certificate verification is enabled by default. To disable it:
@@ -415,7 +414,7 @@ authentication mode (`patroni['tls_client_mode']`), must each have the same valu
1. Make sure you collect [`CONSUL_SERVER_NODES`](#consul-information), [`CONSUL_PASSWORD_HASH`](#consul-information), and [`PGBOUNCER_PASSWORD_HASH`](#pgbouncer-information) before executing the next step.
-1. One each node, edit the `/etc/gitlab/gitlab.rb` configuration file and replace values noted in the `# START user configuration` section as below:
+1. On each node, edit the `/etc/gitlab/gitlab.rb` configuration file and replace values noted in the `# START user configuration` section as below:
```ruby
# Disable all components except PgBouncer and Consul agent
@@ -571,7 +570,7 @@ in the Troubleshooting section before proceeding.
Do not backup or restore GitLab through a PgBouncer connection: this causes a GitLab outage.
-[Read more about this and how to reconfigure backups](../../raketasks/backup_restore.md#back-up-and-restore-for-installations-using-pgbouncer).
+[Read more about this and how to reconfigure backups](../../administration/backup_restore/backup_gitlab.md#back-up-and-restore-for-installations-using-pgbouncer).
### Ensure GitLab is running
@@ -837,7 +836,7 @@ Read more about the data returned by the replica
### Selecting the appropriate Patroni replication method
-[Review the Patroni documentation carefully](https://patroni.readthedocs.io/en/latest/SETTINGS.html#postgresql)
+[Review the Patroni documentation carefully](https://patroni.readthedocs.io/en/latest/yaml_configuration.html#postgresql)
before making changes as **_some of the options carry a risk of potential data
loss if not fully understood_**. The [replication mode](https://patroni.readthedocs.io/en/latest/replication_modes.html)
configured determines the amount of tolerable data loss.
@@ -845,7 +844,7 @@ configured determines the amount of tolerable data loss.
WARNING:
Replication is not a backup strategy! There is no replacement for a well-considered and tested backup solution.
-Omnibus GitLab defaults [`synchronous_commit`](https://www.postgresql.org/docs/11/runtime-config-wal.html#GUC-SYNCHRONOUS-COMMIT) to `on`.
+Linux package installations default [`synchronous_commit`](https://www.postgresql.org/docs/11/runtime-config-wal.html#GUC-SYNCHRONOUS-COMMIT) to `on`.
```ruby
postgresql['synchronous_commit'] = 'on'
@@ -854,7 +853,7 @@ gitlab['geo-postgresql']['synchronous_commit'] = 'on'
#### Customizing Patroni failover behavior
-Omnibus GitLab exposes several options allowing more control over the [Patroni restoration process](#recovering-the-patroni-cluster).
+Linux package installations expose several options allowing more control over the [Patroni restoration process](#recovering-the-patroni-cluster).
Each option is shown below with its default value in `/etc/gitlab/gitlab.rb`.
@@ -864,7 +863,7 @@ patroni['remove_data_directory_on_rewind_failure'] = false
patroni['remove_data_directory_on_diverged_timelines'] = false
```
-[The upstream documentation is always more up to date](https://patroni.readthedocs.io/en/latest/SETTINGS.html#postgresql), but the table below should provide a minimal overview of functionality.
+[The upstream documentation is always more up to date](https://patroni.readthedocs.io/en/latest/patroni_configuration.html), but the table below should provide a minimal overview of functionality.
|Setting|Overview|
|-|-|
@@ -996,7 +995,9 @@ You can switch an exiting database cluster to use Patroni instead of repmgr with
### Upgrading PostgreSQL major version in a Patroni cluster
-As of GitLab 14.1, PostgreSQL 12.6 and 13.3 are both shipped with Omnibus GitLab by default. As of GitLab 15.0, PostgreSQL 13 is the default. If you want to upgrade to PostgreSQL 13 in versions prior to GitLab 15.0, you must ask for it explicitly.
+As of GitLab 14.1, PostgreSQL 12.6 and 13.3 are both shipped with the Linux package by default. As of GitLab 15.0,
+PostgreSQL 13 is the default. If you want to upgrade to PostgreSQL 13 in versions prior to GitLab 15.0, you must ask for
+it explicitly.
WARNING:
The procedure for upgrading PostgreSQL in a Patroni cluster is different than when upgrading using repmgr.
@@ -1466,9 +1467,9 @@ Workarounds:
- If set to enforcing, SELinux may also prevent these operations. Verify the issue is fixed by setting
SELinux to permissive.
-Patroni first shipped in Omnibus GitLab 13.1, along with a build of Python 3.7.
+Patroni first shipped in the Linux package for GitLab 13.1, along with a build of Python 3.7.
The code which causes this was removed in Python 3.8: this fix shipped in
-[Omnibus GitLab 14.3](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/5547)
+[the Linux package for GitLab 14.3](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/5547)
and later, removing the need for a workaround.
### Errors running `gitlab-ctl`
diff --git a/doc/administration/postgresql/standalone.md b/doc/administration/postgresql/standalone.md
index d00310ecee0..d6f3460e255 100644
--- a/doc/administration/postgresql/standalone.md
+++ b/doc/administration/postgresql/standalone.md
@@ -4,19 +4,19 @@ group: Database
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
-# Standalone PostgreSQL using Omnibus GitLab **(FREE SELF)**
+# Standalone PostgreSQL for Linux package installations **(FREE SELF)**
If you wish to have your database service hosted separately from your GitLab
application servers, you can do this using the PostgreSQL binaries packaged
-together with Omnibus GitLab. This is recommended as part of our
+together with the Linux package. This is recommended as part of our
[reference architecture for up to 2,000 users](../reference_architectures/2k_users.md).
## Setting it up
1. SSH in to the PostgreSQL server.
-1. [Download and install](https://about.gitlab.com/install/) the Omnibus GitLab
- package you want using *steps 1 and 2* from the GitLab downloads page.
- - Do not complete any other steps on the download page.
+1. [Download and install](https://about.gitlab.com/install/) the Linux
+ package you want using *steps 1 and 2* from the GitLab downloads page. Do not complete any other steps on the
+ download page.
1. Generate a password hash for PostgreSQL. This assumes you are using the default
username of `gitlab` (recommended). The command requests a password
and confirmation. Use the value that is output by this command in the next
diff --git a/doc/administration/raketasks/check.md b/doc/administration/raketasks/check.md
index e55a0f1c8a7..9ced19b53b7 100644
--- a/doc/administration/raketasks/check.md
+++ b/doc/administration/raketasks/check.md
@@ -42,17 +42,17 @@ This task loops through the project code repositories and runs the integrity che
described previously. If a project uses a pool repository, that is also checked.
Other types of Git repositories [are not checked](https://gitlab.com/gitlab-org/gitaly/-/issues/3643).
-**Omnibus Installation**
+- Linux package installations:
-```shell
-sudo gitlab-rake gitlab:git:fsck
-```
+ ```shell
+ sudo gitlab-rake gitlab:git:fsck
+ ```
-**Source Installation**
+- Self-compiled installations:
-```shell
-sudo -u git -H bundle exec rake gitlab:git:fsck RAILS_ENV=production
-```
+ ```shell
+ sudo -u git -H bundle exec rake gitlab:git:fsck RAILS_ENV=production
+ ```
## Checksum of repository refs
@@ -73,17 +73,17 @@ checksums in the format `<PROJECT ID>,<CHECKSUM>`.
- If a repository exists but is empty, the output checksum is `0000000000000000000000000000000000000000`.
- Projects which don't exist are skipped.
-**Omnibus Installation**
+- Linux package installations:
-```shell
-sudo gitlab-rake gitlab:git:checksum_projects
-```
+ ```shell
+ sudo gitlab-rake gitlab:git:checksum_projects
+ ```
-**Source Installation**
+- Self-compiled installations:
-```shell
-sudo -u git -H bundle exec rake gitlab:git:checksum_projects RAILS_ENV=production
-```
+ ```shell
+ sudo -u git -H bundle exec rake gitlab:git:checksum_projects RAILS_ENV=production
+ ```
For example, if:
@@ -124,23 +124,23 @@ Integrity checks are supported for the following types of file:
- Project-level Secure Files (introduced in GitLab 16.1.0)
- User uploads (introduced in GitLab 10.6.0)
-**Omnibus Installation**
+- Linux package installations:
-```shell
-sudo gitlab-rake gitlab:artifacts:check
-sudo gitlab-rake gitlab:ci_secure_files:check
-sudo gitlab-rake gitlab:lfs:check
-sudo gitlab-rake gitlab:uploads:check
-```
+ ```shell
+ sudo gitlab-rake gitlab:artifacts:check
+ sudo gitlab-rake gitlab:ci_secure_files:check
+ sudo gitlab-rake gitlab:lfs:check
+ sudo gitlab-rake gitlab:uploads:check
+ ```
-**Source Installation**
+- Self-compiled installations:
-```shell
-sudo -u git -H bundle exec rake gitlab:artifacts:check RAILS_ENV=production
-sudo -u git -H bundle exec rake gitlab:ci_secure_files:check RAILS_ENV=production
-sudo -u git -H bundle exec rake gitlab:lfs:check RAILS_ENV=production
-sudo -u git -H bundle exec rake gitlab:uploads:check RAILS_ENV=production
-```
+ ```shell
+ sudo -u git -H bundle exec rake gitlab:artifacts:check RAILS_ENV=production
+ sudo -u git -H bundle exec rake gitlab:ci_secure_files:check RAILS_ENV=production
+ sudo -u git -H bundle exec rake gitlab:lfs:check RAILS_ENV=production
+ sudo -u git -H bundle exec rake gitlab:uploads:check RAILS_ENV=production
+ ```
These tasks also accept some environment variables which you can use to override
certain values:
@@ -215,22 +215,22 @@ secrets file (`gitlab-secrets.json`).
Automatic resolution is not yet implemented. If you have values that
cannot be decrypted, you can follow steps to reset them, see our
-documentation on what to do [when the secrets file is lost](../../raketasks/backup_restore.md#when-the-secrets-file-is-lost).
+documentation on what to do [when the secrets file is lost](../../administration/backup_restore/backup_gitlab.md#when-the-secrets-file-is-lost).
This can take a very long time, depending on the size of your
database, as it checks all rows in all tables.
-**Omnibus Installation**
+- Linux package installations:
-```shell
-sudo gitlab-rake gitlab:doctor:secrets
-```
+ ```shell
+ sudo gitlab-rake gitlab:doctor:secrets
+ ```
-**Source Installation**
+- Self-compiled installations:
-```shell
-bundle exec rake gitlab:doctor:secrets RAILS_ENV=production
-```
+ ```shell
+ bundle exec rake gitlab:doctor:secrets RAILS_ENV=production
+ ```
**Example output**
@@ -251,17 +251,17 @@ I, [2020-06-11T17:18:15.575711 #27148] INFO -- : Done!
To get more detailed information about which rows and columns can't be
decrypted, you can pass a `VERBOSE` environment variable:
-**Omnibus Installation**
+- Linux package installations:
-```shell
-sudo gitlab-rake gitlab:doctor:secrets VERBOSE=1
-```
+ ```shell
+ sudo gitlab-rake gitlab:doctor:secrets VERBOSE=1
+ ```
-**Source Installation**
+- Self-compiled installations:
-```shell
-bundle exec rake gitlab:doctor:secrets RAILS_ENV=production VERBOSE=1
-```
+ ```shell
+ bundle exec rake gitlab:doctor:secrets RAILS_ENV=production VERBOSE=1
+ ```
**Example verbose output**
diff --git a/doc/administration/raketasks/geo.md b/doc/administration/raketasks/geo.md
index 03b09e00f1c..c6bc891f529 100644
--- a/doc/administration/raketasks/geo.md
+++ b/doc/administration/raketasks/geo.md
@@ -18,17 +18,17 @@ next repository sync in a **secondary** node:
This is equivalent of running `git repack -d` on a _bare_ repository.
-**Omnibus Installation**
+- Linux package installations:
-```shell
-sudo gitlab-rake geo:git:housekeeping:incremental_repack
-```
+ ```shell
+ sudo gitlab-rake geo:git:housekeeping:incremental_repack
+ ```
-**Source Installation**
+- Self-compiled installations:
-```shell
-sudo -u git -H bundle exec rake geo:git:housekeeping:incremental_repack RAILS_ENV=production
-```
+ ```shell
+ sudo -u git -H bundle exec rake geo:git:housekeeping:incremental_repack RAILS_ENV=production
+ ```
### Full Repack
@@ -36,48 +36,48 @@ This is equivalent of running `git repack -d -A --pack-kept-objects` on a
_bare_ repository which optionally, writes a reachability bitmap index
when this is enabled in GitLab.
-**Omnibus Installation**
+- Linux package installations:
-```shell
-sudo gitlab-rake geo:git:housekeeping:full_repack
-```
+ ```shell
+ sudo gitlab-rake geo:git:housekeeping:full_repack
+ ```
-**Source Installation**
+- Self-compiled installations:
-```shell
-sudo -u git -H bundle exec rake geo:git:housekeeping:full_repack RAILS_ENV=production
-```
+ ```shell
+ sudo -u git -H bundle exec rake geo:git:housekeeping:full_repack RAILS_ENV=production
+ ```
### GC
This is equivalent of running `git gc` on a _bare_ repository, optionally writing
a reachability bitmap index when this is enabled in GitLab.
-**Omnibus Installation**
+- Linux package installations:
-```shell
-sudo gitlab-rake geo:git:housekeeping:gc
-```
+ ```shell
+ sudo gitlab-rake geo:git:housekeeping:gc
+ ```
-**Source Installation**
+- Self-compiled installations:
-```shell
-sudo -u git -H bundle exec rake geo:git:housekeeping:gc RAILS_ENV=production
-```
+ ```shell
+ sudo -u git -H bundle exec rake geo:git:housekeeping:gc RAILS_ENV=production
+ ```
## Remove orphaned project registries
Under certain conditions your project registry can contain obsolete records, you
can remove them using the Rake task `geo:run_orphaned_project_registry_cleaner`:
-**Omnibus Installation**
+- Linux package installations:
-```shell
-sudo gitlab-rake geo:run_orphaned_project_registry_cleaner
-```
+ ```shell
+ sudo gitlab-rake geo:run_orphaned_project_registry_cleaner
+ ```
-**Source Installation**
+- Self-compiled installations:
-```shell
-sudo -u git -H bundle exec rake geo:run_orphaned_project_registry_cleaner RAILS_ENV=production
-```
+ ```shell
+ sudo -u git -H bundle exec rake geo:run_orphaned_project_registry_cleaner RAILS_ENV=production
+ ```
diff --git a/doc/administration/raketasks/ldap.md b/doc/administration/raketasks/ldap.md
index f6c5f84c500..4a657b04bdc 100644
--- a/doc/administration/raketasks/ldap.md
+++ b/doc/administration/raketasks/ldap.md
@@ -15,17 +15,17 @@ The LDAP check Rake task tests the `bind_dn` and `password` credentials
executed as part of the `gitlab:check` task, but can run independently
using the command below.
-**Omnibus Installation**
+- Linux package installations:
-```shell
-sudo gitlab-rake gitlab:ldap:check
-```
+ ```shell
+ sudo gitlab-rake gitlab:ldap:check
+ ```
-**Source Installation**
+- Self-compiled installations:
-```shell
-sudo -u git -H bundle exec rake gitlab:ldap:check RAILS_ENV=production
-```
+ ```shell
+ sudo -u git -H bundle exec rake gitlab:ldap:check RAILS_ENV=production
+ ```
By default, the task returns a sample of 100 LDAP users. Change this
limit by passing a number to the check task:
@@ -47,17 +47,17 @@ If you'd like to change the frequency at which a group sync is performed,
[adjust the cron schedule](../auth/ldap/ldap_synchronization.md#adjust-ldap-group-sync-schedule)
instead.
-**Omnibus Installation**
+- Linux package installations:
-```shell
-sudo gitlab-rake gitlab:ldap:group_sync
-```
+ ```shell
+ sudo gitlab-rake gitlab:ldap:group_sync
+ ```
-**Source Installation**
+- Self-compiled installations:
-```shell
-bundle exec rake gitlab:ldap:group_sync
-```
+ ```shell
+ bundle exec rake gitlab:ldap:group_sync
+ ```
## Rename a provider
@@ -86,17 +86,17 @@ If you input an incorrect new provider, users cannot sign in. If this happens,
run the task again with the incorrect provider as the `old_provider` and the
correct provider as the `new_provider`.
-**Omnibus Installation**
+- Linux package installations:
-```shell
-sudo gitlab-rake gitlab:ldap:rename_provider[old_provider,new_provider]
-```
+ ```shell
+ sudo gitlab-rake gitlab:ldap:rename_provider[old_provider,new_provider]
+ ```
-**Source Installation**
+- Self-compiled installations:
-```shell
-bundle exec rake gitlab:ldap:rename_provider[old_provider,new_provider] RAILS_ENV=production
-```
+ ```shell
+ bundle exec rake gitlab:ldap:rename_provider[old_provider,new_provider] RAILS_ENV=production
+ ```
### Example
@@ -123,17 +123,17 @@ User identities were successfully updated
If you do not specify an `old_provider` and `new_provider` the task prompts you
for them:
-**Omnibus Installation**
+- Linux package installations:
-```shell
-sudo gitlab-rake gitlab:ldap:rename_provider
-```
+ ```shell
+ sudo gitlab-rake gitlab:ldap:rename_provider
+ ```
-**Source Installation**
+- Self-compiled installations:
-```shell
-bundle exec rake gitlab:ldap:rename_provider RAILS_ENV=production
-```
+ ```shell
+ bundle exec rake gitlab:ldap:rename_provider RAILS_ENV=production
+ ```
**Example output:**
@@ -158,17 +158,17 @@ The following Rake tasks are provided for updating the contents of the encrypted
Show the contents of the current LDAP secrets.
-**Omnibus Installation**
+- Linux package installations:
-```shell
-sudo gitlab-rake gitlab:ldap:secret:show
-```
+ ```shell
+ sudo gitlab-rake gitlab:ldap:secret:show
+ ```
-**Source Installation**
+- Self-compiled installations:
-```shell
-bundle exec rake gitlab:ldap:secret:show RAILS_ENV=production
-```
+ ```shell
+ bundle exec rake gitlab:ldap:secret:show RAILS_ENV=production
+ ```
**Example output:**
@@ -182,33 +182,33 @@ main:
Opens the secret contents in your editor, and writes the resulting content to the encrypted secret file when you exit.
-**Omnibus Installation**
+- Linux package installations:
-```shell
-sudo gitlab-rake gitlab:ldap:secret:edit EDITOR=vim
-```
+ ```shell
+ sudo gitlab-rake gitlab:ldap:secret:edit EDITOR=vim
+ ```
-**Source Installation**
+- Self-compiled installations:
-```shell
-bundle exec rake gitlab:ldap:secret:edit RAILS_ENV=production EDITOR=vim
-```
+ ```shell
+ bundle exec rake gitlab:ldap:secret:edit RAILS_ENV=production EDITOR=vim
+ ```
### Write raw secret
Write new secret content by providing it on STDIN.
-**Omnibus Installation**
+- Linux package installations:
-```shell
-echo -e "main:\n password: '123'" | sudo gitlab-rake gitlab:ldap:secret:write
-```
+ ```shell
+ echo -e "main:\n password: '123'" | sudo gitlab-rake gitlab:ldap:secret:write
+ ```
-**Source Installation**
+- Self-compiled installations:
-```shell
-echo -e "main:\n password: '123'" | bundle exec rake gitlab:ldap:secret:write RAILS_ENV=production
-```
+ ```shell
+ echo -e "main:\n password: '123'" | bundle exec rake gitlab:ldap:secret:write RAILS_ENV=production
+ ```
### Secrets examples
diff --git a/doc/administration/raketasks/maintenance.md b/doc/administration/raketasks/maintenance.md
index 50c4b004f9c..c2c6429ba8b 100644
--- a/doc/administration/raketasks/maintenance.md
+++ b/doc/administration/raketasks/maintenance.md
@@ -13,17 +13,17 @@ GitLab provides Rake tasks for general maintenance.
This command gathers information about your GitLab installation and the system it runs on.
These may be useful when asking for help or reporting issues. In a multi-node environment, run this command on nodes running GitLab Rails to avoid PostgreSQL socket errors.
-**Omnibus Installation**
+- Linux package installations:
-```shell
-sudo gitlab-rake gitlab:env:info
-```
+ ```shell
+ sudo gitlab-rake gitlab:env:info
+ ```
-**Source Installation**
+- Self-compiled installations:
-```shell
-bundle exec rake gitlab:env:info RAILS_ENV=production
-```
+ ```shell
+ bundle exec rake gitlab:env:info RAILS_ENV=production
+ ```
Example output:
@@ -69,24 +69,24 @@ GitLab Shell path: /opt/gitlab/embedded/service/gitlab-shell
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20501) in GitLab 12.6.
> - Moved to GitLab Premium in 13.9.
-This command shows information about your [GitLab license](../../user/admin_area/license.md) and
+This command shows information about your [GitLab license](../../administration/license.md) and
how many seats are used. It is only available on GitLab Enterprise
installations: a license cannot be installed into GitLab Community Edition.
These may be useful when raising tickets with Support, or for programmatically
checking your license parameters.
-**Omnibus Installation**
+- Linux package installations:
-```shell
-sudo gitlab-rake gitlab:license:info
-```
+ ```shell
+ sudo gitlab-rake gitlab:license:info
+ ```
-**Source Installation**
+- Self-compiled installations:
-```shell
-bundle exec rake gitlab:license:info RAILS_ENV=production
-```
+ ```shell
+ bundle exec rake gitlab:license:info RAILS_ENV=production
+ ```
Example output:
@@ -117,24 +117,24 @@ If you're running Geo, see also the [Geo Health check Rake task](../geo/replicat
You may also have a look at our troubleshooting guides for:
-- [GitLab](../troubleshooting/index.md)
-- [Omnibus GitLab](https://docs.gitlab.com/omnibus/index.html#troubleshooting)
+- [GitLab](../troubleshooting/index.md).
+- [Linux package installations](https://docs.gitlab.com/omnibus/index.html#troubleshooting).
Additionally you should also [verify database values can be decrypted using the current secrets](check.md#verify-database-values-can-be-decrypted-using-the-current-secrets).
To run `gitlab:check`, run:
-**Omnibus Installation**
+- Linux package installations:
-```shell
-sudo gitlab-rake gitlab:check
-```
+ ```shell
+ sudo gitlab-rake gitlab:check
+ ```
-**Source Installation**
+- Self-compiled installations:
-```shell
-bundle exec rake gitlab:check RAILS_ENV=production
-```
+ ```shell
+ bundle exec rake gitlab:check RAILS_ENV=production
+ ```
Use `SANITIZE=true` for `gitlab:check` if you want to omit project names from the output.
@@ -190,18 +190,18 @@ for example, if after an upgrade you receive `Permission denied (publickey)` whe
and find `404 Key Not Found` errors in [the `gitlab-shell.log` file](../logs/index.md#gitlab-shelllog).
To rebuild `authorized_keys`, run:
-**Omnibus Installation**
+- Linux package installations:
-```shell
-sudo gitlab-rake gitlab:shell:setup
-```
+ ```shell
+ sudo gitlab-rake gitlab:shell:setup
+ ```
-**Source Installation**
+- Self-compiled installations:
-```shell
-cd /home/git/gitlab
-sudo -u git -H bundle exec rake gitlab:shell:setup RAILS_ENV=production
-```
+ ```shell
+ cd /home/git/gitlab
+ sudo -u git -H bundle exec rake gitlab:shell:setup RAILS_ENV=production
+ ```
Example output:
@@ -216,18 +216,18 @@ Do you want to continue (yes/no)? yes
If for some reason the dashboard displays the wrong information, you might want to
clear Redis' cache. To do this, run:
-**Omnibus Installation**
+- Linux package installations:
-```shell
-sudo gitlab-rake cache:clear
-```
+ ```shell
+ sudo gitlab-rake cache:clear
+ ```
-**Source Installation**
+- Self-compiled installations:
-```shell
-cd /home/git/gitlab
-sudo -u git -H bundle exec rake cache:clear RAILS_ENV=production
-```
+ ```shell
+ cd /home/git/gitlab
+ sudo -u git -H bundle exec rake cache:clear RAILS_ENV=production
+ ```
## Precompile the assets
@@ -235,24 +235,24 @@ Sometimes during version upgrades you might end up with some wrong CSS or
missing some icons. In that case, try to precompile the assets again.
This Rake task only applies to source installations. [Read more](../../update/package/index.md#missing-asset-files)
-about troubleshooting this problem when running the Omnibus GitLab package.
-The guidance for Omnibus GitLab might be applicable for Kubernetes and Docker Omnibus
+about troubleshooting this problem when running the Linux package.
+The guidance for Linux package might be applicable for Kubernetes and Docker
deployments of GitLab, though in general, container-based installations
don't have issues with missing assets.
-**Source Installation**
+- Self-compiled installations:
-```shell
-cd /home/git/gitlab
-sudo -u git -H bundle exec rake gitlab:assets:compile RAILS_ENV=production
-```
+ ```shell
+ cd /home/git/gitlab
+ sudo -u git -H bundle exec rake gitlab:assets:compile RAILS_ENV=production
+ ```
-For omnibus versions, the unoptimized assets (JavaScript, CSS) are frozen at
-the release of upstream GitLab. The omnibus version includes optimized versions
+For Linux package installations, the unoptimized assets (JavaScript, CSS) are frozen at
+the release of upstream GitLab. The Linux package installation includes optimized versions
of those assets. Unless you are modifying the JavaScript / CSS code on your
production machine after installing the package, there should be no reason to redo
`rake gitlab:assets:compile` on the production machine. If you suspect that assets
-have been corrupted, you should reinstall the omnibus package.
+have been corrupted, you should reinstall the Linux package.
## Check TCP connectivity to a remote site
@@ -261,18 +261,18 @@ service on another machine (for example a PostgreSQL or web server)
to troubleshoot proxy issues.
A Rake task is included to help you with this.
-**Omnibus Installation**
+- Linux package installations:
-```shell
-sudo gitlab-rake gitlab:tcp_check[example.com,80]
-```
+ ```shell
+ sudo gitlab-rake gitlab:tcp_check[example.com,80]
+ ```
-**Source Installation**
+- Self-compiled installations:
-```shell
-cd /home/git/gitlab
-sudo -u git -H bundle exec rake gitlab:tcp_check[example.com,80] RAILS_ENV=production
-```
+ ```shell
+ cd /home/git/gitlab
+ sudo -u git -H bundle exec rake gitlab:tcp_check[example.com,80] RAILS_ENV=production
+ ```
## Clear exclusive lease (DANGER)
@@ -410,3 +410,16 @@ To re-import the metrics you can run:
```shell
sudo gitlab-rake metrics:setup_common_metrics
```
+
+## Troubleshooting
+
+### Advisory lock connection information
+
+After running the `db:migrate` Rake task, you may see output like the following:
+
+```shell
+main: == [advisory_lock_connection] object_id: 173580, pg_backend_pid: 5532
+main: == [advisory_lock_connection] object_id: 173580, pg_backend_pid: 5532
+```
+
+The messages returned are informational and can be ignored.
diff --git a/doc/administration/raketasks/praefect.md b/doc/administration/raketasks/praefect.md
index 1f9eb06f567..ba2a135cb01 100644
--- a/doc/administration/raketasks/praefect.md
+++ b/doc/administration/raketasks/praefect.md
@@ -20,14 +20,14 @@ Rake tasks are available for projects that have been created on Praefect storage
Run this Rake task on the node that GitLab is installed and not on the node that Praefect is installed.
-**Omnibus Installation**
+- Linux package installations:
-```shell
-sudo gitlab-rake "gitlab:praefect:replicas[project_id]"
-```
+ ```shell
+ sudo gitlab-rake "gitlab:praefect:replicas[project_id]"
+ ```
-**Source Installation**
+- Self-compiled installations:
-```shell
-sudo -u git -H bundle exec rake "gitlab:praefect:replicas[project_id]" RAILS_ENV=production
-```
+ ```shell
+ sudo -u git -H bundle exec rake "gitlab:praefect:replicas[project_id]" RAILS_ENV=production
+ ```
diff --git a/doc/administration/raketasks/project_import_export.md b/doc/administration/raketasks/project_import_export.md
index 17a0eb46a30..36013803999 100644
--- a/doc/administration/raketasks/project_import_export.md
+++ b/doc/administration/raketasks/project_import_export.md
@@ -33,7 +33,7 @@ Parameters:
bundle exec rake "gitlab:import_export:import[root, group/subgroup, testingprojectimport, /path/to/file.tar.gz]"
```
-If you're running Omnibus, run the following Rake task:
+If you're running a Linux package installation, run the following Rake task:
```shell
gitlab-rake "gitlab:import_export:import[root, group/subgroup, testingprojectimport, /path/to/file.tar.gz]"
@@ -99,10 +99,10 @@ To fix the issue:
1. Change the file permissions to `0400`.
1. Move the file to a public folder (for example `/tmp/`).
-### `Name can contain only letters, digits, emojis ...`
+### `Name can contain only letters, digits, emoji ...`
```plaintext
-Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces. It must start with a letter,
+Name can contain only letters, digits, emoji, '_', '.', '+', dashes, or spaces. It must start with a letter,
digit, emoji, or '_', and Path can contain only letters, digits, '_', '-', or '.'. It cannot start
with '-', end in '.git', or end in '.atom'.
```
diff --git a/doc/administration/raketasks/service_desk_email.md b/doc/administration/raketasks/service_desk_email.md
index 1cbdec35171..9bf0846fef2 100644
--- a/doc/administration/raketasks/service_desk_email.md
+++ b/doc/administration/raketasks/service_desk_email.md
@@ -12,7 +12,7 @@ The following are Service Desk email-related Rake tasks.
## Secrets
-GitLab can use [Service Desk email](../../user/project/service_desk.md#configure-a-custom-mailbox) secrets read from an encrypted file instead of storing them in plaintext in the file system. The following Rake tasks are provided for updating the contents of the encrypted file.
+GitLab can use [Service Desk email](../../user/project/service_desk.md#configure-service-desk-alias-email) secrets read from an encrypted file instead of storing them in plaintext in the file system. The following Rake tasks are provided for updating the contents of the encrypted file.
### Show secret
diff --git a/doc/administration/raketasks/smtp.md b/doc/administration/raketasks/smtp.md
index 5e9e3544902..3cb161345cb 100644
--- a/doc/administration/raketasks/smtp.md
+++ b/doc/administration/raketasks/smtp.md
@@ -18,17 +18,17 @@ GitLab can use SMTP configuration secrets to read from an encrypted file. The fo
Show the contents of the current SMTP secrets.
-**Omnibus Installation**
+- Linux package installations:
-```shell
-sudo gitlab-rake gitlab:smtp:secret:show
-```
+ ```shell
+ sudo gitlab-rake gitlab:smtp:secret:show
+ ```
-**Source Installation**
+- Self-compiled installations:
-```shell
-bundle exec rake gitlab:smtp:secret:show RAILS_ENV=production
-```
+ ```shell
+ bundle exec rake gitlab:smtp:secret:show RAILS_ENV=production
+ ```
**Example output:**
@@ -41,33 +41,33 @@ user_name: 'gitlab-inst'
Opens the secret contents in your editor, and writes the resulting content to the encrypted secret file when you exit.
-**Omnibus Installation**
+- Linux package installations:
-```shell
-sudo gitlab-rake gitlab:smtp:secret:edit EDITOR=vim
-```
+ ```shell
+ sudo gitlab-rake gitlab:smtp:secret:edit EDITOR=vim
+ ```
-**Source Installation**
+- Self-compiled installations:
-```shell
-bundle exec rake gitlab:smtp:secret:edit RAILS_ENV=production EDITOR=vim
-```
+ ```shell
+ bundle exec rake gitlab:smtp:secret:edit RAILS_ENV=production EDITOR=vim
+ ```
### Write raw secret
Write new secret content by providing it on `STDIN`.
-**Omnibus Installation**
+- Linux package installations:
-```shell
-echo -e "password: '123'" | sudo gitlab-rake gitlab:smtp:secret:write
-```
+ ```shell
+ echo -e "password: '123'" | sudo gitlab-rake gitlab:smtp:secret:write
+ ```
-**Source Installation**
+- Self-compiled installations:
-```shell
-echo -e "password: '123'" | bundle exec rake gitlab:smtp:secret:write RAILS_ENV=production
-```
+ ```shell
+ echo -e "password: '123'" | bundle exec rake gitlab:smtp:secret:write RAILS_ENV=production
+ ```
### Secrets examples
diff --git a/doc/administration/raketasks/storage.md b/doc/administration/raketasks/storage.md
index 3664a79bf43..9e0a89fa7cb 100644
--- a/doc/administration/raketasks/storage.md
+++ b/doc/administration/raketasks/storage.md
@@ -20,7 +20,7 @@ available on legacy and hashed storage.
To have a summary and then a list of projects and their attachments using legacy storage:
-- **Omnibus installation**
+- Linux package installations:
```shell
# Projects
@@ -32,7 +32,7 @@ To have a summary and then a list of projects and their attachments using legacy
sudo gitlab-rake gitlab:storage:list_legacy_attachments
```
-- **Source installation**
+- Self-compiled installations:
```shell
# Projects
@@ -48,7 +48,7 @@ To have a summary and then a list of projects and their attachments using legacy
To have a summary and then a list of projects and their attachments using hashed storage:
-- **Omnibus installation**
+- Linux package installations:
```shell
# Projects
@@ -60,7 +60,7 @@ To have a summary and then a list of projects and their attachments using hashed
sudo gitlab-rake gitlab:storage:list_hashed_attachments
```
-- **Source installation**
+- Self-compiled installations:
```shell
# Projects
@@ -86,13 +86,13 @@ This task must be run on any machine that has Rails/Sidekiq configured, and the
schedules all your existing projects and attachments associated with it to be
migrated to the **Hashed** storage type:
-- **Omnibus installation**
+- Linux package installations:
```shell
sudo gitlab-rake gitlab:storage:migrate_to_hashed
```
-- **Source installation**
+- Self-compiled installations:
```shell
sudo -u git -H bundle exec rake gitlab:storage:migrate_to_hashed RAILS_ENV=production
@@ -101,7 +101,7 @@ migrated to the **Hashed** storage type:
If you have any existing integration, you may want to do a small rollout first,
to validate. You can do so by specifying an ID range with the operation by using
the environment variables `ID_FROM` and `ID_TO`. For example, to limit the rollout
-to project IDs 50 to 100 in an Omnibus GitLab installation:
+to project IDs 50 to 100 in a Linux package installation:
```shell
sudo gitlab-rake gitlab:storage:migrate_to_hashed ID_FROM=50 ID_TO=100
@@ -139,13 +139,13 @@ been disabled.
This task schedules all your existing projects and associated attachments to be rolled back to the
legacy storage type.
-- **Omnibus installation**
+- Linux package installations:
```shell
sudo gitlab-rake gitlab:storage:rollback_to_legacy
```
-- **Source installation**
+- Self-compiled installations:
```shell
sudo -u git -H bundle exec rake gitlab:storage:rollback_to_legacy RAILS_ENV=production
@@ -154,7 +154,7 @@ legacy storage type.
If you have any existing integration, you may want to do a small rollback first,
to validate. You can do so by specifying an ID range with the operation by using
the environment variables `ID_FROM` and `ID_TO`. For example, to limit the rollout
-to project IDs 50 to 100 in an Omnibus GitLab installation:
+to project IDs 50 to 100 in a Linux package installation:
```shell
sudo gitlab-rake gitlab:storage:rollback_to_legacy ID_FROM=50 ID_TO=100
@@ -244,9 +244,9 @@ If destroying the project generates a stack trace relating to encryption or the
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)
+ [Our documentation for dealing with lost secrets](../../administration/backup_restore/backup_gitlab.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)
+ to [reset specific runner registration tokens](../../administration/backup_restore/backup_gitlab.md#reset-runner-registration-tokens)
for a specific project ID:
```sql
diff --git a/doc/administration/raketasks/uploads/migrate.md b/doc/administration/raketasks/uploads/migrate.md
index 1f6e7fda082..a1826d3e5df 100644
--- a/doc/administration/raketasks/uploads/migrate.md
+++ b/doc/administration/raketasks/uploads/migrate.md
@@ -30,24 +30,24 @@ These [individual Rake tasks](#individual-rake-tasks) are described in the next
To migrate all uploads from local storage to object storage, run:
-**Omnibus Installation**
+- Linux package installations:
-```shell
-gitlab-rake "gitlab:uploads:migrate:all"
-```
+ ```shell
+ gitlab-rake "gitlab:uploads:migrate:all"
+ ```
-**Source Installation**
+- Self-compiled installations:
-```shell
-sudo RAILS_ENV=production -u git -H bundle exec rake gitlab:uploads:migrate:all
-```
+ ```shell
+ sudo RAILS_ENV=production -u git -H bundle exec rake gitlab:uploads:migrate:all
+ ```
You can optionally track progress and verify that all uploads migrated successfully using the
[PostgreSQL console](https://docs.gitlab.com/omnibus/settings/database.html#connecting-to-the-bundled-postgresql-database):
-- `sudo gitlab-rails dbconsole` for Omnibus GitLab 14.1 and earlier.
-- `sudo gitlab-rails dbconsole --database main` for Omnibus GitLab 14.2 and later.
-- `sudo -u git -H psql -d gitlabhq_production` for source-installed instances.
+- `sudo gitlab-rails dbconsole` for Linux package installations running GitLab 14.1 and earlier.
+- `sudo gitlab-rails dbconsole --database main` for Linux package installations running GitLab 14.2 and later.
+- `sudo -u git -H psql -d gitlabhq_production` for self-compiled installations.
Verify `objectstg` below (where `store=2`) has count of all artifacts:
@@ -92,7 +92,9 @@ the default batch size:
The following shows how to run `gitlab:uploads:migrate` for individual types of uploads.
-**Omnibus Installation**
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
```shell
# gitlab-rake gitlab:uploads:migrate[uploader_class, model_class, mount_point]
@@ -120,7 +122,7 @@ gitlab-rake "gitlab:uploads:migrate[FileUploader, MergeRequest]"
gitlab-rake "gitlab:uploads:migrate[DesignManagement::DesignV432x230Uploader, DesignManagement::Action, :image_v432x230]"
```
-**Source Installation**
+:::TabTitle Self-compiled (source)
Use `RAILS_ENV=production` for every task.
@@ -150,6 +152,8 @@ sudo -u git -H bundle exec rake "gitlab:uploads:migrate[FileUploader, MergeReque
sudo -u git -H bundle exec rake "gitlab:uploads:migrate[DesignManagement::DesignV432x230Uploader, DesignManagement::Action]"
```
+::EndTabs
+
## Migrate to local storage
If you need to disable [object storage](../../object_storage.md) for any reason, you must first
@@ -172,17 +176,17 @@ Keep in mind the task name in this case is `gitlab:uploads:migrate_to_local`.
To migrate uploads from object storage to local storage, run the following Rake task:
-**Omnibus GitLab installation**
+- Linux package installations:
-```shell
-gitlab-rake "gitlab:uploads:migrate_to_local:all"
-```
+ ```shell
+ gitlab-rake "gitlab:uploads:migrate_to_local:all"
+ ```
-**Source installation**
+- Self-compiled installations:
-```shell
-sudo RAILS_ENV=production -u git -H bundle exec rake gitlab:uploads:migrate_to_local:all
-```
+ ```shell
+ sudo RAILS_ENV=production -u git -H bundle exec rake gitlab:uploads:migrate_to_local:all
+ ```
After running the Rake task, you can disable object storage by undoing the changes described
in the instructions to [configure object storage](../../uploads.md#using-object-storage).
diff --git a/doc/administration/raketasks/uploads/sanitize.md b/doc/administration/raketasks/uploads/sanitize.md
index 567a20a37f3..f86b4406a9e 100644
--- a/doc/administration/raketasks/uploads/sanitize.md
+++ b/doc/administration/raketasks/uploads/sanitize.md
@@ -15,8 +15,8 @@ can remove EXIF data from existing images that were uploaded to an earlier versi
To run this Rake task, you need `exiftool` installed on your system. If you installed GitLab:
-- Using the Omnibus package, you're all set.
-- From source, make sure `exiftool` is installed:
+- By using the Linux package, you're all set.
+- By using the self-compiled installation, make sure `exiftool` is installed:
```shell
# Debian/Ubuntu
diff --git a/doc/administration/read_only_gitlab.md b/doc/administration/read_only_gitlab.md
index 3842cf0846b..adc6f42271c 100644
--- a/doc/administration/read_only_gitlab.md
+++ b/doc/administration/read_only_gitlab.md
@@ -66,7 +66,7 @@ sudo gitlab-ctl start puma
If you want to allow users to use the GitLab UI, ensure that
the database is read-only:
-1. Take a [GitLab backup](../raketasks/backup_restore.md)
+1. Take a [GitLab backup](../administration/backup_restore/index.md)
in case things don't go as expected.
1. Enter PostgreSQL on the console as an administrator user:
diff --git a/doc/administration/redis/replication_and_failover.md b/doc/administration/redis/replication_and_failover.md
index 4a6f58a8d6a..1db5b82e7dc 100644
--- a/doc/administration/redis/replication_and_failover.md
+++ b/doc/administration/redis/replication_and_failover.md
@@ -659,7 +659,7 @@ persistence classes.
| `shared_state` | Store session-related and other persistent data. |
| `actioncable` | Pub/Sub queue backend for ActionCable. |
| `trace_chunks` | Store [CI trace chunks](../job_logs.md#enable-or-disable-incremental-logging) data. |
-| `rate_limiting` | Store [rate limiting](../../user/admin_area/settings/user_and_ip_rate_limits.md) state. |
+| `rate_limiting` | Store [rate limiting](../settings/user_and_ip_rate_limits.md) state. |
| `sessions` | Store [sessions](../../../ee/development/session.md#gitlabsession). |
| `repository_cache` | Store cache data specific to repositories. |
diff --git a/doc/administration/reference_architectures/10k_users.md b/doc/administration/reference_architectures/10k_users.md
index c3cf7c599a3..e9a77d15a6c 100644
--- a/doc/administration/reference_architectures/10k_users.md
+++ b/doc/administration/reference_architectures/10k_users.md
@@ -232,7 +232,7 @@ spread connections equally in practice.
### Readiness checks
Ensure the external load balancer only routes to working services with built
-in monitoring endpoints. The [readiness checks](../../user/admin_area/monitoring/health_check.md)
+in monitoring endpoints. The [readiness checks](../monitoring/health_check.md)
all require [additional configuration](../monitoring/ip_allowlist.md)
on the nodes being checked, otherwise, the external load balancer will not be able to
connect.
@@ -2265,7 +2265,7 @@ Refer to [epic 6127](https://gitlab.com/groups/gitlab-org/-/epics/6127) for more
### Cluster topology
The following tables and diagram detail the hybrid environment using the same formats
-as the normal environment above.
+as the typical environment above.
First are the components that run in Kubernetes. These run across several node groups, although you can change
the overall makeup as desired as long as the minimum CPU and Memory requirements are observed.
diff --git a/doc/administration/reference_architectures/25k_users.md b/doc/administration/reference_architectures/25k_users.md
index 37571ed5771..0e608a953b8 100644
--- a/doc/administration/reference_architectures/25k_users.md
+++ b/doc/administration/reference_architectures/25k_users.md
@@ -243,7 +243,7 @@ spread connections equally in practice.
### Readiness checks
Ensure the external load balancer only routes to working services with built
-in monitoring endpoints. The [readiness checks](../../user/admin_area/monitoring/health_check.md)
+in monitoring endpoints. The [readiness checks](../monitoring/health_check.md)
all require [additional configuration](../monitoring/ip_allowlist.md)
on the nodes being checked, otherwise, the external load balancer will not be able to
connect.
@@ -2283,7 +2283,7 @@ Refer to [epic 6127](https://gitlab.com/groups/gitlab-org/-/epics/6127) for more
### Cluster topology
The following tables and diagram detail the hybrid environment using the same formats
-as the normal environment above.
+as the typical environment above.
First are the components that run in Kubernetes. These run across several node groups, although you can change
the overall makeup as desired as long as the minimum CPU and Memory requirements are observed.
diff --git a/doc/administration/reference_architectures/2k_users.md b/doc/administration/reference_architectures/2k_users.md
index 455b0fbafd1..e3e361db133 100644
--- a/doc/administration/reference_architectures/2k_users.md
+++ b/doc/administration/reference_architectures/2k_users.md
@@ -134,7 +134,7 @@ spread connections equally in practice.
### Readiness checks
Ensure the external load balancer only routes to working services with built
-in monitoring endpoints. The [readiness checks](../../user/admin_area/monitoring/health_check.md)
+in monitoring endpoints. The [readiness checks](../monitoring/health_check.md)
all require [additional configuration](../monitoring/ip_allowlist.md)
on the nodes being checked, otherwise, the external load balancer will not be able to
connect.
@@ -963,7 +963,7 @@ Refer to [epic 6127](https://gitlab.com/groups/gitlab-org/-/epics/6127) for more
### Cluster topology
The following tables and diagram detail the hybrid environment using the same formats
-as the normal environment above.
+as the typical environment above.
First are the components that run in Kubernetes. These run across several node groups, although you can change
the overall makeup as desired as long as the minimum CPU and Memory requirements are observed.
diff --git a/doc/administration/reference_architectures/3k_users.md b/doc/administration/reference_architectures/3k_users.md
index 6a7d9864376..4b7563d9d8d 100644
--- a/doc/administration/reference_architectures/3k_users.md
+++ b/doc/administration/reference_architectures/3k_users.md
@@ -243,7 +243,7 @@ spread connections equally in practice.
### Readiness checks
Ensure the external load balancer only routes to working services with built
-in monitoring endpoints. The [readiness checks](../../user/admin_area/monitoring/health_check.md)
+in monitoring endpoints. The [readiness checks](../monitoring/health_check.md)
all require [additional configuration](../monitoring/ip_allowlist.md)
on the nodes being checked, otherwise, the external load balancer will not be able to
connect.
@@ -2272,7 +2272,7 @@ Refer to [epic 6127](https://gitlab.com/groups/gitlab-org/-/epics/6127) for more
### Cluster topology
The following tables and diagram detail the hybrid environment using the same formats
-as the normal environment above.
+as the typical environment above.
First are the components that run in Kubernetes. These run across several node groups, although you can change
the overall makeup as desired as long as the minimum CPU and Memory requirements are observed.
diff --git a/doc/administration/reference_architectures/50k_users.md b/doc/administration/reference_architectures/50k_users.md
index 9a2c354f27c..6dc7f7affab 100644
--- a/doc/administration/reference_architectures/50k_users.md
+++ b/doc/administration/reference_architectures/50k_users.md
@@ -241,7 +241,7 @@ spread connections equally in practice.
### Readiness checks
Ensure the external load balancer only routes to working services with built
-in monitoring endpoints. The [readiness checks](../../user/admin_area/monitoring/health_check.md)
+in monitoring endpoints. The [readiness checks](../monitoring/health_check.md)
all require [additional configuration](../monitoring/ip_allowlist.md)
on the nodes being checked, otherwise, the external load balancer will not be able to
connect.
@@ -2282,7 +2282,7 @@ Refer to [epic 6127](https://gitlab.com/groups/gitlab-org/-/epics/6127) for more
### Cluster topology
The following tables and diagram detail the hybrid environment using the same formats
-as the normal environment above.
+as the typical environment above.
First are the components that run in Kubernetes. These run across several node groups, although you can change
the overall makeup as desired as long as the minimum CPU and Memory requirements are observed.
diff --git a/doc/administration/reference_architectures/5k_users.md b/doc/administration/reference_architectures/5k_users.md
index b0bc70aaf00..754a844df3f 100644
--- a/doc/administration/reference_architectures/5k_users.md
+++ b/doc/administration/reference_architectures/5k_users.md
@@ -240,7 +240,7 @@ spread connections equally in practice.
### Readiness checks
Ensure the external load balancer only routes to working services with built
-in monitoring endpoints. The [readiness checks](../../user/admin_area/monitoring/health_check.md)
+in monitoring endpoints. The [readiness checks](../monitoring/health_check.md)
all require [additional configuration](../monitoring/ip_allowlist.md)
on the nodes being checked, otherwise, the external load balancer will not be able to
connect.
@@ -2240,7 +2240,7 @@ Refer to [epic 6127](https://gitlab.com/groups/gitlab-org/-/epics/6127) for more
### Cluster topology
The following tables and diagram detail the hybrid environment using the same formats
-as the normal environment above.
+as the typical environment above.
First are the components that run in Kubernetes. These run across several node groups, although you can change
the overall makeup as desired as long as the minimum CPU and Memory requirements are observed.
diff --git a/doc/administration/reference_architectures/index.md b/doc/administration/reference_architectures/index.md
index 08aeb149454..8fc9fbce119 100644
--- a/doc/administration/reference_architectures/index.md
+++ b/doc/administration/reference_architectures/index.md
@@ -63,7 +63,7 @@ This section explains the designs you can choose from. It begins with the least
### Standalone (non-HA)
-For environments serving 2,000 or fewer users, we generally recommend a standalone approach by deploying a non-highly available single or multi-node environment. With this approach, you can employ strategies such as [automated backups](../../raketasks/backup_gitlab.md#configuring-cron-to-make-daily-backups) for recovery to provide a good level of RPO / RTO while avoiding the complexities that come with HA.
+For environments serving 2,000 or fewer users, we generally recommend a standalone approach by deploying a non-highly available single or multi-node environment. With this approach, you can employ strategies such as [automated backups](../../administration/backup_restore/backup_gitlab.md#configuring-cron-to-make-daily-backups) for recovery to provide a good level of RPO / RTO while avoiding the complexities that come with HA.
*[RTO]: Recovery time objective
*[RPO]: Recovery point objective
@@ -312,7 +312,7 @@ Additionally, the following cloud provider services are validated and supported
</tr>
<tr>
<td>Redis</td>
- <td></td>
+ <td>🟢 &nbsp; <a href="https://cloud.google.com/memorystore" target="_blank" rel="noopener noreferrer">Memorystore</a></td>
<td>🟢 &nbsp; <a href="https://aws.amazon.com/elasticache/" target="_blank" rel="noopener noreferrer">ElastiCache</a></td>
<td></td>
</tr>
@@ -633,8 +633,8 @@ Most setups would only need vertical scaling, but there are some specific areas
- Gitaly to Gitaly Cluster w/ Praefect
- From 10k users and higher, Redis is recommended to be split into multiple HA servers as it's single threaded.
-Conversely, if you have robust metrics in place that show the environment is over-provisioned you can apply the same process for
-scaling downloads. It's recommended to take an iterative approach when scaling downwards however to ensure there are no issues.
+Conversely, if you have robust metrics in place that show the environment is over-provisioned, you can apply the same process for
+scaling downwards. You should take an iterative approach when scaling downwards, however, to ensure there are no issues.
### How to monitor your environment
diff --git a/doc/administration/reporting/git_abuse_rate_limit.md b/doc/administration/reporting/git_abuse_rate_limit.md
new file mode 100644
index 00000000000..270a7cb4800
--- /dev/null
+++ b/doc/administration/reporting/git_abuse_rate_limit.md
@@ -0,0 +1,49 @@
+---
+stage: Anti-Abuse
+group: Anti-Abuse
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Git abuse rate limit (administration) **(ULTIMATE SELF)**
+
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/8066) in GitLab 15.2 [with a flag](../../administration/feature_flags.md) named `git_abuse_rate_limit_feature_flag`. Disabled by default.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/394996) in GitLab 15.11. Feature flag `git_abuse_rate_limit_feature_flag` removed.
+
+This is the administration documentation. For information about Git abuse rate limiting at the group level, see the [group-level documentation](../../user/group/reporting/git_abuse_rate_limit.md).
+
+Git abuse rate limiting is a feature to automatically [ban users](../../administration/moderate_users.md#ban-and-unban-users) who download, clone, or fork more than a specified number of repositories in any project in the instance in a given time frame. Banned users cannot sign in to the instance and cannot access any non-public group via HTTP or SSH. The rate limit also applies to users who authenticate with a [personal](../../user/profile/personal_access_tokens.md) or [group access token](../../user/group/settings/group_access_tokens.md).
+
+Git abuse rate limiting does not apply to instance administrators, [deploy tokens](../../user/project/deploy_tokens/index.md), or [deploy keys](../../user/project/deploy_keys/index.md).
+
+How GitLab determines a user's rate limit is under development.
+GitLab team members can view more information in this confidential epic:
+`https://gitlab.com/groups/gitlab-org/modelops/anti-abuse/-/epics/14`.
+
+## Configure Git abuse rate limiting
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Reporting**.
+1. Expand **Git abuse rate limit**.
+1. Update the Git abuse rate limit settings:
+ 1. Enter a number in the **Number of repositories** field, greater than or equal to `0` and less than or equal to `10,000`. This number specifies the maximum amount of unique repositories a user can download in the specified time period before they're banned. When set to `0`, Git abuse rate limiting is disabled.
+ 1. Enter a number in the **Reporting time period (seconds)** field, greater than or equal to `0` and less than or equal to `86,400` (10 days). This number specifies the time in seconds a user can download the maximum amount of repositories before they're banned. When set to `0`, Git abuse rate limiting is disabled.
+ 1. Optional. Exclude up to `100` users by adding them to the **Excluded users** field. Excluded users are not automatically banned.
+ 1. Add up to `100` users to the **Send notifications to** field. You must select at least one user. All application administrators are selected by default.
+ 1. Optional. Turn on the **Automatically ban users from this namespace when they exceed the specified limits** toggle to enable automatic banning.
+1. Select **Save changes**.
+
+## Automatic ban notifications
+
+If automatic banning is disabled, a user is not banned automatically when they exceed the limit. However, notifications are still sent to the users listed under **Send notifications to**. You can use this setup to determine the correct values of the rate limit settings before enabling automatic banning.
+
+If automatic banning is enabled, an email notification is sent when a user is about to be banned, and the user is automatically banned from the GitLab instance.
+
+## Unban a user
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Overview > Users**.
+1. Select the **Banned** tab and search for the account you want to unban.
+1. From the **User administration** dropdown list select **Unban user**.
+1. On the confirmation dialog, select **Unban user**.
diff --git a/doc/administration/reporting/ip_addr_restrictions.md b/doc/administration/reporting/ip_addr_restrictions.md
new file mode 100644
index 00000000000..5b749c62c30
--- /dev/null
+++ b/doc/administration/reporting/ip_addr_restrictions.md
@@ -0,0 +1,33 @@
+---
+stage: Anti-Abuse
+group: Anti-Abuse
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# IP address restrictions **(FREE SELF)**
+
+IP address restrictions help prevent malicious users hiding their activities behind multiple IP addresses.
+
+GitLab maintains a list of the unique IP addresses used by a user to make requests over a specified period. When the
+specified limit is reached, any requests made by the user from a new IP address are rejected with a `403 Forbidden` error.
+
+IP addresses are cleared from the list when no further requests have been made by the user from the IP address in the specified time period.
+
+NOTE:
+When a runner runs a CI/CD job as a particular user, the runner IP address is also stored against the user's list of
+unique IP addresses. Therefore, the IP addresses per user limit should take into account the number of configured active runners.
+
+## Configure IP address restrictions
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Reporting**.
+1. Expand **Spam and Anti-bot Protection**.
+1. Update the IP address restrictions settings:
+ 1. Select the **Limit sign in from multiple IP addresses** checkbox to enable IP address restrictions.
+ 1. Enter a number in the **IP addresses per user** field, greater than or equal to `1`. This number specifies the
+ maximum number of unique IP addresses a user can access GitLab from in the specified time period before requests
+ from a new IP address are rejected.
+ 1. Enter a number in the **IP address expiration time** field, greater than or equal to `0`. This number specifies the
+ time in seconds an IP address counts towards the limit for a user, taken from the time the last request was made.
+1. Select **Save changes**.
diff --git a/doc/administration/reporting/spamcheck.md b/doc/administration/reporting/spamcheck.md
new file mode 100644
index 00000000000..8e478729299
--- /dev/null
+++ b/doc/administration/reporting/spamcheck.md
@@ -0,0 +1,69 @@
+---
+stage: Systems
+group: Distribution
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Spamcheck anti-spam service **(FREE SELF)**
+
+> [Introduced](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/6259) in GitLab 14.8.
+
+WARNING:
+Spamcheck is available to all tiers, but only on instances using GitLab Enterprise Edition (EE). For [licensing reasons](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/6259#note_726605397), it is not included in the GitLab Community Edition (CE) package. You can [migrate from CE to EE](../../update/package/convert_to_ee.md).
+
+[Spamcheck](https://gitlab.com/gitlab-org/spamcheck) is an anti-spam engine
+developed by GitLab originally to combat rising amount of spam in GitLab.com,
+and later made public to be used in self-managed GitLab instances.
+
+## Enable Spamcheck
+
+Spamcheck is only available for package-based installations:
+
+1. Edit `/etc/gitlab/gitlab.rb` and enable Spamcheck:
+
+ ```ruby
+ spamcheck['enable'] = true
+ ```
+
+1. Reconfigure GitLab:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
+
+1. Verify that the new services `spamcheck` and `spam-classifier` are
+ up and running:
+
+ ```shell
+ sudo gitlab-ctl status
+ ```
+
+## Configure GitLab to use Spamcheck
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Reporting**.
+1. Expand **Spam and Anti-bot Protection**.
+1. Update the Spam Check settings:
+ 1. Check the "Enable Spam Check via external API endpoint" checkbox.
+ 1. For **URL of the external Spam Check endpoint** use `grpc://localhost:8001`.
+ 1. Leave **Spam Check API key** blank.
+1. Select **Save changes**.
+
+NOTE:
+In single-node instances, Spamcheck runs over `localhost`, and hence is running
+in an unauthenticated mode. If on multi-node instances where GitLab runs on one
+server and Spamcheck runs on another server listening over a public endpoint, it
+is recommended to enforce some sort of authentication using a reverse proxy in
+front of the Spamcheck service that can be used along with an API key. One
+example would be to use `JWT` authentication for this and specifying a bearer
+token as the API key.
+[Native authentication for Spamcheck is in the works](https://gitlab.com/gitlab-com/gl-security/engineering-and-research/automation-team/spam/spamcheck/-/issues/171).
+
+## Running Spamcheck over TLS
+
+Spamcheck service on its own cannot 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 Area settings.
diff --git a/doc/administration/repository_storage_paths.md b/doc/administration/repository_storage_paths.md
index 1a83a05c3dd..9967b623773 100644
--- a/doc/administration/repository_storage_paths.md
+++ b/doc/administration/repository_storage_paths.md
@@ -45,8 +45,8 @@ For more information on:
WARNING:
The following information is for configuring GitLab to directly access repositories. This
-configuration option is deprecated in favor of using [Gitaly](gitaly/index.md). Gitaly issue
-[1690](https://gitlab.com/gitlab-org/gitaly/-/issues/1690) proposes to remove this configuration option.
+configuration option is deprecated in favor of using [Gitaly](gitaly/index.md).
+[Issue 403318](https://gitlab.com/gitlab-org/gitlab/-/issues/403318) proposes to remove this configuration option.
To configure repository storage paths:
@@ -73,7 +73,7 @@ For repository storage paths:
### Configure for backups
-For [backups](../raketasks/backup_restore.md) to work correctly:
+For [backups](../administration/backup_restore/index.md) to work correctly:
- The repository storage path cannot be a mount point.
- The GitLab user must have correct permissions for the parent directory of the path.
diff --git a/doc/administration/repository_storage_types.md b/doc/administration/repository_storage_types.md
index 3bd73b4df94..e1512038286 100644
--- a/doc/administration/repository_storage_types.md
+++ b/doc/administration/repository_storage_types.md
@@ -73,7 +73,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](../administration/admin_area.md#administering-projects).
- A Rails console.
To look up a project's hash path in the Admin Area:
diff --git a/doc/administration/review_abuse_reports.md b/doc/administration/review_abuse_reports.md
new file mode 100644
index 00000000000..e3891cbe68a
--- /dev/null
+++ b/doc/administration/review_abuse_reports.md
@@ -0,0 +1,96 @@
+---
+stage: Anti-Abuse
+group: Anti-Abuse
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+type: reference, howto
+---
+
+# Review abuse reports **(FREE SELF)**
+
+View and resolve abuse reports from GitLab users.
+
+GitLab administrators can view and [resolve](#resolving-abuse-reports) abuse
+reports in the Admin Area.
+
+## Receive notification of abuse reports by email
+
+To receive notifications of new abuse reports by email:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Reporting**.
+1. Expand the **Abuse reports** section.
+1. Provide an email address and select **Save changes**.
+
+The notification email address can also be set and retrieved
+[using the API](../api/settings.md#list-of-settings-that-can-be-accessed-via-api-calls).
+
+## Reporting abuse
+
+To find out more about reporting abuse, see
+[abuse reports user documentation](../user/report_abuse.md).
+
+## Resolving abuse reports
+
+To access abuse reports:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Abuse Reports**.
+
+There are 3 ways to resolve an abuse report, with a button for each method:
+
+- Remove user & report. This:
+ - [Deletes the reported user](../user/profile/account/delete_account.md) from the
+ instance.
+ - Removes the abuse report from the list.
+- [Block user](#blocking-users).
+- Remove report. This:
+ - Removes the abuse report from the list.
+ - Removes access restrictions for the reported user.
+
+The following is an example of the **Abuse Reports** page:
+
+![abuse-reports-page-image](img/abuse_reports_page_v13_11.png)
+
+### Blocking users
+
+A blocked user cannot sign in or access any repositories, but all of their data
+remains.
+
+Blocking a user:
+
+- Leaves them in the abuse report list.
+- Changes the **Block user** button to a disabled **Already blocked** button.
+
+The user is notified with the following message:
+
+```plaintext
+Your account has been blocked. If you believe this is in error, contact a staff member.
+```
+
+After blocking, you can still either:
+
+- Remove the user and report if necessary.
+- Remove the report.
+
+The following is an example of a blocked user listed on the **Abuse Reports**
+page:
+
+![abuse-report-blocked-user-image](img/abuse_report_blocked_user.png)
+
+NOTE:
+Users can be [blocked](../api/users.md#block-user) and
+[unblocked](../api/users.md#unblock-user) using the GitLab API.
+
+<!-- ## 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, for example `### Getting error message X`.
+If you have none to add when creating a doc, leave this section in place
+but commented out to help encourage others to add to it in the future. -->
diff --git a/doc/administration/settings/account_and_limit_settings.md b/doc/administration/settings/account_and_limit_settings.md
new file mode 100644
index 00000000000..ca56a322237
--- /dev/null
+++ b/doc/administration/settings/account_and_limit_settings.md
@@ -0,0 +1,399 @@
+---
+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/product/ux/technical-writing/#assignments"
+type: reference
+---
+
+# Account and limit settings **(FREE SELF)**
+
+## Default projects limit
+
+You can configure the default maximum number of projects new users can create in their
+personal namespace. This limit affects only new user accounts created after you change
+the setting. This setting is not retroactive for existing users, but you can separately edit
+the [project limits for existing users](#projects-limit-for-a-user).
+
+To configure the maximum number of projects in personal namespaces for new users:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand **Account and limit**.
+1. Increase or decrease that **Default projects limit** value.
+
+If you set **Default projects limit** to 0, users are not allowed to create projects
+in their users personal namespace. However, projects can still be created in a group.
+
+### Projects limit for a user
+
+You can edit a specific user, and change the maximum number of projects this user
+can create in their personal namespace:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Overview** > **Users**.
+1. From the list of users, select a user.
+1. Select **Edit**.
+1. Increase or decrease the **Projects limit** value.
+
+## Max attachment size
+
+> [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/20061) from 10 MB to 100 MB in GitLab 15.7.
+
+The maximum file size for attachments in GitLab comments and replies is 100 MB.
+To change the maximum attachment size:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand **Account and limit**.
+1. Increase or decrease by changing the value in **Maximum attachment size (MB)**.
+
+If you choose a size larger than the configured value for the web server,
+you may receive errors. Read the [troubleshooting section](#troubleshooting) for more
+details.
+
+For GitLab.com repository size limits, read [accounts and limit settings](../../user/gitlab_com/index.md#account-and-limit-settings).
+
+## Max push size
+
+You can change the maximum push size for your instance:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand **Account and limit**.
+1. Increase or decrease by changing the value in **Maximum push size (MB)**.
+
+For GitLab.com push size limits, read [accounts and limit settings](../../user/gitlab_com/index.md#account-and-limit-settings).
+
+NOTE:
+When you [add files to a repository](../../user/project/repository/web_editor.md#create-a-file)
+through the web UI, the maximum **attachment** size is the limiting factor,
+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 left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**, then expand **Account and limit**.
+1. Increase or decrease by changing the value in **Maximum export size (MB)**.
+
+## Max import size
+
+> [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:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand **Account and limit**.
+1. Increase or decrease by changing the value in **Maximum import size (MB)**.
+
+This setting applies only to repositories
+[imported from a GitLab export file](../../user/project/settings/import_export.md#import-a-project-and-its-data).
+
+If you choose a size larger than the configured value for the web server,
+you may receive errors. See the [troubleshooting section](#troubleshooting) for more
+details.
+
+For GitLab.com repository size limits, read [accounts and limit settings](../../user/gitlab_com/index.md#account-and-limit-settings).
+
+## Personal access token prefix
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20968) in GitLab 13.7.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/342327) in GitLab 14.5, a default prefix.
+
+You can specify a prefix for personal access tokens. You might use a prefix
+to find tokens more quickly, or for use with automation tools.
+
+The default prefix is `glpat-` but administrators can change it.
+
+[Project access tokens](../../user/project/settings/project_access_tokens.md) and
+[group access tokens](../../user/group/settings/group_access_tokens.md) also inherit this prefix.
+
+### Set a prefix
+
+To change the default global prefix:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand the **Account and limit** section.
+1. Fill in the **Personal Access Token prefix** field.
+1. Select **Save changes**.
+
+You can also configure the prefix by using the
+[settings API](../../api/settings.md).
+
+## Repository size limit **(PREMIUM SELF)**
+
+Repositories in your GitLab instance can grow quickly, especially if you are
+using LFS. Their size can grow exponentially, rapidly consuming available storage.
+To prevent this from happening, you can set a hard limit for your repositories' size.
+This limit can be set globally, per group, or per project, with per project limits
+taking the highest priority.
+
+There are numerous use cases where you might set up a limit for repository size.
+For instance, consider the following workflow:
+
+1. Your team develops apps which require large files to be stored in
+ the application repository.
+1. Although you have enabled [Git LFS](../../topics/git/lfs/index.md#git-large-file-storage-lfs)
+ to your project, your storage has grown significantly.
+1. Before you exceed available storage, you set up a limit of 10 GB
+ per repository.
+
+NOTE:
+For GitLab.com repository size limits, read [accounts and limit settings](../../user/gitlab_com/index.md#account-and-limit-settings).
+
+### How it works
+
+Only a GitLab administrator can set those limits. Setting the limit to `0` means
+there are no restrictions.
+
+These settings can be found in:
+
+- Each project's settings:
+ 1. From the Project's homepage, navigate to **Settings > General**.
+ 1. Fill in the **Repository size limit (MB)** field in the **Naming, topics, avatar** section.
+ 1. Select **Save changes**.
+- Each group's settings:
+ 1. From the Group's homepage, navigate to **Settings > General**.
+ 1. Fill in the **Repository size limit (MB)** field in the **Naming, visibility** section.
+ 1. Select **Save changes**.
+- GitLab global settings:
+ 1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+ 1. Select **Admin Area**.
+ 1. Select **Settings > General**.
+ 1. Expand the **Account and limit** section.
+ 1. Fill in the **Size limit per repository (MB)** field.
+ 1. Select **Save changes**.
+
+The first push of a new project, including LFS objects, is checked for size.
+If the sum of their sizes exceeds the maximum allowed repository size, the push
+is rejected.
+
+NOTE:
+The repository size limit includes repository files and LFS, but does not include artifacts, uploads,
+wiki, packages, or snippets. The repository size limit applies to both private and public projects.
+
+For details on manually purging files, see [reducing the repository size using Git](../../user/project/repository/reducing_the_repo_size_using_git.md).
+
+## Session duration
+
+### Customize the default session duration
+
+You can change how long users can remain signed in without activity.
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand **Account and limit**. The set duration is in **Session duration (minutes)**.
+
+If [Remember me](#turn-remember-me-on-or-off) is enabled, users' sessions can remain active for an indefinite period of time.
+
+For details, see [cookies used for sign-in](../../user/profile/index.md#cookies-used-for-sign-in).
+
+### Turn **Remember me** on or off
+
+> Ability to turn the **Remember me** setting on and off [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/369133) in GitLab 16.0.
+
+Users can select the **Remember me** checkbox on sign-in, and their session will remain active for an indefinite period of time when accessed from that specific browser. You can turn off this setting if you need sessions to expire for security or compliance purposes. Turning off this setting will ensure users' sessions expire after the number of minutes of inactivity set when you [customize your session duration](#customize-the-default-session-duration).
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand **Account and limit**.
+1. Select or clear the **Remember me** checkbox to turn this setting on or off.
+
+### 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.
+> - It's deployed behind a feature flag, disabled by default.
+
+FLAG:
+On self-managed GitLab, by default this feature is not available. To make it available, an administrator can [enable the feature flag](../../administration/feature_flags.md) named `two_factor_for_cli`. On GitLab.com, this feature is not available. This feature is not ready for production use. This feature flag also affects [2FA for Git over SSH operations](../../security/two_factor_authentication.md#2fa-for-git-over-ssh-operations).
+
+GitLab administrators can choose to customize the session duration (in minutes) for Git operations when 2FA is enabled. The default is 15 and this can be set to a value between 1 and 10080.
+
+To set a limit on how long these sessions are valid:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand the **Account and limit** section.
+1. Fill in the **Session duration for Git operations when 2FA is enabled (minutes)** field.
+1. Select **Save changes**.
+
+## Limit the lifetime of SSH keys **(ULTIMATE SELF)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/1007) in GitLab 14.6 [with a flag](../../administration/feature_flags.md) named `ff_limit_ssh_key_lifetime`. Disabled by default.
+> - [Enabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/346753) in GitLab 14.6.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/1007) in GitLab 14.7. [Feature flag `ff_limit_ssh_key_lifetime`](https://gitlab.com/gitlab-org/gitlab/-/issues/347408) removed.
+
+Users can optionally specify a lifetime for
+[SSH keys](../../user/ssh.md).
+This lifetime is not a requirement, and can be set to any arbitrary number of days.
+
+SSH keys are user credentials to access GitLab.
+However, organizations with security requirements may want to enforce more protection by
+requiring the regular rotation of these keys.
+
+### Set a lifetime
+
+Only a GitLab administrator can set a lifetime. Leaving it empty means
+there are no restrictions.
+
+To set a lifetime on how long SSH keys are valid:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand the **Account and limit** section.
+1. Fill in the **Maximum allowable lifetime for SSH keys (days)** field.
+1. Select **Save changes**.
+
+Once a lifetime for SSH keys is set, GitLab:
+
+- Requires users to set an expiration date that is no later than the allowed lifetime on new
+ SSH keys.
+- Applies the lifetime restriction to existing SSH keys. Keys with no expiry or a lifetime
+ greater than the maximum immediately become invalid.
+
+NOTE:
+When a user's SSH key becomes invalid they can delete and re-add the same key again.
+
+## 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 maximum lifetime in days for
+access tokens, this includes [personal](../../user/profile/personal_access_tokens.md),
+[group](../../user/group/settings/group_access_tokens.md), and [project](../../user/project/settings/project_access_tokens.md) access tokens.
+This lifetime is not a requirement, and can be set to any value greater than 0 and less than or equal to 365. If this setting is left blank, the default allowable lifetime of access tokens is 365 days.
+
+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.
+
+### Set a lifetime
+
+Only a GitLab administrator can set a lifetime. Leaving it empty means
+there are no restrictions.
+
+To set a lifetime on how long access tokens are valid:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand the **Account and limit** section.
+1. Fill in the **Maximum allowable lifetime for access tokens (days)** field.
+1. Select **Save changes**.
+
+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.
+- After three hours, revoke old tokens with no expiration date or with a lifetime longer than the
+ allowed lifetime. Three hours is given to allow administrators to change the allowed lifetime,
+ or remove it, before revocation takes place.
+
+## Disable user profile name changes **(PREMIUM SELF)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/24605) in GitLab 12.7.
+
+To maintain integrity of user details in [Audit Events](../../administration/audit_events.md), GitLab administrators can choose to disable a user's ability to change their profile name.
+
+To do this:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand **Account and limit**.
+1. Select the **Prevent users from changing their profile name** checkbox.
+
+NOTE:
+When this ability is disabled, GitLab administrators can still use the
+[Admin Area](../../administration/admin_area.md#administering-users) or the
+[API](../../api/users.md#user-modification) to update usernames.
+
+## Prevent new users from creating top-level groups
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/367754) in GitLab 15.5.
+
+By default, new users can create top-level groups. GitLab administrators can prevent new users from creating top-level groups:
+
+- In GitLab 15.5 and later, using either:
+ - The GitLab UI using the steps in this section.
+ - The [application setting API](../../api/settings.md#change-application-settings).
+- In GitLab 15.4 and earlier, a [configuration file](../../administration/user_settings.md#use-configuration-files-to-prevent-new-users-from-creating-top-level-groups).
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand **Account and limit**.
+1. Clear the **Allow new users to create top-level groups** checkbox.
+
+## Set profiles of new users to private by default
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/231301) in GitLab 15.8.
+
+By default, newly created users have a public profile. GitLab administrators can set new users to have a private profile by default:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand **Account and limit**.
+1. Select the **Make new users' profiles private by default** checkbox.
+
+## Prevent users from deleting their accounts **(PREMIUM SELF)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/26053) in GitLab 16.1 [with a flag](../../administration/feature_flags.md) named `deleting_account_disabled_for_users`. Enabled by default.
+
+By default, users can delete their own accounts. GitLab administrators can prevent
+users from deleting their own accounts:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand **Account and limit**.
+1. Clear the **Allows users to delete their own accounts** checkbox.
+
+## 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
+[Linux package](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/index.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 repository size](../../user/project/repository/reducing_the_repo_size_using_git.md).
diff --git a/doc/administration/settings/continuous_integration.md b/doc/administration/settings/continuous_integration.md
new file mode 100644
index 00000000000..eaa240d4c96
--- /dev/null
+++ b/doc/administration/settings/continuous_integration.md
@@ -0,0 +1,429 @@
+---
+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/product/ux/technical-writing/#assignments
+type: reference
+---
+
+# Continuous Integration and Deployment Admin Area settings **(FREE SELF)**
+
+The [Admin Area](index.md) has the instance settings for Auto DevOps, runners, and
+job artifacts.
+
+## Auto DevOps
+
+To enable (or disable) [Auto DevOps](../../topics/autodevops/index.md)
+for all projects:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > CI/CD**.
+1. Check (or uncheck to disable) the box that says **Default to Auto DevOps pipeline for all projects**.
+1. Optionally, set up the [Auto DevOps base domain](../../topics/autodevops/requirements.md#auto-devops-base-domain)
+ which is used for Auto Deploy and Auto Review Apps.
+1. Select **Save changes** for the changes to take effect.
+
+From now on, every existing project and newly created ones that don't have a
+`.gitlab-ci.yml` use the Auto DevOps pipelines.
+
+If you want to disable it for a specific project, you can do so in
+[its settings](../../topics/autodevops/index.md#enable-or-disable-auto-devops).
+
+## Enable shared runners for new projects
+
+You can set all new projects to have the instance's shared runners available by default.
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > CI/CD**.
+1. Expand **Continuous Integration and Deployment**.
+1. Select the **Enable shared runners for new projects** checkbox.
+
+Any time a new project is created, the shared runners are available.
+
+## Shared runners compute quota
+
+As an administrator you can set either a global or namespace-specific
+limit on the number of [compute minutes](../../ci/pipelines/cicd_minutes.md) you can use.
+
+## Enable a project runner for multiple projects
+
+If you have already registered a [project runner](../../ci/runners/runners_scope.md#project-runners)
+you can assign that runner to other projects.
+
+To enable a project runner for more than one project:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. From the left sidebar, select **CI/CD > Runners**.
+1. Select the runner you want to edit.
+1. In the upper-right corner, select **Edit** (**{pencil}**).
+1. Under **Restrict projects for this runner**, search for a project.
+1. To the left of the project, select **Enable**.
+1. Repeat this process for each additional project.
+
+## Add a message for shared runners
+
+To display details about the instance's shared runners in all projects'
+runner settings:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > CI/CD**.
+1. Expand **Continuous Integration and Deployment**.
+1. Enter text, including Markdown if you want, in the **Shared runner details** field. For example:
+
+ ![Shared runner details input](img/continuous_integration_shared_runner_details_input_v14_10.png)
+
+To view the rendered details:
+
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project or group.
+1. Select **Settings > CI/CD**.
+1. Expand **Runners**.
+
+![Shared runner details example](img/continuous_integration_shared_runner_details_v14_10.png)
+
+## Maximum artifacts size
+
+The maximum size of the [job artifacts](../../administration/job_artifacts.md)
+can be set at:
+
+- The instance level.
+- [From GitLab 12.4](https://gitlab.com/gitlab-org/gitlab/-/issues/21688), the project and group level.
+
+For the setting on GitLab.com, see [Artifacts maximum size](../../user/gitlab_com/index.md#gitlab-cicd).
+
+The value is in MB and the default is 100 MB per job. To change it at the:
+
+- Instance level:
+
+ 1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+ 1. Select **Admin Area**.
+ 1. On the left sidebar, select **Settings > CI/CD > Continuous Integration and Deployment**.
+ 1. Change the value of **Maximum artifacts size (MB)**.
+ 1. Select **Save changes** for the changes to take effect.
+
+- Group level (this overrides the instance setting):
+
+ 1. Go to the group's **Settings > CI/CD > General Pipelines**.
+ 1. Change the value of **Maximum artifacts size** (in MB).
+ 1. Select **Save changes** for the changes to take effect.
+
+- Project level (this overrides the instance and group settings):
+
+ 1. Go to the project's **Settings > CI/CD > General Pipelines**.
+ 1. Change the value of **maximum artifacts size** (in MB).
+ 1. Select **Save changes** for the changes to take effect.
+
+NOTE:
+The setting at all levels is only available to GitLab administrators.
+
+## Default artifacts expiration
+
+The default expiration time of the [job artifacts](../../administration/job_artifacts.md)
+can be set in the Admin Area of your GitLab instance. The syntax of duration is
+described in [`artifacts:expire_in`](../../ci/yaml/index.md#artifactsexpire_in)
+and the default value is `30 days`.
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > CI/CD**.
+1. Change the value of default expiration time.
+1. Select **Save changes** for the changes to take effect.
+
+This setting is set per job and can be overridden in
+[`.gitlab-ci.yml`](../../ci/yaml/index.md#artifactsexpire_in).
+To disable the expiration, set it to `0`. The default unit is in seconds.
+
+NOTE:
+Any changes to this setting applies to new artifacts only. The expiration time is not
+be updated for artifacts created before this setting was changed.
+The administrator may need to manually search for and expire previously-created
+artifacts, as described in the [troubleshooting documentation](../../administration/job_artifacts.md#delete-job-artifacts-from-jobs-completed-before-a-specific-date).
+
+## Keep the latest artifacts for all jobs in the latest successful pipelines
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/50889) in GitLab 13.9.
+
+When enabled (default), the artifacts of the most recent pipeline for each Git ref
+([branches and tags](https://git-scm.com/book/en/v2/Git-Internals-Git-References))
+are locked against deletion and kept regardless of the expiry time.
+
+When disabled, the latest artifacts for any **new** successful or fixed pipelines
+are allowed to expire.
+
+This setting takes precedence over the [project level setting](../../ci/jobs/job_artifacts.md#keep-artifacts-from-most-recent-successful-jobs).
+If disabled at the instance level, you cannot enable this per-project.
+
+To disable the setting:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > CI/CD**.
+1. Expand **Continuous Integration and Deployment**.
+1. Clear the **Keep the latest artifacts for all jobs in the latest successful pipelines** checkbox.
+1. Select **Save changes**
+
+When you disable the feature, the latest artifacts do not immediately expire.
+A new pipeline must run before the latest artifacts can expire and be deleted.
+
+NOTE:
+All application settings have a [customizable cache expiry interval](../../administration/application_settings_cache.md) which can delay the settings affect.
+
+## Archive jobs
+
+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.
+
+To set the duration for which the jobs are considered as old and expired:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > CI/CD**.
+1. Expand the **Continuous Integration and Deployment** section.
+1. Set the value of **Archive jobs**.
+1. Select **Save changes** for the changes to take effect.
+
+After that time passes, the jobs are archived in the background and no longer able to be
+retried. Make it empty to never expire jobs. It has to be no less than 1 day,
+for example: <code>15 days</code>, <code>1 month</code>, <code>2 years</code>.
+
+For the value set for GitLab.com, see [Scheduled job archiving](../../user/gitlab_com/index.md#gitlab-cicd).
+
+## 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:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > CI/CD**.
+1. Select **Protect CI/CD variables by default**.
+
+## Maximum includes
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/207270) in GitLab 16.0.
+
+The maximum number of [includes](../../ci/yaml/includes.md) per pipeline can be set at the instance level.
+The default is `150`.
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > CI/CD**.
+1. Change the value of **Maximum includes**.
+1. Select **Save changes** for the changes to take effect.
+
+## Default CI/CD configuration file
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18073) in GitLab 12.5.
+
+The default CI/CD configuration file and path for new projects can be set in the Admin Area
+of your GitLab instance (`.gitlab-ci.yml` if not set):
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > CI/CD**.
+1. Input the new file and path in the **Default CI/CD configuration file** field.
+1. Select **Save changes** for the changes to take effect.
+
+It is also possible to specify a [custom CI/CD configuration file for a specific project](../../ci/pipelines/settings.md#specify-a-custom-cicd-configuration-file).
+
+## Set CI/CD limits
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/352175) in GitLab 14.10.
+
+You can configure some [CI/CD limits](../../administration/instance_limits.md#cicd-limits)
+from the Admin Area:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > CI/CD**.
+1. Expand the **Continuous Integration and Deployment** section.
+1. In the **CI/CD limits** section, you can set the following limits:
+ - **Maximum number of jobs in a single pipeline**
+ - **Total number of jobs in currently active pipelines**
+ - **Maximum number of active pipelines per project**
+ - **Maximum number of pipeline subscriptions to and from a project**
+ - **Maximum number of pipeline schedules**
+ - **Maximum number of DAG dependencies that a job can have**
+ - **Maximum number of runners registered per group**
+ - **Maximum number of runners registered per project**
+ - **Maximum number of downstream pipelines in a pipeline's hierarchy tree**
+
+## Enable or disable the pipeline suggestion banner
+
+By default, a banner displays in merge requests with no pipeline suggesting a
+walkthrough on how to add one.
+
+![Suggest pipeline banner](img/suggest_pipeline_banner_v14_5.png)
+
+To enable or disable the banner:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > CI/CD**.
+1. Select or clear the **Enable pipeline suggestion banner** checkbox.
+1. Select **Save changes**.
+
+## Required pipeline configuration **(ULTIMATE SELF)**
+
+> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/352316) from GitLab Premium to GitLab Ultimate in 15.0.
+> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/389467) in GitLab 15.9.
+
+WARNING:
+This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/389467) in GitLab 15.9
+and is planned for removal in 17.0. Use [compliance pipelines](../../user/group/compliance_frameworks.md#compliance-pipelines)
+instead. This change is a breaking change.
+
+You can set a [CI/CD template](../../ci/examples/index.md#cicd-templates)
+as a required pipeline configuration for all projects on a GitLab instance. You can
+use a template from:
+
+- The default CI/CD templates.
+- A custom template stored in an [instance template repository](instance_template_repository.md).
+
+ NOTE:
+ When you use a configuration defined in an instance template repository,
+ nested [`include:`](../../ci/yaml/index.md#include) keywords
+ (including `include:file`, `include:local`, `include:remote`, and `include:template`)
+ [do not work](https://gitlab.com/gitlab-org/gitlab/-/issues/35345).
+
+The project CI/CD configuration merges into the required pipeline configuration when
+a pipeline runs. The merged configuration is the same as if the required pipeline configuration
+added the project configuration with the [`include` keyword](../../ci/yaml/index.md#include).
+To view a project's full merged configuration, [View full configuration](../../ci/pipeline_editor/index.md#view-full-configuration)
+in the pipeline editor.
+
+To select a CI/CD template for the required pipeline configuration:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > CI/CD**.
+1. Expand the **Required pipeline configuration** section.
+1. Select a CI/CD template from the dropdown list.
+1. Select **Save changes**.
+
+## Package Registry configuration
+
+### Maven Forwarding **(PREMIUM SELF)**
+
+GitLab administrators can disable the forwarding of Maven requests to [Maven Central](https://search.maven.org/).
+
+To disable forwarding Maven requests:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > CI/CD**.
+1. Expand the **Package Registry** section.
+1. Clear the checkbox **Forward Maven package requests to the Maven Registry if the packages are not found in the GitLab Package Registry**.
+1. Select **Save changes**.
+
+### npm Forwarding **(PREMIUM SELF)**
+
+GitLab administrators can disable the forwarding of npm requests to [npmjs.com](https://www.npmjs.com/).
+
+To disable it:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > CI/CD**.
+1. Expand the **Package Registry** section.
+1. Clear the checkbox **Forward npm package requests to the npm Registry if the packages are not found in the GitLab Package Registry**.
+1. Select **Save changes**.
+
+### PyPI Forwarding **(PREMIUM SELF)**
+
+GitLab administrators can disable the forwarding of PyPI requests to [pypi.org](https://pypi.org/).
+
+To disable it:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > CI/CD**.
+1. Expand the **Package Registry** section.
+1. Clear the checkbox **Forward PyPI package requests to the PyPI Registry if the packages are not found in the GitLab Package Registry**.
+1. Select **Save changes**.
+
+### Package file size limits
+
+GitLab administrators can adjust the maximum allowed file size for each package type.
+
+To set the maximum file size:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > CI/CD**.
+1. Expand the **Package Registry** section.
+1. Find the package type you would like to adjust.
+1. Enter the maximum file size, in bytes.
+1. Select **Save size limits**.
+
+## Restrict runner registration by all users in an instance
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/22225) in GitLab 14.1.
+> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/368008) in GitLab 15.5.
+
+GitLab administrators can adjust who is allowed to register runners, by showing and hiding areas of the UI.
+
+When the registration sections are hidden in the UI, members of the project or group must contact administrators to enable runner registration in the group or project. If you plan to prevent registration, ensure users have access to the runners they need to run jobs.
+
+By default, all members of a project and group are able to register runners.
+
+To restrict all users in an instance from registering runners:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > CI/CD**.
+1. Expand **Runners**.
+1. In the **Runner registration** section, clear the **Members of the project can register runners** and
+ **Members of the group can register runners** checkboxes to remove runner registration from the UI.
+1. Select **Save changes**.
+
+NOTE:
+After you disable runner registration by members of a project, the registration
+token automatically rotates. The token is no longer valid and you must
+use the new registration token for the project.
+
+## Restrict runner registration by all members in a group
+
+Prerequisites:
+
+- Runner registration must be enabled for [all users in the instance](#restrict-runner-registration-by-all-users-in-an-instance).
+
+GitLab administrators can adjust group permissions to restrict runner registration by group members.
+
+To restrict runner registration by members in a specific group:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Overview > Groups** and find your group.
+1. Select **Edit**.
+1. Clear the **New group runners can be registered** checkbox if you want to disable runner registration by all members in the group. If the setting is read-only, you must enable runner registration for the [instance](#restrict-runner-registration-by-all-users-in-an-instance).
+1. Select **Save changes**.
+
+## Disable runner version management
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/114041) in GitLab 15.10.
+
+By default, GitLab instances periodically fetch official runner version data from GitLab.com to [determine whether the runners need upgrades](../../ci/runners/runners_scope.md#determine-which-runners-need-to-be-upgraded).
+
+To disable your instance fetching this data:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > CI/CD**.
+1. Expand **Runners**.
+1. In the **Runner version management** section, clear the **Fetch GitLab Runner release version data from GitLab.com** checkbox.
+1. Select **Save changes**.
+
+## Troubleshooting
+
+### 413 Request Entity Too Large
+
+When build jobs fail with the following error,
+increase the [maximum artifacts size](#maximum-artifacts-size).
+
+```plaintext
+Uploading artifacts as "archive" to coordinator... too large archive <job-id> responseStatus=413 Request Entity Too Large status=413" at end of a build job on pipeline when trying to store artifacts to <object-storage>.
+```
diff --git a/doc/administration/settings/deprecated_api_rate_limits.md b/doc/administration/settings/deprecated_api_rate_limits.md
new file mode 100644
index 00000000000..f8db0810af5
--- /dev/null
+++ b/doc/administration/settings/deprecated_api_rate_limits.md
@@ -0,0 +1,54 @@
+---
+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/product/ux/technical-writing/#assignments
+type: reference
+---
+
+# Deprecated API rate limits **(FREE SELF)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68645) in GitLab 14.4.
+
+Deprecated API endpoints are those which have been replaced with alternative
+functionality, but cannot be removed without breaking backward compatibility.
+Setting a restrictive rate limit on these endpoints can encourage users to
+switch to the alternatives.
+
+## Deprecated API endpoints
+
+Not all deprecated API endpoints are included in this rate limit - just those
+that might have a performance impact:
+
+- [`GET /groups/:id`](../../api/groups.md#details-of-a-group) **without** the `with_projects=0` query parameter.
+
+## Define Deprecated API rate limits
+
+Rate limits for deprecated API endpoints are disabled by default. When enabled, they supersede
+the general user and IP rate limits for requests to deprecated endpoints. You can keep any general user
+and IP rate limits already in place, and increase or decrease the rate limits
+for deprecated API endpoints. No other new features are provided by this override.
+
+Prerequisite:
+
+- You must have administrator access to the instance.
+
+To override the general user and IP rate limits for requests to deprecated API endpoints:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Network**.
+1. Expand **Deprecated API Rate Limits**.
+1. Select the checkboxes for the types of rate limits you want to enable:
+ - **Unauthenticated API request rate limit**
+ - **Authenticated API request rate limit**
+1. If you selected **unauthenticated**:
+ 1. Select the **Maximum unauthenticated API requests per period per IP**.
+ 1. Select the **Unauthenticated API rate limit period in seconds**.
+1. If you selected **authenticated**:
+ 1. Select the **Maximum authenticated API requests per period per user**.
+ 1. Select the **Authenticated API rate limit period in seconds**.
+
+## Related topics
+
+- [Rate limits](../../security/rate_limits.md)
+- [User and IP rate limits](../settings/user_and_ip_rate_limits.md)
diff --git a/doc/administration/settings/email.md b/doc/administration/settings/email.md
new file mode 100644
index 00000000000..e4972897aab
--- /dev/null
+++ b/doc/administration/settings/email.md
@@ -0,0 +1,125 @@
+---
+type: reference
+stage: Plan
+group: Project Management
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Email **(FREE SELF)**
+
+You can customize some of the content in emails sent from your GitLab instance.
+
+## Custom logo
+
+The logo in the header of some emails can be customized, see the [logo customization section](../../administration/appearance.md#navigation-bar).
+
+## Include author name in email notification email body **(PREMIUM SELF)**
+
+By default, GitLab overrides the email address in notification emails with the email address
+of the issue, merge request, or comment author. Enable this setting to include the author's email
+address in the body of the email instead.
+
+To include the author's email address in the email body:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Preferences**.
+1. Expand **Email**.
+1. Select the **Include author name in email notification email body** checkbox.
+1. Select **Save changes**.
+
+## Enable multipart email **(PREMIUM SELF)**
+
+GitLab can send email in multipart format (HTML and plain text) or plain text only.
+
+To enable multipart email:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Preferences**.
+1. Expand **Email**.
+1. Select **Enable multipart email**.
+1. Select **Save changes**.
+
+## Custom hostname for private commit emails **(PREMIUM SELF)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22560) in GitLab 11.5.
+
+This configuration option sets the email hostname for [private commit emails](../../user/profile/index.md#use-an-automatically-generated-private-commit-email).
+ By default it is set to `users.noreply.YOUR_CONFIGURED_HOSTNAME`.
+
+To change the hostname used in private commit emails:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Preferences**.
+1. Expand **Email**.
+1. Enter the desired hostname in the **Custom hostname (for private commit emails)** field.
+1. Select **Save changes**.
+
+NOTE:
+After the hostname is configured, every private commit email using the previous hostname is not
+recognized by GitLab. This can directly conflict with certain [Push rules](../../user/project/repository/push_rules.md) such as
+`Check whether author is a GitLab user` and `Check whether committer is the current authenticated user`.
+
+## Custom additional text **(PREMIUM SELF)**
+
+You can add additional text at the bottom of any email that GitLab sends. This additional text
+can be used for legal, auditing, or compliance reasons, for example.
+
+To add additional text to emails:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Preferences**.
+1. Expand **Email**.
+1. Enter your text in the **Additional text** field.
+1. Select **Save changes**.
+
+## User deactivation emails
+
+GitLab sends email notifications to users when their account has been deactivated.
+
+To disable these notifications:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Preferences**.
+1. Expand **Email**.
+1. Clear the **Enable user deactivation emails** checkbox.
+1. Select **Save changes**.
+
+### Custom additional text in deactivation emails **(FREE SELF)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/355964) in GitLab 15.9 [with a flag](../../administration/feature_flags.md) named `deactivation_email_additional_text`. Disabled by default.
+> - [Enabled on self-managed and GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/111882) in GitLab 15.9.
+
+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
+`deactivation_email_additional_text`.
+
+You can add additional text at the bottom of the email that GitLab sends to users when their account
+is deactivated. This email text is separate from the [custom additional text](#custom-additional-text)
+setting.
+
+To add additional text to deactivation emails:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Preferences**.
+1. Expand **Email**.
+1. Enter your text in the **Additional text for deactivation email** field.
+1. Select **Save changes**.
+
+<!-- ## 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, for example `### Getting error message X`.
+If you have none to add when creating a doc, leave this section in place
+but commented out to help encourage others to add to it in the future. -->
diff --git a/doc/administration/settings/external_authorization.md b/doc/administration/settings/external_authorization.md
new file mode 100644
index 00000000000..45887fdccb8
--- /dev/null
+++ b/doc/administration/settings/external_authorization.md
@@ -0,0 +1,144 @@
+---
+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/product/ux/technical-writing/#assignments
+---
+
+# External authorization control **(FREE SELF)**
+
+> [Moved](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/27056) from GitLab Premium to GitLab Free in 11.10.
+
+In highly controlled environments, it may be necessary for access policy to be
+controlled by an external service that permits access based on project
+classification and user access. GitLab provides a way to check project
+authorization with your own defined service.
+
+After the external service is configured and enabled, when a project is
+accessed, a request is made to the external service with the user information
+and project classification label assigned to the project. When the service
+replies with a known response, the result is cached for six hours.
+
+If the external authorization is enabled, GitLab further blocks pages and
+functionality that render cross-project data. That includes:
+
+- Most pages under Dashboard (Activity, Milestones, Snippets, Assigned merge
+ requests, Assigned issues, To-Do List).
+- Under a specific group (Activity, Contribution analytics, Issues, Issue boards,
+ Labels, Milestones, Merge requests).
+- Global and Group search are disabled.
+
+This is to prevent performing too many requests at once to the external
+authorization service.
+
+Whenever access is granted or denied this is logged in a log file called
+`external-policy-access-control.log`. Read more about the logs GitLab keeps in
+the [Linux package documentation](https://docs.gitlab.com/omnibus/settings/logs.html).
+
+When using TLS Authentication with a self signed certificate, the CA certificate
+needs to be trusted by the OpenSSL installation. When using GitLab installed
+using the Linux package, learn to install a custom CA in the
+[Linux package documentation](https://docs.gitlab.com/omnibus/settings/ssl/index.html).
+Alternatively, learn where to install custom certificates by using
+`openssl version -d`.
+
+## Configuration
+
+The external authorization service can be enabled by an administrator:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand **External authorization**.
+1. Complete the fields.
+1. Select **Save changes**.
+
+### Allow external authorization with deploy tokens and deploy keys
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/386656) in GitLab 15.9.
+> - Deploy tokens no longer being able to access container or package registries [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/387721) in GitLab 16.0.
+
+You can set your instance to allow external authorization for Git operations with
+[deploy tokens](../../user/project/deploy_tokens/index.md) or [deploy keys](../../user/project/deploy_keys/index.md).
+
+Prerequisites:
+
+- You must be using classification labels without a service URL for external authorization.
+
+To allow authorization with deploy tokens and keys:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand **External authorization**, and:
+ - Leave the service URL field empty.
+ - Select **Allow deploy tokens and deploy keys to be used with external authorization**.
+1. Select **Save changes**.
+
+WARNING:
+If you enable external authorization, deploy tokens cannot access container or package registries. If you use deploy tokens to access these registries, this measure breaks this use of these tokens. Disable external authorization to use tokens with container or package registries.
+
+## How it works
+
+When GitLab requests access, it sends a JSON POST request to the external
+service with this body:
+
+```json
+{
+ "user_identifier": "jane@acme.org",
+ "project_classification_label": "project-label",
+ "user_ldap_dn": "CN=Jane Doe,CN=admin,DC=acme",
+ "identities": [
+ { "provider": "ldap", "extern_uid": "CN=Jane Doe,CN=admin,DC=acme" },
+ { "provider": "bitbucket", "extern_uid": "2435223452345" }
+ ]
+}
+```
+
+The `user_ldap_dn` is optional and is only sent when the user is signed in
+through LDAP.
+
+`identities` contains the details of all the identities associated with the
+user. This is an empty array if there are no identities associated with the
+user.
+
+When the external authorization service responds with a status code 200, the
+user is granted access. When the external service responds with a status code
+401 or 403, the user is denied access. In any case, the request is cached for
+six hours.
+
+When denying access, a `reason` can be optionally specified in the JSON body:
+
+```json
+{
+ "reason": "You are not allowed access to this project."
+}
+```
+
+Any other status code than 200, 401 or 403 also deny access to the user, but the
+response isn't cached.
+
+If the service times out (after 500 ms), a message "External Policy Server did
+not respond" is displayed.
+
+## Classification labels
+
+You can use your own classification label in the project's
+**Settings > General > General project settings** page in the "Classification
+label" box. When no classification label is specified on a project, the default
+label defined in the [global settings](#configuration) is used.
+
+On all project pages, in the upper-right corner, the label appears.
+
+![classification label on project page](img/classification_label_on_project_page_v14_8.png)
+
+<!-- ## 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, for example `### Getting error message X`.
+If you have none to add when creating a doc, leave this section in place
+but commented out to help encourage others to add to it in the future. -->
diff --git a/doc/administration/settings/files_api_rate_limits.md b/doc/administration/settings/files_api_rate_limits.md
new file mode 100644
index 00000000000..cb5442c957f
--- /dev/null
+++ b/doc/administration/settings/files_api_rate_limits.md
@@ -0,0 +1,51 @@
+---
+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/product/ux/technical-writing/#assignments
+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.
+
+The [Repository files API](../../api/repository_files.md) enables you to
+fetch, create, update, and delete files in your repository. To improve the security
+and durability of your web application, you can enforce
+[rate limits](../../security/rate_limits.md) on this API. Any rate limits you
+create for the Files API override the [general user and IP rate limits](user_and_ip_rate_limits.md).
+
+## Define Files API rate limits
+
+Rate limits for the Files API are disabled by default. When enabled, they supersede
+the general user and IP rate limits for requests to the
+[Repository files API](../../api/repository_files.md). You can keep any general user
+and IP rate limits already in place, and increase or decrease the rate limits
+for the Files API. No other new features are provided by this override.
+
+Prerequisite:
+
+- You must have administrator access to the instance.
+
+To override the general user and IP rate limits for requests to the Repository files API:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Network**.
+1. Expand **Files API Rate Limits**.
+1. Select the checkboxes for the types of rate limits you want to enable:
+ - **Unauthenticated API request rate limit**
+ - **Authenticated API request rate limit**
+1. If you selected **unauthenticated**:
+ 1. Select the **Max unauthenticated API requests per period per IP**.
+ 1. Select the **Unauthenticated API rate limit period in seconds**.
+1. If you selected **authenticated**:
+ 1. Select the **Max authenticated API requests per period per user**.
+ 1. Select the **Authenticated API rate limit period in seconds**.
+
+## Related topics
+
+- [Rate limits](../../security/rate_limits.md)
+- [Repository files API](../../api/repository_files.md)
+- [User and IP rate limits](user_and_ip_rate_limits.md)
diff --git a/doc/administration/settings/floc.md b/doc/administration/settings/floc.md
new file mode 100644
index 00000000000..6bd5a6dfed4
--- /dev/null
+++ b/doc/administration/settings/floc.md
@@ -0,0 +1,42 @@
+---
+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/product/ux/technical-writing/#assignments
+---
+
+# Federated Learning of Cohorts (FLoC) **(FREE SELF)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60933) in GitLab 13.12.
+
+Federated Learning of Cohorts (FLoC) is a new feature of the Chrome browser.
+It works by categorizing users into different cohorts, so that
+advertisers can use this data to uniquely target and track users. For more
+information, see the [FLoC repository](https://github.com/WICG/floc).
+
+To avoid users being tracked and categorized in any GitLab instance, FLoC is
+disabled by default by sending the following header:
+
+```plaintext
+Permissions-Policy: interest-cohort=()
+```
+
+To enable it:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand **Federated Learning of Cohorts (FLoC)**.
+1. Select the **Participate in FLoC** checkbox.
+1. Select **Save changes**.
+
+<!-- ## 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, for example `### Getting error message X`.
+If you have none to add when creating a doc, leave this section in place
+but commented out to help encourage others to add to it in the future. -->
diff --git a/doc/administration/settings/git_lfs_rate_limits.md b/doc/administration/settings/git_lfs_rate_limits.md
new file mode 100644
index 00000000000..cb2cc80e397
--- /dev/null
+++ b/doc/administration/settings/git_lfs_rate_limits.md
@@ -0,0 +1,36 @@
+---
+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/product/ux/technical-writing/#assignments
+type: reference
+---
+
+# Rate limits on Git LFS **(FREE SELF)**
+
+[Git LFS (Large File Storage)](../../topics/git/lfs/index.md) is a Git extension
+for handling large files. If you use Git LFS in your repository, common Git operations
+can generate many Git LFS requests. You can enforce
+[general user and IP rate limits](../settings/user_and_ip_rate_limits.md), but you can also
+override the general setting to enforce additional limits on Git LFS requests. This
+override can improve the security and durability of your web application. Aside from
+precedence, this configuration provides the same features as the general user and IP
+rate limits.
+
+## Configure Git LFS rate limits
+
+Git LFS rate limits are disabled by default. If enabled and configured, these limits
+supersede the [general user and IP rate limits](../settings/user_and_ip_rate_limits.md):
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Network**.
+1. Expand **Git LFS Rate Limits**.
+1. Select **Enable authenticated Git LFS request rate limit**.
+1. Enter a value for **Max authenticated Git LFS requests per period per user**.
+1. Enter a value for **Authenticated Git LFS rate limit period in seconds**.
+1. Select **Save changes**.
+
+## Related topics
+
+- [Rate limiting](../../security/rate_limits.md)
+- [User and IP rate limits](../settings/user_and_ip_rate_limits.md)
diff --git a/doc/administration/settings/gitaly_timeouts.md b/doc/administration/settings/gitaly_timeouts.md
new file mode 100644
index 00000000000..49dc7763cd0
--- /dev/null
+++ b/doc/administration/settings/gitaly_timeouts.md
@@ -0,0 +1,27 @@
+---
+stage: Systems
+group: Gitaly
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Gitaly timeouts **(FREE SELF)**
+
+[Gitaly](../gitaly/index.md) timeouts are configurable. The timeouts can be
+configured to make sure that long-running Gitaly calls don't needlessly take up resources.
+
+To access Gitaly timeout settings:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Preferences**.
+1. Expand the **Gitaly timeouts** section.
+
+## Available timeouts
+
+The following timeouts are available.
+
+| Timeout | Default | Description |
+|:--------|:-----------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| Default | 55 seconds | Timeout for most Gitaly calls (not enforced for `git` `fetch` and `push` operations, or Sidekiq jobs). For example, checking if a repository exists on disk. Makes sure that Gitaly calls made within a web request cannot exceed the entire request timeout. It should be shorter than the [worker timeout](../operations/puma.md#change-the-worker-timeout) that can be configured for [Puma](../../install/requirements.md#puma-settings). If a Gitaly call timeout exceeds the worker timeout, the remaining time from the worker timeout is used to avoid having to terminate the worker. |
+| Fast | 10 seconds | Timeout for fast Gitaly operations used within requests, sometimes multiple times. For example, checking if a repository exists on disk. If fast operations exceed this threshold, there may be a problem with a storage shard. Failing fast can help maintain the stability of the GitLab instance. |
+| Medium | 30 seconds | Timeout for Gitaly operations that should be fast (possibly within requests) but preferably not used multiple times within a request. For example, loading blobs. Timeout that should be set between Default and Fast. |
diff --git a/doc/administration/settings/help_page.md b/doc/administration/settings/help_page.md
new file mode 100644
index 00000000000..46c2c395102
--- /dev/null
+++ b/doc/administration/settings/help_page.md
@@ -0,0 +1,111 @@
+---
+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/product/ux/technical-writing/#assignments
+type: howto
+---
+
+# Customize the Help and sign-in page messages **(FREE SELF)**
+
+In large organizations, it is useful to have information about who to contact or where
+to go for help. You can customize and display this information on the GitLab `/help` page and on
+the GitLab sign-in page.
+
+## Add a help message to the Help page
+
+You can add a help message, which is shown at the top of the GitLab `/help` page (for example,
+<https://gitlab.com/help>):
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Preferences**.
+1. Expand **Sign-in and Help page**.
+1. In **Additional text to show on the Help page**, enter the information you want to display on `/help`.
+1. Select **Save changes**.
+
+You can now see the message on `/help`.
+
+NOTE:
+By default, `/help` is visible to unauthenticated users. However, if the
+[**Public** visibility level](visibility_and_access_controls.md#restrict-visibility-levels)
+is restricted, `/help` is visible only to authenticated users.
+
+## Add a help message to the sign-in page
+
+You can add a help message, which is shown on the GitLab sign-in page. The message appears on the sign-in page:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Preferences**.
+1. Expand **Sign-in and Help page**.
+1. In **Additional text to show on the sign-in page**, enter the information you want to
+ display on the sign-in page.
+1. Select **Save changes**.
+
+You can now see the message on the sign-in page.
+
+## Hide marketing-related entries from the Help page
+
+GitLab marketing-related entries are occasionally shown on the Help page. To hide these entries:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Preferences**.
+1. Expand **Sign-in and Help page**.
+1. Select the **Hide marketing-related entries from the Help page** checkbox.
+1. Select **Save changes**.
+
+## Set a custom Support page URL
+
+You can specify a custom URL to which users are directed when they:
+
+- Select **Support** from the Help dropdown list.
+- Select **See our website for help** on the Help page.
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Preferences**.
+1. Expand **Sign-in and Help page**.
+1. In the **Support page URL** field, enter the URL.
+1. Select **Save changes**.
+
+## Redirect `/help` pages
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/43157) in GitLab 13.5.
+> - [Feature flag `help_page_documentation_redirect`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71737) removed in GitLab 14.4.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71737) in GitLab 14.4.
+
+You can redirect all `/help` links to a destination that meets the [necessary requirements](#destination-requirements).
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Preferences**.
+1. Expand **Sign-in and Help page**.
+1. In the **Documentation pages URL** field, enter the URL.
+1. Select **Save changes**.
+
+If the "Documentation pages URL" field is empty, the GitLab instance displays a basic version of the documentation sourced from the [`doc` directory](https://gitlab.com/gitlab-org/gitlab/-/tree/master/doc) of GitLab.
+
+### Destination requirements
+
+When redirecting `/help`, GitLab:
+
+- Redirects requests to the specified URL.
+- Appends `ee` and the documentation path, which includes the version number, to the URL.
+- Appends `.html` to the URL, and removes `.md` if necessary.
+
+For example, if the URL is set to `https://docs.gitlab.com`, requests for
+`/help/administration/settings/help_page.md` redirect to:
+`https://docs.gitlab.com/${VERSION}/ee/administration/settings/help_page.html`.
+
+<!-- ## 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, for example `### Getting error message X`.
+If you have none to add when creating a doc, leave this section in place
+but commented out to help encourage others to add to it in the future. -->
diff --git a/doc/administration/settings/img/bulk_push_event_v12_4.png b/doc/administration/settings/img/bulk_push_event_v12_4.png
new file mode 100644
index 00000000000..114e87a61f1
--- /dev/null
+++ b/doc/administration/settings/img/bulk_push_event_v12_4.png
Binary files differ
diff --git a/doc/administration/settings/img/classification_label_on_project_page_v14_8.png b/doc/administration/settings/img/classification_label_on_project_page_v14_8.png
new file mode 100644
index 00000000000..4bd2e7d389b
--- /dev/null
+++ b/doc/administration/settings/img/classification_label_on_project_page_v14_8.png
Binary files differ
diff --git a/doc/user/admin_area/settings/img/continuous_integration_shared_runner_details_input_v14_10.png b/doc/administration/settings/img/continuous_integration_shared_runner_details_input_v14_10.png
index 08451f36962..08451f36962 100644
--- a/doc/user/admin_area/settings/img/continuous_integration_shared_runner_details_input_v14_10.png
+++ b/doc/administration/settings/img/continuous_integration_shared_runner_details_input_v14_10.png
Binary files differ
diff --git a/doc/user/admin_area/settings/img/continuous_integration_shared_runner_details_v14_10.png b/doc/administration/settings/img/continuous_integration_shared_runner_details_v14_10.png
index 64bd9cf6911..64bd9cf6911 100644
--- a/doc/user/admin_area/settings/img/continuous_integration_shared_runner_details_v14_10.png
+++ b/doc/administration/settings/img/continuous_integration_shared_runner_details_v14_10.png
Binary files differ
diff --git a/doc/administration/settings/img/custom_git_clone_url_for_https_v12_4.png b/doc/administration/settings/img/custom_git_clone_url_for_https_v12_4.png
new file mode 100644
index 00000000000..22cdd15cc0c
--- /dev/null
+++ b/doc/administration/settings/img/custom_git_clone_url_for_https_v12_4.png
Binary files differ
diff --git a/doc/administration/settings/img/domain_denylist_v14_1.png b/doc/administration/settings/img/domain_denylist_v14_1.png
new file mode 100644
index 00000000000..e27997fc2c2
--- /dev/null
+++ b/doc/administration/settings/img/domain_denylist_v14_1.png
Binary files differ
diff --git a/doc/administration/settings/img/email_notification_for_unknown_sign_ins_v13_2.png b/doc/administration/settings/img/email_notification_for_unknown_sign_ins_v13_2.png
new file mode 100644
index 00000000000..fdcc542c4d7
--- /dev/null
+++ b/doc/administration/settings/img/email_notification_for_unknown_sign_ins_v13_2.png
Binary files differ
diff --git a/doc/administration/settings/img/file_template_user_dropdown.png b/doc/administration/settings/img/file_template_user_dropdown.png
new file mode 100644
index 00000000000..8c9eb49f6c9
--- /dev/null
+++ b/doc/administration/settings/img/file_template_user_dropdown.png
Binary files differ
diff --git a/doc/administration/settings/img/mirror_settings_v15_7.png b/doc/administration/settings/img/mirror_settings_v15_7.png
new file mode 100644
index 00000000000..5da41dbeceb
--- /dev/null
+++ b/doc/administration/settings/img/mirror_settings_v15_7.png
Binary files differ
diff --git a/doc/administration/settings/img/protected_paths.png b/doc/administration/settings/img/protected_paths.png
new file mode 100644
index 00000000000..2233a71a139
--- /dev/null
+++ b/doc/administration/settings/img/protected_paths.png
Binary files differ
diff --git a/doc/administration/settings/img/push_event_activities_limit_v12_4.png b/doc/administration/settings/img/push_event_activities_limit_v12_4.png
new file mode 100644
index 00000000000..ea618ad4c50
--- /dev/null
+++ b/doc/administration/settings/img/push_event_activities_limit_v12_4.png
Binary files differ
diff --git a/doc/administration/settings/img/rate_limit_on_issues_creation_v14_2.png b/doc/administration/settings/img/rate_limit_on_issues_creation_v14_2.png
new file mode 100644
index 00000000000..1a0a7548a91
--- /dev/null
+++ b/doc/administration/settings/img/rate_limit_on_issues_creation_v14_2.png
Binary files differ
diff --git a/doc/administration/settings/img/rate_limits_on_raw_endpoints.png b/doc/administration/settings/img/rate_limits_on_raw_endpoints.png
new file mode 100644
index 00000000000..c59f67df1ce
--- /dev/null
+++ b/doc/administration/settings/img/rate_limits_on_raw_endpoints.png
Binary files differ
diff --git a/doc/administration/settings/img/restricted_url.png b/doc/administration/settings/img/restricted_url.png
new file mode 100644
index 00000000000..c71abf0a226
--- /dev/null
+++ b/doc/administration/settings/img/restricted_url.png
Binary files differ
diff --git a/doc/administration/settings/img/sign_up_terms.png b/doc/administration/settings/img/sign_up_terms.png
new file mode 100644
index 00000000000..4cac9d426c9
--- /dev/null
+++ b/doc/administration/settings/img/sign_up_terms.png
Binary files differ
diff --git a/doc/user/admin_area/settings/img/suggest_pipeline_banner_v14_5.png b/doc/administration/settings/img/suggest_pipeline_banner_v14_5.png
index 0d9bfa4a173..0d9bfa4a173 100644
--- a/doc/user/admin_area/settings/img/suggest_pipeline_banner_v14_5.png
+++ b/doc/administration/settings/img/suggest_pipeline_banner_v14_5.png
Binary files differ
diff --git a/doc/administration/settings/img/two_factor_grace_period.png b/doc/administration/settings/img/two_factor_grace_period.png
new file mode 100644
index 00000000000..e7fb52969aa
--- /dev/null
+++ b/doc/administration/settings/img/two_factor_grace_period.png
Binary files differ
diff --git a/doc/administration/settings/img/update-available.png b/doc/administration/settings/img/update-available.png
new file mode 100644
index 00000000000..9887e06c7dc
--- /dev/null
+++ b/doc/administration/settings/img/update-available.png
Binary files differ
diff --git a/doc/administration/settings/import_export_rate_limits.md b/doc/administration/settings/import_export_rate_limits.md
new file mode 100644
index 00000000000..99385c77cdf
--- /dev/null
+++ b/doc/administration/settings/import_export_rate_limits.md
@@ -0,0 +1,31 @@
+---
+stage: Manage
+group: Import and Integrate
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Rate limits for imports and exports of project and groups **(FREE SELF)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35728) in GitLab 13.2.
+
+You can configure the rate limits for imports and exports of projects and groups:
+
+To change a rate limit:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Network**.
+1. Expand **Import and export rate limits**.
+1. Change the value of any rate limit. The rate limits are per minute per user, not per IP address.
+ Set to `0` to disable a rate limit.
+
+| Limit | Default |
+|-------------------------|---------|
+| Project Import | 6 |
+| Project Export | 6 |
+| Project Export Download | 1 |
+| Group Import | 6 |
+| Group Export | 6 |
+| Group Export Download | 1 |
+
+When a user exceeds a rate limit, it is logged in `auth.log`.
diff --git a/doc/administration/settings/incident_management_rate_limits.md b/doc/administration/settings/incident_management_rate_limits.md
new file mode 100644
index 00000000000..2a74c843107
--- /dev/null
+++ b/doc/administration/settings/incident_management_rate_limits.md
@@ -0,0 +1,39 @@
+---
+type: reference
+stage: Monitor
+group: Respond
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Incident management rate limits **(ULTIMATE SELF)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/17859) in GitLab 12.5.
+
+You can limit the number of inbound alerts for [incidents](../../operations/incident_management/incidents.md)
+that can be created in a period of time. The inbound [incident management](../../operations/incident_management/index.md)
+alert limit can help prevent overloading your incident responders by reducing the
+number of alerts or duplicate issues.
+
+As an example, if you set a limit of `10` requests every `60` seconds,
+and `11` requests are sent to an [alert integration endpoint](../../operations/incident_management/integrations.md) within one minute,
+the eleventh request is blocked. Access to the endpoint is allowed again after one minute.
+
+This limit is:
+
+- Applied independently per project.
+- Not applied per IP address.
+- Disabled by default.
+
+Requests that exceed the limit are logged into `auth.log`.
+
+## Set a limit on inbound alerts
+
+To set inbound incident management alert limits:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Network**.
+1. Expand **Incident Management Limits**.
+1. Select the **Enable Incident Management inbound alert limit** checkbox.
+1. Optional. Input a custom value for **Maximum requests per project per rate limit period**. Default is 3600.
+1. Optional. Input a custom value for **Rate limit period**. Default is 3600 seconds.
diff --git a/doc/administration/settings/index.md b/doc/administration/settings/index.md
new file mode 100644
index 00000000000..5fc0c029c30
--- /dev/null
+++ b/doc/administration/settings/index.md
@@ -0,0 +1,215 @@
+---
+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/product/ux/technical-writing/#assignments
+type: index
+---
+
+# Admin Area settings **(FREE SELF)**
+
+As an administrator of a GitLab self-managed instance, you can manage the behavior of your
+deployment.
+
+The **Admin Area** is not accessible on GitLab.com, and settings can only be changed by the
+GitLab.com administrators. For the settings and limits on the GitLab.com instance,
+read [GitLab.com settings](../../user/gitlab_com/index.md).
+
+## Access the Admin Area
+
+To access the **Admin Area**:
+
+1. Sign in to your GitLab instance as an administrator.
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings**, and the group of settings to view:
+ - [General](#general)
+ - [Geo](#geo)
+ - [CI/CD](#cicd)
+ - [Integrations](#integrations)
+ - [Metrics and profiling](#metrics-and-profiling)
+ - [Network](#network)
+ - [Preferences](#preferences)
+ - [Reporting](#reporting)
+ - [Repository](#repository)
+ - [Templates](#templates)
+
+### General
+
+The **General** settings contain:
+
+- [Visibility and access controls](../settings/visibility_and_access_controls.md) - Set default and
+ restrict visibility levels. Configure import sources and Git access protocol.
+- [Account and limit](../settings/account_and_limit_settings.md) - Set projects and maximum size limits,
+ session duration, user options, and check feature availability for namespace plan.
+- [Diff limits](../diff_limits.md) - Diff content limits.
+- [Sign-up restrictions](../settings/sign_up_restrictions.md) - Configure the way a user creates a new account.
+- [Sign in restrictions](../settings/sign_in_restrictions.md) - Set requirements for a user to sign in.
+ Enable mandatory two-factor authentication.
+- [Terms of Service and Privacy Policy](../settings/terms.md) - Include a Terms of Service agreement
+ and Privacy Policy that all users must accept.
+- [External Authentication](../../administration/settings/external_authorization.md#configuration) - External Classification Policy Authorization.
+- [Web terminal](../integration/terminal.md#limiting-websocket-connection-time) -
+ Set max session time for web terminal.
+- [FLoC](floc.md) - Enable or disable
+ [Federated Learning of Cohorts (FLoC)](https://en.wikipedia.org/wiki/Federated_Learning_of_Cohorts) tracking.
+- [GitLab for Slack app](../../user/admin_area/settings/slack_app.md) - Enable and configure the GitLab for Slack app.
+
+### CI/CD
+
+The **CI/CD** settings contain:
+
+- [Continuous Integration and Deployment](../../administration/settings/continuous_integration.md) -
+ Auto DevOps, runners and job artifacts.
+- [Required pipeline configuration](../../administration/settings/continuous_integration.md#required-pipeline-configuration) -
+ Set an instance-wide auto included [pipeline configuration](../../ci/yaml/index.md).
+ This pipeline configuration is run after the project's own configuration.
+- [Package Registry](../../administration/settings/continuous_integration.md#package-registry-configuration) -
+ Settings related to the use and experience of using the GitLab Package Registry. Some
+ [risks are involved](../../user/packages/container_registry/reduce_container_registry_storage.md#use-with-external-container-registries)
+ in enabling some of these settings.
+
+## Security and Compliance settings
+
+- [License compliance settings](security_and_compliance.md#choose-package-registry-metadata-to-sync): Enable or disable synchronization of package metadata by a registry type.
+
+### Geo **(PREMIUM SELF)**
+
+The **Geo** setting contains:
+
+- [Geo](../geo/index.md) - Replicate your GitLab instance to other
+ geographical locations. Redirects to **Admin Area > Geo > Settings** are no
+ longer available at **Admin Area > Settings > Geo** in [GitLab 13.0](https://gitlab.com/gitlab-org/gitlab/-/issues/36896).
+
+### Integrations
+
+The **Integrations** settings contain:
+
+- [Elasticsearch](../../integration/advanced_search/elasticsearch.md#enable-advanced-search) -
+ Elasticsearch integration. Elasticsearch AWS IAM.
+- [Kroki](../integration/kroki.md#enable-kroki-in-gitlab) -
+ Allow rendering of diagrams in AsciiDoc and Markdown documents using [kroki.io](https://kroki.io).
+- [Mailgun](../integration/mailgun.md) - Enable your GitLab instance
+ to receive invite email bounce events from Mailgun, if it is your email provider.
+- [PlantUML](../integration/plantuml.md) - Allow rendering of PlantUML
+ diagrams in documents.
+- [Customer experience improvement and third-party offers](../settings/third_party_offers.md) -
+ Control the display of customer experience improvement content and third-party offers.
+- [Snowplow](../../development/internal_analytics/snowplow/index.md) - Configure the Snowplow integration.
+- [Google GKE](../../user/project/clusters/add_gke_clusters.md) - Google GKE integration enables
+ you to provision GKE clusters from GitLab.
+- [Amazon EKS](../../user/project/clusters/add_eks_clusters.md) - Amazon EKS integration enables
+ you to provision EKS clusters from GitLab.
+
+### Metrics and profiling
+
+The **Metrics and profiling** settings contain:
+
+- [Metrics - Prometheus](../monitoring/prometheus/gitlab_metrics.md) -
+ Enable and configure Prometheus metrics.
+- [Metrics - Grafana](../monitoring/performance/grafana_configuration.md#integrate-with-gitlab-ui) -
+ Enable and configure Grafana.
+- [Profiling - Performance bar](../monitoring/performance/performance_bar.md#enable-the-performance-bar-for-non-administrators) -
+ Enable access to the Performance Bar for non-administrator users in a given group.
+- [Usage statistics](../settings/usage_statistics.md) - Enable or disable version check and Service Ping.
+
+### Network
+
+The **Network** settings contain:
+
+- Performance optimization - Various settings that affect GitLab performance, including:
+ - [Write to `authorized_keys` file](../operations/fast_ssh_key_lookup.md#set-up-fast-lookup).
+ - [Push event activities limit and bulk push events](../settings/push_event_activities_limit.md).
+- [User and IP rate limits](../settings/user_and_ip_rate_limits.md) - Configure limits for web and API requests.
+ These rate limits can be overridden:
+ - [Package Registry Rate Limits](../settings/package_registry_rate_limits.md) - Configure specific
+ limits for Packages API requests that supersede the user and IP rate limits.
+ - [Git LFS Rate Limits](../settings/git_lfs_rate_limits.md) - Configure specific limits for
+ Git LFS requests that supersede the user and IP rate limits.
+ - [Files API Rate Limits](../settings/files_api_rate_limits.md) - Configure specific limits for
+ Files API requests that supersede the user and IP rate limits.
+ - [Search rate limits](../instance_limits.md#search-rate-limit) - Configure global search request rate limits for authenticated and unauthenticated users.
+ - [Deprecated API Rate Limits](../settings/deprecated_api_rate_limits.md) - Configure specific limits
+ for deprecated API requests that supersede the user and IP rate limits.
+- [Outbound requests](../../security/webhooks.md) - Allow requests to the local network from webhooks and integrations, or deny all outbound requests.
+- [Protected Paths](../settings/protected_paths.md) - Configure paths to be protected by Rack Attack.
+- [Incident Management Limits](../../operations/incident_management/index.md) - Limit the
+ number of inbound alerts that can be sent to a project.
+- [Notes creation limit](../settings/rate_limit_on_notes_creation.md) - Set a rate limit on the note creation requests.
+- [Get single user limit](../settings/rate_limit_on_users_api.md) - Set a rate limit on users API endpoint to get a user by ID.
+- [Projects API rate limits for unauthenticated requests](../settings/rate_limit_on_projects_api.md) - Set a rate limit on Projects list API endpoint for unauthenticated requests.
+
+### Preferences
+
+The **Preferences** settings contain:
+
+- [Email](../settings/email.md) - Various email settings.
+- [What's new](../whats-new.md) - Configure **What's new** drawer and content.
+- [Help page](help_page.md) - Help page text and support page URL.
+- [Pages](../pages/index.md#custom-domain-verification) -
+ Size and domain settings for static websites.
+- [Polling interval multiplier](../polling.md) -
+ Configure how frequently the GitLab UI polls for updates.
+- [Gitaly timeouts](gitaly_timeouts.md) - Configure Gitaly timeouts.
+- Localization:
+ - [Default first day of the week](../../user/profile/preferences.md).
+ - [Time tracking](../../user/project/time_tracking.md#limit-displayed-units-to-hours).
+- [Sidekiq Job Limits](../settings/sidekiq_job_limits.md) - Limit the size of Sidekiq jobs stored in Redis.
+
+### Reporting
+
+The **Reporting** settings contain:
+
+- Spam and Anti-bot protection:
+ - Anti-spam services, such as [reCAPTCHA](../../integration/recaptcha.md),
+ [Akismet](../../integration/akismet.md), or [Spamcheck](../reporting/spamcheck.md).
+ - [IP address restrictions](../reporting/ip_addr_restrictions.md).
+- [Abuse reports](../review_abuse_reports.md) - Set notification email for abuse reports.
+- [Git abuse rate limit](../reporting/git_abuse_rate_limit.md) - Configure Git abuse rate limit settings. **(ULTIMATE SELF)**
+
+### Repository
+
+The **Repository** settings contain:
+
+- [Repository's custom initial branch name](../../user/project/repository/branches/default.md#instance-level-custom-initial-branch-name) -
+ Set a custom branch name for new repositories created in your instance.
+- [Repository's initial default branch protection](../../user/project/repository/branches/default.md#instance-level-default-branch-protection) -
+ Configure the branch protections to apply to every repository's default branch.
+- [Repository mirror](visibility_and_access_controls.md#enable-project-mirroring) -
+ Configure repository mirroring.
+- [Repository storage](../repository_storage_types.md) - Configure storage path settings.
+- Repository maintenance:
+ - [Repository checks](../repository_checks.md) - Configure
+ automatic Git checks on repositories.
+ - [Housekeeping](../housekeeping.md). Configure automatic
+ Git housekeeping on repositories.
+ - [Inactive project deletion](../inactive_project_deletion.md). Configure inactive
+ project deletion.
+- [Repository static objects](../static_objects_external_storage.md) -
+ Serve repository static objects (for example, archives and blobs) from an external storage (for example, a CDN).
+
+### Templates **(PREMIUM SELF)**
+
+The **Templates** settings contain:
+
+- [Templates](instance_template_repository.md#configuration) - Set instance-wide template repository.
+- [Custom project templates](../custom_project_templates.md) - Select the custom project template source group.
+
+## Default first day of the week
+
+You can change the [Default first day of the week](../../user/profile/preferences.md)
+for the entire GitLab instance:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Preferences**.
+1. Scroll to the **Localization** section, and select your desired first day of the week.
+
+## Default language
+
+You can change the [Default language](../../user/profile/preferences.md)
+for the entire GitLab instance:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Preferences**.
+1. Scroll to the **Localization** section, and select your desired default language.
diff --git a/doc/administration/settings/instance_template_repository.md b/doc/administration/settings/instance_template_repository.md
new file mode 100644
index 00000000000..8c8c9f44998
--- /dev/null
+++ b/doc/administration/settings/instance_template_repository.md
@@ -0,0 +1,84 @@
+---
+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/product/ux/technical-writing/#assignments"
+type: reference
+---
+
+# Instance template repository **(PREMIUM SELF)**
+
+> - [Improved](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52360) to behave like group-level templates in GitLab 13.9.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/321247) in GitLab 14.0.
+
+In hosted systems, enterprises often have a need to share their own templates
+across teams. This feature allows an administrator to pick a project to be the
+instance-wide collection of file templates. These templates are then exposed to
+all users through the [Web Editor](../../user/project/repository/web_editor.md)
+while the project remains secure.
+
+## Configuration
+
+To select a project to serve as the custom template repository:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Templates**.
+1. Expand **Templates**
+1. From the dropdown list, select the project to use as the template repository.
+1. Select **Save changes**.
+1. Add custom templates to the selected repository.
+
+After you add templates, you can use them for the entire instance.
+They are available in the [Web Editor](../../user/project/repository/web_editor.md)
+and through the [API settings](../../api/settings.md).
+
+## Supported file types and locations
+
+Templates must be added to a specific subdirectory in the repository,
+corresponding to the kind of template. The following types of custom templates
+are supported:
+
+| Type | Directory | Extension |
+| :---------------: | :-----------: | :-----------: |
+| `Dockerfile` | `Dockerfile` | `.dockerfile` |
+| `.gitignore` | `gitignore` | `.gitignore` |
+| `.gitlab-ci.yml` | `gitlab-ci` | `.yml` |
+| `LICENSE` | `LICENSE` | `.txt` |
+
+Each template must go in its respective subdirectory, have the correct
+extension and not be empty. So, the hierarchy should look like this:
+
+```plaintext
+|-- README.md
+|-- Dockerfile
+ |-- custom_dockerfile.dockerfile
+ |-- another_dockerfile.dockerfile
+|-- gitignore
+ |-- custom_gitignore.gitignore
+ |-- another_gitignore.gitignore
+|-- gitlab-ci
+ |-- custom_gitlab-ci.yml
+ |-- another_gitlab-ci.yml
+|-- LICENSE
+ |-- custom_license.txt
+ |-- another_license.txt
+```
+
+Your custom templates are displayed on the dropdown list when a new file is added through the GitLab UI:
+
+![Custom template dropdown list](img/file_template_user_dropdown.png)
+
+If this feature is disabled or no templates are present,
+no **Custom** section displays in the selection dropdown.
+
+<!-- ## 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, for example `### Getting error message X`.
+If you have none to add when creating a doc, leave this section in place
+but commented out to help encourage others to add to it in the future. -->
diff --git a/doc/administration/settings/package_registry_rate_limits.md b/doc/administration/settings/package_registry_rate_limits.md
new file mode 100644
index 00000000000..ffba5bbf15a
--- /dev/null
+++ b/doc/administration/settings/package_registry_rate_limits.md
@@ -0,0 +1,57 @@
+---
+stage: Package
+group: Package Registry
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+type: reference
+---
+
+# Package Registry Rate Limits **(FREE SELF)**
+
+With the [GitLab Package Registry](../../user/packages/package_registry/index.md),
+you can use GitLab as a private or public registry for a variety of common package managers. You can
+publish and share packages, which others can consume as a dependency in downstream projects through
+the [Packages API](../../api/packages.md).
+
+If downstream projects frequently download such dependencies, many requests are made through the
+Packages API. You may therefore reach enforced [user and IP rate limits](../settings/user_and_ip_rate_limits.md).
+To address this issue, you can define specific rate limits for the Packages API:
+
+- [Unauthenticated requests (per IP)](#enable-unauthenticated-request-rate-limit-for-packages-api).
+- [Authenticated API requests (per user)](#enable-authenticated-api-request-rate-limit-for-packages-api).
+
+These limits are disabled by default.
+
+When enabled, they supersede the general user and IP rate limits for requests to
+the Packages API. You can therefore keep the general user and IP rate limits, and
+increase the rate limits for the Packages API. Besides this precedence, there is
+no difference in functionality compared to the general user and IP rate limits.
+
+## Enable unauthenticated request rate limit for packages API
+
+To enable the unauthenticated request rate limit:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Network**.
+1. Expand **Package registry rate limits**.
+1. Select **Enable unauthenticated request rate limit**.
+
+ - Optional. Update the **Maximum unauthenticated requests per rate limit period per IP** value.
+ Defaults to `800`.
+ - Optional. Update the **Unauthenticated rate limit period in seconds** value.
+ Defaults to `15`.
+
+## Enable authenticated API request rate limit for packages API
+
+To enable the authenticated API request rate limit:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Network**
+1. Expand **Package registry rate limits**.
+1. Select **Enable authenticated API request rate limit**.
+
+ - Optional. Update the **Maximum authenticated API requests per rate limit period per user** value.
+ Defaults to `1000`.
+ - Optional. Update the **Authenticated API rate limit period in seconds** value.
+ Defaults to `15`.
diff --git a/doc/administration/settings/project_integration_management.md b/doc/administration/settings/project_integration_management.md
new file mode 100644
index 00000000000..1bb4465020c
--- /dev/null
+++ b/doc/administration/settings/project_integration_management.md
@@ -0,0 +1,138 @@
+---
+stage: Manage
+group: Import and Integrate
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Project integration management **(FREE)**
+
+Project integrations can be configured and enabled by project administrators. As a GitLab instance
+administrator, you can set default configuration parameters for a given integration that all projects
+can inherit and use, enabling the integration for all projects that are not already using custom
+settings.
+
+You can update these default settings at any time, changing the settings used for all projects that
+are set to use instance-level or group-level defaults. Updating the default settings also enables the integration
+for all projects that didn't have it already enabled.
+
+Only the complete settings for an integration can be inherited. Per-field inheritance is [planned](https://gitlab.com/groups/gitlab-org/-/epics/2137).
+
+## Manage instance-level default settings for a project integration **(FREE SELF)**
+
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2137) in GitLab 13.3 for project-level integrations.
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2543) in GitLab 13.6 for group-level integrations.
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Integrations**.
+1. Select an integration.
+1. Enter configuration details and select **Save changes**.
+
+WARNING:
+This may affect all or most of the groups and projects on your GitLab instance. Review the details
+below.
+
+If this is the first time you are setting up instance-level settings for an integration:
+
+- The integration is enabled for all groups and projects that don't already have this integration configured,
+ if you have the **Enable integration** toggle turned on in the instance-level settings.
+- Groups and projects that already have the integration configured are not affected, but can choose to use the
+ inherited settings at any time.
+
+When you make further changes to the instance defaults:
+
+- They are immediately applied to all groups and projects that have the integration set to use default settings.
+- They are immediately applied to newer groups and projects, created after you last saved defaults for the
+ integration. If your instance-level default setting has the **Enable integration** toggle turned
+ on, the integration is automatically enabled for all such groups and projects.
+- Groups and projects with custom settings selected for the integration are not immediately affected and may
+ choose to use the latest defaults at any time.
+
+Only the complete settings for an integration can be inherited. Per-field inheritance
+is [planned](https://gitlab.com/groups/gitlab-org/-/epics/2137). This would allow
+administrators to update settings inherited by groups and projects without enabling the
+integration on all non-configured groups and projects by default.
+
+### Remove an instance-level default setting
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Integrations**.
+1. Select an integration.
+1. Select **Reset** and confirm.
+
+Resetting an instance-level default setting removes the integration from all projects that have the integration set to use default settings.
+
+### View projects that override the default settings
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/218252) in GitLab 14.2.
+
+You can view which projects in your instance use custom settings that [override the instance-level default settings](#use-custom-settings-for-a-group-or-project-integration)
+for an integration.
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Integrations**.
+1. Select an integration.
+1. Select the **Projects using custom settings** tab.
+
+## Manage group-level default settings for a project integration
+
+> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2543) in GitLab 13.6.
+
+1. Navigate to the group's **Settings > Integrations**.
+1. Select an integration.
+1. Enter configuration details and select **Save changes**.
+
+WARNING:
+This may affect all or most of the subgroups and projects belonging to the group. Review the details below.
+
+If this is the first time you are setting up group-level settings for an integration:
+
+- The integration is enabled for all subgroups and projects belonging to the group that don't already have
+ this integration configured, if you have the **Enable integration** toggle turned on in the group-level
+ settings.
+- Subgroups and projects that already have the integration configured are not affected, but can choose to use
+ the inherited settings at any time.
+
+When you make further changes to the group defaults:
+
+- They are immediately applied to all subgroups and projects belonging to the group that have the integration
+ set to use default settings.
+- They are immediately applied to newer subgroups and projects, even those created after you last saved defaults for the
+ integration. If your group-level default setting has the **Enable integration** toggle turned on,
+ the integration is automatically enabled for all such subgroups and projects.
+
+- Subgroups and projects with custom settings selected for the integration are not immediately affected and
+ may choose to use the latest defaults at any time.
+
+Only the complete settings for an integration can be inherited. Per-field inheritance
+is [planned](https://gitlab.com/groups/gitlab-org/-/epics/2137). This would allow
+administrators to update settings inherited by subgroups and projects without enabling the
+integration on all non-configured groups and projects by default.
+
+### Remove a group-level default setting
+
+1. Navigate to the group's **Settings > Integrations**.
+1. Select an integration.
+1. Select **Reset** and confirm.
+
+Resetting a group-level default setting removes integrations that use default settings and belong to a project or subgroup of the group.
+
+## Use instance-level or group-level default settings for a project integration
+
+> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2543) in GitLab 13.6 for group-level settings.
+
+1. Navigate to **Project > Settings > Integrations**.
+1. Choose the integration you want to enable or update.
+1. From the dropdown list, select **Use default settings**.
+1. Ensure the toggle is set to **Enable integration**.
+1. Select **Save changes**.
+
+## Use custom settings for a group or project integration
+
+1. Navigate to project or group's **Settings > Integrations**.
+1. Choose the integration you want to enable or update.
+1. From the dropdown list, select **Use custom settings**.
+1. Ensure the toggle is set to **Enable integration** and enter all required settings.
+1. Select **Save changes**.
diff --git a/doc/administration/settings/protected_paths.md b/doc/administration/settings/protected_paths.md
new file mode 100644
index 00000000000..ba257983619
--- /dev/null
+++ b/doc/administration/settings/protected_paths.md
@@ -0,0 +1,43 @@
+---
+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/product/ux/technical-writing/#assignments
+type: reference
+---
+
+# Protected paths **(FREE SELF)**
+
+Rate limiting is a technique that improves the security and durability of a web
+application. For more details, see [Rate limits](../../security/rate_limits.md).
+
+You can rate limit (protect) specified paths. For these paths, GitLab responds with HTTP status
+code `429` to POST requests at protected paths that exceed 10 requests per minute per IP address.
+
+For example, the following are limited to a maximum 10 requests per minute:
+
+- User sign-in
+- User sign-up (if enabled)
+- User password reset
+
+After 10 requests, the client must wait 60 seconds before it can try again.
+
+See also:
+
+- List of paths [protected by default](../instance_limits.md#by-protected-path).
+- [User and IP rate limits](user_and_ip_rate_limits.md#response-headers)
+ for the headers returned to blocked requests.
+
+## Configure protected paths
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/31246) in GitLab 12.4.
+
+Throttling of protected paths is enabled by default and can be disabled or
+customized on **Admin > Network > Protected Paths**, along with these options:
+
+- Maximum number of requests per period per user.
+- Rate limit period in seconds.
+- Paths to be protected.
+
+![protected-paths](img/protected_paths.png)
+
+Requests over the rate limit are logged into `auth.log`.
diff --git a/doc/administration/settings/push_event_activities_limit.md b/doc/administration/settings/push_event_activities_limit.md
new file mode 100644
index 00000000000..117e7322e30
--- /dev/null
+++ b/doc/administration/settings/push_event_activities_limit.md
@@ -0,0 +1,38 @@
+---
+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/product/ux/technical-writing/#assignments"
+type: reference
+---
+
+# Push event activities limit and bulk push events **(FREE)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31007) in GitLab 12.4.
+
+Set the number of branches or tags to limit the number of single push events
+allowed at once. If the number of events is greater than this, GitLab creates
+bulk push event instead.
+
+For example, if 4 branches are pushed and the limit is currently set to 3,
+the activity feed displays:
+
+![Bulk push event](img/bulk_push_event_v12_4.png)
+
+With this feature, when a single push includes a lot of changes (for example, 1,000
+branches), only 1 bulk push event is created instead of 1,000 push
+events. This helps in maintaining good system performance and preventing spam on
+the activity feed.
+
+To modify this setting:
+
+- In the Admin Area:
+ 1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+ 1. Select **Admin Area**.
+ 1. Select **Settings > Network**.
+ 1. Expand **Performance optimization**.
+- Through the [Application settings API](../../api/settings.md#list-of-settings-that-can-be-accessed-via-api-calls)
+ as `push_event_activities_limit`.
+
+The default value is `3`, but the value can be greater than or equal to `0`. Setting this value to `0` does not disable throttling.
+
+![Push event activities limit](img/push_event_activities_limit_v12_4.png)
diff --git a/doc/administration/settings/rate_limit_on_issues_creation.md b/doc/administration/settings/rate_limit_on_issues_creation.md
new file mode 100644
index 00000000000..d8bc04fcdd3
--- /dev/null
+++ b/doc/administration/settings/rate_limit_on_issues_creation.md
@@ -0,0 +1,36 @@
+---
+type: reference
+stage: Plan
+group: Project Management
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Rate limits on issue creation **(FREE SELF)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/28129) in GitLab 12.10.
+
+This setting allows you to rate limit the requests to the issue and epic creation endpoints.
+To can change its value:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Network**.
+1. Expand **Issues Rate Limits**.
+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
+[Projects::IssuesController#create](https://gitlab.com/gitlab-org/gitlab/blob/master/app/controllers/projects/issues_controller.rb)
+action exceeding a rate of 300 per minute are blocked. Access to the endpoint is allowed after one minute.
+
+When using [epics](../../user/group/epics/index.md), epic creation shares this rate limit with issues.
+
+![Rate limits on issues creation](img/rate_limit_on_issues_creation_v14_2.png)
+
+This limit is:
+
+- Applied independently per project and per user.
+- Not applied per IP address.
+- Disabled by default. To enable it, set the option to any value other than `0`.
+
+Requests over the rate limit are logged into the `auth.log` file.
diff --git a/doc/administration/settings/rate_limit_on_notes_creation.md b/doc/administration/settings/rate_limit_on_notes_creation.md
new file mode 100644
index 00000000000..59548836e78
--- /dev/null
+++ b/doc/administration/settings/rate_limit_on_notes_creation.md
@@ -0,0 +1,35 @@
+---
+type: reference
+stage: Plan
+group: Project Management
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Rate limits on note creation **(FREE SELF)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/53637) in GitLab 13.9.
+
+You can configure the per-user rate limit for requests to the note creation endpoint.
+
+To change the note creation rate limit:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Network**.
+1. Expand **Notes rate limit**.
+1. In the **Maximum requests per minute** box, enter the new value.
+1. Optional. In the **Users to exclude from the rate limit** box, list users allowed to exceed the limit.
+1. Select **Save changes**.
+
+This limit is:
+
+- Applied independently per user.
+- Not applied per IP address.
+
+The default value is `300`.
+
+Requests over the rate limit are logged into the `auth.log` file.
+
+For example, if you set a limit of 300, requests using the
+[Projects::NotesController#create](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/notes_controller.rb)
+action exceeding a rate of 300 per minute are blocked. Access to the endpoint is allowed after one minute.
diff --git a/doc/administration/settings/rate_limit_on_pipelines_creation.md b/doc/administration/settings/rate_limit_on_pipelines_creation.md
new file mode 100644
index 00000000000..19e1410ef73
--- /dev/null
+++ b/doc/administration/settings/rate_limit_on_pipelines_creation.md
@@ -0,0 +1,35 @@
+---
+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/product/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/index.md) within one minute,
+the eleventh request is blocked. Access to the endpoint is allowed again after one minute.
+
+This limit is:
+
+- Applied to the number of pipelines created for the same combination of project, commit, and user.
+- 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 left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Network**.
+1. Expand **Pipelines Rate Limits**.
+1. Under **Max requests per minute**, enter a value greater than `0`.
+1. Select **Save changes**.
+1. Enable `ci_enforce_throttle_pipelines_creation` feature flag to enable the rate limit.
diff --git a/doc/administration/settings/rate_limit_on_projects_api.md b/doc/administration/settings/rate_limit_on_projects_api.md
new file mode 100644
index 00000000000..2192e4355c0
--- /dev/null
+++ b/doc/administration/settings/rate_limit_on_projects_api.md
@@ -0,0 +1,37 @@
+---
+type: reference
+stage: Data Stores
+group: Tenant Scale
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Rate limit on Projects API **(FREE SELF)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/112283) in GitLab 15.10 with a [flag](../feature_flags.md) named `rate_limit_for_unauthenticated_projects_api_access`. Disabled by default.
+> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/391922) on May 08, 2023.
+> - [Enabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/119603) in GitLab 16.0 by default.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/120445) in GitLab 16.0. Feature flag `rate_limit_for_unauthenticated_projects_api_access` removed.
+
+You can configure the rate limit per IP address for unauthenticated requests to the [list all projects API](../../api/projects.md#list-all-projects).
+
+To change the rate limit:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Network**.
+1. Expand **Projects API rate limit**.
+1. In the **Maximum requests per 10 minutes per IP address** text box, enter the new value.
+1. Select **Save changes**.
+
+The rate limit:
+
+- Applies per IP address.
+- Doesn't apply to authenticated requests.
+- Can be set to 0 to disable rate limiting.
+
+The default value of the rate limit is `400`.
+
+Requests over the rate limit are logged into the `auth.log` file.
+
+For example, if you set a limit of 400, unauthenticated requests to the `GET /projects` API endpoint that
+exceed a rate of 400 within 10 minutes are blocked. Access to the endpoint is restored after ten minutes have elapsed.
diff --git a/doc/administration/settings/rate_limit_on_users_api.md b/doc/administration/settings/rate_limit_on_users_api.md
new file mode 100644
index 00000000000..9424e508d86
--- /dev/null
+++ b/doc/administration/settings/rate_limit_on_users_api.md
@@ -0,0 +1,34 @@
+---
+type: reference
+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/product/ux/technical-writing/#assignments
+---
+
+# Rate limits on Users API **(FREE SELF)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78364) in GitLab 14.8.
+
+You can configure the per user rate limit for requests to [Users API](../../api/users.md).
+
+To change the rate limit:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Network**.
+1. Expand **Users API rate limit**.
+1. In the **Maximum requests per 10 minutes** text box, enter the new value.
+1. Optional. In the **Users to exclude from the rate limit** box, list users allowed to exceed the limit.
+1. Select **Save changes**.
+
+This limit is:
+
+- Applied independently per user.
+- Not applied per IP address.
+
+The default value is `300`.
+
+Requests over the rate limit are logged into the `auth.log` file.
+
+For example, if you set a limit of 300, requests to the `GET /users/:id` API endpoint
+exceeding a rate of 300 per 10 minutes are blocked. Access to the endpoint is allowed after ten minutes have elapsed.
diff --git a/doc/administration/settings/rate_limits_on_git_ssh_operations.md b/doc/administration/settings/rate_limits_on_git_ssh_operations.md
new file mode 100644
index 00000000000..64acb15b8ac
--- /dev/null
+++ b/doc/administration/settings/rate_limits_on_git_ssh_operations.md
@@ -0,0 +1,33 @@
+---
+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/product/ux/technical-writing/#assignments
+type: reference
+---
+
+# Rate limits on Git SSH operations **(FREE SELF)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78373) in GitLab 14.7 [with a flag](../feature_flags.md) named `rate_limit_gitlab_shell`. Available by default without a feature flag from 15.8.
+
+GitLab applies rate limits to Git operations that use SSH by user account and project. When the rate limit is exceeded, GitLab rejects
+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.
+
+Users on self-managed GitLab can disable this rate limit.
+
+## Configure GitLab Shell operation limit
+
+`Git operations using SSH` is enabled by default. Defaults to 600 per user per minute.
+
+1. On the left sidebar, select **Your work > Admin Area**.
+1. On the left sidebar, select **Settings > Network**.
+1. Expand **Git SSH operations rate limit**.
+1. Enter a value for **Maximum number of Git operations per minute**.
+1. Select **Save changes**.
diff --git a/doc/administration/settings/rate_limits_on_raw_endpoints.md b/doc/administration/settings/rate_limits_on_raw_endpoints.md
new file mode 100644
index 00000000000..78e65f7ba7b
--- /dev/null
+++ b/doc/administration/settings/rate_limits_on_raw_endpoints.md
@@ -0,0 +1,29 @@
+---
+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/product/ux/technical-writing/#assignments
+type: reference
+---
+
+# Rate limits on raw endpoints **(FREE SELF)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/30635) in GitLab 12.2.
+
+This setting defaults to `300` requests per minute, and allows you to rate limit the requests to raw endpoints:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Network**.
+1. Expand **Performance optimization**.
+
+For example, requests over `300` per minute to `https://gitlab.com/gitlab-org/gitlab-foss/raw/master/app/controllers/application_controller.rb` are blocked. Access to the raw file is released after 1 minute.
+
+![Rate limits on raw endpoints](img/rate_limits_on_raw_endpoints.png)
+
+This limit is:
+
+- Applied independently per project, per file path.
+- Not applied per IP address.
+- Active by default. To disable, set the option to `0`.
+
+Requests over the rate limit are logged into `auth.log`.
diff --git a/doc/administration/settings/scim_setup.md b/doc/administration/settings/scim_setup.md
new file mode 100644
index 00000000000..6a02a5b832c
--- /dev/null
+++ b/doc/administration/settings/scim_setup.md
@@ -0,0 +1,43 @@
+---
+type: reference, howto
+stage: Manage
+group: Authentication and Authorization
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Configure SCIM for self-managed GitLab instances **(PREMIUM SELF)**
+
+> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/8902) in GitLab 15.8.
+
+You can use the open standard System for Cross-domain Identity Management (SCIM) to automatically:
+
+- Create users.
+- Block users.
+
+The [internal GitLab SCIM API](../../development/internal_api/index.md#instance-scim-api) implements part of [the RFC7644 protocol](https://www.rfc-editor.org/rfc/rfc7644).
+
+If you are a GitLab.com user, see [configuring SCIM for GitLab.com groups](../../user/group/saml_sso/scim_setup.md).
+
+## Configure GitLab
+
+Prerequisites:
+
+- Configure [SAML single sign-on](../../integration/saml.md).
+
+To configure GitLab SCIM:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand the **SCIM Token** section and select **Generate a SCIM token**.
+1. For configuration of your identity provider, save the:
+ - Token from the **Your SCIM token** field.
+ - URL from the **SCIM API endpoint URL** field.
+
+## Remove access
+
+Removing or deactivating a user on the identity provider blocks the user on
+the GitLab instance, while the SCIM identity remains linked to the GitLab user.
+
+To update the user SCIM identity, use the
+[internal GitLab SCIM API](../../development/internal_api/index.md#update-a-single-scim-provisioned-user-1).
diff --git a/doc/administration/settings/security_and_compliance.md b/doc/administration/settings/security_and_compliance.md
new file mode 100644
index 00000000000..2237866ad9c
--- /dev/null
+++ b/doc/administration/settings/security_and_compliance.md
@@ -0,0 +1,25 @@
+---
+stage: Secure
+group: Composition Analysis
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+type: howto
+---
+
+# Security and Compliance Admin Area settings **(ULTIMATE SELF)**
+
+The settings for package metadata synchronization are located in the [Admin Area](index.md).
+
+## Choose package registry metadata to sync
+
+WARNING:
+The full package metadata sync can add up to 30 GB to the PostgreSQL database. Ensure you have provisioned enough disk space for the database before enabling this feature.
+We are actively working on reducing this data size in [epic 10415](https://gitlab.com/groups/gitlab-org/-/epics/10415).
+
+To choose the packages you want to synchronize with the GitLab License Database for [License Compliance](../../user/compliance/license_scanning_of_cyclonedx_files/index.md):
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Security and Compliance**.
+1. Expand **License Compliance**.
+1. Select or clear checkboxes for the package registries that you want to sync.
+1. Select **Save changes**.
diff --git a/doc/administration/settings/sidekiq_job_limits.md b/doc/administration/settings/sidekiq_job_limits.md
new file mode 100644
index 00000000000..d5cd24c5237
--- /dev/null
+++ b/doc/administration/settings/sidekiq_job_limits.md
@@ -0,0 +1,35 @@
+---
+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/product/ux/technical-writing/#assignments
+type: reference
+---
+
+# Sidekiq job size limits **(FREE SELF)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68982) in GitLab 14.3.
+
+[Sidekiq](../sidekiq/index.md) jobs get stored in
+Redis. To avoid excessive memory for Redis, we:
+
+- Compress job arguments before storing them in Redis.
+- Reject jobs that exceed the specified threshold limit after compression.
+
+To access Sidekiq job size limits:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Preferences**.
+1. Expand **Sidekiq job size limits**.
+1. Adjust the compression threshold or size limit. The compression can
+ be disabled by selecting the **Track** mode.
+
+## Available settings
+
+| Setting | Default | Description |
+|-------------------------------------------|------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| Limiting mode | Compress | This mode compresses the jobs at the specified threshold and rejects them if they exceed the specified limit after compression. |
+| Sidekiq job compression threshold (bytes) | 100 000 (100 KB) | When the size of arguments exceeds this threshold, they are compressed before being stored in Redis. |
+| Sidekiq job size limit (bytes) | 0 | The jobs exceeding this size after compression are rejected. This avoids excessive memory usage in Redis leading to instability. Setting it to 0 prevents rejecting jobs. |
+
+After changing these values, [restart Sidekiq](../restart_gitlab.md).
diff --git a/doc/administration/settings/sign_in_restrictions.md b/doc/administration/settings/sign_in_restrictions.md
new file mode 100644
index 00000000000..393c7dd6aeb
--- /dev/null
+++ b/doc/administration/settings/sign_in_restrictions.md
@@ -0,0 +1,203 @@
+---
+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/product/ux/technical-writing/#assignments
+---
+
+# Sign-in restrictions **(FREE SELF)**
+
+You can use **Sign-in restrictions** to customize authentication restrictions for web interfaces as well as Git over HTTP(S).
+
+## Settings
+
+To access sign-in restriction settings:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand the **Sign-in restrictions** section.
+
+## Password authentication enabled
+
+You can restrict the password authentication for web interface and Git over HTTP(S):
+
+- **Web interface**: When this feature is disabled, the **Standard** sign-in tab
+ is removed and an [external authentication provider](../auth/index.md)
+ must be used.
+- **Git over HTTP(S)**: When this feature is disabled, a [Personal Access Token](../../user/profile/personal_access_tokens.md)
+ or LDAP password must be used to authenticate.
+
+In the event of an external authentication provider outage, use the [GitLab Rails console](../operations/rails_console.md) to [re-enable the standard web sign-in form](#re-enable-standard-web-sign-in-form-in-rails-console). This configuration can also be changed over the [Application settings REST API](../../api/settings.md#change-application-settings) while authenticating with an administrator account's personal access token.
+
+## Admin Mode
+
+> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2158) in GitLab 13.10.
+
+If you're an administrator, you might want to work in GitLab without administrator access.
+You could either create a separate user account that does not have
+administrator access or use Admin Mode.
+
+With Admin Mode, your account does not have administrator access by default.
+You can continue to access groups and projects you're a member of. However, for administrative tasks,
+you must authenticate (except for [certain features](#limitations-of-admin-mode)).
+
+When Admin Mode is enabled, it applies to all administrators on the instance.
+
+When Admin Mode is enabled for an instance, administrators:
+
+- Are allowed to access group and projects for which they are members.
+- Cannot access the **Admin Area**.
+
+### Enable Admin Mode for your instance
+
+Administrators can enable Admin Mode though the API, the Rails console, or the UI.
+
+#### Use the API to enable Admin Mode
+
+Make the following request to your instance endpoint:
+
+```shell
+curl --request PUT --header "PRIVATE-TOKEN:$ADMIN_TOKEN" "<gitlab.example.com>/api/v4/application/settings?admin_mode=true"
+```
+
+Replace `<gitlab.example.com>` with your instance URL.
+
+For more information, see the [list of settings that can be accessed through API calls](../../api/settings.md).
+
+#### Use the Rails console to enable Admin Mode
+
+Open the [Rails console](../operations/rails_console.md) and run the following:
+
+```ruby
+::Gitlab::CurrentSettings.update!(admin_mode: true)
+```
+
+#### Use the UI to enable Admin Mode
+
+To enable Admin Mode through the UI:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand **Sign-in restrictions**.
+1. In the **Admin Mode** section, select the **Require additional authentication for administrative tasks** checkbox.
+
+### Turn on Admin Mode for your session
+
+To turn on Admin Mode for your current session and access potentially dangerous resources:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Enter Admin Mode**.
+1. Try to access any part of the UI with `/admin` in the URL (which requires administrator access).
+
+When Admin Mode status is disabled or turned off, administrators cannot access resources unless
+they've been explicitly granted access. For example, administrators get a `404` error
+if they try to open a private group or project, unless they are members of that group or project.
+
+2FA should be enabled for administrators. 2FA, OmniAuth providers, and LDAP
+authentication are supported by Admin Mode. Admin Mode status is stored in the current user session and remains active until either:
+
+- It is explicitly disabled.
+- It is disabled automatically after six hours.
+
+### Turn off Admin Mode for your session
+
+To turn off Admin Mode for your current session:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Leave Admin Mode**.
+
+### Limitations of Admin Mode
+
+Admin Mode times out after six hours, and you cannot change this timeout limit.
+
+The following access methods are **not** protected by Admin Mode:
+
+- Git client access (SSH using public keys or HTTPS using Personal Access Tokens).
+
+In other words, administrators who are otherwise limited by Admin Mode can still use
+Git clients without additional authentication steps.
+
+To use the GitLab REST- or GraphQL API, administrators must [create a personal access token](../../user/profile/personal_access_tokens.md#create-a-personal-access-token) with the [`admin_mode` scope](../../user/profile/personal_access_tokens.md#personal-access-token-scopes).
+
+If an administrator with a personal access token with the `admin_mode` scope loses their administrator access, that user cannot access the API as an administrator even though they still have the token with the `admin_mode` scope.
+
+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).
+
+Also, when GitLab Geo is enabled, you can't view the replication status of projects and designs while
+on a secondary node. A fix is proposed when projects ([issue 367926](https://gitlab.com/gitlab-org/gitlab/-/issues/367926)) and designs ([issue 355660](https://gitlab.com/gitlab-org/gitlab/-/issues/355660)) move to the new Geo framework.
+
+### Troubleshooting Admin Mode
+
+If necessary, you can disable **Admin Mode** as an administrator by using one of these two methods:
+
+- **API**:
+
+ ```shell
+ curl --request PUT --header "PRIVATE-TOKEN:$ADMIN_TOKEN" "<gitlab-url>/api/v4/application/settings?admin_mode=false"
+ ```
+
+- [**Rails console**](../operations/rails_console.md#starting-a-rails-console-session):
+
+ ```ruby
+ ::Gitlab::CurrentSettings.update!(admin_mode: false)
+ ```
+
+## Two-factor authentication
+
+When this feature is enabled, all users must use the [two-factor authentication](../../user/profile/account/two_factor_authentication.md).
+
+After the two-factor authentication is configured as mandatory, users are allowed
+to skip forced configuration of two-factor authentication for the configurable grace
+period in hours.
+
+![Two-factor grace period](img/two_factor_grace_period.png)
+
+## Email notification for unknown sign-ins
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/218457) in GitLab 13.2.
+
+When enabled, GitLab notifies users of sign-ins from unknown IP addresses or devices. For more information,
+see [Email notification for unknown sign-ins](../../user/profile/notifications.md#notifications-for-unknown-sign-ins).
+
+![Email notification for unknown sign-ins](img/email_notification_for_unknown_sign_ins_v13_2.png)
+
+## Sign-in information
+
+All users that are not logged in are redirected to the page represented by the configured
+**Home page URL** if value is not empty.
+
+All users are redirected to the page represented by the configured **Sign-out page URL**
+after sign out if value is not empty.
+
+In the **Sign-in restrictions** section, scroll to the **Sign-in text** field. You can add a
+custom message for your users in Markdown format.
+
+For example, if you include the following information in the noted text box:
+
+```markdown
+# Custom sign-in text
+
+To access this text box:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand the **Sign-in restrictions** section.
+```
+
+Your users see the **Custom sign-in text** when they navigate to the sign-in screen for your
+GitLab instance.
+
+## Troubleshooting
+
+### Re-enable standard web sign-in form in rails console
+
+Re-enable the standard username and password-based sign-in form if it was disabled as a [Sign-in restriction](#password-authentication-enabled).
+
+You can use this method through the [rails console](../operations/rails_console.md#starting-a-rails-console-session) when a configured external authentication provider (through SSO or an LDAP configuration) is facing an outage and direct sign-in access to GitLab is required.
+
+```ruby
+Gitlab::CurrentSettings.update!(password_authentication_enabled_for_web: true)
+```
diff --git a/doc/administration/settings/sign_up_restrictions.md b/doc/administration/settings/sign_up_restrictions.md
new file mode 100644
index 00000000000..f213794eb75
--- /dev/null
+++ b/doc/administration/settings/sign_up_restrictions.md
@@ -0,0 +1,206 @@
+---
+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/product/ux/technical-writing/#assignments
+type: reference
+---
+
+# Sign-up restrictions **(FREE SELF)**
+
+You can enforce the following restrictions on sign ups:
+
+- Disable new sign ups.
+- Require administrator approval for new sign ups.
+- Require user email confirmation.
+- Allow or deny sign ups using specific email domains.
+
+## Disable new sign ups
+
+By default, any user visiting your GitLab domain can sign up for an account. For customers running
+public-facing GitLab instances, we **highly** recommend that you consider disabling new sign ups if
+you do not expect public users to sign up for an account.
+
+To disable sign ups:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand **Sign-up restrictions**.
+1. Clear the **Sign-up enabled** checkbox, then select **Save changes**.
+
+## Require administrator approval for new sign ups
+
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4491) in GitLab 13.5.
+> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/267568) in GitLab 13.6.
+
+When this setting is enabled, any user visiting your GitLab domain and signing up for a new account using the registration form
+must be explicitly [approved](../../administration/moderate_users.md#approve-or-reject-a-user-sign-up) by an
+administrator before they can start using their account. In GitLab 13.6 and later, this setting is
+enabled by default for new GitLab instances. It is only applicable if sign ups are enabled.
+
+To require administrator approval for new sign ups:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand **Sign-up restrictions**.
+1. Select the **Require admin approval for new sign-ups** checkbox, then select **Save changes**.
+
+In [GitLab 13.7 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/273258), if an administrator disables this setting, the users in pending approval state are
+automatically approved in a background job.
+
+NOTE:
+This setting doesn't apply to LDAP or OmniAuth users. To enforce approvals for new users
+signing up using OmniAuth or LDAP, set `block_auto_created_users` to `true` in the
+[OmniAuth configuration](../../integration/omniauth.md#configure-common-settings) or
+[LDAP configuration](../auth/ldap/index.md#basic-configuration-settings).
+A [user cap](#user-cap) can also be used to enforce approvals for new users.
+
+## Confirm user email
+
+> - Soft email confirmation [introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/47003) in GitLab 12.2 [with a flag](../../operations/feature_flags.md) named `soft_email_confirmation`.
+> - Soft email confirmation [changed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107302/diffs) from a feature flag to an application setting in GitLab 15.9.
+
+You can send confirmation emails during sign up and require that users confirm
+their email address before they are allowed to sign in.
+
+For example, to enforce confirmation of the email address used for new sign ups:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand **Sign-up restrictions**.
+1. Under **Email confirmation settings**, select **Hard**.
+
+The following settings are available:
+
+- **Hard** - Send a confirmation email during sign up. New users must confirm their email address before they can log in.
+- **Soft** - Send a confirmation email during sign up. New users can log in immediately, but must confirm their email in three days. Unconfirmed accounts are deleted.
+- **Off** - New users can sign up without confirming their email address.
+
+## User cap
+
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4315) in GitLab 13.7.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/292600) in GitLab 13.9.
+
+When the number of billable users reaches the user cap, any user who is added or requests access must be
+[approved](../../administration/moderate_users.md#approve-or-reject-a-user-sign-up) by an administrator before they can start using
+their account.
+
+If an administrator [increases](#set-the-user-cap-number) or [removes](#remove-the-user-cap) the
+user cap, the users in pending approval state are automatically approved in a background job.
+
+NOTE:
+The amount of billable users [is updated once a day](../../subscriptions/self_managed/index.md#billable-users).
+This means the user cap might apply only retrospectively after the cap has already been exceeded.
+To ensure the cap is enabled immediately, set it to a low value below the current number of
+billable users, for example: `1`.
+
+On instances that use LDAP or OmniAuth, enabling and disabling
+[administrator approval for new sign ups](#require-administrator-approval-for-new-sign-ups)
+involves changing the Rails configuration, and may require downtime.
+User cap can be used instead. As noted above, set the cap to value that ensures it is enforced immediately.
+
+### Set the user cap number
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand **Sign-up restrictions**.
+1. Enter a number in **User cap**.
+1. Select **Save changes**.
+
+New user sign ups are subject to the user cap restriction.
+
+## Remove the user cap
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand **Sign-up restrictions**.
+1. Remove the number from **User cap**.
+1. Select **Save changes**.
+
+New users sign ups are not subject to the user cap restriction. Users in pending approval state are
+automatically approved in a background job.
+
+## Minimum password length limit
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20661) in GitLab 12.6
+
+You can [change](../../security/password_length_limits.md#modify-minimum-password-length)
+the minimum number of characters a user must have in their password using the GitLab UI.
+
+### Password complexity requirements **(PREMIUM SELF)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/354965) in GitLab 15.2.
+
+By default, the only requirement for user passwords is [minimum password length](#minimum-password-length-limit).
+You can add additional complexity requirements. Changes to password complexity requirements apply to new passwords:
+
+- For new users that sign up.
+- For existing users that reset their password.
+
+Existing passwords are unaffected. To change password complexity requirements:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand **Sign-up restrictions**.
+1. Under **Minimum password length (number of characters)**, select additional password complexity requirements. You can require numbers, uppercase letters, lowercase letters,
+ and symbols.
+1. Select **Save changes**.
+
+## Allow or deny sign ups using specific email domains
+
+You can specify an inclusive or exclusive list of email domains which can be used for user sign up.
+
+These restrictions are only applied during sign up from an external user. An administrator can add a
+user through the administrator panel with a disallowed domain. The users can also change their
+email addresses to disallowed domains after sign up.
+
+### Allowlist email domains
+
+You can restrict users only to sign up using email addresses matching the given
+domains list.
+
+### Denylist email domains
+
+You can block users from signing up when using an email addresses of specific domains. This can
+reduce the risk of malicious users creating spam accounts with disposable email addresses.
+
+### Create email domain allowlist or denylist
+
+To create an email domain allowlist or denylist:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand **Sign-up restrictions**.
+1. For the allowlist, you must enter the list manually. For the denylist, you can enter the list
+ manually or upload a `.txt` file that contains list entries.
+
+ Both the allowlist and denylist accept wildcards. For example, you can use
+`*.company.com` to accept every `company.com` subdomain, or `*.io` to block all
+domains ending in `.io`. Domains must be separated by a whitespace,
+semicolon, comma, or a new line.
+
+ ![Domain Denylist](img/domain_denylist_v14_1.png)
+
+## Set up LDAP user filter
+
+You can limit GitLab access to a subset of the LDAP users on your LDAP server.
+
+See the [documentation on setting up an LDAP user filter](../auth/ldap/index.md#set-up-ldap-user-filter) for more information.
+
+<!-- ## 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, for example `### Getting error message X`.
+If you have none to add when creating a doc, leave this section in place
+but commented out to help encourage others to add to it in the future. -->
diff --git a/doc/administration/settings/terms.md b/doc/administration/settings/terms.md
new file mode 100644
index 00000000000..4b4972acc8e
--- /dev/null
+++ b/doc/administration/settings/terms.md
@@ -0,0 +1,49 @@
+---
+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/product/ux/technical-writing/#assignments
+type: reference
+---
+
+# Terms of Service and Privacy Policy **(FREE SELF)**
+
+An administrator can enforce acceptance of a terms of service and privacy policy.
+When this option is enabled, new and existing users must accept the terms.
+
+When enabled, you can view the Terms of Service at the `-/users/terms` page on the instance,
+for example `https://gitlab.example.com/-/users/terms`.
+
+## Enforce a Terms of Service and Privacy Policy
+
+To enforce acceptance of a Terms of Service and Privacy Policy:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand the **Terms of Service and Privacy Policy** section.
+1. Check the **All users must accept the Terms of Service and Privacy Policy to access GitLab** checkbox.
+1. Input the text of the **Terms of Service and Privacy Policy**. You can use [Markdown](../../user/markdown.md)
+ in this text box.
+1. Select **Save changes**.
+
+For each update to the terms, a new version is stored. When a user accepts or declines the terms,
+GitLab records which version they accepted or declined.
+
+Existing users must accept the terms on their next GitLab interaction.
+If an authenticated user declines the terms, they are signed out.
+
+When enabled, it adds a mandatory checkbox to the sign up page for new users:
+
+![Sign up form](img/sign_up_terms.png)
+
+<!-- ## 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, for example `### Getting error message X`.
+If you have none to add when creating a doc, leave this section in place
+but commented out to help encourage others to add to it in the future. -->
diff --git a/doc/administration/settings/terraform_limits.md b/doc/administration/settings/terraform_limits.md
new file mode 100644
index 00000000000..90ab1c25522
--- /dev/null
+++ b/doc/administration/settings/terraform_limits.md
@@ -0,0 +1,28 @@
+---
+stage: Deploy
+group: Environments
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+type: reference
+---
+
+# Terraform limits **(FREE SELF)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/352951) in GitLab 15.7.
+
+You can limit the total storage of [Terraform state files](../terraform_state.md).
+The limit applies to each individual
+state file version, and is checked whenever a new version is created.
+
+To add a storage limit:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Preferences**.
+1. Expand **Terraform limits**.
+1. Adjust the size limit.
+
+## Available settings
+
+| Setting | Default | Description |
+|------------------------------------|---------|---------------------------------------------------------------------------------------------------------------------------------------------------------|
+| Terraform state size limit (bytes) | 0 | Terraform state files that exceed this size are not saved, and associated Terraform operations are rejected. Set to 0 to allow files of unlimited size. |
diff --git a/doc/administration/settings/third_party_offers.md b/doc/administration/settings/third_party_offers.md
new file mode 100644
index 00000000000..39e2275f411
--- /dev/null
+++ b/doc/administration/settings/third_party_offers.md
@@ -0,0 +1,38 @@
+---
+stage: Data Stores
+group: Tenant Scale
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+type: reference
+---
+
+# Customer experience improvement and third-party offers **(FREE SELF)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/20379) in GitLab 11.1.
+
+Within GitLab, we inform users of available third-party offers they might find valuable in order
+to enhance the development of their projects. An example is the Google Cloud Platform free credit
+for using [Google Kubernetes Engine](https://cloud.google.com/kubernetes-engine/).
+
+Furthermore, we use content to improve customer experience. An example are the personalization
+questions when creating a group.
+
+To toggle the display of customer experience improvement content and third-party offers:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand **Customer experience improvement and third-party offers**.
+1. Select **Do not display content for customer experience improvement and offers from third parties**.
+1. Select **Save changes**.
+
+<!-- ## 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, for example `### Getting error message X`.
+If you have none to add when creating a doc, leave this section in place
+but commented out to help encourage others to add to it in the future. -->
diff --git a/doc/administration/settings/usage_statistics.md b/doc/administration/settings/usage_statistics.md
new file mode 100644
index 00000000000..ba15ee4e33e
--- /dev/null
+++ b/doc/administration/settings/usage_statistics.md
@@ -0,0 +1,230 @@
+---
+stage: Analytics
+group: Analytics Instrumentation
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Usage statistics **(FREE SELF)**
+
+GitLab Inc. periodically collects information about your instance in order
+to perform various actions.
+
+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/internal_analytics/service_ping/index.md). When Service Ping is enabled, GitLab gathers data from other instances and enables certain [instance-level analytics features](../../user/analytics/index.md)
+that are dependent on Service Ping.
+
+### 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:
+
+- Analyze the users' activities over time of your GitLab installation.
+- A [DevOps Score](../analytics/dev_ops_reports.md) to give you an overview of your entire instance's adoption of concurrent DevOps from planning to monitoring.
+- More proactive support (assuming that our [Customer Success Managers (CSMs)](https://handbook.gitlab.com/job-families/sales/customer-success-management/) 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](../../administration/settings/account_and_limit_settings.md#repository-size-limit).
+- [Group access restriction by IP address](../../user/group/access_and_permissions.md#restrict-group-access-by-ip-address).
+
+### Features available in 16.0 and later
+
+- [View description change history](../../user/discussions/index.md#view-description-change-history).
+- [Maintenance mode](../maintenance_mode/index.md).
+- [Configurable issue boards](../../user/project/issue_board.md#configurable-issue-boards).
+- [Coverage-guided fuzz testing](../../user/application_security/coverage_fuzzing/index.md).
+- [Password complexity requirements](../../administration/settings/sign_up_restrictions.md#password-complexity-requirements).
+
+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 left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. 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
+
+If enabled, version check informs you if a new version is available and the
+importance of it through a status. The status displays on the help pages (`/help`)
+for all authenticated users, and on the Admin Area pages. The statuses are:
+
+- Green: You are running the latest version of GitLab.
+- Orange: An updated version of GitLab is available.
+- Red: The version of GitLab you are running is vulnerable. You should install
+ the latest version with security fixes as soon as possible.
+
+![Orange version check example](../settings/img/update-available.png)
+
+GitLab Inc. collects your instance's version and hostname (through the HTTP
+referer) as part of the version check. No other information is collected.
+
+This information is used, among other things, to identify to which versions
+patches must be backported, making sure active GitLab instances remain
+secure.
+
+If you [disable version check](#enable-or-disable-usage-statistics), this information isn't collected.
+
+### Request flow example
+
+The following example shows a basic request/response flow between a
+self-managed GitLab instance and the GitLab Version Application:
+
+```mermaid
+sequenceDiagram
+ participant GitLab instance
+ participant Version Application
+ GitLab instance->>Version Application: Is there a version update?
+ loop Version Check
+ Version Application->>Version Application: Record version info
+ end
+ Version Application->>GitLab instance: Response (PNG/SVG)
+```
+
+## Configure your network
+
+To send usage statistics to GitLab Inc., you must allow network traffic from your
+GitLab instance to the host `version.gitlab.com` on port `443`.
+
+If your GitLab instance is behind a proxy, set the appropriate
+[proxy configuration variables](https://docs.gitlab.com/omnibus/settings/environment-variables.html).
+
+## Enable or disable usage statistics
+
+To enable or disable Service Ping and version check:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Metrics and profiling**.
+1. Expand **Usage statistics**.
+1. Select or clear the **Enable version check** and **Enable Service Ping** checkboxes.
+1. Select **Save changes**.
+
+NOTE:
+Service Ping settings only control whether the data is being shared with GitLab, or used only internally.
+Even if you disable Service Ping, the `gitlab_service_ping_worker` background job still periodically generates a Service Ping payload for your instance.
+The payload is available in the [Service Usage data](#manually-upload-service-ping-payload) admin section.
+
+## 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/internal_analytics/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 left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. 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/internal_analytics/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/internal_analytics/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 left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. 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.
+
+If there are problems with the manual upload:
+
+1. Open a confidential issue in the [security fork of version app project](https://gitlab.com/gitlab-org/security/version.gitlab.com).
+1. Attach the JSON payload if possible.
+1. Tag `@gitlab-org/analytics-section/analytics-instrumentation` who will triage the issue.
+
+<!-- ## 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, for example `### Getting error message X`.
+If you have none to add when creating a doc, leave this section in place
+but commented out to help encourage others to add to it in the future. -->
diff --git a/doc/administration/settings/user_and_ip_rate_limits.md b/doc/administration/settings/user_and_ip_rate_limits.md
new file mode 100644
index 00000000000..44bd08a8824
--- /dev/null
+++ b/doc/administration/settings/user_and_ip_rate_limits.md
@@ -0,0 +1,240 @@
+---
+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/product/ux/technical-writing/#assignments
+type: reference
+---
+
+# User and IP rate limits **(FREE SELF)**
+
+Rate limiting is a common technique used to improve the security and durability
+of a web application. For more details, see
+[Rate limits](../../security/rate_limits.md).
+
+The following limits are disabled by default:
+
+- [Unauthenticated API requests (per IP)](#enable-unauthenticated-api-request-rate-limit).
+- [Unauthenticated web requests (per IP)](#enable-unauthenticated-web-request-rate-limit).
+- [Authenticated API requests (per user)](#enable-authenticated-api-request-rate-limit).
+- [Authenticated web requests (per user)](#enable-authenticated-web-request-rate-limit).
+
+NOTE:
+By default, all Git operations are first tried unauthenticated. Because of this, HTTP Git operations
+may trigger the rate limits configured for unauthenticated requests.
+
+NOTE:
+[In GitLab 14.8 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/344807),
+the rate limits for API requests don't affect requests made by the frontend, as these are always
+counted as web traffic.
+
+## Enable unauthenticated API request rate limit
+
+To enable the unauthenticated request rate limit:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Network**.
+1. Expand **User and IP rate limits**.
+1. Select **Enable unauthenticated API request rate limit**.
+
+ - Optional. Update the **Maximum unauthenticated API requests per rate limit period per IP** value.
+ Defaults to `3600`.
+ - Optional. Update the **Unauthenticated rate limit period in seconds** value.
+ Defaults to `3600`.
+
+## Enable unauthenticated web request rate limit
+
+To enable the unauthenticated request rate limit:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Network**.
+1. Expand **User and IP rate limits**.
+1. Select **Enable unauthenticated web request rate limit**.
+
+ - Optional. Update the **Maximum unauthenticated web requests per rate limit period per IP** value.
+ Defaults to `3600`.
+ - Optional. Update the **Unauthenticated rate limit period in seconds** value.
+ Defaults to `3600`.
+
+## Enable authenticated API request rate limit
+
+To enable the authenticated API request rate limit:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Network**.
+1. Expand **User and IP rate limits**.
+1. Select **Enable authenticated API request rate limit**.
+
+ - Optional. Update the **Maximum authenticated API requests per rate limit period per user** value.
+ Defaults to `7200`.
+ - Optional. Update the **Authenticated API rate limit period in seconds** value.
+ Defaults to `3600`.
+
+## Enable authenticated web request rate limit
+
+To enable the unauthenticated request rate limit:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Network**.
+1. Expand **User and IP rate limits**.
+1. Select **Enable authenticated web request rate limit**.
+
+ - Optional. Update the **Maximum authenticated web requests per rate limit period per user** value.
+ Defaults to `7200`.
+ - Optional. Update the **Authenticated web rate limit period in seconds** value.
+ Defaults to `3600`.
+
+## Use a custom rate limit response
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/50693) in GitLab 13.8.
+
+A request that exceeds a rate limit returns a `429` response code and a
+plain-text body, which by default is `Retry later`.
+
+To use a custom response:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > Network**.
+1. Expand **User and IP rate limits**.
+1. In the **Plain-text response to send to clients that hit a rate limit** text box,
+ add the plain-text response message.
+
+## Response headers
+
+> [Introduced](https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/731) in GitLab 13.8, the `RateLimit` headers. `Retry-After` was introduced in an earlier version.
+
+When a client exceeds the associated rate limit, the following requests are
+blocked. The server may respond with rate-limiting information allowing the
+requester to retry after a specific period of time. These information are
+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-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`. |
+| `RateLimit-Reset` | `1609844400` | [Unix time](https://en.wikipedia.org/wiki/Unix_time)-formatted time when the request quota is reset. |
+| `RateLimit-ResetTime` | `Tue, 05 Jan 2021 11:00:00 GMT` | [RFC2616](https://www.rfc-editor.org/rfc/rfc2616#section-3.3.1)-formatted date and time when the request quota is reset. |
+| `Retry-After` | `30` | Remaining duration **in seconds** until the quota is reset. This is a [standard HTTP header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After). |
+
+## Use an HTTP header to bypass rate limiting
+
+> [Introduced](https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/622) in GitLab 13.6.
+
+Depending on the needs of your organization, you may want to enable rate limiting
+but have some requests bypass the rate limiter.
+
+You can do this by marking requests that should bypass the rate limiter with a custom
+header. You must do this somewhere in a load balancer or reverse proxy in front of
+GitLab. For example:
+
+1. Pick a name for your bypass header. For example, `Gitlab-Bypass-Rate-Limiting`.
+1. Configure your load balancer to set `Gitlab-Bypass-Rate-Limiting: 1` on requests
+ that should bypass GitLab rate limiting.
+1. Configure your load balancer to either:
+ - Erase `Gitlab-Bypass-Rate-Limiting`.
+ - Set `Gitlab-Bypass-Rate-Limiting` to a value other than `1` on all requests that
+ should be affected by rate limiting.
+1. Set the environment variable `GITLAB_THROTTLE_BYPASS_HEADER`.
+ - For [Linux package installations](https://docs.gitlab.com/omnibus/settings/environment-variables.html),
+ set `'GITLAB_THROTTLE_BYPASS_HEADER' => 'Gitlab-Bypass-Rate-Limiting'` in `gitlab_rails['env']`.
+ - For source installations, set `export GITLAB_THROTTLE_BYPASS_HEADER=Gitlab-Bypass-Rate-Limiting`
+ in `/etc/default/gitlab`.
+
+It is important that your load balancer erases or overwrites the bypass
+header on all incoming traffic. Otherwise, you must trust your
+users to not set that header and bypass the GitLab rate limiter.
+
+The bypass works only if the header is set to `1`.
+
+Requests that bypassed the rate limiter because of the bypass header
+are marked with `"throttle_safelist":"throttle_bypass_header"` in
+[`production_json.log`](../logs/index.md#production_jsonlog).
+
+To disable the bypass mechanism, make sure the environment variable
+`GITLAB_THROTTLE_BYPASS_HEADER` is unset or empty.
+
+## Allow specific users to bypass authenticated request rate limiting
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49127) in GitLab 13.7.
+
+Similarly to the bypass header described above, it is possible to allow
+a certain set of users to bypass the rate limiter. This only applies
+to authenticated requests: with unauthenticated requests, by definition
+GitLab does not know who the user is.
+
+The allowlist is configured as a comma-separated list of user IDs in
+the `GITLAB_THROTTLE_USER_ALLOWLIST` environment variable. If you want
+users 1, 53 and 217 to bypass the authenticated request rate limiter,
+the allowlist configuration would be `1,53,217`.
+
+- For [Linux package installations](https://docs.gitlab.com/omnibus/settings/environment-variables.html),
+ set `'GITLAB_THROTTLE_USER_ALLOWLIST' => '1,53,217'` in `gitlab_rails['env']`.
+- For source installations, set `export GITLAB_THROTTLE_USER_ALLOWLIST=1,53,217`
+ in `/etc/default/gitlab`.
+
+Requests that bypassed the rate limiter because of the user allowlist
+are marked with `"throttle_safelist":"throttle_user_allowlist"` in
+[`production_json.log`](../logs/index.md#production_jsonlog).
+
+At application startup, the allowlist is logged in [`auth.log`](../logs/index.md#authlog).
+
+## Try out throttling settings before enforcing them
+
+> [Introduced](https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/629) in GitLab 13.6.
+
+You can try out throttling settings by setting the `GITLAB_THROTTLE_DRY_RUN` environment variable to
+a comma-separated list of throttle names.
+
+The possible names are:
+
+- `throttle_unauthenticated`
+ - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/335300) in GitLab 14.3. Use `throttle_unauthenticated_api` or `throttle_unauthenticated_web` instead.
+ `throttle_unauthenticated` is still supported and selects both of them.
+- `throttle_unauthenticated_api`
+- `throttle_unauthenticated_web`
+- `throttle_authenticated_api`
+- `throttle_authenticated_web`
+- `throttle_unauthenticated_protected_paths`
+- `throttle_authenticated_protected_paths_api`
+- `throttle_authenticated_protected_paths_web`
+- `throttle_unauthenticated_packages_api`
+- `throttle_authenticated_packages_api`
+- `throttle_authenticated_git_lfs`
+- `throttle_unauthenticated_files_api`
+- `throttle_authenticated_files_api`
+- `throttle_unauthenticated_deprecated_api`
+- `throttle_authenticated_deprecated_api`
+
+For example, to try out throttles for all authenticated requests to
+non-protected paths can be done by setting
+`GITLAB_THROTTLE_DRY_RUN='throttle_authenticated_web,throttle_authenticated_api'`.
+
+To enable dry run mode for all throttles, the variable can be set to `*`.
+
+Setting a throttle to dry run mode logs a message to the
+[`auth.log`](../logs/index.md#authlog) when it would hit the limit, while letting the
+request continue. The log message contains an `env` field set to `track`. The `matched`
+field contains the name of throttle that was hit.
+
+It is important to set the environment variable **before** enabling
+the rate limiting in the settings. The settings in the Admin Area
+take effect immediately, while setting the environment variable
+requires a restart of all the Puma processes.
+
+<!-- ## 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, for example `### Getting error message X`.
+If you have none to add when creating a doc, leave this section in place
+but commented out to help encourage others to add to it in the future. -->
diff --git a/doc/administration/settings/visibility_and_access_controls.md b/doc/administration/settings/visibility_and_access_controls.md
new file mode 100644
index 00000000000..5e1e35db244
--- /dev/null
+++ b/doc/administration/settings/visibility_and_access_controls.md
@@ -0,0 +1,363 @@
+---
+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/product/ux/technical-writing/#assignments"
+type: reference
+---
+
+# Control access and visibility **(FREE SELF)**
+
+GitLab enables users with administrator access to enforce
+specific controls on branches, projects, snippets, groups, and more.
+
+To access the visibility and access control options:
+
+1. Sign in to GitLab as a user with Administrator access level.
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand the **Visibility and access controls** section.
+
+## Define which roles can create projects
+
+Instance-level protections for project creation define which roles can
+[add projects to a group](../../user/group/index.md#specify-who-can-add-projects-to-a-group)
+on the instance. To alter which roles have permission to create projects:
+
+1. Sign in to GitLab as a user with Administrator access level.
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand the **Visibility and access controls** section.
+1. For **Default project creation protection**, select the desired roles:
+ - No one.
+ - Maintainers.
+ - Developers and Maintainers.
+1. Select **Save changes**.
+
+## Restrict project deletion to administrators **(PREMIUM SELF)**
+
+> User interface [changed](https://gitlab.com/gitlab-org/gitlab/-/issues/352960) in GitLab 15.1.
+
+By default both administrators and anyone with the **Owner** role can delete a project. To restrict project deletion to only administrators:
+
+1. Sign in to GitLab as a user with administrator access.
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand the **Visibility and access controls** section.
+1. Scroll to:
+ - (GitLab 15.1 and later) **Allowed to delete projects**, and select **Administrators**.
+ - (GitLab 15.0 and earlier) **Default project deletion protection** and select **Only admins can delete project**.
+1. Select **Save changes**.
+
+## Deletion protection **(PREMIUM SELF)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/255449) in GitLab 14.2 for groups created after August 12, 2021.
+> - [Renamed](https://gitlab.com/gitlab-org/gitlab/-/issues/352960) from default delayed project deletion in GitLab 15.1.
+> - [Enabled for projects in personal namespaces](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/89466) in GitLab 15.1.
+> - [Disabled for projects in personal namespaces](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/95495) in GitLab 15.3.
+> - [Removed option to delete immediately](https://gitlab.com/gitlab-org/gitlab/-/issues/389557) in GitLab 15.11 [with a flag](../feature_flags.md) named `always_perform_delayed_deletion`. Disabled by default.
+> - Enabled delayed deletion by default and removed the option to delete immediately [on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/393622) and [on self-managed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/119606) in GitLab 16.0.
+
+Instance-level protection against accidental deletion of groups and projects.
+
+### Retention period
+
+> [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/352960) in GitLab 15.1.
+
+Groups and projects remain restorable within a defined retention period. By default this is 7 days but it can be changed.
+Setting the retention period to `0` means that groups and project are removed immediately and cannot be restored.
+
+In GitLab 15.1 and later, the retention period must be between `1` and `90`. If the retention period was `0` before the 15.1 update,
+then it gets automatically changed to `1` while also disabling deletion protection the next time any application setting is changed.
+
+### Delayed project deletion
+
+> - User interface [changed](https://gitlab.com/gitlab-org/gitlab/-/issues/352960) in GitLab 15.1.
+> - Enabled delayed deletion by default and removed the option to delete immediately [on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/393622) and [on self-managed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/119606) in GitLab 16.0.
+
+To configure delayed project deletion:
+
+1. Sign in to GitLab as a user with administrator access.
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand the **Visibility and access controls** section.
+1. Scroll to:
+ - (In GitLab 15.11 and later with `always_perform_delayed_deletion` feature flag enabled, or GitLab 16.0 and later) **Deletion protection** and set the retention period to a value between `1` and `90`.
+ - (GitLab 15.1 and later) **Deletion protection** and select keep deleted groups and projects, and select a retention period.
+ - (GitLab 15.0 and earlier) **Default delayed project protection** and select **Enable delayed project deletion by
+ default for newly-created groups.** Then set a retention period in **Default deletion delay**.
+1. Select **Save changes**.
+
+Deletion protection is not available for projects only (without being also being enabled for groups).
+
+In GitLab 15.1, and later this setting is enforced on groups when disabled and it cannot be overridden.
+
+### Delayed group deletion
+
+> - User interface [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/352960) in GitLab 15.1.
+> - [Changed to default behavior](https://gitlab.com/gitlab-org/gitlab/-/issues/389557) on the Premium and Ultimate tier in GitLab 16.0.
+
+Groups remain restorable if the retention period is `1` or more days.
+
+In GitLab 15.1 and later, delayed group deletion can be enabled by setting **Deletion projection** to **Keep deleted**.
+In GitLab 15.11 and later with the `always_perform_delayed_deletion` feature flag enabled, or in GitLab 16.0 and later:
+
+- The **Keep deleted** option is removed.
+- Delayed group deletion is the default.
+
+### Override defaults and delete immediately
+
+Alternatively, projects that are marked for removal can be deleted immediately. To do so:
+
+1. [Restore the project](../../user/project/settings/index.md#restore-a-project).
+1. Delete the project as described in the
+ [Administering Projects page](../admin_area.md#administering-projects).
+
+## Configure project visibility defaults
+
+To set the default [visibility levels for new projects](../../user/public_access.md):
+
+1. Sign in to GitLab as a user with Administrator access level.
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand the **Visibility and access controls** section.
+1. Select the desired default project visibility:
+ - **Private** - Project access must be granted explicitly to each user. If this
+ project is part of a group, access is granted to members of the group.
+ - **Internal** - The project can be accessed by any authenticated user except external users.
+ - **Public** - The project can be accessed without any authentication.
+1. Select **Save changes**.
+
+## Configure snippet visibility defaults
+
+To set the default visibility levels for new [snippets](../../user/snippets.md):
+
+1. Sign in to GitLab as a user with Administrator access level.
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand the **Visibility and access controls** section.
+1. Select the desired default snippet visibility.
+1. Select **Save changes**.
+
+For more details on snippet visibility, read
+[Project visibility](../../user/public_access.md).
+
+## Configure group visibility defaults
+
+To set the default visibility levels for new groups:
+
+1. Sign in to GitLab as a user with Administrator access level.
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand the **Visibility and access controls** section.
+1. Select the desired default group visibility:
+ - **Private** - The group and its projects can only be viewed by members.
+ - **Internal** - The group and any internal projects can be viewed by any authenticated user except external users.
+ - **Public** - The group and any public projects can be viewed without any authentication.
+1. Select **Save changes**.
+
+For more details on group visibility, see
+[Group visibility](../../user/group/index.md#group-visibility).
+
+## Restrict visibility levels
+
+When restricting visibility levels, consider how these restrictions interact
+with permissions for subgroups and projects that inherit their visibility from
+the item you're changing.
+
+To restrict visibility levels for groups, projects, snippets, and selected pages:
+
+1. Sign in to GitLab as a user with Administrator access level.
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand the **Visibility and access controls** section.
+1. In the **Restricted visibility levels** section, select the desired visibility levels to restrict.
+ - If you restrict the **Public** level:
+ - Only administrators are able to create public groups, projects, and snippets.
+ - User profiles are only visible to authenticated users through the Web interface.
+ - User attributes through the GraphQL API are:
+ - Not visible in [GitLab 15.1 and later](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/88020).
+ - Only visible to authenticated users between [GitLab 13.1](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/33195) and GitLab 15.0.
+ - If you restrict the **Internal** level:
+ - Only administrators are able to create internal groups, projects, and snippets.
+ - If you restrict the **Private** level:
+ - Only administrators are able to create private groups, projects, and snippets.
+1. Select **Save changes**.
+
+For more details on project visibility, see
+[Project visibility](../../user/public_access.md).
+
+## Configure allowed import sources
+
+Before you can import projects from other systems, you must enable the
+[import source](../../user/gitlab_com/index.md#default-import-sources) for that system.
+
+1. Sign in to GitLab as a user with Administrator access level.
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand the **Visibility and access controls** section.
+1. Select each of **Import sources** to allow.
+1. Select **Save changes**.
+
+## Enable project export
+
+To enable the export of
+[projects and their data](../../user/project/settings/import_export.md#export-a-project-and-its-data):
+
+1. Sign in to GitLab as a user with Administrator access level.
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand the **Visibility and access controls** section.
+1. Scroll to **Project export**.
+1. Select the **Enabled** checkbox.
+1. Select **Save changes**.
+
+## Enable migration of groups and projects by direct transfer
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/383268) in GitLab 15.8.
+
+You can enable migration of groups by direct transfer using the UI.
+
+To enable migration of groups by direct transfer:
+
+1. Sign in to GitLab as a user with Administrator access level.
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand the **Visibility and access controls** section.
+1. Scroll to **Allow migrating GitLab groups and projects by direct transfer**.
+1. Select the **Enabled** checkbox.
+1. Select **Save changes**.
+
+The same setting
+[is available](../../api/settings.md#list-of-settings-that-can-be-accessed-via-api-calls) in the API as the
+`bulk_import_enabled` attribute.
+
+## Configure enabled Git access protocols
+
+With GitLab access restrictions, you can select the protocols users can use to
+communicate with GitLab. Disabling an access protocol does not block port access to the
+server itself. The ports used for the protocol, SSH or HTTP(S), are still accessible.
+The GitLab restrictions apply at the application level.
+
+To specify the enabled Git access protocols:
+
+1. Sign in to GitLab as a user with Administrator access level.
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand the **Visibility and access controls** section.
+1. Select the desired Git access protocols:
+ - Both SSH and HTTP(S)
+ - Only SSH
+ - Only HTTP(S)
+1. Select **Save changes**.
+
+When both SSH and HTTP(S) are enabled, users can choose either protocol.
+If only one protocol is enabled:
+
+- The project page shows only the allowed protocol's URL, with no option to
+ change it.
+- GitLab shows a tooltip when you hover over the protocol for the URL, if user action
+ (such as adding a SSH key or setting a password) is required:
+
+ ![Project URL with SSH only access](../settings/img/restricted_url.png)
+
+GitLab only allows Git actions for the protocols you select.
+
+WARNING:
+GitLab versions [10.7 and later](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/18021),
+allow the HTTP(S) protocol for Git clone or fetch requests done by GitLab Runner
+from CI/CD jobs, even if you select **Only SSH**.
+
+## Customize Git clone URL for HTTP(S)
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18422) in GitLab 12.4.
+
+You can customize project Git clone URLs for HTTP(S), which affects the clone
+panel:
+
+For example, if:
+
+- Your GitLab instance is at `https://example.com`, then project clone URLs are like
+ `https://example.com/foo/bar.git`.
+- You want clone URLs that look like `https://git.example.com/gitlab/foo/bar.git` instead,
+ you can set this setting to `https://git.example.com/gitlab/`.
+
+![Custom Git clone URL for HTTP](../settings/img/custom_git_clone_url_for_https_v12_4.png)
+
+To specify a custom Git clone URL for HTTP(S):
+
+1. Enter a root URL for **Custom Git clone URL for HTTP(S)**.
+1. Select **Save changes**.
+
+NOTE:
+SSH clone URLs can be customized in `gitlab.rb` by setting `gitlab_rails['gitlab_ssh_host']` and
+other related settings.
+
+## Configure defaults for RSA, DSA, ECDSA, ED25519, ECDSA_SK, ED25519_SK SSH keys
+
+These options specify the permitted types and lengths for SSH keys.
+
+To specify a restriction for each key type:
+
+1. Select the desired option from the dropdown list.
+1. Select **Save changes**.
+
+For more details, see [SSH key restrictions](../../security/ssh_keys_restrictions.md).
+
+## Enable project mirroring
+
+This option is enabled by default. By disabling it, both
+[pull mirroring](../../user/project/repository/mirror/pull.md) and [push mirroring](../../user/project/repository/mirror/push.md) no longer
+work in every repository. They can only be re-enabled by an administrator user on a per-project basis.
+
+![Mirror settings](../settings/img/mirror_settings_v15_7.png)
+
+## Configure globally-allowed IP address ranges
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87579) in GitLab 15.1 [with a flag](../feature_flags.md) named `group_ip_restrictions_allow_global`. Disabled by default.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/366445) in GitLab 15.4. [Feature flag `group_ip_restrictions_allow_global`](https://gitlab.com/gitlab-org/gitlab/-/issues/366445) removed.
+
+Administrators can set IP address ranges to be combined with [group-level IP restrictions](../../user/group/access_and_permissions.md#restrict-group-access-by-ip-address).
+Use globally-allowed IP addresses to allow aspects of the GitLab installation to work even when group-level IP address
+restrictions are set.
+
+For example, if the GitLab Pages daemon runs on the `10.0.0.0/24` range, you can specify that range as globally-allowed.
+This means GitLab Pages can still fetch artifacts from pipelines even if group-level IP address restrictions don't
+include the `10.0.0.0/24` range.
+
+To add a IP address range to the group-level allowlist:
+
+1. Sign in to GitLab as a user with Administrator access level.
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Settings > General**.
+1. Expand the **Visibility and access controls** section.
+1. In **Globally-allowed IP ranges**, provide a list of IP address ranges. This list:
+ - Has no limit on the number of IP address ranges.
+ - Has a size limit of 1 GB.
+ - Applies to both SSH or HTTP authorized IP address ranges. You cannot split
+ this list by type of authorization.
+1. Select **Save changes**.
+
+<!-- ## 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, for example `### Getting error message X`.
+If you have none to add when creating a doc, leave this section in place
+but commented out to help encourage others to add to it in the future. -->
diff --git a/doc/administration/sidekiq/extra_sidekiq_processes.md b/doc/administration/sidekiq/extra_sidekiq_processes.md
index 31e713bbf06..3a522c7171d 100644
--- a/doc/administration/sidekiq/extra_sidekiq_processes.md
+++ b/doc/administration/sidekiq/extra_sidekiq_processes.md
@@ -105,8 +105,6 @@ concurrency is set to:
When `min_concurrency` is greater than `max_concurrency`, it is treated as
being equal to `max_concurrency`.
-You can find example values used by GitLab.com by searching for `concurrency:`
-in [the Helm charts](https://gitlab.com/gitlab-com/gl-infra/k8s-workloads/gitlab-com/-/blob/master/releases/gitlab/values/gprd.yaml.gotmpl).
The values vary according to the work each specific deployment of Sidekiq does.
Any other specialized deployments with processes dedicated to specific queues
should have the concurrency tuned according to:
diff --git a/doc/administration/sidekiq/index.md b/doc/administration/sidekiq/index.md
index bb517e21fd0..c3e1182cb05 100644
--- a/doc/administration/sidekiq/index.md
+++ b/doc/administration/sidekiq/index.md
@@ -383,7 +383,7 @@ blocking all jobs on that worker from proceeding. If Rugged calls performed by S
background task processing.
By default, Rugged is used when Git repository data is stored on local storage or on an NFS mount.
-[Using Rugged is recommended when using NFS](../nfs.md#improving-nfs-performance-with-gitlab), but if
+Using Rugged is recommended when using NFS, but if
you are using local storage, disabling Rugged can improve Sidekiq performance:
```shell
diff --git a/doc/administration/sidekiq/sidekiq_troubleshooting.md b/doc/administration/sidekiq/sidekiq_troubleshooting.md
index 315714cd00b..6802bb68b31 100644
--- a/doc/administration/sidekiq/sidekiq_troubleshooting.md
+++ b/doc/administration/sidekiq/sidekiq_troubleshooting.md
@@ -529,6 +529,32 @@ The list of available jobs can be found in the [workers](https://gitlab.com/gitl
For more information about Sidekiq jobs, see the [Sidekiq-cron](https://github.com/sidekiq-cron/sidekiq-cron#work-with-job) documentation.
+## Clearing a Sidekiq job deduplication idempotency key
+
+Occasionally, jobs that are expected to run (for example, cron jobs) are observed to not run at all. When checking the logs, there might be instances where jobs are seen to not run with a `"job_status": "deduplicated"`.
+
+This can happen when a job failed and the idempotency key was not cleared properly. For example, [stopping Sidekiq kills any remaining jobs after 25 seconds](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/4918).
+
+[By default, the key expires after 6 hours](https://gitlab.com/gitlab-org/gitlab/-/blob/87c92f06eb92716a26679cd339f3787ae7edbdc3/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb#L23),
+but if you want to clear the idempotency key immediately, follow the following steps (the example provided is for `Geo::VerificationBatchWorker`):
+
+1. Find the worker class and `args` of the job in the Sidekiq logs:
+
+ ```plaintext
+ { ... "class":"Geo::VerificationBatchWorker","args":["container_repository"] ... }
+ ```
+
+1. Start a [Rails console session](../operations/rails_console.md#starting-a-rails-console-session).
+1. Run the following snippet:
+
+ ```ruby
+ worker_class = Geo::VerificationBatchWorker
+ args = ["container_repository"]
+ dj = Gitlab::SidekiqMiddleware::DuplicateJobs::DuplicateJob.new({ 'class' => worker_class.name, 'args' => args }, worker_class.queue)
+ dj.send(:idempotency_key)
+ dj.delete!
+ ```
+
## Omnibus GitLab 14.0 and later: remove the `sidekiq-cluster` service
Omnibus GitLab instances that were configured to run `sidekiq-cluster` prior to GitLab 14.0
diff --git a/doc/administration/silent_mode/index.md b/doc/administration/silent_mode/index.md
index 49c95d75768..0b04654beaa 100644
--- a/doc/administration/silent_mode/index.md
+++ b/doc/administration/silent_mode/index.md
@@ -71,6 +71,14 @@ Incoming emails still raise issues, but the users who sent the emails to [Servic
Triggering webhook tests via the UI results in HTTP status 500 responses.
+### Remote mirrors
+
+Updates on [remote mirrors](../../user/project/repository/mirror/index.md) (pushing to, and pulling from them) are suppressed.
+
+### Integrations
+
+Executable [integrations](../../user/project/integrations/index.md) are suppressed.
+
### Outbound emails
Outbound emails are suppressed.
diff --git a/doc/administration/snippets/index.md b/doc/administration/snippets/index.md
index 613d161a64c..9b485140070 100644
--- a/doc/administration/snippets/index.md
+++ b/doc/administration/snippets/index.md
@@ -25,7 +25,7 @@ content changes.
### Snippets size limit configuration
-This setting is not available through the [Admin Area settings](../../user/admin_area/settings/index.md).
+This setting is not available through the [Admin Area settings](../settings/index.md).
To configure this setting, use either the Rails console
or the [Application settings API](../../api/settings.md).
diff --git a/doc/administration/terraform_state.md b/doc/administration/terraform_state.md
index 84f596dacf2..2b738f975ba 100644
--- a/doc/administration/terraform_state.md
+++ b/doc/administration/terraform_state.md
@@ -27,7 +27,7 @@ or because your instance doesn't use Terraform.
When Terraform state administration is disabled:
-- On the left sidebar, you cannot select **Infrastructure > Terraform states**.
+- On the left sidebar, you cannot select **Operate > Terraform states**.
- Any CI/CD jobs that access the Terraform state fail with this error:
```shell
diff --git a/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md b/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
index fc319fad3e8..f164e8ccbad 100644
--- a/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
+++ b/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
@@ -50,7 +50,7 @@ This content has been moved to [Troubleshooting CI/CD](../../ci/troubleshooting.
## License
-This content has been moved to [Activate GitLab EE with a license file or key](../../user/admin_area/license_file.md).
+This content has been moved to [Activate GitLab EE with a license file or key](../../administration/license_file.md).
## Registry
diff --git a/doc/administration/troubleshooting/postgresql.md b/doc/administration/troubleshooting/postgresql.md
index 120d566a7e7..88e0d4e6c6b 100644
--- a/doc/administration/troubleshooting/postgresql.md
+++ b/doc/administration/troubleshooting/postgresql.md
@@ -152,7 +152,7 @@ without having to [reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-
which in this case would restart Puma and Sidekiq.
For example, a backup may fail with the following errors in the output of the
-[backup command](../../raketasks/backup_restore.md#back-up-gitlab)
+[backup command](../../administration/backup_restore/index.md#back-up-gitlab)
because the statement timeout was too short:
```plaintext
diff --git a/doc/administration/uploads.md b/doc/administration/uploads.md
index 99f19821916..d8f82f13875 100644
--- a/doc/administration/uploads.md
+++ b/doc/administration/uploads.md
@@ -19,7 +19,7 @@ This is the default configuration. To change the location where the uploads are
stored locally, use the steps in this section based on your installation method:
NOTE:
-For historical reasons, uploads for the whole instance (for example the [favicon](../user/admin_area/appearance.md#favicon)) are stored in a base directory,
+For historical reasons, uploads for the whole instance (for example the [favicon](../administration/appearance.md#favicon)) are stored in a base directory,
which by default is `uploads/-/system`. Changing the base
directory on an existing GitLab installation is strongly discouraged.
diff --git a/doc/administration/user_cohorts.md b/doc/administration/user_cohorts.md
new file mode 100644
index 00000000000..6f2798f437c
--- /dev/null
+++ b/doc/administration/user_cohorts.md
@@ -0,0 +1,40 @@
+---
+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/product/ux/technical-writing/#assignments
+---
+
+# Cohorts **(FREE SELF)**
+
+You can analyze your users' GitLab activities over time.
+
+How do you interpret the user cohorts table? Let's review an example with the
+following user cohorts:
+
+![User cohort example](img/cohorts_v13_9_a.png)
+
+For the cohort of March 2020, three users were added to this server and have
+been active since this month. One month later (April 2020), two users are still
+active. Five months later (August 2020), one user from this cohort is still
+active, or 33% of the original cohort of three that joined in March.
+
+The **Inactive users** column shows the number of users who were added during
+the month, but who never had any activity in the instance.
+
+How do we measure the activity of users? GitLab considers a user active if:
+
+- The user signs in.
+- The user has Git activity (whether push or pull).
+- The user visits pages related to dashboards, projects, issues, or merge
+ requests ([introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/54947) in GitLab 11.8).
+- The user uses the API.
+- The user uses the GraphQL API.
+
+## View user cohorts
+
+To view user cohorts:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Overview > Users**.
+1. Select the **Cohorts** tab.
diff --git a/doc/administration/user_settings.md b/doc/administration/user_settings.md
index c4b00d05f9d..f480f05f6a2 100644
--- a/doc/administration/user_settings.md
+++ b/doc/administration/user_settings.md
@@ -14,7 +14,7 @@ By default, new users can create top-level groups. To disable new users'
ability to create top-level groups (does not affect existing users' setting), GitLab administrators can modify this setting:
- In GitLab 15.5 and later, using either:
- - The [GitLab UI](../user/admin_area/settings/account_and_limit_settings.md#prevent-new-users-from-creating-top-level-groups).
+ - The [GitLab UI](../administration/settings/account_and_limit_settings.md#prevent-new-users-from-creating-top-level-groups).
- The [application setting API](../api/settings.md#change-application-settings).
- In GitLab 15.4 and earlier, in a configuration file by following the steps in this section.
@@ -44,7 +44,7 @@ For self-compiled installations:
Administrators can:
-- Use the Admin Area to [prevent an existing user from creating top-level groups](../user/admin_area/index.md#prevent-a-user-from-creating-groups).
+- Use the Admin Area to [prevent an existing user from creating top-level groups](../administration/admin_area.md#prevent-a-user-from-creating-groups).
- Use the [modify an existing user API endpoint](../api/users.md#user-modification) to change the `can_create_group` setting.
## Prevent users from changing their usernames
diff --git a/doc/administration/wikis/index.md b/doc/administration/wikis/index.md
index 540e50d5c70..fd7c1825e8d 100644
--- a/doc/administration/wikis/index.md
+++ b/doc/administration/wikis/index.md
@@ -26,7 +26,7 @@ is edited again and the content changes.
### Wiki page content size limit configuration
-This setting is not available through the [Admin Area settings](../../user/admin_area/settings/index.md).
+This setting is not available through the [Admin Area settings](../settings/index.md).
To configure this setting, use either the Rails console
or the [Application settings API](../../api/settings.md).
@@ -76,7 +76,7 @@ curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/a
### Reduce wiki repository size
-The wiki counts as part of the [namespace storage size](../../user/admin_area/settings/account_and_limit_settings.md),
+The wiki counts as part of the [namespace storage size](../settings/account_and_limit_settings.md),
so you should keep your wiki repositories as compact as possible.
For more information about tools to compact repositories,
diff --git a/doc/api/api_resources.md b/doc/api/api_resources.md
index 568acb76e5f..a97e4ad8adb 100644
--- a/doc/api/api_resources.md
+++ b/doc/api/api_resources.md
@@ -148,56 +148,57 @@ The following API resources are available in the group context:
The following API resources are available outside of project and group contexts (including `/users`):
-| Resource | Available endpoints |
-|:----------------------------------------------------------------------------------------|:--------------------|
-| [Appearance](appearance.md) **(FREE SELF)** | `/application/appearance` |
-| [Applications](applications.md) | `/applications` |
-| [Audit Events](audit_events.md) **(PREMIUM SELF)** | `/audit_events` |
-| [Avatar](avatar.md) | `/avatar` |
-| [Broadcast messages](broadcast_messages.md) | `/broadcast_messages` |
-| [Code snippets](snippets.md) | `/snippets` |
-| [Custom attributes](custom_attributes.md) | `/users/:id/custom_attributes` (also available for groups and projects) |
-| [Deploy keys](deploy_keys.md) | `/deploy_keys` (also available for projects) |
-| [Deploy tokens](deploy_tokens.md) | `/deploy_tokens` (also available for projects and groups) |
-| [Events](events.md) | `/events`, `/users/:id/events` (also available for projects) |
-| [Feature flags](features.md) | `/features` |
-| [Geo Nodes](geo_nodes.md) **(PREMIUM SELF)** | `/geo_nodes` |
-| [Group Activity Analytics](group_activity_analytics.md) | `/analytics/group_activity/{issues_count}` |
-| [Group repository storage moves](group_repository_storage_moves.md) **(PREMIUM SELF)** | `/group_repository_storage_moves` |
-| [Import repository from GitHub](import.md#import-repository-from-github) | `/import/github` |
-| [Import repository from Bitbucket Server](import.md#import-repository-from-bitbucket-server) | `/import/bitbucket_server` |
-| [Instance clusters](instance_clusters.md) **(FREE SELF)** | `/admin/clusters` |
-| [Instance-level CI/CD variables](instance_level_ci_variables.md) **(FREE SELF)** | `/admin/ci/variables` |
-| [Issues Statistics](issues_statistics.md) | `/issues_statistics` (also available for groups and projects) |
-| [Issues](issues.md) | `/issues` (also available for groups and projects) |
-| [Jobs](jobs.md) | `/job` |
-| [Keys](keys.md) | `/keys` |
-| [License](license.md) **(FREE SELF)** | `/license` |
-| [Markdown](markdown.md) | `/markdown` |
-| [Merge requests](merge_requests.md) | `/merge_requests` (also available for groups and projects) |
-| [Metrics dashboard annotations](metrics_dashboard_annotations.md) | `/environments/:id/metrics_dashboard/annotations`, `/clusters/:id/metrics_dashboard/annotations` |
-| [Namespaces](namespaces.md) | `/namespaces` |
-| [Notification settings](notification_settings.md) | `/notification_settings` (also available for groups and projects) |
-| [Pages domains](pages_domains.md) | `/pages/domains` (also available for projects) |
-| [Personal access tokens](personal_access_tokens.md) | `/personal_access_tokens` |
-| [Plan limits](plan_limits.md) | `/application/plan_limits` |
-| [Project repository storage moves](project_repository_storage_moves.md) **(FREE SELF)** | `/project_repository_storage_moves` |
-| [Projects](projects.md) | `/users/:id/projects` (also available for projects) |
-| [Runners](runners.md) | `/runners` (also available for projects) |
-| [Search](search.md) | `/search` (also available for groups and projects) |
-| [Service Data](usage_data.md) | `/usage_data` (For GitLab instance [Administrator](../user/permissions.md) users only) |
-| [Settings](settings.md) **(FREE SELF)** | `/application/settings` |
-| [Sidekiq metrics](sidekiq_metrics.md) **(FREE SELF)** | `/sidekiq` |
-| [Sidekiq queues administration](admin_sidekiq_queues.md) **(FREE SELF)** | `/admin/sidekiq/queues/:queue_name` |
-| [Snippet repository storage moves](snippet_repository_storage_moves.md) **(FREE SELF)** | `/snippet_repository_storage_moves` |
-| [Statistics](statistics.md) | `/application/statistics` |
-| [Suggestions](suggestions.md) | `/suggestions` |
-| [System hooks](system_hooks.md) | `/hooks` |
-| [To-dos](todos.md) | `/todos` |
-| [Topics](topics.md) | `/topics` |
-| [Users](users.md) | `/users` |
-| [Validate `.gitlab-ci.yml` file](lint.md) | `/lint` |
-| [Version](version.md) | `/version` |
+| Resource | Available endpoints |
+|:---------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------|
+| [Appearance](appearance.md) **(FREE SELF)** | `/application/appearance` |
+| [Applications](applications.md) | `/applications` |
+| [Audit Events](audit_events.md) **(PREMIUM SELF)** | `/audit_events` |
+| [Avatar](avatar.md) | `/avatar` |
+| [Broadcast messages](broadcast_messages.md) | `/broadcast_messages` |
+| [Code snippets](snippets.md) | `/snippets` |
+| [Code suggestions](code_suggestions.md) | `/code_suggestions` |
+| [Custom attributes](custom_attributes.md) | `/users/:id/custom_attributes` (also available for groups and projects) |
+| [Deploy keys](deploy_keys.md) | `/deploy_keys` (also available for projects) |
+| [Deploy tokens](deploy_tokens.md) | `/deploy_tokens` (also available for projects and groups) |
+| [Events](events.md) | `/events`, `/users/:id/events` (also available for projects) |
+| [Feature flags](features.md) | `/features` |
+| [Geo Nodes](geo_nodes.md) **(PREMIUM SELF)** | `/geo_nodes` |
+| [Group Activity Analytics](group_activity_analytics.md) | `/analytics/group_activity/{issues_count}` |
+| [Group repository storage moves](group_repository_storage_moves.md) **(PREMIUM SELF)** | `/group_repository_storage_moves` |
+| [Import repository from GitHub](import.md#import-repository-from-github) | `/import/github` |
+| [Import repository from Bitbucket Server](import.md#import-repository-from-bitbucket-server) | `/import/bitbucket_server` |
+| [Instance clusters](instance_clusters.md) **(FREE SELF)** | `/admin/clusters` |
+| [Instance-level CI/CD variables](instance_level_ci_variables.md) **(FREE SELF)** | `/admin/ci/variables` |
+| [Issues Statistics](issues_statistics.md) | `/issues_statistics` (also available for groups and projects) |
+| [Issues](issues.md) | `/issues` (also available for groups and projects) |
+| [Jobs](jobs.md) | `/job` |
+| [Keys](keys.md) | `/keys` |
+| [License](license.md) **(FREE SELF)** | `/license` |
+| [Markdown](markdown.md) | `/markdown` |
+| [Merge requests](merge_requests.md) | `/merge_requests` (also available for groups and projects) |
+| [Metrics dashboard annotations](metrics_dashboard_annotations.md) | `/environments/:id/metrics_dashboard/annotations`, `/clusters/:id/metrics_dashboard/annotations` |
+| [Namespaces](namespaces.md) | `/namespaces` |
+| [Notification settings](notification_settings.md) | `/notification_settings` (also available for groups and projects) |
+| [Pages domains](pages_domains.md) | `/pages/domains` (also available for projects) |
+| [Personal access tokens](personal_access_tokens.md) | `/personal_access_tokens` |
+| [Plan limits](plan_limits.md) | `/application/plan_limits` |
+| [Project repository storage moves](project_repository_storage_moves.md) **(FREE SELF)** | `/project_repository_storage_moves` |
+| [Projects](projects.md) | `/users/:id/projects` (also available for projects) |
+| [Runners](runners.md) | `/runners` (also available for projects) |
+| [Search](search.md) | `/search` (also available for groups and projects) |
+| [Service Data](usage_data.md) | `/usage_data` (For GitLab instance [Administrator](../user/permissions.md) users only) |
+| [Settings](settings.md) **(FREE SELF)** | `/application/settings` |
+| [Sidekiq metrics](sidekiq_metrics.md) **(FREE SELF)** | `/sidekiq` |
+| [Sidekiq queues administration](admin_sidekiq_queues.md) **(FREE SELF)** | `/admin/sidekiq/queues/:queue_name` |
+| [Snippet repository storage moves](snippet_repository_storage_moves.md) **(FREE SELF)** | `/snippet_repository_storage_moves` |
+| [Statistics](statistics.md) | `/application/statistics` |
+| [Suggestions](suggestions.md) | `/suggestions` |
+| [System hooks](system_hooks.md) | `/hooks` |
+| [To-dos](todos.md) | `/todos` |
+| [Topics](topics.md) | `/topics` |
+| [Users](users.md) | `/users` |
+| [Validate `.gitlab-ci.yml` file](lint.md) | `/lint` |
+| [Version](version.md) | `/version` |
## Templates API resources
diff --git a/doc/api/audit_events.md b/doc/api/audit_events.md
index e4856010b6c..89e89366de5 100644
--- a/doc/api/audit_events.md
+++ b/doc/api/audit_events.md
@@ -138,16 +138,10 @@ Example response:
## Group Audit Events
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/34078) in GitLab 12.5.
-> - Support for keyset pagination [added](https://gitlab.com/gitlab-org/gitlab/-/issues/333968) in GitLab 15.2.
-> - Also returning project audit events for projects within the given group was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/feat/337757) in GitLab 16.1 behind feature flag `audit_event_group_rollup`. Disabled by default.
-
-FLAG:
-On self-managed GitLab, by default returning project audit events for projects within the given group is not available. To make it available, ask an administrator
-to [enable the feature flag](../administration/feature_flags.md) named `audit_event_group_rollup`. On GitLab.com, this feature is not available. The feature is not ready for
-production use.
+> Support for keyset pagination [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/333968) in GitLab 15.2.
The Group Audit Events API allows you to retrieve [group audit events](../administration/audit_events.md#group-events).
+This API cannot retrieve project audit events.
A user with:
diff --git a/doc/api/award_emoji.md b/doc/api/award_emoji.md
index a22c61b3391..2ff71a088e6 100644
--- a/doc/api/award_emoji.md
+++ b/doc/api/award_emoji.md
@@ -6,12 +6,12 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Emoji reactions API **(FREE)**
-> [Renamed](https://gitlab.com/gitlab-org/gitlab/-/issues/409884) from "award emojis" to "emoji reactions" in GitLab 16.0.
+> [Renamed](https://gitlab.com/gitlab-org/gitlab/-/issues/409884) from "award emoji" to "emoji reactions" in GitLab 16.0.
An [emoji reaction](../user/award_emojis.md) tells a thousand words.
We call GitLab objects on which you can react with an emoji "awardables".
-You can react with emojis on the following:
+You can react with emoji on the following:
- [Epics](../user/group/epics/index.md) ([API](epics.md)). **(PREMIUM)**
- [Issues](../user/project/issues/index.md) ([API](issues.md)).
diff --git a/doc/api/broadcast_messages.md b/doc/api/broadcast_messages.md
index d91557523a9..9dbae6f5727 100644
--- a/doc/api/broadcast_messages.md
+++ b/doc/api/broadcast_messages.md
@@ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
- > `target_access_levels` [introduced](https://gitlab.com/gitlab-org/growth/team-tasks/-/issues/461) in GitLab 14.8 [with a flag](../administration/feature_flags.md) named `role_targeted_broadcast_messages`. Disabled by default.
- > `color` parameter [removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/95829) in GitLab 15.6.
-Broadcast messages API operates on [broadcast messages](../user/admin_area/broadcast_messages.md).
+Broadcast messages API operates on [broadcast messages](../administration/broadcast_messages.md).
As of GitLab 12.8, GET requests do not require authentication. All other broadcast message API endpoints are accessible only to administrators. Non-GET requests by:
diff --git a/doc/api/cluster_agents.md b/doc/api/cluster_agents.md
index 1753757e5d9..5abdece3909 100644
--- a/doc/api/cluster_agents.md
+++ b/doc/api/cluster_agents.md
@@ -366,7 +366,8 @@ Example response:
## Create an agent token
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/347046) in GitLab 15.0.
-> - Two-token limit [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/361030) in GitLab 16.1.
+> - Two-token limit [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/361030/) in GitLab 16.1 with a [flag](../administration/feature_flags.md) named `cluster_agents_limit_tokens_created`.
+> - Two-token limit [generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/412399) in GitLab 16.2. Feature flag `cluster_agents_limit_tokens_created` removed.
Creates a new token for an agent.
diff --git a/doc/api/code_suggestions.md b/doc/api/code_suggestions.md
new file mode 100644
index 00000000000..8057686897f
--- /dev/null
+++ b/doc/api/code_suggestions.md
@@ -0,0 +1,81 @@
+---
+stage: Manage
+group: AI assisted
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Code Suggestions API
+
+Use the Code Suggestions API to access the Code Suggestions feature.
+
+## Create an access token
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/404427) in GitLab 16.1.
+
+Creates an access token to access Code Suggestions.
+
+```plaintext
+POST /code_suggestions/tokens
+```
+
+```shell
+curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/code_suggestions/tokens"
+```
+
+Example response:
+
+```json
+{
+ "access_token": "secret-access-token",
+ "expires_in": 3600,
+ "created_at": 1687865199
+}
+```
+
+## Generate code completions (Experiment)
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/415581) in GitLab 16.2 [with a flag](../administration/feature_flags.md) named `code_suggestions_completion_api`. Disabled by default. This feature is an Experiment.
+
+FLAG:
+On self-managed GitLab, by default this feature is not available.
+On GitLab.com, this feature is not available.
+This feature is not ready for production use.
+
+Use the AI abstraction layer to generate code completions.
+
+```plaintext
+POST /code_suggestions/completions
+```
+
+Requests to this endpoint are proxied directly to the [model gateway](https://gitlab.com/gitlab-org/modelops/applied-ml/code-suggestions/ai-assist#completions). The documentation for the endpoint is currently the SSoT for named parameters.
+
+Authentication to this endpoint requires both a GitLab access token and a Code Suggestions JWT. The access token is used to authenticate the user and the JWT is used to authenticate the request to the model gateway.
+
+```shell
+curl --header "Authorization: Bearer <YOUR_ACCESS_TOKEN>" --header "X-Gitlab-Oidc-Token: <TOKEN_GENERATED_FROM_TOKENS_ENDPOINT>" --data "<JSON_BODY>" https://gitlab.example.com/api/v4/code_suggestions/completions
+```
+
+Example body:
+
+The [model gateway](https://gitlab.com/gitlab-org/modelops/applied-ml/code-suggestions/ai-assist#completions) is the SSoT for parameters.
+
+Example response:
+
+```json
+{
+ "id": "id",
+ "model": {
+ "engine": "vertex-ai",
+ "name": "code-gecko"
+ },
+ "object": "text_completion",
+ "created": 1688557841,
+ "choices": [
+ {
+ "text": "\n if self.is_running:\n self.speed += increment\n print(\"The car's speed is now",
+ "index": 0,
+ "finish_reason": "length"
+ }
+ ]
+}
+```
diff --git a/doc/api/database_migrations.md b/doc/api/database_migrations.md
new file mode 100644
index 00000000000..d7aea7ad57e
--- /dev/null
+++ b/doc/api/database_migrations.md
@@ -0,0 +1,33 @@
+---
+stage: Data Stores
+group: Database
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Database migrations API **(FREE SELF)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/123408) in GitLab 16.2.
+
+This API is for managing database migrations used in the development of GitLab.
+
+All methods require administrator authorization.
+
+## Mark a migration as successful
+
+Mark pending migrations as successfully executed to prevent them from being
+executed by the `db:migrate` tasks. Use this API to skip failing
+migrations after they are determined to be safe to skip.
+
+```plaintext
+POST /api/v4/admin/migrations/:version/mark
+```
+
+| Attribute | Type | Required | Description |
+|-----------------|----------------|----------|----------------------------------------------------------------------------------|
+| `version` | integer | yes | Version timestamp of the migration to be skipped |
+| `database` | string | no | The database name for which the migration is skipped. Defaults to `main`. |
+
+```shell
+curl --header "PRIVATE-TOKEN: <your_access_token>" \
+ --url "https://gitlab.example.com/api/v4/admin/migrations/:version/mark"
+```
diff --git a/doc/api/deployments.md b/doc/api/deployments.md
index e937a234b08..9ef75741142 100644
--- a/doc/api/deployments.md
+++ b/doc/api/deployments.md
@@ -7,6 +7,8 @@ type: concepts, howto
# Deployments API **(FREE)**
+> Support for [GitLab CI/CD job token](../ci/jobs/ci_job_token.md) authentication [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/414549) in GitLab 16.2.
+
## List project deployments
Get a list of deployments in a project.
@@ -359,7 +361,7 @@ POST /projects/:id/deployments
| `sha` | string | yes | The SHA of the commit that is deployed. |
| `ref` | string | yes | The name of the branch or tag that is deployed. |
| `tag` | boolean | yes | A boolean that indicates if the deployed ref is a tag (`true`) or not (`false`). |
-| `status` | string | yes | The status to filter deployments by. One of `running`, `success`, `failed`, or `canceled`. |
+| `status` | string | yes | The status of the deployment that is created. One of `running`, `success`, `failed`, or `canceled` |
```shell
curl --data "environment=production&sha=a91957a858320c0e17f3a0eca7cfacbff50ea29a&ref=main&tag=false&status=success" \
diff --git a/doc/api/environments.md b/doc/api/environments.md
index d2335149301..87f99bc9034 100644
--- a/doc/api/environments.md
+++ b/doc/api/environments.md
@@ -7,6 +7,8 @@ type: concepts, howto
# Environments API **(FREE)**
+> Support for [GitLab CI/CD job token](../ci/jobs/ci_job_token.md) authentication [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/414549) in GitLab 16.2.
+
## List environments
Get all environments for a given project.
diff --git a/doc/api/error_tracking.md b/doc/api/error_tracking.md
index d1ab67a93ae..9037c1b58d2 100644
--- a/doc/api/error_tracking.md
+++ b/doc/api/error_tracking.md
@@ -1,5 +1,5 @@
---
-stage: Monitor
+stage: Analytics
group: Observability
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/api/geo_nodes.md b/doc/api/geo_nodes.md
index b9d4f93d841..4ec57274bd7 100644
--- a/doc/api/geo_nodes.md
+++ b/doc/api/geo_nodes.md
@@ -560,7 +560,19 @@ Example response:
"design_management_repositories_verified_count": 5,
"design_management_repositories_verification_failed_count": 5,
"design_management_repositories_synced_in_percentage": "100.00%",
- "design_management_repositories_verified_in_percentage": "100.00%"
+ "design_management_repositories_verified_in_percentage": "100.00%",
+ "project_repositories_count": 5,
+ "project_repositories_checksum_total_count": 5,
+ "project_repositories_checksummed_count": 5,
+ "project_repositories_checksum_failed_count": 0,
+ "project_repositories_synced_count": 5,
+ "project_repositories_failed_count": 0,
+ "project_repositories_registry_count": 5,
+ "project_repositories_verification_total_count": 5,
+ "project_repositories_verified_count": 5,
+ "project_repositories_verification_failed_count": 0,
+ "project_repositories_synced_in_percentage": "100.00%",
+ "project_repositories_verified_in_percentage": "100.00%"
},
{
"geo_node_id": 2,
@@ -775,7 +787,19 @@ Example response:
"dependency_proxy_manifests_verified_count": 5,
"dependency_proxy_manifests_verification_failed_count": 5,
"dependency_proxy_manifests_synced_in_percentage": "100.00%",
- "dependency_proxy_manifests_verified_in_percentage": "100.00%"
+ "dependency_proxy_manifests_verified_in_percentage": "100.00%",
+ "project_repositories_count": 5,
+ "project_repositories_checksum_total_count": 5,
+ "project_repositories_checksummed_count": 5,
+ "project_repositories_checksum_failed_count": 0,
+ "project_repositories_synced_count": 5,
+ "project_repositories_failed_count": 0,
+ "project_repositories_registry_count": 5,
+ "project_repositories_verification_total_count": 5,
+ "project_repositories_verified_count": 5,
+ "project_repositories_verification_failed_count": 0,
+ "project_repositories_synced_in_percentage": "100.00%",
+ "project_repositories_verified_in_percentage": "100.00%"
}
]
```
@@ -1000,7 +1024,19 @@ Example response:
"design_management_repositories_verified_count": 5,
"design_management_repositories_verification_failed_count": 5,
"design_management_repositories_synced_in_percentage": "100.00%",
- "design_management_repositories_verified_in_percentage": "100.00%"
+ "design_management_repositories_verified_in_percentage": "100.00%",
+ "project_repositories_count": 5,
+ "project_repositories_checksum_total_count": 5,
+ "project_repositories_checksummed_count": 5,
+ "project_repositories_checksum_failed_count": 0,
+ "project_repositories_synced_count": 5,
+ "project_repositories_failed_count": 0,
+ "project_repositories_registry_count": 5,
+ "project_repositories_verification_total_count": 5,
+ "project_repositories_verified_count": 5,
+ "project_repositories_verification_failed_count": 0,
+ "project_repositories_synced_in_percentage": "100.00%",
+ "project_repositories_verified_in_percentage": "100.00%"
}
```
diff --git a/doc/api/graphql/custom_emoji.md b/doc/api/graphql/custom_emoji.md
index 25ae37b75a9..c39ac955c01 100644
--- a/doc/api/graphql/custom_emoji.md
+++ b/doc/api/graphql/custom_emoji.md
@@ -4,17 +4,17 @@ group: Project Management
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
-# Use custom emojis with GraphQL **(FREE)**
+# Use custom emoji with GraphQL **(FREE)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37911) in GitLab 13.6 [with a flag](../../administration/feature_flags.md) named `custom_emoji`. Disabled by default.
> - Enabled on GitLab.com in GitLab 14.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 `custom_emoji`.
+On self-managed GitLab, by default this feature is not available. To make it available, an administrator can [enable the feature flag](../../administration/feature_flags.md) named `custom_emoji`.
On GitLab.com, this feature is available.
This feature is ready for production use.
-To use custom emojis in comments and descriptions, you can add them to a top-level group using the GraphQL API.
+To use [custom emoji](../../user/award_emojis.md) in comments and descriptions, you can add them to a top-level group using the GraphQL API.
Parameters:
@@ -38,7 +38,7 @@ mutation CreateCustomEmoji($groupPath: ID!) {
}
```
-After adding a custom emoji to the group, members can use it in the same way as other emojis in the comments.
+After adding a custom emoji to the group, members can use it in the same way as other emoji in the comments.
## Get custom emoji for a group
diff --git a/doc/api/graphql/index.md b/doc/api/graphql/index.md
index abedb63d575..9a78d43ff4b 100644
--- a/doc/api/graphql/index.md
+++ b/doc/api/graphql/index.md
@@ -57,7 +57,7 @@ You can work with sample queries that pull data from public projects on GitLab.c
- [Create an audit report](audit_report.md)
- [Identify issue boards](sample_issue_boards.md)
- [Query users](users_example.md)
-- [Use custom emojis](custom_emoji.md)
+- [Use custom emoji](custom_emoji.md)
The [get started](getting_started.md) page includes different methods to customize GraphQL queries.
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index 95420764226..425a2b7e980 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -253,6 +253,22 @@ Returns [`EpicList`](#epiclist).
| <a id="queryepicboardlistepicfilters"></a>`epicFilters` | [`EpicFilters`](#epicfilters) | Filters applied when getting epic metadata in the epic board list. |
| <a id="queryepicboardlistid"></a>`id` | [`BoardsEpicListID!`](#boardsepiclistid) | Global ID of the list. |
+### `Query.explainVulnerabilityPrompt`
+
+Explain This Vulnerability Prompt for a specified Vulnerability.
+
+WARNING:
+**Introduced** in 16.2.
+This feature is an Experiment. It can be changed or removed at any time.
+
+Returns [`ExplainVulnerabilityPrompt`](#explainvulnerabilityprompt).
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="queryexplainvulnerabilitypromptvulnerabilityid"></a>`vulnerabilityId` | [`VulnerabilityID!`](#vulnerabilityid) | Vulnerability to generate a prompt for. |
+
### `Query.geoNode`
Find a Geo node.
@@ -348,6 +364,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="queryissuesassigneeid"></a>`assigneeId` | [`String`](#string) | ID of a user assigned to the issues. Wildcard values "NONE" and "ANY" are supported. |
| <a id="queryissuesassigneeusername"></a>`assigneeUsername` **{warning-solid}** | [`String`](#string) | **Deprecated** in 13.11. Use `assigneeUsernames`. |
| <a id="queryissuesassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the issue. |
+| <a id="queryissuesassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee wildcard. Incompatible with assigneeUsername and assigneeUsernames. |
| <a id="queryissuesauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author of the issue. |
| <a id="queryissuesclosedafter"></a>`closedAfter` | [`Time`](#time) | Issues closed after this date. |
| <a id="queryissuesclosedbefore"></a>`closedBefore` | [`Time`](#time) | Issues closed before this date. |
@@ -357,13 +374,16 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="queryissuescrmcontactid"></a>`crmContactId` | [`String`](#string) | ID of a contact assigned to the issues. |
| <a id="queryissuescrmorganizationid"></a>`crmOrganizationId` | [`String`](#string) | ID of an organization assigned to the issues. |
| <a id="queryissuesepicid"></a>`epicId` | [`String`](#string) | ID of an epic associated with the issues, "none" and "any" values are supported. |
+| <a id="queryissuesepicwildcardid"></a>`epicWildcardId` | [`EpicWildcardId`](#epicwildcardid) | Filter by epic ID wildcard. Incompatible with epicId. |
| <a id="queryissueshealthstatusfilter"></a>`healthStatusFilter` | [`HealthStatusFilter`](#healthstatusfilter) | Health status of the issue, "none" and "any" values are supported. |
| <a id="queryissuesiid"></a>`iid` | [`String`](#string) | IID of the issue. For example, "1". |
| <a id="queryissuesiids"></a>`iids` | [`[String!]`](#string) | List of IIDs of issues. For example, `["1", "2"]`. |
| <a id="queryissuesin"></a>`in` | [`[IssuableSearchableField!]`](#issuablesearchablefield) | Specify the fields to perform the search in. Defaults to `[TITLE, DESCRIPTION]`. Requires the `search` argument.'. |
| <a id="queryissuesincludearchived"></a>`includeArchived` | [`Boolean`](#boolean) | Whether to include issues from archived projects. Defaults to `false`. |
| <a id="queryissuesincludesubepics"></a>`includeSubepics` | [`Boolean`](#boolean) | Whether to include subepics when filtering issues by epicId. |
+| <a id="queryissuesiterationcadenceid"></a>`iterationCadenceId` | [`[IterationsCadenceID!]`](#iterationscadenceid) | Filter by a list of iteration cadence IDs. |
| <a id="queryissuesiterationid"></a>`iterationId` | [`[ID]`](#id) | List of iteration Global IDs applied to the issue. |
+| <a id="queryissuesiterationtitle"></a>`iterationTitle` | [`String`](#string) | Filter by iteration title. |
| <a id="queryissuesiterationwildcardid"></a>`iterationWildcardId` | [`IterationWildcardId`](#iterationwildcardid) | Filter by iteration ID wildcard. |
| <a id="queryissueslabelname"></a>`labelName` | [`[String]`](#string) | Labels applied to this issue. |
| <a id="queryissuesmilestonetitle"></a>`milestoneTitle` | [`[String]`](#string) | Milestone applied to this issue. |
@@ -378,6 +398,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="queryissuesupdatedafter"></a>`updatedAfter` | [`Time`](#time) | Issues updated after this date. |
| <a id="queryissuesupdatedbefore"></a>`updatedBefore` | [`Time`](#time) | Issues updated before this date. |
| <a id="queryissuesweight"></a>`weight` | [`String`](#string) | Weight applied to the issue, "none" and "any" values are supported. |
+| <a id="queryissuesweightwildcardid"></a>`weightWildcardId` | [`WeightWildcardId`](#weightwildcardid) | Filter by weight ID wildcard. Incompatible with weight. |
### `Query.iteration`
@@ -853,6 +874,8 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="queryworkspacesids"></a>`ids` | [`[RemoteDevelopmentWorkspaceID!]`](#remotedevelopmentworkspaceid) | Array of global workspace IDs. For example, `["gid://gitlab/RemoteDevelopment::Workspace/1"]`. |
+| <a id="queryworkspacesincludeactualstates"></a>`includeActualStates` | [`[String!]`](#string) | Includes all workspaces that match any of the actual states. |
+| <a id="queryworkspacesprojectids"></a>`projectIds` | [`[ProjectID!]`](#projectid) | Filter workspaces by project id. |
## `Mutation` type
@@ -1022,6 +1045,7 @@ Input type: `AdminSidekiqQueuesDeleteJobsInput`
| Name | Type | Description |
| ---- | ---- | ----------- |
+| <a id="mutationadminsidekiqqueuesdeletejobsairesource"></a>`aiResource` | [`String`](#string) | Delete jobs matching ai_resource in the context metadata. |
| <a id="mutationadminsidekiqqueuesdeletejobsartifactsize"></a>`artifactSize` | [`String`](#string) | Delete jobs matching artifact_size in the context metadata. |
| <a id="mutationadminsidekiqqueuesdeletejobsartifactusedcdn"></a>`artifactUsedCdn` | [`String`](#string) | Delete jobs matching artifact_used_cdn in the context metadata. |
| <a id="mutationadminsidekiqqueuesdeletejobsartifactsdependenciescount"></a>`artifactsDependenciesCount` | [`String`](#string) | Delete jobs matching artifacts_dependencies_count in the context metadata. |
@@ -1191,7 +1215,7 @@ Input type: `AuditEventsStreamingDestinationEventsAddInput`
| ---- | ---- | ----------- |
| <a id="mutationauditeventsstreamingdestinationeventsaddclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationauditeventsstreamingdestinationeventsadderrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-| <a id="mutationauditeventsstreamingdestinationeventsaddeventtypefilters"></a>`eventTypeFilters` | [`[String!]`](#string) | Event type filters present. |
+| <a id="mutationauditeventsstreamingdestinationeventsaddeventtypefilters"></a>`eventTypeFilters` | [`[String!]`](#string) | List of event type filters for the audit event external destination. |
### `Mutation.auditEventsStreamingDestinationEventsRemove`
@@ -1212,6 +1236,26 @@ Input type: `AuditEventsStreamingDestinationEventsRemoveInput`
| <a id="mutationauditeventsstreamingdestinationeventsremoveclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationauditeventsstreamingdestinationeventsremoveerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+### `Mutation.auditEventsStreamingDestinationInstanceEventsAdd`
+
+Input type: `AuditEventsStreamingDestinationInstanceEventsAddInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationauditeventsstreamingdestinationinstanceeventsaddclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationauditeventsstreamingdestinationinstanceeventsadddestinationid"></a>`destinationId` | [`AuditEventsInstanceExternalAuditEventDestinationID!`](#auditeventsinstanceexternalauditeventdestinationid) | Destination id. |
+| <a id="mutationauditeventsstreamingdestinationinstanceeventsaddeventtypefilters"></a>`eventTypeFilters` | [`[String!]!`](#string) | List of event type filters to add for streaming. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationauditeventsstreamingdestinationinstanceeventsaddclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationauditeventsstreamingdestinationinstanceeventsadderrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| <a id="mutationauditeventsstreamingdestinationinstanceeventsaddeventtypefilters"></a>`eventTypeFilters` | [`[String!]`](#string) | List of event type filters for the audit event external destination. |
+
### `Mutation.auditEventsStreamingHeadersCreate`
Input type: `AuditEventsStreamingHeadersCreateInput`
@@ -1293,6 +1337,24 @@ Input type: `AuditEventsStreamingInstanceHeadersCreateInput`
| <a id="mutationauditeventsstreaminginstanceheaderscreateerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
| <a id="mutationauditeventsstreaminginstanceheaderscreateheader"></a>`header` | [`AuditEventsStreamingInstanceHeader`](#auditeventsstreaminginstanceheader) | Created header. |
+### `Mutation.auditEventsStreamingInstanceHeadersDestroy`
+
+Input type: `AuditEventsStreamingInstanceHeadersDestroyInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationauditeventsstreaminginstanceheadersdestroyclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationauditeventsstreaminginstanceheadersdestroyheaderid"></a>`headerId` | [`AuditEventsStreamingInstanceHeaderID!`](#auditeventsstreaminginstanceheaderid) | Header to delete. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationauditeventsstreaminginstanceheadersdestroyclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationauditeventsstreaminginstanceheadersdestroyerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+
### `Mutation.auditEventsStreamingInstanceHeadersUpdate`
Input type: `AuditEventsStreamingInstanceHeadersUpdateInput`
@@ -3142,6 +3204,7 @@ Input type: `EnvironmentCreateInput`
| <a id="mutationenvironmentcreateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationenvironmentcreateclusteragentid"></a>`clusterAgentId` | [`ClustersAgentID`](#clustersagentid) | Cluster agent of the environment. |
| <a id="mutationenvironmentcreateexternalurl"></a>`externalUrl` | [`String`](#string) | External URL of the environment. |
+| <a id="mutationenvironmentcreatekubernetesnamespace"></a>`kubernetesNamespace` | [`String`](#string) | Kubernetes namespace of the environment. |
| <a id="mutationenvironmentcreatename"></a>`name` | [`String!`](#string) | Name of the environment. |
| <a id="mutationenvironmentcreateprojectpath"></a>`projectPath` | [`ID!`](#id) | Full path of the project. |
| <a id="mutationenvironmentcreatetier"></a>`tier` | [`DeploymentTier`](#deploymenttier) | Tier of the environment. |
@@ -3210,6 +3273,7 @@ Input type: `EnvironmentUpdateInput`
| <a id="mutationenvironmentupdateclusteragentid"></a>`clusterAgentId` | [`ClustersAgentID`](#clustersagentid) | Cluster agent of the environment. |
| <a id="mutationenvironmentupdateexternalurl"></a>`externalUrl` | [`String`](#string) | External URL of the environment. |
| <a id="mutationenvironmentupdateid"></a>`id` | [`EnvironmentID!`](#environmentid) | Global ID of the environment to update. |
+| <a id="mutationenvironmentupdatekubernetesnamespace"></a>`kubernetesNamespace` | [`String`](#string) | Kubernetes namespace of the environment. |
| <a id="mutationenvironmentupdatetier"></a>`tier` | [`DeploymentTier`](#deploymenttier) | Tier of the environment. |
#### Fields
@@ -3518,6 +3582,7 @@ Input type: `ExternalAuditEventDestinationCreateInput`
| <a id="mutationexternalauditeventdestinationcreateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationexternalauditeventdestinationcreatedestinationurl"></a>`destinationUrl` | [`String!`](#string) | Destination URL. |
| <a id="mutationexternalauditeventdestinationcreategrouppath"></a>`groupPath` | [`ID!`](#id) | Group path. |
+| <a id="mutationexternalauditeventdestinationcreatename"></a>`name` | [`String`](#string) | Destination name. |
| <a id="mutationexternalauditeventdestinationcreateverificationtoken"></a>`verificationToken` | [`String`](#string) | Verification token. |
#### Fields
@@ -3557,6 +3622,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 update. |
+| <a id="mutationexternalauditeventdestinationupdatename"></a>`name` | [`String`](#string) | Destination name. |
#### Fields
@@ -3813,6 +3879,7 @@ Input type: `InstanceExternalAuditEventDestinationCreateInput`
| ---- | ---- | ----------- |
| <a id="mutationinstanceexternalauditeventdestinationcreateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationinstanceexternalauditeventdestinationcreatedestinationurl"></a>`destinationUrl` | [`String!`](#string) | Destination URL. |
+| <a id="mutationinstanceexternalauditeventdestinationcreatename"></a>`name` | [`String`](#string) | Destination name. |
#### Fields
@@ -3851,6 +3918,7 @@ Input type: `InstanceExternalAuditEventDestinationUpdateInput`
| <a id="mutationinstanceexternalauditeventdestinationupdateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationinstanceexternalauditeventdestinationupdatedestinationurl"></a>`destinationUrl` | [`String`](#string) | Destination URL to change. |
| <a id="mutationinstanceexternalauditeventdestinationupdateid"></a>`id` | [`AuditEventsInstanceExternalAuditEventDestinationID!`](#auditeventsinstanceexternalauditeventdestinationid) | ID of the external instance audit event destination to update. |
+| <a id="mutationinstanceexternalauditeventdestinationupdatename"></a>`name` | [`String`](#string) | Destination name. |
#### Fields
@@ -4846,7 +4914,7 @@ Input type: `MergeRequestUpdateApprovalRuleInput`
| <a id="mutationmergerequestupdateapprovalruleiid"></a>`iid` | [`String!`](#string) | IID of the merge request to mutate. |
| <a id="mutationmergerequestupdateapprovalrulename"></a>`name` | [`String!`](#string) | Name of the approval rule. |
| <a id="mutationmergerequestupdateapprovalruleprojectpath"></a>`projectPath` | [`ID!`](#id) | Project the merge request to mutate is in. |
-| <a id="mutationmergerequestupdateapprovalruleremovehiddengroups"></a>`removeHiddenGroups` | [`[Boolean!]`](#boolean) | Whether hidden groups should be removed. |
+| <a id="mutationmergerequestupdateapprovalruleremovehiddengroups"></a>`removeHiddenGroups` | [`Boolean`](#boolean) | Whether hidden groups should be removed. |
| <a id="mutationmergerequestupdateapprovalruleuserids"></a>`userIds` | [`[String!]`](#string) | IDs of users as approvers. |
#### Fields
@@ -5375,7 +5443,7 @@ Input type: `PrometheusIntegrationCreateInput`
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="mutationprometheusintegrationcreateactive"></a>`active` | [`Boolean!`](#boolean) | Whether the integration is receiving alerts. |
-| <a id="mutationprometheusintegrationcreateapiurl"></a>`apiUrl` | [`String!`](#string) | Endpoint at which Prometheus can be queried. |
+| <a id="mutationprometheusintegrationcreateapiurl"></a>`apiUrl` | [`String`](#string) | Endpoint at which Prometheus can be queried. |
| <a id="mutationprometheusintegrationcreateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationprometheusintegrationcreateprojectpath"></a>`projectPath` | [`ID!`](#id) | Project to create the integration in. |
@@ -6837,6 +6905,31 @@ Input type: `UserSetNamespaceCommitEmailInput`
| <a id="mutationusersetnamespacecommitemailerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
| <a id="mutationusersetnamespacecommitemailnamespacecommitemail"></a>`namespaceCommitEmail` | [`NamespaceCommitEmail`](#namespacecommitemail) | User namespace commit email after mutation. |
+### `Mutation.vulnerabilitiesDismiss`
+
+WARNING:
+**Introduced** in 16.2.
+This feature is an Experiment. It can be changed or removed at any time.
+
+Input type: `VulnerabilitiesDismissInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationvulnerabilitiesdismissclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationvulnerabilitiesdismisscomment"></a>`comment` | [`String`](#string) | Comment why vulnerability was dismissed (maximum 50,000 characters). |
+| <a id="mutationvulnerabilitiesdismissdismissalreason"></a>`dismissalReason` | [`VulnerabilityDismissalReason`](#vulnerabilitydismissalreason) | Reason why vulnerability should be dismissed. |
+| <a id="mutationvulnerabilitiesdismissvulnerabilityids"></a>`vulnerabilityIds` | [`[VulnerabilityID!]!`](#vulnerabilityid) | IDs of the vulnerabilities to be dismissed. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationvulnerabilitiesdismissclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationvulnerabilitiesdismisserrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| <a id="mutationvulnerabilitiesdismissvulnerabilities"></a>`vulnerabilities` **{warning-solid}** | [`[Vulnerability!]!`](#vulnerability) | **Deprecated:** This feature is an Experiment. It can be changed or removed at any time. Introduced in 16.2. |
+
### `Mutation.vulnerabilityConfirm`
Input type: `VulnerabilityConfirmInput`
@@ -8423,6 +8516,29 @@ The edge type for [`ComplianceFramework`](#complianceframework).
| <a id="complianceframeworkedgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
| <a id="complianceframeworkedgenode"></a>`node` | [`ComplianceFramework`](#complianceframework) | The item at the end of the edge. |
+#### `ComplianceStandardsAdherenceConnection`
+
+The connection type for [`ComplianceStandardsAdherence`](#compliancestandardsadherence).
+
+##### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="compliancestandardsadherenceconnectionedges"></a>`edges` | [`[ComplianceStandardsAdherenceEdge]`](#compliancestandardsadherenceedge) | A list of edges. |
+| <a id="compliancestandardsadherenceconnectionnodes"></a>`nodes` | [`[ComplianceStandardsAdherence]`](#compliancestandardsadherence) | A list of nodes. |
+| <a id="compliancestandardsadherenceconnectionpageinfo"></a>`pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+#### `ComplianceStandardsAdherenceEdge`
+
+The edge type for [`ComplianceStandardsAdherence`](#compliancestandardsadherence).
+
+##### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="compliancestandardsadherenceedgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| <a id="compliancestandardsadherenceedgenode"></a>`node` | [`ComplianceStandardsAdherence`](#compliancestandardsadherence) | The item at the end of the edge. |
+
#### `ComplianceViolationConnection`
The connection type for [`ComplianceViolation`](#complianceviolation).
@@ -9893,6 +10009,29 @@ The connection type for [`MergeRequest`](#mergerequest).
| <a id="mergerequestconnectionpageinfo"></a>`pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
| <a id="mergerequestconnectiontotaltimetomerge"></a>`totalTimeToMerge` | [`Float`](#float) | Total sum of time to merge, in seconds, for the collection of merge requests. |
+#### `MergeRequestDiffConnection`
+
+The connection type for [`MergeRequestDiff`](#mergerequestdiff).
+
+##### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mergerequestdiffconnectionedges"></a>`edges` | [`[MergeRequestDiffEdge]`](#mergerequestdiffedge) | A list of edges. |
+| <a id="mergerequestdiffconnectionnodes"></a>`nodes` | [`[MergeRequestDiff]`](#mergerequestdiff) | A list of nodes. |
+| <a id="mergerequestdiffconnectionpageinfo"></a>`pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+#### `MergeRequestDiffEdge`
+
+The edge type for [`MergeRequestDiff`](#mergerequestdiff).
+
+##### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mergerequestdiffedgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| <a id="mergerequestdiffedgenode"></a>`node` | [`MergeRequestDiff`](#mergerequestdiff) | The item at the end of the edge. |
+
#### `MergeRequestDiffLlmSummaryConnection`
The connection type for [`MergeRequestDiffLlmSummary`](#mergerequestdiffllmsummary).
@@ -9973,51 +10112,51 @@ The edge type for [`MergeRequestParticipant`](#mergerequestparticipant).
| <a id="mergerequestparticipantedgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
| <a id="mergerequestparticipantedgenode"></a>`node` | [`MergeRequestParticipant`](#mergerequestparticipant) | The item at the end of the edge. |
-#### `MergeRequestReviewerConnection`
+#### `MergeRequestReviewLlmSummaryConnection`
-The connection type for [`MergeRequestReviewer`](#mergerequestreviewer).
+The connection type for [`MergeRequestReviewLlmSummary`](#mergerequestreviewllmsummary).
##### Fields
| Name | Type | Description |
| ---- | ---- | ----------- |
-| <a id="mergerequestreviewerconnectionedges"></a>`edges` | [`[MergeRequestReviewerEdge]`](#mergerequestrevieweredge) | A list of edges. |
-| <a id="mergerequestreviewerconnectionnodes"></a>`nodes` | [`[MergeRequestReviewer]`](#mergerequestreviewer) | A list of nodes. |
-| <a id="mergerequestreviewerconnectionpageinfo"></a>`pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+| <a id="mergerequestreviewllmsummaryconnectionedges"></a>`edges` | [`[MergeRequestReviewLlmSummaryEdge]`](#mergerequestreviewllmsummaryedge) | A list of edges. |
+| <a id="mergerequestreviewllmsummaryconnectionnodes"></a>`nodes` | [`[MergeRequestReviewLlmSummary]`](#mergerequestreviewllmsummary) | A list of nodes. |
+| <a id="mergerequestreviewllmsummaryconnectionpageinfo"></a>`pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
-#### `MergeRequestReviewerEdge`
+#### `MergeRequestReviewLlmSummaryEdge`
-The edge type for [`MergeRequestReviewer`](#mergerequestreviewer).
+The edge type for [`MergeRequestReviewLlmSummary`](#mergerequestreviewllmsummary).
##### Fields
| Name | Type | Description |
| ---- | ---- | ----------- |
-| <a id="mergerequestrevieweredgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
-| <a id="mergerequestrevieweredgenode"></a>`node` | [`MergeRequestReviewer`](#mergerequestreviewer) | The item at the end of the edge. |
+| <a id="mergerequestreviewllmsummaryedgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| <a id="mergerequestreviewllmsummaryedgenode"></a>`node` | [`MergeRequestReviewLlmSummary`](#mergerequestreviewllmsummary) | The item at the end of the edge. |
-#### `MetricsDashboardAnnotationConnection`
+#### `MergeRequestReviewerConnection`
-The connection type for [`MetricsDashboardAnnotation`](#metricsdashboardannotation).
+The connection type for [`MergeRequestReviewer`](#mergerequestreviewer).
##### Fields
| Name | Type | Description |
| ---- | ---- | ----------- |
-| <a id="metricsdashboardannotationconnectionedges"></a>`edges` | [`[MetricsDashboardAnnotationEdge]`](#metricsdashboardannotationedge) | A list of edges. |
-| <a id="metricsdashboardannotationconnectionnodes"></a>`nodes` | [`[MetricsDashboardAnnotation]`](#metricsdashboardannotation) | A list of nodes. |
-| <a id="metricsdashboardannotationconnectionpageinfo"></a>`pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+| <a id="mergerequestreviewerconnectionedges"></a>`edges` | [`[MergeRequestReviewerEdge]`](#mergerequestrevieweredge) | A list of edges. |
+| <a id="mergerequestreviewerconnectionnodes"></a>`nodes` | [`[MergeRequestReviewer]`](#mergerequestreviewer) | A list of nodes. |
+| <a id="mergerequestreviewerconnectionpageinfo"></a>`pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
-#### `MetricsDashboardAnnotationEdge`
+#### `MergeRequestReviewerEdge`
-The edge type for [`MetricsDashboardAnnotation`](#metricsdashboardannotation).
+The edge type for [`MergeRequestReviewer`](#mergerequestreviewer).
##### Fields
| Name | Type | Description |
| ---- | ---- | ----------- |
-| <a id="metricsdashboardannotationedgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
-| <a id="metricsdashboardannotationedgenode"></a>`node` | [`MetricsDashboardAnnotation`](#metricsdashboardannotation) | The item at the end of the edge. |
+| <a id="mergerequestrevieweredgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| <a id="mergerequestrevieweredgenode"></a>`node` | [`MergeRequestReviewer`](#mergerequestreviewer) | The item at the end of the edge. |
#### `MilestoneConnection`
@@ -10599,6 +10738,29 @@ The edge type for [`ProjectMember`](#projectmember).
| <a id="projectmemberedgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
| <a id="projectmemberedgenode"></a>`node` | [`ProjectMember`](#projectmember) | The item at the end of the edge. |
+#### `ProjectRepositoryRegistryConnection`
+
+The connection type for [`ProjectRepositoryRegistry`](#projectrepositoryregistry).
+
+##### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="projectrepositoryregistryconnectionedges"></a>`edges` | [`[ProjectRepositoryRegistryEdge]`](#projectrepositoryregistryedge) | A list of edges. |
+| <a id="projectrepositoryregistryconnectionnodes"></a>`nodes` | [`[ProjectRepositoryRegistry]`](#projectrepositoryregistry) | A list of nodes. |
+| <a id="projectrepositoryregistryconnectionpageinfo"></a>`pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+#### `ProjectRepositoryRegistryEdge`
+
+The edge type for [`ProjectRepositoryRegistry`](#projectrepositoryregistry).
+
+##### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="projectrepositoryregistryedgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| <a id="projectrepositoryregistryedgenode"></a>`node` | [`ProjectRepositoryRegistry`](#projectrepositoryregistry) | The item at the end of the edge. |
+
#### `ProjectWikiRepositoryRegistryConnection`
The connection type for [`ProjectWikiRepositoryRegistry`](#projectwikirepositoryregistry).
@@ -11987,6 +12149,19 @@ Representation of a GitLab user.
| <a id="achievementupdatedat"></a>`updatedAt` | [`Time!`](#time) | Timestamp the achievement was last updated. |
| <a id="achievementuserachievements"></a>`userAchievements` **{warning-solid}** | [`UserAchievementConnection`](#userachievementconnection) | **Introduced** in 15.10. This feature is an Experiment. It can be changed or removed at any time. Recipients for the achievement. |
+### `AddOnPurchase`
+
+Represents AddOn purchase for Namespace.
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="addonpurchaseassignedquantity"></a>`assignedQuantity` | [`Int!`](#int) | Number of seats assigned. |
+| <a id="addonpurchaseid"></a>`id` | [`GitlabSubscriptionsAddOnPurchaseID!`](#gitlabsubscriptionsaddonpurchaseid) | ID of AddOnPurchase. |
+| <a id="addonpurchasename"></a>`name` | [`String!`](#string) | Name of AddOn. |
+| <a id="addonpurchasepurchasedquantity"></a>`purchasedQuantity` | [`Int!`](#int) | Number of seats purchased. |
+
### `AgentConfiguration`
Configuration details for an Agent.
@@ -12068,7 +12243,6 @@ Describes an alert from the project's Alert Management.
| <a id="alertmanagementalertiid"></a>`iid` | [`ID!`](#id) | Internal ID of the alert. |
| <a id="alertmanagementalertissue"></a>`issue` | [`Issue`](#issue) | Issue attached to the alert. |
| <a id="alertmanagementalertissueiid"></a>`issueIid` **{warning-solid}** | [`ID`](#id) | **Deprecated** in 13.10. Use issue field. |
-| <a id="alertmanagementalertmetricsdashboardurl"></a>`metricsDashboardUrl` **{warning-solid}** | [`String`](#string) | **Deprecated** in 16.0. Returns no data. Underlying feature was removed in 16.0. |
| <a id="alertmanagementalertmonitoringtool"></a>`monitoringTool` | [`String`](#string) | Monitoring tool the alert came from. |
| <a id="alertmanagementalertnotes"></a>`notes` | [`NoteConnection!`](#noteconnection) | All notes on this noteable. (see [Connections](#connections)) |
| <a id="alertmanagementalertprometheusalert"></a>`prometheusAlert` | [`PrometheusAlert`](#prometheusalert) | Alert condition for Prometheus. |
@@ -12610,7 +12784,8 @@ Represents a list for an issue board.
| <a id="boardlistmilestone"></a>`milestone` | [`Milestone`](#milestone) | Milestone of the list. |
| <a id="boardlistposition"></a>`position` | [`Int`](#int) | Position of list within the board. |
| <a id="boardlisttitle"></a>`title` | [`String!`](#string) | Title of the list. |
-| <a id="boardlisttotalweight"></a>`totalWeight` | [`Int`](#int) | Total weight of all issues in the list. |
+| <a id="boardlisttotalissueweight"></a>`totalIssueWeight` | [`BigInt`](#bigint) | Total weight of all issues in the list, encoded as a string. |
+| <a id="boardlisttotalweight"></a>`totalWeight` **{warning-solid}** | [`Int`](#int) | **Deprecated** in 16.2. Use `totalIssueWeight`. |
#### Fields with arguments
@@ -12723,12 +12898,11 @@ Represents the total number of issues and their weights for a particular day.
##### `CiCatalogResource.versions`
-Versions of the catalog resource.
+Versions of the catalog resource. This field can only be resolved for one catalog resource in any single request.
WARNING:
-**Deprecated** in 16.1.
-Causes performance degradation.
-Use: `latest_version`.
+**Introduced** in 16.2.
+This feature is an Experiment. It can be changed or removed at any time.
Returns [`ReleaseConnection`](#releaseconnection).
@@ -12771,12 +12945,12 @@ four standard [pagination arguments](#connection-pagination-arguments):
| 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="ciconfigincludeblob"></a>`blob` | [`String`](#string) | File blob location. It can be masked if it contains masked variables. For example, `"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="ciconfigincludelocation"></a>`location` | [`String`](#string) | File location. It can be masked if it contains masked variables. For example, `".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. For example, `"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`
@@ -12882,6 +13056,7 @@ CI/CD variables for a group.
| Name | Type | Description |
| ---- | ---- | ----------- |
+| <a id="cigroupvariabledescription"></a>`description` | [`String`](#string) | Description of the variable. |
| <a id="cigroupvariableenvironmentscope"></a>`environmentScope` | [`String`](#string) | Scope defining the environments that can use the variable. |
| <a id="cigroupvariableid"></a>`id` | [`ID!`](#id) | ID of the variable. |
| <a id="cigroupvariablekey"></a>`key` | [`String`](#string) | Name of the variable. |
@@ -13040,7 +13215,7 @@ CI/CD variables given to a manual job.
| Name | Type | Description |
| ---- | ---- | ----------- |
-| <a id="ciminutesnamespacemonthlyusageminutes"></a>`minutes` | [`Int`](#int) | Total number of units of compute used by all projects in the namespace. |
+| <a id="ciminutesnamespacemonthlyusageminutes"></a>`minutes` | [`Int`](#int) | Total number of compute 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) | Compute usage data for projects in the namespace. (see [Connections](#connections)) |
@@ -13052,7 +13227,7 @@ CI/CD variables given to a manual job.
| Name | Type | Description |
| ---- | ---- | ----------- |
-| <a id="ciminutesprojectmonthlyusageminutes"></a>`minutes` | [`Int`](#int) | Number of units of compute used by the project in the month. |
+| <a id="ciminutesprojectmonthlyusageminutes"></a>`minutes` | [`Int`](#int) | Number of compute minutes used by the project in the month. |
| <a id="ciminutesprojectmonthlyusagename"></a>`name` **{warning-solid}** | [`String`](#string) | **Deprecated** in 15.6. Use `project.name`. |
| <a id="ciminutesprojectmonthlyusageproject"></a>`project` | [`Project`](#project) | Project having the recorded usage. |
| <a id="ciminutesprojectmonthlyusagesharedrunnersduration"></a>`sharedRunnersDuration` | [`Int`](#int) | Total duration (in seconds) of shared runners use by the project for the month. |
@@ -13065,6 +13240,7 @@ CI/CD variables for a project.
| Name | Type | Description |
| ---- | ---- | ----------- |
+| <a id="ciprojectvariabledescription"></a>`description` | [`String`](#string) | Description of the variable. |
| <a id="ciprojectvariableenvironmentscope"></a>`environmentScope` | [`String`](#string) | Scope defining the environments that can use the variable. |
| <a id="ciprojectvariableid"></a>`id` | [`ID!`](#id) | ID of the variable. |
| <a id="ciprojectvariablekey"></a>`key` | [`String`](#string) | Name of the variable. |
@@ -13083,7 +13259,7 @@ CI/CD variables for a project.
| <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="cirunnerarchitecturename"></a>`architectureName` **{warning-solid}** | [`String`](#string) | **Deprecated** in 16.2. Use field in `manager` object instead. |
| <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="cirunnercreatedby"></a>`createdBy` | [`UserCore`](#usercore) | User that created this runner. |
@@ -13091,11 +13267,10 @@ CI/CD variables for a project.
| <a id="cirunnereditadminurl"></a>`editAdminUrl` | [`String`](#string) | Admin form URL of the runner. Only available for administrators. |
| <a id="cirunnerephemeralauthenticationtoken"></a>`ephemeralAuthenticationToken` **{warning-solid}** | [`String`](#string) | **Introduced** in 15.9. This feature is an Experiment. It can be changed or removed at any time. Ephemeral authentication token used for runner manager registration. Only available for the creator of the runner for a limited time during registration. |
| <a id="cirunnerephemeralregisterurl"></a>`ephemeralRegisterUrl` **{warning-solid}** | [`String`](#string) | **Introduced** in 15.11. This feature is an Experiment. It can be changed or removed at any time. URL of the registration page of the runner manager. Only available for the creator of the runner for a limited time during registration. |
-| <a id="cirunnerexecutorname"></a>`executorName` | [`String`](#string) | Executor last advertised by the runner. |
+| <a id="cirunnerexecutorname"></a>`executorName` **{warning-solid}** | [`String`](#string) | **Deprecated** in 16.2. Use field in `manager` object instead. |
| <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="cirunneripaddress"></a>`ipAddress` **{warning-solid}** | [`String`](#string) | **Deprecated** in 16.2. Use field in `manager` object instead. |
| <a id="cirunnerjobexecutionstatus"></a>`jobExecutionStatus` **{warning-solid}** | [`CiRunnerJobExecutionStatus`](#cirunnerjobexecutionstatus) | **Introduced** in 15.7. This feature is an Experiment. It can be changed or removed at any time. Job execution status of the runner. |
| <a id="cirunnerlocked"></a>`locked` | [`Boolean`](#boolean) | Indicates the runner is locked. |
| <a id="cirunnermaintenancenote"></a>`maintenanceNote` | [`String`](#string) | Runner's maintenance notes. |
@@ -13104,12 +13279,12 @@ CI/CD variables for a project.
| <a id="cirunnermaximumtimeout"></a>`maximumTimeout` | [`Int`](#int) | Maximum timeout (in seconds) for jobs processed by the runner. |
| <a id="cirunnerownerproject"></a>`ownerProject` | [`Project`](#project) | Project that owns the runner. For project runners only. |
| <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="cirunnerplatformname"></a>`platformName` **{warning-solid}** | [`String`](#string) | **Deprecated** in 16.2. Use field in `manager` object instead. |
| <a id="cirunnerprivateprojectsminutescostfactor"></a>`privateProjectsMinutesCostFactor` | [`Float`](#float) | Private projects' "compute cost factor" associated with the runner (GitLab.com only). |
| <a id="cirunnerprojectcount"></a>`projectCount` | [`Int`](#int) | Number of projects that the runner is associated with. |
| <a id="cirunnerpublicprojectsminutescostfactor"></a>`publicProjectsMinutesCostFactor` | [`Float`](#float) | Public projects' "compute cost factor" associated with the runner (GitLab.com only). |
| <a id="cirunnerregisteradminurl"></a>`registerAdminUrl` | [`String`](#string) | URL of the temporary registration page of the runner. Only available before the runner is registered. Only available for administrators. |
-| <a id="cirunnerrevision"></a>`revision` | [`String`](#string) | Revision of the runner. |
+| <a id="cirunnerrevision"></a>`revision` **{warning-solid}** | [`String`](#string) | **Deprecated** in 16.2. Use field in `manager` object instead. |
| <a id="cirunnerrununtagged"></a>`runUntagged` | [`Boolean!`](#boolean) | Indicates the runner is able to run untagged jobs. |
| <a id="cirunnerrunnertype"></a>`runnerType` | [`CiRunnerType!`](#cirunnertype) | Type of the runner. |
| <a id="cirunnershortsha"></a>`shortSha` | [`String`](#string) | First eight characters of the runner's token used to authenticate new job requests. Used as the runner's unique ID. |
@@ -13117,10 +13292,22 @@ CI/CD variables for a project.
| <a id="cirunnertokenexpiresat"></a>`tokenExpiresAt` | [`Time`](#time) | Runner token expiration time. |
| <a id="cirunnerupgradestatus"></a>`upgradeStatus` **{warning-solid}** | [`CiRunnerUpgradeStatus`](#cirunnerupgradestatus) | **Introduced** in 14.10. This feature is an Experiment. It can be changed or removed at any time. Availability of upgrades for the runner. |
| <a id="cirunneruserpermissions"></a>`userPermissions` | [`RunnerPermissions!`](#runnerpermissions) | Permissions for the current user on the resource. |
-| <a id="cirunnerversion"></a>`version` | [`String`](#string) | Version of the runner. |
+| <a id="cirunnerversion"></a>`version` **{warning-solid}** | [`String`](#string) | **Deprecated** in 16.2. Use field in `manager` object instead. |
#### Fields with arguments
+##### `CiRunner.jobCount`
+
+Number of jobs processed by the runner (limited to 1000, plus one to indicate that more items exist).
+
+Returns [`Int`](#int).
+
+###### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="cirunnerjobcountstatuses"></a>`statuses` **{warning-solid}** | [`[CiJobStatus!]`](#cijobstatus) | **Introduced** in 16.2. This feature is an Experiment. It can be changed or removed at any time. Filter jobs by status. |
+
##### `CiRunner.jobs`
Jobs assigned to the runner. This field can only be resolved for one runner in any single request.
@@ -13509,6 +13696,21 @@ Represents a ComplianceFramework associated with a Project.
| <a id="complianceframeworkname"></a>`name` | [`String!`](#string) | Name of the compliance framework. |
| <a id="complianceframeworkpipelineconfigurationfullpath"></a>`pipelineConfigurationFullPath` | [`String`](#string) | Full path of the compliance pipeline configuration stored in a project repository, such as `.gitlab/.compliance-gitlab-ci.yml@compliance/hipaa` **(ULTIMATE)**. |
+### `ComplianceStandardsAdherence`
+
+Compliance standards adherence for a project.
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="compliancestandardsadherencecheckname"></a>`checkName` | [`ComplianceStandardsAdherenceCheckName!`](#compliancestandardsadherencecheckname) | Name of the check for the compliance standard. |
+| <a id="compliancestandardsadherenceid"></a>`id` | [`ID!`](#id) | Compliance standards adherence ID. |
+| <a id="compliancestandardsadherenceproject"></a>`project` | [`Project!`](#project) | Project adhering to the compliance standard. |
+| <a id="compliancestandardsadherencestandard"></a>`standard` | [`ComplianceStandardsAdherenceStandard!`](#compliancestandardsadherencestandard) | Name of the compliance standard. |
+| <a id="compliancestandardsadherencestatus"></a>`status` | [`ComplianceStandardsAdherenceStatus!`](#compliancestandardsadherencestatus) | Status of the compliance standards adherence. |
+| <a id="compliancestandardsadherenceupdatedat"></a>`updatedAt` | [`Time!`](#time) | Timestamp when the adherence was updated. |
+
### `ComplianceViolation`
Compliance violation associated with a merged merge request.
@@ -14696,6 +14898,7 @@ Describes where code is deployed for a project.
| <a id="environmentenvironmenttype"></a>`environmentType` | [`String`](#string) | Folder name of the environment. |
| <a id="environmentexternalurl"></a>`externalUrl` | [`String`](#string) | External URL of the environment. |
| <a id="environmentid"></a>`id` | [`ID!`](#id) | ID of the environment. |
+| <a id="environmentkubernetesnamespace"></a>`kubernetesNamespace` | [`String`](#string) | Kubernetes namespace of the environment. |
| <a id="environmentlatestopenedmostseverealert"></a>`latestOpenedMostSevereAlert` | [`AlertManagementAlert`](#alertmanagementalert) | Most severe open alert for the environment. If multiple alerts have equal severity, the most recent is returned. |
| <a id="environmentname"></a>`name` | [`String!`](#string) | Human-readable name of the environment. |
| <a id="environmentpath"></a>`path` | [`String!`](#string) | Path to the environment. |
@@ -14737,22 +14940,6 @@ Returns [`Deployment`](#deployment).
| ---- | ---- | ----------- |
| <a id="environmentlastdeploymentstatus"></a>`status` | [`DeploymentStatus!`](#deploymentstatus) | Status of the Deployment. |
-##### `Environment.metricsDashboard`
-
-Metrics dashboard schema for the environment.
-
-WARNING:
-**Deprecated** in 16.0.
-Returns no data. Underlying feature was removed in 16.0.
-
-Returns [`MetricsDashboard`](#metricsdashboard).
-
-###### Arguments
-
-| Name | Type | Description |
-| ---- | ---- | ----------- |
-| <a id="environmentmetricsdashboardpath"></a>`path` | [`String!`](#string) | Path to a file which defines a metrics dashboard eg: `"config/prometheus/common_metrics.yml"`. |
-
### `EnvironmentPermissions`
#### Fields
@@ -15251,6 +15438,15 @@ Representing an event.
| <a id="eventid"></a>`id` | [`ID!`](#id) | ID of the event. |
| <a id="eventupdatedat"></a>`updatedAt` | [`Time!`](#time) | When this event was updated. |
+### `ExplainVulnerabilityPrompt`
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="explainvulnerabilitypromptpromptwithcode"></a>`promptWithCode` | [`String`](#string) | AI text prompt generated using the vulnerability's information, including the vulnerable code. |
+| <a id="explainvulnerabilitypromptpromptwithoutcode"></a>`promptWithoutCode` | [`String`](#string) | AI text prompt generated using the vulnerability's information, excluding the vulnerable code. |
+
### `ExternalAuditEventDestination`
Represents an external resource to send audit events to.
@@ -15264,6 +15460,7 @@ Represents an external resource to send audit events to.
| <a id="externalauditeventdestinationgroup"></a>`group` | [`Group!`](#group) | Group the destination belongs to. |
| <a id="externalauditeventdestinationheaders"></a>`headers` | [`AuditEventStreamingHeaderConnection!`](#auditeventstreamingheaderconnection) | List of additional HTTP headers sent with each event. (see [Connections](#connections)) |
| <a id="externalauditeventdestinationid"></a>`id` | [`ID!`](#id) | ID of the destination. |
+| <a id="externalauditeventdestinationname"></a>`name` | [`String!`](#string) | Name of the external destination to send audit events to. |
| <a id="externalauditeventdestinationverificationtoken"></a>`verificationToken` | [`String!`](#string) | Verification token to validate source of event. |
### `ExternalIssue`
@@ -15611,6 +15808,29 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="geonodepipelineartifactregistriesreplicationstate"></a>`replicationState` | [`ReplicationStateEnum`](#replicationstateenum) | Filters registries by their replication state. |
| <a id="geonodepipelineartifactregistriesverificationstate"></a>`verificationState` | [`VerificationStateEnum`](#verificationstateenum) | Filters registries by their verification state. |
+##### `GeoNode.projectRepositoryRegistries`
+
+Find Project registries on this Geo node. Ignored if `geo_project_repository_replication` feature flag is disabled.
+
+WARNING:
+**Introduced** in 16.2.
+This feature is an Experiment. It can be changed or removed at any time.
+
+Returns [`ProjectRepositoryRegistryConnection`](#projectrepositoryregistryconnection).
+
+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="geonodeprojectrepositoryregistriesids"></a>`ids` | [`[ID!]`](#id) | Filters registries by their ID. |
+| <a id="geonodeprojectrepositoryregistrieskeyword"></a>`keyword` | [`String`](#string) | Filters registries by their attributes using a keyword. |
+| <a id="geonodeprojectrepositoryregistriesreplicationstate"></a>`replicationState` | [`ReplicationStateEnum`](#replicationstateenum) | Filters registries by their replication state. |
+| <a id="geonodeprojectrepositoryregistriesverificationstate"></a>`verificationState` | [`VerificationStateEnum`](#verificationstateenum) | Filters registries by their verification state. |
+
##### `GeoNode.projectWikiRepositoryRegistries`
Find Project Wiki Repository registries on this Geo node. Ignored if `geo_project_wiki_repository_replication` feature flag is disabled.
@@ -15736,13 +15956,14 @@ GPG signature for a signed commit.
| Name | Type | Description |
| ---- | ---- | ----------- |
-| <a id="groupactualrepositorysizelimit"></a>`actualRepositorySizeLimit` | [`Float`](#float) | Size limit for repositories in the namespace in bytes. |
+| <a id="groupactualrepositorysizelimit"></a>`actualRepositorySizeLimit` | [`Float`](#float) | Size limit for repositories in the namespace in bytes. This limit only applies to namespaces under Project limit enforcement. |
+| <a id="groupactualsizelimit"></a>`actualSizeLimit` | [`Float`](#float) | Actual storage size limit for the namespace in bytes. This limit is agnostic of enforcement type. |
| <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="groupcontainerrepositoriescount"></a>`containerRepositoriesCount` | [`Int!`](#int) | Number of container repositories in the group. |
-| <a id="groupcontainslockedprojects"></a>`containsLockedProjects` | [`Boolean!`](#boolean) | Includes at least one project where the repository size exceeds the limit. |
+| <a id="groupcontainslockedprojects"></a>`containsLockedProjects` | [`Boolean!`](#boolean) | Includes at least one project where the repository size exceeds the limit. This only applies to namespaces under Project limit enforcement. |
| <a id="groupcrossprojectpipelineavailable"></a>`crossProjectPipelineAvailable` | [`Boolean!`](#boolean) | Indicates if the cross_project_pipeline feature is available for the namespace. |
| <a id="groupcustomemoji"></a>`customEmoji` **{warning-solid}** | [`CustomEmojiConnection`](#customemojiconnection) | **Introduced** in 13.6. This feature is an Experiment. It can be changed or removed at any time. Custom emoji within this namespace. |
| <a id="groupdependencyproxyblobcount"></a>`dependencyProxyBlobCount` | [`Int!`](#int) | Number of dependency proxy blobs cached in the group. |
@@ -15778,19 +15999,19 @@ GPG signature for a signed commit.
| <a id="grouppath"></a>`path` | [`String!`](#string) | Path of the namespace. |
| <a id="groupprojectcreationlevel"></a>`projectCreationLevel` | [`String`](#string) | Permission level required to create projects in the group. |
| <a id="grouprecentissueboards"></a>`recentIssueBoards` | [`BoardConnection`](#boardconnection) | List of recently visited boards of the group. Maximum size is 4. (see [Connections](#connections)) |
-| <a id="grouprepositorysizeexcessprojectcount"></a>`repositorySizeExcessProjectCount` | [`Int!`](#int) | Number of projects in the root namespace where the repository size exceeds the limit. |
+| <a id="grouprepositorysizeexcessprojectcount"></a>`repositorySizeExcessProjectCount` | [`Int!`](#int) | Number of projects in the root namespace where the repository size exceeds the limit. This only applies to namespaces under Project limit enforcement. |
| <a id="grouprequestaccessenabled"></a>`requestAccessEnabled` | [`Boolean`](#boolean) | Indicates if users can request access to namespace. |
| <a id="grouprequiretwofactorauthentication"></a>`requireTwoFactorAuthentication` | [`Boolean`](#boolean) | Indicates if all users in this group are required to set up two-factor authentication. |
| <a id="grouprootstoragestatistics"></a>`rootStorageStatistics` | [`RootStorageStatistics`](#rootstoragestatistics) | Aggregated storage statistics of the namespace. Only available for root namespaces. |
| <a id="groupsharewithgrouplock"></a>`shareWithGroupLock` | [`Boolean`](#boolean) | Indicates if sharing a project with another group within this group is prevented. |
| <a id="groupsharedrunnerssetting"></a>`sharedRunnersSetting` | [`SharedRunnersSetting`](#sharedrunnerssetting) | Shared runners availability for the namespace and its descendants. |
| <a id="groupstats"></a>`stats` | [`GroupStats`](#groupstats) | Group statistics. |
-| <a id="groupstoragesizelimit"></a>`storageSizeLimit` | [`Float`](#float) | Total storage limit of the root namespace in bytes. |
+| <a id="groupstoragesizelimit"></a>`storageSizeLimit` | [`Float`](#float) | Storage limit included in the root namespace plan in bytes. This limit only applies to namespaces under Namespace limit enforcement. |
| <a id="groupsubgroupcreationlevel"></a>`subgroupCreationLevel` | [`String`](#string) | Permission level required to create subgroups within the group. |
| <a id="grouptemporarystorageincreaseendson"></a>`temporaryStorageIncreaseEndsOn` | [`Time`](#time) | Date until the temporary storage increase is active. |
| <a id="grouptimelogcategories"></a>`timelogCategories` **{warning-solid}** | [`TimeTrackingTimelogCategoryConnection`](#timetrackingtimelogcategoryconnection) | **Introduced** in 15.3. This feature is an Experiment. It can be changed or removed at any time. Timelog categories for the namespace. |
| <a id="grouptotalrepositorysize"></a>`totalRepositorySize` | [`Float`](#float) | Total repository size of all projects in the root namespace in bytes. |
-| <a id="grouptotalrepositorysizeexcess"></a>`totalRepositorySizeExcess` | [`Float`](#float) | Total excess repository size of all projects in the root namespace in bytes. |
+| <a id="grouptotalrepositorysizeexcess"></a>`totalRepositorySizeExcess` | [`Float`](#float) | Total excess repository size of all projects in the root namespace in bytes. This only applies to namespaces under Project limit enforcement. |
| <a id="grouptwofactorgraceperiod"></a>`twoFactorGracePeriod` | [`Int`](#int) | Time before two-factor authentication is enforced. |
| <a id="groupuserpermissions"></a>`userPermissions` | [`GroupPermissions!`](#grouppermissions) | Permissions for the current user on the resource. |
| <a id="groupvisibility"></a>`visibility` | [`String`](#string) | Visibility of the namespace. |
@@ -15819,6 +16040,18 @@ four standard [pagination arguments](#connection-pagination-arguments):
| ---- | ---- | ----------- |
| <a id="groupachievementsids"></a>`ids` | [`[AchievementsAchievementID!]`](#achievementsachievementid) | Filter achievements by IDs. |
+##### `Group.addOnPurchase`
+
+AddOnPurchase associated with the namespace.
+
+Returns [`AddOnPurchase`](#addonpurchase).
+
+###### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="groupaddonpurchaseaddonname"></a>`addOnName` | [`String!`](#string) | AddOn name. |
+
##### `Group.billableMembersCount`
Number of billable users in the group.
@@ -16171,6 +16404,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="groupissuesassigneeid"></a>`assigneeId` | [`String`](#string) | ID of a user assigned to the issues. Wildcard values "NONE" and "ANY" are supported. |
| <a id="groupissuesassigneeusername"></a>`assigneeUsername` **{warning-solid}** | [`String`](#string) | **Deprecated** in 13.11. Use `assigneeUsernames`. |
| <a id="groupissuesassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the issue. |
+| <a id="groupissuesassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee wildcard. Incompatible with assigneeUsername and assigneeUsernames. |
| <a id="groupissuesauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author of the issue. |
| <a id="groupissuesclosedafter"></a>`closedAfter` | [`Time`](#time) | Issues closed after this date. |
| <a id="groupissuesclosedbefore"></a>`closedBefore` | [`Time`](#time) | Issues closed before this date. |
@@ -16180,6 +16414,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <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="groupissuesepicwildcardid"></a>`epicWildcardId` | [`EpicWildcardId`](#epicwildcardid) | Filter by epic ID wildcard. Incompatible with epicId. |
| <a id="groupissueshealthstatus"></a>`healthStatus` **{warning-solid}** | [`HealthStatus`](#healthstatus) | **Deprecated** in 15.4. Use `healthStatusFilter`. |
| <a id="groupissueshealthstatusfilter"></a>`healthStatusFilter` | [`HealthStatusFilter`](#healthstatusfilter) | Health status of the issue, "none" and "any" values are supported. |
| <a id="groupissuesiid"></a>`iid` | [`String`](#string) | IID of the issue. For example, "1". |
@@ -16188,7 +16423,9 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="groupissuesincludearchived"></a>`includeArchived` | [`Boolean`](#boolean) | Return issues from archived projects. |
| <a id="groupissuesincludesubepics"></a>`includeSubepics` | [`Boolean`](#boolean) | Whether to include subepics when filtering issues by epicId. |
| <a id="groupissuesincludesubgroups"></a>`includeSubgroups` | [`Boolean`](#boolean) | Include issues belonging to subgroups. |
+| <a id="groupissuesiterationcadenceid"></a>`iterationCadenceId` | [`[IterationsCadenceID!]`](#iterationscadenceid) | Filter by a list of iteration cadence IDs. |
| <a id="groupissuesiterationid"></a>`iterationId` | [`[ID]`](#id) | List of iteration Global IDs applied to the issue. |
+| <a id="groupissuesiterationtitle"></a>`iterationTitle` | [`String`](#string) | Filter by iteration title. |
| <a id="groupissuesiterationwildcardid"></a>`iterationWildcardId` | [`IterationWildcardId`](#iterationwildcardid) | Filter by iteration ID wildcard. |
| <a id="groupissueslabelname"></a>`labelName` | [`[String]`](#string) | Labels applied to this issue. |
| <a id="groupissuesmilestonetitle"></a>`milestoneTitle` | [`[String]`](#string) | Milestone applied to this issue. |
@@ -16203,6 +16440,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="groupissuesupdatedafter"></a>`updatedAfter` | [`Time`](#time) | Issues updated after this date. |
| <a id="groupissuesupdatedbefore"></a>`updatedBefore` | [`Time`](#time) | Issues updated before this date. |
| <a id="groupissuesweight"></a>`weight` | [`String`](#string) | Weight applied to the issue, "none" and "any" values are supported. |
+| <a id="groupissuesweightwildcardid"></a>`weightWildcardId` | [`WeightWildcardId`](#weightwildcardid) | Filter by weight ID wildcard. Incompatible with weight. |
##### `Group.iterationCadences`
@@ -16409,6 +16647,22 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="grouppackagessort"></a>`sort` | [`PackageGroupSort`](#packagegroupsort) | Sort packages by this criteria. |
| <a id="grouppackagesstatus"></a>`status` | [`PackageStatus`](#packagestatus) | Filter a package by status. |
+##### `Group.projectComplianceStandardsAdherence`
+
+Compliance standards adherence for the projects in a group and its subgroups.
+
+Returns [`ComplianceStandardsAdherenceConnection`](#compliancestandardsadherenceconnection).
+
+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="groupprojectcompliancestandardsadherencefilters"></a>`filters` | [`ComplianceStandardsAdherenceInput`](#compliancestandardsadherenceinput) | Filters applied when retrieving compliance standards adherence. |
+
##### `Group.projects`
Projects within this namespace.
@@ -16429,6 +16683,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="groupprojectsids"></a>`ids` | [`[ID!]`](#id) | Filter projects by IDs. |
| <a id="groupprojectsincludesubgroups"></a>`includeSubgroups` | [`Boolean`](#boolean) | Include also subgroup projects. |
| <a id="groupprojectsnotaimedfordeletion"></a>`notAimedForDeletion` | [`Boolean`](#boolean) | Include projects that are not aimed for deletion. |
+| <a id="groupprojectssbomcomponentid"></a>`sbomComponentId` | [`ID`](#id) | Return only the projects related to the specified SBOM component. |
| <a id="groupprojectssearch"></a>`search` | [`String`](#string) | Search project with most similar names or paths. |
| <a id="groupprojectssort"></a>`sort` | [`NamespaceProjectSort`](#namespaceprojectsort) | Sort projects by this criteria. |
| <a id="groupprojectswithissuesenabled"></a>`withIssuesEnabled` | [`Boolean`](#boolean) | Return only projects with issues enabled. |
@@ -16830,6 +17085,16 @@ Helm file metadata.
| <a id="helmfilemetadatametadata"></a>`metadata` | [`PackageHelmMetadataType!`](#packagehelmmetadatatype) | Metadata of the Helm chart. |
| <a id="helmfilemetadataupdatedat"></a>`updatedAt` | [`Time!`](#time) | Date of most recent update. |
+### `Ide`
+
+IDE settings and feature flags.
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="idecodesuggestionsenabled"></a>`codeSuggestionsEnabled` | [`Boolean!`](#boolean) | Indicates whether AI assisted code suggestions are enabled. |
+
### `IncidentManagementOncallRotation`
Describes an incident management on-call rotation.
@@ -16934,8 +17199,10 @@ Represents an external resource to send instance audit events to.
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="instanceexternalauditeventdestinationdestinationurl"></a>`destinationUrl` | [`String!`](#string) | External destination to send audit events to. |
+| <a id="instanceexternalauditeventdestinationeventtypefilters"></a>`eventTypeFilters` | [`[String!]!`](#string) | List of event type filters added for streaming. |
| <a id="instanceexternalauditeventdestinationheaders"></a>`headers` | [`AuditEventsStreamingInstanceHeaderConnection!`](#auditeventsstreaminginstanceheaderconnection) | List of additional HTTP headers sent with each event. (see [Connections](#connections)) |
| <a id="instanceexternalauditeventdestinationid"></a>`id` | [`ID!`](#id) | ID of the destination. |
+| <a id="instanceexternalauditeventdestinationname"></a>`name` | [`String!`](#string) | Name of the external destination to send audit events to. |
| <a id="instanceexternalauditeventdestinationverificationtoken"></a>`verificationToken` | [`String!`](#string) | Verification token to validate source of event. |
### `InstanceSecurityDashboard`
@@ -17518,11 +17785,12 @@ Defines which user roles, users, or groups can merge into a protected branch.
| <a id="mergerequestmergecommitsha"></a>`mergeCommitSha` | [`String`](#string) | SHA of the merge request commit (set once merged). |
| <a id="mergerequestmergeerror"></a>`mergeError` | [`String`](#string) | Error message due to a merge error. |
| <a id="mergerequestmergeongoing"></a>`mergeOngoing` | [`Boolean!`](#boolean) | Indicates if a merge is currently occurring. |
+| <a id="mergerequestmergerequestdiffs"></a>`mergeRequestDiffs` **{warning-solid}** | [`MergeRequestDiffConnection`](#mergerequestdiffconnection) | **Introduced** in 16.2. This feature is an Experiment. It can be changed or removed at any time. Diff versions of a merge request. |
| <a id="mergerequestmergestatus"></a>`mergeStatus` **{warning-solid}** | [`String`](#string) | **Deprecated** in 14.0. This was renamed. Use: [`MergeRequest.mergeStatusEnum`](#mergerequestmergestatusenum). |
| <a id="mergerequestmergestatusenum"></a>`mergeStatusEnum` | [`MergeStatus`](#mergestatus) | Merge status of the merge request. |
| <a id="mergerequestmergetrainscount"></a>`mergeTrainsCount` | [`Int`](#int) | Number of merge requests in the merge train. |
-| <a id="mergerequestmergeuser"></a>`mergeUser` | [`UserCore`](#usercore) | User who merged this merge request or set it to merge when pipeline succeeds. |
-| <a id="mergerequestmergewhenpipelinesucceeds"></a>`mergeWhenPipelineSucceeds` | [`Boolean`](#boolean) | Indicates if the merge has been set to be merged when its pipeline succeeds (MWPS). |
+| <a id="mergerequestmergeuser"></a>`mergeUser` | [`UserCore`](#usercore) | User who merged this merge request or set it to auto-merge. |
+| <a id="mergerequestmergewhenpipelinesucceeds"></a>`mergeWhenPipelineSucceeds` | [`Boolean`](#boolean) | Indicates if the merge has been set to auto-merge. |
| <a id="mergerequestmergeable"></a>`mergeable` | [`Boolean!`](#boolean) | Indicates if the merge request is mergeable. |
| <a id="mergerequestmergeablediscussionsstate"></a>`mergeableDiscussionsState` | [`Boolean`](#boolean) | Indicates if all discussions in the merge request have been resolved, allowing the merge request to be merged. |
| <a id="mergerequestmergedat"></a>`mergedAt` | [`Time`](#time) | Timestamp of when the merge request was merged, null if not merged. |
@@ -17681,6 +17949,7 @@ A user assigned to a merge request.
| <a id="mergerequestassigneegroupcount"></a>`groupCount` | [`Int`](#int) | Group count for the user. |
| <a id="mergerequestassigneegroupmemberships"></a>`groupMemberships` | [`GroupMemberConnection`](#groupmemberconnection) | Group memberships of the user. (see [Connections](#connections)) |
| <a id="mergerequestassigneeid"></a>`id` | [`ID!`](#id) | ID of the user. |
+| <a id="mergerequestassigneeide"></a>`ide` | [`Ide`](#ide) | IDE settings. |
| <a id="mergerequestassigneejobtitle"></a>`jobTitle` | [`String`](#string) | Job title of the user. |
| <a id="mergerequestassigneelinkedin"></a>`linkedin` | [`String`](#string) | LinkedIn profile name of the user. |
| <a id="mergerequestassigneelocation"></a>`location` | [`String`](#string) | Location of the user. |
@@ -17692,6 +17961,7 @@ A user assigned to a merge request.
| <a id="mergerequestassigneepreferencesgitpodpath"></a>`preferencesGitpodPath` | [`String`](#string) | Web path to the Gitpod section within user preferences. |
| <a id="mergerequestassigneeprofileenablegitpodpath"></a>`profileEnableGitpodPath` | [`String`](#string) | Web path to enable Gitpod for the user. |
| <a id="mergerequestassigneeprojectmemberships"></a>`projectMemberships` | [`ProjectMemberConnection`](#projectmemberconnection) | Project memberships of the user. (see [Connections](#connections)) |
+| <a id="mergerequestassigneepronouns"></a>`pronouns` | [`String`](#string) | Pronouns of the user. |
| <a id="mergerequestassigneepublicemail"></a>`publicEmail` | [`String`](#string) | User's public email. |
| <a id="mergerequestassigneesavedreplies"></a>`savedReplies` | [`SavedReplyConnection`](#savedreplyconnection) | Saved replies authored by the user. Will not return saved replies if `saved_replies` feature flag is disabled. (see [Connections](#connections)) |
| <a id="mergerequestassigneestate"></a>`state` | [`UserState!`](#userstate) | State of the user. |
@@ -17724,6 +17994,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="mergerequestassigneeassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after this timestamp. |
| <a id="mergerequestassigneeassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before this timestamp. |
| <a id="mergerequestassigneeassignedmergerequestsdraft"></a>`draft` | [`Boolean`](#boolean) | Limit result to draft merge requests. |
+| <a id="mergerequestassigneeassignedmergerequestsgroupid"></a>`groupId` | [`GroupID`](#groupid) | The global ID of the group the authored merge requests should be in. Merge requests in subgroups are included. |
| <a id="mergerequestassigneeassignedmergerequestsiids"></a>`iids` | [`[String!]`](#string) | Array of IIDs of merge requests, for example `[1, 2]`. |
| <a id="mergerequestassigneeassignedmergerequestslabels"></a>`labels` | [`[String!]`](#string) | Array of label names. All resolved merge requests will have all of these labels. |
| <a id="mergerequestassigneeassignedmergerequestsmergedafter"></a>`mergedAfter` | [`Time`](#time) | Merge requests merged after this date. |
@@ -17759,6 +18030,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="mergerequestassigneeauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after this timestamp. |
| <a id="mergerequestassigneeauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before this timestamp. |
| <a id="mergerequestassigneeauthoredmergerequestsdraft"></a>`draft` | [`Boolean`](#boolean) | Limit result to draft merge requests. |
+| <a id="mergerequestassigneeauthoredmergerequestsgroupid"></a>`groupId` | [`GroupID`](#groupid) | The global ID of the group the authored merge requests should be in. Merge requests in subgroups are included. |
| <a id="mergerequestassigneeauthoredmergerequestsiids"></a>`iids` | [`[String!]`](#string) | Array of IIDs of merge requests, for example `[1, 2]`. |
| <a id="mergerequestassigneeauthoredmergerequestslabels"></a>`labels` | [`[String!]`](#string) | Array of label names. All resolved merge requests will have all of these labels. |
| <a id="mergerequestassigneeauthoredmergerequestsmergedafter"></a>`mergedAfter` | [`Time`](#time) | Merge requests merged after this date. |
@@ -17812,6 +18084,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="mergerequestassigneereviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after this timestamp. |
| <a id="mergerequestassigneereviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before this timestamp. |
| <a id="mergerequestassigneereviewrequestedmergerequestsdraft"></a>`draft` | [`Boolean`](#boolean) | Limit result to draft merge requests. |
+| <a id="mergerequestassigneereviewrequestedmergerequestsgroupid"></a>`groupId` | [`GroupID`](#groupid) | The global ID of the group the authored merge requests should be in. Merge requests in subgroups are included. |
| <a id="mergerequestassigneereviewrequestedmergerequestsiids"></a>`iids` | [`[String!]`](#string) | Array of IIDs of merge requests, for example `[1, 2]`. |
| <a id="mergerequestassigneereviewrequestedmergerequestslabels"></a>`labels` | [`[String!]`](#string) | Array of label names. All resolved merge requests will have all of these labels. |
| <a id="mergerequestassigneereviewrequestedmergerequestsmergedafter"></a>`mergedAfter` | [`Time`](#time) | Merge requests merged after this date. |
@@ -17932,6 +18205,8 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="mergerequestassigneeworkspacesids"></a>`ids` | [`[RemoteDevelopmentWorkspaceID!]`](#remotedevelopmentworkspaceid) | Array of global workspace IDs. For example, `["gid://gitlab/RemoteDevelopment::Workspace/1"]`. |
+| <a id="mergerequestassigneeworkspacesincludeactualstates"></a>`includeActualStates` | [`[String!]`](#string) | Includes all workspaces that match any of the actual states. |
+| <a id="mergerequestassigneeworkspacesprojectids"></a>`projectIds` | [`[ProjectID!]`](#projectid) | Filter workspaces by project id. |
### `MergeRequestAuthor`
@@ -17954,6 +18229,7 @@ The author of the merge request.
| <a id="mergerequestauthorgroupcount"></a>`groupCount` | [`Int`](#int) | Group count for the user. |
| <a id="mergerequestauthorgroupmemberships"></a>`groupMemberships` | [`GroupMemberConnection`](#groupmemberconnection) | Group memberships of the user. (see [Connections](#connections)) |
| <a id="mergerequestauthorid"></a>`id` | [`ID!`](#id) | ID of the user. |
+| <a id="mergerequestauthoride"></a>`ide` | [`Ide`](#ide) | IDE settings. |
| <a id="mergerequestauthorjobtitle"></a>`jobTitle` | [`String`](#string) | Job title of the user. |
| <a id="mergerequestauthorlinkedin"></a>`linkedin` | [`String`](#string) | LinkedIn profile name of the user. |
| <a id="mergerequestauthorlocation"></a>`location` | [`String`](#string) | Location of the user. |
@@ -17965,6 +18241,7 @@ The author of the merge request.
| <a id="mergerequestauthorpreferencesgitpodpath"></a>`preferencesGitpodPath` | [`String`](#string) | Web path to the Gitpod section within user preferences. |
| <a id="mergerequestauthorprofileenablegitpodpath"></a>`profileEnableGitpodPath` | [`String`](#string) | Web path to enable Gitpod for the user. |
| <a id="mergerequestauthorprojectmemberships"></a>`projectMemberships` | [`ProjectMemberConnection`](#projectmemberconnection) | Project memberships of the user. (see [Connections](#connections)) |
+| <a id="mergerequestauthorpronouns"></a>`pronouns` | [`String`](#string) | Pronouns of the user. |
| <a id="mergerequestauthorpublicemail"></a>`publicEmail` | [`String`](#string) | User's public email. |
| <a id="mergerequestauthorsavedreplies"></a>`savedReplies` | [`SavedReplyConnection`](#savedreplyconnection) | Saved replies authored by the user. Will not return saved replies if `saved_replies` feature flag is disabled. (see [Connections](#connections)) |
| <a id="mergerequestauthorstate"></a>`state` | [`UserState!`](#userstate) | State of the user. |
@@ -17997,6 +18274,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="mergerequestauthorassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after this timestamp. |
| <a id="mergerequestauthorassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before this timestamp. |
| <a id="mergerequestauthorassignedmergerequestsdraft"></a>`draft` | [`Boolean`](#boolean) | Limit result to draft merge requests. |
+| <a id="mergerequestauthorassignedmergerequestsgroupid"></a>`groupId` | [`GroupID`](#groupid) | The global ID of the group the authored merge requests should be in. Merge requests in subgroups are included. |
| <a id="mergerequestauthorassignedmergerequestsiids"></a>`iids` | [`[String!]`](#string) | Array of IIDs of merge requests, for example `[1, 2]`. |
| <a id="mergerequestauthorassignedmergerequestslabels"></a>`labels` | [`[String!]`](#string) | Array of label names. All resolved merge requests will have all of these labels. |
| <a id="mergerequestauthorassignedmergerequestsmergedafter"></a>`mergedAfter` | [`Time`](#time) | Merge requests merged after this date. |
@@ -18032,6 +18310,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="mergerequestauthorauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after this timestamp. |
| <a id="mergerequestauthorauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before this timestamp. |
| <a id="mergerequestauthorauthoredmergerequestsdraft"></a>`draft` | [`Boolean`](#boolean) | Limit result to draft merge requests. |
+| <a id="mergerequestauthorauthoredmergerequestsgroupid"></a>`groupId` | [`GroupID`](#groupid) | The global ID of the group the authored merge requests should be in. Merge requests in subgroups are included. |
| <a id="mergerequestauthorauthoredmergerequestsiids"></a>`iids` | [`[String!]`](#string) | Array of IIDs of merge requests, for example `[1, 2]`. |
| <a id="mergerequestauthorauthoredmergerequestslabels"></a>`labels` | [`[String!]`](#string) | Array of label names. All resolved merge requests will have all of these labels. |
| <a id="mergerequestauthorauthoredmergerequestsmergedafter"></a>`mergedAfter` | [`Time`](#time) | Merge requests merged after this date. |
@@ -18085,6 +18364,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="mergerequestauthorreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after this timestamp. |
| <a id="mergerequestauthorreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before this timestamp. |
| <a id="mergerequestauthorreviewrequestedmergerequestsdraft"></a>`draft` | [`Boolean`](#boolean) | Limit result to draft merge requests. |
+| <a id="mergerequestauthorreviewrequestedmergerequestsgroupid"></a>`groupId` | [`GroupID`](#groupid) | The global ID of the group the authored merge requests should be in. Merge requests in subgroups are included. |
| <a id="mergerequestauthorreviewrequestedmergerequestsiids"></a>`iids` | [`[String!]`](#string) | Array of IIDs of merge requests, for example `[1, 2]`. |
| <a id="mergerequestauthorreviewrequestedmergerequestslabels"></a>`labels` | [`[String!]`](#string) | Array of label names. All resolved merge requests will have all of these labels. |
| <a id="mergerequestauthorreviewrequestedmergerequestsmergedafter"></a>`mergedAfter` | [`Time`](#time) | Merge requests merged after this date. |
@@ -18205,6 +18485,21 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="mergerequestauthorworkspacesids"></a>`ids` | [`[RemoteDevelopmentWorkspaceID!]`](#remotedevelopmentworkspaceid) | Array of global workspace IDs. For example, `["gid://gitlab/RemoteDevelopment::Workspace/1"]`. |
+| <a id="mergerequestauthorworkspacesincludeactualstates"></a>`includeActualStates` | [`[String!]`](#string) | Includes all workspaces that match any of the actual states. |
+| <a id="mergerequestauthorworkspacesprojectids"></a>`projectIds` | [`[ProjectID!]`](#projectid) | Filter workspaces by project id. |
+
+### `MergeRequestDiff`
+
+A diff version of a merge request.
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mergerequestdiffcreatedat"></a>`createdAt` | [`Time!`](#time) | Timestamp of when the diff was created. |
+| <a id="mergerequestdiffdiffllmsummary"></a>`diffLlmSummary` | [`MergeRequestDiffLlmSummary`](#mergerequestdiffllmsummary) | Diff summary generated by AI. |
+| <a id="mergerequestdiffreviewllmsummaries"></a>`reviewLlmSummaries` | [`MergeRequestReviewLlmSummaryConnection`](#mergerequestreviewllmsummaryconnection) | Review summaries generated by AI. (see [Connections](#connections)) |
+| <a id="mergerequestdiffupdatedat"></a>`updatedAt` | [`Time!`](#time) | Timestamp of when the diff was updated. |
### `MergeRequestDiffLlmSummary`
@@ -18261,6 +18556,7 @@ A user participating in a merge request.
| <a id="mergerequestparticipantgroupcount"></a>`groupCount` | [`Int`](#int) | Group count for the user. |
| <a id="mergerequestparticipantgroupmemberships"></a>`groupMemberships` | [`GroupMemberConnection`](#groupmemberconnection) | Group memberships of the user. (see [Connections](#connections)) |
| <a id="mergerequestparticipantid"></a>`id` | [`ID!`](#id) | ID of the user. |
+| <a id="mergerequestparticipantide"></a>`ide` | [`Ide`](#ide) | IDE settings. |
| <a id="mergerequestparticipantjobtitle"></a>`jobTitle` | [`String`](#string) | Job title of the user. |
| <a id="mergerequestparticipantlinkedin"></a>`linkedin` | [`String`](#string) | LinkedIn profile name of the user. |
| <a id="mergerequestparticipantlocation"></a>`location` | [`String`](#string) | Location of the user. |
@@ -18272,6 +18568,7 @@ A user participating in a merge request.
| <a id="mergerequestparticipantpreferencesgitpodpath"></a>`preferencesGitpodPath` | [`String`](#string) | Web path to the Gitpod section within user preferences. |
| <a id="mergerequestparticipantprofileenablegitpodpath"></a>`profileEnableGitpodPath` | [`String`](#string) | Web path to enable Gitpod for the user. |
| <a id="mergerequestparticipantprojectmemberships"></a>`projectMemberships` | [`ProjectMemberConnection`](#projectmemberconnection) | Project memberships of the user. (see [Connections](#connections)) |
+| <a id="mergerequestparticipantpronouns"></a>`pronouns` | [`String`](#string) | Pronouns of the user. |
| <a id="mergerequestparticipantpublicemail"></a>`publicEmail` | [`String`](#string) | User's public email. |
| <a id="mergerequestparticipantsavedreplies"></a>`savedReplies` | [`SavedReplyConnection`](#savedreplyconnection) | Saved replies authored by the user. Will not return saved replies if `saved_replies` feature flag is disabled. (see [Connections](#connections)) |
| <a id="mergerequestparticipantstate"></a>`state` | [`UserState!`](#userstate) | State of the user. |
@@ -18304,6 +18601,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="mergerequestparticipantassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after this timestamp. |
| <a id="mergerequestparticipantassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before this timestamp. |
| <a id="mergerequestparticipantassignedmergerequestsdraft"></a>`draft` | [`Boolean`](#boolean) | Limit result to draft merge requests. |
+| <a id="mergerequestparticipantassignedmergerequestsgroupid"></a>`groupId` | [`GroupID`](#groupid) | The global ID of the group the authored merge requests should be in. Merge requests in subgroups are included. |
| <a id="mergerequestparticipantassignedmergerequestsiids"></a>`iids` | [`[String!]`](#string) | Array of IIDs of merge requests, for example `[1, 2]`. |
| <a id="mergerequestparticipantassignedmergerequestslabels"></a>`labels` | [`[String!]`](#string) | Array of label names. All resolved merge requests will have all of these labels. |
| <a id="mergerequestparticipantassignedmergerequestsmergedafter"></a>`mergedAfter` | [`Time`](#time) | Merge requests merged after this date. |
@@ -18339,6 +18637,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="mergerequestparticipantauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after this timestamp. |
| <a id="mergerequestparticipantauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before this timestamp. |
| <a id="mergerequestparticipantauthoredmergerequestsdraft"></a>`draft` | [`Boolean`](#boolean) | Limit result to draft merge requests. |
+| <a id="mergerequestparticipantauthoredmergerequestsgroupid"></a>`groupId` | [`GroupID`](#groupid) | The global ID of the group the authored merge requests should be in. Merge requests in subgroups are included. |
| <a id="mergerequestparticipantauthoredmergerequestsiids"></a>`iids` | [`[String!]`](#string) | Array of IIDs of merge requests, for example `[1, 2]`. |
| <a id="mergerequestparticipantauthoredmergerequestslabels"></a>`labels` | [`[String!]`](#string) | Array of label names. All resolved merge requests will have all of these labels. |
| <a id="mergerequestparticipantauthoredmergerequestsmergedafter"></a>`mergedAfter` | [`Time`](#time) | Merge requests merged after this date. |
@@ -18392,6 +18691,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="mergerequestparticipantreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after this timestamp. |
| <a id="mergerequestparticipantreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before this timestamp. |
| <a id="mergerequestparticipantreviewrequestedmergerequestsdraft"></a>`draft` | [`Boolean`](#boolean) | Limit result to draft merge requests. |
+| <a id="mergerequestparticipantreviewrequestedmergerequestsgroupid"></a>`groupId` | [`GroupID`](#groupid) | The global ID of the group the authored merge requests should be in. Merge requests in subgroups are included. |
| <a id="mergerequestparticipantreviewrequestedmergerequestsiids"></a>`iids` | [`[String!]`](#string) | Array of IIDs of merge requests, for example `[1, 2]`. |
| <a id="mergerequestparticipantreviewrequestedmergerequestslabels"></a>`labels` | [`[String!]`](#string) | Array of label names. All resolved merge requests will have all of these labels. |
| <a id="mergerequestparticipantreviewrequestedmergerequestsmergedafter"></a>`mergedAfter` | [`Time`](#time) | Merge requests merged after this date. |
@@ -18512,6 +18812,8 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="mergerequestparticipantworkspacesids"></a>`ids` | [`[RemoteDevelopmentWorkspaceID!]`](#remotedevelopmentworkspaceid) | Array of global workspace IDs. For example, `["gid://gitlab/RemoteDevelopment::Workspace/1"]`. |
+| <a id="mergerequestparticipantworkspacesincludeactualstates"></a>`includeActualStates` | [`[String!]`](#string) | Includes all workspaces that match any of the actual states. |
+| <a id="mergerequestparticipantworkspacesprojectids"></a>`projectIds` | [`[ProjectID!]`](#projectid) | Filter workspaces by project id. |
### `MergeRequestPermissions`
@@ -18532,6 +18834,22 @@ Check permissions for the current user on a merge request.
| <a id="mergerequestpermissionsrevertoncurrentmergerequest"></a>`revertOnCurrentMergeRequest` | [`Boolean!`](#boolean) | Indicates the user can perform `revert_on_current_merge_request` on this resource. |
| <a id="mergerequestpermissionsupdatemergerequest"></a>`updateMergeRequest` | [`Boolean!`](#boolean) | Indicates the user can perform `update_merge_request` on this resource. |
+### `MergeRequestReviewLlmSummary`
+
+A review summary generated by AI.
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mergerequestreviewllmsummarycontent"></a>`content` | [`String!`](#string) | Content of the review summary. |
+| <a id="mergerequestreviewllmsummarycreatedat"></a>`createdAt` | [`Time!`](#time) | Timestamp of when the review summary was created. |
+| <a id="mergerequestreviewllmsummarymergerequestdiffid"></a>`mergeRequestDiffId` | [`ID!`](#id) | ID of the Merge Request diff associated with the review summary. |
+| <a id="mergerequestreviewllmsummaryprovider"></a>`provider` | [`String!`](#string) | AI provider that generated the summary. |
+| <a id="mergerequestreviewllmsummaryreviewer"></a>`reviewer` | [`UserCore`](#usercore) | User who authored the review associated with the review summary. |
+| <a id="mergerequestreviewllmsummaryupdatedat"></a>`updatedAt` | [`Time!`](#time) | Timestamp of when the review summary was updated. |
+| <a id="mergerequestreviewllmsummaryuser"></a>`user` | [`UserCore`](#usercore) | User associated with the review summary. |
+
### `MergeRequestReviewer`
A user assigned to a merge request as a reviewer.
@@ -18553,6 +18871,7 @@ A user assigned to a merge request as a reviewer.
| <a id="mergerequestreviewergroupcount"></a>`groupCount` | [`Int`](#int) | Group count for the user. |
| <a id="mergerequestreviewergroupmemberships"></a>`groupMemberships` | [`GroupMemberConnection`](#groupmemberconnection) | Group memberships of the user. (see [Connections](#connections)) |
| <a id="mergerequestreviewerid"></a>`id` | [`ID!`](#id) | ID of the user. |
+| <a id="mergerequestrevieweride"></a>`ide` | [`Ide`](#ide) | IDE settings. |
| <a id="mergerequestreviewerjobtitle"></a>`jobTitle` | [`String`](#string) | Job title of the user. |
| <a id="mergerequestreviewerlinkedin"></a>`linkedin` | [`String`](#string) | LinkedIn profile name of the user. |
| <a id="mergerequestreviewerlocation"></a>`location` | [`String`](#string) | Location of the user. |
@@ -18564,6 +18883,7 @@ A user assigned to a merge request as a reviewer.
| <a id="mergerequestreviewerpreferencesgitpodpath"></a>`preferencesGitpodPath` | [`String`](#string) | Web path to the Gitpod section within user preferences. |
| <a id="mergerequestreviewerprofileenablegitpodpath"></a>`profileEnableGitpodPath` | [`String`](#string) | Web path to enable Gitpod for the user. |
| <a id="mergerequestreviewerprojectmemberships"></a>`projectMemberships` | [`ProjectMemberConnection`](#projectmemberconnection) | Project memberships of the user. (see [Connections](#connections)) |
+| <a id="mergerequestreviewerpronouns"></a>`pronouns` | [`String`](#string) | Pronouns of the user. |
| <a id="mergerequestreviewerpublicemail"></a>`publicEmail` | [`String`](#string) | User's public email. |
| <a id="mergerequestreviewersavedreplies"></a>`savedReplies` | [`SavedReplyConnection`](#savedreplyconnection) | Saved replies authored by the user. Will not return saved replies if `saved_replies` feature flag is disabled. (see [Connections](#connections)) |
| <a id="mergerequestreviewerstate"></a>`state` | [`UserState!`](#userstate) | State of the user. |
@@ -18596,6 +18916,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="mergerequestreviewerassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after this timestamp. |
| <a id="mergerequestreviewerassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before this timestamp. |
| <a id="mergerequestreviewerassignedmergerequestsdraft"></a>`draft` | [`Boolean`](#boolean) | Limit result to draft merge requests. |
+| <a id="mergerequestreviewerassignedmergerequestsgroupid"></a>`groupId` | [`GroupID`](#groupid) | The global ID of the group the authored merge requests should be in. Merge requests in subgroups are included. |
| <a id="mergerequestreviewerassignedmergerequestsiids"></a>`iids` | [`[String!]`](#string) | Array of IIDs of merge requests, for example `[1, 2]`. |
| <a id="mergerequestreviewerassignedmergerequestslabels"></a>`labels` | [`[String!]`](#string) | Array of label names. All resolved merge requests will have all of these labels. |
| <a id="mergerequestreviewerassignedmergerequestsmergedafter"></a>`mergedAfter` | [`Time`](#time) | Merge requests merged after this date. |
@@ -18631,6 +18952,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="mergerequestreviewerauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after this timestamp. |
| <a id="mergerequestreviewerauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before this timestamp. |
| <a id="mergerequestreviewerauthoredmergerequestsdraft"></a>`draft` | [`Boolean`](#boolean) | Limit result to draft merge requests. |
+| <a id="mergerequestreviewerauthoredmergerequestsgroupid"></a>`groupId` | [`GroupID`](#groupid) | The global ID of the group the authored merge requests should be in. Merge requests in subgroups are included. |
| <a id="mergerequestreviewerauthoredmergerequestsiids"></a>`iids` | [`[String!]`](#string) | Array of IIDs of merge requests, for example `[1, 2]`. |
| <a id="mergerequestreviewerauthoredmergerequestslabels"></a>`labels` | [`[String!]`](#string) | Array of label names. All resolved merge requests will have all of these labels. |
| <a id="mergerequestreviewerauthoredmergerequestsmergedafter"></a>`mergedAfter` | [`Time`](#time) | Merge requests merged after this date. |
@@ -18684,6 +19006,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="mergerequestreviewerreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after this timestamp. |
| <a id="mergerequestreviewerreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before this timestamp. |
| <a id="mergerequestreviewerreviewrequestedmergerequestsdraft"></a>`draft` | [`Boolean`](#boolean) | Limit result to draft merge requests. |
+| <a id="mergerequestreviewerreviewrequestedmergerequestsgroupid"></a>`groupId` | [`GroupID`](#groupid) | The global ID of the group the authored merge requests should be in. Merge requests in subgroups are included. |
| <a id="mergerequestreviewerreviewrequestedmergerequestsiids"></a>`iids` | [`[String!]`](#string) | Array of IIDs of merge requests, for example `[1, 2]`. |
| <a id="mergerequestreviewerreviewrequestedmergerequestslabels"></a>`labels` | [`[String!]`](#string) | Array of label names. All resolved merge requests will have all of these labels. |
| <a id="mergerequestreviewerreviewrequestedmergerequestsmergedafter"></a>`mergedAfter` | [`Time`](#time) | Merge requests merged after this date. |
@@ -18804,6 +19127,8 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="mergerequestreviewerworkspacesids"></a>`ids` | [`[RemoteDevelopmentWorkspaceID!]`](#remotedevelopmentworkspaceid) | Array of global workspace IDs. For example, `["gid://gitlab/RemoteDevelopment::Workspace/1"]`. |
+| <a id="mergerequestreviewerworkspacesincludeactualstates"></a>`includeActualStates` | [`[String!]`](#string) | Includes all workspaces that match any of the actual states. |
+| <a id="mergerequestreviewerworkspacesprojectids"></a>`projectIds` | [`[ProjectID!]`](#projectid) | Filter workspaces by project id. |
### `Metadata`
@@ -18830,34 +19155,6 @@ Represents a metric image upload.
| <a id="metricimageiid"></a>`iid` | [`ID!`](#id) | Internal ID of the metric upload. |
| <a id="metricimageurl"></a>`url` | [`String!`](#string) | URL of the metric source. |
-### `MetricsDashboard`
-
-#### Fields
-
-| Name | Type | Description |
-| ---- | ---- | ----------- |
-| <a id="metricsdashboardpath"></a>`path` | [`String`](#string) | Path to a file with the dashboard definition. |
-| <a id="metricsdashboardschemavalidationwarnings"></a>`schemaValidationWarnings` | [`[String!]`](#string) | Dashboard schema validation warnings. |
-
-#### Fields with arguments
-
-##### `MetricsDashboard.annotations`
-
-Annotations added to the dashboard.
-
-Returns [`MetricsDashboardAnnotationConnection`](#metricsdashboardannotationconnection).
-
-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="metricsdashboardannotationsfrom"></a>`from` | [`Time!`](#time) | Timestamp marking date and time from which annotations need to be fetched. |
-| <a id="metricsdashboardannotationsto"></a>`to` | [`Time`](#time) | Timestamp marking date and time to which annotations need to be fetched. |
-
### `MetricsDashboardAnnotation`
#### Fields
@@ -18926,9 +19223,10 @@ Contains statistics about a milestone.
| Name | Type | Description |
| ---- | ---- | ----------- |
-| <a id="namespaceactualrepositorysizelimit"></a>`actualRepositorySizeLimit` | [`Float`](#float) | Size limit for repositories in the namespace in bytes. |
+| <a id="namespaceactualrepositorysizelimit"></a>`actualRepositorySizeLimit` | [`Float`](#float) | Size limit for repositories in the namespace in bytes. This limit only applies to namespaces under Project limit enforcement. |
+| <a id="namespaceactualsizelimit"></a>`actualSizeLimit` | [`Float`](#float) | Actual storage size limit for the namespace in bytes. This limit is agnostic of enforcement type. |
| <a id="namespaceadditionalpurchasedstoragesize"></a>`additionalPurchasedStorageSize` | [`Float`](#float) | Additional storage purchased for the root namespace in bytes. |
-| <a id="namespacecontainslockedprojects"></a>`containsLockedProjects` | [`Boolean!`](#boolean) | Includes at least one project where the repository size exceeds the limit. |
+| <a id="namespacecontainslockedprojects"></a>`containsLockedProjects` | [`Boolean!`](#boolean) | Includes at least one project where the repository size exceeds the limit. This only applies to namespaces under Project limit enforcement. |
| <a id="namespacecrossprojectpipelineavailable"></a>`crossProjectPipelineAvailable` | [`Boolean!`](#boolean) | Indicates if the cross_project_pipeline feature is available for the namespace. |
| <a id="namespacedescription"></a>`description` | [`String`](#string) | Description of the namespace. |
| <a id="namespacedescriptionhtml"></a>`descriptionHtml` | [`String`](#string) | GitLab Flavored Markdown rendering of `description`. |
@@ -18940,15 +19238,15 @@ Contains statistics about a milestone.
| <a id="namespacename"></a>`name` | [`String!`](#string) | Name of the namespace. |
| <a id="namespacepackagesettings"></a>`packageSettings` | [`PackageSettings`](#packagesettings) | Package settings for the namespace. |
| <a id="namespacepath"></a>`path` | [`String!`](#string) | Path of the namespace. |
-| <a id="namespacerepositorysizeexcessprojectcount"></a>`repositorySizeExcessProjectCount` | [`Int!`](#int) | Number of projects in the root namespace where the repository size exceeds the limit. |
+| <a id="namespacerepositorysizeexcessprojectcount"></a>`repositorySizeExcessProjectCount` | [`Int!`](#int) | Number of projects in the root namespace where the repository size exceeds the limit. This only applies to namespaces under Project limit enforcement. |
| <a id="namespacerequestaccessenabled"></a>`requestAccessEnabled` | [`Boolean`](#boolean) | Indicates if users can request access to namespace. |
| <a id="namespacerootstoragestatistics"></a>`rootStorageStatistics` | [`RootStorageStatistics`](#rootstoragestatistics) | Aggregated storage statistics of the namespace. Only available for root namespaces. |
| <a id="namespacesharedrunnerssetting"></a>`sharedRunnersSetting` | [`SharedRunnersSetting`](#sharedrunnerssetting) | Shared runners availability for the namespace and its descendants. |
-| <a id="namespacestoragesizelimit"></a>`storageSizeLimit` | [`Float`](#float) | Total storage limit of the root namespace in bytes. |
+| <a id="namespacestoragesizelimit"></a>`storageSizeLimit` | [`Float`](#float) | Storage limit included in the root namespace plan in bytes. This limit only applies to namespaces under Namespace limit enforcement. |
| <a id="namespacetemporarystorageincreaseendson"></a>`temporaryStorageIncreaseEndsOn` | [`Time`](#time) | Date until the temporary storage increase is active. |
| <a id="namespacetimelogcategories"></a>`timelogCategories` **{warning-solid}** | [`TimeTrackingTimelogCategoryConnection`](#timetrackingtimelogcategoryconnection) | **Introduced** in 15.3. This feature is an Experiment. It can be changed or removed at any time. Timelog categories for the namespace. |
| <a id="namespacetotalrepositorysize"></a>`totalRepositorySize` | [`Float`](#float) | Total repository size of all projects in the root namespace in bytes. |
-| <a id="namespacetotalrepositorysizeexcess"></a>`totalRepositorySizeExcess` | [`Float`](#float) | Total excess repository size of all projects in the root namespace in bytes. |
+| <a id="namespacetotalrepositorysizeexcess"></a>`totalRepositorySizeExcess` | [`Float`](#float) | Total excess repository size of all projects in the root namespace in bytes. This only applies to namespaces under Project limit enforcement. |
| <a id="namespacevisibility"></a>`visibility` | [`String`](#string) | Visibility of the namespace. |
#### Fields with arguments
@@ -18973,6 +19271,18 @@ four standard [pagination arguments](#connection-pagination-arguments):
| ---- | ---- | ----------- |
| <a id="namespaceachievementsids"></a>`ids` | [`[AchievementsAchievementID!]`](#achievementsachievementid) | Filter achievements by IDs. |
+##### `Namespace.addOnPurchase`
+
+AddOnPurchase associated with the namespace.
+
+Returns [`AddOnPurchase`](#addonpurchase).
+
+###### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="namespaceaddonpurchaseaddonname"></a>`addOnName` | [`String!`](#string) | AddOn name. |
+
##### `Namespace.complianceFrameworks`
Compliance frameworks available to projects in this namespace.
@@ -19009,6 +19319,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="namespaceprojectsids"></a>`ids` | [`[ID!]`](#id) | Filter projects by IDs. |
| <a id="namespaceprojectsincludesubgroups"></a>`includeSubgroups` | [`Boolean`](#boolean) | Include also subgroup projects. |
| <a id="namespaceprojectsnotaimedfordeletion"></a>`notAimedForDeletion` | [`Boolean`](#boolean) | Include projects that are not aimed for deletion. |
+| <a id="namespaceprojectssbomcomponentid"></a>`sbomComponentId` | [`ID`](#id) | Return only the projects related to the specified SBOM component. |
| <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. |
| <a id="namespaceprojectswithissuesenabled"></a>`withIssuesEnabled` | [`Boolean`](#boolean) | Return only projects with issues enabled. |
@@ -19536,7 +19847,7 @@ Represents a file or directory in the project repository that has been locked.
| <a id="pipelinecommitpath"></a>`commitPath` | [`String`](#string) | Path to the commit that triggered the pipeline. |
| <a id="pipelinecommittedat"></a>`committedAt` | [`Time`](#time) | Timestamp of the pipeline's commit. |
| <a id="pipelinecomplete"></a>`complete` | [`Boolean!`](#boolean) | Indicates if a pipeline is complete. |
-| <a id="pipelineconfigsource"></a>`configSource` | [`PipelineConfigSourceEnum`](#pipelineconfigsourceenum) | Configuration source of the pipeline (UNKNOWN_SOURCE, REPOSITORY_SOURCE, AUTO_DEVOPS_SOURCE, WEBIDE_SOURCE, REMOTE_SOURCE, EXTERNAL_PROJECT_SOURCE, BRIDGE_SOURCE, PARAMETER_SOURCE, COMPLIANCE_SOURCE). |
+| <a id="pipelineconfigsource"></a>`configSource` | [`PipelineConfigSourceEnum`](#pipelineconfigsourceenum) | Configuration source of the pipeline (UNKNOWN_SOURCE, REPOSITORY_SOURCE, AUTO_DEVOPS_SOURCE, WEBIDE_SOURCE, REMOTE_SOURCE, EXTERNAL_PROJECT_SOURCE, BRIDGE_SOURCE, PARAMETER_SOURCE, COMPLIANCE_SOURCE, SECURITY_POLICIES_DEFAULT_SOURCE). |
| <a id="pipelinecoverage"></a>`coverage` | [`Float`](#float) | Coverage percentage. |
| <a id="pipelinecreatedat"></a>`createdAt` | [`Time!`](#time) | Timestamp of the pipeline's creation. |
| <a id="pipelinedastprofile"></a>`dastProfile` | [`DastProfile`](#dastprofile) | DAST profile associated with the pipeline. |
@@ -19846,6 +20157,7 @@ Represents a product analytics dashboard panel.
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="productanalyticsdashboardpanelgridattributes"></a>`gridAttributes` | [`JSON`](#json) | Description of the position and size of the panel. |
+| <a id="productanalyticsdashboardpanelqueryoverrides"></a>`queryOverrides` | [`JSON`](#json) | Overrides for the visualization query object. |
| <a id="productanalyticsdashboardpaneltitle"></a>`title` | [`String!`](#string) | Title of the panel. |
| <a id="productanalyticsdashboardpanelvisualization"></a>`visualization` | [`ProductAnalyticsDashboardVisualization!`](#productanalyticsdashboardvisualization) | Visualization of the panel. |
@@ -19903,7 +20215,6 @@ Represents a product analytics dashboard visualization.
| <a id="projectid"></a>`id` | [`ID!`](#id) | ID of the project. |
| <a id="projectimportstatus"></a>`importStatus` | [`String`](#string) | Status of import background job of the project. |
| <a id="projectincidentmanagementtimelineeventtags"></a>`incidentManagementTimelineEventTags` | [`[TimelineEventTagType!]`](#timelineeventtagtype) | Timeline event tags for the project. |
-| <a id="projectinheritedcivariables"></a>`inheritedCiVariables` | [`InheritedCiVariableConnection`](#inheritedcivariableconnection) | List of CI/CD variables the project inherited from its parent group and ancestors. (see [Connections](#connections)) |
| <a id="projectiscatalogresource"></a>`isCatalogResource` **{warning-solid}** | [`Boolean`](#boolean) | **Introduced** in 15.11. This feature is an Experiment. It can be changed or removed at any time. Indicates if a project is a catalog resource. |
| <a id="projectissuesenabled"></a>`issuesEnabled` | [`Boolean`](#boolean) | Indicates if Issues are enabled for the current user. |
| <a id="projectjiraimportstatus"></a>`jiraImportStatus` | [`String`](#string) | Status of Jira import background job of the project. |
@@ -20459,6 +20770,22 @@ four standard [pagination arguments](#connection-pagination-arguments):
| ---- | ---- | ----------- |
| <a id="projectincidentmanagementtimelineeventsincidentid"></a>`incidentId` | [`IssueID!`](#issueid) | ID of the incident. |
+##### `Project.inheritedCiVariables`
+
+List of CI/CD variables the project inherited from its parent group and ancestors.
+
+Returns [`InheritedCiVariableConnection`](#inheritedcivariableconnection).
+
+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="projectinheritedcivariablessort"></a>`sort` | [`CiGroupVariablesSort`](#cigroupvariablessort) | Sort variables by the criteria. |
+
##### `Project.issue`
A single issue of the project.
@@ -20472,6 +20799,7 @@ Returns [`Issue`](#issue).
| <a id="projectissueassigneeid"></a>`assigneeId` | [`String`](#string) | ID of a user assigned to the issues. Wildcard values "NONE" and "ANY" are supported. |
| <a id="projectissueassigneeusername"></a>`assigneeUsername` **{warning-solid}** | [`String`](#string) | **Deprecated** in 13.11. Use `assigneeUsernames`. |
| <a id="projectissueassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the issue. |
+| <a id="projectissueassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee wildcard. Incompatible with assigneeUsername and assigneeUsernames. |
| <a id="projectissueauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author of the issue. |
| <a id="projectissueclosedafter"></a>`closedAfter` | [`Time`](#time) | Issues closed after this date. |
| <a id="projectissueclosedbefore"></a>`closedBefore` | [`Time`](#time) | Issues closed before this date. |
@@ -20481,13 +20809,16 @@ Returns [`Issue`](#issue).
| <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="projectissueepicwildcardid"></a>`epicWildcardId` | [`EpicWildcardId`](#epicwildcardid) | Filter by epic ID wildcard. Incompatible with epicId. |
| <a id="projectissuehealthstatus"></a>`healthStatus` **{warning-solid}** | [`HealthStatus`](#healthstatus) | **Deprecated** in 15.4. Use `healthStatusFilter`. |
| <a id="projectissuehealthstatusfilter"></a>`healthStatusFilter` | [`HealthStatusFilter`](#healthstatusfilter) | Health status of the issue, "none" and "any" values are supported. |
| <a id="projectissueiid"></a>`iid` | [`String`](#string) | IID of the issue. For example, "1". |
| <a id="projectissueiids"></a>`iids` | [`[String!]`](#string) | List of IIDs of issues. For example, `["1", "2"]`. |
| <a id="projectissuein"></a>`in` | [`[IssuableSearchableField!]`](#issuablesearchablefield) | Specify the fields to perform the search in. Defaults to `[TITLE, DESCRIPTION]`. Requires the `search` argument.'. |
| <a id="projectissueincludesubepics"></a>`includeSubepics` | [`Boolean`](#boolean) | Whether to include subepics when filtering issues by epicId. |
+| <a id="projectissueiterationcadenceid"></a>`iterationCadenceId` | [`[IterationsCadenceID!]`](#iterationscadenceid) | Filter by a list of iteration cadence IDs. |
| <a id="projectissueiterationid"></a>`iterationId` | [`[ID]`](#id) | List of iteration Global IDs applied to the issue. |
+| <a id="projectissueiterationtitle"></a>`iterationTitle` | [`String`](#string) | Filter by iteration title. |
| <a id="projectissueiterationwildcardid"></a>`iterationWildcardId` | [`IterationWildcardId`](#iterationwildcardid) | Filter by iteration ID wildcard. |
| <a id="projectissuelabelname"></a>`labelName` | [`[String]`](#string) | Labels applied to this issue. |
| <a id="projectissuemilestonetitle"></a>`milestoneTitle` | [`[String]`](#string) | Milestone applied to this issue. |
@@ -20504,6 +20835,7 @@ Returns [`Issue`](#issue).
| <a id="projectissueupdatedafter"></a>`updatedAfter` | [`Time`](#time) | Issues updated after this date. |
| <a id="projectissueupdatedbefore"></a>`updatedBefore` | [`Time`](#time) | Issues updated before this date. |
| <a id="projectissueweight"></a>`weight` | [`String`](#string) | Weight applied to the issue, "none" and "any" values are supported. |
+| <a id="projectissueweightwildcardid"></a>`weightWildcardId` | [`WeightWildcardId`](#weightwildcardid) | Filter by weight ID wildcard. Incompatible with weight. |
##### `Project.issueStatusCounts`
@@ -20518,6 +20850,7 @@ Returns [`IssueStatusCountsType`](#issuestatuscountstype).
| <a id="projectissuestatuscountsassigneeid"></a>`assigneeId` | [`String`](#string) | ID of a user assigned to the issues. Wildcard values "NONE" and "ANY" are supported. |
| <a id="projectissuestatuscountsassigneeusername"></a>`assigneeUsername` **{warning-solid}** | [`String`](#string) | **Deprecated** in 13.11. Use `assigneeUsernames`. |
| <a id="projectissuestatuscountsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the issue. |
+| <a id="projectissuestatuscountsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee wildcard. Incompatible with assigneeUsername and assigneeUsernames. |
| <a id="projectissuestatuscountsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author of the issue. |
| <a id="projectissuestatuscountsclosedafter"></a>`closedAfter` | [`Time`](#time) | Issues closed after this date. |
| <a id="projectissuestatuscountsclosedbefore"></a>`closedBefore` | [`Time`](#time) | Issues closed before this date. |
@@ -20527,12 +20860,15 @@ Returns [`IssueStatusCountsType`](#issuestatuscountstype).
| <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="projectissuestatuscountsepicid"></a>`epicId` | [`String`](#string) | ID of an epic associated with the issues, "none" and "any" values are supported. |
+| <a id="projectissuestatuscountsepicwildcardid"></a>`epicWildcardId` | [`EpicWildcardId`](#epicwildcardid) | Filter by epic ID wildcard. Incompatible with epicId. |
| <a id="projectissuestatuscountshealthstatusfilter"></a>`healthStatusFilter` | [`HealthStatusFilter`](#healthstatusfilter) | Health status of the issue, "none" and "any" values are supported. |
| <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="projectissuestatuscountsin"></a>`in` | [`[IssuableSearchableField!]`](#issuablesearchablefield) | Specify the fields to perform the search in. Defaults to `[TITLE, DESCRIPTION]`. Requires the `search` argument.'. |
| <a id="projectissuestatuscountsincludesubepics"></a>`includeSubepics` | [`Boolean`](#boolean) | Whether to include subepics when filtering issues by epicId. |
+| <a id="projectissuestatuscountsiterationcadenceid"></a>`iterationCadenceId` | [`[IterationsCadenceID!]`](#iterationscadenceid) | Filter by a list of iteration cadence IDs. |
| <a id="projectissuestatuscountsiterationid"></a>`iterationId` | [`[ID]`](#id) | List of iteration Global IDs applied to the issue. |
+| <a id="projectissuestatuscountsiterationtitle"></a>`iterationTitle` | [`String`](#string) | Filter by iteration title. |
| <a id="projectissuestatuscountsiterationwildcardid"></a>`iterationWildcardId` | [`IterationWildcardId`](#iterationwildcardid) | Filter by iteration ID wildcard. |
| <a id="projectissuestatuscountslabelname"></a>`labelName` | [`[String]`](#string) | Labels applied to this issue. |
| <a id="projectissuestatuscountsmilestonetitle"></a>`milestoneTitle` | [`[String]`](#string) | Milestone applied to this issue. |
@@ -20547,6 +20883,7 @@ Returns [`IssueStatusCountsType`](#issuestatuscountstype).
| <a id="projectissuestatuscountsupdatedafter"></a>`updatedAfter` | [`Time`](#time) | Issues updated after this date. |
| <a id="projectissuestatuscountsupdatedbefore"></a>`updatedBefore` | [`Time`](#time) | Issues updated before this date. |
| <a id="projectissuestatuscountsweight"></a>`weight` | [`String`](#string) | Weight applied to the issue, "none" and "any" values are supported. |
+| <a id="projectissuestatuscountsweightwildcardid"></a>`weightWildcardId` | [`WeightWildcardId`](#weightwildcardid) | Filter by weight ID wildcard. Incompatible with weight. |
##### `Project.issues`
@@ -20565,6 +20902,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="projectissuesassigneeid"></a>`assigneeId` | [`String`](#string) | ID of a user assigned to the issues. Wildcard values "NONE" and "ANY" are supported. |
| <a id="projectissuesassigneeusername"></a>`assigneeUsername` **{warning-solid}** | [`String`](#string) | **Deprecated** in 13.11. Use `assigneeUsernames`. |
| <a id="projectissuesassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the issue. |
+| <a id="projectissuesassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee wildcard. Incompatible with assigneeUsername and assigneeUsernames. |
| <a id="projectissuesauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author of the issue. |
| <a id="projectissuesclosedafter"></a>`closedAfter` | [`Time`](#time) | Issues closed after this date. |
| <a id="projectissuesclosedbefore"></a>`closedBefore` | [`Time`](#time) | Issues closed before this date. |
@@ -20574,13 +20912,16 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <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="projectissuesepicwildcardid"></a>`epicWildcardId` | [`EpicWildcardId`](#epicwildcardid) | Filter by epic ID wildcard. Incompatible with epicId. |
| <a id="projectissueshealthstatus"></a>`healthStatus` **{warning-solid}** | [`HealthStatus`](#healthstatus) | **Deprecated** in 15.4. Use `healthStatusFilter`. |
| <a id="projectissueshealthstatusfilter"></a>`healthStatusFilter` | [`HealthStatusFilter`](#healthstatusfilter) | Health status of the issue, "none" and "any" values are supported. |
| <a id="projectissuesiid"></a>`iid` | [`String`](#string) | IID of the issue. For example, "1". |
| <a id="projectissuesiids"></a>`iids` | [`[String!]`](#string) | List of IIDs of issues. For example, `["1", "2"]`. |
| <a id="projectissuesin"></a>`in` | [`[IssuableSearchableField!]`](#issuablesearchablefield) | Specify the fields to perform the search in. Defaults to `[TITLE, DESCRIPTION]`. Requires the `search` argument.'. |
| <a id="projectissuesincludesubepics"></a>`includeSubepics` | [`Boolean`](#boolean) | Whether to include subepics when filtering issues by epicId. |
+| <a id="projectissuesiterationcadenceid"></a>`iterationCadenceId` | [`[IterationsCadenceID!]`](#iterationscadenceid) | Filter by a list of iteration cadence IDs. |
| <a id="projectissuesiterationid"></a>`iterationId` | [`[ID]`](#id) | List of iteration Global IDs applied to the issue. |
+| <a id="projectissuesiterationtitle"></a>`iterationTitle` | [`String`](#string) | Filter by iteration title. |
| <a id="projectissuesiterationwildcardid"></a>`iterationWildcardId` | [`IterationWildcardId`](#iterationwildcardid) | Filter by iteration ID wildcard. |
| <a id="projectissueslabelname"></a>`labelName` | [`[String]`](#string) | Labels applied to this issue. |
| <a id="projectissuesmilestonetitle"></a>`milestoneTitle` | [`[String]`](#string) | Milestone applied to this issue. |
@@ -20597,6 +20938,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="projectissuesupdatedafter"></a>`updatedAfter` | [`Time`](#time) | Issues updated after this date. |
| <a id="projectissuesupdatedbefore"></a>`updatedBefore` | [`Time`](#time) | Issues updated before this date. |
| <a id="projectissuesweight"></a>`weight` | [`String`](#string) | Weight applied to the issue, "none" and "any" values are supported. |
+| <a id="projectissuesweightwildcardid"></a>`weightWildcardId` | [`WeightWildcardId`](#weightwildcardid) | Filter by weight ID wildcard. Incompatible with weight. |
##### `Project.iterationCadences`
@@ -21436,6 +21778,25 @@ 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. |
+### `ProjectRepositoryRegistry`
+
+Represents the Geo replication and verification state of a project repository.
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="projectrepositoryregistrycreatedat"></a>`createdAt` | [`Time`](#time) | Timestamp when the ProjectRepositoryRegistry was created. |
+| <a id="projectrepositoryregistryid"></a>`id` | [`ID!`](#id) | ID of the ProjectRepositoryRegistry. |
+| <a id="projectrepositoryregistrylastsyncfailure"></a>`lastSyncFailure` | [`String`](#string) | Error message during sync of the ProjectRepositoryRegistry. |
+| <a id="projectrepositoryregistrylastsyncedat"></a>`lastSyncedAt` | [`Time`](#time) | Timestamp of the most recent successful sync of the ProjectRepositoryRegistry. |
+| <a id="projectrepositoryregistryprojectid"></a>`projectId` | [`ID!`](#id) | ID of the Project. |
+| <a id="projectrepositoryregistryretryat"></a>`retryAt` | [`Time`](#time) | Timestamp after which the ProjectRepositoryRegistry is resynced. |
+| <a id="projectrepositoryregistryretrycount"></a>`retryCount` | [`Int`](#int) | Number of consecutive failed sync attempts of the ProjectRepositoryRegistry. |
+| <a id="projectrepositoryregistrystate"></a>`state` | [`RegistryState`](#registrystate) | Sync state of the ProjectRepositoryRegistry. |
+| <a id="projectrepositoryregistryverificationretryat"></a>`verificationRetryAt` | [`Time`](#time) | Timestamp after which the ProjectRepositoryRegistry is reverified. |
+| <a id="projectrepositoryregistryverifiedat"></a>`verifiedAt` | [`Time`](#time) | Timestamp of the most recent successful verification of the ProjectRepositoryRegistry. |
+
### `ProjectSecurityPolicySource`
Represents the source of a security policy belonging to a project.
@@ -21469,6 +21830,7 @@ Represents the source of a security policy belonging to a project.
| <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="projectstatisticscostfactoredstoragesize"></a>`costFactoredStorageSize` **{warning-solid}** | [`Float!`](#float) | **Introduced** in 16.2. This feature is an Experiment. It can be changed or removed at any time. Storage size in bytes with any applicable cost factor for forks applied. This will equal storage_size if there is no applicable cost factor. |
| <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. |
@@ -21900,6 +22262,18 @@ Returns [`Tree`](#tree).
| <a id="repositorytreeref"></a>`ref` | [`String`](#string) | Commit ref to get the tree for. Default value is HEAD. |
| <a id="repositorytreereftype"></a>`refType` | [`RefType`](#reftype) | Type of ref. |
+##### `Repository.validateCodeownerFile`
+
+Shows linting errors in the CODEOWNER file of the repository.
+
+Returns [`RepositoryCodeownerValidation`](#repositorycodeownervalidation).
+
+###### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="repositoryvalidatecodeownerfileref"></a>`ref` | [`String`](#string) | Ref where code owners file needs to be checked. Defaults to the repository's default branch. |
+
### `RepositoryBlob`
#### Fields
@@ -21947,6 +22321,24 @@ Returns [`Tree`](#tree).
| <a id="repositoryblobstoredexternally"></a>`storedExternally` | [`Boolean`](#boolean) | Whether the blob's content is stored externally (for instance, in LFS). |
| <a id="repositoryblobwebpath"></a>`webPath` | [`String`](#string) | Web path of the blob. |
+### `RepositoryCodeownerError`
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="repositorycodeownererrorcode"></a>`code` | [`String!`](#string) | Linting error code. |
+| <a id="repositorycodeownererrorlines"></a>`lines` | [`[Int!]!`](#int) | Lines where the error occurred. |
+
+### `RepositoryCodeownerValidation`
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="repositorycodeownervalidationtotal"></a>`total` | [`Int!`](#int) | Total number of validation error in the file. |
+| <a id="repositorycodeownervalidationvalidationerrors"></a>`validationErrors` | [`[RepositoryCodeownerError!]!`](#repositorycodeownererror) | Specific lint error code. |
+
### `RepositoryLanguage`
#### Fields
@@ -22032,11 +22424,13 @@ Counts of requirements by their state.
| ---- | ---- | ----------- |
| <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="rootstoragestatisticscontainerregistrysizeisestimated"></a>`containerRegistrySizeIsEstimated` | [`Boolean!`](#boolean) | Indicates whether the deduplicated Container Registry size for the namespace is an estimated value or not. |
+| <a id="rootstoragestatisticscostfactoredstoragesize"></a>`costFactoredStorageSize` **{warning-solid}** | [`Float!`](#float) | **Introduced** in 16.2. This feature is an Experiment. It can be changed or removed at any time. Total storage in bytes with any applicable cost factor for forks applied. This will equal storage_size if there is no applicable cost factor. |
| <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. |
| <a id="rootstoragestatisticspipelineartifactssize"></a>`pipelineArtifactsSize` | [`Float!`](#float) | CI pipeline artifacts size in bytes. |
-| <a id="rootstoragestatisticsregistrysizeestimated"></a>`registrySizeEstimated` | [`Boolean!`](#boolean) | Indicates whether the deduplicated Container Registry size for the namespace is an estimated value or not. |
+| <a id="rootstoragestatisticsregistrysizeestimated"></a>`registrySizeEstimated` **{warning-solid}** | [`Boolean!`](#boolean) | **Deprecated** in 16.2. Use `container_registry_size_is_estimated`. |
| <a id="rootstoragestatisticsrepositorysize"></a>`repositorySize` | [`Float!`](#float) | Git repository size in bytes. |
| <a id="rootstoragestatisticssnippetssize"></a>`snippetsSize` | [`Float!`](#float) | Snippets size in bytes. |
| <a id="rootstoragestatisticsstoragesize"></a>`storageSize` | [`Float!`](#float) | Total storage in bytes. |
@@ -23068,6 +23462,7 @@ Core represention of a GitLab user.
| <a id="usercoregroupcount"></a>`groupCount` | [`Int`](#int) | Group count for the user. |
| <a id="usercoregroupmemberships"></a>`groupMemberships` | [`GroupMemberConnection`](#groupmemberconnection) | Group memberships of the user. (see [Connections](#connections)) |
| <a id="usercoreid"></a>`id` | [`ID!`](#id) | ID of the user. |
+| <a id="usercoreide"></a>`ide` | [`Ide`](#ide) | IDE settings. |
| <a id="usercorejobtitle"></a>`jobTitle` | [`String`](#string) | Job title of the user. |
| <a id="usercorelinkedin"></a>`linkedin` | [`String`](#string) | LinkedIn profile name of the user. |
| <a id="usercorelocation"></a>`location` | [`String`](#string) | Location of the user. |
@@ -23078,6 +23473,7 @@ Core represention of a GitLab user.
| <a id="usercorepreferencesgitpodpath"></a>`preferencesGitpodPath` | [`String`](#string) | Web path to the Gitpod section within user preferences. |
| <a id="usercoreprofileenablegitpodpath"></a>`profileEnableGitpodPath` | [`String`](#string) | Web path to enable Gitpod for the user. |
| <a id="usercoreprojectmemberships"></a>`projectMemberships` | [`ProjectMemberConnection`](#projectmemberconnection) | Project memberships of the user. (see [Connections](#connections)) |
+| <a id="usercorepronouns"></a>`pronouns` | [`String`](#string) | Pronouns of the user. |
| <a id="usercorepublicemail"></a>`publicEmail` | [`String`](#string) | User's public email. |
| <a id="usercoresavedreplies"></a>`savedReplies` | [`SavedReplyConnection`](#savedreplyconnection) | Saved replies authored by the user. Will not return saved replies if `saved_replies` feature flag is disabled. (see [Connections](#connections)) |
| <a id="usercorestate"></a>`state` | [`UserState!`](#userstate) | State of the user. |
@@ -23110,6 +23506,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="usercoreassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after this timestamp. |
| <a id="usercoreassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before this timestamp. |
| <a id="usercoreassignedmergerequestsdraft"></a>`draft` | [`Boolean`](#boolean) | Limit result to draft merge requests. |
+| <a id="usercoreassignedmergerequestsgroupid"></a>`groupId` | [`GroupID`](#groupid) | The global ID of the group the authored merge requests should be in. Merge requests in subgroups are included. |
| <a id="usercoreassignedmergerequestsiids"></a>`iids` | [`[String!]`](#string) | Array of IIDs of merge requests, for example `[1, 2]`. |
| <a id="usercoreassignedmergerequestslabels"></a>`labels` | [`[String!]`](#string) | Array of label names. All resolved merge requests will have all of these labels. |
| <a id="usercoreassignedmergerequestsmergedafter"></a>`mergedAfter` | [`Time`](#time) | Merge requests merged after this date. |
@@ -23145,6 +23542,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="usercoreauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after this timestamp. |
| <a id="usercoreauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before this timestamp. |
| <a id="usercoreauthoredmergerequestsdraft"></a>`draft` | [`Boolean`](#boolean) | Limit result to draft merge requests. |
+| <a id="usercoreauthoredmergerequestsgroupid"></a>`groupId` | [`GroupID`](#groupid) | The global ID of the group the authored merge requests should be in. Merge requests in subgroups are included. |
| <a id="usercoreauthoredmergerequestsiids"></a>`iids` | [`[String!]`](#string) | Array of IIDs of merge requests, for example `[1, 2]`. |
| <a id="usercoreauthoredmergerequestslabels"></a>`labels` | [`[String!]`](#string) | Array of label names. All resolved merge requests will have all of these labels. |
| <a id="usercoreauthoredmergerequestsmergedafter"></a>`mergedAfter` | [`Time`](#time) | Merge requests merged after this date. |
@@ -23198,6 +23596,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="usercorereviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after this timestamp. |
| <a id="usercorereviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before this timestamp. |
| <a id="usercorereviewrequestedmergerequestsdraft"></a>`draft` | [`Boolean`](#boolean) | Limit result to draft merge requests. |
+| <a id="usercorereviewrequestedmergerequestsgroupid"></a>`groupId` | [`GroupID`](#groupid) | The global ID of the group the authored merge requests should be in. Merge requests in subgroups are included. |
| <a id="usercorereviewrequestedmergerequestsiids"></a>`iids` | [`[String!]`](#string) | Array of IIDs of merge requests, for example `[1, 2]`. |
| <a id="usercorereviewrequestedmergerequestslabels"></a>`labels` | [`[String!]`](#string) | Array of label names. All resolved merge requests will have all of these labels. |
| <a id="usercorereviewrequestedmergerequestsmergedafter"></a>`mergedAfter` | [`Time`](#time) | Merge requests merged after this date. |
@@ -23318,6 +23717,8 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="usercoreworkspacesids"></a>`ids` | [`[RemoteDevelopmentWorkspaceID!]`](#remotedevelopmentworkspaceid) | Array of global workspace IDs. For example, `["gid://gitlab/RemoteDevelopment::Workspace/1"]`. |
+| <a id="usercoreworkspacesincludeactualstates"></a>`includeActualStates` | [`[String!]`](#string) | Includes all workspaces that match any of the actual states. |
+| <a id="usercoreworkspacesprojectids"></a>`projectIds` | [`[ProjectID!]`](#projectid) | Filter workspaces by project id. |
### `UserMergeRequestInteraction`
@@ -23421,6 +23822,7 @@ Represents a vulnerability.
| <a id="vulnerabilitydetails"></a>`details` | [`[VulnerabilityDetail!]!`](#vulnerabilitydetail) | Details of the vulnerability. |
| <a id="vulnerabilitydetectedat"></a>`detectedAt` | [`Time!`](#time) | Timestamp of when the vulnerability was first detected. |
| <a id="vulnerabilitydiscussions"></a>`discussions` | [`DiscussionConnection!`](#discussionconnection) | All discussions on this noteable. (see [Connections](#connections)) |
+| <a id="vulnerabilitydismissalreason"></a>`dismissalReason` | [`VulnerabilityDismissalReason`](#vulnerabilitydismissalreason) | Reason for dismissal. Returns `null` if `expose_dismissal_reason`feature flag is disabled. |
| <a id="vulnerabilitydismissedat"></a>`dismissedAt` | [`Time`](#time) | Timestamp of when the vulnerability state was changed to dismissed. |
| <a id="vulnerabilitydismissedby"></a>`dismissedBy` | [`UserCore`](#usercore) | User that dismissed the vulnerability. |
| <a id="vulnerabilityexternalissuelinks"></a>`externalIssueLinks` | [`VulnerabilityExternalIssueLinkConnection!`](#vulnerabilityexternalissuelinkconnection) | List of external issue links related to the vulnerability. (see [Connections](#connections)) |
@@ -24289,6 +24691,7 @@ Represents a progress widget.
| ---- | ---- | ----------- |
| <a id="workitemwidgetprogressprogress"></a>`progress` | [`Int`](#int) | Progress of the work item. |
| <a id="workitemwidgetprogresstype"></a>`type` | [`WorkItemWidgetType`](#workitemwidgettype) | Widget type. |
+| <a id="workitemwidgetprogressupdatedat"></a>`updatedAt` | [`Time`](#time) | Timestamp of last progress update. |
### `WorkItemWidgetRequirementLegacy`
@@ -24672,6 +25075,17 @@ Deploy freeze period status.
| <a id="cifreezeperiodstatusactive"></a>`ACTIVE` | Freeze period is active. |
| <a id="cifreezeperiodstatusinactive"></a>`INACTIVE` | Freeze period is inactive. |
+### `CiGroupVariablesSort`
+
+Values for sorting inherited variables.
+
+| Value | Description |
+| ----- | ----------- |
+| <a id="cigroupvariablessortcreated_asc"></a>`CREATED_ASC` | Created at ascending order. |
+| <a id="cigroupvariablessortcreated_desc"></a>`CREATED_DESC` | Created at descending order. |
+| <a id="cigroupvariablessortkey_asc"></a>`KEY_ASC` | Key by ascending order. |
+| <a id="cigroupvariablessortkey_desc"></a>`KEY_DESC` | Key by descending order. |
+
### `CiJobKind`
| Value | Description |
@@ -24738,6 +25152,7 @@ Values for sorting runners.
| <a id="cirunnersortcontacted_desc"></a>`CONTACTED_DESC` | Ordered by contacted_at in descending order. |
| <a id="cirunnersortcreated_asc"></a>`CREATED_ASC` | Ordered by created_at in ascending order. |
| <a id="cirunnersortcreated_desc"></a>`CREATED_DESC` | Ordered by created_at in descending order. |
+| <a id="cirunnersortmost_active_desc"></a>`MOST_ACTIVE_DESC` **{warning-solid}** | **Introduced** in 16.2. This feature is an Experiment. It can be changed or removed at any time. Ordered by number of running jobs in descending order (only available on Ultimate plans). |
| <a id="cirunnersorttoken_expires_at_asc"></a>`TOKEN_EXPIRES_AT_ASC` | Ordered by token_expires_at in ascending order. |
| <a id="cirunnersorttoken_expires_at_desc"></a>`TOKEN_EXPIRES_AT_DESC` | Ordered by token_expires_at in descending order. |
@@ -24838,6 +25253,31 @@ ComplianceFramework of a project for filtering.
| <a id="complianceframeworkpresencefilterany"></a>`ANY` | Any compliance framework is assigned. |
| <a id="complianceframeworkpresencefilternone"></a>`NONE` | No compliance framework is assigned. |
+### `ComplianceStandardsAdherenceCheckName`
+
+Name of the check for the compliance standard.
+
+| Value | Description |
+| ----- | ----------- |
+| <a id="compliancestandardsadherencechecknameprevent_approval_by_merge_request_author"></a>`PREVENT_APPROVAL_BY_MERGE_REQUEST_AUTHOR` | Prevent approval by merge request author. |
+
+### `ComplianceStandardsAdherenceStandard`
+
+Name of the compliance standard.
+
+| Value | Description |
+| ----- | ----------- |
+| <a id="compliancestandardsadherencestandardgitlab"></a>`GITLAB` | Gitlab. |
+
+### `ComplianceStandardsAdherenceStatus`
+
+Status of the compliance standards adherence.
+
+| Value | Description |
+| ----- | ----------- |
+| <a id="compliancestandardsadherencestatusfail"></a>`FAIL` | Fail. |
+| <a id="compliancestandardsadherencestatussuccess"></a>`SUCCESS` | Success. |
+
### `ComplianceViolationReason`
Reason for the compliance violation.
@@ -25389,6 +25829,7 @@ Geo registry class.
| <a id="georegistryclasspackage_file_registry"></a>`PACKAGE_FILE_REGISTRY` | Geo::PackageFileRegistry registry class. |
| <a id="georegistryclasspages_deployment_registry"></a>`PAGES_DEPLOYMENT_REGISTRY` | Geo::PagesDeploymentRegistry registry class. |
| <a id="georegistryclasspipeline_artifact_registry"></a>`PIPELINE_ARTIFACT_REGISTRY` | Geo::PipelineArtifactRegistry registry class. |
+| <a id="georegistryclassproject_repository_registry"></a>`PROJECT_REPOSITORY_REGISTRY` | Geo::ProjectRepositoryRegistry registry class. |
| <a id="georegistryclassproject_wiki_repository_registry"></a>`PROJECT_WIKI_REPOSITORY_REGISTRY` | Geo::ProjectWikiRepositoryRegistry registry class. |
| <a id="georegistryclasssnippet_repository_registry"></a>`SNIPPET_REPOSITORY_REGISTRY` | Geo::SnippetRepositoryRegistry registry class. |
| <a id="georegistryclassterraform_state_version_registry"></a>`TERRAFORM_STATE_VERSION_REGISTRY` | Geo::TerraformStateVersionRegistry registry class. |
@@ -25837,6 +26278,7 @@ Representation of whether a GitLab merge request can be merged.
| ----- | ----------- |
| <a id="mergestrategyenumadd_to_merge_train_when_pipeline_succeeds"></a>`ADD_TO_MERGE_TRAIN_WHEN_PIPELINE_SUCCEEDS` | Use the add_to_merge_train_when_pipeline_succeeds merge strategy. |
| <a id="mergestrategyenummerge_train"></a>`MERGE_TRAIN` | Use the merge_train merge strategy. |
+| <a id="mergestrategyenummerge_when_checks_pass"></a>`MERGE_WHEN_CHECKS_PASS` | Use the merge_when_checks_pass merge strategy. |
| <a id="mergestrategyenummerge_when_pipeline_succeeds"></a>`MERGE_WHEN_PIPELINE_SUCCEEDS` | Use the merge_when_pipeline_succeeds merge strategy. |
### `MilestoneSort`
@@ -26090,6 +26532,7 @@ Values for sorting package.
| <a id="pipelineconfigsourceenumparameter_source"></a>`PARAMETER_SOURCE` | Parameter source. |
| <a id="pipelineconfigsourceenumremote_source"></a>`REMOTE_SOURCE` | Remote source. |
| <a id="pipelineconfigsourceenumrepository_source"></a>`REPOSITORY_SOURCE` | Repository source. |
+| <a id="pipelineconfigsourceenumsecurity_policies_default_source"></a>`SECURITY_POLICIES_DEFAULT_SOURCE` | Security policies default source. |
| <a id="pipelineconfigsourceenumunknown_source"></a>`UNKNOWN_SOURCE` | Unknown source. |
| <a id="pipelineconfigsourceenumwebide_source"></a>`WEBIDE_SOURCE` | Webide source. |
@@ -26561,10 +27004,9 @@ Name of the feature that the callout is for.
| <a id="usercalloutfeaturenameenummerge_request_settings_moved_callout"></a>`MERGE_REQUEST_SETTINGS_MOVED_CALLOUT` | Callout feature name for merge_request_settings_moved_callout. |
| <a id="usercalloutfeaturenameenummr_experience_survey"></a>`MR_EXPERIENCE_SURVEY` | Callout feature name for mr_experience_survey. |
| <a id="usercalloutfeaturenameenumnamespace_over_storage_users_combined_alert"></a>`NAMESPACE_OVER_STORAGE_USERS_COMBINED_ALERT` | Callout feature name for namespace_over_storage_users_combined_alert. |
-| <a id="usercalloutfeaturenameenumnamespace_storage_limit_banner_alert_threshold"></a>`NAMESPACE_STORAGE_LIMIT_BANNER_ALERT_THRESHOLD` | Callout feature name for namespace_storage_limit_banner_alert_threshold. |
-| <a id="usercalloutfeaturenameenumnamespace_storage_limit_banner_error_threshold"></a>`NAMESPACE_STORAGE_LIMIT_BANNER_ERROR_THRESHOLD` | Callout feature name for namespace_storage_limit_banner_error_threshold. |
-| <a id="usercalloutfeaturenameenumnamespace_storage_limit_banner_info_threshold"></a>`NAMESPACE_STORAGE_LIMIT_BANNER_INFO_THRESHOLD` | Callout feature name for namespace_storage_limit_banner_info_threshold. |
-| <a id="usercalloutfeaturenameenumnamespace_storage_limit_banner_warning_threshold"></a>`NAMESPACE_STORAGE_LIMIT_BANNER_WARNING_THRESHOLD` | Callout feature name for namespace_storage_limit_banner_warning_threshold. |
+| <a id="usercalloutfeaturenameenumnamespace_storage_limit_alert_alert_threshold"></a>`NAMESPACE_STORAGE_LIMIT_ALERT_ALERT_THRESHOLD` | Callout feature name for namespace_storage_limit_alert_alert_threshold. |
+| <a id="usercalloutfeaturenameenumnamespace_storage_limit_alert_error_threshold"></a>`NAMESPACE_STORAGE_LIMIT_ALERT_ERROR_THRESHOLD` | Callout feature name for namespace_storage_limit_alert_error_threshold. |
+| <a id="usercalloutfeaturenameenumnamespace_storage_limit_alert_warning_threshold"></a>`NAMESPACE_STORAGE_LIMIT_ALERT_WARNING_THRESHOLD` | Callout feature name for namespace_storage_limit_alert_warning_threshold. |
| <a id="usercalloutfeaturenameenumnamespace_storage_pre_enforcement_banner"></a>`NAMESPACE_STORAGE_PRE_ENFORCEMENT_BANNER` | Callout feature name for namespace_storage_pre_enforcement_banner. |
| <a id="usercalloutfeaturenameenumnew_navigation_callout"></a>`NEW_NAVIGATION_CALLOUT` | Callout feature name for new_navigation_callout. |
| <a id="usercalloutfeaturenameenumnew_top_level_group_alert"></a>`NEW_TOP_LEVEL_GROUP_ALERT` | Callout feature name for new_top_level_group_alert. |
@@ -26576,11 +27018,11 @@ Name of the feature that the callout is for.
| <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="usercalloutfeaturenameenumproject_quality_summary_feedback"></a>`PROJECT_QUALITY_SUMMARY_FEEDBACK` | Callout feature name for project_quality_summary_feedback. |
+| <a id="usercalloutfeaturenameenumproject_repository_limit_alert_alert_threshold"></a>`PROJECT_REPOSITORY_LIMIT_ALERT_ALERT_THRESHOLD` | Callout feature name for project_repository_limit_alert_alert_threshold. |
+| <a id="usercalloutfeaturenameenumproject_repository_limit_alert_error_threshold"></a>`PROJECT_REPOSITORY_LIMIT_ALERT_ERROR_THRESHOLD` | Callout feature name for project_repository_limit_alert_error_threshold. |
+| <a id="usercalloutfeaturenameenumproject_repository_limit_alert_warning_threshold"></a>`PROJECT_REPOSITORY_LIMIT_ALERT_WARNING_THRESHOLD` | Callout feature name for project_repository_limit_alert_warning_threshold. |
| <a id="usercalloutfeaturenameenumregistration_enabled_callout"></a>`REGISTRATION_ENABLED_CALLOUT` | Callout feature name for registration_enabled_callout. |
-| <a id="usercalloutfeaturenameenumrepository_storage_limit_banner_alert_threshold"></a>`REPOSITORY_STORAGE_LIMIT_BANNER_ALERT_THRESHOLD` | Callout feature name for repository_storage_limit_banner_alert_threshold. |
-| <a id="usercalloutfeaturenameenumrepository_storage_limit_banner_error_threshold"></a>`REPOSITORY_STORAGE_LIMIT_BANNER_ERROR_THRESHOLD` | Callout feature name for repository_storage_limit_banner_error_threshold. |
-| <a id="usercalloutfeaturenameenumrepository_storage_limit_banner_info_threshold"></a>`REPOSITORY_STORAGE_LIMIT_BANNER_INFO_THRESHOLD` | Callout feature name for repository_storage_limit_banner_info_threshold. |
-| <a id="usercalloutfeaturenameenumrepository_storage_limit_banner_warning_threshold"></a>`REPOSITORY_STORAGE_LIMIT_BANNER_WARNING_THRESHOLD` | Callout feature name for repository_storage_limit_banner_warning_threshold. |
+| <a id="usercalloutfeaturenameenumrich_text_editor"></a>`RICH_TEXT_EDITOR` | Callout feature name for rich_text_editor. |
| <a id="usercalloutfeaturenameenumsecurity_configuration_devops_alert"></a>`SECURITY_CONFIGURATION_DEVOPS_ALERT` | Callout feature name for security_configuration_devops_alert. |
| <a id="usercalloutfeaturenameenumsecurity_configuration_upgrade_banner"></a>`SECURITY_CONFIGURATION_UPGRADE_BANNER` | Callout feature name for security_configuration_upgrade_banner. |
| <a id="usercalloutfeaturenameenumsecurity_newsletter_callout"></a>`SECURITY_NEWSLETTER_CALLOUT` | Callout feature name for security_newsletter_callout. |
@@ -26635,6 +27077,7 @@ Verification status of a GPG or X.509 signature for a commit.
| <a id="verificationstatusunverified"></a>`UNVERIFIED` | unverified verification status. |
| <a id="verificationstatusunverified_key"></a>`UNVERIFIED_KEY` | unverified_key verification status. |
| <a id="verificationstatusverified"></a>`VERIFIED` | verified verification status. |
+| <a id="verificationstatusverified_system"></a>`VERIFIED_SYSTEM` | verified_system verification status. |
### `VisibilityLevelsEnum`
@@ -27006,6 +27449,12 @@ A `CiPipelineScheduleID` is a global ID. It is encoded as a string.
An example `CiPipelineScheduleID` is: `"gid://gitlab/Ci::PipelineSchedule/1"`.
+### `CiPipelineScheduleVariableID`
+
+A `CiPipelineScheduleVariableID` is a global ID. It is encoded as a string.
+
+An example `CiPipelineScheduleVariableID` is: `"gid://gitlab/Ci::PipelineScheduleVariable/1"`.
+
### `CiRunnerID`
A `CiRunnerID` is a global ID. It is encoded as a string.
@@ -27212,6 +27661,12 @@ A `GitlabErrorTrackingDetailedErrorID` is a global ID. It is encoded as a string
An example `GitlabErrorTrackingDetailedErrorID` is: `"gid://gitlab/Gitlab::ErrorTracking::DetailedError/1"`.
+### `GitlabSubscriptionsAddOnPurchaseID`
+
+A `GitlabSubscriptionsAddOnPurchaseID` is a global ID. It is encoded as a string.
+
+An example `GitlabSubscriptionsAddOnPurchaseID` is: `"gid://gitlab/GitlabSubscriptions::AddOnPurchase/1"`.
+
### `GlobalID`
A global identifier.
@@ -27896,7 +28351,9 @@ Implementations:
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="externalauditeventdestinationinterfacedestinationurl"></a>`destinationUrl` | [`String!`](#string) | External destination to send audit events to. |
+| <a id="externalauditeventdestinationinterfaceeventtypefilters"></a>`eventTypeFilters` | [`[String!]!`](#string) | List of event type filters added for streaming. |
| <a id="externalauditeventdestinationinterfaceid"></a>`id` | [`ID!`](#id) | ID of the destination. |
+| <a id="externalauditeventdestinationinterfacename"></a>`name` | [`String!`](#string) | Name of the external destination to send audit events to. |
| <a id="externalauditeventdestinationinterfaceverificationtoken"></a>`verificationToken` | [`String!`](#string) | Verification token to validate source of event. |
#### `MemberInterface`
@@ -28088,6 +28545,7 @@ Implementations:
| <a id="usergroupcount"></a>`groupCount` | [`Int`](#int) | Group count for the user. |
| <a id="usergroupmemberships"></a>`groupMemberships` | [`GroupMemberConnection`](#groupmemberconnection) | Group memberships of the user. (see [Connections](#connections)) |
| <a id="userid"></a>`id` | [`ID!`](#id) | ID of the user. |
+| <a id="useride"></a>`ide` | [`Ide`](#ide) | IDE settings. |
| <a id="userjobtitle"></a>`jobTitle` | [`String`](#string) | Job title of the user. |
| <a id="userlinkedin"></a>`linkedin` | [`String`](#string) | LinkedIn profile name of the user. |
| <a id="userlocation"></a>`location` | [`String`](#string) | Location of the user. |
@@ -28098,6 +28556,7 @@ Implementations:
| <a id="userpreferencesgitpodpath"></a>`preferencesGitpodPath` | [`String`](#string) | Web path to the Gitpod section within user preferences. |
| <a id="userprofileenablegitpodpath"></a>`profileEnableGitpodPath` | [`String`](#string) | Web path to enable Gitpod for the user. |
| <a id="userprojectmemberships"></a>`projectMemberships` | [`ProjectMemberConnection`](#projectmemberconnection) | Project memberships of the user. (see [Connections](#connections)) |
+| <a id="userpronouns"></a>`pronouns` | [`String`](#string) | Pronouns of the user. |
| <a id="userpublicemail"></a>`publicEmail` | [`String`](#string) | User's public email. |
| <a id="usersavedreplies"></a>`savedReplies` | [`SavedReplyConnection`](#savedreplyconnection) | Saved replies authored by the user. Will not return saved replies if `saved_replies` feature flag is disabled. (see [Connections](#connections)) |
| <a id="userstate"></a>`state` | [`UserState!`](#userstate) | State of the user. |
@@ -28130,6 +28589,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="userassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after this timestamp. |
| <a id="userassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before this timestamp. |
| <a id="userassignedmergerequestsdraft"></a>`draft` | [`Boolean`](#boolean) | Limit result to draft merge requests. |
+| <a id="userassignedmergerequestsgroupid"></a>`groupId` | [`GroupID`](#groupid) | The global ID of the group the authored merge requests should be in. Merge requests in subgroups are included. |
| <a id="userassignedmergerequestsiids"></a>`iids` | [`[String!]`](#string) | Array of IIDs of merge requests, for example `[1, 2]`. |
| <a id="userassignedmergerequestslabels"></a>`labels` | [`[String!]`](#string) | Array of label names. All resolved merge requests will have all of these labels. |
| <a id="userassignedmergerequestsmergedafter"></a>`mergedAfter` | [`Time`](#time) | Merge requests merged after this date. |
@@ -28165,6 +28625,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="userauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after this timestamp. |
| <a id="userauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before this timestamp. |
| <a id="userauthoredmergerequestsdraft"></a>`draft` | [`Boolean`](#boolean) | Limit result to draft merge requests. |
+| <a id="userauthoredmergerequestsgroupid"></a>`groupId` | [`GroupID`](#groupid) | The global ID of the group the authored merge requests should be in. Merge requests in subgroups are included. |
| <a id="userauthoredmergerequestsiids"></a>`iids` | [`[String!]`](#string) | Array of IIDs of merge requests, for example `[1, 2]`. |
| <a id="userauthoredmergerequestslabels"></a>`labels` | [`[String!]`](#string) | Array of label names. All resolved merge requests will have all of these labels. |
| <a id="userauthoredmergerequestsmergedafter"></a>`mergedAfter` | [`Time`](#time) | Merge requests merged after this date. |
@@ -28218,6 +28679,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="userreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after this timestamp. |
| <a id="userreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before this timestamp. |
| <a id="userreviewrequestedmergerequestsdraft"></a>`draft` | [`Boolean`](#boolean) | Limit result to draft merge requests. |
+| <a id="userreviewrequestedmergerequestsgroupid"></a>`groupId` | [`GroupID`](#groupid) | The global ID of the group the authored merge requests should be in. Merge requests in subgroups are included. |
| <a id="userreviewrequestedmergerequestsiids"></a>`iids` | [`[String!]`](#string) | Array of IIDs of merge requests, for example `[1, 2]`. |
| <a id="userreviewrequestedmergerequestslabels"></a>`labels` | [`[String!]`](#string) | Array of label names. All resolved merge requests will have all of these labels. |
| <a id="userreviewrequestedmergerequestsmergedafter"></a>`mergedAfter` | [`Time`](#time) | Merge requests merged after this date. |
@@ -28338,6 +28800,8 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="userworkspacesids"></a>`ids` | [`[RemoteDevelopmentWorkspaceID!]`](#remotedevelopmentworkspaceid) | Array of global workspace IDs. For example, `["gid://gitlab/RemoteDevelopment::Workspace/1"]`. |
+| <a id="userworkspacesincludeactualstates"></a>`includeActualStates` | [`[String!]`](#string) | Includes all workspaces that match any of the actual states. |
+| <a id="userworkspacesprojectids"></a>`projectIds` | [`[ProjectID!]`](#projectid) | Filter workspaces by project id. |
#### `WorkItemWidget`
@@ -28382,7 +28846,8 @@ see the associated mutation type above.
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="aichatinputcontent"></a>`content` | [`String!`](#string) | Content of the message. |
-| <a id="aichatinputresourceid"></a>`resourceId` | [`AiModelID!`](#aimodelid) | Global ID of the resource to mutate. |
+| <a id="aichatinputnamespaceid"></a>`namespaceId` | [`NamespaceID`](#namespaceid) | Global ID of the namespace the user is acting on. |
+| <a id="aichatinputresourceid"></a>`resourceId` | [`AiModelID`](#aimodelid) | Global ID of the resource to mutate. |
### `AiExplainCodeInput`
@@ -28408,6 +28873,7 @@ see the associated mutation type above.
| Name | Type | Description |
| ---- | ---- | ----------- |
+| <a id="aiexplainvulnerabilityinputincludesourcecode"></a>`includeSourceCode` | [`Boolean`](#boolean) | Include vulnerablility source code in the AI prompt. |
| <a id="aiexplainvulnerabilityinputresourceid"></a>`resourceId` | [`AiModelID!`](#aimodelid) | Global ID of the resource to mutate. |
### `AiFillInMergeRequestTemplateInput`
@@ -28494,7 +28960,7 @@ Field that are available while modifying the custom mapping attributes for an HT
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="boardissueinputassigneeusername"></a>`assigneeUsername` | [`[String]`](#string) | Filter by assignee username. |
-| <a id="boardissueinputassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee wildcard. Incompatible with assigneeUsername. |
+| <a id="boardissueinputassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee wildcard. Incompatible with assigneeUsername and assigneeUsernames. |
| <a id="boardissueinputauthorusername"></a>`authorUsername` | [`String`](#string) | Filter by author username. |
| <a id="boardissueinputconfidential"></a>`confidential` | [`Boolean`](#boolean) | Filter by confidentiality. |
| <a id="boardissueinputepicid"></a>`epicId` | [`EpicID`](#epicid) | Filter by epic ID. Incompatible with epicWildcardId. |
@@ -28564,6 +29030,16 @@ Attributes for defining a CI/CD variable.
| <a id="complianceframeworkinputname"></a>`name` | [`String`](#string) | New name for the compliance framework. |
| <a id="complianceframeworkinputpipelineconfigurationfullpath"></a>`pipelineConfigurationFullPath` | [`String`](#string) | Full path of the compliance pipeline configuration stored in a project repository, such as `.gitlab/.compliance-gitlab-ci.yml@compliance/hipaa` **(ULTIMATE)**. |
+### `ComplianceStandardsAdherenceInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="compliancestandardsadherenceinputcheckname"></a>`checkName` | [`ComplianceStandardsAdherenceCheckName`](#compliancestandardsadherencecheckname) | Name of the check for the compliance standard. |
+| <a id="compliancestandardsadherenceinputprojectids"></a>`projectIds` | [`[ProjectID!]`](#projectid) | Filter compliance standards adherence by project. |
+| <a id="compliancestandardsadherenceinputstandard"></a>`standard` | [`ComplianceStandardsAdherenceStandard`](#compliancestandardsadherencestandard) | Name of the compliance standard. |
+
### `ComplianceViolationInput`
#### Arguments
@@ -28855,6 +29331,8 @@ Attributes for the pipeline schedule variable.
| Name | Type | Description |
| ---- | ---- | ----------- |
+| <a id="pipelineschedulevariableinputdestroy"></a>`destroy` | [`Boolean`](#boolean) | Boolean option to destroy the variable. |
+| <a id="pipelineschedulevariableinputid"></a>`id` | [`CiPipelineScheduleVariableID`](#cipipelineschedulevariableid) | ID of the variable to mutate. |
| <a id="pipelineschedulevariableinputkey"></a>`key` | [`String!`](#string) | Name of the variable. |
| <a id="pipelineschedulevariableinputvalue"></a>`value` | [`String!`](#string) | Value of the variable. |
| <a id="pipelineschedulevariableinputvariabletype"></a>`variableType` | [`CiVariableType!`](#civariabletype) | Type of the variable. |
@@ -29169,7 +29647,7 @@ A time-frame defined as a closed inclusive range of two dates.
| Name | Type | Description |
| ---- | ---- | ----------- |
-| <a id="workitemwidgetprogressinputprogress"></a>`progress` | [`Int!`](#int) | Progress of the work item. |
+| <a id="workitemwidgetprogressinputcurrentvalue"></a>`currentValue` | [`Int!`](#int) | Current progress value of the work item. |
### `WorkItemWidgetStartAndDueDateUpdateInput`
diff --git a/doc/api/group_access_tokens.md b/doc/api/group_access_tokens.md
index 446aa3668d8..2493dfcc039 100644
--- a/doc/api/group_access_tokens.md
+++ b/doc/api/group_access_tokens.md
@@ -81,7 +81,8 @@ curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/a
## Create a group access token
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/77236) in GitLab 14.7.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/77236) in GitLab 14.7.
+> - The `expires_at` attribute default was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/120213) in GitLab 16.0.
Create a [group access token](../user/group/settings/group_access_tokens.md). You must have the Owner role for the
group to create group access tokens.
@@ -96,7 +97,7 @@ POST groups/:id/access_tokens
| `name` | String | yes | Name of the group access token |
| `scopes` | `Array[String]` | yes | [List of scopes](../user/group/settings/group_access_tokens.md#scopes-for-a-group-access-token) |
| `access_level` | Integer | no | Access level. Valid values are `10` (Guest), `20` (Reporter), `30` (Developer), `40` (Maintainer), and `50` (Owner). |
-| `expires_at` | Date | no | Token expires at midnight UTC on that date |
+| `expires_at` | Date | yes | Expiration date of the access token in ISO format (`YYYY-MM-DD`). The date cannot be set later than the [maximum allowable lifetime of an access token](../user/profile/personal_access_tokens.md#when-personal-access-tokens-expire). |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
diff --git a/doc/api/group_import_export.md b/doc/api/group_import_export.md
index a409b2e3a11..314fb63058c 100644
--- a/doc/api/group_import_export.md
+++ b/doc/api/group_import_export.md
@@ -93,8 +93,8 @@ returns either:
The maximum import file size can be set by the Administrator on self-managed instances (default is `0` (unlimited)).
As an administrator, you can modify the maximum import file size either:
-- The admin [Admin Area](../user/admin_area/settings/account_and_limit_settings.md).
-- The `max_import_size` option in the [Application settings API](settings.md#change-application-settings).
+- In the [Admin Area](../administration/settings/account_and_limit_settings.md).
+- By using the `max_import_size` option in the [Application settings API](settings.md#change-application-settings).
For information on the maximum import file size on GitLab.com, see
[Account and limit settings](../user/gitlab_com/index.md#account-and-limit-settings).
diff --git a/doc/api/group_level_variables.md b/doc/api/group_level_variables.md
index 921a9922c9b..08fb9e55f32 100644
--- a/doc/api/group_level_variables.md
+++ b/doc/api/group_level_variables.md
@@ -6,8 +6,6 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Group-level Variables API **(FREE)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/34519) in GitLab 9.5
-
## List group variables
Get list of a group's variables.
@@ -16,9 +14,9 @@ Get list of a group's variables.
GET /groups/:id/variables
```
-| Attribute | Type | required | Description |
-|-----------|---------|----------|---------------------|
-| `id` | integer/string | yes | The ID of a group or [URL-encoded path of the group](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
+| Attribute | Type | Required | Description |
+|-----------|----------------|----------|-------------|
+| `id` | integer/string | Yes | The ID of a group or [URL-encoded path of the group](rest/index.md#namespaced-path-encoding) |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/1/variables"
@@ -33,7 +31,8 @@ curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/a
"protected": false,
"masked": false,
"raw": false,
- "environment_scope": "*"
+ "environment_scope": "*",
+ "description": null
},
{
"key": "TEST_VARIABLE_2",
@@ -42,7 +41,8 @@ curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/a
"protected": false,
"masked": false,
"raw": false,
- "environment_scope": "*"
+ "environment_scope": "*",
+ "description": null
}
]
```
@@ -55,10 +55,10 @@ Get the details of a group's specific variable.
GET /groups/:id/variables/:key
```
-| Attribute | Type | required | Description |
-|-----------|---------|----------|-----------------------|
-| `id` | integer/string | yes | The ID of a group or [URL-encoded path of the group](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
-| `key` | string | yes | The `key` of a variable |
+| Attribute | Type | Required | Description |
+|-----------|----------------|----------|-------------|
+| `id` | integer/string | Yes | The ID of a group or [URL-encoded path of the group](rest/index.md#namespaced-path-encoding) |
+| `key` | string | Yes | The `key` of a variable |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/1/variables/TEST_VARIABLE_1"
@@ -72,7 +72,8 @@ curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/a
"protected": false,
"masked": false,
"raw": false,
- "environment_scope": "*"
+ "environment_scope": "*",
+ "description": null
}
```
@@ -84,16 +85,17 @@ Create a new variable.
POST /groups/:id/variables
```
-| Attribute | Type | required | Description |
-|-----------------|---------|----------|-----------------------|
-| `id` | integer/string | yes | The ID of a group or [URL-encoded path of the group](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
-| `key` | string | yes | The `key` of a variable; must have no more than 255 characters; only `A-Z`, `a-z`, `0-9`, and `_` are allowed |
-| `value` | string | yes | The `value` of a variable |
-| `variable_type` | string | no | The type of a variable. Available types are: `env_var` (default) and `file` |
-| `protected` | boolean | no | Whether the variable is protected |
-| `masked` | boolean | no | Whether the variable is masked |
-| `raw` | boolean | no | Whether the variable is treated as a raw string. Default: `false`. When `true`, variables in the value are not [expanded](../ci/variables/index.md#prevent-cicd-variable-expansion). |
-| `environment_scope` **(PREMIUM)** | string | no | The [environment scope](../ci/environments/index.md#limit-the-environment-scope-of-a-cicd-variable) of a variable |
+| Attribute | Type | Required | Description |
+|-----------------------------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | The ID of a group or [URL-encoded path of the group](rest/index.md#namespaced-path-encoding) |
+| `key` | string | Yes | The `key` of a variable; must have no more than 255 characters; only `A-Z`, `a-z`, `0-9`, and `_` are allowed |
+| `value` | string | Yes | The `value` of a variable |
+| `variable_type` | string | No | The type of a variable. Available types are: `env_var` (default) and `file` |
+| `protected` | boolean | No | Whether the variable is protected |
+| `masked` | boolean | No | Whether the variable is masked |
+| `raw` | boolean | No | Whether the variable is treated as a raw string. Default: `false`. When `true`, variables in the value are not [expanded](../ci/variables/index.md#prevent-cicd-variable-expansion). |
+| `environment_scope` **(PREMIUM)** | string | No | The [environment scope](../ci/environments/index.md#limit-the-environment-scope-of-a-cicd-variable) of a variable |
+| `description` | string | No | The `description` of the variable. Default: `null` |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
@@ -108,7 +110,8 @@ curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
"protected": false,
"masked": false,
"raw": false,
- "environment_scope": "*"
+ "environment_scope": "*",
+ "description": null
}
```
@@ -120,16 +123,17 @@ Update a group's variable.
PUT /groups/:id/variables/:key
```
-| Attribute | Type | required | Description |
-|-----------------|---------|----------|-------------------------|
-| `id` | integer/string | yes | The ID of a group or [URL-encoded path of the group](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
-| `key` | string | yes | The `key` of a variable |
-| `value` | string | yes | The `value` of a variable |
-| `variable_type` | string | no | The type of a variable. Available types are: `env_var` (default) and `file` |
-| `protected` | boolean | no | Whether the variable is protected |
-| `masked` | boolean | no | Whether the variable is masked |
-| `raw` | boolean | no | Whether the variable is treated as a raw string. Default: `false`. When `true`, variables in the value are not [expanded](../ci/variables/index.md#prevent-cicd-variable-expansion). |
-| `environment_scope` **(PREMIUM)** | string | no | The [environment scope](../ci/environments/index.md#limit-the-environment-scope-of-a-cicd-variable) of a variable |
+| Attribute | Type | Required | Description |
+|-----------------------------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | The ID of a group or [URL-encoded path of the group](rest/index.md#namespaced-path-encoding) |
+| `key` | string | Yes | The `key` of a variable |
+| `value` | string | Yes | The `value` of a variable |
+| `variable_type` | string | No | The type of a variable. Available types are: `env_var` (default) and `file` |
+| `protected` | boolean | No | Whether the variable is protected |
+| `masked` | boolean | No | Whether the variable is masked |
+| `raw` | boolean | No | Whether the variable is treated as a raw string. Default: `false`. When `true`, variables in the value are not [expanded](../ci/variables/index.md#prevent-cicd-variable-expansion). |
+| `environment_scope` **(PREMIUM)** | string | No | The [environment scope](../ci/environments/index.md#limit-the-environment-scope-of-a-cicd-variable) of a variable |
+| `description` | string | No | The description of the variable. Default: `null`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/409641) in GitLab 16.2. |
```shell
curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" \
@@ -144,7 +148,8 @@ curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" \
"protected": true,
"masked": true,
"raw": true,
- "environment_scope": "*"
+ "environment_scope": "*",
+ "description": null
}
```
@@ -156,10 +161,10 @@ Remove a group's variable.
DELETE /groups/:id/variables/:key
```
-| Attribute | Type | required | Description |
-|-----------|---------|----------|-------------------------|
-| `id` | integer/string | yes | The ID of a group or [URL-encoded path of the group](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
-| `key` | string | yes | The `key` of a variable |
+| Attribute | Type | Required | Description |
+|-----------|----------------|----------|-------------|
+| `id` | integer/string | Yes | The ID of a group or [URL-encoded path of the group](rest/index.md#namespaced-path-encoding) |
+| `key` | string | Yes | The `key` of a variable |
```shell
curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" \
diff --git a/doc/api/group_protected_branches.md b/doc/api/group_protected_branches.md
index db42ca98f0e..c017d0741ce 100644
--- a/doc/api/group_protected_branches.md
+++ b/doc/api/group_protected_branches.md
@@ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/110603) in GitLab 15.9 [with a flag](../administration/feature_flags.md) named `group_protected_branches`. Disabled by default.
FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to [enable the feature flag](../administration/feature_flags.md) named `group_protected_branches`.
+On self-managed GitLab, by default this feature is not available. To make it available, an administrator can [enable the feature flag](../administration/feature_flags.md) named `group_protected_branches`.
On GitLab.com, this feature is not available.
## Valid access levels
diff --git a/doc/api/group_relations_export.md b/doc/api/group_relations_export.md
index 3721e712dd9..8e8eb05b6b9 100644
--- a/doc/api/group_relations_export.md
+++ b/doc/api/group_relations_export.md
@@ -8,11 +8,13 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59978) in GitLab 13.12.
-The group relations export API partially exports a group's structure as separate files for each top-level
+The group relations export API partially exports a group's structure as separate files for each
+top-level
relation (for example, milestones, boards, and labels).
The group relations export API is primarily used in
-[group migration by direct transfer](../user/group/import/index.md#migrate-groups-by-direct-transfer-recommended) and
+[group migration by direct transfer](../user/group/import/index.md#migrate-groups-by-direct-transfer-recommended)
+and
can't be used with the [group import and export API](group_import_export.md).
## Schedule new export
@@ -23,9 +25,10 @@ Start a new group relations export:
POST /groups/:id/export_relations
```
-| Attribute | Type | Required | Description |
-| --------- | -------------- | -------- | ---------------------------------------- |
+| Attribute | Type | Required | Description |
+|-----------|----------------|----------|--------------------------------------------------|
| `id` | integer/string | yes | ID of the group owned by the authenticated user. |
+| `batched` | boolean | no | Whether to export in batches. |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/1/export_relations"
@@ -45,9 +48,10 @@ View the status of the relations export:
GET /groups/:id/export_relations/status
```
-| Attribute | Type | Required | Description |
-| --------- | -------------- | -------- | ---------------------------------------- |
-| `id` | integer/string | yes | ID of the group owned by the authenticated user. |
+| Attribute | Type | Required | Description |
+|------------|----------------|----------|--------------------------------------------------|
+| `id` | integer/string | yes | ID of the group owned by the authenticated user. |
+| `relation` | string | no | Name of the project top-level relation to view. |
```shell
curl --request GET --header "PRIVATE-TOKEN: <your_access_token>" \
@@ -70,13 +74,24 @@ The status can be one of the following:
"relation": "badges",
"status": 1,
"error": null,
- "updated_at": "2021-05-04T11:25:20.423Z"
+ "updated_at": "2021-05-04T11:25:20.423Z",
+ "batched": true,
+ "batches": [
+ {
+ "status": 1,
+ "batch_number": 1,
+ "objects_count": 1,
+ "error": null,
+ "updated_at": "2021-05-04T11:25:20.423Z"
+ }
+ ]
},
{
"relation": "boards",
"status": 1,
"error": null,
- "updated_at": "2021-05-04T11:25:20.085Z"
+ "updated_at": "2021-05-04T11:25:20.085Z",
+ "batched": false
}
]
```
@@ -89,10 +104,12 @@ Download the finished relations export:
GET /groups/:id/export_relations/download
```
-| Attribute | Type | Required | Description |
-| --------------- | -------------- | -------- | ---------------------------------------- |
-| `id` | integer/string | yes | ID of the group owned by the authenticated user. |
-| `relation` | string | yes | Name of the group top-level relation to download. |
+| Attribute | Type | Required | Description |
+|----------------|----------------|----------|---------------------------------------------------|
+| `id` | integer/string | yes | ID of the group owned by the authenticated user. |
+| `relation` | string | yes | Name of the group top-level relation to download. |
+| `batched` | boolean | no | Whether the export is batched. |
+| `batch_number` | integer | no | Number of export batch to download. |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" --remote-header-name \
diff --git a/doc/api/group_releases.md b/doc/api/group_releases.md
index a735f36eb82..b8d15afcf06 100644
--- a/doc/api/group_releases.md
+++ b/doc/api/group_releases.md
@@ -12,7 +12,7 @@ NOTE:
For more information about the project releases API, see [Releases API](releases/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 `group_releases_finder_inoperator`.
+On self-managed GitLab, by default this feature is not available. To make it available, an administrator can [enable the feature flag](../administration/feature_flags.md) named `group_releases_finder_inoperator`.
## List group releases
diff --git a/doc/api/groups.md b/doc/api/groups.md
index 7b73fe9066e..235ef119e7b 100644
--- a/doc/api/groups.md
+++ b/doc/api/groups.md
@@ -303,6 +303,7 @@ Parameters:
| `simple` | boolean | no | Return only limited fields for each project. This is a no-op without authentication where only simple fields are returned. |
| `owned` | boolean | no | Limit by projects owned by the current user |
| `starred` | boolean | no | Limit by projects starred by the current user |
+| `topic` | string | no | Return projects matching the topic |
| `with_issues_enabled` | boolean | no | Limit by projects with issues feature enabled. Default is `false` |
| `with_merge_requests_enabled` | boolean | no | Limit by projects with merge requests feature enabled. Default is `false` |
| `with_shared` | boolean | no | Include projects shared to this group. Default is `true` |
@@ -822,8 +823,8 @@ Parameters:
| `two_factor_grace_period` | integer | no | Time before Two-factor authentication is enforced (in hours). |
| `visibility` | string | no | The group's visibility. Can be `private`, `internal`, or `public`. |
| `membership_lock` **(PREMIUM)** | boolean | no | Users cannot be added to projects in this group. |
-| `extra_shared_runners_minutes_limit` **(PREMIUM SELF)** | integer | no | Can be set by administrators only. Additional units of compute for this group. |
-| `shared_runners_minutes_limit` **(PREMIUM SELF)** | integer | no | Can be set by administrators only. Maximum number of monthly units of compute for this group. Can be `nil` (default; inherit system default), `0` (unlimited), or `> 0`. |
+| `extra_shared_runners_minutes_limit` **(PREMIUM SELF)** | integer | no | Can be set by administrators only. Additional compute minutes for this group. |
+| `shared_runners_minutes_limit` **(PREMIUM SELF)** | integer | no | Can be set by administrators only. Maximum number of monthly compute minutes for this group. Can be `nil` (default; inherit system default), `0` (unlimited), or `> 0`. |
| `wiki_access_level` **(PREMIUM)** | string | no | The wiki access level. Can be `disabled`, `private`, or `enabled`. |
### Options for `default_branch_protection`
@@ -836,7 +837,7 @@ The `default_branch_protection` attribute determines whether users with the Deve
| `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|
-| `4` | Protected against pushes except initial push. User with the Developer rope can: <br>- Push commit to empty repository.<br> 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|
+| `4` | Protected against pushes except initial push. User with the Developer role can: <br>- Push commit to empty repository.<br> 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
@@ -949,7 +950,7 @@ curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
FLAG:
On self-managed GitLab, by default `unique_project_download_limit`, `unique_project_download_limit_interval_in_seconds`, `unique_project_download_limit_allowlist` and `auto_ban_user_on_excessive_projects_download` are not available.
-To make them available, ask an administrator to [enable the feature flag](../administration/feature_flags.md)
+To make them available, an administrator can [enable the feature flag](../administration/feature_flags.md)
named `limit_unique_project_downloads_per_namespace_user`.
Updates the project group. Only available to group owners and administrators.
@@ -979,11 +980,11 @@ PUT /groups/:id
| `subgroup_creation_level` | string | no | Allowed to [create subgroups](../user/group/subgroups/index.md#create-a-subgroup). Can be `owner` (Owners), or `maintainer` (users with the Maintainer role). |
| `two_factor_grace_period` | integer | no | Time before Two-factor authentication is enforced (in hours). |
| `visibility` | string | no | The visibility level of the group. Can be `private`, `internal`, or `public`. |
-| `extra_shared_runners_minutes_limit` **(PREMIUM SELF)** | integer | no | Can be set by administrators only. Additional units of compute for this group. |
+| `extra_shared_runners_minutes_limit` **(PREMIUM SELF)** | integer | no | Can be set by administrators only. Additional compute minutes for this group. |
| `file_template_project_id` **(PREMIUM)** | integer | no | The ID of a project to load custom file templates from. |
| `membership_lock` **(PREMIUM)** | boolean | no | Users cannot be added to projects in this group. |
| `prevent_forking_outside_group` **(PREMIUM)** | boolean | no | When enabled, users can **not** fork projects from this group to external namespaces. |
-| `shared_runners_minutes_limit` **(PREMIUM SELF)** | integer | no | Can be set by administrators only. Maximum number of monthly units of compute for this group. Can be `nil` (default; inherit system default), `0` (unlimited), or `> 0`. |
+| `shared_runners_minutes_limit` **(PREMIUM SELF)** | integer | no | Can be set by administrators only. Maximum number of monthly compute minutes for this group. Can be `nil` (default; inherit system default), `0` (unlimited), or `> 0`. |
| `unique_project_download_limit` **(ULTIMATE)** | integer | no | Maximum number of unique projects a user can download in the specified time period before they are banned. Available only on top-level groups. Default: 0, Maximum: 10,000. |
| `unique_project_download_limit_interval_in_seconds` **(ULTIMATE)** | integer | no | Time period during which a user can download a maximum amount of projects before they are banned. Available only on top-level groups. Default: 0, Maximum: 864,000 seconds (10 days). |
| `unique_project_download_limit_allowlist` **(ULTIMATE)** | array of strings | no | List of usernames excluded from the unique project download limit. Available only on top-level groups. Default: `[]`, Maximum: 100 usernames. |
@@ -1139,7 +1140,7 @@ Only available to group owners and administrators.
This endpoint:
-- On Premium and Ultimate tiers, marks the group for deletion. The deletion happens 7 days later by default, but you can change the retention period in the [instance settings](../user/admin_area/settings/visibility_and_access_controls.md#deletion-protection).
+- On Premium and Ultimate tiers, marks the group for deletion. The deletion happens 7 days later by default, but you can change the retention period in the [instance settings](../administration/settings/visibility_and_access_controls.md#deletion-protection).
- On Free tier, removes the group immediately and queues a background job to delete all projects in the group.
- Deletes a subgroup immediately if the subgroup is marked for deletion (GitLab 15.4 and later). The endpoint does not immediately delete top-level groups.
@@ -1304,7 +1305,7 @@ POST /groups/:id/service_accounts/:user_id/personal_access_tokens
```
```shell
-curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gdk.test:3443/api/v4/groups/35/service_accounts/71/personal_access_tokens" --data "scopes[]=api" --data "name=service_accounts_token"
+curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/35/service_accounts/71/personal_access_tokens" --data "scopes[]=api" --data "name=service_accounts_token"
```
Example response:
@@ -1333,7 +1334,7 @@ POST /groups/:id/service_accounts/:user_id/personal_access_tokens/:token_id/rota
```
```shell
-curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gdk.test:3443/api/v4/groups/35/service_accounts/71/personal_access_tokens/6/rotate"
+curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/35/service_accounts/71/personal_access_tokens/6/rotate"
```
Example response:
diff --git a/doc/api/import.md b/doc/api/import.md
index be70868cca5..7bbc19cb36a 100644
--- a/doc/api/import.md
+++ b/doc/api/import.md
@@ -26,14 +26,15 @@ Prerequisites:
POST /import/github
```
-| Attribute | Type | Required | Description |
-|-------------------------|---------|----------|-------------------------------------------------------------------------------------|
-| `personal_access_token` | string | yes | GitHub personal access token |
-| `repo_id` | integer | yes | GitHub repository ID |
-| `new_name` | string | no | New repository name |
-| `target_namespace` | string | yes | Namespace to import repository into. Supports subgroups like `/namespace/subgroup`. In GitLab 15.8 and later, must not be blank |
-| `github_hostname` | string | no | Custom GitHub Enterprise hostname. Do not set for GitHub.com. |
-| `optional_stages` | object | no | [Additional items to import](../user/project/import/github.md#select-additional-items-to-import). [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/373705) in GitLab 15.5 |
+| Attribute | Type | Required | Description |
+|----------------------------|---------|----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `personal_access_token` | string | yes | GitHub personal access token |
+| `repo_id` | integer | yes | GitHub repository ID |
+| `new_name` | string | no | New repository name |
+| `target_namespace` | string | yes | Namespace to import repository into. Supports subgroups like `/namespace/subgroup`. In GitLab 15.8 and later, must not be blank |
+| `github_hostname` | string | no | Custom GitHub Enterprise hostname. Do not set for GitHub.com. |
+| `optional_stages` | object | no | [Additional items to import](../user/project/import/github.md#select-additional-items-to-import). [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/373705) in GitLab 15.5 |
+| `additional_access_tokens` | string | no | Additional list of comma-separated personal access tokens. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/337232) in GitLab 16.2 |
```shell
curl --request POST \
@@ -51,7 +52,8 @@ curl --request POST \
"single_endpoint_notes_import": true,
"attachments_import": true,
"collaborators_import": true
- }
+ },
+ "additional_access_tokens": "foo,bar"
}'
```
@@ -64,6 +66,8 @@ The following keys are available for `optional_stages`:
For more information, see [Select additional items to import](../user/project/import/github.md#select-additional-items-to-import).
+You can supply multiple personal access tokens in `additional_access_tokens` from different user accounts to import projects faster.
+
Example response:
```json
diff --git a/doc/api/instance_level_ci_variables.md b/doc/api/instance_level_ci_variables.md
index 840744bcae1..2bf9b209e20 100644
--- a/doc/api/instance_level_ci_variables.md
+++ b/doc/api/instance_level_ci_variables.md
@@ -6,9 +6,6 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Instance-level CI/CD variables API **(FREE SELF)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/14108) in GitLab 13.0
-> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/218249) in GitLab 13.2.
-
## List all instance variables
Get the list of all instance-level variables.
@@ -50,9 +47,9 @@ Get the details of a specific instance-level variable.
GET /admin/ci/variables/:key
```
-| Attribute | Type | required | Description |
-|-----------|---------|----------|-----------------------|
-| `key` | string | yes | The `key` of a variable |
+| Attribute | Type | Required | Description |
+|-----------|---------|----------|-------------|
+| `key` | string | Yes | The `key` of a variable |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/admin/ci/variables/TEST_VARIABLE_1"
@@ -73,20 +70,20 @@ curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/a
Create a new instance-level variable.
-[In GitLab 13.1 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/216097), the maximum number of allowed instance-level variables can be changed.
+The [maximum number of instance-level variables](../administration/instance_limits.md#number-of-instance-level-variables) can be changed.
```plaintext
POST /admin/ci/variables
```
-| Attribute | Type | required | Description |
-|-----------------|---------|----------|-----------------------|
-| `key` | string | yes | The `key` of a variable. Max 255 characters, only `A-Z`, `a-z`, `0-9`, and `_` are allowed. |
-| `value` | string | yes | The `value` of a variable. 10,000 characters allowed ([GitLab 13.3 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/220028)). |
-| `variable_type` | string | no | The type of a variable. Available types are: `env_var` (default) and `file`. |
-| `protected` | boolean | no | Whether the variable is protected. |
-| `masked` | boolean | no | Whether the variable is masked. |
-| `raw` | boolean | no | Whether the variable is expandable. |
+| Attribute | Type | Required | Description |
+|-----------------|---------|----------|-------------|
+| `key` | string | Yes | The `key` of a variable. Maximum of 255 characters, only `A-Z`, `a-z`, `0-9`, and `_` are allowed. |
+| `value` | string | Yes | The `value` of a variable. Maximum of 10,000 characters. |
+| `variable_type` | string | No | The type of a variable. Available types are: `env_var` (default) and `file`. |
+| `protected` | boolean | No | Whether the variable is protected. |
+| `masked` | boolean | No | Whether the variable is masked. |
+| `raw` | boolean | No | Whether the variable is expandable. |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
@@ -112,14 +109,14 @@ Update an instance-level variable.
PUT /admin/ci/variables/:key
```
-| Attribute | Type | required | Description |
-|-----------------|---------|----------|-------------------------|
-| `key` | string | yes | The `key` of a variable. |
-| `value` | string | yes | The `value` of a variable. 10,000 characters allowed ([GitLab 13.3 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/220028)). |
-| `variable_type` | string | no | The type of a variable. Available types are: `env_var` (default) and `file`. |
-| `protected` | boolean | no | Whether the variable is protected. |
-| `masked` | boolean | no | Whether the variable is masked. |
-| `raw` | boolean | no | Whether the variable is expandable. |
+| Attribute | Type | Required | Description |
+|-----------------|---------|----------|-------------|
+| `key` | string | Yes | The `key` of a variable. Maximum of 255 characters, only `A-Z`, `a-z`, `0-9`, and `_` are allowed. |
+| `value` | string | Yes | The `value` of a variable. Maximum of 10,000 characters. |
+| `variable_type` | string | No | The type of a variable. Available types are: `env_var` (default) and `file`. |
+| `protected` | boolean | No | Whether the variable is protected. |
+| `masked` | boolean | No | Whether the variable is masked. |
+| `raw` | boolean | No | Whether the variable is expandable. |
```shell
curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" \
@@ -145,9 +142,9 @@ Remove an instance-level variable.
DELETE /admin/ci/variables/:key
```
-| Attribute | Type | required | Description |
-|-----------|---------|----------|-------------------------|
-| `key` | string | yes | The `key` of a variable |
+| Attribute | Type | Required | Description |
+|-----------|--------|----------|-------------|
+| `key` | string | Yes | The `key` of a variable |
```shell
curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/admin/ci/variables/VARIABLE_1"
diff --git a/doc/api/issues.md b/doc/api/issues.md
index 03cc107415f..9f9775c1746 100644
--- a/doc/api/issues.md
+++ b/doc/api/issues.md
@@ -1142,7 +1142,7 @@ Please use `iid` of the `epic` attribute instead.
## Rate limits
To help avoid abuse, users can be limited to a specific number of `Create` requests per minute.
-See [Issues rate limits](../user/admin_area/settings/rate_limit_on_issues_creation.md).
+See [Issues rate limits](../administration/settings/rate_limit_on_issues_creation.md).
## Edit issue
diff --git a/doc/api/job_artifacts.md b/doc/api/job_artifacts.md
index afb8f294a18..d8343cb7c44 100644
--- a/doc/api/job_artifacts.md
+++ b/doc/api/job_artifacts.md
@@ -18,9 +18,9 @@ GET /projects/:id/jobs/:job_id/artifacts
| Attribute | Type | Required | Description |
|---------------------------|----------------|----------|-------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
-| `job_id` | integer | yes | ID of a job. |
-| `job_token` **(PREMIUM)** | string | no | To be used with [triggers](../ci/jobs/ci_job_token.md#download-an-artifact-from-a-different-pipeline) for multi-project pipelines. It should be invoked only in a CI/CD job defined in the `.gitlab-ci.yml` file. The value is always `$CI_JOB_TOKEN`. The job associated with the `$CI_JOB_TOKEN` must be running when this token is used. |
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
+| `job_id` | integer | Yes | ID of a job. |
+| `job_token` **(PREMIUM)** | string | No | To be used with [triggers](../ci/jobs/ci_job_token.md#download-an-artifact-from-a-different-pipeline) for multi-project pipelines. It should be invoked only in a CI/CD job defined in the `.gitlab-ci.yml` file. The value is always `$CI_JOB_TOKEN`. The job associated with the `$CI_JOB_TOKEN` must be running when this token is used. |
Example request using the `PRIVATE-TOKEN` header:
@@ -82,10 +82,10 @@ Parameters
| Attribute | Type | Required | Description |
|---------------------------|----------------|----------|-------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
-| `ref_name` | string | yes | Branch or tag name in repository. HEAD or SHA references are not supported. |
-| `job` | string | yes | The name of the job. |
-| `job_token` **(PREMIUM)** | string | no | To be used with [triggers](../ci/jobs/ci_job_token.md#download-an-artifact-from-a-different-pipeline) for multi-project pipelines. It should be invoked only in a CI/CD job defined in the `.gitlab-ci.yml` file. The value is always `$CI_JOB_TOKEN`. The job associated with the `$CI_JOB_TOKEN` must be running when this token is used. |
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
+| `ref_name` | string | Yes | Branch or tag name in repository. HEAD or SHA references are not supported. |
+| `job` | string | Yes | The name of the job. |
+| `job_token` **(PREMIUM)** | string | No | To be used with [triggers](../ci/jobs/ci_job_token.md#download-an-artifact-from-a-different-pipeline) for multi-project pipelines. It should be invoked only in a CI/CD job defined in the `.gitlab-ci.yml` file. The value is always `$CI_JOB_TOKEN`. The job associated with the `$CI_JOB_TOKEN` must be running when this token is used. |
Example request using the `PRIVATE-TOKEN` header:
@@ -128,9 +128,6 @@ Possible response status codes:
## Download a single artifact file by job ID
-> - Introduced in GitLab 10.0.
-> - The use of `CI_JOB_TOKEN` in the artifacts download API was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55042) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.10.
-
Download a single artifact file from a job with a specified ID from inside
the job's artifacts zipped archive. The file is extracted from the archive and
streamed to the client.
@@ -143,10 +140,10 @@ Parameters
| Attribute | Type | Required | Description |
|---------------------------|----------------|----------|-------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
-| `job_id` | integer | yes | The unique job identifier. |
-| `artifact_path` | string | yes | Path to a file inside the artifacts archive. |
-| `job_token` **(PREMIUM)** | string | no | To be used with [triggers](../ci/jobs/ci_job_token.md#download-an-artifact-from-a-different-pipeline) for multi-project pipelines. It should be invoked only in a CI/CD job defined in the `.gitlab-ci.yml` file. The value is always `$CI_JOB_TOKEN`. The job associated with the `$CI_JOB_TOKEN` must be running when this token is used. |
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
+| `job_id` | integer | Yes | The unique job identifier. |
+| `artifact_path` | string | Yes | Path to a file inside the artifacts archive. |
+| `job_token` **(PREMIUM)** | string | No | To be used with [triggers](../ci/jobs/ci_job_token.md#download-an-artifact-from-a-different-pipeline) for multi-project pipelines. It should be invoked only in a CI/CD job defined in the `.gitlab-ci.yml` file. The value is always `$CI_JOB_TOKEN`. The job associated with the `$CI_JOB_TOKEN` must be running when this token is used. |
Example request:
@@ -164,9 +161,6 @@ Possible response status codes:
## Download a single artifact file from specific tag or branch
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/23538) in GitLab 11.5.
-> - The use of `CI_JOB_TOKEN` in the artifacts download API was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55042) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.10.
-
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.
@@ -174,10 +168,9 @@ 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/downstream_pipelines.md#parent-child-pipelines) are searched in hierarchical
-order from parent to child. For example, if both parent and child pipelines have a
-job with the same name, the artifact from the parent pipeline is returned.
+Artifacts for [parent and child pipelines](../ci/pipelines/downstream_pipelines.md#parent-child-pipelines)
+are searched in hierarchical order from parent to child. For example, if both parent and child pipelines
+have a job with the same name, the artifact from the parent pipeline is returned.
```plaintext
GET /projects/:id/jobs/artifacts/:ref_name/raw/*artifact_path?job=name
@@ -187,11 +180,11 @@ Parameters:
| Attribute | Type | Required | Description |
|---------------------------|----------------|----------|-------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
-| `ref_name` | string | yes | Branch or tag name in repository. `HEAD` or `SHA` references are not supported. |
-| `artifact_path` | string | yes | Path to a file inside the artifacts archive. |
-| `job` | string | yes | The name of the job. |
-| `job_token` **(PREMIUM)** | string | no | To be used with [triggers](../ci/jobs/ci_job_token.md#download-an-artifact-from-a-different-pipeline) for multi-project pipelines. It should be invoked only in a CI/CD job defined in the `.gitlab-ci.yml` file. The value is always `$CI_JOB_TOKEN`. The job associated with the `$CI_JOB_TOKEN` must be running when this token is used. |
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
+| `ref_name` | string | Yes | Branch or tag name in repository. `HEAD` or `SHA` references are not supported. |
+| `artifact_path` | string | Yes | Path to a file inside the artifacts archive. |
+| `job` | string | Yes | The name of the job. |
+| `job_token` **(PREMIUM)** | string | No | To be used with [triggers](../ci/jobs/ci_job_token.md#download-an-artifact-from-a-different-pipeline) for multi-project pipelines. It should be invoked only in a CI/CD job defined in the `.gitlab-ci.yml` file. The value is always `$CI_JOB_TOKEN`. The job associated with the `$CI_JOB_TOKEN` must be running when this token is used. |
Example request:
@@ -217,10 +210,10 @@ POST /projects/:id/jobs/:job_id/artifacts/keep
Parameters
-| Attribute | Type | Required | Description |
-|-----------|----------------|----------|--------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user. |
-| `job_id` | integer | yes | ID of a job. |
+| Attribute | Type | Required | Description |
+|-----------|----------------|----------|-------------|
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user. |
+| `job_id` | integer | Yes | ID of a job. |
Example request:
@@ -264,8 +257,6 @@ Example response:
## Delete job artifacts
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/25522) in GitLab 11.9.
-
Delete artifacts of a job.
Prerequisites:
@@ -276,10 +267,10 @@ Prerequisites:
DELETE /projects/:id/jobs/:job_id/artifacts
```
-| Attribute | Type | Required | Description |
-|-----------|----------------|----------|-----------------------------------------------------------------------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
-| `job_id` | integer | yes | ID of a job. |
+| Attribute | Type | Required | Description |
+|-----------|----------------|----------|-------------|
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
+| `job_id` | integer | Yes | ID of a job. |
Example request:
@@ -305,9 +296,9 @@ By default, [artifacts from the most recent successful pipeline of each ref are
DELETE /projects/:id/artifacts
```
-| Attribute | Type | Required | Description |
-|-----------|----------------|----------|-----------------------------------------------------------------------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
+| Attribute | Type | Required | Description |
+|-----------|----------------|----------|-------------|
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
Example request:
diff --git a/doc/api/jobs.md b/doc/api/jobs.md
index a28acfbd1a1..a48168c8362 100644
--- a/doc/api/jobs.md
+++ b/doc/api/jobs.md
@@ -21,10 +21,10 @@ pagination is recommended when requesting consecutive pages of results.
GET /projects/:id/jobs
```
-| Attribute | Type | Required | Description |
-|-----------|--------------------------------|------------------------|-------------|
-| `id` | integer/string | **{check-circle}** Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user. |
-| `scope` | string **or** array of strings | **{dotted-circle}** No | Scope of jobs to show. Either one of or an array of the following: `created`, `pending`, `running`, `failed`, `success`, `canceled`, `skipped`, `waiting_for_resource`, or `manual`. All jobs are returned if `scope` is not provided. |
+| Attribute | Type | Required | Description |
+|-----------|--------------------------------|----------|-------------|
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
+| `scope` | string **or** array of strings | No | Scope of jobs to show. Either one of or an array of the following: `created`, `pending`, `running`, `failed`, `success`, `canceled`, `skipped`, `waiting_for_resource`, or `manual`. All jobs are returned if `scope` is not provided. |
```shell
curl --globoff --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/jobs?scope[]=pending&scope[]=running"
@@ -172,16 +172,22 @@ Get a list of jobs for a pipeline.
By default, this request returns 20 results at a time because the API results [are paginated](rest/index.md#pagination)
+This endpoint:
+
+- [Returns data for any pipeline](pipelines.md#get-a-single-pipeline) including [child pipelines](../ci/pipelines/downstream_pipelines.md#parent-child-pipelines).
+- Does not return retried jobs in the response by default.
+- Sorts jobs by ID in descending order (newest first).
+
```plaintext
GET /projects/:id/pipelines/:pipeline_id/jobs
```
-| Attribute | Type | Required | Description |
-|-------------------|--------------------------------|------------------------|-------------|
-| `id` | integer/string | **{check-circle}** Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user. |
-| `pipeline_id` | integer | **{check-circle}** Yes | ID of a pipeline. Can also be obtained in CI jobs via the [predefined CI variable](../ci/variables/predefined_variables.md) `CI_PIPELINE_ID`. |
-| `scope` | string **or** array of strings | **{dotted-circle}** No | Scope of jobs to show. Either one of or an array of the following: `created`, `pending`, `running`, `failed`, `success`, `canceled`, `skipped`, `waiting_for_resource`, or `manual`. All jobs are returned if `scope` is not provided. |
-| `include_retried` | boolean | **{dotted-circle}** No | Include retried jobs in the response. Defaults to `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/272627) in GitLab 13.9. |
+| Attribute | Type | Required | Description |
+|-------------------|--------------------------------|----------|-------------|
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
+| `pipeline_id` | integer | Yes | ID of a pipeline. Can also be obtained in CI jobs via the [predefined CI variable](../ci/variables/predefined_variables.md) `CI_PIPELINE_ID`. |
+| `scope` | string **or** array of strings | No | Scope of jobs to show. Either one of or an array of the following: `created`, `pending`, `running`, `failed`, `success`, `canceled`, `skipped`, `waiting_for_resource`, or `manual`. All jobs are returned if `scope` is not provided. |
+| `include_retried` | boolean | No | Include retried jobs in the response. Defaults to `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/272627) in GitLab 13.9. |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/pipelines/6/jobs?scope[]=pending&scope[]=running"
@@ -323,16 +329,6 @@ Example of response
]
```
-In GitLab 13.3 and later, this endpoint [returns data for any pipeline](pipelines.md#get-a-single-pipeline)
-including [child pipelines](../ci/pipelines/downstream_pipelines.md#parent-child-pipelines).
-
-In GitLab 13.5 and later, this endpoint does not return retried jobs in the response
-by default. Additionally, jobs are sorted by ID in descending order (newest first).
-In earlier GitLab versions, jobs are sorted by ID in ascending order (oldest first).
-
-In GitLab 13.9 and later, this endpoint can include retried jobs in the response
-with `include_retried` set to `true`.
-
## List pipeline trigger jobs
Get a list of trigger jobs for a pipeline.
@@ -341,11 +337,11 @@ Get a list of trigger jobs for a pipeline.
GET /projects/:id/pipelines/:pipeline_id/bridges
```
-| Attribute | Type | Required | Description |
-|---------------|--------------------------------|------------------------|-------------|
-| `id` | integer/string | **{check-circle}** Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user. |
-| `pipeline_id` | integer | **{check-circle}** Yes | ID of a pipeline. |
-| `scope` | string **or** array of strings | **{dotted-circle}** No | Scope of jobs to show. Either one of or an array of the following: `created`, `pending`, `running`, `failed`, `success`, `canceled`, `skipped`, `waiting_for_resource`, or `manual`. All jobs are returned if `scope` is not provided. |
+| Attribute | Type | Required | Description |
+|---------------|--------------------------------|----------|-------------|
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
+| `pipeline_id` | integer | Yes | ID of a pipeline. |
+| `scope` | string **or** array of strings | No | Scope of jobs to show. Either one of or an array of the following: `created`, `pending`, `running`, `failed`, `success`, `canceled`, `skipped`, `waiting_for_resource`, or `manual`. All jobs are returned if `scope` is not provided. |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/pipelines/6/bridges?scope[]=pending&scope[]=running"
@@ -425,8 +421,6 @@ Example of response
## Get job token's job
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51727) in GitLab 13.10.
-
Retrieve the job that generated a job token.
```plaintext
@@ -505,8 +499,6 @@ Example of response
## Get GitLab agent by `CI_JOB_TOKEN` **(PREMIUM)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/324269) in GitLab 13.11.
-
Retrieve the job that generated the `CI_JOB_TOKEN`, along with a list of allowed
[agents](../user/clusters/agent/index.md).
@@ -516,9 +508,9 @@ GET /job/allowed_agents
Supported attributes:
-| Attribute | Type | Required | Description |
-|----------------|----------|------------------------|-------------|
-| `CI_JOB_TOKEN` | string | **{check-circle}** Yes | Token value associated with the GitLab-provided `CI_JOB_TOKEN` variable. |
+| Attribute | Type | Required | Description |
+|----------------|--------|----------|-------------|
+| `CI_JOB_TOKEN` | string | Yes | Token value associated with the GitLab-provided `CI_JOB_TOKEN` variable. |
Example request:
@@ -584,10 +576,10 @@ Get a single job of a project
GET /projects/:id/jobs/:job_id
```
-| Attribute | Type | Required | Description |
-|-----------|----------------|------------------------|-------------|
-| `id` | integer/string | **{check-circle}** Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user. |
-| `job_id` | integer | **{check-circle}** Yes | ID of a job. |
+| Attribute | Type | Required | Description |
+|-----------|----------------|----------|-------------|
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
+| `job_id` | integer | Yes | ID of a job. |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/jobs/8"
@@ -665,10 +657,10 @@ Get a log (trace) of a specific job of a project:
GET /projects/:id/jobs/:job_id/trace
```
-| Attribute | Type | Required | Description |
-|-----------|----------------|------------------------|-------------|
-| `id` | integer/string | **{check-circle}** Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user. |
-| `job_id` | integer | **{check-circle}** Yes | ID of a job. |
+| Attribute | Type | Required | Description |
+|-----------|----------------|----------|-------------|
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
+| `job_id` | integer | Yes | ID of a job. |
```shell
curl --location --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/jobs/8/trace"
@@ -689,10 +681,10 @@ Cancel a single job of a project
POST /projects/:id/jobs/:job_id/cancel
```
-| Attribute | Type | Required | Description |
-|-----------|----------------|------------------------|-------------|
-| `id` | integer/string | **{check-circle}** Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user. |
-| `job_id` | integer | **{check-circle}** Yes | ID of a job. |
+| Attribute | Type | Required | Description |
+|-----------|----------------|----------|-------------|
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
+| `job_id` | integer | Yes | ID of a job. |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/jobs/1/cancel"
@@ -743,10 +735,10 @@ Retry a single job of a project
POST /projects/:id/jobs/:job_id/retry
```
-| Attribute | Type | Required | Description |
-|-----------|----------------|------------------------|-------------|
-| `id` | integer/string | **{check-circle}** Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user. |
-| `job_id` | integer | **{check-circle}** Yes | ID of a job. |
+| Attribute | Type | Required | Description |
+|-----------|----------------|----------|-------------|
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
+| `job_id` | integer | Yes | ID of a job. |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/jobs/1/retry"
@@ -799,10 +791,10 @@ POST /projects/:id/jobs/:job_id/erase
Parameters
-| Attribute | Type | Required | Description |
-|-----------|----------------|------------------------|-------------|
-| `id` | integer/string | **{check-circle}** Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user. |
-| `job_id` | integer | **{check-circle}** Yes | ID of a job. |
+| Attribute | Type | Required | Description |
+|-----------|----------------|----------|-------------|
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
+| `job_id` | integer | Yes | ID of a job. |
Example of request
@@ -860,11 +852,11 @@ For a job in manual status, trigger an action to start the job.
POST /projects/:id/jobs/:job_id/play
```
-| Attribute | Type | Required | Description |
-|----------------------------|-----------------|------------------------|-------------|
-| `id` | integer/string | **{check-circle}** Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user. |
-| `job_id` | integer | **{check-circle}** Yes | ID of a job. |
-| `job_variables_attributes` | array of hashes | **{dotted-circle}** No | An array containing the custom variables available to the job. [Introduced in](https://gitlab.com/gitlab-org/gitlab/-/issues/37267) GitLab 14.9. |
+| Attribute | Type | Required | Description |
+|----------------------------|-----------------|----------|-------------|
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
+| `job_id` | integer | Yes | ID of a job. |
+| `job_variables_attributes` | array of hashes | No | An array containing the custom variables available to the job. [Introduced in](https://gitlab.com/gitlab-org/gitlab/-/issues/37267) GitLab 14.9. |
Example request:
diff --git a/doc/api/lint.md b/doc/api/lint.md
index cfd34f6a40c..b0282b89f6e 100644
--- a/doc/api/lint.md
+++ b/doc/api/lint.md
@@ -6,9 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# CI Lint API **(FREE)**
-## Validate a CI YAML configuration with a namespace
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/231352) in GitLab 13.6.
+## Validate the CI/CD configuration for a namespace
Checks if CI/CD YAML configuration is valid. This endpoint has namespace
specific context.
@@ -17,12 +15,12 @@ specific context.
POST /projects/:id/ci/lint
```
-| Attribute | Type | Required | Description |
-| ---------- | ------- | -------- | -------- |
-| `content` | string | yes | The CI/CD configuration content. |
-| `dry_run` | boolean | no | Run [pipeline creation simulation](../ci/lint.md#simulate-a-pipeline), or only do static check. This is false by default. |
-| `include_jobs` | boolean | no | If the list of jobs that would exist in a static check or pipeline simulation should be included in the response. This is false by default. |
-| `ref` | string | no | When `dry_run` is `true`, sets the branch or tag to use. Defaults to the project's default branch when not set. |
+| Attribute | Type | Required | Description |
+|----------------|---------|----------|-------------|
+| `content` | string | Yes | The CI/CD configuration content. |
+| `dry_run` | boolean | No | Run [pipeline creation simulation](../ci/lint.md#simulate-a-pipeline), or only do static check. Default: `false`. |
+| `include_jobs` | boolean | No | If the list of jobs that would exist in a static check or pipeline simulation should be included in the response. Default: `false`. |
+| `ref` | string | No | When `dry_run` is `true`, sets the branch or tag to use. Defaults to the project's default branch when not set. |
Example request:
@@ -58,8 +56,6 @@ Example responses:
## Validate a project's CI configuration
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/231352) in GitLab 13.5.
-
Checks if a project's latest (`HEAD` of the project's default branch)
`.gitlab-ci.yml` configuration is valid. This endpoint uses all namespace
specific data available, including variables and local includes.
@@ -68,11 +64,11 @@ specific data available, including variables and local includes.
GET /projects/:id/ci/lint
```
-| Attribute | Type | Required | Description |
-| ---------- | ------- | -------- | -------- |
-| `dry_run` | boolean | no | Run pipeline creation simulation, or only do static check. |
-| `include_jobs` | boolean | no | If the list of jobs that would exist in a static check or pipeline simulation should be included in the response. This is false by default. |
-| `ref` | string | no | When `dry_run` is `true`, sets the branch or tag to use. Defaults to the project's default branch when not set. |
+| Attribute | Type | Required | Description |
+|----------------|---------|----------|-------------|
+| `dry_run` | boolean | No | Run pipeline creation simulation, or only do static check. |
+| `include_jobs` | boolean | No | If the list of jobs that would exist in a static check or pipeline simulation should be included in the response. Default: `false`. |
+| `ref` | string | No | When `dry_run` is `true`, sets the branch or tag to use. Defaults to the project's default branch when not set. |
Example request:
@@ -112,18 +108,18 @@ Example responses:
WARNING:
This endpoint was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/381669) in GitLab 15.7
-and was [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/403256) in 16.0. Use [`POST /projects/:id/ci/lint`](#validate-a-ci-yaml-configuration-with-a-namespace) instead.
+and was [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/403256) in 16.0. Use [`POST /projects/:id/ci/lint`](#validate-the-cicd-configuration-for-a-namespace) instead.
Checks if CI/CD YAML configuration is valid. This endpoint validates basic CI/CD
configuration syntax. It doesn't have any namespace-specific context.
Access to this endpoint does not require authentication when the instance
-[allows new sign ups](../user/admin_area/settings/sign_up_restrictions.md#disable-new-sign-ups)
+[allows new sign ups](../administration/settings/sign_up_restrictions.md#disable-new-sign-ups)
and:
-- Does not have an [allowlist or denylist](../user/admin_area/settings/sign_up_restrictions.md#allow-or-deny-sign-ups-using-specific-email-domains).
-- Does not [require administrator approval for new sign ups](../user/admin_area/settings/sign_up_restrictions.md#require-administrator-approval-for-new-sign-ups).
-- Does not have additional [sign up restrictions](../user/admin_area/settings/sign_up_restrictions.md).
+- Does not have an [allowlist or denylist](../administration/settings/sign_up_restrictions.md#allow-or-deny-sign-ups-using-specific-email-domains).
+- Does not [require administrator approval for new sign ups](../administration/settings/sign_up_restrictions.md#require-administrator-approval-for-new-sign-ups).
+- Does not have additional [sign up restrictions](../administration/settings/sign_up_restrictions.md).
Otherwise, authentication is required.
@@ -131,11 +127,11 @@ Otherwise, authentication is required.
POST /ci/lint
```
-| Attribute | Type | Required | Description |
-| ---------- | ------- | -------- | -------- |
-| `content` | string | yes | The CI/CD configuration content. |
-| `include_merged_yaml` | boolean | no | If the [expanded CI/CD configuration](#yaml-expansion) should be included in the response. |
-| `include_jobs` | boolean | no | If the list of jobs should be included in the response. This is false by default. |
+| Attribute | Type | Required | Description |
+|-----------------------|---------|----------|-------------|
+| `content` | string | Yes | The CI/CD configuration content. |
+| `include_merged_yaml` | boolean | No | If the [expanded CI/CD configuration](#yaml-expansion) should be included in the response. |
+| `include_jobs` | boolean | No | If the list of jobs should be included in the response. Default: `false`. |
```shell
curl --header "Content-Type: application/json" --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/ci/lint" --data '{"content": "{ \"image\": \"ruby:2.6\", \"services\": [\"postgres\"], \"before_script\": [\"bundle install\", \"bundle exec rake db:create\"], \"variables\": {\"DB_NAME\": \"postgres\"}, \"types\": [\"test\", \"deploy\", \"notify\"], \"rspec\": { \"script\": \"rake spec\", \"tags\": [\"ruby\", \"postgres\"], \"only\": [\"branches\"]}}"}'
@@ -190,8 +186,6 @@ Example responses:
### YAML expansion
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/29568) in GitLab 13.5.
-
The CI lint returns an expanded version of the configuration. The expansion does not
work for CI configuration added with [`include: local`](../ci/yaml/index.md#includelocal),
and the [`extends:`](../ci/yaml/index.md#extends) keyword is [not fully supported](https://gitlab.com/gitlab-org/gitlab/-/issues/258843).
diff --git a/doc/api/markdown.md b/doc/api/markdown.md
index e79b05ac012..42948661cbb 100644
--- a/doc/api/markdown.md
+++ b/doc/api/markdown.md
@@ -16,7 +16,7 @@ Available only in APIv4.
FLAG:
On self-managed GitLab, by default this feature is enabled and authentication is required.
-To remove the requirement to authenticate, ask an administrator to
+To remove the requirement to authenticate, an administrator can
[disable the feature flag](../administration/feature_flags.md) named `authenticate_markdown_api`.
On GitLab.com, this feature is available.
diff --git a/doc/api/merge_request_approvals.md b/doc/api/merge_request_approvals.md
index 19179bddb00..9123fe0dc1e 100644
--- a/doc/api/merge_request_approvals.md
+++ b/doc/api/merge_request_approvals.md
@@ -37,7 +37,7 @@ Supported attributes:
{
"approvers": [], // Deprecated in GitLab 12.3, always returns empty
"approver_groups": [], // Deprecated in GitLab 12.3, always returns empty
- "approvals_before_merge": 2,
+ "approvals_before_merge": 2, // Deprecated in GitLab 12.3, use Approval Rules instead
"reset_approvals_on_push": true,
"selective_code_owner_removals": false,
"disable_overriding_approvers_per_merge_request": false,
@@ -63,7 +63,7 @@ Supported attributes:
| Attribute | Type | Required | Description |
|--------------------------------------------------|-------------------|------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------|
| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of a project](rest/index.md#namespaced-path-encoding). |
-| `approvals_before_merge` (deprecated) | integer | **{dotted-circle}** No | How many approvals are required before a merge request can be merged. [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/11132) in GitLab 12.3. |
+| `approvals_before_merge` (deprecated) | integer | **{dotted-circle}** No | How many approvals are required before a merge request can be merged. [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/11132) in GitLab 12.3. Use [Approval Rules](#create-project-level-rule) instead. |
| `disable_overriding_approvers_per_merge_request` | boolean | **{dotted-circle}** No | Allow or prevent overriding approvers per merge request. |
| `merge_requests_author_approval` | boolean | **{dotted-circle}** No | Allow or prevent authors from self approving merge requests; `true` means authors can self approve. |
| `merge_requests_disable_committers_approval` | boolean | **{dotted-circle}** No | Allow or prevent committers from self approving merge requests. |
@@ -73,7 +73,7 @@ Supported attributes:
```json
{
- "approvals_before_merge": 2,
+ "approvals_before_merge": 2, // Deprecated in GitLab 12.3, use Approval Rules instead
"reset_approvals_on_push": true,
"selective_code_owner_removals": false,
"disable_overriding_approvers_per_merge_request": false,
diff --git a/doc/api/merge_trains.md b/doc/api/merge_trains.md
index c041b01da04..536cf616a88 100644
--- a/doc/api/merge_trains.md
+++ b/doc/api/merge_trains.md
@@ -6,10 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Merge Trains API **(PREMIUM)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/36146) in GitLab 12.9.
-> - Using this API you can consume [Merge Train](../ci/pipelines/merge_trains.md) entries.
-
-Every API call to merge trains must be authenticated with at lease the Developer [role](../user/permissions.md).
+Every API call for [merge train](../ci/pipelines/merge_trains.md) must be authenticated with at lease the Developer [role](../user/permissions.md).
If a user is not a member of a project and the project is private, a `GET` request on that project returns a `404` status code.
@@ -31,11 +28,11 @@ GET /projects/:id/merge_trains
GET /projects/:id/merge_trains?scope=complete
```
-| Attribute | Type | Required | Description |
-| ------------------- | ---------------- | ---------- | --------------------------------------------------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
-| `scope` | string | no | Return Merge Trains filtered by the given scope. Available scopes are `active` (to be merged) and `complete` (have been merged). |
-| `sort` | string | no | Return Merge Trains sorted in `asc` or `desc` order. Default is `desc`. |
+| Attribute | Type | Required | Description |
+|-----------|----------------|----------|-------------|
+| `id` | integer/string | Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
+| `scope` | string | No | Return Merge Trains filtered by the given scope. Available scopes are `active` (to be merged) and `complete` (have been merged). |
+| `sort` | string | No | Return Merge Trains sorted in `asc` or `desc` order. Default: `desc`. |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/merge_trains"
@@ -95,12 +92,12 @@ GET /projects/:id/merge_trains/:target_branch
Supported attributes:
-| Attribute | Type | Required | Description |
-| --------------- | ---------------| -------- | ------------ |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
-| `target_branch` | string | yes | The target branch of the merge train. |
-| `scope` | string | no | Return Merge Trains filtered by the given scope. Available scopes are `active` (to be merged) and `complete` (have been merged). |
-| `sort` | string | no | Return Merge Trains sorted in `asc` or `desc` order. Default is `desc`. |
+| Attribute | Type | Required | Description |
+|-----------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
+| `target_branch` | string | Yes | The target branch of the merge train. |
+| `scope` | string | No | Return Merge Trains filtered by the given scope. Available scopes are `active` (to be merged) and `complete` (have been merged). |
+| `sort` | string | No | Return Merge Trains sorted in `asc` or `desc` order. Default: `desc`. |
Example request:
@@ -165,10 +162,10 @@ GET /projects/:id/merge_trains/merge_requests/:merge_request_iid
Supported attributes:
-| Attribute | Type | Required | Description |
-| ------------------- | -------------- | -------- | ------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
-| `merge_request_iid` | integer | yes | The internal ID of the merge request. |
+| Attribute | Type | Required | Description |
+|---------------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
+| `merge_request_iid` | integer | Yes | The internal ID of the merge request. |
Example request:
@@ -231,13 +228,13 @@ POST /projects/:id/merge_trains/merge_requests/:merge_request_iid
Supported attributes:
-| Attribute | Type | Required | Description |
-| ------------------------------ | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
-| `merge_request_iid` | integer | yes | The internal ID of the merge request. |
-| `when_pipeline_succeeds` | boolean | no | If true, the merge request is added to the merge train when the pipeline succeeds. When false or unspecified, the merge request is added directly to the merge train. |
-| `sha` | string | no | If present, the SHA must match the `HEAD` of the source branch, otherwise the merge fails. |
-| `squash` | boolean | no | If true, the commits are squashed into a single commit on merge. |
+| Attribute | Type | Required | Description |
+|--------------------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
+| `merge_request_iid` | integer | Yes | The internal ID of the merge request. |
+| `when_pipeline_succeeds` | boolean | No | If true, the merge request is added to the merge train when the pipeline succeeds. When false or unspecified, the merge request is added directly to the merge train. |
+| `sha` | string | No | If present, the SHA must match the `HEAD` of the source branch, otherwise the merge fails. |
+| `squash` | boolean | No | If true, the commits are squashed into a single commit on merge. |
Example request:
diff --git a/doc/api/notes.md b/doc/api/notes.md
index 41b4ab7fd9a..ab8abc0973f 100644
--- a/doc/api/notes.md
+++ b/doc/api/notes.md
@@ -39,7 +39,7 @@ Read more on [pagination](rest/index.md#pagination).
## Rate limits
To help avoid abuse, you can limit your users to a specific number of `Create` request per minute.
-See [Notes rate limits](../user/admin_area/settings/rate_limit_on_notes_creation.md).
+See [Notes rate limits](../administration/settings/rate_limit_on_notes_creation.md).
## Issues
diff --git a/doc/api/openapi/openapi.yaml b/doc/api/openapi/openapi.yaml
index e090eab1e5d..d89e33a916b 100644
--- a/doc/api/openapi/openapi.yaml
+++ b/doc/api/openapi/openapi.yaml
@@ -1,14 +1,7 @@
-openapi: 3.0.0
-tags:
- - name: metadata
- description: Metadata of the GitLab instance
- - name: version
- description: Version
- - name: access_requests
- description: Access requests for projects and groups
- - name: access_tokens
- description: Access tokens for projects
+openapi: 3.0.1
info:
+ title: GitLab API
+ version: v4
description: |
An OpenAPI definition for the GitLab REST API.
Few API resources or endpoints are currently included.
@@ -20,680 +13,3599 @@ info:
The feature uses the current [GitLab session cookie](https://docs.gitlab.com/ee/api/index.html#session-cookie),
so each request is made using your account.
- Instructions for using this tool can be found in [Interactive API Documentation](https://docs.gitlab.com/ee/api/openapi/openapi_interactive.html).
-
- version: v4
- title: GitLab API
+ Instructions for using this tool can be found in [Interactive API Documentation](https://docs.gitlab.com/ee/api/openapi/openapi_interactive.html)
termsOfService: 'https://about.gitlab.com/terms/'
license:
name: CC BY-SA 4.0
url: 'https://gitlab.com/gitlab-org/gitlab/-/blob/master/LICENSE'
servers:
- - url: 'https://gitlab.com/api/'
+- url: https://www.gitlab.com/api/
security:
- ApiKeyAuth: []
-
-components:
- securitySchemes:
- ApiKeyAuth:
- type: apiKey
- in: header
- name: Private-Token
-
+tags:
+- name: badges
+ description: Operations about badges
+- name: branches
+ description: Operations about branches
+- name: alert_management
+ description: Operations about alert_managements
+- name: batched_background_migrations
+ description: Operations about batched_background_migrations
+- name: admin
+ description: Operations about admins
+- name: migrations
+ description: Operations about migrations
+- name: applications
+ description: Operations about applications
+- name: avatar
+ description: Operations about avatars
+- name: broadcast_messages
+ description: Operations about broadcast_messages
+- name: bulk_imports
+ description: Operations about bulk_imports
+- name: application
+ description: Operations about applications
+- name: access_requests
+ description: Operations related to access requests
+- name: ci_lint
+ description: Operations related to linting a CI config file
+- name: ci_resource_groups
+ description: Operations to manage job concurrency with resource groups
+- name: ci_variables
+ description: Operations related to CI/CD variables
+- name: cluster_agents
+ description: Operations related to the GitLab agent for Kubernetes
+- name: clusters
+ description: Operations related to clusters
+- name: composer_packages
+ description: Operations related to Composer packages
+- name: conan_packages
+ description: Operations related to Conan packages
+- name: container_registry
+ description: Operations related to container registry
+- name: container_registry_event
+ description: Operations related to container registry events
+- name: dashboard_annotations
+ description: Operations related to dashboard annotations
+- name: debian_distribution
+ description: Operations related to Debian Linux distributions
+- name: debian_packages
+ description: Operations related to Debian Linux packages
+- name: dependency_proxy
+ description: Operations to manage dependency proxy for a groups
+- name: deploy_keys
+ description: Operations related to deploy keys
+- name: deploy_tokens
+ description: Operations related to deploy tokens
+- name: deployments
+ description: Operations related to deployments
+- name: dora_metrics
+ description: Operations related to DevOps Research and Assessment (DORA) key metrics
+- name: environments
+ description: Operations related to environments
+- name: error_tracking_client_keys
+ description: Operations related to error tracking client keys
+- name: error_tracking_project_settings
+ description: Operations related to error tracking project settings
+- name: feature_flags_user_lists
+ description: Operations related to accessing GitLab feature flag user lists
+- name: feature_flags
+ description: Operations related to feature flags
+- name: features
+ description: Operations related to managing Flipper-based feature flags
+- name: freeze_periods
+ description: Operations related to deploy freeze periods
+- name: generic_packages
+ description: Operations related to Generic packages
+- name: geo
+ description: Operations related to Geo
+- name: geo_nodes
+ description: Operations related Geo Nodes
+- name: go_proxy
+ description: Operations related to Go Proxy
+- name: group_export
+ description: Operations related to exporting groups
+- name: group_import
+ description: Operations related to importing groups
+- name: group_packages
+ description: Operations related to group packages
+- name: helm_packages
+ description: Operations related to Helm packages
+- name: integrations
+ description: Operations related to integrations
+- name: issue_links
+ description: Operations related to issue links
+- name: jira_connect_subscriptions
+ description: Operations related to JiraConnect subscriptions
+- name: maven_packages
+ description: Operations related to Maven packages
+- name: merge_requests
+ description: Operations related to merge requests
+- name: metadata
+ description: Operations related to metadata of the GitLab instance
+- name: metrics_user_starred_dashboards
+ description: Operations related to User-starred metrics dashboards
+- name: ml_model_registry
+ description: Operations related to Model registry
+- name: npm_packages
+ description: Operations related to NPM packages
+- name: nuget_packages
+ description: Operations related to Nuget packages
+- name: package_files
+ description: Operations about package files
+- name: plan_limits
+ description: Operations related to plan limits
+- name: project_export
+ description: Operations related to exporting projects
+- name: project_hooks
+ description: Operations related to project hooks
+- name: project_import
+ description: Operations related to importing projects
+- name: project_import_bitbucket
+ description: Operations related to importing BitBucket projects
+- name: project_import_github
+ description: Operations related to importing GitHub projects
+- name: project_packages
+ description: Operations related to project packages
+- name: projects
+ description: Operations related to projects
+- name: protected environments
+ description: Operations related to protected environments
+- name: pypi_packages
+ description: Operations related to PyPI packages
+- name: release_links
+ description: Operations related to release assets (links)
+- name: releases
+ description: Operations related to releases
+- name: resource_milestone_events
+ description: Operations about resource milestone events
+- name: rpm_packages
+ description: Operations related to RPM packages
+- name: rubygem_packages
+ description: Operations related to RubyGems
+- name: suggestions
+ description: Operations related to suggestions
+- name: system_hooks
+ description: Operations related to system hooks
+- name: terraform_state
+ description: Operations related to Terraform state files
+- name: terraform_registry
+ description: Operations related to the Terraform module registry
+- name: unleash_api
+ description: Operations related to Unleash API
paths:
- # METADATA
- /v4/metadata:
- $ref: '#/metadata'
-
- # VERSION
- /v4/version:
- $ref: '#/version'
-
- # ACCESS REQUESTS (PROJECTS)
- /v4/projects/{id}/access_requests:
- $ref: '#/accessRequestsProjects'
-
- /v4/projects/{id}/access_requests/{user_id}/approve:
- $ref: '#/accessRequestsProjectsApprove'
-
- /v4/projects/{id}/access_requests/{user_id}:
- $ref: '#/accessRequestsProjectsDeny'
-
- # ACCESS REQUESTS (GROUPS)
- /v4/groups/{id}/access_requests:
- $ref: '#/accessRequestsGroups'
-
- /v4/groups/{id}/access_requests/{user_id}/approve:
- $ref: '#/accessRequestsGroupsApprove'
-
- /v4/groups/{id}/access_requests/{user_id}:
- $ref: '#/accessRequestsGroupsDeny'
-
- # ACCESS REQUESTS (PROJECTS)
- /v4/projects/{id}/access_tokens:
- $ref: '#/accessTokens'
-
- /v4/projects/{id}/access_tokens/{token_id}:
- $ref: '#/accessTokensRevoke'
-
-metadata:
- get:
- tags:
- - metadata
- summary: 'Retrieve metadata information for this GitLab instance.'
- operationId: 'getMetadata'
- responses:
- '401':
- description: 'unauthorized operation'
- '200':
- description: 'successful operation'
+ /api/v4/groups/{id}/badges/{badge_id}:
+ get:
+ tags:
+ - badges
+ summary: Gets a badge of a group.
+ description: This feature was introduced in GitLab 10.6.
+ operationId: getApiV4GroupsIdBadgesBadgeId
+ parameters:
+ - name: id
+ in: path
+ description: The ID or URL-encoded path of the group owned by the authenticated
+ user.
+ required: true
+ schema:
+ type: string
+ - name: badge_id
+ in: path
+ description: The badge ID
+ required: true
+ schema:
+ type: integer
+ format: int32
+ responses:
+ 200:
+ description: Gets a badge of a group.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_Badge'
+ put:
+ tags:
+ - badges
+ summary: Updates a badge of a group.
+ description: This feature was introduced in GitLab 10.6.
+ operationId: putApiV4GroupsIdBadgesBadgeId
+ parameters:
+ - name: id
+ in: path
+ description: The ID or URL-encoded path of the group owned by the authenticated
+ user.
+ required: true
+ schema:
+ type: string
+ - name: badge_id
+ in: path
+ required: true
+ schema:
+ type: integer
+ format: int32
+ requestBody:
content:
- 'application/json':
+ application/json:
schema:
- title: 'MetadataResponse'
- type: 'object'
properties:
- version:
- type: 'string'
- revision:
- type: 'string'
- kas:
- type: 'object'
- properties:
- enabled:
- type: 'boolean'
- externalUrl:
- type: 'string'
- nullable: true
- version:
- type: 'string'
- nullable: true
- examples:
- Example:
- value:
- version: '15.0-pre'
- revision: 'c401a659d0c'
- kas:
- enabled: true
- externalUrl: 'grpc://gitlab.example.com:8150'
- version: '15.0.0'
-
-version:
- get:
- tags:
- - version
- summary: 'Retrieve version information for this GitLab instance.'
- operationId: 'getVersion'
- responses:
- '401':
- description: 'unauthorized operation'
- '200':
- description: 'successful operation'
+ link_url:
+ type: string
+ description: URL of the badge link
+ image_url:
+ type: string
+ description: URL of the badge image
+ name:
+ type: string
+ description: Name for the badge
+ responses:
+ 200:
+ description: Updates a badge of a group.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_Badge'
+ delete:
+ tags:
+ - badges
+ summary: Removes a badge from the group.
+ description: This feature was introduced in GitLab 10.6.
+ operationId: deleteApiV4GroupsIdBadgesBadgeId
+ parameters:
+ - name: id
+ in: path
+ description: The ID or URL-encoded path of the group owned by the authenticated
+ user.
+ required: true
+ schema:
+ type: string
+ - name: badge_id
+ in: path
+ description: The badge ID
+ required: true
+ schema:
+ type: integer
+ format: int32
+ responses:
+ 204:
+ description: Removes a badge from the group.
+ content: {}
+ /api/v4/groups/{id}/badges:
+ get:
+ tags:
+ - badges
+ summary: Gets a list of group badges viewable by the authenticated user.
+ description: This feature was introduced in GitLab 10.6.
+ operationId: getApiV4GroupsIdBadges
+ parameters:
+ - name: id
+ in: path
+ description: The ID or URL-encoded path of the group owned by the authenticated
+ user.
+ required: true
+ schema:
+ type: string
+ - name: page
+ in: query
+ description: Current page number
+ schema:
+ type: integer
+ format: int32
+ default: 1
+ - name: per_page
+ in: query
+ description: Number of items per page
+ schema:
+ type: integer
+ format: int32
+ default: 20
+ - name: name
+ in: query
+ description: Name for the badge
+ schema:
+ type: string
+ responses:
+ 200:
+ description: Gets a list of group badges viewable by the authenticated user.
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/API_Entities_Badge'
+ post:
+ tags:
+ - badges
+ summary: Adds a badge to a group.
+ description: This feature was introduced in GitLab 10.6.
+ operationId: postApiV4GroupsIdBadges
+ parameters:
+ - name: id
+ in: path
+ description: The ID or URL-encoded path of the group owned by the authenticated
+ user.
+ required: true
+ schema:
+ type: string
+ requestBody:
content:
- 'application/json':
+ application/json:
schema:
- title: 'VersionResponse'
- type: 'object'
+ required:
+ - image_url
+ - link_url
properties:
- version:
- type: 'string'
- revision:
- type: 'string'
- examples:
- Example:
- value:
- version: '13.3.0-pre'
- revision: 'f2b05afebb0'
-
-#/v4/projects/{id}/access_requests
-accessRequestsProjects:
- get:
- description: Lists access requests for a project
- summary: List access requests for a project
- operationId: accessRequestsProjects_get
- tags:
+ link_url:
+ type: string
+ description: URL of the badge link
+ image_url:
+ type: string
+ description: URL of the badge image
+ name:
+ type: string
+ description: Name for the badge
+ required: true
+ responses:
+ 201:
+ description: Adds a badge to a group.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_Badge'
+ /api/v4/groups/{id}/badges/render:
+ get:
+ tags:
+ - badges
+ summary: Preview a badge from a group.
+ description: This feature was introduced in GitLab 10.6.
+ operationId: getApiV4GroupsIdBadgesRender
+ parameters:
+ - name: id
+ in: path
+ description: The ID or URL-encoded path of the group owned by the authenticated
+ user.
+ required: true
+ schema:
+ type: string
+ - name: link_url
+ in: query
+ description: URL of the badge link
+ required: true
+ schema:
+ type: string
+ - name: image_url
+ in: query
+ description: URL of the badge image
+ required: true
+ schema:
+ type: string
+ responses:
+ 200:
+ description: Preview a badge from a group.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_BasicBadgeDetails'
+ /api/v4/groups/{id}/access_requests/{user_id}:
+ delete:
+ tags:
+ - access_requests
+ summary: Denies an access request for the given user.
+ description: This feature was introduced in GitLab 8.11.
+ operationId: deleteApiV4GroupsIdAccessRequestsUserId
+ parameters:
+ - name: id
+ in: path
+ description: The ID or URL-encoded path of the group owned by the authenticated
+ user
+ required: true
+ schema:
+ type: string
+ - name: user_id
+ in: path
+ description: The user ID of the access requester
+ required: true
+ schema:
+ type: integer
+ format: int32
+ responses:
+ 204:
+ description: Denies an access request for the given user.
+ content: {}
+ /api/v4/groups/{id}/access_requests/{user_id}/approve:
+ put:
+ tags:
- access_requests
- parameters:
+ summary: Approves an access request for the given user.
+ description: This feature was introduced in GitLab 8.11.
+ operationId: putApiV4GroupsIdAccessRequestsUserIdApprove
+ parameters:
- name: id
in: path
- description: The ID or URL-encoded path of the project owned by the authenticated user.
+ description: The ID or URL-encoded path of the group owned by the authenticated
+ user
+ required: true
+ schema:
+ type: string
+ - name: user_id
+ in: path
+ description: The user ID of the access requester
required: true
schema:
- oneOf:
- - type: integer
- - type: string
- responses:
- '401':
- description: Unauthorized operation
- '200':
- description: Successful operation
+ type: integer
+ format: int32
+ requestBody:
content:
application/json:
schema:
- title: ProjectAccessResponse
- type: object
properties:
- id:
+ access_level:
type: integer
- usename:
- type: string
- name:
- type: string
- state:
- type: string
- created_at:
- type: string
- requested_at:
- type: string
- example:
- - 'id': 1
- 'username': 'raymond_smith'
- 'name': 'Raymond Smith'
- 'state': 'active'
- 'created_at': '2012-10-22T14:13:35Z'
- 'requested_at': '2012-10-22T14:13:35Z'
- - 'id': 2
- 'username': 'john_doe'
- 'name': 'John Doe'
- 'state': 'active'
- 'created_at': '2012-10-22T14:13:35Z'
- 'requested_at': '2012-10-22T14:13:35Z'
- post:
- description: Requests access for the authenticated user to a project
- summary: Requests access for the authenticated user to a project
- operationId: accessRequestsProjects_post
- tags:
+ description: 'A valid access level (defaults: `30`, the Developer
+ role)'
+ format: int32
+ default: 30
+ responses:
+ 200:
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_AccessRequester'
+ successfull_response:
+ example:
+ id: 1
+ username: raymond_smith
+ name: Raymond Smith
+ state: active
+ created_at: 2012-10-22T14:13:35Z
+ access_level: 20
+ /api/v4/groups/{id}/access_requests:
+ get:
+ tags:
+ - access_requests
+ summary: Gets a list of access requests for a group.
+ description: This feature was introduced in GitLab 8.11.
+ operationId: getApiV4GroupsIdAccessRequests
+ parameters:
+ - name: id
+ in: path
+ description: The ID or URL-encoded path of the group owned by the authenticated
+ user
+ required: true
+ schema:
+ type: string
+ - name: page
+ in: query
+ description: Current page number
+ schema:
+ type: integer
+ format: int32
+ default: 1
+ - name: per_page
+ in: query
+ description: Number of items per page
+ schema:
+ type: integer
+ format: int32
+ default: 20
+ responses:
+ 200:
+ description: Gets a list of access requests for a group.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_AccessRequester'
+ post:
+ tags:
- access_requests
- parameters:
+ summary: Requests access for the authenticated user to a group.
+ description: This feature was introduced in GitLab 8.11.
+ operationId: postApiV4GroupsIdAccessRequests
+ parameters:
+ - name: id
+ in: path
+ description: The ID or URL-encoded path of the group owned by the authenticated
+ user
+ required: true
+ schema:
+ type: string
+ responses:
+ 200:
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_AccessRequester'
+ successfull_response:
+ example:
+ id: 1
+ username: raymond_smith
+ name: Raymond Smith
+ state: active
+ created_at: 2012-10-22T14:13:35Z
+ access_level: 20
+ /api/v4/projects/{id}/repository/merged_branches:
+ delete:
+ tags:
+ - branches
+ description: Delete all merged branches
+ operationId: deleteApiV4ProjectsIdRepositoryMergedBranches
+ parameters:
+ - name: id
+ in: path
+ description: The ID or URL-encoded path of the project
+ required: true
+ schema:
+ type: string
+ responses:
+ 202:
+ description: 202 Accepted
+ content: {}
+ 404:
+ description: 404 Project Not Found
+ content: {}
+ /api/v4/projects/{id}/repository/branches/{branch}:
+ get:
+ tags:
+ - branches
+ description: Get a single repository branch
+ operationId: getApiV4ProjectsIdRepositoryBranchesBranch
+ parameters:
+ - name: id
+ in: path
+ description: The ID or URL-encoded path of the project
+ required: true
+ schema:
+ type: string
+ - name: branch
+ in: path
+ required: true
+ schema:
+ type: integer
+ format: int32
+ responses:
+ 200:
+ description: Get a single repository branch
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_Branch'
+ 404:
+ description: Branch Not Found
+ content: {}
+ delete:
+ tags:
+ - branches
+ description: Delete a branch
+ operationId: deleteApiV4ProjectsIdRepositoryBranchesBranch
+ parameters:
+ - name: id
+ in: path
+ description: The ID or URL-encoded path of the project
+ required: true
+ schema:
+ type: string
+ - name: branch
+ in: path
+ description: The name of the branch
+ required: true
+ schema:
+ type: string
+ responses:
+ 204:
+ description: Delete a branch
+ content: {}
+ 404:
+ description: Branch Not Found
+ content: {}
+ head:
+ tags:
+ - branches
+ description: Check if a branch exists
+ operationId: headApiV4ProjectsIdRepositoryBranchesBranch
+ parameters:
+ - name: id
+ in: path
+ description: The ID or URL-encoded path of the project
+ required: true
+ schema:
+ type: string
+ - name: branch
+ in: path
+ description: The name of the branch
+ required: true
+ schema:
+ type: string
+ responses:
+ 204:
+ description: No Content
+ content: {}
+ 404:
+ description: Not Found
+ content: {}
+ /api/v4/projects/{id}/repository/branches:
+ get:
+ tags:
+ - branches
+ description: Get a project repository branches
+ operationId: getApiV4ProjectsIdRepositoryBranches
+ parameters:
+ - name: id
+ in: path
+ description: The ID or URL-encoded path of the project
+ required: true
+ schema:
+ type: string
+ - name: page
+ in: query
+ description: Current page number
+ schema:
+ type: integer
+ format: int32
+ default: 1
+ - name: per_page
+ in: query
+ description: Number of items per page
+ schema:
+ type: integer
+ format: int32
+ default: 20
+ - name: search
+ in: query
+ description: Return list of branches matching the search criteria
+ schema:
+ type: string
+ - name: regex
+ in: query
+ description: Return list of branches matching the regex
+ schema:
+ type: string
+ - name: sort
+ in: query
+ description: Return list of branches sorted by the given field
+ schema:
+ type: string
+ enum:
+ - name_asc
+ - updated_asc
+ - updated_desc
+ - name: page_token
+ in: query
+ description: Name of branch to start the pagination from
+ schema:
+ type: string
+ responses:
+ 200:
+ description: Get a project repository branches
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/API_Entities_Branch'
+ 404:
+ description: 404 Project Not Found
+ content: {}
+ post:
+ tags:
+ - branches
+ description: Create branch
+ operationId: postApiV4ProjectsIdRepositoryBranches
+ parameters:
- name: id
in: path
- description: The ID or URL-encoded path of the project owned by the authenticated user.
+ description: The ID or URL-encoded path of the project
required: true
schema:
- oneOf:
- - type: integer
- - type: string
- responses:
- '401':
- description: Unauthorized operation
- '200':
- description: Successful operation
+ type: string
+ requestBody:
content:
application/json:
schema:
- title: ProjectAccessRequest
- type: object
+ required:
+ - branch
+ - ref
properties:
- id:
- type: integer
- usename:
+ branch:
type: string
- name:
+ description: The name of the branch
+ ref:
type: string
- state:
+ description: Create branch from commit sha or existing branch
+ required: true
+ responses:
+ 201:
+ description: Create branch
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_Branch'
+ 400:
+ description: Failed to create branch
+ content: {}
+ /api/v4/projects/{id}/repository/branches/{branch}/unprotect:
+ put:
+ tags:
+ - branches
+ description: Unprotect a single branch
+ operationId: putApiV4ProjectsIdRepositoryBranchesBranchUnprotect
+ parameters:
+ - name: id
+ in: path
+ description: The ID or URL-encoded path of the project
+ required: true
+ schema:
+ type: string
+ - name: branch
+ in: path
+ description: The name of the branch
+ required: true
+ schema:
+ type: string
+ responses:
+ 200:
+ description: Unprotect a single branch
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_Branch'
+ 404:
+ description: 404 Project Not Found
+ content: {}
+ /api/v4/projects/{id}/repository/branches/{branch}/protect:
+ put:
+ tags:
+ - branches
+ description: Protect a single branch
+ operationId: putApiV4ProjectsIdRepositoryBranchesBranchProtect
+ parameters:
+ - name: id
+ in: path
+ description: The ID or URL-encoded path of the project
+ required: true
+ schema:
+ type: string
+ - name: branch
+ in: path
+ description: The name of the branch
+ required: true
+ schema:
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ properties:
+ developers_can_push:
+ type: boolean
+ description: Flag if developers can push to that branch
+ developers_can_merge:
+ type: boolean
+ description: Flag if developers can merge to that branch
+ responses:
+ 200:
+ description: Protect a single branch
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_Branch'
+ 404:
+ description: 404 Branch Not Found
+ content: {}
+ /api/v4/projects/{id}/badges/{badge_id}:
+ get:
+ tags:
+ - badges
+ summary: Gets a badge of a project.
+ description: This feature was introduced in GitLab 10.6.
+ operationId: getApiV4ProjectsIdBadgesBadgeId
+ parameters:
+ - name: id
+ in: path
+ description: The ID or URL-encoded path of the project owned by the authenticated
+ user.
+ required: true
+ schema:
+ type: string
+ - name: badge_id
+ in: path
+ description: The badge ID
+ required: true
+ schema:
+ type: integer
+ format: int32
+ responses:
+ 200:
+ description: Gets a badge of a project.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_Badge'
+ put:
+ tags:
+ - badges
+ summary: Updates a badge of a project.
+ description: This feature was introduced in GitLab 10.6.
+ operationId: putApiV4ProjectsIdBadgesBadgeId
+ parameters:
+ - name: id
+ in: path
+ description: The ID or URL-encoded path of the project owned by the authenticated
+ user.
+ required: true
+ schema:
+ type: string
+ - name: badge_id
+ in: path
+ required: true
+ schema:
+ type: integer
+ format: int32
+ requestBody:
+ content:
+ application/json:
+ schema:
+ properties:
+ link_url:
type: string
- created_at:
+ description: URL of the badge link
+ image_url:
type: string
- requested_at:
+ description: URL of the badge image
+ name:
type: string
- example:
- 'id': 1
- 'username': 'raymond_smith'
- 'name': 'Raymond Smith'
- 'state': 'active'
- 'created_at': '2012-10-22T14:13:35Z'
- 'requested_at': '2012-10-22T14:13:35Z'
-
-#/v4/projects/{id}/access_requests/{user_id}/approve
-accessRequestsProjectsApprove:
- put:
- description: Approves access for the authenticated user to a project
- summary: Approves access for the authenticated user to a project
- operationId: accessRequestsProjectsApprove_put
- tags:
- - access_requests
- parameters:
+ description: Name for the badge
+ responses:
+ 200:
+ description: Updates a badge of a project.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_Badge'
+ delete:
+ tags:
+ - badges
+ summary: Removes a badge from the project.
+ description: This feature was introduced in GitLab 10.6.
+ operationId: deleteApiV4ProjectsIdBadgesBadgeId
+ parameters:
- name: id
in: path
- description: The ID or URL-encoded path of the project owned by the authenticated user.
+ description: The ID or URL-encoded path of the project owned by the authenticated
+ user.
required: true
schema:
- oneOf:
- - type: integer
- - type: string
- - name: user_id
+ type: string
+ - name: badge_id
in: path
- description: The userID of the access requester
+ description: The badge ID
required: true
schema:
type: integer
- - name: access_level
+ format: int32
+ responses:
+ 204:
+ description: Removes a badge from the project.
+ content: {}
+ /api/v4/projects/{id}/badges:
+ get:
+ tags:
+ - badges
+ summary: Gets a list of project badges viewable by the authenticated user.
+ description: This feature was introduced in GitLab 10.6.
+ operationId: getApiV4ProjectsIdBadges
+ parameters:
+ - name: id
+ in: path
+ description: The ID or URL-encoded path of the project owned by the authenticated
+ user.
+ required: true
+ schema:
+ type: string
+ - name: page
in: query
- description: A valid project access level. 0 = no access , 10 = guest, 20 = reporter, 30 = developer, 40 = Maintainer. Default is 30.'
- required: false
+ description: Current page number
schema:
- enum: [0, 10, 20, 30, 40]
- default: 30
type: integer
- responses:
- '401':
- description: Unauthorized operation
- '200':
- description: Successful operation
+ format: int32
+ default: 1
+ - name: per_page
+ in: query
+ description: Number of items per page
+ schema:
+ type: integer
+ format: int32
+ default: 20
+ - name: name
+ in: query
+ description: Name for the badge
+ schema:
+ type: string
+ responses:
+ 200:
+ description: Gets a list of project badges viewable by the authenticated
+ user.
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/API_Entities_Badge'
+ post:
+ tags:
+ - badges
+ summary: Adds a badge to a project.
+ description: This feature was introduced in GitLab 10.6.
+ operationId: postApiV4ProjectsIdBadges
+ parameters:
+ - name: id
+ in: path
+ description: The ID or URL-encoded path of the project owned by the authenticated
+ user.
+ required: true
+ schema:
+ type: string
+ requestBody:
content:
application/json:
schema:
- title: ProjectAccessApprove
- type: object
+ required:
+ - image_url
+ - link_url
properties:
- id:
- type: integer
- usename:
+ link_url:
type: string
- name:
- type: string
- state:
+ description: URL of the badge link
+ image_url:
type: string
- created_at:
+ description: URL of the badge image
+ name:
type: string
- access_level:
- type: integer
- example:
- 'id': 1
- 'username': 'raymond_smith'
- 'name': 'Raymond Smith'
- 'state': 'active'
- 'created_at': '2012-10-22T14:13:35Z'
- 'access_level': 20
-
-#/v4/projects/{id}/access_requests/{user_id}
-accessRequestsProjectsDeny:
- delete:
- description: Denies a project access request for the given user
- summary: Denies a project access request for the given user
- operationId: accessRequestProjectsDeny_delete
- tags:
+ description: Name for the badge
+ required: true
+ responses:
+ 201:
+ description: Adds a badge to a project.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_Badge'
+ /api/v4/projects/{id}/badges/render:
+ get:
+ tags:
+ - badges
+ summary: Preview a badge from a project.
+ description: This feature was introduced in GitLab 10.6.
+ operationId: getApiV4ProjectsIdBadgesRender
+ parameters:
+ - name: id
+ in: path
+ description: The ID or URL-encoded path of the project owned by the authenticated
+ user.
+ required: true
+ schema:
+ type: string
+ - name: link_url
+ in: query
+ description: URL of the badge link
+ required: true
+ schema:
+ type: string
+ - name: image_url
+ in: query
+ description: URL of the badge image
+ required: true
+ schema:
+ type: string
+ responses:
+ 200:
+ description: Preview a badge from a project.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_BasicBadgeDetails'
+ /api/v4/projects/{id}/access_requests/{user_id}:
+ delete:
+ tags:
- access_requests
- parameters:
+ summary: Denies an access request for the given user.
+ description: This feature was introduced in GitLab 8.11.
+ operationId: deleteApiV4ProjectsIdAccessRequestsUserId
+ parameters:
- name: id
in: path
- description: The ID or URL-encoded path of the project owned by the authenticated user.
+ description: The ID or URL-encoded path of the project owned by the authenticated
+ user
required: true
schema:
- oneOf:
- - type: integer
- - type: string
+ type: string
- name: user_id
in: path
description: The user ID of the access requester
required: true
schema:
type: integer
- responses: # Does anything go here? Markdown doc does not list a response.
- '401':
- description: Unauthorized operation
- '200':
- description: Successful operation
-
-#/v4/groups/{id}/access_requests
-accessRequestsGroups:
- get:
- description: List access requests for a group
- summary: List access requests for a group
- operationId: accessRequestsGroups_get
- tags:
+ format: int32
+ responses:
+ 204:
+ description: Denies an access request for the given user.
+ content: {}
+ /api/v4/projects/{id}/access_requests/{user_id}/approve:
+ put:
+ tags:
- access_requests
- parameters:
+ summary: Approves an access request for the given user.
+ description: This feature was introduced in GitLab 8.11.
+ operationId: putApiV4ProjectsIdAccessRequestsUserIdApprove
+ parameters:
- name: id
in: path
- description: The ID or URL-encoded path of the group owned by the authenticated user.
+ description: The ID or URL-encoded path of the project owned by the authenticated
+ user
+ required: true
+ schema:
+ type: string
+ - name: user_id
+ in: path
+ description: The user ID of the access requester
required: true
schema:
- oneOf:
- - type: integer
- - type: string
- responses:
- '401':
- description: Unauthorized operation
- '200':
- description: Successful operation
+ type: integer
+ format: int32
+ requestBody:
content:
application/json:
schema:
- title: GroupAccessResponse
- type: object
properties:
- id:
+ access_level:
type: integer
- usename:
- type: string
- name:
- type: string
- state:
- type: string
- created_at:
- type: string
- requested_at:
- type: string
- example:
- - 'id': 1
- 'username': 'raymond_smith'
- 'name': 'Raymond Smith'
- 'state': 'active'
- 'created_at': '2012-10-22T14:13:35Z'
- 'requested_at': '2012-10-22T14:13:35Z'
- - 'id': 2
- 'username': 'john_doe'
- 'name': 'John Doe'
- 'state': 'active'
- 'created_at': '2012-10-22T14:13:35Z'
- 'requested_at': '2012-10-22T14:13:35Z'
- post:
- description: Requests access for the authenticated user to a group
- summary: Requests access for the authenticated user to a group
- operationId: accessRequestsGroups_post
- tags:
+ description: 'A valid access level (defaults: `30`, the Developer
+ role)'
+ format: int32
+ default: 30
+ responses:
+ 200:
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_AccessRequester'
+ successfull_response:
+ example:
+ id: 1
+ username: raymond_smith
+ name: Raymond Smith
+ state: active
+ created_at: 2012-10-22T14:13:35Z
+ access_level: 20
+ /api/v4/projects/{id}/access_requests:
+ get:
+ tags:
- access_requests
- parameters:
+ summary: Gets a list of access requests for a project.
+ description: This feature was introduced in GitLab 8.11.
+ operationId: getApiV4ProjectsIdAccessRequests
+ parameters:
- name: id
in: path
- description: The ID or URL-encoded path of the group owned by the authenticated user.
+ description: The ID or URL-encoded path of the project owned by the authenticated
+ user
required: true
schema:
- oneOf:
- - type: integer
- - type: string
- responses:
- '401':
- description: Unauthorized operation
- '200':
- description: Successful operation
+ type: string
+ - name: page
+ in: query
+ description: Current page number
+ schema:
+ type: integer
+ format: int32
+ default: 1
+ - name: per_page
+ in: query
+ description: Number of items per page
+ schema:
+ type: integer
+ format: int32
+ default: 20
+ responses:
+ 200:
+ description: Gets a list of access requests for a project.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_AccessRequester'
+ post:
+ tags:
+ - access_requests
+ summary: Requests access for the authenticated user to a project.
+ description: This feature was introduced in GitLab 8.11.
+ operationId: postApiV4ProjectsIdAccessRequests
+ parameters:
+ - name: id
+ in: path
+ description: The ID or URL-encoded path of the project owned by the authenticated
+ user
+ required: true
+ schema:
+ type: string
+ responses:
+ 200:
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_AccessRequester'
+ successfull_response:
+ example:
+ id: 1
+ username: raymond_smith
+ name: Raymond Smith
+ state: active
+ created_at: 2012-10-22T14:13:35Z
+ access_level: 20
+ /api/v4/projects/{id}/alert_management_alerts/{alert_iid}/metric_images/{metric_image_id}:
+ put:
+ tags:
+ - alert_management
+ description: Update a metric image for an alert
+ operationId: putApiV4ProjectsIdAlertManagementAlertsAlertIidMetricImagesMetricImageId
+ parameters:
+ - name: id
+ in: path
+ description: The ID or URL-encoded path of the project
+ required: true
+ schema:
+ type: string
+ - name: alert_iid
+ in: path
+ description: The IID of the Alert
+ required: true
+ schema:
+ type: integer
+ format: int32
+ - name: metric_image_id
+ in: path
+ description: The ID of metric image
+ required: true
+ schema:
+ type: integer
+ format: int32
+ requestBody:
content:
- application/json:
+ multipart/form-data:
schema:
- title: GroupAccessRequest
- type: object
properties:
- id:
- type: integer
- usename:
+ url:
type: string
- name:
+ description: The url to view more metric info
+ url_text:
type: string
- state:
+ description: A description of the image or URL
+ responses:
+ 200:
+ description: Update a metric image for an alert
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_MetricImage'
+ 403:
+ description: Forbidden
+ content: {}
+ 422:
+ description: Unprocessable entity
+ content: {}
+ delete:
+ tags:
+ - alert_management
+ description: Remove a metric image for an alert
+ operationId: deleteApiV4ProjectsIdAlertManagementAlertsAlertIidMetricImagesMetricImageId
+ parameters:
+ - name: id
+ in: path
+ description: The ID or URL-encoded path of the project
+ required: true
+ schema:
+ type: string
+ - name: alert_iid
+ in: path
+ description: The IID of the Alert
+ required: true
+ schema:
+ type: integer
+ format: int32
+ - name: metric_image_id
+ in: path
+ description: The ID of metric image
+ required: true
+ schema:
+ type: integer
+ format: int32
+ responses:
+ 204:
+ description: Remove a metric image for an alert
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_MetricImage'
+ 403:
+ description: Forbidden
+ content: {}
+ 422:
+ description: Unprocessable entity
+ content: {}
+ /api/v4/projects/{id}/alert_management_alerts/{alert_iid}/metric_images:
+ get:
+ tags:
+ - alert_management
+ description: Metric Images for alert
+ operationId: getApiV4ProjectsIdAlertManagementAlertsAlertIidMetricImages
+ parameters:
+ - name: id
+ in: path
+ description: The ID or URL-encoded path of the project
+ required: true
+ schema:
+ type: string
+ - name: alert_iid
+ in: path
+ description: The IID of the Alert
+ required: true
+ schema:
+ type: integer
+ format: int32
+ responses:
+ 200:
+ description: Metric Images for alert
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/API_Entities_MetricImage'
+ 404:
+ description: Not found
+ content: {}
+ post:
+ tags:
+ - alert_management
+ description: Upload a metric image for an alert
+ operationId: postApiV4ProjectsIdAlertManagementAlertsAlertIidMetricImages
+ parameters:
+ - name: id
+ in: path
+ description: The ID or URL-encoded path of the project
+ required: true
+ schema:
+ type: string
+ - name: alert_iid
+ in: path
+ description: The IID of the Alert
+ required: true
+ schema:
+ type: integer
+ format: int32
+ requestBody:
+ content:
+ multipart/form-data:
+ schema:
+ required:
+ - file
+ properties:
+ file:
type: string
- created_at:
+ description: The image file to be uploaded
+ format: binary
+ url:
type: string
- requested_at:
+ description: The url to view more metric info
+ url_text:
type: string
- example:
- 'id': 1
- 'username': 'raymond_smith'
- 'name': 'Raymond Smith'
- 'state': 'active'
- 'created_at': '2012-10-22T14:13:35Z'
- 'requested_at': '2012-10-22T14:13:35Z'
-
-#/v4/groups/{id}/access_requests/{user_id}/approve
-accessRequestsGroupsApprove:
- put:
- description: Approves access for the authenticated user to a group
- summary: Approves access for the authenticated user to a group
- operationId: accessRequestsGroupsApprove_put
- tags:
- - access_requests
- parameters:
+ description: A description of the image or URL
+ required: true
+ responses:
+ 200:
+ description: Upload a metric image for an alert
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_MetricImage'
+ 403:
+ description: Forbidden
+ content: {}
+ /api/v4/projects/{id}/alert_management_alerts/{alert_iid}/metric_images/authorize:
+ post:
+ tags:
+ - alert_management
+ description: Workhorse authorize metric image file upload
+ operationId: postApiV4ProjectsIdAlertManagementAlertsAlertIidMetricImagesAuthorize
+ parameters:
- name: id
in: path
- description: The ID or URL-encoded path of the group owned by the authenticated user.
+ description: The ID or URL-encoded path of the project
required: true
schema:
- oneOf:
- - type: integer
- - type: string
- - name: user_id
+ type: string
+ - name: alert_iid
in: path
- description: The userID of the access requester
+ description: The IID of the Alert
required: true
schema:
type: integer
- - name: access_level
+ format: int32
+ responses:
+ 200:
+ description: Workhorse authorize metric image file upload
+ content: {}
+ 403:
+ description: Forbidden
+ content: {}
+ /api/v4/admin/batched_background_migrations/{id}:
+ get:
+ tags:
+ - batched_background_migrations
+ description: Retrieve a batched background migration
+ operationId: getApiV4AdminBatchedBackgroundMigrationsId
+ parameters:
+ - name: database
in: query
- description: A valid group access level. 0 = no access , 10 = Guest, 20 = Reporter, 30 = Developer, 40 = Maintainer, 50 = Owner. Default is 30.
- required: false
+ description: The name of the database
+ schema:
+ type: string
+ default: main
+ enum:
+ - main
+ - ci
+ - embedding
+ - main_clusterwide
+ - geo
+ - name: id
+ in: path
+ description: The batched background migration id
+ required: true
schema:
- enum: [0, 10, 20, 30, 40, 50]
- default: 30
type: integer
- responses:
- '401':
- description: Unauthorized operation
- '200':
- description: Successful operation
+ format: int32
+ responses:
+ 200:
+ description: Retrieve a batched background migration
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_BatchedBackgroundMigration'
+ 401:
+ description: 401 Unauthorized
+ content: {}
+ 403:
+ description: 403 Forbidden
+ content: {}
+ 404:
+ description: 404 Not found
+ content: {}
+ /api/v4/admin/batched_background_migrations:
+ get:
+ tags:
+ - batched_background_migrations
+ description: Get the list of batched background migrations
+ operationId: getApiV4AdminBatchedBackgroundMigrations
+ parameters:
+ - name: database
+ in: query
+ description: The name of the database, the default `main`
+ schema:
+ type: string
+ default: main
+ enum:
+ - main
+ - ci
+ - embedding
+ - main_clusterwide
+ - geo
+ responses:
+ 200:
+ description: Get the list of batched background migrations
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/API_Entities_BatchedBackgroundMigration'
+ 401:
+ description: 401 Unauthorized
+ content: {}
+ 403:
+ description: 403 Forbidden
+ content: {}
+ /api/v4/admin/batched_background_migrations/{id}/resume:
+ put:
+ tags:
+ - batched_background_migrations
+ description: Resume a batched background migration
+ operationId: putApiV4AdminBatchedBackgroundMigrationsIdResume
+ parameters:
+ - name: id
+ in: path
+ description: The batched background migration id
+ required: true
+ schema:
+ type: integer
+ format: int32
+ requestBody:
content:
application/json:
schema:
- title: GroupAccessApprove
- type: object
properties:
- id:
- type: integer
- usename:
+ database:
type: string
- name:
+ description: The name of the database
+ default: main
+ enum:
+ - main
+ - ci
+ - embedding
+ - main_clusterwide
+ - geo
+ responses:
+ 200:
+ description: Resume a batched background migration
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_BatchedBackgroundMigration'
+ 401:
+ description: 401 Unauthorized
+ content: {}
+ 403:
+ description: 403 Forbidden
+ content: {}
+ 404:
+ description: 404 Not found
+ content: {}
+ 422:
+ description: You can resume only `paused` batched background migrations.
+ content: {}
+ /api/v4/admin/batched_background_migrations/{id}/pause:
+ put:
+ tags:
+ - batched_background_migrations
+ description: Pause a batched background migration
+ operationId: putApiV4AdminBatchedBackgroundMigrationsIdPause
+ parameters:
+ - name: id
+ in: path
+ description: The batched background migration id
+ required: true
+ schema:
+ type: integer
+ format: int32
+ requestBody:
+ content:
+ application/json:
+ schema:
+ properties:
+ database:
type: string
- state:
+ description: The name of the database
+ default: main
+ enum:
+ - main
+ - ci
+ - embedding
+ - main_clusterwide
+ - geo
+ responses:
+ 200:
+ description: Pause a batched background migration
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_BatchedBackgroundMigration'
+ 401:
+ description: 401 Unauthorized
+ content: {}
+ 403:
+ description: 403 Forbidden
+ content: {}
+ 404:
+ description: 404 Not found
+ content: {}
+ 422:
+ description: You can pause only `active` batched background migrations.
+ content: {}
+ /api/v4/admin/ci/variables/{key}:
+ get:
+ tags:
+ - ci_variables
+ description: Get the details of a specific instance-level variable
+ operationId: getApiV4AdminCiVariablesKey
+ parameters:
+ - name: key
+ in: path
+ description: The key of a variable
+ required: true
+ schema:
+ type: string
+ responses:
+ 200:
+ description: Get the details of a specific instance-level variable
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_Ci_Variable'
+ 404:
+ description: Instance Variable Not Found
+ content: {}
+ put:
+ tags:
+ - ci_variables
+ description: Update an instance-level variable
+ operationId: putApiV4AdminCiVariablesKey
+ parameters:
+ - name: key
+ in: path
+ description: The key of a variable
+ required: true
+ schema:
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ properties:
+ value:
type: string
- created_at:
+ description: The value of a variable
+ protected:
+ type: boolean
+ description: Whether the variable is protected
+ masked:
+ type: boolean
+ description: Whether the variable is masked
+ raw:
+ type: boolean
+ description: Whether the variable will be expanded
+ variable_type:
type: string
- access_level:
- type: integer
- example:
- 'id': 1
- 'username': 'raymond_smith'
- 'name': 'Raymond Smith'
- 'state': 'active'
- 'created_at': '2012-10-22T14:13:35Z'
- 'access_level': 20
-
-#/v4/groups/{id}/access_requests/{user_id}
-accessRequestsGroupsDeny:
- delete:
- description: Denies a group access request for the given user
- summary: Denies a group access request for the given user
- operationId: accessRequestsGroupsDeny_delete
- tags:
- - access_requests
- parameters:
- - name: id
+ description: 'The type of a variable. Available types are: env_var
+ (default) and file'
+ enum:
+ - env_var
+ - file
+ responses:
+ 200:
+ description: Update an instance-level variable
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_Ci_Variable'
+ 404:
+ description: Instance Variable Not Found
+ content: {}
+ delete:
+ tags:
+ - ci_variables
+ description: Delete an existing instance-level variable
+ operationId: deleteApiV4AdminCiVariablesKey
+ parameters:
+ - name: key
in: path
- description: The ID or URL-encoded path of the group owned by the authenticated user.
+ description: The key of a variable
required: true
schema:
- oneOf:
- - type: integer
- - type: string
- - name: user_id
+ type: string
+ responses:
+ 204:
+ description: Delete an existing instance-level variable
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_Ci_Variable'
+ 404:
+ description: Instance Variable Not Found
+ content: {}
+ /api/v4/admin/ci/variables:
+ get:
+ tags:
+ - ci_variables
+ description: List all instance-level variables
+ operationId: getApiV4AdminCiVariables
+ parameters:
+ - name: page
+ in: query
+ description: Current page number
+ schema:
+ type: integer
+ format: int32
+ default: 1
+ - name: per_page
+ in: query
+ description: Number of items per page
+ schema:
+ type: integer
+ format: int32
+ default: 20
+ responses:
+ 200:
+ description: List all instance-level variables
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_Ci_Variable'
+ post:
+ tags:
+ - ci_variables
+ description: Create a new instance-level variable
+ operationId: postApiV4AdminCiVariables
+ requestBody:
+ content:
+ application/json:
+ schema:
+ required:
+ - key
+ - value
+ properties:
+ key:
+ type: string
+ description: The key of the variable. Max 255 characters
+ value:
+ type: string
+ description: The value of a variable
+ protected:
+ type: boolean
+ description: Whether the variable is protected
+ masked:
+ type: boolean
+ description: Whether the variable is masked
+ raw:
+ type: boolean
+ description: Whether the variable will be expanded
+ variable_type:
+ type: string
+ description: 'The type of a variable. Available types are: env_var
+ (default) and file'
+ enum:
+ - env_var
+ - file
+ required: true
+ responses:
+ 201:
+ description: Create a new instance-level variable
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_Ci_Variable'
+ 400:
+ description: 400 Bad Request
+ content: {}
+ /api/v4/admin/databases/{database_name}/dictionary/tables/{table_name}:
+ get:
+ tags:
+ - admin
+ description: Retrieve dictionary details
+ operationId: getApiV4AdminDatabasesDatabaseNameDictionaryTablesTableName
+ parameters:
+ - name: database_name
+ in: path
+ description: The database name
+ required: true
+ schema:
+ type: string
+ enum:
+ - main
+ - ci
+ - name: table_name
in: path
- description: The userID of the access requester
+ description: The table name
+ required: true
+ schema:
+ type: string
+ responses:
+ 200:
+ description: Retrieve dictionary details
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_Dictionary_Table'
+ 401:
+ description: 401 Unauthorized
+ content: {}
+ 403:
+ description: 403 Forbidden
+ content: {}
+ 404:
+ description: 404 Not found
+ content: {}
+ /api/v4/admin/clusters/{cluster_id}:
+ get:
+ tags:
+ - clusters
+ summary: Get a single instance cluster
+ description: This feature was introduced in GitLab 13.2. Returns a single instance
+ cluster.
+ operationId: getApiV4AdminClustersClusterId
+ parameters:
+ - name: cluster_id
+ in: path
+ description: The cluster ID
required: true
schema:
type: integer
- responses: # Does anything go here? Markdown doc does not list a response.
- '401':
- description: Unauthorized operation
- '200':
- description: Successful operation
-#/v4/projects/{id}/access_tokens
-accessTokens:
- get:
- description: Lists access tokens for a project
- summary: List access tokens for a project
- operationId: accessTokens_get
- tags:
- - access_tokens
- parameters:
- - name: id
+ format: int32
+ responses:
+ 200:
+ description: Get a single instance cluster
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_Cluster'
+ 403:
+ description: Forbidden
+ content: {}
+ 404:
+ description: Not found
+ content: {}
+ put:
+ tags:
+ - clusters
+ summary: Edit instance cluster
+ description: This feature was introduced in GitLab 13.2. Updates an existing
+ instance cluster.
+ operationId: putApiV4AdminClustersClusterId
+ parameters:
+ - name: cluster_id
in: path
- description: The ID or URL-encoded path of the project
+ description: The cluster ID
required: true
schema:
- oneOf:
- - type: integer
- - type: string
- responses:
- '404':
- description: Not Found
- '401':
- description: Unauthorized operation
- '200':
- description: Successful operation
+ type: integer
+ format: int32
+ requestBody:
content:
application/json:
schema:
- title: AccessTokenList
- type: object
properties:
- user_id:
- type: integer
- scopes:
- type: array
name:
type: string
- expires_at:
- type: date
- id:
+ description: Cluster name
+ enabled:
+ type: boolean
+ description: Enable or disable Gitlab's connection to your Kubernetes
+ cluster
+ environment_scope:
+ type: string
+ description: The associated environment to the cluster
+ namespace_per_environment:
+ type: boolean
+ description: Deploy each environment to a separate Kubernetes namespace
+ default: true
+ domain:
+ type: string
+ description: Cluster base domain
+ management_project_id:
type: integer
- active:
+ description: The ID of the management project
+ format: int32
+ managed:
type: boolean
- created_at:
- type: date
- revoked:
+ description: Determines if GitLab will manage namespaces and service
+ accounts for this cluster
+ platform_kubernetes_attributes[api_url]:
+ type: string
+ description: URL to access the Kubernetes API
+ platform_kubernetes_attributes[token]:
+ type: string
+ description: Token to authenticate against Kubernetes
+ platform_kubernetes_attributes[ca_cert]:
+ type: string
+ description: TLS certificate (needed if API is using a self-signed
+ TLS certificate)
+ platform_kubernetes_attributes[namespace]:
+ type: string
+ description: Unique namespace related to Project
+ responses:
+ 200:
+ description: Edit instance cluster
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_Cluster'
+ 400:
+ description: Validation error
+ content: {}
+ 403:
+ description: Forbidden
+ content: {}
+ 404:
+ description: Not found
+ content: {}
+ delete:
+ tags:
+ - clusters
+ summary: Delete instance cluster
+ description: This feature was introduced in GitLab 13.2. Deletes an existing
+ instance cluster. Does not remove existing resources within the connected
+ Kubernetes cluster.
+ operationId: deleteApiV4AdminClustersClusterId
+ parameters:
+ - name: cluster_id
+ in: path
+ description: The cluster ID
+ required: true
+ schema:
+ type: integer
+ format: int32
+ responses:
+ 204:
+ description: Delete instance cluster
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_Cluster'
+ 403:
+ description: Forbidden
+ content: {}
+ 404:
+ description: Not found
+ content: {}
+ /api/v4/admin/clusters/add:
+ post:
+ tags:
+ - clusters
+ summary: Add existing instance cluster
+ description: This feature was introduced in GitLab 13.2. Adds an existing Kubernetes
+ instance cluster.
+ operationId: postApiV4AdminClustersAdd
+ requestBody:
+ content:
+ application/json:
+ schema:
+ required:
+ - name
+ - platform_kubernetes_attributes[api_url]
+ - platform_kubernetes_attributes[token]
+ properties:
+ name:
+ type: string
+ description: Cluster name
+ enabled:
+ type: boolean
+ description: Determines if cluster is active or not, defaults to
+ true
+ default: true
+ environment_scope:
+ type: string
+ description: The associated environment to the cluster
+ default: '*'
+ namespace_per_environment:
+ type: boolean
+ description: Deploy each environment to a separate Kubernetes namespace
+ default: true
+ domain:
+ type: string
+ description: Cluster base domain
+ management_project_id:
+ type: integer
+ description: The ID of the management project
+ format: int32
+ managed:
type: boolean
- example:
- 'user_id': 141
- 'scopes': ['api']
- 'name': 'token'
- 'expires_at': '2022-01-31'
- 'id': 42
- 'active': true
- 'created_at': '2021-01-20T14:13:35Z'
- 'revoked': false
- post:
- description: Creates an access token for a project
- summary: Creates an access token for a project
- operationId: accessTokens_post
- tags:
- - access_tokens
- parameters:
+ description: Determines if GitLab will manage namespaces and service
+ accounts for this cluster, defaults to true
+ default: true
+ platform_kubernetes_attributes[api_url]:
+ type: string
+ description: URL to access the Kubernetes API
+ platform_kubernetes_attributes[token]:
+ type: string
+ description: Token to authenticate against Kubernetes
+ platform_kubernetes_attributes[ca_cert]:
+ type: string
+ description: TLS certificate (needed if API is using a self-signed
+ TLS certificate)
+ platform_kubernetes_attributes[namespace]:
+ type: string
+ description: Unique namespace related to Project
+ platform_kubernetes_attributes[authorization_type]:
+ type: string
+ description: Cluster authorization type, defaults to RBAC
+ default: rbac
+ enum:
+ - unknown_authorization
+ - rbac
+ - abac
+ required: true
+ responses:
+ 201:
+ description: Add existing instance cluster
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_Cluster'
+ 400:
+ description: Validation error
+ content: {}
+ 403:
+ description: Forbidden
+ content: {}
+ 404:
+ description: Not found
+ content: {}
+ /api/v4/admin/clusters:
+ get:
+ tags:
+ - clusters
+ summary: List instance clusters
+ description: This feature was introduced in GitLab 13.2. Returns a list of instance
+ clusters.
+ operationId: getApiV4AdminClusters
+ responses:
+ 200:
+ description: List instance clusters
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/API_Entities_Cluster'
+ 403:
+ description: Forbidden
+ content: {}
+ /api/v4/admin/migrations/{timestamp}/mark:
+ post:
+ tags:
+ - migrations
+ description: Mark the migration as successfully executed
+ operationId: postApiV4AdminMigrationsTimestampMark
+ parameters:
+ - name: timestamp
+ in: path
+ description: The migration version timestamp
+ required: true
+ schema:
+ type: integer
+ format: int32
+ requestBody:
+ content:
+ application/json:
+ schema:
+ properties:
+ database:
+ type: string
+ description: The name of the database
+ default: main
+ enum:
+ - main
+ - ci
+ - embedding
+ - main_clusterwide
+ - geo
+ responses:
+ 201:
+ description: 201 Created
+ content: {}
+ 401:
+ description: 401 Unauthorized
+ content: {}
+ 403:
+ description: 403 Forbidden
+ content: {}
+ 404:
+ description: 404 Not found
+ content: {}
+ 422:
+ description: You can mark only pending migrations
+ content: {}
+ /api/v4/applications/{id}:
+ delete:
+ tags:
+ - applications
+ summary: Delete an application
+ description: Delete a specific application
+ operationId: deleteApiV4ApplicationsId
+ parameters:
- name: id
in: path
- description: The ID or URL-encoded path of the project
+ description: The ID of the application (not the application_id)
required: true
schema:
- oneOf:
- - type: integer
- - type: string
- - name: name
+ type: integer
+ format: int32
+ responses:
+ 204:
+ description: Delete an application
+ content: {}
+ /api/v4/applications:
+ get:
+ tags:
+ - applications
+ summary: Get applications
+ description: List all registered applications
+ operationId: getApiV4Applications
+ responses:
+ 200:
+ description: Get applications
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/API_Entities_Application'
+ post:
+ tags:
+ - applications
+ summary: Create a new application
+ description: This feature was introduced in GitLab 10.5
+ operationId: postApiV4Applications
+ requestBody:
+ content:
+ application/json:
+ schema:
+ required:
+ - name
+ - redirect_uri
+ - scopes
+ properties:
+ name:
+ type: string
+ description: Name of the application.
+ redirect_uri:
+ type: string
+ description: Redirect URI of the application.
+ scopes:
+ type: string
+ description: |-
+ Scopes of the application. You can specify multiple scopes by separating\
+ each scope using a space
+ confidential:
+ type: boolean
+ description: |-
+ The application is used where the client secret can be kept confidential. Native mobile apps \
+ and Single Page Apps are considered non-confidential. Defaults to true if not supplied
+ default: true
+ required: true
+ responses:
+ 200:
+ description: Create a new application
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_ApplicationWithSecret'
+ /api/v4/avatar:
+ get:
+ tags:
+ - avatar
+ description: Return avatar url for a user
+ operationId: getApiV4Avatar
+ parameters:
+ - name: email
in: query
- description: The name of the project access token
+ description: Public email address of the user
required: true
schema:
type: string
- - name: scopes
+ - name: size
in: query
- description: Defines read and write permissions for the token
+ description: Single pixel dimension for Gravatar images
+ schema:
+ type: integer
+ format: int32
+ responses:
+ 200:
+ description: Return avatar url for a user
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_Avatar'
+ /api/v4/broadcast_messages/{id}:
+ get:
+ tags:
+ - broadcast_messages
+ summary: Get a specific broadcast message
+ description: This feature was introduced in GitLab 8.12.
+ operationId: getApiV4BroadcastMessagesId
+ parameters:
+ - name: id
+ in: path
+ description: Broadcast message ID
required: true
schema:
- type: array
- items:
- type: string
- enum:
- [
- 'api',
- 'read_api',
- 'read_registry',
- 'write_registry',
- 'read_repository',
- 'write_repository',
- ]
- - name: expires_at
- in: query
- description: Date when the token expires. Time of day is Midnight UTC of that date.
- required: false
- schema:
- type: date
- responses:
- '404':
- description: Not Found
- '401':
- description: Unauthorized operation
- '200':
- description: Successful operation
+ type: integer
+ format: int32
+ responses:
+ 200:
+ description: Get a specific broadcast message
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_BroadcastMessage'
+ put:
+ tags:
+ - broadcast_messages
+ summary: Update a broadcast message
+ description: This feature was introduced in GitLab 8.12.
+ operationId: putApiV4BroadcastMessagesId
+ parameters:
+ - name: id
+ in: path
+ description: Broadcast message ID
+ required: true
+ schema:
+ type: integer
+ format: int32
+ requestBody:
content:
application/json:
schema:
- title: AccessTokenList
- type: object
properties:
- user_id:
- type: integer
- scopes:
+ message:
+ type: string
+ description: Message to display
+ starts_at:
+ type: string
+ description: Starting time
+ format: date-time
+ ends_at:
+ type: string
+ description: Ending time
+ format: date-time
+ color:
+ type: string
+ description: Background color
+ font:
+ type: string
+ description: Foreground color
+ target_access_levels:
type: array
- name:
+ description: Target user roles
+ items:
+ type: integer
+ format: int32
+ enum:
+ - 10
+ - 20
+ - 30
+ - 40
+ - 50
+ target_path:
type: string
- expires_at:
- type: date
- id:
- type: integer
- active:
- type: boolean
- created_at:
- type: date
- revoked:
+ description: Target path
+ broadcast_type:
+ type: string
+ description: Broadcast Type
+ enum:
+ - banner
+ - notification
+ dismissable:
type: boolean
- token:
- type: string
- example:
- 'user_id': 166
- 'scopes': ['api', 'read_repository']
- 'name': 'test'
- 'expires_at': '2022-01-31'
- 'id': 58
- 'active': true
- 'created_at': '2021-01-20T14:13:35Z'
- 'revoked': false
- 'token': 'D4y...Wzr'
-
-#/v4/projects/{id}/access_tokens/{token_id}
-accessTokensRevoke:
- delete:
- description: Revokes an access token
- summary: Revokes an access token
- operationId: accessTokens_delete
- tags:
- - access_tokens
- parameters:
+ description: Is dismissable
+ responses:
+ 200:
+ description: Update a broadcast message
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_BroadcastMessage'
+ delete:
+ tags:
+ - broadcast_messages
+ summary: Delete a broadcast message
+ description: This feature was introduced in GitLab 8.12.
+ operationId: deleteApiV4BroadcastMessagesId
+ parameters:
- name: id
in: path
- description: The ID or URL-encoded path of the project
+ description: Broadcast message ID
+ required: true
+ schema:
+ type: integer
+ format: int32
+ responses:
+ 200:
+ description: Delete a broadcast message
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_BroadcastMessage'
+ /api/v4/broadcast_messages:
+ get:
+ tags:
+ - broadcast_messages
+ summary: Get all broadcast messages
+ description: This feature was introduced in GitLab 8.12.
+ operationId: getApiV4BroadcastMessages
+ parameters:
+ - name: page
+ in: query
+ description: Current page number
+ schema:
+ type: integer
+ format: int32
+ default: 1
+ - name: per_page
+ in: query
+ description: Number of items per page
+ schema:
+ type: integer
+ format: int32
+ default: 20
+ responses:
+ 200:
+ description: Get all broadcast messages
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_BroadcastMessage'
+ post:
+ tags:
+ - broadcast_messages
+ summary: Create a broadcast message
+ description: This feature was introduced in GitLab 8.12.
+ operationId: postApiV4BroadcastMessages
+ requestBody:
+ content:
+ application/json:
+ schema:
+ required:
+ - message
+ properties:
+ message:
+ type: string
+ description: Message to display
+ starts_at:
+ type: string
+ description: Starting time
+ format: date-time
+ ends_at:
+ type: string
+ description: Ending time
+ format: date-time
+ color:
+ type: string
+ description: Background color
+ font:
+ type: string
+ description: Foreground color
+ target_access_levels:
+ type: array
+ description: Target user roles
+ items:
+ type: integer
+ format: int32
+ enum:
+ - 10
+ - 20
+ - 30
+ - 40
+ - 50
+ target_path:
+ type: string
+ description: Target path
+ broadcast_type:
+ type: string
+ description: Broadcast type. Defaults to banner
+ enum:
+ - banner
+ - notification
+ dismissable:
+ type: boolean
+ description: Is dismissable
+ required: true
+ responses:
+ 201:
+ description: Create a broadcast message
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_BroadcastMessage'
+ /api/v4/bulk_imports/{import_id}/entities/{entity_id}:
+ get:
+ tags:
+ - bulk_imports
+ summary: Get GitLab Migration entity details
+ description: This feature was introduced in GitLab 14.1.
+ operationId: getApiV4BulkImportsImportIdEntitiesEntityId
+ parameters:
+ - name: import_id
+ in: path
+ description: The ID of user's GitLab Migration
+ required: true
+ schema:
+ type: integer
+ format: int32
+ - name: entity_id
+ in: path
+ description: The ID of GitLab Migration entity
required: true
schema:
- oneOf:
- - type: integer
- - type: string
- - name: token_id
+ type: integer
+ format: int32
+ responses:
+ 200:
+ description: Get GitLab Migration entity details
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_BulkImports'
+ 401:
+ description: Unauthorized
+ content: {}
+ 404:
+ description: Not found
+ content: {}
+ 503:
+ description: Service unavailable
+ content: {}
+ /api/v4/bulk_imports/{import_id}/entities:
+ get:
+ tags:
+ - bulk_imports
+ summary: List GitLab Migration entities
+ description: This feature was introduced in GitLab 14.1.
+ operationId: getApiV4BulkImportsImportIdEntities
+ parameters:
+ - name: import_id
in: path
- description: The ID of the project access token
+ description: The ID of user's GitLab Migration
required: true
schema:
- oneOf:
- - type: integer
- - type: string
- responses:
- '400':
- description: Bad Request
- '404':
- description: Not Found
- '204':
- description: No content if successfully revoked
+ type: integer
+ format: int32
+ - name: status
+ in: query
+ description: Return import entities with specified status
+ schema:
+ type: string
+ enum:
+ - created
+ - started
+ - finished
+ - timeout
+ - failed
+ - name: page
+ in: query
+ description: Current page number
+ schema:
+ type: integer
+ format: int32
+ default: 1
+ - name: per_page
+ in: query
+ description: Number of items per page
+ schema:
+ type: integer
+ format: int32
+ default: 20
+ responses:
+ 200:
+ description: List GitLab Migration entities
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/API_Entities_BulkImports'
+ 401:
+ description: Unauthorized
+ content: {}
+ 404:
+ description: Not found
+ content: {}
+ 503:
+ description: Service unavailable
+ content: {}
+ /api/v4/bulk_imports/{import_id}:
+ get:
+ tags:
+ - bulk_imports
+ summary: Get GitLab Migration details
+ description: This feature was introduced in GitLab 14.1.
+ operationId: getApiV4BulkImportsImportId
+ parameters:
+ - name: import_id
+ in: path
+ description: The ID of user's GitLab Migration
+ required: true
+ schema:
+ type: integer
+ format: int32
+ responses:
+ 200:
+ description: Get GitLab Migration details
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_BulkImport'
+ 401:
+ description: Unauthorized
+ content: {}
+ 404:
+ description: Not found
+ content: {}
+ 503:
+ description: Service unavailable
+ content: {}
+ /api/v4/bulk_imports/entities:
+ get:
+ tags:
+ - bulk_imports
+ summary: List all GitLab Migrations' entities
+ description: This feature was introduced in GitLab 14.1.
+ operationId: getApiV4BulkImportsEntities
+ parameters:
+ - name: page
+ in: query
+ description: Current page number
+ schema:
+ type: integer
+ format: int32
+ default: 1
+ - name: per_page
+ in: query
+ description: Number of items per page
+ schema:
+ type: integer
+ format: int32
+ default: 20
+ - name: sort
+ in: query
+ description: Return GitLab Migrations sorted in created by `asc` or `desc`
+ order.
+ schema:
+ type: string
+ default: desc
+ enum:
+ - asc
+ - desc
+ - name: status
+ in: query
+ description: Return all GitLab Migrations' entities with specified status
+ schema:
+ type: string
+ enum:
+ - created
+ - started
+ - finished
+ - timeout
+ - failed
+ responses:
+ 200:
+ description: List all GitLab Migrations' entities
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/API_Entities_BulkImports'
+ 401:
+ description: Unauthorized
+ content: {}
+ 404:
+ description: Not found
+ content: {}
+ 503:
+ description: Service unavailable
+ content: {}
+ /api/v4/bulk_imports:
+ get:
+ tags:
+ - bulk_imports
+ summary: List all GitLab Migrations
+ description: This feature was introduced in GitLab 14.1.
+ operationId: getApiV4BulkImports
+ parameters:
+ - name: page
+ in: query
+ description: Current page number
+ schema:
+ type: integer
+ format: int32
+ default: 1
+ - name: per_page
+ in: query
+ description: Number of items per page
+ schema:
+ type: integer
+ format: int32
+ default: 20
+ - name: sort
+ in: query
+ description: Return GitLab Migrations sorted in created by `asc` or `desc`
+ order.
+ schema:
+ type: string
+ default: desc
+ enum:
+ - asc
+ - desc
+ - name: status
+ in: query
+ description: Return GitLab Migrations with specified status
+ schema:
+ type: string
+ enum:
+ - created
+ - started
+ - finished
+ - timeout
+ - failed
+ responses:
+ 200:
+ description: List all GitLab Migrations
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/API_Entities_BulkImport'
+ 401:
+ description: Unauthorized
+ content: {}
+ 404:
+ description: Not found
+ content: {}
+ 503:
+ description: Service unavailable
+ content: {}
+ post:
+ tags:
+ - bulk_imports
+ summary: Start a new GitLab Migration
+ description: This feature was introduced in GitLab 14.2.
+ operationId: postApiV4BulkImports
+ requestBody:
+ content:
+ application/x-www-form-urlencoded:
+ schema:
+ required:
+ - configuration[access_token]
+ - configuration[url]
+ - entities[destination_namespace]
+ - entities[source_full_path]
+ - entities[source_type]
+ properties:
+ configuration[url]:
+ type: string
+ description: Source GitLab instance URL
+ configuration[access_token]:
+ type: string
+ description: Access token to the source GitLab instance
+ entities[source_type]:
+ type: array
+ description: Source entity type
+ items:
+ type: string
+ enum:
+ - group_entity
+ - project_entity
+ entities[source_full_path]:
+ type: array
+ description: Relative path of the source entity to import
+ items:
+ type: string
+ entities[destination_namespace]:
+ type: array
+ description: Destination namespace for the entity
+ items:
+ type: string
+ entities[destination_slug]:
+ type: array
+ description: Destination slug for the entity
+ items:
+ type: string
+ entities[destination_name]:
+ type: array
+ description: 'Deprecated: Use :destination_slug instead. Destination
+ slug for the entity'
+ items:
+ type: string
+ entities[migrate_projects]:
+ type: array
+ description: Indicates group migration should include nested projects
+ items:
+ type: boolean
+ required: true
+ responses:
+ 200:
+ description: Start a new GitLab Migration
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_BulkImport'
+ 400:
+ description: Bad request
+ content: {}
+ 401:
+ description: Unauthorized
+ content: {}
+ 404:
+ description: Not found
+ content: {}
+ 422:
+ description: Unprocessable entity
+ content: {}
+ 503:
+ description: Service unavailable
+ content: {}
+ /api/v4/application/appearance:
+ get:
+ tags:
+ - application
+ description: Get the current appearance
+ operationId: getApiV4ApplicationAppearance
+ responses:
+ 200:
+ description: Get the current appearance
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_Appearance'
+ put:
+ tags:
+ - application
+ description: Modify appearance
+ operationId: putApiV4ApplicationAppearance
+ requestBody:
+ content:
+ multipart/form-data:
+ schema:
+ properties:
+ title:
+ type: string
+ description: Instance title on the sign in / sign up page
+ description:
+ type: string
+ description: Markdown text shown on the sign in / sign up page
+ pwa_name:
+ type: string
+ description: Name of the Progressive Web App
+ pwa_short_name:
+ type: string
+ description: Optional, short name for Progressive Web App
+ pwa_description:
+ type: string
+ description: An explanation of what the Progressive Web App does
+ logo:
+ type: string
+ description: Instance image used on the sign in / sign up page
+ format: binary
+ pwa_icon:
+ type: string
+ description: Icon used for Progressive Web App
+ format: binary
+ header_logo:
+ type: string
+ description: Instance image used for the main navigation bar
+ format: binary
+ favicon:
+ type: string
+ description: Instance favicon in .ico/.png format
+ format: binary
+ new_project_guidelines:
+ type: string
+ description: Markdown text shown on the new project page
+ profile_image_guidelines:
+ type: string
+ description: Markdown text shown on the profile page below Public
+ Avatar
+ header_message:
+ type: string
+ description: Message within the system header bar
+ footer_message:
+ type: string
+ description: Message within the system footer bar
+ message_background_color:
+ type: string
+ description: Background color for the system header / footer bar
+ message_font_color:
+ type: string
+ description: Font color for the system header / footer bar
+ email_header_and_footer_enabled:
+ type: boolean
+ description: Add header and footer to all outgoing emails if enabled
+ responses:
+ 200:
+ description: Modify appearance
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_Appearance'
+ /api/v4/application/plan_limits:
+ get:
+ tags:
+ - plan_limits
+ summary: Get current plan limits
+ description: List the current limits of a plan on the GitLab instance.
+ operationId: getApiV4ApplicationPlanLimits
+ parameters:
+ - name: plan_name
+ in: query
+ description: 'Name of the plan to get the limits from. Default: default.'
+ schema:
+ type: string
+ default: default
+ enum:
+ - default
+ - free
+ - bronze
+ - silver
+ - premium
+ - gold
+ - ultimate
+ - ultimate_trial
+ - premium_trial
+ - opensource
+ responses:
+ 200:
+ description: Get current plan limits
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_PlanLimit'
+ 401:
+ description: Unauthorized
+ content: {}
+ 403:
+ description: Forbidden
+ content: {}
+ put:
+ tags:
+ - plan_limits
+ summary: Change plan limits
+ description: Modify the limits of a plan on the GitLab instance.
+ operationId: putApiV4ApplicationPlanLimits
+ requestBody:
+ content:
+ application/json:
+ schema:
+ required:
+ - plan_name
+ properties:
+ plan_name:
+ type: string
+ description: Name of the plan to update
+ enum:
+ - default
+ - free
+ - bronze
+ - silver
+ - premium
+ - gold
+ - ultimate
+ - ultimate_trial
+ - premium_trial
+ - opensource
+ ci_pipeline_size:
+ type: integer
+ description: Maximum number of jobs in a single pipeline
+ format: int32
+ ci_active_jobs:
+ type: integer
+ description: Total number of jobs in currently active pipelines
+ format: int32
+ ci_project_subscriptions:
+ type: integer
+ description: Maximum number of pipeline subscriptions to and from
+ a project
+ format: int32
+ ci_pipeline_schedules:
+ type: integer
+ description: Maximum number of pipeline schedules
+ format: int32
+ ci_needs_size_limit:
+ type: integer
+ description: Maximum number of DAG dependencies that a job can have
+ format: int32
+ ci_registered_group_runners:
+ type: integer
+ description: Maximum number of runners registered per group
+ format: int32
+ ci_registered_project_runners:
+ type: integer
+ description: Maximum number of runners registered per project
+ format: int32
+ conan_max_file_size:
+ type: integer
+ description: Maximum Conan package file size in bytes
+ format: int32
+ enforcement_limit:
+ type: integer
+ description: Maximum storage size for the root namespace enforcement
+ in MiB
+ format: int32
+ generic_packages_max_file_size:
+ type: integer
+ description: Maximum generic package file size in bytes
+ format: int32
+ helm_max_file_size:
+ type: integer
+ description: Maximum Helm chart file size in bytes
+ format: int32
+ maven_max_file_size:
+ type: integer
+ description: Maximum Maven package file size in bytes
+ format: int32
+ notification_limit:
+ type: integer
+ description: Maximum storage size for the root namespace notifications
+ in MiB
+ format: int32
+ npm_max_file_size:
+ type: integer
+ description: Maximum NPM package file size in bytes
+ format: int32
+ nuget_max_file_size:
+ type: integer
+ description: Maximum NuGet package file size in bytes
+ format: int32
+ pypi_max_file_size:
+ type: integer
+ description: Maximum PyPI package file size in bytes
+ format: int32
+ terraform_module_max_file_size:
+ type: integer
+ description: Maximum Terraform Module package file size in bytes
+ format: int32
+ storage_size_limit:
+ type: integer
+ description: Maximum storage size for the root namespace in MiB
+ format: int32
+ pipeline_hierarchy_size:
+ type: integer
+ description: Maximum number of downstream pipelines in a pipeline's
+ hierarchy tree
+ format: int32
+ required: true
+ responses:
+ 200:
+ description: Change plan limits
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_PlanLimit'
+ 400:
+ description: Bad request
+ content: {}
+ 401:
+ description: Unauthorized
+ content: {}
+ 403:
+ description: Forbidden
+ content: {}
+ /api/v4/metadata:
+ get:
+ tags:
+ - metadata
+ summary: Retrieve metadata information for this GitLab instance
+ description: This feature was introduced in GitLab 15.2.
+ operationId: getApiV4Metadata
+ responses:
+ 200:
+ description: Retrieve metadata information for this GitLab instance
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_Metadata'
+ 401:
+ description: Unauthorized
+ content: {}
+ /api/v4/version:
+ get:
+ tags:
+ - metadata
+ summary: Retrieves version information for the GitLab instance
+ description: This feature was introduced in GitLab 8.13 and deprecated in 15.5.
+ We recommend you instead use the Metadata API.
+ operationId: getApiV4Version
+ responses:
+ 200:
+ description: Retrieves version information for the GitLab instance
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/API_Entities_Metadata'
+ 401:
+ description: Unauthorized
+ content: {}
+components:
+ schemas:
+ API_Entities_Badge:
+ type: object
+ properties:
+ name:
+ type: string
+ link_url:
+ type: string
+ image_url:
+ type: string
+ rendered_link_url:
+ type: string
+ rendered_image_url:
+ type: string
+ id:
+ type: string
+ kind:
+ type: string
+ description: API_Entities_Badge model
+ API_Entities_BasicBadgeDetails:
+ type: object
+ properties:
+ name:
+ type: string
+ link_url:
+ type: string
+ image_url:
+ type: string
+ rendered_link_url:
+ type: string
+ rendered_image_url:
+ type: string
+ description: API_Entities_BasicBadgeDetails model
+ API_Entities_AccessRequester:
+ type: object
+ properties:
+ id:
+ type: integer
+ format: int32
+ example: 1
+ username:
+ type: string
+ example: admin
+ name:
+ type: string
+ example: Administrator
+ state:
+ type: string
+ example: active
+ avatar_url:
+ type: string
+ example: https://gravatar.com/avatar/1
+ avatar_path:
+ type: string
+ example: /user/avatar/28/The-Big-Lebowski-400-400.png
+ custom_attributes:
+ type: array
+ items:
+ $ref: '#/components/schemas/API_Entities_CustomAttribute'
+ web_url:
+ type: string
+ example: https://gitlab.example.com/root
+ email:
+ type: string
+ requested_at:
+ type: string
+ description: API_Entities_AccessRequester model
+ API_Entities_CustomAttribute:
+ type: object
+ properties:
+ key:
+ type: string
+ example: foo
+ value:
+ type: string
+ example: bar
+ API_Entities_Branch:
+ type: object
+ properties:
+ name:
+ type: string
+ example: master
+ commit:
+ $ref: '#/components/schemas/API_Entities_Commit'
+ merged:
+ type: boolean
+ example: true
+ protected:
+ type: boolean
+ example: true
+ developers_can_push:
+ type: boolean
+ example: true
+ developers_can_merge:
+ type: boolean
+ example: true
+ can_push:
+ type: boolean
+ example: true
+ default:
+ type: boolean
+ example: true
+ web_url:
+ type: string
+ example: https://gitlab.example.com/Commit921/the-dude/-/tree/master
+ description: API_Entities_Branch model
+ API_Entities_Commit:
+ type: object
+ properties:
+ id:
+ type: string
+ example: 2695effb5807a22ff3d138d593fd856244e155e7
+ short_id:
+ type: string
+ example: 2695effb
+ created_at:
+ type: string
+ format: date-time
+ example: 2017-07-26T11:08:53+02:00
+ parent_ids:
+ type: array
+ items:
+ type: string
+ example: 2a4b78934375d7f53875269ffd4f45fd83a84ebe
+ title:
+ type: string
+ example: Initial commit
+ message:
+ type: string
+ example: Initial commit
+ author_name:
+ type: string
+ example: John Smith
+ author_email:
+ type: string
+ example: john@example.com
+ authored_date:
+ type: string
+ format: date-time
+ example: 2012-05-28T04:42:42-07:00
+ committer_name:
+ type: string
+ example: Jack Smith
+ committer_email:
+ type: string
+ example: jack@example.com
+ committed_date:
+ type: string
+ format: date-time
+ example: 2012-05-28T04:42:42-07:00
+ trailers:
+ type: object
+ properties: {}
+ example: '{ "Merged-By": "Jane Doe janedoe@gitlab.com" }'
+ web_url:
+ type: string
+ example: https://gitlab.example.com/janedoe/gitlab-foss/-/commit/ed899a2f4b50b4370feeea94676502b42383c746
+ API_Entities_MetricImage:
+ type: object
+ properties:
+ id:
+ type: integer
+ format: int32
+ example: 23
+ created_at:
+ type: string
+ format: date-time
+ example: 2020-11-13T00:06:18.084Z
+ filename:
+ type: string
+ example: file.png
+ file_path:
+ type: string
+ example: /uploads/-/system/alert_metric_image/file/23/file.png
+ url:
+ type: string
+ example: https://example.com/metric
+ url_text:
+ type: string
+ example: An example metric
+ description: API_Entities_MetricImage model
+ API_Entities_BatchedBackgroundMigration:
+ type: object
+ properties:
+ id:
+ type: string
+ example: "1234"
+ job_class_name:
+ type: string
+ example: CopyColumnUsingBackgroundMigrationJob
+ table_name:
+ type: string
+ example: events
+ status:
+ type: string
+ example: active
+ progress:
+ type: number
+ format: float
+ example: 50.0
+ created_at:
+ type: string
+ format: date-time
+ example: 2022-11-28T16:26:39+02:00
+ description: API_Entities_BatchedBackgroundMigration model
+ API_Entities_Ci_Variable:
+ type: object
+ properties:
+ variable_type:
+ type: string
+ example: env_var
+ key:
+ type: string
+ example: TEST_VARIABLE_1
+ value:
+ type: string
+ example: TEST_1
+ protected:
+ type: boolean
+ masked:
+ type: boolean
+ raw:
+ type: boolean
+ environment_scope:
+ type: string
+ example: '*'
+ description: API_Entities_Ci_Variable model
+ API_Entities_Dictionary_Table:
+ type: object
+ properties:
+ table_name:
+ type: string
+ example: users
+ feature_categories:
+ type: array
+ items:
+ type: string
+ example: database
+ description: API_Entities_Dictionary_Table model
+ API_Entities_Cluster:
+ type: object
+ properties:
+ id:
+ type: string
+ name:
+ type: string
+ created_at:
+ type: string
+ domain:
+ type: string
+ enabled:
+ type: string
+ managed:
+ type: string
+ provider_type:
+ type: string
+ platform_type:
+ type: string
+ environment_scope:
+ type: string
+ cluster_type:
+ type: string
+ namespace_per_environment:
+ type: string
+ user:
+ $ref: '#/components/schemas/API_Entities_UserBasic'
+ platform_kubernetes:
+ $ref: '#/components/schemas/API_Entities_Platform_Kubernetes'
+ provider_gcp:
+ $ref: '#/components/schemas/API_Entities_Provider_Gcp'
+ management_project:
+ $ref: '#/components/schemas/API_Entities_ProjectIdentity'
+ description: API_Entities_Cluster model
+ API_Entities_UserBasic:
+ type: object
+ properties:
+ id:
+ type: integer
+ format: int32
+ example: 1
+ username:
+ type: string
+ example: admin
+ name:
+ type: string
+ example: Administrator
+ state:
+ type: string
+ example: active
+ avatar_url:
+ type: string
+ example: https://gravatar.com/avatar/1
+ avatar_path:
+ type: string
+ example: /user/avatar/28/The-Big-Lebowski-400-400.png
+ custom_attributes:
+ type: array
+ items:
+ $ref: '#/components/schemas/API_Entities_CustomAttribute'
+ web_url:
+ type: string
+ example: https://gitlab.example.com/root
+ email:
+ type: string
+ API_Entities_Platform_Kubernetes:
+ type: object
+ properties:
+ api_url:
+ type: string
+ namespace:
+ type: string
+ authorization_type:
+ type: string
+ ca_cert:
+ type: string
+ API_Entities_Provider_Gcp:
+ type: object
+ properties:
+ cluster_id:
+ type: string
+ status_name:
+ type: string
+ gcp_project_id:
+ type: string
+ zone:
+ type: string
+ machine_type:
+ type: string
+ num_nodes:
+ type: string
+ endpoint:
+ type: string
+ API_Entities_ProjectIdentity:
+ type: object
+ properties:
+ id:
+ type: integer
+ format: int32
+ example: 1
+ description:
+ type: string
+ example: desc
+ name:
+ type: string
+ example: project1
+ name_with_namespace:
+ type: string
+ example: John Doe / project1
+ path:
+ type: string
+ example: project1
+ path_with_namespace:
+ type: string
+ example: namespace1/project1
+ created_at:
+ type: string
+ format: date-time
+ example: 2020-05-07T04:27:17.016Z
+ API_Entities_Application:
+ type: object
+ properties:
+ id:
+ type: string
+ application_id:
+ type: string
+ example: 5832fc6e14300a0d962240a8144466eef4ee93ef0d218477e55f11cf12fc3737
+ application_name:
+ type: string
+ example: MyApplication
+ callback_url:
+ type: string
+ example: https://redirect.uri
+ confidential:
+ type: boolean
+ example: true
+ description: API_Entities_Application model
+ API_Entities_ApplicationWithSecret:
+ type: object
+ properties:
+ id:
+ type: string
+ application_id:
+ type: string
+ example: 5832fc6e14300a0d962240a8144466eef4ee93ef0d218477e55f11cf12fc3737
+ application_name:
+ type: string
+ example: MyApplication
+ callback_url:
+ type: string
+ example: https://redirect.uri
+ confidential:
+ type: boolean
+ example: true
+ secret:
+ type: string
+ example: ee1dd64b6adc89cf7e2c23099301ccc2c61b441064e9324d963c46902a85ec34
+ description: API_Entities_ApplicationWithSecret model
+ API_Entities_Avatar:
+ type: object
+ properties:
+ avatar_url:
+ type: string
+ description: API_Entities_Avatar model
+ API_Entities_BroadcastMessage:
+ type: object
+ properties:
+ id:
+ type: string
+ message:
+ type: string
+ starts_at:
+ type: string
+ ends_at:
+ type: string
+ color:
+ type: string
+ font:
+ type: string
+ target_access_levels:
+ type: string
+ target_path:
+ type: string
+ broadcast_type:
+ type: string
+ dismissable:
+ type: string
+ active:
+ type: string
+ description: API_Entities_BroadcastMessage model
+ API_Entities_BulkImports:
+ type: object
+ properties:
+ id:
+ type: integer
+ format: int32
+ example: 1
+ bulk_import_id:
+ type: integer
+ format: int32
+ example: 1
+ status:
+ type: string
+ example: created
+ enum:
+ - created
+ - started
+ - finished
+ - timeout
+ - failed
+ entity_type:
+ type: string
+ enum:
+ - group
+ - project
+ source_full_path:
+ type: string
+ example: source_group
+ destination_full_path:
+ type: string
+ example: some_group/source_project
+ destination_name:
+ type: string
+ example: destination_slug
+ destination_slug:
+ type: string
+ example: destination_slug
+ destination_namespace:
+ type: string
+ example: destination_path
+ parent_id:
+ type: integer
+ format: int32
+ example: 1
+ namespace_id:
+ type: integer
+ format: int32
+ example: 1
+ project_id:
+ type: integer
+ format: int32
+ example: 1
+ created_at:
+ type: string
+ format: date-time
+ example: 2012-05-28T04:42:42-07:00
+ updated_at:
+ type: string
+ format: date-time
+ example: 2012-05-28T04:42:42-07:00
+ failures:
+ type: array
+ items:
+ $ref: '#/components/schemas/API_Entities_BulkImports_EntityFailure'
+ migrate_projects:
+ type: boolean
+ example: true
+ description: API_Entities_BulkImports model
+ API_Entities_BulkImports_EntityFailure:
+ type: object
+ properties:
+ relation:
+ type: string
+ example: group
+ step:
+ type: string
+ example: extractor
+ exception_message:
+ type: string
+ example: error message
+ exception_class:
+ type: string
+ example: Exception
+ correlation_id_value:
+ type: string
+ example: dfcf583058ed4508e4c7c617bd7f0edd
+ created_at:
+ type: string
+ format: date-time
+ example: 2012-05-28T04:42:42-07:00
+ pipeline_class:
+ type: string
+ example: BulkImports::Groups::Pipelines::GroupPipeline
+ pipeline_step:
+ type: string
+ example: extractor
+ API_Entities_BulkImport:
+ type: object
+ properties:
+ id:
+ type: integer
+ format: int32
+ example: 1
+ status:
+ type: string
+ example: finished
+ enum:
+ - created
+ - started
+ - finished
+ - timeout
+ - failed
+ source_type:
+ type: string
+ example: gitlab
+ created_at:
+ type: string
+ format: date-time
+ example: 2012-05-28T04:42:42-07:00
+ updated_at:
+ type: string
+ format: date-time
+ example: 2012-05-28T04:42:42-07:00
+ description: API_Entities_BulkImport model
+ API_Entities_Appearance:
+ type: object
+ properties:
+ title:
+ type: string
+ description:
+ type: string
+ pwa_name:
+ type: string
+ pwa_short_name:
+ type: string
+ pwa_description:
+ type: string
+ logo:
+ type: string
+ pwa_icon:
+ type: string
+ header_logo:
+ type: string
+ favicon:
+ type: string
+ new_project_guidelines:
+ type: string
+ profile_image_guidelines:
+ type: string
+ header_message:
+ type: string
+ footer_message:
+ type: string
+ message_background_color:
+ type: string
+ message_font_color:
+ type: string
+ email_header_and_footer_enabled:
+ type: string
+ description: API_Entities_Appearance model
+ API_Entities_PlanLimit:
+ type: object
+ properties:
+ ci_pipeline_size:
+ type: integer
+ format: int32
+ example: 0
+ ci_active_jobs:
+ type: integer
+ format: int32
+ example: 0
+ ci_project_subscriptions:
+ type: integer
+ format: int32
+ example: 2
+ ci_pipeline_schedules:
+ type: integer
+ format: int32
+ example: 10
+ ci_needs_size_limit:
+ type: integer
+ format: int32
+ example: 50
+ ci_registered_group_runners:
+ type: integer
+ format: int32
+ example: 1000
+ ci_registered_project_runners:
+ type: integer
+ format: int32
+ example: 1000
+ conan_max_file_size:
+ type: integer
+ format: int32
+ example: 3221225472
+ enforcement_limit:
+ type: integer
+ format: int32
+ example: 15000
+ generic_packages_max_file_size:
+ type: integer
+ format: int32
+ example: 5368709120
+ helm_max_file_size:
+ type: integer
+ format: int32
+ example: 5242880
+ limits_history:
+ type: object
+ properties: {}
+ example: |-
+ {"enforcement_limit"=>[{"timestamp"=>1686909124, "user_id"=>1, "username"=>"x", "value"=>5}],
+ "notification_limit"=>[{"timestamp"=>1686909124, "user_id"=>2, "username"=>"y", "value"=>7}]}
+ maven_max_file_size:
+ type: integer
+ format: int32
+ example: 3221225472
+ notification_limit:
+ type: integer
+ format: int32
+ example: 15000
+ npm_max_file_size:
+ type: integer
+ format: int32
+ example: 524288000
+ nuget_max_file_size:
+ type: integer
+ format: int32
+ example: 524288000
+ pipeline_hierarchy_size:
+ type: integer
+ format: int32
+ example: 1000
+ pypi_max_file_size:
+ type: integer
+ format: int32
+ example: 3221225472
+ terraform_module_max_file_size:
+ type: integer
+ format: int32
+ example: 1073741824
+ storage_size_limit:
+ type: integer
+ format: int32
+ example: 15000
+ description: API_Entities_PlanLimit model
+ API_Entities_Metadata:
+ type: object
+ properties:
+ version:
+ type: string
+ example: 15.2-pre
+ revision:
+ type: string
+ example: c401a659d0c
+ kas:
+ type: object
+ properties:
+ enabled:
+ type: boolean
+ externalUrl:
+ type: string
+ example: grpc://gitlab.example.com:8150
+ version:
+ type: string
+ example: 15.0.0
+ enterprise:
+ type: boolean
+ description: API_Entities_Metadata model
+ securitySchemes:
+ ApiKeyAuth:
+ type: apiKey
+ in: header
+ name: Private-Token
diff --git a/doc/api/packages/npm.md b/doc/api/packages/npm.md
index 6f4d8446dbf..3aa23ad1044 100644
--- a/doc/api/packages/npm.md
+++ b/doc/api/packages/npm.md
@@ -124,7 +124,7 @@ different scopes:
- Use the instance-level prefix to make requests in the scope of the entire instance.
- Use the project-level prefix to make requests in a single project's scope.
-- Use the group-level prefix to make requests in a group’s scope.
+- Use the group-level prefix to make requests in a group's scope.
The examples in this document all use the project-level prefix.
diff --git a/doc/api/packages/pypi.md b/doc/api/packages/pypi.md
index 4e7c59adf3a..1b155feb8b5 100644
--- a/doc/api/packages/pypi.md
+++ b/doc/api/packages/pypi.md
@@ -28,8 +28,8 @@ is recommended when [FIPS mode](../../development/fips_compliance.md) is enabled
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/225545) in GitLab 13.12.
-Download a PyPI package file. The [simple API](#group-level-simple-api-entry-point)
-normally supplies this URL.
+Download a PyPI package file. The [simple API](#group-level-simple-api-entry-point)
+usually supplies this URL.
```plaintext
GET groups/:id/-/packages/pypi/files/:sha256/:file_identifier
@@ -142,7 +142,7 @@ This writes the downloaded file to `simple.html` in the current directory.
> Introduced in GitLab 12.10.
Download a PyPI package file. The [simple API](#project-level-simple-api-entry-point)
-normally supplies this URL.
+usually supplies this URL.
```plaintext
GET projects/:id/packages/pypi/files/:sha256/:file_identifier
diff --git a/doc/api/pipeline_schedules.md b/doc/api/pipeline_schedules.md
index 5dc0dead683..115e5b279b8 100644
--- a/doc/api/pipeline_schedules.md
+++ b/doc/api/pipeline_schedules.md
@@ -16,10 +16,10 @@ Get a list of the pipeline schedules of a project.
GET /projects/:id/pipeline_schedules
```
-| Attribute | Type | required | Description |
-|-----------|---------|----------|---------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
-| `scope` | string | no | The scope of pipeline schedules, one of: `active`, `inactive` |
+| Attribute | Type | Required | Description |
+|-----------|----------------|----------|-------------|
+| `id` | integer/string | Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) |
+| `scope` | string | No | The scope of pipeline schedules, must be one of: `active`, `inactive` |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/29/pipeline_schedules"
@@ -57,10 +57,10 @@ Get the pipeline schedule of a project.
GET /projects/:id/pipeline_schedules/:pipeline_schedule_id
```
-| Attribute | Type | required | Description |
-|--------------|---------|----------|--------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
-| `pipeline_schedule_id` | integer | yes | The pipeline schedule ID |
+| Attribute | Type | Required | Description |
+|------------------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) |
+| `pipeline_schedule_id` | integer | Yes | The pipeline schedule ID |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/29/pipeline_schedules/13"
@@ -115,8 +115,8 @@ Supported attributes:
| Attribute | Type | Required | Description |
|------------------------|----------------|----------|-------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user. |
-| `pipeline_schedule_id` | integer | yes | The pipeline schedule ID. |
+| `id` | integer/string | Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
+| `pipeline_schedule_id` | integer | Yes | The pipeline schedule ID. |
Example request:
@@ -163,14 +163,14 @@ Create a new pipeline schedule of a project.
POST /projects/:id/pipeline_schedules
```
-| Attribute | Type | required | Description |
-|-----------------|----------------|----------|-------------------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user. |
-| `description` | string | yes | The description of the pipeline schedule. |
-| `ref` | string | yes | The branch or tag name that is triggered. |
-| `cron` | string | yes | The [cron](https://en.wikipedia.org/wiki/Cron) schedule, for example: `0 1 * * *`. |
-| `cron_timezone` | string | no | The time zone supported by `ActiveSupport::TimeZone`, for example: `Pacific Time (US & Canada)` (default: `UTC`). |
-| `active` | boolean | no | The activation of pipeline schedule. If false is set, the pipeline schedule is initially deactivated (default: `true`). |
+| Attribute | Type | Required | Description |
+|-----------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
+| `description` | string | Yes | The description of the pipeline schedule. |
+| `ref` | string | Yes | The branch or tag name that is triggered. |
+| `cron` | string | Yes | The [cron](https://en.wikipedia.org/wiki/Cron) schedule, for example: `0 1 * * *`. |
+| `cron_timezone` | string | No | The time zone supported by `ActiveSupport::TimeZone`, for example: `Pacific Time (US & Canada)` (default: `UTC`). |
+| `active` | boolean | No | The activation of pipeline schedule. If false is set, the pipeline schedule is initially deactivated (default: `true`). |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
@@ -203,21 +203,21 @@ curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
## Edit a pipeline schedule
-Updates the pipeline schedule of a project. Once the update is done, it is rescheduled automatically.
+Updates the pipeline schedule of a project. After the update is done, it is rescheduled automatically.
```plaintext
PUT /projects/:id/pipeline_schedules/:pipeline_schedule_id
```
-| Attribute | Type | required | Description |
-|------------------------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user. |
-| `pipeline_schedule_id` | integer | yes | The pipeline schedule ID. |
-| `description` | string | no | The description of the pipeline schedule. |
-| `ref` | string | no | The branch or tag name that is triggered. |
-| `cron` | string | no | The [cron](https://en.wikipedia.org/wiki/Cron) schedule, for example: `0 1 * * *`. |
-| `cron_timezone` | string | no | The time zone supported by `ActiveSupport::TimeZone` (for example `Pacific Time (US & Canada)`), or `TZInfo::Timezone` (for example `America/Los_Angeles`). |
-| `active` | boolean | no | The activation of pipeline schedule. If false is set, the pipeline schedule is initially deactivated. |
+| Attribute | Type | Required | Description |
+|------------------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
+| `pipeline_schedule_id` | integer | Yes | The pipeline schedule ID. |
+| `description` | string | No | The description of the pipeline schedule. |
+| `ref` | string | No | The branch or tag name that is triggered. |
+| `cron` | string | No | The [cron](https://en.wikipedia.org/wiki/Cron) schedule, for example: `0 1 * * *`. |
+| `cron_timezone` | string | No | The time zone supported by `ActiveSupport::TimeZone` (for example `Pacific Time (US & Canada)`), or `TZInfo::Timezone` (for example `America/Los_Angeles`). |
+| `active` | boolean | No | The activation of pipeline schedule. If false is set, the pipeline schedule is initially deactivated. |
```shell
curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" \
@@ -260,10 +260,10 @@ Update the owner of the pipeline schedule of a project.
POST /projects/:id/pipeline_schedules/:pipeline_schedule_id/take_ownership
```
-| Attribute | Type | required | Description |
-|---------------|---------|----------|--------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
-| `pipeline_schedule_id` | integer | yes | The pipeline schedule ID |
+| Attribute | Type | Required | Description |
+|------------------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) |
+| `pipeline_schedule_id` | integer | Yes | The pipeline schedule ID |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/29/pipeline_schedules/13/take_ownership"
@@ -305,10 +305,10 @@ Delete the pipeline schedule of a project.
DELETE /projects/:id/pipeline_schedules/:pipeline_schedule_id
```
-| Attribute | Type | required | Description |
-|----------------|---------|----------|--------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
-| `pipeline_schedule_id` | integer | yes | The pipeline schedule ID |
+| Attribute | Type | Required | Description |
+|------------------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) |
+| `pipeline_schedule_id` | integer | Yes | The pipeline schedule ID |
```shell
curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/29/pipeline_schedules/13"
@@ -344,8 +344,6 @@ curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://git
## Run a scheduled pipeline immediately
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/201786) in GitLab 12.8.
-
Trigger a new scheduled pipeline, which runs immediately. The next scheduled run
of this pipeline is not affected.
@@ -353,10 +351,10 @@ of this pipeline is not affected.
POST /projects/:id/pipeline_schedules/:pipeline_schedule_id/play
```
-| Attribute | Type | required | Description |
-| ---------------- | --------- | ---------- | -------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
-| `pipeline_schedule_id` | integer | yes | The pipeline schedule ID |
+| Attribute | Type | Required | Description |
+|------------------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) |
+| `pipeline_schedule_id` | integer | Yes | The pipeline schedule ID |
Example request:
@@ -382,13 +380,13 @@ Create a new variable of a pipeline schedule.
POST /projects/:id/pipeline_schedules/:pipeline_schedule_id/variables
```
-| Attribute | Type | required | Description |
-|------------------------|----------------|----------|--------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
-| `pipeline_schedule_id` | integer | yes | The pipeline schedule ID |
-| `key` | string | yes | The `key` of a variable; must have no more than 255 characters; only `A-Z`, `a-z`, `0-9`, and `_` are allowed |
-| `value` | string | yes | The `value` of a variable |
-| `variable_type` | string | no | The type of a variable. Available types are: `env_var` (default) and `file` |
+| Attribute | Type | Required | Description |
+|------------------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) |
+| `pipeline_schedule_id` | integer | Yes | The pipeline schedule ID |
+| `key` | string | Yes | The `key` of a variable; must have no more than 255 characters; only `A-Z`, `a-z`, `0-9`, and `_` are allowed |
+| `value` | string | Yes | The `value` of a variable |
+| `variable_type` | string | No | The type of a variable. Available types are: `env_var` (default) and `file` |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" --form "key=NEW_VARIABLE" \
@@ -411,13 +409,13 @@ Updates the variable of a pipeline schedule.
PUT /projects/:id/pipeline_schedules/:pipeline_schedule_id/variables/:key
```
-| Attribute | Type | required | Description |
-|------------------------|----------------|----------|--------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
-| `pipeline_schedule_id` | integer | yes | The pipeline schedule ID |
-| `key` | string | yes | The `key` of a variable |
-| `value` | string | yes | The `value` of a variable |
-| `variable_type` | string | no | The type of a variable. Available types are: `env_var` (default) and `file` |
+| Attribute | Type | Required | Description |
+|------------------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) |
+| `pipeline_schedule_id` | integer | Yes | The pipeline schedule ID |
+| `key` | string | Yes | The `key` of a variable |
+| `value` | string | Yes | The `value` of a variable |
+| `variable_type` | string | No | The type of a variable. Available types are: `env_var` (default) and `file` |
```shell
curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" \
@@ -441,11 +439,11 @@ Delete the variable of a pipeline schedule.
DELETE /projects/:id/pipeline_schedules/:pipeline_schedule_id/variables/:key
```
-| Attribute | Type | required | Description |
-|------------------------|----------------|----------|--------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
-| `pipeline_schedule_id` | integer | yes | The pipeline schedule ID |
-| `key` | string | yes | The `key` of a variable |
+| Attribute | Type | Required | Description |
+|------------------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) |
+| `pipeline_schedule_id` | integer | Yes | The pipeline schedule ID |
+| `key` | string | Yes | The `key` of a variable |
```shell
curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/29/pipeline_schedules/13/variables/NEW_VARIABLE"
diff --git a/doc/api/pipeline_triggers.md b/doc/api/pipeline_triggers.md
index 50acac6bc2a..c62e622e31e 100644
--- a/doc/api/pipeline_triggers.md
+++ b/doc/api/pipeline_triggers.md
@@ -16,9 +16,9 @@ Get a list of a project's pipeline trigger tokens.
GET /projects/:id/triggers
```
-| Attribute | Type | required | Description |
-|-----------|---------|----------|---------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
+| Attribute | Type | Required | Description |
+|-----------|----------------|----------|-------------|
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/triggers"
@@ -49,10 +49,10 @@ Get details of a project's pipeline trigger.
GET /projects/:id/triggers/:trigger_id
```
-| Attribute | Type | required | Description |
-|--------------|---------|----------|--------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
-| `trigger_id` | integer | yes | The trigger ID |
+| Attribute | Type | Required | Description |
+|--------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) |
+| `trigger_id` | integer | Yes | The trigger ID |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/triggers/5"
@@ -78,10 +78,10 @@ Create a pipeline trigger for a project.
POST /projects/:id/triggers
```
-| Attribute | Type | required | Description |
-|---------------|---------|----------|--------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
-| `description` | string | yes | The trigger name |
+| Attribute | Type | Required | Description |
+|---------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) |
+| `description` | string | Yes | The trigger name |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
@@ -108,11 +108,11 @@ Update a pipeline trigger token for a project.
PUT /projects/:id/triggers/:trigger_id
```
-| Attribute | Type | required | Description |
-|---------------|---------|----------|--------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
-| `trigger_id` | integer | yes | The trigger ID |
-| `description` | string | no | The trigger name |
+| Attribute | Type | Required | Description |
+|---------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) |
+| `trigger_id` | integer | Yes | The trigger ID |
+| `description` | string | No | The trigger name |
```shell
curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" \
@@ -139,10 +139,10 @@ Remove a project's pipeline trigger token.
DELETE /projects/:id/triggers/:trigger_id
```
-| Attribute | Type | required | Description |
-|----------------|---------|----------|--------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
-| `trigger_id` | integer | yes | The trigger ID |
+| Attribute | Type | Required | Description |
+|--------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) |
+| `trigger_id` | integer | Yes | The trigger ID |
```shell
curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/triggers/5"
@@ -165,12 +165,12 @@ POST /projects/:id/trigger/pipeline
Supported attributes:
-| Attribute | Type | Required | Description |
-|:------------|:---------------|:-----------------------|:---------------------|
-| `id` | integer/string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user. |
-| `ref` | string | **{check-circle}** Yes | The branch or tag to run the pipeline on. |
-| `token` | string | **{check-circle}** Yes | The trigger token or CI/CD job token. |
-| `variables` | hash | **{dotted-circle}** No | A map of key-valued strings containing the pipeline variables. For example: `{ VAR1: "value1", VAR2: "value2" }`. |
+| Attribute | Type | Required | Description |
+|-------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
+| `ref` | string | Yes | The branch or tag to run the pipeline on. |
+| `token` | string | Yes | The trigger token or CI/CD job token. |
+| `variables` | hash | No | A map of key-valued strings containing the pipeline variables. For example: `{ VAR1: "value1", VAR2: "value2" }`. |
Example request:
diff --git a/doc/api/pipelines.md b/doc/api/pipelines.md
index fed0e553a9e..4fca878fcec 100644
--- a/doc/api/pipelines.md
+++ b/doc/api/pipelines.md
@@ -20,7 +20,7 @@ Read more on [pagination](rest/index.md#pagination).
FLAG:
On self-managed GitLab, by default the `name` field is not available.
-To make it available, ask an administrator to [enable the feature flag](../administration/feature_flags.md)
+To make it available, an administrator can [enable the feature flag](../administration/feature_flags.md)
named `pipeline_name_in_api`. This feature is not ready for production use.
On GitLab.com, this feature is not available.
@@ -31,21 +31,21 @@ but you can [get child pipeline](pipelines.md#get-a-single-pipeline) individuall
GET /projects/:id/pipelines
```
-| Attribute | Type | Required | Description |
-|-----------|---------|----------|---------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
-| `scope` | string | no | The scope of pipelines, one of: `running`, `pending`, `finished`, `branches`, `tags` |
-| `status` | string | no | The status of pipelines, one of: `created`, `waiting_for_resource`, `preparing`, `pending`, `running`, `success`, `failed`, `canceled`, `skipped`, `manual`, `scheduled` |
-| `source` | string | no | In [GitLab 14.3 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/325439), how the pipeline was triggered, one of: `push`, `web`, `trigger`, `schedule`, `api`, `external`, `pipeline`, `chat`, `webide`, `merge_request_event`, `external_pull_request_event`, `parent_pipeline`, `ondemand_dast_scan`, or `ondemand_dast_validation`. |
-| `ref` | string | no | The ref of pipelines |
-| `sha` | string | no | The SHA of pipelines |
-| `yaml_errors`| boolean | no | Returns pipelines with invalid configurations |
-| `username`| string | no | The username of the user who triggered pipelines |
-| `updated_after` | datetime | no | Return pipelines updated after the specified date. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`). |
-| `updated_before` | datetime | no | Return pipelines updated before the specified date. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`). |
-| `name` | string | no | Return pipelines with the specified name. Introduced in GitLab 15.11, not available by default. |
-| `order_by`| string | no | Order pipelines by `id`, `status`, `ref`, `updated_at` or `user_id` (default: `id`) |
-| `sort` | string | no | Sort pipelines in `asc` or `desc` order (default: `desc`) |
+| Attribute | Type | Required | Description |
+|------------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) |
+| `scope` | string | No | The scope of pipelines, one of: `running`, `pending`, `finished`, `branches`, `tags` |
+| `status` | string | No | The status of pipelines, one of: `created`, `waiting_for_resource`, `preparing`, `pending`, `running`, `success`, `failed`, `canceled`, `skipped`, `manual`, `scheduled` |
+| `source` | string | No | In [GitLab 14.3 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/325439), how the pipeline was triggered, one of: `push`, `web`, `trigger`, `schedule`, `api`, `external`, `pipeline`, `chat`, `webide`, `merge_request_event`, `external_pull_request_event`, `parent_pipeline`, `ondemand_dast_scan`, or `ondemand_dast_validation`. |
+| `ref` | string | No | The ref of pipelines |
+| `sha` | string | No | The SHA of pipelines |
+| `yaml_errors` | boolean | No | Returns pipelines with invalid configurations |
+| `username` | string | No | The username of the user who triggered pipelines |
+| `updated_after` | datetime | No | Return pipelines updated after the specified date. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`). |
+| `updated_before` | datetime | No | Return pipelines updated before the specified date. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`). |
+| `name` | string | No | Return pipelines with the specified name. Introduced in GitLab 15.11, not available by default. |
+| `order_by` | string | No | Order pipelines by `id`, `status`, `ref`, `updated_at` or `user_id` (default: `id`) |
+| `sort` | string | No | Sort pipelines in `asc` or `desc` order (default: `desc`) |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/pipelines"
@@ -91,23 +91,22 @@ Example of response
FLAG:
On self-managed GitLab, by default the `name` field is not available.
-To make it available, ask an administrator to [enable the feature flag](../administration/feature_flags.md)
+To make it available, an administrator can [enable the feature flag](../administration/feature_flags.md)
named `pipeline_name_in_api`. This feature is not ready for production use.
On GitLab.com, this feature is not available.
Get one pipeline from a project.
You can also get a single [child pipeline](../ci/pipelines/downstream_pipelines.md#parent-child-pipelines).
-[Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/36494) in GitLab 13.3.
```plaintext
GET /projects/:id/pipelines/:pipeline_id
```
-| Attribute | Type | Required | Description |
-|------------|---------|----------|---------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
-| `pipeline_id` | integer | yes | The ID of a pipeline |
+| Attribute | Type | Required | Description |
+|---------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) |
+| `pipeline_id` | integer | Yes | The ID of a pipeline |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/pipelines/46"
@@ -153,10 +152,10 @@ Example of response
GET /projects/:id/pipelines/:pipeline_id/variables
```
-| Attribute | Type | Required | Description |
-|------------|---------|----------|---------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
-| `pipeline_id` | integer | yes | The ID of a pipeline |
+| Attribute | Type | Required | Description |
+|---------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) |
+| `pipeline_id` | integer | Yes | The ID of a pipeline |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/pipelines/46/variables"
@@ -180,8 +179,6 @@ Example of response
### Get a pipeline's test report
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/202525) in GitLab 13.0.
-
NOTE:
This API route is part of the [Unit test report](../ci/testing/unit_test_reports.md) feature.
@@ -189,10 +186,10 @@ This API route is part of the [Unit test report](../ci/testing/unit_test_reports
GET /projects/:id/pipelines/:pipeline_id/test_report
```
-| Attribute | Type | Required | Description |
-|------------|---------|----------|---------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
-| `pipeline_id` | integer | yes | The ID of a pipeline |
+| Attribute | Type | Required | Description |
+|---------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) |
+| `pipeline_id` | integer | Yes | The ID of a pipeline |
Sample request:
@@ -245,10 +242,10 @@ This API route is part of the [Unit test report](../ci/testing/unit_test_reports
GET /projects/:id/pipelines/:pipeline_id/test_report_summary
```
-| Attribute | Type | Required | Description |
-|------------|---------|----------|---------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
-| `pipeline_id` | integer | yes | The ID of a pipeline |
+| Attribute | Type | Required | Description |
+|---------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) |
+| `pipeline_id` | integer | Yes | The ID of a pipeline |
Sample request:
@@ -293,7 +290,7 @@ Sample response:
FLAG:
On self-managed GitLab, by default the `name` field is not available.
-To make it available, ask an administrator to [enable the feature flag](../administration/feature_flags.md)
+To make it available, an administrator can [enable the feature flag](../administration/feature_flags.md)
named `pipeline_name_in_api`. This feature is not ready for production use.
On GitLab.com, this feature is not available.
@@ -303,12 +300,12 @@ Get the latest pipeline for a specific ref in a project.
GET /projects/:id/pipelines/latest
```
-| Attribute | Type | Required | Description |
-|-------------|---------|----------|---------------------|
-| `ref` | string | no | The branch or tag to check for the latest pipeline. Defaults to the default branch when not specified. |
+| Attribute | Type | Required | Description |
+|-----------|--------|----------|-------------|
+| `ref` | string | No | The branch or tag to check for the latest pipeline. Defaults to the default branch when not specified. |
```shell
-curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/pipelines/latest"
+curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/pipelines/latest"
```
Example of response
@@ -365,11 +362,11 @@ Example of response
POST /projects/:id/pipeline
```
-| Attribute | Type | Required | Description |
-|-------------|---------|----------|---------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
-| `ref` | string | yes | The branch or tag to run the pipeline on. |
-| `variables` | array | no | An [array of hashes](rest/index.md#array-of-hashes) containing the variables available in the pipeline, matching the structure `[{ 'key': 'UPLOAD_TO_S3', 'variable_type': 'file', 'value': 'true' }, {'key': 'TEST', 'value': 'test variable'}]`. If `variable_type` is excluded, it defaults to `env_var`. |
+| Attribute | Type | Required | Description |
+|-------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) |
+| `ref` | string | Yes | The branch or tag to run the pipeline on. |
+| `variables` | array | No | An [array of hashes](rest/index.md#array-of-hashes) containing the variables available in the pipeline, matching the structure `[{ 'key': 'UPLOAD_TO_S3', 'variable_type': 'file', 'value': 'true' }, {'key': 'TEST', 'value': 'test variable'}]`. If `variable_type` is excluded, it defaults to `env_var`. |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/pipeline?ref=main"
@@ -416,10 +413,10 @@ Example of response
POST /projects/:id/pipelines/:pipeline_id/retry
```
-| Attribute | Type | Required | Description |
-|------------|---------|----------|---------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
-| `pipeline_id` | integer | yes | The ID of a pipeline |
+| Attribute | Type | Required | Description |
+|---------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) |
+| `pipeline_id` | integer | Yes | The ID of a pipeline |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/pipelines/46/retry"
@@ -464,10 +461,10 @@ Response:
POST /projects/:id/pipelines/:pipeline_id/cancel
```
-| Attribute | Type | Required | Description |
-|------------|---------|----------|---------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
-| `pipeline_id` | integer | yes | The ID of a pipeline |
+| Attribute | Type | Required | Description |
+|---------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) |
+| `pipeline_id` | integer | Yes | The ID of a pipeline |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/pipelines/46/cancel"
@@ -508,8 +505,6 @@ Response:
## Delete a pipeline
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22988) in GitLab 11.6.
-
Deleting a pipeline expires all pipeline caches, and deletes all immediately
related objects, such as builds, logs, artifacts, and triggers.
**This action cannot be undone.**
@@ -523,10 +518,10 @@ for details.
DELETE /projects/:id/pipelines/:pipeline_id
```
-| Attribute | Type | Required | Description |
-|------------|---------|----------|---------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
-| `pipeline_id` | integer | yes | The ID of a pipeline |
+| Attribute | Type | Required | Description |
+|---------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) |
+| `pipeline_id` | integer | Yes | The ID of a pipeline |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" --request "DELETE" "https://gitlab.example.com/api/v4/projects/1/pipelines/46"
diff --git a/doc/api/product_analytics.md b/doc/api/product_analytics.md
index c37fe223778..70f0d40f7b5 100644
--- a/doc/api/product_analytics.md
+++ b/doc/api/product_analytics.md
@@ -11,7 +11,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - `product_analytics_internal_preview` replaced with `product_analytics_dashboards` in GitLab 15.11.
FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available per project or for your entire instance, ask an administrator to [enable the feature flag](../administration/feature_flags.md) named `cube_api_proxy`.
+On self-managed GitLab, by default this feature is not available. To make it available per project or for your entire instance, an administrator can [enable the feature flag](../administration/feature_flags.md) named `cube_api_proxy`.
On GitLab.com, this feature is not available.
This feature is not ready for production use.
diff --git a/doc/api/project_access_tokens.md b/doc/api/project_access_tokens.md
index 437bdaa70f4..36129bf6576 100644
--- a/doc/api/project_access_tokens.md
+++ b/doc/api/project_access_tokens.md
@@ -84,6 +84,7 @@ curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/a
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55408) in GitLab 13.10.
> - The `token` attribute was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55408) in GitLab 13.10.
+> - The `expires_at` attribute default was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/120213) in GitLab 16.0.
Create a [project access token](../user/project/settings/project_access_tokens.md).
@@ -105,7 +106,7 @@ POST projects/:id/access_tokens
| `name` | String | yes | Name of the project access token |
| `scopes` | `Array[String]` | yes | [List of scopes](../user/project/settings/project_access_tokens.md#scopes-for-a-project-access-token) |
| `access_level` | Integer | no | Access level. Valid values are `10` (Guest), `20` (Reporter), `30` (Developer), `40` (Maintainer), and `50` (Owner). Defaults to `40`. |
-| `expires_at` | Date | no | Token expires at midnight UTC on that date |
+| `expires_at` | Date | yes | Expiration date of the access token in ISO format (`YYYY-MM-DD`). The date cannot be set later than the [maximum allowable lifetime of an access token](../user/profile/personal_access_tokens.md#when-personal-access-tokens-expire). |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
diff --git a/doc/api/project_import_export.md b/doc/api/project_import_export.md
index fbbefe95cd8..bae300efaf4 100644
--- a/doc/api/project_import_export.md
+++ b/doc/api/project_import_export.md
@@ -32,7 +32,7 @@ project to a web server or to any S3-compatible platform. For exports, GitLab:
time and is available throughout the export process.
- Administrators can modify the maximum export file size. By default, the maximum is unlimited (`0`). To change this,
edit `max_export_size` using either:
- - [GitLab UI](../user/admin_area/settings/account_and_limit_settings.md).
+ - [GitLab UI](../administration/settings/account_and_limit_settings.md).
- [Application settings API](settings.md#change-application-settings)
- Has a fixed limit for the maximum import file size on GitLab.com. For more information, see
[Account and limit settings](../user/gitlab_com/index.md#account-and-limit-settings).
@@ -203,14 +203,14 @@ requests.post(url, headers=headers, data=data, files=files)
NOTE:
The maximum import file size can be set by the Administrator. It defaults to `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 Area](../user/admin_area/settings/account_and_limit_settings.md). Default [modified](https://gitlab.com/gitlab-org/gitlab/-/issues/251106) from 50 MB 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](../administration/settings/account_and_limit_settings.md). Default [modified](https://gitlab.com/gitlab-org/gitlab/-/issues/251106) from 50 MB to 0 in GitLab 13.8.
## Import a file from a remote object storage (Beta)
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/282503) in GitLab 13.12 in [Beta](../policy/experiment-beta-support.md#beta) [with a flag](../administration/feature_flags.md) named `import_project_from_remote_file`. 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 `import_project_from_remote_file`.
+On self-managed GitLab, by default this feature is available. To hide the feature, an administrator can [disable the feature flag](../administration/feature_flags.md) named `import_project_from_remote_file`.
On GitLab.com, this feature is available.
```plaintext
diff --git a/doc/api/project_job_token_scopes.md b/doc/api/project_job_token_scopes.md
index c73e6ea203e..4d1e013ee14 100644
--- a/doc/api/project_job_token_scopes.md
+++ b/doc/api/project_job_token_scopes.md
@@ -22,16 +22,16 @@ GET /projects/:id/job_token_scope
Supported attributes:
-| Attribute | Type | Required | Description |
-|-----------|----------------|------------------------|-------------|
-| `id` | integer/string | **{check-circle}** Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user. |
+| Attribute | Type | Required | Description |
+|-----------|----------------|----------|-------------|
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
If successful, returns [`200`](rest/index.md#status-codes) and the following response attributes:
-| Attribute | Type | Description |
-|:-------------------|:--------|:----------------------|
+| Attribute | Type | Description |
+|--------------------|---------|-------------|
| `inbound_enabled` | boolean | Indicates if the CI/CD job token generated in other projects has access to this project. |
-| `outbound_enabled` | boolean | Indicates if the CI/CD job token generated in this project has access to other projects. [Deprecated and planned for removal in GitLab 17.0 .](../update/removals.md#limit-ci_job_token-scope-is-disabled) |
+| `outbound_enabled` | boolean | Indicates if the CI/CD job token generated in this project has access to other projects. [Deprecated and planned for removal in GitLab 17.0](../update/deprecations.md#default-cicd-job-token-ci_job_token-scope-changed). |
Example request:
@@ -58,10 +58,10 @@ PATCH /projects/:id/job_token_scope
Supported attributes:
-| Attribute | Type | Required | Description |
-|-----------|----------------|------------------------|-------------|
-| `id` | integer/string | **{check-circle}** Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user. |
-| `enabled` | boolean | **{check-circle}** Yes | Indicates CI/CD job tokens generated in other projects have restricted access to this project. |
+| Attribute | Type | Required | Description |
+|-----------|----------------|----------|-------------|
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
+| `enabled` | boolean | Yes | Indicates CI/CD job tokens generated in other projects have restricted access to this project. |
If successful, returns [`204`](rest/index.md#status-codes) and no response body.
@@ -85,9 +85,9 @@ GET /projects/:id/job_token_scope/allowlist
Supported attributes:
-| Attribute | Type | Required | Description |
-|-----------|----------------|------------------------|-------------|
-| `id` | integer/string | **{check-circle}** Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user. |
+| Attribute | Type | Required | Description |
+|-----------|----------------|----------|-------------|
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
This endpoint supports [offset-based pagination](rest/index.md#offset-based-pagination).
@@ -152,10 +152,10 @@ POST /projects/:id/job_token_scope/allowlist
Supported attributes:
-| Attribute | Type | Required | Description |
-|---------------------|----------------|------------------------|-------------|
-| `id` | integer/string | **{check-circle}** Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user. |
-| `target_project_id` | integer | **{check-circle}** Yes | The ID of the project added to the CI/CD job token inbound allowlist. |
+| Attribute | Type | Required | Description |
+|---------------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
+| `target_project_id` | integer | Yes | The ID of the project added to the CI/CD job token inbound allowlist. |
If successful, returns [`201`](rest/index.md#status-codes) and the following response attributes:
@@ -193,10 +193,10 @@ DELETE /projects/:id/job_token_scope/allowlist/:target_project_id
Supported attributes:
-| Attribute | Type | Required | Description |
-|---------------------|----------------|------------------------|-------------|
-| `id` | integer/string | **{check-circle}** Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user. |
-| `target_project_id` | integer | **{check-circle}** Yes | The ID of the project that is removed from the CI/CD job token inbound allowlist. |
+| Attribute | Type | Required | Description |
+|---------------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
+| `target_project_id` | integer | Yes | The ID of the project that is removed from the CI/CD job token inbound allowlist. |
If successful, returns [`204`](rest/index.md#status-codes) and no response body.
diff --git a/doc/api/project_level_variables.md b/doc/api/project_level_variables.md
index fa699c34a8a..46e491453f9 100644
--- a/doc/api/project_level_variables.md
+++ b/doc/api/project_level_variables.md
@@ -15,9 +15,9 @@ Get list of a project's variables.
GET /projects/:id/variables
```
-| Attribute | Type | Required | Description |
-| --------- | -------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID of a project or [URL-encoded NAMESPACE/PROJECT_NAME of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
+| Attribute | Type | Required | Description |
+|-----------|----------------|----------|-------------|
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/variables"
@@ -32,7 +32,8 @@ curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/a
"protected": false,
"masked": true,
"raw": false,
- "environment_scope": "*"
+ "environment_scope": "*",
+ "description": null
},
{
"variable_type": "env_var",
@@ -41,7 +42,8 @@ curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/a
"protected": false,
"masked": false,
"raw": false,
- "environment_scope": "*"
+ "environment_scope": "*",
+ "description": null
}
]
```
@@ -55,11 +57,11 @@ use `filter` to select the correct `environment_scope`.
GET /projects/:id/variables/:key
```
-| Attribute | Type | Required | Description |
-| --------- | -------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID of a project or [URL-encoded NAMESPACE/PROJECT_NAME of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
-| `key` | string | yes | The `key` of a variable |
-| `filter` | hash | no | Available filters: `[environment_scope]`. See the [`filter` parameter details](#the-filter-parameter). |
+| Attribute | Type | Required | Description |
+|-----------|----------------|----------|-------------|
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) |
+| `key` | string | Yes | The `key` of a variable |
+| `filter` | hash | No | Available filters: `[environment_scope]`. See the [`filter` parameter details](#the-filter-parameter). |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/variables/TEST_VARIABLE_1"
@@ -73,7 +75,8 @@ curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/a
"protected": false,
"masked": true,
"raw": false,
- "environment_scope": "*"
+ "environment_scope": "*",
+ "description": null
}
```
@@ -87,16 +90,17 @@ must have a different `environment_scope`. Otherwise, GitLab returns a message s
POST /projects/:id/variables
```
-| Attribute | Type | Required | Description |
-| ------------------- | -------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID of a project or [URL-encoded NAMESPACE/PROJECT_NAME of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
-| `key` | string | yes | The `key` of a variable; must have no more than 255 characters; only `A-Z`, `a-z`, `0-9`, and `_` are allowed |
-| `value` | string | yes | The `value` of a variable |
-| `variable_type` | string | no | The type of a variable. Available types are: `env_var` (default) and `file` |
-| `protected` | boolean | no | Whether the variable is protected. Default: `false` |
-| `masked` | boolean | no | Whether the variable is masked. Default: `false` |
-| `raw` | boolean | no | Whether the variable is treated as a raw string. Default: `false`. When `true`, variables in the value are not [expanded](../ci/variables/index.md#prevent-cicd-variable-expansion). |
-| `environment_scope` | string | no | The `environment_scope` of the variable. Default: `*` |
+| Attribute | Type | Required | Description |
+|---------------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) |
+| `key` | string | Yes | The `key` of a variable; must have no more than 255 characters; only `A-Z`, `a-z`, `0-9`, and `_` are allowed |
+| `value` | string | Yes | The `value` of a variable |
+| `variable_type` | string | No | The type of a variable. Available types are: `env_var` (default) and `file` |
+| `protected` | boolean | No | Whether the variable is protected. Default: `false` |
+| `masked` | boolean | No | Whether the variable is masked. Default: `false` |
+| `raw` | boolean | No | Whether the variable is treated as a raw string. Default: `false`. When `true`, variables in the value are not [expanded](../ci/variables/index.md#prevent-cicd-variable-expansion). |
+| `environment_scope` | string | No | The `environment_scope` of the variable. Default: `*` |
+| `description` | string | No | The description of the variable. Default: `null`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/409641) in GitLab 16.2. |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
@@ -111,7 +115,8 @@ curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
"protected": false,
"masked": false,
"raw": false,
- "environment_scope": "*"
+ "environment_scope": "*",
+ "description": null
}
```
@@ -124,17 +129,18 @@ use `filter` to select the correct `environment_scope`.
PUT /projects/:id/variables/:key
```
-| Attribute | Type | Required | Description |
-| ------------------- | -------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID of a project or [URL-encoded NAMESPACE/PROJECT_NAME of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
-| `key` | string | yes | The `key` of a variable |
-| `value` | string | yes | The `value` of a variable |
-| `variable_type` | string | no | The type of a variable. Available types are: `env_var` (default) and `file` |
-| `protected` | boolean | no | Whether the variable is protected |
-| `masked` | boolean | no | Whether the variable is masked |
-| `raw` | boolean | no | Whether the variable is treated as a raw string. Default: `false`. When `true`, variables in the value are not [expanded](../ci/variables/index.md#prevent-cicd-variable-expansion). |
-| `environment_scope` | string | no | The `environment_scope` of the variable |
-| `filter` | hash | no | Available filters: `[environment_scope]`. See the [`filter` parameter details](#the-filter-parameter). |
+| Attribute | Type | Required | Description |
+|---------------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) |
+| `key` | string | Yes | The `key` of a variable |
+| `value` | string | Yes | The `value` of a variable |
+| `variable_type` | string | No | The type of a variable. Available types are: `env_var` (default) and `file` |
+| `protected` | boolean | No | Whether the variable is protected |
+| `masked` | boolean | No | Whether the variable is masked |
+| `raw` | boolean | No | Whether the variable is treated as a raw string. Default: `false`. When `true`, variables in the value are not [expanded](../ci/variables/index.md#prevent-cicd-variable-expansion). |
+| `environment_scope` | string | No | The `environment_scope` of the variable |
+| `filter` | hash | No | Available filters: `[environment_scope]`. See the [`filter` parameter details](#the-filter-parameter). |
+| `description` | string | No | The description of the variable. Default: `null`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/409641) in GitLab 16.2. |
```shell
curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" \
@@ -149,7 +155,8 @@ curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" \
"protected": true,
"masked": false,
"raw": false,
- "environment_scope": "*"
+ "environment_scope": "*",
+ "description": "null"
}
```
@@ -162,11 +169,11 @@ use `filter` to select the correct `environment_scope`.
DELETE /projects/:id/variables/:key
```
-| Attribute | Type | Required | Description |
-| --------- | -------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID of a project or [URL-encoded NAMESPACE/PROJECT_NAME of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user |
-| `key` | string | yes | The `key` of a variable |
-| `filter` | hash | no | Available filters: `[environment_scope]`. See the [`filter` parameter details](#the-filter-parameter). |
+| Attribute | Type | Required | Description |
+|-----------|----------------|----------|-------------|
+| `id` | integer/string | Yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) |
+| `key` | string | Yes | The `key` of a variable |
+| `filter` | hash | No | Available filters: `[environment_scope]`. See the [`filter` parameter details](#the-filter-parameter). |
```shell
curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/variables/VARIABLE_1"
diff --git a/doc/api/project_relations_export.md b/doc/api/project_relations_export.md
index 1fef2722bb8..e209259c6cc 100644
--- a/doc/api/project_relations_export.md
+++ b/doc/api/project_relations_export.md
@@ -6,14 +6,18 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Project relations export API **(FREE)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70330) in GitLab 14.4 behind the `bulk_import` [feature flag](../administration/feature_flags.md), disabled by default.
-> - New application setting `bulk_import_enabled` introduced in GitLab 15.8. `bulk_import` feature flag removed.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70330) in GitLab 14.4 behind
+ the `bulk_import` [feature flag](../administration/feature_flags.md), disabled by default.
+> - New application setting `bulk_import_enabled` introduced in GitLab 15.8. `bulk_import` feature
+ flag removed.
-The project relations export API partially exports a project's structure as separate files for each top-level
+The project relations export API partially exports a project's structure as separate files for each
+top-level
relation (for example, milestones, issues, and labels).
The project relations export API is primarily used in
-[group migration](../user/group/import/index.md#migrate-groups-by-direct-transfer-recommended) can't be used with the
+[group migration](../user/group/import/index.md#migrate-groups-by-direct-transfer-recommended) can't
+be used with the
[project import and export API](project_import_export.md).
## Schedule new export
@@ -24,9 +28,10 @@ Start a new project relations export:
POST /projects/:id/export_relations
```
-| Attribute | Type | Required | Description |
-| --------- | -------------- | -------- | ---------------------------------------- |
+| Attribute | Type | Required | Description |
+|-----------|----------------|----------|----------------------------------------------------|
| `id` | integer/string | yes | ID of the project owned by the authenticated user. |
+| `batched` | boolean | no | Whether to export in batches. |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/export_relations"
@@ -46,9 +51,10 @@ View the status of the relations export:
GET /projects/:id/export_relations/status
```
-| Attribute | Type | Required | Description |
-| --------- | -------------- | -------- | ---------------------------------------- |
-| `id` | integer/string | yes | ID of the project owned by the authenticated user. |
+| Attribute | Type | Required | Description |
+|------------|----------------|----------|----------------------------------------------------|
+| `id` | integer/string | yes | ID of the project owned by the authenticated user. |
+| `relation` | string | no | Name of the project top-level relation to view. |
```shell
curl --request GET --header "PRIVATE-TOKEN: <your_access_token>" \
@@ -71,13 +77,24 @@ The status can be one of the following:
"relation": "project_badges",
"status": 1,
"error": null,
- "updated_at": "2021-05-04T11:25:20.423Z"
+ "updated_at": "2021-05-04T11:25:20.423Z",
+ "batched": true,
+ "batches": [
+ {
+ "status": 1,
+ "batch_number": 1,
+ "objects_count": 1,
+ "error": null,
+ "updated_at": "2021-05-04T11:25:20.423Z"
+ }
+ ]
},
{
"relation": "boards",
"status": 1,
"error": null,
- "updated_at": "2021-05-04T11:25:20.085Z"
+ "updated_at": "2021-05-04T11:25:20.085Z",
+ "batched": false
}
]
```
@@ -90,10 +107,12 @@ Download the finished relations export:
GET /projects/:id/export_relations/download
```
-| Attribute | Type | Required | Description |
-| --------------- | -------------- | -------- | ---------------------------------------- |
-| `id` | integer/string | yes | ID of the project owned by the authenticated user. |
-| `relation` | string | yes | Name of the project top-level relation to download. |
+| Attribute | Type | Required | Description |
+|----------------|----------------|----------|-----------------------------------------------------|
+| `id` | integer/string | yes | ID of the project owned by the authenticated user. |
+| `relation` | string | yes | Name of the project top-level relation to download. |
+| `batched` | boolean | no | Whether the export is batched. |
+| `batch_number` | integer | no | Number of export batch to download. |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" --remote-header-name \
diff --git a/doc/api/project_snippets.md b/doc/api/project_snippets.md
index e39836f2781..b82e46a03cc 100644
--- a/doc/api/project_snippets.md
+++ b/doc/api/project_snippets.md
@@ -14,7 +14,7 @@ You can set it with the `visibility` field in the snippet.
Constants for snippet visibility levels are:
- **Private**: The snippet is visible only to project members.
-- **Internal**: The snippet is visible for any authenticated user except [external users](../user/admin_area/external_users.md).
+- **Internal**: The snippet is visible for any authenticated user except [external users](../administration/external_users.md).
- **Public**: The snippet can be accessed without any authentication.
NOTE:
diff --git a/doc/api/projects.md b/doc/api/projects.md
index 5547546e6cc..6afed915135 100644
--- a/doc/api/projects.md
+++ b/doc/api/projects.md
@@ -304,6 +304,10 @@ Keyset pagination supports only `order_by=id`. Other sorting options aren't avai
Get a list of visible projects owned by the given user. When accessed without
authentication, only public projects are returned.
+Prerequisite:
+
+- To view [certain attributes](https://gitlab.com/gitlab-org/gitlab/-/blob/520776fa8e5a11b8275b7c597d75246fcfc74c89/lib/api/entities/project.rb#L109-130), you must be an administrator or have the Owner role for the project.
+
NOTE:
Only the projects in the user's (specified in `user_id`) namespace are returned. Projects owned by the user in any group or subgroups are not returned. An empty list is returned if a profile is set to private.
@@ -578,6 +582,248 @@ GET /users/:user_id/projects
]
```
+## List projects a user has contributed to
+
+Get a list of visible projects a given user has contributed to.
+
+```plaintext
+GET /users/:user_id/contributed_projects
+```
+
+| Attribute | Type | Required | Description |
+|-------------------------------|---------|------------------------|-------------|
+| `user_id` | string | **{check-circle}** Yes | The ID or username of the user. |
+| `order_by` | string | **{dotted-circle}** No | Return projects ordered by `id`, `name`, `path`, `created_at`, `updated_at`, or `last_activity_at` fields. Default is `created_at`. |
+| `simple` | boolean | **{dotted-circle}** No | Return only limited fields for each project. Without authentication, this operation is a no-op; only simple fields are returned. |
+| `sort` | string | **{dotted-circle}** No | Return projects sorted in `asc` or `desc` order. Default is `desc`. |
+
+```shell
+curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/users/5/contributed_projects"
+```
+
+Example response:
+
+```json
+[
+ {
+ "id": 4,
+ "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
+ "description_html": "<p data-sourcepos=\"1:1-1:56\" dir=\"auto\">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>",
+ "default_branch": "master",
+ "visibility": "private",
+ "ssh_url_to_repo": "git@example.com:diaspora/diaspora-client.git",
+ "http_url_to_repo": "http://example.com/diaspora/diaspora-client.git",
+ "web_url": "http://example.com/diaspora/diaspora-client",
+ "readme_url": "http://example.com/diaspora/diaspora-client/blob/master/README.md",
+ "tag_list": [ //deprecated, use `topics` instead
+ "example",
+ "disapora client"
+ ],
+ "topics": [
+ "example",
+ "disapora client"
+ ],
+ "owner": {
+ "id": 3,
+ "name": "Diaspora",
+ "created_at": "2013-09-30T13:46:02Z"
+ },
+ "name": "Diaspora Client",
+ "name_with_namespace": "Diaspora / Diaspora Client",
+ "path": "diaspora-client",
+ "path_with_namespace": "diaspora/diaspora-client",
+ "issues_enabled": true,
+ "open_issues_count": 1,
+ "merge_requests_enabled": true,
+ "jobs_enabled": true,
+ "wiki_enabled": true,
+ "snippets_enabled": false,
+ "can_create_merge_request_in": true,
+ "resolve_outdated_diff_discussions": false,
+ "container_registry_enabled": false, // deprecated, use container_registry_access_level instead
+ "container_registry_access_level": "disabled",
+ "security_and_compliance_access_level": "disabled",
+ "created_at": "2013-09-30T13:46:02Z",
+ "updated_at": "2013-09-30T13:46:02Z",
+ "last_activity_at": "2013-09-30T13:46:02Z",
+ "creator_id": 3,
+ "namespace": {
+ "id": 3,
+ "name": "Diaspora",
+ "path": "diaspora",
+ "kind": "group",
+ "full_path": "diaspora"
+ },
+ "import_status": "none",
+ "archived": false,
+ "avatar_url": "http://example.com/uploads/project/avatar/4/uploads/avatar.png",
+ "shared_runners_enabled": true,
+ "group_runners_enabled": true,
+ "forks_count": 0,
+ "star_count": 0,
+ "runners_token": "b8547b1dc37721d05889db52fa2f02",
+ "public_jobs": true,
+ "shared_with_groups": [],
+ "only_allow_merge_if_pipeline_succeeds": false,
+ "allow_merge_on_skipped_pipeline": false,
+ "restrict_user_defined_variables": false,
+ "only_allow_merge_if_all_discussions_are_resolved": false,
+ "remove_source_branch_after_merge": false,
+ "request_access_enabled": false,
+ "merge_method": "merge",
+ "squash_option": "default_on",
+ "autoclose_referenced_issues": true,
+ "enforce_auth_checks_on_uploads": true,
+ "suggestion_commit_message": null,
+ "merge_commit_template": null,
+ "squash_commit_template": null,
+ "issue_branch_template": "gitlab/%{id}-%{title}",
+ "statistics": {
+ "commit_count": 37,
+ "storage_size": 1038090,
+ "repository_size": 1038090,
+ "lfs_objects_size": 0,
+ "job_artifacts_size": 0,
+ "pipeline_artifacts_size": 0,
+ "packages_size": 0,
+ "snippets_size": 0,
+ "uploads_size": 0
+ },
+ "container_registry_image_prefix": "registry.example.com/diaspora/diaspora-client",
+ "_links": {
+ "self": "http://example.com/api/v4/projects",
+ "issues": "http://example.com/api/v4/projects/1/issues",
+ "merge_requests": "http://example.com/api/v4/projects/1/merge_requests",
+ "repo_branches": "http://example.com/api/v4/projects/1/repository_branches",
+ "labels": "http://example.com/api/v4/projects/1/labels",
+ "events": "http://example.com/api/v4/projects/1/events",
+ "members": "http://example.com/api/v4/projects/1/members",
+ "cluster_agents": "http://example.com/api/v4/projects/1/cluster_agents"
+ }
+ },
+ {
+ "id": 6,
+ "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
+ "description_html": "<p data-sourcepos=\"1:1-1:56\" dir=\"auto\">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>",
+ "default_branch": "master",
+ "visibility": "private",
+ "ssh_url_to_repo": "git@example.com:brightbox/puppet.git",
+ "http_url_to_repo": "http://example.com/brightbox/puppet.git",
+ "web_url": "http://example.com/brightbox/puppet",
+ "readme_url": "http://example.com/brightbox/puppet/blob/master/README.md",
+ "tag_list": [ //deprecated, use `topics` instead
+ "example",
+ "puppet"
+ ],
+ "topics": [
+ "example",
+ "puppet"
+ ],
+ "owner": {
+ "id": 4,
+ "name": "Brightbox",
+ "created_at": "2013-09-30T13:46:02Z"
+ },
+ "name": "Puppet",
+ "name_with_namespace": "Brightbox / Puppet",
+ "path": "puppet",
+ "path_with_namespace": "brightbox/puppet",
+ "issues_enabled": true,
+ "open_issues_count": 1,
+ "merge_requests_enabled": true,
+ "jobs_enabled": true,
+ "wiki_enabled": true,
+ "snippets_enabled": false,
+ "can_create_merge_request_in": true,
+ "resolve_outdated_diff_discussions": false,
+ "container_registry_enabled": false, // deprecated, use container_registry_access_level instead
+ "container_registry_access_level": "disabled",
+ "security_and_compliance_access_level": "disabled",
+ "created_at": "2013-09-30T13:46:02Z",
+ "updated_at": "2013-09-30T13:46:02Z",
+ "last_activity_at": "2013-09-30T13:46:02Z",
+ "creator_id": 3,
+ "namespace": {
+ "id": 4,
+ "name": "Brightbox",
+ "path": "brightbox",
+ "kind": "group",
+ "full_path": "brightbox"
+ },
+ "import_status": "none",
+ "import_error": null,
+ "permissions": {
+ "project_access": {
+ "access_level": 10,
+ "notification_level": 3
+ },
+ "group_access": {
+ "access_level": 50,
+ "notification_level": 3
+ }
+ },
+ "archived": false,
+ "avatar_url": null,
+ "shared_runners_enabled": true,
+ "group_runners_enabled": true,
+ "forks_count": 0,
+ "star_count": 0,
+ "runners_token": "b8547b1dc37721d05889db52fa2f02",
+ "public_jobs": true,
+ "shared_with_groups": [],
+ "only_allow_merge_if_pipeline_succeeds": false,
+ "allow_merge_on_skipped_pipeline": false,
+ "restrict_user_defined_variables": false,
+ "only_allow_merge_if_all_discussions_are_resolved": false,
+ "remove_source_branch_after_merge": false,
+ "request_access_enabled": false,
+ "merge_method": "merge",
+ "squash_option": "default_on",
+ "auto_devops_enabled": true,
+ "auto_devops_deploy_strategy": "continuous",
+ "repository_storage": "default",
+ "approvals_before_merge": 0, // Deprecated. Use merge request approvals API instead.
+ "mirror": false,
+ "mirror_user_id": 45,
+ "mirror_trigger_builds": false,
+ "only_mirror_protected_branches": false,
+ "mirror_overwrites_diverged_branches": false,
+ "external_authorization_classification_label": null,
+ "packages_enabled": true,
+ "service_desk_enabled": false,
+ "service_desk_address": null,
+ "autoclose_referenced_issues": true,
+ "enforce_auth_checks_on_uploads": true,
+ "suggestion_commit_message": null,
+ "merge_commit_template": null,
+ "squash_commit_template": null,
+ "issue_branch_template": "gitlab/%{id}-%{title}",
+ "statistics": {
+ "commit_count": 12,
+ "storage_size": 2066080,
+ "repository_size": 2066080,
+ "lfs_objects_size": 0,
+ "job_artifacts_size": 0,
+ "pipeline_artifacts_size": 0,
+ "packages_size": 0,
+ "snippets_size": 0,
+ "uploads_size": 0
+ },
+ "container_registry_image_prefix": "registry.example.com/brightbox/puppet",
+ "_links": {
+ "self": "http://example.com/api/v4/projects",
+ "issues": "http://example.com/api/v4/projects/1/issues",
+ "merge_requests": "http://example.com/api/v4/projects/1/merge_requests",
+ "repo_branches": "http://example.com/api/v4/projects/1/repository_branches",
+ "labels": "http://example.com/api/v4/projects/1/labels",
+ "events": "http://example.com/api/v4/projects/1/events",
+ "members": "http://example.com/api/v4/projects/1/members",
+ "cluster_agents": "http://example.com/api/v4/projects/1/cluster_agents"
+ }
+ }
+]
+```
+
## 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.
@@ -1306,7 +1552,7 @@ curl --request POST --header "PRIVATE-TOKEN: <your-token>" \
| `template_name` | string | **{dotted-circle}** No | When used without `use_custom_template`, name of a [built-in project template](../user/project/index.md#create-a-project-from-a-built-in-template). When used with `use_custom_template`, name of a custom project template. |
| `template_project_id` **(PREMIUM)** | integer | **{dotted-circle}** No | When used with `use_custom_template`, project ID of a custom project template. Using a project ID is preferable to using `template_name` since `template_name` may be ambiguous. |
| `topics` | array | **{dotted-circle}** No | The list of topics for a project; put array of topics, that should be finally assigned to a project. _([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/328226) in GitLab 14.0.)_ |
-| `use_custom_template` **(PREMIUM)** | boolean | **{dotted-circle}** No | Use either custom [instance](../user/admin_area/custom_project_templates.md) or [group](../user/group/custom_project_templates.md) (with `group_with_project_templates_id`) project template. |
+| `use_custom_template` **(PREMIUM)** | boolean | **{dotted-circle}** No | Use either custom [instance](../administration/custom_project_templates.md) or [group](../user/group/custom_project_templates.md) (with `group_with_project_templates_id`) project template. |
| `visibility` | string | **{dotted-circle}** No | See [project visibility level](#project-visibility-level). |
| `wiki_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, or `enabled`. |
| `wiki_enabled` | boolean | **{dotted-circle}** No | _(Deprecated)_ Enable wiki for this project. Use `wiki_access_level` instead. |
@@ -1394,7 +1640,7 @@ POST /projects/user/:user_id
| `tag_list` | array | **{dotted-circle}** No | _([Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/328226) in GitLab 14.0)_ The list of tags for a project; put array of tags, that should be finally assigned to a project. Use `topics` instead. |
| `template_name` | string | **{dotted-circle}** No | When used without `use_custom_template`, name of a [built-in project template](../user/project/index.md#create-a-project-from-a-built-in-template). When used with `use_custom_template`, name of a custom project template. |
| `topics` | array | **{dotted-circle}** No | The list of topics for the project. _([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/328226) in GitLab 14.0.)_ |
-| `use_custom_template` **(PREMIUM)** | boolean | **{dotted-circle}** No | Use either custom [instance](../user/admin_area/custom_project_templates.md) or [group](../user/group/custom_project_templates.md) (with `group_with_project_templates_id`) project template. |
+| `use_custom_template` **(PREMIUM)** | boolean | **{dotted-circle}** No | Use either custom [instance](../administration/custom_project_templates.md) or [group](../user/group/custom_project_templates.md) (with `group_with_project_templates_id`) project template. |
| `visibility` | string | **{dotted-circle}** No | See [project visibility level](#project-visibility-level). |
| `wiki_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, or `enabled`. |
| `wiki_enabled` | boolean | **{dotted-circle}** No | _(Deprecated)_ Enable wiki for this project. Use `wiki_access_level` instead. |
@@ -2223,7 +2469,7 @@ This endpoint:
- From [GitLab 16.0](https://gitlab.com/gitlab-org/gitlab/-/issues/220382) on
[Premium or Ultimate](https://about.gitlab.com/pricing/) tiers, delayed project deletion is enabled by default.
The deletion happens after the number of days specified in the
- [default deletion delay](../user/admin_area/settings/visibility_and_access_controls.md#deletion-protection).
+ [default deletion delay](../administration/settings/visibility_and_access_controls.md#deletion-protection).
WARNING:
The option to delete projects immediately from deletion protection settings in the Admin Area was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/389557) in GitLab 15.9 and removed in GitLab 16.0.
@@ -2916,15 +3162,9 @@ Example response:
## Configure pull mirroring for a project **(PREMIUM)**
-> - Moved to GitLab Premium in GitLab 13.9.
> - Field `mirror_branch_regex` [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/381667) in GitLab 15.8 [with a flag](../administration/feature_flags.md) named `mirror_only_branches_match_regex`. Disabled by default.
> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/381667) in GitLab 16.0.
-
-FLAG:
-On self-managed GitLab, by default the field `mirror_branch_regex` is available.
-To hide the feature, ask an administrator to [disable the feature flag](../administration/feature_flags.md)
-named `mirror_only_branches_match_regex`.
-On GitLab.com, this feature is available.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/410354) in GitLab 16.2. Feature flag `mirror_only_branches_match_regex` removed.
Configure pull mirroring while [creating a new project](#create-project)
or [updating an existing project](#edit-project) using the API
diff --git a/doc/api/protected_branches.md b/doc/api/protected_branches.md
index 4a82fab125d..0de32a4a25d 100644
--- a/doc/api/protected_branches.md
+++ b/doc/api/protected_branches.md
@@ -228,10 +228,10 @@ curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitla
| -------------------------------------------- | ---- | -------- | ----------- |
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user.
| `name` | string | yes | The name of the branch or wildcard.
-| `allow_force_push` | boolean | no | Allow all users with push access to force push. (default: `false`)
-| `allowed_to_merge` **(PREMIUM)** | array | no | Array of access levels allowed to merge, with each described by a hash of the form `{user_id: integer}`, `{group_id: integer}`, or `{access_level: integer}`.
-| `allowed_to_push` **(PREMIUM)** | array | no | Array of access levels allowed to push, with each described by a hash of the form `{user_id: integer}`, `{group_id: integer}`, or `{access_level: integer}`.
-| `allowed_to_unprotect` **(PREMIUM)** | array | no | Array of access levels allowed to unprotect, with each described by a hash of the form `{user_id: integer}`, `{group_id: integer}`, or `{access_level: integer}`. The access level `No access` is not available for this field. |
+| `allow_force_push` | boolean | no | When enabled, members who can push to this branch can also force push. (default: `false`)
+| `allowed_to_merge` **(PREMIUM)** | array | no | Array of merge access levels, with each described by a hash of the form `{user_id: integer}`, `{group_id: integer}`, or `{access_level: integer}`.
+| `allowed_to_push` **(PREMIUM)** | array | no | Array of push access levels, with each described by a hash of the form `{user_id: integer}`, `{group_id: integer}`, or `{access_level: integer}`.
+| `allowed_to_unprotect` **(PREMIUM)** | array | no | Array of unprotect access levels, with each described by a hash of the form `{user_id: integer}`, `{group_id: integer}`, or `{access_level: integer}`. The access level `No access` is not available for this field. |
| `code_owner_approval_required` **(PREMIUM)** | boolean | no | Prevent pushes to this branch if it matches an item in the [`CODEOWNERS` file](../user/project/codeowners/index.md). (defaults: false)
| `merge_access_level` | integer | no | Access levels allowed to merge. (defaults: `40`, Maintainer role)
| `push_access_level` | integer | no | Access levels allowed to push. (defaults: `40`, Maintainer role)
@@ -458,12 +458,12 @@ curl --request PATCH --header "PRIVATE-TOKEN: <your_access_token>" "https://gitl
| Attribute | Type | Required | Description |
| -------------------------------------------- | ---- | -------- | ----------- |
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user.
-| `name` | string | yes | The name of the branch.
-| `allow_force_push` | boolean | no | When enabled, members who can push to this branch can also force push.
-| `allowed_to_push` **(PREMIUM)** | array | no | Array of push access levels, with each described by a hash.
-| `allowed_to_merge` **(PREMIUM)** | array | no | Array of merge access levels, with each described by a hash.
-| `allowed_to_unprotect` **(PREMIUM)** | array | no | Array of unprotect access levels, with each described by a hash. The access level `No access` is not available for this field.
-| `code_owner_approval_required` **(PREMIUM)** | boolean | no | Prevent pushes to this branch if it matches an item in the [`CODEOWNERS` file](../user/project/codeowners/index.md). Defaults to `false`. |
+| `name` | string | yes | The name of the branch or wildcard.
+| `allow_force_push` | boolean | no | When enabled, members who can push to this branch can also force push.
+| `allowed_to_merge` **(PREMIUM)** | array | no | Array of merge access levels, with each described by a hash of the form `{user_id: integer}`, `{group_id: integer}`, or `{access_level: integer}`.
+| `allowed_to_push` **(PREMIUM)** | array | no | Array of push access levels, with each described by a hash of the form `{user_id: integer}`, `{group_id: integer}`, or `{access_level: integer}`.
+| `allowed_to_unprotect` **(PREMIUM)** | array | no | Array of unprotect access levels, with each described by a hash of the form `{user_id: integer}`, `{group_id: integer}`, `{access_level: integer}`, or `{id: integer, _destroy: true}` to destroy an existing access level. The access level `No access` is not available for this field. |
+| `code_owner_approval_required` **(PREMIUM)** | boolean | no | Prevent pushes to this branch if it matches an item in the [`CODEOWNERS` file](../user/project/codeowners/index.md). |
Elements in the `allowed_to_push`, `allowed_to_merge` and `allowed_to_unprotect` arrays should be one of `user_id`, `group_id` or
`access_level`, and take the form `{user_id: integer}`, `{group_id: integer}` or
@@ -510,7 +510,7 @@ Example response:
```shell
curl --header 'Content-Type: application/json' --request PATCH \
- --data '{"allowed_to_push": [{"id": 12, "access_level": 0}]' \
+ --data '{"allowed_to_push": [{"id": 12, "access_level": 0}]}' \
--header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/22034114/protected_branches/master"
```
diff --git a/doc/api/releases/index.md b/doc/api/releases/index.md
index 86c23283588..3ec4b77a646 100644
--- a/doc/api/releases/index.md
+++ b/doc/api/releases/index.md
@@ -435,7 +435,7 @@ GET /projects/:id/releases/:tag_name/downloads/:direct_asset_path
Example request:
```shell
-curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/24/releases/v0.1/downloads/bin/asset.exe"
+curl --location --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/24/releases/v0.1/downloads/bin/asset.exe"
```
### Get the latest release
diff --git a/doc/api/remote_mirrors.md b/doc/api/remote_mirrors.md
index b59619b3477..a755553b645 100644
--- a/doc/api/remote_mirrors.md
+++ b/doc/api/remote_mirrors.md
@@ -93,13 +93,7 @@ Learn how to [configure a pull mirror](projects.md#configure-pull-mirroring-for-
> - Field `mirror_branch_regex` [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/381667) in GitLab 15.8 [with a flag](../administration/feature_flags.md) named `mirror_only_branches_match_regex`. Disabled by default.
> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/381667) in GitLab 16.0.
-
-FLAG:
-On self-managed GitLab, by default the field `mirror_branch_regex` is available.
-To hide the feature, ask an administrator to [disable the feature flag](../administration/feature_flags.md)
-named `mirror_only_branches_match_regex`.
-On GitLab.com, this feature is available.
-
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/410354) in GitLab 16.2. Feature flag `mirror_only_branches_match_regex` removed.
Push mirroring is disabled by default. To enable it, include the optional parameter
`enabled` when you create the mirror:
@@ -141,12 +135,6 @@ Example response:
## Update a remote mirror's attributes
-FLAG:
-On self-managed GitLab, by default the field `mirror_branch_regex` is not available.
-To make it available, ask an administrator to [enable the feature flag](../administration/feature_flags.md)
-named `mirror_only_branches_match_regex`.
-On GitLab.com, this feature is not available.
-
Toggle a remote mirror on or off, or change which types of branches are
mirrored:
diff --git a/doc/api/repository_files.md b/doc/api/repository_files.md
index 23243cdadc2..65ed67541d3 100644
--- a/doc/api/repository_files.md
+++ b/doc/api/repository_files.md
@@ -8,7 +8,7 @@ type: reference, api
# Repository files API **(FREE)**
You can fetch, create, update, and delete files in your repository with this API.
-You can also [configure rate limits](../user/admin_area/settings/files_api_rate_limits.md)
+You can also [configure rate limits](../administration/settings/files_api_rate_limits.md)
for this API.
## Available scopes for personal access tokens
@@ -19,6 +19,7 @@ in the following table.
| Scope | Description |
| ----- | ----------- |
| `api` | Allows read-write access to the repository files. |
+| `read_api` | Allows read access to the repository files. |
| `read_repository` | Allows read-access to the repository files. |
## Get file from repository
diff --git a/doc/api/rest/deprecations.md b/doc/api/rest/deprecations.md
index 20fa999516e..80480e3f88f 100644
--- a/doc/api/rest/deprecations.md
+++ b/doc/api/rest/deprecations.md
@@ -110,3 +110,10 @@ 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`.
+
+## Runner will not return `ip_address`
+
+Breaking change. [Related issue](https://gitlab.com/gitlab-org/gitlab/-/issues/415159).
+
+In GitLab 17.0, the [Runners API](../runners.md) will return `""` in place of `ip_address` for runners.
+In v5 of the REST API, the field will be removed.
diff --git a/doc/api/runners.md b/doc/api/runners.md
index 574bce82793..525cfaaff3e 100644
--- a/doc/api/runners.md
+++ b/doc/api/runners.md
@@ -776,13 +776,12 @@ Example response:
}
```
-## Reset instance's runner registration token (deprecated)
+## Reset instance's runner registration token
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/30942) in GitLab 14.3.
-> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/104691) in GitLab 15.7.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/30942) in GitLab 14.3.
WARNING:
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/383341) in GitLab 15.7 and is planned for removal in 17.0. This change is a breaking change.
+Runner registration tokens, and support for certain configuration arguments, were [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/380872) in GitLab 15.6 and will be removed in GitLab 17.0. After GitLab 17.0, you will no longer be able to reset runner registration tokens and the `reset_registration_token` endpoint will not function.
Reset the runner registration token for the GitLab instance.
@@ -795,13 +794,12 @@ curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
"https://gitlab.example.com/api/v4/runners/reset_registration_token"
```
-## Reset project's runner registration token (deprecated)
+## Reset project's runner registration token
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/30942) in GitLab 14.3.
-> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/104691) in GitLab 15.7.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/30942) in GitLab 14.3.
WARNING:
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/383341) in GitLab 15.7 and is planned for removal in 17.0. This change is a breaking change.
+Runner registration tokens, and support for certain configuration arguments, were [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/380872) in GitLab 15.6 and will be removed in GitLab 17.0. After GitLab 17.0, you will no longer be able to reset runner registration tokens and the `reset_registration_token` endpoint will not function.
Reset the runner registration token for a project.
@@ -814,13 +812,12 @@ curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
"https://gitlab.example.com/api/v4/projects/9/runners/reset_registration_token"
```
-## Reset group's runner registration token (deprecated)
+## Reset group's runner registration token
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/30942) in GitLab 14.3.
-> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/104691) in GitLab 15.7.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/30942) in GitLab 14.3.
WARNING:
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/383341) in GitLab 15.7 and is planned for removal in 17.0. This change is a breaking change.
+Runner registration tokens, and support for certain configuration arguments, were [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/380872) in GitLab 15.6 and will be removed in GitLab 17.0. After GitLab 17.0, you will no longer be able to reset runner registration tokens and the `reset_registration_token` endpoint will not function.
Reset the runner registration token for a group.
diff --git a/doc/api/saml.md b/doc/api/saml.md
index b1d7692fbaf..168c6ed2b6a 100644
--- a/doc/api/saml.md
+++ b/doc/api/saml.md
@@ -4,7 +4,7 @@ group: Authentication and Authorization
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
-# SAML API **(PREMIUM SAAS)**
+# SAML API **(PREMIUM)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/227841) in GitLab 15.5.
@@ -35,7 +35,7 @@ response attributes:
Example request:
```shell
-curl --location --request GET "https://gitlab.example.com/api/v4/groups/33/saml/identities" --header "<PRIVATE-TOKEN>"
+curl --location --request GET "https://gitlab.example.com/api/v4/groups/33/saml/identities" --header "PRIVATE-TOKEN: <PRIVATE-TOKEN>"
```
Example response:
@@ -67,7 +67,7 @@ Supported attributes:
Example request:
```shell
-curl --location --request GET "https://gitlab.example.com/api/v4/groups/33/saml/sydney_jones" --header "<PRIVATE TOKEN>"
+curl --location --request GET "https://gitlab.example.com/api/v4/groups/33/saml/sydney_jones" --header "PRIVATE-TOKEN: <PRIVATE TOKEN>"
```
Example response:
@@ -102,6 +102,6 @@ Example request:
```shell
curl --location --request PATCH "https://gitlab.example.com/api/v4/groups/33/saml/sydney_jones" \
---header "<PRIVATE TOKEN>" \
---form "extern_uid=sydney_jones_new" \
+--header "PRIVATE-TOKEN: <PRIVATE TOKEN>" \
+--form "extern_uid=sydney_jones_new"
```
diff --git a/doc/api/scim.md b/doc/api/scim.md
index df0d90756d2..95e4435f0d7 100644
--- a/doc/api/scim.md
+++ b/doc/api/scim.md
@@ -4,7 +4,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/product/ux/technical-writing/#assignments
---
-# SCIM API **(PREMIUM SAAS)**
+# SCIM API **(PREMIUM)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/98354) in GitLab 15.5.
@@ -76,7 +76,7 @@ Supported attributes:
Example request:
```shell
-curl --location --request GET "https://gitlab.example.com/api/v4/groups/33/scim/sydney_jones" --header "<PRIVATE TOKEN>"
+curl --location --request GET "https://gitlab.example.com/api/v4/groups/33/scim/sydney_jones" --header "PRIVATE-TOKEN: <PRIVATE TOKEN>"
```
Example response:
diff --git a/doc/api/search.md b/doc/api/search.md
index f7fa7babe71..b412d86a613 100644
--- a/doc/api/search.md
+++ b/doc/api/search.md
@@ -292,7 +292,8 @@ Example response:
"id": null,
"ref": "master",
"startline": 5,
- "project_id": 6
+ "project_id": 6,
+ "group_id": null
}
]
```
@@ -682,7 +683,8 @@ Example response:
"id": null,
"ref": "master",
"startline": 5,
- "project_id": 6
+ "project_id": 6,
+ "group_id": 1
}
]
```
@@ -1094,7 +1096,8 @@ Example response:
"id": null,
"ref": "master",
"startline": 5,
- "project_id": 6
+ "project_id": 6,
+ "group_id": 1
}
]
```
diff --git a/doc/api/secure_files.md b/doc/api/secure_files.md
index 0b85bf05410..c912746f07e 100644
--- a/doc/api/secure_files.md
+++ b/doc/api/secure_files.md
@@ -29,9 +29,9 @@ GET /projects/:project_id/secure_files
Supported attributes:
-| Attribute | Type | Required | Description |
-|--------------|----------------|------------------------|-------------|
-| `project_id` | integer/string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user. |
+| Attribute | Type | Required | Description |
+|--------------|----------------|----------|-------------|
+| `project_id` | integer/string | Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
Example request:
@@ -90,10 +90,10 @@ GET /projects/:project_id/secure_files/:id
Supported attributes:
-| Attribute | Type | Required | Description |
-|--------------|----------------|------------------------|-------------|
-| `project_id` | integer/string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user. |
-| `id` | integer | **{check-circle}** Yes | The `id` of a secure file. |
+| Attribute | Type | Required | Description |
+|--------------|----------------|----------|-------------|
+| `project_id` | integer/string | Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
+| `id` | integer | Yes | The ID of a secure file. |
Example request:
@@ -125,11 +125,11 @@ POST /projects/:project_id/secure_files
Supported attributes:
-| Attribute | Type | Required | Description |
-|-----------------|----------------|------------------------|-------------|
-| `project_id` | integer/string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user. |
-| `name` | string | **{check-circle}** Yes | The `name` of the file being uploaded. The filename must be unique within the project. |
-| `file` | file | **{check-circle}** Yes | The `file` being uploaded (5 MB limit). |
+| Attribute | Type | Required | Description |
+|-----------------|----------------|----------|-------------|
+| `project_id` | integer/string | Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
+| `name` | string | Yes | The name of the file being uploaded. The filename must be unique in the project. |
+| `file` | file | Yes | The file being uploaded (5 MB limit). |
Example request:
@@ -162,10 +162,10 @@ GET /projects/:project_id/secure_files/:id/download
Supported attributes:
-| Attribute | Type | Required | Description |
-|--------------|----------------|------------------------|-------------|
-| `project_id` | integer/string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user. |
-| `id` | integer | **{check-circle}** Yes | The `id` of a secure file. |
+| Attribute | Type | Required | Description |
+|--------------|----------------|----------|-------------|
+| `project_id` | integer/string | Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
+| `id` | integer | Yes | The ID of a secure file. |
Example request:
@@ -183,10 +183,10 @@ DELETE /projects/:project_id/secure_files/:id
Supported attributes:
-| Attribute | Type | Required | Description |
-|--------------|----------------|------------------------|-------------|
-| `project_id` | integer/string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user. |
-| `id` | integer | **{check-circle}** Yes | The `id` of a secure file. |
+| Attribute | Type | Required | Description |
+|--------------|----------------|----------|-------------|
+| `project_id` | integer/string | Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding). |
+| `id` | integer | Yes | The ID of a secure file. |
Example request:
diff --git a/doc/api/settings.md b/doc/api/settings.md
index ab78b9b7c74..ea023a25a1d 100644
--- a/doc/api/settings.md
+++ b/doc/api/settings.md
@@ -57,7 +57,6 @@ Example response:
"default_project_visibility" : "private",
"default_group_visibility" : "private",
"gravatar_enabled" : true,
- "sign_in_text" : null,
"container_expiration_policies_enable_historic_entries": true,
"container_registry_cleanup_tags_service_max_list_size": 200,
"container_registry_delete_tags_service_timeout": 250,
@@ -115,9 +114,20 @@ Example response:
```
Users on [GitLab Premium or Ultimate](https://about.gitlab.com/pricing/) may also see
-the `group_owners_can_manage_default_branch_protection`, `file_template_project_id`, `delayed_project_deletion`,
-`delayed_group_deletion`, `default_project_deletion_protection`, `deletion_adjourned_period`, `disable_personal_access_tokens`, `geo_node_allowed_ips`,
-or the `security_policy_global_group_approvers_enabled` parameters.
+these parameters:
+
+- `group_owners_can_manage_default_branch_protection`
+- `file_template_project_id`
+- `geo_node_allowed_ips`
+- `geo_status_timeout`
+- `delayed_project_deletion`
+- `delayed_group_deletion`
+- `default_project_deletion_protection`
+- `deletion_adjourned_period`
+- `disable_personal_access_tokens`
+- `security_policy_global_group_approvers_enabled`
+- `delete_unconfirmed_users`
+- `unconfirmed_users_delete_after_days`
From [GitLab 15.11](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/113332), with the `always_perform_delayed_deletion` feature flag enabled,
the `delayed_project_deletion` and `delayed_group_deletion` attributes will not be exposed. These attributes will be removed in GitLab 16.0.
@@ -161,7 +171,6 @@ Example response:
"signup_enabled": false,
"password_authentication_enabled_for_web": true,
"gravatar_enabled": true,
- "sign_in_text": "",
"created_at": "2015-06-12T15:51:55.432Z",
"updated_at": "2015-06-30T13:22:42.210Z",
"home_page_url": "",
@@ -257,6 +266,8 @@ these parameters:
- `deletion_adjourned_period`
- `disable_personal_access_tokens`
- `security_policy_global_group_approvers_enabled`
+- `delete_unconfirmed_users`
+- `unconfirmed_users_delete_after_days`
From [GitLab 15.11](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/113332), with the `always_perform_delayed_deletion` feature flag enabled,
the `delayed_project_deletion` and `delayed_group_deletion` attributes will not be exposed. These attributes will be removed in GitLab 16.0.
@@ -270,7 +281,8 @@ Example responses: **(PREMIUM SELF)**
## List of settings that can be accessed via API calls
-> Fields `housekeeping_full_repack_period`, `housekeeping_gc_period`, and `housekeeping_incremental_repack_period` [deprecated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/106963) in GitLab 15.8. Use `housekeeping_optimize_repository_period` instead.
+> - Fields `housekeeping_full_repack_period`, `housekeeping_gc_period`, and `housekeeping_incremental_repack_period` [deprecated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/106963) in GitLab 15.8. Use `housekeeping_optimize_repository_period` instead.
+> - Parameters `sign_in_text` and `help_text` were [deprecated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124461) in GitLab 16.2. Use `description` parameter in the [Appearance API](../api/appearance.md) instead.
In general, all settings are optional. Certain settings though, if enabled,
require other settings to be set to function properly. These requirements are
@@ -279,8 +291,8 @@ listed in the descriptions of the relevant settings.
| Attribute | Type | Required | Description |
|------------------------------------------|------------------|:------------------------------------:|-------------|
| `admin_mode` | boolean | no | Require administrators to enable Admin Mode by re-authenticating for administrative tasks. |
-| `admin_notification_email` | string | no | Deprecated: Use `abuse_notification_email` instead. If set, [abuse reports](../user/admin_area/review_abuse_reports.md) are sent to this address. Abuse reports are always available in the Admin Area. |
-| `abuse_notification_email` | string | no | If set, [abuse reports](../user/admin_area/review_abuse_reports.md) are sent to this address. Abuse reports are always available in the Admin Area. |
+| `admin_notification_email` | string | no | Deprecated: Use `abuse_notification_email` instead. If set, [abuse reports](../administration/review_abuse_reports.md) are sent to this address. Abuse reports are always available in the Admin Area. |
+| `abuse_notification_email` | string | no | If set, [abuse reports](../administration/review_abuse_reports.md) are sent to this address. Abuse reports are always available in the Admin Area. |
| `after_sign_out_path` | string | no | Where to redirect users after logout. |
| `after_sign_up_text` | string | no | Text shown to the user after signing up. |
| `akismet_api_key` | string | required by: `akismet_enabled` | API key for Akismet spam protection. |
@@ -299,8 +311,8 @@ listed in the descriptions of the relevant settings.
| `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. |
-| `automatic_purchased_storage_allocation` | boolean | no | Enabling this permits automatic allocation of purchased storage in a namespace. |
-| `bulk_import_enabled` | boolean | no | Enable migrating GitLab groups by direct transfer. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/383268) in GitLab 15.8. Setting also [available](../user/admin_area/settings/visibility_and_access_controls.md#enable-migration-of-groups-and-projects-by-direct-transfer) in the Admin Area. |
+| `automatic_purchased_storage_allocation` | boolean | no | Enabling this permits automatic allocation of purchased storage in a namespace. Relevant only to EE distributions. |
+| `bulk_import_enabled` | boolean | no | Enable migrating GitLab groups by direct transfer. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/383268) in GitLab 15.8. Setting also [available](../administration/settings/visibility_and_access_controls.md#enable-migration-of-groups-and-projects-by-direct-transfer) in the Admin Area. |
| `can_create_group` | boolean | no | Indicates whether users can create top-level groups. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/367754) in GitLab 15.5. Defaults to `true`. |
| `check_namespace_plan` **(PREMIUM)** | boolean | no | Enabling this makes only licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public. |
| `ci_max_includes` | integer | no | The maximum number of [includes](../ci/yaml/includes.md) per pipeline. Default is `150`. |
@@ -312,7 +324,7 @@ listed in the descriptions of the relevant settings.
| `container_registry_expiration_policies_worker_capacity` | integer | no | Number of workers for [cleanup policies](../user/packages/container_registry/reduce_container_registry_storage.md#set-cleanup-limits-to-conserve-resources). |
| `container_registry_token_expire_delay` | integer | no | Container Registry token duration in minutes. |
| `package_registry_cleanup_policies_worker_capacity` | integer | no | Number of workers assigned to the packages cleanup policies. |
-| `deactivate_dormant_users` | boolean | no | Enable [automatic deactivation of dormant users](../user/admin_area/moderate_users.md#automatically-deactivate-dormant-users). |
+| `deactivate_dormant_users` | boolean | no | Enable [automatic deactivation of dormant users](../administration/moderate_users.md#automatically-deactivate-dormant-users). |
| `deactivate_dormant_users_period` | integer | no | Length of time (in days) after which a user is considered dormant. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/336747) in GitLab 15.3. |
| `default_artifacts_expire_in` | string | no | Set the default expiration time for each job's artifacts. |
| `default_branch_name` | string | no | [Instance-level custom initial branch name](../user/project/repository/branches/default.md#instance-level-custom-initial-branch-name). [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/225258) in GitLab 13.2. |
@@ -328,12 +340,13 @@ listed in the descriptions of the relevant settings.
| `delayed_project_deletion` **(PREMIUM SELF)** | boolean | no | Enable delayed project deletion by default in new groups. Default is `false`. [From GitLab 15.1](https://gitlab.com/gitlab-org/gitlab/-/issues/352960), can only be enabled when `delayed_group_deletion` is true. From [GitLab 15.11](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/113332), with the `always_perform_delayed_deletion` feature flag enabled, this attribute has been removed. This attribute will be completely removed in GitLab 16.0. |
| `delayed_group_deletion` **(PREMIUM SELF)** | boolean | no | Enable delayed group deletion. Default is `true`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/352959) in GitLab 15.0. [From GitLab 15.1](https://gitlab.com/gitlab-org/gitlab/-/issues/352960), disables and locks the group-level setting for delayed protect deletion when set to `false`. From [GitLab 15.11](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/113332), with the `always_perform_delayed_deletion` feature flag enabled, this attribute has been removed. This attribute will be completely removed in GitLab 16.0. |
| `default_project_deletion_protection` **(PREMIUM SELF)** | boolean | no | Enable default project deletion protection so only administrators can delete projects. Default is `false`. |
+| `delete_unconfirmed_users` **(PREMIUM SELF)** | boolean | no | Specifies whether users who have not confirmed their email should be deleted. Default is `false`. When set to `true`, unconfirmed users are deleted after `unconfirmed_users_delete_after_days` days. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/352514) in GitLab 16.1. |
| `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 `1` and `90`. Defaults to `7`. [From GitLab 15.1](https://gitlab.com/gitlab-org/gitlab/-/issues/352960), a hook on `deletion_adjourned_period` sets the period to `1` on every update, and sets both `delayed_project_deletion` and `delayed_group_deletion` to `false` if the period is `0`. |
| `diagramsnet_enabled` | boolean | no | (If enabled, requires `diagramsnet_url`) Enable [Diagrams.net integration](../administration/integration/diagrams_net.md). Default is `true`. |
| `diagramsnet_url` | string | required by: `diagramsnet_enabled` | The Diagrams.net instance URL for integration. |
-| `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). |
+| `diff_max_patch_bytes` | integer | no | Maximum [diff patch size](../administration/diff_limits.md), in bytes. |
+| `diff_max_files` | integer | no | Maximum [files in a diff](../administration/diff_limits.md). |
+| `diff_max_lines` | integer | no | Maximum [lines in a diff](../administration/diff_limits.md). |
| `disable_admin_oauth_scopes` | boolean | no | Stops administrators from connecting their GitLab accounts to non-trusted OAuth 2.0 applications that have the `api`, `read_api`, `read_repository`, `write_repository`, `read_registry`, `write_registry`, or `sudo` scopes. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/375043) in GitLab 15.6. |
| `disable_feed_token` | boolean | no | Disable display of RSS/Atom and calendar feed tokens. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/231493) in GitLab 13.7. |
| `disable_personal_access_token` **(PREMIUM SELF)** | boolean | no | Disable personal access tokens. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/384201) in GitLab 15.7. |
@@ -358,8 +371,10 @@ listed in the descriptions of the relevant settings.
| `elasticsearch_indexed_field_length_limit` **(PREMIUM)** | integer | no | Maximum size of text fields to index by Elasticsearch. 0 value means no limit. This does not apply to repository and wiki indexing. |
| `elasticsearch_indexed_file_size_limit_kb` **(PREMIUM)** | integer | no | Maximum size of repository and wiki files that are indexed by Elasticsearch. |
| `elasticsearch_indexing` **(PREMIUM)** | boolean | no | Enable Elasticsearch indexing. |
+| `elasticsearch_requeue_workers` **(PREMIUM)** | boolean | no | Enable automatic requeuing of indexing workers. This improves non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed. |
| `elasticsearch_limit_indexing` **(PREMIUM)** | boolean | no | Limit Elasticsearch to index certain namespaces and projects. |
| `elasticsearch_max_bulk_concurrency` **(PREMIUM)** | integer | no | Maximum concurrency of Elasticsearch bulk requests per indexing operation. This only applies to repository indexing operations. |
+| `elasticsearch_worker_number_of_shards` **(PREMIUM)** | integer | no | Number of indexing worker shards. This improves non-code indexing throughput by enqueuing more parallel Sidekiq jobs. Default is `2`. |
| `elasticsearch_max_bulk_size_mb` **(PREMIUM)** | integer | no | Maximum size of Elasticsearch bulk indexing requests in MB. This only applies to repository indexing operations. |
| `elasticsearch_namespace_ids` **(PREMIUM)** | array of integers | no | The namespaces to index via Elasticsearch if `elasticsearch_limit_indexing` is enabled. |
| `elasticsearch_project_ids` **(PREMIUM)** | array of integers | no | The projects to index via Elasticsearch if `elasticsearch_limit_indexing` is enabled. |
@@ -400,7 +415,7 @@ listed in the descriptions of the relevant settings.
| `help_page_hide_commercial_content` | boolean | no | Hide marketing-related entries from help. |
| `help_page_support_url` | string | no | Alternate support URL for help page and help dropdown list. |
| `help_page_text` | string | no | Custom text displayed on the help page. |
-| `help_text` **(PREMIUM)** | string | no | GitLab server administrator information. |
+| `help_text` **(PREMIUM)** | string | no | Deprecated: Use `description` parameter in the [Appearance API](../api/appearance.md). Custom text in sign-in page. |
| `hide_third_party_offers` | boolean | no | Do not display offers from third parties in GitLab. |
| `home_page_url` | string | no | Redirect to this URL when not logged in. |
| `housekeeping_bitmaps_enabled` | boolean | no | Deprecated. Git pack file bitmap creation is always enabled and cannot be changed via API and UI. Always returns `true`. |
@@ -431,6 +446,8 @@ listed in the descriptions of the relevant settings.
| `metrics_method_call_threshold` | integer | no | A method call is only tracked when it takes longer than the given amount of milliseconds. |
| `max_number_of_repository_downloads` **(ULTIMATE SELF)** | integer | no | Maximum number of unique repositories a user can download in the specified time period before they are banned. Default: 0, Maximum: 10,000 repositories. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87980) in GitLab 15.1. |
| `max_number_of_repository_downloads_within_time_period` **(ULTIMATE SELF)** | integer | no | Reporting time period (in seconds). Default: 0, Maximum: 864000 seconds (10 days). [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87980) in GitLab 15.1. |
+| `max_yaml_depth` | integer | no | The maximum depth of nested CI/CD configuration added with the [`include` keyword](../ci/yaml/index.md#include). Default: `100`. |
+| `max_yaml_size_bytes` | integer | no | The maximum size in bytes of a single CI/CD configuration file. Default: `1048576`. |
| `git_rate_limit_users_allowlist` **(ULTIMATE SELF)** | array of strings | no | List of usernames excluded from Git anti-abuse rate limits. Default: `[]`, Maximum: 100 usernames. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90815) in GitLab 15.2. |
| `git_rate_limit_users_alertlist` **(ULTIMATE SELF)** | array of integers | no | List of user IDs that are emailed when the Git abuse rate limit is exceeded. Default: `[]`, Maximum: 100 user IDs. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/110201) in GitLab 15.9. |
| `auto_ban_user_on_excessive_projects_download` **(ULTIMATE SELF)** | boolean | no | When enabled, users will get automatically banned from the application when they download more than the maximum number of unique projects in the time period specified by `max_number_of_repository_downloads` and `max_number_of_repository_downloads_within_time_period` respectively. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/94153) in GitLab 15.4 |
@@ -461,7 +478,7 @@ listed in the descriptions of the relevant settings.
| `projects_api_rate_limit_unauthenticated` | integer | no | [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/112283) in GitLab 15.10. Max number of requests per 10 minutes per IP address for unauthenticated requests to the [list all projects API](projects.md#list-all-projects). Default: 400. To disable throttling set to 0.|
| `prometheus_metrics_enabled` | boolean | no | Enable Prometheus metrics. |
| `protected_ci_variables` | boolean | no | CI/CD variables are protected by default. |
-| `push_event_activities_limit` | integer | no | Maximum number of changes (branches or tags) in a single push above which a [bulk push event is created](../user/admin_area/settings/push_event_activities_limit.md). Setting to `0` does not disable throttling. |
+| `push_event_activities_limit` | integer | no | Maximum number of changes (branches or tags) in a single push above which a [bulk push event is created](../administration/settings/push_event_activities_limit.md). Setting to `0` does not disable throttling. |
| `push_event_hooks_limit` | integer | no | Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered. Setting to `0` does not disable throttling. |
| `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. |
| `raw_blob_request_limit` | integer | no | Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling.|
@@ -476,27 +493,27 @@ listed in the descriptions of the relevant settings.
| `repository_size_limit` **(PREMIUM)** | integer | no | Size limit per repository (MB) |
| `repository_storages_weighted` | hash of strings to integers | no | (GitLab 13.1 and later) Hash of names of taken from `gitlab.yml` to [weights](../administration/repository_storage_paths.md#configure-where-new-repositories-are-stored). New projects are created in one of these stores, chosen by a weighted random selection. |
| `repository_storages` | array of strings | no | (GitLab 13.0 and earlier) List of names of enabled storage paths, taken from `gitlab.yml`. New projects are created in one of these stores, chosen at random. |
-| `require_admin_approval_after_user_signup` | boolean | no | When enabled, any user that signs up for an account using the registration form is placed under a **Pending approval** state and has to be explicitly [approved](../user/admin_area/moderate_users.md) by an administrator. |
+| `require_admin_approval_after_user_signup` | boolean | no | When enabled, any user that signs up for an account using the registration form is placed under a **Pending approval** state and has to be explicitly [approved](../administration/moderate_users.md) by an administrator. |
| `require_two_factor_authentication` | boolean | no | (**If enabled, requires:** `two_factor_grace_period`) Require all users to set up Two-factor authentication. |
| `restricted_visibility_levels` | array of strings | no | Selected levels cannot be used by non-Administrator users for groups, projects or snippets. Can take `private`, `internal` and `public` as a parameter. Default is `null` which means there is no restriction. |
| `rsa_key_restriction` | integer | no | The minimum allowed bit length of an uploaded RSA key. Default is `0` (no restriction). `-1` disables RSA keys. |
| `session_expire_delay` | integer | no | Session duration in minutes. GitLab restart is required to apply changes. |
| `security_policy_global_group_approvers_enabled` | boolean | no | Whether to look up scan result policy approval groups globally or within project hierarchies. |
| `shared_runners_enabled` | boolean | no | (**If enabled, requires:** `shared_runners_text` and `shared_runners_minutes`) Enable shared runners for new projects. |
-| `shared_runners_minutes` **(PREMIUM)** | integer | required by: `shared_runners_enabled` | Set the maximum number of units of compute that a group can use on shared runners per month. |
+| `shared_runners_minutes` **(PREMIUM)** | integer | required by: `shared_runners_enabled` | Set the maximum number of compute minutes that a group can use on shared runners per month. |
| `shared_runners_text` | string | required by: `shared_runners_enabled` | Shared runners text. |
-| `sidekiq_job_limiter_mode` | string | no | `track` or `compress`. Sets the behavior for [Sidekiq job size limits](../user/admin_area/settings/sidekiq_job_limits.md). Default: 'compress'. |
+| `sidekiq_job_limiter_mode` | string | no | `track` or `compress`. Sets the behavior for [Sidekiq job size limits](../administration/settings/sidekiq_job_limits.md). Default: 'compress'. |
| `sidekiq_job_limiter_compression_threshold_bytes` | integer | no | The threshold in bytes at which Sidekiq jobs are compressed before being stored in Redis. Default: 100,000 bytes (100 KB). |
| `sidekiq_job_limiter_limit_bytes` | integer | no | The threshold in bytes at which Sidekiq jobs are rejected. Default: 0 bytes (doesn't reject any job). |
-| `sign_in_text` | string | no | Text on the login page. |
+| `sign_in_text` | string | no | Deprecated: Use `description` parameter in the [Appearance API](../api/appearance.md). Custom text in sign-in page. |
| `signin_enabled` | string | no | (Deprecated: Use `password_authentication_enabled_for_web` instead) Flag indicating if password authentication is enabled for the web interface. |
| `signup_enabled` | boolean | no | Enable registration. Default is `true`. |
| `silent_mode_enabled` | boolean | no | Enable [Silent mode](../administration/silent_mode/index.md). Default is `false`. |
-| `slack_app_enabled` | boolean | no | (**If enabled, requires:** `slack_app_id`, `slack_app_secret` and `slack_app_secret`) Enable Slack app. |
-| `slack_app_id` | string | required by: `slack_app_enabled` | The app ID of the Slack-app. |
-| `slack_app_secret` | string | required by: `slack_app_enabled` | The app secret of the Slack-app. |
-| `slack_app_signing_secret` | string | no | The signing secret of the Slack-app. |
-| `slack_app_verification_token` | string | required by: `slack_app_enabled` | The verification token of the Slack-app. |
+| `slack_app_enabled` | boolean | no | (**If enabled, requires:** `slack_app_id`, `slack_app_secret`, `slack_app_signing_secret`, and `slack_app_verification_token`) Enable the GitLab for Slack app. |
+| `slack_app_id` | string | required by: `slack_app_enabled` | The client ID of the GitLab for Slack app. |
+| `slack_app_secret` | string | required by: `slack_app_enabled` | The client secret of the GitLab for Slack app. Used for authenticating OAuth requests from the app. |
+| `slack_app_signing_secret` | string | required by: `slack_app_enabled` | The signing secret of the GitLab for Slack app. Used for authenticating API requests from the app. |
+| `slack_app_verification_token` | string | required by: `slack_app_enabled` | The verification token of the GitLab for Slack app. This method of authentication is deprecated by Slack and used only for authenticating slash commands from the app. |
| `snippet_size_limit` | integer | no | Max snippet content size in **bytes**. Default: 52428800 Bytes (50 MB).|
| `snowplow_app_id` | string | no | The Snowplow site name / application ID. (for example, `gitlab`) |
| `snowplow_collector_hostname` | string | required by: `snowplow_enabled` | The Snowplow collector hostname. (for example, `snowplow.trx.gitlab.net`) |
@@ -514,9 +531,9 @@ listed in the descriptions of the relevant settings.
| `throttle_authenticated_api_enabled` | boolean | no | (**If enabled, requires:** `throttle_authenticated_api_period_in_seconds` and `throttle_authenticated_api_requests_per_period`) Enable authenticated API request rate limit. Helps reduce request volume (for example, from crawlers or abusive bots). |
| `throttle_authenticated_api_period_in_seconds` | integer | required by:<br>`throttle_authenticated_api_enabled` | Rate limit period (in seconds). |
| `throttle_authenticated_api_requests_per_period` | integer | required by:<br>`throttle_authenticated_api_enabled` | Maximum requests per period per user. |
-| `throttle_authenticated_packages_api_enabled` | boolean | no | (**If enabled, requires:** `throttle_authenticated_packages_api_period_in_seconds` and `throttle_authenticated_packages_api_requests_per_period`) Enable authenticated API request rate limit. Helps reduce request volume (for example, from crawlers or abusive bots). View [Package Registry rate limits](../user/admin_area/settings/package_registry_rate_limits.md) for more details. |
-| `throttle_authenticated_packages_api_period_in_seconds` | integer | required by:<br>`throttle_authenticated_packages_api_enabled` | Rate limit period (in seconds). View [Package Registry rate limits](../user/admin_area/settings/package_registry_rate_limits.md) for more details. |
-| `throttle_authenticated_packages_api_requests_per_period` | integer | required by:<br>`throttle_authenticated_packages_api_enabled` | Maximum requests per period per user. View [Package Registry rate limits](../user/admin_area/settings/package_registry_rate_limits.md) for more details. |
+| `throttle_authenticated_packages_api_enabled` | boolean | no | (**If enabled, requires:** `throttle_authenticated_packages_api_period_in_seconds` and `throttle_authenticated_packages_api_requests_per_period`) Enable authenticated API request rate limit. Helps reduce request volume (for example, from crawlers or abusive bots). View [Package Registry rate limits](../administration/settings/package_registry_rate_limits.md) for more details. |
+| `throttle_authenticated_packages_api_period_in_seconds` | integer | required by:<br>`throttle_authenticated_packages_api_enabled` | Rate limit period (in seconds). View [Package Registry rate limits](../administration/settings/package_registry_rate_limits.md) for more details. |
+| `throttle_authenticated_packages_api_requests_per_period` | integer | required by:<br>`throttle_authenticated_packages_api_enabled` | Maximum requests per period per user. View [Package Registry rate limits](../administration/settings/package_registry_rate_limits.md) for more details. |
| `throttle_authenticated_web_enabled` | boolean | no | (**If enabled, requires:** `throttle_authenticated_web_period_in_seconds` and `throttle_authenticated_web_requests_per_period`) Enable authenticated web request rate limit. Helps reduce request volume (for example, from crawlers or abusive bots). |
| `throttle_authenticated_web_period_in_seconds` | integer | required by:<br>`throttle_authenticated_web_enabled` | Rate limit period (in seconds). |
| `throttle_authenticated_web_requests_per_period` | integer | required by:<br>`throttle_authenticated_web_enabled` | Maximum requests per period per user. |
@@ -526,17 +543,19 @@ listed in the descriptions of the relevant settings.
| `throttle_unauthenticated_api_enabled` | boolean | no | (**If enabled, requires:** `throttle_unauthenticated_api_period_in_seconds` and `throttle_unauthenticated_api_requests_per_period`) Enable unauthenticated API request rate limit. Helps reduce request volume (for example, from crawlers or abusive bots). |
| `throttle_unauthenticated_api_period_in_seconds` | integer | required by:<br>`throttle_unauthenticated_api_enabled` | Rate limit period in seconds. |
| `throttle_unauthenticated_api_requests_per_period` | integer | required by:<br>`throttle_unauthenticated_api_enabled` | Max requests per period per IP. |
-| `throttle_unauthenticated_packages_api_enabled` | boolean | no | (**If enabled, requires:** `throttle_unauthenticated_packages_api_period_in_seconds` and `throttle_unauthenticated_packages_api_requests_per_period`) Enable authenticated API request rate limit. Helps reduce request volume (for example, from crawlers or abusive bots). View [Package Registry rate limits](../user/admin_area/settings/package_registry_rate_limits.md) for more details. |
-| `throttle_unauthenticated_packages_api_period_in_seconds` | integer | required by:<br>`throttle_unauthenticated_packages_api_enabled` | Rate limit period (in seconds). View [Package Registry rate limits](../user/admin_area/settings/package_registry_rate_limits.md) for more details. |
-| `throttle_unauthenticated_packages_api_requests_per_period` | integer | required by:<br>`throttle_unauthenticated_packages_api_enabled` | Maximum requests per period per user. View [Package Registry rate limits](../user/admin_area/settings/package_registry_rate_limits.md) for more details. |
+| `throttle_unauthenticated_packages_api_enabled` | boolean | no | (**If enabled, requires:** `throttle_unauthenticated_packages_api_period_in_seconds` and `throttle_unauthenticated_packages_api_requests_per_period`) Enable authenticated API request rate limit. Helps reduce request volume (for example, from crawlers or abusive bots). View [Package Registry rate limits](../administration/settings/package_registry_rate_limits.md) for more details. |
+| `throttle_unauthenticated_packages_api_period_in_seconds` | integer | required by:<br>`throttle_unauthenticated_packages_api_enabled` | Rate limit period (in seconds). View [Package Registry rate limits](../administration/settings/package_registry_rate_limits.md) for more details. |
+| `throttle_unauthenticated_packages_api_requests_per_period` | integer | required by:<br>`throttle_unauthenticated_packages_api_enabled` | Maximum requests per period per user. View [Package Registry rate limits](../administration/settings/package_registry_rate_limits.md) for more details. |
| `throttle_unauthenticated_web_enabled` | boolean | no | (**If enabled, requires:** `throttle_unauthenticated_web_period_in_seconds` and `throttle_unauthenticated_web_requests_per_period`) Enable unauthenticated web request rate limit. Helps reduce request volume (for example, from crawlers or abusive bots). |
| `throttle_unauthenticated_web_period_in_seconds` | integer | required by:<br>`throttle_unauthenticated_web_enabled` | Rate limit period in seconds. |
| `throttle_unauthenticated_web_requests_per_period` | integer | required by:<br>`throttle_unauthenticated_web_enabled` | Max requests per period per IP. |
| `time_tracking_limit_to_hours` | boolean | no | Limit display of time tracking units to hours. Default is `false`. |
| `two_factor_grace_period` | integer | required by: `require_two_factor_authentication` | Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication. |
+| `unconfirmed_users_delete_after_days` **(PREMIUM SELF)** | integer | no | Specifies how many days after sign-up to delete users who have not confirmed their email. Only applicable if `delete_unconfirmed_users` is set to `true`. Must be `1` or greater. Default is `7`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/352514) in GitLab 16.1. |
| `unique_ips_limit_enabled` | boolean | no | (**If enabled, requires:** `unique_ips_limit_per_user` and `unique_ips_limit_time_window`) Limit sign in from multiple IPs. |
| `unique_ips_limit_per_user` | integer | required by: `unique_ips_limit_enabled` | Maximum number of IPs per user. |
| `unique_ips_limit_time_window` | integer | required by: `unique_ips_limit_enabled` | How many seconds an IP is counted towards the limit. |
+| `update_runner_versions_enabled` | boolean | no | Fetch GitLab Runner release version data from GitLab.com. For more information, see how to [determine which runners need to be upgraded](../ci/runners/runners_scope.md#determine-which-runners-need-to-be-upgraded). |
| `usage_ping_enabled` | boolean | no | Every week GitLab reports license usage back to GitLab, Inc. |
| `user_deactivation_emails_enabled` | boolean | no | Send an email to users upon account deactivation. |
| `user_default_external` | boolean | no | Newly registered users are external by default. |
@@ -550,6 +569,7 @@ listed in the descriptions of the relevant settings.
| `wiki_page_max_content_bytes` | integer | no | Maximum wiki page content size in **bytes**. Default: 52428800 Bytes (50 MB). The minimum value is 1024 bytes. |
| `jira_connect_application_key` | String | no | Application ID of the OAuth application that should be used to authenticate with the GitLab for Jira Cloud app |
| `jira_connect_proxy_url` | String | no | URL of the GitLab instance that should be used as a proxy for the GitLab for Jira Cloud app |
+| `gitlab_shell_operation_limit` | integer | no | Maximum number of Git operations per minute a user can perform. Default: `600`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/412088) in GitLab 16.2. |
### Configure inactive project deletion
diff --git a/doc/api/snippets.md b/doc/api/snippets.md
index 39965ae91f3..578c72a0502 100644
--- a/doc/api/snippets.md
+++ b/doc/api/snippets.md
@@ -20,7 +20,7 @@ Valid values for snippet visibility levels are:
| Visibility | Description |
|:-----------|:----------------------------------------------------|
| `private` | Snippet is visible only to the snippet creator. |
-| `internal` | Snippet is visible for any authenticated user except [external users](../user/admin_area/external_users.md). |
+| `internal` | Snippet is visible for any authenticated user except [external users](../administration/external_users.md). |
| `public` | Snippet can be accessed without any authentication. |
## List all snippets for a user
diff --git a/doc/api/templates/dockerfiles.md b/doc/api/templates/dockerfiles.md
index e9d57061510..70c104612b8 100644
--- a/doc/api/templates/dockerfiles.md
+++ b/doc/api/templates/dockerfiles.md
@@ -16,7 +16,7 @@ in the GitLab repository.
In [GitLab Premium and Ultimate](https://about.gitlab.com/pricing/) tiers, GitLab instance
administrators can override templates in the
-[Admin Area](../../user/admin_area/settings/instance_template_repository.md).
+[Admin Area](../../administration/settings/instance_template_repository.md).
## List Dockerfile templates
diff --git a/doc/api/templates/gitlab_ci_ymls.md b/doc/api/templates/gitlab_ci_ymls.md
index 29ee93c4e45..69346f8ab3d 100644
--- a/doc/api/templates/gitlab_ci_ymls.md
+++ b/doc/api/templates/gitlab_ci_ymls.md
@@ -120,9 +120,9 @@ Get a single GitLab CI/CD YAML template.
GET /templates/gitlab_ci_ymls/:key
```
-| Attribute | Type | Required | Description |
-| ---------- | ------ | -------- | ------------------------------------- |
-| `key` | string | yes | The key of the GitLab CI/CD YAML template |
+| Attribute | Type | Required | Description |
+|-----------|--------|----------|-------------|
+| `key` | string | Yes | The key of the GitLab CI/CD YAML template |
Example request:
@@ -135,7 +135,7 @@ Example response:
```json
{
"name": "Ruby",
- "content": "# This file is a template, and might need editing before it works on your project.\n# To contribute improvements to CI/CD templates, please follow the Development guide at:\n# https://docs.gitlab.com/ee/development/cicd/templates.html\n# This specific template is located at:\n# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Ruby.gitlab-ci.yml\n\n# Official language image. Look for the different tagged releases at:\n# https://hub.docker.com/r/library/ruby/tags/\nimage: ruby:latest\n\n# Pick zero or more services to be used on all builds.\n# Only needed when using a docker container to run your tests in.\n# Check out: https://docs.gitlab.com/ee/ci/services/index.html\nservices:\n - mysql:latest\n - redis:latest\n - postgres:latest\n\nvariables:\n POSTGRES_DB: database_name\n\n# Cache gems in between builds\ncache:\n paths:\n - vendor/ruby\n\n# This is a basic example for a gem or script which doesn't use\n# services such as redis or postgres\nbefore_script:\n - ruby -v # Print out ruby version for debugging\n # Uncomment next line if your rails app needs a JS runtime:\n # - apt-get update -q \u0026\u0026 apt-get install nodejs -yqq\n - bundle config set --local deployment true # Install dependencies into ./vendor/ruby\n - bundle install -j $(nproc)\n\n# Optional - Delete if not using `rubocop`\nrubocop:\n script:\n - rubocop\n\nrspec:\n script:\n - rspec spec\n\nrails:\n variables:\n DATABASE_URL: \"postgresql://postgres:postgres@postgres:5432/$POSTGRES_DB\"\n script:\n - rails db:migrate\n - rails db:seed\n - rails test\n\n# This deploy job uses a simple deploy flow to Heroku, other providers, e.g. AWS Elastic Beanstalk\n# are supported too: https://github.com/travis-ci/dpl\ndeploy:\n stage: deploy\n environment: production\n script:\n - gem install dpl\n - dpl --provider=heroku --app=$HEROKU_APP_NAME --api-key=$HEROKU_PRODUCTION_KEY\n"
+ "content": "# This file is a template, and might need editing before it works on your project.\n# To contribute improvements to CI/CD templates, please follow the Development guide at:\n# https://docs.gitlab.com/ee/development/cicd/templates.html\n# This specific template is located at:\n# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Ruby.gitlab-ci.yml\n\n# Official language image. Look for the different tagged releases at:\n# https://hub.docker.com/r/library/ruby/tags/\nimage: ruby:latest\n\n# Pick zero or more services to be used on all builds.\n# Only needed when using a docker container to run your tests in.\n# Check out: https://docs.gitlab.com/ee/ci/services/index.html\nservices:\n - mysql:latest\n - redis:latest\n - postgres:latest\n\nvariables:\n POSTGRES_DB: database_name\n\n# Cache gems in between builds\ncache:\n paths:\n - vendor/ruby\n\n# This is a basic example for a gem or script which doesn't use\n# services such as redis or postgres\nbefore_script:\n - ruby -v # Print out ruby version for debugging\n # Uncomment next line if your rails app needs a JS runtime:\n # - apt-get update -q \u0026\u0026 apt-get install nodejs -yqq\n - bundle config set --local deployment true # Install dependencies into ./vendor/ruby\n - bundle install -j $(nproc)\n\n# Optional - Delete if not using `rubocop`\nrubocop:\n script:\n - rubocop\n\nrspec:\n script:\n - rspec spec\n\nrails:\n variables:\n DATABASE_URL: \"postgresql://postgres:postgres@postgres:5432/$POSTGRES_DB\"\n script:\n - rails db:migrate\n - rails db:seed\n - rails test\n\n# This deploy job uses a simple deploy flow to Heroku, other providers, for example, AWS Elastic Beanstalk\n# are supported too: https://github.com/travis-ci/dpl\ndeploy:\n stage: deploy\n environment: production\n script:\n - gem install dpl\n - dpl --provider=heroku --app=$HEROKU_APP_NAME --api-key=$HEROKU_PRODUCTION_KEY\n"
}
```
diff --git a/doc/api/users.md b/doc/api/users.md
index 7b418e7a08b..3fb9d655ff9 100644
--- a/doc/api/users.md
+++ b/doc/api/users.md
@@ -22,6 +22,21 @@ This function takes pagination parameters `page` and `per_page` to restrict the
GET /users
```
+| Attribute | Type | Required | Description |
+| ------------------ | ------- | -------- | ---------------------------------------------------------------------------------------------------------------------- |
+| `username` | string | no | Get a single user with a specific username. |
+| `extern_uid` | string | no | Get a single user with a specific external authentication provider UID. |
+| `provider` | string | no | The external provider. |
+| `search` | string | no | Search for a username. |
+| `active` | boolean | no | Filters only active users. Default is `false`. |
+| `external` | boolean | no | Filters only external users. Default is `false`. |
+| `exclude_external` | boolean | no | Filters only non external users. Default is `false`. |
+| `blocked` | boolean | no | Filters only blocked users. Default is `false`. |
+| `created_after` | DateTime| no | Returns users created after specified time. |
+| `created_before` | DateTime| no | Returns users created before specified time. |
+| `exclude_internal` | boolean | no | Filters only non internal users. Default is `false`. |
+| `without_project_bots`| boolean | no | Filters user without project bots. Default is `false`. |
+
```json
[
{
@@ -121,6 +136,8 @@ GET /users?without_project_bots=true
GET /users
```
+You can use all [parameters available for everyone](#for-non-administrator-users) plus these additional parameters available only for administrators.
+
| Attribute | Type | Required | Description |
| ------------------ | ------- | -------- | --------------------------------------------------------------------------------------------------------------------- |
| `order_by` | string | no | Return users ordered by `id`, `name`, `username`, `created_at`, or `updated_at` fields. Default is `id` |
@@ -268,6 +285,12 @@ For example:
GET /users?extern_uid=1234567&provider=github
```
+Users on [GitLab Premium or Ultimate](https://about.gitlab.com/pricing/) have the `scim` provider available:
+
+```plaintext
+GET /users?extern_uid=1234567&provider=scim
+```
+
You can search users by creation date time range with:
```plaintext
@@ -493,7 +516,7 @@ over `password`. In addition, `reset_password` and
NOTE:
From [GitLab 12.1](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/29888/), `private_profile` defaults to `false`.
-From [GitLab 15.8](https://gitlab.com/gitlab-org/gitlab/-/issues/231301), `private_profile` defaults to the value determined by [this](../user/admin_area/settings/account_and_limit_settings.md#set-profiles-of-new-users-to-private-by-default) setting.
+From [GitLab 15.8](https://gitlab.com/gitlab-org/gitlab/-/issues/231301), `private_profile` defaults to the value determined by [this](../administration/settings/account_and_limit_settings.md#set-profiles-of-new-users-to-private-by-default) setting.
NOTE:
From [GitLab 13.2](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35604), `bio` defaults to `""` instead of `null`.
@@ -510,12 +533,12 @@ Parameters:
| `auditor` **(PREMIUM)** | No | User is an auditor. Valid values are `true` or `false`. Defaults to false. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/366404) in GitLab 15.3. |
| `avatar` | No | Image file for user's avatar |
| `bio` | No | User's biography |
-| `can_create_group` | No | User can create groups - true or false |
+| `can_create_group` | No | User can create top-level groups - true or false |
| `color_scheme_id` | No | User's color scheme for the file viewer (for more information, see the [user preference documentation](../user/profile/preferences.md#syntax-highlighting-theme)) |
| `email` | Yes | Email |
| `extern_uid` | No | External UID |
| `external` | No | Flags the user as external - true or false (default) |
-| `extra_shared_runners_minutes_limit` **(PREMIUM)** | No | Can be set by administrators only. Additional units of compute for this user. |
+| `extra_shared_runners_minutes_limit` **(PREMIUM)** | No | Can be set by administrators only. Additional compute minutes for this user. |
| `force_random_password` | No | Set user password to a random value - true or false (default) |
| `group_id_for_saml` | No | ID of group where SAML has been configured |
| `linkedin` | No | LinkedIn |
@@ -524,11 +547,11 @@ Parameters:
| `note` | No | Administrator notes for this user |
| `organization` | No | Organization name |
| `password` | No | Password |
-| `private_profile` | No | User's profile is private - true or false. The default value is determined by [this](../user/admin_area/settings/account_and_limit_settings.md#set-profiles-of-new-users-to-private-by-default) setting. |
+| `private_profile` | No | User's profile is private - true or false. The default value is determined by [this](../administration/settings/account_and_limit_settings.md#set-profiles-of-new-users-to-private-by-default) setting. |
| `projects_limit` | No | Number of projects user can create |
| `provider` | No | External provider name |
| `reset_password` | No | Send user password reset link - true or false(default) |
-| `shared_runners_minutes_limit` **(PREMIUM)** | No | Can be set by administrators only. Maximum number of monthly units of compute for this user. Can be `nil` (default; inherit system default), `0` (unlimited), or `> 0`. |
+| `shared_runners_minutes_limit` **(PREMIUM)** | No | Can be set by administrators only. Maximum number of monthly compute minutes for this user. Can be `nil` (default; inherit system default), `0` (unlimited), or `> 0`. |
| `skip_confirmation` | No | Skip confirmation - true or false (default) |
| `skype` | No | Skype ID |
| `theme_id` | No | GitLab theme for the user (for more information, see the [user preference documentation](../user/profile/preferences.md#navigation-theme) for more information) |
@@ -565,7 +588,7 @@ Parameters:
| `email` | No | Email |
| `extern_uid` | No | External UID |
| `external` | No | Flags the user as external - true or false (default) |
-| `extra_shared_runners_minutes_limit` **(PREMIUM)** | No | Can be set by administrators only. Additional units of compute for this user. |
+| `extra_shared_runners_minutes_limit` **(PREMIUM)** | No | Can be set by administrators only. Additional compute minutes for this user. |
| `group_id_for_saml` | No | ID of group where SAML has been configured |
| `id` | Yes | ID of the user |
| `linkedin` | No | LinkedIn |
@@ -579,7 +602,7 @@ Parameters:
| `pronouns` | No | Pronouns |
| `provider` | No | External provider name |
| `public_email` | No | Public email of the user (must be already verified) |
-| `shared_runners_minutes_limit` **(PREMIUM)** | No | Can be set by administrators only. Maximum number of monthly units of compute for this user. Can be `nil` (default; inherit system default), `0` (unlimited) or `> 0`. |
+| `shared_runners_minutes_limit` **(PREMIUM)** | No | Can be set by administrators only. Maximum number of monthly compute minutes for this user. Can be `nil` (default; inherit system default), `0` (unlimited) or `> 0`. |
| `skip_reconfirmation` | No | Skip reconfirmation - true or false (default) |
| `skype` | No | Skype ID |
| `theme_id` | No | GitLab theme for the user (for more information, see the [user preference documentation](../user/profile/preferences.md#navigation-theme) for more information) |
@@ -1008,7 +1031,7 @@ Example response:
}
```
-## Create Service Account User **(PREMIUM)**
+## Create Service Account User **(PREMIUM SELF)**
> Ability to create a service account user was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/406782) in GitLab 16.1
@@ -1062,6 +1085,8 @@ Example response:
Get a list of the authenticated user's SSH keys.
+This function takes pagination parameters `page` and `per_page` to restrict the list of keys.
+
```plaintext
GET /user/keys
```
@@ -1738,7 +1763,7 @@ Returns:
- `404 User Not Found` if user cannot be found.
- `403 Forbidden` when trying to deactivate a user that is:
- Blocked by administrator or by LDAP synchronization.
- - Not [dormant](../user/admin_area/moderate_users.md#automatically-deactivate-dormant-users).
+ - Not [dormant](../administration/moderate_users.md#automatically-deactivate-dormant-users).
- Internal.
## Activate user **(FREE SELF)**
@@ -1907,7 +1932,7 @@ Example Responses:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/339925) in GitLab 14.3.
-Rejects specified user that is [pending approval](../user/admin_area/moderate_users.md#users-pending-approval). Available only for administrators.
+Rejects specified user that is [pending approval](../administration/moderate_users.md#users-pending-approval). Available only for administrators.
```plaintext
POST /users/:id/reject
@@ -2051,6 +2076,7 @@ curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://git
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/17176) in GitLab 13.6.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/267553) in GitLab 13.8.
+> - The `expires_at` attribute default was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/120213) in GitLab 16.0.
Use this API to create a new personal access token. Token values are returned once so,
make sure you save it as you can't access it again. This API can only be used by
@@ -2064,7 +2090,7 @@ POST /users/:user_id/personal_access_tokens
| ------------ | ------- | -------- | ------------------------------------------------------------------------------------------------------------------------ |
| `user_id` | integer | yes | ID of the user |
| `name` | string | yes | Name of the personal access token |
-| `expires_at` | date | no | Expiration date of the personal access token in ISO format (`YYYY-MM-DD`) |
+| `expires_at` | date | no | Expiration date of the access token in ISO format (`YYYY-MM-DD`). If no date is set, the expiration is set to the [maximum allowable lifetime of an access token](../user/profile/personal_access_tokens.md#when-personal-access-tokens-expire). |
| `scopes` | array | yes | Array of scopes of the personal access token. See [personal access token scopes](../user/profile/personal_access_tokens.md#personal-access-token-scopes) for possible values. |
```shell
@@ -2243,6 +2269,7 @@ Prerequisites:
- You must be an administrator or have the Owner role of the target namespace or project.
- For `instance_type`, you must be an administrator of the GitLab instance.
+- An access token with the `create_runner` scope.
Be sure to copy or save the `token` in the response, the value cannot be retrieved again.
diff --git a/doc/api/visual_review_discussions.md b/doc/api/visual_review_discussions.md
index 496c732b337..f6d6636280a 100644
--- a/doc/api/visual_review_discussions.md
+++ b/doc/api/visual_review_discussions.md
@@ -29,23 +29,23 @@ POST /projects/:id/merge_requests/:merge_request_iid/visual_review_discussions
Parameters:
| Attribute | Type | Required | Description |
-| ------------------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) |
-| `merge_request_iid` | integer | yes | The IID of a merge request |
-| `body` | string | yes | The content of the thread |
-| `position` | hash | no | Position when creating a diff note |
-| `position[base_sha]` | string | yes | Base commit SHA in the source branch |
-| `position[start_sha]` | string | yes | SHA referencing commit in target branch |
-| `position[head_sha]` | string | yes | SHA referencing HEAD of this merge request |
-| `position[position_type]` | string | yes | Type of the position reference. Either `text` or `image`. |
-| `position[new_path]` | string | no | File path after change |
-| `position[new_line]` | integer | no | Line number after change (Only stored for `text` diff notes) |
-| `position[old_path]` | string | no | File path before change |
-| `position[old_line]` | integer | no | Line number before change (Only stored for `text` diff notes) |
-| `position[width]` | integer | no | Width of the image (Only stored for `image` diff notes) |
-| `position[height]` | integer | no | Height of the image (Only stored for `image` diff notes) |
-| `position[x]` | integer | no | X coordinate (Only stored for `image` diff notes) |
-| `position[y]` | integer | no | Y coordinate (Only stored for `image` diff notes) |
+|---------------------------|----------------|----------|-------------|
+| `id` | integer/string | Yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) |
+| `merge_request_iid` | integer | Yes | The IID of a merge request |
+| `body` | string | Yes | The content of the thread |
+| `position` | hash | No | Position when creating a diff note |
+| `position[base_sha]` | string | Yes | Base commit SHA in the source branch |
+| `position[start_sha]` | string | Yes | SHA referencing commit in target branch |
+| `position[head_sha]` | string | Yes | SHA referencing HEAD of this merge request |
+| `position[position_type]` | string | Yes | Type of the position reference. Either `text` or `image`. |
+| `position[new_path]` | string | No | File path after change |
+| `position[new_line]` | integer | No | Line number after change (Only stored for `text` diff notes) |
+| `position[old_path]` | string | No | File path before change |
+| `position[old_line]` | integer | No | Line number before change (Only stored for `text` diff notes) |
+| `position[width]` | integer | No | Width of the image (Only stored for `image` diff notes) |
+| `position[height]` | integer | No | Height of the image (Only stored for `image` diff notes) |
+| `position[x]` | integer | No | X coordinate (Only stored for `image` diff notes) |
+| `position[y]` | integer | No | Y coordinate (Only stored for `image` diff notes) |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/merge_requests/11/visual_review_discussions?body=comment"
diff --git a/doc/architecture/blueprints/ai_gateway/img/architecture.png b/doc/architecture/blueprints/ai_gateway/img/architecture.png
new file mode 100644
index 00000000000..dea8b5ddb45
--- /dev/null
+++ b/doc/architecture/blueprints/ai_gateway/img/architecture.png
Binary files differ
diff --git a/doc/architecture/blueprints/ai_gateway/index.md b/doc/architecture/blueprints/ai_gateway/index.md
new file mode 100644
index 00000000000..c9947723739
--- /dev/null
+++ b/doc/architecture/blueprints/ai_gateway/index.md
@@ -0,0 +1,463 @@
+---
+status: ongoing
+creation-date: "2023-07-14"
+authors: [ "@reprazent" ]
+coach: [ "@andrewn", "@stanhu" ]
+approvers: [ "@m_gill", "@mksionek", "@marin" ]
+owning-stage: "~devops::modelops"
+participating-stages: []
+---
+
+<!-- vale gitlab.FutureTense = NO -->
+
+# AI-gateway
+
+## Summary
+
+The AI-gateway is a standalone-service that will give access to AI
+features to all users of GitLab, no matter which instance they are
+using: self-managed, dedicated or GitLab.com.
+
+Initially, all AI-gateway deployments will be managed by GitLab (the
+organization), and GitLab.com and all GitLab self-managed instances
+will use the same gateway. However, in the future we could also deploy
+regional gateways, or even customer-specific gateways if the need
+arises.
+
+The AI-Gateway is an API-Gateway that takes traffic from clients, in
+this case GitLab installations, and directing it to different
+services, in this case AI-providers and their models. This North/South
+traffic pattern allows us to control what requests go where and to
+translate the content of the redirected request where needed.
+
+![architecture diagram](img/architecture.png)
+
+[src of the architecture diagram](https://docs.google.com/drawings/d/1PYl5Q5oWHnQAuxM-Jcw0C3eYoGw8a9w8atFpoLhhEas/edit)
+
+By using a hosted service under the control of GitLab we can ensure
+that we provide all GitLab instances with AI features in a scalable
+way. It is easier to scale this small stateless service, than scaling
+GitLab-rails with it's dependencies (database, Redis).
+
+It allows users of self-managed installations to have access to
+features using AI without them having to host their own models or
+connect to 3rd party providers.
+
+## Language: Python
+
+The AI-Gateway was originally started as the "model-gateway" that
+handled requests from IDEs to provide code suggestions. It was written
+in Python.
+
+Python is an object oriented language that is familiar enough for
+Rubyists to pick up through in the younger codebase that is the
+AI-gateway. It also makes it easy for data- and ML-engineers that
+already have Python experience to contribute.
+
+## API
+
+### Basic stable API for the AI-gateway
+
+Because the API of the AI-gateway will be consumed by a wide variety
+of GitLab instances, it is important that we design a stable, yet
+flexible API.
+
+To do this, we can implement an API-endpoint per use-case we
+build. This means that the interface between GitLab and the AI-gateway
+is one that we build and own. This ensures future scalability,
+composability and security.
+
+The API is not versioned, but is backward compatible. See [cross version compatibility](#cross-version-compatibility)
+for details. The AI-gateway will support the last 2 major
+versions. For example when working on GitLab 17.2, we would support
+both GitLab 17 and GitLab 16.
+
+We can add common functionality like rate-limiting, circuit-breakers and
+secret redaction at this level of the stack as well as in GitLab-rails.
+
+#### Protocol
+
+We're choosing to use a simple JSON API for the AI-gateway
+service. This allows us to re-use a lot of what is already in place in
+the current model-gateway. It also allows us to make the endpoints
+version agnostic. We could have an API that expects only a rudimentary
+envelope that can contain dynamic information. We should make sure
+that we make these APIs compatible with multiple versions of GitLab,
+or other clients that use the gateway through GitLab. **This means
+that all client versions talk to the same API endpoint, the AI-gateway
+needs to support this, but we don't need to support different
+endpoints per version**.
+
+We also considered gRPC as a the protocol for communication between
+GitLab instances, they differ on these items:
+
+| gRPC | REST + JSON |
+|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|
+| + Strict protocol definition that is easier to evolve versionless | - No strict schema, so the implementation needs to take good care of supporting multiple versions |
+| + A new Ruby-gRPC server for vscode: likely faster because we can limit dependencies to load ([modular monolith](https://gitlab.com/gitlab-org/gitlab/-/issues/365293)) | - Existing Grape API for vscode: meaning slow boot time and unneeded resources loaded |
+| + Bi-directional streaming | - Straight forward way to stream requests and responses (could still be added) |
+| - A new Python-gRPC server: we don't have experience running gRPC-Python servers | + Existing Python fastapi server, already running for code suggestions to extend |
+| - Hard to pass on unknown messages from vscode through GitLab to ai-gateway | + Easier support for newer vscode + newer ai-gatway, through old GitLab instance |
+| - Unknown support for gRPC in other clients (vscode, jetbrains, other editors) | + Support in all external clients |
+| - Possible protocol mismatch (VSCode --REST--> Rails --gRPC--> AI gateway) | + Same protocol across the stack |
+
+**Discussion:** Because we chose REST+JSON in this iteration to port
+features that already partially exist does not mean we need to exclude
+new features using gRPC or Websockets. For example: Chat features
+might be better served by streaming requests and responses. Since we
+are suggesting an endpoint per use-case, different features could also
+opt for different protocols, as long as we keep cross-version
+compatibility in mind.
+
+#### Single purpose endpoints
+
+For features using AI, we prefer building a single purpose endpoint
+with a stable API over the [provider API we expose](#exposing-ai-providers)
+as a direct proxy.
+
+Some features will have specific endpoints, while others can share
+endpoints. For example, code suggestions or chat could have their own
+endpoint, while several features that summarize issues or merge
+requests could use the same endpoint but make the distinction on what
+information is provided in the payload.
+
+The end goal is to build an API that exposes AI for building
+features without having to touch the AI-gateway. This is analogous to
+how we built Gitaly, adding features to Gitaly where it was needed,
+and reusing existing endpoints when that was possible. We had some
+cost to pay up-front in the case where we needed to implement a new
+endpoint (RPC), but pays off in the long run when most of the required
+functionality is implemented.
+
+**This does not mean that prompts need to be built inside the
+AI-gateway.** But if prompts are part of the payload to a single
+purpose endpoint, the payload needs to specify which model they were
+built for along with other metadata about the prompts. By doing this,
+we can gracefully degrade or otherwise try to support the request if
+one of the prompt payloads is no longer supported by the AI
+gateway. It allows us to potentially avoid breaking features in older
+GitLab installations as the AI landscape changes.
+
+#### Cross version compatibility
+
+When building single purpose endpoints, we should be mindful that
+these endpoints will be used by different GitLab instances indirectly
+by external clients. To achieve this, we have a very simple envelope
+to provide information. It has to have a series of `prompt_components`
+that contain information the AI-gateway can use to build prompts and
+query the model of it selects.
+
+Each prompt component contains 3 elements:
+
+- `type`: This is the kind of information that is being presented in
+ `payload`. The AI-gateway should ignore any types it does not know
+ about.
+- `payload`: The actual information that can be used by the AI-gateway
+ to build the payload that is going to go out to AI providers. The
+ payload will be different depending on the type, and the version of
+ the client providing the payload. This means that the AI-gateway
+ needs to consider all fields optional.
+- `metadata`: Information about the client that built this part of the
+ prompt. This may, or may not be used by GitLab for
+ telemetry. Nothing inside this field should be required.
+
+The only component in there that is likely to change often is the
+`payload` one. There we need to make sure that all fields are
+optional, and avoid renaming, removing or repurposing fields.
+
+When this is needed, we need to build support for the old versions of
+a field in the gateway, and keep them around for at least 2 major
+versions of GitLab. For example, we could consider adding 2 versions
+of a prompt to the `prompt_components` payload:
+
+```json
+{
+ prompt_components: [
+ {
+ "type": "prompt",
+ "metadata": {
+ "source": "GitLab EE",
+ "version": "16.3",
+ },
+ "payload": {
+ "content": "You can fetch information about a resource called an issue...",
+ "params": {
+ "temperature": 0.2,
+ "maxOutputTokens": 1024
+ },
+ "model": "text-bison",
+ "provider": "vertex-ai"
+ }
+ },
+ {
+ "type": "prompt",
+ "metadata": {
+ "source": "GitLab EE",
+ "version": "16.3",
+ },
+ "payload": {
+ "content": "System: You can fetch information about a resource called an issue...\n\nHuman:",
+ "params": {
+ "temperature": 0.2,
+ },
+ "model": "claude-2",
+ "provider": "anthropic"
+ }
+ }
+
+ ]
+}
+```
+
+Allowing the API to direct the prompt to either provider, based on
+what is in the payload.
+
+To document and validate the content of `payload` we can specify their
+format using [JSON-schema](https://json-schema.org/).
+
+#### Example feature: code suggestions
+
+For example, a rough code suggestions service could look like this:
+
+```plaintext
+POST /internal/code-suggestions/completions
+```
+
+```json
+{
+ "prompt_components": [
+ {
+ "type": "prompt",
+ "metadata": {
+ "source": "GitLab EE",
+ "version": "16.3",
+ },
+ "payload": {
+ "content": "...",
+ "params": {
+ "temperature": 0.2,
+ "maxOutputTokens": 1024
+ },
+ "model": "code-gecko",
+ "provider": "vertex-ai"
+ }
+ },
+ {
+ "type": "editor_content",
+ "metadata": {
+ "source": "vscode",
+ "version": "1.1.1"
+ },
+ "payload": {
+ "filename": "application.rb",
+ "before_cursor": "require 'active_record/railtie'",
+ "after_cursor": "\nrequire 'action_controller/railtie'",
+ "open_files": [
+ {
+ "filename": "app/controllers/application_controller.rb",
+ "content": "class ApplicationController < ActionController::Base..."
+ }
+ ]
+ }
+ }
+ ]
+}
+```
+
+A response could look like this:
+
+```json
+{
+ "response": "require 'something/else'",
+ "metadata": {
+ "identifier": "deadbeef",
+ "model": "code-gecko",
+ "timestamp": 1688118443
+ }
+}
+```
+
+The `metadata` field contains information that could be used in a
+telemetry endpoint on the AI-gateway where we could count
+suggestion-acceptance rates among other things.
+
+The way we will receive telemetry for code suggestions is being
+discussed in [#415745](https://gitlab.com/gitlab-org/gitlab/-/issues/415745).
+We will try to come up with an architecture for all AI-related features.
+
+#### Exposing AI providers
+
+A lot of AI functionality has already been built into GitLab-Rails
+that currently builds prompts and submits this directly to different
+AI providers. At the time of writing, GitLab has API-clients for the
+following providers:
+
+- [Anthropic](https://gitlab.com/gitlab-org/gitlab/blob/4344729240496a5018e19a82030d6d4b227e9c79/ee/lib/gitlab/llm/anthropic/client.rb#L6)
+- [Vertex](https://gitlab.com/gitlab-org/gitlab/blob/4344729240496a5018e19a82030d6d4b227e9c79/ee/lib/gitlab/llm/vertex_ai/client.rb#L6)
+- [OpenAI](https://gitlab.com/gitlab-org/gitlab/blob/4344729240496a5018e19a82030d6d4b227e9c79/ee/lib/gitlab/llm/open_ai/client.rb#L8)
+
+To make these features available to self-managed instances, we should
+provide endpoints for each of these that GitLab.com, self-managed or
+dedicated installations can use to give these customers to these
+features.
+
+In a first iteration we could build endpoints that proxy the request
+to the AI provider. This should make it easier to migrate to routing
+these requests through the AI-Gateway. As an example, the endpoint for
+Anthropic could look like this:
+
+```plaintext
+POST /internal/proxy/anthropic/(*endpoint)
+```
+
+The `*endpoint` means that the client specifies what is going to be
+called, for example `/v1/complete`. The request body is entirely
+forwarded to the AI provider. The AI-gateway makes sure the request is
+correctly authenticated.
+
+Having the proxy in between GitLab and the AI provider means that we
+still have control over what goes through to the AI provider and if
+the need arises, we can manipulate or reroute the request to a
+different provider. Doing this means that we could keep supporting
+the features of older GitLab installations even if the provider's API
+changes or we decide not to work with a certain provider anymore.
+
+I think there is value in moving features that use API providers
+directly to a feature-specific purpose built API. Doing this means
+that we can improve these features as AI providers evolve by changing
+the AI-gateway that is under our control. Customers using self-managed
+or dedicated installations could then start getting better
+AI-supported features without having to upgrade their GitLab instance.
+
+Features that are currently
+[experimental](../../../policy/experiment-beta-support.md#experiment)
+can use these generic APIs, but we should aim to convert to a single
+purpose API endpoint before we make the feature [generally available](../../../policy/experiment-beta-support.md#generally-available-ga)
+for self-managed installations. This makes it easier for us to support
+features long-term even if the landscape of AI providers change.
+
+The [Experimental REST API](../../../development/ai_features.md#experimental-rest-api)
+available to GitLab team members should also use this proxy in the
+short term. In the longer term, we should provide developers access to
+a separate proxy that allows them to use GitLab owned authentication
+to several AI providers for experimentation. This will separate the
+traffic from developers trying out new things from the fleet that is
+serving paying customers.
+
+### API in GitLab instances
+
+This is the API that external clients can consume on their local
+GitLab instance. For example VSCode that talks to a self-managed
+instance.
+
+These versions could also widely defer: it could be that the VSCode
+extension is kept up-to-date by developers. But the GitLab instance
+they use for work is kept a minor version behind. So the same
+requirements in terms of stability and flexibility apply for the
+clients as for the AI gateway.
+
+In a first iteration we could consider keeping the current REST
+payloads that the VSCode extension and the Web-IDE send, but direct it
+to the appropriate GitLab installation. GitLab-rails can wrap the
+payload in an envelope for the AI-gateway without having to interpret
+it.
+
+When we do this then the GitLab-instance that receives the request
+from the extension doesn't need to understand it to enrich it and pass
+it on to the AI-Gateway. GitLab can add information to the
+`prompt_components` and pass everything that was already there
+straight through to the AI-gateway.
+
+If a request is initiated from another client (for example VSCode),
+GitLab-rails needs to forward the entire payload in addition to any
+other enhancements and prompts. This is required so we can potentially
+support changes from a newer version of the client, traveling through
+an outdated GitLab installation to a recent AI-gateway.
+
+**Discussion:** This first iteration is also using a REST+JSON
+approach. This is how the VSCode extension is currently communicating
+with the model gateway. This means that it's a smaller iteration to go
+from that, to wrapping that existing payload into an envelope. With
+the added advantage of cross version compatibility. But it does not
+mean that future iterations also need to use REST+JSON. As each
+feature would have it's own endpoint, the protocol could also be
+different.
+
+## Authentication & Authorization
+
+GitLab will provide the first layer of authorization: It authenticate
+the user and check if the license allows using the feature the user is
+trying to use. This can be done using the authentication and license
+checks that are already built into GitLab.
+
+Authenticating the GitLab-instance on the AI-gateway will be discussed
+in[#177](https://gitlab.com/gitlab-org/modelops/applied-ml/code-suggestions/ai-assist/-/issues/177).
+Because the AI-gateway exposes proxied endpoints to AI providers, it
+is important that the authentication tokens have limited validity.
+
+## Embeddings
+
+Embeddings can be requested for all features in a single endpoint, for
+example through a request like this:
+
+```plaintext
+POST /internal/embeddings
+```
+
+```json
+{
+ "content": "The lazy fox and the jumping dog",
+ "content_type": "issue_title",
+ "metadata": {
+ "source": "GitLab EE",
+ "version": "16.3"
+ }
+}
+```
+
+The `content_type` and properties `content` could in the future be
+used to create embeddings from different models based on what is
+appropriate.
+
+The response will include the embedding vector besides the used
+provider and model. For example:
+
+```json
+{
+ "response": [0.2, -1, ...],
+ "metadata": {
+ "identifier": "8badf00d",
+ "model": "text-embedding-ada-002",
+ "provider": "open_ai",
+ }
+}
+```
+
+When storing the embedding, we should make sure we include the model
+and provider data. When embeddings are used to generate a prompt, we
+could include that metadata in the payload so we can judge the quality
+of the embedding.
+
+## Deployment
+
+Currently, the model-gateway that will become the AI-gateway is being
+deployed using from the project repository in
+[`gitlab-org/modelops/applied-ml/code-suggestions/ai-assist`](https://gitlab.com/gitlab-org/modelops/applied-ml/code-suggestions/ai-assist).
+
+It is deployed to a Kubernetes cluster in it's own project. There is a
+staging environment that is currently used directly by engineers for
+testing.
+
+In the future, this will be deloyed using
+[Runway](https://gitlab.com/gitlab-com/gl-infra/platform/runway/). At
+that time, there will be a production and staging deployment. The
+staging deployment can be used for automated QA-runs that will have
+the potential to stop a deployment from reaching production.
+
+Further testing strategy is being discussed in
+[&10563](https://gitlab.com/groups/gitlab-org/-/epics/10563).
+
+## Alternative solutions
+
+Alternative solutions were discussed in
+[applied-ml/code-suggestions/ai-assist#161](https://gitlab.com/gitlab-org/modelops/applied-ml/code-suggestions/ai-assist/-/issues/161#what-are-the-alternatives).
diff --git a/doc/architecture/blueprints/cells/cells-feature-backups.md b/doc/architecture/blueprints/cells/cells-feature-backups.md
index d596bdd2078..b5d5d7afdcf 100644
--- a/doc/architecture/blueprints/cells/cells-feature-backups.md
+++ b/doc/architecture/blueprints/cells/cells-feature-backups.md
@@ -25,10 +25,10 @@ and also Git repository data.
## 2. Data flow
-Each cell has a number of application databases to back up (e.g. `main`, and `ci`).
+Each cell has a number of application databases to back up (for example, `main`, and `ci`).
-Additionally, there may be cluster-wide metadata tables (e.g. `users` table)
-which is directly accesible via PostgreSQL.
+Additionally, there may be cluster-wide metadata tables (for example, `users` table)
+which is directly accessible via PostgreSQL.
## 3. Proposal
diff --git a/doc/architecture/blueprints/cells/cells-feature-contributions-forks.md b/doc/architecture/blueprints/cells/cells-feature-contributions-forks.md
index 3e498c24144..8a67383c5e4 100644
--- a/doc/architecture/blueprints/cells/cells-feature-contributions-forks.md
+++ b/doc/architecture/blueprints/cells/cells-feature-contributions-forks.md
@@ -30,13 +30,13 @@ with various usage patterns:
Forks allow users not having write access to parent project to make changes. The forking workflow
is especially important for the Open Source community which is able to contribute back
to public projects. However, it is equally important in some companies which prefer the strong split
-of responsibilites and tighter access control. The access to project is restricted
+of responsibilities and tighter access control. The access to project is restricted
to designated list of developers.
Forks enable:
-- tigther control of who can modify the upstream project
-- split of the responsibilites: parent project might use CI configuration connecting to production systems
+- tighter control of who can modify the upstream project
+- split of the responsibilities: parent project might use CI configuration connecting to production systems
- run CI pipelines in context of fork in much more restrictive environment
- consider all forks to be unveted which reduces risks of leaking secrets, or any other information
tied with the project
diff --git a/doc/architecture/blueprints/cells/cells-feature-secrets.md b/doc/architecture/blueprints/cells/cells-feature-secrets.md
index 20260c89ccd..50ccf926b4d 100644
--- a/doc/architecture/blueprints/cells/cells-feature-secrets.md
+++ b/doc/architecture/blueprints/cells/cells-feature-secrets.md
@@ -25,10 +25,10 @@ GitLab has a lot of
[secrets](https://docs.gitlab.com/charts/installation/secrets.html) that needs
to be configured.
-Some secrets are for inter-component communication, e.g. `GitLab Shell secret`,
+Some secrets are for inter-component communication, for example, `GitLab Shell secret`,
and used only within a cell.
-Some secrets are used for features, e.g. `ci_jwt_signing_key`.
+Some secrets are used for features, for example, `ci_jwt_signing_key`.
## 2. Data flow
diff --git a/doc/architecture/blueprints/cells/index.md b/doc/architecture/blueprints/cells/index.md
index 6da99e0aa6a..dcd28707890 100644
--- a/doc/architecture/blueprints/cells/index.md
+++ b/doc/architecture/blueprints/cells/index.md
@@ -190,7 +190,7 @@ information. For example:
by one of the Cells, and the results of that can be cached. We also need to implement
a mechanism for negative cache and cache eviction.
-1. **GraphQL and other ambigious endpoints.**
+1. **GraphQL and other ambiguous endpoints.**
Most endpoints have a unique sharding key: the organization, which directly
or indirectly (via a group or project) can be used to classify endpoints.
@@ -281,24 +281,24 @@ changes to prepare the codebase for data split.
One iteration describes one quarter's worth of work.
-1. Iteration 1 - FY24Q1
+1. [Iteration 1](https://gitlab.com/groups/gitlab-org/-/epics/9667) - FY24Q1
- Data access layer: Initial Admin Area settings are shared across cluster.
- Essential workflows: Allow to share cluster-wide data with database-level data access layer
-1. Iteration 2 - FY24Q2
+1. [Iteration 2](https://gitlab.com/groups/gitlab-org/-/epics/9813) - FY24Q2
- Essential workflows: User accounts are shared across cluster.
- Essential workflows: User can create group.
-1. Iteration 3 - FY24Q3
+1. [Iteration 3](https://gitlab.com/groups/gitlab-org/-/epics/10997) - FY24Q3
- Essential workflows: User can create project.
- Essential workflows: User can push to Git repository.
- Cell deployment: Extend GitLab Dedicated to support GCP
- Routing: Technology.
-1. Iteration 4 - FY24Q4
+1. [Iteration 4](https://gitlab.com/groups/gitlab-org/-/epics/10998) - FY24Q4
- Essential workflows: User can run CI pipeline.
- Essential workflows: User can create issue, merge request, and merge it after it is green.
diff --git a/doc/architecture/blueprints/cells/proposal-stateless-router-with-buffering-requests.md b/doc/architecture/blueprints/cells/proposal-stateless-router-with-buffering-requests.md
index f352fea84b1..c1ca0c60dcd 100644
--- a/doc/architecture/blueprints/cells/proposal-stateless-router-with-buffering-requests.md
+++ b/doc/architecture/blueprints/cells/proposal-stateless-router-with-buffering-requests.md
@@ -429,7 +429,7 @@ sequenceDiagram
```
In this case the user is not on their "default organization" so their TODO
-counter will not include their normal todos. We may choose to highlight this in
+counter will not include their typical todos. We may choose to highlight this in
the UI somewhere. A future iteration may be able to fetch that for them from
their default organization.
diff --git a/doc/architecture/blueprints/cells/proposal-stateless-router-with-routes-learning.md b/doc/architecture/blueprints/cells/proposal-stateless-router-with-routes-learning.md
index aadc08016e3..3b3d481914f 100644
--- a/doc/architecture/blueprints/cells/proposal-stateless-router-with-routes-learning.md
+++ b/doc/architecture/blueprints/cells/proposal-stateless-router-with-routes-learning.md
@@ -452,7 +452,7 @@ sequenceDiagram
```
In this case the user is not on their "default organization" so their TODO
-counter will not include their normal todos. We may choose to highlight this in
+counter will not include their typical todos. We may choose to highlight this in
the UI somewhere. A future iteration may be able to fetch that for them from
their default organization.
diff --git a/doc/architecture/blueprints/ci_data_decay/index.md b/doc/architecture/blueprints/ci_data_decay/index.md
index 2eac27def18..25ce71a3a6f 100644
--- a/doc/architecture/blueprints/ci_data_decay/index.md
+++ b/doc/architecture/blueprints/ci_data_decay/index.md
@@ -55,7 +55,7 @@ of the primary database, to a different storage, that is more performant and
cost effective.
It is already possible to prevent processing builds
-[that have been archived](../../../user/admin_area/settings/continuous_integration.md#archive-jobs).
+[that have been archived](../../../administration/settings/continuous_integration.md#archive-jobs).
When a build gets archived it will not be possible to retry it, but we still do
keep all the processing metadata in the database, and it consumes resources
that are scarce in the primary database.
diff --git a/doc/architecture/blueprints/ci_pipeline_components/index.md b/doc/architecture/blueprints/ci_pipeline_components/index.md
index 667c8d225db..9a8084f290b 100644
--- a/doc/architecture/blueprints/ci_pipeline_components/index.md
+++ b/doc/architecture/blueprints/ci_pipeline_components/index.md
@@ -12,6 +12,9 @@ participating-stages: []
# CI/CD Catalog
+NOTE:
+This document covers the future plans for the CI/CD Catalog feature. For information on the features already available for use in GitLab, see the [CI/CD Components documentation](../../../ci/components/index.md).
+
## Summary
## Goals
@@ -227,8 +230,7 @@ The version of the component can be (in order of highest priority first):
1. A commit SHA - For example: `gitlab.com/gitlab-org/dast@e3262fdd0914fa823210cdb79a8c421e2cef79d8`
1. A tag - For example: `gitlab.com/gitlab-org/dast@1.0`
-1. A special moving target version that points to the most recent released tag. The target project must be
-explicitly marked as a [catalog resource](#catalog-resource) - For example: `gitlab.com/gitlab-org/dast@~latest`
+1. A special moving target version that points to the most recent released tag - For example: `gitlab.com/gitlab-org/dast@~latest`
1. A branch name - For example: `gitlab.com/gitlab-org/dast@master`
If a tag and branch exist with the same name, the tag takes precedence over the branch.
diff --git a/doc/architecture/blueprints/ci_scale/index.md b/doc/architecture/blueprints/ci_scale/index.md
index 3a6ed4ae9b1..340e6557a72 100644
--- a/doc/architecture/blueprints/ci_scale/index.md
+++ b/doc/architecture/blueprints/ci_scale/index.md
@@ -137,7 +137,7 @@ stores more than 600 gigabytes of data, and `ci_builds.yaml_variables` more
than 300 gigabytes (as of February 2021).
It is a lot of data that needs to be reliably moved to a different place.
-Unfortunately, right now, our [background migrations](../../../development/database/background_migrations.md)
+Unfortunately, right now, our background migrations
are not reliable enough to migrate this amount of data at scale. We need to
build mechanisms that will give us confidence in moving this data between
columns, tables, partitions or database shards.
diff --git a/doc/architecture/blueprints/clickhouse_ingestion_pipeline/index.md b/doc/architecture/blueprints/clickhouse_ingestion_pipeline/index.md
index 6645f390fd1..66089085d0d 100644
--- a/doc/architecture/blueprints/clickhouse_ingestion_pipeline/index.md
+++ b/doc/architecture/blueprints/clickhouse_ingestion_pipeline/index.md
@@ -129,7 +129,7 @@ We're also not addressing any client-side specific details into the design at th
## General Considerations
-Having addressed the details of the two aformentioned problem-domains, we can model a proposed solution with the following logical structure:
+Having addressed the details of the two aforementioned problem-domains, we can model a proposed solution with the following logical structure:
- Ingestion
- APIs/SDKs
@@ -208,7 +208,7 @@ Gitlab::Database::Writer.config do |config|
# then backend-specific configurations hereafter
#
config.url = 'tcp://user:pwd@localhost:9000/database'
- # e.g. a serializer helps define how data travels over the wire
+ # for example, a serializer helps define how data travels over the wire
config.json_serializer = ClickHouse::Serializer::JsonSerializer
# ...
end
diff --git a/doc/architecture/blueprints/clickhouse_usage/index.md b/doc/architecture/blueprints/clickhouse_usage/index.md
index 8a5530313e5..3febb09f0bf 100644
--- a/doc/architecture/blueprints/clickhouse_usage/index.md
+++ b/doc/architecture/blueprints/clickhouse_usage/index.md
@@ -20,6 +20,12 @@ participating-stages: ["~section::ops", "~section::dev"]
In FY23-Q2, the Monitor:Observability team developed and shipped a [ClickHouse data platform](https://gitlab.com/groups/gitlab-org/-/epics/7772) to store and query data for Error Tracking and other observability features. Other teams have also begun to incorporate ClickHouse into their current or planned architectures. Given the growing interest in ClickHouse across product development teams, it is important to have a cohesive strategy for developing features using ClickHouse. This will allow teams to more efficiently leverage ClickHouse and ensure that we can maintain and support this functionality effectively for SaaS and self-managed customers.
+### Use Cases
+
+Many product teams at GitLab are considering ClickHouse when developing new features and to improve performance of existing features.
+
+During the start of the ClickHouse working group, we [documented existing and potential use cases](https://gitlab.com/groups/gitlab-com/-/epics/2075#use-cases) and found that there was interest in ClickHouse from teams across all DevSecOps stage groups.
+
### Goals
As ClickHouse has already been selected for use at GitLab, our main goal now is to ensure successful adoption of ClickHouse across GitLab. It is helpful to break down this goal according to the different phases of the product development workflow.
@@ -29,29 +35,36 @@ As ClickHouse has already been selected for use at GitLab, our main goal now is
1. Launch: Support ClickHouse-backed features for SaaS and self-managed.
1. Improve: Successfully scale our usage of ClickHouse.
-### Non-Goals
+### Non-goals
+
+ClickHouse will not be packaged by default with self-managed GitLab, due to uncertain need, complexity, and lack of operational experience. We will still work to find the best possible way to enable users to use ClickHouse themselves if they desire, but it will not be on by default. [ClickHouse maintenance and cost](self_managed_costs_and_requirements/index.md) investigations revealed an uncertain cost impact to smaller instances, and at this time unknown nuance to managing ClickHouse. This means features that depend only on ClickHouse will not be available out of the box for self-managed users (as of end of 2022, the majority of revenue comes from self-managed), so new features researching the use of ClickHouse should be aware of the potential impacts to user adoption in the near-term, until a solution is viable.
## Proposals
The following are links to proposals in the form of blueprints that address technical challenges to using ClickHouse across a wide variety of features.
-1. Scalable data ingestion pipeline.
+1. [Scalable data ingestion pipeline](../clickhouse_ingestion_pipeline/index.md).
- How do we ingest large volumes of data from GitLab into ClickHouse either directly or by replicating existing data?
-1. Supporting ClickHouse for self-managed installations.
- - For which use-cases and scales does it make sense to run ClickHouse for self-managed and what are the associated costs?
- - How can we best support self-managed installation of ClickHouse for different types/sizes of environments?
- - Consider using the [Opstrace ClickHouse operator](https://gitlab.com/gitlab-org/opstrace/opstrace/-/tree/main/clickhouse-operator) as the basis for a canonical distribution.
- - Consider exposing Clickhouse backend as [GitLab Plus](https://gitlab.com/groups/gitlab-org/-/epics/308) to combine benefits of using self-managed instance and GitLab-managed database.
- - Should we develop abstractions for querying and data ingestion to avoid requiring ClickHouse for small-scale installations?
-1. Abstraction layer for features to leverage both ClickHouse or PostreSQL.
+1. [Abstraction layer](../clickhouse_read_abstraction_layer/index.md) for features to leverage both ClickHouse and PostgreSQL.
- What are the benefits and tradeoffs? For example, how would this impact our automated migration and query testing?
-1. Security recommendations and secure defaults for ClickHouse usage.
-Note that we are still formulating proposals and will update the blueprint accordingly.
+### Product roadmap
+
+#### Near-term
+
+In the next 3 months (FY24 Q2) ClickHouse will be implemented by default only for SaaS on GitLab.com or manual enablement for self-managed instances. This is due to the uncertain costs and management requirements for self-managed instances. This near-term implementation will be used to develop best practices and strategy to direct self-managed users. This will also constantly shape our recommendations for self-managed instances that want to onboard ClickHouse early.
+
+#### Mid-term
+
+After we have formulated best practices of managing ClickHouse ourselves for GitLab.com, the plan for 3-9 months (FY24 2H) will be to offer supported recommendations for self-managed instances that want to run ClickHouse themselves or potentially to a ClickHouse cluster/VM we would manage for users. One proposal for self-managed users is to [create a proxy or abstraction layer](https://gitlab.com/groups/gitlab-org/-/epics/308) that would allow users to connect their self-managed instance to SaaS without additional effort. Another option would be to allow users to "Bring your own ClickHouse" similar to our [approach for Elasticsearch](../../../integration/advanced_search/elasticsearch.md#install-elasticsearch). For the features that require ClickHouse for optimal usage (Value Streams Dashboard, [Product Analytics](https://gitlab.com/groups/gitlab-org/-/epics/8921) and Observability), this will be the initial go-to-market action.
+
+#### Long-term
+
+We will work towards a packaged reference version of ClickHouse capable of being easily managed with minimal cost increases for self-managed users. We should be able to reliably instruct users on the management of ClickHouse and provide accurate costs for usage. This will mean any feature could depend on ClickHouse without decreasing end-user exposure.
## Best Practices
-Best practices and guidelines for developing performant and scalable features using ClickHouse are located in the [ClickHouse developer documentation](../../../development/database/clickhouse/index.md).
+Best practices and guidelines for developing performant, secure, and scalable features using ClickHouse are located in the [ClickHouse developer documentation](../../../development/database/clickhouse/index.md).
## Cost and maintenance analysis
diff --git a/doc/architecture/blueprints/code_search_with_zoekt/index.md b/doc/architecture/blueprints/code_search_with_zoekt/index.md
index 681782609ba..273d8da482c 100644
--- a/doc/architecture/blueprints/code_search_with_zoekt/index.md
+++ b/doc/architecture/blueprints/code_search_with_zoekt/index.md
@@ -33,7 +33,7 @@ GitLab code search functionality today is backed by Elasticsearch.
Elasticsearch has proven useful for other types of search (issues, merge
requests, comments and so-on) but is by design not a good choice for code
search where users expect matches to be precise (ie. no false positives) and
-flexible (e.g. support
+flexible (for example, support
[substring matching](https://gitlab.com/gitlab-org/gitlab/-/issues/325234)
and
[regexes](https://gitlab.com/gitlab-org/gitlab/-/issues/4175)). We have
diff --git a/doc/architecture/blueprints/consolidating_groups_and_projects/index.md b/doc/architecture/blueprints/consolidating_groups_and_projects/index.md
index f5bd53627cb..2e0b4d40e13 100644
--- a/doc/architecture/blueprints/consolidating_groups_and_projects/index.md
+++ b/doc/architecture/blueprints/consolidating_groups_and_projects/index.md
@@ -198,7 +198,7 @@ In this phase we are migrating basic, high-priority project functionality from `
- [Unify members/members actions](https://gitlab.com/groups/gitlab-org/-/epics/8010) - on UI and API level.
- Starring: Right now only projects can be starred. We want to bring this to the group level.
- Common actions: Destroying, transferring, restoring. This can be unified on the controller level and then propagated lower.
-- Archiving currently only works on the project level. This can be brought to the group level, similar to the mechanism for “pending deletionâ€.
+- Archiving currently only works on the project level. This can be brought to the group level, similar to the mechanism for "pending deletion".
- Avatar's serving and actions.
### Phase 4
diff --git a/doc/architecture/blueprints/container_registry_metadata_database/index.md b/doc/architecture/blueprints/container_registry_metadata_database/index.md
index b77aaf598e6..a538910f553 100644
--- a/doc/architecture/blueprints/container_registry_metadata_database/index.md
+++ b/doc/architecture/blueprints/container_registry_metadata_database/index.md
@@ -266,7 +266,7 @@ The expected registry behavior will be covered with integration tests by manipul
##### Latency
-Excessive latency on established connections is hard to detect and debug, as these might not raise an application error or network timeout in normal circumstances but usually precede them.
+Excessive latency on established connections is hard to detect and debug, as these might not raise an application error or network timeout in typical circumstances but usually precede them.
For this reason, the duration of database queries used to serve HTTP API requests should be instrumented using metrics, allowing the detection of unusual variations and trigger alarms accordingly before an excessive latency becomes a timeout or service unavailability.
diff --git a/doc/architecture/blueprints/container_registry_metadata_database_self_managed_rollout/index.md b/doc/architecture/blueprints/container_registry_metadata_database_self_managed_rollout/index.md
new file mode 100644
index 00000000000..a73f6335218
--- /dev/null
+++ b/doc/architecture/blueprints/container_registry_metadata_database_self_managed_rollout/index.md
@@ -0,0 +1,238 @@
+---
+status: proposed
+creation-date: "2023-06-09"
+authors: [ "@hswimelar" ]
+coach: "@grzesiek"
+approvers: [ "@trizzi ", "@sgoldstein" ]
+owning-stage: "~devops::package"
+participating-stages: []
+---
+
+<!-- Blueprints often contain forward-looking statements -->
+<!-- vale gitlab.FutureTense = NO -->
+
+# Container Registry Self-Managed Database Rollout
+
+## Summary
+
+The latest iteration of the [Container Registry](https://gitlab.com/gitlab-org/container-registry)
+has been rearchitected to use a PostgreSQL database and deployed on GitLab.com.
+Now we must bring the advantages provided by the database to self-managed users.
+While the container registry retains the capacity to run without the new database,
+many new and highly desired features cannot be implemented without it.
+Additionally, unifying the registry used for GitLab.com and for self-managed
+allows us to provide a cohesive user experience and reduces the burden
+associated with maintaining the old registry implementation. To accomplish this,
+we plan to eventually require all self-managed to migrate to the new registry
+database, so that we may deprecate and remove support for the old object storage
+metadata subsystem.
+
+This document seeks to describe how we may use the proven core migration
+functionality, which was used to migrate millions of container images on GitLab.com,
+to enable self-managed users to enjoy the benefits of the metadata database.
+
+## Motivation
+
+Enabling self-managed users to migrate to the new metadata database allows these
+users to take advantage of the new features that require the database. Additionally,
+the greater adoption of the database allows the container registry team to focus
+our knowledge and capacity, and will eventually allow us to fully remove the old
+registry metadata subsystem, greatly improving the maintainability and stability
+of the container registry for both GitLab.com and for self-managed users.
+
+### Goals
+
+- Progressively rollout the new dependency of a PostgreSQL database instance for the registry for charts and omnibus deployments.
+- Progressively rollout automation for the registry PostgreSQL database instance for charts and omnibus deployments.
+- Develop processes and tools that self-managed admins can use to migrate existing registry deployments to the metadata database.
+- Develop processes and tools that self-managed admins can use spin up fresh installs of the Container Registry which use the metadata database.
+- Create a plan which will eventually allow us to fully drop support for original object storage metadata subsystem.
+
+### Non-Goals
+
+- Developing new Container Registry features outside the scope of enabling admins to migrate to the metadata database.
+- Determining lifecycle support decisions, such as when to default to the database, and when to end support for non-database registries.
+
+## Proposal
+
+There are two main components that must be further developed in order for
+self-managed admins to move to the registry database: the deployment environment and
+the registry migration tooling.
+
+For the deployment environments need to document what the user needs to do to set up their
+deployment such that the registry has access to a suitable database given the
+expected registry workload. As well as develop tooling and automation to ease
+the setup and maintenance of the registry database for new and existing deploys.
+
+For the registry, we need to develop and validate import tooling which
+coordinates with the core import functionality which was used to migrate all
+container images on GitLab.com. Additionally, we must validate that each supported
+storage driver works as expected with the import process and provide estimated
+import times for admins.
+
+We can structure our work to meet the standards outlined in support for
+Experiment, Beta, and Alpha features. Doing so will help to prioritize core
+functionality and to allow users who wish to be early adopters to begin using
+the database and providing us with invaluable feedback.
+
+These levels of support could be advertised to self-managed users via a simple
+chart, allowing them to tell at a glance the status of this project as it relates
+to their situation.
+
+| Installation | GCS | AWS | Filesystem | Azure | OSS | Swift|
+| ------ | ------ |------ | ------ | ------ |------ | ------ |
+| Omnibus | GA | GA | Beta | Experimental | Experimental | Experimental |
+| Charts | GA | GA |Beta | Experimental | Experimental | Experimental |
+
+### Justification of Structuring Support by Driver
+
+It's possible that we could simplify the proposed support matrix by structuring
+it only by deployment environment and not differentiate by storage driver. The
+following two sections briefly summarize several points for and against.
+
+#### Arguments Opposed to Structuring Support by Driver
+
+Each storage driver is well abstracted in the code, specifically the import process
+makes use of the following Methods:
+
+- Walk
+- List
+- GetContent
+- Stat
+- Reader
+
+Each of the methods is a read method we do not need to create or delete data via
+the object storage methods. Additionally, all of these methods are standard API
+methods.
+
+Given that we're not mutating data via object storage as part of the import
+process, we should not need to double-check these drivers or try to predict
+potential errors. Relying on user feedback during the beta to direct any efforts
+we should be making here could prevent us from scheduling unnecessary work.
+
+#### Arguments in Favor of Structuring Support by Driver
+
+Our experience with enhancing and supporting offline garbage collection has
+shown that while the storage driver implementation should not matter, it does.
+The drivers have proven to have important differences in performance and
+reliability. Many of the planned possible driver-related improvements are
+related to testing and stability, rather than outright new work for each driver.
+
+In particular, retries and error reporting across storage drivers are not as
+standardized as one would hope for, and therefore there is a potential that a
+long-running import process could be interrupted by an error that could have
+been retried.
+
+Creating import estimates based on combinations of the registry size and storage
+driver, would also be of use to self-managed admins, looking to schedule their
+migration. There will be a difference here between local filesystem storage and
+object storage and there could be a difference between the object storage
+providers as well.
+
+Also, we could work with the importer to smooth out the differences in the
+storage drivers. Even without unified retryable error reporting from the storage
+drivers, we could have the importer retry more time and for more errors. There's
+a risk we would retry several times on non-retryable errors, but since no writes
+are being made to object storage, this should not ultimately be harmful.
+
+Additionally, implementing [Validate Self-Managed Imports](https://gitlab.com/gitlab-org/container-registry/-/issues/938)
+would perform a consistency check against a sample of images before and after
+import which would lead to greater consistency across all storage driver implementations.
+
+## Design and Implementation Details
+
+### The Import Tool
+
+The [import tool](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs-gitlab/database-import-tool.md)
+is a well-validated component of the Container Registry project that we have used
+from the beginning as a way to perform local testing. This tool is a thin wrapper
+over the core import functionality — the code which handles the import logic has
+been extensively validated.
+
+While the core import functionality is solid, we must ensure that this tool and
+the surrounding process will enable non-expert users to import their registries
+with both minimal risk and with minimal support from GitLab team members.
+Therefore, the most important work remaining is crafting the UX of this tooling
+such that those goals are met. This
+[epic](https://gitlab.com/groups/gitlab-org/-/epics/8602) captures many of the
+proposed improvements.
+
+#### Design
+
+The tool is designed such that a single execution flow can support both users
+with large registries with strict uptime requirements who can take advantage of
+a more involved process to reduce read-only time to the absolute minimum as well
+as users with small registries who benefit from a streamlined workflow. This is
+achieved via the same pre import, then full import cycle that was used on
+GitLab.com, along with an additional step to catalog all unreferenced blobs held
+in common storage.
+
+##### One-Shot Import
+
+In most cases, a user can simply choose to run the import tool while the registry
+is offline or read-only in mode. This will be similar to what admins must
+already do in order to run offline garbage collection. Each step completes in
+sequence, moving directly to the next. The command exits when the import process
+is complete and the registry is ready to make full use of the metadata database.
+
+##### Minimal Downtime Import
+
+For users with large registries and who are interested in the minimum possible
+downtime, each step can be ran independently when the tool is passed the appropriate
+flag. The user will first run the pre-import step while the registry is
+performing its usual workload. Once that has completed, and the user is ready
+to stop writes to the registry, the tag import step can be ran. As with the GitLab.com
+migration, importing tags requires that the registry be offline or in
+read-only mode. This step does the minimum possible work to achieve fast and
+efficient tag imports and will always be the fastest of the three steps, reducing
+the downtime component to a fraction of the total import time. The user can then
+bring up the registry configured to use the metadata database. After that, the
+user is free to run the third step during standard registry operations. This step
+makes any dangling blobs in common storage visible to the database and therefore
+the online garbage collection process.
+
+### Distribution Paths
+
+Tooling, process, and documentation will need to be developed in order to
+support users who wish to use the metadata database, especially in regards to
+providing a foundation for the new database instance required for the migration.
+
+For new deployments, we should wait until we've moved to general support, have
+automation in place for the registry database and migration, and have a major
+GitLab version bump before enabling the database by default for self-managed.
+
+#### Omnibus
+
+#### Charts
+
+## Alternative Solutions
+
+### Do Nothing
+
+#### Pros
+
+- The database and associated features are generally most useful for large-scale, high-availability deployments.
+- Eliminate the need to support an additional logical or physical database for self-managed deployments.
+
+#### Cons
+
+- The registry on GitLab.com and the registry used by self-managed will greatly diverge in supported features over time.
+- The maintenance burden of supporting two registry implementations will reduce the velocity at which new registry features can be released.
+- The registry on GitLab.com stops being an effective way to validate changes before they are released to self-managed.
+- Large self-managed users continue to not be able to scale the registry to suit their needs.
+
+### Gradual Migration
+
+This approach would be to exactly replicate the GitLab.com migration on
+self-managed.
+
+#### Pros
+
+- Replicate an already successful process.
+- Scope downtime by repository, rather than instance.
+
+#### Cons
+
+- Dramatically increased complexity in all aspects of the migration process.
+- Greatly increased possibility of data consistency issues.
+- Less clear demarcation of registry migration progress.
diff --git a/doc/architecture/blueprints/database/automated_query_analysis/index.md b/doc/architecture/blueprints/database/automated_query_analysis/index.md
index c08784dab48..40f6b2af412 100644
--- a/doc/architecture/blueprints/database/automated_query_analysis/index.md
+++ b/doc/architecture/blueprints/database/automated_query_analysis/index.md
@@ -12,7 +12,7 @@ participating-stages: []
## Problem Summary
-Our overarching goal is to improve the reliability and throughput of GitLab’s
+Our overarching goal is to improve the reliability and throughput of the GitLab
database review process. The current process requires merge request authors to
manually provide query plans and raw SQL when introducing new queries or
updating existing queries. This is both time consuming and error prone.
diff --git a/doc/architecture/blueprints/gitlab_agent_deployments/index.md b/doc/architecture/blueprints/gitlab_agent_deployments/index.md
index d8d26389d7d..798c8a3045d 100644
--- a/doc/architecture/blueprints/gitlab_agent_deployments/index.md
+++ b/doc/architecture/blueprints/gitlab_agent_deployments/index.md
@@ -1,11 +1,11 @@
---
-status: proposed
+status: implemented
creation-date: "2022-11-23"
authors: [ "@shinya.maeda" ]
coach: "@DylanGriffith"
approvers: [ "@nagyv-gitlab", "@cbalane", "@hustewart", "@hfyngvason" ]
-owning-stage: "~devops::release"
-participating-stages: [Configure, Release]
+owning-stage: "~devops::deploy"
+participating-stages: [Environments]
---
<!-- vale gitlab.FutureTense = NO -->
@@ -28,9 +28,7 @@ This blueprint describes how the association is established and how these domain
- The proposed architecture can be used in [Organization-level Environment dashboard](https://gitlab.com/gitlab-org/gitlab/-/issues/241506).
- The cluster resources and events can be visualized per [GitLab Environment](../../../ci/environments/index.md).
An environment-specific view scoped to the resources managed either directly or indirectly by a deployment commit.
-- Support both [GitOps mode](../../../user/clusters/agent/gitops.md#gitops-configuration-reference) and [CI Access mode](../../../user/clusters/agent/ci_cd_workflow.md#authorize-the-agent).
- - NOTE: At the moment, we focus on the solution for CI Access mode. GitOps mode will have significant architectural changes _outside of_ this blueprint,
- such as [Flux switching](https://gitlab.com/gitlab-org/gitlab/-/issues/357947) and [Manifest projects outside of the Agent configuration project](https://gitlab.com/groups/gitlab-org/-/epics/7704). In order to derisk potential rework, we'll revisit the GitOps mode after these upstream changes have been settled.
+- Support both [GitOps mode](../../../user/clusters/agent/gitops/agent.md#gitops-configuration-reference) and [CI Access mode](../../../user/clusters/agent/ci_cd_workflow.md#authorize-the-agent).
### Non-Goals
@@ -41,22 +39,22 @@ This blueprint describes how the association is established and how these domain
### Overview
-- GitLab Environment and Agent-managed Resource Group have 1-to-1 relationship.
-- Agent-managed Resource Group tracks all resources produced by the connected [agent](../../../user/clusters/agent/index.md). This includes not only resources written in manifest files but also subsequently generated resources (e.g. `Pod`s created by `Deployment` manifest file).
-- Agent-managed Resource Group renders dependency graph, such as `Deployment` => `ReplicaSet` => `Pod`. This is for providing ArgoCD-style resource view.
-- Agent-managed Resource Group has the Resource Health status that represents a summary of resource statuses, such as `Healthy`, `Progressing` or `Degraded`.
+- GitLab Environment and GitLab Agent For Kubernetes have 1-to-1 relationship.
+- GitLab Environment tracks all resources produced by the connected [agent](../../../user/clusters/agent/index.md). This includes not only resources written in manifest files but also subsequently generated resources (for example, `Pod`s created by `Deployment` manifest file).
+- GitLab Environment renders dependency graph, such as `Deployment` => `ReplicaSet` => `Pod`. This is for providing ArgoCD-style resource view.
+- GitLab Environment has the Resource Health status that represents a summary of resource statuses, such as `Healthy`, `Progressing` or `Degraded`.
```mermaid
flowchart LR
subgraph Kubernetes["Kubernetes"]
- subgraph ResourceGroupProduction["ResourceGroup"]
+ subgraph ResourceGroupProduction["Production"]
direction LR
ResourceGroupProductionService(["Service"])
ResourceGroupProductionDeployment(["Deployment"])
ResourceGroupProductionPod1(["Pod1"])
ResourceGroupProductionPod2(["Pod2"])
end
- subgraph ResourceGroupStaging["ResourceGroup"]
+ subgraph ResourceGroupStaging["Staging"]
direction LR
ResourceGroupStagingService(["Service"])
ResourceGroupStagingDeployment(["Deployment"])
@@ -88,28 +86,20 @@ flowchart LR
- [GitLab Project](../../../user/project/working_with_projects.md) and GitLab Environment have 1-to-many relationship.
- GitLab Project and Agent have 1-to-many _direct_ relationship. Only one project can own a specific agent.
-- [GitOps mode](../../../user/clusters/agent/gitops.md#gitops-configuration-reference)
+- [GitOps mode](../../../user/clusters/agent/gitops/agent.md#gitops-configuration-reference)
- GitLab Project and Agent do _NOT_ have many-to-many _indirect_ relationship yet. This will be supported in [Manifest projects outside of the Agent configuration project](https://gitlab.com/groups/gitlab-org/-/epics/7704).
- - Agent and Agent-managed Resource Group have 1-to-1 relationship. Inventory IDs are used to group Kubernetes resources. This might be changed in [Flux switching](https://gitlab.com/gitlab-org/gitlab/-/issues/357947).
- [CI Access mode](../../../user/clusters/agent/ci_cd_workflow.md#authorize-the-agent)
- GitLab Project and Agent have many-to-many _indirect_ relationship. The project owning the agent can [share the access with the other proejcts](../../../user/clusters/agent/ci_cd_workflow.md#authorize-the-agent-to-access-projects-in-your-groups). (NOTE: Technically, only running jobs inside the project are allowed to access the cluster due to job-token authentication.)
- - Agent and Agent-managed Resource Group do _NOT_ have relationships yet.
### Issues
-- Agent-managed Resource Group should have environment ID as the foreign key, which must be unique across resource groups.
-- Agent-managed Resource Group should have parameters how to group resources in the associated cluster, for example, `namespace`, `lable` and `inventory-id` (GitOps mode only) can passed as parameters.
-- Agent-managed Resource Group should be able to fetch all relevant resources, including both default resource kinds and other [Custom Resources](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/).
-- Agent-managed Resource Group should be aware of dependency graph.
-- Agent-managed Resource Group should be able to compute Resource Health status from the associated resources.
+- GitLab Environment should have ID of GitLab Agent For Kubernetes as the foreign key.
+- GitLab Environment should have parameters how to group resources in the associated cluster, for example, `namespace`, `lable` and `inventory-id` (GitOps mode only) can passed as parameters.
+- GitLab Environment should be able to fetch all relevant resources, including both default resource kinds and other [Custom Resources](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/).
+- GitLab Environment should be aware of dependency graph.
+- GitLab Environment should be able to compute Resource Health status from the associated resources.
-### Example: Pull-based deployment (GitOps mode)
-
-NOTE:
-At the moment, we focus on the solution for CI Access mode. GitOps mode will have significant architectural changes _outside of_ this blueprint,
-such as [Flux switching](https://gitlab.com/gitlab-org/gitlab/-/issues/357947) and [Manifest projects outside of the Agent configuration project](https://gitlab.com/groups/gitlab-org/-/epics/7704). In order to derisk potential rework, we'll revisit the GitOps mode after these upstream changes have been settled.
-
-### Example: Push-based deployment (CI access mode)
+### Example
This is an example of how the architecture works in push-based deployment.
The feature is documented [here](../../../user/clusters/agent/ci_cd_workflow.md) as CI access mode.
@@ -117,21 +107,21 @@ The feature is documented [here](../../../user/clusters/agent/ci_cd_workflow.md)
```mermaid
flowchart LR
subgraph ProductionKubernetes["Production Kubernetes"]
- subgraph ResourceGroupProductionFrontend["ResourceGroup"]
+ subgraph ResourceGroupProductionFrontend["Production"]
direction LR
ResourceGroupProductionFrontendService(["Service"])
ResourceGroupProductionFrontendDeployment(["Deployment"])
ResourceGroupProductionFrontendPod1(["Pod1"])
ResourceGroupProductionFrontendPod2(["Pod2"])
end
- subgraph ResourceGroupProductionBackend["ResourceGroup"]
+ subgraph ResourceGroupProductionBackend["Staging"]
direction LR
ResourceGroupProductionBackendService(["Service"])
ResourceGroupProductionBackendDeployment(["Deployment"])
ResourceGroupProductionBackendPod1(["Pod1"])
ResourceGroupProductionBackendPod2(["Pod2"])
end
- subgraph ResourceGroupProductionPrometheus["ResourceGroup"]
+ subgraph ResourceGroupProductionPrometheus["Monitoring"]
direction LR
ResourceGroupProductionPrometheusService(["Service"])
ResourceGroupProductionPrometheusDeployment(["Deployment"])
@@ -202,21 +192,21 @@ The microservice project setup can be improved by [Multi-Project Deployment Pipe
```mermaid
flowchart LR
subgraph ProductionKubernetes["Production Kubernetes"]
- subgraph ResourceGroupProductionFrontend["ResourceGroup"]
+ subgraph ResourceGroupProductionFrontend["Frontend"]
direction LR
ResourceGroupProductionFrontendService(["Service"])
ResourceGroupProductionFrontendDeployment(["Deployment"])
ResourceGroupProductionFrontendPod1(["Pod1"])
ResourceGroupProductionFrontendPod2(["Pod2"])
end
- subgraph ResourceGroupProductionBackend["ResourceGroup"]
+ subgraph ResourceGroupProductionBackend["Backend"]
direction LR
ResourceGroupProductionBackendService(["Service"])
ResourceGroupProductionBackendDeployment(["Deployment"])
ResourceGroupProductionBackendPod1(["Pod1"])
ResourceGroupProductionBackendPod2(["Pod2"])
end
- subgraph ResourceGroupProductionPrometheus["ResourceGroup"]
+ subgraph ResourceGroupProductionPrometheus["Monitoring"]
direction LR
ResourceGroupProductionPrometheusService(["Service"])
ResourceGroupProductionPrometheusDeployment(["Deployment"])
@@ -266,104 +256,18 @@ flowchart LR
DeploymentPipelines -- "Deploy" --> ResourceGroupProductionBackend
```
-#### View all Agent-managed Resource Groups on production environment
-
-At the group-level, we can accumulate all environments match a specific tier, for example,
-listing all environments with `production` tier from subsequent projects.
-This is useful to see the entire Agent-managed Resource Groups on production environment.
-The following diagram examplifies the relationship between GitLab group and Kubernetes resources:
-
-```mermaid
-flowchart LR
- subgraph Kubernetes["Kubernetes"]
- subgraph ResourceGroupProduction["ResourceGroup"]
- direction LR
- ResourceGroupProductionService(["Service"])
- ResourceGroupProductionDeployment(["Deployment"])
- ResourceGroupProductionPod1(["Pod1"])
- ResourceGroupProductionPod2(["Pod2"])
- end
- subgraph ResourceGroupStaging["ResourceGroup"]
- direction LR
- ResourceGroupStagingService(["Service"])
- ResourceGroupStagingDeployment(["Deployment"])
- ResourceGroupStagingPod1(["Pod1"])
- ResourceGroupStagingPod2(["Pod2"])
- end
- end
-
- subgraph GitLab
- subgraph Organization
- OrganizationProduction["All resources on production"]
- subgraph Frontend project
- FrontendEnvironmentProduction["production environment"]
- end
- subgraph Backend project
- BackendEnvironmentProduction["production environment"]
- end
- end
- end
-
- FrontendEnvironmentProduction --- ResourceGroupProduction
- BackendEnvironmentProduction --- ResourceGroupStaging
- ResourceGroupProductionService -.- ResourceGroupProductionDeployment
- ResourceGroupProductionDeployment -.- ResourceGroupProductionPod1
- ResourceGroupProductionDeployment -.- ResourceGroupProductionPod2
- ResourceGroupStagingService -.- ResourceGroupStagingDeployment
- ResourceGroupStagingDeployment -.- ResourceGroupStagingPod1
- ResourceGroupStagingDeployment -.- ResourceGroupStagingPod2
- OrganizationProduction --- FrontendEnvironmentProduction
- OrganizationProduction --- BackendEnvironmentProduction
-```
-
-A few notes:
-
-- In the future, we'd have more granular filters for resource search.
- For example, there are two environments `production/us-region` and `production/eu-region` in each project
- and show only resources in US region at the group-level.
- This could be achivable by query filtering in PostgreSQL or label/namespace filtering in Kubernetes.
-- Please see [Add dynamically populated organization-level environments page](https://gitlab.com/gitlab-org/gitlab/-/issues/241506) for more information.
-
## Design and implementation details
-NOTE:
-The following solution might be only applicable for CI Access mode. GitOps mode will have significant architectural changes _outside of_ this blueprint,
-such as [Flux switching](https://gitlab.com/gitlab-org/gitlab/-/issues/357947) and [Manifest projects outside of the Agent configuration project](https://gitlab.com/groups/gitlab-org/-/epics/7704). In order to derisk potential rework, we'll revisit the GitOps mode after these upstream changes have been settled.
-
### Associate Environment with Agent
-As a preliminary step, we allow users to explicitly define "which deployment job" uses "which agent" and deploy to "which namespace". The following keywords are supported in `.gitlab-ci.yml`.
-
-- `environment:kubernetes:agent` ... Define which agent the deployment job uses. It can select the appropriate context from the `KUBE_CONFIG`.
-- `environment:kubernetes:namespace` ... Define which namespace the deployment job deploys to. It injects `KUBE_NAMESPACE` predefined variable into the job. This keyword already [exists](../../../ci/yaml/index.md#environmentkubernetes).
-
-Here is an example of `.gitlab-ci.yml`.
-
-```yaml
-deploy-production:
- environment:
- name: production
- kubernetes:
- agent: path/to/agent/repository:agent-name
- namespace: default
- script:
- - helm --context="$KUBE_CONTEXT" --namespace="$KUBE_NAMESPACE" upgrade --install
-```
-
-When a deployment job is created, GitLab persists the relationship of specified agent, namespace and deployment job. If the CI job is NOT authorized to access the agent (Please refer [`Clusters::Agents::FilterAuthorizationsService`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/services/clusters/agents/filter_authorizations_service.rb) for more details), this relationship aren't recorded. This process happens in [`Deployments::CreateForBuildService`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/services/deployments/create_for_build_service.rb). The database table scheme is:
-
-```plaintext
-agent_deployments:
- - deployment_id (bigint/FK/NOT NULL/Unique)
- - agent_id (bigint/FK/NOT NULL)
- - kubernetes_namespace (character varying(255)/NOT NULL)
-```
+Users can explicitly set a GitLab Agent For Kubernetes to a GitLab Environment in setting UI.
+Frontend will use this associated agent for authenticating/authorizing the user access, which is described in a latter section.
-To idenfity an associated agent for a specific environment, `environment.last_deployment.agent` can be used in Rails.
+We need to adjust the `read_cluster_agent` permission in DeclarivePolicy for supporting agents shared by an external project (also known as the Agent management project).
### Fetch resources through `user_access`
-When user visits an environment page, GitLab frontend fetches an environment via GraphQL. Frontend additionally fetches the associated agent-ID and namespace through deployment relationship, which being tracked by the `agent_deployments` table.
+When user visits an environment page, GitLab frontend fetches an environment via GraphQL. Frontend additionally fetches the associated agent-ID and namespace.
Here is an example of GraphQL query:
@@ -373,12 +277,12 @@ Here is an example of GraphQL query:
id
environment(name: "<environment-name>") {
slug
- lastDeployment(status: SUCCESS) {
- agent {
- id
+ kubernetesNamespace
+ clusterAgent {
+ id
+ name
+ project {
name
- project
- kubernetesNamespace
}
}
}
@@ -388,20 +292,17 @@ Here is an example of GraphQL query:
GitLab frontend authenticate/authorize the user access with [browser cookie](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/doc/kubernetes_user_access.md#browser-cookie-on-gitlab-frontend). If the access is forbidden, frontend shows an error message that `You don't have access to an agent that deployed to this environment. Please contact agent administrator if you are allowed in "user_access" in agent config file. See <troubleshooting-doc-link>`.
-After the user gained access to the agent, GitLab frontend fetches available API Resource list in the Kubernetes and fetches the resources with the following parameters:
+After the user gained access to the agent, GitLab frontend fetches specific Resource kinds (for example, `Deployment`, `Pod`) in the Kubernetes with the following parameters:
-- `namespace` ... `#{environment.lastDeployment.agent.kubernetesNamespace}`
-- `labels`
- - `app.gitlab.com/project_id=#{project.id}` _AND_
- - `app.gitlab.com/environment_slug: #{environment.slug}`
+- `namespace` ... `#{environment.kubernetesNamespace}`
If no resources are found, this is likely that the users have not embedded these lables into their resources. In this case, frontend shows an warning message `There are no resources found for the environment. Do resources have GitLab preserved labels? See <troubleshooting-doc-link>`.
### Dependency graph
- GitLab frontend uses [Owner References](https://kubernetes.io/docs/concepts/overview/working-with-objects/owners-dependents/) to idenfity the dependencies between resources. These are embedded in resources as `metadata.ownerReferences` field.
-- For the resoruces that don't have owner references, we can use [Well-Known Labels, Annotations and Taints](https://kubernetes.io/docs/reference/labels-annotations-taints/) as complement. e.g. `EndpointSlice` doesn't have `metadata.ownerReferences`, but has `kubernetes.io/service-name` as a reference to the parent `Service` resource.
+- For the resoruces that don't have owner references, we can use [Well-Known Labels, Annotations and Taints](https://kubernetes.io/docs/reference/labels-annotations-taints/) as complement. for example, `EndpointSlice` doesn't have `metadata.ownerReferences`, but has `kubernetes.io/service-name` as a reference to the parent `Service` resource.
### Health status of resources
-- GitLab frontend computes the status summary from the fetched resources. Something similar to ArgoCD's [Resource Health](https://argo-cd.readthedocs.io/en/stable/operator-manual/health/) e.g. `Healthy`, `Progressing`, `Degraded` and `Suspended`. The formula is TBD.
+- GitLab frontend computes the status summary from the fetched resources. Something similar to ArgoCD's [Resource Health](https://argo-cd.readthedocs.io/en/stable/operator-manual/health/) for example, `Healthy`, `Progressing`, `Degraded` and `Suspended`. The formula is TBD.
diff --git a/doc/architecture/blueprints/gitlab_ci_events/index.md b/doc/architecture/blueprints/gitlab_ci_events/index.md
index 7ce8fea9410..fb78c0f5d9d 100644
--- a/doc/architecture/blueprints/gitlab_ci_events/index.md
+++ b/doc/architecture/blueprints/gitlab_ci_events/index.md
@@ -2,6 +2,7 @@
status: proposed
creation-date: "2023-03-15"
authors: [ "@furkanayhan" ]
+owners: [ "@furkanayhan" ]
coach: "@grzesiek"
approvers: [ "@jreporter", "@cheryl.li" ]
owning-stage: "~devops::verify"
@@ -45,7 +46,7 @@ Events" blueprint is about making it possible to:
## Proposals
-For now, we have technical 4 proposals;
+For now, we have technical 5 proposals;
1. [Proposal 1: Using the `.gitlab-ci.yml` file](proposal-1-using-the-gitlab-ci-file.md)
Based on;
@@ -55,9 +56,7 @@ For now, we have technical 4 proposals;
Highly inefficient way.
1. [Proposal 3: Using the `.gitlab/ci/events` folder](proposal-3-using-the-gitlab-ci-events-folder.md)
Involves file reading for every event.
-1. [Proposal 4: Creating events via CI files](proposal-4-creating-events-via-ci-files.md)
- Combination of some proposals.
-
-Each of them has its pros and cons. There could be many more proposals and we
-would like to discuss them all. We can combine the best part of those proposals
-and create a new one.
+1. [Proposal 4: Creating events via a CI config file](proposal-4-creating-events-via-ci-files.md)
+ Separate configuration files for defininig events.
+1. [Proposal 5: Combined proposal](proposal-5-combined-proposal.md)
+ Combination of all of the proposals listed above.
diff --git a/doc/architecture/blueprints/gitlab_ci_events/proposal-1-using-the-gitlab-ci-file.md b/doc/architecture/blueprints/gitlab_ci_events/proposal-1-using-the-gitlab-ci-file.md
index 7dfc3873ada..f4cde963224 100644
--- a/doc/architecture/blueprints/gitlab_ci_events/proposal-1-using-the-gitlab-ci-file.md
+++ b/doc/architecture/blueprints/gitlab_ci_events/proposal-1-using-the-gitlab-ci-file.md
@@ -12,7 +12,7 @@ Currently, we have two proof-of-concept (POC) implementations:
They both have similar ideas;
-1. Find a new CI Config syntax to define the pipeline events.
+1. Find a new CI Config syntax to define pipeline events.
Example 1:
@@ -42,19 +42,13 @@ They both have similar ideas;
script: echo "Hello World"
```
-1. Upsert an event to the database when creating a pipeline.
-1. Create [EventStore subscriptions](../../../development/event_store.md) to handle the events.
+1. Upsert a workflow definition to the database when new configuration gets
+ pushed.
+1. Match subscriptions and publishers whenever something happens at GitLab.
-## Problems & Questions
+## Discussion
-1. The CI config of a project can be anything;
- - `.gitlab-ci.yml` by default
- - another file in the project
- - another file in another project
- - completely a remote/external file
-
- How do we handle these cases?
-1. Since we have these problems above, should we keep the events in its own file? (`.gitlab-ci-events.yml`)
-1. Do we only accept the changes in the main branch?
-1. We try to create event subscriptions every time a pipeline is created.
-1. Can we move the existing workflows into the new CI events, for example, `merge_request_event`?
+1. How to efficiently detect changes to the subscriptions?
+1. How do we handle differences between workflows / events / subscriptions on
+ different branches?
+1. Do we need to upsert subscriptions on every push?
diff --git a/doc/architecture/blueprints/gitlab_ci_events/proposal-2-using-the-rules-keyword.md b/doc/architecture/blueprints/gitlab_ci_events/proposal-2-using-the-rules-keyword.md
index 6f69a0f11f0..1f59a8ccf20 100644
--- a/doc/architecture/blueprints/gitlab_ci_events/proposal-2-using-the-rules-keyword.md
+++ b/doc/architecture/blueprints/gitlab_ci_events/proposal-2-using-the-rules-keyword.md
@@ -23,16 +23,13 @@ test_package_removed:
- events: ["package/removed"]
```
-1. We don't upsert anything to the database.
-1. We'll have a single worker which subcribes to events
-like `store.subscribe ::Ci::CreatePipelineFromEventWorker, to: ::Issues::CreatedEvent`.
-1. The worker just runs `Ci::CreatePipelineService` with the correct parameters, the rest
-will be handled by the `rules` system. Of course, we'll need modifications to the `rules` system to support `events`.
-
-## Problems & Questions
-
-1. For every defined event run, we need to enqueue a new `Ci::CreatePipelineFromEventWorker` job.
-1. The worker will need to run `Ci::CreatePipelineService` for every event run.
-This may be costly because we go through every cycle of `Ci::CreatePipelineService`.
-1. This would be highly inefficient.
-1. Can we move the existing workflows into the new CI events, for example, `merge_request_event`?
+1. We don't upsert subscriptions to the database.
+1. We'll have a single worker which runs when something happens in GitLab.
+1. The worker just tries to create a pipeline with the correct parameters.
+1. Pipeline runs when `rules` subsystem finds a job to run.
+
+## Challenges
+
+1. For every defined event run, we need to enqueue a new pipeline creation worker.
+1. Creating pipelines and selecting builds to run is a relatively expensive operation
+1. This will not work on GitLab.com scale.
diff --git a/doc/architecture/blueprints/gitlab_ci_events/proposal-3-using-the-gitlab-ci-events-folder.md b/doc/architecture/blueprints/gitlab_ci_events/proposal-3-using-the-gitlab-ci-events-folder.md
index ad76b7f8dd4..8a8efe2be08 100644
--- a/doc/architecture/blueprints/gitlab_ci_events/proposal-3-using-the-gitlab-ci-events-folder.md
+++ b/doc/architecture/blueprints/gitlab_ci_events/proposal-3-using-the-gitlab-ci-events-folder.md
@@ -5,11 +5,8 @@ description: 'GitLab CI Events Proposal 3: Using the .gitlab/ci/events folder'
# GitLab CI Events Proposal 3: Using the `.gitlab/ci/events` folder
-We can also approach this problem by creating separate files for events.
-
-Let's say we'll have the `.gitlab/ci/events` folder (or `.gitlab/workflows/ci`).
-
-We can define events in the following format:
+In this proposal we want to create separate files for each group of events. We
+can define events in the following format:
```yaml
# .gitlab/ci/events/package-published.yml
@@ -17,9 +14,7 @@ We can define events in the following format:
spec:
events:
- name: package/published
-
---
-
include:
- local: .gitlab-ci.yml
with:
@@ -35,9 +30,7 @@ spec:
inputs:
event:
default: push
-
---
-
job1:
script: echo "Hello World"
@@ -61,4 +54,4 @@ When an event happens;
1. For every defined event run, we need to enqueue a new job.
1. Every event-job will need to search for files.
1. This would be only for the project-scope events.
-1. This can be inefficient because of searching for files for the project for every event.
+1. This will not work for GitLab.com scale.
diff --git a/doc/architecture/blueprints/gitlab_ci_events/proposal-4-creating-events-via-ci-files.md b/doc/architecture/blueprints/gitlab_ci_events/proposal-4-creating-events-via-ci-files.md
index 5f10ba1fbb2..debca82d148 100644
--- a/doc/architecture/blueprints/gitlab_ci_events/proposal-4-creating-events-via-ci-files.md
+++ b/doc/architecture/blueprints/gitlab_ci_events/proposal-4-creating-events-via-ci-files.md
@@ -1,12 +1,13 @@
---
owning-stage: "~devops::verify"
-description: 'GitLab CI Events Proposal 4: Creating events via CI files'
+description: 'GitLab CI Events Proposal 4: Defining subscriptions in a dedicated configuration file'
---
-# GitLab CI Events Proposal 4: Creating events via CI files
+# GitLab CI Events Proposal 4: Defining subscriptions in a dedicated configuration file
-Each project can have its own event configuration file. Let's call it `.gitlab-ci-event.yml` for now.
-In this file, we can define events in the following format:
+Each project can have its own configuration file for defining subscriptions to
+events. For example, `.gitlab-ci-event.yml`. In this file, we can define events
+in the following format:
```yaml
events:
@@ -14,12 +15,13 @@ events:
- issue/created
```
-When this file is changed in the project repository, it is parsed and the events are created, updated, or deleted.
-This is highly similar to [Proposal 1](proposal-1-using-the-gitlab-ci-file.md) except that we don't need to
-track pipeline creations every time.
+When this file is changed in the project repository, it is parsed and the
+events are created, updated, or deleted. This is highly similar to
+[Proposal 1](proposal-1-using-the-gitlab-ci-file.md) except that we don't need
+to track pipeline creations every time.
-1. Upsert events to the database when `.gitlab-ci-event.yml` is updated.
-1. Create [EventStore subscriptions](../../../development/event_store.md) to handle the events.
+1. Upsert events to the database when `.gitlab-ci-event.yml` gets updated.
+1. Create inline reactions to events in code to trigger pipelines.
## Filtering jobs
@@ -51,7 +53,7 @@ test_package_removed:
- if: $CI_EVENT == "package/removed"
```
-or an input like in the [Proposal 3](proposal-3-using-the-gitlab-ci-events-folder.md);
+or an input like in the [Proposal 3](proposal-3-using-the-gitlab-ci-events-folder.md):
```yaml
spec:
@@ -71,3 +73,7 @@ test_package_removed:
rules:
- if: $[[ inputs.event ]] == "package/removed"
```
+
+## Challenges
+
+1. This will not work on GitLab.com scale.
diff --git a/doc/architecture/blueprints/gitlab_ci_events/proposal-5-combined-proposal.md b/doc/architecture/blueprints/gitlab_ci_events/proposal-5-combined-proposal.md
new file mode 100644
index 00000000000..3a596b21526
--- /dev/null
+++ b/doc/architecture/blueprints/gitlab_ci_events/proposal-5-combined-proposal.md
@@ -0,0 +1,99 @@
+---
+owning-stage: "~devops::verify"
+description: 'GitLab CI Events Proposal 5: Combined proposal'
+---
+
+# GitLab CI Events Proposal 5: Combined proposal
+
+In this proposal we have separate files for cohesive groups of events. The
+files are being included into the main `.gitlab-ci.yml` configuration file.
+
+```yaml
+# my/events/packages.yaml
+
+spec:
+ events:
+ - events/package/published
+ - events/audit/package/*
+ inputs:
+ env:
+---
+do_something:
+ script: ./run_for $[[ event.name ]] --env $[[ inputs.env ]]
+ rules:
+ - if: $[[ event.payload.package.name ]] == "my_package"
+```
+
+In the `.gitlab-ci.yml` file, we can enable the subscription:
+
+```yaml
+# .gitlab-ci.yml
+
+include:
+ - local: my/events/packages.yaml
+ inputs:
+ env: test
+
+```
+
+GitLab will detect changes in the included files, and parse their specs. All
+the information required to define a subscription will be encapsulated in the
+spec, hence we will not need to read a whole file. We can easily read `spec`
+header and calculate its checksum what can become a workflow identifier.
+
+Once we see a new identifier, we can redefine subscriptions for a particular
+project and then to upsert them into the database.
+
+We will use an efficient GIN index matching technique to match publishers with
+the subscribers to run pipelines.
+
+The syntax is also compatible with CI Components, and make it easier to define
+components that will only be designed to run for events happening inside
+GitLab.
+
+## No entrypoint file variant
+
+Another variant of this proposal is to move away from the single GitLab CI YAML
+configuration file. In such case we would define another search **directory**,
+like `.gitlab/workflows/` where we would store all YAML files.
+
+We wouldn't need to `include` workflow / events files anywhere, because these
+would be found by GitLab automatically. In order to implement this feature this
+way we would need to extend features like "custom location for `.gitlab-ci.yml`
+file".
+
+Example, without using a main configuration file (the GitLab CI YAML file would
+be still supported):
+
+```yaml
+# .gitlab/workflows/push.yml
+
+spec:
+ events:
+ - events/repository/push
+---
+rspec-on-push:
+ script: bundle exec rspec
+```
+
+```yaml
+# .gitlab/workflows/merge_requests.yml
+
+spec:
+ events:
+ - events/merge_request/push
+---
+rspec-on-mr-push:
+ script: bundle exec rspec
+```
+
+```yaml
+# .gitlab/workflows/schedules.yml
+
+spec:
+ events:
+ - events/pipeline/schedule/run
+---
+smoke-test:
+ script: bundle exec rspec --smoke
+```
diff --git a/doc/architecture/blueprints/gitlab_observability_backend/index.md b/doc/architecture/blueprints/gitlab_observability_backend/index.md
new file mode 100644
index 00000000000..5b99235e18c
--- /dev/null
+++ b/doc/architecture/blueprints/gitlab_observability_backend/index.md
@@ -0,0 +1,693 @@
+---
+status: proposed
+creation-date: "2022-11-09"
+authors: [ "@ankitbhatnagar" ]
+coach: "@mappelman"
+approvers: [ "@sebastienpahl", "@nicholasklick" ]
+owning-stage: "~monitor::observability"
+participating-stages: []
+---
+
+<!-- vale gitlab.FutureTense = NO -->
+
+# GitLab Observability Backend - Metrics
+
+## Summary
+
+Developing a multi-user system to store & query observability data typically formatted in widely accepted, industry-standard formats using Clickhouse as underlying storage, with support for long-term data retention and aggregation.
+
+## Motivation
+
+From the six pillars of Observability, commonly abbreviated as `TEMPLE` - Traces, Events, Metrics, Profiles, Logs & Errors, Metrics constitute one of the most important pillars of observability data for modern day systems, helping their users gather insights about their operational posture.
+
+Metrics which are commonly structured as timeseries data have the following characteristics:
+
+- indexed by their corresponding timestamps;
+- continuously expanding in size;
+- usually aggregated, down-sampled, and queried in ranges; and
+- have very write-intensive requirements.
+
+Within GitLab Observability Backend, we aim to add the support for our customers to ingest and query observability data around their systems & applications, helping them improve the operational health of their systems.
+
+### Goals
+
+With the development of the proposed system, we have the following goals:
+
+- Scalable, low latency & cost-effective monitoring system backed by Clickhouse whose performance has been proven via repeatable benchmarks.
+
+- Support for long-term storage for Prometheus/OpenTelemetry formatted metrics, ingested via Prometheus remote_write API and queried via Prometheus remote_read API, PromQL or SQL with support for metadata and exemplars.
+
+The aforementioned goals can further be broken down into the following four sub-goals:
+
+#### Ingesting data
+
+- For the system to be capable of ingesting large volumes of writes and reads, we aim to ensure that it must be horizontally scalable & provide durability guarantees to ensure no writes are dropped once ingested.
+
+#### Persisting data
+
+- We aim to support ingesting telemetry/data sent using Prometheus `remote_write` protocol. Any persistence we design for our dataset must be multi-tenant by default, ensuring we can store observability data for multiple tenants/groups/projects within the same storage backend.
+
+- We aim to develop a test suite for data correctness, seeking inspiration from how Prometheus compliance test suite checks the correctness of a given Metrics implementation and running it as a part of our CI setup.
+
+NOTE:
+Although remote_write_sender does not test the correctness of a remote write receiver itself as is our case, it does bring some inspiration to implement/develop one within the scope of this project.
+
+- We aim to also ensure compatibility for special Prometheus data types, for example, Prometheus histogram(s), summary(s).
+
+#### Reading data
+
+- We aim to support querying data using PromQL which means translating PromQL queries into Clickhouse SQL. To do this, [PromQL](https://github.com/prometheus/prometheus/tree/main/promql/parser) or [MetricsQL](https://github.com/VictoriaMetrics/metricsql) parsers are good alternatives.
+
+- We aim to provide additional value by exposing all ingested data via the native Clickhouse SQL interface subject to the following reliability characteristics:
+ - query validation, sanitation
+ - rate limiting
+ - resource limiting - memory, cpu, network bandwidth
+
+- We aim to pass Prometheus test suits for correctness via the [Prometheus Compliance test suite](https://github.com/prometheus/compliance/tree/main/promql) with a target goal of 100% success rate.
+
+#### Deleting data
+
+- We aim to support being able to delete any ingested data should such a need arise. This is also in addition to us naturally deleting data when a configured TTL expires and/or respective retention policies are enforced. We must, within our schemas, build a way to delete data by labels OR their content, also add to our offering the necessary tooling to do so.
+
+### Non-Goals
+
+With the goals established above, we also want to establish what specific things are non-goals with the current proposal. They are:
+
+- We do not aim to support ingestion using OpenTelemetry/OpenMetrics formats with our first iteration, though our users can still use the Opentelemetry exporters(s) internally consuming the standard Prometheus `remote_write` protocol. More information [here](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/prometheusremotewriteexporter).
+
+- We do not aim to support ingesting Prometheus exemplars in our first iteration, though we do aim to account for them in our design from the beginning.
+
+NOTE:
+Worth noting that we intend to model exemplars the same way we're modeling metric-labels, so building on top of the same data structure should help implementt support for metadata/exemplars rather easily.
+
+## Proposal
+
+We intend to use GitLab Observability Backend as a framework for the Metrics implementation so that its lifecycle is also managed via already existing Kubernetes controllers for example, scheduler, tenant-operator.
+
+![Architecture](supported-deployments.png)
+
+From a development perspective, what's been marked as our "Application Server" above needs to be developed as a part of this proposal while the remaining peripheral components either already exist or can be provisioned via existing code in `scheduler`/`tenant-operator`.
+
+**On the write path**, we expect to receive incoming data via `HTTP`/`gRPC` `Ingress` similar to what we do for our existing services, for example, errortracking, tracing.
+
+NOTE:
+Additionally, since we intend to ingest data via Prometheus `remote_write` API, the received data will be Protobuf-encoded, Snappy-compressed. All received data therefore needs to be decompressed & decoded to turn it into a set of `prompb.TimeSeries` objects, which the rest of our components interact with.
+
+We also need to make sure to avoid writing a lot of small writes into Clickhouse, therefore it'd be prudent to batch data before writing it into Clickhouse.
+
+We must also make sure ingestion remains decoupled with `Storage` so as to reduce undue dependence on a given storage implementation. While we do intend to use Clickhouse as our backing storage for any foreseeable future, this ensures we do not tie ourselves in into Clickhouse too much should future business requirements warrant the usage of a different backend/technology. A good way to implement this in Go would be our implementations adhering to a standard interface, the following for example:
+
+```go
+type Storage interface {
+ Read(
+ ctx context.Context,
+ request *prompb.ReadRequest
+ ) (*prompb.ReadResponse, error)
+ Write(
+ ctx context.Context,
+ request *prompb.WriteRequest
+ ) error
+}
+```
+
+NOTE:
+We understand this couples the implementation with Prometheus data format/request types, but adding methods to the interface to support more data formats should be trivial looking forward with minimal changes to code.
+
+**On the read path**, we aim to allow our users to use the Prometheus `remote_read` API and be able to query ingested data via PromQL & SQL. Support for `remote_read` API should be trivial to implement, while supporting PromQL would need translating it into SQL. We can however employ the usage of already existing [PromQL](https://github.com/prometheus/prometheus/tree/main/promql/parser) parsing libraries.
+
+We aim to focus on implementing query validation & sanitation, rate-limiting and regulating resource-consumption to ensure underlying systems, esp. storage, remain in good operational health at all times.
+
+### Supported deployments
+
+In this first iteration of the metrics backend, we intend to support a generic deployment model that makes sure we can capture as much usage as possible and begin dogfooding the product as soon as possible. This is well illustrated in the [aforementioned architecture diagram](#proposal).
+
+In its most vanilla form, metrics support in GitLab Observability Backend can be used via the Prometheus remote read & write APIs. If a user already uses Prometheus as their monitoring abstraction, it can be configured to use this backend directly.
+
+- remote_write: [configuration](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write)
+- remote_read: [configuration](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_read)
+
+For users of the system that do not use a Prometheus instance for scraping their telemetry data, they can export their metrics via a multitude of collectors/agents such as the OpenTelemetry collector or the Prometheus Agent for example, all of which can be configured to use our remote_write endpoint. For reads however, we intend to run a Prometheus within GOB (alongside the application server) itself, then hook it up automatically with the GitLab Observability UI (GOUI) preconfigured to consume our remote_read endpoint.
+
+Notably, the ability to use a GOB-run Prometheus instance is applicable while we can only support remote_read API for running queries. Looking forward towards our next iteration, we should be able to get rid of this additional component altogether when we have full support for executing PromQL and/or SQL queries directly from GOUI.
+
+**Per-group deployments**: From a scalability perspective, we deploy an instance of Ingress, a Prometheus instance & the application server per group to make sure we can scale them subject to traffic volumes of the respective tenant. It also helps isolate resource consumption across tenants in an otherwise multi-tenant system.
+
+### Metric collection and storage
+
+It is important to separate metric collection on the client side with the storage we provision at our end.
+
+### State of the art for storage
+
+Existing long-term Prometheus compatible metrics vendors provide APIs that are compatible with Prometheus remote_write.
+
+### State of the art for Prometheus clients
+
+Metric collection clients such as Prometheus itself, Grafana Cloud Agent, Datadog Agent, etc. will scrape metrics endpoints typically from within a firewalled environment, store locally scraped metrics in a [Write Ahead Log (WAL)](https://en.wikipedia.org/wiki/Write-ahead_logging) and then batch send them to an external environment (i.e. the vendor or an internally managed system like Thanos) via the Prometheus `remote_write` protocol.
+
+- A client-side collector is an important part of the overall architecture, though it's owned by the customer/user since it needs to run in their environment. This gives the end user full control over their data because they control how it is collected and to where it is delivered.
+
+- It's **not** feasible to provide an external vendor with credentials to access and scrape endpoints within a user's firewalled environment.
+
+- It's also critically important that our `remote_write` APIs respond correctly with the appropriate rate-limiting status codes so that Prometheus Clients can respect them.
+
+[Here](https://grafana.com/blog/2021/05/26/the-future-of-prometheus-remote-write/) is a good background/history on Prometheus `remote_write` and its importance in Prometheus based observability.
+
+## Design and implementation details
+
+Following are details of how we aim to design & implement the proposed solution. To that end, a reference implementation was also developed to understand the scope of the problem and provide early data to ensure our proposal was drafted around informed decisions and/or results of our experimentation.
+
+## Reference implementation(s)
+
+- [Application server](https://gitlab.com/gitlab-org/opstrace/opstrace/-/merge_requests/1823)
+- [Metrics generator](https://gitlab.com/ankitbhatnagar/metrics-gen/-/blob/main/main.go)
+
+## Target environments
+
+Keeping inline with our current operational structure, we intend to deploy the metrics offering as a part of GitLab Observability Backend, deployed on the following two target environments:
+
+- kind cluster (for local development)
+- GKE cluster (for staging/production environments)
+
+## Schema Design
+
+### **Proposed solution**: Fully normalized tables for decreased redundancy & increased read performance
+
+### primary, denormalized data table
+
+```sql
+CREATE TABLE IF NOT EXISTS samples ON CLUSTER '{cluster}' (
+ series_id UUID,
+ timestamp DateTime64(3, 'UTC') CODEC(Delta(4), ZSTD),
+ value Float64 CODEC(Gorilla, ZSTD)
+) ENGINE = ReplicatedMergeTree()
+PARTITION BY toYYYYMMDD(timestamp)
+ORDER BY (series_id, timestamp)
+```
+
+### metadata table to support timeseries metadata/exemplars
+
+```sql
+CREATE TABLE IF NOT EXISTS samples_metadata ON CLUSTER '{cluster}' (
+ series_id UUID,
+ timestamp DateTime64(3, 'UTC') CODEC(Delta(4), ZSTD),
+ metadata Map(String, String) CODEC(ZSTD),
+) ENGINE = ReplicatedMergeTree()
+PARTITION BY toYYYYMMDD(timestamp)
+ORDER BY (series_id, timestamp)
+```
+
+### lookup table(s)
+
+```sql
+CREATE TABLE IF NOT EXISTS labels_to_series ON CLUSTER '{cluster}' (
+ labels Map(String, String) CODEC(ZSTD)
+ series_id UUID
+) engine=ReplicatedMergeTree
+PRIMARY KEY (labels, series_id)
+```
+
+```sql
+CREATE TABLE IF NOT EXISTS group_to_series ON CLUSTER '{cluster}'' (
+ group_id Uint64,
+ series_id UUID,
+) ORDER BY (group_id, series_id)
+```
+
+### Refinements
+
+- sharding considerations for a given tenant when ingesting/persisting data if we intend to co-locate data specific to multiple tenants within the same database tables. To simplify things, segregating tenant-specific data to their own dedicated set of tables would make a lot of sense.
+
+- structural considerations for "timestamps" when ingesting data across tenants.
+
+- creation_time vs ingestion_time
+
+- No support for transactions in the native client yet, to be able to effectively manage writes across multiple tables.
+
+NOTE:
+Slightly non-trivial but we can potentially investigate the possibility of using ClickHouse/ch-go directly, it supposedly promises a better performance profile too.
+
+### Pros - multiple tables
+
+- Normalised data structuring allows for efficient storage of data, removing any redundancy across multiple samples for a given timeseries. Evidently, for the "samples" schema, we expect to store 32 bytes of data per metric point.
+
+- Better search complexity when filtering timeseries by labels/metadata, via the use of better indexed columns.
+
+- All data is identifiable via a unique identifier, which can be used to maintain data consistency across tables.
+
+### Cons - multiple tables
+
+- Writes are trivially expensive considering writes across multiple tables.
+
+- Writes across tables also need to be implemented as a transaction to guarantee consistency when ingesting data.
+
+### Operational characteristics - multiple tables
+
+### Storage - multiple tables
+
+A major portion of our writes are made into the `samples` schema which contains a tuple containing three data points per metric point written:
+
+| Column | Data type | Byte size |
+|:------------|:-----------|:----------|
+| `series_id` | UUID | 16 bytes |
+| `timestamp` | DateTime64 | 8 bytes |
+| `value` | Float64 | 8 bytes |
+
+Therefore, we estimate to use 32 bytes per sample ingested.
+
+### Compression - multiple tables
+
+Inspecting the amount of compression we're able to get with the given design on our major schemas, we see it as a good starting point. Following measurements for both primary tables:
+
+**Schema**: `labels_to_series` containing close to 12k unique `series_id`, each mapping to a set of 10-12 label string pairs
+
+```sql
+SELECT
+ table,
+ column,
+ formatReadableSize(sum(data_compressed_bytes) AS x) AS compressedsize,
+ formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed
+FROM system.parts_columns
+WHERE table LIKE 'labels_to_series_1'
+GROUP BY
+ database,
+ table,
+ column
+ORDER BY x ASC
+
+Query id: 723b4145-14f7-4e74-9ada-01c17c2f1fd5
+
+┌─table──────────────┬─column────┬─compressedsize─┬─uncompressed─â”
+│ labels_to_series_1 │ labels │ 586.66 KiB │ 2.42 MiB │
+│ labels_to_series_1 │ series_id │ 586.66 KiB │ 2.42 MiB │
+└────────────────────┴───────────┴────────────────┴──────────────┘
+```
+
+**Schema**: `samples` containing about 20k metric samples each containing a tuple comprising `series_id` (16 bytes), `timestamp` (8 bytes) and `value` (8 bytes).
+
+```sql
+SELECT
+ table,
+ column,
+ formatReadableSize(sum(data_compressed_bytes) AS x) AS compressedsize,
+ formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed
+FROM system.parts_columns
+WHERE table LIKE 'samples_1'
+GROUP BY
+ database,
+ table,
+ column
+ORDER BY x ASC
+
+Query id: 04219cea-06ea-4c5f-9287-23cb23c023d2
+
+┌─table─────┬─column────┬─compressedsize─┬─uncompressed─â”
+│ samples_1 │ value │ 373.21 KiB │ 709.78 KiB │
+│ samples_1 │ timestamp │ 373.21 KiB │ 709.78 KiB │
+│ samples_1 │ series_id │ 373.21 KiB │ 709.78 KiB │
+└───────────┴───────────┴────────────────┴──────────────┘
+```
+
+### Performance - multiple tables
+
+From profiling our reference implementation, it can also be noted that most of our time right now is spent in the application writing data to Clickhouse and/or its related operations. A "top" pprof profile sampled from the implementation looked like:
+
+```shell
+(pprof) top
+Showing nodes accounting for 42253.20kB, 100% of 42253.20kB total
+Showing top 10 nodes out of 58
+ flat flat% sum% cum cum%
+13630.30kB 32.26% 32.26% 13630.30kB 32.26% github.com/ClickHouse/clickhouse-go/v2/lib/compress.NewWriter (inline)
+11880.92kB 28.12% 60.38% 11880.92kB 28.12% github.com/ClickHouse/clickhouse-go/v2/lib/compress.NewReader (inline)
+ 5921.37kB 14.01% 74.39% 5921.37kB 14.01% bufio.NewReaderSize (inline)
+ 5921.37kB 14.01% 88.41% 5921.37kB 14.01% bufio.NewWriterSize (inline)
+ 1537.69kB 3.64% 92.04% 1537.69kB 3.64% runtime.allocm
+ 1040.73kB 2.46% 94.51% 1040.73kB 2.46% github.com/aws/aws-sdk-go/aws/endpoints.init
+ 1024.41kB 2.42% 96.93% 1024.41kB 2.42% runtime.malg
+ 768.26kB 1.82% 98.75% 768.26kB 1.82% go.uber.org/zap/zapcore.newCounters
+ 528.17kB 1.25% 100% 528.17kB 1.25% regexp.(*bitState).reset
+ 0 0% 100% 5927.73kB 14.03% github.com/ClickHouse/clickhouse-go/v2.(*clickhouse).Ping
+```
+
+As is evident above from our preliminary analysis, writing data into Clickhouse can be a potential bottleneck. Therefore, on the write path, it'd be prudent to batch our writes into Clickhouse so as to reduce the amount of work the application server ends up doing making the ingestion path more efficient.
+
+On the read path, it's also possible to parallelize reads for the samples table either by `series_id` OR by blocks of time between the queried start and end timestamps.
+
+### Caveats
+
+- When dropping labels from already existing metrics, we treat their new counterparts as completely new series and hence attribute them to a new `series_id`. This avoids having to merge series data and/or values. The old series, if not actively written into, should eventually fall off their retention and get deleted.
+
+- We have not yet accounted for any data aggregation. Our assumption is that the backing store (in Clickhouse) should allow us to keep a "sufficient" amount of data in its raw form and that we should be able to query against it within our query latency SLOs.
+
+### **Rejected alternative**: Single, centralized table
+
+### single, centralized data table
+
+```sql
+CREATE TABLE IF NOT EXISTS metrics ON CLUSTER '{cluster}' (
+ group_id UInt64,
+ name LowCardinality(String) CODEC(ZSTD),
+ labels Map(String, String) CODEC(ZSTD),
+ metadata Map(String, String) CODEC(ZSTD),
+ value Float64 CODEC (Gorilla, ZSTD),
+ timestamp DateTime64(3, 'UTC') CODEC(Delta(4),ZSTD)
+) ENGINE = ReplicatedMergeTree()
+PARTITION BY toYYYYMMDD(timestamp)
+ORDER BY (group_id, name, timestamp);
+```
+
+### Pros - single table
+
+- Single source of truth, so all metrics data lives in one big table.
+
+- Querying data is easier to express in terms of writing SQL queries without having to query data across multiple tables.
+
+### Cons - single table
+
+- Huge redundancy built into the data structure since attributes such as name, labels, metadata are stored repeatedly for each sample collected.
+
+- Non-trivial complexity to search timeseries with values for labels/metadata given how they're stored when backed by Maps/Arrays.
+
+- High query latencies by virtue of having to scan large amounts of data per query made.
+
+### Operational Characteristics - single table
+
+### Storage - single table
+
+| Column | Data type | Byte size |
+|:------------|:--------------------|:----------|
+| `group_id` | UUID | 16 bytes |
+| `name` | String | - |
+| `labels` | Map(String, String) | - |
+| `metadata` | Map(String, String) | - |
+| `value` | Float64 | 8 bytes |
+| `timestamp` | DateTime64 | 8 bytes |
+
+NOTE:
+Strings are of an arbitrary length, the length is not limited. Their value can contain an arbitrary set of bytes, including null bytes. We will need to regulate what we write into these columns application side.
+
+### Compression - single table
+
+**Schema**: `metrics` containing about 20k metric samples each consisting of a `group_id`, `metric name`, `labels`, `metadata`, `timestamp` & corresponding `value`.
+
+```sql
+SELECT count(*)
+FROM metrics_1
+
+Query id: e580f20b-b422-4d93-bb1f-eb1435761604
+
+┌─count()─â”
+│ 12144 │
+
+
+SELECT
+ table,
+ column,
+ formatReadableSize(sum(data_compressed_bytes) AS x) AS compressedsize,
+ formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed
+FROM system.parts_columns
+WHERE table LIKE 'metrics_1'
+GROUP BY
+ database,
+ table,
+ column
+ORDER BY x ASC
+
+Query id: b2677493-3fbc-46c1-a9a7-4524a7a86cb4
+
+┌─table─────┬─column────┬─compressedsize─┬─uncompressed─â”
+│ metrics_1 │ labels │ 283.02 MiB │ 1.66 GiB │
+│ metrics_1 │ metadata │ 283.02 MiB │ 1.66 GiB │
+│ metrics_1 │ group_id │ 283.02 MiB │ 1.66 GiB │
+│ metrics_1 │ value │ 283.02 MiB │ 1.66 GiB │
+│ metrics_1 │ name │ 283.02 MiB │ 1.66 GiB │
+│ metrics_1 │ timestamp │ 283.02 MiB │ 1.66 GiB │
+└───────────┴───────────┴────────────────┴──────────────┘
+```
+
+Though we see a good compression factor for the aforementioned schema, the amount of storage needed to store the corresponding dataset is approximately 300MiB. We also expect to see this footprint increase linearly given the redundancy baked into the schema design itself, also one of the reasons we intend **not** to proceed with this design further.
+
+### Performance - single table
+
+```shell
+(pprof) top
+Showing nodes accounting for 12844.95kB, 100% of 12844.95kB total
+Showing top 10 nodes out of 40
+ flat flat% sum% cum cum%
+ 2562.81kB 19.95% 19.95% 2562.81kB 19.95% runtime.allocm
+ 2561.90kB 19.94% 39.90% 2561.90kB 19.94% github.com/aws/aws-sdk-go/aws/endpoints.init
+ 2374.91kB 18.49% 58.39% 2374.91kB 18.49% github.com/ClickHouse/clickhouse-go/v2/lib/compress.NewReader (inline)
+ 1696.32kB 13.21% 71.59% 1696.32kB 13.21% bufio.NewWriterSize (inline)
+ 1184.27kB 9.22% 80.81% 1184.27kB 9.22% bufio.NewReaderSize (inline)
+ 1184.27kB 9.22% 90.03% 1184.27kB 9.22% github.com/ClickHouse/clickhouse-go/v2/lib/compress.NewWriter (inline)
+ 768.26kB 5.98% 96.01% 768.26kB 5.98% go.uber.org/zap/zapcore.newCounters
+ 512.20kB 3.99% 100% 512.20kB 3.99% runtime.malg
+ 0 0% 100% 6439.78kB 50.13% github.com/ClickHouse/clickhouse-go/v2.(*clickhouse).Ping
+ 0 0% 100% 6439.78kB 50.13% github.com/ClickHouse/clickhouse-go/v2.(*clickhouse).acquire
+```
+
+Writes against this schema perform much better in terms of compute, given it's concentrated on one table and does not need looking up `series_id` from a side table.
+
+### General storage considerations - Clickhouse
+
+The following sections intend to deep-dive into specific characteristics of our schema design and/or their interaction with Clickhouse - the database system.
+
+- table engines
+
+ - [MergeTree](https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree/)
+ - [S3 Table Engine](https://clickhouse.com/docs/en/engines/table-engines/integrations/s3/)
+
+- efficient partitioning and/or sharding
+
+ - Configuring our schemas with the right partitioning keys so as to have the least amount of blocks scanned when reading back the data.
+ - Sharding here would refer to how we design our data placement strategy to make sure the cluster remains optimally balanced at all times.
+
+- data compression
+
+As is visible from the aforementioned preliminary results, we see good compression results with dictionary and delta encoding for strings and floats respectively. When storing labels with a `Map` of `LowCardinality(String)`s, we were able to pack data efficiently.
+
+- materialized views
+
+Can be updated dynamically as the need be, help make read paths performant
+
+- async inserts
+
+- batch inserts
+
+- retention/TTLs
+
+We should only store data for a predetermined period of time, post which we either delete data, aggregate it or ship it to an archival store to reduce operational costs of having to store data for longer periods of time.
+
+- data aggregation/rollups
+
+- index granularity
+
+- skip indexes
+
+- `max_server_memory_usage_to_ram_ratio`
+
+### Data access via SQL
+
+While our corpus of data is PromQL-queryable, it would be prudent to make sure we make the SQL interface
+"generally available" as well. This capability opens up multiple possibilities to query resident data and
+allows our users to slice and dice their datasets whichever way they prefer to and/or need to.
+
+#### Challenges
+
+- Resource/cost profiling.
+- Query validation and sanitation.
+
+### Illustrative example(s) of data access
+
+### Writes
+
+On the write path, we first ensure registering a given set labels to a unique `series_id` and/or re-using one should we have seen the timeseries already in the past. For example:
+
+```plaintext
+redis{region="us-east-1",'os':'Ubuntu15.10',...} <TIMESTAMP> <VALUE>
+```
+
+**Schema**: labels_to_series
+
+```sql
+SELECT *
+FROM labels_to_series_1
+WHERE series_id = '6d926ae8-c3c3-420e-a9e2-d91aff3ac125'
+FORMAT Vertical
+
+Query id: dcbc4bd8-0bdb-4c35-823a-3874096aab6e
+
+Row 1:
+──────
+labels: {'arch':'x64','service':'1','__name__':'redis','region':'us-east-1','os':'Ubuntu15.10','team':'LON','service_environment':'production','rack':'36','service_version':'0','measurement':'pubsub_patterns','hostname':'host_32','datacenter':'us-east-1a'}
+series_id: 6d926ae8-c3c3-420e-a9e2-d91aff3ac125
+
+1 row in set. Elapsed: 0.612 sec.
+```
+
+Post which, we register each metric point in the `samples` table attributing it to the corresponding `series_id`.
+
+**Schema**: samples
+
+```sql
+SELECT *
+FROM samples_1
+WHERE series_id = '6d926ae8-c3c3-420e-a9e2-d91aff3ac125'
+LIMIT 1
+FORMAT Vertical
+
+Query id: f3b410af-d831-4859-8828-31c89c0385b5
+
+Row 1:
+──────
+series_id: 6d926ae8-c3c3-420e-a9e2-d91aff3ac125
+timestamp: 2022-11-10 12:59:14.939
+value: 0
+```
+
+### Reads
+
+On the read path, we first query all timeseries identifiers by searching for the labels under consideration. Once we have all the `series_id`(s), we then look up all corresponding samples between the query start timestamp and end timestamp.
+
+For example:
+
+```plaintext
+kernel{service_environment=~"prod.*", measurement="boot_time"}
+```
+
+which gets translated into first looking for all related timeseries:
+
+```sql
+SELECT *
+FROM labels_to_series
+WHERE
+((labels['__name__']) = 'kernel') AND
+match(labels['service_environment'], 'prod.*') AND
+((labels['measurement']) = 'boot_time');
+```
+
+yielding a bunch of `series_id`(s) corresponding to the labels just looked up.
+
+**Sidenote**, this mostly-static dataset can also be cached and built up in-memory gradually to reduce paying the latency cost the second time, which should reduce the number of lookups considerably.
+
+To account for newer writes when maintaining this cache:
+
+- Have an out-of-band process/goroutine maintain this cache, so even if a few queries miss the most recent data, subsequent ones eventually catch up.
+
+- Have TTLs on the keys, jittered per key so as to rebuild them frequently enough to account for new writes.
+
+Once we know which timeseries we're querying for, from there, we can easily look up all samples via the following query:
+
+```sql
+SELECT *
+FROM samples
+WHERE series_id IN (
+ 'a12544be-0a3a-4693-86b0-c61a4553aea3',
+ 'abd42fc4-74c7-4d80-9b6c-12f673db375d',
+ …
+)
+AND timestamp >= '1667546789'
+AND timestamp <= '1667633189'
+ORDER BY timestamp;
+```
+
+yielding all timeseries samples we were interested in.
+
+We then render these into an array of `prometheus.QueryResult` object(s) and return back to the caller as a `prometheus.ReadResponse` object.
+
+NOTE:
+The queries have been broken down into multiple queries only during our early experimentation/iteration, it'd be prudent to use subqueries within the same roundtrip to the database going forward into production/benchmarking.
+
+## Production Readiness
+
+### Batching
+
+Considering we'll need to batch data before ingesting large volumes of small writes into Clickhouse, the design must account for app-local persistence to allow it to locally batch incoming data before landing it into Clickhouse in batches of a predetermined size in order to increase performance and allow the table engine to continue to persist data successfully.
+
+We have considered the following alternatives to implement app-local batching:
+
+- In-memory - non durable
+- BadgerDB - durable, embedded, performant
+- Redis - trivial, external dependency
+- Kafka - non-trivial, external dependency but it can augment multiple other use-cases and help other problem domains at GitLab.
+
+**Note**: Similar challenges have also surfaced with the CH interactions `errortracking` - the subsystem has in its current implementation. There have been multiple attempts to solve this problem domain in the past - [this MR](https://gitlab.com/gitlab-org/opstrace/opstrace/-/merge_requests/1660) implemented an in-memory alternative while [this one](https://gitlab.com/gitlab-org/opstrace/opstrace/-/merge_requests/1767) attempted an on-disk alternative.
+
+Any work done in this area of concern would also benefit other subsystems such as errortracking, logging, etc.
+
+### Scalability
+
+We intend to start testing the proposed implementation with 10K metric-points per second to test/establish our initial hypothesis, though ideally, we must design the underlying backend for 1M points ingested per second.
+
+### Benchmarking
+
+We propose the following three dimensions be tested while benchmarking the proposed implementation:
+
+- Data ingest performance
+- On-disk storage requirements (accounting for replication if applicable)
+- Mean query response times
+
+For understanding performance, we'll need to first compile a list of such queries given the data we ingest for our tests. Clickhouse query logging is super helpful while doing this.
+
+NOTE:
+Ideally, we aim to benchmark the system to be able to ingest >1M metric points/sec while consistently serving most queries under <1 sec.
+
+### Past work & references
+
+- [Benchmark ClickHouse for metrics](https://gitlab.com/gitlab-org/opstrace/opstrace/-/issues/1666)
+- [Incubation:APM ClickHouse evaluation](https://gitlab.com/gitlab-org/incubation-engineering/apm/apm/-/issues/4)
+- [Incubation:APM ClickHouse metrics schema](https://gitlab.com/gitlab-org/incubation-engineering/apm/apm/-/issues/10)
+- [Our research around TimescaleDB](https://gitlab.com/gitlab-com/gl-infra/reliability/-/issues/14137)
+- [Current Workload on our Thanos-based setup](https://gitlab.com/gitlab-com/gl-infra/reliability/-/issues/15420#current-workload)
+- [Scaling-200m-series](https://opstrace.com/blog/scaling-200m-series)
+
+### Cost-estimation
+
+- We aim to make sure the system's not too expensive, especially given our biggest footprint is on Clickhouse and the underlying storage.
+
+- We must consider the usage of multiple storage medium(s), especially:
+ - Tiered storage
+ - Object storage
+
+### Tooling
+
+- We aim to building visibility into high cardinality metrics to be able to assist with keeping our databases healthy by pruning/dropping unused metrics.
+
+- Similarly, we aim to develop the ability to see unused metrics for the end-user, which can be easily & dynamically built into the system by parsing all read requests and building usage statistics.
+
+- We aim to add monitoring for per-metric scrape frequencies to make sure the end-user is not ingesting data at a volume they do not need and/or find useful.
+
+## Looking forward
+
+### Linkage across telemetry pillars, exemplars
+
+We must build the metrics system in a way to be able cross-reference ingested data with other telemetry pillars, such as traces, logs and errors, so as to provide a more holistic view of all instrumentation a system sends our way.
+
+### User-defined SQL queries to aggregate data and/or generate materialized views
+
+We should allow users of the system to be able to run user-defined, ad-hoc queries similar to how Prometheus recording rules help generate custom metrics from existing ones.
+
+### Write Ahead Logs (WALs)
+
+We believe that should we feel the need to start buffering data local to the ingestion application and/or move away from Clickhouse for persisting data, on-disk WALs would be a good direction to proceed into given their prevelant usage among other monitoring system.
+
+### Custom DSLs or query builders
+
+Using PromQL directly could be a steep learning curve for users. It would be really nice to have a query builder (as is common in Grafana) to allow building of the typical queries you'd expect to run and to allow exploration of the available metrics. It also serves as a way to learn the DSL, so more complex queries can be created later.
+
+## Roadmap & Next Steps
+
+The following section enlists how we intend to implement the aforementioned proposal around building Metrics support into GitLab Observability Service. Each corresponding document and/or issue contains further details of how each next step is planned to be executed.
+
+- **DONE** [Research & draft design proposal and/or requirements](https://docs.google.com/document/d/1kHyIoWEcs14sh3CGfKGiI8QbCsdfIHeYkzVstenpsdE/edit?usp=sharing)
+- **IN-PROGRESS** [Submit system/schema designs (proposal) & gather feedback](https://docs.google.com/document/d/1kHyIoWEcs14sh3CGfKGiI8QbCsdfIHeYkzVstenpsdE/edit?usp=sharing)
+- **IN-PROGRESS** [Develop table definitions and/or storage interfaces](https://gitlab.com/gitlab-org/opstrace/opstrace/-/issues/1666)
+- **IN-PROGRESS** [Prototype reference implementation, instrument key metrics](https://gitlab.com/gitlab-org/opstrace/opstrace/-/merge_requests/1823)
+- [Benchmark Clickhouse and/or proposed schemas, gather expert advice from Clickhouse Inc.](https://gitlab.com/gitlab-org/opstrace/opstrace/-/issues/1666)
+- Develop write path(s) - `remote_write` API
+- Develop read path(s) - `remote_read` API, `PromQL`-based querier.
+- Setup testbed(s) for repeatable benchmarking/testing
+- Schema design and/or application server improvements if needed
+- Production Readiness v1.0-alpha/beta
+- Implement vanguarded/staged rollouts
+- Run extended alpha/beta testing
+- Release v1.0
diff --git a/doc/architecture/blueprints/gitlab_observability_backend/metrics/index.md b/doc/architecture/blueprints/gitlab_observability_backend/metrics/index.md
deleted file mode 100644
index 3edb01d9140..00000000000
--- a/doc/architecture/blueprints/gitlab_observability_backend/metrics/index.md
+++ /dev/null
@@ -1,690 +0,0 @@
----
-status: proposed
-creation-date: "2022-11-09"
-authors: [ "@ankitbhatnagar" ]
-coach: "@mappelman"
-approvers: [ "@sebastienpahl", "@nicholasklick" ]
-owning-stage: "~monitor::observability"
-participating-stages: []
----
-
-<!-- vale gitlab.FutureTense = NO -->
-
-# GitLab Observability Backend - Metrics
-
-## Summary
-
-Developing a multi-user system to store & query observability data typically formatted in widely accepted, industry-standard formats using Clickhouse as underlying storage, with support for long-term data retention and aggregation.
-
-## Motivation
-
-From the six pillars of Observability, commonly abbreviated as `TEMPLE` - Traces, Events, Metrics, Profiles, Logs & Errors, Metrics constitute one of the most important pillars of observability data for modern day systems, helping their users gather insights about their operational posture.
-
-Metrics which are commonly structured as timeseries data have the following characteristics:
-
-- indexed by their corresponding timestamps;
-- continuously expanding in size;
-- usually aggregated, down-sampled, and queried in ranges; and
-- have very write-intensive requirements.
-
-Within GitLab Observability Backend, we aim to add the support for our customers to ingest and query observability data around their systems & applications, helping them improve the operational health of their systems.
-
-### Goals
-
-With the development of the proposed system, we have the following goals:
-
-- Scalable, low latency & cost-effective monitoring system backed by Clickhouse whose performance has been proven via repeatable benchmarks.
-
-- Support for long-term storage for Prometheus/OpenTelemetry formatted metrics, ingested via Prometheus remote_write API and queried via Prometheus remote_read API, PromQL or SQL with support for metadata and exemplars.
-
-The aformentioned goals can further be broken down into the following four sub-goals:
-
-#### Ingesting data
-
-- For the system to be capable of ingesting large volumes of writes and reads, we aim to ensure that it must be horizontally scalable & provide durability guarantees to ensure no writes are dropped once ingested.
-
-#### Persisting data
-
-- We aim to support ingesting telemetry/data sent using Prometheus `remote_write` protocol. Any persistence we design for our dataset must be multi-tenant by default, ensuring we can store observability data for multiple tenants/groups/projects within the same storage backend.
-
-- We aim to develop a test suite for data correctness, seeking inspiration from how Prometheus compliance test suite checks the correctness of a given Metrics implementation and running it as a part of our CI setup.
-
-NOTE:
-Although remote_write_sender does not test the correctness of a remote write receiver itself as is our case, it does bring some inspiration to implement/develop one within the scope of this project.
-
-- We aim to also ensure compatibility for special Prometheus data types, e.g. Prometheus histogram(s), summary(s).
-
-#### Reading data
-
-- We aim to support querying data using PromQL which means translating PromQL queries into Clickhouse SQL. To do this, [PromQL](https://github.com/prometheus/prometheus/tree/main/promql/parser) or [MetricsQL](https://github.com/VictoriaMetrics/metricsql) parsers are good alternatives.
-
-- We aim to provide additional value by exposing all ingested data via the native Clickhouse SQL interface subject to the following reliability characteristics:
- - query validation, sanitation
- - rate limiting
- - resource limiting - memory, cpu, network bandwidth
-
-- We aim to pass Prometheus test suits for correctness via the [Prometheus Compliance test suite](https://github.com/prometheus/compliance/tree/main/promql) with a target goal of 100% success rate.
-
-#### Deleting data
-
-- We aim to support being able to delete any ingested data should such a need arise. This is also in addition to us naturally deleting data when a configured TTL expires and/or respective retention policies are enforced. We must, within our schemas, build a way to delete data by labels OR their content, also add to our offering the necessary tooling to do so.
-
-### Non-Goals
-
-With the goals established above, we also want to establish what specific things are non-goals with the current proposal. They are:
-
-- We do not aim to support ingestion using OpenTelemetry/OpenMetrics formats with our first iteration, though our users can still use the Opentelemetry exporters(s) internally consuming the standard Prometheus `remote_write` protocol. More information [here](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/prometheusremotewriteexporter).
-
-- We do not aim to support ingesting Prometheus exemplars in our first iteration, though we do aim to account for them in our design from the beginning.
-
-NOTE:
-Worth noting that we intend to model exemplars the same way we’re modeling metric-labels, so building on top of the same data structure should help implementt support for metadata/exemplars rather easily.
-
-## Proposal
-
-We intend to use GitLab Observability Backend as a framework for the Metrics implementation so that its lifecycle is also managed via already existing Kubernetes controllers e.g. scheduler, tenant-operator.
-
-![Architecture](supported-deployments.png)
-
-From a development perspective, what’s been marked as our “Application Server†above needs to be developed as a part of this proposal while the remaining peripheral components either already exist or can be provisioned via existing code in `scheduler`/`tenant-operator`.
-
-**On the write path**, we expect to receive incoming data via `HTTP`/`gRPC` `Ingress` similar to what we do for our existing services, e.g. errortracking, tracing.
-
-NOTE:
-Additionally, since we intend to ingest data via Prometheus `remote_write` API, the received data will be Protobuf-encoded, Snappy-compressed. All received data therefore needs to be decompressed & decoded to turn it into a set of `prompb.TimeSeries` objects, which the rest of our components interact with.
-
-We also need to make sure to avoid writing a lot of small writes into Clickhouse, therefore it’d be prudent to batch data before writing it into Clickhouse.
-
-We must also make sure ingestion remains decoupled with `Storage` so as to reduce undue dependence on a given storage implementation. While we do intend to use Clickhouse as our backing storage for any foreseeable future, this ensures we do not tie ourselves in into Clickhouse too much should future business requirements warrant the usage of a different backend/technology. A good way to implement this in Go would be our implementations adhering to a standard interface, the following for example:
-
-```go
-type Storage interface {
- Read(
- ctx context.Context,
- request *prompb.ReadRequest
- ) (*prompb.ReadResponse, error)
- Write(
- ctx context.Context,
- request *prompb.WriteRequest
- ) error
-}
-```
-
-NOTE:
-We understand this couples the implementation with Prometheus data format/request types, but adding methods to the interface to support more data formats should be trivial looking forward with minimal changes to code.
-
-**On the read path**, we aim to allow our users to use the Prometheus `remote_read` API and be able to query ingested data via PromQL & SQL. Support for `remote_read` API should be trivial to implement, while supporting PromQL would need translating it into SQL. We can however employ the usage of already existing [PromQL](https://github.com/prometheus/prometheus/tree/main/promql/parser) parsing libraries.
-
-We aim to focus on implementing query validation & sanitation, rate-limiting and regulating resource-consumption to ensure underlying systems, esp. storage, remain in good operational health at all times.
-
-### Supported deployments
-
-In this first iteration of the metrics backend, we intend to support a generic deployment model that makes sure we can capture as much usage as possible and begin dogfooding the product as soon as possible. This is well illustrated in the [aforementioned architecture diagram](#proposal).
-
-In its most vanilla form, metrics support in GitLab Observability Backend can be used via the Prometheus remote read & write APIs. If a user already uses Prometheus as their monitoring abstraction, it can be configured to use this backend directly.
-
-- remote_write: [configuration](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write)
-- remote_read: [configuration](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_read)
-
-For users of the system that do not use a Prometheus instance for scraping their telemetry data, they can export their metrics via a multitude of collectors/agents such as the OpenTelemetry collector or the Prometheus Agent for example, all of which can be configured to use our remote_write endpoint. For reads however, we intend to run a Prometheus within GOB (alongside the application server) itself, then hook it up automatically with the GitLab Observability UI (GOUI) preconfigured to consume our remote_read endpoint.
-
-Notably, the ability to use a GOB-run Prometheus instance is applicable while we can only support remote_read API for running queries. Looking forward towards our next iteration, we should be able to get rid of this additional component altogether when we have full support for executing PromQL and/or SQL queries directly from GOUI.
-
-**Per-group deployments**: From a scalability perspective, we deploy an instance of Ingress, a Prometheus instance & the application server per group to make sure we can scale them subject to traffic volumes of the respective tenant. It also helps isolate resource consumption across tenants in an otherwise multi-tenant system.
-
-### Metric collection and storage
-
-It is important to separate metric collection on the client side with the storage we provision at our end.
-
-### State of the art for storage
-
-Existing long-term Prometheus compatible metrics vendors provide APIs that are compatible with Prometheus remote_write.
-
-### State of the art for Prometheus clients
-
-Metric collection clients such as Prometheus itself, Grafana Cloud Agent, Datadog Agent, etc. will scrape metrics endpoints typically from within a firewalled environment, store locally scraped metrics in a [Write Ahead Log (WAL)](https://en.wikipedia.org/wiki/Write-ahead_logging) and then batch send them to an external environment (i.e. the vendor or an internally managed system like Thanos) via the Prometheus `remote_write` protocol.
-
-- A client-side collector is an important part of the overall architecture, though it's owned by the customer/user since it needs to run in their environment. This gives the end user full control over their data because they control how it is collected and to where it is delivered.
-
-- It's **not** feasible to provide an external vendor with credentials to access and scrape endpoints within a user's firewalled environment.
-
-- It's also critically important that our `remote_write` APIs respond correctly with the appropriate rate-limiting status codes so that Prometheus Clients can respect them.
-
-[Here](https://grafana.com/blog/2021/05/26/the-future-of-prometheus-remote-write/) is a good background/history on Prometheus `remote_write` and its importance in Prometheus based observability.
-
-## Design and implementation details
-
-Following are details of how we aim to design & implement the proposed solution. To that end, a reference implementation was also developed to understand the scope of the problem and provide early data to ensure our proposal was drafted around informed decisions and/or results of our experimentation.
-
-## Reference implementation(s)
-
-- [Application server](https://gitlab.com/gitlab-org/opstrace/opstrace/-/merge_requests/1823)
-- [Metrics generator](https://gitlab.com/ankitbhatnagar/metrics-gen/-/blob/main/main.go)
-
-## Target environments
-
-Keeping inline with our current operational structure, we intend to deploy the metrics offering as a part of GitLab Observability Backend, deployed on the following two target environments:
-
-- kind cluster (for local development)
-- GKE cluster (for staging/production environments)
-
-## Schema Design
-
-### **Proposed solution**: Fully normalized tables for decreased redundancy & increased read performance
-
-### primary, denormalized data table
-
-```sql
-CREATE TABLE IF NOT EXISTS samples ON CLUSTER '{cluster}' (
- series_id UUID,
- timestamp DateTime64(3, ‘UTC’) CODEC(Delta(4), ZSTD),
- value Float64 CODEC(Gorilla, ZSTD)
-) ENGINE = ReplicatedMergeTree()
-PARTITION BY toYYYYMMDD(timestamp)
-ORDER BY (series_id, timestamp)
-```
-
-### metadata table to support timeseries metadata/exemplars
-
-```sql
-CREATE TABLE IF NOT EXISTS samples_metadata ON CLUSTER '{cluster}' (
- series_id UUID,
- timestamp DateTime64(3, ‘UTC’) CODEC(Delta(4), ZSTD),
- metadata Map(String, String) CODEC(ZSTD),
-) ENGINE = ReplicatedMergeTree()
-PARTITION BY toYYYYMMDD(timestamp)
-ORDER BY (series_id, timestamp)
-```
-
-### lookup table(s)
-
-```sql
-CREATE TABLE IF NOT EXISTS labels_to_series ON CLUSTER '{cluster}' (
- labels Map(String, String) CODEC(ZSTD)
- series_id UUID
-) engine=ReplicatedMergeTree
-PRIMARY KEY (labels, series_id)
-```
-
-```sql
-CREATE TABLE IF NOT EXISTS group_to_series ON CLUSTER ‘{cluster}’ (
- group_id Uint64,
- series_id UUID,
-) ORDER BY (group_id, series_id)
-```
-
-### Refinements
-
-- sharding considerations for a given tenant when ingesting/persisting data if we intend to co-locate data specific to multiple tenants within the same database tables. To simplify things, segregating tenant-specific data to their own dedicated set of tables would make a lot of sense.
-
-- structural considerations for “timestamps†when ingesting data across tenants.
-
-- creation_time vs ingestion_time
-
-- No support for transactions in the native client yet, to be able to effectively manage writes across multiple tables.
-
-NOTE:
-Slightly non-trivial but we can potentially investigate the possibility of using ClickHouse/ch-go directly, it supposedly promises a better performance profile too.
-
-### Pros - multiple tables
-
-- Normalised data structuring allows for efficient storage of data, removing any redundancy across multiple samples for a given timeseries. Evidently, for the “samples†schema, we expect to store 32 bytes of data per metric point.
-
-- Better search complexity when filtering timeseries by labels/metadata, via the use of better indexed columns.
-
-- All data is identifiable via a unique identifier, which can be used to maintain data consistency across tables.
-
-### Cons - multiple tables
-
-- Writes are trivially expensive considering writes across multiple tables.
-
-- Writes across tables also need to be implemented as a transaction to guarantee consistency when ingesting data.
-
-### Operational characteristics - multiple tables
-
-### Storage - multiple tables
-
-A major portion of our writes are made into the `samples` schema which contains a tuple containing three data points per metric point written:
-|column|data type|byte size|
-|---|---|---|
-|series_id|UUID|16 bytes|
-|timestamp|DateTime64|8 bytes|
-|value|Float64|8 bytes|
-
-Therefore, we estimate to use 32 bytes per sample ingested.
-
-### Compression - multiple tables
-
-Inspecting the amount of compression we’re able to get with the given design on our major schemas, we see it as a good starting point. Following measurements for both primary tables:
-
-**Schema**: `labels_to_series` containing close to 12k unique `series_id`, each mapping to a set of 10-12 label string pairs
-
-```sql
-SELECT
- table,
- column,
- formatReadableSize(sum(data_compressed_bytes) AS x) AS compressedsize,
- formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed
-FROM system.parts_columns
-WHERE table LIKE 'labels_to_series_1'
-GROUP BY
- database,
- table,
- column
-ORDER BY x ASC
-
-Query id: 723b4145-14f7-4e74-9ada-01c17c2f1fd5
-
-┌─table──────────────┬─column────┬─compressedsize─┬─uncompressed─â”
-│ labels_to_series_1 │ labels │ 586.66 KiB │ 2.42 MiB │
-│ labels_to_series_1 │ series_id │ 586.66 KiB │ 2.42 MiB │
-└────────────────────┴───────────┴────────────────┴──────────────┘
-```
-
-**Schema**: `samples` containing about 20k metric samples each containing a tuple comprising `series_id` (16 bytes), `timestamp` (8 bytes) and `value` (8 bytes).
-
-```sql
-SELECT
- table,
- column,
- formatReadableSize(sum(data_compressed_bytes) AS x) AS compressedsize,
- formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed
-FROM system.parts_columns
-WHERE table LIKE 'samples_1'
-GROUP BY
- database,
- table,
- column
-ORDER BY x ASC
-
-Query id: 04219cea-06ea-4c5f-9287-23cb23c023d2
-
-┌─table─────┬─column────┬─compressedsize─┬─uncompressed─â”
-│ samples_1 │ value │ 373.21 KiB │ 709.78 KiB │
-│ samples_1 │ timestamp │ 373.21 KiB │ 709.78 KiB │
-│ samples_1 │ series_id │ 373.21 KiB │ 709.78 KiB │
-└───────────┴───────────┴────────────────┴──────────────┘
-```
-
-### Performance - multiple tables
-
-From profiling our reference implementation, it can also be noted that most of our time right now is spent in the application writing data to Clickhouse and/or its related operations. A “top†pprof profile sampled from the implementation looked like:
-
-```shell
-(pprof) top
-Showing nodes accounting for 42253.20kB, 100% of 42253.20kB total
-Showing top 10 nodes out of 58
- flat flat% sum% cum cum%
-13630.30kB 32.26% 32.26% 13630.30kB 32.26% github.com/ClickHouse/clickhouse-go/v2/lib/compress.NewWriter (inline)
-11880.92kB 28.12% 60.38% 11880.92kB 28.12% github.com/ClickHouse/clickhouse-go/v2/lib/compress.NewReader (inline)
- 5921.37kB 14.01% 74.39% 5921.37kB 14.01% bufio.NewReaderSize (inline)
- 5921.37kB 14.01% 88.41% 5921.37kB 14.01% bufio.NewWriterSize (inline)
- 1537.69kB 3.64% 92.04% 1537.69kB 3.64% runtime.allocm
- 1040.73kB 2.46% 94.51% 1040.73kB 2.46% github.com/aws/aws-sdk-go/aws/endpoints.init
- 1024.41kB 2.42% 96.93% 1024.41kB 2.42% runtime.malg
- 768.26kB 1.82% 98.75% 768.26kB 1.82% go.uber.org/zap/zapcore.newCounters
- 528.17kB 1.25% 100% 528.17kB 1.25% regexp.(*bitState).reset
- 0 0% 100% 5927.73kB 14.03% github.com/ClickHouse/clickhouse-go/v2.(*clickhouse).Ping
-```
-
-As is evident above from our preliminary analysis, writing data into Clickhouse can be a potential bottleneck. Therefore, on the write path, it'd be prudent to batch our writes into Clickhouse so as to reduce the amount of work the application server ends up doing making the ingestion path more efficient.
-
-On the read path, it’s also possible to parallelize reads for the samples table either by series_id(s) OR by blocks of time between the queried start and end timestamps.
-
-### Caveats
-
-- When dropping labels from already existing metrics, we treat their new counterparts as completely new series and hence attribute them to a new series_id. This avoids having to merge series data and/or values. The old series, if not actively written into, should eventually fall off their retention and get deleted.
-
-- We have not yet accounted for any data aggregation. Our assumption is that the backing store (in Clickhouse) should allow us to keep a “sufficient†amount of data in its raw form and that we should be able to query against it within our query latency SLOs.
-
-### **Rejected alternative**: Single, centralized table
-
-### single, centralized data table
-
-```sql
-CREATE TABLE IF NOT EXISTS metrics ON CLUSTER ‘{cluster}’ (
- group_id UInt64,
- name LowCardinality(String) CODEC(ZSTD),
- labels Map(String, String) CODEC(ZSTD),
- metadata Map(String, String) CODEC(ZSTD),
- value Float64 CODEC (Gorilla, ZSTD),
- timestamp DateTime64(3, ‘UTC’) CODEC(Delta(4),ZSTD)
-) ENGINE = ReplicatedMergeTree()
-PARTITION BY toYYYYMMDD(timestamp)
-ORDER BY (group_id, name, timestamp);
-```
-
-### Pros - single table
-
-- Single source of truth, so all metrics data lives in one big table.
-
-- Querying data is easier to express in terms of writing SQL queries without having to query data across multiple tables.
-
-### Cons - single table
-
-- Huge redundancy built into the data structure since attributes such as name, labels, metadata are stored repeatedly for each sample collected.
-
-- Non-trivial complexity to search timeseries with values for labels/metadata given how they’re stored when backed by Maps/Arrays.
-
-- High query latencies by virtue of having to scan large amounts of data per query made.
-
-### Operational Characteristics - single table
-
-### Storage - single table
-
-|column|data type|byte size|
-|---|---|---|
-|group_id|UUID|16 bytes|
-|name|String|-|
-|labels|Map(String, String)|-|
-|metadata|Map(String, String)|-|
-|value|Float64|8 bytes|
-|timestamp|DateTime64|8 bytes|
-
-NOTE:
-Strings are of an arbitrary length, the length is not limited. Their value can contain an arbitrary set of bytes, including null bytes. We will need to regulate what we write into these columns application side.
-
-### Compression - single table
-
-**Schema**: `metrics` containing about 20k metric samples each consisting of a `group_id`, `metric name`, `labels`, `metadata`, `timestamp` & corresponding `value`.
-
-```sql
-SELECT count(*)
-FROM metrics_1
-
-Query id: e580f20b-b422-4d93-bb1f-eb1435761604
-
-┌─count()─â”
-│ 12144 │
-
-
-SELECT
- table,
- column,
- formatReadableSize(sum(data_compressed_bytes) AS x) AS compressedsize,
- formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed
-FROM system.parts_columns
-WHERE table LIKE 'metrics_1'
-GROUP BY
- database,
- table,
- column
-ORDER BY x ASC
-
-Query id: b2677493-3fbc-46c1-a9a7-4524a7a86cb4
-
-┌─table─────┬─column────┬─compressedsize─┬─uncompressed─â”
-│ metrics_1 │ labels │ 283.02 MiB │ 1.66 GiB │
-│ metrics_1 │ metadata │ 283.02 MiB │ 1.66 GiB │
-│ metrics_1 │ group_id │ 283.02 MiB │ 1.66 GiB │
-│ metrics_1 │ value │ 283.02 MiB │ 1.66 GiB │
-│ metrics_1 │ name │ 283.02 MiB │ 1.66 GiB │
-│ metrics_1 │ timestamp │ 283.02 MiB │ 1.66 GiB │
-└───────────┴───────────┴────────────────┴──────────────┘
-```
-
-Though we see a good compression factor for the aforementioned schema, the amount of storage needed to store the corresponding dataset is approximately 300MiB. We also expect to see this footprint increase linearly given the redundancy baked into the schema design itself, also one of the reasons we intend **not** to proceed with this design further.
-
-### Performance - single table
-
-```shell
-(pprof) top
-Showing nodes accounting for 12844.95kB, 100% of 12844.95kB total
-Showing top 10 nodes out of 40
- flat flat% sum% cum cum%
- 2562.81kB 19.95% 19.95% 2562.81kB 19.95% runtime.allocm
- 2561.90kB 19.94% 39.90% 2561.90kB 19.94% github.com/aws/aws-sdk-go/aws/endpoints.init
- 2374.91kB 18.49% 58.39% 2374.91kB 18.49% github.com/ClickHouse/clickhouse-go/v2/lib/compress.NewReader (inline)
- 1696.32kB 13.21% 71.59% 1696.32kB 13.21% bufio.NewWriterSize (inline)
- 1184.27kB 9.22% 80.81% 1184.27kB 9.22% bufio.NewReaderSize (inline)
- 1184.27kB 9.22% 90.03% 1184.27kB 9.22% github.com/ClickHouse/clickhouse-go/v2/lib/compress.NewWriter (inline)
- 768.26kB 5.98% 96.01% 768.26kB 5.98% go.uber.org/zap/zapcore.newCounters
- 512.20kB 3.99% 100% 512.20kB 3.99% runtime.malg
- 0 0% 100% 6439.78kB 50.13% github.com/ClickHouse/clickhouse-go/v2.(*clickhouse).Ping
- 0 0% 100% 6439.78kB 50.13% github.com/ClickHouse/clickhouse-go/v2.(*clickhouse).acquire
-```
-
-Writes against this schema perform much better in terms of compute, given it's concentrated on one table and does not need looking up `series_id` from a side table.
-
-### General storage considerations - Clickhouse
-
-The following sections intend to deep-dive into specific characteristics of our schema design and/or their interaction with Clickhouse - the database system.
-
-- table engines
-
- - [MergeTree](https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree/)
- - [S3 Table Engine](https://clickhouse.com/docs/en/engines/table-engines/integrations/s3/)
-
-- efficient partitioning and/or sharding
-
- - Configuring our schemas with the right partitioning keys so as to have the least amount of blocks scanned when reading back the data.
- - Sharding here would refer to how we design our data placement strategy to make sure the cluster remains optimally balanced at all times.
-
-- data compression
-
-As is visible from the aforementioned preliminary results, we see good compression results with dictionary and delta encoding for strings and floats respectively. When storing labels with a `Map` of `LowCardinality(String)`s, we were able to pack data efficiently.
-
-- materialized views
-
-Can be updated dynamically as the need be, help make read paths performant
-
-- async inserts
-
-- batch inserts
-
-- retention/TTLs
-
-We should only store data for a predetermined period of time, post which we either delete data, aggregate it or ship it to an archival store to reduce operational costs of having to store data for longer periods of time.
-
-- data aggregation/rollups
-
-- index granularity
-
-- skip indexes
-
-- `max_server_memory_usage_to_ram_ratio`
-
-### Data access via SQL
-
-While our corpus of data is PromQL-queryable, it would be prudent to make sure we make the SQL interface “generally available†as well. This capability opens up multiple possibilities to query resident data and allows our users to slice and dice their datasets whichever way they prefer to and/or need to.
-
-#### Challenges
-
-- Resource/cost profiling.
-- Query validation and sanitation.
-
-### Illustrative example(s) of data access
-
-### Writes
-
-On the write path, we first ensure registering a given set labels to a unique `series_id` and/or re-using one should we have seen the timeseries already in the past. For example:
-
-```plaintext
-redis{region="us-east-1",'os':'Ubuntu15.10',...} <TIMESTAMP> <VALUE>
-```
-
-**Schema**: labels_to_series
-
-```sql
-SELECT *
-FROM labels_to_series_1
-WHERE series_id = '6d926ae8-c3c3-420e-a9e2-d91aff3ac125'
-FORMAT Vertical
-
-Query id: dcbc4bd8-0bdb-4c35-823a-3874096aab6e
-
-Row 1:
-──────
-labels: {'arch':'x64','service':'1','__name__':'redis','region':'us-east-1','os':'Ubuntu15.10','team':'LON','service_environment':'production','rack':'36','service_version':'0','measurement':'pubsub_patterns','hostname':'host_32','datacenter':'us-east-1a'}
-series_id: 6d926ae8-c3c3-420e-a9e2-d91aff3ac125
-
-1 row in set. Elapsed: 0.612 sec.
-```
-
-Post which, we register each metric point in the `samples` table attributing it to the corresponding `series_id`.
-
-**Schema**: samples
-
-```sql
-SELECT *
-FROM samples_1
-WHERE series_id = '6d926ae8-c3c3-420e-a9e2-d91aff3ac125'
-LIMIT 1
-FORMAT Vertical
-
-Query id: f3b410af-d831-4859-8828-31c89c0385b5
-
-Row 1:
-──────
-series_id: 6d926ae8-c3c3-420e-a9e2-d91aff3ac125
-timestamp: 2022-11-10 12:59:14.939
-value: 0
-```
-
-### Reads
-
-On the read path, we first query all timeseries identifiers by searching for the labels under consideration. Once we have all the `series_id`(s), we then look up all corresponding samples between the query start timestamp and end timestamp.
-
-For e.g.
-
-```plaintext
-kernel{service_environment=~"prod.*", measurement="boot_time"}
-```
-
-which gets translated into first looking for all related timeseries:
-
-```sql
-SELECT *
-FROM labels_to_series
-WHERE
-((labels['__name__']) = 'kernel') AND
-match(labels['service_environment'], 'prod.*') AND
-((labels['measurement']) = 'boot_time');
-```
-
-yielding a bunch of `series_id`(s) corresponding to the labels just looked up.
-
-**Sidenote**, this mostly-static dataset can also be cached and built up in-memory gradually to reduce paying the latency cost the second time, which should reduce the number of lookups considerably.
-
-To account for newer writes when maintaining this cache:
-
-- Have an out-of-band process/goroutine maintain this cache, so even if a few queries miss the most recent data, subsequent ones eventually catch up.
-
-- Have TTLs on the keys, jittered per key so as to rebuild them frequently enough to account for new writes.
-
-Once we know which timeseries we’re querying for, from there, we can easily look up all samples via the following query:
-
-```sql
-SELECT *
-FROM samples
-WHERE series_id IN (
- 'a12544be-0a3a-4693-86b0-c61a4553aea3',
- 'abd42fc4-74c7-4d80-9b6c-12f673db375d',
- …
-)
-AND timestamp >= '1667546789'
-AND timestamp <= '1667633189'
-ORDER BY timestamp;
-```
-
-yielding all timeseries samples we were interested in.
-
-We then render these into an array of `prometheus.QueryResult` object(s) and return back to the caller as a `prometheus.ReadResponse` object.
-
-NOTE:
-The queries have been broken down into multiple queries only during our early experimentation/iteration, it’d be prudent to use subqueries within the same roundtrip to the database going forward into production/benchmarking.
-
-## Production Readiness
-
-### Batching
-
-Considering we’ll need to batch data before ingesting large volumes of small writes into Clickhouse, the design must account for app-local persistence to allow it to locally batch incoming data before landing it into Clickhouse in batches of a predetermined size in order to increase performance and allow the table engine to continue to persist data successfully.
-
-We have considered the following alternatives to implement app-local batching:
-
-- In-memory - non durable
-- BadgerDB - durable, embedded, performant
-- Redis - trivial, external dependency
-- Kafka - non-trivial, external dependency but it can augment multiple other use-cases and help other problem domains at GitLab.
-
-**Note**: Similar challenges have also surfaced with the CH interactions `errortracking` - the subsystem has in its current implementation. There have been multiple attempts to solve this problem domain in the past - [this MR](https://gitlab.com/gitlab-org/opstrace/opstrace/-/merge_requests/1660) implemented an in-memory alternative while [this one](https://gitlab.com/gitlab-org/opstrace/opstrace/-/merge_requests/1767) attempted an on-disk alternative.
-
-Any work done in this area of concern would also benefit other subsystems such as errortracking, logging, etc.
-
-### Scalability
-
-We intend to start testing the proposed implementation with 10K metric-points per second to test/establish our initial hypothesis, though ideally, we must design the underlying backend for 1M points ingested per second.
-
-### Benchmarking
-
-We propose the following three dimensions be tested while benchmarking the proposed implementation:
-
-- Data ingest performance
-- On-disk storage requirements (accounting for replication if applicable)
-- Mean query response times
-
-For understanding performance, we’ll need to first compile a list of such queries given the data we ingest for our tests. Clickhouse query logging is super helpful while doing this.
-
-NOTE:
-Ideally, we aim to benchmark the system to be able to ingest >1M metric points/sec while consistently serving most queries under <1 sec.
-
-### Past work & references
-
-- [Benchmark ClickHouse for metrics](https://gitlab.com/gitlab-org/opstrace/opstrace/-/issues/1666)
-- [Incubation:APM ClickHouse evaluation](https://gitlab.com/gitlab-org/incubation-engineering/apm/apm/-/issues/4)
-- [Incubation:APM ClickHouse metrics schema](https://gitlab.com/gitlab-org/incubation-engineering/apm/apm/-/issues/10)
-- [Our research around TimescaleDB](https://gitlab.com/gitlab-com/gl-infra/reliability/-/issues/14137)
-- [Current Workload on our Thanos-based setup](https://gitlab.com/gitlab-com/gl-infra/reliability/-/issues/15420#current-workload)
-- [Scaling-200m-series](https://opstrace.com/blog/scaling-200m-series)
-
-### Cost-estimation
-
-- We aim to make sure the system's not too expensive, especially given our biggest footprint is on Clickhouse and the underlying storage.
-
-- We must consider the usage of multiple storage medium(s), especially:
- - Tiered storage
- - Object storage
-
-### Tooling
-
-- We aim to building visibility into high cardinality metrics to be able to assist with keeping our databases healthy by pruning/dropping unused metrics.
-
-- Similarly, we aim to develop the ability to see unused metrics for the end-user, which can be easily & dynamically built into the system by parsing all read requests and building usage statistics.
-
-- We aim to add monitoring for per-metric scrape frequencies to make sure the end-user is not ingesting data at a volume they do not need and/or find useful.
-
-## Looking forward
-
-### Linkage across telemetry pillars, exemplars
-
-We must build the metrics system in a way to be able cross-reference ingested data with other telemetry pillars, such as traces, logs and errors, so as to provide a more holistic view of all instrumentation a system sends our way.
-
-### User-defined SQL queries to aggregate data and/or generate materialized views
-
-We should allow users of the system to be able to run user-defined, ad-hoc queries similar to how Prometheus recording rules help generate custom metrics from existing ones.
-
-### Write Ahead Logs (WALs)
-
-We believe that should we feel the need to start buffering data local to the ingestion application and/or move away from Clickhouse for persisting data, on-disk WALs would be a good direction to proceed into given their prevelant usage among other monitoring system.
-
-### Custom DSLs or query builders
-
-Using PromQL directly could be a steep learning curve for users. It would be really nice to have a query builder (as is common in Grafana) to allow building of the typical queries you'd expect to run and to allow exploration of the available metrics. It also serves as a way to learn the DSL, so more complex queries can be created later.
-
-## Roadmap & Next Steps
-
-The following section enlists how we intend to implement the aforementioned proposal around building Metrics support into GitLab Observability Service. Each corresponding document and/or issue contains further details of how each next step is planned to be executed.
-
-- **DONE** [Research & draft design proposal and/or requirements](https://docs.google.com/document/d/1kHyIoWEcs14sh3CGfKGiI8QbCsdfIHeYkzVstenpsdE/edit?usp=sharing)
-- **IN-PROGRESS** [Submit system/schema designs (proposal) & gather feedback](https://docs.google.com/document/d/1kHyIoWEcs14sh3CGfKGiI8QbCsdfIHeYkzVstenpsdE/edit?usp=sharing)
-- **IN-PROGRESS** [Develop table definitions and/or storage interfaces](https://gitlab.com/gitlab-org/opstrace/opstrace/-/issues/1666)
-- **IN-PROGRESS** [Prototype reference implementation, instrument key metrics](https://gitlab.com/gitlab-org/opstrace/opstrace/-/merge_requests/1823)
-- [Benchmark Clickhouse and/or proposed schemas, gather expert advice from Clickhouse Inc.](https://gitlab.com/gitlab-org/opstrace/opstrace/-/issues/1666)
-- Develop write path(s) - `remote_write` API
-- Develop read path(s) - `remote_read` API, `PromQL`-based querier.
-- Setup testbed(s) for repeatable benchmarking/testing
-- Schema design and/or application server improvements if needed
-- Production Readiness v1.0-alpha/beta
-- Implement vanguarded/staged rollouts
-- Run extended alpha/beta testing
-- Release v1.0
diff --git a/doc/architecture/blueprints/gitlab_observability_backend/metrics/supported-deployments.png b/doc/architecture/blueprints/gitlab_observability_backend/supported-deployments.png
index 9dccc515129..9dccc515129 100644
--- a/doc/architecture/blueprints/gitlab_observability_backend/metrics/supported-deployments.png
+++ b/doc/architecture/blueprints/gitlab_observability_backend/supported-deployments.png
Binary files differ
diff --git a/doc/architecture/blueprints/modular_monolith/bounded_contexts.md b/doc/architecture/blueprints/modular_monolith/bounded_contexts.md
new file mode 100644
index 00000000000..0f71e24864e
--- /dev/null
+++ b/doc/architecture/blueprints/modular_monolith/bounded_contexts.md
@@ -0,0 +1,119 @@
+---
+status: proposed
+creation-date: "2023-06-21"
+authors: [ "@fabiopitino" ]
+coach: [ ]
+approvers: [ ]
+owning-stage: ""
+---
+
+# Defining bounded contexts
+
+## Status quo
+
+Today the GitLab codebase doesn't have a clear domain structure.
+We have [forced the creation of some modules](https://gitlab.com/gitlab-org/gitlab/-/issues/212156)
+as a first step but we don't have a well defined strategy for doing it consistently.
+
+The majority of the code is not properly namespaced and organized:
+
+- Ruby namespaces used don't always represent the SSoT. We have overlapping concepts spread across multiple
+ namespaces. For example: `Abuse::` and `Spam::` or `Security::Orchestration::` and `Security::SecurityOrchestration`.
+- Domain code related to the same bounded context is scattered across multiple directories.
+- Domain code is present in `lib/` directory under namespaces that differ from the same domain under `app/`.
+- Some namespaces are very shallow, containing a few classes while other namespaces are very deep and large.
+- A lot of the old code is not namespaced, making it difficult to understand the context where it's used.
+
+## Goal
+
+1. Define a list of characteristics that bounded contexts should have. For example: must relate to at least 1 product category.
+1. Have a list of top-level bounded contexts where all domain code is broken down into.
+1. Engineers can clearly see the list of available bounded contexts and can make an easy decision where to add
+ new classes and modules.
+1. Define a process for adding a new bounded context to the application. This should occur quite infrequently
+ and new bounded contexts need to adhere to the characteristics defined previously.
+1. Enforce the list of bounded contexts so that no new top-level namespaces can be used aside from the authorized ones.
+
+## Iterations
+
+### 0. Extract libraries out of the codebase
+
+In June 2023 we've started extracing gems out of the main codebase, into
+[`gems/` directory inside the monorepo](https://gitlab.com/gitlab-org/gitlab/-/blob/4c6e120069abe751d3128c05ade45ea749a033df/doc/development/gems.md).
+
+This is our first step towards modularization: externalize code that can be
+extracted to prevent coupling from being introduced into modules that have been
+designed as separate components.
+
+These gems as still part of the monorepo.
+
+### 1. What makes a bounded context?
+
+From the research in [Proposal: split GitLab monolith into components](https://gitlab.com/gitlab-org/gitlab/-/issues/365293)
+it seems that following [product categories](https://about.gitlab.com/handbook/product/categories/#hierarchy), as a guideline,
+would be much better than translating organization structure into folder structure (for example, `app/modules/verify/pipeline-execution/...`).
+
+However, this guideline alone is not sufficient and we need a more specific strategy:
+
+- Product categories can change ownership and we have seen some pretty frequent changes, even back and forth.
+ Moving code every time a product category changes ownership adds too much maintenance overhead.
+- Teams and organization changes should just mean relabelling the ownership of specific modules.
+- Bounded contexts (top level modules) should be [sufficiently deep](../../../development/software_design.md#use-namespaces-to-define-bounded-contexts)
+ to encapsulate implementation details and provide a smaller interface.
+- Some product categories, such as Browser Performance Testing, are just too small to represent a bounded context on their own.
+ We should have a strategy for grouping product categories together when makes sense.
+- Product categories don't necessarily translate into clean boundaries.
+ `Category:Pipeline Composition` and `Category:Continuous Integration` are some examples where Pipeline Authoring team
+ and Pipeline Execution team share a lot of code.
+- Some parts of the code might not have a clear product category associated to it.
+
+Despite the above, product categories provide a rough view of the bounded contexts at play in the application.
+
+One idea could be to use product categories to sketch the initial set of bounded contexts.
+Then, group related or strongly coupled categories under the same bounded context and create new bounded contexts if missing.
+
+### 2. Identify existing bounded contexts
+
+Start with listing all the Ruby files in a spreadsheet and categorize them into components following the guidelines above.
+Some of them are already pretty explicit like Ci::, Packages::, etc. Components should follow our
+[existing naming guide](../../../development/software_design.md#use-namespaces-to-define-bounded-contexts).
+
+This could be a short-lived Working Group with representative members of each DevOps stage (for example, Senior+ engineers).
+The WG would help defining high-level components and will be the DRIs for driving the changes in their respective DevOps stage.
+
+### 3. Publish the list of bounded contexts
+
+The list of bounded contexts (top-level namespaces) extracted from the codebase should be defined statically so it can be
+used programmatically.
+
+```yaml
+# file: config/bounded_contexts.yml
+bounded_contexts:
+ continuous_integration:
+ dir: modules/ci
+ namespace: 'Ci::'
+ packages: ...
+ merge_requests: ...
+ git: ...
+```
+
+With this static list we could:
+
+- Document the existing bounded contexts for engineers to see the big picture.
+- Understand where to place new classes and modules.
+- Enforce if any top-level namespaces are used that are not in the list of bounded contexts.
+- Autoload non-standard Rails directories based on the given list.
+
+## Glossary
+
+- `modules` are Ruby modules and can be used to nest code hierarchically.
+- `namespaces` are unique hierarchies of Ruby constants. For example, `Ci::` but also `Ci::JobArtifacts::` or `Ci::Pipeline::Chain::`.
+- `packages` are Packwerk packages to group together related functionalities. These packages can be big or small depending on the design and architecture. Inside a package all constants (classes and modules) have the same namespace. For example:
+ - In a package `ci`, all the classes would be nested under `Ci::` namespace. There can be also nested namespaces like `Ci::PipelineProcessing::`.
+ - In a package `ci-pipeline_creation` all classes are nested under `Ci::PipelineCreation`, like `Ci::PipelineCreation::Chain::Command`.
+ - In a package `ci` a class named `MergeRequests::UpdateHeadPipelineService` would not be allowed because it would not match the package's namespace.
+ - This can be enforced easily with [Packwerk's based Rubocop Cops](https://github.com/rubyatscale/rubocop-packs/blob/main/lib/rubocop/cop/packs/root_namespace_is_pack_name.rb).
+- `bounded context` is a top-level Packwerk package that represents a macro aspect of the domain. For example: `Ci::`, `MergeRequests::`, `Packages::`, etc.
+ - A bounded context is represented by a single Ruby module/namespace. For example, `Ci::` and not `Ci::JobArtifacts::`.
+ - A bounded context can be made of 1 or multiple Packwerk packages. Nested packages would be recommended if the domain is quite complex and we want to enforce privacy among all the implementation details. For example: `Ci::PipelineProcessing::` and `Ci::PipelineCreation::` could be separate packages of the same bounded context and expose their public API while keeping implementation details private.
+ - A new bounded context like `RemoteDevelopment::` can be represented a single package while large and complex bounded contexts like `Ci::` would need to be organized into smaller/nested packages.
diff --git a/doc/architecture/blueprints/modular_monolith/hexagonal_monolith/hexagonal_architecture.png b/doc/architecture/blueprints/modular_monolith/hexagonal_monolith/hexagonal_architecture.png
new file mode 100644
index 00000000000..a8d79e276a2
--- /dev/null
+++ b/doc/architecture/blueprints/modular_monolith/hexagonal_monolith/hexagonal_architecture.png
Binary files differ
diff --git a/doc/architecture/blueprints/modular_monolith/hexagonal_monolith/index.md b/doc/architecture/blueprints/modular_monolith/hexagonal_monolith/index.md
new file mode 100644
index 00000000000..eb4b428cf52
--- /dev/null
+++ b/doc/architecture/blueprints/modular_monolith/hexagonal_monolith/index.md
@@ -0,0 +1,132 @@
+---
+status: proposed
+creation-date: "2023-05-22"
+authors: [ "@fabiopitino" ]
+coach: [ ]
+approvers: [ ]
+owning-stage: ""
+---
+
+# Hexagonal Rails Monolith
+
+## Summary
+
+**TL;DR:** Change the Rails monolith from a [big ball of mud](https://en.wikipedia.org/wiki/Big_ball_of_mud) state to
+a [modular monolith](https://www.thereformedprogrammer.net/my-experience-of-using-modular-monolith-and-ddd-architectures)
+that uses an [Hexagonal architecture](https://en.wikipedia.org/wiki/Hexagonal_architecture_(software)) (or ports and adapters architecture).
+Extract cohesive functional domains into separate directory structure using Domain-Driven Design practices.
+Extract infrastructure code (logging, database tools, instrumentation, etc.) into gems, essentially remove the need for `lib/` directory.
+Define what parts of the functional domains (for example application services) are of public use for integration (the ports)
+and what parts are instead private encapsulated details.
+Define Web, Sidekiq, REST, GraphQL, and Action Cable as the adapters in the external layer of the architecture.
+Use [Packwerk](https://github.com/Shopify/packwerk) to enforce privacy and dependency between modules of the monolith.
+
+![Hexagonal Architecture for GitLab monolith](hexagonal_architecture.png)
+
+## Details
+
+### Application domain
+
+The application core (functional domains) is divided into separate top-level bounded contexts called after the
+[feature category](https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/categories.yml) they represent.
+A bounded-context is represented in the form of a Ruby module.
+This follows the existing [guideline on naming namespaces](../../../../development/software_design.md#use-namespaces-to-define-bounded-contexts) but puts more structure to it.
+
+Modules should:
+
+- Be deep enough to encapsulate a lot of the internal logic, state and data.
+- Have a public interface that is as small as possible, safe to use by other bounded contexts and well documented.
+- Be cohesive and represent the SSoT (single source of truth) of the feature it describes.
+
+Feature categories represent a product area that is large enough for the module to be deep, so we don't have a proliferation
+of small top-level modules. It also helps the codebase to follow the
+[ubiquitous language](../../../../development/software_design.md#use-ubiquitous-language-instead-of-crud-terminology).
+A team can be responsible for multiple feature categories, hence owning the vision for multiple bounded contexts.
+While feature categories can sometimes change ownership, this change of mapping the bounded context to new owners
+is very cheap.
+Using feature categories also helps new contributors, either as GitLab team members of members of the wider community,
+to navigate the codebase.
+
+If multiple feature categories are strongly related, they may be grouped under a single bounded context.
+If a feature category is only relevant in the context of a parent feature category, it may be included in the
+parent's bounded context. For example: Build artifacts existing in the context of Continuous Integration feature category
+and they may be merged under a single bounded context.
+
+### Application adapters
+
+>>>
+_Adapters are the glue between components and the outside world._
+_They tailor the exchanges between the external world and the ports that represent the requirements of the inside_
+_of the application component. There can be several adapters for one port, for example, data can be provided by_
+_a user through a GUI or a command-line interface, by an automated data source, or by test scripts._ -
+[Wikipedia](https://en.wikipedia.org/wiki/Hexagonal_architecture_(software)#Principle)
+>>>
+
+Application adapters would be:
+
+- Web UI (Rails controllers, view, JS and Vue client)
+- REST API endpoints
+- GraphQL Endpoints
+- Action Cable
+
+TODO: continue describing how adapters are organized and why they are separate from the domain code.
+
+### Platform code
+
+For platform code we consider any classes and modules that are required by the application domain and/or application
+adapters to work.
+
+The Rails' `lib/` directory today contains multiple categories of code that could live somewhere else,
+most of which is platform code:
+
+- REST API endpoints could be part of the [application adapters](#application-adapters).
+- domain code (both large domain code such as `Gitlab::Ci` and small such as `Gitlab::JiraImport`) should be
+ moved inside the [application domain](#application-domain).
+- The rest could be extracted as separate single-purpose gems under the `gems/` directory inside the monolith.
+ This can include utilities such as logging, error reporting and metrics, rate limiters,
+ infrastructure code like `Gitlab::ApplicationRateLimiter`, `Gitlab::Redis`, `Gitlab::Database`
+ and generic subdomains like `Banzai`.
+
+Base classes to extend Rails framework such as `ApplicationRecord` or `ApplicationWorker` as well as GitLab base classes
+such as `BaseService` could be implemented as gem extensions.
+
+This means that aside from the Rails framework code, the rest of the platform code resides in `gems/`.
+
+Eventually all code inside `gems/` could potentially be extracted in a separate repository or open sourced.
+Placing platform code inside `gems/` makes it clear that its purpose is to serve the application code.
+
+### Why Packwerk?
+
+TODO:
+
+- boundaries not enforced at runtime. Ruby code will still work as being all loaded in the same memory space.
+- can be introduced incrementally. Not everything requires to be moved to packs for the Rails autoloader to work.
+
+Companies like Gusto have been developing and maintaining a list of [development and engineering tools](https://github.com/rubyatscale)
+for organizations that want to move to using a Rails modular monolith around Packwerk.
+
+### EE and JH extensions
+
+TODO:
+
+## Challenges
+
+- Such changes require a shift in the development mindset to understand the benefits of the modular
+ architecture and not fallback into legacy practices.
+- Changing the application architecture is a challenging task. It takes time, resources and commitment
+ but most importantly it requires buy-in from engineers.
+- This may require us to have a medium-long term team of engineers or a Working Group that makes progresses
+ on the architecture evolution plan, foster discussions in various engineering channels and resolve adoption challenges.
+- We need to ensure we build standards and guidelines and not silos.
+- We need to ensure we have clear guidelines on where new code should be placed. We must not recreate junk drawer folders like `lib/`.
+
+## Opportunities
+
+The move to a modular monolith architecture enables a lot of opportunities that we could explore in the future:
+
+- We could align the concept of domain expert with explicitly owning specific modules of the monolith.
+- The use of static analysis tool (such as Packwerk, Rubocop) can catch design violations in development and CI, ensuring
+ that best practices are honored.
+- By defining dependencies between modules explicitly we could speed up CI by testing only the parts that are affected by
+ the changes.
+- Such modular architecture could help to further decompose modules into separate services if needed.
diff --git a/doc/architecture/blueprints/modular_monolith/index.md b/doc/architecture/blueprints/modular_monolith/index.md
new file mode 100644
index 00000000000..ef50be643a6
--- /dev/null
+++ b/doc/architecture/blueprints/modular_monolith/index.md
@@ -0,0 +1,112 @@
+---
+status: proposed
+creation-date: "2023-05-22"
+authors: [ "@grzesiek", "@fabiopitino" ]
+coach: [ ]
+approvers: [ ]
+owning-stage: ""
+participating-stages: []
+---
+
+<!-- vale gitlab.FutureTense = NO -->
+
+# GitLab Modular Monolith
+
+## Summary
+
+The main [GitLab Rails](https://gitlab.com/gitlab-org/gitlab)
+project has been implemented as a large monolithic application, using
+[Ruby on Rails](https://rubyonrails.org/) framework. It has over 2.2 million
+lines of Ruby code and hundreds of engineers contributing to it every day.
+
+The application has been growing in complexity for more than a decade. The
+monolithic architecture has served us well during this time, making it possible
+to keep high development velocity and great engineering productivity.
+
+Even though we strive for having [an approachable open-core architecture](https://about.gitlab.com/blog/2022/07/14/open-core-is-worse-than-plugins/)
+we need to strengthen the boundaries between domains to retain velocity and
+increase development predictability.
+
+As we grow as an engineering organization, we want to explore a slightly
+different, but related, architectural paradigm:
+[a modular monolith design](https://en.wikipedia.org/wiki/Modular_programming),
+while still using a [monolithic architecture](https://en.wikipedia.org/wiki/Monolithic_application)
+with satellite services.
+
+This should allow us to increase engineering efficiency, reduce the cognitive
+load, and eventually decouple internal components to the extend that will allow
+us to deploy and run them separately if needed.
+
+## Motivation
+
+Working with a large and tightly coupled monolithic application is challenging:
+
+Engineering:
+
+- Onboarding engineers takes time. It takes a while before engineers feel
+ productive due to the size of the context and the amount of coupling.
+- We need to use `CODEOWNERS` file feature for several domains but
+ [these rules are complex](https://gitlab.com/gitlab-org/gitlab/-/blob/409228f064a950af8ff2cecdd138fc9da41c8e63/.gitlab/CODEOWNERS#L1396-1457).
+- It is difficult for engineers to build a mental map of the application due to its size.
+ Even apparently isolated changes can have [far-reaching repercussions](https://about.gitlab.com/handbook/engineering/development/#reducing-the-impact-of-far-reaching-work)
+ on other parts of the monolith.
+- Attrition/retention of engineering talent. It is fatiguing and demoralizing for
+ engineers to constantly deal with the obstacles to productivity.
+
+Architecture:
+
+- There is little structure inside the monolith. We have attempted to enforce
+ the creation [of some modules](https://gitlab.com/gitlab-org/gitlab/-/issues/212156)
+ but have no company-wide strategy on what the functional parts of the
+ monolith should be, and how code should be organized.
+- There is no isolation between existing modules. Ruby does not provide
+ out-of-the-box tools to effectively enforce boundaries. Everything lives
+ under the same memory space.
+- We rarely build abstractions that can boost our efficiency.
+- Moving stable parts of the application into separate services is impossible
+ due to high coupling.
+- We are unable to deploy changes to specific domains separately and isolate
+ failures that are happening inside them.
+
+Productivity:
+
+- High median-time-to-production for complex changes.
+- It can be overwhelming for the wider-community members to contribute.
+- Reducing testing times requires diligent and persistent efforts.
+
+## Goals
+
+- Increase the development velocity and predicability through separation of concerns.
+- Improve code quality by reducing coupling and introducing useful abstractions.
+- Build abstractions required to deploy and run GitLab components separately.
+
+## How do we get there?
+
+While we do recognize that modularization is a significant technical endeavor,
+we believe that the main challenge is organizational, rather than technical. We
+not only need to design separation in a way that modules are decoupled in a
+pragmatic way which works well on GitLab.com but also on self-managed
+instances, but we need to align modularization with the way in which we want to
+work at GitLab.
+
+There are many aspects and details required to make modularization of our
+monolith successful. We will work on the aspects listed below, refine them, and
+add more important details as we move forward towards the goal:
+
+1. [Deliver modularization proof-of-concepts that will deliver key insights](proof_of_concepts.md)
+1. [Align modularization plans to the organizational structure](bounded_contexts.md)
+1. Start a training program for team members on how to work with decoupled domains (TODO)
+1. Build tools that will make it easier to build decoupled domains through inversion of control (TODO)
+1. Separate domains into modules that will reflect organizational structure (TODO)
+1. Build necessary services to align frontend and backend modularization (TODO)
+1. [Introduce hexagonal architecture within the monolith](hexagonal_monolith/index.md)
+1. Introduce clean architecture with one-way-dependencies and host application (TODO)
+1. Build abstractions that will make it possible to run and deploy domains separately (TODO)
+
+## Status
+
+In progress.
+
+## References
+
+[List of references](references.md)
diff --git a/doc/architecture/blueprints/modular_monolith/proof_of_concepts.md b/doc/architecture/blueprints/modular_monolith/proof_of_concepts.md
new file mode 100644
index 00000000000..c215ffafbe4
--- /dev/null
+++ b/doc/architecture/blueprints/modular_monolith/proof_of_concepts.md
@@ -0,0 +1,134 @@
+---
+status: proposed
+creation-date: "2023-07-05"
+authors: [ "@grzesiek", "@fabiopitino" ]
+coach: [ ]
+owners: [ ]
+---
+
+# Modular Monolith: PoCs
+
+Modularization of our monolith is a complex project. There will be many
+unknowns. One thing that can help us mitigate the risks and deliver key
+insights are Proof-of-Concepts that we could deliver early on, to better
+understand what will need to be done.
+
+## Inter-module communicaton
+
+A PoC that we plan to deliver is a PoC of inter-module communication. We do
+recognize the need to separate modules, but still allow them to communicate
+together using a well defined interface. Modules can communicate through a
+facade classes (like libraries usually do), or through eventing system. Both
+ways are important.
+
+The main question is: how do we want to define the interface and how to design
+the communication channels?
+
+It is one of our goals to make it possible to plug modules out, and operate
+some of them as separate services. This will make it easier deploy GitLab.com
+in the future and scale key domains. One possible way to achieve this goal
+would be to design the inter-module communication using a protobuf as an
+interface and gRPC as a communication channel. When modules are plugged-in, we
+would bypass gRPC and serialization and use in-process communication primitives
+(while still using protobuf as an interface). When a module gets plugged-out,
+gRPC would carry messages between modules.
+
+## Use Packwerk to enforce module boundaries
+
+Packwerk is a static analyzer that helps defining and enforcing module boundaries
+in Ruby.
+
+[In this PoC merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/98801)
+we demonstrate a possible directory structure of the monolith broken down into separate
+modules.
+
+The PoC also aims to solve the problem of EE extensions (and JH too) allowing the
+Rails autoloader to be tweaked depending on whether to load only the Core codebase or
+any extensions.
+
+The PoC also attempted to only move a small part of the `Ci::` namespace into a
+`components/ci` Packwerk package. This seems to be the most iterative approach
+explored so far.
+
+There are different approaches we could use to adopt Packwerk. Other PoC's also
+explored are the [large extraction of CI package](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/88899)
+and [moving the 2 main CI classes into a package](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90595).
+
+All 3 PoC's have a lot in common, from the introduction of Packwerk packages and configurations
+to setting paths for the autoloader to work with any packages. What changes between the
+various merge requests is the approach on choosing which files to move first.
+
+The main goals of the PoC were:
+
+- understand if Packwerk can be used on the GitLab codebase.
+- understand the learning curve for developers.
+- verify support for EE and JH extensions.
+- allow gradual modularization.
+
+### Positive results
+
+- Using Packwerk would be pretty simple on GitLab since it's designed primarily to work
+ on Rails codebases.
+- We can change the organization of the domain code to be module-oriented instead of following
+ the MVC pattern. It requires small initial changes to allow the Rails autoloading
+ to support the new directory structure, which is by the way not imposed by Packwerk.
+ After that, registering a new top-level package/bounded-context would be a 1 LOC change.
+- Using the correct directory structure indicated in the [PoC](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/98801)
+ allows packages to contain all the code, including EE and JH extensions.
+- Gradual modularization is possible and we can have any degree of modularization as we want,
+ from initial no enforcement down to complete isolation simulating an in-memory micro-service environment.
+- Moving files into a Packwerk package doesn't necessarily mean renaming constants.
+ While this is not advisable long term, its an extra flexibility that the tool provides.
+ - For example: If we are extracting the `Ci::` module into a Packwerk package there can be
+ constants that belong to the CI domain but are not namespaced, like `CommitStatus` or
+ that have a different namespace, like `Gitlab::Ci::`.
+ Packwerk allows such constants to be moved inside the `ci` package and correctly flags
+ boundary violations.
+ - Packwerk enhancements from RubyAtScale tooling allow to enforce that all constants inside
+ a package share the same Ruby namespace. We eventually would want to leverage that.
+- RubyAtScale provides also tools to track metrics about modularization and adoption which we
+ would need to monitor and drive as an engineering organization.
+- Packwerk has IDE extensions (e.g. for VSCode) to provide realtime feedback on violations
+ (like Rubocop). It can also be run via CLI during the development workflow against a single
+ package. It could be integrated into pre-push Git hooks or Danger during code reviews.
+
+### Challenges
+
+Some of these challenges are not specific to Packwerk as tool/approach. They were observed
+during the PoC and are more generically related to the process of modularization:
+
+- There is no right or wrong approach when introducing Packwerk packages. We need to define
+ clear guidelines to give developers the tools to make the best decision:
+ - Sometimes it could be creating an empty package and move files in it gradually.
+ - Sometimes it could be wrapping an already well designed and isolated part of the codebase.
+ - Sometimes it could be creating a new package from scratch.
+- As we move code to a different directory structure we need to involve JiHu as they manage
+ extensions following the current directory structure.
+ We may have modules that are partially migrated and we need to ensure JiHu is up-to-date
+ with the current progresses.
+- After privacy/dependency checks are enabled, Packwerk will log a lot of violations
+ (like Rubocop TODOs) since constant references in a Rails codebase are very entangled.
+ - The team owning the package needs to define a vision for the package.
+ What would the package look like once all violations have been fixed?
+ This may mean specifying where the package fits in the
+ [context map](https://www.oreilly.com/library/view/what-is-domain-driven/9781492057802/ch04.html)
+ of the system. How the current package should be used by another package `A` and how
+ it should use other packages.
+ - The vision above should tell developers how they should fix these violations over time.
+ Should they make a specific constant public? Should the package list another package as its
+ dependencies? Should events be used in some scenarios?
+ - Teams will likely need guidance in doing that. We may need to have a team of engineers, like
+ maintainers with a very broad understanding of the domains, that will support engineering
+ teams in this effort.
+- Changes to CI configurations on tuning Knapsack and selective testing were ignored durign the
+ PoC.
+
+## Frontend sorting hat
+
+Frontend sorting-hat is a PoC for combining multiple domains to render a full
+page of GitLab (with menus, and items that come from multiple separate
+domains).
+
+## Frontend assets aggregation
+
+Frontend assets aggregation is a PoC for a possible separation of micro-frontends.
diff --git a/doc/architecture/blueprints/modular_monolith/references.md b/doc/architecture/blueprints/modular_monolith/references.md
new file mode 100644
index 00000000000..2c7d3dc972d
--- /dev/null
+++ b/doc/architecture/blueprints/modular_monolith/references.md
@@ -0,0 +1,70 @@
+---
+status: proposed
+creation-date: "2023-06-21"
+authors: [ "@fabiopitino" ]
+coach: [ ]
+approvers: [ ]
+owning-stage: ""
+---
+
+# References
+
+## Related design docs
+
+- [Composable codebase design doc](../composable_codebase_using_rails_engines/index.md)
+
+## Related Issues
+
+- [Split GitLab monolith into components](https://gitlab.com/gitlab-org/gitlab/-/issues/365293)
+- [Make it simple to build and use "Decoupled Services"](https://gitlab.com/gitlab-org/gitlab/-/issues/31121)
+- [Use nested structure to organize CI classes](https://gitlab.com/gitlab-org/gitlab/-/issues/209745)
+- [Create new models / classes within a module / namespace](https://gitlab.com/gitlab-org/gitlab/-/issues/212156)
+- [Make teams to be maintainers of their code](https://gitlab.com/gitlab-org/gitlab/-/issues/25872)
+- [Add backend guide for Dependency Injection](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/73644)
+
+## Internal Slack Channels
+
+- [`#modular_monolith`](https://gitlab.slack.com/archives/C03NTK6HZBM)
+- [`#architecture`](https://gitlab.slack.com/archives/CJ4DB7517)
+
+## Reference Implementations / Guides
+
+Gusto / RubyAtScale:
+
+- [RubyAtScale toolchain for modularization](https://github.com/rubyatscale)
+- [Gusto's engineering blog](https://engineering.gusto.com/laying-the-cultural-and-technical-foundation-for-big-rails/)
+- [Gradual modularization](https://gradualmodularization.com/) (successor to CBRA)
+- [Component-Based Rails Applications](https://cbra.info) ("deprecated")
+
+Shopify:
+
+- [Packwerk](https://github.com/Shopify/packwerk)
+- [Shopify's jurney to modularization](https://shopify.engineering/shopify-monolith)
+- [Internal GitLab doc transcript of an AMA with a Shopify engineer](https://docs.google.com/document/d/1uZbcaK8Aqs-D_n7_uQ5XE295r5UWDJEBwA6g5bTjcwc/edit#heading=h.d1tml5rlzrpa)
+
+Domain-Driven Rails / Rails Event Store:
+
+Rails Event Store is relevant because it is a mechanism to achieve many
+of the goals discussed here, and is based upon patterns used by Arkency
+to build production applications.
+
+This doesn't mean we need to use this specific framework or approach.
+
+However, the general concepts of DDD/ES/CQRS are important and in some
+cases maybe necessary to achieve the goals of this blueprint, so it's
+useful to have concrete production-proven implementations of those
+concepts to look at as an example.
+
+- [Arkency's domain-driven Rails](https://products.arkency.com/domain-driven-rails/)
+- [Arkency's Rails Event Store](https://railseventstore.org)
+
+App Continuum:
+
+An illustration of how an application can evolve from a small, unstructured app, through various
+stages including a modular well-structured monolith, all the way to a microservices architecture.
+
+Includes discussion of why you might want to stop at various stages, and specifically the
+challenges/concerns with making the jump to microservices, and why sticking with a
+well-structured monolith may be preferable in many cases.
+
+- [App Continuum](https://www.appcontinuum.io)
diff --git a/doc/architecture/blueprints/object_pools/index.md b/doc/architecture/blueprints/object_pools/index.md
index d14e11b8d36..7b7f8d7d180 100644
--- a/doc/architecture/blueprints/object_pools/index.md
+++ b/doc/architecture/blueprints/object_pools/index.md
@@ -805,10 +805,10 @@ pools as it will always match the contents of the upstream repository.
It has a number of downsides though:
-- Normal repositories can now have different states, where some of the
+- Repositories can now have different states, where some of the
repositories are allowed to prune objects and others aren't. This introduces a
source of uncertainty and makes it easy to accidentally delete objects in a
- normal repository and thus corrupt its forks.
+ repository and thus corrupt its forks.
- When upstream repositories go private we must stop updating objects which are
supposed to be deduplicated across members of the fork network. This means
diff --git a/doc/architecture/blueprints/observability_tracing/arch.png b/doc/architecture/blueprints/observability_tracing/arch.png
new file mode 100644
index 00000000000..36ff23dc8a5
--- /dev/null
+++ b/doc/architecture/blueprints/observability_tracing/arch.png
Binary files differ
diff --git a/doc/architecture/blueprints/observability_tracing/index.md b/doc/architecture/blueprints/observability_tracing/index.md
new file mode 100644
index 00000000000..4291683f83f
--- /dev/null
+++ b/doc/architecture/blueprints/observability_tracing/index.md
@@ -0,0 +1,171 @@
+---
+status: proposed
+creation-date: "2023-06-20"
+authors: [ "@mappelman" ]
+approvers: [ "@hbenson", "@nicholasklick" ]
+owning-stage: "~devops::monitor"
+participating-stages: []
+---
+
+# Distributed Tracing Feature
+
+## Summary
+
+GitLab already has distributed tracing as a feature. So this proposal focuses on the intended changes required to GA the feature. Given the strategic direction update which is covered more in the motivation section, we are deprecating the GitLab Observability UI (GOUI) in favor of building native UI for tracing in GitLab UI.
+
+This proposal covers the scope and technical approach to what will be released in GA, including the new UI, API changes and any backend changes to support the new direction.
+
+Distributed Tracing will GA as a premium feature, initially only available to premium and ultimate users.
+
+## Motivation
+
+In December 2021 GitLab acquired OpsTrace and kicked off work integrating Observability functionality into the DevOps platform. At that point the stated goal was to create an observability distribution that could be run independently of GitLab and which integrated well into the DevSecOps platform. See [Internal Only- Argus FAQ](https://docs.google.com/document/d/1eWZhbRdgQx74udzZjpSMgWnHfpYWETD7AWqnPVD5Sm8/edit) for more background on previous strategy.
+
+Since December 2021 there have been a lot of changes in the world and at GitLab. It is GitLabs belief that Observability should be natively built within GitLab UI to avoid fracturing capabilities and ensuring a singular UX. As such we are deprecating GitLab Observability UI which began life as a fork of Grafana in December 2021.
+
+Much of the GitLab Observability architecture and features were built around the fork of Grafana. As such, this proposal is part of a series of proposals that align us toward achieving the following high level objectives.
+
+## Observability Group Objectives
+
+The following group-level objectives are included for context. **The Objectives below are not completely covered by this design. This design focuses on distributed tracing. More design documents will be created for logging, metrics, auto-monitor, etc.**
+
+**Timeline**: Completion of the following before December 2024
+
+**Objectives**:
+
+- GA of a Complete (Metrics, Logs, Traces) Observability Platform - Add on-by-default setup for tracing, metrics and logging including a GA for the service available on GitLab.com and for self-managed users. A user is able to trace micro-services or distributed systems using open-source tracers. Furthermore, users should be able to set sane defaults for sampling or use advanced techniques such as tail-based sampling.
+
+- Tailored Triage Workflow - Users need to connect the dots between Metrics, Logs, and Spans/Traces. Designing for the discovery, querying and the connection of all telemetry data, regardless of type, will aid users to resolve critical alerts and incidents more quickly.
+
+- Auto Monitor - When a developer starts a new project their application is automatically instrumented, alerts are set up and linked to GitLab alerts management, schedules are created and incidents are created for critical alerts.
+
+### Goals
+
+To release a generally available distributed tracing feature as part of GitLab.com SaaS with a minimum featureset such that it is valuable but can be iterated upon.
+
+Specific goals:
+
+- An HTTPS write API implemented in the [GitLab Observability Backend](https://GitLab.com/GitLab-org/opstrace/opstrace) project which receives spans sent to GitLab using [OTLP (OpenTelemetry Protocol)](https://opentelemetry.io/docs/specs/otel/protocol/). Users can collect and send distributed traces using either the [OpenTelemetry SDK](https://opentelemetry.io/docs/collector/deployment/no-collector/) or the [OpenTelemetry Collector](https://opentelemetry.io/docs/collector/).
+- UI to list and filter/search for traces by ID, service, attributes or time
+- UI to show a detail view of a trace and its corresponding spans
+- Apply sensible ingestion and storage limits per top-level namespace for all GitLab tiers
+
+## Timeline
+
+In order to achieve the group objectives, the following timelines must be met for [GitLab phased rollout](https://about.GitLab.com/handbook/product/GitLab-the-product/#experiment-beta-ga) of Tracing.
+
+- **Tracing Experiment Release**: 16.2
+- **Tracing Beta Release**: 16.3
+- **Tracing GA Release**: 16.4
+
+## Proposal
+
+Much of the proposed architecture already exists and is in operation for GitLab.com. Distributed tracing has already been in an internal **Beta** for quite some time and has internal users, with graduation to GA being blocked by UX requirements. These UX requirements resulted in the new UI strategy.
+
+ The following diagram outlines the architecture for GitLab Observability Backend and how clients, including the GitLab UI, will interact with it.
+
+<img src="./arch.png">
+
+### Key Components
+
+- Gatekeeper: Responsible for authentication, authorization and rate limit enforcement on all incoming requests. NGINX-Ingress interacts directly with Gatekeeper.
+- Ingress: NGINX-Ingress is used to handle all incoming requests
+- ClickHouse: ClickHouse is the backing store for all observability data
+- Query Service: A horizontally scalable service that retrieves data from ClickHouse in response to a query
+- GitLab UI: The UI hosted at GitLab.com
+- Redis: An HA Redis cluster for caching GitLab API responses
+
+### Data Ingest
+
+One data ingestion pipeline will be deployed for each top level GitLab namespace. Currently we deploy one pipeline _per GitLab Group that enables observability_ and this architecture is now unnecessarily expensive and complex without the presence of the multi-tenant Grafana instances. This multi-tenant ingestion system has the following benefits:
+
+- Beyond rate limits, resource limits can be enforced per user such that no user can steal more system resources (memory, cpu) than allocated.
+- Fine grained control of horizontal scaling for each user pipeline by adding more OTEL Collector instances
+- Manage the users tenant in accordance to GitLab subscription tier, for example, quota, throughput, cold storage, shard to different databases
+- Reduced complexity and enhanced security in the pipeline by leveraging off the shelf components like the [OpenTelemetry Collector](https://opentelemetry.io/docs/concepts/components/#collector) where data within that collector belongs to no more than a single user/customer.
+
+A pipeline is only deployed for the user upon enabling observability in the project settings, in the same way a user can enable error tracking for their project. When observability is enabled for any project in the users namespace, a pipeline will be deployed. This deployment is automated by our Kubernetes scheduler-operator and tenant-operator. Provisioning is currently managed through the iframe, but a preferred method would be to provision using a RESTful API. The GitLab UI would have a section in project settings that allow a user to "enable observability", much like they do for error tracking today.
+
+The opentelemetry collector is used as the core pipeline implementation for its excellent community development of receivers, processors and exporters. [An exporter for ClickHouse has emerged in the community](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/clickhouseexporter) which we intend to leverage and it currently has support for opentelemetry traces, metrics and logs. This will help accelerate the effort toward ingesting not just traces but also metrics and logs.
+
+### Limits
+
+In addition to the existing cpu and memory limits for each ingest pipeline, the following limits and quotas will also be enforced:
+
+- 100KB (possibly increase this to 1MB) total ingest rate of traces per second per top level namespace
+- 30 day data retention
+- TBD GB total storage
+
+All above limits are subject to change and will be driven by top level namespace configuration so scripts and future features can be built to make these more dynamic for each user or subscription tier. This configuration will be part of the tenant-operator custom resource.
+
+The ingest rate limit will utilize the internal Redis cluster to perform a simple, performant [sliding window rate limit like Cloudflare](https://blog.cloudflare.com/counting-things-a-lot-of-different-things/). The code for this will live in Gatekeeper, where a connection to Redis is already managed.
+
+The data retention and total storage limits will be enforced by a control loop in the tenant-operator that will periodically query ClickHouse and continuously delete the oldest whole day of data until quota is no longer exceeded. To do this efficiently, its important that ClickHouse tables are partitioned using `toDate(timestamp)` to partition by day.
+
+### Query API
+
+The query API, backed by the query service, will be a centralized, horizontally scalable component responsible for returning traces/spans back to the UI. A good starting point for this query service may be to leverage the Jaeger query service code and the [Jaeger query service swagger](https://github.com/Jaegertracing/Jaeger-idl/blob/main/swagger/api_v3/query_service.swagger.json). This query service will be extended to include support for metrics and logs in the future and will be queried directly by vue.js code in GitLab UI.
+
+The scope of effort for GA would include two APIs:
+
+- `/v1/traces` adhering to [this spec](https://github.com/Jaegertracing/Jaeger-idl/blob/main/swagger/api_v3/query_service.swagger.json#L64)
+- `/v1/traces/{trace_ID}` adhering to [this spec](https://github.com/Jaegertracing/Jaeger-idl/blob/main/swagger/api_v3/query_service.swagger.json#L142)
+
+### Authentication and Authorization
+
+<!-- markdownlint-disable-next-line MD044 -->
+GitLab Observability Backend utilizes an [instance-wide trusted GitLab OAuth](https://docs.GitLab.com/ee/integration/OAuth_provider.html#create-an-instance-wide-application) token to perform a seamless OAuth flow that authenticates the GitLab user against the GitLab Observability Backend (GOB). GOB creates an auth session and stores the session identifier in an http-only, secure cookie. This mechanism has already been examined and approved by AppSec. Now that the Observability UI will be native within the UI hosted at GitLab.com, a few small adjustments must be made for authentication to work against the new UI domain vs the embedded iframe that we previously relied upon (GitLab.com instead of observe.gitLab.com).
+
+A hidden iframe will be embedded in the GitLab UI only on pages where GOB authenticated APIs must be consumed. This allows GitLab.com UI to directly communicate with GOB APIs without the need for an intermediate proxy layer in rails and without relying on the less secure shared token between proxy and GOB. This iframe will be hidden and its sole purpose is to perform the OAuth flow and assign the http-only secure cookie containing the GOB user session. This flow is seamless and can be fully hidden from the user since its a **trusted** GitLab OAuth flow. Sessions currently expire after 30 days which is configurable in GOB deployment terraform.
+
+<!-- markdownlint-disable-next-line MD044 -->
+In order to allow requests from GitLab.com directly to observe.gitLab.com using this method, all requests will have to include `{withCredentials: true}` in order to include cookies. For these "readonly" APIs that GitLab.com will query for tracing data, we must:
+
+- Configure Ingress with `"NGINX.Ingress.Kubernetes.io/cors-allow-credentials": "true"` and `"NGINX.Ingress.Kubernetes.io/cors-allow-origin": "GitLab.com"`
+- Ensure we have effective CSRF protection enabled in our Gatekeeper component (Gatekeeper is responsible request authorization)
+
+<!-- markdownlint-disable-next-line MD044 -->
+All requests from GitLab.com will then include the GOB session cookie for observe.gitLab.com to validate. Authorization is handled by the Gatekeeper component which checks group/project membership against GitLab and handles access appropriately. Anyone with inherited developer or above membership will have access to the tracing UI for that project.
+
+### Database Schema
+
+[The community developed OTEL exporter for ClickHouse](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/clickhouseexporter) has already implemented database schemas for storing traces and spans. [This blog post from ClickHouse](https://clickhouse.com/blog/storing-traces-and-spans-open-telemetry-in-clickhouse) further delves into the details of the community developed exporter and we intend to use the suggested schema design as a starting point for us to test during experiment and beta phases. It's recommended to read the blog post to learn more about the schemas and corresponding SQL queries we intend to try.
+
+### UI Design
+
+The new UI will be built using the Pajamas Design System in accordance with GitLab UX design standards. The UI will interact with the GOB query service directly from vue.js (see architecture diagram above) by sending a fetch to the subdomain `observe.gitLab.com/v1/query` with `{withCredentials: true}`. See the Authentication and Authorization section above for more details on how this is enabled.
+
+[**TODO Figma UI designs and commentary**]
+
+## Iterations
+
+16.2
+
+- migrate all resources attached to the Group CR to the Tenant CR
+- [fork and build Clickhouse exporter](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/clickhouseexporter)
+- add project_ID to all traces/spans
+- gatekeeper: check membership at project level instead of group level
+- basic query service for listing traces (no filtering/searching)
+- implement hidden iframe-based OAuth mechanism (reuse/adapt what already done for GOUI)
+- UI for traces list
+
+16.3
+
+- filtering/searching query service (by traceID, service, status, duration min/max, start/end time, span attributes)
+- add `read_observability` and `write_observability` scopes to Project access token and support Project access token for writing to project level ingest API
+- provision API
+- remove existing iframe provisioning
+- UI for trace detail
+- UI for filtering/searching traces
+- basic e2e test for provision, send data, query in UI
+- metrics, dashboards, alerts
+
+16.4
+
+- UI settings page to "enable observability" (this would interact with provisioning API)
+- production readiness review
+- documentation complete
+- alter GitLabNamespace CR to only represent a tenant (i.e. top level namespace)
+- delete Group CR and corresponding controller
+- e2e tests that haven't been added yet
+- in cluster smoke test
diff --git a/doc/architecture/blueprints/organization/index.md b/doc/architecture/blueprints/organization/index.md
index be99211754d..2cfaf33ff50 100644
--- a/doc/architecture/blueprints/organization/index.md
+++ b/doc/architecture/blueprints/organization/index.md
@@ -16,23 +16,23 @@ This document is a work in progress and represents the current state of the Orga
## Glossary
-- Organization: An Organization is the umbrella for one or multiple top-level groups. Organizations are isolated from each other by default meaning that cross-namespace features will only work for namespaces that exist in a single Organization.
-- Top-level group: Top-level group is the name given to the topmost group of all other groups. Groups and projects are nested underneath the top-level group.
+- Organization: An Organization is the umbrella for one or multiple top-level Groups. Organizations are isolated from each other by default meaning that cross-Namespace features will only work for Namespaces that exist in a single Organization.
+- Top-level Group: Top-level Group is the name given to the topmost Group of all other Groups. Groups and Projects are nested underneath the top-level Group.
- Cell: A Cell is a set of infrastructure components that contains multiple Organizations. The infrastructure components provided in a Cell are shared among Organizations, but not shared with other Cells. This isolation of infrastructure components means that Cells are independent from each other.
-- User: An Organization has many users. Joining an Organization makes someone a user of that Organization.
-- Member: Adding a user to a group or project within an Organization makes them a member. Members are always users, but users are not necessarily members of a group or project within an Organization. For instance, a user could just have accepted the invitation to join an Organization, but not be a member of any group or project it contains.
-- Non-user: A non-user of an Organization means a user is not part of that specific Organization.
+- User: An Organization has many Users. Joining an Organization makes someone a User of that Organization.
+- Member: Adding a User to a Group or Project within an Organization makes them a Member. Members are always Users, but Users are not necessarily Members of a Group or Project within an Organization. For instance, a User could just have accepted the invitation to join an Organization, but not be a Member of any Group or Project it contains.
+- Non-User: A Non-User of an Organization means a User is not part of that specific Organization.
## Summary
Organizations solve the following problems:
-1. Enables grouping of top-level groups. For example, the following top-level groups would belong to the Organization `GitLab`:
+1. Enables grouping of top-level Groups. For example, the following top-level Groups would belong to the Organization `GitLab`:
1. `https://gitlab.com/gitlab-org/`
1. `https://gitlab.com/gitlab-com/`
-1. Allows different Organizations to be isolated. Top-level groups of the same Organization can interact with each other but not with groups in other Organizations, providing clear boundaries for an Organization, similar to a self-managed instance. Isolation should have a positive impact on performance and availability as things like user dashboards can be scoped to Organizations.
+1. Allows different Organizations to be isolated. Top-level Groups of the same Organization can interact with each other but not with Groups in other Organizations, providing clear boundaries for an Organization, similar to a self-managed instance. Isolation should have a positive impact on performance and availability as things like User dashboards can be scoped to Organizations.
1. Allows integration with Cells. Isolating Organizations makes it possible to allocate and distribute them across different Cells.
-1. Removes the need to define hierarchies. An Organization is a container that could be filled with whatever hierarchy/entity set makes sense (Organization, top-level groups, etc.)
+1. Removes the need to define hierarchies. An Organization is a container that could be filled with whatever hierarchy/entity set makes sense (Organization, top-level Groups, etc.)
1. Enables centralized control of user profiles. With an Organization-specific user profile, administrators can control the user's role in a company, enforce user emails, or show a graphical indicator that a user as part of the Organization. An example could be adding a "GitLab employee" stamp on comments.
1. Organizations bring an on-premise-like experience to SaaS (GitLab.com). The Organization admin will have access to instance-equivalent Admin Area settings with most of the configuration controlled on Organization level.
@@ -43,19 +43,19 @@ Organizations solve the following problems:
The Organization focuses on creating a better experience for Organizations to manage their GitLab experience. By introducing Organizations and [Cells](../cells/index.md) we can improve the reliability, performance and availability of our SaaS Platforms.
- Wider audience: Many instance-level features are admin only. We do not want to lock out users of GitLab.com in that way. We want to make administrative capabilities that previously only existed for self-managed users available to our SaaS users as well. This also means we would give users of GitLab.com more independence from GitLab.com admins in the long run. Today, there are actions that self-managed admins can perform that GitLab.com users have to request from GitLab.com admins.
-- Improved UX: Inconsistencies between the features available at the project and group levels create navigation and usability issues. Moreover, there isn't a dedicated place for Organization-level features.
-- Aggregation: Data from all groups and projects in an Organization can be aggregated.
-- An Organization includes settings, data, and features from all groups and projects under the same owner (including personal namespaces).
-- Cascading behavior: Organization cascades behavior to all the projects and groups that are owned by the same Organization. It can be decided at the Organization level whether a setting can be overridden or not on the levels beneath.
-- Minimal burden on customers: The addition of Organizations should not change existing group and project paths to minimize the impact of URL changes.
+- Improved UX: Inconsistencies between the features available at the Project and Group levels create navigation and usability issues. Moreover, there isn't a dedicated place for Organization-level features.
+- Aggregation: Data from all Groups and Projects in an Organization can be aggregated.
+- An Organization includes settings, data, and features from all Groups and Projects under the same owner (including personal Namespaces).
+- Cascading behavior: Organization cascades behavior to all the Projects and Groups that are owned by the same Organization. It can be decided at the Organization level whether a setting can be overridden or not on the levels beneath.
+- Minimal burden on customers: The addition of Organizations should not change existing Group and Project paths to minimize the impact of URL changes.
### Non-Goals
-Due to urgency of delivering Organizations as a prerequisite for Cells, it is currently not a goal to build Organization functionality on the namespace framework.
+Due to urgency of delivering Organizations as a prerequisite for Cells, it is currently not a goal to build Organization functionality on the Namespace framework.
## Proposal
-We create Organizations as a new lightweight entity, with just the features and workflows which it requires. We already have much of the functionality present in groups and projects, and groups themselves are essentially already the top-level entity. It is unlikely that we need to add significant features to Organizations outside of some key settings, as top-level groups can continue to serve this purpose at least on SaaS.
+We create Organizations as a new lightweight entity, with just the features and workflows which it requires. We already have much of the functionality present in Groups and Projects, and Groups themselves are essentially already the top-level entity. It is unlikely that we need to add significant features to Organizations outside of some key settings, as top-level Groups can continue to serve this purpose at least on SaaS. From an infrastructure perspective, cluster-wide shared data must be both minimal (small in volume) and infrequently written.
```mermaid
graph TD
@@ -72,14 +72,30 @@ Self-managed instances would set a default Organization.
### Benefits
-- No changes to URL's for groups moving under an Organization, which makes moving around top-level groups very easy.
-- Low risk rollout strategy, as there is no conversion process for existing top-level groups.
+- No changes to URL's for Groups moving under an Organization, which makes moving around top-level Groups very easy.
+- Low risk rollout strategy, as there is no conversion process for existing top-level Groups.
- Organization becomes the key for identifying what is part of an Organization, which is likely on its own table for performance and clarity.
### Drawbacks
-- It is unclear right now how we would avoid continuing to spend effort to build instance (or not Organization) features, in particular much of the reporting. This is not an issue on SaaS as top-level groups already have this capability, however it is a challenge on self-managed. If we introduce a built-in Organization (or just none at all) for self-managed, it seems like we would need to continue to build instance/Organization level reporting features as we would not get that for free along with the work to add to groups.
-- Billing may need to be moved from top-level groups to Organization level.
+- It is unclear right now how we would avoid continuing to spend effort to build instance (or not Organization) features, in particular much of the reporting. This is not an issue on SaaS as top-level Groups already have this capability, however it is a challenge on self-managed. If we introduce a built-in Organization (or just none at all) for self-managed, it seems like we would need to continue to build instance/Organization level reporting features as we would not get that for free along with the work to add to Groups.
+- Billing may need to be moved from top-level Groups to Organization level.
+
+## Data Exploration
+
+From an initial [data exploration](https://gitlab.com/gitlab-data/analytics/-/issues/16166#note_1353332877), we retrieved the following information about Users and Organizations:
+
+- For the users that are connected to an organization the vast majority of them (98%) are only associated with a single organization. This means we expect about 2% of Users to navigate across multiple Organizations.
+- The majority of Users (78%) are only Members of a single top-level Group.
+- 25% of current top-level Groups can be matched to an organization.
+ - Most of these top-level Groups (83%) are associated with an organization that has more than one top-level Group.
+ - Of the organizations with more than one top-level Group the (median) average number of top-level Groups is 3.
+ - Most top-level Groups that are matched to organizations with more than one top-level Group are assumed to be intended to be combined into a single organization (82%).
+ - Most top-level Groups that are matched to organizations with more than one top-level Group are using only a single pricing tier (59%).
+- Most of the current top-level Groups are set to public visibility (85%).
+- Less than 0.5% of top-level Groups share Groups with another top-level Group. However, this means we could potentially break 76,000 links between top-level Groups by introducing the Organization.
+
+Based on this analysis we expect to see similar behavior when rolling out Organizations.
## Design and Implementation Details
@@ -88,40 +104,116 @@ Self-managed instances would set a default Organization.
The Organization MVC will contain the following functionality:
- Instance setting to allow the creation of multiple Organizations. This will be enabled by default on GitLab.com, and disabled for self-managed GitLab.
-- Every instance will have a default organization. Initially, all users will be managed by this default Organization.
-- Organization Owner. The creation of an Organization appoints that user as the Organization Owner. Once established, the Organization Owner can appoint other Organization Owners.
-- Organization users. A user is managed by one Organization, but can be part of multiple Organizations. Users are able to navigate between the different Organizations they are part of.
-- Setup settings. Containing the Organization name, ID, description, README, and avatar. Settings are editable by the Organization Owner.
-- Setup flow. Users are able to build an Organization on top of an existing top-level group. New users are able to create an Organization from scratch and to start building top-level groups from there.
-- Visibility. Options will be `public` and `private`. A nonuser of a specific Organization will not see private Organizations in the explore section. Visibility is editable by the Organization Owner.
+- Every instance will have a default organization. Initially, all Users will be managed by this default Organization.
+- Organization Owner. The creation of an Organization appoints that User as the Organization Owner. Once established, the Organization Owner can appoint other Organization Owners.
+- Organization Users. A User is managed by one Organization, but can be part of multiple Organizations. Users are able to navigate between the different Organizations they are part of.
+- Setup settings. Containing the Organization name, ID, description, and avatar. Settings are editable by the Organization Owner.
+- Setup flow. Users are able to build an Organization on top of an existing top-level Group. New Users are able to create an Organization from scratch and to start building top-level Groups from there.
+- Visibility. Options will be `public` and `private`. A Non-User of a specific Organization will not see private Organizations in the explore section. Visibility is editable by the Organization Owner.
- Organization settings page with the added ability to remove an Organization. Deletion of the default Organization is prevented.
-- Groups. This includes the ability to create, edit, and delete groups, as well as a Groups overview that can be accessed by the Organization Owner.
-- Projects. This includes the ability to create, edit, and delete projects, as well as a Projects overview that can be accessed by the Organization Owner.
+- Groups. This includes the ability to create, edit, and delete Groups, as well as a Groups overview that can be accessed by the Organization Owner.
+- Projects. This includes the ability to create, edit, and delete Projects, as well as a Projects overview that can be accessed by the Organization Owner.
### Organization Access
#### Organization Users
-Organization Users can get access to groups and projects as:
+Organization Users can get access to Groups and Projects as:
-- A group member: this grants access to the group and all its projects, regardless of their visibility.
-- A project member: this grants access to the project, and limited access to parent groups, regardless of their visibility.
-- A non-member: this grants access to public and internal groups and projects of that Organization. To access a private group or project in an Organization, a user must become a member.
+- A Group Member: this grants access to the Group and all its Projects, regardless of their visibility.
+- A Project Member: this grants access to the Project, and limited access to parent Groups, regardless of their visibility.
+- A Non-Member: this grants access to public and internal Groups and Projects of that Organization. To access a private Group or Project in an Organization, a User must become a Member.
Organization Users can be managed in the following ways:
-- As [Enterprise Users](../../../user/enterprise_user/index.md), managed by the Organization. This includes control over their user account and the ability to block the user.
-- As Non-Enterprise Users, managed by the Default Organization. Non-Enterprise Users can be removed from an Organization, but the user keeps ownership of their user account.
+- As [Enterprise Users](../../../user/enterprise_user/index.md), managed by the Organization. This includes control over their User account and the ability to block the User.
+- As Non-Enterprise Users, managed by the Default Organization. Non-Enterprise Users can be removed from an Organization, but the User keeps ownership of their User account.
Enterprise Users are only available to Organizations with a Premium or Ultimate subscription. Organizations on the free tier will only be able to host Non-Enterprise Users.
+##### How do Users join an Organization?
+
+Users are visible across all Organizations. This allows Users to move between Organizations. Users can join an Organization by:
+
+1. Becoming a Member of a Namespace (Group, Subgroup, or Project) contained within an Organization. A User can become a Member of a Namespace by:
+
+ - Being invited by username
+ - Being invited by email address
+ - Requesting access. This requires visibility of the Organization and Namespace and must be accepted by the owner of the Namespace. Access cannot be requested to private Groups or Projects.
+
+1. Becoming an Enterprise Users of an Organization. Bringing Enterprise Users to the Organization level is planned post MVC.
+
+##### When can Users see an Organization?
+
+##### What can Users see in an Organization?
+
+Users can see the things that they have access to in an Organization. For instance, an Organization User would be able to access only the private Groups and Projects that they are a Member of, but could see all public Groups and Projects. Actionable items such as issues, merge requests and the to-do list are seen in the context of the Organization. This means that a User might see 10 merge requests they created in `Organization A`, and 7 in `Organization B`, when in total they have created 17 merge requests across both Organizations.
+
+##### What is a Billable Member?
+
+How Billable Members are defined differs between GitLabs two main offerings:
+
+- Self-managed (SM): [Billable Members are Users who consume seats against the SM License](../../../subscriptions/self_managed/index.md#subscription-seats). Custom roles elevated above the Guest role are consuming seats.
+- GitLab.com (SaaS): [Billable Members are Users who are Members of a Namespace (Group or Project) that consume a seat against the SaaS subscription for the top-level Group](../../../subscriptions/gitlab_com/index.md#how-seat-usage-is-determined). Currently, [Users with Minimal Access](../../../user/permissions.md#users-with-minimal-access) and Users without a Group count towards a licensed seat, but [that's changing](https://gitlab.com/gitlab-org/gitlab/-/issues/330663#note_1133361094).
+
+These differences and how they are calculated and displayed often cause confusion. For both SM and SaaS, we evaluate whether a User consumes a seat against the same core rule set:
+
+1. They are active users
+1. They are not bot users
+1. For the Ultimate tier, they are not a Guest
+
+For (1) this is determined differently per offering, in terms of both what classifies as active and also due to the underlying model that we refer to (User vs Member).
+To help demonstrate the various associations used in GitLab relating to Billable Members, here is a relationship diagram:
+
+```mermaid
+graph TD
+ A[Group] <-.type of.- B[Namespace]
+ C[Project] -.belongs to.-> A
+
+ E[GroupMember] <-.type of.- D[Member]
+ G[User] -.has many.-> F
+ F -.belongs to.-> C
+ F[ProjectMember] <-.type of.- D
+ G -.has many.-> E -.belongs to.-> A
+
+ GGL[GroupGroupLink<br/> See note 1] -.belongs_to.->A
+ PGL[ProjectGroupLink<br/> See note 2] -.belongs_to.->A
+ PGL -.belongs_to.->C
+```
+
+GroupGroupLink is the join table between two Group records, indicating that one Group has invited the other.
+ProjectGroupLink is the join table between a Group and a Project, indicating the Group has been invited to the Project.
+
+SaaS has some additional complexity when it comes to the relationships that determine whether or not a User is considered a Billable Member, particularly relating to Group/Project membership that can often lead to confusion. An example of that are Members of a Group that have been invited into another Group or Project and therewith become billable.
+There are two charts as the flow is different for each: [SaaS](https://mermaid.live/view#pako:eNqNVl1v2jAU_StXeS5M-3hCU6N2aB3SqKbSPkyAhkkuxFsSs9hpVUX899mxYxsnlOWFcH1877nnfkATJSzFaBLtcvaSZKQS8DhdlWCeijGxXBCygCeOFdzSPCfbHOGrRK9Ho2tlvUkEfcZmo97HXBCBG6AcSGuOj86ZA8No_BP5eHQNMz7HYovV8kuGyR-gOx1I3Qd9Ap-31btrtgORITxIPnBXsfoAGcWKVEn2uj4T4Z6pAPdMdKyX8t2mIG-5ex0LkCnBdO4OOrOhO-O3TDQzrkkSkN9izW-BCCUTCB-8hGU866Bl45FxKJ-GdGiDDYI7SOtOp7o0GW90rA20NYjXQxE6cWSaGr1Q2BnX9hCnIbZWc1reJAly3pisMsJ19vKEFiQHfQw5PmMenwqhPQ5Uxa-DjeAa5IJk_g3t-hvdZ8jFA8vxrpYvccfWHIA6aVmrLtMQj2rvuqPynSZYcnx8PWDzlAuZsay3MfouPJxl1c9hKFCIPedzSBuH5fV2X5FDBrT8Zadk2bbszJur_xsp9UznzZRWmIizV-Njx346X9TbPpwoVqO9xobebUZmF3gse0yk9wA-jDBkflTst2TS-EyMTcrTZmGz7hPrkG8HdChdv1n5TAWmGuxHLmXI9qgTza9aO93-TVfnobAh1M6V0VDtuk7E0w313tMUy3Swc_Tyll9VLUwMPcFxUJGBNdKYTTTwY-ByesC_qusx1Yk0bXtao9kk8Snzj8eLsX0lwqV2ujnUE5Bw7FT4g7QbQGM-4YWoXPRZ2C7BnT4TXZPSiAHFUIP3nVhGbiN3G9-OyKWsTvpSS60yMYZA5U_HtyQzdy7p7GCBon65OyXNWJwT9DSNMwF7YB3Xly1o--gqKrAqCE3l359GHa4iuQ8KXEUT-ZrijtS5WEWr8iihpBZs8Vom0WRHco5XUX1IZd9NKZETUxjr8R82ROYl) and [SM](https://mermaid.live/view#pako:eNqFk1FvwiAQx7_KhefVD-CDZo2JNdmcWe3DYpeI7alsLRgKLob0u48qtqxRx9Plz4-7-3NgSCZyJEOyLcRPtqdSwXKScnBLVyhXswrUHiGxMYSsKOimwPHnXwiCYNQAsaIKzXOm2BFh3ShrOGvjujvQghAMPrAaBCOITKRLyu9Rc9FAc6Gu9VPegVELLEKzkOILMwWhUH6yRdhCcWJilEeWXSz5VJzcqrWycWvc830rOmdwnmZ8KoU-vEnXU6-bf6noPmResdzYWxdboHDeAiHBbfqOuqifonX6Ym-CV7g8HfAhfZ0U2-2xUu-iwKm2wdg4BRoJWAUXufZH5JnqH-8ye42YpFCsbGbvRN-Tx7UmunfxqFCfvZfTNeS9AfJESpQlZbn9K6Y5lxL7KUpMydCGOZXfKUl5bTmqlYhPPCNDJTU-EX3IrZEJoztJy4tY_wJJwxFj).
+
+##### How can Users switch between different Organizations?
+
+Users can utilize a [context switcher](https://gitlab.com/gitlab-org/gitlab/-/issues/411637). This feature allows easy navigation and access to different Organizations' content and settings. By clicking on the context switcher and selecting a specific Organization from the provided list, Users can seamlessly transition their view and permissions, enabling them to interact with the resources and functionalities of the chosen Organization.
+
+##### What happens when a User is deleted?
+
+We've identified three different scenarios where a User can be removed from an Organization:
+
+1. Removal: The User is removed from the organization_users table. This is similar to the User leaving a company, but the User can join the Organization again after access approval.
+1. Banning: The User is banned. This can happen in case of misconduct but the User cannot be added again to the Organization until they are unbanned. In this case, we keep the organization_users entry and change the permission to none.
+1. Deleting: The User is deleted. We assign everything the User has authored to the Ghost User and delete the entry from the organization_users table.
+
+As part of the Organization MVC, Organization Owners can remove Organization Users. This means that the User's membership entries are deleted from all Groups and Projects that are contained within the Organization. In addition, the User entry is removed from the `organization_users` table.
+
+Actions such as banning and deleting a User will be added to the Organization at a later point.
+
#### Organization Non-Users
-Non-users are external to the Organization and can only access the public resources of an Organization, such as public projects.
+Non-Users are external to the Organization and can only access the public resources of an Organization, such as public Projects.
### Routing
-Today only users, projects, namespaces and container images are considered routable entities which require global uniqueness on `https://gitlab.com/<path>/-/`. Initially, Organization routes will be [unscoped](../../../development/routing.md). Organizations will follow the path `https://gitlab.com/-/organizations/org-name/` as one of the design goals is that the addition of Organizations should not change existing group and project paths.
+Today only Users, Projects, Namespaces and container images are considered routable entities which require global uniqueness on `https://gitlab.com/<path>/-/`. Initially, Organization routes will be [unscoped](../../../development/routing.md). Organizations will follow the path `https://gitlab.com/-/organizations/org-name/` as one of the design goals is that the addition of Organizations should not change existing Group and Project paths.
+
+### Impact of the Organization on Other Features
+
+We want a minimal amount of infrequently written tables in the shared database. If we have high write volume or large amounts of data in the shared database then this can become a single bottleneck for scaling and we lose the horizontal scalability objective of Cells.
## Iteration Plan
@@ -129,48 +221,58 @@ The following iteration plan outlines how we intend to arrive at the Organizatio
### Iteration 1: Organization Prototype (FY24Q2)
-In iteration 1, we introduce the concept of an Organization as a way to group top-level groups together. Support for Organizations does not require any [Cells](../cells/index.md) work, but having them will make all subsequent iterations of Cells simpler. The goal of iteration 1 will be to generate a prototype that can be used by GitLab teams to test moving functionality to the Organization. It contains everything that is necessary to move an Organization to a Cell:
+In iteration 1, we introduce the concept of an Organization as a way to Group top-level Groups together. Support for Organizations does not require any [Cells](../cells/index.md) work, but having them will make all subsequent iterations of Cells simpler. The goal of iteration 1 will be to generate a prototype that can be used by GitLab teams to test moving functionality to the Organization. It contains everything that is necessary to move an Organization to a Cell:
- The Organization can be named, has an ID and an avatar.
-- Only non-enterprise user can be part of an Organization.
-- A user can be part of multiple Organizations.
+- Only a Non-Enterprise User can be part of an Organization.
+- A User can be part of multiple Organizations.
- A single Organization Owner can be assigned.
- Groups can be created in an Organization. Groups are listed in the Groups overview.
- Projects can be created in a Group. Projects are listed in the Projects overview.
### Iteration 2: Organization MVC Experiment (FY24Q3)
-In iteration 2, an Organization MVC Experiment will be released. We will test the functionality with a select set of customers and improve the MVC based on these learnings. Users will be able to build an Organization on top of their existing top-level group.
+In iteration 2, an Organization MVC Experiment will be released. We will test the functionality with a select set of customers and improve the MVC based on these learnings. Users will be able to build an Organization on top of their existing top-level Group.
-- The Organization has a description and a README.
+- The Organization has a description.
+- Organizations can be deleted.
+- Users can navigate between the different Organizations they are part of.
### Iteration 3: Organization MVC Beta (FY24Q4)
In iteration 3, the Organization MVC Beta will be released.
- Multiple Organization Owners can be assigned.
-- Enterprise users can be added to an Organization.
+- Organization Owners can change the visibility of an organization between `public` and `private`. A Non-User of a specific Organization will not see private Organizations in the explore section.
### Iteration 4: Organization MVC GA (FY25Q1)
+In iteration 4, the Organization MVC will be rolled out.
+
### Post-MVC Iterations
After the initial rollout of Organizations, the following functionality will be added to address customer needs relating to their implementation of GitLab:
1. Internal visibility will be made available on Organizations that are part of GitLab.com.
-1. Move billing from top-level group to Organization.
+1. Enterprise Users will be made available at the Organization level.
+1. Organizations are able to ban and delete Users.
+1. Projects can be created from the Organization-level Projects overview.
+1. Groups can be created from the Organization-level Groups overview.
+1. Move billing from top-level Group to Organization.
1. Audit events at the Organization level.
-1. Set merge request approval rules at the Organization level and cascade to all groups and projects.
+1. Set merge request approval rules at the Organization level and cascade to all Groups and Projects.
1. Security policies at the Organization level.
-1. Vulnerability reports at the Organization level.
+1. Vulnerability Report and Dependency List at the Organization level.
1. Cascading Organization setting to enforce security scans.
1. Scan result policies at the Organization level.
1. Compliance frameworks.
1. [Support the agent for Kubernetes sharing at the Organization level](https://gitlab.com/gitlab-org/gitlab/-/issues/382731).
+## Organization Rollout
+
## Alternative Solutions
-An alternative approach to building Organizations is to convert top-level groups into Organizations. The main advantage of this approach is that features could be built on top of the namespace framework and therewith leverage functionality that is already available at the group level. We would avoid building the same feature multiple times. However, Organizations have been identified as a critical driver of Cells. Due to the urgency of delivering Cells, we decided to opt for the quickest and most straightforward solution to deliver an Organization, which is the lightweight design described above. More details on comparing the two Organization proposals can be found [here](https://gitlab.com/gitlab-org/tenant-scale-group/group-tasks/-/issues/56).
+An alternative approach to building Organizations is to convert top-level Groups into Organizations. The main advantage of this approach is that features could be built on top of the Namespace framework and therewith leverage functionality that is already available at the Group level. We would avoid building the same feature multiple times. However, Organizations have been identified as a critical driver of Cells. Due to the urgency of delivering Cells, we decided to opt for the quickest and most straightforward solution to deliver an Organization, which is the lightweight design described above. More details on comparing the two Organization proposals can be found [here](https://gitlab.com/gitlab-org/tenant-scale-group/group-tasks/-/issues/56).
## Decision Log
diff --git a/doc/architecture/blueprints/rate_limiting/index.md b/doc/architecture/blueprints/rate_limiting/index.md
index db6bb85d839..f42a70aa97a 100644
--- a/doc/architecture/blueprints/rate_limiting/index.md
+++ b/doc/architecture/blueprints/rate_limiting/index.md
@@ -108,7 +108,7 @@ quota and by a policy.
- _Example:_ maximum artifact upload size of 1 GB
- **Quota:** A global constraint in application usage that is aggregated across an
entire namespace over the duration of their billing cycle.
- - _Example:_ 400 units of compute per namespace per month
+ - _Example:_ 400 compute minutes per namespace per month
- _Example:_ 10 GB transfer per namespace per month
- **Policy:** A representation of business logic that is decoupled from application
code. Decoupled policy definitions allow logic to be shared across multiple services
diff --git a/doc/architecture/blueprints/remote_development/index.md b/doc/architecture/blueprints/remote_development/index.md
index 16b71840f9e..ce55f23f828 100644
--- a/doc/architecture/blueprints/remote_development/index.md
+++ b/doc/architecture/blueprints/remote_development/index.md
@@ -215,7 +215,7 @@ end note
note top of "Load Balancer IP"
For local development,
it includes all local loopback interfaces
- e.g. 127.0.0.1, 172.16.123.1, 192.168.0.1, etc.
+ for example, 127.0.0.1, 172.16.123.1, 192.168.0.1, etc.
end note
@enduml
@@ -439,7 +439,7 @@ Stopped -up-> Starting : status=Starting
Terminated: Workspace has been deleted
-Failed: Workspace is not ready due to\nvarious reasons(e.g. crashing container)
+Failed: Workspace is not ready due to\nvarious reasons(for example, crashing container)
Failed -up-> Starting : status=Starting\n(container\nnot crashing)
Failed -right-> Stopped : status=Stopped
Failed -down-> Terminated : status=Terminated
diff --git a/doc/architecture/blueprints/repository_backups/index.md b/doc/architecture/blueprints/repository_backups/index.md
new file mode 100644
index 00000000000..afd86e4979c
--- /dev/null
+++ b/doc/architecture/blueprints/repository_backups/index.md
@@ -0,0 +1,268 @@
+---
+status: proposed
+creation-date: "2023-04-26"
+authors: [ "@proglottis" ]
+coach: "@DylanGriffith"
+approvers: []
+owning-stage: "~devops::systems"
+participating-stages: []
+---
+
+<!-- Blueprints often contain forward-looking statements -->
+<!-- vale gitlab.FutureTense = NO -->
+
+# Repository Backups
+
+<!-- For long pages, consider creating a table of contents. The `[_TOC_]`
+function is not supported on docs.gitlab.com. -->
+
+## Summary
+
+This proposal seeks to provide an out-of-a-box repository backup solution to
+GitLab that gives more opportunities to apply Gitaly specific optimisations. It
+will do this by moving repository backups out of `backup.rake` into a
+coordination worker that enumerates repositories and makes per-repository
+decisions to trigger repository backups that are streamed directly from Gitaly
+to object-storage.
+
+The advantages of this approach are:
+
+- The backups are only transferred once, from the Gitaly hosting the physical
+ repository to object-storage.
+- Smarter decisions can be made by leveraging specific repository access
+ patterns.
+- Distributes backup and restore load.
+- Since the entire process is run within Gitaly existing monitoring can be
+ used.
+- Provides architecture for future WAL archiving and other optimisations.
+
+This should relieve the major pain points of the existing two strategies:
+
+- `backup.rake` - Repository backups are streamed from outside of Gitaly using
+ RPCs and stored in a single large tar file. Due to the amount of data
+ transferred these backups are limited to small installations.
+- Snapshots - Cloud providers allow taking physical storage snapshots. These
+ are not an out-of-a-box solution as they are specific to the cloud provider.
+
+## Motivation
+
+### Goals
+
+- Improve time to create and restore repository backups.
+- Improve monitoring of repository backups.
+
+### Non-Goals
+
+- Improving filesystem based snapshots.
+
+### Filesystem based Snapshots
+
+Snapshots rely on cloud platforms to be able to take physical snapshots of the
+disks that Gitaly and Praefect use to store data. While never officially
+recommended this strategy tends to be used once creating or restoring backups
+using `backup.rake` takes too long.
+
+Gitaly and Git use lock files and fsync in order to prevent repository
+corruption from concurrent processes and partial writes from a crash. This
+generally means that if a file is written, then it will be valid. However,
+because Git repositories are composed of many files and many write operations
+may be taking place, it would be impossible to schedule a snapshot while no
+file operations are ongoing. This means the consistency of a snapshot cannot be
+guaranteed and restoring from a snapshot backup may require manual
+intervention.
+
+[WAL](https://gitlab.com/groups/gitlab-org/-/epics/8911) may improve crash
+resistance and so improve automatic recovery from snapshots, but each
+repository will likely still require a majority of voting replicas in sync.
+
+Since each node in a Gitaly Cluster is not homogeneous, depending on
+replication factor, in order to create a complete snapshot backup all nodes
+would need to have snapshots taken. This means that snapshot backups have a lot
+of repository data duplication.
+
+Snapshots are heavily dependent on the cloud provider and so they would not
+provide an out-of-a-box experience.
+
+### Downtime
+
+An ideal repository backup solution would allow both backup and restore
+operations to be done online. Specifically we would not want to shutdown or
+pause writes to ensure that each node/repository is consistent.
+
+### Consistency
+
+Consistency in repository backups means:
+
+- That the Git repositories are valid after restore. There are no partially
+ applied operations.
+- That all repositories in a cluster are healthy after restore, or are made
+ healthy automatically.
+
+Backups without consistency may result in data-loss or require manual
+intervention on restore.
+
+Both types of consistency are difficult to achieve using snapshots as this
+requires that snapshots of the filesystems on multiple hosts are taken
+synchronously and without repositories on any of those hosts currently being
+mutated.
+
+### Distribute Work
+
+We want to distribute the backup/restore work such that it isn't bottlenecked
+on the machine running `backup.rake`, a single Gitaly node, or a single network
+connection.
+
+On backup, `backup.rake` aggregates all repository backups onto its local
+filesystem. This means that all repository data needs to be streamed from
+Gitaly (possibly via Praefect) to where the Rake task is being run. If this is
+CNG then it also requires a large volume on Kubernetes. The resulting backup
+tar file then gets transferred to object storage. A similar process happens on
+restore, the entire tar file needs to be downloaded and extracted on the local
+filesystem, even for a partial restore when restoring a subset of repositories.
+Effectively all repository data gets transferred, in full, multiple times
+between multiple hosts.
+
+If each Gitaly could directly upload backups it would mean only transferring
+repository data a single time, reducing the number of hosts and so the amount
+of data transferred over all.
+
+### Gitaly Controlled
+
+Gitaly is looking to become self-contained and so should own its backups.
+
+`backup.rake` currently determines which repositories to backup and where those
+backups are stored. This restricts the kind of optimisations that Gitaly could
+apply and adds development/testing complexity.
+
+### Monitoring
+
+`backup.rake` is run in a variety of different environments. Historically
+backups from Gitaly's perspective are a series of disconnected RPC calls. This
+has resulted in backups having almost zero monitoring. Ideally the process
+would run within Gitaly such that the process could be monitored using existing
+metrics and log scraping.
+
+### Automatic Backups
+
+When `backup.rake` is set up on cron it can be difficult to tell if it has been
+running successfully, if it is still running, how long it took, and how much
+space it has taken. It is difficult to ensure that cron always has access to
+the previous backup to allow for incremental backups or to determine if
+updating the backup is required at all.
+
+Having a coordination process running continuously will allow moving from a
+single-shot backup strategy to one where each repository determines its own
+backup schedule based on usage patterns and priority. This way each repository
+should be able to have a reasonably up-to-date backup without adding excess
+load to any Gitaly node.
+
+### Updated Repositories Only
+
+`backup.rake` packages all repository backups into a tar file and generally has
+no access to the previous backup. This makes it difficult to determine if the
+repository has changed since last backup.
+
+Having access to previous backups on object-storage would mean that Gitaly
+could more easily determine if a backup needs to be taken at all. This allows
+us to waste less time backing up repositories that are no longer being
+modified.
+
+### Point-in-time Restores
+
+There should be a mechanism by which a set of repositories can be restored to a
+specific point in time. The identifier (backup ID) used should be able to be
+determined by an admin and apply to all repositories.
+
+### WAL (write ahead log)
+
+We want to be able to provide infrastructure to allow continuous archiving of
+the WAL. This means providing a central place to stream the archives to and
+being able to match any full backup to a place in the log such that
+repositories can be restored from the full backup, and the WAL applied up to a
+specific point in time.
+
+### WORM
+
+Any Gitaly accessible storage should be WORM (write once, read many) in order
+to prevent existing backups being modified in the case an attacker gains access
+to a nodes object-storage credentials.
+
+[The pointer layout](https://gitlab.com/gitlab-org/gitaly/-/blob/master/doc/gitaly-backup.md#pointer-layout)
+currently used by repository backups relies on being able to overwrite the
+pointer files, and as such would not be suitable for use on a WORM file store.
+
+WORM is likely object-storage provider specific:
+
+- [AWS object lock](https://aws.amazon.com/blogs/storage/protecting-data-with-amazon-s3-object-lock/)
+- [Google Cloud WORM retention policy](https://cloud.google.com/blog/products/storage-data-transfer/protecting-cloud-storage-with-worm-key-management-and-more-updates).
+- [MinIO object lock](https://min.io/docs/minio/linux/administration/object-management/object-retention.html)
+
+### `bundle-uri`
+
+Having direct access backup data may open the door for clone/fetch transfer
+optimisations using bundle-uri. This allows us to point Git clients directly to
+a bundle file instead of transferring packs from the repository itself. The
+bulk repository transfer can then be faster and is offloaded to a plain http
+server, rather than the Gitaly servers.
+
+## Proposal
+
+The proposal is broken down into an initial MVP and per-repository coordinator.
+
+### MVP
+
+The goal of the MVP is to validate that moving backup processing server-side
+will improve the worst case, total-loss, scenario. That is, reduce the total
+time to create and restore a full backup.
+
+The MVP will introduce backup and restore repository RPCs. There will be no
+coordination worker. The RPCs will stream a backup directly from the
+called Gitaly node to object storage. These RPCs will be called from
+`backup.rake` via the `gitaly-backup` tool. `backup.rake` will no longer
+package repository backups into the backup archive.
+
+This work is already underway, tracked by the [Server-side Backups MVP epic](https://gitlab.com/groups/gitlab-org/-/epics/10077).
+
+### Per-Repository Coordinator
+
+Instead of taking a backup of all repositories at once via `backup.rake`, a
+backup coordination worker will be created. This worker will periodically
+enumerate all repositories to decide if a backup needs to be taken. These
+decisions could be determined by usage patterns or priority of the repository.
+
+When restoring, since each repository will have a different backup state, a
+timestamp will be provided by the user. This timestamp will be used to
+determine which backup to restore for each repository. Once WAL archiving is
+implemented, the WAL could then be replayed up to the given timestamp.
+
+This wider effort is tracked in the [Server-side Backups epic](https://gitlab.com/groups/gitlab-org/-/epics/10826).
+
+## Design and implementation details
+
+### MVP
+
+There will be a pair of RPCs `BackupRepository` and `RestoreRepository`. These
+RPCs will synchronously create/restore backups directly onto object storage.
+`backup.rake` will continue to use `gitaly-backup` with a new `--server-side`
+flag. Each Gitaly will need a backup configuration to specify the
+object-storage service to use.
+
+Initially the structure of the backups in object-storage will be the same as
+the existing [pointer layout](https://gitlab.com/gitlab-org/gitaly/-/blob/master/doc/gitaly-backup.md#pointer-layout).
+
+For MVP the backup ID must match an exact backup ID on object-storage.
+
+The configuration of object-storage will be controlled by a new config
+`config.backup.go_cloud_url`. The [Go Cloud Development Kit](https://gocloud.dev)
+tries to use a provider specific way to configure authentication. This can be
+inferred from the VM or from environment variables.
+See [Supported Storage Services](https://gocloud.dev/howto/blob/#services).
+
+## Alternative Solutions
+
+<!--
+It might be a good idea to include a list of alternative solutions or paths considered, although it is not required. Include pros and cons for
+each alternative solution/path.
+
+"Do nothing" and its pros and cons could be included in the list too.
+-->
diff --git a/doc/architecture/blueprints/runner_admission_controller/index.md b/doc/architecture/blueprints/runner_admission_controller/index.md
new file mode 100644
index 00000000000..d73ffb21ef3
--- /dev/null
+++ b/doc/architecture/blueprints/runner_admission_controller/index.md
@@ -0,0 +1,241 @@
+---
+status: proposed
+creation-date: "2023-03-07"
+authors: [ "@ajwalker" ]
+coach: [ "@ayufan" ]
+approvers: [ "@DarrenEastman", "@engineering-manager" ]
+owning-stage: "~devops::<stage>"
+participating-stages: []
+---
+
+# GitLab Runner Admissions Controller
+
+The GitLab `admission controller` (inspired by the [Kubernetes admission controller concept](https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/)) is a proposed technical solution to intercept jobs before they're persisted or added to the build queue for execution.
+
+An admission controller can be registered to the GitLab instance and receive a payload containing jobs to be created. Admission controllers can be _mutating_, _validating_, or both.
+
+- When _mutating_, mutatable job information can be modified and sent back to the GitLab instance. Jobs can be modified to conform to organizational policy, security requirements, or have, for example, their tag list modified so that they're routed to specific runners.
+- When _validating_, a job can be denied execution.
+
+## Motivation
+
+To comply with the segregation of duties, organizational policy, or security requirements, customers in financial services, the US federal government market segment, or other highly regulated industries must ensure that only authorized users can use runners associated with particular CI job environments.
+
+In this context, using the term environments is not equivalent to the definition of the environment used in the GitLab CI environments and deployments documentation. Using the definition from the [SLSA guide](https://slsa.dev/spec/v0.1/terminology), an environment is the "machine, container, VM, or similar in which the job runs."
+
+An additional requirement comes from the Remote Computing Enablement (RCE) group at [Lawrence Livermore National Laboratory](https://hpc.llnl.gov/). In this example, users must have a user ID on the target Runner CI build environment for the CI job to run. To simplify administration across the entire user base, RCE needs to be able to associate a Runner with a GitLab user entity.
+
+### Current GitLab CI job handling mechanism
+
+Before going further, it is helpful to level-set the current job handling mechanism in GitLab CI and GitLab Runners.
+
+- First, a runner associated with a GitLab instance continuously queries the GitLab instance API to check if there is a new job that it could run.
+- With every push to a project repository on GitLab with a `.gitlab-ci.yml` file present, the CI service present on the GitLab instance catches the event and triggers a new CI job.
+- The CI job enters a pending state in the queue until a Runner requests a job from the instance.
+- On the request from a runner to the API for a job, the database is queried to verify that the job parameters matches that of the runner. In other words, when runners poll a GitLab instance for a job to execute they're assigned a job if it matches the specified criteria.
+- If the job matches the runner in question, then the GitLab instance connects the job to the runner and changes the job state to running. In other words, GitLab connects the `job` object with the `Runner` object.
+- A runner can be configured to run un-tagged jobs. Tags are the primary mechanism used today to enable customers to have some control of which Runners run certain types of jobs.
+- So while runners are scoped to the instance, group, or project, there are no additional access control mechanisms today that can easily be expanded on to deny access to a runner based on a user or group identifier.
+
+The current CI jobs queue logic is as follows. **Note - in the code ww still use the very old `build` naming construct, but we've migrated from `build` to `job` in the product and documentation.
+
+```ruby
+jobs =
+ if runner.instance_type?
+ jobs_for_shared_runner
+ elsif runner.group_type?
+ jobs_for_group_runner
+ else
+ jobs_for_project_runner
+ end
+
+# select only jobs that have tags known to the runner
+jobs = jobs.matches_tag_ids(runner.tags.ids)
+
+# select builds that have at least one tag if required
+unless runner.run_untagged?
+ jobs = jobs.with_any_tags
+end
+
+```
+
+## Goals
+
+- Implement an initial solution that provides an easy-to-configure and use mechanism to `allow`, `deny` or `redirect` CI job execution on a specific runner entity based on some basic job details (like user, group or project membership).
+
+## Non-Goals
+
+- A re-design of the CI job queueing mechanism is not in the scope of this blueprint.
+
+## Proposal
+
+Implement a mechanism, `admission controllers`, to intercept CI jobs, allowing them to either mutate jobs, validate them or do both. An admission controller is a mutating webhook that can modify the CI job or reject the job according to a policy. The webhook is called before the job is inserted into the CI jobs queue.
+
+### Guiding principles
+
+- The webhook payload schema will be part of our public facing APIs.
+- We must maintain backwards compatibility when extending the webhook payload.
+- Controllers should be idempotent.
+
+### How will the admissions controller work?
+
+**Scenario 1**: I want to deny access to a certain runner.
+
+1. Configure an admissions controller to only accept jobs from specific projects.
+1. When a job is created the `project information` (`project_id`, `job_id`, `api_token`) will be used to query GitLab for specific details.
+1. If the `project information` matches the allow list, then the job payload is not modified and the job is able to run on the target runner.
+1. If the `project information` does not match the allow list, then the job payload is not modified and the job is dropped.
+1. The job tags are not changed.
+1. Admission controller may optionally send back an arbitrary text description of why a decline decision was made.
+
+**Scenario 2**: Large runner fleet with using a common configuration and tags.
+
+Each runner has a tag such as `zone_a`, `zone_b`. In this scenario the customer does not know where a specific job can run as some users have access to `zone_a`, and some to `zone_b`. The customer does not want to fail a job that should run on `zone_a`, but instead redirect a job if it is not correctly tagged to run in `zone_a.`
+
+1. Configure an admissions controller to mutate jobs based on `user_id`.
+1. When a job is created the `project information` (`project_id`, `job_id`, `api_token`) will be used to query GitLab for specific details.
+1. If the `user_id` matches then the admissions controller modifies the job tag list. `zone_a` is added to the tag list as the controller has detected that the user triggering the job should have their jobs run IN `zone_a`.
+
+### MVC
+
+#### Admission controller
+
+1. A single admission controller can be registered at the instance level only.
+1. The admission controller must respond within 30 seconds.
+1. The admission controller will receive an array of individual jobs. These jobs may or may not be related to each other. The response must contain only responses to the jobs made as part of the request.
+
+#### Job Lifecycle
+
+1. The lifecycle of a job will be updated to include a new `validating` state.
+
+ ```mermaid
+ stateDiagram-v2
+ created --> validating
+ state validating {
+ [*] --> accept
+ [*] --> reject
+ }
+ reject --> failed
+ accept --> pending
+ pending --> running: picked by runner
+ running --> executed
+ state executed {
+ [*] --> failed
+ [*] --> success
+ [*] --> canceled
+ }
+ executed --> created: retry
+ ```
+
+1. When the state is `validating`, the mutating webhook payload is sent to the admission controller.
+1. For jobs where the webhook times out (30 seconds) their status should be set as though the admission was denied. This should
+be rare in typical circumstances.
+1. Jobs with denied admission can be retried. Retried jobs will be resent to the admission controller along with any mutations that they received previously.
+1. [`allow_failure`](../../../ci/yaml/index.md#allow_failure) should be updated to support jobs that fail on denied admissions, for example:
+
+ ```yaml
+ job:
+ script:
+ - echo "I will fail admission"
+ allow_failure:
+ on_denied_admission: true
+ ```
+
+1. The UI should be updated to display the reason for any job mutations (if provided).
+1. A table in the database should be created to store the mutations. Any changes that were made, like tags, should be persisted and attached to `ci_builds` with `acts_as_taggable :admission_tags`.
+
+#### Payload
+
+1. The payload is comprised of individual job entries consisting of:
+ - Job ID.
+ - [Predefined variables](../../../ci/variables/predefined_variables.md)
+ - Job tag list.
+1. The response payload is comprised of individual job entries consisting of:
+ - Job ID.
+ - Admission state: `accepted` or `denied`.
+ - Mutations: Only `tags` is supported for now. The tags provided replaces the original tag list.
+ - Reason: A controller can provide a reason for admission and mutation.
+
+##### Example request
+
+```json
+[
+ {
+ "id": 123,
+ "variables": {
+ # predefined variables: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html
+ "CI_PROJECT_ID": 123,
+ "CI_PROJECT_NAME": "something",
+ "GITLAB_USER_ID": 98123,
+ ...
+ },
+ "tags": [ "docker", "windows" ]
+ },
+ {
+ "id": 245,
+ "variables": {
+ "CI_PROJECT_ID": 245,
+ "CI_PROJECT_NAME": "foobar",
+ "GITLAB_USER_ID": 98123,
+ ...
+ },
+ "tags": [ "linux", "eu-west" ]
+ },
+ {
+ "id": 666,
+ "variables": {
+ "CI_PROJECT_ID": 666,
+ "CI_PROJECT_NAME": "do-bad-things",
+ "GITLAB_USER_ID": 98123,
+ ...
+ },
+ "tags": [ "secure-runner" ]
+ },
+]
+```
+
+##### Example response
+
+```json
+[
+ {
+ "id": 123,
+ "admission": "accepted",
+ "reason": "it's always-allow-day-wednesday"
+ },
+ {
+ "id": 245,
+ "admission": "accepted",
+ "mutations": {
+ "tags": [ "linux", "us-west" ]
+ },
+ "reason": "user is US employee: retagged region"
+ },
+ {
+ "id": 666,
+ "admission": "rejected",
+ "reason": "you have no power here"
+ },
+]
+```
+
+### MVC +
+
+1. Multiple admissions controllers on groups and project levels.
+1. Passing job definition through a chain of the controllers (starting on the project, through all defined group controllers up to the instance controller).
+1. Each level gets the definition modified by the previous controller in the chain and makes decisions based on the current state.
+1. Modification reasons, if reported by multiple controllers, are concatenated.
+1. Usage of the admission controller is optional, so we can have a chain containing project+instance, project+group+parent group+instance, project+group, group+instance, etc
+
+### Implementation Details
+
+1. [placeholder for steps required to code the admissions controller MVC]
+
+## Technical issues to resolve
+
+| issue | resolution|
+| ------ | ------ |
+|We may have conflicting tag-sets as mutating controller can make it possible to define AND, OR and NONE logical definition of tags. This can get quite complex quickly. | |
+|Rule definition for the queue web hook|
+|What data to send to the admissions controller? Is it a subset or all of the [predefined variables](../../../ci/variables/predefined_variables.md)?|
+|Is the `queueing web hook` able to run at GitLab.com scale? On GitLab.com we would trigger millions of webhooks per second and the concern is that would overload Sidekiq or be used to abuse the system.
diff --git a/doc/architecture/blueprints/runner_scaling/index.md b/doc/architecture/blueprints/runner_scaling/index.md
index de1203843aa..a6df58aa405 100644
--- a/doc/architecture/blueprints/runner_scaling/index.md
+++ b/doc/architecture/blueprints/runner_scaling/index.md
@@ -232,12 +232,12 @@ coupled in the current implementation so we will break them out here to consider
them each separately.
- **Virtual Machine (VM) shape**. The underlying provider of a VM requires configuration to
- know what kind of machine to create. E.g. Cores, memory, failure domain,
+ know what kind of machine to create. For example, Cores, memory, failure domain,
etc... This information is very provider specific.
- **VM lifecycle management**. Multiple machines will be created and a
system must keep track of which machines belong to this executor. Typically
a cloud provider will have a way to manage a set of homogeneous machines.
- E.g. GCE Instance Group. The basic operations are increase, decrease and
+ For example, GCE Instance Group. The basic operations are increase, decrease and
usually delete a specific machine.
- **VM autoscaling**. In addition to low-level lifecycle management,
job-aware capacity decisions must be made to the set of machines to provide
@@ -255,7 +255,7 @@ See also Glossary below.
#### Current state
The current architecture has several points of coupling between concerns.
-Coupling reduces opportunities for abstraction (e.g. community supported
+Coupling reduces opportunities for abstraction (for example, community supported
plugins) and increases complexity, making the code harder to understand,
test, maintain and extend.
diff --git a/doc/architecture/blueprints/runner_tokens/index.md b/doc/architecture/blueprints/runner_tokens/index.md
index c83586f851a..29d7c05c553 100644
--- a/doc/architecture/blueprints/runner_tokens/index.md
+++ b/doc/architecture/blueprints/runner_tokens/index.md
@@ -238,7 +238,7 @@ The new workflow looks as follows:
1. Creates a new runner in the `ci_runners` table (and corresponding `glrt-` prefixed authentication token);
1. Presents the user with instructions on how to configure this new runner on a machine,
- with possibilities for different supported deployment scenarios (e.g. shell, `docker-compose`, Helm chart, etc.)
+ with possibilities for different supported deployment scenarios (for example, shell, `docker-compose`, Helm chart, etc.)
This information contains a token which is available to the user only once, and the UI
makes it clear to the user that the value shall not be shown again, as registering the same runner multiple times
is discouraged (though not impossible).
@@ -319,7 +319,7 @@ The respective `CiRunner` fields must return the values for the `ci_runner_machi
#### Stale runner cleanup
The functionality to
-[clean up stale runners](../../../ci/runners/configure_runners.md#clean-up-stale-runners) needs
+[clean up stale runners](../../../ci/runners/runners_scope.md#clean-up-stale-group-runners) needs
to be adapted to clean up `ci_runner_machines` records instead of `ci_runners` records.
At some point after the removal of the registration token support, we'll want to create a background
diff --git a/doc/architecture/blueprints/work_items/index.md b/doc/architecture/blueprints/work_items/index.md
index f067d9fab52..9924b0db9f4 100644
--- a/doc/architecture/blueprints/work_items/index.md
+++ b/doc/architecture/blueprints/work_items/index.md
@@ -30,11 +30,17 @@ Base type for issue, requirement, test case, incident and task (this list is pla
A set of predefined types for different categories of work items. Currently, the available types are:
-- Issue
-- Incident
-- Test case
-- Requirement
-- Task
+- [Incident](/ee/operations/incident_management/incidents.md)
+- [Test case](/ee/ci/test_cases/index.md)
+- [Requirement](/ee/user/project/requirements/index.md)
+- [Task](/ee/user/tasks.md)
+- [OKRs](/ee/user/okrs.md)
+
+Work is underway to convert existing objects to Work Item Types or add new ones:
+
+- [Issue](https://gitlab.com/groups/gitlab-org/-/epics/9584)
+- [Epic](https://gitlab.com/groups/gitlab-org/-/epics/9290)
+- [Ticket](https://gitlab.com/groups/gitlab-org/-/epics/10419)
#### Work Item properties
@@ -58,7 +64,7 @@ All Work Item types share the same pool of predefined widgets and are customized
### Work Item widget types (updating)
| widget type | feature flag |
-|---|---|---|
+|---|---|
| assignees | |
| description | |
| hierarchy | |
@@ -68,7 +74,7 @@ All Work Item types share the same pool of predefined widgets and are customized
| start and due date | |
| status\* | |
| weight | |
-| [notes](https://gitlab.com/gitlab-org/gitlab/-/issues/378949) | work_items_mvc |
+| [notes](https://gitlab.com/gitlab-org/gitlab/-/issues/378949) | |
\* status is not currently a widget, but a part of the root work item, similar to title
@@ -119,7 +125,7 @@ Work Items main goal is to enhance the planning toolset to become the most popul
### Scalability
-Currently, different entities like issues, epics, merge requests etc share many similar features but these features are implemented separately for every entity type. This makes implementing new features or refactoring existing ones problematic: for example, if we plan to add new feature to issues and incidents, we would need to implement it separately on issue and incident types respectively. With work items, any new feature is implemented via widgets for all existing types which makes the architecture more scalable.
+Currently, different entities like issues, epics, merge requests etc share many similar features but these features are implemented separately for every entity type. This makes implementing new features or refactoring existing ones problematic: for example, if we plan to add new feature to issues and incidents, we would need to implement it separately on issue and incident types. With work items, any new feature is implemented via widgets for all existing types which makes the architecture more scalable.
### Flexibility
diff --git a/doc/ci/caching/index.md b/doc/ci/caching/index.md
index 1822e610dad..d14c9563642 100644
--- a/doc/ci/caching/index.md
+++ b/doc/ci/caching/index.md
@@ -167,7 +167,7 @@ job1:
The order of caches extraction is:
1. Retrieval attempt for `cache:key`
-1. Retrieval attemps for each entry in order in `fallback_keys`
+1. Retrieval attempts for each entry in order in `fallback_keys`
1. Retrieval attempt for the global fallback key in `CACHE_FALLBACK_KEY`
The cache extraction process stops after the first successful cache is retrieved.
@@ -297,25 +297,20 @@ In this example, the job's cache policy is:
### Cache Node.js dependencies
If your project uses [npm](https://www.npmjs.com/) to install Node.js
-dependencies, the following example defines `cache` globally so that all jobs inherit it.
+dependencies, the following example defines a default `cache` so that all jobs inherit it.
By default, npm stores cache data in the home folder (`~/.npm`). However, you
[can't cache things outside of the project directory](../yaml/index.md#cachepaths).
Instead, tell npm to use `./.npm`, and cache it per-branch:
```yaml
-#
-# https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates/Nodejs.gitlab-ci.yml
-#
-image: node:latest
-
-# Cache modules in between jobs
-cache:
- key: $CI_COMMIT_REF_SLUG
- paths:
- - .npm/
-
-before_script:
- - npm ci --cache .npm --prefer-offline
+default:
+ image: node:latest
+ cache: # Cache modules in between jobs
+ key: $CI_COMMIT_REF_SLUG
+ paths:
+ - .npm/
+ before_script:
+ - npm ci --cache .npm --prefer-offline
test_async:
script:
@@ -328,13 +323,13 @@ You can use [`cache:key:files`](../yaml/index.md#cachekeyfiles) to compute the c
key from a lock file like `package-lock.json` or `yarn.lock`, and reuse it in many jobs.
```yaml
-# Cache modules using lock file
-cache:
- key:
- files:
- - package-lock.json
- paths:
- - .npm/
+default:
+ cache: # Cache modules using lock file
+ key:
+ files:
+ - package-lock.json
+ paths:
+ - .npm/
```
If you're using [Yarn](https://yarnpkg.com/), you can use [`yarn-offline-mirror`](https://classic.yarnpkg.com/blog/2016/11/24/offline-mirror/)
@@ -358,26 +353,21 @@ job:
### Cache PHP dependencies
If your project uses [Composer](https://getcomposer.org/) to install
-PHP dependencies, the following example defines `cache` globally so that
+PHP dependencies, the following example defines a default `cache` so that
all jobs inherit it. PHP libraries modules are installed in `vendor/` and
are cached per-branch:
```yaml
-#
-# https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates/PHP.gitlab-ci.yml
-#
-image: php:7.2
-
-# Cache libraries in between jobs
-cache:
- key: $CI_COMMIT_REF_SLUG
- paths:
- - vendor/
-
-before_script:
- # Install and run Composer
- - curl --show-error --silent "https://getcomposer.org/installer" | php
- - php composer.phar install
+default:
+ image: php:7.2
+ cache: # Cache libraries in between jobs
+ key: $CI_COMMIT_REF_SLUG
+ paths:
+ - vendor/
+ before_script:
+ # Install and run Composer
+ - curl --show-error --silent "https://getcomposer.org/installer" | php
+ - php composer.phar install
test:
script:
@@ -387,32 +377,24 @@ test:
### Cache Python dependencies
If your project uses [pip](https://pip.pypa.io/en/stable/) to install
-Python dependencies, the following example defines `cache` globally so that
+Python dependencies, the following example defines a default `cache` so that
all jobs inherit it. pip's cache is defined under `.cache/pip/` and is cached per-branch:
```yaml
-#
-# https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates/Python.gitlab-ci.yml
-#
-image: python:latest
+default:
+ image: python:latest
+ cache: # Pip's cache doesn't store the python packages
+ paths: # https://pip.pypa.io/en/stable/topics/caching/
+ - .cache/pip
+ before_script:
+ - python -V # Print out python version for debugging
+ - pip install virtualenv
+ - virtualenv venv
+ - source venv/bin/activate
-# Change pip's cache directory to be inside the project directory since we can
-# only cache local items.
-variables:
+variables: # Change pip's cache directory to be inside the project directory since we can only cache local items.
PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
-# Pip's cache doesn't store the python packages
-# https://pip.pypa.io/en/stable/topics/caching/
-cache:
- paths:
- - .cache/pip
-
-before_script:
- - python -V # Print out python version for debugging
- - pip install virtualenv
- - virtualenv venv
- - source venv/bin/activate
-
test:
script:
- python setup.py test
@@ -423,25 +405,20 @@ test:
### Cache Ruby dependencies
If your project uses [Bundler](https://bundler.io) to install
-gem dependencies, the following example defines `cache` globally so that all
+gem dependencies, the following example defines a default `cache` so that all
jobs inherit it. Gems are installed in `vendor/ruby/` and are cached per-branch:
```yaml
-#
-# https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates/Ruby.gitlab-ci.yml
-#
-image: ruby:2.6
-
-# Cache gems in between builds
-cache:
- key: $CI_COMMIT_REF_SLUG
- paths:
- - vendor/ruby
-
-before_script:
- - ruby -v # Print out ruby version for debugging
- - bundle config set --local path 'vendor/ruby' # The location to install the specified gems to
- - bundle install -j $(nproc) # Install dependencies into ./vendor/ruby
+default:
+ image: ruby:2.6
+ cache: # Cache gems in between builds
+ key: $CI_COMMIT_REF_SLUG
+ paths:
+ - vendor/ruby
+ before_script:
+ - ruby -v # Print out ruby version for debugging
+ - bundle config set --local path 'vendor/ruby' # The location to install the specified gems to
+ - bundle install -j $(nproc) # Install dependencies into ./vendor/ruby
rspec:
script:
@@ -456,13 +433,14 @@ For example, a testing job might not need the same gems as a job that deploys to
production:
```yaml
-cache:
- key:
- files:
- - Gemfile.lock
- prefix: $CI_JOB_NAME
- paths:
- - vendor/ruby
+default:
+ cache:
+ key:
+ files:
+ - Gemfile.lock
+ prefix: $CI_JOB_NAME
+ paths:
+ - vendor/ruby
test_job:
stage: test
@@ -572,18 +550,19 @@ stages:
- build
- test
-before_script:
- - echo "Hello"
+default:
+ cache:
+ key: build-cache
+ paths:
+ - vendor/
+ before_script:
+ - echo "Hello"
job A:
stage: build
script:
- mkdir vendor/
- echo "build" > vendor/hello.txt
- cache:
- key: build-cache
- paths:
- - vendor/
after_script:
- echo "World"
@@ -591,10 +570,6 @@ job B:
stage: test
script:
- cat vendor/hello.txt
- cache:
- key: build-cache
- paths:
- - vendor/
```
If one machine has one runner installed, then all jobs for your project
@@ -602,6 +577,7 @@ run on the same host:
1. Pipeline starts.
1. `job A` runs.
+1. The cache is extracted (if found).
1. `before_script` is executed.
1. `script` is executed.
1. `after_script` is executed.
diff --git a/doc/ci/chatops/index.md b/doc/ci/chatops/index.md
index 7be12d0c0fd..09f2758113f 100644
--- a/doc/ci/chatops/index.md
+++ b/doc/ci/chatops/index.md
@@ -49,18 +49,20 @@ When the job runs:
## Run a CI/CD job
-You can run a CI/CD job from chat with the `/project-name run`
-[slash command](../../integration/slash_commands.md).
-
-Prerequisites:
+Prerequisite:
- You must have at least the Developer role for the project.
-To run a CI/CD job:
+You can run a CI/CD job on the default branch from chat. To run a CI/CD job:
+
+- In the chat client, enter `/<project-name> run <job name> <arguments>` where:
-- In the chat client, enter `/project-name run <job name> <arguments>`.
+ - `<project-name>` is the name of the project.
+ - `<job name>` is the name of the CI/CD job to run.
+ - `<arguments>` is the arguments to pass to the CI/CD job.
ChatOps schedules a pipeline that contains only the specified job.
+Other [slash commands](../../user/project/integrations/gitlab_slack_application.md#slash-commands) are also available.
### Exclude a job from ChatOps
diff --git a/doc/ci/ci_cd_for_external_repos/index.md b/doc/ci/ci_cd_for_external_repos/index.md
index 6d14928389d..7f454cabcf4 100644
--- a/doc/ci/ci_cd_for_external_repos/index.md
+++ b/doc/ci/ci_cd_for_external_repos/index.md
@@ -33,7 +33,7 @@ To connect to an external repository:
If the **Run CI/CD for external repository** option is not available, the GitLab instance
might not have any import sources configured. Ask an administrator for your instance to check
-the [import sources configuration](../../user/admin_area/settings/visibility_and_access_controls.md#configure-allowed-import-sources).
+the [import sources configuration](../../administration/settings/visibility_and_access_controls.md#configure-allowed-import-sources).
## Pipelines for external pull requests
diff --git a/doc/ci/cloud_deployment/ecs/deploy_to_aws_ecs.md b/doc/ci/cloud_deployment/ecs/deploy_to_aws_ecs.md
index 9ea5f76733a..f7604689b78 100644
--- a/doc/ci/cloud_deployment/ecs/deploy_to_aws_ecs.md
+++ b/doc/ci/cloud_deployment/ecs/deploy_to_aws_ecs.md
@@ -79,7 +79,7 @@ and [Container Registry](../../../user/packages/container_registry/index.md).
![Create project](img/initial-pipeline.png)
-1. Visit **Packages and registries > Container Registry**. Make sure the application image has been
+1. Visit **Deploy > Container Registry**. Make sure the application image has been
pushed.
![Create project](img/registry.png)
diff --git a/doc/ci/cloud_deployment/index.md b/doc/ci/cloud_deployment/index.md
index ce03e9e3916..3e77e8c6c25 100644
--- a/doc/ci/cloud_deployment/index.md
+++ b/doc/ci/cloud_deployment/index.md
@@ -13,6 +13,12 @@ to AWS. You can reference these images in your CI/CD pipeline.
If you're using GitLab.com and deploying to the [Amazon Elastic Container Service](https://aws.amazon.com/ecs/) (ECS),
read about [deploying to ECS](ecs/deploy_to_aws_ecs.md).
+NOTE:
+If you are comfortable configuring a deployment yourself and just need to retrieve
+AWS credentials, consider using [ID tokens and OpenID Connect](../cloud_services/aws/index.md).
+ID tokens are more secure than storing credentials in CI/CD variables, but do not
+work with the guidance on this page.
+
## Authenticate GitLab with AWS
To use GitLab CI/CD to connect to AWS, you must authenticate.
diff --git a/doc/ci/cloud_services/azure/index.md b/doc/ci/cloud_services/azure/index.md
index 29d27e440ec..b921dabc4e2 100644
--- a/doc/ci/cloud_services/azure/index.md
+++ b/doc/ci/cloud_services/azure/index.md
@@ -107,6 +107,8 @@ You can find your subscription ID in:
- The [Azure Portal](https://learn.microsoft.com/en-us/azure/azure-portal/get-subscription-tenant-id#find-your-azure-subscription).
- The [Azure CLI](https://learn.microsoft.com/en-us/cli/azure/manage-azure-subscriptions-azure-cli#get-the-active-subscription).
+The command above grants read-only permissions to the entire subscription. For more information on applying the principle of least privilege in the context of your organization, read [Best practices for Azure AD roles](https://learn.microsoft.com/en-us/azure/active-directory/roles/best-practices).
+
## Retrieve a temporary credential
After you configure the Azure AD application and federated identity credentials,
@@ -121,8 +123,11 @@ variables:
AZURE_TENANT_ID: "<tenant-id>"
auth:
+ id_tokens:
+ GITLAB_OIDC_TOKEN:
+ aud: https://gitlab.com
script:
- - az login --service-principal -u $AZURE_CLIENT_ID -t $AZURE_TENANT_ID --federated-token $CI_JOB_JWT_V2
+ - az login --service-principal -u $AZURE_CLIENT_ID -t $AZURE_TENANT_ID --federated-token $GITLAB_OIDC_TOKEN
- az account show
```
@@ -131,7 +136,7 @@ The CI/CD variables are:
- `AZURE_CLIENT_ID`: The [application client ID you saved earlier](#create-azure-ad-application-and-service-principal).
- `AZURE_TENANT_ID`: Your Azure Active Directory. You can
[find it by using the Azure CLI or Azure Portal](https://learn.microsoft.com/en-us/azure/active-directory/fundamentals/active-directory-how-to-find-tenant).
-- `CI_JOB_JWT_V2`: The JSON web token is a [predefined CI/CD variable](../../variables/predefined_variables.md).
+- `GITLAB_OIDC_TOKEN`: An OIDC [ID token](../../yaml/index.md#id_tokens).
## Troubleshooting
diff --git a/doc/ci/components/index.md b/doc/ci/components/index.md
index 999c9b0c0fb..ae35b3779c3 100644
--- a/doc/ci/components/index.md
+++ b/doc/ci/components/index.md
@@ -11,7 +11,7 @@ type: reference
FLAG:
On self-managed GitLab, by default this feature is not available.
-To make it available, ask an administrator to enable the feature flag named `ci_namespace_catalog_experimental`.
+To make it available, an administrator can [enable the feature flag](../../administration/feature_flags.md) named `ci_namespace_catalog_experimental`.
On GitLab.com, this feature is not available. This feature is not ready for production use.
This feature is an experimental feature and [an epic exists](https://gitlab.com/groups/gitlab-org/-/epics/9897)
@@ -169,7 +169,7 @@ containing:
For example, for a component repository located at `gitlab-org/dast` on `gitlab.com`:
- The path `gitlab.com/gitlab-org/dast` tries to load the `template.yml` from the root directory.
-- The path `gitalb.com/gitlab-org/dast/api-scan` tries to load the `template.yml` from the `/api-scan` directory.
+- The path `gitlab.com/gitlab-org/dast/api-scan` tries to load the `template.yml` from the `/api-scan` directory.
**Additional notes:**
@@ -178,6 +178,167 @@ For example, for a component repository located at `gitlab-org/dast` on `gitlab.
- If a tag is named the same as a commit SHA that exists, like `e3262fdd0914fa823210cdb79a8c421e2cef79d8`,
the commit SHA takes precedence over the tag.
+### Best practices
+
+#### Avoid using global keywords
+
+When using [global keywords](../yaml/index.md#global-keywords) all jobs in the
+pipeline are affected. Using these keywords in a component affects all jobs in a
+pipeline, whether they are directly defined in the main `.gitlab-ci.yml` or
+in any included components.
+
+To make the composition of pipelines more deterministic, either:
+
+- Duplicate the default configuration for each job.
+- Use [`extends`](../yaml/index.md#extends) feature within the component.
+
+```yaml
+##
+# BAD
+default:
+ image: ruby:3.0
+
+rspec:
+ script: bundle exec rspec
+```
+
+```yaml
+##
+# GOOD
+rspec:
+ image: ruby:3.0
+ script: bundle exec rspec
+```
+
+#### Replace hard-coded values with inputs
+
+A typical hard-coded value found in CI templates is `stage:` value. Such hard coded values may force the user
+of the component to know and adapt the pipeline to such implementation details.
+
+For example, if `stage: test` is hard-coded for a job in a component, the pipeline using the component must
+define the `test` stage. Additionally, if the user of the component want to customize the stage value it has
+to override the configuration:
+
+```yaml
+##
+# BAD: In order to use different stage name you need to override all the jobs
+# included by the component.
+include:
+ - component: gitlab.com/gitlab-org/ruby-test@1.0
+
+stages: [verify, deploy]
+
+unit-test:
+ stage: verify
+
+integration-test:
+ stage: verify
+```
+
+```yaml
+##
+# BAD: In order to use the component correctly you need to define the stage
+# that is hard-coded in it.
+include:
+ - component: gitlab.com/gitlab-org/ruby-test@1.0
+
+stages: [test, deploy]
+```
+
+To improve this we can use [input parameters](../yaml/includes.md#define-input-parameters-with-specinputs)
+allowing the user of a component to inject values that can be customized:
+
+```yaml
+##
+# GOOD: We don't need to know the implementation details of a component and instead we can
+# rely on the inputs.
+include:
+ - component: gitlab.com/gitlab-org/ruby-test@1.0
+ inputs:
+ stage: verify
+
+stages: [verify, deploy]
+
+##
+# inside the component YAML:
+spec:
+ inputs:
+ stage:
+ default: test
+---
+unit-test:
+ stage: $[[ inputs.stage ]]
+ script: echo unit tests
+
+integration-test:
+ stage: $[[ inputs.stage ]]
+ script: echo integration tests
+```
+
+#### Prefer inputs over variables
+
+If variables are only used for YAML evaluation (for example `rules`) and not by the Runner
+execution, it's advised to use inputs instead.
+Inputs are explicitly defined in the component's contract and they are better validated
+than variables.
+
+For example, if a required input is not passed an error is returned as soon as the component
+is being used. By contrast, if a variable is not defined, it's value is empty.
+
+```yaml
+##
+# BAD: you need to configure an environment variable for a custom value that doesn't need
+# to be used on the Runner
+unit-test:
+ image: $MY_COMPONENT_X_IMAGE
+ script: echo unit tests
+
+integration-test:
+ image: $MY_COMPONENT_X_IMAGE
+ script: echo integration tests
+
+##
+# Usage:
+include:
+ - component: gitlab.com/gitlab-org/ruby-test@1.0
+
+variables:
+ MY_COMPONENT_X_IMAGE: ruby:3.2
+```
+
+```yaml
+##
+# GOOD: we define a customizable value and accept it as input
+spec:
+ inputs:
+ image:
+ default: ruby:3.0
+---
+unit-test:
+ image: $[[ inputs.image ]]
+ script: echo unit tests
+
+integration-test:
+ image: $[[ inputs.image ]]
+ script: echo integration tests
+
+##
+# Usage:
+include:
+ - component: gitlab.com/gitlab-org/ruby-test@1.0
+ inputs:
+ image: ruby:3.2
+```
+
+#### Use semantic versioning
+
+When tagging and releasing new versions of components we recommend using [semantic versioning](https://semver.org)
+which is the standard for communicating bugfixes, minor and major or breaking changes.
+
+We recommend adopting at least the `MAJOR.MINOR` format.
+
+For example: `2.1`, `1.0.0`, `1.0.0-alpha`, `2.1.3`, `3.0.0-rc.1`.
+
## CI/CD Catalog
The CI/CD Catalog is a list of [components repositories](#components-repository),
@@ -185,6 +346,8 @@ each containing resources that you can add to your CI/CD pipelines.
### Mark the project as a catalog resource
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/407249) in GitLab 16.1.
+
After components are added to a components repository, they can immediately be [used](#use-a-component-in-a-cicd-configuration) to build pipelines in other projects.
However, this repository is not discoverable. You must mark this project as a catalog resource to allow it to be visible in the CI Catalog
@@ -199,3 +362,15 @@ To mark a project as a catalog resource:
NOTE:
This action is not reversible.
+
+## Convert a CI template to component
+
+Any existing CI template, that you share with other projects via `include:` syntax, can be converted to a CI component.
+
+1. Decide whether you want the component to be part of an existing [components repository](#components-repository),
+ if you want to logically group components together. Create and setup a [components repository](#components-repository) otherwise.
+1. Create a YAML file in the components repository according to the expected [directory structure](#directory-structure).
+1. Copy the content of the template YAML file into the new component YAML file.
+1. Refactor the component YAML to follow the [best practices](#best-practices) for components.
+1. Leverage the `.gitlab-ci.yml` in the components repository to [test changes to the component](#test-a-component).
+1. Tag and [release the component](#release-a-component).
diff --git a/doc/ci/docker/authenticate_registry.md b/doc/ci/docker/authenticate_registry.md
index 224d0cdf7aa..52cc3071fda 100644
--- a/doc/ci/docker/authenticate_registry.md
+++ b/doc/ci/docker/authenticate_registry.md
@@ -17,14 +17,14 @@ In [`before_script`](../yaml/index.md#before_script), run `docker
login`:
```yaml
-image: docker:20.10.16
+default:
+ image: docker:20.10.16
+ services:
+ - docker:20.10.16-dind
variables:
DOCKER_TLS_CERTDIR: "/certs"
-services:
- - docker:20.10.16-dind
-
build:
stage: build
before_script:
@@ -125,14 +125,14 @@ The following example shows [`before_script`](../yaml/index.md#before_script).
The same commands apply for any solution you implement.
```yaml
-image: docker:20.10.16
+default:
+ image: docker:20.10.16
+ services:
+ - docker:20.10.16-dind
variables:
DOCKER_TLS_CERTDIR: "/certs"
-services:
- - docker:20.10.16-dind
-
build:
stage: build
before_script:
diff --git a/doc/ci/docker/docker_layer_caching.md b/doc/ci/docker/docker_layer_caching.md
index 145ead9a212..861bea70cb7 100644
--- a/doc/ci/docker/docker_layer_caching.md
+++ b/doc/ci/docker/docker_layer_caching.md
@@ -28,19 +28,18 @@ with the `--cache-from` argument must be pulled
This example `.gitlab-ci.yml` file shows how to use Docker caching:
```yaml
-image: docker:20.10.16
-
-services:
- - docker:20.10.16-dind
+default:
+ image: docker:20.10.16
+ services:
+ - docker:20.10.16-dind
+ before_script:
+ - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
variables:
# Use TLS https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#tls-enabled
DOCKER_HOST: tcp://docker:2376
DOCKER_TLS_CERTDIR: "/certs"
-before_script:
- - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
-
build:
stage: build
script:
@@ -50,7 +49,7 @@ build:
- docker push $CI_REGISTRY_IMAGE:latest
```
-In the `script` section for the `build` stage:
+In the `script` section for the `build` job:
1. The first command tries to pull the image from the registry so that it can be
used as a cache for the `docker build` command.
diff --git a/doc/ci/docker/using_docker_build.md b/doc/ci/docker/using_docker_build.md
index 004da63476e..5e8f2b36620 100644
--- a/doc/ci/docker/using_docker_build.md
+++ b/doc/ci/docker/using_docker_build.md
@@ -61,8 +61,9 @@ the Docker commands, but needs permission to do so.
1. In GitLab, add `docker info` to `.gitlab-ci.yml` to verify that Docker is working:
```yaml
- before_script:
- - docker info
+ default:
+ before_script:
+ - docker info
build_image:
script:
@@ -155,7 +156,12 @@ To use Docker-in-Docker with TLS enabled:
`docker:20.10.16-dind` service:
```yaml
- image: docker:20.10.16
+ default:
+ image: docker:20.10.16
+ services:
+ - docker:20.10.16-dind
+ before_script:
+ - docker info
variables:
# When you use the dind service, you must instruct Docker to talk with
@@ -174,12 +180,6 @@ To use Docker-in-Docker with TLS enabled:
# container, thanks to volume mount from config.toml
DOCKER_TLS_CERTDIR: "/certs"
- services:
- - docker:20.10.16-dind
-
- before_script:
- - docker info
-
build:
stage: build
script:
@@ -215,7 +215,12 @@ You can now use `docker` in the job script. You should include the
`docker:20.10.16-dind` service:
```yaml
-image: docker:20.10.16
+default:
+ image: docker:20.10.16
+ services:
+ - docker:20.10.16-dind
+ before_script:
+ - docker info
variables:
# When using dind service, you must instruct docker to talk with the
@@ -235,12 +240,6 @@ variables:
# This instructs Docker not to start over TLS.
DOCKER_TLS_CERTDIR: ""
-services:
- - docker:20.10.16-dind
-
-before_script:
- - docker info
-
build:
stage: build
script:
@@ -280,7 +279,12 @@ To use Docker-in-Docker with TLS enabled in Kubernetes:
`docker:20.10.16-dind` service:
```yaml
- image: docker:20.10.16
+ default:
+ image: docker:20.10.16
+ services:
+ - docker:20.10.16-dind
+ before_script:
+ - docker info
variables:
# When using dind service, you must instruct Docker to talk with
@@ -307,12 +311,6 @@ To use Docker-in-Docker with TLS enabled in Kubernetes:
DOCKER_TLS_VERIFY: 1
DOCKER_CERT_PATH: "$DOCKER_TLS_CERTDIR/client"
- services:
- - docker:20.10.16-dind
-
- before_script:
- - docker info
-
build:
stage: build
script:
@@ -352,9 +350,10 @@ Docker-in-Docker is the recommended configuration, but you should be aware of th
To use Docker commands in your CI/CD jobs, you can bind-mount `/var/run/docker.sock` into the
container. Docker is then available in the context of the image.
-> If you bind the Docker socket and you are [using GitLab Runner 11.11 or later](https://gitlab.com/gitlab-org/gitlab-runner/-/merge_requests/1261),
-> you can no longer use `docker:20.10.16-dind` as a service.
-> Volume bindings also affect services, making them incompatible.
+If you bind the Docker socket and you are
+[using GitLab Runner 11.11 or later](https://gitlab.com/gitlab-org/gitlab-runner/-/merge_requests/1261),
+you can no longer use `docker:20.10.16-dind` as a service. Volume bindings also affect services,
+making them incompatible.
To make Docker available in the context of the image, you need to mount
`/var/run/docker.sock` into the launched containers. To do this with the Docker
@@ -390,11 +389,10 @@ sudo gitlab-runner register -n \
--docker-volumes /var/run/docker.sock:/var/run/docker.sock
```
-> If you want to use more complex Docker-in-Docker configurations, like it is necessary to run Code Quality checks with
-> Code Climate, you need to ensure that the paths to the build directory are the same on the host as well as inside the
-> Docker container.
-> See section "[Improve Code Quality performance with private runners](../testing/code_quality.md#improve-code-quality-performance-with-private-runners)"
-> in the Code Quality documentation.
+To use more complex Docker-in-Docker configurations, such as is necessary to run Code Quality checks
+with Code Climate, you need to ensure that the paths to the build directory are the same on the host
+as well as inside the Docker container. For more details, see
+[Improve Code Quality performance with private runners](../testing/code_quality.md#improve-code-quality-performance-with-private-runners).
#### Enable registry mirror for `docker:dind` service
@@ -558,10 +556,10 @@ You do not need to include the `docker:20.10.16-dind` service, like you do when
you use the Docker-in-Docker executor:
```yaml
-image: docker:20.10.16
-
-before_script:
- - docker info
+default:
+ image: docker:20.10.16
+ before_script:
+ - docker info
build:
stage: build
@@ -639,8 +637,8 @@ and [using the OverlayFS storage driver](https://docs.docker.com/storage/storage
To build Docker images without enabling privileged mode on the runner, you can
use one of these alternatives:
-- [`kaniko`](using_kaniko.md)
-- [`buildah`](https://github.com/containers/buildah)
+- [`kaniko`](using_kaniko.md).
+- [`buildah`](https://github.com/containers/buildah). There is a [known issue](https://github.com/containers/buildah/issues/4049) with running as non-root, you might need this [workaround](https://docs.gitlab.com/runner/configuration/configuring_runner_operator.html#configure-setfcap) if you are using OpenShift Runner.
For example, with `buildah`:
@@ -703,10 +701,10 @@ This issue can occur when the service's image name
[includes a registry hostname](../../ci/services/index.md#available-settings-for-services). For example:
```yaml
-image: docker:20.10.16
-
-services:
- - registry.hub.docker.com/library/docker:20.10.16-dind
+default:
+ image: docker:20.10.16
+ services:
+ - registry.hub.docker.com/library/docker:20.10.16-dind
```
A service's hostname is [derived from the full image name](../../ci/services/index.md#accessing-the-services).
@@ -714,14 +712,14 @@ However, the shorter service hostname `docker` is expected.
To allow service resolution and access, add an explicit alias for the service name `docker`:
```yaml
-image: docker:20.10.16
-
-services:
- - name: registry.hub.docker.com/library/docker:20.10.16-dind
- alias: docker
+default:
+ image: docker:20.10.16
+ services:
+ - name: registry.hub.docker.com/library/docker:20.10.16-dind
+ alias: docker
```
-### Error response from daemon: Get "https://registry-1.docker.io/v2/": unauthorized: incorrect username or password
+### Error: `Error response from daemon: Get "https://registry-1.docker.io/v2/": unauthorized: incorrect username or password`
This error appears when you use the deprecated variable, `CI_BUILD_TOKEN`. To prevent users from receiving this error, you should:
diff --git a/doc/ci/docker/using_docker_images.md b/doc/ci/docker/using_docker_images.md
index 022aa7c3093..d3a2f4ece06 100644
--- a/doc/ci/docker/using_docker_images.md
+++ b/doc/ci/docker/using_docker_images.md
@@ -74,10 +74,8 @@ services that you want to use during runtime:
```yaml
default:
image: ruby:2.6
-
services:
- postgres:11.7
-
before_script:
- bundle install
diff --git a/doc/ci/environments/deployment_approvals.md b/doc/ci/environments/deployment_approvals.md
index 0ef37452cbb..2a9b381c517 100644
--- a/doc/ci/environments/deployment_approvals.md
+++ b/doc/ci/environments/deployment_approvals.md
@@ -163,9 +163,10 @@ require `Administrator` to approve every deployment job in `Production`.
![multiple approval rules](img/multiple_approval_rules_v16_0.png)
-### Allow self-approval **(PREMIUM)**
+### Allow self-approval
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/381418) in GitLab 15.8.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/381418) in GitLab 15.8.
+> - Automatic approval [removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124638) in GitLab 16.2 due to [usability issues](https://gitlab.com/gitlab-org/gitlab/-/issues/391258).
By default, the user who triggers a deployment pipeline can't also approve the deployment job.
To allow self-approval of a deployment job:
@@ -175,9 +176,6 @@ To allow self-approval of a deployment job:
1. Expand **Protected environments**.
1. From the **Approval options**, select the **Allow pipeline triggerer to approve deployment** checkbox.
-When a pipeline runs, deployment jobs are automatically approved in the pipeline if the user who
-triggered the deployment is allowed to approve.
-
## Approve or reject a deployment
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/342180/) in GitLab 14.9
diff --git a/doc/ci/environments/deployment_safety.md b/doc/ci/environments/deployment_safety.md
index 8be46da3fa8..e15e09b27c1 100644
--- a/doc/ci/environments/deployment_safety.md
+++ b/doc/ci/environments/deployment_safety.md
@@ -170,23 +170,3 @@ For more information, see [Custom CI/CD configuration path](../pipelines/setting
## Require an approval before deploying
Before promoting a deployment to a production environment, cross-verifying it with a dedicated testing group is an effective way to ensure safety. For more information, see [Deployment Approvals](deployment_approvals.md).
-
-## Troubleshooting
-
-### Pipelines jobs fail with `The deployment job is older than the previously succeeded deployment job...`
-
-This is caused by the [Prevent outdated deployment jobs](../pipelines/settings.md#prevent-outdated-deployment-jobs) feature.
-If you have multiple jobs for the same environment (including non-deployment jobs), you might encounter this problem, for example:
-
-```yaml
-build:service-a:
- environment:
- name: production
-
-build:service-b:
- environment:
- name: production
-```
-
-The [Prevent outdated deployment jobs](../pipelines/settings.md#prevent-outdated-deployment-jobs) might
-not work well with this configuration, and must be disabled.
diff --git a/doc/ci/environments/index.md b/doc/ci/environments/index.md
index f2fb8eaa27e..689f92723ee 100644
--- a/doc/ci/environments/index.md
+++ b/doc/ci/environments/index.md
@@ -32,7 +32,7 @@ There are a few ways to view a list of environments for a given project:
- On the project's overview page, if at least one environment is available (that is, not stopped).
![Number of Environments](img/environments_project_home.png "Incremental counter of available Environments")
-- On the left sidebar, select **Deployments > Environments**.
+- On the left sidebar, select **Operate > Environments**.
The environments are displayed.
![Environments list](img/environments_list_v14_8.png)
@@ -159,10 +159,10 @@ deploy_review_app:
environment:
name: review/$CI_COMMIT_REF_SLUG
url: https://$CI_ENVIRONMENT_SLUG.example.com
- only:
- - branches
- except:
- - main
+ rules:
+ - if: $CI_COMMIT_BRANCH == "main"
+ when: never
+ - if: $CI_COMMIT_BRANCH
```
#### Set a dynamic environment URL
@@ -603,7 +603,7 @@ To stop an environment in the GitLab UI:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
1. Select **Operate > Environments**.
1. Next to the environment you want to stop, select **Stop**.
-1. On the confirmation dialog box, select **Stop environment**.
+1. On the confirmation dialog, select **Stop environment**.
#### Multiple stop actions for an environment
@@ -668,7 +668,7 @@ To delete an environment:
1. Select **Operate > Environments**.
1. Select the **Stopped** tab.
1. Next to the environment you want to delete, select **Delete environment**.
-1. On the confirmation dialog box, select **Delete environment**.
+1. On the confirmation dialog, select **Delete environment**.
### Access an environment for preparation or verification purposes
diff --git a/doc/ci/environments/kubernetes_dashboard.md b/doc/ci/environments/kubernetes_dashboard.md
index 7da48bed5d7..ee16294e654 100644
--- a/doc/ci/environments/kubernetes_dashboard.md
+++ b/doc/ci/environments/kubernetes_dashboard.md
@@ -7,7 +7,9 @@ type: reference
# Dashboard for Kubernetes (Beta) **(FREE)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/390769) in GitLab 16.1, with [flags](../../administration/feature_flags.md) named `environment_settings_to_graphql`, `kas_user_access`, `kas_user_access_project`, and `expose_authorized_cluster_agents`. This feature is in [Beta](../../policy/experiment-beta-support.md#beta).
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/390769) in GitLab 16.1, with [flags](../../administration/feature_flags.md) named `environment_settings_to_graphql`, `kas_user_access`, `kas_user_access_project`, and `expose_authorized_cluster_agents`. This feature is in [Beta](../../policy/experiment-beta-support.md#beta).
+> - Feature flag `environment_settings_to_graphql` [removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124177) in GitLab 16.2.
+> - Feature flags `kas_user_access`, `kas_user_access_project`, and `expose_authorized_cluster_agents` [removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/125835) in GitLab 16.2.
Use the Dashboard for Kubernetes to understand the status of your clusters with an intuitive visual interface.
The dashboard works with every connected Kubernetes cluster, whether you deployed them
@@ -22,9 +24,10 @@ Configure a dashboard to use it for a given environment.
You can configure dashboard for an environment that already exists, or
add one when you create an environment.
-Prerequisite:
+Prerequisites:
- The agent for Kubernetes must be shared with the environment's project, or its parent group, using the [`user_access`](../../user/clusters/agent/user_access.md) keyword.
+- Self-managed only. KAS is running on the GitLab subdomain. For example, `kas.example.com` and `example.com`.
### The environment already exists
diff --git a/doc/ci/examples/deployment/composer-npm-deploy.md b/doc/ci/examples/deployment/composer-npm-deploy.md
index 20083413f66..5d1ae0048af 100644
--- a/doc/ci/examples/deployment/composer-npm-deploy.md
+++ b/doc/ci/examples/deployment/composer-npm-deploy.md
@@ -84,8 +84,8 @@ stage_deploy:
artifacts:
paths:
- build/
- only:
- - dev
+ rules:
+ - if: $CI_COMMIT_BRANCH == "dev"
script:
- ssh-add <(echo "$STAGING_PRIVATE_KEY")
- ssh -p22 server_user@server_host "mkdir htdocs/wp-content/themes/_tmp"
@@ -96,7 +96,7 @@ stage_deploy:
Here's the breakdown:
-1. `only:dev` means that this build runs only when something is pushed to the `dev` branch. You can remove this block completely and have everything run on every push (but probably this is something you don't want).
+1. `rules:if: $CI_COMMIT_BRANCH == "dev"` means that this build runs only when something is pushed to the `dev` branch. You can remove this block completely and have everything run on every push (but probably this is something you don't want).
1. `ssh-add ...` we add that private key you added on the web UI to the Docker container.
1. We connect via `ssh` and create a new `_tmp` folder.
1. We connect via `scp` and upload the `build` folder (which was generated by a `npm` script) to our previously created `_tmp` folder.
@@ -131,28 +131,26 @@ Since this was a WordPress project, it includes real code snippets. Some further
Our final `.gitlab-ci.yml` looks like this:
```yaml
-image: tetraweb/php
-
-before_script:
- - apt-get update
- - apt-get install zip unzip
- - php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
- - php composer-setup.php
- - php -r "unlink('composer-setup.php');"
- - php composer.phar install
- - npm install
- - npm run deploy
- - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
- - mkdir -p ~/.ssh
- - eval $(ssh-agent -s)
- - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
-
stage_deploy:
+ image: tetraweb/php
artifacts:
paths:
- build/
- only:
- - dev
+ rules:
+ - if: $CI_COMMIT_BRANCH == "dev"
+ before_script:
+ - apt-get update
+ - apt-get install zip unzip
+ - php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
+ - php composer-setup.php
+ - php -r "unlink('composer-setup.php');"
+ - php composer.phar install
+ - npm install
+ - npm run deploy
+ - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
+ - mkdir -p ~/.ssh
+ - eval $(ssh-agent -s)
+ - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
script:
- ssh-add <(echo "$STAGING_PRIVATE_KEY")
- ssh -p22 server_user@server_host "mkdir htdocs/wp-content/themes/_tmp"
diff --git a/doc/ci/examples/deployment/index.md b/doc/ci/examples/deployment/index.md
index a156cf1acb0..793e60d517c 100644
--- a/doc/ci/examples/deployment/index.md
+++ b/doc/ci/examples/deployment/index.md
@@ -69,8 +69,8 @@ staging:
- apt-get install -y ruby-dev
- gem install dpl
- dpl heroku api --app=my-app-staging --api_key=$HEROKU_STAGING_API_KEY
- only:
- - main
+ rules:
+ - if: $CI_COMMIT_BRANCH == "main"
environment: staging
```
@@ -93,8 +93,8 @@ staging:
script:
- gem install dpl
- dpl heroku api --app=my-app-staging --api_key=$HEROKU_STAGING_API_KEY
- only:
- - main
+ rules:
+ - if: $CI_COMMIT_BRANCH == "main"
environment: staging
production:
@@ -102,8 +102,8 @@ production:
script:
- gem install dpl
- dpl heroku api --app=my-app-production --api_key=$HEROKU_PRODUCTION_API_KEY
- only:
- - tags
+ rules:
+ - if: $CI_COMMIT_TAG
environment: production
```
diff --git a/doc/ci/examples/end_to_end_testing_webdriverio/index.md b/doc/ci/examples/end_to_end_testing_webdriverio/index.md
index 3385aca1ef2..ee8b6bb30b6 100644
--- a/doc/ci/examples/end_to_end_testing_webdriverio/index.md
+++ b/doc/ci/examples/end_to_end_testing_webdriverio/index.md
@@ -31,7 +31,7 @@ to write such end-to-end tests, and how to set up GitLab CI/CD to automatically
against your new code, on a branch-by-branch basis. For the scope of this article, we will walk you
through the process of setting up GitLab CI/CD for end-to-end testing JavaScript-based applications
with WebdriverIO, but the general strategy should carry over to other languages.
-We assume you are familiar with GitLab, [GitLab CI/CD](../../index.md), [Review Apps](../../review_apps/index.md), and running your app locally, e.g., on `localhost:8000`.
+We assume you are familiar with GitLab, [GitLab CI/CD](../../index.md), [Review Apps](../../review_apps/index.md), and running your app locally, for example, on `localhost:8000`.
## What to test
@@ -45,7 +45,7 @@ infrastructure is up and running, and that your units of code work well together
## Selenium and WebdriverIO
-[Selenium](https://www.selenium.dev/) is a piece of software that can control web browsers, e.g., to make them
+[Selenium](https://www.selenium.dev/) is a piece of software that can control web browsers, for example, to make them
visit a specific URL or interact with elements on the page. It can be programmatically controlled
from a variety of programming languages. In this article we're going to be using the
[WebdriverIO](http://v4.webdriver.io/) JavaScript bindings, but the general concept should carry over
@@ -115,7 +115,7 @@ easiest way to get started is to start with
provides an overview of all available options. The two options that are going to be most relevant now are the
`specs` option, which is an array of paths to your tests, and the `baseUrl` option, which points to where your app is
running. And finally, we will need to tell WebdriverIO in which browsers we would like to run our
-tests. This can be configured through the `capabilities` option, which is an array of browser names (e.g.
+tests. This can be configured through the `capabilities` option, which is an array of browser names (for example,
`firefox` or `chrome`). It is recommended to install
[selenium-assistant](https://googlechromelabs.github.io/selenium-assistant/) to detect all installed
browsers:
@@ -130,7 +130,7 @@ But of course, a simple configuration of `config.capabilities = ['firefox']` wou
If you've installed WebdriverIO as a dependency
(`npm install --save-dev webdriverio`), you can add a line to the `scripts` property in your
-`package.json` that runs `wdio` with the path to your configuration file as value, e.g.:
+`package.json` that runs `wdio` with the path to your configuration file as value, for example:
```javascript
"confidence-check": "wdio wdio.conf.js",
@@ -152,10 +152,10 @@ For the scope of this article, we've defined an additional [CI/CD stage](../../y
[Docker image](../../docker/using_docker_images.md). However, WebdriverIO fires up actual browsers
to interact with your application, so we need to install and run them.
Furthermore, WebdriverIO uses Selenium as a common interface to control different browsers,
-so we need to install and run Selenium as well. Luckily, the Selenium project provides the Docker images
+so we need to install and run Selenium as well. Luckily, the Selenium project provides the Docker images for Firefox
[standalone-firefox](https://hub.docker.com/r/selenium/standalone-firefox/) and
-[standalone-chrome](https://hub.docker.com/r/selenium/standalone-chrome/) that provide just that for
-Firefox and Chrome, respectively. (Since Safari and Internet Explorer/Edge are not open source and
+and for Chrome [standalone-chrome](https://hub.docker.com/r/selenium/standalone-chrome/).
+(Since Safari and Internet Explorer/Edge are not open source and
not available for Linux, we are unfortunately unable to use those in GitLab CI/CD).
GitLab CI/CD makes it a breeze to link these images to our `confidence-check` jobs using the
@@ -219,22 +219,27 @@ on GitLab CI/CD!
To recap, our `.gitlab-ci.yml` configuration file looks something like this:
```yaml
-image: node:8.10
+default:
+ image: node:8.10
+
stages:
- deploy
- confidence-check
+
deploy_terraform:
stage: deploy
script:
# Your Review App deployment scripts - for a working example please check https://gitlab.com/Flockademic/Flockademic/blob/5a45f1c2412e93810fab50e2dab8949e2d0633c7/.gitlab-ci.yml#L315
- echo
environment: production
+
e2e:firefox:
stage: confidence-check
services:
- selenium/standalone-firefox
script:
- npm run confidence-check --host=selenium__standalone-firefox
+
e2e:chrome:
stage: confidence-check
services:
diff --git a/doc/ci/examples/index.md b/doc/ci/examples/index.md
index a020f673fd7..514817adc91 100644
--- a/doc/ci/examples/index.md
+++ b/doc/ci/examples/index.md
@@ -102,7 +102,7 @@ to [the templates list](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/g
### Adding templates to your GitLab installation **(PREMIUM SELF)**
You can add custom examples and templates to your self-managed GitLab instance.
-Your GitLab administrator can [designate an instance template repository](../../user/admin_area/settings/instance_template_repository.md)
+Your GitLab administrator can [designate an instance template repository](../../administration/settings/instance_template_repository.md)
that contains examples and templates specific to your organization.
## Other resources
diff --git a/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md b/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md
index cf12943d279..14d8e0fc72f 100644
--- a/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md
+++ b/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md
@@ -481,10 +481,10 @@ In order to build and test our app with GitLab CI/CD, we need a file called `.gi
Our `.gitlab-ci.yml` file will look like this:
```yaml
-image: registry.gitlab.com/<USERNAME>/laravel-sample:latest
-
-services:
- - mysql:5.7
+default:
+ image: registry.gitlab.com/<USERNAME>/laravel-sample:latest
+ services:
+ - mysql:5.7
variables:
MYSQL_DATABASE: homestead
@@ -513,14 +513,13 @@ deploy_production:
- ssh-add <(echo "$SSH_PRIVATE_KEY")
- mkdir -p ~/.ssh
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
-
- ~/.composer/vendor/bin/envoy run deploy --commit="$CI_COMMIT_SHA"
environment:
name: production
url: http://192.168.1.1
when: manual
- only:
- - main
+ rules:
+ - if: $CI_COMMIT_BRANCH == "main"
```
That's a lot to take in, isn't it? Let's run through it step by step.
@@ -533,10 +532,10 @@ The `services` keyword defines additional images [that are linked to the main im
Here we use the container image we created before as our main image and also use MySQL 5.7 as a service.
```yaml
-image: registry.gitlab.com/<USERNAME>/laravel-sample:latest
-
-services:
- - mysql:5.7
+default:
+ image: registry.gitlab.com/<USERNAME>/laravel-sample:latest
+ services:
+ - mysql:5.7
...
```
@@ -592,7 +591,7 @@ If the SSH keys have added successfully, we can run Envoy.
As mentioned before, GitLab supports [Continuous Delivery](https://about.gitlab.com/blog/2016/08/05/continuous-integration-delivery-and-deployment-with-gitlab/#continuous-delivery) methods as well.
The [environment](../../yaml/index.md#environment) keyword tells GitLab that this job deploys to the `production` environment.
The `url` keyword is used to generate a link to our application on the GitLab Environments page.
-The `only` keyword tells GitLab CI/CD that the job should be executed only when the pipeline is building the `main` branch.
+The `rules:if` keyword tells GitLab CI/CD that the job should be executed only when the pipeline is building the `main` branch.
Lastly, `when: manual` is used to turn the job from running automatically to a manual action.
```yaml
@@ -604,16 +603,14 @@ deploy_production:
- ssh-add <(echo "$SSH_PRIVATE_KEY")
- mkdir -p ~/.ssh
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
-
# Run Envoy
- ~/.composer/vendor/bin/envoy run deploy
-
environment:
name: production
url: http://192.168.1.1
when: manual
- only:
- - main
+ rules:
+ - if: $CI_COMMIT_BRANCH == "main"
```
You may also want to add another job for [staging environment](https://about.gitlab.com/blog/2021/02/05/ci-deployment-and-environments/), to final test your application before deploying to production.
diff --git a/doc/ci/examples/php.md b/doc/ci/examples/php.md
index a83bcf69491..244c1e379da 100644
--- a/doc/ci/examples/php.md
+++ b/doc/ci/examples/php.md
@@ -90,12 +90,12 @@ Finally, commit your files and push them to GitLab to see your build succeeding
The final `.gitlab-ci.yml` should look similar to this:
```yaml
-# Select image from https://hub.docker.com/_/php
-image: php:5.6
-
-before_script:
- # Install dependencies
- - bash ci/docker_install.sh > /dev/null
+default:
+ # Select image from https://hub.docker.com/_/php
+ image: php:5.6
+ before_script:
+ # Install dependencies
+ - bash ci/docker_install.sh > /dev/null
test:app:
script:
@@ -108,9 +108,10 @@ Testing against multiple versions of PHP is super easy. Just add another job
with a different Docker image version and the runner does the rest:
```yaml
-before_script:
- # Install dependencies
- - bash ci/docker_install.sh > /dev/null
+default:
+ before_script:
+ # Install dependencies
+ - bash ci/docker_install.sh > /dev/null
# We test PHP5.6
test:5.6:
@@ -206,10 +207,9 @@ Instead of PHPUnit, you can use any other tool to run unit tests. For example
you can use [`atoum`](https://github.com/atoum/atoum):
```yaml
-before_script:
- - wget http://downloads.atoum.org/nightly/mageekguy.atoum.phar
-
test:atoum:
+ before_script:
+ - wget http://downloads.atoum.org/nightly/mageekguy.atoum.phar
script:
- php mageekguy.atoum.phar
```
@@ -224,18 +224,18 @@ To execute Composer before running your tests, add the following to your
# Composer stores all downloaded packages in the vendor/ directory.
# Do not use the following if the vendor/ directory is committed to
# your git repository.
-cache:
- paths:
- - vendor/
-
-before_script:
- # Install composer dependencies
- - wget https://composer.github.io/installer.sig -O - -q | tr -d '\n' > installer.sig
- - php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
- - php -r "if (hash_file('SHA384', 'composer-setup.php') === file_get_contents('installer.sig')) { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
- - php composer-setup.php
- - php -r "unlink('composer-setup.php'); unlink('installer.sig');"
- - php composer.phar install
+default:
+ cache:
+ paths:
+ - vendor/
+ before_script:
+ # Install composer dependencies
+ - wget https://composer.github.io/installer.sig -O - -q | tr -d '\n' > installer.sig
+ - php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
+ - php -r "if (hash_file('SHA384', 'composer-setup.php') === file_get_contents('installer.sig')) { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
+ - php composer-setup.php
+ - php -r "unlink('composer-setup.php'); unlink('installer.sig');"
+ - php composer.phar install
```
## Access private packages or dependencies
diff --git a/doc/ci/index.md b/doc/ci/index.md
index 75e668290c8..a3106a2475c 100644
--- a/doc/ci/index.md
+++ b/doc/ci/index.md
@@ -99,10 +99,19 @@ GitLab CI/CD features, grouped by DevOps stage, include:
| [Cloud deployment](cloud_deployment/index.md) | Deploy your application to a main cloud provider. |
| **Secure** | |
| [Code Quality](testing/code_quality.md) | Analyze your source code quality. |
-| [Container Scanning](../user/application_security/container_scanning/index.md) | Check your Docker containers for known vulnerabilities. |
+| [Container Scanning](../user/application_security/container_scanning/index.md) | Scan your container images for known vulnerabilities. |
+| [Coverage-guided fuzz testing](../user/application_security/coverage_fuzzing/index.md) | Test your application's behavior by providing randomized input. |
+| [Dynamic Application Security Testing](../user/application_security/dast/index.md) | Test your application's runtime behavior for vulnerabilities. |
| [Dependency Scanning](../user/application_security/dependency_scanning/index.md) | Analyze your dependencies for known vulnerabilities. |
+| [Infrastructure as Code scanning](../user/application_security/iac_scanning/index.md) | Scan your IaC configuration files for known vulnerabilities. |
| [License Compliance](../user/compliance/license_compliance/index.md) | Search your project dependencies for their licenses. |
-| [Security Test reports](../user/application_security/index.md) | Check for app vulnerabilities. |
+| [Secret Detection](../user/application_security/secret_detection/index.md) | Search your application's source code for secrets. |
+| [Static Application Security Testing](../user/application_security/sast/index.md) | Test your application's source code for known vulnerabilities. |
+| [Web API fuzz testing](../user/application_security/api_fuzzing/index.md) | Test your application's API behavior by providing randomized input. |
+| **Govern** | |
+| [Compliance frameworks](../user/group/compliance_frameworks.md) | Enforce a GitLab CI/CD configuration on all projects in a group. |
+| [Scan execution policies](../user/application_security/policies/scan-execution-policies.md) | Enforce security scans run on a specified schedule or with the project pipeline. |
+| [Scan results policies](../user/application_security/policies/scan-result-policies.md) | Enforce action based on results of a pipeline security scan. |
## Examples
diff --git a/doc/ci/jobs/ci_job_token.md b/doc/ci/jobs/ci_job_token.md
index a60aaa04ea1..c2fe3071b52 100644
--- a/doc/ci/jobs/ci_job_token.md
+++ b/doc/ci/jobs/ci_job_token.md
@@ -24,6 +24,8 @@ You can use a GitLab CI/CD job token to authenticate with specific API endpoints
to [trigger a multi-project pipeline](../pipelines/downstream_pipelines.md#trigger-a-multi-project-pipeline-by-using-the-api).
- [Releases](../../api/releases/index.md) and [Release links](../../api/releases/links.md).
- [Terraform plan](../../user/infrastructure/index.md).
+- [Deployments](../../api/deployments.md).
+- [Environments](../../api/environments.md).
The token has the same permissions to access the API as the user that caused the
job to run. A user can cause a job to run by taking action like pushing a commit,
diff --git a/doc/ci/jobs/job_artifacts.md b/doc/ci/jobs/job_artifacts.md
index 95d939c7027..3dd43a9760c 100644
--- a/doc/ci/jobs/job_artifacts.md
+++ b/doc/ci/jobs/job_artifacts.md
@@ -61,7 +61,7 @@ pdf:
expire_in: 1 week
```
-If `expire_in` is not defined, the [instance-wide setting](../../user/admin_area/settings/continuous_integration.md#default-artifacts-expiration)
+If `expire_in` is not defined, the [instance-wide setting](../../administration/settings/continuous_integration.md#default-artifacts-expiration)
is used.
To prevent artifacts from expiring, you can select **Keep** from the job details page.
@@ -193,7 +193,7 @@ job:
> - [Improved performance](https://gitlab.com/gitlab-org/gitlab/-/issues/387765) in GitLab 15.9.
> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/407475) in GitLab 16.0. Feature flag `artifacts_management_page` removed.
-You can view all artifacts stored in a project from the **CI/CD > Artifacts** page.
+You can view all artifacts stored in a project from the **Build > Artifacts** page.
This list displays all jobs and their associated artifacts. Expand an entry to access
all artifacts associated with a job, including:
@@ -351,7 +351,7 @@ Artifacts in old pipelines continue to be kept until a new pipeline runs for the
Then the artifacts in the earlier pipeline for that ref are allowed to expire too.
You can disable this behavior for all projects on a self-managed instance in the
-[instance's CI/CD settings](../../user/admin_area/settings/continuous_integration.md#keep-the-latest-artifacts-for-all-jobs-in-the-latest-successful-pipelines).
+[instance's CI/CD settings](../../administration/settings/continuous_integration.md#keep-the-latest-artifacts-for-all-jobs-in-the-latest-successful-pipelines).
When **Keep artifacts from most recent successful jobs** is enabled, artifacts are always kept for [blocked](job_control.md#types-of-manual-jobs)
pipelines. These artifacts expire only after the blocking job is triggered and the pipeline completes.
diff --git a/doc/ci/jobs/job_control.md b/doc/ci/jobs/job_control.md
index b17db47eef2..09c7500a883 100644
--- a/doc/ci/jobs/job_control.md
+++ b/doc/ci/jobs/job_control.md
@@ -271,7 +271,7 @@ check the value of the `$CI_PIPELINE_SOURCE` variable:
| `push` | For pipelines triggered by a `git push` event, including for branches and tags. |
| `schedule` | For [scheduled pipelines](../pipelines/schedules.md). |
| `trigger` | For pipelines created by using a [trigger token](../triggers/index.md#configure-cicd-jobs-to-run-in-triggered-pipelines). |
-| `web` | For pipelines created by using **Run pipeline** button in the GitLab UI, from the project's **CI/CD > Pipelines** section. |
+| `web` | For pipelines created by using **Run pipeline** button in the GitLab UI, from the project's **Build > Pipelines** section. |
| `webide` | For pipelines created by using the [WebIDE](../../user/project/web_ide/index.md). |
The following example runs the job as a manual job in scheduled pipelines or in push
@@ -338,7 +338,7 @@ You can use the `$` character for both variables and paths. For example, if the
`$DOCKERFILES_DIR` variable exists, its value is used. If it does not exist, the
`$` is interpreted as being part of a path.
-## Reuse rules in different jobs
+### Reuse rules in different jobs
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/322992) in GitLab 14.3.
@@ -369,6 +369,10 @@ job2:
## Specify when jobs run with `only` and `except`
+NOTE:
+`only` and `except` are not being actively developed. [`rules`](#specify-when-jobs-run-with-rules)
+is the preferred keyword to control when to add jobs to pipelines.
+
You can use [`only`](../yaml/index.md#only--except) and [`except`](../yaml/index.md#only--except)
to control when to add jobs to pipelines.
@@ -377,14 +381,18 @@ to control when to add jobs to pipelines.
### `only:refs` / `except:refs` examples
-`only` or `except` used without `refs` is the same as
-[`only:refs` / `except/refs`](../yaml/index.md#onlyrefs--exceptrefs)
+You can use `only` or `except` with:
-In the following example, `job` runs only for:
+- Specific keywords. See the full list in the [`only`/`except` syntax reference](../yaml/index.md#onlyrefs--exceptrefs).
+- Branch names. Avoid branch names that are exactly the same as a specific keyword.
+ For example, jobs configured to run for the `tags` keyword (tag pipelines)
+ would also run for a branch named `tags`.
+- Regex patterns to specify a range of branch names.
-- Git tags
-- [Triggers](../triggers/index.md#configure-cicd-jobs-to-run-in-triggered-pipelines)
-- [Scheduled pipelines](../pipelines/schedules.md)
+The following examples omit `refs` because `only` or `except` used without `refs`
+is the same as [`only:refs` / `except/refs`](../yaml/index.md#onlyrefs--exceptrefs).
+
+For example:
```yaml
job:
@@ -395,6 +403,12 @@ job:
- schedules
```
+In this example, `job` runs only for:
+
+- Git tags
+- [Triggers](../triggers/index.md#configure-cicd-jobs-to-run-in-triggered-pipelines)
+- [Scheduled pipelines](../pipelines/schedules.md)
+
To execute jobs only for the parent repository and not forks:
```yaml
@@ -1101,5 +1115,5 @@ to change this behavior.
To run protected manual jobs:
- Add the administrator as a direct member of the private project (any role)
-- [Impersonate a user](../../user/admin_area/index.md#user-impersonation) who is a
+- [Impersonate a user](../../administration/admin_area.md#user-impersonation) who is a
direct member of the project.
diff --git a/doc/ci/migration/circleci.md b/doc/ci/migration/circleci.md
index 17cdb4f7e3e..a05fe87013c 100644
--- a/doc/ci/migration/circleci.md
+++ b/doc/ci/migration/circleci.md
@@ -16,7 +16,7 @@ We have collected several resources that you may find useful before starting to
The [Quick Start Guide](../quick_start/index.md) is a good overview of how GitLab CI/CD works. You may also be interested in [Auto DevOps](../../topics/autodevops/index.md) which can be used to build, test, and deploy your applications with little to no configuration needed at all.
-For advanced CI/CD teams, [custom project templates](../../user/admin_area/custom_project_templates.md) can enable the reuse of pipeline configurations.
+For advanced CI/CD teams, [custom project templates](../../administration/custom_project_templates.md) can enable the reuse of pipeline configurations.
If you have questions that are not answered here, the [GitLab community forum](https://forum.gitlab.com/) can be a great resource.
@@ -249,18 +249,14 @@ jobs:
Example of the same pipeline using `cache` in GitLab CI/CD:
```yaml
-image: node:latest
-
-# Cache modules in between jobs
-cache:
- key: $CI_COMMIT_REF_SLUG
- paths:
- - .npm/
-
-before_script:
- - npm ci --cache .npm --prefer-offline
-
test_async:
+ image: node:latest
+ cache: # Cache modules in between jobs
+ key: $CI_COMMIT_REF_SLUG
+ paths:
+ - .npm/
+ before_script:
+ - npm ci --cache .npm --prefer-offline
script:
- node ./specs/start.js ./specs/async.spec.js
```
diff --git a/doc/ci/migration/jenkins.md b/doc/ci/migration/jenkins.md
index dc1944e65c6..f3f14da037f 100644
--- a/doc/ci/migration/jenkins.md
+++ b/doc/ci/migration/jenkins.md
@@ -209,10 +209,10 @@ Refer to this index if these features aren't working as expected, or if you'd li
For advanced CI/CD teams, project templates can enable the reuse of pipeline configurations,
as well as encourage inner sourcing.
-In self-managed GitLab instances, you can build an [Instance Template Repository](../../user/admin_area/settings/instance_template_repository.md).
+In self-managed GitLab instances, you can build an [Instance Template Repository](../../administration/settings/instance_template_repository.md).
Development teams across the whole organization can select templates from a dropdown list.
A group maintainer or a group owner is able to set a group to use as the source for the
-[custom project templates](../../user/admin_area/custom_project_templates.md). This can
+[custom project templates](../../administration/custom_project_templates.md). This can
be used by all projects in the group. An instance administrator can set a group as
the source for [instance project templates](../../user/group/custom_project_templates.md),
which can be used by projects in that instance.
diff --git a/doc/ci/pipeline_editor/index.md b/doc/ci/pipeline_editor/index.md
index fcacc3b5d97..b6f30627b7e 100644
--- a/doc/ci/pipeline_editor/index.md
+++ b/doc/ci/pipeline_editor/index.md
@@ -11,7 +11,7 @@ type: reference
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/270059) in GitLab 13.10.
The pipeline editor is the primary place to edit the GitLab CI/CD configuration in
-the `.gitlab-ci.yml` file in the root of your repository. To access the editor, go to **CI/CD > Editor**.
+the `.gitlab-ci.yml` file in the root of your repository. To access the editor, go to **Build > Pipeline editor**.
From the pipeline editor page you can:
@@ -45,7 +45,7 @@ The **Lint** tab is replaced with the **Validate** tab in GitLab 15.3. The lint
in a successful [pipeline simulation](#simulate-a-cicd-pipeline).
To test the validity of your GitLab CI/CD configuration before committing the changes,
-you can use the CI lint tool. To access it, go to **CI/CD > Editor** and select the **Lint** tab.
+you can use the CI lint tool. To access it, go to **Build > Pipeline editor** and select the **Lint** tab.
This tool checks for syntax and logical errors but goes into more detail than the
automatic [validation](#validate-ci-configuration) in the editor.
@@ -77,11 +77,11 @@ for review.
## Visualize CI configuration
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/241722) in GitLab 13.5.
-> - [Moved to **CI/CD > Editor**](https://gitlab.com/gitlab-org/gitlab/-/issues/263141) in GitLab 13.7.
+> - [Moved to **Build > Pipeline editor**](https://gitlab.com/gitlab-org/gitlab/-/issues/263141) in GitLab 13.7.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/290117) in GitLab 13.12.
To view a visualization of your `.gitlab-ci.yml` configuration, in your project,
-go to **CI/CD > Editor**, and then select the **Visualize** tab. The
+go to **Build > Pipeline editor**, and then select the **Visualize** tab. The
visualization shows all stages and jobs. Any [`needs`](../yaml/index.md#needs)
relationships are displayed as lines connecting jobs together, showing the
hierarchy of execution:
diff --git a/doc/ci/pipelines/cicd_minutes.md b/doc/ci/pipelines/cicd_minutes.md
index c29d23cfff7..6c7b00c827a 100644
--- a/doc/ci/pipelines/cicd_minutes.md
+++ b/doc/ci/pipelines/cicd_minutes.md
@@ -7,17 +7,17 @@ type: reference
# Compute quota **(PREMIUM)**
-> [Renamed](https://gitlab.com/groups/gitlab-com/-/epics/2150) from "CI/CD minutes" to "compute quota" or "units of compute" in GitLab 16.1.
+> [Renamed](https://gitlab.com/groups/gitlab-com/-/epics/2150) from "CI/CD minutes" to "compute quota" or "compute minutes" in GitLab 16.1.
NOTE:
-The term `CI/CD minutes` is being renamed to `units of compute`. During this transition, you might see references in the UI and documentation to `CI/CD minutes`, `CI minutes`, `pipeline minutes`, `CI pipeline minutes`, `pipeline minutes quota`, and `units of compute`. For more information, see [epic 2150](https://gitlab.com/groups/gitlab-com/-/epics/2150).
+The term `CI/CD minutes` is being renamed to `compute minutes`. During this transition, you might see references in the UI and documentation to `CI/CD minutes`, `CI minutes`, `pipeline minutes`, `CI pipeline minutes`, `pipeline minutes quota`, `compute credits`, `compute units`, and `compute minutes`. For more information, see [epic 2150](https://gitlab.com/groups/gitlab-com/-/epics/2150).
Administrators can limit the amount of time that projects can use to run jobs on
[shared runners](../runners/runners_scope.md#shared-runners) each month. This limit
is tracked with a compute quota.
By default, one minute of execution time by a single job uses
-one unit of compute. The total execution time for a pipeline is
+one compute minute. The total execution time for a pipeline is
[the sum of all its jobs' durations](#how-compute-usage-is-calculated).
Jobs can run concurrently, so the total usage can be higher than the
end-to-end duration of a pipeline.
@@ -25,17 +25,17 @@ end-to-end duration of a pipeline.
On GitLab.com:
- Compute quotas are enabled for all projects, but certain
- projects [consume units of compute at a slower rate](#cost-factor).
+ projects [consume compute minutes at a slower rate](#cost-factor).
- The base monthly compute quota for a GitLab.com [namespace](../../user/namespace/index.md)
is determined by its [license tier](https://about.gitlab.com/pricing/).
-- You can [purchase additional units of compute](#purchase-additional-units-of-compute)
+- You can [purchase additional compute minutes](#purchase-additional-compute-minutes)
if you need more than the amount of compute in your monthly quota.
On self-managed GitLab instances:
- Compute quotas are disabled by default.
- When enabled, compute quotas apply to private projects only.
-- Administrators can [assign more units of compute](#set-the-compute-quota-for-a-specific-namespace)
+- Administrators can [assign more compute minutes](#set-the-compute-quota-for-a-specific-namespace)
if a namespace uses all its monthly quota.
[Project runners](../runners/runners_scope.md#project-runners) are not subject to a compute quota.
@@ -80,7 +80,7 @@ To set a compute quota for a namespace:
1. Select **Admin Area**.
1. On the left sidebar, select **Overview > Groups**.
1. For the group you want to update, select **Edit**.
-1. In the **Compute quota** box, enter the maximum number of units of compute.
+1. In the **Compute quota** box, enter the maximum number of compute minutes.
1. Select **Save changes**.
You can also use the [update group API](../../api/groups.md#update-group) or the
@@ -134,64 +134,64 @@ The projects list shows [personal projects](../../user/project/working_with_proj
with compute usage or shared runners usage in the current month only. The list
is sorted in descending order of compute usage.
-## Purchase additional units of compute **(FREE SAAS)**
+## Purchase additional compute minutes **(FREE SAAS)**
-If you're using GitLab SaaS, you can purchase additional packs of units of compute.
-These additional units of compute:
+If you're using GitLab SaaS, you can purchase additional packs of compute minutes.
+These additional compute 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.
-- Are valid for 12 months from date of purchase or until all units of compute are consumed, whichever comes first. Expiry of units of compute is not enforced.
+- Are valid for 12 months from date of purchase or until all compute minutes are consumed, whichever comes first. Expiry of compute minutes is not enforced.
For example, with a GitLab SaaS Premium license:
-- You have `10,000` monthly units of compute.
-- You purchase an additional `5,000` units of compute.
-- Your total limit is `15,000` units of compute.
+- You have `10,000` monthly compute minutes.
+- You purchase an additional `5,000` compute minutes.
+- Your total limit is `15,000` compute minutes.
-If you use `13,000` units of compute during the month, the next month your additional units of compute become
-`2,000`. If you use `9,000` units of compute during the month, your additional units of compute remain the same.
+If you use `13,000` compute minutes during the month, the next month your additional compute minutes become
+`2,000`. If you use `9,000` compute minutes during the month, your additional compute minutes remain the same.
-If you bought additional units of compute while on a trial subscription, those units of compute are available after the trial ends or you upgrade to a paid plan.
+If you bought additional compute minutes while on a trial subscription, those compute minutes are available after the trial ends or you upgrade to a paid plan.
-You can find pricing for additional units of compute on the
+You can find pricing for additional compute minutes on the
[GitLab Pricing page](https://about.gitlab.com/pricing/).
-### Purchase units of compute for a group **(FREE SAAS)**
+### Purchase compute minutes for a group **(FREE SAAS)**
Prerequisite:
- You must have the Owner role for the group.
-You can purchase additional units of compute for your group.
-You cannot transfer purchased units of compute from one group to another,
+You can purchase additional compute minutes for your group.
+You cannot transfer purchased compute minutes from one group to another,
so be sure to select the correct group.
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your group.
1. Select **Settings > Usage Quotas**.
1. Select **Pipelines**.
-1. Select **Buy additional units of compute**.
+1. Select **Buy additional compute minutes**.
1. Complete the details of the transaction.
-After your payment is processed, the additional units of compute are added to your group
+After your payment is processed, the additional compute minutes are added to your group
namespace.
-### Purchase units of compute for a personal namespace **(FREE SAAS)**
+### Purchase compute minutes for a personal namespace **(FREE SAAS)**
Prerequisite:
- The namespace must be your personal namespace.
-To purchase additional units of compute for your personal namespace:
+To purchase additional compute minutes for your personal namespace:
1. On the left sidebar, select your avatar.
1. Select **Edit profile**.
1. On the left sidebar, select **Usage Quotas**.
-1. Select **Buy additional units of compute**. GitLab redirects you to the Customers Portal.
-1. Locate the subscription card that's linked to your personal namespace on GitLab SaaS, select **Buy more units of compute**,
+1. Select **Buy additional compute minutes**. GitLab redirects you to the Customers Portal.
+1. Locate the subscription card that's linked to your personal namespace on GitLab SaaS, select **Buy more compute minutes**,
and complete the details of the transaction.
-After your payment is processed, the additional units of compute are added to your personal
+After your payment is processed, the additional compute minutes are added to your personal
namespace.
## How compute usage is calculated
@@ -206,17 +206,17 @@ Job duration * Cost factor
not including time spent in the `created` or `pending` statuses.
- [**Cost factor**](#cost-factor): A number based on project visibility.
-The value is transformed into units of compute and added to the count of used units
+The value is transformed into compute minutes and added to the count of used units
in the job's top-level namespace.
For example, if a user `alice` runs a pipeline:
-- Under the `gitlab-org` namespace, the units of compute used by each job in the pipeline are
+- Under the `gitlab-org` namespace, the compute minutes used by each job in the pipeline are
added to the overall consumption for the `gitlab-org` namespace, not the `alice` namespace.
-- For one of the personal projects in their namespace, the units of compute are added
+- For one of the personal projects in their namespace, the compute minutes are added
to the overall consumption for the `alice` namespace.
-The compute used by one pipeline is the total units of compute used by all the jobs
+The compute used by one pipeline is the total compute minutes used by all the jobs
that ran in the pipeline. Jobs can run concurrently, so the total compute usage
can be higher than the end-to-end duration of a pipeline.
@@ -228,19 +228,19 @@ The cost factors for jobs running on shared runners on GitLab.com are:
- Exceptions for public projects:
- `0.5` for projects in the [GitLab for Open Source program](../../subscriptions/community_programs.md#gitlab-for-open-source).
- `0.008` for forks of projects in the [GitLab for Open Source program](../../subscriptions/community_programs.md#gitlab-for-open-source). For every 125 minutes of job execution time,
- you use 1 unit of compute.
+ you use 1 compute minute.
- Discounted dynamically for [community contributions to GitLab projects](#cost-factor-for-community-contributions-to-gitlab-projects).
The cost factors on self-managed instances are:
-- `0` for public projects, so they do not consume units of compute.
+- `0` for public projects, so they do not consume compute minutes.
- `1` for internal and private projects.
#### Cost factor for community contributions to GitLab projects
Community contributors can use up to 300,000 minutes on shared runners when contributing to open source projects
maintained by GitLab. The maximum of 300,000 minutes would only be possible if contributing exclusively to projects [part of the GitLab product](https://about.gitlab.com/handbook/engineering/metrics/#projects-that-are-part-of-the-product). The total number of minutes available on shared runners
-is reduced by the units of compute used by pipelines from other projects.
+is reduced by the compute minutes used by pipelines from other projects.
The 300,000 minutes applies to all SaaS tiers, and the cost factor calculation is:
- `Monthly compute quota / 300,000 job duration minutes = Cost factor`
@@ -279,27 +279,27 @@ On the first day of each calendar month, the accumulated compute usage is reset
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` units of compute:
+For example, if you have a monthly quota of `10,000` compute minutes:
-- On **April 1**, you have `10,000` units of compute.
-- During April, you use only `6,000` of the `10,000` units of compute.
-- On **May 1**, the accumulated compute usage resets to `0`, and you have `10,000` units of compute to use again
+- On **April 1**, you have `10,000` compute minutes.
+- During April, you use only `6,000` of the `10,000` compute minutes.
+- On **May 1**, the accumulated compute usage resets to `0`, and you have `10,000` compute 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 units of compute
+### Monthly rollover of purchased compute minutes
-If you purchase additional units of compute and don't use the full amount, the remaining amount rolls over to
+If you purchase additional compute minutes and don't use the full amount, the remaining amount rolls over to
the next month.
For example:
-- On **April 1**, you purchase `5,000` additional units of compute.
-- During April, you use only `3,000` of the `5,000` additional units of compute.
-- On **May 1**, the unused units of compute roll over, so you have `2,000` additional units of compute available for May.
+- On **April 1**, you purchase `5,000` additional compute minutes.
+- During April, you use only `3,000` of the `5,000` additional compute minutes.
+- On **May 1**, the unused compute minutes roll over, so you have `2,000` additional compute minutes available for May.
-Additional units of compute are a one-time purchase and do not renew or refresh each month.
+Additional compute minutes are a one-time purchase and do not renew or refresh each month.
## What happens when you exceed the quota
@@ -311,7 +311,7 @@ processing new jobs.
- Any running job can be dropped at any point if the overall namespace usage goes over-quota
by a grace period.
-The grace period for running jobs is `1,000` units of compute.
+The grace period for running jobs is `1,000` compute minutes.
Jobs on project runners are not affected by the compute quota.
@@ -319,8 +319,8 @@ Jobs on project runners are not affected by the compute quota.
On GitLab SaaS an email notification is sent to the namespace owners when:
-- The remaining units of compute is below 30% of the quota.
-- The remaining units of compute is below 5% of the quota.
+- The remaining compute minutes is below 30% of the quota.
+- The remaining compute minutes is below 5% of the quota.
- All the compute quota has been used.
### Special quota limits
@@ -358,12 +358,12 @@ An administrator can reset the compute usage for a namespace for the current mon
### Reset usage for a personal namespace
-1. Find the [user in the admin area](../../user/admin_area/index.md#administering-users).
+1. Find the [user in the admin area](../../administration/admin_area.md#administering-users).
1. Select **Edit**.
1. In **Limits**, select **Reset compute usage**.
### Reset usage for a group namespace
-1. Find the [group in the admin area](../../user/admin_area/index.md#administering-groups).
+1. Find the [group in the admin area](../../administration/admin_area.md#administering-groups).
1. Select **Edit**.
1. In **Permissions and group features**, select **Reset compute usage**.
diff --git a/doc/ci/pipelines/downstream_pipelines.md b/doc/ci/pipelines/downstream_pipelines.md
index fdc03daf7ad..686020fc17a 100644
--- a/doc/ci/pipelines/downstream_pipelines.md
+++ b/doc/ci/pipelines/downstream_pipelines.md
@@ -449,6 +449,8 @@ pass `CI_MERGE_REQUEST_REF_PATH` to the downstream pipeline using [variable inhe
```yaml
build_artifacts:
+ rules:
+ - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
stage: build
script:
- echo "This is a test artifact!" >> artifact.txt
@@ -457,6 +459,8 @@ pass `CI_MERGE_REQUEST_REF_PATH` to the downstream pipeline using [variable inhe
- artifact.txt
upstream_job:
+ rules:
+ - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
variables:
UPSTREAM_REF: $CI_MERGE_REQUEST_REF_PATH
trigger:
diff --git a/doc/ci/pipelines/index.md b/doc/ci/pipelines/index.md
index c99df5b15e6..45af40a4cea 100644
--- a/doc/ci/pipelines/index.md
+++ b/doc/ci/pipelines/index.md
@@ -88,7 +88,7 @@ This table lists the refspecs injected for each pipeline type:
|--------------- |---------------------------------------- |
| pipeline for branches | `+<sha>:refs/pipelines/<id>` and `+refs/heads/<name>:refs/remotes/origin/<name>` |
| pipeline for tags | `+<sha>:refs/pipelines/<id>` and `+refs/tags/<name>:refs/tags/<name>` |
-| [merge request pipeline](../pipelines/merge_request_pipelines.md) | `+<sha>:refs/pipelines/<id>` |
+| [merge request pipeline](../pipelines/merge_request_pipelines.md) | `+refs/pipelines/<id>:refs/pipelines/<id>` |
The refs `refs/heads/<name>` and `refs/tags/<name>` exist in your
project repository. GitLab generates the special ref `refs/pipelines/<id>` during a
@@ -100,7 +100,7 @@ that might run pipelines after branch deletion.
### View pipelines
You can find the current and historical pipeline runs under your project's
-**CI/CD > Pipelines** page. You can also access pipelines for a merge request by navigating
+**Build > Pipelines** page. You can also access pipelines for a merge request by navigating
to its **Pipelines** tab.
![Pipelines index page](img/pipelines_index_v13_0.png)
@@ -290,7 +290,7 @@ pipelines.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/24851) in GitLab 12.7.
Users with the Owner role for a project can delete a pipeline
-by selecting the pipeline in the **CI/CD > Pipelines** to get to the **Pipeline Details**
+by selecting the pipeline in the **Build > Pipelines** to get to the **Pipeline Details**
page, then selecting **Delete**.
![Pipeline Delete](img/pipeline-delete.png)
@@ -433,7 +433,7 @@ If a stage contains more than 100 jobs, only the first 100 jobs are listed in th
pipeline graph. The remaining jobs still run as usual. To see the jobs:
- Select the pipeline, and the jobs are listed on the right side of the pipeline details page.
-- On the left sidebar, select **CI/CD > Jobs**.
+- On the left sidebar, select **Build > Jobs**.
### View job dependencies in the pipeline graph
diff --git a/doc/ci/pipelines/job_artifacts.md b/doc/ci/pipelines/job_artifacts.md
deleted file mode 100644
index c2630d6810d..00000000000
--- a/doc/ci/pipelines/job_artifacts.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../jobs/job_artifacts.md'
-remove_date: '2023-07-04'
----
-
-This document was moved to [another location](../jobs/job_artifacts.md).
-
-<!-- This redirect file can be deleted after <2023-07-04>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/ci/pipelines/merge_trains.md b/doc/ci/pipelines/merge_trains.md
index 7bff13aa390..c2fdbe3f6e5 100644
--- a/doc/ci/pipelines/merge_trains.md
+++ b/doc/ci/pipelines/merge_trains.md
@@ -222,7 +222,7 @@ You cannot use [auto-merge](../../user/project/merge_requests/merge_when_pipelin
(formerly **Merge when pipeline succeeds**) to skip the merge train, when merge trains are enabled.
See [issue 12267](https://gitlab.com/gitlab-org/gitlab/-/issues/12267) for more information.
-### Cannot retry merge train pipeline cannot
+### Cannot retry merge train pipeline
When a merge train pipeline fails, the merge request is dropped from the train and the pipeline can't be retried.
Merge train pipelines run on the merged result of the changes in the merge request and
diff --git a/doc/ci/pipelines/pipeline_architectures.md b/doc/ci/pipelines/pipeline_architectures.md
index dadf631e2bb..ac4c8c1a731 100644
--- a/doc/ci/pipelines/pipeline_architectures.md
+++ b/doc/ci/pipelines/pipeline_architectures.md
@@ -13,7 +13,7 @@ some of the important concepts related to them.
You can structure your pipelines with different methods, each with their
own advantages. These methods can be mixed and matched if needed:
-- [Basic](#basic-pipelines): Good for straightforward projects where all the configuration is in one easy-to-find place.
+- [Basic](#basic-pipelines): Good for straightforward projects where all the configuration is in one place.
- [Directed Acyclic Graph](#directed-acyclic-graph-pipelines): Good for large, complex projects that need efficient execution.
- [Parent-child pipelines](#parent-child-pipelines): Good for monorepos and projects with lots of independently defined components.
@@ -31,9 +31,9 @@ own advantages. These methods can be mixed and matched if needed:
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
For an overview, see the [Multi-project pipelines demo](https://www.youtube.com/watch?v=g_PIwBM1J84).
-## Basic Pipelines
+## Basic pipelines
-This is the simplest pipeline in GitLab. It runs everything in the build stage concurrently,
+Basic pipelines are the simplest pipelines in GitLab. It runs everything in the build stage concurrently,
and once all of those finish, it runs everything in the test and subsequent stages the same way.
It's not the most efficient, and if you have lots of steps it can grow quite complex, but it's
easier to maintain:
@@ -66,7 +66,8 @@ stages:
- test
- deploy
-image: alpine
+default:
+ image: alpine
build_a:
stage: build
@@ -132,7 +133,8 @@ stages:
- test
- deploy
-image: alpine
+default:
+ image: alpine
build_a:
stage: build
@@ -251,7 +253,8 @@ stages:
- test
- deploy
-image: alpine
+default:
+ image: alpine
build_a:
stage: build
@@ -281,7 +284,8 @@ stages:
- test
- deploy
-image: alpine
+default:
+ image: alpine
build_b:
stage: build
diff --git a/doc/ci/pipelines/pipeline_security.md b/doc/ci/pipelines/pipeline_security.md
index f035779e665..d499da21b88 100644
--- a/doc/ci/pipelines/pipeline_security.md
+++ b/doc/ci/pipelines/pipeline_security.md
@@ -13,18 +13,18 @@ Secrets management is the systems that developers use to securely store sensitiv
in a secure environment with strict access controls. A **secret** is a sensitive credential
that should be kept confidential, and includes:
-- Passwords
-- SSH keys
-- Access tokens
-- Other types of credentials
+- Passwords.
+- SSH keys.
+- Access tokens.
+- Any other types of credentials where exposure would be harmful to an organization.
## Secrets storage
### Secrets management providers
Secrets that are the most sensitive and under the strictest policies should be stored
-in a separate secrets management provider such as [Vault](https://www.vaultproject.io).
-The secrets are stored outside of the GitLab instance, which is the safest option.
+in a secrets management. [Vault](https://www.vaultproject.io) is one provider in this space.
+When using Vault, secrets are stored outside of the GitLab instance.
You can use the GitLab [Vault integration](../secrets/index.md#use-vault-secrets-in-a-ci-job)
to retrieve those secrets in CI/CD pipelines when they are needed.
@@ -39,7 +39,7 @@ Variable values:
to the settings have access to the variables.
- Can be [overridden](../variables/index.md#override-a-defined-cicd-variable),
making it hard to determine which value was used.
-- Are more easily exposed by accidental pipeline misconfiguration.
+- Can be exposed by accidental pipeline misconfiguration.
Sensitive data should be stored in a secrets management solution. If there is low
sensitivity data that you want to store in a CI/CD variable, be sure to always:
diff --git a/doc/ci/pipelines/settings.md b/doc/ci/pipelines/settings.md
index 38cdc5ed578..fe6c88c9c4d 100644
--- a/doc/ci/pipelines/settings.md
+++ b/doc/ci/pipelines/settings.md
@@ -31,7 +31,7 @@ To change the visibility of your pipelines and related features:
When it is selected, pipelines and related features are visible:
- For [**Public**](../../user/public_access.md) projects, to everyone.
- - For **Internal** projects, to all authenticated users except [external users](../../user/admin_area/external_users.md).
+ - For **Internal** projects, to all authenticated users except [external users](../../administration/external_users.md).
- For **Private** projects, to all project members (Guest or higher).
When it is cleared:
@@ -40,7 +40,7 @@ To change the visibility of your pipelines and related features:
and the **CI/CD** menu items are visible only to project members (Reporter or higher).
Other users, including guest users, can only view the status of pipelines and jobs, and only
when viewing merge requests or commits.
- - For **Internal** projects, pipelines are visible to all authenticated users except [external users](../../user/admin_area/external_users.md).
+ - For **Internal** projects, pipelines are visible to all authenticated users except [external users](../../administration/external_users.md).
Related features are visible only to project members (Reporter or higher).
- For **Private** projects, pipelines and related features are visible to project members (Reporter or higher) only.
diff --git a/doc/ci/quick_start/index.md b/doc/ci/quick_start/index.md
index ec58491e604..80bb9f63413 100644
--- a/doc/ci/quick_start/index.md
+++ b/doc/ci/quick_start/index.md
@@ -68,7 +68,7 @@ In this file, you define:
To create a `.gitlab-ci.yml` file:
-1. On the left sidebar, select **Repository > Files**.
+1. On the left sidebar, select **Code > Repository**.
1. Above the file list, select the branch you want to commit to.
If you're not sure, leave `master` or `main`.
Then select the plus icon (**{plus}**) and **New file**:
@@ -117,7 +117,7 @@ The pipeline starts and runs the jobs you defined in the `.gitlab-ci.yml` file.
Now take a look at your pipeline and the jobs within.
-1. Go to **CI/CD > Pipelines**. A pipeline with three stages should be displayed:
+1. Go to **Build > Pipelines**. A pipeline with three stages should be displayed:
![Three stages](img/three_stages_v13_6.png)
diff --git a/doc/ci/review_apps/index.md b/doc/ci/review_apps/index.md
index ddb8f0aaa61..e1be6118bab 100644
--- a/doc/ci/review_apps/index.md
+++ b/doc/ci/review_apps/index.md
@@ -204,7 +204,7 @@ and is planned for removal in 17.0. This change is a breaking change.
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 `anonymous_visual_review_feedback`.
+an administrator can [enable the feature flag](../../administration/feature_flags.md) named `anonymous_visual_review_feedback`.
With Visual Reviews, members of any team (Product, Design, Quality, and so on) can provide feedback comments through a form in your review apps. The comments are added to the merge request that triggered the review app.
@@ -255,7 +255,7 @@ to replace those values at runtime when each review app is created:
variable.
- `data-merge-request-id` is the merge request ID, which can be found by the
`CI_MERGE_REQUEST_IID` variable. `CI_MERGE_REQUEST_IID` is available only if
- [`only: [merge_requests]`](../pipelines/merge_request_pipelines.md)
+ [`rules:if: $CI_PIPELINE_SOURCE == "merge_request_event`](../pipelines/merge_request_pipelines.md#use-rules-to-add-jobs)
is used and the merge request is created.
- `data-mr-url` is the URL of the GitLab instance and is the same for all
review apps.
diff --git a/doc/ci/runners/configure_runners.md b/doc/ci/runners/configure_runners.md
index c365cc934db..9424f8ea846 100644
--- a/doc/ci/runners/configure_runners.md
+++ b/doc/ci/runners/configure_runners.md
@@ -140,45 +140,6 @@ and then [register](https://docs.gitlab.com/runner/commands/#gitlab-runner-regis
To verify that the previous authentication token has been revoked, use the [Runners API](../../api/runners.md#verify-authentication-for-a-registered-runner).
-## Determine the IP address of a runner
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/17286) in GitLab 10.6.
-
-It may be useful to know the IP address of a runner so you can troubleshoot
-issues with that runner. GitLab stores and displays the IP address by viewing
-the source of the HTTP requests it makes to GitLab when polling for jobs. The
-IP address is always kept up to date so if the runner IP changes it
-automatically updates in GitLab.
-
-The IP address for shared runners and project runners can be found in
-different places.
-
-### Determine the IP address of a shared runner
-
-Prerequisite:
-
-- You must have administrator access to the instance.
-
-To determine the IP address of a shared runner:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. On the left sidebar, select **CI/CD > Runners**.
-1. Find the runner in the table and view the **IP Address** column.
-
-![shared runner IP address](img/shared_runner_ip_address_14_5.png)
-
-### Determine the IP address of a project runner
-
-To can find the IP address of a runner for a project project,
-you must have the Owner role for the
-project.
-
-1. Go to the project's **Settings > CI/CD** and expand the **Runners** section.
-1. On the details page you should see a row for **IP Address**.
-
-![Project runner IP address](img/project_runner_ip_address.png)
-
## Use tags to control which jobs a runner can run
You must set up a runner to be able to run all the different types of jobs
@@ -313,17 +274,6 @@ variables:
- echo "Hello runner selector feature"
```
-## Runner statuses
-
-A runner can have one of the following statuses.
-
-| Status | Description |
-|---------|-------------|
-| `online` | The runner has contacted GitLab within the last 2 hours and is available to run jobs. |
-| `offline` | The runner has not contacted GitLab in more than 2 hours and is not available to run jobs. Check the runner to see if you can bring it online. |
-| `stale` | The runner has not contacted GitLab in more than 3 months. If the runner was created more than 3 months ago, but it never contacted the instance, it is also considered **stale**. |
-| `never_contacted` | The runner has never contacted GitLab. To make the runner contact GitLab, run `gitlab-runner run`. |
-
## Configure runner behavior with variables
You can use [CI/CD variables](../variables/index.md) to configure runner Git behavior
@@ -948,91 +898,6 @@ setting.
be read from concurrency, so no additional memory is allocated in addition to what the decompressor requires. This
defaults to the number of CPUs available.
-## Clean up stale runners **(ULTIMATE)**
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/363012) in GitLab 15.1.
-
-You can clean up group runners that have been inactive for more than three months.
-
-Group runners are those that were created at the group level.
-
-1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your group.
-1. Select **Settings > CI/CD**.
-1. Expand **Runners**.
-1. Turn on the **Enable stale runner cleanup** toggle.
-
-### View stale runner cleanup logs
-
-You can check the [Sidekiq logs](../../administration/logs/index.md#sidekiq-logs) to see the cleanup result. In Kibana you can use the following query:
-
-```json
-{
- "query": {
- "match_phrase": {
- "json.class.keyword": "Ci::Runners::StaleGroupRunnersPruneCronWorker"
- }
- }
-}
-```
-
-Filter entries where stale runners were removed:
-
-```json
-{
- "query": {
- "range": {
- "json.extra.ci_runners_stale_group_runners_prune_cron_worker.total_pruned": {
- "gte": 1,
- "lt": null
- }
- }
- }
-}
-```
-
-## Determine which runners need to be upgraded **(ULTIMATE)**
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/365078) in GitLab 15.3.
-
-The version of GitLab Runner used by your runners should be
-[kept up-to-date](https://docs.gitlab.com/runner/index.html#gitlab-runner-versions).
-
-To determine which runners need to be upgraded:
-
-1. View the list of runners:
- - For a group:
- 1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your group.
- 1. Select **Build > Runners**.
- - For the instance:
- 1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
- 1. Select **Admin Area**.
- 1. Select **CI/CD > Runners**.
-
-1. Above the list of runners, view the status:
- - **Outdated - recommended**: The runner does not have the latest `PATCH` version, which may make it vulnerable
- to security or high severity bugs. Or, the runner is one or more `MAJOR` versions behind your GitLab instance, so some features may not be available or work properly.
- - **Outdated - available**: Newer versions are available but upgrading is not critical.
-
-1. Filter the list by status to view which individual runners need to be upgraded.
-
-## View statistics for runner performance **(ULTIMATE)**
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/377963) in GitLab 15.8.
-
-As an administrator, you can view runner statistics to learn about the performance of your runner fleet.
-
-1. Select **Main menu > Admin**.
-1. On the left sidebar, select **CI/CD > Runners**.
-1. Select **View metrics**.
-
-The **Median job queued time** value is calculated by sampling the queue duration of the
-most recent 100 jobs that were run by Instance runners. Jobs from only the latest 5000
-runners are considered.
-
-The median is a value that falls into the 50th percentile: half of the jobs
-queued for longer than the median value, and half of the jobs queued for less than the
-median value.
-
## Authentication token security
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/30942) in GitLab 15.3 [with a flag](../../administration/feature_flags.md) named `enforce_runner_token_expires_at`. Disabled by default.
diff --git a/doc/ci/runners/index.md b/doc/ci/runners/index.md
index 19c5be88c1b..5427911e1ce 100644
--- a/doc/ci/runners/index.md
+++ b/doc/ci/runners/index.md
@@ -17,15 +17,10 @@ Your jobs can run on:
- [Windows runners](saas/windows_saas_runner.md) ([Beta](../../policy/experiment-beta-support.md#beta))
- [macOS runners](saas/macos_saas_runner.md) ([Beta](../../policy/experiment-beta-support.md#beta))
-Refer to the Compute [cost factor](../../ci/pipelines/cicd_minutes.md#cost-factor) for the cost factor applied to the machine type based on size.
-The number of minutes you can use on these runners depends on the [maximum number of units of compute](../pipelines/cicd_minutes.md)
+Refer to the compute minutes [cost factor](../../ci/pipelines/cicd_minutes.md#cost-factor) for the cost factor applied to the machine type based on size.
+The number of minutes you can use on these runners depends on the [maximum number of compute minutes](../pipelines/cicd_minutes.md)
in your [subscription plan](https://about.gitlab.com/pricing/).
-[Untagged](../../ci/runners/configure_runners.md#use-tags-to-control-which-jobs-a-runner-can-run) jobs automatically run in containers
-on the `small` Linux runners.
-
-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%.
-
## How SaaS runners work
When you use SaaS runners:
@@ -35,6 +30,9 @@ When you use SaaS runners:
- The virtual machine where your job runs has `sudo` access with no password.
- The storage is shared by the operating system, the image with pre-installed software, and a copy of your cloned repository.
This means that the available free disk space for your jobs to use is reduced.
+- [Untagged](../../ci/runners/configure_runners.md#use-tags-to-control-which-jobs-a-runner-can-run) jobs automatically run in containers
+on the `small` Linux runners.
+- The objective is to make 90% of CI jobs start executing in 120 seconds or less. The error rate target will be less than 0.5%.
NOTE:
Jobs handled by SaaS runners on GitLab.com **time out after 3 hours**, regardless of the timeout configured in a project.
diff --git a/doc/ci/runners/new_creation_workflow.md b/doc/ci/runners/new_creation_workflow.md
index 0c43fd21d1d..fce4b57b2a1 100644
--- a/doc/ci/runners/new_creation_workflow.md
+++ b/doc/ci/runners/new_creation_workflow.md
@@ -61,7 +61,7 @@ workflow will break.
To avoid a broken workflow, you must:
-1. [Create a shared runner](register_runner.md#for-a-shared-runner) and obtain the authentication token.
+1. [Create a shared runner](runners_scope.md#create-a-shared-runner-with-an-authentication-token) and obtain the authentication token.
1. Replace the registration token in your runner registration workflow with the
authentication token.
@@ -80,10 +80,25 @@ The `gitlab-runner register` command will stop accepting registration tokens and
authentication tokens generated in the GitLab runners administration page.
These authentication tokens are recognizable by their `glrt-` prefix.
+When you create a runner in the GitLab UI, you specify configuration values that were previously command-line options
+prompted by the `gitlab-runner register` command.
+These command-line options have been [deprecated](../../update/deprecations.md#registration-tokens-and-server-side-runner-arguments-in-post-apiv4runners-endpoint).
+
+If you specify an authentication token with:
+
+- the `--token` command-line option, the `gitlab-runner register` command does not accept the configuration values.
+- the `--registration-token` command-line option, the `gitlab-runner register` command ignores the configuration values.
+
+Authentication tokens have the prefix, `glrt-`.
+
+To ensure minimal disruption to your automation workflow,
+[legacy-compatible registration processing](https://docs.gitlab.com/runner/register/#legacy-compatible-registration-processing)
+triggers if an authentication token is specified in the legacy parameter `--registration-token`.
+
Example command for GitLab 15.9:
```shell
-gitlab-runner register
+gitlab-runner register \
--non-interactive \
--executor "shell" \
--url "https://gitlab.com/" \
@@ -101,7 +116,7 @@ In GitLab 15.11 and later, these attributes are no longer accepted as arguments
The following example shows the new command:
```shell
-gitlab-runner register
+gitlab-runner register \
--non-interactive \
--executor "shell" \
--url "https://gitlab.com/" \
diff --git a/doc/ci/runners/register_runner.md b/doc/ci/runners/register_runner.md
index 9c63850e38a..bca11682258 100644
--- a/doc/ci/runners/register_runner.md
+++ b/doc/ci/runners/register_runner.md
@@ -1,128 +1,11 @@
---
-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/product/ux/technical-writing/#assignments
+redirect_to: 'runners_scope.md'
+remove_date: '2023-09-21'
---
-# Generate runner tokens **(FREE)**
+This document was moved to [another location](runners_scope.md).
-To register a runner, you can use either:
-
-- An authentication token assigned to the runner when you create the runner in the UI. The runner uses the token to authenticate with GitLab when picking up jobs from the job queue.
-- A registration token (deprecated).
-
-## Generate an authentication token
-
-Registration with an authentication token is available for all runners.
-
-NOTE:
-The token only displays in the UI for a short period of time during registration.
-
-### For a shared runner
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/383139) in GitLab 15.10. Deployed behind the `create_runner_workflow_for_admin` [flag](../../administration/feature_flags.md)
-> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/389269) in GitLab 16.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 `create_runner_workflow_for_admin`.
-
-Prerequisites:
-
-- You must be an administrator.
-
-To generate an authentication token for a shared runner:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. On the left sidebar, select **CI/CD > Runners**.
-1. Select **New instance runner**.
-1. Select a platform.
-1. Optional. Enter configurations for the runner.
-1. Select **Submit**.
-1. Follow the instructions to register the runner from the command line.
-
-You can also [create a runner](../../api/users.md#create-a-runner) with the API to generate an authentication token.
-
-### For a group runner
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/383143) in GitLab 15.10. Deployed behind the `create_runner_workflow_for_namespace` [flag](../../administration/feature_flags.md). Disabled by default.
-> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/393919) in GitLab 16.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 `create_runner_workflow_for_namespace`.
-
-Prerequisites:
-
-- You must have the Owner role for the group.
-
-To generate an authentication token for a group runner:
-
-1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your group.
-1. Select **Build > Runners**.
-1. Select **New group runner**.
-1. Select a platform.
-1. Optional. Enter configurations for the runner.
-1. Select **Submit**.
-1. Follow the instructions to register the runner from the command line.
-
-You can also [create a runner](../../api/users.md#create-a-runner) with the API to generate an authentication token.
-
-### For a project runner
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/383143) in GitLab 15.10. Deployed behind the `create_runner_workflow_for_namespace` [flag](../../administration/feature_flags.md). Disabled by default.
-> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/393919) in GitLab 16.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 `create_runner_workflow_for_namespace`.
-
-Prerequisites:
-
-- You must have the Maintainer role for the project.
-
-To generate an authentication token for a project runner:
-
-1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
-1. Select **Settings > CI/CD**.
-1. Expand the **Runners** section.
-1. Select **New project runner**.
-1. Select a platform.
-1. Optional. Enter configurations for the runner.
-1. Select **Submit**.
-1. Follow the instructions to register the runner from the command line.
-
-You can also [create a runner](../../api/users.md#create-a-runner) with the API to generate an authentication token.
-
-## Generate a registration token (deprecated)
-
-WARNING:
-The ability to pass a runner registration token, and support for certain configuration arguments was
-[deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/380872) in GitLab 15.6. Authentication tokens
-should be used instead to register runners. Registration tokens, and support for certain configuration
-arguments, will be removed in GitLab 17.0. For more information, see [Migrating to the new runner registration workflow](new_creation_workflow.md).
-The configuration arguments disabled for `glrt-` tokens will be `--locked`, `--access-level`,
-`--run-untagged`, `--maximum-timeout`, `--paused`, `--tag-list`, and `--maintenance-note`. This change is a breaking
-change.
-
-### For a shared runner
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **CI/CD > Runners**.
-1. Select **Register an instance runner**.
-1. Copy the registration token.
-
-### For a group runner
-
-1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your group.
-1. Select **Build > Runners**.
-1. Copy the registration token.
-
-### For a project runner
-
-1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
-1. Select **Settings > CI/CD**.
-1. Expand the **Runners** section.
-1. Copy the registration token.
+<!-- This redirect file can be deleted after <YYYY-MM-DD>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/ci/runners/runners_scope.md b/doc/ci/runners/runners_scope.md
index e7b764025c9..840eb7fe93b 100644
--- a/doc/ci/runners/runners_scope.md
+++ b/doc/ci/runners/runners_scope.md
@@ -5,9 +5,9 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference
---
-# The scope of runners **(FREE)**
+# Manage runners
-Runners are available based on who you want to have access:
+GitLab Runner has the following types of runners, which are available based on who you want to have access:
- [Shared runners](#shared-runners) are available to all groups and projects in a GitLab instance.
- [Group runners](#group-runners) are available to all projects and subgroups in a group.
@@ -24,26 +24,71 @@ multiple projects.
If you are using a self-managed instance of GitLab:
-- Your administrator can install and register shared runners by
- going to your project's **Settings > CI/CD**, expanding **Runners**,
- and selecting **Show runner installation instructions**.
- These instructions are also available [in the documentation](https://docs.gitlab.com/runner/install/index.html).
+- Your administrator can [install GitLab Runner](https://docs.gitlab.com/runner/install/index.html) and register a shared runner.
- The administrator can also configure a maximum number of shared runner
- [units of compute for each group](../pipelines/cicd_minutes.md#set-the-compute-quota-for-a-specific-namespace).
+ [compute minutes for each group](../pipelines/cicd_minutes.md#set-the-compute-quota-for-a-specific-namespace).
If you are using GitLab.com:
- You can select from a list of [shared runners that GitLab maintains](index.md).
-- The shared runners consume the [units of compute](../pipelines/cicd_minutes.md)
+- The shared runners consume the [compute minutes](../pipelines/cicd_minutes.md)
included with your account.
+### Create a shared runner with an authentication token
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/383139) in GitLab 15.10. Deployed behind the `create_runner_workflow_for_admin` [flag](../../administration/feature_flags.md)
+> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/389269) in GitLab 16.0.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/415447) in GitLab 16.2. Feature flag `create_runner_workflow_for_admin` removed.
+
+Prerequisites:
+
+- You must be an administrator.
+
+When you create a runner, it is assigned an authentication token that you use to register it. The runner uses the token to authenticate with GitLab when picking up jobs from the job queue.
+
+To create a shared runner:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. On the left sidebar, select **CI/CD > Runners**.
+1. Select **New instance runner**.
+1. Select a platform.
+1. Optional. Enter configurations for the runner.
+1. Select **Submit**.
+1. Follow the on-screen instructions to register the runner from the command line.
+
+You can also [create a runner](../../api/users.md#create-a-runner) with the API to generate an authentication token.
+
+NOTE:
+The authentication token displays in the UI for only a short period of time during registration.
+
+### Create a shared runner with a registration token (deprecated)
+
+WARNING:
+The ability to pass a runner registration token, and support for certain configuration arguments was
+[deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/380872) in GitLab 15.6 and will be removed in GitLab 17.0. Authentication tokens
+should be used instead. For more information, see [Migrating to the new runner registration workflow](new_creation_workflow.md).
+
+Prerequisites:
+
+- You must be an administrator.
+
+To create a shared runner:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **CI/CD > Runners**.
+1. Select **Register an instance runner**.
+1. Copy the registration token.
+1. [Register the runner](https://docs.gitlab.com/runner/register/).
+
### Enable shared runners for a project
On GitLab.com, [shared runners](index.md) are enabled in all projects by
default.
On self-managed instances of GitLab, an administrator can
-[enable them for all new projects](../../user/admin_area/settings/continuous_integration.md#enable-shared-runners-for-new-projects).
+[enable them for all new projects](../../administration/settings/continuous_integration.md#enable-shared-runners-for-new-projects).
For existing projects, an administrator must
[install](https://docs.gitlab.com/runner/install/index.html) and
@@ -94,10 +139,6 @@ To disable shared runners for a group:
1. Optional. To allow shared runners to be enabled for individual projects or subgroups,
select **Allow projects and subgroups to override the group setting**.
-NOTE:
-If you re-enable the shared runners for a group after you disable them, a user with the
-Owner or Maintainer role must manually change this setting for each project subgroup or project.
-
### How shared runners pick jobs
Shared runners process jobs by using a fair usage queue. This queue prevents
@@ -143,11 +184,43 @@ to have access to a set of runners.
Group runners process jobs by using a first in, first out ([FIFO](https://en.wikipedia.org/wiki/FIFO_(computing_and_electronics))) queue.
-### Create a group runner
+### Create a group runner with an authentication token
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/19819) in GitLab 14.10, path changed from **Settings > CI/CD > Runners**.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/383143) in GitLab 15.10. Deployed behind the `create_runner_workflow_for_namespace` [flag](../../administration/feature_flags.md). Disabled by default.
+> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/393919) in GitLab 16.0.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/415447) in GitLab 16.2. Feature flag `create_runner_workflow_for_admin` removed.
+
+Prerequisites:
+
+- You must have the Owner role for the group.
You can create a group runner for your self-managed GitLab instance or for GitLab.com.
+When you create a runner, it is assigned an authentication token that you use to register it. The runner uses the token to authenticate with GitLab when picking up jobs from the job queue.
+
+To create a group runner:
+
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your group.
+1. Select **Build > Runners**.
+1. Select **New group runner**.
+1. Select a platform.
+1. Optional. Enter configurations for the runner.
+1. Select **Submit**.
+1. Follow the on-screen instructions to register the runner from the command line.
+
+You can also [create a runner](../../api/users.md#create-a-runner) with the API to generate an authentication token.
+
+NOTE:
+The authentication token displays in the UI for only a short period of time during registration.
+
+### Create a group runner with a registration token (deprecated)
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/19819) in GitLab 14.10, path changed from **Settings > CI/CD > Runners**.
+
+WARNING:
+The ability to pass a runner registration token, and support for certain configuration arguments was
+[deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/380872) in GitLab 15.6 and will be removed in GitLab 17.0. Authentication tokens
+should be used instead. For more information, see [Migrating to the new runner registration workflow](new_creation_workflow.md).
+
You must have the Owner role for the group.
To create a group runner:
@@ -224,6 +297,48 @@ You must have the Owner role for the group.
You must remove it from each project first.
1. On the confirmation dialog, select **OK**.
+### Clean up stale group runners **(ULTIMATE)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/363012) in GitLab 15.1.
+
+You can clean up group runners that have been inactive for more than three months.
+
+Group runners are those that were created at the group level.
+
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your group.
+1. Select **Settings > CI/CD**.
+1. Expand **Runners**.
+1. Turn on the **Enable stale runner cleanup** toggle.
+
+#### View stale runner cleanup logs
+
+You can check the [Sidekiq logs](../../administration/logs/index.md#sidekiq-logs) to see the cleanup result. In Kibana you can use the following query:
+
+```json
+{
+ "query": {
+ "match_phrase": {
+ "json.class.keyword": "Ci::Runners::StaleGroupRunnersPruneCronWorker"
+ }
+ }
+}
+```
+
+Filter entries where stale runners were removed:
+
+```json
+{
+ "query": {
+ "range": {
+ "json.extra.ci_runners_stale_group_runners_prune_cron_worker.total_pruned": {
+ "gte": 1,
+ "lt": null
+ }
+ }
+ }
+}
+```
+
## Project runners
Use _project runners_ when you want to use runners for specific projects. For example,
@@ -241,9 +356,40 @@ NOTE:
Project runners do not get shared with forked projects automatically.
A fork *does* copy the CI/CD settings of the cloned repository.
-### Create a project runner
+### Create a project runner with an authentication token
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/383143) in GitLab 15.10. Deployed behind the `create_runner_workflow_for_namespace` [flag](../../administration/feature_flags.md). Disabled by default.
+> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/393919) in GitLab 16.0.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/415447) in GitLab 16.2. Feature flag `create_runner_workflow_for_admin` removed.
+
+Prerequisites:
+
+- You must have the Maintainer role for the project.
+
+You can create a project runner for your self-managed GitLab instance or for GitLab.com. When you create a runner, it is assigned an authentication token that you use to register to the runner. The runner uses the token to authenticate with GitLab when picking up jobs from the job queue.
-You can create a project runner for your self-managed GitLab instance or for GitLab.com.
+To create a project runner:
+
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
+1. Select **Settings > CI/CD**.
+1. Expand the **Runners** section.
+1. Select **New project runner**.
+1. Select a platform.
+1. Optional. Enter configurations for the runner.
+1. Select **Submit**.
+1. Follow the on-screen instructions to register the runner from the command line.
+
+You can also [create a runner](../../api/users.md#create-a-runner) with the API to generate an authentication token.
+
+NOTE:
+The authentication token displays in the UI for only a short period of time during registration.
+
+### Create a project runner with a registration token (deprecated)
+
+WARNING:
+The ability to pass a runner registration token, and support for certain configuration arguments was
+[deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/380872) in GitLab 15.6 and will be removed in GitLab 17.0. Authentication tokens
+should be used instead. For more information, see [Migrating to the new runner registration workflow](new_creation_workflow.md).
Prerequisite:
@@ -284,7 +430,7 @@ You can edit a project runner from any of the projects it's enabled for.
The modifications, which include unlocking and editing tags and the description,
affect all projects that use the runner.
-An administrator can [enable the runner for multiple projects](../../user/admin_area/settings/continuous_integration.md#enable-a-project-runner-for-multiple-projects).
+An administrator can [enable the runner for multiple projects](../../administration/settings/continuous_integration.md#enable-a-project-runner-for-multiple-projects).
### Prevent a project runner from being enabled for other projects
@@ -302,3 +448,95 @@ To lock or unlock a project runner:
1. Select **Edit** (**{pencil}**).
1. Select the **Lock to current projects** checkbox.
1. Select **Save changes**.
+
+## Runner statuses
+
+A runner can have one of the following statuses.
+
+| Status | Description |
+|---------|-------------|
+| `online` | The runner has contacted GitLab within the last 2 hours and is available to run jobs. |
+| `offline` | The runner has not contacted GitLab in more than 2 hours and is not available to run jobs. Check the runner to see if you can bring it online. |
+| `stale` | The runner has not contacted GitLab in more than 3 months. If the runner was created more than 3 months ago, but it never contacted the instance, it is also considered **stale**. |
+| `never_contacted` | The runner has never contacted GitLab. To make the runner contact GitLab, run `gitlab-runner run`. |
+
+## View statistics for runner performance **(ULTIMATE)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/377963) in GitLab 15.8.
+
+As an administrator, you can view runner statistics to learn about the performance of your runner fleet.
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. On the left sidebar, select **CI/CD > Runners**.
+1. Select **View metrics**.
+
+The **Median job queued time** value is calculated by sampling the queue duration of the
+most recent 100 jobs that were run by Instance runners. Jobs from only the latest 5000
+runners are considered.
+
+The median is a value that falls into the 50th percentile: half of the jobs
+queued for longer than the median value, and half of the jobs queued for less than the
+median value.
+
+## Determine which runners need to be upgraded **(ULTIMATE)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/365078) in GitLab 15.3.
+
+The version of GitLab Runner used by your runners should be
+[kept up-to-date](https://docs.gitlab.com/runner/index.html#gitlab-runner-versions).
+
+To determine which runners need to be upgraded:
+
+1. View the list of runners:
+ - For a group:
+ 1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your group.
+ 1. Select **Build > Runners**.
+ - For the instance:
+ 1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+ 1. Select **Admin Area**.
+ 1. Select **CI/CD > Runners**.
+
+1. Above the list of runners, view the status:
+ - **Outdated - recommended**: The runner does not have the latest `PATCH` version, which may make it vulnerable
+ to security or high severity bugs. Or, the runner is one or more `MAJOR` versions behind your GitLab instance, so some features may not be available or work properly.
+ - **Outdated - available**: Newer versions are available but upgrading is not critical.
+
+1. Filter the list by status to view which individual runners need to be upgraded.
+
+## Determine the IP address of a runner
+
+It may be useful to know the IP address of a runner so you can troubleshoot
+issues with that runner. GitLab stores and displays the IP address by viewing
+the source of the HTTP requests it makes to GitLab when polling for jobs. The
+IP address is always kept up to date so if the runner IP changes it
+automatically updates in GitLab.
+
+The IP address for shared runners and project runners can be found in
+different places.
+
+### Determine the IP address of a shared runner
+
+Prerequisite:
+
+- You must have administrator access to the instance.
+
+To determine the IP address of a shared runner:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. On the left sidebar, select **CI/CD > Runners**.
+1. Find the runner in the table and view the **IP Address** column.
+
+![shared runner IP address](img/shared_runner_ip_address_14_5.png)
+
+### Determine the IP address of a project runner
+
+To can find the IP address of a runner for a project project,
+you must have the Owner role for the
+project.
+
+1. Go to the project's **Settings > CI/CD** and expand the **Runners** section.
+1. On the details page you should see a row for **IP Address**.
+
+![Project runner IP address](img/project_runner_ip_address.png)
diff --git a/doc/ci/runners/saas/gpu_saas_runner.md b/doc/ci/runners/saas/gpu_saas_runner.md
index 7b83f6593a0..a05b162ac84 100644
--- a/doc/ci/runners/saas/gpu_saas_runner.md
+++ b/doc/ci/runners/saas/gpu_saas_runner.md
@@ -15,9 +15,9 @@ GitLab provides GPU-enabled runners only on Linux. For more information about ho
The following machine types are available for GPU-enabled runners on Linux x86-64.
-| Runner Tag | vCPUs | Memory | Storage | GPU |
-|----------------------------------------|-------|--------|---------|------------------------------------|
-| `saas-linux-medium-amd64-gpu-standard` | 4 | 16 GB | 50 GB | 1 Nvidia Tesla T4 GPU (or similar) |
+| Runner Tag | vCPUs | Memory | Storage | GPU | GPU Memory |
+|----------------------------------------|-------|--------|---------|--------------------------------|------------|
+| `saas-linux-medium-amd64-gpu-standard` | 4 | 15 GB | 50 GB | 1 Nvidia Tesla T4 (or similar) | 16 GB |
## Container images with GPU drivers
diff --git a/doc/ci/runners/saas/linux_saas_runner.md b/doc/ci/runners/saas/linux_saas_runner.md
index d95fc701056..95917bbc300 100644
--- a/doc/ci/runners/saas/linux_saas_runner.md
+++ b/doc/ci/runners/saas/linux_saas_runner.md
@@ -81,16 +81,12 @@ If you want to [contribute to GitLab](https://about.gitlab.com/community/contrib
`gitlab-shared-runners-manager-X.gitlab.com` fleet of runners, dedicated for GitLab projects and related community forks.
These runners are backed by the same machine type as our `small` runners.
-Unlike the normal SaaS runners on Linux, each virtual machine is re-used up to 40 times.
+Unlike the most commonly used SaaS runners on Linux, each virtual machine is re-used up to 40 times.
As we want to encourage people to contribute, these runners are free of charge.
-<!--- start_remove The following content will be removed on remove_date: '2023-08-22' -->
-
-## Pre-clone script (removed)
+## Pre-clone script (deprecated)
This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/391896) in GitLab 15.9
-and [removed](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/29405) in 16.0.
+and [will be removed](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/29405) in 17.0.
Use [`pre_get_sources_script`](../../../ci/yaml/index.md#hookspre_get_sources_script) instead.
-
-<!--- end_remove -->
diff --git a/doc/ci/runners/saas/macos_saas_runner.md b/doc/ci/runners/saas/macos_saas_runner.md
index 836a14d7521..a559fc7d53e 100644
--- a/doc/ci/runners/saas/macos_saas_runner.md
+++ b/doc/ci/runners/saas/macos_saas_runner.md
@@ -45,7 +45,7 @@ Each image runs a specific version of macOS and Xcode.
| (none, awaiting macOS 13) | `beta` |
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 increasing the total job duration.
+If your job requires tooling or dependencies not available in our available images, those can only be installed in the job execution.
## Image update policy
@@ -88,9 +88,6 @@ test:
- echo "running scripts in the test job"
```
-NOTE:
-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](#supported-macos-images) from the list of available images. The default value is our latest image.
-
## Code signing iOS Projects with fastlane
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.
@@ -106,22 +103,22 @@ Related topics:
- [Code Signing Best Practice Guide](https://codesigning.guide/)
- [fastlane authentication with Apple Services guide](https://docs.fastlane.tools/getting-started/ios/authentication/)
-## 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.
-- The keychain for user `gitlab` is not publicly available. You must create a keychain instead.
-
## Optimizing Homebrew
By default, Homebrew checks for updates at the start of any operation. Homebrew has a
-release cycle that may be more frequent than the GitLab MacOS image release cycle. This
+release cycle that may be more frequent than the GitLab macOS image release cycle. This
difference in release cycles may cause steps that call `brew` to take extra time to complete
while Homebrew makes updates.
-To reduce build time due to unintended Homebrew updates, set the `HOMEBREW_NO_AUTO_UPDATE` variable in `.gitlab-ci.yml` :
+To reduce build time due to unintended Homebrew updates, set the `HOMEBREW_NO_AUTO_UPDATE` variable in `.gitlab-ci.yml`:
```yaml
variables:
HOMEBREW_NO_AUTO_UPDATE: 1
```
+
+## Known issues and usage constraints
+
+- If the VM image does not include the specific software version you need for your job, the required software must be fetched and installed. This causes an increase in job execution time.
+- It is not possible to bring your own OS image.
+- The keychain for user `gitlab` is not publicly available. You must create a keychain instead.
diff --git a/doc/ci/runners/saas/windows_saas_runner.md b/doc/ci/runners/saas/windows_saas_runner.md
index fa981bddff3..8ec44b8c275 100644
--- a/doc/ci/runners/saas/windows_saas_runner.md
+++ b/doc/ci/runners/saas/windows_saas_runner.md
@@ -12,7 +12,7 @@ the Google Cloud Platform. This solution uses an
developed by GitLab for the [custom executor](https://docs.gitlab.com/runner/executors/custom.html).
These SaaS runners are in [Beta](../../../policy/experiment-beta-support.md#beta)
-and aren't recomended for production workloads.
+and aren't recommended for production workloads.
We want to keep iterating to get Windows runners in a stable state and
[generally available](../../../policy/experiment-beta-support.md#generally-available-ga).
@@ -57,16 +57,15 @@ Below is a sample `.gitlab-ci.yml` file that shows how to start using the runner
tags:
- shared-windows
- windows-1809
+ before_script:
+ - Set-Variable -Name "time" -Value (date -Format "%H:%m")
+ - echo ${time}
+ - echo "started by ${GITLAB_USER_NAME}"
stages:
- build
- test
-before_script:
- - Set-Variable -Name "time" -Value (date -Format "%H:%m")
- - echo ${time}
- - echo "started by ${GITLAB_USER_NAME}"
-
build:
extends:
- .shared_windows_runners
diff --git a/doc/ci/secrets/convert-to-id-tokens.md b/doc/ci/secrets/convert-to-id-tokens.md
new file mode 100644
index 00000000000..e9f0d0ef5b0
--- /dev/null
+++ b/doc/ci/secrets/convert-to-id-tokens.md
@@ -0,0 +1,203 @@
+---
+stage: Verify
+group: Pipeline Security
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+type: tutorial
+---
+
+# Tutorial: Update HashiCorp Vault configuration to use ID Tokens **(PREMIUM)**
+
+This tutorial demonstrates how to convert your existing CI/CI secrets configuration to use [ID Tokens](../secrets/id_token_authentication.md).
+
+The `CI_JOB_JWT` variables are deprecated, but updating to ID tokens requires some important configuration changes to work with Vault. If you have more than a handful of jobs, converting everything at once is a daunting task.
+
+From GitLab 15.9 to 15.11, [enable the automatic ID token authentication](../secrets/id_token_authentication.md#enable-automatic-id-token-authentication-deprecated)
+setting to enable ID Tokens and disable `CI_JOB_JWT` tokens.
+
+In GitLab 16.0 and later you can use ID tokens without any settings changes.
+Jobs that use `secrets:vault` automatically do not have `CI_JOB_JWT` tokens available,
+Jobs that don't use `secrets:vault` can still use `CI_JOB_JWT` tokens.
+
+This tutorial will focus on v16 onwards, if you are running a slightly older version you will need to toggle the `Limit JSON Web Token (JWT) access` setting as appropriate.
+
+To update your vault configuration to use ID tokens:
+
+1. [Create a second JWT authentication path in Vault](#create-a-second-jwt-authentication-path-in-vault)
+1. [Recreate roles to use the new authentication path](#recreate-roles-to-use-the-new-authentication-path)
+1. [Update your CI/CD Jobs](#update-your-cicd-jobs)
+
+## Prerequisites
+
+This tutorial assumes you are familiar with GitLab CI/CD and Vault.
+
+To follow along, you must have:
+
+- An instance running GitLab 15.9 or later, or be on GitLab.com.
+- A Vault server that you are already using.
+- CI/CD jobs retrieving secrets from Vault with `CI_JOB_JWT`.
+
+In the examples below, replace `vault.example.com` with the URL of your Vault server,
+and `gitlab.example.com` with the URL of your GitLab instance.
+
+## Create a second JWT authentication path in Vault
+
+As part of the transition from `CI_JOB_JWT` to ID tokens, you must update the `bound_issuer` in Vault to include `https://`:
+
+```shell
+$ vault write auth/jwt/config \
+ jwks_url="https://gitlab.example.com/-/jwks" \
+ bound_issuer="https://gitlab.example.com"
+```
+
+After you make this change, jobs that use `CI_JOB_JWT` start to fail.
+
+You can create multiple authentication paths in Vault, which enable you to transition to IT Tokens on a project by job basis without disruption.
+
+1. Configure a new authentication path with the name `jwt_v2`, run:
+
+ ```shell
+ vault auth enable -path jwt_v2 jwt
+ ```
+
+ You can choose a different name, but the rest of these examples assume you used `jwt_v2`, so update the examples as needed.
+
+1. Configure the new authentication path for your instance:
+
+ ```shell
+ $ vault write auth/jwt_v2/config \
+ jwks_url="https://gitlab.example.com/-/jwks" \
+ bound_issuer="https://gitlab.example.com"
+ ```
+
+## Recreate roles to use the new authentication path
+
+Roles are bound to a specific authentication path so you need to add new roles for each job.
+
+1. Recreate the role for staging named `myproject-staging`:
+
+ ```shell
+ $ vault write auth/jwt_v2/role/myproject-staging - <<EOF
+ {
+ "role_type": "jwt",
+ "policies": ["myproject-staging"],
+ "token_explicit_max_ttl": 60,
+ "user_claim": "user_email",
+ "bound_claims": {
+ "project_id": "22",
+ "ref": "master",
+ "ref_type": "branch"
+ }
+ }
+ EOF
+ ```
+
+1. Recreate the role for production named `myproject-production`:
+
+ ```shell
+ $ vault write auth/jwt_v2/role/myproject-production - <<EOF
+ {
+ "role_type": "jwt",
+ "policies": ["myproject-production"],
+ "token_explicit_max_ttl": 60,
+ "user_claim": "user_email",
+ "bound_claims_type": "glob",
+ "bound_claims": {
+ "project_id": "22",
+ "ref_protected": "true",
+ "ref_type": "branch",
+ "ref": "auto-deploy-*"
+ }
+ }
+ EOF
+ ```
+
+You only need to update `jwt` to `jwt_v2` in the `vault` command, do not change the `role_type` inside the role.
+
+## Update your CI/CD Jobs
+
+Vault has two different [KV Secrets Engines](https://developer.hashicorp.com/vault/docs/secrets/kv) and the version you are using impacts how you define secrets in CI/CD.
+
+Check the [Which Version is my Vault KV Mount?](https://support.hashicorp.com/hc/en-us/articles/4404288741139-Which-Version-is-my-Vault-KV-Mount-) article on HashiCorp's support portal to check your Vault server.
+
+Also, if needed you can review the CI/CD documentation for:
+
+- [`secrets:`](../yaml/index.md#secrets)
+- [`id_tokens:`](../yaml/index.md#id_tokens)
+
+The following examples show how to obtain the staging database password written to the `password` field in `secret/myproject/staging/db`
+
+### KV Secrets Engine v1
+
+The [`secrets:vault`](../yaml/index.md#secretsvault) keyword defaults to v2 of the KV Mount, so you need to explicitly configure the job to use the v1 engine:
+
+```yaml
+job:
+ variables:
+ VAULT_SERVER_URL: https://vault.example.com
+ VAULT_AUTH_PATH: jwt_v2
+ VAULT_AUTH_ROLE: myproject-staging
+ id_tokens:
+ VAULT_ID_TOKEN:
+ aud: https://gitlab.example.com
+ secrets:
+ PASSWORD:
+ vault:
+ engine:
+ name: kv-v1
+ path: secret
+ field: password
+ path: myproject/staging/db
+ file: false
+```
+
+Both `VAULT_SERVER_URL` and `VAULT_AUTH_PATH` can be [defined as project or group CI/CD variables](../../ci/variables/index.md#define-a-cicd-variable-in-the-ui),
+if preferred.
+
+We use [`secrets:file:false`](../../ci/yaml/index.md#secretsfile) because ID tokens place secrets in a file by default, but we need it to work as a regular variable to match the old behavior.
+
+### KV Secrets Engine v2
+
+There are two formats you can use for the v2 engine.
+
+Long format:
+
+```yaml
+job:
+ variables:
+ VAULT_SERVER_URL: https://vault.example.com
+ VAULT_AUTH_PATH: jwt_v2
+ VAULT_AUTH_ROLE: myproject-staging
+ id_tokens:
+ VAULT_ID_TOKEN:
+ aud: https://gitlab.example.com
+ secrets:
+ PASSWORD:
+ vault:
+ engine:
+ name: kv-v2
+ path: secret
+ field: password
+ path: myproject/staging/db
+ file: false
+```
+
+This is the same as the example for the v1 engine but `secrets:vault:engine:name:` is set to `kv-v2` to match the engine.
+
+You can also use a short format:
+
+```yaml
+job:
+ variables:
+ VAULT_SERVER_URL: https://vault.example.com
+ VAULT_AUTH_PATH: jwt_v2
+ VAULT_AUTH_ROLE: myproject-staging
+ id_tokens:
+ VAULT_ID_TOKEN:
+ aud: https://gitlab.example.com
+ secrets:
+ PASSWORD:
+ vault: myproject/staging/db/password@secret
+ file: false
+```
+
+After you commit the updated CI/CD configuration, your jobs will be fetching secrets with ID Tokens, congratulations!
diff --git a/doc/ci/secrets/id_token_authentication.md b/doc/ci/secrets/id_token_authentication.md
index 16b94fed4d3..509bb6f07cf 100644
--- a/doc/ci/secrets/id_token_authentication.md
+++ b/doc/ci/secrets/id_token_authentication.md
@@ -74,7 +74,8 @@ The token also includes custom claims provided by GitLab:
| `runner_id` | Always | ID of the runner executing the job. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/404722) in GitLab 16.0. |
| `runner_environment` | Always | The type of runner used by the job. Can be either `gitlab-hosted` or `self-hosted`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/404722) in GitLab 16.0. |
| `sha` | Always | The commit SHA for the job. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/404722) in GitLab 16.0. |
-| `ci_config_ref_uri` | Always | The ref path to the top-level pipeline definition, for example, `gitlab.example.com/my-group/my-project//.gitlab-ci.yml@refs/heads/main`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/404722) in GitLab 16.1 behind the `ci_jwt_v2_ref_uri_claim` feature flag. This claim is `null` unless the pipeline definition is located in the same project. |
+| `ci_config_ref_uri` | Always | The ref path to the top-level pipeline definition, for example, `gitlab.example.com/my-group/my-project//.gitlab-ci.yml@refs/heads/main`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/404722) in GitLab 16.2. This claim is `null` unless the pipeline definition is located in the same project. |
+| `ci_config_sha` | Always | Git commit SHA for the `ci_config_ref_uri`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/404722) in GitLab 16.2. This claim is `null` unless the pipeline definition is located in the same project. |
```json
{
@@ -103,6 +104,7 @@ The token also includes custom claims provided by GitLab:
"runner_environment": "self-hosted",
"sha": "714a629c0b401fdce83e847fc9589983fc6f46bc",
"ci_config_ref_uri": "gitlab.example.com/my-group/my-project//.gitlab-ci.yml@refs/heads/main",
+ "ci_config_sha": "714a629c0b401fdce83e847fc9589983fc6f46bc",
"jti": "235b3a54-b797-45c7-ae9a-f72d7bc6ef5b",
"iss": "https://gitlab.example.com",
"iat": 1681395193,
@@ -139,6 +141,9 @@ manual_authentication:
You can use ID tokens to automatically fetch secrets from HashiCorp Vault with the
[`secrets`](../yaml/index.md#secrets) keyword.
+If you previously used `CI_JOB_JWT` to fetch secrets from Vault, learn how to switch
+to ID tokens with the [Update HashiCorp Vault configuration to use ID Tokens](convert-to-id-tokens.md) tutorial.
+
### Configure automatic ID Token authentication
If one ID token is defined, the `secrets` keyword automatically uses it to authenticate with Vault. For example:
diff --git a/doc/ci/services/index.md b/doc/ci/services/index.md
index 2e7e89fc601..f4c90934e06 100644
--- a/doc/ci/services/index.md
+++ b/doc/ci/services/index.md
@@ -145,13 +145,11 @@ default:
image:
name: ruby:2.6
entrypoint: ["/bin/bash"]
-
services:
- name: my-postgres:11.7
alias: db-postgres
entrypoint: ["/usr/local/bin/db-postgres"]
command: ["start"]
-
before_script:
- bundle install
@@ -240,18 +238,17 @@ variables:
PGDATA: "/var/lib/postgresql/data"
POSTGRES_INITDB_ARGS: "--encoding=UTF8 --data-checksums"
-services:
- - name: postgres:11.7
- alias: db
- entrypoint: ["docker-entrypoint.sh"]
- command: ["postgres"]
-
-image:
- name: ruby:2.6
- entrypoint: ["/bin/bash"]
-
-before_script:
- - bundle install
+default:
+ services:
+ - name: postgres:11.7
+ alias: db
+ entrypoint: ["docker-entrypoint.sh"]
+ command: ["postgres"]
+ image:
+ name: ruby:2.6
+ entrypoint: ["/bin/bash"]
+ before_script:
+ - bundle install
test:
script:
@@ -321,28 +318,26 @@ Before the new extended Docker configuration options, you would need to:
- Create your own image based on the `super/sql:latest` image.
- Add the default command.
-- Use the image in the job's configuration:
+- Use the image in the job's configuration.
- ```dockerfile
- # my-super-sql:latest image's Dockerfile
+ - `my-super-sql:latest` image's Dockerfile:
- FROM super/sql:latest
- CMD ["/usr/bin/super-sql", "run"]
- ```
+ ```dockerfile
+ FROM super/sql:latest
+ CMD ["/usr/bin/super-sql", "run"]
+ ```
- ```yaml
- # .gitlab-ci.yml
+ - In the job in the `.gitlab-ci.yml`:
- services:
- - my-super-sql:latest
- ```
+ ```yaml
+ services:
+ - my-super-sql:latest
+ ```
After the new extended Docker configuration options, you can
set a `command` in the `.gitlab-ci.yml` file instead:
```yaml
-# .gitlab-ci.yml
-
services:
- name: super/sql:latest
command: ["/usr/bin/super-sql", "run"]
@@ -414,7 +409,7 @@ To enable service logging, add the `CI_DEBUG_SERVICES` variable to the project's
```yaml
variables:
- CI_DEBUG_SERVICES: "true"
+ CI_DEBUG_SERVICES: "true"
```
Accepted values are:
diff --git a/doc/ci/services/postgres.md b/doc/ci/services/postgres.md
index afb14bd976f..ab38d2ce934 100644
--- a/doc/ci/services/postgres.md
+++ b/doc/ci/services/postgres.md
@@ -23,8 +23,9 @@ For more information, see [GitLab CI/CD variables](../variables/index.md).
First, in your `.gitlab-ci.yml` add:
```yaml
-services:
- - postgres:12.2-alpine
+default:
+ services:
+ - postgres:12.2-alpine
variables:
POSTGRES_DB: $POSTGRES_DB
diff --git a/doc/ci/ssh_keys/index.md b/doc/ci/ssh_keys/index.md
index ab767697cbc..15b731f88c8 100644
--- a/doc/ci/ssh_keys/index.md
+++ b/doc/ci/ssh_keys/index.md
@@ -93,7 +93,7 @@ to access it. In this case, you can use an SSH key pair.
# - git config --global user.name "User name"
```
- The [`before_script`](../yaml/index.md#before_script) can be set globally
+ The [`before_script`](../yaml/index.md#before_script) can be set as a default
or per-job.
1. Make sure the private server's [SSH host keys are verified](#verifying-the-ssh-host-keys).
@@ -156,7 +156,7 @@ trusted network (ideally, from the private server itself):
ssh-keyscan example.com
## Or use an IP
-ssh-keyscan 1.2.3.4
+ssh-keyscan 10.0.2.2
```
Create a new [file type CI/CD variable](../variables/index.md#use-file-type-cicd-variables)
diff --git a/doc/ci/test_cases/index.md b/doc/ci/test_cases/index.md
index edc962c9921..9667daf7501 100644
--- a/doc/ci/test_cases/index.md
+++ b/doc/ci/test_cases/index.md
@@ -8,9 +8,6 @@ type: reference
# Test cases **(ULTIMATE)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/233479) in GitLab 13.6.
-> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/241983) in GitLab 13.7.
-
Test cases in GitLab can help your teams create testing scenarios in their existing development platform.
Now your Implementation and Testing teams can collaborate better, as they no longer have to
@@ -30,7 +27,8 @@ Prerequisite:
To create a test case in a GitLab project:
-1. Go to **CI/CD > Test cases**.
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
+1. Select **Build > Test cases**.
1. Select **New test case**. You are taken to the new test case form. Here you can enter
the new case's title, [description](../../user/markdown.md), attach a file, and assign [labels](../../user/project/labels.md).
1. Select **Submit test case**. You are taken to view the new test case.
@@ -40,16 +38,15 @@ To create a test case in a GitLab project:
You can view all test cases in the project in the test cases list. Filter the
issue list with a search query, including labels or the test case's title.
-Prerequisite:
-
-Whether you can view an test case depends on the [project visibility level](../../user/public_access.md):
+Prerequisites:
-- Public project: You don't have to be a member of the project.
-- Private project: You must have at least the Guest role for the project.
+- In a public project: You don't have to be a member of the project.
+- In a private project: You must have at least the Guest role for the project.
To view a test case:
-1. In a project, go to **CI/CD > Test cases**.
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
+1. Select **Build > Test cases**.
1. Select the title of the test case you want to view. You are taken to the test case page.
![An example test case page](img/test_case_show_v13_10.png)
@@ -58,11 +55,11 @@ To view a test case:
You can edit a test case's title and description.
-Prerequisite:
+Prerequisites:
- You must have at least the Reporter role.
- Users demoted to the Guest role can continue to edit the test cases they created
-when they were in the higher role.
+ when they were in the higher role.
To edit a test case:
@@ -83,13 +80,19 @@ To archive a test case, on the test case's page, select **Archive test case**.
To view archived test cases:
-1. Go to **CI/CD > Test cases**.
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
+1. Select **Build > Test cases**.
1. Select **Archived**.
## Reopen an archived test case
If you decide to start using an archived test case again, you can reopen it.
-You must have at least the Reporter role.
+Prerequisites:
-To reopen an archived test case, on the test case's page, select **Reopen test case**.
+- You must have at least the Reporter role.
+
+To reopen an archived test case:
+
+1. [View a test case](#view-a-test-case).
+1. Select **Reopen test case**.
diff --git a/doc/ci/testing/accessibility_testing.md b/doc/ci/testing/accessibility_testing.md
index b03e4a23153..f6d0468c876 100644
--- a/doc/ci/testing/accessibility_testing.md
+++ b/doc/ci/testing/accessibility_testing.md
@@ -4,14 +4,7 @@ group: Pipeline Execution
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
-<!--- start_remove The following content will be removed on remove_date: '2024-05-22' -->
-# Accessibility testing (deprecated) **(FREE)**
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/25144) in GitLab 12.8.
-
-WARNING:
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/390424) in GitLab 15.9
-and is planned for removal in 17.0. This change is a breaking change.
+# Accessibility testing **(FREE)**
If your application offers a web interface, you can use
[GitLab CI/CD](../index.md) to determine the accessibility
@@ -19,7 +12,7 @@ impact of pending code changes.
[Pa11y](https://pa11y.org/) is a free and open source tool for
measuring the accessibility of web sites. GitLab integrates Pa11y into a
-[CI job template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Verify/Accessibility.gitlab-ci.yml).
+[CI/CD job template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Verify/Accessibility.gitlab-ci.yml).
The `a11y` job analyzes a defined set of web pages and reports
accessibility violations, warnings, and notices in a file named
`accessibility`.
@@ -29,9 +22,6 @@ As of [GitLab 14.5](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/73309)
## Accessibility merge request widget
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/39425) in GitLab 13.0 behind the disabled [feature flag](../../administration/feature_flags.md) `:accessibility_report_view`.
-> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/217372) in GitLab 13.1.
-
GitLab displays an **Accessibility Report** in the merge request widget area:
![Accessibility merge request widget](img/accessibility_mr_widget_v13_0.png)
@@ -41,7 +31,7 @@ GitLab displays an **Accessibility Report** in the merge request widget area:
You can run Pa11y with GitLab CI/CD using the
[GitLab Accessibility Docker image](https://gitlab.com/gitlab-org/ci-cd/accessibility).
-To define the `a11y` job for GitLab 12.9 and later:
+To define the `a11y` job:
1. [Include](../yaml/index.md#includetemplate) the
[`Accessibility.gitlab-ci.yml` template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Verify/Accessibility.gitlab-ci.yml)
@@ -71,13 +61,7 @@ The `a11y` job in your CI/CD pipeline generates these files:
You can [view job artifacts in your browser](../jobs/job_artifacts.md#download-job-artifacts).
NOTE:
-For GitLab versions earlier than 12.9, use `include:remote` and
-link to the [current template in the default branch](https://gitlab.com/gitlab-org/gitlab/-/raw/master/lib/gitlab/ci/templates/Verify/Accessibility.gitlab-ci.yml)
-
-NOTE:
The job definition provided by the template does not support Kubernetes.
You cannot pass configurations into Pa11y via CI configuration.
To change the configuration, edit a copy of the template in your CI file.
-
-<!--- end_remove --> \ No newline at end of file
diff --git a/doc/ci/testing/browser_performance_testing.md b/doc/ci/testing/browser_performance_testing.md
index 600b1a2cf4b..059cd637f9e 100644
--- a/doc/ci/testing/browser_performance_testing.md
+++ b/doc/ci/testing/browser_performance_testing.md
@@ -4,15 +4,8 @@ group: Pipeline Execution
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
-<!--- start_remove The following content will be removed on remove_date: '2024-05-22' -->
# Browser Performance Testing **(PREMIUM)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3507) in GitLab 10.3.
-
-WARNING:
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/388719) in GitLab 15.9
-and is planned for removal in 17.0. This change is a breaking change.
-
If your application offers a web interface and you're using
[GitLab CI/CD](../index.md), you can quickly determine the rendering performance
impact of pending code changes in the browser.
@@ -79,18 +72,13 @@ using Docker-in-Docker.
URL: https://example.com
```
-WARNING:
-In GitLab 13.12 and earlier, the job [was named](https://gitlab.com/gitlab-org/gitlab/-/issues/225914) `performance`.
-
The above example:
- Creates a `browser_performance` job in your CI/CD pipeline and runs sitespeed.io against the webpage you
defined in `URL` to gather key metrics.
- Uses a template that doesn't work with Kubernetes clusters. If you are using a Kubernetes cluster,
use [`template: Jobs/Browser-Performance-Testing.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/Browser-Performance-Testing.gitlab-ci.yml)
- instead.
-- Uses a CI/CD template that is included in all GitLab installations since 12.4. If you are using
- GitLab 12.3 or earlier, you must [add the configuration manually](#gitlab-versions-132-and-earlier).
+ instead.
The template uses the [GitLab plugin for sitespeed.io](https://gitlab.com/gitlab-org/gl-performance),
and it saves the full HTML sitespeed.io report as a [Browser Performance report artifact](../yaml/artifacts_reports.md#artifactsreportsbrowser_performance)
@@ -120,8 +108,6 @@ browser_performance:
### Configuring degradation threshold
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/27599) in GitLab 13.0.
-
You can configure the sensitivity of degradation alerts to avoid getting alerts for minor drops in metrics.
This is done by setting the `DEGRADATION_THRESHOLD` CI/CD variable. In the example below, the alert only shows up
if the `Total Score` metric degrades by 5 points or more:
@@ -147,9 +133,9 @@ be extended for dynamic environments, but a few extra steps are required:
1. In the `review` job:
1. Generate a URL list file with the dynamic URL.
1. Save the file as an artifact, for example with `echo $CI_ENVIRONMENT_URL > environment_url.txt`
- in your job's `script`.
+ in your job's `script`.
1. Pass the list as the URL environment variable (which can be a URL or a file containing URLs)
- to the `browser_performance` job.
+ to the `browser_performance` job.
1. You can now run the sitespeed.io container against the desired hostname and
paths.
@@ -174,10 +160,10 @@ review:
artifacts:
paths:
- environment_url.txt
- only:
- - branches
- except:
- - master
+ rules:
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+ when: never
+ - if: $CI_COMMIT_BRANCH
browser_performance:
dependencies:
@@ -185,63 +171,3 @@ browser_performance:
variables:
URL: environment_url.txt
```
-
-### GitLab versions 13.2 and earlier
-
-Browser Performance Testing has gone through several changes since its introduction.
-In this section we detail these changes and how you can run the test based on your
-GitLab version:
-
-- In 13.2 the feature was renamed from `Performance` to `Browser Performance` with additional
- template CI/CD variables.
-- In GitLab 12.4 [a job template was made available](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Verify/Browser-Performance.gitlab-ci.yml).
-- For 11.5 to 12.3 no template is available and the job has to be defined manually as follows:
-
- ```yaml
- performance:
- stage: performance
- image: docker:git
- variables:
- URL: https://example.com
- SITESPEED_VERSION: 14.1.0
- SITESPEED_OPTIONS: ''
- services:
- - docker:stable-dind
- script:
- - mkdir gitlab-exporter
- - wget -O ./gitlab-exporter/index.js https://gitlab.com/gitlab-org/gl-performance/raw/1.1.0/index.js
- - mkdir sitespeed-results
- - docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:$SITESPEED_VERSION --plugins.add ./gitlab-exporter --outputFolder sitespeed-results $URL $SITESPEED_OPTIONS
- - mv sitespeed-results/data/performance.json performance.json
- artifacts:
- paths:
- - performance.json
- - sitespeed-results/
- reports:
- performance: performance.json
- ```
-
-- For 11.4 and earlier the job should be defined as follows:
-
- ```yaml
- performance:
- stage: performance
- image: docker:git
- variables:
- URL: https://example.com
- services:
- - docker:stable-dind
- script:
- - mkdir gitlab-exporter
- - wget -O ./gitlab-exporter/index.js https://gitlab.com/gitlab-org/gl-performance/raw/1.1.0/index.js
- - mkdir sitespeed-results
- - docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:6.3.1 --plugins.add ./gitlab-exporter --outputFolder sitespeed-results $URL
- - mv sitespeed-results/data/performance.json performance.json
- artifacts:
- paths:
- - performance.json
- - sitespeed-results/
- ```
-
-Upgrading to the latest version and using the templates is recommended, to ensure
-you receive the latest updates, including updates to the sitespeed.io versions.
diff --git a/doc/ci/testing/code_quality.md b/doc/ci/testing/code_quality.md
index 5f6af4cb8a9..fcb5a23742a 100644
--- a/doc/ci/testing/code_quality.md
+++ b/doc/ci/testing/code_quality.md
@@ -51,7 +51,8 @@ Code Quality results are shown in the:
> [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212499) to GitLab Free in 13.2.
Code Quality analysis results display in the merge request widget area if a report from the target
-branch is available for comparison.
+branch is available for comparison. The merge request widget displays Code Quality findings and resolutions that
+were introduced by the changes made in the merge request.
![Code Quality Widget](img/code_quality_widget_13_11.png)
@@ -70,13 +71,14 @@ issues are marked by an indicator beside the gutter. Hover over the marker for d
### Pipeline details view **(PREMIUM)**
The full list of Code Quality violations generated by a pipeline is shown in the **Code Quality**
-tab of the pipeline's details page.
+tab of the pipeline's details page. The pipeline details view displays all Code Quality findings
+that were found on the branch it was run on.
![Code Quality Report](img/code_quality_report_13_11.png)
### Project quality view **(ULTIMATE)**
-The project quality view displays an overview of the code quality findings. The view can be found under **Analytics > CI/CD**, and requires [`project_quality_summary_page`](../../user/feature_flags.md) feature flag to be enabled for this particular project.
+The project quality view displays an overview of the code quality findings. The view can be found under **Analyze > CI/CD analytics**, and requires [`project_quality_summary_page`](../../user/feature_flags.md) feature flag to be enabled for this particular project.
![Code Quality Summary](img/code_quality_summary_15_9.png)
@@ -541,8 +543,8 @@ for more details.
### The code cannot be found and the pipeline runs always with default configuration
You are probably using a private runner with the Docker-in-Docker socket-binding configuration.
-You should configure Code Quality checks to run on your worker as documented in section
-"[Improve Code Quality performance with private runners](#improve-code-quality-performance-with-private-runners)".
+You should configure Code Quality checks to run on your worker as documented in
+[Improve Code Quality performance with private runners](#improve-code-quality-performance-with-private-runners)".
### Changing the default configuration has no effect
diff --git a/doc/ci/testing/load_performance_testing.md b/doc/ci/testing/load_performance_testing.md
index 2897d7fe0ab..dac4dd555b0 100644
--- a/doc/ci/testing/load_performance_testing.md
+++ b/doc/ci/testing/load_performance_testing.md
@@ -4,15 +4,10 @@ group: Pipeline Execution
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
-<!--- start_remove The following content will be removed on remove_date: '2024-05-22' -->
-# Load Performance Testing (deprecated) **(PREMIUM)**
+# Load Performance Testing **(PREMIUM)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/10683) in GitLab 13.2.
-WARNING:
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/388723) in GitLab 15.9
-and is planned for removal in 17.0. This change is a breaking change.
-
With Load Performance Testing, you can test the impact of any pending code changes
to your application's backend in [GitLab CI/CD](../index.md).
@@ -204,5 +199,3 @@ load_performance:
rules:
- if: $CI_COMMIT_BRANCH # Modify to match your pipeline rules, or use `only/except` if needed.
```
-
-<!--- end_remove -->
diff --git a/doc/ci/testing/unit_test_report_examples.md b/doc/ci/testing/unit_test_report_examples.md
index 1b1600b3d99..8527d0b712d 100644
--- a/doc/ci/testing/unit_test_report_examples.md
+++ b/doc/ci/testing/unit_test_report_examples.md
@@ -295,3 +295,23 @@ run unittests:
junit:
- report.xml
```
+
+## Helm
+
+This example uses [Helm Unittest](https://github.com/helm-unittest/helm-unittest#docker-usage) plugin, with the `-t junit` flag to format the output to a JUnit report in XML format.
+
+```yaml
+helm:
+ image: helmunittest/helm-unittest:latest
+ stage: test
+ script:
+ - '-t JUnit -o report.xml -f tests/*[._]test.yaml .'
+ artifacts:
+ reports:
+ junit: report.xml
+```
+
+The `-f tests/*[._]test.yaml` flag configures `helm-unittest` to look for files in the `tests/` directory that end in either:
+
+- `.test.yaml`
+- `_test.yaml`
diff --git a/doc/ci/triggers/index.md b/doc/ci/triggers/index.md
index 412394a24e7..a47eaaf0381 100644
--- a/doc/ci/triggers/index.md
+++ b/doc/ci/triggers/index.md
@@ -183,7 +183,7 @@ A part of the trigger's token displays on the right of the page, under the job d
![Marked as triggered on a single job page](img/trigger_single_job.png)
In pipelines triggered with a trigger token, jobs are labeled as `triggered` in
-**CI/CD > Jobs**.
+**Build > Jobs**.
## Troubleshooting
diff --git a/doc/ci/troubleshooting.md b/doc/ci/troubleshooting.md
index e94ccfa6b2b..623589e2cbc 100644
--- a/doc/ci/troubleshooting.md
+++ b/doc/ci/troubleshooting.md
@@ -164,7 +164,7 @@ blocked the pipeline, or allowed the wrong pipeline type.
### Pipeline with many jobs fails to start
-A Pipeline that has more jobs than the instance's defined [CI/CD limits](../user/admin_area/settings/continuous_integration.md#set-cicd-limits)
+A Pipeline that has more jobs than the instance's defined [CI/CD limits](../administration/settings/continuous_integration.md#set-cicd-limits)
fails to start.
To reduce the number of jobs in your pipeline, you can split your `.gitlab-ci.yml`
diff --git a/doc/ci/variables/index.md b/doc/ci/variables/index.md
index 7b6ba36e35d..bd066797ada 100644
--- a/doc/ci/variables/index.md
+++ b/doc/ci/variables/index.md
@@ -246,7 +246,7 @@ malicious code can compromise both masked and protected variables.
Variable values are encrypted using [`aes-256-cbc`](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard)
and stored in the database. This data can only be read and decrypted with a
-valid [secrets file](../../raketasks/backup_restore.md#when-the-secrets-file-is-lost).
+valid [secrets file](../../administration/backup_restore/backup_gitlab.md#when-the-secrets-file-is-lost).
### Mask a CI/CD variable
@@ -882,3 +882,22 @@ WARNING:
If you add `CI_DEBUG_TRACE` as a local variable to runners, debug logs generate and are visible
to all users with access to job logs. The permission levels are not checked by the runner,
so you should only use the variable in GitLab itself.
+
+## Known issues and workarounds
+
+These are some know issues with CI/CD variables, and where applicable, known workarounds.
+
+### "argument list too long"
+
+This issue occurs when the combined length of all CI/CD variables defined for a job exceeds the limit imposed by the
+shell where the job executes. This includes the names and values of pre-defined and user defined variables. This limit
+is typically referred to as `ARG_MAX`, and is shell and operating system dependent. This issue also occurs when the
+content of a single [File-type](#use-file-type-cicd-variables) variable exceeds `ARG_MAX`.
+
+For more information, see [issue 392406](https://gitlab.com/gitlab-org/gitlab/-/issues/392406#note_1414219596).
+
+As a workaround you can either:
+
+- Use [File-type](#use-file-type-cicd-variables) CI/CD variables for large environment variables where possible.
+- If a single large variable is larger than `ARG_MAX`, try using [Secure Files](../secure_files/index.md), or
+bring the file to the job through some other mechanism.
diff --git a/doc/ci/variables/predefined_variables.md b/doc/ci/variables/predefined_variables.md
index 1656b2147d5..73aaafe46c0 100644
--- a/doc/ci/variables/predefined_variables.md
+++ b/doc/ci/variables/predefined_variables.md
@@ -105,7 +105,7 @@ as it can cause the pipeline to behave unexpectedly.
| `CI_PROJECT_DESCRIPTION` | 15.1 | all | The project description as displayed in the GitLab web interface. |
| `CI_PROJECT_URL` | 8.10 | 0.5 | The HTTP(S) address of the project. |
| `CI_PROJECT_VISIBILITY` | 10.3 | all | The project visibility. Can be `internal`, `private`, or `public`. |
-| `CI_PROJECT_CLASSIFICATION_LABEL` | 14.2 | all | The project [external authorization classification label](../../user/admin_area/settings/external_authorization.md). |
+| `CI_PROJECT_CLASSIFICATION_LABEL` | 14.2 | all | The project [external authorization classification label](../../administration/settings/external_authorization.md). |
| `CI_REGISTRY_IMAGE` | 8.10 | 0.5 | The address of the project's Container Registry. Only available if the Container Registry is enabled for the project. |
| `CI_REGISTRY_PASSWORD` | 9.0 | all | The password to push containers to the project's GitLab Container Registry. Only available if the Container Registry is enabled for the project. This password value is the same as the `CI_JOB_TOKEN` and is valid only as long as the job is running. Use the `CI_DEPLOY_PASSWORD` for long-lived access to the registry |
| `CI_REGISTRY_USER` | 9.0 | all | The username to push containers to the project's GitLab Container Registry. Only available if the Container Registry is enabled for the project. |
diff --git a/doc/ci/yaml/includes.md b/doc/ci/yaml/includes.md
index 69595b62de2..3b6419dbff2 100644
--- a/doc/ci/yaml/includes.md
+++ b/doc/ci/yaml/includes.md
@@ -129,7 +129,8 @@ Content of `.gitlab-ci.yml`:
```yaml
include: 'https://company.com/autodevops-template.yml'
-image: alpine:latest
+default:
+ image: alpine:latest
variables:
POSTGRES_USER: root
@@ -418,7 +419,8 @@ these keywords:
### `include` with `rules:if`
-> Support for `when: never` and `when:always` [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/348146) in GitLab 16.1 [with a flag](../../administration/feature_flags.md) named `ci_support_include_rules_when_never`. Disabled by default.
+> - Support for `when: never` and `when:always` [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/348146) in GitLab 16.1 [with a flag](../../administration/feature_flags.md) named `ci_support_include_rules_when_never`. Disabled by default.
+> - Support for `when: never` and `when:always` [generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/414517) in GitLab 16.2. Feature flag `ci_support_include_rules_when_never` removed.
Use [`rules:if`](index.md#rulesif) to conditionally include other configuration files
based on the status of CI/CD variables. For example:
@@ -447,7 +449,8 @@ test:
### `include` with `rules:exists`
-> Support for `when: never` and `when:always` [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/348146) in GitLab 16.1 [with a flag](../../administration/feature_flags.md) named `ci_support_include_rules_when_never`. Disabled by default.
+> - Support for `when: never` and `when:always` [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/348146) in GitLab 16.1 [with a flag](../../administration/feature_flags.md) named `ci_support_include_rules_when_never`. Disabled by default.
+> - Support for `when: never` and `when:always` [generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/414517) in GitLab 16.2. Feature flag `ci_support_include_rules_when_never` removed.
Use [`rules:exists`](index.md#rulesexists) to conditionally include other configuration files
based on the existence of files. For example:
@@ -627,4 +630,4 @@ limit is reached. You can remove one included file at a time to try to narrow do
which configuration file is the source of the loop or excessive included files.
In [GitLab 16.0 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/207270) self-managed users can
-change the [maximum includes](../../user/admin_area/settings/continuous_integration.md#maximum-includes) value.
+change the [maximum includes](../../administration/settings/continuous_integration.md#maximum-includes) value.
diff --git a/doc/ci/yaml/index.md b/doc/ci/yaml/index.md
index 3dfc98c043a..9a060c35721 100644
--- a/doc/ci/yaml/index.md
+++ b/doc/ci/yaml/index.md
@@ -163,7 +163,7 @@ The time limit to resolve all files is 30 seconds.
pipeline run, the new pipeline uses the changed configuration.
- You can have up to 150 includes per pipeline by default, including [nested](includes.md#use-nested-includes). Additionally:
- In [GitLab 16.0 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/207270) self-managed users can
- change the [maximum includes](../../user/admin_area/settings/continuous_integration.md#maximum-includes) value.
+ change the [maximum includes](../../administration/settings/continuous_integration.md#maximum-includes) value.
- In [GitLab 15.10 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/367150) you can have up to 150 includes.
In nested includes, the same file can be included multiple times, but duplicated includes
count towards the limit.
@@ -353,7 +353,7 @@ The order of the items in `stages` defines the execution order for jobs:
If a pipeline contains only jobs in the `.pre` or `.post` stages, it does not run.
There must be at least one other job in a different stage. `.pre` and `.post` stages
-can be used in [required pipeline configuration](../../user/admin_area/settings/continuous_integration.md#required-pipeline-configuration)
+can be used in [required pipeline configuration](../../administration/settings/continuous_integration.md#required-pipeline-configuration)
to define compliance jobs that must run before or after project pipeline jobs.
**Keyword type**: Global keyword.
@@ -843,7 +843,7 @@ they expire and are deleted. The `expire_in` setting does not affect:
- Artifacts from the latest job, unless keeping the latest job artifacts is disabled
[at the project level](../jobs/job_artifacts.md#keep-artifacts-from-most-recent-successful-jobs).
- or [instance-wide](../../user/admin_area/settings/continuous_integration.md#keep-the-latest-artifacts-for-all-jobs-in-the-latest-successful-pipelines).
+ or [instance-wide](../../administration/settings/continuous_integration.md#keep-the-latest-artifacts-for-all-jobs-in-the-latest-successful-pipelines).
After their expiry, artifacts are deleted hourly by default (using a cron job), and are not
accessible anymore.
@@ -875,7 +875,7 @@ job:
**Additional details**:
- The expiration time period begins when the artifact is uploaded and stored on GitLab.
- If the expiry time is not defined, it defaults to the [instance wide setting](../../user/admin_area/settings/continuous_integration.md#default-artifacts-expiration).
+ If the expiry time is not defined, it defaults to the [instance wide setting](../../administration/settings/continuous_integration.md#default-artifacts-expiration).
- To override the expiration date and protect artifacts from being automatically deleted:
- Select **Keep** on the job page.
- [In GitLab 13.3 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/22761), set the value of
@@ -963,7 +963,7 @@ job:
WARNING:
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 `non_public_artifacts`. On
+an administrator can [enable the feature flag](../../administration/feature_flags.md) named `non_public_artifacts`. On
GitLab.com, this feature is not available. Due to [issue 413822](https://gitlab.com/gitlab-org/gitlab/-/issues/413822),
the keyword can be used when the feature flag is disabled, but the feature does not work.
Do not attempt to use this feature when the feature flag is disabled, and always test
@@ -2039,11 +2039,17 @@ job_with_id_tokens:
aud:
- https://gcp.com
- https://aws.com
+ SIGSTORE_ID_TOKEN:
+ aud: sigstore
script:
- command_to_authenticate_with_gitlab $ID_TOKEN_1
- command_to_authenticate_with_aws $ID_TOKEN_2
```
+**Related topics**:
+
+- [Keyless signing with Sigstore](signing_examples.md).
+
### `image`
Use `image` to specify a Docker image that the job runs in.
@@ -2718,7 +2724,7 @@ when to add jobs to pipelines.
| `schedules` | For [scheduled pipelines](../pipelines/schedules.md). |
| `tags` | When the Git reference for a pipeline is a tag. |
| `triggers` | For pipelines created by using a [trigger token](../triggers/index.md#configure-cicd-jobs-to-run-in-triggered-pipelines). |
- | `web` | For pipelines created by selecting **Run pipeline** in the GitLab UI, from the project's **CI/CD > Pipelines** section. |
+ | `web` | For pipelines created by selecting **Run pipeline** in the GitLab UI, from the project's **Build > Pipelines** section. |
**Example of `only:refs` and `except:refs`**:
@@ -2896,6 +2902,12 @@ in the project.
Use `pages` to define a [GitLab Pages](../../user/project/pages/index.md) job that
uploads static content to GitLab. The content is then published as a website.
+You must:
+
+- Define [`artifacts`](#artifacts) with a path to the content directory, which is
+ `public` by default.
+- Use [`publish`](#pagespublish) if want to use a different content directory.
+
**Keyword type**: Job name.
**Example of `pages`**:
@@ -2904,9 +2916,7 @@ uploads static content to GitLab. The content is then published as a website.
pages:
stage: deploy
script:
- - mkdir .public
- - cp -r * .public
- - mv .public public
+ - mv my-html-content public
artifacts:
paths:
- public
@@ -2915,15 +2925,38 @@ pages:
environment: production
```
-This example moves all files from the root of the project to the `public/` directory.
-The `.public` workaround is so `cp` does not also copy `public/` to itself in an infinite loop.
+This example moves all files from a `my-html-content/` directory to the `public/` directory.
+This directory is exported as an artifact and published with GitLab Pages.
-**Additional details**:
+#### `pages:publish`
-You must:
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/415821) in GitLab 16.1.
+
+Use `publish` to configure the content directory of a [`pages` job](#pages).
+
+**Keyword type**: Job keyword. You can use it only as part of a `pages` job.
+
+**Possible inputs**: A path to a directory containing the Pages content.
+
+**Example of `publish`**:
+
+```yaml
+pages:
+ stage: deploy
+ script:
+ - npx @11ty/eleventy --input=path/to/eleventy/root --output=dist
+ artifacts:
+ paths:
+ - dist
+ publish: dist
+ rules:
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+ environment: production
+```
-- Place any static content in a `public/` directory.
-- Define [`artifacts`](#artifacts) with a path to the `public/` directory.
+This example uses [Eleventy](https://www.11ty.dev) to generate a static website and
+output the generated HTML files into a the `dist/` directory. This directory is exported
+as an artifact and published with GitLab Pages.
### `parallel`
@@ -2955,6 +2988,11 @@ This example creates 5 jobs that run in parallel, named `test 1/5` to `test 5/5`
- Every parallel job has a `CI_NODE_INDEX` and `CI_NODE_TOTAL`
[predefined CI/CD variable](../variables/index.md#predefined-cicd-variables) set.
+- A pipeline with jobs that use `parallel` might:
+ - Create more jobs running in parallel than available runners. Excess jobs are queued
+ and marked `pending` while waiting for an available runner.
+ - Create too many jobs, and the pipeline fails with a `job_activity_limit_exceeded` error.
+ The maximum number of jobs that can exist in active pipelines is [limited at the instance-level](../../administration/instance_limits.md#number-of-jobs-in-active-pipelines).
**Related topics**:
@@ -3076,7 +3114,7 @@ release_job:
This example creates a release:
- When you push a Git tag.
-- When you add a Git tag in the UI at **Repository > Tags**.
+- When you add a Git tag in the UI at **Code > Tags**.
**Additional details**:
@@ -3120,8 +3158,7 @@ CI/CD variables [are supported](../variables/where_variables_can_be_used.md#gitl
To create a release when a new tag is added to the project:
- Use the `$CI_COMMIT_TAG` CI/CD variable as the `tag_name`.
-- Use [`rules:if`](#rulesif) or [`only: tags`](#onlyrefs--exceptrefs) to configure
- the job to run only for new tags.
+- Use [`rules:if`](#rulesif) to configure the job to run only for new tags.
```yaml
job:
@@ -3133,7 +3170,7 @@ job:
- if: $CI_COMMIT_TAG
```
-To create a release and a new tag at the same time, your [`rules`](#rules) or [`only`](#only--except)
+To create a release and a new tag at the same time, your [`rules`](#rules)
should **not** configure the job to run only for new tags. A semantic versioning example:
```yaml
@@ -3702,7 +3739,8 @@ If the rule matches, then the job is a manual job with `allow_failure: true`.
#### `rules:needs`
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31581) in GitLab 16.0 [with a flag](../../user/feature_flags.md) named `introduce_rules_with_needs`. Disabled by default.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31581) in GitLab 16.0 [with a flag](../../user/feature_flags.md) named `introduce_rules_with_needs`. Disabled by default.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/408871) in GitLab 16.2. Feature flag `introduce_rules_with_needs` removed.
Use `needs` in rules to update a job's [`needs`](#needs) for specific conditions. When a condition matches a rule, the job's `needs` configuration is completely replaced with the `needs` in the rule.
@@ -4752,6 +4790,6 @@ important to describe those, too. Think of things that may go wrong and include
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`.
+Each scenario can be a third-level heading, for example, `### Getting error message X`.
If you have none to add when creating a doc, leave this section in place
but commented out to help encourage others to add to it in the future. -->
diff --git a/doc/ci/yaml/signing_examples.md b/doc/ci/yaml/signing_examples.md
new file mode 100644
index 00000000000..5609bd2374e
--- /dev/null
+++ b/doc/ci/yaml/signing_examples.md
@@ -0,0 +1,310 @@
+---
+stage: Verify
+group: Pipeline Security
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Use Sigstore for keyless signing and verification **(FREE SAAS)**
+
+The [Sigstore](https://www.sigstore.dev/) project provides a CLI called
+[Cosign](https://docs.sigstore.dev/cosign/overview/) which can be used for keyless signing of container images built
+with GitLab CI/CD. Keyless signing has many advantages, including eliminating the need to manage, safeguard, and rotate a private
+key. Cosign requests a short-lived key pair to use for signing, records it on a certificate transparency log, and
+then discards it. The key is generated through a token obtained from the GitLab server using the OIDC identity of the user who
+ran the pipeline. This token includes unique claims that certify the token was generated by a CI/CD pipeline. To learn more,
+see Cosign [documentation](https://docs.sigstore.dev/cosign/overview/#example-working-with-containers) on keyless signatures.
+
+For details on the mapping between GitLab OIDC claims and Fulcio certificate extensions, see the GitLab column of
+[Mapping OIDC token claims to Fulcio OIDs](https://github.com/sigstore/fulcio/blob/main/docs/oid-info.md#mapping-oidc-token-claims-to-fulcio-oids).
+
+**Requirements:**
+
+- You must be using GitLab.com.
+- Your project's CI/CD configuration must be located in the project.
+- You must use a version of Cosign that is `>= 2.0.1`.
+
+## Container images
+
+### Sign a container image with Cosign
+
+GitLab [ID tokens](../secrets/id_token_authentication.md) can be used by Cosign for
+[keyless signing](https://docs.sigstore.dev/cosign/overview/#example-working-with-containers). The token must have `sigstore` set as the
+[`aud`](../secrets/id_token_authentication.md#token-payload) claim. The token can be used by Cosign automatically when
+it is set in the `SIGSTORE_ID_TOKEN` environment variable.
+
+**Best practices**:
+
+- Build and sign a container image in the same job to prevent the image from being tampered with before it is
+ signed.
+
+See [Cosign documentation](https://docs.sigstore.dev/cosign/signing_with_containers/) to learn more about signing.
+
+```yaml
+build_and_sign:
+ stage: build
+ image: docker:latest
+ services:
+ - docker:dind
+ variables:
+ COSIGN_YES: "true"
+ id_tokens:
+ SIGSTORE_ID_TOKEN:
+ aud: sigstore
+ before_script:
+ - apk add --update cosign
+ - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
+ script:
+ - docker build --pull -t "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA" .
+ - docker push "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA"
+ - IMAGE_DIGEST=$(docker inspect --format='{{index .RepoDigests 0}}' $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA)
+ - cosign sign $IMAGE_DIGEST
+```
+
+### Verify a container image with Cosign
+
+```yaml
+verify:
+ image: alpine:3.18
+ stage: verify
+ before_script:
+ - apk add --update cosign docker
+ - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
+ script:
+ - cosign verify "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA" --certificate-identity "https://gitlab.com/my-group/my-project//path/to/.gitlab-ci.yml@refs/heads/main" --certificate-oidc-issuer "https://gitlab.com"
+```
+
+## Use Sigstore and npm to generate keyless provenance
+
+You can use Sigstore and npm, together with GitLab CI/CD, to digitally sign build artifacts without the overhead of key management.
+
+### About npm provenance
+
+[npm CLI](https://docs.npmjs.com/cli) allows package maintainers to provide users with provenance attestations. Using npm
+CLI provenance generation allows users to trust and verify that the package they are downloading and using is from you and the
+build system that built it.
+
+For more information on how to publish npm packages, see [GitLab npm Package Registry](../../user/packages/npm_registry/index.md).
+
+### Sigstore
+
+[Sigstore](https://www.sigstore.dev/) is a set of tools that package managers and security experts can use to secure their software
+supply chains against attacks. Bringing together free-to-use open source technologies like Fulcio, Cosign, and Rekor, it
+handles digital signing, verification, and checks for provenance
+needed to make it safer to distribute and use open source software.
+
+**Related topics**:
+
+- [SLSA Provenance definition](https://slsa.dev/provenance/v1)
+- [npm Docs](https://docs.npmjs.com/generating-provenance-statements)
+- [npm Provenance RFC](https://github.com/npm/rfcs/blob/main/accepted/0049-link-packages-to-source-and-build.md#detailed-steps-to-publish)
+
+### Generating provenance in GitLab CI/CD
+
+Now that Sigstore supports GitLab OIDC as described above, you can use npm provenance together with GitLab CI/CD and Sigstore to
+generate and sign provenance for your npm packages in a GitLab CI/CD pipeline.
+
+#### Prerequisites
+
+1. Set your GitLab [ID token](../secrets/id_token_authentication.md) `aud` to `sigstore`.
+1. Add the `--provenance` flag to have npm publish.
+
+Example content to be added to `.gitlab-ci.yml` file:
+
+```yaml
+image: node:latest
+
+build:
+ id_tokens:
+ SIGSTORE_ID_TOKEN:
+ aud: sigstore
+ script:
+ - npm publish --provenance --access public
+```
+
+The npm GitLab template provides this functionality as well, the example is in
+the [templates documentation](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/npm.gitlab-ci.yml).
+
+## Verifying npm provenance
+
+npm CLI also provides functionality for end users to verify the provenance of packages.
+
+```plaintext
+npm audit signatures
+audited 1 package in 0s
+1 package has a verified registry signature
+```
+
+### Inspecting the provenance metadata
+
+The Rekor transparency log stores certificates and attestations for every package that is published with provenance.
+For example, here is the [entry for the below example](https://search.sigstore.dev/?logIndex=21076013).
+
+An example provenance document generated by npm:
+
+```yaml
+_type: https://in-toto.io/Statement/v0.1
+subject:
+ - name: pkg:npm/%40strongjz/strongcoin@0.0.13
+ digest:
+ sha512: >-
+ 924a134a0fd4fe6a7c87b4687bf0ac898b9153218ce9ad75798cc27ab2cddbeff77541f3847049bd5e3dfd74cea0a83754e7686852f34b185c3621d3932bc3c8
+predicateType: https://slsa.dev/provenance/v0.2
+predicate:
+ buildType: https://github.com/npm/CLI/gitlab/v0alpha1
+ builder:
+ id: https://gitlab.com/strongjz/npm-provenance-example/-/runners/12270835
+ invocation:
+ configSource:
+ uri: git+https://gitlab.com/strongjz/npm-provenance-example
+ digest:
+ sha1: 6e02e901e936bfac3d4691984dff8c505410cbc3
+ entryPoint: deploy
+ parameters:
+ CI: 'true'
+ CI_API_GRAPHQL_URL: https://gitlab.com/api/graphql
+ CI_API_V4_URL: https://gitlab.com/api/v4
+ CI_COMMIT_BEFORE_SHA: 7d3e913e5375f68700e0c34aa90b0be7843edf6c
+ CI_COMMIT_BRANCH: main
+ CI_COMMIT_REF_NAME: main
+ CI_COMMIT_REF_PROTECTED: 'true'
+ CI_COMMIT_REF_SLUG: main
+ CI_COMMIT_SHA: 6e02e901e936bfac3d4691984dff8c505410cbc3
+ CI_COMMIT_SHORT_SHA: 6e02e901
+ CI_COMMIT_TIMESTAMP: '2023-05-19T10:17:12-04:00'
+ CI_COMMIT_TITLE: trying to publish to gitlab reg
+ CI_CONFIG_PATH: .gitlab-ci.yml
+ CI_DEFAULT_BRANCH: main
+ CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX: gitlab.com:443/strongjz/dependency_proxy/containers
+ CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX: gitlab.com:443/strongjz/dependency_proxy/containers
+ CI_DEPENDENCY_PROXY_SERVER: gitlab.com:443
+ CI_DEPENDENCY_PROXY_USER: gitlab-ci-token
+ CI_JOB_ID: '4316132595'
+ CI_JOB_NAME: deploy
+ CI_JOB_NAME_SLUG: deploy
+ CI_JOB_STAGE: deploy
+ CI_JOB_STARTED_AT: '2023-05-19T14:17:23Z'
+ CI_JOB_URL: https://gitlab.com/strongjz/npm-provenance-example/-/jobs/4316132595
+ CI_NODE_TOTAL: '1'
+ CI_PAGES_DOMAIN: gitlab.io
+ CI_PAGES_URL: https://strongjz.gitlab.io/npm-provenance-example
+ CI_PIPELINE_CREATED_AT: '2023-05-19T14:17:21Z'
+ CI_PIPELINE_ID: '872773336'
+ CI_PIPELINE_IID: '40'
+ CI_PIPELINE_SOURCE: push
+ CI_PIPELINE_URL: https://gitlab.com/strongjz/npm-provenance-example/-/pipelines/872773336
+ CI_PROJECT_CLASSIFICATION_LABEL: ''
+ CI_PROJECT_DESCRIPTION: ''
+ CI_PROJECT_ID: '45821955'
+ CI_PROJECT_NAME: npm-provenance-example
+ CI_PROJECT_NAMESPACE: strongjz
+ CI_PROJECT_NAMESPACE_ID: '36018'
+ CI_PROJECT_PATH: strongjz/npm-provenance-example
+ CI_PROJECT_PATH_SLUG: strongjz-npm-provenance-example
+ CI_PROJECT_REPOSITORY_LANGUAGES: javascript,dockerfile
+ CI_PROJECT_ROOT_NAMESPACE: strongjz
+ CI_PROJECT_TITLE: npm-provenance-example
+ CI_PROJECT_URL: https://gitlab.com/strongjz/npm-provenance-example
+ CI_PROJECT_VISIBILITY: public
+ CI_REGISTRY: registry.gitlab.com
+ CI_REGISTRY_IMAGE: registry.gitlab.com/strongjz/npm-provenance-example
+ CI_REGISTRY_USER: gitlab-ci-token
+ CI_RUNNER_DESCRIPTION: 3-blue.shared.runners-manager.gitlab.com/default
+ CI_RUNNER_ID: '12270835'
+ CI_RUNNER_TAGS: >-
+ ["gce", "east-c", "linux", "ruby", "mysql", "postgres", "mongo",
+ "git-annex", "shared", "docker", "saas-linux-small-amd64"]
+ CI_SERVER_HOST: gitlab.com
+ CI_SERVER_NAME: GitLab
+ CI_SERVER_PORT: '443'
+ CI_SERVER_PROTOCOL: https
+ CI_SERVER_REVISION: 9d4873fd3c5
+ CI_SERVER_SHELL_SSH_HOST: gitlab.com
+ CI_SERVER_SHELL_SSH_PORT: '22'
+ CI_SERVER_URL: https://gitlab.com
+ CI_SERVER_VERSION: 16.1.0-pre
+ CI_SERVER_VERSION_MAJOR: '16'
+ CI_SERVER_VERSION_MINOR: '1'
+ CI_SERVER_VERSION_PATCH: '0'
+ CI_TEMPLATE_REGISTRY_HOST: registry.gitlab.com
+ GITLAB_CI: 'true'
+ GITLAB_FEATURES: >-
+ elastic_search,ldap_group_sync,multiple_ldap_servers,seat_link,usage_quotas,zoekt_code_search,repository_size_limit,admin_audit_log,auditor_user,custom_file_templates,custom_project_templates,db_load_balancing,default_branch_protection_restriction_in_groups,extended_audit_events,external_authorization_service_api_management,geo,instance_level_scim,ldap_group_sync_filter,object_storage,pages_size_limit,project_aliases,password_complexity,enterprise_templates,git_abuse_rate_limit,required_ci_templates,runner_maintenance_note,runner_performance_insights,runner_upgrade_management,runner_jobs_statistics
+ GITLAB_USER_ID: '31705'
+ GITLAB_USER_LOGIN: strongjz
+ environment:
+ name: 3-blue.shared.runners-manager.gitlab.com/default
+ architecture: linux/amd64
+ server: https://gitlab.com
+ project: strongjz/npm-provenance-example
+ job:
+ id: '4316132595'
+ pipeline:
+ id: '872773336'
+ ref: .gitlab-ci.yml
+ metadata:
+ buildInvocationId: https://gitlab.com/strongjz/npm-provenance-example/-/jobs/4316132595
+ completeness:
+ parameters: true
+ environment: true
+ materials: false
+ reproducible: false
+ materials:
+ - uri: git+https://gitlab.com/strongjz/npm-provenance-example
+ digest:
+ sha1: 6e02e901e936bfac3d4691984dff8c505410cbc3
+```
+
+## Build artifacts
+
+You can use Cosign to both sign build artifacts and verify artifacts that were signed with Cosign.
+
+### Sign a build artifact with Cosign
+
+GitLab [ID tokens](../secrets/id_token_authentication.md) can be used by Cosign for keyless signing of build artifacts.
+The token must have `sigstore` set as the [`aud`](../secrets/id_token_authentication.md#token-payload) claim. The token can be used by Cosign automatically when
+it is set in the `SIGSTORE_ID_TOKEN` environment variable.
+
+**Best practices**:
+
+- Build and sign an artifact in the same job to prevent the artifact from being tampered with before it is
+ signed.
+
+To learn more about signing artifacts, see [Cosign documentation](https://docs.sigstore.dev/cosign/signing_with_blobs/#keyless-signing-of-blobs-and-files).
+
+```yaml
+sign_artifact:
+ stage: build
+ image: alpine:latest
+ variables:
+ COSIGN_YES: "true"
+ id_tokens:
+ SIGSTORE_ID_TOKEN:
+ aud: sigstore
+ before_script:
+ - apk add --update cosign
+ script:
+ - echo "This is a build artifact" > artifact.txt
+ - cosign sign-blob artifact.txt --bundle cosign.bundle
+ artifacts:
+ paths:
+ - artifact.txt
+ - cosign.bundle
+```
+
+### Verify a build artifact with Cosign
+
+Verifying an artifact requires both the artifact itself and the `cosign.bundle` file produced by `cosign sign-blob`.
+The `--certificate-identity` option should reference the project and branch where the artifact was signed. The
+`--certificate-oidc-issuer` option should reference the GitLab instance where the artifact was signed.
+
+To learn more about verifying signed artifacts, see [Cosign documentation](https://docs.sigstore.dev/cosign/verify/).
+
+```yaml
+verify_artifact:
+ stage: verify
+ image: alpine:latest
+ before_script:
+ - apk add --update cosign
+ script:
+ - cosign verify-blob artifact.txt --bundle cosign.bundle --certificate-identity "https://gitlab.com/my-group/my-project//path/to/.gitlab-ci.yml@refs/heads/main" --certificate-oidc-issuer "https://gitlab.com"
+```
diff --git a/doc/development/advanced_search.md b/doc/development/advanced_search.md
index 73a8191b789..30e1874f1ed 100644
--- a/doc/development/advanced_search.md
+++ b/doc/development/advanced_search.md
@@ -167,7 +167,7 @@ These proxy objects would talk to Elasticsearch server directly (see top half of
![Elasticsearch Architecture](img/elasticsearch_architecture.svg)
-In the planned new design, each model would have a pair of corresponding sub-classed proxy objects, in which model-specific logic is located. For example, `Snippet` would have `SnippetClassProxy` and `SnippetInstanceProxy` (being subclass of `Elasticsearch::Model::Proxy::ClassMethodsProxy` and `Elasticsearch::Model::Proxy::InstanceMethodsProxy`, respectively).
+In the planned new design, each model would have a pair of corresponding sub-classed proxy objects, in which model-specific logic is located. For example, `Snippet` would have `SnippetClassProxy` being a subclass of `Elasticsearch::Model::Proxy::ClassMethodsProxy`. `Snippet` would have `SnippetInstanceProxy` being a subclass of `Elasticsearch::Model::Proxy::InstanceMethodsProxy`.
`__elasticsearch__` would represent another layer of proxy object, keeping track of multiple actual proxy objects. It would forward method calls to the appropriate index. For example:
diff --git a/doc/development/ai_architecture.md b/doc/development/ai_architecture.md
index ac62f50baf5..f497047ccce 100644
--- a/doc/development/ai_architecture.md
+++ b/doc/development/ai_architecture.md
@@ -40,7 +40,7 @@ package "AI API" as AIF {
node "Vertex AI"
}
-package GitLab {
+package GitLab {
node "Web IDE"
package "Web" {
@@ -106,3 +106,24 @@ The following models have been approved for use:
The following vector stores have been approved for use:
- [`pgvector`](https://github.com/pgvector/pgvector) is a Postgres extension adding support for storing vector embeddings and calculating ANN (approximate nearest neighbor).
+
+### Indexing Update
+
+We are currently using sequential scan, which provides perfect recall. We are considering adding an index if we can ensure that it still produces accurate results, as noted in the `pgvector` indexing [documentation](https://github.com/pgvector/pgvector#indexing).
+
+Given that the table contains thousands of entries, indexing with these updated settings would likely improve search speed while maintaining high accuracy. However, more testing may be needed to verify the optimal configuration for this dataset size before deploying to production.
+
+A [draft MR](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/122035) has been created to update the index.
+
+The index function has been updated to improve search quality. This was tested locally by setting the `ivfflat.probes` value to `10` with the following SQL command:
+
+```ruby
+Embedding::TanukiBotMvc.connection.execute("SET ivfflat.probes = 10")
+```
+
+Setting the `probes` value for indexing improves results, as per the neighbor [documentation](https://github.com/ankane/neighbor#indexing).
+
+For optimal `probes` and `lists` values:
+
+- Use `lists` equal to `rows / 1000` for tables with up to 1 million rows and `sqrt(rows)` for larger datasets.
+- For `probes` start with `lists / 10` for tables up to 1 million rows and `sqrt(lists)` for larger datasets.
diff --git a/doc/development/ai_features.md b/doc/development/ai_features.md
index c46117c4afd..52dc37caec3 100644
--- a/doc/development/ai_features.md
+++ b/doc/development/ai_features.md
@@ -17,6 +17,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
- Abstraction for
- OpenAI
- Google Vertex AI
+ - Anthropic
- Rate Limiting
- Circuit Breaker
- Multi-Level feature flags
@@ -26,9 +27,10 @@ info: To determine the technical writer assigned to the Stage/Group associated w
- Configuration for Moderation check of inputs
- Automatic Markdown Rendering of responses
- Centralised Group Level settings for experiment and 3rd party
-- Experimental API endpoints for exploration of AI API’s by GitLab team members without the need for credentials
+- Experimental API endpoints for exploration of AI APIs by GitLab team members without the need for credentials
- OpenAI
- Google Vertex AI
+ - Anthropic
## Feature flags
@@ -41,7 +43,7 @@ See the [feature flag tracker](https://gitlab.com/gitlab-org/gitlab/-/issues/405
## Implement a new AI action
-To implement a new AI action, connect to the OpenAI API. You can connect to this API using either the:
+To implement a new AI action, connect to the preferred AI provider. You can connect to this API using either the:
- Experimental REST API.
- Abstraction layer.
@@ -84,6 +86,43 @@ For features that use the embedding database, additional setup is needed.
1. Run `gdk reconfigure`
1. Run database migrations to create the embedding database
+### Set up GitLab Duo Chat
+
+1. [Enable Anthropic API features](#configure-anthropic-access).
+1. [Enable OpenAI support](#configure-openai-access).
+1. [Ensure the embedding database is configured](#set-up-the-embedding-database).
+1. Enable feature specific feature flag.
+
+ ```ruby
+ Feature.enable(:gitlab_duo)
+ Feature.enable(:tanuki_bot)
+ Feature.enable(:ai_redis_cache)
+ ```
+
+1. Ensure that your current branch is up-to-date with `master`.
+1. To access the GitLab Duo Chat interface, in the lower-left corner of any page, select **Help** and **Ask GitLab Duo Chat**.
+
+#### Tips for local development
+
+1. When responses are taking too long to appear in the user interface, consider restarting Sidekiq by running `gdk restart rails-background-jobs`. If that doesn't work, try `gdk kill` and then `gdk start`.
+1. Alternatively, bypass Sidekiq entirely and run the chat service synchronously. This can help with debugging errors as GraphQL errors are now available in the network inspector instead of the Sidekiq logs.
+
+```diff
+diff --git a/ee/app/services/llm/chat_service.rb b/ee/app/services/llm/chat_service.rb
+index 5fa7ae8a2bc1..5fe996ba0345 100644
+--- a/ee/app/services/llm/chat_service.rb
++++ b/ee/app/services/llm/chat_service.rb
+@@ -5,7 +5,7 @@ class ChatService < BaseService
+ private
+
+ def perform
+- worker_perform(user, resource, :chat, options)
++ worker_perform(user, resource, :chat, options.merge(sync: true))
+ end
+
+ def valid?
+```
+
### Setup for GitLab documentation chat (legacy chat)
To populate the embedding database for GitLab chat:
@@ -133,6 +172,22 @@ Feature.enable(:anthropic_experimentation)
Gitlab::CurrentSettings.update!(anthropic_api_key: <insert API key>)
```
+### Testing GitLab Duo Chat with predefined questions
+
+Because success of answers to user questions in GitLab Duo Chat heavily depends on toolchain and prompts of each tool, it's common that even a minor change in a prompt or a tool impacts processing of some questions. To make sure that a change in the toolchain doesn't break existing functionality, you can use following commands to validate answers to some predefined questions:
+
+1. Rake task which iterates through questions defined in CSV file and checks tools used for evaluating each question.
+
+```ruby
+rake gitlab:llm:zero_shot:test:questions[<issue_url>]
+```
+
+1. RSpec which iterates through resource-specific questions on predefined resources:
+
+```ruby
+ANTHROPIC_API_KEY='<key>' REAL_AI_REQUEST=1 rspec ee/spec/lib/gitlab/llm/chain/agents/zero_shot/executor_spec.rb
+```
+
## Experimental REST API
Use the [experimental REST API endpoints](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/api/ai/experimentation) to quickly experiment and prototype AI features.
@@ -153,7 +208,7 @@ The experimental endpoint is only available to GitLab team members on production
### GraphQL API
-To connect to the OpenAI API using the Abstraction Layer, use an extendable GraphQL API called
+To connect to the AI provider API using the Abstraction Layer, use an extendable GraphQL API called
[`aiAction`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/app/graphql/mutations/ai/action.rb).
The `input` accepts key/value pairs, where the `key` is the action that needs to be performed.
We only allow one AI action per mutation request.
@@ -182,6 +237,8 @@ mutation {
The GraphQL API then uses the [OpenAI Client](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/lib/gitlab/llm/open_ai/client.rb)
to send the response.
+Remember that other clients are available and you should not use OpenAI.
+
#### How to receive a response
As the OpenAI API requests are handled in a background job, we do not keep the request alive and
@@ -201,6 +258,8 @@ You should only subscribe to the subscription once the mutation is sent. If mult
#### Current abstraction layer flow
+The following graph uses OpenAI as an example. You can use different providers.
+
```mermaid
flowchart TD
A[GitLab frontend] -->B[AiAction GraphQL mutation]
diff --git a/doc/development/api_graphql_styleguide.md b/doc/development/api_graphql_styleguide.md
index d6492b7814e..9bc62ed7095 100644
--- a/doc/development/api_graphql_styleguide.md
+++ b/doc/development/api_graphql_styleguide.md
@@ -813,6 +813,12 @@ field :token, GraphQL::Types::String, null: true,
description: 'Token for login.'
```
+Similarly, you can also mark an entire mutation as Alpha by updating where the mutation is mounted in `app/graphql/types/mutation_type.rb`:
+
+```ruby
+mount_mutation Mutations::Ci::JobArtifact::BulkDestroy, alpha: { milestone: '15.10' }
+```
+
Alpha GraphQL items is a custom GitLab feature that leverages GraphQL deprecations. An Alpha item
appears as deprecated in the GraphQL schema. Like all deprecated schema items, you can test an
Alpha field in [GraphiQL](../api/graphql/index.md#graphiql). However, be aware that the GraphiQL
@@ -1668,7 +1674,7 @@ should look like this:
### Mounting the mutation
To make the mutation available it must be defined on the mutation
-type that is stored in `graphql/types/mutation_types`. The
+type that is stored in `graphql/types/mutation_type`. The
`mount_mutation` helper method defines a field based on the
GraphQL-name of the mutation:
diff --git a/doc/development/api_styleguide.md b/doc/development/api_styleguide.md
index 566267b97f1..2ed4d934022 100644
--- a/doc/development/api_styleguide.md
+++ b/doc/development/api_styleguide.md
@@ -179,7 +179,7 @@ request that has an optional parameter:
optional :user_ids, type: Array[Integer], coerce_with: ::API::Validations::Types::CommaSeparatedToIntegerArray.coerce, desc: 'The user ids for this rule'
```
-Normally, a request to PUT `/test?user_ids` would cause Grape to pass
+Usually, a request to PUT `/test?user_ids` would cause Grape to pass
`params` of `{ user_ids: nil }`.
This may introduce errors with endpoints that expect a blank array and
@@ -386,18 +386,6 @@ expect(response).to match_response_schema('merge_requests')
Also see [verifying N+1 performance](#verifying-with-tests) in tests.
-## Error handling
-
-When throwing an error with a message that is meant to be user-facing, you should
-use the error message utility function contained in `lib/gitlab/utils/error_message.rb`.
-It adds a prefix to the error message, making it distinguishable from non-user-facing error messages.
-
-```ruby
-Gitlab::Utils::ErrorMessage.to_user_facing('Example user-facing error-message')
-```
-
-Please make sure that the Frontend is aware of the prefix usage and is using the according utils. See [Error handling](fe_guide/style/javascript.md#error-handling) in JavaScript style guide for more information.
-
## Include a changelog entry
All client-facing changes **must** include a [changelog entry](changelog.md).
diff --git a/doc/development/application_limits.md b/doc/development/application_limits.md
index b1efc11db62..40d157a4411 100644
--- a/doc/development/application_limits.md
+++ b/doc/development/application_limits.md
@@ -171,7 +171,7 @@ The process for adding a new throttle is loosely:
1. Extend `Gitlab::RackAttack` and `Gitlab::RackAttack::Request` to configure the new rate limit,
and apply it to the desired requests.
1. Add the new settings to the Admin Area form in `app/views/admin/application_settings/_ip_limits.html.haml`.
-1. Document the new settings in [User and IP rate limits](../user/admin_area/settings/user_and_ip_rate_limits.md) and [Application settings API](../api/settings.md).
+1. Document the new settings in [User and IP rate limits](../administration/settings/user_and_ip_rate_limits.md) and [Application settings API](../api/settings.md).
1. Configure the rate limit for GitLab.com and document it in [GitLab.com-specific rate limits](../user/gitlab_com/index.md#gitlabcom-specific-rate-limits).
Refer to these past issues for implementation details:
diff --git a/doc/development/architecture.md b/doc/development/architecture.md
index 133cf8a2998..25f471dc9d2 100644
--- a/doc/development/architecture.md
+++ b/doc/development/architecture.md
@@ -1011,7 +1011,7 @@ Puma. All these components should run as different system users to GitLab
(for example, `postgres`, `redis`, and `www-data`, instead of `git`).
As the `git` user it starts Sidekiq and Puma (a simple Ruby HTTP server
-running on port `8080` by default). Under the GitLab user there are normally 4
+running on port `8080` by default). Under the GitLab user there are usually 4
processes: `puma master` (1 process), `puma cluster worker`
(2 processes), `sidekiq` (1 process).
@@ -1067,7 +1067,7 @@ Usage: /etc/init.d/postgresql {start|stop|restart|reload|force-reload|status} [v
GitLab (includes Puma and Sidekiq logs):
-- `/home/git/gitlab/log/` contains `application.log`, `production.log`, `sidekiq.log`, `puma.stdout.log`, `git_json.log` and `puma.stderr.log` normally.
+- `/home/git/gitlab/log/` usually contains `application.log`, `production.log`, `sidekiq.log`, `puma.stdout.log`, `git_json.log` and `puma.stderr.log`.
GitLab Shell:
diff --git a/doc/development/audit_event_guide/index.md b/doc/development/audit_event_guide/index.md
index c7c723d1686..c49d3a243c0 100644
--- a/doc/development/audit_event_guide/index.md
+++ b/doc/development/audit_event_guide/index.md
@@ -32,7 +32,7 @@ To instrument an audit event, the following attributes should be provided:
| Attribute | Type | Required? | Description |
|:-------------|:---------------------|:----------|:------------------------------------------------------------------|
| `name` | String | false | Action name to be audited. Represents the [type of the event](#event-type-definitions). Used for error tracking |
-| `author` | User | true | User who authors the change |
+| `author` | User | true | User who authors the change. Can be an [internal user](../internal_users.md). For example, [inactive project deletion](../../administration/inactive_project_deletion.md) audit events are authored by `GitLab-Admin-Bot`. |
| `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 ([not translated](#i18n-and-the-audit-event-message-attribute)) |
diff --git a/doc/development/auto_devops.md b/doc/development/auto_devops.md
index 1f98a37ac9d..ccbad7f7314 100644
--- a/doc/development/auto_devops.md
+++ b/doc/development/auto_devops.md
@@ -41,7 +41,7 @@ Some jobs use images that are built from external projects:
[`auto-deploy-app`](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/tree/master/assets/auto-deploy-app) is used to deploy.
There are extra variables that get passed to the CI jobs when Auto
-DevOps is enabled that are not present in a normal CI job. These can be
+DevOps is enabled that are not present in a typical CI job. These can be
found in
[`ProjectAutoDevops`](https://gitlab.com/gitlab-org/gitlab/-/blob/bf69484afa94e091c3e1383945f60dbe4e8681af/app/models/project_auto_devops.rb).
diff --git a/doc/development/avoiding_required_stops.md b/doc/development/avoiding_required_stops.md
new file mode 100644
index 00000000000..0308e0c30c0
--- /dev/null
+++ b/doc/development/avoiding_required_stops.md
@@ -0,0 +1,137 @@
+---
+stage: Systems
+group: Distribution
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Avoiding required stops
+
+Required stops are any changes to GitLab [components](architecture.md) or
+dependencies that result in the need to upgrade to and stop at a specific
+`major.minor` version when [upgrading GitLab](../update/index.md).
+
+While Development maintains a [maintainenance policy](../policy/maintenance.md)
+that results in a three-release (3 month) backport window - GitLab maintains a
+much longer window of [version support](https://about.gitlab.com/support/statement-of-support/#version-support)
+that includes the current major version, as well as the two previous major
+versions. Based on the schedule of previous major releases, GitLab customers can
+lag behind the current release for up to three years and still expect to have
+support for upgrades.
+
+For example, a GitLab user upgrading from GitLab 14.0.12 to GitLab 16.1,
+which is a fully supported [upgrade path](../update/index.md#upgrade-paths), may have
+the following required stops: `14.3.6`, `14.9.5`, `14.10.5`, `15.0.5`, `15.1.6`,
+`15.4.6`, and `15.11.11` before upgrading to the latest `16.1.z` version.
+
+Past required stops have not been discovered for months after their introduction,
+often as the result of extensive troubleshooting and assistance from Support
+Engineers, Customer Success Managers, and Development Engineers as users upgrade
+across greater than 1-3 minor releases.
+
+Wherever possible, a required stop should be avoided. If it can't be avoided,
+the required stop should be aligned to a _scheduled_ required stop.
+
+Scheduled required stops are often implemented for the previous `major`.`minor`
+release just prior to a `major` version release in order to accomodate multiple
+[planned deprecations](../update/terminology.md#deprecation) and known
+[breaking changes](../update/terminology.md#breaking-change).
+
+Additionally, as of GitLab 16, we have introduced
+[_scheduled_ `major`.`minor` required stops](../update/index.md#upgrade-paths):
+
+>>>
+During GitLab 16.x, we are scheduling two or three required upgrade stops.
+
+We will give at least two milestones of notice when we schedule a required
+upgrade stop. The first planned required upgrade stop is scheduled for GitLab
+16.3. If nothing is introduced requiring an upgrade stop, GitLab 16.3 will be
+treated as a regular upgrade.
+>>>
+
+## Causes of required stops
+
+### Inaccurate assumptions about completed migrations
+
+The majority of required stops are due to assumptions about the state of the
+data model in a given release, usually in the form of interdependent database
+migrations, or code changes that assume that schema changes introduced in
+prior migrations have completed by the time the code loads.
+
+Designing changes and migrations for [backwards compatibility between versions](multi_version_compatibility.md) can mitigate stop concerns with continuous or
+"zero-downtime" upgrades. However, the **contract** phase will likely introduce
+a required stop when a migration/code change is introduced that requires
+that background migrations have completed before running or loading.
+
+WARNING:
+If you're considering adding or removing a migration, or introducing code that
+assumes that migrations have completed in a given release, first review
+the database-related documentation on [required stops](database/required_stops.md).
+
+#### Examples
+
+- GitLab `12.1`: Introduced a background migration changing `merge_status` in
+ MergeRequests depending on the `state` value. The `state` attribute was removed
+ in `12.10`. It took until `13.6` to document the required stop.
+- GitLab `13.8`: Includes a background migration to deal with duplicate service
+ records. In `13.9`, a unique index was applied in another migration that
+ depended on the background migration completing. Not discovered/documented until
+ GitLab `14.3`
+- GitLab `14.3`: Includes a potentially long-running background migration against
+ `merge_request_diff_commits` that was foregrounded in `14.5`. This change resulted in
+ extensive downtime for users with large GitLab installations. Not documented
+ until GitLab `15.1`
+- GitLab `14.9`: Includes a batched background migration for `namespaces` and `projects`
+ that needs to finish before another batched background migration added in `14.10` executes,
+ forcing a required stop. The migration can take hours or days to complete on
+ large GitLab installations.
+
+Additional details as well as links to related issues and merge requests can be
+found in: [Issue: Put in place measures to avoid addition/proliferation of GitLab upgrade path stops](https://gitlab.com/gitlab-org/gitlab/-/issues/375553)
+
+### Removal of code workarounds and mitigations
+
+Similar to assumptions about the data model/schema/migration state, required
+`major.minor` stops have been introduced due to the intentional removal of
+code implemented to workaround previously discovered issues.
+
+#### Examples
+
+- GitLab `13.1`: A security fix in Rails `6.0.3.1` introduced a CSRF token change
+ (causing a canary environment incident). We introduced code to maintain acceptance
+ of previously generated tokens, and removed the code in `13.2`, creating a known
+ required stop in `13.1`.
+- GitLab `15.4`: Introduces a migration to fix an inaccurate `expires_at` timestamp
+ for job artifacts that had been mitigated in code since GitLab `14.9`. The
+ workaround was removed in GitLab `15.6`, causing `15.4` to be a required stop.
+
+### Deprecations
+
+Deprecations, particularly [breaking changes](../update/terminology.md#breaking-change)
+can also cause required stops if they introduce long migration delays or require
+manual actions on the part of GitLab administrators.
+
+These are generally accepted as a required stop around a major release, either
+stopping at the latest `major.minor` release immediately proceeding
+a new `major` release, and potentially the lastest `major.0` patch release, and
+to date, discovered required stops related to deprecations have been limited to
+these releases.
+
+#### Examples
+
+Examples of deprecations are too numerous to be listed here, but can found
+in the [deprecations and removals by version](../update/deprecations.md) as well
+as the [version-specific upgrading instructions](../update/index.md#version-specific-upgrading-instructions),
+[version-specific changes for the GitLab package (Omnibus)](../update/package/index.md#version-specific-changes),
+and [GitLab chart upgrade notes](https://docs.gitlab.com/charts/installation/upgrade.html).
+
+## Further reading
+
+- [Documentation: Database - Adding required stops](database/required_stops.md)
+- [Documentation: Upgrading GitLab](../update/index.md)
+ - [Package (Omnibus) upgrade](../update/package/index.md)
+ - [Docker upgrade](../install/docker.md#upgrade)
+ - [GitLab chart](https://docs.gitlab.com/charts/installation/upgrade.html)
+- [Issue: Put in place measures to avoid addition/proliferation of GitLab upgrade path stops](https://gitlab.com/gitlab-org/gitlab/-/issues/375553)
+- [Issue: Brainstorm ways for background migrations to be finalized without introducing a required upgrade step](https://gitlab.com/gitlab-org/gitlab/-/issues/357561)
+- [Issue: Scheduled required paths for GitLab upgrades to improve UX](https://gitlab.com/gitlab-org/gitlab/-/issues/358417)
+- [Epic: GitLab Releases and Maintenance policies](https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/988)
diff --git a/doc/development/backend/ruby_style_guide.md b/doc/development/backend/ruby_style_guide.md
index 1a1c0db49f7..714c8571d20 100644
--- a/doc/development/backend/ruby_style_guide.md
+++ b/doc/development/backend/ruby_style_guide.md
@@ -175,3 +175,24 @@ Previous discussions include:
- <https://gitlab.com/gitlab-org/gitlab-foss/-/issues/44234>
- <https://gitlab.com/gitlab-org/gitlab-foss/-/issues/36076>
- <https://gitlab.com/gitlab-org/gitlab/-/issues/198046>
+
+### Type safety
+
+Now that we've upgraded to Ruby 3, we have more options available
+to enforce [type safety](https://en.wikipedia.org/wiki/Type_safety).
+
+Some of these options are supported as part of the Ruby syntax and do not require the use of specific type safety tools like [Sorbet](https://sorbet.org/) or [RBS](https://github.com/ruby/rbs). However, we might consider these tools in the future as well.
+
+For more information, see [Type safety](https://gitlab.com/gitlab-org/gitlab/-/tree/master/ee/lib/remote_development#type-safety) in the `remote_development` domain README.
+
+### Functional patterns
+
+Although Ruby and especially Rails are primarily based on [object-oriented programming](https://en.wikipedia.org/wiki/object-oriented_programming) patterns, Ruby is a very flexible language and supports [functional programming](https://en.wikipedia.org/wiki/Functional_programming) patterns as well.
+
+Functional programming patterns, especially in domain logic, can often result in more readable, maintainable, and bug-resistant code while still using idiomatic and familiar Ruby patterns.
+However, functional programming patterns should be used carefully because some patterns would cause confusion and should be avoided even if they're directly supported by Ruby. The [`curry` method](https://www.rubydoc.info/stdlib/core/Method:curry) is a likely example.
+
+For more information, see:
+
+- [Functional patterns](https://gitlab.com/gitlab-org/gitlab/-/tree/master/ee/lib/remote_development#functional-patterns)
+- [Railway-oriented programming and the `Result` class](https://gitlab.com/gitlab-org/gitlab/-/tree/master/ee/lib/remote_development#railway-oriented-programming-and-the-result-class)
diff --git a/doc/development/cicd/cicd_reference_documentation_guide.md b/doc/development/cicd/cicd_reference_documentation_guide.md
index 530bc62b603..e358b24c60f 100644
--- a/doc/development/cicd/cicd_reference_documentation_guide.md
+++ b/doc/development/cicd/cicd_reference_documentation_guide.md
@@ -125,7 +125,7 @@ can include changes introduced in different GitLab versions. For example:
**Additional details**:
- The expiration time period begins when the artifact is uploaded and stored on GitLab.
- If the expiry time is not defined, it defaults to the [instance wide setting](../../user/admin_area/settings/continuous_integration.md#default-artifacts-expiration).
+ If the expiry time is not defined, it defaults to the [instance wide setting](../../administration/settings/continuous_integration.md#default-artifacts-expiration).
- To override the expiration date and protect artifacts from being automatically deleted:
- Select **Keep** on the job page.
- [In GitLab 13.3 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/22761), set the value of
diff --git a/doc/development/cicd/index.md b/doc/development/cicd/index.md
index b186c37f933..dceb2da5951 100644
--- a/doc/development/cicd/index.md
+++ b/doc/development/cicd/index.md
@@ -187,7 +187,7 @@ See [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/16111) for the fu
## Compute quota
-> [Renamed](https://gitlab.com/groups/gitlab-com/-/epics/2150) from "CI/CD minutes" to "compute quota" and "units of compute" in GitLab 16.1.
+> [Renamed](https://gitlab.com/groups/gitlab-com/-/epics/2150) from "CI/CD minutes" to "compute quota" and "compute minutes" in GitLab 16.1.
This diagram shows how the [Compute quota](../../ci/pipelines/cicd_minutes.md)
feature and its components work.
diff --git a/doc/development/cicd/pipeline_wizard.md b/doc/development/cicd/pipeline_wizard.md
index 213a9fe1762..f322ec2e2bf 100644
--- a/doc/development/cicd/pipeline_wizard.md
+++ b/doc/development/cicd/pipeline_wizard.md
@@ -143,7 +143,7 @@ user to the pipeline, for example.
### Template file location
-Template files are normally stored as YAML files in `~/pipeline_wizard/templates/`.
+Template files are usually stored as YAML files in `~/pipeline_wizard/templates/`.
The `PipelineWizard` component expects the `template` property as an un-parsed `String`,
and Webpack is configured to load `.yml` files from the above folder as strings.
diff --git a/doc/development/cicd/templates.md b/doc/development/cicd/templates.md
index 77e529867af..bf392a3f446 100644
--- a/doc/development/cicd/templates.md
+++ b/doc/development/cicd/templates.md
@@ -424,27 +424,11 @@ To add a metric definition for a new template:
1. Install and start the [GitLab GDK](https://gitlab.com/gitlab-org/gitlab-development-kit#installation).
1. In the `gitlab` directory in your GDK, check out the branch that contains the new template.
-1. [Add the template inclusion event](../internal_analytics/service_ping/implement.md#add-new-events)
- with this Rake task:
-
- ```shell
- bin/rake gitlab:usage_data:generate_ci_template_events
- ```
-
- The task adds a section like the following to [`lib/gitlab/usage_data_counters/known_events/ci_templates.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/ci_templates.yml):
-
- ```yaml
- - name: p_ci_templates_my_template_name
- category: ci_templates
- aggregation: weekly
- ```
-
-1. Copy the value of `name` from the new YAML section, and add it to the weekly
- and monthly CI/CD template total count metrics:
+1. Add the new template event name to the weekly and monthly CI/CD template total count metrics:
- [`config/metrics/counts_7d/20210216184557_ci_templates_total_unique_counts_weekly.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184557_ci_templates_total_unique_counts_weekly.yml)
- [`config/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml)
-1. Use the same `name` as above as the last argument in the following command to
+1. Use the same event name as above as the last argument in the following command to
[add new metric definitions](../internal_analytics/service_ping/metrics_dictionary.md#metrics-added-dynamic-to-service-ping-payload):
```shell
@@ -481,7 +465,6 @@ To add a metric definition for a new template:
For example, these are the metrics configuration files for the
[5 Minute Production App template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/5-Minute-Production-App.gitlab-ci.yml):
-- The template inclusion event: [`lib/gitlab/usage_data_counters/known_events/ci_templates.yml#L438-L441`](https://gitlab.com/gitlab-org/gitlab/-/blob/dcddbf83c29d1ad0839d55362c1b43888304f453/lib/gitlab/usage_data_counters/known_events/ci_templates.yml#L438-L441)
- The weekly and monthly metrics definitions:
- [`config/metrics/counts_7d/20210901223501_p_ci_templates_5_minute_production_app_weekly.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/1a6eceff3914f240864b2ca15ae2dc076ea67bf6/config/metrics/counts_7d/20210216184515_p_ci_templates_5_min_production_app_weekly.yml)
- [`config/metrics/counts_28d/20210901223505_p_ci_templates_5_minute_production_app_monthly.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184517_p_ci_templates_5_min_production_app_monthly.yml)
diff --git a/doc/development/code_review.md b/doc/development/code_review.md
index e9f00b640d9..6aedb18c15d 100644
--- a/doc/development/code_review.md
+++ b/doc/development/code_review.md
@@ -82,7 +82,7 @@ We make the following assumption with regards to automatically being considered
- Team members working in a specific stage/group (for example, create: source code) are considered domain experts for that area of the app they work on.
- Team members working on a specific feature (for example, search) are considered domain experts for that feature.
-We default to assigning reviews to team members with domain expertise for code reviews. For UX reviews we default to the recommended designer from the Reviewer roulette.
+We default to assigning reviews to team members with domain expertise for code reviews. UX reviews default to the recommended reviewer from the Review Roulette. Due to designer capacity limits, areas not supported by a Product Designer will no longer require a UX review unless it is a community contribution.
When a suitable [domain expert](#domain-experts) isn't available, you can choose any team member to review the MR, or follow the [Reviewer roulette](#reviewer-roulette) recommendation (see above for UX reviews).
To find a domain expert:
@@ -106,7 +106,9 @@ Reviewer roulette is an internal tool for use on GitLab.com, and not available f
The [Danger bot](dangerbot.md) randomly picks a reviewer and a maintainer for
each area of the codebase that your merge request seems to touch. It makes
**recommendations** for developer reviewers and you should override it if you think someone else is a better
-fit. User-facing changes are also required to have a UX review, even if it's behind a feature flag. Default to the recommended UX reviewer suggested.
+fit.
+
+We only do UX reviews for MRs from teams that include a Product Designer. User-facing changes from these teams are required to have a UX review, even if it's behind a feature flag. Default to the recommended UX reviewer suggested.
It picks reviewers and maintainers from the list at the
[engineering projects](https://about.gitlab.com/handbook/engineering/projects/)
@@ -398,6 +400,8 @@ Maintainers are the DRI of assuring that the acceptance criteria of a merge requ
In general, [quality is everyone's responsibility](https://about.gitlab.com/handbook/engineering/quality/),
but maintainers of an MR are held responsible for **ensuring** that an MR meets those general quality standards.
+This includes [avoiding the creation of technical debt in follow-up issues](contributing/issue_workflow.md#technical-debt-in-follow-up-issues).
+
If a maintainer feels that an MR is substantial enough, or requires a [domain expert](#domain-experts),
maintainers have the discretion to request a review from another reviewer, or maintainer. Here are some
examples of maintainers proactively doing this during review:
diff --git a/doc/development/contributing/first_contribution.md b/doc/development/contributing/first_contribution.md
index 3cf7f222fe4..4bebabbc125 100644
--- a/doc/development/contributing/first_contribution.md
+++ b/doc/development/contributing/first_contribution.md
@@ -302,7 +302,7 @@ Now you're ready to push changes from the community fork to the main GitLab repo
![Create merge request banner](img/mr_button.png)
Select **Create merge request**.
- If you don't see this message, on the left sidebar, select **Merge requests > New merge request**.
+ If you don't see this message, on the left sidebar, select **Code > Merge requests > New merge request**.
1. Take a look at the branch names. You should be merging from your branch
in the community fork to the `master` branch in the GitLab repository.
diff --git a/doc/development/contributing/index.md b/doc/development/contributing/index.md
index eb26ddbd9e9..b929a5c0f04 100644
--- a/doc/development/contributing/index.md
+++ b/doc/development/contributing/index.md
@@ -71,7 +71,7 @@ To write and test your code, you will use the GitLab Development Kit.
Now [Open a merge request](../../user/project/merge_requests/creating_merge_requests.md)
to merge your code and its documentation. The earlier you open a merge request, the sooner
you can get feedback. You can [mark it as a draft](../../user/project/merge_requests/drafts.md)
-to signal that you’re not done yet.
+to signal that you're not done yet.
1. In the merge request, fill out all the information requested in the template,
like why you are introducing these changes and a link to the issue this merge request is attempting to close/fix.
@@ -159,4 +159,4 @@ If you need any help while contributing to GitLab:
- For any other questions or feedback on contributing:
- Ping `@gitlab-org/community-relations/contributor-success` in a comment on your merge request or issue.
- Feel free to [make a new issue with the Contributor Success team](https://gitlab.com/gitlab-org/community-relations/contributor-success/team-task/-/issues/) sharing your experience.
-- Did you run out of compute credits for your GitLab merge requests? Join the [GitLab community forks](https://gitlab.com/gitlab-community/meta) project.
+- Did you run out of compute minutes for your GitLab merge requests? Join the [GitLab community forks](https://gitlab.com/gitlab-community/meta) project.
diff --git a/doc/development/contributing/style_guides.md b/doc/development/contributing/style_guides.md
index d24875e559a..651c7214275 100644
--- a/doc/development/contributing/style_guides.md
+++ b/doc/development/contributing/style_guides.md
@@ -31,7 +31,7 @@ We were using Overcommit prior to Lefthook, so you may want to uninstall it firs
### Install Lefthook
1. You can install lefthook in [different ways](https://github.com/evilmartians/lefthook/blob/master/docs/install.md#install-lefthook).
- If you do not choose to install it globally (e.g. via Homebrew or package managers), and only want to use it for the GitLab project,
+ If you do not choose to install it globally (for example, via Homebrew or package managers), and only want to use it for the GitLab project,
you can install the Ruby gem via:
```shell
diff --git a/doc/development/database/adding_database_indexes.md b/doc/development/database/adding_database_indexes.md
index 23a12413975..4c2dacd29ff 100644
--- a/doc/development/database/adding_database_indexes.md
+++ b/doc/development/database/adding_database_indexes.md
@@ -252,7 +252,7 @@ Sometimes it is necessary to add an index to support a [batched background migra
It is commonly done by creating two [post deployment migrations](post_deployment_migrations.md):
1. Add the new index, often a [temporary index](#temporary-indexes).
-1. [Queue the batched background migration](batched_background_migrations.md#queueing).
+1. [Queue the batched background migration](batched_background_migrations.md#enqueue-a-batched-background-migration).
In most cases, no additional work is needed. The new index is created and is used
as expected when queuing and executing the batched background migration.
@@ -471,7 +471,8 @@ This migration enters the index name and definition into the `postgres_async_ind
table. The process that runs on weekends pulls indexes from this table and attempt
to remove them.
-You must test the database index changes locally before creating a merge request.
+You must [test the database index changes locally](#verify-indexes-removed-asynchronously) before creating a merge request.
+Include the output of the test in the merge request description.
### Verify the MR was deployed and the index no longer exists in production
diff --git a/doc/development/database/avoiding_downtime_in_migrations.md b/doc/development/database/avoiding_downtime_in_migrations.md
index 25310554c24..6a819e9f6cd 100644
--- a/doc/development/database/avoiding_downtime_in_migrations.md
+++ b/doc/development/database/avoiding_downtime_in_migrations.md
@@ -316,6 +316,13 @@ Example migration:
Changing column defaults is difficult because of how Rails handles values
that are equal to the default.
+NOTE:
+Rails ignores sending the default values to PostgreSQL when writing records. It leaves this task to
+the database. When migrations change the default values of the columns, the running application is unaware
+of this change due to the schema cache. The application is then under the risk of accidentally writing
+wrong data to the database, especially when deploying the new version of the code
+long after we run database migrations.
+
If running code ever explicitly writes the old default value of a column, you must follow a multi-step
process to prevent Rails replacing the old default with the new default in INSERT queries that explicitly
specify the old default.
@@ -381,7 +388,7 @@ when migrating a column in a large table (for example, `issues`). Background
migrations spread the work / load over a longer time period, without slowing
down deployments.
-For more information, see [the documentation on cleaning up batched background migrations](batched_background_migrations.md#cleaning-up).
+For more information, see [the documentation on cleaning up batched background migrations](batched_background_migrations.md#cleaning-up-a-batched-background-migration).
## Adding indexes
diff --git a/doc/development/database/background_migrations.md b/doc/development/database/background_migrations.md
index 457694c7abd..be121cc0bfe 100644
--- a/doc/development/database/background_migrations.md
+++ b/doc/development/database/background_migrations.md
@@ -1,508 +1,11 @@
---
-stage: Data Stores
-group: Database
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+redirect_to: 'index.md'
+remove_date: '2023-10-11'
---
-# Background migrations
+This document was moved to [another location](index.md).
-WARNING:
-Background migrations are strongly discouraged in favor of the new [batched background migrations framework](batched_background_migrations.md).
-Check that documentation and determine if that framework suits your needs and fall back
-to these only if required.
-
-Background migrations should be used to perform data migrations whenever a
-migration exceeds [the time limits in our guidelines](../migration_style_guide.md#how-long-a-migration-should-take). For example, you can use background
-migrations to migrate data that's stored in a single JSON column
-to a separate table instead.
-
-If the database cluster is considered to be in an unhealthy state, background
-migrations automatically reschedule themselves for a later point in time.
-
-## When To Use Background Migrations
-
-You should use a background migration when you migrate _data_ in tables that have
-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.
-
-- Background migrations should be used when migrating data in [high-traffic tables](../migration_style_guide.md#high-traffic-tables).
-- 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, hence it should be split accordingly
-and put into background migrations.
-- Background migrations should not be used to perform schema migrations.
-
-Some examples where background migrations can be useful:
-
-- 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 background migration is part of an important upgrade, make sure it's announced
-in the release post. Discuss with your Project Manager if you're not sure the migration falls
-into this category.
-
-## Isolation
-
-Background migrations must be isolated and cannot use application code (for example,
-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.
-Usual Sidekiq rules apply, especially the rule that jobs should be small
-and idempotent.
-
-See [Sidekiq best practices guidelines](https://github.com/mperham/sidekiq/wiki/Best-Practices)
-for more details.
-
-Make sure that in case that your migration job is retried, data
-integrity is guaranteed.
-
-## Background migrations for EE-only features
-
-All the background migration classes for EE-only features should be present in GitLab CE.
-For this purpose, an empty class can be created for GitLab CE, and it can be extended for GitLab EE
-as explained in the [guidelines for implementing Enterprise Edition features](../ee_features.md#code-in-libgitlabbackground_migration).
-
-## How It Works
-
-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`, the files should be placed in the directory
-`lib/gitlab/background_migration/`.
-
-## Scheduling
-
-Scheduling a background migration should be done in a post-deployment
-migration that includes `Gitlab::Database::MigrationHelpers`
-To do so, use the following code while
-replacing the class name and arguments with whatever values are necessary for
-your migration:
-
-```ruby
-migrate_in('BackgroundMigrationClassName', [arg1, arg2, ...])
-```
-
-You can use the function `queue_background_migration_jobs_by_range_at_intervals`
-to automatically split the job into batches:
-
-```ruby
-queue_background_migration_jobs_by_range_at_intervals(
- ClassName,
- 'BackgroundMigrationClassName',
- 2.minutes,
- batch_size: 10_000
- )
-```
-
-You also need to make sure that newly created data is either migrated, or
-saved in both the old and new version upon creation. For complex and time
-consuming migrations it's best to schedule a background job using an
-`after_create` hook so this doesn't affect response timings. The same applies to
-updates. Removals in turn can be handled by defining foreign keys with
-cascading deletes.
-
-### Rescheduling background migrations
-
-If one of the background migrations contains a bug that is fixed in a patch
-release, the background migration needs to be rescheduled so the migration would
-be repeated on systems that already performed the initial migration.
-
-When you reschedule the background migration, make sure to turn the original
-scheduling into a no-op by clearing up the `#up` and `#down` methods of the
-migration performing the scheduling. Otherwise the background migration would be
-scheduled multiple times on systems that are upgrading multiple patch releases at
-once.
-
-When you start the second post-deployment migration, you should delete any
-previously queued jobs from the initial migration with the provided
-helper:
-
-```ruby
-delete_queued_jobs('BackgroundMigrationClassName')
-```
-
-## 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 scheduling them. For example, you can't drop a column that's
-used in the migration process as this would cause jobs to fail. This means that
-you need to add a separate _post deployment_ migration in a future release
-that finishes any remaining jobs before cleaning things up (for example, removing a
-column).
-
-As an example, say you want to migrate the data from column `foo` (containing a
-big JSON blob) to column `bar` (containing a string). The process for this would
-roughly be as follows:
-
-1. Release A:
- 1. Create a migration class that performs the migration for a row with a given ID.
- You can use [background jobs tracking](#background-jobs-tracking) to simplify cleaning up.
- 1. Deploy the code for this release, this should include some code that will
- schedule jobs for newly created data (for example, using an `after_create` hook).
- 1. Schedule jobs for all existing rows in a post-deployment migration. It's
- possible some newly created rows may be scheduled twice so your migration
- should take care of this.
-1. Release B:
- 1. Deploy code so that the application starts using the new column and stops
- scheduling jobs for newly created data.
- 1. In a post-deployment migration, finalize all jobs that have not succeeded by now.
- If you used [background jobs tracking](#background-jobs-tracking) in release A,
- you can use `finalize_background_migration` from `BackgroundMigrationHelpers` to ensure no jobs remain.
- This helper will:
- 1. Use `Gitlab::BackgroundMigration.steal` to process any remaining
- jobs in Sidekiq.
- 1. Reschedule the migration to be run directly (that is, not through Sidekiq)
- on any rows that weren't migrated by Sidekiq. This can happen if, for
- instance, Sidekiq received a SIGKILL, or if a particular batch failed
- enough times to be marked as dead.
- 1. Remove `Gitlab::Database::BackgroundMigrationJob` rows where
- `status = succeeded`. To retain diagnostic information that may
- help with future bug tracking you can skip this step by specifying
- the `delete_tracking_jobs: false` parameter.
- 1. Remove the old column.
-
-This may also require a bump to the [import/export version](../../user/project/settings/import_export.md), if
-importing a project from a prior version of GitLab requires the data to be in
-the new format.
-
-## Example
-
-To explain all this, let's use the following example: the table `integrations` has a
-field called `properties` which is stored in JSON. For all rows you want to
-extract the `url` key from this JSON object and store it in the `integrations.url`
-column. There are millions of integrations and parsing JSON is slow, thus you can't
-do this in a regular migration.
-
-To do this using a background migration we start with defining our migration
-class:
-
-```ruby
-class Gitlab::BackgroundMigration::ExtractIntegrationsUrl
- class Integration < ::ApplicationRecord
- 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
-```
-
-Next we need to adjust our code so we schedule the above migration for newly
-created and updated integrations. We can do this using something along the lines of
-the following:
-
-```ruby
-class Integration < ::ApplicationRecord
- after_commit :schedule_integration_migration, on: :update
- after_commit :schedule_integration_migration, on: :create
-
- def schedule_integration_migration
- BackgroundMigrationWorker.perform_async('ExtractIntegrationsUrl', [id, id])
- end
-end
-```
-
-We're using `after_commit` here to ensure the Sidekiq job is not scheduled
-before the transaction completes as doing so can lead to race conditions where
-the changes are not yet visible to the worker.
-
-Next we need a post-deployment migration that schedules the migration for
-existing data.
-
-```ruby
-class ScheduleExtractIntegrationsUrl < Gitlab::Database::Migration[2.1]
- disable_ddl_transaction!
-
- MIGRATION = 'ExtractIntegrationsUrl'
- DELAY_INTERVAL = 2.minutes
-
- def up
- queue_background_migration_jobs_by_range_at_intervals(
- define_batchable_model('integrations'),
- MIGRATION,
- DELAY_INTERVAL)
- end
-
- def down
- end
-end
-```
-
-After deployed our application continues using the data as before, but at the
-same time ensures that both existing and new data is migrated.
-
-In the next release we can remove the `after_commit` hooks and related code. We
-also need to add a post-deployment migration that consumes any remaining
-jobs and manually run on any un-migrated rows. Such a migration would look like
-this:
-
-```ruby
-class ConsumeRemainingExtractIntegrationsUrlJobs < Gitlab::Database::Migration[2.1]
- disable_ddl_transaction!
-
- def up
- # This must be included
- Gitlab::BackgroundMigration.steal('ExtractIntegrationsUrl')
-
- # This should be included, but can be skipped - see below
- define_batchable_model('integrations').where(url: nil).each_batch(of: 50) do |batch|
- range = batch.pluck('MIN(id)', 'MAX(id)').first
-
- Gitlab::BackgroundMigration::ExtractIntegrationsUrl.new.perform(*range)
- end
- end
-
- def down
- end
-end
-```
-
-The final step runs for any un-migrated rows after all of the jobs have been
-processed. This is in case a Sidekiq process running the background migrations
-received SIGKILL, leading to the jobs being lost. (See
-[more reliable Sidekiq queue](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/36791) for more information.)
-
-If the application does not depend on the data being 100% migrated (for
-instance, the data is advisory, and not mission-critical), then this final step
-can be skipped.
-
-This migration then processes any jobs for the `ExtractIntegrationsUrl` migration
-and continue once all jobs have been processed. Once done you can safely remove
-the `integrations.properties` column.
-
-## Testing
-
-It is required to write tests for:
-
-- The background migrations' scheduling migration.
-- The background migration itself.
-- A cleanup migration.
-
-The `:migration` and `schema: :latest` RSpec tags are automatically set for
-background migration specs.
-See the
-[Testing Rails migrations](../testing_guide/testing_migrations_guide.md#testing-a-non-activerecordmigration-class)
-style guide.
-
-Keep in mind that `before` and `after` RSpec hooks are going
-to migrate you database down and up, which can result in other background
-migrations being called. That means that 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 being
-called in RSpec hooks. See [issue #35351](https://gitlab.com/gitlab-org/gitlab/-/issues/18839)
-for more details.
-
-## Best practices
-
-1. Make sure to know how much data you're dealing with.
-1. Make sure that background migration jobs are idempotent.
-1. Make sure that tests you write are not false positives.
-1. Make sure that if the data being migrated is critical and cannot be lost, the
- clean-up migration also checks the final state of the data before completing.
-1. When migrating many columns, make sure it does not generate too many
- dead tuples in the process (you may need to directly query the number of dead tuples
- and adjust the scheduling according to this piece of data).
-1. Make sure to 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. Make sure to know how much time it takes to run all scheduled migrations.
-1. Provide an estimation section in the description, estimating both the total migration
- run time and the query times for each background migration job. Explain plans for each query
- should also be provided.
-
- For example, assuming a migration that deletes data, include information similar to
- the following section:
-
- ```plaintext
- Background Migration Details:
-
- 47600 items to delete
- batch size = 1000
- 47600 / 1000 = 48 batches
-
- Estimated times per batch:
- - 820ms for select statement with 1000 items (see linked explain plan)
- - 900ms for delete statement with 1000 items (see linked explain plan)
- Total: ~2 sec per batch
-
- 2 mins delay per batch (safe for the given total time per batch)
-
- 48 batches * 2 min per batch = 96 mins to run all the scheduled jobs
- ```
-
- The execution time per batch (2 sec in this example) is not included in the calculation
- for total migration time. The jobs are scheduled 2 minutes apart without knowledge of
- the execution time.
-
-## Additional tips and strategies
-
-### Nested batching
-
-A strategy to make the migration run faster is to schedule larger batches, and then use `EachBatch`
-within the background migration to perform multiple statements.
-
-The background migration helpers that queue multiple jobs such as
-`queue_background_migration_jobs_by_range_at_intervals` use [`EachBatch`](iterating_tables_in_batches.md).
-The example above has batches of 1000, where each queued job takes two seconds. If the query has been optimized
-to make the time for the delete statement within the [query performance guidelines](query_performance.md),
-1000 may be the largest number of records that can be deleted in a reasonable amount of time.
-
-The minimum and most common interval for delaying jobs is two minutes. This results in two seconds
-of work for each two minute job. There's nothing that prevents you from executing multiple delete
-statements in each background migration job.
-
-Looking at the example above, you could alternatively do:
-
-```plaintext
-Background Migration Details:
-
-47600 items to delete
-batch size = 10_000
-47600 / 10_000 = 5 batches
-
-Estimated times per batch:
-- Records are updated in sub-batches of 1000 => 10_000 / 1000 = 10 total updates
-- 820ms for select statement with 1000 items (see linked explain plan)
-- 900ms for delete statement with 1000 items (see linked explain plan)
-Sub-batch total: ~2 sec per sub-batch,
-Total batch time: 2 * 10 = 20 sec per batch
-
-2 mins delay per batch
-
-5 batches * 2 min per batch = 10 mins to run all the scheduled jobs
-```
-
-The batch time of 20 seconds still fits comfortably within the two minute delay, yet the total run
-time is cut by a tenth from around 100 minutes to 10 minutes! When dealing with large background
-migrations, this can cut the total migration time by days.
-
-When batching in this way, it is important to look at query times on the higher end
-of the table or relation being updated. `EachBatch` may generate some queries that become much
-slower when dealing with higher ID ranges.
-
-### Delay time
-
-When looking at the batch execution time versus the delay time, the execution time
-should fit comfortably within the delay time for a few reasons:
-
-- To allow for a variance in query times.
-- To allow `autovacuum` to catch up after periods of high churn.
-
-Never try to optimize by fully filling the delay window even if you are confident
-the queries themselves have no timing variance.
-
-### Background jobs tracking
-
-NOTE:
-Background migrations with job tracking enabled must call `mark_all_as_succeeded` for its batch, even if no work is needed to be done.
-
-`queue_background_migration_jobs_by_range_at_intervals` can create records for each job that is scheduled to run.
-You can enable this behavior by passing `track_jobs: true`. Each record starts with a `pending` status. Make sure that your worker updates the job status to `succeeded` by calling `Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded` in the `perform` method of your background migration.
-
-```ruby
-# Background migration code
-
-def perform(start_id, end_id)
- # do work here
-
- mark_job_as_succeeded(start_id, end_id)
-end
-
-private
-
-# Make sure that the arguments passed here match those passed to the background
-# migration
-def mark_job_as_succeeded(*arguments)
- Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded(
- self.class.name.demodulize,
- arguments
- )
-end
-```
-
-```ruby
-# Post deployment migration
-MIGRATION = 'YourBackgroundMigrationName'
-DELAY_INTERVAL = 2.minutes.to_i # can be different
-BATCH_SIZE = 10_000 # can be different
-
-disable_ddl_transaction!
-
-def up
- queue_background_migration_jobs_by_range_at_intervals(
- define_batchable_model('name_of_the_table_backing_the_model'),
- MIGRATION,
- DELAY_INTERVAL,
- batch_size: BATCH_SIZE,
- track_jobs: true
- )
-end
-
-def down
- # no-op
-end
-```
-
-See [`lib/gitlab/background_migration/drop_invalid_vulnerabilities.rb`](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/background_migration/drop_invalid_vulnerabilities.rb) for a full example.
-
-#### Rescheduling pending jobs
-
-You can reschedule pending migrations from the `background_migration_jobs` table by creating a post-deployment migration and calling `requeue_background_migration_jobs_by_range_at_intervals` with the migration name and delay interval.
-
-```ruby
-# Post deployment migration
-MIGRATION = 'YourBackgroundMigrationName'
-DELAY_INTERVAL = 2.minutes
-
-disable_ddl_transaction!
-
-def up
- requeue_background_migration_jobs_by_range_at_intervals(MIGRATION, DELAY_INTERVAL)
-end
-
-def down
- # no-op
-end
-```
-
-See [`db/post_migrate/20210604070207_retry_backfill_traversal_ids.rb`](https://gitlab.com/gitlab-org/gitlab/blob/master/db/post_migrate/20210604070207_retry_backfill_traversal_ids.rb) for a full example.
-
-### Viewing failure error logs
-
-After running a background migration, if any jobs have failed, you can view the logs in [Kibana](https://log.gprd.gitlab.net/goto/5f06a57f768c6025e1c65aefb4075694).
-View the production Sidekiq log and filter for:
-
-- `json.class: BackgroundMigrationWorker`
-- `json.job_status: fail`
-- `json.meta.caller_id: <MyBackgroundMigrationSchedulingMigrationClassName>`
-- `json.args: <MyBackgroundMigrationClassName>`
-
-Looking at the `json.exception.class`, `json.exception.message`, `json.exception.backtrace`, and `json.exception.sql` values may be helpful in understanding why the jobs failed.
-
-Depending on when and how the failure occurred, you may find other helpful information by filtering with `json.class: <MyBackgroundMigrationClassName>`.
+<!-- This redirect file can be deleted after <2023-10-11>. -->
+<!-- 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/database/batched_background_migrations.md b/doc/development/database/batched_background_migrations.md
index 3e54a78757a..1bdd24afcad 100644
--- a/doc/development/database/batched_background_migrations.md
+++ b/doc/development/database/batched_background_migrations.md
@@ -39,10 +39,10 @@ Background migrations can help when:
- 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.
-- You should use the [generator](#generator) to create batched background migrations,
+- You should use the [generator](#generate-a-batched-background-migration) to create batched background migrations,
so that required files are created by default.
-## How it works
+## How batched background migrations work
Batched background migrations (BBM) are subclasses of
`Gitlab::BackgroundMigration::BatchedMigrationJob` that define a `perform` method.
@@ -201,66 +201,25 @@ 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
+## How to
-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
+### Generate a batched background migration
-# 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")
+The custom generator `batched_background_migration` scaffolds necessary files and
+accepts `table_name`, `column_name`, and `feature_category` as arguments. Usage:
-# bad
-ActiveRecord::Base.connection.execute("SELECT * FROM projects")
+```shell
+bundle exec rails g batched_background_migration my_batched_migration --table_name=<table-name> --column_name=<column-name> --feature_category=<feature-category>
```
-## Batched background migrations for EE-only features
-
-All the background migration classes for EE-only features should be present in GitLab FOSS.
-For this purpose, create an empty class for GitLab FOSS, and extend it for GitLab EE
-as explained in the guidelines for
-[implementing Enterprise Edition features](../ee_features.md#code-in-libgitlabbackground_migration).
+This command creates the following files:
-NOTE:
-Background migration classes for EE-only features that use job arguments should define them
-in the GitLab FOSS class. This is required to prevent job arguments validation from failing when
-migration is scheduled in GitLab FOSS context.
+- `db/post_migrate/20230214231008_queue_my_batched_migration.rb`
+- `spec/migrations/20230214231008_queue_my_batched_migration_spec.rb`
+- `lib/gitlab/background_migration/my_batched_migration.rb`
+- `spec/lib/gitlab/background_migration/my_batched_migration_spec.rb`
-## Queueing
+### Enqueue a batched background migration
Queueing a batched background migration should be done in a post-deployment
migration. Use this `queue_batched_background_migration` example, queueing the
@@ -278,63 +237,13 @@ queue_batched_background_migration(
NOTE:
This helper raises an error if the number of provided job arguments does not match
-the number of [job arguments](#job-arguments) defined in `JOB_CLASS_NAME`.
+the number of [job arguments](#use-job-arguments) defined in `JOB_CLASS_NAME`.
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
-delete_batched_background_migration(MIGRATION_NAME, TABLE_NAME, COLUMN, JOB_ARGUMENTS)
-```
-
-## 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.
-
-## Job arguments
+### Use job arguments
`BatchedMigrationJob` provides the `job_arguments` helper method for job classes to define the job arguments they need.
@@ -373,7 +282,7 @@ class CopyColumnUsingBackgroundMigrationJob < BatchedMigrationJob
end
```
-## Additional filters
+### Use filters
By default, when creating background jobs to perform the migration, batched background migrations
iterate over the full specified table. This iteration is done using the
@@ -450,21 +359,344 @@ NOTE:
When applying additional filters, it is important to ensure they are properly covered by an index to optimize `EachBatch` performance.
In the example above we need an index on `(type, id)` to support the filters. See [the `EachBatch` documentation for more information](iterating_tables_in_batches.md).
-## Generator
+### Access data for multiple databases
-The custom generator `batched_background_migration` scaffolds necessary files and
-accepts `table_name`, `column_name`, and `feature_category` as arguments. Usage:
+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.
-```shell
-bundle exec rails g batched_background_migration my_batched_migration --table_name=<table-name> --column_name=<column-name> --feature_category=<feature-category>
+```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
```
-This command creates these files:
+Similarly the usage of `ActiveRecord::Base.connection` is disallowed and needs to be
+replaced preferably with the usage of model connection.
-- `db/post_migrate/20230214231008_queue_my_batched_migration.rb`
-- `spec/migrations/20230214231008_queue_my_batched_migration_spec.rb`
-- `lib/gitlab/background_migration/my_batched_migration.rb`
-- `spec/lib/gitlab/background_migration/my_batched_migration_spec.rb`
+```ruby
+# good
+Project.connection.execute("SELECT * FROM projects")
+
+# acceptable
+ApplicationRecord.connection.execute("SELECT * FROM projects")
+
+# bad
+ActiveRecord::Base.connection.execute("SELECT * FROM projects")
+```
+
+### Re-queue batched background migrations
+
+A batched background migration might need to be re-run for one of several
+reasons:
+
+- The migration contains a bug ([example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/93546)).
+- The migration cleaned up data but the data became de-normalized again due to a
+ bypass in application logic ([example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/123002)).
+- The batch size of the original migration causes the migration to fail ([example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/121404)).
+
+To requeue a batched background migration, you must:
+
+- No-op the contents of the `#up` and `#down` methods of the
+ original migration file. Otherwise, the batched background migration is created,
+ deleted, then created again on systems that are upgrading multiple patch
+ releases at once.
+- Add a new post-deployment migration that re-runs the batched background
+ migration.
+- In the new post-deployment migration, delete the existing batched background
+ migration using the `delete_batched_background_migration` method at the start
+ of the `#up` method to ensure that any existing runs are cleaned up.
+- Update the `db/docs/batched_background_migration/*.yml` file from the original
+ migration to include information about the requeue.
+
+### Batch over non-distinct columns
+
+The default batching strategy provides an efficient way to iterate over primary key columns.
+However, if you need to iterate over columns where values are not unique, you must use a
+different batching strategy.
+
+The `LooseIndexScanBatchingStrategy` batching strategy uses a special version of [`EachBatch`](iterating_tables_in_batches.md#loose-index-scan-with-distinct_each_batch)
+to provide efficient and stable iteration over the distinct column values.
+
+This example shows a batched background migration where the `issues.project_id` column is used as
+the batching column.
+
+Database post-migration:
+
+```ruby
+class ProjectsWithIssuesMigration < Gitlab::Database::Migration[2.1]
+ MIGRATION = 'BatchProjectsWithIssues'
+ INTERVAL = 2.minutes
+ BATCH_SIZE = 5000
+ SUB_BATCH_SIZE = 500
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ disable_ddl_transaction!
+ def up
+ queue_batched_background_migration(
+ MIGRATION,
+ :issues,
+ :project_id,
+ job_interval: INTERVAL,
+ batch_size: BATCH_SIZE,
+ batch_class_name: 'LooseIndexScanBatchingStrategy', # Override the default batching strategy
+ sub_batch_size: SUB_BATCH_SIZE
+ )
+ end
+
+ def down
+ delete_batched_background_migration(MIGRATION, :issues, :project_id, [])
+ end
+end
+```
+
+Implementing the background migration class:
+
+```ruby
+module Gitlab
+ module BackgroundMigration
+ class BatchProjectsWithIssues < Gitlab::BackgroundMigration::BatchedMigrationJob
+ include Gitlab::Database::DynamicModelHelpers
+
+ operation_name :backfill_issues
+
+ def perform
+ distinct_each_batch do |batch|
+ project_ids = batch.pluck(batch_column)
+ # do something with the distinct project_ids
+ end
+ end
+ end
+ end
+end
+```
+
+NOTE:
+[Additional filters](#use-filters) defined with `scope_to` are ignored by `LooseIndexScanBatchingStrategy` and `distinct_each_batch`.
+
+### Calculate overall time estimation of a batched background migration
+
+It's possible to estimate how long a BBM takes to complete. GitLab already provides an estimation through the `db:gitlabcom-database-testing` pipeline.
+This estimation is built based on sampling production data in a test environment and represents the max time that the migration could take and, not necessarily,
+the actual time that the migration takes. In certain scenarios, estimations provided by the `db:gitlabcom-database-testing` pipeline may not be enough to
+calculate all the singularities around the records being migrated, making further calculations necessary. As it made necessary, the formula
+`interval * number of records / max batch size` can be used to determine an approximate estimation of how long the migration takes.
+Where `interval` and `max batch size` refer to options defined for the job, and the `total tuple count` is the number of records to be migrated.
+
+NOTE:
+Estimations may be affected by the [migration optimization mechanism](#migration-optimization).
+
+### Cleaning up a batched background migration
+
+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 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.
+
+Bumping 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.
+
+## Managing
+
+NOTE:
+BBM management takes place through `chatops` integration, which is limited to GitLab team members only.
+
+### List batched background migrations
+
+To list the batched background migrations in the system, run this command:
+
+`/chatops run batched_background_migrations list`
+
+This command supports the following options:
+
+- Database selection:
+ - `--database DATABASE_NAME`: Connects to the given database:
+ - `main`: Uses the main database (default).
+ - `ci`: Uses the CI database.
+- Environment selection:
+ - `--dev`: Uses the `dev` environment.
+ - `--staging`: Uses the `staging` environment.
+ - `--staging_ref`: Uses the `staging_ref` environment.
+ - `--production` : Uses the `production` environment (default).
+
+Output example:
+
+![List command](img/list_v15_4.png)
+
+NOTE:
+ChatOps returns 20 batched background migrations order by `created_at` (DESC).
+
+### Monitor the progress and status of a batched background migration
+
+To see the status and progress of a specific batched background migration, run this command:
+
+`/chatops run batched_background_migrations status MIGRATION_ID`
+
+This command supports the following options:
+
+- Database selection:
+ - `--database DATABASE_NAME`: Connects to the given database:
+ - `main`: Uses the main database (default)
+ - `ci`: Uses the CI database
+- Environment selection:
+ - `--dev`: Uses the `dev` environment.
+ - `--staging`: Uses the `staging` environment.
+ - `--staging_ref`: Uses the `staging_ref` environment.
+ - `--production` : Uses the `production` environment (default).
+
+Output example:
+
+![Status command](img/status_v15_4.png)
+
+`Progress` represents the percentage of the background migration that has been completed.
+
+Definitions of the batched background migration states:
+
+- **Active:** Either:
+ - Ready to be picked by the runner.
+ - Running batched jobs.
+- **Finalizing:** Running batched jobs.
+- **Failed:** Failed batched background migration.
+- **Finished:** Completed batched background migration.
+- **Paused:** Not visible to the runner.
+
+### Pause a batched background migration
+
+If you want to pause a batched background migration, you need to run the following command:
+
+`/chatops run batched_background_migrations pause MIGRATION_ID`
+
+This command supports the following options:
+
+- Database selection:
+ - `--database DATABASE_NAME`: Connects to the given database:
+ - `main`: Uses the main database (default).
+ - `ci`: Uses the CI database.
+- Environment selection:
+ - `--dev`: Uses the `dev` environment.
+ - `--staging`: Uses the `staging` environment.
+ - `--staging_ref`: Uses the `staging_ref` environment.
+ - `--production` : Uses the `production` environment (default).
+
+Output example:
+
+![Pause command](img/pause_v15_4.png)
+
+NOTE:
+You can pause only `active` batched background migrations.
+
+### Resume a batched background migration
+
+If you want to resume a batched background migration, you need to run the following command:
+
+`/chatops run batched_background_migrations resume MIGRATION_ID`
+
+This command supports the following options:
+
+- Database selection:
+ - `--database DATABASE_NAME`: Connects to the given database:
+ - `main`: Uses the main database (default).
+ - `ci`: Uses the CI database.
+- Environment selection:
+ - `--dev`: Uses the `dev` environment.
+ - `--staging`: Uses the `staging` environment.
+ - `--staging_ref`: Uses the `staging_ref` environment.
+ - `--production` : Uses the `production` environment (default).
+
+Output example:
+
+![Resume command](img/resume_v15_4.png)
+
+NOTE:
+You can resume only `active` batched background migrations
+
+### Enable or disable background migrations
+
+In extremely limited circumstances, a GitLab administrator can disable either or
+both of these [feature flags](../../administration/feature_flags.md):
+
+- `execute_background_migrations`
+- `execute_batched_migrations_on_schedule`
+
+These flags are enabled by default. Disable them only as a last resort
+to limit database operations in special circumstances, like database host maintenance.
+
+WARNING:
+Do not disable either of these flags unless you fully understand the ramifications. If you disable
+the `execute_background_migrations` or `execute_batched_migrations_on_schedule` feature flag,
+GitLab upgrades might fail and data loss might occur.
+
+## Batched background migrations for EE-only features
+
+All the background migration classes for EE-only features should be present in GitLab FOSS.
+For this purpose, create an empty class for GitLab FOSS, and extend it for GitLab EE
+as explained in the guidelines for
+[implementing Enterprise Edition features](../ee_features.md#code-in-libgitlabbackground_migration).
+
+NOTE:
+Background migration classes for EE-only features that use job arguments should define them
+in the GitLab FOSS class. Definitions are required to prevent job arguments validation from failing when
+migration is scheduled in the GitLab FOSS context.
+
+You can use the [generator](#generate-a-batched-background-migration) to generate an EE-only migration scaffold by passing
+`--ee-only` flag when generating a new batched background migration.
+
+## Throttling batched migrations
+
+Because batched migrations are update-heavy and there were few incidents in the past because of the heavy load from migrations while the database was underperforming, a throttling mechanism exists to mitigate them.
+
+These database indicators are checked to throttle a migration. On getting a
+stop signal, the migration is paused for a set time (10 minutes):
+
+- WAL queue pending archival crossing a threshold.
+- Active autovacuum on the tables on which the migration works on.
+- Patroni apdex SLI dropping below the SLO.
+
+It's an ongoing effort to add more indicators to further enhance the
+database health check framework. For more details, see
+[epic 7594](https://gitlab.com/groups/gitlab-org/-/epics/7594).
## Example
@@ -636,71 +868,6 @@ background migration.
After the batched migration is completed, you can safely depend on the
data in `routes.namespace_id` being populated.
-### Batching over non-distinct columns
-
-The default batching strategy provides an efficient way to iterate over primary key columns.
-However, if you need to iterate over columns where values are not unique, you must use a
-different batching strategy.
-
-The `LooseIndexScanBatchingStrategy` batching strategy uses a special version of [`EachBatch`](iterating_tables_in_batches.md#loose-index-scan-with-distinct_each_batch)
-to provide efficient and stable iteration over the distinct column values.
-
-This example shows a batched background migration where the `issues.project_id` column is used as
-the batching column.
-
-Database post-migration:
-
-```ruby
-class ProjectsWithIssuesMigration < Gitlab::Database::Migration[2.1]
- MIGRATION = 'BatchProjectsWithIssues'
- INTERVAL = 2.minutes
- BATCH_SIZE = 5000
- SUB_BATCH_SIZE = 500
- restrict_gitlab_migration gitlab_schema: :gitlab_main
-
- disable_ddl_transaction!
- def up
- queue_batched_background_migration(
- MIGRATION,
- :issues,
- :project_id,
- job_interval: INTERVAL,
- batch_size: BATCH_SIZE,
- batch_class_name: 'LooseIndexScanBatchingStrategy', # Override the default batching strategy
- sub_batch_size: SUB_BATCH_SIZE
- )
- end
-
- def down
- delete_batched_background_migration(MIGRATION, :issues, :project_id, [])
- end
-end
-```
-
-Implementing the background migration class:
-
-```ruby
-module Gitlab
- module BackgroundMigration
- class BatchProjectsWithIssues < Gitlab::BackgroundMigration::BatchedMigrationJob
- include Gitlab::Database::DynamicModelHelpers
-
- operation_name :backfill_issues
-
- def perform
- distinct_each_batch do |batch|
- project_ids = batch.pluck(batch_column)
- # do something with the distinct project_ids
- end
- end
- end
- end
-end
-```
-
-NOTE:
-[Additional filters](#additional-filters) defined with `scope_to` are ignored by `LooseIndexScanBatchingStrategy` and `distinct_each_batch`.
-
## Testing
Writing tests is required for:
@@ -771,115 +938,6 @@ for more details.
The batched background migrations framework has ChatOps support. Using ChatOps, GitLab engineers can interact with the batched background migrations present in the system.
-#### List batched background migrations
-
-To list the batched background migrations in the system, run this command:
-
-`/chatops run batched_background_migrations list`
-
-This command supports the following options:
-
-- Database selection:
- - `--database DATABASE_NAME`: Connects to the given database:
- - `main`: Uses the main database (default).
- - `ci`: Uses the CI database.
-- Environment selection:
- - `--dev`: Uses the `dev` environment.
- - `--staging`: Uses the `staging` environment.
- - `--staging_ref`: Uses the `staging_ref` environment.
- - `--production` : Uses the `production` environment (default).
-
-Output example:
-
-![List command](img/list_v15_4.png)
-
-NOTE:
-ChatOps returns 20 batched background migrations order by `created_at` (DESC).
-
-#### Monitor the progress and status of a batched background migration
-
-To see the status and progress of a specific batched background migration, run this command:
-
-`/chatops run batched_background_migrations status MIGRATION_ID`
-
-This command supports the following options:
-
-- Database selection:
- - `--database DATABASE_NAME`: Connects to the given database:
- - `main`: Uses the main database (default)
- - `ci`: Uses the CI database
-- Environment selection:
- - `--dev`: Uses the `dev` environment.
- - `--staging`: Uses the `staging` environment.
- - `--staging_ref`: Uses the `staging_ref` environment.
- - `--production` : Uses the `production` environment (default).
-
-Output example:
-
-![Status command](img/status_v15_4.png)
-
-`Progress` represents the percentage of the background migration that has been completed.
-
-Definitions of the batched background migration states:
-
-- **Active:** Either:
- - Ready to be picked by the runner.
- - Running batched jobs.
-- **Finalizing:** Running batched jobs.
-- **Failed:** Failed batched background migration.
-- **Finished:** Completed batched background migration.
-- **Paused:** Not visible to the runner.
-
-#### Pause a batched background migration
-
-If you want to pause a batched background migration, you need to run the following command:
-
-`/chatops run batched_background_migrations pause MIGRATION_ID`
-
-This command supports the following options:
-
-- Database selection:
- - `--database DATABASE_NAME`: Connects to the given database:
- - `main`: Uses the main database (default).
- - `ci`: Uses the CI database.
-- Environment selection:
- - `--dev`: Uses the `dev` environment.
- - `--staging`: Uses the `staging` environment.
- - `--staging_ref`: Uses the `staging_ref` environment.
- - `--production` : Uses the `production` environment (default).
-
-Output example:
-
-![Pause command](img/pause_v15_4.png)
-
-NOTE:
-You can pause only `active` batched background migrations.
-
-#### Resume a batched background migration
-
-If you want to resume a batched background migration, you need to run the following command:
-
-`/chatops run batched_background_migrations resume MIGRATION_ID`
-
-This command supports the following options:
-
-- Database selection:
- - `--database DATABASE_NAME`: Connects to the given database:
- - `main`: Uses the main database (default).
- - `ci`: Uses the CI database.
-- Environment selection:
- - `--dev`: Uses the `dev` environment.
- - `--staging`: Uses the `staging` environment.
- - `--staging_ref`: Uses the `staging_ref` environment.
- - `--production` : Uses the `production` environment (default).
-
-Output example:
-
-![Resume command](img/resume_v15_4.png)
-
-NOTE:
-You can resume only `active` batched background migrations
-
### Viewing failure error logs
You can view failures in two ways:
@@ -1020,5 +1078,5 @@ creation.
## Legacy background migrations
-Batched background migrations replaced the [legacy background migrations framework](background_migrations.md).
+Batched background migrations replaced the legacy background migrations framework.
Check that documentation in reference to any changes involving that framework.
diff --git a/doc/development/database/database_reviewer_guidelines.md b/doc/development/database/database_reviewer_guidelines.md
index 933bbe9c060..c297c90918f 100644
--- a/doc/development/database/database_reviewer_guidelines.md
+++ b/doc/development/database/database_reviewer_guidelines.md
@@ -26,17 +26,23 @@ For more information on the database review process, check the [database review
## How to apply for becoming a database reviewer
-Team members are encouraged to self-identify as database domain experts, and add it to their profile YAML file:
+Team members are encouraged to self-identify as database domain experts, by adding it
+to your profile YAML file:
-```yaml
-projects:
- gitlab:
- - reviewer database
-```
+1. Make a merge request using the
+ [`Database reviewer` template](https://gitlab.com/gitlab-com/www-gitlab-com/-/blob/master/.gitlab/merge_request_templates/Database%20reviewer.md).
+1. Add your database expertise to your YAML file:
-Create the merge request [using the "Database reviewer" template](https://gitlab.com/gitlab-com/www-gitlab-com/-/blob/master/.gitlab/merge_request_templates/Database%20reviewer.md),
-adding your expertise your profile YAML file. Assign to a database maintainer or the
-[Database Team's Engineering Manager](https://about.gitlab.com/handbook/engineering/development/enablement/data_stores/database/).
+ ```yaml
+ projects:
+ gitlab:
+ - reviewer database
+ ```
+
+1. Create the merge request
+ [using the "Database reviewer" template](https://gitlab.com/gitlab-com/www-gitlab-com/-/blob/master/.gitlab/merge_request_templates/Database%20reviewer.md).
+1. Assign to a database maintainer or the
+ [Database Team's Engineering Manager](https://about.gitlab.com/handbook/engineering/development/enablement/data_stores/database/).
After the `team.yml` update is merged, the [Reviewer roulette](../code_review.md#reviewer-roulette)
may recommend you as a database reviewer.
@@ -75,21 +81,10 @@ topics and use cases. The most frequently required during database reviewing are
## How to apply to become a database maintainer
-Once a database reviewer feels confident on switching to a database maintainer,
-they can update their [team profile](https://gitlab.com/gitlab-com/www-gitlab-com/-/blob/master/data/team.yml)
-to a `trainee_maintainer database`:
-
-```yaml
-projects:
- gitlab:
- - trainee_maintainer database
-```
-
-The first step is to a create a [Trainee Database Maintainer Issue](https://gitlab.com/gitlab-com/www-gitlab-com/-/issues/new?issuable_template=trainee-database-maintainer).
-Use and follow the process described in the 'Trainee database maintainer' template.
+Database maintainership uses the same process as other projects for identifying maintainers.
+[Follow the general process documented here](https://about.gitlab.com/handbook/engineering/workflow/code-review/#how-to-become-a-project-maintainer).
-Note that [trainee maintainers](https://about.gitlab.com/handbook/engineering/workflow/code-review/#trainee-maintainer)
-are three times as likely to be picked by the [Danger bot](../dangerbot.md) as other reviewers.
+For database specific requirements, please see [`Project maintainer process for gitlab-database`](https://about.gitlab.com/handbook/engineering/workflow/code-review/#project-maintainer-process-for-gitlab-database)
## What to do if you feel overwhelmed
diff --git a/doc/development/database/efficient_in_operator_queries.md b/doc/development/database/efficient_in_operator_queries.md
index a770dfe6531..a0c71f49e2d 100644
--- a/doc/development/database/efficient_in_operator_queries.md
+++ b/doc/development/database/efficient_in_operator_queries.md
@@ -117,7 +117,7 @@ On average, we can say the following:
From the list, it's apparent that the number of `issues` records has
the largest impact on the performance.
-As per normal usage, we can say that the number of issue records grows
+As per typical usage, we can say that the number of issue records grows
at a faster rate than the `namespaces` and the `projects` records.
This problem affects most of our group-level features where records are listed
@@ -672,7 +672,7 @@ end
#### Ordering by `JOIN` columns
Ordering records by mixed columns where one or more columns are coming from `JOIN` tables
-works with limitations. It requires extra configuration (CTE). The trick is to use a
+works with limitations. It requires extra configuration via Common Table Expression (CTE). The trick is to use a
non-materialized CTE to act as a "fake" table which exposes all required columns.
NOTE:
diff --git a/doc/development/database/index.md b/doc/development/database/index.md
index f532e054849..1ee6aeaa213 100644
--- a/doc/development/database/index.md
+++ b/doc/development/database/index.md
@@ -8,6 +8,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
## Database Reviews
+- During the design phase of the feature you're working on, be mindful if you are adding any database-related changes. If you're adding or modifying a query, start looking at the `explain` plan early to avoid surprises late in the review phase.
+- If, at any time, you need help optimizing a query or understanding an `explain` plan, ask for assistance in `#database`.
- If you're creating a database MR for review, check out our [Database review guidelines](../database_review.md).
It provides an introduction on database-related changes, migrations, and complex SQL queries.
@@ -30,7 +32,6 @@ info: To determine the technical writer assigned to the Stage/Group associated w
- [Create a regular migration](../migration_style_guide.md#create-a-regular-schema-migration), including creating new models
- [Deleting migrations](deleting_migrations.md)
- [Different types of migrations](../migration_style_guide.md#choose-an-appropriate-migration-type)
-- [Legacy background migrations guidelines](background_migrations.md)
- [Migrations for multiple databases](migrations_for_multiple_databases.md)
- [Migrations style guide](../migration_style_guide.md) for creating safe SQL migrations
- [Partitioning tables](table_partitioning.md)
diff --git a/doc/development/database/insert_into_tables_in_batches.md b/doc/development/database/insert_into_tables_in_batches.md
index 78aa793f28b..547ca25b264 100644
--- a/doc/development/database/insert_into_tables_in_batches.md
+++ b/doc/development/database/insert_into_tables_in_batches.md
@@ -141,7 +141,7 @@ the key differences between these classes are listed in the table below.
| `insert_all!` | Attribute hashes | No | No | Yes | Yes |
To summarize, `BulkInsertSafe` moves bulk inserts closer to how ActiveRecord objects
-and inserts would normally behave. However, if all you need is to insert raw data in bulk, then
+and inserts would usually behave. However, if all you need is to insert raw data in bulk, then
`insert_all` is more efficient.
## Insert `has_many` associations in bulk
diff --git a/doc/development/database/keyset_pagination.md b/doc/development/database/keyset_pagination.md
index 42d7458b45a..ff8038ee24c 100644
--- a/doc/development/database/keyset_pagination.md
+++ b/doc/development/database/keyset_pagination.md
@@ -159,7 +159,7 @@ configuration is necessary:
- Function-based ordering.
- Ordering with a custom tie-breaker column, like `iid`.
-These order objects can be defined in the model classes as normal ActiveRecord scopes, there is no special behavior that prevents using these scopes elsewhere (Kaminari, background jobs).
+These order objects can be defined in the model classes as standard ActiveRecord scopes, there is no special behavior that prevents using these scopes elsewhere (Kaminari, background jobs).
### `NULLS LAST` ordering
diff --git a/doc/development/database/load_balancing.md b/doc/development/database/load_balancing.md
index f623ad1eab0..f6e145ac7f5 100644
--- a/doc/development/database/load_balancing.md
+++ b/doc/development/database/load_balancing.md
@@ -21,7 +21,7 @@ is implemented in GitLab Rails and Sidekiq.
## Components
-F few Ruby classes are involved in the load balancing process. All of them are
+A few Ruby classes are involved in the load balancing process. All of them are
in the namespace `Gitlab::Database::LoadBalancing`:
1. `Host`
diff --git a/doc/development/database/loose_foreign_keys.md b/doc/development/database/loose_foreign_keys.md
index 91a22d8c26b..fd380bee385 100644
--- a/doc/development/database/loose_foreign_keys.md
+++ b/doc/development/database/loose_foreign_keys.md
@@ -370,7 +370,7 @@ end
```
This endpoint still works when the parent `Project` model is deleted. This can be considered a
-a data leak which should not happen under normal circumstances:
+a data leak which should not happen under typical circumstances:
```ruby
def show
@@ -723,7 +723,7 @@ timeout or a worker crash, the next job continues the processing.
### Accumulation of deleted records
There can be cases where the workers need to process an unusually large amount of data. This can
-happen under normal usage, for example when a large project or group is deleted. In this scenario,
+happen under typical usage, for example when a large project or group is deleted. In this scenario,
there can be several million rows to be deleted or nullified. Due to the limits enforced by the
worker, processing this data takes some time.
diff --git a/doc/development/database/migrations_for_multiple_databases.md b/doc/development/database/migrations_for_multiple_databases.md
index b903c56651d..ae9348a2090 100644
--- a/doc/development/database/migrations_for_multiple_databases.md
+++ b/doc/development/database/migrations_for_multiple_databases.md
@@ -32,8 +32,8 @@ Migrations cannot mix **DDL** and **DML** changes as the application requires th
The DDL migrations are all migrations that:
1. Create or drop a table (for example, `create_table`).
-1. Add or remove an index (for example, `add_index`, `add_index_concurrently`).
-1. Add or remove a foreign key (for example `add_foreign_key`, `add_foreign_key_concurrently`).
+1. Add or remove an index (for example, `add_index`, `add_concurrent_index`).
+1. Add or remove a foreign key (for example `add_foreign_key`, `add_concurrent_foreign_key`).
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`).
diff --git a/doc/development/database/multiple_databases.md b/doc/development/database/multiple_databases.md
index 6adfdc90cf2..7c6b94144b4 100644
--- a/doc/development/database/multiple_databases.md
+++ b/doc/development/database/multiple_databases.md
@@ -26,8 +26,9 @@ Each table of GitLab needs to have a `gitlab_schema` assigned:
- `gitlab_main`: describes all tables that are being stored in the `main:` database (for example, like `projects`, `users`).
- `gitlab_ci`: describes all CI tables that are being stored in the `ci:` database (for example, `ci_pipelines`, `ci_builds`).
- `gitlab_geo`: describes all Geo tables that are being stored in the `geo:` database (for example, like `project_registry`, `secondary_usage_data`).
-- `gitlab_shared`: describe all application tables that contain data across all decomposed databases (for example, `loose_foreign_keys_deleted_records`) for models that inherit from `Gitlab::Database::SharedModel`.
-- `gitlab_internal`: describe all internal tables of Rails and PostgreSQL (for example, `ar_internal_metadata`, `schema_migrations`, `pg_*`).
+- `gitlab_shared`: describes all application tables that contain data across all decomposed databases (for example, `loose_foreign_keys_deleted_records`) for models that inherit from `Gitlab::Database::SharedModel`.
+- `gitlab_internal`: describes all internal tables of Rails and PostgreSQL (for example, `ar_internal_metadata`, `schema_migrations`, `pg_*`).
+- `gitlab_pm`: describes all tables that store `package_metadata` (it is an alias for `gitlab_main`).
- `...`: more schemas to be introduced with additional decomposed databases
The usage of schema enforces the base class to be used:
@@ -36,6 +37,7 @@ The usage of schema enforces the base class to be used:
- `Ci::ApplicationRecord` for `gitlab_ci`
- `Geo::TrackingBase` for `gitlab_geo`
- `Gitlab::Database::SharedModel` for `gitlab_shared`
+- `PackageMetadata::ApplicationRecord` for `gitlab_pm`
### The impact of `gitlab_schema`
@@ -70,6 +72,10 @@ all decomposed databases.
`gitlab_internal` describes Rails-defined tables (like `schema_migrations` or `ar_internal_metadata`), as well as internal PostgreSQL tables (for example, `pg_attribute`). Its primary purpose is to [support other databases](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85842#note_943453682), like Geo, that
might be missing some of those application-defined `gitlab_shared` tables (like `loose_foreign_keys_deleted_records`), but are valid Rails databases.
+### The special purpose of `gitlab_pm`
+
+`gitlab_pm` stores package metadata describing public repositories. This data is used for the License Compliance and Dependency Scanning product categories and is maintained by the [Composition Analysis Group](https://about.gitlab.com/handbook/engineering/development/sec/secure/composition-analysis). It is an alias for `gitlab_main` intended to make it easier to route to a different database in the future.
+
## Migrations
Read [Migrations for Multiple Databases](migrations_for_multiple_databases.md).
@@ -598,6 +604,13 @@ to limit the modes where tests can run, and skip them on any other modes.
| `skip_if_multiple_databases_are_setup(:ci)` | Only on **single-db** |
| `skip_if_multiple_databases_not_setup(:ci)` | On **single-db-ci-connection** and **multiple databases** |
+## Testing for multiple databases, including main_clusterwide
+
+By default, we do not setup the `main_clusterwide` connection in CI pipelines. However, if you add the label `~"pipeline:run-clusterwide-db"`, the pipelines will run with 3 connections, `main`, `ci` and `main_clusterwide`.
+
+NOTE:
+This setup is not completely ready yet, and running pipelines in the setup may fail some jobs. As of July 2023, this is only used by **group::tenant scale** to test out changes while building [Cells](../../architecture/blueprints/cells/index.md).
+
## Locking writes on the tables that don't belong to the database schemas
When the CI database is promoted and the two databases are fully split,
diff --git a/doc/development/database/not_null_constraints.md b/doc/development/database/not_null_constraints.md
index 77fa23bbb19..2b10e440799 100644
--- a/doc/development/database/not_null_constraints.md
+++ b/doc/development/database/not_null_constraints.md
@@ -202,7 +202,7 @@ end
If you have to clean up a nullable column for a [high-traffic table](../migration_style_guide.md#high-traffic-tables)
(for example, the `artifacts` in `ci_builds`), your background migration goes on for a while and
-it needs an additional [batched background migration cleaning up](batched_background_migrations.md#cleaning-up)
+it needs an additional [batched background migration cleaning up](batched_background_migrations.md#cleaning-up-a-batched-background-migration)
in the release after adding the data migration.
In that rare case you need 3 releases end-to-end:
diff --git a/doc/development/database/pagination_guidelines.md b/doc/development/database/pagination_guidelines.md
index 04a2a8cdf9c..d6550d0a515 100644
--- a/doc/development/database/pagination_guidelines.md
+++ b/doc/development/database/pagination_guidelines.md
@@ -214,7 +214,7 @@ Limit (cost=137878.89..137881.65 rows=20 width=1309) (actual time=5523.588..552
(8 rows)
```
-We can argue that a normal user does not visit these pages, however, API users could easily navigate to very high page numbers (scraping, collecting data).
+We can argue that a typical user does not visit these pages, however, API users could easily navigate to very high page numbers (scraping, collecting data).
### Keyset pagination
diff --git a/doc/development/database/post_deployment_migrations.md b/doc/development/database/post_deployment_migrations.md
index 0d0047531f9..8ee9a4ae099 100644
--- a/doc/development/database/post_deployment_migrations.md
+++ b/doc/development/database/post_deployment_migrations.md
@@ -33,7 +33,7 @@ release managers through the
Say you're using Chef for deploying new versions of GitLab and you'd like to run
post deployment migrations after deploying a new version. Let's assume you
-normally use the command `chef-client` to do so. To make use of this feature
+usually use the command `chef-client` to do so. To make use of this feature
you'd have to run this command as follows:
```shell
@@ -63,7 +63,7 @@ behave exactly like regular Rails migrations.
Post deployment migrations can be used to perform migrations that mutate state
that an existing version of GitLab depends on. For example, say you want to
remove a column from a table. This requires downtime as a GitLab instance
-depends on this column being present while it's running. Normally you'd follow
+depends on this column being present while it's running. Usually you'd follow
these steps in such a case:
1. Stop the GitLab instance
diff --git a/doc/development/database/required_stops.md b/doc/development/database/required_stops.md
index e4f66f4424f..361a0495545 100644
--- a/doc/development/database/required_stops.md
+++ b/doc/development/database/required_stops.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Adding required stops
-Required stops should only be added when it is deemed absolutely necessary, due to their
+[Required stops](../../update/index.md#upgrade-paths) should only be added when it is deemed absolutely necessary, because of their
disruptive effect on customers. Before adding a required stop, consider if any
alternative approaches exist to avoid a required stop. Sometimes a required
stop is unavoidable. In those cases, follow the instructions below.
@@ -95,3 +95,9 @@ is identified after release, the following steps must still be completed:
1. Update `Gitlab::Database::MIN_SCHEMA_GITLAB_VERSION` in `lib/gitlab/database.rb` to the
new required stop versions. Do not change `Gitlab::Database::MIN_SCHEMA_VERSION`.
+1. In the `charts` project, update the
+ [upgrade check hook](https://gitlab.com/gitlab-org/charts/gitlab/-/blame/master/templates/_runcheck.tpl#L32)
+ to the required stop version.
+1. In the `omnibus-gitlab` project, update the
+ [pre-install version check](https://gitlab.com/gitlab-org/omnibus-gitlab/-/blob/master/config/templates/package-scripts/preinst.erb#L43)
+ to the required stop version.
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 5cd325bfa56..54bdeaa7b28 100644
--- a/doc/development/database/strings_and_the_text_data_type.md
+++ b/doc/development/database/strings_and_the_text_data_type.md
@@ -308,7 +308,7 @@ end
If you have to clean up a text column for a really [large table](https://gitlab.com/gitlab-org/gitlab/-/blob/master/rubocop/rubocop-migrations.yml#L3)
(for example, the `artifacts` in `ci_builds`), your background migration goes on for a while and
-it needs an additional [batched background migration cleaning up](batched_background_migrations.md#cleaning-up)
+it needs an additional [batched background migration cleaning up](batched_background_migrations.md#cleaning-up-a-batched-background-migration)
in the release after adding the data migration.
In that rare case you need 3 releases end-to-end:
diff --git a/doc/development/database/table_partitioning.md b/doc/development/database/table_partitioning.md
index 88b2ccbc6a2..8477dd180a6 100644
--- a/doc/development/database/table_partitioning.md
+++ b/doc/development/database/table_partitioning.md
@@ -256,7 +256,7 @@ class BackfillPartitionAuditEvents < Gitlab::Database::Migration[2.1]
end
```
-This step [queues a batched background migration](batched_background_migrations.md#queueing) internally with BATCH_SIZE and SUB_BATCH_SIZE as `50,000` and `2,500`. Refer [Batched Background migrations guide](batched_background_migrations.md) for more details.
+This step [queues a batched background migration](batched_background_migrations.md#enqueue-a-batched-background-migration) internally with BATCH_SIZE and SUB_BATCH_SIZE as `50,000` and `2,500`. Refer [Batched Background migrations guide](batched_background_migrations.md) for more details.
### Step 3: Post-backfill cleanup (Release N+1)
diff --git a/doc/development/database_review.md b/doc/development/database_review.md
index 76e9add215b..42021a5ae95 100644
--- a/doc/development/database_review.md
+++ b/doc/development/database_review.md
@@ -151,9 +151,7 @@ Include in the MR description:
- Write the raw SQL in the MR description. Preferably formatted
nicely with [pgFormatter](https://sqlformat.darold.net) or
<https://paste.depesz.com> and using regular quotes
-<!-- vale gitlab.NonStandardQuotes = NO -->
- (for example, `"projects"."id"`) and avoiding smart quotes (for example, `“projectsâ€.“idâ€`).
-<!-- vale gitlab.NonStandardQuotes = YES -->
+ (for example, `"projects"."id"`) and avoiding smart quotes (for example, `"projects"."id"`).
- In case of queries generated dynamically by using parameters, there should be one raw SQL query for each variation.
For example, a finder for issues that may take as a parameter an optional filter on projects,
@@ -244,7 +242,7 @@ Include in the MR description:
- Manually trigger the [database testing](database/database_migration_pipeline.md) job (`db:gitlabcom-database-testing`) in the `test` stage.
- If a single `update` is below than `1s` the query can be placed
directly in a regular migration (inside `db/migrate`).
- - Background migrations are normally used, but not limited to:
+ - Background migrations are usually used, but not limited to:
- Migrating data in larger tables.
- Making numerous SQL queries per record in a dataset.
- Review queries (for example, make sure batch sizes are fine)
diff --git a/doc/development/deprecation_guidelines/index.md b/doc/development/deprecation_guidelines/index.md
index e81bed07da9..af89da5ec65 100644
--- a/doc/development/deprecation_guidelines/index.md
+++ b/doc/development/deprecation_guidelines/index.md
@@ -31,8 +31,9 @@ However, at GitLab, we [give agency](https://about.gitlab.com/handbook/values/#g
## When can a feature be removed/changed?
-Generally, feature or configuration can be removed/changed only on major release.
-It also should be [deprecated in advance](https://about.gitlab.com/handbook/marketing/blog/release-posts/#deprecations).
+Features or configuration can only be removed/changed in a major release.
+
+They must be [deprecated in advance](https://about.gitlab.com/handbook/marketing/blog/release-posts/#deprecations).
For API removals, see the [GraphQL](../../api/graphql/index.md#deprecation-and-removal-process) and [GitLab API](../documentation/restful_api_styleguide.md#deprecations) guidelines.
@@ -40,54 +41,64 @@ For configuration removals, see the [Omnibus deprecation policy](../../administr
For versioning and upgrade details, see our [Release and Maintenance policy](../../policy/maintenance.md).
-## Update the deprecations and removals documentation pages
+## Requesting a breaking change in a minor release
-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).
+GitLab self-managed packages are semantically versioned and follow our [maintenance policy](../../policy/maintenance.md). This process applies to features and APIs that are generally available, not beta or experimental.
-To update the deprecations and removals pages when an entry is added,
-edited, or removed:
+This maintenance policy is in place to allow our customers to prepare for disruptive changes by establishing a clear and predictable pattern that is widely used in the software industry. For many of our customers, GitLab is a business-critical application and surprising changes can cause damages and erode trust.
-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:
+Introducing breaking changes in minor releases is against policy because it can disrupt our customers and introduces an element of randomness that requires customers to check for breaking changes every minor release to ensure that their business is not impacted. This does not align with our goal [to make it as easy as possible for customers to do business with GitLab](https://about.gitlab.com/company/yearlies/#fy24-yearlies) and is strongly discouraged.
- - For deprecations:
+Breaking changes are deployed to GitLab.com after they are merged into the codebase and do not respect the minor release cadence. Special care must be taken to inform the [Customer Support](https://about.gitlab.com/handbook/support/) and [Customer Success](https://about.gitlab.com/handbook/customer-success/) teams so that we can offer fast resolution to any customers that may be impacted by unexpected breaking changes.
- ```shell
- bin/rake gitlab:docs:compile_deprecations
- ```
+Breaking our own policies, in particular shipping breaking changes in minor releases, is only reserved for situations in which GitLab establishes that delaying a breaking change would overall have a significantly more negative impact to customers than shipping it in a minor release. The most important lens for evaluating if an exception is granted is customer results.
- - For removals:
+Introducing a breaking change in a minor release requires a PM and EM to follow the process below to request an exception:
- ```shell
- bin/rake gitlab:docs:compile_removals
- ```
+1. Open a new issue in the [product issue tracker using the Breaking Change Exception template](https://gitlab.com/gitlab-com/Product/-/issues/new?issuable_template=Breaking-Change-Exception)
+1. Title should follow the format `Breaking change exception: Description`
+1. Provide an impact assessment for the breaking change
+ 1. How many customers are impacted?
+ 1. Can we get the same outcome without a breaking-change? (i.e. no removal)
+ 1. Can the breaking-change wait till the next major release, or the next scheduled upgrade stop, for example [Database scenarios](../database/required_stops.md))?
+ 1. What is the alternative for customers to do the same job the change will break?
+ 1. How difficult is it for customers to migrate to the alternative? Is there a migration plan?
+1. Provide a communication plan and establish a clear timeline, including the targeted minor release.
+1. Notify Support and Customer Success so they can share information with relevant customers.
+1. Obtain approval from the VP of Development, VP of Product Management, and VP of Customer Support for this area
+1. Obtain approval from the CPO and CTO
-1. If needed, you can verify the docs are up to date with:
+## Update the deprecations and removals documentation
- - For deprecations:
+The [deprecations and removals](../../update/deprecations.md)
+documentation is generated from the YAML files located in
+[`gitlab/data/deprecations`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/data/deprecations).
- ```shell
- bin/rake gitlab:docs:check_deprecations
- ```
+To update the deprecations and removals page when a YAML file 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 [`data/deprecations`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/data/deprecations).
+1. Compile the deprecations and removals documentation:
- - For removals:
+ ```shell
+ bin/rake gitlab:docs:compile_deprecations
+ ```
+
+1. If needed, you can verify the docs are up to date with:
- ```shell
- bin/rake gitlab:docs:check_removals
- ```
+ ```shell
+ bin/rake gitlab:docs:check_deprecations
+ ```
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.
+1. Create a merge request using the [Deprecations and Removals](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/merge_request_templates/Deprecations.md)
+ template.
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>
+- <https://about.gitlab.com/handbook/marketing/blog/release-posts/#update-the-deprecations-and-removals-page>
## Update the related documentation
diff --git a/doc/development/development_processes.md b/doc/development/development_processes.md
index c5d60d18419..4ce9df8d7da 100644
--- a/doc/development/development_processes.md
+++ b/doc/development/development_processes.md
@@ -22,6 +22,7 @@ Must-reads:
Complementary reads:
+- [Avoiding required stops](avoiding_required_stops.md)
- [Contribute to GitLab](contributing/index.md)
- [Security process for developers](https://gitlab.com/gitlab-org/release/docs/blob/master/general/security/developer.md#security-releases-critical-non-critical-as-a-developer)
- [Patch release process for developers](https://gitlab.com/gitlab-org/release/docs/blob/master/general/patch/process.md#process-for-developers)
diff --git a/doc/development/distributed_tracing.md b/doc/development/distributed_tracing.md
index 823a71eb130..da6af8b95ef 100644
--- a/doc/development/distributed_tracing.md
+++ b/doc/development/distributed_tracing.md
@@ -40,7 +40,7 @@ better understand the end-to-end path of a request through the system. When a re
process boundaries, the correlation ID is injected into the outgoing request. This enables
the propagation of the correlation ID to each downstream subsystem.
-Correlation IDs are normally generated in the Rails application in response to
+Correlation IDs are usually generated in the Rails application in response to
certain web requests. Some user facing systems don't generate correlation IDs in
response to user requests (for example, Git pushes over SSH).
@@ -139,8 +139,8 @@ This can be shown by typing `p` `b` in the browser window.
Once the performance bar is enabled, select **Trace** in the performance bar to go to
the Jaeger UI.
-The Jaeger search UI returns a query for the `Correlation-ID` of the current request. Normally,
-this search should return a single trace result. Selecting this result shows the detail of the
+The Jaeger search UI returns a query for the `Correlation-ID` of the current request.
+This search should return a single trace result. Selecting this result shows the detail of the
trace in a hierarchical time-line.
![Jaeger Search UI](img/distributed_tracing_jaeger_ui.png)
diff --git a/doc/development/documentation/alpha_beta.md b/doc/development/documentation/alpha_beta.md
index a6f756f93ae..61f07e79e12 100644
--- a/doc/development/documentation/alpha_beta.md
+++ b/doc/development/documentation/alpha_beta.md
@@ -29,7 +29,7 @@ For example:
FLAG:
On self-managed GitLab, by default this feature is not available.
-To make it available, ask an administrator to enable the feature flag named `example_flag`.
+To make it available, an administrator can enable the feature flag named `example_flag`.
On GitLab.com, this feature is not available. This feature is not ready for production use.
Use this great new feature when you need to do this new thing.
diff --git a/doc/development/documentation/contribute.md b/doc/development/documentation/contribute.md
index d3b7d9a4d93..b6573665f8d 100644
--- a/doc/development/documentation/contribute.md
+++ b/doc/development/documentation/contribute.md
@@ -54,7 +54,7 @@ When you are ready to update the documentation:
1. In the **Commit message** text box, enter a commit message.
Use 3-5 words, start with a capital letter, and do not end with a period.
1. Select **Commit changes**.
- 1. On the left sidebar, select **Merge requests**.
+ 1. On the left sidebar, select **Code > Merge requests**.
1. Select **New merge request**.
1. For the source branch, select your fork and branch. If you did not create a branch, select `master`.
For the target branch, select the [GitLab repository](https://gitlab.com/gitlab-org/gitlab) `master` branch.
diff --git a/doc/development/documentation/feature_flags.md b/doc/development/documentation/feature_flags.md
index 5cee300481b..a08052bf0e4 100644
--- a/doc/development/documentation/feature_flags.md
+++ b/doc/development/documentation/feature_flags.md
@@ -72,7 +72,7 @@ FLAG:
A `FLAG` note renders on the GitLab documentation site as:
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 `example_flag`.
+On self-managed GitLab, by default this feature is not available. To make it available, an administrator can [enable the feature flag](../../administration/feature_flags.md) named `example_flag`.
On GitLab.com, this feature is not available.
This feature is not ready for production use.
@@ -80,15 +80,15 @@ This feature is not ready for production use.
| If the feature is... | Use this text |
|--------------------------|---------------|
-| 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`.`` |
-| Unavailable, per-project | ``On self-managed GitLab, by default this feature is not available. To make it available per project or for your entire instance, ask an administrator to [enable the feature flag](<path to>/administration/feature_flags.md) named `flag_name`.`` |
-| Available, per-user | ``On self-managed GitLab, by default this feature is available. To hide the feature per user, ask an administrator to [disable the feature flag](<path to>/administration/feature_flags.md) named `flag_name`.`` |
-| Unavailable, per-user | ``On self-managed GitLab, by default this feature is not available. To make it available per user, ask an administrator to [enable the feature flag](<path to>/administration/feature_flags.md) named `flag_name`.`` |
+| Available | ``On self-managed GitLab, by default this feature is available. To hide the feature, an administrator can [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, an administrator can [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, an administrator can [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, an administrator can [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, an administrator can [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, an administrator can [disable the feature flag](<path to>/administration/feature_flags.md) named `flag_name`.`` |
+| Unavailable, per-project | ``On self-managed GitLab, by default this feature is not available. To make it available per project or for your entire instance, an administrator can [enable the feature flag](<path to>/administration/feature_flags.md) named `flag_name`.`` |
+| Available, per-user | ``On self-managed GitLab, by default this feature is available. To hide the feature per user, an administrator can [disable the feature flag](<path to>/administration/feature_flags.md) named `flag_name`.`` |
+| Unavailable, per-user | ``On self-managed GitLab, by default this feature is not available. To make it available per user, an administrator can [enable the feature flag](<path to>/administration/feature_flags.md) named `flag_name`.`` |
### GitLab.com availability information
@@ -113,7 +113,7 @@ The following examples show the progression of a feature flag.
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 `forti_token_cloud`.
+an administrator can [enable the feature flag](../administration/feature_flags.md) named `forti_token_cloud`.
The feature is not ready for production use.
```
@@ -125,7 +125,7 @@ When the feature is enabled in production, you can update the version history:
FLAG:
On self-managed GitLab, by default this feature is available. To hide the feature per user,
-ask an administrator to [disable the feature flag](../administration/feature_flags.md) named `forti_token_cloud`.
+an administrator can [disable the feature flag](../administration/feature_flags.md) named `forti_token_cloud`.
```
And, when the feature is done and fully available to all users:
diff --git a/doc/development/documentation/index.md b/doc/development/documentation/index.md
index 761dde839c1..3f26a5a7f4e 100644
--- a/doc/development/documentation/index.md
+++ b/doc/development/documentation/index.md
@@ -223,7 +223,7 @@ merge it as early as possible.
### Linking to `/help`
When you're building a new feature, you may need to link to the documentation
-from the GitLab application. This is normally done in files inside the
+from the GitLab application. This is usually done in files inside the
`app/views/` directory, with the help of the `help_page_path` helper method.
The `help_page_path` contains the path to the document you want to link to,
diff --git a/doc/development/documentation/restful_api_styleguide.md b/doc/development/documentation/restful_api_styleguide.md
index c39c7c02108..a5d565ffa79 100644
--- a/doc/development/documentation/restful_api_styleguide.md
+++ b/doc/development/documentation/restful_api_styleguide.md
@@ -63,7 +63,7 @@ METHOD /endpoint
Supported attributes:
| Attribute | Type | Required | Description |
-|:-------------------------|:---------|:---------|:----------------------|
+|--------------------------|----------|----------|-----------------------|
| `attribute` | datatype | Yes | Detailed description. |
| `attribute` **(<tier>)** | datatype | No | Detailed description. |
| `attribute` | datatype | No | Detailed description. |
@@ -73,7 +73,7 @@ If successful, returns [`<status_code>`](rest/index.md#status-codes) and the fol
response attributes:
| Attribute | Type | Description |
-|:-------------------------|:---------|:----------------------|
+|--------------------------|----------|-----------------------|
| `attribute` | datatype | Detailed description. |
| `attribute` **(<tier>)** | datatype | Detailed description. |
@@ -127,8 +127,8 @@ To deprecate an attribute:
1. Add inline deprecation text to the description.
```markdown
- | Attribute | Type | Required | Description |
- |:--------------|:-------|:---------|:----------------------------------------------------------------------------------------------------------------------------------------------------|
+ | Attribute | Type | Required | Description |
+ |---------------|--------|----------|-------------|
| `widget_name` | string | No | [Deprecated](<link-to-issue>) in GitLab 14.7 and is planned for removal in 15.4. Use `widget_id` instead. The name of the widget. |
```
@@ -144,7 +144,7 @@ Sort the table by required attributes first, then alphabetically.
```markdown
| Attribute | Type | Required | Description |
-|:-----------------------------|:--------------|:---------|:----------------------------------------------------|
+|------------------------------|---------------|----------|-----------------------------------------------------|
| `title` | string | Yes | Title of the issue. |
| `assignee_ids` **(PREMIUM)** | integer array | No | IDs of the users to assign the issue to. |
| `confidential` | boolean | No | Sets the issue to confidential. Default is `false`. |
@@ -153,7 +153,7 @@ Sort the table by required attributes first, then alphabetically.
Rendered example:
| Attribute | Type | Required | Description |
-|:-----------------------------|:--------------|:---------|:----------------------------------------------------|
+|------------------------------|---------------|----------|-----------------------------------------------------|
| `title` | string | Yes | Title of the issue. |
| `assignee_ids` **(PREMIUM)** | integer array | No | IDs of the users to assign the issue to. |
| `confidential` | boolean | No | Sets the issue to confidential. Default is `false`. |
@@ -180,7 +180,7 @@ 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. |
@@ -189,7 +189,7 @@ Sort the table alphabetically.
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. |
@@ -211,7 +211,7 @@ For information about writing attribute descriptions, see the [GraphQL API descr
commands apart into multiple lines.
| 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. |
diff --git a/doc/development/documentation/site_architecture/folder_structure.md b/doc/development/documentation/site_architecture/folder_structure.md
index 8a1d9b9fee3..1c9fc1441c4 100644
--- a/doc/development/documentation/site_architecture/folder_structure.md
+++ b/doc/development/documentation/site_architecture/folder_structure.md
@@ -17,7 +17,7 @@ API.
Our goal is to have a clear hierarchical structure with meaningful URLs like
`docs.gitlab.com/user/project/merge_requests/`. With this pattern, you can
immediately tell that you are navigating to user-related documentation about
-Project features; specifically about Merge Requests. Our site's paths match
+project features; specifically about merge requests. Our site's paths match
those of our repository, so the clear structure also makes documentation easier
to update.
@@ -26,13 +26,20 @@ Put files for a specific product area into the related folder:
| Directory | Contents |
|:----------------------|:------------------|
| `doc/user/` | Documentation for users. Anything that can be done in the GitLab user interface goes here, including usage of the `/admin` interface. |
-| `doc/administration/` | Documentation that requires the user to have access to the server where GitLab is installed. Administrator settings in the GitLab user interface are under `doc/user/admin_area/`. |
+| `doc/administration/` | Documentation that requires the user to have access to the server where GitLab is installed. Administrator settings in the GitLab user interface are under `doc/administration/`. |
| `doc/api/` | Documentation for the API. |
| `doc/development/` | Documentation related to the development of GitLab, whether contributing code or documentation. Related process and style guides should go here. |
| `doc/legal/` | Legal documents about contributing to GitLab. |
| `doc/install/` | Instructions for installing GitLab. |
| `doc/update/` | Instructions for updating GitLab. |
-| `doc/topics/` | Indexes per topic (`doc/topics/topic_name/index.md`): all resources for that topic. |
+| `doc/tutorials/` | Tutorials for how to use GitLab. |
+
+The following are legacy or deprecated folders.
+Do not add new content to these folders:
+
+- `/gitlab-basics/`
+- `/topics/`
+- `/university/`
## Work with directories and files
@@ -45,33 +52,18 @@ When working with directories and files:
1. When creating or renaming a file or directory and it has more than one word
in its name, use underscores (`_`) instead of spaces or dashes. For example,
proper naming would be `import_project/import_from_github.md`. This applies
- to both image files and Markdown files.
-1. For image files, do not exceed 100KB.
+ to both [image files](../styleguide/index.md#images) and Markdown files.
1. Do not upload video files to the product repositories.
[Link or embed videos](../styleguide/index.md#videos) instead.
-1. There are four main directories: `user`, `administration`, `api`, and
- `development`.
-1. The `doc/user/` directory has five main subdirectories: `project/`, `group/`,
- `profile/`, `dashboard/` and `admin_area/`.
+1. In the `doc/user/` directory:
- `doc/user/project/` should contain all project related documentation.
- `doc/user/group/` should contain all group related documentation.
- `doc/user/profile/` should contain all profile related documentation.
Every page you would navigate under `/profile` should have its own document,
for example, `account.md`, `applications.md`, or `emails.md`.
- - `doc/user/dashboard/` should contain all dashboard related documentation.
- - `doc/user/admin_area/` should contain all administrator-related
- documentation describing what can be achieved by accessing the GitLab
- administrator interface (not to be confused with `doc/administration` where
- server access is required).
- - Every category under `/admin/application_settings/` should have its
- own document located at `doc/user/admin_area/settings/`. For example,
- the **Visibility and Access Controls** category should have a document
- located at `doc/user/admin_area/settings/visibility_and_access_controls.md`.
-1. The `doc/topics/` directory holds topic-related technical content. Create
- `doc/topics/topic_name/subtopic_name/index.md` when subtopics become necessary.
- General user and administrator documentation should be placed accordingly.
-1. The `/university/` directory is *deprecated* and the majority of its documentation
- has been moved.
+1. In the `doc/administration/` directory: all administrator-related
+ documentation for administrators, including admin tasks done in both
+ the UI and on the backend servers.
If you're unsure where to place a document or a content addition, this shouldn't
stop you from authoring and contributing. Use your best judgment, and then ask
diff --git a/doc/development/documentation/styleguide/index.md b/doc/development/documentation/styleguide/index.md
index 6a56d824e35..bd4ded8ca11 100644
--- a/doc/development/documentation/styleguide/index.md
+++ b/doc/development/documentation/styleguide/index.md
@@ -133,7 +133,7 @@ the team is happy to review and improve upon your content. Review the
[Documentation guidelines](index.md) before you begin your first documentation MR.
Maintaining a knowledge base separate from the documentation would
-be against the documentation-first methodology, because the content would overlap with
+be against the documentation-first methodology because the content would overlap with
the documentation.
## Writing for localization
@@ -190,6 +190,8 @@ Use backticks for:
- [Code blocks](#code-blocks).
- Error messages.
+- Commands, parameters, and filenames.
+- Values. For example: "In the **Name** text box, type `test`."
### Markdown Rules
@@ -379,7 +381,7 @@ If you use an acronym, spell it out on first use on a page. You do not need to s
### Numbers
-When using numbers in text, spell out zero through nine, and use numbers for 10 and greater. For details, see the [Microsoft Style Guide](https://learn.microsoft.com/en-us/style-guide/numbers).
+For numbers in text, spell out zero through nine and use numbers for 10 and greater. For more information, see the [Microsoft Style Guide](https://learn.microsoft.com/en-us/style-guide/numbers).
## Text
@@ -698,6 +700,9 @@ page), use these phrases:
| No | `**{dotted-circle}** No` | **{dotted-circle}** No |
| Yes | `**{check-circle}** Yes` | **{check-circle}** Yes |
+Don't use `**{dotted-circle}**` and `**{check-circle}**` in API documentation.
+Instead, follow the [API topic template](../restful_api_styleguide.md#api-topic-template).
+
### Footnotes
To indicate a footnote, use the HTML tag `<sup>` with a number.
@@ -821,7 +826,7 @@ For example:
You can expand on this text by using phrases like
`For more information about this feature, see...`
-Do not to use the following constructions:
+Do not use the following constructions:
- `Learn more about...`
- `To read more...`.
@@ -878,7 +883,7 @@ If you must use one of these links:
- If the link is to a confidential issue, mention that the issue is visible only to GitLab team members, as in the first example.
- If the link requires a specific role or permissions, mention that information, as in the second example.
-- Put the link in backticks, so that it does not cause link checkers to fail.
+- Put the link in backticks so that it does not cause link checkers to fail.
Examples:
@@ -909,7 +914,7 @@ document to ensure it links to the most recent version of the file.
## Navigation
-When documenting how to navigate through the GitLab UI:
+When documenting how to navigate the GitLab UI:
- Always use location, then action.
- From the **Visibility** dropdown list (location), select **Public** (action).
@@ -968,13 +973,13 @@ To open either project or group settings:
To create a project:
```markdown
-1. On the left sidebar, at the top, select **Create new...** (**{plus}**) and **New project/repository**.
+1. On the left sidebar, at the top, select **Create new** (**{plus}**) and **New project/repository**.
```
To create a group:
```markdown
-1. On the left sidebar, at the top, select **Create new...** (**{plus}**) and **New group**.
+1. On the left sidebar, at the top, select **Create new** (**{plus}**) and **New group**.
```
To open the Admin Area:
@@ -1196,7 +1201,7 @@ include a visual representation to help readers understand it, you can:
an area of the screen.
- Create a short video of the interaction and link to it.
-## Emojis
+## Emoji
Don't use the Markdown emoji format, for example `:smile:`, for any purpose. Use
[GitLab SVG icons](#gitlab-svg-icons) instead.
@@ -1546,11 +1551,20 @@ When names change, it is more complicated to search or grep text that has line b
Tier badges are displayed as orange text next to a topic title. These badges link to the GitLab
pricing page.
-You must assign a tier badge:
+You should assign a tier badge:
- To all H1 topic titles, except the pages under `doc/development/*`.
- To topic titles that don't apply to the same tier as the H1.
+The H1 tier badge should be the badge that applies to the lowest tier for the features on the page.
+
+Some pages won't have a tier badge, because no obvious tier badge applies. For example:
+
+- Tutorials.
+- Pages that compare features from different tiers.
+
+#### Add a tier badge
+
To add a tier badge to a topic title, add the relevant tier badge
after the title text. For example:
diff --git a/doc/development/documentation/styleguide/word_list.md b/doc/development/documentation/styleguide/word_list.md
index 0bbd679abe5..84ab2ecc4e9 100644
--- a/doc/development/documentation/styleguide/word_list.md
+++ b/doc/development/documentation/styleguide/word_list.md
@@ -152,7 +152,7 @@ Instead of:
- This feature enables users to add files to their repository.
This phrasing is more active and is from the user perspective, rather than the person who implemented the feature.
-[View details in the Microsoft style guide](https://learn.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/a/allow-allows).
+For more information, see the [Microsoft Style Guide](https://learn.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/a/allow-allows).
## analytics
@@ -169,8 +169,8 @@ Instead of **and/or**, use **or** or rewrite the sentence to spell out both opti
## and so on
-Do not use **and so on**. Instead, be more specific. For details, see
-[the Microsoft style guide](https://learn.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/a/and-so-on).
+Do not use **and so on**. Instead, be more specific. For more information, see the
+[Microsoft Style Guide](https://learn.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/a/and-so-on).
## area
@@ -284,7 +284,7 @@ CI/CD is always uppercase. No need to spell it out on first use.
## CI/CD minutes
-Do not use **CI/CD minutes**. This term was renamed to [**units of compute**](#units-of-compute).
+Do not use **CI/CD minutes**. This term was renamed to [**compute minutes**](#compute-minutes).
## click
@@ -318,16 +318,30 @@ Use **compute** for the resources used by runners to run CI/CD jobs.
Related terms:
-- [**units of compute**](#units-of-compute): How compute usage is calculated. For example, `400 units of compute`.
-- [**compute quota**](../../../ci/pipelines/cicd_minutes.md): The limit of units of compute that a namespace can use each month.
-- **compute usage**: The number of units of compute that the namespace has used from the monthly quota.
+- [**compute minutes**](#compute-minutes): How compute usage is calculated. For example, `400 compute minutes`.
+- [**compute quota**](../../../ci/pipelines/cicd_minutes.md): The limit of compute minutes that a namespace can use each month.
+- **compute usage**: The number of compute minutes that the namespace has used from the monthly quota.
+
+## compute minutes
+
+Use **compute minutes** instead of these (or similar) terms:
+
+- **CI/CD minutes**
+- **CI minutes**
+- **pipeline minutes**
+- **CI pipeline minutes**
+- **pipeline minutes**
+
+For more information, see [epic 2150](https://gitlab.com/groups/gitlab-com/-/epics/2150).
## confirmation dialog
-Use **confirmation dialog** to describe the dialog box that asks you to confirm your action. For example:
+Use **confirmation dialog** to describe the dialog that asks you to confirm an action. For example:
- On the confirmation dialog, select **OK**.
+Do not use **confirmation box** or **confirmation dialog box**. See also [**dialog**](#dialog).
+
## Container Registry
Use title case for the GitLab Container Registry.
@@ -387,9 +401,29 @@ When writing about the Developer role:
Do not use **Developer permissions**. A user who is assigned the Developer role has a set of associated permissions.
+## dialog
+
+Use **dialog** rather than any of these alternatives:
+
+- **dialog box**
+- **modal**
+- **modal dialog**
+- **modal window**
+- **pop-up**
+- **pop-up window**
+- **window**
+
+See also [**confirmation dialog**](#confirmation-dialog). For more information, see the [Microsoft Style Guide](https://learn.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/d/dialog-box-dialog-dialogue).
+
+When the dialog is the location of an action, use **on** as a preposition. For example:
+
+- On the **Grant permission** dialog, select **Group**.
+
+See also [**on**](#on).
+
## disable
-See [the Microsoft style guide](https://learn.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/d/disable-disabled) for guidance on **disable**.
+See the [Microsoft Style Guide](https://learn.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/d/disable-disabled) for guidance on **disable**.
Use **inactive** or **off** instead. ([Vale](../testing.md#vale) rule: [`InclusionAbleism.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/InclusionAbleism.yml))
## disallow
@@ -439,17 +473,30 @@ Do not use **easily**. If the user doesn't find the process to be easy, we lose
Do not use Latin abbreviations. Use **for example**, **such as**, **for instance**, or **like** instead. ([Vale](../testing.md#vale) rule: [`LatinTerms.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/LatinTerms.yml))
+## ellipsis
+
+When documenting UI text, if the UI includes an ellipsis, do not include the ellipsis in the documentation.
+For more information, see the [Microsoft Style Guide](https://learn.microsoft.com/en-us/style-guide/punctuation/ellipses).
+
+Use:
+
+- **Create new**
+
+Instead of:
+
+- **Create new...**
+
## email
Do not use **e-mail** with a hyphen. When plural, use **emails** or **email messages**. ([Vale](../testing.md#vale) rule: [`SubstitutionSuggestions.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/SubstitutionSuggestions.yml))
-## emojis
+## emoji
-Use **emojis** to refer to the plural form of **emoji**.
+Use **emoji** to refer to the plural form of **emoji**.
## enable
-See [the Microsoft style guide](https://learn.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/e/enable-enables) for guidance on **enable**.
+See the [Microsoft Style Guide](https://learn.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/e/enable-enables) for guidance on **enable**.
Use **active** or **on** instead. ([Vale](../testing.md#vale) rule: [`InclusionAbleism.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/InclusionAbleism.yml))
## enter
@@ -680,7 +727,7 @@ Instead of:
## I
-Do not use first-person singular. Use **you**, **we**, or **us** instead. ([Vale](../testing.md#vale) rule: [`FirstPerson.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/FirstPerson.yml))
+Do not use first-person singular. Use **you** or rewrite the phrase instead.
## i.e.
@@ -862,15 +909,27 @@ Do not use `master`. Use `main` when you need a sample [default branch name](#de
## may, might
-**Might** means something has the probability of occurring. **May** gives permission to do something. Consider **can** instead of **may**.
+**Might** means something has the probability of occurring. Might is often used in troubleshooting documentation.
-## MB, megabytes
+**May** gives permission to do something. Consider **can** instead of **may**.
-For **MB** and **GB**, follow the [Microsoft guidance](https://learn.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/term-collections/bits-bytes-terms).
+Consider rewording phrases that use these terms. These terms often indicate possibility and doubt, and technical writing strives to be precise.
-## me, myself, mine
+See also [you can](#you-can).
+
+Use:
+
+- The `committed_date` and `authored_date` fields are generated from different sources, and might not be identical.
+- A typical pipeline consists of four stages, executed in the following order:
+
+Instead of:
-Do not use first-person singular. Use **you**, **we**, or **us** instead. ([Vale](../testing.md#vale) rule: [`FirstPerson.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/FirstPerson.yml))
+- The `committed_date` and `authored_date` fields are generated from different sources, and may not be identical.
+- A typical pipeline might consist of four stages, executed in the following order:
+
+## MB, megabytes
+
+For **MB** and **GB**, follow the [Microsoft guidance](https://learn.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/term-collections/bits-bytes-terms).
## member
@@ -1009,15 +1068,12 @@ For more information, see the
## on
-When documenting how to select high-level UI elements, use the word **on**.
+When documenting high-level UI elements, use **on** as a preposition. For example:
-Use:
+- On the left sidebar, select **Settings > CI/CD**.
+- On the **Grant permission** dialog, select **Group**.
-- `On the left sidebar...`
-
-Instead of:
-
-- Do not: `From the left sidebar...` or `In the left sidebar...`
+Do not use **from** or **in**. For more information, see the [Microsoft Style Guide](https://learn.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/f/from-vs-on).
## once
@@ -1098,7 +1154,7 @@ Use lowercase for **personal access token**.
## please
-Do not use **please**. For details, see the [Microsoft style guide](https://learn.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/p/please).
+Do not use **please**. For more information, see the [Microsoft Style Guide](https://learn.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/p/please).
## Premium
@@ -1453,9 +1509,9 @@ Use [**2FA** and **two-factor authentication**](#2fa-two-factor-authentication)
## type
-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.
+Use **type** when the cursor remains where you're typing. For example,
+in a search box, you begin typing and search results appear. You do not
+click out of the search box.
For example:
@@ -1470,25 +1526,13 @@ See also [**enter**](#enter).
Use **Ultimate**, in uppercase, for the subscription tier. When you refer to **Ultimate**
in the context of other subscription tiers, follow [the subscription tier](#subscription-tier) guidance.
-## units of compute
-
-Use **units of compute** instead of these (or similar) terms:
-
-- **CI/CD minutes**
-- **CI minutes**
-- **pipeline minutes**
-- **CI pipeline minutes**
-- **pipeline minutes**
-
-For more information, see [issue 5218](https://gitlab.com/gitlab-com/Product/-/issues/5218).
-
## units of measurement
Use a space between the number and the unit of measurement. For example, **128 GB**.
([Vale](../testing.md#vale) rule: [`Units.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/Units.yml))
-For other guidance, follow
-[the Microsoft style guidelines](https://learn.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/term-collections/bits-bytes-terms).
+For more information, see the
+[Microsoft Style Guide](https://learn.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/term-collections/bits-bytes-terms).
## update
@@ -1524,7 +1568,7 @@ If the UI element is not in a corner, use **upper left** and **upper right**.
Do not use **top left** and **top right**.
-For details, see the [Microsoft style guide](https://learn.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/u/upper-left-upper-right).
+For more information, see the [Microsoft Style Guide](https://learn.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/u/upper-left-upper-right).
## useful
@@ -1571,7 +1615,7 @@ Instead of:
- While job 1 can run quickly, job 2 is more precise.
-For details, see the [Microsoft style guide](https://learn.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/w/while).
+For more information, see the [Microsoft Style Guide](https://learn.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/w/while).
## whilst
@@ -1616,6 +1660,7 @@ For example:
- Use code review analytics to view merge request data.
- Create a board to organize your team tasks.
- Configure variables to restrict pushes to a repository.
+- Add links to external accounts you have, like Skype and Twitter.
Use **you can** for optional actions. For example:
diff --git a/doc/development/documentation/workflow.md b/doc/development/documentation/workflow.md
index 1a4194aebd9..eb1ea28d3b8 100644
--- a/doc/development/documentation/workflow.md
+++ b/doc/development/documentation/workflow.md
@@ -69,7 +69,7 @@ Remember:
GitLab documentation is distributed under the [CC BY-SA 4.0 license](https://creativecommons.org/licenses/by-sa/4.0/), which presupposes that GitLab owns the documentation.
-Under current law in the US and the EU, it’s possible that AI-generated works might either:
+Under current law in the US and the EU, it's possible that AI-generated works might either:
- not be owned by anyone because they weren't created by a human, or
- belong to the AI training data's creator, if the AI verbatim reproduces content that it trained on
diff --git a/doc/development/ee_features.md b/doc/development/ee_features.md
index aeb9739ecb3..9219fcd6710 100644
--- a/doc/development/ee_features.md
+++ b/doc/development/ee_features.md
@@ -222,7 +222,7 @@ This also applies to views.
#### Testing EE-only backend features
-To test an EE class that doesn't exist in CE, create the spec file as you normally
+To test an EE class that doesn't exist in CE, create the spec file as you usually
would in the `ee/spec` directory, but without the second `ee/` subdirectory.
For example, a class `ee/app/models/vulnerability.rb` would have its tests in `ee/spec/models/vulnerability_spec.rb`.
@@ -303,7 +303,7 @@ This is also not just applied to models. Here's a list of other examples:
#### Testing EE features based on CE features
To test an `EE` namespaced module that extends a CE class with EE features,
-create the spec file as you normally would in the `ee/spec` directory, including the second `ee/` subdirectory.
+create the spec file as you usually would in the `ee/spec` directory, including the second `ee/` subdirectory.
For example, an extension `ee/app/models/ee/user.rb` would have its tests in `ee/spec/models/ee/user_spec.rb`.
In the `RSpec.describe` call, use the CE class name where the EE module would be used.
@@ -713,7 +713,7 @@ end
### Code in `lib/`
Place EE-specific logic in the top-level `EE` module namespace. Namespace the
-class beneath the `EE` module just as you would normally.
+class beneath the `EE` module as you usually would.
For example, if CE has LDAP classes in `lib/gitlab/ldap/` then you would place
EE-specific LDAP classes in `ee/lib/ee/gitlab/ldap`.
@@ -870,7 +870,7 @@ end
#### EE-specific behavior
-Sometimes we need EE-specific behavior in some of the APIs. Normally we could
+Sometimes we need EE-specific behavior in some of the APIs. Usually we could
use EE methods to override CE methods, however API routes are not methods and
therefore cannot be overridden. We need to extract them into a standalone
method, or introduce some "hooks" where we could inject behavior in the CE
diff --git a/doc/development/event_store.md b/doc/development/event_store.md
index 10dc0b1a7a9..c54e6ae2d07 100644
--- a/doc/development/event_store.md
+++ b/doc/development/event_store.md
@@ -365,3 +365,19 @@ RSpec.describe MergeRequests::UpdateHeadPipelineWorker do
end
end
```
+
+## Best practices
+
+- Maintain [CE & EE separation and compatibility](ee_features.md#separation-of-ee-code-in-the-backend):
+ - Define the event class and publish the event in the same code where the event always occurs (CE or EE).
+ - If the event occurs as a result of a CE feature, the event class must both be defined and published in CE.
+ Likewise if the event occurs as a result of an EE feature, the event class must both be defined and published in EE.
+ - Define subscribers that depends on the event in the same code where the dependent feature exists (CE or EE).
+ - You can have an event published in CE (for example `Projects::ProjectCreatedEvent`) and a subscriber that depends
+ on this event defined in EE (for example `Security::SyncSecurityPolicyWorker`).
+- Define the event class and publish the event within the same bounded context (top-level Ruby namespace).
+ - A given bounded context should only publish events related to its own context.
+- Evaluate signal/noise ratio when subscribing to an event. How many events do you process vs ignore
+ within the subscriber? Consider using [conditional dispatch](#conditional-dispatch-of-events)
+ if you are interested in only a small subset of events. Balance between executing synchronous checks with
+ conditional dispatch or schedule potentially redundant workers.
diff --git a/doc/development/experiment_guide/implementing_experiments.md b/doc/development/experiment_guide/implementing_experiments.md
index 5bce9f1fab5..6fe58a1da54 100644
--- a/doc/development/experiment_guide/implementing_experiments.md
+++ b/doc/development/experiment_guide/implementing_experiments.md
@@ -11,7 +11,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
[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
+usually 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`.
@@ -280,7 +280,7 @@ 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
+the arguments you would usually use when
[tracking events using snowplow](../snowplow/index.md). The easiest example
of tracking an event in Ruby would be:
diff --git a/doc/development/fe_guide/content_editor.md b/doc/development/fe_guide/content_editor.md
index 25140a067ca..fdeabc99ea4 100644
--- a/doc/development/fe_guide/content_editor.md
+++ b/doc/development/fe_guide/content_editor.md
@@ -4,27 +4,27 @@ group: Knowledge
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
-# Content Editor development guidelines
+# Rich text editor development guidelines
-The Content Editor is a UI component that provides a WYSIWYG editing
+The rich text editor is a UI component that provides a WYSIWYG editing
experience for [GitLab Flavored Markdown](../../user/markdown.md) in the GitLab application.
It also serves as the foundation for implementing Markdown-focused editors
that target other engines, like static site generators.
We use [Tiptap 2.0](https://tiptap.dev/) and [ProseMirror](https://prosemirror.net/)
-to build the Content Editor. These frameworks provide a level of abstraction on top of
+to build the rich text editor. These frameworks provide a level of abstraction on top of
the native
[`contenteditable`](https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Editable_content) web technology.
## Usage guide
-Follow these instructions to include the Content Editor in a feature.
+Follow these instructions to include the rich text editor in a feature.
-1. [Include the Content Editor component](#include-the-content-editor-component).
+1. [Include the rich text editor component](#include-the-rich-text-editor-component).
1. [Set and get Markdown](#set-and-get-markdown).
1. [Listen for changes](#listen-for-changes).
-### Include the Content Editor component
+### Include the rich text editor component
Import the `ContentEditor` Vue component. We recommend using asynchronous named imports to
take advantage of caching, as the ContentEditor is a big dependency.
@@ -43,7 +43,7 @@ export default {
</script>
```
-The Content Editor requires two properties:
+The rich text editor requires two properties:
- `renderMarkdown` is an asynchronous function that returns the response (String) of invoking the
[Markdown API](../../api/markdown.md).
@@ -95,7 +95,7 @@ export default {
### Listen for changes
-You can still react to changes in the Content Editor. Reacting to changes helps
+You can still react to changes in the rich text editor. Reacting to changes helps
you know if the document is empty or dirty. Use the `@change` event handler for
this purpose.
@@ -131,7 +131,7 @@ export default {
## Implementation guide
-The Content Editor is composed of three main layers:
+The rich text editor is composed of three main layers:
- **The editing tools UI**, like the toolbar and the table structure editor. They
display the editor's state and mutate it by dispatching commands.
@@ -163,7 +163,7 @@ We implement [node views](https://tiptap.dev/guide/node-views/vue/#node-views-wi
to provide inline editing tools for some content types, like tables and images. Node views
allow separating the presentation of a content type from its
[model](https://prosemirror.net/docs/guide/#doc.data_structures). Using a Vue component in
-the presentation layer enables sophisticated editing experiences in the Content Editor.
+the presentation layer enables sophisticated editing experiences in the rich text editor.
Node views are located in `~/content_editor/components/wrappers`.
#### Dispatch commands
@@ -248,19 +248,19 @@ export default {
The Tiptap [Editor](https://tiptap.dev/api/editor) class manages
the editor's state and encapsulates all the business logic that powers
-the Content Editor. The Content Editor constructs a new instance of this class and
+the rich text editor. The rich text editor constructs a new instance of this class and
provides all the necessary extensions to support
[GitLab Flavored Markdown](../../user/markdown.md).
#### Implement new extensions
-Extensions are the building blocks of the Content Editor. You can learn how to implement
+Extensions are the building blocks of the rich text editor. You can learn how to implement
new ones by reading [the Tiptap guide](https://tiptap.dev/guide/custom-extensions).
We recommend checking the list of built-in [nodes](https://tiptap.dev/api/nodes) and
[marks](https://tiptap.dev/api/marks) before implementing a new extension
from scratch.
-Store the Content Editor extensions in the `~/content_editor/extensions` directory.
+Store the rich text editor extensions in the `~/content_editor/extensions` directory.
When using a Tiptap built-in extension, wrap it in a ES6 module inside this directory:
```javascript
@@ -313,11 +313,11 @@ by first rendering the Markdown as HTML using the [Markdown API endpoint](../../
```mermaid
sequenceDiagram
- participant A as Content Editor
- participant E as Tiptap Object
- participant B as Markdown Serializer
+ participant A as rich text editor
+ participant E as Tiptap object
+ participant B as Markdown serializer
participant C as Markdown API
- participant D as ProseMirror Parser
+ participant D as ProseMirror parser
A->>B: deserialize(markdown)
B->>C: render(markdown)
C-->>B: html
@@ -343,13 +343,13 @@ classes documentation before implementing a serializer:
```mermaid
sequenceDiagram
- participant A as Content Editor
- participant B as Markdown Serializer
+ participant A as rich text editor
+ participant B as Markdown serializer
participant C as ProseMirror Markdown
A->>B: serialize(document)
B->>C: serialize(document, serializers)
- C-->>A: markdown string
+ C-->>A: Markdown string
```
`prosemirror-markdown` requires implementing a serializer function for each content type supported
-by the Content Editor. We implement serializers in `~/content_editor/services/markdown_serializer.js`.
+by the rich text editor. We implement serializers in `~/content_editor/services/markdown_serializer.js`.
diff --git a/doc/development/fe_guide/design_tokens.md b/doc/development/fe_guide/design_tokens.md
new file mode 100644
index 00000000000..9a1cc48c68f
--- /dev/null
+++ b/doc/development/fe_guide/design_tokens.md
@@ -0,0 +1,320 @@
+---
+type: reference, dev
+stage: none
+group: Development
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Design tokens
+
+Design tokens provide a single source-of-truth for values (such as color, spacing, and duration), in different modes (such as default and dark), for different tools (such as Figma and code).
+
+## Usage
+
+We manage design tokens in the [`gitlab-ui`](https://gitlab.com/gitlab-org/gitlab-ui) repository. This repository is published on [npm](https://www.npmjs.com/package/@gitlab/ui), and is managed as a dependency with yarn. To upgrade to a new version run `yarn upgrade @gitlab/ui`.
+
+Design tokens are provided in different modes (default/dark) and file formats for use in CSS (custom properties), JavaScript (ES6 Constants/JSON), and SCSS (variables), for example:
+
+**JavaScript**
+
+```javascript
+import { BLUE_500 } from '@gitlab/ui/dist/tokens/js/tokens';
+
+const color = BLUE_500; // #1f75cb
+```
+
+**CSS**
+
+```css
+@import '@gitlab/ui/dist/tokens/css/tokens';
+
+.elem {
+ color: var(--blue-500); /* #1f75cb */
+}
+```
+
+**SCSS**
+
+```scss
+@import '@gitlab/ui/dist/tokens/scss/tokens';
+
+.elem {
+ color: $blue-500; /* #1f75cb */
+}
+```
+
+### Dark mode
+
+Where color design tokens are updated for dark mode, their values are provided with the same name in files appended with `.dark`, for example:
+
+**JavaScript**
+
+```javascript
+import { BLUE_500 } from '@gitlab/ui/dist/tokens/js/tokens.dark';
+
+const color = BLUE_500; // #428fdc
+```
+
+**CSS**
+
+```css
+@import '@gitlab/ui/dist/tokens/css/tokens.dark';
+
+.elem {
+ color: var(--blue-500); /* #428fdc */
+}
+```
+
+**SCSS**
+
+```scss
+@import '@gitlab/ui/dist/tokens/scss/tokens.dark';
+
+.elem {
+ color: $blue-500; /* #428fdc */
+}
+```
+
+## Creating or updating design tokens
+
+### Format
+
+Our design tokens use the [Design Tokens Format Module](https://tr.designtokens.org/format/) for defining design tokens that integrate with different tools and are converted to required file formats. It is a [community group draft report](https://www.w3.org/standards/types#reports), published by the [Design Tokens Community Group](https://www.w3.org/community/design-tokens/).
+
+The Design Tokens Format Module promotes a `*.token.json` extension standard for design token files, with a format that includes [a name and `$value`](https://tr.designtokens.org/format/#name-and-value) and an explicit [`$type`](https://tr.designtokens.org/format/#type-0):
+
+```json
+// color.tokens.json
+{
+ "token name": {
+ "$value": "#000",
+ "$type": "color"
+ }
+}
+```
+
+### Transformations
+
+Our design tokens use [style-dictionary](https://amzn.github.io/style-dictionary) to convert design tokens into consumable file formats (CSS/SCSS/JavaScript/JSON).
+
+A parser makes [design tokens format properties](https://tr.designtokens.org/format/#design-token-properties) compatible with [style-dictionary design token attributes](https://amzn.github.io/style-dictionary/#/tokens?id=design-token-attributes).
+
+| Design Tokens Format Module | style-dictionary |
+| -------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
+| [`$value`](https://tr.designtokens.org/format/#name-and-value) property | [`value`](https://amzn.github.io/style-dictionary/#/tokens?id=design-token-attributes) property |
+| [`$type`](https://tr.designtokens.org/format/#type-0) property | implicit nested [`category → type → item` (CTI) convention](https://amzn.github.io/style-dictionary/#/tokens?id=category-type-item) |
+| [`$description`](https://tr.designtokens.org/format/#description) property | [`comment`](https://amzn.github.io/style-dictionary/#/tokens?id=design-token-attributes) property |
+
+### Names
+
+A design token name is a unique and case-sensitive identifier of a value. A name can be used across different [modes](#modes) to generate style overrides.
+
+### Groups
+
+Groups are arbitrary ways to cluster tokens together in a category. They should not be used to infer the type or purpose of design tokens. For that purpose, use the [`$type`](#type) property.
+
+```json
+{
+ "group name": {
+ "token name": {
+ "$value": "#000"
+ }
+ }
+}
+```
+
+Group names prepend design token names in generated output, for example:
+
+**JavaScript**
+
+```javascript
+const GROUP_NAME_TOKEN_NAME = "#000";
+```
+
+**CSS**
+
+```css
+:root {
+ --group-name-token-name: #000;
+}
+```
+
+**SCSS**
+
+```scss
+$group-name-token-name: #000;
+```
+
+### Values
+
+Name and `$value` are the minimum required properties of a design token, `$value` is a reserved word.
+
+```json
+{
+ "token name": {
+ "$value": "16"
+ }
+}
+```
+
+A design token value can be a string or [alias](#aliases), for example:
+
+| Example | Value |
+| ------------- | ------------------- |
+| color | `"#1f75cb"` |
+| font weight | `"bold"` |
+| spacing scale | `"16"` |
+| easing | `"ease-out"` |
+| duration | `"200"` |
+| alias | `"{color.default}"` |
+
+### Aliases
+
+A design token's value can be a reference to another token, for example the alias token `text-color` has the value `{color.default}`:
+
+```json
+{
+ "text-color": {
+ "$value": "{color.default}"
+ }
+}
+```
+
+This allows generated CSS and SCSS that are output by using [Output References](https://amzn.github.io/style-dictionary/#/formats?id=references-in-output-files) to use references as variables:
+
+**CSS**
+
+```css
+:root {
+ --text-color: var(--color-default);
+}
+```
+
+**SCSS**
+
+```scss
+$text-color: $color-default;
+```
+
+### Type
+
+An optional [$type](https://tr.designtokens.org/format/#type-0) property is used for value transformations and grouping tokens together, for example:
+
+```json
+{
+ "token name": {
+ "$value": "#000",
+ "$type": "color"
+ }
+}
+```
+
+Results in the output `tokens.grouped.json` that can be used for documentation or tooling configuration:
+
+```json
+{
+ "color": {
+ "token name": "#000"
+ }
+}
+```
+
+### Modes
+
+Modes are processed on top of default tokens and can be combined with other modes, and inherited separately from stylesheets. Modes are denoted with a `.{mode}.token.json` filename which is used to filter tokens by file, for example: for dark mode token files, end with `.dark.token.json`.
+
+#### Default design tokens
+
+**Input**
+
+`color.tokens.json`
+
+```json
+{
+ "text-color": {
+ "$value": "#000",
+ "$type": "color"
+ }
+}
+```
+
+**Output**
+
+`tokens.grouped.json`
+
+```json
+{
+ "color": {
+ "text-color": "#000"
+ }
+}
+```
+
+`tokens.js`
+
+```javascript
+export const TEXT_COLOR = "#000";
+```
+
+`tokens.scss`
+
+```scss
+$text-color: #000;
+```
+
+`tokens.css`
+
+```css
+:root {
+ --text-color: #000;
+}
+```
+
+#### Dark mode design tokens
+
+Design tokens for different modes are generated separately from default tokens. Using the same name for tokens ensures they will override default values when imported, for example:
+
+**Input**
+
+`color.dark.tokens.json`
+
+```json
+{
+ "text-color": {
+ "$value": "#fff",
+ "$type": "color"
+ }
+}
+```
+
+**Output**
+
+`tokens.dark.grouped.json`
+
+```json
+{
+ "color": {
+ "text-color": "#fff"
+ }
+}
+```
+
+`tokens.dark.js`
+
+```javascript
+export const TEXT_COLOR = "#fff";
+```
+
+`tokens.dark.scss`
+
+```scss
+$text-color: #fff;
+```
+
+`tokens.dark.css`
+
+```css
+:root {
+ --text: #fff;
+}
+```
diff --git a/doc/development/fe_guide/frontend_faq.md b/doc/development/fe_guide/frontend_faq.md
index 995730796b4..ab75cc27b6a 100644
--- a/doc/development/fe_guide/frontend_faq.md
+++ b/doc/development/fe_guide/frontend_faq.md
@@ -163,7 +163,7 @@ Sometimes it's necessary to test locally what the frontend production build woul
The production build takes a few minutes to be completed. Any code changes at this point are
displayed only after executing the item 3 above again.
-To return to the normal development mode:
+To return to the standard development mode:
1. Open `gitlab.yaml` located in your `gitlab` installation folder, scroll down to the `webpack` section and change back `dev_server` to `enabled: true`.
1. Run `yarn clean` to remove the production assets and free some space (optional).
diff --git a/doc/development/fe_guide/graphql.md b/doc/development/fe_guide/graphql.md
index da3a6eff79d..00c7bb5d6c8 100644
--- a/doc/development/fe_guide/graphql.md
+++ b/doc/development/fe_guide/graphql.md
@@ -591,8 +591,7 @@ pageInfo {
Here:
-- `startCursor` and `endCursor` display the cursor of the first and last items
- respectively.
+- `startCursor` displays the cursor of the first items and `endCursor` displays the cursor of the last items.
- `hasPreviousPage` and `hasNextPage` allow us to check if there are more pages
available before or after the current page.
@@ -1418,6 +1417,48 @@ wrapper = mount(SomeComponent, {
});
```
+#### Testing subscriptions
+
+When testing subscriptions, be aware that default behavior for subscription in `vue-apollo@4` is to re-subscribe and immediatelly issue new request on error (unless value of `skip` restricts us from doing that)
+
+```javascript
+import waitForPromises from 'helpers/wait_for_promises';
+
+// subscriptionMock is registered as handler function for subscription
+// in our helper
+const subcriptionMock = jest.fn().mockResolvedValue(okResponse);
+
+// ...
+
+it('testing error state', () => {
+ // Avoid: will stuck below!
+ subscriptionMock = jest.fn().mockRejectedValue({ errors: [] });
+
+ // component calls subscription mock as part of
+ createComponent();
+ // will be stuck forever:
+ // * rejected promise will trigger resubscription
+ // * re-subscription will call subscriptionMock again, resulting in rejected promise
+ // * rejected promise will trigger next re-subscription,
+ await waitForPromises();
+ // ...
+})
+```
+
+To avoid such infinite loops when using `vue@3` and `vue-apollo@4` consider using one-time rejections
+
+```javascript
+it('testing failure', () => {
+ // OK: subscription will fail once
+ subscriptionMock.mockRejectedValueOnce({ errors: [] });
+ // component calls subscription mock as part of
+ createComponent();
+ await waitForPromises();
+
+ // code below now will be executred
+})
+```
+
#### Testing `@client` queries
##### Using mock resolvers
diff --git a/doc/development/fe_guide/index.md b/doc/development/fe_guide/index.md
index 3d05d395ef1..8675866fce6 100644
--- a/doc/development/fe_guide/index.md
+++ b/doc/development/fe_guide/index.md
@@ -19,13 +19,68 @@ Be wary of [the limitations that come with using Hamlit](https://github.com/k0ku
<!-- vale gitlab.Spelling = YES -->
+When it comes to CSS, we use a utils-based CSS approach. GitLab has its own CSS utils which are packaged inside the `gitlab-ui` project and can be seen [in the repository](https://gitlab.com/gitlab-org/gitlab-ui/-/tree/main/src/scss/utility-mixins) or on [UNPKG](https://unpkg.com/browse/@gitlab/ui@latest/src/scss/utility-mixins/). Please favor using these before adding or using any SCSS classes.
+
We also use [SCSS](https://sass-lang.com) and plain JavaScript with
modern ECMAScript standards supported through [Babel](https://babeljs.io/) and ES module support through [webpack](https://webpack.js.org/).
+When making API calls, we use [GraphQL](graphql.md) as [the first choice](../../api/graphql/index.md#vision). There are still instances where GitLab REST API is used such as when creating new simple HAML pages or in legacy part of the codebase, but we should always default to GraphQL when possible.
+
Working with our frontend assets requires Node (v12.22.1 or greater) and Yarn
(v1.10.0 or greater). You can find information on how to install these on our
[installation guide](../../install/installation.md#5-node).
+## Vision
+
+As Frontend engineers, we strive to give users **delightful experiences**. We should always think of how this applies at GitLab specifically: a great GitLab experience means helping our userbase ship **their own projects faster and with more confidence** when shipping their own software. This means that whenever confronted with a choice for the future of our department, we should remember to try to put this first.
+
+### Values
+
+We define three core values, Stability, Speed and Maintainability (SSM)
+
+#### Stability
+
+Although velocity is extremely important, we believe that GitLab is now an enterprise-grade platform that requires even the smallest MVC to be **stable, tested and with a good architecture**. We should not merge code, even as an MVC, that could introduce degradation, poor performance, confusion or generally lower our users expectations.
+
+This is an extension of the core value that want our users to have confidence in their own software and to do so, they need to have **confidence in GitLab first**. This means that our own confidence in our software should be at the absolute maximum.
+
+#### Speed
+
+Users should be able to navigate through the GitLab application with ease. This implies fast load times, easy to find pages, clear UX and an overall sense that they can accomplish their goal without friction.
+
+Additionally, we want our speed to be felt and appreciated by our developers. This means that we should put a lot of effort and thoughts into processes, tools and documentation that help us achieve success faster across our department. This benefits us as engineers, but also our users that end up receiving quality features at a faster rate.
+
+#### Maintainability
+
+GitLab is now a large, enterprise-grade software and it often requires complex code to give the best possible experience. Although complexity is a necessity, we must remain vigilent to not let it grow more than it should. To minimize this, we want to focus on making our codebase maintainable by **encapsulating complexity**. This is done by:
+
+- Building tools that solve commonly-faced problems and making them easily discoverable.
+- Writing better documentation on how we solve our problems.
+- Writing loosly coupled components that can be easily added or removed from our codebase.
+- Remove older technologies or pattern that we deem are no longer acceptable.
+
+By focusing on these aspects, we aim to allow engineers to contain complexity in well defined boundaries and quickly share them with their peers.
+
+### Goals
+
+Now that our values have been defined, we can base our goals on these values and determine what we would like to achieve at GitLab with this in mind.
+
+- Lowest possible FID, LCP and cross-page navigation times
+- Minimal page reloads when interacting with the UI
+- Have as little Vue applications per page as possible
+- Leverage Ruby ViewComponents for simple pages and avoid Vue overhead when possible
+- Migrate existing VueX stores to Apollo, but more urgently **stop using both together**
+- Remove jQuery from our codebase
+- Add a visual testing framework
+- Reduce CSS bundle size to a minimum
+- Reduce cognitive overhead and improve maintainability of our CSS
+- Improve our pipelines speed
+- Build a better set of shared components with documentation
+
+### Frontend onboarding course
+
+The [Frontend onboarding course](onboarding_course/index.md) provides a 6-week structured curriculum to learn how to contribute to the GitLab frontend.
+
### Browser Support
For supported browsers, see our [requirements](../../install/requirements.md#supported-web-browsers).
@@ -108,8 +163,8 @@ How we implement [keyboard shortcuts](keyboard_shortcuts.md) that can be customi
## Editors
-GitLab text editing experiences are provided by the [Source Editor](source_editor.md) and
-the [Content Editor](content_editor.md).
+GitLab text editing experiences are provided by the [source editor](source_editor.md) and
+the [rich text editor](content_editor.md).
## Frontend FAQ
diff --git a/doc/development/fe_guide/logging.md b/doc/development/fe_guide/logging.md
index 30cf290fbe8..750bf95e8b2 100644
--- a/doc/development/fe_guide/logging.md
+++ b/doc/development/fe_guide/logging.md
@@ -22,7 +22,7 @@ Whenever a `catch(e)` exists, and `e` is something unexpected, log the details.
### What makes an error unexpected?
-Sometimes a caught exception can be part of normal operations. For instance, third-party
+Sometimes a caught exception can be part of standard operations. For instance, third-party
libraries might throw an exception based on certain inputs. If we can gracefully
handle these exceptions, then they are expected. Don't log them noisily.
For example:
@@ -36,7 +36,7 @@ try {
} catch (e) {
if (e instanceof FooSyntaxError) {
// To handle a `FooSyntaxError`, we just need to instruct the user to change their input.
- // This isn't unexpected, and is part of normal operations.
+ // This isn't unexpected, and is part of standard operations.
setUserMessage(`Try writing better code. ${e.message}`);
} else {
// We're not sure what `e` is, so something unexpected and bad happened...
@@ -50,7 +50,7 @@ try {
We have a helpful `~/lib/logger` module which encapsulates how we can
consistently log runtime errors in GitLab. Import `logError` from this
-module, and use it as you normally would `console.error`. Pass the actual `Error`
+module, and use it as you typically would `console.error`. Pass the actual `Error`
object, so the stack trace and other details can be captured in the log:
```javascript
diff --git a/doc/development/fe_guide/merge_request_widget_extensions.md b/doc/development/fe_guide/merge_request_widget_extensions.md
index 07029aec015..f5bf9049db1 100644
--- a/doc/development/fe_guide/merge_request_widget_extensions.md
+++ b/doc/development/fe_guide/merge_request_widget_extensions.md
@@ -261,8 +261,10 @@ important not to alter the status code and headers.
If `fetchCollapsedData()` or `fetchFullData()` methods throw an error:
-- The loading state of the extension is updated to `LOADING_STATES.collapsedError`
- and `LOADING_STATES.expandedError` respectively.
+- The loading state of the extension is updated to `LOADING_STATES.collapsedError` if
+ `fetchCollapsedData()` method throws an error.
+- The loading state of the extension is updated to `LOADING_STATES.expandedError` if
+ `fetchFullData()` method throws an error.
- The extensions header displays an error icon and updates the text to be either:
- The text defined in `$options.i18n.error`.
- "Failed to load" if `$options.i18n.error` is not defined.
diff --git a/doc/development/fe_guide/onboarding_course/index.md b/doc/development/fe_guide/onboarding_course/index.md
new file mode 100644
index 00000000000..0b0ffc69f1b
--- /dev/null
+++ b/doc/development/fe_guide/onboarding_course/index.md
@@ -0,0 +1,64 @@
+---
+stage: Manage
+group: Foundations
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Frontend onboarding course
+
+Welcome to the Frontend Onboarding Course at GitLab!
+In this course, we walk you through your first professional frontend development experience, helping you gain real world skills and learn how to contribute to a large-scale codebase effectively.
+
+Throughout the course, we'll follow a structured approach.
+Each lesson focuses on solving a specific problem on GitLab, giving you hands-on experience.
+You'll learn theory that you can immediately put into practice.
+By working on real-world GitLab issues, you'll encounter challenges and learn how to navigate the codebase effectively while at the same time improving GitLab the product.
+
+We believe in an interactive learning experience.
+You'll have the opportunity to ask questions and seek help from the GitLab community.
+We appreciate your contributions and are here to support your learning while at the same time making GitLab better.
+
+Our teaching style prioritizes practical learning.
+Lessons include an introduction to the problem, theory, live coding walkthroughs, and similar issues for you to tackle.
+As you progress, the complexity of the tasks increase, helping you grow your skills.
+
+Join us on this journey of front-end development at GitLab. Say hello in [the Discord community](https://discord.gg/gitlab) and let's learn and improve together.
+
+## Lessons
+
+- [Lesson 1](lesson_1.md)
+
+## Structure and timings
+
+The course is run over 6 weeks, with a required time commitment of 5-10 hours per week.
+
+The course is free of charge, but we do ask for a commitment to complete the curriculum (including 10 merged merge requests).
+
+After completing the course, you receive a certificate and GitLab achievement.
+
+Each week consists of the following sessions:
+
+- 1-hour relaxed discussion-style lesson with explanation of how GitLab frontend works. Each week features a different guest and includes an AMA portion.
+- 2-hour live coding lesson with a practical task for participants to complete.
+- 2 x 2-hour dedicated “Office Hours†sessions where participants can work on the task assigned in the lesson with GitLab frontend engineers. (2 sessions in different timezones as this will require participants to join synchronously)
+
+A fortnightly 1-on-1 mentoring sessions are also available to each participant.
+
+There are 10 places available on the course.
+The date will be set after the course material has been prepared.
+Please complete the [Frontend Onboarding Course Application Form](https://forms.gle/39Rs4w4ZxQuByhE4A) to apply.
+
+You may also participate in the course informally at your own pace, without the benefit of the synchronous office hours or mentoring session.
+GitLab team members are happy to support you regardless.
+
+## Curriculum summary
+
+### Lesson 1
+
+- What is a development environment?
+ - What is the GDK?
+ - Installing the GDK.
+ - GDK tips and tricks.
+ - Using GitPod to run the GDK.
+- Navigating the GitLab codebase.
+- Writing a good merge request.
diff --git a/doc/development/fe_guide/onboarding_course/lesson_1.md b/doc/development/fe_guide/onboarding_course/lesson_1.md
new file mode 100644
index 00000000000..e82d350f854
--- /dev/null
+++ b/doc/development/fe_guide/onboarding_course/lesson_1.md
@@ -0,0 +1,183 @@
+---
+stage: manage
+group: foundations
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Lesson 1
+
+<div class="video-fallback">
+ See the video: <a href="https://www.youtube.com/watch?v=k4C3-FKvZyI">Lesson 1 intro</a>.
+</div>
+<figure class="video-container">
+ <iframe src="https://www.youtube-nocookie.com/embed/k4C3-FKvZyI" frameborder="0" allowfullscreen> </iframe>
+</figure>
+
+In this lesson you tackle the smallest of problems - a one-character text change. To do so, we have to learn:
+
+- How to set up a GitLab Development Environment.
+- How to navigate the GitLab code base.
+- How to create a merge request in the GitLab project.
+
+After we have learned these 3 things, a GitLab team member will do a live coding demo.
+In the demo, they'll use each of the things learned by completing one of these small issues, so that you can complete an issue by yourself.
+
+There is a list of issues that are very similar to the one we'll be live coding [here in the "Linked items" section](https://gitlab.com/gitlab-org/gitlab/-/issues/389920), it would be worth commenting on one of these now to get yourself assigned to one so that you can follow along.
+
+## What is the GDK?
+
+<div class="video-fallback">
+ See the video: <a href="https://www.youtube.com/watch?v=qXGXshfo934">What is the GDK</a>?
+</div>
+<figure class="video-container">
+ <iframe src="https://www.youtube-nocookie.com/embed/qXGXshfo934" frameborder="0" allowfullscreen> </iframe>
+</figure>
+
+The GDK (GitLab Development Kit) is a local instance of GitLab that allows developers to run and test GitLab on their own computers.
+Unlike frontend only applications, the GDK runs the entire GitLab application, including the back-end services, APIs, and a local database.
+This allows developers to make changes, test them in real-time, and validate their modifications.
+
+Tips for using the GDK:
+
+- Troubleshooting documentation: When encountering issues with the GDK, refer to the troubleshooting documentation in the [GDK repository](https://gitlab.com/gitlab-org/gitlab-development-kit/-/tree/main/doc/troubleshooting).
+ These resources provide useful commands and tips to help resolve common problems.
+- Using the Rails console: The Rails console is an essential tool for interacting with your local instance of GitLab.
+ You can access it by running `gdk rails c` and use it to enable or disable feature flags, perform backend operations, and more.
+- Stay updated: Regularly update your GDK by running `gdk update`.
+ This command fetches the latest branch of the GitLab project, as well as the latest branch of the GDK and its dependencies.
+ Keeping your GDK up to date helps ensure you will be working with the latest version of GitLab and make sure you have the latest bug fixes.
+
+Remember, if you need further assistance or have specific questions, you can reach out to the GitLab community through our [Discord](https://discord.gg/gitlab) or [other available support channels](https://about.gitlab.com/community/contribute/).
+
+## Installing and using the GDK locally
+
+<div class="video-fallback">
+ See the video: <a href="https://www.youtube.com/watch?v=fcOyjuCizmY">Installing the GDK</a>.
+</div>
+<figure class="video-container">
+ <iframe src="https://www.youtube-nocookie.com/embed/fcOyjuCizmY" frameborder="0" allowfullscreen> </iframe>
+</figure>
+
+For the latest installation instructions, refer to the [GitLab Development Kit documentation](https://gitlab.com/gitlab-org/gitlab-development-kit#installation).
+
+Here's a step-by-step summary:
+
+1. Prerequisites:
+ - 16 GB RAM. If you have less, consider [using Gitpod](#using-gitpod-instead-of-running-the-gdk-locally)
+ - Ensure that Git is installed on your machine.
+ - Install a code editor, such as Visual Studio Code.
+ - [Create an account](https://gitlab.com/users/sign_up) or [sign in](https://gitlab.com/users/sign_in) on GitLab.com and join the [community members group](https://gitlab.com/gitlab-community/meta#request-access-to-community-forks).
+1. Installation:
+ - Choose a directory to install the GitLab Development Kit (GDK).
+ - Open your terminal and navigate to the chosen directory.
+ - Download and run the installation script from the terminal:
+
+ ```shell
+ curl "https://gitlab.com/gitlab-org/gitlab-development-kit/-/raw/main/support/install" | bash
+ ```
+
+ - Only run scripts from trusted sources to ensure your safety.
+ - The installation process may take around 20 minutes or more.
+1. Choosing the repository:
+ - Instead of cloning the main GitLab repository, use the community fork recommended for wider community members.
+ - Follow the instructions provided to install the community fork.
+1. GDK structure:
+ - After the installation, the GDK directory is created.
+ - Inside the GDK directory, you'll find the GitLab project folder.
+1. Working with the GDK:
+ - GDK offers lots of commands you can use to interact with your installation. To run those commands you must be inside the GDK or GitLab folder.
+ - To start the GDK, run the command `gdk start` in your terminal.
+ - You can explore available commands and options by running `gdk help` in the terminal.
+
+Remember to consult the documentation or seek community support if you have any further questions or issues.
+
+## Using Gitpod instead of running the GDK locally
+
+<div class="video-fallback">
+ See the video: <a href="https://www.youtube.com/watch?v=RI2kM5_oii4">Using Gitpod with GitLab</a>.
+</div>
+<figure class="video-container">
+ <iframe src="https://www.youtube-nocookie.com/embed/RI2kM5_oii4" frameborder="0" allowfullscreen> </iframe>
+</figure>
+
+Gitpod is a service that allows you to run a virtual machine, specifically the GitLab Development Kit (GDK), on the Gitpod server instead of running it on your own machine.
+It provides a web-based Integrated Development Environment (IDE) where you can edit code and see the GDK in action.
+Gitpod is useful for quickly getting a GDK environment up and running, for making small merge requests without installing the GDK locally, or for running GDK on a machine that may not have enough resources.
+
+To use Gitpod:
+
+1. Go to the [GitLab community fork website](https://gitlab.com/gitlab-community/gitlab), select **Edit**, then select **Gitpod**.
+1. Configure your settings, such as the editor (VS Code desktop or browser) and the context (usually the `main` or `master` branch).
+1. Select **Open** to create your Gitpod workspace. This process may take up to 20 minutes. The GitLab Development Kit (GDK) will be installed in the Gitpod workspace. This installation is faster than downloading and installing the full GDK locally.
+
+After the workspace is created, you'll find your chosen IDE running in your browser. You can also connect it to your desktop IDE if preferred.
+Treat Gitpod just like you would use VS Code locally. Create branches, make code changes, commit them, and push them back to the community fork.
+
+Other tips:
+
+- Remember to push your code regularly to avoid the workspace timing out. Idle workspaces are eventually destroyed.
+- Customize your Gitpod workspace settings if needed, such as making your instance of GitLab frontend publicly available.
+- If you run out of minutes, contact the support team on the Discord server.
+- Troubleshoot issues by using commands like `gdk start` and `gdk status` in the Gitpod workspace as you would if it was running locally.
+
+By following these steps, you can leverage Gitpod to efficiently develop with the GitLab Development Kit without the need for local installation.
+
+## Navigating the GitLab codebase
+
+<div class="video-fallback">
+ See the video: <a href="https://www.youtube.com/watch?v=Wc5u879_0Aw">How to navigate the GitLab codebase</a>.
+</div>
+<figure class="video-container">
+ <iframe src="https://www.youtube-nocookie.com/embed/Wc5u879_0Aw" frameborder="0" allowfullscreen> </iframe>
+</figure>
+
+Understanding how to navigate the GitLab codebase is essential for contributors.
+Navigating the codebase and locating specific files can be challenging but crucial for making changes and addressing issues effectively.
+Here we'll explore a step-by-step process for finding files and finding where they are rendered in GitLab.
+
+If you already know the file you are going to work on and now you want to find where it is rendered:
+
+1. Start by gathering clues to understand the file’s purpose. Look for relevant information within the file itself, such as keywords or specific content that might indicate its context.
+1. You can also examine the file path (or folder structure) to gain insights into where the file might be rendered.
+ A lot of routing in GitLab is very similar to the folder structure.
+1. If you can work out which feature (or one of the features) that this component is used in, you can then leverage the GitLab user documentation to find out how to navigate to the feature page.
+1. Follow the component hierarchy, do a global search for the file name to identify the parent component that renders the component.
+ Continue to follow the hierarchy of components to trace back to a feature you recognize or can search for in the GitLab user docs.
+1. You can use `git blame` with an extension like GitLens to find a recent MR where this file was changed.
+ Most MR’s have a "How to validate" section that you can follow, if the MR doesn't have one, look for the previous change and until you find one that have validation steps.
+
+If you know which page you need to fix and you want to find the file path, here are some things you can try:
+
+- Look for content that is unique and doesn’t contain variables so that you can search for the translation variable.
+- Try using Vue Dev Tools to find the component name.
+- Look for unique identifiers like a `data-testid`,`id` or a unique looking CSS class in the HTML of the component and then search globally the codebase for those identifying strings.
+
+## Writing a good merge request
+
+<div class="video-fallback">
+ See the video: <a href="https://www.youtube.com/watch?v=H5zozDNIn98">How to write a good MR</a>.
+</div>
+<figure class="video-container">
+ <iframe src="https://www.youtube-nocookie.com/embed/H5zozDNIn98" frameborder="0" allowfullscreen> </iframe>
+</figure>
+
+When writing a merge request there are some important things to be aware of:
+
+- Your MR will become a permanent part of the documentation of the GitLab project.
+ It may be used in the future to help people understand why some code works the way it does and why it doesn't use an alternative solution.
+- At least 2 other engineers are going to review your code. For the sake of efficiency (much like the code itself you have written) it is best to take a little while longer to get your MR right so that it is quicker and easier for others to read.
+- The MRs that you create on GitLab are available to the public. This means you can add a link to MRs you are particularly proud of to your portfolio page when looking for a job.
+- Since an MR is a technical document, you should try to implement a technical writing style.
+ If you don’t know what that is, here is a highly recommended short course from [Google on Technical writing](https://developers.google.com/tech-writing/one).
+ If you are also contributing to the documentation at GitLab, there is a [Technical Writing Fundamentals course available here from GitLab](https://about.gitlab.com/handbook/product/ux/technical-writing/fundamentals/).
+
+## Live coding
+
+<div class="video-fallback">
+ See the video: <a href="https://www.youtube.com/watch?v=BJCCwc1Czt4">Lesson 1 code walkthrough</a>.
+</div>
+<figure class="video-container">
+ <iframe src="https://www.youtube-nocookie.com/embed/BJCCwc1Czt4" frameborder="0" allowfullscreen> </iframe>
+</figure>
+
+Now it is your turn to complete your first MR, there is a list of issues that are very similar to the one we just finished that need completing [here in the "Linked items" section](https://gitlab.com/gitlab-org/gitlab/-/issues/389920). Thanks for contributing! (if there are none left, let us know on [Discord](https://discord.gg/gitlab) or [other available support channels](https://about.gitlab.com/community/contribute/) and we'll find more for you)
diff --git a/doc/development/fe_guide/storybook.md b/doc/development/fe_guide/storybook.md
index eaa8f8b4068..6049dd7c7d3 100644
--- a/doc/development/fe_guide/storybook.md
+++ b/doc/development/fe_guide/storybook.md
@@ -55,7 +55,7 @@ To add a story:
## Using GitLab REST and GraphQL APIs
-You can write stories for components that use either GitLab’s [REST](../../api/rest/index.md) or
+You can write stories for components that use either the GitLab [REST](../../api/rest/index.md) or
[GraphQL](../../api/graphql/index.md) APIs.
### Set up API access token and GitLab instance URL
@@ -72,7 +72,7 @@ a starting point.
1. Set the `API_ACCESS_TOKEN` variable to the access token that you created.
-1. Set the `GITLAB_URL` variable to the GitLab instance’s domain URL, for example: `http://gdk.test:3000`.
+1. Set the `GITLAB_URL` variable to the GitLab instance's domain URL, for example: `http://gdk.test:3000`.
1. Start or restart your storybook.
@@ -80,7 +80,7 @@ You can also use the GitLab API Access panel in the Storybook UI to set the GitL
### Set up API access in your stories
-You should apply the `withGitLabAPIAccess` decorator to the stories that will consume GitLab’s APIs. This decorator
+You should apply the `withGitLabAPIAccess` decorator to the stories that will consume GitLab APIs. This decorator
will display a badge indicating that the story won't work without providing the API access parameters:
```javascript
diff --git a/doc/development/fe_guide/style/javascript.md b/doc/development/fe_guide/style/javascript.md
index 987543642f0..cccaefe8a19 100644
--- a/doc/development/fe_guide/style/javascript.md
+++ b/doc/development/fe_guide/style/javascript.md
@@ -331,8 +331,23 @@ Only export the constants as a collection (array, or object) when there is a nee
## Error handling
-When catching a server-side error, you should use the error message
-utility function contained in `app/assets/javascripts/lib/utils/error_message.js`.
+For internal server errors when the server returns `500`, you should return a
+generic error message.
+
+When the backend returns errors, the errors should be
+suitable to display back to the user.
+
+If for some reason, it is difficult to do so, as a last resort, you can
+select particular error messages with prefixing:
+
+1. Ensure that the backend prefixes the error messages to be displayed with:
+
+ ```ruby
+ Gitlab::Utils::ErrorMessage.to_user_facing('Example user-facing error-message')
+ ```
+
+1. Use the error message utility function contained in `app/assets/javascripts/lib/utils/error_message.js`.
+
This utility accepts two parameters: the error object received from the server response and a
default error message. The utility examines the message in the error object for a prefix that
indicates whether the message is meant to be user-facing or not. If the message is intended
@@ -347,7 +362,6 @@ onError(error) {
}
```
-To benefit from this parsing mechanism, the utility user should ensure that the server-side
-code is aware of this utility's usage and prefixes the error messages where appropriate
-before sending them back to the user. See
-[Error handling for API](../../api_styleguide.md#error-handling) for more information.
+Note that this prefixing must not be used for API responses. Instead follow the
+[REST API](../../../api/rest/index.md#data-validation-and-error-reporting),
+or [GraphQL guides](../../api_graphql_styleguide.md#error-handling) on how to consume error objects.
diff --git a/doc/development/fe_guide/vue.md b/doc/development/fe_guide/vue.md
index 1a43084245e..8230f38ad8e 100644
--- a/doc/development/fe_guide/vue.md
+++ b/doc/development/fe_guide/vue.md
@@ -353,10 +353,11 @@ return new Vue({
#### Accessing feature flags
-Use the [`provide` and `inject`](https://v2.vuejs.org/v2/api/#provide-inject) mechanisms
-in Vue to make feature flags available to any descendant components in a Vue
-application. The `glFeatures` object is already provided in `commons/vue.js`, so
-only the mixin is required to use the flags:
+After pushing a feature flag to the [frontend](../feature_flags/index.md#frontend),
+use the [`provide` and `inject`](https://v2.vuejs.org/v2/api/#provide-inject)
+mechanisms in Vue to make feature flags available to any descendant components
+in a Vue application. The `glFeatures` object is already provided in
+`commons/vue.js`, so only the mixin is required to use the flags:
```javascript
// An arbitrary descendant component
diff --git a/doc/development/fe_guide/vuex.md b/doc/development/fe_guide/vuex.md
index 52278c94e9f..e096d25f2d9 100644
--- a/doc/development/fe_guide/vuex.md
+++ b/doc/development/fe_guide/vuex.md
@@ -284,7 +284,7 @@ To set this initial state, pass it as a parameter to your store's creation
function when mounting your Vue component:
```javascript
-// in the Vue app's initialization script (e.g. mount_show.js)
+// in the Vue app's initialization script (for example, mount_show.js)
import Vue from 'vue';
import Vuex from 'vuex';
diff --git a/doc/development/feature_flags/index.md b/doc/development/feature_flags/index.md
index 30837ac8f3f..d9eb29a7b7f 100644
--- a/doc/development/feature_flags/index.md
+++ b/doc/development/feature_flags/index.md
@@ -149,7 +149,7 @@ created using the [Experiment Tracking template](https://gitlab.com/gitlab-org/g
`worker` feature flags are used for controlling Sidekiq workers behavior, such as deferring Sidekiq jobs.
`worker` feature flags likely do not have any YAML definition as the name could be dynamically generated using
-the worker name itself, e.g. `defer_sidekiq_jobs_AuthorizedProjectsWorker`. Some examples for using `worker` type feature
+the worker name itself, for example, `run_sidekiq_jobs_AuthorizedProjectsWorker`. Some examples for using `worker` type feature
flags can be found in [deferring Sidekiq jobs](#deferring-sidekiq-jobs).
## Feature flag definition and validation
@@ -348,7 +348,7 @@ Use the `push_frontend_feature_flag` method which is available to all controller
```ruby
before_action do
- # Prefer to scope it per project or user e.g.
+ # Prefer to scope it per project or user, for example
push_frontend_feature_flag(:vim_bindings, project)
end
@@ -713,33 +713,47 @@ Feature flags with [`worker` type](#worker-type) can be used to control the beha
### Deferring Sidekiq jobs
-Feature flags with the format of `defer_sidekiq_jobs_{WorkerName}` delay the execution of the worker
-by scheduling the job at a later time.
+When disabled, feature flags with the format of `run_sidekiq_jobs_{WorkerName}` delay the execution of the worker
+by scheduling the job at a later time. This feature flag is enabled by default for all workers.
Deferring jobs can be useful during an incident where contentious behavior from
worker instances are saturating infrastructure resources (such as database and database connection pool).
-The implementation can be found at [DeferJobs Sidekiq server middleware](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/sidekiq_middleware/defer_jobs.rb).
+The implementation can be found at [SkipJobs Sidekiq server middleware](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/sidekiq_middleware/skip_jobs.rb).
NOTE:
-Jobs are deferred indefinitely as long as the feature flag is enabled. It is important to disable the
+Jobs are deferred indefinitely as long as the feature flag is disabled. It is important to remove the
feature flag after the worker is deemed safe to continue processing.
-When set to true, 100% of the jobs are deferred. When you want processing to resume, you can
+When set to false, 100% of the jobs are deferred. When you want processing to resume, you can
use a **percentage of time** rollout. For example:
```shell
-# defer 100% of the jobs
-/chatops run feature set defer_sidekiq_jobs_SlowRunningWorker true
+# not running any jobs, deferring all 100% of the jobs
+/chatops run feature set run_sidekiq_jobs_SlowRunningWorker false
-# defer 99% of the jobs, only letting 1% processed
-/chatops run feature set defer_sidekiq_jobs_SlowRunningWorker 99
+# only running 10% of the jobs, deferring 90% of the jobs
+/chatops run feature set run_sidekiq_jobs_SlowRunningWorker 10
-# defer 50% of the jobs
-/chatops run feature set defer_sidekiq_jobs_SlowRunningWorker 50
+# running 50% of the jobs, deferring 50% of the jobs
+/chatops run feature set run_sidekiq_jobs_SlowRunningWorker 50
-# stop deferring the jobs, jobs are being processed normally
-/chatops run feature set defer_sidekiq_jobs_SlowRunningWorker false
+# back to running all jobs normally
+/chatops run feature delete run_sidekiq_jobs_SlowRunningWorker
+```
+
+### Dropping Sidekiq jobs
+
+Instead of [deferring jobs](#deferring-sidekiq-jobs), jobs can be entirely dropped by enabling the feature flag
+`drop_sidekiq_jobs_{WorkerName}`. Use this feature flag when you are certain the jobs are safe to be dropped, i.e.
+the jobs do not need to be processed in the future.
+
+```shell
+# drop all the jobs
+/chatops run feature set drop_sidekiq_jobs_SlowRunningWorker true
+
+# process jobs normally
+/chatops run feature delete drop_sidekiq_jobs_SlowRunningWorker
```
NOTE:
-The percentage of time value denotes the percentage of time the jobs are being deferred (instead of being processed).
-For example, setting to `99` means only 1% of the jobs are being processed at random.
+Dropping feature flag (`drop_sidekiq_jobs_{WorkerName}`) takes precedence over deferring feature flag (`run_sidekiq_jobs_{WorkerName}`),
+i.e. when `drop_sidekiq_jobs` is enabled and `run_sidekiq_jobs` is disabled, jobs are entirely dropped.
diff --git a/doc/development/features_inside_dot_gitlab.md b/doc/development/features_inside_dot_gitlab.md
index 3c988ec6b21..f55d7e52fbc 100644
--- a/doc/development/features_inside_dot_gitlab.md
+++ b/doc/development/features_inside_dot_gitlab.md
@@ -16,4 +16,4 @@ When implementing new features, please refer to these existing features to avoid
- [Route Maps](../ci/review_apps/index.md#route-maps): `.gitlab/route-map.yml`.
- [Customize Auto DevOps Helm Values](../topics/autodevops/customize.md#customize-helm-chart-values): `.gitlab/auto-deploy-values.yaml`.
- [Insights](../user/project/insights/index.md#configure-project-insights): `.gitlab/insights.yml`.
-- [Service Desk Templates](../user/project/service_desk.md#create-customized-email-templates): `.gitlab/service_desk_templates/`.
+- [Service Desk Templates](../user/project/service_desk.md#customize-emails-sent-to-the-requester): `.gitlab/service_desk_templates/`.
diff --git a/doc/development/fips_compliance.md b/doc/development/fips_compliance.md
index 830a8e3cd2a..bab4d7705f9 100644
--- a/doc/development/fips_compliance.md
+++ b/doc/development/fips_compliance.md
@@ -59,7 +59,7 @@ listed here that also do not work properly in FIPS mode:
- [Container Scanning](../user/application_security/container_scanning/index.md) support for scanning images in repositories that require authentication.
- [Code Quality](../ci/testing/code_quality.md) does not support operating in FIPS-compliant mode.
- [Dependency scanning](../user/application_security/dependency_scanning/index.md) support for Gradle.
-- [Dynamic Application Security Testing (DAST)](../user/application_security/dast/index.md) supports a reduced set of analyzers. Browser-based and proxy-based analyzers are not available in FIPS mode today, however DAST API and DAST API Fuzzing images are available.
+- [Dynamic Application Security Testing (DAST)](../user/application_security/dast/proxy-based.md) supports a reduced set of analyzers. The proxy-based analyzer is not available in FIPS mode today, however browser-based DAST, DAST API, and DAST API Fuzzing images are available.
- [License compliance](../user/compliance/license_compliance/index.md).
- [Solutions for vulnerabilities](../user/application_security/vulnerabilities/index.md#resolve-a-vulnerability)
for yarn projects.
diff --git a/doc/development/gemfile.md b/doc/development/gemfile.md
index e6275068ea8..ed38f6481e7 100644
--- a/doc/development/gemfile.md
+++ b/doc/development/gemfile.md
@@ -118,9 +118,8 @@ Read more about [Gems development guidelines](gems.md).
When upgrading the Rails gem and its dependencies, you also should update the following:
+- The [`activerecord_version` in the vendored `attr_encrypted` gemspec](https://gitlab.com/gitlab-org/gitlab/-/blob/master/vendor/gems/attr_encrypted/attr_encrypted.gemspec).
- The [`Gemfile` in the `qa` directory](https://gitlab.com/gitlab-org/gitlab/-/blob/master/qa/Gemfile).
-- The [`Gemfile` in Gitaly Ruby](https://gitlab.com/gitlab-org/gitaly/-/blob/master/ruby/Gemfile),
- to ensure that we ship only one version of these gems.
You should also update npm packages that follow the current version of Rails:
diff --git a/doc/development/gems.md b/doc/development/gems.md
index 709dfa105bf..57acac7287b 100644
--- a/doc/development/gems.md
+++ b/doc/development/gems.md
@@ -9,38 +9,37 @@ info: To determine the technical writer assigned to the Stage/Group associated w
GitLab uses Gems as a tool to improve code reusability and modularity
in a monolithic codebase.
-Sometimes we create libraries within our codebase that we want to
-extract, either because their functionality is highly isolated,
-we want to use them in other applications
-ourselves, or we think it would benefit the wider community.
-Extracting code to a gem also means that we can be sure that the gem
-does not contain any hidden dependencies on our application code.
+We extract libraries from our codebase when their functionality
+is highly isolated and we want to use them in other applications
+ourselves or we think it would benefit the wider community.
-## When to use Gems
+Extracting code to a gem also ensures that the gem does not contain any hidden
+dependencies on our application code.
-Gems should be used always when implementing functions that can be considered isolated,
-that are decoupled from the business logic of GitLab and can be developed separately. Consider the
-following examples where Gem logic could be placed:
+Gems should always be used when implementing functionality that can be considered isolated,
+that are decoupled from the business logic of GitLab and can be developed separately.
-The best example where we can look for opportunities to introduce new gems
+The best place in a Rails codebase with opportunities to extract new gems
is the [lib/](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/) folder.
-The **lib/** folder is a mix of code that is generic/universal, GitLab-specific, and tightly integrated with the rest of the codebase.
+Our **lib/** folder is a mix of code that is generic/universal, GitLab-specific, and tightly integrated with the rest of the codebase.
-If you cannot find a good place for your code in **lib/** you should strongly
-consider creating the new Gem [In the same repo](#in-the-same-repo).
+In order to decide whether to extract part of the codebase as a Gem, ask yourself the following questions:
-## In the same repo
+1. Is this code generic or universal that can be done as a separate and small project?
+1. Do I expect it to be used internally outside of the Monolith?
+1. Is this useful for the wider community that we should consider releasing as a separate component?
-**Our GitLab Gems should be always put in `gems/` of GitLab monorepo.**
+If the answer is **Yes** for any of the questions above, you should strongly consider creating a new Gem.
-That gives us the advantages of gems (modular code, quicker to run tests in development).
-and prevents complexity (coordinating changes across repos, new permissions, multiple projects, etc.).
+You can always start by creating a new Gem [in the same repo](#in-the-same-repo) and later evaluate whether to migrate it to a separate repository, when it is intended
+to be used by a wider community.
-Gems stored in the same repo should be referenced in `Gemfile` with the `path:` syntax.
-They should not be published to RubyGems.
+WARNING:
+To prevent malicious actors from name-squatting the extracted Gems, follow the instructions
+to [reserve a gem name](#reserve-a-gem-name).
-### Advantages
+## Advantages of using Gems
Using Gems can provide several benefits for code maintenance:
@@ -58,11 +57,102 @@ Using Gems can provide several benefits for code maintenance:
Since the gem is packaged, not changed too often, it also allows us to run those tests less frequently improving
CI testing time.
-### To Do
+## Gem naming
+
+Gems can fall under three different case:
+
+- `unique_gem`: Don't include `gitlab` in the gem name if the gem doesn't include anything specific to GitLab
+- `existing_gem-gitlab`: When you fork and modify/extend a publicly available gem, add the `-gitlab` suffix, according to [Rubygems' convention](https://guides.rubygems.org/name-your-gem/)
+- `gitlab-unique_gem`: Include a `gitlab-` prefix to gems that are only useful in the context of GitLab projects.
+
+Examples of existing gems:
+
+- `y-rb`: Ruby bindings for yrs. Yrs "wires" is a Rust port of the Yjs framework.
+- `activerecord-gitlab`: Adds GitLab-specific patches to the `activerecord` public gem.
+- `gitlab-rspec` and `gitlab-utils`: GitLab-specific set of classes to help in a particular context, or re-use code.
+
+## In the same repo
+
+**When extracting Gems from existing codebase, put them in `gems/` of the GitLab monorepo**
+
+That gives us the advantages of gems (modular code, quicker to run tests in development).
+and prevents complexity (coordinating changes across repos, new permissions, multiple projects, etc.).
+
+Gems stored in the same repo should be referenced in `Gemfile` with the `path:` syntax.
+
+WARNING:
+To prevent malicious actors from name-squatting the extracted Gems, follow the instructions
+to [reserve a gem name](#reserve-a-gem-name).
+
+### Create and use a new Gem
+
+You can see example adding a new gem: [!121676](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/121676).
+
+1. Pick a good name for the gem, by following the [Gem naming](#gem-naming) convention.
+1. Create the new gem in `gems/<name-of-gem>` with `bundle gem gems/<name-of-gem> --no-exe --no-coc --no-ext --no-mit`.
+1. Remove the `.git` folder in `gems/<name-of-gem>` with `rm -rf gems/<name-of-gem>/.git`.
+1. Edit `gems/<name-of-gem>/README.md` to provide a simple description of the Gem.
+1. Edit `gems/<name-of-gem>/<name-of-gem>.gemspec` and fill the details about the Gem as in the following example:
+
+ ```ruby
+ # frozen_string_literal: true
+
+ require_relative "lib/name/of/gem/version"
+
+ Gem::Specification.new do |spec|
+ spec.name = "<name-of-gem>"
+ spec.version = Name::Of::Gem::Version::VERSION
+ spec.authors = ["group::tenant-scale"]
+ spec.email = ["engineering@gitlab.com"]
+
+ spec.summary = "Gem summary"
+ spec.description = "A more descriptive text about what the gem is doing."
+ spec.homepage = "https://gitlab.com/gitlab-org/gitlab/-/tree/master/gems/<name-of-gem>"
+ spec.license = "MIT"
+ spec.required_ruby_version = ">= 3.0"
+ spec.metadata["rubygems_mfa_required"] = "true"
+
+ spec.files = Dir['lib/**/*.rb']
+ spec.require_paths = ["lib"]
+ end
+ ```
+
+1. Update `gems/<name-of-gem>/.rubocop.yml` with:
+
+ ```yaml
+ inherit_from:
+ - ../config/rubocop.yml
+ ```
+
+1. Configure CI for a newly added Gem:
-#### Desired use cases
+ - Add `gems/<name-of-gem>/.gitlab-ci.yml`:
-The `gitlab-utils` is a Gem containing as of set of class that implement common intrisic functions
+ ```yaml
+ include:
+ - local: gems/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "<name-of-gem>"
+ ```
+
+ - To `.gitlab/ci/gitlab-gems.gitlab-ci.yml` add:
+
+ ```yaml
+ include:
+ - local: .gitlab/ci/templates/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "<name-of-gem>"
+ ```
+
+1. Reference Gem in `Gemfile` with:
+
+ ```ruby
+ gem '<name-of-gem>', path: 'gems/<name-of-gem>'
+ ```
+
+### Examples of Gem extractions
+
+The `gitlab-utils` is a Gem containing as of set of class that implement common intrinsic functions
used by GitLab developers, like `strong_memoize` or `Gitlab::Utils.to_boolean`.
The `gitlab-database-schema-migrations` is a potential Gem containing our extensions to Rails
@@ -72,7 +162,7 @@ or potentially be upstreamed.
The `gitlab-database-load-balancing` similar to previous is a potential Gem to implement GitLab specific
load balancing to Rails database handling. Since this is rather complex and highly specific code
-maintaing it's complexity in a isolated and well tested Gem would help with removing this complexity
+maintaining its complexity in a isolated and well tested Gem would help with removing this complexity
from a big monolithic codebase.
The `gitlab-flipper` is another potential Gem implementing all our custom extensions to support feature
@@ -81,18 +171,10 @@ usage, adding consistency checks and various helpers to track owners of feature
not really part of GitLab business logic and could be used to better track our implementation
of Flipper and possibly much easier change it to dogfood [GitLab Feature Flags](../operations/feature_flags.md).
-The `gitlab-ci-reports-parsers` is a potential Gem that could implement all various parsers for various formats.
-The parsed output would be transformed into objects that could then be used by GitLab the application
-to store it in the database. This functionality could be an additional Gem since it is isolated,
-rarely changed, and GitLab Rails only consumes the data.
-
-The same pattern could be applied to all other type of parsers, like security vulnerabilities, or any
-other complex structures that need to be transformed into a form that is consumed by GitLab Rails.
-
-The `gitlab-active_record` is a gem adding GitLab specific Active Record patches.
+The `activerecord-gitlab` is a gem adding GitLab specific Active Record patches.
It is very well desired for such to be managed separately to isolate complexity.
-#### Other potential use cases
+### Other potential use cases
The `gitlab-ci-config` is a potential Gem containing all our CI code used to parse `.gitlab-ci.yml`.
This code is today lightly interlocked with GitLab the application due to lack of proper abstractions.
@@ -101,103 +183,6 @@ with GitLab the application. The interface would for example define an adapter t
Once we would have a `gitlab-ci-config` Gem it could be used within GitLab and outside of GitLab Rails
and [GitLab CLI](https://gitlab.com/gitlab-org/cli).
-### Create and use a new Gem
-
-You can see example adding new Gem: [!121676](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/121676).
-
-1. Create a new Ruby Gem in `gems/gitlab-<name-of-gem>` with `bundle gem gems/gitlab-<name-of-gem> --no-exe --no-coc --no-ext --no-mit`.
-1. Edit or remove `gitlab-<name-of-gem>/README.md` to provide a simple one paragraph description of the Gem.
-1. Edit `gitlab-<name-of-gem>/gitlab-<name-of-gem>.gemspec` and fill the details about the Gem as in the following example:
-
- ```ruby
- Gem::Specification.new do |spec|
- spec.name = "gitlab-<name-of-gem>"
- spec.version = Gitlab::NameOfGem::VERSION
- spec.authors = ["group::tenant-scale"]
- spec.email = ["engineering@gitlab.com"]
-
- spec.summary = "GitLab's RSpec extensions"
- spec.description = "A set of useful helpers to configure RSpec with various stubs and CI configs."
- spec.homepage = "https://gitlab.com/gitlab-org/gitlab/-/tree/master/gems/gitlab-<name-of-gem>"
- spec.required_ruby_version = ">= 2.6.0"
- end
- ```
-
-1. Update `gems/gitlab-<name-of-gem>/.rubocop` with:
-
- ```yaml
- inherit_from:
- - ../../.rubocop.yml
-
- CodeReuse/ActiveRecord:
- Enabled: false
-
- AllCops:
- TargetRubyVersion: 3.0
-
- Naming/FileName:
- Exclude:
- - spec/**/*.rb
- ```
-
-1. Configure CI for a newly added Gem:
-
-- Add `gems/gitlab-<name-of-gem>/.gitlab-ci.yml`:
-
- ```yaml
- workflow:
- rules:
- - if: $CI_MERGE_REQUEST_ID
-
- rspec:
- image: "ruby:${RUBY_VERSION}"
- cache:
- key: gitlab-<name-of-gem>
- paths:
- - gitlab-<name-of-gem>/vendor/ruby
- before_script:
- - cd vendor/gems/bundler-checksum
- - ruby -v # Print out ruby version for debugging
- - gem install bundler --no-document # Bundler is not installed with the image
- - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby
- - bundle config set with 'development'
- - bundle config set --local frozen 'true' # Disallow Gemfile.lock changes on CI
- - bundle config # Show bundler configuration
- - bundle install -j $(nproc)
- script:
- - bundle exec rspec
- parallel:
- matrix:
- - RUBY_VERSION: ["2.7", "3.0", "3.1", "3.2"]
- ```
-
-- To `.gitlab/ci/rules.gitlab-ci.yml` add:
-
- ```yaml
- .gems:rules:gitlab-<name-of-gem>:
- rules:
- - <<: *if-merge-request
- changes: ["gems/gitlab-<name-of-gem>/**/*"]
- ```
-
-- To `.gitlab/ci/gitlab-gems.gitlab-ci.yml` add:
-
- ```yaml
- gems gitlab-<name-of-gem>:
- extends:
- - .gems:rules:gitlab-<name-of-gem>
- needs: []
- trigger:
- include: gems/gitlab-<name-of-gem>/.gitlab-ci.yml
- strategy: depend
- ```
-
-1. Reference Gem in `Gemfile` with:
-
- ```ruby
- gem 'gitlab-<name-of-gem>', path: 'gems/gitlab-<name-of-gem>'
- ```
-
## In the external repo
In general, we want to think carefully before doing this as there are
@@ -319,3 +304,13 @@ to store them in monorepo:
- It is expected that vendored gems might be published by third-party.
- Those Gems will not be published by us to RubyGems.
- Those Gems will be referenced via `path:` in `Gemfile`, since we cannot depend on RubyGems.
+
+## Reserve a gem name
+
+We reserve a gem name as a precaution **before publishing any public code that contains a new gem**, to avoid name-squatters taking over the name in RubyGems.
+
+To reserve a gem name, follow the steps to [Create and publish a Ruby gem](#create-and-publish-a-ruby-gem), with the following changes:
+
+- Use `0.0.0` as the version.
+- Include a single file `lib/NAME.rb` with the content `raise "Reserved for GitLab"`.
+- Perform the `build` and `publish`, and check <https://rubygems.org/gems/> to confirm it succeeded.
diff --git a/doc/development/geo.md b/doc/development/geo.md
index 5d09532afcb..a39f97f1241 100644
--- a/doc/development/geo.md
+++ b/doc/development/geo.md
@@ -111,7 +111,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 Area](../user/admin_area/geo_sites.md).
+ [Geo Admin Area](../administration/geo_sites.md).
When we fail to fetch a repository on the secondary `RETRIES_BEFORE_REDOWNLOAD`
times, Geo does a so-called _re-download_. It will do a clean clone
@@ -425,18 +425,17 @@ not used, so sessions and so on, aren't shared between sites.
## Object Storage
GitLab can optionally use Object Storage to store data it would
-otherwise store on disk. These things can be:
+otherwise store on disk. For example:
- LFS Objects
- CI Job Artifacts
- Uploads
-Objects that are stored in object storage, are not handled by Geo. Geo
-ignores items in object storage. Either:
+By default, Geo does not replicate objects that are stored in object storage. Depending on the situation and needs of the customer, they can:
-- The object storage layer should take care of its own geographical
- replication.
-- All secondary sites should use the same storage site.
+- [Enable GitLab-managed object storage replication](../administration/geo/replication/object_storage.md#enabling-gitlab-managed-object-storage-replication).
+- Use their cloud provider's built-in services to replicate object storage across Geo sites.
+- Configure secondary Geo sites to access the same object storage endpoint as the primary site.
## Verification
@@ -467,7 +466,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 Area](../user/admin_area/geo_sites.md).
+and the administrator can see this in the [Geo Admin Area](../administration/geo_sites.md).
## Geo proxying
@@ -679,7 +678,14 @@ on, check out our [self-service framework](geo/framework.md).
### GET:Geo pipeline
-As part of the [e2e:package-and-test](testing_guide/end_to_end/index.md#using-the-package-and-test-job) pipeline, there is an option to manually trigger a job named `GET:Geo`. This pipeline uses [GET](https://gitlab.com/gitlab-org/gitlab-environment-toolkit) to spin up a
+After triggering a successful [e2e:package-and-test-ee](testing_guide/end_to_end/index.md#using-the-package-and-test-job) pipeline, you can manually trigger a job named `GET:Geo`:
+
+1. In the [GitLab project](https://gitlab.com/gitlab-org/gitlab), select the **Pipelines** tab of a merge request.
+1. Select the `Stage: qa` stage on the latest pipeline to expand and list all the related jobs.
+1. Select `trigger-omnibus` to view the [Omnibus GitLab Mirror](https://gitlab.com/gitlab-org/build/omnibus-gitlab-mirror) pipeline corresponding to the merge request.
+1. The `GET:Geo` job can be found and triggered under the `trigger-qa` stage.
+
+This pipeline uses [GET](https://gitlab.com/gitlab-org/gitlab-environment-toolkit) to spin up a
[1k](../administration/reference_architectures/1k_users.md) Geo installation,
and run the [`gitlab-qa`](https://gitlab.com/gitlab-org/gitlab-qa) Geo scenario against the instance.
When working on Geo features, it is a good idea to ensure the `qa-geo` job passes in a triggered `GET:Geo pipeline`.
@@ -694,7 +700,7 @@ see the [QA documentation](https://gitlab.com/gitlab-org/gitlab/-/tree/master/qa
The pipeline involves the interaction of multiple different projects:
-- [GitLab](https://gitlab.com/gitlab-org/gitlab) - The [`e2e:package-and-test` job](testing_guide/end_to_end/index.md#using-the-package-and-test-job) is launched from merge requests in this project.
+- [GitLab](https://gitlab.com/gitlab-org/gitlab) - The [`e2e:package-and-test-ee` job](testing_guide/end_to_end/index.md#using-the-package-and-test-job) is launched from merge requests in this project.
- [`omnibus-gitlab`](https://gitlab.com/gitlab-org/omnibus-gitlab) - Builds relevant artifacts containing the changes from the triggering merge request pipeline.
- [GET-Configs/Geo](https://gitlab.com/gitlab-org/quality/gitlab-environment-toolkit-configs/Geo) - Coordinates the lifecycle of a short-lived Geo installation that can be evaluated.
- [GET](https://gitlab.com/gitlab-org/gitlab-environment-toolkit) - Contains the necessary logic for creating and destroying Geo installations. Used by `GET-Configs/Geo`.
diff --git a/doc/development/git_object_deduplication.md b/doc/development/git_object_deduplication.md
index e98ebe5efe1..961bfca0d9b 100644
--- a/doc/development/git_object_deduplication.md
+++ b/doc/development/git_object_deduplication.md
@@ -56,7 +56,7 @@ identical to) the fork networks that get formed when users fork
projects.
At the Git level, pool repositories are created and managed using Gitaly
-RPC calls. Just like with normal repositories, the authority on which
+RPC calls. Just like with typical repositories, the authority on which
pool repositories exist, and which repositories borrow from them, lies
at the Rails application level in SQL.
@@ -144,7 +144,7 @@ are as follows:
### Consequences
-- If a normal Project participating in a pool gets moved to another
+- If a typical Project participating in a pool gets moved to another
Gitaly storage shard, its "belongs to PoolRepository" relation will
be broken. Because of the way moving repositories between shard is
implemented, we get a fresh self-contained copy
diff --git a/doc/development/gitaly.md b/doc/development/gitaly.md
index d2232d750b2..e6a853c107e 100644
--- a/doc/development/gitaly.md
+++ b/doc/development/gitaly.md
@@ -116,7 +116,7 @@ Please raise an issue in the GitLab CE or EE repositories to report the issue. I
~performance ~"technical debt". Please ensure that the issue contains the full stack trace and error message of the
`TooManyInvocationsError`. Also include any known failing tests if possible.
-Isolate the source of the n+1 problem. This is normally a loop that results in Gitaly being called for each
+Isolate the source of the n+1 problem. This is usually a loop that results in Gitaly being called for each
element in an array. If you are unable to isolate the problem, please contact a member
of the [Gitaly Team](https://gitlab.com/groups/gl-gitaly/group_members) for assistance.
@@ -152,7 +152,7 @@ end
## Running tests with a locally modified version of Gitaly
-Normally, GitLab CE/EE tests use a local clone of Gitaly in
+Usually, GitLab CE/EE tests use a local clone of Gitaly in
`tmp/tests/gitaly` pinned at the version specified in
`GITALY_SERVER_VERSION`. The `GITALY_SERVER_VERSION` file supports also
branches and SHA to use a custom commit in [the repository](https://gitlab.com/gitlab-org/gitaly).
@@ -185,7 +185,7 @@ to manually run `make` again.
Note that CI tests do not use your locally modified version of
Gitaly. To use a custom Gitaly version in CI, you must update
-GITALY_SERVER_VERSION as described at the beginning of this section.
+`GITALY_SERVER_VERSION` as described at the beginning of this section.
To use a different Gitaly repository, such as if your changes are present
on a fork, you can specify a `GITALY_REPO_URL` environment variable when
diff --git a/doc/development/gitlab_flavored_markdown/specification_guide/index.md b/doc/development/gitlab_flavored_markdown/specification_guide/index.md
index ae78daa3687..562fd445ab3 100644
--- a/doc/development/gitlab_flavored_markdown/specification_guide/index.md
+++ b/doc/development/gitlab_flavored_markdown/specification_guide/index.md
@@ -124,7 +124,7 @@ to report this.
#### Official specifications vs internal extensions
-Within GFM and GLFM respectively, both GitHub and GitLab have two "sets" of Markdown they support:
+GFM for GitHub and GLFM for GitLab have two "sets" of Markdown they support:
- Official specification
- Internal extensions
@@ -133,10 +133,10 @@ The following taxonomy chart shows the taxonomy and terminology of the various s
```mermaid
graph TD
-CM[CommonMark - spec.txt - e.g. headings] --- GFMS[GFM Specification - spec.txt - e.g. strikethrough extension]
-GFMS --- GLFM[GLFM Specification - e.g. color chips]
-GFMS --- GFMI[GFM internal extensions - e.g. GitHub-specific references]
-GLFM --- GLFS[GLFM internal extensions - e.g. GitLab-specific references]
+CM[CommonMark - spec.txt - for example, headings] --- GFMS[GFM Specification - spec.txt - for example, strikethrough extension]
+GFMS --- GLFM[GLFM Specification - for example, color chips]
+GFMS --- GFMI[GFM internal extensions - for example, GitHub-specific references]
+GLFM --- GLFS[GLFM internal extensions - for example, GitLab-specific references]
```
##### Official specifications
@@ -297,9 +297,9 @@ The Markdown dialect used in the GitLab application has a dual requirement for r
1. Rendering to static read-only HTML format, to be displayed in various
places throughout the application.
1. Rendering editable content in the
- [Content Editor](https://about.gitlab.com/direction/plan/knowledge/content_editor/),
+ [rich text editor](https://about.gitlab.com/direction/plan/knowledge/content_editor/),
a ["What You See Is What You Get" (WYSIWYG)](https://en.wikipedia.org/wiki/WYSIWYG)
- editor. The Content Editor supports real-time instant switching between an editable
+ editor. The rich text editor supports real-time instant switching between an editable
Markdown source and an editable WYSIWYG document.
These requirements means that GitLab has two independent parser and renderer
@@ -312,14 +312,14 @@ implementations:
GitHub's fork of the reference parser for CommonMark. `libcmark-gfm` is an extended
version of the C reference implementation of [CommonMark](https://commonmark.org/)
1. The frontend parser / renderer supports parsing and _WYSIWYG_ rendering for
- the Content Editor. It is implemented in JavaScript. Parsing is based on the
+ the rich text editor. It is implemented in JavaScript. Parsing is based on the
[Remark](https://github.com/remarkjs/remark) Markdown parser, which produces a
MDAST Abstract Syntax Tree (MDAST). Rendering is the process of turning
an MDAST into a [ProseMirror document](../../fe_guide/content_editor.md). Then,
ProseMirror is used to render a ProseMirror document to WYSIWYG HTML. In this
document, we refer to the process of turning Markdown into an MDAST as the
_frontend / JavaScript parser_, and the entire process of rendering Markdown
- to WYSIWYG HTML in ProseMirror as the _Content Editor_. Several
+ to WYSIWYG HTML in ProseMirror as the _rich text editor_. Several
requirements drive the need for an independent frontend parser / renderer
implementation, including:
1. Lack of necessary support for accurate source mapping in the HTML renderer
@@ -356,7 +356,7 @@ used when running [Markdown snapshot testing](#markdown-snapshot-testing).
#### WYSIWYG HTML
-**WYSIWYG HTML** is HTML produced by the frontend (JavaScript) Content Editor,
+**WYSIWYG HTML** is HTML produced by the frontend (JavaScript) rich text editor,
which includes parsing and rendering logic. It is used to present an editable document
in the ProseMirror WYSIWYG editor.
@@ -472,7 +472,7 @@ generating the HTML for footnote examples. Even though it is in the production c
no effect unless it is explicitly set, therefore it is innocuous. It allows us to avoid
the more-complex regex-based normalization described below.
-The current example of this is when normally random footnote IDs are overridden to be deterministic
+The current example of this is when footnote IDs that are usually random are overridden to be deterministic
by setting `GITLAB_TEST_FOOTNOTE_ID`. It is set along with the fixtures setup in the
[`spec/support/shared_contexts/glfm/example_snapshot_fixtures.rb`](https://gitlab.com/gitlab-org/gitlab/blob/master/spec/support/shared_contexts/glfm/example_snapshot_fixtures.rb)
shared context.
@@ -554,9 +554,9 @@ specification and testing infrastructure:
1. The frontend (JavaScript) parser and renderer (which includes GitLab custom
code and Remark) can convert Markdown to the expected ProseMirror JSON
representing a ProseMirror document.
- 1. The **Content Editor** (which includes the frontend (JavaScript) parser and renderer,
+ 1. The **rich text editor** (which includes the frontend (JavaScript) parser and renderer,
and ProseMirror) can convert Markdown to the expected custom WYSIWYG HTML as rendered by ProseMirror.
- 1. The **Content Editor** can complete a round-trip test, which involves converting
+ 1. The **rich text editor** can complete a round-trip test, which involves converting
from Markdown, to MDAST, to ProseMirror Document, then back to Markdown. It ensures
the resulting Markdown is exactly identical, with no differences.
@@ -734,10 +734,10 @@ Markdown snapshot testing RSpec and Jest `*_spec` files (from main app `spec` fo
which are driven by `example_snapshot` YAML files.
The actual RSpec and Jest test `*_spec` files (frontend and backend) live
-under the normal relevant locations under `spec`, matching the location of their
+under the usual relevant locations under `spec`, matching the location of their
corresponding implementations. They can be run either:
-- As part of the normal pipelines.
+- As part of the standard pipelines.
- From the command line or an IDE, just like any other file under `spec`.
However, they are spread across four different locations:
@@ -1329,7 +1329,7 @@ Three types of entries exist, with different HTML for each:
- **WYSIWYG**
- The WYSIWYG (frontend, JavaScript-generated) HTML for each entry in
`glfm_specification/output_example_snapshots/examples_index.yml`.
- - It is generated (or updated) from the frontend Content Editor implementation via the
+ - It is generated (or updated) from the frontend rich text editor implementation via the
`update-example-snapshots.rb` script. It can be manually updated for WYSIWYG
examples with incomplete implementations.
@@ -1411,5 +1411,5 @@ This section describes how the scripts can be used to manage the GLFM specificat
1. Visually inspect and confirm any resulting changes to the [example snapshot files](#output-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. All frontend and backend tests are also run as part of the continuous integration suite, as they typically are.
1. Commit any changes to the [input specification files](#input-specification-files), [output specification files](#output-specification-files), or [example snapshot files](#output-example-snapshot-files).
diff --git a/doc/development/graphql_guide/batchloader.md b/doc/development/graphql_guide/batchloader.md
index 6a716de61b8..5f06f1faf1e 100644
--- a/doc/development/graphql_guide/batchloader.md
+++ b/doc/development/graphql_guide/batchloader.md
@@ -41,8 +41,8 @@ class UserResolver < BaseResolver
end
```
-- `project_id` is the `ID` of the current project being queried
-- `loader.call` is used to map the result back to the input key (here a project ID)
+- `username` is the username we want to query. It can be one name or multiple names.
+- `loader.call` is used to map the result back to the input key (here user is mapped to its username)
- `BatchLoader::GraphQL` returns a lazy object (suspended promise to fetch the data)
Here an [example MR](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/46549) illustrating how to use our `BatchLoading` mechanism.
@@ -161,7 +161,7 @@ you do so, you do not need to manage the lifecycle of lazy values yourself, and
you are assured accurate results.
GraphQL fields that return lazy values may need these values forced in tests.
-Forcing refers to explicit demands for evaluation, where this would normally
+Forcing refers to explicit demands for evaluation, where this would usually
be arranged by the framework.
You can force a lazy value with the `GraphqlHelpers#batch_sync` method available in [GraphQLHelpers](https://gitlab.com/gitlab-org/gitlab/-/blob/master/spec/support/helpers/graphql_helpers.rb), or by using `Gitlab::Graphql::Lazy.force`. For example:
diff --git a/doc/development/import_export.md b/doc/development/import_export.md
index b8493ef7a6e..9a7944ae308 100644
--- a/doc/development/import_export.md
+++ b/doc/development/import_export.md
@@ -46,8 +46,9 @@ The `AttributeConfigurationSpec` checks and confirms the addition of new columns
<<-MSG
It looks like #{relation_class}, which is exported using the project Import/Export, has new attributes:
- Please add the attribute(s) to SAFE_MODEL_ATTRIBUTES if you consider this can be exported.
- Otherwise, please blacklist the attribute(s) in IMPORT_EXPORT_CONFIG by adding it to its correspondent
+ Please add the attribute(s) to SAFE_MODEL_ATTRIBUTES if they can be exported.
+
+ Please denylist the attribute(s) in IMPORT_EXPORT_CONFIG by adding it to its corresponding
model in the +excluded_attributes+ section.
SAFE_MODEL_ATTRIBUTES: #{File.expand_path(safe_attributes_file)}
diff --git a/doc/development/integrations/index.md b/doc/development/integrations/index.md
index b51a2799088..bd672c86b28 100644
--- a/doc/development/integrations/index.md
+++ b/doc/development/integrations/index.md
@@ -310,7 +310,7 @@ see the [feature deprecation guidelines](../../development/deprecation_guideline
You must announce any deprecation [no later than the third milestone preceding intended removal](../../development/deprecation_guidelines/index.md#when-can-a-feature-be-deprecated).
To deprecate an integration:
-- [Add a deprecation entry](../../development/deprecation_guidelines/index.md#update-the-deprecations-and-removals-documentation-pages).
+- [Add a deprecation entry](../../development/deprecation_guidelines/index.md#update-the-deprecations-and-removals-documentation).
- [Mark the integration documentation as deprecated](../../development/documentation/versions.md#deprecate-a-page-or-topic).
- Optional. To prevent any new project-level records from
being created, add the integration to `Project#disabled_integrations` (see [example merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/114835)).
@@ -324,7 +324,6 @@ In the major milestone of intended removal (M.0), disable the integration and de
- Remove the integration from `Integration::INTEGRATION_NAMES`.
- Delete the integration model's `#execute` and `#test` methods (if defined), but keep the model.
- Add a post-migration to delete the integration records from PostgreSQL (see [example merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/114721)).
-- [Add a removal entry](../../development/deprecation_guidelines/index.md#update-the-deprecations-and-removals-documentation-pages).
- [Mark the integration documentation as removed](../../development/documentation/versions.md#remove-a-page).
- [Update the integration API documentation](../../api/integrations.md).
diff --git a/doc/development/integrations/secure.md b/doc/development/integrations/secure.md
index ee94e57a247..09778127050 100644
--- a/doc/development/integrations/secure.md
+++ b/doc/development/integrations/secure.md
@@ -577,8 +577,8 @@ All other attributes are optional.
##### SAST
-The `location` of a SAST vulnerability must have a `file` and a `start_line` field,
-giving the path of the affected file, and the affected line number, respectively.
+The `location` of a SAST vulnerability must have a `file` that gives the path of the affected file and
+a `start_line` field with the affected line number.
It may also have an `end_line`, a `class`, and a `method`.
For instance, here is the `location` object for a security flaw found
@@ -626,19 +626,14 @@ This is addressed in [issue #7586](https://gitlab.com/gitlab-org/gitlab/-/issues
See also [deduplication process](../../user/application_security/vulnerability_report/pipeline.md#deduplication-process).
-##### Severity and confidence
+##### Severity
-The `severity` field describes how much the vulnerability impacts the software,
-whereas the `confidence` field describes how reliable the assessment of the vulnerability is.
+The `severity` field describes how badly the vulnerability impacts the software.
The severity is used to sort the vulnerabilities in the security dashboard.
The severity ranges from `Info` to `Critical`, but it can also be `Unknown`.
Valid values are: `Unknown`, `Info`, `Low`, `Medium`, `High`, or `Critical`
-The confidence ranges from `Low` to `Confirmed`, but it can also be `Unknown`,
-`Experimental` or even `Ignore` if the vulnerability is to be ignored.
-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#data-provided-by-analyzers)
of the available SAST Analyzers and what data is currently available.
diff --git a/doc/development/internal_analytics/internal_events/index.md b/doc/development/internal_analytics/internal_events/index.md
new file mode 100644
index 00000000000..cbc7b73a282
--- /dev/null
+++ b/doc/development/internal_analytics/internal_events/index.md
@@ -0,0 +1,98 @@
+---
+stage: Analytics
+group: Analytics Instrumentation
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Internal Events development guidelines
+
+In an effort to provide a more efficient, scalable, and unified tracking API, GitLab is deprecating existing RedisHLL and Snowplow tracking. Instead, we're implementing a new `track_event` method.
+With this approach, we can both update RedisHLL counters and send Snowplow events simultaneously, streamlining the tracking process.
+
+## Create and trigger events
+
+### Backend tracking
+
+To trigger an event, call the `Gitlab::InternalEvents.track_event` method with the desired arguments:
+
+```ruby
+Gitlab::InternalEvents.track_event(
+ "i_code_review_user_apply_suggestion",
+ user_id: user_id,
+ namespace_id: namespace_id,
+ project_id: project_id
+ )
+```
+
+This method automatically increments all RedisHLL metrics relating to the event `i_code_review_user_apply_suggestion`, and sends a corresponding Snowplow event with all named arguments and standard context (SaaS only).
+
+### Frontend tracking
+
+#### Vue components
+
+In Vue components, tracking can be done with [Vue mixin](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/assets/javascripts/tracking/internal_events.js#L29).
+
+To implement Vue component tracking:
+
+1. Import the `InternalEvents` library and call the `mixin` method:
+
+ ```javascript
+ import { InternalEvents } from '~/tracking';
+ const trackingMixin = InternalEvents.mixin();
+ ```
+
+1. Use the mixin in the component:
+
+ ```javascript
+ export default {
+ mixins: [trackingMixin],
+
+ data() {
+ return {
+ expanded: false,
+ };
+ },
+ };
+ ```
+
+1. Call the `track_event` method. Tracking options can be passed as the second parameter:
+
+ ```javascript
+ this.track_event('i_code_review_user_apply_suggestion');
+ ```
+
+ Or use the `track_event` method in the template:
+
+ ```html
+ <template>
+ <div>
+ <button data-testid="toggle" @click="toggle">Toggle</button>
+
+ <div v-if="expanded">
+ <p>Hello world!</p>
+ <button @click="track_event('i_code_review_user_apply_suggestion')">Track another event</button>
+ </div>
+ </div>
+ </template>
+ ```
+
+#### Raw JavaScript
+
+For tracking events directly from arbitrary frontend JavaScript code, a module for raw JavaScript is provided. This can be used outside of a component context where the Mixin cannot be utilized.
+
+```javascript
+import { InternalEvents } from '~/tracking';
+InternalEvents.track_event('i_code_review_user_apply_suggestion');
+```
+
+#### Data-track attribute
+
+This attribute ensures that if we want to track GitLab internal events for a button, we do not need to write JavaScript code on Click handler. Instead, we can just add a data-event-tracking attribute with event value and it should work. This can also be used with haml views.
+
+```html
+ <gl-button
+ data-event-tracking="i_analytics_dev_ops_adoption"
+ >
+ Click Me
+ </gl-button>
+```
diff --git a/doc/development/internal_analytics/service_ping/implement.md b/doc/development/internal_analytics/service_ping/implement.md
index 0dfc3806712..3b8243377a3 100644
--- a/doc/development/internal_analytics/service_ping/implement.md
+++ b/doc/development/internal_analytics/service_ping/implement.md
@@ -501,7 +501,7 @@ We can disable tracking completely by using the global flag:
##### Known events are added automatically in Service Data payload
-Service Ping adds all events [`known_events/*.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events) to Service Data generation under the `redis_hll_counters` key. This column is stored in [version-app as a JSON](https://gitlab.com/gitlab-services/version-gitlab-com/-/blob/master/db/schema.rb#L209).
+Service Ping adds all events [`known_events/*.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events) to Service Data generation under the `redis_hll_counters` key. This column is stored in [version-app as a JSON](https://gitlab.com/gitlab-org/gitlab-services/version.gitlab.com/-/blob/main/db/schema.rb#L213).
For each event we add metrics for the weekly and monthly time frames, and totals for each where applicable:
- `#{event_name}_weekly`: Data for 7 days for daily [aggregation](#add-new-events) events and data for the last complete week for weekly [aggregation](#add-new-events) events.
@@ -680,7 +680,7 @@ See the [Metrics Dictionary guide](metrics_dictionary.md) for more information.
## Add the metric to the Versions Application
-Check if the new metric must be added to the Versions Application. See the `usage_data` [schema](https://gitlab.com/gitlab-services/version-gitlab-com/-/blob/master/db/schema.rb#L147) and Service Data [parameters accepted](https://gitlab.com/gitlab-services/version-gitlab-com/-/blob/master/app/services/usage_ping.rb). Any metrics added under the `counts` key are saved in the `stats` column.
+Check if the new metric must be added to the Versions Application. See the `usage_data` [schema](https://gitlab.com/gitlab-org/gitlab-services/version.gitlab.com/-/blob/main/db/schema.rb#L152) and Service Data [parameters accepted](https://gitlab.com/gitlab-org/gitlab-services/version.gitlab.com/-/blob/main/app/services/usage_ping.rb). Any metrics added under the `counts` key are saved in the `stats` column.
## Create a merge request
@@ -715,7 +715,7 @@ To set up Service Ping locally, you must:
### Set up local repositories
1. Clone and start [GitLab](https://gitlab.com/gitlab-org/gitlab-development-kit).
-1. Clone and start [Versions Application](https://gitlab.com/gitlab-services/version-gitlab-com).
+1. Clone and start [Versions Application](https://gitlab.com/gitlab-org/gitlab-services/version.gitlab.com).
Make sure you run `docker-compose up` to start a PostgreSQL and Redis instance.
1. Point GitLab to the Versions Application endpoint instead of the default endpoint:
1. Open [service_ping/submit_service.rb](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/services/service_ping/submit_service.rb#L5) locally and modify `STAGING_BASE_URL`.
@@ -783,7 +783,7 @@ By default, it comes with a fully configured Prometheus service that is set up t
However, it has the following limitations:
- It does not run a `gitlab-exporter` instance, so several `process_*` metrics from services such as Gitaly may be missing.
-- While it runs a `node_exporter`, `docker-compose` services emulate hosts, meaning that it normally reports itself as not associated
+- While it runs a `node_exporter`, `docker-compose` services emulate hosts, meaning that it usually reports itself as not associated
with any of the other running services. That is not how node metrics are reported in a production setup, where `node_exporter`
always runs as a process alongside other GitLab components on any given node. For Service Ping, none of the node data would therefore
appear to be associated to any of the services running, because they all appear to be running on different hosts. To alleviate this problem, the `node_exporter` in GCK was arbitrarily "assigned" to the `web` service, meaning only for this service `node_*` metrics appears in Service Ping.
diff --git a/doc/development/internal_analytics/service_ping/index.md b/doc/development/internal_analytics/service_ping/index.md
index 69d37f0dae2..22e66a247c9 100644
--- a/doc/development/internal_analytics/service_ping/index.md
+++ b/doc/development/internal_analytics/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.
-Service Ping is enabled by default. However, 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.
+Service Ping is enabled by default. However, you can [disable](../../../administration/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.
## Service Ping terminology
diff --git a/doc/development/internal_analytics/service_ping/metrics_dictionary.md b/doc/development/internal_analytics/service_ping/metrics_dictionary.md
index d1f1c0b595a..f56955ed422 100644
--- a/doc/development/internal_analytics/service_ping/metrics_dictionary.md
+++ b/doc/development/internal_analytics/service_ping/metrics_dictionary.md
@@ -40,7 +40,7 @@ Each metric is defined in a separate YAML file consisting of a number of fields:
| `value_type` | yes | `string`; one of [`string`, `number`, `boolean`, `object`](https://json-schema.org/understanding-json-schema/reference/type.html). |
| `status` | yes | `string`; [status](#metric-statuses) of the metric, may be set to `active`, `removed`, `broken`. |
| `time_frame` | yes | `string`; may be set to a value like `7d`, `28d`, `all`, `none`. |
-| `data_source` | yes | `string`; may be set to a value like `database`, `redis`, `redis_hll`, `prometheus`, `system`, `license`. |
+| `data_source` | yes | `string`; may be set to a value like `database`, `redis`, `redis_hll`, `prometheus`, `system`, `license`, `internal_events`. |
| `data_category` | yes | `string`; [categories](#data-category) of the metric, may be set to `operational`, `optional`, `subscription`, `standard`. The default value is `optional`.|
| `instrumentation_class` | yes | `string`; [the class that implements the metric](metrics_instrumentation.md). |
| `distribution` | yes | `array`; may be set to one of `ce, ee` or `ee`. The [distribution](https://about.gitlab.com/handbook/marketing/brand-and-product-marketing/product-and-solution-marketing/tiers/#definitions) where the tracked feature is available. |
@@ -135,7 +135,7 @@ For more information about the aggregation type of each feature, see the [`commo
| data_source | time_frame | aggregation | Description |
|------------------------|------------|----------------|-------------------------------------------------|
-| any | `none` | not applicable | A type of data that’s not tracked over time, such as settings and configuration information |
+| any | `none` | not applicable | A type of data that's not tracked over time, such as settings and configuration information |
| `database` | `all` | not applicable | The whole time the metric has been active (all-time interval) |
| `database` | `7d` | not applicable | 9 days ago to 2 days ago |
| `database` | `28d` | not applicable | 30 days ago to 2 days ago |
@@ -150,7 +150,7 @@ For more information about the aggregation type of each feature, see the [`commo
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](../../../user/admin_area/settings/usage_statistics.md#enable-or-disable-usage-statistics) in the Admin Area.
+- `optional`: Default value for a metric. Data that is optional to collect. This can be [enabled or disabled](../../../administration/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/internal_analytics/service_ping/metrics_instrumentation.md b/doc/development/internal_analytics/service_ping/metrics_instrumentation.md
index b6ca773a572..dc225a40d1b 100644
--- a/doc/development/internal_analytics/service_ping/metrics_instrumentation.md
+++ b/doc/development/internal_analytics/service_ping/metrics_instrumentation.md
@@ -403,6 +403,36 @@ module Gitlab
end
```
+## Prometheus metrics
+
+This instrumentation class lets you handle Prometheus queries by passing a Prometheus client object as an argument to the `value` block.
+Any Prometheus error handling should be done in the block itself.
+
+- `value`: Specifies the value of the metric. A Prometheus client object is passed as the first argument.
+- `available?`: Specifies whether the metric should be reported. The default is `true`.
+
+[Example of a merge request that adds a Prometheus metric](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/122400).
+
+```ruby
+module Gitlab
+ module Usage
+ module Metrics
+ module Instrumentations
+ class GitalyApdexMetric < PrometheusMetric
+ value do |client|
+ result = client.query('avg_over_time(gitlab_usage_ping:gitaly_apdex:ratio_avg_over_time_5m[1w])').first
+
+ break FALLBACK unless result
+
+ result['value'].last.to_f
+ end
+ end
+ end
+ end
+ end
+end
+```
+
## Support for instrumentation classes
There is support for:
diff --git a/doc/development/internal_analytics/service_ping/metrics_lifecycle.md b/doc/development/internal_analytics/service_ping/metrics_lifecycle.md
index cc56863690c..7aa0eaa1554 100644
--- a/doc/development/internal_analytics/service_ping/metrics_lifecycle.md
+++ b/doc/development/internal_analytics/service_ping/metrics_lifecycle.md
@@ -51,16 +51,16 @@ To remove a metric:
to inform administrators of the progress of DevOps adoption for the instance.
You can check
- [`CalculateConvIndexService`](https://gitlab.com/gitlab-services/version-gitlab-com/-/blob/master/app/services/calculate_conv_index_service.rb)
+ [`CalculateConvIndexService`](https://gitlab.com/gitlab-org/gitlab-services/version.gitlab.com/-/blob/main/app/services/calculate_conv_index_service.rb)
to view the metrics that are used. The metrics are represented
as the keys that are passed as a field argument into the `get_value` method.
1. Verify that removing the metric from the Service Ping payload does not cause
- errors in [Version App](https://gitlab.com/gitlab-services/version-gitlab-com)
+ errors in [Version App](https://gitlab.com/gitlab-org/gitlab-services/version.gitlab.com)
when the updated payload is collected and processed. Version App collects
and persists all Service Ping reports. To verify Service Ping processing in your local development environment, follow this [guide](https://www.youtube.com/watch?v=FS5emplabRU).
- Alternatively, you can modify [fixtures](https://gitlab.com/gitlab-services/version-gitlab-com/-/blob/master/spec/support/usage_data_helpers.rb#L540)
- used to test the [`UsageDataController#create`](https://gitlab.com/gitlab-services/version-gitlab-com/-/blob/3760ef28/spec/controllers/usage_data_controller_spec.rb#L75)
+ Alternatively, you can modify [fixtures](https://gitlab.com/gitlab-org/gitlab-services/version.gitlab.com/-/blob/main/spec/support/usage_data_helpers.rb)
+ used to test the [`UsageDataController#create`](https://gitlab.com/gitlab-org/gitlab-services/version.gitlab.com/-/blob/main/spec/controllers/usage_data_controller_spec.rb)
endpoint, and assure that test suite does not fail when metric that you wish to remove is not included into test payload.
1. Remove data from Redis
diff --git a/doc/development/internal_analytics/service_ping/troubleshooting.md b/doc/development/internal_analytics/service_ping/troubleshooting.md
index 2b285b85bd0..7f7b4099d48 100644
--- a/doc/development/internal_analytics/service_ping/troubleshooting.md
+++ b/doc/development/internal_analytics/service_ping/troubleshooting.md
@@ -22,11 +22,13 @@ You can use [this query](https://gitlab.com/gitlab-org/gitlab/-/issues/347298#no
### 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).
+We conducted an investigation into an unexpected drop in Service ping Payload events volume.
+GitLab team members can view more information in this confidential issue:
+`https://gitlab.com/gitlab-data/analytics/-/issues/11071`
### Troubleshoot VersionApp layer
-Check if the [export jobs](https://gitlab.com/gitlab-services/version-gitlab-com#data-export-using-pipeline-schedules) are successful.
+Check if the [export jobs](https://gitlab.com/gitlab-org/gitlab-services/version.gitlab.com/-/tree/main/#data-export-using-pipeline-schedules) are successful.
Check [Service Ping errors](https://app.periscopedata.com/app/gitlab/968489?widget=14609989&udv=0) in the [Service Ping Health Dashboard](https://app.periscopedata.com/app/gitlab/968489).
diff --git a/doc/development/internal_analytics/snowplow/infrastructure.md b/doc/development/internal_analytics/snowplow/infrastructure.md
index 9679abac6b7..462dee2c39b 100644
--- a/doc/development/internal_analytics/snowplow/infrastructure.md
+++ b/doc/development/internal_analytics/snowplow/infrastructure.md
@@ -55,7 +55,7 @@ In contrast to a typical Snowplow pipeline, after enrichment, GitLab Snowplow ev
#### Why events need to be pseudonymized
GitLab is bound by its [obligations to community](https://about.gitlab.com/handbook/product/analytics-instrumentation-guide/service-usage-data-commitment/)
-and by [legal regulations](https://about.gitlab.com/handbook/legal/privacy/services-usage-data/) to protect the privacy of its users.
+and by [legal regulations](https://about.gitlab.com/handbook/legal/privacy/customer-product-usage-information/) to protect the privacy of its users.
GitLab must provide valuable insights for business decisions, and there is a need
for a better understanding of different users' behavior patterns. The
diff --git a/doc/development/internal_analytics/snowplow/troubleshooting.md b/doc/development/internal_analytics/snowplow/troubleshooting.md
index 885f4e0c16f..2f59543e0f4 100644
--- a/doc/development/internal_analytics/snowplow/troubleshooting.md
+++ b/doc/development/internal_analytics/snowplow/troubleshooting.md
@@ -31,7 +31,7 @@ While on CloudWatch dashboard set time range to last 4 weeks, to get better pict
### Troubleshooting GitLab application layer
-Drop occurring at application layer can be symptom of some issue, but it might be also a result of normal application lifecycle, intended changes done to analytics instrumentation or experiments tracking
+Drop occurring at application layer can be symptom of some issue, but it might be also a result of typical application lifecycle, intended changes done to analytics instrumentation or experiments tracking
or even a result of a public holiday in some regions of the world with a larger user-base. To verify if there is an underlying problem to solve, you can check following things:
1. Check `about.gitlab.com` website traffic on [Google Analytics](https://analytics.google.com/analytics/web/) to verify if some public holiday might impact overall use of GitLab system
@@ -42,7 +42,9 @@ or even a result of a public holiday in some regions of the world with a larger
1. Check (via [Grafana explore tab](https://dashboards.gitlab.net/explore) ) following Prometheus counters `gitlab_snowplow_events_total`, `gitlab_snowplow_failed_events_total` and `gitlab_snowplow_successful_events_total` to see how many events were fired correctly from GitLab.com. Example query to use `sum(rate(gitlab_snowplow_successful_events_total{env="gprd"}[5m])) / sum(rate(gitlab_snowplow_events_total{env="gprd"}[5m]))` would chart rate at which number of good events rose in comparison to events sent in total. If number drops from 1 it means that problem might be in communication between GitLab and AWS collectors fleet.
1. Check [logs in Kibana](https://log.gprd.gitlab.net/app/discover#) and filter with `{ "query": { "match_phrase": { "json.message": "failed to be reported to collector at" } } }` if there are some failed events logged
-For results about an investigation conducted into an unexpected drop in snowplow events volume, see [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/335206).
+We conducted an investigation into an unexpected drop in snowplow events volume.
+
+GitLab team members can view more information in this confidential issue: `https://gitlab.com/gitlab-org/gitlab/-/issues/335206`
### Troubleshooting AWS layer
diff --git a/doc/development/internal_api/index.md b/doc/development/internal_api/index.md
index 5fceb9013da..538b66124ba 100644
--- a/doc/development/internal_api/index.md
+++ b/doc/development/internal_api/index.md
@@ -492,14 +492,21 @@ curl --request GET --header "Gitlab-Kas-Api-Request: <JWT token>" \
Called from GitLab agent server (`kas`) to increase the usage
metric counters.
-| Attribute | Type | Required | Description |
-|:-------------------------------------------------|:--------------|:---------|:---------------------------------------------------------------------------------------------------------------------|
-| `counters` | hash | no | Hash of counters |
-| `counters["k8s_api_proxy_request"]` | integer | no | The number to increase the `k8s_api_proxy_request` counter by |
-| `counters["gitops_sync"]` | integer | no | The number to increase the `gitops_sync` counter by |
-| `counters["flux_git_push_notifications_total"]` | integer | no | The number to increase the `flux_git_push_notifications_total` counter by |
-| `unique_counters` | hash | no | Array of unique numbers |
-| `unique_counters["agent_users_using_ci_tunnel"]` | integer array | no | The set of unique user ids that have interacted a CI Tunnel to track the `agent_users_using_ci_tunnel` metric event |
+| Attribute | Type | Required | Description |
+|:--------------------------------------------------------------------------|:--------------|:---------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `counters` | hash | no | Hash of counters |
+| `counters["k8s_api_proxy_request"]` | integer | no | The number to increase the `k8s_api_proxy_request` counter by |
+| `counters["gitops_sync"]` | integer | no | The number to increase the `gitops_sync` counter by |
+| `counters["flux_git_push_notifications_total"]` | integer | no | The number to increase the `flux_git_push_notifications_total` counter by |
+| `counters["k8s_api_proxy_requests_via_ci_access"]` | integer | no | The number to increase the `k8s_api_proxy_requests_via_ci_access` counter by |
+| `counters["k8s_api_proxy_requests_via_user_access"]` | integer | no | The number to increase the `k8s_api_proxy_requests_via_user_access` counter by |
+| `unique_counters` | hash | no | Array of unique numbers |
+| `unique_counters["agent_users_using_ci_tunnel"]` | integer array | no | The set of unique user ids that have interacted a CI Tunnel to track the `agent_users_using_ci_tunnel` metric event |
+| `unique_counters["k8s_api_proxy_requests_unique_users_via_ci_access"]` | integer array | no | The set of unique user ids that have interacted a CI Tunnel via `ci_access` to track the `k8s_api_proxy_requests_unique_users_via_ci_access` metric event |
+| `unique_counters["k8s_api_proxy_requests_unique_agents_via_ci_access"]` | integer array | no | The set of unique user ids that have interacted a CI Tunnel via `ci_access` to track the `k8s_api_proxy_requests_unique_agents_via_ci_access` metric event |
+| `unique_counters["k8s_api_proxy_requests_unique_users_via_user_access"]` | integer array | no | The set of unique user ids that have interacted a CI Tunnel via `user_access` to track the `k8s_api_proxy_requests_unique_users_via_user_access` metric event |
+| `unique_counters["k8s_api_proxy_requests_unique_agents_via_user_access"]` | integer array | no | The set of unique user ids that have interacted a CI Tunnel via `user_access` to track the `k8s_api_proxy_requests_unique_agents_via_user_access` metric event |
+| `unique_counters["flux_git_push_notified_unique_projects"]` | integer array | no | The set of unique projects ids that have been notified to reconcile their Flux workloads to track the `flux_git_push_notified_unique_projects` metric event |
```plaintext
POST /internal/kubernetes/usage_metrics
@@ -857,9 +864,9 @@ PUT /namespaces/:id/subscription_add_on_purchase/:add_on_name
| Attribute | Type | Required | Description |
|:------------|:--------|:---------|:------------|
-| `quantity` | integer | yes | Amount of units in the subscription add-on purchase (Example: Number of seats for a code suggestions add-on) |
+| `quantity` | integer | no | Amount of units in the subscription add-on purchase (Example: Number of seats for a code suggestions add-on) |
| `expires_on` | date | yes | Expiration date of the subscription add-on purchase |
-| `purchase_xid` | string | yes | Identifier for the subscription add-on purchase (Example: Subscription name for a code suggestions add-on) |
+| `purchase_xid` | string | no | Identifier for the subscription add-on purchase (Example: Subscription name for a code suggestions add-on) |
Example request:
@@ -1014,10 +1021,10 @@ Example response:
## Compute quota provisioning
-> [Renamed](https://gitlab.com/groups/gitlab-com/-/epics/2150) from "CI/CD minutes" to "compute quota" and "units of compute" in GitLab 16.1.
+> [Renamed](https://gitlab.com/groups/gitlab-com/-/epics/2150) from "CI/CD minutes" to "compute quota" and "compute minutes" in GitLab 16.1.
The compute quota endpoints are used by [CustomersDot](https://gitlab.com/gitlab-org/customers-gitlab-com) (`customers.gitlab.com`)
-to apply additional packs of units of compute, for personal namespaces or top-level groups in GitLab.com.
+to apply additional packs of compute minutes, for personal namespaces or top-level groups in GitLab.com.
### Create an additional pack
@@ -1031,7 +1038,7 @@ POST /namespaces/:id/minutes
|:------------|:--------|:---------|:------------|
| `packs` | array | yes | An array of purchased compute packs |
| `packs[expires_at]` | date | yes | Expiry date of the purchased pack|
-| `packs[number_of_minutes]` | integer | yes | Number of additional units of compute |
+| `packs[number_of_minutes]` | integer | yes | Number of additional compute minutes |
| `packs[purchase_xid]` | string | yes | The unique ID of the purchase |
Example request:
diff --git a/doc/development/internal_api/internal_api_allowed.md b/doc/development/internal_api/internal_api_allowed.md
index 89c76c88df4..d5e4e8cf63d 100644
--- a/doc/development/internal_api/internal_api_allowed.md
+++ b/doc/development/internal_api/internal_api_allowed.md
@@ -91,7 +91,7 @@ same manner as the standard repositories, and is more prone to the refs issue.
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 `parallel_push_checks`.
+an administrator can [enable the feature flag](../../administration/feature_flags.md) named `parallel_push_checks`.
On GitLab.com, by default this feature is not available. To make it available
per project, ask GitLab.com administrator to
[enable the feature flag](../../administration/feature_flags.md) named `parallel_push_checks`.
diff --git a/doc/development/internal_users.md b/doc/development/internal_users.md
index ce13324507d..d9f40d6f5d4 100644
--- a/doc/development/internal_users.md
+++ b/doc/development/internal_users.md
@@ -40,6 +40,7 @@ For this bot:
Other examples of internal users:
+- [GitLab Admin Bot](https://gitlab.com/gitlab-org/gitlab/-/blob/278bc9018dd1515a10cbf15b6c6cd55cb5431407/app/models/user.rb#L950-960)
- [Alert Bot](../operations/incident_management/alerts.md#trigger-actions-from-alerts)
- [Ghost User](../user/profile/account/delete_account.md#associated-records)
- [Support Bot](../user/project/service_desk.md#support-bot-user)
diff --git a/doc/development/jh_features_review.md b/doc/development/jh_features_review.md
index 7e90d79c067..f4ed7070948 100644
--- a/doc/development/jh_features_review.md
+++ b/doc/development/jh_features_review.md
@@ -99,6 +99,20 @@ the relevant EE and JH modules by the name of the receiver module.
If reviewing the corresponding JH file is needed, it should be found at
[JH repository](https://jihulab.com/gitlab-cn/gitlab).
+NOTE:
+In some cases, JH does need to override something we don't need, and in that
+case it is ok to also add `prepend_mod` for the modules. When we do this,
+also add a comment mentioning it, and a link to the JH module using it.
+This way we know where it's used and when we might not need it anymore,
+and we do not remove them only because we're not using it, accidentally
+breaking JH. An example of this:
+
+```ruby
+# Added for JiHu
+# Used in https://jihulab.com/gitlab-cn/gitlab/-/blob/main-jh/jh/lib/jh/api/integrations.rb
+API::Integrations.prepend_mod
+```
+
### General guidance for writing JH extensions
See [Guidelines for implementing Enterprise Edition features](ee_features.md)
diff --git a/doc/development/merge_request_concepts/diffs/development.md b/doc/development/merge_request_concepts/diffs/development.md
index 37d87d4e4eb..75f961e41de 100644
--- a/doc/development/merge_request_concepts/diffs/development.md
+++ b/doc/development/merge_request_concepts/diffs/development.md
@@ -178,7 +178,7 @@ of options for access and working with diffs, focusing solely on the most common
### `batch_diffs.json`
The most common avenue for viewing diffs is the **Changes**
-tab in the top navigation bar of merge request pages in the GitLab UI. When selected, the
+tab at the top of merge request pages in the GitLab UI. When selected, the
diffs themselves are loaded via a paginated request to `/-/merge_requests/:id/batch_diffs.json`,
which is served by [`Projects::MergeRequests::DiffsController#diffs_batch`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/merge_requests/diffs_controller.rb):
diff --git a/doc/development/migration_style_guide.md b/doc/development/migration_style_guide.md
index 33f51c20446..8cbf18ce9f2 100644
--- a/doc/development/migration_style_guide.md
+++ b/doc/development/migration_style_guide.md
@@ -138,7 +138,7 @@ This will generate:
Changes to the schema should be committed to `db/structure.sql`. This
file is automatically generated by Rails when you run
-`bundle exec rails db:migrate`, so you normally should not
+`bundle exec rails db:migrate`, so you typically should not
edit this file by hand. If your migration is adding a column to a
table, that column is added at the bottom. Please do not reorder
columns manually for existing tables as this causes confusion to
@@ -203,6 +203,11 @@ and explains how to perform them without requiring downtime.
Your migration **must be** reversible. This is very important, as it should
be possible to downgrade in case of a vulnerability or bugs.
+**Note**: On GitLab production environments, if a problem occurs, a roll-forward strategy is used instead of rolling back migrations using `db:rollback`.
+On self-managed instances we advise users to restore the backup which was created before the upgrade process started.
+The `down` method is used primarily in the development environment, for example, when a developer wants to ensure
+their local copy of `structure.sql` file and database are in a consistent state when switching between commits or branches.
+
In your migration, add a comment describing how the reversibility of the
migration was tested.
@@ -224,13 +229,13 @@ end
Migrations like this are inherently risky and [additional actions](database_review.md#preparation-when-adding-data-migrations)
are required when preparing the migration for review.
-## Atomicity
+## Atomicity and transaction
-By default, migrations are single transaction. That is, a transaction is opened
+By default, migrations are a single transaction: it's opened
at the beginning of the migration, and committed after all steps are processed.
Running migrations in a single transaction makes sure that if one of the steps fails,
-none of the steps are executed, leaving the database in valid state.
+none of the steps are executed, leaving the database in a valid state.
Therefore, either:
- Put all migrations in one single-transaction migration.
@@ -238,11 +243,141 @@ Therefore, either:
for the steps that cannot be done in a single transaction.
For example, if you create an empty table and need to build an index for it,
-it is recommended to use a regular single-transaction migration and the default
+you should use a regular single-transaction migration and the default
rails schema statement: [`add_index`](https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-add_index).
-This is a blocking operation, but it doesn't cause problems because the table is not yet used,
+This operation is a blocking operation, but it doesn't cause problems because the table is not yet used,
and therefore it does not have any records yet.
+NOTE:
+Subtransactions are [disallowed](https://about.gitlab.com/blog/2021/09/29/why-we-spent-the-last-month-eliminating-postgresql-subtransactions/) in general.
+Use multiple, separate transactions
+if needed as described in [Heavy operations in a single transaction](#heavy-operations-in-a-single-transaction).
+
+### Heavy operations in a single transaction
+
+When using a single-transaction migration, a transaction holds a database connection
+for the duration of the migration, so you must make sure the actions in the migration
+do not take too much time.
+In general, transactions must [execute quickly](database/transaction_guidelines.md#transaction-speed).
+To that end, observe [the maximum query time limit](database/query_performance.md#timing-guidelines-for-queries)
+for each query run in the migration.
+
+If your single-transaction migration takes long to finish, you have several options.
+In all cases, remember to select the appropriate migration type
+depending on [how long a migration takes](#how-long-a-migration-should-take)
+
+- Split the migration into **multiple single-transaction migrations**.
+
+- Use **multiple transactions** by [using `disable_ddl_transaction!`](#disable-transaction-wrapped-migration).
+
+- Keep using a single-transaction migration after **adjusting statement and lock timeout settings**.
+ If your heavy workload must use the guarantees of a transaction,
+ you should check your migration can execute without hitting the timeout limits.
+ The same advice applies to both single-transaction migrations and individual transactions.
+
+ - Statement timeout: the statement timeout is configured to be `15s` for GitLab.com's production database
+ but creating an index often takes more than 15 seconds.
+ When you use the existing helpers including `add_concurrent_index`,
+ they automatically turn off the statement timeout as needed.
+ In rare cases, you might need to set the timeout limit yourself by [using `disable_statement_timeout`](#temporarily-turn-off-the-statement-timeout-limit).
+ - Lock timeout: if your migration must execute as a transaction but can possibly time out while
+ acquiring a lock, [use `enable_lock_retries!`](#usage-with-transactional-migrations).
+
+NOTE:
+To run migrations, we directly connect to the primary database, bypassing PgBouncer
+to control settings like `statement_timeout` and `lock_wait_timeout`.
+
+#### Temporarily turn off the statement timeout limit
+
+The migration helper `disable_statement_timeout` enables you to
+temporarily set the statement timeout to `0` per transaction or per connection.
+
+- You use the per-connection option when your statement does not support
+ running inside an explicit transaction, like `CREATE INDEX CONCURRENTLY`.
+
+- If your statement does support an explicit transaction block,
+ like `ALTER TABLE ... VALIDATE CONSTRAINT`,
+ the per-transaction option should be used.
+
+Using `disable_statement_timeout` is rarely needed, because
+the most migration helpers already use them internally when needed.
+For example, creating an index usually takes more than 15 seconds,
+which is the default statement timeout configured for GitLab.com's production database.
+The helper `add_concurrent_index` creates an index inside the block
+passed to `disable_statement_timeout` to disable the statement timeout per connection.
+
+If you are writing raw SQL statements in a migration,
+you may need to manually use `disable_statement_timeout`.
+Consult the database reviewers and maintainers when you do.
+
+### Disable transaction-wrapped migration
+
+You can opt out of running your migration as a single transaction by using
+`disable_ddl_transaction!`, an ActiveRecord method.
+The method might be called in other database systems, with different results.
+At GitLab we exclusively use PostgreSQL.
+You should always read `disable_ddl_transaction!` as meaning:
+
+"Do not execute this migration in a single PostgreSQL transaction. I'll open PostgreSQL transaction(s) only _when_ and _if_ I need them."
+
+NOTE:
+Even if you don't use an explicit PostgreSQL transaction `.transaction` (or `BEGIN; COMMIT;`),
+every SQL statement is still executed as a transaction.
+See [the PostgreSQL documentation on transactions](https://www.postgresql.org/docs/current/tutorial-transactions.html).
+
+NOTE:
+In GitLab, we've sometimes referred to
+the migrations that used `disable_ddl_transaction!` as non-transactional migrations.
+It just meant the migrations were not executed as _single_ transactions.
+
+When should you use `disable_ddl_transaction!`? In most cases,
+the existing RuboCop rules or migration helpers can detect if you should be
+using `disable_ddl_transaction!`.
+Skip `disable_ddl_transaction!` if you are unsure whether to use it or not in your migration,
+and let the RuboCop rules and database reviews guide you.
+
+Use `disable_ddl_transaction!` when PostgreSQL requires an operation to be executed outside an explicit transaction.
+
+- The most prominent example of such operation is the command `CREATE INDEX CONCURRENTLY`.
+ PostgreSQL allows the blocking version (`CREATE INDEX`) to be run inside a transaction.
+ Unlike `CREATE INDEX`, `CREATE INDEX CONCURRENTLY` must be performed outside a transaction.
+ Therefore, even though a migration may run just one statement `CREATE INDEX CONCURRENTLY`,
+ you should disable `disable_ddl_transaction!`.
+ It's also the reason why the use of the helper `add_concurrent_index` requires `disable_ddl_transaction!`
+ `CREATE INDEX CONCURRENTLY` is more of the exception than the rule.
+
+Use `disable_ddl_transaction!` when you need to run multiple transactions in a migration for any reason.
+Most of the time you would be using multiple transactions to avoid [running one slow transaction](#heavy-operations-in-a-single-transaction).
+
+- For example, when you insert, update, or delete (DML) a large amount of data,
+ you should [perform them in batches](database/iterating_tables_in_batches.md#eachbatch-in-data-migrations).
+ Should you need to group operations for each batch,
+ you can explicitly open a transaction block when processing a batch.
+ Consider using a [batched background migration](database/batched_background_migrations.md) for
+ any reasonably large workload.
+
+Use `disable_ddl_transaction!` when migration helpers require them.
+Various migration helpers need to run with `disable_ddl_transaction!`
+because they require a precise control on when and how to open transactions.
+
+- A foreign key _can_ be added inside a transaction, unlike `CREATE INDEX CONCURRENTLY`.
+ However, PostgreSQL does not provide an option similar to `CREATE INDEX CONCURRENTLY`.
+ The helper [`add_concurrent_foreign_key`](database/foreign_keys.md#adding-foreign-keys-in-migrations)
+ instead opens its own transactions to lock the source and target table
+ in a manner that minimizes locking while adding and validating the foreign key.
+- As advised earlier, skip `disable_ddl_transaction!` if you are unsure
+ and see if any RuboCop check is violated.
+
+Use `disable_ddl_transaction!` when your migration does not actually touch PostgreSQL databases
+or does touch _multiple_ PostgreSQL databases.
+
+- For example, your migration might target a Redis server. As a rule,
+ you cannot [interact with an external service](database/transaction_guidelines.md#dangerous-example-third-party-api-calls)
+ inside a PostgreSQL transaction.
+- A transaction is used for a single database connection.
+ If your migrations are targeting multiple databases, such as both `ci` and `main` database,
+ follow [Migrations for multiple databases](database/migrations_for_multiple_databases.md).
+
## Naming conventions
Names for database objects (such as tables, indexes, and views) must be lowercase.
@@ -285,19 +420,6 @@ minimum acceptable timestamp would be 20230424000000.
While the above should be considered a hard rule, it is a best practice to try to keep migration timestamps to within three weeks of the date it is anticipated that the migration will be merged upstream, regardless of how much time has elapsed since the last hard stop.
-## Heavy operations in a single transaction
-
-When using a single-transaction migration, a transaction holds a database connection
-for the duration of the migration, so you must make sure the actions in the migration
-do not take too much time: GitLab.com's production database has a `15s` timeout, so
-in general, the cumulative execution time in a migration should aim to fit comfortably
-in that limit. Singular query timings should fit within the [standard limit](database/query_performance.md#timing-guidelines-for-queries)
-
-In case you need to insert, update, or delete a significant amount of data, you:
-
-- Must disable the single transaction with `disable_ddl_transaction!`.
-- Should consider doing it in a [batched background migration](database/batched_background_migrations.md).
-
## Migration helpers and versioning
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/339115) in GitLab 14.3.
@@ -605,6 +727,71 @@ like a standard migration invocation.
The migration might fail if there is a very long running transaction (40+ minutes)
accessing the `users` table.
+#### Lock-retry methodology at the SQL level
+
+In this section, we provide a simplified SQL example that demonstrates the use of `lock_timeout`.
+You can follow along by running the given snippets in multiple `psql` sessions.
+
+When altering a table to add a column,
+`AccessExclusiveLock`, which conflicts with most lock types, is required on the table.
+If the target table is a very busy one, the transaction adding the column
+may fail to acquire `AccessExclusiveLock` in a timely fashion.
+
+Suppose a transaction is attempting to insert a row into a table:
+
+```sql
+-- Transaction 1
+BEGIN;
+INSERT INTO my_notes (id) VALUES (1);
+```
+
+At this point Transaction 1 acquired `RowExclusiveLock` on `my_notes`.
+Transaction 1 could still execute more statements prior to committing or aborting.
+There could be other similar, concurrent transactions that touch `my_notes`.
+
+Suppose a transactional migration is attempting to add a column to the table
+without using any lock retry helper:
+
+```sql
+-- Transaction 2
+BEGIN;
+ALTER TABLE my_notes ADD COLUMN title text;
+```
+
+Transaction 2 is now blocked because it cannot acquire
+`AccessExclusiveLock` on `my_notes` table
+as Transaction 1 is still executing and holding the `RowExclusiveLock`
+on `my_notes`.
+
+A more pernicious effect is blocking the transactions that would
+normally not conflict with Transaction 1 because Transaction 2
+is queueing to acquire `AccessExclusiveLock`.
+In a normal situation, if another transaction attempted to read from and write
+to the same table `my_notes` at the same time as Transaction 1,
+the transaction would go through
+since the locks needed for reading and writing would not
+conflict with `RowExclusiveLock` held by Transaction 1.
+However, when the request to acquire `AccessExclusiveLock` is queued,
+the subsequent requests for conflicting locks on the table would block although
+they could be executed concurrently alongside Transaction 1.
+
+If we used `with_lock_retries`, Transaction 2 would instead quickly
+timeout after failing to acquire the lock within the specified time period
+and allow other transactions to proceed:
+
+```sql
+-- Transaction 2 (version with with lock timeout)
+BEGIN;
+SET LOCAL lock_timeout to '100ms'; -- added by the lock retry helper.
+ALTER TABLE my_notes ADD COLUMN title text;
+```
+
+The lock retry helper would repeatedly try the same transaction
+at different time intervals until it succeeded.
+
+Note that `SET LOCAL` scopes the parameter (`lock_timeout`) change to
+the transaction.
+
## Removing indexes
If the table is not empty when removing an index, make sure to use the method
@@ -717,7 +904,7 @@ same migration, as the migrations run before the model code is updated and
models will have an old schema cache, meaning they won't know about this column
and won't be able to set it. In this case it's recommended to:
-1. Add the column with default value in a normal migration.
+1. Add the column with default value in a standard migration.
1. Remove the default in a post-deployment migration.
The post-deployment migration happens after the application restarts,
@@ -872,20 +1059,21 @@ If you want to reduce risk slightly, consider putting the migrations into a
second merge request after the application changes are merged. This approach
provides an opportunity to roll back.
-Removing the foreign key on the `projects` table:
+Removing the foreign key on the `projects` table using a non-transactional migration:
```ruby
# first migration file
+class RemovingForeignKeyMigrationClass < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
-def up
- with_lock_retries do
- remove_foreign_key :my_table, :projects
+ def up
+ with_lock_retries do
+ remove_foreign_key :my_table, :projects
+ end
end
-end
-def down
- with_lock_retries do
- add_foreign_key :my_table, :projects
+ def down
+ add_concurrent_foreign_key :my_table, :projects, column: COLUMN_NAME
end
end
```
@@ -894,17 +1082,19 @@ Dropping the table:
```ruby
# second migration file
+class DroppingTableMigrationClass < Gitlab::Database::Migration[2.1]
+ def up
+ drop_table :my_table
+ end
-def up
- drop_table :my_table
-end
-
-def down
- # create_table ...
+ def down
+ # create_table with the same schema but without the removed foreign key ...
+ end
end
```
-After a table has been dropped, it should be added to the database dictionary, following the steps in the [database dictionary guide](database/database_dictionary.md#dropping-tables).
+After a table has been dropped, it should be added to the database dictionary, following the
+steps in the [database dictionary guide](database/database_dictionary.md#dropping-tables).
## Dropping a sequence
@@ -953,10 +1143,10 @@ Truncating a table is uncommon, but you can use the `truncate_tables!` method pr
Under the hood, it works like this:
- Finds the `gitlab_schema` for the tables to be truncated.
-- If the `gitlab_schema` for the tables is included in the connection's gitlab_schemas,
+- If the `gitlab_schema` for the tables is included in the connection's `gitlab_schema`s,
it then executes the `TRUNCATE` statement.
- If the `gitlab_schema` for the tables is not included in the connection's
- gitlab_schemas, it does nothing.
+ `gitlab_schema`s, it does nothing.
## Swapping primary key
diff --git a/doc/development/packages/new_format_development.md b/doc/development/packages/new_format_development.md
index f730d4f9476..66e6cb89661 100644
--- a/doc/development/packages/new_format_development.md
+++ b/doc/development/packages/new_format_development.md
@@ -221,7 +221,7 @@ implemented in the same file.
After the route has been added, you must add an additional `/authorize` version of the upload endpoint to your API file.
[This example](https://gitlab.com/gitlab-org/gitlab/-/blob/398fef1ca26ae2b2c3dc89750f6b20455a1e5507/ee/lib/api/maven_packages.rb#L164)
shows the additional endpoint added for Maven. The `/authorize` endpoint verifies and authorizes the request from workhorse,
-then the normal upload endpoint is implemented below, consuming the metadata that Workhorse provides to
+then the typical upload endpoint is implemented below, consuming the metadata that Workhorse provides to
create the package record. Workhorse provides a variety of file metadata such as type, size, and different checksum formats.
For testing purposes, you may want to [enable object storage](https://gitlab.com/gitlab-org/gitlab-development-kit/blob/main/doc/howto/object_storage.md)
diff --git a/doc/development/performance.md b/doc/development/performance.md
index 291165d8125..fd7e9a85fba 100644
--- a/doc/development/performance.md
+++ b/doc/development/performance.md
@@ -217,7 +217,7 @@ Finished in 18.19 seconds (files took 4.8 seconds to load)
```
You can limit the specs that are run by passing any arguments `RSpec` would
-normally take.
+usually take.
### Using Stackprof in production
diff --git a/doc/development/permissions/custom_roles.md b/doc/development/permissions/custom_roles.md
index 73a8c920894..9aba4035ec9 100644
--- a/doc/development/permissions/custom_roles.md
+++ b/doc/development/permissions/custom_roles.md
@@ -8,6 +8,20 @@ info: To determine the technical writer assigned to the Stage/Group associated w
Users can create custom roles and define those roles by assigning specific abilities. For example, a user could create an "Engineer" role with `read code` and `admin merge requests` abilities, but without abilities like `admin issues`.
+In this context:
+
+- "Ability" is an action a user can do.
+- "Permission" defines the policy classes.
+
+## Custom roles vs static roles
+
+In GitLab 15.9 and earlier, GitLab only had [static roles](predefined_roles.md) as a permission system. In this system, there are a few predefined roles that are statically assigned to certain abilities. These static roles are not customizable by customers.
+
+With custom roles, the customers can decide which abilities they want to assign to certain user groups. For example:
+
+- In the static role system, reading of vulnerabilities is limited to a Developer role.
+- In the custom role system, a customer can assign this ability to a new custom role based on the Reporter role.
+
## Technical overview
Individual custom roles are stored in the `member_roles` table (`MemberRole` model) and can be defined only for top-level groups. This table includes individual abilities and a `base_access_level` value. This value defines the minimum access level of:
diff --git a/doc/development/pipelines/index.md b/doc/development/pipelines/index.md
index cadba17f03e..316ae3c83cd 100644
--- a/doc/development/pipelines/index.md
+++ b/doc/development/pipelines/index.md
@@ -214,7 +214,7 @@ graph LR
## Merge Trains
-### Why do we need to have a “stable†master branch to enable merge trains?
+### Why do we need to have a "stable" master branch to enable merge trains?
If the master branch is unstable (i.e. CI/CD pipelines for the master branch are failing frequently), all of the merge requests pipelines that were added AFTER a faulty merge request pipeline would have to be **cancelled** and **added back to the train**, which would create a lot of delays if the merge train is long.
@@ -609,18 +609,18 @@ Exceptions to this general guideline should be motivated and documented.
### Ruby versions testing
We're running Ruby 3.0 on GitLab.com, as well as for merge requests and the default branch.
-However, there are older versions for which we need to support Ruby 2.7, so we also run our
-test suite against Ruby 2.7 on a dedicated 2-hourly scheduled pipelines.
+To prepare for the next release, Ruby 3.1, we also run our test suite against Ruby 3.1 on
+a dedicated 2-hourly scheduled pipelines.
-For merge requests, you can add the `pipeline:run-in-ruby2` label to switch
-the Ruby version used for running the whole test suite to 2.7. When you do
+For merge requests, you can add the `pipeline:run-in-ruby3_1` label to switch
+the Ruby version used for running the whole test suite to 3.1. When you do
this, the test suite will no longer run in Ruby 3.0 (default), and an
additional job `verify-ruby-3.0` will also run and always fail to remind us to
remove the label and run in Ruby 3.0 before merging the merge request.
This should let us:
-- Test changes for Ruby 2.7
+- Test changes for Ruby 3.1
- Make sure it will not break anything when it's merged into the default branch
### PostgreSQL versions testing
@@ -634,33 +634,33 @@ We also run our test suite against PostgreSQL 12 and PostgreSQL 13 upon specific
#### Current versions testing
-| Where? | PostgreSQL version | Ruby version |
-|------------------------------------------------------------------------------------------------|-------------------------------------------------|-----------------------|
-| Merge requests | 14 (default version), 13 for DB library changes | 3.0 (default version) |
-| `master` branch commits | 14 (default version), 13 for DB library changes | 3.0 (default version) |
-| `maintenance` scheduled pipelines for the `master` branch (every even-numbered hour) | 14 (default version), 13 for DB library changes | 3.0 (default version) |
-| `maintenance` scheduled pipelines for the `ruby2` branch (every odd-numbered hour), see below. | 14 (default version), 13 for DB library changes | 2.7 |
-| `nightly` scheduled pipelines for the `master` branch | 14 (default version), 12, 13, 15 | 3.0 (default version) |
+| Where? | PostgreSQL version | Ruby version |
+|--------------------------------------------------------------------------------------------------|-------------------------------------------------|-----------------------|
+| Merge requests | 14 (default version), 13 for DB library changes | 3.0 (default version) |
+| `master` branch commits | 14 (default version), 13 for DB library changes | 3.0 (default version) |
+| `maintenance` scheduled pipelines for the `master` branch (every even-numbered hour) | 14 (default version), 13 for DB library changes | 3.0 (default version) |
+| `maintenance` scheduled pipelines for the `ruby3_1` branch (every odd-numbered hour), see below. | 14 (default version), 13 for DB library changes | 3.1 |
+| `nightly` scheduled pipelines for the `master` branch | 14 (default version), 12, 13, 15 | 3.0 (default version) |
-There are 2 pipeline schedules used for testing Ruby 2.7. One is triggering a
-pipeline in `ruby2-sync` branch, which updates the `ruby2` branch with latest
+There are 2 pipeline schedules used for testing Ruby 3.1. One is triggering a
+pipeline in `ruby3_1-sync` branch, which updates the `ruby3_1` branch with latest
`master`, and no pipelines will be triggered by this push. The other schedule
-is triggering a pipeline in `ruby2` 5 minutes after it, which is considered
+is triggering a pipeline in `ruby3_1` 5 minutes after it, which is considered
the maintenance schedule to run test suites and update cache.
-The `ruby2` branch must not have any changes. The branch is only there to set
-`RUBY_VERSION` to `2.7` in the maintenance pipeline schedule.
+The `ruby3_1` branch must not have any changes. The branch is only there to set
+`RUBY_VERSION` to `3.1` in the maintenance pipeline schedule.
-The `gitlab` job in the `ruby2-sync` branch uses a `gitlab-org/gitlab` project
+The `gitlab` job in the `ruby3_1-sync` branch uses a `gitlab-org/gitlab` project
token with `write_repository` scope and `Maintainer` role with no expiration.
-The token is stored in the `RUBY2_SYNC_TOKEN` variable in `gitlab-org/gitlab`.
+The token is stored in the `RUBY3_1_SYNC_TOKEN` variable in `gitlab-org/gitlab`.
### Redis versions testing
Our test suite runs against Redis 6 as GitLab.com runs on Redis 6 and
[Omnibus defaults to Redis 6 for new installs and upgrades](https://gitlab.com/gitlab-org/omnibus-gitlab/-/blob/master/config/software/redis.rb).
-We do run our test suite against Redis 5 on `nightly` scheduled pipelines, specifically when running backward-compatible and forward-compatible PostgreSQL jobs.
+We do run our test suite against Redis 7 on `nightly` scheduled pipelines, specifically when running forward-compatible PostgreSQL 15 jobs.
#### Current versions testing
@@ -668,7 +668,7 @@ We do run our test suite against Redis 5 on `nightly` scheduled pipelines, speci
| ------ | ------------------ |
| MRs | 6 |
| `default branch` (non-scheduled pipelines) | 6 |
-| `nightly` scheduled pipelines | 5 |
+| `nightly` scheduled pipelines | 7 |
### Single database testing
@@ -755,10 +755,14 @@ graph RL;
click 2_5-1 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations"
2_5-1 --> 1-3 & 1-6 & 1-14 & 1-15;
- 3_2-1["rspec:coverage (5 minutes)"];
+ ac-1["rspec:artifact-collector (2 minutes)<br/>(workaround for 'needs' limitation)"];
+ class ac-1 criticalPath;
+ ac-1 --> 2_5-1;
+
+ 3_2-1["rspec:coverage (3 minutes)"];
class 3_2-1 criticalPath;
click 3_2-1 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=7248745&udv=0"
- 3_2-1 -.->|"(don't use needs<br/>because of limitations)"| 2_5-1;
+ 3_2-1 --> ac-1;
4_3-1["rspec:undercoverage (1.3 minutes)"];
class 4_3-1 criticalPath;
diff --git a/doc/development/pipelines/internals.md b/doc/development/pipelines/internals.md
index 35881db8c6d..c0d7bbd3713 100644
--- a/doc/development/pipelines/internals.md
+++ b/doc/development/pipelines/internals.md
@@ -20,7 +20,8 @@ Pipelines are always created for the following scenarios:
Pipeline creation is also affected by the following CI/CD variables:
-- If `$FORCE_GITLAB_CI` is set, pipelines are created.
+- If `$FORCE_GITLAB_CI` is set, pipelines are created. Not recommended to use.
+ See [Avoid `$FORCE_GITLAB_CI`](#avoid-force_gitlab_ci).
- If `$GITLAB_INTERNAL` is not set, pipelines are not created.
No pipeline is created in any other cases (for example, when pushing a branch with no
@@ -28,6 +29,25 @@ MR for it).
The source of truth for these workflow rules is defined in [`.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab-ci.yml).
+### Avoid `$FORCE_GITLAB_CI`
+
+The pipeline is very complex and we need to clearly understand the kind of
+pipeline we want to trigger. We need to know which jobs we should run and
+which ones we shouldn't.
+
+If we use `$FORCE_GITLAB_CI` to force trigger a pipeline,
+we don't really know what kind of pipeline it is. The result can be that we don't
+run the jobs we want, or we run too many jobs we don't care about.
+
+Some more context and background can be found at:
+[Avoid blanket changes to avoid unexpected run](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/102881)
+
+Here's a list of where we're using this right now, and should try to move away
+from using `$FORCE_GITLAB_CI`.
+
+- [JiHu validation pipeline](https://about.gitlab.com/handbook/ceo/chief-of-staff-team/jihu-support/jihu-validation-pipelines.html)
+- [Gitaly downstream GitLab pipeline](https://gitlab.com/gitlab-org/gitaly/-/issues/4615)
+
## Default image
The default image is defined in [`.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab-ci.yml).
@@ -102,7 +122,7 @@ Docker Hub unless `${GITLAB_DEPENDENCY_PROXY}` is also defined there.
### Work around for when a pipeline is started by a Project access token user
-When a pipeline is started by a Project access token user (e.g. the `release-tools approver bot` user which
+When a pipeline is started by a Project access token user (for example, the `release-tools approver bot` user which
automatically updates the Gitaly version used in the main project),
[the Dependency proxy isn't accessible](https://gitlab.com/gitlab-org/gitlab/-/issues/332411#note_1130388163)
and the job fails at the `Preparing the "docker+machine" executor` step.
@@ -165,7 +185,7 @@ and included in `rules` definitions via [YAML anchors](../../ci/yaml/yaml_optimi
| `if:` conditions | Description | Notes |
|------------------|-------------|-------|
-| `if-not-canonical-namespace` | Matches if the project isn't in the canonical (`gitlab-org/`) or security (`gitlab-org/security`) namespace. | Use to create a job for forks (by using `when: on_success` or `when: manual`), or **not** create a job for forks (by using `when: never`). |
+| `if-not-canonical-namespace` | Matches if the project isn't in the canonical (`gitlab-org/` and `gitlab-cn/`) or security (`gitlab-org/security`) namespace. | Use to create a job for forks (by using `when: on_success` or `when: manual`), or **not** create a job for forks (by using `when: never`). |
| `if-not-ee` | Matches if the project isn't EE (that is, project name isn't `gitlab` or `gitlab-ee`). | Use to create a job only in the FOSS project (by using `when: on_success` or `when: manual`), or **not** create a job if the project is EE (by using `when: never`). |
| `if-not-foss` | Matches if the project isn't FOSS (that is, project name isn't `gitlab-foss`, `gitlab-ce`, or `gitlabhq`). | Use to create a job only in the EE project (by using `when: on_success` or `when: manual`), or **not** create a job if the project is FOSS (by using `when: never`). |
| `if-default-refs` | Matches if the pipeline is for `master`, `main`, `/^[\d-]+-stable(-ee)?$/` (stable branches), `/^\d+-\d+-auto-deploy-\d+$/` (auto-deploy branches), `/^security\//` (security branches), merge requests, and tags. | Note that jobs aren't created for branches with this default configuration. |
@@ -224,7 +244,7 @@ and included in `rules` definitions via [YAML anchors](../../ci/yaml/yaml_optimi
- If you need to **extend a hash**, you should use `extends`
- If you need to **extend an array**, you'll need to use `!reference`, or `YAML anchors` as last resort
-- For more complex cases (e.g. extend hash inside array, extend array inside hash, ...), you'll have to use `!reference` or `YAML anchors`
+- For more complex cases (for example, extend hash inside array, extend array inside hash, ...), you'll have to use `!reference` or `YAML anchors`
#### What can `extends` and `YAML anchors` do?
diff --git a/doc/development/policies.md b/doc/development/policies.md
index b50d654ed28..38f1fc54bf4 100644
--- a/doc/development/policies.md
+++ b/doc/development/policies.md
@@ -18,7 +18,7 @@ Permissions are broken into two parts: `conditions` and `rules`. Conditions are
### Conditions
-Conditions are defined by the `condition` method, and are given a name and a block. The block is executed in the context of the policy object - so it can access `@user` and `@subject`, as well as call any methods defined on the policy. Note that `@user` may be nil (in the anonymous case), but `@subject` is guaranteed to be a real instance of the subject class.
+Conditions are defined by the `condition` method, and are given a name and a block. The block is executed in the context of the policy object - so it can access `@user` and `@subject`, as well as call any methods defined on the policy. `@user` may be nil (in the anonymous case), but `@subject` is guaranteed to be a real instance of the subject class.
```ruby
class FooPolicy < BasePolicy
@@ -42,7 +42,7 @@ Conditions are cached according to their scope. Scope and ordering is covered la
### Rules
-A `rule` is a logical combination of conditions and other rules, that are configured to enable or prevent certain abilities. It is important to note that the rule configuration is static - a rule's logic cannot touch the database or know about `@user` or `@subject`. This allows us to cache only at the condition level. Rules are specified through the `rule` method, which takes a block of DSL configuration, and returns an object that responds to `#enable` or `#prevent`:
+A `rule` is a logical combination of conditions and other rules, that are configured to enable or prevent certain abilities. The rule configuration is static - a rule's logic cannot touch the database or know about `@user` or `@subject`. This allows us to cache only at the condition level. Rules are specified through the `rule` method, which takes a block of DSL configuration, and returns an object that responds to `#enable` or `#prevent`:
```ruby
class FooPolicy < BasePolicy
@@ -67,7 +67,7 @@ Within the rule DSL, you can use:
- A regular word mentions a condition by name - a rule that is in effect when that condition is truthy.
- `~` indicates negation, also available as `negate`.
- `&` and `|` are logical combinations, also available as `all?(...)` and `any?(...)`.
-- `can?(:other_ability)` delegates to the rules that apply to `:other_ability`. Note that this is distinct from the instance method `can?`, which can check dynamically - this only configures a delegation to another ability.
+- `can?(:other_ability)` delegates to the rules that apply to `:other_ability`. This is distinct from the instance method `can?`, which can check dynamically - this only configures a delegation to another ability.
`~`, `&` and `|` operators are overridden methods in
[`DeclarativePolicy::Rule::Base`](https://gitlab.com/gitlab-org/declarative-policy/-/blob/main/lib/declarative_policy/rule.rb).
@@ -104,8 +104,9 @@ An example debug output would look as follows:
Each line represents a rule that was evaluated. There are a few things to note:
-1. The `-` or `+` symbol indicates whether the rule block was evaluated to be
- `false` or `true`, respectively.
+1. The `-` symbol indicates the rule block was evaluated to be
+ `false`. A `+` symbol indicates the rule block was evaluated to be
+ `true`.
1. The number inside the brackets indicates the score.
1. The last part of the line (for example, `@john : Issue/1`) shows the username
and subject for that rule.
@@ -124,7 +125,7 @@ heuristic of how expensive they are to calculate. The sorting is
dynamic and cache-aware, so that previously calculated conditions are
considered first, before computing other conditions.
-Note that the score is chosen by a developer via the `score:` parameter
+The score is chosen by a developer via the `score:` parameter
in a `condition` to denote how expensive evaluating this rule would be
relative to other rules.
@@ -173,7 +174,7 @@ class FooPolicy < BasePolicy
end
```
-includes all rules from `ProjectPolicy`. The delegated conditions are evaluated with the correct delegated subject, and are sorted along with the regular rules in the policy. Note that only the relevant rules for a particular ability are actually considered.
+includes all rules from `ProjectPolicy`. The delegated conditions are evaluated with the correct delegated subject, and are sorted along with the regular rules in the policy. Only the relevant rules for a particular ability are actually considered.
### Overrides
diff --git a/doc/development/product_qualified_lead_guide/index.md b/doc/development/product_qualified_lead_guide/index.md
index 9f5a1a1110f..cf25d83c39a 100644
--- a/doc/development/product_qualified_lead_guide/index.md
+++ b/doc/development/product_qualified_lead_guide/index.md
@@ -15,7 +15,7 @@ A hand-raise PQL is a user who requests to speak to sales from within the produc
1. Set up GDK with a connection to your local CustomersDot instance.
1. Set up CustomersDot to talk to a staging instance of Workato.
-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 up CustomersDot using the [standard install instructions](https://gitlab.com/gitlab-org/customers-gitlab-com/-/blob/staging/doc/setup/installation_steps.md).
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 Workato in your `/config/secrets.yml` and restart. Credentials for the Workato Staging are in the 1Password Subscription portal vault. The URL for staging is `https://apim.workato.com/gitlab-dev/services/marketo/lead`.
@@ -131,8 +131,8 @@ The flow of a PQL lead is as follows:
```mermaid
sequenceDiagram
Trial Frontend Forms ->>TrialsController#create_lead: GitLab.com frontend sends [lead] to backend
- TrialsController#create_lead->>CreateLeadService: [lead]
- TrialsController#create_lead->>ApplyTrialService: [lead] Apply the trial
+ TrialsController#create->>CreateLeadService: [lead]
+ TrialsController#create->>ApplyTrialService: [lead] Apply the trial
CreateLeadService->>SubscriptionPortalClient#generate_trial(sync_to_gl=false): [lead] Creates customer account on CustomersDot
ApplyTrialService->>SubscriptionPortalClient#generate_trial(sync_to_gl=true): [lead] Asks CustomersDot to apply the trial on namespace
SubscriptionPortalClient#generate_trial(sync_to_gl=false)->>CustomersDot|TrialsController#create(sync_to_gl=false): GitLab.com sends [lead] to CustomersDot
@@ -169,8 +169,8 @@ sequenceDiagram
```mermaid
sequenceDiagram
- HandRaiseForm Vue Component->>TrialsController#create_hand_raise_lead: GitLab.com frontend sends [lead] to backend
- Subscriptions::HandRaiseLeadsController#create->>CreateHandRaiseLeadService: [lead]
+ HandRaiseForm Vue Component->>HandRaiseLeadsController#create: GitLab.com frontend sends [lead] to backend
+ HandRaiseLeadsController#create->>CreateHandRaiseLeadService: [lead]
CreateHandRaiseLeadService->>SubscriptionPortalClient: [lead]
SubscriptionPortalClient->>CustomersDot|TrialsController#create_hand_raise_lead: GitLab.com sends [lead] to CustomersDot
```
diff --git a/doc/development/project_templates.md b/doc/development/project_templates.md
index cc53ef77c62..da933c8a009 100644
--- a/doc/development/project_templates.md
+++ b/doc/development/project_templates.md
@@ -19,8 +19,8 @@ To make the project template available when creating a new project, the vendorin
1. Create a working template ([example](https://gitlab.com/gitlab-org/project-templates/dotnetcore))
- 2 types of built-in templates are available within GitLab:
- - **Normal templates**: Available in GitLab Core, Starter and above (this is the most common type of built-in template).
- - To contribute a normal template:
+ - **Standard templates**: Available in GitLab Core, Starter and above (this is the most common type of built-in template).
+ - To contribute a standard template:
- Add details of the template in the `localized_templates_table` method in `gitlab/lib/gitlab/project_template.rb`,
- Add details of the template in `spec/lib/gitlab/project_template_spec.rb`, in the test for the `all` method, and
- Add details of the template in `gitlab/app/assets/javascripts/projects/default_project_templates.js`.
diff --git a/doc/development/reactive_caching.md b/doc/development/reactive_caching.md
index 9e3b1f58abe..d0652c85c6d 100644
--- a/doc/development/reactive_caching.md
+++ b/doc/development/reactive_caching.md
@@ -197,9 +197,8 @@ There are some `class_attribute` options which can be tweaked.
self.reactive_cache_key = -> (record) { [model_name.singular, record.id] }
```
-- The `data` and `alive` cache keys in this case are `"ExampleModel:1:arg1:arg2"`
- and `"ExampleModel:1:arg1:arg2:alive"` respectively, where `ExampleModel` is the
- name of the model, `1` is the ID of the record, `arg1` and `arg2` are parameters
+- The `data` cache key is `"ExampleModel:1:arg1:arg2"` and `alive` cache keys is `"ExampleModel:1:arg1:arg2:alive"`,
+ where `ExampleModel` is the name of the model, `1` is the ID of the record, `arg1` and `arg2` are parameters
passed to `with_reactive_cache`.
- If you're including this concern in an integration (`app/models/integrations/`) instead, you must override
the default by adding the following to your integration:
diff --git a/doc/development/redis.md b/doc/development/redis.md
index 5073d9350e8..ebc7c0271a1 100644
--- a/doc/development/redis.md
+++ b/doc/development/redis.md
@@ -285,3 +285,48 @@ This is used by the
[`RepositorySetCache`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/repository_set_cache.rb)
to provide a convenient way to use sets to cache repository data like branch
names.
+
+## Background migration
+
+Redis-based migrations involve using the `SCAN` command to scan the entire Redis instance for certain key patterns.
+For large Redis instances, the migration might [exceed the time limit](migration_style_guide.md#how-long-a-migration-should-take)
+for regular or post-deployment migrations. [`RedisMigrationWorker`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/workers/redis_migration_worker.rb)
+performs long-running Redis migrations as a background migration.
+
+To perform a background migration by creating a class:
+
+```ruby
+module Gitlab
+ module BackgroundMigration
+ module Redis
+ class BackfillCertainKey
+ def perform(keys)
+ # implement logic to clean up or backfill keys
+ end
+
+ def scan_match_pattern
+ # define the match pattern for the `SCAN` command
+ end
+
+ def redis
+ # define the exact Redis instance
+ end
+ end
+ end
+ end
+end
+```
+
+To trigger the worker through a post-deployment migration:
+
+```ruby
+class ExampleBackfill < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ MIGRATION='BackfillCertainKey'
+
+ def up
+ queue_redis_migration_job(MIGRATION)
+ end
+end
+```
diff --git a/doc/development/sec/gemnasium_analyzer_data.md b/doc/development/sec/gemnasium_analyzer_data.md
new file mode 100644
index 00000000000..2da787a277a
--- /dev/null
+++ b/doc/development/sec/gemnasium_analyzer_data.md
@@ -0,0 +1,33 @@
+---
+stage: Secure
+group: Composition Analysis
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Gemnasium analyzer data
+
+The following table lists the data available for the Gemnasium analyzer.
+
+| Property \ Tool | Gemnasium |
+|:----------------------------------------------|:-----------------------:|
+| Severity | **{check-circle}** Yes |
+| Title | **{check-circle}** Yes |
+| File | **{check-circle}** Yes |
+| Start line | **{dotted-circle}** No |
+| End line | **{dotted-circle}** No |
+| External ID (for example, CVE) | **{check-circle}** Yes |
+| URLs | **{check-circle}** Yes |
+| Internal doc/explanation | **{check-circle}** Yes |
+| Solution | **{check-circle}** Yes |
+| Confidence | **{dotted-circle}** No |
+| Affected item (for example, class or package) | **{check-circle}** Yes |
+| Source code extract | **{dotted-circle}** No |
+| Internal ID | **{check-circle}** Yes |
+| Date | **{check-circle}** Yes |
+| Credits | **{check-circle}** Yes |
+
+- **{check-circle}** Yes => we have that data
+- **{dotted-circle}** No => 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`, etc).
diff --git a/doc/development/secure_coding_guidelines.md b/doc/development/secure_coding_guidelines.md
index c5e7a58af0d..8d6f36bb189 100644
--- a/doc/development/secure_coding_guidelines.md
+++ b/doc/development/secure_coding_guidelines.md
@@ -333,7 +333,7 @@ XSS issues are commonly classified in three categories, by their delivery method
### Impact
-The injected client-side code is executed on the victim's browser in the context of their current session. This means the attacker could perform any same action the victim would normally be able to do through a browser. The attacker would also have the ability to:
+The injected client-side code is executed on the victim's browser in the context of their current session. This means the attacker could perform any same action the victim would typically be able to do through a browser. The attacker would also have the ability to:
- <i class="fa fa-youtube-play youtube" aria-hidden="true"></i> [log victim keystrokes](https://youtu.be/2VFavqfDS6w?t=1367)
- launch a network scan from the victim's browser
@@ -524,7 +524,7 @@ of these behaviors.
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:
+typical use. In the examples below, we see attempts to access `/etc/passwd`, which is a sensitive file:
```ruby
require 'pathname'
diff --git a/doc/development/sidekiq/compatibility_across_updates.md b/doc/development/sidekiq/compatibility_across_updates.md
index d20f4230fc8..1d8b9d15cc6 100644
--- a/doc/development/sidekiq/compatibility_across_updates.md
+++ b/doc/development/sidekiq/compatibility_across_updates.md
@@ -205,6 +205,6 @@ end
```
-You must rename the queue in a post-deployment migration not in a normal
+You must rename the queue in a post-deployment migration not in a standard
migration. Otherwise, it runs too early, before all the workers that
schedule these jobs have stopped running. See also [other examples](../database/post_deployment_migrations.md#use-cases).
diff --git a/doc/development/sidekiq/idempotent_jobs.md b/doc/development/sidekiq/idempotent_jobs.md
index 1c4f4ba44a8..8ccbeee283d 100644
--- a/doc/development/sidekiq/idempotent_jobs.md
+++ b/doc/development/sidekiq/idempotent_jobs.md
@@ -156,7 +156,7 @@ end
## Setting the deduplication time-to-live (TTL)
-Deduplication depends on an idempotent key that is stored in Redis. This is normally
+Deduplication depends on an idempotent key that is stored in Redis. This is usually
cleared by the configured deduplication strategy.
However, the key can remain until its TTL in certain cases like:
diff --git a/doc/development/sidekiq/index.md b/doc/development/sidekiq/index.md
index d510414baa3..936388a14fe 100644
--- a/doc/development/sidekiq/index.md
+++ b/doc/development/sidekiq/index.md
@@ -121,7 +121,7 @@ Sidekiq workers are deferred by two ways,
1. Manual: Feature flags can be used to explicitly defer a particular worker, more details can be found [here](../feature_flags/index.md#deferring-sidekiq-jobs).
1. Automatic: Similar to the [throttling mechanism](../database/batched_background_migrations.md#throttling-batched-migrations) in batched migrations, database health indicators are used to defer a Sidekiq worker.
- To use the automatic deferring mechanism, worker has to opt-in by calling `defer_on_database_health_signal` with gitlab_schema, delay_by (time to delay) and tables (which is used by autovacuum db indicator) as it's parameters.
+ To use the automatic deferring mechanism, worker has to opt-in by calling `defer_on_database_health_signal` with `gitlab_schema`, delay_by (time to delay) and tables (which is used by autovacuum db indicator) as it's parameters.
**Example:**
diff --git a/doc/development/software_design.md b/doc/development/software_design.md
index d4edbaa72be..33a6dfcb4a7 100644
--- a/doc/development/software_design.md
+++ b/doc/development/software_design.md
@@ -139,3 +139,165 @@ end
If classes that are defined into a namespace have a lot in common with classes in other namespaces,
chances are that these two namespaces are part of the same bounded context.
+
+## Taming Omniscient classes
+
+We must consider not adding new data and behavior to [omniscient classes](https://en.wikipedia.org/wiki/God_object) (also known as god objects).
+We consider `Project`, `User`, `MergeRequest`, `Ci::Pipeline` and any classes above 1000 LOC to be omniscient.
+
+Such classes are overloaded with responsibilities. New data and behavior can most of the time be added
+as a separate and dedicated class.
+
+Guidelines:
+
+- If you mostly need a reference to the object ID (for example `Project#id`) you could add a new model
+ that uses the foreign key or a thin wrapper around the object to add special behavior.
+- If you find out that by adding a method to the omniscient class you also end up adding a couple of other methods
+ (private or public) it's a sign that these methods should be encapsulated in a dedicated class.
+- It's temping to add a method to `Project` because that's the starting point of data and associations.
+ Try to define behavior in the bounded context where it belongs, not where the data (or some of it) is.
+ This helps creating facets of the omniscient object that are much more relevant in the bounded context than
+ having generic and overloaded objects which bring more coupling and complexity.
+
+### Example: Define a thin domain object around a generic model
+
+Instead of adding multiple methods to `User` because it has an association to `abuse_trust_scores`,
+try inverting the dependency.
+
+```ruby
+##
+# BAD: Behavior added to User object.
+class User
+ def spam_score
+ abuse_trust_scores.spamcheck.average(:score) || 0.0
+ end
+
+ def spammer?
+ # Warning sign: we use a constant that belongs to a specific bounded context!
+ spam_score > Abuse::TrustScore::SPAMCHECK_HAM_THRESHOLD
+ end
+
+ def telesign_score
+ abuse_trust_scores.telesign.recent_first.first&.score || 0.0
+ end
+
+ def arkose_global_score
+ abuse_trust_scores.arkose_global_score.recent_first.first&.score || 0.0
+ end
+
+ def arkose_custom_score
+ abuse_trust_scores.arkose_custom_score.recent_first.first&.score || 0.0
+ end
+end
+
+# Usage:
+user = User.find(1)
+user.spam_score
+user.telesign_score
+user.arkose_global_score
+```
+
+```ruby
+##
+# GOOD: Define a thin class that represents a user trust score
+class Abuse::UserTrustScore
+ def initialize(user)
+ @user = user
+ end
+
+ def spam
+ scores.spamcheck.average(:score) || 0.0
+ end
+
+ def spammer?
+ spam > Abuse::TrustScore::SPAMCHECK_HAM_THRESHOLD
+ end
+
+ def telesign
+ scores.telesign.recent_first.first&.score || 0.0
+ end
+
+ def arkose_global
+ scores.arkose_global_score.recent_first.first&.score || 0.0
+ end
+
+ def arkose_custom
+ scores.arkose_custom_score.recent_first.first&.score || 0.0
+ end
+
+ private
+
+ def scores
+ Abuse::TrustScore.for_user(@user)
+ end
+end
+
+# Usage:
+user = User.find(1)
+user_score = Abuse::UserTrustScore.new(user)
+user_score.spam
+user_score.spammer?
+user_score.telesign
+user_score.arkose_global
+```
+
+See a real example [merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/117853#note_1423070054).
+
+### Example: Use Dependency Inversion to extract a domain concept
+
+```ruby
+##
+# BAD: methods related to integrations defined in Project.
+class Project
+ has_many :integrations
+
+ def find_or_initialize_integrations
+ # ...
+ end
+
+ def find_or_initialize_integration(name)
+ # ...
+ end
+
+ def disabled_integrations
+ # ...
+ end
+
+ def ci_integrations
+ # ...
+ end
+
+ # many more methods...
+end
+```
+
+```ruby
+##
+# GOOD: All logic related to Integrations is enclosed inside the `Integrations::`
+# bounded context.
+module Integrations
+ class ProjectIntegrations
+ def initialize(project)
+ @project = project
+ end
+
+ def all_integrations
+ @project.integrations # can still leverage caching of AR associations
+ end
+
+ def find_or_initialize(name)
+ # ...
+ end
+
+ def all_disabled
+ all_integrations.disabled
+ end
+
+ def all_ci
+ all_integrations.ci_integration
+ end
+ end
+end
+```
+
+Real example of [similar refactoring](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92985).
diff --git a/doc/development/spam_protection_and_captcha/web_ui.md b/doc/development/spam_protection_and_captcha/web_ui.md
index 0cc17854010..9f92105b18d 100644
--- a/doc/development/spam_protection_and_captcha/web_ui.md
+++ b/doc/development/spam_protection_and_captcha/web_ui.md
@@ -48,11 +48,11 @@ However, even though the actual handling of the request interception and
modal is transparent, without any mandatory changes to the involved JavaScript or Vue components
for the form or page, changes in request or error handling may be required. Changes are needed
because the existing behavior may not work correctly: for example, if a failed or cancelled
-CAPTCHA display interrupts the normal request flow or UI updates.
+CAPTCHA display interrupts the standard request flow or UI updates.
Careful exploratory testing of all scenarios is important to uncover any potential
problems.
-This sequence diagram illustrates the normal CAPTCHA flow for JavaScript XHR/Fetch requests
+This sequence diagram illustrates the standard CAPTCHA flow for JavaScript XHR/Fetch requests
on the frontend:
```mermaid
@@ -73,7 +73,7 @@ sequenceDiagram
```
The backend is also cleanly abstracted via mixin modules and helper methods. The three main
-changes required to the relevant backend controller actions (normally just `create`/`update`) are:
+changes required to the relevant backend controller actions (typically just `create`/`update`) are:
1. Pass `perform_spam_check: true` to the Update Service class constructor.
It is set to `true` by default in the Create Service.
@@ -86,7 +86,7 @@ changes required to the relevant backend controller actions (normally just `crea
1. Checking if there the model contains an error, and the `needs_recaptcha` flag is true.
- If yes: Add the appropriate spam or CAPTCHA fields to the JSON response, and return
a `409 - Conflict` HTTP status code.
- - If no (if CAPTCHA is disabled or if no spam was detected): The normal request return
+ - If no (if CAPTCHA is disabled or if no spam was detected): The standard request return
logic passed in the block is run.
Thanks to the abstractions, it's more straightforward to implement than it is to explain it.
diff --git a/doc/development/testing_guide/best_practices.md b/doc/development/testing_guide/best_practices.md
index 90267a517b8..5a4ac99f5c5 100644
--- a/doc/development/testing_guide/best_practices.md
+++ b/doc/development/testing_guide/best_practices.md
@@ -50,6 +50,32 @@ bundle exec guard
When using spring and guard together, use `SPRING=1 bundle exec guard` instead to make use of spring.
+### General guidelines
+
+- Use a single, top-level `RSpec.describe ClassName` block.
+- Use `.method` to describe class methods and `#method` to describe instance
+ methods.
+- Use `context` to test branching logic (`RSpec/AvoidConditionalStatements` Rubocop Cop - [MR](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/117152)).
+- Try to match the ordering of tests to the ordering in the class.
+- Try to follow the [Four-Phase Test](https://thoughtbot.com/blog/four-phase-test) pattern, using newlines
+ to separate phases.
+- Use `Gitlab.config.gitlab.host` rather than hard coding `'localhost'`.
+- Don't assert against the absolute value of a sequence-generated attribute (see
+ [Gotchas](../gotchas.md#do-not-assert-against-the-absolute-value-of-a-sequence-generated-attribute)).
+- Avoid using `expect_any_instance_of` or `allow_any_instance_of` (see
+ [Gotchas](../gotchas.md#avoid-using-expect_any_instance_of-or-allow_any_instance_of-in-rspec)).
+- Don't supply the `:each` argument to hooks because it's the default.
+- On `before` and `after` hooks, prefer it scoped to `:context` over `:all`.
+- When using `evaluate_script("$('.js-foo').testSomething()")` (or `execute_script`) which acts on a given element,
+ use a Capybara matcher beforehand (such as `find('.js-foo')`) to ensure the element actually exists.
+- Use `focus: true` to isolate parts of the specs you want to run.
+- Use [`:aggregate_failures`](https://rspec.info/features/3-12/rspec-core/expectation-framework-integration/aggregating-failures/) when there is more than one expectation in a test.
+- For [empty test description blocks](https://github.com/rubocop-hq/rspec-style-guide#it-and-specify), use `specify` rather than `it do` if the test is self-explanatory.
+- Use `non_existing_record_id`/`non_existing_record_iid`/`non_existing_record_access_level`
+ when you need an ID/IID/access level that doesn't actually exist. Using 123, 1234,
+ or even 999 is brittle as these IDs could actually exist in the database in the
+ context of a CI run.
+
### Eager loading the application code
By default, the application code:
@@ -132,9 +158,44 @@ We should reduce test dependencies, and avoiding
capabilities also reduces the amount of set-up needed.
`:js` is particularly important to avoid. This must only be used if the feature
-test requires JavaScript reactivity in the browser. Using a headless
+test requires JavaScript reactivity in the browser (for example, clicking a Vue.js component). Using a headless
browser is much slower than parsing the HTML response from the app.
+#### Profiling: see where your test spend its time
+
+[`rspec-stackprof`](https://github.com/dkhroad/rspec-stackprof) can be used to generate a flame graph that shows you where you test spend its time.
+
+The gem generates a JSON report that we can upload to <https://www.speedscope.app> for an interactive visualization.
+
+##### Installation
+
+`stackprof` gem is [already installed with GitLab](https://gitlab.com/gitlab-org/gitlab/-/blob/695fcee0c5541b4ead0a90eb9b8bf0b69bee796c/Gemfile#L487), and we also have a script available that generates the JSON report (`bin/rspec-stackprof`).
+
+```shell
+# Optional: install the `speedscope` package to easily upload the JSON report to https://www.speedscope.app
+npm install -g speedscope
+```
+
+##### Generate the JSON report
+
+```shell
+bin/rspec-stackprof --speedscope=true <your_slow_spec>
+# There will be the name of the report displayed when the script ends.
+
+# Upload the JSON report to speedscope.app
+speedscope tmp/<your-json-report>.json
+```
+
+##### How to interpret the flamegraph
+
+Below are some useful tips to interpret and navigate the flamegraph:
+
+- There are [several views available](https://github.com/jlfwong/speedscope#views) for the flamegraph. `Left Heavy` is particularly useful when there are a lot of function calls (for example, feature specs).
+- You can zoom in or out! See [the navigation documentation](https://github.com/jlfwong/speedscope#navigation)
+- If you are working on a slow feature test, search for `Capybara::DSL#` in the search to see the capybara actions that are made, and how long they take!
+
+See [#414929](https://gitlab.com/gitlab-org/gitlab/-/issues/414929#note_1425239887) or [#375004](https://gitlab.com/gitlab-org/gitlab/-/issues/375004#note_1109867718) for some analysis examples.
+
#### Optimize factory usage
A common cause of slow tests is excessive creation of objects, and thus
@@ -240,9 +301,21 @@ There are various ways to create objects and store them in variables in your tes
- `let` lazily creates the object. It isn't created until the object is called. `let` is generally inefficient as it creates a new object for every example. `let` is fine for simple values. However, more efficient variants of `let` are best when dealing with database models such as factories.
- `let_it_be_with_refind` works similar to `let_it_be_with_reload`, but the [former calls `ActiveRecord::Base#find`](https://github.com/test-prof/test-prof/blob/936b29f87b36f88a134e064aa6d8ade143ae7a13/lib/test_prof/ext/active_record_refind.rb#L15) instead of `ActiveRecord::Base#reload`. `reload` is usually faster than `refind`.
- `let_it_be_with_reload` creates an object one time for all examples in the same context, but after each example, the database changes are rolled back, and `object.reload` will be called to restore the object to its original state. This means you can make changes to the object before or during an example. However, there are cases where [state leaks across other models](https://github.com/test-prof/test-prof/blob/master/docs/recipes/let_it_be.md#state-leakage-detection) can occur. In these cases, `let` may be an easier option, especially if only a few examples exist.
-- `let_it_be` creates an immutable object one time for all of the examples in the same context. This is a great alternative to `let` and `let!` for objects that do not need to change from one example to another. Using `let_it_be` can dramatically speed up tests that create database models. See <https://github.com/test-prof/test-prof/blob/master/docs/recipes/let_it_be.md#let-it-be> for more details and examples.
+- `let_it_be` creates an object one time for all of the examples in the same context. This is a great alternative to `let` and `let!` for objects that do not need to change from one example to another. Using `let_it_be` can dramatically speed up tests that create database models. See <https://github.com/test-prof/test-prof/blob/master/docs/recipes/let_it_be.md#let-it-be> for more details and examples.
+
+Pro-tip: When writing tests, it is best to consider the objects inside a `let_it_be` as **immutable**, as there are some important caveats when modifying objects inside a `let_it_be` declaration ([1](https://github.com/test-prof/test-prof/blob/master/docs/recipes/let_it_be.md#database-is-rolled-back-to-a-pristine-state-but-the-objects-are-not), [2](https://github.com/test-prof/test-prof/blob/master/docs/recipes/let_it_be.md#modifiers)). To make your `let_it_be` objects immutable, consider using `.freeze`:
+
+```shell
+# Before
+let_it_be(:namespace) { create_default(:namespace)
+
+# After
+let_it_be(:namespace) { create_default(:namespace).freeze
+```
+
+See <https://github.com/test-prof/test-prof/blob/master/docs/recipes/let_it_be.md#state-leakage-detection> for more information on `let_it_be` freezing.
-`let_it_be` is the most optimized option since it instantiates an object once and does not change it. If you find yourself needing `let` instead of `let_it_be`, try `let_it_be_with_reload`.
+`let_it_be` is the most optimized option since it instantiates an object once and shares its instance across examples. If you find yourself needing `let` instead of `let_it_be`, try `let_it_be_with_reload`.
```ruby
# Old
@@ -336,6 +409,35 @@ NOTE:
Refrain from using this stub helper if the test code relies on persisting
`project_authorizations` or `Member` records. Use `Project#add_member` or `Group#add_member` instead.
+#### Additional profiling metrics
+
+We can use the `rspec_profiling` gem to diagnose, for instance, the number of SQL queries we're making when running a test.
+
+This could be caused by some application side SQL queries **triggered by a test that could mock parts that are not under test** (for example, [!123810](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/123810)).
+
+[See the instructions in the performance docs](../performance.md#rspec-profiling).
+
+#### Troubleshoot slow feature test
+
+A slow feature test can generally be optimized the same way as any other test. However, there are some specific techniques that can make the troubleshooting session more fruitful.
+
+##### See what the feature test is doing in the UI
+
+```shell
+# Before
+bin/rspec ./spec/features/admin/admin_settings_spec.rb:992
+
+# After
+WEBDRIVER_HEADLESS=0 bin/rspec ./spec/features/admin/admin_settings_spec.rb:992
+```
+
+See [Run `:js` spec in a visible browser](#run-js-spec-in-a-visible-browser) for more info.
+
+##### Search for `Capybara::DSL#` when using profiling
+
+<!-- TODO: Add the search keywords -->
+When using [`stackprof` flamegraphs](#profiling-see-where-your-test-spend-its-time), search for `Capybara::DSL#` in the search to see the capybara actions that are made, and how long they take!
+
#### Identify slow tests
Running a spec with profiling is a good way to start optimizing a spec. This can
@@ -437,31 +539,11 @@ performance gains.
When combining tests, consider using `:aggregate_failures`, so that the full
results are available, and not just the first failure.
-### General guidelines
+#### In case you're stuck
-- Use a single, top-level `RSpec.describe ClassName` block.
-- Use `.method` to describe class methods and `#method` to describe instance
- methods.
-- Use `context` to test branching logic.
-- Try to match the ordering of tests to the ordering in the class.
-- Try to follow the [Four-Phase Test](https://thoughtbot.com/blog/four-phase-test) pattern, using newlines
- to separate phases.
-- Use `Gitlab.config.gitlab.host` rather than hard coding `'localhost'`
-- Don't assert against the absolute value of a sequence-generated attribute (see
- [Gotchas](../gotchas.md#do-not-assert-against-the-absolute-value-of-a-sequence-generated-attribute)).
-- Avoid using `expect_any_instance_of` or `allow_any_instance_of` (see
- [Gotchas](../gotchas.md#avoid-using-expect_any_instance_of-or-allow_any_instance_of-in-rspec)).
-- Don't supply the `:each` argument to hooks because it's the default.
-- On `before` and `after` hooks, prefer it scoped to `:context` over `:all`
-- When using `evaluate_script("$('.js-foo').testSomething()")` (or `execute_script`) which acts on a given element,
- use a Capybara matcher beforehand (such as `find('.js-foo')`) to ensure the element actually exists.
-- Use `focus: true` to isolate parts of the specs you want to run.
-- Use [`:aggregate_failures`](https://rspec.info/features/3-12/rspec-core/expectation-framework-integration/aggregating-failures/) when there is more than one expectation in a test.
-- For [empty test description blocks](https://github.com/rubocop-hq/rspec-style-guide#it-and-specify), use `specify` rather than `it do` if the test is self-explanatory.
-- Use `non_existing_record_id`/`non_existing_record_iid`/`non_existing_record_access_level`
- when you need an ID/IID/access level that doesn't actually exists. Using 123, 1234,
- or even 999 is brittle as these IDs could actually exist in the database in the
- context of a CI run.
+We have a `backend_testing_performance` [domain expertise](https://about.gitlab.com/handbook/engineering/workflow/code-review/#domain-experts) to list people that could help refactor slow backend specs.
+
+To find people that could help, search for `backend testing performance` on the [Engineering Projects page](https://about.gitlab.com/handbook/engineering/projects/), or look directly in [the `www-gitlab-org` project](https://gitlab.com/search?group_id=6543&nav_source=navbar&project_id=7764&repository_ref=master&scope=blobs&search=backend_testing_performance+path%3Adata%2Fteam_members%2F*&search_code=true).
### Feature category metadata
@@ -918,7 +1000,7 @@ describe 'specs which require time to be frozen to a specific date and/or time',
end
```
-[Under the hood](https://gitlab.com/gitlab-org/gitlab/-/blob/master/spec/support/time_travel.rb), these helpers use the `around(:each)` hook and the block syntax of the
+[Under the hood](https://gitlab.com/gitlab-org/gitlab/-/blob/master/gems/gitlab-rspec/lib/gitlab/rspec/configurations/time_travel.rb), these helpers use the `around(:each)` hook and the block syntax of the
[`ActiveSupport::Testing::TimeHelpers`](https://api.rubyonrails.org/classes/ActiveSupport/Testing/TimeHelpers.html)
methods:
@@ -932,6 +1014,19 @@ around(:each) do |example|
end
```
+Remember that any objects created before the examples run (such as objects created via `let_it_be`) will be outside spec scope.
+If the time for everything needs to be frozen, `before :all` can be used to encapsulate the setup as well.
+
+```ruby
+before :all do
+ freeze_time
+end
+
+after :all do
+ unfreeze_time
+end
+```
+
### Feature flags in tests
This section was moved to [developing with feature flags](../feature_flags/index.md).
@@ -1292,6 +1387,19 @@ describe "#==" do
end
```
+If, after creating a table-based test, you see an error that looks like this:
+
+```ruby
+NoMethodError:
+ undefined method `to_params'
+
+ param_sets = extracted.is_a?(Array) ? extracted : extracted.to_params
+ ^^^^^^^^^^
+ Did you mean? to_param
+```
+
+That indicates that you need to include the line `using RSpec::Parameterized::TableSyntax` in the spec file.
+
<!-- vale gitlab.Spelling = NO -->
WARNING:
@@ -1470,19 +1578,17 @@ under `spec/support/helpers/`. Helpers can be placed in a subfolder if they appl
to a certain type of specs only (such as features or requests) but shouldn't be
if they apply to multiple type of specs.
-Helpers should follow the Rails naming / namespacing convention. For instance
-`spec/support/helpers/cycle_analytics_helpers.rb` should define:
+Helpers should follow the Rails naming / namespacing convention, where
+`spec/support/helpers/` is the root. For instance
+`spec/support/helpers/features/iteration_helpers.rb` should define:
```ruby
-module Spec
- module Support
- module Helpers
- module CycleAnalyticsHelpers
- def create_commit_referencing_issue(issue, branch_name: random_git_name)
- project.repository.add_branch(user, branch_name, 'main')
- create_commit("Commit for ##{issue.iid}", issue.project, user, branch_name)
- end
- end
+# frozen_string_literal: true
+
+module Features
+ module IterationHelpers
+ def iteration_period(iteration)
+ "#{iteration.start_date.to_fs(:medium)} - #{iteration.due_date.to_fs(:medium)}"
end
end
end
@@ -1492,8 +1598,14 @@ Helpers should not change the RSpec configuration. For instance, the helpers mod
described above should not include:
```ruby
+# bad
RSpec.configure do |config|
- config.include Spec::Support::Helpers::CycleAnalyticsHelpers
+ config.include Features::IterationHelpers
+end
+
+# good, include in specific spec
+RSpec.describe 'Issue Sidebar', feature_category: :team_planning do
+ include Features::IterationHelpers
end
```
diff --git a/doc/development/testing_guide/contract/index.md b/doc/development/testing_guide/contract/index.md
index cf23792e239..577699fa828 100644
--- a/doc/development/testing_guide/contract/index.md
+++ b/doc/development/testing_guide/contract/index.md
@@ -78,7 +78,9 @@ As mentioned in the [folder structure section](#consumer-tests), consumer tests
#### Provider naming
-These are the API endpoints that provides the data to the consumer so they are named according to the API endpoint they pertain to. Be mindful that this begins with the HTTP request method and the rest of the name is as descriptive as possible. For example, if we're writing a test for the `GET /groups/:id/projects` endpoint, we don't want to name it "GET projects endpoint" as there is a `GET /projects` endpoint as well that also fetches a list of projects the user has access to across all of GitLab. To choose an appropriate name, we can start by checking out our [API documentation](../../../api/api_resources.md) and naming it the same way it is named in there while making sure to keep the name in sentence case. So the [`GET /groups/:id/projects`](../../../api/groups.md#list-a-groups-projects) would be called `GET list a group's projects` and [`GET /projects`](../../../api/projects.md#list-all-projects) would be called `GET list all projects`. Subsequently, the test files are named `get_list_a_groups_projects_helper.rb` and `get_list_all_projects_helper.rb` respectively.
+These are the API endpoints that provide the data to the consumer so they are named according to the API endpoint they pertain to. Be mindful that this begins with the HTTP request method and the rest of the name is as descriptive as possible. For example, if we're writing a test for the `GET /groups/:id/projects` endpoint, we don't want to name it "GET projects endpoint" as there is a `GET /projects` endpoint as well that also fetches a list of projects the user has access to across all of GitLab.
+
+To choose an appropriate name, we can start by checking out our [API documentation](../../../api/api_resources.md) and naming it the same way it is named in there while making sure to keep the name in sentence case. So [`GET /groups/:id/projects`](../../../api/groups.md#list-a-groups-projects) would be called `GET list a group's projects` and the test file name is `get_list_a_groups_projects_helper.rb`. [`GET /projects`](../../../api/projects.md#list-all-projects) would be called `GET list all projects`, and the test file name `get_list_all_projects_helper.rb`.
There are some cases where the provider being tested may not be documented so, in those cases, fall back to starting with the HTTP request method followed by a name that is as descriptive as possible to ensure it's easy to tell what the provider is for.
diff --git a/doc/development/testing_guide/contract/provider_tests.md b/doc/development/testing_guide/contract/provider_tests.md
index cb3aeae529d..71940941d51 100644
--- a/doc/development/testing_guide/contract/provider_tests.md
+++ b/doc/development/testing_guide/contract/provider_tests.md
@@ -10,7 +10,7 @@ This tutorial guides you through writing a provider test from scratch. It is a c
## Create the skeleton
-Provider tests are quite simple. The goal is to set up the test data and then link that with the corresponding contract. Start by creating a file called `get_discussions_helper.rb` under `spec/contracts/provider/pact_helpers/project/merge_request`. Note that the files are called `helpers` to match how they are called by Pact in the Rake tasks, which are set up at the end of this tutorial.
+Provider tests are quite simple. The goal is to set up the test data and then link that with the corresponding contract. Start by creating a file called `get_discussions_helper.rb` under `spec/contracts/provider/pact_helpers/project/merge_request`. The files are called `helpers` to match how they are called by Pact in the Rake tasks, which are set up at the end of this tutorial.
For more information about how the contract test directory is structured, see [Test suite folder structure](index.md#test-suite-folder-structure).
@@ -122,7 +122,7 @@ To create the test data, create `show_state.rb` under `spec/contracts/provider/s
### Default user in `spec/contracts/provider/spec_helper.rb`
-Before you create the test data, note that a default user is created in the [`spec_helper`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/spec/contracts/provider/spec_helper.rb), which is the user being used for the test runs. This user is configured using `RSpec.configure`, as Pact actually is built on top of RSpec. This step allows us to configure the user before any of the test runs.
+Before you create the test data, a default user is created in the [`spec_helper`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/spec/contracts/provider/spec_helper.rb), which is the user being used for the test runs. This user is configured using `RSpec.configure`, as Pact actually is built on top of RSpec. This step allows us to configure the user before any of the test runs.
```ruby
RSpec.configure do |config|
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 78e6af4a347..4627d5d29cb 100644
--- a/doc/development/testing_guide/end_to_end/beginners_guide.md
+++ b/doc/development/testing_guide/end_to_end/beginners_guide.md
@@ -219,8 +219,8 @@ end
**How do we test?**
-1. Check if the user avatar appears in the top navigation.
-1. Check if the user avatar *does not* appear in the top navigation.
+1. Check if the user avatar appears in the left sidebar.
+1. Check if the user avatar *does not* appear in the left sidebar.
Behind the scenes, `be_signed_in` is a
[predicate matcher](https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/predicates/)
diff --git a/doc/development/testing_guide/end_to_end/best_practices.md b/doc/development/testing_guide/end_to_end/best_practices.md
index c1f06bb9a66..96bd02d235b 100644
--- a/doc/development/testing_guide/end_to_end/best_practices.md
+++ b/doc/development/testing_guide/end_to_end/best_practices.md
@@ -99,6 +99,43 @@ end
We recommend creating four associated test cases, two for each shared example.
+## Test naming
+
+Test names should form a readable sentence defining the purpose of the test. Our [testing guide](index.md) extends the [Thoughtbot testing style guide](https://github.com/thoughtbot/guides/tree/master/testing-rspec). This page clarifies the guidelines, along with input from [https://www.betterspecs.org/](https://www.betterspecs.org/) and [the RSpec naming guide](https://rspec.rubystyle.guide/#naming.)
+
+### Recommended approach
+
+The following block generates a test named `Plan wiki content creation in a project adds a home page`
+
+``` ruby
+# `RSpec.describe` is the DevOps Stage being covered
+RSpec.describe 'Plan', product_group: :knowledge do
+ # `describe` is the feature being tested
+ describe 'wiki content creation' do
+ # `context` provides the condition being covered
+ context 'in a project'
+ # `it` defines the expected result of the test
+ it 'adds a home page'
+ ...
+ end
+ ...
+ end
+ ...
+ end
+end
+```
+
+1. Every `describe`, `context`, and `it` blocks should have a short description attached
+1. Keep descriptions as concise as possible.
+ 1. Long descriptions or multiple conditionals could be a sign it should be split up (additional `context` blocks).
+ 1. The [Documentation Style Guide](../../documentation/styleguide/index.md) gives recommendations on how to write concisely and with [active voice](../../documentation/styleguide/word_list.md#active-voice).
+1. The outermost `Rspec.describe` block should be [the DevOps stage name](https://about.gitlab.com/handbook/product/categories/#devops-stages)
+1. Inside the `Rspec.describe` block is a `describe` block with the name of the feature being tested
+1. Optional `context` blocks define what the conditions being tested are
+ 1. `context` blocks descriptions should begin with `when`, `with`, `without`, `for`, `and`, `on`, `in`, `as`, or `if` to match the [rubocop rule](https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/ContextWording)
+1. The `it` block describes the pass/fail criteria for the test
+ 1. In `shared_examples` with a single example a `specify` block can be used instead of a named `it` block
+
## Prefer API over UI
The end-to-end testing framework has the ability to fabricate its resources on a case-by-case basis.
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 e473b158087..228f63d2354 100644
--- a/doc/development/testing_guide/end_to_end/feature_flags.md
+++ b/doc/development/testing_guide/end_to_end/feature_flags.md
@@ -55,18 +55,16 @@ RSpec.describe "with feature flag enabled", feature_flag: {
let(:project) { Resource::Project.fabricate_via_api! }
- before do
+ around do |example|
Runtime::Feature.enable(:feature_flag_name, project: project)
+ example.run
+ Runtime::Feature.disable(:feature_flag_name, project: project)
end
it "feature flag test" do
# Execute the test with the feature flag enabled.
# It will only affect the project created in this test.
end
-
- after do
- Runtime::Feature.disable(:feature_flag_name, project: project)
- end
end
```
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 b698eb53f75..f13686981a9 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
@@ -15,7 +15,7 @@ This is a partial list of the [RSpec metadata](https://rspec.info/features/3-12/
|-----------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `:elasticsearch` | The test requires an Elasticsearch service. It is used by the [instance-level scenario](https://gitlab.com/gitlab-org/gitlab-qa#definitions) [`Test::Integration::Elasticsearch`](https://gitlab.com/gitlab-org/gitlab/-/blob/72b62b51bdf513e2936301cb6c7c91ec27c35b4d/qa/qa/ee/scenario/test/integration/elasticsearch.rb) to include only tests that require Elasticsearch. |
| `:except` | The test is to be run in their typical execution contexts _except_ as specified. See [test execution context selection](execution_context_selection.md) for more information. |
-| `:feature_flag` | The test uses a feature flag and therefore requires an administrator account to run. When `scope` is set to `:global`, the test will be skipped on all live .com environments. Otherwise, it will be skipped only on Canary, Production, and Pre-production. See [testing with feature flags](../../../development/testing_guide/end_to_end/feature_flags.md) for more details. |
+| `:feature_flag` | The test uses a feature flag and therefore requires an administrator account to run. When `scope` is set to `:global`, the test will be skipped on all live .com environments. Otherwise, it will be skipped only on Canary, Production, and Pre-production. See [testing with feature flags](../../../development/testing_guide/end_to_end/feature_flags.md) for more details. |
| `:framework` | The test makes sanity assertions around the QA framework itself |
| `:geo` | The test requires two GitLab Geo instances - a primary and a secondary - to be spun up. |
| `:gitaly_cluster` | The test runs against a GitLab instance where repositories are stored on redundant Gitaly nodes behind a Praefect node. All nodes are [separate containers](../../../administration/gitaly/praefect.md#requirements). Tests that use this tag have a longer setup time since there are three additional containers that need to be started. |
@@ -33,10 +33,11 @@ This is a partial list of the [RSpec metadata](https://rspec.info/features/3-12/
| `:mattermost` | The test requires a GitLab Mattermost service on the GitLab instance. |
| `:metrics` | The test requires a GitLab instance where [dedicated metrics exporters](../../../administration/monitoring/prometheus/web_exporter.md) are running alongside Puma and Sidekiq. |
| `:mixed_env` | The test should only be executed in environments that have a paired canary version available through traffic routing based on the existence of the `gitlab_canary=true` cookie. Tests in this category are switching the cookie mid-test to validate mixed deployment environments. |
+| `:oauth` | The test uses and external OmniAuth provider to log in to GitLab |
| `:object_storage` | The test requires a GitLab instance to be configured to use multiple [object storage types](../../../administration/object_storage.md). Uses MinIO as the object storage server. |
| `:only` | The test is only to be run in specific execution contexts. See [test execution context selection](execution_context_selection.md) for more information. |
| `:orchestrated` | The GitLab instance under test may be [configured by `gitlab-qa`](https://gitlab.com/gitlab-org/gitlab-qa/-/blob/master/docs/what_tests_can_be_run.md#orchestrated-tests) to be different to the default GitLab configuration, or `gitlab-qa` may launch additional services in separate Docker containers, or both. Tests tagged with `:orchestrated` are excluded when testing environments where we can't dynamically modify the GitLab configuration (for example, Staging). | |
-| `:product_group` | Specifies what product group the test belongs to. See [Product sections, stages, groups, and categories](https://about.gitlab.com/handbook/product/categories/) for the comprehensive groups list. |
+| `:product_group` | Specifies what product group the test belongs to. See [Product sections, stages, groups, and categories](https://about.gitlab.com/handbook/product/categories/) for the comprehensive groups list. |
| `:quarantine` | The test has been [quarantined](https://about.gitlab.com/handbook/engineering/quality/quality-engineering/debugging-qa-test-failures/#quarantining-tests), runs in a separate job that only includes quarantined tests, and is allowed to fail. The test is skipped in its regular job so that if it fails it doesn't hold up the pipeline. Note that you can also [quarantine a test only when it runs in a specific context](execution_context_selection.md#quarantine-a-test-for-a-specific-environment). |
| `:relative_url` | The test requires a GitLab instance to be installed under a [relative URL](../../../install/relative_url.md). |
| `:reliable` | The test has been [promoted to a reliable test](https://about.gitlab.com/handbook/engineering/quality/quality-engineering/reliable-tests/#promoting-an-existing-test-to-reliable) meaning it passes consistently in all pipelines, including merge requests. |
diff --git a/doc/development/testing_guide/end_to_end/style_guide.md b/doc/development/testing_guide/end_to_end/style_guide.md
index 32d8bf339ed..f5a3fa2fc51 100644
--- a/doc/development/testing_guide/end_to_end/style_guide.md
+++ b/doc/development/testing_guide/end_to_end/style_guide.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
This document describes the conventions used at GitLab for writing End-to-end (E2E) tests using the GitLab QA project.
-Please note that this guide is an extension of the primary [testing standards and style guidelines](../index.md). If this guide defines a rule that contradicts the primary guide, this guide takes precedence.
+This guide is an extension of the primary [testing standards and style guidelines](../index.md). If this guide defines a rule that contradicts the primary guide, this guide takes precedence.
## `click_` versus `go_to_`
diff --git a/doc/development/testing_guide/flaky_tests.md b/doc/development/testing_guide/flaky_tests.md
index 9114ec3d179..2d36377967e 100644
--- a/doc/development/testing_guide/flaky_tests.md
+++ b/doc/development/testing_guide/flaky_tests.md
@@ -63,7 +63,7 @@ difficult to achieve locally. Ordering issues are easier to reproduce by repeate
`master` if the order of tests changes.
- [Example 2](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91016/diffs): A test asserts
that trying to find a record with an nonexistent ID returns an error message. The test uses an
- hardcoded ID that's supposed to not exist (e.g. `42`). If the test is run early in the test
+ hardcoded ID that's supposed to not exist (for example, `42`). If the test is run early in the test
suite, it might pass as not enough records were created before it, but as soon as it would run
later in the suite, there could be a record that actually has the ID `42`, hence the test would
start to fail.
@@ -185,7 +185,7 @@ After the long-term quarantining MR has reached production, you should revert th
For Jest specs, you can use the `.skip` method along with the `eslint-disable-next-line` comment to disable the `jest/no-disabled-tests` ESLint rule and include the issue URL. Here's an example:
```javascript
-// https://gitlab.com/gitlab-org/gitlab/-/issues/56789
+// quarantine: https://gitlab.com/gitlab-org/gitlab/-/issues/56789
// eslint-disable-next-line jest/no-disabled-tests
it.skip('should throw an error', () => {
expect(response).toThrowError(expected_error)
@@ -198,6 +198,12 @@ This means it is skipped unless the test suit is run with `--runInBand` Jest com
jest --runInBand
```
+A list of files with quarantined specs in them can be found with the command:
+
+```shell
+yarn jest:quarantine
+```
+
For both test frameworks, make sure to add the `~"quarantined test"` label to the issue.
Once a test is in quarantine, there are 3 choices:
@@ -210,10 +216,10 @@ Once a test is in quarantine, there are 3 choices:
## Automatic retries and flaky tests detection
-On our CI, we use [RSpec::Retry](https://github.com/NoRedInk/rspec-retry) to automatically retry a failing example a few
+On our CI, we use [`RSpec::Retry`](https://github.com/NoRedInk/rspec-retry) to automatically retry a failing example a few
times (see [`spec/spec_helper.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/spec/spec_helper.rb) for the precise retries count).
-We also use a custom [`RspecFlaky::Listener`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/tooling/rspec_flaky/listener.rb).
+We also use a custom [`RspecFlaky::Listener`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/gems/rspec_flaky/lib/rspec_flaky/listener.rb).
This listener runs in the `update-tests-metadata` job in `maintenance` scheduled pipelines
on the `master` branch, and saves flaky examples to `rspec/flaky/report-suite.json`.
The report file is then retrieved by the `retrieve-tests-metadata` job in all pipelines.
diff --git a/doc/development/testing_guide/frontend_testing.md b/doc/development/testing_guide/frontend_testing.md
index b1fde5ed139..1b50bd410c2 100644
--- a/doc/development/testing_guide/frontend_testing.md
+++ b/doc/development/testing_guide/frontend_testing.md
@@ -51,17 +51,28 @@ The default timeout for Jest is set in
If your test exceeds that time, it fails.
If you cannot improve the performance of the tests, you can increase the timeout
-for a specific test using [`jest.setTimeout`](https://jestjs.io/docs/27.x/jest-object#jestsettimeouttimeout)
+for the whole suite using [`jest.setTimeout`](https://jestjs.io/docs/28.x/jest-object#jestsettimeouttimeout)
```javascript
+jest.setTimeout(500);
+
describe('Component', () => {
it('does something amazing', () => {
- jest.setTimeout(500);
// ...
});
});
```
+or for a specific test by providing a third argument to [`it`](https://jestjs.io/docs/28.x/api#testname-fn-timeout)
+
+```javascript
+describe('Component', () => {
+ it('does something amazing', () => {
+ // ...
+ }, 500)
+})
+```
+
Remember that the performance of each test depends on the environment.
### Test-specific stylesheets
@@ -540,7 +551,7 @@ describe('when logged in', () => {
### Ensuring that tests are isolated
-Tests are normally architected in a pattern which requires a recurring setup of the component under test. This is often achieved by making use of the `beforeEach` hook.
+Tests are typically architected in a pattern which requires a recurring setup of the component under test. This is often achieved by making use of the `beforeEach` hook.
Example
@@ -1225,7 +1236,7 @@ You can download any older version of Firefox from the releases FTP server, <htt
1. Rename the application to something like `Firefox_Old`.
1. Move the application to the `Applications` folder.
1. Open up a terminal and run `/Applications/Firefox_Old.app/Contents/MacOS/firefox-bin -profilemanager` to create a new profile specific to that Firefox version.
-1. Once the profile has been created, quit the app, and run it again like normal. You now have a working older Firefox version.
+1. Once the profile has been created, quit the app, and run it again like usual. You now have a working older Firefox version.
## Snapshots
@@ -1742,7 +1753,7 @@ If you are stubbing an `ee` feature flag, then use:
You can run your spec with the prefix `WEBDRIVER_HEADLESS=0` to open an actual browser. However, the specs goes though the commands quickly and leaves you no time to look around.
-To avoid this problem, you can write `binding.pry` on the line where you want Capybara to stop execution. You are then inside the browser with normal usage. To understand why you cannot find certain elements, you can:
+To avoid this problem, you can write `binding.pry` on the line where you want Capybara to stop execution. You are then inside the browser with standard usage. To understand why you cannot find certain elements, you can:
- Select elements.
- Use the console and network tab.
diff --git a/doc/development/testing_guide/review_apps.md b/doc/development/testing_guide/review_apps.md
index 1e5ee9f3003..b4ae23336d5 100644
--- a/doc/development/testing_guide/review_apps.md
+++ b/doc/development/testing_guide/review_apps.md
@@ -204,10 +204,10 @@ subgraph "CNG-mirror pipeline"
- If the `review-deploy` job keeps failing (and a manual retry didn't help),
please post a message in the `#g_qe_engineering_productivity` channel and/or create a `~"Engineering Productivity"` `~"ep::review apps"` `~"type::bug"`
- issue with a link to your merge request. Note that the deployment failure can
+ issue with a link to your merge request. 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 (we already retry them once),
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/test_results_tracking.md b/doc/development/testing_guide/test_results_tracking.md
index 28407e806a3..92c1e0917c7 100644
--- a/doc/development/testing_guide/test_results_tracking.md
+++ b/doc/development/testing_guide/test_results_tracking.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
We developed the [`gitlab_quality-test_tooling`](https://gitlab.com/gitlab-org/ruby/gems/gitlab_quality-test_tooling) gem that includes several commands to automate test results tracking.
-The goal of this gem is to have a consolidated set of tooling that we use accross our various test suite (e.g. GitLab Rails & E2E test suites).
+The goal of this gem is to have a consolidated set of tooling that we use across our various test suite (for example, GitLab Rails & E2E test suites).
The initial motivation and development was tracked by [this epic](https://gitlab.com/groups/gitlab-org/-/epics/10536).
diff --git a/doc/development/value_stream_analytics.md b/doc/development/value_stream_analytics.md
index e056ce9b064..30244407e38 100644
--- a/doc/development/value_stream_analytics.md
+++ b/doc/development/value_stream_analytics.md
@@ -41,8 +41,8 @@ feature-full.
|Total time chart|Yes|No|No|
|Task by type chart|Yes|No|No|
|DORA Metrics|Yes|Yes|No|
-|Cycle time and lead time summary (Key metrics)|Yes|Yes|No|
-|New issues, commits and deploys (Key metrics)|Yes, excluding commits|Yes|Yes|
+|Cycle time and lead time summary (Lifecycle metrics)|Yes|Yes|No|
+|New issues, commits and deploys (Lifecycle metrics)|Yes, excluding commits|Yes|Yes|
|Uses aggregated backend|Yes|No|No|
|Date filter behavior|Filters items [finished within the date range](https://gitlab.com/groups/gitlab-org/-/epics/6046)|Filters items by creation date.|Filters items by creation date.|
|Authorization|At least reporter|At least reporter|Can be public.|
diff --git a/doc/development/work_items_widgets.md b/doc/development/work_items_widgets.md
index 6c453f49db1..2e5a09af911 100644
--- a/doc/development/work_items_widgets.md
+++ b/doc/development/work_items_widgets.md
@@ -123,20 +123,20 @@ Because information about what widgets are assigned to each work item type is st
### Structure of widget definitions table
-Each record in the table defines mapping of a widget to a work item type. Currently only "global" definitions (definitions with NULL namespace_id) are used. In next iterations we plan to allow customization of these mappings. For example table below defines that:
+Each record in the table defines mapping of a widget to a work item type. Currently only "global" definitions (definitions with NULL `namespace_id`) are used. In next iterations we plan to allow customization of these mappings. For example table below defines that:
- Weight widget is enabled for work item types 0 and 1
- in namespace 1 Weight widget is renamed to MyWeight. When user renames widget's name, it makes sense to rename all widget mappings in the namespace - because `name` attribute is denormalized, we have to create namespaced mappings for all work item types for this widget type.
- Weight widget can be disabled for specific work item types (in namespace 3 it's disabled for work item type 0, while still left enabled for work item type 1)
-| ID | Namespace_id | Work_item_type_id | Widget_type_enum | Position | Name | Disabled |
-|----| ------------ | ----------------- |----------------- |--------- |---------- |-------|
-| 1 | | 0 | 1 | 1 | Weight | false |
-| 2 | | 1 | 1 | 1 | Weight | false |
-| 3 | 1 | 0 | 1 | 0 | MyWeight | false |
-| 4 | 1 | 1 | 1 | 0 | MyWeight | false |
-| 5 | 2 | 0 | 1 | 1 | Other Weight | false |
-| 6 | 3 | 0 | 1 | 1 | Weight | true |
+| ID | `namespace_id` | `work_item_type_id` | `widget_type_enum` | Position | Name | Disabled |
+|:---|:---------------|:--------------------|:-------------------|:---------|:-------------|:---------|
+| 1 | | 0 | 1 | 1 | Weight | false |
+| 2 | | 1 | 1 | 1 | Weight | false |
+| 3 | 1 | 0 | 1 | 0 | MyWeight | false |
+| 4 | 1 | 1 | 1 | 0 | MyWeight | false |
+| 5 | 2 | 0 | 1 | 1 | Other Weight | false |
+| 6 | 3 | 0 | 1 | 1 | Weight | true |
## Backend architecture
diff --git a/doc/development/workhorse/channel.md b/doc/development/workhorse/channel.md
index f5693b57f7a..2c28cea42a3 100644
--- a/doc/development/workhorse/channel.md
+++ b/doc/development/workhorse/channel.md
@@ -37,7 +37,7 @@ Sec-WebSocket-Protocol: terminal.gitlab.com
```
At this point, the connection is still HTTP, so this is a request.
-The server can send a normal HTTP response, such as `404 Not Found` or
+The server can send a standard HTTP response, such as `404 Not Found` or
`500 Internal Server Error`.
If the server decides to permit the upgrade, it sends a HTTP
@@ -116,7 +116,7 @@ contain ANSI terminal control codes, and may be in any encoding.
## Workhorse to GitLab
Using the terminal as an example, before upgrading the browser,
-Workhorse sends a normal HTTP request to GitLab on a URL like
+Workhorse sends a standard HTTP request to GitLab on a URL like
`https://gitlab.com/group/project/environments/1/terminal.ws/authorize`.
This returns a JSON response containing details of where the
terminal can be found, and how to connect it. In particular,
diff --git a/doc/development/workhorse/configuration.md b/doc/development/workhorse/configuration.md
index e69f16c41f8..84fb557d9ec 100644
--- a/doc/development/workhorse/configuration.md
+++ b/doc/development/workhorse/configuration.md
@@ -53,9 +53,9 @@ Options:
-logFormat string
Log format to use defaults to text (text, json, structured, none) (default "text")
-pprofListenAddr string
- pprof listening address, e.g. 'localhost:6060'
+ pprof listening address, for example, 'localhost:6060'
-prometheusListenAddr string
- Prometheus listening address, e.g. 'localhost:9229'
+ Prometheus listening address, for example, 'localhost:9229'
-propagateCorrelationID X-Request-ID
Reuse existing Correlation-ID from the incoming request header X-Request-ID if present
-proxyHeadersTimeout duration
diff --git a/doc/gitlab-basics/feature_branch_workflow.md b/doc/gitlab-basics/feature_branch_workflow.md
index 65445c226ca..ed84d584f81 100644
--- a/doc/gitlab-basics/feature_branch_workflow.md
+++ b/doc/gitlab-basics/feature_branch_workflow.md
@@ -34,6 +34,6 @@ To merge changes from a local branch to a feature branch, follow this workflow.
git push origin feature_name
```
-1. Review your code: On the left sidebar, go to **Repository > Commits**.
+1. Review your code: On the left sidebar, go to **Code > Commits**.
1. [Create a merge request](../user/project/merge_requests/creating_merge_requests.md).
1. Your team lead reviews the code and merges it to the main branch.
diff --git a/doc/index.md b/doc/index.md
index 367f18ec159..2c90d2f0970 100644
--- a/doc/index.md
+++ b/doc/index.md
@@ -38,8 +38,8 @@ Have a look at some of our most popular topics:
| [Two-factor authentication](user/profile/account/two_factor_authentication.md) | Improve the security of your GitLab account. |
| [GitLab groups](user/group/index.md) | Manage projects together. |
| [Keyword reference for the `.gitlab-ci.yml` file](ci/yaml/index.md) | Available configuration options for `.gitlab-ci.yml` files. |
-| [Activate GitLab EE with a license](user/admin_area/license.md) | Activate GitLab Enterprise Edition functionality with a license. |
-| [Back up and restore GitLab](raketasks/backup_restore.md) | Rake tasks for backing up and restoring GitLab self-managed instances. |
+| [Activate GitLab EE with a license](administration/license.md) | Activate GitLab Enterprise Edition functionality with a license. |
+| [Back up and restore GitLab](administration/backup_restore/index.md) | Backing up and restoring GitLab self-managed instances. |
| [GitLab release and maintenance policy](policy/maintenance.md) | Policies for version naming and cadence, and also upgrade recommendations. |
| [Elasticsearch integration](integration/advanced_search/elasticsearch.md) | Integrate Elasticsearch with GitLab to enable advanced search. |
| [Database settings for Linux package installations](https://docs.gitlab.com/omnibus/settings/database.html) | Database settings for self-managed instances installed using Linux packages. |
diff --git a/doc/install/aws/gitlab_hybrid_on_aws.md b/doc/install/aws/gitlab_hybrid_on_aws.md
index 75b39a387dc..b4d55e30ab1 100644
--- a/doc/install/aws/gitlab_hybrid_on_aws.md
+++ b/doc/install/aws/gitlab_hybrid_on_aws.md
@@ -157,8 +157,8 @@ On Demand pricing is used in this table for comparisons, but should not be used
| Sidekiq | 2 vCPU, 8 GB | | |
| 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 |
+| One Node for Overhead and Miscellaneous (EKS Cluster AutoScaler, Grafana, Prometheus, etc) | + 8 vCPU, 16 GB | | |
+| **Grand Total w/ Overheads**<br />Minimum hosts = 3 | 24 vCPU, 48 GB | **c5.2xlarge** <br />(8vCPU/16 GB) 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:
@@ -168,7 +168,7 @@ If EKS node autoscaling is employed, it is likely that your average loading will
| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------- | ------------------------------- | ------------------------------- |
| **Bastion Host (Quick Start)** | 1 HA instance in ASG | **t2.micro** for prod, **m4.2xlarge** for performance testing | | |
| **PostgreSQL**<br />AWS Amazon RDS PostgreSQL Nodes Configuration (GPT tested) | 2vCPU, 7.5 GB<br />Tested with Graviton ARM | **db.r6g.large** x 3 nodes <br />(6vCPU, 48 GB) | 3 nodes x $0.26 = $0.78/hr | 3 nodes x $0.26 = $0.78/hr |
-| **Redis** | 1vCPU, 3.75GB<br />(across 12 nodes for Redis Cache, Redis Queues/Shared State, Sentinel Cache, Sentinel Queues/Shared State) | **cache.m6g.large** x 3 nodes<br />(6vCPU, 19GB) | 3 nodes x $0.15 = $0.45/hr | 2 nodes x $0.15 = $0.30/hr |
+| **Redis** | 1vCPU, 3.75GB<br />(across 12 nodes for Redis Cache, Redis Queues/Shared State, Sentinel Cache, Sentinel Queues/Shared State) | **cache.m6g.large** x 3 nodes<br />(6vCPU, 19 GB) | 3 nodes x $0.15 = $0.45/hr | 2 nodes x $0.15 = $0.30/hr |
| **<u>Gitaly Cluster</u>** [Details](gitlab_sre_for_aws.md#gitaly-sre-considerations) | [Gitaly & Praefect Must Have an Uneven Node Count for HA](gitlab_sre_for_aws.md#gitaly-and-praefect-elections) | | | |
| Gitaly Instances (in ASG) | 12 vCPU, 45GB<br />(across 3 nodes) | **m5.xlarge** x 3 nodes<br />(48 vCPU, 180 GB) | $0.192 x 3 = $0.58/hr | $0.192 x 3 = $0.58/hr |
| | The GitLab Reference architecture for 2K is not Highly Available and therefore has a single Gitaly no Praefect. AWS Quick Starts MUST be HA, so it implements Praefect from the 3K Ref Architecture to meet that requirement | | | |
@@ -186,7 +186,7 @@ If EKS node autoscaling is employed, it is likely that your average loading will
- [3K 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/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)
- Elastic Auto Scale GPT Test Results start with an idle scaled cluster and then start the standard GPT test to determine if the EKS Auto Scaler performs well enough to keep up with performance test demands. In general this is substantially harder ramping than the scaling required when the ramping is driven my normal production workloads.
+ Elastic Auto Scale GPT Test Results start with an idle scaled cluster and then start the standard GPT test to determine if the EKS Auto Scaler performs well enough to keep up with performance test demands. In general this is substantially harder ramping than the scaling required when the ramping is driven by standard production workloads.
**Deploy Now**
@@ -211,7 +211,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/16 GB) 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.
@@ -223,7 +223,7 @@ If EKS node autoscaling is employed, it is likely that your average loading will
| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------- | ------------------------------- | ------------------------------------------------------------ |
| **Bastion Host (Quick Start)** | 1 HA instance in ASG | **t2.micro** for prod, **m4.2xlarge** for performance testing | | |
| **PostgreSQL**<br />Amazon RDS PostgreSQL Nodes Configuration (GPT tested) | 18vCPU, 36 GB <br />(across 9 nodes for PostgreSQL, PgBouncer, Consul)<br />Tested with Graviton ARM | **db.r6g.xlarge** x 3 nodes <br />(12vCPU, 96 GB) | 3 nodes x $0.52 = $1.56/hr | 3 nodes x $0.52 = $1.56/hr |
-| **Redis** | 6vCPU, 18GB<br />(across 6 nodes for Redis Cache, Sentinel) | **cache.m6g.large** x 3 nodes<br />(6vCPU, 19GB) | 3 nodes x $0.15 = $0.45/hr | 2 nodes x $0.15 = $0.30/hr |
+| **Redis** | 6vCPU, 18 GB<br />(across 6 nodes for Redis Cache, Sentinel) | **cache.m6g.large** x 3 nodes<br />(6vCPU, 19 GB) | 3 nodes x $0.15 = $0.45/hr | 2 nodes x $0.15 = $0.30/hr |
| **<u>Gitaly Cluster</u>** [Details](gitlab_sre_for_aws.md#gitaly-sre-considerations) | | | | |
| Gitaly Instances (in ASG) | 12 vCPU, 45GB<br />([across 3 nodes](gitlab_sre_for_aws.md#gitaly-and-praefect-elections)) | **m5.large** x 3 nodes<br />(12 vCPU, 48 GB) | $0.192 x 3 = $0.58/hr | [Gitaly & Praefect Must Have an Uneven Node Count for HA](gitlab_sre_for_aws.md#gitaly-and-praefect-elections) |
| Praefect (Instances in ASG with load balancer) | 6 vCPU, 5.4 GB<br />([across 3 nodes](gitlab_sre_for_aws.md#gitaly-and-praefect-elections)) | **c5.large** x 3 nodes<br />(6 vCPU, 12 GB) | $0.09 x 3 = $0.21/hr | [Gitaly & Praefect Must Have an Uneven Node Count for HA](gitlab_sre_for_aws.md#gitaly-and-praefect-elections) |
@@ -240,7 +240,7 @@ If EKS node autoscaling is employed, it is likely that your average loading will
- [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)
- Elastic Auto Scale GPT Test Results start with an idle scaled cluster and then start the standard GPT test to determine if the EKS Auto Scaler performs well enough to keep up with performance test demands. In general this is substantially harder ramping than the scaling required when the ramping is driven my normal production workloads.
+ Elastic Auto Scale GPT Test Results start with an idle scaled cluster and then start the standard GPT test to determine if the EKS Auto Scaler performs well enough to keep up with performance test demands. In general this is substantially harder ramping than the scaling required when the ramping is driven by standard production workloads.
**Deploy Now**
@@ -264,8 +264,8 @@ On Demand pricing is used in this table for comparisons, but should not be used
| Sidekiq | [8 pods](https://gitlab.com/gitlab-org/charts/gitlab/-/blob/master/examples/ref/5k.yaml#L24) x ([1 vCPU & 2 GB](../../administration/reference_architectures/5k_users.md#sidekiq)) = <br />8 vCPU, 16 GB | | |
| 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 |
+| One Node for Quick Start Overhead and Miscellaneous (EKS Cluster AutoScaler, Grafana, Prometheus, etc) | + 8 vCPU, 16 GB | | |
+| **Grand Total w/ Overheads Full Scale**<br />Minimum hosts = 3 | 70 vCPU, 112.5 GB | **c5.2xlarge** (8vCPU/16 GB) 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.
@@ -294,7 +294,7 @@ If EKS node autoscaling is employed, it is likely that your average loading will
- [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/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)
- Elastic Auto Scale GPT Test Results start with an idle scaled cluster and then start the standard GPT test to determine if the EKS Auto Scaler performs well enough to keep up with performance test demands. In general this is substantially harder ramping than the scaling required when the ramping is driven my normal production workloads.
+ Elastic Auto Scale GPT Test Results start with an idle scaled cluster and then start the standard GPT test to determine if the EKS Auto Scaler performs well enough to keep up with performance test demands. In general this is substantially harder ramping than the scaling required when the ramping is driven by standard production workloads.
**Deploy Now**
@@ -330,9 +330,9 @@ If EKS node autoscaling is employed, it is likely that your average loading will
| ------------------------------------------------------------ | ------------------------------ | ------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| **Bastion Host (Quick Start)** | 1 HA instance in ASG | **t2.micro** for prod, **m4.2xlarge** for performance testing | | |
| **PostgreSQL**<br />Amazon RDS PostgreSQL Nodes Configuration (GPT tested) | 36vCPU, 102 GB <br />(across 9 nodes for PostgreSQL, PgBouncer, Consul) | **db.r6g.2xlarge** x 3 nodes <br />(24vCPU, 192 GB) | 3 nodes x $1.04 = $3.12/hr | 3 nodes x $1.04 = $3.12/hr |
-| **Redis** | 30vCPU, 114GB<br />(across 12 nodes for Redis Cache, Redis Queues/Shared State, Sentinel Cache, Sentinel Queues/Shared State) | **cache.m5.2xlarge** x 3 nodes<br />(24vCPU, 78GB) | 3 nodes x $0.62 = $1.86/hr | 2 nodes x $0.62 = $1.24/hr |
+| **Redis** | 30vCPU, 114 GB<br />(across 12 nodes for Redis Cache, Redis Queues/Shared State, Sentinel Cache, Sentinel Queues/Shared State) | **cache.m5.2xlarge** x 3 nodes<br />(24vCPU, 78GB) | 3 nodes x $0.62 = $1.86/hr | 2 nodes x $0.62 = $1.24/hr |
| **<u>Gitaly Cluster</u>** [Details](gitlab_sre_for_aws.md#gitaly-sre-considerations) | | | | |
-| Gitaly Instances (in ASG) | 48 vCPU, 180GB<br />([across 3 nodes](gitlab_sre_for_aws.md#gitaly-and-praefect-elections)) | **m5.4xlarge** x 3 nodes<br />(48 vCPU, 180 GB) | $0.77 x 3 = $2.31/hr | [Gitaly & Praefect Must Have an Uneven Node Count for HA](gitlab_sre_for_aws.md#gitaly-and-praefect-elections) |
+| Gitaly Instances (in ASG) | 48 vCPU, 180 GB<br />([across 3 nodes](gitlab_sre_for_aws.md#gitaly-and-praefect-elections)) | **m5.4xlarge** x 3 nodes<br />(48 vCPU, 180 GB) | $0.77 x 3 = $2.31/hr | [Gitaly & Praefect Must Have an Uneven Node Count for HA](gitlab_sre_for_aws.md#gitaly-and-praefect-elections) |
| Praefect (Instances in ASG with load balancer) | 6 vCPU, 5.4 GB<br />([across 3 nodes](gitlab_sre_for_aws.md#gitaly-and-praefect-elections)) | **c5.large** x 3 nodes<br />(6 vCPU, 12 GB) | $0.09 x 3 = $0.21/hr | [Gitaly & Praefect Must Have an Uneven Node Count for HA](gitlab_sre_for_aws.md#gitaly-and-praefect-elections) |
| Praefect PostgreSQL(1) (Amazon RDS) | 6 vCPU, 5.4 GB<br />([across 3 nodes](gitlab_sre_for_aws.md#gitaly-and-praefect-elections)) | Not applicable; reuses GitLab PostgreSQL | $0 | |
| Internal Load Balancing Node | 2 vCPU, 1.8 GB | AWS ELB | $0.10/hr | $0.10/hr |
@@ -347,7 +347,7 @@ If EKS node autoscaling is employed, it is likely that your average loading will
- [50K 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)
- Elastic Auto Scale GPT Test Results start with an idle scaled cluster and then start the standard GPT test to determine if the EKS Auto Scaler performs well enough to keep up with performance test demands. In general this is substantially harder ramping than the scaling required when the ramping is driven my normal production workloads.
+ Elastic Auto Scale GPT Test Results start with an idle scaled cluster and then start the standard GPT test to determine if the EKS Auto Scaler performs well enough to keep up with performance test demands. In general this is substantially harder ramping than the scaling required when the ramping is driven by standard production workloads.
**Deploy Now**
@@ -383,7 +383,7 @@ If EKS node autoscaling is employed, it is likely that your average loading will
| ------------------------------------------------------------ | ------------------------------------------------------------ | --------------------------------------------------------- | ------------------------------- | ------------------------------------------------------------ |
| **Bastion Host (Quick Start)** | 1 HA instance in ASG | **t2.micro** for prod, **m4.2xlarge** for performance testing | | |
| **PostgreSQL**<br />Amazon RDS PostgreSQL Nodes Configuration (GPT tested) | 96vCPU, 360 GB <br />(across 3 nodes) | **db.r6g.8xlarge** x 3 nodes <br />(96vCPU, 768 GB total) | 3 nodes x $4.15 = $12.45/hr | 3 nodes x $4.15 = $12.45/hr |
-| **Redis** | 30vCPU, 114GB<br />(across 12 nodes for Redis Cache, Redis Queues/Shared State, Sentinel Cache, Sentinel Queues/Shared State) | **cache.m6g.2xlarge** x 3 nodes<br />(24vCPU, 78GB total) | 3 nodes x $0.60 = $1.80/hr | 2 nodes x $0.60 = $1.20/hr |
+| **Redis** | 30vCPU, 114 GB<br />(across 12 nodes for Redis Cache, Redis Queues/Shared State, Sentinel Cache, Sentinel Queues/Shared State) | **cache.m6g.2xlarge** x 3 nodes<br />(24vCPU, 78GB total) | 3 nodes x $0.60 = $1.80/hr | 2 nodes x $0.60 = $1.20/hr |
| **<u>Gitaly Cluster</u>** [Details](gitlab_sre_for_aws.md#gitaly-sre-considerations) | | | | |
| Gitaly Instances (in ASG) | 64 vCPU, 240GB x [3 nodes](gitlab_sre_for_aws.md#gitaly-and-praefect-elections) | **m5.16xlarge** x 3 nodes<br />(64 vCPU, 256 GB each) | $3.07 x 3 = $9.21/hr | [Gitaly & Praefect Must Have an Uneven Node Count for HA](gitlab_sre_for_aws.md#gitaly-and-praefect-elections) |
| Praefect (Instances in ASG with load balancer) | 4 vCPU, 3.6 GB x [3 nodes](gitlab_sre_for_aws.md#gitaly-and-praefect-elections) | **c5.xlarge** x 3 nodes<br />(4 vCPU, 8 GB each) | $0.17 x 3 = $0.51/hr | [Gitaly & Praefect Must Have an Uneven Node Count for HA](gitlab_sre_for_aws.md#gitaly-and-praefect-elections) |
diff --git a/doc/install/aws/gitlab_sre_for_aws.md b/doc/install/aws/gitlab_sre_for_aws.md
index f957dfa8a65..512857b87b5 100644
--- a/doc/install/aws/gitlab_sre_for_aws.md
+++ b/doc/install/aws/gitlab_sre_for_aws.md
@@ -80,11 +80,11 @@ All recommendations are for production configurations, including performance tes
### AWS Gitaly backup
-Due to the nature of how Praefect tracks the replication metadata of Gitaly disk information, the best backup method is [the official backup and restore Rake tasks](../../raketasks/backup_restore.md).
+Due to the nature of how Praefect tracks the replication metadata of Gitaly disk information, the best backup method is [the official backup and restore Rake tasks](../../administration/backup_restore/index.md).
### AWS Gitaly recovery
-Gitaly Cluster does not support snapshot backups as these can cause issues where the Praefect database becomes out of syn with the disk storage. Due to the nature of how Praefect rebuilds the replication metadata of Gitaly disk information during a restore, the best recovery method is [the official backup and restore Rake tasks](../../raketasks/backup_restore.md).
+Gitaly Cluster does not support snapshot backups as these can cause issues where the Praefect database becomes out of syn with the disk storage. Due to the nature of how Praefect rebuilds the replication metadata of Gitaly disk information during a restore, the best recovery method is [the official backup and restore Rake tasks](../../administration/backup_restore/index.md).
### Gitaly HA in EKS quick start
diff --git a/doc/install/aws/manual_install_aws.md b/doc/install/aws/manual_install_aws.md
index 92375fff59e..92ef08c2447 100644
--- a/doc/install/aws/manual_install_aws.md
+++ b/doc/install/aws/manual_install_aws.md
@@ -268,7 +268,7 @@ On the EC2 dashboard, look for Load Balancer in the left navigation bar:
1. Select **Configure Health Check** and set up a health check for your EC2 instances.
1. For **Ping Protocol**, select HTTP.
1. For **Ping Port**, enter 80.
- 1. For **Ping Path** - we recommend that you [use the Readiness check endpoint](../../administration/load_balancer.md#readiness-check). You must add [the VPC IP Address Range (CIDR)](https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-security-groups.html#elb-vpc-nacl) to the [IP allowlist](../../administration/monitoring/ip_allowlist.md) for the [Health Check endpoints](../../user/admin_area/monitoring/health_check.md)
+ 1. For **Ping Path** - we recommend that you [use the Readiness check endpoint](../../administration/load_balancer.md#readiness-check). You must add [the VPC IP Address Range (CIDR)](https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-security-groups.html#elb-vpc-nacl) to the [IP allowlist](../../administration/monitoring/ip_allowlist.md) for the [Health Check endpoints](../../administration/monitoring/health_check.md)
1. Keep the default **Advanced Details** or adjust them according to your needs.
1. Select **Add EC2 Instances** - don't add anything as we create an Auto Scaling Group later to manage instances for us.
1. Select **Add Tags** and add any tags you need.
@@ -741,7 +741,7 @@ GitLab provides its own integrated monitoring solution based on Prometheus.
For more information about how to set it up, see
[GitLab Prometheus](../../administration/monitoring/prometheus/index.md).
-GitLab also has various [health check endpoints](../../user/admin_area/monitoring/health_check.md)
+GitLab also has various [health check endpoints](../../administration/monitoring/health_check.md)
that you can ping and get reports.
## GitLab Runner
@@ -754,16 +754,16 @@ Read more on configuring an
## Backup and restore
-GitLab provides [a tool to back up](../../raketasks/backup_restore.md)
+GitLab provides [a tool to back up](../../administration/backup_restore/index.md)
and restore its Git data, database, attachments, LFS objects, and so on.
Some important things to know:
- The backup/restore tool **does not** store some configuration files, like secrets; you
- must [configure this yourself](../../raketasks/backup_gitlab.md#storing-configuration-files).
+ must [configure this yourself](../../administration/backup_restore/backup_gitlab.md#storing-configuration-files).
- By default, the backup files are stored locally, but you can
- [backup GitLab using S3](../../raketasks/backup_gitlab.md#using-amazon-s3).
-- You can [exclude specific directories form the backup](../../raketasks/backup_gitlab.md#excluding-specific-directories-from-the-backup).
+ [backup GitLab using S3](../../administration/backup_restore/backup_gitlab.md#using-amazon-s3).
+- You can [exclude specific directories form the backup](../../administration/backup_restore/backup_gitlab.md#excluding-specific-directories-from-the-backup).
### Backing up GitLab
@@ -781,9 +781,9 @@ For GitLab 12.1 and earlier, use `gitlab-rake gitlab:backup:create`.
### Restoring GitLab from a backup
-To restore GitLab, first review the [restore documentation](../../raketasks/backup_restore.md#restore-gitlab),
+To restore GitLab, first review the [restore documentation](../../administration/backup_restore/index.md#restore-gitlab),
and primarily the restore prerequisites. Then, follow the steps under the
-[Linux package installations section](../../raketasks/restore_gitlab.md#restore-for-omnibus-gitlab-installations).
+[Linux package installations section](../../administration/backup_restore/restore_gitlab.md#restore-for-omnibus-gitlab-installations).
## Updating GitLab
@@ -833,7 +833,7 @@ to request additional material:
Geo is the solution for widely distributed development teams.
- [Linux package](https://docs.gitlab.com/omnibus/) - Everything you must know
about administering your GitLab instance.
-- [Add a license](../../user/admin_area/license.md):
+- [Add a license](../../administration/license.md):
Activate all GitLab Enterprise Edition functionality with a license.
- [Pricing](https://about.gitlab.com/pricing/): Pricing for the different tiers.
diff --git a/doc/install/docker.md b/doc/install/docker.md
index ab1aec98b16..925da8a2b4a 100644
--- a/doc/install/docker.md
+++ b/doc/install/docker.md
@@ -282,10 +282,6 @@ Here's an example that deploys GitLab with four runners as a [stack](https://doc
docker stack deploy --compose-file docker-compose.yml mystack
```
-### Install the product documentation
-
-This is an optional step. See how to [self-host the product documentation](../administration/docs_self_host.md#self-host-the-product-documentation-with-docker).
-
## Configuration
This container uses the official Omnibus GitLab package, so all configuration
@@ -487,6 +483,12 @@ If, for any reason, you wish to switch back to single database connection:
sudo docker restart gitlab
```
+## Recommended next steps
+
+After completing your installation, consider taking the
+[recommended next steps](next_steps.md), including authentication options
+and sign-up restrictions.
+
## Upgrade
In most cases, upgrading GitLab is as easy as downloading the newest Docker
@@ -580,11 +582,6 @@ The following steps assume that you are upgrading the same version.
replace `ce` with `ee` in your `docker run` command or `docker-compose.yml` file.
However, reuse the CE container name, port and file mappings, and version.
-### Upgrade the product documentation
-
-This is an optional step. If you [installed the documentation site](#install-the-product-documentation),
-see how to [upgrade to another version](../administration/docs_self_host.md#upgrade-using-docker).
-
### Downgrade GitLab
To downgrade GitLab after an upgrade:
@@ -596,7 +593,7 @@ To downgrade GitLab after an upgrade:
- Restoring is required to back out database data and schema changes (migrations) made as part of the upgrade.
- GitLab backups must be restored to the exact same version and edition.
- - [Follow the restore steps for Docker images](../raketasks/restore_gitlab.md#restore-for-docker-image-and-gitlab-helm-chart-installations), including
+ - [Follow the restore steps for Docker images](../administration/backup_restore/restore_gitlab.md#restore-for-docker-image-and-gitlab-helm-chart-installations), including
stopping Puma and Sidekiq. Only the database must be restored, so add
`SKIP=artifacts,repositories,registry,uploads,builds,pages,lfs,packages,terraform_state`
to the `gitlab-backup restore` command line arguments.
@@ -609,7 +606,7 @@ You can create a GitLab backup with:
docker exec -t <container name> gitlab-backup create
```
-Read more on how to [back up and restore GitLab](../raketasks/backup_restore.md).
+Read more on how to [back up and restore GitLab](../administration/backup_restore/index.md).
NOTE:
If configuration is provided entirely via the `GITLAB_OMNIBUS_CONFIG` environment variable
@@ -618,8 +615,8 @@ meaning no configuration is set directly in the `gitlab.rb` file, then there is
to back up the `gitlab.rb` file.
WARNING:
-[Backing up the GitLab secrets file](../raketasks/backup_gitlab.md#storing-configuration-files) is required
-to avoid [complicated steps](../raketasks/backup_restore.md#when-the-secrets-file-is-lost) when recovering
+[Backing up the GitLab secrets file](../administration/backup_restore/backup_gitlab.md#storing-configuration-files) is required
+to avoid [complicated steps](../administration/backup_restore/backup_gitlab.md#when-the-secrets-file-is-lost) when recovering
GitLab from backup. The secrets file is stored at `/etc/gitlab/gitlab-secrets.json` inside the container, or
`$GITLAB_HOME/config/gitlab-secrets.json` [on the container host](#set-up-the-volumes-location).
diff --git a/doc/install/installation.md b/doc/install/installation.md
index 4d80a02c9f1..45c6b398a76 100644
--- a/doc/install/installation.md
+++ b/doc/install/installation.md
@@ -47,7 +47,7 @@ If the highest number stable branch is unclear, check the [GitLab blog](https://
|:------------------------|:----------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [Ruby](#2-ruby) | `3.0.x` | From GitLab 15.10, Ruby 3.0 is required. You must use the standard MRI implementation of Ruby. We love [JRuby](https://www.jruby.org/) and [Rubinius](https://github.com/rubinius/rubinius#the-rubinius-language-platform), but GitLab needs several Gems that have native extensions. |
| [RubyGems](#3-rubygems) | `3.4.x` | A specific RubyGems version is not fully needed, but it's recommended to update so you can enjoy some known performance improvements. |
-| [Go](#4-go) | `1.18.x` | From GitLab 15.6, Go 1.18 or later is required. |
+| [Go](#4-go) | `1.19.x` | From GitLab 16.1, Go 1.19 or later is required. |
| [Git](#git) | `2.38.x` | From GitLab 15.8, Git 2.38.x and later is required. It's highly recommended that you use the [Git version provided by Gitaly](#git). |
| [Node.js](#5-node) | `18.16.x` | From GitLab 16.1, Node.js 18.16 or later is required. |
@@ -72,7 +72,7 @@ When following the instructions on this page, you create this directory structur
- `/home/git/repositories` - Bare repositories for all projects organized by
namespace. This is where the Git repositories which are pushed/pulled are
maintained for all projects. **This area contains critical data for projects.
- [Keep a backup](../raketasks/backup_restore.md).**
+ [Keep a backup](../administration/backup_restore/index.md).**
The default locations for repositories can be configured in `config/gitlab.yml`
of GitLab and `config.yml` of GitLab Shell.
@@ -174,7 +174,7 @@ the Git path:
### GraphicsMagick
-For the [Custom Favicon](../user/admin_area/appearance.md#favicon) to work, GraphicsMagick
+For the [Custom Favicon](../administration/appearance.md#favicon) to work, GraphicsMagick
must be installed.
```shell
@@ -247,11 +247,11 @@ Linux. You can find downloads for other platforms at the
# Remove former Go installation folder
sudo rm -rf /usr/local/go
-curl --remote-name --location --progress-bar "https://go.dev/dl/go1.18.8.linux-amd64.tar.gz"
-echo '4d854c7bad52d53470cf32f1b287a5c0c441dc6b98306dea27358e099698142a go1.18.8.linux-amd64.tar.gz' | shasum -a256 -c - && \
- sudo tar -C /usr/local -xzf go1.18.8.linux-amd64.tar.gz
+curl --remote-name --location --progress-bar "https://go.dev/dl/go1.19.10.linux-amd64.tar.gz"
+echo '8b045a483d3895c6edba2e90a9189262876190dbbd21756870cdd63821810677 go1.19.10.linux-amd64.tar.gz' | shasum -a256 -c - && \
+ sudo tar -C /usr/local -xzf go1.19.10.linux-amd64.tar.gz
sudo ln -sf /usr/local/go/bin/{go,gofmt} /usr/local/bin/
-rm go1.18.8.linux-amd64.tar.gz
+rm go1.19.10.linux-amd64.tar.gz
```
## 5. Node
@@ -260,7 +260,7 @@ GitLab requires the use of Node to compile JavaScript
assets, and Yarn to manage JavaScript dependencies. The current minimum
requirements for these are:
-- `node` 18.x releases (v18.16.0 or later).
+- `node` 18.x releases (v18.16.1 or later).
[Other LTS versions of Node.js](https://github.com/nodejs/release#release-schedule) might be able to build assets, but we only guarantee Node.js 18.x.
- `yarn` = v1.22.x (Yarn 2 is not supported yet)
@@ -1038,9 +1038,11 @@ To start and stop GitLab when using:
- systemd units: use `sudo systemctl start gitlab.target` or `sudo systemctl stop gitlab.target`.
- The SysV init script: use `sudo service gitlab start` or `sudo service gitlab stop`.
-### Install the product documentation
+### Recommended next steps
-This is an optional step. See how to [self-host the product documentation](../administration/docs_self_host.md).
+After completing your installation, consider taking the
+[recommended next steps](next_steps.md), including authentication options
+and sign-up restrictions.
## Advanced Setup Tips
diff --git a/doc/install/migrate/compare_sm_to_saas.md b/doc/install/migrate/compare_sm_to_saas.md
index a83c4a6865f..4cdc849be2c 100644
--- a/doc/install/migrate/compare_sm_to_saas.md
+++ b/doc/install/migrate/compare_sm_to_saas.md
@@ -17,14 +17,14 @@ In GitLab SaaS, administration tasks are limited compared to a self-managed appl
In a self-managed instance:
-- You have complete access and administrative control over the application, including the [Admin Area](../../user/admin_area/settings/index.md).
+- You have complete access and administrative control over the application, including the [Admin Area](../../administration/settings/index.md).
- You can impersonate, create, add, and remove users.
- You can assign the [`Auditor`](../../administration/auditor_users.md) user type and `External` role.
On GitLab SaaS:
- You have limited administrative control. For example, you cannot impersonate, create, add, or remove users.
-- You cannot access the [Admin Area](../../user/admin_area/settings/index.md).
+- You cannot access the [Admin Area](../../administration/settings/index.md).
- You cannot assign the `Auditor` user type and `External` role.
## Logs
diff --git a/doc/install/next_steps.md b/doc/install/next_steps.md
index 70b6101b1eb..ecc456cd3ec 100644
--- a/doc/install/next_steps.md
+++ b/doc/install/next_steps.md
@@ -40,7 +40,7 @@ installation.
## Backup and upgrade
-- [Back up and restore GitLab](../raketasks/backup_restore.md): Learn the different
+- [Back up and restore GitLab](../administration/backup_restore/index.md): Learn the different
ways you can back up or restore GitLab.
- [Upgrade GitLab](../update/index.md): Every 22nd of the month, a new feature-rich GitLab version
is released. Learn how to upgrade to it, or to an interim release that contains a security fix.
@@ -50,7 +50,7 @@ installation.
## License
-- [Add a license](../user/admin_area/license.md) or [start a free trial](https://about.gitlab.com/free-trial/):
+- [Add a license](../administration/license.md) or [start a free trial](https://about.gitlab.com/free-trial/):
Activate all GitLab Enterprise Edition functionality with a license.
- [Pricing](https://about.gitlab.com/pricing/): Pricing for the different tiers.
@@ -65,3 +65,8 @@ installation.
GitLab supports several different types of clustering.
- [Geo replication](../administration/geo/index.md):
Geo is the solution for widely distributed development teams.
+
+## Install the product documentation
+
+This is an optional step. If you want to host the documentation on your own
+server, see how to [self-host the product documentation](../administration/docs_self_host.md).
diff --git a/doc/install/requirements.md b/doc/install/requirements.md
index 64dfd3e6044..5e13628e815 100644
--- a/doc/install/requirements.md
+++ b/doc/install/requirements.md
@@ -81,9 +81,10 @@ the following table) as these were used for development and testing:
| GitLab version | Minimum PostgreSQL version |
|----------------|----------------------------|
| 13.0 | 11 |
-| 14.0 | 12.7 |
+| 14.0 | 12.7 |
| 15.0 | 12.10 |
| 16.0 | 13.6 |
+| 17.0 (planned) | 14.8 |
You must also ensure the following extensions are loaded into every
GitLab database. [Read more about this requirement, and troubleshooting](postgresql_extensions.md).
diff --git a/doc/integration/advanced_search/elasticsearch.md b/doc/integration/advanced_search/elasticsearch.md
index 7b23eaa278a..cdda85bb259 100644
--- a/doc/integration/advanced_search/elasticsearch.md
+++ b/doc/integration/advanced_search/elasticsearch.md
@@ -79,10 +79,11 @@ To index Git repository data, GitLab uses an [indexer written in Go](https://git
Depending on your GitLab version, there are different installation procedures for the Go indexer:
-- For Omnibus GitLab 11.8 or greater, see [Omnibus GitLab](#omnibus-gitlab).
-- For installations from source or older versions of Omnibus GitLab,
+- For Omnibus GitLab 11.8 and later, see [Omnibus GitLab](#omnibus-gitlab).
+- For installations from source or Omnibus GitLab 11.7 and earlier,
[install the indexer from source](#from-source).
-- If you are using GitLab Development Kit, see [GDK Elasticsearch how-to](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/main/doc/howto/elasticsearch.md).
+- If you're using the GitLab Development Kit, see [Elasticsearch in the GDK](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/main/doc/howto/elasticsearch.md).
+- If you're running a Helm deployment of GitLab 11.10 and later, [the indexer is already included](https://gitlab.com/gitlab-org/build/CNG/-/merge_requests/213).
### Omnibus GitLab
@@ -178,7 +179,7 @@ To enable advanced search:
NOTE:
To see the **Advanced Search** section, you need an active GitLab Premium
- [license](../../user/admin_area/license.md).
+ [license](../../administration/license.md).
1. Configure the [advanced search settings](#advanced-search-configuration) for
your Elasticsearch cluster. Do not enable **Search with Elasticsearch enabled**
@@ -186,8 +187,7 @@ To enable advanced search:
1. Enable **Elasticsearch indexing** and select **Save changes**. This creates
an empty index if one does not already exist.
1. Select **Index all projects**.
-1. Select **Check progress** in the confirmation message to see the status of
- the background jobs.
+1. Optional. Select **Check progress** to see the status of background jobs.
1. Personal snippets must be indexed using another Rake task:
```shell
@@ -217,6 +217,7 @@ The following Elasticsearch settings are available:
| `Elasticsearch indexing` | Enables or disables Elasticsearch indexing and creates an empty index if one does not already exist. You may want to enable indexing but disable search to give the index time to be fully completed, for example. Also, keep in mind that this option doesn't have any impact on existing data, this only enables/disables the background indexer which tracks data changes and ensures new data is indexed. |
| `Pause Elasticsearch indexing` | Enables or disables temporary indexing pause. This is useful for cluster migration/reindexing. All changes are still tracked, but they are not committed to the Elasticsearch index until resumed. |
| `Search with Elasticsearch enabled` | Enables or disables using Elasticsearch in search. |
+| `Requeue indexing workers` | Enable automatic requeuing of indexing workers. This improves non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed. Requeuing indexing workers is not recommended for smaller instances or instances with few Sidekiq processes. |
| `URL` | The URL of your Elasticsearch instance. Use a comma-separated list to support clustering (for example, `http://host1, https://host2:9200`). If your Elasticsearch instance is password-protected, use the `Username` and `Password` fields described below. Alternatively, use inline credentials such as `http://<username>:<password>@<elastic_host>:9200/`. |
| `Username` | The `username` of your Elasticsearch instance. |
| `Password` | The password of your Elasticsearch instance. |
@@ -228,6 +229,7 @@ The following Elasticsearch settings are available:
| `AWS Secret Access Key` | The AWS secret access key. |
| `Maximum file size indexed` | See [the explanation in instance limits.](../../administration/instance_limits.md#maximum-file-size-indexed). |
| `Maximum field length` | See [the explanation in instance limits.](../../administration/instance_limits.md#maximum-field-length). |
+| `Number of shards for non-code indexing` | Number of indexing worker shards. This improves non-code indexing throughput by enqueuing more parallel Sidekiq jobs. Increasing the number of shards is not recommended for smaller instances or instances with few Sidekiq processes. Default is `2`. |
| `Maximum bulk request size (MiB)` | Used by the GitLab Ruby and Go-based indexer processes. This setting indicates how much data must be collected (and stored in memory) in a given indexing process before submitting the payload to the Elasticsearch Bulk API. For the GitLab Go-based indexer, you should use this setting with `Bulk request concurrency`. `Maximum bulk request size (MiB)` must accommodate the resource constraints of both the Elasticsearch hosts and the hosts running the GitLab Go-based indexer from either the `gitlab-rake` command or the Sidekiq tasks. |
| `Bulk request concurrency` | The Bulk request concurrency indicates how many of the GitLab Go-based indexer processes (or threads) can run in parallel to collect data to subsequently submit to the Elasticsearch Bulk API. This increases indexing performance, but fills the Elasticsearch bulk requests queue faster. This setting should be used together with the Maximum bulk request size setting (see above) and needs to accommodate the resource constraints of both the Elasticsearch hosts and the hosts running the GitLab Go-based indexer either from the `gitlab-rake` command or the Sidekiq tasks. |
| `Client request timeout` | Elasticsearch HTTP client request timeout value in seconds. `0` means using the system default timeout value, which depends on the libraries that GitLab application is built upon. |
diff --git a/doc/integration/advanced_search/elasticsearch_troubleshooting.md b/doc/integration/advanced_search/elasticsearch_troubleshooting.md
index e8eace7bd16..e8634cf5ef9 100644
--- a/doc/integration/advanced_search/elasticsearch_troubleshooting.md
+++ b/doc/integration/advanced_search/elasticsearch_troubleshooting.md
@@ -256,6 +256,24 @@ Bulk requests getting rejected by the Elasticsearch nodes are likely due to load
Ensure that your Elasticsearch cluster meets the [system requirements](elasticsearch.md#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).
+### Indexing fails with `strict_dynamic_mapping_exception`
+
+Indexing might fail if all [advanced search migrations were not finished before doing a major upgrade](elasticsearch.md#all-migrations-must-be-finished-before-doing-a-major-upgrade).
+A large Sidekiq backlog might accompany this error. To fix the indexing failures, you must re-index the database, repositories, and wikis.
+
+1. Pause indexing so Sidekiq can catch up:
+
+ ```shell
+ sudo gitlab-rake gitlab:elastic:pause_indexing
+ ```
+
+1. [Recreate the index from scratch](#last-resort-to-recreate-an-index).
+1. Resume indexing:
+
+ ```shell
+ sudo gitlab-rake gitlab:elastic:resume_indexing
+ ```
+
### Last resort to recreate an index
There may be cases where somehow data never got indexed and it's not in the
@@ -469,7 +487,7 @@ $ jq --raw-output 'select(.severity == "ERROR") | [.error_class, .error_message]
sort | uniq -c
```
-`Elastic` workers and [Sidekiq jobs](../../user/admin_area/index.md#background-jobs) could also appear much more often
+`Elastic` workers and [Sidekiq jobs](../../administration/admin_area.md#background-jobs) could also appear much more often
because Elasticsearch frequently attempts to reindex if a previous job fails.
You can use [`fast-stats`](https://gitlab.com/gitlab-com/support/toolbox/fast-stats#usage)
or `jq` to count workers in the [Sidekiq logs](../../administration/logs/index.md#sidekiq-logs):
diff --git a/doc/integration/external-issue-tracker.md b/doc/integration/external-issue-tracker.md
index b8cffc449ec..ef17b56d38f 100644
--- a/doc/integration/external-issue-tracker.md
+++ b/doc/integration/external-issue-tracker.md
@@ -6,24 +6,24 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# External issue trackers **(FREE)**
-GitLab has an [issue tracker](../user/project/issues/index.md), but you can
-configure an external issue tracker per GitLab project.
+GitLab has its own [issue tracker](../user/project/issues/index.md),
+but you can also configure an external issue tracker per GitLab project.
+You can then use:
-After you configure the external tracker, you can reference external issues
-in GitLab merge requests, commits, and comments
-using the format `CODE-123`, where:
+- The external issue tracker only
+- The external issue tracker with the GitLab issue tracker
+
+With an external tracker, you can use the format `CODE-123` to mention
+external issues in GitLab merge requests, commits, and comments where:
- `CODE` is a unique code for the tracker.
- `123` is the issue number in the tracker.
-The references are automatically converted to links to the issues.
-
-You can keep the GitLab issue tracker enabled in parallel or disable it. When enabled, the **Issues** link in the
-GitLab menu always opens the internal issue tracker. When disabled, the link is not visible in the menu.
+References are displayed as issue links.
## Disable the GitLab issue tracker
-To disable the GitLab issue tracker:
+To disable the GitLab issue tracker for a project:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
1. Select **Settings > General**.
@@ -31,16 +31,16 @@ To disable the GitLab issue tracker:
1. Under **Issues**, turn off the toggle.
1. Select **Save changes**.
-## Configure an external issue tracker
+After you disable the GitLab issue tracker, **Issues** is not visible on the left sidebar of your project.
-To enable an external issue tracker, you must configure the appropriate [integration](../user/project/integrations/index.md).
+## Configure an external issue tracker
-The following external issue tracker integrations are available:
+You can configure any of the following external issue trackers:
- [Bugzilla](../user/project/integrations/bugzilla.md)
- [ClickUp](../user/project/integrations/clickup.md)
-- [Custom Issue Tracker](../user/project/integrations/custom_issue_tracker.md)
-- [Engineering Workflow Management](../user/project/integrations/ewm.md)
+- [Custom issue tracker](../user/project/integrations/custom_issue_tracker.md)
+- [Engineering Workflow Management (EWM)](../user/project/integrations/ewm.md)
- [Jira](../integration/jira/index.md)
- [Redmine](../user/project/integrations/redmine.md)
- [YouTrack](../user/project/integrations/youtrack.md)
diff --git a/doc/integration/index.md b/doc/integration/index.md
index f9865199505..866c68e6d25 100644
--- a/doc/integration/index.md
+++ b/doc/integration/index.md
@@ -53,8 +53,26 @@ For more details, see [Secure your application](../user/application_security/ind
## Security partners
-You can integrate GitLab with several security partners. For more information, see
-[Security partner integrations](security_partners/index.md).
+You can integrate GitLab with the following security partners:
+
+<!-- vale gitlab.Spelling = NO -->
+
+- [Anchore](https://docs.anchore.com/current/docs/configuration/integration/ci_cd/gitlab/)
+- [Bridgecrew](https://docs.bridgecrew.io/docs/integrate-with-gitlab-self-managed)
+- [Checkmarx](https://checkmarx.atlassian.net/wiki/spaces/SD/pages/1929937052/GitLab+Integration)
+- [Deepfactor](https://www.deepfactor.io/docs/integrate-deepfactor-scanner-in-your-ci-cd-pipelines/#gitlab)
+- [Fortify](https://www.microfocus.com/en-us/fortify-integrations/gitlab)
+- [GrammaTech](https://www.grammatech.com/codesonar-gitlab-integration)
+- [Indeni](https://docs.cloudrail.app/#/integrations/gitlab)
+- [Jscrambler](https://docs.jscrambler.com/code-integrity/documentation/gitlab-ci-integration)
+- [Mend](https://www.mend.io/gitlab/)
+- [Semgrep](https://semgrep.dev/for/gitlab)
+- [StackHawk](https://docs.stackhawk.com/continuous-integration/gitlab.html)
+- [Tenable](https://docs.tenable.com/tenableio/Content/ContainerSecurity/GetStarted.htm)
+- [Venafi](https://marketplace.venafi.com/xchange/620d2d6ed419fb06a5c5bd36/solution/6292c2ef7550f2ee553cf223)
+- [Veracode](https://community.veracode.com/s/knowledgeitem/gitlab-ci-MCEKSYPRWL35BRTGOVI55SK5RI4A)
+
+<!-- vale gitlab.Spelling = YES -->
## Continuous integration
diff --git a/doc/integration/jira/configure.md b/doc/integration/jira/configure.md
index 89afa998431..9660e091798 100644
--- a/doc/integration/jira/configure.md
+++ b/doc/integration/jira/configure.md
@@ -10,7 +10,7 @@ The Jira issue integration connects one or more GitLab projects to a Jira instan
## Configure the integration
-> Authentication with Jira personal access tokens was [introduced](https://gitlab.com/groups/gitlab-org/-/epics/8222) in GitLab 16.0.
+> Authentication with Jira personal access tokens [introduced](https://gitlab.com/groups/gitlab-org/-/epics/8222) in GitLab 16.0.
Prerequisites:
@@ -22,7 +22,7 @@ Prerequisites:
- Jira personal access token (GitLab 16.0 and later).
You can enable the Jira issue integration by configuring your project settings in GitLab.
-You can configure these settings at the [group level](../../user/admin_area/settings/project_integration_management.md#manage-group-level-default-settings-for-a-project-integration) or at the [instance level](../../user/admin_area/settings/project_integration_management.md#manage-instance-level-default-settings-for-a-project-integration) for self-managed GitLab.
+You can configure these settings at the [group level](../../administration/settings/project_integration_management.md#manage-group-level-default-settings-for-a-project-integration) or at the [instance level](../../administration/settings/project_integration_management.md#manage-instance-level-default-settings-for-a-project-integration) for self-managed GitLab.
To configure your project settings in GitLab:
@@ -81,7 +81,7 @@ To create a Jira Cloud API token:
profile, select **Account Settings > Security > Create and manage API tokens**.
1. Select **Create API token**.
-1. In the dialog, enter a label for your token and select **Create**.
+1. On the dialog, enter a label for your token and select **Create**.
To copy the API token, select **Copy**.
diff --git a/doc/integration/jira/connect-app.md b/doc/integration/jira/connect-app.md
index 67f51a6f472..005069990c4 100644
--- a/doc/integration/jira/connect-app.md
+++ b/doc/integration/jira/connect-app.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# GitLab for Jira Cloud app **(FREE)**
-With the [GitLab for Jira Cloud](https://marketplace.atlassian.com/apps/1221011/gitlab-com-for-jira-cloud) app, you can connect GitLab and Jira Cloud to sync development information in real time. You can view this information in the [Jira development panel](development_panel.md).
+With the [GitLab for Jira Cloud](https://marketplace.atlassian.com/apps/1221011/gitlab-com-for-jira-cloud?tab=overview&hosting=cloud) app, you can connect GitLab and Jira Cloud to sync development information in real time. You can view this information in the [Jira development panel](development_panel.md).
You can use the GitLab for Jira Cloud app to link top-level groups or subgroups. It's not possible to directly link projects or personal namespaces.
@@ -33,7 +33,7 @@ To install the GitLab for Jira Cloud app:
1. In Jira, select **Jira Settings > Apps > Find new apps**, and search for GitLab.
1. Select **GitLab for Jira Cloud**, and select **Get it now**.
- Alternatively, [get the app directly from the Atlassian Marketplace](https://marketplace.atlassian.com/apps/1221011/gitlab-com-for-jira-cloud).
+ Alternatively, [get the app directly from the Atlassian Marketplace](https://marketplace.atlassian.com/apps/1221011/gitlab-com-for-jira-cloud?tab=overview&hosting=cloud).
1. To go to the configurations page, select **Get started**.
You can always access this page in **Jira Settings > Apps > Manage apps**.
@@ -46,9 +46,9 @@ For an overview, see
After you add a group, the following data is synced to Jira for all projects in that group:
-- New merge requests, branches, and commits
-- Existing merge requests (GitLab 13.8 and later)
-- Existing branches and commits (GitLab 15.11 and later)
+- New and existing merge requests.
+- New branches and commits.
+- Existing branches and commits (GitLab 15.11 and later). You must delete and add any namespaces that were added to the GitLab for Jira Cloud app in GitLab 15.10 and earlier.
## Update the GitLab for Jira Cloud app
diff --git a/doc/integration/jira/development_panel.md b/doc/integration/jira/development_panel.md
index 009e620f121..c444ffe8a3b 100644
--- a/doc/integration/jira/development_panel.md
+++ b/doc/integration/jira/development_panel.md
@@ -6,8 +6,6 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Jira development panel **(FREE)**
-> [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/233149) from GitLab Premium to GitLab Free in 13.4.
-
You can use the Jira development panel to view GitLab activity for a Jira issue directly in Jira.
To set up the Jira development panel:
@@ -51,9 +49,9 @@ depends on where you mention the Jira issue ID in GitLab.
| GitLab: where you mention the Jira issue ID | Jira development panel: what information is displayed |
|------------------------------------------------|-------------------------------------------------------|
-| Merge request title or description | Link to the merge request<br>Link to the branch ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/354373) in GitLab 15.11) |
-| Branch name | Link to the branch |
-| Commit message | Link to the commit |
+| Merge request title or description | Link to the merge request<br>Link to the deployment<br>Link to the pipeline by title only and by description ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/390888) in GitLab 15.10)<br>Link to the branch ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/354373) in GitLab 15.11) |
+| Branch name | Link to the branch<br>Link to the deployment |
+| Commit message | Link to the commit<br>Link to the deployment from up to 5,000 commits after the last successful deployment to the environment ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/300031) in GitLab 16.2 [with a flag](../../administration/feature_flags.md) named `jira_deployment_issue_keys`. Enabled by default) |
| [Jira Smart Commit](#jira-smart-commits) | Custom comment, logged time, or workflow transition |
## Jira Smart Commits
@@ -93,7 +91,6 @@ For more information about how Smart Commits work and what commands are availabl
- [Process issues with Smart Commits](https://support.atlassian.com/jira-software-cloud/docs/process-issues-with-smart-commits/)
- [Using Smart Commits](https://confluence.atlassian.com/fisheye/using-smart-commits-960155400.html)
-## Troubleshooting
+## Related topics
-To troubleshoot the Jira development panel on your own server, see the
-[Atlassian documentation](https://confluence.atlassian.com/jirakb/troubleshoot-the-development-panel-in-jira-server-574685212.html).
+- [Troubleshoot the development panel in Jira Server](https://confluence.atlassian.com/jirakb/troubleshoot-the-development-panel-in-jira-server-574685212.html)
diff --git a/doc/integration/jira/index.md b/doc/integration/jira/index.md
index 2b6395f437b..dbda2e91dee 100644
--- a/doc/integration/jira/index.md
+++ b/doc/integration/jira/index.md
@@ -46,7 +46,7 @@ This table shows the capabilities available with the Jira issue integration and
| [View a list of Jira issues](issues.md#view-jira-issues) | **{check-circle}** Yes | **{dotted-circle}** No |
| [Create a Jira issue for a vulnerability](../../user/application_security/vulnerabilities/index.md#create-a-jira-issue-for-a-vulnerability) | **{check-circle}** Yes | **{dotted-circle}** No |
| Create a GitLab branch from a Jira issue | **{dotted-circle}** No | **{check-circle}** Yes, in the issue's development panel |
-| Mention a Jira issue ID in a GitLab merge request, and deployments are synced | **{dotted-circle}** No | **{check-circle}** Yes, in the issue's development panel |
+| Sync GitLab deployments to Jira issues | **{dotted-circle}** No | **{check-circle}** Yes, in the issue's development panel. Mention a Jira issue ID in a GitLab merge request, branch name, or any of the last 5,000 commits made to the branch after the last successful deployment to the environment |
## Privacy considerations
diff --git a/doc/integration/jira/issues.md b/doc/integration/jira/issues.md
index 7ed9d3ab329..c1b61e2e587 100644
--- a/doc/integration/jira/issues.md
+++ b/doc/integration/jira/issues.md
@@ -49,9 +49,6 @@ You can [disable comments](#disable-comments-on-jira-issues) on issues.
### Require associated Jira issue for merge requests to be merged **(ULTIMATE)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/280766) in GitLab 13.12 [with a flag](../../administration/feature_flags.md) named `jira_issue_association_on_merge_request`. Disabled by default.
-> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/335280) in GitLab 14.2. Feature flag `jira_issue_association_on_merge_request` removed.
-
With this integration, you can prevent merge requests from being merged if they do not refer to a Jira issue.
To enable this feature:
@@ -90,6 +87,9 @@ For more information, see the [Atlassian documentation](https://confluence.atlas
### Use a prefix
+You can define a prefix for GitLab to match Jira issue keys. For example, if your Jira issue ID is `ALPHA-1`
+and you've set a `JIRA#` prefix, GitLab matches `JIRA#ALPHA-1` rather than `ALPHA-1`.
+
To define a prefix for Jira issue keys:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
@@ -131,8 +131,6 @@ Consider this example:
## View Jira issues **(PREMIUM)**
-> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3622) in GitLab 13.2.
-
You can view and search issues from a selected Jira project directly in GitLab,
provided your GitLab administrator [has configured the integration](configure.md#configure-the-integration).
@@ -145,7 +143,7 @@ The issues are sorted by **Created date** by default, with the most recently cre
- To display the most recently updated issues first, select **Updated date**.
- You can [search and filter the issue list](#search-and-filter-the-issue-list).
-- In GitLab 13.10 and later, you can [select an issue from the list to view the issue in GitLab](https://gitlab.com/gitlab-org/gitlab/-/issues/299832).
+- You can [select an issue from the list to view the issue in GitLab](https://gitlab.com/gitlab-org/gitlab/-/issues/299832).
Issues are grouped into tabs based on their
[Jira status](https://confluence.atlassian.com/adminjiraserver070/defining-status-field-values-749382903.html):
@@ -175,8 +173,6 @@ Enhancements to use these filters through the user interface
## Automatic issue transitions
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55773) in GitLab 13.11.
-
When you configure automatic issue transitions, you can transition a referenced
Jira issue to the next available status with a category of **Done**. To configure
this setting:
diff --git a/doc/integration/jira/jira_server_configuration.md b/doc/integration/jira/jira_server_configuration.md
index 672df5d615f..373fe137046 100644
--- a/doc/integration/jira/jira_server_configuration.md
+++ b/doc/integration/jira/jira_server_configuration.md
@@ -65,13 +65,13 @@ To create a permission scheme for the group:
1. On the top bar, in the upper-right corner, select **Administration** (**{settings}**) > **Issues**.
1. On the left sidebar, select **Permission schemes**.
1. Select **Add permission scheme**.
-1. In the **Add permission scheme** dialog:
+1. On the **Add permission scheme** dialog:
- Enter a name for the scheme.
- Optional. Enter a description for the scheme.
1. Select **Add**.
1. On the **Permission schemes** page, in the **Actions** column, select **Permissions** for the new scheme.
1. Next to **Administer Projects**, select **Edit**.
-1. In the **Grant permission** dialog, for **Granted to**, select **Group**.
+1. On the **Grant permission** dialog, for **Granted to**, select **Group**.
1. From the **Group** dropdown list, select `gitlab-developers`, then select **Grant**.
You've done it! You can now use your new Jira username and password to configure the
diff --git a/doc/integration/jira/troubleshooting.md b/doc/integration/jira/troubleshooting.md
index d592455788d..49b5dfba566 100644
--- a/doc/integration/jira/troubleshooting.md
+++ b/doc/integration/jira/troubleshooting.md
@@ -108,3 +108,12 @@ Check [`production.log`](../../administration/logs/index.md#productionlog) to se
```
If that's the case, ensure the **Due date** field is visible for issues in the integrated Jira project.
+
+## `An error occurred while requesting data from Jira` when viewing the Jira issues list in GitLab
+
+You might see a `An error occurred while requesting data from Jira` message when you attempt to view the Jira issues list in GitLab.
+
+You can see this error when the authentication details in the Jira integration settings are incomplete or incorrect.
+
+To attempt to resolve this error, try [configuring the integration](configure.md#configure-the-integration) again. Verify that the
+authentication details are correct, re-enter your API token or password, and save your changes.
diff --git a/doc/integration/kerberos.md b/doc/integration/kerberos.md
index 62441f6de8f..5271f60b5dd 100644
--- a/doc/integration/kerberos.md
+++ b/doc/integration/kerberos.md
@@ -417,7 +417,7 @@ There are a number of potential causes and solutions for this error message.
#### Kerberos integration not using a dedicated port
-GitLab CI/CD doesn’t work with a Kerberos-enabled GitLab instance unless the Kerberos integration
+GitLab CI/CD doesn't work with a Kerberos-enabled GitLab instance unless the Kerberos integration
is configured to [use a dedicated port](kerberos.md#http-git-access-with-kerberos-token-passwordless-authentication).
#### Lack of connectivity between client machine and Kerberos server
@@ -431,6 +431,11 @@ If you're experiencing this error, ensure there is connectivity between the
client machine and the Kerberos server - this is a prerequisite! Traffic may be
blocked by a firewall, or the DNS records may be incorrect.
+#### `GitLab DNS record is a CNAME record` error
+
+Kerberos fails with this error when GitLab is referenced with a `CNAME` record.
+To resolve this issue, ensure the DNS record for GitLab is an `A` record.
+
#### Mismatched forward and reverse DNS records for GitLab instance hostname
Another failure mode occurs when the forward and reverse DNS records for the
@@ -442,7 +447,7 @@ above error message.
To fix this, ensure that the forward and reverse DNS for your GitLab server
match. So for instance, if you access GitLab as `gitlab.example.com`, resolving
-to IP address `1.2.3.4`, then `4.3.2.1.in-addr.arpa` must be a `PTR` record for
+to IP address `10.0.2.2`, then `2.2.0.10.in-addr.arpa` must be a `PTR` record for
`gitlab.example.com`.
#### Missing Kerberos libraries on browser or client machine
diff --git a/doc/integration/mattermost/index.md b/doc/integration/mattermost/index.md
index 0f9192f9a84..7ca4ed8a0e8 100644
--- a/doc/integration/mattermost/index.md
+++ b/doc/integration/mattermost/index.md
@@ -176,7 +176,7 @@ sudo gitlab-psql -d mattermost_production
## Back up GitLab Mattermost
-GitLab Mattermost is not included in the regular [Linux package backup](../../raketasks/backup_restore.md) Rake task.
+GitLab Mattermost is not included in the regular [Linux package backup](../../administration/backup_restore/index.md) Rake task.
The general Mattermost [backup and disaster recovery](https://docs.mattermost.com/deploy/backup-disaster-recovery.html) documentation can be used as a guide
on what needs to be backed up.
diff --git a/doc/integration/oauth_provider.md b/doc/integration/oauth_provider.md
index 6d08af225db..dffb45d30a1 100644
--- a/doc/integration/oauth_provider.md
+++ b/doc/integration/oauth_provider.md
@@ -106,6 +106,7 @@ different actions. See the following table for all available scopes.
| `openid` | Grants permission to authenticate with GitLab using [OpenID Connect](openid_connect_provider.md). Also gives read-only access to the user's profile and group memberships. |
| `profile` | Grants read-only access to the user's profile data using [OpenID Connect](openid_connect_provider.md). |
| `email` | Grants read-only access to the user's primary email address using [OpenID Connect](openid_connect_provider.md). |
+| `create_runner` | Grants permission to create runners. |
At any time you can revoke any access by selecting **Revoke**.
@@ -131,7 +132,7 @@ When applications are deleted, all grants and tokens associated with the applica
> - [Enabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/374588) in GitLab 15.9.
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 `hash_oauth_secrets`.
+On self-managed GitLab, by default this feature is available. To hide the feature, an administrator can [disable the feature flag](../administration/feature_flags.md) named `hash_oauth_secrets`.
On GitLab.com, this feature is available.
By default, GitLab stores OAuth application secrets in the database in hashed format. These secrets are only available to users immediately after creating OAuth applications. In
diff --git a/doc/integration/omniauth.md b/doc/integration/omniauth.md
index 2a871b97a28..01ea6408469 100644
--- a/doc/integration/omniauth.md
+++ b/doc/integration/omniauth.md
@@ -47,7 +47,7 @@ Linux package, Docker, and self-compiled | Helm chart | Description | Default va
----------------------------|------------|-------------|-----------
`allow_single_sign_on` | `allowSingleSignOn` | List of providers that automatically create a GitLab account. The provider names are available in the **OmniAuth provider name** column in the [supported providers table](#supported-providers). | `false`, which means that signing in using your OmniAuth provider account without a pre-existing GitLab account is not allowed. You must create a GitLab account first, and then connect it to your OmniAuth provider account through your profile settings.
`auto_link_ldap_user` | `autoLinkLdapUser` | Creates an LDAP identity in GitLab for users that are created through an OmniAuth provider. You can enable this setting if you have [LDAP integration](../administration/auth/ldap/index.md) enabled. Requires the `uid` of the user to be the same in both LDAP and the OmniAuth provider. | `false`
-`block_auto_created_users` | `blockAutoCreatedUsers` | Places automatically-created users in a [Pending approval](../user/admin_area/moderate_users.md#users-pending-approval) state (unable to sign in) until they are approved by an administrator. | `true`. If you set the value to `false`, make sure you define providers that you can control, like SAML or Google. Otherwise, any user on the internet can sign in to GitLab without an administrator's approval.
+`block_auto_created_users` | `blockAutoCreatedUsers` | Places automatically-created users in a [Pending approval](../administration/moderate_users.md#users-pending-approval) state (unable to sign in) until they are approved by an administrator. | `true`. If you set the value to `false`, make sure you define providers that you can control, like SAML or Google. Otherwise, any user on the internet can sign in to GitLab without an administrator's approval.
### Configure initial settings
@@ -309,7 +309,7 @@ To enable automatic linking for SAML, see the [SAML setup instructions](saml.md#
## Create an external providers list
You can define a list of external OmniAuth providers.
-Users who create accounts or sign in to GitLab through the listed providers do not get access to [internal projects](../user/public_access.md#internal-projects-and-groups) and are marked as [external users](../user/admin_area/external_users.md).
+Users who create accounts or sign in to GitLab through the listed providers do not get access to [internal projects](../user/public_access.md#internal-projects-and-groups) and are marked as [external users](../administration/external_users.md).
To define the external providers list, use the full name of the provider,
for example, `google_oauth2` for Google. For provider names, see the
diff --git a/doc/integration/saml.md b/doc/integration/saml.md
index f59824c8db6..d31f4ff80b3 100644
--- a/doc/integration/saml.md
+++ b/doc/integration/saml.md
@@ -673,16 +673,16 @@ Prerequisites:
1. Use the following information, and follow the instructions in
[Set up your own custom SAML application in Google Workspace](https://support.google.com/a/answer/6087519?hl=en).
- | | Typical value | Description |
- |------------------|--------------------------------------------------|----------------------------------------------------------|
- | Name of SAML App | GitLab | Other names OK. |
- | ACS URL | `https://<GITLAB_DOMAIN>/users/auth/saml/callback` | Assertion Consumer Service URL. |
- | GITLAB_DOMAIN | `gitlab.example.com` | Your GitLab instance domain. |
- | Entity ID | `https://gitlab.example.com` | A value unique to your SAML application. Set it to the `issuer` in your GitLab configuration. |
- | Name ID format | EMAIL | Required value. Also known as `name_identifier_format`. |
- | Name ID | Primary email address | Your email address. Make sure someone receives content sent to that address. |
- | First name | `first_name` | First name. Required value to communicate with GitLab. |
- | Last name | `last_name` | Last name. Required value to communicate with GitLab. |
+ | | Typical value | Description |
+ |:-----------------|:---------------------------------------------------|:----------------------------------------------------------------------------------------------|
+ | Name of SAML App | GitLab | Other names OK. |
+ | ACS URL | `https://<GITLAB_DOMAIN>/users/auth/saml/callback` | Assertion Consumer Service URL. |
+ | `GITLAB_DOMAIN` | `gitlab.example.com` | Your GitLab instance domain. |
+ | Entity ID | `https://gitlab.example.com` | A value unique to your SAML application. Set it to the `issuer` in your GitLab configuration. |
+ | Name ID format | `EMAIL` | Required value. Also known as `name_identifier_format`. |
+ | Name ID | Primary email address | Your email address. Make sure someone receives content sent to that address. |
+ | First name | `first_name` | First name. Required value to communicate with GitLab. |
+ | Last name | `last_name` | Last name. Required value to communicate with GitLab. |
1. Set up the following SAML attribute mappings:
@@ -742,7 +742,7 @@ As a result, SAML Group Sync only supports a single SAML provider. For more info
You can:
- Require users to be members of a certain group.
-- Assign users [external](../user/admin_area/external_users.md), administrator or [auditor](../administration/auditor_users.md) roles based on group membership.
+- Assign users [external](../administration/external_users.md), administrator or [auditor](../administration/auditor_users.md) roles based on group membership.
GitLab checks these groups on each SAML sign in and updates user attributes as necessary.
This feature **does not** allow you to automatically add users to GitLab
@@ -948,7 +948,7 @@ response, configure GitLab to identify:
- Information about a group or user, using a group setting.
SAML can automatically identify a user as an
-[external user](../user/admin_area/external_users.md), based on the `external_groups`
+[external user](../administration/external_users.md), based on the `external_groups`
setting.
Example configuration:
diff --git a/doc/integration/security_partners/index.md b/doc/integration/security_partners/index.md
index 5453b3417ab..e89f88becbc 100644
--- a/doc/integration/security_partners/index.md
+++ b/doc/integration/security_partners/index.md
@@ -1,30 +1,11 @@
---
-stage: Secure
-group: Static Analysis
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-type: index
+redirect_to: '../index.md#security-partners'
+remove_date: '2023-10-05'
---
-# Security partners **(FREE)**
+This document was moved to [another location](../index.md#security-partners).
-You can integrate GitLab with its security partners. This page has information on how do this with
-each security partner:
-
-<!-- vale gitlab.Spelling = NO -->
-
-- [Anchore](https://docs.anchore.com/current/docs/configuration/integration/ci_cd/gitlab/)
-- [Bridgecrew](https://docs.bridgecrew.io/docs/integrate-with-gitlab-self-managed)
-- [Checkmarx](https://checkmarx.atlassian.net/wiki/spaces/SD/pages/1929937052/GitLab+Integration)
-- [Deepfactor](https://www.deepfactor.io/docs/integrate-deepfactor-scanner-in-your-ci-cd-pipelines/#gitlab)
-- [GrammaTech](https://www.grammatech.com/codesonar-gitlab-integration)
-- [Indeni](https://docs.cloudrail.app/#/integrations/gitlab)
-- [JScrambler](https://docs.jscrambler.com/code-integrity/documentation/gitlab-ci-integration)
-- [Mend](https://www.mend.io/gitlab/)
-- [Semgrep](https://semgrep.dev/for/gitlab)
-- [StackHawk](https://docs.stackhawk.com/continuous-integration/gitlab.html)
-- [Tenable](https://docs.tenable.com/tenableio/Content/ContainerSecurity/GetStarted.htm)
-- [Venafi](https://marketplace.venafi.com/xchange/620d2d6ed419fb06a5c5bd36/solution/6292c2ef7550f2ee553cf223)
-- [Veracode](https://community.veracode.com/s/knowledgeitem/gitlab-ci-MCEKSYPRWL35BRTGOVI55SK5RI4A)
-- [Fortify](https://www.microfocus.com/en-us/fortify-integrations/gitlab)
-
-<!-- vale gitlab.Spelling = YES -->
+<!-- This redirect file can be deleted after <2023-10-05>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/integration/shibboleth.md b/doc/integration/shibboleth.md
index db49b30fa21..976f5ca9774 100644
--- a/doc/integration/shibboleth.md
+++ b/doc/integration/shibboleth.md
@@ -1,6 +1,6 @@
---
-stage: Create
-group: Ecosystem
+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/slash_commands.md b/doc/integration/slash_commands.md
index 02c7debc6dc..e36ee164002 100644
--- a/doc/integration/slash_commands.md
+++ b/doc/integration/slash_commands.md
@@ -1,51 +1,11 @@
---
-stage: Manage
-group: Import and Integrate
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+redirect_to: '../user/project/integrations/gitlab_slack_application.md#slash-commands'
+remove_date: '2023-09-19'
---
-# Slash commands in Mattermost and Slack **(FREE)**
+This document was moved to [another location](../user/project/integrations/gitlab_slack_application.md#slash-commands).
-> [Moved](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/24780) from GitLab Ultimate to GitLab Free in 11.9.
-
-If you want to control and view GitLab content while you're
-working in Slack and Mattermost, you can use slash commands.
-Type the command as a message in your chat client to activate it.
-For Slack, this requires an [integration configuration](../user/project/integrations/slack_slash_commands.md).
-
-Slash commands are scoped to a project and require
-a specified trigger command during configuration.
-You should use the project name as the trigger command.
-
-If you're using the [GitLab for Slack app](../user/project/integrations/gitlab_slack_application.md) for
-your GitLab.com projects, [add the `gitlab` keyword at the beginning of the command](../user/project/integrations/gitlab_slack_application.md#slash-commands)
-(for example, `/gitlab <project-name> issue show <id>`).
-
-Assuming `project-name` is the trigger command, the slash commands are:
-
-| Command | Effect |
-| ------- | ------ |
-| `/project-name help` | Shows all available slash commands. |
-| `/project-name issue new <title> <shift+return> <description>` | Creates a new issue with title `<title>` and description `<description>`. |
-| `/project-name issue show <id>` | Shows the issue with ID `<id>`. |
-| `/project-name issue close <id>` | Closes the issue with ID `<id>`. |
-| `/project-name issue search <query>` | Shows up to 5 issues matching `<query>`. |
-| `/project-name issue move <id> to <project>` | Moves the issue with ID `<id>` to `<project>`. |
-| `/project-name issue comment <id> <shift+return> <comment>` | Adds a new comment with comment body `<comment>` to the issue with ID `<id>`. |
-| `/project-name deploy <from> to <to>` | [Deploys](#deploy-command) from the `<from>` environment to the `<to>` environment. |
-| `/project-name run <job name> <arguments>` | Executes the [ChatOps](../ci/chatops/index.md) job `<job name>` on the default branch. |
-
-## Issue commands
-
-You can create a new issue, display issue details, and search up to 5 issues.
-
-## Deploy command
-
-To deploy to an environment, GitLab tries to find a deployment
-manual action in the pipeline.
-
-If there's only one action for a given environment, it is triggered.
-If more than one action is defined, GitLab finds an action
-name that equals the environment name to deploy to.
-
-The command returns an error if no matching action is found.
+<!-- This redirect file can be deleted after 2023-09-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/integration/sourcegraph.md b/doc/integration/sourcegraph.md
index 366a862a9fb..4b0db1ab4b9 100644
--- a/doc/integration/sourcegraph.md
+++ b/doc/integration/sourcegraph.md
@@ -12,7 +12,7 @@ type: reference, how-to
> - [Enabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/73116) in GitLab 14.8.
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 `sourcegraph`.
+On self-managed GitLab, by default this feature is available. To hide the feature, an administrator can [disable the feature flag](../administration/feature_flags.md) named `sourcegraph`.
On GitLab.com, this feature is available for public projects only.
[Sourcegraph](https://sourcegraph.com) provides code intelligence features, natively integrated into the GitLab UI.
diff --git a/doc/operations/error_tracking.md b/doc/operations/error_tracking.md
index a2d50e43a80..c3902a560c0 100644
--- a/doc/operations/error_tracking.md
+++ b/doc/operations/error_tracking.md
@@ -1,5 +1,5 @@
---
-stage: Monitor
+stage: Analytics
group: Observability
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/operations/feature_flags.md b/doc/operations/feature_flags.md
index edb7176c045..142bd9d898d 100644
--- a/doc/operations/feature_flags.md
+++ b/doc/operations/feature_flags.md
@@ -14,7 +14,9 @@ Feature flags help reduce risk, allowing you to do controlled testing, and separ
delivery from customer launch.
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
-For an example of feature flags in action, see [GitLab for deploys, feature flags, and error tracking](https://www.youtube.com/watch?v=5tw2p6lwXxo).
+For an example of feature flags in action, see [Feature Flags configuration, instrumentation and use](https://www.youtube.com/watch?v=ViA6suScxkE).
+
+You can also explore feature flags with a [click-through demo](https://go.gitlab.com/YKuzLt).
NOTE:
To contribute to the development of the GitLab product, view
@@ -85,7 +87,7 @@ and the supported strategies are:
- [User List](#user-list)
Strategies can be added to feature flags when [creating a feature flag](#create-a-feature-flag),
-or by editing an existing feature flag after creation by navigating to **Deployments > Feature flags**
+or by editing an existing feature flag after creation by navigating to **Deploy > Feature flags**
and selecting **Edit** (**{pencil}**).
### All users
diff --git a/doc/operations/incident_management/incident_timeline_events.md b/doc/operations/incident_management/incident_timeline_events.md
index 6a52accbfb2..0c47ff46bc9 100644
--- a/doc/operations/incident_management/incident_timeline_events.md
+++ b/doc/operations/incident_management/incident_timeline_events.md
@@ -88,7 +88,7 @@ of an incident.
> [Introduced]([issue-link](https://gitlab.com/gitlab-org/gitlab/-/issues/365489)) in GitLab 15.3 [with a flag](../../administration/feature_flags.md) named `incident_timeline_events_from_labels`. Disabled by default.
FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available per project or for your entire instance, ask an administrator to [enable the feature flag](../../administration/feature_flags.md) named `incident_timeline_events_from_labels`.
+On self-managed GitLab, by default this feature is not available. To make it available per project or for your entire instance, an administrator can [enable the feature flag](../../administration/feature_flags.md) named `incident_timeline_events_from_labels`.
On GitLab.com, this feature is not available.
This feature is not ready for production use.
@@ -139,7 +139,7 @@ Added tags are displayed next to the timestamp.
Incident timeline events support the following [GitLab Flavored Markdown](../../user/markdown.md) features.
- [Code](../../user/markdown.md#code-spans-and-blocks).
-- [Emojis](../../user/markdown.md#emojis).
+- [Emoji](../../user/markdown.md#emoji).
- [Emphasis](../../user/markdown.md#emphasis).
- [GitLab-specific references](../../user/markdown.md#gitlab-specific-references).
- [Images](../../user/markdown.md#images), rendered as a link to the uploaded image.
diff --git a/doc/operations/incident_management/manage_incidents.md b/doc/operations/incident_management/manage_incidents.md
index 3d2688daf6a..bb9dde4b416 100644
--- a/doc/operations/incident_management/manage_incidents.md
+++ b/doc/operations/incident_management/manage_incidents.md
@@ -222,9 +222,9 @@ When you close an incident that is linked to an [alert](alerts.md),
the linked alert's status changes to **Resolved**.
You are then credited with the alert's status change.
-<!-- Delete when the `moved_mr_sidebar` feature flag is removed -->
+<!-- Delete when the `move_close_into_dropdown` feature flag is removed -->
If you don't see this action at the top of an incident, your project or instance might have
-enabled a feature flag for [moved actions](../../user/project/merge_requests/index.md#move-sidebar-actions)
+enabled a feature flag to [moved it in the actions menu](../../user/project/issues/managing_issues.md#move-the-close-button-into-the-actions-menu).
### Automatically close incidents via recovery alerts
diff --git a/doc/operations/incident_management/slack.md b/doc/operations/incident_management/slack.md
index b007f253fd8..aa0d057bfd8 100644
--- a/doc/operations/incident_management/slack.md
+++ b/doc/operations/incident_management/slack.md
@@ -37,7 +37,7 @@ Prerequisites:
1. Authorize GitLab to take actions on behalf of your Slack user.
Each user must do this before they can use any of the incident slash commands.
- To start the authorization flow, try executing a non-incident [Slack slash command](../../integration/slash_commands.md),
+ To start the authorization flow, try executing a non-incident [Slack slash command](../../user/project/integrations/gitlab_slack_application.md#slash-commands),
like `/gitlab <project-alias> issue show <id>`.
The `<project-alias>` you select must be a project that has the GitLab for Slack app set up.
For more information, see [issue 377548](https://gitlab.com/gitlab-org/gitlab/-/issues/377548).
diff --git a/doc/operations/incident_management/status_page.md b/doc/operations/incident_management/status_page.md
index a159757842d..a52790b7f70 100644
--- a/doc/operations/incident_management/status_page.md
+++ b/doc/operations/incident_management/status_page.md
@@ -19,8 +19,8 @@ Selecting an incident displays a detail page with more information about a parti
![Status Page detail](img/status_page_detail_v12_10.png)
- Status on the incident, including when the incident was last updated.
-- The incident title, including any emojis.
-- The description of the incident, including emojis.
+- The incident title, including any emoji.
+- The description of the incident, including emoji.
- Any file attachments provided in the incident description, or comments with a
valid image extension. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/205166) in GitLab 13.1.
- A chronological ordered list of updates to the incident.
@@ -84,7 +84,7 @@ the necessary CI/CD variables to deploy the Status Page to AWS S3:
- `AWS_DEFAULT_REGION` - The AWS region.
- `AWS_ACCESS_KEY_ID` - The AWS access key ID.
- `AWS_SECRET_ACCESS_KEY` - The AWS secret.
-1. On the left sidebar, select **CI/CD > Pipelines**.
+1. On the left sidebar, select **Build > Pipelines**.
1. To deploy the Status Page to S3, select **Run pipeline**.
WARNING:
diff --git a/doc/policy/experiment-beta-support.md b/doc/policy/experiment-beta-support.md
index 59490ac3d68..b6156f9c20f 100644
--- a/doc/policy/experiment-beta-support.md
+++ b/doc/policy/experiment-beta-support.md
@@ -12,18 +12,20 @@ All other features are considered to be Generally Available (GA).
## Experiment
-Support is not provided for features listed as "Experimental" or "Alpha" or any similar designation. Issues regarding such features should be opened in the GitLab issue tracker.
+Support is not provided for features listed as "Experimental" or "Alpha" or any similar designation. Issues regarding such features should be opened in the GitLab issue tracker. Teams should release features as GA from the start unless there are strong reasons to release them as Experiment or Beta versions first.
- Not ready for production use.
- No support available.
-- May be unstable or have performance issues.
+- May be unstable.
- Can be removed at any time.
- Data loss may occur.
- Documentation may not exist or just be in a blog format.
-- [User interface reflects Experiment status](https://design.gitlab.com/usability/feature-management#highlighting-feature-versions).
-- User experience incomplete, might be just quick action access.
-- Behind a feature flag that is on by default.
-- Behind a toggle that is off by default.
+- Offer an easy way to choose to opt-in to experimental features with minimal friction. For example, needing to flip a feature flag is too much friction, but a group or project-level setting that is in the UI is not.
+- Link out to the [GitLab Testing Agreement](https://about.gitlab.com/handbook/legal/testing-agreement/) in the opt-in.
+- Documentation reflects that the feature is subject to the [GitLab Testing Agreement](https://about.gitlab.com/handbook/legal/testing-agreement/).
+- [UI reflects experiment status](https://design.gitlab.com/usability/feature-management#highlighting-feature-versions).
+- Feedback issue to engage with team.
+- UX not finalized, might be just quick action access.
- Not announced in a release post.
- Can be promoted in the user interface through [discovery moments](https://design.gitlab.com/usability/feature-management#discovery-moments), if needed.
- Feedback issue to engage with team.
@@ -34,7 +36,7 @@ Commercially-reasonable efforts are made to provide limited support for features
- May not be ready for production use.
- Support on a commercially-reasonable effort basis.
-- May be unstable and can cause performance and stability issues.
+- May be unstable.
- Configuration and dependencies unlikely to change.
- Features and functions unlikely to change. However, breaking changes may occur outside of major releases or with less notice than for Generally Available features.
- Data loss not likely.
@@ -54,13 +56,13 @@ Generally Available features means that they passed the [Production Readiness Re
- Fully documented and supported.
- User experience complete and in line with GitLab design standards.
-## Never internal
+## Provide earlier access
-Features are never internal (GitLab team-members) only.
+Give users the ability to opt into experimental features when there is enough value.
+Where possible, release an experimental feature externally instead of only testing internally or waiting for the feature to be in a Beta state.
Our [mission is "everyone can contribute"](https://about.gitlab.com/company/mission/), and that is only possible if people outside the company can try a feature.
We get higher quality (more diverse) feedback if people from different organizations try something.
-We've also learned that internal only as a state slows us down more than it speeds us up.
-Release the experiment instead of testing internally or waiting for the feature to be in a Beta state.
+We've learned that keeping features internal only for extended periods of time slows us down unnecessarily.
The experimental features are only shown when people/organizations opt-in to experiments, we are allowed to make mistakes here and literally experiment.
## All features are in production
diff --git a/doc/policy/maintenance.md b/doc/policy/maintenance.md
index 7970f9711e6..a6de6f594fb 100644
--- a/doc/policy/maintenance.md
+++ b/doc/policy/maintenance.md
@@ -102,7 +102,7 @@ accessible.
### Backporting to older releases
-Backporting to more than one stable release is normally reserved for [security releases](#security-releases).
+Backporting to more than one stable release is usually reserved for [security releases](#security-releases).
In some cases, however, we may need to backport *a bug fix* to more than one stable
release, depending on the severity of the bug.
diff --git a/doc/raketasks/backup_gitlab.md b/doc/raketasks/backup_gitlab.md
index a6635c589aa..231312b3833 100644
--- a/doc/raketasks/backup_gitlab.md
+++ b/doc/raketasks/backup_gitlab.md
@@ -2,955 +2,13 @@
stage: Systems
group: Geo
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+redirect_to: '../administration/backup_restore/backup_gitlab.md'
+remove_date: '2023-09-26'
---
-# Back up GitLab **(FREE SELF)**
+This document was moved to [another location](../administration/backup_restore/backup_gitlab.md).
-GitLab provides a command line interface to back up your entire instance,
-including:
-
-- Database
-- Attachments
-- Git repositories data
-- CI/CD job output logs
-- CI/CD job artifacts
-- LFS objects
-- Terraform states ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/331806) in GitLab 14.7)
-- Container Registry images
-- GitLab Pages content
-- Packages ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/332006) in GitLab 14.7)
-- Snippets
-- [Group wikis](../user/project/wiki/group.md)
-- Project-level Secure Files ([introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/121142) in GitLab 16.1)
-
-Backups do not include:
-
-- [Mattermost data](https://docs.mattermost.com/administration/config-settings.html#file-storage)
-- Redis (and thus Sidekiq jobs)
-
-WARNING:
-GitLab does not back up any configuration files (`/etc/gitlab`), TLS keys and certificates, or system
-files. You are highly advised to read about [storing configuration files](#storing-configuration-files).
-
-WARNING:
-The backup command requires [additional parameters](backup_restore.md#back-up-and-restore-for-installations-using-pgbouncer) when
-your installation is using PgBouncer, for either performance reasons or when using it with a Patroni cluster.
-
-WARNING:
-Before GitLab 15.5.0, the backup command doesn't verify if another backup is already running, as described in
-[issue 362593](https://gitlab.com/gitlab-org/gitlab/-/issues/362593). We strongly recommend
-you make sure that all backups are complete before starting a new one.
-
-Depending on your version of GitLab, use the following command if you installed
-GitLab using the Omnibus package:
-
-- GitLab 12.2 or later:
-
- ```shell
- sudo gitlab-backup create
- ```
-
-- GitLab 12.1 and earlier:
-
- ```shell
- gitlab-rake gitlab:backup:create
- ```
-
-If you installed GitLab from source, use the following command:
-
-```shell
-sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production
-```
-
-If you're running GitLab from within a Docker container, run the backup from
-the host, based on your installed version of GitLab:
-
-- GitLab 12.2 or later:
-
- ```shell
- docker exec -t <container name> gitlab-backup create
- ```
-
-- GitLab 12.1 and earlier:
-
- ```shell
- docker exec -t <container name> gitlab-rake gitlab:backup:create
- ```
-
-If you're using the [GitLab Helm chart](https://gitlab.com/gitlab-org/charts/gitlab)
-on a Kubernetes cluster, you can run the backup task by using `kubectl` to run the `backup-utility`
-script on the GitLab toolbox pod. For more details, see the
-[charts backup documentation](https://docs.gitlab.com/charts/backup-restore/backup.html).
-
-Similar to the Kubernetes case, if you have scaled out your GitLab cluster to
-use multiple application servers, you should pick a designated node (that isn't
-auto-scaled away) for running the backup Rake task. Because the backup Rake
-task is tightly coupled to the main Rails application, this is typically a node
-on which you're also running Puma or Sidekiq.
-
-Example output:
-
-```plaintext
-Dumping database tables:
-- Dumping table events... [DONE]
-- Dumping table issues... [DONE]
-- Dumping table keys... [DONE]
-- Dumping table merge_requests... [DONE]
-- Dumping table milestones... [DONE]
-- Dumping table namespaces... [DONE]
-- Dumping table notes... [DONE]
-- Dumping table projects... [DONE]
-- Dumping table protected_branches... [DONE]
-- Dumping table schema_migrations... [DONE]
-- Dumping table services... [DONE]
-- Dumping table snippets... [DONE]
-- Dumping table taggings... [DONE]
-- Dumping table tags... [DONE]
-- Dumping table users... [DONE]
-- Dumping table users_projects... [DONE]
-- Dumping table web_hooks... [DONE]
-- Dumping table wikis... [DONE]
-Dumping repositories:
-- Dumping repository abcd... [DONE]
-Creating backup archive: $TIMESTAMP_gitlab_backup.tar [DONE]
-Deleting tmp directories...[DONE]
-Deleting old backups... [SKIPPING]
-```
-
-## Storing configuration files
-
-The [backup Rake task](#back-up-gitlab) GitLab provides does _not_ store your
-configuration files. The primary reason for this is that your database contains
-items including encrypted information for two-factor authentication and the
-CI/CD _secure variables_. Storing encrypted information in the same location
-as its key defeats the purpose of using encryption in the first place.
-
-WARNING:
-The secrets file is essential to preserve your database encryption key.
-
-At the very **minimum**, you must back up:
-
-For Omnibus:
-
-- `/etc/gitlab/gitlab-secrets.json`
-- `/etc/gitlab/gitlab.rb`
-
-For installation from source:
-
-- `/home/git/gitlab/config/secrets.yml`
-- `/home/git/gitlab/config/gitlab.yml`
-
-For [Docker installations](../install/docker.md), you must
-back up the volume where the configuration files are stored. If you created
-the GitLab container according to the documentation, it should be in the
-`/srv/gitlab/config` directory.
-
-For [GitLab Helm chart installations](https://gitlab.com/gitlab-org/charts/gitlab)
-on a Kubernetes cluster, you must follow the
-[Back up the secrets](https://docs.gitlab.com/charts/backup-restore/backup.html#back-up-the-secrets)
-instructions.
-
-You may also want to back up any TLS keys and certificates (`/etc/gitlab/ssl`, `/etc/gitlab/trusted-certs`), and your
-[SSH host keys](https://superuser.com/questions/532040/copy-ssh-keys-from-one-server-to-another-server/532079#532079)
-to avoid man-in-the-middle attack warnings if you have to perform a full machine restore.
-
-If you use Omnibus GitLab, review additional information to
-[backup your configuration](https://docs.gitlab.com/omnibus/settings/backups.html).
-
-In the unlikely event that the secrets file is lost, see the
-[troubleshooting section](backup_restore.md#when-the-secrets-file-is-lost).
-
-## Backup options
-
-The command line tool GitLab provides to backup your instance can accept more
-options.
-
-### Backup strategy option
-
-The default backup strategy is to essentially stream data from the respective
-data locations to the backup using the Linux command `tar` and `gzip`. This works
-fine in most cases, but can cause problems when data is rapidly changing.
-
-When data changes while `tar` is reading it, the error `file changed as we read
-it` may occur, and causes the backup process to fail. To combat this, 8.17
-introduces a new backup strategy called `copy`. The strategy copies data files
-to a temporary location before calling `tar` and `gzip`, avoiding the error.
-
-A side-effect is that the backup process takes up to an additional 1X disk
-space. The process does its best to clean up the temporary files at each stage
-so the problem doesn't compound, but it could be a considerable change for large
-installations. This is why the `copy` strategy is not the default in 8.17.
-
-To use the `copy` strategy instead of the default streaming strategy, specify
-`STRATEGY=copy` in the Rake task command. For example:
-
-```shell
-sudo gitlab-backup create STRATEGY=copy
-```
-
-Users of GitLab 12.1 and earlier should use the command `gitlab-rake gitlab:backup:create` instead.
-
-### Backup filename
-
-WARNING:
-If you use a custom backup filename, you can't
-[limit the lifetime of the backups](#limit-backup-lifetime-for-local-files-prune-old-backups).
-
-By default, a backup file is created according to the specification in the
-previous [Backup timestamp](backup_restore.md#backup-timestamp) section. You can, however,
-override the `[TIMESTAMP]` portion of the filename by setting the `BACKUP`
-environment variable. For example:
-
-```shell
-sudo gitlab-backup create BACKUP=dump
-```
-
-Users of GitLab 12.1 and earlier should use the command `gitlab-rake gitlab:backup:create` instead.
-
-The resulting file is named `dump_gitlab_backup.tar`. This is useful for
-systems that make use of rsync and incremental backups, and results in
-considerably faster transfer speeds.
-
-### Confirm archive can be transferred
-
-To ensure the generated archive is transferable by rsync, you can set the `GZIP_RSYNCABLE=yes`
-option. This sets the `--rsyncable` option to `gzip`, which is useful only in
-combination with setting [the Backup filename option](#backup-filename).
-
-The `--rsyncable` option in `gzip` isn't guaranteed to be available
-on all distributions. To verify that it's available in your distribution, run
-`gzip --help` or consult the man pages.
-
-```shell
-sudo gitlab-backup create BACKUP=dump GZIP_RSYNCABLE=yes
-```
-
-Users of GitLab 12.1 and earlier should use the command `gitlab-rake gitlab:backup:create` instead.
-
-### Excluding specific directories from the backup
-
-You can exclude specific directories from the backup by adding the environment variable `SKIP`, whose values are a comma-separated list of the following options:
-
-- `db` (database)
-- `uploads` (attachments)
-- `builds` (CI job output logs)
-- `artifacts` (CI job artifacts)
-- `lfs` (LFS objects)
-- `terraform_state` (Terraform states)
-- `registry` (Container Registry images)
-- `pages` (Pages content)
-- `repositories` (Git repositories data)
-- `packages` (Packages)
-- `ci_secure_files` (Project-level Secure Files)
-
-NOTE:
-When [backing up and restoring Helm Charts](https://docs.gitlab.com/charts/architecture/backup-restore.html), there is an additional option `packages`, which refers to any packages managed by the GitLab [package registry](../user/packages/package_registry/index.md).
-For more information see [command line arguments](https://docs.gitlab.com/charts/architecture/backup-restore.html#command-line-arguments).
-
-All wikis are backed up as part of the `repositories` group. Non-existent
-wikis are skipped during a backup.
-
-For Omnibus GitLab packages:
-
-```shell
-sudo gitlab-backup create SKIP=db,uploads
-```
-
-Users of GitLab 12.1 and earlier should use the command `gitlab-rake gitlab:backup:create` instead.
-
-For installations from source:
-
-```shell
-sudo -u git -H bundle exec rake gitlab:backup:create SKIP=db,uploads RAILS_ENV=production
-```
-
-`SKIP=` is also used to:
-
-- [Skip creation of the tar file](#skipping-tar-creation) (`SKIP=tar`).
-- [Skip uploading the backup to remote storage](#skip-uploading-backups-to-remote-storage) (`SKIP=remote`).
-
-### Skipping tar creation
-
-NOTE:
-It is not possible to skip the tar creation when using [object storage](#upload-backups-to-a-remote-cloud-storage) for backups.
-
-The last part of creating a backup is generation of a `.tar` file containing
-all the parts. In some cases (for example, if the backup is picked up by other
-backup software) creating a `.tar` file might be wasted effort or even directly
-harmful, so you can skip this step by adding `tar` to the `SKIP` environment
-variable.
-
-Adding `tar` to the `SKIP` variable leaves the files and directories containing the
-backup in the directory used for the intermediate files. These files are
-overwritten when a new backup is created, so you should make sure they are copied
-elsewhere, because you can only have one backup on the system.
-
-For Omnibus GitLab packages:
-
-```shell
-sudo gitlab-backup create SKIP=tar
-```
-
-For installations from source:
-
-```shell
-sudo -u git -H bundle exec rake gitlab:backup:create SKIP=tar RAILS_ENV=production
-```
-
-### Back up Git repositories concurrently
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37158) in GitLab 13.3.
-> - [Concurrent restore introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69330) in GitLab 14.3
-
-When using [multiple repository storages](../administration/repository_storage_paths.md),
-repositories can be backed up or restored concurrently to help fully use CPU time. The
-following variables are available to modify the default behavior of the Rake
-task:
-
-- `GITLAB_BACKUP_MAX_CONCURRENCY`: The maximum number of projects to back up at
- the same time. Defaults to the number of logical CPUs (in GitLab 14.1 and
- earlier, defaults to `1`).
-- `GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY`: The maximum number of projects to
- back up at the same time on each storage. This allows the repository backups
- to be spread across storages. Defaults to `2` (in GitLab 14.1 and earlier,
- defaults to `1`).
-
-For example, for Omnibus GitLab installations with 4 repository storages:
-
-```shell
-sudo gitlab-backup create GITLAB_BACKUP_MAX_CONCURRENCY=4 GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY=1
-```
-
-For example, for installations from source:
-
-```shell
-sudo -u git -H bundle exec rake gitlab:backup:create GITLAB_BACKUP_MAX_CONCURRENCY=4 GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY=1
-```
-
-### Incremental repository backups
-
-> - Introduced in GitLab 14.9 [with a flag](../administration/feature_flags.md) named `incremental_repository_backup`. Disabled by default.
-> - [Enabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/355945) in GitLab 14.10.
-> - `PREVIOUS_BACKUP` option [introduced](https://gitlab.com/gitlab-org/gitaly/-/issues/4184) in GitLab 15.0.
-
-FLAG:
-On self-managed GitLab, by default this feature is available. To hide the feature, ask an administrator to [disable the feature flag](../administration/feature_flags.md) named `incremental_repository_backup`.
-On GitLab.com, this feature is not available.
-
-NOTE:
-Only repositories support incremental backups. Therefore, if you use `INCREMENTAL=yes`, the task
-creates a self-contained backup tar archive. This is because all subtasks except repositories are
-still creating full backups (they overwrite the existing full backup).
-See [issue 19256](https://gitlab.com/gitlab-org/gitlab/-/issues/19256) for a feature request to
-support incremental backups for all subtasks.
-
-Incremental repository backups can be faster than full repository backups because they only pack changes since the last backup into the backup bundle for each repository.
-The incremental backup archives are not linked to each other: each archive is a self-contained backup of the instance. There must be an existing backup
-to create an incremental backup from:
-
-- In GitLab 14.9 and 14.10, use the `BACKUP=<timestamp_of_backup>` option to choose the backup to use. The chosen previous backup is overwritten.
-- In GitLab 15.0 and later, use the `PREVIOUS_BACKUP=<timestamp_of_backup>` option to choose the backup to use. By default, a backup file is created
- as documented in the [Backup timestamp](backup_restore.md#backup-timestamp) section. You can override the `[TIMESTAMP]` portion of the filename by setting the
- [`BACKUP` environment variable](#backup-filename).
-
-To create an incremental backup, run:
-
-- In GitLab 15.0 or later:
-
- ```shell
- sudo gitlab-backup create INCREMENTAL=yes PREVIOUS_BACKUP=<timestamp_of_backup>
- ```
-
-- In GitLab 14.9 and 14.10:
-
- ```shell
- sudo gitlab-backup create INCREMENTAL=yes BACKUP=<timestamp_of_backup>
- ```
-
-To create an [untarred](#skipping-tar-creation) incremental backup from a tarred backup, use `SKIP=tar`:
-
-```shell
-sudo gitlab-backup create INCREMENTAL=yes SKIP=tar
-```
-
-### Back up specific repository storages
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86896) in GitLab 15.0.
-
-When using [multiple repository storages](../administration/repository_storage_paths.md),
-repositories from specific repository storages can be backed up separately
-using the `REPOSITORIES_STORAGES` option. The option accepts a comma-separated list of
-storage names.
-
-For example, for Omnibus GitLab installations:
-
-```shell
-sudo gitlab-backup create REPOSITORIES_STORAGES=storage1,storage2
-```
-
-For example, for installations from source:
-
-```shell
-sudo -u git -H bundle exec rake gitlab:backup:create REPOSITORIES_STORAGES=storage1,storage2
-```
-
-### Back up specific repositories
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/88094) in GitLab 15.1.
-
-You can back up specific repositories using the `REPOSITORIES_PATHS` option.
-Similarly, you can use `SKIP_REPOSITORIES_PATHS` to skip certain repositories.
-Both options accept a comma-separated list of project or group paths. If you
-specify a group path, all repositories in all projects in the group and
-descendent groups are included or skipped, depending on which option you used.
-
-For example, to back up all repositories for all projects in **Group A** (`group-a`), the repository for **Project C** in **Group B** (`group-b/project-c`),
-and skip the **Project D** in **Group A** (`group-a/project-d`):
-
-- Omnibus GitLab installations:
-
- ```shell
- sudo gitlab-backup create REPOSITORIES_PATHS=group-a,group-b/project-c SKIP_REPOSITORIES_PATHS=group-a/project-d
- ```
-
-- Installations from source:
-
- ```shell
- sudo -u git -H bundle exec rake gitlab:backup:create REPOSITORIES_PATHS=group-a,group-b/project-c SKIP_REPOSITORIES_PATHS=group-a/project-d
- ```
-
-### Upload backups to a remote (cloud) storage
-
-NOTE:
-It is not possible to [skip the tar creation](#skipping-tar-creation) when using object storage for backups.
-
-You can let the backup script upload (using the [Fog library](https://fog.io/))
-the `.tar` file it creates. In the following example, we use Amazon S3 for
-storage, but Fog also lets you use [other storage providers](https://fog.io/storage/).
-GitLab also [imports cloud drivers](https://gitlab.com/gitlab-org/gitlab/-/blob/da46c9655962df7d49caef0e2b9f6bbe88462a02/Gemfile#L113)
-for AWS, Google, and Aliyun. A local driver is
-[also available](#upload-to-locally-mounted-shares).
-
-[Read more about using object storage with GitLab](../administration/object_storage.md).
-
-#### Using Amazon S3
-
-For Omnibus GitLab packages:
-
-1. Add the following to `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- gitlab_rails['backup_upload_connection'] = {
- 'provider' => 'AWS',
- 'region' => 'eu-west-1',
- 'aws_access_key_id' => 'AKIAKIAKI',
- 'aws_secret_access_key' => 'secret123'
- # If using an IAM Profile, don't configure aws_access_key_id & aws_secret_access_key
- # 'use_iam_profile' => true
- }
- gitlab_rails['backup_upload_remote_directory'] = 'my.s3.bucket'
- # Consider using multipart uploads when file size reaches 100MB. Enter a number in bytes.
- # gitlab_rails['backup_multipart_chunk_size'] = 104857600
- ```
-
-1. [Reconfigure GitLab](../administration/restart_gitlab.md#reconfigure-a-linux-package-installation)
- for the changes to take effect
-
-#### S3 Encrypted Buckets
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64765) in GitLab 14.3.
-
-AWS supports these [modes for server side encryption](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html):
-
-- Amazon S3-Managed Keys (SSE-S3)
-- Customer Master Keys (CMKs) Stored in AWS Key Management Service (SSE-KMS)
-- Customer-Provided Keys (SSE-C)
-
-Use your mode of choice with GitLab. Each mode has similar, but slightly
-different, configuration methods.
-
-##### SSE-S3
-
-To enable SSE-S3, in the backup storage options set the `server_side_encryption`
-field to `AES256`. For example, in Omnibus GitLab:
-
-```ruby
-gitlab_rails['backup_upload_storage_options'] = {
- 'server_side_encryption' => 'AES256'
-}
-```
-
-##### SSE-KMS
-
-To enable SSE-KMS, you need the
-[KMS key via its Amazon Resource Name (ARN) in the `arn:aws:kms:region:acct-id:key/key-id` format](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html).
-Under the `backup_upload_storage_options` configuration setting, set:
-
-- `server_side_encryption` to `aws:kms`.
-- `server_side_encryption_kms_key_id` to the ARN of the key.
-
-For example, in Omnibus GitLab:
-
-```ruby
-gitlab_rails['backup_upload_storage_options'] = {
- 'server_side_encryption' => 'aws:kms',
- 'server_side_encryption_kms_key_id' => 'arn:aws:<YOUR KMS KEY ID>:'
-}
-```
-
-##### SSE-C
-
-SSE-C requires you to set these encryption options:
-
-- `backup_encryption`: AES256.
-- `backup_encryption_key`: Unencoded, 32-byte (256 bits) key. The upload fails if this isn't exactly 32 bytes.
-
-For example, in Omnibus GitLab:
-
-```ruby
-gitlab_rails['backup_encryption'] = 'AES256'
-gitlab_rails['backup_encryption_key'] = '<YOUR 32-BYTE KEY HERE>'
-```
-
-If the key contains binary characters and cannot be encoded in UTF-8,
-instead, specify the key with the `GITLAB_BACKUP_ENCRYPTION_KEY` environment variable.
-For example:
-
-```ruby
-gitlab_rails['env'] = { 'GITLAB_BACKUP_ENCRYPTION_KEY' => "\xDE\xAD\xBE\xEF" * 8 }
-```
-
-#### Digital Ocean Spaces
-
-This example can be used for a bucket in Amsterdam (AMS3):
-
-1. Add the following to `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- gitlab_rails['backup_upload_connection'] = {
- 'provider' => 'AWS',
- 'region' => 'ams3',
- 'aws_access_key_id' => 'AKIAKIAKI',
- 'aws_secret_access_key' => 'secret123',
- 'endpoint' => 'https://ams3.digitaloceanspaces.com'
- }
- gitlab_rails['backup_upload_remote_directory'] = 'my.s3.bucket'
- ```
-
-1. [Reconfigure GitLab](../administration/restart_gitlab.md#reconfigure-a-linux-package-installation)
- for the changes to take effect
-
-If you see a `400 Bad Request` error message when using Digital Ocean Spaces,
-the cause may be the use of backup encryption. Because Digital Ocean Spaces
-doesn't support encryption, remove or comment the line that contains
-`gitlab_rails['backup_encryption']`.
-
-#### Other S3 Providers
-
-Not all S3 providers are fully compatible with the Fog library. For example,
-if you see a `411 Length Required` error message after attempting to upload,
-you may need to downgrade the `aws_signature_version` value from the default
-value to `2`, [due to this issue](https://github.com/fog/fog-aws/issues/428).
-
-For installations from source:
-
-1. Edit `home/git/gitlab/config/gitlab.yml`:
-
- ```yaml
- backup:
- # snip
- upload:
- # Fog storage connection settings, see https://fog.io/storage/ .
- connection:
- provider: AWS
- region: eu-west-1
- aws_access_key_id: AKIAKIAKI
- aws_secret_access_key: 'secret123'
- # If using an IAM Profile, leave aws_access_key_id & aws_secret_access_key empty
- # ie. aws_access_key_id: ''
- # use_iam_profile: 'true'
- # The remote 'directory' to store your backups. For S3, this would be the bucket name.
- remote_directory: 'my.s3.bucket'
- # Specifies Amazon S3 storage class to use for backups, this is optional
- # storage_class: 'STANDARD'
- #
- # Turns on AWS Server-Side Encryption with Amazon Customer-Provided Encryption Keys for backups, this is optional
- # 'encryption' must be set in order for this to have any effect.
- # 'encryption_key' should be set to the 256-bit encryption key for Amazon S3 to use to encrypt or decrypt.
- # To avoid storing the key on disk, the key can also be specified via the `GITLAB_BACKUP_ENCRYPTION_KEY` your data.
- # encryption: 'AES256'
- # encryption_key: '<key>'
- #
- #
- # Turns on AWS Server-Side Encryption with Amazon S3-Managed keys (optional)
- # https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html
- # For SSE-S3, set 'server_side_encryption' to 'AES256'.
- # For SS3-KMS, set 'server_side_encryption' to 'aws:kms'. Set
- # 'server_side_encryption_kms_key_id' to the ARN of customer master key.
- # storage_options:
- # server_side_encryption: 'aws:kms'
- # server_side_encryption_kms_key_id: 'arn:aws:kms:YOUR-KEY-ID-HERE'
- ```
-
-1. [Restart GitLab](../administration/restart_gitlab.md#installations-from-source)
- for the changes to take effect
-
-If you're uploading your backups to S3, you should create a new
-IAM user with restricted access rights. To give the upload user access only for
-uploading backups create the following IAM profile, replacing `my.s3.bucket`
-with the name of your bucket:
-
-```json
-{
- "Version": "2012-10-17",
- "Statement": [
- {
- "Sid": "Stmt1412062044000",
- "Effect": "Allow",
- "Action": [
- "s3:AbortMultipartUpload",
- "s3:GetBucketAcl",
- "s3:GetBucketLocation",
- "s3:GetObject",
- "s3:GetObjectAcl",
- "s3:ListBucketMultipartUploads",
- "s3:PutObject",
- "s3:PutObjectAcl"
- ],
- "Resource": [
- "arn:aws:s3:::my.s3.bucket/*"
- ]
- },
- {
- "Sid": "Stmt1412062097000",
- "Effect": "Allow",
- "Action": [
- "s3:GetBucketLocation",
- "s3:ListAllMyBuckets"
- ],
- "Resource": [
- "*"
- ]
- },
- {
- "Sid": "Stmt1412062128000",
- "Effect": "Allow",
- "Action": [
- "s3:ListBucket"
- ],
- "Resource": [
- "arn:aws:s3:::my.s3.bucket"
- ]
- }
- ]
-}
-```
-
-#### Using Google Cloud Storage
-
-To use Google Cloud Storage to save backups, you must first create an
-access key from the Google console:
-
-1. Go to the [Google storage settings page](https://console.cloud.google.com/storage/settings).
-1. Select **Interoperability**, and then create an access key.
-1. Make note of the **Access Key** and **Secret** and replace them in the
- following configurations.
-1. In the buckets advanced settings ensure the Access Control option
- **Set object-level and bucket-level permissions** is selected.
-1. Ensure you have already created a bucket.
-
-For Omnibus GitLab packages:
-
-1. Edit `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- gitlab_rails['backup_upload_connection'] = {
- 'provider' => 'Google',
- 'google_storage_access_key_id' => 'Access Key',
- 'google_storage_secret_access_key' => 'Secret',
-
- ## If you have CNAME buckets (foo.example.com), you might run into SSL issues
- ## when uploading backups ("hostname foo.example.com.storage.googleapis.com
- ## does not match the server certificate"). In that case, uncomnent the following
- ## setting. See: https://github.com/fog/fog/issues/2834
- #'path_style' => true
- }
- gitlab_rails['backup_upload_remote_directory'] = 'my.google.bucket'
- ```
-
-1. [Reconfigure GitLab](../administration/restart_gitlab.md#reconfigure-a-linux-package-installation)
- for the changes to take effect
-
-For installations from source:
-
-1. Edit `home/git/gitlab/config/gitlab.yml`:
-
- ```yaml
- backup:
- upload:
- connection:
- provider: 'Google'
- google_storage_access_key_id: 'Access Key'
- google_storage_secret_access_key: 'Secret'
- remote_directory: 'my.google.bucket'
- ```
-
-1. [Restart GitLab](../administration/restart_gitlab.md#installations-from-source)
- for the changes to take effect
-
-#### Using Azure Blob storage
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/25877) in GitLab 13.4.
-
-For Omnibus GitLab packages:
-
-1. Edit `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- gitlab_rails['backup_upload_connection'] = {
- 'provider' => 'AzureRM',
- 'azure_storage_account_name' => '<AZURE STORAGE ACCOUNT NAME>',
- 'azure_storage_access_key' => '<AZURE STORAGE ACCESS KEY>',
- 'azure_storage_domain' => 'blob.core.windows.net', # Optional
- }
- gitlab_rails['backup_upload_remote_directory'] = '<AZURE BLOB CONTAINER>'
- ```
-
-1. [Reconfigure GitLab](../administration/restart_gitlab.md#reconfigure-a-linux-package-installation)
- for the changes to take effect
-
-For installations from source:
-
-1. Edit `home/git/gitlab/config/gitlab.yml`:
-
- ```yaml
- backup:
- upload:
- connection:
- provider: 'AzureRM'
- azure_storage_account_name: '<AZURE STORAGE ACCOUNT NAME>'
- azure_storage_access_key: '<AZURE STORAGE ACCESS KEY>'
- remote_directory: '<AZURE BLOB CONTAINER>'
- ```
-
-1. [Restart GitLab](../administration/restart_gitlab.md#installations-from-source)
- for the changes to take effect
-
-For more details, see the [table of Azure parameters](../administration/object_storage.md#azure-blob-storage).
-
-#### Specifying a custom directory for backups
-
-This option works only for remote storage. If you want to group your backups,
-you can pass a `DIRECTORY` environment variable:
-
-```shell
-sudo gitlab-backup create DIRECTORY=daily
-sudo gitlab-backup create DIRECTORY=weekly
-```
-
-Users of GitLab 12.1 and earlier should use the command `gitlab-rake gitlab:backup:create` instead.
-
-### Skip uploading backups to remote storage
-
-If you have configured GitLab to [upload backups in a remote storage](#upload-backups-to-a-remote-cloud-storage),
-you can use the `SKIP=remote` option to skip uploading your backups to the remote storage.
-
-For Omnibus GitLab packages:
-
-```shell
-sudo gitlab-backup create SKIP=remote
-```
-
-For installations from source:
-
-```shell
-sudo -u git -H bundle exec rake gitlab:backup:create SKIP=remote RAILS_ENV=production
-```
-
-### Upload to locally-mounted shares
-
-You can send backups to a locally-mounted share (for example, `NFS`,`CIFS`, or `SMB`) using the Fog
-[`Local`](https://github.com/fog/fog-local#usage) storage provider.
-
-To do this, you must set the following configuration keys:
-
-- `backup_upload_connection.local_root`: mounted directory that backups are copied to.
-- `backup_upload_remote_directory`: subdirectory of the `backup_upload_connection.local_root` directory. It is created if it doesn't exist.
- If you want to copy the tarballs to the root of your mounted directory, use `.`.
-
-When mounted, the directory set in the `local_root` key must be owned by either:
-
-- The `git` user. So, mounting with the `uid=` of the `git` user for `CIFS` and `SMB`.
-- The user that you are executing the backup tasks as. For Omnibus GitLab, this is the `git` user.
-
-Because file system performance may affect overall GitLab performance,
-[we don't recommend using cloud-based file systems for storage](../administration/nfs.md#avoid-using-cloud-based-file-systems).
-
-#### Avoid conflicting configuration
-
-Don't set the following configuration keys to the same path:
-
-- `gitlab_rails['backup_path']` (`backup.path` for source installations).
-- `gitlab_rails['backup_upload_connection'].local_root` (`backup.upload.connection.local_root` for source installations).
-
-The `backup_path` configuration key sets the local location of the backup file. The `upload` configuration key is
-intended for use when the backup file is uploaded to a separate server, perhaps for archival purposes.
-
-If these configuration keys are set to the same location, the upload feature fails because a backup already exists at
-the upload location. This failure causes the upload feature to delete the backup because it assumes it's a residual file
-remaining after the failed upload attempt.
-
-#### Configure uploads to locally-mounted shares
-
-For Omnibus GitLab packages:
-
-1. Edit `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- gitlab_rails['backup_upload_connection'] = {
- :provider => 'Local',
- :local_root => '/mnt/backups'
- }
-
- # The directory inside the mounted folder to copy backups to
- # Use '.' to store them in the root directory
- gitlab_rails['backup_upload_remote_directory'] = 'gitlab_backups'
- ```
-
-1. [Reconfigure GitLab](../administration/restart_gitlab.md#reconfigure-a-linux-package-installation)
- for the changes to take effect.
-
-For installations from source:
-
-1. Edit `home/git/gitlab/config/gitlab.yml`:
-
- ```yaml
- backup:
- upload:
- # Fog storage connection settings, see https://fog.io/storage/ .
- connection:
- provider: Local
- local_root: '/mnt/backups'
- # The directory inside the mounted folder to copy backups to
- # Use '.' to store them in the root directory
- remote_directory: 'gitlab_backups'
- ```
-
-1. [Restart GitLab](../administration/restart_gitlab.md#installations-from-source)
- for the changes to take effect.
-
-### Backup archive permissions
-
-The backup archives created by GitLab (`1393513186_2014_02_27_gitlab_backup.tar`)
-have the owner/group `git`/`git` and 0600 permissions by default. This is
-meant to avoid other system users reading GitLab data. If you need the backup
-archives to have different permissions, you can use the `archive_permissions`
-setting.
-
-For Omnibus GitLab packages:
-
-1. Edit `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- gitlab_rails['backup_archive_permissions'] = 0644 # Makes the backup archives world-readable
- ```
-
-1. [Reconfigure GitLab](../administration/restart_gitlab.md#reconfigure-a-linux-package-installation)
- for the changes to take effect.
-
-For installations from source:
-
-1. Edit `/home/git/gitlab/config/gitlab.yml`:
-
- ```yaml
- backup:
- archive_permissions: 0644 # Makes the backup archives world-readable
- ```
-
-1. [Restart GitLab](../administration/restart_gitlab.md#installations-from-source)
- for the changes to take effect.
-
-### Configuring cron to make daily backups
-
-WARNING:
-The following cron jobs do not [back up your GitLab configuration files](#storing-configuration-files)
-or [SSH host keys](https://superuser.com/questions/532040/copy-ssh-keys-from-one-server-to-another-server/532079#532079).
-
-You can schedule a cron job that backs up your repositories and GitLab metadata.
-
-For Omnibus GitLab packages:
-
-1. Edit the crontab for the `root` user:
-
- ```shell
- sudo su -
- crontab -e
- ```
-
-1. There, add the following line to schedule the backup for everyday at 2 AM:
-
- ```plaintext
- 0 2 * * * /opt/gitlab/bin/gitlab-backup create CRON=1
- ```
-
- Users of GitLab 12.1 and earlier should use the command `gitlab-rake gitlab:backup:create` instead.
-
-For installations from source:
-
-1. Edit the crontab for the `git` user:
-
- ```shell
- sudo -u git crontab -e
- ```
-
-1. Add the following lines at the bottom:
-
- ```plaintext
- # Create a full backup of the GitLab repositories and SQL database every day at 2am
- 0 2 * * * cd /home/git/gitlab && PATH=/usr/local/bin:/usr/bin:/bin bundle exec rake gitlab:backup:create RAILS_ENV=production CRON=1
- ```
-
-The `CRON=1` environment setting directs the backup script to hide all progress
-output if there aren't any errors. This is recommended to reduce cron spam.
-When troubleshooting backup problems, however, replace `CRON=1` with `--trace` to log verbosely.
-
-## Limit backup lifetime for local files (prune old backups)
-
-WARNING:
-The process described in this section doesn't work if you used a [custom filename](#backup-filename)
-for your backups.
-
-To prevent regular backups from using all your disk space, you may want to set a limited lifetime
-for backups. The next time the backup task runs, backups older than the `backup_keep_time` are
-pruned.
-
-This configuration option manages only local files. GitLab doesn't prune old
-files stored in a third-party [object storage](#upload-backups-to-a-remote-cloud-storage)
-because the user may not have permission to list and delete files. It's
-recommended that you configure the appropriate retention policy for your object
-storage (for example, [AWS S3](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-lifecycle.html)).
-
-For Omnibus GitLab packages:
-
-1. Edit `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- ## Limit backup lifetime to 7 days - 604800 seconds
- gitlab_rails['backup_keep_time'] = 604800
- ```
-
-1. [Reconfigure GitLab](../administration/restart_gitlab.md#reconfigure-a-linux-package-installation)
- for the changes to take effect.
-
-For installations from source:
-
-1. Edit `/home/git/gitlab/config/gitlab.yml`:
-
- ```yaml
- backup:
- ## Limit backup lifetime to 7 days - 604800 seconds
- keep_time: 604800
- ```
-
-1. [Restart GitLab](../administration/restart_gitlab.md#installations-from-source)
- for the changes to take effect.
+<!-- This redirect file can be deleted after <2023-09-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 (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/raketasks/backup_restore.md b/doc/raketasks/backup_restore.md
index 1fd772c06da..97cafefb45d 100644
--- a/doc/raketasks/backup_restore.md
+++ b/doc/raketasks/backup_restore.md
@@ -2,1093 +2,13 @@
stage: Systems
group: Geo
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+redirect_to: '../administration/backup_restore/index.md'
+remove_date: '2023-09-26'
---
-# Back up and restore GitLab **(FREE SELF)**
+This document was moved to [another location](../administration/backup_restore/index.md).
-GitLab provides Rake tasks for backing up and restoring GitLab instances.
-
-An application data backup creates an archive file that contains the database,
-all repositories and all attachments.
-
-You can only restore a backup to **exactly the same version and type (CE/EE)**
-of GitLab on which it was created. The best way to
-[migrate your projects from one server to another](#migrate-to-a-new-server) is through a backup and restore.
-
-WARNING:
-GitLab doesn't back up items that aren't stored on the file system. If you're
-using [object storage](../administration/object_storage.md), be sure to enable
-backups with your object storage provider, if desired.
-
-## Requirements
-
-To be able to back up and restore, ensure that Rsync is installed on your
-system. If you installed GitLab:
-
-- _Using the Omnibus package_, Rsync is already installed.
-- _From source_, check if `rsync` is installed. If Rsync is not installed, install it. For example:
-
- ```shell
- # Debian/Ubuntu
- sudo apt-get install rsync
-
- # RHEL/CentOS
- sudo yum install rsync
- ```
-
-### `gitaly-backup` for repository backup and restore
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/333034) in GitLab 14.2.
-> - [Deployed behind a feature flag](../user/feature_flags.md), enabled by default.
-> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/333034) in GitLab 14.10. [Feature flag `gitaly_backup`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83254) removed.
-
-The `gitaly-backup` binary is used by the backup Rake task to create and restore repository backups from Gitaly.
-`gitaly-backup` replaces the previous backup method that directly calls RPCs on Gitaly from GitLab.
-
-The backup Rake task must be able to find this executable. In most cases, you don't need to change
-the path to the binary as it should work fine with the default path `/opt/gitlab/embedded/bin/gitaly-backup`.
-If you have a specific reason to change the path, it can be configured in Omnibus GitLab packages:
-
-1. Add the following to `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- gitlab_rails['backup_gitaly_backup_path'] = '/path/to/gitaly-backup'
- ```
-
-1. [Reconfigure GitLab](../administration/restart_gitlab.md#reconfigure-a-linux-package-installation)
- for the changes to take effect.
-
-## Backup timestamp
-
-The backup archive is saved in `backup_path`, which is specified in the
-`config/gitlab.yml` file. The filename is `[TIMESTAMP]_gitlab_backup.tar`,
-where `TIMESTAMP` identifies the time at which each backup was created, plus
-the GitLab version. The timestamp is needed if you need to restore GitLab and
-multiple backups are available.
-
-For example, if the backup name is `1493107454_2018_04_25_10.6.4-ce_gitlab_backup.tar`,
-the timestamp is `1493107454_2018_04_25_10.6.4-ce`.
-
-## Back up GitLab
-
-For detailed information on backing up GitLab, see [Backup GitLab](backup_gitlab.md).
-
-## Restore GitLab
-
-For detailed information on restoring GitLab, see [Restore GitLab](restore_gitlab.md).
-
-## Alternative backup strategies
-
-In the following cases, consider using file system data transfer or snapshots as part of your backup strategy:
-
-- Your GitLab instance contains a lot of Git repository data and the GitLab backup script is too slow.
-- Your GitLab instance has a lot of forked projects and the regular backup task duplicates the Git data for all of them.
-- Your GitLab instance has a problem and using the regular backup and import Rake tasks isn't possible.
-
-WARNING:
-Gitaly Cluster [does not support snapshot backups](../administration/gitaly/index.md#snapshot-backup-and-recovery-limitations).
-
-When considering using file system data transfer or snapshots:
-
-- Don't use these methods to migrate from one operating system to another. The operating systems of the source and destination should be as similar as possible. For example,
- don't use these methods to migrate from Ubuntu to Fedora.
-- Data consistency is very important. We recommend stopping GitLab with `sudo gitlab-ctl stop` before taking doing a file system transfer (with rsync, for example) or taking a
- snapshot.
-
-Example: Amazon Elastic Block Store (EBS)
-
-> A GitLab server using Omnibus GitLab hosted on Amazon AWS.
-> An EBS drive containing an ext4 file system is mounted at `/var/opt/gitlab`.
-> In this case you could make an application backup by taking an EBS snapshot.
-> The backup includes all repositories, uploads and PostgreSQL data.
-
-Example: Logical Volume Manager (LVM) snapshots + rsync
-
-> A GitLab server using Omnibus GitLab, with an LVM logical volume mounted at `/var/opt/gitlab`.
-> Replicating the `/var/opt/gitlab` directory using rsync would not be reliable because too many files would change while rsync is running.
-> Instead of rsync-ing `/var/opt/gitlab`, we create a temporary LVM snapshot, which we mount as a read-only file system at `/mnt/gitlab_backup`.
-> Now we can have a longer running rsync job which creates a consistent replica on the remote server.
-> The replica includes all repositories, uploads and PostgreSQL data.
-
-If you're running GitLab on a virtualized server, you can possibly also create
-VM snapshots of the entire GitLab server. It's not uncommon however for a VM
-snapshot to require you to power down the server, which limits this solution's
-practical use.
-
-### Back up repository data separately
-
-First, ensure you back up existing GitLab data while [skipping repositories](backup_gitlab.md#excluding-specific-directories-from-the-backup):
-
-```shell
-# for Omnibus GitLab package installations
-sudo gitlab-backup create SKIP=repositories
-
-# for installations from source:
-sudo -u git -H bundle exec rake gitlab:backup:create SKIP=repositories RAILS_ENV=production
-```
-
-For manually backing up the Git repository data on disk, there are multiple possible strategies:
-
-- Use snapshots, such as the previous examples of Amazon EBS drive snapshots, or LVM snapshots + rsync.
-- Use [GitLab Geo](../administration/geo/index.md) and rely on the repository data on a Geo secondary site.
-- [Prevent writes and copy the Git repository data](#prevent-writes-and-copy-the-git-repository-data).
-- [Create an online backup by marking repositories as read-only (experimental)](#online-backup-through-marking-repositories-as-read-only-experimental).
-
-#### Prevent writes and copy the Git repository data
-
-Git repositories must be copied in a consistent way. They should not be copied during concurrent write
-operations, as this can lead to inconsistencies or corruption issues. For more details,
-[issue #270422](https://gitlab.com/gitlab-org/gitlab/-/issues/270422 "Provide documentation on preferred method of migrating Gitaly servers")
-has a longer discussion explaining the potential problems.
-
-To prevent writes to the Git repository data, there are two possible approaches:
-
-- Use [maintenance mode](../administration/maintenance_mode/index.md) to place GitLab in a read-only state.
-- Create explicit downtime by stopping all Gitaly services before backing up the repositories:
-
- ```shell
- sudo gitlab-ctl stop gitaly
- # execute git data copy step
- sudo gitlab-ctl start gitaly
- ```
-
-You can copy Git repository data using any method, as long as writes are prevented on the data being copied
-(to prevent inconsistencies and corruption issues). In order of preference and safety, the recommended methods are:
-
-1. Use `rsync` with archive-mode, delete, and checksum options, for example:
-
- ```shell
- rsync -aR --delete --checksum source destination # be extra safe with the order as it will delete existing data if inverted
- ```
-
-1. Use a [`tar` pipe to copy the entire repository's directory to another server or location](../administration/operations/moving_repositories.md#tar-pipe-to-another-server).
-
-1. Use `sftp`, `scp`, `cp`, or any other copying method.
-
-#### Online backup through marking repositories as read-only (experimental)
-
-One way of backing up repositories without requiring instance-wide downtime
-is to programmatically mark projects as read-only while copying the underlying data.
-
-There are a few possible downsides to this:
-
-- Repositories are read-only for a period of time that scales with the size of the repository.
-- Backups take a longer time to complete due to marking each project as read-only, potentially leading to inconsistencies. For example,
- a possible date discrepancy between the last data available for the first project that gets backed up compared to
- the last project that gets backed up.
-- Fork networks should be entirely read-only while the projects inside get backed up to prevent potential changes to the pool repository.
-
-There is an **experimental** script that attempts to automate this process in
-[the Geo team Runbooks project](https://gitlab.com/gitlab-org/geo-team/runbooks/-/tree/main/experimental-online-backup-through-rsync).
-
-## Back up and restore for installations using PgBouncer
-
-Do not back up or restore GitLab through a PgBouncer connection. These
-tasks must [bypass PgBouncer and connect directly to the PostgreSQL primary database node](#bypassing-pgbouncer),
-or they cause a GitLab outage.
-
-When the GitLab backup or restore task is used with PgBouncer, the
-following error message is shown:
-
-```ruby
-ActiveRecord::StatementInvalid: PG::UndefinedTable
-```
-
-Each time the GitLab backup runs, GitLab starts generating 500 errors and errors about missing
-tables will [be logged by PostgreSQL](../administration/logs/index.md#postgresql-logs):
-
-```plaintext
-ERROR: relation "tablename" does not exist at character 123
-```
-
-This happens because the task uses `pg_dump`, which
-[sets a null search path and explicitly includes the schema in every SQL query](https://gitlab.com/gitlab-org/gitlab/-/issues/23211)
-to address [CVE-2018-1058](https://www.postgresql.org/about/news/postgresql-103-968-9512-9417-and-9322-released-1834/).
-
-Since connections are reused with PgBouncer in transaction pooling mode,
-PostgreSQL fails to search the default `public` schema. As a result,
-this clearing of the search path causes tables and columns to appear
-missing.
-
-### Bypassing PgBouncer
-
-There are two ways to fix this:
-
-1. [Use environment variables to override the database settings](#environment-variable-overrides) for the backup task.
-1. Reconfigure a node to [connect directly to the PostgreSQL primary database node](../administration/postgresql/pgbouncer.md#procedure-for-bypassing-pgbouncer).
-
-#### Environment variable overrides
-
-By default, GitLab uses the database configuration stored in a
-configuration file (`database.yml`). However, you can override the database settings
-for the backup and restore task by setting environment
-variables that are prefixed with `GITLAB_BACKUP_`:
-
-- `GITLAB_BACKUP_PGHOST`
-- `GITLAB_BACKUP_PGUSER`
-- `GITLAB_BACKUP_PGPORT`
-- `GITLAB_BACKUP_PGPASSWORD`
-- `GITLAB_BACKUP_PGSSLMODE`
-- `GITLAB_BACKUP_PGSSLKEY`
-- `GITLAB_BACKUP_PGSSLCERT`
-- `GITLAB_BACKUP_PGSSLROOTCERT`
-- `GITLAB_BACKUP_PGSSLCRL`
-- `GITLAB_BACKUP_PGSSLCOMPRESSION`
-
-For example, to override the database host and port to use 192.168.1.10
-and port 5432 with the Omnibus package:
-
-```shell
-sudo GITLAB_BACKUP_PGHOST=192.168.1.10 GITLAB_BACKUP_PGPORT=5432 /opt/gitlab/bin/gitlab-backup create
-```
-
-See the [PostgreSQL documentation](https://www.postgresql.org/docs/12/libpq-envars.html)
-for more details on what these parameters do.
-
-## Migrate to a new server
-
-<!-- some details borrowed from GitLab.com move from Azure to GCP detailed at https://gitlab.com/gitlab-com/migration/-/blob/master/.gitlab/issue_templates/failover.md -->
-
-You can use GitLab backup and restore to migrate your instance to a new server. This section outlines a typical procedure for a GitLab deployment running on a single server.
-If you're running GitLab Geo, an alternative option is [Geo disaster recovery for planned failover](../administration/geo/disaster_recovery/planned_failover.md).
-
-WARNING:
-Avoid uncoordinated data processing by both the new and old servers, where multiple
-servers could connect concurrently and process the same data. For example, when using
-[incoming email](../administration/incoming_email.md), if both GitLab instances are
-processing email at the same time, then both instances miss some data.
-This type of problem can occur with other services as well, such as a
-[non-packaged database](https://docs.gitlab.com/omnibus/settings/database.html#using-a-non-packaged-postgresql-database-management-server),
-a non-packaged Redis instance, or non-packaged Sidekiq.
-
-Prerequisites:
-
-- Some time before your migration, consider notifying your users of upcoming
- scheduled maintenance with a [broadcast message banner](../user/admin_area/broadcast_messages.md).
-- Ensure your backups are complete and current. Create a complete system-level backup, or
- take a snapshot of all servers involved in the migration, in case destructive commands
- (like `rm`) are run incorrectly.
-
-### Prepare the new server
-
-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.
- 1. Configure by copying `/etc/gitlab` files from the old server to the new server, and update as necessary.
- Read the
- [Omnibus configuration backup and restore instructions](https://docs.gitlab.com/omnibus/settings/backups.html) for more detail.
- 1. If applicable, disable [incoming email](../administration/incoming_email.md).
- 1. Block new CI/CD jobs from starting upon initial startup after the backup and restore.
- Edit `/etc/gitlab/gitlab.rb` and set the following:
-
- ```ruby
- nginx['custom_gitlab_server_config'] = "location = /api/v4/jobs/request {\n deny all;\n return 503;\n }\n"
- ```
-
- 1. Reconfigure GitLab:
-
- ```shell
- sudo gitlab-ctl reconfigure
- ```
-
-1. Stop GitLab to avoid any potential unnecessary and unintentional data processing:
-
- ```shell
- sudo gitlab-ctl stop
- ```
-
-1. Configure the new server to allow receiving the Redis database and GitLab backup files:
-
- ```shell
- sudo rm -f /var/opt/gitlab/redis/dump.rdb
- sudo chown <your-linux-username> /var/opt/gitlab/redis /var/opt/gitlab/backups
- ```
-
-### Prepare and transfer content from the old server
-
-1. Ensure you have an up-to-date system-level backup or snapshot of the old server.
-1. Enable [maintenance mode](../administration/maintenance_mode/index.md),
- if supported by your GitLab edition.
-1. Block new CI/CD jobs from starting:
- 1. Edit `/etc/gitlab/gitlab.rb`, and set the following:
-
- ```ruby
- nginx['custom_gitlab_server_config'] = "location = /api/v4/jobs/request {\n deny all;\n return 503;\n }\n"
- ```
-
- 1. Reconfigure GitLab:
-
- ```shell
- sudo gitlab-ctl reconfigure
- ```
-
-1. Disable periodic background jobs:
- 1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
- 1. Select **Admin Area**.
- 1. On the left sidebar, select **Monitoring > Background Jobs**.
- 1. Under the Sidekiq dashboard, select **Cron** tab and then
- **Disable All**.
-1. Wait for the currently running CI/CD jobs to finish, or accept that jobs that have not completed may be lost.
- To view jobs currently running, on the left sidebar, select **Overviews > Jobs**,
- and then select **Running**.
-1. Wait for Sidekiq jobs to finish:
- 1. On the left sidebar, select **Monitoring > Background Jobs**.
- 1. Under the Sidekiq dashboard, select **Queues** and then **Live Poll**.
- Wait for **Busy** and **Enqueued** to drop to 0.
- These queues contain work that has been submitted by your users;
- shutting down before these jobs complete may cause the work to be lost.
- Make note of the numbers shown in the Sidekiq dashboard for post-migration verification.
-1. Flush the Redis database to disk, and stop GitLab other than the services needed for migration:
-
- ```shell
- sudo /opt/gitlab/embedded/bin/redis-cli -s /var/opt/gitlab/redis/redis.socket save && sudo gitlab-ctl stop && sudo gitlab-ctl start postgresql && sudo gitlab-ctl start gitaly
- ```
-
-1. Create a GitLab backup:
-
- ```shell
- sudo gitlab-backup create
- ```
-
-1. Disable the following GitLab services and prevent unintentional restarts by adding the following to the bottom of `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- alertmanager['enable'] = false
- gitlab_exporter['enable'] = false
- gitlab_pages['enable'] = false
- gitlab_workhorse['enable'] = false
- grafana['enable'] = false
- logrotate['enable'] = false
- gitlab_rails['incoming_email_enabled'] = false
- nginx['enable'] = false
- node_exporter['enable'] = false
- postgres_exporter['enable'] = false
- postgresql['enable'] = false
- prometheus['enable'] = false
- puma['enable'] = false
- redis['enable'] = false
- redis_exporter['enable'] = false
- registry['enable'] = false
- sidekiq['enable'] = false
- ```
-
-1. Reconfigure GitLab:
-
- ```shell
- sudo gitlab-ctl reconfigure
- ```
-
-1. Verify everything is stopped, and confirm no services are running:
-
- ```shell
- sudo gitlab-ctl status
- ```
-
-1. Transfer the Redis database and GitLab backups to the new server:
-
- ```shell
- sudo scp /var/opt/gitlab/redis/dump.rdb <your-linux-username>@new-server:/var/opt/gitlab/redis
- sudo scp /var/opt/gitlab/backups/your-backup.tar <your-linux-username>@new-server:/var/opt/gitlab/backups
- ```
-
-### Restore data on the new server
-
-1. Restore appropriate file system permissions:
-
- ```shell
- sudo chown gitlab-redis /var/opt/gitlab/redis
- sudo chown gitlab-redis:gitlab-redis /var/opt/gitlab/redis/dump.rdb
- sudo chown git:root /var/opt/gitlab/backups
- sudo chown git:git /var/opt/gitlab/backups/your-backup.tar
- ```
-
-1. [Restore the GitLab backup](#restore-gitlab).
-1. Verify that the Redis database restored correctly:
- 1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
- 1. Select **Admin Area**.
- 1. On the left sidebar, select **Monitoring > Background Jobs**.
- 1. Under the Sidekiq dashboard, verify that the numbers
- match with what was shown on the old server.
- 1. While still under the Sidekiq dashboard, select **Cron** and then **Enable All**
- to re-enable periodic background jobs.
-1. Test that read-only operations on the GitLab instance work as expected. For example, browse through project repository files, merge requests, and issues.
-1. Disable [Maintenance Mode](../administration/maintenance_mode/index.md), if previously enabled.
-1. Test that the GitLab instance is working as expected.
-1. If applicable, re-enable [incoming email](../administration/incoming_email.md) and test it is working as expected.
-1. Update your DNS or load balancer to point at the new server.
-1. Unblock new CI/CD jobs from starting by removing the custom NGINX configuration
- you added previously:
-
- ```ruby
- # The following line must be removed
- nginx['custom_gitlab_server_config'] = "location = /api/v4/jobs/request {\n deny all;\n return 503;\n }\n"
- ```
-
-1. Reconfigure GitLab:
-
- ```shell
- sudo gitlab-ctl reconfigure
- ```
-
-1. Remove the scheduled maintenance [broadcast message banner](../user/admin_area/broadcast_messages.md).
-
-## Additional notes
-
-This documentation is for GitLab Community and Enterprise Edition. We back up
-GitLab.com and ensure your data is secure. You can't, however, use these
-methods to export or back up your data yourself from GitLab.com.
-
-Issues are stored in the database, and can't be stored in Git itself.
-
-To migrate your repositories from one server to another with an up-to-date
-version of GitLab, use the [import Rake task](import.md) to do a mass import of
-the repository. If you do an import Rake task rather than a backup restore,
-you get all of your repositories, but no other data.
-
-## Troubleshooting
-
-The following are possible problems you might encounter, along with potential
-solutions.
-
-### Restoring database backup using Omnibus packages outputs warnings
-
-If you're using backup restore procedures, you may encounter the following
-warning messages:
-
-```plaintext
-ERROR: must be owner of extension pg_trgm
-ERROR: must be owner of extension btree_gist
-ERROR: must be owner of extension plpgsql
-WARNING: no privileges could be revoked for "public" (two occurrences)
-WARNING: no privileges were granted for "public" (two occurrences)
-```
-
-Be advised that the backup is successfully restored in spite of these warning
-messages.
-
-The Rake task runs this as the `gitlab` user, which doesn't have superuser
-access to the database. When restore is initiated, it also runs as the `gitlab`
-user, but it also tries to alter the objects it doesn't have access to.
-Those objects have no influence on the database backup or restore, but display
-a warning message.
-
-For more information, see:
-
-- PostgreSQL issue tracker:
- - [Not being a superuser](https://www.postgresql.org/message-id/201110220712.30886.adrian.klaver@gmail.com).
- - [Having different owners](https://www.postgresql.org/message-id/2039.1177339749@sss.pgh.pa.us).
-
-- Stack Overflow: [Resulting errors](https://stackoverflow.com/questions/4368789/error-must-be-owner-of-language-plpgsql).
-
-### When the secrets file is lost
-
-If you didn't [back up the secrets file](backup_gitlab.md#storing-configuration-files), you
-must complete several steps to get GitLab working properly again.
-
-The secrets file is responsible for storing the encryption key for the columns
-that contain required, sensitive information. If the key is lost, GitLab can't
-decrypt those columns, preventing access to the following items:
-
-- [CI/CD variables](../ci/variables/index.md)
-- [Kubernetes / GCP integration](../user/infrastructure/clusters/index.md)
-- [Custom Pages domains](../user/project/pages/custom_domains_ssl_tls_certification/index.md)
-- [Project error tracking](../operations/error_tracking.md)
-- [Runner authentication](../ci/runners/index.md)
-- [Project mirroring](../user/project/repository/mirror/index.md)
-- [Integrations](../user/project/integrations/index.md)
-- [Web hooks](../user/project/integrations/webhooks.md)
-
-In cases like CI/CD variables and runner authentication, you can experience
-unexpected behaviors, such as:
-
-- Stuck jobs.
-- 500 errors.
-
-In this case, you must reset all the tokens for CI/CD variables and
-runner authentication, which is described in more detail in the following
-sections. After resetting the tokens, you should be able to visit your project
-and the jobs begin running again.
-
-Use the information in the following sections at your own risk.
-
-#### Verify that all values can be decrypted
-
-You can determine if your database contains values that can't be decrypted by using a
-[Rake task](../administration/raketasks/check.md#verify-database-values-can-be-decrypted-using-the-current-secrets).
-
-#### Take a backup
-
-You must directly modify GitLab data to work around your lost secrets file.
-
-WARNING:
-Be sure to create a full database backup before attempting any changes.
-
-#### Disable user two-factor authentication (2FA)
-
-Users with 2FA enabled can't sign in to GitLab. In that case, you must
-[disable 2FA for everyone](../security/two_factor_authentication.md#for-all-users),
-after which users must reactivate 2FA.
-
-#### Reset CI/CD variables
-
-1. Enter the database console:
-
- For Omnibus GitLab 14.1 and earlier:
-
- ```shell
- sudo gitlab-rails dbconsole
- ```
-
- For Omnibus GitLab 14.2 and later:
-
- ```shell
- sudo gitlab-rails dbconsole --database main
- ```
-
- For installations from source, GitLab 14.1 and earlier:
-
- ```shell
- sudo -u git -H bundle exec rails dbconsole -e production
- ```
-
- For installations from source, GitLab 14.2 and later:
-
- ```shell
- sudo -u git -H bundle exec rails dbconsole -e production --database main
- ```
-
-1. Examine the `ci_group_variables` and `ci_variables` tables:
-
- ```sql
- SELECT * FROM public."ci_group_variables";
- SELECT * FROM public."ci_variables";
- ```
-
- These are the variables that you need to delete.
-
-1. Delete all variables:
-
- ```sql
- DELETE FROM ci_group_variables;
- DELETE FROM ci_variables;
- ```
-
-1. If you know the specific group or project from which you wish to delete variables, you can include a `WHERE` statement to specify that in your `DELETE`:
-
- ```sql
- DELETE FROM ci_group_variables WHERE group_id = <GROUPID>;
- DELETE FROM ci_variables WHERE project_id = <PROJECTID>;
- ```
-
-You may need to reconfigure or restart GitLab for the changes to take effect.
-
-#### Reset runner registration tokens
-
-1. Enter the database console:
-
- For Omnibus GitLab 14.1 and earlier:
-
- ```shell
- sudo gitlab-rails dbconsole
- ```
-
- For Omnibus GitLab 14.2 and later:
-
- ```shell
- sudo gitlab-rails dbconsole --database main
- ```
-
- For installations from source, GitLab 14.1 and earlier:
-
- ```shell
- sudo -u git -H bundle exec rails dbconsole -e production
- ```
-
- For installations from source, GitLab 14.2 and later:
-
- ```shell
- sudo -u git -H bundle exec rails dbconsole -e production --database main
- ```
-
-1. Clear all tokens for projects, groups, and the entire instance:
-
- WARNING:
- The final `UPDATE` operation stops the runners from being able to pick
- up new jobs. You must register new runners.
-
- ```sql
- -- Clear project tokens
- UPDATE projects SET runners_token = null, runners_token_encrypted = null;
- -- Clear group tokens
- UPDATE namespaces SET runners_token = null, runners_token_encrypted = null;
- -- Clear instance tokens
- UPDATE application_settings SET runners_registration_token_encrypted = null;
- -- Clear key used for JWT authentication
- -- This may break the $CI_JWT_TOKEN job variable:
- -- https://gitlab.com/gitlab-org/gitlab/-/issues/325965
- UPDATE application_settings SET encrypted_ci_jwt_signing_key = null;
- -- Clear runner tokens
- UPDATE ci_runners SET token = null, token_encrypted = null;
- ```
-
-#### Reset pending pipeline jobs
-
-1. Enter the database console:
-
- For Omnibus GitLab 14.1 and earlier:
-
- ```shell
- sudo gitlab-rails dbconsole
- ```
-
- For Omnibus GitLab 14.2 and later:
-
- ```shell
- sudo gitlab-rails dbconsole --database main
- ```
-
- For installations from source, GitLab 14.1 and earlier:
-
- ```shell
- sudo -u git -H bundle exec rails dbconsole -e production
- ```
-
- For installations from source, GitLab 14.2 and later:
-
- ```shell
- sudo -u git -H bundle exec rails dbconsole -e production --database main
- ```
-
-1. Clear all the tokens for pending jobs:
-
- For GitLab 15.3 and earlier:
-
- ```sql
- -- Clear build tokens
- UPDATE ci_builds SET token = null, token_encrypted = null;
- ```
-
- For GitLab 15.4 and later:
-
- ```sql
- -- Clear build tokens
- UPDATE ci_builds SET token_encrypted = null;
- ```
-
-A similar strategy can be employed for the remaining features. By removing the
-data that can't be decrypted, GitLab can be returned to operation, and the
-lost data can be manually replaced.
-
-#### Fix integrations and webhooks
-
-If you've lost your secrets, the [integrations settings pages](../user/project/integrations/index.md)
-and [webhooks settings pages](../user/project/integrations/webhooks.md) are probably displaying `500` error messages.
-
-The fix is to truncate the affected tables (those containing encrypted columns).
-This deletes all your configured integrations, webhooks, and related metadata.
-You should verify that the secrets are the root cause before deleting any data.
-
-1. Enter the database console:
-
- For Omnibus GitLab 14.1 and earlier:
-
- ```shell
- sudo gitlab-rails dbconsole
- ```
-
- For Omnibus GitLab 14.2 and later:
-
- ```shell
- sudo gitlab-rails dbconsole --database main
- ```
-
- For installations from source, GitLab 14.1 and earlier:
-
- ```shell
- sudo -u git -H bundle exec rails dbconsole -e production
- ```
-
- For installations from source, GitLab 14.2 and later:
-
- ```shell
- sudo -u git -H bundle exec rails dbconsole -e production --database main
- ```
-
-1. Truncate the following tables:
-
- ```sql
- -- truncate web_hooks table
- TRUNCATE integrations, chat_names, issue_tracker_data, jira_tracker_data, slack_integrations, web_hooks, zentao_tracker_data, web_hook_logs;
- ```
-
-### Container Registry push failures after restoring from a backup
-
-If you use the [Container Registry](../user/packages/container_registry/index.md),
-pushes to the registry may fail after restoring your backup on an Omnibus GitLab
-instance after restoring the registry data.
-
-These failures mention permission issues in the registry logs, similar to:
-
-```plaintext
-level=error
-msg="response completed with error"
-err.code=unknown
-err.detail="filesystem: mkdir /var/opt/gitlab/gitlab-rails/shared/registry/docker/registry/v2/repositories/...: permission denied"
-err.message="unknown error"
-```
-
-This issue is caused by the restore running as the unprivileged user `git`,
-which is unable to assign the correct ownership to the registry files during
-the restore process ([issue #62759](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/62759 "Incorrect permissions on registry filesystem after restore")).
-
-To get your registry working again:
-
-```shell
-sudo chown -R registry:registry /var/opt/gitlab/gitlab-rails/shared/registry/docker
-```
-
-If you changed the default file system location for the registry, run `chown`
-against your custom location, instead of `/var/opt/gitlab/gitlab-rails/shared/registry/docker`.
-
-### Backup fails to complete with Gzip error
-
-When running the backup, you may receive a Gzip error message:
-
-```shell
-sudo /opt/gitlab/bin/gitlab-backup create
-...
-Dumping ...
-...
-gzip: stdout: Input/output error
-
-Backup failed
-```
-
-If this happens, examine the following:
-
-- Confirm there is sufficient disk space for the Gzip operation. It's not uncommon for backups that
- use the [default strategy](backup_gitlab.md#backup-strategy-option) to require half the instance size
- in free disk space during backup creation.
-- If NFS is being used, check if the mount option `timeout` is set. The
- default is `600`, and changing this to smaller values results in this error.
-
-### Backup fails with `File name too long` error
-
-During backup, you can get the `File name too long` error ([issue #354984](https://gitlab.com/gitlab-org/gitlab/-/issues/354984)). For example:
-
-```plaintext
-Problem: <class 'OSError: [Errno 36] File name too long:
-```
-
-This problem stops the backup script from completing. To fix this problem, you must truncate the filenames causing the problem. A maximum of 246 characters, including the file extension, is permitted.
-
-WARNING:
-The steps in this section can potentially lead to **data loss**. All steps must be followed strictly in the order given.
-
-Truncating filenames to resolve the error involves:
-
-- Cleaning up remote uploaded files that aren't tracked in the database.
-- Truncating the filenames in the database.
-- Rerunning the backup task.
-
-#### Clean up remote uploaded files
-
-A [known issue](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/45425) caused object store uploads to remain after a parent resource was deleted. This issue was [resolved](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/18698).
-
-To fix these files, you must clean up all remote uploaded files that are in the storage but not tracked in the `uploads` database table.
-
-1. List all the object store upload files that can be moved to a lost and found directory if they don't exist in the GitLab database:
-
- ```shell
- bundle exec rake gitlab:cleanup:remote_upload_files RAILS_ENV=production
- ```
-
-1. If you are sure you want to delete these files and remove all non-referenced uploaded files, run:
-
- WARNING:
- The following action is **irreversible**.
-
- ```shell
- bundle exec rake gitlab:cleanup:remote_upload_files RAILS_ENV=production DRY_RUN=false
- ```
-
-#### Truncate the filenames referenced by the database
-
-You must truncate the files referenced by the database that are causing the problem. The filenames referenced by the database are stored:
-
-- In the `uploads` table.
-- In the references found. Any reference found from other database tables and columns.
-- On the file system.
-
-Truncate the filenames in the `uploads` table:
-
-1. Enter the database console:
-
- For Omnibus GitLab 14.2 and later:
-
- ```shell
- sudo gitlab-rails dbconsole --database main
- ```
-
- For Omnibus GitLab 14.1 and earlier:
-
- ```shell
- sudo gitlab-rails dbconsole
- ```
-
- For installations from source, GitLab 14.2 and later:
-
- ```shell
- sudo -u git -H bundle exec rails dbconsole -e production --database main
- ```
-
- For installations from source, GitLab 14.1 and earlier:
-
- ```shell
- sudo -u git -H bundle exec rails dbconsole -e production
- ```
-
-1. Search the `uploads` table for filenames longer than 246 characters:
-
- The following query selects the `uploads` records with filenames longer than 246 characters in batches of 0 to 10000. This improves the performance on large GitLab instances with tables having thousand of records.
-
- ```sql
- CREATE TEMP TABLE uploads_with_long_filenames AS
- SELECT ROW_NUMBER() OVER(ORDER BY id) row_id, id, path
- FROM uploads AS u
- WHERE LENGTH((regexp_match(u.path, '[^\\/:*?"<>|\r\n]+$'))[1]) > 246;
-
- CREATE INDEX ON uploads_with_long_filenames(row_id);
-
- SELECT
- u.id,
- u.path,
- -- Current filename
- (regexp_match(u.path, '[^\\/:*?"<>|\r\n]+$'))[1] AS current_filename,
- -- New filename
- CONCAT(
- LEFT(SPLIT_PART((regexp_match(u.path, '[^\\/:*?"<>|\r\n]+$'))[1], '.', 1), 242),
- COALESCE(SUBSTRING((regexp_match(u.path, '[^\\/:*?"<>|\r\n]+$'))[1] FROM '\.(?:.(?!\.))+$'))
- ) AS new_filename,
- -- New path
- CONCAT(
- COALESCE((regexp_match(u.path, '(.*\/).*'))[1], ''),
- CONCAT(
- LEFT(SPLIT_PART((regexp_match(u.path, '[^\\/:*?"<>|\r\n]+$'))[1], '.', 1), 242),
- COALESCE(SUBSTRING((regexp_match(u.path, '[^\\/:*?"<>|\r\n]+$'))[1] FROM '\.(?:.(?!\.))+$'))
- )
- ) AS new_path
- FROM uploads_with_long_filenames AS u
- WHERE u.row_id > 0 AND u.row_id <= 10000;
- ```
-
- Output example:
-
- ```postgresql
- -[ RECORD 1 ]----+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- id | 34
- path | public/@hashed/loremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididuntutlaboreetdoloremagnaaliquaauctorelitsedvulputatemisitloremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididuntutlaboreetdoloremagnaaliquaauctorelitsedvulputatemisit.txt
- current_filename | loremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididuntutlaboreetdoloremagnaaliquaauctorelitsedvulputatemisitloremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididuntutlaboreetdoloremagnaaliquaauctorelitsedvulputatemisit.txt
- new_filename | loremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididuntutlaboreetdoloremagnaaliquaauctorelitsedvulputatemisitloremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididuntutlaboreetdoloremagnaaliquaauctorelits.txt
- new_path | public/@hashed/loremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididuntutlaboreetdoloremagnaaliquaauctorelitsedvulputatemisitloremipsumdolorsitametconsecteturadipiscingelitseddoeiusmodtemporincididuntutlaboreetdoloremagnaaliquaauctorelits.txt
- ```
-
- Where:
-
- - `current_filename`: a filename that is currently more than 246 characters long.
- - `new_filename`: a filename that has been truncated to 246 characters maximum.
- - `new_path`: new path considering the `new_filename` (truncated).
-
- Once you validate the batch results, you must change the batch size (`row_id`) using the following sequence of numbers (10000 to 20000). Repeat this process until you reach the last record in the `uploads` table.
-
-1. Rename the files found in the `uploads` table from long filenames to new truncated filenames. The following query rolls back the update so you can check the results safely within a transaction wrapper:
-
- ```sql
- CREATE TEMP TABLE uploads_with_long_filenames AS
- SELECT ROW_NUMBER() OVER(ORDER BY id) row_id, path, id
- FROM uploads AS u
- WHERE LENGTH((regexp_match(u.path, '[^\\/:*?"<>|\r\n]+$'))[1]) > 246;
-
- CREATE INDEX ON uploads_with_long_filenames(row_id);
-
- BEGIN;
- WITH updated_uploads AS (
- UPDATE uploads
- SET
- path =
- CONCAT(
- COALESCE((regexp_match(updatable_uploads.path, '(.*\/).*'))[1], ''),
- CONCAT(
- LEFT(SPLIT_PART((regexp_match(updatable_uploads.path, '[^\\/:*?"<>|\r\n]+$'))[1], '.', 1), 242),
- COALESCE(SUBSTRING((regexp_match(updatable_uploads.path, '[^\\/:*?"<>|\r\n]+$'))[1] FROM '\.(?:.(?!\.))+$'))
- )
- )
- FROM
- uploads_with_long_filenames AS updatable_uploads
- WHERE
- uploads.id = updatable_uploads.id
- AND updatable_uploads.row_id > 0 AND updatable_uploads.row_id <= 10000
- RETURNING uploads.*
- )
- SELECT id, path FROM updated_uploads;
- ROLLBACK;
- ```
-
- Once you validate the batch update results, you must change the batch size (`row_id`) using the following sequence of numbers (10000 to 20000). Repeat this process until you reach the last record in the `uploads` table.
-
-1. Validate that the new filenames from the previous query are the expected ones. If you are sure you want to truncate the records found in the previous step to 246 characters, run the following:
-
- WARNING:
- The following action is **irreversible**.
-
- ```sql
- CREATE TEMP TABLE uploads_with_long_filenames AS
- SELECT ROW_NUMBER() OVER(ORDER BY id) row_id, path, id
- FROM uploads AS u
- WHERE LENGTH((regexp_match(u.path, '[^\\/:*?"<>|\r\n]+$'))[1]) > 246;
-
- CREATE INDEX ON uploads_with_long_filenames(row_id);
-
- UPDATE uploads
- SET
- path =
- CONCAT(
- COALESCE((regexp_match(updatable_uploads.path, '(.*\/).*'))[1], ''),
- CONCAT(
- LEFT(SPLIT_PART((regexp_match(updatable_uploads.path, '[^\\/:*?"<>|\r\n]+$'))[1], '.', 1), 242),
- COALESCE(SUBSTRING((regexp_match(updatable_uploads.path, '[^\\/:*?"<>|\r\n]+$'))[1] FROM '\.(?:.(?!\.))+$'))
- )
- )
- FROM
- uploads_with_long_filenames AS updatable_uploads
- WHERE
- uploads.id = updatable_uploads.id
- AND updatable_uploads.row_id > 0 AND updatable_uploads.row_id <= 10000;
- ```
-
- Once you finish the batch update, you must change the batch size (`updatable_uploads.row_id`) using the following sequence of numbers (10000 to 20000). Repeat this process until you reach the last record in the `uploads` table.
-
-Truncate the filenames in the references found:
-
-1. Check if those records are referenced somewhere. One way to do this is to dump the database and search for the parent directory name and filename:
-
- 1. To dump your database, you can use the following command as an example:
-
- ```shell
- pg_dump -h /var/opt/gitlab/postgresql/ -d gitlabhq_production > gitlab-dump.tmp
- ```
-
- 1. Then you can search for the references using the `grep` command. Combining the parent directory and the filename can be a good idea. For example:
-
- ```shell
- grep public/alongfilenamehere.txt gitlab-dump.tmp
- ```
-
-1. Replace those long filenames using the new filenames obtained from querying the `uploads` table.
-
-Truncate the filenames on the file system. You must manually rename the files in your file system to the new filenames obtained from querying the `uploads` table.
-
-#### Re-run the backup task
-
-After following all the previous steps, re-run the backup task.
-
-### Restoring database backup fails when `pg_stat_statements` was previously enabled
-
-The GitLab backup of the PostgreSQL database includes all SQL statements required to enable extensions that were
-previously enabled in the database.
-
-The `pg_stat_statements` extension can only be enabled or disabled by a PostgreSQL user with `superuser` role.
-As the restore process uses a database user with limited permissions, it can't execute the following SQL statements:
-
-```sql
-DROP EXTENSION IF EXISTS pg_stat_statements;
-CREATE EXTENSION IF NOT EXISTS pg_stat_statements WITH SCHEMA public;
-```
-
-When trying to restore the backup in a PostgreSQL instance that doesn't have the `pg_stats_statements` extension,
-the following error message is displayed:
-
-```plaintext
-ERROR: permission denied to create extension "pg_stat_statements"
-HINT: Must be superuser to create this extension.
-ERROR: extension "pg_stat_statements" does not exist
-```
-
-When trying to restore in an instance that has the `pg_stats_statements` extension enabled, the cleaning up step
-fails with an error message similar to the following:
-
-```plaintext
-rake aborted!
-ActiveRecord::StatementInvalid: PG::InsufficientPrivilege: ERROR: must be owner of view pg_stat_statements
-/opt/gitlab/embedded/service/gitlab-rails/lib/tasks/gitlab/db.rake:42:in `block (4 levels) in <top (required)>'
-/opt/gitlab/embedded/service/gitlab-rails/lib/tasks/gitlab/db.rake:41:in `each'
-/opt/gitlab/embedded/service/gitlab-rails/lib/tasks/gitlab/db.rake:41:in `block (3 levels) in <top (required)>'
-/opt/gitlab/embedded/service/gitlab-rails/lib/tasks/gitlab/backup.rake:71:in `block (3 levels) in <top (required)>'
-/opt/gitlab/embedded/bin/bundle:23:in `load'
-/opt/gitlab/embedded/bin/bundle:23:in `<main>'
-Caused by:
-PG::InsufficientPrivilege: ERROR: must be owner of view pg_stat_statements
-/opt/gitlab/embedded/service/gitlab-rails/lib/tasks/gitlab/db.rake:42:in `block (4 levels) in <top (required)>'
-/opt/gitlab/embedded/service/gitlab-rails/lib/tasks/gitlab/db.rake:41:in `each'
-/opt/gitlab/embedded/service/gitlab-rails/lib/tasks/gitlab/db.rake:41:in `block (3 levels) in <top (required)>'
-/opt/gitlab/embedded/service/gitlab-rails/lib/tasks/gitlab/backup.rake:71:in `block (3 levels) in <top (required)>'
-/opt/gitlab/embedded/bin/bundle:23:in `load'
-/opt/gitlab/embedded/bin/bundle:23:in `<main>'
-Tasks: TOP => gitlab:db:drop_tables
-(See full trace by running task with --trace)
-```
-
-#### Prevent the dump file to include `pg_stat_statements`
-
-To prevent the inclusion of the extension in the PostgreSQL dump file that is part of the backup bundle,
-enable the extension in any schema except the `public` schema:
-
-```sql
-CREATE SCHEMA adm;
-CREATE EXTENSION pg_stat_statements SCHEMA adm;
-```
-
-If the extension was previously enabled in the `public` schema, move it to a new one:
-
-```sql
-CREATE SCHEMA adm;
-ALTER EXTENSION pg_stat_statements SET SCHEMA adm;
-```
-
-To query the `pg_stat_statements` data after changing the schema, prefix the view name with the new schema:
-
-```sql
-SELECT * FROM adm.pg_stat_statements limit 0;
-```
-
-To make it compatible with third-party monitoring solutions that expect it to be enabled in the `public` schema,
-you need to include it in the `search_path`:
-
-```sql
-set search_path to public,adm;
-```
-
-#### Fix an existing dump file to remove references to `pg_stat_statements`
-
-To fix an existing backup file, do the following changes:
-
-1. Extract from the backup the following file: `db/database.sql.gz`.
-1. Decompress the file or use an editor that is capable of handling it compressed.
-1. Remove the following lines, or similar ones:
-
- ```sql
- CREATE EXTENSION IF NOT EXISTS pg_stat_statements WITH SCHEMA public;
- ```
-
- ```sql
- COMMENT ON EXTENSION pg_stat_statements IS 'track planning and execution statistics of all SQL statements executed';
- ```
-
-1. Save the changes and recompress the file.
-1. Update the backup file with the modified `db/database.sql.gz`.
+<!-- This redirect file can be deleted after <2023-09-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 (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/raketasks/generate_sample_prometheus_data.md b/doc/raketasks/generate_sample_prometheus_data.md
index 73c49bd2599..77c7d2c2c1a 100644
--- a/doc/raketasks/generate_sample_prometheus_data.md
+++ b/doc/raketasks/generate_sample_prometheus_data.md
@@ -2,31 +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/product/ux/technical-writing/#assignments
+remove_date: '2023-08-22'
+redirect_to: 'index.md'
---
-# Sample Prometheus data Rake task **(FREE SELF)**
+# Sample Prometheus data Rake task (removed) **(FREE SELF)**
-The Rake task runs Prometheus queries for each of the metrics of a specific environment
-for a series of time intervals to now:
-
-- 30 minutes
-- 3 hours
-- 8 hours
-- 24 hours
-- 72 hours
-- 7 days
-
-The results of each query are stored under a `sample_metrics` directory as a YAML
-file named by the metric's `identifier`. When the environmental variable `USE_SAMPLE_METRICS`
-is set, the Prometheus API query is re-routed to `Projects::Environments::SampleMetricsController`,
-which loads the appropriate data set if it's present in the `sample_metrics` directory.
-
-The Rake task requires an ID from an environment with an available Prometheus installation.
-
-## Example
-
-The following example demonstrates how to run the Rake task:
-
-```shell
-bundle exec rake gitlab:generate_sample_prometheus_data[21]
-```
+This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541) in GitLab 14.7
+and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/399231) in 16.0.
diff --git a/doc/raketasks/index.md b/doc/raketasks/index.md
index 47fa7e855a1..e998c97a4d7 100644
--- a/doc/raketasks/index.md
+++ b/doc/raketasks/index.md
@@ -20,7 +20,7 @@ The following Rake tasks are available for use with GitLab:
| Tasks | Description |
|:------------------------------------------------------|:------------|
-| [Back up and restore](backup_restore.md) | Back up, restore, and migrate GitLab instances between servers. |
+| [Back up and restore](../administration/backup_restore/index.md) | Back up, restore, and migrate GitLab instances between servers. |
| [Clean up](cleanup.md) | Clean up unneeded items from GitLab instances. |
| [Development](../development/rake_tasks.md) | Tasks for GitLab contributors. |
| [Elasticsearch](../integration/advanced_search/elasticsearch.md#gitlab-advanced-search-rake-tasks) | Maintain Elasticsearch in a GitLab instance. |
@@ -32,10 +32,8 @@ The following Rake tasks are available for use with GitLab:
| [Integrity checks](../administration/raketasks/check.md) | Check the integrity of repositories, files, LDAP, and more. |
| [LDAP maintenance](../administration/raketasks/ldap.md) | [LDAP](../administration/auth/ldap/index.md)-related tasks. |
| [List repositories](list_repos.md) | List all GitLab-managed Git repositories on disk. |
-| [Migrate snippets to Git](migrate_snippets.md) | Migrate GitLab Snippets to Git repositories, and show the migration status. |
| [Praefect Rake tasks](../administration/raketasks/praefect.md) | [Praefect](../administration/gitaly/praefect.md)-related tasks. |
| [Project import/export](../administration/raketasks/project_import_export.md) | Prepare for [project exports and imports](../user/project/settings/import_export.md). |
-| [Sample Prometheus data](generate_sample_prometheus_data.md) | Generate sample Prometheus data. |
| [Sidekiq job migration](../administration/sidekiq/sidekiq_job_migration.md) | Migrate Sidekiq jobs scheduled for future dates to a new queue. |
| [Service Desk email](../administration/raketasks/service_desk_email.md) | Service Desk email-related tasks. |
| [SMTP maintenance](../administration/raketasks/smtp.md) | SMTP-related tasks. |
diff --git a/doc/raketasks/migrate_snippets.md b/doc/raketasks/migrate_snippets.md
index 16f78d7fc71..c845d9bed73 100644
--- a/doc/raketasks/migrate_snippets.md
+++ b/doc/raketasks/migrate_snippets.md
@@ -1,101 +1,11 @@
---
-stage: Create
-group: IDE
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+redirect_to: 'index.md'
+remove_date: '2023-10-13'
---
-# Migrate to versioned snippets Rake tasks **(FREE SELF)**
+This document was moved to [another location](index.md).
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/215861) in GitLab 13.0.
-
-In GitLab 13.0, [GitLab Snippets are backed by Git repositories](../user/snippets.md#versioned-snippets).
-Snippet content is stored in the repository, and users can update it directly through Git.
-
-Nevertheless, existing GitLab Snippets must be migrated to this new feature.
-For each snippet:
-
-- A new repository is created.
-- A file is created in the repository, using the snippet filename.
-- The snippet is committed to the repository.
-
-GitLab performs this migration through a [Background Migration](../development/database/background_migrations.md)
-when the GitLab instance is upgraded to 13.0 or a higher version.
-However, if the migration fails for any of the snippets, they must be migrated individually.
-The following Rake tasks help with that process.
-
-## Migrate specific snippets to Git
-
-In case you want to migrate a range of snippets, run the tasks as described below.
-
-For Omnibus installations, run:
-
-```shell
-sudo gitlab-rake gitlab:snippets:migrate SNIPPET_IDS=1,2,3,4
-```
-
-For installations from source code, run:
-
-```shell
-bundle exec rake gitlab:snippets:migrate SNIPPET_IDS=1,2,3,4
-```
-
-There is a default limit (100) to the number of ids supported in the migration
-process. You can modify this limit by using the environment variable `LIMIT`.
-
-```shell
-sudo gitlab-rake gitlab:snippets:migrate SNIPPET_IDS=1,2,3,4 LIMIT=50
-```
-
-For installations from source code, run:
-
-```shell
-bundle exec rake gitlab:snippets:migrate SNIPPET_IDS=1,2,3,4 LIMIT=50
-```
-
-## Show whether the snippet background migration is running
-
-In case you want to check the status of the snippet background migration,
-whether it is running or not, you can use the following task.
-
-For Omnibus installations, run:
-
-```shell
-sudo gitlab-rake gitlab:snippets:migration_status
-```
-
-For installations from source code, run:
-
-```shell
-bundle exec rake gitlab:snippets:migration_status RAILS_ENV=production
-```
-
-## List non-migrated snippets
-
-With the following task, you can get the ids of all of the snippets
-that haven't been migrated yet or failed to migrate.
-
-For Omnibus installations, run:
-
-```shell
-sudo gitlab-rake gitlab:snippets:list_non_migrated
-```
-
-For installations from source code, run:
-
-```shell
-bundle exec rake gitlab:snippets:list_non_migrated RAILS_ENV=production
-```
-
-As the number of non-migrated snippets can be large, we limit
-by default the size of the number of ids returned to 100. You can
-modify this limit by using the environment variable `LIMIT`.
-
-```shell
-sudo gitlab-rake gitlab:snippets:list_non_migrated LIMIT=200
-```
-
-For installations from source code, run:
-
-```shell
-bundle exec rake gitlab:snippets:list_non_migrated RAILS_ENV=production LIMIT=200
-```
+<!-- This redirect file can be deleted after <2023-10-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/raketasks/restore_gitlab.md b/doc/raketasks/restore_gitlab.md
index bbb2f2aa648..434e256de35 100644
--- a/doc/raketasks/restore_gitlab.md
+++ b/doc/raketasks/restore_gitlab.md
@@ -2,404 +2,13 @@
stage: Systems
group: Geo
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+redirect_to: '../administration/backup_restore/restore_gitlab.md'
+remove_date: '2023-09-26'
---
-# Restore GitLab **(FREE SELF)**
+This document was moved to [another location](../administration/backup_restore/restore_gitlab.md).
-GitLab provides a command line interface to restore your entire installation,
-and is flexible enough to fit your needs.
-
-The [restore prerequisites section](#restore-prerequisites) includes crucial
-information. Be sure to read and test the complete restore process at least
-once before attempting to perform it in a production environment.
-
-You can restore a backup only to _the exact same version and type (CE/EE)_ of
-GitLab that you created it on (for example CE 15.1.4).
-
-If your backup is a different version than the current installation, you must
-[downgrade](../update/package/downgrade.md) or [upgrade](../update/package/index.md#upgrade-to-a-specific-version-using-the-official-repositories) your GitLab installation
-before restoring the backup.
-
-Each backup archive contains a full self-contained backup, including those created through the [incremental repository backup procedure](backup_gitlab.md#incremental-repository-backups). To restore an incremental repository backup, use the same instructions as restoring any other regular backup archive.
-
-## Restore prerequisites
-
-You need to have a working GitLab installation before you can perform a
-restore. This is because the system user performing the restore actions (`git`)
-is usually not allowed to create or delete the SQL database needed to import
-data into (`gitlabhq_production`). All existing data is either erased
-(SQL) or moved to a separate directory (such as repositories and uploads).
-Restoring SQL data skips views owned by PostgreSQL extensions.
-
-To restore a backup, **you must also restore the GitLab secrets**.
-These include the database encryption key, [CI/CD variables](../ci/variables/index.md), and
-variables used for [two-factor authentication](../user/profile/account/two_factor_authentication.md).
-Without the keys, [multiple issues occur](backup_restore.md#when-the-secrets-file-is-lost),
-including loss of access by users with [two-factor authentication enabled](../user/profile/account/two_factor_authentication.md),
-and GitLab Runners cannot log in.
-
-Restore:
-
-- `/etc/gitlab/gitlab-secrets.json` (Linux package)
-- `/home/git/gitlab/.secret` (self-compiled installations)
-- Rails secret (cloud-native GitLab)
- - [This can be converted to the Linux package format](https://docs.gitlab.com/charts/installation/migration/helm_to_package.html), if required.
-
-You may also want to restore your previous `/etc/gitlab/gitlab.rb` (for Omnibus packages)
-or `/home/git/gitlab/config/gitlab.yml` (for installations from source) and
-any TLS keys, certificates (`/etc/gitlab/ssl`, `/etc/gitlab/trusted-certs`), or
-[SSH host keys](https://superuser.com/questions/532040/copy-ssh-keys-from-one-server-to-another-server/532079#532079).
-
-Depending on your case, you might want to run the restore command with one or
-more of the following options:
-
-- `BACKUP=timestamp_of_backup`: Required if more than one backup exists.
- Read what the [backup timestamp is about](backup_restore.md#backup-timestamp).
-- `force=yes`: Doesn't ask if the `authorized_keys` file should get regenerated,
- and assumes 'yes' for warning about database tables being removed,
- enabling the `Write to authorized_keys file` setting, and updating LDAP
- providers.
-
-If you're restoring into directories that are mount points, you must ensure these directories are
-empty before attempting a restore. Otherwise, GitLab attempts to move these directories before
-restoring the new data, which causes an error.
-
-Read more about [configuring NFS mounts](../administration/nfs.md)
-
-Restoring a backup from an instance using local storage restores to local storage even if the target instance uses object storage.
-Migrations to object storage must be done before or after restoration.
-
-## Restore for Omnibus GitLab installations
-
-This procedure assumes that:
-
-- You have installed the **exact same version and type (CE/EE)** of GitLab
- Omnibus with which the backup was created.
-- You have run `sudo gitlab-ctl reconfigure` at least once.
-- GitLab is running. If not, start it using `sudo gitlab-ctl start`.
-
-First ensure your backup tar file is in the backup directory described in the
-`gitlab.rb` configuration `gitlab_rails['backup_path']`. The default is
-`/var/opt/gitlab/backups`. The backup file needs to be owned by the `git` user.
-
-```shell
-sudo cp 11493107454_2018_04_25_10.6.4-ce_gitlab_backup.tar /var/opt/gitlab/backups/
-sudo chown git:git /var/opt/gitlab/backups/11493107454_2018_04_25_10.6.4-ce_gitlab_backup.tar
-```
-
-Stop the processes that are connected to the database. Leave the rest of GitLab
-running:
-
-```shell
-sudo gitlab-ctl stop puma
-sudo gitlab-ctl stop sidekiq
-# Verify
-sudo gitlab-ctl status
-```
-
-Next, ensure you have completed the [restore prerequisites](#restore-prerequisites) steps and have run `gitlab-ctl reconfigure`
-after copying over the GitLab secrets file from the original installation.
-
-Next, restore the backup, specifying the timestamp of the backup you wish to
-restore:
-
-```shell
-# This command will overwrite the contents of your GitLab database!
-# NOTE: "_gitlab_backup.tar" is omitted from the name
-sudo gitlab-backup restore BACKUP=11493107454_2018_04_25_10.6.4-ce
-```
-
-Users of GitLab 12.1 and earlier should use the command `gitlab-rake gitlab:backup:restore` instead.
-Some [known non-blocking error messages may appear](backup_restore.md#restoring-database-backup-using-omnibus-packages-outputs-warnings).
-
-WARNING:
-`gitlab-rake gitlab:backup:restore` doesn't set the correct file system
-permissions on your Registry directory. This is a [known issue](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/62759).
-In GitLab 12.2 or later, you can use `gitlab-backup restore` to avoid this
-issue.
-
-If there's a GitLab version mismatch between your backup tar file and the
-installed version of GitLab, the restore command aborts with an error
-message. Install the [correct GitLab version](https://packages.gitlab.com/gitlab/),
-and then try again.
-
-WARNING:
-The restore command requires [additional parameters](backup_restore.md#back-up-and-restore-for-installations-using-pgbouncer) when
-your installation is using PgBouncer, for either performance reasons or when using it with a Patroni cluster.
-
-Next, restart and [check](../administration/raketasks/maintenance.md#check-gitlab-configuration) GitLab:
-
-```shell
-sudo gitlab-ctl restart
-sudo gitlab-rake gitlab:check SANITIZE=true
-```
-
-In GitLab 13.1 and later, check [database values can be decrypted](../administration/raketasks/check.md#verify-database-values-can-be-decrypted-using-the-current-secrets)
-especially if `/etc/gitlab/gitlab-secrets.json` was restored, or if a different server is
-the target for the restore.
-
-```shell
-sudo gitlab-rake gitlab:doctor:secrets
-```
-
-For added assurance, you can perform [an integrity check on the uploaded files](../administration/raketasks/check.md#uploaded-files-integrity):
-
-```shell
-sudo gitlab-rake gitlab:artifacts:check
-sudo gitlab-rake gitlab:lfs:check
-sudo gitlab-rake gitlab:uploads:check
-```
-
-## Restore for Docker image and GitLab Helm chart installations
-
-For GitLab installations using the Docker image or the GitLab Helm chart on a
-Kubernetes cluster, the restore task expects the restore directories to be
-empty. However, with Docker and Kubernetes volume mounts, some system level
-directories may be created at the volume roots, such as the `lost+found`
-directory found in Linux operating systems. These directories are usually owned
-by `root`, which can cause access permission errors since the restore Rake task
-runs as the `git` user. To restore a GitLab installation, users have to confirm
-the restore target directories are empty.
-
-For both these installation types, the backup tarball has to be available in
-the backup location (default location is `/var/opt/gitlab/backups`).
-
-### Restore for Helm chart installations
-
-The GitLab Helm chart uses the process documented in
-[restoring a GitLab Helm chart installation](https://docs.gitlab.com/charts/backup-restore/restore.html#restoring-a-gitlab-installation)
-
-### Restore for Docker image installations
-
-If you're using [Docker Swarm](../install/docker.md#install-gitlab-using-docker-swarm-mode),
-the container might restart during the restore process because Puma is shut down,
-and so the container health check fails. To work around this problem,
-temporarily disable the health check mechanism.
-
-1. Edit `docker-compose.yml`:
-
- ```yaml
- healthcheck:
- disable: true
- ```
-
-1. Deploy the stack:
-
- ```shell
- docker stack deploy --compose-file docker-compose.yml mystack
- ```
-
-For more information, see [issue 6846](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/6846 "GitLab restore can fail owing to `gitlab-healthcheck`").
-
-The restore task can be run from the host:
-
-```shell
-# Stop the processes that are connected to the database
-docker exec -it <name of container> gitlab-ctl stop puma
-docker exec -it <name of container> gitlab-ctl stop sidekiq
-
-# Verify that the processes are all down before continuing
-docker exec -it <name of container> gitlab-ctl status
-
-# Run the restore. NOTE: "_gitlab_backup.tar" is omitted from the name
-docker exec -it <name of container> gitlab-backup restore BACKUP=11493107454_2018_04_25_10.6.4-ce
-
-# Restart the GitLab container
-docker restart <name of container>
-
-# Check GitLab
-docker exec -it <name of container> gitlab-rake gitlab:check SANITIZE=true
-```
-
-## Restore for installation from source
-
-First, ensure your backup tar file is in the backup directory described in the
-`gitlab.yml` configuration:
-
-```yaml
-## Backup settings
-backup:
- path: "tmp/backups" # Relative paths are relative to Rails.root (default: tmp/backups/)
-```
-
-The default is `/home/git/gitlab/tmp/backups`, and it needs to be owned by the `git` user. Now, you can begin the backup procedure:
-
-```shell
-# Stop processes that are connected to the database
-sudo service gitlab stop
-
-sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production
-```
-
-Example output:
-
-```plaintext
-Unpacking backup... [DONE]
-Restoring database tables:
--- create_table("events", {:force=>true})
- -> 0.2231s
-[...]
-- Loading fixture events...[DONE]
-- Loading fixture issues...[DONE]
-- Loading fixture keys...[SKIPPING]
-- Loading fixture merge_requests...[DONE]
-- Loading fixture milestones...[DONE]
-- Loading fixture namespaces...[DONE]
-- Loading fixture notes...[DONE]
-- Loading fixture projects...[DONE]
-- Loading fixture protected_branches...[SKIPPING]
-- Loading fixture schema_migrations...[DONE]
-- Loading fixture services...[SKIPPING]
-- Loading fixture snippets...[SKIPPING]
-- Loading fixture taggings...[SKIPPING]
-- Loading fixture tags...[SKIPPING]
-- Loading fixture users...[DONE]
-- Loading fixture users_projects...[DONE]
-- Loading fixture web_hooks...[SKIPPING]
-- Loading fixture wikis...[SKIPPING]
-Restoring repositories:
-- Restoring repository abcd... [DONE]
-- Object pool 1 ...
-Deleting tmp directories...[DONE]
-```
-
-Next, restore `/home/git/gitlab/.secret` if necessary, [as previously mentioned](#restore-prerequisites).
-
-Restart GitLab:
-
-```shell
-sudo service gitlab restart
-```
-
-## Restoring only one or a few projects or groups from a backup
-
-Although the Rake task used to restore a GitLab instance doesn't support
-restoring a single project or group, you can use a workaround by restoring
-your backup to a separate, temporary GitLab instance, and then export your
-project or group from there:
-
-1. [Install a new GitLab](../install/index.md) instance at the same version as
- the backed-up instance from which you want to restore.
-1. [Restore the backup](#restore-gitlab) into this new instance, then
- export your [project](../user/project/settings/import_export.md)
- or [group](../user/group/import/index.md#migrate-groups-by-uploading-an-export-file-deprecated). For more information about what is and isn't exported, see the export feature's documentation.
-1. After the export is complete, go to the old instance and then import it.
-1. After importing the projects or groups that you wanted is complete, you may
- delete the new, temporary GitLab instance.
-
-A feature request to provide direct restore of individual projects or groups
-is being discussed in [issue #17517](https://gitlab.com/gitlab-org/gitlab/-/issues/17517).
-
-## Restore options
-
-The command line tool GitLab provides to restore from backup can accept more
-options.
-
-### Disabling prompts during restore
-
-During a restore from backup, the restore script may ask for confirmation before
-proceeding. If you wish to disable these prompts, you can set the `GITLAB_ASSUME_YES`
-environment variable to `1`.
-
-For Omnibus GitLab packages:
-
-```shell
-sudo GITLAB_ASSUME_YES=1 gitlab-backup restore
-```
-
-For installations from source:
-
-```shell
-sudo -u git -H GITLAB_ASSUME_YES=1 bundle exec rake gitlab:backup:restore RAILS_ENV=production
-```
-
-### Excluding tasks on restore
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/19347) in GitLab 14.10.
-
-You can exclude specific tasks on restore by adding the environment variable `SKIP`, whose values are a comma-separated list of the following options:
-
-- `db` (database)
-- `uploads` (attachments)
-- `builds` (CI job output logs)
-- `artifacts` (CI job artifacts)
-- `lfs` (LFS objects)
-- `terraform_state` (Terraform states)
-- `registry` (Container Registry images)
-- `pages` (Pages content)
-- `repositories` (Git repositories data)
-- `packages` (Packages)
-
-For Omnibus GitLab packages:
-
-```shell
-sudo gitlab-backup restore BACKUP=timestamp_of_backup SKIP=db,uploads
-```
-
-For installations from source:
-
-```shell
-sudo -u git -H bundle exec rake gitlab:backup:restore BACKUP=timestamp_of_backup SKIP=db,uploads RAILS_ENV=production
-```
-
-### Restore specific repository storages
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86896) in GitLab 15.0.
-
-When using [multiple repository storages](../administration/repository_storage_paths.md),
-repositories from specific repository storages can be restored separately
-using the `REPOSITORIES_STORAGES` option. The option accepts a comma-separated list of
-storage names.
-
-For example, for Omnibus GitLab installations:
-
-```shell
-sudo gitlab-backup restore BACKUP=timestamp_of_backup REPOSITORIES_STORAGES=storage1,storage2
-```
-
-For example, for installations from source:
-
-```shell
-sudo -u git -H bundle exec rake gitlab:backup:restore BACKUP=timestamp_of_backup REPOSITORIES_STORAGES=storage1,storage2
-```
-
-### Restore specific repositories
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/88094) in GitLab 15.1.
-
-You can restore specific repositories using the `REPOSITORIES_PATHS` and the `SKIP_REPOSITORIES_PATHS` options.
-Both options accept a comma-separated list of project and group paths. If you
-specify a group path, all repositories in all projects in the group and
-descendent groups are included or skipped, depending on which option you used. The project and group repositories must exist within the specified backup.
-
-For example, to restore all repositories for all projects in **Group A** (`group-a`), the repository for **Project C** in **Group B** (`group-b/project-c`),
-and skip the **Project D** in **Group A** (`group-a/project-d`):
-
-- Omnibus GitLab installations:
-
- ```shell
- sudo gitlab-backup restore BACKUP=timestamp_of_backup REPOSITORIES_PATHS=group-a,group-b/project-c SKIP_REPOSITORIES_PATHS=group-a/project-d
- ```
-
-- Installations from source:
-
- ```shell
- sudo -u git -H bundle exec rake gitlab:backup:restore BACKUP=timestamp_of_backup REPOSITORIES_PATHS=group-a,group-b/project-c SKIP_REPOSITORIES_PATHS=group-a/project-d
- ```
-
-### Restore untarred backups
-
-If an [untarred backup](backup_gitlab.md#skipping-tar-creation) (made with `SKIP=tar`) is found,
-and no backup is chosen with `BACKUP=<timestamp>`, the untarred backup is used.
-
-For example, for Omnibus GitLab installations:
-
-```shell
-sudo gitlab-backup restore
-```
-
-For example, for installations from source:
-
-```shell
-sudo -u git -H bundle exec rake gitlab:backup:restore
-```
+<!-- This redirect file can be deleted after <2023-09-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 (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/raketasks/user_management.md b/doc/raketasks/user_management.md
index bb3f1f404b4..fa7d0813001 100644
--- a/doc/raketasks/user_management.md
+++ b/doc/raketasks/user_management.md
@@ -7,7 +7,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# User management Rake tasks **(FREE SELF)**
GitLab provides Rake tasks for managing users. Administrators can also use the Admin Area to
-[manage users](../user/admin_area/index.md#administering-users).
+[manage users](../administration/admin_area.md#administering-users).
## Add user as a developer to all projects
diff --git a/doc/security/email_verification.md b/doc/security/email_verification.md
index b87fd28dbed..4d7dd1ab36f 100644
--- a/doc/security/email_verification.md
+++ b/doc/security/email_verification.md
@@ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86352) in GitLab 15.2 [with a flag](../administration/feature_flags.md) named `require_email_verification`. 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 `require_email_verification`. On GitLab.com, this feature is not available.
+On self-managed GitLab, by default this feature is not available. To make it available, an administrator can [enable the feature flag](../administration/feature_flags.md) named `require_email_verification`. On GitLab.com, this feature is not available.
Account email verification provides an additional layer of GitLab account security.
When certain conditions are met, an account is locked. If your account is locked,
diff --git a/doc/security/hardening_application_recommendations.md b/doc/security/hardening_application_recommendations.md
index 9d4d2d562fd..e9c09abdea1 100644
--- a/doc/security/hardening_application_recommendations.md
+++ b/doc/security/hardening_application_recommendations.md
@@ -121,7 +121,7 @@ select the **Disabled feed token** checkbox.
If all of your users are coming from specific IP addresses, use **Global-allowed IP ranges**
to specifically allow only those addresses.
-For more details on **Visibility and access control**, see [visibility and access controls](../user/admin_area/settings/visibility_and_access_controls.md).
+For more details on **Visibility and access control**, see [visibility and access controls](../administration/settings/visibility_and_access_controls.md).
For information on SSH settings, see
[SSH keys restrictions](../security/ssh_keys_restrictions.md).
@@ -134,7 +134,7 @@ restricted. Account avatars can be manually uploaded by users.
The settings in this section are intended to help enforce a custom implementation
of your own specific standards on your users. As the various scenarios are too many
and too varied, you should review the
-[account and limit settings documentation](../user/admin_area/settings/account_and_limit_settings.md)
+[account and limit settings documentation](../administration/settings/account_and_limit_settings.md)
and apply changes to enforce your own policies.
### Sign-up restrictions
@@ -158,7 +158,7 @@ email addresses, then list that domain in **Allowed domains for sign-ups**. This
prevents those with email addresses in other domains from signing up.
For more detailed information, see
-[sign-up restrictions](../user/admin_area/settings/sign_up_restrictions.md).
+[sign-up restrictions](../administration/settings/sign_up_restrictions.md).
### Sign-in restrictions
@@ -176,7 +176,7 @@ In **Email notification for unknown sign-ins**, ensure that **Enable email notif
is selected. This sends an email to users when a sign-in occurs from an unrecognized location.
For more detailed information, see
-[sign-in restrictions](../user/admin_area/settings/sign_in_restrictions.md).
+[sign-in restrictions](../administration/settings/sign_in_restrictions.md).
## Integrations
diff --git a/doc/security/hardening_operating_system_recommendations.md b/doc/security/hardening_operating_system_recommendations.md
index 8b4b706815c..33f88d43d22 100644
--- a/doc/security/hardening_operating_system_recommendations.md
+++ b/doc/security/hardening_operating_system_recommendations.md
@@ -116,7 +116,7 @@ vm.mmap_min_addr=4096
# Default is 0, randomize virtual address space in memory, makes vuln exploitation
# harder
kernel.randomize_va_space=2
-# Restrict kernel pointer access (e.g. cat /proc/kallsyms) for exploit assistance
+# Restrict kernel pointer access (for example, cat /proc/kallsyms) for exploit assistance
kernel.kptr_restrict=2
# Restrict verbose kernel errors in dmesg
kernel.dmesg_restrict=1
diff --git a/doc/security/img/ssh_keys_restrictions_settings.png b/doc/security/img/ssh_keys_restrictions_settings.png
index 94258af3bf9..1f37a25d19f 100644
--- a/doc/security/img/ssh_keys_restrictions_settings.png
+++ b/doc/security/img/ssh_keys_restrictions_settings.png
Binary files differ
diff --git a/doc/security/index.md b/doc/security/index.md
index a62d7171112..1b486ab5feb 100644
--- a/doc/security/index.md
+++ b/doc/security/index.md
@@ -27,6 +27,6 @@ type: index
- [Project Import decompressed archive size limits](project_import_decompressed_archive_size_limits.md)
- [Responding to security incidents](responding_to_security_incidents.md)
-To harden your GitLab instance and minimize the risk of unwanted user account creation, consider access control features like [Sign up restrictions](../user/admin_area/settings/sign_up_restrictions.md) and [Authentication options](../topics/authentication/index.md). For more detailed information, refer to [Hardening](hardening.md).
+To harden your GitLab instance and minimize the risk of unwanted user account creation, consider access control features like [Sign up restrictions](../administration/settings/sign_up_restrictions.md) and [Authentication options](../topics/authentication/index.md). For more detailed information, refer to [Hardening](hardening.md).
Self-managed GitLab customers and administrators are responsible for the security of their underlying hosts, and for keeping GitLab itself up to date. It is important to [regularly patch GitLab](../policy/maintenance.md), patch your operating system and its software, and harden your hosts in accordance with vendor guidance.
diff --git a/doc/security/rate_limits.md b/doc/security/rate_limits.md
index d835d8eb08c..5353c11d2f1 100644
--- a/doc/security/rate_limits.md
+++ b/doc/security/rate_limits.md
@@ -31,20 +31,21 @@ similarly mitigated by a rate limit.
You can set these rate limits in the Admin Area of your instance:
-- [Import/Export rate limits](../user/admin_area/settings/import_export_rate_limits.md)
-- [Issue rate limits](../user/admin_area/settings/rate_limit_on_issues_creation.md)
-- [Note rate limits](../user/admin_area/settings/rate_limit_on_notes_creation.md)
-- [Protected paths](../user/admin_area/settings/protected_paths.md)
-- [Raw endpoints rate limits](../user/admin_area/settings/rate_limits_on_raw_endpoints.md)
-- [User and IP rate limits](../user/admin_area/settings/user_and_ip_rate_limits.md)
-- [Package registry rate limits](../user/admin_area/settings/package_registry_rate_limits.md)
-- [Git LFS rate limits](../user/admin_area/settings/git_lfs_rate_limits.md)
-- [Files API rate limits](../user/admin_area/settings/files_api_rate_limits.md)
-- [Deprecated API rate limits](../user/admin_area/settings/deprecated_api_rate_limits.md)
+- [Import/Export rate limits](../administration/settings/import_export_rate_limits.md)
+- [Issue rate limits](../administration/settings/rate_limit_on_issues_creation.md)
+- [Note rate limits](../administration/settings/rate_limit_on_notes_creation.md)
+- [Protected paths](../administration/settings/protected_paths.md)
+- [Raw endpoints rate limits](../administration/settings/rate_limits_on_raw_endpoints.md)
+- [User and IP rate limits](../administration/settings/user_and_ip_rate_limits.md)
+- [Package registry rate limits](../administration/settings/package_registry_rate_limits.md)
+- [Git LFS rate limits](../administration/settings/git_lfs_rate_limits.md)
+- [Rate limits on Git SSH operations](../administration/settings/rate_limits_on_git_ssh_operations.md)
+- [Files API rate limits](../administration/settings/files_api_rate_limits.md)
+- [Deprecated API rate limits](../administration/settings/deprecated_api_rate_limits.md)
- [GitLab Pages rate limits](../administration/pages/index.md#rate-limits)
-- [Pipeline rate limits](../user/admin_area/settings/rate_limit_on_pipelines_creation.md)
-- [Incident management rate limits](../user/admin_area/settings/incident_management_rate_limits.md)
-- [Unauthenticated access to Projects List API rate limits](../user/admin_area/settings/rate_limit_on_projects_api.md)
+- [Pipeline rate limits](../administration/settings/rate_limit_on_pipelines_creation.md)
+- [Incident management rate limits](../administration/settings/incident_management_rate_limits.md)
+- [Unauthenticated access to Projects List API rate limits](../administration/settings/rate_limit_on_projects_api.md)
You can set these rate limits using the Rails console:
@@ -73,24 +74,6 @@ 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 [with a flag](../administration/feature_flags.md) named `rate_limit_gitlab_shell`. Available by default without a feature flag from 15.8.
-
-GitLab applies rate limits to Git operations that use SSH by user account and project. When the rate limit is exceeded, GitLab rejects
-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 per minute threshold for this rate limit is not configurable. Self-managed customers can disable this
-rate limit.
-
### Repository archives
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/25750) in GitLab 12.9.
diff --git a/doc/security/responding_to_security_incidents.md b/doc/security/responding_to_security_incidents.md
index 5c00c53c5bf..0cd7170d35b 100644
--- a/doc/security/responding_to_security_incidents.md
+++ b/doc/security/responding_to_security_incidents.md
@@ -14,7 +14,7 @@ additional steps. These suggestions are intended to supplement existing security
If you suspect that a user account or bot account has been compromised, consider taking the following steps:
-- [Block the user](../user/admin_area/moderate_users.md#block-a-user) to mitigate any current risk.
+- [Block the user](../administration/moderate_users.md#block-a-user) to mitigate any current risk.
- [Review the audit events](../administration/audit_events.md) available to you to identify any suspicious account behavior. For
example:
- Suspicious sign-in events.
@@ -44,8 +44,8 @@ hosts in accordance with vendor guidance.
If you suspect that your GitLab instance has been compromised, consider taking the following steps:
- [Review the audit events](../administration/audit_events.md) available to you for suspicious account behavior.
-- [Review all users](../user/admin_area/moderate_users.md) (including the Administrative root user), and follow the steps in [Suspected compromised user account](#suspected-compromised-user-account) if necessary.
-- Review the [Credentials Inventory](../user/admin_area/credentials_inventory.md), if available to you.
+- [Review all users](../administration/moderate_users.md) (including the Administrative root user), and follow the steps in [Suspected compromised user account](#suspected-compromised-user-account) if necessary.
+- Review the [Credentials Inventory](../administration/credentials_inventory.md), if available to you.
- Change any sensitive credentials, variables, tokens, and secrets. For example, those located in instance configuration, database,
CI/CD pipelines, or elsewhere.
- Upgrade to the latest version of GitLab and adopt a plan to upgrade after every security patch release.
diff --git a/doc/security/token_overview.md b/doc/security/token_overview.md
index 5a772106562..fb4fb71356a 100644
--- a/doc/security/token_overview.md
+++ b/doc/security/token_overview.md
@@ -139,7 +139,10 @@ Each user has a long-lived feed token that does not expire. This token allows au
- RSS readers to load a personalized RSS feed.
- Calendar applications to load a personalized calendar.
-This token is visible in those feed URLs. You cannot use this token to access any other data.
+You cannot use this token to access any other data.
+
+The user-scoped feed token can be used for all feeds, however feed and calendar URLs are generated
+with a different token that is only valid for one feed.
Anyone who has your token can read activity and issue RSS feeds or your calendar feed as if they were you, including confidential issues. If that happens, [reset the token](../user/profile/contributions_calendar.md#reset-the-user-activity-feed-token).
@@ -171,16 +174,25 @@ This table shows available scopes per token. Scopes can be limited further on to
## Security considerations
-- Access tokens should be treated like passwords and kept secure.
-- Adding access tokens to URLs is a security risk, especially when cloning or adding a remote because Git then writes the URL to its `.git/config` file in plain text. URLs are
+1. Treat access tokens like passwords and keep them secure.
+1. When creating a scoped token, consider using the most limited scope possible to reduce the impact of accidentally leaking the token.
+1. When creating a token, consider setting a token that expires when your task is complete. For example, if performing a one-off import, set the
+ token to expire after a few hours or a day. This reduces the impact of a token that is accidentally leaked because it is useless when it expires.
+1. If you are recording a video that might contain a sensitive secret like a personal access token (PAT), feed token, or trigger token, you must mask that secret before uploading the video to GitLab Unfiltered or any other video hosting service. As an additional defense-in-depth security measure, you must revoke those secrets before you share the video publicly. For more information, see [revoking a PAT](../user/profile/personal_access_tokens.md#revoke-a-personal-access-token).
+1. Adding access tokens to URLs is a security risk, especially when cloning or adding a remote because Git then writes the URL to its `.git/config` file in plain text. URLs are
also generally logged by proxies and application servers, which makes those credentials visible to system administrators. Instead, pass API calls an access token using
headers like [the `Private-Token` header](../api/rest/index.md#personalprojectgroup-access-tokens).
-- Tokens can also be stored using a [Git credential storage](https://git-scm.com/book/en/v2/Git-Tools-Credential-Storage).
-- Tokens must not be committed to your source code. Instead, consider an approach such as [using external secrets in CI](../ci/secrets/index.md).
-- When creating a scoped token, consider using the most limited scope possible to reduce the impact of accidentally leaking the token.
-- When creating a token, consider setting a token that expires when your task is complete. For example, if performing a one-off import, set the
- token to expire after a few hours or a day. This reduces the impact of a token that is accidentally leaked because it is useless when it expires.
-- Be careful not to include tokens when pasting code, console commands, or log outputs into an issue or MR description or comment.
-- Don’t log credentials in the console logs. Consider [protecting](../ci/variables/index.md#protect-a-cicd-variable) and
+1. You can also store token using a [Git credential storage](https://git-scm.com/book/en/v2/Git-Tools-Credential-Storage).
+1. Do not:
+ - Store tokens in plain text in your projects.
+ - Include tokens when pasting code, console commands, or log outputs into an issue, MR description, or comment.
+ Consider an approach such as [using external secrets in CI](../ci/secrets/index.md).
+1. Do not log credentials in the console logs or artifacts. Consider [protecting](../ci/variables/index.md#protect-a-cicd-variable) and
[masking](../ci/variables/index.md#mask-a-cicd-variable) your credentials.
-- Review all currently active access tokens of all types on a regular basis and revoke any that are no longer needed.
+1. If you have set up a demo environment to showcase a project you have been working on and you are recording a video or writing a blog post describing that project, make sure you are not leaking sensitive secrets during that process. If you are done with the demo, you must revoke all the secrets created during that demo.
+1. Review all active access tokens of all types on a regular basis and revoke any that are no longer needed. This includes:
+ - Personal, project, and group access tokens.
+ - Feed tokens.
+ - Trigger tokens.
+ - Runner registration tokens.
+ - Any other sensitive secrets etc.
diff --git a/doc/security/two_factor_authentication.md b/doc/security/two_factor_authentication.md
index 25937993c16..5dd8da72e83 100644
--- a/doc/security/two_factor_authentication.md
+++ b/doc/security/two_factor_authentication.md
@@ -140,7 +140,7 @@ sudo -u git -H bundle exec rake gitlab:two_factor:disable_for_all_users RAILS_EN
> - Push notification support [introduced](https://gitlab.com/gitlab-org/gitlab-shell/-/issues/506) in GitLab 15.3.
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 `two_factor_for_cli`. On GitLab.com, this feature is not available. The feature is not ready for production use. This feature flag also affects [session duration for Git Operations when 2FA is enabled](../user/admin_area/settings/account_and_limit_settings.md#customize-session-duration-for-git-operations-when-2fa-is-enabled).
+On self-managed GitLab, by default this feature is not available. To make it available, an administrator can [enable the feature flag](../administration/feature_flags.md) named `two_factor_for_cli`. On GitLab.com, this feature is not available. The feature is not ready for production use. This feature flag also affects [session duration for Git Operations when 2FA is enabled](../administration/settings/account_and_limit_settings.md#customize-session-duration-for-git-operations-when-2fa-is-enabled).
You can enforce 2FA for [Git over SSH operations](../development/gitlab_shell/features.md#git-operations). However, you should use
[ED25519_SK](../user/ssh.md#ed25519_sk-ssh-keys) or [ECDSA_SK](../user/ssh.md#ecdsa_sk-ssh-keys) SSH keys instead. 2FA is enforced for Git operations only, and internal commands such as [`personal_access_token`](../development/gitlab_shell/features.md#personal-access-token) are excluded.
@@ -165,7 +165,7 @@ SSH key.
2FA does not protect users with compromised *private* SSH keys.
Once an OTP is verified, anyone can run Git over SSH with that private SSH key for
-the configured [session duration](../user/admin_area/settings/account_and_limit_settings.md#customize-session-duration-for-git-operations-when-2fa-is-enabled).
+the configured [session duration](../administration/settings/account_and_limit_settings.md#customize-session-duration-for-git-operations-when-2fa-is-enabled).
<!-- ## Troubleshooting
diff --git a/doc/security/unlock_user.md b/doc/security/unlock_user.md
index e8215616e1b..5e21cad8f3e 100644
--- a/doc/security/unlock_user.md
+++ b/doc/security/unlock_user.md
@@ -12,7 +12,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 administrator 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](../administration/admin_area.md) or the command line in under 10 minutes.
## GitLab.com users
diff --git a/doc/security/webhooks.md b/doc/security/webhooks.md
index 13b34d28614..78c32341bf6 100644
--- a/doc/security/webhooks.md
+++ b/doc/security/webhooks.md
@@ -155,7 +155,7 @@ Most GitLab instances have their `public_runner_releases_url` set to
`https://gitlab.com/api/v4/projects/gitlab-org%2Fgitlab-runner/releases`,
which can prevent you from [filtering requests](#filter-requests).
-To resolve this issue, [configure GitLab to no longer fetch runner release version data from GitLab.com](../user/admin_area/settings/continuous_integration.md#disable-runner-version-management).
+To resolve this issue, [configure GitLab to no longer fetch runner release version data from GitLab.com](../administration/settings/continuous_integration.md#disable-runner-version-management).
### GitLab subscription management is blocked
diff --git a/doc/subscriptions/bronze_starter.md b/doc/subscriptions/bronze_starter.md
index b981a63a8b7..1f84c27d27a 100644
--- a/doc/subscriptions/bronze_starter.md
+++ b/doc/subscriptions/bronze_starter.md
@@ -15,13 +15,13 @@ New paid features will not be released in Bronze and Starter tiers after GitLab
The following features remain available to Bronze and Starter customers, even though
the tiers are no longer mentioned in GitLab documentation:
-- [Activate GitLab EE with a license](../user/admin_area/license.md)
-- [Add a help message to the sign-in page](../user/admin_area/settings/help_page.md#add-a-help-message-to-the-sign-in-page)
+- [Activate GitLab EE with a license](../administration/license.md)
+- [Add a help message to the sign-in page](../administration/settings/help_page.md#add-a-help-message-to-the-sign-in-page)
- [Burndown and burnup charts](../user/project/milestones/burndown_and_burnup_charts.md) in the [Milestone View](../user/project/milestones/index.md#burndown-charts),
- [Code owners](../user/project/codeowners/index.md)
- Description templates:
- [Setting a default template for merge requests and issues](../user/project/description_templates.md#set-a-default-template-for-merge-requests-and-issues)
-- [Email from GitLab](../user/admin_area/email_from_gitlab.md)
+- [Email from GitLab](../administration/email_from_gitlab.md)
- Groups:
- [Creating group memberships via CN](../user/group/access_and_permissions.md#create-group-links-via-cn)
- [Group push rules](../user/group/access_and_permissions.md#group-push-rules)
@@ -84,7 +84,7 @@ the tiers are no longer mentioned in GitLab documentation:
- Reference Architecture information:
- [Zero downtime upgrades](../administration/reference_architectures/index.md#zero-downtime-upgrades)
- Repositories:
- - [Repository size limit](../user/admin_area/settings/account_and_limit_settings.md#repository-size-limit)
+ - [Repository size limit](../administration/settings/account_and_limit_settings.md#repository-size-limit)
- Repository mirroring:
- [Pull mirroring](../user/project/repository/mirror/pull.md) outside repositories in a GitLab repository
- [Overwrite diverged branches](../user/project/repository/mirror/pull.md#overwrite-diverged-branches)
diff --git a/doc/subscriptions/choosing_subscription.md b/doc/subscriptions/choosing_subscription.md
index 07b04c83bd7..ccb68792531 100644
--- a/doc/subscriptions/choosing_subscription.md
+++ b/doc/subscriptions/choosing_subscription.md
@@ -30,8 +30,10 @@ A new subscription must be purchased and applied as needed.
## Choose a GitLab tier
Pricing is [tier-based](https://about.gitlab.com/pricing/), allowing you to choose
-the features which fit your budget. For information on what features are available
-at each tier for each product, see the [GitLab self-managed feature comparison](https://about.gitlab.com/pricing/feature-comparison/).
+the features that fit your budget.
+
+For more details, see
+[a comparison of self-managed features available in each tier](https://about.gitlab.com/pricing/feature-comparison/).
## Find your subscription
diff --git a/doc/subscriptions/community_programs.md b/doc/subscriptions/community_programs.md
index 5e11292a084..26d221cf62d 100644
--- a/doc/subscriptions/community_programs.md
+++ b/doc/subscriptions/community_programs.md
@@ -10,11 +10,11 @@ GitLab provides the following community program subscriptions.
## GitLab for Education
-For qualifying non-profit educational institutions, the [GitLab for Education Program](https://about.gitlab.com/solutions/education/) provides GitLab Ultimate, plus 50,000 units of compute per month. The subscription granted under GitLab for Education can only be used for instructional use or non-commercial academic research. For more information—including instructions for applying to the program and renewing program membership—see the [GitLab for Education Program page](https://about.gitlab.com/solutions/education/) and the [GitLab handbook](https://about.gitlab.com/handbook/marketing/community-relations/community-programs/education-program/).
+For qualifying non-profit educational institutions, the [GitLab for Education Program](https://about.gitlab.com/solutions/education/) provides GitLab Ultimate, plus 50,000 compute minutes per month. The subscription granted under GitLab for Education can only be used for instructional use or non-commercial academic research. For more information—including instructions for applying to the program and renewing program membership—see the [GitLab for Education Program page](https://about.gitlab.com/solutions/education/) and the [GitLab handbook](https://about.gitlab.com/handbook/marketing/community-relations/community-programs/education-program/).
## GitLab for Open Source
-For qualifying open source projects, the [GitLab for Open Source Program](https://about.gitlab.com/solutions/open-source/) provides GitLab Ultimate, plus 50,000 units of compute per month. For more information—including instructions for applying to the program and renewing program membership—see the [GitLab for Open Source Program page](https://about.gitlab.com/solutions/open-source/) and the [GitLab handbook](https://about.gitlab.com/handbook/marketing/community-relations/community-programs/opensource-program/).
+For qualifying open source projects, the [GitLab for Open Source Program](https://about.gitlab.com/solutions/open-source/) provides GitLab Ultimate, plus 50,000 compute minutes per month. For more information—including instructions for applying to the program and renewing program membership—see the [GitLab for Open Source Program page](https://about.gitlab.com/solutions/open-source/) and the [GitLab handbook](https://about.gitlab.com/handbook/marketing/community-relations/community-programs/opensource-program/).
### Meeting GitLab for Open Source Program requirements
@@ -77,4 +77,4 @@ Exceptions to this public visibility requirement apply in select circumstances (
## GitLab for Startups
-For qualifying startups, the [GitLab for Startups](https://about.gitlab.com/solutions/startups/) program provides GitLab Ultimate, plus 50,000 units of compute per month for 12 months. For more information—including instructions for applying to the program and renewing program membership—see the [GitLab for Startups Program page](https://about.gitlab.com/solutions/startups/) and the [GitLab handbook](https://about.gitlab.com/handbook/marketing/community-relations/community-programs/startups-program/).
+For qualifying startups, the [GitLab for Startups](https://about.gitlab.com/solutions/startups/) program provides GitLab Ultimate, plus 50,000 compute minutes per month for 12 months. For more information—including instructions for applying to the program and renewing program membership—see the [GitLab for Startups Program page](https://about.gitlab.com/solutions/startups/) and the [GitLab handbook](https://about.gitlab.com/handbook/marketing/community-relations/community-programs/startups-program/).
diff --git a/doc/subscriptions/customers_portal.md b/doc/subscriptions/customers_portal.md
index 07e6e952419..25f36432f4b 100644
--- a/doc/subscriptions/customers_portal.md
+++ b/doc/subscriptions/customers_portal.md
@@ -6,22 +6,39 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# The Customers Portal
-For some management tasks for your subscription and account, you use the Customers Portal.
+For some management tasks for your subscription and account, such as purchasing additional seats or storage and viewing invoices, you use the Customers Portal. See the following pages for specific instructions on managing your subscription:
+
+- [GitLab SaaS subscription](gitlab_com/index.md)
+- [Self-managed subscription](self_managed/index.md)
If you made your purchase through an authorized reseller, you must contact them directly to make changes to your subscription (your subscriptions are read-only).
-You can also specifically manage your [GitLab SaaS subscription](gitlab_com/index.md)
-or [self-managed subscription](self_managed/index.md).
+## Sign in to Customers Portal
-## Change account owner information
+You can sign in to Customers Portal either with your GitLab.com account or your email and password (if you have not yet [linked your Customers Portal account to your GitLab.com account](#link-a-gitlabcom-account)).
+
+NOTE:
+If you registered for Customers Portal with your GitLab.com account, sign in with this account.
+
+To sign in to Customers Portal using your GitLab.com account:
-Account owner personal details are used on invoices. The account owner email address is used for the Customers Portal legacy login and license-related email.
+1. Navigate to [Customers Portal](https://customers.gitlab.com/customers/sign_in).
+1. Select **Continue with your GitLab.com account**.
+
+To sign in to Customers Portal using your email and password:
+
+1. Navigate to [Customers Portal](https://customers.gitlab.com/customers/sign_in).
+1. Select **Sign in with your email and password**.
+1. Provide the **Email** and **Password** for your Customers Portal account.
+1. Select **Sign in**.
+
+## Change account owner information
-If you have registered a Customers Portal account through a GitLab.com account, the GitLab.com account is used for login.
+The account owner's personal details are used on invoices. The account owner's email address is used for the [Customers Portal legacy sign-in](#sign-in-to-customers-portal) and license-related email.
To change account owner information, including name, billing address, and email address:
-1. Log in to the [Customers Portal](https://customers.gitlab.com/customers/sign_in).
+1. Sign in to the [Customers Portal](https://customers.gitlab.com/customers/sign_in).
1. Select **My account > Account details**.
1. Expand the **Personal details** section.
1. Edit the personal details.
@@ -37,7 +54,7 @@ to another person, after you enter that person's personal details, you must also
To change your company details, including company name and VAT number:
-1. Log in to the [Customers Portal](https://customers.gitlab.com/customers/sign_in).
+1. Sign in to the [Customers Portal](https://customers.gitlab.com/customers/sign_in).
1. Select **My account > Account details**.
1. Expand the **Company details** section.
1. Edit the company details.
@@ -54,7 +71,7 @@ If you would like to use an alternative method to pay, please
To change your payment method:
-1. Log in to the [Customers Portal](https://customers.gitlab.com/customers/sign_in).
+1. Sign in to the [Customers Portal](https://customers.gitlab.com/customers/sign_in).
1. Select **My account > Payment methods**.
1. **Edit** an existing payment method's information or **Add new payment method**.
1. Select **Save Changes**.
@@ -64,7 +81,7 @@ To change your payment method:
Automatic renewal of a subscription is charged to your default payment method. To mark a payment
method as the default:
-1. Log in to the [Customers Portal](https://customers.gitlab.com/customers/sign_in).
+1. Sign in to the [Customers Portal](https://customers.gitlab.com/customers/sign_in).
1. Select **My account > Payment methods**.
1. **Edit** the selected payment method and check the **Make default payment method** checkbox.
1. Select **Save Changes**.
@@ -75,10 +92,10 @@ Follow this guideline if you have a legacy Customers Portal account and use an e
To link a GitLab.com account to your Customers Portal account:
-1. Log in to the [Customers Portal](https://customers.gitlab.com/customers/sign_in?legacy=true) using email and password.
+1. Sign in to the [Customers Portal](https://customers.gitlab.com/customers/sign_in?legacy=true) using email and password.
1. On the Customers Portal page, select **My account > Account details**.
1. Under **Your GitLab.com account**, select **Link account**.
-1. Log in to the [GitLab.com](https://gitlab.com/users/sign_in) account you want to link to the Customers Portal account.
+1. Sign in to the [GitLab.com](https://gitlab.com/users/sign_in) account you want to link to the Customers Portal account.
## Change the linked account
@@ -88,17 +105,38 @@ If you have a legacy Customers Portal account that is not linked to a GitLab.com
To change the GitLab.com account linked to your Customers Portal account:
-1. Log in to the [Customers Portal](https://customers.gitlab.com/customers/sign_in).
+1. Sign in to the [Customers Portal](https://customers.gitlab.com/customers/sign_in).
1. In a separate browser tab, go to [GitLab.com](https://gitlab.com/users/sign_in) and ensure you are not logged in.
1. On the Customers Portal page, select **My account > Account details**.
1. Under **Your GitLab.com account**, select **Change linked account**.
-1. Log in to the [GitLab.com](https://gitlab.com/users/sign_in) account you want to link to the Customers Portal account.
+1. Sign in to the [GitLab.com](https://gitlab.com/users/sign_in) account you want to link to the Customers Portal account.
## Change Customers Portal account password
To change the password for this customers portal account:
-1. Log in to the [Customers Portal](https://customers.gitlab.com/customers/sign_in).
+1. Sign in to the [Customers Portal](https://customers.gitlab.com/customers/sign_in).
1. Select the **My account** dropdown list and select **Account details**.
1. Make the required changes to the **Your password** section.
1. Select **Save changes**.
+
+## Customers that purchased through a reseller
+
+If you purchased a subscription through an authorized reseller (including GCP and AWS marketplaces), you have access to the Customers Portal to:
+
+- View your subscription.
+- Associate your subscription with the relevant group (GitLab SaaS) or download the license (GitLab self-managed).
+- Manage contact information.
+
+Other changes and requests must be done through the reseller, including:
+
+- Changes to the subscription.
+- Purchase of additional seats, Storage, or Compute.
+- Requests for invoices, because those are issued by the reseller, not GitLab.
+
+Resellers do not have access to the Customers Portal, or their customers' accounts.
+
+After your subscription order is processed, you will receive several emails:
+
+- A "Welcome to the Customers Portal" email, including instructions on how to log in.
+- A purchase confirmation email with instructions on how to provision access.
diff --git a/doc/subscriptions/gitlab_com/index.md b/doc/subscriptions/gitlab_com/index.md
index 28eff9032f0..8cd5777e4cb 100644
--- a/doc/subscriptions/gitlab_com/index.md
+++ b/doc/subscriptions/gitlab_com/index.md
@@ -16,7 +16,7 @@ You don't need to install anything to use GitLab SaaS, you only need to
The subscription determines which features are available for your private projects. Organizations with public open source projects can actively apply to our [GitLab for Open Source Program](https://about.gitlab.com/solutions/open-source/join/).
-Qualifying open source projects also get 50,000 units of compute and free access to the **Ultimate** tier
+Qualifying open source projects also get 50,000 compute minutes and free access to the **Ultimate** tier
through the [GitLab for Open Source program](https://about.gitlab.com/solutions/open-source/).
## Obtain a GitLab SaaS subscription
@@ -103,6 +103,11 @@ To view a list of seats being used:
1. Select **Settings > Usage Quotas**.
1. On the **Seats** tab, view usage information.
+For each user, a list shows groups and projects where the user is a direct member.
+
+- **Group invite** indicates the user is a member of a [group shared with a group](../../user/group/manage.md#share-a-group-with-another-group).
+- **Project invite** indicates the user is a member of a [group shared with a project](../../user/project/members/share_project_with_groups.md#share-a-project-with-a-group).
+
The data in seat usage listing, **Seats in use**, and **Seats in subscription** are updated live.
The counts for **Max seats used** and **Seats owed** are updated once per day.
@@ -347,12 +352,13 @@ If you have difficulty during the renewal process, contact the
Contacts can renew a subscription, cancel a subscription, or transfer the subscription to a different namespace.
-To change the contacts:
+For information about how to transfer ownership of the Customers Portal account to another person, see
+[Change account owner information](../customers_portal.md#change-account-owner-information).
+
+To add a secondary contact for your subscription:
1. Ensure an account exists in the
[Customers Portal](https://customers.gitlab.com/customers/sign_in) for the user you want to add.
-1. Verify you have access to at least one of
- [these requirements](https://about.gitlab.com/handbook/support/license-and-renewals/workflows/customersdot/associating_purchases.html).
1. [Create a ticket with the Support team](https://support.gitlab.com/hc/en-us/requests/new?ticket_form_id=360000071293). Include any relevant material in your request.
## Compute
@@ -363,10 +369,10 @@ on GitLab shared runners.
Refer to [Compute usage](../../ci/pipelines/cicd_minutes.md)
for more information.
-### Purchase additional units of compute
+### Purchase additional compute minutes
-You can [purchase additional units of compute](../../ci/pipelines/cicd_minutes.md#purchase-additional-units-of-compute)
-for your personal or group namespace. Units of compute are a **one-time purchase**, so they do not renew.
+You can [purchase additional compute minutes](../../ci/pipelines/cicd_minutes.md#purchase-additional-compute-minutes)
+for your personal or group namespace. Compute minutes are a **one-time purchase**, so they do not renew.
## Add-on subscription for additional Storage and Transfer
diff --git a/doc/subscriptions/gitlab_dedicated/index.md b/doc/subscriptions/gitlab_dedicated/index.md
index f14f38f4717..75fcdb70161 100644
--- a/doc/subscriptions/gitlab_dedicated/index.md
+++ b/doc/subscriptions/gitlab_dedicated/index.md
@@ -43,7 +43,7 @@ GitLab Dedicated supports instance-level [SAML OmniAuth](../../integration/saml.
GitLab Dedicated offers public connectivity by default with support for IP allowlists. You can [optionally specify a list of IP addresses](../../administration/dedicated/index.md#ip-allowlist) that can access your GitLab Dedicated instance. Subsequently, when an IP not on the allowlist tries to access your instance the connection is refused.
-Private connectivity via [AWS PrivateLink](https://aws.amazon.com/privatelink/) is also offered as an option. Both [inbound](../../administration/dedicated/index.md#inbound-private-link) and [outbound](../../administration/dedicated/index.md#outbound-private-link) PrivateLinks are supported. When connecting to an internal service running in your VPC over HTTPS via PrivateLink, GitLab Dedicated supports the ability to use a private SSL certificate, which can be provided when [updating your instance configuration](../../administration/dedicated/index.md#custom-certificates).
+Private connectivity via [AWS PrivateLink](https://aws.amazon.com/privatelink/) is also offered as an option. Both [inbound](../../administration/dedicated/index.md#inbound-private-link) and [outbound](../../administration/dedicated/index.md#outbound-private-link) PrivateLinks are supported. When connecting to internal resources over an outbound PrivateLink with non public certificates, you can specify a list of certificates that are trusted by GitLab. These certificates can be provided when [updating your instance configuration](../../administration/dedicated/index.md#custom-certificates).
#### Encryption
@@ -92,7 +92,7 @@ GitLab may conduct unscheduled maintenance to address high-severity issues affec
### Application
-GitLab Dedicated comes with the self-managed [Ultimate feature set](https://about.gitlab.com/pricing/feature-comparison/) with the exception of the unsupported features [listed below](#features-that-are-not-available).
+GitLab Dedicated comes with the self-managed [Ultimate feature set](https://about.gitlab.com/pricing/feature-comparison/) with the exception of the [unsupported features](#features-that-are-not-available) listed below.
#### GitLab Runners
diff --git a/doc/subscriptions/self_managed/index.md b/doc/subscriptions/self_managed/index.md
index d6e21c3683b..e754c2a06a2 100644
--- a/doc/subscriptions/self_managed/index.md
+++ b/doc/subscriptions/self_managed/index.md
@@ -15,12 +15,12 @@ To subscribe to GitLab for a GitLab self-managed installation:
1. Go to the [Customers Portal](https://customers.gitlab.com/) and purchase a GitLab self-managed plan.
1. After purchase, an activation code is sent to the email address associated with the Customers Portal account.
- You must [add this code to your GitLab instance](../../user/admin_area/license.md).
+ You must [add this code to your GitLab instance](../../administration/license.md).
NOTE:
If you're purchasing a subscription for an existing **Free** GitLab self-managed
instance, ensure you're purchasing enough seats to
-[cover your users](../../user/admin_area/index.md#administering-users).
+[cover your users](../../administration/admin_area.md#administering-users).
### Subscription seats
@@ -47,10 +47,10 @@ The lists of users are displayed.
A _billable user_ counts against the number of subscription seats. Every user is considered a
billable user, with the following exceptions:
-- [Deactivated users](../../user/admin_area/moderate_users.md#deactivate-a-user) and
- [blocked users](../../user/admin_area/moderate_users.md#block-a-user) don't count as billable users in the current subscription. When they are either deactivated or blocked they release a _billable user_ seat. However, they may
+- [Deactivated users](../../administration/moderate_users.md#deactivate-a-user) and
+ [blocked users](../../administration/moderate_users.md#block-a-user) don't count as billable users in the current subscription. When they are either deactivated or blocked they release a _billable user_ seat. However, they may
count toward overages in the subscribed seat count.
-- Users who are [pending approval](../../user/admin_area/moderate_users.md#users-pending-approval).
+- Users who are [pending approval](../../administration/moderate_users.md#users-pending-approval).
- Users with only the [Minimal Access role](../../user/permissions.md#users-with-minimal-access) on self-managed Ultimate subscriptions or any GitLab.com subscriptions.
- Users with only the [Guest or Minimal Access roles on an Ultimate subscription](#free-guest-users).
- Users without project or group memberships on an Ultimate subscription.
@@ -101,7 +101,7 @@ The user must not be assigned any other role, anywhere in the instance.
NOTE:
If a user creates a project, they are assigned the Maintainer or Owner role.
To prevent a user from creating projects, as an administrator, you can mark the user
-as [external](../../user/admin_area/external_users.md).
+as [external](../../administration/external_users.md).
## Tips for managing users and subscription seats
@@ -114,14 +114,14 @@ Managing the number of users against the number of subscription seats can be a c
GitLab has several features which can help you manage the number of users:
-- Enable the [**Require administrator approval for new sign ups**](../../user/admin_area/settings/sign_up_restrictions.md#require-administrator-approval-for-new-sign-ups)
+- Enable the [**Require administrator approval for new sign ups**](../../administration/settings/sign_up_restrictions.md#require-administrator-approval-for-new-sign-ups)
option.
- Enable `block_auto_created_users` for new sign-ups via [LDAP](../../administration/auth/ldap/index.md#basic-configuration-settings) or [OmniAuth](../../integration/omniauth.md#configure-common-settings).
-- Enable the [User cap](../../user/admin_area/settings/sign_up_restrictions.md#user-cap)
+- Enable the [User cap](../../administration/settings/sign_up_restrictions.md#user-cap)
option. **Available in GitLab 13.7 and later**.
-- [Disable new sign-ups](../../user/admin_area/settings/sign_up_restrictions.md), and instead manage new
+- [Disable new sign-ups](../../administration/settings/sign_up_restrictions.md), and instead manage new
users manually.
-- View a breakdown of users by role in the [Users statistics](../../user/admin_area/index.md#users-statistics) page.
+- View a breakdown of users by role in the [Users statistics](../../administration/admin_area.md#users-statistics) page.
## Subscription data synchronization
@@ -132,7 +132,7 @@ To enable subscription data synchronization you must have:
- GitLab Enterprise Edition (EE), version 14.1 or later.
- Connection to the internet, and must not have an offline environment.
-- [Activated](../../user/admin_area/license.md) your instance with an activation code.
+- [Activated](../../administration/license.md) your instance with an activation code.
When your instance is activated, and data is synchronized, the following processes are automated:
@@ -345,7 +345,7 @@ A payment receipt is emailed to you, which you can also access in the Customers
If your subscription was activated with an activation code, the additional seats are reflected in
your instance immediately. If you're using a license file, you receive an updated file.
-To add the seats, [add the license file](../../user/admin_area/license_file.md)
+To add the seats, [add the license file](../../administration/license_file.md)
to your instance.
### Renew subscription manually
@@ -354,7 +354,7 @@ Starting 30 days before a subscription expires, a banner with the expiry date di
You should follow these steps during renewal:
-1. Prior to the renewal date, prune any inactive or unwanted users by [blocking them](../../user/admin_area/moderate_users.md#block-a-user).
+1. Prior to the renewal date, prune any inactive or unwanted users by [blocking them](../../administration/moderate_users.md#block-a-user).
1. Determine if you have a need for user growth in the upcoming subscription.
1. Log in to the [Customers Portal](https://customers.gitlab.com/customers/sign_in) and select the **Renew** button beneath your existing subscription.
The **Renew** button remains disabled (grayed-out) until 15 days before a subscription expires.
@@ -367,7 +367,7 @@ You can hover your mouse on the **Renew** button to see the date when it will be
1. Enter the number of [users over subscription](#users-over-subscription) in the second box for the user overage incurred in your previous subscription term.
1. Review your renewal details and complete the payment process.
1. An activation code for the renewal term is available on the [Manage Purchases](https://customers.gitlab.com/subscriptions) page on the relevant subscription card. Select **Copy activation code** to get a copy.
-1. [Add the activation code](../../user/admin_area/license.md) to your instance.
+1. [Add the activation code](../../administration/license.md) to your instance.
An invoice is generated for the renewal and available for viewing or download on the [View invoices](https://customers.gitlab.com/receipts) page. If you have difficulty during the renewal process, contact our [support team](https://support.gitlab.com/hc/en-us/requests/new?ticket_form_id=360000071293) for assistance.
@@ -421,19 +421,20 @@ The following is emailed to you:
[**View invoices**](https://customers.gitlab.com/receipts).
- A new activation code for your license.
-[Add the activation code](../../user/admin_area/license.md) to your instance.
+[Add the activation code](../../administration/license.md) to your instance.
The new tier takes effect when the new license is activated.
## Add or change the contacts for your subscription
Contacts can renew a subscription, cancel a subscription, or transfer the subscription to a different namespace.
-To change the contacts:
+For information about how to transfer ownership of the Customers Portal account to another person, see
+[Change account owner information](../customers_portal.md#change-account-owner-information).
+
+To add a secondary contact for your subscription:
1. Ensure an account exists in the
[Customers Portal](https://customers.gitlab.com/customers/sign_in) for the user you want to add.
-1. Verify you have access to at least one of
- [these requirements](https://about.gitlab.com/handbook/support/license-and-renewals/workflows/customersdot/associating_purchases.html).
1. [Create a ticket with the Support team](https://support.gitlab.com/hc/en-us/requests/new?ticket_form_id=360000071293). Include any relevant material in your request.
## Subscription expiry
@@ -450,7 +451,7 @@ before this occurs.
## Activate a license file or key
-If you have a license file or key, you can activate it [in the Admin Area](../../user/admin_area/license_file.md#activate-gitlab-ee-with-a-license-file-or-key).
+If you have a license file or key, you can activate it [in the Admin Area](../../administration/license_file.md#activate-gitlab-ee-with-a-license-file-or-key).
## Contact Support
diff --git a/doc/topics/autodevops/cloud_deployments/auto_devops_with_eks.md b/doc/topics/autodevops/cloud_deployments/auto_devops_with_eks.md
index 6348e3a5fa0..b85b99d1874 100644
--- a/doc/topics/autodevops/cloud_deployments/auto_devops_with_eks.md
+++ b/doc/topics/autodevops/cloud_deployments/auto_devops_with_eks.md
@@ -200,7 +200,7 @@ to monitor it.
After successfully deploying your application, you can view its website and check
on its health on the **Environments** page by navigating to
-**Deployments > Environments**. This page displays details about
+**Operate > Environments**. This page displays details about
the deployed applications, and the right-hand column displays icons that link
you to common environment tasks:
@@ -297,4 +297,3 @@ and customized to fit your workflow. Here are some helpful resources for further
1. [Incremental rollout to production](../cicd_variables.md#incremental-rollout-to-production)
1. [Disable jobs you don't need with CI/CD variables](../cicd_variables.md)
1. [Use your own buildpacks to build your application](../customize.md#custom-buildpacks)
-1. [Prometheus monitoring](../../../user/project/integrations/prometheus.md)
diff --git a/doc/topics/autodevops/cloud_deployments/auto_devops_with_gke.md b/doc/topics/autodevops/cloud_deployments/auto_devops_with_gke.md
index dac85926ff5..f6a6c16e010 100644
--- a/doc/topics/autodevops/cloud_deployments/auto_devops_with_gke.md
+++ b/doc/topics/autodevops/cloud_deployments/auto_devops_with_gke.md
@@ -204,7 +204,7 @@ to monitor it.
After successfully deploying your application, you can view its website and check
on its health on the **Environments** page by navigating to
-**Deployments > Environments**. This page displays details about
+**Operate > Environments**. This page displays details about
the deployed applications, and the right-hand column displays icons that link
you to common environment tasks:
@@ -302,4 +302,3 @@ and customized to fit your workflow. Here are some helpful resources for further
1. [Incremental rollout to production](../cicd_variables.md#incremental-rollout-to-production)
1. [Disable jobs you don't need with CI/CD variables](../cicd_variables.md)
1. [Use your own buildpacks to build your application](../customize.md#custom-buildpacks)
-1. [Prometheus monitoring](../../../user/project/integrations/prometheus.md)
diff --git a/doc/topics/autodevops/index.md b/doc/topics/autodevops/index.md
index 10979f0bb21..d5ebd4e9fcb 100644
--- a/doc/topics/autodevops/index.md
+++ b/doc/topics/autodevops/index.md
@@ -174,7 +174,7 @@ To enable Auto DevOps for your instance:
When enabled, Auto DevOps attempts to run pipelines in every project. If the
pipeline fails in a particular project, it disables itself.
-GitLab administrators can change this in the [Auto DevOps settings](../../user/admin_area/settings/continuous_integration.md#auto-devops).
+GitLab administrators can change this in the [Auto DevOps settings](../../administration/settings/continuous_integration.md#auto-devops).
If a [CI/CD configuration file](../../ci/yaml/index.md) is present,
it remains unchanged and Auto DevOps does not affect it.
diff --git a/doc/topics/autodevops/multiple_clusters_auto_devops.md b/doc/topics/autodevops/multiple_clusters_auto_devops.md
index 0b1699d8230..1b6b5bc33c0 100644
--- a/doc/topics/autodevops/multiple_clusters_auto_devops.md
+++ b/doc/topics/autodevops/multiple_clusters_auto_devops.md
@@ -32,7 +32,7 @@ To deploy your environments to different Kubernetes clusters:
For deprecated, [certificate-based clusters](../../user/infrastructure/clusters/index.md#certificate-based-kubernetes-integration-deprecated):
-1. Go to the project and select **Infrastructure > Kubernetes clusters** from the left sidebar.
+1. Go to the project and select **Operate > Kubernetes clusters** from the left sidebar.
1. [Set the environment scope of each cluster](../../user/project/clusters/multiple_kubernetes_clusters.md#setting-the-environment-scope).
1. For each cluster, [add a domain based on its Ingress IP address](../../user/project/clusters/gitlab_managed_clusters.md#base-domain).
diff --git a/doc/topics/autodevops/prepare_deployment.md b/doc/topics/autodevops/prepare_deployment.md
index b71beee708e..e69c0ca0909 100644
--- a/doc/topics/autodevops/prepare_deployment.md
+++ b/doc/topics/autodevops/prepare_deployment.md
@@ -54,17 +54,17 @@ 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
-*.example.com 3600 A 1.2.3.4
+*.example.com 3600 A 10.0.2.2
```
-In this case, the deployed applications are served from `example.com`, and `1.2.3.4`
+In this case, the deployed applications are served from `example.com`, and `10.0.2.2`
is the IP address of your load balancer, generally NGINX ([see requirements](requirements.md)).
Setting up the DNS record is beyond the scope of this document; check with your
DNS provider for information.
Alternatively, you can use free public services like [nip.io](https://nip.io)
which provide automatic wildcard DNS without any configuration. For [nip.io](https://nip.io),
-set the Auto DevOps base domain to `1.2.3.4.nip.io`.
+set the Auto DevOps base domain to `10.0.2.2.nip.io`.
After completing setup, all requests hit the load balancer, which routes requests
to the Kubernetes pods running your application.
diff --git a/doc/topics/autodevops/requirements.md b/doc/topics/autodevops/requirements.md
index dd73a2056e5..bfb88cf0dc4 100644
--- a/doc/topics/autodevops/requirements.md
+++ b/doc/topics/autodevops/requirements.md
@@ -71,17 +71,17 @@ Auto DevOps requires a wildcard DNS `A` record that matches the base domains. Fo
a base domain of `example.com`, you'd need a DNS entry like:
```plaintext
-*.example.com 3600 A 1.2.3.4
+*.example.com 3600 A 10.0.2.2
```
-In this case, the deployed applications are served from `example.com`, and `1.2.3.4`
+In this case, the deployed applications are served from `example.com`, and `10.0.2.2`
is the IP address of your load balancer, generally NGINX ([see requirements](requirements.md)).
Setting up the DNS record is beyond the scope of this document; check with your
DNS provider for information.
Alternatively, you can use free public services like [nip.io](https://nip.io)
which provide automatic wildcard DNS without any configuration. For [nip.io](https://nip.io),
-set the Auto DevOps base domain to `1.2.3.4.nip.io`.
+set the Auto DevOps base domain to `10.0.2.2.nip.io`.
After completing setup, all requests hit the load balancer, which routes requests
to the Kubernetes pods running your application.
diff --git a/doc/topics/build_your_application.md b/doc/topics/build_your_application.md
index 340cb7a1db8..48e81e26b02 100644
--- a/doc/topics/build_your_application.md
+++ b/doc/topics/build_your_application.md
@@ -4,14 +4,10 @@ group: unassigned
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
-# Build your application **(FREE)**
+# Use CI/CD to build your application **(FREE)**
Add your source code to a repository, create merge requests to check in
code, and use CI/CD to generate your application. Include packages in your app and output it to a variety of environments.
-- [Repositories](../user/project/repository/index.md)
-- [Merge requests](../user/project/merge_requests/index.md)
- [CI/CD](../ci/index.md)
- [Runners](https://docs.gitlab.com/runner/)
-- [GitLab Pages](../user/project/pages/index.md)
-- [Packages and registries](../user/packages/index.md)
diff --git a/doc/topics/cron/index.md b/doc/topics/cron/index.md
index b437541e0ea..ca1bc7f40f2 100644
--- a/doc/topics/cron/index.md
+++ b/doc/topics/cron/index.md
@@ -42,6 +42,7 @@ are valid:
- Run once a month on the 2nd Monday: `0 0 * * 1#2`
- Run once a year at midnight of 1 January: `0 0 1 1 *`
- Run every other Sunday at 0900 hours: `0 9 * * sun%2`
+ - This syntax is from the [fugit modulo extension](https://github.com/floraison/fugit#the-modulo-extension)
For complete cron documentation, refer to the
[crontab(5) — Linux manual page](https://man7.org/linux/man-pages/man5/crontab.5.html).
diff --git a/doc/topics/git/git_rebase.md b/doc/topics/git/git_rebase.md
index bc9337481d4..dd2260b04dc 100644
--- a/doc/topics/git/git_rebase.md
+++ b/doc/topics/git/git_rebase.md
@@ -44,10 +44,9 @@ branch, such as `release-15-3`. You can also specify a different remote reposito
To back up a branch before taking any destructive action, like a rebase or force push:
1. Open your feature branch in the terminal: `git checkout my-feature`
-1. Check out a new branch from it: `git checkout -b my-feature-backup`
+1. Create a backup branch: `git branch my-feature-backup`
Any changes added to `my-feature` after this point are lost
if you restore from the backup branch.
-1. Change back to your original branch: `git checkout my-feature`
Your branch is backed up, and you can try a rebase or a force push.
If anything goes wrong, restore your branch from its backup:
diff --git a/doc/topics/git/lfs/index.md b/doc/topics/git/lfs/index.md
index 5f3458821dd..97e729aee55 100644
--- a/doc/topics/git/lfs/index.md
+++ b/doc/topics/git/lfs/index.md
@@ -33,7 +33,7 @@ Prerequisites:
To do this:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
-1. Select **Settings > CI/CD**.
+1. Select **Settings > General**.
1. Expand the **Visibility, project features, permissions** section.
1. Turn on the **Git Large File Storage (LFS)** toggle.
1. Select **Save changes**.
diff --git a/doc/topics/git/useful_git_commands.md b/doc/topics/git/useful_git_commands.md
index 22548be2e8b..e4c106e3e33 100644
--- a/doc/topics/git/useful_git_commands.md
+++ b/doc/topics/git/useful_git_commands.md
@@ -59,6 +59,38 @@ git revert <commit-sha>
git commit --amend
```
+### Create a new message for older commits
+
+WARNING:
+Changing commit history can disrupt others' work if they have cloned, forked, or have active branches.
+Only amend pushed commits if you're sure it's safe.
+To learn more, see [Git rebase and force push](git_rebase.md).
+
+```shell
+git rebase -i HEAD~n
+```
+
+Replace `n` with the number of commits you want to go back.
+
+This opens your text editor with a list of commits.
+In the editor, replace `pick` with `reword` for each commit you want to change the message:
+
+```shell
+reword 1fc6c95 original commit message
+pick 6b2481b another commit message
+pick 5c1291b another commit message
+```
+
+After saving and closing the file, you can update each message in a new editor window.
+
+After updating your commits, you must push them to the repository.
+As this rewrites history, a force push is required.
+To prevent unintentional overwrites, use `--force-with-lease`:
+
+```shell
+git push --force-with-lease
+```
+
### Add a file to the last commit
```shell
@@ -213,4 +245,4 @@ questions that you know someone might ask.
Each scenario can be a third-level heading, for example `### 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. -->
+but commented out to help encourage others to add to it in the future. --> \ No newline at end of file
diff --git a/doc/topics/manage_code.md b/doc/topics/manage_code.md
new file mode 100644
index 00000000000..136e471d14a
--- /dev/null
+++ b/doc/topics/manage_code.md
@@ -0,0 +1,12 @@
+---
+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/product/ux/technical-writing/#assignments
+---
+
+# Manage your code **(FREE)**
+
+Store your source files in a repository, and make changes to them by using merge requests.
+
+- [Repositories](../user/project/repository/index.md)
+- [Merge requests](../user/project/merge_requests/index.md)
diff --git a/doc/topics/offline/quick_start_guide.md b/doc/topics/offline/quick_start_guide.md
index e51e015dddf..dd739fdaf77 100644
--- a/doc/topics/offline/quick_start_guide.md
+++ b/doc/topics/offline/quick_start_guide.md
@@ -147,7 +147,7 @@ Updating CA certificates...
Runtime platform arch=amd64 os=linux pid=7 revision=1b659122 version=12.8.0
Running in system-mode.
-Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
+Please enter the gitlab-ci coordinator URL (for example, https://gitlab.com/):
https://my-host.internal
Please enter the gitlab-ci token for this runner:
XXXXXXXXXXX
@@ -158,7 +158,7 @@ Please enter the gitlab-ci tags for this runner (comma separated):
Registering runner... succeeded runner=FSMwkvLZ
Please enter the executor: custom, docker, virtualbox, kubernetes, docker+machine, docker-ssh+machine, docker-ssh, parallels, shell, ssh:
docker
-Please enter the default Docker image (e.g. ruby:2.6):
+Please enter the default Docker image (for example, ruby:2.6):
ruby:2.6
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
```
@@ -204,7 +204,7 @@ Version Check and Service Ping improve the GitLab user experience and ensure tha
users are on the most up-to-date instances of GitLab. These two services can be turned off for offline
environments so that they do not attempt and fail to reach out to GitLab services.
-For more information, see [Enable or disable usage statistics](../../user/admin_area/settings/usage_statistics.md#enable-or-disable-usage-statistics).
+For more information, see [Enable or disable usage statistics](../../administration/settings/usage_statistics.md#enable-or-disable-usage-statistics).
### Configure NTP
@@ -262,7 +262,7 @@ PKG_METADATA_MANIFEST_OUTPUT_FILE="/tmp/license_db_export_manifest.json"
PKG_METADATA_DOWNLOADS_OUTPUT_FILE="/tmp/license_db_object_links.tsv"
# Download the contents of the bucket
-curl --silent --show-error --request GET "https://storage.googleapis.com/storage/v1/b/prod-export-license-bucket-1a6c642fc4de57d4/o" > "$PKG_METADATA_MANIFEST_OUTPUT_FILE"
+curl --silent --show-error --request GET "https://storage.googleapis.com/storage/v1/b/prod-export-license-bucket-1a6c642fc4de57d4/o?maxResults=7500" > "$PKG_METADATA_MANIFEST_OUTPUT_FILE"
# Parse the links and names for the bucket objects and output them into a tsv file
jq -r '.items[] | [.name, .mediaLink] | @tsv' "$PKG_METADATA_MANIFEST_OUTPUT_FILE" > "$PKG_METADATA_DOWNLOADS_OUTPUT_FILE"
diff --git a/doc/topics/release_your_application.md b/doc/topics/release_your_application.md
index e8dba553cab..3cc5e9a66b3 100644
--- a/doc/topics/release_your_application.md
+++ b/doc/topics/release_your_application.md
@@ -15,8 +15,10 @@ release features incrementally.
- [Environments and deployments](../ci/environments/index.md)
- [Releases](../user/project/releases/index.md)
+- [Packages and registries](../user/packages/index.md)
- [Review Apps](../ci/review_apps/index.md)
- [Feature flags](../operations/feature_flags.md)
+- [GitLab Pages](../user/project/pages/index.md)
## Related topics
diff --git a/doc/tutorials/configure_gitlab_runner_to_use_gke/index.md b/doc/tutorials/configure_gitlab_runner_to_use_gke/index.md
index e10c5d37ba0..05340994edf 100644
--- a/doc/tutorials/configure_gitlab_runner_to_use_gke/index.md
+++ b/doc/tutorials/configure_gitlab_runner_to_use_gke/index.md
@@ -26,7 +26,7 @@ To configure GitLab Runner to use the GKE:
Before you can configure GitLab Runner to use the GKE you must:
- Have a project where you have the Maintainer or Owner role. If you don't have a project, you can [create it](../../user/project/index.md).
-- [Obtain the project runner registration token](../../ci/runners/register_runner.md#generate-a-registration-token-deprecated).
+- [Obtain the project runner registration token](../../ci/runners/runners_scope.md#create-a-project-runner-with-a-registration-token-deprecated).
- Install GitLab Runner.
## Set up your environment
diff --git a/doc/tutorials/dependency_scanning.md b/doc/tutorials/dependency_scanning.md
index 51424c3319e..90bc2ec96a2 100644
--- a/doc/tutorials/dependency_scanning.md
+++ b/doc/tutorials/dependency_scanning.md
@@ -104,7 +104,7 @@ scanned for vulnerabilities.
Use the content shown in the [Yarn lockfile](#yarn-lock-file-content) section.
-1. Go to **CI/CD > Pipelines** and confirm that the latest pipeline completed successfully.
+1. Go to **Build > Pipelines** and confirm that the latest pipeline completed successfully.
In the pipeline, dependency scanning runs and the vulnerabilities are detected automatically.
@@ -116,7 +116,7 @@ medium severity vulnerabilities and confirm only the high severity vulnerability
To triage the vulnerabilities:
-1. Go to **Security and Compliance > Vulnerability report**.
+1. Go to **Secure > Vulnerability report**.
1. Select each of the medium severity vulnerabilities by selecting the checkbox in each row.
1. From the **Set status** dropdown list select **Dismiss**. From the **Dismissal reason** dropdown
list select **Used in tests**, add the comment "Used in tests", then select **Change status**.
@@ -161,12 +161,12 @@ To fix the vulnerability:
```
1. Switch to the GitLab browser tab.
-1. Go to **Merge requests**, then select **Create merge request**.
+1. Go to **Code > Merge requests**, then select **Create merge request**.
1. On the **New merge request** page, scroll to the bottom and select **Create merge request**.
Wait for the merge request pipeline to complete.
1. Refresh the page, then select **Merge**.
1. Wait for the pipeline to complete successfully.
-1. Go to **Security and Compliance > Vulnerability report**.
+1. Go to **Secure > Vulnerability report**.
1. Select the **High** vulnerability's description.
A banner confirms that the vulnerability has been resolved in the `main` branch. You would
@@ -174,7 +174,7 @@ To fix the vulnerability:
`yarn.lock` file. For this tutorial, you can skip the verification step.
1. In the **Status** dropdown list, select **Resolve**, then select **Change status**.
-1. Go to **Security and Compliance > Vulnerability report**.
+1. Go to **Secure > Vulnerability report**.
You should now see _no_ vulnerabilities listed in the vulnerability report.
@@ -224,7 +224,7 @@ To add a new vulnerability:
```
1. Switch to the GitLab browser tab.
-1. Go to **Merge requests**, then select **Create merge request**.
+1. Go to **Code > Merge requests**, then select **Create merge request**.
1. On the **New merge request** page, scroll to the bottom and select **Create merge request**.
Wait for the merge request pipeline to complete, then refresh the page. The merge
diff --git a/doc/tutorials/fuzz_testing/index.md b/doc/tutorials/fuzz_testing/index.md
index 41b5068ab72..f51f7cdb427 100644
--- a/doc/tutorials/fuzz_testing/index.md
+++ b/doc/tutorials/fuzz_testing/index.md
@@ -165,7 +165,7 @@ fuzz test using the pipeline you've just created.
To run the fuzz test:
-1. On the left sidebar, select **Merge requests**.
+1. On the left sidebar, select **Code > Merge requests**.
1. Select **New merge request**.
1. In the **Source branch** section, select the `add-fuzz-test` branch.
1. In the **Target branch** section, make sure that your namespace and the `main` branch are selected.
diff --git a/doc/tutorials/hugo/index.md b/doc/tutorials/hugo/index.md
index 0e66d096fe2..97c79e77392 100644
--- a/doc/tutorials/hugo/index.md
+++ b/doc/tutorials/hugo/index.md
@@ -88,7 +88,7 @@ To build a Hugo site with GitLab, you first need to create a `.gitlab-ci.yml` fi
You specify your configuration options in a special file called `.gitlab-ci.yml`. To create a `.gitlab-ci.yml` file:
-1. On the left sidebar, select **Repository > Files**.
+1. On the left sidebar, select **Code > Repository**.
1. Above the file list, select the plus icon ( + ), then select **New file** from the dropdown list.
1. For the filename, enter `.gitlab-ci.yml`. Don't omit the period at the beginning.
1. Select the **Apply a template** dropdown list, then enter "Hugo" in the filter box.
diff --git a/doc/tutorials/left_sidebar/index.md b/doc/tutorials/left_sidebar/index.md
index f26849eac45..80fbbf2032e 100644
--- a/doc/tutorials/left_sidebar/index.md
+++ b/doc/tutorials/left_sidebar/index.md
@@ -63,7 +63,7 @@ To start, we will find the project we want to work on.
![Project-specific options](img/project_selected_v16_0.png)
-## Customize the sidebar
+## Pin frequently used items
You can pin menu items if you tend to use them frequently.
@@ -76,6 +76,9 @@ The item is displayed in the **Pinned** section:
![pinned item](img/pinned_v16_0.png)
+NOTE:
+The items you pin while you're viewing a project are different than the items you pin while viewing a group.
+
## Use a more focused view
On the left sidebar, you can also choose a more focused view into the areas you have access to.
diff --git a/doc/tutorials/make_first_git_commit/index.md b/doc/tutorials/make_first_git_commit/index.md
index b78fcd237dd..8099fc65f14 100644
--- a/doc/tutorials/make_first_git_commit/index.md
+++ b/doc/tutorials/make_first_git_commit/index.md
@@ -6,7 +6,7 @@ info: For assistance with this tutorial, see https://about.gitlab.com/handbook/p
# Tutorial: Make your first Git commit
-This tutorial is going to teach you a little bit about how Git works. It walks
+This tutorial will teach you a little bit about how Git works. It walks
you through the steps of creating your own project, editing a file, and
committing changes to a Git repository from the command line.
diff --git a/doc/tutorials/manage_user/index.md b/doc/tutorials/manage_user/index.md
index b21454fa5d5..91309d7cb42 100644
--- a/doc/tutorials/manage_user/index.md
+++ b/doc/tutorials/manage_user/index.md
@@ -389,7 +389,7 @@ add different users to that project.
You have now created a project in the parent group.
-In this project, go to **Project information > Members**.
+In this project, go to **Manage > Members**.
The existing members of the parent group (you and Alex) are already members of
this project because when your project belongs to a group, project members inherit
diff --git a/doc/tutorials/move_personal_project_to_group/index.md b/doc/tutorials/move_personal_project_to_group/index.md
index 65d7e8d07e5..29849752f5f 100644
--- a/doc/tutorials/move_personal_project_to_group/index.md
+++ b/doc/tutorials/move_personal_project_to_group/index.md
@@ -40,7 +40,7 @@ Maintainer role for the group.
If you don't have a group, create one:
-1. On the left sidebar, at the top, select **Create new...** (**{plus}**) and **New group**.
+1. On the left sidebar, at the top, select **Create new** (**{plus}**) and **New group**.
1. In **Group name**, enter a name for the group.
1. In **Group URL**, enter a path for the group, which is used as the namespace.
1. Choose the [visibility level](../../user/public_access.md).
diff --git a/doc/tutorials/protected_workflow/img/approval_rules_v16_2.png b/doc/tutorials/protected_workflow/img/approval_rules_v16_2.png
new file mode 100644
index 00000000000..a7db9488bad
--- /dev/null
+++ b/doc/tutorials/protected_workflow/img/approval_rules_v16_2.png
Binary files differ
diff --git a/doc/tutorials/protected_workflow/img/branch_is_protected_v16_2.png b/doc/tutorials/protected_workflow/img/branch_is_protected_v16_2.png
new file mode 100644
index 00000000000..c4ea048a41e
--- /dev/null
+++ b/doc/tutorials/protected_workflow/img/branch_is_protected_v16_2.png
Binary files differ
diff --git a/doc/tutorials/protected_workflow/img/branch_list_v16_1.png b/doc/tutorials/protected_workflow/img/branch_list_v16_1.png
new file mode 100644
index 00000000000..d557c4a9350
--- /dev/null
+++ b/doc/tutorials/protected_workflow/img/branch_list_v16_1.png
Binary files differ
diff --git a/doc/tutorials/protected_workflow/img/new_file_v16_2.png b/doc/tutorials/protected_workflow/img/new_file_v16_2.png
new file mode 100644
index 00000000000..d42b461f9c5
--- /dev/null
+++ b/doc/tutorials/protected_workflow/img/new_file_v16_2.png
Binary files differ
diff --git a/doc/tutorials/protected_workflow/img/new_project_v16_2.png b/doc/tutorials/protected_workflow/img/new_project_v16_2.png
new file mode 100644
index 00000000000..00effb87856
--- /dev/null
+++ b/doc/tutorials/protected_workflow/img/new_project_v16_2.png
Binary files differ
diff --git a/doc/tutorials/protected_workflow/img/protections_in_place_v16_2.png b/doc/tutorials/protected_workflow/img/protections_in_place_v16_2.png
new file mode 100644
index 00000000000..b21a714562e
--- /dev/null
+++ b/doc/tutorials/protected_workflow/img/protections_in_place_v16_2.png
Binary files differ
diff --git a/doc/tutorials/protected_workflow/img/search_engineering_v16_2.png b/doc/tutorials/protected_workflow/img/search_engineering_v16_2.png
new file mode 100644
index 00000000000..ae69b41a665
--- /dev/null
+++ b/doc/tutorials/protected_workflow/img/search_engineering_v16_2.png
Binary files differ
diff --git a/doc/tutorials/protected_workflow/img/subgroup_structure_v16_1.png b/doc/tutorials/protected_workflow/img/subgroup_structure_v16_1.png
new file mode 100644
index 00000000000..3c4ee02d0f4
--- /dev/null
+++ b/doc/tutorials/protected_workflow/img/subgroup_structure_v16_1.png
Binary files differ
diff --git a/doc/tutorials/protected_workflow/index.md b/doc/tutorials/protected_workflow/index.md
new file mode 100644
index 00000000000..5245bdc5ba9
--- /dev/null
+++ b/doc/tutorials/protected_workflow/index.md
@@ -0,0 +1,290 @@
+---
+stage: Create
+group: Code Review
+info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments"
+---
+
+<!-- vale gitlab.FutureTense = NO -->
+
+# Tutorial: Build a protected workflow for your project **(FREE)**
+
+When your team starts a new project, they need a workflow that balances efficiency
+with appropriate reviews. In GitLab, you can create user groups, combine those
+groups with branch protections, and then enforce those protections with approval rules.
+
+This tutorial sets up protections for Excelsior Project's `1.x` and `1.x.x`
+release branches, and creates a minimal approval workflow for the project:
+
+1. [Create the `engineering` group](#create-the-engineering-group)
+1. [Create subgroups in `engineering`](#create-subgroups-in-engineering)
+1. [Add users to the subgroups](#add-users-to-the-subgroups)
+1. [Create the Excelsior project](#create-the-excelsior-project)
+1. [Add a basic CODEOWNERS file](#add-a-basic-codeowners-file)
+1. [Configure approval rules](#configure-approval-rules)
+1. [Enforce CODEOWNER approval on branches](#enforce-codeowner-approval-on-branches)
+1. [Create the release branches](#create-the-release-branches)
+
+## Prerequisites
+
+- You must have the Maintainer or Owner role.
+- You need a list of managers and their email addresses.
+- You need a list of your backend and frontend engineers, and their email addresses.
+- You understand [semantic versioning](https://semver.org/) for branch names.
+
+## Create the `engineering` group
+
+Before setting up Excelsior Project, you should create a group to own
+the project. Here, you'll set up the Engineering group:
+
+1. On the left sidebar, at the top, select **Create new...** (**{plus}**) and **New group**.
+1. Select **Create group**.
+1. For **Group name**, enter `Engineering`.
+1. For the **Group URL**, enter `engineering`.
+1. Set the **Visibility level** to **Private**.
+1. Personalize your experience so GitLab shows the most helpful information to you:
+ - For **Role**, select **System administrator**.
+ - For **Who will be using this group?** select **My company or team**.
+ - For **What will you use this group for?** select **I want to store my code**.
+1. Skip inviting members to the group. You'll add users in a later section of this tutorial.
+1. Select **Create group**.
+
+Next, you'll add subgroups to this `engineering` group for more granular control.
+
+## Create subgroups in `engineering`
+
+The `engineering` group is a good start, but Excelsior Project's
+backend engineers, frontend engineers, and managers
+have different tasks, and different areas of specialty.
+
+Here, you'll create three more granular subgroups in the Engineering group to
+segment users by the type of work they do: `managers`, `frontend`, and `backend`.
+Then you'll add these new groups as members of the `engineering` group.
+
+First, create the new subgroup:
+
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**)
+ and search for `engineering`. Select the group named `Engineering`:
+
+ ![The engineering group in search results](img/search_engineering_v16_2.png)
+
+1. On the overview page for the `engineering` group, in the upper-right corner,
+ select **New subgroup**.
+1. For the **Subgroup name**, enter `Managers`.
+1. Set the **Visibility level** to **Private**.
+1. Select **Create subgroup**.
+
+Next, add the subgroup as a member of the `engineering` group:
+
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**)
+ and search for `engineering`. Select the group named `Engineering`.
+1. On the left sidebar, select **Manage > Members**.
+1. On the top right, select **Invite a group**.
+1. For **Select a group to invite**, select `Engineering / Managers`.
+1. When adding the subgroups select the role **Maintainer**.
+ This configures the highest role a member of the subgroup can inherit when accessing the `engineering` group and its projects.
+1. Optional. Select an expiration date.
+1. Select **Invite**.
+
+Repeat this process to create subgroups for `backend` and `frontend`. When you're done,
+search for the `engineering` group one more time. Its overview page should show
+three subgroups, like this:
+
+![The engineering group has three subgroups](img/subgroup_structure_v16_1.png)
+
+## Add users to the subgroups
+
+In the previous step, when you added your subgroups to the parent group (`engineering`), you limited
+members of the subgroups to the Maintainer role. This is the highest role they can inherit
+for projects owned by `engineering`. As a result:
+
+- User 1 is added to the `manager` subgroup with the Guest role, and receives
+ the Guest role on `engineering` projects.
+- User 2 is added to the `manager` group with the Owner role. This role is higher
+ than the maximum role (Maintainer) you set, so User 2 receives the Maintainer
+ role instead of Owner.
+
+To add a user to the `frontend` subgroup:
+
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**)
+ and search for `frontend`. Select the `Frontend` group.
+1. Select **Manage > Members**.
+1. Select **Invite members**.
+1. Fill in the fields. Select the **Developer** role by default, increasing it
+ to **Maintainer** if this user reviews the work of others.
+1. Select **Invite**.
+1. Repeat these steps until you've added all of the frontend engineers into the
+ `frontend` subgroup.
+
+Now do the same with the `backend` and `managers` groups. The same user can be a
+member of multiple subgroups.
+
+## Create the Excelsior project
+
+Now that your group structure is in place, create the `excelsior` project
+for the teams to work in. Because both frontend and backend engineers
+are involved, `excelsior` should belong to `engineering` instead of any of the
+smaller subgroups you just created.
+
+To create the new `excelsior` project:
+
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) and
+ search for `engineering`. Select the group named `Engineering`.
+1. On the overview page for the `engineering` group, on the left sidebar, at the top,
+ select **Create new...** (**{plus}**) and **In this group > New project/repository**.
+1. Select **Create blank project**.
+1. Enter the project details:
+ - In the **Project name** field, enter `Excelsior`. The **Project slug** should
+ auto-populate with `excelsior`.
+ - For **Visibility Level**, select **Public**.
+ - Select **Initialize repository with a README** to add an initial file to the repository.
+1. Select **Create project**.
+
+GitLab creates the `excelsior` project for you, and redirects you to its homepage.
+It should look like this:
+
+![Your new, almost-empty excelsior project](img/new_project_v16_2.png)
+
+You'll use a feature on this page in the next step.
+
+## Add a basic CODEOWNERS file
+
+Add a CODEOWNERS file to the root directory of your project to route reviews to
+the right subgroup. This example sets up four rules:
+
+- All changes should be reviewed by someone in the `engineering` group.
+- A manager should review any change to the CODEOWNERS file itself.
+- Frontend engineers should review changes to frontend files.
+- Backend engineers should review changes to backend files.
+
+NOTE:
+GitLab Free supports only optional reviews. To make reviews required, you need
+GitLab Premium or Ultimate.
+
+To add a CODEOWNERS file to your `excelsior` project:
+
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) and
+ search for `Excelsior`. Select the project named `Excelsior`.
+1. Next to the branch name, select the plus icon (**{plus}**), then **New file**:
+ ![Create a new file in the project](img/new_file_v16_2.png)
+1. For **Filename**, enter `CODEOWNERS`. This will create a file named `CODEOWNERS`
+ in the root directory of your project.
+1. Paste this example into the editing area, changing `@engineering/` if it
+ does not match your group structure:
+
+ ```plaintext
+ # All changes should be reviewed by someone in the engineering group
+ * @engineering
+
+ # A manager should review any changes to this file
+ CODEOWNERS @engineering/managers
+
+ # Frontend files should be reviewed by FE engineers
+ [Frontend] @engineering/frontend
+ *.scss
+ *.js
+
+ # Backend files should be reviewed by BE engineers
+ [Backend] @engineering/backend
+ *.rb
+ ```
+
+1. For a **Commit message**, paste in:
+
+ ```plaintext
+ Adds a new CODEOWNERS file
+
+ Creates a small CODEOWNERS file to:
+ - Route backend and frontend changes to the right teams
+ - Route CODEOWNERS file changes to managers
+ - Request all changes be reviewed
+ ```
+
+1. Select **Commit changes**.
+
+The CODEOWNERS file is now in place in the `main` branch of your project, and
+available for all future branches created in this project.
+
+## Configure approval rules
+
+The CODEOWNERS file describes the appropriate reviewers for directories and
+file types. Approval rules direct merge requests to those reviewers.
+Here, you will set up an approval rule that uses the information in your new CODEOWNERS
+file and adds protection for release branches:
+
+1. On the left sidebar, select **Settings > Merge requests**.
+1. In the **Merge request approvals** section, scroll to **Approval rules**.
+1. Select **Add approval rule**.
+1. Create a rule named `Enforce CODEOWNERS`.
+1. Select **All protected branches**.
+1. To make the rule required in GitLab Premium and GitLab Ultimate,
+ set the **Approvals required** to `1`.
+1. Add the `managers` group as approvers.
+1. Select **Add approval rule**.
+1. Scroll to **Approval settings** and make sure
+ **Prevent editing approval rules in merge requests** is selected.
+1. Select **Save changes**.
+
+When added, the `Enforce CODEOWNERS` rule looks like this:
+
+![New approval rule in place](img/approval_rules_v16_2.png)
+
+## Enforce CODEOWNER approval on branches
+
+You've configured several protections for your project, and you're now ready to
+combine those protections together to safeguard your project's important branches:
+
+- Your users are sorted into logical groups and subgroups.
+- Your CODEOWNERS file describes the subject matter experts for file types and directories.
+- Your approval rule encourages (in GitLab Free) or requires (in GitLab Premium and GitLab Ultimate)
+ the subject matter experts to review changes.
+
+Your `excelsior` project uses [semantic versioning](https://semver.org/) for
+release branch names, so you know the release branches follow the pattern `1.x`
+and `1.x.x`. You want all code added to these branches to be reviewed by subject
+matter experts, and for managers to make the final decision on what work is merged
+into the release branch.
+
+Rather than create protections for a branch at a time, configure wildcard branch rules
+to protect multiple branches:
+
+1. On the left sidebar, select **Settings > Repository**.
+1. Expand **Protected branches**.
+1. From the **Branch** dropdown list, type `1.*`, and then select **Create wildcard `1.*`**.
+1. To require everyone to submit merge requests, rather than pushing commits directly:
+ 1. Set **Allowed to merge** to **Maintainers**.
+ 1. Set **Allowed to push and merge** to **No one**.
+ 1. Leave **Allowed to force push** disabled.
+1. In GitLab Premium and GitLab Ultimate, to require Code Owners to review changes
+ to files they work on, toggle **Require approval from code owners**.
+1. Select **Protect**.
+1. In the table of branches, find the rule marked as `Default`. (Depending on
+ your version of GitLab, this branch may be named `main` or `master`.) Set the
+ values for this branch to match the settings you used for the `1.*` rule.
+
+Your rules are now in place, even though no `1.*` branches exist yet:
+
+![main and 1.x are now protected](img/branch_list_v16_1.png)
+
+## Create the release branches
+
+Now that all branch protections in place, you're ready to create your 1.0.0 release branch:
+
+1. On the left sidebar, select **Code > Branches**.
+1. On the top right, select **New branch**. Name it `1.0.0`.
+1. Select **Create branch**.
+
+The branch protections are now visible in the UI:
+
+- On the left sidebar, select **Code > Branches**. In the list of branches,
+ branch `1.0.0` should be show that it is protected:
+
+ ![List of branches, showing 1.0.0 is protected](img/branch_is_protected_v16_2.png)
+
+- On the left sidebar, select **Settings > Repository**, then expand **Branch rules**
+ to see details about all protected branches:
+
+ ![List of protected branches and their protections](img/protections_in_place_v16_2.png)
+
+Congratulations! Your engineers can work independently in their feature branches,
+and all code submitted for consideration for the 1.0.0 release branch will
+be reviewed by subject matter experts.
diff --git a/doc/update/background_migrations.md b/doc/update/background_migrations.md
index bf9f2df9e87..cbdcfef3bae 100644
--- a/doc/update/background_migrations.md
+++ b/doc/update/background_migrations.md
@@ -4,132 +4,119 @@ group: Database
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
-# Check for background migrations before upgrading
+# Background migrations and upgrades **(FREE SELF)**
-Certain releases may require different migrations to be
-finished before you update to the newer version.
+> - Batched background migrations [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51332) in GitLab 13.11 [with a flag](../user/feature_flags.md) named `execute_batched_migrations_on_schedule`. Disabled by default.
+> - Feature flag `execute_batched_migrations_on_schedule` [enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/329511) in GitLab 13.12.
+> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](../development/database/batched_background_migrations.md#enable-or-disable-background-migrations).
-There are two kinds of migrations:
+Certain releases may require different migrations to be finished before you
+update to the newer version. Two kinds of migrations exist. They differ, and you
+should check that both are complete before upgrading GitLab:
-- [Background migrations](#background-migrations)
-- [Batched background migrations](#batched-background-migrations) (available in GitLab 14.0 and later)
+- [Batched background migrations](#batched-background-migrations), most
+ commonly used in GitLab 14.0 and later.
+- [Background migrations](#background-migrations) that are not batched.
+ Most commonly used in GitLab 13.11 and earlier.
-Background migrations and batched migrations are not the same, so you should check that both are
-complete before updating.
-
-Decrease the time required to complete these migrations by increasing the number of
+To decrease the time required to complete these migrations, increase the number of
[Sidekiq workers](../administration/sidekiq/extra_sidekiq_processes.md)
that can process jobs in the `background_migration` queue.
-## Background migrations
-
-### Pending migrations
-
-**For Omnibus installations:**
-
-```shell
-sudo gitlab-rails runner -e production 'puts Gitlab::BackgroundMigration.remaining'
-sudo gitlab-rails runner -e production 'puts Gitlab::Database::BackgroundMigration::BatchedMigration.queued.count'
-```
-
-**For installations from source:**
-
-```shell
-cd /home/git/gitlab
-sudo -u git -H bundle exec rails runner -e production 'puts Gitlab::BackgroundMigration.remaining'
-sudo -u git -H bundle exec rails runner -e production 'puts Gitlab::Database::BackgroundMigration::BatchedMigration.queued.count'
-```
-
-### Failed migrations
-
-**For Omnibus installations:**
+## Batched background migrations
-For GitLab 14.0-14.9:
-
-```shell
-sudo gitlab-rails runner -e production 'puts Gitlab::Database::BackgroundMigration::BatchedMigration.failed.count'
-```
-
-For GitLab 14.10 and later:
+To update database tables in batches, GitLab can use batched background migrations. These migrations
+are created by GitLab developers and run automatically on upgrade. However, such migrations are
+limited in scope to help with migrating some `integer` database columns to `bigint`. This is needed to
+prevent integer overflow for some tables.
-```shell
-sudo gitlab-rails runner -e production 'puts Gitlab::Database::BackgroundMigration::BatchedMigration.with_status(:failed).count'
-```
+Some installations [may need to run GitLab 14.0 for at least a day](index.md#1400)
+to complete the database changes introduced by that upgrade.
-**For installations from source:**
+Batched background migrations are handled by Sidekiq and
+[run in isolation](../development/database/batched_background_migrations.md#isolation),
+so an instance can remain operational while the migrations are processed. However,
+performance might degrade on larger instances that are heavily used while
+batched background migrations are run. You should
+[Actively monitor the Sidekiq status](../administration/admin_area.md#background-jobs)
+until all migrations are completed.
-For GitLab 14.0-14.9:
+### Check the status of batched background migrations
-```shell
-cd /home/git/gitlab
-sudo -u git -H bundle exec rails runner -e production 'puts Gitlab::Database::BackgroundMigration::BatchedMigration.failed.count'
-```
+You can check the status of batched background migrations in the GitLab UI, or
+by querying the database directly. Before you upgrade GitLab, all migrations must
+have a `Finished` status.
-For GitLab 14.10 and later:
+If the migrations are not finished and you try to upgrade GitLab, you might
+see this error:
-```shell
-cd /home/git/gitlab
-sudo -u git -H bundle exec rails runner -e production 'puts Gitlab::Database::BackgroundMigration::BatchedMigration.with_status(:failed).count'
+```plaintext
+Expected batched background migration for the given configuration to be marked
+as 'finished', but it is 'active':
```
-## Batched background migrations **(FREE SELF)**
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51332) in GitLab 13.11, [behind a feature flag](../user/feature_flags.md), disabled by default.
-> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/329511) in GitLab 13.12.
-> - Enabled on GitLab.com.
-> - Recommended for production use.
-> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](#enable-or-disable-background-migrations).
-
-There can be [risks when disabling released features](../administration/feature_flags.md#risks-when-disabling-released-features).
-Refer to this feature's version history for more details.
-
-To update database tables in batches, GitLab can use batched background migrations. These migrations
-are created by GitLab developers and run automatically on upgrade. However, such migrations are
-limited in scope to help with migrating some `integer` database columns to `bigint`. This is needed to
-prevent integer overflow for some tables.
+If you get this error,
+[review the options](#database-migrations-failing-because-of-batched-background-migration-not-finished) for
+how to complete the batched background migrations needed for the GitLab upgrade.
-Some installations [may need to run GitLab 14.0 for at least a day](index.md#1400) to complete the database changes introduced by that upgrade.
+#### From the GitLab UI
-Batched background migrations are handled by Sidekiq and [run in isolation](../development/database/batched_background_migrations.md#isolation), so an instance can remain operational while the migrations are processed. However, there may be performance degradation on larger instances that are heavily used while batched background migrations are run, so it's a good idea to [actively monitor the Sidekiq status](../user/admin_area/index.md#background-jobs) until all migrations are completed.
+Prerequisites:
-### Check the status of batched background migrations
+- You must have administrator access to the instance.
To check the status of batched background migrations:
1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
1. Select **Admin Area**.
1. Select **Monitoring > Background Migrations**.
+1. Select **Queued** or **Finalizing** to see incomplete migrations,
+ and **Failed** for failed migrations.
+
+#### From the database
- ![queued batched background migrations table](img/batched_background_migrations_queued_v14_0.png)
+Prerequisites:
-All migrations must have a `Finished` status before you upgrade GitLab.
+- You must have administrator access to the instance.
-The status of batched background migrations can also be queried directly in the database.
+To query the database directly for the status of batched background migrations:
-1. Log into a `psql` prompt according to the directions for your instance's installation method
-(for example, `sudo gitlab-psql` for Omnibus installations).
-1. Run the following query in the `psql` session to see details on incomplete batched background migrations:
+1. Log into a `psql` prompt, according to the directions for your instance's
+ installation method. For example, `sudo gitlab-psql` for Linux package installations.
+1. To see details on incomplete batched background migrations, run this query in
+ the `psql` session:
```sql
- select job_class_name, table_name, column_name, job_arguments from batched_background_migrations where status <> 3;
+ SELECT
+ job_class_name,
+ table_name,
+ column_name,
+ job_arguments
+ FROM batched_background_migrations
+ WHERE status <> 3;
```
-If the migrations are not finished and you try to update to a later version,
-GitLab prompts you with an error:
+### Enable or disable advanced features
-```plaintext
-Expected batched background migration for the given configuration to be marked as 'finished', but it is 'active':
-```
+Batched background migrations provide feature flags that enable you to customize
+migrations or pause them entirely. These feature flags should only be disabled by
+advanced users who understand the risks of doing so.
-If you get this error, [check the batched background migration options](#database-migrations-failing-because-of-batched-background-migration-not-finished) to complete the upgrade.
+#### Pause batched background migrations in GitLab 14.x
-### Pause batched background migrations in GitLab 14.x
+WARNING:
+There can be [risks when disabling released features](../administration/feature_flags.md#risks-when-disabling-released-features).
+Refer to each feature's version history for more details.
To pause an ongoing batched background migration,
-[disable the batched background migrations feature](#enable-or-disable-background-migrations).
+[disable the batched background migrations feature](../development/database/batched_background_migrations.md#enable-or-disable-background-migrations).
Disabling the feature completes the current batch of migrations, then waits to start
the next batch until after the feature is enabled again.
+Prerequisites:
+
+- You must have administrator access to the instance.
+
Use the following database queries to see the state of the current batched background migration:
1. Obtain the ID of the running migration:
@@ -170,86 +157,166 @@ Use the following database queries to see the state of the current batched backg
command above) to proceed with the batch when ready. On larger instances,
background migrations can take as long as 48 hours to complete each batch.
-### Automatic batch size optimization
+#### Automatic batch size optimization
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60133)
-> in GitLab 13.12, [behind a feature flag](../user/feature_flags.md),
-> [enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/329511).
-> - Enabled on GitLab.com.
-> - Recommended for production use.
-> - For GitLab self-managed instances, GitLab administrators can opt to
-> [disable it](#enable-or-disable-automatic-batch-size-optimization).
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60133) in GitLab 13.2 [with a flag](../administration/feature_flags.md) named `optimize_batched_migrations`. Enabled by default.
+WARNING:
There can be [risks when disabling released features](../administration/feature_flags.md#risks-when-disabling-released-features).
Refer to this feature's version history for more details.
+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 `optimize_batched_migrations`.
+On GitLab.com, this feature is available.
+
To maximize throughput of batched background migrations (in terms of the number of tuples updated per time unit), batch sizes are automatically adjusted based on how long the previous batches took to complete.
-### Enable or disable automatic batch size optimization
+#### Parallel execution
-Automatic batch size optimization for batched background migrations is under development but ready for production use.
-It is deployed behind a feature flag that is **enabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../administration/feature_flags.md)
-can opt to disable it.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/104027) in GitLab 15.7 [with a flag](../administration/feature_flags.md) named `batched_migrations_parallel_execution`. Disabled by default.
+> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/372316) in GitLab 15.11.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/120808) in GitLab 16.1. Feature flag `batched_migrations_parallel_execution` removed.
-To enable it:
+WARNING:
+There can be [risks when disabling released features](../administration/feature_flags.md#risks-when-disabling-released-features).
+Refer to this feature's version history for more details.
+
+To speed up the execution of batched background migrations, two migrations are executed at the same time.
+
+[GitLab administrators with access to the GitLab Rails console](../administration/feature_flags.md) can change
+the number of batched background migrations executed in parallel:
```ruby
-Feature.enable(:optimize_batched_migrations)
+ApplicationSetting.update_all(database_max_running_batched_background_migrations: 4)
```
-To disable it:
+### Fix and retry failed batched background migrations
-```ruby
-Feature.disable(:optimize_batched_migrations)
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67504) in GitLab 14.3.
+
+If you [check the status](#check-the-status-of-batched-background-migrations) of batched background migrations,
+some migrations might display in the **Failed** tab with a **failed** status:
+
+![failed batched background migrations table](img/batched_background_migrations_failed_v14_3.png)
+
+You must resolve all failed batched background migrations to upgrade to a newer
+version of GitLab.
+
+To determine why the batched background migration failed,
+[view the failure error logs](../development/database/batched_background_migrations.md#viewing-failure-error-logs) or:
+
+Prerequisites:
+
+- You must have administrator access to the instance.
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Monitoring > Background Migrations**.
+1. Select the **Failed** tab. This displays a list of failed batched background migrations.
+1. Select the failed **Migration** to see the migration parameters and the jobs that failed.
+1. Under **Failed jobs**, select each **ID** to see why the job failed.
+
+If you are a GitLab customer, consider opening a [Support Request](https://support.gitlab.com/hc/en-us/requests/new)
+to debug why the batched background migrations failed.
+
+To correct the problem, you can retry the failed batched background migrations:
+
+Prerequisites:
+
+- You must have administrator access to the instance.
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. Select **Monitoring > Background Migrations**.
+1. Select the **Failed** tab. This displays a list of failed batched background migrations.
+1. Select a failed batched background migration to retry by clicking on the retry button (**{retry}**).
+
+To monitor the retried batched background migrations, you can
+[check the status of batched background migrations](#check-the-status-of-batched-background-migrations)
+on a regular interval.
+
+## Background migrations
+
+In GitLab 13, background migrations were not batched. In GitLab 14 and later, this
+type of migration was superseded by batched background migrations.
+
+### Check for pending background migrations
+
+To check for pending non-batched background migrations:
+
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
+
+```shell
+sudo gitlab-rails runner -e production 'puts Gitlab::BackgroundMigration.remaining'
+sudo gitlab-rails runner -e production 'puts Gitlab::Database::BackgroundMigration::BatchedMigration.queued.count'
```
-### Parallel execution
+:::TabTitle Self-compiled (source)
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/104027)
-> in GitLab 15.7, [behind a feature flag](../user/feature_flags.md),
-> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/372316) in GitLab 15.11.
-> - Feature flag `batched_migrations_parallel_execution` removed in GitLab 16.1.
+```shell
+cd /home/git/gitlab
+sudo -u git -H bundle exec rails runner -e production 'puts Gitlab::BackgroundMigration.remaining'
+sudo -u git -H bundle exec rails runner -e production 'puts Gitlab::Database::BackgroundMigration::BatchedMigration.queued.count'
+```
-There can be [risks when disabling released features](../administration/feature_flags.md#risks-when-disabling-released-features).
-Refer to this feature's version history for more details.
+::EndTabs
-To speed up the execution of batched background migrations, two migrations are executed at the same time.
+### Check for failed background migrations
-[GitLab administrators with access to the GitLab Rails console](../administration/feature_flags.md) can change
-the number of batched background migrations executed in parallel:
+To check for non-batched background migrations that have failed:
-```ruby
-ApplicationSetting.update_all(database_max_running_batched_background_migrations: 4)
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
+
+For GitLab versions 14.10 and later:
+
+```shell
+sudo gitlab-rails runner -e production 'puts Gitlab::Database::BackgroundMigration::BatchedMigration.with_status(:failed).count'
```
-## Troubleshooting
+For GitLab versions 14.0-14.9:
-### Enable or disable background migrations
+```shell
+sudo gitlab-rails runner -e production 'puts Gitlab::Database::BackgroundMigration::BatchedMigration.failed.count'
+```
-In extremely limited circumstances, a GitLab administrator can disable either or
-both of these [feature flags](../administration/feature_flags.md):
+:::TabTitle Self-compiled (source)
-- `execute_background_migrations`
-- `execute_batched_migrations_on_schedule`
+For GitLab versions 14.10 and later:
-These flags are enabled by default. Disable them only as a last resort
-to limit database operations in special circumstances, like database host maintenance.
+```shell
+cd /home/git/gitlab
+sudo -u git -H bundle exec rails runner -e production 'puts Gitlab::Database::BackgroundMigration::BatchedMigration.with_status(:failed).count'
+```
-WARNING:
-Do not disable either of these flags unless you fully understand the ramifications. If you disable
-the `execute_background_migrations` or `execute_batched_migrations_on_schedule` feature flag,
-GitLab upgrades might fail and data loss might occur.
+For GitLab versions 14.0-14.9:
+
+```shell
+cd /home/git/gitlab
+sudo -u git -H bundle exec rails runner -e production 'puts Gitlab::Database::BackgroundMigration::BatchedMigration.failed.count'
+```
+
+::EndTabs
+
+## Troubleshooting
### Database migrations failing because of batched background migration not finished
-When updating to GitLab 14.2 or later there might be a database migration failing with a message like:
+When updating to GitLab version 14.2 or later, database migrations might fail with a message like:
```plaintext
StandardError: An error has occurred, all later migrations canceled:
Expected batched background migration for the given configuration to be marked as 'finished', but it is 'active':
- {:job_class_name=>"CopyColumnUsingBackgroundMigrationJob", :table_name=>"push_event_payloads", :column_name=>"event_id", :job_arguments=>[["event_id"], ["event_id_convert_to_bigint"]]}
+ {:job_class_name=>"CopyColumnUsingBackgroundMigrationJob",
+ :table_name=>"push_event_payloads",
+ :column_name=>"event_id",
+ :job_arguments=>[["event_id"],
+ ["event_id_convert_to_bigint"]]
+ }
```
First, check if you have followed the [version-specific upgrade instructions for 14.2](../update/index.md#1420).
@@ -263,7 +330,7 @@ version and manually ensuring that the batched migrations complete successfully.
#### Roll back and follow the required upgrade path
-1. [Rollback and restore the previously installed version](../raketasks/backup_restore.md)
+1. [Rollback and restore the previously installed version](../administration/backup_restore/index.md)
1. Update to either 14.0.5 or 14.1 **before** updating to 14.2+
1. [Check the status](#check-the-status-of-batched-background-migrations) of the batched background migrations and
make sure they are all marked as finished before attempting to upgrade again. If any remain marked as active,
@@ -321,8 +388,14 @@ arguments. For example, if you receive an error similar to this:
```plaintext
StandardError: An error has occurred, all later migrations canceled:
-Expected batched background migration for the given configuration to be marked as 'finished', but it is 'active':
- {:job_class_name=>"CopyColumnUsingBackgroundMigrationJob", :table_name=>"push_event_payloads", :column_name=>"event_id", :job_arguments=>[["event_id"], ["event_id_convert_to_bigint"]]}
+Expected batched background migration for the given configuration to be marked as
+'finished', but it is 'active':
+ {:job_class_name=>"CopyColumnUsingBackgroundMigrationJob",
+ :table_name=>"push_event_payloads",
+ :column_name=>"event_id",
+ :job_arguments=>[["event_id"],
+ ["event_id_convert_to_bigint"]]
+ }
```
Plug the arguments from the error message into the command:
@@ -395,17 +468,19 @@ The following operations can disrupt your GitLab performance. They run a number
Run the following check. If it returns non-zero and the count does not decrease over time, follow the rest of the steps in this section.
```shell
-# For Omnibus installations:
+# For Linux package installations:
sudo gitlab-rails runner -e production 'puts Gitlab::BackgroundMigration.remaining'
-# For installations from source:
+# For self-compiled installations:
cd /home/git/gitlab
sudo -u git -H bundle exec rails runner -e production 'puts Gitlab::BackgroundMigration.remaining'
```
It is safe to re-execute the following commands, especially if you have 1000+ pending jobs which would likely overflow your runtime memory.
-**For Omnibus installations**
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
```shell
# Start the rails console
@@ -417,7 +492,7 @@ pending_job_classes = scheduled_queue.select { |job| job["class"] == "Background
pending_job_classes.each { |job_class| Gitlab::BackgroundMigration.steal(job_class) }
```
-**For installations from source**
+:::TabTitle Self-compiled (source)
```shell
# Start the rails console
@@ -429,16 +504,14 @@ pending_job_classes = scheduled_queue.select { |job| job["class"] == "Background
pending_job_classes.each { |job_class| Gitlab::BackgroundMigration.steal(job_class) }
```
+::EndTabs
+
### Background migrations stuck in 'pending' state
WARNING:
The following operations can disrupt your GitLab performance. They run a number
of Sidekiq jobs that perform various database or file updates.
-- 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](index.md#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
@@ -469,17 +542,19 @@ it returns non-zero and the count does not decrease over time, follow the rest
of the steps in this section.
```shell
-# For Omnibus installations:
+# For Linux package installations:
sudo gitlab-rails runner -e production 'puts Gitlab::Database::BackgroundMigrationJob.pending.count'
-# For installations from source:
+# For self-compiled installations:
cd /home/git/gitlab
sudo -u git -H bundle exec rails runner -e production 'puts Gitlab::Database::BackgroundMigrationJob.pending.count'
```
It is safe to re-attempt these migrations to clear them out from a pending status:
-**For Omnibus installations**
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
```shell
# Start the rails console
@@ -493,7 +568,7 @@ Gitlab::Database::BackgroundMigrationJob.pending.find_each do |job|
end
```
-**For installations from source**
+:::TabTitle Self-compiled (source)
```shell
# Start the rails console
@@ -506,3 +581,5 @@ Gitlab::Database::BackgroundMigrationJob.pending.find_each do |job|
puts "Result: #{result}"
end
```
+
+::EndTabs
diff --git a/doc/update/deprecations.md b/doc/update/deprecations.md
index ecf0f68de0e..804fcc77ea1 100644
--- a/doc/update/deprecations.md
+++ b/doc/update/deprecations.md
@@ -5,9 +5,9 @@ info: "See the Technical Writers assigned to Development Guidelines: https://abo
toc: false
---
-# Deprecations by version
+# Deprecations and removals by version
-These GitLab features are deprecated and no longer recommended for use.
+The following GitLab features are deprecated and no longer recommended for use.
Each deprecated feature will be removed in a future release.
Some features cause breaking changes when they are removed.
@@ -24,8 +24,10 @@ and [GraphQL](https://docs.gitlab.com/ee/api/graphql/removed_items.html) depreca
<!--
DO NOT EDIT THIS PAGE DIRECTLY
-This page is automatically generated from the YAML files in `/data/deprecations` by the rake task
-located at `lib/tasks/gitlab/docs/compile_deprecations.rake`.
+This page is automatically generated from the template located at
+`data/deprecations/templates/_deprecation_template.md.erb`, using
+the YAML files in `/data/deprecations` by the rake task
+located at `lib/tasks/gitlab/docs/compile_deprecations.rake`,
For deprecation authors (usually Product Managers and Engineering Managers):
@@ -50,25 +52,11 @@ For deprecation reviewers (Technical Writers only):
<div class="deprecation breaking-change" data-milestone="17.0">
-### Accessibility Testing is deprecated
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/390424).
-</div>
-
-Due to low customer usage, Accessibility Testing is deprecated and will be removed. There is no planned replacement and users should stop using Accessibility Testing before GitLab 17.0.
-
-</div>
-
-<div class="deprecation breaking-change" data-milestone="17.0">
-
### Atlassian Crowd OmniAuth provider
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.3</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/369117).
</div>
@@ -85,7 +73,7 @@ next major release, GitLab 16.0. This gem sees very little use and its
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/211643).
</div>
@@ -97,25 +85,11 @@ Because Cloud Native Buildpacks do not support automatic testing, the Auto Test
<div class="deprecation breaking-change" data-milestone="17.0">
-### Browser Performance Testing is deprecated
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/388719).
-</div>
-
-Due to limited customer usage, Browser Performance Testing is deprecated and will be removed. There is no planned replacement and users should stop using Browser Performance Testing before GitLab 17.0.
-
-</div>
-
-<div class="deprecation breaking-change" data-milestone="17.0">
-
### CiRunner.projects default sort is changing to `id_desc`
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">16.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/372117).
</div>
@@ -130,7 +104,7 @@ If you rely on the order of the returned projects to be `id_asc`, change your sc
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">16.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/409332).
</div>
@@ -145,7 +119,7 @@ the aliasing for the `CiRunnerUpgradeStatusType` type will be removed.
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.7</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/383467).
</div>
@@ -162,7 +136,7 @@ These three variables will be removed in GitLab 17.0.
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">16.1</span>
- End of Support: GitLab <span class="milestone">17.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/414864).
</div>
@@ -170,6 +144,36 @@ In GitLab 11.11 the Windows Batch executor, the CMD shell was deprecated in GitL
</div>
+<div class="deprecation breaking-change" data-milestone="17.0">
+
+### Deprecate `CiRunner` GraphQL fields duplicated in `CiRunnerManager`
+
+<div class="deprecation-notes">
+- Announced in: GitLab <span class="milestone">16.2</span>
+- End of Support: GitLab <span class="milestone">17.0</span>
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
+- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/41518).
+</div>
+
+These fields (`architectureName`, `ipAddress`, `platformName`, `revision`, `version`) are now deprecated from the [GraphQL `CiRunner`](https://docs.gitlab.com/ee/api/graphql/reference/#cirunner) type as they are duplicated with the introduction of runner managers grouped within a runner configuration.
+
+</div>
+
+<div class="deprecation breaking-change" data-milestone="17.0">
+
+### Deprecate `message` field from Vulnerability Management features
+
+<div class="deprecation-notes">
+- Announced in: GitLab <span class="milestone">16.1</span>
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
+- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/411573).
+</div>
+
+This MR deprecates the `message` field on the `VulnerabilityCreate` GraphQL mutation, and in the `AdditionalInfo` column of the vulnerability export.
+The message field was removed from security reports schema in GitLab 16.0 and is no longer being used elsewhere.
+
+</div>
+
<div class="deprecation " data-milestone="17.0">
### Deprecate legacy shell escaping and quoting runner shell executor
@@ -186,11 +190,25 @@ The runner's legacy escape sequence mechanism to handle variable expansion imple
<div class="deprecation breaking-change" data-milestone="17.0">
+### Deprecated parameters related to custom text in the sign-in page
+
+<div class="deprecation-notes">
+- Announced in: GitLab <span class="milestone">16.2</span>
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
+- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124461).
+</div>
+
+The parameters, `sign_in_text` and `help_text`, are deprecated in the [Settings API](https://docs.gitlab.com/ee/api/settings.html). To add a custom text to the sign-in and sign-up pages, use the `description` field in the [Appearance API](https://docs.gitlab.com/ee/api/appearance.html).
+
+</div>
+
+<div class="deprecation breaking-change" data-milestone="17.0">
+
### DingTalk OmniAuth provider
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.10</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/390855).
</div>
@@ -205,7 +223,7 @@ major release, GitLab 17.0. This gem sees very little use and is better suited f
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/groups/gitlab-org/-/epics/9661).
</div>
@@ -231,7 +249,7 @@ To avoid any disruptions, you should replace `filepath` with `direct_asset_path`
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/charts/gitlab/-/issues/4097).
</div>
@@ -252,7 +270,7 @@ Because the new values provide a streamlined, comprehensive method to enable TLS
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/387937).
</div>
@@ -269,7 +287,7 @@ are deprecated and will be removed from the GraphQL API. For installation instru
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.6</span>
- End of Support: GitLab <span class="milestone">17.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/382077).
</div>
@@ -292,7 +310,7 @@ This change is a breaking change. You should use an [authentication token](../ci
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">16.1</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/414236).
</div>
@@ -304,44 +322,46 @@ Use `dependencyProxyTotalSizeBytes` instead, introduced in GitLab 16.1.
<div class="deprecation breaking-change" data-milestone="17.0">
-### GraphQL type, `RunnerMembershipFilter` renamed to `CiRunnerMembershipFilter`
+### GraphQL field `registrySizeEstimated` has been deprecated
<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">16.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/409333).
+- Announced in: GitLab <span class="milestone">16.2</span>
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
+- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/416509).
</div>
-The GraphQL type, `RunnerMembershipFilter`, has been renamed to `CiRunnerMembershipFilter`. In GitLab 17.0,
-the aliasing for the `RunnerMembershipFilter` type will be removed.
+For clarity, the GraphQL field `registrySizeEstimated` was renamed to `containerRegistrySizeIsEstimated`, to match its counterpart.
+`registrySizeEstimated` was deprecated in GitLab 16.2 and will be removed in GitLab 17.0.
+Use `containerRegistrySizeIsEstimated` introduced in GitLab 16.2 instead.
</div>
<div class="deprecation breaking-change" data-milestone="17.0">
-### GraphQL: The `DISABLED_WITH_OVERRIDE` value of the `SharedRunnersSetting` enum is deprecated. Use `DISABLED_AND_OVERRIDABLE` instead
+### GraphQL type, `RunnerMembershipFilter` renamed to `CiRunnerMembershipFilter`
<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/385636).
+- Announced in: GitLab <span class="milestone">16.0</span>
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
+- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/409333).
</div>
-In GitLab 17.0, the `DISABLED_WITH_OVERRIDE` value of the `SharedRunnersSetting` GraphQL enum type will be replaced with the value, `DISABLED_AND_OVERRIDABLE`.
+The GraphQL type, `RunnerMembershipFilter`, has been renamed to `CiRunnerMembershipFilter`. In GitLab 17.0,
+the aliasing for the `RunnerMembershipFilter` type will be removed.
</div>
<div class="deprecation breaking-change" data-milestone="17.0">
-### Load Performance Testing is deprecated
+### GraphQL: The `DISABLED_WITH_OVERRIDE` value of the `SharedRunnersSetting` enum is deprecated. Use `DISABLED_AND_OVERRIDABLE` instead
<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/388723).
+- Announced in: GitLab <span class="milestone">15.8</span>
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
+- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/385636).
</div>
-Due to low customer usage, Load Performance Testing is deprecated and will be removed. There is no planned replacement and users should stop using Load Performance Testing before GitLab 17.0.
+In GitLab 17.0, the `DISABLED_WITH_OVERRIDE` value of the `SharedRunnersSetting` GraphQL enum type will be replaced with the value, `DISABLED_AND_OVERRIDABLE`.
</div>
@@ -351,7 +371,7 @@ Due to low customer usage, Load Performance Testing is deprecated and will be re
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/370471).
</div>
@@ -369,11 +389,25 @@ settings for the group using either the GitLab UI or GraphQL API.
<div class="deprecation breaking-change" data-milestone="17.0">
+### OmniAuth Facebook is deprecated
+
+<div class="deprecation-notes">
+- Announced in: GitLab <span class="milestone">16.2</span>
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
+- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/416000).
+</div>
+
+OmniAuth Facebook support will be removed in GitLab 17.0. The last gem release was in 2021 and it is currently unmaintained. The current usage is less than 0.1%. If you use OmniAuth Facebook, switch to a [supported provider](https://docs.gitlab.com/ee/integration/omniauth.html#supported-providers) in advance of support removal.
+
+</div>
+
+<div class="deprecation breaking-change" data-milestone="17.0">
+
### Package pipelines in API payload is paginated
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.5</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/289956).
</div>
@@ -389,7 +423,7 @@ In milestone 17.0, we will remove the `pipelines` attribute from the API respons
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.1</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/343475).
</div>
@@ -404,7 +438,7 @@ The [`project_fingerprint`](https://gitlab.com/groups/gitlab-org/-/epics/2791) a
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">16.0</span>
- End of Support: GitLab <span class="milestone">17.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/groups/gitlab-org/-/epics/9065).
</div>
@@ -425,7 +459,7 @@ PostgreSQL 14 will also be supported for instances that want to upgrade prior to
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.9</span>
- End of Support: GitLab <span class="milestone">16.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/390787).
</div>
@@ -444,7 +478,7 @@ While the above approach is recommended for most instances, Sidekiq can also be
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.6</span>
- End of Support: GitLab <span class="milestone">17.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/379743).
</div>
@@ -474,7 +508,7 @@ This change is a breaking change. You should [create a runner in the UI](../ci/r
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.6</span>
- End of Support: GitLab <span class="milestone">17.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/380872).
</div>
@@ -501,7 +535,7 @@ This change is a breaking change. You should [create a runner in the UI](../ci/r
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/389467).
</div>
@@ -518,11 +552,19 @@ that is available now. We recommend this alternative solution because it provide
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">16.1</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/411239).
</div>
-The option to run self-managed installations of GitLab on a single database is now deprecated. From GitLab 17.0, we will require a [separate database for CI features](https://gitlab.com/groups/gitlab-org/-/epics/7509). With this change, self-managed versions of GitLab will behave similarly to GitLab.com. This change applies to installation methods with Omnibus GitLab, GitLab Helm chart, GitLab Operator, GitLab Docker images, and installation from source. Before upgrading to GitLab 17.0, please ensure [migration](https://docs.gitlab.com/ee/administration/postgresql/multiple_databases.html) to two databases.
+From GitLab 17.0, we will require a [separate database for CI features](https://gitlab.com/groups/gitlab-org/-/epics/7509).
+We recommend running both databases on the same Postgres instance(s) due to ease of management for most deployments.
+
+We are providing this as an informational advance notice but we do not recommend taking action yet.
+We will have another update communicated (as well as the deprecation note) when we recommend admins to start the migration process.
+
+This change provides additional scalability for the largest of GitLab instances, like GitLab.com.
+This change applies to all installation methods: Omnibus GitLab, GitLab Helm chart, GitLab Operator, GitLab Docker images, and installation from source.
+Before upgrading to GitLab 17.0, please ensure you have [migrated](https://docs.gitlab.com/ee/administration/postgresql/multiple_databases.html) to two databases.
</div>
@@ -532,7 +574,7 @@ The option to run self-managed installations of GitLab on a single database is n
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.5</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/groups/gitlab-org/configure/-/epics/8).
</div>
@@ -558,7 +600,7 @@ For updates and details about this deprecation, follow [this epic](https://gitla
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/387898).
</div>
@@ -582,7 +624,7 @@ automatically from GitLab 16.0 onwards.
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.9</span>
- End of Support: GitLab <span class="milestone">17.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/372411).
</div>
@@ -602,7 +644,7 @@ we'll be introducing support in [this epic](https://gitlab.com/groups/gitlab-org
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.7</span>
- End of Support: GitLab <span class="milestone">17.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/383341).
</div>
@@ -629,7 +671,7 @@ From GitLab 17.0 and later, the runner registration methods implemented by the n
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/390263).
</div>
@@ -643,7 +685,7 @@ We will be transitioning to a new IID as a result of moving requirements to a [w
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/387751).
</div>
@@ -658,7 +700,7 @@ Due to limited customer usage and capabilities, the Visual Reviews feature for R
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.7</span>
- End of Support: GitLab <span class="milestone">17.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/385235).
</div>
@@ -668,11 +710,29 @@ The [`gitlab-runner exec`](https://docs.gitlab.com/runner/commands/#gitlab-runne
<div class="deprecation breaking-change" data-milestone="17.0">
+### The pull-based deployment features of the GitLab agent for Kubernetes is deprecated
+
+<div class="deprecation-notes">
+- Announced in: GitLab <span class="milestone">16.2</span>
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
+- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/406545).
+</div>
+
+We are deprecating the built-in pull-based deployment features of the GitLab agent for Kubernetes in favor of Flux and related integrations.
+
+The GitLab agent for Kubernetes **is not deprecated**. This change affects only the pull-based functionality of the agent. All other functionality will remain intact, and GitLab will continue to support the agent for Kubernetes.
+
+If you use the agent for pull-based deployments, you should [migrate to Flux](https://docs.gitlab.com/ee/user/clusters/agent/gitops/agent.html#migrate-to-flux). Because Flux is a mature CNCF project for GitOps, we decided to [integrate Flux with GitLab in February 2023](https://about.gitlab.com/blog/2023/02/08/why-did-we-choose-to-integrate-fluxcd-with-gitlab/).
+
+</div>
+
+<div class="deprecation breaking-change" data-milestone="17.0">
+
### Trigger jobs can mirror downstream pipeline status exactly
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/285493).
</div>
@@ -686,7 +746,7 @@ In some cases, like when a downstream pipeline had the `passed with warnings` st
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">16.1</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/groups/gitlab-org/-/epics/9662).
</div>
@@ -706,7 +766,7 @@ You can still access unified approval rules with the API.
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.4</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/372332).
</div>
@@ -724,7 +784,7 @@ removed in 17.0.
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.6</span>
- End of Support: GitLab <span class="milestone">17.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/381111).
</div>
@@ -744,7 +804,7 @@ From GitLab 17.0 and later, the methods to register runners introduced by the ne
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">16.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/398132).
</div>
@@ -776,9 +836,12 @@ echo $( ruby -rsecurerandom -e "puts SecureRandom.base64(32)" ) > ~/.gitlab-mail
If you run GitLab on more than one machine, you need to provide the secret key file for each machine.
-We highly encourage GitLab administrators to start using the `webhook` delivery method for
+We encourage GitLab administrators to switch to the webhook delivery method for
`incoming_email_delivery_method` and `service_desk_email_delivery_method` instead of `sidekiq`.
+[Issue 393157](https://gitlab.com/gitlab-org/gitlab/-/issues/393157) tracks improving email ingestion in general.
+We hope this will simplify infrastructure setup and add several improvements to how you manage GitLab in the near future.
+
</div>
<div class="deprecation breaking-change" data-milestone="17.0">
@@ -787,7 +850,7 @@ We highly encourage GitLab administrators to start using the `webhook` delivery
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.1</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/343475).
</div>
@@ -819,7 +882,7 @@ Enabling the `ldap_settings_unlock_groups_by_owners` feature flag allowed non-LD
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/366798).
</div>
@@ -848,7 +911,7 @@ In GitLab 16.0 and later:
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/366798).
</div>
@@ -896,7 +959,7 @@ be available in CI/CD jobs.
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">16.0</span>
- End of Support: GitLab <span class="milestone">16.3</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/7772).
</div>
@@ -914,6 +977,28 @@ In GitLab versions 16.0 to 16.2, you can still [re-enable the bundled Grafana](h
However, enabling the bundled Grafana will no longer work from GitLab 16.3.
</div>
+
+<div class="deprecation breaking-change" data-milestone="16.3">
+
+### License Compliance CI Template
+
+<div class="deprecation-notes">
+- Announced in: GitLab <span class="milestone">15.9</span>
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
+- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/387561).
+</div>
+
+**Update:** We previously announced we would remove the existing License Compliance CI template in GitLab 16.0. However, due to performance issues with the [license scanning of CycloneDX files](https://docs.gitlab.com/ee/user/compliance/license_scanning_of_cyclonedx_files/) we will do this change in 16.3 instead.
+
+The GitLab [License Compliance](https://docs.gitlab.com/ee/user/compliance/license_compliance/) CI template is now deprecated and is scheduled for removal in the GitLab 16.1 release. Users who wish to continue using GitLab for License Compliance should remove the License Compliance template from their CI pipeline and add the [Dependency Scanning template](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#configuration). The Dependency Scanning template is now capable of gathering the required license information so it is no longer necessary to run a separate License Compliance job. The License Compliance CI template should not be removed prior to verifying that the `license_scanning_sbom_scanner` and `package_metadata_synchronization` flags are enabled for the instance and that the instance has been upgraded to a version that supports [the new method of license scanning](https://docs.gitlab.com/ee/user/compliance/license_scanning_of_cyclonedx_files/).
+
+| CI Pipeline Includes | GitLab <= 15.8 | 15.9 <= GitLab < 16.3 | GitLab >= 16.3 |
+| ------------- | ------------- | ------------- | ------------- |
+| Both DS and LS templates | License data from LS job is used | License data from LS job is used | License data from DS job is used |
+| DS template is included but LS template is not | No license data | License data from DS job is used | License data from DS job is used |
+| LS template is included but DS template is not | License data from LS job is used | License data from LS job is used | No license data |
+
+</div>
</div>
<div class="milestone-wrapper" data-milestone="16.1">
@@ -937,28 +1022,6 @@ We will stop publishing runner images based on the following, end-of-life Alpine
- Alpine 3.14 (end-of-life on 2023-05-23)
</div>
-
-<div class="deprecation breaking-change" data-milestone="16.1">
-
-### License Compliance CI Template
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/387561).
-</div>
-
-**Update:** We previously announced we would remove the existing License Compliance CI template in GitLab 16.0. However, due to performance issues with the [license scanning of CycloneDX files](https://docs.gitlab.com/ee/user/compliance/license_scanning_of_cyclonedx_files/) we will do this change in 16.1 instead.
-
-The GitLab [License Compliance](https://docs.gitlab.com/ee/user/compliance/license_compliance/) CI template is now deprecated and is scheduled for removal in the GitLab 16.1 release. Users who wish to continue using GitLab for License Compliance should remove the License Compliance template from their CI pipeline and add the [Dependency Scanning template](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#configuration). The Dependency Scanning template is now capable of gathering the required license information so it is no longer necessary to run a separate License Compliance job. The License Compliance CI template should not be removed prior to verifying that the `license_scanning_sbom_scanner` and `package_metadata_synchronization` flags are enabled for the instance and that the instance has been upgraded to a version that supports [the new method of license scanning](https://docs.gitlab.com/ee/user/compliance/license_scanning_of_cyclonedx_files/).
-
-| CI Pipeline Includes | GitLab <= 15.8 | 15.9 <= GitLab < 16.1 | GitLab >= 16.1 |
-| ------------- | ------------- | ------------- | ------------- |
-| Both DS and LS templates | License data from LS job is used | License data from LS job is used | License data from DS job is used |
-| DS template is included but LS template is not | No license data | License data from DS job is used | License data from DS job is used |
-| LS template is included but DS template is not | License data from LS job is used | License data from LS job is used | No license data |
-
-</div>
</div>
<div class="milestone-wrapper" data-milestone="16.0">
@@ -971,7 +1034,7 @@ The GitLab [License Compliance](https://docs.gitlab.com/ee/user/compliance/licen
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/343988).
</div>
@@ -990,7 +1053,7 @@ set the `POSTGRES_ENABLED` CI/CD variable to `true`.
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/container-registry/-/issues/854).
</div>
@@ -1008,7 +1071,7 @@ This breaking change will happen in GitLab 16.0.
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.10</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/charts/gitlab/-/issues/4353).
</div>
@@ -1031,7 +1094,7 @@ and [connect Grafana to the GitLab UI](https://docs.gitlab.com/ee/administration
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.3</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/369127).
</div>
@@ -1047,7 +1110,7 @@ release, GitLab 16.0. This gem sees very little use and its lack of upstream mai
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/353080).
</div>
@@ -1061,7 +1124,7 @@ When using the native HashiCorp Vault integration, CI/CD jobs will fail when no
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">16.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/408396).
</div>
@@ -1078,7 +1141,7 @@ Instead of changing which single module would be scanned, we [improved multi-mod
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/353097).
</div>
@@ -1094,7 +1157,7 @@ Instead, use the [`/approval_rules` endpoint](https://docs.gitlab.com/ee/api/mer
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/384455).
</div>
@@ -1111,7 +1174,7 @@ This unintended functionality is deprecated in GitLab 15.8 and will be removed i
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.6</span>
- End of Support: GitLab <span class="milestone">16.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/379064).
</div>
@@ -1125,7 +1188,7 @@ From GitLab 13.6, users can [specify any runner configuration in the GitLab Runn
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/388255).
</div>
@@ -1143,7 +1206,7 @@ config file locations instead, for example `config/redis.cache.yml` or
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/container-registry/-/issues/842).
</div>
@@ -1157,7 +1220,7 @@ The Container Registry [pull-through cache](https://docs.docker.com/registry/rec
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.4</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/371840).
</div>
@@ -1171,7 +1234,7 @@ All Container Scanning variables that are prefixed by `DOCKER_` in variable name
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/387299).
</div>
@@ -1187,7 +1250,7 @@ to continue to use the GitLab for Jira Cloud app. Without OAuth, you can't manag
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.7</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/384198).
</div>
@@ -1201,7 +1264,7 @@ With the move to the new DAST API analyzer and the `DAST-API.gitlab-ci.yml` temp
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.7</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/383467).
</div>
@@ -1221,7 +1284,7 @@ These two variables will be removed in GitLab 16.0.
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.7</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/384340).
</div>
@@ -1237,7 +1300,7 @@ These three variables will be removed in GitLab 16.0.
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/395708).
</div>
@@ -1259,7 +1322,7 @@ To prepare for this change, users on GitLab.com or self-managed GitLab 15.9 or l
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/387560).
</div>
@@ -1273,7 +1336,7 @@ GitLab has deprecated Dependency Scanning support for Java versions 13, 14, 15,
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/328500).
</div>
@@ -1287,7 +1350,7 @@ The Deployment API will now return an error when `updated_at` filtering and `upd
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/352609).
</div>
@@ -1305,7 +1368,7 @@ GitLab instances that use `GIT_CONFIG_SYSTEM` and `GIT_CONFIG_GLOBAL` to configu
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.10</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/7278).
</div>
@@ -1326,7 +1389,7 @@ For more information, see [the deprecation notes for Consul 1.9.0](https://githu
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.9</span>
- End of Support: GitLab <span class="milestone">16.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/391896).
</div>
@@ -1340,7 +1403,7 @@ The [`CI_PRE_CLONE_SCRIPT` variable](https://docs.gitlab.com/ee/ci/runners/saas/
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/387891).
</div>
@@ -1356,7 +1419,7 @@ will be able to import projects to that group.
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/375505).
</div>
@@ -1370,7 +1433,7 @@ In GitLab 16.0 the GitLab Dependency Scanning analyzer will begin reporting deve
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/389477).
</div>
@@ -1385,7 +1448,7 @@ We intend to replace this feature with the ability to [embed charts](https://git
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/372770).
</div>
@@ -1407,7 +1470,7 @@ Users on self-managed instances should update their pipelines to ensure they do
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.10</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/382532).
</div>
@@ -1421,7 +1484,7 @@ From GitLab 16.0, when you search for environments with the API, you must use at
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
</div>
In the [GraphQL API](https://docs.gitlab.com/ee/api/graphql/), the `external` field of [`ReleaseAssetLink` type](https://docs.gitlab.com/ee/api/graphql/reference/index.html#releaseassetlink) was used to indicate whether a [release link](https://docs.gitlab.com/ee/user/project/releases/release_fields.html#links) is internal or external to your GitLab instance.
@@ -1436,7 +1499,7 @@ To avoid any disruptions to your workflow, please stop using the `external` fiel
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
</div>
In [Releases API](https://docs.gitlab.com/ee/api/releases/) and [Release Links API](https://docs.gitlab.com/ee/api/releases/links.html), the `external` field was used to indicate whether a [release link](https://docs.gitlab.com/ee/user/project/releases/release_fields.html#links) is internal or external to your GitLab instance.
@@ -1467,7 +1530,7 @@ GitLab 16.0.
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/348909).
</div>
@@ -1500,7 +1563,7 @@ See [migrated group items](https://docs.gitlab.com/ee/user/group/import/#migrate
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.5</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/344648).
</div>
@@ -1521,7 +1584,7 @@ When checking if a runner is `paused`, API users are advised to check the boolea
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/360545).
</div>
@@ -1540,7 +1603,7 @@ be present during the 16.x cycle to avoid breaking the API signature, and will b
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.5</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/371485).
</div>
@@ -1554,7 +1617,7 @@ The `confidential` field for a `Note` will be deprecated and renamed to `interna
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.1</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/groups/gitlab-org/-/epics/7508).
</div>
@@ -1571,7 +1634,7 @@ The Jira DVCS connector is also deprecated for Jira 8.13 and earlier. You can on
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.7</span>
- End of Support: GitLab <span class="milestone">16.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/383039).
</div>
@@ -1586,7 +1649,7 @@ This port is used for much more than just metrics, which warranted this change t
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.10</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/393574).
</div>
@@ -1609,7 +1672,7 @@ You should update to the new configuration structure as soon as possible using
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/390291).
</div>
@@ -1631,7 +1694,7 @@ didn't match. The change improves consistency between Omnibus GitLab and source
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/214217).
</div>
@@ -1651,7 +1714,7 @@ Update any scripts or bookmarks that reference the legacy URLs. GitLab APIs are
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/390417).
</div>
@@ -1665,7 +1728,7 @@ The [License-Check feature](https://docs.gitlab.com/ee/user/compliance/license_c
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/387721).
</div>
@@ -1679,7 +1742,7 @@ With external authorization enabled, personal access tokens (PATs) and deploy to
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.10</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/charts/gitlab/-/issues/3442).
</div>
@@ -1701,7 +1764,7 @@ The full GitLab Helm Chart 7.0 upgrade steps will be available in the [upgrade d
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/390417).
</div>
@@ -1718,10 +1781,10 @@ The [Managed Licenses API](https://docs.gitlab.com/ee/api/managed_licenses.html)
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/368195).
</div>
-The [**Maximum number of active pipelines per project** limit](https://docs.gitlab.com/ee/user/admin_area/settings/continuous_integration.html#set-cicd-limits) was never enabled by default and will be removed in GitLab 16.0. This limit can also be configured in the Rails console under [`ci_active_pipelines`](https://docs.gitlab.com/ee/administration/instance_limits.html#number-of-pipelines-running-concurrently). Instead, use the other recommended rate limits that offer similar protection:
+The [**Maximum number of active pipelines per project** limit](https://docs.gitlab.com/ee/administration/settings/continuous_integration.html#set-cicd-limits) was never enabled by default and will be removed in GitLab 16.0. This limit can also be configured in the Rails console under [`ci_active_pipelines`](https://docs.gitlab.com/ee/administration/instance_limits.html#number-of-pipelines-running-concurrently). Instead, use the other recommended rate limits that offer similar protection:
-- [**Pipelines rate limits**](https://docs.gitlab.com/ee/user/admin_area/settings/rate_limit_on_pipelines_creation.html).
-- [**Total number of jobs in currently active pipelines**](https://docs.gitlab.com/ee/user/admin_area/settings/continuous_integration.html#set-cicd-limits).
+- [**Pipelines rate limits**](https://docs.gitlab.com/ee/administration/settings/rate_limit_on_pipelines_creation.html).
+- [**Total number of jobs in currently active pipelines**](https://docs.gitlab.com/ee/administration/settings/continuous_integration.html#set-cicd-limits).
</div>
@@ -1731,7 +1794,7 @@ The [**Maximum number of active pipelines per project** limit](https://docs.gitl
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.7</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/346541).
</div>
@@ -1746,7 +1809,7 @@ However, since certificate-based integration with Kubernetes clusters is depreca
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.4</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/369122).
</div>
@@ -1773,7 +1836,7 @@ default is applied:
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/388269).
</div>
@@ -1794,7 +1857,7 @@ and `config/redis.shared_state.yml` files.
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/389557).
</div>
@@ -1812,7 +1875,7 @@ The option to delete groups and projects immediately by default was deprecated t
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.1</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/346335).
</div>
@@ -1826,7 +1889,7 @@ Previously, the [PipelineSecurityReportFinding GraphQL type was updated](https:/
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/349185).
</div>
@@ -1846,7 +1909,7 @@ Support for PostgreSQL 13 was added to Geo in GitLab 15.2.
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/385798).
</div>
@@ -1890,7 +1953,7 @@ Alternatives to using the `gitlab:import:repos` Rake task include:
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.3</span>
- End of Support: GitLab <span class="milestone">15.6</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/331468).
</div>
@@ -1906,7 +1969,7 @@ If you are using your own Redis 5.0 instance, you should upgrade it to Redis 6.0
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.2</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/334253).
</div>
@@ -1922,7 +1985,7 @@ This could be a breaking change for anyone that developed their own runner that
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/390416).
</div>
@@ -1962,7 +2025,7 @@ Work to replace the PHPCS Security Audit-based analyzer is tracked in [issue 364
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/390912).
</div>
@@ -2005,7 +2068,7 @@ Specifically, the following are being deprecated and will no longer be updated a
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/391822).
</div>
@@ -2040,7 +2103,7 @@ However, due to compatibility issues [discussed in the deprecation issue](https:
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.3</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/366477).
</div>
@@ -2061,7 +2124,7 @@ For more information, refer to [security report validation](https://docs.gitlab.
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.7</span>
- End of Support: GitLab <span class="milestone">16.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/377824).
</div>
@@ -2076,7 +2139,7 @@ and will be moved to the JiHu GitLab codebase.
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.4</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/368828).
</div>
@@ -2090,7 +2153,7 @@ GitLab's operational container scanning capabilities no longer require starboard
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/390266).
</div>
@@ -2113,7 +2176,7 @@ This may require updating your metrics collection targets to also scrape `/db_me
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.7</span>
- End of Support: GitLab <span class="milestone">16.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/385564).
</div>
@@ -2137,7 +2200,7 @@ To use the full state name, including the period, [migrate to the full state fil
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/382129).
</div>
@@ -2162,7 +2225,7 @@ This change affects the following REST and GraphQL API endpoints:
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.7</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-com/Product/-/issues/4894).
</div>
@@ -2176,7 +2239,7 @@ The [Phabricator task importer](https://docs.gitlab.com/ee/user/project/import/p
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/386001).
</div>
@@ -2199,7 +2262,7 @@ To accommodate the changes, you might need to adjust the [`rules`](https://docs.
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.4</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/365365).
</div>
@@ -2213,7 +2276,7 @@ In order to make the behavior of toggling the draft status of a merge request mo
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.10</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/350670).
</div>
@@ -2227,7 +2290,7 @@ Toggling notes confidentiality with REST and GraphQL APIs is being deprecated. U
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.3</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/367166).
</div>
@@ -2242,7 +2305,7 @@ You can use the vulnerabilityFindingDismiss GraphQL mutation to set the status o
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.8</span>
- End of Support: GitLab <span class="milestone">16.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/376216).
</div>
@@ -2264,7 +2327,7 @@ Moving forward, we'll continue to invest in developing and releasing new feature
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.10</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/393836).
</div>
@@ -2286,7 +2349,7 @@ In GitLab 16.0 we will remove the ability to use a global ID in the work items p
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.7</span>
- End of Support: GitLab <span class="milestone">16.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/377825).
</div>
@@ -2301,7 +2364,7 @@ and will be moved to the JiHu GitLab codebase.
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/352957).
</div>
@@ -2330,7 +2393,7 @@ The predefined CI/CD variables that start with `CI_BUILD_*` were deprecated in G
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.7</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/381669).
</div>
@@ -2344,7 +2407,7 @@ The `POST ci/lint` API endpoint is deprecated in 15.7, and will be removed in 16
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/365939).
</div>
@@ -2358,7 +2421,7 @@ To avoid confusion and duplication, the `environment_tier` parameter is deprecat
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/334018).
</div>
@@ -2378,7 +2441,7 @@ We plan to continue to support the `started` state in REST API version until the
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.5</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/375645).
</div>
@@ -2420,7 +2483,7 @@ Starting in GitLab 15.7 we started providing packages for openSUSE Leap 15.4, an
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.8</span>
- End of Support: GitLab <span class="milestone">15.10</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/387976).
</div>
@@ -2442,7 +2505,7 @@ We are deprecating support for [uploading backups to remote storage](https://doc
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/383889).
</div>
@@ -2456,7 +2519,7 @@ The Live Preview feature of the Web IDE was intended to provide a client-side pr
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.5</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/groups/gitlab-org/configure/-/epics/8).
</div>
@@ -2485,7 +2548,7 @@ GitLab self-managed customers can still use the feature [with a feature flag](ht
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">15.5</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/29407).
</div>
@@ -2548,7 +2611,7 @@ This is not expected to cause any incompatibilities with the previous version of
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/352554).
</div>
@@ -2565,7 +2628,6 @@ In GitLab 15.4, GitLab SAST will no longer use the following analyzers:
NOTE:
This change was originally planned for GitLab 15.0 and was postponed to GitLab 15.4.
-See [the removal notice](./removals.md#sast-analyzer-consolidation-and-cicd-template-changes) for further details.
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).
Effective immediately, they will receive only security updates; other routine improvements or updates are not guaranteed.
@@ -2578,8 +2640,8 @@ This change will be reflected in the automatic language detection portion of the
If you've already dismissed a vulnerability finding from one of the deprecated analyzers, the replacement attempts to respect your previous dismissal. The system behavior depends on:
-- whether you’ve excluded the Semgrep-based analyzer from running in the past.
-- which analyzer first discovered the vulnerabilities shown in the project’s Vulnerability Report.
+- whether you've excluded the Semgrep-based analyzer from running in the past.
+- which analyzer first discovered the vulnerabilities shown in the project's Vulnerability Report.
See [Vulnerability translation documentation](https://docs.gitlab.com/ee/user/application_security/sast/analyzers.html#vulnerability-translation) for further details.
@@ -2651,7 +2713,7 @@ Long term service and support (LTSS) for [Debian 9 Stretch ends in July 2022](ht
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.3</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/337993).
</div>
@@ -2669,7 +2731,7 @@ dramatically slow down GitLab instances. For this reason, they are being removed
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/26600).
</div>
@@ -2690,7 +2752,7 @@ GitLab will publish additional guidance to assist affected customers in migratin
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.6</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/342800).
</div>
@@ -2704,7 +2766,7 @@ In GitLab 15.0 we are going to limit the number of characters in CI/CD job names
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.5</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/345347).
</div>
@@ -2722,7 +2784,7 @@ Administrators who need to add runners for multiple projects can register a runn
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
</div>
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).
@@ -2813,7 +2875,7 @@ in the Vulnerability Report.
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/334060).
</div>
@@ -2845,7 +2907,7 @@ gemnasium-python-dependency_scanning:
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.10</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
</div>
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).
@@ -2927,7 +2989,7 @@ The following `geo:db:*` tasks will be replaced with their corresponding `db:*:g
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/262019).
</div>
@@ -2941,7 +3003,7 @@ The feature flag `PUSH_RULES_SUPERSEDE_CODE_OWNERS` is being removed in GitLab 1
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/350275).
</div>
@@ -2984,7 +3046,7 @@ in the Vulnerability Report.
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
</div>
The [external status check API](https://docs.gitlab.com/ee/api/status_checks.html) was originally implemented to
@@ -3023,7 +3085,7 @@ In 15.0, support for daemon mode for GitLab Pages will be removed.
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.3</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/groups/gitlab-org/configure/-/epics/6).
</div>
@@ -3055,7 +3117,7 @@ and will remove it in GitLab 15.0
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/257883).
</div>
@@ -3119,7 +3181,7 @@ an inline argument expression).
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
</div>
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.
@@ -3139,7 +3201,7 @@ The permissions model for GraphQL is being updated. After 15.0, users with the G
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.5</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/28192).
</div>
@@ -3155,7 +3217,7 @@ In GitLab 15.0 and later, the default value for this configuration option will c
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.6</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/335707).
</div>
@@ -3171,7 +3233,7 @@ If you are using our License Compliance API you should stop using the `approved`
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.3</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/338182).
</div>
@@ -3189,7 +3251,7 @@ This deprecation mainly impacts users compiling GitLab from source because Omnib
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.7</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/346485).
</div>
@@ -3215,7 +3277,7 @@ The [`custom_hooks_dir`](https://docs.gitlab.com/ee/administration/server_hooks.
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
</div>
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).
@@ -3228,7 +3290,7 @@ The OAuth implicit grant authorization flow will be removed in our next major re
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
</div>
By default, all new applications expire access tokens after 2 hours. In GitLab 14.2 and earlier, OAuth access tokens
@@ -3239,7 +3301,7 @@ You should [opt in](https://docs.gitlab.com/ee/integration/oauth_provider.html#e
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.
+1. Select **Expire access tokens** to enable them. Tokens must be revoked or they don't expire.
</div>
@@ -3249,7 +3311,7 @@ tokens before GitLab 15.0 is released:
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.3</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/337384).
</div>
@@ -3267,7 +3329,7 @@ Note that we are not deprecating the Kerberos SPNEGO integration, only the old p
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/351962).
</div>
@@ -3283,7 +3345,7 @@ Unexpected behavior in a security feature is inherently dangerous, so we have de
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/351963).
</div>
@@ -3299,7 +3361,7 @@ Unexpected behavior in a security feature is inherently dangerous, so we have de
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/352549).
</div>
@@ -3324,11 +3386,14 @@ If you rely on Java 8 being present in the analyzer environment, you must take a
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.10</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/359133).
</div>
-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.
+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.
</div>
@@ -3354,7 +3419,7 @@ It is now considered deprecated, and will be removed in GitLab 15.0.
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/332323).
</div>
@@ -3368,7 +3433,7 @@ The `instanceStatisticsMeasurements` GraphQL node has been renamed to `usageTren
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/352488).
</div>
@@ -3388,10 +3453,10 @@ For more information, check the [summary section of the deprecation issue](https
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
</div>
-The [required pipeline configuration](https://docs.gitlab.com/ee/user/admin_area/settings/continuous_integration.html#required-pipeline-configuration) feature is deprecated in GitLab 14.8 for Premium customers and is scheduled for removal in GitLab 15.0. This feature is not deprecated for GitLab Ultimate customers.
+The [required pipeline configuration](https://docs.gitlab.com/ee/administration/settings/continuous_integration.html#required-pipeline-configuration) feature is deprecated in GitLab 14.8 for Premium customers and is scheduled for removal in GitLab 15.0. This feature is not deprecated for GitLab Ultimate customers.
This change to move the feature to GitLab's Ultimate tier is intended to help our features better align with our [pricing philosophy](https://about.gitlab.com/company/pricing/#three-tiers) as we see demand for this feature originating primarily from executives.
@@ -3406,7 +3471,7 @@ This change will also help GitLab remain consistent in its tiering strategy with
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/350510).
</div>
@@ -3446,7 +3511,7 @@ in the Vulnerability Report.
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/352553).
</div>
@@ -3530,7 +3595,7 @@ in the Vulnerability Report.
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/352564).
</div>
@@ -3558,7 +3623,7 @@ See the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/352564
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/350936).
</div>
@@ -3603,7 +3668,7 @@ Specifically, the following are being deprecated and will no longer be updated a
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.7</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/347509).
</div>
@@ -3650,7 +3715,7 @@ Current users of the Static Site Editor can view the [documentation](https://doc
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.5</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
</div>
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.
@@ -3663,7 +3728,7 @@ Long term service and support (LTSS) for SUSE Linux Enterprise Server (SLES) 12
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
</div>
Although not recommended or documented, it was possible to deploy a gRPC-aware proxy between Gitaly and
@@ -3686,14 +3751,14 @@ the [relevant epic](https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/463).
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
</div>
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-removed)
is being removed.
-Instead, using the project’s `.gitlab-ci.yml`, provide a regular expression with the `coverage` keyword to set
+Instead, using the project's `.gitlab-ci.yml`, provide a regular expression with the `coverage` keyword to set
testing coverage results in merge requests.
</div>
@@ -3704,7 +3769,7 @@ testing coverage results in merge requests.
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.7</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/346540).
</div>
@@ -3718,7 +3783,7 @@ Tracing in GitLab is an integration with Jaeger, an open-source end-to-end distr
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.5</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/336912).
</div>
@@ -3734,7 +3799,7 @@ The `GET /groups/:id/registry/repositories` endpoint will remain, but won't retu
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.5</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/343210).
</div>
@@ -3750,7 +3815,7 @@ If you monitor Value Stream Analytics metrics and rely on the date filter, to av
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
</div>
The vulnerability check feature is deprecated in GitLab 14.8 and 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.
@@ -3770,7 +3835,7 @@ The new security approvals feature is similar to vulnerability check. For exampl
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.5</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/327453).
</div>
@@ -3786,7 +3851,7 @@ In milestone 15.0, we will completely remove `Version` from `PackageType`.
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.7</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/348980).
</div>
@@ -3803,7 +3868,7 @@ only supported report file in 15.0, but this is the first step towards GitLab su
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.5</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/345451).
</div>
@@ -3817,7 +3882,7 @@ The GraphQL API field `defaultMergeCommitMessageWithDescription` has been deprec
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.5</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/276777).
</div>
@@ -3833,7 +3898,7 @@ In milestone 15.0, we will remove the feature flag entirely. Moving forward, you
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.5</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/342882).
</div>
@@ -3852,7 +3917,7 @@ To mitigate possible performance problems, we will remove the `versions` field's
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
</div>
The `projectFingerprint` field in the [PipelineSecurityReportFinding](https://docs.gitlab.com/ee/api/graphql/reference/index.html#pipelinesecurityreportfinding)
@@ -3868,7 +3933,7 @@ exposed in the UUID field. Data previously available in the projectFingerprint f
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.5</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/345207).
</div>
@@ -3882,7 +3947,7 @@ In GitLab 14.5, we introduced the command `gitlab-ctl promote` to promote any Ge
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.5</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/345207).
</div>
@@ -3896,7 +3961,7 @@ In GitLab 14.5, we introduced the command `gitlab-ctl promote` to promote any Ge
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.6</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
</div>
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.
@@ -3909,7 +3974,7 @@ The `type` and `types` CI/CD keywords will be removed in GitLab 15.0. Pipelines
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.6</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/333233).
</div>
@@ -3925,7 +3990,7 @@ which isn't being used in GitLab anymore.
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.6</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/289832).
</div>
@@ -3941,7 +4006,7 @@ If you have explicitly excluded bundler-audit using DS_EXCLUDED_ANALYZERS you wi
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
</div>
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`.
@@ -3956,7 +4021,7 @@ Since it isn't used in the context of GitLab (the product), `htpasswd` authentic
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
</div>
The `user_email_lookup_limit` [API field](https://docs.gitlab.com/ee/api/settings.html) is deprecated and will be removed in GitLab 15.0. Until GitLab 15.0, `user_email_lookup_limit` is aliased to `search_rate_limit` and existing workflows will continue to work.
@@ -3976,7 +4041,7 @@ Any API calls attempting to change the rate limits for `user_email_lookup_limit`
<div class="deprecation-notes">
- Announced in: GitLab <span class="milestone">14.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+- This is a [breaking change](https://docs.gitlab.com/ee/update/terminology.html#breaking-change).
</div>
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.
diff --git a/doc/update/img/batched_background_migrations_failed_v14_3.png b/doc/update/img/batched_background_migrations_failed_v14_3.png
new file mode 100644
index 00000000000..dc8e3ff326b
--- /dev/null
+++ b/doc/update/img/batched_background_migrations_failed_v14_3.png
Binary files differ
diff --git a/doc/update/img/batched_background_migrations_queued_v14_0.png b/doc/update/img/batched_background_migrations_queued_v14_0.png
deleted file mode 100644
index 0b0792b5e7a..00000000000
--- a/doc/update/img/batched_background_migrations_queued_v14_0.png
+++ /dev/null
Binary files differ
diff --git a/doc/update/index.md b/doc/update/index.md
index 0380f1a69ef..ced7ed86691 100644
--- a/doc/update/index.md
+++ b/doc/update/index.md
@@ -162,22 +162,14 @@ cannot guarantee that upgrading between major versions is seamless.
A *major* upgrade requires the following steps:
-1. Start by identifying a [supported upgrade path](#upgrade-paths). This is essential for a successful *major* version upgrade.
-1. Upgrade to the latest minor version of the preceding major version.
-1. Upgrade to the "dot zero" release of the next major version (`X.0.Z`).
-1. Optional. Follow the [upgrade path](#upgrade-paths), and proceed with upgrading to newer releases of that major version.
-
-It's also important to ensure that any [background migrations have been fully completed](background_migrations.md)
-before upgrading to a new major version.
-
-If you have enabled the [Elasticsearch integration](../integration/advanced_search/elasticsearch.md) **(PREMIUM SELF)**, then
-[ensure all advanced search migrations are completed](#checking-for-pending-advanced-search-migrations) in the last minor version in
-your current version
-before proceeding with the major version upgrade.
-
-If your GitLab instance has any runners associated with it, it is very
-important to upgrade GitLab Runner to match the GitLab minor version that was
-upgraded to. This is to ensure [compatibility with GitLab versions](https://docs.gitlab.com/runner/#gitlab-runner-versions).
+1. Identify a [supported upgrade path](#upgrade-paths).
+1. Ensure that any [background migrations have been fully completed](background_migrations.md)
+ before upgrading to a new major version.
+1. If you have enabled the [Elasticsearch integration](../integration/advanced_search/elasticsearch.md), then
+ before proceeding with the major version upgrade, [ensure that all advanced search migrations are completed](#checking-for-pending-advanced-search-migrations).
+1. If your GitLab instance has any runners associated with it, it is very
+ important to upgrade them to match the current GitLab version. This ensures
+ [compatibility with GitLab versions](https://docs.gitlab.com/runner/#gitlab-runner-versions).
## Upgrade paths
@@ -186,6 +178,15 @@ If you don't want any downtime, read how to [upgrade with zero downtime](zero_do
For a dynamic view of examples of supported upgrade paths, try the [Upgrade Path tool](https://gitlab-com.gitlab.io/support/toolbox/upgrade-path/) maintained by the [GitLab Support team](https://about.gitlab.com/handbook/support/#about-the-support-team). To share feedback and help improve the tool, create an issue or MR in the [upgrade-path project](https://gitlab.com/gitlab-com/support/toolbox/upgrade-path).
+Required upgrade stops are versions of GitLab that you must upgrade to before upgrading to later versions. Required upgrade stops allow required background
+migrations to finish.
+
+During GitLab 16.x, we are scheduling two or three required upgrade stops. We will give at least two milestones of notice when we
+schedule a required upgrade stop.
+
+The first planned required upgrade stop is scheduled for GitLab 16.3. If nothing is introduced requiring an upgrade stop, GitLab 16.3 will be treated as a
+regular upgrade.
+
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):
@@ -284,6 +285,13 @@ and [Helm Chart deployments](https://docs.gitlab.com/charts/). They come with ap
[backfill `prepared_at` values on the `merge_requests` table](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/111865). This
migration may take multiple days to complete on larger GitLab instances. Make sure the migration
has completed successfully before upgrading to 16.1.0.
+- Geo: Some project imports do not initialize wiki repositories on project creation. Since the migration of project wikis to SSF, [missing wiki repositories are being incorrectly flagged as failing verification](https://gitlab.com/gitlab-org/gitlab/-/issues/409704). This is not a result of an actual replication/verification failure but an invalid internal state for these missing repositories inside Geo and results in errors in the logs and the verification progress reporting a failed state for these wiki repositories. If you have not imported projects you are not impacted by this issue.
+ - Impacted versions: GitLab versions 15.11.x, 16.0.x, and 16.1.0 - 16.1.2.
+ - Versions containing fix: GitLab 16.1.3 and later.
+- Geo: Since the migration of project designs to SSF, [missing design repositories are being incorrectly flagged as failing verification](https://gitlab.com/gitlab-org/gitlab/-/issues/414279). This is not a result of an actual replication/verification failure but an invalid internal state for these missing repositories inside Geo and results in errors in the logs and the verification progress reporting a failed state for these design repositories. You could be impacted by this issue even if you have not imported projects.
+ - Impacted versions: GitLab versions 16.1.x.
+ - Versions containing fix: GitLab 16.2.0 and later.
+- For self-compiled installations: You must remove any settings related to Puma worker killer from the `puma.rb` configuration file, since those have been [removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/118645). For more information, see the [`puma.rb.example`](https://gitlab.com/gitlab-org/gitlab/-/blob/16-0-stable-ee/config/puma.rb.example) file.
### 16.0.0
@@ -294,18 +302,35 @@ and [Helm Chart deployments](https://docs.gitlab.com/charts/). They come with ap
all queues. This behavior does not apply if you have configured the [routing rules](../administration/sidekiq/processing_specific_job_classes.md#routing-rules).
- Docker 20.10.10 or later is required to run the GitLab Docker image. Older versions
[throw errors on startup](../install/docker.md#threaderror-cant-create-thread-operation-not-permitted).
+- Geo: Some project imports do not initialize wiki repositories on project creation. Since the migration of project wikis to SSF, [missing wiki repositories are being incorrectly flagged as failing verification](https://gitlab.com/gitlab-org/gitlab/-/issues/409704). This is not a result of an actual replication/verification failure but an invalid internal state for these missing repositories inside Geo and results in errors in the logs and the verification progress reporting a failed state for these wiki repositories. If you have not imported projects you are not impacted by this issue.
+ - Impacted versions: GitLab versions 15.11.x, 16.0.x, and 16.1.0 - 16.1.2.
+ - Versions containing fix: GitLab 16.1.3 and later.
+- Starting with 16.0, GitLab self-managed installations now have two database connections by default, instead of one. This change doubles the number of PostgreSQL connections. It makes self-managed versions of GitLab behave similarly to GitLab.com, and is a step toward enabling a separate database for CI features for self-managed versions of GitLab. Before upgrading to 16.0, determine if you need to [increase max connections for PostgreSQL](https://docs.gitlab.com/omnibus/settings/database.html#configuring-multiple-database-connections).
+ - This change applies to installation methods with Linux packages (Omnibus GitLab), GitLab Helm chart, GitLab Operator, GitLab Docker images, and installation from source.
### 15.11.1
- Many [project importers](../user/project/import/index.md) and [group importers](../user/group/import/index.md) now
require the Maintainer role instead of only requiring the Developer role. For more information, see the documentation
for any importers you use.
+- Geo: Some project imports do not initialize wiki repositories on project creation. Since the migration of project wikis to SSF, [missing wiki repositories are being incorrectly flagged as failing verification](https://gitlab.com/gitlab-org/gitlab/-/issues/409704). This is not a result of an actual replication/verification failure but an invalid internal state for these missing repositories inside Geo and results in errors in the logs and the verification progress reporting a failed state for these wiki repositories. If you have not imported projects you are not impacted by this issue.
+ - Impacted versions: GitLab versions 15.11.x, 16.0.x, and 16.1.0 - 16.1.2.
+ - Versions containing fix: GitLab 16.1.3 and later.
+- Geo: A [bug](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/7841) in the built-in `pg-upgrade` tool prevents upgrading the bundled PostgreSQL database to version 13. This leaves the secondary site in a broken state, and prevents upgrading the Geo installation to GitLab 16.x ([PostgreSQL 12 support has removed in 16.0](deprecations.md#postgresql-12-deprecated) and later releases). This occurs on secondary sites using the bundled PostgreSQL software, running both the secondary main Rails database and tracking database on the same node. There is a manual [workaround](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/7841#workaround) for those impacted until a fix is backported to 15.11.
+ - Impacted versions: GitLab versions 15.2 - 15.11
+ - Version 16.0 and later are not impacted. Note, 15.11 is a mandatory upgrade stop on the way to 16.0.
### 15.11.0
- Upgrades to GitLab 15.11 directly from GitLab versions 15.5.0 and earlier on self-managed installs will fail due to a missing migration until the fix for [issue 408304](https://gitlab.com/gitlab-org/gitlab/-/issues/408304) is released in version 15.11.3. Affected users wanting to upgrade to 15.11 can either:
- Perform an intermediate upgrade to any version between 15.5 and 15.10 before upgrading to 15.11, or
- Target version 15.11.3 or later.
+- Geo: Some project imports do not initialize wiki repositories on project creation. Since the migration of project wikis to SSF, [missing wiki repositories are being incorrectly flagged as failing verification](https://gitlab.com/gitlab-org/gitlab/-/issues/409704). This is not a result of an actual replication/verification failure but an invalid internal state for these missing repositories inside Geo and results in errors in the logs and the verification progress reporting a failed state for these wiki repositories. If you have not imported projects you are not impacted by this issue.
+ - Impacted versions: GitLab versions 15.11.x, 16.0.x, and 16.1.0 - 16.1.2.
+ - Versions containing fix: GitLab 16.1.3 and later.
+- Geo: A [bug](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/7841) in the built-in `pg-upgrade` tool prevents upgrading the bundled PostgreSQL database to version 13. This leaves the secondary site in a broken state, and prevents upgrading the Geo installation to GitLab 16.x ([PostgreSQL 12 support has removed in 16.0](deprecations.md#postgresql-12-deprecated) and later releases). This occurs on secondary sites using the bundled PostgreSQL software, running both the secondary main Rails database and tracking database on the same node. There is a manual [workaround](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/7841#workaround) for those impacted until a fix is backported to 15.11.
+ - Impacted versions: GitLab versions 15.2 - 15.11
+ - Version 16.0 and later are not impacted. Note, 15.11 is a mandatory upgrade stop on the way to 16.0.
### 15.10.5
@@ -317,6 +342,51 @@ and [Helm Chart deployments](https://docs.gitlab.com/charts/). They come with ap
- Gitaly configuration changes significantly in Omnibus GitLab 16.0. You can begin migrating to the new structure in Omnibus GitLab 15.10 while backwards compatibility is
maintained in the lead up to Omnibus GitLab 16.0. [Read more about this change](#gitaly-omnibus-gitlab-configuration-structure-change).
+- You might encounter the following error while upgrading to GitLab 15.10 or later:
+
+ ```shell
+ STDOUT: rake aborted!
+ StandardError: An error has occurred, all later migrations canceled:
+ PG::CheckViolation: ERROR: check constraint "check_70f294ef54" is violated by some row
+ ```
+
+ This error is caused by a [batched background migration introduced in GitLab 15.8](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107701)
+ not being finalized before GitLab 15.10. To resolve this error:
+
+ 1. Execute the following SQL statement using the database console (`sudo gitlab-psql` for Linux package installs):
+
+ ```sql
+ UPDATE oauth_access_tokens SET expires_in = '7200' WHERE expires_in IS NULL;
+ ```
+
+ 1. [Re-run database migrations](../administration/raketasks/maintenance.md#run-incomplete-database-migrations).
+
+- You might also encounter the following error while upgrading to GitLab 15.10 or later:
+
+ ```shell
+ "exception.class": "ActiveRecord::StatementInvalid",
+ "exception.message": "PG::SyntaxError: ERROR: zero-length delimited identifier at or near \"\"\"\"\nLINE 1: ...COALESCE(\"lock_version\", 0) + 1 WHERE \"ci_builds\".\"\" IN (SEL...\n
+ ```
+
+ This error is caused by a [batched background migration introduced in GitLab 14.9](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81410)
+ not being finalized before upgrading to GitLab 15.10 or later. To resolve this error, it is safe to [mark the migration as complete](background_migrations.md#mark-a-batched-migration-finished):
+
+ ```ruby
+ # Start the rails console
+
+ connection = Ci::ApplicationRecord.connection
+
+ Gitlab::Database::SharedModel.using_connection(connection) do
+ migration = Gitlab::Database::BackgroundMigration::BatchedMigration.find_for_configuration(
+ Gitlab::Database.gitlab_schemas_for_connection(connection), 'NullifyOrphanRunnerIdOnCiBuilds', :ci_builds, :id, [])
+
+ # mark all jobs completed
+ migration.batched_jobs.update_all(status: Gitlab::Database::BackgroundMigration::BatchedJob.state_machine.states[:succeeded].value)
+ migration.update_attribute(:status, Gitlab::Database::BackgroundMigration::BatchedMigration.state_machine.states[:finished].value)
+ end
+ ```
+
+For more information, see [issue 415724](https://gitlab.com/gitlab-org/gitlab/-/issues/415724).
### 15.9.0
@@ -780,7 +850,7 @@ A [license caching issue](https://gitlab.com/gitlab-org/gitlab/-/issues/376706)
- If you run external PostgreSQL, particularly AWS RDS,
[check you have a PostgreSQL bug fix](#postgresql-segmentation-fault-issue)
to avoid the database crashing.
-- The use of encrypted S3 buckets with storage-specific configuration is no longer supported after [removing support for using `background_upload`](removals.md#background-upload-for-object-storage).
+- The use of encrypted S3 buckets with storage-specific configuration is no longer supported after [removing support for using `background_upload`](deprecations.md#background-upload-for-object-storage).
- The [certificate-based Kubernetes integration (DEPRECATED)](../user/infrastructure/clusters/index.md#certificate-based-kubernetes-integration-deprecated) is disabled by default, but you can be re-enable it through the [`certificate_based_clusters` feature flag](../administration/feature_flags.md#how-to-enable-and-disable-features-behind-flags) until GitLab 16.0.
- When you use the GitLab Helm Chart project with a custom `serviceAccount`, ensure it has `get` and `list` permissions for the `serviceAccount` and `secret` resources.
- The [`custom_hooks_dir`](../administration/server_hooks.md#create-global-server-hooks-for-all-repositories) setting for configuring global server hooks is now configured in
diff --git a/doc/update/package/convert_to_ee.md b/doc/update/package/convert_to_ee.md
index 0e8e0b1e569..31de896349c 100644
--- a/doc/update/package/convert_to_ee.md
+++ b/doc/update/package/convert_to_ee.md
@@ -22,7 +22,7 @@ that may require Support intervention.
The steps can be summed up to:
-1. Make a [GitLab backup](../../raketasks/backup_gitlab.md).
+1. Make a [GitLab backup](../../administration/backup_restore/backup_gitlab.md).
1. Find the currently installed GitLab version:
@@ -69,7 +69,7 @@ The steps can be summed up to:
If you want to use `dpkg`/`rpm` instead of `apt-get`/`yum`, go through the first
step to find the current GitLab version, then follow
[Upgrade using a manually-downloaded package](index.md#upgrade-using-a-manually-downloaded-package),
- and then [add your license](../../user/admin_area/license.md).
+ and then [add your license](../../administration/license.md).
1. Install the `gitlab-ee` package. The install automatically
uninstalls the `gitlab-ce` package on your GitLab server. `reconfigure`
@@ -99,7 +99,7 @@ The steps can be summed up to:
sudo gitlab-ctl reconfigure
```
-1. Now activate GitLab Enterprise Edition by [adding your license](../../user/admin_area/license.md).
+1. Now activate GitLab Enterprise Edition by [adding your license](../../administration/license.md).
1. After you confirm that GitLab is working as expected, you may remove the old
Community Edition repository:
diff --git a/doc/update/package/downgrade.md b/doc/update/package/downgrade.md
index 7b48f1f4045..14b9bd981fd 100644
--- a/doc/update/package/downgrade.md
+++ b/doc/update/package/downgrade.md
@@ -12,7 +12,7 @@ of a package.
WARNING:
You must at least have a database backup created under the version you are
downgrading to. Ideally, you should have a
-[full backup archive](../../raketasks/backup_restore.md)
+[full backup archive](../../administration/backup_restore/index.md)
on hand.
The example below demonstrates the downgrade procedure when downgrading between minor
@@ -79,5 +79,5 @@ Steps:
sudo gitlab-ctl reconfigure
```
-1. [Restore GitLab](../../raketasks/restore_gitlab.md#restore-for-omnibus-gitlab-installations)
+1. [Restore GitLab](../../administration/backup_restore/restore_gitlab.md#restore-for-omnibus-gitlab-installations)
to complete the downgrade.
diff --git a/doc/update/package/index.md b/doc/update/package/index.md
index 3e0d09eb36e..e61eaae5883 100644
--- a/doc/update/package/index.md
+++ b/doc/update/package/index.md
@@ -39,6 +39,7 @@ GitLab package.
Upgrading versions might need some manual intervention. For more information,
check the version your are upgrading to:
+- [GitLab 16](https://docs.gitlab.com/omnibus/update/gitlab_16_changes.html)
- [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)
@@ -56,7 +57,7 @@ sudo touch /etc/gitlab/skip-auto-backup
```
Nevertheless, it is highly recommended to maintain a full up-to-date
-[backup](../../raketasks/backup_restore.md) on your own.
+[backup](../../administration/backup_restore/index.md) on your own.
## Upgrade using the official repositories
@@ -178,7 +179,7 @@ To download and install GitLab:
# Debian/Ubuntu
dpkg -i <package_name>
- # RHEL/CentOS 6 and 7
+ # RHEL/CentOS 6 and 7
rpm -Uvh <package_name>
# RHEL/CentOS 8
diff --git a/doc/update/patch_versions.md b/doc/update/patch_versions.md
index 964c6430a16..3211b732f0a 100644
--- a/doc/update/patch_versions.md
+++ b/doc/update/patch_versions.md
@@ -14,7 +14,7 @@ You can select the tag in the version dropdown list in the upper-left corner of
### 0. Backup
-Make a backup just in case things go south. Depending on the installation method, backup commands vary. See the [backing up and restoring GitLab](../raketasks/backup_restore.md) documentation.
+Make a backup just in case things go south. Depending on the installation method, backup commands vary. See the [backing up and restoring GitLab](../administration/backup_restore/index.md) documentation.
### 1. Stop server
diff --git a/doc/update/plan_your_upgrade.md b/doc/update/plan_your_upgrade.md
index 9378b104c81..634c430e251 100644
--- a/doc/update/plan_your_upgrade.md
+++ b/doc/update/plan_your_upgrade.md
@@ -11,7 +11,7 @@ GitLab instance.
General notes:
-- If possible, we recommend you test out the upgrade in a test environment before
+- If possible, you should 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-upgrade-assistance/)
@@ -75,25 +75,25 @@ Create a backup of GitLab and all its data (database, repositories, uploads, bui
artifacts, LFS objects, registry, pages). This is vital for making it possible
to roll back GitLab to a working state if there's a problem with the upgrade:
-- Create a [GitLab backup](../raketasks/backup_restore.md).
+- Create a [GitLab backup](../administration/backup_restore/index.md).
Make sure to follow the instructions based on your installation method.
- Don't forget to back up the [secrets and configuration files](../raketasks/backup_gitlab.md#storing-configuration-files).
+ Don't forget to back up the [secrets and configuration files](../administration/backup_restore/backup_gitlab.md#storing-configuration-files).
- Alternatively, create a snapshot of your instance. If this is a multi-node
installation, you must snapshot every node.
**This process is out of scope for GitLab Support.**
### Restore GitLab
-If you have a test environment that mimics your production one, we recommend testing the restoration to ensure that everything works as you expect.
+If you have a test environment that mimics your production one, you should test the restoration to ensure that everything works as you expect.
To restore your GitLab backup:
- Before restoring, make sure to read about the
- [prerequisites](../raketasks/backup_restore.md#restore-gitlab), most importantly,
+ [prerequisites](../administration/backup_restore/index.md#restore-gitlab), most importantly,
the versions of the backed up and the new GitLab instance must be the same.
-- [Restore GitLab](../raketasks/backup_restore.md#restore-gitlab).
+- [Restore GitLab](../administration/backup_restore/index.md#restore-gitlab).
Make sure to follow the instructions based on your installation method.
- Confirm that the [secrets and configuration files](../raketasks/backup_gitlab.md#storing-configuration-files) are also restored.
+ Confirm that the [secrets and configuration files](../administration/backup_restore/backup_gitlab.md#storing-configuration-files) are also restored.
- If restoring from a snapshot, know the steps to do this.
**This process is out of scope for GitLab Support.**
diff --git a/doc/update/removals.md b/doc/update/removals.md
index a5cd33e50d9..56f8b34fd27 100644
--- a/doc/update/removals.md
+++ b/doc/update/removals.md
@@ -1,2593 +1,11 @@
---
-stage: none
-group: none
-info: "See the Technical Writers assigned to Development Guidelines: https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments-to-development-guidelines"
+redirect_to: 'deprecations.md'
+remove_date: '2023-09-28'
---
-# Removals by version
+This document was moved to [another location](deprecations.md).
-In each release, GitLab removes features that were [deprecated](deprecations.md) in an earlier release.
-Some features cause breaking changes when they are removed.
-
-**{rss}** **To be notified of upcoming breaking changes**,
-add this URL to your RSS feed reader: `https://about.gitlab.com/breaking-changes.xml`
-
-<!-- vale off -->
-
-<!--
-DO NOT EDIT THIS PAGE DIRECTLY
-
-This page is automatically generated from the YAML files in `/data/removals` by the rake task
-located at `lib/tasks/gitlab/docs/compile_removals.rake`.
-
-For removal authors (usually Product Managers and Engineering Managers):
-
-- To add a removal, use the example.yml file in `/data/removals/templates` as a template.
-- For more information about authoring removals, check the the removal item guidance:
- https://about.gitlab.com/handbook/marketing/blog/release-posts/#creating-a-removal-entry
-
-For removal reviewers (Technical Writers only):
-
-- To update the removal doc, run: `bin/rake gitlab:docs:compile_removals`
-- To verify the removals doc is up to date, run: `bin/rake gitlab:docs:check_removals`
-- For more information about updating the removal doc, see the removal doc update guidance:
- https://about.gitlab.com/handbook/marketing/blog/release-posts/#update-the-removals-doc
--->
-
-{::options parse_block_html="true" /}
-
-## Removed in 16.0
-
-### Auto DevOps no longer provisions a database by default
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/343988).
-</div>
-
-Currently, Auto DevOps provisions an in-cluster PostgreSQL database by default.
-In GitLab 16.0, databases will be provisioned only for users who opt in. This
-change supports production deployments that require more robust database management.
-
-If you want Auto DevOps to provision an in-cluster database,
-set the `POSTGRES_ENABLED` CI/CD variable to `true`.
-
-### Azure Storage Driver defaults to the correct root prefix
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/container-registry/-/issues/854).
-</div>
-
-The Azure Storage Driver used to write to `//` as the default root directory. This default root directory appeared in some places in the Azure UI as `/<no-name>/`. We maintained this legacy behavior to support older deployments using this storage driver. However, when moving to Azure from another storage driver, this behavior hides all your data until you configure the storage driver with `trimlegacyrootprefix: true` to build root paths without an extra leading slash.
-
-In GitLab 16.0, the new default configuration for the storage driver uses `trimlegacyrootprefix: true`, and `/` is the default root directory. You can set your configuration to `trimlegacyrootprefix: false` if needed, to revert to the previous behavior.
-
-### Bundled Grafana Helm Chart
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.10</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/charts/gitlab/-/issues/4353).
-</div>
-
-The Grafana Helm chart that was bundled with the GitLab Helm Chart is removed in the GitLab Helm Chart 7.0 release (releasing along with GitLab 16.0).
-
-The `global.grafana.enabled` setting for the GitLab Helm Chart has also been removed alongside the Grafana Helm chart.
-
-If you're using the bundled Grafana, you should switch to the [newer chart version from Grafana Labs](https://artifacthub.io/packages/helm/grafana/grafana)
-or a Grafana Operator from a trusted provider.
-
-In your new Grafana instance, [configure the GitLab provided Prometheus as a data source](https://docs.gitlab.com/ee/administration/monitoring/performance/grafana_configuration.html#configure-grafana)
-and [connect Grafana to the GitLab UI](https://docs.gitlab.com/ee/administration/monitoring/performance/grafana_configuration.html#integrate-with-gitlab-ui).
-
-### CAS OmniAuth provider is removed
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.3</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/369127).
-</div>
-
-The `omniauth-cas3` gem that provides GitLab with the CAS OmniAuth provider is being removed. You can no longer authenticate into a GitLab instance through CAS. This gem sees very little use. [The gem](https://rubygems.org/gems/omniauth-cas3/) has not had a new release in almost 5 years, which means that its dependencies are out of date and required manual patching during GitLab's [upgrade to OmniAuth 2.0](https://gitlab.com/gitlab-org/gitlab/-/issues/30073).
-
-### CiCdSettingsUpdate mutation renamed to ProjectCiCdSettingsUpdate
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/361801).
-</div>
-
-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.
-
-### Conan project-level search returns only project-specific results"
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/384455).
-</div>
-
-The [GitLab Conan repository](https://docs.gitlab.com/ee/user/packages/conan_repository/) supports the `conan search` command, but when searching a project-level endpoint, instance-level Conan packages could have been returned. This unintended functionality is removed in GitLab 16.0. The search endpoint for the project level now only returns packages from the target project.
-
-### Configuring Redis config file paths using environment variables is no longer supported
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/388255).
-</div>
-
-You can no longer specify Redis configuration file locations
-using the environment variables like `GITLAB_REDIS_CACHE_CONFIG_FILE` or
-`GITLAB_REDIS_QUEUES_CONFIG_FILE`. Use the default
-configuration file locations instead, for example `config/redis.cache.yml` or
-`config/redis.queues.yml`.
-
-### Container Registry pull-through cache is removed
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/container-registry/-/issues/937).
-</div>
-
-The Container Registry [pull-through cache](https://docs.docker.com/registry/recipes/mirror/) was deprecated in GitLab 15.8 and removed in GitLab 16.0. This feature is part of the upstream [Docker Distribution project](https://github.com/distribution/distribution) but we are removing that code in favor of the GitLab Dependency Proxy. Use the GitLab Dependency Proxy to proxy and cache container images from Docker Hub.
-
-### Container Scanning variables that reference Docker removed
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.4</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/371840).
-</div>
-
-All Container Scanning variables with a name prefixed by `DOCKER_` have been removed. This includes:
-
-- `DOCKER_IMAGE`
-- `DOCKER_PASSWORD`
-- `DOCKER_USER`
-- `DOCKERFILE_PATH`
-
-Instead, use the [new variable names](https://docs.gitlab.com/ee/user/application_security/container_scanning/#available-cicd-variables):
-
-- `CS_IMAGE`
-- `CS_REGISTRY_PASSWORD`
-- `CS_REGISTRY_USER`
-- `CS_DOCKERFILE_PATH`
-
-### Default value of `ttl_days` now 30 days
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.4</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/369122).
-</div>
-
-From GitLab 16.0, any personal, project, or group access token [must have an expiration date](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/96594). If you create a personal access token with the GitLab Shell command `personal_access_token` without specifying `ttl_days`, a default value of 30 days is now applied.
-
-### Dependency Scanning ends support for Java 13, 14, 15, and 16
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/387560).
-</div>
-
-Dependency Scanning no longer supports projects that use Java versions 13, 14, 15, and 16.
-
-### Developer role providing the ability to import projects to a group
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/387891).
-</div>
-
-The ability for users with the Developer role for a group to import projects to that group was deprecated in GitLab
-15.8 and is removed in GitLab 16.0.
-
-From GitLab 16.0, only users with at least the Maintainer role for a group can import projects to that group.
-
-### Embedding Grafana panels in Markdown is removed
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/389477).
-</div>
-
-The ability to add Grafana panels in GitLab Flavored Markdown is removed.
-We intend to replace this feature with the ability to [embed charts](https://gitlab.com/groups/gitlab-org/opstrace/-/epics/33)
-with the [GitLab Observability UI](https://gitlab.com/gitlab-org/opstrace/opstrace-ui).
-
-### Enforced validation of CI/CD parameter character lengths
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/372770).
-</div>
-
-Previously, only CI/CD [job names](https://docs.gitlab.com/ee/ci/jobs/index.html#job-name-limitations) had a strict 255-character limit. Now, more CI/CD keywords are validated to ensure they stay under the limit.
-
-The following to 255 characters are now strictly limited to 255 characters:
-
-- The `stage` keyword.
-- The `ref` parameter, which is the Git branch or tag name for the pipeline.
-- The `description` and `target_url` parameters, used by external CI/CD integrations.
-
-Users on self-managed instances should update their pipelines to ensure they do not use parameters that exceed 255 characters. Users on GitLab.com do not need to make any changes, as these parameters are already limited in that database.
-
-### GitLab administrators must have permission to modify protected branches or tags
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">16.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/12776).
-</div>
-
-GitLab administrators can no longer perform actions on protected branches or tags unless they have been explicitly granted that permission. These actions include pushing and merging into a [protected branch](https://docs.gitlab.com/ee/user/project/protected_branches.html), unprotecting a branch, and creating [protected tags](https://docs.gitlab.com/ee/user/project/protected_tags.html).
-
-### GitLab.com importer
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.8</span>
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-com/Product/-/issues/4895).
-</div>
-
-The [GitLab.com importer](https://docs.gitlab.com/ee/user/project/import/gitlab_com.html) was deprecated in GitLab 15.8 and is removed in GitLab 16.0.
-
-The GitLab.com importer was introduced in 2015 for importing a project from GitLab.com to a self-managed GitLab instance through the UI.
-
-This feature was available on self-managed instances only. [Migrating GitLab groups and projects by direct transfer](https://docs.gitlab.com/ee/user/group/import/#migrate-groups-by-direct-transfer-recommended)
-supersedes the GitLab.com importer and provides a more cohesive importing functionality.
-
-See [migrated group items](https://docs.gitlab.com/ee/user/group/import/#migrated-group-items) and [migrated project items](https://docs.gitlab.com/ee/user/group/import/#migrated-project-items) for an overview.
-
-### GraphQL API: Runner status no longer returns `PAUSED` and `ACTIVE` values
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/344648).
-</div>
-
-In GitLab 16.0 and later, the GraphQL query for runners will no longer return the statuses `PAUSED` and `ACTIVE`.
-
-- `PAUSED` has been replaced with the field, `paused: true`.
-- `ACTIVE` has been replaced with the field, `paused: false`.
-
-### Jira DVCS connector for Jira Cloud and Jira 8.13 and earlier
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.1</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/362168).
-</div>
-
-The [Jira DVCS connector](https://docs.gitlab.com/ee/integration/jira/dvcs/) for Jira Cloud was deprecated in GitLab 15.1 and has been removed in 16.0. Use the [GitLab for Jira Cloud app](https://docs.gitlab.com/ee/integration/jira/connect-app.html) instead. The Jira DVCS connector was also deprecated for Jira 8.13 and earlier. You can only use the Jira DVCS connector with Jira Data Center or Jira Server in Jira 8.14 and later. Upgrade your Jira instance to Jira 8.14 or later, and reconfigure the Jira integration in your GitLab instance.
-If you cannot upgrade your Jira instance in time and are on GitLab self-managed version, we offer a workaround until GitLab 16.6. This breaking change is deployed in GitLab 16.0 behind a feature flag named `jira_dvcs_end_of_life_amnesty`. The flag is disabled by default, but you can ask an administrator to enable the flag at any time. For questions related to this announcement, see the [feedback issue](https://gitlab.com/gitlab-org/gitlab/-/issues/408185).
-
-### Legacy Gitaly configuration method
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.10</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/393574).
-</div>
-
-Previously, Gitaly configuration keys for Omnibus GitLab were scattered throughout the configuration file. In GitLab
-15.10, we added support for a single configuration structure that matches Gitaly internal configuration. Both methods
-of configuring Gitaly were supported in parallel.
-
-In GitLab 16.0, we removed support for the former configuration method and now only support the new configuration
-method.
-
-Before upgrading to GitLab 16.0, administrators must migrate to the new single configuration structure. For
-instructions, see [Gitaly - Omnibus GitLab configuration structure change](https://docs.gitlab.com/ee/update/#gitaly-omnibus-gitlab-configuration-structure-change).
-
-### Legacy Gitaly configuration methods with variables
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/352609).
-</div>
-
-The environment variables `GIT_CONFIG_SYSTEM` and `GIT_CONFIG_GLOBAL` were deprecated in GitLab 14.8 and are removed
-in GitLab 16.0. These variables are replaced with standard
-[`config.toml` Gitaly configuration](https://docs.gitlab.com/ee/administration/gitaly/reference.html).
-
-GitLab instances that use `GIT_CONFIG_SYSTEM` and `GIT_CONFIG_GLOBAL` to configure Gitaly must switch to configuring
-using `config.toml`.
-
-### Legacy Praefect configuration method
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/390291).
-</div>
-
-Previously, Praefect configuration keys for Omnibus GitLab were scattered throughout the configuration file. In GitLab
-15.9, we added support for a single configuration structure that matches Praefect internal configuration. Both methods
-of configuring Praefect were supported in parallel.
-
-In GitLab 16.0, we removed support for the former configuration method and now only support the new configuration
-method.
-
-Before upgrading to GitLab 16.0, administrators must migrate to the new single configuration structure. For
-instructions, see [Praefect - Omnibus GitLab configuration structure change](https://docs.gitlab.com/ee/update/#praefect-omnibus-gitlab-configuration-structure-change).
-
-### Legacy routes removed
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/214217).
-</div>
-
-GitLab 16.0 removes legacy URLs from the GitLab application.
-
-When subgroups were introduced in GitLab 9.0, a `/-/` delimiter was added to URLs to signify the end of a group path. All GitLab URLs now use this delimiter for project, group, and instance level features.
-
-URLs that do not use the `/-/` delimiter are planned for removal in GitLab 16.0. For the full list of these URLs, along with their replacements, see [issue 28848](https://gitlab.com/gitlab-org/gitlab/-/issues/28848#release-notes).
-
-Update any scripts or bookmarks that reference the legacy URLs. GitLab APIs are not affected by this change.
-
-### License-Check and the Policies tab on the License Compliance page
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/390417).
-</div>
-
-The License Check Policies feature has been removed. Additionally, the Policies tab on the License Compliance page and all APIs related to the License Check feature have been removed. To enforce approvals based on detected licenses, use the [License Approval policy](https://docs.gitlab.com/ee/user/compliance/license_approval_policies.html) feature instead.
-
-### Limit CI_JOB_TOKEN scope is disabled
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/395708).
-</div>
-
-In GitLab 14.4 we introduced the ability to [limit your project's CI/CD job token](https://docs.gitlab.com/ee/ci/jobs/ci_job_token.html#limit-your-projects-job-token-access) (`CI_JOB_TOKEN`) access to make it more secure. You could use the **Limit CI_JOB_TOKEN access** setting to prevent job tokens from your project's pipelines from being used to **access other projects**. When enabled with no other configuration, your pipelines could not access any other projects. To use job tokens to access other projects from your project's pipelines, you needed to list those other projects explicitly in the setting's allowlist, and you needed to be a maintainer in _all_ the projects. You might have seen this mentioned as the "outbound scope" of the job token.
-
-The job token functionality was updated in 15.9 with a [better security setting](https://docs.gitlab.com/ee/ci/jobs/ci_job_token.html#allow-access-to-your-project-with-a-job-token). Instead of securing your own project's job tokens from accessing other projects, the new workflow is to secure your own project from being accessed by other projects' job tokens without authorization. You can see this as an "inbound scope" for job tokens. When this new **Allow access to this project with a CI_JOB_TOKEN** setting is enabled with no other configuration, job tokens from other projects cannot **access your project**. If you want a project to have access to your own project, you must list it in the new setting's allowlist. You must be a maintainer in your own project to control the new allowlist, but you only need to have the Guest role in the other projects. This new setting is enabled by default for all new projects.
-
-In GitLab 16.0, the old **Limit CI_JOB_TOKEN access** setting is disabled by default for all **new** projects. In existing projects with this setting currently enabled, it will continue to function as expected, but you are unable to add any more projects to the old allowlist. If the setting is disabled in any project, it is not possible to re-enable this setting in 16.0 or later. To control access between your projects, use the new **Allow access** setting instead.
-
-In 17.0, we plan to remove the **Limit** setting completely, and set the **Allow access** setting to enabled for all projects. This change ensures a higher level of security between projects. If you currently use the **Limit** setting, you should update your projects to use the **Allow access** setting instead. If other projects access your project with a job token, you must add them to the **Allow access** setting's allowlist.
-
-To prepare for this change, users on GitLab.com or self-managed GitLab 15.9 or later can enable the **Allow access** setting now and add the other projects. It will not be possible to disable the setting in 17.0 or later.
-
-### Managed Licenses API
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/390417).
-</div>
-
-The [Managed Licenses API](https://archives.docs.gitlab.com/15.8/ee/api/managed_licenses.html) has been removed. To enforce approvals in merge requests when non-compliant licenses are detected, use the [License Approval policy](https://docs.gitlab.com/ee/user/compliance/license_approval_policies.html) feature instead.
-
-Our [GraphQL APIs](https://docs.gitlab.com/ee/api/graphql/reference/) can be used to create a Security Policy Project, [update the policy.yml](https://docs.gitlab.com/ee/api/graphql/reference/#mutationscanexecutionpolicycommit) in the Security Policy Project, and enforce those policies.
-
-To query a list of dependencies and components, use our [Dependencies REST API](https://docs.gitlab.com/ee/api/dependencies.html) or [export from the Dependency List](https://docs.gitlab.com/ee/user/application_security/dependency_list/).
-
-### Maximum number of active pipelines per project limit (`ci_active_pipelines`)
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.3</span>
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/368195).
-</div>
-
-The [**Maximum number of active pipelines per project** limit](https://docs.gitlab.com/ee/user/admin_area/settings/continuous_integration.html#set-cicd-limits) has been removed. Instead, use the other recommended rate limits that offer similar protection:
-
-- [**Pipelines rate limits**](https://docs.gitlab.com/ee/user/admin_area/settings/rate_limit_on_pipelines_creation.html).
-- [**Total number of jobs in currently active pipelines**](https://docs.gitlab.com/ee/user/admin_area/settings/continuous_integration.html#set-cicd-limits).
-
-### Monitoring performance metrics through Prometheus is removed
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.7</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/346541).
-</div>
-
-We previously launched a solution that allows you to view performance metrics by displaying data stored in a Prometheus instance.
-The Prometheus instance can be set up as a GitLab-managed app or you can connect a previously configured Prometheus instance.
-The latter is known as an "external Prometheus" in GitLab. The value we provided was to enable you to easily set up monitoring
-(using GitLab Managed Apps) and have the visualization of the metrics all in the same tool you used to build the application.
-
-However, as we are removing certificate-based integrations, the full monitoring experience is also deprecated as you will not
-have the option to easily set up Prometheus from GitLab. Furthermore, we plan to consolidate on
-a focused observability dashboard experience instead of having multiple paths to view metrics. Because of this, we are also removing the external
-Prometheus experience, together with the metrics visualization capability.
-
-This removal only refers to the GitLab Metrics capabilities, and **does not** include:
-
-- Deprecating [alerts for Prometheus](https://gitlab.com/gitlab-org/gitlab/-/issues/338834).
-- [Capabilities that GitLab comes with that allow operators of GitLab to retrieve metrics from those instances](https://docs.gitlab.com/ee/administration/monitoring/prometheus/gitlab_metrics.html).
-
-### Non-expiring access tokens no longer supported
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.4</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/369123).
-</div>
-
-Currently, you can create access tokens that have no expiration date. These access tokens are valid indefinitely, which presents a security risk if the access token is
-divulged. Because expiring access tokens are better, from GitLab 15.4 we [populate a default expiration date](https://gitlab.com/gitlab-org/gitlab/-/issues/348660).
-
-In GitLab 16.0, any personal, project, or group access token that does not have an expiration date will automatically have an expiration date set at 365 days later than the current date.
-
-### Non-standard default Redis ports are no longer supported
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/388269).
-</div>
-
-If GitLab starts without any Redis configuration file present,
-GitLab assumes it can connect to three Redis servers at `localhost:6380`,
-`localhost:6381` and `localhost:6382`. We are changing this behavior
-so GitLab assumes there is one Redis server at `localhost:6379`.
-
-If you want to keep using the three servers, you must configure
-the Redis URLs by editing the `config/redis.cache.yml`,`config/redis.queues.yml`,
-and `config/redis.shared_state.yml` files.
-
-### PipelineSecurityReportFinding name GraphQL field
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.1</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/346335).
-</div>
-
-Previously, the [PipelineSecurityReportFinding GraphQL type was updated](https://gitlab.com/gitlab-org/gitlab/-/issues/335372) to include a new `title` field. This field is an alias for the current `name` field, making the less specific `name` field redundant. The `name` field is removed from the PipelineSecurityReportFinding type in GitLab 16.0.
-
-### PostgreSQL 12 compatibility
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/7395).
-</div>
-
-In GitLab 16.0, PostgreSQL 13 is the minimum supported PostgreSQL version. PostgreSQL 12 is no longer shipped with the GitLab Omnibus package.
-Before upgrading to GitLab 16.0, if you are:
-
-- Still using GitLab-packaged PostgreSQL 12, you must [perform a database upgrade](https://docs.gitlab.com/omnibus/settings/database.html#upgrade-packaged-postgresql-server)
- to PostgreSQL 13.
-- Using an externally-provided PostgreSQL 12, you must upgrade to PostgreSQL 13 or later to meet the
- [minimum version requirements](https://docs.gitlab.com/ee/install/requirements.html#postgresql-requirements).
-
-### Praefect custom metrics endpoint configuration
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/390266).
-</div>
-
-Support for using the `prometheus_exclude_database_from_default_metrics` configuration value was deprecated in
-GitLab 15.9 and is removed in GitLab 16.0. We made this change to improve the performance of Praefect.
-All metrics that scrape the Praefect database are now exported to the `/db_metrics` endpoint.
-
-You must update your metrics collection targets to use the `/db_metrics` endpoint.
-
-### Project REST API field `operations_access_level` removed
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/385798).
-</div>
-
-In project REST API endpoints, the `operations_access_level` field
-is removed in favor of more specialized fields like:
-
-- `releases_access_level`
-- `environments_access_level`
-- `feature_flags_access_level`
-- `infrastructure_access_level`
-- `monitor_access_level`
-
-### Rake task for importing bare repositories
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.8</span>
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-com/Product/-/issues/5255).
-</div>
-
-The [Rake task for importing bare repositories](https://docs.gitlab.com/ee/raketasks/import.html) `gitlab:import:repos` was deprecated in GitLab 15.8 and is removed in GitLab 16.0.
-
-This Rake task imported a directory tree of repositories into a GitLab instance. These repositories must have been
-managed by GitLab previously, because the Rake task relied on the specific directory structure or a specific custom Git setting in order to work (`gitlab.fullpath`).
-
-Importing repositories using this Rake task had limitations. The Rake task:
-
-- Only knew about project and project wiki repositories and didn't support repositories for designs, group wikis, or snippets.
-- Permitted you to import non-hashed storage projects even though these aren't supported.
-- Relied on having Git config `gitlab.fullpath` set. [Epic 8953](https://gitlab.com/groups/gitlab-org/-/epics/8953) proposes removing support for this setting.
-
-Alternatives to using the `gitlab:import:repos` Rake task include:
-
-- Migrating projects using either [an export file](https://docs.gitlab.com/ee/user/project/settings/import_export.html) or
- [direct transfer](https://docs.gitlab.com/ee/user/group/import/#migrate-groups-by-direct-transfer-recommended) migrate repositories as well.
-- Importing a [repository by URL](https://docs.gitlab.com/ee/user/project/import/repo_by_url.html).
-- Importing a [repositories from a non-GitLab source](https://docs.gitlab.com/ee/user/project/import/).
-
-### Redis 5 compatibility
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.3</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/331468).
-</div>
-
-In GitLab 13.9, we updated the Omnibus GitLab package and GitLab Helm chart 4.9 to Redis 6. Redis 5 reached end of life in April 2022 and is not supported.
-
-GitLab 16.0, we have removed support for Redis 5. If you are using your own Redis 5.0 instance, you must upgrade it to Redis 6.0 or later before upgrading to GitLab 16.0
-or later.
-
-### Removal of job_age parameter in `POST /jobs/request` Runner endpoint
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.2</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/334253).
-</div>
-
-The `job_age` parameter, returned from the `POST /jobs/request` API endpoint used in communication with GitLab Runner, has been removed in GitLab 16.0.
-
-This could be a breaking change for anyone that developed their own runner that relies on this parameter being returned by the endpoint. This is not a breaking change for anyone using an officially released version of GitLab Runner, including public shared runners on GitLab.com.
-
-### Remove legacy configuration fields in GitLab Runner Helm Chart
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.6</span>
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/379064).
-</div>
-
-In GitLab 13.6 and later, users can [specify any runner configuration in the GitLab Runner Helm chart](https://docs.gitlab.com/runner/install/kubernetes.html). When this features was released, we deprecated the fields in the GitLab Helm Chart configuration specific to the runner. As of v1.0 of the GitLab Runner Helm chart (GitLab 16.0), the following fields have been removed and are no longer supported:
-
-- `image`
-- `rbac.resources`
-- `rbac.verbs`
-- `runners.image`
-- `runners.imagePullSecrets`
-- `runners.imagePullPolicy`
-- `runners.requestConcurrency`
-- `runners.privileged`
-- `runners.namespace`
-- `runners.pollTimeout`
-- `runners.outputLimit`
-- `runners.cache.cacheType`
-- `runners.cache.cachePath`
-- `runners.cache.cacheShared`
-- `runners.cache.s3ServerAddress`
-- `runners.cache.s3BucketLocation`
-- `runners.cache.s3CacheInsecure`
-- `runners.cache.gcsBucketName`
-- `runners.builds`
-- `runners.services`
-- `runners.helpers`
-- `runners.pod_security_context`
-- `runners.serviceAccountName`
-- `runners.cloneUrl`
-- `runners.nodeSelector`
-- `runners.nodeTolerations`
-- `runners.podLabels`
-- `runners.podAnnotations`
-- `runners.env`
-
-### Remove the deprecated `environment_tier` parameter from the DORA API
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.2</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/365939).
-</div>
-
-The `environment_tier` parameter has been superseded by the `environment_tiers` parameter.
-
-If you use the `environment_tier` parameter in your integration (REST or GraphQL) then you need to replace it with the `environment_tiers` parameter which accepts an array of strings.
-
-### Removed `external` field from GraphQL `ReleaseAssetLink` type
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/388983).
-</div>
-
-From GitLab 15.9, all Release links are external. The `external` field of the `ReleaseAssetLink` type was deprecated in 15.9, and removed in GitLab 16.0.
-
-### Removed `external` field from Releases and Release link APIs
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/388984).
-</div>
-
-From GitLab 15.9, all Release links are external. The `external` field in the Releases and Release link APIs was deprecated in 15.9, and removed in GitLab 16.0.
-
-### Secure JWT token setting is removed
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/366798).
-</div>
-
-As part of [the deprecation of old versions of JSON web tokens](https://docs.gitlab.com/ee/update/deprecations.html#old-versions-of-json-web-tokens-are-deprecated), the **Limit JSON Web Token (JWT)** project setting has been removed. This setting was a temporary solution to help users transition to [ID tokens](https://docs.gitlab.com/ee/ci/secrets/id_token_authentication.html), as a way to switch between the old and new tokens, but the setting is no longer needed. In GitLab 16.0 and later, you can simply start using ID tokens in any job. When you use the `id_tokens` keyword in a job, that job uses only ID tokens and the old `CI_JOB_JWT*` tokens are not available. In jobs that do not use the `id_tokens` keyword, the old behavior remains unchanged.
-
-The old `CI_JOB_JWT*` tokens will be completely removed in GitLab 16.5, so you must switch to ID tokens before that release.
-
-### Secure scanning `_DISABLED` variables now require the value `"true"`
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/391822).
-</div>
-
-In GitLab 16.0, we've changed how values for CI/CD variables like `SAST_DISABLED` and `DEPENDENCY_SCANNING_DISABLED` are handled.
-
-Now, scanning is disabled only if the value is `"true"`, for example `SAST_DISABLED: "true"`. Previously, even if the value were `"false"`, like `SAST_DISABLED: "false"`, scanning would still be disabled.
-
-This change was previously released in the Latest versions of the CI/CD templates because of the potential to disrupt customized CI/CD pipeline configurations.
-
-The following templates have been updated:
-
-- API Fuzzing: [`API-Fuzzing.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/API-Fuzzing.gitlab-ci.yml)
-- Container Scanning: [`Container-Scanning.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/Container-Scanning.gitlab-ci.yml)
-- Coverage-Guided Fuzzing: [`Coverage-Fuzzing.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/Coverage-Fuzzing.gitlab-ci.yml)
-- DAST: [`DAST.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/DAST.gitlab-ci.yml)
-- DAST API: [`DAST-API.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/DAST-API.gitlab-ci.yml)
-- Dependency Scanning: [`Dependency-Scanning.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/Dependency-Scanning.gitlab-ci.yml)
-- IaC Scanning: [`SAST-IaC.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/SAST-IaC.gitlab-ci.yml)
-- SAST: [`SAST.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml)
-- Secret Detection: [`Secret-Detection.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/Secret-Detection.gitlab-ci.yml)
-
-If you currently use the `_DISABLED` variables but set a value other than `"true"` to disable scanning, change the value to `"true"`.
-
-### Security report schemas version 14.x.x
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.3</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/366477).
-</div>
-
-Version 14.x.x [security report schemas](https://gitlab.com/gitlab-org/security-products/security-report-schemas) have been removed.
-Security reports that use schema version 14.x.x will cause an error in the pipeline's **Security** tab. For more information, refer to [security report validation](https://docs.gitlab.com/ee/user/application_security/#security-report-validation).
-
-### Self-monitoring project is removed
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/groups/gitlab-org/-/epics/10030).
-</div>
-
-GitLab self-monitoring project was meant to enable self-hosted GitLab administrators to visualize performance metrics of GitLab within GitLab itself. This feature relied on GitLab Metrics dashboards. With metrics dashboard being removed, self-monitoring project is also removed. We recommended that self-hosted users monitor their GitLab instance with alternative visualization tools, such as Grafana.
-
-### Starboard directive in the config for the GitLab agent for Kubernetes removed
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.4</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/368828).
-</div>
-
-The GitLab operational container scanning feature no longer requires you to install Starboard. The `starboard:` directive in configuration files for the GitLab agent for Kubernetes has been removed. Use the `container_scanning:` directive instead.
-
-### Stop publishing GitLab Runner images based on Windows Server 2004 and 20H2
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">16.0</span>
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/31001).
-</div>
-
-As of GitLab 16.0, GitLab Runner images based on Windows Server 2004 and 20H2 will not be provided as these operating systems are end-of-life.
-
-### The Phabricator task importer
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.7</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-com/Product/-/issues/4894).
-</div>
-
-The [Phabricator task importer](https://docs.gitlab.com/ee/user/project/import/phabricator.html) was deprecated in
-GitLab 15.7 and is removed in 16.0.
-
-The Phabricator project hasn't been actively maintained since June 1, 2021. We haven't observed imports using this
-tool. There has been no activity on the open related issues on GitLab.
-
-### The Security Code Scan-based GitLab SAST analyzer is now removed
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/390416).
-</div>
-
-GitLab SAST uses various [analyzers](https://docs.gitlab.com/ee/user/application_security/sast/analyzers/) to scan code for vulnerabilities.
-We've reduced the number of supported analyzers used by default in GitLab SAST.
-This is part of our long-term strategy to deliver a faster, more consistent user experience across different programming languages.
-
-As of GitLab 16.0, the [SAST CI/CD template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml) no longer uses the [Security Code Scan](https://gitlab.com/gitlab-org/security-products/analyzers/security-code-scan)-based analyzer for .NET.
-We've removed this analyzer from the SAST CI/CD template and replaced it with GitLab-supported detection rules for C# in the [Semgrep-based analyzer](https://gitlab.com/gitlab-org/security-products/analyzers/semgrep).
-
-Because this analyzer has reached End of Support in GitLab 16.0, we won't provide further updates to it.
-However, we won't delete any container images we previously published for this analyzer or remove the ability to run it by using a [custom CI/CD pipeline job](https://docs.gitlab.com/ee/ci/yaml/artifacts_reports.html#artifactsreportssast).
-
-If you've already dismissed a vulnerability finding from the deprecated analyzer, the replacement attempts to respect your previous dismissal. See [Vulnerability translation documentation](https://docs.gitlab.com/ee/user/application_security/sast/analyzers.html#vulnerability-translation) for further details.
-
-If you customize the behavior of GitLab SAST by disabling the Semgrep-based analyzer or depending on specific SAST jobs in your pipelines, you must take action as detailed in the [deprecation issue for this change](https://gitlab.com/gitlab-org/gitlab/-/issues/390416#actions-required).
-
-### The stable Terraform CI/CD template has been replaced with the latest template
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/386001).
-</div>
-
-With every major GitLab version, we update the stable Terraform templates with the current latest templates.
-This change affects the [quickstart](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform.gitlab-ci.yml)
-and the [base](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform/Base.gitlab-ci.yml) templates.
-
-The new templates do not change the directory to `$TF_ROOT` explicitly: `gitlab-terraform` gracefully
-handles directory changing. If you altered the job scripts to assume that the current working directory is `$TF_ROOT`, you must manually add `cd "$TF_ROOT"` now.
-
-Because the latest template introduces Merge Request Pipeline support which is not supported in Auto DevOps,
-those rules are not yet integrated into the stable template.
-However, we may introduce them later on, which may break your Terraform pipelines in regards to which jobs are executed.
-
-To accommodate the changes, you might need to adjust the [`rules`](https://docs.gitlab.com/ee/ci/yaml/#rules) in your
-`.gitlab-ci.yml` file.
-
-### Two DAST API variables have been removed
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.7</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/383467).
-</div>
-
-The variables `DAST_API_HOST_OVERRIDE` and `DAST_API_SPECIFICATION` have been removed from use for DAST API scans.
-
-`DAST_API_HOST_OVERRIDE` has been removed in favor of using the `DAST_API_TARGET_URL` to automatically override the host in the OpenAPI specification.
-
-`DAST_API_SPECIFICATION` has been removed in favor of `DAST_API_OPENAPI`. To continue using an OpenAPI specification to guide the test, users must replace the `DAST_API_SPECIFICATION` variable with the `DAST_API_OPENAPI` variable. The value can remain the same, but the variable name must be replaced.
-
-### Use of `id` field in vulnerabilityFindingDismiss mutation
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.3</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/367166).
-</div>
-
-You can use the vulnerabilityFindingDismiss GraphQL mutation to set the status of a vulnerability finding to `Dismissed`. Previously, this mutation used the `id` field to identify findings uniquely. However, this did not work for dismissing findings from the pipeline security tab. Therefore, using the `id` field as an identifier has been dropped in favor of the `uuid` field. Using the 'uuid' field as an identifier allows you to dismiss the finding from the pipeline security tab.
-
-### Vulnerability confidence field
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.4</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/372332).
-</div>
-
-In GitLab 15.3, [security report schemas below version 15 were deprecated](https://docs.gitlab.com/ee/update/deprecations.html#security-report-schemas-version-14xx).
-The `confidence` attribute on vulnerability findings exists only in schema versions before `15-0-0` and in GitLab prior to 15.4. To maintain consistency
-between the reports and our public APIs, the `confidence` attribute on any vulnerability-related components of our GraphQL API is now removed.
-
-### `CI_BUILD_*` predefined variables removed
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/352957).
-</div>
-
-The predefined CI/CD variables that start with `CI_BUILD_*` were deprecated in GitLab 9.0, and removed in GitLab 16.0. If you still use these variables, you must change to the replacement [predefined variables](https://docs.gitlab.com/ee/ci/variables/predefined_variables.html) which are functionally identical:
-
-| Removed variable | Replacement variable |
-| --------------------- |------------------------ |
-| `CI_BUILD_BEFORE_SHA` | `CI_COMMIT_BEFORE_SHA` |
-| `CI_BUILD_ID` | `CI_JOB_ID` |
-| `CI_BUILD_MANUAL` | `CI_JOB_MANUAL` |
-| `CI_BUILD_NAME` | `CI_JOB_NAME` |
-| `CI_BUILD_REF` | `CI_COMMIT_SHA` |
-| `CI_BUILD_REF_NAME` | `CI_COMMIT_REF_NAME` |
-| `CI_BUILD_REF_SLUG` | `CI_COMMIT_REF_SLUG` |
-| `CI_BUILD_REPO` | `CI_REPOSITORY_URL` |
-| `CI_BUILD_STAGE` | `CI_JOB_STAGE` |
-| `CI_BUILD_TAG` | `CI_COMMIT_TAG` |
-| `CI_BUILD_TOKEN` | `CI_JOB_TOKEN` |
-| `CI_BUILD_TRIGGERED` | `CI_PIPELINE_TRIGGERED` |
-
-### `CI_PRE_CLONE_SCRIPT` variable on GitLab SaaS Runners has been removed
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/29405).
-</div>
-
-In GitLab 16.0 and later, the `CI_PRE_CLONE_SCRIPT` variable option on GitLab SaaS Runners has been removed. The `CI_PRE_CLONE_SCRIPT` variable enabled you to run commands in your CI/CD job before the runner executed `git-init` and `git-fetch`. You should use the `pre_get_sources_script` hook instead. For more information, see the blog post, [Guide to pre_clone_script changes on GitLab SaaS Linux Runners](https://about.gitlab.com/blog/2023/03/27/changes-to-the-preclonescript/).
-
-### `POST /projects/:id/merge_requests/:merge_request_iid/approvals` removed
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">12.3</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/353097).
-</div>
-
-The `/approvals` endpoint was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/11132) in GitLab 12.3. To change the approvals required for a merge request via the API, use the `/approval_rules` endpoint described in [Create merge request level rule](https://docs.gitlab.com/ee/api/merge_request_approvals.html#create-merge-request-level-rule).
-
-### `POST ci/lint` API endpoint removed
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.7</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/381669).
-</div>
-
-The `POST ci/lint` API endpoint was deprecated in 15.7, and removed in 16.0. This endpoint did not validate the full range of CI/CD configuration options. Instead, use [`POST /projects/:id/ci/lint`](https://docs.gitlab.com/ee/api/lint.html#validate-a-ci-yaml-configuration-with-a-namespace), which properly validates CI/CD configuration.
-
-### `docker-ssh` and `docker-ssh+machine` executors are removed
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">10.0</span>
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/29406).
-</div>
-
-In GitLab 16.0 and later, the `docker-ssh` and `docker+machine-ssh` executors for GitLab Runner have been removed from the GitLab Runner [code base](https://gitlab.com/gitlab-org/gitlab-runner).
-
-### vulnerabilityFindingDismiss GraphQL mutation
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.5</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/375645).
-</div>
-
-The `VulnerabilityFindingDismiss` GraphQL mutation has been removed. This mutation was not used often as the Vulnerability Finding ID was not available to users (this field was [deprecated in 15.3](https://docs.gitlab.com/ee/update/deprecations.html#use-of-id-field-in-vulnerabilityfindingdismiss-mutation)). Instead of `VulnerabilityFindingDismiss`, you should use `VulnerabilityDismiss` to dismiss vulnerabilities in the Vulnerability Report or `SecurityFindingDismiss` for security findings in the CI Pipeline Security tab.
-
-## Removed in 15.11
-
-### Exporting and importing projects in JSON format not supported
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.10</span>
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/389888).
-</div>
-
-GitLab previously created project file exports in JSON format. In GitLab 12.10, NDJSON was added as the preferred format.
-
-To support transitions, importing JSON-formatted project file exports was still possible if you configured the
-relevant feature flags.
-
-From GitLab 15.11, importing a JSON-formatted project file exports is not supported.
-
-### openSUSE Leap 15.3 packages
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.8</span>
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/7371).
-</div>
-
-Distribution support and security updates for openSUSE Leap 15.3 [ended December 2022](https://en.opensuse.org/Lifetime#Discontinued_distributions).
-
-Starting in GitLab 15.7 we started providing packages for openSUSE Leap 15.4, and in GitLab 15.11 we stopped providing packages for openSUSE Leap 15.3.
-
-To continue using GitLab, [upgrade](https://en.opensuse.org/SDB:System_upgrade) to openSUSE Leap 15.4.
-
-## Removed in 15.9
-
-### Live Preview no longer available in the Web IDE
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/383889).
-</div>
-
-The Live Preview feature of the Web IDE was intended to provide a client-side preview of static web applications. However, complex configuration steps and a narrow set of supported project types have limited its utility. With the introduction of the Web IDE Beta in GitLab 15.7, you can now connect to a full server-side runtime environment. With upcoming support for installing extensions in the Web IDE, we’ll also support more advanced workflows than those available with Live Preview. As of GitLab 15.9, Live Preview is no longer available in the Web IDE.
-
-### `omniauth-authentiq` gem no longer available
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/389452).
-</div>
-
-`omniauth-authentiq` is an OmniAuth strategy gem that was part of GitLab. The company providing authentication services, Authentiq, has shut down. Therefore the gem is being removed.
-
-### `omniauth-shibboleth` gem no longer available
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">10.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/388959).
-</div>
-
-`omniauth-shibboleth` is an OmniAuth strategy gem that was part of GitLab. The gem has not received security updates and does not meet GitLab quality guidance criteria. This gem was originally scheduled for removal by 14.1, but it was not removed at that time. The gem is being removed now. In GitLab 16.1 or later, use the `omniauth-shibboleth-redux` gem instead.
-
-## Removed in 15.8
-
-### CiliumNetworkPolicy within the auto deploy Helm chart is removed
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.8</span>
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/382044).
-</div>
-
-All functionality related to the GitLab Container Network Security and Container Host Security categories was deprecated in GitLab 14.8 and scheduled for removal in GitLab 15.0. The [CiliumNetworkPolicy definition](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/blob/master/assets/auto-deploy-app/values.yaml#L175) that exists as part of the [GitLab Auto Deploy Helm chart](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/tree/master/assets/auto-deploy-app) was not removed as scheduled in GitLab 15.0. This policy is planned to be removed in the GitLab 15.8 release.
-
-If you want to preserve this functionality, you can follow one of these two paths:
-
-1. Fork the [GitLab Auto Deploy Helm chart](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/tree/master/assets/auto-deploy-app) into the `chart/` path within your project
-1. Set `AUTO_DEPLOY_IMAGE_VERSION` and `DAST_AUTO_DEPLOY_IMAGE_VERSION` to the most recent version of the image that included the CiliumNetworkPolicy
-
-### Exporting and importing groups in JSON format not supported
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.10</span>
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/389888).
-</div>
-
-GitLab previously created group file exports in JSON format. In GitLab 13.10, NDJSON was added as the preferred format.
-
-To support transitions, importing JSON-formatted group file exports was still possible if you configured the
-relevant feature flags.
-
-From GitLab 15.8, importing a JSON-formatted group file exports is not supported.
-
-### `artifacts:public` CI/CD keyword refactored
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.10</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/322454).
-</div>
-
-The [`artifacts:public` CI/CD keyword](https://docs.gitlab.com/ee/ci/yaml/#artifactspublic) was discovered to be not working properly since GitLab 15.8 and needed to be refactored. This feature is disabled on GitLab.com, and disabled by default on self-managed instances. If an administrator for an instance running GitLab 15.8 or 15.9 enabled this feature via the `non_public_artifacts` feature flag, it is likely that artifacts created with the `public:false` setting are being treated as `public:true`.
-
-If you have projects that use this setting, you should delete artifacts that must not be public, or [change the visibility](https://docs.gitlab.com/ee/user/public_access.html#change-project-visibility) of affected projects to private, before updating to GitLab 15.8 or later.
-
-In GitLab 15.10, this feature's code was refactored. On instances with this feature enabled, new artifacts created with `public:false` are now working as expected, though still disabled by default. Avoid testing this feature with production data until it is enabled by default and made generally available.
-
-## Removed in 15.7
-
-### File Type variable expansion in `.gitlab-ci.yml`
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.5</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/29407).
-</div>
-
-Prior to this change, variables that referenced or applied alias file variables expanded the value of the `File` type variable. For example, the file contents. This behavior was incorrect because it did not comply with typical shell variable expansion rules. A user could run an $echo command with the variable as an input parameter to leak secrets or sensitive information stored in 'File' type variables.
-
-In 15.7, we are removing file type variable expansion from GitLab. It is essential to check your CI pipelines to confirm if your scripts reference a file variable. If your CI job relies on the previous expansion functionality, that CI job will not work and generate an error as of 15.7. The new behavior is that variable expansion that reference or apply alias file variables expand to the file name or path of the `File` type variable, instead of its value, such as the file contents.
-
-### Flowdock integration
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.7</span>
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/379197).
-</div>
-
-As of December 22, 2022, we are removing the Flowdock integration because the service was shut down on August 15, 2022.
-
-## Removed in 15.6
-
-### NFS as Git repository storage is no longer supported
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.0</span>
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/351243).
-</div>
-
-As of November 22, 2022, we have removed support for customers using NFS for Git repository storage. This was
-originally planned for May 22, 2022, but in an effort to allow continued maturity of Gitaly Cluster, we delayed
-our removal of support date until now. Please see our official [Statement of Support](https://about.gitlab.com/support/statement-of-support/#gitaly-and-nfs)
-for further information.
-
-This change in support follows the development deprecation for NFS for Git repository storage that occurred in GitLab 14.0.
-
-Gitaly Cluster offers tremendous benefits for our customers such as:
-
-- [Variable replication factors](https://docs.gitlab.com/ee/administration/gitaly/index.html#replication-factor).
-- [Strong consistency](https://docs.gitlab.com/ee/administration/gitaly/index.html#strong-consistency).
-- [Distributed read capabilities](https://docs.gitlab.com/ee/administration/gitaly/index.html#distributed-reads).
-
-We encourage customers currently using NFS for Git repositories to migrate as soon as possible by reviewing our documentation on
-[migrating to Gitaly Cluster](https://docs.gitlab.com/ee/administration/gitaly/index.html#migrate-to-gitaly-cluster).
-
-## Removed in 15.4
-
-### SAST analyzer consolidation and CI/CD template changes
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/352554).
-</div>
-
-We have replaced the GitLab SAST [analyzers](https://docs.gitlab.com/ee/user/application_security/sast/analyzers/) for certain languages in GitLab 15.4 as part of our long-term strategy to deliver a more consistent user experience, faster scan times, and reduced CI minute usage.
-
-Starting from GitLab 15.4, the [GitLab-managed SAST CI/CD template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml) uses [Semgrep-based scanning](https://docs.gitlab.com/ee/user/application_security/sast/analyzers.html#transition-to-semgrep-based-scanning) instead of the following analyzers:
-
-- [ESLint](https://gitlab.com/gitlab-org/security-products/analyzers/eslint) for JavaScript, TypeScript, React
-- [Gosec](https://gitlab.com/gitlab-org/security-products/analyzers/gosec) for Go
-- [Bandit](https://gitlab.com/gitlab-org/security-products/analyzers/bandit) for Python
-- [SpotBugs](https://gitlab.com/gitlab-org/security-products/analyzers/spotbugs) for Java
-
-We will no longer make any updates to the ESLint-, Gosec-, and Bandit-based analyzers.
-The SpotBugs-based analyzer will continue to be used for Groovy, Kotlin, and Scala scanning.
-
-We won't delete container images previously published for these analyzers, so older versions of the CI/CD template will continue to work.
-
-If you changed the default GitLab SAST configuration, you may need to update your configuration as detailed in the [deprecation issue for this change](https://gitlab.com/gitlab-org/gitlab/-/issues/352554#actions-required).
-
-## Removed in 15.3
-
-### Support for Debian 9
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-</div>
-
-Long term service and support (LTSS) for [Debian 9 Stretch ended 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.
-
-### Vulnerability Report sort by State
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.0</span>
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/360516).
-</div>
-
-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 is instead removed in 15.3 to simplify the codebase and prevent any unwanted performance degradation.
-
-### Vulnerability Report sort by Tool
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.1</span>
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/363138).
-</div>
-
-The ability to sort the Vulnerability Report by the `Tool` column (scan type) 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 `Tool` column for sorting, the feature flag is instead removed in
-GitLab 15.3 to simplify the codebase and prevent any unwanted performance degradation.
-
-## Removed in 15.2
-
-### Support for older browsers
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-</div>
-
-In GitLab 15.2, we are cleaning up and [removing old code](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86003) that was specific for browsers that we no longer support. This has no impact on users if they use one of our [supported web browsers](https://docs.gitlab.com/ee/install/requirements.html#supported-web-browsers).
-
-Most notably, support for the following browsers has been removed:
-
-- Apple Safari 14 and older.
-- Mozilla Firefox 78.
-
-The minimum supported browser versions are:
-
-- Apple Safari 14.1.
-- Mozilla Firefox 91.
-- Google Chrome 92.
-- Chromium 92.
-- Microsoft Edge 92.
-
-## Removed in 15.0
-
-### API: `stale` status returned instead of `offline` or `not_connected`
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.6</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/347303).
-</div>
-
-The Runner [API](https://docs.gitlab.com/ee/api/runners.html#runners-api) endpoints have changed in 15.0.
-
-If a runner has not contacted the GitLab instance in more than three months, the API returns `stale` instead of `offline` or `not_connected`.
-The `stale` status was introduced in 14.6.
-
-The `not_connected` status is no longer valid. It was replaced with `never_contacted`. Available statuses are `online`, `offline`, `stale`, and `never_contacted`.
-
-### Audit events for repository push events
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.3</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/337993).
-</div>
-
-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
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/26600).
-</div>
-
-To reduce the overall complexity and maintenance burden of GitLab's [object storage feature](https://docs.gitlab.com/ee/administration/object_storage.html), support for using `background_upload` has been removed in GitLab 15.0.
-By default [direct upload](https://docs.gitlab.com/ee/development/uploads/index.html#direct-upload) will be used.
-
-This impacts a subset of object storage providers, including but not limited to:
-
-- **OpenStack** Customers using OpenStack need to change their configuration to use the S3 API instead of Swift.
-- **RackSpace** Customers using RackSpace-based object storage need to migrate data to a different provider.
-
-If your object storage provider does not support `background_upload`, please [migrate objects to a supported object storage provider](https://docs.gitlab.com/ee/administration/object_storage.html#migrate-objects-to-a-different-object-storage-provider).
-
-#### Encrypted S3 buckets
-
-Additionally, this also breaks the use of [encrypted S3 buckets](https://docs.gitlab.com/ee/administration/object_storage.html#encrypted-s3-buckets) with [storage-specific configuration form](https://docs.gitlab.com/ee/administration/object_storage.html#configure-each-object-type-to-define-its-own-storage-connection-storage-specific-form).
-
-If your S3 buckets have [SSE-S3 or SSE-KMS encryption enabled](https://docs.aws.amazon.com/kms/latest/developerguide/services-s3.html), please [migrate your configuration to use consolidated object storage form](https://docs.gitlab.com/ee/administration/object_storage.html#transition-to-consolidated-form) before upgrading to GitLab 15.0. Otherwise, you may start getting `ETag mismatch` errors during objects upload.
-
-#### 403 errors
-
-If you see 403 errors when uploading to object storage after
-upgrading to GitLab 15.0, check that the [correct permissions](https://docs.gitlab.com/ee/administration/object_storage.html#iam-permissions)
-are assigned to the bucket. Direct upload needs the ability to delete an
-object (example: `s3:DeleteObject`), but background uploads do not.
-
-#### `remote_directory` with a path prefix
-
-If the object storage `remote_directory` configuration contains a slash (`/`) after the bucket (example: `gitlab/uploads`), be aware that this [was never officially supported](https://gitlab.com/gitlab-org/gitlab/-/issues/292958).
-Some users found that they could specify a path prefix to the bucket. In direct upload mode, object storage uploads will fail if a slash is present in GitLab 15.0.
-
-If you have set a prefix, you can use a workaround to revert to background uploads:
-
-1. Continue to use [storage-specific configuration](https://docs.gitlab.com/ee/administration/object_storage.html#configure-each-object-type-to-define-its-own-storage-connection-storage-specific-form).
-1. In Omnibus GitLab, set the `GITLAB_LEGACY_BACKGROUND_UPLOADS` to re-enable background uploads:
-
- ```ruby
- gitlab_rails['env'] = { 'GITLAB_LEGACY_BACKGROUND_UPLOADS' => 'artifacts,external_diffs,lfs,uploads,packages,dependency_proxy,terraform_state,pages' }
- ```
-
-Support for prefixes was restored in GitLab 15.2 via [this MR](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91307).
-Support for setting `GITLAB_LEGACY_BACKGROUND_UPLOADS` will be removed in GitLab 15.4.
-
-### Container Network and Host Security
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/groups/gitlab-org/-/epics/7477).
-</div>
-
-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
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-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
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.8</span>
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/351945).
-</div>
-
-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
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/333299).
-</div>
-
-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
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.10</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-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
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.7</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/346485).
-</div>
-
-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
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/350275).
-</div>
-
-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/advanced_search/elasticsearch.html#version-requirements) for details.
-
-### End of support for Python 3.6 in Dependency Scanning
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/351503).
-</div>
-
-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
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/339039).
-</div>
-
-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
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.3</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/groups/gitlab-org/configure/-/epics/6).
-</div>
-
-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
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">13.12</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-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
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-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
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.7</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/346540).
-</div>
-
-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
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.5</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/28192).
-</div>
-
-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
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.8</span>
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/351345).
-</div>
-
-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
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.6</span>
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/345839).
-</div>
-
-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`
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/6150).
-</div>
-
-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
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/4208).
-</div>
-
-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
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-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
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.3</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-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
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/351963).
-</div>
-
-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
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/351962).
-</div>
-
-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
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.8</span>
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/352549).
-</div>
-
-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).
-
-### Pipelines field from the version field
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.5</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/342882).
-</div>
-
-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.
-
-### Pseudonymizer
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.7</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/219952).
-</div>
-
-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.
-
-### Request profiling
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/352488).
-</div>
-
-[Request profiling](https://docs.gitlab.com/ee/administration/monitoring/performance/index.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
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-[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
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/289830).
-</div>
-
-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
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.6</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/347305).
-</div>
-
-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
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.8</span>
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/352553).
-</div>
-
-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
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.5</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-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
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.8</span>
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/352565).
-</div>
-
-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).
-
-### Self-managed certificate-based integration with Kubernetes feature flagged
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.5</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/groups/gitlab-org/configure/-/epics/8).
-</div>
-
-In 15.0 the certificate-based integration with Kubernetes will be disabled by default.
-
-After 15.0, you should use the [agent for Kubernetes](https://docs.gitlab.com/ee/user/clusters/agent/) to connect Kubernetes clusters with GitLab. The agent for Kubernetes is a more robust, secure, and reliable integration with Kubernetes. [How do I migrate to the agent?](https://docs.gitlab.com/ee/user/infrastructure/clusters/migrate_to_gitlab_agent.html)
-
-If you need more time to migrate, you can enable the `certificate_based_clusters` [feature flag](https://docs.gitlab.com/ee/administration/feature_flags.html), which re-enables the certificate-based integration.
-
-In GitLab 17.0, we will [remove the feature, its related code, and the feature flag](https://about.gitlab.com/blog/2021/11/15/deprecating-the-cert-based-kubernetes-integration/). GitLab will continue to fix any security or critical issues until 17.0.
-
-For updates and details, follow [this epic](https://gitlab.com/groups/gitlab-org/configure/-/epics/8).
-
-### Sidekiq configuration for metrics and health checks
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.7</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/347509).
-</div>
-
-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
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.7</span>
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/347137).
-</div>
-
-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/web_ide/index.html) 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']`
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.10</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/6758).
-</div>
-
-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`
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.3</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/338182).
-</div>
-
-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
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-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`
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.5</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/345207).
-</div>
-
-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
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.5</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/336912).
-</div>
-
-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.
-
-### Versions from `PackageType`
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.5</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/327453).
-</div>
-
-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`.
-
-### Vulnerability Check
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/357300).
-</div>
-
-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`
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.0</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/333610).
-</div>
-
-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:reports:cobertura` keyword
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.7</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/348980).
-</div>
-
-As of GitLab 15.0, the [`artifacts:reports:cobertura`](https://docs.gitlab.com/ee/ci/yaml/artifacts_reports.html#artifactsreportscobertura-removed)
-keyword has been [replaced](https://gitlab.com/gitlab-org/gitlab/-/issues/344533) by
-[`artifacts:reports:coverage_report`](https://docs.gitlab.com/ee/ci/yaml/artifacts_reports.html#artifactsreportscoverage_report).
-Cobertura is the only supported report file, but this is the first step towards GitLab supporting other report types.
-
-### `defaultMergeCommitMessageWithDescription` GraphQL API field
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.5</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/345451).
-</div>
-
-The GraphQL API field `defaultMergeCommitMessageWithDescription` has been removed in GitLab 15.0. For projects with a commit message template set, it will ignore the template.
-
-### `dependency_proxy_for_private_groups` feature flag
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.5</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/276777).
-</div>
-
-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.
-
-### `omniauth-kerberos` gem
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.3</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-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.
-
-### `promote-to-primary-node` command from `gitlab-ctl`
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.5</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/345207).
-</div>
-
-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.
-
-### `push_rules_supersede_code_owners` feature flag
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/262019).
-</div>
-
-The `push_rules_supersede_code_owners` feature flag has been removed in GitLab 15.0. From now on, push rules will supersede the `CODEOWNERS` file. Even if Code Owner approval is required, a push rule that explicitly allows a specific user to push code supersedes the Code Owners setting.
-
-### `type` and `types` keyword from CI/CD configuration
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.6</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-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.
-
-### bundler-audit Dependency Scanning tool
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.8</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/347491).
-</div>
-
-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.
-
-## Removed in 14.10
-
-### Permissions change for downloading Composer dependencies
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-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.
-
-## Removed in 14.9
-
-### Integrated error tracking disabled by default
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">14.9</span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/353639).
-</div>
-
-In GitLab 14.4, GitLab released an integrated error tracking backend that replaces Sentry. This feature caused database performance issues. In GitLab 14.9, integrated error tracking is removed from GitLab.com, and turned off by default in GitLab self-managed. While we explore the future development of this feature, please consider switching to the Sentry backend by [changing your error tracking to Sentry in your project settings](https://docs.gitlab.com/ee/operations/error_tracking.html#sentry-error-tracking).
-
-For additional background on this removal, please reference [Disable Integrated Error Tracking by Default](https://gitlab.com/groups/gitlab-org/-/epics/7580). If you have feedback please add a comment to [Feedback: Removal of Integrated Error Tracking](https://gitlab.com/gitlab-org/gitlab/-/issues/355493).
-
-## Removed in 14.6
-
-### Limit the number of triggered pipeline to 25K in free tier
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-</div>
-
-A large amount of triggered pipelines in a single project impacts the performance of GitLab.com. In GitLab 14.6, we are limiting the number of triggered pipelines in a single project on GitLab.com at any given moment to 25,000. This change applies to projects in the free tier only, Premium and Ultimate are not affected by this change.
-
-### Release CLI distributed as a generic package
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-</div>
-
-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.
-
-## Removed in 14.3
-
-### Introduced limit of 50 tags for jobs
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-</div>
-
-GitLab values efficiency and is prioritizing reliability for [GitLab.com in FY22](https://about.gitlab.com/direction/#gitlab-hosted-first). In 14.3, GitLab CI/CD jobs must have less than 50 [tags](https://docs.gitlab.com/ee/ci/yaml/index.html#tags). If a pipeline contains a job with 50 or more tags, you will receive an error and the pipeline will not be created.
-
-### List project pipelines API endpoint removes `name` support in 14.3
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-</div>
-
-In GitLab 14.3, we will remove the ability to filter by `name` in the [list project pipelines API endpoint](https://docs.gitlab.com/ee/api/pipelines.html#list-project-pipelines) to improve performance. If you currently use this parameter with this endpoint, you must switch to `username`.
-
-### Use of legacy storage setting
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-</div>
-
-The support for [`gitlab_pages['use_legacy_storage']` setting](https://docs.gitlab.com/ee/administration/pages/index.html#domain-source-configuration-before-140) in Omnibus installations has been removed.
-
-In 14.0 we removed [`domain_config_source`](https://docs.gitlab.com/ee/administration/pages/index.html#domain-source-configuration-before-140) which had been previously deprecated, and allowed users to specify disk storage. In 14.0 we added `use_legacy_storage` as a **temporary** flag to unblock upgrades, and allow us to debug issues with our users and it was deprecated and communicated for removal in 14.3.
-
-## Removed in 14.2
-
-### Max job log file size of 100 MB
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-</div>
-
-GitLab values efficiency for all users in our wider community of contributors, so we're always working hard to make sure the application performs at a high level with a lovable UX.
- In GitLab 14.2, we have introduced a [job log file size limit](https://docs.gitlab.com/ee/administration/instance_limits.html#maximum-file-size-for-job-logs), set to 100 megabytes by default. Administrators of self-managed GitLab instances can customize this to any value. All jobs that exceed this limit are dropped and marked as failed, helping prevent performance impacts or over-use of resources. This ensures that everyone using GitLab has the best possible experience.
-
-## Removed in 14.1
-
-### Remove support for `prometheus.listen_address` and `prometheus.enable`
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-</div>
-
-The support for `prometheus.listen_address` and `prometheus.enable` has been removed from `gitlab.yml`. Use `prometheus.enabled` and `prometheus.server_address` to set up Prometheus server that GitLab instance connects to. Refer to [our documentation](https://docs.gitlab.com/ee/install/installation.html#prometheus-server-setup) for details.
-
-This only affects new installations from source where users might use the old configurations.
-
-### Remove support for older browsers
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-</div>
-
-In GitLab 14.1, we are cleaning up and [removing old code](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63994) that was specific for browsers that we no longer support. This has no impact on users when one of our [supported web browsers](https://docs.gitlab.com/ee/install/requirements.html#supported-web-browsers) is used.
-
-Most notably, support for the following browsers has been removed:
-
-- Apple Safari 13 and older.
-- Mozilla Firefox 68.
-- Pre-Chromium Microsoft Edge.
-
-The minimum supported browser versions are:
-
-- Apple Safari 13.1.
-- Mozilla Firefox 78.
-- Google Chrome 84.
-- Chromium 84.
-- Microsoft Edge 84.
-
-## Removed in 14.0
-
-### Auto Deploy CI template v1
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/300862).
-</div>
-
-In GitLab 14.0, we will update the [Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/stages.html#auto-deploy) CI template to the latest version. This includes new features, bug fixes, and performance improvements with a dependency on the v2 [auto-deploy-image](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image). Auto Deploy CI template v1 is deprecated going forward.
-
-Since the v1 and v2 versions are not backward-compatible, your project might encounter an unexpected failure if you already have a deployed application. Follow the [upgrade guide](https://docs.gitlab.com/ee/topics/autodevops/upgrading_auto_deploy_dependencies.html#upgrade-guide) to upgrade your environments. You can also start using the latest template today by following the [early adoption guide](https://docs.gitlab.com/ee/topics/autodevops/upgrading_auto_deploy_dependencies.html#early-adopters).
-
-### Breaking changes to Terraform CI template
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/328500).
-</div>
-
-GitLab 14.0 renews the Terraform CI template to the latest version. The new template is set up for the GitLab Managed Terraform state, with a dependency on the GitLab `terraform-images` image, to provide a good user experience around GitLab's Infrastructure-as-Code features.
-
-The current stable and latest templates are not compatible, and the current latest template becomes the stable template beginning with GitLab 14.0, your Terraform pipeline might encounter an unexpected failure if you run a custom `init` job.
-
-### Code Quality RuboCop support changed
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-By default, the Code Quality feature has not provided support for Ruby 2.6+ if you're using the Code Quality template. To better support the latest versions of Ruby, the default RuboCop version is updated to add support for Ruby 2.4 through 3.0. As a result, support for Ruby 2.1, 2.2, and 2.3 is removed. You can re-enable support for older versions by [customizing your configuration](https://docs.gitlab.com/ee/ci/testing/code_quality.html#rubocop-errors).
-
-Relevant Issue: [Default `codeclimate-rubocop` engine does not support Ruby 2.6+](https://gitlab.com/gitlab-org/ci-cd/codequality/-/issues/28)
-
-### Container Scanning Engine Clair
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-Clair, the default container scanning engine, was deprecated in GitLab 13.9 and is removed from GitLab 14.0 and replaced by Trivy. We advise customers who are customizing variables for their container scanning job to [follow these instructions](https://docs.gitlab.com/ee/user/application_security/container_scanning/#change-scanners) to ensure that their container scanning jobs continue to work.
-
-### DAST default template stages
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-In GitLab 14.0, we've removed the stages defined in the current `DAST.gitlab-ci.yml` template to avoid the situation where the template overrides manual changes made by DAST users. We're making this change in response to customer issues where the stages in the template cause problems when used with customized DAST configurations. Because of this removal, `gitlab-ci.yml` configurations that do not specify a `dast` stage must be updated to include this stage.
-
-### DAST environment variable renaming and removal
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-GitLab 13.8 renamed multiple environment variables to support their broader usage in different workflows. In GitLab 14.0, the old variables have been permanently removed and will no longer work. Any configurations using these variables must be updated to the new variable names. Any scans using these variables in GitLab 14.0 and later will fail to be configured correctly. These variables are:
-
-- `DAST_AUTH_EXCLUDE_URLS` becomes `DAST_EXCLUDE_URLS`.
-- `AUTH_EXCLUDE_URLS` becomes `DAST_EXCLUDE_URLS`.
-- `AUTH_USERNAME` becomes `DAST_USERNAME`.
-- `AUTH_PASSWORD` becomes `DAST_PASSWORD`.
-- `AUTH_USERNAME_FIELD` becomes `DAST_USERNAME_FIELD`.
-- `AUTH_PASSWORD_FIELD` becomes `DAST_PASSWORD_FIELD`.
-- `DAST_ZAP_USE_AJAX_SPIDER` will now be `DAST_USE_AJAX_SPIDER`.
-- `DAST_FULL_SCAN_DOMAIN_VALIDATION_REQUIRED` will be removed, since the feature is being removed.
-
-### Default Browser Performance testing job renamed in GitLab 14.0
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-Browser Performance Testing has run in a job named `performance` by default. With the introduction of [Load Performance Testing](https://docs.gitlab.com/ee/ci/testing/code_quality.html) in GitLab 13.2, this naming could be confusing. To make it clear which job is running [Browser Performance Testing](https://docs.gitlab.com/ee/ci/testing/browser_performance_testing.html), the default job name is changed from `performance` to `browser_performance` in the template in GitLab 14.0.
-
-Relevant Issue: [Rename default Browser Performance Testing job](https://gitlab.com/gitlab-org/gitlab/-/issues/225914)
-
-### Default DAST spider begins crawling at target URL
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-In GitLab 14.0, DAST has removed the current method of resetting the scan to the hostname when starting to spider. Prior to GitLab 14.0, the spider would not begin at the specified target path for the URL but would instead reset the URL to begin crawling at the host root. GitLab 14.0 changes the default for the new variable `DAST_SPIDER_START_AT_HOST` to `false` to better support users' intention of beginning spidering and scanning at the specified target URL, rather than the host root URL. This change has an added benefit: scans can take less time, if the specified path does not contain links to the entire site. This enables easier scanning of smaller sections of an application, rather than crawling the entire app during every scan.
-
-### Default branch name for new repositories now `main`
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-Every Git repository has an initial branch, which is named `master` by default. It's the first branch to be created automatically when you create a new repository. Future [Git versions](https://lore.kernel.org/git/pull.656.v4.git.1593009996.gitgitgadget@gmail.com/) will change the default branch name in Git from `master` to `main`. In coordination with the Git project and the broader community, [GitLab has changed the default branch name](https://gitlab.com/gitlab-org/gitlab/-/issues/223789) for new projects on both our SaaS (GitLab.com) and self-managed offerings starting with GitLab 14.0. This will not affect existing projects.
-
-GitLab has already introduced changes that allow you to change the default branch name both at the [instance level](https://docs.gitlab.com/ee/user/project/repository/branches/default.html#instance-level-custom-initial-branch-name) (for self-managed users) and at the [group level](https://docs.gitlab.com/ee/user/group/#use-a-custom-name-for-the-initial-branch) (for both SaaS and self-managed users). We encourage you to make use of these features to set default branch names on new projects.
-
-For more information, check out our [blog post](https://about.gitlab.com/blog/2021/03/10/new-git-default-branch-name/).
-
-### Dependency Scanning
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-As mentioned in [13.9](https://about.gitlab.com/releases/2021/02/22/gitlab-13-9-released/#deprecations-for-dependency-scanning) and [this blog post](https://about.gitlab.com/blog/2021/02/08/composition-analysis-14-deprecations-and-removals/) several removals for Dependency Scanning take effect.
-
-Previously, to exclude a DS analyzer, you needed to remove it from the default list of analyzers, and use that to set the `DS_DEFAULT_ANALYZERS` variable in your project’s CI template. We determined it should be easier to avoid running a particular analyzer without losing the benefit of newly added analyzers. As a result, we ask you to migrate from `DS_DEFAULT_ANALYZERS` to `DS_EXCLUDED_ANALYZERS` when it is available. Read about it in [issue #287691](https://gitlab.com/gitlab-org/gitlab/-/issues/287691).
-
-Previously, to prevent the Gemnasium analyzers to fetch the advisory database at runtime, you needed to set the `GEMNASIUM_DB_UPDATE` variable. However, this is not documented properly, and its naming is inconsistent with the equivalent `BUNDLER_AUDIT_UPDATE_DISABLED` variable. As a result, we ask you to migrate from `GEMNASIUM_DB_UPDATE` to `GEMNASIUM_UPDATE_DISABLED` when it is available. Read about it in [issue #215483](https://gitlab.com/gitlab-org/gitlab/-/issues/215483).
-
-### Deprecated GraphQL fields
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-In accordance with our [GraphQL deprecation and removal process](https://docs.gitlab.com/ee/api/graphql/#deprecation-process), the following fields that were deprecated prior to 13.7 are [fully removed in 14.0](https://gitlab.com/gitlab-org/gitlab/-/issues/267966):
-
-- `Mutations::Todos::MarkAllDone`, `Mutations::Todos::RestoreMany` - `:updated_ids`
-- `Mutations::DastScannerProfiles::Create`, `Types::DastScannerProfileType` - `:global_id`
-- `Types::SnippetType` - `:blob`
-- `EE::Types::GroupType`, `EE::Types::QueryType` - `:vulnerabilities_count_by_day_and_severity`
-- `DeprecatedMutations (concern**)` - `AddAwardEmoji`, `RemoveAwardEmoji`, `ToggleAwardEmoji`
-- `EE::Types::DeprecatedMutations (concern***)` - `Mutations::Pipelines::RunDastScan`, `Mutations::Vulnerabilities::Dismiss`, `Mutations::Vulnerabilities::RevertToDetected`
-
-### DevOps Adoption API Segments
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-The first release of the DevOps Adoption report had a concept of **Segments**. Segments were [quickly removed from the report](https://gitlab.com/groups/gitlab-org/-/epics/5251) because they introduced an additional layer of complexity on top of **Groups** and **Projects**. Subsequent iterations of the DevOps Adoption report focus on comparing adoption across groups rather than segments. GitLab 14.0 removes all references to **Segments** [from the GraphQL API](https://gitlab.com/gitlab-org/gitlab/-/issues/324414) and replaces them with **Enabled groups**.
-
-### Disk source configuration for GitLab Pages
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5993).
-</div>
-
-GitLab Pages [API-based configuration](https://docs.gitlab.com/ee/administration/pages/#gitlab-api-based-configuration) has been available since GitLab 13.0. It replaces the unsupported `disk` source configuration removed in GitLab 14.0, which can no longer be chosen. You should stop using `disk` source configuration, and move to `gitlab` for an API-based configuration. To migrate away from the 'disk' source configuration, set `gitlab_pages['domain_config_source'] = "gitlab"` in your `/etc/gitlab/gitlab.rb` file. We recommend you migrate before updating to GitLab 14.0, to identify and troubleshoot any potential problems before upgrading.
-
-### Experimental prefix in Sidekiq queue selector options
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-GitLab supports a [queue selector](https://docs.gitlab.com/ee/administration/operations/extra_sidekiq_processes.html#queue-selector) to run only a subset of background jobs for a given process. When it was introduced, this option had an 'experimental' prefix (`experimental_queue_selector` in Omnibus, `experimentalQueueSelector` in Helm charts).
-
-As announced in the [13.6 release post](https://about.gitlab.com/releases/2020/11/22/gitlab-13-6-released/#sidekiq-cluster-queue-selector-configuration-option-has-been-renamed), the 'experimental' prefix is no longer supported. Instead, `queue_selector` for Omnibus and `queueSelector` in Helm charts should be used.
-
-### External Pipeline Validation Service Code Changes
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-For self-managed instances using the experimental [external pipeline validation service](https://docs.gitlab.com/ee/administration/external_pipeline_validation.html), the range of error codes GitLab accepts will be reduced. Currently, pipelines are invalidated when the validation service returns a response code from `400` to `499`. In GitLab 14.0 and later, pipelines will be invalidated for the `406: Not Accepted` response code only.
-
-### Geo Foreign Data Wrapper settings
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-As [announced in GitLab 13.3](https://about.gitlab.com/releases/2020/08/22/gitlab-13-3-released/#geo-foreign-data-wrapper-settings-deprecated), the following configuration settings in `/etc/gitlab/gitlab.rb` have been removed in 14.0:
-
-- `geo_secondary['db_fdw']`
-- `geo_postgresql['fdw_external_user']`
-- `geo_postgresql['fdw_external_password']`
-- `gitlab-_rails['geo_migrated_local_files_clean_up_worker_cron']`
-
-### GitLab OAuth implicit grant
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/288516).
-</div>
-
-GitLab is deprecating the [OAuth 2 implicit grant flow](https://docs.gitlab.com/ee/api/oauth2.html#implicit-grant-flow) as it has been removed for [OAuth 2.1](https://oauth.net/2.1/).
-
-Migrate your existing applications to other supported [OAuth2 flows](https://docs.gitlab.com/ee/api/oauth2.html#supported-oauth2-flows).
-
-### GitLab Runner helper image in GitLab.com Container Registry
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-In 14.0, we are now pulling the GitLab Runner [helper image](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#helper-image) from the GitLab Container Registry instead of Docker Hub. Refer to [issue #27218](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/27218) for details.
-
-### GitLab Runner installation to ignore the `skel` directory
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-In GitLab Runner 14.0, the installation process will ignore the `skel` directory by default when creating the user home directory. Refer to [issue #4845](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/4845) for details.
-
-### Gitaly Cluster SQL primary elector
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-Now that Praefect supports a [primary election strategy](https://docs.gitlab.com/ee/administration/gitaly/praefect.html#repository-specific-primary-nodes) for each repository, we have removed the `sql` election strategy.
-The `per_repository` election strategy is the new default, which is automatically used if no election strategy was specified.
-
-If you had configured the `sql` election strategy, you must follow the [migration instructions](https://docs.gitlab.com/ee/administration/gitaly/praefect.html#migrate-to-repository-specific-primary-gitaly-nodes) before upgrading to 14.0.
-
-### Global `SAST_ANALYZER_IMAGE_TAG` in SAST CI template
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/301216).
-</div>
-
-With the maturity of GitLab Secure scanning tools, we've needed to add more granularity to our release process. Previously, GitLab shared a major version number for [all analyzers and tools](https://docs.gitlab.com/ee/user/application_security/sast/#supported-languages-and-frameworks). This requires all tools to share a major version, and prevents the use of [semantic version numbering](https://semver.org/). In GitLab 14.0, SAST removes the `SAST_ANALYZER_IMAGE_TAG` global variable in our [managed `SAST.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml) CI template, in favor of the analyzer job variable setting the `major.minor` tag in the SAST vendored template.
-
-Each analyzer job now has a scoped `SAST_ANALYZER_IMAGE_TAG` variable, which will be actively managed by GitLab and set to the `major` tag for the respective analyzer. To pin to a specific version, [change the variable value to the specific version tag](https://docs.gitlab.com/ee/user/application_security/sast/#pinning-to-minor-image-version).
-If you override or maintain custom versions of `SAST.gitlab-ci.yml`, update your CI templates to stop referencing the global `SAST_ANALYZER_IMAGE_TAG`, and move it to a scoped analyzer job tag. We strongly encourage [inheriting and overriding our managed CI templates](https://docs.gitlab.com/ee/user/application_security/sast/#overriding-sast-jobs) to future-proof your CI templates. This change allows you to more granularly control future analyzer updates with a pinned `major.minor` version.
-This deprecation and removal changes our [previously announced plan](https://about.gitlab.com/releases/2021/02/22/gitlab-13-9-released/#pin-static-analysis-analyzers-and-tools-to-minor-versions) to pin the Static Analysis tools.
-
-### Hardcoded `master` in CI/CD templates
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-Our CI/CD templates have been updated to no longer use hard-coded references to a `master` branch. In 14.0, they all use a variable that points to your project's configured default branch instead. If your CI/CD pipeline relies on our built-in templates, verify that this change works with your current configuration. For example, if you have a `master` branch and a different default branch, the updates to the templates may cause changes to your pipeline behavior. For more information, [read the issue](https://gitlab.com/gitlab-org/gitlab/-/issues/324131).
-
-### Helm v2 support
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-Helm v2 was [officially deprecated](https://helm.sh/blog/helm-v2-deprecation-timeline/) in November of 2020, with the `stable` repository being [de-listed from the Helm Hub](https://about.gitlab.com/blog/2020/11/09/ensure-auto-devops-work-after-helm-stable-repo/) shortly thereafter. With the release of GitLab 14.0, which will include the 5.0 release of the [GitLab Helm chart](https://docs.gitlab.com/charts/), Helm v2 will no longer be supported.
-
-Users of the chart should [upgrade to Helm v3](https://helm.sh/docs/topics/v2_v3_migration/) to deploy GitLab 14.0 and later.
-
-### Legacy DAST domain validation
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-The legacy method of DAST Domain Validation for CI/CD scans was deprecated in GitLab 13.8, and is removed in GitLab 14.0. This method of domain validation only disallows scans if the `DAST_FULL_SCAN_DOMAIN_VALIDATION_REQUIRED` environment variable is set to `true` in the `gitlab-ci.yml` file, and a `Gitlab-DAST-Permission` header on the site is not set to `allow`. This two-step method required users to opt in to using the variable before they could opt out from using the header.
-
-For more information, see the [removal issue](https://gitlab.com/gitlab-org/gitlab/-/issues/293595).
-
-### Legacy feature flags
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/254324).
-</div>
-
-Legacy feature flags became read-only in GitLab 13.4. GitLab 14.0 removes support for legacy feature flags, so you must migrate them to the [new version](https://docs.gitlab.com/ee/operations/feature_flags.html). You can do this by first taking a note (screenshot) of the legacy flag, then deleting the flag through the API or UI (you don't need to alter the code), and finally create a new Feature Flag with the same name as the legacy flag you deleted. Also, make sure the strategies and environments match the deleted flag. We created a [video tutorial](https://www.youtube.com/watch?v=CAJY2IGep7Y) to help with this migration.
-
-### Legacy fields from DAST report
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-As a part of the migration to a common report format for all of the Secure scanners in GitLab, DAST is making changes to the DAST JSON report. Certain legacy fields were deprecated in 13.8 and have been completely removed in 14.0. These fields are `@generated`, `@version`, `site`, and `spider`. This should not affect any normal DAST operation, but does affect users who consume the JSON report in an automated way and use these fields. Anyone affected by these changes, and needs these fields for business reasons, is encouraged to open a new GitLab issue and explain the need.
-
-For more information, see [the removal issue](https://gitlab.com/gitlab-org/gitlab/-/issues/33915).
-
-### Legacy storage
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-As [announced in GitLab 13.0](https://about.gitlab.com/releases/2020/05/22/gitlab-13-0-released/#planned-removal-of-legacy-storage-in-14.0), [legacy storage](https://docs.gitlab.com/ee/administration/repository_storage_types.html#legacy-storage) has been removed in GitLab 14.0.
-
-### License Compliance
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-In 13.0, we deprecated the License-Management CI template and renamed it License-Scanning. We have been providing backward compatibility by warning users of the old template to switch. Now in 14.0, we are completely removing the License-Management CI template. Read about it in [issue #216261](https://gitlab.com/gitlab-org/gitlab/-/issues/216261) or [this blog post](https://about.gitlab.com/blog/2021/02/08/composition-analysis-14-deprecations-and-removals/).
-
-### Limit projects returned in `GET /groups/:id/`
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/257829).
-</div>
-
-To improve performance, we are limiting the number of projects returned from the `GET /groups/:id/` API call to 100. A complete list of projects can still be retrieved with the `GET /groups/:id/projects` API call.
-
-### Make `pwsh` the default shell for newly-registered Windows Runners
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-In GitLab Runner 13.2, PowerShell Core support was added to the Shell executor. In 14.0, PowerShell Core, `pwsh` is now the default shell for newly-registered Windows runners. Windows `CMD` will still be available as a shell option for Windows runners. Refer to [issue #26419](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/26419) for details.
-
-### Migrate from `SAST_DEFAULT_ANALYZERS` to `SAST_EXCLUDED_ANALYZERS`
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/229974).
-</div>
-
-Until GitLab 13.9, if you wanted to avoid running one particular GitLab SAST analyzer, you needed to remove it from the [long string of analyzers in the `SAST.gitlab-ci.yml` file](https://gitlab.com/gitlab-org/gitlab/-/blob/390afc431e7ce1ac253b35beb39f19e49c746bff/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml#L12) and use that to set the [`SAST_DEFAULT_ANALYZERS`](https://docs.gitlab.com/ee/user/application_security/sast/#docker-images) variable in your project's CI file. If you did this, it would exclude you from future new analyzers because this string hard codes the list of analyzers to execute. We avoid this problem by inverting this variable's logic to exclude, rather than choose default analyzers.
-Beginning with 13.9, [we migrated](https://gitlab.com/gitlab-org/gitlab/-/blob/14fed7a33bfdbd4663d8928e46002a5ef3e3282c/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml#L13) to `SAST_EXCLUDED_ANALYZERS` in our `SAST.gitlab-ci.yml` file. We encourage anyone who uses a [customized SAST configuration](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) in their project CI file to migrate to this new variable. If you have not overridden `SAST_DEFAULT_ANALYZERS`, no action is needed. The CI/CD variable `SAST_DEFAULT_ANALYZERS` has been removed in GitLab 14.0, which released on June 22, 2021.
-
-### Off peak time mode configuration for Docker Machine autoscaling
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-In GitLab Runner 13.0, [issue #5069](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/5069), we introduced new timing options for the GitLab Docker Machine executor. In GitLab Runner 14.0, we have removed the old configuration option, [off peak time mode](https://docs.gitlab.com/runner/configuration/autoscale.html#off-peak-time-mode-configuration-deprecated).
-
-### OpenSUSE Leap 15.1
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-Support for [OpenSUSE Leap 15.1 is being deprecated](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/5135). Support for 15.1 will be dropped in 14.0. We are now providing support for openSUSE Leap 15.2 packages.
-
-### PostgreSQL 11 support
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-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 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
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/325931).
-</div>
-
-The [deployment frequency project-level API](https://docs.gitlab.com/ee/api/dora/metrics.html#list-project-deployment-frequencies) endpoint has been deprecated in favor of the [DORA 4 API](https://docs.gitlab.com/ee/api/dora/metrics.html), which consolidates all the metrics under one API with the specific metric as a required field. As a result, the timestamp field, which doesn't allow adding future extensions and causes performance issues, will be removed. With the old API, an example response would be `{ "2021-03-01": 3, "date": "2021-03-01", "value": 3 }`. The first key/value (`"2021-03-01": 3`) will be removed and replaced by the last two (`"date": "2021-03-01", "value": 3`).
-
-### Release description in the Tags API
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/300887).
-</div>
-
-GitLab 14.0 removes support for the release description in the Tags API. You can no longer add a release description when [creating a new tag](https://docs.gitlab.com/ee/api/tags.html#create-a-new-tag). You also can no longer [create](https://docs.gitlab.com/ee/api/tags.html#create-a-new-release) or [update](https://docs.gitlab.com/ee/api/tags.html#update-a-release) a release through the Tags API. Please migrate to use the [Releases API](https://docs.gitlab.com/ee/api/releases/#create-a-release) instead.
-
-### Ruby version changed in `Ruby.gitlab-ci.yml`
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-By default, the `Ruby.gitlab-ci.yml` file has included Ruby 2.5.
-
-To better support the latest versions of Ruby, the template is changed to use `ruby:latest`, which is currently 3.0. To better understand the changes in Ruby 3.0, please reference the [Ruby-lang.org release announcement](https://www.ruby-lang.org/en/news/2020/12/25/ruby-3-0-0-released/).
-
-Relevant Issue: [Updates Ruby version 2.5 to 3.0](https://gitlab.com/gitlab-org/gitlab/-/issues/329160)
-
-### SAST analyzer `SAST_GOSEC_CONFIG` variable
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/301215).
-</div>
-
-With the release of [SAST Custom Rulesets](https://docs.gitlab.com/ee/user/application_security/sast/#customize-rulesets) in GitLab 13.5 we allow greater flexibility in configuration options for our Go analyzer (GoSec). As a result we no longer plan to support our less flexible [`SAST_GOSEC_CONFIG`](https://docs.gitlab.com/ee/user/application_security/sast/#analyzer-settings) analyzer setting. This variable was deprecated in GitLab 13.10.
-GitLab 14.0 removes the old `SAST_GOSEC_CONFIG variable`. If you use or override `SAST_GOSEC_CONFIG` in your CI file, update your SAST CI configuration or pin to an older version of the GoSec analyzer. We strongly encourage [inheriting and overriding our managed CI templates](https://docs.gitlab.com/ee/user/application_security/sast/#overriding-sast-jobs) to future-proof your CI templates.
-
-### Service Templates
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-Service Templates are [removed in GitLab 14.0](https://gitlab.com/groups/gitlab-org/-/epics/5672). They were used to apply identical settings to a large number of projects, but they only did so at the time of project creation.
-
-While they solved part of the problem, _updating_ those values later proved to be a major pain point. [Project Integration Management](https://docs.gitlab.com/ee/user/admin_area/settings/project_integration_management.html) solves this problem by enabling you to create settings at the Group or Instance level, and projects within that namespace inheriting those settings.
-
-### Success and failure for finished build metric conversion
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-In GitLab Runner 13.5, we introduced `failed` and `success` states for a job. To support Prometheus rules, we chose to convert `success/failure` to `finished` for the metric. In 14.0, the conversion has now been removed. Refer to [issue #26900](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/26900) for details.
-
-### Terraform template version
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue]().
-</div>
-
-As we continuously [develop GitLab's Terraform integrations](https://gitlab.com/gitlab-org/gitlab/-/issues/325312), to minimize customer disruption, we maintain two GitLab CI/CD templates for Terraform:
-
-- The ["latest version" template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform.latest.gitlab-ci.yml), which is updated frequently between minor releases of GitLab (such as 13.10, 13.11, etc).
-- The ["major version" template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform.gitlab-ci.yml), which is updated only at major releases (such as 13.0, 14.0, etc).
-
-At every major release of GitLab, the "latest version" template becomes the "major version" template, inheriting the "latest template" setup.
-As we have added many new features to the Terraform integration, the new setup for the "major version" template can be considered a breaking change.
-
-The latest template supports the [Terraform Merge Request widget](https://docs.gitlab.com/ee/user/infrastructure/iac/mr_integration.html) and
-doesn't need additional setup to work with the [GitLab managed Terraform state](https://docs.gitlab.com/ee/user/infrastructure/iac/terraform_state.html).
-
-To check the new changes, see the [new "major version" template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform.gitlab-ci.yml).
-
-### Ubuntu 16.04 support
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-Ubuntu 16.04 [reached end-of-life in April 2021](https://ubuntu.com/about/release-cycle), and no longer receives maintenance updates. We strongly recommend users to upgrade to a newer release, such as 20.04.
-
-GitLab 13.12 will be the last release with Ubuntu 16.04 support.
-
-### Ubuntu 19.10 (Eoan Ermine) package
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-Ubuntu 19.10 (Eoan Ermine) reached end of life on Friday, July 17, 2020. In GitLab Runner 14.0, Ubuntu 19.10 (Eoan Ermine) is no longer available from our package distribution. Refer to [issue #26036](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/26036) for details.
-
-### Unicorn in GitLab self-managed
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-[Support for Unicorn](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/6078) has been removed in GitLab 14.0 in favor of Puma. [Puma has a multi-threaded architecture](https://docs.gitlab.com/ee/administration/operations/puma.html) which uses less memory than a multi-process application server like Unicorn. On GitLab.com, we saw a 40% reduction in memory consumption by using Puma.
-
-### WIP merge requests renamed 'draft merge requests'
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-The WIP (work in progress) status for merge requests signaled to reviewers that the merge request in question wasn't ready to merge. We've renamed the WIP feature to **Draft**, a more inclusive and self-explanatory term. **Draft** clearly communicates the merge request in question isn't ready for review, and makes no assumptions about the progress being made toward it. **Draft** also reduces the cognitive load for new users, non-English speakers, and anyone unfamiliar with the WIP acronym.
-
-### Web Application Firewall (WAF)
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-The Web Application Firewall (WAF) was deprecated in GitLab 13.6 and is removed from GitLab 14.0. The WAF had limitations inherent in the architectural design that made it difficult to meet the requirements traditionally expected of a WAF. By removing the WAF, GitLab is able to focus on improving other areas in the product where more value can be provided to users. Users who currently rely on the WAF can continue to use the free and open source [ModSecurity](https://github.com/SpiderLabs/ModSecurity) project, which is independent from GitLab. Additional details are available in the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/271276).
-
-### Windows Server 1903 image support
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-In 14.0, we have removed Windows Server 1903. Microsoft ended support for this version on 2020-08-12. Refer to [issue #27551](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/27551) for details.
-
-### Windows Server 1909 image support
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-In 14.0, we have removed Windows Server 1909. Microsoft ended support for this version on 2021-05-11. Refer to [issue #27899](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/27899) for details.
-
-### `/usr/lib/gitlab-runner` symlink from package
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-In GitLab Runner 13.3, a symlink was added from `/user/lib/gitlab-runner/gitlab-runner` to `/usr/bin/gitlab-runner`. In 14.0, the symlink has been removed and the runner is now installed in `/usr/bin/gitlab-runner`. Refer to [issue #26651](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/26651) for details.
-
-### `?w=1` URL parameter to ignore whitespace changes
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-To create a consistent experience for users based on their preferences, support for toggling whitespace changes via URL parameter has been removed in GitLab 14.0.
-
-### `CI_PROJECT_CONFIG_PATH` variable
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-The `CI_PROJECT_CONFIG_PATH` [predefined project variable](https://docs.gitlab.com/ee/ci/variables/predefined_variables.html)
-has been removed in favor of `CI_CONFIG_PATH`, which is functionally the same.
-
-If you are using `CI_PROJECT_CONFIG_PATH` in your pipeline configurations,
-please update them to use `CI_CONFIG_PATH` instead.
-
-### `FF_RESET_HELPER_IMAGE_ENTRYPOINT` feature flag
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-In 14.0, we have deactivated the `FF_RESET_HELPER_IMAGE_ENTRYPOINT` feature flag. Refer to issue [#26679](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/26679) for details.
-
-### `FF_SHELL_EXECUTOR_USE_LEGACY_PROCESS_KILL` feature flag
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-In [GitLab Runner 13.1](https://docs.gitlab.com/runner/executors/shell.html#gitlab-131-and-later), [issue #3376](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/3376), we introduced `sigterm` and then `sigkill` to a process in the Shell executor. We also introduced a new feature flag, `FF_SHELL_EXECUTOR_USE_LEGACY_PROCESS_KILL`, so you can use the previous process termination sequence. In GitLab Runner 14.0, [issue #6413](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/6413), the feature flag has been removed.
-
-### `FF_USE_GO_CLOUD_WITH_CACHE_ARCHIVER` feature flag
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-GitLab Runner 14.0 removes the `FF_USE_GO_CLOUD_WITH_CACHE_ARCHIVER` feature flag. Refer to [issue #27175](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/27175) for details.
-
-### `secret_detection_default_branch` job
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/297269).
-</div>
-
-To ensure Secret Detection was scanning both default branches and feature branches, we introduced two separate secret detection CI jobs (`secret_detection_default_branch` and `secret_detection`) in our managed [`Secret-Detection.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/Secret-Detection.gitlab-ci.yml) template. These two CI jobs created confusion and complexity in the CI rules logic. This deprecation moves the `rule` logic into the `script` section, which then determines how the `secret_detection` job is run (historic, on a branch, commits, etc).
-If you override or maintain custom versions of `SAST.gitlab-ci.yml` or `Secret-Detection.gitlab-ci.yml`, you must update your CI templates. We strongly encourage [inheriting and overriding our managed CI templates](https://docs.gitlab.com/ee/user/application_security/secret_detection/#custom-settings-example) to future-proof your CI templates. GitLab 14.0 no longer supports the old `secret_detection_default_branch` job.
-
-### `trace` parameter in `jobs` API
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone"></span>
-- This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/). Review the details carefully before upgrading.
-</div>
-
-GitLab Runner was updated in GitLab 13.4 to internally stop passing the `trace` parameter to the `/api/jobs/:id` endpoint. GitLab 14.0 deprecates the `trace` parameter entirely for all other requests of this endpoint. Make sure your [GitLab Runner version matches your GitLab version](https://docs.gitlab.com/runner/#gitlab-runner-versions) to ensure consistent behavior.
+<!-- This redirect file can be deleted after <2023-09-28>. -->
+<!-- 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/update/upgrading_from_source.md b/doc/update/upgrading_from_source.md
index c8bed431780..d9641e18e8e 100644
--- a/doc/update/upgrading_from_source.md
+++ b/doc/update/upgrading_from_source.md
@@ -21,8 +21,7 @@ the [Upgrading from CE to EE](upgrading_from_ce_to_ee.md) documentation.
## Upgrading to a new major version
-Major versions are reserved for backwards incompatible changes. We recommend that
-you first upgrade to the latest available minor version of your current major version.
+Major versions are reserved for backwards incompatible changes. You should first upgrade to the latest available minor version of your current major version.
Follow the [Upgrade Recommendations](../policy/maintenance.md#upgrade-recommendations)
to identify the ideal upgrade path.
@@ -96,11 +95,11 @@ Download and install Go (for Linux, 64-bit):
# Remove former Go installation folder
sudo rm -rf /usr/local/go
-curl --remote-name --location --progress-bar "https://go.dev/dl/go1.18.8.linux-amd64.tar.gz"
-echo '4d854c7bad52d53470cf32f1b287a5c0c441dc6b98306dea27358e099698142a go1.18.8.linux-amd64.tar.gz' | shasum -a256 -c - && \
- sudo tar -C /usr/local -xzf go1.18.8.linux-amd64.tar.gz
+curl --remote-name --location --progress-bar "https://go.dev/dl/go1.19.10.linux-amd64.tar.gz"
+echo '8b045a483d3895c6edba2e90a9189262876190dbbd21756870cdd63821810677 go1.19.10.linux-amd64.tar.gz' | shasum -a256 -c - && \
+ sudo tar -C /usr/local -xzf go1.19.10.linux-amd64.tar.gz
sudo ln -sf /usr/local/go/bin/{go,gofmt} /usr/local/bin/
-rm go1.18.8.linux-amd64.tar.gz
+rm go1.19.10.linux-amd64.tar.gz
```
### 6. Update Git
@@ -108,7 +107,7 @@ rm go1.18.8.linux-amd64.tar.gz
To check you are running the minimum required Git version, see
[Git versions](../install/installation.md#software-requirements).
-From GitLab 13.6, we recommend you use the
+From GitLab 13.6, you should use the
[Git version provided by Gitaly](https://gitlab.com/gitlab-org/gitaly/-/issues/2729)
that:
@@ -394,11 +393,6 @@ sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production
If all items are green, then congratulations, the upgrade is complete!
-### 17. Upgrade the product documentation
-
-This is an optional step. If you [installed the product documentation](../install/installation.md#install-the-product-documentation),
-see how to [upgrade to a later version](../administration/docs_self_host.md#upgrade-the-product-documentation-to-a-later-version).
-
## Version specific changes
Upgrading versions might need some manual intervention. For more information,
diff --git a/doc/user/admin_area/analytics/dev_ops_reports.md b/doc/user/admin_area/analytics/dev_ops_reports.md
index 69bf4ff30f1..30ba2ad3e7b 100644
--- a/doc/user/admin_area/analytics/dev_ops_reports.md
+++ b/doc/user/admin_area/analytics/dev_ops_reports.md
@@ -1,74 +1,11 @@
---
-stage: Plan
-group: Optimize
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+redirect_to: '../../../administration/analytics/dev_ops_reports.md'
+remove_date: '2023-10-06'
---
-# DevOps Reports **(FREE SELF)**
+This document was moved to [another location](../../../administration/analytics/dev_ops_reports.md).
-DevOps Reports give you an overview of your entire instance's adoption of
-[Concurrent DevOps](https://about.gitlab.com/topics/concurrent-devops/)
-from planning to monitoring.
-
-To see DevOps Reports:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Analytics > DevOps Reports**.
-
-## DevOps Score
-
-> [Renamed](https://gitlab.com/gitlab-org/gitlab/-/issues/20976) from Conversational Development Index in GitLab 12.6.
-
-NOTE:
-To see the DevOps score, you must activate your GitLab instance's [Service Ping](../settings/usage_statistics.md#service-ping). DevOps Score is a comparative tool, so your score data must be centrally processed by GitLab Inc. first.
-
-You can use the DevOps score to compare your DevOps status to other organizations.
-
-The DevOps Score tab displays usage of major GitLab features on your instance over
-the last 30 days, averaged over the number of billable users in that time period.
-You can also see the Leader usage score, calculated from top-performing instances based on
-[Service Ping data](../settings/usage_statistics.md#service-ping) that GitLab has collected.
-Your score is compared to the lead score of each feature and then expressed
-as a percentage at the bottom of said feature. Your overall **DevOps Score** is an average of your
-feature scores.
-
-Service Ping data is aggregated on GitLab servers for analysis. Your usage
-information is **not sent** to any other GitLab instances.
-If you have just started using GitLab, it might take a few weeks for data to be collected before this
-feature is available.
-
-## DevOps Adoption **(ULTIMATE SELF)**
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/247112) in GitLab 13.7 as a [Beta feature](../../../policy/experiment-beta-support.md#beta).
-> - The Overview tab [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/330401) in GitLab 14.1.
-> - DAST and SAST metrics [added](https://gitlab.com/gitlab-org/gitlab/-/issues/328033) in GitLab 14.1.
-> - Fuzz Testing metrics [added](https://gitlab.com/gitlab-org/gitlab/-/issues/330398) in GitLab 14.2.
-> - Dependency Scanning metrics [added](https://gitlab.com/gitlab-org/gitlab/-/issues/328034) in GitLab 14.2.
-> - Multi-select [added](https://gitlab.com/gitlab-org/gitlab/-/issues/333586) in GitLab 14.2.
-> - Overview table [added](https://gitlab.com/gitlab-org/gitlab/-/issues/335638) in GitLab 14.3.
-
-DevOps Adoption shows feature adoption for development, security, and operations.
-
-| Category | Feature |
-| --- | --- |
-| Development | Approvals<br>Code owners<br>Issues<br>Merge requests |
-| Security | DAST<br>Dependency Scanning<br>Fuzz Testing<br>SAST |
-| Operations | Deployments<br>Pipelines<br>Runners |
-
-You can use Group DevOps Adoption to:
-
-- Identify specific subgroups that are lagging in their adoption of GitLab features, so you can guide them on
-their DevOps journey.
-- Find subgroups that have adopted certain features, and provide guidance to other subgroups on
-how to use those features.
-- Verify if you are getting the return on investment that you expected from GitLab.
-
-## Add or remove a group
-
-To add or remove a subgroup from the DevOps Adoption report:
-
-1. Select **Add or remove groups**.
-1. Select the subgroup you want to add or remove and select **Save changes**.
-
-![DevOps Adoption](img/admin_devops_adoption_v14_2.png)
+<!-- This redirect file can be deleted after <2023-10-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/user/admin_area/analytics/index.md b/doc/user/admin_area/analytics/index.md
index 6441cd866c8..f5849f0b876 100644
--- a/doc/user/admin_area/analytics/index.md
+++ b/doc/user/admin_area/analytics/index.md
@@ -1,26 +1,11 @@
---
-stage: Plan
-group: Optimize
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+redirect_to: '../../../administration/analytics/index.md'
+remove_date: '2023-10-06'
---
-# Instance-level analytics **(FREE SELF)**
+This document was moved to [another location](../../../administration/analytics/index.md).
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/41416) in GitLab 11.2.
-
-Instance-level analytics provide insights into the feature and data usage of your entire instance.
-
-## View instance-level analytics
-
-Prerequisite:
-
-- You must have administrator access to the instance.
-
-To view instance-level analytics:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Analytics**, then one of the available analytics:
-
- - [DevOps Reports](dev_ops_reports.md): Provides an overview of your entire instance's feature usage.
- - [Usage Trends](usage_trends.md): Shows how much data your instance contains, and how the data is changing.
+<!-- This redirect file can be deleted after <2023-10-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/user/admin_area/analytics/usage_trends.md b/doc/user/admin_area/analytics/usage_trends.md
index 49e82f71a3a..12eb44d6ebc 100644
--- a/doc/user/admin_area/analytics/usage_trends.md
+++ b/doc/user/admin_area/analytics/usage_trends.md
@@ -1,46 +1,11 @@
---
-stage: Plan
-group: Optimize
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+redirect_to: '../../../administration/analytics/usage_trends.md'
+remove_date: '2023-10-07'
---
-# Usage Trends **(FREE SELF)**
+This document was moved to [another location](../../../administration/analytics/usage_trends.md).
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/235754) in GitLab 13.5 behind a feature flag, disabled by default.
-> - [Became enabled by default](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/46962) in GitLab 13.6.
-> - [Renamed](https://gitlab.com/gitlab-org/gitlab/-/issues/285220) from Instance Statistics to Usage Trends in GitLab 13.6.
-> - It's enabled on GitLab.com.
-> - It's recommended for production use.
-
-Usage Trends gives you an overview of how much data your instance contains, and how quickly this volume is changing over time.
-Usage Trends data refreshes daily.
-
-## View Usage Trends
-
-To view Usage Trends:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Analytics > Usage Trends**.
-
-## Total counts
-
-At the top of the page, Usage Trends shows total counts for:
-
-- Users
-- Projects
-- Groups
-- Issues
-- Merge requests
-- Pipelines
-
-These figures can be useful for understanding how much data your instance contains in total.
-
-## Past year trend charts
-
-Usage Trends also displays line charts that show total counts per month, over the past 12 months,
-in the categories shown in [Total counts](#total-counts).
-
-These charts help you visualize how rapidly these records are being created on your instance.
-
-![Instance Activity Pipelines chart](img/instance_activity_pipelines_chart_v13_6_a.png)
+<!-- This redirect file can be deleted after <2023-10-07>. -->
+<!-- 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/admin_area/appearance.md b/doc/user/admin_area/appearance.md
index 99c2a453b07..6a3760bc62d 100644
--- a/doc/user/admin_area/appearance.md
+++ b/doc/user/admin_area/appearance.md
@@ -1,123 +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/product/ux/technical-writing/#assignments
+redirect_to: '../../administration/appearance.md'
+remove_date: '2023-10-07'
---
-# GitLab Appearance **(FREE SELF)**
+This document was moved to [another location](../../administration/appearance.md).
-Several options are available for customizing the appearance of a self-managed instance
-of GitLab. To access these settings:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Appearance**.
-
-## Navigation bar
-
-By default, the navigation bar has the GitLab logo, but this can be customized with
-any image desired. It is optimized for images 28px high (any width), but any image can be
-used (less than 1 MB) and it is automatically resized.
-
-After you select and upload an image, select **Update appearance settings** at the bottom
-of the page to activate it in the GitLab instance.
-
-NOTE:
-GitLab pipeline emails also display the custom logo, unless the logo is in SVG format. If the
-custom logo is in SVG format, the default logo is used instead because the SVG format is not
-supported by many email clients.
-
-## Favicon
-
-By default, the favicon (used by the browser as the tab icon, as well as the CI status icon)
-uses the GitLab logo. This can be customized with any icon desired. It must be a
-32x32 `.png` or `.ico` image.
-
-After you select and upload an icon, select **Update appearance settings** at the bottom
-of the page to activate it in the GitLab instance.
-
-## System header and footer messages
-
-> **Enable header and footer in emails** checkbox [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/344819) in GitLab 15.9.
-
-You can add a small header message, a small footer message, or both, to the interface
-of your GitLab instance. These messages appear on all projects and pages of the
-instance, including the sign in / sign up page. The default color is white text on
-an orange background, but this can be customized by selecting **Customize colors**.
-
-Limited [Markdown](../markdown.md) is supported, such as bold, italics, and links, for
-example. Other Markdown features, including lists, images, and quotes are not supported
-as the header and footer messages can only be a single line.
-
-You can select **Enable header and footer in emails** to have the text of
-the header and footer added to all emails sent by the GitLab instance.
-
-After you add a message, select **Update appearance settings** at the bottom of the page
-to activate it in the GitLab instance.
-
-## Sign in / Sign up pages
-
-You can replace the default message on the sign in / sign up page with your own message
-and logo. You can make full use of [Markdown](../markdown.md) in the description.
-
-The optimal size for the logo is 128 x 128 pixels, but any image can be used (below 1 MB)
-and it is resized automatically. The logo image appears between the title and
-the description, on the left of the sign-up page.
-
-After you add a message, select **Update appearance settings** at the bottom of the page
-to activate it in the GitLab instance. You can also select **Sign-in page**,
-to review the saved appearance settings:
-
-NOTE:
-You can add also add a [customized help message](settings/help_page.md) below the sign in message or add [a Sign in text message](settings/sign_in_restrictions.md#sign-in-information).
-
-## Progressive Web App
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/375708) in GitLab 15.9.
-
-GitLab can be installed as a [Progressive Web App](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps) (PWA).
-Use the Progressive Web App settings to customize its appearance, including its name,
-description, and icon.
-
-### Configure the PWA settings
-
-To configure the PWA settings:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Appearance**.
-1. Scroll to the **Progressive Web App (PWA)** section.
-1. Complete the fields.
- - **Icon**: If you use the standard GitLab icon, it is available in sizes 192x192 pixels,
- 512x512 pixels, also as a maskable icon. If you use a custom icon, it must be in either size
- 192x192 pixels, or 512x512 pixels.
-1. Select **Update appearance settings**.
-
-## New project pages
-
-You can add a new project guidelines message to the **New project page** in GitLab.
-You can make full use of [Markdown](../markdown.md) in the description:
-
-The message is displayed below the **New Project** message, on the left side
-of the **New project page**.
-
-After you add a message, select **Update appearance settings** at the bottom of the page
-to activate it in the GitLab instance. You can also select **New project page**,
-which brings you to the new project page so you can review the change.
-
-## Libravatar
-
-[Libravatar](https://www.libravatar.org) is supported by GitLab for avatar images, but you must
-[manually enable Libravatar support on the GitLab instance](../../administration/libravatar.md) to use the service.
-
-<!-- ## 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, for example `### 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 <2023-10-07>. -->
+<!-- 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/admin_area/broadcast_messages.md b/doc/user/admin_area/broadcast_messages.md
index 6fe82b3ae83..4893b94ce50 100644
--- a/doc/user/admin_area/broadcast_messages.md
+++ b/doc/user/admin_area/broadcast_messages.md
@@ -1,120 +1,11 @@
---
-stage: Growth
-group: Acquisition
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-type: reference, howto
+redirect_to: '../../administration/broadcast_messages.md'
+remove_date: '2023-10-07'
---
-# Broadcast messages **(FREE SELF)**
+This document was moved to [another location](../../administration/broadcast_messages.md).
-> - Target roles [introduced](https://gitlab.com/gitlab-org/growth/team-tasks/-/issues/461) in GitLab 14.8 [with a flag](../../administration/feature_flags.md) named `role_targeted_broadcast_messages`. Disabled by default.
-> - Theme [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83251) and background color removed in GitLab 14.10.
-
-GitLab can display broadcast messages to users of a GitLab instance. There are two types of broadcast messages:
-
-- Banners
-- Notifications
-
-Broadcast messages can be managed using the [broadcast messages API](../../api/broadcast_messages.md).
-
-## Banners
-
-Banners are shown on the top of a page and optionally in the command line as a Git remote response.
-
-![Broadcast Message Banner](img/broadcast_messages_banner_v15_0.png)
-
-```shell
-$ git push
-...
-remote:
-remote: **Welcome** to GitLab :wave:
-remote:
-...
-```
-
-If more than one banner is active at one time, they are displayed at the top of the page in order of creation. In the command line, only the latest banner is shown.
-
-## Notifications
-
-Notifications are shown on the bottom right of a page and can contain placeholders. A placeholder is replaced with an attribute of the active user. Placeholders must be surrounded by curly braces, for example `{{name}}`.
-The available placeholders are:
-
-- `{{email}}`
-- `{{name}}`
-- `{{user_id}}`
-- `{{username}}`
-- `{{instance_id}}`
-
-If the user is not signed in, user related values are empty.
-
-![Broadcast Message Notification](img/broadcast_messages_notification_v12_10.png)
-
-If more than one notification is active at one time, only the newest is shown.
-
-## Add a broadcast message
-
-To display messages to users on your GitLab instance, add a broadcast message.
-
-To add a broadcast message:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Messages**.
-1. Add the text for the message to the **Message** field. You can style a message's content using Markdown, emoji, and the `a` and `br` HTML tags.
- The `br` tag inserts a line break. The `a` HTML tag accepts `class` and `style` attributes with the following CSS properties:
- - `color`
- - `border`
- - `background`
- - `padding`
- - `margin`
- - `text-decoration`
-1. Select a **Theme**. The default theme is `indigo`.
-1. Select the **Dismissable** checkbox to enable users to dismiss the broadcast message.
-1. Optional. Clear the **Git remote responses** checkbox to prevent broadcast messages from being displayed in the command line as Git remote responses.
-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 and time (UTC) for the message to start and end.
-1. Select **Add broadcast message**.
-
-When a broadcast message expires, it no longer displays in the user interface but is still listed in the
-list of broadcast messages.
-
-## Edit a broadcast message
-
-If you must make changes to a broadcast message, you can edit it.
-
-To edit a broadcast message:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Messages**.
-1. From the list of broadcast messages, select the edit button for the message.
-1. After making the required changes, select **Update broadcast message**.
-
-Expired messages can be made active again by changing their end date.
-
-## Delete a broadcast message
-
-If you no longer require a broadcast message, you can delete it.
-You can delete a broadcast message while it's active.
-
-To delete a broadcast message:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Messages**.
-1. From the list of broadcast messages, select the delete button for the message.
-
-When a broadcast message is deleted, it's removed from the list of broadcast messages.
-
-<!-- ## 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, for example `### 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 <2023-10-07>. -->
+<!-- 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/admin_area/credentials_inventory.md b/doc/user/admin_area/credentials_inventory.md
index 9bacd101c48..f38eed5de43 100644
--- a/doc/user/admin_area/credentials_inventory.md
+++ b/doc/user/admin_area/credentials_inventory.md
@@ -1,86 +1,11 @@
---
-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/product/ux/technical-writing/#assignments
-type: howto
+redirect_to: '../../administration/credentials_inventory.md'
+remove_date: '2023-10-07'
---
-# Credentials inventory **(ULTIMATE SELF)**
+This document was moved to [another location](../../administration/credentials_inventory.md).
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20912) in GitLab 12.6.
-> - [Bot-created access tokens not displayed in personal access token list](https://gitlab.com/gitlab-org/gitlab/-/issues/351759) in GitLab 14.9.
-
-GitLab administrators are responsible for the overall security of their instance. To assist, GitLab
-provides a Credentials inventory to keep track of all the credentials that can be used to access
-their self-managed instance.
-
-Use Credentials inventory to see for your GitLab instance all:
-
-- Personal access tokens (PAT).
-- Project access tokens (GitLab 14.8 and later).
-- SSH keys.
-- GPG keys.
-
-You can also [revoke](#revoke-a-users-personal-access-token) and [delete](#delete-a-users-ssh-key) and see:
-
-- Who they belong to.
-- Their access scope.
-- Their usage pattern.
-- When they expire. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/214809) in GitLab 13.2.
-- When they were revoked. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/214809) in GitLab 13.2.
-
-To access the Credentials inventory:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Credentials**.
-
-## Revoke a user's personal access token
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/214811) in GitLab 13.4.
-
-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 | 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.
-
-![Credentials inventory page - Personal access tokens](img/credentials_inventory_personal_access_tokens_v14_9.png)
-
-## Revoke a user's project access token
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/243833) in GitLab 14.8.
-
-The **Revoke** button next to a project access token can be selected to revoke that particular project access token. This both:
-
-- Revokes the token project access token.
-- Enqueues a background worker to delete the project bot user.
-
-![Credentials inventory page - Project access tokens](img/credentials_inventory_project_access_tokens_v14_9.png)
-
-## Delete a user's SSH key
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/225248) in GitLab 13.5.
-
-You can **Delete** a user's SSH key by navigating to the credentials inventory's SSH Keys tab.
-The instance then notifies the user.
-
-![Credentials inventory page - SSH keys](img/credentials_inventory_ssh_keys_v14_9.png)
-
-## Review existing GPG keys
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/282429) in GitLab 13.10.
-> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/292961) in GitLab 13.12.
-
-You can view all existing GPG in your GitLab instance by navigating to the
-credentials inventory GPG Keys tab, as well as the following properties:
-
-- Who the GPG key belongs to.
-- The ID of the GPG key.
-- Whether the GPG key is [verified or unverified](../project/repository/gpg_signed_commits/index.md)
-
-![Credentials inventory page - GPG keys](img/credentials_inventory_gpg_keys_v14_9.png)
+<!-- This redirect file can be deleted after <2023-10-07>. -->
+<!-- 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/admin_area/custom_project_templates.md b/doc/user/admin_area/custom_project_templates.md
index 0e0acf4af57..dc773b0aaca 100644
--- a/doc/user/admin_area/custom_project_templates.md
+++ b/doc/user/admin_area/custom_project_templates.md
@@ -1,73 +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/product/ux/technical-writing/#assignments
+redirect_to: '../../administration/custom_project_templates.md'
+remove_date: '2023-10-10'
---
-# Custom instance-level project templates **(PREMIUM SELF)**
+This document was moved to [another location](../../administration/custom_project_templates.md).
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/6860) in GitLab 11.2.
-
-GitLab administrators can set a group to be the source of project templates that are
-selectable when a new project is created on the instance. These templates can be selected
-when you go to **New project > Create from template** and select the **Instance** tab.
-
-Every project in the group, but not its subgroups, can be selected when a new project
-is created, based on the user's access permissions:
-
-- Public projects can be selected by any authenticated user as a template for a new project,
- if all enabled [project features](../project/settings/index.md#configure-project-visibility-features-and-permissions)
- except for **GitLab Pages** and **Security and Compliance** are set to **Everyone With Access**.
- The same applies to internal projects.
-- Private projects can be selected only by users who are members of the projects.
-
-The **Metrics Dashboard** is set to **Only Project Members** when you create a new project. Make
-sure you change it to **Everyone With Access** before making it a project template.
-
-Repository and database information that are copied over to each new project are
-identical to the data exported with the [GitLab Project Import/Export](../project/settings/import_export.md).
-
-To set project templates at the group level, see [Custom group-level project templates](../group/custom_project_templates.md).
-
-## Select instance-level project template group
-
-To select the group to use as the source for the project templates:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Templates**.
-1. Expand **Custom project templates**.
-1. Select a group to use.
-1. Select **Save changes**.
-
-Projects in subgroups of the template group are **not** included in the template list.
-
-## What is copied from the templates
-
-The entire custom instance-level project templates repository is copied, including:
-
-- Branches
-- Commits
-- Tags
-
-If the user:
-
-- Has the Owner role on the custom instance-level project templates project or is a GitLab administrator, all project settings are copied over to the new
- project.
-- Doesn't have the Owner role or is not a GitLab administrator, project [deploy keys](../project/deploy_keys/index.md#view-deploy-keys) and project
- [webhooks](../project/integrations/webhooks.md) aren't copied over because they contain sensitive data.
-
-To learn more about what is migrated, see
-[Items that are exported](../project/settings/import_export.md#items-that-are-exported).
-
-<!-- ## 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, for example `### 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 <2023-10-10>. -->
+<!-- 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/admin_area/diff_limits.md b/doc/user/admin_area/diff_limits.md
index 72e8269e455..54d7d82af98 100644
--- a/doc/user/admin_area/diff_limits.md
+++ b/doc/user/admin_area/diff_limits.md
@@ -1,53 +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/product/ux/technical-writing/#assignments
-type: reference
+redirect_to: '../../administration/diff_limits.md'
+remove_date: '2023-10-10'
---
-# Diff limits administration **(FREE SELF)**
+This document was moved to [another location](../../administration/diff_limits.md).
-You can set a maximum size for display of diff files (patches).
-
-For details about diff files, [view changes between files](../project/merge_requests/changes.md).
-Read more about the [built-in limits for merge requests and diffs](../../administration/instance_limits.md#merge-requests).
-
-## Configure diff limits
-
-WARNING:
-These settings are experimental. An increased maximum increases resource
-consumption of your instance. Keep this in mind when adjusting the maximum.
-
-To speed the loading time of merge request views and branch comparison views
-on your instance, you can configure three instance-level maximum values for diffs:
-
-| Value | Definition | Default value | Maximum value |
-| ----- | ---------- | :-----------: | :-----------: |
-| **Maximum diff patch size** | The total size, in bytes, of the entire diff. | 200 KB | 500 KB |
-| **Maximum diff files** | The total number of files changed in a diff. | 1000 | 3000 |
-| **Maximum diff lines** | The total number of lines changed in a diff. | 50,000 | 100,000 |
-
-When a diff reaches 10% of any of these values, the files are shown in a
-collapsed view, with a link to expand the diff. Diffs that exceed any of the
-set values are presented as **Too large** are cannot be expanded in the UI.
-
-To configure these values:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand **Diff limits**.
-1. Enter a value for the diff limit.
-1. Select **Save changes**.
-
-<!-- ## 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, for example `### 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 <2023-10-10>. -->
+<!-- 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/admin_area/email_from_gitlab.md b/doc/user/admin_area/email_from_gitlab.md
index fbdfe437719..e5194f05381 100644
--- a/doc/user/admin_area/email_from_gitlab.md
+++ b/doc/user/admin_area/email_from_gitlab.md
@@ -1,61 +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/product/ux/technical-writing/#assignments
-type: howto, reference
+redirect_to: '../../administration/email_from_gitlab.md'
+remove_date: '2023-10-10'
---
-# Email from GitLab **(PREMIUM SELF)**
+This document was moved to [another location](../../administration/email_from_gitlab.md).
-GitLab provides a tool to administrators for emailing all users, or users of
-a chosen group or project, right from the Admin Area. Users receive the email
-at their primary email address.
-
-For information about email notifications originating from GitLab, read
-[GitLab notification emails](../profile/notifications.md).
-
-## Use-cases
-
-- Notify your users about a new project, a new feature, or a new product launch.
-- Notify your users about a new deployment, or that downtime is expected
- for a particular reason.
-
-## Sending emails to users from GitLab
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Overview > Users**.
-1. Select **Send email to users**.
-
- ![administrators](img/email1.png)
-
-1. Compose an email and choose where to send it (all users or users of a
- chosen group or project). The email body only supports plain text messages.
- HTML, Markdown, and other rich text formats are not supported, and is
- sent as plain text to users.
-
- ![compose an email](img/email2.png)
-
-NOTE:
-[Starting with GitLab 13.0](https://gitlab.com/gitlab-org/gitlab/-/issues/31509), email notifications can be sent only once every 10 minutes. This helps minimize performance issues.
-
-## Unsubscribing from emails
-
-Users can choose to unsubscribe from receiving emails from GitLab by following
-the unsubscribe link in the email. Unsubscribing is unauthenticated in order
-to keep this feature simple.
-
-On unsubscribe, users receive an email notification that unsubscribe happened.
-The endpoint that provides the unsubscribe option is rate-limited.
-
-<!-- ## 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, for example `### 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 <2023-10-10>. -->
+<!-- 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/admin_area/external_users.md b/doc/user/admin_area/external_users.md
index a63093deab0..ec28f109384 100644
--- a/doc/user/admin_area/external_users.md
+++ b/doc/user/admin_area/external_users.md
@@ -1,80 +1,11 @@
---
-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/product/ux/technical-writing/#assignments
+redirect_to: '../../administration/external_users.md'
+remove_date: '2023-10-10'
---
-# External users **(FREE SELF)**
+This document was moved to [another location](../../administration/external_users.md).
-In cases where it is desired that a user has access only to some internal or
-private projects, there is the option of creating **External Users**. This
-feature may be useful when for example a contractor is working on a given
-project and should only have access to that project.
-
-External users:
-
-- Cannot create project, groups, and snippets in their personal namespaces.
-- Can only create projects (including forks), subgroups, and snippets within top-level groups to which they are explicitly granted access.
-- Can only access public projects and projects to which they are explicitly granted access,
- thus hiding all other internal or private ones from them (like being
- logged out).
-- Can only access public groups and groups to which they are explicitly granted access,
- thus hiding all other internal or private ones from them (like being
- logged out).
-- Can only access public snippets.
-
-Access can be granted by adding the user as member to the project or group.
-Like usual users, they receive a role in the project or group with all
-the abilities that are mentioned in the [permissions table](../permissions.md#project-members-permissions).
-For example, if an external user is added as Guest, and your project is internal or
-private, they do not have access to the code; you need to grant the external
-user access at the Reporter level or above if you want them to have access to the code. You should
-always take into account the
-[project's visibility and permissions settings](../project/settings/index.md#configure-project-visibility-features-and-permissions)
-as well as the permission level of the user.
-
-NOTE:
-External users still count towards a license seat.
-
-An administrator can flag a user as external by either of the following methods:
-
-- [Through the API](../../api/users.md#user-modification).
-- Using the GitLab UI:
- 1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
- 1. Select **Admin Area**.
- 1. On the left sidebar, select **Overview > Users** to create a new user or edit an existing one.
- There, you can find the option to flag the user as external.
-
-Additionally, users can be set as external users using:
-
-- [SAML groups](../../integration/saml.md#external-groups).
-- [LDAP groups](../../administration/auth/ldap/ldap_synchronization.md#external-groups).
-- the [External providers list](../../integration/omniauth.md#create-an-external-providers-list).
-
-## Set a new user to external
-
-By default, new users are not set as external users. This behavior can be changed
-by an administrator:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand the **Account and limit** section.
-
-If you change the default behavior of creating new users as external, you
-have the option to narrow it down by defining a set of internal users.
-The **Internal users** field allows specifying an email address regex pattern to
-identify default internal users. New users whose email address matches the regex
-pattern are set to internal by default rather than an external collaborator.
-
-The regex pattern format is in Ruby, but it needs to be convertible to JavaScript,
-and the ignore case flag is set (`/regex pattern/i`). Here are some examples:
-
-- Use `\.internal@domain\.com$` to mark email addresses ending with
- `.internal@domain.com` as internal.
-- Use `^(?:(?!\.ext@domain\.com).)*$\r?` to mark users with email addresses
- not including `.ext@domain.com` as internal.
-
-WARNING:
-Be aware that this regex could lead to a
-[regular expression denial of service (ReDoS) attack](https://en.wikipedia.org/wiki/ReDoS).
+<!-- This redirect file can be deleted after <2023-10-10>. -->
+<!-- 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/admin_area/geo_sites.md b/doc/user/admin_area/geo_sites.md
index 3bae90aaec8..cd0f2f5646a 100644
--- a/doc/user/admin_area/geo_sites.md
+++ b/doc/user/admin_area/geo_sites.md
@@ -1,119 +1,11 @@
---
-stage: Systems
-group: Geo
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+redirect_to: '../../administration/geo_sites.md'
+remove_date: '2023-10-10'
---
-# Geo sites Admin Area **(PREMIUM SELF)**
+This document was moved to [another location](../../administration/geo_sites.md).
-You can configure various settings for GitLab Geo sites. For more information, see
-[Geo documentation](../../administration/geo/index.md).
-
-On either the primary or secondary site:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Geo > Sites**.
-
-## Common settings
-
-All Geo sites have the following settings:
-
-| Setting | Description |
-| --------| ----------- |
-| Primary | This marks a Geo site as **primary** site. There can be only one **primary** site. |
-| Name | The unique identifier for the Geo site. It's highly recommended to use a physical location as a name. Good examples are "London Office" or "us-east-1". Avoid words like "primary", "secondary", "Geo", or "DR". This makes the failover process easier because the physical location does not change, but the Geo site role can. All nodes in a single Geo site use the same site name. Nodes use the `gitlab_rails['geo_node_name']` setting in `/etc/gitlab/gitlab.rb` to lookup their Geo site record in the PostgreSQL database. If `gitlab_rails['geo_node_name']` is not set, the node's `external_url` with trailing slash is used as fallback. The value of `Name` is case-sensitive, and most characters are allowed. |
-| URL | The instance's user-facing URL. |
-
-The site you're currently browsing is indicated with a blue `Current` label, and
-the **primary** node is listed first as `Primary site`.
-
-## Secondary site settings
-
-**Secondary** sites have a number of additional settings available:
-
-| Setting | Description |
-|---------------------------|-------------|
-| Selective synchronization | Enable Geo [selective sync](../../administration/geo/replication/configuration.md#selective-synchronization) for this **secondary** site. |
-| Repository sync capacity | Number of concurrent requests this **secondary** site makes to the **primary** site when backfilling repositories. |
-| File sync capacity | Number of concurrent requests this **secondary** site makes to the **primary** site when backfilling files. |
-
-## Geo backfill
-
-**Secondary** sites are notified of changes to repositories and files by the **primary** site,
-and always attempt to synchronize those changes as quickly as possible.
-
-Backfill is the act of populating the **secondary** site with repositories and files that
-existed *before* the **secondary** site was added to the database. Because there may be
-extremely large numbers of repositories and files, it's not feasible to attempt to
-download them all at once; so, GitLab places an upper limit on the concurrency of
-these operations.
-
-How long the backfill takes is dependent on the maximum concurrency, but higher
-values place more strain on the **primary** site. The limits are configurable.
-If your **primary** site has lots of surplus capacity,
-you can increase the values to complete backfill in a shorter time. If it's
-under heavy load and backfill reduces its availability for standard requests,
-you can decrease them.
-
-## Set up the internal URLs
-
-> Setting up internal URLs in secondary sites was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/77179) in GitLab 14.7.
-
-You can set up a different URL for synchronization between the primary and secondary site.
-
-The **primary** site's Internal URL is used by **secondary** sites to contact it
-(to sync repositories, for example). The name Internal URL distinguishes it from
-[External URL](https://docs.gitlab.com/omnibus/settings/configuration.html#configuring-the-external-url-for-gitlab),
-which is used by users. Internal URL does not need to be a private address.
-
-When [Geo secondary proxying](../../administration/geo/secondary_proxy/index.md) is enabled,
-the primary uses the secondary's internal URL to contact it directly.
-
-The internal URL defaults to external URL. To change it:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Geo > Sites**.
-1. Select **Edit** on the site you want to customize.
-1. Edit the internal URL.
-1. Select **Save changes**.
-
-When enabled, the Admin Area for Geo shows replication details for each site directly
-from the primary site's UI, and through the Geo secondary proxy, if enabled.
-
-WARNING:
-We recommend using an HTTPS connection while configuring the Geo sites. To avoid
-breaking communication between **primary** and **secondary** sites when using
-HTTPS, customize your Internal URL to point to a load balancer with TLS
-terminated at the load balancer.
-
-WARNING:
-Starting with GitLab 13.3 and [until 13.11](https://gitlab.com/gitlab-org/gitlab/-/issues/325522),
-if you use an internal URL that is not accessible to the users, the
-OAuth authorization flow does not work properly, because users are redirected
-to the internal URL instead of the external one.
-
-## Multiple secondary sites behind a load balancer
-
-**Secondary** sites can use identical external URLs if
-a unique `name` is set for each Geo site. The `gitlab.rb` setting
-`gitlab_rails['geo_node_name']` must:
-
-- Be set for each GitLab instance that runs `puma`, `sidekiq`, or `geo_logcursor`.
-- Match a Geo site name.
-
-The load balancer must use sticky sessions to avoid authentication
-failures and cross-site request errors.
-
-<!-- ## Troubleshooting
-
-Include any troubleshooting steps that you can foresee. If you know beforehand what issues
-one might have when setting this up, or when something is changed, or on upgrading, it's
-important to describe those, too. Think of things that may go wrong and include them here.
-This is important to minimize requests for support, and to avoid doc comments with
-questions that you know someone might ask.
-
-Each scenario can be a third-level heading, for example `### 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 <2023-10-10>. -->
+<!-- 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/admin_area/index.md b/doc/user/admin_area/index.md
index a59501f14ce..a729cefa7b8 100644
--- a/doc/user/admin_area/index.md
+++ b/doc/user/admin_area/index.md
@@ -1,440 +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/product/ux/technical-writing/#assignments
-type: reference
+redirect_to: '../../administration/admin_area.md'
+remove_date: '2023-10-11'
---
-# GitLab Admin Area **(FREE SELF)**
+This document was moved to [another location](../../administration/admin_area.md).
-The Admin Area provides a web UI to manage and configure features of GitLab
-self-managed instances. If you are an administrator,to access the Admin Area:
-
-- In GitLab 16.1 and later: on the left sidebar, expand the top-most chevron (**{chevron-down}**), then select **Admin Area**.
-- In GitLab 16.0 and earlier: on the top bar, select **Main menu > Admin**.
-
-NOTE:
-Only administrators can access the Admin Area.
-
-## Administering projects
-
-You can administer all projects in the GitLab instance from the Admin Area's Projects page.
-
-To access the Projects page:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Overview > Projects**.
-1. Select the **All**, **Private**, **Internal**, or **Public** tab to list only
- projects of that criteria.
-
-By default, all projects are listed, in reverse order of when they were last updated. For each
-project, the following information is listed:
-
-- Name
-- Namespace
-- Description
-- Size, updated every 15 minutes at most
-
-Projects can be edited or deleted.
-
-To edit a project's name or description:
-
-1. In the Projects overview, next to the project you want to edit, select **Edit**.
-1. Edit the **Project name** or **Project description**.
-1. Select **Save Changes**.
-
-To delete a project:
-
-1. In the Projects overview, next to the project you want to delete, select **Delete**.
-
-The list of projects can be sorted by:
-
-- Updated date
-- Last created
-- Name
-- Most stars
-- Oldest created
-- Oldest updated
-- Largest repository
-
-A user can choose to hide or show archived projects in the list.
-
-In the **Filter by name** field, type the project name you want to find, and GitLab filters
-them as you type.
-
-To filter only projects in that namespace, select from the **Namespace** dropdown list.
-
-You can combine the filter options. For example, to list only public projects with `score` in their name:
-
-1. Select the **Public** tab.
-1. Enter `score` in the **Filter by name...** input box.
-
-## Administering users
-
-You can administer all users in the GitLab instance from the Admin Area's Users page:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Overview > Users**.
-
-To list users matching a specific criteria, select one of the following tabs on the **Users** page:
-
-- **Active**
-- **Admins**
-- **2FA Enabled**
-- **2FA Disabled**
-- **External**
-- **[Blocked](moderate_users.md#block-a-user)**
-- **[Deactivated](moderate_users.md#deactivate-a-user)**
-- **Without projects**
-
-For each user, the following are listed:
-
-1. Username
-1. Email address
-1. Project membership count
-1. Group membership count ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/276215) in GitLab 13.12)
-1. Date of account creation
-1. Date of last activity
-
-To edit a user, in the user's row, select **Edit**. To delete the user, or delete the user and their contributions, select the cog dropdown list in
-that user's row, and select the desired option.
-
-To change the sort order:
-
-1. Select the sort dropdown list.
-1. Select the desired order.
-
-By default the sort dropdown list shows **Name**.
-
-To search for users, enter your criteria in the search field. The user search is case
-insensitive, and applies partial matching to name and username. To search for an email address,
-you must provide the complete email address.
-
-### User impersonation
-
-An administrator can "impersonate" any other user, including other administrators.
-This allows the administrator to "see what the user sees," and take actions on behalf of the user.
-You can impersonate a user in the following ways:
-
-- Through the UI:
- 1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
- 1. Select **Admin Area**.
- 1. On the left sidebar, select **Overview > Users**.
- 1. From the list of users, select a user.
- 1. Select **Impersonate**.
-- With the API, using [impersonation tokens](../../api/rest/index.md#impersonation-tokens).
-
-All impersonation activities are [captured with audit events](../../administration/audit_events.md#user-impersonation).
-
-By default, impersonation is enabled. GitLab can be configured to [disable impersonation](../../api/rest/index.md#disable-impersonation).
-
-![user impersonation button](img/impersonate_user_button_v13_8.png)
-
-### User identities
-
-> The ability to see a user's SCIM identity was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/294608) in GitLab 15.3.
-
-When using authentication providers, administrators can see the identities for a user:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Overview > Users**.
-1. From the list of users, select a user.
-1. Select **Identities**.
-
-This list shows the user's identities, including SCIM identities. Administrators can use this information to troubleshoot SCIM-related issues and confirm
-the identities being used for an account.
-
-### User Permission Export **(PREMIUM SELF)**
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/1772) in GitLab 13.8.
-> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/292436) in GitLab 13.9.
-
-An administrator can export user permissions for all users in the GitLab instance from the Admin Area's Users page.
-The export lists direct membership the users have in groups and projects.
-
-The following data is included in the export:
-
-- Username
-- Email
-- 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).
-
-Only the first 100,000 user accounts are exported.
-
-![user permission export button](img/export_permissions_v13_11.png)
-
-### Users statistics
-
-The **Users statistics** page provides an overview of user accounts by role. These statistics are
-calculated daily, so user changes made since the last update are not reflected.
-
-The following totals are also included:
-
-- Billable users
-- Blocked users
-- Total users
-
-GitLab billing is based on the number of [**Billable users**](../../subscriptions/self_managed/index.md#billable-users).
-
-### Add email to user
-
-You must be an administrator to manually add emails to users:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Overview > Users**.
-1. Locate the user and select them.
-1. Select **Edit**.
-1. In **Email**, enter the new email address. This adds the new email address to the
- user and sets the previous email address to be a secondary.
-1. Select **Save changes**.
-
-## User cohorts
-
-The [Cohorts](user_cohorts.md) tab displays the monthly cohorts of new users and their activities over time.
-
-## Prevent a user from creating groups
-
-By default, users can create groups. To prevent a user from creating a top level group:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Overview > Users**.
-1. Locate the user and select them.
-1. Select **Edit**.
-1. Clear the **Can create group** checkbox.
-1. Select **Save changes**.
-
-It is also possible to [limit which roles can create a subgroup within a group](../group/subgroups/index.md#change-who-can-create-subgroups).
-
-## Administering groups
-
-You can administer all groups in the GitLab instance from the Admin Area's Groups page.
-
-To access the Groups page:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Overview > Groups**.
-
-For each group, the page displays their name, description, size, number of projects in the group,
-number of members, and whether the group is private, internal, or public. To edit a group, in the group's row, select **Edit**. To delete the group, in the group's row, select **Delete**.
-
-To change the sort order, select the sort dropdown list and select the desired order. The default
-sort order is by **Last created**.
-
-To search for groups by name, enter your criteria in the search field. The group search is case
-insensitive, and applies partial matching.
-
-To [Create a new group](../group/index.md#create-a-group) select **New group**.
-
-## Administering topics
-
-- > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/340920) in GitLab 14.4.
-- > Merging topics [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/366884) in GitLab 15.5.
-
-[Topics](../project/working_with_projects.md#explore-topics) are used to categorize and find similar projects.
-
-You can administer all topics in the GitLab instance from the Admin Area's Topics page.
-
-To access the Topics page:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Overview > Topics**.
-
-For each topic, the page displays its name and the number of projects labeled with the topic.
-
-To create a new topic, select **New topic**.
-
-To edit a topic, select **Edit** in that topic's row.
-
-To remove a topic, select **Remove** in that topic's row.
-
-To remove a topic and move all assigned projects to another topic, select **Merge topics**.
-
-To search for topics by name, enter your criteria in the search box. The topic search is case
-insensitive and applies partial matching.
-
-NOTE:
-The assigned topics are visible only to everyone with access to the project,
-but everyone can see which topics exist on the GitLab instance.
-Do not include sensitive information in the name of a topic.
-
-## Administering Gitaly servers
-
-You can list all Gitaly servers in the GitLab instance from the Admin Area's **Gitaly Servers**
-page. For more details, see [Gitaly](../../administration/gitaly/index.md).
-
-To access the **Gitaly Servers** page:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Overview > Gitaly Servers**.
-
-For each Gitaly server, the following details are listed:
-
-| Field | Description |
-|----------------|-------------|
-| Storage | Repository storage |
-| Address | Network address on which the Gitaly server is listening |
-| Server version | Gitaly version |
-| Git version | Version of Git installed on the Gitaly server |
-| Up to date | Indicates if the Gitaly server version is the latest version available. A green dot indicates the server is up to date. |
-
-## CI/CD section
-
-### Administering runners
-
-> [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/340859) from **Overview > Runners** to **CI/CD > Runners** in GitLab 15.8.
-
-You can administer all runners in the GitLab instance from the Admin Area's **Runners** page. See
-[GitLab Runner](https://docs.gitlab.com/runner/) for more information.
-
-To access the **Runners** page:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Overview > Runners**.
-
-#### Search and filter runners
-
-To search runners' descriptions:
-
-1. In the **Search or filter results...** field, type the description of the runner you want to
- find.
-1. Press <kbd>Enter</kbd>.
-
-You can also filter runners by status, type, and tag. To filter:
-
-1. Select a tab or the **Search or filter results...** field.
-1. Select any **Type**, or filter by **Status** or **Tags**.
-1. Select or enter your search criteria.
-
-![Attributes of a runner, with the **Search or filter results...** field active](img/index_runners_search_or_filter_v14_5.png)
-
-#### Bulk delete runners
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/370241) in GitLab 15.4.
-> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/353981) in GitLab 15.5.
-
-You can delete multiple runners at the same time.
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Overview > Runners**.
-1. To the left of the runners you want to delete, select the checkbox.
- To select all of the runners on the page, select the checkbox above
- the list.
-1. Select **Delete selected**.
-
-#### Runner attributes
-
-For each runner, the following attributes are listed:
-
-| Attribute | Description |
-|--------------|-------------|
-| Status | The status of the runner. In [GitLab 15.1 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/22224), for the **Ultimate** tier, the upgrade status is available. |
-| Runner details | Information about the runner, including partial token and details about the computer the runner was registered from. |
-| Version | GitLab Runner version. |
-| Jobs | Total number of jobs run by the runner. |
-| Tags | Tags associated with the runner. |
-| Last contact | Timestamp indicating when the runner last contacted the GitLab instance. |
-
-You can also edit, pause, or remove each runner.
-
-### Administering Jobs
-
-> [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/386311) from **Overview > Jobs** to **CI/CD > Jobs** in GitLab 15.8.
-
-You can administer all jobs in the GitLab instance from the Admin Area's Jobs page.
-
-To access the Jobs page:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **CI/CD > Jobs**. All jobs are listed, in descending order of job ID.
-1. Select the **All** tab to list all jobs. Select the **Pending**, **Running**, or **Finished**
- tab to list only jobs of that status.
-
-For each job, the following details are listed:
-
-| Field | Description |
-|----------|-------------|
-| Status | Job status, either **passed**, **skipped**, or **failed**. |
-| Job | Includes links to the job, branch, and the commit that started the job. |
-| Pipeline | Includes a link to the specific pipeline. |
-| Project | Name of the project, and organization, to which the job belongs. |
-| Runner | Name of the CI runner assigned to execute the job. |
-| Stage | Stage that the job is declared in a `.gitlab-ci.yml` file. |
-| Name | Name of the job specified in a `.gitlab-ci.yml` file. |
-| Timing | Duration of the job, and how long ago the job completed. |
-| Coverage | Percentage of tests coverage. |
-
-## Monitoring section
-
-The following topics document the **Monitoring** section of the Admin Area.
-
-### System Information
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/341248) in GitLab 15.2, support for relative time. "Uptime" statistic was renamed to "System started".
-
-The **System Info** page provides the following statistics:
-
-| Field | Description |
-|:---------------|:--------------------------------------------------|
-| CPU | Number of CPU cores available |
-| Memory Usage | Memory in use, and total memory available |
-| Disk Usage | Disk space in use, and total disk space available |
-| System started | When the system hosting GitLab was started. In GitLab 15.1 and earlier, this was an uptime statistic. |
-
-These statistics are updated only when you navigate to the **System Info** page, or you refresh the page in your browser.
-
-### Background Jobs
-
-The **Background Jobs** page displays the Sidekiq dashboard. Sidekiq is used by GitLab to
-perform processing in the background.
-
-The Sidekiq dashboard consists of the following elements:
-
-- A tab per jobs' status.
-- A breakdown of background job statistics.
-- A live graph of **Processed** and **Failed** jobs, with a selectable polling interval.
-- An historical graph of **Processed** and **Failed** jobs, with a selectable time span.
-- Redis statistics, including:
- - Version number
- - Uptime, measured in days
- - Number of connections
- - Current memory usage, measured in MB
- - Peak memory usage, measured in MB
-
-### Logs
-
-Since GitLab 13.0, **Log** view has been removed from the Admin Area dashboard since the logging does not work in multi-node setups and could cause confusion for administrators by displaying partial information.
-
-For multi-node systems we recommend ingesting the logs into services like Elasticsearch and Splunk.
-
-| Log file | Contents |
-|:------------------------|:---------|
-| `application_json.log` | GitLab user activity |
-| `git_json.log` | Failed GitLab interaction with Git repositories |
-| `production.log` | Requests received from Puma, and the actions taken to serve those requests |
-| `sidekiq.log` | Background jobs |
-| `repocheck.log` | Repository activity |
-| `integrations_json.log` | Activity between GitLab and integrated systems |
-| `kubernetes.log` | Kubernetes activity |
-
-The contents of these log files can be useful when troubleshooting a problem.
-
-For details of these log files and their contents, see [Log system](../../administration/logs/index.md).
-
-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.
-
-### 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.
+<!-- This redirect file can be deleted after <2023-10-11>. -->
+<!-- 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/admin_area/labels.md b/doc/user/admin_area/labels.md
index 16721d144e5..724c9885801 100644
--- a/doc/user/admin_area/labels.md
+++ b/doc/user/admin_area/labels.md
@@ -1,28 +1,11 @@
---
-stage: Plan
-group: Project Management
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-type: reference
+redirect_to: '../../administration/labels.md'
+remove_date: '2023-10-05'
---
-# Labels administration **(FREE SELF)**
+This document was moved to [another location](../../administration/labels.md).
-To manage labels for the GitLab instance, select **Labels** (**{labels}**) from the Admin Area sidebar. For more details on how to manage labels, see [Labels](../project/labels.md).
-
-Labels created in the Admin Area are automatically added to new projects.
-They are not available to new groups.
-Updating or adding labels in the Admin Area does not modify labels in existing projects.
-
-![Default label set](img/admin_labels_v14_7.png)
-
-<!-- ## 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, for example `### 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 <2023-10-05>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/admin_area/license.md b/doc/user/admin_area/license.md
index be6478de2a0..636f5cb2831 100644
--- a/doc/user/admin_area/license.md
+++ b/doc/user/admin_area/license.md
@@ -1,83 +1,11 @@
---
-stage: Fulfillment
-group: Provision
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+redirect_to: '../../administration/license.md'
+remove_date: '2023-10-11'
---
-# Activate GitLab Enterprise Edition (EE) **(PREMIUM SELF)**
+This document was moved to [another location](../../administration/license.md).
-When you install a new GitLab instance without a license, only Free features
-are enabled. To enable more features in GitLab Enterprise Edition (EE), activate
-your instance with an activation code.
-
-## Activate GitLab EE
-
-In GitLab Enterprise Edition 14.1 and later, you need an activation code to activate
-your instance.
-
-Prerequisite:
-
-- You must [purchase a subscription](https://about.gitlab.com/pricing/).
-- You must be running GitLab Enterprise Edition (EE).
-- You must have GitLab 14.1 or later.
-- Your instance must be connected to the internet.
-
-To activate your instance with an activation code:
-
-1. Copy the activation code, a 24-character alphanumeric string, from either:
- - Your subscription confirmation email.
- - The [Customers Portal](https://customers.gitlab.com/customers/sign_in), on the **Manage Purchases** page.
-1. Sign in to your GitLab self-managed instance.
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Subscription**.
-1. Paste the activation code in **Activation code**.
-1. Read and accept the terms of service.
-1. Select **Activate**.
-
-The subscription is activated.
-
-If you have an offline environment,
-[activate GitLab EE with a license file or key](license_file.md) instead.
-
-If you have questions or need assistance activating your instance,
-[contact GitLab Support](https://about.gitlab.com/support/#contact-support).
-
-When [the license expires](license_file.md#what-happens-when-your-license-expires),
-some functionality is locked.
-
-## Verify your GitLab edition
-
-To verify the edition, sign in to GitLab and select
-**Help** (**{question-o}**) > **Help**. The GitLab edition and version are listed
-at the top of the page.
-
-If you are running GitLab Community Edition, you can upgrade your installation to GitLab
-EE. For more details, see [Upgrading between editions](../../update/index.md#upgrading-between-editions).
-If you have questions or need assistance upgrading from GitLab Community Edition (CE) to EE,
-[contact GitLab Support](https://about.gitlab.com/support/#contact-support).
-
-## Troubleshooting
-
-### Cannot activate instance due to connectivity error
-
-This error occurs when you use an activation code to activate your instance, but your instance is unable to connect to the GitLab servers.
-
-You may have connectivity issues due to the following reasons:
-
-- **You have an offline environment**:
- - Configure your setup to allow connection to GitLab servers. If connection to GitLab servers is not possible, contact your Sales Representative to request a license key. You can also contact [GitLab support](https://about.gitlab.com/support/#contact-support) if you need help finding your Sales Representative.
-- **Customers Portal is not operational**:
- - To check for performance or service disruptions, check the Customers Portal [status](https://status.gitlab.com/).
-- **Firewall settings**:
- - Check if your GitLab instance has an encrypted connection to `customers.gitlab.com` (with IP addresses 172.64.146.11 and 104.18.41.245) on port 443:
-
- ```shell
- curl --verbose "https://customers.gitlab.com/"
- ```
-
- - If the curl command returns a failure, either:
- - [Configure a proxy](https://docs.gitlab.com/omnibus/settings/environment-variables.html) in `gitlab.rb` to point to your server.
- - Contact your network administrator to make changes to the proxy.
- - If an SSL inspection appliance is used, you must add the appliance's root CA certificate to `/etc/gitlab/trusted-certs` on the server, then run `gitlab-ctl reconfigure`.
- \ No newline at end of file
+<!-- This redirect file can be deleted after <2023-10-11>. -->
+<!-- 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/admin_area/license_file.md b/doc/user/admin_area/license_file.md
index 12e908b4fe0..4835d656cfa 100644
--- a/doc/user/admin_area/license_file.md
+++ b/doc/user/admin_area/license_file.md
@@ -1,252 +1,11 @@
---
-stage: Fulfillment
-group: Provision
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+redirect_to: '../../administration/license_file.md'
+remove_date: '2023-10-11'
---
-<!-- To promote the workflow described in license.md, this page is not included in global left nav. -->
+This document was moved to [another location](../../administration/license_file.md).
-# Activate GitLab EE with a license file or key
-
-If you receive a license file from GitLab (for example, for a trial), you can
-upload it to your instance or add it during installation. The license file is
-a base64-encoded ASCII text file with a `.gitlab-license` extension.
-
-The first time you sign in to your GitLab instance, a note with a
-link to the **Add license** page should be displayed.
-
-Otherwise, to add your license:
-
-1. Sign in to GitLab as an administrator.
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-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**.
-
-NOTE:
-In GitLab 14.7.x to 14.9.x, you can add the license file with the UI.
-In GitLab 14.1.x to 14.7, if you have already activated your subscription with an activation code, you cannot access **Add License** from the Admin Area. You must access **Add License** directly from the URL, `<YourGitLabURL>/admin/license/new`.
-
-## Activate subscription during installation
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/114572) in GitLab 16.0.
-
-To activate your subscription during installation, set the `GITLAB_ACTIVATION_CODE` environment variable with the activation code:
-
-```shell
-export GITLAB_ACTIVATION_CODE=your_activation_code
-```
-
-## Add license file during installation
-
-If you have a license, you can also import it when you install GitLab.
-
-- For self-compiled installations:
- - Place the `Gitlab.gitlab-license` file in the `config/` directory.
- - To specify a custom location and filename for the license, set the
- `GITLAB_LICENSE_FILE` environment variable with the path to the file:
-
- ```shell
- export GITLAB_LICENSE_FILE="/path/to/license/file"
- ```
-
-- For Linux package installations:
- - Place the `Gitlab.gitlab-license` file in the `/etc/gitlab/` directory.
- - To specify a custom location and filename for the license, add this entry to `gitlab.rb`:
-
- ```ruby
- gitlab_rails['initial_license_file'] = "/path/to/license/file"
- ```
-
-WARNING:
-These methods only add a license at the time of installation. To renew or upgrade
-a license, add the license in the **Admin Area** in the web user interface.
-
-## Submit license usage data
-
-If you use a license file or key to activate your instance in an offline environment, you must submit your license
-usage data monthly.
-To submit the data, [export your license usage](../../subscriptions/self_managed/index.md#export-your-license-usage)
-and send it by email to the renewals service, `renewals-service@customers.gitlab.com`.
-
-If you don't submit your data each month after your subscription start date, an email is sent to the address
-associated with your subscription and a banner displays to remind you to submit your data. The banner displays
-in the **Admin Area** on the **Dashboard** and on the **Subscription** pages. You can only dismiss it until the
-following month after you submit your license usage data.
-
-## What happens when your license expires
-
-Fifteen days before the license expires, a notification banner with the upcoming expiration
-date displays to GitLab administrators.
-
-When your license expires, GitLab locks features, like Git pushes
-and issue creation. Your instance becomes read-only and
-an expiration message displays to all administrators. You have a 14-day grace period
-before this occurs.
-
-To resume functionality, [renew your subscription](../../subscriptions/self_managed/index.md#renew-subscription-manually).
-
-If the license has been expired for more than 30 days, you must purchase a [new subscription](../../subscriptions/self_managed/index.md) to resume functionality.
-
-To go back to Free features, [delete all expired licenses](#remove-a-license).
-
-## Remove a license
-
-To remove a license from a self-managed instance:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Subscription**.
-1. Select **Remove license**.
-
-Repeat these steps to remove all licenses, including those applied in the past.
-
-## View license details and history
-
-To view your license details:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Subscription**.
-
-You can add and view more than one license, but only the latest license in
-the current date range is the active license.
-
-When you add a future-dated license, it doesn't take effect until its applicable date.
-You can view all active subscriptions in the **Subscription history** table.
-
-You can also [export](../../subscriptions/self_managed/index.md) your license usage information to a CSV file.
-
-NOTE:
-In GitLab 13.6 and earlier, a banner about an expiring license may continue to display
-when you add a new license. This happens when the start date of the new license
-is in the future and the expiring one is still active.
-The banner disappears after the new license becomes active.
-
-## Troubleshooting
-
-### No Subscription area in the Admin Area
-
-You cannot add your license because there is no **Subscription** area.
-This issue might occur if:
-
-- You're running GitLab Community Edition. Before you add your license, you
- must [upgrade to Enterprise Edition](../../update/index.md#community-to-enterprise-edition).
-- You're using GitLab.com. You cannot add a self-managed license to GitLab.com.
- To use paid features on GitLab.com, [purchase a separate subscription](../../subscriptions/gitlab_com/index.md).
-
-### Users exceed license limit upon renewal
-
-GitLab displays a message prompting you to purchase
-additional users. This issue occurs if you add a license that does not have enough
-users to cover the number of users in your instance.
-
-To fix this issue, purchase additional seats to cover those users.
-For more information, read the [licensing FAQ](https://about.gitlab.com/pricing/licensing-faq/).
-
-In GitLab 14.2 and later, for instances that use a license file, the following
-rules apply:
-
-- If the users over license are less than or equal to 10% of the users in the license
- file, the license is applied and you pay the overage in the next renewal.
-- If the users over license are more than 10% of the users in the license file,
- you cannot apply the license without purchasing more users.
-
-For example, if you purchase a license for 100 users, you can have 110 users when you add
-your license. However, if you have 111 users, you must purchase more users before you can add
-the license.
-
-### `Start GitLab Ultimate trial` still displays after adding license
-
-To fix this issue, restart [Puma or your entire GitLab instance](../../administration/restart_gitlab.md).
-
-### License commands in the rails console
-
-The following commands can be run in the [rails console](../../administration/operations/rails_console.md#starting-a-rails-console-session).
-
-WARNING:
-Any command that changes data directly could be damaging if not run correctly, or under the right conditions.
-We highly recommend running them in a test environment with a backup of the instance ready to be restored, just in case.
-
-#### See current license information
-
-```ruby
-# License information (name, company, email address)
-License.current.licensee
-
-# Plan:
-License.current.plan
-
-# Uploaded:
-License.current.created_at
-
-# Started:
-License.current.starts_at
-
-# Expires at:
-License.current.expires_at
-
-# Is this a trial license?
-License.current.trial?
-
-# License ID for lookup on CustomersDot
-License.current.license_id
-
-# License data in Base64-encoded ASCII format
-License.current.data
-
-# Confirm the current billable seat count excluding guest users. This is useful for customers who use an Ultimate subscription tier where Guest seats are not counted.
-User.active.without_bots.excluding_guests.count
-
-```
-
-#### Interaction with licenses that start in the future
-
-```ruby
-# Future license data follows the same format as current license data it just uses a different modifier for the License prefix
-License.future_dated
-```
-
-#### Check if a project feature is available on the instance
-
-Features listed in [`features.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/app/models/gitlab_subscriptions/features.rb).
-
-```ruby
-License.current.feature_available?(:jira_dev_panel_integration)
-```
-
-#### Check if a project feature is available in a project
-
-Features listed in [`features.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/app/models/gitlab_subscriptions/features.rb).
-
-```ruby
-p = Project.find_by_full_path('<group>/<project>')
-p.feature_available?(:jira_dev_panel_integration)
-```
-
-#### Add a license through the console
-
-```ruby
-key = "<key>"
-license = License.new(data: key)
-license.save
-License.current # check to make sure it applied
-```
-
-This is needed for example in a known edge-case with
-[expired license and multiple LDAP servers](../../administration/auth/ldap/ldap-troubleshooting.md#expired-license-causes-errors-with-multiple-ldap-servers).
-
-#### Remove licenses
-
-To clean up the [License History table](../../user/admin_area/license_file.md#view-license-details-and-history):
-
-```ruby
-TYPE = :trial?
-# or :expired?
-
-License.select(&TYPE).each(&:destroy!)
-
-# or even License.all.each(&:destroy!)
-```
+<!-- This redirect file can be deleted after <2023-10-11>. -->
+<!-- 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/admin_area/merge_requests_approvals.md b/doc/user/admin_area/merge_requests_approvals.md
index 58f54c399df..de079d08d3a 100644
--- a/doc/user/admin_area/merge_requests_approvals.md
+++ b/doc/user/admin_area/merge_requests_approvals.md
@@ -1,43 +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/product/ux/technical-writing/#assignments
-type: reference, concepts
+redirect_to: '../../administration/merge_requests_approvals.md'
+remove_date: '2023-10-12'
---
-# Merge request approvals **(PREMIUM SELF)**
+This document was moved to [another location](../../administration/merge_requests_approvals.md).
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/39060) in GitLab 12.8.
-
-Merge request approval rules prevent users from overriding certain settings on the project level.
-When enabled at the instance level, these settings [cascade](../project/merge_requests/approvals/settings.md#settings-cascading)
-and can no longer be changed:
-
-- In projects.
-- In groups. Cascading to groups was [enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/285410)
- in GitLab 14.5.
-
-To enable merge request approval settings for an instance:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Push Rules**.
-1. Expand **Merge request approvals**.
-1. Choose the required options.
-1. Select **Save changes**.
-
-## Available rules
-
-Merge request approval settings that can be set at an instance level are:
-
-- **Prevent approval by author**. Prevents project maintainers from allowing request authors to
- merge their own merge requests.
-- **Prevent approvals by users who add commits**. Prevents project maintainers from allowing users
- to approve merge requests if they have submitted any commits to the source branch.
-- **Prevent editing approval rules in projects and merge requests**. Prevents users from modifying
- the approvers list in project settings or in individual merge requests.
-
-See also the following, which are affected by instance-level rules:
-
-- [Project merge request approval rules](../project/merge_requests/approvals/index.md).
-- [Group merge request approval settings](../group/manage.md#group-merge-request-approval-settings) available in GitLab 13.9 and later.
+<!-- This redirect file can be deleted after <2023-10-12>. -->
+<!-- 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/admin_area/moderate_users.md b/doc/user/admin_area/moderate_users.md
index ee6d360ac1d..3390c4791be 100644
--- a/doc/user/admin_area/moderate_users.md
+++ b/doc/user/admin_area/moderate_users.md
@@ -1,360 +1,11 @@
---
-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/product/ux/technical-writing/#assignments
-type: howto
+redirect_to: '../../administration/moderate_users.md'
+remove_date: '2023-10-12'
---
-# Moderate users (administration) **(FREE SELF)**
+This document was moved to [another location](../../administration/moderate_users.md).
-This is the administration documentation. For information about moderating users at the group level, see the [group-level documentation](../group/moderate_users.md).
-
-GitLab administrators can moderate user access by approving, blocking, banning, or deactivating
-users.
-
-## Users pending approval
-
-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 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-common-settings)
-- [Block auto-created users (LDAP)](../../administration/auth/ldap/index.md#basic-configuration-settings)
-
-When a user registers for an account while this setting is enabled:
-
-- The user is placed in a **Pending approval** state.
-- The user sees a message telling them their account is awaiting approval by an administrator.
-
-A user pending approval:
-
-- Is functionally identical to a [blocked](#block-a-user) user.
-- Cannot sign in.
-- Cannot access Git repositories or the GitLab API.
-- Does not receive any notifications from GitLab.
-- Does not consume a [seat](../../subscriptions/self_managed/index.md#billable-users).
-
-An administrator must [approve their sign up](#approve-or-reject-a-user-sign-up) to allow them to
-sign in.
-
-### View user sign ups pending approval
-
-To view user sign ups pending approval:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Overview > Users**.
-1. Select the **Pending approval** tab.
-
-### Approve or reject a user sign up
-
-A user sign up pending approval can be approved or rejected from the Admin Area.
-
-To approve or reject a user sign up:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Overview > Users**.
-1. Select the **Pending approval** tab.
-1. Optional. Select a user.
-1. Select the **{settings}** **User administration** dropdown list.
-1. Select **Approve** or **Reject**.
-
-Approving a user:
-
-- Activates their account.
-- Changes the user's state to active.
-- Consumes a subscription [seat](../../subscriptions/self_managed/index.md#billable-users).
-
-## Block and unblock users
-
-GitLab administrators can block and unblock users.
-
-### Block a user
-
-To completely prevent access of a user to the GitLab instance,
-administrators can choose to block the user.
-
-Users can be blocked [via an abuse report](review_abuse_reports.md#blocking-users),
-by removing them in LDAP, or directly from the Admin Area. To do this:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Overview > Users**.
-1. Optional. Select a user.
-1. Select the **{settings}** **User administration** dropdown list.
-1. Select **Block**.
-
-A blocked user:
-
-- Cannot sign in.
-- Cannot access Git repositories or the API.
-- Does not receive any notifications from GitLab.
-- Cannot use [slash commands](../../integration/slash_commands.md).
-- Does not consume a [seat](../../subscriptions/self_managed/index.md#billable-users).
-
-Personal projects, and group and user history of the blocked user are left intact.
-
-NOTE:
-Users can also be blocked using the [GitLab API](../../api/users.md#block-user).
-
-### Unblock a user
-
-A blocked user can be unblocked from the Admin Area. To do this:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Overview > Users**.
-1. Select the **Blocked** tab.
-1. Optional. Select a user.
-1. Select the **{settings}** **User administration** dropdown list.
-1. Select **Unblock**.
-
-The user's state is set to active and they consume a
-[seat](../../subscriptions/self_managed/index.md#billable-users).
-
-NOTE:
-Users can also be unblocked using the [GitLab API](../../api/users.md#unblock-user).
-
-The unblock option may be unavailable for LDAP users. To enable the unblock option,
-the LDAP identity first needs to be deleted:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Overview > Users**.
-1. Select the **Blocked** tab.
-1. Select a user.
-1. Select the **Identities** tab.
-1. Find the LDAP provider and select **Delete**.
-
-## Activate and deactivate users
-
-GitLab administrators can deactivate and activate users.
-
-### Deactivate a user
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/22257) in GitLab 12.4.
-
-To temporarily prevent access by a GitLab user that has no recent activity,
-administrators can choose to deactivate the user.
-
-Deactivating a user is functionally identical to [blocking a user](#block-and-unblock-users),
-with the following differences:
-
-- It does not prohibit the user from logging back in via the UI.
-- Once a deactivated user logs back into the GitLab UI, their account is set to active.
-
-A deactivated user:
-
-- Cannot access Git repositories or the API.
-- Does not receive any notifications from GitLab.
-- Cannot use [slash commands](../../integration/slash_commands.md).
-- Does not consume a [seat](../../subscriptions/self_managed/index.md#billable-users).
-
-Personal projects, and group and user history of the deactivated user are left intact.
-
-NOTE:
-Users are notified about account deactivation if
-[user deactivation emails](settings/email.md#user-deactivation-emails) are enabled.
-
-A user can be deactivated from the Admin Area. To do this:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Overview > Users**.
-1. Optional. Select a user.
-1. Select the **{settings}** **User administration** dropdown list.
-1. Select **Deactivate**.
-
-For the deactivation option to be visible to an administrator, the user:
-
-- Must have a state of active.
-- Must be [dormant](#automatically-deactivate-dormant-users).
-
-NOTE:
-Users can also be deactivated using the [GitLab API](../../api/users.md#deactivate-user).
-
-### Automatically deactivate dormant users
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/320875) in GitLab 14.0.
-> - Customizable time period [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/336747) in GitLab 15.4
-> - The lower limit for inactive period set to 90 days [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/100793) in GitLab 15.5
-
-Administrators can enable automatic deactivation of users who either:
-
-- Were created more than a week ago and have not signed in.
-- Have no activity for a specified period of time (default and minimum is 90 days).
-
-To do this:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand the **Account and limit** section.
-1. Under **Dormant users**, check **Deactivate dormant users after a period of inactivity**.
-1. Under **Days of inactivity before deactivation**, enter the number of days before deactivation. Minimum value is 90 days.
-1. Select **Save changes**.
-
-When this feature is enabled, GitLab runs a job once a day to deactivate the dormant users.
-
-A maximum of 100,000 users can be deactivated per day.
-
-### Activate a user
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/22257) in GitLab 12.4.
-
-A deactivated user can be activated from the Admin Area.
-
-To do this:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Overview > Users**.
-1. Select the **Deactivated** tab.
-1. Optional. Select a user.
-1. Select the **{settings}** **User administration** dropdown list.
-1. Select **Activate**.
-
-The user's state is set to active and they consume a
-[seat](../../subscriptions/self_managed/index.md#billable-users).
-
-NOTE:
-A deactivated user can also activate their account themselves by logging back in via the UI.
-Users can also be activated using the [GitLab API](../../api/users.md#activate-user).
-
-## Ban and unban users
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/327353) in GitLab 14.2 [with a flag](../../administration/feature_flags.md) named `ban_user_feature_flag`. Disabled by default.
-> - Ban and unban users [generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/327353) in GitLab 14.8. Feature flag `ban_user_feature_flag` removed.
-> - Hiding merge requests of banned users [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107836) in GitLab 15.8 [with a flag](../../administration/feature_flags.md) named `hide_merge_requests_from_banned_users`. Disabled by default.
-> - Hiding comments of banned users [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/112973) in GitLab 15.11 [with a flag](../../administration/feature_flags.md) named `hidden_notes`. Disabled by default.
-
-GitLab administrators can ban and unban users. Banned users are blocked, and their issues, merge requests, and comments are hidden.
-
-### Ban a user
-
-To block a user and hide their contributions, administrators can ban the user.
-
-Users can be banned using the Admin Area. To do this:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Overview > Users**.
-1. Optional. Select a user.
-1. Select the **{settings}** **User administration** dropdown list.
-1. Select **Ban user**.
-
-The banned user does not consume a [seat](../../subscriptions/self_managed/index.md#billable-users).
-
-### Unban a user
-
-A banned user can be unbanned using the Admin Area. To do this:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Overview > Users**.
-1. Select the **Banned** tab.
-1. Optional. Select a user.
-1. Select the **{settings}** **User administration** dropdown list.
-1. Select **Unban user**.
-
-The user's state is set to active and they consume a
-[seat](../../subscriptions/self_managed/index.md#billable-users).
-
-### Delete a user
-
-Use the Admin Area to delete users.
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Overview > Users**.
-1. Select the **Banned** tab.
-1. Optional. Select a user.
-1. Select the **{settings}** **User administration** dropdown list.
-1. Select **Delete user**.
-1. Type the username.
-1. Select **Delete user**.
-
-NOTE:
-You can only delete a user if there are inherited or direct owners of a group. You cannot delete a user if they are the only group owner.
-
-You can also delete a user and their contributions, such as merge requests, issues, and groups of which they are the only group owner.
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Overview > Users**.
-1. Select the **Banned** tab.
-1. Optional. Select a user.
-1. Select the **{settings}** **User administration** dropdown list.
-1. Select **Delete user and contributions**.
-1. Type the username.
-1. Select **Delete user and contributions**.
-
-NOTE:
-Before 15.1, additionally groups of which deleted user were the only owner among direct members were deleted.
-
-## Troubleshooting
-
-When moderating users, you may need to perform bulk actions on them based on certain conditions. The following rails console scripts show some examples of this. You may [start a rails console session](../../administration/operations/rails_console.md#starting-a-rails-console-session) and use scripts similar to the following:
-
-### Deactivate users that have no recent activity
-
-Administrators can deactivate users that have no recent activity.
-
-WARNING:
-Commands that change data can cause damage if not run correctly or under the right conditions. Always run commands in a test environment first and have a backup instance ready to restore.
-
-```ruby
-days_inactive = 90
-inactive_users = User.active.where("last_activity_on <= ?", days_inactive.days.ago)
-
-inactive_users.each do |user|
- puts "user '#{user.username}': #{user.last_activity_on}"
- user.deactivate!
-end
-```
-
-### Block users that have no recent activity
-
-Administrators can block users that have no recent activity.
-
-WARNING:
-Commands that change data can cause damage if not run correctly or under the right conditions. Always run commands in a test environment first and have a backup instance ready to restore.
-
-```ruby
-days_inactive = 90
-inactive_users = User.active.where("last_activity_on <= ?", days_inactive.days.ago)
-
-inactive_users.each do |user|
- puts "user '#{user.username}': #{user.last_activity_on}"
- user.block!
-end
-```
-
-### Block or delete users that have no projects or groups
-
-Administrators can block or delete users that have no projects or groups.
-
-WARNING:
-Commands that change data can cause damage if not run correctly or under the right conditions. Always run commands in a test environment first and have a backup instance ready to restore.
-
-```ruby
-users = User.where('id NOT IN (select distinct(user_id) from project_authorizations)')
-
-# How many users are removed?
-users.count
-
-# If that count looks sane:
-
-# You can either block the users:
-users.each { |user| user.blocked? ? nil : user.block! }
-
-# Or you can delete them:
- # need 'current user' (your user) for auditing purposes
-current_user = User.find_by(username: '<your username>')
-
-users.each do |user|
- DeleteUserWorker.perform_async(current_user.id, user.id)
-end
-```
+<!-- This redirect file can be deleted after <2023-10-12>. -->
+<!-- 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/admin_area/monitoring/health_check.md b/doc/user/admin_area/monitoring/health_check.md
index f3b09c61532..bda326d4daf 100644
--- a/doc/user/admin_area/monitoring/health_check.md
+++ b/doc/user/admin_area/monitoring/health_check.md
@@ -1,146 +1,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/product/ux/technical-writing/#assignments
+redirect_to: '../../../administration/monitoring/health_check.md'
+remove_date: '2023-10-12'
---
-# Health Check **(FREE SELF)**
+This document was moved to [another location](../../../administration/monitoring/health_check.md).
-GitLab provides liveness and readiness probes to indicate service health and
-reachability to required services. These probes report on the status of the
-database connection, Redis connection, and access to the file system. These
-endpoints [can be provided to schedulers like Kubernetes](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/) to hold
-traffic until the system is ready or restart the container as needed.
-
-## IP allowlist
-
-To access monitoring resources, the requesting client IP needs to be included in the allowlist.
-For details, see [how to add IPs to the allowlist for the monitoring endpoints](../../../administration/monitoring/ip_allowlist.md).
-
-## Using the endpoints locally
-
-With default allowlist settings, the probes can be accessed from localhost using the following URLs:
-
-```plaintext
-GET http://localhost/-/health
-```
-
-```plaintext
-GET http://localhost/-/readiness
-```
-
-```plaintext
-GET http://localhost/-/liveness
-```
-
-## Health
-
-Checks whether the application server is running.
-It does not verify the database or other services
-are running. This endpoint circumvents Rails Controllers
-and is implemented as additional middleware `BasicHealthCheck`
-very early into the request processing lifecycle.
-
-```plaintext
-GET /-/health
-```
-
-Example request:
-
-```shell
-curl "https://gitlab.example.com/-/health"
-```
-
-Example response:
-
-```plaintext
-GitLab OK
-```
-
-## Readiness
-
-The readiness probe checks whether the GitLab instance is ready
-to accept traffic via Rails Controllers. The check by default
-does validate only instance-checks.
-
-If the `all=1` parameter is specified, the check also validates
-the dependent services (Database, Redis, Gitaly etc.)
-and gives a status for each.
-
-```plaintext
-GET /-/readiness
-GET /-/readiness?all=1
-```
-
-Example request:
-
-```shell
-curl "https://gitlab.example.com/-/readiness"
-```
-
-Example response:
-
-```json
-{
- "master_check":[{
- "status":"failed",
- "message": "unexpected Master check result: false"
- }],
- ...
-}
-```
-
-On failure, the endpoint returns a `503` HTTP status code.
-
-This check is being exempt from Rack Attack.
-
-## Liveness
-
-WARNING:
-In GitLab [12.4](https://about.gitlab.com/upcoming-releases/)
-the response body of the Liveness check was changed
-to match the example below.
-
-Checks whether the application server is running.
-This probe is used to know if Rails Controllers
-are not deadlocked due to a multi-threading.
-
-```plaintext
-GET /-/liveness
-```
-
-Example request:
-
-```shell
-curl "https://gitlab.example.com/-/liveness"
-```
-
-Example response:
-
-On success, the endpoint returns a `200` HTTP status code, and a response like below.
-
-```json
-{
- "status": "ok"
-}
-```
-
-On failure, the endpoint returns a `503` HTTP status code.
-
-This check is being exempt from Rack Attack.
-
-## Sidekiq
-
-Learn how to configure the [Sidekiq health checks](../../../administration/sidekiq/sidekiq_health_check.md).
-
-<!-- ## 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, for example `### 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 <2023-10-12>. -->
+<!-- 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/admin_area/reporting/git_abuse_rate_limit.md b/doc/user/admin_area/reporting/git_abuse_rate_limit.md
index 38aaeb8eb55..0e607b03b82 100644
--- a/doc/user/admin_area/reporting/git_abuse_rate_limit.md
+++ b/doc/user/admin_area/reporting/git_abuse_rate_limit.md
@@ -1,49 +1,11 @@
---
-stage: Anti-Abuse
-group: Anti-Abuse
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+redirect_to: '../../../administration/reporting/git_abuse_rate_limit.md'
+remove_date: '2023-10-12'
---
-# Git abuse rate limit (administration) **(ULTIMATE SELF)**
+This document was moved to [another location](../../../administration/reporting/git_abuse_rate_limit.md).
-> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/8066) in GitLab 15.2 [with a flag](../../../administration/feature_flags.md) named `git_abuse_rate_limit_feature_flag`. Disabled by default.
-> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/394996) in GitLab 15.11. Feature flag `git_abuse_rate_limit_feature_flag` removed.
-
-This is the administration documentation. For information about Git abuse rate limiting at the group level, see the [group-level documentation](../../group/reporting/git_abuse_rate_limit.md).
-
-Git abuse rate limiting is a feature to automatically [ban users](../moderate_users.md#ban-and-unban-users) who download, clone, or fork more than a specified number of repositories in any project in the instance in a given time frame. Banned users cannot sign in to the instance and cannot access any non-public group via HTTP or SSH. The rate limit also applies to users who authenticate with a [personal](../../../user/profile/personal_access_tokens.md) or [group access token](../../../user/group/settings/group_access_tokens.md).
-
-Git abuse rate limiting does not apply to instance administrators, [deploy tokens](../../../user/project/deploy_tokens/index.md), or [deploy keys](../../../user/project/deploy_keys/index.md).
-
-How GitLab determines a user's rate limit is under development.
-GitLab team members can view more information in this confidential epic:
-`https://gitlab.com/groups/gitlab-org/modelops/anti-abuse/-/epics/14`.
-
-## Configure Git abuse rate limiting
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Reporting**.
-1. Expand **Git abuse rate limit**.
-1. Update the Git abuse rate limit settings:
- 1. Enter a number in the **Number of repositories** field, greater than or equal to `0` and less than or equal to `10,000`. This number specifies the maximum amount of unique repositories a user can download in the specified time period before they're banned. When set to `0`, Git abuse rate limiting is disabled.
- 1. Enter a number in the **Reporting time period (seconds)** field, greater than or equal to `0` and less than or equal to `86,400` (10 days). This number specifies the time in seconds a user can download the maximum amount of repositories before they're banned. When set to `0`, Git abuse rate limiting is disabled.
- 1. Optional. Exclude up to `100` users by adding them to the **Excluded users** field. Excluded users are not automatically banned.
- 1. Add up to `100` users to the **Send notifications to** field. You must select at least one user. All application administrators are selected by default.
- 1. Optional. Turn on the **Automatically ban users from this namespace when they exceed the specified limits** toggle to enable automatic banning.
-1. Select **Save changes**.
-
-## Automatic ban notifications
-
-If automatic banning is disabled, a user is not banned automatically when they exceed the limit. However, notifications are still sent to the users listed under **Send notifications to**. You can use this setup to determine the correct values of the rate limit settings before enabling automatic banning.
-
-If automatic banning is enabled, an email notification is sent when a user is about to be banned, and the user is automatically banned from the GitLab instance.
-
-## Unban a user
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Overview > Users**.
-1. Select the **Banned** tab and search for the account you want to unban.
-1. From the **User administration** dropdown list select **Unban user**.
-1. On the confirmation dialog, select **Unban user**.
+<!-- This redirect file can be deleted after <2023-10-12>. -->
+<!-- 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/admin_area/reporting/ip_addr_restrictions.md b/doc/user/admin_area/reporting/ip_addr_restrictions.md
index 5b749c62c30..85783640b28 100644
--- a/doc/user/admin_area/reporting/ip_addr_restrictions.md
+++ b/doc/user/admin_area/reporting/ip_addr_restrictions.md
@@ -1,33 +1,11 @@
---
-stage: Anti-Abuse
-group: Anti-Abuse
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+redirect_to: '../../../administration/reporting/ip_addr_restrictions.md'
+remove_date: '2023-10-13'
---
-# IP address restrictions **(FREE SELF)**
+This document was moved to [another location](../../../administration/reporting/ip_addr_restrictions.md).
-IP address restrictions help prevent malicious users hiding their activities behind multiple IP addresses.
-
-GitLab maintains a list of the unique IP addresses used by a user to make requests over a specified period. When the
-specified limit is reached, any requests made by the user from a new IP address are rejected with a `403 Forbidden` error.
-
-IP addresses are cleared from the list when no further requests have been made by the user from the IP address in the specified time period.
-
-NOTE:
-When a runner runs a CI/CD job as a particular user, the runner IP address is also stored against the user's list of
-unique IP addresses. Therefore, the IP addresses per user limit should take into account the number of configured active runners.
-
-## Configure IP address restrictions
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Reporting**.
-1. Expand **Spam and Anti-bot Protection**.
-1. Update the IP address restrictions settings:
- 1. Select the **Limit sign in from multiple IP addresses** checkbox to enable IP address restrictions.
- 1. Enter a number in the **IP addresses per user** field, greater than or equal to `1`. This number specifies the
- maximum number of unique IP addresses a user can access GitLab from in the specified time period before requests
- from a new IP address are rejected.
- 1. Enter a number in the **IP address expiration time** field, greater than or equal to `0`. This number specifies the
- time in seconds an IP address counts towards the limit for a user, taken from the time the last request was made.
-1. Select **Save changes**.
+<!-- This redirect file can be deleted after <2023-10-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/user/admin_area/reporting/spamcheck.md b/doc/user/admin_area/reporting/spamcheck.md
index e2508476c80..043481b6255 100644
--- a/doc/user/admin_area/reporting/spamcheck.md
+++ b/doc/user/admin_area/reporting/spamcheck.md
@@ -1,69 +1,11 @@
---
-stage: Systems
-group: Distribution
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+redirect_to: '../../../administration/reporting/spamcheck.md'
+remove_date: '2023-10-13'
---
-# Spamcheck anti-spam service **(FREE SELF)**
+This document was moved to [another location](../../../administration/reporting/spamcheck.md).
-> [Introduced](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/6259) in GitLab 14.8.
-
-WARNING:
-Spamcheck is available to all tiers, but only on instances using GitLab Enterprise Edition (EE). For [licensing reasons](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/6259#note_726605397), it is not included in the GitLab Community Edition (CE) package. You can [migrate from CE to EE](../../../update/package/convert_to_ee.md).
-
-[Spamcheck](https://gitlab.com/gitlab-org/spamcheck) is an anti-spam engine
-developed by GitLab originally to combat rising amount of spam in GitLab.com,
-and later made public to be used in self-managed GitLab instances.
-
-## Enable Spamcheck
-
-Spamcheck is only available for package-based installations:
-
-1. Edit `/etc/gitlab/gitlab.rb` and enable Spamcheck:
-
- ```ruby
- spamcheck['enable'] = true
- ```
-
-1. Reconfigure GitLab:
-
- ```shell
- sudo gitlab-ctl reconfigure
- ```
-
-1. Verify that the new services `spamcheck` and `spam-classifier` are
- up and running:
-
- ```shell
- sudo gitlab-ctl status
- ```
-
-## Configure GitLab to use Spamcheck
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Reporting**.
-1. Expand **Spam and Anti-bot Protection**.
-1. Update the Spam Check settings:
- 1. Check the "Enable Spam Check via external API endpoint" checkbox.
- 1. For **URL of the external Spam Check endpoint** use `grpc://localhost:8001`.
- 1. Leave **Spam Check API key** blank.
-1. Select **Save changes**.
-
-NOTE:
-In single-node instances, Spamcheck runs over `localhost`, and hence is running
-in an unauthenticated mode. If on multi-node instances where GitLab runs on one
-server and Spamcheck runs on another server listening over a public endpoint, it
-is recommended to enforce some sort of authentication using a reverse proxy in
-front of the Spamcheck service that can be used along with an API key. One
-example would be to use `JWT` authentication for this and specifying a bearer
-token as the API key.
-[Native authentication for Spamcheck is in the works](https://gitlab.com/gitlab-com/gl-security/engineering-and-research/automation-team/spam/spamcheck/-/issues/171).
-
-## Running Spamcheck over TLS
-
-Spamcheck service on its own cannot 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 Area settings.
+<!-- This redirect file can be deleted after <2023-10-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/user/admin_area/review_abuse_reports.md b/doc/user/admin_area/review_abuse_reports.md
index 5cd63ec964c..0e01025896e 100644
--- a/doc/user/admin_area/review_abuse_reports.md
+++ b/doc/user/admin_area/review_abuse_reports.md
@@ -1,96 +1,11 @@
---
-stage: Anti-Abuse
-group: Anti-Abuse
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-type: reference, howto
+redirect_to: '../../administration/review_abuse_reports.md'
+remove_date: '2023-10-11'
---
-# Review abuse reports **(FREE SELF)**
+This document was moved to [another location](../../administration/review_abuse_reports.md).
-View and resolve abuse reports from GitLab users.
-
-GitLab administrators can view and [resolve](#resolving-abuse-reports) abuse
-reports in the Admin Area.
-
-## Receive notification of abuse reports by email
-
-To receive notifications of new abuse reports by email:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Reporting**.
-1. Expand the **Abuse reports** section.
-1. Provide an email address and select **Save changes**.
-
-The notification email address can also be set and retrieved
-[using the API](../../api/settings.md#list-of-settings-that-can-be-accessed-via-api-calls).
-
-## Reporting abuse
-
-To find out more about reporting abuse, see
-[abuse reports user documentation](../report_abuse.md).
-
-## Resolving abuse reports
-
-To access abuse reports:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Abuse Reports**.
-
-There are 3 ways to resolve an abuse report, with a button for each method:
-
-- Remove user & report. This:
- - [Deletes the reported user](../profile/account/delete_account.md) from the
- instance.
- - Removes the abuse report from the list.
-- [Block user](#blocking-users).
-- Remove report. This:
- - Removes the abuse report from the list.
- - Removes access restrictions for the reported user.
-
-The following is an example of the **Abuse Reports** page:
-
-![abuse-reports-page-image](img/abuse_reports_page_v13_11.png)
-
-### Blocking users
-
-A blocked user cannot sign in or access any repositories, but all of their data
-remains.
-
-Blocking a user:
-
-- Leaves them in the abuse report list.
-- Changes the **Block user** button to a disabled **Already blocked** button.
-
-The user is notified with the following message:
-
-```plaintext
-Your account has been blocked. If you believe this is in error, contact a staff member.
-```
-
-After blocking, you can still either:
-
-- Remove the user and report if necessary.
-- Remove the report.
-
-The following is an example of a blocked user listed on the **Abuse Reports**
-page:
-
-![abuse-report-blocked-user-image](img/abuse_report_blocked_user.png)
-
-NOTE:
-Users can be [blocked](../../api/users.md#block-user) and
-[unblocked](../../api/users.md#unblock-user) using the GitLab API.
-
-<!-- ## 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, for example `### 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 <2023-10-11>. -->
+<!-- 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/admin_area/settings/account_and_limit_settings.md b/doc/user/admin_area/settings/account_and_limit_settings.md
index 293decc438e..2deed61388b 100644
--- a/doc/user/admin_area/settings/account_and_limit_settings.md
+++ b/doc/user/admin_area/settings/account_and_limit_settings.md
@@ -1,399 +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/product/ux/technical-writing/#assignments"
-type: reference
+redirect_to: '../../../administration/settings/account_and_limit_settings.md'
+remove_date: '2023-10-12'
---
-# Account and limit settings **(FREE SELF)**
+This document was moved to [another location](../../../administration/settings/account_and_limit_settings.md).
-## Default projects limit
-
-You can configure the default maximum number of projects new users can create in their
-personal namespace. This limit affects only new user accounts created after you change
-the setting. This setting is not retroactive for existing users, but you can separately edit
-the [project limits for existing users](#projects-limit-for-a-user).
-
-To configure the maximum number of projects in personal namespaces for new users:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Network**.
-1. Expand **Account and limit**.
-1. Increase or decrease that **Default projects limit** value.
-
-If you set **Default projects limit** to 0, users are not allowed to create projects
-in their users personal namespace. However, projects can still be created in a group.
-
-### Projects limit for a user
-
-You can edit a specific user, and change the maximum number of projects this user
-can create in their personal namespace:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Overview** > **Users**.
-1. From the list of users, select a user.
-1. Select **Edit**.
-1. Increase or decrease the **Projects limit** value.
-
-## Max attachment size
-
-> [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/20061) from 10 MB to 100 MB in GitLab 15.7.
-
-The maximum file size for attachments in GitLab comments and replies is 100 MB.
-To change the maximum attachment size:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Network**.
-1. Expand **Account and limit**.
-1. Increase or decrease by changing the value in **Maximum attachment size (MB)**.
-
-If you choose a size larger than the configured value for the web server,
-you may receive errors. Read the [troubleshooting section](#troubleshooting) for more
-details.
-
-For GitLab.com repository size limits, read [accounts and limit settings](../../gitlab_com/index.md#account-and-limit-settings).
-
-## Max push size
-
-You can change the maximum push size for your instance:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Network**.
-1. Expand **Account and limit**.
-1. Increase or decrease by changing the value in **Maximum push size (MB)**.
-
-For GitLab.com push size limits, read [accounts and limit settings](../../gitlab_com/index.md#account-and-limit-settings).
-
-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,
-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 left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**, then expand **Account and limit**.
-1. Increase or decrease by changing the value in **Maximum export size (MB)**.
-
-## Max import size
-
-> [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:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Network**.
-1. Expand **Account and limit**.
-1. Increase or decrease by changing the value in **Maximum import size (MB)**.
-
-This setting applies only to repositories
-[imported from a GitLab export file](../../project/settings/import_export.md#import-a-project-and-its-data).
-
-If you choose a size larger than the configured value for the web server,
-you may receive errors. See the [troubleshooting section](#troubleshooting) for more
-details.
-
-For GitLab.com repository size limits, read [accounts and limit settings](../../gitlab_com/index.md#account-and-limit-settings).
-
-## Personal access token prefix
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20968) in GitLab 13.7.
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/342327) in GitLab 14.5, a default prefix.
-
-You can specify a prefix for personal access tokens. You might use a prefix
-to find tokens more quickly, or for use with automation tools.
-
-The default prefix is `glpat-` but administrators can change it.
-
-[Project access tokens](../../project/settings/project_access_tokens.md) and
-[group access tokens](../../group/settings/group_access_tokens.md) also inherit this prefix.
-
-### Set a prefix
-
-To change the default global prefix:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand the **Account and limit** section.
-1. Fill in the **Personal Access Token prefix** field.
-1. Select **Save changes**.
-
-You can also configure the prefix by using the
-[settings API](../../../api/settings.md).
-
-## Repository size limit **(PREMIUM SELF)**
-
-Repositories in your GitLab instance can grow quickly, especially if you are
-using LFS. Their size can grow exponentially, rapidly consuming available storage.
-To prevent this from happening, you can set a hard limit for your repositories' size.
-This limit can be set globally, per group, or per project, with per project limits
-taking the highest priority.
-
-There are numerous use cases where you might set up a limit for repository size.
-For instance, consider the following workflow:
-
-1. Your team develops apps which require large files to be stored in
- the application repository.
-1. Although you have enabled [Git LFS](../../../topics/git/lfs/index.md#git-large-file-storage-lfs)
- to your project, your storage has grown significantly.
-1. Before you exceed available storage, you set up a limit of 10 GB
- per repository.
-
-NOTE:
-For GitLab.com repository size limits, read [accounts and limit settings](../../gitlab_com/index.md#account-and-limit-settings).
-
-### How it works
-
-Only a GitLab administrator can set those limits. Setting the limit to `0` means
-there are no restrictions.
-
-These settings can be found in:
-
-- Each project's settings:
- 1. From the Project's homepage, navigate to **Settings > General**.
- 1. Fill in the **Repository size limit (MB)** field in the **Naming, topics, avatar** section.
- 1. Select **Save changes**.
-- Each group's settings:
- 1. From the Group's homepage, navigate to **Settings > General**.
- 1. Fill in the **Repository size limit (MB)** field in the **Naming, visibility** section.
- 1. Select **Save changes**.
-- GitLab global settings:
- 1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
- 1. Select **Admin Area**.
- 1. Select **Settings > General**.
- 1. Expand the **Account and limit** section.
- 1. Fill in the **Size limit per repository (MB)** field.
- 1. Select **Save changes**.
-
-The first push of a new project, including LFS objects, is checked for size.
-If the sum of their sizes exceeds the maximum allowed repository size, the push
-is rejected.
-
-NOTE:
-The repository size limit includes repository files and LFS, but does not include artifacts, uploads,
-wiki, packages, or snippets. The repository size limit applies to both private and public projects.
-
-For details on manually purging files, see [reducing the repository size using Git](../../project/repository/reducing_the_repo_size_using_git.md).
-
-## Session duration
-
-### Customize the default session duration
-
-You can change how long users can remain signed in without activity.
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand **Account and limit**. The set duration is in **Session duration (minutes)**.
-
-If [Remember me](#turn-remember-me-on-or-off) is enabled, users' sessions can remain active for an indefinite period of time.
-
-For details, see [cookies used for sign-in](../../profile/index.md#cookies-used-for-sign-in).
-
-### Turn **Remember me** on or off
-
-> Ability to turn the **Remember me** setting on and off [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/369133) in GitLab 16.0.
-
-Users can select the **Remember me** checkbox on sign-in, and their session will remain active for an indefinite period of time when accessed from that specific browser. You can turn off this setting if you need sessions to expire for security or compliance purposes. Turning off this setting will ensure users' sessions expire after the number of minutes of inactivity set when you [customize your session duration](#customize-the-default-session-duration).
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand **Account and limit**.
-1. Select or clear the **Remember me** checkbox to turn this setting on or off.
-
-### 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.
-> - It's deployed behind a feature flag, 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 `two_factor_for_cli`. On GitLab.com, this feature is not available. This feature is not ready for production use. This feature flag also affects [2FA for Git over SSH operations](../../../security/two_factor_authentication.md#2fa-for-git-over-ssh-operations).
-
-GitLab administrators can choose to customize the session duration (in minutes) for Git operations when 2FA is enabled. The default is 15 and this can be set to a value between 1 and 10080.
-
-To set a limit on how long these sessions are valid:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand the **Account and limit** section.
-1. Fill in the **Session duration for Git operations when 2FA is enabled (minutes)** field.
-1. Select **Save changes**.
-
-## Limit the lifetime of SSH keys **(ULTIMATE SELF)**
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/1007) in GitLab 14.6 [with a flag](../../../administration/feature_flags.md) named `ff_limit_ssh_key_lifetime`. Disabled by default.
-> - [Enabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/346753) in GitLab 14.6.
-> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/1007) in GitLab 14.7. [Feature flag `ff_limit_ssh_key_lifetime`](https://gitlab.com/gitlab-org/gitlab/-/issues/347408) removed.
-
-Users can optionally specify a lifetime for
-[SSH keys](../../ssh.md).
-This lifetime is not a requirement, and can be set to any arbitrary number of days.
-
-SSH keys are user credentials to access GitLab.
-However, organizations with security requirements may want to enforce more protection by
-requiring the regular rotation of these keys.
-
-### Set a lifetime
-
-Only a GitLab administrator can set a lifetime. Leaving it empty means
-there are no restrictions.
-
-To set a lifetime on how long SSH keys are valid:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand the **Account and limit** section.
-1. Fill in the **Maximum allowable lifetime for SSH keys (days)** field.
-1. Select **Save changes**.
-
-Once a lifetime for SSH keys is set, GitLab:
-
-- Requires users to set an expiration date that is no later than the allowed lifetime on new
- SSH keys.
-- Applies the lifetime restriction to existing SSH keys. Keys with no expiry or a lifetime
- greater than the maximum immediately become invalid.
-
-NOTE:
-When a user's SSH key becomes invalid they can delete and re-add the same key again.
-
-## 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
-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.
-
-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.
-
-### Set a lifetime
-
-Only a GitLab administrator can set a lifetime. Leaving it empty means
-there are no restrictions.
-
-To set a lifetime on how long access tokens are valid:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand the **Account and limit** section.
-1. Fill in the **Maximum allowable lifetime for access tokens (days)** field.
-1. Select **Save changes**.
-
-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.
-- After three hours, revoke old tokens with no expiration date or with a lifetime longer than the
- allowed lifetime. Three hours is given to allow administrators to change the allowed lifetime,
- or remove it, before revocation takes place.
-
-## Disable user profile name changes **(PREMIUM SELF)**
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/24605) in GitLab 12.7.
-
-To maintain integrity of user details in [Audit Events](../../../administration/audit_events.md), GitLab administrators can choose to disable a user's ability to change their profile name.
-
-To do this:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Network**.
-1. Expand **Account and limit**.
-1. Select the **Prevent users from changing their profile name** checkbox.
-
-NOTE:
-When this ability is disabled, GitLab administrators can still use the
-[Admin Area](../index.md#administering-users) or the
-[API](../../../api/users.md#user-modification) to update usernames.
-
-## Prevent new users from creating top-level groups
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/367754) in GitLab 15.5.
-
-By default, new users can create top-level groups. GitLab administrators can prevent new users from creating top-level groups:
-
-- In GitLab 15.5 and later, using either:
- - The GitLab UI using the steps in this section.
- - The [application setting API](../../../api/settings.md#change-application-settings).
-- In GitLab 15.4 and earlier, a [configuration file](../../../administration/user_settings.md#use-configuration-files-to-prevent-new-users-from-creating-top-level-groups).
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Network**.
-1. Expand **Account and limit**.
-1. Clear the **Allow new users to create top-level groups** checkbox.
-
-## Set profiles of new users to private by default
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/231301) in GitLab 15.8.
-
-By default, newly created users have a public profile. GitLab administrators can set new users to have a private profile by default:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Network**.
-1. Expand **Account and limit**.
-1. Select the **Make new users' profiles private by default** checkbox.
-
-## Prevent users from deleting their accounts **(PREMIUM SELF)**
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/26053) in GitLab 16.1 [with a flag](../../../administration/feature_flags.md) named `deleting_account_disabled_for_users`. Enabled by default.
-
-By default, users can delete their own accounts. GitLab administrators can prevent
-users from deleting their own accounts:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Network**.
-1. Expand **Account and limit**.
-1. Clear the **Allows users to delete their own accounts** checkbox.
-
-## 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
-[Linux package](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/index.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 repository size](../../project/repository/reducing_the_repo_size_using_git.md).
+<!-- This redirect file can be deleted after <2023-10-12>. -->
+<!-- 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/admin_area/settings/continuous_integration.md b/doc/user/admin_area/settings/continuous_integration.md
index 853a299cdec..72cf369146e 100644
--- a/doc/user/admin_area/settings/continuous_integration.md
+++ b/doc/user/admin_area/settings/continuous_integration.md
@@ -1,429 +1,11 @@
---
-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/product/ux/technical-writing/#assignments
-type: reference
+redirect_to: '../../../administration/settings/continuous_integration.md'
+remove_date: '2023-10-13'
---
-# Continuous Integration and Deployment Admin Area settings **(FREE SELF)**
+This document was moved to [another location](../../../administration/settings/continuous_integration.md).
-The [Admin Area](index.md) has the instance settings for Auto DevOps, runners, and
-job artifacts.
-
-## Auto DevOps
-
-To enable (or disable) [Auto DevOps](../../../topics/autodevops/index.md)
-for all projects:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > CI/CD**.
-1. Check (or uncheck to disable) the box that says **Default to Auto DevOps pipeline for all projects**.
-1. Optionally, set up the [Auto DevOps base domain](../../../topics/autodevops/requirements.md#auto-devops-base-domain)
- which is used for Auto Deploy and Auto Review Apps.
-1. Select **Save changes** for the changes to take effect.
-
-From now on, every existing project and newly created ones that don't have a
-`.gitlab-ci.yml` use the Auto DevOps pipelines.
-
-If you want to disable it for a specific project, you can do so in
-[its settings](../../../topics/autodevops/index.md#enable-or-disable-auto-devops).
-
-## Enable shared runners for new projects
-
-You can set all new projects to have the instance's shared runners available by default.
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > CI/CD**.
-1. Expand **Continuous Integration and Deployment**.
-1. Select the **Enable shared runners for new projects** checkbox.
-
-Any time a new project is created, the shared runners are available.
-
-## Shared runners compute quota
-
-As an administrator you can set either a global or namespace-specific
-limit on the number of [units of compute](../../../ci/pipelines/cicd_minutes.md) you can use.
-
-## Enable a project runner for multiple projects
-
-If you have already registered a [project runner](../../../ci/runners/runners_scope.md#project-runners)
-you can assign that runner to other projects.
-
-To enable a project runner for more than one project:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. From the left sidebar, select **CI/CD > Runners**.
-1. Select the runner you want to edit.
-1. In the upper-right corner, select **Edit** (**{pencil}**).
-1. Under **Restrict projects for this runner**, search for a project.
-1. To the left of the project, select **Enable**.
-1. Repeat this process for each additional project.
-
-## Add a message for shared runners
-
-To display details about the instance's shared runners in all projects'
-runner settings:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > CI/CD**.
-1. Expand **Continuous Integration and Deployment**.
-1. Enter text, including Markdown if you want, in the **Shared runner details** field. For example:
-
- ![Shared runner details input](img/continuous_integration_shared_runner_details_input_v14_10.png)
-
-To view the rendered details:
-
-1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project or group.
-1. Select **Settings > CI/CD**.
-1. Expand **Runners**.
-
-![Shared runner details example](img/continuous_integration_shared_runner_details_v14_10.png)
-
-## Maximum artifacts size
-
-The maximum size of the [job artifacts](../../../administration/job_artifacts.md)
-can be set at:
-
-- The instance level.
-- [From GitLab 12.4](https://gitlab.com/gitlab-org/gitlab/-/issues/21688), the project and group level.
-
-For the setting on GitLab.com, see [Artifacts maximum size](../../gitlab_com/index.md#gitlab-cicd).
-
-The value is in MB and the default is 100 MB per job. To change it at the:
-
-- Instance level:
-
- 1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
- 1. Select **Admin Area**.
- 1. On the left sidebar, select **Settings > CI/CD > Continuous Integration and Deployment**.
- 1. Change the value of **Maximum artifacts size (MB)**.
- 1. Select **Save changes** for the changes to take effect.
-
-- Group level (this overrides the instance setting):
-
- 1. Go to the group's **Settings > CI/CD > General Pipelines**.
- 1. Change the value of **Maximum artifacts size** (in MB).
- 1. Select **Save changes** for the changes to take effect.
-
-- Project level (this overrides the instance and group settings):
-
- 1. Go to the project's **Settings > CI/CD > General Pipelines**.
- 1. Change the value of **maximum artifacts size** (in MB).
- 1. Select **Save changes** for the changes to take effect.
-
-NOTE:
-The setting at all levels is only available to GitLab administrators.
-
-## Default artifacts expiration
-
-The default expiration time of the [job artifacts](../../../administration/job_artifacts.md)
-can be set in the Admin Area of your GitLab instance. The syntax of duration is
-described in [`artifacts:expire_in`](../../../ci/yaml/index.md#artifactsexpire_in)
-and the default value is `30 days`.
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > CI/CD**.
-1. Change the value of default expiration time.
-1. Select **Save changes** for the changes to take effect.
-
-This setting is set per job and can be overridden in
-[`.gitlab-ci.yml`](../../../ci/yaml/index.md#artifactsexpire_in).
-To disable the expiration, set it to `0`. The default unit is in seconds.
-
-NOTE:
-Any changes to this setting applies to new artifacts only. The expiration time is not
-be updated for artifacts created before this setting was changed.
-The administrator may need to manually search for and expire previously-created
-artifacts, as described in the [troubleshooting documentation](../../../administration/job_artifacts.md#delete-job-artifacts-from-jobs-completed-before-a-specific-date).
-
-## Keep the latest artifacts for all jobs in the latest successful pipelines
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/50889) in GitLab 13.9.
-
-When enabled (default), the artifacts of the most recent pipeline for each Git ref
-([branches and tags](https://git-scm.com/book/en/v2/Git-Internals-Git-References))
-are locked against deletion and kept regardless of the expiry time.
-
-When disabled, the latest artifacts for any **new** successful or fixed pipelines
-are allowed to expire.
-
-This setting takes precedence over the [project level setting](../../../ci/jobs/job_artifacts.md#keep-artifacts-from-most-recent-successful-jobs).
-If disabled at the instance level, you cannot enable this per-project.
-
-To disable the setting:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > CI/CD**.
-1. Expand **Continuous Integration and Deployment**.
-1. Clear the **Keep the latest artifacts for all jobs in the latest successful pipelines** checkbox.
-1. Select **Save changes**
-
-When you disable the feature, the latest artifacts do not immediately expire.
-A new pipeline must run before the latest artifacts can expire and be deleted.
-
-NOTE:
-All application settings have a [customizable cache expiry interval](../../../administration/application_settings_cache.md) which can delay the settings affect.
-
-## Archive jobs
-
-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.
-
-To set the duration for which the jobs are considered as old and expired:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > CI/CD**.
-1. Expand the **Continuous Integration and Deployment** section.
-1. Set the value of **Archive jobs**.
-1. Select **Save changes** for the changes to take effect.
-
-After that time passes, the jobs are archived in the background and no longer able to be
-retried. Make it empty to never expire jobs. It has to be no less than 1 day,
-for example: <code>15 days</code>, <code>1 month</code>, <code>2 years</code>.
-
-For the value set for GitLab.com, see [Scheduled job archiving](../../gitlab_com/index.md#gitlab-cicd).
-
-## 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:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > CI/CD**.
-1. Select **Protect CI/CD variables by default**.
-
-## Maximum includes
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/207270) in GitLab 16.0.
-
-The maximum number of [includes](../../../ci/yaml/includes.md) per pipeline can be set at the instance level.
-The default is `150`.
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > CI/CD**.
-1. Change the value of **Maximum includes**.
-1. Select **Save changes** for the changes to take effect.
-
-## Default CI/CD configuration file
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18073) in GitLab 12.5.
-
-The default CI/CD configuration file and path for new projects can be set in the Admin Area
-of your GitLab instance (`.gitlab-ci.yml` if not set):
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > CI/CD**.
-1. Input the new file and path in the **Default CI/CD configuration file** field.
-1. Select **Save changes** for the changes to take effect.
-
-It is also possible to specify a [custom CI/CD configuration file for a specific project](../../../ci/pipelines/settings.md#specify-a-custom-cicd-configuration-file).
-
-## Set CI/CD limits
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/352175) in GitLab 14.10.
-
-You can configure some [CI/CD limits](../../../administration/instance_limits.md#cicd-limits)
-from the Admin Area:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > CI/CD**.
-1. Expand the **Continuous Integration and Deployment** section.
-1. In the **CI/CD limits** section, you can set the following limits:
- - **Maximum number of jobs in a single pipeline**
- - **Total number of jobs in currently active pipelines**
- - **Maximum number of active pipelines per project**
- - **Maximum number of pipeline subscriptions to and from a project**
- - **Maximum number of pipeline schedules**
- - **Maximum number of DAG dependencies that a job can have**
- - **Maximum number of runners registered per group**
- - **Maximum number of runners registered per project**
- - **Maximum number of downstream pipelines in a pipeline's hierarchy tree**
-
-## Enable or disable the pipeline suggestion banner
-
-By default, a banner displays in merge requests with no pipeline suggesting a
-walkthrough on how to add one.
-
-![Suggest pipeline banner](img/suggest_pipeline_banner_v14_5.png)
-
-To enable or disable the banner:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > CI/CD**.
-1. Select or clear the **Enable pipeline suggestion banner** checkbox.
-1. Select **Save changes**.
-
-## Required pipeline configuration **(ULTIMATE SELF)**
-
-> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/352316) from GitLab Premium to GitLab Ultimate in 15.0.
-> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/389467) in GitLab 15.9.
-
-WARNING:
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/389467) in GitLab 15.9
-and is planned for removal in 17.0. Use [compliance pipelines](../../group/compliance_frameworks.md#compliance-pipelines)
-instead. This change is a breaking change.
-
-You can set a [CI/CD template](../../../ci/examples/index.md#cicd-templates)
-as a required pipeline configuration for all projects on a GitLab instance. You can
-use a template from:
-
-- The default CI/CD templates.
-- A custom template stored in an [instance template repository](instance_template_repository.md).
-
- NOTE:
- When you use a configuration defined in an instance template repository,
- nested [`include:`](../../../ci/yaml/index.md#include) keywords
- (including `include:file`, `include:local`, `include:remote`, and `include:template`)
- [do not work](https://gitlab.com/gitlab-org/gitlab/-/issues/35345).
-
-The project CI/CD configuration merges into the required pipeline configuration when
-a pipeline runs. The merged configuration is the same as if the required pipeline configuration
-added the project configuration with the [`include` keyword](../../../ci/yaml/index.md#include).
-To view a project's full merged configuration, [View full configuration](../../../ci/pipeline_editor/index.md#view-full-configuration)
-in the pipeline editor.
-
-To select a CI/CD template for the required pipeline configuration:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > CI/CD**.
-1. Expand the **Required pipeline configuration** section.
-1. Select a CI/CD template from the dropdown list.
-1. Select **Save changes**.
-
-## Package Registry configuration
-
-### Maven Forwarding **(PREMIUM SELF)**
-
-GitLab administrators can disable the forwarding of Maven requests to [Maven Central](https://search.maven.org/).
-
-To disable forwarding Maven requests:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > CI/CD**.
-1. Expand the **Package Registry** section.
-1. Clear the checkbox **Forward Maven package requests to the Maven Registry if the packages are not found in the GitLab Package Registry**.
-1. Select **Save changes**.
-
-### npm Forwarding **(PREMIUM SELF)**
-
-GitLab administrators can disable the forwarding of npm requests to [npmjs.com](https://www.npmjs.com/).
-
-To disable it:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > CI/CD**.
-1. Expand the **Package Registry** section.
-1. Clear the checkbox **Forward npm package requests to the npm Registry if the packages are not found in the GitLab Package Registry**.
-1. Select **Save changes**.
-
-### PyPI Forwarding **(PREMIUM SELF)**
-
-GitLab administrators can disable the forwarding of PyPI requests to [pypi.org](https://pypi.org/).
-
-To disable it:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > CI/CD**.
-1. Expand the **Package Registry** section.
-1. Clear the checkbox **Forward PyPI package requests to the PyPI Registry if the packages are not found in the GitLab Package Registry**.
-1. Select **Save changes**.
-
-### Package file size limits
-
-GitLab administrators can adjust the maximum allowed file size for each package type.
-
-To set the maximum file size:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > CI/CD**.
-1. Expand the **Package Registry** section.
-1. Find the package type you would like to adjust.
-1. Enter the maximum file size, in bytes.
-1. Select **Save size limits**.
-
-## Restrict runner registration by all users in an instance
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/22225) in GitLab 14.1.
-> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/368008) in GitLab 15.5.
-
-GitLab administrators can adjust who is allowed to register runners, by showing and hiding areas of the UI.
-
-When the registration sections are hidden in the UI, members of the project or group must contact administrators to enable runner registration in the group or project. If you plan to prevent registration, ensure users have access to the runners they need to run jobs.
-
-By default, all members of a project and group are able to register runners.
-
-To restrict all users in an instance from registering runners:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > CI/CD**.
-1. Expand **Runners**.
-1. In the **Runner registration** section, clear the **Members of the project can register runners** and
- **Members of the group can register runners** checkboxes to remove runner registration from the UI.
-1. Select **Save changes**.
-
-NOTE:
-After you disable runner registration by members of a project, the registration
-token automatically rotates. The token is no longer valid and you must
-use the new registration token for the project.
-
-## Restrict runner registration by all members in a group
-
-Prerequisites:
-
-- Runner registration must be enabled for [all users in the instance](#restrict-runner-registration-by-all-users-in-an-instance).
-
-GitLab administrators can adjust group permissions to restrict runner registration by group members.
-
-To restrict runner registration by members in a specific group:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Overview > Groups** and find your group.
-1. Select **Edit**.
-1. Clear the **New group runners can be registered** checkbox if you want to disable runner registration by all members in the group. If the setting is read-only, you must enable runner registration for the [instance](#restrict-runner-registration-by-all-users-in-an-instance).
-1. Select **Save changes**.
-
-## Disable runner version management
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/114041) in GitLab 15.10.
-
-By default, GitLab instances periodically fetch official runner version data from GitLab.com to [determine whether the runners need upgrades](../../../ci/runners/configure_runners.md#determine-which-runners-need-to-be-upgraded).
-
-To disable your instance fetching this data:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > CI/CD**.
-1. Expand **Runners**.
-1. In the **Runner version management** section, clear the **Fetch GitLab Runner release version data from GitLab.com** checkbox.
-1. Select **Save changes**.
-
-## Troubleshooting
-
-### 413 Request Entity Too Large
-
-When build jobs fail with the following error,
-increase the [maximum artifacts size](#maximum-artifacts-size).
-
-```plaintext
-Uploading artifacts as "archive" to coordinator... too large archive <job-id> responseStatus=413 Request Entity Too Large status=413" at end of a build job on pipeline when trying to store artifacts to <object-storage>.
-```
+<!-- This redirect file can be deleted after <2023-10-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/user/admin_area/settings/deprecated_api_rate_limits.md b/doc/user/admin_area/settings/deprecated_api_rate_limits.md
index e813d8fe2b1..984eeb24bd1 100644
--- a/doc/user/admin_area/settings/deprecated_api_rate_limits.md
+++ b/doc/user/admin_area/settings/deprecated_api_rate_limits.md
@@ -1,54 +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/product/ux/technical-writing/#assignments
-type: reference
+redirect_to: '../../../administration/settings/deprecated_api_rate_limits.md'
+remove_date: '2023-10-13'
---
-# Deprecated API rate limits **(FREE SELF)**
+This document was moved to [another location](../../../administration/settings/deprecated_api_rate_limits.md).
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68645) in GitLab 14.4.
-
-Deprecated API endpoints are those which have been replaced with alternative
-functionality, but cannot be removed without breaking backward compatibility.
-Setting a restrictive rate limit on these endpoints can encourage users to
-switch to the alternatives.
-
-## Deprecated API endpoints
-
-Not all deprecated API endpoints are included in this rate limit - just those
-that might have a performance impact:
-
-- [`GET /groups/:id`](../../../api/groups.md#details-of-a-group) **without** the `with_projects=0` query parameter.
-
-## Define Deprecated API rate limits
-
-Rate limits for deprecated API endpoints are disabled by default. When enabled, they supersede
-the general user and IP rate limits for requests to deprecated endpoints. You can keep any general user
-and IP rate limits already in place, and increase or decrease the rate limits
-for deprecated API endpoints. No other new features are provided by this override.
-
-Prerequisite:
-
-- You must have administrator access to the instance.
-
-To override the general user and IP rate limits for requests to deprecated API endpoints:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Network**.
-1. Expand **Deprecated API Rate Limits**.
-1. Select the checkboxes for the types of rate limits you want to enable:
- - **Unauthenticated API request rate limit**
- - **Authenticated API request rate limit**
-1. If you selected **unauthenticated**:
- 1. Select the **Maximum unauthenticated API requests per period per IP**.
- 1. Select the **Unauthenticated API rate limit period in seconds**.
-1. If you selected **authenticated**:
- 1. Select the **Maximum authenticated API requests per period per user**.
- 1. Select the **Authenticated API rate limit period in seconds**.
-
-## Related topics
-
-- [Rate limits](../../../security/rate_limits.md)
-- [User and IP rate limits](user_and_ip_rate_limits.md)
+<!-- This redirect file can be deleted after <2023-10-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/user/admin_area/settings/email.md b/doc/user/admin_area/settings/email.md
index 1caa1728ea4..f90aa7cc865 100644
--- a/doc/user/admin_area/settings/email.md
+++ b/doc/user/admin_area/settings/email.md
@@ -1,125 +1,11 @@
---
-type: reference
-stage: Plan
-group: Project Management
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+redirect_to: '../../../administration/settings/email.md'
+remove_date: '2023-10-14'
---
-# Email **(FREE SELF)**
+This document was moved to [another location](../../../administration/settings/email.md).
-You can customize some of the content in emails sent from your GitLab instance.
-
-## Custom logo
-
-The logo in the header of some emails can be customized, see the [logo customization section](../appearance.md#navigation-bar).
-
-## Include author name in email notification email body **(PREMIUM SELF)**
-
-By default, GitLab overrides the email address in notification emails with the email address
-of the issue, merge request, or comment author. Enable this setting to include the author's email
-address in the body of the email instead.
-
-To include the author's email address in the email body:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Preferences**.
-1. Expand **Email**.
-1. Select the **Include author name in email notification email body** checkbox.
-1. Select **Save changes**.
-
-## Enable multipart email **(PREMIUM SELF)**
-
-GitLab can send email in multipart format (HTML and plain text) or plain text only.
-
-To enable multipart email:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Preferences**.
-1. Expand **Email**.
-1. Select **Enable multipart email**.
-1. Select **Save changes**.
-
-## Custom hostname for private commit emails **(PREMIUM SELF)**
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22560) in GitLab 11.5.
-
-This configuration option sets the email hostname for [private commit emails](../../profile/index.md#use-an-automatically-generated-private-commit-email).
- By default it is set to `users.noreply.YOUR_CONFIGURED_HOSTNAME`.
-
-To change the hostname used in private commit emails:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Preferences**.
-1. Expand **Email**.
-1. Enter the desired hostname in the **Custom hostname (for private commit emails)** field.
-1. Select **Save changes**.
-
-NOTE:
-After the hostname is configured, every private commit email using the previous hostname is not
-recognized by GitLab. This can directly conflict with certain [Push rules](../../project/repository/push_rules.md) such as
-`Check whether author is a GitLab user` and `Check whether committer is the current authenticated user`.
-
-## Custom additional text **(PREMIUM SELF)**
-
-You can add additional text at the bottom of any email that GitLab sends. This additional text
-can be used for legal, auditing, or compliance reasons, for example.
-
-To add additional text to emails:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Preferences**.
-1. Expand **Email**.
-1. Enter your text in the **Additional text** field.
-1. Select **Save changes**.
-
-## User deactivation emails
-
-GitLab sends email notifications to users when their account has been deactivated.
-
-To disable these notifications:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Preferences**.
-1. Expand **Email**.
-1. Clear the **Enable user deactivation emails** checkbox.
-1. Select **Save changes**.
-
-### Custom additional text in deactivation emails **(FREE SELF)**
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/355964) in GitLab 15.9 [with a flag](../../../administration/feature_flags.md) named `deactivation_email_additional_text`. Disabled by default.
-> - [Enabled on self-managed and GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/111882) in GitLab 15.9.
-
-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
-`deactivation_email_additional_text`.
-
-You can add additional text at the bottom of the email that GitLab sends to users when their account
-is deactivated. This email text is separate from the [custom additional text](#custom-additional-text)
-setting.
-
-To add additional text to deactivation emails:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Preferences**.
-1. Expand **Email**.
-1. Enter your text in the **Additional text for deactivation email** field.
-1. Select **Save changes**.
-
-<!-- ## 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, for example `### 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 <2023-10-14>. -->
+<!-- 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/admin_area/settings/external_authorization.md b/doc/user/admin_area/settings/external_authorization.md
index c15062dd518..02b1ebadc9b 100644
--- a/doc/user/admin_area/settings/external_authorization.md
+++ b/doc/user/admin_area/settings/external_authorization.md
@@ -1,144 +1,11 @@
---
-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/product/ux/technical-writing/#assignments
+redirect_to: '../../../administration/settings/external_authorization.md'
+remove_date: '2023-10-14'
---
-# External authorization control **(FREE SELF)**
+This document was moved to [another location](../../../administration/settings/external_authorization.md).
-> [Moved](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/27056) from GitLab Premium to GitLab Free in 11.10.
-
-In highly controlled environments, it may be necessary for access policy to be
-controlled by an external service that permits access based on project
-classification and user access. GitLab provides a way to check project
-authorization with your own defined service.
-
-After the external service is configured and enabled, when a project is
-accessed, a request is made to the external service with the user information
-and project classification label assigned to the project. When the service
-replies with a known response, the result is cached for six hours.
-
-If the external authorization is enabled, GitLab further blocks pages and
-functionality that render cross-project data. That includes:
-
-- Most pages under Dashboard (Activity, Milestones, Snippets, Assigned merge
- requests, Assigned issues, To-Do List).
-- Under a specific group (Activity, Contribution analytics, Issues, Issue boards,
- Labels, Milestones, Merge requests).
-- Global and Group search are disabled.
-
-This is to prevent performing too many requests at once to the external
-authorization service.
-
-Whenever access is granted or denied this is logged in a log file called
-`external-policy-access-control.log`. Read more about the logs GitLab keeps in
-the [Linux package documentation](https://docs.gitlab.com/omnibus/settings/logs.html).
-
-When using TLS Authentication with a self signed certificate, the CA certificate
-needs to be trusted by the OpenSSL installation. When using GitLab installed
-using the Linux package, learn to install a custom CA in the
-[Linux package documentation](https://docs.gitlab.com/omnibus/settings/ssl/index.html).
-Alternatively, learn where to install custom certificates by using
-`openssl version -d`.
-
-## Configuration
-
-The external authorization service can be enabled by an administrator:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand **External authorization**.
-1. Complete the fields.
-1. Select **Save changes**.
-
-### Allow external authorization with deploy tokens and deploy keys
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/386656) in GitLab 15.9.
-> - Deploy tokens no longer being able to access container or package registries [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/387721) in GitLab 16.0.
-
-You can set your instance to allow external authorization for Git operations with
-[deploy tokens](../../project/deploy_tokens/index.md) or [deploy keys](../../project/deploy_keys/index.md).
-
-Prerequisites:
-
-- You must be using classification labels without a service URL for external authorization.
-
-To allow authorization with deploy tokens and keys:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand **External authorization**, and:
- - Leave the service URL field empty.
- - Select **Allow deploy tokens and deploy keys to be used with external authorization**.
-1. Select **Save changes**.
-
-WARNING:
-If you enable external authorization, deploy tokens cannot access container or package registries. If you use deploy tokens to access these registries, this measure breaks this use of these tokens. Disable external authorization to use tokens with container or package registries.
-
-## How it works
-
-When GitLab requests access, it sends a JSON POST request to the external
-service with this body:
-
-```json
-{
- "user_identifier": "jane@acme.org",
- "project_classification_label": "project-label",
- "user_ldap_dn": "CN=Jane Doe,CN=admin,DC=acme",
- "identities": [
- { "provider": "ldap", "extern_uid": "CN=Jane Doe,CN=admin,DC=acme" },
- { "provider": "bitbucket", "extern_uid": "2435223452345" }
- ]
-}
-```
-
-The `user_ldap_dn` is optional and is only sent when the user is signed in
-through LDAP.
-
-`identities` contains the details of all the identities associated with the
-user. This is an empty array if there are no identities associated with the
-user.
-
-When the external authorization service responds with a status code 200, the
-user is granted access. When the external service responds with a status code
-401 or 403, the user is denied access. In any case, the request is cached for
-six hours.
-
-When denying access, a `reason` can be optionally specified in the JSON body:
-
-```json
-{
- "reason": "You are not allowed access to this project."
-}
-```
-
-Any other status code than 200, 401 or 403 also deny access to the user, but the
-response isn't cached.
-
-If the service times out (after 500 ms), a message "External Policy Server did
-not respond" is displayed.
-
-## Classification labels
-
-You can use your own classification label in the project's
-**Settings > General > General project settings** page in the "Classification
-label" box. When no classification label is specified on a project, the default
-label defined in the [global settings](#configuration) is used.
-
-On all project pages, in the upper-right corner, the label appears.
-
-![classification label on project page](img/classification_label_on_project_page_v14_8.png)
-
-<!-- ## 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, for example `### 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 <2023-10-14>. -->
+<!-- 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/admin_area/settings/files_api_rate_limits.md b/doc/user/admin_area/settings/files_api_rate_limits.md
index 9f7a2d13b8e..c87cac2b8ac 100644
--- a/doc/user/admin_area/settings/files_api_rate_limits.md
+++ b/doc/user/admin_area/settings/files_api_rate_limits.md
@@ -1,51 +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/product/ux/technical-writing/#assignments
-type: reference
+redirect_to: '../../../administration/settings/files_api_rate_limits.md'
+remove_date: '2023-10-14'
---
-# Rate limits on Repository files API **(FREE SELF)**
+This document was moved to [another location](../../../administration/settings/files_api_rate_limits.md).
-> - [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.
-
-The [Repository files API](../../../api/repository_files.md) enables you to
-fetch, create, update, and delete files in your repository. To improve the security
-and durability of your web application, you can enforce
-[rate limits](../../../security/rate_limits.md) on this API. Any rate limits you
-create for the Files API override the [general user and IP rate limits](user_and_ip_rate_limits.md).
-
-## Define Files API rate limits
-
-Rate limits for the Files API are disabled by default. When enabled, they supersede
-the general user and IP rate limits for requests to the
-[Repository files API](../../../api/repository_files.md). You can keep any general user
-and IP rate limits already in place, and increase or decrease the rate limits
-for the Files API. No other new features are provided by this override.
-
-Prerequisite:
-
-- You must have administrator access to the instance.
-
-To override the general user and IP rate limits for requests to the Repository files API:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Network**.
-1. Expand **Files API Rate Limits**.
-1. Select the checkboxes for the types of rate limits you want to enable:
- - **Unauthenticated API request rate limit**
- - **Authenticated API request rate limit**
-1. If you selected **unauthenticated**:
- 1. Select the **Max unauthenticated API requests per period per IP**.
- 1. Select the **Unauthenticated API rate limit period in seconds**.
-1. If you selected **authenticated**:
- 1. Select the **Max authenticated API requests per period per user**.
- 1. Select the **Authenticated API rate limit period in seconds**.
-
-## Related topics
-
-- [Rate limits](../../../security/rate_limits.md)
-- [Repository files API](../../../api/repository_files.md)
-- [User and IP rate limits](user_and_ip_rate_limits.md)
+<!-- This redirect file can be deleted after <2023-10-14>. -->
+<!-- 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/admin_area/settings/floc.md b/doc/user/admin_area/settings/floc.md
index 6bd5a6dfed4..8e99005509a 100644
--- a/doc/user/admin_area/settings/floc.md
+++ b/doc/user/admin_area/settings/floc.md
@@ -1,42 +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/product/ux/technical-writing/#assignments
+redirect_to: '../../../administration/settings/floc.md'
+remove_date: '2023-10-06'
---
-# Federated Learning of Cohorts (FLoC) **(FREE SELF)**
+This document was moved to [another location](../../../administration/settings/floc.md).
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60933) in GitLab 13.12.
-
-Federated Learning of Cohorts (FLoC) is a new feature of the Chrome browser.
-It works by categorizing users into different cohorts, so that
-advertisers can use this data to uniquely target and track users. For more
-information, see the [FLoC repository](https://github.com/WICG/floc).
-
-To avoid users being tracked and categorized in any GitLab instance, FLoC is
-disabled by default by sending the following header:
-
-```plaintext
-Permissions-Policy: interest-cohort=()
-```
-
-To enable it:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand **Federated Learning of Cohorts (FLoC)**.
-1. Select the **Participate in FLoC** checkbox.
-1. Select **Save changes**.
-
-<!-- ## 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, for example `### 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 <2023-10-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/user/admin_area/settings/git_lfs_rate_limits.md b/doc/user/admin_area/settings/git_lfs_rate_limits.md
index c9b294417ee..8d7840b804c 100644
--- a/doc/user/admin_area/settings/git_lfs_rate_limits.md
+++ b/doc/user/admin_area/settings/git_lfs_rate_limits.md
@@ -1,36 +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/product/ux/technical-writing/#assignments
-type: reference
+redirect_to: '../../../administration/settings/git_lfs_rate_limits.md'
+remove_date: '2023-10-06'
---
-# Rate limits on Git LFS **(FREE SELF)**
+This document was moved to [another location](../../../administration/settings/git_lfs_rate_limits.md).
-[Git LFS (Large File Storage)](../../../topics/git/lfs/index.md) is a Git extension
-for handling large files. If you use Git LFS in your repository, common Git operations
-can generate many Git LFS requests. You can enforce
-[general user and IP rate limits](user_and_ip_rate_limits.md), but you can also
-override the general setting to enforce additional limits on Git LFS requests. This
-override can improve the security and durability of your web application. Aside from
-precedence, this configuration provides the same features as the general user and IP
-rate limits.
-
-## Configure Git LFS rate limits
-
-Git LFS rate limits are disabled by default. If enabled and configured, these limits
-supersede the [general user and IP rate limits](user_and_ip_rate_limits.md):
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Network**.
-1. Expand **Git LFS Rate Limits**.
-1. Select **Enable authenticated Git LFS request rate limit**.
-1. Enter a value for **Max authenticated Git LFS requests per period per user**.
-1. Enter a value for **Authenticated Git LFS rate limit period in seconds**.
-1. Select **Save changes**.
-
-## Related topics
-
-- [Rate limiting](../../../security/rate_limits.md)
-- [User and IP rate limits](user_and_ip_rate_limits.md)
+<!-- This redirect file can be deleted after <2023-10-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/user/admin_area/settings/gitaly_timeouts.md b/doc/user/admin_area/settings/gitaly_timeouts.md
index d28e9ec0249..572a9c55642 100644
--- a/doc/user/admin_area/settings/gitaly_timeouts.md
+++ b/doc/user/admin_area/settings/gitaly_timeouts.md
@@ -1,27 +1,11 @@
---
-stage: Systems
-group: Gitaly
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+redirect_to: '../../../administration/settings/gitaly_timeouts.md'
+remove_date: '2023-10-07'
---
-# Gitaly timeouts **(FREE SELF)**
+This document was moved to [another location](../../../administration/settings/gitaly_timeouts.md).
-[Gitaly](../../../administration/gitaly/index.md) timeouts are configurable. The timeouts can be
-configured to make sure that long-running Gitaly calls don't needlessly take up resources.
-
-To access Gitaly timeout settings:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Preferences**.
-1. Expand the **Gitaly timeouts** section.
-
-## Available timeouts
-
-The following timeouts are available.
-
-| Timeout | Default | Description |
-|:--------|:-----------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| Default | 55 seconds | Timeout for most Gitaly calls (not enforced for `git` `fetch` and `push` operations, or Sidekiq jobs). For example, checking if a repository exists on disk. Makes sure that Gitaly calls made within a web request cannot exceed the entire request timeout. It should be shorter than the [worker timeout](../../../administration/operations/puma.md#change-the-worker-timeout) that can be configured for [Puma](../../../install/requirements.md#puma-settings). If a Gitaly call timeout exceeds the worker timeout, the remaining time from the worker timeout is used to avoid having to terminate the worker. |
-| Fast | 10 seconds | Timeout for fast Gitaly operations used within requests, sometimes multiple times. For example, checking if a repository exists on disk. If fast operations exceed this threshold, there may be a problem with a storage shard. Failing fast can help maintain the stability of the GitLab instance. |
-| Medium | 30 seconds | Timeout for Gitaly operations that should be fast (possibly within requests) but preferably not used multiple times within a request. For example, loading blobs. Timeout that should be set between Default and Fast. |
+<!-- This redirect file can be deleted after <2023-10-07>. -->
+<!-- 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/admin_area/settings/help_page.md b/doc/user/admin_area/settings/help_page.md
index febd794b04c..38fe5c3b54c 100644
--- a/doc/user/admin_area/settings/help_page.md
+++ b/doc/user/admin_area/settings/help_page.md
@@ -1,111 +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/product/ux/technical-writing/#assignments
-type: howto
+redirect_to: '../../../administration/settings/help_page.md'
+remove_date: '2023-10-07'
---
-# Customize the Help and sign-in page messages **(FREE SELF)**
+This document was moved to [another location](../../../administration/settings/help_page.md).
-In large organizations, it is useful to have information about who to contact or where
-to go for help. You can customize and display this information on the GitLab `/help` page and on
-the GitLab sign-in page.
-
-## Add a help message to the Help page
-
-You can add a help message, which is shown at the top of the GitLab `/help` page (for example,
-<https://gitlab.com/help>):
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Preferences**.
-1. Expand **Sign-in and Help page**.
-1. In **Additional text to show on the Help page**, enter the information you want to display on `/help`.
-1. Select **Save changes**.
-
-You can now see the message on `/help`.
-
-NOTE:
-By default, `/help` is visible to unauthenticated users. However, if the
-[**Public** visibility level](visibility_and_access_controls.md#restrict-visibility-levels)
-is restricted, `/help` is visible only to authenticated users.
-
-## Add a help message to the sign-in page
-
-You can add a help message, which is shown on the GitLab sign-in page. The message appears on the sign-in page:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Preferences**.
-1. Expand **Sign-in and Help page**.
-1. In **Additional text to show on the sign-in page**, enter the information you want to
- display on the sign-in page.
-1. Select **Save changes**.
-
-You can now see the message on the sign-in page.
-
-## Hide marketing-related entries from the Help page
-
-GitLab marketing-related entries are occasionally shown on the Help page. To hide these entries:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Preferences**.
-1. Expand **Sign-in and Help page**.
-1. Select the **Hide marketing-related entries from the Help page** checkbox.
-1. Select **Save changes**.
-
-## Set a custom Support page URL
-
-You can specify a custom URL to which users are directed when they:
-
-- Select **Support** from the Help dropdown list.
-- Select **See our website for help** on the Help page.
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Preferences**.
-1. Expand **Sign-in and Help page**.
-1. In the **Support page URL** field, enter the URL.
-1. Select **Save changes**.
-
-## Redirect `/help` pages
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/43157) in GitLab 13.5.
-> - [Feature flag `help_page_documentation_redirect`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71737) removed in GitLab 14.4.
-> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71737) in GitLab 14.4.
-
-You can redirect all `/help` links to a destination that meets the [necessary requirements](#destination-requirements).
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Preferences**.
-1. Expand **Sign-in and Help page**.
-1. In the **Documentation pages URL** field, enter the URL.
-1. Select **Save changes**.
-
-If the "Documentation pages URL" field is empty, the GitLab instance displays a basic version of the documentation sourced from the [`doc` directory](https://gitlab.com/gitlab-org/gitlab/-/tree/master/doc) of GitLab.
-
-### Destination requirements
-
-When redirecting `/help`, GitLab:
-
-- Redirects requests to the specified URL.
-- Appends `ee` and the documentation path, which includes the version number, to the URL.
-- Appends `.html` to the URL, and removes `.md` if necessary.
-
-For example, if the URL is set to `https://docs.gitlab.com`, requests for
-`/help/user/admin_area/settings/help_page.md` redirect to:
-`https://docs.gitlab.com/${VERSION}/ee/user/admin_area/settings/help_page.html`.
-
-<!-- ## 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, for example `### 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 <2023-10-07>. -->
+<!-- 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/admin_area/settings/import_export_rate_limits.md b/doc/user/admin_area/settings/import_export_rate_limits.md
index 99385c77cdf..ad55f424d81 100644
--- a/doc/user/admin_area/settings/import_export_rate_limits.md
+++ b/doc/user/admin_area/settings/import_export_rate_limits.md
@@ -1,31 +1,11 @@
---
-stage: Manage
-group: Import and Integrate
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+redirect_to: '../../../administration/settings/import_export_rate_limits.md'
+remove_date: '2023-10-07'
---
-# Rate limits for imports and exports of project and groups **(FREE SELF)**
+This document was moved to [another location](../../../administration/settings/import_export_rate_limits.md).
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35728) in GitLab 13.2.
-
-You can configure the rate limits for imports and exports of projects and groups:
-
-To change a rate limit:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Network**.
-1. Expand **Import and export rate limits**.
-1. Change the value of any rate limit. The rate limits are per minute per user, not per IP address.
- Set to `0` to disable a rate limit.
-
-| Limit | Default |
-|-------------------------|---------|
-| Project Import | 6 |
-| Project Export | 6 |
-| Project Export Download | 1 |
-| Group Import | 6 |
-| Group Export | 6 |
-| Group Export Download | 1 |
-
-When a user exceeds a rate limit, it is logged in `auth.log`.
+<!-- This redirect file can be deleted after <2023-10-07>. -->
+<!-- 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/admin_area/settings/incident_management_rate_limits.md b/doc/user/admin_area/settings/incident_management_rate_limits.md
index 0b6e572837e..ad11d6f7f36 100644
--- a/doc/user/admin_area/settings/incident_management_rate_limits.md
+++ b/doc/user/admin_area/settings/incident_management_rate_limits.md
@@ -1,39 +1,11 @@
---
-type: reference
-stage: Monitor
-group: Respond
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+redirect_to: '../../../administration/settings/incident_management_rate_limits.md'
+remove_date: '2023-10-10'
---
-# Incident management rate limits **(ULTIMATE SELF)**
+This document was moved to [another location](../../../administration/settings/incident_management_rate_limits.md).
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/17859) in GitLab 12.5.
-
-You can limit the number of inbound alerts for [incidents](../../../operations/incident_management/incidents.md)
-that can be created in a period of time. The inbound [incident management](../../../operations/incident_management/index.md)
-alert limit can help prevent overloading your incident responders by reducing the
-number of alerts or duplicate issues.
-
-As an example, if you set a limit of `10` requests every `60` seconds,
-and `11` requests are sent to an [alert integration endpoint](../../../operations/incident_management/integrations.md) within one minute,
-the eleventh request is blocked. Access to the endpoint is allowed again after one minute.
-
-This limit is:
-
-- Applied independently per project.
-- Not applied per IP address.
-- Disabled by default.
-
-Requests that exceed the limit are logged into `auth.log`.
-
-## Set a limit on inbound alerts
-
-To set inbound incident management alert limits:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Network**.
-1. Expand **Incident Management Limits**.
-1. Select the **Enable Incident Management inbound alert limit** checkbox.
-1. Optional. Input a custom value for **Maximum requests per project per rate limit period**. Default is 3600.
-1. Optional. Input a custom value for **Rate limit period**. Default is 3600 seconds.
+<!-- This redirect file can be deleted after <2023-10-10>. -->
+<!-- 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/admin_area/settings/index.md b/doc/user/admin_area/settings/index.md
index 632adf273c4..37112e6897f 100644
--- a/doc/user/admin_area/settings/index.md
+++ b/doc/user/admin_area/settings/index.md
@@ -1,218 +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/product/ux/technical-writing/#assignments
-type: index
+redirect_to: '../../../administration/settings/index.md'
+remove_date: '2023-10-10'
---
-# Admin Area settings **(FREE SELF)**
+This document was moved to [another location](../../../administration/settings/index.md).
-As an administrator of a GitLab self-managed instance, you can manage the behavior of your
-deployment.
-
-The **Admin Area** is not accessible on GitLab.com, and settings can only be changed by the
-GitLab.com administrators. For the settings and limits on the GitLab.com instance,
-read [GitLab.com settings](../../gitlab_com/index.md).
-
-## Access the Admin Area
-
-To access the **Admin Area**:
-
-1. Sign in to your GitLab instance as an administrator.
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings**, and the group of settings to view:
- - [General](#general)
- - [Geo](#geo)
- - [CI/CD](#cicd)
- - [Integrations](#integrations)
- - [Metrics and profiling](#metrics-and-profiling)
- - [Network](#network)
- - [Preferences](#preferences)
- - [Reporting](#reporting)
- - [Repository](#repository)
- - [Templates](#templates)
-
-### General
-
-The **General** settings contain:
-
-- [Visibility and access controls](visibility_and_access_controls.md) - Set default and
- restrict visibility levels. Configure import sources and Git access protocol.
-- [Account and limit](account_and_limit_settings.md) - Set projects and maximum size limits,
- session duration, user options, and check feature availability for namespace plan.
-- [Diff limits](../diff_limits.md) - Diff content limits.
-- [Sign-up restrictions](sign_up_restrictions.md) - Configure the way a user creates a new account.
-- [Sign in restrictions](sign_in_restrictions.md) - Set requirements for a user to sign in.
- Enable mandatory two-factor authentication.
-- [Terms of Service and Privacy Policy](terms.md) - Include a Terms of Service agreement
- and Privacy Policy that all users must accept.
-- [External Authentication](external_authorization.md#configuration) - External Classification Policy Authorization.
-- [Web terminal](../../../administration/integration/terminal.md#limiting-websocket-connection-time) -
- Set max session time for web terminal.
-- [FLoC](floc.md) - Enable or disable
- [Federated Learning of Cohorts (FLoC)](https://en.wikipedia.org/wiki/Federated_Learning_of_Cohorts) tracking.
-
-### CI/CD
-
-The **CI/CD** settings contain:
-
-- [Continuous Integration and Deployment](continuous_integration.md) -
- Auto DevOps, runners and job artifacts.
-- [Required pipeline configuration](continuous_integration.md#required-pipeline-configuration) -
- Set an instance-wide auto included [pipeline configuration](../../../ci/yaml/index.md).
- This pipeline configuration is run after the project's own configuration.
-- [Package Registry](continuous_integration.md#package-registry-configuration) -
- Settings related to the use and experience of using the GitLab Package Registry. Some
- [risks are involved](../../packages/container_registry/reduce_container_registry_storage.md#use-with-external-container-registries)
- in enabling some of these settings.
-
-## Security and Compliance settings
-
-- [License compliance settings](security_and_compliance.md#choose-package-registry-metadata-to-sync): Enable or disable synchronization of package metadata by a registry type.
-
-### Geo **(PREMIUM SELF)**
-
-The **Geo** setting contains:
-
-- [Geo](../../../administration/geo/index.md) - Replicate your GitLab instance to other
- geographical locations. Redirects to **Admin Area > Geo > Settings** are no
- longer available at **Admin Area > Settings > Geo** in [GitLab 13.0](https://gitlab.com/gitlab-org/gitlab/-/issues/36896).
-
-### Integrations
-
-The **Integrations** settings contain:
-
-- [Elasticsearch](../../../integration/advanced_search/elasticsearch.md#enable-advanced-search) -
- Elasticsearch integration. Elasticsearch AWS IAM.
-- [Kroki](../../../administration/integration/kroki.md#enable-kroki-in-gitlab) -
- Allow rendering of diagrams in AsciiDoc and Markdown documents using [kroki.io](https://kroki.io).
-- [Mailgun](../../../administration/integration/mailgun.md) - Enable your GitLab instance
- to receive invite email bounce events from Mailgun, if it is your email provider.
-- [PlantUML](../../../administration/integration/plantuml.md) - Allow rendering of PlantUML
- diagrams in documents.
-- [Slack application](../../../user/project/integrations/gitlab_slack_application.md) -
- Slack integration allows you to interact with GitLab via slash commands in a chat window.
- This option is only available on GitLab.com, though it may be
- [available for self-managed instances in the future](https://gitlab.com/gitlab-org/gitlab/-/issues/28164).
-- [Customer experience improvement and third-party offers](third_party_offers.md) -
- Control the display of customer experience improvement content and third-party offers.
-- [Snowplow](../../../development/internal_analytics/snowplow/index.md) - Configure the Snowplow integration.
-- [Google GKE](../../project/clusters/add_gke_clusters.md) - Google GKE integration enables
- you to provision GKE clusters from GitLab.
-- [Amazon EKS](../../project/clusters/add_eks_clusters.md) - Amazon EKS integration enables
- you to provision EKS clusters from GitLab.
-
-### Metrics and profiling
-
-The **Metrics and profiling** settings contain:
-
-- [Metrics - Prometheus](../../../administration/monitoring/prometheus/gitlab_metrics.md) -
- Enable and configure Prometheus metrics.
-- [Metrics - Grafana](../../../administration/monitoring/performance/grafana_configuration.md#integrate-with-gitlab-ui) -
- Enable and configure Grafana.
-- [Profiling - Performance bar](../../../administration/monitoring/performance/performance_bar.md#enable-the-performance-bar-for-non-administrators) -
- Enable access to the Performance Bar for non-administrator users in a given group.
-- [Usage statistics](usage_statistics.md) - Enable or disable version check and Service Ping.
-
-### Network
-
-The **Network** settings contain:
-
-- Performance optimization - Various settings that affect GitLab performance, including:
- - [Write to `authorized_keys` file](../../../administration/operations/fast_ssh_key_lookup.md#set-up-fast-lookup).
- - [Push event activities limit and bulk push events](push_event_activities_limit.md).
-- [User and IP rate limits](user_and_ip_rate_limits.md) - Configure limits for web and API requests.
- These rate limits can be overridden:
- - [Package Registry Rate Limits](package_registry_rate_limits.md) - Configure specific
- limits for Packages API requests that supersede the user and IP rate limits.
- - [Git LFS Rate Limits](git_lfs_rate_limits.md) - Configure specific limits for
- Git LFS requests that supersede the user and IP rate limits.
- - [Files API Rate Limits](files_api_rate_limits.md) - Configure specific limits for
- Files API requests that supersede the user and IP rate limits.
- - [Search rate limits](../../../administration/instance_limits.md#search-rate-limit) - Configure global search request rate limits for authenticated and unauthenticated users.
- - [Deprecated API Rate Limits](deprecated_api_rate_limits.md) - Configure specific limits
- for deprecated API requests that supersede the user and IP rate limits.
-- [Outbound requests](../../../security/webhooks.md) - Allow requests to the local network from webhooks and integrations, or deny all outbound requests.
-- [Protected Paths](protected_paths.md) - Configure paths to be protected by Rack Attack.
-- [Incident Management Limits](../../../operations/incident_management/index.md) - Limit the
- number of inbound alerts that can be sent to a project.
-- [Notes creation limit](rate_limit_on_notes_creation.md) - Set a rate limit on the note creation requests.
-- [Get single user limit](rate_limit_on_users_api.md) - Set a rate limit on users API endpoint to get a user by ID.
-- [Projects API rate limits for unauthenticated requests](rate_limit_on_projects_api.md) - Set a rate limit on Projects list API endpoint for unauthenticated requests.
-
-### Preferences
-
-The **Preferences** settings contain:
-
-- [Email](email.md) - Various email settings.
-- [What's new](../../../administration/whats-new.md) - Configure **What's new** drawer and content.
-- [Help page](help_page.md) - Help page text and support page URL.
-- [Pages](../../../administration/pages/index.md#custom-domain-verification) -
- Size and domain settings for static websites.
-- [Polling interval multiplier](../../../administration/polling.md) -
- Configure how frequently the GitLab UI polls for updates.
-- [Gitaly timeouts](gitaly_timeouts.md) - Configure Gitaly timeouts.
-- Localization:
- - [Default first day of the week](../../profile/preferences.md).
- - [Time tracking](../../project/time_tracking.md#limit-displayed-units-to-hours).
-- [Sidekiq Job Limits](sidekiq_job_limits.md) - Limit the size of Sidekiq jobs stored in Redis.
-
-### Reporting
-
-The **Reporting** settings contain:
-
-- Spam and Anti-bot protection:
- - Anti-spam services, such as [reCAPTCHA](../../../integration/recaptcha.md),
- [Akismet](../../../integration/akismet.md), or [Spamcheck](../reporting/spamcheck.md).
- - [IP address restrictions](../reporting/ip_addr_restrictions.md).
-- [Abuse reports](../review_abuse_reports.md) - Set notification email for abuse reports.
-- [Git abuse rate limit](../reporting/git_abuse_rate_limit.md) - Configure Git abuse rate limit settings. **(ULTIMATE SELF)**
-
-### Repository
-
-The **Repository** settings contain:
-
-- [Repository's custom initial branch name](../../project/repository/branches/default.md#instance-level-custom-initial-branch-name) -
- Set a custom branch name for new repositories created in your instance.
-- [Repository's initial default branch protection](../../project/repository/branches/default.md#instance-level-default-branch-protection) -
- Configure the branch protections to apply to every repository's default branch.
-- [Repository mirror](visibility_and_access_controls.md#enable-project-mirroring) -
- Configure repository mirroring.
-- [Repository storage](../../../administration/repository_storage_types.md) - Configure storage path settings.
-- Repository maintenance:
- - [Repository checks](../../../administration/repository_checks.md) - Configure
- automatic Git checks on repositories.
- - [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).
-
-### Templates **(PREMIUM SELF)**
-
-The **Templates** settings contain:
-
-- [Templates](instance_template_repository.md#configuration) - Set instance-wide template repository.
-- [Custom project templates](../custom_project_templates.md) - Select the custom project template source group.
-
-## Default first day of the week
-
-You can change the [Default first day of the week](../../profile/preferences.md)
-for the entire GitLab instance:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Preferences**.
-1. Scroll to the **Localization** section, and select your desired first day of the week.
-
-## Default language
-
-You can change the [Default language](../../profile/preferences.md)
-for the entire GitLab instance:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Preferences**.
-1. Scroll to the **Localization** section, and select your desired default language.
+<!-- This redirect file can be deleted after <2023-10-10>. -->
+<!-- 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/admin_area/settings/instance_template_repository.md b/doc/user/admin_area/settings/instance_template_repository.md
index a5148c41b74..752630ea922 100644
--- a/doc/user/admin_area/settings/instance_template_repository.md
+++ b/doc/user/admin_area/settings/instance_template_repository.md
@@ -1,84 +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/product/ux/technical-writing/#assignments"
-type: reference
+redirect_to: '../../../administration/settings/instance_template_repository.md'
+remove_date: '2023-10-11'
---
-# Instance template repository **(PREMIUM SELF)**
+This document was moved to [another location](../../../administration/settings/instance_template_repository.md).
-> - [Improved](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52360) to behave like group-level templates in GitLab 13.9.
-> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/321247) in GitLab 14.0.
-
-In hosted systems, enterprises often have a need to share their own templates
-across teams. This feature allows an administrator to pick a project to be the
-instance-wide collection of file templates. These templates are then exposed to
-all users through the [Web Editor](../../project/repository/web_editor.md)
-while the project remains secure.
-
-## Configuration
-
-To select a project to serve as the custom template repository:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Templates**.
-1. Expand **Templates**
-1. From the dropdown list, select the project to use as the template repository.
-1. Select **Save changes**.
-1. Add custom templates to the selected repository.
-
-After you add templates, you can use them for the entire instance.
-They are available in the [Web Editor](../../project/repository/web_editor.md)
-and through the [API settings](../../../api/settings.md).
-
-## Supported file types and locations
-
-Templates must be added to a specific subdirectory in the repository,
-corresponding to the kind of template. The following types of custom templates
-are supported:
-
-| Type | Directory | Extension |
-| :---------------: | :-----------: | :-----------: |
-| `Dockerfile` | `Dockerfile` | `.dockerfile` |
-| `.gitignore` | `gitignore` | `.gitignore` |
-| `.gitlab-ci.yml` | `gitlab-ci` | `.yml` |
-| `LICENSE` | `LICENSE` | `.txt` |
-
-Each template must go in its respective subdirectory, have the correct
-extension and not be empty. So, the hierarchy should look like this:
-
-```plaintext
-|-- README.md
-|-- Dockerfile
- |-- custom_dockerfile.dockerfile
- |-- another_dockerfile.dockerfile
-|-- gitignore
- |-- custom_gitignore.gitignore
- |-- another_gitignore.gitignore
-|-- gitlab-ci
- |-- custom_gitlab-ci.yml
- |-- another_gitlab-ci.yml
-|-- LICENSE
- |-- custom_license.txt
- |-- another_license.txt
-```
-
-Your custom templates are displayed on the dropdown list when a new file is added through the GitLab UI:
-
-![Custom template dropdown list](img/file_template_user_dropdown.png)
-
-If this feature is disabled or no templates are present,
-no **Custom** section displays in the selection dropdown.
-
-<!-- ## 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, for example `### 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 <2023-10-11>. -->
+<!-- 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/admin_area/settings/package_registry_rate_limits.md b/doc/user/admin_area/settings/package_registry_rate_limits.md
index a1bc339ddd9..269864bdd49 100644
--- a/doc/user/admin_area/settings/package_registry_rate_limits.md
+++ b/doc/user/admin_area/settings/package_registry_rate_limits.md
@@ -1,57 +1,11 @@
---
-stage: Package
-group: Package Registry
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-type: reference
+redirect_to: '../../../administration/settings/package_registry_rate_limits.md'
+remove_date: '2023-10-11'
---
-# Package Registry Rate Limits **(FREE SELF)**
+This document was moved to [another location](../../../administration/settings/package_registry_rate_limits.md).
-With the [GitLab Package Registry](../../packages/package_registry/index.md),
-you can use GitLab as a private or public registry for a variety of common package managers. You can
-publish and share packages, which others can consume as a dependency in downstream projects through
-the [Packages API](../../../api/packages.md).
-
-If downstream projects frequently download such dependencies, many requests are made through the
-Packages API. You may therefore reach enforced [user and IP rate limits](user_and_ip_rate_limits.md).
-To address this issue, you can define specific rate limits for the Packages API:
-
-- [Unauthenticated requests (per IP)](#enable-unauthenticated-request-rate-limit-for-packages-api).
-- [Authenticated API requests (per user)](#enable-authenticated-api-request-rate-limit-for-packages-api).
-
-These limits are disabled by default.
-
-When enabled, they supersede the general user and IP rate limits for requests to
-the Packages API. You can therefore keep the general user and IP rate limits, and
-increase the rate limits for the Packages API. Besides this precedence, there is
-no difference in functionality compared to the general user and IP rate limits.
-
-## Enable unauthenticated request rate limit for packages API
-
-To enable the unauthenticated request rate limit:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Network**.
-1. Expand **Package registry rate limits**.
-1. Select **Enable unauthenticated request rate limit**.
-
- - Optional. Update the **Maximum unauthenticated requests per rate limit period per IP** value.
- Defaults to `800`.
- - Optional. Update the **Unauthenticated rate limit period in seconds** value.
- Defaults to `15`.
-
-## Enable authenticated API request rate limit for packages API
-
-To enable the authenticated API request rate limit:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Network**
-1. Expand **Package registry rate limits**.
-1. Select **Enable authenticated API request rate limit**.
-
- - Optional. Update the **Maximum authenticated API requests per rate limit period per user** value.
- Defaults to `1000`.
- - Optional. Update the **Authenticated API rate limit period in seconds** value.
- Defaults to `15`.
+<!-- This redirect file can be deleted after <2023-10-11>. -->
+<!-- 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/admin_area/settings/project_integration_management.md b/doc/user/admin_area/settings/project_integration_management.md
index 1bb4465020c..eff19caabbe 100644
--- a/doc/user/admin_area/settings/project_integration_management.md
+++ b/doc/user/admin_area/settings/project_integration_management.md
@@ -1,138 +1,11 @@
---
-stage: Manage
-group: Import and Integrate
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+redirect_to: '../../../administration/settings/project_integration_management.md'
+remove_date: '2023-10-11'
---
-# Project integration management **(FREE)**
+This document was moved to [another location](../../../administration/settings/project_integration_management.md).
-Project integrations can be configured and enabled by project administrators. As a GitLab instance
-administrator, you can set default configuration parameters for a given integration that all projects
-can inherit and use, enabling the integration for all projects that are not already using custom
-settings.
-
-You can update these default settings at any time, changing the settings used for all projects that
-are set to use instance-level or group-level defaults. Updating the default settings also enables the integration
-for all projects that didn't have it already enabled.
-
-Only the complete settings for an integration can be inherited. Per-field inheritance is [planned](https://gitlab.com/groups/gitlab-org/-/epics/2137).
-
-## Manage instance-level default settings for a project integration **(FREE SELF)**
-
-> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2137) in GitLab 13.3 for project-level integrations.
-> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2543) in GitLab 13.6 for group-level integrations.
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Integrations**.
-1. Select an integration.
-1. Enter configuration details and select **Save changes**.
-
-WARNING:
-This may affect all or most of the groups and projects on your GitLab instance. Review the details
-below.
-
-If this is the first time you are setting up instance-level settings for an integration:
-
-- The integration is enabled for all groups and projects that don't already have this integration configured,
- if you have the **Enable integration** toggle turned on in the instance-level settings.
-- Groups and projects that already have the integration configured are not affected, but can choose to use the
- inherited settings at any time.
-
-When you make further changes to the instance defaults:
-
-- They are immediately applied to all groups and projects that have the integration set to use default settings.
-- They are immediately applied to newer groups and projects, created after you last saved defaults for the
- integration. If your instance-level default setting has the **Enable integration** toggle turned
- on, the integration is automatically enabled for all such groups and projects.
-- Groups and projects with custom settings selected for the integration are not immediately affected and may
- choose to use the latest defaults at any time.
-
-Only the complete settings for an integration can be inherited. Per-field inheritance
-is [planned](https://gitlab.com/groups/gitlab-org/-/epics/2137). This would allow
-administrators to update settings inherited by groups and projects without enabling the
-integration on all non-configured groups and projects by default.
-
-### Remove an instance-level default setting
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Integrations**.
-1. Select an integration.
-1. Select **Reset** and confirm.
-
-Resetting an instance-level default setting removes the integration from all projects that have the integration set to use default settings.
-
-### View projects that override the default settings
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/218252) in GitLab 14.2.
-
-You can view which projects in your instance use custom settings that [override the instance-level default settings](#use-custom-settings-for-a-group-or-project-integration)
-for an integration.
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Integrations**.
-1. Select an integration.
-1. Select the **Projects using custom settings** tab.
-
-## Manage group-level default settings for a project integration
-
-> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2543) in GitLab 13.6.
-
-1. Navigate to the group's **Settings > Integrations**.
-1. Select an integration.
-1. Enter configuration details and select **Save changes**.
-
-WARNING:
-This may affect all or most of the subgroups and projects belonging to the group. Review the details below.
-
-If this is the first time you are setting up group-level settings for an integration:
-
-- The integration is enabled for all subgroups and projects belonging to the group that don't already have
- this integration configured, if you have the **Enable integration** toggle turned on in the group-level
- settings.
-- Subgroups and projects that already have the integration configured are not affected, but can choose to use
- the inherited settings at any time.
-
-When you make further changes to the group defaults:
-
-- They are immediately applied to all subgroups and projects belonging to the group that have the integration
- set to use default settings.
-- They are immediately applied to newer subgroups and projects, even those created after you last saved defaults for the
- integration. If your group-level default setting has the **Enable integration** toggle turned on,
- the integration is automatically enabled for all such subgroups and projects.
-
-- Subgroups and projects with custom settings selected for the integration are not immediately affected and
- may choose to use the latest defaults at any time.
-
-Only the complete settings for an integration can be inherited. Per-field inheritance
-is [planned](https://gitlab.com/groups/gitlab-org/-/epics/2137). This would allow
-administrators to update settings inherited by subgroups and projects without enabling the
-integration on all non-configured groups and projects by default.
-
-### Remove a group-level default setting
-
-1. Navigate to the group's **Settings > Integrations**.
-1. Select an integration.
-1. Select **Reset** and confirm.
-
-Resetting a group-level default setting removes integrations that use default settings and belong to a project or subgroup of the group.
-
-## Use instance-level or group-level default settings for a project integration
-
-> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2543) in GitLab 13.6 for group-level settings.
-
-1. Navigate to **Project > Settings > Integrations**.
-1. Choose the integration you want to enable or update.
-1. From the dropdown list, select **Use default settings**.
-1. Ensure the toggle is set to **Enable integration**.
-1. Select **Save changes**.
-
-## Use custom settings for a group or project integration
-
-1. Navigate to project or group's **Settings > Integrations**.
-1. Choose the integration you want to enable or update.
-1. From the dropdown list, select **Use custom settings**.
-1. Ensure the toggle is set to **Enable integration** and enter all required settings.
-1. Select **Save changes**.
+<!-- This redirect file can be deleted after <2023-10-11>. -->
+<!-- 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/admin_area/settings/protected_paths.md b/doc/user/admin_area/settings/protected_paths.md
index 4080ee6a540..519d035244a 100644
--- a/doc/user/admin_area/settings/protected_paths.md
+++ b/doc/user/admin_area/settings/protected_paths.md
@@ -1,43 +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/product/ux/technical-writing/#assignments
-type: reference
+redirect_to: '../../../administration/settings/protected_paths.md'
+remove_date: '2023-10-12'
---
-# Protected paths **(FREE SELF)**
+This document was moved to [another location](../../../administration/settings/protected_paths.md).
-Rate limiting is a technique that improves the security and durability of a web
-application. For more details, see [Rate limits](../../../security/rate_limits.md).
-
-You can rate limit (protect) specified paths. For these paths, GitLab responds with HTTP status
-code `429` to POST requests at protected paths that exceed 10 requests per minute per IP address.
-
-For example, the following are limited to a maximum 10 requests per minute:
-
-- User sign-in
-- User sign-up (if enabled)
-- User password reset
-
-After 10 requests, the client must wait 60 seconds before it can try again.
-
-See also:
-
-- List of paths [protected by default](../../../administration/instance_limits.md#by-protected-path).
-- [User and IP rate limits](../../admin_area/settings/user_and_ip_rate_limits.md#response-headers)
- for the headers returned to blocked requests.
-
-## Configure protected paths
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/31246) in GitLab 12.4.
-
-Throttling of protected paths is enabled by default and can be disabled or
-customized on **Admin > Network > Protected Paths**, along with these options:
-
-- Maximum number of requests per period per user.
-- Rate limit period in seconds.
-- Paths to be protected.
-
-![protected-paths](img/protected_paths.png)
-
-Requests over the rate limit are logged into `auth.log`.
+<!-- This redirect file can be deleted after <2023-10-12>. -->
+<!-- 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/admin_area/settings/push_event_activities_limit.md b/doc/user/admin_area/settings/push_event_activities_limit.md
index 56a2902f2d9..b7e059cf820 100644
--- a/doc/user/admin_area/settings/push_event_activities_limit.md
+++ b/doc/user/admin_area/settings/push_event_activities_limit.md
@@ -1,38 +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/product/ux/technical-writing/#assignments"
-type: reference
+redirect_to: '../../../administration/settings/push_event_activities_limit.md'
+remove_date: '2023-10-12'
---
-# Push event activities limit and bulk push events **(FREE)**
+This document was moved to [another location](../../../administration/settings/push_event_activities_limit.md).
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31007) in GitLab 12.4.
-
-Set the number of branches or tags to limit the number of single push events
-allowed at once. If the number of events is greater than this, GitLab creates
-bulk push event instead.
-
-For example, if 4 branches are pushed and the limit is currently set to 3,
-the activity feed displays:
-
-![Bulk push event](img/bulk_push_event_v12_4.png)
-
-With this feature, when a single push includes a lot of changes (for example, 1,000
-branches), only 1 bulk push event is created instead of 1,000 push
-events. This helps in maintaining good system performance and preventing spam on
-the activity feed.
-
-To modify this setting:
-
-- In the Admin Area:
- 1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
- 1. Select **Admin Area**.
- 1. Select **Settings > Network**.
- 1. Expand **Performance optimization**.
-- Through the [Application settings API](../../../api/settings.md#list-of-settings-that-can-be-accessed-via-api-calls)
- as `push_event_activities_limit`.
-
-The default value is `3`, but the value can be greater than or equal to `0`. Setting this value to `0` does not disable throttling.
-
-![Push event activities limit](img/push_event_activities_limit_v12_4.png)
+<!-- This redirect file can be deleted after <2023-10-12>. -->
+<!-- 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/admin_area/settings/rate_limit_on_issues_creation.md b/doc/user/admin_area/settings/rate_limit_on_issues_creation.md
index 09a1e023c2b..aca30177c54 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
@@ -1,36 +1,11 @@
---
-type: reference
-stage: Plan
-group: Project Management
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+redirect_to: '../../../administration/settings/rate_limit_on_issues_creation.md'
+remove_date: '2023-10-12'
---
-# Rate limits on issue creation **(FREE SELF)**
+This document was moved to [another location](../../../administration/settings/rate_limit_on_issues_creation.md).
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/28129) in GitLab 12.10.
-
-This setting allows you to rate limit the requests to the issue and epic creation endpoints.
-To can change its value:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Network**.
-1. Expand **Issues Rate Limits**.
-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
-[Projects::IssuesController#create](https://gitlab.com/gitlab-org/gitlab/blob/master/app/controllers/projects/issues_controller.rb)
-action exceeding a rate of 300 per minute are blocked. Access to the endpoint is allowed after one minute.
-
-When using [epics](../../group/epics/index.md), epic creation shares this rate limit with issues.
-
-![Rate limits on issues creation](img/rate_limit_on_issues_creation_v14_2.png)
-
-This limit is:
-
-- Applied independently per project and per user.
-- Not applied per IP address.
-- Disabled by default. To enable it, set the option to any value other than `0`.
-
-Requests over the rate limit are logged into the `auth.log` file.
+<!-- This redirect file can be deleted after <2023-10-12>. -->
+<!-- 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/admin_area/settings/rate_limit_on_notes_creation.md b/doc/user/admin_area/settings/rate_limit_on_notes_creation.md
index 59548836e78..6d5c93f8554 100644
--- a/doc/user/admin_area/settings/rate_limit_on_notes_creation.md
+++ b/doc/user/admin_area/settings/rate_limit_on_notes_creation.md
@@ -1,35 +1,11 @@
---
-type: reference
-stage: Plan
-group: Project Management
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+redirect_to: '../../../administration/settings/rate_limit_on_notes_creation.md'
+remove_date: '2023-10-12'
---
-# Rate limits on note creation **(FREE SELF)**
+This document was moved to [another location](../../../administration/settings/rate_limit_on_notes_creation.md).
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/53637) in GitLab 13.9.
-
-You can configure the per-user rate limit for requests to the note creation endpoint.
-
-To change the note creation rate limit:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Network**.
-1. Expand **Notes rate limit**.
-1. In the **Maximum requests per minute** box, enter the new value.
-1. Optional. In the **Users to exclude from the rate limit** box, list users allowed to exceed the limit.
-1. Select **Save changes**.
-
-This limit is:
-
-- Applied independently per user.
-- Not applied per IP address.
-
-The default value is `300`.
-
-Requests over the rate limit are logged into the `auth.log` file.
-
-For example, if you set a limit of 300, requests using the
-[Projects::NotesController#create](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/notes_controller.rb)
-action exceeding a rate of 300 per minute are blocked. Access to the endpoint is allowed after one minute.
+<!-- This redirect file can be deleted after <2023-10-12>. -->
+<!-- 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/admin_area/settings/rate_limit_on_pipelines_creation.md b/doc/user/admin_area/settings/rate_limit_on_pipelines_creation.md
index 2d0c4405211..c469a77f7d2 100644
--- a/doc/user/admin_area/settings/rate_limit_on_pipelines_creation.md
+++ b/doc/user/admin_area/settings/rate_limit_on_pipelines_creation.md
@@ -1,35 +1,11 @@
---
-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/product/ux/technical-writing/#assignments
+redirect_to: '../../../administration/settings/rate_limit_on_pipelines_creation.md'
+remove_date: '2023-10-12'
---
-# Rate limits on pipeline creation **(FREE SELF)**
+This document was moved to [another location](../../../administration/settings/rate_limit_on_pipelines_creation.md).
-> [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/index.md) within one minute,
-the eleventh request is blocked. Access to the endpoint is allowed again after one minute.
-
-This limit is:
-
-- Applied to the number of pipelines created for the same combination of project, commit, and user.
-- 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 left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Network**.
-1. Expand **Pipelines Rate Limits**.
-1. Under **Max requests per minute**, enter a value greater than `0`.
-1. Select **Save changes**.
-1. Enable `ci_enforce_throttle_pipelines_creation` feature flag to enable the rate limit.
+<!-- This redirect file can be deleted after <2023-10-12>. -->
+<!-- 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/admin_area/settings/rate_limit_on_projects_api.md b/doc/user/admin_area/settings/rate_limit_on_projects_api.md
index 326dd3b4706..12577ba44b1 100644
--- a/doc/user/admin_area/settings/rate_limit_on_projects_api.md
+++ b/doc/user/admin_area/settings/rate_limit_on_projects_api.md
@@ -1,37 +1,11 @@
---
-type: reference
-stage: Data Stores
-group: Tenant Scale
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+redirect_to: '../../../administration/settings/rate_limit_on_projects_api.md'
+remove_date: '2023-10-12'
---
-# Rate limit on Projects API **(FREE SELF)**
+This document was moved to [another location](../../../administration/settings/rate_limit_on_projects_api.md).
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/112283) in GitLab 15.10 with a [flag](../../../administration/feature_flags.md) named `rate_limit_for_unauthenticated_projects_api_access`. Disabled by default.
-> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/391922) on May 08, 2023.
-> - [Enabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/119603) in GitLab 16.0 by default.
-> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/120445) in GitLab 16.0. Feature flag `rate_limit_for_unauthenticated_projects_api_access` removed.
-
-You can configure the rate limit per IP address for unauthenticated requests to the [list all projects API](../../../api/projects.md#list-all-projects).
-
-To change the rate limit:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Network**.
-1. Expand **Projects API rate limit**.
-1. In the **Maximum requests per 10 minutes per IP address** text box, enter the new value.
-1. Select **Save changes**.
-
-The rate limit:
-
-- Applies per IP address.
-- Doesn't apply to authenticated requests.
-- Can be set to 0 to disable rate limiting.
-
-The default value of the rate limit is `400`.
-
-Requests over the rate limit are logged into the `auth.log` file.
-
-For example, if you set a limit of 400, unauthenticated requests to the `GET /projects` API endpoint that
-exceed a rate of 400 within 10 minutes are blocked. Access to the endpoint is restored after ten minutes have elapsed.
+<!-- This redirect file can be deleted after <2023-10-12>. -->
+<!-- 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/admin_area/settings/rate_limit_on_users_api.md b/doc/user/admin_area/settings/rate_limit_on_users_api.md
index 112518131bf..80acbf21023 100644
--- a/doc/user/admin_area/settings/rate_limit_on_users_api.md
+++ b/doc/user/admin_area/settings/rate_limit_on_users_api.md
@@ -1,34 +1,11 @@
---
-type: reference
-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/product/ux/technical-writing/#assignments
+redirect_to: '../../../administration/settings/rate_limit_on_users_api.md'
+remove_date: '2023-10-12'
---
-# Rate limits on Users API **(FREE SELF)**
+This document was moved to [another location](../../../administration/settings/rate_limit_on_users_api.md).
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78364) in GitLab 14.8.
-
-You can configure the per user rate limit for requests to [Users API](../../../api/users.md).
-
-To change the rate limit:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Network**.
-1. Expand **Users API rate limit**.
-1. In the **Maximum requests per 10 minutes** text box, enter the new value.
-1. Optional. In the **Users to exclude from the rate limit** box, list users allowed to exceed the limit.
-1. Select **Save changes**.
-
-This limit is:
-
-- Applied independently per user.
-- Not applied per IP address.
-
-The default value is `300`.
-
-Requests over the rate limit are logged into the `auth.log` file.
-
-For example, if you set a limit of 300, requests to the `GET /users/:id` API endpoint
-exceeding a rate of 300 per 10 minutes are blocked. Access to the endpoint is allowed after ten minutes have elapsed.
+<!-- This redirect file can be deleted after <2023-10-12>. -->
+<!-- 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/admin_area/settings/rate_limits_on_git_ssh_operations.md b/doc/user/admin_area/settings/rate_limits_on_git_ssh_operations.md
new file mode 100644
index 00000000000..b60a78d1f49
--- /dev/null
+++ b/doc/user/admin_area/settings/rate_limits_on_git_ssh_operations.md
@@ -0,0 +1,11 @@
+---
+redirect_to: '../../../administration/settings/rate_limits_on_git_ssh_operations.md'
+remove_date: '2023-10-12'
+---
+
+This document was moved to [another location](../../../administration/settings/rate_limits_on_git_ssh_operations.md).
+
+<!-- This redirect file can be deleted after <2023-10-12>. -->
+<!-- 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/admin_area/settings/rate_limits_on_raw_endpoints.md b/doc/user/admin_area/settings/rate_limits_on_raw_endpoints.md
index 78e65f7ba7b..5cfee536a58 100644
--- a/doc/user/admin_area/settings/rate_limits_on_raw_endpoints.md
+++ b/doc/user/admin_area/settings/rate_limits_on_raw_endpoints.md
@@ -1,29 +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/product/ux/technical-writing/#assignments
-type: reference
+redirect_to: '../../../administration/settings/rate_limits_on_raw_endpoints.md'
+remove_date: '2023-10-12'
---
-# Rate limits on raw endpoints **(FREE SELF)**
+This document was moved to [another location](../../../administration/settings/rate_limits_on_raw_endpoints.md).
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/30635) in GitLab 12.2.
-
-This setting defaults to `300` requests per minute, and allows you to rate limit the requests to raw endpoints:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Network**.
-1. Expand **Performance optimization**.
-
-For example, requests over `300` per minute to `https://gitlab.com/gitlab-org/gitlab-foss/raw/master/app/controllers/application_controller.rb` are blocked. Access to the raw file is released after 1 minute.
-
-![Rate limits on raw endpoints](img/rate_limits_on_raw_endpoints.png)
-
-This limit is:
-
-- Applied independently per project, per file path.
-- Not applied per IP address.
-- Active by default. To disable, set the option to `0`.
-
-Requests over the rate limit are logged into `auth.log`.
+<!-- This redirect file can be deleted after <2023-10-12>. -->
+<!-- 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/admin_area/settings/scim_setup.md b/doc/user/admin_area/settings/scim_setup.md
index 0471dffe442..4ebd8a84f8a 100644
--- a/doc/user/admin_area/settings/scim_setup.md
+++ b/doc/user/admin_area/settings/scim_setup.md
@@ -1,43 +1,11 @@
---
-type: reference, howto
-stage: Manage
-group: Authentication and Authorization
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+redirect_to: '../../../administration/settings/scim_setup.md'
+remove_date: '2023-10-12'
---
-# Configure SCIM for self-managed GitLab instances **(PREMIUM SELF)**
+This document was moved to [another location](../../../administration/settings/scim_setup.md).
-> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/8902) in GitLab 15.8.
-
-You can use the open standard System for Cross-domain Identity Management (SCIM) to automatically:
-
-- Create users.
-- Block users.
-
-The [internal GitLab SCIM API](../../../development/internal_api/index.md#instance-scim-api) implements part of [the RFC7644 protocol](https://www.rfc-editor.org/rfc/rfc7644).
-
-If you are a GitLab.com user, see [configuring SCIM for GitLab.com groups](../../../user/group/saml_sso/scim_setup.md).
-
-## Configure GitLab
-
-Prerequisites:
-
-- Configure [SAML single sign-on](../../../integration/saml.md).
-
-To configure GitLab SCIM:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand the **SCIM Token** section and select **Generate a SCIM token**.
-1. For configuration of your identity provider, save the:
- - Token from the **Your SCIM token** field.
- - URL from the **SCIM API endpoint URL** field.
-
-## Remove access
-
-Removing or deactivating a user on the identity provider blocks the user on
-the GitLab instance, while the SCIM identity remains linked to the GitLab user.
-
-To update the user SCIM identity, use the
-[internal GitLab SCIM API](../../../development/internal_api/index.md#update-a-single-scim-provisioned-user-1).
+<!-- This redirect file can be deleted after <2023-10-12>. -->
+<!-- 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/admin_area/settings/security_and_compliance.md b/doc/user/admin_area/settings/security_and_compliance.md
index 54fd04f6521..8c1e514c575 100644
--- a/doc/user/admin_area/settings/security_and_compliance.md
+++ b/doc/user/admin_area/settings/security_and_compliance.md
@@ -1,25 +1,11 @@
---
-stage: Secure
-group: Composition Analysis
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-type: howto
+redirect_to: '../../../administration/settings/security_and_compliance.md'
+remove_date: '2023-10-13'
---
-# Security and Compliance Admin Area settings **(ULTIMATE SELF)**
+This document was moved to [another location](../../../administration/settings/security_and_compliance.md).
-The settings for package metadata synchronization are located in the [Admin Area](index.md).
-
-## Choose package registry metadata to sync
-
-WARNING:
-The full package metadata sync can add up to 30 GB to the PostgreSQL database. Ensure you have provisioned enough disk space for the database before enabling this feature.
-We are actively working on reducing this data size in [epic 10415](https://gitlab.com/groups/gitlab-org/-/epics/10415).
-
-To choose the packages you want to synchronize with the GitLab License Database for [License Compliance](../../compliance/license_scanning_of_cyclonedx_files/index.md):
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Security and Compliance**.
-1. Expand **License Compliance**.
-1. Select or clear checkboxes for the package registries that you want to sync.
-1. Select **Save changes**.
+<!-- This redirect file can be deleted after <2023-10-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/user/admin_area/settings/sidekiq_job_limits.md b/doc/user/admin_area/settings/sidekiq_job_limits.md
index 08c3ced4c4e..81be26ec8e0 100644
--- a/doc/user/admin_area/settings/sidekiq_job_limits.md
+++ b/doc/user/admin_area/settings/sidekiq_job_limits.md
@@ -1,35 +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/product/ux/technical-writing/#assignments
-type: reference
+redirect_to: '../../../administration/settings/sidekiq_job_limits.md'
+remove_date: '2023-10-13'
---
-# Sidekiq job size limits **(FREE SELF)**
+This document was moved to [another location](../../../administration/settings/sidekiq_job_limits.md).
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68982) in GitLab 14.3.
-
-[Sidekiq](../../../administration/sidekiq/index.md) jobs get stored in
-Redis. To avoid excessive memory for Redis, we:
-
-- Compress job arguments before storing them in Redis.
-- Reject jobs that exceed the specified threshold limit after compression.
-
-To access Sidekiq job size limits:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Preferences**.
-1. Expand **Sidekiq job size limits**.
-1. Adjust the compression threshold or size limit. The compression can
- be disabled by selecting the **Track** mode.
-
-## Available settings
-
-| Setting | Default | Description |
-|-------------------------------------------|------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| Limiting mode | Compress | This mode compresses the jobs at the specified threshold and rejects them if they exceed the specified limit after compression. |
-| Sidekiq job compression threshold (bytes) | 100 000 (100 KB) | When the size of arguments exceeds this threshold, they are compressed before being stored in Redis. |
-| Sidekiq job size limit (bytes) | 0 | The jobs exceeding this size after compression are rejected. This avoids excessive memory usage in Redis leading to instability. Setting it to 0 prevents rejecting jobs. |
-
-After changing these values, [restart Sidekiq](../../../administration/restart_gitlab.md).
+<!-- This redirect file can be deleted after <2023-10-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/user/admin_area/settings/sign_in_restrictions.md b/doc/user/admin_area/settings/sign_in_restrictions.md
index 3b79e55f998..c3957ed97eb 100644
--- a/doc/user/admin_area/settings/sign_in_restrictions.md
+++ b/doc/user/admin_area/settings/sign_in_restrictions.md
@@ -1,201 +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/product/ux/technical-writing/#assignments
+redirect_to: '../../../administration/settings/sign_in_restrictions.md'
+remove_date: '2023-10-13'
---
-# Sign-in restrictions **(FREE SELF)**
+This document was moved to [another location](../../../administration/settings/sign_in_restrictions.md).
-You can use **Sign-in restrictions** to customize authentication restrictions for web interfaces as well as Git over HTTP(S).
-
-## Settings
-
-To access sign-in restriction settings:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand the **Sign-in restrictions** section.
-
-## Password authentication enabled
-
-You can restrict the password authentication for web interface and Git over HTTP(S):
-
-- **Web interface**: When this feature is disabled, the **Standard** sign-in tab
- is removed and an [external authentication provider](../../../administration/auth/index.md)
- must be used.
-- **Git over HTTP(S)**: When this feature is disabled, a [Personal Access Token](../../profile/personal_access_tokens.md)
- or LDAP password must be used to authenticate.
-
-In the event of an external authentication provider outage, use the [GitLab Rails console](../../../administration/operations/rails_console.md) to [re-enable the standard web sign-in form](#re-enable-standard-web-sign-in-form-in-rails-console). This configuration can also be changed over the [Application settings REST API](../../../api/settings.md#change-application-settings) while authenticating with an administrator account's personal access token.
-
-## Admin Mode
-
-> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2158) in GitLab 13.10.
-
-If you're an administrator, you might want to work in GitLab without administrator access.
-You could either create a separate user account that does not have
-administrator access or use Admin Mode.
-
-With Admin Mode, your account does not have administrator access by default.
-You can continue to access groups and projects you're a member of. However, for administrative tasks,
-you must authenticate (except for [certain features](#limitations-of-admin-mode)).
-
-When Admin Mode is enabled, it applies to all administrators on the instance.
-
-When Admin Mode is enabled for an instance, administrators:
-
-- Are allowed to access group and projects for which they are members.
-- Cannot access the **Admin Area**.
-
-### Enable Admin Mode for your instance
-
-Administrators can enable Admin Mode though the API, the Rails console, or the UI.
-
-#### Use the API to enable Admin Mode
-
-Make the following request to your instance endpoint:
-
-```shell
-curl --request PUT --header "PRIVATE-TOKEN:$ADMIN_TOKEN" "<gitlab.example.com>/api/v4/application/settings?admin_mode=true"
-```
-
-Replace `<gitlab.example.com>` with your instance URL.
-
-For more information, see the [list of settings that can be accessed through API calls](../../../api/settings.md).
-
-#### Use the Rails console to enable Admin Mode
-
-Open the [Rails console](../../../administration/operations/rails_console.md) and run the following:
-
-```ruby
-::Gitlab::CurrentSettings.update!(admin_mode: true)
-```
-
-#### Use the UI to enable Admin Mode
-
-To enable Admin Mode through the UI:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand **Sign-in restrictions**.
-1. In the **Admin Mode** section, select the **Require additional authentication for administrative tasks** checkbox.
-
-### Turn on Admin Mode for your session
-
-To turn on Admin Mode for your current session and access potentially dangerous resources:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Enter Admin Mode**.
-1. Try to access any part of the UI with `/admin` in the URL (which requires administrator access).
-
-When Admin Mode status is disabled or turned off, administrators cannot access resources unless
-they've been explicitly granted access. For example, administrators get a `404` error
-if they try to open a private group or project, unless they are members of that group or project.
-
-2FA should be enabled for administrators. 2FA, OmniAuth providers, and LDAP
-authentication are supported by Admin Mode. Admin Mode status is stored in the current user session and remains active until either:
-
-- It is explicitly disabled.
-- It is disabled automatically after six hours.
-
-### Turn off Admin Mode for your session
-
-To turn off Admin Mode for your current session:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Leave Admin Mode**.
-
-### Limitations of Admin Mode
-
-Admin Mode times out after six hours, and you cannot change this timeout limit.
-
-The following access methods are **not** protected by Admin Mode:
-
-- Git client access (SSH using public keys or HTTPS using Personal Access Tokens).
-- API access using a Personal Access Token.
-
-In other words, administrators who are otherwise limited by Admin Mode can still use
-Git clients, and access RESTful API endpoints as administrators, without additional
-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).
-
-Also, when GitLab Geo is enabled, you can't view the replication status of projects and designs while
-on a secondary node. A fix is proposed when projects ([issue 367926](https://gitlab.com/gitlab-org/gitlab/-/issues/367926)) and designs ([issue 355660](https://gitlab.com/gitlab-org/gitlab/-/issues/355660)) move to the new Geo framework.
-
-### Troubleshooting Admin Mode
-
-If necessary, you can disable **Admin Mode** as an administrator by using one of these two methods:
-
-- **API**:
-
- ```shell
- curl --request PUT --header "PRIVATE-TOKEN:$ADMIN_TOKEN" "<gitlab-url>/api/v4/application/settings?admin_mode=false"
- ```
-
-- [**Rails console**](../../../administration/operations/rails_console.md#starting-a-rails-console-session):
-
- ```ruby
- ::Gitlab::CurrentSettings.update!(admin_mode: false)
- ```
-
-## Two-factor authentication
-
-When this feature is enabled, all users must use the [two-factor authentication](../../profile/account/two_factor_authentication.md).
-
-After the two-factor authentication is configured as mandatory, users are allowed
-to skip forced configuration of two-factor authentication for the configurable grace
-period in hours.
-
-![Two-factor grace period](img/two_factor_grace_period.png)
-
-## Email notification for unknown sign-ins
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/218457) in GitLab 13.2.
-
-When enabled, GitLab notifies users of sign-ins from unknown IP addresses or devices. For more information,
-see [Email notification for unknown sign-ins](../../profile/notifications.md#notifications-for-unknown-sign-ins).
-
-![Email notification for unknown sign-ins](img/email_notification_for_unknown_sign_ins_v13_2.png)
-
-## Sign-in information
-
-All users that are not logged in are redirected to the page represented by the configured
-**Home page URL** if value is not empty.
-
-All users are redirected to the page represented by the configured **Sign-out page URL**
-after sign out if value is not empty.
-
-In the **Sign-in restrictions** section, scroll to the **Sign-in text** field. You can add a
-custom message for your users in Markdown format.
-
-For example, if you include the following information in the noted text box:
-
-```markdown
-# Custom sign-in text
-
-To access this text box:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand the **Sign-in restrictions** section.
-```
-
-Your users see the **Custom sign-in text** when they navigate to the sign-in screen for your
-GitLab instance.
-
-## Troubleshooting
-
-### Re-enable standard web sign-in form in rails console
-
-Re-enable the standard username and password-based sign-in form if it was disabled as a [Sign-in restriction](#password-authentication-enabled).
-
-You can use this method through the [rails console](../../../administration/operations/rails_console.md#starting-a-rails-console-session) when a configured external authentication provider (through SSO or an LDAP configuration) is facing an outage and direct sign-in access to GitLab is required.
-
-```ruby
-Gitlab::CurrentSettings.update!(password_authentication_enabled_for_web: true)
-```
+<!-- This redirect file can be deleted after <2023-10-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/user/admin_area/settings/sign_up_restrictions.md b/doc/user/admin_area/settings/sign_up_restrictions.md
index 0dcca5e7518..553caa9ff0d 100644
--- a/doc/user/admin_area/settings/sign_up_restrictions.md
+++ b/doc/user/admin_area/settings/sign_up_restrictions.md
@@ -1,206 +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/product/ux/technical-writing/#assignments
-type: reference
+redirect_to: '../../../administration/settings/sign_up_restrictions.md'
+remove_date: '2023-10-13'
---
-# Sign-up restrictions **(FREE SELF)**
+This document was moved to [another location](../../../administration/settings/sign_up_restrictions.md).
-You can enforce the following restrictions on sign ups:
-
-- Disable new sign ups.
-- Require administrator approval for new sign ups.
-- Require user email confirmation.
-- Allow or deny sign ups using specific email domains.
-
-## Disable new sign ups
-
-By default, any user visiting your GitLab domain can sign up for an account. For customers running
-public-facing GitLab instances, we **highly** recommend that you consider disabling new sign ups if
-you do not expect public users to sign up for an account.
-
-To disable sign ups:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand **Sign-up restrictions**.
-1. Clear the **Sign-up enabled** checkbox, then select **Save changes**.
-
-## Require administrator approval for new sign ups
-
-> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4491) in GitLab 13.5.
-> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/267568) in GitLab 13.6.
-
-When this setting is enabled, any user visiting your GitLab domain and signing up for a new account using the registration form
-must be explicitly [approved](../moderate_users.md#approve-or-reject-a-user-sign-up) by an
-administrator before they can start using their account. In GitLab 13.6 and later, this setting is
-enabled by default for new GitLab instances. It is only applicable if sign ups are enabled.
-
-To require administrator approval for new sign ups:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand **Sign-up restrictions**.
-1. Select the **Require admin approval for new sign-ups** checkbox, then select **Save changes**.
-
-In [GitLab 13.7 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/273258), if an administrator disables this setting, the users in pending approval state are
-automatically approved in a background job.
-
-NOTE:
-This setting doesn't apply to LDAP or OmniAuth users. To enforce approvals for new users
-signing up using OmniAuth or LDAP, set `block_auto_created_users` to `true` in the
-[OmniAuth configuration](../../../integration/omniauth.md#configure-common-settings) or
-[LDAP configuration](../../../administration/auth/ldap/index.md#basic-configuration-settings).
-A [user cap](#user-cap) can also be used to enforce approvals for new users.
-
-## Confirm user email
-
-> - Soft email confirmation [introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/47003) in GitLab 12.2 [with a flag](../../../operations/feature_flags.md) named `soft_email_confirmation`.
-> - Soft email confirmation [changed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107302/diffs) from a feature flag to an application setting in GitLab 15.9.
-
-You can send confirmation emails during sign up and require that users confirm
-their email address before they are allowed to sign in.
-
-For example, to enforce confirmation of the email address used for new sign ups:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand **Sign-up restrictions**.
-1. Under **Email confirmation settings**, select **Hard**.
-
-The following settings are available:
-
-- **Hard** - Send a confirmation email during sign up. New users must confirm their email address before they can log in.
-- **Soft** - Send a confirmation email during sign up. New users can log in immediately, but must confirm their email in three days. Unconfirmed accounts are deleted.
-- **Off** - New users can sign up without confirming their email address.
-
-## User cap
-
-> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4315) in GitLab 13.7.
-> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/292600) in GitLab 13.9.
-
-When the number of billable users reaches the user cap, any user who is added or requests access must be
-[approved](../moderate_users.md#approve-or-reject-a-user-sign-up) by an administrator before they can start using
-their account.
-
-If an administrator [increases](#set-the-user-cap-number) or [removes](#remove-the-user-cap) the
-user cap, the users in pending approval state are automatically approved in a background job.
-
-NOTE:
-The amount of billable users [is updated once a day](../../../subscriptions/self_managed/index.md#billable-users).
-This means the user cap might apply only retrospectively after the cap has already been exceeded.
-To ensure the cap is enabled immediately, set it to a low value below the current number of
-billable users, for example: `1`.
-
-On instances that use LDAP or OmniAuth, enabling and disabling
-[administrator approval for new sign ups](#require-administrator-approval-for-new-sign-ups)
-involves changing the Rails configuration, and may require downtime.
-User cap can be used instead. As noted above, set the cap to value that ensures it is enforced immediately.
-
-### Set the user cap number
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand **Sign-up restrictions**.
-1. Enter a number in **User cap**.
-1. Select **Save changes**.
-
-New user sign ups are subject to the user cap restriction.
-
-## Remove the user cap
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand **Sign-up restrictions**.
-1. Remove the number from **User cap**.
-1. Select **Save changes**.
-
-New users sign ups are not subject to the user cap restriction. Users in pending approval state are
-automatically approved in a background job.
-
-## Minimum password length limit
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20661) in GitLab 12.6
-
-You can [change](../../../security/password_length_limits.md#modify-minimum-password-length)
-the minimum number of characters a user must have in their password using the GitLab UI.
-
-### Password complexity requirements **(PREMIUM SELF)**
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/354965) in GitLab 15.2.
-
-By default, the only requirement for user passwords is [minimum password length](#minimum-password-length-limit).
-You can add additional complexity requirements. Changes to password complexity requirements apply to new passwords:
-
-- For new users that sign up.
-- For existing users that reset their password.
-
-Existing passwords are unaffected. To change password complexity requirements:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand **Sign-up restrictions**.
-1. Under **Minimum password length (number of characters)**, select additional password complexity requirements. You can require numbers, uppercase letters, lowercase letters,
- and symbols.
-1. Select **Save changes**.
-
-## Allow or deny sign ups using specific email domains
-
-You can specify an inclusive or exclusive list of email domains which can be used for user sign up.
-
-These restrictions are only applied during sign up from an external user. An administrator can add a
-user through the administrator panel with a disallowed domain. The users can also change their
-email addresses to disallowed domains after sign up.
-
-### Allowlist email domains
-
-You can restrict users only to sign up using email addresses matching the given
-domains list.
-
-### Denylist email domains
-
-You can block users from signing up when using an email addresses of specific domains. This can
-reduce the risk of malicious users creating spam accounts with disposable email addresses.
-
-### Create email domain allowlist or denylist
-
-To create an email domain allowlist or denylist:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand **Sign-up restrictions**.
-1. For the allowlist, you must enter the list manually. For the denylist, you can enter the list
- manually or upload a `.txt` file that contains list entries.
-
- Both the allowlist and denylist accept wildcards. For example, you can use
-`*.company.com` to accept every `company.com` subdomain, or `*.io` to block all
-domains ending in `.io`. Domains must be separated by a whitespace,
-semicolon, comma, or a new line.
-
- ![Domain Denylist](img/domain_denylist_v14_1.png)
-
-## Set up LDAP user filter
-
-You can limit GitLab access to a subset of the LDAP users on your LDAP server.
-
-See the [documentation on setting up an LDAP user filter](../../../administration/auth/ldap/index.md#set-up-ldap-user-filter) for more information.
-
-<!-- ## 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, for example `### 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 <2023-10-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/user/admin_area/settings/slack_app.md b/doc/user/admin_area/settings/slack_app.md
new file mode 100644
index 00000000000..5aae85081ed
--- /dev/null
+++ b/doc/user/admin_area/settings/slack_app.md
@@ -0,0 +1,109 @@
+---
+stage: Manage
+group: Import and Integrate
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# GitLab for Slack app administration **(FREE SELF)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/358872) for self-managed instances in GitLab 16.2.
+
+NOTE:
+This page contains information about administering the GitLab for Slack app for self-managed instances. For user documentation, see [GitLab for Slack app](../../../user/project/integrations/gitlab_slack_application.md).
+
+The GitLab for Slack app distributed through the Slack App Directory only works with GitLab.com.
+On self-managed GitLab, you can create your own copy of the GitLab for Slack app from a [manifest file](https://api.slack.com/reference/manifests#creating_apps) and configure your instance.
+
+The app is a private one-time copy installed in your Slack workspace only and not distributed through the Slack App Directory. To have the [GitLab for Slack app](../../../user/project/integrations/gitlab_slack_application.md) on your self-managed instance, you must enable the integration.
+
+## Create a GitLab for Slack app
+
+Prerequisite:
+
+- You must be at least a [Slack workspace administrator](https://slack.com/help/articles/360018112273-Types-of-roles-in-Slack).
+
+To create a GitLab for Slack app:
+
+- **In GitLab**:
+
+ 1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+ 1. Select **Admin Area**.
+ 1. On the left sidebar, select **Settings > General**.
+ 1. Expand **GitLab for Slack app**.
+ 1. Select **Create Slack app**.
+
+You're then redirected to Slack for the next steps.
+
+- **In Slack**:
+
+ 1. Select the Slack workspace to create the app in, then select **Next**.
+ 1. Slack displays a summary of the app for review. To view the complete manifest, select **Edit Configurations**. To go back to the review summary, select **Next**.
+ 1. Select **Create**.
+ 1. Select **Got it** to close the dialog.
+ 1. Select **Install to Workspace**.
+
+## Configure the settings
+
+After you've [created a GitLab for Slack app](#create-a-gitlab-for-slack-app), you can configure the settings in GitLab:
+
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. On the left sidebar, select **Settings > General**.
+1. Expand **GitLab for Slack app**.
+1. Select the **Enable GitLab for Slack app** checkbox.
+1. Enter the details of your GitLab for Slack app:
+ 1. Go to [Slack API](https://api.slack.com/apps).
+ 1. Search for and select **GitLab (\<your host name\>)**.
+ 1. Scroll to **App Credentials**.
+1. Select **Save changes**.
+
+### Test your configuration
+
+To test your GitLab for Slack app configuration:
+
+1. Enter the `/gitlab help` slash command into a channel in your Slack workspace.
+1. Press <kbd>Enter</kbd>.
+
+You should see a list of available Slash commands.
+
+To use Slash commands for a project, configure the [GitLab for Slack app](../../../user/project/integrations/gitlab_slack_application.md) for the project.
+
+## Update the GitLab for Slack app
+
+When GitLab releases new features for the GitLab for Slack app, you might have to manually update your copy to use the new features.
+
+To update your copy of the GitLab for Slack app:
+
+- **In GitLab**:
+
+ 1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+ 1. Select **Admin Area**.
+ 1. On the left sidebar, select **Settings > General**.
+ 1. Expand **GitLab for Slack app**.
+ 1. Select **Download latest manifest file** to download `slack_manifest.json`.
+
+- **In Slack**:
+
+ 1. Go to [Slack API](https://api.slack.com/apps).
+ 1. Search for and select **GitLab (\<your host name\>)**.
+ 1. On the left sidebar, select **App Manifest**.
+ 1. Select the **JSON** tab to switch to a JSON view of the manifest.
+ 1. Copy the contents of the `slack_manifest.json` file you've downloaded from GitLab.
+ 1. Paste the contents into the JSON viewer to replace any existing contents.
+ 1. Select **Save Changes**.
+
+## Connectivity requirements
+
+To enable the GitLab for Slack app functionality, your network must allow inbound and outbound connections between GitLab and Slack.
+
+- For [Slack notifications](../../../user/project/integrations/gitlab_slack_application.md#slack-notifications), the GitLab instance must be able to send requests to `https://slack.com`.
+- For [Slash commands](../../../user/project/integrations/gitlab_slack_application.md#slash-commands) and other features, the GitLab instance must be able to receive requests from `https://slack.com`.
+
+## Troubleshooting
+
+### Slash commands return `/gitlab failed with the error "dispatch_failed"` in Slack
+
+Slash commands might return `/gitlab failed with the error "dispatch_failed"` in Slack. To resolve this issue, ensure:
+
+- The GitLab for Slack app is properly [configured](#configure-the-settings), and the **Enable GitLab for Slack app** checkbox is selected.
+- Your GitLab instance [allows requests to and from Slack](#connectivity-requirements).
diff --git a/doc/user/admin_area/settings/terms.md b/doc/user/admin_area/settings/terms.md
index 8563f778292..444eeeb15ea 100644
--- a/doc/user/admin_area/settings/terms.md
+++ b/doc/user/admin_area/settings/terms.md
@@ -1,49 +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/product/ux/technical-writing/#assignments
-type: reference
+redirect_to: '../../../administration/settings/terms.md'
+remove_date: '2023-10-13'
---
-# Terms of Service and Privacy Policy **(FREE SELF)**
+This document was moved to [another location](../../../administration/settings/terms.md).
-An administrator can enforce acceptance of a terms of service and privacy policy.
-When this option is enabled, new and existing users must accept the terms.
-
-When enabled, you can view the Terms of Service at the `-/users/terms` page on the instance,
-for example `https://gitlab.example.com/-/users/terms`.
-
-## Enforce a Terms of Service and Privacy Policy
-
-To enforce acceptance of a Terms of Service and Privacy Policy:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand the **Terms of Service and Privacy Policy** section.
-1. Check the **All users must accept the Terms of Service and Privacy Policy to access GitLab** checkbox.
-1. Input the text of the **Terms of Service and Privacy Policy**. You can use [Markdown](../../markdown.md)
- in this text box.
-1. Select **Save changes**.
-
-For each update to the terms, a new version is stored. When a user accepts or declines the terms,
-GitLab records which version they accepted or declined.
-
-Existing users must accept the terms on their next GitLab interaction.
-If an authenticated user declines the terms, they are signed out.
-
-When enabled, it adds a mandatory checkbox to the sign up page for new users:
-
-![Sign up form](img/sign_up_terms.png)
-
-<!-- ## 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, for example `### 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 <2023-10-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/user/admin_area/settings/terraform_limits.md b/doc/user/admin_area/settings/terraform_limits.md
index 0e620bb84ce..8fed7589bb7 100644
--- a/doc/user/admin_area/settings/terraform_limits.md
+++ b/doc/user/admin_area/settings/terraform_limits.md
@@ -1,28 +1,11 @@
---
-stage: Deploy
-group: Environments
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-type: reference
+redirect_to: '../../../administration/settings/terraform_limits.md'
+remove_date: '2023-10-13'
---
-# Terraform limits **(FREE SELF)**
+This document was moved to [another location](../../../administration/settings/terraform_limits.md).
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/352951) in GitLab 15.7.
-
-You can limit the total storage of [Terraform state files](../../../administration/terraform_state.md).
-The limit applies to each individual
-state file version, and is checked whenever a new version is created.
-
-To add a storage limit:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Preferences**.
-1. Expand **Terraform limits**.
-1. Adjust the size limit.
-
-## Available settings
-
-| Setting | Default | Description |
-|------------------------------------|---------|---------------------------------------------------------------------------------------------------------------------------------------------------------|
-| Terraform state size limit (bytes) | 0 | Terraform state files that exceed this size are not saved, and associated Terraform operations are rejected. Set to 0 to allow files of unlimited size. |
+<!-- This redirect file can be deleted after <2023-10-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/user/admin_area/settings/third_party_offers.md b/doc/user/admin_area/settings/third_party_offers.md
index 39e2275f411..54c5b36bbc0 100644
--- a/doc/user/admin_area/settings/third_party_offers.md
+++ b/doc/user/admin_area/settings/third_party_offers.md
@@ -1,38 +1,11 @@
---
-stage: Data Stores
-group: Tenant Scale
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-type: reference
+redirect_to: '../../../administration/settings/third_party_offers.md'
+remove_date: '2023-10-13'
---
-# Customer experience improvement and third-party offers **(FREE SELF)**
+This document was moved to [another location](../../../administration/settings/third_party_offers.md).
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/20379) in GitLab 11.1.
-
-Within GitLab, we inform users of available third-party offers they might find valuable in order
-to enhance the development of their projects. An example is the Google Cloud Platform free credit
-for using [Google Kubernetes Engine](https://cloud.google.com/kubernetes-engine/).
-
-Furthermore, we use content to improve customer experience. An example are the personalization
-questions when creating a group.
-
-To toggle the display of customer experience improvement content and third-party offers:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand **Customer experience improvement and third-party offers**.
-1. Select **Do not display content for customer experience improvement and offers from third parties**.
-1. Select **Save changes**.
-
-<!-- ## 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, for example `### 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 <2023-10-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/user/admin_area/settings/usage_statistics.md b/doc/user/admin_area/settings/usage_statistics.md
index ed0c8d21931..5b2afd3ad90 100644
--- a/doc/user/admin_area/settings/usage_statistics.md
+++ b/doc/user/admin_area/settings/usage_statistics.md
@@ -1,230 +1,11 @@
---
-stage: Analytics
-group: Analytics Instrumentation
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+redirect_to: '../../../administration/settings/usage_statistics.md'
+remove_date: '2023-10-13'
---
-# Usage statistics **(FREE SELF)**
+This document was moved to [another location](../../../administration/settings/usage_statistics.md).
-GitLab Inc. periodically collects information about your instance in order
-to perform various actions.
-
-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/internal_analytics/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.
-
-### 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:
-
-- 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 [Customer Success Managers (CSMs)](https://handbook.gitlab.com/job-families/sales/customer-success-management/) 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).
-- [Group access restriction by IP address](../../group/access_and_permissions.md#restrict-group-access-by-ip-address).
-
-### Features available in 16.0 and later
-
-- [View description change history](../../../user/discussions/index.md#view-description-change-history).
-- [Maintenance mode](../../../administration/maintenance_mode/index.md).
-- [Configurable issue boards](../../project/issue_board.md#configurable-issue-boards).
-- [Coverage-guided fuzz testing](../../application_security/coverage_fuzzing/index.md).
-- [Password complexity requirements](../../../user/admin_area/settings/sign_up_restrictions.md#password-complexity-requirements).
-
-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 left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. 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
-
-If enabled, version check informs you if a new version is available and the
-importance of it through a status. The status displays on the help pages (`/help`)
-for all authenticated users, and on the Admin Area pages. The statuses are:
-
-- Green: You are running the latest version of GitLab.
-- Orange: An updated version of GitLab is available.
-- Red: The version of GitLab you are running is vulnerable. You should install
- the latest version with security fixes as soon as possible.
-
-![Orange version check example](img/update-available.png)
-
-GitLab Inc. collects your instance's version and hostname (through the HTTP
-referer) as part of the version check. No other information is collected.
-
-This information is used, among other things, to identify to which versions
-patches must be backported, making sure active GitLab instances remain
-secure.
-
-If you [disable version check](#enable-or-disable-usage-statistics), this information isn't collected.
-
-### Request flow example
-
-The following example shows a basic request/response flow between a
-self-managed GitLab instance and the GitLab Version Application:
-
-```mermaid
-sequenceDiagram
- participant GitLab instance
- participant Version Application
- GitLab instance->>Version Application: Is there a version update?
- loop Version Check
- Version Application->>Version Application: Record version info
- end
- Version Application->>GitLab instance: Response (PNG/SVG)
-```
-
-## Configure your network
-
-To send usage statistics to GitLab Inc., you must allow network traffic from your
-GitLab instance to the host `version.gitlab.com` on port `443`.
-
-If your GitLab instance is behind a proxy, set the appropriate
-[proxy configuration variables](https://docs.gitlab.com/omnibus/settings/environment-variables.html).
-
-## Enable or disable usage statistics
-
-To enable or disable Service Ping and version check:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Metrics and profiling**.
-1. Expand **Usage statistics**.
-1. Select or clear the **Enable version check** and **Enable Service Ping** checkboxes.
-1. Select **Save changes**.
-
-NOTE:
-Service Ping settings only control whether the data is being shared with GitLab, or used only internally.
-Even if you disable Service Ping, the `gitlab_service_ping_worker` background job still periodically generates a Service Ping payload for your instance.
-The payload is available in the [Service Usage data](#manually-upload-service-ping-payload) admin section.
-
-## 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/internal_analytics/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 left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. 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/internal_analytics/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/internal_analytics/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 left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. 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.
-
-If there are problems with the manual upload:
-
-1. Open a confidential issue in the [security fork of version app project](https://gitlab.com/gitlab-org/security/version.gitlab.com).
-1. Attach the JSON payload if possible.
-1. Tag `@gitlab-org/analytics-section/analytics-instrumentation` who will triage the issue.
-
-<!-- ## 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, for example `### 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 <2023-10-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/user/admin_area/settings/user_and_ip_rate_limits.md b/doc/user/admin_area/settings/user_and_ip_rate_limits.md
index d145c351f3e..fae47358879 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
@@ -1,240 +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/product/ux/technical-writing/#assignments
-type: reference
+redirect_to: '../../../administration/settings/user_and_ip_rate_limits.md'
+remove_date: '2023-10-14'
---
-# User and IP rate limits **(FREE SELF)**
+This document was moved to [another location](../../../administration/settings/user_and_ip_rate_limits.md).
-Rate limiting is a common technique used to improve the security and durability
-of a web application. For more details, see
-[Rate limits](../../../security/rate_limits.md).
-
-The following limits are disabled by default:
-
-- [Unauthenticated API requests (per IP)](#enable-unauthenticated-api-request-rate-limit).
-- [Unauthenticated web requests (per IP)](#enable-unauthenticated-web-request-rate-limit).
-- [Authenticated API requests (per user)](#enable-authenticated-api-request-rate-limit).
-- [Authenticated web requests (per user)](#enable-authenticated-web-request-rate-limit).
-
-NOTE:
-By default, all Git operations are first tried unauthenticated. Because of this, HTTP Git operations
-may trigger the rate limits configured for unauthenticated requests.
-
-NOTE:
-[In GitLab 14.8 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/344807),
-the rate limits for API requests don't affect requests made by the frontend, as these are always
-counted as web traffic.
-
-## Enable unauthenticated API request rate limit
-
-To enable the unauthenticated request rate limit:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Network**.
-1. Expand **User and IP rate limits**.
-1. Select **Enable unauthenticated API request rate limit**.
-
- - Optional. Update the **Maximum unauthenticated API requests per rate limit period per IP** value.
- Defaults to `3600`.
- - Optional. Update the **Unauthenticated rate limit period in seconds** value.
- Defaults to `3600`.
-
-## Enable unauthenticated web request rate limit
-
-To enable the unauthenticated request rate limit:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Network**.
-1. Expand **User and IP rate limits**.
-1. Select **Enable unauthenticated web request rate limit**.
-
- - Optional. Update the **Maximum unauthenticated web requests per rate limit period per IP** value.
- Defaults to `3600`.
- - Optional. Update the **Unauthenticated rate limit period in seconds** value.
- Defaults to `3600`.
-
-## Enable authenticated API request rate limit
-
-To enable the authenticated API request rate limit:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Network**.
-1. Expand **User and IP rate limits**.
-1. Select **Enable authenticated API request rate limit**.
-
- - Optional. Update the **Maximum authenticated API requests per rate limit period per user** value.
- Defaults to `7200`.
- - Optional. Update the **Authenticated API rate limit period in seconds** value.
- Defaults to `3600`.
-
-## Enable authenticated web request rate limit
-
-To enable the unauthenticated request rate limit:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Network**.
-1. Expand **User and IP rate limits**.
-1. Select **Enable authenticated web request rate limit**.
-
- - Optional. Update the **Maximum authenticated web requests per rate limit period per user** value.
- Defaults to `7200`.
- - Optional. Update the **Authenticated web rate limit period in seconds** value.
- Defaults to `3600`.
-
-## Use a custom rate limit response
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/50693) in GitLab 13.8.
-
-A request that exceeds a rate limit returns a `429` response code and a
-plain-text body, which by default is `Retry later`.
-
-To use a custom response:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > Network**.
-1. Expand **User and IP rate limits**.
-1. In the **Plain-text response to send to clients that hit a rate limit** text box,
- add the plain-text response message.
-
-## Response headers
-
-> [Introduced](https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/731) in GitLab 13.8, the `RateLimit` headers. `Retry-After` was introduced in an earlier version.
-
-When a client exceeds the associated rate limit, the following requests are
-blocked. The server may respond with rate-limiting information allowing the
-requester to retry after a specific period of time. These information are
-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-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`. |
-| `RateLimit-Reset` | `1609844400` | [Unix time](https://en.wikipedia.org/wiki/Unix_time)-formatted time when the request quota is reset. |
-| `RateLimit-ResetTime` | `Tue, 05 Jan 2021 11:00:00 GMT` | [RFC2616](https://www.rfc-editor.org/rfc/rfc2616#section-3.3.1)-formatted date and time when the request quota is reset. |
-| `Retry-After` | `30` | Remaining duration **in seconds** until the quota is reset. This is a [standard HTTP header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After). |
-
-## Use an HTTP header to bypass rate limiting
-
-> [Introduced](https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/622) in GitLab 13.6.
-
-Depending on the needs of your organization, you may want to enable rate limiting
-but have some requests bypass the rate limiter.
-
-You can do this by marking requests that should bypass the rate limiter with a custom
-header. You must do this somewhere in a load balancer or reverse proxy in front of
-GitLab. For example:
-
-1. Pick a name for your bypass header. For example, `Gitlab-Bypass-Rate-Limiting`.
-1. Configure your load balancer to set `Gitlab-Bypass-Rate-Limiting: 1` on requests
- that should bypass GitLab rate limiting.
-1. Configure your load balancer to either:
- - Erase `Gitlab-Bypass-Rate-Limiting`.
- - Set `Gitlab-Bypass-Rate-Limiting` to a value other than `1` on all requests that
- should be affected by rate limiting.
-1. Set the environment variable `GITLAB_THROTTLE_BYPASS_HEADER`.
- - For [Linux package installations](https://docs.gitlab.com/omnibus/settings/environment-variables.html),
- set `'GITLAB_THROTTLE_BYPASS_HEADER' => 'Gitlab-Bypass-Rate-Limiting'` in `gitlab_rails['env']`.
- - For source installations, set `export GITLAB_THROTTLE_BYPASS_HEADER=Gitlab-Bypass-Rate-Limiting`
- in `/etc/default/gitlab`.
-
-It is important that your load balancer erases or overwrites the bypass
-header on all incoming traffic. Otherwise, you must trust your
-users to not set that header and bypass the GitLab rate limiter.
-
-The bypass works only if the header is set to `1`.
-
-Requests that bypassed the rate limiter because of the bypass header
-are marked with `"throttle_safelist":"throttle_bypass_header"` in
-[`production_json.log`](../../../administration/logs/index.md#production_jsonlog).
-
-To disable the bypass mechanism, make sure the environment variable
-`GITLAB_THROTTLE_BYPASS_HEADER` is unset or empty.
-
-## Allow specific users to bypass authenticated request rate limiting
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49127) in GitLab 13.7.
-
-Similarly to the bypass header described above, it is possible to allow
-a certain set of users to bypass the rate limiter. This only applies
-to authenticated requests: with unauthenticated requests, by definition
-GitLab does not know who the user is.
-
-The allowlist is configured as a comma-separated list of user IDs in
-the `GITLAB_THROTTLE_USER_ALLOWLIST` environment variable. If you want
-users 1, 53 and 217 to bypass the authenticated request rate limiter,
-the allowlist configuration would be `1,53,217`.
-
-- For [Linux package installations](https://docs.gitlab.com/omnibus/settings/environment-variables.html),
- set `'GITLAB_THROTTLE_USER_ALLOWLIST' => '1,53,217'` in `gitlab_rails['env']`.
-- For source installations, set `export GITLAB_THROTTLE_USER_ALLOWLIST=1,53,217`
- in `/etc/default/gitlab`.
-
-Requests that bypassed the rate limiter because of the user allowlist
-are marked with `"throttle_safelist":"throttle_user_allowlist"` in
-[`production_json.log`](../../../administration/logs/index.md#production_jsonlog).
-
-At application startup, the allowlist is logged in [`auth.log`](../../../administration/logs/index.md#authlog).
-
-## Try out throttling settings before enforcing them
-
-> [Introduced](https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/629) in GitLab 13.6.
-
-You can try out throttling settings by setting the `GITLAB_THROTTLE_DRY_RUN` environment variable to
-a comma-separated list of throttle names.
-
-The possible names are:
-
-- `throttle_unauthenticated`
- - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/335300) in GitLab 14.3. Use `throttle_unauthenticated_api` or `throttle_unauthenticated_web` instead.
- `throttle_unauthenticated` is still supported and selects both of them.
-- `throttle_unauthenticated_api`
-- `throttle_unauthenticated_web`
-- `throttle_authenticated_api`
-- `throttle_authenticated_web`
-- `throttle_unauthenticated_protected_paths`
-- `throttle_authenticated_protected_paths_api`
-- `throttle_authenticated_protected_paths_web`
-- `throttle_unauthenticated_packages_api`
-- `throttle_authenticated_packages_api`
-- `throttle_authenticated_git_lfs`
-- `throttle_unauthenticated_files_api`
-- `throttle_authenticated_files_api`
-- `throttle_unauthenticated_deprecated_api`
-- `throttle_authenticated_deprecated_api`
-
-For example, to try out throttles for all authenticated requests to
-non-protected paths can be done by setting
-`GITLAB_THROTTLE_DRY_RUN='throttle_authenticated_web,throttle_authenticated_api'`.
-
-To enable dry run mode for all throttles, the variable can be set to `*`.
-
-Setting a throttle to dry run mode logs a message to the
-[`auth.log`](../../../administration/logs/index.md#authlog) when it would hit the limit, while letting the
-request continue. The log message contains an `env` field set to `track`. The `matched`
-field contains the name of throttle that was hit.
-
-It is important to set the environment variable **before** enabling
-the rate limiting in the settings. The settings in the Admin Area
-take effect immediately, while setting the environment variable
-requires a restart of all the Puma processes.
-
-<!-- ## 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, for example `### 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 <2023-10-14>. -->
+<!-- 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/admin_area/settings/visibility_and_access_controls.md b/doc/user/admin_area/settings/visibility_and_access_controls.md
index dd53efaf518..c9ff105f8c9 100644
--- a/doc/user/admin_area/settings/visibility_and_access_controls.md
+++ b/doc/user/admin_area/settings/visibility_and_access_controls.md
@@ -1,363 +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/product/ux/technical-writing/#assignments"
-type: reference
+redirect_to: '../../../administration/settings/visibility_and_access_controls.md'
+remove_date: '2023-10-14'
---
-# Control access and visibility **(FREE SELF)**
+This document was moved to [another location](../../../administration/settings/visibility_and_access_controls.md).
-GitLab enables users with administrator access to enforce
-specific controls on branches, projects, snippets, groups, and more.
-
-To access the visibility and access control options:
-
-1. Sign in to GitLab as a user with Administrator access level.
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand the **Visibility and access controls** section.
-
-## Define which roles can create projects
-
-Instance-level protections for project creation define which roles can
-[add projects to a group](../../group/index.md#specify-who-can-add-projects-to-a-group)
-on the instance. To alter which roles have permission to create projects:
-
-1. Sign in to GitLab as a user with Administrator access level.
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand the **Visibility and access controls** section.
-1. For **Default project creation protection**, select the desired roles:
- - No one.
- - Maintainers.
- - Developers and Maintainers.
-1. Select **Save changes**.
-
-## Restrict project deletion to administrators **(PREMIUM SELF)**
-
-> User interface [changed](https://gitlab.com/gitlab-org/gitlab/-/issues/352960) in GitLab 15.1.
-
-By default both administrators and anyone with the **Owner** role can delete a project. To restrict project deletion to only administrators:
-
-1. Sign in to GitLab as a user with administrator access.
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand the **Visibility and access controls** section.
-1. Scroll to:
- - (GitLab 15.1 and later) **Allowed to delete projects**, and select **Administrators**.
- - (GitLab 15.0 and earlier) **Default project deletion protection** and select **Only admins can delete project**.
-1. Select **Save changes**.
-
-## Deletion protection **(PREMIUM SELF)**
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/255449) in GitLab 14.2 for groups created after August 12, 2021.
-> - [Renamed](https://gitlab.com/gitlab-org/gitlab/-/issues/352960) from default delayed project deletion in GitLab 15.1.
-> - [Enabled for projects in personal namespaces](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/89466) in GitLab 15.1.
-> - [Disabled for projects in personal namespaces](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/95495) in GitLab 15.3.
-> - [Removed option to delete immediately](https://gitlab.com/gitlab-org/gitlab/-/issues/389557) in GitLab 15.11 [with a flag](../../../administration/feature_flags.md) named `always_perform_delayed_deletion`. Disabled by default.
-> - Enabled delayed deletion by default and removed the option to delete immediately [on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/393622) and [on self-managed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/119606) in GitLab 16.0.
-
-Instance-level protection against accidental deletion of groups and projects.
-
-### Retention period
-
-> [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/352960) in GitLab 15.1.
-
-Groups and projects remain restorable within a defined retention period. By default this is 7 days but it can be changed.
-Setting the retention period to `0` means that groups and project are removed immediately and cannot be restored.
-
-In GitLab 15.1 and later, the retention period must be between `1` and `90`. If the retention period was `0` before the 15.1 update,
-then it gets automatically changed to `1` while also disabling deletion protection the next time any application setting is changed.
-
-### Delayed project deletion
-
-> - User interface [changed](https://gitlab.com/gitlab-org/gitlab/-/issues/352960) in GitLab 15.1.
-> - Enabled delayed deletion by default and removed the option to delete immediately [on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/393622) and [on self-managed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/119606) in GitLab 16.0.
-
-To configure delayed project deletion:
-
-1. Sign in to GitLab as a user with administrator access.
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand the **Visibility and access controls** section.
-1. Scroll to:
- - (In GitLab 15.11 and later with `always_perform_delayed_deletion` feature flag enabled, or GitLab 16.0 and later) **Deletion protection** and set the retention period to a value between `1` and `90`.
- - (GitLab 15.1 and later) **Deletion protection** and select keep deleted groups and projects, and select a retention period.
- - (GitLab 15.0 and earlier) **Default delayed project protection** and select **Enable delayed project deletion by
- default for newly-created groups.** Then set a retention period in **Default deletion delay**.
-1. Select **Save changes**.
-
-Deletion protection is not available for projects only (without being also being enabled for groups).
-
-In GitLab 15.1, and later this setting is enforced on groups when disabled and it cannot be overridden.
-
-### Delayed group deletion
-
-> - User interface [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/352960) in GitLab 15.1.
-> - [Changed to default behavior](https://gitlab.com/gitlab-org/gitlab/-/issues/389557) on the Premium and Ultimate tier in GitLab 16.0.
-
-Groups remain restorable if the retention period is `1` or more days.
-
-In GitLab 15.1 and later, delayed group deletion can be enabled by setting **Deletion projection** to **Keep deleted**.
-In GitLab 15.11 and later with the `always_perform_delayed_deletion` feature flag enabled, or in GitLab 16.0 and later:
-
-- The **Keep deleted** option is removed.
-- Delayed group deletion is the default.
-
-### Override defaults and delete immediately
-
-Alternatively, projects that are marked for removal can be deleted immediately. To do so:
-
-1. [Restore the project](../../project/settings/index.md#restore-a-project).
-1. Delete the project as described in the
- [Administering Projects page](../../admin_area/index.md#administering-projects).
-
-## Configure project visibility defaults
-
-To set the default [visibility levels for new projects](../../public_access.md):
-
-1. Sign in to GitLab as a user with Administrator access level.
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand the **Visibility and access controls** section.
-1. Select the desired default project visibility:
- - **Private** - Project access must be granted explicitly to each user. If this
- project is part of a group, access is granted to members of the group.
- - **Internal** - The project can be accessed by any authenticated user except external users.
- - **Public** - The project can be accessed without any authentication.
-1. Select **Save changes**.
-
-## Configure snippet visibility defaults
-
-To set the default visibility levels for new [snippets](../../snippets.md):
-
-1. Sign in to GitLab as a user with Administrator access level.
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand the **Visibility and access controls** section.
-1. Select the desired default snippet visibility.
-1. Select **Save changes**.
-
-For more details on snippet visibility, read
-[Project visibility](../../public_access.md).
-
-## Configure group visibility defaults
-
-To set the default visibility levels for new groups:
-
-1. Sign in to GitLab as a user with Administrator access level.
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand the **Visibility and access controls** section.
-1. Select the desired default group visibility:
- - **Private** - The group and its projects can only be viewed by members.
- - **Internal** - The group and any internal projects can be viewed by any authenticated user except external users.
- - **Public** - The group and any public projects can be viewed without any authentication.
-1. Select **Save changes**.
-
-For more details on group visibility, see
-[Group visibility](../../group/index.md#group-visibility).
-
-## Restrict visibility levels
-
-When restricting visibility levels, consider how these restrictions interact
-with permissions for subgroups and projects that inherit their visibility from
-the item you're changing.
-
-To restrict visibility levels for groups, projects, snippets, and selected pages:
-
-1. Sign in to GitLab as a user with Administrator access level.
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand the **Visibility and access controls** section.
-1. In the **Restricted visibility levels** section, select the desired visibility levels to restrict.
- - If you restrict the **Public** level:
- - Only administrators are able to create public groups, projects, and snippets.
- - User profiles are only visible to authenticated users through the Web interface.
- - User attributes through the GraphQL API are:
- - Not visible in [GitLab 15.1 and later](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/88020).
- - Only visible to authenticated users between [GitLab 13.1](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/33195) and GitLab 15.0.
- - If you restrict the **Internal** level:
- - Only administrators are able to create internal groups, projects, and snippets.
- - If you restrict the **Private** level:
- - Only administrators are able to create private groups, projects, and snippets.
-1. Select **Save changes**.
-
-For more details on project visibility, see
-[Project visibility](../../public_access.md).
-
-## Configure allowed import sources
-
-Before you can import projects from other systems, you must enable the
-[import source](../../gitlab_com/index.md#default-import-sources) for that system.
-
-1. Sign in to GitLab as a user with Administrator access level.
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand the **Visibility and access controls** section.
-1. Select each of **Import sources** to allow.
-1. Select **Save changes**.
-
-## Enable project export
-
-To enable the export of
-[projects and their data](../../project/settings/import_export.md#export-a-project-and-its-data):
-
-1. Sign in to GitLab as a user with Administrator access level.
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand the **Visibility and access controls** section.
-1. Scroll to **Project export**.
-1. Select the **Enabled** checkbox.
-1. Select **Save changes**.
-
-## Enable migration of groups and projects by direct transfer
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/383268) in GitLab 15.8.
-
-You can enable migration of groups by direct transfer using the UI.
-
-To enable migration of groups by direct transfer:
-
-1. Sign in to GitLab as a user with Administrator access level.
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand the **Visibility and access controls** section.
-1. Scroll to **Allow migrating GitLab groups and projects by direct transfer**.
-1. Select the **Enabled** checkbox.
-1. Select **Save changes**.
-
-The same setting
-[is available](../../../api/settings.md#list-of-settings-that-can-be-accessed-via-api-calls) in the API as the
-`bulk_import_enabled` attribute.
-
-## Configure enabled Git access protocols
-
-With GitLab access restrictions, you can select the protocols users can use to
-communicate with GitLab. Disabling an access protocol does not block port access to the
-server itself. The ports used for the protocol, SSH or HTTP(S), are still accessible.
-The GitLab restrictions apply at the application level.
-
-To specify the enabled Git access protocols:
-
-1. Sign in to GitLab as a user with Administrator access level.
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand the **Visibility and access controls** section.
-1. Select the desired Git access protocols:
- - Both SSH and HTTP(S)
- - Only SSH
- - Only HTTP(S)
-1. Select **Save changes**.
-
-When both SSH and HTTP(S) are enabled, users can choose either protocol.
-If only one protocol is enabled:
-
-- The project page shows only the allowed protocol's URL, with no option to
- change it.
-- GitLab shows a tooltip when you hover over the protocol for the URL, if user action
- (such as adding a SSH key or setting a password) is required:
-
- ![Project URL with SSH only access](img/restricted_url.png)
-
-GitLab only allows Git actions for the protocols you select.
-
-WARNING:
-GitLab versions [10.7 and later](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/18021),
-allow the HTTP(S) protocol for Git clone or fetch requests done by GitLab Runner
-from CI/CD jobs, even if you select **Only SSH**.
-
-## Customize Git clone URL for HTTP(S)
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18422) in GitLab 12.4.
-
-You can customize project Git clone URLs for HTTP(S), which affects the clone
-panel:
-
-For example, if:
-
-- Your GitLab instance is at `https://example.com`, then project clone URLs are like
- `https://example.com/foo/bar.git`.
-- You want clone URLs that look like `https://git.example.com/gitlab/foo/bar.git` instead,
- you can set this setting to `https://git.example.com/gitlab/`.
-
-![Custom Git clone URL for HTTP](img/custom_git_clone_url_for_https_v12_4.png)
-
-To specify a custom Git clone URL for HTTP(S):
-
-1. Enter a root URL for **Custom Git clone URL for HTTP(S)**.
-1. Select **Save changes**.
-
-NOTE:
-SSH clone URLs can be customized in `gitlab.rb` by setting `gitlab_rails['gitlab_ssh_host']` and
-other related settings.
-
-## Configure defaults for RSA, DSA, ECDSA, ED25519, ECDSA_SK, ED25519_SK SSH keys
-
-These options specify the permitted types and lengths for SSH keys.
-
-To specify a restriction for each key type:
-
-1. Select the desired option from the dropdown list.
-1. Select **Save changes**.
-
-For more details, see [SSH key restrictions](../../../security/ssh_keys_restrictions.md).
-
-## Enable project mirroring
-
-This option is enabled by default. By disabling it, both
-[pull mirroring](../../project/repository/mirror/pull.md) and [push mirroring](../../project/repository/mirror/push.md) no longer
-work in every repository. They can only be re-enabled by an administrator user on a per-project basis.
-
-![Mirror settings](img/mirror_settings_v15_7.png)
-
-## Configure globally-allowed IP address ranges
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87579) in GitLab 15.1 [with a flag](../../../administration/feature_flags.md) named `group_ip_restrictions_allow_global`. Disabled by default.
-> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/366445) in GitLab 15.4. [Feature flag `group_ip_restrictions_allow_global`](https://gitlab.com/gitlab-org/gitlab/-/issues/366445) removed.
-
-Administrators can set IP address ranges to be combined with [group-level IP restrictions](../../group/access_and_permissions.md#restrict-group-access-by-ip-address).
-Use globally-allowed IP addresses to allow aspects of the GitLab installation to work even when group-level IP address
-restrictions are set.
-
-For example, if the GitLab Pages daemon runs on the `10.0.0.0/24` range, you can specify that range as globally-allowed.
-This means GitLab Pages can still fetch artifacts from pipelines even if group-level IP address restrictions don't
-include the `10.0.0.0/24` range.
-
-To add a IP address range to the group-level allowlist:
-
-1. Sign in to GitLab as a user with Administrator access level.
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Settings > General**.
-1. Expand the **Visibility and access controls** section.
-1. In **Globally-allowed IP ranges**, provide a list of IP address ranges. This list:
- - Has no limit on the number of IP address ranges.
- - Has a size limit of 1 GB.
- - Applies to both SSH or HTTP authorized IP address ranges. You cannot split
- this list by type of authorization.
-1. Select **Save changes**.
-
-<!-- ## 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, for example `### 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 <2023-10-14>. -->
+<!-- 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/admin_area/user_cohorts.md b/doc/user/admin_area/user_cohorts.md
index 6f2798f437c..b0b4facd7db 100644
--- a/doc/user/admin_area/user_cohorts.md
+++ b/doc/user/admin_area/user_cohorts.md
@@ -1,40 +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/product/ux/technical-writing/#assignments
+redirect_to: '../../administration/user_cohorts.md'
+remove_date: '2023-10-11'
---
-# Cohorts **(FREE SELF)**
+This document was moved to [another location](../../administration/user_cohorts.md).
-You can analyze your users' GitLab activities over time.
-
-How do you interpret the user cohorts table? Let's review an example with the
-following user cohorts:
-
-![User cohort example](img/cohorts_v13_9_a.png)
-
-For the cohort of March 2020, three users were added to this server and have
-been active since this month. One month later (April 2020), two users are still
-active. Five months later (August 2020), one user from this cohort is still
-active, or 33% of the original cohort of three that joined in March.
-
-The **Inactive users** column shows the number of users who were added during
-the month, but who never had any activity in the instance.
-
-How do we measure the activity of users? GitLab considers a user active if:
-
-- The user signs in.
-- The user has Git activity (whether push or pull).
-- The user visits pages related to dashboards, projects, issues, or merge
- requests ([introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/54947) in GitLab 11.8).
-- The user uses the API.
-- The user uses the GraphQL API.
-
-## View user cohorts
-
-To view user cohorts:
-
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Admin Area**.
-1. Select **Overview > Users**.
-1. Select the **Cohorts** tab.
+<!-- This redirect file can be deleted after <2023-10-11>. -->
+<!-- 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/ai_features.md b/doc/user/ai_features.md
index d5f7201556e..b9bcaec8b57 100644
--- a/doc/user/ai_features.md
+++ b/doc/user/ai_features.md
@@ -46,20 +46,14 @@ The following feature is in Beta:
## Experiment AI features
-[Experiment features](../policy/experiment-beta-support.md#experiment) will soon require
-[Experiment features to be enabled](group/manage.md#enable-experiment-features).
-
-## Third-party AI features
-
-Third-party AI features require [third-party AI services to be enabled](group/manage.md#enable-third-party-ai-features).
-
-For Experiment third-party AI features, [Experiment features must be enabled](group/manage.md#enable-experiment-features) as well.
+[Experiment](../policy/experiment-beta-support.md#experiment) AI features require
+[Experiment features to be enabled](group/manage.md#enable-experiment-features) as well as [third-party AI services to be enabled](group/manage.md#enable-third-party-ai-features).
### Explain Selected Code in the Web UI **(ULTIMATE SAAS)**
> Introduced in GitLab 15.11 as an [Experiment](../policy/experiment-beta-support.md#experiment) on GitLab.com.
-This feature is an [Experiment](../policy/experiment-beta-support.md) on GitLab.com that is powered by OpenAI's GPT-3.
+This AI feature is an [Experiment](../policy/experiment-beta-support.md) on GitLab.com that is powered by Google's Codey for Code Chat (codechat-bison).
GitLab can help you get up to speed faster if you:
@@ -70,16 +64,32 @@ By using a large language model, GitLab can explain the code in natural language
Prerequisites:
-- The project must be a public project on GitLab.com.
+Additional prerequisites [beyond the two above](#experiment-ai-features).
+
+- The project must be on GitLab.com.
- You must have the GitLab Ultimate subscription tier.
-- You must be a member of the project.
+- You must be a member of the project with sufficient permissions to view the repository.
To explain your code:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
+1. Select any file in your project that contains code.
+1. On the file, select the lines that you want to have explained.
+1. On the left side, select the question mark (**{question}**). You might have to scroll to the first line of your selection to view it. This sends the selected code, together with a prompt, to provide an explanation to the large language model.
+1. A drawer is displayed on the right side of the page. Wait a moment for the explanation to be generated.
+1. Provide feedback about how satisfied you are with the explanation, so we can improve the results.
+
+You can also have code explained in the context of a merge request. To explain
+code in a merge request:
+
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
1. On the left sidebar, select **Code > Merge requests**, then select your merge request.
1. On the secondary menu, select **Changes**.
-1. Go to the file, and select the lines that you want to have explained.
+1. On the file you would like explained, select the three dots (**{ellipsis_v}**) and select **View File @ $SHA**.
+
+ A separate browser tab opens and shows the full file with the latest changes.
+
+1. On the new tab, select the lines that you want to have explained.
1. On the left side, select the question mark (**{question}**). You might have to scroll to the first line of your selection to view it. This sends the selected code, together with a prompt, to provide an explanation to the large language model.
1. A drawer is displayed on the right side of the page. Wait a moment for the explanation to be generated.
1. Provide feedback about how satisfied you are with the explanation, so we can improve the results.
@@ -120,20 +130,23 @@ Review the drawer on the right-hand side of your screen.
We cannot guarantee that the large language model produces results that are correct. Use the explanation with caution.
-### GitLab Chat **(ULTIMATE SAAS)**
+### GitLab Duo Chat **(ULTIMATE SAAS)**
> Introduced in GitLab 16.0 as an [Experiment](../policy/experiment-beta-support.md#experiment).
This feature is an [Experiment](../policy/experiment-beta-support.md) on GitLab.com that is powered by OpenAI's GPT-3. It requires the [group-level third-party AI features setting](group/manage.md#enable-third-party-ai-features) to be enabled.
-Getting help has never been easier. If you have a question about how the GitLab product works, you can ask product how-to questions and get AI generated support from GitLab Chat.
+Getting help has never been easier. If you have a question about how the GitLab product works, you can ask product how-to questions and get AI generated support from GitLab Duo Chat.
1. In the lower-left corner, select the Help icon.
-1. Select **Ask in GitLab Chat**. A drawer opens on the right side of your screen.
+1. Select **Ask in GitLab Duo Chat**. A drawer opens on the right side of your screen.
1. Enter your question in the chat input box and press **Enter** or select **Send**. It may take a few seconds for the interactive AI chat to search the product documentation and produce an answer.
To give feedback, select the **Give Feedback** link.
+NOTE:
+Only the last 50 messages in the chat history are retained. The chat history expires 3 days after last use.
+
### Summarize merge request changes **(ULTIMATE SAAS)**
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/10400) in GitLab 16.0 as an [Experiment](../policy/experiment-beta-support.md#experiment).
diff --git a/doc/user/analytics/analytics_dashboards.md b/doc/user/analytics/analytics_dashboards.md
index e29e02c867f..9d2c91b6bc8 100644
--- a/doc/user/analytics/analytics_dashboards.md
+++ b/doc/user/analytics/analytics_dashboards.md
@@ -9,21 +9,14 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> Introduced in GitLab 15.9 as an [Experiment](../../policy/experiment-beta-support.md#experiment) feature [with a flag](../../administration/feature_flags.md) named `combined_analytics_dashboards`. Disabled by default.
FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available per project or for your entire instance, ask an administrator to [enable the feature flag](../../administration/feature_flags.md) named `combined_analytics_dashboards`.
+On self-managed GitLab, by default this feature is not available. To make it available per project or for your entire instance, an administrator can [enable the feature flag](../../administration/feature_flags.md) named `combined_analytics_dashboards`.
On GitLab.com, this feature is not available.
This feature is not ready for production use.
-## Dashboards
+Analytics dashboards help you visualize the collected data.
+You can use built-in dashboards or create your own with custom visualizations.
-Each project can have an unlimited number of dashboards, only limited by the instances [repository size limits](../project/repository/reducing_the_repo_size_using_git.md#storage-limits).
-These dashboards are defined using the GitLab YAML schema, and stored in the `.gitlab/analytics/dashboards/` directory of a project repository.
-The dashboard file name and containing directory should be the same, for example `my_dashboard/my_dashboard.yaml`. For more information see [defining a dashboard](#define-a-dashboard).
-Each dashboard can reference one or more [visualizations](#define-a-chart-visualization), which are shared across dashboards.
-
-Project maintainers can enforce approval rules on dashboard changes using features such as [code owners](../project/codeowners/index.md) and [approval rules](../project/merge_requests/approvals/rules.md).
-Your dashboard files are versioned in source control with the rest of a project's code.
-
-### Data sources
+## Data sources
A data source is a connection to a database or collection of data which can be used by your dashboard
filters and visualizations to query and retrieve results.
@@ -32,15 +25,96 @@ The following data sources are configured for analytics dashboards:
- [Product analytics](../product_analytics/index.md)
-### View project dashboards
+## Built-in dashboards
+
+To help you get started with analytics, GitLab provides two built-in dashboards with predefined visualizations:
+
+- **Audience**, which displays metrics related to traffic, such as number of users and sessions.
+- **Behavior**, which displays metrics related to user activity, such as number of page views and events.
+
+These dashboards are labeled **By GitLab**, and you cannot edit them.
+Instead, you can create a custom dashboard with a similar style.
+
+## Custom dashboards
-To view a list of dashboards for a project:
+With custom dashboards, you can design and create visualizations for the metrics that are most relevant to your use case.
+You can create custom dashboards with the dashboard designer.
+
+- Each project can have an unlimited number of dashboards.
+The only limitation might be the [repository size limit](../project/repository/reducing_the_repo_size_using_git.md#storage-limits).
+- Each dashboard can reference one or more [visualizations](#define-a-chart-visualization).
+- Visualizations are shared across dashboards.
+
+Project maintainers can enforce approval rules on dashboard changes with features such as [code owners](../project/codeowners/index.md) and [approval rules](../project/merge_requests/approvals/rules.md).
+Your dashboard files are versioned in source control with the rest of a project's code.
+
+## Dashboard designer
+
+> Introduced in GitLab 16.1 [with a flag](../../administration/feature_flags.md) named `combined_analytics_dashboards_editor`. Disabled by default.
+
+FLAG:
+On self-managed GitLab, by default this feature is not available. To make it available per project or for your entire instance, an administrator can [enable the feature flag](../../administration/feature_flags.md) named `combined_analytics_dashboards_editor`.
+On GitLab.com, this feature is not available.
+This feature is not ready for production use.
+
+NOTE:
+This feature does not work in conjunction with the `product_analytics_snowplow_support` feature flag.
+
+You can use the dashboard designer to:
+
+- Create custom dashboards.
+- Rename custom dashboards.
+- Add visualizations to new and existing custom dashboards.
+- Resize or move panels in custom dashboards.
+
+## View project dashboards
+
+To view a list of dashboards (both built-in and custom) for a project:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
1. Select **Analyze > Dashboards**.
1. From the list of available dashboards, select the dashboard you want to view.
-### Define a dashboard
+## Change the location of dashboards
+
+You can change the location of your project or group dashboards.
+
+### Group dashboards
+
+NOTE:
+This feature will be connected to group-level dashboards as part of [issue #411572](https://gitlab.com/gitlab-org/gitlab/-/issues/411572).
+
+To change the location of a group's dashboards:
+
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find the project you want to store your dashboard files in.
+ The project must belong to the group for which you create the dashboards.
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your group.
+1. Select **Settings > General**.
+1. Expand **Analytics**.
+1. In the **Analytics Dashboards** section, select your dashboard files project.
+1. Select **Save changes**.
+
+### Project dashboards
+
+Dashboards are usually defined in the project where the analytics data is being retrieved from.
+However, you can also have a separate project for dashboards.
+This is recommended if you want to enforce specific access rules to the dashboard definitions or share dashboards across multiple projects.
+
+NOTE:
+You can share dashboards only between projects that are located in the same group.
+
+To change the location of project dashboards:
+
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project,
+ or select **Create new...** (**{plus}**) and **New project/repository**
+ to create the project to store your dashboard files.
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) and find the analytics project.
+1. Select **Settings > General**.
+1. Expand **Analytics**.
+1. In the **Analytics Dashboards** section, select your dashboard files project.
+1. Select **Save changes**.
+
+## Define a dashboard
To define a dashboard:
@@ -67,7 +141,7 @@ and one visualization (line chart) that applies to all dashboards, the file stru
│ └── example_line_chart.yaml
```
-### Define a chart visualization
+## Define a chart visualization
You can define different charts, and add visualization options to some of them:
@@ -91,65 +165,7 @@ create a `line_chart.yaml` file with the following required fields:
- data
- options
-### Change the location of project dashboards
-
-Dashboards are usually defined in the project where analytics data is being retrieved.
-However, you can also have a separate project for dashboards.
-This is recommended if you want to enforce specific access rules to the dashboard definitions or share dashboards across multiple projects.
-
-NOTE:
-You can share dashboards only between projects that are located in the same group.
-
-To change the location of project dashboards:
-
-1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project,
- or select **Create new...** (**{plus}**) and **New project/repository**
- to create the project to store your dashboard files.
-1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) and find the project you want to use the dashboards for.
-1. Select **Settings > General**.
-1. Expand **Analytics**.
-1. In the **Analytics Dashboards** section, select the project that contains the dashboard files.
-1. Select **Save changes**.
-
-### Change the location of group dashboards
-
-NOTE:
-This feature will be connected to group-level dashboards in [issue 411572](https://gitlab.com/gitlab-org/gitlab/-/issues/411572).
-
-If you want to use dashboards for a group, you must store the dashboard files in a project that belongs to that group.
-You can change the source project of a group's dashboards at any time.
-
-To change the location of a group's dashboards:
-
-1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your group.
-1. Select **Settings > General**.
-1. Expand **Analytics**.
-1. In the **Analytics Dashboards** section, select the project that contains the dashboard files.
-1. Select **Save changes**.
-
-## Dashboards designer
-
-> Introduced in GitLab 16.1 [with a flag](../../administration/feature_flags.md) named `combined_analytics_dashboards_editor`. Disabled by default.
-
-FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available per project or for your entire instance, ask an administrator to [enable the feature flag](../../administration/feature_flags.md) named `combined_analytics_dashboards_editor`.
-On GitLab.com, this feature is not available.
-This feature is not ready for production use.
-
-NOTE:
-This feature does not work in conjunction with the `product_analytics_snowplow_support` feature flag.
-
-You can use the dashboards designer to:
-
-- Create custom dashboards
-- Rename custom dashboards
-- Add visualizations to new and existing custom dashboards
-- Resize or move panels within custom dashboards
-
-You cannot edit the built-in dashboards labeled as `By GitLab`.
-To edit these dashboards you should create a new custom dashboard which uses the same visualizations.
-
-### Create a custom dashboard
+## Create a custom dashboard
To create a custom dashboard:
@@ -161,9 +177,9 @@ To create a custom dashboard:
1. Optional. Drag or resize the selected panel how you prefer.
1. Select **Save**.
-### Edit a custom dashboard
+## Edit a custom dashboard
-You can edit your custom dashboard's title and add or resize visualizations within the dashboard designer.
+You can edit your custom dashboard's title and add or resize visualizations in the dashboard designer.
To edit an existing custom dashboard:
@@ -175,3 +191,20 @@ To edit an existing custom dashboard:
1. Optional. From the **Add visualizations** list on the right, select other visualizations to add to the dashboard.
1. Optional. In the dashboard, select a panel and drag or resize it how you prefer.
1. Select **Save**.
+
+## Troubleshooting
+
+### `Something went wrong while loading the dashboard.`
+
+If the dashboard displays a global error message that data could not be loaded, first try reloading the page. If the error persists:
+
+- Check that your configurations match the [JSON schema](#define-a-dashboard) defined in `ee/app/validators/json_schemas/analytics_dashboard.json`.
+- For product analytics, check your [admin and project settings](../product_analytics/index.md#project-level-settings), and make sure they are set up correctly.
+
+### Dashboard panel error
+
+If a dashboard panel displays an error message:
+
+- Check your [Cube query](../product_analytics/index.md#product-analytics-dashboards) and [visualization](../analytics/analytics_dashboards.md#define-a-chart-visualization)
+configurations, and make sure they are set up correctly.
+- For [product analytics](../product_analytics/index.md), also check that your visualization's Cube query is valid.
diff --git a/doc/user/analytics/dora_metrics.md b/doc/user/analytics/dora_metrics.md
index 6b7b1d87843..bdfeffcec05 100644
--- a/doc/user/analytics/dora_metrics.md
+++ b/doc/user/analytics/dora_metrics.md
@@ -43,7 +43,7 @@ High deployment frequency means you can get feedback sooner and iterate faster t
### How deployment frequency is calculated
In GitLab, Deployment frequency is measured by the average number of deployments per day to a given environment, based on the deployment's end time (its `finished_at` property).
-GitLab calculates the deployment frequency from the number of finished deployments on the given day.
+GitLab calculates the deployment frequency from the number of finished deployments on the given day. Only successful deployments (`Deployment.statuses = success`) are counted.
The calculation takes into account the production `environment tier` or the environments named `production/prod`. The environment must be part of the production deployment tier for its deployment information to appear on the graphs.
diff --git a/doc/user/analytics/index.md b/doc/user/analytics/index.md
index e78f55911e6..c057a8b193d 100644
--- a/doc/user/analytics/index.md
+++ b/doc/user/analytics/index.md
@@ -27,7 +27,7 @@ GitLab provides several analytics features at the group level. Some of these fea
- [Issue](../group/issues_analytics/index.md)
- [Productivity](productivity_analytics.md)
- [Repositories](../group/repositories_analytics/index.md)
-- [Value Stream](../group/value_stream_analytics/index.md)
+- [Value Stream Management Analytics](value_stream_analytics.md), and [Value Stream Management Dashboard](value_streams_dashboard.md)
## Project-level analytics
@@ -43,7 +43,7 @@ You can use GitLab to review analytics at the project level. Some of these featu
- [Merge Request](merge_request_analytics.md), enabled with the `project_merge_request_analytics`
[feature flag](../../development/feature_flags/index.md#enabling-a-feature-flag-locally-in-development)
- [Repository](repository_analytics.md)
-- [Value Stream](value_stream_analytics.md)
+- [Value Stream Management Analytics](value_stream_analytics.md), and [Value Stream Management Dashboard](value_streams_dashboard.md)
### Remove project analytics from the left sidebar
diff --git a/doc/user/analytics/value_streams_dashboard.md b/doc/user/analytics/value_streams_dashboard.md
index 9b332d78060..a853263d20f 100644
--- a/doc/user/analytics/value_streams_dashboard.md
+++ b/doc/user/analytics/value_streams_dashboard.md
@@ -11,15 +11,12 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/392734) in GitLab 16.0. Feature flag `group_analytics_dashboards_page` removed.
You can leave feedback on dashboard bugs or functionality in [issue 381787](https://gitlab.com/gitlab-org/gitlab/-/issues/381787).
+For more information, see also the [Value Stream Management category direction page](https://about.gitlab.com/direction/plan/value_stream_management/).
-The Value Streams Dashboard is a customizable dashboard that enables decision-makers to identify trends, patterns, and opportunities for digital transformation improvements.
-This page is a work in progress, and we're updating the information as we add more features.
-For more information, see the [Value Stream Management category direction page](https://about.gitlab.com/direction/plan/value_stream_management/).
+The Value Streams Dashboard is a customizable dashboard you can use to identify trends, patterns, and opportunities for digital transformation improvements.
-## Initial use case
-
-Our initial use case is focused on providing the ability to compare software delivery metrics.
-This comparison can help decision-makers understand whether projects and groups are improving.
+With the Value Streams Dashboard, you can compare software delivery metrics.
+This comparison can help you understand whether projects and groups are improving.
The Value Streams Dashboard includes the following metrics:
@@ -57,7 +54,7 @@ To view the value streams dashboard:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project or group.
1. Select **Analyze > Value stream analytics**.
-1. Below the **Filter results** text box, in the **Key metrics** row, select **Value Streams Dashboard / DORA**.
+1. Below the **Filter results** text box, in the **Lifecycle metrics** row, select **Value Streams Dashboard / DORA**.
1. Optional. To open the new page, append this path `/analytics/dashboards/value_streams_dashboard` to the group URL
(for example, `https://gitlab.com/groups/gitlab-org/-/analytics/dashboards/value_streams_dashboard`).
@@ -79,7 +76,8 @@ For example, the parameter `query=gitlab-org/gitlab-ui,gitlab-org/plan-stage` di
### Using YAML configuration
-To change the default content of the page, you need to create a YAML configuration file in a project of your choice. Query parameters can still be used to override the YAML configuration.
+To customize the default content of the page, you need to create a YAML configuration file in a project of your choice. In this file you can define various settings and parameters, such as title, description, and number of panels and labels filters. The file is schema-driven and managed with version control systems like Git. This enables tracking and maintaining a history of configuration changes, reverting to previous versions if necessary, and collaborating effectively with team members.
+Query parameters can still be used to override the YAML configuration.
First, you need to set up the project.
@@ -110,12 +108,25 @@ description: 'Custom description'
# title - Change the title of the panel. [optional]
# data.namespace - The Group or Project path to use for the chart panel.
# data.exclude_metrics - Hide rows by metric ID from the chart panel.
+# data.filter_labels -
+# Only show results for data that matches the queried label(s). If multiple labels are provided,
+# only a single label needs to match for the data to be included in the results.
+# Compatible metrics (other metrics will be automatically excluded):
+# * lead_time
+# * cycle_time
+# * issues
+# * issues_completed
+# * merge_request_throughput
+# (This option is dependant on the `vsd_graphql_dora_and_flow_metrics` feature.)
panels:
- title: 'My Custom Project'
data:
namespace: group/my-custom-project
- data:
namespace: group/another-project
+ filter_labels:
+ - in_development
+ - in_review
- title: 'My Custom Group'
data:
namespace: group/my-custom-group
@@ -134,6 +145,9 @@ panels:
namespace: my-group
```
+<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
+For an overview of editing label filters in the configuration file, see [GitLab Value Streams Dashboard - Label filters demo](https://www.youtube.com/watch?v=4qDAHCxCfik).
+
## Dashboard metrics and drill-down reports
| Metric | Description | Drill-down report | Documentation page | ID |
@@ -142,8 +156,8 @@ panels:
| Lead time for changes | The time to successfully deliver a commit into production. This metric reflects the efficiency of CI/CD pipelines. | [Lead time tab](https://gitlab.com/groups/gitlab-org/-/analytics/ci_cd?tab=lead-time) | [Lead time for changes](dora_metrics.md#lead-time-for-changes) | `lead_time_for_changes` |
| Time to restore service | The time it takes an organization to recover from a failure in production. | [Time to restore service tab](https://gitlab.com/groups/gitlab-org/-/analytics/ci_cd?tab=time-to-restore-service) | [Time to restore service](dora_metrics.md#time-to-restore-service) | `time_to_restore_service` |
| Change failure rate | Percentage of deployments that cause an incident in production. | [Change failure rate tab](https://gitlab.com/groups/gitlab-org/-/analytics/ci_cd?tab=change-failure-rate) | [Change failure rate](dora_metrics.md#change-failure-rate) | `change_failure_rate` |
-| Lead time | Median time from issue created to issue closed. | [Value Stream Analytics](https://gitlab.com/groups/gitlab-org/-/analytics/value_stream_analytics) | [View the lead time and cycle time for issues](../group/value_stream_analytics/index.md#key-metrics) | `lead_time` |
-| Cycle time | Median time from the earliest commit of a linked issue's merge request to when that issue is closed. | [VSA overview](https://gitlab.com/groups/gitlab-org/-/analytics/value_stream_analytics) | [View the lead time and cycle time for issues](../group/value_stream_analytics/index.md#key-metrics) | `cycle_time` |
+| Lead time | Median time from issue created to issue closed. | [Value Stream Analytics](https://gitlab.com/groups/gitlab-org/-/analytics/value_stream_analytics) | [View the lead time and cycle time for issues](../group/value_stream_analytics/index.md#lifecycle-metrics) | `lead_time` |
+| Cycle time | Median time from the earliest commit of a linked issue's merge request to when that issue is closed. | [VSA overview](https://gitlab.com/groups/gitlab-org/-/analytics/value_stream_analytics) | [View the lead time and cycle time for issues](../group/value_stream_analytics/index.md#lifecycle-metrics) | `cycle_time` |
| New issues | Number of new issues created. | [Issue Analytics](https://gitlab.com/groups/gitlab-org/-/issues_analytics) | Issue analytics [for projects](issue_analytics.md) and [for groups](../../user/group/issues_analytics/index.md) | `issues` |
| Closed issues | Number of issues closed by month. | [Value Stream Analytics](https://gitlab.com/groups/gitlab-org/-/analytics/value_stream_analytics) | [Value Stream Analytics](../group/value_stream_analytics/index.md) | `issues_completed` |
| Number of deploys | Total number of deploys to production. | [Merge Request Analytics](https://gitlab.com/gitlab-org/gitlab/-/analytics/merge_request_analytics) | [Merge request analytics](merge_request_analytics.md) | `deploys` |
diff --git a/doc/user/application_security/api_fuzzing/index.md b/doc/user/application_security/api_fuzzing/index.md
index 28e72816a99..e8feb0f4a59 100644
--- a/doc/user/application_security/api_fuzzing/index.md
+++ b/doc/user/application_security/api_fuzzing/index.md
@@ -2032,7 +2032,7 @@ Follow these steps to view details of a fuzzing fault:
1. You can view faults in a project, or a merge request:
- - In a project, go to the project's **Security and Compliance > Vulnerability Report**
+ - In a project, go to the project's **Secure > Vulnerability report**
page. This page shows all vulnerabilities from the default branch only.
- In a merge request, go the merge request's **Security** section and select the **Expand**
button. API Fuzzing faults are available in a section labeled
@@ -2452,7 +2452,7 @@ See the following documentation sections for assistance:
See [Performance Tuning and Testing Speed](#performance-tuning-and-testing-speed)
-### Error waiting for API Fuzzing 'http://127.0.0.1:5000' to become available
+### Error: `Error waiting for API Fuzzing 'http://127.0.0.1:5000' to become available`
A bug exists in versions of the API Fuzzing analyzer prior to v1.6.196 that can cause a background process to fail under certain conditions. The solution is to update to a newer version of the API Fuzzing analyzer.
diff --git a/doc/user/application_security/comparison_dependency_and_container_scanning.md b/doc/user/application_security/comparison_dependency_and_container_scanning.md
new file mode 100644
index 00000000000..d02d94b7a3e
--- /dev/null
+++ b/doc/user/application_security/comparison_dependency_and_container_scanning.md
@@ -0,0 +1,34 @@
+---
+stage: Secure
+group: Composition Analysis
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Dependency Scanning compared to Container Scanning
+
+GitLab offers both [Dependency Scanning](dependency_scanning/index.md) and
+[Container Scanning](container_scanning/index.md) 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 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
+ risks the dependencies contain.
+- Container Scanning analyzes your containers and tells you about known risks in the operating
+ system's (OS) packages.
+
+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> <sup>3</sup> |
+| Dynamically-linked language-specific dependencies installed by the Operating System | **{dotted-circle}** | **{check-circle}** <sup>3</sup> |
+| Operating system dependencies | **{dotted-circle}** | **{check-circle}** |
+| Language-specific dependencies installed on the operating system (not built by your project) | **{dotted-circle}** | **{check-circle}** |
+
+1. Lock file must be present in the image to be detected.
+1. Binary file must be present in the image to be detected.
+1. Only when using Trivy.
diff --git a/doc/user/application_security/container_scanning/index.md b/doc/user/application_security/container_scanning/index.md
index 042ed0190c4..791a73bfdc2 100644
--- a/doc/user/application_security/container_scanning/index.md
+++ b/doc/user/application_security/container_scanning/index.md
@@ -32,7 +32,8 @@ you wrote yourself.
GitLab offers both Container Scanning and [Dependency Scanning](../dependency_scanning/index.md)
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 scanners. For a comparison of these features, see
+[Dependency Scanning compared to Container Scanning](../comparison_dependency_and_container_scanning.md).
## Overview
@@ -240,8 +241,7 @@ When you enable this feature, you may see [duplicate findings](../terminology/in
in the [Vulnerability Report](../vulnerability_report/index.md)
if [Dependency Scanning](../dependency_scanning/index.md)
is enabled for your project. This happens because GitLab can't automatically deduplicate findings
-across different types of scanning tools. Reference [this comparison](../dependency_scanning/index.md#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.
+across different types of scanning tools. To understand which types of dependencies are likely to be duplicated, see [Dependency Scanning compared to Container Scanning](../comparison_dependency_and_container_scanning.md).
#### Available CI/CD variables
@@ -328,7 +328,7 @@ To enable Container Scanning in a project, create a merge request from the Secur
page:
1. In the project where you want to enable Container Scanning, go to
- **Security and Compliance > Security configuration**.
+ **Secure > Security configuration**.
1. In the **Container Scanning** row, select **Configure with a merge request**.
This automatically creates a merge request with the changes necessary to enable Container Scanning.
diff --git a/doc/user/application_security/dast/browser_based.md b/doc/user/application_security/dast/browser_based.md
index 7b263e5817d..0338555598c 100644
--- a/doc/user/application_security/dast/browser_based.md
+++ b/doc/user/application_security/dast/browser_based.md
@@ -189,7 +189,7 @@ For authentication CI/CD variables, see [Authentication](authentication.md).
| `DAST_BROWSER_MAX_ACTIONS` | number | `10000` | The maximum number of actions that the crawler performs. For example, selecting a link, or filling a form. |
| `DAST_BROWSER_MAX_DEPTH` | number | `10` | The maximum number of chained actions that the crawler takes. For example, `Click -> Form Fill -> Click` is a depth of three. |
| `DAST_BROWSER_MAX_RESPONSE_SIZE_MB` | number | `15` | The maximum size of a HTTP response body. Responses with bodies larger than this are blocked by the browser. Defaults to 10 MB. |
-| `DAST_BROWSER_NAVIGATION_STABILITY_TIMEOUT` | [Duration string](https://pkg.go.dev/time#ParseDuration) | `7s` | The maximum amount of time to wait for a browser to consider a page loaded and ready for analysis after a navigation completes. |
+| `DAST_BROWSER_NAVIGATION_STABILITY_TIMEOUT` | [Duration string](https://pkg.go.dev/time#ParseDuration) | `7s` | The maximum amount of time to wait for a browser to consider a page loaded and ready for analysis after a navigation completes. Defaults to `800ms`.|
| `DAST_BROWSER_NAVIGATION_TIMEOUT` | [Duration string](https://pkg.go.dev/time#ParseDuration) | `15s` | The maximum amount of time to wait for a browser to navigate from one page to another. |
| `DAST_BROWSER_NUMBER_OF_BROWSERS` | number | `3` | The maximum number of concurrent browser instances to use. For shared runners on GitLab.com, we recommended a maximum of three. Private runners with more resources may benefit from a higher number, but are likely to produce little benefit after five to seven instances. |
| `DAST_BROWSER_PAGE_LOADING_SELECTOR` | selector | `css:#page-is-loading` | Selector that when is no longer visible on the page, indicates to the analyzer that the page has finished loading and the scan can continue. Cannot be used with `DAST_BROWSER_PAGE_READY_SELECTOR`. |
@@ -212,6 +212,75 @@ For authentication CI/CD variables, see [Authentication](authentication.md).
| `DAST_WEBSITE` | URL | `https://example.com` | The URL of the website to scan. |
| `SECURE_ANALYZERS_PREFIX` | URL | `registry.organization.com` | Set the Docker registry base address from which to download the analyzer. |
+## Managing scope
+
+Scope controls what URLs DAST follows when crawling the target application. Properly managed scope minimizes scan run time while ensuring only the target application is checked for vulnerabilities.
+
+### Types of scope
+
+There are three types of scope:
+
+- in scope
+- out of scope
+- excluded from scope
+
+#### In scope
+
+DAST follows in-scope URLs and searches the DOM for subsequent actions to perform to continue the crawl.
+Recorded in-scope HTTP messages are passively checked for vulnerabilities and used to build attacks when running a full scan.
+
+#### Out of scope
+
+DAST follows out-of-scope URLs for non-document content types such as image, stylesheet, font, script, or AJAX request.
+[Authentication](#scope-works-differently-during-authentication) aside, DAST does not follow out-of-scope URLs for full page loads, such as when clicking a link to an external website.
+Except for passive checks that search for information leaks, recorded HTTP messages for out-of-scope URLs are not checked for vulnerabilities.
+
+#### Excluded from scope
+
+DAST does not follow excluded-from-scope URLs. Except for passive checks that search for information leaks, recorded HTTP messages for excluded-from-scope URLs are not checked for vulnerabilities.
+
+### Scope works differently during authentication
+
+Many target applications have an authentication process that depends on external websites, such as when using an identity access management provider for single sign on (SSO).
+To ensure that DAST can authenticate with these providers, DAST follows out-of-scope URLs for full page loads during authentication. DAST does not follow excluded-from-scope URLs.
+
+### How DAST blocks HTTP requests
+
+DAST instructs the browser to make the HTTP request as usual when blocking a request due to scope rules. The request is subsequently intercepted and rejected with the reason `BlockedByClient`.
+This approach allows DAST to record the HTTP request while ensuring it never reaches the target server. Passive checks such as [200.1](checks/200.1.md) use these recorded requests to verify information sent to external hosts.
+
+### How to configure scope
+
+By default, URLs matching the host of the target application are considered in-scope. All other hosts are considered out-of-scope.
+
+Scope is configured using the following variables:
+
+- Use `DAST_BROWSER_ALLOWED_HOSTS` to add in-scope hosts.
+- Use `DAST_BROWSER_IGNORED_HOSTS` to add to out-of-scope hosts.
+- Use `DAST_BROWSER_EXCLUDED_HOSTS` to add to excluded-from-scope hosts.
+- Use `DAST_EXCLUDE_URLS` to set specific URLs to be excluded-from-scope.
+
+Rules:
+
+- Excluding a host is given priority over ignoring a host, which is given priority over allowing a host.
+- Configuring scope for a host does not configure scope for the subdomains of that host.
+- Configuring scope for a host does not configure scope for all ports on that host.
+
+The following could be a typical configuration:
+
+```yaml
+include:
+ - template: DAST.gitlab-ci.yml
+
+dast:
+ variables:
+ DAST_WEBSITE: "https://my.site.com" # my.site.com URLs are considered in-scope by default
+ DAST_BROWSER_ALLOWED_HOSTS: "api.site.com:8443" # include the API as part of the scan
+ DAST_BROWSER_IGNORED_HOSTS: "analytics.site.com" # explicitly disregard analytics from the scan
+ DAST_BROWSER_EXCLUDED_HOSTS: "ads.site.com" # don't visit any URLs on the ads subdomain
+ DAST_EXCLUDE_URLS: "https://my.site.com/user/logout" # don't visit this URL
+```
+
## Vulnerability detection
Vulnerability detection is gradually being migrated from the default Zed Attack Proxy (ZAP) solution
diff --git a/doc/user/application_security/dast/browser_based_troubleshooting.md b/doc/user/application_security/dast/browser_based_troubleshooting.md
index 6cc80bcfbc3..f659001e7c5 100644
--- a/doc/user/application_security/dast/browser_based_troubleshooting.md
+++ b/doc/user/application_security/dast/browser_based_troubleshooting.md
@@ -100,7 +100,7 @@ For example, the following log entry has level `INFO`, is part of the `CRAWL` lo
Logs are sent either to file or to console (the CI/CD job log). You can configure each destination to accept different logs using
the environment variables `DAST_BROWSER_LOG` for console logs and `DAST_BROWSER_FILE_LOG` for file logs.
-In the following example, the file log defaults to `DEBUG` level, the console log defaults to `INFO` level and logs the `AUTH` module at `DEBUG` level.
+For example:
```yaml
include:
@@ -108,9 +108,10 @@ include:
dast:
variables:
- DAST_BROWSER_LOG: "auth:debug"
- DAST_BROWSER_FILE_LOG: "loglevel:debug"
- DAST_BROWSER_FILE_LOG_PATH: "/zap/wrk/dast-scan.log"
+ DAST_BROWSER_SCAN: "true"
+ DAST_BROWSER_LOG: "auth:debug" # console log defaults to INFO level, logs AUTH module at DEBUG
+ DAST_BROWSER_FILE_LOG: "loglevel:debug,cache:warn" # file log defaults to DEBUG level, logs CACHE module at WARN
+ DAST_BROWSER_FILE_LOG_PATH: "$CI_PROJECT_DIR/dast-scan.log" # Save the file log in the project directory so it can be recognized as an artifact
artifacts:
paths:
- dast-scan.log
diff --git a/doc/user/application_security/dast/checks/16.9.md b/doc/user/application_security/dast/checks/16.9.md
index b0ba502b578..c63a620794e 100644
--- a/doc/user/application_security/dast/checks/16.9.md
+++ b/doc/user/application_security/dast/checks/16.9.md
@@ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
## Description
A `Content-Security-Policy-Report-Only` (CSPRO) was identified on the target site. CSP-Report-Only headers
-aid in determining how to implement a `Content-Security-Policy` that does not disrupt normal use of the target
+aid in determining how to implement a `Content-Security-Policy` that does not disrupt use of the target
site.
## Remediation
diff --git a/doc/user/application_security/dast/proxy-based.md b/doc/user/application_security/dast/proxy-based.md
index 499efd3f60d..0eec04bfeff 100644
--- a/doc/user/application_security/dast/proxy-based.md
+++ b/doc/user/application_security/dast/proxy-based.md
@@ -461,132 +461,95 @@ The DAST job does not require the project's repository to be present when runnin
## On-demand scans
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/218465) in GitLab 13.2.
-> - [Improved](https://gitlab.com/gitlab-org/gitlab/-/issues/218465) in GitLab 13.3.
-> - The saved scans feature was [introduced](https://gitlab.com/groups/gitlab-org/-/epics/5100) in GitLab 13.9.
-> - The option to select a branch was [introduced](https://gitlab.com/groups/gitlab-org/-/epics/4847) in GitLab 13.10.
-> - DAST branch selection [feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/322672) in GitLab 13.11.
-> - Auditing for DAST profile management was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217872) in GitLab 14.1.
+> Auditing for DAST profile management [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217872) in GitLab 14.1.
An on-demand DAST scan runs outside the DevOps life cycle. Changes in your repository don't trigger
-the scan. You must either start it manually, or schedule it to run.
-
-An on-demand DAST scan:
-
-- Can run a specific combination of a [site profile](#site-profile) and a
- [scanner profile](#scanner-profile).
-- Is associated with your project's default branch.
-- Is saved on creation so it can be run later.
+the scan. You must either start it manually, or schedule it to run. For on-demand DAST scans,
+a [site profile](#site-profile) defines **what** is to be scanned, and a
+[scanner profile](#scanner-profile) defines **how** the application is to be scanned.
An on-demand scan can be run in active or passive mode:
-- _Passive mode_ is the default and runs a ZAP Baseline Scan.
-- _Active mode_ runs a ZAP Full Scan which is potentially harmful to the site being scanned. To
- minimize the risk of accidental damage, running an active scan requires a [validated site profile](#site-profile-validation).
+- **Passive mode**: The default mode, which runs a ZAP Baseline Scan.
+- **Active mode**: Runs a ZAP Full Scan which is potentially harmful to the site being scanned. To
+ minimize the risk of accidental damage, running an active scan requires a
+ [validated site profile](#site-profile-validation).
### View on-demand DAST scans
-To view on-demand scans, from your project's home page, go to **Security & Compliance > On-demand
-scans** in the left sidebar.
+To view on-demand scans:
+
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project or group.
+1. Select **Secure > On-demand scans**.
On-demand scans are grouped by their status. The scan library contains all available on-demand
scans.
-From the **On-demand scans** page you can:
-
-- [Run](#run-an-on-demand-dast-scan) an on-demand scan.
-- View the results of an on-demand scan.
-- Cancel (**{cancel}**) a pending or running on-demand scan.
-- Retry (**{retry}**) a scan that failed, or succeeded with warnings.
-- [Edit](#edit-an-on-demand-scan) (**{pencil}**) an on-demand scan's settings.
-- [Delete](#delete-an-on-demand-scan) an on-demand scan.
-
### Run an on-demand DAST scan
Prerequisites:
- You must have permission to run an on-demand DAST scan against a protected branch. The default
- branch is automatically protected. For more information, read
+ branch is automatically protected. For more information, see
[Pipeline security on protected branches](../../../ci/pipelines/index.md#pipeline-security-on-protected-branches).
-- A [scanner profile](#create-a-scanner-profile).
-- A [site profile](#create-a-site-profile).
-- If you are running an active scan the site profile must have been [validated](#validate-a-site-profile).
-
-You can run an on-demand scan immediately, once at a scheduled date and time or at a specified
-frequency:
-
-- Every day
-- Every week
-- Every month
-- Every 3 months
-- Every 6 months
-- Every year
-
-To run an on-demand scan immediately, either:
-
-- [Create and run an on-demand scan immediately](#create-and-run-an-on-demand-scan-immediately).
-- [Run a previously saved on-demand scan](#run-a-saved-on-demand-scan).
-
-To run an on-demand scan either at a scheduled date or frequency, read
-[Schedule an on-demand scan](#schedule-an-on-demand-scan).
-
-#### Create and run an on-demand scan immediately
-
-1. From your project's home page, go to **Security & Compliance > On-demand Scans** in the left
- sidebar.
-1. Select **New scan**.
-1. Complete the **Scan name** and **Description** fields.
-1. In GitLab 13.10 and later, select the desired branch from the **Branch** dropdown list.
-1. In **Scanner profile**, select a scanner profile from the dropdown list.
-1. In **Site profile**, select a site profile from the dropdown list.
-1. To run the on-demand scan immediately, select **Save and run scan**. Otherwise, select
- **Save scan** to [run](#run-a-saved-on-demand-scan) it later.
-
-The on-demand DAST scan runs and the project's dashboard shows the results.
-#### Run a saved on-demand scan
-
-To run a saved on-demand scan:
+To run an existing on-demand scan:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
1. Select **Secure > On-demand scans**.
1. Select the **Scan library** tab.
1. In the scan's row, select **Run scan**.
- If the branch saved in the scan no longer exists, you must first
- [edit the scan](#edit-an-on-demand-scan), select a new branch, and save the edited scan.
+ If the branch saved in the scan no longer exists, you must:
+
+ 1. [Edit the scan](#edit-an-on-demand-scan).
+ 1. Select a new branch.
+ 1. Save the edited scan.
The on-demand DAST scan runs, and the project's dashboard shows the results.
-#### Schedule an on-demand scan
+#### Create an on-demand scan
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/328749) in GitLab 14.3. [Deployed behind the `dast_on_demand_scans_scheduler` flag](../../../administration/feature_flags.md), disabled by default.
> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/328749) in GitLab 14.4.
> - [Enabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/328749) in GitLab 14.4.
> - [Feature flag `dast_on_demand_scans_scheduler` removed](https://gitlab.com/gitlab-org/gitlab/-/issues/328749) in GitLab 14.5.
-To schedule a scan:
+After you create an on-demand scan, you can:
-1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
+- Run it immediately.
+- Save it to be run in the future.
+- Schedule it to be run at a specified schedule.
+
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project or group.
1. Select **Secure > On-demand scans**.
1. Select **New scan**.
-1. Complete the **Scan name** and **Description** text boxes.
-1. In GitLab 13.10 and later, from the **Branch** dropdown list, select the desired branch.
-1. In the **Scanner profile** section, from the dropdown list, select a scanner profile.
-1. In the **Site profile** section, from the dropdown list, select a site profile.
-1. Select **Schedule scan**.
-1. In the **Start time** section, select a time zone, date, and time.
-1. From the **Repeats** dropdown list, select your desired frequency:
- - To run the scan once, select **Never**.
- - For a recurring scan, select any other option.
-1. To run the on-demand scan immediately, select **Save and run scan**. To [run](#run-a-saved-on-demand-scan) it according to the schedule you set, select
- **Save scan**.
+1. Complete the **Scan name** and **Description** fields.
+1. In the **Branch** dropdown list, select the desired branch.
+1. Select **Select scanner profile** or **Change scanner profile** to open the drawer, and either:
+ - Select a scanner profile from the drawer, **or**
+ - Select **New profile**, create a [scanner profile](#scanner-profile), then select **Save profile**.
+1. Select **Select site profile** or **Change site profile** to open the drawer, and either:
+ - Select a site profile from the **Site profile library** drawer, or
+ - Select **New profile** create a [site profile](#site-profile), then select **Save profile**.
+1. To run the on-demand scan:
+
+ - Immediately, select **Save and run scan**.
+ - In the future, select **Save scan**.
+ - On a schedule:
+
+ - Turn on the **Enable scan schedule** toggle.
+ - Complete the schedule fields.
+ - Select **Save scan**.
+
+The on-demand DAST scan runs as specified and the project's dashboard shows the results.
### View details of an on-demand scan
To view details of an on-demand scan:
-1. From your project's home page, go to **Security & Compliance > On-demand scans**.
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
+1. Select **Secure > On-demand scans**.
1. Select the **Scan library** tab.
1. In the saved scan's row select **More actions** (**{ellipsis_v}**), then select **Edit**.
@@ -594,17 +557,19 @@ To view details of an on-demand scan:
To edit an on-demand scan:
-1. From your project's home page, go to **Security & Compliance > On-demand scans**.
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
+1. Select **Secure > On-demand scans**.
1. Select the **Scan library** tab.
1. In the saved scan's row select **More actions** (**{ellipsis_v}**), then select **Edit**.
-1. Edit the form.
+1. Edit the saved scan's details.
1. Select **Save scan**.
### Delete an on-demand scan
To delete an on-demand scan:
-1. From your project's home page, go to **Security & Compliance > On-demand scans**.
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
+1. Select **Secure > On-demand scans**.
1. Select the **Scan library** tab.
1. In the saved scan's row select **More actions** (**{ellipsis_v}**), then select **Delete**.
1. On the confirmation dialog, select **Delete**.
@@ -645,66 +610,63 @@ This data can only be read and decrypted with a valid secrets file.
### Site profile validation
-> - Site profile validation [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/233020) in GitLab 13.8.
-> - Meta tag validation [introduced](https://gitlab.com/groups/gitlab-org/-/epics/6460) in GitLab 14.2.
+> Meta tag validation [introduced](https://gitlab.com/groups/gitlab-org/-/epics/6460) in GitLab 14.2.
Site profile validation reduces the risk of running an active scan against the wrong website. A site
-must be validated before an active scan can run against it. The site validation methods are as
-follows:
+must be validated before an active scan can run against it. Each of the site validation methods are
+equivalent in functionality, so use whichever is most suitable:
-- _Text file validation_ requires a text file be uploaded to the target site. The text file is
+- **Text file validation**: Requires a text file be uploaded to the target site. The text file is
allocated a name and content that is unique to the project. The validation process checks the
file's content.
-- _Header validation_ requires the header `Gitlab-On-Demand-DAST` be added to the target site,
+- **Header validation**: Requires the header `Gitlab-On-Demand-DAST` be added to the target site,
with a value unique to the project. The validation process checks that the header is present, and
checks its value.
-- _Meta tag validation_ requires the meta tag named `gitlab-dast-validation` be added to the target site,
- with a value unique to the project. Make sure it's added to the `<head>` section of the page. The validation process checks that the meta tag is present, and
- checks its value.
-
-All these methods are equivalent in functionality. Use whichever is feasible.
-
-In [GitLab 14.2 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/324990), site profile
-validation happens in a CI job using the [GitLab Runner](../../../ci/runners/index.md).
+- **Meta tag validation**: Requires the meta tag named `gitlab-dast-validation` be added to the
+ target site, with a value unique to the project. Make sure it's added to the `<head>` section of
+ the page. The validation process checks that the meta tag is present, and checks its value.
### Create a site profile
To create a site profile:
-1. From your project's home page, go to **Security & Compliance > Configuration**.
-1. Select **Manage** in the **DAST Profiles** row.
-1. Select **New > Site Profile**.
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
+1. Select **Secure > Security configuration**.
+1. In the **Dynamic Application Security Testing (DAST)** section, select **Manage profiles**.
+1. Select **New > Site profile**.
1. Complete the fields then select **Save profile**.
-The site profile is created.
+The site profile is saved, for use in an on-demand scan.
### Edit a 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.
+NOTE:
+If a site profile is linked to a security policy, you 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**.
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
+1. Select **Secure > Security 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 the **More actions** (**{ellipsis_v}**) menu, then select **Edit**.
1. Edit the fields then select **Save profile**.
### Delete a site profile
+NOTE:
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.
+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. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
+1. Select **Secure > Security 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 the **More actions** (**{ellipsis_v}**) menu, then select **Delete**.
1. Select **Delete** to confirm the deletion.
@@ -766,8 +728,9 @@ 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. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
+1. Select **Secure > Security configuration**.
+1. In the **Dynamic Application Security Testing (DAST)** section, select **Manage profiles**.
1. Beside the validated profile, select **Revoke validation**.
The site profile's validation status is revoked.
@@ -818,9 +781,6 @@ app.get('/dast-website-target', function(req, res) {
## Scanner profile
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/222767) in GitLab 13.4.
-> - [Added](https://gitlab.com/gitlab-org/gitlab/-/issues/225804) in GitLab 13.5: scan mode, AJAX spider, debug messages.
-
A scanner profile defines the configuration details of a security scanner. A scanner profile can be
referenced in `.gitlab-ci.yml` and on-demand scans.
@@ -839,38 +799,41 @@ A scanner profile contains:
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. Select **New > Scanner Profile**.
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
+1. Select **Secure > Security configuration**.
+1. In the **Dynamic Application Security Testing (DAST)** section, select **Manage profiles**.
+1. Select **New > Scanner profile**.
1. Complete the form. For details of each field, see [Scanner profile](#scanner-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.
+NOTE:
+If a scanner profile is linked to a security policy, you cannot edit the profile from this page.
+For more information, see [Scan execution policies](../policies/scan-execution-policies.md).
To edit a scanner profile:
-1. From your project's home page, go to **Security & Compliance > Configuration**.
-1. In the **DAST Profiles** row, select **Manage**.
-1. Select the **Scanner Profiles** tab.
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
+1. Select **Secure > Security configuration**.
+1. In the **Dynamic Application Security Testing (DAST)** section, select **Manage profiles**.
+1. Select the **Scanner profiles** tab.
1. In the scanner's row, select the **More actions** (**{ellipsis_v}**) menu, then select **Edit**.
1. Edit the form.
1. Select **Save profile**.
### Delete a scanner profile
+NOTE:
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.
+page. For more information, see [Scan execution policies](../policies/scan-execution-policies.md).
To delete a scanner profile:
-1. From your project's home page, go to **Security & Compliance > Configuration**.
-1. In the **DAST Profiles** row, select **Manage**.
-1. Select the **Scanner Profiles** tab.
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
+1. Select **Secure > Security configuration**.
+1. In the **Dynamic Application Security Testing (DAST)** section, select **Manage profiles**.
+1. Select the **Scanner profiles** tab.
1. In the scanner's row, select the **More actions** (**{ellipsis_v}**) menu, then select **Delete**.
1. Select **Delete**.
diff --git a/doc/user/application_security/dast_api/index.md b/doc/user/application_security/dast_api/index.md
index d494259ecc4..b03f9102dae 100644
--- a/doc/user/application_security/dast_api/index.md
+++ b/doc/user/application_security/dast_api/index.md
@@ -1950,7 +1950,7 @@ Follow these steps to view details of a vulnerability:
1. You can view vulnerabilities in a project, or a merge request:
- - In a project, go to the project's **Security and Compliance > Vulnerability Report**
+ - In a project, go to the project's **Secure > Vulnerability report**
page. This page shows all vulnerabilities from the default branch only.
- In a merge request, go the merge request's **Security** section and select the **Expand**
button. DAST API vulnerabilities are available in a section labeled
@@ -2360,7 +2360,7 @@ See the following documentation sections for assistance:
See [Performance Tuning and Testing Speed](#performance-tuning-and-testing-speed)
-### Error waiting for DAST API 'http://127.0.0.1:5000' to become available
+### Error: `Error waiting for DAST API 'http://127.0.0.1:5000' to become available`
A bug exists in versions of the DAST API analyzer prior to v1.6.196 that can cause a background process to fail under certain conditions. The solution is to update to a newer version of the DAST API analyzer.
diff --git a/doc/user/application_security/dependency_list/index.md b/doc/user/application_security/dependency_list/index.md
index afed5b3b0ca..d41c0eff860 100644
--- a/doc/user/application_security/dependency_list/index.md
+++ b/doc/user/application_security/dependency_list/index.md
@@ -7,16 +7,19 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Dependency list **(ULTIMATE)**
-> - Application dependencies [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/10075) in GitLab 12.0.
> - System dependencies [introduced](https://gitlab.com/groups/gitlab-org/-/epics/6698) in GitLab 14.6.
+> - Group-level dependency list [introduced](https://gitlab.com/groups/gitlab-org/-/epics/8090) in GitLab 16.2 [with a flag](../../../administration/feature_flags.md) named `group_level_dependencies`. Disabled by default.
-Use the dependency list to review your project's dependencies and key
+FLAG:
+On self-managed GitLab, by default the group-level dependency list is not available. To make it available, an administrator can [enable the feature flag](../../../administration/feature_flags.md) named `group_level_dependencies`. On GitLab.com, this feature is not available.
+
+Use the dependency list to review your project or group's dependencies and key
details about those dependencies, including their known vulnerabilities. It is a collection of dependencies in your project, including existing and new findings.
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
For an overview, see [Project Dependency](https://www.youtube.com/watch?v=ckqkn9Tnbw4).
-To see the dependency list, go to your project and select **Security and Compliance > Dependency list**.
+To see the dependency list, go to your project and select **Secure > Dependency list**.
This information is sometimes referred to as a Software Bill of Materials, SBOM, or BOM.
@@ -89,4 +92,4 @@ You can download your project's list of dependencies and their details in JSON f
### Using the API
-You can download your project's list of dependencies [using the API](../../../api/dependencies.md#list-project-dependencies). Note this only provides the dependencies identified by the Gemnasium family of analyzers and [not any other of the GitLab dependency analyzers](../dependency_scanning/analyzers.md).
+You can download your project's list of dependencies [using the API](../../../api/dependencies.md#list-project-dependencies). Note this only provides the dependencies identified by the [Gemnasium family of analyzers](../dependency_scanning/index.md#dependency-analyzers) and not any other of the GitLab dependency analyzers.
diff --git a/doc/user/application_security/dependency_scanning/analyzers.md b/doc/user/application_security/dependency_scanning/analyzers.md
index 4feac0cb5e6..0d7d495ba49 100644
--- a/doc/user/application_security/dependency_scanning/analyzers.md
+++ b/doc/user/application_security/dependency_scanning/analyzers.md
@@ -1,124 +1,11 @@
---
-type: reference, howto
-stage: Secure
-group: Composition Analysis
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+redirect_to: 'index.md'
+remove_date: '2023-09-22'
---
-# Dependency Scanning Analyzers **(ULTIMATE)**
+This document was moved to [another location](index.md).
-Dependency Scanning supports the following official analyzers:
-
-- [`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)
-
-The analyzers are published as Docker images, which Dependency Scanning uses
-to launch dedicated containers for each analysis.
-
-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**.
-
-## Official default analyzers
-
-Any custom change to the official analyzers can be achieved by using a
-[CI/CD variable in your `.gitlab-ci.yml`](index.md#customizing-the-dependency-scanning-settings).
-
-### Using a custom Docker mirror
-
-You can switch to a custom Docker registry that provides the official analyzer
-images under a different prefix. For instance, the following instructs Dependency
-Scanning to pull `my-docker-registry/gl-images/gemnasium`
-instead of `registry.gitlab.com/security-products/gemnasium`.
-In `.gitlab-ci.yml` define:
-
-```yaml
-include:
- template: Security/Dependency-Scanning.gitlab-ci.yml
-
-variables:
- SECURE_ANALYZERS_PREFIX: my-docker-registry/gl-images
-```
-
-This configuration requires that your custom registry provides images for all
-the official analyzers.
-
-### Disable specific analyzers
-
-You can select the official analyzers you don't want to run. Here's how to disable
-the `gemnasium` analyzer.
-In `.gitlab-ci.yml` define:
-
-```yaml
-include:
- template: Security/Dependency-Scanning.gitlab-ci.yml
-
-variables:
- DS_EXCLUDED_ANALYZERS: "gemnasium"
-```
-
-### Disabling default analyzers
-
-Setting `DS_EXCLUDED_ANALYZERS` to a list of the official analyzers disables them.
-In `.gitlab-ci.yml` define:
-
-```yaml
-include:
- template: Security/Dependency-Scanning.gitlab-ci.yml
-
-variables:
- DS_EXCLUDED_ANALYZERS: "gemnasium, gemnasium-maven, gemnasium-python"
-```
-
-This is used when one totally relies on [custom analyzers](#custom-analyzers).
-
-## Custom analyzers
-
-You can provide your own analyzers by
-defining CI jobs in your CI configuration. For consistency, you should suffix your custom Dependency
-Scanning jobs with `-dependency_scanning`. Here's how to add a scanning job that's based on the
-Docker image `my-docker-registry/analyzers/nuget` and generates a Dependency Scanning report
-`gl-dependency-scanning-report.json` when `/analyzer run` is executed. Define the following in
-`.gitlab-ci.yml`:
-
-```yaml
-nuget-dependency_scanning:
- image:
- name: "my-docker-registry/analyzers/nuget"
- script:
- - /analyzer run
- artifacts:
- reports:
- dependency_scanning: gl-dependency-scanning-report.json
-```
-
-The [Security Scanner Integration](../../../development/integrations/secure.md) documentation explains how to integrate custom security scanners into GitLab.
-
-## Analyzers data
-
-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
-- ð„‚ => 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`, etc).
+<!-- This redirect file can be deleted after <2023-09-22>. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html --> \ No newline at end of file
diff --git a/doc/user/application_security/dependency_scanning/index.md b/doc/user/application_security/dependency_scanning/index.md
index df9e1d72dba..15fed4f2adc 100644
--- a/doc/user/application_security/dependency_scanning/index.md
+++ b/doc/user/application_security/dependency_scanning/index.md
@@ -1,5 +1,4 @@
---
-type: reference, howto
stage: Secure
group: Composition Analysis
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
@@ -17,6 +16,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.
+GitLab offers both Dependency Scanning and [Container Scanning](../container_scanning/index.md) 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. For a comparison of these features, see
+[Dependency Scanning compared to Container Scanning](../comparison_dependency_and_container_scanning.md).
+
If you're using [GitLab CI/CD](../../../ci/index.md), you can use dependency scanning to analyze
your dependencies for known vulnerabilities. GitLab scans all dependencies, including transitive
dependencies (also known as nested dependencies). You can take advantage of dependency scanning by
@@ -38,48 +42,6 @@ vulnerability.
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
For an overview, see [Dependency Scanning](https://www.youtube.com/watch?v=TBnfbGk4c4o).
-## 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 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
- risks the dependencies contain. Dependency Scanning modifies its behavior based
- on the language and package manager of the project. It typically looks for a lock file
- then performs a build to fetch upstream dependency information. In the case of
- containers, Dependency Scanning uses the compatible manifest and reports only these
- declared software dependencies (and those installed as a sub-dependency).
- Dependency Scanning cannot detect software dependencies that are pre-bundled
- into the container's base image. To identify pre-bundled dependencies, enable
- [Container Scanning](../container_scanning/index.md) language scanning using the
- [`CS_DISABLE_LANGUAGE_VULNERABILITY_SCAN` variable](../container_scanning/index.md#report-language-specific-findings).
-- [Container Scanning](../container_scanning/index.md) analyzes your containers and tells
- you about known risks in the operating system's (OS) packages. You can configure it
- to also report on software and language dependencies, if you enable it and use
- the [`CS_DISABLE_LANGUAGE_VULNERABILITY_SCAN` variable](../container_scanning/index.md#report-language-specific-findings).
- Turning this variable on can result in some duplicate findings, as we do not yet
- de-duplicate results between Container Scanning and Dependency Scanning. For more details,
- efforts to de-duplicate these findings can be tracked in
- [this epic](https://gitlab.com/groups/gitlab-org/-/epics/8026).
-
-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> <sup>3</sup> |
-| Dynamically-linked language-specific dependencies installed by the Operating System | **{dotted-circle}** | **{check-circle}** <sup>3</sup> |
-| Operating system dependencies | **{dotted-circle}** | **{check-circle}** |
-| Language-specific dependencies installed on the operating system (not built by your project) | **{dotted-circle}** | **{check-circle}** |
-
-1. Lock file must be present in the image to be detected.
-1. Binary file must be present in the image to be detected.
-1. Only when using Trivy
-
## Requirements
Dependency Scanning runs in the `test` stage, which is available by default. If you redefine the
@@ -101,21 +63,6 @@ If you need it, explain why by filling out [the survey](https://docs.google.com/
## Supported languages and package managers
-Dependency Scanning automatically detects the languages used in the repository. All analyzers
-matching the detected languages are run. There is usually no need to customize the selection of
-analyzers. We recommend not specifying the analyzers so you automatically use the full selection
-for best coverage, avoiding the need to make adjustments when there are deprecations or removals.
-However, you can override the selection using the variable `DS_EXCLUDED_ANALYZERS`.
-
-The language detection relies on CI job [`rules`](../../../ci/yaml/index.md#rules) and searches a
-maximum of two directory levels from the repository's root. For example, the
-`gemnasium-dependency_scanning` job is enabled if a repository contains either `Gemfile`,
-`api/Gemfile`, or `api/client/Gemfile`, but not if the only supported dependency file is `api/v1/client/Gemfile`.
-
-For Java and Python, when a supported dependency file is detected, Dependency Scanning attempts to build the project and execute some Java or Python commands to get the list of dependencies. For all other projects, the lock file is parsed to obtain the list of dependencies without needing to build the project first.
-
-When a supported dependency file is detected, all dependencies, including transitive dependencies are analyzed. There is no limit to the depth of nested or transitive dependencies that are analyzed.
-
The following languages and dependency managers are supported:
<style>
@@ -341,6 +288,40 @@ table.supported-languages ul {
</ol>
<!-- markdownlint-enable MD044 -->
+## Dependency detection
+
+Dependency Scanning automatically detects the languages used in the repository. All analyzers
+matching the detected languages are run. There is usually no need to customize the selection of
+analyzers. We recommend not specifying the analyzers so you automatically use the full selection for
+best coverage, avoiding the need to make adjustments when there are deprecations or removals.
+However, you can override the selection using the variable `DS_EXCLUDED_ANALYZERS`.
+
+The language detection relies on CI job [`rules`](../../../ci/yaml/index.md#rules) and searches a
+maximum of two directory levels from the repository's root. For example, the
+`gemnasium-dependency_scanning` job is enabled if a repository contains either `Gemfile`,
+`api/Gemfile`, or `api/client/Gemfile`, but not if the only supported dependency file is
+`api/v1/client/Gemfile`.
+
+For Java and Python, when a supported dependency file is detected, Dependency Scanning attempts to
+build the project and execute some Java or Python commands to get the list of dependencies. For all
+other projects, the lock file is parsed to obtain the list of dependencies without needing to build
+the project first.
+
+When a supported dependency file is detected, all dependencies, including transitive dependencies
+are analyzed. There is no limit to the depth of nested or transitive dependencies that are analyzed.
+
+### Dependency analyzers
+
+Dependency Scanning supports the following official analyzers:
+
+- [`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)
+
+The analyzers are published as Docker images, which Dependency Scanning uses
+to launch dedicated containers for each analysis. You can also integrate a custom
+[security scanner](../../../development/integrations/secure.md).
+
### How analyzers obtain dependency information
GitLab analyzers obtain dependency information using one of the following two methods:
@@ -358,7 +339,7 @@ The following package managers use lockfiles that GitLab analyzers are capable o
| Composer | Not applicable | [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#L38) |
| Go | Not applicable | [1.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/go-modules/gosum/default/go.sum) <sup><strong><a href="#notes-regarding-parsing-lockfiles-1">1</a></strong></sup> |
-| 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) |
+| NuGet | v1, v2 | [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, v3<sup><b><a href="#notes-regarding-parsing-lockfiles-2">2</a></b></sup> | [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), [9.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/scanner/parser/npm/fixtures/lockfile-v3/simple/package-lock.json#L4) |
| pnpm | v5.3, v5.4, v6 | [7.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/js-pnpm/default/pnpm-lock.yaml#L1), [8.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/scanner/parser/pnpm/fixtures/v6/simple/pnpm-lock.yaml#L1) |
| yarn | v1, v2<sup><b><a href="#notes-regarding-parsing-lockfiles-3">3</a></b></sup>, v3<sup><b><a href="#notes-regarding-parsing-lockfiles-3">3</a></b></sup> | [1.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/js-yarn/classic/default/yarn.lock#L2), [2.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/js-yarn/berry/v2/default/yarn.lock), [3.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/js-yarn/berry/v3/default/yarn.lock) |
@@ -649,12 +630,11 @@ The following variables allow configuration of global dependency scanning settin
| CI/CD variables | Description |
| ----------------------------|------------ |
| `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_EXCLUDED_ANALYZERS` | Specify the analyzers (by name) to exclude from Dependency Scanning. For more information, see [Dependency Scanning Analyzers](#dependency-analyzers). |
| `DS_EXCLUDED_PATHS` | Exclude files and directories from the scan based on the paths. A comma-separated list of patterns. Patterns can be globs (see [`doublestar.Match`](https://pkg.go.dev/github.com/bmatcuk/doublestar/v4@v4.0.2#Match) for supported patterns), 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. ([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.) |
| `DS_MAX_DEPTH` | Defines how many directory levels deep that the analyzer should search for supported files to scan. A value of `-1` scans all directories regardless of depth. Default: `2`. |
-| `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`. |
+| `SECURE_ANALYZERS_PREFIX` | Override the name of the Docker registry providing the official default images (proxy). |
#### Configuring specific analyzers used by dependency scanning
@@ -1044,24 +1024,6 @@ See explanations of the variables above in the [configuration section](#configur
See the following sections for configuring specific languages and package managers.
-#### JavaScript (npm and yarn) projects
-
-Add the following to the variables section of `.gitlab-ci.yml`:
-
-```yaml
-RETIREJS_JS_ADVISORY_DB: "example.com/jsrepository.json"
-RETIREJS_NODE_ADVISORY_DB: "example.com/npmrepository.json"
-```
-
-#### Ruby (gem) projects
-
-Add the following to the variables section of `.gitlab-ci.yml`:
-
-```yaml
-BUNDLER_AUDIT_ADVISORY_DB_REF_NAME: "master"
-BUNDLER_AUDIT_ADVISORY_DB_URL: "gitlab.example.com/ruby-advisory-db.git"
-```
-
#### Python (pip)
If you need to install Python packages before the analyzer runs, you should use `pip install --user` in the `before_script` of the scanning job. The `--user` flag causes project dependencies to be installed in the user directory. If you do not pass the `--user` option, packages are installed globally, and they are not scanned and don't show up when listing project dependencies.
@@ -1173,12 +1135,10 @@ version number).
## Troubleshooting
-### Increase log verbosity
+### Debug-level logging
-When a [job log](../../../ci/jobs/index.md#expand-and-collapse-job-log-sections)
-doesn't contain enough information about a dependency-scanning failure,
-[set `SECURE_LOG_LEVEL` to `debug`](#configuring-dependency-scanning)
-and check the resulting, more verbose log.
+Debug-level logging can help when troubleshooting. For details, see
+[debug-level logging](../index.md#debug-level-logging).
### Working around missing support for certain languages or package managers
diff --git a/doc/user/application_security/iac_scanning/index.md b/doc/user/application_security/iac_scanning/index.md
index 8e2f54fed44..7213fa2ba18 100644
--- a/doc/user/application_security/iac_scanning/index.md
+++ b/doc/user/application_security/iac_scanning/index.md
@@ -250,6 +250,7 @@ kics-iac-sast:
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/368284) in GitLab 15.9 [with a project-level flag](../../../administration/feature_flags.md) named `sec_mark_dropped_findings_as_resolved`.
> - Enabled by default in 15.10. On GitLab.com, [contact Support](https://about.gitlab.com/support/) if you need to disable the flag for your project.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/375128) in GitLab 16.2.
To help you focus on the vulnerabilities that are still relevant, GitLab IaC Scanning automatically [resolves](../vulnerabilities/index.md#vulnerability-status-values) vulnerabilities when:
@@ -270,15 +271,10 @@ pipelines tab on merge requests by [setting `artifacts: paths`](../../../ci/yaml
## Troubleshooting
-### IaC debug logging
+### Debug-level logging
-To help troubleshoot IaC jobs, you can increase the [Secure scanner log verbosity](../sast/index.md#logging-level)
-by using a global CI/CD variable set to `debug`:
-
-```yaml
-variables:
- SECURE_LOG_LEVEL: "debug"
-```
+Debug-level logging can help when troubleshooting. For details, see
+[debug-level logging](../index.md#debug-level-logging).
### IaC Scanning findings show as `No longer detected` unexpectedly
diff --git a/doc/user/application_security/index.md b/doc/user/application_security/index.md
index 8bbe4db62a9..56a79191833 100644
--- a/doc/user/application_security/index.md
+++ b/doc/user/application_security/index.md
@@ -82,7 +82,7 @@ Dependency analysis can run:
image is built - [Container Scanning](container_scanning/index.md).
For more details, see
-[Dependency Scanning compared to Container Scanning](dependency_scanning/index.md#dependency-scanning-compared-to-container-scanning).
+[Dependency Scanning compared to Container Scanning](comparison_dependency_and_container_scanning.md).
Additionally, dependencies in operational container images can be analyzed for vulnerabilities
on a regular schedule or cadence. For more details, see [Operational Container Scanning](../../user/clusters/agent/vulnerabilities.md).
@@ -239,6 +239,16 @@ reports are available to download. To download a report, select
![Security widget](img/security_widget_v13_7.png)
+Security scans produce at least one of these [CI `artifacts:reports` types](../../ci/yaml/artifacts_reports.md):
+
+- `artifacts:reports:api_fuzzing`
+- `artifacts:reports:container_scanning`
+- `artifacts:reports:coverage_fuzzing`
+- `artifacts:reports:dast`
+- `artifacts:reports:dependency_scanning`
+- `artifacts:reports:sast`
+- `artifacts:reports:secret_detection`
+
### Ultimate
A merge request contains a security widget which displays a summary of the _new_ results. New results are determined by comparing the findings of the merge request against the findings of the most recent completed pipeline (`success`, `failed`, `canceled` or `skipped`) for the commit when the feature branch was created from the target branch.
@@ -247,7 +257,10 @@ If security scans have not run for the completed pipeline in the target branch w
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.
-From the merge request security widget, select **Expand** to unfold the widget, displaying any new and no longer detected (removed) findings by scan type. Select **View full report** to go directly to the **Security** tab in the latest branch pipeline.
+From the merge request security widget, select **Expand** to unfold the widget, displaying any new and no longer detected (removed) findings by scan type.
+
+For each security report type, the widget displays the first 25 added and 25 fixed findings, sorted by severity. To see all
+findings, select **View full report** to go directly to the **Security** tab in the latest branch pipeline.
![Security scanning results in a merge request](img/mr_security_scanning_results_v14_3.png)
@@ -523,24 +536,48 @@ Feedback is welcome on our vision for [unifying the user experience for these tw
## Troubleshooting
-<!-- NOTE: The below subsection(`### Secure job failing with exit code 1`) documentation URL is referred in the [/gitlab-org/security-products/analyzers/command](https://gitlab.com/gitlab-org/security-products/analyzers/command/-/blob/main/command.go#L19) repository. If this section/subsection changes, please ensure to update the corresponding URL in the mentioned repository.
--->
+### Logging level
-### Secure job failing with exit code 1
+The verbosity of logs output by GitLab analyzers is determined by the `SECURE_LOG_LEVEL` environment
+variable. Messages of this logging level or higher are output.
+
+From highest to lowest severity, the logging levels are:
+
+- `fatal`
+- `error`
+- `warn`
+- `info` (default)
+- `debug`
+
+#### Debug-level logging
WARNING:
Debug logging can be a serious security risk. The output may contain the content of
environment variables and other secrets available to the job. The output is uploaded
-to the GitLab server and visible in job logs.
+to the GitLab server and is visible in job logs.
-If a Secure job is failing and it's unclear why, add `SECURE_LOG_LEVEL: "debug"` as a global CI/CD variable for
-more verbose output that is helpful for troubleshooting.
+To enable debug-level logging, add the following to your `.gitlab-ci.yml` file:
```yaml
variables:
SECURE_LOG_LEVEL: "debug"
```
+This indicates to all GitLab analyzers that they are to output **all** messages. For more details,
+see [logging level](#logging-level).
+
+<!-- NOTE: The below subsection(`### Secure job failing with exit code 1`) documentation URL is referred in the [/gitlab-org/security-products/analyzers/command](https://gitlab.com/gitlab-org/security-products/analyzers/command/-/blob/main/command.go#L19) repository. If this section/subsection changes, please ensure to update the corresponding URL in the mentioned repository.
+-->
+
+### Secure job failing with exit code 1
+
+If a Secure job is failing and it's unclear why:
+
+1. Enable [debug-level logging](#debug-level-logging).
+1. Run the job.
+1. Examine the job's output.
+1. Set the logging level to `info` (default).
+
### Outdated security reports
When a security report generated for a merge request becomes outdated, the merge request shows a
diff --git a/doc/user/application_security/offline_deployments/index.md b/doc/user/application_security/offline_deployments/index.md
index 1ee4d9b2a19..63f3763cab9 100644
--- a/doc/user/application_security/offline_deployments/index.md
+++ b/doc/user/application_security/offline_deployments/index.md
@@ -7,6 +7,9 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Offline environments **(ULTIMATE SELF)**
+NOTE:
+To set up an offline environment, you must receive an [opt-out exemption of cloud licensing](https://about.gitlab.com/pricing/licensing-faq/cloud-licensing/#offline-cloud-licensing) prior to purchase. For more details, contact your GitLab sales representative.
+
It's possible to run most of the GitLab security scanners when not connected to the internet.
This document describes how to operate Secure Categories (that is, scanner types) in an offline
diff --git a/doc/user/application_security/policies/index.md b/doc/user/application_security/policies/index.md
index bd3da0b5913..4e610d64ec9 100644
--- a/doc/user/application_security/policies/index.md
+++ b/doc/user/application_security/policies/index.md
@@ -13,7 +13,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
Policies in GitLab provide security teams a way to require scans of their choice to be run
whenever a project pipeline runs according to the configuration specified. Security teams can
therefore be confident that the scans they set up have not been changed, altered, or disabled. You
-can access these by navigating to your project's **Security and Compliance > Policies** page.
+can access these by navigating to your project's **Secure > Policies** page.
GitLab supports the following security policies:
@@ -141,7 +141,6 @@ The workaround is to amend your group or instance push rules to allow branches f
### Troubleshooting common issues configuring security policies
-- Confirm that projects contain a `.gitlab-ci.yml` file. This file is required for scan execution policies.
- Confirm that scanners are properly configured and producing results for the latest branch. Security Policies are designed to require approval when there are no results (no security report), as this ensures that no vulnerabilities are introduced. We cannot know if there are any vulnerabilities unless the scans enforced by the policy complete successfully and are evaluated.
- When running scan execution policies based on a SAST action, ensure target repositories contain proper code files. SAST runs different analyzers [based on the types of files in the repo](../sast/index.md#supported-languages-and-frameworks), and if no supported files are found it will not run any jobs. See the [SAST CI template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml) for more details.
- Check for any branch configuration conflicts. If your policy is configured to enforce rules on `main` but some projects within the scope are using `master` as their default branch, the policy is not applied for the latter. Support for specifying the `default` branch in your policies is proposed in [epic 9468](https://gitlab.com/groups/gitlab-org/-/epics/9468).
diff --git a/doc/user/application_security/policies/scan-execution-policies.md b/doc/user/application_security/policies/scan-execution-policies.md
index e18d4d1787e..b84d4d2e49e 100644
--- a/doc/user/application_security/policies/scan-execution-policies.md
+++ b/doc/user/application_security/policies/scan-execution-policies.md
@@ -6,16 +6,32 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Scan execution policies **(ULTIMATE)**
-> - Group-level security policies were [introduced](https://gitlab.com/groups/gitlab-org/-/epics/4425) in GitLab 15.2.
-> - Group-level security policies were [enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/356258) in GitLab 15.4.
+> - Group-level security policies [introduced](https://gitlab.com/groups/gitlab-org/-/epics/4425) in GitLab 15.2.
+> - Group-level security policies [enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/356258) in GitLab 15.4.
> - Operational container scanning [introduced](https://gitlab.com/groups/gitlab-org/-/epics/3410) in GitLab 15.5
-
-Group, subgroup, or project owners can use scan execution policies to require that security scans run on a specified
-schedule or with the project pipeline. The security scan runs with multiple project pipelines if you define the policy
-at a group or subgroup level. GitLab injects the required scans into the CI pipeline as new jobs. In the event
-of a job name collision, GitLab adds a dash and a number to the job name. GitLab increments the number until the name
-no longer conflicts with existing job names. If you create a policy at the group level, it applies to every child project
-or subgroup. You cannot edit a group-level policy from a child project or subgroup.
+> - Support for custom CI variables in the Scan Execution Policies editor [introduced](https://gitlab.com/groups/gitlab-org/-/epics/9566) in GitLab 16.2.
+> - Enforcement of scan execution policies on projects with an existing GitLab CI/CD configuration [introduced](https://gitlab.com/groups/gitlab-org/-/epics/6880) in GitLab 16.2 [with a flag](../../../administration/feature_flags.md) named `scan_execution_policy_pipelines`. Enabled by default.
+
+FLAG:
+On self-managed GitLab, this feature is enabled by default. To disable it, ask an
+administrator to [disable the feature flag](../../../administration/feature_flags.md) named
+`scan_execution_policy_pipelines`. On GitLab.com, this feature is enabled.
+
+Group, subgroup, or project owners can use scan execution policies to require that security scans
+run on a specified schedule or with the project pipeline. The security scan runs with multiple
+project pipelines if you define the policy at a group or subgroup level. GitLab injects the required
+scans into the CI/CD pipeline as new jobs.
+
+Scan execution policies are enforced for all applicable projects, even those without a GitLab
+CI/CD configuration file or where AutoDevOps is disabled. Security policies create the file
+implicitly so that the policies can be enforced. This ensures policies enabling execution of
+secret detection, static analysis, or other scanners that do not require a build in the
+project, are still able to execute and be enforced.
+
+In the event of a job name collision, GitLab appends a hyphen and a number to the job name. GitLab
+increments the number until the name no longer conflicts with existing job names. If you create a
+policy at the group level, it applies to every child project or subgroup. You cannot edit a
+group-level policy from a child project or subgroup.
This feature has some overlap with [compliance framework pipelines](../../group/compliance_frameworks.md#compliance-pipelines),
as we have not [unified the user experience for these two features](https://gitlab.com/groups/gitlab-org/-/epics/7312).
@@ -46,6 +62,13 @@ before the policy changes take effect.
![Scan Execution Policy Editor Rule Mode](img/scan_execution_policy_rule_mode_v15_11.png)
+NOTE:
+Selection of site and scanner profiles using the rule mode editor for DAST execution policies differs based on
+whether the policy is being created at the project or group level. For project-level policies the rule mode editor
+presents a list of profiles to choose from that are already defined in the project. For group-level policies
+you are required to type in the names of the profiles to use, and to prevent pipeline errors, profiles with
+matching names must exist in all of the group's projects.
+
## Scan execution policies schema
The YAML file with scan execution policies consists of an array of objects matching scan execution
@@ -57,41 +80,52 @@ When you save a new policy, GitLab validates its contents against [this JSON sch
If you're not familiar with how to read [JSON schemas](https://json-schema.org/),
the following sections and tables provide an alternative.
-| Field | Type | Possible values | Description |
-|-------|------|-----------------|-------------|
-| `scan_execution_policy` | `array` of scan execution policy | | List of scan execution policies (maximum 5) |
+| Field | Type | Required | Possible values | Description |
+|-------|------|----------|-----------------|-------------|
+| `scan_execution_policy` | `array` of scan execution policy | true | | List of scan execution policies (maximum 5) |
## Scan execution policy schema
-| Field | Type | Possible values | Description |
-|-------|------|-----------------|-------------|
-| `name` | `string` | | Name of the policy. Maximum of 255 characters.|
-| `description` (optional) | `string` | | Description of the policy. |
-| `enabled` | `boolean` | `true`, `false` | Flag to enable (`true`) or disable (`false`) the policy. |
-| `rules` | `array` of rules | | List of rules that the policy applies. |
-| `actions` | `array` of actions | | List of actions that the policy enforces. |
+| Field | Type | Required | Possible values | Description |
+|-------|------|----------|-----------------|-------------|
+| `name` | `string` | true | | Name of the policy. Maximum of 255 characters.|
+| `description` (optional) | `string` | true | | Description of the policy. |
+| `enabled` | `boolean` | true | `true`, `false` | Flag to enable (`true`) or disable (`false`) the policy. |
+| `rules` | `array` of rules | true | | List of rules that the policy applies. |
+| `actions` | `array` of actions | true | | List of actions that the policy enforces. |
## `pipeline` rule type
+> - The `branch_type` field was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/404774) in GitLab 16.1 [with a flag](../../../administration/feature_flags.md) named `security_policies_branch_type`. Disabled by default.
+> - The `branch_type` field was [enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/413062) in GitLab 16.2.
+
This rule enforces the defined actions whenever the pipeline runs for a selected branch.
-| Field | Type | Possible values | Description |
-|-------|------|-----------------|-------------|
-| `type` | `string` | `pipeline` | The rule's type. |
-| `branches` | `array` of `string` | `*` or the branch's name | The branch the given policy applies to (supports wildcard). Cannot be used with the `branch_type` field. |
-| `branch_type` | `string` | `default`, `protected` or `all` | The types of branches the given policy applies to. Cannot be used with the `branches` field. |
+| Field | Type | Required | Possible values | Description |
+|-------|------|----------|-----------------|-------------|
+| `type` | `string` | true | `pipeline` | The rule's type. |
+| `branches` <sup>1</sup> | `array` of `string` | true if `branch_type` field does not exist | `*` or the branch's name | The branch the given policy applies to (supports wildcard). |
+| `branch_type` <sup>1</sup> | `string` | true if `branches` field does not exist | `default`, `protected` or `all` | The types of branches the given policy applies to. |
+
+1. You must specify only one of `branches` or `branch_type`.
## `schedule` rule type
+> - The `branch_type` field was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/404774) in GitLab 16.1 [with a flag](../../../administration/feature_flags.md) named `security_policies_branch_type`. Disabled by default.
+> - The `branch_type` field was [enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/413062) in GitLab 16.2.
+
This rule enforces the defined actions and schedules a scan on the provided date/time.
-| Field | Type | Possible values | Description |
-|------------|------|-----------------|-------------|
-| `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). This field is required if the `agents` field is not set. Cannot be used with the `branch_type` field. |
-| `branch_type` | `string` | `default`, `protected` or `all` | The types of branches the given policy applies to. Cannot be used with the `branches` field. |
-| `cadence` | `string` | CRON expression (for example, `0 0 * * *`) | A whitespace-separated string containing five fields that represents the scheduled time. Minimum of 15 minute intervals when used together with the `branches` field. |
-| `agents` | `object` | | The name of the [GitLab agents](../../clusters/agent/index.md) where [Operational Container Scanning](../../clusters/agent/vulnerabilities.md) runs. The object key is the name of the Kubernetes agent configured for your project in GitLab. This field is required if the `branches` field is not set. |
+| Field | Type | Required | Possible values | Description |
+|------------|------|----------|-----------------|-------------|
+| `type` | `string` | true | `schedule` | The rule's type. |
+| `branches` <sup>1</sup> | `array` of `string` | true if either `branch_type` or `agents` fields does not exist | `*` or the branch's name | The branch the given policy applies to (supports wildcard). |
+| `branch_type` <sup>1</sup> | `string` | true if either `branches` or `agents` fields does not exist | `default`, `protected` or `all` | The types of branches the given policy applies to. |
+| `cadence` | `string` | true | CRON expression (for example, `0 0 * * *`) | A whitespace-separated string containing five fields that represents the scheduled time. Minimum of 15 minute intervals when used together with the `branches` field. |
+| `timezone` | `string` | false | Time zone identifier (for example, `America/New_York`) | Time zone to apply to the cadence. Value must be an IANA Time Zone Database identifier. |
+| `agents` <sup>1</sup> | `object` | true if either `branch_type` or `branches` fields do not exists | | The name of the [GitLab agents](../../clusters/agent/index.md) where [Operational Container Scanning](../../clusters/agent/vulnerabilities.md) runs. The object key is the name of the Kubernetes agent configured for your project in GitLab. |
+
+1. You must specify only one of `branches`, `branch_type`, or `agents`.
GitLab supports the following types of CRON syntax for the `cadence` field:
@@ -118,9 +152,9 @@ When using the `schedule` rule type in conjunction with the `branches` field, no
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 are scanned. |
+| Field | Type | Required | Possible values | Description |
+|--------------|---------------------|----------|--------------------------|-------------|
+| `namespaces` | `array` of `string` | true | The namespace that is scanned. If empty, all namespaces are scanned. |
#### Policy example
diff --git a/doc/user/application_security/policies/scan-result-policies.md b/doc/user/application_security/policies/scan-result-policies.md
index d8cd984ad40..0aac36988d4 100644
--- a/doc/user/application_security/policies/scan-result-policies.md
+++ b/doc/user/application_security/policies/scan-result-policies.md
@@ -61,32 +61,33 @@ When you save a new policy, GitLab validates its contents against [this JSON sch
If you're not familiar with how to read [JSON schemas](https://json-schema.org/),
the following sections and tables provide an alternative.
-| Field | Type | Possible values | Description |
-|-------|------|-----------------|-------------|
-| `scan_result_policy` | `array` of Scan Result Policy | | List of scan result policies (maximum 5). |
+| Field | Type | Required | Possible values | Description |
+|-------|------|----------|-----------------|-------------|
+| `scan_result_policy` | `array` of Scan Result Policy | true | | List of scan result policies (maximum 5). |
## Scan result policy schema
-| Field | Type | Possible values | Description |
-|-------|------|-----------------|-------------|
-| `name` | `string` | | Name of the policy. Maximum of 255 characters.|
-| `description` (optional) | `string` | | Description of the policy. |
-| `enabled` | `boolean` | `true`, `false` | Flag to enable (`true`) or disable (`false`) the policy. |
-| `rules` | `array` of rules | | List of rules that the policy applies. |
-| `actions` | `array` of actions | | List of actions that the policy enforces. |
+| Field | Type | Required |Possible values | Description |
+|-------|------|----------|----------------|-------------|
+| `name` | `string` | true | | Name of the policy. Maximum of 255 characters.|
+| `description` (optional) | `string` | true | | Description of the policy. |
+| `enabled` | `boolean` | true | `true`, `false` | Flag to enable (`true`) or disable (`false`) the policy. |
+| `rules` | `array` of rules | true | | List of rules that the policy applies. |
+| `actions` | `array` of actions | true | | List of actions that the policy enforces. |
## `scan_finding` rule type
This rule enforces the defined actions based on security scan findings.
-| Field | Type | Possible values | Description |
-|------------|------|--------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `type` | `string` | `scan_finding` | The rule's type. |
-| `branches` | `array` of `string` | `[]` or the branch's name | Applicable only to protected target branches. An empty array, `[]`, applies the rule to all protected target branches. |
-| `scanners` | `array` of `string` | `sast`, `secret_detection`, `dependency_scanning`, `container_scanning`, `dast`, `coverage_fuzzing`, `api_fuzzing` | The security scanners for this rule to consider. `sast` includes results from both SAST and SAST IaC scanners. |
-| `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. |
-| `vulnerability_states` | `array` of `string` | `newly_detected`, `detected`, `confirmed`, `resolved`, `dismissed`, `new_needs_triage`, `new_dismissed` | All vulnerabilities fall into two categories:<br><br>**Newly Detected Vulnerabilities** - the `newly_detected` policy option covers vulnerabilities identified in the merge request branch itself but that do not currently exist on the default branch. This policy option requires a pipeline to complete before the rule is evaluated so that it knows whether vulnerabilities are newly detected or not. Merge requests are blocked until the pipeline and necessary security scans are complete. The `newly_detected` option considers both of the following statuses:<br><br> • Detected<br> • Dismissed<br><br> The `new_needs_triage` option considers the status<br><br> • Detected<br><br> The `new_dismissed` option considers the status<br><br> • Dismissed<br><br>**Pre-Existing Vulnerabilities** - these policy options are evaluated immediately and do not require a pipeline complete as they consider only vulnerabilities previously detected in the default branch.<br><br> • `Detected` - the policy looks for vulnerabilities in the detected state.<br> • `Confirmed` - the policy looks for vulnerabilities in the confirmed state.<br> • `Dismissed` - the policy looks for vulnerabilities in the dismissed state.<br> • `Resolved` - the policy looks for vulnerabilities in the resolved state. |
+| Field | Type | Required | Possible values | Description |
+|-------|------|----------|-----------------|-------------|
+| `type` | `string` | true | `scan_finding` | The rule's type. |
+| `branches` | `array` of `string` | true if `branch_type` field does not exist | `[]` or the branch's name | Applicable only to protected target branches. An empty array, `[]`, applies the rule to all protected target branches. Cannot be used with the `branch_type` field. |
+| `branch_type` | `string` | true if `branches` field does not exist | `default` or `protected` | The types of branches the given policy applies to. Cannot be used with the `branches` field. |
+| `scanners` | `array` of `string` | true | `sast`, `secret_detection`, `dependency_scanning`, `container_scanning`, `dast`, `coverage_fuzzing`, `api_fuzzing` | The security scanners for this rule to consider. `sast` includes results from both SAST and SAST IaC scanners. |
+| `vulnerabilities_allowed` | `integer` | true | Greater than or equal to zero | Number of vulnerabilities allowed before this rule is considered. |
+| `severity_levels` | `array` of `string` | true | `info`, `unknown`, `low`, `medium`, `high`, `critical` | The severity levels for this rule to consider. |
+| `vulnerability_states` | `array` of `string` | true | `newly_detected`, `detected`, `confirmed`, `resolved`, `dismissed`, `new_needs_triage`, `new_dismissed` | All vulnerabilities fall into two categories:<br><br>**Newly Detected Vulnerabilities** - the `newly_detected` policy option covers vulnerabilities identified in the merge request branch itself but that do not currently exist on the default branch. This policy option requires a pipeline to complete before the rule is evaluated so that it knows whether vulnerabilities are newly detected or not. Merge requests are blocked until the pipeline and necessary security scans are complete. The `newly_detected` option considers both of the following statuses:<br><br> • Detected<br> • Dismissed<br><br> The `new_needs_triage` option considers the status<br><br> • Detected<br><br> The `new_dismissed` option considers the status<br><br> • Dismissed<br><br>**Pre-Existing Vulnerabilities** - these policy options are evaluated immediately and do not require a pipeline complete as they consider only vulnerabilities previously detected in the default branch.<br><br> • `Detected` - the policy looks for vulnerabilities in the detected state.<br> • `Confirmed` - the policy looks for vulnerabilities in the confirmed state.<br> • `Dismissed` - the policy looks for vulnerabilities in the dismissed state.<br> • `Resolved` - the policy looks for vulnerabilities in the resolved state. |
## `license_finding` rule type
@@ -95,28 +96,29 @@ This rule enforces the defined actions based on security scan findings.
This rule enforces the defined actions based on license findings.
-| Field | Type | Possible values | Description |
-|------------|------|-----------------|-------------|
-| `type` | `string` | `license_finding` | The rule's type. |
-| `branches` | `array` of `string` | `[]` or the branch's name | Applicable only to protected target branches. An empty array, `[]`, applies the rule to all protected target branches. |
-| `match_on_inclusion` | `boolean` | `true`, `false` | Whether the rule matches inclusion or exclusion of licenses listed in `license_types`. |
-| `license_types` | `array` of `string` | license types | License types to match on, for example `BSD` or `MIT`. |
-| `license_states` | `array` of `string` | `newly_detected`, `detected` | Whether to match newly detected and/or previously detected licenses. The `newly_detected` state triggers approval when either a new package is introduced or when a new license for an existing package is detected. |
+| Field | Type | Required | Possible values | Description |
+|------------|------|----------|-----------------|-------------|
+| `type` | `string` | true | `license_finding` | The rule's type. |
+| `branches` | `array` of `string` | true if `branch_type` field does not exist | `[]` or the branch's name | Applicable only to protected target branches. An empty array, `[]`, applies the rule to all protected target branches. Cannot be used with the `branch_type` field. |
+| `branch_type` | `string` | true if `branches` field does not exist | `default` or `protected` | The types of branches the given policy applies to. Cannot be used with the `branches` field. |
+| `match_on_inclusion` | `boolean` | true | `true`, `false` | Whether the rule matches inclusion or exclusion of licenses listed in `license_types`. |
+| `license_types` | `array` of `string` | true | license types | [SPDX license names](https://spdx.org/licenses) to match on, for example `Affero General Public License v1.0` or `MIT License`. |
+| `license_states` | `array` of `string` | true | `newly_detected`, `detected` | Whether to match newly detected and/or previously detected licenses. The `newly_detected` state triggers approval when either a new package is introduced or when a new license for an existing package is detected. |
## `require_approval` action type
This action sets an approval rule to be required when conditions are met for at least one rule in
the defined policy.
-| Field | Type | Possible values | Description |
-|-------|------|-----------------|-------------|
-| `type` | `string` | `require_approval` | The action's type. |
-| `approvals_required` | `integer` | Greater than or equal to zero | The number of MR approvals required. |
-| `user_approvers` | `array` of `string` | Username of one of more users | The users to consider as approvers. Users must have access to the project to be eligible to approve. |
-| `user_approvers_ids` | `array` of `integer` | ID of one of more users | The IDs of users to consider as approvers. Users must have access to the project to be eligible to approve. |
-| `group_approvers` | `array` of `string` | Path of one of more groups | The groups to consider as approvers. Users with [direct membership in the group](../../project/merge_requests/approvals/rules.md#group-approvers) are eligible to approve. |
-| `group_approvers_ids` | `array` of `integer` | ID of one of more groups | The IDs of groups to consider as approvers. Users with [direct membership in the group](../../project/merge_requests/approvals/rules.md#group-approvers) are eligible to approve. |
-| `role_approvers` | `array` of `string` | One or more [roles](../../../user/permissions.md#roles) (for example: `owner`, `maintainer`) | The roles to consider as approvers that are eligible to approve. |
+| Field | Type | Required | Possible values | Description |
+|-------|------|----------|-----------------|-------------|
+| `type` | `string` | true | `require_approval` | The action's type. |
+| `approvals_required` | `integer` | true | Greater than or equal to zero | The number of MR approvals required. |
+| `user_approvers` | `array` of `string` | false | Username of one of more users | The users to consider as approvers. Users must have access to the project to be eligible to approve. |
+| `user_approvers_ids` | `array` of `integer` | false | ID of one of more users | The IDs of users to consider as approvers. Users must have access to the project to be eligible to approve. |
+| `group_approvers` | `array` of `string` | false | Path of one of more groups | The groups to consider as approvers. Users with [direct membership in the group](../../project/merge_requests/approvals/rules.md#group-approvers) are eligible to approve. |
+| `group_approvers_ids` | `array` of `integer` | false | ID of one of more groups | The IDs of groups to consider as approvers. Users with [direct membership in the group](../../project/merge_requests/approvals/rules.md#group-approvers) are eligible to approve. |
+| `role_approvers` | `array` of `string` | false | One or more [roles](../../../user/permissions.md#roles) (for example: `owner`, `maintainer`) | The roles to consider as approvers that are eligible to approve. |
Requirements and limitations:
@@ -215,7 +217,16 @@ It corresponds to a single object from the previous example:
There are several situations where the scan result policy requires an additional approval step. For example:
-- The number of security jobs is reduced in the working branch and no longer matches the number of security jobs in the target branch. Users can't skip the Scanning Result Policies by removing scanning jobs from the CI configuration.
+- The number of security jobs is reduced in the working branch and no longer matches the number of
+ security jobs in the target branch. Users can't skip the Scanning Result Policies by removing
+ scanning jobs from the CI/CD configuration. Only the security scans that are configured in the
+ scan result policy rules are checked for removal.
+
+ For example, consider a situation where the default branch pipeline has four security scans:
+ `sast`, `secret_detection`, `container_scanning`, and `dependency_scanning`. A scan result
+ policy enforces two scanners: `container_scanning` and `dependency_scanning`. If an MR removes a
+ scan that is configured in scan result policy, `container_scanning` for example, an additional
+ approval is required.
- Someone stops a pipeline security job, and users can't skip the security scan.
- A job in a merge request fails and is configured with `allow_failure: false`. As a result, the pipeline is in a blocked state.
- A pipeline has a manual job that must run successfully for the entire pipeline to pass.
diff --git a/doc/user/application_security/sast/index.md b/doc/user/application_security/sast/index.md
index 2008375d2a2..a9bc331ae7b 100644
--- a/doc/user/application_security/sast/index.md
+++ b/doc/user/application_security/sast/index.md
@@ -172,6 +172,7 @@ GitLab SAST uses an advanced vulnerability tracking algorithm to more accurately
Advanced vulnerability tracking is available in a subset of the [supported languages](#supported-languages-and-frameworks) and [analyzers](analyzers.md):
- C, in the Semgrep-based analyzer only
+- C#, in the Semgrep-based analyzer only
- Go, in the Semgrep-based analyzer only
- Java, in the Semgrep-based analyzer only
- JavaScript, in the Semgrep-based analyzer only
@@ -186,6 +187,7 @@ For more information, see the confidential project `https://gitlab.com/gitlab-or
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/368284) in GitLab 15.9 [with a project-level flag](../../../administration/feature_flags.md) named `sec_mark_dropped_findings_as_resolved`.
> - Enabled by default in GitLab 15.10. On GitLab.com, [contact Support](https://about.gitlab.com/support/) if you need to disable the flag for your project.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/375128) in GitLab 16.2.
To help you focus on the vulnerabilities that are still relevant, GitLab SAST automatically [resolves](../vulnerabilities/index.md#vulnerability-status-values) vulnerabilities when:
@@ -290,9 +292,7 @@ The method you can use depends on your GitLab license tier.
#### Configure SAST with customizations **(ULTIMATE)**
-> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3659) in GitLab 13.3.
-> - [Improved](https://gitlab.com/gitlab-org/gitlab/-/issues/232862) in GitLab 13.4.
-> - [Improved](https://gitlab.com/groups/gitlab-org/-/epics/3635) in GitLab 13.5.
+> [Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/410013) individual SAST analyzers configuration options from the UI in GitLab 16.2.
NOTE:
The configuration tool works best with no existing `.gitlab-ci.yml` file, or with a minimal
@@ -309,9 +309,6 @@ To enable and configure SAST with customizations:
Custom values are stored in the `.gitlab-ci.yml` file. For CI/CD variables not in the SAST
Configuration page, their values are inherited from the GitLab SAST template.
-
-1. Optionally, expand the **SAST analyzers** section, select individual
- [SAST analyzers](analyzers.md) and enter custom analyzer values.
1. Select **Create Merge Request**.
1. Review and merge the merge request.
@@ -519,21 +516,6 @@ variables:
SEARCH_MAX_DEPTH: 10
```
-#### Logging level
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/10880) in GitLab 13.1.
-
-To control the verbosity of logs, set the `SECURE_LOG_LEVEL` environment variable. Messages of this
-logging level or higher are output.
-
-From highest to lowest severity, the logging levels are:
-
-- `fatal`
-- `error`
-- `warn`
-- `info` (default)
-- `debug`
-
#### Custom Certificate Authority
To trust a custom Certificate Authority, set the `ADDITIONAL_CA_CERT_BUNDLE` variable to the bundle
@@ -616,7 +598,7 @@ flags are added to the scanner's CLI options.
| Analyzer | CLI option | Description |
|------------------------------------------------------------------------------|--------------------|------------------------------------------------------------------------------|
| [Semgrep](https://gitlab.com/gitlab-org/security-products/analyzers/semgrep) | `--max-memory` | Sets the maximum system memory to use when running a rule on a single file. Measured in MB. |
-| [Flawfinder](https://gitlab.com/gitlab-org/security-products/analyzers/flawfinder) | `--neverignore` | Never ignore security issues, even if they have an “ignore†directive in a comment. Adding this option is likely to result in the analyzer detecting additional vulnerability findings which cannot be automatically resolved. |
+| [Flawfinder](https://gitlab.com/gitlab-org/security-products/analyzers/flawfinder) | `--neverignore` | Never ignore security issues, even if they have an "ignore" directive in a comment. Adding this option is likely to result in the analyzer detecting additional vulnerability findings which cannot be automatically resolved. |
| [SpotBugs](https://gitlab.com/gitlab-org/security-products/analyzers/spotbugs) | `-effort` | Sets the analysis effort level. Valid values are `min`, `less`, `more` and `max`, defined in increasing order of scan's precision and ability to detect more vulnerabilities. Default value is set to `max` which may require more memory and time to complete the scan, depending on the project's size. In case you face memory or performance issues, you may reduce the analysis effort level to a lower value. For example: `-effort less`. |
#### Custom CI/CD variables
@@ -772,14 +754,10 @@ By default SAST analyzers are supported in GitLab instances hosted on SELinux. A
## Troubleshooting
-### SAST debug logging
-
-Increase the [Secure scanner log verbosity](#logging-level) to `debug` in a global CI variable to help troubleshoot SAST jobs.
+### Debug-level logging
-```yaml
-variables:
- SECURE_LOG_LEVEL: "debug"
-```
+Debug-level logging can help when troubleshooting. For details, see
+[debug-level logging](../index.md#debug-level-logging).
### Pipeline errors related to changes in the GitLab-managed CI/CD template
diff --git a/doc/user/application_security/secret_detection/automatic_response.md b/doc/user/application_security/secret_detection/automatic_response.md
index 8f78d36976b..66ed2f10a3c 100644
--- a/doc/user/application_security/secret_detection/automatic_response.md
+++ b/doc/user/application_security/secret_detection/automatic_response.md
@@ -23,6 +23,7 @@ GitLab supports automatic response for the following types of secrets:
| GitLab [Personal access tokens](../../profile/personal_access_tokens.md) | Immediately revoke token, send email to owner | ✅ | ✅ [15.9 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/371658) |
| Amazon Web Services (AWS) [IAM access keys](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html) | Notify AWS | ✅ | ⚙ |
| Google Cloud [service account keys](https://cloud.google.com/iam/docs/best-practices-for-managing-service-account-keys), [API keys](https://cloud.google.com/docs/authentication/api-keys), and [OAuth client secrets](https://support.google.com/cloud/answer/6158849#rotate-client-secret) | Notify Google Cloud | ✅ | ⚙ |
+| Postman [API keys](https://learning.postman.com/docs/developer/postman-api/authentication/) | Notify Postman; Postman emails the key owner | ✅ | ⚙ |
**Component legend**
diff --git a/doc/user/application_security/secret_detection/index.md b/doc/user/application_security/secret_detection/index.md
index 2e6de222ec3..ea2a66c7cc7 100644
--- a/doc/user/application_security/secret_detection/index.md
+++ b/doc/user/application_security/secret_detection/index.md
@@ -40,7 +40,7 @@ contains more than 100 patterns.
Most Secret Detection patterns search for specific types of secrets.
Many services add prefixes or other structural details to their secrets so they can be identified if they're leaked.
-For example, GitLab [adds a `glpat-` prefix](../../admin_area/settings/account_and_limit_settings.md#personal-access-token-prefix) to project, group, and personal access tokens by default.
+For example, GitLab [adds a `glpat-` prefix](../../../administration/settings/account_and_limit_settings.md#personal-access-token-prefix) to project, group, and personal access tokens by default.
To provide more reliable, high-confidence results, Secret Detection only looks for passwords or other unstructured secrets in specific contexts like URLs.
@@ -83,7 +83,7 @@ Secret Detection can detect if a secret was added in one commit and removed in a
- Commit range
- If the `SECRET_DETECTION_LOG_OPTS` variable is set, the secrets analyzer fetches the entire
+ If the `SECRET_DETECTION_LOG_OPTIONS` variable is set, the secrets analyzer fetches the entire
history of the branch or reference the pipeline is being run for. Secret Detection then runs,
scanning the commit range specified.
@@ -621,7 +621,7 @@ The check is always on; you don't have to set it up.
Your text is checked for the following secret types:
- GitLab [personal access tokens](../../../security/token_overview.md#personal-access-tokens)
- - If a [personal access token prefix](../../../user/admin_area/settings/account_and_limit_settings.md#personal-access-token-prefix) has been configured, a token using this prefix is checked.
+ - If a [personal access token prefix](../../../administration/settings/account_and_limit_settings.md#personal-access-token-prefix) has been configured, a token using this prefix is checked.
- GitLab [feed tokens](../../../security/token_overview.md#feed-token)
This feature is separate from Secret Detection scanning, which checks your Git repository for leaked secrets.
@@ -629,21 +629,10 @@ This feature is separate from Secret Detection scanning, which checks your Git r
## Troubleshooting
-### Set the logging level
+### Debug-level logging
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/10880) in GitLab 13.1.
-
-Set the logging level to `debug` when you need diagnostic information in a Secret Detection job log.
-
-WARNING:
-Debug logging can be a serious security risk. The output may contain the content of environment
-variables and other secrets available to the job. The output is uploaded to the GitLab server and
-visible in job logs.
-
-1. In the `.gitlab-ci.yml` file, set the `SECURE_LOG_LEVEL` CI/CD variable to `debug`.
-1. Run the Secret Detection job.
-1. Analyze the content of the Secret Detection job.
-1. In the `.gitlab-ci.yml` file, set the `SECURE_LOG_LEVEL` CI/CD variable to `info` (default).
+Debug-level logging can help when troubleshooting. For details, see
+[debug-level logging](../index.md#debug-level-logging).
### Warning: `gl-secret-detection-report.json: no matching files`
@@ -661,8 +650,8 @@ For example, you could have a pipeline triggered from a merge request containing
clone is not deep enough to contain all of the relevant commits. To verify the current value, see
[pipeline configuration](../../../ci/pipelines/settings.md#limit-the-number-of-changes-fetched-during-clone).
-To confirm this as the cause of the error, set the [logging level](#set-the-logging-level) to
-`debug`, then rerun the pipeline. The logs should look similar to the following example. The text
+To confirm this as the cause of the error, enable [debug-level logging](../index.md#debug-level-logging),
+then rerun the pipeline. The logs should look similar to the following example. The text
"object not found" is a symptom of this error.
```plaintext
diff --git a/doc/user/application_security/vulnerabilities/index.md b/doc/user/application_security/vulnerabilities/index.md
index 39d8e28e564..1950c620627 100644
--- a/doc/user/application_security/vulnerabilities/index.md
+++ b/doc/user/application_security/vulnerabilities/index.md
@@ -199,8 +199,9 @@ To manually apply the patch that GitLab generated for a vulnerability:
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/6176) in GitLab 14.9.
NOTE:
-Security training is not available in an offline environment because it uses content from
-third-party vendors.
+Security training is not accessible in an environment that is offline, meaning computers that are isolated from the public internet as a security measure. Some third-party training vendors may require you to sign up for a _free_ account. Sign up for an account by going to
+any of [Secure Code Warrior](https://www.securecodewarrior.com/), [Kontra](https://application.security/), or [SecureFlag](https://www.secureflag.com/).
+GitLab does not send any user information to these third-party vendors; we do send the CWE or OWASP identifier and the language name of the file extension.
Security training helps your developers learn how to fix vulnerabilities. Developers can view security training from selected educational providers, relevant to the detected vulnerability.
@@ -211,6 +212,8 @@ To enable security training for vulnerabilities in your project:
1. On the tab bar, select **Vulnerability Management**.
1. To enable a security training provider, turn on the toggle.
+Each integration submits the Vulnerability identifier, for example CWE or OWASP, and the language to the security training vendor. The resulting link to the vendor training is what appears in a GitLab Vulnerability.
+
## View security training for a vulnerability
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/6176) in GitLab 14.9.
@@ -218,8 +221,8 @@ To enable security training for vulnerabilities in your project:
The vulnerability page may include a training link relevant to the detected vulnerability if security training is enabled.
The availability of training depends on whether the enabled training vendor has content matching the particular vulnerability.
Training content is requested based on the [vulnerability identifiers](../../../development/integrations/secure.md#identifiers).
-The identifier given to a vulnerability varies from one vulnerability to the next. The available training
-content varies between vendors. This means some vulnerabilities do not display training content.
+The identifier given to a vulnerability varies from one vulnerability to the next and the available training
+content varies between vendors. Some vulnerabilities do not display training content.
Vulnerabilities with a CWE are most likely to return a training result.
To view the security training for a vulnerability:
diff --git a/doc/user/application_security/vulnerabilities/severities.md b/doc/user/application_security/vulnerabilities/severities.md
index ab90ac18b8e..9553d15bbe9 100644
--- a/doc/user/application_security/vulnerabilities/severities.md
+++ b/doc/user/application_security/vulnerabilities/severities.md
@@ -18,7 +18,33 @@ most to least severe:
- `Info`
- `Unknown`
-Most GitLab vulnerability analyzers are wrappers around popular open source scanning tools. Each
+GitLab analyzers make an effort to fit the severity descriptions below, but they may not always be correct. Analyzers and scanners provided by third-party vendors may not follow the same classification.
+
+## Critical severity
+
+Vulnerabilities identified at the Critical Severity level should be investigated immediately. Vulnerabilities at this level assume exploitation of the flaw could lead to full system or data compromise. Examples of critical severity flaws are Command/Code Injection and SQL Injection. Typically these flaws are rated with CVSS 3.1 between 9.0-10.0.
+
+## High severity
+
+High severity vulnerabilities can be characterized as flaws that may lead to an attacker accessing application resources or unintended exposure of data. Examples of high severity flaws are External XML Entity Injection (XXE), Server Side Request Forgery (SSRF), Local File Include/Path Traversal and certain forms of Cross-Site Scripting (XSS). Typically these flaws are rated with CVSS 3.1 between 7.0-8.9.
+
+## Medium severity
+
+Medium severity vulnerabilities usually arise from misconfiguration of systems or lack of security controls. Exploitation of these vulnerabilities may lead to accessing a restricted amount of data or could be used in conjunction with other flaws to gain unintended access to systems or resources. Examples of medium severity flaws are reflected XSS, incorrect HTTP session handling, and missing security controls. Typically these flaws are rated with CVSS 3.1 between 4.0-6.9.
+
+## Low severity
+
+Low severity vulnerabilities contain flaws that may not be directly exploitable but introduce unnecessary weakness to an application or system. These flaws are usually due to missing security controls, or unnecessary disclose information about the application environment. Examples of low severity vulnerabilities are missing cookie security directives, verbose error or exception messages. Typically these flaws are rated with CVSS 3.1 between 1.0-3.9.
+
+## Info severity
+
+Info level severity vulnerabilities contain information that may have value, but are not necessarily associated to a particular flaw or weakness. Typically these issues do not have a CVSS rating.
+
+## Unknown severity
+
+Issues identified at this level do not have enough context to clearly demonstrate severity.
+
+GitLab vulnerability analyzers include popular open source scanning tools. Each
open source scanning tool provides their own native vulnerability severity level value. These values
can be one of the following:
diff --git a/doc/user/asciidoc.md b/doc/user/asciidoc.md
index f04fece7b76..d2041083d36 100644
--- a/doc/user/asciidoc.md
+++ b/doc/user/asciidoc.md
@@ -411,7 +411,7 @@ Color written inside backticks is followed by a color "chip":
### Equations and Formulas (STEM)
-If you need to include Science, Technology, Engineering and Math (STEM)
+If you need to include Science, Technology, Engineering, and Math (STEM)
expressions, set the `stem` attribute in the document's header to `latexmath`.
Equations and formulas are rendered using [KaTeX](https://katex.org/):
diff --git a/doc/user/award_emojis.md b/doc/user/award_emojis.md
index c3aad86461b..aaba0225653 100644
--- a/doc/user/award_emojis.md
+++ b/doc/user/award_emojis.md
@@ -6,11 +6,12 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Emoji reactions **(FREE)**
-> - [Renamed](https://gitlab.com/gitlab-org/gitlab/-/issues/409884) from "award emojis" to "emoji reactions" in GitLab 16.0.
-> - Reacting with emojis on work items (such as tasks, objectives, and key results) [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/393599) in GitLab 16.0.
+> - [Renamed](https://gitlab.com/gitlab-org/gitlab/-/issues/409884) from "award emoji" to "emoji reactions" in GitLab 16.0.
+> - Reacting with emoji on work items (such as tasks, objectives, and key results) [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/393599) in GitLab 16.0.
+> - Reacting with emoji on design discussion comments [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/29756) in GitLab 16.2.
When you're collaborating online, you get fewer opportunities for high-fives
-and thumbs-ups. React with emojis on:
+and thumbs-ups. React with emoji on:
- [Issues](project/issues/index.md).
- [Tasks](tasks.md).
@@ -25,19 +26,10 @@ and thumbs-ups. React with emojis on:
Emoji reactions make it much easier to give and receive feedback without a long
comment thread.
-For information on the relevant API, see [Emoji reactions API](../api/award_emoji.md).
-
-## Sort issues and merge requests on vote count
-
-You can quickly sort issues and merge requests by the number of votes ("thumbs up" and "thumbs down" emoji) they
-have received. The sort options can be found in the dropdown list as "Most
-popular" and "Least popular".
+"Thumbs up" and "thumbs down" emoji are used to calculate an issue or merge request's position when
+[sorting by popularity](project/issues/sorting_issue_lists.md#sorting-by-popularity).
-![Votes sort options](img/award_emoji_votes_sort_options.png)
-
-The total number of votes is not summed up. An issue with 18 upvotes and 5
-downvotes is considered more popular than an issue with 17 upvotes and no
-downvotes.
+For information on the relevant API, see [Emoji reactions API](../api/award_emoji.md).
## Emoji reactions for comments
@@ -51,14 +43,26 @@ To add an emoji reaction:
To remove an emoji reaction, select the emoji again.
-## Custom emojis
+## Custom emoji
+
+> - [Introduced for GraphQL API](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37911) in GitLab 13.6 [with a flag](../administration/feature_flags.md) named `custom_emoji`. Disabled by default.
+> - Enabled on GitLab.com in GitLab 14.0.
+> - [Added](https://gitlab.com/gitlab-org/gitlab/-/issues/333095) UI to add emoji in GitLab 16.2.
+
+Custom emoji show in the emoji picker everywhere you can react with emoji.
+To add an emoji reaction to a comment or description:
+
+1. Select **Add reaction** (**{slight-smile}**).
+1. Select the GitLab logo (**{tanuki}**) or scroll down to the **Custom** section.
+1. Select an emoji from the emoji picker.
+
+![Custom emoji in emoji picker](img/custom_emoji_reactions_v16_2.png)
-You can upload custom emojis to a GitLab instance with the GraphQL API.
-For more information, see [Use custom emojis with GraphQL](../api/graphql/custom_emoji.md).
+To use them in a text box, type the filename between two colons.
+For example, `:thank-you:`.
-Custom emojis don't show in the emoji picker.
-To use them in a text box, type the filename without the extension and surrounded by colons.
-For example, for a file named `thank-you.png`, type `:thank-you:`.
+You can upload custom emoji to a GitLab instance with the GraphQL API.
+For more information, see [Use custom emoji with GraphQL](../api/graphql/custom_emoji.md).
-For a list of custom emojis available for GitLab.com, see
+For a list of custom emoji available for GitLab.com, see
[the `custom_emoji` project](https://gitlab.com/custom_emoji/custom_emoji/-/tree/main/img).
diff --git a/doc/user/clusters/agent/gitops.md b/doc/user/clusters/agent/gitops.md
index 106f751555a..aff78ed477b 100644
--- a/doc/user/clusters/agent/gitops.md
+++ b/doc/user/clusters/agent/gitops.md
@@ -11,10 +11,10 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/346567) from GitLab Premium to GitLab Free in 15.3.
> - [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/346585) to make the `id` attribute optional in GitLab 15.7.
> - Specifying a branch, tag, or commit reference to fetch the Kubernetes manifest files [introduced](https://gitlab.com/groups/gitlab-org/-/epics/4516) in GitLab 15.7.
+> - [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/395364) in GitLab 16.1 to prioritize Flux for GitOps.
-NOTE:
-From GitLab 15.10, you should use [Flux](gitops/flux.md) for GitOps. For more information, see
-[this announcement blog post](https://about.gitlab.com/blog/2023/02/08/why-did-we-choose-to-integrate-fluxcd-with-gitlab/).
+GitLab integrates [Flux](https://fluxcd.io/flux/) for GitOps.
+To get started with Flux, see the [Flux for GitOps tutorial](gitops/flux_tutorial.md).
With GitOps, you can manage containerized clusters and applications from a Git repository that:
@@ -25,163 +25,155 @@ By combining GitLab, Kubernetes, and GitOps, you can have:
- GitLab as the GitOps operator.
- Kubernetes as the automation and convergence system.
-- GitLab CI/CD for Continuous Integration and the agent for Continuous Deployment.
+- GitLab CI/CD for Continuous Integration.
+- The agent for Continuous Deployment and cluster observability.
- Built-in automatic drift remediation.
- Resource management with [server-side applies](https://kubernetes.io/docs/reference/using-api/server-side-apply/) for transparent multi-actor field management.
+## Deployment sequence
+
This diagram shows the repositories and main actors in a GitOps deployment:
```mermaid
sequenceDiagram
participant D as Developer
participant A as Application code repository
- participant M as Manifest repository
- participant K as GitLab agent
+ participant M as Deployment repository
+ participant R as OCI registry
participant C as Agent configuration repository
+ participant K as GitLab agent
+ participant F as Flux
loop Regularly
K-->>C: Grab the configuration
end
D->>+A: Pushing code changes
A->>M: Updating manifest
- loop Regularly
- K-->>M: Watching changes
- M-->>K: Pulling and applying changes
- end
+ M->>R: Build an OCI artifact
+ M->>K: Notify
+ K->>F: Notify and watch sync
+ R-->>F: Pulling and applying changes
+ K->>M: Notify after sync
```
-For details, view the [architecture documentation](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/doc/architecture.md#high-level-architecture).
+You should use both Flux and `agentk` for GitOps deployments. Flux keeps the cluster state synchronized with the source, while `agentk` simplifies the Flux setup, provides cluster-to-GitLab access management, and visualizes the cluster state in the GitLab UI.
-## GitOps workflow steps
+### OCI for source control
-To update a Kubernetes cluster by using GitOps, complete the following steps.
+You should use OCI images as a source controller for Flux, instead of a Git repository. The [GitLab container registry](../../packages/container_registry/index.md) supports OCI images.
-1. Ensure you have a working Kubernetes cluster, and that the manifests or [Helm charts](gitops/helm.md) are in a GitLab project.
-1. In the same project, [register and install the GitLab agent](install/index.md).
-1. Configure the agent configuration file so that the agent monitors the project for changes to the Kubernetes manifests.
- Use the [GitOps configuration reference](#gitops-configuration-reference) for guidance.
+| OCI registry | Git repository |
+| --- | --- |
+| Designed to serve container images at scale. | Designed to version and store source code. |
+| Immutable, supports security scans. | Mutable. |
+| The default Git branch can store cluster state without triggering a sync. | The default Git branch triggers a sync when used to store cluster state. |
-Any time you commit updates to your Kubernetes manifests, the agent updates the cluster.
+## Repository structure
-## GitOps configuration reference
+To simplify configuration, use one delivery repository per team.
+You can package the delivery repository into multiple OCI images per application.
-The following snippet shows an example of the possible keys and values for the GitOps section of an [agent configuration file](install/index.md#create-an-agent-configuration-file) (`config.yaml`).
+For additional repository structure recommendations, see the [Flux documentation](https://fluxcd.io/flux/guides/repository-structure/).
-```yaml
-gitops:
- manifest_projects:
- - id: gitlab-org/cluster-integration/gitlab-agent
- ref: # either `branch`, `tag` or `commit` can be specified
- branch: production
- # commit: <mysha>
- # tag: v1.0
- default_namespace: my-ns
- paths:
- # Read all YAML files from this directory.
- - glob: '/team1/app1/*.yaml'
- # Read all .yaml files from team2/apps and all subdirectories.
- - glob: '/team2/apps/**/*.yaml'
- # If 'paths' is not specified or is an empty list, the configuration below is used.
- - glob: '/**/*.{yaml,yml,json}'
- reconcile_timeout: 3600s
- dry_run_strategy: none
- prune: true
- prune_timeout: 3600s
- prune_propagation_policy: foreground
- inventory_policy: must_match
-```
+## Immediate Git repository reconciliation
-| Keyword | Description |
-|--|--|
-| `manifest_projects` | Projects where your Kubernetes manifests are stored. The agent monitors the files in the repositories in these projects. When manifest files change, the agent deploys the changes to the cluster. |
-| `id` | Path to a Git repository that has Kubernetes manifests in YAML or JSON format. No authentication mechanisms are supported. Default is the agent configuration repository. |
-| `ref` | Optional. Git reference in the configured Git repository to fetch the Kubernetes manifest files from. If not specified or empty, the default branch is used. If specified, it must contain either `branch`, `tag`, or `commit`. |
-| `ref.branch` | Branch name in the configured Git repository to fetch the Kubernetes manifest files from. |
-| `ref.tag` | Tag name in the configured Git repository to fetch the Kubernetes manifest files from. |
-| `ref.commit` | Commit SHA in the configured Git repository to fetch the Kubernetes manifest files from. |
-| `default_namespace` | Namespace to use if not set explicitly in object manifest. Also used for inventory `ConfigMap` objects. |
-| `paths` | Repository paths to scan for manifest files. Directories with names that start with a dot `(.)` are ignored. |
-| `paths[].glob` | Required. See [doublestar](https://github.com/bmatcuk/doublestar#about) and [the match function](https://pkg.go.dev/github.com/bmatcuk/doublestar/v2#Match) for globbing rules. |
-| `reconcile_timeout` | Determines whether the applier should wait until all applied resources have been reconciled, and if so, how long to wait. Default is 3600 seconds (1 hour). |
-| `dry_run_strategy` | Determines whether changes [should be performed](https://github.com/kubernetes-sigs/cli-utils/blob/d6968048dcd80b1c7b55d9e4f31fc25f71c9b490/pkg/common/common.go#L68-L89). Can be: `none`, `client`, or `server`. Default is `none`.|
-| `prune` | Determines whether pruning of previously applied objects should happen after apply. Default is `true`. |
-| `prune_timeout` | Determines whether to wait for all resources to be fully deleted after pruning, and if so, how long to wait. Default is 3600 seconds (1 hour). |
-| `prune_propagation_policy` | The deletion propagation policy that [should be used for pruning](https://github.com/kubernetes/apimachinery/blob/44113beed5d39f1b261a12ec398a356e02358307/pkg/apis/meta/v1/types.go#L456-L470). Can be: `orphan`, `background`, or `foreground`. Default is `foreground`. |
-| `inventory_policy` | Determines whether an inventory object can take over objects that belong to another inventory object or don't belong to any inventory object. This is done by determining if the apply/prune operation can go through for a resource based on comparison of the `inventory-id` value in the package and the `owning-inventory` annotation (`config.k8s.io/owning-inventory`) [in the live object](https://github.com/kubernetes-sigs/cli-utils/blob/d6968048dcd80b1c7b55d9e4f31fc25f71c9b490/pkg/inventory/policy.go#L12-L66). Can be: `must_match`, `adopt_if_no_inventory`, or `adopt_all`. Default is `must_match`. |
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/392852) in GitLab 16.1 with a [flag](../../../administration/feature_flags.md) named `notify_kas_on_git_push`. Disabled by default.
+> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/126527) in GitLab 16.2.
-## GitOps annotations
+Usually, the Flux source controller reconciles Git repositories at configured intervals.
+This can cause delays between a `git push` and the reconciliation of the cluster state, and results in
+unnecessary pulls from GitLab.
-The GitLab agent for Kubernetes has annotations you can use to:
+The agent for Kubernetes automatically detects Flux `GitRepository` objects that
+reference GitLab projects in the instance the agent is connected to,
+and configures a [`Receiver`](https://fluxcd.io/flux/components/notification/receiver/) for the instance.
+When the agent for Kubernetes detects a `git push`, the `Receiver` is triggered
+and Flux reconciles the cluster with any changes to the repository.
-- **Sort resources**: Apply or delete resources in a specific order.
-- **Use apply-time mutation**: Dynamically substitute fields from one resource configuration to another.
+To use immediate Git repository reconciliation, you must have a Kubernetes cluster that runs:
-The agent has [default sorting](https://github.com/kubernetes-sigs/cli-utils/blob/d7d63f4b62897f584ca9e02b6faf4d2f327a9b09/pkg/ordering/sort.go#L74),
-but with annotations, you can fine-tune the order and apply time-value injection.
+- The agent for Kubernetes.
+- Flux `source-controller` and `notification-controller`.
-To provide the GitOps functionality, the GitLab agent for Kubernetes uses the [`cli-utils` library](https://github.com/kubernetes-sigs/cli-utils/),
-a Kubernetes SIG project. For more information, see the available annotations in the [`cli-utils` documentation](https://github.com/kubernetes-sigs/cli-utils/blob/master/README.md).
+Immediate Git repository reconciliation can reduce the time between a push and reconciliation,
+but it doesn't guarantee that every `git push` event is received. You should still set
+[`GitRepository.spec.interval`](https://fluxcd.io/flux/components/source/gitrepositories/#interval)
+to an acceptable duration.
-## Automatic drift remediation
+### Custom webhook endpoints
-Drift happens when the current configuration of an infrastructure resource differs from its desired configuration.
-Typically, this is caused by manually editing resources directly rather than via the used infrastructure-as-code
-mechanism. Minimizing the risk of drift helps to ensure configuration consistency and successful operations.
+When the agent for Kubernetes calls the `Receiver` webhook,
+the agent defaults to `http://webhook-receiver.flux-system.svc.cluster.local`,
+which is also the default URL set by a Flux bootstrap installation. To configure a custom
+endpoint, set `flux.webhook_receiver_url` to a URL that the agent can resolve. For example:
-In GitLab, the agent for Kubernetes regularly compares the desired state from the `git` repository with
-the actual state from the Kubernetes cluster. Deviations from the `git` state are fixed at every check. These checks
-happen automatically every 5 minutes. They are not configurable.
+```yaml
+flux:
+ webhook_receiver_url: http://webhook-receiver.another-flux-namespace.svc.cluster.local
+```
-The agent uses [server-side applies](https://kubernetes.io/docs/reference/using-api/server-side-apply/).
-As a result, every field in a resource can have different managers. Only fields managed by `git`
-are checked for drift. This facilitates the use of in-cluster controllers to modify resources like
-[Horizontal Pod Autoscalers](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/).
+There is special handing for
+[service proxy URLs](https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster-services/) configured
+in this format: `/api/v1/namespaces/[^/]+/services/[^/]+/proxy`. For example:
-## Related topics
+```yaml
+flux:
+ webhook_receiver_url: /api/v1/namespaces/flux-system/services/http:webhook-receiver:80/proxy
+```
-- [Deploying Helm charts with the GitOps workflow](gitops/helm.md)
-- [GitOps working examples for training and demos](https://gitlab.com/groups/guided-explorations/gl-k8s-agent/gitops/-/wikis/home)
-- [Self-paced classroom workshop](https://gitlab-for-eks.awsworkshop.io) (Uses AWS EKS, but you can use for other Kubernetes clusters)
-- [Managing Kubernetes secrets in a GitOps workflow](gitops/secrets_management.md)
-- [Application and manifest repository example](https://gitlab.com/gitlab-examples/ops/gitops-demo/hello-world-service-gitops)
+In these cases, the agent for Kubernetes uses the available Kubernetes configuration
+and context to connect to the API endpoint.
+You can use this if you run an agent outside a cluster
+and you haven't [configured an `Ingress`](https://fluxcd.io/flux/guides/webhook-receivers/#expose-the-webhook-receiver)
+for the Flux notification controller.
+
+WARNING:
+You should configure only trusted service proxy URLs.
+When you provide a service proxy URL,
+the agent for Kubernetes sends typical Kubernetes API requests which include
+the credentials necessary to authenticate with the API service.
-## Troubleshooting
+## Token management
-### Avoiding conflicts when you have multiple projects
+To use certain Flux features, you might need multiple access tokens. Additionally, you can use multiple token types to achieve the same result.
-The agent watches each glob pattern set under a project's `paths` section independently, and makes updates to the cluster concurrently.
-If changes are found at multiple paths, when the agent attempts to update the cluster,
-a conflict can occur.
+This section provides guidelines for the tokens you might need, and provides token type recommendations where possible.
-To prevent this from happening, consider storing a logical group of manifests in a single place and reference them only once to avoid overlapping globs.
+### GitLab access by Flux
-For example, both of these globs match `*.yaml` files in the root directory
-and could cause conflicts:
+To access the GitLab the container registry or Git repositories, Flux can use:
-```yaml
-gitops:
- manifest_projects:
- - id: project1
- paths:
- - glob: '/**/*.yaml'
- - glob: '/*.yaml'
-```
+- A project or group deploy token.
+- A project or group deploy key.
+- A project or group access token.
+- A personal access token.
-Instead, specify a single glob that matches all `*.yaml` files recursively:
+The token does not need write access.
-```yaml
-gitops:
- manifest_projects:
- - id: project1
- paths:
- - glob: '/**/*.yaml'
-```
+You should use project deploy tokens if `http` access is possible.
+If you require `git+ssh` access, you should use deploy keys.
+To compare deploy keys and deploy tokens, see [Deploy keys](../../project/deploy_keys/index.md).
-### Use multiple agents or projects
+Support for automating deploy token creation, rotation, and reporting is proposed in [issue 389393](https://gitlab.com/gitlab-org/gitlab/-/issues/389393).
-If you store your Kubernetes manifests in separate GitLab projects,
-update your agent configuration file with the location of these projects.
+### Flux to GitLab notification
-WARNING:
-The project with the agent's
-configuration file can be private or public. Other projects with Kubernetes manifests must be public. Support for private manifest projects is tracked
-in [this epic](https://gitlab.com/groups/gitlab-org/-/epics/7704).
+If you configure Flux to synchronize from a Git source, [Flux can register an external job status](https://fluxcd.io/flux/components/notification/provider/#git-commit-status-updates) in GitLab pipelines.
+
+To get external job statuses from Flux, you can use:
+
+- A project or group deploy token.
+- A project or group access token.
+- A personal access token.
+
+The token requires `api` scope. To minimize the attack surface of a leaked token, you should use
+a project access token.
+
+Integrating Flux into GitLab pipelines as a job is proposed in [issue 405007](https://gitlab.com/gitlab-org/gitlab/-/issues/405007).
+
+## Related topics
+
+- [GitOps working examples for training and demos](https://gitlab.com/groups/guided-explorations/gl-k8s-agent/gitops/-/wikis/home)
+- [Self-paced classroom workshop](https://gitlab-for-eks.awsworkshop.io) (Uses AWS EKS, but you can use for other Kubernetes clusters)
+- Managing Kubernetes secrets in a GitOps workflow
+ - [with SOPS built-in to Flux](https://fluxcd.io/flux/guides/mozilla-sops/)
+ - [with Sealed Secrets](https://fluxcd.io/flux/guides/sealed-secrets/)
diff --git a/doc/user/clusters/agent/gitops/agent.md b/doc/user/clusters/agent/gitops/agent.md
new file mode 100644
index 00000000000..07ed2b3a691
--- /dev/null
+++ b/doc/user/clusters/agent/gitops/agent.md
@@ -0,0 +1,255 @@
+---
+stage: Deploy
+group: Environments
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Using GitOps with the agent for Kubernetes (deprecated) **(FREE)**
+
+> - [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.
+> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/346567) from GitLab Premium to GitLab Free in 15.3.
+> - [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/346585) to make the `id` attribute optional in GitLab 15.7.
+> - Specifying a branch, tag, or commit reference to fetch the Kubernetes manifest files [introduced](https://gitlab.com/groups/gitlab-org/-/epics/4516) in GitLab 15.7.
+
+WARNING:
+This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/406545) in GitLab 16.2. You should use the [Flux integration](../gitops.md) for GitOps.
+
+This diagram shows the repositories and main actors in a GitOps deployment:
+
+```mermaid
+sequenceDiagram
+ participant D as Developer
+ participant A as Application code repository
+ participant M as Manifest repository
+ participant K as GitLab agent
+ participant C as Agent configuration repository
+ loop Regularly
+ K-->>C: Grab the configuration
+ end
+ D->>+A: Pushing code changes
+ A->>M: Updating manifest
+ loop Regularly
+ K-->>M: Watching changes
+ M-->>K: Pulling and applying changes
+ end
+```
+
+For details, view the [architecture documentation](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/doc/architecture.md#high-level-architecture).
+
+## Migrate to Flux
+
+You should migrate your legacy GitOps deployments so they can be
+deployed with Flux. To migrate, configure Flux to deploy manifests
+with Kustomize. If you don't have a `kustomization.yaml` file in
+the given path, it is generated automatically.
+
+Prerequisites:
+
+- A configuration like:
+
+ ```yaml
+ manifest_projects:
+ - id: my-group/my-project
+ default_namespace: production
+ paths:
+ - glob: 'environments/production/**/*.yaml'
+ ```
+
+- A [Flux installation](https://fluxcd.io/flux/installation/) with manifests in `environments/flux-system`.
+- You use a deploy token to access GitLab.
+- Your cluster can access GitLab over HTTPS.
+
+To migrate:
+
+1. Create a file called `environments/flux-system/production.yaml` with the following contents:
+
+ ```yaml
+ # This manifest was generated by flux. DO NOT EDIT.
+ ---
+ apiVersion: source.toolkit.fluxcd.io/v1
+ kind: GitRepository
+ metadata:
+ name: production
+ namespace: flux-system
+ spec:
+ interval: 1m0s
+ ref:
+ branch: main
+ secretRef:
+ name: gitlab-deploy-token
+ url: https://gitlab.example.com/my-group/my-project.git
+ ---
+ apiVersion: kustomize.toolkit.fluxcd.io/v1
+ kind: Kustomization
+ metadata:
+ name: production
+ namespace: flux-system
+ spec:
+ interval: 10m0s
+ path: ./environments/production
+ prune: true
+ sourceRef:
+ kind: GitRepository
+ name: production
+ ```
+
+1. Optional. Because `agentk` uses the `default_namespace` by default, you might need to add a `kustomization.yaml` file to `/environments/production/` and list the relevant resources.
+ For example:
+
+ ```yaml
+ apiVersion: kustomize.config.k8s.io/v1beta1
+ kind: Kustomization
+ namespace: default
+ resources:
+ - relative/path/to-your/resource-1.yaml
+ - relative/path/to-your/resource-2.yaml
+ ```
+
+ When you commit the `kustomization.yaml` file to the repository, a reconciliation with Flux and `agentk` is triggered.
+ Because `agentk` can't handle the Kustomization file, it logs errors when you commit the file.
+
+1. To ensure Flux has taken over the management of the resource, check for the resource in the `status.inventory` value of the `production` Flux Kustomization object:
+
+ ```shell
+ kubectl get kustomization production -n flux-system -o json | jq '.status.inventory.entries'
+ ```
+
+1. Remove the entry from the `manifest_projects` list.
+
+After you migrate, your GitOps deployments deploy with Flux.
+To get the most out of your Flux integration, see the [Flux Kustomization CRD](https://fluxcd.io/flux/components/kustomize/kustomization/) and [GitLab Flux documentation](../gitops.md).
+
+## GitOps workflow steps
+
+To update a Kubernetes cluster by using GitOps, complete the following steps.
+
+1. Ensure you have a working Kubernetes cluster, and that the manifests are in a GitLab project.
+1. In the same project, [register and install the GitLab agent](../install/index.md).
+1. Configure the agent configuration file so that the agent monitors the project for changes to the Kubernetes manifests.
+ Use the [GitOps configuration reference](#gitops-configuration-reference) for guidance.
+
+Any time you commit updates to your Kubernetes manifests, the agent updates the cluster.
+
+## GitOps configuration reference
+
+The following snippet shows an example of the possible keys and values for the GitOps section of an [agent configuration file](../install/index.md#create-an-agent-configuration-file) (`config.yaml`).
+
+```yaml
+gitops:
+ manifest_projects:
+ - id: gitlab-org/cluster-integration/gitlab-agent
+ ref: # either `branch`, `tag` or `commit` can be specified
+ branch: production
+ # commit: <mysha>
+ # tag: v1.0
+ default_namespace: my-ns
+ paths:
+ # Read all YAML files from this directory.
+ - glob: '/team1/app1/*.yaml'
+ # Read all .yaml files from team2/apps and all subdirectories.
+ - glob: '/team2/apps/**/*.yaml'
+ # If 'paths' is not specified or is an empty list, the configuration below is used.
+ - glob: '/**/*.{yaml,yml,json}'
+ reconcile_timeout: 3600s
+ dry_run_strategy: none
+ prune: true
+ prune_timeout: 3600s
+ prune_propagation_policy: foreground
+ inventory_policy: must_match
+```
+
+| Keyword | Description |
+|--|--|
+| `manifest_projects` | Projects where your Kubernetes manifests are stored. The agent monitors the files in the repositories in these projects. When manifest files change, the agent deploys the changes to the cluster. |
+| `id` | Path to a Git repository that has Kubernetes manifests in YAML or JSON format. No authentication mechanisms are supported. Default is the agent configuration repository. |
+| `ref` | Optional. Git reference in the configured Git repository to fetch the Kubernetes manifest files from. If not specified or empty, the default branch is used. If specified, it must contain either `branch`, `tag`, or `commit`. |
+| `ref.branch` | Branch name in the configured Git repository to fetch the Kubernetes manifest files from. |
+| `ref.tag` | Tag name in the configured Git repository to fetch the Kubernetes manifest files from. |
+| `ref.commit` | Commit SHA in the configured Git repository to fetch the Kubernetes manifest files from. |
+| `default_namespace` | Namespace to use if not set explicitly in object manifest. Also used for inventory `ConfigMap` objects. |
+| `paths` | Repository paths to scan for manifest files. Directories with names that start with a dot `(.)` are ignored. |
+| `paths[].glob` | Required. See [doublestar](https://github.com/bmatcuk/doublestar#about) and [the match function](https://pkg.go.dev/github.com/bmatcuk/doublestar/v2#Match) for globbing rules. |
+| `reconcile_timeout` | Determines whether the applier should wait until all applied resources have been reconciled, and if so, how long to wait. Default is 3600 seconds (1 hour). |
+| `dry_run_strategy` | Determines whether changes [should be performed](https://github.com/kubernetes-sigs/cli-utils/blob/d6968048dcd80b1c7b55d9e4f31fc25f71c9b490/pkg/common/common.go#L68-L89). Can be: `none`, `client`, or `server`. Default is `none`.|
+| `prune` | Determines whether pruning of previously applied objects should happen after apply. Default is `true`. |
+| `prune_timeout` | Determines whether to wait for all resources to be fully deleted after pruning, and if so, how long to wait. Default is 3600 seconds (1 hour). |
+| `prune_propagation_policy` | The deletion propagation policy that [should be used for pruning](https://github.com/kubernetes/apimachinery/blob/44113beed5d39f1b261a12ec398a356e02358307/pkg/apis/meta/v1/types.go#L456-L470). Can be: `orphan`, `background`, or `foreground`. Default is `foreground`. |
+| `inventory_policy` | Determines whether an inventory object can take over objects that belong to another inventory object or don't belong to any inventory object. This is done by determining if the apply/prune operation can go through for a resource based on comparison of the `inventory-id` value in the package and the `owning-inventory` annotation (`config.k8s.io/owning-inventory`) [in the live object](https://github.com/kubernetes-sigs/cli-utils/blob/d6968048dcd80b1c7b55d9e4f31fc25f71c9b490/pkg/inventory/policy.go#L12-L66). Can be: `must_match`, `adopt_if_no_inventory`, or `adopt_all`. Default is `must_match`. |
+
+## GitOps annotations
+
+The GitLab agent for Kubernetes has annotations you can use to:
+
+- **Sort resources**: Apply or delete resources in a specific order.
+- **Use apply-time mutation**: Dynamically substitute fields from one resource configuration to another.
+
+The agent has [default sorting](https://github.com/kubernetes-sigs/cli-utils/blob/d7d63f4b62897f584ca9e02b6faf4d2f327a9b09/pkg/ordering/sort.go#L74),
+but with annotations, you can fine-tune the order and apply time-value injection.
+
+To provide the GitOps functionality, the GitLab agent for Kubernetes uses the [`cli-utils` library](https://github.com/kubernetes-sigs/cli-utils/),
+a Kubernetes SIG project. For more information, see the available annotations in the [`cli-utils` documentation](https://github.com/kubernetes-sigs/cli-utils/blob/master/README.md).
+
+## Automatic drift remediation
+
+Drift happens when the current configuration of an infrastructure resource differs from its desired configuration.
+Typically, this is caused by manually editing resources directly rather than via the used infrastructure-as-code
+mechanism. Minimizing the risk of drift helps to ensure configuration consistency and successful operations.
+
+In GitLab, the agent for Kubernetes regularly compares the desired state from the `git` repository with
+the actual state from the Kubernetes cluster. Deviations from the `git` state are fixed at every check. These checks
+happen automatically every 5 minutes. They are not configurable.
+
+The agent uses [server-side applies](https://kubernetes.io/docs/reference/using-api/server-side-apply/).
+As a result, every field in a resource can have different managers. Only fields managed by `git`
+are checked for drift. This facilitates the use of in-cluster controllers to modify resources like
+[Horizontal Pod Autoscalers](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/).
+
+## Related topics
+
+- [GitOps working examples for training and demos](https://gitlab.com/groups/guided-explorations/gl-k8s-agent/gitops/-/wikis/home)
+- [Self-paced classroom workshop](https://gitlab-for-eks.awsworkshop.io) (Uses AWS EKS, but you can use for other Kubernetes clusters)
+- [Managing Kubernetes secrets in a GitOps workflow](secrets_management.md)
+- [Application and manifest repository example](https://gitlab.com/gitlab-examples/ops/gitops-demo/hello-world-service-gitops)
+
+## Troubleshooting
+
+### Avoiding conflicts when you have multiple projects
+
+The agent watches each glob pattern set under a project's `paths` section independently, and makes updates to the cluster concurrently.
+If changes are found at multiple paths, when the agent attempts to update the cluster,
+a conflict can occur.
+
+To prevent this from happening, consider storing a logical group of manifests in a single place and reference them only once to avoid overlapping globs.
+
+For example, both of these globs match `*.yaml` files in the root directory
+and could cause conflicts:
+
+```yaml
+gitops:
+ manifest_projects:
+ - id: project1
+ paths:
+ - glob: '/**/*.yaml'
+ - glob: '/*.yaml'
+```
+
+Instead, specify a single glob that matches all `*.yaml` files recursively:
+
+```yaml
+gitops:
+ manifest_projects:
+ - id: project1
+ paths:
+ - glob: '/**/*.yaml'
+```
+
+### Use multiple agents or projects
+
+If you store your Kubernetes manifests in separate GitLab projects,
+update your agent configuration file with the location of these projects.
+
+WARNING:
+The project with the agent's
+configuration file can be private or public. Other projects with Kubernetes manifests must be public. Support for private manifest projects is tracked
+in [this epic](https://gitlab.com/groups/gitlab-org/-/epics/7704).
diff --git a/doc/user/clusters/agent/gitops/example_repository_structure.md b/doc/user/clusters/agent/gitops/example_repository_structure.md
index 93c05e40bfd..a5bc3b153fe 100644
--- a/doc/user/clusters/agent/gitops/example_repository_structure.md
+++ b/doc/user/clusters/agent/gitops/example_repository_structure.md
@@ -60,7 +60,7 @@ the deployment branch back to the repository using the provided token. To preser
commit history between both branches, the CI/CD job uses a fast-forward merge.
Each cluster has an agent for Kubernetes, and each agent is configured to
-[sync manifests from the branch corresponding to its cluster](../gitops.md#gitops-configuration-reference).
+sync manifests from the branch corresponding to its cluster.
In your own project, you can different GitOps tool like Flux, or use the same configuration to deploy
to virtual machines with GitLab CI/CD.
diff --git a/doc/user/clusters/agent/gitops/flux.md b/doc/user/clusters/agent/gitops/flux.md
index f0a681c1a5c..13fcfeb28e9 100644
--- a/doc/user/clusters/agent/gitops/flux.md
+++ b/doc/user/clusters/agent/gitops/flux.md
@@ -1,97 +1,11 @@
---
-stage: Deploy
-group: Environments
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+redirect_to: '../gitops.md'
+remove_date: '2023-10-12'
---
-# Flux (Beta) **(FREE)**
+This document was moved to [another location](../gitops.md).
-Flux is a GitOps tool that helps you manage your Kubernetes clusters.
-You can use Flux to:
-
-- Keep your clusters in sync with your Git repositories.
-- Reconcile code changes with your deployments.
-- Manage your Flux installation itself with a bootstrap.
-
-You can use the agent for Kubernetes with Flux to:
-
-- Trigger immediate Git repository reconciliation.
-
-To get started, see the [Flux installation documentation](https://fluxcd.io/flux/installation).
-
-Support for Flux is in [Beta](../../../../policy/experiment-beta-support.md#beta).
-
-## Bootstrap installation
-
-Use the Flux command [`bootstrap gitlab`](https://fluxcd.io/flux/installation/#gitlab-and-gitlab-enterprise)
-to configure a Kubernetes cluster to manage itself from a Git repository.
-
-You must authenticate your installation with either:
-
-- Recommended. [A project access token](../../../project/settings/project_access_tokens.md).
-- A [group access token](../../../group/settings/group_access_tokens.md).
-- A [personal access token](../../../profile/personal_access_tokens.md).
-
-Some Flux features like [automated image updates](https://fluxcd.io/flux/guides/image-update/) require
-write access to the source repositories.
-
-## GitOps repository structure
-
-You should organize your repositories to meet the needs of your team. For detailed recommendations, see the Flux [repository structure documentation](https://fluxcd.io/flux/guides/repository-structure/).
-
-## Immediate Git repository reconciliation
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/392852) in GitLab 16.1.
-
-Usually, the Flux source controller reconciles Git repositories at configured intervals.
-This can cause delays between a `git push` and the reconciliation of the cluster state, and results in
-unnecessary pulls from GitLab.
-
-The agent for Kubernetes automatically detects Flux `GitRepository` objects that
-reference GitLab projects in the instance the agent is connected to,
-and configures a [`Receiver`](https://fluxcd.io/flux/components/notification/receiver/) for the instance.
-When the agent for Kubernetes detects a `git push`, the `Receiver` is triggered
-and Flux reconciles the cluster with any changes to the repository.
-
-To use immediate Git repository reconciliation, you must have a Kubernetes cluster that runs:
-
-- The agent for Kubernetes.
-- Flux `source-controller` and `notification-controller`.
-
-Immediate Git repository reconciliation can reduce the time between a push and reconciliation,
-but it doesn't guarantee that every `git push` event is received. You should still set
-[`GitRepository.spec.interval`](https://fluxcd.io/flux/components/source/gitrepositories/#interval)
-to an acceptable duration.
-
-### Custom webhook endpoints
-
-When the agent for Kubernetes calls the `Receiver` webhook,
-the agent defaults to `http://webhook-receiver.flux-system.svc.cluster.local`,
-which is also the default URL set by a Flux bootstrap installation. To configure a custom
-endpoint, set `flux.webhook_receiver_url` to a URL that the agent can resolve. For example:
-
-```yaml
-flux:
- webhook_receiver_url: http://webhook-receiver.another-flux-namespace.svc.cluster.local
-```
-
-There is special handing for
-[service proxy URLs](https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster-services/) configured
-in this format: `/api/v1/namespaces/[^/]+/services/[^/]+/proxy`. For example:
-
-```yaml
-flux:
- webhook_receiver_url: /api/v1/namespaces/flux-system/services/http:webhook-receiver:80/proxy
-```
-
-In these cases, the agent for Kubernetes uses the available Kubernetes configuration
-and context to connect to the API endpoint.
-You can use this if you run an agent outside a cluster
-and you haven't [configured an `Ingress`](https://fluxcd.io/flux/guides/webhook-receivers/#expose-the-webhook-receiver)
-for the Flux notification controller.
-
-WARNING:
-You should configure only trusted service proxy URLs.
-When you provide a service proxy URL,
-the agent for Kubernetes sends typical Kubernetes API requests which include
-the credentials necessary to authenticate with the API service.
+<!-- This redirect file can be deleted after <2023-10-12>. -->
+<!-- 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/gitops/flux_tutorial.md b/doc/user/clusters/agent/gitops/flux_tutorial.md
index c6c9ed9e373..8aee0c01d65 100644
--- a/doc/user/clusters/agent/gitops/flux_tutorial.md
+++ b/doc/user/clusters/agent/gitops/flux_tutorial.md
@@ -9,6 +9,9 @@ info: A tutorial using Flux
This tutorial teaches you how to set up Flux for GitOps. You'll complete a bootstrap installation,
install `agentk` in your cluster, and deploy a simple `nginx` application.
+<i class="fa fa-youtube-play youtube" aria-hidden="true"></i> For an overview of an example Flux
+configuration, see [Flux bootstrap and manifest synchronization with GitLab](https://www.youtube.com/watch?v=EjPVRM-N_PQ).
+
To set up Flux for GitOps:
1. [Create a personal access token](#create-a-personal-access-token)
@@ -97,7 +100,7 @@ To install `agentk`:
apiVersion: v1
kind: Namespace
metadata:
- name: gitlab
+ name: gitlab
```
1. Apply the agent registration token as a secret in the cluster:
@@ -140,7 +143,7 @@ To install `agentk`:
sourceRef:
kind: HelmRepository
name: gitlab-agent
- namespace: gitlab-agent
+ namespace: gitlab
interval: 1h0m0s
values:
config:
@@ -177,8 +180,6 @@ To demonstrate, deploy an `nginx` application and point Flux at it:
interval: 1m0s
ref:
branch: main
- secretRef:
- name: example-nginx-app
url: https://gitlab.com/gitlab-examples/ops/gitops-demo/example-mini-flux-deployment.git
---
apiVersion: kustomize.toolkit.fluxcd.io/v1
diff --git a/doc/user/clusters/agent/gitops/helm.md b/doc/user/clusters/agent/gitops/helm.md
index 182fd87e6f9..22587cd0e5d 100644
--- a/doc/user/clusters/agent/gitops/helm.md
+++ b/doc/user/clusters/agent/gitops/helm.md
@@ -1,152 +1,11 @@
---
-stage: Deploy
-group: Environments
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+redirect_to: '../gitops.md'
+remove_date: '2023-10-22'
---
-# Using Helm charts to update a Kubernetes cluster (Experiment) **(FREE)**
+This document was moved to [another location](../gitops.md).
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/371019) in GitLab 15.4.
-> - Specifying a branch, tag, or commit reference to fetch the Kubernetes manifest files [introduced](https://gitlab.com/groups/gitlab-org/-/epics/4516) in GitLab 15.7.
-
-You can deploy Helm charts to your Kubernetes cluster and keep the resources in your cluster in sync
-with your charts and values. To do this, you use the pull-based GitOps features of the agent for
-Kubernetes.
-
-This feature is an Experiment and [an epic exists](https://gitlab.com/groups/gitlab-org/-/epics/7938)
-to track future work. Tell us about your use cases by leaving comments in the epic.
-
-NOTE:
-This feature is an Experiment. In future releases, to accommodate new features, the configuration format might change without notice.
-
-## GitOps workflow steps
-
-To update a Kubernetes cluster by using GitOps with charts, complete the following steps.
-
-1. Ensure you have a working Kubernetes cluster, and that the chart is in a GitLab project.
-1. In the same project, [register and install the GitLab agent](../install/index.md).
-1. Configure the agent configuration file so that the agent monitors the project for changes to the chart.
- Use the [GitOps configuration reference](#helm-configuration-reference) for guidance.
-
-## Helm chart with GitOps workflow
-
-To update a Kubernetes cluster by using Helm charts:
-
-1. Ensure you have a working Kubernetes cluster.
-1. In a GitLab project:
- - Store your Helm charts.
- - [Register and install the GitLab agent](../install/index.md).
-1. Update the agent configuration file so that the agent monitors the project for changes to the chart.
- Use the [configuration reference](#helm-configuration-reference) for guidance.
-
-Any time you commit updates to your chart repository, the agent applies the chart in the cluster.
-
-## Helm configuration reference
-
-The following snippet shows an example of the possible keys and values for the GitOps section of an [agent configuration file](../install/index.md#create-an-agent-configuration-file) (`config.yaml`).
-
-```yaml
-gitops:
- charts:
- - release_name: my-application-release
- source:
- project:
- id: my-group/my-project-with-chart
- ref:
- branch: production
- path: dir-in-project/with/charts
- namespace: my-ns
- max_history: 1
- values:
- - inline:
- someKey: example value
-```
-
-| Keyword | Description |
-|--|--|
-| `charts` | List of charts you want to be applied in your cluster. Charts are applied concurrently. |
-| `release_name` | Required. Name of the release to use when applying the chart. |
-| `values` | Optional. [Custom values](#custom-values) for the release. An array of objects. Only supports `inline` values. |
-| `namespace` | Optional. Namespace to use when applying the chart. Defaults to `default`. |
-| `max_history` | Optional. Maximum number of release [revisions to store in the cluster](https://helm.sh/docs/helm/helm_history/). |
-| `source` | Required. From where the chart should get installed. Only supports project sources. |
-| `source.project.id` | Required. ID of the project where Helm chart is committed. Authentication is not supported. |
-| `source.project.ref` | Optional. Git reference in the configured Git repository to fetch the Chart from. If not specified or empty, the default branch is used. If specified, it must contain either `branch`, `tag`, or `commit`. |
-| `source.project.ref.branch` | Branch name in the configured Git repository to fetch the Chart from. |
-| `source.project.ref.tag` | Tag name in the configured Git repository to fetch the Chart from. |
-| `source.project.ref.commit` | Commit SHA in the configured Git repository to fetch the Chart from. |
-| `source.project.path` | Optional. Path of the chart in the project repository. Root of the repository is used by default. Should be the directory with the `Chart.yaml` file. |
-
-## Custom values
-
-> [Introduced](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/merge_requests/766) in GitLab 15.6. Requires both GitLab and the installed agent to be version 15.6 or later.
-
-To customize the values for a release, set the `values` key. It must be
-an array of objects. Each object must have exactly one top-level key that describes
-where the values come from. The supported top-level keys are:
-
-- `inline`: Specify the values inline in YAML format, similar to a Helm values
- file.
-
-When installing a chart with custom values:
-
-- Custom values get merged on top of the chart's default `values.yaml` file.
-- Values from subsequent entries in the `values` array overwrite values from
- previous entries.
-
-Example:
-
-```yaml
-gitops:
- charts:
- - release_name: some-release
- values:
- - inline:
- someKey: example value
- # ...
-```
-
-## Automatic drift remediation
-
-Drift happens when the current configuration of an infrastructure resource differs from its desired configuration.
-Typically, drift is caused by manually editing resources directly, rather than by editing the code that describes the desired state. Minimizing the risk of drift helps to ensure configuration consistency and successful operations.
-
-In GitLab, the agent for Kubernetes regularly compares the desired state from the chart source with
-the actual state from the Kubernetes cluster. Deviations from the desired state are fixed at every check. These checks
-happen automatically every 5 minutes. They are not configurable.
-
-## Example repository layout
-
-```plaintext
-/my-chart
- ├── templates
- | └── ...
- ├── charts
- | └── ...
- ├── Chart.yaml
- ├── Chart.lock
- ├── values.yaml
- ├── values.schema.json
- └── some-file-used-in-chart.txt
-```
-
-## Known issues
-
-The following are known issues:
-
-- Your chart must be in a GitLab project. The project must be an agent configuration project or a public
- project. This known issue also exists for manifest-based GitOps and is tracked in
- [this epic](https://gitlab.com/groups/gitlab-org/-/epics/7704).
-- Values for the chart must be in a `values.yaml` file. This file must be with the chart,
- in the same project and path.
-- Because of drift detection and remediation, the release history stored in the cluster is not useful.
- A new release is created every five minutes and the oldest release is discarded.
- Eventually history consists only of the same information.
- View [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/372023) for details.
-
-## Troubleshooting
-
-### Agent cannot find values for the chart
-
-Make sure values are in `values.yaml` and in the same directory as the `Chart.yaml` file.
-The filename must be lowercase, with `.yaml` extension (not `.yml`).
+<!-- This redirect file can be deleted after 2023-10-22. -->
+<!-- Redirects that point to other docs in the same project expire in three months. -->
+<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/clusters/agent/gitops/secrets_management.md b/doc/user/clusters/agent/gitops/secrets_management.md
index 6e1b7da9c6c..a9590f34183 100644
--- a/doc/user/clusters/agent/gitops/secrets_management.md
+++ b/doc/user/clusters/agent/gitops/secrets_management.md
@@ -4,7 +4,11 @@ group: Environments
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
-# Managing Kubernetes secrets in a GitOps workflow
+# Managing Kubernetes secrets in a GitOps workflow (deprecated)
+
+WARNING:
+This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/406545) in GitLab 16.2.
+To manage cluster resources with GitOps, you should use the [Flux integration](../../../clusters/agent/gitops.md).
You should never store Kubernetes secrets in unencrypted form in a `git` repository. If you use a GitOps workflow, you can follow these steps to securely manage your secrets.
diff --git a/doc/user/clusters/agent/index.md b/doc/user/clusters/agent/index.md
index 8b1a55bc7bd..a0d6e0d415d 100644
--- a/doc/user/clusters/agent/index.md
+++ b/doc/user/clusters/agent/index.md
@@ -34,7 +34,7 @@ You can choose from two primary workflows. The GitOps workflow is recommended.
### GitOps workflow
-You should use Flux for GitOps. To get started, see the GitLab [Flux documentation](../../../user/clusters/agent/gitops/flux.md).
+You should use Flux for GitOps. To get started, see [Tutorial: Set up Flux for GitOps](gitops/flux_tutorial.md)
### GitLab CI/CD workflow
@@ -55,8 +55,11 @@ This workflow has a weaker security model and is not recommended for production
## Supported Kubernetes versions for GitLab features
GitLab supports the following Kubernetes versions. If you want to run
-GitLab in a Kubernetes cluster, you might need a different version of Kubernetes.
-GitLab in a Kubernetes cluster, you might need [a different version of Kubernetes](https://docs.gitlab.com/charts/installation/cloud/index.html).
+GitLab in a Kubernetes cluster, you might need a different version of Kubernetes:
+
+- For the [Helm Chart](https://docs.gitlab.com/charts/installation/cloud/index.html).
+- For [GitLab Operator](https://docs.gitlab.com/operator/installation.html#kubernetes).
+
You can upgrade your
Kubernetes version to a supported version at any time:
diff --git a/doc/user/clusters/agent/install/index.md b/doc/user/clusters/agent/install/index.md
index 76fcc73504c..c847eaff13f 100644
--- a/doc/user/clusters/agent/install/index.md
+++ b/doc/user/clusters/agent/install/index.md
@@ -42,7 +42,7 @@ To install the agent in your cluster:
For configuration settings, the agent uses a YAML file in the GitLab project. You must create this file if:
-- You use [a GitOps workflow](../gitops.md#gitops-workflow-steps).
+- You use [a GitOps workflow](../gitops/agent.md#gitops-workflow-steps).
- You use [a GitLab CI/CD workflow](../ci_cd_workflow.md#gitlab-cicd-workflow-steps) and want to authorize a different project to use the agent.
- You [allow specific project or group members to access Kubernetes](../user_access.md).
@@ -181,7 +181,7 @@ GitLab also provides a [KPT package for the agent](https://gitlab.com/gitlab-org
To configure your agent, add content to the `config.yaml` file:
-- For a GitOps workflow, [view the configuration reference](../gitops.md#gitops-configuration-reference).
+- For a GitOps workflow, [view the configuration reference](../gitops/agent.md#gitops-configuration-reference).
- For a GitLab CI/CD workflow, [authorize the agent to access your projects](../ci_cd_workflow.md#authorize-the-agent). Then
[add `kubectl` commands to your `.gitlab-ci.yml` file](../ci_cd_workflow.md#update-your-gitlab-ciyml-file-to-run-kubectl-commands).
@@ -238,6 +238,10 @@ helm upgrade gitlab-agent gitlab/gitlab-agent \
--set image.tag=v14.9.1
```
+The Helm chart is updated separately from the agent for Kubernetes, and might occasionally lag behind the latest version of the agent. If you run `helm repo update` and don't specify an image tag, your agent runs the version specified in the chart.
+
+To use the latest release of the agent for Kubernetes, set the image tag to match the most recent agent image.
+
## Uninstall the agent
If you [installed the agent with Helm](#install-the-agent-with-helm), then you can also uninstall with Helm. For example, if the release and namespace are both called `gitlab-agent`, then you can uninstall the agent using the following command:
diff --git a/doc/user/clusters/agent/troubleshooting.md b/doc/user/clusters/agent/troubleshooting.md
index 9c0733d66b7..eddc6ef3e16 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-agent
+kubectl logs -f -l=app.kubernetes.io/name=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).
@@ -108,8 +108,7 @@ certificate authority that is unknown to the agent.
To fix this issue, you can present the CA certificate file to the agent
by [customizing the Helm installation](install/index.md#customize-the-helm-installation).
-Add `--set config.caCert="$(cat ~/path/to/ca.crt)"` to the `helm install` command. Make sure to replace `~/path/to/ca.crt`
-with the path to your internal CA's certificate file. The file should be a valid PEM or DER-encoded certificate.
+Add `--set-file config.caCert=my-custom-ca.pem` to the `helm install` command. The file should be a valid PEM or DER-encoded certificate.
When you deploy `agentk` with a set `config.caCert` value, the certificate is added to `configmap` and the certificate file is mounted in `/etc/ssl/certs`.
diff --git a/doc/user/clusters/agent/user_access.md b/doc/user/clusters/agent/user_access.md
index be3f88d072e..7e04091c940 100644
--- a/doc/user/clusters/agent/user_access.md
+++ b/doc/user/clusters/agent/user_access.md
@@ -6,7 +6,9 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Grant users Kubernetes access (Beta) **(FREE)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/390769) in GitLab 16.1, with [flags](../../../administration/feature_flags.md) named `environment_settings_to_graphql`, `kas_user_access`, `kas_user_access_project`, and `expose_authorized_cluster_agents`. This feature is in [Beta](../../../policy/experiment-beta-support.md#beta).
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/390769) in GitLab 16.1, with [flags](../../../administration/feature_flags.md) named `environment_settings_to_graphql`, `kas_user_access`, `kas_user_access_project`, and `expose_authorized_cluster_agents`. This feature is in [Beta](../../../policy/experiment-beta-support.md#beta).
+> - Feature flag `environment_settings_to_graphql` [removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124177) in GitLab 16.2.
+> - Feature flags `kas_user_access`, `kas_user_access_project`, and `expose_authorized_cluster_agents` [removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/125835) in GitLab 16.2.
As an administrator of Kubernetes clusters in an organization, you can grant Kubernetes access to members
of a specific project or group.
diff --git a/doc/user/clusters/agent/work_with_agent.md b/doc/user/clusters/agent/work_with_agent.md
index 8bf9ac7cf06..e8fb399d1b0 100644
--- a/doc/user/clusters/agent/work_with_agent.md
+++ b/doc/user/clusters/agent/work_with_agent.md
@@ -107,7 +107,8 @@ For more information about debugging, see [troubleshooting documentation](troubl
> - [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.
-> - Two-token limit [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/361030) in GitLab 16.1.
+> - Two-token limit [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/361030/) in GitLab 16.1 with a [flag](../../../administration/feature_flags.md) named `cluster_agents_limit_tokens_created`.
+> - Two-token limit [generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/412399) in GitLab 16.2. Feature flag `cluster_agents_limit_tokens_created` removed.
An agent can have only two active tokens at one time.
diff --git a/doc/user/clusters/create/index.md b/doc/user/clusters/create/index.md
index 57526394301..8dfeafeb48e 100644
--- a/doc/user/clusters/create/index.md
+++ b/doc/user/clusters/create/index.md
@@ -11,4 +11,5 @@ You connect the clusters to GitLab by using the agent for Kubernetes.
- [Create a cluster on Google GKE](../../infrastructure/clusters/connect/new_gke_cluster.md)
- [Create a cluster on Amazon EKS](../../infrastructure/clusters/connect/new_eks_cluster.md)
+- [Create a cluster on Azure AKS](../../infrastructure/clusters/connect/new_aks_cluster.md)
- [Create a cluster on Civo](../../infrastructure/clusters/connect/new_civo_cluster.md)
diff --git a/doc/user/clusters/environments.md b/doc/user/clusters/environments.md
index c6a61f58974..fa56dc320be 100644
--- a/doc/user/clusters/environments.md
+++ b/doc/user/clusters/environments.md
@@ -15,7 +15,7 @@ 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`.
+On self-managed GitLab, by default this feature is not available. To make it available, an administrator can [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:
@@ -48,7 +48,7 @@ To:
After you have successful deployments to your group-level or instance-level cluster:
-1. Navigate to your group's **Kubernetes** page.
+1. Go to your group's **Kubernetes** page.
1. Select the **Environments** tab.
Only successful deployments to the cluster are included in this page.
diff --git a/doc/user/clusters/management_project.md b/doc/user/clusters/management_project.md
index ff6cf6bb1a8..9f769c6535c 100644
--- a/doc/user/clusters/management_project.md
+++ b/doc/user/clusters/management_project.md
@@ -16,7 +16,7 @@ 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`.
+On self-managed GitLab, by default this feature is not available. To make it available, an administrator can [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
@@ -58,7 +58,7 @@ To associate a cluster management project with your cluster:
1. Navigate to the appropriate configuration page. For a:
- [Project-level cluster](../project/clusters/index.md), go to your project's
- **Infrastructure > Kubernetes clusters** page.
+ **Operate > Kubernetes clusters** page.
- [Group-level cluster](../group/clusters/index.md), go to your group's **Kubernetes**
page.
- [Instance-level cluster](../instance/clusters/index.md):
diff --git a/doc/user/compliance/license_compliance/index.md b/doc/user/compliance/license_compliance/index.md
index b7a68317fba..238cf10cba9 100644
--- a/doc/user/compliance/license_compliance/index.md
+++ b/doc/user/compliance/license_compliance/index.md
@@ -695,7 +695,7 @@ Additional configuration may be needed for connecting to private registries for:
Prior to GitLab 13.3, offline environments required an exact name match for [project policies](../license_approval_policies.md).
In GitLab 13.3 and later, GitLab matches the name of [project policies](../license_approval_policies.md)
-with identifiers from the [SPDX license list](https://spdx.org/licenses/).
+with license names from the [SPDX license list](https://spdx.org/licenses/).
A local copy of the SPDX license list is distributed with the GitLab instance. If needed, the GitLab
instance's administrator can manually update it with a [Rake task](../../../raketasks/spdx.md).
@@ -705,9 +705,9 @@ We recommend that you use the most recent version of all containers, and the mos
## Troubleshooting
-### ASDF_PYTHON_VERSION does not automatically install the version
+### `ASDF_PYTHON_VERSION` does not automatically install the version
-Defining a non-latest Python version in ASDF_PYTHON_VERSION [doesn't have it automatically installed](https://gitlab.com/gitlab-org/gitlab/-/issues/325604). If your project requires a non-latest version of Python:
+Defining a non-latest Python version in `ASDF_PYTHON_VERSION` [doesn't have it automatically installed](https://gitlab.com/gitlab-org/gitlab/-/issues/325604). If your project requires a non-latest version of Python:
1. Define the required version by setting the `ASDF_PYTHON_VERSION` CI/CD variable.
1. Pass a custom script to the `SETUP_CMD` CI/CD variable to install the required version and dependencies.
diff --git a/doc/user/compliance/license_list.md b/doc/user/compliance/license_list.md
index 7f55ba50c5b..deec4e28911 100644
--- a/doc/user/compliance/license_list.md
+++ b/doc/user/compliance/license_list.md
@@ -24,7 +24,7 @@ Alternatively, licenses will also appear under the license list when using our d
1. Your project must use at least one of the
[supported languages and package managers](license_compliance/index.md#supported-languages-and-package-managers).
-When everything is configured, on the left sidebar, select **Security & Compliance > License Compliance**.
+When everything is configured, on the left sidebar, select **Secure > License compliance**.
The licenses are displayed, where:
diff --git a/doc/user/compliance/license_scanning_of_cyclonedx_files/index.md b/doc/user/compliance/license_scanning_of_cyclonedx_files/index.md
index 22defd593cd..1fbe67a62b2 100644
--- a/doc/user/compliance/license_scanning_of_cyclonedx_files/index.md
+++ b/doc/user/compliance/license_scanning_of_cyclonedx_files/index.md
@@ -23,7 +23,7 @@ Licenses not in the SPDX list are reported as "Unknown". License information can
Prerequisites:
-- On GitLab self-managed only, enable [Synchronization with the GitLab License Database](../../admin_area/settings/security_and_compliance.md#choose-package-registry-metadata-to-sync) in Admin Area for the GitLab instance. On GitLab SaaS this step has already been completed.
+- On GitLab self-managed only, enable [Synchronization with the GitLab License Database](../../../administration/settings/security_and_compliance.md#choose-package-registry-metadata-to-sync) in Admin Area for the GitLab instance. On GitLab SaaS this step has already been completed.
- Enable [Dependency Scanning](../../application_security/dependency_scanning/index.md#configuration)
and ensure that its prerequisites are met.
diff --git a/doc/user/discussions/index.md b/doc/user/discussions/index.md
index 03b48fd42b6..2e26b67170c 100644
--- a/doc/user/discussions/index.md
+++ b/doc/user/discussions/index.md
@@ -56,7 +56,7 @@ in a different color.
> [Flag](../../administration/feature_flags.md) named `disable_all_mention` [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/110586) in GitLab 16.1. Disabled by default. [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/18442).
FLAG:
-On self-managed GitLab, by default this flag is not enabled. To make it available, ask an administrator to [enable the feature flag](../../administration/feature_flags.md)
+On self-managed GitLab, by default this flag is not enabled. To make it available, an administrator can [enable the feature flag](../../administration/feature_flags.md)
named `disable_all_mention`.
On GitLab.com, this flag is enabled.
@@ -103,7 +103,7 @@ To add a commit diff comment:
The comment is displayed on the merge request's **Overview** tab.
-The comment is not displayed on your project's **Repository > Commits** page.
+The comment is not displayed on your project's **Code > Commits** page.
NOTE:
When your comment contains a reference to a commit included in the merge request,
diff --git a/doc/user/enterprise_user/index.md b/doc/user/enterprise_user/index.md
index 36f698daf81..27fff4bf8e3 100644
--- a/doc/user/enterprise_user/index.md
+++ b/doc/user/enterprise_user/index.md
@@ -10,7 +10,7 @@ type: reference
Enterprise users have user accounts that are administered by an organization that
has purchased a [GitLab subscription](../../subscriptions/index.md).
-Enterprise users are identified by the [**Enterprise** badge](../project/badges.md)
+Enterprise users are identified by the **Enterprise** badge
next to their names on the [Members list](../group/index.md#filter-and-sort-members-in-a-group).
## Provision an enterprise user
@@ -47,17 +47,33 @@ Prerequisites:
- A project in the group.
- You must have the Owner role in the top-level group.
-Setting up a verified domain is similar to [setting up a custom domain on GitLab Pages](../project/pages/custom_domains_ssl_tls_certification/index.md). However, you must:
+Domain verification applies at the top-level group and to all subgroups and projects
+nested under that top-level parent group.
-- Link the domain to a single project.
-- Configure the `TXT` only in the DNS record to verify the domain's ownership.
+You cannot verify a domain for more than one group. For example, if a group named
+'group1' has a verified domain named 'domain1', you cannot also verify 'domain1'
+for a different group named 'group2'.
-Domain verification is tied to the project you choose. A project is required because domain verification reuses the GitLab Pages verification feature, which requires a project. Domain verification applies at the top-level group and to all subgroups and projects nested under that top-level parent group.
-A member in the chosen project with [at least the Maintainer role](../permissions.md#project-members-permissions) can modify or remove the domain verification.
-If needed, you can create a new project to set up domain verification directly under your top-level group. This limits the ability to modify the domain verification to members with at least the Maintainer role.
-For more information on group-level domain verification, see [epic 5299](https://gitlab.com/groups/gitlab-org/-/epics/5299).
+Setting up a verified domain is similar to [setting up a custom domain on GitLab Pages](../project/pages/custom_domains_ssl_tls_certification/index.md). However, you:
+
+- Do not need to have a GitLab Pages website.
+- Must link the domain to a single project, despite domain verification applying
+ at the top-level group and to all nested subgroups and projects, because domain
+ verification:
+ - Is tied to the project you choose.
+ - Reuses the GitLab Pages custom domain verification feature, which requires a project.
+- Must configure the `TXT` only in the DNS record to verify the domain's ownership.
+
+In addition to appearing in the top-level group Domain Verification list, the
+domain will also appear in the chosen project. A member in this project with
+[at least the Maintainer role](../permissions.md#project-members-permissions)
+can modify or remove the domain verification.
-Steps:
+If needed, you can create a new project to set up domain verification directly
+under your top-level group. This limits the ability to modify the domain verification
+to members with at least the Maintainer role.
+
+For more information on group-level domain verification, see [epic 5299](https://gitlab.com/groups/gitlab-org/-/epics/5299).
#### 1. Add a custom domain for the matching email domain
@@ -96,21 +112,13 @@ After you have added all the DNS records:
![Verify your domain](../img/retry_domain_verification_v16_0.png)
WARNING:
-For GitLab instances with domain verification enabled,
-if the domain cannot be verified for 7 days, that domain is removed
-from the GitLab project.
+For GitLab instances with domain verification enabled, if the domain cannot be verified for 7 days, that domain is removed from the GitLab project.
> **Notes:**
>
-> - Domain verification is **required for GitLab.com users**;
- for GitLab self-managed instances, your GitLab administrator has the option
- to [disabled custom domain verification](../../administration/pages/index.md#custom-domain-verification).
-> - [DNS propagation may take some time (up to 24 hours)](https://www.inmotionhosting.com/support/domain-names/dns-nameserver-changes/complete-guide-to-dns-records/),
- although it's usually a matter of minutes to complete. Until it does, verification
- fails, and attempts to visit your domain result in a 404.
-> - Once your domain has been verified, leave the verification record
- in place. Your domain is periodically reverified, and may be
- disabled if the record is removed.
+> - Domain verification is **required for GitLab.com users** to be marked as enterprise users.
+> - [DNS propagation can take up to 24 hours](https://www.inmotionhosting.com/support/domain-names/dns-nameserver-changes/complete-guide-to-dns-records/), although it's usually a couple of minutes to complete. Until it completes, the domain shows as unverified.
+> - Once your domain has been verified, leave the verification record in place. Your domain is periodically reverified, and may be disabled if the record is removed.
> - A valid certificate is not required for domain verification.
### View domains in group
diff --git a/doc/user/free_user_limit.md b/doc/user/free_user_limit.md
index 410bdc4b5f5..0af5c76ade8 100644
--- a/doc/user/free_user_limit.md
+++ b/doc/user/free_user_limit.md
@@ -7,9 +7,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Free user limit **(FREE SAAS)**
A five-user limit applies to newly created top-level namespaces with
-private visibility on GitLab SaaS. For existing namespaces, this limit
-is being rolled out gradually. Impacted users are notified in
-GitLab.com at least 60 days before the limit is applied.
+private visibility on GitLab SaaS. For existing namespaces created before December 28, 2022, the limit was applied on June 13, 2023.
When the five-user limit is applied, top-level private namespaces
exceeding the user limit are placed in a read-only state. These
diff --git a/doc/user/gitlab_com/index.md b/doc/user/gitlab_com/index.md
index 82d0bfb035a..04858d8ac34 100644
--- a/doc/user/gitlab_com/index.md
+++ b/doc/user/gitlab_com/index.md
@@ -26,15 +26,23 @@ GitLab.com uses the default [SSH key restrictions](../../security/ssh_keys_restr
## SSH host keys fingerprints
-Below are the fingerprints for SSH host keys on GitLab.com. The first time you
-connect to a GitLab.com repository, one of these keys is displayed in the output.
+Go to the current instance configuration to see the SSH host key fingerprints on
+GitLab.com.
+
+1. Sign in to GitLab.
+1. On the left sidebar, select **Help** (**{question-o}**) > **Help**.
+1. On the Help page, select **Check the current instance configuration**.
+
+In the instance configuration, you see the **SSH host key fingerprints**:
| Algorithm | MD5 (deprecated) | SHA256 |
|------------------|------------------|---------|
+| ECDSA | `f1:d0:fb:46:73:7a:70:92:5a:ab:5d:ef:43:e2:1c:35` | `HbW3g8zUjNSksFbqTiUWPWg2Bq1x8xdGUrliXFzSnUw` |
| ED25519 | `2e:65:6a:c8:cf:bf:b2:8b:9a:bd:6d:9f:11:5c:12:16` | `eUXGGm1YGsMAS7vkcx6JOJdOGHPem5gQp4taiCfCLB8` |
| RSA | `b6:03:0e:39:97:9e:d0:e7:24:ce:a3:77:3e:01:42:09` | `ROQFvPThGrW4RuWLoL9tq9I9zJ42fK4XywyRtbOz/EQ` |
-| DSA (deprecated) | `7a:47:81:3a:ee:89:89:64:33:ca:44:52:3d:30:d4:87` | `p8vZBUOR0XQz6sYiaWSMLmh0t9i8srqYKool/Xfdfqw` |
-| ECDSA | `f1:d0:fb:46:73:7a:70:92:5a:ab:5d:ef:43:e2:1c:35` | `HbW3g8zUjNSksFbqTiUWPWg2Bq1x8xdGUrliXFzSnUw` |
+
+The first time you connect to a GitLab.com repository, one of these keys is
+displayed in the output.
## SSH `known_hosts` entries
@@ -61,11 +69,11 @@ and has its own dedicated IP addresses:
The IP addresses for `mg.gitlab.com` are subject to change at any time.
-### Service Desk custom mailbox
+### Service Desk alias email address
On GitLab.com, there's a mailbox configured for Service Desk with the email address:
`contact-project+%{key}@incoming.gitlab.com`. To use this mailbox, configure the
-[custom suffix](../project/service_desk.md#configure-a-custom-email-address-suffix) in project
+[custom suffix](../project/service_desk.md#configure-a-suffix-for-service-desk-alias-email) in project
settings.
## Backups
@@ -156,8 +164,8 @@ the related documentation.
| Setting | GitLab.com | Default (self-managed) |
|----------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|------------------------|
-| Artifacts maximum size (compressed) | 1 GB | See [Maximum artifacts size](../../user/admin_area/settings/continuous_integration.md#maximum-artifacts-size). |
-| Artifacts [expiry time](../../ci/yaml/index.md#artifactsexpire_in) | From June 22, 2020, deleted after 30 days unless otherwise specified (artifacts created before that date have no expiry). | See [Default artifacts expiration](../admin_area/settings/continuous_integration.md#default-artifacts-expiration). |
+| Artifacts maximum size (compressed) | 1 GB | See [Maximum artifacts size](../../administration/settings/continuous_integration.md#maximum-artifacts-size). |
+| Artifacts [expiry time](../../ci/yaml/index.md#artifactsexpire_in) | From June 22, 2020, deleted after 30 days unless otherwise specified (artifacts created before that date have no expiry). | See [Default artifacts expiration](../../administration/settings/continuous_integration.md#default-artifacts-expiration). |
| Scheduled Pipeline Cron | `*/5 * * * *` | See [Pipeline schedules advanced configuration](../../administration/cicd.md#change-maximum-scheduled-pipeline-frequency). |
| Maximum jobs in active pipelines | `500` for Free tier, `1000` for all trial tiers, `20000` for Premium, and `100000` for Ultimate. | See [Number of jobs in active pipelines](../../administration/instance_limits.md#number-of-jobs-in-active-pipelines). |
| Maximum CI/CD subscriptions to a project | `2` | See [Number of CI/CD subscriptions to a project](../../administration/instance_limits.md#number-of-cicd-subscriptions-to-a-project). |
@@ -191,11 +199,11 @@ varies by format:
## Account and limit settings
GitLab.com has the following account limits enabled. If a setting is not listed,
-the default value [is the same as for self-managed instances](../admin_area/settings/account_and_limit_settings.md):
+the default value [is the same as for self-managed instances](../../administration/settings/account_and_limit_settings.md):
| Setting | GitLab.com default |
|-------------------------------|--------------------|
-| [Repository size including LFS](../admin_area/settings/account_and_limit_settings.md#repository-size-limit) | 10 GB |
+| [Repository size including LFS](../../administration/settings/account_and_limit_settings.md#repository-size-limit) | 10 GB |
| [Maximum import size](../project/settings/import_export.md#import-a-project-and-its-data) | 5 GB |
| Maximum attachment size | 100 MB |
@@ -216,7 +224,7 @@ The import sources that are available by default depend on which GitLab you use:
- GitLab.com: all available import sources are enabled by default.
- GitLab self-managed: no import sources are enabled by default and must be
- [enabled](../admin_area/settings/visibility_and_access_controls.md#configure-allowed-import-sources).
+ [enabled](../../administration/settings/visibility_and_access_controls.md#configure-allowed-import-sources).
| Import source | GitLab.com default | GitLab self-managed default |
|:----------------------------------------------------------------------------------------------------|:-----------------------|:----------------------------|
@@ -343,7 +351,7 @@ after the limits change in January, 2021:
More details are available on the rate limits for
[protected paths](#protected-paths-throttle) and
-[raw endpoints](../../user/admin_area/settings/rate_limits_on_raw_endpoints.md).
+[raw endpoints](../../administration/settings/rate_limits_on_raw_endpoints.md).
GitLab can rate-limit requests at several layers. The rate limits listed here
are configured in the application. These limits are the most
@@ -355,8 +363,8 @@ for GitLab.com, see
For information on rate limiting responses, see:
-- [List of headers on responses to blocked requests](../admin_area/settings/user_and_ip_rate_limits.md#response-headers).
-- [Customizable response text](../admin_area/settings/user_and_ip_rate_limits.md#use-a-custom-rate-limit-response).
+- [List of headers on responses to blocked requests](../../administration/settings/user_and_ip_rate_limits.md#response-headers).
+- [Customizable response text](../../administration/settings/user_and_ip_rate_limits.md#use-a-custom-rate-limit-response).
### Protected paths throttle
@@ -366,7 +374,7 @@ paths that exceed 10 requests per **minute** per IP address.
See the source below for which paths are protected. This includes user creation,
user confirmation, user sign in, and password reset.
-[User and IP rate limits](../admin_area/settings/user_and_ip_rate_limits.md#response-headers)
+[User and IP rate limits](../../administration/settings/user_and_ip_rate_limits.md#response-headers)
includes a list of the headers responded to blocked requests.
See [Protected Paths](../admin_area/settings/protected_paths.md) for more details.
diff --git a/doc/user/group/access_and_permissions.md b/doc/user/group/access_and_permissions.md
index b7acded6720..8bebaae003c 100644
--- a/doc/user/group/access_and_permissions.md
+++ b/doc/user/group/access_and_permissions.md
@@ -41,7 +41,7 @@ The group's new subgroups have push rules set for them based on either:
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/365357) in GitLab 16.0.
You can set the permitted protocols used to access a group's repositories to either SSH, HTTPS, or both. This setting
-is disabled when the [instance setting](../admin_area/settings/visibility_and_access_controls.md#configure-enabled-git-access-protocols) is
+is disabled when the [instance setting](../../administration/settings/visibility_and_access_controls.md#configure-enabled-git-access-protocols) is
configured by an administrator.
To change the permitted Git access protocols for a group:
@@ -63,11 +63,11 @@ address. This top-level group setting applies to:
- The GitLab UI, including subgroups, projects, and issues. It does not apply to GitLab Pages.
- [In GitLab 12.3 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/12874), the API.
- In self-managed installations of GitLab 15.1 and later, you can also configure
-[globally-allowed IP address ranges](../admin_area/settings/visibility_and_access_controls.md#configure-globally-allowed-ip-address-ranges)
+[globally-allowed IP address ranges](../../administration/settings/visibility_and_access_controls.md#configure-globally-allowed-ip-address-ranges)
at the group level.
Administrators can combine restricted access by IP address with
-[globally-allowed IP addresses](../admin_area/settings/visibility_and_access_controls.md#configure-globally-allowed-ip-address-ranges).
+[globally-allowed IP addresses](../../administration/settings/visibility_and_access_controls.md#configure-globally-allowed-ip-address-ranges).
To restrict group access by IP address:
@@ -253,6 +253,8 @@ For more information on the administration of LDAP and group sync, refer to the
NOTE:
When you add LDAP synchronization, if an LDAP user is a group member and they are not part of the LDAP group, they are removed from the group.
+You can use a workaround to [manage project access through LDAP groups](../project/settings/index.md#manage-project-access-through-ldap-groups).
+
### Create group links via CN **(PREMIUM SELF)**
To create group links via CN:
diff --git a/doc/user/group/compliance_frameworks.md b/doc/user/group/compliance_frameworks.md
index 47764b0c915..267cdbbebd3 100644
--- a/doc/user/group/compliance_frameworks.md
+++ b/doc/user/group/compliance_frameworks.md
@@ -11,8 +11,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
You can create a compliance framework that is a label to identify that your project has certain compliance
requirements or needs additional oversight. The label can optionally enforce
-[compliance pipeline configuration](#compliance-pipelines) to the projects on which it is
-[applied](../project/settings/index.md#add-a-compliance-framework-to-a-project).
+[compliance pipeline configuration](#compliance-pipelines) to the projects on which it is applied.
Compliance frameworks are created on top-level groups. Group owners can create, edit, and delete compliance frameworks:
@@ -24,6 +23,33 @@ Compliance frameworks are created on top-level groups. Group owners can create,
Subgroups and projects have access to all compliance frameworks created on their top-level group. However, compliance frameworks cannot be created, edited,
or deleted at the subgroup or project level. Project owners can choose a framework to apply to their projects.
+## Add a compliance framework to a project
+
+Prerequisite:
+
+- The group to which the project belongs must have a compliance framework.
+
+To assign a compliance framework to a project:
+
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
+1. Select **Settings** > **General**.
+1. Expand **Compliance frameworks**.
+1. Select a compliance framework.
+1. Select **Save changes**.
+
+NOTE:
+Frameworks cannot be added to projects in personal namespaces.
+
+### GraphQL API
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/333249) in GitLab 14.2.
+
+You can use the [GraphQL API](../../api/graphql/reference/index.md#mutationprojectsetcomplianceframework) to add a
+compliance framework to a project.
+
+If you create compliance frameworks on subgroups with GraphQL, the framework is created on the root ancestor if the user
+has the correct permissions. The GitLab UI presents a read-only view to discourage this behavior.
+
## Default compliance frameworks
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/375036) in GitLab 15.6.
@@ -104,6 +130,10 @@ However, the compliance pipeline configuration can reference the `.gitlab-ci.yml
- Jobs and variables defined in the compliance pipeline can't be changed by variables in the labeled project's
`.gitlab-ci.yml` file.
+NOTE:
+Because of a [known issue](https://gitlab.com/gitlab-org/gitlab/-/issues/414004), project pipelines must be included first at the top of compliance pipeline configuration
+to prevent projects overriding settings downstream.
+
For more information, see:
- [Example configuration](#example-configuration) for help configuring a compliance pipeline that runs jobs from
@@ -151,6 +181,13 @@ The following example `.compliance-gitlab-ci.yml` includes the `include` keyword
configuration is also executed.
```yaml
+include: # Execute individual project's configuration (if project contains .gitlab-ci.yml)
+ - project: '$CI_PROJECT_PATH'
+ file: '$CI_CONFIG_PATH'
+ ref: '$CI_COMMIT_SHA' # Must be defined or MR pipelines always use the use default branch
+ rules:
+ - if: $CI_PROJECT_PATH != "my-group/project-1" # Must be the hardcoded path to the project that hosts this configuration.
+
# Allows compliance team to control the ordering and interweaving of stages/jobs.
# Stages without jobs defined will remain hidden.
stages:
@@ -210,13 +247,6 @@ audit trail:
- echo "running $FOO"
after_script:
- "# No after scripts."
-
-include: # Execute individual project's configuration (if project contains .gitlab-ci.yml)
- - project: '$CI_PROJECT_PATH'
- file: '$CI_CONFIG_PATH'
- ref: '$CI_COMMIT_SHA' # Must be defined or MR pipelines always use the use default branch
- rules:
- - if: $CI_PROJECT_PATH != "my-group/project-1" # Must be the hardcoded path to the project that hosts this configuration.
```
The `rules` configuration in the `include` definition avoids circular inclusion in case the compliance pipeline must be able to run in the host project itself.
@@ -334,20 +364,6 @@ This alternative ensures the compliance pipeline does not re-start the parent pi
## Troubleshooting
-### Cannot remove compliance framework from a project
-
-Because of a [known issue](https://gitlab.com/gitlab-org/gitlab/-/issues/390626), if you move a project, its compliance
-framework becomes orphaned and can't be removed. To manually remove a compliance framework from a project, run the
-following GraphQL mutation with your project's ID:
-
-```graphql
-mutation {
- projectSetComplianceFramework(input: {projectId: "gid://gitlab/Project/1234567", complianceFrameworkId: null}) {
- errors
- }
-}
-```
-
### Compliance jobs are overwritten by target repository
If you use the `extends` statement in a compliance pipeline configuration, compliance jobs are overwritten by the target repository job. For example,
diff --git a/doc/user/group/custom_project_templates.md b/doc/user/group/custom_project_templates.md
index cbab83dd61e..6bd57079c67 100644
--- a/doc/user/group/custom_project_templates.md
+++ b/doc/user/group/custom_project_templates.md
@@ -17,7 +17,7 @@ You can [customize the list](../project/index.md#create-a-project) of available
that all projects in your group have the same list. To do this, you populate a subgroup with the projects you want to
use as templates.
-You can also configure [custom templates for the instance](../admin_area/custom_project_templates.md).
+You can also configure [custom templates for the instance](../../administration/custom_project_templates.md).
## Set up group-level project templates
diff --git a/doc/user/group/epics/epic_boards.md b/doc/user/group/epics/epic_boards.md
index 4a913c385a0..47bcd92f134 100644
--- a/doc/user/group/epics/epic_boards.md
+++ b/doc/user/group/epics/epic_boards.md
@@ -107,8 +107,8 @@ To remove a list from an epic board:
1. On the top of the list you want to remove, select the **List settings** icon (**{settings}**).
The list settings sidebar opens on the right.
-1. Select **Remove list**. A confirmation dialog appears.
-1. Select **OK**.
+1. Select **Remove list**.
+1. On the confirmation dialog, select **OK**.
### Create an epic from an epic board
diff --git a/doc/user/group/epics/manage_epics.md b/doc/user/group/epics/manage_epics.md
index 9436ff317a7..8265540cc34 100644
--- a/doc/user/group/epics/manage_epics.md
+++ b/doc/user/group/epics/manage_epics.md
@@ -66,7 +66,7 @@ The parent epic's start date then reflects this change and propagates upwards to
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/79940) in GitLab 14.9 [with a flag](../../../administration/feature_flags.md) named `epic_color_highlight`. Disabled by default.
FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available per group, ask an administrator to [enable the feature flag](../../../administration/feature_flags.md) named `epic_color_highlight`.
+On self-managed GitLab, by default this feature is not available. To make it available per group, an administrator can [enable the feature flag](../../../administration/feature_flags.md) named `epic_color_highlight`.
On GitLab.com, this feature is available but can be configured by GitLab.com administrators only.
The feature is not ready for production use.
@@ -161,9 +161,9 @@ Prerequisites:
To close an epic, at the top of an epic, select **Close epic**.
-<!-- Delete when the `moved_mr_sidebar` feature flag is removed -->
+<!-- Delete when the `move_close_into_dropdown` feature flag is removed -->
If you don't see this action at the top of an epic, your project or instance might have
-enabled a feature flag for [moved actions](../../project/merge_requests/index.md#move-sidebar-actions)
+enabled a feature flag to [moved it in the actions menu](../../project/issues/managing_issues.md#move-the-close-button-into-the-actions-menu).
You can also use the `/close` [quick action](../../project/quick_actions.md).
@@ -183,6 +183,10 @@ To do so, either:
- Use the `/reopen` [quick action](../../project/quick_actions.md).
+<!-- Delete when the `move_close_into_dropdown` feature flag is removed -->
+If you don't see this action at the top of an epic, your project or instance might have
+enabled a feature flag to [moved it in the actions menu](../../project/issues/managing_issues.md#move-the-close-button-into-the-actions-menu).
+
## Go to an epic from an issue
If an issue belongs to an epic, you can go to the parent epic with the
@@ -262,7 +266,7 @@ To filter:
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 `or_issuable_queries`.
+To make it available, an administrator can [enable the feature flag](../../../administration/feature_flags.md) named `or_issuable_queries`.
On GitLab.com, this feature is not available.
The feature is not ready for production use.
@@ -351,8 +355,8 @@ you might not have permission to.
### Add a new issue to an epic
-You can add an existing issue to an epic, or create a new issue that's
-automatically added to the epic.
+Add an existing issue to an epic, or create a new issue that's automatically
+added to the epic.
#### Add an existing issue to an epic
@@ -389,6 +393,12 @@ To add an existing issue to an epic:
Creating an issue from an epic enables you to maintain focus on the broader context of the epic
while dividing work into smaller parts.
+You can create a new issue from an epic only in projects that are in the epic's group or one of its
+descendant subgroups.
+To create a new issue in a [project that was shared with the epic's group](../../project/members/share_project_with_groups.md),
+first [create the issue directly in the project](../../project/issues/create_issues.md#from-a-project), and
+then [add an existing issue to an epic](#add-an-existing-issue-to-an-epic).
+
Prerequisites:
- You must have at least the Guest role for the issue's project and the epic's group.
diff --git a/doc/user/group/import/index.md b/doc/user/group/import/index.md
index 0b9a1552281..154eb467ece 100644
--- a/doc/user/group/import/index.md
+++ b/doc/user/group/import/index.md
@@ -30,7 +30,7 @@ If you migrate from GitLab.com to self-managed GitLab, an administrator can crea
> - `bulk_import_projects` feature flag [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/339941) in GitLab 15.10.
On self-managed GitLab, by default [migrating group items](#migrated-group-items) is not available. To show the
-feature, ask an administrator to [enable it in application settings](../../admin_area/settings/visibility_and_access_controls.md#enable-migration-of-groups-and-projects-by-direct-transfer).
+feature, an administrator can [enable it in application settings](../../../administration/settings/visibility_and_access_controls.md#enable-migration-of-groups-and-projects-by-direct-transfer).
Migrating groups by direct transfer copies the groups from one place to another. You can:
@@ -66,6 +66,8 @@ transfer.
### Limits
+Hardcoded limits apply on migration by direct transfer.
+
| Limit | Description |
|:------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 6 | Maximum number of migrations permitted by a destination GitLab instance per minute per user. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/386452) in GitLab 15.9. |
@@ -105,7 +107,7 @@ To migrate groups by direct transfer:
- The network connection between instances or GitLab.com must support HTTPS.
- Any firewalls must not block the connection between the source and destination GitLab instances.
- Both GitLab instances must have group migration by direct transfer
- [enabled in application settings](../../admin_area/settings/visibility_and_access_controls.md#enable-migration-of-groups-and-projects-by-direct-transfer)
+ [enabled in application settings](../../../administration/settings/visibility_and_access_controls.md#enable-migration-of-groups-and-projects-by-direct-transfer)
by an instance administrator.
- The source GitLab instance must be running GitLab 14.0 or later.
- You must have a [personal access token](../../../user/profile/personal_access_tokens.md) for the source GitLab
@@ -136,10 +138,10 @@ To ensure GitLab maps users and their contributions correctly:
Create the group you want to import to and connect the source GitLab instance:
1. Create either:
- - A new group. On the left sidebar, at the top, select **Create new...** (**{plus}**) and **New group**. Then select **Import group**.
+ - A new group. On the left sidebar, at the top, select **Create new** (**{plus}**) and **New group**. Then select **Import group**.
- A new subgroup. On existing group's page, either:
- Select **New subgroup**.
- - On the left sidebar, at the top, select **Create new...** (**{plus}**) and **New subgroup**. Then select the **import an existing group** link.
+ - On the left sidebar, at the top, select **Create new** (**{plus}**) and **New subgroup**. Then select the **import an existing group** link.
1. Enter the URL of a GitLab instance running GitLab 14.0 or later.
1. Enter the [personal access token](../../../user/profile/personal_access_tokens.md) for your source GitLab instance.
1. Select **Connect instance**.
@@ -176,7 +178,7 @@ You can view all groups migrated by you by direct transfer listed on the group i
To view group import history:
1. Sign in to GitLab.
-1. On the left sidebar, at the top, select **Create new...** (**{plus}**) and **New group**.
+1. On the left sidebar, at the top, select **Create new** (**{plus}**) and **New group**.
1. Select **Import group**.
1. In the upper-right corner, select **History**.
1. If there are any errors for a particular import, you can see them by selecting **Details**.
@@ -208,10 +210,10 @@ Group items that are migrated to the destination GitLab instance include:
| Boards | [GitLab 13.7](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18938) |
| Board lists | [GitLab 13.7](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/24863) |
| Epics <sup>1</sup> | [GitLab 13.7](https://gitlab.com/gitlab-org/gitlab/-/issues/250281) |
-| Group labels | [GitLab 13.9](https://gitlab.com/gitlab-org/gitlab/-/issues/292429) |
+| Group labels <sup>2</sup> | [GitLab 13.9](https://gitlab.com/gitlab-org/gitlab/-/issues/292429) |
| Iterations | [GitLab 13.10](https://gitlab.com/gitlab-org/gitlab/-/issues/292428) |
| Iteration cadences | [GitLab 15.4](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/96570) |
-| Members <sup>2</sup> | [GitLab 13.9](https://gitlab.com/gitlab-org/gitlab/-/issues/299415) |
+| Members <sup>3</sup> | [GitLab 13.9](https://gitlab.com/gitlab-org/gitlab/-/issues/299415) |
| Group milestones | [GitLab 13.10](https://gitlab.com/gitlab-org/gitlab/-/issues/292427) |
| Namespace settings | [GitLab 14.10](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85128) |
| Release milestones | [GitLab 15.0](https://gitlab.com/gitlab-org/gitlab/-/issues/339422) |
@@ -222,6 +224,8 @@ Group items that are migrated to the destination GitLab instance include:
associations [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/62074) in GitLab 13.12, state and
state ID [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/28203) in GitLab 13.7, and system note
metadata [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63551) in GitLab 14.0.
+1. Group Labels cannot retain any associated Label Priorities during import. These labels will need to be re-prioritized manually
+ once the relevant Project is migrated to the destination instance.
1. Group members are associated with the imported group if the user:
- Already exists in the destination GitLab instance.
- Has a public email in the source GitLab instance that matches a confirmed email in the destination GitLab instance.
@@ -490,7 +494,7 @@ for your version of GitLab to check which items can be imported to the destinati
Group items that are exported include:
- Milestones
-- Labels
+- Group Labels (_without_ associated label priorities)
- Boards and Board Lists
- Badges
- Subgroups (including all the aforementioned data)
@@ -550,7 +554,7 @@ You can also export a group [using the API](../../../api/group_import_export.md)
### Import the group
-1. On the left sidebar, at the top, select **Create new...** (**{plus}**) and **New subgroup**.
+1. On the left sidebar, at the top, select **Create new** (**{plus}**) and **New subgroup**.
1. Select the **import an existing group** link.
1. Enter your group name.
1. Accept or modify the associated group URL.
diff --git a/doc/user/group/index.md b/doc/user/group/index.md
index 322cefc71d9..7ff9648e41e 100644
--- a/doc/user/group/index.md
+++ b/doc/user/group/index.md
@@ -38,7 +38,7 @@ Like projects, a group can be configured to limit the visibility of it to:
- All authenticated users.
- Only explicit group members.
-The restriction for [visibility levels](../admin_area/settings/visibility_and_access_controls.md#restrict-visibility-levels)
+The restriction for [visibility levels](../../administration/settings/visibility_and_access_controls.md#restrict-visibility-levels)
on the application setting level also applies to groups. If set to internal, the explore page is
empty for anonymous users. The group page has a visibility level icon.
@@ -67,7 +67,7 @@ This page shows groups that you are a member of:
To create a group:
-1. On the left sidebar, at the top, select **Create new...** (**{plus}**) and **New group**.
+1. On the left sidebar, at the top, select **Create new** (**{plus}**) and **New group**.
1. Select **Create group**.
1. Enter a name for the group in **Group name**. For a list of words that cannot be used as group names, see
[reserved names](../reserved_names.md).
@@ -107,7 +107,7 @@ A group can also be removed from the groups dashboard:
This action removes the group. It also adds a background job to delete all projects in the group.
-In [GitLab 12.8 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/33257), on GitLab [Premium](https://about.gitlab.com/pricing/premium/) and [Ultimate](https://about.gitlab.com/pricing/ultimate/), this action adds a background job to mark a group for deletion. By default, the job schedules the deletion seven days in the future. You can modify this retention period through the [instance settings](../admin_area/settings/visibility_and_access_controls.md#deletion-protection).
+In [GitLab 12.8 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/33257), on GitLab [Premium](https://about.gitlab.com/pricing/premium/) and [Ultimate](https://about.gitlab.com/pricing/ultimate/), this action adds a background job to mark a group for deletion. By default, the job schedules the deletion seven days in the future. You can modify this retention period through the [instance settings](../../administration/settings/visibility_and_access_controls.md#deletion-protection).
In [GitLab 13.6 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/39504), if the user who sets up the deletion is removed from the group before the deletion happens, the job is cancelled, and the group is no longer scheduled for deletion.
@@ -160,6 +160,30 @@ Any group owner can approve or decline the request.
If you change your mind before your request is approved, select
**Withdraw Access Request**.
+## View group members
+
+To view a group's members:
+
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your group.
+1. Select **Manage > Members**.
+
+A table displays the member's:
+
+- **Account** name and username
+- **Source** of their [membership](../project/members/index.md#membership-types).
+ For transparency, GitLab displays all membership sources of group members.
+ Members who have multiple membership sources are displayed and counted as separate members.
+ For example, if a member has been added to the group both directly and through inheritance,
+ the member is displayed twice in the **Members** table, with different sources,
+ and is counted as two individual members of the group.
+- [**Max role**](../project/members/index.md#which-roles-you-can-assign) in the group
+- **Expiration** date of their group membership
+- **Activity** related to their account
+
+NOTE:
+The display of group members' **Source** might be inconsistent.
+For more information, see [issue 414557](https://gitlab.com/gitlab-org/gitlab/-/issues/414557).
+
## Filter and sort members in a group
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/21727) in GitLab 12.6.
@@ -187,7 +211,7 @@ In lists of group members, entries can display the following badges:
### Search a group
-You can search for members by name, username, or email.
+You can search for members by name, username, or [public email](../profile/index.md#set-your-public-email).
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your group.
1. Select **Manage > Members**.
@@ -283,4 +307,4 @@ To change the role that can create projects under a group:
1. Select the desired option in the **Roles allowed to create projects** dropdown list.
1. Select **Save changes**.
-To change this setting globally, see [Default project creation protection](../admin_area/settings/visibility_and_access_controls.md#define-which-roles-can-create-projects).
+To change this setting globally, see [Default project creation protection](../../administration/settings/visibility_and_access_controls.md#define-which-roles-can-create-projects).
diff --git a/doc/user/group/manage.md b/doc/user/group/manage.md
index 284fb8b3d7c..b7bdf236ff7 100644
--- a/doc/user/group/manage.md
+++ b/doc/user/group/manage.md
@@ -131,7 +131,7 @@ After sharing the `Frontend` group with the `Engineering` group:
- The **Groups** tab lists the `Engineering` group.
- The **Groups** tab lists a group regardless of whether it is a public or private group.
- All direct members of the `Engineering` group have access to the `Frontend` group. Direct members of `Engineering` that gain access to the `Frontend` group keep their same access level as in `Engineering`, but up to the maximum access level selected when sharing the group. Inherited members of the `Engineering` group do not gain access to the `Frontend` group.
-- All direct members of the `Engineering` group count towards the billable members of the `Frontend` group.
+- Direct members of the `Engineering` group who have the **Group Invite** badge next to their profile on the group's usage quota page count towards the billable members of the `Frontend` group.
## Remove a shared group
@@ -338,7 +338,7 @@ To enable group file templates:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/372040) in GitLab 15.9 [with a flag](../../administration/feature_flags.md) name `support_group_level_merge_checks_setting`. Disabled by default.
FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to
+On self-managed GitLab, by default this feature is not available. To make it available, an administrator can
[enable the feature flag](../../administration/feature_flags.md) named `support_group_level_merge_checks_setting`. On GitLab.com, this feature is not
available.
@@ -434,11 +434,8 @@ for the ability to set merge request approval rules for groups is tracked in
WARNING:
This feature is in [Beta](../../policy/experiment-beta-support.md#beta).
-Due to high demand, this feature may have unscheduled downtime and Code Suggestions in IDEs may be delayed.
-Code Suggestions may produce
-[low-quality or incomplete suggestions](../project/repository/code_suggestions.md#model-accuracy-and-quality).
Beta users should read about the [known limitations](../project/repository/code_suggestions.md#known-limitations).
-We look forward to hearing your feedback.
+We look forward to hearing your [feedback](../project/repository/code_suggestions.md#feedback).
You can give all users in a group and its subgroups access to [Code Suggestions](../project/repository/code_suggestions.md).
diff --git a/doc/user/group/moderate_users.md b/doc/user/group/moderate_users.md
index 1dde36c5c70..85fdeeb25c7 100644
--- a/doc/user/group/moderate_users.md
+++ b/doc/user/group/moderate_users.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> [Introduced](https://gitlab.com/gitlab-org/modelops/anti-abuse/team-tasks/-/issues/155) in GitLab 15.8.
-This is the group-level documentation. For self-managed instances, see the [administration documentation](../admin_area/moderate_users.md).
+This is the group-level documentation. For self-managed instances, see the [administration documentation](../../administration/moderate_users.md).
A group Owner can moderate user access by banning and unbanning users.
diff --git a/doc/user/group/reporting/git_abuse_rate_limit.md b/doc/user/group/reporting/git_abuse_rate_limit.md
index ee8ac50f021..cde19531ed3 100644
--- a/doc/user/group/reporting/git_abuse_rate_limit.md
+++ b/doc/user/group/reporting/git_abuse_rate_limit.md
@@ -9,11 +9,11 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/8066) in GitLab 15.2 [with a flag](../../../administration/feature_flags.md) named `limit_unique_project_downloads_per_namespace_user`. 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 `limit_unique_project_downloads_per_namespace_user`. On GitLab.com, this feature is available.
+On self-managed GitLab, by default this feature is not available. To make it available, an administrator can [enable the feature flag](../../../administration/feature_flags.md) named `limit_unique_project_downloads_per_namespace_user`. On GitLab.com, this feature is available.
This is the group-level documentation. For self-managed instances, see the [administration documentation](../../admin_area/reporting/git_abuse_rate_limit.md).
-Git abuse rate limiting is a feature to automatically ban users who download, clone, or fork more than a specified number of repositories of a group in a given time frame. Banned users cannot access the top-level group or any of its non-public subgroups via HTTP or SSH. The rate limit also applies to users who authenticate with a [personal](../../../user/profile/personal_access_tokens.md) or [group access token](../../../user/group/settings/group_access_tokens.md). Access to unrelated groups is unaffected.
+Git abuse rate limiting is a feature to automatically ban users who download, clone, pull, fetch, or fork more than a specified number of repositories of a group in a given time frame. Banned users cannot access the top-level group or any of its non-public subgroups via HTTP or SSH. The rate limit also applies to users who authenticate with a [personal](../../../user/profile/personal_access_tokens.md) or [group access token](../../../user/group/settings/group_access_tokens.md). Access to unrelated groups is unaffected.
Git abuse rate limiting does not apply to top-level group owners, [deploy tokens](../../../user/project/deploy_tokens/index.md), or [deploy keys](../../../user/project/deploy_keys/index.md).
diff --git a/doc/user/group/repositories_analytics/index.md b/doc/user/group/repositories_analytics/index.md
index e5ca41accfc..6f5f4905102 100644
--- a/doc/user/group/repositories_analytics/index.md
+++ b/doc/user/group/repositories_analytics/index.md
@@ -18,7 +18,7 @@ It is similar to [repository analytics for projects](../../analytics/repository_
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/263478) in GitLab 13.7.
-The **Analytics > Repositories** group page displays the overall test coverage of all your projects in your group.
+The **Analyze > Repository analytics** group page displays the overall test coverage of all your projects in your group.
In the **Overall activity** section, you can see:
- The number of projects with coverage reports.
@@ -29,7 +29,7 @@ In the **Overall activity** section, you can see:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/215140) in GitLab 13.9.
-The **Analytics > Repositories** group page displays the average test coverage of all your projects in your group in a graph for the last 30 days.
+The **Analyze > Repository analytics** group page displays the average test coverage of all your projects in your group in a graph for the last 30 days.
## Latest project test coverage list
diff --git a/doc/user/group/saml_sso/example_saml_config.md b/doc/user/group/saml_sso/example_saml_config.md
index f2db36e80b1..f6eb4ad539c 100644
--- a/doc/user/group/saml_sso/example_saml_config.md
+++ b/doc/user/group/saml_sso/example_saml_config.md
@@ -55,8 +55,13 @@ Attribute mapping:
![Azure Group Claims](img/azure_configure_group_claim.png)
-NOTE:
-Using the **Group ID** source attribute requires users to enter the group ID or object ID when configuring SAML group links. If available, use the **sAMAccountName** source attribute for the friendly group name instead.
+Using the **Group ID** source attribute requires users to enter the group ID or object ID when configuring SAML group links.
+
+If available, you can add user-friendly group names instead. When setting up Azure group claims:
+
+1. Select the **sAMAccountName** source attribute.
+1. Enter a group name. You can specify a name up to 256 characters long.
+1. To ensure the attribute is part of the assertion, select **Emit group names for cloud-only groups**.
[Azure AD limits the number of groups that can be sent in a SAML response to 150](https://support.esri.com/en-us/knowledge-base/000022190). If a user is a member of more than 150 groups, Azure does not include that user's group claim in the SAML response.
diff --git a/doc/user/group/saml_sso/index.md b/doc/user/group/saml_sso/index.md
index 5838b9821de..7795aed5fd0 100644
--- a/doc/user/group/saml_sso/index.md
+++ b/doc/user/group/saml_sso/index.md
@@ -396,11 +396,10 @@ convert the information to XML. An example SAML response is shown here.
By default, users provisioned with SAML or SCIM are sent a verification email to verify their identity. Instead, you can
[configure GitLab with a custom domain](../../enterprise_user/index.md#set-up-a-verified-domain) and GitLab
automatically confirms user accounts. Users still receive an
-[enterprise user](../../enterprise_user/index.md) welcome email. Confirmation is
-bypassed for users:
+[enterprise user](../../enterprise_user/index.md) welcome email. Confirmation is bypassed if both of the following are true:
-- That are provisioned with SAML or SCIM.
-- That have an email address that belongs to the verified domain.
+- The user is provisioned with SAML or SCIM.
+- The user has an email address that belongs to the verified domain.
### Block user access
@@ -490,6 +489,18 @@ When the **Enforce SSO-only authentication for web activity for this group** opt
- For non-members or users who are not signed in:
- SSO is not enforced when they access public group resources.
- SSO is enforced when they access private group resources.
+- For items in the organization's group hierarchy, dashboard visibility is as
+ follows:
+ - SSO is enforced when viewing your [To-Do List](../../todos.md). Your
+ to-do items are hidden if your SSO session has expired, and an
+ [alert is shown](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/115254).
+ - SSO is enforced when viewing your list of assigned issues. Your issues are
+ hidden if your SSO session has expired.
+ [Issue 414475](https://gitlab.com/gitlab-org/gitlab/-/issues/414475) proposes to change this
+ behavior so that issues are visible.
+ - SSO is not enforced when viewing lists of merge requests where you are the
+ assignee or your review is requested. You can see merge requests even if
+ your SSO session has expired.
SSO enforcement for web activity has the following effects when enabled:
diff --git a/doc/user/group/saml_sso/scim_setup.md b/doc/user/group/saml_sso/scim_setup.md
index e5d6c86a5ac..9096824cc2c 100644
--- a/doc/user/group/saml_sso/scim_setup.md
+++ b/doc/user/group/saml_sso/scim_setup.md
@@ -38,7 +38,6 @@ You can configure one of the following as an identity provider:
- [Azure Active Directory](#configure-azure-active-directory).
- [Okta](#configure-okta).
-- [OneLogin](#configure-onelogin).
NOTE:
Other providers can work with GitLab but they have not been tested and are not supported.
@@ -159,15 +158,6 @@ To configure Okta for SCIM:
1. Select **Save**.
1. Assign users in the **Assignments** tab. Assigned users are created and managed in your GitLab group.
-### Configure OneLogin
-
-Prerequisites:
-
-- [GitLab is configured](#configure-gitlab).
-
-OneLogin provides a **GitLab (SaaS)** app in their catalog, which includes a SCIM integration. Contact OneLogin if you
-encounter issues.
-
## User access
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/325712) in GitLab 14.0, GitLab users created by [SAML SSO](index.md#user-access-and-management) or SCIM provisioning are displayed with an [**Enterprise**](../../enterprise_user/index.md) badge in the **Members** view.
@@ -183,7 +173,11 @@ The following diagram describes what happens when you add users to your SCIM app
graph TD
A[Add User to SCIM app] -->|IdP sends user info to GitLab| B(GitLab: Does the email exist?)
B -->|No| C[GitLab creates user with SCIM identity]
- B -->|Yes| D[GitLab sends message back 'Email exists']
+ B -->|Yes| D(GitLab: Is the user part of the group?)
+ D -->|No| E(GitLab: Is SSO enforcement enabled?)
+ E -->|No| G
+ E -->|Yes| F[GitLab sends message back:\nThe member's email address is not linked to a SAML account]
+ D -->|Yes| G[Associate SCIM identity to user]
```
During provisioning:
diff --git a/doc/user/group/saml_sso/troubleshooting_scim.md b/doc/user/group/saml_sso/troubleshooting_scim.md
index 33343c9b339..e4531882fc1 100644
--- a/doc/user/group/saml_sso/troubleshooting_scim.md
+++ b/doc/user/group/saml_sso/troubleshooting_scim.md
@@ -38,7 +38,7 @@ The following are possible solutions for problems where users cannot sign in:
To check if a user's SAML `NameId` matches their SCIM `externalId`:
-- Administrators can use the Admin Area to [list SCIM identities for a user](../../admin_area/index.md#user-identities).
+- Administrators can use the Admin Area to [list SCIM identities for a user](../../../administration/admin_area.md#user-identities).
- Group owners can see the list of users and the identifier stored for each user in the group SAML SSO Settings page.
- You can use the [SCIM API](../../../api/scim.md) to manually retrieve the `external_uid` GitLab has stored for users and compare the value for each user from the [SAML API](../../../api/saml.md) .
- Have the user use a [SAML Tracer](troubleshooting.md#saml-debugging-tools) and compare the `external_uid` to
@@ -182,7 +182,7 @@ In your Okta SCIM application, check that the SCIM **Base URL** is correct and p
SCIM API endpoint URL. Check the following documentation to find information on this URL for:
- [GitLab.com groups](scim_setup.md#configure-gitlab).
-- [Self-managed GitLab instances](../../admin_area/settings/scim_setup.md#configure-gitlab).
+- [Self-managed GitLab instances](../../../administration/settings/scim_setup.md#configure-gitlab).
For self-managed GitLab instances, ensure that GitLab is publicly available so Okta can connect to it. If needed,
you can [allow access to Okta IP addresses](https://help.okta.com/en-us/Content/Topics/Security/ip-address-allow-listing.htm)
diff --git a/doc/user/group/settings/group_access_tokens.md b/doc/user/group/settings/group_access_tokens.md
index e264778062b..76aa77d026b 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-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](../../../administration/settings/account_and_limit_settings.md#limit-the-lifetime-of-access-tokens) as personal access tokens if the limit is set.
WARNING:
The ability to create group access tokens without an expiry date was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/369122) in GitLab 15.4 and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/392855) in GitLab 16.0. In GitLab 16.0 and later, existing group access tokens without an expiry date are automatically given an expiry date 365 days later than the current date. The automatic adding of an expiry date occurs on GitLab.com during the 16.0 milestone. The automatic adding of an expiry date occurs on self-managed instances when they are upgraded to GitLab 16.0. This change is a breaking change.
@@ -35,13 +35,13 @@ You can use group access tokens:
- On GitLab SaaS: If you have the Premium or Ultimate license tier. Group access tokens are not available with a [trial license](https://about.gitlab.com/free-trial/).
- On self-managed instances: With any license tier. If you have the Free tier:
- Review your security and compliance policies around
- [user self-enrollment](../../admin_area/settings/sign_up_restrictions.md#disable-new-sign-ups).
+ [user self-enrollment](../../../administration/settings/sign_up_restrictions.md#disable-new-sign-ups).
- Consider [disabling group access tokens](#enable-or-disable-group-access-token-creation) to
lower potential abuse.
You cannot use group access tokens to create other group, project, or personal access tokens.
-Group access tokens inherit the [default prefix setting](../../admin_area/settings/account_and_limit_settings.md#personal-access-token-prefix)
+Group access tokens inherit the [default prefix setting](../../../administration/settings/account_and_limit_settings.md#personal-access-token-prefix)
configured for personal access tokens.
## Create a group access token using UI
@@ -64,7 +64,7 @@ To create a group access token:
- The token expires on that date at midnight UTC.
- If you do not enter an expiry date, the expiry date is automatically set to 365 days later than the current date.
- By default, this date can be a maximum of 365 days later than the current date.
- - 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.
+ - An instance-wide [maximum lifetime](../../../administration/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**.
@@ -148,6 +148,7 @@ The scope determines the actions you can perform when you authenticate with a gr
| `write_registry` | Grants write access (push) to the [Container Registry](../../packages/container_registry/index.md). |
| `read_repository` | Grants read access (pull) to all repositories within a group. |
| `write_repository` | Grants read and write access (pull and push) to all repositories within a group. |
+| `create_runner` | Grants permission to create runners in a group. |
## Enable or disable group access token creation
diff --git a/doc/user/group/subgroups/index.md b/doc/user/group/subgroups/index.md
index 81e972bf73b..84902a5cbe9 100644
--- a/doc/user/group/subgroups/index.md
+++ b/doc/user/group/subgroups/index.md
@@ -77,7 +77,7 @@ Prerequisites:
- At least the Maintainer role for a group to create subgroups for it.
- The [role determined by a setting](#change-who-can-create-subgroups). These users can create
subgroups even if group creation is
- [disabled by an Administrator](../../admin_area/index.md#prevent-a-user-from-creating-groups) in the user's settings.
+ [disabled by an Administrator](../../../administration/admin_area.md#prevent-a-user-from-creating-groups) in the user's settings.
NOTE:
You cannot host a GitLab Pages subgroup website with a top-level domain name. For example, `subgroupname.example.io`.
diff --git a/doc/user/group/value_stream_analytics/index.md b/doc/user/group/value_stream_analytics/index.md
index 952552fc648..dba7a507fef 100644
--- a/doc/user/group/value_stream_analytics/index.md
+++ b/doc/user/group/value_stream_analytics/index.md
@@ -45,8 +45,8 @@ Value stream analytics offers different features at the project and group level
|Total time chart|Yes|Yes|No|
|Task by type chart|Yes|No|No|
|DORA Metrics|Yes|Yes|No|
-|Cycle time and lead time summary (Key metrics)|Yes|Yes|No|
-|New issues, commits, and deploys (Key metrics)|Yes, excluding commits|Yes|Yes|
+|Cycle time and lead time summary (Lifecycle metrics)|Yes|Yes|No|
+|New issues, commits, and deploys (Lifecycle metrics)|Yes, excluding commits|Yes|Yes|
|Uses aggregated backend|Yes|Yes|No|
|Date filter behavior|Filters items [finished within the date range](https://gitlab.com/groups/gitlab-org/-/epics/6046)|Filters items by creation date.|Filters items by creation date.|
|Authorization|At least reporter|At least reporter|Can be public|
@@ -253,9 +253,9 @@ For the "Tasks by type" chart, only the Date range and Project selector filters
The **Overview** page in value stream analytics displays key metrics of the DevSecOps lifecycle performance for projects and groups.
-### Key metrics
+### Lifecycle metrics
-Value stream analytics includes the following key metrics:
+Value stream analytics includes the following lifecycle metrics:
- **Lead time**: Median time from when the issue was created to when it was closed.
- **Cycle time**: Median time from first commit to issue closed. GitLab measures cycle time from the earliest commit of a
@@ -290,21 +290,21 @@ NOTE:
In GitLab 13.9 and later, deployment frequency metrics are calculated based on when the deployment was finished.
In GitLab 13.8 and earlier, deployment frequency metrics are calculated based on when the deployment was created.
-## View key and DORA metrics
+## View lifecycle and DORA metrics
Prerequisite:
- To view deployment metrics, you must have a
[production environment configured](#how-value-stream-analytics-identifies-the-production-environment).
-To view key lifecycle metrics:
+To view lifecycle metrics:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project or group.
1. Select **Analyze > Value stream analytics**.
- Key metrics display below the **Filter results** text box.
+ Lifecycle metrics display below the **Filter results** text box.
1. Optional. Filter the results:
1. Select the **Filter results** text box.
- Based on the filter you select, the dashboard automatically aggregates key metrics and displays the status of the value stream.
+ Based on the filter you select, the dashboard automatically aggregates lifecycle metrics and displays the status of the value stream.
1. Select a parameter.
1. Select a value or enter text to refine the results.
1. To adjust the date range:
@@ -315,7 +315,7 @@ To view the [Value Streams Dashboard](../../analytics/value_streams_dashboard.md
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project or group.
1. Select **Analyze > Value stream analytics**.
-1. Below the **Filter results** text box, in the **Key metrics** row, select **Value Streams Dashboard / DORA**.
+1. Below the **Filter results** text box, in the **Lifecycle metrics** row, select **Value Streams Dashboard / DORA**.
1. Optional. To open the new page, append this path `/analytics/dashboards/value_streams_dashboard` to the group URL
(for example, `https://gitlab.com/groups/gitlab-org/-/analytics/dashboards/value_streams_dashboard`).
diff --git a/doc/user/img/award_emoji_votes_sort_options.png b/doc/user/img/award_emoji_votes_sort_options.png
deleted file mode 100644
index dc02d5169e0..00000000000
--- a/doc/user/img/award_emoji_votes_sort_options.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/img/custom_emoji_reactions_v16_2.png b/doc/user/img/custom_emoji_reactions_v16_2.png
new file mode 100644
index 00000000000..a4d18edf8a5
--- /dev/null
+++ b/doc/user/img/custom_emoji_reactions_v16_2.png
Binary files differ
diff --git a/doc/user/img/objective_two_column_view_v16_2.png b/doc/user/img/objective_two_column_view_v16_2.png
new file mode 100644
index 00000000000..d3f4f733e7e
--- /dev/null
+++ b/doc/user/img/objective_two_column_view_v16_2.png
Binary files differ
diff --git a/doc/user/img/rich_text_editor_01_v16_2.png b/doc/user/img/rich_text_editor_01_v16_2.png
new file mode 100644
index 00000000000..7242f7169d5
--- /dev/null
+++ b/doc/user/img/rich_text_editor_01_v16_2.png
Binary files differ
diff --git a/doc/user/img/rich_text_editor_02_v16_2.png b/doc/user/img/rich_text_editor_02_v16_2.png
new file mode 100644
index 00000000000..b99f540cb60
--- /dev/null
+++ b/doc/user/img/rich_text_editor_02_v16_2.png
Binary files differ
diff --git a/doc/user/img/rich_text_editor_03_v16_2.png b/doc/user/img/rich_text_editor_03_v16_2.png
new file mode 100644
index 00000000000..5ee560fe79e
--- /dev/null
+++ b/doc/user/img/rich_text_editor_03_v16_2.png
Binary files differ
diff --git a/doc/user/img/rich_text_editor_04_v16_2.png b/doc/user/img/rich_text_editor_04_v16_2.png
new file mode 100644
index 00000000000..70f89754f92
--- /dev/null
+++ b/doc/user/img/rich_text_editor_04_v16_2.png
Binary files differ
diff --git a/doc/user/img/task_two_column_view_v16_2.png b/doc/user/img/task_two_column_view_v16_2.png
new file mode 100644
index 00000000000..8ca87f55f8a
--- /dev/null
+++ b/doc/user/img/task_two_column_view_v16_2.png
Binary files differ
diff --git a/doc/user/img/todos_add_okrs_v16_0.png b/doc/user/img/todos_add_okrs_v16_0.png
deleted file mode 100644
index 45c04e647e2..00000000000
--- a/doc/user/img/todos_add_okrs_v16_0.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/img/todos_add_todo_sidebar_v14_1.png b/doc/user/img/todos_add_todo_sidebar_v14_1.png
deleted file mode 100644
index 65120beca29..00000000000
--- a/doc/user/img/todos_add_todo_sidebar_v14_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/img/todos_mark_done_okrs_v16_0.png b/doc/user/img/todos_mark_done_okrs_v16_0.png
deleted file mode 100644
index 545b3569ed5..00000000000
--- a/doc/user/img/todos_mark_done_okrs_v16_0.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/img/todos_mark_done_sidebar_v14_1.png b/doc/user/img/todos_mark_done_sidebar_v14_1.png
deleted file mode 100644
index 628fe65a7c1..00000000000
--- a/doc/user/img/todos_mark_done_sidebar_v14_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/infrastructure/clusters/connect/new_aks_cluster.md b/doc/user/infrastructure/clusters/connect/new_aks_cluster.md
new file mode 100644
index 00000000000..24933875d48
--- /dev/null
+++ b/doc/user/infrastructure/clusters/connect/new_aks_cluster.md
@@ -0,0 +1,132 @@
+---
+stage: Deploy
+group: Environments
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Create an Azure AKS cluster
+
+You can create a cluster on Azure Kubernetes Service (AKS) through
+[Infrastructure as Code (IaC)](../../index.md). This process uses the Azure and
+Kubernetes Terraform providers to create AKS clusters. You connect the clusters to GitLab
+by using the GitLab agent for Kubernetes.
+
+**Prerequisites:**
+
+- A Microsoft Azure account, with a set of configured
+ [security credentials](https://learn.microsoft.com/en-us/cli/azure/authenticate-azure-cli).
+- [A runner](https://docs.gitlab.com/runner/install/) you can use to run the GitLab CI/CD pipeline.
+
+**Steps:**
+
+1. [Import the example project](#import-the-example-project).
+1. [Register the agent for Kubernetes](#register-the-agent).
+1. [Configure your project](#configure-your-project).
+1. [Provision your cluster](#provision-your-cluster).
+
+## Import the example project
+
+To create a cluster from GitLab using Infrastructure as Code, you must
+create a project to manage the cluster from. In this tutorial, you start with
+a sample project and modify it according to your needs.
+
+Start by [importing the example project by URL](../../../project/import/repo_by_url.md).
+
+To import the project:
+
+1. On the left sidebar, at the top, select **Create new** (**{plus}**) and **New project/repository**.
+1. Select **Import project**.
+1. Select **Repository by URL**.
+1. For the **Git repository URL**, enter `https://gitlab.com/gitlab-org/ci-cd/deploy-stage/environments-group/examples/gitlab-terraform-aks.git`.
+1. Complete the fields and select **Create project**.
+
+This project provides you with:
+
+- An [Azure Kubernetes Service (AKS)](https://gitlab.com/gitlab-org/ci-cd/deploy-stage/environments-group/examples/gitlab-terraform-aks/-/blob/main/aks.tf) cluster.
+- The [GitLab agent for Kubernetes](https://gitlab.com/gitlab-org/ci-cd/deploy-stage/environments-group/examples/gitlab-terraform-aks/-/blob/main/agent.tf) installed in the cluster.
+
+## Register the agent
+
+To create a GitLab agent for Kubernetes:
+
+1. On the left sidebar, select **Operate > Kubernetes clusters**.
+1. Select **Connect a cluster (agent)**.
+1. From the **Select an agent** dropdown list, select `aks-agent` and select **Register an agent**.
+1. GitLab generates a registration token for the agent. Securely store this secret token, as you will need it later.
+1. GitLab provides an address for the agent server (KAS), which you will also need later.
+
+## Configure your project
+
+Use CI/CD environment variables to configure your project.
+
+**Required configuration:**
+
+1. On the left sidebar, select **Settings > CI/CD**.
+1. Expand **Variables**.
+1. Set the variable `AZURE_CLIENT_ID` to your Azure client ID.
+1. Set the variable `AZURE_CLIENT_SECRET` to your Azure client secret.
+1. Set the variable `AZURE_TENANT_ID` to your service principal.
+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:**
+
+The file [`variables.tf`](https://gitlab.com/gitlab-org/ci-cd/deploy-stage/environments-group/examples/gitlab-terraform-aks/-/blob/main/variables.tf)
+contains other variables that you can override according to your needs:
+
+- `TF_VAR_location`: Set your cluster's region.
+- `TF_VAR_cluster_name`: Set your cluster's name.
+- `TF_VAR_kubernetes_version`: Set the version of Kubernetes.
+- `TF_VAR_create_resource_group`: Allow to enable or disable the creation of a new resource group. (Default set to true).
+- `TF_VAR_resource_group_name`: Set the name of resource group.
+- `TF_VAR_agent_namespace`: Set the Kubernetes namespace for the GitLab agent.
+
+See the [Azure Terraform provider](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs) and the [Kubernetes Terraform provider](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs) documentation for further resource options.
+
+## Provision your cluster
+
+After configuring your project, manually trigger the provisioning of your cluster. In GitLab:
+
+1. On the left sidebar, select **Build > Pipelines**.
+1. Next to **Play** (**{play}**), select the dropdown list icon (**{chevron-lg-down}**).
+1. Select **Deploy** to manually trigger the deployment job.
+
+When the pipeline finishes successfully, you can view the new cluster:
+
+- In Azure: From the [Azure portal](https://portal.azure.com/#home), select **Kubernetes services > View**.
+- In GitLab: On the left sidebar, select **Operate > Kubernetes clusters**.
+
+## Use your cluster
+
+After you provision the cluster, it is connected to GitLab and is ready for deployments. To check the connection:
+
+1. On the left sidebar, select **Operate > Kubernetes clusters**.
+1. In the list, view the **Connection status** column.
+
+For more information about the capabilities of the connection, see [the GitLab agent for Kubernetes documentation](../index.md).
+
+## Remove the cluster
+
+A cleanup job is not included in your pipeline by default. To remove all created resources, you
+must modify your GitLab CI/CD template before running the cleanup job.
+
+To remove all resources:
+
+1. Add the following to your `.gitlab-ci.yml` file:
+
+ ```yaml
+ stages:
+ - init
+ - validate
+ - test
+ - build
+ - deploy
+ - cleanup
+
+ destroy:
+ extends: .terraform:destroy
+ needs: []
+ ```
+
+1. On the left sidebar, select **Build > Pipelines** and select the most recent pipeline.
+1. For the `destroy` job, select **Play** (**{play}**).
diff --git a/doc/user/infrastructure/clusters/connect/new_civo_cluster.md b/doc/user/infrastructure/clusters/connect/new_civo_cluster.md
index 7c8065b6143..91429e203f3 100644
--- a/doc/user/infrastructure/clusters/connect/new_civo_cluster.md
+++ b/doc/user/infrastructure/clusters/connect/new_civo_cluster.md
@@ -52,7 +52,7 @@ This project provides you with:
To create a GitLab agent for Kubernetes:
-1. On the left sidebar, select **Infrastructure > Kubernetes clusters**.
+1. On the left sidebar, select **Operate > Kubernetes clusters**.
1. Select **Connect a cluster (agent)**.
1. From the **Select an agent** dropdown list, select `civo-agent` and select **Register an agent**.
1. GitLab generates a registration token for the agent. Securely store this secret token, as you will need it later.
@@ -91,20 +91,20 @@ Refer to the [Civo Terraform provider](https://registry.terraform.io/providers/c
After configuring your project, manually trigger the provisioning of your cluster. In GitLab:
-1. On the left sidebar, go to **CI/CD > Pipelines**.
+1. On the left sidebar, go to **Build > Pipelines**.
1. Next to **Play** (**{play}**), select the dropdown list icon (**{chevron-lg-down}**).
1. Select **Deploy** to manually trigger the deployment job.
When the pipeline finishes successfully, you can see your new cluster:
- In Civo dashboard: on your Kubernetes tab.
-- In GitLab: from your project's sidebar, select **Infrastructure > Kubernetes clusters**.
+- In GitLab: from your project's sidebar, select **Operate > Kubernetes clusters**.
## Use your cluster
After you provision the cluster, it is connected to GitLab and is ready for deployments. To check the connection:
-1. On the left sidebar, select **Infrastructure > Kubernetes clusters**.
+1. On the left sidebar, select **Operate > Kubernetes clusters**.
1. In the list, view the **Connection status** column.
For more information about the capabilities of the connection, see [the GitLab agent for Kubernetes documentation](../index.md).
@@ -131,7 +131,7 @@ To remove all resources:
needs: []
```
-1. On the left sidebar, select **CI/CD > Pipelines** and select the most recent pipeline.
+1. On the left sidebar, select **Build > Pipelines** and select the most recent pipeline.
1. For the `destroy` job, select **Play** (**{play}**).
## Civo support
diff --git a/doc/user/infrastructure/clusters/connect/new_eks_cluster.md b/doc/user/infrastructure/clusters/connect/new_eks_cluster.md
index 19bcce581e9..ef51db097d9 100644
--- a/doc/user/infrastructure/clusters/connect/new_eks_cluster.md
+++ b/doc/user/infrastructure/clusters/connect/new_eks_cluster.md
@@ -55,7 +55,7 @@ In GitLab 14.10, a [flag](../../../../administration/feature_flags.md) named `ce
To create a GitLab agent for Kubernetes:
-1. On the left sidebar, select **Infrastructure > Kubernetes clusters**.
+1. On the left sidebar, select **Operate > Kubernetes clusters**.
1. Select **Connect a cluster (agent)**.
1. From the **Select an agent** dropdown list, select `eks-agent` and select **Register an agent**.
1. GitLab generates a registration token for the agent. Securely store this secret token, as you will need it later.
@@ -139,20 +139,20 @@ View the [AWS Terraform provider](https://registry.terraform.io/providers/hashic
After configuring your project, manually trigger the provisioning of your cluster. In GitLab:
-1. On the left sidebar, go to **CI/CD > Pipelines**.
+1. On the left sidebar, go to **Build > Pipelines**.
1. Next to **Play** (**{play}**), select the dropdown list icon (**{chevron-lg-down}**).
1. Select **Deploy** to manually trigger the deployment job.
When the pipeline finishes successfully, you can view the new cluster:
- In AWS: From the [EKS console](https://console.aws.amazon.com/eks/home), select **Amazon EKS > Clusters**.
-- In GitLab: On the left sidebar, select **Infrastructure > Kubernetes clusters**.
+- In GitLab: On the left sidebar, select **Operate > Kubernetes clusters**.
## Use your cluster
After you provision the cluster, it is connected to GitLab and is ready for deployments. To check the connection:
-1. On the left sidebar, select **Infrastructure > Kubernetes clusters**.
+1. On the left sidebar, select **Operate > Kubernetes clusters**.
1. In the list, view the **Connection status** column.
For more information about the capabilities of the connection, see [the GitLab agent for Kubernetes documentation](../index.md).
@@ -180,5 +180,5 @@ To remove all resources:
needs: []
```
-1. On the left sidebar, select **CI/CD > Pipelines** and select the most recent pipeline.
+1. On the left sidebar, select **Build > Pipelines** and select the most recent pipeline.
1. For the `destroy` job, select **Play** (**{play}**).
diff --git a/doc/user/infrastructure/clusters/connect/new_gke_cluster.md b/doc/user/infrastructure/clusters/connect/new_gke_cluster.md
index 25a0a7149e0..3d717e0f473 100644
--- a/doc/user/infrastructure/clusters/connect/new_gke_cluster.md
+++ b/doc/user/infrastructure/clusters/connect/new_gke_cluster.md
@@ -62,7 +62,7 @@ In GitLab 14.10, a [flag](../../../../administration/feature_flags.md) named `ce
To create a GitLab agent for Kubernetes:
-1. On the left sidebar, select **Infrastructure > Kubernetes clusters**.
+1. On the left sidebar, select **Operate > Kubernetes clusters**.
1. Select **Connect a cluster (agent)**.
1. From the **Select an agent** dropdown list, select `gke-agent` and select **Register an agent**.
1. GitLab generates a registration token for the agent. Securely store this secret token, as you will need it later.
@@ -117,20 +117,20 @@ Refer to the [Google Terraform provider](https://registry.terraform.io/providers
After configuring your project, manually trigger the provisioning of your cluster. In GitLab:
-1. On the left sidebar, go to **CI/CD > Pipelines**.
+1. On the left sidebar, go to **Build > Pipelines**.
1. Next to **Play** (**{play}**), select the dropdown list icon (**{chevron-lg-down}**).
1. Select **Deploy** to manually trigger the deployment job.
When the pipeline finishes successfully, you can see your new cluster:
- In GCP: on your [GCP console's Kubernetes list](https://console.cloud.google.com/kubernetes/list).
-- In GitLab: from your project's sidebar, select **Infrastructure > Kubernetes clusters**.
+- In GitLab: from your project's sidebar, select **Operate > Kubernetes clusters**.
## Use your cluster
After you provision the cluster, it is connected to GitLab and is ready for deployments. To check the connection:
-1. On the left sidebar, select **Infrastructure > Kubernetes clusters**.
+1. On the left sidebar, select **Operate > Kubernetes clusters**.
1. In the list, view the **Connection status** column.
For more information about the capabilities of the connection, see [the GitLab agent for Kubernetes documentation](../index.md).
@@ -158,5 +158,5 @@ To remove all resources:
needs: []
```
-1. On the left sidebar, select **CI/CD > Pipelines** and select the most recent pipeline.
+1. On the left sidebar, select **Build > Pipelines** and select the most recent pipeline.
1. For the `destroy` job, select **Play** (**{play}**).
diff --git a/doc/user/infrastructure/clusters/deploy/inventory_object.md b/doc/user/infrastructure/clusters/deploy/inventory_object.md
index 50185966267..4c55a87a52c 100644
--- a/doc/user/infrastructure/clusters/deploy/inventory_object.md
+++ b/doc/user/infrastructure/clusters/deploy/inventory_object.md
@@ -4,11 +4,15 @@ group: Environments
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
-# Tracking cluster resources managed by GitLab **(FREE)**
+# Tracking cluster resources managed by GitLab (deprecated) **(FREE)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/332227) in GitLab 14.0.
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/346567) from GitLab Premium to GitLab Free in 15.3.
+WARNING:
+This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/406545) in GitLab 16.2.
+To manage cluster resources with GitOps, you should use the [Flux integration](../../../clusters/agent/gitops.md).
+
GitLab uses an inventory object to track the resources you deploy to your cluster.
The inventory object is a `ConfigMap` that contains a list of controlled objects.
The managed resources use the `cli-utils.sigs.k8s.io/inventory-id` annotation.
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 3084cc28c9b..e23f5e8745c 100644
--- a/doc/user/infrastructure/clusters/manage/management_project_applications/runner.md
+++ b/doc/user/infrastructure/clusters/manage/management_project_applications/runner.md
@@ -25,15 +25,22 @@ For GitLab Runner to function, you _must_ specify the following in your
- `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).
+- Runner token: This must be [retrieved](../../../../../ci/runners/index.md) from your GitLab instance. You can use
+ either of the following tokens:
+
+ - `runnerToken`: The runner authentication token for the runner configuration [created in the GitLab UI](../../../../../ci/runners/runners_scope.md).
+ - `runnerRegistrationToken` ([deprecated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/102681) in GitLab 15.6 and scheduled to be removed in GitLab 17.0): The registration token for used to add new runners to GitLab.
These values can be specified using [CI/CD variables](../../../../../ci/variables/index.md):
- `CI_SERVER_URL` is used for `gitlabUrl`. If you are using GitLab.com, you don't need to set this variable.
-- `GITLAB_RUNNER_REGISTRATION_TOKEN` is used for `runnerRegistrationToken`
+- `GITLAB_RUNNER_TOKEN` is used for `runnerToken`.
+- `GITLAB_RUNNER_REGISTRATION_TOKEN` is used for `runnerRegistrationToken` (deprecated).
+
+The methods of specifying these values are mutually exclusive. You can either:
-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`.
+- Specify the variables `GITLAB_RUNNER_TOKEN` and `CI_SERVER_URL` as CI variables (recommended).
+- Provide values for `runnerToken:` 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.
diff --git a/doc/user/infrastructure/clusters/migrate_to_gitlab_agent.md b/doc/user/infrastructure/clusters/migrate_to_gitlab_agent.md
index a21c7271e7a..614e0f5a7e5 100644
--- a/doc/user/infrastructure/clusters/migrate_to_gitlab_agent.md
+++ b/doc/user/infrastructure/clusters/migrate_to_gitlab_agent.md
@@ -70,7 +70,7 @@ In your Auto DevOps project, you can use the GitLab agent to connect with your K
- 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. On the left sidebar, select **Infrastructure > Kubernetes clusters**.
+1. On the left sidebar, select **Operate > 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. Edit your `.gitlab-ci.yml` file and ensure it's using the Auto DevOps template. For example:
@@ -85,7 +85,7 @@ In your Auto DevOps project, you can use the GitLab agent to connect with your K
KUBE_NAMESPACE: "demo-agent"
```
-1. To test your pipeline, on the left sidebar, select **CI/CD > Pipelines** and then **Run pipeline**.
+1. To test your pipeline, on the left sidebar, select **Build > Pipelines** and then **Run pipeline**.
For an example, [view this project](https://gitlab.com/gitlab-examples/ops/gitops-demo/hello-world-service).
diff --git a/doc/user/infrastructure/iac/index.md b/doc/user/infrastructure/iac/index.md
index 12ad207e4f8..f27f1306c31 100644
--- a/doc/user/infrastructure/iac/index.md
+++ b/doc/user/infrastructure/iac/index.md
@@ -54,7 +54,7 @@ If you use earlier versions of GitLab, you might face incompatibility errors
between the GitLab version and the template version. In this case, you can opt
to use one of these templates:
-- [The stable template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform.gitlab-ci.yml) with an skeleton that you can built on top of.
+- [The stable template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform.gitlab-ci.yml) with a skeleton that you can built on top of.
- [The advanced template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform/Base.gitlab-ci.yml) to fully customize your setup.
NOTE:
diff --git a/doc/user/infrastructure/iac/mr_integration.md b/doc/user/infrastructure/iac/mr_integration.md
index b2e02cd7375..26bb1d16510 100644
--- a/doc/user/infrastructure/iac/mr_integration.md
+++ b/doc/user/infrastructure/iac/mr_integration.md
@@ -95,19 +95,17 @@ To manually configure a GitLab Terraform Report artifact:
```yaml
default:
image: registry.gitlab.com/gitlab-org/terraform-images/stable:latest
-
cache:
key: example-production
paths:
- ${TF_ROOT}/.terraform
+ before_script:
+ - cd ${TF_ROOT}
variables:
TF_ROOT: ${CI_PROJECT_DIR}/environments/example/production
TF_ADDRESS: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/terraform/state/example-production
-before_script:
- - cd ${TF_ROOT}
-
stages:
- prepare
- validate
@@ -161,7 +159,6 @@ default:
entrypoint:
- '/usr/bin/env'
- 'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
-
cache:
paths:
- .terraform
diff --git a/doc/user/infrastructure/iac/terraform_state.md b/doc/user/infrastructure/iac/terraform_state.md
index 455f2ce19e8..31c4ad757c8 100644
--- a/doc/user/infrastructure/iac/terraform_state.md
+++ b/doc/user/infrastructure/iac/terraform_state.md
@@ -321,7 +321,7 @@ curl --header "Private-Token: <your_access_token>" --request DELETE "https://git
If you have at least the Maintainer role, you can remove a state file.
-1. On the left sidebar, select **Infrastructure > Terraform states**.
+1. On the left sidebar, select **Operate > Terraform states**.
1. In the **Actions** column, select **Actions** (**{ellipsis_v}**) and then **Remove state file and versions**.
### Remove a state file by using the API
diff --git a/doc/user/markdown.md b/doc/user/markdown.md
index 401fe0bcb09..c3e4f77411c 100644
--- a/doc/user/markdown.md
+++ b/doc/user/markdown.md
@@ -58,7 +58,7 @@ Features not found in standard Markdown:
- [Color chips written in `HEX`, `RGB` or `HSL`](#colors)
- [Diagrams and flowcharts](#diagrams-and-flowcharts)
-- [Emoji](#emojis)
+- [Emoji](#emoji)
- [Front matter](#front-matter)
- [Inline diffs](#inline-diff)
- [Math equations and symbols written in LaTeX](#math)
@@ -207,9 +207,9 @@ installation of GitLab, a GitLab administrator [must enable it](../administratio
To make Kroki available in GitLab, a GitLab administrator must enable it.
For more information, see the [Kroki integration](../administration/integration/kroki.md) page.
-### Emojis
+### Emoji
-[View this topic in GitLab](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/user/markdown.md#emojis).
+[View this topic in GitLab](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/user/markdown.md#emoji).
::Tabs
@@ -250,13 +250,13 @@ for a list of all supported emoji codes. :thumbsup:
::EndTabs
-#### Emojis and your operating system
+#### Emoji and your operating system
-The previous emoji example uses hard-coded images. Rendered emojis
+The previous emoji example uses hard-coded images. Rendered emoji
in GitLab may be different depending on the OS and browser used.
-Most emojis are natively supported on macOS, Windows, iOS, Android, and fall back on image-based
-emojis where there is no support.
+Most emoji are natively supported on macOS, Windows, iOS, Android, and fall back on image-based
+emoji where there is no support.
<!-- vale gitlab.Spelling = NO -->
@@ -266,7 +266,7 @@ this font installed by default.
<!-- vale gitlab.Spelling = YES -->
-To learn more about adding custom emojis, see [Custom emojis](award_emojis.md#custom-emojis).
+To learn more about adding custom emoji, see [Custom emoji](award_emojis.md#custom-emoji).
### Front matter
@@ -569,13 +569,13 @@ This example links to `<wiki_root>/miscellaneous.md`:
In wikis, you can use the [diagrams.net](https://www.diagrams.net/) editor to create diagrams. You
can also edit diagrams created with the diagrams.net editor. The diagram editor is available in both
-the Markdown editor and the content editor.
+the plain text editor and the rich text editor.
For more information, see [Diagrams.net](../administration/integration/diagrams_net.md).
-##### Markdown editor
+##### Plain text editor
-To create a diagram in the Markdown editor:
+To create a diagram in the plain text editor:
1. In the editor's toolbar, select **Insert or edit diagram** (**{diagram}**).
1. Use the diagrams.net editor to create the diagram.
@@ -583,20 +583,20 @@ To create a diagram in the Markdown editor:
A Markdown image reference to the diagram is inserted in the wiki content.
-To edit a diagram in the Markdown editor:
+To edit a diagram in the plain text editor:
-1. Place the Markdown editor's text field cursor in a Markdown image reference
+1. Place the plain text editor's text field cursor in a Markdown image reference
that contains the diagram.
-1. Select **Insert or edit diagram** (**{diagram}**) in the Markdown editor.
+1. Select **Insert or edit diagram** (**{diagram}**) in the plain text editor.
1. Use the diagrams.net editor to edit the diagram.
1. Select **Save & exit**.
A Markdown image reference to the diagram is inserted in the wiki content,
replacing the previous diagram.
-##### Content editor
+##### Rich text editor
-To create a diagram in the content editor:
+To create a diagram in the rich text editor:
1. In the editor's toolbar, select **More options** (**{plus}**).
1. In the dropdown list, select **Create or edit diagram**.
@@ -605,7 +605,7 @@ To create a diagram in the content editor:
The diagram as visualized in the diagrams.net editor is inserted in the wiki content.
-To edit a diagram in the content editor:
+To edit a diagram in the rich text editor:
1. Select the diagram that you want to edit.
1. In the floating toolbar, select **Edit diagram** (**{diagram}**).
@@ -1082,6 +1082,8 @@ The following codeblock uses HTML to skip the Vale ReferenceLinks test.
Do not change it back to a markdown codeblock.
-->
+<!-- markdownlint-disable proper-names -->
+
<pre class="highlight"><code>Inline-style (hover to see title text):
![alt text](img/markdown_logo.png "Title Text")
@@ -1093,6 +1095,8 @@ Reference-style (hover to see title text):
&#91;logo]: img/markdown_logo.png "Title Text"
</code></pre>
+<!-- markdownlint-enable proper-names -->
+
<!--
DO NOT change the name of markdown_logo.png. This file is used for a test in
spec/controllers/help_controller_spec.rb.
diff --git a/doc/user/okrs.md b/doc/user/okrs.md
index 2abaf9f8008..6579ecbadbc 100644
--- a/doc/user/okrs.md
+++ b/doc/user/okrs.md
@@ -12,7 +12,7 @@ OKRs are an [Experiment](../policy/experiment-beta-support.md#experiment).
For the OKR feature roadmap, see [epic 7864](https://gitlab.com/groups/gitlab-org/-/epics/7864).
FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available per project, ask an administrator to [enable the featured flag](../administration/feature_flags.md) named `okrs_mvc`.
+On self-managed GitLab, by default this feature is not available. To make it available per project, an administrator can [enable the featured flag](../administration/feature_flags.md) named `okrs_mvc`.
On GitLab.com, this feature is not available.
The feature is not ready for production use.
@@ -353,3 +353,18 @@ Prerequisites:
By default, child OKRs are ordered by creation date.
To reorder them, drag them around.
+
+## Two-column layout
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/415077) in GitLab 16.2 [with a flag](../administration/feature_flags.md) named `work_items_mvc_2`. Disabled by default.
+
+FLAG:
+On self-managed GitLab, by default this feature is not available. To make it available, an administrator can [enable the feature flag](../administration/feature_flags.md) named `work_items_mvc_2`.
+On GitLab.com, this feature is not available.
+This feature is not ready for production use.
+
+When enabled, OKRs use a two-column layout, similar to issues.
+The description and threads are on the left, and attributes, such as labels
+or assignees, on the right.
+
+![OKR two column view](img/objective_two_column_view_v16_2.png)
diff --git a/doc/user/organization/index.md b/doc/user/organization/index.md
index f5af26250f6..2a33543fea5 100644
--- a/doc/user/organization/index.md
+++ b/doc/user/organization/index.md
@@ -24,7 +24,7 @@ everything you do as a GitLab administrator, including:
- Aggregating data from all your groups, subgroups, and projects.
Our goal is to reach feature parity between SaaS and self-managed installations, with all
-[Admin Area settings](/ee/user/admin_area/settings/index.md) moving to either:
+[Admin Area settings](../../administration/settings/index.md) moving to either:
- Groups. Available in the Organization, and subgroups.
- Hardware Controls. For functionality that does not apply to groups, Hardware Controls are only
diff --git a/doc/user/packages/composer_repository/index.md b/doc/user/packages/composer_repository/index.md
index b990cf1f09b..3f8b0761188 100644
--- a/doc/user/packages/composer_repository/index.md
+++ b/doc/user/packages/composer_repository/index.md
@@ -76,7 +76,7 @@ To publish the package with a deploy token:
- `<tag>` is the Git tag name of the version you want to publish.
To publish a branch, use `branch=<branch>` instead of `tag=<tag>`.
-You can view the published package by going to **Packages and registries > Package Registry** and
+You can view the published package by going to **Deploy > Package Registry** and
selecting the **Composer** tab.
## Publish a Composer package by using CI/CD
@@ -99,13 +99,13 @@ You can publish a Composer package to the Package Registry as part of your CI/CD
1. Run the pipeline.
-To view the published package, go to **Packages and registries > Package Registry** and select the **Composer** tab.
+To view the published package, go to **Deploy > Package Registry** and select the **Composer** tab.
### Use a CI/CD template
A more detailed Composer CI/CD file is also available as a `.gitlab-ci.yml` template:
-1. On the left sidebar, select **Project information**.
+1. On the left sidebar, select **Project overview**.
1. Above the file list, select **Set up CI/CD**. If this button is not available, select **CI/CD Configuration** and then **Edit**.
1. From the **Apply a template** list, select **Composer**.
@@ -142,7 +142,7 @@ To install a package:
- Connect to the Package Registry for your group:
```shell
- composer config repositories.<group_id> composer https://gitlab.example.com/api/v4/group/<group_id>/-/packages/composer/
+ composer config repositories.<group_id> composer https://gitlab.example.com/api/v4/group/<group_id>/-/packages/composer/packages.json
```
- Set the required package version:
@@ -159,7 +159,7 @@ To install a package:
"repositories": {
"<group_id>": {
"type": "composer",
- "url": "https://gitlab.example.com/api/v4/group/<group_id>/-/packages/composer/"
+ "url": "https://gitlab.example.com/api/v4/group/<group_id>/-/packages/composer/packages.json"
},
...
},
@@ -243,7 +243,7 @@ To install a package:
{
...
"repositories": [
- { "type": "composer", "url": "https://gitlab.example.com/api/v4/group/<group_id>/-/packages/composer/" }
+ { "type": "composer", "url": "https://gitlab.example.com/api/v4/group/<group_id>/-/packages/composer/packages.json" }
],
"config": {
...
diff --git a/doc/user/packages/conan_repository/index.md b/doc/user/packages/conan_repository/index.md
index f06a7d83f92..1ebd59d18fa 100644
--- a/doc/user/packages/conan_repository/index.md
+++ b/doc/user/packages/conan_repository/index.md
@@ -295,7 +295,7 @@ There are two ways to remove a Conan package from the GitLab Package Registry.
- From the GitLab user interface:
- Go to your project's **Packages and registries > Package Registry**. Remove the
+ Go to your project's **Deploy > Package Registry**. Remove the
package by selecting **Remove repository** (**{remove}**).
## Search for Conan packages in the Package Registry
diff --git a/doc/user/packages/container_registry/authenticate_with_container_registry.md b/doc/user/packages/container_registry/authenticate_with_container_registry.md
index 31337d19d59..6a7c92fd924 100644
--- a/doc/user/packages/container_registry/authenticate_with_container_registry.md
+++ b/doc/user/packages/container_registry/authenticate_with_container_registry.md
@@ -21,7 +21,7 @@ To authenticate with the Container Registry, you can use a:
All of these authentication methods require the minimum scope:
- For read (pull) access, to be `read_registry`.
-- For write (push) access, to be`write_registry` and `read_registry`.
+- For write (push) access, to be `write_registry` and `read_registry`.
To authenticate, run the `docker login` command. For example:
diff --git a/doc/user/packages/container_registry/build_and_push_images.md b/doc/user/packages/container_registry/build_and_push_images.md
index aa86b87660b..4d74e029cdd 100644
--- a/doc/user/packages/container_registry/build_and_push_images.md
+++ b/doc/user/packages/container_registry/build_and_push_images.md
@@ -152,9 +152,12 @@ registry and used by subsequent stages, downloading the container image when nee
`latest` and deployed using an application-specific deploy script:
```yaml
-image: docker:20.10.16
-services:
- - docker:20.10.16-dind
+default:
+ image: docker:20.10.16
+ services:
+ - docker:20.10.16-dind
+ before_script:
+ - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
stages:
- build
@@ -169,9 +172,6 @@ variables:
CONTAINER_TEST_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
CONTAINER_RELEASE_IMAGE: $CI_REGISTRY_IMAGE:latest
-before_script:
- - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
-
build:
stage: build
script:
diff --git a/doc/user/packages/container_registry/delete_container_registry_images.md b/doc/user/packages/container_registry/delete_container_registry_images.md
index b645dc3a3e6..148fa65d8c7 100644
--- a/doc/user/packages/container_registry/delete_container_registry_images.md
+++ b/doc/user/packages/container_registry/delete_container_registry_images.md
@@ -45,7 +45,7 @@ To delete container images using the GitLab UI:
by selecting the red **{remove}** **Trash** icon next to the tag you want
to delete.
-1. In the dialog box, select **Remove tag**.
+1. On the dialog, select **Remove tag**.
## Use the GitLab API
diff --git a/doc/user/packages/container_registry/troubleshoot_container_registry.md b/doc/user/packages/container_registry/troubleshoot_container_registry.md
index 729f4919188..34c86a90d49 100644
--- a/doc/user/packages/container_registry/troubleshoot_container_registry.md
+++ b/doc/user/packages/container_registry/troubleshoot_container_registry.md
@@ -125,5 +125,5 @@ This error happens when your authentication token expires before the image push
the Container Registry on self-managed GitLab instances expire every five minutes. On GitLab.com, the token expiration
time is set to 15 minutes.
-If you are using self-managed GitLab, you can ask an administrator to
+If you are using self-managed GitLab, an administrator can
[increase the token duration](../../../administration/packages/container_registry.md#increase-token-duration).
diff --git a/doc/user/packages/harbor_container_registry/index.md b/doc/user/packages/harbor_container_registry/index.md
index 2bff6f79a27..21468b9d3bb 100644
--- a/doc/user/packages/harbor_container_registry/index.md
+++ b/doc/user/packages/harbor_container_registry/index.md
@@ -71,4 +71,4 @@ To remove the Harbor Registry for a project:
1. Clear the **Active** checkbox under **Enable integration**.
1. Select **Save changes**.
-The **Packages and registries > Harbor Registry** entry is removed from the sidebar.
+The **Operate > Harbor Registry** entry is removed from the sidebar.
diff --git a/doc/user/packages/maven_repository/index.md b/doc/user/packages/maven_repository/index.md
index bcc55af65bc..f06db7ef1ac 100644
--- a/doc/user/packages/maven_repository/index.md
+++ b/doc/user/packages/maven_repository/index.md
@@ -490,7 +490,7 @@ Your changes are automatically saved.
### Request forwarding to Maven Central
FLAG:
-By default this feature is not available for self-managed. To make it available, ask an administrator to [enable the feature flag](../../../administration/feature_flags.md) named `maven_central_request_forwarding`.
+By default this feature is not available for self-managed. To make it available, an administrator can [enable the feature flag](../../../administration/feature_flags.md) named `maven_central_request_forwarding`.
This feature is not available for SaaS users.
When a Maven package is not found in the Package Registry, the request is forwarded
diff --git a/doc/user/packages/package_registry/index.md b/doc/user/packages/package_registry/index.md
index 91186e6c159..d06b1ababb8 100644
--- a/doc/user/packages/package_registry/index.md
+++ b/doc/user/packages/package_registry/index.md
@@ -26,7 +26,7 @@ Learn how to use the GitLab Package Registry to build your own custom package wo
You can view packages for your project or group.
1. Go to the project or group.
-1. Go to **Packages and registries > Package Registry**.
+1. Go to **Deploy > Package Registry**.
You can search, sort, and filter packages on this page. You can share your search results by copying
and pasting the URL from your browser.
@@ -131,7 +131,7 @@ You can also remove the Package Registry for your project specifically:
**Packages** feature.
1. Select **Save changes**.
-The **Packages and registries > Package Registry** entry is removed from the sidebar.
+The **Deploy > Package Registry** entry is removed from the sidebar.
## Package Registry visibility permissions
@@ -161,7 +161,7 @@ Registry disables all Package Registry operations.
FLAG:
On self-managed GitLab, by default this feature is available. To disable it,
-ask an administrator to [disable the feature flag](../../../administration/feature_flags.md) named `package_registry_access_level`.
+an administrator can [disable the feature flag](../../../administration/feature_flags.md) named `package_registry_access_level`.
If you want to allow anyone (everyone on the internet) to pull from the Package Registry, no matter what the project visibility is, you can use the additional toggle `Allow anyone to pull from Package Registry` that appears when the project visibility is Private or Internal.
diff --git a/doc/user/packages/package_registry/reduce_package_registry_storage.md b/doc/user/packages/package_registry/reduce_package_registry_storage.md
index 020cad5ac14..4882753d6cf 100644
--- a/doc/user/packages/package_registry/reduce_package_registry_storage.md
+++ b/doc/user/packages/package_registry/reduce_package_registry_storage.md
@@ -29,7 +29,7 @@ You can delete packages by using [the API](../../../api/packages.md#delete-a-pro
To delete a package in the UI, from your group or project:
-1. Go to **Packages and registries > Package Registry**.
+1. Go to **Deploy > Package Registry**.
1. Find the name of the package you want to delete.
1. Select **Delete**.
@@ -46,7 +46,7 @@ You can delete packages by using [the API](../../../api/packages.md#delete-a-pac
To delete package assets in the UI, from your group or project:
-1. Go to **Packages and registries > Package Registry**.
+1. Go to **Deploy > Package Registry**.
1. Find the name of the package you want to delete.
1. Select the package to view additional details.
1. Find the name of the assets you would like to delete.
diff --git a/doc/user/packages/package_registry/supported_functionality.md b/doc/user/packages/package_registry/supported_functionality.md
index ca174c43565..d2ee5645fc1 100644
--- a/doc/user/packages/package_registry/supported_functionality.md
+++ b/doc/user/packages/package_registry/supported_functionality.md
@@ -57,12 +57,12 @@ Requests for packages not found in your GitLab project are forwarded to the publ
| Package type | Supports request forwarding |
|-------------------------------------------------------|-----------------------------|
-| [Maven (with `mvn`)](../maven_repository/index.md) | [Yes (disabled by default)](../../admin_area/settings/continuous_integration.md#maven-forwarding) |
-| [Maven (with `gradle`)](../maven_repository/index.md) | [Yes (disabled by default)](../../admin_area/settings/continuous_integration.md#maven-forwarding) |
-| [Maven (with `sbt`)](../maven_repository/index.md) | [Yes (disabled by default)](../../admin_area/settings/continuous_integration.md#maven-forwarding) |
-| [npm](../npm_registry/index.md) | [Yes](../../admin_area/settings/continuous_integration.md#npm-forwarding) |
+| [Maven (with `mvn`)](../maven_repository/index.md) | [Yes (disabled by default)](../../../administration/settings/continuous_integration.md#maven-forwarding) |
+| [Maven (with `gradle`)](../maven_repository/index.md) | [Yes (disabled by default)](../../../administration/settings/continuous_integration.md#maven-forwarding) |
+| [Maven (with `sbt`)](../maven_repository/index.md) | [Yes (disabled by default)](../../../administration/settings/continuous_integration.md#maven-forwarding) |
+| [npm](../npm_registry/index.md) | [Yes](../../../administration/settings/continuous_integration.md#npm-forwarding) |
| [NuGet](../nuget_repository/index.md) | N |
-| [PyPI](../pypi_repository/index.md) | [Yes](../../admin_area/settings/continuous_integration.md#pypi-forwarding) |
+| [PyPI](../pypi_repository/index.md) | [Yes](../../../administration/settings/continuous_integration.md#pypi-forwarding) |
| [Generic packages](../generic_packages/index.md) | N |
| [Terraform](../terraform_module_registry/index.md) | N |
| [Composer](../composer_repository/index.md) | N |
@@ -86,7 +86,7 @@ To reduce the associated security risks, before deleting a package you can:
- Verify the package is not being actively used.
- Disable request forwarding:
- - Instance administrators can disable forwarding in the [**Continuous Integration** section](../../admin_area/settings/continuous_integration.md#package-registry-configuration) of the Admin Area.
+ - Instance administrators can disable forwarding in the [**Continuous Integration** section](../../../administration/settings/continuous_integration.md#package-registry-configuration) of the Admin Area.
- Group owners can disable forwarding in the **Packages and Registries** section of the group settings.
## Allow or prevent duplicates **(FREE)**
diff --git a/doc/user/packages/terraform_module_registry/index.md b/doc/user/packages/terraform_module_registry/index.md
index d7f33dd9e79..3a3409daa6a 100644
--- a/doc/user/packages/terraform_module_registry/index.md
+++ b/doc/user/packages/terraform_module_registry/index.md
@@ -19,7 +19,7 @@ projects.
To view Terraform modules in your project:
1. Go to the project.
-1. On the left sidebar, select **Packages and registries > Terraform modules**.
+1. On the left sidebar, select **Operate > Terraform modules**.
You can search, sort, and filter modules on this page.
@@ -162,7 +162,7 @@ Prerequisites:
- You need to [authenticate with the API](../../../api/rest/index.md#authentication). If authenticating with a personal access token, it must be configured with the `read_api` scope.
-Authentication tokens (Job Token or Personal Access Token) can be provided for `terraform` in your `~/.terraformrc` file:
+Authentication tokens (Job Token or Personal Access Token) can be provided for `terraform` in your `~/.terraformrc` or `%APPDATA%/terraform.rc` file:
```terraform
credentials "gitlab.com" {
@@ -186,7 +186,7 @@ Where `<namespace>` is the [namespace](../../../user/namespace/index.md) of the
To download a Terraform module:
-1. On the left sidebar, select **Packages and registries > Terraform modules**.
+1. On the left sidebar, select **Operate > Terraform modules**.
1. Select the name of the module you want to download.
1. In the **Activity** section, select the name of the module you want to download.
@@ -217,7 +217,7 @@ You can delete modules by using [the packages API](../../../api/packages.md#dele
To delete a module in the UI, from your project:
-1. On the left sidebar, select **Packages and registries > Terraform modules**.
+1. On the left sidebar, select **Operate > Terraform modules**.
1. Find the name of the package you want to delete.
1. Select **Delete**.
diff --git a/doc/user/packages/workflows/project_registry.md b/doc/user/packages/workflows/project_registry.md
index 7bff6cf8234..1df244cf0c6 100644
--- a/doc/user/packages/workflows/project_registry.md
+++ b/doc/user/packages/workflows/project_registry.md
@@ -35,7 +35,7 @@ of each package management system to publish different package types to the same
Let's take a look at how you might create one project to host all of your packages:
1. Create a new project in GitLab. The project doesn't require any code or content.
-1. On the left sidebar, select **Project information**, and note the project ID.
+1. On the left sidebar, select **Project overview**, and note the project ID.
1. Create an access token for authentication. All package types in the Package Registry can be published by using:
- A [personal access token](../../profile/personal_access_tokens.md).
diff --git a/doc/user/permissions.md b/doc/user/permissions.md
index 0b02de59ab4..cf859174c10 100644
--- a/doc/user/permissions.md
+++ b/doc/user/permissions.md
@@ -58,11 +58,11 @@ The following table lists project permissions available for each role:
| Action | Guest | Reporter | Developer | Maintainer | Owner |
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|----------|-----------|------------|----------|
| [Analytics](analytics/index.md):<br>View [issue analytics](analytics/issue_analytics.md) | ✓ | ✓ | ✓ | ✓ | ✓ |
-| [Analytics](analytics/index.md):<br>View [merge request analytics](analytics/merge_request_analytics.md) | ✓ | ✓ | ✓ | ✓ | ✓ |
| [Analytics](analytics/index.md):<br>View [value stream analytics](group/value_stream_analytics/index.md) | ✓ | ✓ | ✓ | ✓ | ✓ |
| [Analytics](analytics/index.md):<br>View [DORA metrics](analytics/ci_cd_analytics.md) | | ✓ | ✓ | ✓ | ✓ |
| [Analytics](analytics/index.md):<br>View [CI/CD analytics](analytics/ci_cd_analytics.md) | | ✓ | ✓ | ✓ | ✓ |
| [Analytics](analytics/index.md):<br>View [code review analytics](analytics/code_review_analytics.md) | | ✓ | ✓ | ✓ | ✓ |
+| [Analytics](analytics/index.md):<br>View [merge request analytics](analytics/merge_request_analytics.md) | | ✓ | ✓ | ✓ | ✓ |
| [Analytics](analytics/index.md):<br>View [repository analytics](analytics/repository_analytics.md) | | ✓ | ✓ | ✓ | ✓ |
| [Application security](application_security/index.md):<br>View licenses in [dependency list](application_security/dependency_list/index.md) | | | ✓ | ✓ | ✓ |
| [Application security](application_security/index.md):<br>Create and run [on-demand DAST scans](application_security/dast/proxy-based.md#on-demand-scans) | | | ✓ | ✓ | ✓ |
@@ -223,7 +223,7 @@ The following table lists project permissions available for each role:
<!-- markdownlint-disable MD029 -->
-1. On self-managed GitLab instances, users with the Guest role are able to perform this action only on public and internal projects (not on private projects). [External users](admin_area/external_users.md) must be given explicit access even if the project is internal. Users with the Guest role on GitLab.com are only able to perform this action on public projects because internal visibility is not available.
+1. On self-managed GitLab instances, users with the Guest role are able to perform this action only on public and internal projects (not on private projects). [External users](../administration/external_users.md) must be given explicit access (at least the **Reporter** role) even if the project is internal. Users with the Guest role on GitLab.com are only able to perform this action on public projects because internal visibility is not available.
2. Guest users can only view the [confidential issues](project/issues/confidential_issues.md) they created themselves or are assigned to.
3. Not allowed for Guest, Reporter, Developer, Maintainer, or Owner. See [protected branches](project/protected_branches.md).
4. If the [branch is protected](project/protected_branches.md), this depends on the access given to Developers and Maintainers.
@@ -401,13 +401,13 @@ The following table lists group permissions available for each role:
| View group [Usage Quotas](usage_quotas.md) page | | | | | ✓ (3) |
| Manage group runners | | | | | ✓ |
| [Migrate groups](group/import/index.md) | | | | | ✓ |
-| Manage [subscriptions, and purchase storage and units of compute](../subscriptions/gitlab_com/index.md) | | | | | ✓ |
+| Manage [subscriptions, and purchase storage and compute minutes](../subscriptions/gitlab_com/index.md) | | | | | ✓ |
<!-- markdownlint-disable MD029 -->
1. Groups can be set to allow either Owners, or Owners and users with the Maintainer role, to [create subgroups](group/subgroups/index.md#create-a-subgroup).
2. Default project creation role can be changed at:
- - The [instance level](admin_area/settings/visibility_and_access_controls.md#define-which-roles-can-create-projects).
+ - The [instance level](../administration/settings/visibility_and_access_controls.md#define-which-roles-can-create-projects).
- The [group level](group/index.md#specify-who-can-add-projects-to-a-group).
3. Does not apply to subgroups.
4. Developers can push commits to the default branch of a new project only if the [default branch protection](group/manage.md#change-the-default-branch-protection-of-a-group) is set to "Partially protected" or "Not protected".
diff --git a/doc/user/product_analytics/index.md b/doc/user/product_analytics/index.md
index 0d97c008561..e04c61b2c00 100644
--- a/doc/user/product_analytics/index.md
+++ b/doc/user/product_analytics/index.md
@@ -13,12 +13,12 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - Snowplow integration introduced in GitLab 15.11 [with a flag](../../administration/feature_flags.md) named `product_analytics_snowplow_support`. Disabled by default.
FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available per project or for your entire instance, ask an administrator to [enable the feature flag](../../administration/feature_flags.md) named `product_analytics_dashboards`.
+On self-managed GitLab, by default this feature is not available. To make it available per project or for your entire instance, an administrator can [enable the feature flag](../../administration/feature_flags.md) named `product_analytics_dashboards`.
On GitLab.com, this feature is not available.
This feature is not ready for production use.
FLAG:
-On self-managed GitLab, by default the Snowplow integration is not available. To make it available per project or for your entire instance, ask an administrator to [enable the feature flag](../../administration/feature_flags.md) named `product_analytics_snowplow_support`.
+On self-managed GitLab, by default the Snowplow integration is not available. To make it available per project or for your entire instance, an administrator can [enable the feature flag](../../administration/feature_flags.md) named `product_analytics_snowplow_support`.
On GitLab.com, this feature is not available.
This feature is not ready for production use.
@@ -66,7 +66,7 @@ flowchart TB
> - `product_analytics_internal_preview` replaced with `product_analytics_dashboards` in GitLab 15.11.
FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available per project or for your entire instance, ask an administrator to [enable the feature flags](../../administration/feature_flags.md) named `product_analytics_dashboards` and `product_analytics_admin_settings`.
+On self-managed GitLab, by default this feature is not available. To make it available per project or for your entire instance, an administrator can [enable the feature flags](../../administration/feature_flags.md) named `product_analytics_dashboards` and `product_analytics_admin_settings`.
On GitLab.com, this feature is not available.
This feature is not ready for production use.
@@ -114,7 +114,7 @@ To instrument code to collect data, use one or more of the existing SDKs:
> - `product_analytics_internal_preview` replaced with `product_analytics_dashboards` in GitLab 15.11.
FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available per project or for your entire instance, ask an administrator to [enable the feature flag](../../administration/feature_flags.md) named `product_analytics_dashboards`.
+On self-managed GitLab, by default this feature is not available. To make it available per project or for your entire instance, an administrator can [enable the feature flag](../../administration/feature_flags.md) named `product_analytics_dashboards`.
On GitLab.com, this feature is not available.
This feature is not ready for production use.
@@ -125,6 +125,29 @@ The `cube_analytics` data type connects to the Cube instance defined when [produ
All filters and queries are sent to the Cube instance and the returned data is processed by the
product analytics data source to be rendered by the appropriate visualizations.
+### Filling missing data
+
+- Introduced in GitLab 16.3 behind the [feature flag](../../administration/feature_flags.md) named `product_analytics_dashboards`. Disabled by default.
+
+When [exporting data](#raw-data-export) or [viewing dashboards](../analytics/analytics_dashboards.md#view-project-dashboards),
+if there is no data for a given day, the missing data is autofilled with `0`.
+
+This approach has the following benefits:
+
+- The visualization's day axis matches the selected date range, removing ambiguity about missing data.
+- Data exports have rows for the entire date range, making data analysis easier.
+
+However, this approach also has the following limitations:
+
+- The `day` [granularity](https://cube.dev/docs/product/apis-integrations/rest-api/query-format) must be used.
+ All other granularities are not supported at this time.
+- It only fills a date range defined by the [`inDateRange`](https://cube.dev/docs/product/apis-integrations/rest-api/query-format#indaterange) filter.
+ - The date selector in the UI already uses this filter.
+- The filling of data ignores the query-defined limit. If you set a limit of 10 data points over 20 days, it
+ returns 20 data points, with the missing data filled by `0`.
+
+[Issue 417231](https://gitlab.com/gitlab-org/gitlab/-/issues/417231) proposes a solution to this limitation.
+
## Funnel analysis
Use funnel analysis to understand the flow of users through your application, and where
@@ -246,3 +269,10 @@ POST /api/v4/projects/PROJECT_ID/product_analytics/request/load?queryType=multi
```
If the request is successful, the returned JSON includes an array of rows of results.
+
+## Troubleshooting
+
+### No events are collected
+
+Check your [instrumentation details](#enable-product-analytics),
+and make sure product analytics is enabled and set up correctly.
diff --git a/doc/user/profile/account/delete_account.md b/doc/user/profile/account/delete_account.md
index c367498f66e..b27658e5e41 100644
--- a/doc/user/profile/account/delete_account.md
+++ b/doc/user/profile/account/delete_account.md
@@ -20,7 +20,7 @@ Deleting a user deletes all projects in that user namespace.
> Delay between a user deleting their own account and deletion of the user record introduced in GitLab 16.0 [with a flag](../../../administration/feature_flags.md) named `delay_delete_own_user`. Enabled by default on GitLab.com.
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 `delay_delete_own_user`. On GitLab.com, this feature is available.
+On self-managed GitLab, by default this feature is not available. To make it available, an administrator can [enable the feature flag](../../../administration/feature_flags.md) named `delay_delete_own_user`. On GitLab.com, this feature is available.
As a user, to delete your own account:
@@ -30,9 +30,7 @@ As a user, to delete your own account:
1. Select **Delete account**.
NOTE:
-On GitLab.com, there is a seven day delay between a user deleting their own account and deletion of the user record. During this time, that user is [blocked](../../admin_area/moderate_users.md#block-a-user) and a new account with the same email address or username cannot be created.
-
-Unblocking the account does not undo the deletion because the account will still be in the deletion queue, and there is no quick method to reverse this process.
+On GitLab.com, there is a seven day delay between a user deleting their own account and deletion of the user record. During this time, that user is [blocked](../../../administration/moderate_users.md#block-a-user) and a new account with the same email address or username cannot be created. Unblocking the account does not undo the deletion because the account will still be in the deletion queue, and will be deleted. Accounts with no issues, comments, notes, merge requests, or snippets are deleted immediately. Accounts under paid namespaces are deleted immediately.
## Delete users and user contributions **(FREE SELF)**
@@ -71,9 +69,9 @@ When deleting users, you can either:
- Personal access tokens.
- Snippets.
-An alternative to deleting is [blocking a user](../../admin_area/moderate_users.md#block-a-user).
+An alternative to deleting is [blocking a user](../../../administration/moderate_users.md#block-a-user).
-When a user is deleted from an [abuse report](../../admin_area/review_abuse_reports.md) or spam log, these associated
+When a user is deleted from an [abuse report](../../../administration/review_abuse_reports.md) or spam log, these associated
records are always removed.
The deleting associated records option can be requested in the [API](../../../api/users.md#user-deletion) as well as
@@ -91,7 +89,7 @@ ERROR: null value in column "user_id" violates not-null constraint
```
The error can be found in the [PostgreSQL log](../../../administration/logs/index.md#postgresql-logs) and
-in the **Retries** section of the [background jobs view](../../admin_area/index.md#background-jobs) in the Admin Area.
+in the **Retries** section of the [background jobs view](../../../administration/admin_area.md#background-jobs) in the Admin Area.
If the user being deleted used the [iterations](../../group/iterations/index.md) feature, such
as adding an issue to an iteration, you must use
diff --git a/doc/user/profile/account/two_factor_authentication.md b/doc/user/profile/account/two_factor_authentication.md
index b856366bb58..33888e4f06e 100644
--- a/doc/user/profile/account/two_factor_authentication.md
+++ b/doc/user/profile/account/two_factor_authentication.md
@@ -90,7 +90,7 @@ in a safe place.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/212312) in GitLab 13.5 [with a flag](../../../administration/feature_flags.md) named `forti_authenticator`. Disabled by default.
FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available per user, ask an administrator to
+On self-managed GitLab, by default this feature is not available. To make it available per user, an administrator can
[enable the feature flag](../../../administration/feature_flags.md) named `forti_authenticator`. On GitLab.com, this
feature is not available.
@@ -218,7 +218,7 @@ On your GitLab server:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/212313) in GitLab 13.7 [with a flag](../../../administration/feature_flags.md) named `forti_token_cloud`. Disabled by default.
FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available per user, ask an administrator to
+On self-managed GitLab, by default this feature is not available. To make it available per user, an administrator can
[enable the feature flag](../../../administration/feature_flags.md) named `forti_token_cloud`. On GitLab.com, this
feature is not available. The feature is not ready for production use.
@@ -277,13 +277,13 @@ Configure FortiToken Cloud in GitLab. On your GitLab server:
> - Optional one-time password authentication for WebAuthn devices [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/378844) in GitLab 15.10 [with a flag](../../../administration/feature_flags.md) named `webauthn_without_topt`. [Enabled on GitLab.com and self-managed by default](https://gitlab.com/gitlab-org/gitlab/-/issues/232671).
FLAG:
-On self-managed GitLab, by default, WebAuthn devices are available. To disable the feature, ask an administrator to
+On self-managed GitLab, by default, WebAuthn devices are available. To disable the feature, an administrator can
[disable the feature flag](../../../administration/feature_flags.md) named `webauthn`. If you disable the WebAuthn
feature flag after WebAuthn devices have been registered, these devices are not usable until you re-enable this feature.
On GitLab.com, WebAuthn devices are available.
FLAG:
-On self-managed GitLab, by default, optional one-time password authentication for WebAuthn devices is not available. To enable the feature, ask an administrator to [enable the feature flag](../../../administration/feature_flags.md) named `webauthn_without_totp`.
+On self-managed GitLab, by default, optional one-time password authentication for WebAuthn devices is not available. To enable the feature, an administrator can [enable the feature flag](../../../administration/feature_flags.md) named `webauthn_without_totp`.
On GitLab.com, this feature is available.
WebAuthn is [supported by](https://caniuse.com/#search=webauthn) the following:
@@ -465,7 +465,7 @@ a GitLab global administrator disable 2FA for your account:
## Information for GitLab administrators **(FREE SELF)**
-- Take care that 2FA keeps working after [restoring a GitLab backup](../../../raketasks/backup_restore.md).
+- Take care that 2FA keeps working after [restoring a GitLab backup](../../../administration/backup_restore/index.md).
- To ensure 2FA authorizes correctly with a time-based one-time password (TOTP) server, synchronize your GitLab
server's time using a service like NTP. Otherwise, authorization can always fail because of time differences.
- The GitLab WebAuthn implementation does _not_ work when the GitLab instance is accessed from multiple hostnames
@@ -501,7 +501,7 @@ This error occurs in the following scenarios:
- You do not have 2FA enabled but an administrator has enabled the
[enforce 2FA for all users](../../../security/two_factor_authentication.md#enforce-2fa-for-all-users) setting.
- You do not have 2FA enabled, but an administrator has disabled the
- [password authentication enabled for Git over HTTP(S)](../../admin_area/settings/sign_in_restrictions.md#password-authentication-enabled)
+ [password authentication enabled for Git over HTTP(S)](../../../administration/settings/sign_in_restrictions.md#password-authentication-enabled)
setting.
Instead you can authenticate:
diff --git a/doc/user/profile/achievements.md b/doc/user/profile/achievements.md
index 4e3248ceb10..a90144beb1b 100644
--- a/doc/user/profile/achievements.md
+++ b/doc/user/profile/achievements.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
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 `achievements`.
+an administrator can [enable the feature flag](../../administration/feature_flags.md) named `achievements`.
The feature is not ready for production use.
Achievements are a way to reward users for their activity on GitLab.
@@ -109,6 +109,23 @@ mutation achievementsCreate($file: Upload!) {
}
```
+To supply the avatar file, call the mutation using `curl`:
+
+```shell
+curl "https://gitlab.com/api/graphql" \
+ -H "Authorization: Bearer <your-pat-token>" \
+ -H "Content-Type: multipart/form-data" \
+ -F operations='{ "query": "mutation ($file: Upload!) { achievementsCreate(input: { namespaceId: \"gid://gitlab/Namespace/<namespace-id>\", name: \"<name>\", description: \"<description>\", avatar: $file }) { achievement { id name description avatarUrl } } }", "variables": { "file": null } }' \
+ -F map='{ "0": ["variables.file"] }' \
+ -F 0='@/path/to/your/file.jpg'
+```
+
+When successful, the response returns the achievement ID:
+
+```shell
+{"data":{"achievementsCreate":{"achievement":{"id":"gid://gitlab/Achievements::Achievement/1","name":"<name>","description":"<description>","avatarUrl":"https://gitlab.com/uploads/-/system/achievements/achievement/avatar/1/file.jpg"}}}}
+```
+
## Update an achievement
You can change the name, description, and avatar of an achievement at any time.
diff --git a/doc/user/profile/comment_templates.md b/doc/user/profile/comment_templates.md
index 4157fc852b7..a9db2d268fe 100644
--- a/doc/user/profile/comment_templates.md
+++ b/doc/user/profile/comment_templates.md
@@ -12,7 +12,7 @@ type: howto
> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/119468) in GitLab 16.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 `saved_replies`.
+On self-managed GitLab, by default this feature is available. To hide the feature, an administrator can [disable the feature flag](../../administration/feature_flags.md) named `saved_replies`.
On GitLab.com, this feature is available.
With comment templates, create and reuse text for any text area in:
diff --git a/doc/user/profile/contributions_calendar.md b/doc/user/profile/contributions_calendar.md
index 7adf653606e..e7f7211aeae 100644
--- a/doc/user/profile/contributions_calendar.md
+++ b/doc/user/profile/contributions_calendar.md
@@ -101,6 +101,6 @@ To reset your feed token:
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**.
+1. On the confirmation dialog, select **OK**.
A new token is generated.
diff --git a/doc/user/profile/index.md b/doc/user/profile/index.md
index 958acaa61a9..32ea9dd2c23 100644
--- a/doc/user/profile/index.md
+++ b/doc/user/profile/index.md
@@ -39,7 +39,7 @@ Prerequisites:
- Have a project that hosts [GitLab Pages](../project/pages/index.md). For more information,
see [changing your username in the GitLab Team Handbook](https://about.gitlab.com/handbook/tools-and-tips/#change-your-username-at-gitlabcom).
- Your username must be between 2 and 255 characters in length, and must not:
- - Contain special characters or emojis.
+ - Contain special characters or emoji.
- End with `.<reserved file extension>`, for example `jon.png`. However, `jonpng` is valid.
To change your username:
@@ -90,7 +90,7 @@ not.
When visiting the public page of a user, you can only see the projects which you have privileges to.
-If the [public level is restricted](../admin_area/settings/visibility_and_access_controls.md#restrict-visibility-levels),
+If the [public level is restricted](../../administration/settings/visibility_and_access_controls.md#restrict-visibility-levels),
user profiles are only visible to authenticated users.
## Add details to your profile with a README
@@ -104,7 +104,7 @@ the README file with information, it's included on your profile page.
To create a new project and add its README to your profile:
-1. On the left sidebar, at the top, select **Create new...** (**{plus}**) and **New project/repository**.
+1. On the left sidebar, at the top, select **Create new** (**{plus}**) and **New project/repository**.
1. Select **Create blank project**.
1. Enter the project details:
- In the **Project name** field, enter the name for your new project.
@@ -250,7 +250,7 @@ Your primary email is used by default.
To change your commit email:
-1. In the upper-right corner, select your avatar.
+1. On the left sidebar, select your avatar.
1. Select **Edit profile**.
1. In the **Commit email** dropdown list, select an email address.
1. Select **Update profile settings**.
@@ -261,7 +261,7 @@ Your primary email is the default email address for your login, commit email, an
To change your primary email:
-1. In the upper-right corner, select your avatar.
+1. On the left sidebar, select your avatar.
1. Select **Edit profile**.
1. In the **Email** field, enter your new email address.
1. Select **Update profile settings**.
@@ -271,7 +271,7 @@ To change your primary email:
You can select one of your [configured email addresses](#add-emails-to-your-user-profile) to be displayed on your public profile:
-1. In the upper-right corner, select your avatar.
+1. On the left sidebar, select your avatar.
1. Select **Edit profile**.
1. In the **Public email** field, select one of the available email addresses.
1. Select **Update profile settings**.
@@ -354,7 +354,7 @@ By default, you are signed out of GitLab after seven days (10080 minutes) of ina
window, whichever comes first.
GitLab administrators can
-[change this default](../admin_area/settings/account_and_limit_settings.md#customize-the-default-session-duration).
+[change this default](../../administration/settings/account_and_limit_settings.md#customize-the-default-session-duration).
### Stay signed in indefinitely
@@ -365,7 +365,7 @@ To remain signed in indefinitely, select the **Remember me** checkbox on the Git
You remain signed in because, although the server sets a session time of one week, your browser stores a secure token
that enables automatic reauthentication.
-GitLab administrators can [turn off the **Remember me** setting](../admin_area/settings/account_and_limit_settings.md#session-duration) for environments
+GitLab administrators can [turn off the **Remember me** setting](../../administration/settings/account_and_limit_settings.md#session-duration) for environments
that require sessions to expire periodically for security or compliance purposes.
### Cookies used for sign-in
diff --git a/doc/user/profile/notifications.md b/doc/user/profile/notifications.md
index cc0b67eed52..f378b0ae301 100644
--- a/doc/user/profile/notifications.md
+++ b/doc/user/profile/notifications.md
@@ -14,7 +14,7 @@ Stay informed about what's happening in GitLab with email notifications.
You can receive updates about activity in issues, merge requests, epics, and designs.
For the tool that GitLab administrators can use to send messages to users, read
-[Email from GitLab](../admin_area/email_from_gitlab.md).
+[Email from GitLab](../../administration/email_from_gitlab.md).
## Who receives notifications
@@ -46,7 +46,7 @@ anyone else.
To edit your notification settings:
-1. In the upper-right corner, select your avatar.
+1. On the left sidebar, select your avatar.
1. Select **Preferences**.
1. On the left sidebar, select **Notifications**.
1. Edit the desired global, group, or project notification settings.
@@ -99,7 +99,7 @@ You can select a notification level and email address for each group.
To select a notification level for a group, use either of these methods:
-1. In the upper-right corner, select your avatar.
+1. On the left sidebar, select your avatar.
1. Select **Preferences**.
1. On the left sidebar, select **Notifications**.
1. Locate the project in the **Groups** section.
@@ -118,7 +118,7 @@ Or:
You can select an email address to receive notifications for each group you belong to.
You can use group notifications, for example, if you work freelance, and want to keep email about clients' projects separate.
-1. In the upper-right corner, select your avatar.
+1. On the left sidebar, select your avatar.
1. Select **Preferences**.
1. On the left sidebar, select **Notifications**.
1. Locate the project in the **Groups** section.
@@ -130,7 +130,7 @@ To help you stay up to date, you can select a notification level for each projec
To select a notification level for a project, use either of these methods:
-1. In the upper-right corner, select your avatar.
+1. On the left sidebar, select your avatar.
1. Select **Preferences**.
1. On the left sidebar, select **Notifications**.
1. Locate the project in the **Projects** section.
@@ -152,7 +152,7 @@ These emails are enabled by default.
To opt out:
-1. In the upper-right corner, select your avatar.
+1. On the left sidebar, select your avatar.
1. Select **Preferences**.
1. On the left sidebar, select **Notifications**.
1. Clear the **Receive product marketing emails** checkbox.
@@ -290,7 +290,7 @@ To always receive notifications on your own issues, merge requests, and so on, t
NOTE:
This feature is enabled by default for self-managed instances. Administrators may disable this feature
-through the [Sign-in restrictions](../admin_area/settings/sign_in_restrictions.md#email-notification-for-unknown-sign-ins) section of the UI.
+through the [Sign-in restrictions](../../administration/settings/sign_in_restrictions.md#email-notification-for-unknown-sign-ins) section of the UI.
The feature is always enabled on GitLab.com.
When a user successfully signs in from a previously unknown IP address or device,
@@ -335,7 +335,7 @@ The participants are:
If you no longer wish to receive any email notifications:
-1. In the upper-right corner, select your avatar.
+1. On the left sidebar, select your avatar.
1. Select **Preferences**.
1. On the left sidebar, select **Notifications**.
1. Clear the **Receive product marketing emails** checkbox.
@@ -345,7 +345,7 @@ If you no longer wish to receive any email notifications:
**Disabled**.
On self-managed installations, even after doing this, your instance administrator
-[can still email you](../admin_area/email_from_gitlab.md).
+[can still email you](../../administration/email_from_gitlab.md).
To unsubscribe, select the unsubscribe link in one of these emails.
## Email headers you can use to filter email
diff --git a/doc/user/profile/personal_access_tokens.md b/doc/user/profile/personal_access_tokens.md
index bda92ce8388..a8231460045 100644
--- a/doc/user/profile/personal_access_tokens.md
+++ b/doc/user/profile/personal_access_tokens.md
@@ -48,7 +48,7 @@ Use impersonation tokens to automate authentication as a specific user.
You can create as many personal access tokens as you like.
-1. In the upper-right corner, select your avatar.
+1. On the left sidebar, select your avatar.
1. Select **Edit profile**.
1. On the left sidebar, select **Access Tokens**.
1. Enter a name and expiry date for the token.
@@ -79,17 +79,15 @@ for guidance on managing personal access tokens (for example, setting a short ex
At any time, you can revoke a personal access token.
-1. In the upper-right corner, select your avatar.
+1. On the left sidebar, select your avatar.
1. Select **Edit profile**.
1. On the left sidebar, select **Access Tokens**.
1. In the **Active personal access tokens** area, next to the key, select **Revoke**.
## View the last time a token was used
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/414945) in GitLab 16.1 [with a flag](../../administration/feature_flags.md) named `update_personal_access_token_usage_information_every_10_minutes`. 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 `update_personal_access_token_usage_information_every_10_minutes`. On GitLab.com, this feature is available.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/33162) in GitLab 13.2. Token usage information is updated every 24 hours.
+> - The frequency of token usage information updates [changed](https://gitlab.com/gitlab-org/gitlab/-/issues/410168) in GitLab 16.1 from 24 hours to 10 minutes.
Token usage information is updated every 10 minutes. GitLab considers a token used when the token is used to:
@@ -98,7 +96,7 @@ Token usage information is updated every 10 minutes. GitLab considers a token us
To view the last time a token was used:
-1. In the upper-right corner, select your avatar.
+1. On the left sidebar, select your avatar.
1. Select **Edit profile**.
1. On the left sidebar, select **Access Tokens**.
1. In the **Active personal access tokens** area, next to the key, view the **Last Used** date.
@@ -119,7 +117,8 @@ A personal access token can perform actions based on the assigned scopes.
| `read_registry` | Grants read-only (pull) access to a [Container Registry](../packages/container_registry/index.md) images if a project is private and authorization is required. Available only when the Container Registry is enabled. |
| `write_registry` | Grants read-write (push) access to a [Container Registry](../packages/container_registry/index.md) images if a project is private and authorization is required. Available only when the Container Registry is enabled. ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/28958) in GitLab 12.10.) |
| `sudo` | Grants permission to perform API actions as any user in the system, when authenticated as an administrator. |
-| `admin_mode` | Grants permission to perform API actions as an administrator, when Admin Mode is enabled. ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107875) in GitLab 15.8.) |
+| `admin_mode` | Grants permission to perform API actions as an administrator, when Admin Mode is enabled. ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107875) in GitLab 15.8.) |
+| `create_runner` | Grants permission to create runners. |
WARNING:
If you enabled [external authorization](../admin_area/settings/external_authorization.md), personal access tokens cannot access container or package registries. If you use personal access tokens to access these registries, this measure breaks this use of these tokens. Disable external authorization to use personal access tokens with container or package registries.
@@ -131,7 +130,8 @@ 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 access tokens](../admin_area/settings/account_and_limit_settings.md#limit-the-lifetime-of-access-tokens).
+ [limit the allowable lifetime of access tokens](../../administration/settings/account_and_limit_settings.md#limit-the-lifetime-of-access-tokens). If not set, the maximum allowable lifetime of a personal access token is 365 days.
+- In GitLab Free and Premium, the maximum allowable lifetime of a personal access token is 365 days.
## Create a personal access token programmatically **(FREE SELF)**
@@ -157,11 +157,11 @@ To create a personal access token programmatically:
The token must be 20 characters long. The scopes must be valid and are visible
[in the source code](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/auth.rb).
- For example, to create a token that belongs to a user with username `automation-bot`:
+ For example, to create a token that belongs to a user with username `automation-bot` and expires in a year:
```ruby
user = User.find_by_username('automation-bot')
- token = user.personal_access_tokens.create(scopes: ['read_user', 'read_repository'], name: 'Automation token')
+ token = user.personal_access_tokens.create(scopes: ['read_user', 'read_repository'], name: 'Automation token', expires_at: 365.days.from_now)
token.set_token('token-string-here123')
token.save!
```
@@ -170,7 +170,7 @@ This code can be shortened into a single-line shell command by using the
[Rails runner](../../administration/operations/rails_console.md#using-the-rails-runner):
```shell
-sudo gitlab-rails runner "token = User.find_by_username('automation-bot').personal_access_tokens.create(scopes: ['read_user', 'read_repository'], name: 'Automation token'); token.set_token('token-string-here123'); token.save!"
+sudo gitlab-rails runner "token = User.find_by_username('automation-bot').personal_access_tokens.create(scopes: ['read_user', 'read_repository'], name: 'Automation token', expires_at: 365.days.from_now); token.set_token('token-string-here123'); token.save!"
```
## Revoke a personal access token programmatically **(FREE SELF)**
diff --git a/doc/user/profile/preferences.md b/doc/user/profile/preferences.md
index bcfe323a5fe..17dea99e5ef 100644
--- a/doc/user/profile/preferences.md
+++ b/doc/user/profile/preferences.md
@@ -12,14 +12,13 @@ of GitLab to their liking.
To navigate to your profile's preferences:
-1. In the upper-right corner, select your avatar.
+1. On the left sidebar, select your avatar.
1. Select **Preferences**.
## Navigation theme
The GitLab navigation theme setting allows you to personalize your GitLab experience.
-You can choose from several color themes that add unique colors to the top navigation
-and left side navigation.
+You can choose from several color themes that add unique colors to the left sidebar.
Using individual color themes might help you differentiate between your different
GitLab instances.
@@ -158,7 +157,7 @@ You can choose one of the following options as the first day of the week:
- Sunday
- Monday
-If you select **System Default**, the [instance default](../admin_area/settings/index.md#default-first-day-of-the-week) setting is used.
+If you select **System Default**, the [instance default](../../administration/settings/index.md#default-first-day-of-the-week) setting is used.
## Time preferences
diff --git a/doc/user/profile/saved_replies.md b/doc/user/profile/saved_replies.md
deleted file mode 100644
index 1f4e4f5fa51..00000000000
--- a/doc/user/profile/saved_replies.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: 'comment_templates.md'
-remove_date: '2023-06-22'
----
-
-This document was moved to [another location](comment_templates.md).
-
-<!-- This redirect file can be deleted after <2023-06-22>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/profile/user_passwords.md b/doc/user/profile/user_passwords.md
index 50624a43893..c57a81c00bf 100644
--- a/doc/user/profile/user_passwords.md
+++ b/doc/user/profile/user_passwords.md
@@ -67,7 +67,7 @@ By default GitLab enforces the following password requirements:
Self-managed installations can configure the following additional password requirements:
- [Password minimum and maximum length limits](../../security/password_length_limits.md).
-- [Password complexity requirements](../admin_area/settings/sign_up_restrictions.md#password-complexity-requirements).
+- [Password complexity requirements](../../administration/settings/sign_up_restrictions.md#password-complexity-requirements).
## Block weak passwords
diff --git a/doc/user/project/canary_deployments.md b/doc/user/project/canary_deployments.md
index 8ea762777ac..c4ef6a647db 100644
--- a/doc/user/project/canary_deployments.md
+++ b/doc/user/project/canary_deployments.md
@@ -121,7 +121,7 @@ or by sending requests to the [GraphQL API](../../api/graphql/getting_started.md
To use your [deploy board](../../user/project/deploy_boards.md):
-1. Go to **Deployments > Environments** for your project.
+1. Go to **Operate > Environments** for your project.
1. Set the new weight with the dropdown list on the right side.
1. Confirm your selection.
@@ -134,7 +134,7 @@ Here's an example using [GraphiQL](../../api/graphql/getting_started.md#graphiql
mutation {
environmentsCanaryIngressUpdate(input:{
id: "gid://gitlab/Environment/29", # Your Environment ID. You can get the ID from the URL of the environment page.
- weight: 45 # The new traffic weight. e.g. If you set `45`, 45% of traffic goes to a canary deployment and 55% of traffic goes to a stable deployment.
+ weight: 45 # The new traffic weight. for example, If you set `45`, 45% of traffic goes to a canary deployment and 55% of traffic goes to a stable deployment.
}) {
errors
}
diff --git a/doc/user/project/clusters/add_eks_clusters.md b/doc/user/project/clusters/add_eks_clusters.md
index 87554e786ab..9a30cbe94e2 100644
--- a/doc/user/project/clusters/add_eks_clusters.md
+++ b/doc/user/project/clusters/add_eks_clusters.md
@@ -54,7 +54,7 @@ To create new a EKS cluster for your project, group, or instance, through
cluster certificates:
1. Go to your:
- - Project's **Infrastructure > Kubernetes clusters** page, for a project-level cluster.
+ - Project's **Operate > Kubernetes clusters** page, for a project-level cluster.
- Group's **Kubernetes** page, for a group-level cluster.
- **Main menu > Admin > Kubernetes**, for an instance-level cluster.
1. Select **Integrate with a cluster certificate**.
@@ -213,7 +213,7 @@ Otherwise, the deployed app isn't externally available outside of the cluster.
GitLab creates a new pipeline, which begins to build, test, and deploy the app.
After the pipeline has finished, your app runs in EKS, and is available
-to users. Select **CI/CD > Environments**.
+to users. Select **Operate > Environments**.
![Deployed Environment](img/environment.png)
diff --git a/doc/user/project/clusters/add_existing_cluster.md b/doc/user/project/clusters/add_existing_cluster.md
index bb85662d442..aaaa72d282e 100644
--- a/doc/user/project/clusters/add_existing_cluster.md
+++ b/doc/user/project/clusters/add_existing_cluster.md
@@ -66,7 +66,7 @@ to grant access.
To add a Kubernetes cluster to your project, group, or instance:
1. Navigate to your:
- 1. Project's **{cloud-gear}** **Infrastructure > Kubernetes clusters** page, for a project-level cluster.
+ 1. Project's **{cloud-gear}** **Operate > Kubernetes clusters** page, for a project-level cluster.
1. Group's **{cloud-gear}** **Kubernetes** page, for a group-level cluster.
1. **Main menu > Admin > Kubernetes** page, for an instance-level cluster.
1. On the **Kubernetes clusters** page, select the **Connect with a certificate** option from the **Actions** dropdown list.
diff --git a/doc/user/project/clusters/add_gke_clusters.md b/doc/user/project/clusters/add_gke_clusters.md
index c6561fffa0b..09dbd70d1bb 100644
--- a/doc/user/project/clusters/add_gke_clusters.md
+++ b/doc/user/project/clusters/add_gke_clusters.md
@@ -60,7 +60,7 @@ To create new Kubernetes clusters to your project, group, or instance, through
cluster certificates:
1. Navigate to your:
- - Project's **{cloud-gear}** **Infrastructure > Kubernetes clusters** page, for a project-level
+ - Project's **{cloud-gear}** **Operate > Kubernetes clusters** page, for a project-level
cluster.
- Group's **{cloud-gear}** **Kubernetes** page, for a group-level cluster.
- **Main menu > Admin > Kubernetes** page, for an instance-level cluster.
diff --git a/doc/user/project/clusters/add_remove_clusters.md b/doc/user/project/clusters/add_remove_clusters.md
index bba05f1e724..470daf499be 100644
--- a/doc/user/project/clusters/add_remove_clusters.md
+++ b/doc/user/project/clusters/add_remove_clusters.md
@@ -17,7 +17,7 @@ To create and manage a new cluster use [Infrastructure as Code](../../infrastruc
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.
+ - Project's **{cloud-gear}** **Operate > Kubernetes clusters** page, for a project-level cluster.
- Group's **{cloud-gear}** **Kubernetes** page, for a group-level cluster.
- **Main menu > Admin > Kubernetes** page, for an instance-level cluster.
1. Select the name of the cluster you want to disable.
diff --git a/doc/user/project/clusters/gitlab_managed_clusters.md b/doc/user/project/clusters/gitlab_managed_clusters.md
index b321646d8d8..537b38dd547 100644
--- a/doc/user/project/clusters/gitlab_managed_clusters.md
+++ b/doc/user/project/clusters/gitlab_managed_clusters.md
@@ -17,7 +17,7 @@ To connect your cluster to GitLab, use the [GitLab agent](../../../user/clusters
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`.
+On self-managed GitLab, by default this feature is not available. To make it available, an administrator can [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
@@ -45,7 +45,7 @@ your cluster. This can cause deployment jobs to fail.
To clear the cache:
-1. Navigate to your project's **Infrastructure > Kubernetes clusters** page, and select your cluster.
+1. Navigate to your project's **Operate > Kubernetes clusters** page, and select your cluster.
1. Expand the **Advanced settings** section.
1. Select **Clear cluster cache**.
diff --git a/doc/user/project/deploy_boards.md b/doc/user/project/deploy_boards.md
index 09a443614d0..8f64fe7dd7d 100644
--- a/doc/user/project/deploy_boards.md
+++ b/doc/user/project/deploy_boards.md
@@ -24,7 +24,7 @@ This feature was [deprecated](https://gitlab.com/groups/gitlab-org/configure/-/e
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`.
+On self-managed GitLab, by default this feature is not available. To make it available, an administrator can [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
@@ -127,7 +127,7 @@ To display the deploy boards for a specific [environment](../../ci/environments/
![deploy boards Kubernetes Label](img/deploy_boards_kubernetes_label.png)
Once all of the above are set up and the pipeline has run at least once,
-navigate to the environments page under **Deployments > Environments**.
+go to the environments page under **Operate > Environments**.
Deploy boards are visible by default. You can explicitly select
the triangle next to their respective environment name to hide them.
diff --git a/doc/user/project/deploy_keys/index.md b/doc/user/project/deploy_keys/index.md
index 5bd19fec0ba..4e380d485a8 100644
--- a/doc/user/project/deploy_keys/index.md
+++ b/doc/user/project/deploy_keys/index.md
@@ -40,7 +40,6 @@ A deploy key is given a permission level when it is created:
You can change a deploy key's permission level after creating it. Changing a project deploy key's
permissions only applies for the current project.
-Although a deploy key is a secret that isn't associated with a specific user,
GitLab authorizes the creator of the deploy key if the Git-command triggers additional processes. For example:
- When a deploy key is used to push a commit to a [protected branch](../protected_branches.md),
@@ -58,6 +57,9 @@ For human interactions, use credentials tied to users such as Personal Access To
To help detect a potential secret leak, you can use the
[Audit Event](../../../administration/audit_event_streaming/examples.md#example-payloads-for-ssh-events-with-deploy-key) feature.
+WARNING:
+Deploy keys work even if the user who created them is removed from the group or project.
+
## View deploy keys
To view the deploy keys available to a project:
@@ -128,6 +130,20 @@ To grant a public deploy key access to a project:
1. In the key's row, select **Edit** (**{pencil}**).
1. Select the **Grant write permissions to this key** checkbox.
+### Edit project access permissions of a deploy key
+
+Prerequisites:
+
+- You must have at least the Maintainer role for the project.
+
+To edit the project access permissions of a deploy key:
+
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
+1. Select **Settings > Repository**.
+1. Expand **Deploy keys**.
+1. In the key's row, select **Edit** (**{pencil}**).
+1. Select or clear the **Grant write permissions to this key** checkbox.
+
## Revoke project access of a deploy key
To revoke a deploy key's access to a project, you can disable it. Any service that relies on
@@ -159,8 +175,10 @@ What happens to the deploy key when it is disabled depends on the following:
There are a few scenarios where a deploy key fails to push to a
[protected branch](../protected_branches.md).
-- The owner associated to a deploy key does not have access to the protected branch.
- The owner associated to a deploy key does not have [membership](../members/index.md) to the project of the protected branch.
+- The owner associated to a deploy key has [project membership permissions](../../../user/permissions.md#project-members-permissions) lower than required to **View project code**.
+- The deploy key does not have [read-write permissions for the project](#edit-project-access-permissions-of-a-deploy-key).
+- The deploy key has been [revoked](#revoke-project-access-of-a-deploy-key).
- **No one** is selected in [the **Allowed to push and merge** section](../protected_branches.md#add-protection-to-existing-branches) of the protected branch.
All deploy keys are associated to an account. Since the permissions for an account can change, this might lead to scenarios where a deploy key that was working is suddenly unable to push to a protected branch.
diff --git a/doc/user/project/description_templates.md b/doc/user/project/description_templates.md
index 11e538964a2..3fb338a75ec 100644
--- a/doc/user/project/description_templates.md
+++ b/doc/user/project/description_templates.md
@@ -16,7 +16,7 @@ You might want to use these templates:
- For different stages of your workflow, for example, feature proposal, feature improvement, or a bug report.
- For every issue or merge request for a specific project, so the layout is consistent.
-- For a [Service Desk email template](service_desk.md#use-a-custom-template-for-service-desk-issues).
+- For a [Service Desk email template](service_desk.md#use-a-custom-template-for-service-desk-tickets).
For description templates to work, they must be:
diff --git a/doc/user/project/file_lock.md b/doc/user/project/file_lock.md
index 71b4bff41d1..4c77323778c 100644
--- a/doc/user/project/file_lock.md
+++ b/doc/user/project/file_lock.md
@@ -147,7 +147,7 @@ permissions to the project:
git lfs unlock --id=123 --force
```
-You can normally push files to GitLab whether they're locked or unlocked.
+You can push files to GitLab whether they're locked or unlocked.
NOTE:
Although multi-branch file locks can be created and managed through the Git LFS
@@ -209,11 +209,13 @@ To lock a file:
1. Open the file or directory in GitLab.
1. In the upper-right corner, above the file, select **Lock**.
-1. On the confirmation dialog box, select **OK**.
+1. On the confirmation dialog, select **OK**.
If you do not have permission to lock the file, the button is not enabled.
-To view the user who locked the file (if it was not you), hover over the button.
+To view the user who locked a directory (if it was not you), hover over the button. Reinstatement of
+similar functionality for locked files is discussed in
+[issue 376222](https://gitlab.com/gitlab-org/gitlab/-/issues/376222).
### View and remove existing locks
diff --git a/doc/user/project/import/bitbucket.md b/doc/user/project/import/bitbucket.md
index dc17a3646a8..b957ff93a4c 100644
--- a/doc/user/project/import/bitbucket.md
+++ b/doc/user/project/import/bitbucket.md
@@ -36,7 +36,7 @@ When importing:
- [Bitbucket Cloud integration](../../../integration/bitbucket.md) must be enabled. If that integration is not enabled, ask your GitLab administrator
to enable it. The Bitbucket Cloud integration is enabled by default on GitLab.com.
-- [Bitbucket Cloud import source](../../admin_area/settings/visibility_and_access_controls.md#configure-allowed-import-sources) must be enabled. If not enabled, ask your
+- [Bitbucket Cloud import source](../../../administration/settings/visibility_and_access_controls.md#configure-allowed-import-sources) must be enabled. If not enabled, ask your
GitLab administrator to enable it. The Bitbucket Cloud import source is enabled by default on GitLab.com.
- At least the Maintainer role on the destination group to import to.
@@ -70,7 +70,7 @@ For user contributions to be mapped, each user must complete the following befor
> Ability to re-import projects [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/23905) in GitLab 15.9.
1. Sign in to GitLab.
-1. On the left sidebar, at the top, select **Create new...** (**{plus}**) and **New project/repository**.
+1. On the left sidebar, at the top, select **Create new** (**{plus}**) and **New project/repository**.
1. Select **Import project**.
1. Select **Bitbucket Cloud**.
1. Log in to Bitbucket and grant GitLab access to your Bitbucket account.
diff --git a/doc/user/project/import/bitbucket_server.md b/doc/user/project/import/bitbucket_server.md
index fce9ca7d147..6226e4c1296 100644
--- a/doc/user/project/import/bitbucket_server.md
+++ b/doc/user/project/import/bitbucket_server.md
@@ -31,7 +31,7 @@ You can import Bitbucket repositories to GitLab.
> Requirement for Maintainer role instead of Developer role introduced in GitLab 16.0 and backported to GitLab 15.11.1 and GitLab 15.10.5.
-- [Bitbucket Server import source](../../admin_area/settings/visibility_and_access_controls.md#configure-allowed-import-sources)
+- [Bitbucket Server import source](../../../administration/settings/visibility_and_access_controls.md#configure-allowed-import-sources)
must be enabled. If not enabled, ask your GitLab administrator to enable it. The Bitbucket Server import source is enabled
by default on GitLab.com.
- At least the Maintainer role on the destination group to import to.
@@ -41,7 +41,7 @@ You can import Bitbucket repositories to GitLab.
To import your Bitbucket repositories:
1. Sign in to GitLab.
-1. On the left sidebar, at the top, select **Create new...** (**{plus}**) and **New project/repository**.
+1. On the left sidebar, at the top, select **Create new** (**{plus}**) and **New project/repository**.
1. Select **Import project**.
1. Select **Bitbucket Server**.
1. Log in to Bitbucket and grant GitLab access to your Bitbucket account.
@@ -93,7 +93,7 @@ repository imports under the namespace of the user who started the import proces
FLAG:
On self-managed GitLab and GitLab.com, by default this feature is not available. To make it
-available, ask an administrator to [enable the feature flag](../../../administration/feature_flags.md)
+available, an administrator can [enable the feature flag](../../../administration/feature_flags.md)
named `bitbucket_server_user_mapping_by_username`. This feature is not ready for production use.
With this feature enabled, the importer tries to find a user in the GitLab user database with the
diff --git a/doc/user/project/import/fogbugz.md b/doc/user/project/import/fogbugz.md
index 30c4249e0d6..18758ba99e6 100644
--- a/doc/user/project/import/fogbugz.md
+++ b/doc/user/project/import/fogbugz.md
@@ -19,7 +19,7 @@ users.
> Requirement for Maintainer role instead of Developer role introduced in GitLab 16.0 and backported to GitLab 15.11.1 and GitLab 15.10.5.
-- [FogBugz import source](../../admin_area/settings/visibility_and_access_controls.md#configure-allowed-import-sources)
+- [FogBugz import source](../../../administration/settings/visibility_and_access_controls.md#configure-allowed-import-sources)
must be enabled. If not enabled, ask your GitLab administrator to enable it. The FogBugz import source is enabled
by default on GitLab.com.
- At least the Maintainer role on the destination group to import to.
@@ -29,7 +29,7 @@ users.
To import your project from FogBugz:
1. Sign in to GitLab.
-1. On the left sidebar, at the top, select **Create new...** (**{plus}**) and **New project/repository**.
+1. On the left sidebar, at the top, select **Create new** (**{plus}**) and **New project/repository**.
1. Select **Import project**.
1. Select **FogBugz**.
1. Enter your FogBugz URL, email address, and password.
diff --git a/doc/user/project/import/gitea.md b/doc/user/project/import/gitea.md
index 62cda62c2fe..22c89084c56 100644
--- a/doc/user/project/import/gitea.md
+++ b/doc/user/project/import/gitea.md
@@ -32,7 +32,7 @@ on the issue about the original Gitea author.
> Requirement for Maintainer role instead of Developer role introduced in GitLab 16.0 and backported to GitLab 15.11.1 and GitLab 15.10.5.
- Gitea version 1.0.0 or later.
-- [Gitea import source](../../admin_area/settings/visibility_and_access_controls.md#configure-allowed-import-sources)
+- [Gitea import source](../../../administration/settings/visibility_and_access_controls.md#configure-allowed-import-sources)
must be enabled. If not enabled, ask your GitLab administrator to enable it. The Gitea import source is enabled
by default on GitLab.com.
- At least the Maintainer role on the destination group to import to.
diff --git a/doc/user/project/import/github.md b/doc/user/project/import/github.md
index 509029a3099..afc36f309be 100644
--- a/doc/user/project/import/github.md
+++ b/doc/user/project/import/github.md
@@ -35,7 +35,7 @@ When importing projects:
- The organization the repository belongs to must not impose restrictions of a [third-party application access policy](https://docs.github.com/en/organizations/managing-oauth-access-to-your-organizations-data/about-oauth-app-access-restrictions) on the GitLab instance you import to.
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
-For an overview of the import process, see [Migrating from GitHub to GitLab](https://youtu.be/VYOXuOg9tQI).
+For an overview of the import process, see [How to migrate from GitHub to GitLab including Actions](https://www.youtube.com/watch?v=0Id5oMl1Kqs).
## Prerequisites
@@ -43,7 +43,7 @@ For an overview of the import process, see [Migrating from GitHub to GitLab](htt
To import projects from GitHub:
-- [GitHub import source](../../admin_area/settings/visibility_and_access_controls.md#configure-allowed-import-sources)
+- [GitHub import source](../../../administration/settings/visibility_and_access_controls.md#configure-allowed-import-sources)
must be enabled. If not enabled, ask your GitLab administrator to enable it. The GitHub import source is enabled
by default on GitLab.com.
- You must have at least the Maintainer role on the destination group to import to.
@@ -68,7 +68,7 @@ If you are importing from GitHub Enterprise to a self-managed GitLab instance:
- You must first enable the [GitHub integration](../../../integration/github.md).
- GitHub must be enabled as an import source in the
- [Admin Area](../../admin_area/settings/visibility_and_access_controls.md#configure-allowed-import-sources).
+ [Admin Area](../../../administration/settings/visibility_and_access_controls.md#configure-allowed-import-sources).
- For GitLab 15.10 and earlier, you must add `github.com` and `api.github.com` entries in the
[allowlist for local requests](../../../security/webhooks.md#allow-outbound-requests-to-certain-ip-addresses-and-domains).
@@ -78,7 +78,7 @@ If you are importing from GitHub.com to a self-managed GitLab instance:
- You don't need to enable the [GitHub integration](../../../integration/github.md).
- GitHub must be enabled as an import source in the
- [Admin Area](../../admin_area/settings/visibility_and_access_controls.md#configure-allowed-import-sources).
+ [Admin Area](../../../administration/settings/visibility_and_access_controls.md#configure-allowed-import-sources).
## Import your GitHub repository into GitLab
@@ -96,9 +96,11 @@ 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, 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. On the left sidebar, at the top, select **Create new** (**{plus}**) and **New project/repository**.
+1. Select **Import project** and then **GitHub**.
+1. Now you can either:
+ - Add a personal access token and select **Authenticate**.
+ - If GitHub is [configured](../../../integration/github.md) for the instance, select **Authorize with GitHub**.
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).
diff --git a/doc/user/project/import/index.md b/doc/user/project/import/index.md
index 9fdb8eed5aa..6f9c64b73cb 100644
--- a/doc/user/project/import/index.md
+++ b/doc/user/project/import/index.md
@@ -92,7 +92,7 @@ over a series of Docker pulls and pushes. Re-run any CI pipelines to retrieve an
## Migrate between two self-managed GitLab instances
To migrate from an existing self-managed GitLab instance to a new self-managed GitLab instance,
-you should [back up](../../../raketasks/backup_restore.md)
+you should [back up](../../../administration/backup_restore/index.md)
the existing instance and restore it on the new instance. For example, you could use this method to migrate a self-managed instance from an old server to a new server.
The backups produced don't depend on the operating system running GitLab. You can therefore use
@@ -114,7 +114,7 @@ You can view all project imports created by you. This list includes the followin
To view project import history:
1. Sign in to GitLab.
-1. On the left sidebar, at the top, select **Create new...** (**{plus}**) and **New project/repository**.
+1. On the left sidebar, at the top, select **Create new** (**{plus}**) and **New project/repository**.
1. Select **Import project**.
1. In the upper-right corner, select **History**.
1. If there are any errors for a particular import, you can see them by selecting **Details**.
diff --git a/doc/user/project/import/manifest.md b/doc/user/project/import/manifest.md
index 7b3550d2dc9..980c051eac7 100644
--- a/doc/user/project/import/manifest.md
+++ b/doc/user/project/import/manifest.md
@@ -19,7 +19,7 @@ repositories like the Android Open Source Project (AOSP).
> Requirement for Maintainer role instead of Developer role introduced in GitLab 16.0 and backported to GitLab 15.11.1 and GitLab 15.10.5.
-- [Manifest import source](../../admin_area/settings/visibility_and_access_controls.md#configure-allowed-import-sources)
+- [Manifest import source](../../../administration/settings/visibility_and_access_controls.md#configure-allowed-import-sources)
must be enabled. If not enabled, ask your GitLab administrator to enable it. The Manifest import source is enabled
by default on GitLab.com.
- GitLab must use PostgreSQL for its database, because [subgroups](../../group/subgroups/index.md) are needed for the manifest import
diff --git a/doc/user/project/import/repo_by_url.md b/doc/user/project/import/repo_by_url.md
index 230113581f8..c3c516042f7 100644
--- a/doc/user/project/import/repo_by_url.md
+++ b/doc/user/project/import/repo_by_url.md
@@ -12,7 +12,7 @@ You can import your existing repositories by providing the Git URL.
> Requirement for Maintainer role instead of Developer role introduced in GitLab 16.0 and backported to GitLab 15.11.1 and GitLab 15.10.5.
-- [Repository by URL import source](../../admin_area/settings/visibility_and_access_controls.md#configure-allowed-import-sources)
+- [Repository by URL import source](../../../administration/settings/visibility_and_access_controls.md#configure-allowed-import-sources)
must be enabled. If not enabled, ask your GitLab administrator to enable it. The Repository by URL import source is enabled
by default on GitLab.com.
- At least the Maintainer role on the destination group to import to.
diff --git a/doc/user/project/index.md b/doc/user/project/index.md
index 67b96efe9a4..b7bdf47ae49 100644
--- a/doc/user/project/index.md
+++ b/doc/user/project/index.md
@@ -12,7 +12,7 @@ You can create a project in many ways in GitLab.
To create a blank project:
-1. On the left sidebar, at the top, select **Create new...** (**{plus}**) and **New project/repository**.
+1. On the left sidebar, at the top, select **Create new** (**{plus}**) and **New project/repository**.
1. Select **Create blank project**.
1. Enter the project details:
- In the **Project name** field, enter the name of your project. The name must start with a lowercase or uppercase letter (`a-zA-Z`), digit (`0-9`), emoji, or underscore (`_`). It can also contain dots (`.`), pluses (`+`), dashes (`-`), or spaces.
@@ -41,7 +41,7 @@ Anyone can [contribute a built-in template](../../development/project_templates.
To create a project from a built-in template:
-1. On the left sidebar, at the top, select **Create new...** (**{plus}**) and **New project/repository**.
+1. On the left sidebar, at the top, select **Create new** (**{plus}**) and **New project/repository**.
1. Select **Create from template**.
1. Select the **Built-in** tab.
1. From the list of templates:
@@ -68,10 +68,10 @@ For this reason, the creation date of imported objects can be older than the cre
Custom project templates are available at:
-- The [instance-level](../../user/admin_area/custom_project_templates.md)
+- The [instance-level](../../administration/custom_project_templates.md)
- The [group-level](../../user/group/custom_project_templates.md)
-1. On the left sidebar, at the top, select **Create new...** (**{plus}**) and **New project/repository**.
+1. On the left sidebar, at the top, select **Create new** (**{plus}**) and **New project/repository**.
1. Select **Create from template**.
1. Select the **Instance** or **Group** tab.
1. From the list of templates:
@@ -96,7 +96,7 @@ HIPAA Audit Protocol published by the U.S Department of Health and Human Service
To create a project from the HIPAA Audit Protocol template:
-1. On the left sidebar, at the top, select **Create new...** (**{plus}**) and **New project/repository**.
+1. On the left sidebar, at the top, select **Create new** (**{plus}**) and **New project/repository**.
1. Select **Create from template**.
1. Select the **Built-in** tab.
1. Locate the **HIPAA Audit Protocol** template:
diff --git a/doc/user/project/insights/index.md b/doc/user/project/insights/index.md
index 5ca6fcebdd6..533824dd58a 100644
--- a/doc/user/project/insights/index.md
+++ b/doc/user/project/insights/index.md
@@ -28,6 +28,13 @@ To view project insights:
1. Select **Analyze > Insights**.
1. To view a report, select the **Select report** dropdown list.
+### Access Insights reports with deep links
+
+You can direct users to a specific report in Insights by using the deep-linked URL.
+
+To create a deep link, append the report key to the end of the Insights report URL.
+For example, a GitLab report with the key `bugsCharts` has the deep link URL `https://gitlab.com/gitlab-org/gitlab/insights/#/bugsCharts`.
+
## Configure project insights
Prerequisites:
diff --git a/doc/user/project/integrations/gitlab_slack_application.md b/doc/user/project/integrations/gitlab_slack_application.md
index 8790c7213e5..bfa8a905699 100644
--- a/doc/user/project/integrations/gitlab_slack_application.md
+++ b/doc/user/project/integrations/gitlab_slack_application.md
@@ -4,95 +4,110 @@ group: Import and Integrate
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
-# GitLab for Slack app **(FREE SAAS)**
+# GitLab for Slack app **(FREE)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/358872) for self-managed instances in GitLab 16.2.
NOTE:
-This feature is only configurable on GitLab.com.
-For self-managed GitLab instances, use
-[Slack slash commands](slack_slash_commands.md) and [Slack notifications](slack.md) instead.
-For more information about our plans to make this feature configurable for all GitLab installations,
-see [epic 1211](https://gitlab.com/groups/gitlab-org/-/epics/1211).
+This page contains information about configuring the GitLab for Slack app on GitLab.com. For administrator documentation, see [GitLab for Slack app administration](../../admin_area/settings/slack_app.md).
+
+The GitLab for Slack app is a native Slack app that provides [slash commands](#slash-commands) and [notifications](#slack-notifications)
+in your Slack workspace. GitLab links your Slack user with your GitLab user so that any command
+you run in Slack is run by your linked GitLab user.
+
+## Install the GitLab for Slack app
-Slack provides a native application that you can enable with your project's
-integrations on GitLab.com.
+Prerequisites:
-## Installation
+- You must have the [appropriate permissions to add apps to your Slack workspace](https://slack.com/help/articles/202035138-Add-apps-to-your-Slack-workspace).
+- On self-managed GitLab, an administrator must [enable the integration](../../admin_area/settings/slack_app.md).
In GitLab 15.0 and later, the GitLab for Slack app uses
[granular permissions](https://medium.com/slack-developer-blog/more-precision-less-restrictions-a3550006f9c3).
Although functionality has not changed, you should [reinstall the app](#update-the-gitlab-for-slack-app).
-### Through the Slack App Directory
+### From project integration settings
-To enable the GitLab for Slack app for your workspace,
-install the [GitLab application](https://slack-platform.slack.com/apps/A676ADMV5-gitlab)
-from the [Slack App Directory](https://slack.com/apps).
+To install the GitLab for Slack app from project integration settings:
-On the [GitLab for Slack app landing page](https://gitlab.com/-/profile/slack/edit),
-you can select a GitLab project to link with your Slack workspace.
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
+1. Select **Settings > Integrations**.
+1. Select **GitLab for Slack app**.
+1. Select **Install GitLab for Slack app**.
+1. On the Slack confirmation page, select **Allow**.
-### Through GitLab project settings
+To update the app in your Slack workspace to the latest version,
+you can also select **Reinstall GitLab for Slack app**.
-Alternatively, you can configure the GitLab for Slack app with your project's
-integration settings.
+### From the Slack App Directory **(FREE SAAS)**
-You must have the appropriate permissions for your Slack
-workspace to be able to install a new application. See
-[Add apps to your Slack workspace](https://slack.com/help/articles/202035138-Add-apps-to-your-Slack-workspace).
+On GitLab.com, you can also install the GitLab for Slack app from the
+[Slack App Directory](https://slack-platform.slack.com/apps/A676ADMV5-gitlab).
-To enable the GitLab integration for your Slack workspace:
+To install the GitLab for Slack app from the Slack App Directory:
-1. Go to your project's **Settings > Integration > GitLab for Slack app** (only
- visible on GitLab.com).
-1. Select **Install GitLab for Slack app**.
-1. Select **Allow** on Slack's confirmation screen.
+1. Go to the [GitLab for Slack page](https://gitlab.com/-/profile/slack/edit).
+1. Select a GitLab project to link with your Slack workspace.
-To update the app in your Slack workspace to the latest version,
-you can also select **Reinstall GitLab for Slack app**.
+## Update the GitLab for Slack app
+
+When GitLab releases new features for the GitLab for Slack app, you might have to manually update your app to use the new features.
+
+To update your GitLab for Slack app:
+
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find a project for
+ which the GitLab for Slack app is configured.
+1. Select **Settings > Integrations**.
+1. Select **GitLab for Slack app**.
+1. Select **Reinstall GitLab for Slack app**.
+
+The GitLab for Slack app is updated for all projects that use the integration.
+
+Alternatively, you can [configure the integration](https://about.gitlab.com/solutions/slack/) again.
## Slash commands
-After installing the GitLab for Slack app, everyone in your Slack workspace can use slash commands.
+You can use slash commands to run common GitLab operations. Replace `<project>` with a project full path.
+
+**For the GitLab for Slack app**:
+
+- You must authorize your Slack user on GitLab.com when you run your first slash command.
+- You can [create a shorter project alias](#create-a-project-alias-for-slash-commands) for slash commands.
+
+**For [Slack slash commands](slack_slash_commands.md) on self-managed GitLab, [Mattermost slash commands](mattermost_slash_commands.md), and [ChatOps](../../../ci/chatops/index.md)**, replace `/gitlab` with the slash command trigger name configured for your integration.
-Replace `<project>` with the project full path, or create a shorter [project alias](#create-a-project-alias-for-slash-commands) for the slash commands.
+The following slash commands are available:
-| Command | Effect |
-| ------- | ------ |
+| Command | Description |
+| ------- | ----------- |
| `/gitlab help` | Shows all available slash commands. |
-| `/gitlab <project> issue new <title> <shift+return> <description>` | Creates a new issue with the title `<title>` and description `<description>`. |
+| `/gitlab <project> issue new <title>` <kbd>Shift</kbd>+<kbd>Enter</kbd> `<description>` | Creates a new issue with the title `<title>` and description `<description>`. |
| `/gitlab <project> issue show <id>` | Shows the issue with the ID `<id>`. |
| `/gitlab <project> issue close <id>` | Closes the issue with the ID `<id>`. |
-| `/gitlab <project> issue search <query>` | Shows up to 5 issues matching `<query>`. |
+| `/gitlab <project> issue search <query>` | Shows up to five issues matching `<query>`. |
| `/gitlab <project> issue move <id> to <project>` | Moves the issue with the ID `<id>` to `<project>`. |
-| `/gitlab <project> issue comment <id> <shift+return> <comment>` | Adds a new comment with the comment body `<comment>` to the issue with the ID `<id>`. |
+| `/gitlab <project> issue comment <id>` <kbd>Shift</kbd>+<kbd>Enter</kbd> `<comment>` | Adds a new comment with the comment body `<comment>` to the issue with the ID `<id>`. |
| `/gitlab <project> deploy <from> to <to>` | [Deploys](#the-deploy-slash-command) from the `<from>` environment to the `<to>` environment. |
| `/gitlab <project> run <job name> <arguments>` | Executes the [ChatOps](../../../ci/chatops/index.md) job `<job name>` on the default branch. |
-| `/gitlab incident declare` | **Beta** Opens modal to [create a new incident](../../../operations/incident_management/slack.md). |
+| `/gitlab incident declare` | Opens a dialog to [create a new incident from Slack](../../../operations/incident_management/slack.md) (Beta). |
-### The deploy slash command
+### The `deploy` slash command
-To deploy to an environment, GitLab tries to find a deployment
-manual action in the pipeline.
+To deploy to an environment, GitLab tries to find a deployment manual action in the pipeline.
-If there's only one action for a given environment, it is triggered.
-If more than one action is defined, GitLab finds an action
-name that matches the environment name to deploy to.
+If only one action is defined for a given environment, it is triggered.
+If more than one action is defined, GitLab tries to find an action name
+that matches the environment name to deploy to.
The command returns an error if no matching action is found.
-### User authorization
-
-When you perform your first slash command, you must
-authorize your Slack user on GitLab.com.
-
### Create a project alias for slash commands
-By default, slash commands expect a project full path. To use a shorter alias
-instead:
+By default, slash commands expect a project full path. To create a shorter project alias in the GitLab for Slack app:
-1. Go to your project's home page.
-1. Go to **Settings > Integrations** (only visible on GitLab.com).
-1. On the **Integrations** page, select **GitLab for Slack app**.
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
+1. Select **Settings > Integrations**.
+1. Select **GitLab for Slack app**.
1. The current **Project Alias**, if any, is displayed. To edit this value,
select **Edit**.
1. Enter your desired alias, and select **Save changes**.
@@ -101,19 +116,19 @@ instead:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/381012) in GitLab 15.9.
-With Slack notifications, GitLab can send messages to Slack workspace channels for certain GitLab [events](#events-for-slack-notifications) (for example, when an issue is created).
+With Slack notifications, GitLab can send messages to Slack workspace channels for certain GitLab [events](#notification-events).
### Configure notifications
To configure Slack notifications:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find a project for
- which the GitLab for Slack app has been [installed](#installation).
+ which the GitLab for Slack app is [installed](#install-the-gitlab-for-slack-app).
1. Select **Settings > Integrations**.
1. Select **GitLab for Slack app**.
1. In the **Trigger** section, select the checkbox for each GitLab
event you want to receive a notification for in Slack. For a full list, see
- [Events for Slack notifications](#events-for-slack-notifications).
+ [Notification events](#notification-events).
1. For each checkbox you select, enter the name of the channel that receives the notifications (for example, `#my-channel`).
- To send notifications to multiple Slack channels, enter up to 10 channel names separated by commas (for example, `#channel-one, #channel-two`).
@@ -136,7 +151,7 @@ To receive notifications to a private Slack channel, you must add the GitLab for
1. Mention the app in the channel by typing `@GitLab` and pressing <kbd>Enter</kbd>.
1. Select **Add to Channel**.
-### Events for Slack notifications
+### Notification events
The following events are available for Slack notifications:
@@ -153,25 +168,17 @@ The following events are available for Slack notifications:
| **Wiki page** | A wiki page is created or updated. |
| **Deployment** | A deployment starts or finishes. |
| **Alert** | A new, unique alert is recorded. |
+| **Group mention in public** | A group is mentioned in a public context. |
+| **Group mention in private** | A group is mentioned in a confidential context. |
| [**Vulnerability**](../../application_security/vulnerabilities/index.md) | A new, unique vulnerability is recorded. |
## Troubleshooting
-### Update the GitLab for Slack app
-
-New releases of the app might require permissions to be authorized before some features work in your Slack workspace. You should ensure the app is up to date in your Slack workspace to enjoy all the latest features.
+### GitLab for Slack app does not appear in the list of integrations
-To update your GitLab for Slack app:
-
-1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find a project for
- which the GitLab for Slack app has been configured.
-1. Select **Settings > Integrations**.
-1. Select **GitLab for Slack app**.
-1. Select **Reinstall GitLab for Slack app**.
-
-The GitLab for Slack app is updated for all projects that use the integration.
+The GitLab for Slack app might not appear in the list of integrations. To have the GitLab for Slack app on your self-managed instance, an administrator must [enable the integration](../../admin_area/settings/slack_app.md). On GitLab.com, the GitLab for Slack app is available by default.
-Alternatively, you can [configure a new Slack integration](https://about.gitlab.com/solutions/slack/).
+The GitLab for Slack app is enabled at the project level only. Support for the app at the group and instance levels is proposed in [issue 391526](https://gitlab.com/gitlab-org/gitlab/-/issues/391526).
### Project or alias not found
@@ -186,7 +193,11 @@ As a workaround, ensure:
- The project full path is correct.
- If using a [project alias](#create-a-project-alias-for-slash-commands), the alias is correct.
-- The GitLab for Slack app integration is [enabled for the project](#through-gitlab-project-settings).
+- The GitLab for Slack app is [enabled for the project](#from-project-integration-settings).
+
+### Slash commands return `/gitlab failed with the error "dispatch_failed"` in Slack
+
+Slash commands might return `/gitlab failed with the error "dispatch_failed"` in Slack. To resolve this issue, ensure an administrator has properly configured the [GitLab for Slack app settings](../../admin_area/settings/slack_app.md) on your self-managed instance.
### Notifications are not received to a channel
diff --git a/doc/user/project/integrations/index.md b/doc/user/project/integrations/index.md
index c70a58a24d2..fd59f54a066 100644
--- a/doc/user/project/integrations/index.md
+++ b/doc/user/project/integrations/index.md
@@ -72,7 +72,6 @@ You can configure the following integrations.
| 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 |
| [Pumble](pumble.md) | Send event notifications to a Pumble channel. | **{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 |
diff --git a/doc/user/project/integrations/mattermost_slash_commands.md b/doc/user/project/integrations/mattermost_slash_commands.md
index a8d8323a651..6a09a1cfbcd 100644
--- a/doc/user/project/integrations/mattermost_slash_commands.md
+++ b/doc/user/project/integrations/mattermost_slash_commands.md
@@ -6,12 +6,14 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Mattermost slash commands **(FREE)**
-You can use slash commands to run common GitLab operations, like creating an issue,
-from a [Mattermost](https://mattermost.com/) chat environment.
+You can use [slash commands](gitlab_slack_application.md#slash-commands) to run common GitLab operations,
+like creating an issue, from a [Mattermost](https://mattermost.com/) chat environment.
GitLab can also send events (such as `issue created`) to Mattermost as part of the
separately configured [Mattermost notifications](mattermost.md).
+For a list of available slash commands, see [Slash commands](gitlab_slack_application.md#slash-commands).
+
## Configuration options
GitLab provides different ways to configure Mattermost slash commands. For any of these options,
@@ -109,7 +111,7 @@ Your slash command can now communicate with your GitLab project.
Prerequisite:
-- To run [slash commands](#available-slash-commands), you must have
+- To run [slash commands](gitlab_slack_application.md#slash-commands), you must have
[permission](../../permissions.md#project-members-permissions) to
perform the action in the GitLab project.
@@ -120,21 +122,10 @@ To interact with GitLab using Mattermost slash commands:
You can see all authorized chat accounts in your Mattermost profile page under **Chat**.
-## Available slash commands
-
-The available slash commands for Mattermost are:
-
-| Command | Description | Example |
-| ------- | ----------- | ------- |
-| `/<trigger> issue new <title>` <kbd>Shift</kbd>+<kbd>Enter</kbd> `<description>` | Create a new issue in the project that `<trigger>` is tied to. `<description>` is optional. | `/gitlab issue new We need to change the homepage` |
-| `/<trigger> issue show <issue-number>` | Show the issue with ID `<issue-number>` from the project that `<trigger>` is tied to. | `/gitlab issue show 42` |
-| `/<trigger> deploy <environment> to <environment>` | Start the CI/CD job that deploys from one environment to another (for example, `staging` to `production`). CI/CD must be [properly configured](../../../ci/yaml/index.md). | `/gitlab deploy staging to production` |
-| `/<trigger> help` | View a list of available slash commands. | `/gitlab help` |
-
## Related topics
-- [Mattermost slash commands](https://developers.mattermost.com/integrate/slash-commands/)
-- [Linux package Mattermost](../../../integration/mattermost/index.md)
+- [Mattermost Linux package](../../../integration/mattermost/index.md)
+- [Slash commands at Mattermost](https://developers.mattermost.com/integrate/slash-commands/)
## Troubleshooting
diff --git a/doc/user/project/integrations/mlflow_client.md b/doc/user/project/integrations/mlflow_client.md
index cffa2649cc8..ce092d10d20 100644
--- a/doc/user/project/integrations/mlflow_client.md
+++ b/doc/user/project/integrations/mlflow_client.md
@@ -1,104 +1,11 @@
---
-stage: Create
-group: Incubation
-info: Machine Learning Experiment Tracking is a GitLab Incubation Engineering program. No technical writer assigned to this group.
+redirect_to: '../ml/experiment_tracking/mlflow_client.md'
+remove_date: '2023-10-12'
---
-# MLflow client integration **(FREE)**
+This document was moved to [another location](../ml/experiment_tracking/mlflow_client.md).
-> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/8560) in GitLab 15.11 as an [Experiment](../../../policy/experiment-beta-support.md#experiment) release [with a flag](../../../administration/feature_flags.md) named `ml_experiment_tracking`. Disabled by default.
-
-NOTE:
-Model experiment tracking is an [experimental feature](../../../policy/experiment-beta-support.md).
-Refer to <https://gitlab.com/gitlab-org/gitlab/-/issues/381660> for feedback and feature requests.
-
-[MLflow](https://mlflow.org/) is a popular open source tool for Machine Learning Experiment Tracking.
-GitLab works as a backend to the MLflow Client, [logging experiments](../ml/experiment_tracking/index.md).
-Setting up your integrations requires minimal changes to existing code.
-
-GitLab plays the role of a MLflow server. Running `mlflow server` is not necessary.
-
-## Enable MLflow client integration
-
-Prerequisites:
-
-- A [personal access token](../../../user/profile/personal_access_tokens.md) for the project, with minimum access level of `api`.
-- The project ID. To find the project ID:
- 1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
- 1. Select **Settings > General**.
-
-To enable MLflow client integration:
-
-1. Set the tracking URI and token environment variables on the host that runs the code.
- This can be your local environment, CI pipeline, or remote host. For example:
-
- ```shell
- export MLFLOW_TRACKING_URI="http://<your gitlab endpoint>/api/v4/projects/<your project id>/ml/mlflow"
- export MLFLOW_TRACKING_TOKEN="<your_access_token>"
- ```
-
-1. If your training code contains the call to `mlflow.set_tracking_uri()`, remove it.
-
-When running the training code, MLflow creates experiments, runs, log parameters, metrics, metadata
-and artifacts on GitLab.
-
-After experiments are logged, they are listed under `/<your project>/-/ml/experiments`.
-Runs are registered as:
-
-- Model Candidates, which can be explored by selecting an experiment.
-- Tags, which are registered as metadata.
-
-## Associating a candidate to a CI/CD job
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/119454) in GitLab 16.1.
-
-If your training code is being run from a CI/CD job, GitLab can use that information to enhance
-candidate metadata. To do so, add the following snippet to your training code within the run
-execution context:
-
-```python
-with mlflow.start_run(run_name=f"Candidate {index}"):
- # Your training code
-
- # Start of snippet to be included
- if os.getenv('GITLAB_CI'):
- mlflow.set_tag('gitlab.CI_JOB_ID', os.getenv('CI_JOB_ID'))
- # End of snippet to be included
-```
-
-## Supported MLflow client methods and caveats
-
-GitLab supports these methods from the MLflow client. Other methods might be supported but were not
-tested. More information can be found in the [MLflow Documentation](https://www.mlflow.org/docs/1.28.0/python_api/mlflow.html).
-
-| Method | Supported | Version Added | Comments |
-|--------------------------|------------------|----------------|----------|
-| `get_experiment` | Yes | 15.11 | |
-| `get_experiment_by_name` | Yes | 15.11 | |
-| `set_experiment` | Yes | 15.11 | |
-| `get_run` | Yes | 15.11 | |
-| `start_run` | Yes | 15.11 | |
-| `log_artifact` | Yes with caveat | 15.11 | (15.11) `artifact_path` must be empty string. Does not support directories.
-| `log_artifacts` | Yes with caveat | 15.11 | (15.11) `artifact_path` must be empty string. Does not support directories.
-| `log_batch` | Yes | 15.11 | |
-| `log_metric` | Yes | 15.11 | |
-| `log_metrics` | Yes | 15.11 | |
-| `log_param` | Yes | 15.11 | |
-| `log_params` | Yes | 15.11 | |
-| `log_figure` | Yes | 15.11 | |
-| `log_image` | Yes | 15.11 | |
-| `log_text` | Yes with caveat | 15.11 | (15.11) Does not support directories.
-| `log_dict` | Yes with caveat | 15.11 | (15.11) Does not support directories.
-| `set_tag` | Yes | 15.11 | |
-| `set_tags` | Yes | 15.11 | |
-| `set_terminated` | Yes | 15.11 | |
-| `end_run` | Yes | 15.11 | |
-| `update_run` | Yes | 15.11 | |
-| `log_model` | Partial | 15.11 | (15.11) Saves the artifacts, but not the model data. `artifact_path` must be empty.
-
-## Limitations
-
-- The API GitLab supports is the one defined at MLflow version 1.28.0.
-- API endpoints not listed above are not supported.
-- During creation of experiments and runs, ExperimentTags are stored, even though they are not displayed.
-- MLflow Model Registry is not supported.
+<!-- This redirect file can be deleted after <2023-10-12>. -->
+<!-- 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/slack.md b/doc/user/project/integrations/slack.md
index 14183a47625..55000a0a992 100644
--- a/doc/user/project/integrations/slack.md
+++ b/doc/user/project/integrations/slack.md
@@ -79,6 +79,8 @@ The following triggers are available for Slack notifications:
| **Wiki page** | A wiki page is created or updated. |
| **Deployment** | A deployment starts or finishes. |
| **Alert** | A new, unique alert is recorded. |
+| **Group mention in public** | A group is mentioned in a public context. |
+| **Group mention in private** | A group is mentioned in a confidential context. |
| [**Vulnerability**](../../application_security/vulnerabilities/index.md) | A new, unique vulnerability is recorded. |
## Troubleshooting
diff --git a/doc/user/project/integrations/slack_slash_commands.md b/doc/user/project/integrations/slack_slash_commands.md
index 74bd12561fb..c1e04f2aa63 100644
--- a/doc/user/project/integrations/slack_slash_commands.md
+++ b/doc/user/project/integrations/slack_slash_commands.md
@@ -10,16 +10,18 @@ NOTE:
This feature is only configurable on self-managed GitLab instances.
For GitLab.com, use the [GitLab for Slack app](gitlab_slack_application.md) instead.
-If you want to control and view GitLab content while you're
-working in Slack, you can use Slack slash commands.
-To use Slack slash commands, you must configure both Slack and GitLab.
+You can use [slash commands](gitlab_slack_application.md#slash-commands) to run common GitLab operations,
+like creating an issue, from a [Slack](https://slack.com/) chat environment.
+To use slash commands in Slack, you must configure both Slack and GitLab.
-GitLab can also send events (for example, `issue created`) to Slack as notifications.
-The [Slack notifications integration](slack.md) is configured separately.
+GitLab can also send events (such as `issue created`) to Slack as part of the
+separately configured [Slack notifications](slack.md).
-## Configure GitLab and Slack
+For a list of available slash commands, see [Slash commands](gitlab_slack_application.md#slash-commands).
-Slack slash command integrations are scoped to a project.
+## Configure the integration
+
+Slack slash commands are scoped to a project. To configure Slack slash commands:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
1. Select **Settings > Integrations**.
@@ -35,7 +37,3 @@ Slack slash command integrations are scoped to a project.
1. On the Slack configuration page, select **Save Integration** and copy the **Token**.
1. Go back to the GitLab configuration page and paste in the **Token**.
1. Ensure the **Active** checkbox is selected and select **Save changes**.
-
-## Slash commands
-
-You can now use the available [Slack slash commands](../../../integration/slash_commands.md).
diff --git a/doc/user/project/integrations/webhook_events.md b/doc/user/project/integrations/webhook_events.md
index dfff537e4a1..8d66f3e48dd 100644
--- a/doc/user/project/integrations/webhook_events.md
+++ b/doc/user/project/integrations/webhook_events.md
@@ -24,6 +24,7 @@ Event type | Trigger
[Subgroup event](#subgroup-events) | A subgroup is created or removed from a group.
[Feature flag event](#feature-flag-events) | A feature flag is turned on or off.
[Release event](#release-events) | A release is created or updated.
+[Emoji event](#emoji-events) | An emoji is awarded or revoked.
NOTE:
If an author has no public email listed in their
@@ -61,6 +62,7 @@ Payload example:
"before": "95790bf891e76fee5e1747ab589903a6a1f80f22",
"after": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
"ref": "refs/heads/master",
+ "ref_protected": true,
"checkout_sha": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
"user_id": 4,
"user_name": "John Smith",
@@ -151,6 +153,7 @@ Payload example:
"before": "0000000000000000000000000000000000000000",
"after": "82b3d5ae55f7080f1e6022629cdb57bfae7cccc7",
"ref": "refs/tags/v1.0.0",
+ "ref_protected": true,
"checkout_sha": "82b3d5ae55f7080f1e6022629cdb57bfae7cccc7",
"user_id": 1,
"user_name": "John Smith",
@@ -1468,13 +1471,8 @@ Payload example:
### Number of retries
-> `retries_count` [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/382046) in GitLab 15.6 [with a flag](../../../administration/feature_flags.md) named `job_webhook_retries_count`. 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
-`job_webhook_retries_count`.
-On GitLab.com, this feature is not available.
+> - `retries_count` [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/382046) in GitLab 15.6 [with a flag](../../../administration/feature_flags.md) named `job_webhook_retries_count`. Disabled by default.
+> - `retries_count` [enabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/382046) in GitLab 16.2.
`retries_count` is an integer that indicates if the job is a retry. `0` means that the job
has not been retried. `1` means that it's the first retry.
@@ -1850,3 +1848,149 @@ Payload example:
}
}
```
+
+## Emoji events
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/123952) in GitLab 16.2 [with a flag](../../../administration/feature_flags.md) named `emoji_webhooks`. Disabled by default.
+
+FLAG:
+On self-managed GitLab, by default this feature is not available. To make it available, an administrator can [enable the feature flag](../../../administration/feature_flags.md) named `emoji_webhooks`.
+On GitLab.com, this feature is not available.
+This feature is not ready for production use.
+
+NOTE:
+To have the `emoji_webhooks` flag enabled on GitLab.com, see [issue 417288](https://gitlab.com/gitlab-org/gitlab/-/issues/417288).
+
+An emoji event is triggered when an emoji is awarded or revoked on:
+
+- Issues
+- Merge requests
+- Project snippets
+- Comments on:
+ - Issues
+ - Merge requests
+ - Project snippets
+ - Commits
+
+The available values for `object_attributes.action` in the payload are:
+
+- `award`
+- `revoke`
+
+Request header:
+
+```plaintext
+X-Gitlab-Event: Emoji Hook
+```
+
+Payload example:
+
+```json
+{
+ "object_kind": "emoji",
+ "event_type": "award",
+ "user": {
+ "id": 1,
+ "name": "Blake Bergstrom",
+ "username": "root",
+ "avatar_url": "http://example.com/uploads/-/system/user/avatar/1/avatar.png",
+ "email": "[REDACTED]"
+ },
+ "project_id": 6,
+ "project": {
+ "id": 6,
+ "name": "Flight",
+ "description": "Velit fugit aperiam illum deleniti odio sequi.",
+ "web_url": "http://example.com/flightjs/Flight",
+ "avatar_url": null,
+ "git_ssh_url": "ssh://git@example.com/flightjs/Flight.git",
+ "git_http_url": "http://example.com/flightjs/Flight.git",
+ "namespace": "Flightjs",
+ "visibility_level": 20,
+ "path_with_namespace": "flightjs/Flight",
+ "default_branch": "master",
+ "ci_config_path": null,
+ "homepage": "http://example.com/flightjs/Flight",
+ "url": "ssh://git@example.com/flightjs/Flight.git",
+ "ssh_url": "ssh://git@example.com/flightjs/Flight.git",
+ "http_url": "http://example.com/flightjs/Flight.git"
+ },
+ "object_attributes": {
+ "user_id": 1,
+ "created_at": "2023-07-04 20:44:11 UTC",
+ "id": 1,
+ "name": "thumbsup",
+ "awardable_type": "Note",
+ "awardable_id": 363,
+ "updated_at": "2023-07-04 20:44:11 UTC",
+ "action": "award",
+ "awarded_on_url": "http://example.com/flightjs/Flight/-/issues/42#note_363"
+ },
+ "note": {
+ "attachment": null,
+ "author_id": 1,
+ "change_position": null,
+ "commit_id": null,
+ "created_at": "2023-07-04 15:09:55 UTC",
+ "discussion_id": "c3d97fd471f210a5dc8b97a409e3bea95ee06c14",
+ "id": 363,
+ "line_code": null,
+ "note": "Testing 123",
+ "noteable_id": 635,
+ "noteable_type": "Issue",
+ "original_position": null,
+ "position": null,
+ "project_id": 6,
+ "resolved_at": null,
+ "resolved_by_id": null,
+ "resolved_by_push": null,
+ "st_diff": null,
+ "system": false,
+ "type": null,
+ "updated_at": "2023-07-04 19:58:46 UTC",
+ "updated_by_id": null,
+ "description": "Testing 123",
+ "url": "http://example.com/flightjs/Flight/-/issues/42#note_363"
+ },
+ "issue": {
+ "author_id": 1,
+ "closed_at": null,
+ "confidential": false,
+ "created_at": "2023-07-04 14:59:43 UTC",
+ "description": "Issue description!",
+ "discussion_locked": null,
+ "due_date": null,
+ "id": 635,
+ "iid": 42,
+ "last_edited_at": null,
+ "last_edited_by_id": null,
+ "milestone_id": null,
+ "moved_to_id": null,
+ "duplicated_to_id": null,
+ "project_id": 6,
+ "relative_position": 18981,
+ "state_id": 1,
+ "time_estimate": 0,
+ "title": "New issue!",
+ "updated_at": "2023-07-04 15:09:55 UTC",
+ "updated_by_id": null,
+ "weight": null,
+ "health_status": null,
+ "url": "http://example.com/flightjs/Flight/-/issues/42",
+ "total_time_spent": 0,
+ "time_change": 0,
+ "human_total_time_spent": null,
+ "human_time_change": null,
+ "human_time_estimate": null,
+ "assignee_ids": [
+ 1
+ ],
+ "assignee_id": 1,
+ "labels": [
+
+ ],
+ "state": "opened",
+ "severity": "unknown"
+ }
+}
+```
diff --git a/doc/user/project/integrations/webhooks.md b/doc/user/project/integrations/webhooks.md
index 5c8fc5703dd..9f24f3b49ff 100644
--- a/doc/user/project/integrations/webhooks.md
+++ b/doc/user/project/integrations/webhooks.md
@@ -126,7 +126,7 @@ Endpoints should follow these best practices:
> - [Disabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/390157) in GitLab 15.10 [with a flag](../../../administration/feature_flags.md) named `auto_disabling_web_hooks`.
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 `auto_disabling_web_hooks`.
+On self-managed GitLab, by default this feature is not available. To make it available, an administrator can [enable the feature flag](../../../administration/feature_flags.md) named `auto_disabling_web_hooks`.
On GitLab.com, this feature is available.
Project or group webhooks that fail four consecutive times are automatically disabled.
@@ -279,6 +279,7 @@ For more information about supported events for webhooks, see [webhook events](w
> - `X-Gitlab-Event-UUID` header [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/329743) in GitLab 14.8.
> - `X-Gitlab-Instance` header [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31333) in GitLab 15.5.
+> - `X-Gitlab-Webhook-UUID` header [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/230830) in GitLab 16.2.
Webhook requests to your endpoint include the following headers:
@@ -286,6 +287,7 @@ Webhook requests to your endpoint include the following headers:
| ------ | ------ | ------ |
| `User-Agent` | In the format `"Gitlab/<VERSION>"`. | `"GitLab/15.5.0-pre"` |
| `X-Gitlab-Instance` | Hostname of the GitLab instance that sent the webhook. | `"https://gitlab.com"` |
+| `X-Gitlab-Webhook-UUID` | Unique ID per webhook. If a webhook request fails and retries, the second request has a new ID. | `"02affd2d-2cba-4033-917d-ec22d5dc4b38"` |
| `X-Gitlab-Event` | Name of the webhook type. Corresponds to [event types](webhook_events.md) but in the format `"<EVENT> Hook"`. | `"Push Hook"` |
| `X-Gitlab-Event-UUID` | Unique ID per webhook that is not recursive. A hook is recursive if triggered by an earlier webhook that hit the GitLab instance. Recursive webhooks have the same value for this header. | `"13792a34-cac6-4fda-95a8-c58e00a3954e"` |
diff --git a/doc/user/project/issue_board.md b/doc/user/project/issue_board.md
index f5d0382ccd8..bca1ee5245c 100644
--- a/doc/user/project/issue_board.md
+++ b/doc/user/project/issue_board.md
@@ -422,7 +422,7 @@ Prerequisites:
To set a WIP limit for a list, in an issue board:
-1. On the top of the list you want to edit, select **List actions** (**{ellipsis_v}**) **> Edit list settings**.
+1. On the top of the list you want to edit, select **Edit list settings** (**{settings}**).
The list settings sidebar opens on the right.
1. Next to **Work in progress limit**, select **Edit**.
1. Enter the maximum number of issues.
@@ -499,10 +499,10 @@ Prerequisites:
To remove a list from an issue board:
-1. On the top of the list you want to remove, select **List actions** (**{ellipsis_v}**).
+1. On the top of the list you want to remove, select **Edit list settings** (**{settings}**).
The list settings sidebar opens on the right.
-1. Select **Remove list**. A confirmation dialog appears.
-1. Select **Remove list** again.
+1. Select **Remove list**.
+1. On the confirmation dialog, select **Remove list** again.
### Add issues to a list
diff --git a/doc/user/project/issues/confidential_issues.md b/doc/user/project/issues/confidential_issues.md
index 7e5f26d3526..6c2e6cb2132 100644
--- a/doc/user/project/issues/confidential_issues.md
+++ b/doc/user/project/issues/confidential_issues.md
@@ -26,7 +26,7 @@ When you create a confidential issue in a project, the project becomes listed in
To create a confidential issue:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
-1. On the left sidebar, at the top, select **Create new...** (**{plus}**).
+1. On the left sidebar, at the top, select **Create new** (**{plus}**).
1. From the dropdown list, select **New issue**.
1. Complete the [fields](create_issues.md#fields-in-the-new-issue-form).
- Select the **This issue is confidential...** checkbox.
diff --git a/doc/user/project/issues/create_issues.md b/doc/user/project/issues/create_issues.md
index 3e7cfc12da7..8cc9ab71ca7 100644
--- a/doc/user/project/issues/create_issues.md
+++ b/doc/user/project/issues/create_issues.md
@@ -99,16 +99,16 @@ Prerequisites:
To create an issue from a project issue board:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
-1. Select **Issues > Boards**.
-1. At the top of a board list, select **List actions** (**{ellipsis_v}**) **> Create new issue**.
+1. Select **Plan > Issue boards**.
+1. At the top of a board list, select **Create new issue** (**{plus-square}**).
1. Enter the issue's title.
1. Select **Create issue**.
To create an issue from a group issue board:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your group.
-1. Select **Issues > Boards**.
-1. At the top of a board list, select **List actions** (**{ellipsis_v}**) **> Create new issue**.
+1. Select **Plan > Issue boards**.
+1. At the top of a board list, select **Create new issue** (**{plus-square}**).
1. Enter the issue's title.
1. Under **Projects**, select the project in the group that the issue should belong to.
1. Select **Create issue**.
diff --git a/doc/user/project/issues/design_management.md b/doc/user/project/issues/design_management.md
index 9c04a40cb32..6013abc4892 100644
--- a/doc/user/project/issues/design_management.md
+++ b/doc/user/project/issues/design_management.md
@@ -202,12 +202,12 @@ Archived designs are not permanently lost. You can browse
## Markdown and rich text editors for descriptions
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/388449) in GitLab 16.1 [with a flag](../../../administration/feature_flags.md) named `content_editor_on_issues`. Disabled by default.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/388449) in GitLab 16.1 [with a flag](../../../administration/feature_flags.md) named `content_editor_on_issues`. Disabled by default.
+> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/375172) in GitLab 16.2.
FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available per project or for your entire instance, ask an administrator to [enable the feature flag](../../../administration/feature_flags.md) named `content_editor_on_issues`.
-On GitLab.com, this feature is not available.
-This feature is not ready for production use.
+On self-managed GitLab, by default the rich text editor is available. To hide it, an administrator can [disable the feature flag](../../../administration/feature_flags.md) named `content_editor_on_issues`.
+On GitLab.com, this feature is available.
When this feature is enabled, you can use the Markdown and rich text editor in design descriptions.
It's the same editor you use for comments across GitLab.
@@ -251,7 +251,7 @@ Prerequisites:
To delete a comment from a design:
1. On the comment you want to delete, select **More actions** **{ellipsis_v}** **> Delete comment**.
-1. On the confirmation dialog box, select **Delete comment**.
+1. On the confirmation dialog, select **Delete comment**.
## Resolve a discussion thread on a design
diff --git a/doc/user/project/issues/index.md b/doc/user/project/issues/index.md
index a43dd65ed74..b2cc555d3b7 100644
--- a/doc/user/project/issues/index.md
+++ b/doc/user/project/issues/index.md
@@ -16,7 +16,7 @@ You can use issues for many purposes, customized to your needs and workflow.
- Accept feature proposals, questions, support requests, or bug reports.
- Elaborate on code implementations.
-For more information about using issues, see the GitLab blog post:
+For more information about issues, see the GitLab blog post:
[Always start a discussion with an issue](https://about.gitlab.com/blog/2016/03/03/start-with-an-issue/).
Issues are always associated with a specific project. If you have multiple
diff --git a/doc/user/project/issues/managing_issues.md b/doc/user/project/issues/managing_issues.md
index 6f1c14b2b80..6bf8e2eeb97 100644
--- a/doc/user/project/issues/managing_issues.md
+++ b/doc/user/project/issues/managing_issues.md
@@ -155,7 +155,7 @@ Prerequisites:
To do it:
-1. Optional (but recommended). [Create a backup](../../../raketasks/backup_restore.md) before
+1. Optional (but recommended). [Create a backup](../../../administration/backup_restore/index.md) before
attempting any changes in the console.
1. Open the [Rails console](../../../administration/operations/rails_console.md).
1. Run the following script. Make sure to change `project`, `admin_user`, and `target_project` to
@@ -215,9 +215,8 @@ To close an issue, you can either:
1. Select **Plan > Issues**, then select your issue to view it.
1. At the top of the issue, select **Close issue**.
-<!-- Delete when the `moved_mr_sidebar` feature flag is removed -->
If you don't see this action at the top of an issue, your project or instance might have
-enabled a feature flag for [moved actions](../merge_requests/index.md#move-sidebar-actions).
+enabled a feature flag to [moved it in the actions menu](#move-the-close-button-into-the-actions-menu).
### Reopen a closed issue
@@ -228,6 +227,9 @@ Prerequisites:
To reopen a closed issue, at the top of the issue, select **Reopen issue**.
A reopened issue is no different from any other open issue.
+If you don't see this action at the top of an issue, your project or instance might have
+enabled a feature flag to [moved it in the actions menu](#move-the-close-button-into-the-actions-menu).
+
### Closing issues automatically
You can close issues automatically by using certain words, called a _closing pattern_,
@@ -328,6 +330,24 @@ Prerequisites:
Learn how to change the default [issue closing pattern](../../../administration/issue_closing_pattern.md).
of your installation.
+<!-- Delete when the `move_close_into_dropdown` feature flag is removed
+and update steps for closing and reopening issues, incidents, and epics -->
+### Move the close button into the actions menu
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/125173) in GitLab 16.2 [with a flag](../../../administration/feature_flags.md) named `move_close_into_dropdown`. Disabled by default.
+
+FLAG:
+On self-managed GitLab, by default this feature is not available. To make it available, an administrator can [enable the feature flag](../../../administration/feature_flags.md) named `move_close_into_dropdown`.
+On GitLab.com, this feature is not available.
+
+When this feature flag is enabled, in the upper-right corner,
+**Issue actions** (**{ellipsis_v}**) contains the **Close issue** and **Reopen issue** actions.
+
+In GitLab 16.2 and later, similar action menus are also available on incidents and epics.
+
+When this feature flag is disabled, **Close issue** and **Reopen issue** are
+on the top bar, outside of the actions menu.
+
## Change the issue type
Prerequisites:
@@ -445,9 +465,6 @@ To filter the list of issues:
1. Repeat this process to filter by multiple attributes. Multiple attributes are joined by a logical
`AND`.
-GitLab displays the results on-screen, but you can also
-[retrieve them as an RSS feed](../../search/index.md#retrieve-search-results-as-feed).
-
### Filter with the OR operator
> - OR filtering for author and assignee was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/23532) in GitLab 15.6 [with a flag](../../../administration/feature_flags.md) named `or_issuable_queries`. Disabled by default.
@@ -456,7 +473,7 @@ GitLab displays the results on-screen, but you can also
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 `or_issuable_queries`.
+To hide the feature, an administrator can [disable the feature flag](../../../administration/feature_flags.md) named `or_issuable_queries`.
On GitLab.com, this feature is available.
When this feature is enabled, you can use the OR operator (**is one of: `||`**)
diff --git a/doc/user/project/issues/sorting_issue_lists.md b/doc/user/project/issues/sorting_issue_lists.md
index 829e44eae9a..4c0566c2386 100644
--- a/doc/user/project/issues/sorting_issue_lists.md
+++ b/doc/user/project/issues/sorting_issue_lists.md
@@ -76,6 +76,10 @@ When you sort by **Popularity**, the issue order changes to sort descending by t
number of upvotes ([emoji reactions](../../award_emojis.md) with the "thumbs up")
on each issue. You can use this to identify issues that are in high demand.
+The total number of votes is not summed up. An issue with 18 upvotes and 5
+downvotes is considered more popular than an issue with 17 upvotes and no
+downvotes.
+
## Sorting by priority
When you sort by **Priority**, the issue order changes to sort in this order:
diff --git a/doc/user/project/members/index.md b/doc/user/project/members/index.md
index 7a1d9d6e6e3..37b24cda5aa 100644
--- a/doc/user/project/members/index.md
+++ b/doc/user/project/members/index.md
@@ -69,7 +69,7 @@ If a user is:
### Membership and visibility rights
-Depending on their membership type, members of groups or projects are granted different visibility levels
+Depending on their membership type, members of groups or projects are granted different [visibility levels](../../../user/public_access.md)
and rights into the group or project.
| Action | Direct group member | Inherited group member | Direct shared group member | Inherited shared group member |
@@ -80,7 +80,7 @@ and rights into the group or project.
| View milestones of groups higher in the hierarchy | ✓ | ✓ | ✓ | ✓ |
| Be shared into other groups | ✓ | | | |
| Be shared into other projects | ✓ | ✓ | | |
-| Share the group with other members | ✓ | | | |
+| Share the group with other members | ✓ | ✓ | ✓ | ✓ |
In the following example, `User` is a:
@@ -235,7 +235,7 @@ To remove a member from a project:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
1. Select **Manage > Members**.
1. Next to the project member you want to remove, select **Remove member**.
-1. Optional. In the confirmation box, select the
+1. Optional. On the confirmation dialog, select the
**Also unassign this user from related issues and merge requests** checkbox.
1. To prevent leaks of sensitive information from private projects, verify the
member has not forked the private repository or created webhooks. Existing forks continue to receive
diff --git a/doc/user/project/members/share_project_with_groups.md b/doc/user/project/members/share_project_with_groups.md
index aadc27fb2d3..15c5935648f 100644
--- a/doc/user/project/members/share_project_with_groups.md
+++ b/doc/user/project/members/share_project_with_groups.md
@@ -76,6 +76,7 @@ In addition:
- On the group's page, the project is listed on the **Shared projects** tab.
- On the project's **Members** page, the group is listed on the **Groups** tab.
- Each user is assigned a maximum role.
+- Members who have the **Project Invite** badge next to their profile on the usage quota page count towards the billable members of the shared project's top-level group.
## Maximum role
diff --git a/doc/user/project/merge_requests/allow_collaboration.md b/doc/user/project/merge_requests/allow_collaboration.md
index d5851050fd4..4cc8f50dd70 100644
--- a/doc/user/project/merge_requests/allow_collaboration.md
+++ b/doc/user/project/merge_requests/allow_collaboration.md
@@ -109,5 +109,5 @@ To see the pipeline status from the merge request page of a forked project
going back to the original project:
1. Create a group containing all the upstream members.
-1. Go to the **Project information > Members** page in the forked project and invite the newly-created
+1. Go to the **Manage > Members** page in the forked project and invite the newly-created
group to the forked project.
diff --git a/doc/user/project/merge_requests/approvals/index.md b/doc/user/project/merge_requests/approvals/index.md
index 68d5665139a..0dcf5f37d65 100644
--- a/doc/user/project/merge_requests/approvals/index.md
+++ b/doc/user/project/merge_requests/approvals/index.md
@@ -109,23 +109,22 @@ Without the approvals, the work cannot merge. Required approvals enable multiple
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/334698) in GitLab 15.1.
> - [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/389905) in GitLab 15.11 [with a flag](../../../../administration/feature_flags.md) named `invalid_scan_result_policy_prevents_merge`. Disabled by default.
-> - [Enabled by default on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/405023) in GitLab 16.1.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/405023) in GitLab 16.2. Feature flag `invalid_scan_result_policy_prevents_merge` removed.
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 `invalid_scan_result_policy_prevents_merge`.
+an administrator can [disable the feature flag](../../../../administration/feature_flags.md) named `invalid_scan_result_policy_prevents_merge`.
-Whenever an approval rule cannot be satisfied, the rule is displayed as **(!) Auto approved**. This applies to the following conditions:
+Whenever an approval rule cannot be satisfied, the rule is displayed as **Auto approved**. This applies to the following conditions:
- The only eligible approver is the author of the merge request.
- No eligible approvers (either groups or users) have been assigned to the approval rule.
- The number of required approvals is more than the number of eligible approvers.
-These rules are automatically approved to unblock their respective merge requests,
-unless they were created through a security policy.
-
-Invalid approval rules created through a security policy are presented with **(!) Action Required**
-and are not automatically approved, blocking their respective merge requests.
+These rules are automatically approved to unblock their respective merge requests, unless they were
+created through a [scan result policy](../../../application_security/policies/scan-result-policies.md).
+Invalid approval rules created through a scan result policy are presented with
+**Action required** and are not automatically approved, blocking their respective merge requests.
## Related topics
diff --git a/doc/user/project/merge_requests/approvals/rules.md b/doc/user/project/merge_requests/approvals/rules.md
index bc5d4353ffc..169c7a09875 100644
--- a/doc/user/project/merge_requests/approvals/rules.md
+++ b/doc/user/project/merge_requests/approvals/rules.md
@@ -42,7 +42,7 @@ To add a merge request approval rule:
- To apply the rule to a specific branch, select it from the list.
1. Set the number of required approvals in **Approvals required**. A value of `0` makes
[the rule optional](#configure-optional-approval-rules), and any number greater than `0`
- creates a required rule.
+ creates a required rule. Maximum number of required approvals is `100`.
1. To add users or groups as approvers, search for users or groups that are
[eligible to approve](#eligible-approvers), and select **Add**. GitLab suggests approvers based on
previous authors of the files changed by the merge request.
@@ -261,7 +261,12 @@ For more information, see [Coverage check approval rule](../../../../ci/testing/
## Security Approvals **(ULTIMATE)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/357021) in GitLab 15.0.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/357021) in GitLab 15.0.
+> - Bot comment for approvals [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/411656) in GitLab 16.2 [with a flag](../../../../administration/feature_flags.md) named `security_policy_approval_notification`. Enabled by default.
+
+FLAG:
+On self-managed GitLab, by default the bot comment for approvals is available. To hide the feature, an administrator can [disable the feature flag](../../../../administration/feature_flags.md) named `security_policy_approval_notification`.
+On GitLab.com, the bot comment for approvals is available.
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.
@@ -269,6 +274,8 @@ Details for each security policy is shown in the Security Approvals section of y
The security approval rules are applied to all merge requests until the pipeline is complete. The application of the
security approval rules prevents users from merging in code before the security scans run. After the pipeline is
complete, the security approval rules are checked to determine if the security approvals are still required.
+In case the scanners in the pipeline identify an issue and security approvals are required, a bot comment is generated
+on the merge request to indicate which steps are needed to proceed.
![Security Approvals](img/security_approvals_v15_0.png)
diff --git a/doc/user/project/merge_requests/approvals/settings.md b/doc/user/project/merge_requests/approvals/settings.md
index 6c079dc9319..eed8cbcd94d 100644
--- a/doc/user/project/merge_requests/approvals/settings.md
+++ b/doc/user/project/merge_requests/approvals/settings.md
@@ -112,7 +112,7 @@ permission enables an electronic signature for approvals, such as the one define
[Code of Federal Regulations (CFR) Part 11](https://www.accessdata.fda.gov/scripts/cdrh/cfdocs/cfcfr/CFRSearch.cfm?CFRPart=11&showFR=1&subpartNode=21:1.0.1.1.8.3)):
1. Enable password authentication for the web interface, as described in the
- [sign-in restrictions documentation](../../../admin_area/settings/sign_in_restrictions.md#password-authentication-enabled).
+ [sign-in restrictions documentation](../../../../administration/settings/sign_in_restrictions.md#password-authentication-enabled).
1. On the left sidebar, select **Settings > Merge requests**.
1. In the **Merge request approvals** section, scroll to **Approval settings** and
select **Require user password to approve**.
diff --git a/doc/user/project/merge_requests/changes.md b/doc/user/project/merge_requests/changes.md
index 94f506ba556..79599580f3e 100644
--- a/doc/user/project/merge_requests/changes.md
+++ b/doc/user/project/merge_requests/changes.md
@@ -51,7 +51,7 @@ clear your browser's cookies or change this behavior again.
To view one file at a time for all of your merge requests:
-1. In the upper-right corner, select your avatar.
+1. On the left sidebar, select your avatar.
1. Select **Preferences**.
1. Scroll to the **Behavior** section and select the **Show one file at a time on merge request's Changes tab** checkbox.
1. Select **Save changes**.
@@ -146,11 +146,8 @@ per conflicted file on the merge request diff:
## Add a comment to a merge request file
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/121429) in GitLab 16.1 [with a flag](../../../administration/feature_flags.md) named `comment_on_files`. 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 `comment_on_files`.
-On GitLab.com, this feature is not available.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/123515) in GitLab 16.1 [with a flag](../../../administration/feature_flags.md) named `comment_on_files`. Enabled by default.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/125130) in GitLab 16.2.
You can add comments to a merge request diff file. These comments persist across
rebases and file changes.
diff --git a/doc/user/project/merge_requests/drafts.md b/doc/user/project/merge_requests/drafts.md
index 6f309d2db24..ff5421d5785 100644
--- a/doc/user/project/merge_requests/drafts.md
+++ b/doc/user/project/merge_requests/drafts.md
@@ -59,7 +59,7 @@ when you mark a merge request as ready, notifications are triggered to
When viewing or searching in your project's merge requests list, you can include or exclude
draft merge requests:
-1. Go to your project and select **Merge requests**.
+1. Go to your project and select **Code > Merge requests**.
1. In the navigation bar, select **Open**, **Merged**, **Closed**, or **All** to
filter by merge request status.
1. Select the search box to display a list of filters and select **Draft**, or
diff --git a/doc/user/project/merge_requests/index.md b/doc/user/project/merge_requests/index.md
index 38125f623eb..dfa62628e46 100644
--- a/doc/user/project/merge_requests/index.md
+++ b/doc/user/project/merge_requests/index.md
@@ -77,7 +77,7 @@ or:
or:
-1. On the left sidebar, at the top, select **Merge requests** (**{merge-request}**).
+1. On the left sidebar, select **Code > Merge requests** (**{merge-request}**).
1. From the dropdown list, select **Assigned**.
## Filter the list of merge requests
@@ -111,9 +111,6 @@ To filter the list of merge requests:
1. Select a **Sort direction**, either **{sort-lowest}** for descending order,
or **{sort-highest}** for ascending order.
-GitLab displays the results on-screen, but you can also
-[retrieve them as an RSS feed](../../search/index.md#retrieve-search-results-as-feed).
-
### By environment or deployment date
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/44041) in GitLab 13.6.
@@ -263,13 +260,9 @@ after merging does not retarget open merge requests. This improvement is
<!-- When the `moved_mr_sidebar` feature flag is removed, delete this topic and update the steps for these actions
like in https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87727/diffs?diff_id=522279685#5d9afba799c4af9920dab533571d7abb8b9e9163 -->
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85584) in GitLab 14.10 [with a flag](../../../administration/feature_flags.md) named `moved_mr_sidebar`. Disabled by default.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85584) in GitLab 14.10 [with a flag](../../../administration/feature_flags.md) named `moved_mr_sidebar`. Enabled by default.
> - [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/373757) to also move actions on issues, incidents, and epics in GitLab 16.0.
-FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available per project or for your entire instance, ask an administrator to [enable the feature flag](../../../administration/feature_flags.md) named `moved_mr_sidebar`.
-On GitLab.com, this feature is enabled in the following projects: `gitlab-org/gitlab`, `gitlab-com/www-gitlab-com`, and `gitlab-org/customers-gitlab-com`.
-
When this feature flag is enabled, in the upper-right corner,
**Merge request actions** (**{ellipsis_v}**) contains the following actions:
@@ -317,7 +310,7 @@ For a web developer writing a webpage for your company's website:
FLAG:
On self-managed GitLab, by default this feature is not available.
-To make it available per user, ask an administrator to [enable the feature flag](../../../administration/feature_flags.md) named `mr_activity_filters` for individual or groups of users.
+To make it available per user, an administrator can [enable the feature flag](../../../administration/feature_flags.md) named `mr_activity_filters` for individual or groups of users.
On GitLab.com, this feature is enabled for GitLab team members only.
To understand the history of a merge request, filter its activity feed to show you
diff --git a/doc/user/project/merge_requests/reviews/img/suggest_changes_v16_2.png b/doc/user/project/merge_requests/reviews/img/suggest_changes_v16_2.png
new file mode 100644
index 00000000000..3465085c311
--- /dev/null
+++ b/doc/user/project/merge_requests/reviews/img/suggest_changes_v16_2.png
Binary files differ
diff --git a/doc/user/project/merge_requests/reviews/index.md b/doc/user/project/merge_requests/reviews/index.md
index 86468af06a2..54ebfd9eecb 100644
--- a/doc/user/project/merge_requests/reviews/index.md
+++ b/doc/user/project/merge_requests/reviews/index.md
@@ -218,7 +218,7 @@ When bulk-editing merge requests in a project, you can edit the following attrib
To update multiple project merge requests at the same time:
-1. In a project, go to **Merge requests**.
+1. In a project, go to **Code > Merge requests**.
1. Select **Bulk edit**. A sidebar on the right-hand side of your screen appears with
editable fields.
1. Select the checkboxes next to each merge request you want to edit.
@@ -236,7 +236,7 @@ When bulk editing merge requests in a group, you can edit the following attribut
To update multiple group merge requests at the same time:
-1. In a group, go to **Merge requests**.
+1. In a group, go to **Code > Merge requests**.
1. Select **Bulk edit**. A sidebar on the right-hand side of your screen appears with
editable fields.
1. Select the checkboxes next to each merge request you want to edit.
diff --git a/doc/user/project/merge_requests/reviews/suggestions.md b/doc/user/project/merge_requests/reviews/suggestions.md
index 24197c5c313..f949dba85dd 100644
--- a/doc/user/project/merge_requests/reviews/suggestions.md
+++ b/doc/user/project/merge_requests/reviews/suggestions.md
@@ -7,9 +7,6 @@ type: index, reference
# Suggest changes **(FREE)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/25381) custom commit messages for suggestions in GitLab 13.9 [with a flag](../../../../administration/feature_flags.md) named `suggestions_custom_commit`. Disabled by default.
-> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/297404) in GitLab 13.10. Feature flag `suggestions_custom_commit` removed.
-
Reviewers can suggest code changes with a Markdown syntax in merge request diff threads.
The merge request author (or other users with the appropriate role) can apply any or
all of the suggestions from the GitLab UI. Applying suggestions adds a commit to the
@@ -43,8 +40,6 @@ merge request, authored by the user who suggested the changes.
### Multi-line suggestions
-> [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/232339) in GitLab 13.11: suggestions in multi-line comments also become multi-line.
-
When you review a merge request diff, you can propose changes to multiple lines (up to 200)
in a single suggestion, by either:
@@ -72,6 +67,23 @@ Suggestions for multiple lines are limited to 100 lines _above_ and 100
lines _below_ the commented diff line. This allows for up to 200 changed lines per
suggestion.
+#### Using the rich text editor
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/388449) in GitLab 16.1 [with a flag](../../../../administration/feature_flags.md) named `content_editor_on_issues`. Disabled by default.
+> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/375172) in GitLab 16.2.
+
+FLAG:
+On self-managed GitLab, by default this feature is available. To hide the feature, an administrator can [disable the feature flag](../../../../administration/feature_flags.md) named `content_editor_on_issues`.
+On GitLab.com, this feature is available.
+
+When you insert suggestions, you can use the WYSIWYG
+[rich text editor](https://about.gitlab.com/direction/plan/knowledge/content_editor/) to move
+up and down the source file's line numbers in the UI.
+
+To add or subtract changed lines, next to **From line**, select **+** or **-**.
+
+![Multi-line suggestion preview](img/suggest_changes_v16_2.png)
+
## Apply suggestions
Prerequisites:
@@ -155,10 +167,7 @@ For example, to customize the commit message to output
## Batch suggestions
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/25486) in GitLab 13.1 as an [Experiment](../../../../policy/experiment-beta-support.md#experiment) with a flag named `batch_suggestions`, disabled by default.
-> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/227799) in GitLab 13.2.
-> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/320755) in GitLab 13.11. [Feature flag `batch_suggestions`](https://gitlab.com/gitlab-org/gitlab/-/issues/320755) removed.
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/326168) custom commit messages for batch suggestions in GitLab 14.4.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/326168) custom commit messages for batch suggestions in GitLab 14.4.
To reduce the number of commits added to your branch, you can apply multiple
suggestions in a single commit.
diff --git a/doc/user/project/milestones/burndown_and_burnup_charts.md b/doc/user/project/milestones/burndown_and_burnup_charts.md
index c7ed6069cb6..59b11e78622 100644
--- a/doc/user/project/milestones/burndown_and_burnup_charts.md
+++ b/doc/user/project/milestones/burndown_and_burnup_charts.md
@@ -32,12 +32,14 @@ For an overview, check the video demonstration on [Mapping work versus time with
To view a project's burndown chart:
-1. In a project, navigate to **Issues > Milestones**.
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
+1. Select **Plan > Milestones**.
1. Select a milestone from the list.
To view a group's burndown chart:
-1. In a group, navigate to **Issues > Milestones**.
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your group.
+1. Select **Plan > Milestones**.
1. Select a milestone from the list.
### Use cases for burndown charts
@@ -110,12 +112,14 @@ Burnup charts show the assigned and completed work for a milestone.
To view a project's burnup chart:
-1. In a project, navigate to **Issues > Milestones**.
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
+1. Select **Plan > Milestones**.
1. Select a milestone from the list.
To view a group's burnup chart:
-1. In a group, navigate to **Issues > Milestones**.
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your group.
+1. Select **Plan > Milestones**.
1. Select a milestone from the list.
### How burnup charts work
diff --git a/doc/user/project/ml/experiment_tracking/img/candidate_detail_ci_v16_12.png b/doc/user/project/ml/experiment_tracking/img/candidate_detail_ci_v16_12.png
new file mode 100644
index 00000000000..fb4f8d5dc66
--- /dev/null
+++ b/doc/user/project/ml/experiment_tracking/img/candidate_detail_ci_v16_12.png
Binary files differ
diff --git a/doc/user/project/ml/experiment_tracking/index.md b/doc/user/project/ml/experiment_tracking/index.md
index 81c4bc20301..4e9e736f067 100644
--- a/doc/user/project/ml/experiment_tracking/index.md
+++ b/doc/user/project/ml/experiment_tracking/index.md
@@ -6,14 +6,18 @@ info: Machine Learning Experiment Tracking is a GitLab Incubation Engineering pr
# Machine learning model experiments **(FREE)**
-FLAG:
-On self-managed GitLab, model experiment tracking is disabled by default.
-To enable the feature, ask an administrator to [enable the feature flag](../../../../administration/feature_flags.md) named `ml_experiment_tracking`.
-On GitLab.com, this feature is in private testing only.
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/9341) in GitLab 15.11 as an [Experiment](../../../../policy/experiment-beta-support.md#experiment) release [with a flag](../../../../administration/feature_flags.md) named `ml_experiment_tracking`. Disabled by default. To enable the feature, an administrator can [enable the feature flag](../../../../administration/feature_flags.md) named `ml_experiment_tracking`.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/95373) in GitLab 16.2.
NOTE:
Model experiment tracking is an [experimental feature](../../../../policy/experiment-beta-support.md). Refer to <https://gitlab.com/gitlab-org/gitlab/-/issues/381660> for feedback and feature requests.
+ACCESS LEVEL:
+Model experiments [visibility level](../../../public_access.md) can be set to public, private or disabled. This options can
+be configured under `Settings > General > Visibility, project features, permissions > Model experiments`. Users must have
+at least [Reporter role](../../../permissions.md#roles) to modify or delete experiments
+and candidate data.
+
When creating machine learning models, data scientists often experiment with different parameters, configurations, and feature
engineering to improve the performance of the model. Keeping track of all this metadata and the associated
artifacts so that the data scientist can later replicate the experiment is not trivial. Machine learning experiment
@@ -58,16 +62,12 @@ Some example parameters:
## Track new experiments and candidates
Experiment and trials can only be tracked through the
-[MLflow](https://www.mlflow.org/docs/latest/tracking.html) client integration.
-See [MLflow client integration](../../integrations/mlflow_client.md) for more information
+[MLflow](https://www.mlflow.org/docs/latest/tracking.html) client compatibility.
+See [MLflow client compatibility](mlflow_client.md) for more information
on how to use GitLab as a backend for the MLflow Client.
## Explore model candidates
-Prerequisites:
-
-- You must have at least the Developer role to view experiment data.
-
To list the current active experiments, either go to `https/-/ml/experiments` or:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
@@ -82,6 +82,14 @@ limitations. After an artifact is logged for a candidate, all artifacts logged f
package registry. The package name for a candidate is `ml_experiment_<experiment_id>`, where the version is the candidate
IID. The link to the artifacts can also be accessed from the **Experiment Candidates** list or **Candidate detail**.
+## View CI information
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/119788) in 16.1
+
+Candidates can be associated to the CI job that created them, allowing quick links to the merge request, pipeline, and user that triggered the pipeline:
+
+![CI information in candidate detail](img/candidate_detail_ci_v16_12.png)
+
## Related topics
- Development details in [epic 8560](https://gitlab.com/groups/gitlab-org/-/epics/8560).
diff --git a/doc/user/project/ml/experiment_tracking/mlflow_client.md b/doc/user/project/ml/experiment_tracking/mlflow_client.md
new file mode 100644
index 00000000000..7fd5c7cca92
--- /dev/null
+++ b/doc/user/project/ml/experiment_tracking/mlflow_client.md
@@ -0,0 +1,109 @@
+---
+stage: Create
+group: Incubation
+info: Machine Learning Experiment Tracking is a GitLab Incubation Engineering program. No technical writer assigned to this group.
+---
+
+# MLflow client compatibility **(FREE)**
+
+> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/8560) in GitLab 15.11 as an [Experiment](../../../../policy/experiment-beta-support.md#experiment) release [with a flag](../../../../administration/feature_flags.md) named `ml_experiment_tracking`. Disabled by default.
+
+NOTE:
+Model experiment tracking is an [experimental feature](../../../../policy/experiment-beta-support.md).
+Refer to <https://gitlab.com/gitlab-org/gitlab/-/issues/381660> for feedback and feature requests.
+
+[MLflow](https://mlflow.org/) is a popular open source tool for Machine Learning Experiment Tracking.
+GitLab [Model experiment tracking](index.md) is compatible with MLflow Client,
+[logging experiments](index.md). The setup requires minimal changes to existing code.
+
+GitLab plays the role of a MLflow server. Running `mlflow server` is not necessary.
+
+## Enable MLflow client integration
+
+Prerequisites:
+
+- A [personal](../../../../user/profile/personal_access_tokens.md), [project](../../../../user/project/settings/project_access_tokens.md), or [group](../../../../user/group/settings/group_access_tokens.md) access token with at least the Developer role and the `api` permission.
+- The project ID. To find the project ID:
+ 1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
+ 1. Select **Settings > General**.
+
+To use MLflow client compatibility from a local environment:
+
+1. Set the tracking URI and token environment variables on the host that runs the code.
+ This can be your local environment, CI pipeline, or remote host. For example:
+
+ ```shell
+ export MLFLOW_TRACKING_URI="<your gitlab endpoint>/api/v4/projects/<your project id>/ml/mlflow"
+ export MLFLOW_TRACKING_TOKEN="<your_access_token>"
+ ```
+
+1. If your training code contains the call to `mlflow.set_tracking_uri()`, remove it.
+
+When running the training code, MLflow creates experiments, runs, log parameters, metrics, metadata
+and artifacts on GitLab.
+
+After experiments are logged, they are listed under `/<your project>/-/ml/experiments`.
+Runs are registered as:
+
+- Model Candidates, which can be explored by selecting an experiment.
+- Tags, which are registered as metadata.
+
+## Associating a candidate to a CI/CD job
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/119454) in GitLab 16.1.
+
+If your training code is being run from a CI/CD job, GitLab can use that information to enhance
+candidate metadata. To associate a candidate to a CI/CD job:
+
+1. In the [Project CI variables](../../../../ci/variables/index.md), include the following variables:
+ - `MLFLOW_TRACKING_URI`: `"<your gitlab endpoint>/api/v4/projects/<your project id>/ml/mlflow"`
+ - `MLFLOW_TRACKING_TOKEN`: `<your_access_token>`
+
+1. In your training code within the run execution context, add the following code snippet:
+
+ ```python
+ with mlflow.start_run(run_name=f"Candidate {index}"):
+ # Your training code
+
+ # Start of snippet to be included
+ if os.getenv('GITLAB_CI'):
+ mlflow.set_tag('gitlab.CI_JOB_ID', os.getenv('CI_JOB_ID'))
+ # End of snippet to be included
+ ```
+
+## Supported MLflow client methods and caveats
+
+GitLab supports these methods from the MLflow client. Other methods might be supported but were not
+tested. More information can be found in the [MLflow Documentation](https://www.mlflow.org/docs/1.28.0/python_api/mlflow.html).
+
+| Method | Supported | Version Added | Comments |
+|--------------------------|------------------|----------------|----------|
+| `get_experiment` | Yes | 15.11 | |
+| `get_experiment_by_name` | Yes | 15.11 | |
+| `set_experiment` | Yes | 15.11 | |
+| `get_run` | Yes | 15.11 | |
+| `start_run` | Yes | 15.11 | |
+| `log_artifact` | Yes with caveat | 15.11 | (15.11) `artifact_path` must be empty string. Does not support directories.
+| `log_artifacts` | Yes with caveat | 15.11 | (15.11) `artifact_path` must be empty string. Does not support directories.
+| `log_batch` | Yes | 15.11 | |
+| `log_metric` | Yes | 15.11 | |
+| `log_metrics` | Yes | 15.11 | |
+| `log_param` | Yes | 15.11 | |
+| `log_params` | Yes | 15.11 | |
+| `log_figure` | Yes | 15.11 | |
+| `log_image` | Yes | 15.11 | |
+| `log_text` | Yes with caveat | 15.11 | (15.11) Does not support directories.
+| `log_dict` | Yes with caveat | 15.11 | (15.11) Does not support directories.
+| `set_tag` | Yes | 15.11 | |
+| `set_tags` | Yes | 15.11 | |
+| `set_terminated` | Yes | 15.11 | |
+| `end_run` | Yes | 15.11 | |
+| `update_run` | Yes | 15.11 | |
+| `log_model` | Partial | 15.11 | (15.11) Saves the artifacts, but not the model data. `artifact_path` must be empty.
+
+## Limitations
+
+- The API GitLab supports is the one defined at MLflow version 1.28.0.
+- API endpoints not listed above are not supported.
+- During creation of experiments and runs, ExperimentTags are stored, even though they are not displayed.
+- MLflow Model Registry is not supported.
diff --git a/doc/user/project/pages/custom_domains_ssl_tls_certification/index.md b/doc/user/project/pages/custom_domains_ssl_tls_certification/index.md
index 606f0474cb1..0601e236a08 100644
--- a/doc/user/project/pages/custom_domains_ssl_tls_certification/index.md
+++ b/doc/user/project/pages/custom_domains_ssl_tls_certification/index.md
@@ -54,10 +54,7 @@ this document for an [overview on DNS records](dns_concepts.md).
To add your custom domain to GitLab Pages:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
-1. Select **Settings > Pages**.
-
- If this path is not visible, select **Deployments > Pages**.
- [This location is part of an experiment](../index.md#menu-position-test).
+1. On the left sidebar, select **Deploy > Pages**.
1. In the upper-right corner, select **New Domain**.
1. In **Domain**, enter the domain name.
1. Optional. In **Certificate**, turn off the **Automatic certificate management using Let's Encrypt** toggle to add an [SSL/TLS certificate](#adding-an-ssltls-certificate-to-pages). You can also add the certificate and key later.
@@ -168,10 +165,7 @@ If you're using Cloudflare, check
After you have added all the DNS records:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
-1. Select **Settings > Pages**.
-
- If this path is not visible, select **Deployments > Pages**.
- [This location is part of an experiment](../index.md#menu-position-test).
+1. On the left sidebar, select **Deploy > Pages**.
1. Next to the domain name, select **Edit**.
1. In **Verification status**, select **Retry verification** (**{retry}**).
@@ -263,10 +257,7 @@ meet these requirements.
- To add the certificate at the time you add a new domain:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
- 1. Select **Settings > Pages**.
-
- If this path is not visible, select **Deployments > Pages**.
- [This location is part of an experiment](../index.md#menu-position-test).
+ 1. On the left sidebar, select **Deploy > Pages**.
1. In the upper-right corner, select **New Domain**.
1. In **Domain**, enter the domain name.
1. In **Certificate**, turn off the **Automatic certificate management using Let's Encrypt** toggle to add an [SSL/TLS certificate](#adding-an-ssltls-certificate-to-pages).
@@ -275,17 +266,11 @@ meet these requirements.
- To add the certificate to a domain previously added:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
- 1. Select **Settings > Pages**.
-
- If this path is not visible, select **Deployments > Pages**.
- [This location is part of an experiment](../index.md#menu-position-test).
+ 1. On the left sidebar, select **Deploy > Pages**.
1. Next to the domain name, select **Edit**.
1. In **Certificate**, turn off the **Automatic certificate management using Let's Encrypt** toggle to add an [SSL/TLS certificate](#adding-an-ssltls-certificate-to-pages).
1. Select **Save changes**.
-NOTE:
-The Pages menu entry may also be located at **Deployments > Pages**, [more information](../index.md#menu-position-test)
-
1. Add the PEM certificate to its corresponding field.
1. If your certificate is missing its intermediate, copy
and paste the root certificate (usually available from your CA website)
@@ -309,10 +294,7 @@ domain (as long as you've set a valid certificate for it).
To enable this setting:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
-1. Select **Settings > Pages**.
-
- If this path is not visible, select **Deployments > Pages**.
- [This location is part of an experiment](../index.md#menu-position-test).
+1. On the left sidebar, select **Deploy > Pages**.
1. Select the **Force HTTPS (requires valid certificates)** checkbox.
1. Select **Save changes**.
diff --git a/doc/user/project/pages/custom_domains_ssl_tls_certification/lets_encrypt_integration.md b/doc/user/project/pages/custom_domains_ssl_tls_certification/lets_encrypt_integration.md
index 15152efb80c..878613c3b9c 100644
--- a/doc/user/project/pages/custom_domains_ssl_tls_certification/lets_encrypt_integration.md
+++ b/doc/user/project/pages/custom_domains_ssl_tls_certification/lets_encrypt_integration.md
@@ -43,10 +43,7 @@ For **self-managed** GitLab instances, make sure your administrator has
Once you've met the requirements, enable Let's Encrypt integration:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
-1. Select **Settings > Pages**.
-
- If this path is not visible, select **Deployments > Pages**.
- [This location is part of an experiment](../index.md#menu-position-test).
+1. On the left sidebar, select **Deploy > Pages**.
1. Next to the domain name, select **Edit**.
1. Turn on the **Automatic certificate management using Let's Encrypt** toggle.
@@ -73,10 +70,7 @@ associated Pages domain. GitLab also renews it automatically.
If you get an error **Something went wrong while obtaining the Let's Encrypt certificate**, first, make sure that your pages site is set to "Everyone" in your project's **Settings > General > Visibility**. This allows the Let's Encrypt Servers reach your pages site. Once this is confirmed, you can try obtaining the certificate again by following these steps:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
-1. Select **Settings > Pages**.
-
- If this path is not visible, select **Deployments > Pages**.
- [This location is part of an experiment](../index.md#menu-position-test).
+1. On the left sidebar, select **Deploy > Pages**.
1. Next to the domain name, select **Edit**.
1. In **Verification status**, select **Retry verification** (**{retry}**).
1. If you're still getting the same error:
@@ -91,10 +85,7 @@ If you get an error **Something went wrong while obtaining the Let's Encrypt cer
If you've enabled Let's Encrypt integration, but a certificate is absent after an hour and you see the message, "GitLab is obtaining a Let's Encrypt SSL certificate for this domain. This process can take some time. Please try again later.", try to remove and add the domain for GitLab Pages again by following these steps:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
-1. Select **Settings > Pages**.
-
- If this path is not visible, select **Deployments > Pages**.
- [This location is part of an experiment](../index.md#menu-position-test).
+1. On the left sidebar, select **Deploy > Pages**.
1. Next to the domain name, select **Remove**.
1. [Add the domain again, and verify it](index.md#1-add-a-custom-domain).
1. [Enable Let's Encrypt integration for your domain](#enabling-lets-encrypt-integration-for-your-custom-domain).
diff --git a/doc/user/project/pages/getting_started/pages_ci_cd_template.md b/doc/user/project/pages/getting_started/pages_ci_cd_template.md
index 167c72fdc89..02e662d15b3 100644
--- a/doc/user/project/pages/getting_started/pages_ci_cd_template.md
+++ b/doc/user/project/pages/getting_started/pages_ci_cd_template.md
@@ -25,12 +25,10 @@ these steps, you may have to do additional configuration for the Pages site to g
If everything is configured correctly, the site can take approximately 30 minutes to deploy.
-To view the pipeline, go to **CI/CD > Pipelines**.
+To view the pipeline, go to **Build > Pipelines**.
-When the pipeline is finished, go to **Settings > Pages** to find the link to
+When the pipeline is finished, go to **Deploy > Pages** to find the link to
your Pages website.
-If this path is not visible, select **Deployments > Pages**.
-[This location is part of an experiment](../index.md#menu-position-test).
For every change pushed to your repository, GitLab CI/CD runs a new pipeline
that immediately publishes your changes to the Pages site.
diff --git a/doc/user/project/pages/getting_started/pages_forked_sample_project.md b/doc/user/project/pages/getting_started/pages_forked_sample_project.md
index e8de80ac137..8332d96d99e 100644
--- a/doc/user/project/pages/getting_started/pages_forked_sample_project.md
+++ b/doc/user/project/pages/getting_started/pages_forked_sample_project.md
@@ -20,14 +20,12 @@ To fork a sample project and create a Pages website:
1. View the sample projects by navigating to the [GitLab Pages examples](https://gitlab.com/pages) group.
1. Select the name of the project you want to [fork](../../repository/forking_workflow.md#create-a-fork).
1. In the upper-right corner, select **Fork**, then choose a namespace to fork to.
-1. For your project, on the left sidebar, select **CI/CD > Pipelines** and then **Run pipeline**.
+1. For your project, on the left sidebar, select **Build > Pipelines** and then **Run pipeline**.
GitLab CI/CD builds and deploys your site.
The site can take approximately 30 minutes to deploy.
-When the pipeline is finished, go to **Settings > Pages** to find the link to
+When the pipeline is finished, go to **Deploy > Pages** to find the link to
your Pages website.
-If this path is not visible, select **Deployments > Pages**.
-[This location is part of an experiment](../index.md#menu-position-test).
For every change pushed to your repository, GitLab CI/CD runs a new pipeline
that immediately publishes your changes to the Pages site.
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 c62ead69216..51f53860fee 100644
--- a/doc/user/project/pages/getting_started/pages_from_scratch.md
+++ b/doc/user/project/pages/getting_started/pages_from_scratch.md
@@ -174,12 +174,10 @@ After you have completed the preceding steps,
deploy your website:
1. Save and commit the `.gitlab-ci.yml` file.
-1. Go to **CI/CD > Pipelines** to watch the pipeline.
-1. When the pipeline is finished, go to **Settings > Pages** to find the link to
+1. Go to **Build > Pipelines** to watch the pipeline.
+1. When the pipeline is finished, go to **Deploy > Pages** to find the link to
your Pages website.
- If this path is not visible, select **Deployments > Pages**.
- [This location is part of an experiment](../index.md#menu-position-test).
When this `pages` job completes successfully, a special `pages:deploy` job
appears in the pipeline view. It prepares the content of the website for the
GitLab Pages daemon. GitLab runs it in the background and doesn't use a runner.
diff --git a/doc/user/project/pages/getting_started/pages_new_project_template.md b/doc/user/project/pages/getting_started/pages_new_project_template.md
index cb1da3fb21f..ae0dd9507ad 100644
--- a/doc/user/project/pages/getting_started/pages_new_project_template.md
+++ b/doc/user/project/pages/getting_started/pages_new_project_template.md
@@ -12,21 +12,19 @@ You can create a new project from a template and run the CI/CD pipeline to gener
Use a template when you want to test GitLab Pages or start a new project that's already
configured to generate a Pages site.
-1. From the top navigation, select the **+** button and select **New project**.
+1. On the left sidebar, at the top, select **Create new** (**{plus}**) and **New project/repository**.
1. Select **Create from Template**.
1. Next to one of the templates starting with **Pages**, select **Use template**.
![Project templates for Pages](../img/pages_project_templates_v13_1.png)
1. Complete the form and select **Create project**.
-1. From the left sidebar, navigate to your project's **CI/CD > Pipelines**
+1. On the left sidebar, select **Build > Pipelines**
and select **Run pipeline** to trigger GitLab CI/CD to build and deploy your
site.
-When the pipeline is finished, go to **Settings > Pages** to find the link to
+When the pipeline is finished, go to **Deploy > Pages** to find the link to
your Pages website.
-If this path is not visible, select **Deployments > Pages**.
-[This location is part of an experiment](../index.md#menu-position-test).
For every change pushed to your repository, GitLab CI/CD runs a new pipeline
that immediately publishes your changes to the Pages site.
diff --git a/doc/user/project/pages/getting_started/pages_ui.md b/doc/user/project/pages/getting_started/pages_ui.md
index 16d5cfcca4a..94dab9dfd17 100644
--- a/doc/user/project/pages/getting_started/pages_ui.md
+++ b/doc/user/project/pages/getting_started/pages_ui.md
@@ -34,10 +34,8 @@ a pipeline deploys your Pages website.
To complete the setup and generate a GitLab Pages deployment:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
-1. Select **Settings > Pages**.
+1. On the left sidebar, select **Deploy > Pages**.
- If this path is not visible, select **Deployments > Pages**.
- [This location is part of an experiment](../index.md#menu-position-test).
A **Get Started with Pages** form appears. If this form is not available,
see [Troubleshooting](#if-the-get-started-with-pages-form-is-not-available).
1. For **Step 1**, enter an image name and verify that your files are in a `public` folder.
@@ -54,7 +52,7 @@ To complete the setup and generate a GitLab Pages deployment:
1. For **Step 4**, add a commit message and select **Commit**. This commit triggers your first
GitLab Pages deployment.
-To view the running pipeline, go to **CI/CD > Pipelines**.
+To view the running pipeline, go to **Build > Pipelines**.
To view the artifacts that were created during the deployment, view the job,
and on the right side, select **Download artifacts**.
diff --git a/doc/user/project/pages/index.md b/doc/user/project/pages/index.md
index 9b299b46f75..e3a32a9afe9 100644
--- a/doc/user/project/pages/index.md
+++ b/doc/user/project/pages/index.md
@@ -34,13 +34,6 @@ Pages does not support dynamic server-side processing, for instance, as `.php` a
For more information, see
[Static vs dynamic websites](https://about.gitlab.com/blog/2016/06/03/ssg-overview-gitlab-pages-part-1-dynamic-x-static/).
-## Menu Position Test
-
-NOTE:
-We are currently conducting an A/B test where some users may see the Pages
-Menu entry under "Deployments" instead of "Settings". We think that this may
-be a more accurate position. Feel free to add any feedback to [the experiment issue](https://gitlab.com/gitlab-org/gitlab/-/issues/373547).
-
## Getting started
To create a GitLab Pages website:
diff --git a/doc/user/project/pages/introduction.md b/doc/user/project/pages/introduction.md
index 73bfe018a7d..d00af81c10e 100644
--- a/doc/user/project/pages/introduction.md
+++ b/doc/user/project/pages/introduction.md
@@ -23,8 +23,6 @@ In brief, this is what you need to upload your website in GitLab Pages:
1. Domain of the instance: domain name that is used for GitLab Pages
(ask your administrator).
1. GitLab CI/CD: a `.gitlab-ci.yml` file with a specific job named [`pages`](../../../ci/yaml/index.md#pages) in the root directory of your repository.
-1. A directory called `public` in your site's repository containing the content
- to be published.
1. GitLab Runner enabled for the project.
## GitLab Pages on GitLab.com
@@ -67,10 +65,7 @@ You can configure redirects for your site using a `_redirects` file. For more in
To remove your pages:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
-1. Select **Settings > Pages**.
-
- If this path is not visible, select **Deployments > Pages**.
- [This location is part of an experiment](index.md#menu-position-test).
+1. On the left sidebar, select **Deploy > Pages**.
1. Select **Remove pages**.
## Subdomains of subdomains
@@ -97,19 +92,14 @@ you can create your project first and access it under `http(s)://namespace.examp
## Enable unique domains
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/9347) in GitLab 15.9 [with a flag](../../../administration/feature_flags.md) named `pages_unique_domain`. Disabled by default.
-> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/388151) in GitLab 15.11.
-
-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 `pages_unique_domain`.
-On GitLab.com, by default this feature is available.
+> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/388151) in GitLab 15.11.
By default, every project in a group shares the same domain, for example, `group.gitlab.io`. This means that cookies are also shared for all projects in a group.
To ensure your project uses a unique Pages domain, enable the unique domains feature for the project:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
-1. Select **Settings > Pages**.
+1. On the left sidebar, select **Deploy > Pages**.
1. Select the **Use unique domain** checkbox.
1. Select **Save changes**.
@@ -278,6 +268,35 @@ instead. Here are some examples of what happens given the above Pages site:
When `public/data/index.html` exists, it takes priority over the `public/data.html` file
for both the `/data` and `/data/` URL paths.
+## Customize the default folder
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab-pages/-/merge_requests/859) in GitLab 16.1 with a Pages flag named `FF_CONFIGURABLE_ROOT_DIR`. Disabled by default.
+> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab-pages/-/issues/1073) in GitLab 16.1.
+> - [Enabled on self-managed](https://gitlab.com/gitlab-org/gitlab-pages/-/merge_requests/890) in GitLab 16.2.
+
+By default, the [artifact](../../../ci/jobs/job_artifacts.md) folder
+that contains the static files of your site needs to have the name `public`.
+
+To change that folder name to any other value, add a `publish` property to your
+`pages` job configuration in `.gitlab-ci.yml`.
+
+The following example publishes a folder named `dist` instead:
+
+```yaml
+pages:
+ script:
+ - npm run build
+ artifacts:
+ paths:
+ - dist
+ publish: dist
+```
+
+If you're using a folder name other than `public`you must specify
+the directory to be deployed with Pages both as an artifact, and under the
+`publish` property. The reason you need both is that you can define multiple paths
+as artifacts, and GitLab doesn't know which one you want to deploy.
+
## Known issues
For a list of known issues, see the GitLab [public issue tracker](https://gitlab.com/gitlab-org/gitlab/-/issues?label_name[]=Category%3APages).
diff --git a/doc/user/project/pages/public_folder.md b/doc/user/project/pages/public_folder.md
index 6ee8ea17aee..68023b87560 100644
--- a/doc/user/project/pages/public_folder.md
+++ b/doc/user/project/pages/public_folder.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# GitLab Pages public folder **(FREE)**
-All the files that should be accessible by the browser must be in a root-level folder called `public`.
+> With GitLab 16.1 we introduced the ability to configure the published folder in `.gitlab-ci.yml`, so you longer need to change your framework config. For more information, see how to [set a custom folder to be deployed with Pages](introduction.md#customize-the-default-folder).
Follow these instructions to configure the `public` folder
for the following frameworks.
diff --git a/doc/user/project/protected_branches.md b/doc/user/project/protected_branches.md
index 6958b69061a..78384249abc 100644
--- a/doc/user/project/protected_branches.md
+++ b/doc/user/project/protected_branches.md
@@ -116,7 +116,7 @@ The protected branch displays in the list of protected branches.
FLAG:
On self-managed GitLab, by default this feature is not available.
-To make it available, ask an administrator to
+To make it available, an administrator can
[enable the feature flag](../../administration/feature_flags.md)
named `group_protected_branches`. On GitLab.com, this feature is not available.
@@ -360,8 +360,7 @@ branches by using the GitLab web interface:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
1. Select **Code > Branches**.
1. Next to the branch you want to delete, select **Delete** (**{remove}**).
-1. On the confirmation dialog, type the branch name.
-1. Select **Yes, delete protected branch**.
+1. On the confirmation dialog, enter the branch name and 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 368a59e69b0..2dfdb77df9c 100644
--- a/doc/user/project/push_options.md
+++ b/doc/user/project/push_options.md
@@ -37,6 +37,7 @@ You can use push options to skip a CI/CD pipeline, or pass CI/CD variables.
| ------------------------------ | ------------------------------------------------------------------------------------------- |---------------------- |
| `ci.skip` | Do not create a CI pipeline for the latest push. Only skips branch pipelines and not [merge request pipelines](../../ci/pipelines/merge_request_pipelines.md). This does not skip pipelines for CI integrations, such as Jenkins. | [11.7](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/15643) |
| `ci.variable="<name>=<value>"` | Provide [CI/CD variables](../../ci/variables/index.md) to be used in a CI pipeline, if one is created due to the push. Only passes variables to branch pipelines and not [merge request pipelines](../../ci/pipelines/merge_request_pipelines.md). | [12.6](https://gitlab.com/gitlab-org/gitlab/-/issues/27983) |
+| `integrations.skip_ci` | Skip push events for CI integrations, such as Atlassian Bamboo, Buildkite, Drone, Jenkins, and JetBrains TeamCity. | [16.2](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/123837) |
An example of using `ci.skip`:
@@ -50,6 +51,12 @@ An example of passing some CI/CD variables for a pipeline:
git push -o ci.variable="MAX_RETRIES=10" -o ci.variable="MAX_TIME=600"
```
+An example of using `integrations.skip_ci`:
+
+```shell
+git push -o integrations.skip_ci
+```
+
## Push options for merge requests
You can use Git push options to perform certain actions for merge requests at the same
diff --git a/doc/user/project/quick_actions.md b/doc/user/project/quick_actions.md
index 3e8ce009740..066da445eeb 100644
--- a/doc/user/project/quick_actions.md
+++ b/doc/user/project/quick_actions.md
@@ -163,8 +163,10 @@ The following quick actions can be applied through the description field when ed
| `/clear_health_status` | **{check-circle}** Yes | **{dotted-circle}** Yes | **{dotted-circle}** Yes | Clear [health status](issues/managing_issues.md#health-status).
| `/weight <value>` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Set weight. Valid options for `<value>` include `0`, `1`, and `2`.
| `/clear_weight` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Clear weight.
-| `/type` | **{check-circle}** Yes | **{dotted-circle}** Yes | **{dotted-circle}** Yes | Converts work item to specified type. Available options for `<type>` include `Issue`, `Task`, `Objective` and `Key Result`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/385227) in GitLab 16.0.
+| `/type` | **{check-circle}** Yes | **{dotted-circle}** Yes | **{dotted-circle}** Yes | Converts work item to specified type. Available options for `<type>` include `issue`, `task`, `objective` and `key result`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/385227) in GitLab 16.0.
| `/promote_to <type>` | **{check-circle}** Yes | **{dotted-circle}** No | **{check-circle}** Yes | Promotes work item to specified type. Available options for `<type>`: `issue` (promote a task) and `objective` (promote a key result). [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/412534) in GitLab 16.1.
+| `/todo` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Add a to-do item. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/412277) in GitLab 16.2.
+| `/done` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Mark to-do item as done. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/412277) in GitLab 16.2.
## Commit messages
diff --git a/doc/user/project/releases/index.md b/doc/user/project/releases/index.md
index 6bcc57d5916..40fb6969def 100644
--- a/doc/user/project/releases/index.md
+++ b/doc/user/project/releases/index.md
@@ -38,7 +38,7 @@ When you create a release, or after, you can:
To view a list of releases:
-- On the left sidebar, select **Deployments > Releases**, or
+- On the left sidebar, select **Deploy > Releases**, or
- On the project's overview page, if at least one release exists, select the number of releases.
@@ -75,7 +75,7 @@ Prerequisites:
To create a release in the Releases page:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
-1. On the left sidebar, select **Build > Releases** and select **New release**.
+1. On the left sidebar, select **Deploy > Releases** and select **New release**.
1. From the [**Tag name**](release_fields.md#tag-name) dropdown list, either:
- Select an existing Git tag. Selecting an existing tag that is already associated with a release
results in a validation error.
@@ -194,7 +194,7 @@ Prerequisites:
In the UI:
-1. On the left sidebar, select **Deployments > Releases**.
+1. On the left sidebar, select **Deploy > Releases**.
1. In the upper-right corner of the release you want to modify, select **Edit this release** (the pencil icon).
1. On the **Edit Release** page, change the release's details.
1. Select **Save changes**.
@@ -236,17 +236,17 @@ the [Releases API](../../../api/releases/index.md#create-a-release).
In the user interface, to associate milestones to a release:
-1. On the left sidebar, select **Deployments > Releases**.
+1. On the left sidebar, select **Deploy > Releases**.
1. In the upper-right corner of the release you want to modify, select **Edit this release** (the pencil icon).
1. From the **Milestones** list, select each milestone you want to associate. You can select multiple milestones.
1. Select **Save changes**.
-On the **Deployments > Releases** page, the **Milestone** is listed in the top
+On the **Deploy > Releases** page, the **Milestone** is listed in the top
section, along with statistics about the issues in the milestones.
![A Release with one associated milestone](img/release_with_milestone_v12_9.png)
-Releases are also visible on the **Issues > Milestones** page, and when you select a milestone
+Releases are also visible on the **Plan > Milestones** page, and when you select a milestone
on this page.
Here is an example of milestones with no releases, one release, and two releases.
@@ -266,7 +266,7 @@ You can be notified by email when a new release is created for your project.
To subscribe to notifications for releases:
-1. On the left sidebar, select **Project information**.
+1. On the left sidebar, select **Project overview**.
1. Select **Notification setting** (the bell icon).
1. In the list, select **Custom**.
1. Select the **New release** checkbox.
@@ -302,8 +302,8 @@ deploy_to_production:
To set a deploy freeze window in the UI, complete these steps:
1. Sign in to GitLab as a user with the Maintainer role.
-1. On the left sidebar, select **Project information**.
-1. In the left navigation menu, go to **Settings > CI/CD**.
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
+1. On the left sidebar, select **Settings > CI/CD**.
1. Scroll to **Deploy freezes**.
1. Select **Expand** to see the deploy freeze table.
1. Select **Add deploy freeze** to open the deploy freeze modal.
diff --git a/doc/user/project/releases/release_evidence.md b/doc/user/project/releases/release_evidence.md
index 3269bf8f44b..990945b1a2b 100644
--- a/doc/user/project/releases/release_evidence.md
+++ b/doc/user/project/releases/release_evidence.md
@@ -97,7 +97,7 @@ Evidence collection snapshots are visible on the Releases page, along with the t
When you create a release, if [job artifacts](../../../ci/yaml/index.md#artifactsreports) are included in the last pipeline that ran, they are automatically included in the release as release evidence.
-Although job artifacts normally expire, artifacts included in release evidence do not expire.
+Although job artifacts usually expire, artifacts included in release evidence do not expire.
To enable job artifact collection you must specify both:
diff --git a/doc/user/project/remote_development/connect_machine.md b/doc/user/project/remote_development/connect_machine.md
index f981918c0ea..53c5d342f74 100644
--- a/doc/user/project/remote_development/connect_machine.md
+++ b/doc/user/project/remote_development/connect_machine.md
@@ -26,7 +26,7 @@ To connect a remote machine to the Web IDE, you must:
To generate Let's Encrypt certificates:
-1. Create an `A` record to point a domain to your remote machine (for example, from `example.remote.gitlab.dev` to `1.2.3.4`).
+1. Create an `A` record to point a domain to your remote machine (for example, from `example.remote.gitlab.dev` to `10.0.2.2`).
1. Install [Certbot](https://certbot.eff.org/) to enable HTTPS:
```shell
diff --git a/doc/user/project/remote_development/index.md b/doc/user/project/remote_development/index.md
index 6a9d0c73e9a..ccb1745d490 100644
--- a/doc/user/project/remote_development/index.md
+++ b/doc/user/project/remote_development/index.md
@@ -11,7 +11,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Enabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/115741) in GitLab 15.11.
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 `vscode_web_ide`. On GitLab.com, this feature is available. The feature is not ready for production use.
+On self-managed GitLab, by default this feature is available. To hide the feature, an administrator can [disable the feature flag](../../../administration/feature_flags.md) named `vscode_web_ide`. On GitLab.com, this feature is available. The feature is not ready for production use.
WARNING:
This feature is in [Beta](../../../policy/experiment-beta-support.md#beta) and subject to change without notice.
diff --git a/doc/user/project/repository/branches/default.md b/doc/user/project/repository/branches/default.md
index 100450aefe7..ae978e2123d 100644
--- a/doc/user/project/repository/branches/default.md
+++ b/doc/user/project/repository/branches/default.md
@@ -96,7 +96,7 @@ unless a subgroup configuration overrides it.
## Protect initial default branches **(FREE SELF)**
-> Full protection after initial push [added](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/118729) in GitLab 16.0.
+> Full protection after initial push [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/118729) in GitLab 16.0.
GitLab administrators and group owners can define [branch protections](../../../project/protected_branches.md)
to apply to every repository's [default branch](#default-branch)
diff --git a/doc/user/project/repository/branches/index.md b/doc/user/project/repository/branches/index.md
index e43efca600a..3e9957806c8 100644
--- a/doc/user/project/repository/branches/index.md
+++ b/doc/user/project/repository/branches/index.md
@@ -128,7 +128,7 @@ On this page, you can:
> - [Enabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/363170) in GitLab 15.11
FLAG:
-On self-managed GitLab, by default this feature is available. To hide the feature, ask an administrator to [disable the feature flag](../../../feature_flags.md) named `branch_rules`.
+On self-managed GitLab, by default this feature is available. To hide the feature, an administrator can [disable the feature flag](../../../feature_flags.md) named `branch_rules`.
On GitLab.com, this feature is available.
Branches in your repository can be [protected](../../protected_branches.md) in multiple ways. You can:
diff --git a/doc/user/project/repository/code_suggestions.md b/doc/user/project/repository/code_suggestions.md
index dd1fa3f4c8b..95d5873a535 100644
--- a/doc/user/project/repository/code_suggestions.md
+++ b/doc/user/project/repository/code_suggestions.md
@@ -5,191 +5,232 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: index, reference
---
-# Code Suggestions (Beta) **(FREE SAAS)**
+# Code Suggestions (Beta) **(FREE)**
-> - [Introduced](https://about.gitlab.com/releases/2023/02/22/gitlab-15-9-released/#code-suggestions-available-in-closed-beta) in GitLab 15.9 as [Beta](/ee/policy/experiment-beta-support.md#beta) for early access Ultimate customers.
-> - [Enabled](https://gitlab.com/gitlab-org/gitlab/-/issues/408104) as opt-in with GitLab 15.11 as [Beta](/ee/policy/experiment-beta-support.md#beta).
+> - [Introduced](https://about.gitlab.com/releases/2023/02/22/gitlab-15-9-released/#code-suggestions-available-in-closed-beta) in GitLab 15.9 as [Beta](../../../policy/experiment-beta-support.md#beta) for early access Ultimate customers on GitLab.com.
+> - [Enabled](https://gitlab.com/gitlab-org/gitlab/-/issues/408104) as opt-in with GitLab 15.11 as [Beta](../../../policy/experiment-beta-support.md#beta).
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/408158) from GitLab Ultimate to GitLab Premium in 16.0.
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/410801) from GitLab Premium to GitLab Free in 16.0.
> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/121079) in GitLab 16.1.
-> - [Default to third-party AI services](https://gitlab.com/groups/gitlab-org/-/epics/10562) in GitLab 16.1.
+> - [Introduced support for Google Vertex AI Codey APIs](https://gitlab.com/groups/gitlab-org/-/epics/10562) in GitLab 16.1.
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/10653) in GitLab 16.1 as [Beta](../../../policy/experiment-beta-support.md#beta) on self-managed GitLab.
+> - Code suggestions in the GitLab WebIDE enabled for all GitLab-hosted customers.
+> - [Removed support for GitLab native model](https://gitlab.com/groups/gitlab-org/-/epics/10752) in GitLab 16.2.
WARNING:
-This feature is in [Beta](/ee/policy/experiment-beta-support.md#beta).
-Due to high demand, this feature may have unscheduled downtime and Code Suggestions in IDEs may be delayed.
-Code Suggestions may produce [low-quality or incomplete suggestions](#model-accuracy-and-quality).
-Beta users should read about the [known limitations](#known-limitations). We look forward to hearing your feedback.
+This feature is in [Beta](../../../policy/experiment-beta-support.md#beta).
+Beta users should read about the [known limitations](#known-limitations). We look forward to hearing your [feedback](#feedback).
-Code Suggestions use generative AI to suggest code while you're developing.
-Use Code Suggestions to write code more efficiently by viewing Code Suggestions
-as you type. Depending on the cursor position, the extension either:
+Write code more efficiently by using generative AI to suggest code while you're developing.
-- Provides entire code snippets, like generating functions.
-- Completes the current line.
+Code Suggestions are available:
-To accept a suggestion, press <kbd>Tab</kbd>.
+- To users of GitLab SaaS (by default) and self-managed GitLab Enterprise Edition (when requested). Code Suggestions are not available for GitLab Community Edition.
+- In VS Code and Microsoft Visual Studio when you have the corresponding GitLab extension installed.
+- In the GitLab WebIDE
-Code Suggestions are available in Visual Studio Code when you have the GitLab Workflow extension installed. [Additional IDE extension support](https://gitlab.com/groups/gitlab-org/-/epics/10542) is planned for the near future.
+<div class="video-fallback">
+ <a href="https://www.youtube.com/watch?v=WnxBYxN2-p4">View an end-to-end demo of Code Suggestions in VS Code</a>.
+</div>
+<figure class="video-container">
+ <iframe src="https://www.youtube-nocookie.com/embed/WnxBYxN2-p4" frameborder="0" allowfullscreen> </iframe>
+</figure>
+
+Usage of Code Suggestions is governed by the [GitLab Testing Agreement](https://about.gitlab.com/handbook/legal/testing-agreement/).
+Learn about [data usage when using Code Suggestions](#code-suggestions-data-usage).
## Supported languages
-Code Suggestions may produce [low-quality or incomplete suggestions](#model-accuracy-and-quality).
+The best results from Code Suggestions are expected [for languages the Google Vertex AI Codey APIs](https://cloud.google.com/vertex-ai/docs/generative-ai/code/code-models-overview#supported_coding_languages) directly support:
-Language support varies depending on which AI model serves Code Suggestions. To use Code Suggestions entirely within GitLab cloud infrastructure, disable third-party AI services. To receive higher quality suggestions, [enable third-party AI services](#third-party-ai-services-controls).
+- C++
+- C#
+- Go
+- Google SQL
+- Java
+- JavaScript
+- Kotlin
+- PHP
+- Python
+- Ruby
+- Rust
+- Scala
+- Swift
+- TypeScript
-The best results from Code Suggestions are expected for these languages:
+ Supported [code infrastructure interfaces](https://cloud.google.com/vertex-ai/docs/generative-ai/code/code-models-overview#supported_code_infrastructure_interfaces) include:
-- **Third-party AI services (Google Codey)**: Go, Google Cloud CLI, Google SQL, Java, JavaScript, Kubernetes Resource Model (KRM), Python, Terraform, TypeScript.
-- **GitLab first-party AI model**: C/C++, C#, Go, Java, JavaScript, Python, PHP, Ruby, Rust, Scala, TypeScript.
+- Google Cloud CLI
+- Kubernetes Resource Model (KRM)
+- Terraform
-Suggestions may be mixed for other languages. Using natural language code comments to request completions may also not function as expected.
+Suggestion quality for other languages and using natural language code comments to request completions may not yet result in high-quality suggestions.
-Suggestions are best when writing new code. Editing existing functions or 'fill in the middle' of a function may not perform as expected.
+## Enable Code Suggestions on GitLab SaaS **(FREE SAAS)**
-We are making improvements to the Code Suggestions underlying AI model weekly to improve the quality of suggestions. Please remember that AI is non-deterministic, so you may not get the same suggestion week to week.
+Code Suggestions can be enabled [for all members of a group](../../group/manage.md#enable-code-suggestions).
-Usage of Code Suggestions is governed by the [GitLab Testing Agreement](https://about.gitlab.com/handbook/legal/testing-agreement/). Learn about [data usage when using Code Suggestions](#code-suggestions-data-usage).
+Each individual user must also choose to enable Code Suggestions.
-## Enable Code Suggestions for an individual user
+### Enable Code Suggestions for an individual user
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/121079) in GitLab 16.1 as [Beta](/ee/policy/experiment-beta-support.md#beta).
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/121079) in GitLab 16.1 as [Beta](../../../policy/experiment-beta-support.md#beta).
Each user can enable Code Suggestions for themselves:
1. On the left sidebar, select your avatar.
-1. On the left sidebar, select **Preferences**.
-1. In the **Code Suggestions** section, select **Enable Code Suggestions**.
+1. Select **Preferences**.
+1. In the **Code Suggestions** section, select the **Enable Code Suggestions** checkbox.
1. Select **Save changes**.
+If Code Suggestions is enabled for the group, the group setting overrides the user setting.
+
NOTE:
-If Code Suggestions is [enabled for the group](../../group/manage.md#enable-code-suggestions), the group setting overrides the user setting.
+This setting controls Code Suggestions for all IDEs. Support for [more granular control per IDE](https://gitlab.com/groups/gitlab-org/-/epics/10624) is proposed.
-## Enable Code Suggestions in WebIDE
+## Enable Code Suggestions on self-managed GitLab **(FREE SELF)**
-Prerequisites:
+> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/10653) in GitLab 16.1 as [Beta](../../../policy/experiment-beta-support.md#beta).
-- Code Suggestions must be [enabled for the top-level group](../../group/manage.md#enable-code-suggestions).
-- Code Suggestions must be [enabled for your user account](#enable-code-suggestions-for-an-individual-user).
-- You must be a GitLab team member.
+To enable Code Suggestions on a self-managed GitLab EE instance, you must:
-Code Suggestions work automatically in the [GitLab WebIDE](../../project/web_ide/index.md) if the above prerequisites are met. To disable Code Suggestions in the WebIDE, disable the user account setting.
+- Be an administrator.
+- Have a [GitLab SaaS account](https://gitlab.com/users/sign_up).
+You do not need to have a GitLab SaaS subscription.
-NOTE:
-Disabling in the WebIDE will also disable in any other IDEs you use locally like VS Code. Support for [more granular control per IDE](https://gitlab.com/groups/gitlab-org/-/epics/10624) is proposed.
+Then, you will:
-## Enable Code Suggestions in VS Code
+1. Enable Code Suggestions for your SaaS account.
+1. Enable Code Suggestions for the instance.
+1. [Request early access](#request-access-to-code-suggestions) to the Code Suggestions Beta.
-Prerequisites:
+### Enable Code Suggestions for your SaaS account
-- Code Suggestions must be [enabled for the top-level group](../../group/manage.md#enable-code-suggestions).
-- Code Suggestions must be [enabled for your user account](#enable-code-suggestions-for-an-individual-user).
-- Completed the [setup instructions](https://gitlab.com/gitlab-org/gitlab-vscode-extension#setup) for the GitLab Visual Studio Code Extension.
+To enable Code Suggestions for your GitLab SaaS account:
-To enable Code Suggestions in VS Code:
+1. Create a [personal access token](../../profile/personal_access_tokens.md#create-a-personal-access-token)
+ with the `api` scope.
+1. On the left sidebar, select your avatar.
+1. Select **Preferences**.
+1. In the **Code Suggestions** section, select **Enable Code Suggestions**.
+1. Select **Save changes**.
-1. Download and install the
- [GitLab Workflow extension](https://marketplace.visualstudio.com/items?itemName=GitLab.gitlab-workflow)
- for Visual Studio Code.
-1. Complete the [setup instructions](https://gitlab.com/gitlab-org/gitlab-vscode-extension#setup) for the extension.
-1. After your GitLab account connects successfully, in the left sidebar, select **Extensions**.
-1. Find the **GitLab workflow** extension, select **Settings** (**{settings}**), and select **Extension Settings**.
-1. Enable **GitLab > AI Assisted Code Suggestions**.
+### Enable Code Suggestions for the instance
-Start typing and receive suggestions for your GitLab projects.
+You must enable Code Suggestions for the instance. When you do this, you:
-<div class="video-fallback">
- See an end-to-end demo: <a href="https://www.youtube.com/watch?v=WnxBYxN2-p4">Get started with GitLab Code Suggestions in VS Code</a>.
-</div>
-<figure class="video-container">
- <iframe src="https://www.youtube-nocookie.com/embed/WnxBYxN2-p4" frameborder="0" allowfullscreen> </iframe>
-</figure>
+- Agree to the [GitLab testing agreement](https://about.gitlab.com/handbook/legal/testing-agreement/).
+- Acknowledge that GitLab:
+ - Sends data from the instance, including personal data, to GitLab.com infrastructure.
-## Enable Code Suggestions in other IDEs and editors
+To enable Code Suggestions for your self-managed GitLab instance:
-We have experimental support for Code Suggestions in Visual Studio, JetBrains, Neovim, Emacs, Sublime, etc.
+1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
+1. Select **Admin Area**.
+1. On the left sidebar, select **Settings > General**.
+1. Expand **Code Suggestions** and:
+ - Select **Turn on Code Suggestions for this instance**.
+ - In **Personal access token**, enter your GitLab SaaS personal access token.
+1. Select **Save changes**.
-More details in this [blog](https://about.gitlab.com/blog/2023/06/01/extending-code-suggestions/).
+This setting is visible only in self-managed GitLab instances.
-## Why aren't Code Suggestions displayed?
+WARNING:
+If you clear the **Turn on code suggestions for this instance** checkbox, the users in your instance can still use Code Suggestions for up to one hour, until the issued JSON web token (JWT) expires.
-If Code Suggestions are not displayed, try the following troubleshooting steps.
+### Request access to Code Suggestions
-In GitLab, ensure Code Suggestions is enabled:
+GitLab provisions access on a customer-by-customer basis for Code Suggestions
+on self-managed instances. To request access:
-- [For your user account](#enable-code-suggestions-for-an-individual-user).
-- [For *all* top-level groups your account belongs to](../../group/manage.md#enable-code-suggestions). If you don't have a role that lets you view the top-level group's settings, contact a group owner.
+1. Sign into your GitLab SaaS account.
+1. Comment on [issue 415393](https://gitlab.com/gitlab-org/gitlab/-/issues/415393)
+ and tag your customer success manager.
-In VS Code:
+After GitLab has provisioned access to Code Suggestions for your instance,
+the users in your instance can now enable Code Suggestions.
-- Ensure [your IDE is configured properly](#enable-code-suggestions-in-vs-code).
+## Enable Code Suggestions in other IDEs and editors
-To confirm that your account is enabled, go to [https://gitlab.com/api/v4/ml/ai-assist](https://gitlab.com/api/v4/ml/ai-assist). A response of `user_is_allowed` should return `true`.
+We have experimental support for Code Suggestions in JetBrains, Neovim, Emacs, Sublime, etc.
-### Authentication troubleshooting
+More details in this [blog](https://about.gitlab.com/blog/2023/06/01/extending-code-suggestions/).
-If the above steps do not solve your issue, the problem may be related to the recent changes in authentication, specifically the token system. To resolve the issue, please follow these troubleshooting steps:
+## Use Code Suggestions
-- Remove the existing PAT from your GitLab account settings.
-- Reauthorize your GitLab account in VSCode using OAuth.
-- Test the code suggestions feature with different file extensions to verify if the issue is resolved.
+Prerequisites:
-## Third-party AI services controls
+- For self-managed GitLab, Code Suggestions must be enabled [for the instance](#enable-code-suggestions-on-self-managed-gitlab).
+- For GitLab SaaS, Code Suggestions must be enabled [for the top-level group](../../group/manage.md#enable-code-suggestions) and [for your user account](#enable-code-suggestions-for-an-individual-user).
+- To use VS Code, ensure you have installed [the VS Code GitLab Workflow extension](https://marketplace.visualstudio.com/items?itemName=GitLab.gitlab-workflow).
+- To use Microsoft Visual Studio, ensure you have installed [the Visual Studio GitLab extension](https://marketplace.visualstudio.com/items?itemName=GitLab.GitLabExtensionForVisualStudio).
-Organizations can opt to use Code Suggestions entirely within GitLab cloud infrastructure. This option can be controlled with the top-level group [Third-party AI setting](../../group/manage.md#enable-third-party-ai-features).
+To use Code Suggestions:
+
+1. Author your code. As you type, suggestions are displayed. Depending on the cursor position, the extension either:
-Having the third-party AI setting enabled will allow Code Suggestions to use third-party AI services, which is likely to produce higher quality results. Please note that language support varies between the two options and will change over time.
+ - Provides entire code snippets, like generating functions.
+ - Completes the current line.
-To use Code Suggestions entirely within GitLab’s cloud infrastructure, disable third-party AI services. You can disable Code Suggestions entirely in [your user profile settings](#enable-code-suggestions-for-an-individual-user).
+1. To accept a suggestion, press <kbd>Tab</kbd>.
+
+Suggestions are best when writing new code. Editing existing functions or 'fill in the middle' of a function may not perform as expected.
-## Stability and performance
+GitLab is making improvements to the Code Suggestions to improve the quality. AI is non-deterministic, so you may not get the same suggestion every time with the same input.
-This feature is currently in [Beta](/ee/policy/experiment-beta-support.md#beta).
-While the Code Suggestions inference API operates completely within the GitLab.com enterprise infrastructure,
-we expect a high demand for this Beta feature, which may cause degraded performance or unexpected downtime
-of the feature. We have built this feature to gracefully degrade and have controls in place to allow us to
+This feature is currently in [Beta](../../../policy/experiment-beta-support.md#beta).
+Code Suggestions depends on both Google Vertex AI Codey APIs and the GitLab Code Suggestions service. We have built this feature to gracefully degrade and have controls in place to allow us to
mitigate abuse or misuse. GitLab may disable this feature for any or all customers at any time at our discretion.
## Code Suggestions data usage
-Code Suggestions is a generative artificial intelligence (AI) model hosted on GitLab.com.
+Code Suggestions is a generative artificial intelligence (AI) model.
Your personal access token enables a secure API connection to GitLab.com.
-This API connection securely transmits a context window from VS Code to the Code Suggestions ML model for inference,
-and the generated suggestion is transmitted back to VS Code.
+This API connection securely transmits a context window from your IDE/editor to the Code Suggestions GitLab hosted service which calls Google Vertex AI Codey APIs,
+and the generated suggestion is transmitted back to your IDE/editor.
-Depending on your settings, different ML models will be used to provide Code Suggestions. GitLab currently leverages [Google Cloud's Vertex AI Codey API models](https://cloud.google.com/vertex-ai/docs/generative-ai/code/code-models-overview) for third-party AI powered Code Suggestions. The sections below refer only to GitLab first-party AI Model.
+GitLab currently leverages [Google Cloud's Vertex AI Codey API models](https://cloud.google.com/vertex-ai/docs/generative-ai/code/code-models-overview).
### Data privacy
-This section applies only to customers who have third-party AI services disabled.
+No new additional data is collected to enable this feature. Private non-public GitLab customer data is
+not used as training data.
-Code Suggestions operate completely in the GitLab.com infrastructure, providing the same level of
-[security](https://about.gitlab.com/security/) as any other feature of GitLab.com, and processing any personal
-data in accordance with our [Privacy Statement](https://about.gitlab.com/privacy/).
+Learn more about Google Vertex AI Codey APIs [Data Governance](https://cloud.google.com/vertex-ai/docs/generative-ai/data-governance)
-No new additional data is collected to enable this feature. The content of your GitLab hosted source code is
-not used as training data. Source code inference against the Code Suggestions model is not used to re-train the model.
-Your data also never leaves GitLab.com. All training and inference is done in GitLab.com infrastructure.
+### Inference window context
-[Read more about the security of GitLab.com](https://about.gitlab.com/security/faq/).
+Code Suggestions currently inferences against the currently opened file and has a context window of 2,048 tokens and 8,192 character limits. This limit includes content before and after the cursor, the file name, and the extension type.
+
+Learn more about Google Vertex AI [code-gecko](https://cloud.google.com/vertex-ai/docs/generative-ai/learn/models).
+
+### Self-managed instance data privacy
+
+A self-managed GitLab instance does not generate the code suggestion. After successful
+authentication to the self-managed instance, a token is generated.
+
+The IDE/editor then uses this token to securely transmit data directly to
+GitLab.com's Code Suggestions service for processing.
+
+The Code Suggestion service then securely returns an AI-generated code suggestion.
+
+Neither GitLab nor Google Vertex AI Codey APIs have any visibility into a self-managed customer's code other than
+what is sent to generate the code suggestion.
### Training data
-This section applies only to customers who have third-party AI services disabled.
+Code suggestions are routed through Google Vertex AI Codey APIs. Learn more about Google Vertex AI Codey APIs [Data Governance](https://cloud.google.com/vertex-ai/docs/generative-ai/data-governance) and [Responsible AI](https://cloud.google.com/vertex-ai/docs/generative-ai/learn/responsible-ai).
+
+Google Vertex AI Codey APIs are not trained on private non-public GitLab customer or user data.
-Code Suggestions uses open source pre-trained base models from the
-[CodeGen family](https://openreview.net/forum?id=iaYcJKpY2B_) including CodeGen-MULTI and CodeGen-NL.
-We then re-train and fine-tune these base models with a customized open source dataset to enable multi-language
-support and additional use cases. This customized dataset contains non-preprocessed open source code in 13
-programming languages from [The Pile](https://pile.eleuther.ai/) and the
-[Google BigQuery source code dataset](https://cloud.google.com/blog/topics/public-datasets/github-on-bigquery-analyze-all-the-open-source-code).
-We then process this raw dataset against heuristics that aim to increase the quality of the dataset.
+Google has [shared the following](https://ai.google/discover/foundation-models/) about the data Codey models are trained on:
-The Code Suggestions model is not trained on GitLab customer or user data.
+> Codey is our family of foundational coding models built on PaLM 2. Codey was fine-tuned on a large dataset of high quality, permissively licensed code from external sources
## Progressive enhancement
-This feature is designed as a progressive enhancement to developers IDEs.
+This feature is designed as a progressive enhancement to developer's IDEs.
Code Suggestions offer a completion if the machine learning engine can generate a recommendation.
In the event of a connection issue or model inference failure, the feature gracefully degrades.
Code Suggestions do not prevent you from writing code in your IDE.
@@ -203,25 +244,16 @@ To use Code Suggestions:
- On GitLab.com, you must have an internet connection and be able to access GitLab.
- In GitLab 16.1 and later, on self-managed GitLab, you must have an internet connection.
-[Self-managed support via a proxy to GitLab.com](https://gitlab.com/groups/gitlab-org/-/epics/10528) has been proposed.
-
### Model accuracy and quality
-Regardless of whether third-party AI services are enabled, while in Beta, Code Suggestions can generate low-quality, incomplete, and possibly insecure code.
+Code Suggestions can generate low-quality, incomplete, and possibly insecure code.
We strongly encourage all beta users to leverage GitLab native
[Code Quality Scanning](../../../ci/testing/code_quality.md) and
[Security Scanning](../../application_security/index.md) capabilities.
-GitLab uses a customized open source dataset to fine-tune the model to support multiple languages.
-Based on the languages you code in, GitLab routes the request to a targeted inference and prompt engine
-to get relevant suggestions.
-
-GitLab is actively refining these models to:
-
-- Improve the quality of recommendations.
-- Add support for more languages.
-- Add protections to limit personal data, insecure code, and other unwanted behavior
- that the model may have learned from training data.
+GitLab currently does not retrain Google Vertex AI Codey APIs. GitLab makes no claims
+to the accuracy or quality of code suggestions generated by Google Vertex AI Codey API.
+Read more about [Google Vertex AI foundation model capabilities](https://cloud.google.com/vertex-ai/docs/generative-ai/learn/models).
## Known limitations
@@ -243,3 +275,64 @@ We are also aware of specific situations that can produce unexpected or incohere
## Feedback
Report issues in the [feedback issue](https://gitlab.com/gitlab-org/gitlab/-/issues/405152).
+
+## Troubleshooting
+
+### Code Suggestions aren't displayed
+
+If Code Suggestions are not displayed, try the following troubleshooting steps.
+
+In GitLab, ensure Code Suggestions is enabled:
+
+- [For your user account](#enable-code-suggestions-for-an-individual-user).
+- [For *all* top-level groups your account belongs to](../../group/manage.md#enable-code-suggestions). If you don't have a role that lets you view the top-level group's settings, contact a group owner.
+
+To confirm that your account is enabled, go to [https://gitlab.com/api/v4/ml/ai-assist](https://gitlab.com/api/v4/ml/ai-assist). A response of `user_is_allowed` should return `true`.
+
+#### Code Suggestions not displayed in VS Code or GitLab WebIDE
+
+Check all the steps in [Code Suggestions aren't displayed](#code-suggestions-arent-displayed) first.
+
+If you are a self-managed user, ensure that Code Suggestions for the [GitLab WebIDE](../../project/web_ide/index.md) are enabled. The same settings apply to VS Code as local IDE.
+
+1. On the left sidebar, select **Extensions > GitLab Workflow**.
+1. Select **Settings** (**{settings}**), and then select **Extension Settings**.
+1. In **GitLab > AI Assisted Code Suggestions**, select the **Enable code completion (Beta)**
+ checkbox.
+
+If the settings are enabled, but Code Suggestions are still not displayed, try the following steps:
+
+1. Enable the `Debug` checkbox in the GitLab Workflow **Extension Settings**.
+1. Open the extension log in **View > Output** and change the dropdown list to **GitLab Workflow** as the log filter. The command palette command is `GitLab: Show Extension Logs`.
+1. Disable and re-enable the **Enable code completion (Beta)** checkbox.
+1. Verify that the debug log contains similar output:
+
+```shell
+2023-07-14T17:29:00:763 [debug]: Disabling code completion
+2023-07-14T17:29:01:802 [debug]: Enabling code completion
+2023-07-14T17:29:01:802 [debug]: AI Assist: Using server: https://codesuggestions.gitlab.com/v2/completions
+```
+
+#### Code Suggestions not displayed in Microsoft Visual Studio
+
+Check all the steps in [Code Suggestions aren't displayed](#code-suggestions-arent-displayed) first.
+
+1. Ensure you have properly [set up the extension](https://gitlab.com/gitlab-org/editor-extensions/gitlab-visual-studio-extension#setup).
+1. From the **Tools > Options** menu, find the **GitLab** option. Ensure **Log Level** is set to **Debug**.
+1. Open the extension log in **View > Output** and change the dropdown list to **GitLab Extension** as the log filter.
+1. Verify that the debug log contains similar output:
+
+```shell
+14:48:21:344 GitlabProposalSource.GetCodeSuggestionAsync
+14:48:21:344 LsClient.SendTextDocumentCompletionAsync("GitLab.Extension.Test\TestData.cs", 34, 0)
+14:48:21:346 LS(55096): time="2023-07-17T14:48:21-05:00" level=info msg="update context"
+```
+
+### Authentication troubleshooting
+
+If the above steps do not solve your issue, the problem may be related to the recent changes in authentication,
+specifically the token system. To resolve the issue:
+
+1. Remove the existing personal access token from your GitLab account settings.
+1. Reauthorize your GitLab account in VS Code using OAuth.
+1. Test the code suggestions feature with different file extensions to verify if the issue is resolved.
diff --git a/doc/user/project/repository/git_blame.md b/doc/user/project/repository/git_blame.md
index baac2a788be..235c1f34d1a 100644
--- a/doc/user/project/repository/git_blame.md
+++ b/doc/user/project/repository/git_blame.md
@@ -21,7 +21,7 @@ Prerequisites:
To view the blame for a file:
-1. Go to your project's **Repository > Files**.
+1. Go to your project's **Code > Repository**.
1. Select the file you want to review.
1. In the upper-right corner, select **Blame**.
diff --git a/doc/user/project/repository/git_history.md b/doc/user/project/repository/git_history.md
index a9228b8cabd..edfcc4b1dc2 100644
--- a/doc/user/project/repository/git_history.md
+++ b/doc/user/project/repository/git_history.md
@@ -11,7 +11,7 @@ description: "Documentation on Git file history."
Git file History provides information about the commit history associated
with a file. To use it:
-1. Go to your project's **Repository > Files**.
+1. Go to your project's **Code > Repository**.
1. In the upper-right corner, select **History**.
When you select **History**, this information is displayed:
diff --git a/doc/user/project/repository/gpg_signed_commits/index.md b/doc/user/project/repository/gpg_signed_commits/index.md
index 839ab33808b..8d8639400bd 100644
--- a/doc/user/project/repository/gpg_signed_commits/index.md
+++ b/doc/user/project/repository/gpg_signed_commits/index.md
@@ -119,7 +119,7 @@ If you don't already have a GPG key, create one:
To add a GPG key to your user settings:
1. Sign in to GitLab.
-1. In the upper-right corner, select your avatar.
+1. On the left sidebar, select your avatar.
1. Select **Edit profile**.
1. Select **GPG Keys** (**{key}**).
1. In **Key**, paste your _public_ key.
@@ -230,7 +230,7 @@ You can review commits for a merge request, or for an entire project:
1. Select **Code > Commits**.
1. To review commits for a merge request:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
- 1. Select **Merge requests**, then select your merge request.
+ 1. Select **Code > Merge requests**, then select your merge request.
1. Select **Commits**.
1. Identify the commit you want to review. Signed commits show either a **Verified**
or **Unverified** badge, depending on the verification status of the GPG
@@ -253,7 +253,7 @@ If a GPG key becomes compromised, revoke it. Revoking a key changes both future
To revoke a GPG key:
-1. In the upper-right corner, select your avatar.
+1. On the left sidebar, select your avatar.
1. Select **Edit profile**.
1. Select **GPG Keys** (**{key}**).
1. Select **Revoke** next to the GPG key you want to delete.
@@ -268,7 +268,7 @@ When you remove a GPG key from your GitLab account:
To remove a GPG key from your account:
-1. In the upper-right corner, select your avatar.
+1. On the left sidebar, select your avatar.
1. Select **Edit profile**.
1. Select **GPG Keys** (**{key}**).
1. Select **Remove** (**{remove}**) next to the GPG key you want to delete.
@@ -286,7 +286,7 @@ If you must unverify both future and past commits,
- [Managing OpenPGP Keys](https://riseup.net/en/security/message-security/openpgp/gpg-keys)
- [OpenPGP Best Practices](https://riseup.net/en/security/message-security/openpgp/best-practices)
- [Creating a new GPG key with subkeys](https://www.void.gr/kargig/blog/2013/12/02/creating-a-new-gpg-key-with-subkeys/) (advanced)
- - [Review existing GPG keys in your instance](../../../admin_area/credentials_inventory.md#review-existing-gpg-keys)
+ - [Review existing GPG keys in your instance](../../../../administration/credentials_inventory.md#review-existing-gpg-keys)
## Troubleshooting
diff --git a/doc/user/project/repository/index.md b/doc/user/project/repository/index.md
index 9f0c46591b9..7383772a45b 100644
--- a/doc/user/project/repository/index.md
+++ b/doc/user/project/repository/index.md
@@ -132,7 +132,7 @@ change. This can occur, for example, if Git or a third-party library that GitLab
## Repository languages
For the default branch of each repository, GitLab determines which programming languages
-are used. This information is displayed on the **Project information** page.
+are used. This information is displayed on the **Project overview** page.
![Repository Languages bar](img/repository_languages_v15_2.png)
@@ -140,7 +140,7 @@ When new files are added, this information can take up to five minutes to update
### Add repository languages
-Not all files are detected and listed on the **Project information** page. Documentation,
+Not all files are detected and listed on the **Project overview** page. Documentation,
vendor code, and most markup languages are excluded.
You can change this behavior by overriding the default settings.
@@ -224,10 +224,10 @@ To render an OpenAPI file:
FLAG:
On self-managed GitLab, by default GitLab uses the `du -sk` command to determine the size of a repository. GitLab can use either
`git-rev-list` (enabled with feature flag `gitaly_revlist_for_repo_size`) or `git-cat-file` (enabled with feature flag
-`gitaly_catfile_repo_size`) instead. To switch between different calculation methods, ask an administrator to
+`gitaly_catfile_repo_size`) instead. To switch between different calculation methods, an administrator can
[enable or disable](../../../administration/feature_flags.md) these feature flags.
-The **Project information** page shows the size of all files in the repository. The size is
+The **Project overview** page shows the size of all files in the repository. The size is
updated, at most, every 15 minutes. The file size includes repository files, artifacts, and LFS.
The size can differ slightly from one instance to another due to compression, housekeeping, and other factors.
@@ -237,7 +237,7 @@ Administrators can set a [repository size limit](../../admin_area/settings/accou
## Repository contributor statistics
-All code contributors are displayed under your project's **Repository > Contributor statistics**.
+All code contributors are displayed under your project's **Analyze > Contributor statistics**.
The graph shows the contributor with the most commits to the fewest.
@@ -248,7 +248,7 @@ The graph shows the contributor with the most commits to the fewest.
A repository graph displays a visual history of the repository network, including branches and merges.
This graph can help you visualize the Git flow strategy used in the repository.
-Go to your project's **Repository > Graph**.
+Go to your project's **Code > Repository graph**.
![repository Git flow](img/repo_graph.png)
diff --git a/doc/user/project/repository/mirror/index.md b/doc/user/project/repository/mirror/index.md
index 733310a0b4d..58c6c343282 100644
--- a/doc/user/project/repository/mirror/index.md
+++ b/doc/user/project/repository/mirror/index.md
@@ -80,13 +80,7 @@ To use this option, select **Only mirror protected branches** when you create a
> - Mirroring branches matching a regex [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/102608) in GitLab 15.8 [with a flag](../../../../administration/feature_flags.md) named `mirror_only_branches_match_regex`. Disabled by default.
> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/381667) in GitLab 16.0.
-
-FLAG:
-On self-managed GitLab, by default the field `mirror_branch_regex` is available.
-To hide the feature, ask an administrator to [disable the feature flag](../../../../administration/feature_flags.md)
-named `mirror_only_branches_match_regex`.
-On GitLab.com, this feature is available.
-
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/410354) in GitLab 16.2. Feature flag `mirror_only_branches_match_regex` removed.
To mirror only branches with names matching an [re2 regular expression](https://github.com/google/re2/wiki/Syntax),
enter a regular expression into the **Mirror specific branches** field. Branches with names that
do not match the regular expression are not mirrored.
@@ -101,6 +95,9 @@ You can also manually trigger an update:
- According to [the pull mirroring interval limit](../../../../administration/instance_limits.md#pull-mirroring-interval)
set by the administrator on self-managed instances.
+NOTE:
+[GitLab Silent Mode](../../../../administration/silent_mode/index.md) disables both push and pull updates.
+
### Force an update
While mirrors are scheduled to update automatically, you can force an immediate update unless:
@@ -209,8 +206,8 @@ Older versions of SSH may require you to remove `-E md5` from the command.
## Related topics
- Configure a [Pull Mirroring Interval](../../../../administration/instance_limits.md#pull-mirroring-interval)
-- [Disable mirrors for a project](../../../admin_area/settings/visibility_and_access_controls.md#enable-project-mirroring)
-- [Secrets file and mirroring](../../../../raketasks/backup_restore.md#when-the-secrets-file-is-lost)
+- [Disable mirrors for a project](../../../../administration/settings/visibility_and_access_controls.md#enable-project-mirroring)
+- [Secrets file and mirroring](../../../../administration/backup_restore/backup_gitlab.md#when-the-secrets-file-is-lost)
## Troubleshooting
@@ -224,11 +221,16 @@ If you receive this message while mirroring to a GitHub repository:
13:Received RST_STREAM with error code 2
```
-Your GitHub settings might be set to block pushes that expose your email address
-used in commits. To fix this problem, either:
+One of these issues might be occurring:
-- Set your GitHub email address to public.
-- Disable the [Block command line pushes that expose my email](https://github.com/settings/emails) setting.
+1. Your GitHub settings might be set to block pushes that expose your email address
+ used in commits. To fix this problem, either:
+ - Set your GitHub email address to public.
+ - Disable the [Block command line pushes that expose my email](https://github.com/settings/emails)
+ setting.
+1. Your repository exceeds GitHub's file size limit of 100 MB. To fix this problem,
+ check the file size limit configured for on GitHub, and consider using
+ [Git Large File Storage](https://git-lfs.github.com) to manage large files.
### Deadline Exceeded
@@ -320,7 +322,7 @@ fail nor succeed. They also do not leave a clear log. To check for this problem:
end
```
-1. After you run the command, the [background jobs page](../../../admin_area/index.md#background-jobs)
+1. After you run the command, the [background jobs page](../../../../administration/admin_area.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 1463e0de0f1..56e85157c03 100644
--- a/doc/user/project/repository/mirror/pull.md
+++ b/doc/user/project/repository/mirror/pull.md
@@ -15,13 +15,16 @@ branches, tags, and commits from an upstream repository to yours.
Unlike [push mirrors](push.md), pull mirrors retrieve changes from an upstream (remote)
repository on a scheduled basis. To prevent the mirror from diverging from the upstream
repository, don't push commits directly to the downstream mirror. Push commits to
-the upstream repository instead. Changes in the remote repository are pulled into the GitLab repository, either:
+the upstream repository instead. Changes in the remote repository are pulled into the GitLab repository:
-- Automatically in a certain period of time. Self-managed instances can
- configure [pull mirroring intervals](../../../../administration/instance_limits.md#pull-mirroring-interval).
+- Automatically, 30 minutes after a previous pull. This cannot be disabled.
- When an administrator [force-updates the mirror](index.md#force-an-update).
- When an [API call triggers an update](#trigger-an-update-by-using-the-api).
+UI and API updates are subject to default
+[pull mirroring intervals](../../../../administration/instance_limits.md#pull-mirroring-interval)
+of 5 minutes. This interval can be configured by self-managed instances.
+
By default, if any branch or tag on the downstream pull mirror diverges from the
local repository, GitLab stops updating the branch. This prevents data loss.
Deleted branches and tags in the upstream repository are not reflected in the
@@ -52,13 +55,14 @@ After you configure a GitLab repository as a pull mirror:
## Configure pull mirroring
-Prerequisite:
+Prerequisites:
- If your remote repository is on GitHub and you have
[two-factor authentication (2FA) configured](https://docs.github.com/en/authentication/securing-your-account-with-two-factor-authentication-2fa),
create a [personal access token for GitHub](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token)
with the `repo` scope. If 2FA is enabled, this personal access
token serves as your GitHub password.
+- [GitLab Silent Mode](../../../../administration/silent_mode/index.md) is not enabled.
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
1. Select **Settings > Repository**.
diff --git a/doc/user/project/repository/mirror/push.md b/doc/user/project/repository/mirror/push.md
index 9da8ce7acc5..26a60002f0e 100644
--- a/doc/user/project/repository/mirror/push.md
+++ b/doc/user/project/repository/mirror/push.md
@@ -30,6 +30,9 @@ it is deleted from the remote mirror on the next push. Branches with unmerged
changes are kept. If a branch diverges, the **Mirroring repositories** section
displays an error.
+[GitLab Silent Mode](../../../../administration/silent_mode/index.md) disables pushing to,
+and pulling from, remote mirrors.
+
## Configure push mirroring
To set up push mirroring for an existing project:
@@ -77,8 +80,12 @@ through the [remote mirrors API](../../../../api/remote_mirrors.md).
To configure a mirror from GitLab to GitHub:
-1. Create a [GitHub personal access token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token)
- with `public_repo` selected.
+1. Create a [GitHub fine-grained personal access token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#fine-grained-personal-access-tokens)
+ with at least read and write permissions on the [repository contents](https://docs.github.com/en/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-contents). If your
+ repository contains a `.github/workflows` directory, you must also grant
+ read and write access for the [Workflows](https://docs.github.com/en/rest/overview/permissions-required-for-fine-grained-personal-access-tokens#repository-permissions-for-workflows).
+ For a more fine-grained access, you can configure your token to only apply
+ to the specific repository.
1. Enter a **Git repository URL** with this format, changing the variables as needed:
```plaintext
diff --git a/doc/user/project/repository/push_rules.md b/doc/user/project/repository/push_rules.md
index fbadc9b84a3..81896d64815 100644
--- a/doc/user/project/repository/push_rules.md
+++ b/doc/user/project/repository/push_rules.md
@@ -71,11 +71,13 @@ Use these rules for your commit messages.
- **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)`.
+ Uses multiline mode, which can be disabled by using `(?-m)`. Some validation examples:
+
+ - `JIRA\-\d+` requires every commit to reference a Jira issue, like `Refactored css. Fixes JIRA-123`.
+ - `[[:^punct:]]\b$` rejects a commit if the final character is a punctuation mark.
+ The word boundary character (`\b`) prevents false negatives, because Git adds a
+ newline character (`\n`) to the end of the commit message.
- 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)`.
@@ -230,7 +232,7 @@ These examples use regex (regular expressions) string boundary characters to mat
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 use them as standard characters in a match condition.
- **Prevent pushing `.exe` files to any location in the repository** - This regex
matches any filename that contains `.exe` at the end:
diff --git a/doc/user/project/repository/reducing_the_repo_size_using_git.md b/doc/user/project/repository/reducing_the_repo_size_using_git.md
index ce3a5ee9916..334db91cd82 100644
--- a/doc/user/project/repository/reducing_the_repo_size_using_git.md
+++ b/doc/user/project/repository/reducing_the_repo_size_using_git.md
@@ -235,8 +235,8 @@ When using repository cleanup, note:
Repository size limits:
-- Can [be set by an administrator](../../admin_area/settings/account_and_limit_settings.md#account-and-limit-settings).
-- Can [be set by an administrator](../../admin_area/settings/account_and_limit_settings.md) on self-managed instances.
+- Can [be set by an administrator](../../../administration/settings/account_and_limit_settings.md#account-and-limit-settings).
+- Can [be set by an administrator](../../../administration/settings/account_and_limit_settings.md) on self-managed instances.
- Are [set for GitLab.com](../../gitlab_com/index.md#account-and-limit-settings).
When a project has reached its size limit, you cannot:
diff --git a/doc/user/project/repository/ssh_signed_commits/index.md b/doc/user/project/repository/ssh_signed_commits/index.md
index 8f29845fd9b..85a8917022e 100644
--- a/doc/user/project/repository/ssh_signed_commits/index.md
+++ b/doc/user/project/repository/ssh_signed_commits/index.md
@@ -169,7 +169,7 @@ If an SSH key becomes compromised, revoke it. Revoking a key changes both future
To revoke an SSH key:
-1. In the upper-right corner, select your avatar.
+1. On the left sidebar, select your avatar.
1. Select **Edit profile**.
1. On the left sidebar, select (**{key}**) **SSH Keys**.
1. Select **Revoke** next to the SSH key you want to delete.
diff --git a/doc/user/project/requirements/index.md b/doc/user/project/requirements/index.md
index b8e9de41062..4079f821064 100644
--- a/doc/user/project/requirements/index.md
+++ b/doc/user/project/requirements/index.md
@@ -49,7 +49,7 @@ Prerequisite:
To create a requirement:
-1. In a project, go to **Issues > Requirements**.
+1. In a project, go to **Plan > Requirements**.
1. Select **New requirement**.
1. Enter a title and description and select **Create requirement**.
@@ -124,7 +124,7 @@ You can search for a requirement from the requirements list page based on the fo
To search for a requirement:
-1. In a project, go to **Issues > Requirements > List**.
+1. In a project, go to **Plan > Requirements > List**.
1. Select the **Search or filter results** field. A dropdown list appears.
1. Select the requirement author or status from the dropdown list or enter plain text to search by requirement title.
1. Press <kbd>Enter</kbd> on your keyboard to filter the list.
@@ -239,7 +239,7 @@ Before you import your file:
To import requirements:
-1. In a project, go to **Issues > Requirements**.
+1. In a project, go to **Plan > Requirements**.
- For a project with requirements, in the
upper-right corner, select the import icon (**{import}**).
- For a project without requirements, in the middle of the page, select **Import CSV**.
@@ -300,7 +300,7 @@ Prerequisite:
To export requirements:
-1. In a project, go to **Issues > Requirements**.
+1. In a project, go to **Plan > Requirements**.
1. In the upper-right corner, select **Export as CSV** (**{export}**).
A confirmation modal appears.
diff --git a/doc/user/project/service_desk.md b/doc/user/project/service_desk.md
index 8d525965f96..b508fbcf676 100644
--- a/doc/user/project/service_desk.md
+++ b/doc/user/project/service_desk.md
@@ -43,8 +43,8 @@ Meanwhile:
## Configure Service Desk
-To start using Service Desk for a project, you must first turn it on.
-By default, Service Desk is turned off.
+By default, Service Desk is active in new projects.
+If it's not active, you can do it in the project's settings.
Prerequisites:
@@ -64,7 +64,7 @@ To enable Service Desk in your project:
1. Expand **Service Desk**.
1. Turn on the **Activate Service Desk** toggle.
1. Optional. Complete the fields.
- - [Add a suffix](#configure-a-custom-email-address-suffix) to your Service Desk email address.
+ - [Add a suffix](#configure-a-suffix-for-service-desk-alias-email) to your Service Desk email address.
- If the list below **Template to append to all Service Desk issues** is empty, create a
[description template](description_templates.md) in your repository.
1. Select **Save changes**.
@@ -81,81 +81,73 @@ To improve your Service Desk project's security, you should:
- [Enable Akismet](../../integration/akismet.md) on your GitLab instance to add spam checking to this service.
Unblocked email spam can result in many spam issues being created.
-### Create customized email templates
+### Customize emails sent to the requester
> - Moved from GitLab Premium to GitLab Free in 13.2.
> - `UNSUBSCRIBE_URL`, `SYSTEM_HEADER`, `SYSTEM_FOOTER`, and `ADDITIONAL_TEXT` placeholders [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/285512) in GitLab 15.9.
+> - `%{ISSUE_DESCRIPTION}` [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/223751) in GitLab 16.0.
+> - `%{ISSUE_URL}` [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/408793) in GitLab 16.1.
-An email is sent to the author when:
-
-- A user submits a new issue using Service Desk.
-- A new note is created on a Service Desk issue.
-
-You can customize the body of these email messages with templates.
+An email is sent to the requester when:
-#### Email header and footer **(FREE SELF)**
+- A requester submits a new ticket by emailing Service Desk.
+- A new public comment is added on a Service Desk ticket.
+ - Editing a comment does not trigger a new email to be sent.
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/344819) in GitLab 15.9.
+You can customize the body of these email messages with Service Desk email templates. The templates
+can include [GitLab Flavored Markdown](../markdown.md) and [some HTML tags](../markdown.md#inline-html).
+For example, you can format the emails to include a header and footer in accordance with your
+organization's brand guidelines. You can also include the following placeholders to display dynamic
+content specific to the Service Desk ticket or your GitLab instance.
-Instance administrators can add a small header or footer to the GitLab instance and make them
-visible in the email template. For more information, see
-[System header and footer messages](../admin_area/appearance.md#system-header-and-footer-messages).
+| Placeholder | `thank_you.md` | `new_note.md` | Description
+| ---------------------- | ---------------------- | ---------------------- | -----------
+| `%{ISSUE_ID}` | **{check-circle}** Yes | **{check-circle}** Yes | Ticket IID.
+| `%{ISSUE_PATH}` | **{check-circle}** Yes | **{check-circle}** Yes | Project path appended with the ticket IID.
+| `%{ISSUE_URL}` | **{check-circle}** Yes | **{check-circle}** Yes | URL of the ticket. External participants can only view the ticket if the project is public and ticket is not confidential (Service Desk tickets are confidential by default).
+| `%{ISSUE_DESCRIPTION}` | **{check-circle}** Yes | **{check-circle}** Yes | Ticket description. If a user has edited the description, it may contain sensitive information that is not intended to be delivered to external participants. Use this placeholder with care and ideally only if you never modify descriptions or your team is aware of the template design.
+| `%{UNSUBSCRIBE_URL}` | **{check-circle}** Yes | **{check-circle}** Yes | Unsubscribe URL.
+| `%{NOTE_TEXT}` | **{dotted-circle}** No | **{check-circle}** Yes | The new comment added to the ticket by a user. Take care to include this placeholder in `new_note.md`. Otherwise, the requesters may never see the updates on their Service Desk ticket.
#### Thank you email
-> - `%{ISSUE_DESCRIPTION}` [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/223751) in GitLab 16.0.
-> - `%{ISSUE_URL}` [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/408793) in GitLab 16.1.
-
-When a user submits an issue through Service Desk, GitLab sends a **thank you email**.
+When a requester submits an issue through Service Desk, GitLab sends a **thank you email**.
+Without additional configuration, GitLab sends the default thank you email.
-To create a custom email template, in the `.gitlab/service_desk_templates/`
-directory in your repository, create a file named `thank_you.md`.
+To create a custom thank you email template:
-You can use these placeholders to be automatically replaced in each email:
+1. In the `.gitlab/service_desk_templates/` directory of your repository, create a file named `thank_you.md`.
+1. Populate the Markdown file with text, [GitLab Flavored Markdown](../markdown.md),
+ [some selected HTML tags](../markdown.md#inline-html), and placeholders to customize the reply
+ to Service Desk requesters.
-- `%{ISSUE_ID}`: Issue IID.
-- `%{ISSUE_PATH}`: Project path appended with the issue IID.
-- `%{ISSUE_URL}`: URL to the issue. External participants can only view the issue if the project is public
- and issue is not confidential (Service Desk issues are confidential by default).
-- `%{ISSUE_DESCRIPTION}`: Issue description based on the original email.
-- `%{UNSUBSCRIBE_URL}`: Unsubscribe URL.
-- `%{SYSTEM_HEADER}`: [System header message](../admin_area/appearance.md#system-header-and-footer-messages).
-- `%{SYSTEM_FOOTER}`: [System footer message](../admin_area/appearance.md#system-header-and-footer-messages).
-- `%{ADDITIONAL_TEXT}`: [Custom additional text](../admin_area/settings/email.md#custom-additional-text).
+#### New note email
-Because Service Desk issues are created as [confidential](issues/confidential_issues.md) (only project members can see them),
-the response email does not contain the issue link.
+When a Service Desk ticket has a new public comment, GitLab sends a **new note email**.
+Without additional configuration, GitLab sends the content of the comment.
-#### New note email
+To keep your emails on brand, you can create a custom new note email template. To do so:
-> - `%{ISSUE_DESCRIPTION}` [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/223751) in GitLab 16.0.
-> - `%{ISSUE_URL}` [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/408793) in GitLab 16.1.
+1. In the `.gitlab/service_desk_templates/` directory in your repository, create a file named `new_note.md`.
+1. Populate the Markdown file with text, [GitLab Flavored Markdown](../markdown.md),
+ [some selected HTML tags](../markdown.md#inline-html), and placeholders to customize the new note
+ email. Be sure to include the `%{NOTE_TEXT}` in the template to make sure the email recipient can
+ read the contents of the comment.
-When a user-submitted issue receives a new comment, GitLab sends a **new note email**.
+#### Instance-level email header, footer, and additional text **(FREE SELF)**
-To create a custom email template, in the `.gitlab/service_desk_templates/`
-directory in your repository, create a file named `new_note.md`.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/344819) in GitLab 15.9.
-You can use these placeholders to be automatically replaced in each email:
+Instance administrators can add a header, footer or additional text to the GitLab instance and apply
+them to all emails sent from GitLab. If you're using a custom `thank_you.md` or `new_note.md`, to include
+this content, add `%{SYSTEM_HEADER}`, `%{SYSTEM_FOOTER}`, or `%{ADDITIONAL_TEXT}` to your templates.
-- `%{ISSUE_ID}`: Issue IID.
-- `%{ISSUE_PATH}`: Project path appended with the issue IID.
-- `%{ISSUE_URL}`: URL to the issue. External participants can only view the issue if the project is public
- and issue is not confidential (Service Desk issues are confidential by default).
-- `%{ISSUE_DESCRIPTION}`: Issue description at the time email is generated.
- If a user has edited the description, it might contain sensitive information that is not intended
- to be delivered to external participants. Use this placeholder only if you never modify
- descriptions or your team is aware of the template design.
-- `%{NOTE_TEXT}`: Note text.
-- `%{UNSUBSCRIBE_URL}`: Unsubscribe URL.
-- `%{SYSTEM_HEADER}`: [System header message](../admin_area/appearance.md#system-header-and-footer-messages).
-- `%{SYSTEM_FOOTER}`: [System footer message](../admin_area/appearance.md#system-header-and-footer-messages).
-- `%{ADDITIONAL_TEXT}`: [Custom additional text](../admin_area/settings/email.md#custom-additional-text).
+For more information, see [System header and footer messages](../../administration/appearance.md#system-header-and-footer-messages) and [custom additional text](../../administration/settings/email.md#custom-additional-text).
-### Use a custom template for Service Desk issues
+### Use a custom template for Service Desk tickets
You can select one [description template](description_templates.md#create-an-issue-template)
-**per project** to be appended to every new Service Desk issue's description.
+**per project** to be appended to every new Service Desk ticket's description.
You can set description templates at various levels:
@@ -200,27 +192,26 @@ To edit the custom email display name:
1. Below **Email display name**, enter a new name.
1. Select **Save changes**.
-### Use a custom email address **(FREE SELF)**
+### Use an additional Service Desk alias email **(FREE SELF)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/2201) in GitLab 13.0.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/284656) in GitLab 13.8.
-You can use a custom email address with Service Desk.
+You can use an additional alias email address for Service Desk on an instance level.
To do this, you must configure
-a [custom mailbox](#configure-a-custom-mailbox). You can also configure a
-[custom suffix](#configure-a-custom-email-address-suffix).
+a [`service_desk_email`](#configure-service-desk-alias-email) in the instance configuration. You can also configure a
+[custom suffix](#configure-a-suffix-for-service-desk-alias-email) that replaces the default `-issue-` portion on the sub-addressing part.
-#### Configure a custom mailbox
+#### Configure Service Desk alias email
NOTE:
-On GitLab.com a custom mailbox is already configured with `contact-project+%{key}@incoming.gitlab.com` as the email address, you can still configure the
-[custom suffix](#configure-a-custom-email-address-suffix) in project settings.
+On GitLab.com a custom mailbox is already configured with `contact-project+%{key}@incoming.gitlab.com` as the email address. You can still configure the
+[custom suffix](#configure-a-suffix-for-service-desk-alias-email) in project settings.
Service Desk uses the [incoming email](../../administration/incoming_email.md)
-configuration by default. However, by using the `service_desk_email` configuration,
-you can customize the mailbox used by Service Desk. This allows you to have
-a separate email address for Service Desk by also configuring a [custom suffix](#configure-a-custom-email-address-suffix)
+configuration by default. However, to have a separate email address for Service Desk,
+configure `service_desk_email` with a [custom suffix](#configure-a-suffix-for-service-desk-alias-email)
in project settings.
Prerequisites:
@@ -413,14 +404,19 @@ read about [Helm IMAP secrets](https://docs.gitlab.com/charts/installation/secre
##### Microsoft Graph
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/214900) in GitLab 13.11.
> - Alternative Azure deployments [introduced](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/5978) in GitLab 14.9.
+> - [Introduced for self-compiled (source) installs](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/116494) in GitLab 15.11.
-Service Desk can be configured to read Microsoft Exchange Online mailboxes with the Microsoft
+`service_desk_email` can be configured to read Microsoft Exchange Online mailboxes with the Microsoft
Graph API instead of IMAP. Set up an OAuth 2.0 application for Microsoft Graph
[the same way as for incoming email](../../administration/incoming_email.md#microsoft-graph).
-- Example for Linux package installations:
+::Tabs
+
+:::TabTitle Linux package (Omnibus)
+
+1. Edit `/etc/gitlab/gitlab.rb` and add the following lines, substituting
+ the values you want:
```ruby
gitlab_rails['service_desk_email_enabled'] = true
@@ -430,33 +426,200 @@ Graph API instead of IMAP. Set up an OAuth 2.0 application for Microsoft Graph
gitlab_rails['service_desk_email_log_file'] = "/var/log/gitlab/mailroom/mail_room_json.log"
gitlab_rails['service_desk_email_inbox_method'] = 'microsoft_graph'
gitlab_rails['service_desk_email_inbox_options'] = {
- 'tenant_id': '<YOUR-TENANT-ID>',
- 'client_id': '<YOUR-CLIENT-ID>',
- 'client_secret': '<YOUR-CLIENT-SECRET>',
- 'poll_interval': 60 # Optional
+ 'tenant_id': '<YOUR-TENANT-ID>',
+ 'client_id': '<YOUR-CLIENT-ID>',
+ 'client_secret': '<YOUR-CLIENT-SECRET>',
+ 'poll_interval': 60 # Optional
+ }
+ ```
+
+ For Microsoft Cloud for US Government or [other Azure deployments](https://learn.microsoft.com/en-us/graph/deployments),
+ configure the `azure_ad_endpoint` and `graph_endpoint` settings. For example:
+
+ ```ruby
+ gitlab_rails['service_desk_email_inbox_options'] = {
+ 'azure_ad_endpoint': 'https://login.microsoftonline.us',
+ 'graph_endpoint': 'https://graph.microsoft.us',
+ 'tenant_id': '<YOUR-TENANT-ID>',
+ 'client_id': '<YOUR-CLIENT-ID>',
+ 'client_secret': '<YOUR-CLIENT-SECRET>',
+ 'poll_interval': 60 # Optional
}
```
+:::TabTitle Helm chart (Kubernetes)
+
+1. Create the [Kubernetes Secret containing the OAuth 2.0 application client secret](https://docs.gitlab.com/charts/installation/secrets.html#microsoft-graph-client-secret-for-service-desk-emails):
+
+ ```shell
+ kubectl create secret generic service-desk-email-client-secret --from-literal=secret=<YOUR-CLIENT_SECRET>
+ ```
+
+1. Create the [Kubernetes Secret for the GitLab Service Desk email auth token](https://docs.gitlab.com/charts/installation/secrets.html#gitlab-service-desk-email-auth-token).
+ Replace `<name>` with the name of the [Helm release name](https://helm.sh/docs/intro/using_helm/) for the GitLab installation:
+
+ ```shell
+ kubectl create secret generic <name>-service-desk-email-auth-token --from-literal=authToken=$(head -c 512 /dev/urandom | LC_CTYPE=C tr -cd 'a-zA-Z0-9' | head -c 32 | base64)
+ ```
+
+1. Export the Helm values:
+
+ ```shell
+ helm get values gitlab > gitlab_values.yaml
+ ```
+
+1. Edit `gitlab_values.yaml`:
+
+ ```yaml
+ global:
+ appConfig:
+ serviceDeskEmail:
+ enabled: true
+ address: "project_contact+%{key}@example.onmicrosoft.com"
+ user: "project_contact@example.onmicrosoft.com"
+ mailbox: inbox
+ inboxMethod: microsoft_graph
+ azureAdEndpoint: https://login.microsoftonline.com
+ graphEndpoint: https://graph.microsoft.com
+ tenantId: "YOUR-TENANT-ID"
+ clientId: "YOUR-CLIENT-ID"
+ clientSecret:
+ secret: service-desk-email-client-secret
+ key: secret
+ deliveryMethod: webhook
+ authToken:
+ secret: <name>-service-desk-email-auth-token
+ key: authToken
+ ```
+
+ For Microsoft Cloud for US Government or [other Azure deployments](https://learn.microsoft.com/en-us/graph/deployments),
+configure the `azureAdEndpoint` and `graphEndpoint` settings. These fields are case-sensitive:
+
+ ```yaml
+ global:
+ appConfig:
+ serviceDeskEmail:
+ [..]
+ azureAdEndpoint: https://login.microsoftonline.us
+ graphEndpoint: https://graph.microsoft.us
+ [..]
+ ```
+
+1. Save the file and apply the new values:
+
+ ```shell
+ helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
+ ```
+
+:::TabTitle Docker
+
+1. Edit `docker-compose.yml`:
+
+ ```yaml
+ version: "3.6"
+ services:
+ gitlab:
+ environment:
+ GITLAB_OMNIBUS_CONFIG: |
+ gitlab_rails['service_desk_email_enabled'] = true
+ gitlab_rails['service_desk_email_address'] = "project_contact+%{key}@example.onmicrosoft.com"
+ gitlab_rails['service_desk_email_email'] = "project_contact@example.onmicrosoft.com"
+ gitlab_rails['service_desk_email_mailbox_name'] = "inbox"
+ gitlab_rails['service_desk_email_log_file'] = "/var/log/gitlab/mailroom/mail_room_json.log"
+ gitlab_rails['service_desk_email_inbox_method'] = 'microsoft_graph'
+ gitlab_rails['service_desk_email_inbox_options'] = {
+ 'tenant_id': '<YOUR-TENANT-ID>',
+ 'client_id': '<YOUR-CLIENT-ID>',
+ 'client_secret': '<YOUR-CLIENT-SECRET>',
+ 'poll_interval': 60 # Optional
+ }
+ ```
+
+1. Save the file and restart GitLab:
+
+ ```shell
+ docker compose up -d
+ ```
+
For Microsoft Cloud for US Government or [other Azure deployments](https://learn.microsoft.com/en-us/graph/deployments),
-configure the `azure_ad_endpoint` and `graph_endpoint` settings.
+configure the `azure_ad_endpoint` and `graph_endpoint` settings:
-- Example for Microsoft Cloud for US Government:
+1. Edit `docker-compose.yml`:
-```ruby
-gitlab_rails['service_desk_email_inbox_options'] = {
- 'azure_ad_endpoint': 'https://login.microsoftonline.us',
- 'graph_endpoint': 'https://graph.microsoft.us',
- 'tenant_id': '<YOUR-TENANT-ID>',
- 'client_id': '<YOUR-CLIENT-ID>',
- 'client_secret': '<YOUR-CLIENT-SECRET>',
- 'poll_interval': 60 # Optional
-}
-```
+ ```yaml
+ version: "3.6"
+ services:
+ gitlab:
+ environment:
+ GITLAB_OMNIBUS_CONFIG: |
+ gitlab_rails['service_desk_email_enabled'] = true
+ gitlab_rails['service_desk_email_address'] = "project_contact+%{key}@example.onmicrosoft.com"
+ gitlab_rails['service_desk_email_email'] = "project_contact@example.onmicrosoft.com"
+ gitlab_rails['service_desk_email_mailbox_name'] = "inbox"
+ gitlab_rails['service_desk_email_log_file'] = "/var/log/gitlab/mailroom/mail_room_json.log"
+ gitlab_rails['service_desk_email_inbox_method'] = 'microsoft_graph'
+ gitlab_rails['service_desk_email_inbox_options'] = {
+ 'azure_ad_endpoint': 'https://login.microsoftonline.us',
+ 'graph_endpoint': 'https://graph.microsoft.us',
+ 'tenant_id': '<YOUR-TENANT-ID>',
+ 'client_id': '<YOUR-CLIENT-ID>',
+ 'client_secret': '<YOUR-CLIENT-SECRET>',
+ 'poll_interval': 60 # Optional
+ }
+ ```
+
+1. Save the file and restart GitLab:
+
+ ```shell
+ docker compose up -d
+ ```
+
+:::TabTitle Self-compiled (source)
-The Microsoft Graph API is not yet supported in source installations.
-For more information, see [issue 326169](https://gitlab.com/gitlab-org/gitlab/-/issues/326169).
+1. Edit `/home/git/gitlab/config/gitlab.yml`:
+
+ ```yaml
+ service_desk_email:
+ enabled: true
+ address: "project_contact+%{key}@example.onmicrosoft.com"
+ user: "project_contact@example.onmicrosoft.com"
+ mailbox: "inbox"
+ delivery_method: webhook
+ log_path: "log/mailroom.log"
+ secret_file: .gitlab-mailroom-secret
+ inbox_method: "microsoft_graph"
+ inbox_options:
+ tenant_id: "<YOUR-TENANT-ID>"
+ client_id: "<YOUR-CLIENT-ID>"
+ client_secret: "<YOUR-CLIENT-SECRET>"
+ poll_interval: 60 # Optional
+ ```
+
+ For Microsoft Cloud for US Government or [other Azure deployments](https://learn.microsoft.com/en-us/graph/deployments),
+ configure the `azure_ad_endpoint` and `graph_endpoint` settings. For example:
+
+ ```yaml
+ service_desk_email:
+ enabled: true
+ address: "project_contact+%{key}@example.onmicrosoft.com"
+ user: "project_contact@example.onmicrosoft.com"
+ mailbox: "inbox"
+ delivery_method: webhook
+ log_path: "log/mailroom.log"
+ secret_file: .gitlab-mailroom-secret
+ inbox_method: "microsoft_graph"
+ inbox_options:
+ azure_ad_endpoint: "https://login.microsoftonline.us"
+ graph_endpoint: "https://graph.microsoft.us"
+ tenant_id: "<YOUR-TENANT-ID>"
+ client_id: "<YOUR-CLIENT-ID>"
+ client_secret: "<YOUR-CLIENT-SECRET>"
+ poll_interval: 60 # Optional
+ ```
+
+::EndTabs
-#### Configure a custom email address suffix
+#### Configure a suffix for Service Desk alias email
You can set a custom suffix in your project's Service Desk settings.
@@ -467,7 +630,7 @@ When configured, the custom suffix creates a new Service Desk email address, con
Prerequisites:
-- You must have configured a [custom mailbox](#configure-a-custom-mailbox).
+- You must have configured a [Service Desk alias email](#configure-service-desk-alias-email).
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
1. Select **Settings > General**.
@@ -702,7 +865,7 @@ HTML emails show HTML formatting, such as:
> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/386860) in GitLab 15.10.
FLAG:
-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](../../administration/feature_flags.md) named `service_desk_new_note_email_native_attachments`.
+On self-managed GitLab, by default this feature is available. To hide the feature per project or for your entire instance, an administrator can [disable the feature flag](../../administration/feature_flags.md) named `service_desk_new_note_email_native_attachments`.
On GitLab.com, this feature is available.
If a comment contains any attachments and their total size is less than or equal to 10 MB, these
diff --git a/doc/user/project/settings/import_export.md b/doc/user/project/settings/import_export.md
index 6cc2b51f077..8330b8c14bc 100644
--- a/doc/user/project/settings/import_export.md
+++ b/doc/user/project/settings/import_export.md
@@ -79,7 +79,7 @@ For example:
Before you can migrate projects on a self-managed GitLab instance using file exports, GitLab administrators must:
-1. [Enable file exports](../../admin_area/settings/visibility_and_access_controls.md#enable-project-export) on the source
+1. [Enable file exports](../../../administration/settings/visibility_and_access_controls.md#enable-project-export) on the source
instance.
1. Enable file exports as an import source for the destination instance. On GitLab.com, file exports are already enabled
as an import source.
@@ -186,7 +186,7 @@ Items that are **not** exported include:
- Links to related merge requests
Migrating projects with file exports uses the same export and import mechanisms as creating projects from templates at the [group](../../group/custom_project_templates.md) and
-[instance](../../admin_area/custom_project_templates.md) levels. Therefore, the list of exported items is the same.
+[instance](../../../administration/custom_project_templates.md) levels. Therefore, the list of exported items is the same.
## Import a project and its data
@@ -243,7 +243,7 @@ If you have a larger project, consider [using a Rake task](../../../administrati
Administrators can set the maximum import file size one of two ways:
- With the `max_import_size` option in the [Application settings API](../../../api/settings.md#change-application-settings).
-- In the [Admin Area UI](../../admin_area/settings/account_and_limit_settings.md#max-import-size).
+- In the [Admin Area UI](../../../administration/settings/account_and_limit_settings.md#max-import-size).
The default is `0` (unlimited).
diff --git a/doc/user/project/settings/index.md b/doc/user/project/settings/index.md
index 8deb05c45ef..4a7e7d2fe7d 100644
--- a/doc/user/project/settings/index.md
+++ b/doc/user/project/settings/index.md
@@ -41,26 +41,16 @@ To assign topics to a project:
1. Select **Save changes**.
If you're an instance administrator, you can administer all project topics from the
-[Admin Area's Topics page](../../admin_area/index.md#administering-topics).
+[Admin Area's Topics page](../../../administration/admin_area.md#administering-topics).
-## Add a compliance framework to a project **(PREMIUM)**
-
-[Compliance frameworks](../../group/compliance_frameworks.md) can be assigned to projects within group that has a
-compliance framework using either:
+NOTE:
+The assigned topics are visible only to users with access to the project, but everyone can see which topics exist on the GitLab instance. Do not include sensitive information in the name of a topic.
-- The GitLab UI:
- 1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
- 1. Select **Settings** > **General**.
- 1. Expand **Compliance frameworks**.
- 1. Select a compliance framework.
- 1. Select **Save changes**.
-- In [GitLab 14.2](https://gitlab.com/gitlab-org/gitlab/-/issues/333249) and later, using the
- [GraphQL API](../../../api/graphql/reference/index.md#mutationprojectsetcomplianceframework). If you create
- compliance frameworks on subgroups with GraphQL, the framework is created on the root ancestor if the user has the
- correct permissions. The GitLab UI presents a read-only view to discourage this behavior.
+## Add a compliance framework to a project **(PREMIUM)**
-NOTE:
-Frameworks can not be added to projects in personal namespaces.
+You can
+[add compliance frameworks to projects](../../group/compliance_frameworks.md#add-a-compliance-framework-to-a-project)
+in a group that has a compliance framework.
## Configure project visibility, features, and permissions
@@ -94,7 +84,6 @@ Use the toggles to enable or disable features in the project.
| **Wiki** | **{check-circle}** Yes | Enables a separate system for [documentation](../wiki/index.md).
| **Snippets** | **{check-circle}** Yes | Enables [sharing of code and text](../../snippets.md).
| **Pages** | **{check-circle}** Yes | Allows you to [publish static websites](../pages/index.md).
-| **Metrics Dashboard** | **{check-circle}** Yes | Control access to [metrics dashboard](../integrations/prometheus.md).
| **Releases** | **{check-circle}** Yes | Control access to [Releases](../releases/index.md).
| **Environments** | **{check-circle}** Yes | Control access to [Environments and Deployments](../../../ci/environments/index.md).
| **Feature flags** | **{check-circle}** Yes | Control access to [Feature flags](../../../operations/feature_flags.md).
@@ -125,6 +114,23 @@ When you disable a feature, the following additional features are also disabled:
- Metrics dashboard access requires reading project environments and deployments.
Users with access to the metrics dashboard can also access environments and deployments.
+### Manage project access through LDAP groups
+
+You can [use LDAP to manage group membership](../../group/access_and_permissions.md#manage-group-memberships-via-ldap).
+
+You cannot use LDAP groups to manage project access, but you can use the following
+workaround.
+
+Prerequisites:
+
+- You must [integrate LDAP with GitLab](../../../administration/auth/ldap/index.md).
+- You must be an administrator.
+
+1. [Create a group](../../group/index.md#create-a-group) to track membership of your project.
+1. [Set up LDAP synchronization](../../../administration/auth/ldap/ldap_synchronization.md) for that group.
+1. To use LDAP groups to manage access to a project, [add the LDAP-synchronized group as a member](../members/index.md#add-groups-to-a-project)
+ to the project.
+
## Disable CVE identifier request in issues **(FREE SAAS)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41203) in GitLab 13.4, only for public projects on GitLab.com.
@@ -272,7 +278,7 @@ To transfer a project:
You are redirected to the project's new page and GitLab applies a redirect. For more information about repository redirects, see [What happens when a repository path changes](../repository/index.md#what-happens-when-a-repository-path-changes).
NOTE:
-If you are an administrator, you can also use the [administration interface](../../admin_area/index.md#administering-projects)
+If you are an administrator, you can also use the [administration interface](../../../administration/admin_area.md#administering-projects)
to move any project to any namespace.
### Transferring a GitLab SaaS project to a different subscription tier
@@ -302,7 +308,7 @@ To delete a project:
1. Select **Settings > General**.
1. Expand **Advanced**.
1. In the **Delete this project** section, select **Delete project**.
-1. In the confirmation message text field, enter the name of the project as instructed, and select **Yes, delete project**.
+1. On the confirmation dialog, enter the project name and select **Yes, delete project**.
This action deletes the project and all associated resources (such as issues and merge requests).
@@ -338,7 +344,7 @@ To immediately delete a project marked for deletion:
1. Select **Settings > General**.
1. Expand **Advanced**.
1. In the **Delete this project** section, select **Delete project**.
-1. In the confirmation message text field, enter the name of the project as instructed, as select **Yes, delete project**.
+1. On the confirmation dialog, enter the project name and select **Yes, delete project**.
## Restore a project **(PREMIUM)**
diff --git a/doc/user/project/settings/project_access_tokens.md b/doc/user/project/settings/project_access_tokens.md
index 7fd8fdf3a00..f4652d592f0 100644
--- a/doc/user/project/settings/project_access_tokens.md
+++ b/doc/user/project/settings/project_access_tokens.md
@@ -26,7 +26,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-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](../../../administration/settings/account_and_limit_settings.md#limit-the-lifetime-of-access-tokens) as personal access tokens if the limit is set.
WARNING:
The ability to create project access tokens without expiry was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/369122) in GitLab 15.4 and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/392855) in GitLab 16.0. In GitLab 16.0 and later, existing project access tokens without an expiry date are automatically given an expiry date of 365 days later than the current date. The automatic adding of an expiry date occurs on GitLab.com during the 16.0 milestone. The automatic adding of an expiry date occurs on self-managed instances when they are upgraded to GitLab 16.0. This change is a breaking change.
@@ -39,7 +39,7 @@ You can use project access tokens:
You cannot use project access tokens to create other group, project, or personal access tokens.
-Project access tokens inherit the [default prefix setting](../../admin_area/settings/account_and_limit_settings.md#personal-access-token-prefix)
+Project access tokens inherit the [default prefix setting](../../../administration/settings/account_and_limit_settings.md#personal-access-token-prefix)
configured for personal access tokens.
## Create a project access token
@@ -62,7 +62,7 @@ To create a project access token:
- The token expires on that date at midnight UTC.
- If you do not enter an expiry date, the expiry date is automatically set to 365 days later than the current date.
- By default, this date can be a maximum of 365 days later than the current date.
- - 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.
+ - An instance-wide [maximum lifetime](../../../administration/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).
1. Select **Create project access token**.
@@ -81,14 +81,15 @@ To revoke a project access token:
The scope determines the actions you can perform when you authenticate with a project access token.
-| Scope | Description |
-|:-------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `api` | Grants complete read and write access to the scoped project API, including the [Package Registry](../../packages/package_registry/index.md). |
-| `read_api` | Grants read access to the scoped project API, including the [Package Registry](../../packages/package_registry/index.md). |
+| Scope | Description |
+|:-------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `api` | Grants complete read and write access to the scoped project API, including the [Package Registry](../../packages/package_registry/index.md). |
+| `read_api` | Grants read access to the scoped project API, including the [Package Registry](../../packages/package_registry/index.md). |
| `read_registry` | Grants read access (pull) to the [Container Registry](../../packages/container_registry/index.md) images if a project is private and authorization is required. |
| `write_registry` | Grants write access (push) to the [Container Registry](../../packages/container_registry/index.md). |
-| `read_repository` | Grants read access (pull) to the repository. |
-| `write_repository` | Grants read and write access (pull and push) to the repository. |
+| `read_repository` | Grants read access (pull) to the repository. |
+| `write_repository` | Grants read and write access (pull and push) to the repository. |
+| `create_runner` | Grants permission to create runners in the project. |
## Enable or disable project access token creation
diff --git a/doc/user/project/web_ide/index.md b/doc/user/project/web_ide/index.md
index 481eca5a890..45abcd867c0 100644
--- a/doc/user/project/web_ide/index.md
+++ b/doc/user/project/web_ide/index.md
@@ -11,7 +11,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Enabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/115741) in GitLab 15.11.
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 `vscode_web_ide`. On GitLab.com, this feature is available.
+On self-managed GitLab, by default this feature is available. To hide the feature, an administrator can [disable the feature flag](../../../administration/feature_flags.md) named `vscode_web_ide`. On GitLab.com, this feature is available.
The Web IDE is an advanced editor with commit staging.
You can use the Web IDE to make changes to multiple files directly from the GitLab UI.
diff --git a/doc/user/project/wiki/group.md b/doc/user/project/wiki/group.md
index 2271c33b5b4..41fd7e81db5 100644
--- a/doc/user/project/wiki/group.md
+++ b/doc/user/project/wiki/group.md
@@ -14,7 +14,6 @@ to ensure all group members have the correct access permissions to contribute.
Group wikis are similar to [project wikis](index.md), with a few limitations:
- [Git LFS](../../../topics/git/lfs/index.md) is not supported.
-- Group wikis are not included in [global search](../../search/advanced_search.md).
- Changes to group wikis don't show up in the [group's activity feed](../../group/manage.md#group-activity-analytics).
For updates, follow [the epic that tracks feature parity with project wikis](https://gitlab.com/groups/gitlab-org/-/epics/2782).
diff --git a/doc/user/project/wiki/index.md b/doc/user/project/wiki/index.md
index 0d3782cfd09..4a53faeee73 100644
--- a/doc/user/project/wiki/index.md
+++ b/doc/user/project/wiki/index.md
@@ -37,7 +37,7 @@ To access a project wiki:
- On any page in the project, use the <kbd>g</kbd> + <kbd>w</kbd>
[wiki keyboard shortcut](../../shortcuts.md).
-If **Wiki** is not listed in the left sidebar of your project, a project administrator
+If **Plan > Wiki** is not listed in the left sidebar of your project, a project administrator
has [disabled it](#enable-or-disable-a-project-wiki).
## Configure a default branch for your wiki
@@ -310,11 +310,12 @@ Previously added wiki pages are preserved in case you
want to re-enable the wiki. To re-enable it, repeat the process
to disable the wiki but toggle it on (in blue).
-## Content Editor
+## Rich text editor
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/5643) in GitLab 14.0.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/345398) switching between editing experiences in GitLab 14.7 [with a flag](../../../administration/feature_flags.md) named `wiki_switch_between_content_editor_raw_markdown`. Enabled by default.
> - Switching between editing experiences generally available in GitLab 14.10. [Feature flag `wiki_switch_between_content_editor_raw_markdown`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83760) removed.
+> - [Renamed](https://gitlab.com/gitlab-org/gitlab/-/issues/398152) from content editor to rich text editor in GitLab 16.2.
GitLab provides a WYSIWYG editing experience for GitLab Flavored Markdown in wikis.
@@ -327,12 +328,12 @@ Support includes:
- Previewing Mermaid, PlantUML, and Kroki diagrams ([introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86701) in GitLab 15.2).
- Creating and editing HTML comments ([introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/104084) in GitLab 15.7).
-### Use the Content Editor
+### Use the rich text editor
1. [Create](#create-a-new-wiki-page) a new wiki page, or [edit](#edit-a-wiki-page) an existing one.
1. Select **Markdown** as your format.
1. Above **Content**, select **Edit rich text**.
-1. Customize your page's content using the various formatting options available in the content editor.
+1. Customize your page's content using the various formatting options available in the rich text editor.
1. Select **Create page** for a new page, or **Save changes** for an existing page.
The rich text editing mode remains the default until you switch back to
@@ -340,12 +341,12 @@ The rich text editing mode remains the default until you switch back to
### Switch back to the old editor
-1. *If you're editing the page in the content editor,* scroll to **Content**.
+1. *If you're editing the page in the rich text editor,* scroll to **Content**.
1. Select **Edit source**.
### GitLab Flavored Markdown support
-Supporting all GitLab Flavored Markdown content types in the Content Editor is a work in progress.
+Supporting all GitLab Flavored Markdown content types in the rich text editor is a work in progress.
For the status of the ongoing development for CommonMark and GitLab Flavored Markdown support, read:
- [Basic Markdown formatting extensions](https://gitlab.com/groups/gitlab-org/-/epics/5404) epic.
diff --git a/doc/user/project/working_with_projects.md b/doc/user/project/working_with_projects.md
index 5bd7c12ed31..472bbb81648 100644
--- a/doc/user/project/working_with_projects.md
+++ b/doc/user/project/working_with_projects.md
@@ -9,42 +9,62 @@ info: "To determine the technical writer assigned to the Stage/Group associated
Most work in GitLab is done in a [project](../../user/project/index.md). Files and
code are saved in projects, and most features are in the scope of projects.
-## View projects
+## View all projects for the instance
-To view all your projects:
+To view all projects for the GitLab instance:
1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **View all your projects**.
+1. Select **Explore**.
+
+On the left sidebar, **Projects** is selected. On the right, the list shows
+all projects for the instance.
+
+If you are not authenticated, then the list shows public projects only.
+
+## View projects you are a member of
-To browse all projects you can access:
+To view projects you are a member of:
1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **Explore**.
+1. Select **Your work**.
-### Who can view the Projects page
+On the left sidebar, **Projects** is selected. On the list, on the **Yours** tab,
+all the projects you are a member of are displayed.
-When you select a project, the project landing page shows the project contents.
+## View personal projects
-For public projects, and members of internal and private projects
-with [permissions to view the project's code](../permissions.md#project-members-permissions),
-the project landing page shows:
+Personal projects are projects created under your personal namespace.
-- A [`README` or index file](repository/index.md#readme-and-index-files).
-- A list of directories in the project's repository.
+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`.
-For users without permission to view the project's code, the landing page shows:
+To view your personal projects:
-- The wiki homepage.
-- The list of issues in the project.
+1. On the left sidebar, select your avatar and then your username.
+1. On the left sidebar, select **Personal projects**.
+
+## View starred projects
-### Access a project page with the project ID
+To view projects you have [starred](#star-a-project):
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/53671) in GitLab 11.8.
+1. On the left sidebar, select your avatar and then your username.
+1. On the left sidebar, select **Starred projects**.
+
+## Organizing projects with topics
+
+Topics are labels that you can assign to projects to help you organize and find them.
+A topic is typically a short name that describes the content or purpose of a project.
+You can assign a topic to several projects.
+
+For example, you can create and assign the topics `python` and `hackathon` to all projects that use Python and are intended for Hackathon contributions.
-To access a project from the GitLab UI using the project ID,
-visit the `/projects/:id` URL in your browser or other tool accessing the project.
+Topics assigned to a project are listed in the **Project overview**, below the project name and activity information.
-## Explore topics
+Only users with access to the project can see the topics assigned to that project,
+but everyone (including unauthenticated users) can see the topics available on the GitLab instance.
+Do not include sensitive information in the name of a topic.
+
+### Explore topics
To explore project topics:
@@ -53,47 +73,67 @@ To explore project topics:
1. On the left sidebar, select **Topics**.
1. To view projects associated with a topic, select a topic.
-The **Explore topics** page shows a list of topics, sorted by the number of associated projects.
+The **Explore topics** page shows a list of projects with this topic.
-You can assign topics to a project on the [Project Settings page](settings/index.md#assign-topics-to-a-project).
+### Filter and sort topics
-If you're an instance administrator, you can administer all project topics from the
-[Admin Area's Topics page](../admin_area/index.md#administering-topics).
+You can filter the list of projects that have a certain topic by:
-## Star a project
+- Name
+- Language
+- Owner
+- Archive status
+- Visibility
-You can add a star to projects you use frequently to make them easier to find.
+You can sort the projects by:
-To add a star to a project:
+- Date created
+- Date updated
+- Name
+- Number of stars
-1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
-1. In the upper-right corner of the page, select **Star**.
+### Subscribe to a topic
-## View starred projects
+If you want to know when new projects are added to a topic, you can use its RSS feed.
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **View all your projects**.
-1. Select the **Starred** tab.
-1. GitLab displays information about your starred projects, including:
+You can do this either from the **Explore topics** page or a project with topics.
- - Project description, including name, description, and icon.
- - Number of times this project has been starred.
- - Number of times this project has been forked.
- - Number of open merge requests.
- - Number of open issues.
+To subscribe to a topic:
-## View personal projects
+- From the **Explore topics** page:
-Personal projects are projects created under your personal namespace.
+ 1. On the left sidebar, expand the top-most chevron ({**chevron-down**}).
+ 1. Select **Explore**.
+ 1. Select **Topics**.
+ 1. Select the topic you want to subscribe to.
+ 1. In the upper-right corner, select **Subscribe to the new projects feed** (**{rss}**).
-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`.
+- From a project:
-To view your personal projects:
+ 1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
+ 1. In the **Project overview** page, from the **Topics** list select the topic you want to subscribe to.
+ 1. In the upper-right corner, select **Subscribe to the new projects feed** (**{rss}**).
-1. On the left sidebar, expand the top-most chevron (**{chevron-down}**).
-1. Select **View all your projects**.
-1. In the **Yours** tab, select **Personal**.
+The results are displayed as an RSS feed in Atom format.
+The URL of the result contains a feed token and the list of projects that have the topic. You can add this URL to your feed reader.
+
+### Assign a topic to a project
+
+You can assign topics to a project on the [Project Settings page](settings/index.md#assign-topics-to-a-project).
+
+### Administer topics
+
+Instance administrators can administer all project topics from the
+[Admin Area's Topics page](../../administration/admin_area.md#administering-topics).
+
+## Star a project
+
+You can add a star to projects you use frequently to make them easier to find.
+
+To add a star to a project:
+
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
+1. In the upper-right corner of the page, select **Star**.
## Delete a project
@@ -188,6 +228,34 @@ Prerequisite:
1. Use the toggle by each feature you want to turn on or off, or change access for.
1. Select **Save changes**.
+## Access the Project overview page by using the project ID
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/53671) in GitLab 11.8.
+
+To access a project by using the project ID instead of its name,
+go to `https://gitlab.example.com/projects/:id`.
+
+The project ID is displayed in the **Project overview** page, under the project name.
+
+For example, if in your personal namespace `alex` you have a project `my-project` with the ID `123456`, you can access the project
+either at `https://gitlab.example.com/alex/my-project` or `https://gitlab.example.com/projects/123456`.
+
+## Who can view the Project overview page
+
+When you select a project, the **Project overview** page shows the project contents.
+
+For public projects, and members of internal and private projects
+with [permissions to view the project's code](../permissions.md#project-members-permissions),
+the project landing page shows:
+
+- A [`README` or index file](repository/index.md#readme-and-index-files).
+- A list of directories in the project's repository.
+
+For users without permission to view the project's code, the landing page shows:
+
+- The wiki homepage.
+- The list of issues in the project.
+
## Leave a project
When you leave a project:
diff --git a/doc/user/public_access.md b/doc/user/public_access.md
index 002cb97dd93..57439a4595e 100644
--- a/doc/user/public_access.md
+++ b/doc/user/public_access.md
@@ -7,18 +7,24 @@ type: reference
# Project and group visibility **(FREE)**
-A project in GitLab can be private, internal, or public.
+Projects and groups in GitLab can be private, internal, or public.
+
+The visibility level of the group or project has no influence on whether members within the group or project can see each other.
+A group or project is an object to allow collaborative work. This is only possible if all members know about each other.
+
+Group or project members can see all members of the group or project they belong to.
+Group or project owners can see the origin of membership (the original group or project) of all members.
## Private projects and groups
-For private projects, only project members can:
+For private projects, only members of the private project or group can:
- Clone the project.
- View the public access directory (`/public`).
Users with the Guest role cannot clone the project.
-Private groups can have private subgroups only.
+Private groups can have only private subgroups.
## Internal projects and groups **(FREE SELF)**
@@ -27,6 +33,8 @@ For internal projects, **any authenticated user**, including users with the Gues
- Clone the project.
- View the public access directory (`/public`).
+Only internal members can view internal content.
+
[External users](admin_area/external_users.md) cannot clone the project.
Internal groups can have internal or private subgroups.
@@ -48,7 +56,7 @@ Public groups can have public, internal, or private subgroups.
NOTE:
If an administrator restricts the
-[**Public** visibility level](admin_area/settings/visibility_and_access_controls.md#restrict-visibility-levels),
+[**Public** visibility level](../administration/settings/visibility_and_access_controls.md#restrict-visibility-levels),
then `/public` is visible only to authenticated users.
## Change project visibility
@@ -91,7 +99,7 @@ Prerequisites:
Administrators can restrict which visibility levels users can choose when they create a project or a snippet.
This setting can help prevent users from publicly exposing their repositories by accident.
-For more information, see [Restrict visibility levels](admin_area/settings/visibility_and_access_controls.md#restrict-visibility-levels).
+For more information, see [Restrict visibility levels](../administration/settings/visibility_and_access_controls.md#restrict-visibility-levels).
## Related topics
diff --git a/doc/user/report_abuse.md b/doc/user/report_abuse.md
index c4b9af28220..23a662ccfeb 100644
--- a/doc/user/report_abuse.md
+++ b/doc/user/report_abuse.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
You can report abuse from other GitLab users to GitLab administrators.
-A GitLab administrator [can then choose](admin_area/review_abuse_reports.md) to:
+A GitLab administrator [can then choose](../administration/review_abuse_reports.md) to:
- Remove the user, which deletes them from the instance.
- Block the user, which denies them access to the instance.
@@ -66,4 +66,4 @@ A URL to the reported user's comment is pre-filled in the abuse report's
## Related topics
-- [Abuse reports administration documentation](admin_area/review_abuse_reports.md)
+- [Abuse reports administration documentation](../administration/review_abuse_reports.md)
diff --git a/doc/user/reserved_names.md b/doc/user/reserved_names.md
index 6e8a7e7c1cf..bc9de9357f6 100644
--- a/doc/user/reserved_names.md
+++ b/doc/user/reserved_names.md
@@ -20,7 +20,7 @@ under the `TOP_LEVEL_ROUTES`, `PROJECT_WILDCARD_ROUTES` and `GROUP_ROUTES` lists
## Limitations on project and group names
- Project or group names must start with a letter, digit, emoji, or "_".
-- Project or group names can only contain letters, digits, emojis, "_", ".", "+", dashes, or spaces.
+- Project or group names can only contain letters, digits, emoji, "_", ".", "+", dashes, or spaces.
- Project or group slugs must start with a letter or digit.
- Project or group slugs can only contain letters, digits, '_', '.', '+', or dashes.
- Project or group slugs must not contain consecutive special characters.
diff --git a/doc/user/rich_text_editor.md b/doc/user/rich_text_editor.md
new file mode 100644
index 00000000000..ea85dfdbcb4
--- /dev/null
+++ b/doc/user/rich_text_editor.md
@@ -0,0 +1,134 @@
+---
+stage: Plan
+group: Knowledge
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+type: index, reference
+---
+
+# Rich text editor **(FREE)**
+
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/5643) for [wikis](project/wiki/index.md#rich-text-editor) in GitLab 14.0.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/371931) for editing issue descriptions in GitLab 15.5 [with a flag](../administration/feature_flags.md) named `content_editor_on_issues`. Disabled by default.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/382636) for [discussions](discussions/index.md), and creating and editing issues and merge requests in GitLab 15.11 with the same flag.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/407507) for epics in GitLab 16.1 with the same flag.
+> - Feature flag `content_editor_on_issues` enabled by default in GitLab 16.2.
+
+FLAG:
+On self-managed GitLab, by default this feature is available. To hide the feature, an administrator
+can [disable the feature flag](../administration/feature_flags.md) named `content_editor_on_issues`.
+On GitLab.com, this feature is available.
+
+The rich text editor is a "what you see is what you get" (WYSIWYG) editor so you can use
+[GitLab Flavored Markdown](markdown.md) in descriptions and comments, even if you can't remember all
+of its syntax.
+
+![Rich text editor in GitLab](img/rich_text_editor_01_v16_2.png)
+
+Rich text editor is available in:
+
+- [Wikis](project/wiki/index.md)
+- Issues
+- Epics
+- Merge requests
+- [Designs](project/issues/design_management.md)
+
+Features of the editor include:
+
+- Format text, including as bold, italics, block quotes, headings, and inline code.
+- Format ordered lists, unordered lists, and checklists.
+- Insert links, attachments, images, video, and audio.
+- Create and edit a table structure.
+- Insert and format code blocks with syntax highlighting.
+- Preview Mermaid, PlantUML, and Kroki diagrams in real time.
+
+To track work on adding the rich text editor to more places across GitLab, see
+[epic 7098](https://gitlab.com/groups/gitlab-org/-/epics/7098).
+
+## Switch to the rich text editor
+
+Use the rich text editor to edit descriptions, wiki pages, add comments.
+
+To switch to the rich text editor: In a text box, in the lower-left corner, select
+**Switch to rich text editing**.
+
+## Switch to the plain text editor
+
+If you want to enter Markdown source in the text box, return to using the plain text editor.
+
+To switch to the plain text editor: In a text box, in the lower-left corner, select
+**Switch to plain text editing**.
+
+## Compatibility with GitLab Flavored Markdown
+
+The rich text editor is fully compatible with [GitLab Flavored Markdown](markdown.md).
+It means that you can switch between plain text and rich text modes without losing any data.
+
+### Input rules
+
+Rich text editor also supports input rules that let you work with rich content as if you were
+typing Markdown.
+
+Supported input rules:
+
+| Input rule syntax | Content inserted |
+| --------------------------------------------------------- | -------------------- |
+| `# Heading 1` <br>... <br> `###### Heading 6` | Headings 1 through 6 |
+| `**bold**` or `__bold__` | Bold text |
+| `_italics_` or `*italics*` | Italicized text |
+| `~~strike~~` | Strikethrough |
+| `[link](url)` | Hyperlink |
+| `code` | Inline code |
+| <code>&#96;&#96;&#96;rb</code> + <kbd>Enter</kbd> <br> <code>&#96;&#96;&#96;js</code> + <kbd>Enter</kbd> | Code block |
+| `* List item`, or<br> `- List item`, or<br> `+ List item` | Unordered list |
+| `1. List item` | Numbered list |
+| `<details>` | Collapsible section |
+
+## Tables
+
+Unlike in raw Markdown, you can use the rich text editor to insert block content paragraphs,
+list items, diagrams (or even another table!) in table cells.
+
+### Insert a table
+
+To insert a table:
+
+1. Select **Insert table** **{table}**.
+1. From the dropdown list, select the dimensions of the new table.
+
+![Alt text](img/rich_text_editor_02_v16_2.png)
+
+### Edit a table
+
+Inside a table cell, you can use a menu to insert or delete rows or columns.
+
+To open the menu: In the upper-right corner of a cell, select the chevron **{chevron-down}**.
+
+![Alt text](img/rich_text_editor_03_v16_2.png)
+
+### Operations on multiple cells
+
+Select multiple cells and merge or split them.
+
+To merge selected cells into one:
+
+1. Select multiple cells - select one and drag your cursor.
+1. In the upper-right corner of a cell, select the chevron **{chevron-down}** **> Merge N cells**.
+
+To split merged cells: In the upper-right corner of a cell, select the chevron **{chevron-down}** **> Split cell**.
+
+## Insert diagrams
+
+Insert [Mermaid](https://mermaidjs.github.io/) and [PlantUML](https://plantuml.com/) diagrams and
+preview them live as you type the diagram code.
+
+To insert a diagram:
+
+1. On the top bar of a text box, select **{plus}** **More options** and then **Mermaid diagram** or **PlantUML diagram**.
+1. Enter the code for your diagram. The diagram preview appears in the text box.
+
+![Mermaid diagrams in rich text editor](img/rich_text_editor_04_v16_2.png)
+
+## Related topics
+
+- [Keyboard shortcuts](shortcuts.md#rich-text-editor) for rich text editor
+- [GitLab Flavored Markdown](markdown.md)
diff --git a/doc/user/search/advanced_search.md b/doc/user/search/advanced_search.md
index 1444e5385f9..5a9f75f1d6c 100644
--- a/doc/user/search/advanced_search.md
+++ b/doc/user/search/advanced_search.md
@@ -27,7 +27,7 @@ You can use advanced search in:
- Code
- Comments
- Commits
-- Project wikis (not [group wikis](../project/wiki/group.md))
+- Project and group wikis
## Enable advanced search
diff --git a/doc/user/search/command_palette.md b/doc/user/search/command_palette.md
new file mode 100644
index 00000000000..ab284bd6a5f
--- /dev/null
+++ b/doc/user/search/command_palette.md
@@ -0,0 +1,30 @@
+---
+stage: Manage
+group: Foundations
+info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments"
+type: reference
+---
+
+# Command palette **(FREE)**
+
+> Introduced in GitLab 16.2 [with a flag](../../administration/feature_flags.md) named `command_palette`. Enabled by default.
+
+You can use command palette to narrow down the scope of your search or to
+find an object more quickly.
+
+FLAG:
+On self-managed GitLab, by default this feature is available.
+To hide the feature, an administrator can [disable the feature flag](../../administration/feature_flags.md) named `command_palette`.
+On GitLab.com, this feature is available.
+
+## Open the command palette
+
+To open the command palette:
+
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) or use the <kbd>/</kbd> key to enable.
+1. Type one of the special characters:
+
+ - <kbd>></kbd> - Create a new object or find a menu item.
+ - <kbd>@</kbd> - Search for a user.
+ - <kbd>:</kbd> - Search for a project.
+ - <kbd>/</kbd> - Search for project files in the default repository branch.
diff --git a/doc/user/search/img/code_search_git_blame_v15_1.png b/doc/user/search/img/code_search_git_blame_v15_1.png
deleted file mode 100644
index 426f829b186..00000000000
--- a/doc/user/search/img/code_search_git_blame_v15_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/search/img/project_search_general_settings_v13_8.png b/doc/user/search/img/project_search_general_settings_v13_8.png
deleted file mode 100644
index 08395e0d4f9..00000000000
--- a/doc/user/search/img/project_search_general_settings_v13_8.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/search/img/project_search_sha_redirect.png b/doc/user/search/img/project_search_sha_redirect.png
deleted file mode 100644
index 718a859d4af..00000000000
--- a/doc/user/search/img/project_search_sha_redirect.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/search/img/search_navbar_v15_7.png b/doc/user/search/img/search_navbar_v15_7.png
deleted file mode 100644
index 775c7f32b37..00000000000
--- a/doc/user/search/img/search_navbar_v15_7.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/search/img/search_scope_v15_7.png b/doc/user/search/img/search_scope_v15_7.png
deleted file mode 100644
index 96f6e985523..00000000000
--- a/doc/user/search/img/search_scope_v15_7.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/search/index.md b/doc/user/search/index.md
index 2278da9a714..fe5ee3a5e0a 100644
--- a/doc/user/search/index.md
+++ b/doc/user/search/index.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Searching in GitLab **(FREE)**
-GitLab has two types of searches available: _basic_ and _advanced_.
+GitLab has two types of searches available: **basic** and **advanced**.
Both types of search are the same, except when you are searching through code.
@@ -27,16 +27,15 @@ can limit the search scope by disabling the following [`ops` feature flags](../.
| Issues | `global_search_issues_tab` | When enabled, global search includes issues. |
| Merge requests | `global_search_merge_requests_tab` | When enabled, global search includes merge requests. |
| Users | `global_search_users_tab` | When enabled, global search includes users. |
-| Wiki | `global_search_wiki_tab` | When enabled, global search includes project wikis (not [group wikis](../project/wiki/group.md)). |
+| Wiki | `global_search_wiki_tab` | When enabled, global search includes project and [group wikis](../project/wiki/group.md). |
-All global search scopes are enabled by default on GitLab.com
-and self-managed instances.
+All global search scopes are enabled by default on self-managed instances.
## Global search validation
Global search ignores and logs as abusive any search with:
-- Fewer than 2 characters
+- Fewer than two characters
- A term longer than 100 characters (URL search terms must not exceed 200 characters)
- A stop word only (for example, `the`, `and`, or `if`)
- An unknown `scope`
@@ -48,29 +47,36 @@ Global search only flags with an error any search that includes more than:
- 4096 characters
- 64 terms
-## Perform a search
+## Search in all GitLab
-To start a search, in the upper-right corner of the screen, in the search bar, type your search query.
-You must type at least two characters.
+To search in all GitLab:
-![search navbar](img/search_navbar_v15_7.png)
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**).
+1. Type your search query. You must type at least two characters.
+1. Press <kbd>Enter</kbd> to search, or select from the list.
-After the results are displayed, you can modify the search, select a different type of data to
-search, or choose a specific group or project.
+The results are displayed. To filter the results, on the left sidebar, select a filter.
-![search scope](img/search_scope_v15_7.png)
+## Search in a project
-## Search in code
+To search in a project:
-To search through code or other documents in a project:
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
+1. Select **Search GitLab** (**{search}**) again and type the string you want to search for.
+1. Press <kbd>Enter</kbd> to search, or select from the list.
+
+The results are displayed. To filter the results, on the left sidebar, select a filter.
+
+## Search for code
+
+To search for code in a project:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
-1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) and type the string you want to search for.
-1. Press **Enter**.
+1. Select **Search GitLab** (**{search}**) again and type the code you want to search for.
+1. Press <kbd>Enter</kbd> to search, or select from the list.
Code search shows only the first result in the file.
-
-To search across all of GitLab, ask your administrator to enable [advanced search](advanced_search.md).
+To search for code in all GitLab, ask your administrator to enable [advanced search](advanced_search.md).
### View Git blame from code search
@@ -82,8 +88,6 @@ where the results were found.
1. From the code search result, hover over the line number.
1. On the left, select **View blame**.
-![code search results](img/code_search_git_blame_v15_1.png)
-
### Filter code search results by language
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/342651) in GitLab 15.10.
@@ -93,87 +97,89 @@ To filter code search results by one or more languages:
1. On the code search page, on the left sidebar, select one or more languages.
1. On the left sidebar, select **Apply**.
-## Search for projects by full path
+## Exclude search results
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/108906) in GitLab 15.9 [with a flag](../../administration/feature_flags.md) named `full_path_project_search`. Disabled by default.
-> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/114932) in GitLab 15.11. Feature flag `full_path_project_search` removed.
+### From archived projects
-You can search for a project by entering its full path (including the namespace it belongs to) in the search box.
-As you type the project path, [autocomplete suggestions](#autocomplete-suggestions) are displayed.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/121981) in GitLab 16.1 [with a flag](../../administration/feature_flags.md) named `search_projects_hide_archived`. Disabled by default.
-For example, the search query:
+FLAG:
+On self-managed GitLab, by default this feature is not available. To make it available,
+an administrator can [enable the feature flag](../../administration/feature_flags.md) named `search_projects_hide_archived`. On GitLab.com, this feature is not available.
-- `gitlab-org/gitlab` searches for the `gitlab` project in the `gitlab-org` namespace.
-- `gitlab-org/` displays autocomplete suggestions for projects that belong to the `gitlab-org` namespace.
+Archived projects are included in search results by default. To exclude archived projects, ensure the `search_projects_hide_archived` flag is enabled.
-### Exclude archived projects from project search results
+To include archived projects with `search_projects_hide_archived` enabled, you must add the parameter `include_archived=true` to the URL.
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/121981) in GitLab 16.1 [with a flag](../../administration/feature_flags.md) named `search_projects_hide_archived`. Disabled by default.
+### From issues in archived projects
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124846) in GitLab 16.2 [with a flag](../../administration/feature_flags.md) named `search_issues_hide_archived_projects`. 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 `search_projects_hide_archived`. On GitLab.com, this feature is not available.
+an administrator can [enable the feature flag](../../administration/feature_flags.md) named `search_issues_hide_archived_projects`. On GitLab.com, this feature is not available.
-Archived projects are included in project search results by default. To exclude archived projects, ensure the `search_projects_hide_archived` flag is enabled.
+Issues in archived projects are included in search results by default. To exclude issues in archived projects, ensure the `search_issues_hide_archived_projects` flag is enabled.
-To include archived projects with `search_projects_hide_archived` enabled, you must add the parameter `include_archived=true` to the URL.
+To include issues in archived projects with `search_issues_hide_archived_projects` enabled, you must add the parameter `include_archived=true` to the URL.
-## Search for a SHA
+## Search for a project by full path
-You can search for a commit SHA.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/108906) in GitLab 15.9 [with a flag](../../administration/feature_flags.md) named `full_path_project_search`. Disabled by default.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/114932) in GitLab 15.11. Feature flag `full_path_project_search` removed.
+
+You can search for a project by entering its full path (including the namespace it belongs to) in the search box.
+As you type the project path, [autocomplete suggestions](#autocomplete-suggestions) are displayed.
+
+For example:
+
+- `gitlab-org/gitlab` searches for the `gitlab` project in the `gitlab-org` namespace.
+- `gitlab-org/` displays autocomplete suggestions for projects that belong to the `gitlab-org` namespace.
+
+## Search for a commit SHA
+
+To search for a commit SHA:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
-1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) and type the SHA.
+1. Select **Search GitLab** (**{search}**) again and type the commit SHA you want to search for.
+1. Press <kbd>Enter</kbd> to search, or select from the list.
If a single result is returned, GitLab redirects to the commit result
and gives you the option to return to the search results page.
-![project SHA search redirect](img/project_search_sha_redirect.png)
+## Search for specific terms
-## Searching for specific terms
-
-> - [Removed support for partial matches in issue searches](https://gitlab.com/gitlab-org/gitlab/-/issues/273784) in GitLab 14.9 [with a flag](../../administration/feature_flags.md) named `issues_full_text_search`. Disabled by default.
-> - Feature flag [`issues_full_text_search` enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/273784) in GitLab 14.10.
-> - Feature flag [`issues_full_text_search` enabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/273784) in GitLab 15.2.
+> - [Support for partial matches in issue search](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71913) removed in GitLab 14.9 [with a flag](../../administration/feature_flags.md) named `issues_full_text_search`. Disabled by default.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124703) in GitLab 16.2. Feature flag `issues_full_text_search` removed.
You can filter issues and merge requests by specific terms included in titles or descriptions.
- Syntax
- Searches look for all the words in a query, in any order. For example: searching
issues for `display bug` returns all issues matching both those words, in any order.
- - To find the exact term, use double quotes: `"display bug"`
+ - To find the exact term, use double quotes: `"display bug"`.
- Limitation
- - For performance reasons, terms shorter than 3 chars are ignored. For example: searching
+ - For performance reasons, terms shorter than three characters are ignored. For example: searching
issues for `included in titles` is same as `included titles`
- Search is limited to 4096 characters and 64 terms per query.
- When searching issues, partial matches are not allowed. For example: searching for `play` will
not return issues that have the word `display`. But variations of words match, so searching
for `displays` also returns issues that have the word `display`.
-## Retrieve search results as feed
-
-> Feeds for merge requests were [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/66336) in GitLab 14.3.
-
-GitLab provides RSS feeds of search results for your project. To subscribe to the
-RSS feed of search results:
+## Run a search from history
-1. Go to your project's page.
-1. On the left sidebar, select **Issues** or **Merge requests**.
-1. Perform a search.
-1. 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 your search query.
-You can add this URL to your feed reader.
+You can run a search from history for issues and merge requests. Search history is stored locally
+in your browser. To run a search from history:
-## Search history
+1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
+1. To view recent searches:
-Search history is available for issues and merge requests, and is stored locally
-in your browser. To run a search from history:
+ - For issues, on the left sidebar, select **Plan > Issues**. Above the list, to the left of the search box, select (**{history}**).
+ - For merge requests, on the left sidebar, select **Code > Merge requests**. Above the list, to the left of the search box, select **Recent searches**.
-1. In the top menu, select **Issues** or **Merge requests**.
-1. To the left of the search bar, select **Recent searches**, and select a search from the list.
+1. From the dropdown list, select a search.
-## Removing search filters
+## Remove search filters
Individual filters can be removed by selecting the filter's (x) button or backspacing. The entire search filter can be cleared by selecting the search box's (x) button or via <kbd>⌘</kbd> (Mac) + <kbd>⌫</kbd>.
@@ -181,9 +187,9 @@ To delete filter tokens one at a time, the <kbd>⌥</kbd> (Mac) / <kbd>Control</
## Autocomplete suggestions
-In the search bar, you can view autocomplete suggestions for:
+In the search box, you can view autocomplete suggestions for:
-- [Projects](#search-for-projects-by-full-path) and groups
+- [Projects](#search-for-a-project-by-full-path) and groups
- Users
- Various help pages (try and type **API help**)
- Project feature pages (try and type **milestones**)
@@ -195,13 +201,6 @@ In the search bar, you can view autocomplete suggestions for:
## Search settings
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/292941) in GitLab 13.8 [with a flag](../../administration/feature_flags.md) named `search_settings_in_page`. Disabled by default.
-> - [Added](https://gitlab.com/groups/gitlab-org/-/epics/4842) to Group, Administrator, and User settings in GitLab 13.9.
-> - [Feature flag `search_settings_in_page` removed](https://gitlab.com/gitlab-org/gitlab/-/issues/294025) in GitLab 13.11.
-> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/294025) in GitLab 13.11.
-
You can search inside a Project, Group, Administrator, or User's settings by entering
a search term in the search box located at the top of the page. The search results
appear highlighted in the sections that match the search term.
-
-![Search project settings](img/project_search_general_settings_v13_8.png)
diff --git a/doc/user/shortcuts.md b/doc/user/shortcuts.md
index e195be5586a..ac3c6bace09 100644
--- a/doc/user/shortcuts.md
+++ b/doc/user/shortcuts.md
@@ -68,24 +68,24 @@ relatively quickly to work, and they take you to another page in the project.
| Keyboard shortcut | Description |
|-----------------------------|-------------|
-| <kbd>g</kbd> + <kbd>o</kbd> | Go to the project overview page (**Project > Details**). |
-| <kbd>g</kbd> + <kbd>v</kbd> | Go to the project activity feed (**Project > Activity**). |
-| <kbd>g</kbd> + <kbd>r</kbd> | Go to the project releases list (**Project > Releases**). |
-| <kbd>g</kbd> + <kbd>f</kbd> | Go to the [project files](#project-files) list (**Repository > Files**). |
-| <kbd>t</kbd> | Go to the project file search page. (**Repository > Files**, select **Find Files**). |
-| <kbd>g</kbd> + <kbd>c</kbd> | Go to the project commits list (**Repository > Commits**). |
-| <kbd>g</kbd> + <kbd>n</kbd> | Go to the [repository graph](#repository-graph) page (**Repository > Graph**). |
-| <kbd>g</kbd> + <kbd>d</kbd> | Go to repository charts (**Analytics > Repository Analytics**). |
-| <kbd>g</kbd> + <kbd>i</kbd> | Go to the project issues list (**Issues > List**). |
-| <kbd>i</kbd> | Go to the New Issue page (**Issues**, select **New Issue** ). |
-| <kbd>g</kbd> + <kbd>b</kbd> | Go to the project issue boards list (**Issues > Boards**). |
-| <kbd>g</kbd> + <kbd>m</kbd> | Go to the project [merge requests](project/merge_requests/index.md) list (**Merge Requests**). |
-| <kbd>g</kbd> + <kbd>p</kbd> | Go to the CI/CD pipelines list (**CI/CD > Pipelines**). |
-| <kbd>g</kbd> + <kbd>j</kbd> | Go to the CI/CD jobs list (**CI/CD > Jobs**). |
-| <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**). 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>g</kbd> + <kbd>o</kbd> | Go to the project overview page (**Project overview**). |
+| <kbd>g</kbd> + <kbd>v</kbd> | Go to the project activity feed (**Manage > Activity**). |
+| <kbd>g</kbd> + <kbd>r</kbd> | Go to the project releases list (**Deploy > Releases**). |
+| <kbd>g</kbd> + <kbd>f</kbd> | Go to the [project files](#project-files) list (**Code > Repository**). |
+| <kbd>t</kbd> | Go to the project file search page. (**Code > Repository**, select **Find Files**). |
+| <kbd>g</kbd> + <kbd>c</kbd> | Go to the project commits list (**Code > Commits**). |
+| <kbd>g</kbd> + <kbd>n</kbd> | Go to the [repository graph](#repository-graph) page (**Code > Repository graph**). |
+| <kbd>g</kbd> + <kbd>d</kbd> | Go to repository charts (**Analyze > Repository analytics**). |
+| <kbd>g</kbd> + <kbd>i</kbd> | Go to the project issues list (**Plan > Issues**). |
+| <kbd>i</kbd> | Go to the New Issue page (**Pan > Issues**, select **New issue** ). |
+| <kbd>g</kbd> + <kbd>b</kbd> | Go to the project issue boards list (**Plan > Issue boards**). |
+| <kbd>g</kbd> + <kbd>m</kbd> | Go to the project [merge requests](project/merge_requests/index.md) list (**Code > Merge requests**). |
+| <kbd>g</kbd> + <kbd>p</kbd> | Go to the CI/CD pipelines list (**Build > Pipelines**). |
+| <kbd>g</kbd> + <kbd>j</kbd> | Go to the CI/CD jobs list (**Build > Jobs**). |
+| <kbd>g</kbd> + <kbd>e</kbd> | Go to the project environments (**Operate > Environments**). |
+| <kbd>g</kbd> + <kbd>k</kbd> | Go to the project Kubernetes cluster integration page (**Operate > 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 (**Code > Snippets**). |
+| <kbd>g</kbd> + <kbd>w</kbd> | Go to the [project wiki](project/wiki/index.md) (**Plan > Wiki**), if enabled. |
| <kbd>.</kbd> | Open the [Web IDE](project/web_ide/index.md). |
### Issues
@@ -123,14 +123,14 @@ These shortcuts are available when viewing [merge requests](project/merge_reques
### Project files
These shortcuts are available when browsing the files in a project (go to
-**Repository > Files**):
+**Code > Repository**):
| Keyboard shortcut | Description |
|-------------------|-------------|
| <kbd>↑</kbd> | Move selection up. |
| <kbd>↓</kbd> | Move selection down. |
| <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>Escape</kbd> | Go back to file list screen (only while searching for files, **Code > Repository**, 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). |
@@ -219,7 +219,7 @@ These shortcuts are available when editing a file with the [Web IDE](project/web
### Repository graph
These shortcuts are available when viewing the project [repository graph](project/repository/index.md#repository-history-graph)
-page (go to **Repository > Graph**):
+page (go to **Code > Repository graph**):
| Keyboard shortcut | Description |
|--------------------------------------------------------------------|-------------|
@@ -238,10 +238,10 @@ This shortcut is available when viewing a [wiki page](project/wiki/index.md):
|-------------------|-----------------|
| <kbd>e</kbd> | Edit wiki page. |
-### Content editor
+### Rich text editor
These shortcuts are available when editing a file with the
-[Content Editor](https://about.gitlab.com/direction/plan/knowledge/content_editor/):
+[rich text editor](https://about.gitlab.com/direction/plan/knowledge/content_editor/):
| macOS shortcut | Windows shortcut | Description |
|----------------|------------------|-------------|
@@ -261,6 +261,7 @@ These shortcuts are available when editing a file with the
| <kbd>Command</kbd> + <kbd>i</kbd> | <kbd>Control</kbd> + <kbd>i</kbd> | Italic |
| <kbd>Command</kbd> + <kbd>Shift</kbd> + <kbd>x</kbd> | <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>x</kbd> | Strikethrough |
| <kbd>Command</kbd> + <kbd>e</kbd> | <kbd>Control</kbd> + <kbd>e</kbd> | Code |
+| <kbd>Command</kbd> + <kbd>k</kbd> | <kbd>Control</kbd> + <kbd>k</kbd> | Insert a link |
| <kbd>Command</kbd> + <kbd>Alt</kbd> + <kbd>0</kbd> | <kbd>Control</kbd> + <kbd>Alt</kbd> + <kbd>0</kbd> | Apply normal text style |
| <kbd>Command</kbd> + <kbd>Alt</kbd> + <kbd>1</kbd> | <kbd>Control</kbd> + <kbd>Alt</kbd> + <kbd>1</kbd> | Apply heading style 1 |
| <kbd>Command</kbd> + <kbd>Alt</kbd> + <kbd>2</kbd> | <kbd>Control</kbd> + <kbd>Alt</kbd> + <kbd>2</kbd> | Apply heading style 2 |
diff --git a/doc/user/snippets.md b/doc/user/snippets.md
index 3ad003e4f4c..aace26b4bb0 100644
--- a/doc/user/snippets.md
+++ b/doc/user/snippets.md
@@ -38,19 +38,15 @@ visibility setting keep this setting. You can read more about the change in the
You can create snippets in multiple ways, depending on whether you want to create a personal or project snippet:
1. Select the kind of snippet you want to create:
- - **To create a personal snippet**: On the
- [Snippets dashboard](https://gitlab.com/dashboard/snippets), select
- **New snippet**, or:
- - *If you're on a project's page,* select the plus icon (**{plus-square-o}**)
- in the top navigation bar, and then select **New snippet** from the
- **GitLab** section of the same dropdown list.
- - *For all other pages,* select the plus icon (**{plus-square-o}**)
- in the top navigation bar, then select **New snippet** from the dropdown list.
+ - **To create a personal snippet**, do one of the following:
+ - On the [Snippets dashboard](https://gitlab.com/dashboard/snippets), select
+ **New snippet**.
+ - From a project: On the left sidebar, select **Create new** (**{plus}**). Below **In GitLab**, select **New snippet**.
+ - From any other page: On the left sidebar, select **Create new** (**{plus}**) and then **New snippet**.
- If you installed the [GitLab Workflow VS Code extension](project/repository/vscode.md),
use the [`Gitlab: Create snippet` command](https://marketplace.visualstudio.com/items?itemName=GitLab.gitlab-workflow#create-snippet).
- - **To create a project snippet**: Go to your project's page. Select the
- plus icon (**{plus-square-o}**), and then select **New snippet** from the
- **This project** section of the dropdown list.
+ - **To create a project snippet**: Go to your project's page. Select
+ **Create new** (**{plus}**). Below **In this project**, select **New snippet**.
1. Add a **Title** and **Description**.
1. Name your **File** with an appropriate extension, such as `example.rb` or `index.html`.
Filenames with appropriate extensions display [syntax highlighting](#filenames).
@@ -257,7 +253,7 @@ GitLab forwards the spam to Akismet.
### Reduce snippets repository size
-Because versioned snippets are considered as part of the [namespace storage size](../user/admin_area/settings/account_and_limit_settings.md),
+Because versioned snippets are considered as part of the [namespace storage size](../administration/settings/account_and_limit_settings.md),
it's recommended to keep snippets' repositories as compact as possible.
For more information about tools to compact repositories,
diff --git a/doc/user/ssh.md b/doc/user/ssh.md
index a11f3c4dbd6..d92e3944521 100644
--- a/doc/user/ssh.md
+++ b/doc/user/ssh.md
@@ -76,7 +76,7 @@ must have [OpenSSH 8.2](https://www.openssh.com/releasenotes.html#8.2) or later
Available documentation suggests ED25519 is more secure than RSA.
-If you use an RSA key, the US National Institute of Science and Technology in
+If you use an RSA key, the US National Institute of Standards and Technology in
[Publication 800-57 Part 3 (PDF)](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57Pt3r1.pdf)
recommends a key size of at least 2048 bits. The default key size depends on your version of `ssh-keygen`.
Review the `man` page for your installed `ssh-keygen` command for details.
@@ -336,7 +336,7 @@ To use SSH with GitLab, copy your public key to your GitLab account:
In:
- 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).
+ guidance when [deleting keys](../administration/credentials_inventory.md#delete-a-users-ssh-key).
- GitLab checks all SSH keys at 02:00 AM UTC every day. It emails an expiration notice for all SSH keys that expire on the current date. ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/322637) in GitLab 13.11.)
- GitLab checks all SSH keys at 01:00 AM UTC every day. It emails an expiration notice for all SSH keys that are scheduled to expire seven days from now. ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/322637) in GitLab 13.11.)
1. Select **Add key**.
diff --git a/doc/user/tasks.md b/doc/user/tasks.md
index b14f4acca36..ecd5ef0c42f 100644
--- a/doc/user/tasks.md
+++ b/doc/user/tasks.md
@@ -18,7 +18,7 @@ For the latest updates, check the [Tasks Roadmap](https://gitlab.com/groups/gitl
FLAG:
On self-managed GitLab, by default this feature is available. To hide the feature,
-ask an administrator to [disable the feature flags](../administration/feature_flags.md) named `work_items`.
+an administrator can [disable the feature flags](../administration/feature_flags.md) named `work_items`.
On GitLab.com, this feature is available.
Use tasks to track steps needed for the [issue](project/issues/index.md) to be closed.
@@ -294,7 +294,7 @@ To set issue weight of a task:
> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/367456) in GitLab 15.7.
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 `work_items_mvc`.
+On self-managed GitLab, by default this feature is available. To hide the feature, an administrator can [disable the feature flag](../administration/feature_flags.md) named `work_items_mvc`.
On GitLab.com, this feature is available.
You can add a task to an [iteration](group/iterations/index.md).
@@ -359,3 +359,18 @@ To copy the task's email address:
1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project.
1. Select **Plan > Issues**, then select your issue to view it.
1. In the top right corner, select the vertical ellipsis (**{ellipsis_v}**), then select **Copy task email address**.
+
+## Two-column layout
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/415077) in GitLab 16.2 [with a flag](../administration/feature_flags.md) named `work_items_mvc_2`. Disabled by default.
+
+FLAG:
+On self-managed GitLab, by default this feature is not available. To make it available, an administrator can [enable the feature flag](../administration/feature_flags.md) named `work_items_mvc_2`.
+On GitLab.com, this feature is not available.
+This feature is not ready for production use.
+
+When enabled, tasks use a two-column layout, similar to issues.
+The description and threads are on the left, and attributes, such as labels
+or assignees, on the right.
+
+![Task two column view](img/task_two_column_view_v16_2.png)
diff --git a/doc/user/todos.md b/doc/user/todos.md
index 95bc8a553c1..97f67c67671 100644
--- a/doc/user/todos.md
+++ b/doc/user/todos.md
@@ -69,7 +69,7 @@ To-do items aren't affected by [GitLab notification email settings](profile/noti
FLAG:
On self-managed GitLab, by default this feature is not available. To make it available per user,
-ask an administrator to [enable the feature flag](../administration/feature_flags.md) named `multiple_todos`.
+an administrator can [enable the feature flag](../administration/feature_flags.md) named `multiple_todos`.
On GitLab.com, this feature is not available.
The feature is not ready for production use.
@@ -81,7 +81,7 @@ When you enable this feature:
## Create a to-do item
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/390549) in objectives, key results and, tasks in GitLab 16.0.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/390549) in objectives, key results, and tasks in GitLab 16.0.
You can manually add an item to your To-Do List.
@@ -97,10 +97,6 @@ You can manually add an item to your To-Do List.
1. In the upper-right corner, select **Add a to do** (**{todo-add}**).
- ![Adding a to-do item from the issuable sidebar](img/todos_add_todo_sidebar_v14_1.png)
-
- ![Adding a to-do item from the Objective and Key results](img/todos_add_okrs_v16_0.png)
-
## Create a to-do item by mentioning someone
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.
@@ -158,10 +154,6 @@ There are two ways to do this:
- In the To-Do List, to the right of the to-do item, select **Mark as done** (**{check}**).
- In the upper-right corner of the resource (for example, issue or merge request), select **Mark as done** (**{todo-done}**).
- ![Mark as done from the sidebar](img/todos_mark_done_sidebar_v14_1.png)
-
- ![Mark as done from the Objectives and Key results](img/todos_mark_done_okrs_v16_0.png)
-
## Mark all to-do items as done
You can mark all your to-do items as done at the same time.
diff --git a/doc/user/upgrade_email_bypass.md b/doc/user/upgrade_email_bypass.md
index afbdcbcdf09..ae47a9156c7 100644
--- a/doc/user/upgrade_email_bypass.md
+++ b/doc/user/upgrade_email_bypass.md
@@ -73,7 +73,7 @@ Your account has been blocked. Fatal: Could not read from remote repository
Your primary email address is not confirmed.
```
-You can assure your users that they have not been [Blocked](admin_area/moderate_users.md#block-and-unblock-users) by an administrator.
+You can assure your users that they have not been [Blocked](../administration/moderate_users.md#block-and-unblock-users) by an administrator.
When affected users see this message, they must confirm their email address before they can commit code.
## What do you need to know as an administrator of a GitLab self-managed Instance?
@@ -83,7 +83,7 @@ You have the following options to help your users:
- They can confirm their address through the email that they received.
- They can confirm the subject email address themselves by navigating to `https://gitlab.example.com/users/confirmation/new`.
-As an administrator, you may also confirm a user in the [Admin Area](admin_area/index.md#administering-users).
+As an administrator, you may also confirm a user in the [Admin Area](../administration/admin_area.md#administering-users).
## What do you do if you are an administrator and you're locked out?
diff --git a/doc/user/usage_quotas.md b/doc/user/usage_quotas.md
index 5c6c64a3485..d119044930a 100644
--- a/doc/user/usage_quotas.md
+++ b/doc/user/usage_quotas.md
@@ -181,7 +181,7 @@ Storage types that add to the total namespace storage are:
- Git repository
- Git LFS
-- Artifacts
+- Job artifacts
- Container registry
- Package registry
- Dependency proxy
diff --git a/doc/user/workspace/index.md b/doc/user/workspace/index.md
index eb3ce1c5aff..a101e5f5f8c 100644
--- a/doc/user/workspace/index.md
+++ b/doc/user/workspace/index.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/391543) in GitLab 16.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 `remote_development_feature_flag`. On GitLab.com, this feature is available. The feature is not ready for production use.
+On self-managed GitLab, by default this feature is available. To hide the feature, an administrator can [disable the feature flag](../../administration/feature_flags.md) named `remote_development_feature_flag`. On GitLab.com, this feature is available. The feature is not ready for production use.
WARNING:
This feature is in [Beta](../../policy/experiment-beta-support.md#beta) and subject to change without notice. To leave feedback, see the [feedback issue](https://gitlab.com/gitlab-org/gitlab/-/issues/410031).
@@ -19,6 +19,8 @@ A workspace is a virtual sandbox environment for your code in GitLab. You can us
Each workspace includes its own set of dependencies, libraries, and tools, which you can customize to meet the specific needs of each project. Workspaces use the AMD64 architecture.
+For a demo of this feature, see [GitLab Workspaces Demo](https://go.gitlab.com/qtu66q).
+
## Set up a workspace
### Prerequisites
@@ -60,6 +62,17 @@ To create a workspace:
The workspace might take a few minutes to start. To access the workspace, under **Preview**, select the workspace link.
You also have access to the terminal and can install any necessary dependencies.
+## Deleting data associated with a workspace
+
+When you delete a project, agent, user, or token associated with a workspace:
+
+- The workspace is deleted from the user interface.
+- In the Kubernetes cluster, the running workspace resources become orphaned.
+
+To clean up orphaned resources, an administrator must manually delete the workspace in Kubernetes.
+
+For more information about our plans to change the current behavior, see [issue 414384](https://gitlab.com/gitlab-org/gitlab/-/issues/414384).
+
## Devfile
A devfile is a file that defines a development environment by specifying the necessary tools, languages, runtimes, and other components for a GitLab project.
@@ -159,3 +172,17 @@ You can provide your own container image, which can run as any Linux user ID. It
GitLab uses the Linux root group ID permission to create, update, or delete files in a container. The container runtime used by the Kubernetes cluster must ensure all containers have a default Linux group ID of `0`.
If you have a container image that does not support arbitrary user IDs, you cannot create, update, or delete files in a workspace. To create a container image that supports arbitrary user IDs, see the [OpenShift documentation](https://docs.openshift.com/container-platform/4.12/openshift_images/create-images.html#use-uid_create-images).
+
+## Troubleshooting
+
+When working with workspaces, you might encounter the following issues.
+
+### `Failed to renew lease` when creating a workspace
+
+You might not be able to create a workspace due to a known issue in the GitLab agent for Kubernetes. The following error message might appear in the agent's log:
+
+```plaintext
+{"level":"info","time":"2023-01-01T00:00:00.000Z","msg":"failed to renew lease gitlab-agent-remote-dev-dev/agent-123XX-lock: timed out waiting for the condition\n","agent_id":XXXX}
+```
+
+This issue occurs when an agent instance cannot renew its leadership lease, which results in the shutdown of leader-only modules including the `remote_development` module. To resolve this issue, restart the agent instance.
diff --git a/vendor/gems/gitlab_active_record/.gitignore b/gems/activerecord-gitlab/.gitignore
index b04a8c840df..b04a8c840df 100644
--- a/vendor/gems/gitlab_active_record/.gitignore
+++ b/gems/activerecord-gitlab/.gitignore
diff --git a/gems/activerecord-gitlab/.gitlab-ci.yml b/gems/activerecord-gitlab/.gitlab-ci.yml
new file mode 100644
index 00000000000..eb94904ce90
--- /dev/null
+++ b/gems/activerecord-gitlab/.gitlab-ci.yml
@@ -0,0 +1,4 @@
+include:
+ - local: gems/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "activerecord-gitlab"
diff --git a/vendor/gems/gitlab_active_record/.rspec b/gems/activerecord-gitlab/.rspec
index 34c5164d9b5..34c5164d9b5 100644
--- a/vendor/gems/gitlab_active_record/.rspec
+++ b/gems/activerecord-gitlab/.rspec
diff --git a/gems/activerecord-gitlab/.rubocop.yml b/gems/activerecord-gitlab/.rubocop.yml
new file mode 100644
index 00000000000..5fce096769a
--- /dev/null
+++ b/gems/activerecord-gitlab/.rubocop.yml
@@ -0,0 +1,18 @@
+inherit_from:
+ - ../config/rubocop.yml
+
+# FIXME
+Gitlab/RSpec/AvoidSetup:
+ Enabled: false
+
+Database/EstablishConnection:
+ Enabled: false
+
+Database/MultipleDatabases:
+ Enabled: false
+
+RSpec/EnvAssignment:
+ Enabled: false
+
+RSpec/MultipleMemoizedHelpers:
+ Enabled: false
diff --git a/gems/activerecord-gitlab/Gemfile b/gems/activerecord-gitlab/Gemfile
new file mode 100644
index 00000000000..be173b205f7
--- /dev/null
+++ b/gems/activerecord-gitlab/Gemfile
@@ -0,0 +1,5 @@
+# frozen_string_literal: true
+
+source "https://rubygems.org"
+
+gemspec
diff --git a/gems/activerecord-gitlab/Gemfile.lock b/gems/activerecord-gitlab/Gemfile.lock
new file mode 100644
index 00000000000..ba0118eb8e3
--- /dev/null
+++ b/gems/activerecord-gitlab/Gemfile.lock
@@ -0,0 +1,104 @@
+PATH
+ remote: .
+ specs:
+ activerecord-gitlab (0.2.0)
+ activerecord (>= 7)
+
+GEM
+ remote: https://rubygems.org/
+ specs:
+ activemodel (7.0.6)
+ activesupport (= 7.0.6)
+ activerecord (7.0.6)
+ activemodel (= 7.0.6)
+ activesupport (= 7.0.6)
+ activesupport (7.0.6)
+ concurrent-ruby (~> 1.0, >= 1.0.2)
+ i18n (>= 1.6, < 2)
+ minitest (>= 5.1)
+ tzinfo (~> 2.0)
+ ast (2.4.2)
+ concurrent-ruby (1.2.2)
+ diff-lcs (1.5.0)
+ gitlab-styles (10.1.0)
+ rubocop (~> 1.50.2)
+ rubocop-graphql (~> 0.18)
+ rubocop-performance (~> 1.15)
+ rubocop-rails (~> 2.17)
+ rubocop-rspec (~> 2.22)
+ i18n (1.13.0)
+ concurrent-ruby (~> 1.0)
+ json (2.6.3)
+ mini_portile2 (2.8.2)
+ minitest (5.18.0)
+ parallel (1.23.0)
+ parser (3.2.2.3)
+ ast (~> 2.4.1)
+ racc
+ racc (1.7.1)
+ rack (3.0.8)
+ rainbow (3.1.1)
+ regexp_parser (2.8.1)
+ rexml (3.2.5)
+ rspec (3.12.0)
+ rspec-core (~> 3.12.0)
+ rspec-expectations (~> 3.12.0)
+ rspec-mocks (~> 3.12.0)
+ rspec-core (3.12.2)
+ rspec-support (~> 3.12.0)
+ rspec-expectations (3.12.3)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.12.0)
+ rspec-mocks (3.12.5)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.12.0)
+ rspec-support (3.12.0)
+ rubocop (1.50.2)
+ json (~> 2.3)
+ parallel (~> 1.10)
+ parser (>= 3.2.0.0)
+ rainbow (>= 2.2.2, < 4.0)
+ regexp_parser (>= 1.8, < 3.0)
+ rexml (>= 3.2.5, < 4.0)
+ rubocop-ast (>= 1.28.0, < 2.0)
+ ruby-progressbar (~> 1.7)
+ unicode-display_width (>= 2.4.0, < 3.0)
+ rubocop-ast (1.29.0)
+ parser (>= 3.2.1.0)
+ rubocop-capybara (2.18.0)
+ rubocop (~> 1.41)
+ rubocop-factory_bot (2.23.1)
+ rubocop (~> 1.33)
+ rubocop-graphql (0.19.0)
+ rubocop (>= 0.87, < 2)
+ rubocop-performance (1.18.0)
+ rubocop (>= 1.7.0, < 2.0)
+ rubocop-ast (>= 0.4.0)
+ rubocop-rails (2.20.2)
+ activesupport (>= 4.2.0)
+ rack (>= 1.1)
+ rubocop (>= 1.33.0, < 2.0)
+ rubocop-rspec (2.22.0)
+ rubocop (~> 1.33)
+ rubocop-capybara (~> 2.17)
+ rubocop-factory_bot (~> 2.22)
+ ruby-progressbar (1.13.0)
+ sqlite3 (1.6.3)
+ mini_portile2 (~> 2.8.0)
+ tzinfo (2.0.6)
+ concurrent-ruby (~> 1.0)
+ unicode-display_width (2.4.2)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ activerecord-gitlab!
+ gitlab-styles (~> 10.1.0)
+ rspec (~> 3.12)
+ rubocop (~> 1.50)
+ rubocop-rspec (~> 2.22)
+ sqlite3 (~> 1.6)
+
+BUNDLED WITH
+ 2.4.14
diff --git a/gems/activerecord-gitlab/README.md b/gems/activerecord-gitlab/README.md
new file mode 100644
index 00000000000..c5b56e367b9
--- /dev/null
+++ b/gems/activerecord-gitlab/README.md
@@ -0,0 +1,4 @@
+# ActiveRecord::GitlabPatches
+
+This gem adds GitLab specific Active Record patches.
+We have patches as a separate gem to isolate complexity.
diff --git a/gems/activerecord-gitlab/activerecord-gitlab.gemspec b/gems/activerecord-gitlab/activerecord-gitlab.gemspec
new file mode 100644
index 00000000000..267938d0de3
--- /dev/null
+++ b/gems/activerecord-gitlab/activerecord-gitlab.gemspec
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+require_relative "lib/active_record/gitlab_patches/version"
+
+Gem::Specification.new do |spec|
+ spec.name = "activerecord-gitlab"
+ spec.version = ActiveRecord::GitlabPatches::Version::VERSION
+ spec.authors = ["group::tenant-scale"]
+ spec.email = ["engineering@gitlab.com"]
+
+ spec.summary = "GitLab ActiveRecord patches"
+ spec.description = "GitLab stores any patches relating to ActiveRecord here"
+ spec.homepage = "https://gitlab.com/gitlab-org/gitlab/-/tree/master/gems/activerecord-gitlab"
+ spec.license = "MIT"
+ spec.required_ruby_version = ">= 3.0"
+ spec.metadata["rubygems_mfa_required"] = "true"
+
+ spec.files = Dir["lib/**/*.rb"]
+ spec.require_paths = ["lib"]
+
+ spec.add_runtime_dependency "activerecord", ">= 7"
+
+ spec.add_development_dependency "gitlab-styles", "~> 10.1.0"
+ spec.add_development_dependency "rspec", "~> 3.12"
+ spec.add_development_dependency "rubocop", "~> 1.50"
+ spec.add_development_dependency "rubocop-rspec", "~> 2.22"
+ spec.add_development_dependency "sqlite3", "~> 1.6"
+end
diff --git a/gems/activerecord-gitlab/lib/active_record/gitlab_patches.rb b/gems/activerecord-gitlab/lib/active_record/gitlab_patches.rb
new file mode 100644
index 00000000000..257602497f0
--- /dev/null
+++ b/gems/activerecord-gitlab/lib/active_record/gitlab_patches.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+require "active_record"
+require_relative "gitlab_patches/version"
+require_relative "gitlab_patches/rescue_from"
+require_relative "gitlab_patches/partitioning"
+
+module ActiveRecord
+ module GitlabPatches
+ end
+end
diff --git a/gems/activerecord-gitlab/lib/active_record/gitlab_patches/partitioning.rb b/gems/activerecord-gitlab/lib/active_record/gitlab_patches/partitioning.rb
new file mode 100644
index 00000000000..cf0bd4849e2
--- /dev/null
+++ b/gems/activerecord-gitlab/lib/active_record/gitlab_patches/partitioning.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+require_relative "partitioning/associations/builder/association"
+require_relative "partitioning/reflection/abstract_reflection"
+require_relative "partitioning/reflection/association_reflection"
+require_relative "partitioning/reflection/macro_reflection"
+require_relative "partitioning/base"
+
+module ActiveRecord
+ module GitlabPatches
+ # This allows to filter data by a dedicated column for association and joins to ActiveRecord::Base.
+ #
+ # class ApplicationRecord < ActiveRecord::Base
+ # belongs_to :pipeline,
+ # -> (build) { where(partition_id: build.partition_id) },
+ # partition_foreign_key: :partition_id
+ #
+ # To control the join filter
+ # def self.use_partition_id_filter?
+ # Feature.enabled?(...)
+ # end
+ # end
+ module Partitioning
+ ActiveSupport.on_load(:active_record) do
+ ::ActiveRecord::Associations::Builder::Association.prepend(
+ ActiveRecord::GitlabPatches::Partitioning::Associations::Builder::Association
+ )
+ ::ActiveRecord::Reflection::AbstractReflection.prepend(
+ ActiveRecord::GitlabPatches::Partitioning::Reflection::AbstractReflection
+ )
+ ::ActiveRecord::Reflection::AssociationReflection.prepend(
+ ActiveRecord::GitlabPatches::Partitioning::Reflection::AssociationReflection
+ )
+ ::ActiveRecord::Reflection::MacroReflection.prepend(
+ ActiveRecord::GitlabPatches::Partitioning::Reflection::MacroReflection
+ )
+ ::ActiveRecord::Base.prepend(
+ ActiveRecord::GitlabPatches::Partitioning::Base
+ )
+ end
+ end
+ end
+end
diff --git a/gems/activerecord-gitlab/lib/active_record/gitlab_patches/partitioning/associations/builder/association.rb b/gems/activerecord-gitlab/lib/active_record/gitlab_patches/partitioning/associations/builder/association.rb
new file mode 100644
index 00000000000..3c92ba91c31
--- /dev/null
+++ b/gems/activerecord-gitlab/lib/active_record/gitlab_patches/partitioning/associations/builder/association.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module ActiveRecord
+ module GitlabPatches
+ module Partitioning
+ module Associations
+ module Builder
+ module Association
+ extend ActiveSupport::Concern
+
+ class_methods do
+ def valid_options(options)
+ super + [:partition_foreign_key]
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/gems/activerecord-gitlab/lib/active_record/gitlab_patches/partitioning/base.rb b/gems/activerecord-gitlab/lib/active_record/gitlab_patches/partitioning/base.rb
new file mode 100644
index 00000000000..0c8a248b984
--- /dev/null
+++ b/gems/activerecord-gitlab/lib/active_record/gitlab_patches/partitioning/base.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+if ::ActiveRecord::VERSION::STRING >= "7.1"
+ raise 'New version of active-record detected, please remove or update this patch'
+end
+
+module ActiveRecord
+ module GitlabPatches
+ module Partitioning
+ module Base
+ extend ActiveSupport::Concern
+
+ def _query_constraints_hash
+ constraints_hash = super
+
+ return constraints_hash unless self.class.use_partition_id_filter?
+
+ if self.class.query_constraints_list.nil?
+ { @primary_key => id_in_database } # rubocop:disable Gitlab/ModuleWithInstanceVariables
+ else
+ self.class.query_constraints_list.index_with do |column_name|
+ attribute_in_database(column_name)
+ end
+ end
+ end
+
+ class_methods do
+ def use_partition_id_filter?
+ false
+ end
+
+ def query_constraints(*columns_list)
+ raise ArgumentError, "You must specify at least one column to be used in querying" if columns_list.empty?
+
+ @query_constraints_list = columns_list.map(&:to_s)
+ end
+
+ def query_constraints_list # :nodoc:
+ @query_constraints_list ||= if base_class? || primary_key != base_class.primary_key
+ primary_key if primary_key.is_a?(Array)
+ else
+ base_class.query_constraints_list
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/gems/activerecord-gitlab/lib/active_record/gitlab_patches/partitioning/reflection/abstract_reflection.rb b/gems/activerecord-gitlab/lib/active_record/gitlab_patches/partitioning/reflection/abstract_reflection.rb
new file mode 100644
index 00000000000..7532cd120a5
--- /dev/null
+++ b/gems/activerecord-gitlab/lib/active_record/gitlab_patches/partitioning/reflection/abstract_reflection.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module ActiveRecord
+ module GitlabPatches
+ module Partitioning
+ module Reflection
+ module AbstractReflection
+ extend ActiveSupport::Concern
+
+ def join_scope(table, foreign_table, foreign_klass)
+ klass_scope = super
+ return klass_scope unless respond_to?(:options)
+
+ partition_foreign_key = options[:partition_foreign_key]
+ if partition_foreign_key && klass.use_partition_id_filter?
+ klass_scope.where!(table[:partition_id].eq(foreign_table[partition_foreign_key]))
+ end
+
+ klass_scope
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/gems/activerecord-gitlab/lib/active_record/gitlab_patches/partitioning/reflection/association_reflection.rb b/gems/activerecord-gitlab/lib/active_record/gitlab_patches/partitioning/reflection/association_reflection.rb
new file mode 100644
index 00000000000..299ceaab973
--- /dev/null
+++ b/gems/activerecord-gitlab/lib/active_record/gitlab_patches/partitioning/reflection/association_reflection.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module ActiveRecord
+ module GitlabPatches
+ module Partitioning
+ module Reflection
+ module AssociationReflection
+ def check_eager_loadable!
+ return if scope && scope.arity == 1 && options.key?(:partition_foreign_key)
+
+ super
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/gems/activerecord-gitlab/lib/active_record/gitlab_patches/partitioning/reflection/macro_reflection.rb b/gems/activerecord-gitlab/lib/active_record/gitlab_patches/partitioning/reflection/macro_reflection.rb
new file mode 100644
index 00000000000..7ec7da44253
--- /dev/null
+++ b/gems/activerecord-gitlab/lib/active_record/gitlab_patches/partitioning/reflection/macro_reflection.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module ActiveRecord
+ module GitlabPatches
+ module Partitioning
+ module Reflection
+ module MacroReflection
+ def scope_for(relation, owner = nil)
+ if scope.arity == 1 && owner.nil? && options.key?(:partition_foreign_key)
+ relation
+ else
+ super
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/gems/activerecord-gitlab/lib/active_record/gitlab_patches/rescue_from.rb b/gems/activerecord-gitlab/lib/active_record/gitlab_patches/rescue_from.rb
new file mode 100644
index 00000000000..eaa42d1523d
--- /dev/null
+++ b/gems/activerecord-gitlab/lib/active_record/gitlab_patches/rescue_from.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+module ActiveRecord
+ module GitlabPatches
+ # This adds `rescue_from` to ActiveRecord::Base.
+ # Currently, only errors called from `ActiveRecord::Relation#exec_queries`
+ # will be handled by `rescue_from`.
+ #
+ # class ApplicationRecord < ActiveRecord::Base
+ # rescue_from MyException, with: :my_handler
+ #
+ # def my_handler(exception)
+ # Rails.logger.info exception.message
+ #
+ # raise exception
+ # end
+ # end
+ module RescueFrom
+ extend ActiveSupport::Concern
+
+ prepended do |base|
+ base.include ActiveSupport::Rescuable
+ end
+ end
+
+ module ExecQueriesRescueWithHandler
+ def exec_queries
+ super
+ rescue StandardError => e
+ klass.rescue_with_handler(e) || raise
+ end
+ end
+ end
+end
+
+ActiveSupport.on_load(:active_record) do
+ ActiveRecord::Relation.prepend(ActiveRecord::GitlabPatches::ExecQueriesRescueWithHandler)
+ ActiveRecord::Base.prepend(ActiveRecord::GitlabPatches::RescueFrom)
+end
diff --git a/gems/activerecord-gitlab/lib/active_record/gitlab_patches/version.rb b/gems/activerecord-gitlab/lib/active_record/gitlab_patches/version.rb
new file mode 100644
index 00000000000..00c5f254da8
--- /dev/null
+++ b/gems/activerecord-gitlab/lib/active_record/gitlab_patches/version.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module ActiveRecord
+ module GitlabPatches
+ module Version
+ VERSION = "0.2.0"
+ end
+ end
+end
diff --git a/gems/activerecord-gitlab/spec/active_record/gitlab_patches/partitioning/associations/belongs_to_spec.rb b/gems/activerecord-gitlab/spec/active_record/gitlab_patches/partitioning/associations/belongs_to_spec.rb
new file mode 100644
index 00000000000..900a270c0a8
--- /dev/null
+++ b/gems/activerecord-gitlab/spec/active_record/gitlab_patches/partitioning/associations/belongs_to_spec.rb
@@ -0,0 +1,52 @@
+# frozen_string_literal: true
+
+RSpec.describe 'ActiveRecord::GitlabPatches::Partitioning::Associations::BelongsTo', :partitioning do
+ let(:pipeline) { Pipeline.create!(partition_id: 100) }
+ let(:job) { Job.create!(pipeline: pipeline, partition_id: pipeline.partition_id) }
+
+ it 'finds associated record using partition_id' do
+ find_statement = <<~SQL.squish
+ SELECT \"pipelines\".*
+ FROM \"pipelines\"
+ WHERE \"pipelines\".\"id\" = #{pipeline.id}
+ AND \"pipelines\".\"partition_id\" = #{job.partition_id}
+ LIMIT 1
+ SQL
+
+ result = QueryRecorder.log do
+ job.reset.pipeline
+ end
+
+ expect(result).to include(find_statement)
+ end
+
+ it 'builds records using partition_id' do
+ pipeline = job.build_pipeline
+
+ expect(pipeline.partition_id).to eq(job.partition_id)
+ end
+
+ it 'saves records using partition_id' do
+ create_statement = <<~SQL.squish
+ INSERT INTO \"pipelines\" (\"partition_id\") VALUES (#{job.partition_id})
+ SQL
+
+ result = QueryRecorder.log do
+ job.build_pipeline.save!
+ end
+
+ expect(result).to include(create_statement)
+ end
+
+ it 'creates records using partition_id' do
+ create_statement = <<~SQL.squish
+ INSERT INTO \"pipelines\" (\"partition_id\") VALUES (#{job.partition_id})
+ SQL
+
+ result = QueryRecorder.log do
+ job.create_pipeline!
+ end
+
+ expect(result).to include(create_statement)
+ end
+end
diff --git a/gems/activerecord-gitlab/spec/active_record/gitlab_patches/partitioning/associations/has_many_spec.rb b/gems/activerecord-gitlab/spec/active_record/gitlab_patches/partitioning/associations/has_many_spec.rb
new file mode 100644
index 00000000000..3d6b24de998
--- /dev/null
+++ b/gems/activerecord-gitlab/spec/active_record/gitlab_patches/partitioning/associations/has_many_spec.rb
@@ -0,0 +1,115 @@
+# frozen_string_literal: true
+
+RSpec.describe 'ActiveRecord::GitlabPatches::Partitioning::Associations::HasMany', :partitioning do
+ let(:pipeline) { Pipeline.create!(partition_id: 100) }
+ let(:job) { Job.create!(pipeline: pipeline, partition_id: pipeline.partition_id) }
+
+ it 'finds individual records using partition_id' do
+ find_statement = <<~SQL.squish
+ SELECT \"jobs\".*
+ FROM \"jobs\"
+ WHERE \"jobs\".\"pipeline_id\" = #{pipeline.id}
+ AND \"jobs\".\"partition_id\" = #{pipeline.partition_id}
+ AND \"jobs\".\"id\" = #{job.id}
+ LIMIT 1
+ SQL
+
+ result = QueryRecorder.log do
+ pipeline.jobs.find(job.id)
+ end
+
+ expect(result).to include(find_statement)
+ end
+
+ it 'finds all records using partition_id' do
+ find_statement = <<~SQL.squish
+ SELECT \"jobs\".*
+ FROM \"jobs\"
+ WHERE \"jobs\".\"pipeline_id\" = #{pipeline.id}
+ AND \"jobs\".\"partition_id\" = #{pipeline.partition_id}
+ SQL
+
+ result = QueryRecorder.log do
+ pipeline.jobs.all.to_a
+ end
+
+ expect(result).to include(find_statement)
+ end
+
+ it 'jobs records using partition_id' do
+ build = pipeline.jobs.new(name: 'test job')
+
+ expect(build.pipeline_id).to eq(pipeline.id)
+ expect(build.partition_id).to eq(pipeline.partition_id)
+ end
+
+ it 'saves records using partition_id' do
+ create_statement = <<~SQL.squish
+ INSERT INTO \"jobs\" (\"pipeline_id\", \"partition_id\", \"name\")
+ VALUES (#{pipeline.id}, #{pipeline.partition_id}, 'test job')
+ SQL
+
+ result = QueryRecorder.log do
+ build = pipeline.jobs.new(name: 'test job')
+ build.save!
+ end
+
+ expect(result).to include(create_statement)
+ end
+
+ it 'creates records using partition_id' do
+ create_statement = <<~SQL.squish
+ INSERT INTO \"jobs\" (\"pipeline_id\", \"partition_id\", \"name\")
+ VALUES (#{pipeline.id}, #{pipeline.partition_id}, 'test job')
+ SQL
+
+ result = QueryRecorder.log do
+ pipeline.jobs.create!(name: 'test job')
+ end
+
+ expect(result).to include(create_statement)
+ end
+
+ it 'deletes_all records using partition_id' do
+ delete_statement = <<~SQL.squish
+ DELETE FROM \"jobs\"
+ WHERE \"jobs\".\"pipeline_id\" = #{pipeline.id}
+ AND \"jobs\".\"partition_id\" = #{pipeline.partition_id}
+ SQL
+
+ result = QueryRecorder.log do
+ pipeline.jobs.delete_all
+ end
+
+ expect(result).to include(delete_statement)
+ end
+
+ it 'destroy_all records using partition_id' do
+ destroy_statement = <<~SQL.squish
+ DELETE FROM \"jobs\"
+ WHERE \"jobs\".\"id\" = #{job.id}
+ AND \"jobs\".\"partition_id\" = #{pipeline.partition_id}
+ SQL
+
+ result = QueryRecorder.log do
+ pipeline.jobs.destroy_all # rubocop: disable Cop/DestroyAll
+ end
+
+ expect(result).to include(destroy_statement)
+ end
+
+ it 'counts records using partition_id' do
+ destroy_statement = <<~SQL.squish
+ SELECT COUNT(*)
+ FROM \"jobs\"
+ WHERE \"jobs\".\"pipeline_id\" = #{pipeline.id}
+ AND \"jobs\".\"partition_id\" = #{pipeline.partition_id}
+ SQL
+
+ result = QueryRecorder.log do
+ pipeline.jobs.count
+ end
+
+ expect(result).to include(destroy_statement)
+ end
+end
diff --git a/gems/activerecord-gitlab/spec/active_record/gitlab_patches/partitioning/associations/has_one_spec.rb b/gems/activerecord-gitlab/spec/active_record/gitlab_patches/partitioning/associations/has_one_spec.rb
new file mode 100644
index 00000000000..aeb565c6dad
--- /dev/null
+++ b/gems/activerecord-gitlab/spec/active_record/gitlab_patches/partitioning/associations/has_one_spec.rb
@@ -0,0 +1,101 @@
+# frozen_string_literal: true
+
+RSpec.describe 'ActiveRecord::GitlabPatches::Partitioning::Associations::HasOne', :partitioning do
+ let(:pipeline) { Pipeline.create!(partition_id: 100) }
+ let(:job) { Job.create!(pipeline: pipeline, partition_id: pipeline.partition_id) }
+
+ it 'finds associated record using partition_id' do
+ find_statement = <<~SQL.squish
+ SELECT \"metadata\".*
+ FROM \"metadata\"
+ WHERE \"metadata\".\"job_id\" = #{job.id}
+ AND \"metadata\".\"partition_id\" = #{job.partition_id}
+ LIMIT 1
+ SQL
+
+ result = QueryRecorder.log do
+ job.reset.metadata
+ end
+
+ expect(result).to include(find_statement)
+ end
+
+ it 'builds records using partition_id' do
+ metadata = job.build_metadata
+
+ expect(metadata.job_id).to eq(job.id)
+ expect(metadata.partition_id).to eq(job.partition_id)
+ end
+
+ it 'saves records using partition_id' do
+ create_statement = <<~SQL.squish
+ INSERT INTO \"metadata\" (\"job_id\", \"partition_id\") VALUES (#{job.id}, #{job.partition_id})
+ SQL
+
+ result = QueryRecorder.log do
+ job.build_metadata.save!
+ end
+
+ expect(result).to include(create_statement)
+ end
+
+ it 'creates records using partition_id' do
+ create_statement = <<~SQL.squish
+ INSERT INTO \"metadata\" (\"job_id\", \"partition_id\") VALUES (#{job.id}, #{job.partition_id})
+ SQL
+
+ result = QueryRecorder.log do
+ job.create_metadata
+ end
+
+ expect(result).to include(create_statement)
+ end
+
+ it 'uses nested attributes on create' do
+ skip '`partitionable` will assign the `partition_id` value in this case.'
+
+ statement1 = <<~SQL.squish
+ INSERT INTO \"jobs\" (\"pipeline_id\", \"partition_id\", \"name\")
+ VALUES (#{pipeline.id}, #{pipeline.partition_id}, 'test')
+ SQL
+
+ statement2 = <<~SQL.squish
+ INSERT INTO \"metadata\" (\"job_id\", \"partition_id\", \"test_flag\")
+ VALUES (#{job.id}, #{job.partition_id}, 1)
+ SQL
+
+ insert_statements = [statement1, statement2]
+
+ result = QueryRecorder.log do
+ pipeline.jobs.create!(name: 'test', metadata_attributes: { test_flag: true })
+ end
+
+ insert_statements.each do |statement|
+ expect(result).to include(statement)
+ end
+ end
+
+ it 'uses nested attributes on update' do
+ statement1 = <<~SQL.squish
+ UPDATE \"jobs\" SET \"name\" = 'other test'
+ WHERE \"jobs\".\"id\" = #{job.id} AND \"jobs\".\"partition_id\" = #{job.partition_id}
+ SQL
+
+ statement2 = <<~SQL.squish
+ INSERT INTO \"metadata\" (\"job_id\", \"partition_id\", \"test_flag\") VALUES (#{job.id}, #{job.partition_id}, 1)
+ SQL
+
+ update_statements = [statement1, statement2]
+
+ job.name = 'other test'
+ job.metadata_attributes = { test_flag: true }
+
+ result = QueryRecorder.log do
+ job.save!
+ end
+
+ update_statements.each do |statement|
+ expect(result).to include(statement)
+ end
+ end
+end
diff --git a/gems/activerecord-gitlab/spec/active_record/gitlab_patches/partitioning/joins_spec.rb b/gems/activerecord-gitlab/spec/active_record/gitlab_patches/partitioning/joins_spec.rb
new file mode 100644
index 00000000000..038fae43644
--- /dev/null
+++ b/gems/activerecord-gitlab/spec/active_record/gitlab_patches/partitioning/joins_spec.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+RSpec.describe 'ActiveRecord::GitlabPatches::Partitioning::Associations::Joins', :partitioning do
+ let!(:pipeline) { Pipeline.create!(partition_id: 100) }
+ let!(:job) { Job.create!(pipeline: pipeline, partition_id: pipeline.partition_id) }
+ let!(:metadata) { Metadata.create!(job: job, partition_id: job.partition_id) }
+
+ it 'joins using partition_id' do
+ join_statement = <<~SQL.squish
+ SELECT \"pipelines\".*
+ FROM \"pipelines\"
+ INNER JOIN \"jobs\" ON \"jobs\".\"pipeline_id\" = \"pipelines\".\"id\"
+ AND \"jobs\".\"partition_id\" = \"pipelines\".\"partition_id\"
+ WHERE \"pipelines\".\"partition_id\" = #{pipeline.partition_id}
+ SQL
+
+ result = QueryRecorder.log do
+ Pipeline.where(partition_id: pipeline.partition_id).joins(:jobs).to_a
+ end
+
+ expect(result).to include(join_statement)
+ end
+
+ it 'joins other models using partition_id' do
+ join_statement = <<~SQL.squish
+ SELECT \"pipelines\".*
+ FROM \"pipelines\"
+ INNER JOIN \"jobs\" ON \"jobs\".\"pipeline_id\" = \"pipelines\".\"id\"
+ AND \"jobs\".\"partition_id\" = \"pipelines\".\"partition_id\"
+ INNER JOIN \"metadata\" ON \"metadata\".\"job_id\" = \"jobs\".\"id\"
+ AND \"metadata\".\"partition_id\" = \"jobs\".\"partition_id\"
+ WHERE \"pipelines\".\"partition_id\" = #{pipeline.partition_id}
+ SQL
+
+ result = QueryRecorder.log do
+ Pipeline.where(partition_id: pipeline.partition_id).joins(jobs: :metadata).to_a
+ end
+
+ expect(result).to include(join_statement)
+ end
+end
diff --git a/gems/activerecord-gitlab/spec/active_record/gitlab_patches/partitioning/preloads_spec.rb b/gems/activerecord-gitlab/spec/active_record/gitlab_patches/partitioning/preloads_spec.rb
new file mode 100644
index 00000000000..f37a563fe9e
--- /dev/null
+++ b/gems/activerecord-gitlab/spec/active_record/gitlab_patches/partitioning/preloads_spec.rb
@@ -0,0 +1,241 @@
+# frozen_string_literal: true
+
+RSpec.describe 'ActiveRecord::GitlabPatches::Partitioning::Associations::Preloads', :partitioning do
+ let(:project) { Project.create! }
+
+ let!(:pipeline) { Pipeline.create!(project: project, partition_id: 100) }
+ let!(:other_pipeline) { Pipeline.create!(project: project, partition_id: 100) }
+
+ let!(:job) { Job.create!(pipeline: pipeline, partition_id: pipeline.partition_id) }
+ let!(:other_job) { Job.create!(pipeline: pipeline, partition_id: pipeline.partition_id) }
+
+ describe 'preload queries with single partition' do
+ it 'preloads metadata for jobs' do
+ statement1 = <<~SQL.squish
+ SELECT \"jobs\".* FROM \"jobs\" WHERE \"jobs\".\"partition_id\" = 100
+ SQL
+
+ statement2 = <<~SQL.squish
+ SELECT \"metadata\".* FROM \"metadata\"
+ WHERE \"metadata\".\"partition_id\" = 100 AND \"metadata\".\"job_id\" IN (#{job.id}, #{other_job.id})
+ SQL
+
+ preload_statements = [statement1, statement2]
+
+ result = QueryRecorder.log do
+ Job.where(partition_id: 100).preload(:metadata).to_a
+ end
+
+ preload_statements.each do |statement|
+ expect(result).to include(statement)
+ end
+ end
+
+ it 'preloads jobs for pipelines' do
+ statement1 = <<~SQL.squish
+ SELECT \"pipelines\".* FROM \"pipelines\" WHERE \"pipelines\".\"partition_id\" = 100
+ SQL
+
+ statement2 = <<~SQL.squish
+ SELECT \"jobs\".* FROM \"jobs\"
+ WHERE \"jobs\".\"partition_id\" = 100 AND \"jobs\".\"pipeline_id\" IN (#{pipeline.id}, #{other_pipeline.id})
+ SQL
+
+ preload_statements = [statement1, statement2]
+
+ result = QueryRecorder.log do
+ Pipeline.where(partition_id: 100).preload(:jobs).to_a
+ end
+
+ preload_statements.each do |statement|
+ expect(result).to include(statement)
+ end
+ end
+
+ it 'preloads jobs and metadata for pipelines' do
+ statement1 = <<~SQL.squish
+ SELECT \"pipelines\".* FROM \"pipelines\" WHERE \"pipelines\".\"partition_id\" = 100
+ SQL
+
+ statement2 = <<~SQL.squish
+ SELECT \"jobs\".* FROM \"jobs\"
+ WHERE \"jobs\".\"partition_id\" = 100 AND \"jobs\".\"pipeline_id\" IN (#{pipeline.id}, #{other_pipeline.id})
+ SQL
+
+ statement3 = <<~SQL.squish
+ SELECT \"metadata\".* FROM \"metadata\"
+ WHERE \"metadata\".\"partition_id\" = 100 AND \"metadata\".\"job_id\" IN (#{job.id}, #{other_job.id})
+ SQL
+
+ preload_statements = [statement1, statement2, statement3]
+
+ result = QueryRecorder.log do
+ Pipeline.where(partition_id: 100).preload(jobs: :metadata).to_a
+ end
+
+ preload_statements.each do |statement|
+ expect(result).to include(statement)
+ end
+ end
+ end
+
+ describe 'preload queries with multiple partitions' do
+ let!(:recent_pipeline) { Pipeline.create!(project: project, partition_id: 200) }
+ let!(:test_job) { Job.create!(pipeline: recent_pipeline, partition_id: recent_pipeline.partition_id) }
+ let!(:deploy_job) { Job.create!(pipeline: recent_pipeline, partition_id: recent_pipeline.partition_id) }
+
+ it 'preloads metadata for jobs' do
+ statement1 = <<~SQL.squish
+ SELECT \"jobs\".* FROM \"jobs\" WHERE \"jobs\".\"partition_id\" IN (100, 200)
+ SQL
+
+ statement2 = <<~SQL.squish
+ SELECT \"metadata\".* FROM \"metadata\"
+ WHERE \"metadata\".\"partition_id\" = 100 AND \"metadata\".\"job_id\" IN (#{job.id}, #{other_job.id})
+ SQL
+
+ statement3 = <<~SQL.squish
+ SELECT \"jobs\".* FROM \"jobs\" WHERE \"jobs\".\"partition_id\" IN (100, 200)
+ SQL
+
+ preload_statements = [statement1, statement2, statement3]
+
+ result = QueryRecorder.log do
+ Job.where(partition_id: [100, 200]).preload(:metadata).to_a
+ end
+
+ preload_statements.each do |statement|
+ expect(result).to include(statement)
+ end
+ end
+
+ it 'preloads jobs for pipelines' do
+ statement1 = <<~SQL.squish
+ SELECT \"pipelines\".* FROM \"pipelines\" WHERE \"pipelines\".\"partition_id\" IN (100, 200)
+ SQL
+
+ statement2 = <<~SQL.squish
+ SELECT \"jobs\".* FROM \"jobs\"
+ WHERE \"jobs\".\"partition_id\" = 100 AND \"jobs\".\"pipeline_id\" IN (#{pipeline.id}, #{other_pipeline.id})
+ SQL
+
+ statement3 = <<~SQL.squish
+ SELECT \"jobs\".* FROM \"jobs\"
+ WHERE \"jobs\".\"partition_id\" = 200 AND \"jobs\".\"pipeline_id\" = #{recent_pipeline.id}
+ SQL
+
+ preload_statements = [statement1, statement2, statement3]
+
+ result = QueryRecorder.log do
+ Pipeline.where(partition_id: [100, 200]).preload(:jobs).to_a
+ end
+
+ preload_statements.each do |statement|
+ expect(result).to include(statement)
+ end
+ end
+
+ it 'preloads jobs and metadata for pipelines' do
+ statement1 = <<~SQL.squish
+ SELECT \"pipelines\".* FROM \"pipelines\" WHERE \"pipelines\".\"partition_id\" IN (100, 200)
+ SQL
+
+ statement2 = <<~SQL.squish
+ SELECT \"jobs\".* FROM \"jobs\"
+ WHERE \"jobs\".\"partition_id\" = 100 AND \"jobs\".\"pipeline_id\" IN (#{pipeline.id}, #{other_pipeline.id})
+ SQL
+
+ statement3 = <<~SQL.squish
+ SELECT \"jobs\".* FROM \"jobs\"
+ WHERE \"jobs\".\"partition_id\" = 200 AND \"jobs\".\"pipeline_id\" = #{recent_pipeline.id}
+ SQL
+
+ statement4 = <<~SQL.squish
+ SELECT \"metadata\".* FROM \"metadata\"
+ WHERE \"metadata\".\"partition_id\" = 100 AND \"metadata\".\"job_id\" IN (#{job.id}, #{other_job.id})
+ SQL
+
+ statement5 = <<~SQL.squish
+ SELECT \"metadata\".* FROM \"metadata\"
+ WHERE \"metadata\".\"partition_id\" = 200 AND \"metadata\".\"job_id\" IN (#{test_job.id}, #{deploy_job.id})
+ SQL
+
+ preload_statements = [statement1, statement2, statement3, statement4, statement5]
+
+ result = QueryRecorder.log do
+ Pipeline.where(partition_id: [100, 200]).preload(jobs: :metadata).to_a
+ end
+
+ preload_statements.each do |statement|
+ expect(result).to include(statement)
+ end
+ end
+ end
+
+ describe 'includes queries' do
+ it 'preloads data for pipeline with multiple queries' do
+ statement1 = <<~SQL.squish
+ SELECT \"pipelines\".* FROM \"pipelines\"
+ WHERE \"pipelines\".\"project_id\" = 1 AND \"pipelines\".\"id\"
+ IN (#{pipeline.id}, #{other_pipeline.id}) AND \"pipelines\".\"partition_id\" = 100
+ SQL
+
+ statement2 = <<~SQL.squish
+ SELECT \"jobs\".* FROM \"jobs\"
+ WHERE \"jobs\".\"partition_id\" = 100 AND \"jobs\".\"pipeline_id\" IN (#{pipeline.id}, #{other_pipeline.id})
+ SQL
+
+ statement3 = <<~SQL.squish
+ SELECT \"metadata\".* FROM \"metadata\"
+ WHERE \"metadata\".\"partition_id\" = 100 AND \"metadata\".\"job_id\" IN (#{job.id}, #{other_job.id})
+ SQL
+
+ preload_statements = [statement1, statement2, statement3]
+
+ result = QueryRecorder.log do
+ project.pipelines.includes(jobs: :metadata).where(id: [pipeline.id, other_pipeline.id], partition_id: 100).to_a
+ end
+
+ preload_statements.each do |statement|
+ expect(result).to include(statement)
+ end
+ end
+
+ it 'preloads data for pipeline with join query' do
+ preload_statement = <<~SQL.squish
+ SELECT \"pipelines\".\"id\"
+ AS t0_r0, \"pipelines\".\"project_id\"
+ AS t0_r1, \"pipelines\".\"partition_id\"
+ AS t0_r2, \"jobs\".\"id\"
+ AS t1_r0, \"jobs\".\"pipeline_id\"
+ AS t1_r1, \"jobs\".\"partition_id\"
+ AS t1_r2, \"jobs\".\"name\"
+ AS t1_r3, \"metadata\".\"id\"
+ AS t2_r0, \"metadata\".\"job_id\"
+ AS t2_r1, \"metadata\".\"partition_id\"
+ AS t2_r2, \"metadata\".\"test_flag\"
+ AS t2_r3
+ FROM \"pipelines\"
+ LEFT OUTER JOIN \"jobs\" ON \"jobs\".\"pipeline_id\" = \"pipelines\".\"id\"
+ AND \"jobs\".\"partition_id\" = \"pipelines\".\"partition_id\"
+ LEFT OUTER JOIN \"metadata\" ON \"metadata\".\"job_id\" = \"jobs\".\"id\"
+ AND \"metadata\".\"partition_id\" = \"jobs\".\"partition_id\"
+ WHERE \"pipelines\".\"project_id\" = 1
+ AND \"pipelines\".\"id\"
+ IN (#{pipeline.id}, #{other_pipeline.id})
+ AND \"pipelines\".\"partition_id\" = 100
+ SQL
+
+ result = QueryRecorder.log do
+ project
+ .pipelines
+ .includes(jobs: :metadata)
+ .references(:jobs, :metadata)
+ .where(id: [1, 2], partition_id: 100)
+ .to_a
+ end
+
+ expect(result).to include(preload_statement)
+ end
+ end
+end
diff --git a/gems/activerecord-gitlab/spec/active_record/gitlab_patches/partitioning/single_model_queries_spec.rb b/gems/activerecord-gitlab/spec/active_record/gitlab_patches/partitioning/single_model_queries_spec.rb
new file mode 100644
index 00000000000..b035d7a6277
--- /dev/null
+++ b/gems/activerecord-gitlab/spec/active_record/gitlab_patches/partitioning/single_model_queries_spec.rb
@@ -0,0 +1,110 @@
+# frozen_string_literal: true
+
+RSpec.describe 'ActiveRecord::GitlabPatches::Partitioning::Associations::SingleModelQueries', :partitioning do
+ let(:project) { Project.create! }
+ let(:pipeline) { Pipeline.create!(project: project, partition_id: 100) }
+ let(:job) { Job.create!(pipeline: pipeline, partition_id: pipeline.partition_id) }
+
+ it 'creates using id and partition_id' do
+ create_statement = <<~SQL.squish
+ INSERT INTO \"jobs\" (\"pipeline_id\", \"partition_id\")
+ VALUES (#{pipeline.id}, #{pipeline.partition_id})
+ SQL
+
+ result = QueryRecorder.log do
+ Job.create!(pipeline_id: pipeline.id, partition_id: pipeline.partition_id)
+ end
+
+ expect(result).to include(create_statement)
+ end
+
+ it 'finds with id and partition_id' do
+ find_statement = <<~SQL.squish
+ SELECT \"jobs\".*
+ FROM \"jobs\"
+ WHERE \"jobs\".\"id\" = #{job.id}
+ AND \"jobs\".\"partition_id\" = #{job.partition_id}
+ LIMIT 1
+ SQL
+
+ result = QueryRecorder.log do
+ Job.find_by!(id: job.id, partition_id: job.partition_id)
+ end
+
+ expect(result).to include(find_statement)
+ end
+
+ it 'saves using id and partition_id' do
+ update_statement = <<~SQL.squish
+ UPDATE \"jobs\"
+ SET \"name\" = 'test'
+ WHERE \"jobs\".\"id\" = #{job.id}
+ AND \"jobs\".\"partition_id\" = #{job.partition_id}
+ SQL
+
+ result = QueryRecorder.log do
+ job.name = 'test'
+
+ job.save!
+ end
+
+ expect(result).to include(update_statement)
+ end
+
+ it 'updates using id and partition_id' do
+ update_statement = <<~SQL.squish
+ UPDATE \"jobs\"
+ SET \"name\" = 'test2'
+ WHERE \"jobs\".\"id\" = #{job.id}
+ AND \"jobs\".\"partition_id\" = #{job.partition_id}
+ SQL
+
+ result = QueryRecorder.log do
+ job.update!(name: 'test2')
+ end
+
+ expect(result).to include(update_statement)
+ end
+
+ it 'deletes using id and partition_id' do
+ delete_statement = <<~SQL.squish
+ DELETE FROM \"jobs\"
+ WHERE \"jobs\".\"id\" = #{job.id}
+ AND \"jobs\".\"partition_id\" = #{job.partition_id}
+ SQL
+
+ result = QueryRecorder.log do
+ job.delete
+ end
+
+ expect(result).to include(delete_statement)
+ end
+
+ it 'destroys using id and partition_id' do
+ destroy_statement = <<~SQL.squish
+ DELETE FROM \"jobs\"
+ WHERE \"jobs\".\"id\" = #{job.id}
+ AND \"jobs\".\"partition_id\" = #{job.partition_id}
+ SQL
+
+ result = QueryRecorder.log do
+ job.destroy
+ end
+
+ expect(result).to include(destroy_statement)
+ end
+
+ it 'destroy_all using partition_id' do
+ destroy_statement = <<~SQL.squish
+ DELETE FROM \"jobs\"
+ WHERE \"jobs\".\"id\" = #{job.id}
+ AND \"jobs\".\"partition_id\" = #{job.partition_id}
+ SQL
+
+ result = QueryRecorder.log do
+ Job.where(id: job.id).destroy_all # rubocop: disable Cop/DestroyAll
+ end
+
+ expect(result).to include(destroy_statement)
+ end
+end
diff --git a/gems/activerecord-gitlab/spec/active_record/gitlab_patches/rescue_from_spec.rb b/gems/activerecord-gitlab/spec/active_record/gitlab_patches/rescue_from_spec.rb
new file mode 100644
index 00000000000..c1537c3bd90
--- /dev/null
+++ b/gems/activerecord-gitlab/spec/active_record/gitlab_patches/rescue_from_spec.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+RSpec.describe ActiveRecord::GitlabPatches::RescueFrom, :without_sqlite3 do
+ let(:model_with_rescue_from) do
+ Class.new(ActiveRecord::Base) do
+ rescue_from ActiveRecord::ConnectionNotEstablished, with: :handle_exception
+
+ class << self
+ def handle_exception(exception); end
+ end
+ end
+ end
+
+ let(:model_without_rescue_from) do
+ Class.new(ActiveRecord::Base)
+ end
+
+ it 'triggers rescue_from' do
+ stub_const('ModelWithRescueFrom', model_with_rescue_from)
+
+ expect(model_with_rescue_from).to receive(:handle_exception)
+
+ expect { model_with_rescue_from.all.load }.not_to raise_error
+ end
+
+ it 'does not trigger rescue_from' do
+ stub_const('ModelWithoutRescueFrom', model_without_rescue_from)
+
+ expect { model_without_rescue_from.all.load }.to raise_error(ActiveRecord::ConnectionNotEstablished)
+ end
+end
diff --git a/gems/activerecord-gitlab/spec/active_record/gitlab_patches_spec.rb b/gems/activerecord-gitlab/spec/active_record/gitlab_patches_spec.rb
new file mode 100644
index 00000000000..2e029a6adbf
--- /dev/null
+++ b/gems/activerecord-gitlab/spec/active_record/gitlab_patches_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+RSpec.describe ActiveRecord::GitlabPatches do
+ it "has a version number" do
+ expect(described_class::Version::VERSION).not_to be nil
+ end
+end
diff --git a/gems/activerecord-gitlab/spec/spec_helper.rb b/gems/activerecord-gitlab/spec/spec_helper.rb
new file mode 100644
index 00000000000..548295b3f2c
--- /dev/null
+++ b/gems/activerecord-gitlab/spec/spec_helper.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+ENV["RAILS_ENV"] = "test"
+
+require "active_record/gitlab_patches"
+
+RSpec.configure do |config|
+ # Enable flags like --only-failures and --next-failure
+ config.example_status_persistence_file_path = ".rspec_status"
+
+ # Disable RSpec exposing methods globally on `Module` and `main`
+ config.disable_monkey_patching!
+
+ config.expect_with :rspec do |c|
+ c.syntax = :expect
+ end
+
+ Dir[File.expand_path("spec/support/**/*.rb")].each { |f| require f }
+
+ config.around(:all, :partitioning) do |example|
+ ActiveRecord::Base.transaction do
+ example.run
+
+ raise ActiveRecord::Rollback
+ end
+ end
+
+ config.before(:all, :without_sqlite3) do
+ ActiveRecord::Base.remove_connection
+ end
+end
diff --git a/gems/activerecord-gitlab/spec/support/database.rb b/gems/activerecord-gitlab/spec/support/database.rb
new file mode 100644
index 00000000000..998d945c311
--- /dev/null
+++ b/gems/activerecord-gitlab/spec/support/database.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+RSpec.configure do |config|
+ config.before(:all) do
+ ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
+ ActiveRecord::Base.logger = Logger.new('/dev/null')
+
+ ActiveRecord::Schema.define do
+ create_table :projects, force: true
+
+ create_table :pipelines, force: true do |t|
+ t.integer :project_id
+ t.integer :partition_id
+ end
+
+ create_table :jobs, force: true do |t|
+ t.integer :pipeline_id
+ t.integer :partition_id
+ t.string :name
+ end
+
+ create_table :metadata, force: true do |t|
+ t.integer :job_id
+ t.integer :partition_id
+ t.boolean :test_flag, default: false
+ end
+ end
+ end
+end
diff --git a/gems/activerecord-gitlab/spec/support/models.rb b/gems/activerecord-gitlab/spec/support/models.rb
new file mode 100644
index 00000000000..c0017656ea8
--- /dev/null
+++ b/gems/activerecord-gitlab/spec/support/models.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+
+class PartitionedRecord < ActiveRecord::Base
+ self.abstract_class = true
+
+ def self.use_partition_id_filter?
+ true
+ end
+
+ alias_method :reset, :reload
+end
+
+class Project < ActiveRecord::Base
+ has_many :pipelines
+end
+
+class Pipeline < PartitionedRecord
+ belongs_to :project
+ query_constraints :id, :partition_id
+
+ has_many :jobs,
+ ->(pipeline) { where(partition_id: pipeline.partition_id) },
+ partition_foreign_key: :partition_id,
+ dependent: :destroy
+end
+
+class Job < PartitionedRecord
+ query_constraints :id, :partition_id
+
+ belongs_to :pipeline,
+ ->(build) { where(partition_id: build.partition_id) },
+ partition_foreign_key: :partition_id
+
+ has_one :metadata,
+ ->(build) { where(partition_id: build.partition_id) },
+ foreign_key: :job_id,
+ partition_foreign_key: :partition_id,
+ inverse_of: :job,
+ autosave: true
+
+ accepts_nested_attributes_for :metadata
+end
+
+class Metadata < PartitionedRecord
+ self.table_name = :metadata
+ query_constraints :id, :partition_id
+
+ belongs_to :job,
+ ->(metadata) { where(partition_id: metadata.partition_id) }
+end
diff --git a/gems/activerecord-gitlab/spec/support/query_recorder.rb b/gems/activerecord-gitlab/spec/support/query_recorder.rb
new file mode 100644
index 00000000000..5129bae9240
--- /dev/null
+++ b/gems/activerecord-gitlab/spec/support/query_recorder.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class QueryRecorder
+ attr_reader :log
+
+ def initialize(&block)
+ @log = []
+
+ ActiveRecord::Base.connection.unprepared_statement do
+ ActiveSupport::Notifications.subscribed(method(:callback), 'sql.active_record', &block)
+ end
+ end
+
+ def callback(_name, _start, _finish, _message_id, values)
+ @log << values[:sql]
+ end
+
+ def self.log(&block)
+ new(&block).log
+ end
+end
diff --git a/gems/click_house-client/.gitlab-ci.yml b/gems/click_house-client/.gitlab-ci.yml
new file mode 100644
index 00000000000..0384da8a893
--- /dev/null
+++ b/gems/click_house-client/.gitlab-ci.yml
@@ -0,0 +1,4 @@
+include:
+ - local: gems/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "click_house-client"
diff --git a/gems/click_house-client/.rspec b/gems/click_house-client/.rspec
new file mode 100644
index 00000000000..34c5164d9b5
--- /dev/null
+++ b/gems/click_house-client/.rspec
@@ -0,0 +1,3 @@
+--format documentation
+--color
+--require spec_helper
diff --git a/gems/click_house-client/.rubocop.yml b/gems/click_house-client/.rubocop.yml
new file mode 100644
index 00000000000..8c670b439d3
--- /dev/null
+++ b/gems/click_house-client/.rubocop.yml
@@ -0,0 +1,2 @@
+inherit_from:
+ - ../config/rubocop.yml
diff --git a/gems/click_house-client/Gemfile b/gems/click_house-client/Gemfile
new file mode 100644
index 00000000000..be173b205f7
--- /dev/null
+++ b/gems/click_house-client/Gemfile
@@ -0,0 +1,5 @@
+# frozen_string_literal: true
+
+source "https://rubygems.org"
+
+gemspec
diff --git a/gems/click_house-client/Gemfile.lock b/gems/click_house-client/Gemfile.lock
new file mode 100644
index 00000000000..a8e2b7ec0c6
--- /dev/null
+++ b/gems/click_house-client/Gemfile.lock
@@ -0,0 +1,102 @@
+PATH
+ remote: .
+ specs:
+ click_house-client (0.1.0)
+ activesupport (< 8)
+ addressable (~> 2.8)
+ json (~> 2.6.3)
+
+GEM
+ remote: https://rubygems.org/
+ specs:
+ activesupport (7.0.6)
+ concurrent-ruby (~> 1.0, >= 1.0.2)
+ i18n (>= 1.6, < 2)
+ minitest (>= 5.1)
+ tzinfo (~> 2.0)
+ addressable (2.8.4)
+ public_suffix (>= 2.0.2, < 6.0)
+ ast (2.4.2)
+ concurrent-ruby (1.2.2)
+ diff-lcs (1.5.0)
+ gitlab-styles (10.1.0)
+ rubocop (~> 1.50.2)
+ rubocop-graphql (~> 0.18)
+ rubocop-performance (~> 1.15)
+ rubocop-rails (~> 2.17)
+ rubocop-rspec (~> 2.22)
+ i18n (1.14.1)
+ concurrent-ruby (~> 1.0)
+ json (2.6.3)
+ minitest (5.18.1)
+ parallel (1.23.0)
+ parser (3.2.2.3)
+ ast (~> 2.4.1)
+ racc
+ public_suffix (5.0.3)
+ racc (1.7.1)
+ rack (3.0.8)
+ rainbow (3.1.1)
+ rake (13.0.6)
+ regexp_parser (2.8.1)
+ rexml (3.2.5)
+ rspec (3.12.0)
+ rspec-core (~> 3.12.0)
+ rspec-expectations (~> 3.12.0)
+ rspec-mocks (~> 3.12.0)
+ rspec-core (3.12.2)
+ rspec-support (~> 3.12.0)
+ rspec-expectations (3.12.3)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.12.0)
+ rspec-mocks (3.12.5)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.12.0)
+ rspec-support (3.12.1)
+ rubocop (1.50.2)
+ json (~> 2.3)
+ parallel (~> 1.10)
+ parser (>= 3.2.0.0)
+ rainbow (>= 2.2.2, < 4.0)
+ regexp_parser (>= 1.8, < 3.0)
+ rexml (>= 3.2.5, < 4.0)
+ rubocop-ast (>= 1.28.0, < 2.0)
+ ruby-progressbar (~> 1.7)
+ unicode-display_width (>= 2.4.0, < 3.0)
+ rubocop-ast (1.29.0)
+ parser (>= 3.2.1.0)
+ rubocop-capybara (2.18.0)
+ rubocop (~> 1.41)
+ rubocop-factory_bot (2.23.1)
+ rubocop (~> 1.33)
+ rubocop-graphql (0.19.0)
+ rubocop (>= 0.87, < 2)
+ rubocop-performance (1.18.0)
+ rubocop (>= 1.7.0, < 2.0)
+ rubocop-ast (>= 0.4.0)
+ rubocop-rails (2.20.2)
+ activesupport (>= 4.2.0)
+ rack (>= 1.1)
+ rubocop (>= 1.33.0, < 2.0)
+ rubocop-rspec (2.22.0)
+ rubocop (~> 1.33)
+ rubocop-capybara (~> 2.17)
+ rubocop-factory_bot (~> 2.22)
+ ruby-progressbar (1.13.0)
+ tzinfo (2.0.6)
+ concurrent-ruby (~> 1.0)
+ unicode-display_width (2.4.2)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ click_house-client!
+ gitlab-styles (~> 10.1.0)
+ rake (~> 13.0)
+ rspec (~> 3.0)
+ rubocop
+ rubocop-rspec
+
+BUNDLED WITH
+ 2.4.16
diff --git a/gems/click_house-client/README.md b/gems/click_house-client/README.md
new file mode 100644
index 00000000000..6afabcad1a0
--- /dev/null
+++ b/gems/click_house-client/README.md
@@ -0,0 +1,3 @@
+ClickHouse::Client
+
+This Gem provides a simple way to query ClickHouse databases using the HTTP interface.
diff --git a/gems/click_house-client/click_house-client.gemspec b/gems/click_house-client/click_house-client.gemspec
new file mode 100644
index 00000000000..5544065ef17
--- /dev/null
+++ b/gems/click_house-client/click_house-client.gemspec
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+Gem::Specification.new do |spec|
+ spec.name = "click_house-client"
+ spec.version = "0.1.0"
+ spec.authors = ["group::optimize"]
+ spec.email = ["engineering@gitlab.com"]
+
+ spec.summary = "GitLab's client to interact with ClickHouse"
+ spec.description = "This Gem provides a simple way to query ClickHouse databases using the HTTP interface."
+ spec.homepage = "https://gitlab.com/gitlab-org/gitlab/-/tree/master/gems/click_house-client"
+ spec.license = "MIT"
+ spec.required_ruby_version = ">= 3.0"
+
+ spec.add_runtime_dependency "activesupport", "< 8"
+ spec.add_runtime_dependency "addressable", "~> 2.8"
+ spec.add_runtime_dependency 'json', '~> 2.6.3'
+
+ spec.add_development_dependency 'gitlab-styles', '~> 10.1.0'
+ spec.add_development_dependency "rake", "~> 13.0"
+ spec.add_development_dependency "rspec", "~> 3.0"
+ spec.add_development_dependency 'rubocop'
+ spec.add_development_dependency 'rubocop-rspec'
+end
diff --git a/gems/click_house-client/lib/click_house/client.rb b/gems/click_house-client/lib/click_house/client.rb
new file mode 100644
index 00000000000..22c42d7be6e
--- /dev/null
+++ b/gems/click_house-client/lib/click_house/client.rb
@@ -0,0 +1,64 @@
+# frozen_string_literal: true
+
+require 'addressable'
+require 'json'
+require 'active_support/time'
+require_relative "client/database"
+require_relative "client/configuration"
+require_relative "client/formatter"
+require_relative "client/response"
+
+module ClickHouse
+ module Client
+ class << self
+ def configuration
+ @configuration ||= Configuration.new
+ end
+
+ def configure
+ yield(configuration)
+ configuration.validate!
+ end
+ end
+
+ Error = Class.new(StandardError)
+ ConfigurationError = Class.new(Error)
+ DatabaseError = Class.new(Error)
+
+ # Executes a SELECT database query
+ def self.select(query, database, configuration = self.configuration)
+ db = lookup_database(configuration, database)
+
+ response = configuration.http_post_proc.call(
+ db.uri.to_s,
+ db.headers,
+ "#{query} FORMAT JSON" # always return JSON
+ )
+
+ raise DatabaseError, response.body unless response.success?
+
+ Formatter.format(configuration.json_parser.parse(response.body))
+ end
+
+ # Executes any kinds of database query without returning any data (INSERT, DELETE)
+ def self.execute(query, database, configuration = self.configuration)
+ db = lookup_database(configuration, database)
+
+ response = configuration.http_post_proc.call(
+ db.uri.to_s,
+ db.headers,
+ query
+ )
+
+ raise DatabaseError, response.body unless response.success?
+
+ true
+ end
+
+ private_class_method def self.lookup_database(configuration, database)
+ configuration.databases[database].tap do |db|
+ raise ConfigurationError, "The database '#{database}' is not configured" unless db
+ end
+ end
+ end
+end
diff --git a/gems/click_house-client/lib/click_house/client/configuration.rb b/gems/click_house-client/lib/click_house/client/configuration.rb
new file mode 100644
index 00000000000..882b37993dc
--- /dev/null
+++ b/gems/click_house-client/lib/click_house/client/configuration.rb
@@ -0,0 +1,68 @@
+# frozen_string_literal: true
+
+module ClickHouse
+ module Client
+ class Configuration
+ # Configuration options:
+ #
+ # *register_database* (method): registers a database, the following arguments are required:
+ # - database: database name
+ # - url: URL and port to the HTTP interface
+ # - username
+ # - password
+ # - variables (optional): configuration for the client
+ #
+ # *http_post_proc*: A callable object for invoking the HTTP request.
+ # The object must handle the following parameters: url, headers, body
+ # and return a Gitlab::ClickHouse::Client::Response object.
+ #
+ # *json_parser*: object for parsing JSON strings, it should respond to the "parse" method
+ #
+ # Example:
+ #
+ # Gitlab::ClickHouse::Client.configure do |c|
+ # c.register_database(:main,
+ # database: 'gitlab_clickhouse_test',
+ # url: 'http://localhost:8123',
+ # username: 'default',
+ # password: 'clickhouse',
+ # variables: {
+ # join_use_nulls: 1 # treat JOINs as per SQL standard
+ # }
+ # )
+ #
+ # c.http_post_proc = lambda do |url, headers, body|
+ # options = {
+ # headers: headers,
+ # body: body,
+ # allow_local_requests: false
+ # }
+ #
+ # response = Gitlab::HTTP.post(url, options)
+ # Gitlab::ClickHouse::Client::Response.new(response.body, response.code)
+ # end
+ #
+ # c.json_parser = JSON
+ # end
+ attr_accessor :http_post_proc, :json_parser
+ attr_reader :databases
+
+ def initialize
+ @databases = {}
+ @http_post_proc = nil
+ @json_parser = JSON
+ end
+
+ def register_database(name, **args)
+ raise ConfigurationError, "The database '#{name}' is already registered" if @databases.key?(name)
+
+ @databases[name] = Database.new(**args)
+ end
+
+ def validate!
+ raise ConfigurationError, "The 'http_post_proc' option is not configured" unless @http_post_proc
+ raise ConfigurationError, "The 'json_parser' option is not configured" unless @json_parser
+ end
+ end
+ end
+end
diff --git a/gems/click_house-client/lib/click_house/client/database.rb b/gems/click_house-client/lib/click_house/client/database.rb
new file mode 100644
index 00000000000..beeb2a8cbd6
--- /dev/null
+++ b/gems/click_house-client/lib/click_house/client/database.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+module ClickHouse
+ module Client
+ class Database
+ attr_reader :database
+
+ def initialize(database:, url:, username:, password:, variables: {})
+ @database = database
+ @url = url
+ @username = username
+ @password = password
+ @variables = variables.merge(database: database).freeze
+ end
+
+ def uri
+ @uri ||= begin
+ parsed = Addressable::URI.parse(@url)
+ parsed.query_values = @variables
+ parsed
+ end
+ end
+
+ def headers
+ @headers ||= {
+ 'X-ClickHouse-User' => @username,
+ 'X-ClickHouse-Key' => @password
+ }.freeze
+ end
+ end
+ end
+end
diff --git a/gems/click_house-client/lib/click_house/client/formatter.rb b/gems/click_house-client/lib/click_house/client/formatter.rb
new file mode 100644
index 00000000000..bb60d8db7f7
--- /dev/null
+++ b/gems/click_house-client/lib/click_house/client/formatter.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+module ClickHouse
+ module Client
+ class Formatter
+ DEFAULT = ->(value) { value }
+
+ TYPE_CASTERS = {
+ 'UInt64' => ->(value) { Integer(value) },
+ "DateTime64(6, 'UTC')" => ->(value) { ActiveSupport::TimeZone["UTC"].parse(value) }
+ }.freeze
+
+ def self.format(result)
+ name_type_mapping = result['meta'].each_with_object({}) do |column, hash|
+ hash[column['name']] = column['type']
+ end
+
+ result['data'].map do |row|
+ row.each_with_object({}) do |(column, value), casted_row|
+ caster = TYPE_CASTERS.fetch(name_type_mapping[column], DEFAULT)
+
+ casted_row[column] = caster.call(value)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/gems/click_house-client/lib/click_house/client/response.rb b/gems/click_house-client/lib/click_house/client/response.rb
new file mode 100644
index 00000000000..898f0b0e024
--- /dev/null
+++ b/gems/click_house-client/lib/click_house/client/response.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+module ClickHouse
+ module Client
+ class Response
+ attr_reader :body
+
+ def initialize(body, http_status_code)
+ @body = body
+ @http_status_code = http_status_code
+ end
+
+ def success?
+ @http_status_code == 200
+ end
+ end
+ end
+end
diff --git a/gems/click_house-client/spec/click_house/client/configuration_spec.rb b/gems/click_house-client/spec/click_house/client/configuration_spec.rb
new file mode 100644
index 00000000000..8cbd64ca650
--- /dev/null
+++ b/gems/click_house-client/spec/click_house/client/configuration_spec.rb
@@ -0,0 +1,66 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ClickHouse::Client::Configuration do
+ subject(:configuration) do
+ config = described_class.new
+ config.http_post_proc = -> {}
+ config.json_parser = Object
+ config
+ end
+
+ describe '#register_database' do
+ let(:database_options) do
+ {
+ database: 'test_db',
+ url: 'http://localhost:3333',
+ username: 'user',
+ password: 'pass',
+ variables: {
+ join_use_nulls: 1
+ }
+ }
+ end
+
+ it 'registers a database' do
+ configuration.register_database(:my_db, **database_options)
+
+ expect(configuration.databases.size).to eq(1)
+ database = configuration.databases[:my_db]
+
+ expect(database.uri.to_s).to eq('http://localhost:3333?database=test_db&join_use_nulls=1')
+ end
+
+ context 'when adding the same DB multiple times' do
+ it 'raises error' do
+ configuration.register_database(:my_db, **database_options)
+ expect do
+ configuration.register_database(:my_db, **database_options)
+ end.to raise_error(ClickHouse::Client::ConfigurationError, /database 'my_db' is already registered/)
+ end
+ end
+ end
+
+ describe '#validate!' do
+ context 'when `http_post_proc` option is not configured' do
+ it 'raises error' do
+ configuration.http_post_proc = nil
+
+ expect do
+ configuration.validate!
+ end.to raise_error(ClickHouse::Client::ConfigurationError, /'http_post_proc' option is not configured/)
+ end
+ end
+
+ context 'when `json_parser` option is not configured' do
+ it 'raises error' do
+ configuration.json_parser = nil
+
+ expect do
+ configuration.validate!
+ end.to raise_error(ClickHouse::Client::ConfigurationError, /'json_parser' option is not configured/)
+ end
+ end
+ end
+end
diff --git a/gems/click_house-client/spec/click_house/client/database_spec.rb b/gems/click_house-client/spec/click_house/client/database_spec.rb
new file mode 100644
index 00000000000..112b2ee12b1
--- /dev/null
+++ b/gems/click_house-client/spec/click_house/client/database_spec.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ClickHouse::Client::Database do
+ subject(:database) do
+ described_class.new(
+ database: 'test_db',
+ url: 'http://localhost:3333',
+ username: 'user',
+ password: 'pass',
+ variables: {
+ join_use_nulls: 1
+ }
+ )
+ end
+
+ describe '#uri' do
+ it 'builds the correct URL' do
+ expect(database.uri.to_s).to eq('http://localhost:3333?database=test_db&join_use_nulls=1')
+ end
+ end
+
+ describe '#headers' do
+ it 'returns the correct headers' do
+ expect(database.headers).to eq({
+ 'X-ClickHouse-User' => 'user',
+ 'X-ClickHouse-Key' => 'pass'
+ })
+ end
+ end
+end
diff --git a/gems/click_house-client/spec/click_house/client_spec.rb b/gems/click_house-client/spec/click_house/client_spec.rb
new file mode 100644
index 00000000000..883199198ba
--- /dev/null
+++ b/gems/click_house-client/spec/click_house/client_spec.rb
@@ -0,0 +1,98 @@
+# frozen_string_literal: true
+
+RSpec.describe ClickHouse::Client do
+ describe '#select' do
+ # Assuming we have a DB table with the following schema
+ #
+ # CREATE TABLE issues (
+ # `id` UInt64,
+ # `title` String DEFAULT '',
+ # `description` Nullable(String),
+ # `created_at` DateTime64(6, 'UTC') DEFAULT now(),
+ # `updated_at` DateTime64(6, 'UTC') DEFAULT now()
+ # )
+ # ENGINE = ReplacingMergeTree(updated_at)
+ # ORDER BY (id)
+
+ let(:query_result_fixture) { File.expand_path('../fixtures/query_result.json', __dir__) }
+
+ let(:database_config) do
+ {
+ database: 'test_db',
+ url: 'http://localhost:3333',
+ username: 'user',
+ password: 'pass',
+ variables: {
+ join_use_nulls: 1
+ }
+ }
+ end
+
+ let(:configuration) do
+ ClickHouse::Client::Configuration.new.tap do |config|
+ config.register_database(:test_db, **database_config)
+ config.http_post_proc = ->(_url, _headers, _query) {
+ body = File.read(query_result_fixture)
+ ClickHouse::Client::Response.new(body, 200)
+ }
+ end
+ end
+
+ it 'parses the results and returns the data as array of hashes' do
+ result = described_class.select('SELECT * FROM issues', :test_db, configuration)
+
+ timestamp1 = ActiveSupport::TimeZone["UTC"].parse('2023-06-21 13:33:44')
+ timestamp2 = ActiveSupport::TimeZone["UTC"].parse('2023-06-21 13:33:50')
+ timestamp3 = ActiveSupport::TimeZone["UTC"].parse('2023-06-21 13:33:40')
+
+ expect(result).to eq([
+ {
+ 'id' => 2,
+ 'title' => 'Title 2',
+ 'description' => 'description',
+ 'created_at' => timestamp1,
+ 'updated_at' => timestamp1
+ },
+ {
+ 'id' => 3,
+ 'title' => 'Title 3',
+ 'description' => nil,
+ 'created_at' => timestamp2,
+ 'updated_at' => timestamp2
+ },
+ {
+ 'id' => 1,
+ 'title' => 'Title 1',
+ 'description' => 'description',
+ 'created_at' => timestamp3,
+ 'updated_at' => timestamp3
+ }
+ ])
+ end
+
+ context 'when the DB is not configured' do
+ it 'raises erro' do
+ expect do
+ described_class.select('SELECT * FROM issues', :different_db, configuration)
+ end.to raise_error(ClickHouse::Client::ConfigurationError, /not configured/)
+ end
+ end
+
+ context 'when error response is returned' do
+ let(:configuration) do
+ ClickHouse::Client::Configuration.new.tap do |config|
+ config.register_database(:test_db, **database_config)
+ config.http_post_proc = ->(_url, _headers, _query) {
+ ClickHouse::Client::Response.new('some error', 404)
+ }
+ end
+ end
+
+ it 'raises error' do
+ expect do
+ described_class.select('SELECT * FROM issues', :test_db, configuration)
+ end.to raise_error(ClickHouse::Client::DatabaseError, 'some error')
+ end
+ end
+ end
+end
diff --git a/gems/click_house-client/spec/fixtures/query_result.json b/gems/click_house-client/spec/fixtures/query_result.json
new file mode 100644
index 00000000000..872b0e5b6ed
--- /dev/null
+++ b/gems/click_house-client/spec/fixtures/query_result.json
@@ -0,0 +1,53 @@
+{
+ "meta": [
+ {
+ "name": "id",
+ "type": "UInt64"
+ },
+ {
+ "name": "title",
+ "type:": "String"
+ },
+ {
+ "name": "description",
+ "type": "Nullable(String)"
+ },
+ {
+ "name": "created_at",
+ "type": "DateTime64(6, 'UTC')"
+ },
+ {
+ "name": "updated_at",
+ "type": "DateTime64(6, 'UTC')"
+ }
+ ],
+ "data": [
+ {
+ "id": "2",
+ "title": "Title 2",
+ "description": "description",
+ "created_at": "2023-06-21 13:33:44.000000",
+ "updated_at": "2023-06-21 13:33:44.000000"
+ },
+ {
+ "id": "3",
+ "title": "Title 3",
+ "description": null,
+ "created_at": "2023-06-21 13:33:50.000000",
+ "updated_at": "2023-06-21 13:33:50.000000"
+ },
+ {
+ "id": "1",
+ "title": "Title 1",
+ "description": "description",
+ "created_at": "2023-06-21 13:33:40.000000",
+ "updated_at": "2023-06-21 13:33:40.000000"
+ }
+ ],
+ "rows": 3,
+ "statistics": {
+ "elapsed": 0.001581789,
+ "rows_read": 3,
+ "bytes_read": 172
+ }
+}
diff --git a/gems/click_house-client/spec/spec_helper.rb b/gems/click_house-client/spec/spec_helper.rb
new file mode 100644
index 00000000000..d2b5e59c9a3
--- /dev/null
+++ b/gems/click_house-client/spec/spec_helper.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+require "click_house/client"
+
+RSpec.configure do |config|
+ # Enable flags like --only-failures and --next-failure
+ config.example_status_persistence_file_path = ".rspec_status"
+
+ # Disable RSpec exposing methods globally on `Module` and `main`
+ config.disable_monkey_patching!
+
+ config.expect_with :rspec do |c|
+ c.syntax = :expect
+ end
+end
diff --git a/gems/config/rubocop.yml b/gems/config/rubocop.yml
new file mode 100644
index 00000000000..a97d759b471
--- /dev/null
+++ b/gems/config/rubocop.yml
@@ -0,0 +1,98 @@
+inherit_gem:
+ gitlab-styles:
+ - rubocop-default.yml
+
+require:
+ - ../../rubocop/rubocop
+ - rubocop-rspec
+
+inherit_mode:
+ merge:
+ - Include
+ - Exclude
+ - AllowedPatterns
+
+AllCops:
+ # Target the current Ruby version. For example, "3.0" or "3.1".
+ TargetRubyVersion: <%= RUBY_VERSION[/^\d+\.\d+/, 0] %>
+ SuggestExtensions: false
+ NewCops: disable
+
+# This cop doesn't make sense in the context of gems
+CodeReuse/ActiveRecord:
+ Enabled: false
+
+# This cop doesn't make sense in the context of gems
+Cop/PutGroupRoutesUnderScope:
+ Enabled: false
+
+# This cop doesn't make sense in the context of gems
+Cop/PutProjectRoutesUnderScope:
+ Enabled: false
+
+Gemspec/AvoidExecutingGit:
+ Enabled: true
+
+# We disable this since we support multiple Ruby versions
+Gemspec/RequiredRubyVersion:
+ Enabled: false
+
+# This cop doesn't make sense in the context of gems
+Gitlab/DocUrl:
+ Enabled: false
+
+# This cop doesn't make sense in the context of gems
+Gitlab/NamespacedClass:
+ Enabled: false
+
+# This cop doesn't make sense in the context of gems
+Gitlab/RSpec/AvoidSetup:
+ Enabled: false
+
+# This cop doesn't make sense in the context of gems
+Graphql/AuthorizeTypes:
+ Enabled: false
+
+# This cop doesn't make sense in the context of gems
+Graphql/Descriptions:
+ Enabled: false
+
+Naming/FileName:
+ Exclude:
+ - spec/**/*.rb
+
+# This cop doesn't make sense in the context of gems
+RSpec/AvoidConditionalStatements:
+ Enabled: false
+
+RSpec/ContextWording:
+ Prefixes:
+ - 'when'
+ - 'with'
+ - 'without'
+ - 'for'
+ - 'and'
+ - 'on'
+ - 'in'
+ - 'as'
+ - 'if'
+
+# This cop doesn't make sense in the context of gems
+RSpec/MissingFeatureCategory:
+ Enabled: false
+
+# Enable once we drop 3.0 support
+Style/HashSyntax:
+ Enabled: false
+
+Style/Lambda:
+ EnforcedStyle: literal
+
+Style/RegexpLiteralMixedPreserve:
+ Enabled: true
+ SupportedStyles:
+ - slashes
+ - percent_r
+ - mixed
+ - mixed_preserve
+ EnforcedStyle: mixed_preserve
diff --git a/gems/gem.gitlab-ci.yml b/gems/gem.gitlab-ci.yml
new file mode 100644
index 00000000000..10905d8c243
--- /dev/null
+++ b/gems/gem.gitlab-ci.yml
@@ -0,0 +1,66 @@
+# The template generates jobs for gems vendored in the main GitLab project
+# under `gem_path_prefix` (defaults to `gems/`).
+#
+# Inputs
+# - `gem_name`: The name of the gem, i.e. if the gem is located at `gems/gitlab-rspec`, `gem_name` should be set to `gitlab-rspec`.
+# - `gem_path_prefix`: The prefix of the gem path, i.e. if the gem is located at `vendor/gems/gitlab-rspec`, `gem_path_prefix` should be set to `vendor/gems/`. Defaults to `gems/`.
+spec:
+ inputs:
+ gem_name:
+ gem_path_prefix:
+ default: "gems/"
+---
+workflow:
+ name: '$PIPELINE_NAME'
+ rules:
+ - if: $CI_MERGE_REQUEST_ID
+ variables:
+ PIPELINE_NAME: '[$[[inputs.gem_name]] gem] Ruby $RUBY_VERSION $CI_MERGE_REQUEST_EVENT_TYPE MR pipeline'
+
+variables:
+ BUNDLE_PATH: "vendor"
+ BUNDLE_FROZEN: "true"
+ GIT_DEPTH: "20"
+ # 'GIT_STRATEGY: clone' optimizes the pack-objects cache hit ratio
+ GIT_STRATEGY: "clone"
+ GIT_SUBMODULE_STRATEGY: "none"
+ GET_SOURCES_ATTEMPTS: "3"
+ # Default Ruby version for jobs that don't use .ruby_matrix
+ RUBY_VERSION: "3.0"
+
+default:
+ image: "ruby:${RUBY_VERSION}"
+ cache:
+ key: "$[[inputs.gem_name]]-${RUBY_VERSION}"
+ paths:
+ - "$[[inputs.gem_path_prefix]]$[[inputs.gem_name]]/vendor/ruby"
+ before_script:
+ - cd $[[inputs.gem_path_prefix]]$[[inputs.gem_name]]
+ - ruby -v # Print out ruby version for debugging
+ - bundle_version=$(grep -A 1 "BUNDLED WITH" Gemfile.lock | tail -n 1 | sed -e 's/[[:space:]]//')
+ - gem install bundler --version "$bundle_version" --no-document # Bundler is not installed with the image
+ - bundle config # Show bundler configuration
+ - bundle install --jobs=$(nproc) --retry=3
+
+.ruby_matrix:
+ parallel:
+ matrix:
+ - RUBY_VERSION: ["3.0", "3.1", "3.2"]
+
+rubocop:
+ extends: .ruby_matrix
+ rules:
+ - exists: ["$[[inputs.gem_path_prefix]]$[[inputs.gem_name]]/.rubocop.yml"]
+ script:
+ - bundle exec rubocop --config .rubocop.yml
+
+rspec:
+ extends: .ruby_matrix
+ script:
+ - bundle exec rspec
+ coverage: '/LOC \((\d+\.\d+%)\) covered.$/'
+ artifacts:
+ expire_in: 31d
+ when: always
+ paths:
+ - coverage/
diff --git a/gems/gitlab-rspec/.gitignore b/gems/gitlab-rspec/.gitignore
new file mode 100644
index 00000000000..b04a8c840df
--- /dev/null
+++ b/gems/gitlab-rspec/.gitignore
@@ -0,0 +1,11 @@
+/.bundle/
+/.yardoc
+/_yardoc/
+/coverage/
+/doc/
+/pkg/
+/spec/reports/
+/tmp/
+
+# rspec failure tracking
+.rspec_status
diff --git a/gems/gitlab-rspec/.gitlab-ci.yml b/gems/gitlab-rspec/.gitlab-ci.yml
new file mode 100644
index 00000000000..910b391a0e9
--- /dev/null
+++ b/gems/gitlab-rspec/.gitlab-ci.yml
@@ -0,0 +1,4 @@
+include:
+ - local: gems/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "gitlab-rspec"
diff --git a/gems/gitlab-rspec/.rspec b/gems/gitlab-rspec/.rspec
new file mode 100644
index 00000000000..34c5164d9b5
--- /dev/null
+++ b/gems/gitlab-rspec/.rspec
@@ -0,0 +1,3 @@
+--format documentation
+--color
+--require spec_helper
diff --git a/gems/gitlab-rspec/.rubocop.yml b/gems/gitlab-rspec/.rubocop.yml
new file mode 100644
index 00000000000..38c0c592dad
--- /dev/null
+++ b/gems/gitlab-rspec/.rubocop.yml
@@ -0,0 +1,10 @@
+inherit_from:
+ - ../config/rubocop.yml
+
+RSpec/InstanceVariable:
+ Exclude:
+ - spec/**/*.rb
+
+Gitlab/ChangeTimezone:
+ Exclude:
+ - spec/gitlab/rspec/time_travel_spec.rb
diff --git a/gems/gitlab-rspec/Gemfile b/gems/gitlab-rspec/Gemfile
new file mode 100644
index 00000000000..be173b205f7
--- /dev/null
+++ b/gems/gitlab-rspec/Gemfile
@@ -0,0 +1,5 @@
+# frozen_string_literal: true
+
+source "https://rubygems.org"
+
+gemspec
diff --git a/gems/gitlab-rspec/Gemfile.lock b/gems/gitlab-rspec/Gemfile.lock
new file mode 100644
index 00000000000..dcdb4dd009e
--- /dev/null
+++ b/gems/gitlab-rspec/Gemfile.lock
@@ -0,0 +1,182 @@
+PATH
+ remote: .
+ specs:
+ gitlab-rspec (0.1.0)
+ activesupport (>= 6.1, < 7.1)
+ rspec (~> 3.0)
+
+GEM
+ remote: https://rubygems.org/
+ specs:
+ actionpack (7.0.4.3)
+ actionview (= 7.0.4.3)
+ activesupport (= 7.0.4.3)
+ rack (~> 2.0, >= 2.2.0)
+ rack-test (>= 0.6.3)
+ rails-dom-testing (~> 2.0)
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
+ actionview (7.0.4.3)
+ activesupport (= 7.0.4.3)
+ builder (~> 3.1)
+ erubi (~> 1.4)
+ rails-dom-testing (~> 2.0)
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
+ activesupport (7.0.4.3)
+ concurrent-ruby (~> 1.0, >= 1.0.2)
+ i18n (>= 1.6, < 2)
+ minitest (>= 5.1)
+ tzinfo (~> 2.0)
+ ast (2.4.2)
+ benchmark-malloc (0.2.0)
+ benchmark-perf (0.6.0)
+ benchmark-trend (0.4.0)
+ binding_of_caller (1.0.0)
+ debug_inspector (>= 0.0.1)
+ builder (3.2.4)
+ coderay (1.1.3)
+ concurrent-ruby (1.2.2)
+ crass (1.0.6)
+ debug_inspector (1.1.0)
+ diff-lcs (1.5.0)
+ erubi (1.12.0)
+ factory_bot (6.2.0)
+ activesupport (>= 5.0.0)
+ factory_bot_rails (6.2.0)
+ factory_bot (~> 6.2.0)
+ railties (>= 5.0.0)
+ gitlab-styles (10.1.0)
+ rubocop (~> 1.50.2)
+ rubocop-graphql (~> 0.18)
+ rubocop-performance (~> 1.15)
+ rubocop-rails (~> 2.17)
+ rubocop-rspec (~> 2.22)
+ i18n (1.13.0)
+ concurrent-ruby (~> 1.0)
+ json (2.6.3)
+ loofah (2.21.3)
+ crass (~> 1.0.2)
+ nokogiri (>= 1.12.0)
+ method_source (1.0.0)
+ mini_portile2 (2.8.2)
+ minitest (5.18.0)
+ nokogiri (1.15.2)
+ mini_portile2 (~> 2.8.2)
+ racc (~> 1.4)
+ parallel (1.23.0)
+ parser (3.2.2.1)
+ ast (~> 2.4.1)
+ proc_to_ast (0.1.0)
+ coderay
+ parser
+ unparser
+ racc (1.6.2)
+ rack (2.2.7)
+ rack-test (2.1.0)
+ rack (>= 1.3)
+ rails-dom-testing (2.0.3)
+ activesupport (>= 4.2.0)
+ nokogiri (>= 1.6)
+ rails-html-sanitizer (1.5.0)
+ loofah (~> 2.19, >= 2.19.1)
+ railties (7.0.4.3)
+ actionpack (= 7.0.4.3)
+ activesupport (= 7.0.4.3)
+ method_source
+ rake (>= 12.2)
+ thor (~> 1.0)
+ zeitwerk (~> 2.5)
+ rainbow (3.1.1)
+ rake (13.0.6)
+ regexp_parser (2.8.1)
+ rexml (3.2.5)
+ rspec (3.12.0)
+ rspec-core (~> 3.12.0)
+ rspec-expectations (~> 3.12.0)
+ rspec-mocks (~> 3.12.0)
+ rspec-benchmark (0.6.0)
+ benchmark-malloc (~> 0.2)
+ benchmark-perf (~> 0.6)
+ benchmark-trend (~> 0.4)
+ rspec (>= 3.0)
+ rspec-core (3.12.0)
+ rspec-support (~> 3.12.0)
+ rspec-expectations (3.12.2)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.12.0)
+ rspec-mocks (3.12.3)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.12.0)
+ rspec-parameterized (1.0.0)
+ rspec-parameterized-core (< 2)
+ rspec-parameterized-table_syntax (< 2)
+ rspec-parameterized-core (1.0.0)
+ parser
+ proc_to_ast
+ rspec (>= 2.13, < 4)
+ unparser
+ rspec-parameterized-table_syntax (1.0.0)
+ binding_of_caller
+ rspec-parameterized-core (< 2)
+ rspec-rails (6.0.2)
+ actionpack (>= 6.1)
+ activesupport (>= 6.1)
+ railties (>= 6.1)
+ rspec-core (~> 3.12)
+ rspec-expectations (~> 3.12)
+ rspec-mocks (~> 3.12)
+ rspec-support (~> 3.12)
+ rspec-support (3.12.0)
+ rubocop (1.50.2)
+ json (~> 2.3)
+ parallel (~> 1.10)
+ parser (>= 3.2.0.0)
+ rainbow (>= 2.2.2, < 4.0)
+ regexp_parser (>= 1.8, < 3.0)
+ rexml (>= 3.2.5, < 4.0)
+ rubocop-ast (>= 1.28.0, < 2.0)
+ ruby-progressbar (~> 1.7)
+ unicode-display_width (>= 2.4.0, < 3.0)
+ rubocop-ast (1.29.0)
+ parser (>= 3.2.1.0)
+ rubocop-capybara (2.18.0)
+ rubocop (~> 1.41)
+ rubocop-factory_bot (2.23.1)
+ rubocop (~> 1.33)
+ rubocop-graphql (0.19.0)
+ rubocop (>= 0.87, < 2)
+ rubocop-performance (1.18.0)
+ rubocop (>= 1.7.0, < 2.0)
+ rubocop-ast (>= 0.4.0)
+ rubocop-rails (2.20.2)
+ activesupport (>= 4.2.0)
+ rack (>= 1.1)
+ rubocop (>= 1.33.0, < 2.0)
+ rubocop-rspec (2.22.0)
+ rubocop (~> 1.33)
+ rubocop-capybara (~> 2.17)
+ rubocop-factory_bot (~> 2.22)
+ ruby-progressbar (1.13.0)
+ thor (1.2.2)
+ tzinfo (2.0.6)
+ concurrent-ruby (~> 1.0)
+ unicode-display_width (2.4.2)
+ unparser (0.6.7)
+ diff-lcs (~> 1.3)
+ parser (>= 3.2.0)
+ zeitwerk (2.6.8)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ factory_bot_rails (~> 6.2.0)
+ gitlab-rspec!
+ gitlab-styles (~> 10.1.0)
+ rspec-benchmark (~> 0.6.0)
+ rspec-parameterized (~> 1.0)
+ rspec-rails (~> 6.0.1)
+ rubocop (~> 1.50)
+ rubocop-rspec (~> 2.22)
+
+BUNDLED WITH
+ 2.4.4
diff --git a/gems/gitlab-rspec/gitlab-rspec.gemspec b/gems/gitlab-rspec/gitlab-rspec.gemspec
new file mode 100644
index 00000000000..c2c5b6c60b7
--- /dev/null
+++ b/gems/gitlab-rspec/gitlab-rspec.gemspec
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+require_relative "lib/gitlab/rspec/version"
+
+Gem::Specification.new do |spec|
+ spec.name = "gitlab-rspec"
+ spec.version = Gitlab::Rspec::Version::VERSION
+ spec.authors = ["group::tenant-scale"]
+ spec.email = ["engineering@gitlab.com"]
+
+ spec.summary = "GitLab RSpec extensions"
+ spec.description = "A set of useful helpers to configure RSpec with various stubs and CI configs."
+ spec.homepage = "https://gitlab.com/gitlab-org/gitlab/-/tree/master/gems/gitlab-rspec"
+ spec.license = "MIT"
+ spec.required_ruby_version = ">= 3.0"
+ spec.metadata["rubygems_mfa_required"] = "true"
+
+ spec.files = Dir["lib/**/*.rb"]
+ spec.require_paths = ["lib"]
+
+ spec.add_runtime_dependency "activesupport", ">= 6.1", "< 7.1"
+ spec.add_runtime_dependency "rspec", "~> 3.0"
+
+ spec.add_development_dependency "factory_bot_rails", "~> 6.2.0"
+ spec.add_development_dependency "gitlab-styles", "~> 10.1.0"
+ spec.add_development_dependency "rspec-benchmark", "~> 0.6.0"
+ spec.add_development_dependency "rspec-parameterized", "~> 1.0"
+ spec.add_development_dependency "rspec-rails", "~> 6.0.1"
+ spec.add_development_dependency "rubocop", "~> 1.50"
+ spec.add_development_dependency "rubocop-rspec", "~> 2.22"
+end
diff --git a/gems/gitlab-rspec/lib/gitlab/rspec.rb b/gems/gitlab-rspec/lib/gitlab/rspec.rb
new file mode 100644
index 00000000000..2d076e99614
--- /dev/null
+++ b/gems/gitlab-rspec/lib/gitlab/rspec.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+require "rspec"
+require_relative "rspec/version"
+
+module Gitlab
+ module Rspec
+ end
+end
diff --git a/gems/gitlab-rspec/lib/gitlab/rspec/all.rb b/gems/gitlab-rspec/lib/gitlab/rspec/all.rb
new file mode 100644
index 00000000000..091d2ba0287
--- /dev/null
+++ b/gems/gitlab-rspec/lib/gitlab/rspec/all.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+require_relative "../rspec"
+require_relative "stub_env"
+
+require_relative "configurations/time_travel"
+
+Gitlab::Rspec::Configurations::TimeTravel.configure!
diff --git a/gems/gitlab-rspec/lib/gitlab/rspec/configurations/time_travel.rb b/gems/gitlab-rspec/lib/gitlab/rspec/configurations/time_travel.rb
new file mode 100644
index 00000000000..b30aa1cde0d
--- /dev/null
+++ b/gems/gitlab-rspec/lib/gitlab/rspec/configurations/time_travel.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+require 'active_support/all'
+require 'active_support/testing/time_helpers'
+
+module Gitlab
+ module Rspec
+ module Configurations
+ class TimeTravel
+ def self.configure!
+ RSpec.configure do |config|
+ config.include ActiveSupport::Testing::TimeHelpers
+
+ config.around(:example, :freeze_time) do |example|
+ freeze_time { example.run }
+ end
+
+ config.around(:example, :time_travel_to) do |example|
+ date_or_time = example.metadata[:time_travel_to]
+
+ unless date_or_time.respond_to?(:to_time) && date_or_time.to_time.present?
+ raise 'The time_travel_to RSpec metadata must have a Date or Time value.'
+ end
+
+ travel_to(date_or_time) { example.run }
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-rspec/lib/gitlab/rspec/stub_env.rb b/gems/gitlab-rspec/lib/gitlab/rspec/stub_env.rb
new file mode 100644
index 00000000000..f8775d9f7b5
--- /dev/null
+++ b/gems/gitlab-rspec/lib/gitlab/rspec/stub_env.rb
@@ -0,0 +1,52 @@
+# frozen_string_literal: true
+
+# Inspired by https://github.com/ljkbennett/stub_env/blob/master/lib/stub_env/helpers.rb
+module StubENV
+ # Stub ENV variables
+ #
+ # You can provide either a key and value as separate params or both in a Hash format
+ #
+ # Keys and values will always be converted to String, to comply with how ENV behaves
+ #
+ # @param key_or_hash [String, Hash<String,String>]
+ # @param value [String]
+ def stub_env(key_or_hash, value = nil)
+ init_stub unless env_stubbed?
+
+ if key_or_hash.is_a? Hash
+ key_or_hash.each do |key, value|
+ add_stubbed_value(key, ensure_env_type(value))
+ end
+ else
+ add_stubbed_value key_or_hash, ensure_env_type(value)
+ end
+ end
+
+ private
+
+ STUBBED_KEY = '__STUBBED__'
+
+ def add_stubbed_value(key, value)
+ allow(ENV).to receive(:[]).with(key).and_return(value)
+ allow(ENV).to receive(:key?).with(key).and_return(true)
+ allow(ENV).to receive(:fetch).with(key).and_return(value)
+ allow(ENV).to receive(:fetch).with(key, anything) do |_, default_val|
+ value || default_val
+ end
+ end
+
+ def env_stubbed?
+ ENV.fetch(STUBBED_KEY, false)
+ end
+
+ def init_stub
+ allow(ENV).to receive(:[]).and_call_original
+ allow(ENV).to receive(:key?).and_call_original
+ allow(ENV).to receive(:fetch).and_call_original
+ add_stubbed_value(STUBBED_KEY, true)
+ end
+
+ def ensure_env_type(value)
+ value.nil? ? value : value.to_s
+ end
+end
diff --git a/gems/gitlab-rspec/lib/gitlab/rspec/version.rb b/gems/gitlab-rspec/lib/gitlab/rspec/version.rb
new file mode 100644
index 00000000000..34c51245012
--- /dev/null
+++ b/gems/gitlab-rspec/lib/gitlab/rspec/version.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Rspec
+ module Version
+ VERSION = "0.1.0"
+ end
+ end
+end
diff --git a/gems/gitlab-rspec/spec/gitlab/rspec/time_travel_spec.rb b/gems/gitlab-rspec/spec/gitlab/rspec/time_travel_spec.rb
new file mode 100644
index 00000000000..79804a99f70
--- /dev/null
+++ b/gems/gitlab-rspec/spec/gitlab/rspec/time_travel_spec.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+RSpec.describe 'time travel' do
+ before(:all) do
+ @original_time_zone = Time.zone
+ Time.zone = 'Eastern Time (US & Canada)'
+ end
+
+ after(:all) do
+ Time.zone = @original_time_zone
+ end
+
+ describe ':freeze_time' do
+ it 'freezes time around a spec example', :freeze_time do
+ expect { sleep 0.1 }.not_to change { Time.now.to_f }
+ end
+ end
+
+ describe ':time_travel_to' do
+ it 'time-travels to the specified date', time_travel_to: '2020-01-01' do
+ expect(Date.current).to eq(Date.new(2020, 1, 1))
+ end
+
+ it 'time-travels to the specified date & time', time_travel_to: '2020-02-02 10:30:45 -0700' do
+ expect(Time.current).to eq(Time.new(2020, 2, 2, 17, 30, 45, '+00:00'))
+ end
+ end
+end
diff --git a/gems/gitlab-rspec/spec/spec_helper.rb b/gems/gitlab-rspec/spec/spec_helper.rb
new file mode 100644
index 00000000000..c694747e094
--- /dev/null
+++ b/gems/gitlab-rspec/spec/spec_helper.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+require 'gitlab/rspec/all'
+
+RSpec.configure do |config|
+ # Enable flags like --only-failures and --next-failure
+ config.example_status_persistence_file_path = ".rspec_status"
+
+ # Disable RSpec exposing methods globally on `Module` and `main`
+ config.disable_monkey_patching!
+
+ config.expect_with :rspec do |c|
+ c.syntax = :expect
+ end
+end
diff --git a/gems/gitlab-schema-validation/.gitignore b/gems/gitlab-schema-validation/.gitignore
new file mode 100644
index 00000000000..b04a8c840df
--- /dev/null
+++ b/gems/gitlab-schema-validation/.gitignore
@@ -0,0 +1,11 @@
+/.bundle/
+/.yardoc
+/_yardoc/
+/coverage/
+/doc/
+/pkg/
+/spec/reports/
+/tmp/
+
+# rspec failure tracking
+.rspec_status
diff --git a/gems/gitlab-schema-validation/.gitlab-ci.yml b/gems/gitlab-schema-validation/.gitlab-ci.yml
new file mode 100644
index 00000000000..03db9e02b30
--- /dev/null
+++ b/gems/gitlab-schema-validation/.gitlab-ci.yml
@@ -0,0 +1,4 @@
+include:
+ - local: gems/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "gitlab-schema-validation"
diff --git a/gems/gitlab-schema-validation/.rspec b/gems/gitlab-schema-validation/.rspec
new file mode 100644
index 00000000000..34c5164d9b5
--- /dev/null
+++ b/gems/gitlab-schema-validation/.rspec
@@ -0,0 +1,3 @@
+--format documentation
+--color
+--require spec_helper
diff --git a/gems/gitlab-schema-validation/.rubocop.yml b/gems/gitlab-schema-validation/.rubocop.yml
new file mode 100644
index 00000000000..1dc800520ca
--- /dev/null
+++ b/gems/gitlab-schema-validation/.rubocop.yml
@@ -0,0 +1,8 @@
+inherit_from:
+ - ../config/rubocop.yml
+
+AllCops:
+ NewCops: enable
+
+RSpec/MultipleMemoizedHelpers:
+ Max: 25
diff --git a/gems/gitlab-schema-validation/Gemfile b/gems/gitlab-schema-validation/Gemfile
new file mode 100644
index 00000000000..3fa25adbee1
--- /dev/null
+++ b/gems/gitlab-schema-validation/Gemfile
@@ -0,0 +1,6 @@
+# frozen_string_literal: true
+
+source "https://rubygems.org"
+
+# Specify your gem's dependencies in gitlab-schema-validation.gemspec
+gemspec
diff --git a/gems/gitlab-schema-validation/Gemfile.lock b/gems/gitlab-schema-validation/Gemfile.lock
new file mode 100644
index 00000000000..5ad804d3660
--- /dev/null
+++ b/gems/gitlab-schema-validation/Gemfile.lock
@@ -0,0 +1,137 @@
+PATH
+ remote: .
+ specs:
+ gitlab-schema-validation (0.1.0)
+ diffy
+ pg_query
+
+GEM
+ remote: https://rubygems.org/
+ specs:
+ activesupport (7.0.6)
+ concurrent-ruby (~> 1.0, >= 1.0.2)
+ i18n (>= 1.6, < 2)
+ minitest (>= 5.1)
+ tzinfo (~> 2.0)
+ ast (2.4.2)
+ benchmark-malloc (0.2.0)
+ benchmark-perf (0.6.0)
+ benchmark-trend (0.4.0)
+ binding_of_caller (1.0.0)
+ debug_inspector (>= 0.0.1)
+ coderay (1.1.3)
+ concurrent-ruby (1.2.2)
+ debug_inspector (1.1.0)
+ diff-lcs (1.5.0)
+ diffy (3.4.2)
+ gitlab-styles (10.1.0)
+ rubocop (~> 1.50.2)
+ rubocop-graphql (~> 0.18)
+ rubocop-performance (~> 1.15)
+ rubocop-rails (~> 2.17)
+ rubocop-rspec (~> 2.22)
+ google-protobuf (3.23.3)
+ i18n (1.14.1)
+ concurrent-ruby (~> 1.0)
+ json (2.6.3)
+ method_source (1.0.0)
+ minitest (5.18.1)
+ parallel (1.23.0)
+ parser (3.2.2.3)
+ ast (~> 2.4.1)
+ racc
+ pg_query (4.2.1)
+ google-protobuf (>= 3.22.3)
+ proc_to_ast (0.1.0)
+ coderay
+ parser
+ unparser
+ pry (0.14.2)
+ coderay (~> 1.1)
+ method_source (~> 1.0)
+ racc (1.7.1)
+ rack (3.0.8)
+ rainbow (3.1.1)
+ regexp_parser (2.8.1)
+ rexml (3.2.5)
+ rspec (3.12.0)
+ rspec-core (~> 3.12.0)
+ rspec-expectations (~> 3.12.0)
+ rspec-mocks (~> 3.12.0)
+ rspec-benchmark (0.6.0)
+ benchmark-malloc (~> 0.2)
+ benchmark-perf (~> 0.6)
+ benchmark-trend (~> 0.4)
+ rspec (>= 3.0)
+ rspec-core (3.12.2)
+ rspec-support (~> 3.12.0)
+ rspec-expectations (3.12.3)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.12.0)
+ rspec-mocks (3.12.5)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.12.0)
+ rspec-parameterized (1.0.0)
+ rspec-parameterized-core (< 2)
+ rspec-parameterized-table_syntax (< 2)
+ rspec-parameterized-core (1.0.0)
+ parser
+ proc_to_ast
+ rspec (>= 2.13, < 4)
+ unparser
+ rspec-parameterized-table_syntax (1.0.0)
+ binding_of_caller
+ rspec-parameterized-core (< 2)
+ rspec-support (3.12.1)
+ rubocop (1.50.2)
+ json (~> 2.3)
+ parallel (~> 1.10)
+ parser (>= 3.2.0.0)
+ rainbow (>= 2.2.2, < 4.0)
+ regexp_parser (>= 1.8, < 3.0)
+ rexml (>= 3.2.5, < 4.0)
+ rubocop-ast (>= 1.28.0, < 2.0)
+ ruby-progressbar (~> 1.7)
+ unicode-display_width (>= 2.4.0, < 3.0)
+ rubocop-ast (1.29.0)
+ parser (>= 3.2.1.0)
+ rubocop-capybara (2.18.0)
+ rubocop (~> 1.41)
+ rubocop-factory_bot (2.23.1)
+ rubocop (~> 1.33)
+ rubocop-graphql (0.19.0)
+ rubocop (>= 0.87, < 2)
+ rubocop-performance (1.18.0)
+ rubocop (>= 1.7.0, < 2.0)
+ rubocop-ast (>= 0.4.0)
+ rubocop-rails (2.20.2)
+ activesupport (>= 4.2.0)
+ rack (>= 1.1)
+ rubocop (>= 1.33.0, < 2.0)
+ rubocop-rspec (2.22.0)
+ rubocop (~> 1.33)
+ rubocop-capybara (~> 2.17)
+ rubocop-factory_bot (~> 2.22)
+ ruby-progressbar (1.13.0)
+ tzinfo (2.0.6)
+ concurrent-ruby (~> 1.0)
+ unicode-display_width (2.4.2)
+ unparser (0.6.8)
+ diff-lcs (~> 1.3)
+ parser (>= 3.2.0)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ gitlab-schema-validation!
+ gitlab-styles (~> 10.1.0)
+ pry
+ rspec (~> 3.0)
+ rspec-benchmark (~> 0.6.0)
+ rspec-parameterized (~> 1.0)
+ rubocop (~> 1.50)
+ rubocop-rspec (~> 2.22)
+
+BUNDLED WITH
+ 2.4.14
diff --git a/gems/gitlab-schema-validation/gitlab-schema-validation.gemspec b/gems/gitlab-schema-validation/gitlab-schema-validation.gemspec
new file mode 100644
index 00000000000..47ca8b65b5d
--- /dev/null
+++ b/gems/gitlab-schema-validation/gitlab-schema-validation.gemspec
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+require_relative "lib/gitlab/schema/validation/version"
+
+Gem::Specification.new do |spec|
+ spec.name = "gitlab-schema-validation"
+ spec.version = Gitlab::Schema::Validation::Version::VERSION
+ spec.authors = ["group::database"]
+ spec.email = ["engineering@gitlab.com"]
+
+ spec.summary = "Schema validation framework"
+ spec.description = "Compares the differences between a structure.sql file and a database
+ and reports the inconsistencies."
+ spec.homepage = "https://gitlab.com/gitlab-org/gitlab/-/tree/master/gems/gitlab-schema-validation"
+ spec.license = "MIT"
+ spec.required_ruby_version = ">= 3.0"
+ spec.metadata["rubygems_mfa_required"] = "true"
+
+ spec.files = Dir['lib/**/*.rb']
+ spec.require_paths = ["lib"]
+
+ spec.add_runtime_dependency "diffy"
+ spec.add_runtime_dependency "pg_query"
+
+ spec.add_development_dependency "gitlab-styles", "~> 10.1.0"
+ spec.add_development_dependency "pry"
+ spec.add_development_dependency "rspec", "~> 3.0"
+ spec.add_development_dependency "rspec-benchmark", "~> 0.6.0"
+ spec.add_development_dependency "rspec-parameterized", "~> 1.0"
+ spec.add_development_dependency "rubocop", "~> 1.50"
+ spec.add_development_dependency "rubocop-rspec", "~> 2.22"
+end
diff --git a/gems/gitlab-schema-validation/lib/gitlab/schema/validation.rb b/gems/gitlab-schema-validation/lib/gitlab/schema/validation.rb
new file mode 100644
index 00000000000..5211358a197
--- /dev/null
+++ b/gems/gitlab-schema-validation/lib/gitlab/schema/validation.rb
@@ -0,0 +1,66 @@
+# frozen_string_literal: true
+
+require 'pg_query'
+require 'diffy'
+
+require_relative 'validation/version'
+require_relative 'validation/inconsistency'
+require_relative 'validation/pg_types'
+
+require_relative 'validation/validators/base'
+
+require_relative 'validation/validators/different_definition_indexes'
+require_relative 'validation/validators/extra_indexes'
+require_relative 'validation/validators/missing_indexes'
+
+require_relative 'validation/validators/extra_table_columns'
+require_relative 'validation/validators/missing_table_columns'
+
+require_relative 'validation/validators/different_definition_foreign_keys'
+require_relative 'validation/validators/extra_foreign_keys'
+require_relative 'validation/validators/missing_foreign_keys'
+
+require_relative 'validation/validators/different_definition_tables'
+require_relative 'validation/validators/extra_tables'
+require_relative 'validation/validators/missing_tables'
+
+require_relative 'validation/validators/different_definition_triggers'
+require_relative 'validation/validators/extra_triggers'
+require_relative 'validation/validators/missing_triggers'
+
+require_relative 'validation/sources/structure_sql'
+require_relative 'validation/sources/database'
+
+require_relative 'validation/schema_objects/base'
+require_relative 'validation/schema_objects/column'
+require_relative 'validation/schema_objects/index'
+require_relative 'validation/schema_objects/table'
+require_relative 'validation/schema_objects/trigger'
+require_relative 'validation/schema_objects/foreign_key'
+
+require_relative 'validation/adapters/column_database_adapter'
+require_relative 'validation/adapters/column_structure_sql_adapter'
+require_relative 'validation/adapters/foreign_key_database_adapter'
+require_relative 'validation/adapters/foreign_key_structure_sql_adapter'
+
+module Gitlab
+ module Schema
+ module Validation
+ class Runner
+ def initialize(structure_sql, database, validators:)
+ @structure_sql = structure_sql
+ @database = database
+ @validators = validators
+ end
+
+ def execute
+ validators.flat_map { |c| c.new(structure_sql, database).execute }
+ end
+
+ private
+
+ attr_reader :structure_sql, :database, :validators
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/lib/gitlab/schema/validation/adapters/column_database_adapter.rb b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/adapters/column_database_adapter.rb
new file mode 100644
index 00000000000..8b4d07d2e79
--- /dev/null
+++ b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/adapters/column_database_adapter.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Schema
+ module Validation
+ module Adapters
+ class ColumnDatabaseAdapter
+ def initialize(query_result)
+ @query_result = query_result
+ end
+
+ def name
+ @name ||= query_result['column_name']
+ end
+
+ def table_name
+ query_result['table_name']
+ end
+
+ def data_type
+ query_result['data_type']
+ end
+
+ def default
+ return unless query_result['column_default']
+
+ return if name == 'id' || query_result['column_default'].include?('nextval')
+
+ "DEFAULT #{query_result['column_default']}"
+ end
+
+ def nullable
+ 'NOT NULL' if query_result['not_null']
+ end
+
+ def partition_key?
+ query_result['partition_key']
+ end
+
+ private
+
+ attr_reader :query_result
+ end
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/lib/gitlab/schema/validation/adapters/column_structure_sql_adapter.rb b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/adapters/column_structure_sql_adapter.rb
new file mode 100644
index 00000000000..62e501bf16b
--- /dev/null
+++ b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/adapters/column_structure_sql_adapter.rb
@@ -0,0 +1,139 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Schema
+ module Validation
+ module Adapters
+ UndefinedPGType = Class.new(StandardError)
+
+ class ColumnStructureSqlAdapter
+ NOT_NULL_CONSTR = :CONSTR_NOTNULL
+ DEFAULT_CONSTR = :CONSTR_DEFAULT
+
+ MAPPINGS = {
+ 't' => 'true',
+ 'f' => 'false'
+ }.freeze
+
+ attr_reader :table_name
+
+ def initialize(table_name, pg_query_stmt, partitioning_stmt)
+ @table_name = table_name
+ @pg_query_stmt = pg_query_stmt
+ @partitioning_stmt = partitioning_stmt
+ end
+
+ def name
+ @name ||= pg_query_stmt.colname
+ end
+
+ def data_type
+ type(pg_query_stmt.type_name)
+ end
+
+ def default
+ return if name == 'id'
+
+ value = parse_node(constraints.find { |node| node.constraint.contype == DEFAULT_CONSTR })
+
+ return unless value
+
+ "DEFAULT #{value}"
+ end
+
+ def nullable
+ 'NOT NULL' if constraints.any? { |node| node.constraint.contype == NOT_NULL_CONSTR }
+ end
+
+ def partition_key?
+ partition_keys.include?(name)
+ end
+
+ private
+
+ attr_reader :pg_query_stmt, :partitioning_stmt
+
+ def constraints
+ @constraints ||= pg_query_stmt.constraints
+ end
+
+ # Returns the node type
+ #
+ # pg_type:: type alias, used internally by postgres, +int4+, +int8+, +bool+, +varchar+
+ # type:: type name, like +integer+, +bigint+, +boolean+, +character varying+.
+ # array_ext:: adds the +[]+ extension for array types.
+ # precision_ext:: adds the precision, if have any, like +(255)+, +(6)+.
+ #
+ # @info +timestamp+ and +timestamptz+ have a particular case when precision is defined.
+ # In this case, the order of the statement needs to be re-arranged from
+ # timestamp without time zone(6) to timestamp(6) without a time zone.
+ def type(node)
+ pg_type = parse_node(node.names.last)
+ type = PgTypes::TYPES.fetch(pg_type).dup
+ array_ext = '[]' if node.array_bounds.any?
+ precision_ext = "(#{node.typmods.map { |typmod| parse_node(typmod) }.join(',')})" if node.typmods.any?
+
+ if %w[timestamp timestamptz].include?(pg_type)
+ type.gsub!('timestamp', ['timestamp', precision_ext].compact.join)
+ precision_ext = nil
+ end
+
+ [type, precision_ext, array_ext].compact.join
+ rescue KeyError => e
+ raise UndefinedPGType, e.message
+ end
+
+ # Parses PGQuery nodes recursively
+ #
+ # :constraint:: nodes that groups column default info
+ # :partition_elem:: node that store partition key info
+ # :func_cal:: nodes that stores functions, like +now()+
+ # :a_const:: nodes that stores constant values, like +t+, +f+, +0.0.0.0+, +255+, +1.0+
+ # :type_cast:: nodes that stores casting values, like +'name'::text+, +'0.0.0.0'::inet+
+ # else:: extract node values in the last iteration of the recursion, like +int4+, +1.0+, +now+, +255+
+ #
+ # @note boolean types types are mapped from +t+, +f+ to +true+, +false+
+ def parse_node(node)
+ return unless node
+
+ case node.node
+ when :constraint
+ parse_node(node.constraint.raw_expr)
+ when :partition_elem
+ node.partition_elem.name
+ when :func_call
+ "#{parse_node(node.func_call.funcname.first)}()"
+ when :a_const
+ parse_a_const(node.a_const)
+ when :type_cast
+ value = parse_node(node.type_cast.arg)
+ type = type(node.type_cast.type_name)
+ separator = MAPPINGS.key?(value) ? '' : "::#{type}"
+
+ [MAPPINGS.fetch(value, "'#{value}'"), separator].compact.join
+ else
+ get_value_from_key(node, key: node.node)
+ end
+ end
+
+ def parse_a_const(a_const)
+ return unless a_const
+
+ type = a_const.val
+ get_value_from_key(a_const, key: type)
+ end
+
+ def get_value_from_key(node, key:)
+ node.to_h[key].values.last
+ end
+
+ def partition_keys
+ return [] unless partitioning_stmt
+
+ @partition_keys ||= partitioning_stmt.part_params.map { |key_stmt| parse_node(key_stmt) }
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/lib/gitlab/schema/validation/adapters/foreign_key_database_adapter.rb b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/adapters/foreign_key_database_adapter.rb
new file mode 100644
index 00000000000..ee5d5dc0ce9
--- /dev/null
+++ b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/adapters/foreign_key_database_adapter.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Schema
+ module Validation
+ module Adapters
+ class ForeignKeyDatabaseAdapter
+ def initialize(query_result)
+ @query_result = query_result
+ end
+
+ def name
+ "#{query_result['schema']}.#{query_result['foreign_key_name']}"
+ end
+
+ def table_name
+ query_result['table_name']
+ end
+
+ def statement
+ query_result['foreign_key_definition']
+ end
+
+ private
+
+ attr_reader :query_result
+ end
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/lib/gitlab/schema/validation/adapters/foreign_key_structure_sql_adapter.rb b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/adapters/foreign_key_structure_sql_adapter.rb
new file mode 100644
index 00000000000..730652c302d
--- /dev/null
+++ b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/adapters/foreign_key_structure_sql_adapter.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Schema
+ module Validation
+ module Adapters
+ class ForeignKeyStructureSqlAdapter
+ STATEMENT_REGEX = /\bREFERENCES\s\K\S+\K\s\(/
+ EXTRACT_REGEX = /\bFOREIGN KEY.*/
+
+ def initialize(parsed_stmt)
+ @parsed_stmt = parsed_stmt
+ end
+
+ def name
+ "#{schema_name}.#{foreign_key_name}"
+ end
+
+ def table_name
+ parsed_stmt.relation.relname
+ end
+
+ # PgQuery parses FK statements with an extra space in the referenced table column.
+ # This extra space needs to be removed.
+ #
+ # @example REFERENCES ci_pipelines (id) => REFERENCES ci_pipelines(id)
+ def statement
+ deparse_stmt[EXTRACT_REGEX].gsub(STATEMENT_REGEX, '(')
+ end
+
+ private
+
+ attr_reader :parsed_stmt
+
+ def schema_name
+ parsed_stmt.relation.schemaname
+ end
+
+ def foreign_key_name
+ parsed_stmt.cmds.first.alter_table_cmd.def.constraint.conname
+ end
+
+ def deparse_stmt
+ PgQuery.deparse_stmt(parsed_stmt)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/lib/gitlab/schema/validation/inconsistency.rb b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/inconsistency.rb
new file mode 100644
index 00000000000..13799b8b9ff
--- /dev/null
+++ b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/inconsistency.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Schema
+ module Validation
+ class Inconsistency
+ def initialize(validator_class, structure_sql_object, database_object)
+ @validator_class = validator_class
+ @structure_sql_object = structure_sql_object
+ @database_object = database_object
+ end
+
+ def error_message
+ format(validator_class::ERROR_MESSAGE, object_name)
+ end
+
+ def type
+ validator_class.name
+ end
+
+ def object_type
+ object_type = structure_sql_object&.class&.name || database_object&.class&.name
+
+ object_type&.gsub('Gitlab::Schema::Validation::SchemaObjects::', '')
+ end
+
+ def table_name
+ structure_sql_object&.table_name || database_object&.table_name
+ end
+
+ def object_name
+ structure_sql_object&.name || database_object&.name
+ end
+
+ def diff
+ Diffy::Diff.new(structure_sql_statement, database_statement)
+ end
+
+ def display
+ <<~MSG
+ #{'-' * 54}
+ #{error_message}
+ Diff:
+ #{diff.to_s(:color)}
+ #{'-' * 54}
+ MSG
+ end
+
+ def structure_sql_statement
+ return unless structure_sql_object
+
+ "#{structure_sql_object.statement}\n"
+ end
+
+ def database_statement
+ return unless database_object
+
+ "#{database_object.statement}\n"
+ end
+
+ private
+
+ attr_reader :validator_class, :structure_sql_object, :database_object
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/lib/gitlab/schema/validation/pg_types.rb b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/pg_types.rb
new file mode 100644
index 00000000000..335bbe94cfb
--- /dev/null
+++ b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/pg_types.rb
@@ -0,0 +1,73 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Schema
+ module Validation
+ class PgTypes
+ TYPES = {
+ 'bool' => 'boolean',
+ 'bytea' => 'bytea',
+ 'char' => '"char"',
+ 'int8' => 'bigint',
+ 'int2' => 'smallint',
+ 'int4' => 'integer',
+ 'regproc' => 'regproc',
+ 'text' => 'text',
+ 'oid' => 'oid',
+ 'tid' => 'tid',
+ 'xid' => 'xid',
+ 'cid' => 'cid',
+ 'json' => 'json',
+ 'xml' => 'xml',
+ 'pg_node_tree' => 'pg_node_tree',
+ 'pg_ndistinct' => 'pg_ndistinct',
+ 'pg_dependencies' => 'pg_dependencies',
+ 'pg_mcv_list' => 'pg_mcv_list',
+ 'xid8' => 'xid8',
+ 'path' => 'path',
+ 'polygon' => 'polygon',
+ 'float4' => 'real',
+ 'float8' => 'double precision',
+ 'circle' => 'circle',
+ 'money' => 'money',
+ 'macaddr' => 'macaddr',
+ 'inet' => 'inet',
+ 'cidr' => 'cidr',
+ 'macaddr8' => 'macaddr8',
+ 'aclitem' => 'aclitem',
+ 'bpchar' => 'character',
+ 'varchar' => 'character varying',
+ 'date' => 'date',
+ 'time' => 'time without time zone',
+ 'timestamp' => 'timestamp without time zone',
+ 'timestamptz' => 'timestamp with time zone',
+ 'interval' => 'interval',
+ 'timetz' => 'time with time zone',
+ 'bit' => 'bit',
+ 'varbit' => 'bit varying',
+ 'numeric' => 'numeric',
+ 'refcursor' => 'refcursor',
+ 'regprocedure' => 'regprocedure',
+ 'regoper' => 'regoper',
+ 'regoperator' => 'regoperator',
+ 'regclass' => 'regclass',
+ 'regcollation' => 'regcollation',
+ 'regtype' => 'regtype',
+ 'regrole' => 'regrole',
+ 'regnamespace' => 'regnamespace',
+ 'uuid' => 'uuid',
+ 'pg_lsn' => 'pg_lsn',
+ 'tsvector' => 'tsvector',
+ 'gtsvector' => 'gtsvector',
+ 'tsquery' => 'tsquery',
+ 'regconfig' => 'regconfig',
+ 'regdictionary' => 'regdictionary',
+ 'jsonb' => 'jsonb',
+ 'jsonpath' => 'jsonpath',
+ 'txid_snapshot' => 'txid_snapshot',
+ 'pg_snapshot' => 'pg_snapshot'
+ }.freeze
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/lib/gitlab/schema/validation/schema_objects/base.rb b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/schema_objects/base.rb
new file mode 100644
index 00000000000..1af7a67ddb6
--- /dev/null
+++ b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/schema_objects/base.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Schema
+ module Validation
+ module SchemaObjects
+ class Base
+ def initialize(parsed_stmt)
+ @parsed_stmt = parsed_stmt
+ end
+
+ def name
+ raise NoMethodError, "subclasses of #{self.class.name} must implement #{__method__}"
+ end
+
+ def table_name
+ parsed_stmt.relation.relname
+ end
+
+ def statement
+ @statement ||= PgQuery.deparse_stmt(parsed_stmt)
+ end
+
+ private
+
+ attr_reader :parsed_stmt
+ end
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/lib/gitlab/schema/validation/schema_objects/column.rb b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/schema_objects/column.rb
new file mode 100644
index 00000000000..0b3687fdb98
--- /dev/null
+++ b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/schema_objects/column.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Schema
+ module Validation
+ module SchemaObjects
+ class Column
+ def initialize(adapter)
+ @adapter = adapter
+ end
+
+ attr_reader :adapter
+
+ def name
+ adapter.name
+ end
+
+ def table_name
+ adapter.table_name
+ end
+
+ def partition_key?
+ adapter.partition_key?
+ end
+
+ def statement
+ [adapter.name, adapter.data_type, adapter.default, adapter.nullable].compact.join(' ')
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/lib/gitlab/schema/validation/schema_objects/foreign_key.rb b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/schema_objects/foreign_key.rb
new file mode 100644
index 00000000000..41e2d30029a
--- /dev/null
+++ b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/schema_objects/foreign_key.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Schema
+ module Validation
+ module SchemaObjects
+ class ForeignKey
+ def initialize(adapter)
+ @adapter = adapter
+ end
+
+ # Foreign key name should include the schema, as the same name could be used across different schemas
+ #
+ # @example public.foreign_key_name
+ def name
+ @name ||= adapter.name
+ end
+
+ def table_name
+ @table_name ||= adapter.table_name
+ end
+
+ def statement
+ @statement ||= adapter.statement
+ end
+
+ private
+
+ attr_reader :adapter
+ end
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/lib/gitlab/schema/validation/schema_objects/index.rb b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/schema_objects/index.rb
new file mode 100644
index 00000000000..9f99c6a6e6e
--- /dev/null
+++ b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/schema_objects/index.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Schema
+ module Validation
+ module SchemaObjects
+ class Index < Base
+ def name
+ parsed_stmt.idxname
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/lib/gitlab/schema/validation/schema_objects/table.rb b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/schema_objects/table.rb
new file mode 100644
index 00000000000..591131cb220
--- /dev/null
+++ b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/schema_objects/table.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Schema
+ module Validation
+ module SchemaObjects
+ class Table
+ def initialize(name, columns)
+ @name = name
+ @columns = columns
+ end
+
+ attr_reader :name, :columns
+
+ def table_name
+ name
+ end
+
+ def statement
+ format('CREATE TABLE %s (%s)', name, columns_statement)
+ end
+
+ def fetch_column_by_name(column_name)
+ columns.find { |column| column.name == column_name }
+ end
+
+ def column_exists?(column_name)
+ column = fetch_column_by_name(column_name)
+
+ return false if column.nil?
+
+ true
+ end
+
+ private
+
+ def columns_statement
+ columns.reject(&:partition_key?).map(&:statement).join(', ')
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/lib/gitlab/schema/validation/schema_objects/trigger.rb b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/schema_objects/trigger.rb
new file mode 100644
index 00000000000..7903985a963
--- /dev/null
+++ b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/schema_objects/trigger.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Schema
+ module Validation
+ module SchemaObjects
+ class Trigger < Base
+ def name
+ parsed_stmt.trigname
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/lib/gitlab/schema/validation/sources/database.rb b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/sources/database.rb
new file mode 100644
index 00000000000..8505d1f149a
--- /dev/null
+++ b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/sources/database.rb
@@ -0,0 +1,192 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Schema
+ module Validation
+ module Sources
+ class Database
+ STATIC_PARTITIONS_SCHEMA = 'gitlab_partitions_static'
+
+ def initialize(connection)
+ @connection = connection
+ end
+
+ def fetch_index_by_name(index_name)
+ index_map[index_name]
+ end
+
+ def fetch_trigger_by_name(trigger_name)
+ trigger_map[trigger_name]
+ end
+
+ def fetch_foreign_key_by_name(foreign_key_name)
+ foreign_key_map[foreign_key_name]
+ end
+
+ def fetch_table_by_name(table_name)
+ table_map[table_name]
+ end
+
+ def index_exists?(index_name)
+ index = index_map[index_name]
+
+ return false if index.nil?
+
+ true
+ end
+
+ def trigger_exists?(trigger_name)
+ trigger = trigger_map[trigger_name]
+
+ return false if trigger.nil?
+
+ true
+ end
+
+ def foreign_key_exists?(foreign_key_name)
+ foreign_key = fetch_foreign_key_by_name(foreign_key_name)
+
+ return false if foreign_key.nil?
+
+ true
+ end
+
+ def table_exists?(table_name)
+ table = fetch_table_by_name(table_name)
+
+ return false if table.nil?
+
+ true
+ end
+
+ def indexes
+ index_map.values
+ end
+
+ def triggers
+ trigger_map.values
+ end
+
+ def foreign_keys
+ foreign_key_map.values
+ end
+
+ def tables
+ table_map.values
+ end
+
+ private
+
+ attr_reader :connection
+
+ def schemas
+ @schemas ||= [STATIC_PARTITIONS_SCHEMA, connection.current_schema]
+ end
+
+ def trigger_map
+ @trigger_map ||=
+ fetch_triggers.transform_values! do |trigger_stmt|
+ SchemaObjects::Trigger.new(PgQuery.parse(trigger_stmt).tree.stmts.first.stmt.create_trig_stmt)
+ end
+ end
+
+ def fetch_triggers
+ # rubocop:disable Rails/SquishedSQLHeredocs
+ sql = <<~SQL
+ SELECT triggers.tgname, pg_get_triggerdef(triggers.oid)
+ FROM pg_catalog.pg_trigger triggers
+ INNER JOIN pg_catalog.pg_class rel ON triggers.tgrelid = rel.oid
+ INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace
+ WHERE triggers.tgisinternal IS FALSE
+ AND nsp.nspname IN ($1, $2)
+ SQL
+ # rubocop:enable Rails/SquishedSQLHeredocs
+
+ connection.select_rows(sql, nil, schemas).to_h
+ end
+
+ def table_map
+ @table_map ||= fetch_tables.transform_values! do |stmt|
+ columns = stmt.map { |column| SchemaObjects::Column.new(Adapters::ColumnDatabaseAdapter.new(column)) }
+
+ SchemaObjects::Table.new(stmt.first['table_name'], columns)
+ end
+ end
+
+ def fetch_tables
+ # rubocop:disable Rails/SquishedSQLHeredocs
+ sql = <<~SQL
+ SELECT
+ table_information.relname AS table_name,
+ col_information.attname AS column_name,
+ col_information.attnotnull AS not_null,
+ col_information.attnum = ANY(pg_partitioned_table.partattrs) as partition_key,
+ format_type(col_information.atttypid, col_information.atttypmod) AS data_type,
+ pg_get_expr(col_default_information.adbin, col_default_information.adrelid) AS column_default
+ FROM pg_attribute AS col_information
+ JOIN pg_class AS table_information ON col_information.attrelid = table_information.oid
+ JOIN pg_namespace AS schema_information ON table_information.relnamespace = schema_information.oid
+ LEFT JOIN pg_partitioned_table ON pg_partitioned_table.partrelid = table_information.oid
+ LEFT JOIN pg_attrdef AS col_default_information ON col_information.attrelid = col_default_information.adrelid
+ AND col_information.attnum = col_default_information.adnum
+ WHERE NOT col_information.attisdropped
+ AND col_information.attnum > 0
+ AND table_information.relkind IN ('r', 'p')
+ AND schema_information.nspname IN ($1, $2)
+ SQL
+ # rubocop:enable Rails/SquishedSQLHeredocs
+
+ connection.exec_query(sql, nil, schemas).group_by { |row| row['table_name'] }
+ end
+
+ def fetch_indexes
+ # rubocop:disable Rails/SquishedSQLHeredocs
+ sql = <<~SQL
+ SELECT indexname, indexdef
+ FROM pg_indexes
+ WHERE indexname NOT LIKE '%_pkey' AND schemaname IN ($1, $2);
+ SQL
+ # rubocop:enable Rails/SquishedSQLHeredocs
+
+ connection.select_rows(sql, nil, schemas).to_h
+ end
+
+ def index_map
+ @index_map ||=
+ fetch_indexes.transform_values! do |index_stmt|
+ SchemaObjects::Index.new(PgQuery.parse(index_stmt).tree.stmts.first.stmt.index_stmt)
+ end
+ end
+
+ def foreign_key_map
+ @foreign_key_map ||= fetch_fks.each_with_object({}) do |stmt, result|
+ adapter = Adapters::ForeignKeyDatabaseAdapter.new(stmt)
+
+ result[adapter.name] = SchemaObjects::ForeignKey.new(adapter)
+ end
+ end
+
+ def fetch_fks
+ # rubocop:disable Rails/SquishedSQLHeredocs
+ sql = <<~SQL
+ SELECT
+ pg_namespace.nspname::text AS schema,
+ pg_class.relname::text AS table_name,
+ pg_constraint.conname AS foreign_key_name,
+ pg_get_constraintdef(pg_constraint.oid) AS foreign_key_definition
+ FROM pg_constraint
+ INNER JOIN pg_class ON pg_constraint.conrelid = pg_class.oid
+ INNER JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid
+ WHERE contype = 'f'
+ AND pg_namespace.nspname = $1
+ AND pg_constraint.conparentid = 0
+ SQL
+ # rubocop:enable Rails/SquishedSQLHeredocs
+
+ connection.exec_query(sql, nil, [connection.current_schema])
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/lib/gitlab/schema/validation/sources/structure_sql.rb b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/sources/structure_sql.rb
new file mode 100644
index 00000000000..b2e3fcd63c5
--- /dev/null
+++ b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/sources/structure_sql.rb
@@ -0,0 +1,143 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Schema
+ module Validation
+ module Sources
+ class StructureSql
+ DEFAULT_SCHEMA = 'public'
+
+ def initialize(structure_file_path, schema_name = DEFAULT_SCHEMA)
+ @structure_file_path = structure_file_path
+ @schema_name = schema_name
+ end
+
+ def index_exists?(index_name)
+ index = indexes.find { |index| index.name == index_name }
+
+ return false if index.nil?
+
+ true
+ end
+
+ def trigger_exists?(trigger_name)
+ trigger = triggers.find { |trigger| trigger.name == trigger_name }
+
+ return false if trigger.nil?
+
+ true
+ end
+
+ def foreign_key_exists?(foreign_key_name)
+ foreign_key = foreign_keys.find { |fk| fk.name == foreign_key_name }
+
+ return false if foreign_key.nil?
+
+ true
+ end
+
+ def table_exists?(table_name)
+ table = fetch_table_by_name(table_name)
+
+ return false if table.nil?
+
+ true
+ end
+
+ def fetch_table_by_name(table_name)
+ tables.find { |table| table.name == table_name }
+ end
+
+ def indexes
+ @indexes ||= map_with_default_schema(index_statements, SchemaObjects::Index)
+ end
+
+ def triggers
+ @triggers ||= map_with_default_schema(trigger_statements, SchemaObjects::Trigger)
+ end
+
+ def foreign_keys
+ @foreign_keys ||= foreign_key_statements.map do |stmt|
+ stmt.relation.schemaname = schema_name if stmt.relation.schemaname == ''
+
+ SchemaObjects::ForeignKey.new(Adapters::ForeignKeyStructureSqlAdapter.new(stmt))
+ end
+ end
+
+ def tables
+ @tables ||= table_statements.map do |stmt|
+ table_name = stmt.relation.relname
+ partition_stmt = stmt.partspec
+
+ columns = stmt.table_elts.select { |n| n.node == :column_def }.map do |column|
+ adapter = Adapters::ColumnStructureSqlAdapter.new(table_name, column.column_def, partition_stmt)
+ SchemaObjects::Column.new(adapter)
+ end
+
+ SchemaObjects::Table.new(table_name, columns)
+ end
+ end
+
+ private
+
+ attr_reader :structure_file_path, :schema_name
+
+ def index_statements
+ statements.filter_map { |s| s.stmt.index_stmt }
+ end
+
+ def trigger_statements
+ statements.filter_map { |s| s.stmt.create_trig_stmt }
+ end
+
+ def table_statements
+ statements.filter_map { |s| s.stmt.create_stmt }
+ end
+
+ def foreign_key_statements
+ constraint_statements(:CONSTR_FOREIGN)
+ end
+
+ # Filter constraint statement nodes
+ #
+ # @param constraint_type [Symbol] node type. One of CONSTR_PRIMARY, CONSTR_CHECK, CONSTR_EXCLUSION,
+ # CONSTR_UNIQUE or CONSTR_FOREIGN.
+ def constraint_statements(constraint_type)
+ alter_table_statements(:AT_AddConstraint).filter do |stmt|
+ stmt.cmds.first.alter_table_cmd.def.constraint.contype == constraint_type
+ end
+ end
+
+ # Filter alter table statement nodes
+ #
+ # @param subtype [Symbol] node subtype +AT_AttachPartition+, +AT_ColumnDefault+ or +AT_AddConstraint+
+ def alter_table_statements(subtype)
+ statements.filter_map do |statement|
+ node = statement.stmt.alter_table_stmt
+
+ next unless node
+
+ node if node.cmds.first.alter_table_cmd.subtype == subtype
+ end
+ end
+
+ def statements
+ @statements ||= parsed_structure_file.tree.stmts
+ end
+
+ def parsed_structure_file
+ PgQuery.parse(File.read(structure_file_path))
+ end
+
+ def map_with_default_schema(statements, validation_class)
+ statements.map do |statement|
+ statement.relation.schemaname = schema_name if statement.relation.schemaname == ''
+
+ validation_class.new(statement)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/base.rb b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/base.rb
new file mode 100644
index 00000000000..151af4b61e6
--- /dev/null
+++ b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/base.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Schema
+ module Validation
+ module Validators
+ class Base
+ ERROR_MESSAGE = 'A schema inconsistency has been found'
+
+ def initialize(structure_sql, database)
+ @structure_sql = structure_sql
+ @database = database
+ end
+
+ def self.all_validators
+ [
+ ExtraTables,
+ ExtraTableColumns,
+ ExtraIndexes,
+ ExtraTriggers,
+ ExtraForeignKeys,
+ MissingTables,
+ MissingTableColumns,
+ MissingIndexes,
+ MissingTriggers,
+ MissingForeignKeys,
+ DifferentDefinitionTables,
+ DifferentDefinitionIndexes,
+ DifferentDefinitionTriggers,
+ DifferentDefinitionForeignKeys
+ ]
+ end
+
+ def execute
+ raise NoMethodError, "subclasses of #{self.class.name} must implement #{__method__}"
+ end
+
+ private
+
+ attr_reader :structure_sql, :database
+
+ def build_inconsistency(validator_class, structure_sql_object, database_object)
+ Inconsistency.new(validator_class, structure_sql_object, database_object)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/different_definition_foreign_keys.rb b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/different_definition_foreign_keys.rb
new file mode 100644
index 00000000000..d8ea7807cc5
--- /dev/null
+++ b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/different_definition_foreign_keys.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Schema
+ module Validation
+ module Validators
+ class DifferentDefinitionForeignKeys < Base
+ ERROR_MESSAGE = "The %s foreign key has a different statement between structure.sql and database"
+
+ def execute
+ structure_sql.foreign_keys.filter_map do |structure_sql_fk|
+ database_fk = database.fetch_foreign_key_by_name(structure_sql_fk.name)
+
+ next if database_fk.nil?
+ next if database_fk.statement == structure_sql_fk.statement
+
+ build_inconsistency(self.class, structure_sql_fk, database_fk)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/different_definition_indexes.rb b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/different_definition_indexes.rb
new file mode 100644
index 00000000000..032e7edd5ab
--- /dev/null
+++ b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/different_definition_indexes.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Schema
+ module Validation
+ module Validators
+ class DifferentDefinitionIndexes < Base
+ ERROR_MESSAGE = 'The %s index has a different statement between structure.sql and database'
+
+ def execute
+ structure_sql.indexes.filter_map do |structure_sql_index|
+ database_index = database.fetch_index_by_name(structure_sql_index.name)
+
+ next if database_index.nil?
+ next if database_index.statement == structure_sql_index.statement
+
+ build_inconsistency(self.class, structure_sql_index, database_index)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/different_definition_tables.rb b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/different_definition_tables.rb
new file mode 100644
index 00000000000..f6892a76a12
--- /dev/null
+++ b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/different_definition_tables.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Schema
+ module Validation
+ module Validators
+ class DifferentDefinitionTables < Base
+ ERROR_MESSAGE = "The table %s has a different column statement between structure.sql and database"
+
+ def execute
+ structure_sql.tables.filter_map do |structure_sql_table|
+ table_name = structure_sql_table.name
+ database_table = database.fetch_table_by_name(table_name)
+
+ next unless database_table
+
+ db_diffs, structure_diffs = column_diffs(database_table, structure_sql_table.columns)
+
+ if db_diffs.any?
+ build_inconsistency(self.class,
+ SchemaObjects::Table.new(table_name, db_diffs),
+ SchemaObjects::Table.new(table_name, structure_diffs))
+ end
+ end
+ end
+
+ private
+
+ def column_diffs(db_table, columns)
+ db_diffs = []
+ structure_diffs = []
+
+ columns.each do |column|
+ db_column = db_table.fetch_column_by_name(column.name)
+
+ next unless db_column
+
+ next if db_column.statement == column.statement
+
+ db_diffs << db_column
+ structure_diffs << column
+ end
+
+ [db_diffs, structure_diffs]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/different_definition_triggers.rb b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/different_definition_triggers.rb
new file mode 100644
index 00000000000..eed78924b02
--- /dev/null
+++ b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/different_definition_triggers.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Schema
+ module Validation
+ module Validators
+ class DifferentDefinitionTriggers < Base
+ ERROR_MESSAGE = "The %s trigger has a different statement between structure.sql and database"
+
+ def execute
+ structure_sql.triggers.filter_map do |structure_sql_trigger|
+ database_trigger = database.fetch_trigger_by_name(structure_sql_trigger.name)
+
+ next if database_trigger.nil?
+ next if database_trigger.statement == structure_sql_trigger.statement
+
+ build_inconsistency(self.class, structure_sql_trigger, nil)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/extra_foreign_keys.rb b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/extra_foreign_keys.rb
new file mode 100644
index 00000000000..81968318629
--- /dev/null
+++ b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/extra_foreign_keys.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Schema
+ module Validation
+ module Validators
+ class ExtraForeignKeys < Base
+ ERROR_MESSAGE = "The foreign key %s is present in the database, but not in the structure.sql file"
+
+ def execute
+ database.foreign_keys.filter_map do |database_fk|
+ next if structure_sql.foreign_key_exists?(database_fk.name)
+
+ build_inconsistency(self.class, nil, database_fk)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/extra_indexes.rb b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/extra_indexes.rb
new file mode 100644
index 00000000000..4b5bd7c820b
--- /dev/null
+++ b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/extra_indexes.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Schema
+ module Validation
+ module Validators
+ class ExtraIndexes < Base
+ ERROR_MESSAGE = 'The index %s is present in the database, but not in the structure.sql file'
+
+ def execute
+ database.indexes.filter_map do |database_index|
+ next if structure_sql.index_exists?(database_index.name)
+
+ build_inconsistency(self.class, nil, database_index)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/extra_table_columns.rb b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/extra_table_columns.rb
new file mode 100644
index 00000000000..517d6ae957f
--- /dev/null
+++ b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/extra_table_columns.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Schema
+ module Validation
+ module Validators
+ class ExtraTableColumns < Base
+ ERROR_MESSAGE = "The table %s has columns present in the database, but not in the structure.sql file"
+
+ def execute
+ database.tables.filter_map do |database_table|
+ table_name = database_table.name
+ structure_sql_table = structure_sql.fetch_table_by_name(table_name)
+
+ next unless structure_sql_table
+
+ inconsistencies = database_table.columns.filter_map do |database_table_column|
+ next if structure_sql_table.column_exists?(database_table_column.name)
+
+ database_table_column
+ end
+
+ if inconsistencies.any?
+ build_inconsistency(self.class, nil, SchemaObjects::Table.new(table_name, inconsistencies))
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/extra_tables.rb b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/extra_tables.rb
new file mode 100644
index 00000000000..d297464a01c
--- /dev/null
+++ b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/extra_tables.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Schema
+ module Validation
+ module Validators
+ class ExtraTables < Base
+ ERROR_MESSAGE = "The table %s is present in the database, but not in the structure.sql file"
+
+ def execute
+ database.tables.filter_map do |database_table|
+ next if structure_sql.table_exists?(database_table.name)
+
+ build_inconsistency(self.class, nil, database_table)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/extra_triggers.rb b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/extra_triggers.rb
new file mode 100644
index 00000000000..d06747989fc
--- /dev/null
+++ b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/extra_triggers.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Schema
+ module Validation
+ module Validators
+ class ExtraTriggers < Base
+ ERROR_MESSAGE = "The trigger %s is present in the database, but not in the structure.sql file"
+
+ def execute
+ database.triggers.filter_map do |database_trigger|
+ next if structure_sql.trigger_exists?(database_trigger.name)
+
+ build_inconsistency(self.class, nil, database_trigger)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/missing_foreign_keys.rb b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/missing_foreign_keys.rb
new file mode 100644
index 00000000000..daebd458282
--- /dev/null
+++ b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/missing_foreign_keys.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Schema
+ module Validation
+ module Validators
+ class MissingForeignKeys < Base
+ ERROR_MESSAGE = "The foreign key %s is missing from the database"
+
+ def execute
+ structure_sql.foreign_keys.filter_map do |structure_sql_fk|
+ next if database.foreign_key_exists?(structure_sql_fk.name)
+
+ build_inconsistency(self.class, structure_sql_fk, nil)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/missing_indexes.rb b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/missing_indexes.rb
new file mode 100644
index 00000000000..655c462aeaa
--- /dev/null
+++ b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/missing_indexes.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Schema
+ module Validation
+ module Validators
+ class MissingIndexes < Base
+ ERROR_MESSAGE = "The index %s is missing from the database"
+
+ def execute
+ structure_sql.indexes.filter_map do |structure_sql_index|
+ next if database.index_exists?(structure_sql_index.name)
+
+ build_inconsistency(self.class, structure_sql_index, nil)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/missing_table_columns.rb b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/missing_table_columns.rb
new file mode 100644
index 00000000000..8b441e19654
--- /dev/null
+++ b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/missing_table_columns.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Schema
+ module Validation
+ module Validators
+ class MissingTableColumns < Base
+ ERROR_MESSAGE = "The table %s has columns missing from the database"
+
+ def execute
+ structure_sql.tables.filter_map do |structure_sql_table|
+ table_name = structure_sql_table.name
+ database_table = database.fetch_table_by_name(table_name)
+
+ next unless database_table
+
+ inconsistencies = structure_sql_table.columns.filter_map do |structure_table_column|
+ next if database_table.column_exists?(structure_table_column.name)
+
+ structure_table_column
+ end
+
+ if inconsistencies.any?
+ build_inconsistency(self.class, nil, SchemaObjects::Table.new(table_name, inconsistencies))
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/missing_tables.rb b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/missing_tables.rb
new file mode 100644
index 00000000000..facf9135dfb
--- /dev/null
+++ b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/missing_tables.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Schema
+ module Validation
+ module Validators
+ class MissingTables < Base
+ ERROR_MESSAGE = "The table %s is missing from the database"
+
+ def execute
+ structure_sql.tables.filter_map do |structure_sql_table|
+ next if database.table_exists?(structure_sql_table.name)
+
+ build_inconsistency(self.class, structure_sql_table, nil)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/missing_triggers.rb b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/missing_triggers.rb
new file mode 100644
index 00000000000..1640d4304c3
--- /dev/null
+++ b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/validators/missing_triggers.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Schema
+ module Validation
+ module Validators
+ class MissingTriggers < Base
+ ERROR_MESSAGE = "The trigger %s is missing from the database"
+
+ def execute
+ structure_sql.triggers.filter_map do |structure_sql_trigger|
+ next if database.trigger_exists?(structure_sql_trigger.name)
+
+ build_inconsistency(self.class, structure_sql_trigger, nil)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/lib/gitlab/schema/validation/version.rb b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/version.rb
new file mode 100644
index 00000000000..40220578c97
--- /dev/null
+++ b/gems/gitlab-schema-validation/lib/gitlab/schema/validation/version.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Schema
+ module Validation
+ module Version
+ VERSION = "0.1.0"
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/spec/fixtures/structure.sql b/gems/gitlab-schema-validation/spec/fixtures/structure.sql
new file mode 100644
index 00000000000..421fb6c3593
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/fixtures/structure.sql
@@ -0,0 +1,108 @@
+CREATE INDEX missing_index ON events USING btree (created_at, author_id);
+
+CREATE UNIQUE INDEX wrong_index ON table_name (column_name, column_name_2);
+
+CREATE UNIQUE INDEX "index" ON achievements USING btree (namespace_id, lower(name));
+
+CREATE INDEX index_namespaces_public_groups_name_id ON namespaces USING btree (name, id) WHERE (((type)::text = 'Group'::text) AND (visibility_level = 20));
+
+CREATE UNIQUE INDEX index_on_deploy_keys_id_and_type_and_public ON keys USING btree (id, type) WHERE (public = true);
+
+CREATE INDEX index_users_on_public_email_excluding_null_and_empty ON users USING btree (public_email) WHERE (((public_email)::text <> ''::text) AND (public_email IS NOT NULL));
+
+CREATE TABLE test_table (
+ id bigint NOT NULL,
+ integer_column integer,
+ integer_with_default_column integer DEFAULT 1,
+ smallint_column smallint,
+ smallint_with_default_column smallint DEFAULT 0 NOT NULL,
+ numeric_column numeric NOT NULL,
+ numeric_with_default_column numeric DEFAULT 1.0 NOT NULL,
+ boolean_colum boolean,
+ boolean_with_default_colum boolean DEFAULT true NOT NULL,
+ double_precision_column double precision,
+ double_precision_with_default_column double precision DEFAULT 1.0,
+ varying_column character varying,
+ varying_with_default_column character varying DEFAULT 'DEFAULT'::character varying NOT NULL,
+ varying_with_limit_column character varying(255),
+ varying_with_limit_and_default_column character varying(255) DEFAULT 'DEFAULT'::character varying,
+ text_column text NOT NULL,
+ text_with_default_column text DEFAULT ''::text NOT NULL,
+ array_column character varying(255)[] NOT NULL,
+ array_with_default_column character varying(255)[] DEFAULT '{one,two}'::character varying[] NOT NULL,
+ jsonb_column jsonb,
+ jsonb_with_default_column jsonb DEFAULT '[]'::jsonb NOT NULL,
+ timestamptz_column timestamp with time zone,
+ timestamptz_with_default_column timestamp(6) with time zone DEFAULT now(),
+ timestamp_column timestamp(6) without time zone NOT NULL,
+ timestamp_with_default_column timestamp(6) without time zone DEFAULT '2022-01-23 00:00:00+00'::timestamp without time zone NOT NULL,
+ date_column date,
+ date_with_default_column date DEFAULT '2023-04-05',
+ inet_column inet NOT NULL,
+ inet_with_default_column inet DEFAULT '0.0.0.0'::inet NOT NULL,
+ macaddr_column macaddr,
+ macaddr_with_default_column macaddr DEFAULT '00-00-00-00-00-000'::macaddr NOT NULL,
+ uuid_column uuid NOT NULL,
+ uuid_with_default_column uuid DEFAULT '00000000-0000-0000-0000-000000000000'::uuid NOT NULL,
+ bytea_column bytea,
+ bytea_with_default_column bytea DEFAULT '\xDEADBEEF'::bytea,
+ unmapped_column_type anyarray,
+ partition_key bigint DEFAULT 1 NOT NULL,
+ created_at timestamp with time zone DEFAULT now() NOT NULL
+) PARTITION BY HASH (partition_key, created_at);
+
+CREATE TABLE ci_project_mirrors (
+ id bigint NOT NULL,
+ project_id integer NOT NULL,
+ namespace_id integer NOT NULL
+);
+
+CREATE TABLE wrong_table (
+ id bigint NOT NULL,
+ description character varying(255) NOT NULL
+);
+
+CREATE TABLE extra_table_columns (
+ id bigint NOT NULL,
+ name character varying(255) NOT NULL
+);
+
+CREATE TABLE missing_table (
+ id bigint NOT NULL,
+ description text NOT NULL
+);
+
+CREATE TABLE missing_table_columns (
+ id bigint NOT NULL,
+ email character varying(255) NOT NULL
+);
+
+CREATE TABLE operations_user_lists (
+ id bigint NOT NULL,
+ project_id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ iid integer NOT NULL,
+ name character varying(255) NOT NULL,
+ user_xids text DEFAULT ''::text NOT NULL
+);
+
+CREATE TRIGGER trigger AFTER INSERT ON public.t1 FOR EACH ROW EXECUTE FUNCTION t1();
+
+CREATE TRIGGER wrong_trigger BEFORE UPDATE ON public.t2 FOR EACH ROW EXECUTE FUNCTION my_function();
+
+CREATE TRIGGER missing_trigger_1 BEFORE INSERT OR UPDATE ON public.t3 FOR EACH ROW EXECUTE FUNCTION t3();
+
+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();
+
+ALTER TABLE web_hooks
+ ADD CONSTRAINT web_hooks_project_id_fkey FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY issues
+ ADD CONSTRAINT wrong_definition_fk FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY issues
+ ADD CONSTRAINT missing_fk FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY bulk_import_configurations
+ ADD CONSTRAINT fk_rails_536b96bff1 FOREIGN KEY (bulk_import_id) REFERENCES bulk_imports(id) ON DELETE CASCADE;
diff --git a/gems/gitlab-schema-validation/spec/gitlab/schema/validation_spec.rb b/gems/gitlab-schema-validation/spec/gitlab/schema/validation_spec.rb
new file mode 100644
index 00000000000..f4a06abab48
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/gitlab/schema/validation_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+RSpec.describe Gitlab::Schema::Validation do
+ it "has a version number" do
+ expect(Gitlab::Schema::Validation::Version::VERSION).not_to be_nil
+ end
+end
diff --git a/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/adapters/column_database_adapter_spec.rb b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/adapters/column_database_adapter_spec.rb
new file mode 100644
index 00000000000..ce16d8468b5
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/adapters/column_database_adapter_spec.rb
@@ -0,0 +1,72 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Schema::Validation::Adapters::ColumnDatabaseAdapter, feature_category: :database do
+ subject(:adapter) { described_class.new(db_result) }
+
+ let(:column_name) { 'email' }
+ let(:column_default) { "'no-reply@gitlab.com'::character varying" }
+ let(:not_null) { true }
+ let(:partition_key) { false }
+ let(:db_result) do
+ {
+ 'table_name' => 'projects',
+ 'column_name' => column_name,
+ 'data_type' => 'character varying',
+ 'column_default' => column_default,
+ 'not_null' => not_null,
+ 'partition_key' => partition_key
+ }
+ end
+
+ describe '#name' do
+ it { expect(adapter.name).to eq('email') }
+ end
+
+ describe '#table_name' do
+ it { expect(adapter.table_name).to eq('projects') }
+ end
+
+ describe '#data_type' do
+ it { expect(adapter.data_type).to eq('character varying') }
+ end
+
+ describe '#default' do
+ context "when there's no default value in the column" do
+ let(:column_default) { nil }
+
+ it { expect(adapter.default).to be_nil }
+ end
+
+ context 'when the column name is id' do
+ let(:column_name) { 'id' }
+
+ it { expect(adapter.default).to be_nil }
+ end
+
+ context 'when the column default includes nextval' do
+ let(:column_default) { "nextval('my_seq'::regclass)" }
+
+ it { expect(adapter.default).to be_nil }
+ end
+
+ it { expect(adapter.default).to eq("DEFAULT 'no-reply@gitlab.com'::character varying") }
+ end
+
+ describe '#nullable' do
+ context 'when column is not null' do
+ it { expect(adapter.nullable).to eq('NOT NULL') }
+ end
+
+ context 'when column is nullable' do
+ let(:not_null) { false }
+
+ it { expect(adapter.nullable).to be_nil }
+ end
+ end
+
+ describe '#partition_key?' do
+ it { expect(adapter.partition_key?).to be(false) }
+ end
+end
diff --git a/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/adapters/column_structure_sql_adapter_spec.rb b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/adapters/column_structure_sql_adapter_spec.rb
new file mode 100644
index 00000000000..ae0d635e8ca
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/adapters/column_structure_sql_adapter_spec.rb
@@ -0,0 +1,78 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Schema::Validation::Adapters::ColumnStructureSqlAdapter, feature_category: :database do
+ subject(:adapter) { described_class.new(table_name, column_def, partition_stmt) }
+
+ let(:table_name) { 'test_table' }
+ let(:file_path) { 'spec/fixtures/structure.sql' }
+ let(:table_stmts) { PgQuery.parse(File.read(file_path)).tree.stmts.filter_map { |s| s.stmt.create_stmt } }
+ let(:table) { table_stmts.find { |table| table.relation.relname == table_name } }
+ let(:partition_stmt) { table.partspec }
+ let(:column_stmts) { table.table_elts }
+ let(:column_def) { column_stmts.find { |col| col.column_def.colname == column_name }.column_def }
+
+ where(:column_name, :data_type, :default_value, :nullable, :partition_key) do
+ [
+ ['id', 'bigint', nil, 'NOT NULL', false],
+ ['integer_column', 'integer', nil, nil, false],
+ ['integer_with_default_column', 'integer', 'DEFAULT 1', nil, false],
+ ['smallint_with_default_column', 'smallint', 'DEFAULT 0', 'NOT NULL', false],
+ ['double_precision_with_default_column', 'double precision', 'DEFAULT 1.0', nil, false],
+ ['numeric_with_default_column', 'numeric', 'DEFAULT 1.0', 'NOT NULL', false],
+ ['boolean_with_default_colum', 'boolean', 'DEFAULT true', 'NOT NULL', false],
+ ['varying_with_default_column', 'character varying', "DEFAULT 'DEFAULT'::character varying", 'NOT NULL', false],
+ ['varying_with_limit_and_default_column', 'character varying(255)', "DEFAULT 'DEFAULT'::character varying",
+ nil, false],
+ ['text_with_default_column', 'text', "DEFAULT ''::text", 'NOT NULL', false],
+ ['array_with_default_column', 'character varying(255)[]', "DEFAULT '{one,two}'::character varying[]",
+ 'NOT NULL', false],
+ ['jsonb_with_default_column', 'jsonb', "DEFAULT '[]'::jsonb", 'NOT NULL', false],
+ ['timestamptz_with_default_column', 'timestamp(6) with time zone', 'DEFAULT now()', nil, false],
+ ['timestamp_with_default_column', 'timestamp(6) without time zone',
+ "DEFAULT '2022-01-23 00:00:00+00'::timestamp without time zone", 'NOT NULL', false],
+ ['date_with_default_column', 'date', 'DEFAULT 2023-04-05', nil, false],
+ ['inet_with_default_column', 'inet', "DEFAULT '0.0.0.0'::inet", 'NOT NULL', false],
+ ['macaddr_with_default_column', 'macaddr', "DEFAULT '00-00-00-00-00-000'::macaddr", 'NOT NULL', false],
+ ['uuid_with_default_column', 'uuid', "DEFAULT '00000000-0000-0000-0000-000000000000'::uuid", 'NOT NULL', false],
+ ['partition_key', 'bigint', 'DEFAULT 1', 'NOT NULL', true],
+ ['created_at', 'timestamp with time zone', 'DEFAULT now()', 'NOT NULL', true]
+ ]
+ end
+
+ with_them do
+ describe '#name' do
+ it { expect(adapter.name).to eq(column_name) }
+ end
+
+ describe '#table_name' do
+ it { expect(adapter.table_name).to eq(table_name) }
+ end
+
+ describe '#data_type' do
+ it { expect(adapter.data_type).to eq(data_type) }
+ end
+
+ describe '#nullable' do
+ it { expect(adapter.nullable).to eq(nullable) }
+ end
+
+ describe '#default' do
+ it { expect(adapter.default).to eq(default_value) }
+ end
+
+ describe '#partition_key?' do
+ it { expect(adapter.partition_key?).to eq(partition_key) }
+ end
+ end
+
+ context 'when the data type is not mapped' do
+ let(:column_name) { 'unmapped_column_type' }
+ let(:error_class) { Gitlab::Schema::Validation::Adapters::UndefinedPGType }
+
+ describe '#data_type' do
+ it { expect { adapter.data_type }.to raise_error(error_class) }
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/adapters/foreign_key_database_adapter_spec.rb b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/adapters/foreign_key_database_adapter_spec.rb
new file mode 100644
index 00000000000..52689c0f0ec
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/adapters/foreign_key_database_adapter_spec.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Schema::Validation::Adapters::ForeignKeyDatabaseAdapter, feature_category: :database do
+ subject(:adapter) { described_class.new(query_result) }
+
+ let(:query_result) do
+ {
+ 'schema' => 'public',
+ 'foreign_key_name' => 'fk_2e88fb7ce9',
+ 'table_name' => 'members',
+ 'foreign_key_definition' => 'FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE'
+ }
+ end
+
+ describe '#name' do
+ it { expect(adapter.name).to eq('public.fk_2e88fb7ce9') }
+ end
+
+ describe '#table_name' do
+ it { expect(adapter.table_name).to eq('members') }
+ end
+
+ describe '#statement' do
+ it { expect(adapter.statement).to eq('FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE') }
+ end
+end
diff --git a/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/adapters/foreign_key_structure_sql_adapter_spec.rb b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/adapters/foreign_key_structure_sql_adapter_spec.rb
new file mode 100644
index 00000000000..001786b9fbe
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/adapters/foreign_key_structure_sql_adapter_spec.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Schema::Validation::Adapters::ForeignKeyStructureSqlAdapter, feature_category: :database do
+ subject(:adapter) { described_class.new(stmt) }
+
+ let(:stmt) { PgQuery.parse(sql).tree.stmts.first.stmt.alter_table_stmt }
+
+ where(:sql, :name, :table_name, :statement) do
+ [
+ [
+ 'ALTER TABLE ONLY public.issues ADD CONSTRAINT fk_05f1e72feb FOREIGN KEY (author_id) REFERENCES users (id) ' \
+ 'ON DELETE SET NULL',
+ 'public.fk_05f1e72feb',
+ 'issues',
+ 'FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE SET NULL'
+ ],
+ [
+ 'ALTER TABLE public.import_failures ADD CONSTRAINT fk_9a9b9ba21c FOREIGN KEY (user_id) REFERENCES users(id) ' \
+ 'ON DELETE CASCADE',
+ 'public.fk_9a9b9ba21c',
+ 'import_failures',
+ 'FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE'
+ ]
+ ]
+ end
+
+ with_them do
+ describe '#name' do
+ it { expect(adapter.name).to eq(name) }
+ end
+
+ describe '#table_name' do
+ it { expect(adapter.table_name).to eq(table_name) }
+ end
+
+ describe '#statement' do
+ it { expect(adapter.statement).to eq(statement) }
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/inconsistency_spec.rb b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/inconsistency_spec.rb
new file mode 100644
index 00000000000..268bb4556e3
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/inconsistency_spec.rb
@@ -0,0 +1,96 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Schema::Validation::Inconsistency do
+ let(:validator) { Gitlab::Schema::Validation::Validators::DifferentDefinitionIndexes }
+
+ let(:database_statement) { 'CREATE INDEX index_name ON public.achievements USING btree (namespace_id)' }
+ let(:structure_sql_statement) { 'CREATE INDEX index_name ON public.achievements USING btree (id)' }
+
+ let(:structure_stmt) { PgQuery.parse(structure_sql_statement).tree.stmts.first.stmt.index_stmt }
+ let(:database_stmt) { PgQuery.parse(database_statement).tree.stmts.first.stmt.index_stmt }
+
+ let(:structure_sql_object) { Gitlab::Schema::Validation::SchemaObjects::Index.new(structure_stmt) }
+ let(:database_object) { Gitlab::Schema::Validation::SchemaObjects::Index.new(database_stmt) }
+
+ subject(:inconsistency) { described_class.new(validator, structure_sql_object, database_object) }
+
+ describe '#object_name' do
+ it 'returns the index name' do
+ expect(inconsistency.object_name).to eq('index_name')
+ end
+ end
+
+ describe '#diff' do
+ it 'returns a diff between the structure.sql and the database' do
+ expect(inconsistency.diff).to be_a(Diffy::Diff)
+ expect(inconsistency.diff.string1).to eq("#{structure_sql_statement}\n")
+ expect(inconsistency.diff.string2).to eq("#{database_statement}\n")
+ end
+ end
+
+ describe '#error_message' do
+ it 'returns the error message' do
+ stub_const "#{validator}::ERROR_MESSAGE", 'error message %s'
+
+ expect(inconsistency.error_message).to eq('error message index_name')
+ end
+ end
+
+ describe '#type' do
+ it 'returns the type of the validator' do
+ expect(inconsistency.type).to eq('Gitlab::Schema::Validation::Validators::DifferentDefinitionIndexes')
+ end
+ end
+
+ describe '#table_name' do
+ it 'returns the table name' do
+ expect(inconsistency.table_name).to eq('achievements')
+ end
+ end
+
+ describe '#object_type' do
+ it 'returns the structure sql object type' do
+ expect(inconsistency.object_type).to eq('Index')
+ end
+
+ context 'when the structure sql object is not available' do
+ subject(:inconsistency) { described_class.new(validator, nil, database_object) }
+
+ it 'returns the database object type' do
+ expect(inconsistency.object_type).to eq('Index')
+ end
+ end
+ end
+
+ describe '#structure_sql_statement' do
+ it 'returns structure sql statement' do
+ expect(inconsistency.structure_sql_statement).to eq("#{structure_sql_statement}\n")
+ end
+ end
+
+ describe '#database_statement' do
+ it 'returns database statement' do
+ expect(inconsistency.database_statement).to eq("#{database_statement}\n")
+ end
+ end
+
+ describe '#display' do
+ let(:expected_output) do
+ <<~MSG
+ ------------------------------------------------------
+ The index_name index has a different statement between structure.sql and database
+ Diff:
+ \e[31m-CREATE INDEX index_name ON public.achievements USING btree (id)\e[0m
+ \e[32m+CREATE INDEX index_name ON public.achievements USING btree (namespace_id)\e[0m
+
+ ------------------------------------------------------
+ MSG
+ end
+
+ it 'prints the inconsistency message' do
+ expect(inconsistency.display).to eql(expected_output)
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/schema_objects/column_spec.rb b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/schema_objects/column_spec.rb
new file mode 100644
index 00000000000..c002903e765
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/schema_objects/column_spec.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Schema::Validation::SchemaObjects::Column, feature_category: :database do
+ subject(:column) { described_class.new(adapter) }
+
+ let(:database_adapter) { 'Gitlab::Schema::Validation::Adapters::ColumnDatabaseAdapter' }
+ let(:adapter) do
+ instance_double(database_adapter, name: 'id', table_name: 'projects',
+ data_type: 'bigint', default: nil, nullable: 'NOT NULL')
+ end
+
+ describe '#name' do
+ it { expect(column.name).to eq('id') }
+ end
+
+ describe '#table_name' do
+ it { expect(column.table_name).to eq('projects') }
+ end
+
+ describe '#statement' do
+ it { expect(column.statement).to eq('id bigint NOT NULL') }
+ end
+end
diff --git a/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/schema_objects/foreign_key_spec.rb b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/schema_objects/foreign_key_spec.rb
new file mode 100644
index 00000000000..bfe337b6e7c
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/schema_objects/foreign_key_spec.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Schema::Validation::SchemaObjects::ForeignKey, feature_category: :database do
+ subject(:foreign_key) { described_class.new(adapter) }
+
+ let(:database_adapter) { 'Gitlab::Schema::Validation::Adapters::ForeignKeyDatabaseAdapter' }
+ let(:adapter) do
+ instance_double(database_adapter, name: 'public.fk_1d37cddf91', table_name: 'vulnerabilities',
+ statement: 'FOREIGN KEY (epic_id) REFERENCES epics(id) ON DELETE SET NULL')
+ end
+
+ describe '#name' do
+ it { expect(foreign_key.name).to eq('public.fk_1d37cddf91') }
+ end
+
+ describe '#table_name' do
+ it { expect(foreign_key.table_name).to eq('vulnerabilities') }
+ end
+
+ describe '#statement' do
+ it { expect(foreign_key.statement).to eq('FOREIGN KEY (epic_id) REFERENCES epics(id) ON DELETE SET NULL') }
+ end
+end
diff --git a/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/schema_objects/index_spec.rb b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/schema_objects/index_spec.rb
new file mode 100644
index 00000000000..dfef440d99e
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/schema_objects/index_spec.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Schema::Validation::SchemaObjects::Index, feature_category: :database do
+ let(:statement) { 'CREATE INDEX index_name ON public.achievements USING btree (namespace_id)' }
+ let(:name) { 'index_name' }
+ let(:table_name) { 'achievements' }
+
+ include_examples 'schema objects assertions for', 'index_stmt'
+end
diff --git a/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/schema_objects/table_spec.rb b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/schema_objects/table_spec.rb
new file mode 100644
index 00000000000..87555c88edf
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/schema_objects/table_spec.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Schema::Validation::SchemaObjects::Table, feature_category: :database do
+ subject(:table) { described_class.new(name, columns) }
+
+ let(:name) { 'my_table' }
+ let(:column_class) { 'Gitlab::Schema::Validation::SchemaObjects::Column' }
+ let(:columns) do
+ [
+ instance_double(column_class, name: 'id', statement: 'id bigint NOT NULL', partition_key?: false),
+ instance_double(column_class, name: 'col', statement: 'col text', partition_key?: false),
+ instance_double(column_class, name: 'partition', statement: 'partition integer DEFAULT 1', partition_key?: true)
+ ]
+ end
+
+ describe '#name' do
+ it { expect(table.name).to eq('my_table') }
+ end
+
+ describe '#table_name' do
+ it { expect(table.table_name).to eq('my_table') }
+ end
+
+ describe '#statement' do
+ it { expect(table.statement).to eq('CREATE TABLE my_table (id bigint NOT NULL, col text)') }
+
+ it 'ignores the partition column' do
+ expect(table.statement).not_to include('partition integer DEFAULT 1')
+ end
+ end
+
+ describe '#fetch_column_by_name' do
+ it { expect(table.fetch_column_by_name('col')).not_to be_nil }
+
+ it { expect(table.fetch_column_by_name('invalid')).to be_nil }
+ end
+
+ describe '#column_exists?' do
+ it { expect(table.column_exists?('col')).to be(true) }
+
+ it { expect(table.column_exists?('invalid')).to be(false) }
+ end
+end
diff --git a/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/schema_objects/trigger_spec.rb b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/schema_objects/trigger_spec.rb
new file mode 100644
index 00000000000..b6d0ba38ebb
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/schema_objects/trigger_spec.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Schema::Validation::SchemaObjects::Trigger, feature_category: :database do
+ let(:statement) { 'CREATE TRIGGER my_trigger BEFORE INSERT ON todos FOR EACH ROW EXECUTE FUNCTION trigger()' }
+ let(:name) { 'my_trigger' }
+ let(:table_name) { 'todos' }
+
+ include_examples 'schema objects assertions for', 'create_trig_stmt'
+end
diff --git a/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/sources/structure_sql_spec.rb b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/sources/structure_sql_spec.rb
new file mode 100644
index 00000000000..7d4a23b1619
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/sources/structure_sql_spec.rb
@@ -0,0 +1,66 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.shared_examples 'structure sql schema assertions for' do |object_exists_method, all_objects_method|
+ subject(:structure_sql) { described_class.new(structure_file_path, schema_name) }
+
+ let(:structure_file_path) { 'spec/fixtures/structure.sql' }
+ let(:schema_name) { 'public' }
+
+ describe "##{object_exists_method}" do
+ it 'returns true when schema object exists' do
+ expect(structure_sql.public_send(object_exists_method, valid_schema_object_name)).to be_truthy
+ end
+
+ it 'returns false when schema object does not exists' do
+ expect(structure_sql.public_send(object_exists_method, 'invalid-object-name')).to be_falsey
+ end
+ end
+
+ describe "##{all_objects_method}" do
+ it 'returns all the schema objects' do
+ schema_objects = structure_sql.public_send(all_objects_method)
+
+ expect(schema_objects).to all(be_a(schema_object))
+ expect(schema_objects.map(&:name)).to eq(expected_objects)
+ end
+ end
+end
+
+RSpec.describe Gitlab::Schema::Validation::Sources::StructureSql, feature_category: :database do
+ let(:structure_file_path) { 'spec/fixtures/structure.sql' }
+ let(:schema_name) { 'public' }
+
+ subject(:structure_sql) { described_class.new(structure_file_path, schema_name) }
+
+ context 'when having indexes' do
+ let(:schema_object) { Gitlab::Schema::Validation::SchemaObjects::Index }
+ let(:valid_schema_object_name) { 'index' }
+ let(:expected_objects) do
+ %w[missing_index wrong_index index index_namespaces_public_groups_name_id
+ index_on_deploy_keys_id_and_type_and_public index_users_on_public_email_excluding_null_and_empty]
+ end
+
+ include_examples 'structure sql schema assertions for', 'index_exists?', 'indexes'
+ end
+
+ context 'when having triggers' do
+ let(:schema_object) { Gitlab::Schema::Validation::SchemaObjects::Trigger }
+ let(:valid_schema_object_name) { 'trigger' }
+ let(:expected_objects) { %w[trigger wrong_trigger missing_trigger_1 projects_loose_fk_trigger] }
+
+ include_examples 'structure sql schema assertions for', 'trigger_exists?', 'triggers'
+ end
+
+ context 'when having tables' do
+ let(:schema_object) { Gitlab::Schema::Validation::SchemaObjects::Table }
+ let(:valid_schema_object_name) { 'test_table' }
+ let(:expected_objects) do
+ %w[test_table ci_project_mirrors wrong_table extra_table_columns missing_table missing_table_columns
+ operations_user_lists]
+ end
+
+ include_examples 'structure sql schema assertions for', 'table_exists?', 'tables'
+ end
+end
diff --git a/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/base_spec.rb b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/base_spec.rb
new file mode 100644
index 00000000000..50be1f1b373
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/base_spec.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Schema::Validation::Validators::Base, feature_category: :database do
+ describe '#execute' do
+ let(:structure_sql) { instance_double(Gitlab::Schema::Validation::Sources::StructureSql) }
+ let(:database) { instance_double(Gitlab::Schema::Validation::Sources::Database) }
+
+ subject(:inconsistencies) { described_class.new(structure_sql, database).execute }
+
+ describe '.all_validators' do
+ subject(:all_validators) { described_class.all_validators }
+
+ it 'returns an array of all validators' do
+ expect(all_validators).to eq([
+ Gitlab::Schema::Validation::Validators::ExtraTables,
+ Gitlab::Schema::Validation::Validators::ExtraTableColumns,
+ Gitlab::Schema::Validation::Validators::ExtraIndexes,
+ Gitlab::Schema::Validation::Validators::ExtraTriggers,
+ Gitlab::Schema::Validation::Validators::ExtraForeignKeys,
+ Gitlab::Schema::Validation::Validators::MissingTables,
+ Gitlab::Schema::Validation::Validators::MissingTableColumns,
+ Gitlab::Schema::Validation::Validators::MissingIndexes,
+ Gitlab::Schema::Validation::Validators::MissingTriggers,
+ Gitlab::Schema::Validation::Validators::MissingForeignKeys,
+ Gitlab::Schema::Validation::Validators::DifferentDefinitionTables,
+ Gitlab::Schema::Validation::Validators::DifferentDefinitionIndexes,
+ Gitlab::Schema::Validation::Validators::DifferentDefinitionTriggers,
+ Gitlab::Schema::Validation::Validators::DifferentDefinitionForeignKeys
+ ])
+ end
+ end
+
+ it 'raises an exception' do
+ expect { inconsistencies }.to raise_error(NoMethodError)
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/different_definition_indexes_spec.rb b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/different_definition_indexes_spec.rb
new file mode 100644
index 00000000000..c1795a56063
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/different_definition_indexes_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Schema::Validation::Validators::DifferentDefinitionIndexes do
+ include_examples 'index validators', described_class, ['wrong_index']
+end
diff --git a/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/different_definition_tables_spec.rb b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/different_definition_tables_spec.rb
new file mode 100644
index 00000000000..d1c9169a59a
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/different_definition_tables_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Schema::Validation::Validators::DifferentDefinitionTables, feature_category: :database do
+ include_examples 'table validators', described_class, ['wrong_table']
+end
diff --git a/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/different_definition_triggers_spec.rb b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/different_definition_triggers_spec.rb
new file mode 100644
index 00000000000..a2597e3e55e
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/different_definition_triggers_spec.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Schema::Validation::Validators::DifferentDefinitionTriggers,
+ feature_category: :database do
+ include_examples 'trigger validators', described_class, ['wrong_trigger']
+end
diff --git a/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/extra_foreign_keys_spec.rb b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/extra_foreign_keys_spec.rb
new file mode 100644
index 00000000000..499f2578fd2
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/extra_foreign_keys_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Schema::Validation::Validators::ExtraForeignKeys, feature_category: :database do
+ include_examples 'foreign key validators', described_class, ['public.extra_fk']
+end
diff --git a/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/extra_indexes_spec.rb b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/extra_indexes_spec.rb
new file mode 100644
index 00000000000..01498444ba4
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/extra_indexes_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Schema::Validation::Validators::ExtraIndexes, feature_category: :database do
+ include_examples 'index validators', described_class, ['extra_index']
+end
diff --git a/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/extra_table_columns_spec.rb b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/extra_table_columns_spec.rb
new file mode 100644
index 00000000000..f5d06e9941a
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/extra_table_columns_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Schema::Validation::Validators::ExtraTableColumns, feature_category: :database do
+ include_examples 'table validators', described_class, ['extra_table_columns']
+end
diff --git a/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/extra_tables_spec.rb b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/extra_tables_spec.rb
new file mode 100644
index 00000000000..15c52fe4719
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/extra_tables_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Schema::Validation::Validators::ExtraTables, feature_category: :database do
+ include_examples 'table validators', described_class, ['extra_table']
+end
diff --git a/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/extra_triggers_spec.rb b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/extra_triggers_spec.rb
new file mode 100644
index 00000000000..97126aebf05
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/extra_triggers_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Schema::Validation::Validators::ExtraTriggers, feature_category: :database do
+ include_examples 'trigger validators', described_class, ['extra_trigger']
+end
diff --git a/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/missing_foreign_keys_spec.rb b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/missing_foreign_keys_spec.rb
new file mode 100644
index 00000000000..6682c3f623d
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/missing_foreign_keys_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Schema::Validation::Validators::MissingForeignKeys, feature_category: :database do
+ include_examples 'foreign key validators', described_class, %w[public.fk_rails_536b96bff1 public.missing_fk]
+end
diff --git a/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/missing_indexes_spec.rb b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/missing_indexes_spec.rb
new file mode 100644
index 00000000000..c1cb9a2416b
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/missing_indexes_spec.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Schema::Validation::Validators::MissingIndexes, feature_category: :database do
+ missing_indexes = %w[
+ missing_index
+ index_namespaces_public_groups_name_id
+ index_on_deploy_keys_id_and_type_and_public
+ index_users_on_public_email_excluding_null_and_empty
+ ]
+
+ include_examples 'index validators', described_class, missing_indexes
+end
diff --git a/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/missing_table_columns_spec.rb b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/missing_table_columns_spec.rb
new file mode 100644
index 00000000000..3866bdce071
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/missing_table_columns_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Schema::Validation::Validators::MissingTableColumns, feature_category: :database do
+ include_examples 'table validators', described_class, ['missing_table_columns']
+end
diff --git a/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/missing_tables_spec.rb b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/missing_tables_spec.rb
new file mode 100644
index 00000000000..8a73d67ab7d
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/missing_tables_spec.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Schema::Validation::Validators::MissingTables, feature_category: :database do
+ missing_tables = %w[ci_project_mirrors missing_table operations_user_lists test_table]
+
+ include_examples 'table validators', described_class, missing_tables
+end
diff --git a/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/missing_triggers_spec.rb b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/missing_triggers_spec.rb
new file mode 100644
index 00000000000..82b9b034503
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/lib/gitlab/schema/validation/validators/missing_triggers_spec.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Schema::Validation::Validators::MissingTriggers, feature_category: :database do
+ missing_triggers = %w[missing_trigger_1 projects_loose_fk_trigger]
+
+ include_examples 'trigger validators', described_class, missing_triggers
+end
diff --git a/gems/gitlab-schema-validation/spec/spec_helper.rb b/gems/gitlab-schema-validation/spec/spec_helper.rb
new file mode 100644
index 00000000000..c11c5021e3b
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/spec_helper.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+require "gitlab/schema/validation"
+require 'rspec-parameterized'
+
+RSpec.configure do |config|
+ # Enable flags like --only-failures and --next-failure
+ config.example_status_persistence_file_path = ".rspec_status"
+
+ # Disable RSpec exposing methods globally on `Module` and `main`
+ config.disable_monkey_patching!
+
+ Dir['./spec/support/**/*.rb'].each { |f| require f }
+
+ config.expect_with :rspec do |c|
+ c.syntax = :expect
+ end
+end
diff --git a/gems/gitlab-schema-validation/spec/support/shared_examples/foreign_key_validators_shared_examples.rb b/gems/gitlab-schema-validation/spec/support/shared_examples/foreign_key_validators_shared_examples.rb
new file mode 100644
index 00000000000..1f33c8bd760
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/support/shared_examples/foreign_key_validators_shared_examples.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.shared_examples 'foreign key validators' do |validator, expected_result|
+ subject(:result) { validator.new(structure_file, database).execute }
+
+ let(:structure_file_path) { 'spec/fixtures/structure.sql' }
+ let(:structure_file) { Gitlab::Schema::Validation::Sources::StructureSql.new(structure_file_path, schema) }
+ let(:inconsistency_type) { validator.to_s }
+ let(:database_name) { 'main' }
+ let(:schema) { 'public' }
+ # rubocop:disable RSpec/VerifiedDoubleReference
+ let(:connection) { instance_double('connection', exec_query: database_query, current_schema: 'public') }
+ # rubocop:enable RSpec/VerifiedDoubleReference
+
+ let(:database) { Gitlab::Schema::Validation::Sources::Database.new(connection) }
+
+ let(:database_query) do
+ [
+ {
+ 'schema' => schema,
+ 'table_name' => 'web_hooks',
+ 'foreign_key_name' => 'web_hooks_project_id_fkey',
+ 'foreign_key_definition' => 'FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE'
+ },
+ {
+ 'schema' => schema,
+ 'table_name' => 'issues',
+ 'foreign_key_name' => 'wrong_definition_fk',
+ 'foreign_key_definition' => 'FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE CASCADE'
+ },
+ {
+ 'schema' => schema,
+ 'table_name' => 'projects',
+ 'foreign_key_name' => 'extra_fk',
+ 'foreign_key_definition' => 'FOREIGN KEY (creator_id) REFERENCES users(id) ON DELETE CASCADE'
+ }
+ ]
+ end
+
+ it 'returns trigger inconsistencies' do
+ expect(result.map(&:object_name)).to match_array(expected_result)
+ expect(result.map(&:type)).to all(eql inconsistency_type)
+ end
+end
diff --git a/gems/gitlab-schema-validation/spec/support/shared_examples/index_validators_shared_examples.rb b/gems/gitlab-schema-validation/spec/support/shared_examples/index_validators_shared_examples.rb
new file mode 100644
index 00000000000..cc20c0dc765
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/support/shared_examples/index_validators_shared_examples.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.shared_examples 'index validators' do |validator, expected_result|
+ let(:structure_file_path) { 'spec/fixtures/structure.sql' }
+ let(:database_indexes) do
+ [
+ ['wrong_index', 'CREATE UNIQUE INDEX wrong_index ON public.table_name (column_name)'],
+ ['extra_index', 'CREATE INDEX extra_index ON public.table_name (column_name)'],
+ ['index', 'CREATE UNIQUE INDEX "index" ON public.achievements USING btree (namespace_id, lower(name))']
+ ]
+ end
+
+ let(:inconsistency_type) { validator.name }
+
+ # rubocop:disable RSpec/VerifiedDoubleReference
+ let(:connection) { instance_double('connection', select_rows: database_indexes, current_schema: 'public') }
+ # rubocop:enable RSpec/VerifiedDoubleReference
+
+ let(:schema) { 'public' }
+
+ let(:database) { Gitlab::Schema::Validation::Sources::Database.new(connection) }
+ let(:structure_file) { Gitlab::Schema::Validation::Sources::StructureSql.new(structure_file_path, schema) }
+
+ subject(:result) { validator.new(structure_file, database).execute }
+
+ it 'returns index inconsistencies' do
+ expect(result.map(&:object_name)).to match_array(expected_result)
+ expect(result.map(&:type)).to all(eql inconsistency_type)
+ end
+end
diff --git a/gems/gitlab-schema-validation/spec/support/shared_examples/schema_objects_shared_examples.rb b/gems/gitlab-schema-validation/spec/support/shared_examples/schema_objects_shared_examples.rb
new file mode 100644
index 00000000000..994b30b0941
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/support/shared_examples/schema_objects_shared_examples.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.shared_examples 'schema objects assertions for' do |stmt_name|
+ let(:stmt) { PgQuery.parse(statement).tree.stmts.first.stmt }
+ let(:schema_object) { described_class.new(stmt.public_send(stmt_name)) }
+
+ describe '#name' do
+ it 'returns schema object name' do
+ expect(schema_object.name).to eq(name)
+ end
+ end
+
+ describe '#statement' do
+ it 'returns schema object statement' do
+ expect(schema_object.statement).to eq(statement)
+ end
+ end
+
+ describe '#table_name' do
+ it 'returns schema object table_name' do
+ expect(schema_object.table_name).to eq(table_name)
+ end
+ end
+end
diff --git a/gems/gitlab-schema-validation/spec/support/shared_examples/table_validators_shared_examples.rb b/gems/gitlab-schema-validation/spec/support/shared_examples/table_validators_shared_examples.rb
new file mode 100644
index 00000000000..d2a51a9b202
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/support/shared_examples/table_validators_shared_examples.rb
@@ -0,0 +1,81 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.shared_examples "table validators" do |validator, expected_result|
+ subject(:result) { validator.new(structure_file, database).execute }
+
+ let(:structure_file_path) { 'spec/fixtures/structure.sql' }
+ let(:inconsistency_type) { validator.to_s }
+ # rubocop:disable RSpec/VerifiedDoubleReference
+ let(:connection) { instance_double('connection', exec_query: database_tables, current_schema: 'public') }
+ # rubocop:enable RSpec/VerifiedDoubleReference
+ let(:schema) { 'public' }
+ let(:database) { Gitlab::Schema::Validation::Sources::Database.new(connection) }
+ let(:structure_file) { Gitlab::Schema::Validation::Sources::StructureSql.new(structure_file_path, schema) }
+ let(:database_tables) do
+ [
+ {
+ 'table_name' => 'wrong_table',
+ 'column_name' => 'id',
+ 'not_null' => true,
+ 'data_type' => 'integer',
+ 'column_default' => "nextval('audit_events_id_seq'::regclass)"
+ },
+ {
+ 'table_name' => 'wrong_table',
+ 'column_name' => 'description',
+ 'not_null' => true,
+ 'data_type' => 'character varying',
+ 'column_default' => nil
+ },
+ {
+ 'table_name' => 'extra_table',
+ 'column_name' => 'id',
+ 'not_null' => true,
+ 'data_type' => 'integer',
+ 'column_default' => "nextval('audit_events_id_seq'::regclass)"
+ },
+ {
+ 'table_name' => 'extra_table',
+ 'column_name' => 'email',
+ 'not_null' => true,
+ 'data_type' => 'character varying',
+ 'column_default' => nil
+ },
+ {
+ 'table_name' => 'extra_table_columns',
+ 'column_name' => 'id',
+ 'not_null' => true,
+ 'data_type' => 'bigint',
+ 'column_default' => "nextval('audit_events_id_seq'::regclass)"
+ },
+ {
+ 'table_name' => 'extra_table_columns',
+ 'column_name' => 'name',
+ 'not_null' => true,
+ 'data_type' => 'character varying(255)',
+ 'column_default' => nil
+ },
+ {
+ 'table_name' => 'extra_table_columns',
+ 'column_name' => 'extra_column',
+ 'not_null' => true,
+ 'data_type' => 'character varying(255)',
+ 'column_default' => nil
+ },
+ {
+ 'table_name' => 'missing_table_columns',
+ 'column_name' => 'id',
+ 'not_null' => true,
+ 'data_type' => 'bigint',
+ 'column_default' => 'NOT NULL'
+ }
+ ]
+ end
+
+ it 'returns table inconsistencies' do
+ expect(result.map(&:object_name)).to match_array(expected_result)
+ expect(result.map(&:type)).to all(eql inconsistency_type)
+ end
+end
diff --git a/gems/gitlab-schema-validation/spec/support/shared_examples/trigger_validators_shared_examples.rb b/gems/gitlab-schema-validation/spec/support/shared_examples/trigger_validators_shared_examples.rb
new file mode 100644
index 00000000000..45ed87082bb
--- /dev/null
+++ b/gems/gitlab-schema-validation/spec/support/shared_examples/trigger_validators_shared_examples.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.shared_examples 'trigger validators' do |validator, expected_result|
+ subject(:result) { validator.new(structure_file, database).execute }
+
+ let(:structure_file_path) { 'spec/fixtures/structure.sql' }
+ let(:structure_file) { Gitlab::Schema::Validation::Sources::StructureSql.new(structure_file_path, schema) }
+ let(:inconsistency_type) { validator.to_s }
+ let(:database_name) { 'main' }
+ let(:schema) { 'public' }
+ let(:database) { Gitlab::Schema::Validation::Sources::Database.new(connection) }
+
+ # rubocop:disable RSpec/VerifiedDoubleReference
+ let(:connection) { instance_double('connection', select_rows: database_triggers, current_schema: 'public') }
+ # rubocop:enable RSpec/VerifiedDoubleReference
+
+ let(:database_triggers) do
+ [
+ ['trigger', 'CREATE TRIGGER trigger AFTER INSERT ON public.t1 FOR EACH ROW EXECUTE FUNCTION t1()'],
+ ['wrong_trigger', 'CREATE TRIGGER wrong_trigger BEFORE UPDATE ON public.t2 FOR EACH ROW EXECUTE FUNCTION t2()'],
+ ['extra_trigger', 'CREATE TRIGGER extra_trigger BEFORE INSERT ON public.t4 FOR EACH ROW EXECUTE FUNCTION t4()']
+ ]
+ end
+
+ it 'returns trigger inconsistencies' do
+ expect(result.map(&:object_name)).to match_array(expected_result)
+ expect(result.map(&:type)).to all(eql inconsistency_type)
+ end
+end
diff --git a/gems/gitlab-utils/.gitignore b/gems/gitlab-utils/.gitignore
new file mode 100644
index 00000000000..b04a8c840df
--- /dev/null
+++ b/gems/gitlab-utils/.gitignore
@@ -0,0 +1,11 @@
+/.bundle/
+/.yardoc
+/_yardoc/
+/coverage/
+/doc/
+/pkg/
+/spec/reports/
+/tmp/
+
+# rspec failure tracking
+.rspec_status
diff --git a/gems/gitlab-utils/.gitlab-ci.yml b/gems/gitlab-utils/.gitlab-ci.yml
new file mode 100644
index 00000000000..a9e984d4785
--- /dev/null
+++ b/gems/gitlab-utils/.gitlab-ci.yml
@@ -0,0 +1,4 @@
+include:
+ - local: gems/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "gitlab-utils"
diff --git a/gems/gitlab-utils/.rspec b/gems/gitlab-utils/.rspec
new file mode 100644
index 00000000000..34c5164d9b5
--- /dev/null
+++ b/gems/gitlab-utils/.rspec
@@ -0,0 +1,3 @@
+--format documentation
+--color
+--require spec_helper
diff --git a/gems/gitlab-utils/.rubocop.yml b/gems/gitlab-utils/.rubocop.yml
new file mode 100644
index 00000000000..eeafd850c9b
--- /dev/null
+++ b/gems/gitlab-utils/.rubocop.yml
@@ -0,0 +1,27 @@
+inherit_from:
+ - ../config/rubocop.yml
+
+RSpec/InstanceVariable:
+ Exclude:
+ - spec/**/*.rb
+
+Lint/BinaryOperatorWithIdenticalOperands:
+ Exclude:
+ - spec/**/*.rb
+
+# We use EnforcedStyle of comparison here due to it being better
+# performing code as seen in https://gitlab.com/gitlab-org/gitlab/-/merge_requests/36221#note_375659681
+Style/NumericPredicate:
+ EnforcedStyle: comparison
+
+# FIXME: When enabled, there's a spec failure in ee/spec/requests/api/graphql/mutations/merge_requests/update_approval_rule_spec.rb:51,
+# due to the `default_value` of `remove_hidden_groups` set to `[]`, most probably instead of `false`, in ee/app/graphql/mutations/merge_requests/update_approval_rule.rb.
+# The problem is that `Object#=~` exists (even though it's deprecated), hence calling it on an `Array` doesn't blow up, but `Array#match?` doesn't exist.
+Performance/RegexpMatch:
+ Exclude:
+ - lib/gitlab/utils.rb
+
+Rails/OutputSafety:
+ Details: grace period
+ Exclude:
+ - 'lib/gitlab/utils.rb'
diff --git a/gems/gitlab-utils/Gemfile b/gems/gitlab-utils/Gemfile
new file mode 100644
index 00000000000..2c7228c874c
--- /dev/null
+++ b/gems/gitlab-utils/Gemfile
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+source "https://rubygems.org"
+
+# Specify your gem's dependencies in gitlab-utils.gemspec
+gemspec
+
+group :development, :test do
+ gem 'gitlab-rspec', path: '../gitlab-rspec'
+end
diff --git a/gems/gitlab-utils/Gemfile.lock b/gems/gitlab-utils/Gemfile.lock
new file mode 100644
index 00000000000..971d90ce146
--- /dev/null
+++ b/gems/gitlab-utils/Gemfile.lock
@@ -0,0 +1,199 @@
+PATH
+ remote: ../gitlab-rspec
+ specs:
+ gitlab-rspec (0.1.0)
+ activesupport (>= 6.1, < 7.1)
+ rspec (~> 3.0)
+
+PATH
+ remote: .
+ specs:
+ gitlab-utils (0.1.0)
+ actionview (>= 6.1.7.2)
+ activesupport (>= 6.1.7.2)
+ addressable (~> 2.8)
+ nokogiri (~> 1.15.2)
+ rake (~> 13.0)
+
+GEM
+ remote: https://rubygems.org/
+ specs:
+ actionpack (7.0.5)
+ actionview (= 7.0.5)
+ activesupport (= 7.0.5)
+ rack (~> 2.0, >= 2.2.4)
+ rack-test (>= 0.6.3)
+ rails-dom-testing (~> 2.0)
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
+ actionview (7.0.5)
+ activesupport (= 7.0.5)
+ builder (~> 3.1)
+ erubi (~> 1.4)
+ rails-dom-testing (~> 2.0)
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
+ activesupport (7.0.5)
+ concurrent-ruby (~> 1.0, >= 1.0.2)
+ i18n (>= 1.6, < 2)
+ minitest (>= 5.1)
+ tzinfo (~> 2.0)
+ addressable (2.8.1)
+ public_suffix (>= 2.0.2, < 6.0)
+ ast (2.4.2)
+ benchmark-malloc (0.2.0)
+ benchmark-perf (0.6.0)
+ benchmark-trend (0.4.0)
+ binding_of_caller (1.0.0)
+ debug_inspector (>= 0.0.1)
+ builder (3.2.4)
+ coderay (1.1.3)
+ concurrent-ruby (1.2.2)
+ crass (1.0.6)
+ debug_inspector (1.1.0)
+ diff-lcs (1.5.0)
+ erubi (1.12.0)
+ factory_bot (6.2.1)
+ activesupport (>= 5.0.0)
+ factory_bot_rails (6.2.0)
+ factory_bot (~> 6.2.0)
+ railties (>= 5.0.0)
+ gitlab-styles (10.1.0)
+ rubocop (~> 1.50.2)
+ rubocop-graphql (~> 0.18)
+ rubocop-performance (~> 1.15)
+ rubocop-rails (~> 2.17)
+ rubocop-rspec (~> 2.22)
+ i18n (1.14.1)
+ concurrent-ruby (~> 1.0)
+ json (2.6.3)
+ loofah (2.21.3)
+ crass (~> 1.0.2)
+ nokogiri (>= 1.12.0)
+ method_source (1.0.0)
+ mini_portile2 (2.8.2)
+ minitest (5.18.1)
+ nokogiri (1.15.2)
+ mini_portile2 (~> 2.8.2)
+ racc (~> 1.4)
+ parallel (1.23.0)
+ parser (3.2.2.3)
+ ast (~> 2.4.1)
+ racc
+ proc_to_ast (0.1.0)
+ coderay
+ parser
+ unparser
+ public_suffix (5.0.0)
+ racc (1.7.1)
+ rack (2.2.7)
+ rack-test (2.1.0)
+ rack (>= 1.3)
+ rails-dom-testing (2.0.3)
+ activesupport (>= 4.2.0)
+ nokogiri (>= 1.6)
+ rails-html-sanitizer (1.6.0)
+ loofah (~> 2.21)
+ nokogiri (~> 1.14)
+ railties (7.0.5)
+ actionpack (= 7.0.5)
+ activesupport (= 7.0.5)
+ method_source
+ rake (>= 12.2)
+ thor (~> 1.0)
+ zeitwerk (~> 2.5)
+ rainbow (3.1.1)
+ rake (13.0.6)
+ regexp_parser (2.8.1)
+ rexml (3.2.5)
+ rspec (3.12.0)
+ rspec-core (~> 3.12.0)
+ rspec-expectations (~> 3.12.0)
+ rspec-mocks (~> 3.12.0)
+ rspec-benchmark (0.6.0)
+ benchmark-malloc (~> 0.2)
+ benchmark-perf (~> 0.6)
+ benchmark-trend (~> 0.4)
+ rspec (>= 3.0)
+ rspec-core (3.12.0)
+ rspec-support (~> 3.12.0)
+ rspec-expectations (3.12.2)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.12.0)
+ rspec-mocks (3.12.3)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.12.0)
+ rspec-parameterized (1.0.0)
+ rspec-parameterized-core (< 2)
+ rspec-parameterized-table_syntax (< 2)
+ rspec-parameterized-core (1.0.0)
+ parser
+ proc_to_ast
+ rspec (>= 2.13, < 4)
+ unparser
+ rspec-parameterized-table_syntax (1.0.0)
+ binding_of_caller
+ rspec-parameterized-core (< 2)
+ rspec-rails (6.0.1)
+ actionpack (>= 6.1)
+ activesupport (>= 6.1)
+ railties (>= 6.1)
+ rspec-core (~> 3.11)
+ rspec-expectations (~> 3.11)
+ rspec-mocks (~> 3.11)
+ rspec-support (~> 3.11)
+ rspec-support (3.12.0)
+ rubocop (1.50.2)
+ json (~> 2.3)
+ parallel (~> 1.10)
+ parser (>= 3.2.0.0)
+ rainbow (>= 2.2.2, < 4.0)
+ regexp_parser (>= 1.8, < 3.0)
+ rexml (>= 3.2.5, < 4.0)
+ rubocop-ast (>= 1.28.0, < 2.0)
+ ruby-progressbar (~> 1.7)
+ unicode-display_width (>= 2.4.0, < 3.0)
+ rubocop-ast (1.29.0)
+ parser (>= 3.2.1.0)
+ rubocop-capybara (2.18.0)
+ rubocop (~> 1.41)
+ rubocop-factory_bot (2.23.1)
+ rubocop (~> 1.33)
+ rubocop-graphql (0.19.0)
+ rubocop (>= 0.87, < 2)
+ rubocop-performance (1.18.0)
+ rubocop (>= 1.7.0, < 2.0)
+ rubocop-ast (>= 0.4.0)
+ rubocop-rails (2.20.2)
+ activesupport (>= 4.2.0)
+ rack (>= 1.1)
+ rubocop (>= 1.33.0, < 2.0)
+ rubocop-rspec (2.22.0)
+ rubocop (~> 1.33)
+ rubocop-capybara (~> 2.17)
+ rubocop-factory_bot (~> 2.22)
+ ruby-progressbar (1.13.0)
+ thor (1.2.2)
+ tzinfo (2.0.6)
+ concurrent-ruby (~> 1.0)
+ unicode-display_width (2.4.2)
+ unparser (0.6.7)
+ diff-lcs (~> 1.3)
+ parser (>= 3.2.0)
+ zeitwerk (2.6.8)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ factory_bot_rails (~> 6.2.0)
+ gitlab-rspec!
+ gitlab-styles (~> 10.1.0)
+ gitlab-utils!
+ rspec (~> 3.12)
+ rspec-benchmark (~> 0.6.0)
+ rspec-parameterized (~> 1.0)
+ rspec-rails (~> 6.0.1)
+ rubocop (~> 1.50)
+ rubocop-rspec (~> 2.22)
+
+BUNDLED WITH
+ 2.4.4
diff --git a/gems/gitlab-utils/README.md b/gems/gitlab-utils/README.md
new file mode 100644
index 00000000000..f7c7d83888b
--- /dev/null
+++ b/gems/gitlab-utils/README.md
@@ -0,0 +1,8 @@
+# Gitlab::Utils
+
+This Gem contains all code that is not dependent on application code
+or business logic and provides a generic functions like:
+
+- safe parsing of YAML
+- version comparisions
+- `strong_memoize`
diff --git a/gems/gitlab-utils/Rakefile b/gems/gitlab-utils/Rakefile
new file mode 100644
index 00000000000..cca71754493
--- /dev/null
+++ b/gems/gitlab-utils/Rakefile
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+require "bundler/gem_tasks"
+require "rspec/core/rake_task"
+
+RSpec::Core::RakeTask.new(:spec)
+
+require "rubocop/rake_task"
+
+RuboCop::RakeTask.new
+
+task default: %i[spec rubocop]
diff --git a/gems/gitlab-utils/gitlab-utils.gemspec b/gems/gitlab-utils/gitlab-utils.gemspec
new file mode 100644
index 00000000000..d5f6deb7fe6
--- /dev/null
+++ b/gems/gitlab-utils/gitlab-utils.gemspec
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+require_relative "lib/gitlab/utils/version"
+
+Gem::Specification.new do |spec|
+ spec.name = "gitlab-utils"
+ spec.version = Gitlab::Utils::Version::VERSION
+ spec.authors = ["group::tenant scale"]
+ spec.email = ["engineering@gitlab.com"]
+
+ spec.summary = "GitLab common helper methods"
+ spec.description = "A set of useful helpers methods to perform various conversions and checks."
+ spec.homepage = "https://gitlab.com/gitlab-org/gitlab/-/tree/master/gems/gitlab-utils"
+ spec.license = "MIT"
+ spec.required_ruby_version = ">= 3.0"
+ spec.metadata["rubygems_mfa_required"] = "true"
+
+ spec.files = Dir["lib/**/*.rb"]
+ spec.require_paths = ["lib"]
+
+ spec.add_runtime_dependency "actionview", ">= 6.1.7.2"
+ spec.add_runtime_dependency "activesupport", ">= 6.1.7.2"
+ spec.add_runtime_dependency "addressable", "~> 2.8"
+ spec.add_runtime_dependency "nokogiri", "~> 1.15.2"
+ spec.add_runtime_dependency "rake", "~> 13.0"
+
+ spec.add_development_dependency "factory_bot_rails", "~> 6.2.0"
+ spec.add_development_dependency "gitlab-styles", "~> 10.1.0"
+ spec.add_development_dependency "rspec", "~> 3.12"
+ spec.add_development_dependency "rspec-benchmark", "~> 0.6.0"
+ spec.add_development_dependency "rspec-parameterized", "~> 1.0"
+ spec.add_development_dependency "rspec-rails", "~> 6.0.1"
+ spec.add_development_dependency "rubocop", "~> 1.50"
+ spec.add_development_dependency "rubocop-rspec", "~> 2.22"
+end
diff --git a/gems/gitlab-utils/lib/gitlab/utils.rb b/gems/gitlab-utils/lib/gitlab/utils.rb
new file mode 100644
index 00000000000..4e08ee8fcaf
--- /dev/null
+++ b/gems/gitlab-utils/lib/gitlab/utils.rb
@@ -0,0 +1,263 @@
+# frozen_string_literal: true
+
+require "addressable/uri"
+require "active_support/all"
+require "action_view"
+
+module Gitlab
+ module Utils
+ extend self
+ DoubleEncodingError = Class.new(StandardError)
+
+ def allowlisted?(absolute_path, allowlist)
+ path = absolute_path.downcase
+
+ allowlist.map(&:downcase).any? do |allowed_path|
+ path.start_with?(allowed_path)
+ end
+ end
+
+ def decode_path(encoded_path)
+ decoded = CGI.unescape(encoded_path)
+ if decoded != CGI.unescape(decoded) # rubocop:disable Style/IfUnlessModifier
+ raise DoubleEncodingError, "path #{encoded_path} is not allowed"
+ end
+
+ decoded
+ end
+
+ def force_utf8(str)
+ str.dup.force_encoding(Encoding::UTF_8)
+ end
+
+ def ensure_utf8_size(str, bytes:)
+ raise ArgumentError, 'Empty string provided!' if str.empty?
+ raise ArgumentError, 'Negative string size provided!' if bytes < 0
+
+ truncated = str.each_char.each_with_object(+'') do |char, object|
+ if object.bytesize + char.bytesize > bytes # rubocop:disable Style/GuardClause
+ break object
+ else
+ object.concat(char)
+ end
+ end
+
+ truncated + ('0' * (bytes - truncated.bytesize))
+ end
+
+ # Append path to host, making sure there's one single / in between
+ def append_path(host, path)
+ "#{host.to_s.sub(%r{\/+$}, '')}/#{remove_leading_slashes(path)}" # rubocop:disable Style/RedundantRegexpEscape
+ end
+
+ def remove_leading_slashes(str)
+ str.to_s.sub(%r{^/+}, '')
+ end
+
+ # A slugified version of the string, suitable for inclusion in URLs and
+ # domain names. Rules:
+ #
+ # * Lowercased
+ # * Anything not matching [a-z0-9-] is replaced with a -
+ # * Maximum length is 63 bytes
+ # * First/Last Character is not a hyphen
+ def slugify(str)
+ str.downcase
+ .gsub(/[^a-z0-9]/, '-')[0..62]
+ .gsub(/(\A-+|-+\z)/, '')
+ end
+
+ # Converts newlines into HTML line break elements
+ def nlbr(str)
+ ActionView::Base.full_sanitizer.sanitize(+str, tags: []).gsub(/\r?\n/, '<br>').html_safe
+ end
+
+ def remove_line_breaks(str)
+ str.gsub(/\r?\n/, '')
+ end
+
+ def to_boolean(value, default: nil)
+ value = value.to_s if [0, 1].include?(value)
+
+ return value if [true, false].include?(value)
+ return true if value =~ /^(true|t|yes|y|1|on)$/i
+ return false if value =~ /^(false|f|no|n|0|off)$/i
+
+ default
+ end
+
+ def boolean_to_yes_no(bool)
+ if bool
+ 'Yes'
+ else
+ 'No'
+ end
+ end
+
+ # Behaves like `which` on Linux machines: given PATH, try to resolve the given
+ # executable name to an absolute path, or return nil.
+ #
+ # which('ruby') #=> /usr/bin/ruby
+ def which(filename)
+ ENV['PATH']&.split(File::PATH_SEPARATOR)&.each do |path|
+ full_path = File.join(path, filename)
+ return full_path if File.executable?(full_path)
+ end
+
+ nil
+ end
+
+ def try_megabytes_to_bytes(size)
+ Integer(size).megabytes
+ rescue ArgumentError
+ size
+ end
+
+ def bytes_to_megabytes(bytes)
+ bytes.to_f / Numeric::MEGABYTE
+ end
+
+ def ms_to_round_sec(ms)
+ (ms.to_f / 1000).round(6)
+ end
+
+ # Used in EE
+ # Accepts either an Array or a String and returns an array
+ def ensure_array_from_string(string_or_array)
+ return string_or_array if string_or_array.is_a?(Array)
+
+ string_or_array.split(',').map(&:strip)
+ end
+
+ def deep_indifferent_access(data)
+ case data
+ when Array
+ data.map { |item| deep_indifferent_access(item) }
+ when Hash
+ data.with_indifferent_access
+ else
+ data
+ end
+ end
+
+ def deep_symbolized_access(data)
+ case data
+ when Array
+ data.map { |item| deep_symbolized_access(item) }
+ when Hash
+ data.deep_symbolize_keys
+ else
+ data
+ end
+ end
+
+ def string_to_ip_object(str)
+ return unless str
+
+ IPAddr.new(str)
+ rescue IPAddr::InvalidAddressError
+ end
+
+ # A safe alternative to String#downcase!
+ #
+ # This will make copies of frozen strings but downcase unfrozen
+ # strings in place, reducing allocations.
+ def safe_downcase!(str)
+ if str.frozen?
+ str.downcase
+ else
+ str.downcase! || str
+ end
+ end
+
+ # Converts a string to an Addressable::URI object.
+ # If the string is not a valid URI, it returns nil.
+ # Param uri_string should be a String object.
+ # This method returns an Addressable::URI object or nil.
+ def parse_url(uri_string)
+ Addressable::URI.parse(uri_string)
+ rescue Addressable::URI::InvalidURIError, TypeError
+ end
+
+ def add_url_parameters(url, params)
+ uri = parse_url(url.to_s)
+ uri.query_values = uri.query_values.to_h.merge(params.to_h.stringify_keys)
+ uri.query_values = nil if uri.query_values.empty?
+ uri.to_s
+ end
+
+ def removes_sensitive_data_from_url(uri_string)
+ uri = parse_url(uri_string)
+
+ return unless uri
+ return uri_string unless uri.fragment
+
+ stripped_params = CGI.parse(uri.fragment)
+ if stripped_params['access_token']
+ stripped_params['access_token'] = 'filtered'
+ filtered_query = Addressable::URI.new
+ filtered_query.query_values = stripped_params
+
+ uri.fragment = filtered_query.query
+ end
+
+ uri.to_s
+ end
+
+ # Invert a hash, collecting all keys that map to a given value in an array.
+ #
+ # Unlike `Hash#invert`, where the last encountered pair wins, and which has the
+ # type `Hash[k, v] => Hash[v, k]`, `multiple_key_invert` does not lose any
+ # information, has the type `Hash[k, v] => Hash[v, Array[k]]`, and the original
+ # hash can always be reconstructed.
+ #
+ # example:
+ #
+ # multiple_key_invert({ a: 1, b: 2, c: 1 })
+ # # => { 1 => [:a, :c], 2 => [:b] }
+ #
+ def multiple_key_invert(hash)
+ hash.flat_map { |k, v| Array.wrap(v).zip([k].cycle) }
+ .group_by(&:first)
+ .transform_values { |kvs| kvs.map(&:last) }
+ end
+
+ # This sort is stable (see https://en.wikipedia.org/wiki/Sorting_algorithm#Stability)
+ # contrary to the bare Ruby sort_by method. Using just sort_by leads to
+ # instability across different platforms (e.g., x86_64-linux and x86_64-darwin18)
+ # which in turn leads to different sorting results for the equal elements across
+ # these platforms.
+ # This method uses a list item's original index position to break ties.
+ def stable_sort_by(list)
+ list.sort_by.with_index { |x, idx| [yield(x), idx] }
+ end
+
+ # Check for valid brackets (`[` and `]`) in a string using this aspects:
+ # * open brackets count == closed brackets count
+ # * (optionally) reject nested brackets via `allow_nested: false`
+ # * open / close brackets coherence, eg. ][[] -> invalid
+ def valid_brackets?(string = '', allow_nested: true)
+ # remove everything except brackets
+ brackets = string.remove(/[^\[\]]/)
+
+ return true if brackets.empty?
+ # balanced counts check
+ return false if brackets.size.odd?
+
+ unless allow_nested
+ # nested brackets check
+ return false if brackets.include?('[[') || brackets.include?(']]') # rubocop:disable Style/SoleNestedConditional
+ end
+
+ # open / close brackets coherence check
+ untrimmed = brackets
+ loop do
+ trimmed = untrimmed.gsub('[]', '')
+ return true if trimmed.empty?
+ return false if trimmed == untrimmed
+
+ untrimmed = trimmed
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-utils/lib/gitlab/utils/all.rb b/gems/gitlab-utils/lib/gitlab/utils/all.rb
new file mode 100644
index 00000000000..200a21aad88
--- /dev/null
+++ b/gems/gitlab-utils/lib/gitlab/utils/all.rb
@@ -0,0 +1,6 @@
+# frozen_string_literal: true
+
+require_relative "../utils"
+require_relative "../version_info"
+require_relative "version"
+require_relative "strong_memoize"
diff --git a/lib/gitlab/utils/strong_memoize.rb b/gems/gitlab-utils/lib/gitlab/utils/strong_memoize.rb
index 2b3841b8f09..2b3841b8f09 100644
--- a/lib/gitlab/utils/strong_memoize.rb
+++ b/gems/gitlab-utils/lib/gitlab/utils/strong_memoize.rb
diff --git a/gems/gitlab-utils/lib/gitlab/utils/version.rb b/gems/gitlab-utils/lib/gitlab/utils/version.rb
new file mode 100644
index 00000000000..a9afe5bf845
--- /dev/null
+++ b/gems/gitlab-utils/lib/gitlab/utils/version.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Utils
+ module Version
+ VERSION = "0.1.0"
+ end
+ end
+end
diff --git a/gems/gitlab-utils/lib/gitlab/version_info.rb b/gems/gitlab-utils/lib/gitlab/version_info.rb
new file mode 100644
index 00000000000..00a9b4ddc6e
--- /dev/null
+++ b/gems/gitlab-utils/lib/gitlab/version_info.rb
@@ -0,0 +1,101 @@
+# frozen_string_literal: true
+
+module Gitlab
+ class VersionInfo
+ include Comparable
+
+ attr_reader :major, :minor, :patch
+
+ VERSION_REGEX = /(\d+)\.(\d+)\.(\d+)/
+ # To mitigate ReDoS, limit the length of the version string we're
+ # willing to check
+ MAX_VERSION_LENGTH = 128
+
+ def self.parse(str, parse_suffix: false)
+ return str if str.is_a?(self)
+
+ if str && str.length <= MAX_VERSION_LENGTH
+ match = str.match(VERSION_REGEX)
+ if match
+ return VersionInfo.new(match[1].to_i, match[2].to_i, match[3].to_i, parse_suffix ? match.post_match : nil)
+ end
+ end
+
+ VersionInfo.new
+ end
+
+ def initialize(major = 0, minor = 0, patch = 0, suffix = nil) # rubocop:disable Metrics/ParameterLists
+ @major = major
+ @minor = minor
+ @patch = patch
+ @suffix_s = suffix.to_s
+ end
+
+ # rubocop:disable Metrics/CyclomaticComplexity
+ # rubocop:disable Metrics/PerceivedComplexity
+ def <=>(other)
+ return unless other.is_a? VersionInfo
+ return unless valid? && other.valid?
+
+ if other.major < @major
+ 1
+ elsif @major < other.major
+ -1
+ elsif other.minor < @minor
+ 1
+ elsif @minor < other.minor
+ -1
+ elsif other.patch < @patch
+ 1
+ elsif @patch < other.patch
+ -1
+ elsif @suffix_s.empty? && other.suffix.present?
+ 1
+ elsif other.suffix.empty? && @suffix_s.present?
+ -1
+ else
+ suffix <=> other.suffix
+ end
+ end
+ # rubocop:enable Metrics/CyclomaticComplexity
+ # rubocop:enable Metrics/PerceivedComplexity
+
+ def to_s
+ if valid?
+ "%d.%d.%d%s" % [@major, @minor, @patch, @suffix_s] # rubocop:disable Style/FormatString
+ else
+ 'Unknown'
+ end
+ end
+
+ def to_json(*_args)
+ { major: @major, minor: @minor, patch: @patch }.to_json
+ end
+
+ def suffix
+ @suffix ||= @suffix_s.strip.gsub('-', '.pre.').scan(/\d+|[a-z]+/i).map do |s|
+ /^\d+$/.match?(s) ? s.to_i : s
+ end.freeze
+ end
+
+ def valid?
+ @major >= 0 && @minor >= 0 && @patch >= 0 && @major + @minor + @patch > 0
+ end
+
+ def hash
+ [self.class, to_s].hash
+ end
+
+ def eql?(other)
+ (self <=> other) == 0
+ end
+
+ def same_minor_version?(other)
+ @major == other.major && @minor == other.minor
+ end
+
+ def without_patch
+ self.class.new(@major, @minor, 0)
+ end
+ end
+end
diff --git a/gems/gitlab-utils/spec/gitlab/utils/strong_memoize_spec.rb b/gems/gitlab-utils/spec/gitlab/utils/strong_memoize_spec.rb
new file mode 100644
index 00000000000..f23a12ca6a2
--- /dev/null
+++ b/gems/gitlab-utils/spec/gitlab/utils/strong_memoize_spec.rb
@@ -0,0 +1,368 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require 'active_support/testing/time_helpers'
+
+RSpec.describe Gitlab::Utils::StrongMemoize, feature_category: :shared do
+ include ActiveSupport::Testing::TimeHelpers
+
+ let(:klass) do
+ strong_memoize_class = described_class
+
+ Struct.new(:value) do
+ include strong_memoize_class
+
+ def self.method_added_list
+ @method_added_list ||= []
+ end
+
+ def self.method_added(name)
+ method_added_list << name
+ end
+
+ def method_name
+ strong_memoize(:method_name) do # rubocop:disable Gitlab/StrongMemoizeAttr
+ trace << value
+ value
+ end
+ end
+
+ def method_name_with_expiration
+ strong_memoize_with_expiration(:method_name_with_expiration, 1) do
+ trace << value
+ value
+ end
+ end
+
+ def method_name_attr
+ trace << value
+ value
+ end
+ strong_memoize_attr :method_name_attr
+
+ def enabled?
+ trace << value
+ value
+ end
+ strong_memoize_attr :enabled?
+
+ def method_name_with_args(*args)
+ strong_memoize_with(:method_name_with_args, args) do
+ trace << [value, args]
+ value
+ end
+ end
+
+ def trace
+ @trace ||= []
+ end
+
+ protected
+
+ def private_method; end
+ private :private_method
+ strong_memoize_attr :private_method
+
+ public
+
+ def protected_method; end
+ protected :protected_method
+ strong_memoize_attr :protected_method
+
+ private
+
+ def public_method; end
+ public :public_method
+ strong_memoize_attr :public_method
+ end
+ end
+
+ subject(:object) { klass.new(value) }
+
+ shared_examples 'caching the value' do
+ let(:member_name) { described_class.normalize_key(method_name) }
+
+ it 'only calls the block once' do
+ value0 = object.public_send(method_name)
+ value1 = object.public_send(method_name)
+
+ expect(value0).to eq(value)
+ expect(value1).to eq(value)
+ expect(object.trace).to contain_exactly(value)
+ end
+
+ it 'returns and defines the instance variable for the exact value' do
+ returned_value = object.public_send(method_name)
+ memoized_value = object.instance_variable_get(:"@#{member_name}")
+
+ expect(returned_value).to eql(value)
+ expect(memoized_value).to eql(value)
+ end
+ end
+
+ describe '#strong_memoize' do
+ [nil, false, true, 'value', 0, [0]].each do |value|
+ context "with value #{value}" do
+ let(:value) { value }
+ let(:method_name) { :method_name }
+
+ it_behaves_like 'caching the value'
+
+ it 'raises exception for invalid type as key' do
+ expect { object.strong_memoize(10) { 20 } }.to raise_error(/Invalid type of '10'/)
+ end
+
+ it 'raises exception for invalid characters in key' do
+ expect { object.strong_memoize(:enabled?) { 20 } }
+ .to raise_error(/is not allowed as an instance variable name/)
+ end
+ end
+ end
+
+ context "with memory allocation", type: :benchmark do
+ let(:value) { 'aaa' }
+
+ before do
+ object.method_name # warmup
+ end
+
+ [:method_name, "method_name"].each do |argument|
+ context "when argument is a #{argument.class}" do
+ it 'does allocate exactly one string when fetching value' do
+ expect do
+ object.strong_memoize(argument) { 10 }
+ end.to perform_allocation(1)
+ end
+
+ it 'does allocate exactly one string when storing value' do
+ object.clear_memoization(:method_name) # clear to force set
+
+ expect do
+ object.strong_memoize(argument) { 10 }
+ end.to perform_allocation(1)
+ end
+ end
+ end
+ end
+ end
+
+ describe '#strong_memoize_with_expiration' do
+ [nil, false, true, 'value', 0, [0]].each do |value|
+ context "with value #{value}" do
+ let(:value) { value }
+ let(:method_name) { :method_name_with_expiration }
+
+ it_behaves_like 'caching the value'
+
+ it 'raises exception for invalid type as key' do
+ expect { object.strong_memoize_with_expiration(10, 1) { 20 } }.to raise_error(/Invalid type of '10'/)
+ end
+
+ it 'raises exception for invalid characters in key' do
+ expect { object.strong_memoize_with_expiration(:enabled?, 1) { 20 } }
+ .to raise_error(/is not allowed as an instance variable name/)
+ end
+ end
+ end
+
+ context 'with value memoization test' do
+ let(:value) { 'value' }
+
+ it 'caches the value for specified number of seconds' do
+ object.method_name_with_expiration
+ object.method_name_with_expiration
+
+ expect(object.trace.count).to eq(1)
+
+ travel_to(Time.current + 2.seconds) do
+ object.method_name_with_expiration
+
+ expect(object.trace.count).to eq(2)
+ end
+ end
+ end
+ end
+
+ describe '#strong_memoize_with' do
+ [nil, false, true, 'value', 0, [0]].each do |value|
+ context "with value #{value}" do
+ let(:value) { value }
+
+ it 'only calls the block once' do
+ value0 = object.method_name_with_args(1)
+ value1 = object.method_name_with_args(1)
+ value2 = object.method_name_with_args([2, 3])
+ value3 = object.method_name_with_args([2, 3])
+
+ expect(value0).to eq(value)
+ expect(value1).to eq(value)
+ expect(value2).to eq(value)
+ expect(value3).to eq(value)
+
+ expect(object.trace).to contain_exactly([value, [1]], [value, [[2, 3]]])
+ end
+
+ it 'returns and defines the instance variable for the exact value' do
+ returned_value = object.method_name_with_args(1, 2, 3)
+ memoized_value = object.instance_variable_get(:@method_name_with_args)
+
+ expect(returned_value).to eql(value)
+ expect(memoized_value).to eql({ [[1, 2, 3]] => value })
+ end
+ end
+ end
+ end
+
+ describe '#strong_memoized?' do
+ shared_examples 'memoization check' do |method_name|
+ context "when method is :#{method_name}" do
+ let(:value) { :anything }
+
+ subject { object.strong_memoized?(method_name) }
+
+ it 'returns false if the value is uncached' do
+ expect(subject).to be(false)
+ end
+
+ it 'returns true if the value is cached' do
+ object.public_send(method_name)
+
+ expect(subject).to be(true)
+ end
+ end
+ end
+
+ it_behaves_like 'memoization check', :method_name
+ it_behaves_like 'memoization check', :enabled?
+ end
+
+ describe '#clear_memoization' do
+ shared_examples 'clearing memoization' do |method_name|
+ let(:member_name) { described_class.normalize_key(method_name) }
+ let(:value) { 'mepmep' }
+
+ it 'removes the instance variable' do
+ object.public_send(method_name)
+
+ object.clear_memoization(method_name)
+
+ expect(object.instance_variable_defined?(:"@#{member_name}")).to be(false)
+ end
+ end
+
+ it_behaves_like 'clearing memoization', :method_name
+ it_behaves_like 'clearing memoization', :enabled?
+ end
+
+ describe '.strong_memoize_attr' do
+ [nil, false, true, 'value', 0, [0]].each do |value|
+ context "with value '#{value}'" do
+ let(:value) { value }
+
+ context 'with memoized after method definition' do
+ let(:method_name) { :method_name_attr }
+
+ it_behaves_like 'caching the value'
+
+ it 'calls the existing .method_added' do
+ expect(klass.method_added_list).to include(:method_name_attr)
+ end
+
+ it 'retains method arity' do
+ expect(klass.instance_method(method_name).arity).to eq(0)
+ end
+ end
+ end
+ end
+
+ describe 'method visibility' do
+ it 'sets private visibility' do
+ expect(klass.private_instance_methods).to include(:private_method)
+ expect(klass.protected_instance_methods).not_to include(:private_method)
+ expect(klass.public_instance_methods).not_to include(:private_method)
+ end
+
+ it 'sets protected visibility' do
+ expect(klass.private_instance_methods).not_to include(:protected_method)
+ expect(klass.protected_instance_methods).to include(:protected_method)
+ expect(klass.public_instance_methods).not_to include(:protected_method)
+ end
+
+ it 'sets public visibility' do
+ expect(klass.private_instance_methods).not_to include(:public_method)
+ expect(klass.protected_instance_methods).not_to include(:public_method)
+ expect(klass.public_instance_methods).to include(:public_method)
+ end
+ end
+
+ context "when method doesn't exist" do
+ let(:klass) do
+ strong_memoize_class = described_class
+
+ Struct.new(:value) do
+ include strong_memoize_class
+ end
+ end
+
+ subject { klass.strong_memoize_attr(:nonexistent_method) }
+
+ it 'fails when strong-memoizing a nonexistent method' do
+ expect { subject }.to raise_error(NameError, /undefined method `nonexistent_method' for class/)
+ end
+ end
+
+ context 'when memoized method has parameters' do
+ it 'raises an error' do
+ expected_message = /Using `strong_memoize_attr` on methods with parameters is not supported/
+
+ expect do
+ strong_memoize_class = described_class
+
+ Class.new do
+ include strong_memoize_class
+
+ def method_with_parameters(params); end
+ strong_memoize_attr :method_with_parameters
+ end
+ end.to raise_error(RuntimeError, expected_message)
+ end
+ end
+ end
+
+ describe '.normalize_key' do
+ using RSpec::Parameterized::TableSyntax
+
+ subject { described_class.normalize_key(input) }
+
+ where(:input, :output, :valid) do
+ :key | :key | true
+ "key" | "key" | true
+ :key? | "key?" | true
+ "key?" | "key?" | true
+ :key! | "keyï¼" | true
+ "key!" | "keyï¼" | true
+ # invalid cases caught elsewhere
+ :"ke?y" | :"ke?y" | false
+ "ke?y" | "ke?y" | false
+ :"ke!y" | :"ke!y" | false
+ "ke!y" | "ke!y" | false
+ end
+
+ with_them do
+ let(:ivar) { "@#{output}" }
+
+ it { is_expected.to eq(output) }
+
+ if params[:valid]
+ it 'is a valid ivar name' do
+ expect { instance_variable_defined?(ivar) }.not_to raise_error
+ end
+ else
+ it 'raises a NameError error' do
+ expect { instance_variable_defined?(ivar) }
+ .to raise_error(NameError, /not allowed as an instance/)
+ end
+ end
+ end
+ end
+end
diff --git a/gems/gitlab-utils/spec/gitlab/utils_spec.rb b/gems/gitlab-utils/spec/gitlab/utils_spec.rb
new file mode 100644
index 00000000000..53593190eea
--- /dev/null
+++ b/gems/gitlab-utils/spec/gitlab/utils_spec.rb
@@ -0,0 +1,479 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Utils, feature_category: :shared do
+ using RSpec::Parameterized::TableSyntax
+ include StubENV
+
+ delegate :to_boolean, :boolean_to_yes_no, :slugify, :which,
+ :ensure_array_from_string, :bytes_to_megabytes,
+ :append_path, :remove_leading_slashes, :allowlisted?,
+ :decode_path, :ms_to_round_sec, to: :described_class
+
+ describe '.allowlisted?' do
+ let(:allowed_paths) { ['/home/foo', '/foo/bar', '/etc/passwd'] }
+
+ it 'returns true if path is allowed' do
+ expect(allowlisted?('/foo/bar', allowed_paths)).to be(true)
+ end
+
+ it 'returns false if path is not allowed' do
+ expect(allowlisted?('/test/test', allowed_paths)).to be(false)
+ end
+ end
+
+ describe '.decode_path' do
+ it 'returns path unencoded for singled-encoded paths' do
+ expect(decode_path('%2Fhome%2Fbar%3Fasd%3Dqwe')).to eq('/home/bar?asd=qwe')
+ end
+
+ it 'returns path when it is unencoded' do
+ expect(decode_path('/home/bar?asd=qwe')).to eq('/home/bar?asd=qwe')
+ end
+
+ [
+ '..%252F..%252F..%252Fetc%252Fpasswd',
+ '%25252Fresult%25252Fchosennickname%25253D%252522jj%252522'
+ ].each do |multiple_encoded_path|
+ it 'raises an exception when the path is multiple-encoded' do
+ expect { decode_path(multiple_encoded_path) }.to raise_error(/path #{multiple_encoded_path} is not allowed/)
+ end
+ end
+ end
+
+ describe '.slugify' do
+ {
+ 'TEST' => 'test',
+ 'project_with_underscores' => 'project-with-underscores',
+ 'namespace/project' => 'namespace-project',
+ 'a' * 70 => 'a' * 63,
+ 'test_trailing_' => 'test-trailing'
+ }.each do |original, expected|
+ it "slugifies #{original} to #{expected}" do
+ expect(slugify(original)).to eq(expected)
+ end
+ end
+ end
+
+ describe '.ms_to_round_sec' do
+ where(:original, :expected) do
+ 1999.8999 | 1.9999
+ 12384 | 12.384
+ 333 | 0.333
+ 1333.33333333 | 1.333333
+ end
+
+ with_them do
+ it "returns rounded seconds" do
+ expect(ms_to_round_sec(original)).to eq(expected)
+ end
+ end
+ end
+
+ describe '.nlbr' do
+ it 'replaces new lines with <br>' do
+ expect(described_class.nlbr("<b>hello</b>\n<i>world</i>")).to eq("hello<br>world")
+ end
+ end
+
+ describe '.remove_line_breaks' do
+ where(:original, :expected) do
+ "foo\nbar\nbaz" | "foobarbaz"
+ "foo\r\nbar\r\nbaz" | "foobarbaz"
+ "foobar" | "foobar"
+ end
+
+ with_them do
+ it "replace line breaks with an empty string" do
+ expect(described_class.remove_line_breaks(original)).to eq(expected)
+ end
+ end
+ end
+
+ describe '.to_boolean' do
+ it 'accepts booleans' do
+ expect(to_boolean(true)).to be(true)
+ expect(to_boolean(false)).to be(false)
+ end
+
+ it 'converts a valid value to a boolean' do
+ expect(to_boolean(true)).to be(true)
+ expect(to_boolean('true')).to be(true)
+ expect(to_boolean('YeS')).to be(true)
+ expect(to_boolean('t')).to be(true)
+ expect(to_boolean('1')).to be(true)
+ expect(to_boolean(1)).to be(true)
+ expect(to_boolean('ON')).to be(true)
+
+ expect(to_boolean('FaLse')).to be(false)
+ expect(to_boolean('F')).to be(false)
+ expect(to_boolean('NO')).to be(false)
+ expect(to_boolean('n')).to be(false)
+ expect(to_boolean('0')).to be(false)
+ expect(to_boolean(0)).to be(false)
+ expect(to_boolean('oFF')).to be(false)
+ end
+
+ it 'converts an invalid value to nil' do
+ expect(to_boolean('fals')).to be_nil
+ expect(to_boolean('yeah')).to be_nil
+ expect(to_boolean('')).to be_nil
+ expect(to_boolean(nil)).to be_nil
+ end
+
+ it 'accepts a default value, and does not return it when a valid value is given' do
+ expect(to_boolean(true, default: false)).to be(true)
+ expect(to_boolean('true', default: false)).to be(true)
+ expect(to_boolean('YeS', default: false)).to be(true)
+ expect(to_boolean('t', default: false)).to be(true)
+ expect(to_boolean('1', default: 'any value')).to be(true)
+ expect(to_boolean('ON', default: 42)).to be(true)
+
+ expect(to_boolean('FaLse', default: true)).to be(false)
+ expect(to_boolean('F', default: true)).to be(false)
+ expect(to_boolean('NO', default: true)).to be(false)
+ expect(to_boolean('n', default: true)).to be(false)
+ expect(to_boolean('0', default: 'any value')).to be(false)
+ expect(to_boolean('oFF', default: 42)).to be(false)
+ end
+
+ it 'accepts a default value, and returns it when an invalid value is given' do
+ expect(to_boolean('fals', default: true)).to eq(true)
+ expect(to_boolean('yeah', default: false)).to eq(false)
+ expect(to_boolean('', default: 'any value')).to eq('any value')
+ expect(to_boolean(nil, default: 42)).to eq(42)
+ end
+ end
+
+ describe '.boolean_to_yes_no' do
+ it 'converts booleans to Yes or No' do
+ expect(boolean_to_yes_no(true)).to eq('Yes')
+ expect(boolean_to_yes_no(false)).to eq('No')
+ end
+ end
+
+ describe '.which' do
+ before do
+ stub_env('PATH', '/sbin:/usr/bin:/home/joe/bin')
+ end
+
+ it 'finds the full path to an executable binary in order of appearance' do
+ expect(File).to receive(:executable?).with('/sbin/tool').ordered.and_return(false)
+ expect(File).to receive(:executable?).with('/usr/bin/tool').ordered.and_return(true)
+ expect(File).not_to receive(:executable?).with('/home/joe/bin/tool')
+
+ expect(which('tool')).to eq('/usr/bin/tool')
+ end
+ end
+
+ describe '.ensure_array_from_string' do
+ it 'returns the same array if given one' do
+ arr = ['a', 4, true, { test: 1 }]
+
+ expect(ensure_array_from_string(arr)).to eq(arr)
+ end
+
+ it 'turns comma-separated strings into arrays' do
+ str = 'seven, eight, 9, 10'
+
+ expect(ensure_array_from_string(str)).to eq(%w[seven eight 9 10])
+ end
+ end
+
+ describe '.bytes_to_megabytes' do
+ it 'converts bytes to megabytes' do
+ bytes = 1.megabyte
+
+ expect(bytes_to_megabytes(bytes)).to eq(1)
+ end
+ end
+
+ describe '.append_path' do
+ where(:host, :path, :result) do
+ 'http://test/' | '/foo/bar' | 'http://test/foo/bar'
+ 'http://test/' | '//foo/bar' | 'http://test/foo/bar'
+ 'http://test//' | '/foo/bar' | 'http://test/foo/bar'
+ 'http://test' | 'foo/bar' | 'http://test/foo/bar'
+ 'http://test//' | '' | 'http://test/'
+ 'http://test//' | nil | 'http://test/'
+ '' | '/foo/bar' | '/foo/bar'
+ nil | '/foo/bar' | '/foo/bar'
+ end
+
+ with_them do
+ it 'makes sure there is only one slash as path separator' do
+ expect(append_path(host, path)).to eq(result)
+ end
+ end
+ end
+
+ describe '.remove_leading_slashes' do
+ where(:str, :result) do
+ '/foo/bar' | 'foo/bar'
+ '//foo/bar' | 'foo/bar'
+ '/foo/bar/' | 'foo/bar/'
+ 'foo/bar' | 'foo/bar'
+ '' | ''
+ nil | ''
+ end
+
+ with_them do
+ it 'removes leading slashes' do
+ expect(remove_leading_slashes(str)).to eq(result)
+ end
+ end
+ end
+
+ describe '.ensure_utf8_size' do
+ context 'with string is has less bytes than expected' do
+ it 'backfills string with null characters' do
+ transformed = described_class.ensure_utf8_size('a' * 10, bytes: 32)
+
+ expect(transformed.bytesize).to eq 32
+ expect(transformed).to eq(('a' * 10) + ('0' * 22))
+ end
+ end
+
+ context 'with string size is exactly the one that is expected' do
+ it 'returns original value' do
+ transformed = described_class.ensure_utf8_size('a' * 32, bytes: 32)
+
+ expect(transformed).to eq 'a' * 32
+ expect(transformed.bytesize).to eq 32
+ end
+ end
+
+ context 'when string contains a few multi-byte UTF characters' do
+ it 'backfills string with null characters' do
+ transformed = described_class.ensure_utf8_size('â¤' * 6, bytes: 32)
+
+ expect(transformed).to eq 'â¤â¤â¤â¤â¤â¤' + ('0' * 14) # rubocop:disable Style/StringConcatenation
+ expect(transformed.bytesize).to eq 32
+ end
+ end
+
+ context 'when string has multiple multi-byte UTF chars exceeding 32 bytes' do
+ it 'truncates string to 32 characters and backfills it if needed' do
+ transformed = described_class.ensure_utf8_size('â¤' * 18, bytes: 32)
+
+ expect(transformed).to eq(('â¤' * 10) + ('0' * 2))
+ expect(transformed.bytesize).to eq 32
+ end
+ end
+ end
+
+ describe '.deep_indifferent_access' do
+ let(:hash) do
+ { "variables" => [{ "key" => "VAR1", "value" => "VALUE2" }] }
+ end
+
+ subject { described_class.deep_indifferent_access(hash) }
+
+ it 'allows to access hash keys with symbols' do
+ expect(subject[:variables]).to be_a(Array)
+ end
+
+ it 'allows to access array keys with symbols' do
+ expect(subject[:variables].first[:key]).to eq('VAR1')
+ end
+ end
+
+ describe '.deep_symbolized_access' do
+ let(:hash) do
+ { "variables" => [{ "key" => "VAR1", "value" => "VALUE2" }] }
+ end
+
+ subject { described_class.deep_symbolized_access(hash) }
+
+ it 'allows to access hash keys with symbols' do
+ expect(subject[:variables]).to be_a(Array)
+ end
+
+ it 'allows to access array keys with symbols' do
+ expect(subject[:variables].first[:key]).to eq('VAR1')
+ end
+ end
+
+ describe '.try_megabytes_to_bytes' do
+ context 'when the size can be converted to megabytes' do
+ it 'returns the size in megabytes' do
+ size = described_class.try_megabytes_to_bytes(1)
+
+ expect(size).to eq(1.megabytes)
+ end
+ end
+
+ context 'when the size can not be converted to megabytes' do
+ it 'returns the input size' do
+ size = described_class.try_megabytes_to_bytes('foo')
+
+ expect(size).to eq('foo')
+ end
+ end
+ end
+
+ describe '.string_to_ip_object' do
+ it 'returns nil when string is nil' do
+ expect(described_class.string_to_ip_object(nil)).to eq(nil)
+ end
+
+ it 'returns nil when string is invalid IP' do
+ expect(described_class.string_to_ip_object('invalid ip')).to eq(nil)
+ expect(described_class.string_to_ip_object('')).to eq(nil)
+ end
+
+ it 'returns IP object when string is valid IP' do
+ expect(described_class.string_to_ip_object('192.168.1.1')).to eq(IPAddr.new('192.168.1.1'))
+ expect(described_class.string_to_ip_object('::ffff:a9fe:a864')).to eq(IPAddr.new('::ffff:a9fe:a864'))
+ expect(described_class.string_to_ip_object('[::ffff:a9fe:a864]')).to eq(IPAddr.new('::ffff:a9fe:a864'))
+ expect(described_class.string_to_ip_object('127.0.0.0/28')).to eq(IPAddr.new('127.0.0.0/28'))
+ expect(described_class.string_to_ip_object('1:0:0:0:0:0:0:0/124')).to eq(IPAddr.new('1:0:0:0:0:0:0:0/124'))
+ end
+ end
+
+ describe ".safe_downcase!" do
+ where(:str, :result) do
+ "test" | "test"
+ "Test" | "test"
+ "test" | "test"
+ "Test" | "test"
+ end
+
+ with_them do
+ it "downcases the string" do
+ expect(described_class.safe_downcase!(str)).to eq(result)
+ end
+ end
+ end
+
+ describe '.parse_url' do
+ it 'returns Addressable::URI object' do
+ expect(described_class.parse_url('http://gitlab.com')).to be_instance_of(Addressable::URI)
+ end
+
+ it 'returns nil when URI cannot be parsed' do
+ expect(described_class.parse_url('://gitlab.com')).to be nil
+ end
+
+ it 'returns nil with invalid parameter' do
+ expect(described_class.parse_url(1)).to be nil
+ end
+ end
+
+ describe '.add_url_parameters' do
+ subject { described_class.add_url_parameters(url, params) }
+
+ where(:url, :params, :expected_url) do
+ nil | nil | ''
+ nil | { b: 3, a: 2 } | '?a=2&b=3'
+ 'https://gitlab.com' | nil | 'https://gitlab.com'
+ 'https://gitlab.com' | { b: 3, a: 2 } | 'https://gitlab.com?a=2&b=3'
+ 'https://gitlab.com?a=1#foo' | { b: 3, 'a' => 2 } | 'https://gitlab.com?a=2&b=3#foo'
+ 'https://gitlab.com?a=1#foo' | [[:b, 3], [:a, 2]] | 'https://gitlab.com?a=2&b=3#foo'
+ end
+
+ with_them do
+ it { is_expected.to eq(expected_url) }
+ end
+ end
+
+ describe '.removes_sensitive_data_from_url' do
+ it 'returns string object' do
+ expect(described_class.removes_sensitive_data_from_url('http://gitlab.com')).to be_instance_of(String)
+ end
+
+ it 'returns nil when URI cannot be parsed' do
+ expect(described_class.removes_sensitive_data_from_url('://gitlab.com')).to be nil
+ end
+
+ it 'returns nil with invalid parameter' do
+ expect(described_class.removes_sensitive_data_from_url(1)).to be nil
+ end
+
+ it 'returns string with filtered access_token param' do
+ expect(described_class.removes_sensitive_data_from_url('http://gitlab.com/auth.html#access_token=secret_token'))
+ .to eq('http://gitlab.com/auth.html#access_token=filtered')
+ end
+
+ it 'returns string with filtered access_token param but other params preserved' do
+ expect(described_class.removes_sensitive_data_from_url('http://gitlab.com/auth.html#access_token=secret_token&token_type=Bearer&state=test'))
+ .to include('&token_type=Bearer', '&state=test')
+ end
+ end
+
+ describe 'multiple_key_invert' do
+ it 'invert keys with array values' do
+ hash = {
+ dast: [:vulnerabilities_count, :scanned_resources_count],
+ sast: [:vulnerabilities_count]
+ }
+ expect(described_class.multiple_key_invert(hash)).to eq({
+ vulnerabilities_count: [:dast, :sast],
+ scanned_resources_count: [:dast]
+ })
+ end
+ end
+
+ describe '.stable_sort_by' do
+ subject(:sorted_list) { described_class.stable_sort_by(list) { |obj| obj[:priority] } }
+
+ context 'when items have the same priority' do
+ let(:list) do
+ [
+ { name: 'obj 1', priority: 1 },
+ { name: 'obj 2', priority: 1 },
+ { name: 'obj 3', priority: 1 }
+ ]
+ end
+
+ it 'does not change order in cases of ties' do
+ expect(sorted_list).to eq(list)
+ end
+ end
+
+ context 'when items have different priorities' do
+ let(:list) do
+ [
+ { name: 'obj 1', priority: 2 },
+ { name: 'obj 2', priority: 1 },
+ { name: 'obj 3', priority: 3 }
+ ]
+ end
+
+ it 'sorts items like the regular sort_by' do
+ expect(sorted_list).to eq(
+ [
+ { name: 'obj 2', priority: 1 },
+ { name: 'obj 1', priority: 2 },
+ { name: 'obj 3', priority: 3 }
+ ])
+ end
+ end
+ end
+
+ describe '.valid_brackets?' do
+ where(:input, :allow_nested, :valid) do
+ 'no brackets' | true | true
+ 'no brackets' | false | true
+ 'user[avatar]' | true | true
+ 'user[avatar]' | false | true
+ 'user[avatar][friends]' | true | true
+ 'user[avatar][friends]' | false | true
+ 'user[avatar[image[url]]]' | true | true
+ 'user[avatar[image[url]]]' | false | false
+ 'user[avatar[]friends]' | true | true
+ 'user[avatar[]friends]' | false | false
+ 'user[avatar]]' | true | false
+ 'user[avatar]]' | false | false
+ 'user][avatar]]' | true | false
+ 'user][avatar]]' | false | false
+ 'user[avatar' | true | false
+ 'user[avatar' | false | false
+ end
+
+ with_them do
+ it { expect(described_class.valid_brackets?(input, allow_nested: allow_nested)).to eq(valid) }
+ end
+ end
+end
diff --git a/gems/gitlab-utils/spec/gitlab/version_info_spec.rb b/gems/gitlab-utils/spec/gitlab/version_info_spec.rb
new file mode 100644
index 00000000000..2b5f6bcb4c1
--- /dev/null
+++ b/gems/gitlab-utils/spec/gitlab/version_info_spec.rb
@@ -0,0 +1,193 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::VersionInfo, feature_category: :shared do
+ before do
+ @unknown = described_class.new
+ @v0_0_1 = described_class.new(0, 0, 1)
+ @v0_1_0 = described_class.new(0, 1, 0)
+ @v1_0_0 = described_class.new(1, 0, 0)
+ @v1_0_1 = described_class.new(1, 0, 1)
+ @v1_0_1_b1 = described_class.new(1, 0, 1, '-b1')
+ @v1_0_1_rc1 = described_class.new(1, 0, 1, '-rc1')
+ @v1_0_1_rc2 = described_class.new(1, 0, 1, '-rc2')
+ @v1_1_0 = described_class.new(1, 1, 0)
+ @v1_1_0_beta1 = described_class.new(1, 1, 0, '-beta1')
+ @v2_0_0 = described_class.new(2, 0, 0)
+ @v13_10_1_1574_89 = described_class.parse("v13.10.1~beta.1574.gf6ea9389", parse_suffix: true)
+ @v13_10_1_1575_89 = described_class.parse("v13.10.1~beta.1575.gf6ea9389", parse_suffix: true)
+ @v13_10_1_1575_90 = described_class.parse("v13.10.1~beta.1575.gf6ea9390", parse_suffix: true)
+ end
+
+ describe '>' do
+ it { expect(@v2_0_0).to be > @v1_1_0 }
+ it { expect(@v1_1_0).to be > @v1_0_1 }
+ it { expect(@v1_0_1_b1).to be > @v1_0_0 }
+ it { expect(@v1_0_1_rc1).to be > @v1_0_0 }
+ it { expect(@v1_0_1_rc1).to be > @v1_0_1_b1 }
+ it { expect(@v1_0_1_rc2).to be > @v1_0_1_rc1 }
+ it { expect(@v1_0_1).to be > @v1_0_1_rc1 }
+ it { expect(@v1_0_1).to be > @v1_0_1_rc2 }
+ it { expect(@v1_0_1).to be > @v1_0_0 }
+ it { expect(@v1_0_0).to be > @v0_1_0 }
+ it { expect(@v1_1_0_beta1).to be > @v1_0_1_rc2 }
+ it { expect(@v1_1_0).to be > @v1_1_0_beta1 }
+ it { expect(@v0_1_0).to be > @v0_0_1 }
+ end
+
+ describe '>=' do
+ it { expect(@v2_0_0).to be >= described_class.new(2, 0, 0) }
+ it { expect(@v2_0_0).to be >= @v1_1_0 }
+ it { expect(@v1_0_1_rc2).to be >= @v1_0_1_rc1 }
+ end
+
+ describe '<' do
+ it { expect(@v0_0_1).to be < @v0_1_0 }
+ it { expect(@v0_1_0).to be < @v1_0_0 }
+ it { expect(@v1_0_0).to be < @v1_0_1 }
+ it { expect(@v1_0_1).to be < @v1_1_0 }
+ it { expect(@v1_0_0).to be < @v1_0_1_rc2 }
+ it { expect(@v1_0_1_rc1).to be < @v1_0_1 }
+ it { expect(@v1_0_1_rc1).to be < @v1_0_1_rc2 }
+ it { expect(@v1_0_1_rc2).to be < @v1_0_1 }
+ it { expect(@v1_1_0).to be < @v2_0_0 }
+ it { expect(@v13_10_1_1574_89).to be < @v13_10_1_1575_89 }
+ it { expect(@v13_10_1_1575_89).to be < @v13_10_1_1575_90 }
+ end
+
+ describe '<=' do
+ it { expect(@v0_0_1).to be <= described_class.new(0, 0, 1) }
+ it { expect(@v0_0_1).to be <= @v0_1_0 }
+ it { expect(@v1_0_1_b1).to be <= @v1_0_1_rc1 }
+ it { expect(@v1_0_1_rc1).to be <= @v1_0_1_rc2 }
+ it { expect(@v1_1_0_beta1).to be <= @v1_1_0 }
+ end
+
+ describe '==' do
+ it { expect(@v0_0_1).to eq(described_class.new(0, 0, 1)) }
+ it { expect(@v0_1_0).to eq(described_class.new(0, 1, 0)) }
+ it { expect(@v1_0_0).to eq(described_class.new(1, 0, 0)) }
+ it { expect(@v1_0_1_rc1).to eq(described_class.new(1, 0, 1, '-rc1')) }
+ end
+
+ describe '!=' do
+ it { expect(@v0_0_1).not_to eq(@v0_1_0) }
+ it { expect(@v1_0_1_rc1).not_to eq(@v1_0_1_rc2) }
+ end
+
+ describe '.unknown' do
+ it { expect(@unknown).not_to be @v0_0_1 }
+ it { expect(@unknown).not_to be described_class.new }
+ it { expect { @unknown > @v0_0_1 }.to raise_error(ArgumentError) }
+ it { expect { @unknown < @v0_0_1 }.to raise_error(ArgumentError) }
+ end
+
+ describe '.parse' do
+ it { expect(described_class.parse(described_class.new(1, 0, 0))).to eq(@v1_0_0) }
+ it { expect(described_class.parse("1.0.0")).to eq(@v1_0_0) }
+ it { expect(described_class.parse("1.0.0.1")).to eq(@v1_0_0) }
+ it { expect(described_class.parse("1.0.0-ee")).to eq(@v1_0_0) }
+ it { expect(described_class.parse("1.0.0-rc1")).to eq(@v1_0_0) }
+ it { expect(described_class.parse("1.0.0-rc1-ee")).to eq(@v1_0_0) }
+ it { expect(described_class.parse("git 1.0.0b1")).to eq(@v1_0_0) }
+ it { expect(described_class.parse("git 1.0b1")).not_to be_valid }
+ it { expect(described_class.parse("1.1.#{'1' * described_class::MAX_VERSION_LENGTH}")).not_to be_valid }
+ it { expect(described_class.parse(nil)).not_to be_valid }
+
+ context 'with parse_suffix: true' do
+ let(:versions) do
+ <<-VERSIONS.lines
+ 0.0.1
+ 0.1.0
+ 1.0.0
+ 1.0.1-b1
+ 1.0.1-rc1
+ 1.0.1-rc2
+ 1.0.1
+ 1.1.0-beta1
+ 1.1.0
+ 2.0.0
+ v13.10.0-pre
+ v13.10.0-rc1
+ v13.10.0-rc2
+ v13.10.0
+ v13.10.1~beta.1574.gf6ea9389
+ v13.10.1~beta.1575.gf6ea9389
+ v13.10.1-rc1
+ v13.10.1-rc2
+ v13.10.1
+ VERSIONS
+ end
+
+ let(:parsed_versions) do
+ versions.map(&:strip).map { |version| described_class.parse(version, parse_suffix: true) }
+ end
+
+ it 'versions are returned in a correct order' do
+ expect(parsed_versions.shuffle.sort).to eq(parsed_versions)
+ end
+ end
+ end
+
+ describe '.to_s' do
+ it { expect(@v1_0_0.to_s).to eq("1.0.0") }
+ it { expect(@v1_0_1_rc1.to_s).to eq("1.0.1-rc1") }
+ it { expect(@unknown.to_s).to eq("Unknown") }
+ end
+
+ describe '.to_json' do
+ let(:correct_version) do
+ "{\"major\":1,\"minor\":0,\"patch\":1}"
+ end
+
+ let(:unknown_version) do
+ "{\"major\":0,\"minor\":0,\"patch\":0}"
+ end
+
+ it { expect(@v1_0_1.to_json).to eq(correct_version) }
+ it { expect(@v1_0_1_rc2.to_json).to eq(correct_version) }
+ it { expect(@unknown.to_json).to eq(unknown_version) }
+ end
+
+ describe '.hash' do
+ it { expect(described_class.parse("1.0.0").hash).to eq(@v1_0_0.hash) }
+ it { expect(described_class.parse("1.0.0.1").hash).to eq(@v1_0_0.hash) }
+ it { expect(described_class.parse("1.0.1b1").hash).to eq(@v1_0_1.hash) }
+ it { expect(described_class.parse("1.0.1-rc1", parse_suffix: true).hash).to eq(@v1_0_1_rc1.hash) }
+ end
+
+ describe '.eql?' do
+ it { expect(described_class.parse("1.0.0").eql?(@v1_0_0)).to be_truthy }
+ it { expect(described_class.parse("1.0.0.1").eql?(@v1_0_0)).to be_truthy }
+ it { expect(@v1_0_1_rc1.eql?(@v1_0_1_rc1)).to be_truthy }
+ it { expect(@v1_0_1_rc1.eql?(@v1_0_1_rc2)).to be_falsey }
+ it { expect(@v1_0_1_rc1.eql?(@v1_0_1)).to be_falsey }
+ it { expect(@v1_0_1.eql?(@v1_0_0)).to be_falsey }
+ it { expect(@v1_1_0.eql?(@v1_0_0)).to be_falsey }
+ it { expect(@v1_0_0.eql?(@v1_0_0)).to be_truthy }
+ it { expect([@v1_0_0, @v1_1_0, @v1_0_0, @v1_0_1_rc1, @v1_0_1_rc1].uniq).to eq [@v1_0_0, @v1_1_0, @v1_0_1_rc1] }
+ end
+
+ describe '.same_minor_version?' do
+ it { expect(@v0_1_0.same_minor_version?(@v0_0_1)).to be_falsey }
+ it { expect(@v1_0_1.same_minor_version?(@v1_0_0)).to be_truthy }
+ it { expect(@v1_0_1_rc1.same_minor_version?(@v1_0_0)).to be_truthy }
+ it { expect(@v1_0_0.same_minor_version?(@v1_0_1)).to be_truthy }
+ it { expect(@v1_1_0.same_minor_version?(@v1_0_0)).to be_falsey }
+ it { expect(@v2_0_0.same_minor_version?(@v1_0_0)).to be_falsey }
+ end
+
+ describe '.without_patch' do
+ it { expect(@v0_1_0.without_patch).to eq(@v0_1_0) }
+ it { expect(@v1_0_0.without_patch).to eq(@v1_0_0) }
+ it { expect(@v1_0_1.without_patch).to eq(@v1_0_0) }
+ it { expect(@v1_0_1_rc1.without_patch).to eq(@v1_0_0) }
+ end
+
+ describe 'MAX_VERSION_LENGTH' do
+ subject { described_class::MAX_VERSION_LENGTH }
+
+ it { is_expected.to eq(128) }
+ end
+end
diff --git a/gems/gitlab-utils/spec/spec_helper.rb b/gems/gitlab-utils/spec/spec_helper.rb
new file mode 100644
index 00000000000..5dc3859f77d
--- /dev/null
+++ b/gems/gitlab-utils/spec/spec_helper.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+require 'rails'
+require 'rspec/mocks'
+require 'rspec-benchmark'
+require 'rspec-parameterized'
+
+require 'gitlab/rspec/all'
+require 'gitlab/utils/all'
+
+RSpec.configure do |config|
+ config.include RSpec::Benchmark::Matchers
+
+ # Enable flags like --only-failures and --next-failure
+ config.example_status_persistence_file_path = ".rspec_status"
+
+ # Disable RSpec exposing methods globally on `Module` and `main`
+ config.disable_monkey_patching!
+
+ config.expect_with :rspec do |c|
+ c.syntax = :expect
+ end
+end
diff --git a/gems/ipynbdiff/.gitignore b/gems/ipynbdiff/.gitignore
new file mode 100644
index 00000000000..fae8d1c772f
--- /dev/null
+++ b/gems/ipynbdiff/.gitignore
@@ -0,0 +1,3 @@
+*.gem
+coverage
+.bundle
diff --git a/gems/ipynbdiff/.gitlab-ci.yml b/gems/ipynbdiff/.gitlab-ci.yml
new file mode 100644
index 00000000000..de5c989a4a4
--- /dev/null
+++ b/gems/ipynbdiff/.gitlab-ci.yml
@@ -0,0 +1,4 @@
+include:
+ - local: gems/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "ipynbdiff"
diff --git a/gems/ipynbdiff/.rubocop.yml b/gems/ipynbdiff/.rubocop.yml
new file mode 100644
index 00000000000..00a3ed337f1
--- /dev/null
+++ b/gems/ipynbdiff/.rubocop.yml
@@ -0,0 +1,21 @@
+inherit_from:
+ - ../config/rubocop.yml
+
+CodeReuse/ActiveRecord:
+ Enabled: false
+
+Gitlab/Json:
+ Enabled: false
+
+Naming/FileName:
+ Exclude:
+ - spec/**/*.rb
+ - lib/gitlab/rspec.rb
+ - lib/gitlab/rspec/all.rb
+
+Rails/Pluck:
+ Enabled: false
+
+RSpec/MultipleMemoizedHelpers:
+ Max: 6
+ AllowSubject: true
diff --git a/vendor/gems/ipynbdiff/Gemfile b/gems/ipynbdiff/Gemfile
index 7f4f5e950d1..7f4f5e950d1 100644
--- a/vendor/gems/ipynbdiff/Gemfile
+++ b/gems/ipynbdiff/Gemfile
diff --git a/gems/ipynbdiff/Gemfile.lock b/gems/ipynbdiff/Gemfile.lock
new file mode 100644
index 00000000000..9a583bdf274
--- /dev/null
+++ b/gems/ipynbdiff/Gemfile.lock
@@ -0,0 +1,139 @@
+PATH
+ remote: .
+ specs:
+ ipynbdiff (0.4.7)
+ diffy (~> 3.4)
+ oj (~> 3.13.16)
+
+GEM
+ remote: https://rubygems.org/
+ specs:
+ activesupport (7.0.6)
+ concurrent-ruby (~> 1.0, >= 1.0.2)
+ i18n (>= 1.6, < 2)
+ minitest (>= 5.1)
+ tzinfo (~> 2.0)
+ ast (2.4.2)
+ benchmark-memory (0.2.0)
+ memory_profiler (~> 1)
+ binding_of_caller (1.0.0)
+ debug_inspector (>= 0.0.1)
+ coderay (1.1.3)
+ concurrent-ruby (1.2.2)
+ debug_inspector (1.1.0)
+ diff-lcs (1.5.0)
+ diffy (3.4.2)
+ docile (1.4.0)
+ gitlab-styles (10.1.0)
+ rubocop (~> 1.50.2)
+ rubocop-graphql (~> 0.18)
+ rubocop-performance (~> 1.15)
+ rubocop-rails (~> 2.17)
+ rubocop-rspec (~> 2.22)
+ i18n (1.14.1)
+ concurrent-ruby (~> 1.0)
+ json (2.6.3)
+ memory_profiler (1.0.0)
+ method_source (1.0.0)
+ minitest (5.18.1)
+ oj (3.13.23)
+ parallel (1.23.0)
+ parser (3.2.2.3)
+ ast (~> 2.4.1)
+ racc
+ proc_to_ast (0.1.0)
+ coderay
+ parser
+ unparser
+ pry (0.14.1)
+ coderay (~> 1.1)
+ method_source (~> 1.0)
+ racc (1.7.1)
+ rack (3.0.8)
+ rainbow (3.1.1)
+ rake (13.0.6)
+ regexp_parser (2.8.1)
+ rexml (3.2.5)
+ rspec (3.11.0)
+ rspec-core (~> 3.11.0)
+ rspec-expectations (~> 3.11.0)
+ rspec-mocks (~> 3.11.0)
+ rspec-core (3.11.0)
+ rspec-support (~> 3.11.0)
+ rspec-expectations (3.11.0)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.11.0)
+ rspec-mocks (3.11.1)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.11.0)
+ rspec-parameterized (1.0.0)
+ rspec-parameterized-core (< 2)
+ rspec-parameterized-table_syntax (< 2)
+ rspec-parameterized-core (1.0.0)
+ parser
+ proc_to_ast
+ rspec (>= 2.13, < 4)
+ unparser
+ rspec-parameterized-table_syntax (1.0.0)
+ binding_of_caller
+ rspec-parameterized-core (< 2)
+ rspec-support (3.11.0)
+ rubocop (1.50.2)
+ json (~> 2.3)
+ parallel (~> 1.10)
+ parser (>= 3.2.0.0)
+ rainbow (>= 2.2.2, < 4.0)
+ regexp_parser (>= 1.8, < 3.0)
+ rexml (>= 3.2.5, < 4.0)
+ rubocop-ast (>= 1.28.0, < 2.0)
+ ruby-progressbar (~> 1.7)
+ unicode-display_width (>= 2.4.0, < 3.0)
+ rubocop-ast (1.29.0)
+ parser (>= 3.2.1.0)
+ rubocop-capybara (2.18.0)
+ rubocop (~> 1.41)
+ rubocop-factory_bot (2.23.1)
+ rubocop (~> 1.33)
+ rubocop-graphql (0.19.0)
+ rubocop (>= 0.87, < 2)
+ rubocop-performance (1.18.0)
+ rubocop (>= 1.7.0, < 2.0)
+ rubocop-ast (>= 0.4.0)
+ rubocop-rails (2.20.2)
+ activesupport (>= 4.2.0)
+ rack (>= 1.1)
+ rubocop (>= 1.33.0, < 2.0)
+ rubocop-rspec (2.22.0)
+ rubocop (~> 1.33)
+ rubocop-capybara (~> 2.17)
+ rubocop-factory_bot (~> 2.22)
+ ruby-progressbar (1.13.0)
+ simplecov (0.22.0)
+ docile (~> 1.1)
+ simplecov-html (~> 0.11)
+ simplecov_json_formatter (~> 0.1)
+ simplecov-html (0.12.3)
+ simplecov_json_formatter (0.1.4)
+ tzinfo (2.0.6)
+ concurrent-ruby (~> 1.0)
+ unicode-display_width (2.4.2)
+ unparser (0.6.8)
+ diff-lcs (~> 1.3)
+ parser (>= 3.2.0)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ benchmark-memory (~> 0.2.0)
+ bundler (~> 2.2)
+ gitlab-styles (~> 10.1.0)
+ ipynbdiff!
+ pry (~> 0.14)
+ rake (~> 13.0)
+ rspec (~> 3.10)
+ rspec-parameterized (~> 1.0)
+ simplecov (~> 0.22.0)
+
+BUNDLED WITH
+ 2.3.16
diff --git a/vendor/gems/ipynbdiff/LICENSE b/gems/ipynbdiff/LICENSE
index e6de2f90864..e6de2f90864 100644
--- a/vendor/gems/ipynbdiff/LICENSE
+++ b/gems/ipynbdiff/LICENSE
diff --git a/vendor/gems/ipynbdiff/README.md b/gems/ipynbdiff/README.md
index f046f678a4d..f046f678a4d 100644
--- a/vendor/gems/ipynbdiff/README.md
+++ b/gems/ipynbdiff/README.md
diff --git a/gems/ipynbdiff/ipynbdiff.gemspec b/gems/ipynbdiff/ipynbdiff.gemspec
new file mode 100644
index 00000000000..8bc3e1b142d
--- /dev/null
+++ b/gems/ipynbdiff/ipynbdiff.gemspec
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+$LOAD_PATH.push File.expand_path('lib', __dir__ || '')
+
+require_relative 'lib/ipynb_diff/version'
+
+Gem::Specification.new do |s|
+ s.name = 'ipynbdiff'
+ s.version = IpynbDiff::Version::VERSION
+ s.summary = 'Human Readable diffs for Jupyter Notebooks'
+ s.description = 'Better diff for Jupyter Notebooks by first preprocessing them and removing clutter'
+ s.authors = ['Eduardo Bonet']
+ s.email = 'ebonet@gitlab.com'
+ # Specify which files should be added to the gem when it is released.
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
+ s.files = Dir['lib/**/*.rb']
+ s.require_paths = ["lib"]
+ s.required_ruby_version = ">= 3.0"
+ s.homepage = 'https://gitlab.com/gitlab-org/gitlab/-/tree/master/gems/ipynbdiff'
+ s.license = 'MIT'
+
+ s.add_runtime_dependency 'diffy', '~> 3.4'
+ s.add_runtime_dependency 'oj', '~> 3.13.16'
+
+ s.add_development_dependency 'benchmark-memory', '~>0.2.0'
+ s.add_development_dependency 'bundler', '~> 2.2'
+ s.add_development_dependency 'gitlab-styles', '~> 10.1.0'
+ s.add_development_dependency 'pry', '~> 0.14'
+ s.add_development_dependency 'rake', '~> 13.0'
+ s.add_development_dependency 'rspec', '~> 3.10'
+ s.add_development_dependency 'rspec-parameterized', '~> 1.0'
+ s.add_development_dependency 'simplecov', '~> 0.22.0'
+end
diff --git a/gems/ipynbdiff/lib/ipynb_diff.rb b/gems/ipynbdiff/lib/ipynb_diff.rb
new file mode 100644
index 00000000000..605ff6e4a75
--- /dev/null
+++ b/gems/ipynbdiff/lib/ipynb_diff.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+require 'ipynb_diff/transformer'
+require 'ipynb_diff/diff'
+require 'ipynb_diff/symbol_map'
+
+# Human Readable Jupyter Diffs
+module IpynbDiff
+ def self.diff(from, to, raise_if_invalid_nb: false, include_frontmatter: false, hide_images: false, diffy_opts: {})
+ transformer = Transformer.new(include_frontmatter: include_frontmatter, hide_images: hide_images)
+
+ Diff.new(transformer.transform(from), transformer.transform(to), diffy_opts)
+ rescue InvalidNotebookError
+ raise if raise_if_invalid_nb
+ end
+
+ def self.transform(notebook, raise_errors: false, include_frontmatter: true, hide_images: false)
+ return unless notebook
+
+ Transformer.new(include_frontmatter: include_frontmatter, hide_images: hide_images).transform(notebook).as_text
+ rescue InvalidNotebookError
+ raise if raise_errors
+ end
+end
diff --git a/vendor/gems/ipynbdiff/lib/diff.rb b/gems/ipynbdiff/lib/ipynb_diff/diff.rb
index 3554ac55d99..3554ac55d99 100644
--- a/vendor/gems/ipynbdiff/lib/diff.rb
+++ b/gems/ipynbdiff/lib/ipynb_diff/diff.rb
diff --git a/gems/ipynbdiff/lib/ipynb_diff/output_transformer.rb b/gems/ipynbdiff/lib/ipynb_diff/output_transformer.rb
new file mode 100644
index 00000000000..95dbcecf95c
--- /dev/null
+++ b/gems/ipynbdiff/lib/ipynb_diff/output_transformer.rb
@@ -0,0 +1,73 @@
+# frozen_string_literal: true
+
+require 'ipynb_diff/symbolized_markdown_helper'
+
+module IpynbDiff
+ # Transforms Jupyter output data into markdown
+ class OutputTransformer
+ include SymbolizedMarkdownHelper
+
+ HIDDEN_IMAGE_OUTPUT = ' [Hidden Image Output]'
+
+ ORDERED_KEYS = {
+ 'execute_result' => %w[image/png image/svg+xml image/jpeg text/markdown text/latex text/plain],
+ 'display_data' => %w[image/png image/svg+xml image/jpeg text/markdown text/latex],
+ 'stream' => %w[text]
+ }.freeze
+
+ def initialize(hide_images = false)
+ @hide_images = hide_images
+ end
+
+ def transform(output, symbol)
+ case (output_type = output['output_type'])
+ when 'error'
+ transform_error(output['traceback'], symbol / 'traceback')
+ when 'execute_result', 'display_data'
+ transform_non_error(ORDERED_KEYS[output_type], output['data'], symbol / 'data')
+ when 'stream'
+ transform_element('text', output['text'], symbol)
+ end
+ end
+
+ def transform_error(traceback, symbol)
+ traceback.map.with_index do |t, idx|
+ t.split("\n").map do |l|
+ ___(symbol / idx, l.gsub(/\[[0-9][0-9;]*m/, '').sub("\u001B", ' ').delete("\u001B").rstrip)
+ end
+ end
+ end
+
+ def transform_non_error(accepted_keys, elements, symbol)
+ accepted_keys.filter { |key| elements.key?(key) }.map do |key|
+ transform_element(key, elements[key], symbol)
+ end
+ end
+
+ def transform_element(output_type, output_element, symbol_prefix)
+ new_symbol = symbol_prefix / output_type
+ case output_type
+ when 'image/png', 'image/jpeg'
+ transform_image("#{output_type};base64", output_element, new_symbol)
+ when 'image/svg+xml'
+ transform_image("#{output_type};utf8", output_element, new_symbol)
+ when 'text/markdown', 'text/latex', 'text/plain', 'text'
+ transform_text(output_element, new_symbol)
+ end
+ end
+
+ def transform_image(image_type, image_content, symbol)
+ return ___(nil, HIDDEN_IMAGE_OUTPUT) if @hide_images
+
+ lines = image_content.is_a?(Array) ? image_content : [image_content]
+
+ single_line = lines.map(&:strip).join.gsub(/\s+/, ' ')
+
+ ___(symbol, " ![](data:#{image_type},#{single_line})")
+ end
+
+ def transform_text(text_content, symbol)
+ symbolize_array(symbol, text_content) { |l| " #{l.rstrip}" }
+ end
+ end
+end
diff --git a/gems/ipynbdiff/lib/ipynb_diff/symbol_map.rb b/gems/ipynbdiff/lib/ipynb_diff/symbol_map.rb
new file mode 100644
index 00000000000..383f1de5c18
--- /dev/null
+++ b/gems/ipynbdiff/lib/ipynb_diff/symbol_map.rb
@@ -0,0 +1,109 @@
+# frozen_string_literal: true
+
+module IpynbDiff
+ require 'oj'
+
+ # Creates a map from a symbol to the line number it appears in a Json file
+ #
+ # Example:
+ #
+ # Input:
+ #
+ # 1. {
+ # 2. 'obj1': [
+ # 3. {
+ # 4. 'obj2': 5
+ # 5. },
+ # 6. 3,
+ # 7. {
+ # 8. 'obj3': {
+ # 9. 'obj4': 'b'
+ # 10. }
+ # 11. }
+ # 12. ]
+ # 13.}
+ #
+ # Output:
+ #
+ # Symbol Line Number
+ # .obj1 -> 2
+ # .obj1.0 -> 3
+ # .obj1.0 -> 3
+ # .obj1.0.obj2 -> 4
+ # .obj1.1 -> 6
+ # .obj1.2 -> 7
+ # .obj1.2.obj3 -> 8
+ # .obj1.2.obj3.obj4 -> 9
+ #
+ class SymbolMap
+ # rubocop:disable Lint/UnusedMethodArgument
+ class << self
+ def handler
+ @handler ||= SymbolMap.new
+ end
+
+ def parser
+ @parser ||= Oj::Parser.new(:saj).tap { |p| p.handler = handler }
+ end
+
+ def parse(notebook, *args)
+ handler.reset
+ parser.parse(notebook)
+ handler.symbols
+ end
+ end
+
+ attr_accessor :symbols
+
+ def hash_start(key, line, column)
+ add_symbol(key_or_index(key), line)
+ end
+
+ def hash_end(key, line, column)
+ @current_path.pop
+ end
+
+ def array_start(key, line, column)
+ @current_array_index << 0
+
+ add_symbol(key, line)
+ end
+
+ def array_end(key, line, column)
+ @current_path.pop
+ @current_array_index.pop
+ end
+
+ def add_value(value, key, line, column)
+ add_symbol(key_or_index(key), line)
+
+ @current_path.pop
+ end
+
+ def add_symbol(symbol, line)
+ @symbols[@current_path.append(symbol).join('.')] = line if symbol
+ end
+
+ def key_or_index(key)
+ if key.nil? # value in an array
+ if @current_path.empty?
+ @current_path = ['']
+ return
+ end
+
+ symbol = @current_array_index.last
+ @current_array_index[-1] += 1
+ symbol
+ else
+ key
+ end
+ end
+
+ def reset
+ @current_path = []
+ @symbols = {}
+ @current_array_index = []
+ end
+ # rubocop:enable Lint/UnusedMethodArgument
+ end
+end
diff --git a/gems/ipynbdiff/lib/ipynb_diff/symbolized_markdown_helper.rb b/gems/ipynbdiff/lib/ipynb_diff/symbolized_markdown_helper.rb
new file mode 100644
index 00000000000..991c9e493bc
--- /dev/null
+++ b/gems/ipynbdiff/lib/ipynb_diff/symbolized_markdown_helper.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module IpynbDiff
+ # Helper functions
+ module SymbolizedMarkdownHelper
+ def ___(symbol = nil, content = '')
+ { symbol: symbol, content: content }
+ end
+
+ def symbolize_array(symbol, content)
+ if content.is_a?(Array)
+ content.map.with_index { |l, idx| ___(symbol / idx, yield(l)) }
+ else
+ content.split("\n").map { |c| ___(symbol, c) }
+ end
+ end
+ end
+
+ # Simple wrapper for a string
+ class JsonSymbol < String
+ def /(other)
+ JsonSymbol.new((other.is_a?(Array) ? [self, *other] : [self, other]).join('.'))
+ end
+ end
+end
diff --git a/vendor/gems/ipynbdiff/lib/transformed_notebook.rb b/gems/ipynbdiff/lib/ipynb_diff/transformed_notebook.rb
index f98e5f68086..f98e5f68086 100644
--- a/vendor/gems/ipynbdiff/lib/transformed_notebook.rb
+++ b/gems/ipynbdiff/lib/ipynb_diff/transformed_notebook.rb
diff --git a/gems/ipynbdiff/lib/ipynb_diff/transformer.rb b/gems/ipynbdiff/lib/ipynb_diff/transformer.rb
new file mode 100644
index 00000000000..2b386168b5d
--- /dev/null
+++ b/gems/ipynbdiff/lib/ipynb_diff/transformer.rb
@@ -0,0 +1,111 @@
+# frozen_string_literal: true
+
+require 'json'
+require 'yaml'
+require 'ipynb_diff/output_transformer'
+require 'ipynb_diff/symbolized_markdown_helper'
+require 'ipynb_diff/symbol_map'
+require 'ipynb_diff/transformed_notebook'
+require 'oj'
+
+module IpynbDiff
+ InvalidNotebookError = Class.new(StandardError)
+
+ # Returns a markdown version of the Jupyter Notebook
+ class Transformer
+ include SymbolizedMarkdownHelper
+
+ @include_frontmatter = true
+
+ def initialize(include_frontmatter: true, hide_images: false)
+ @include_frontmatter = include_frontmatter
+ @hide_images = hide_images
+ @out_transformer = OutputTransformer.new(hide_images)
+ end
+
+ def validate_notebook(notebook)
+ notebook_json = Oj::Parser.usual.parse(notebook)
+
+ return notebook_json if notebook_json&.key?('cells')
+
+ raise InvalidNotebookError
+ rescue EncodingError, Oj::ParseError, JSON::ParserError
+ raise InvalidNotebookError
+ end
+
+ def transform(notebook)
+ return TransformedNotebook.new unless notebook
+
+ notebook_json = validate_notebook(notebook)
+ transformed = transform_document(notebook_json)
+ symbol_map = SymbolMap.parse(notebook)
+
+ TransformedNotebook.new(transformed, symbol_map)
+ end
+
+ def transform_document(notebook)
+ symbol = JsonSymbol.new('.cells')
+
+ transformed_blocks = notebook['cells'].map.with_index do |cell, idx|
+ decorate_cell(transform_cell(cell, notebook, symbol / idx), cell, symbol / idx)
+ end
+
+ transformed_blocks.prepend(transform_metadata(notebook)) if @include_frontmatter
+ transformed_blocks.flatten
+ end
+
+ def decorate_cell(rows, cell, symbol)
+ tags = cell['metadata']&.fetch('tags', [])
+ type = cell['cell_type'] || 'raw'
+
+ [
+ ___(symbol, %(%% Cell type:#{type} id:#{cell['id']} tags:#{tags&.join(',')})),
+ ___,
+ rows,
+ ___
+ ]
+ end
+
+ def transform_cell(cell, notebook, symbol)
+ cell['cell_type'] == 'code' ? transform_code_cell(cell, notebook, symbol) : transform_text_cell(cell, symbol)
+ end
+
+ def transform_code_cell(cell, notebook, symbol)
+ [
+ ___(symbol / 'source', %(``` #{notebook.dig('metadata', 'kernelspec', 'language') || ''})),
+ symbolize_array(symbol / 'source', cell['source'], &:rstrip),
+ ___(nil, '```'),
+ transform_outputs(cell['outputs'], symbol)
+ ]
+ end
+
+ def transform_outputs(outputs, symbol)
+ transformed = outputs.map
+ .with_index { |output, i| @out_transformer.transform(output, symbol / ['outputs', i]) }
+ .compact
+ .map { |el| [___, el] }
+
+ [
+ transformed.empty? ? [] : [___, ___(symbol / 'outputs', '%% Output')],
+ transformed
+ ]
+ end
+
+ def transform_text_cell(cell, symbol)
+ symbolize_array(symbol / 'source', cell['source'], &:rstrip)
+ end
+
+ def transform_metadata(notebook_json)
+ as_yaml = {
+ 'jupyter' => {
+ 'kernelspec' => notebook_json['metadata']['kernelspec'],
+ 'language_info' => notebook_json['metadata']['language_info'],
+ 'nbformat' => notebook_json['nbformat'],
+ 'nbformat_minor' => notebook_json['nbformat_minor']
+ }
+ }.to_yaml
+
+ as_yaml.split("\n").map { |l| ___(nil, l) }.append(___(nil, '---'), ___)
+ end
+ end
+end
diff --git a/gems/ipynbdiff/lib/ipynb_diff/version.rb b/gems/ipynbdiff/lib/ipynb_diff/version.rb
new file mode 100644
index 00000000000..1a407f9c0fa
--- /dev/null
+++ b/gems/ipynbdiff/lib/ipynb_diff/version.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+module IpynbDiff
+ module Version
+ VERSION = '0.4.7'
+ end
+end
diff --git a/gems/ipynbdiff/spec/benchmark.rb b/gems/ipynbdiff/spec/benchmark.rb
new file mode 100644
index 00000000000..514c8700183
--- /dev/null
+++ b/gems/ipynbdiff/spec/benchmark.rb
@@ -0,0 +1,68 @@
+# frozen_string_literal: true
+
+require 'ipynbdiff'
+require 'benchmark'
+require 'benchmark/memory'
+require_relative 'test_helper'
+
+# rubocop:disable Layout/LineLength
+large_cell = '{
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "24f32781-48bf-4378-b30c-ccdce7b05ba0",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABj0AAAHwCAYAAAD91q10AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAA9hAAAPYQGoP6dpAABPSUlEQVR4nO39eZCfd34f+L2fxkmAAAiCBO/7PobHkCAxIEjcV/eWHTl/yOVKvFaloo3kTZXjlKUa2bVS4tiyna2JElmudaUqK+0m9m4ceVVxutEAiIMXeIEEObyG4PC+QPAEQIA4+8kfD1pf/DgkhwC78XT/+vWqYmHQnybxLml6COCNz/dT1XUdAAAAAACA8a6n7QAAAAAAAAAjQekBAAAAAAB0BaUHAAAAAADQFZQeAAAAAABAV1B6AAAAAAAAXUHpAQAAAAAAdAWlBwAAAAAA0BUmtx3g66qqqpJcnGR/21kAAAAAAIAxYVaSD+q6rr/rk8Zc6ZGm8Hiv7RAAAAAAAMCYcmmS97/rE8Zi6bE/Sd59993Mnj277SwAAAAAAECL9u3bl8suuyz5Hi9EjcXSI0kye/ZspQcAAAAAAPC9OWQOAAAAAAB0BaUHAAAAAADQFZQeAAAAAABAV1B6AAAAAAAAXUHpAQAAAAAAdAWlBwAAAAAA0BWUHgAAAAAAQFdQegAAAAAAAF1B6QEAAAAAAHQFpQcAAAAAANAVlB4AAAAAAEBXUHoAAAAAAABdQekBAAAAAAB0BaUHAAAAAADQFZQeAAAAAABAV1B6AAAAAAAAXeGUSo+qqn5aVdXTVVXtr6pqT1VVf1VV1Q1f+5w/r6qq/tpfT4xsbAAAAAAA6DKffJJs2dJ2inFt8il+/pIkf5bk6RN/7z9LsrGqqpvruj5w0ucNJvmtk75/5AelBAAAAACAblPXyXPPJf39ycBA8sQTyfTpyaefJmed1Xa6cemUSo+6rtee/P2qqn4ryZ4kdyV5+KTR4bqud//weAAAAAAA0EX27082by5FxwcfdM6vvz55773kuuvayTfOneqmx9fNOfHtZ1/7+NKqqvYk+SLJQ0n+cV3Xe77pH1BV1bQk00760KwfmAkAAAAAAMaO115rSo7+/uThh5MjJz2ONGNGsnJl0teX9PYml17aXs4ucNqlR1VVVZKfJXm0rusXTxqtT/Ifkryd5Kok/zTJlqqq7qrr+vA3/KN+muQPTzcHAAAAAACMKYcPN+XG8DbHa691zq+5pik5+vqSBx5onrRiRFR1XZ/e31hVf5akL8niuq7f+47PuyhNAfK367r+j98w/6ZNj/f27t2b2bNnn1Y2AAAAAAA4o95/vyk4BgaSTZuSAyedwZ4ypSk3enubouP665Oqai/rOLNv377MmTMnSebUdb3vuz73tDY9qqr60yR/I8kD31V4JEld1x9WVfV2km98gOzE9sdfb4BU/h8NAAAAAMBYd/x48tRT5dmq557rnF94YSk5Vq5M/CH/M+KUSo8TT1r9aZLfSLK0rus3v8ffMy/JZUk+PK2EAAAAAAAwFnz2WbJhQ1NyDA4mn35aZlWV3HNPebbqjjuSnp7Wok5Up7rp8WdJ/k6Sv5lkf1VVF574+N66rr+qqursJH+U5C/TlBxXJvnnST5J8j+NRGAAAAAAADgj6jp54YXmyar+/mT79mRoqMznzEnWrGlKjrVrk/nz28tKklMvPX7nxLfbvvbx30ry50mOJ/lRkr+b5Jw0xcfWJL9Z1/X+0w0JAAAAAABnxIEDyZYt5Qj5u+92zm+5pWxzLFqUTD6tKxKMklP6/0Zd1995cKOu66+SrPlBiQAAAAAA4Ex6441ym2PbtuTw4TKbPj1ZsaIpOXp7kyuuaC0mv54KCgAAAACAieXo0eTRR0vR8YtfdM6vuKJscyxblpx1Vjs5OWVKDwAAAAAAut/u3cn69U3JsWlTsm9fmU2alCxeXIqOm25qDpMz7ig9AAAAAADoPkNDyY4d5Qj5jh2d8/PPb56r6u1NVq9OzjmnlZiMLKUHAAAAAADdYe/eZOPGpuRYvz7Zs6dzfvfdTcnR19f8556ednIyapQeAAAAAACMT3WdvPJKU3IMDDR3Oo4dK/NZs5otjr6+ZN265MIL28vKGaH0AAAAAABg/Pjqq2TbtnKE/K23Ouc33lhuc9x3XzJ1ahspaYnSAwAAAACAse2dd8o2x+bNTfExbNq0ZNmy8mzV1Ve3l5PWKT0AAAAAABhbjh1LHn+8bHO8+GLn/NJLyzbH8uXJzJnt5GTMUXoAAAAAANC+jz9OBgebkmPDhuSLL8qspydZtKgUHbfemlRVa1EZu5QeAAAAAACceXWd7NxZtjmeeqr52LB585K1a5uSY82a5Nxz28vKuKH0AAAAAADgzNi/P9m0qbnNMTCQfPhh5/yOO8o2xz33JJMmtRKT8UvpAQAAAADA6Nm1q2xzPPxwcvRomc2cmaxa1ZQc69Yll1zSXk66gtIDAAAAAICRc/hw8tBDTckxMJD88ped82uvLdscDzyQTJvWTk66ktIDAAAAAIAf5v33m4Kjvz958MHkwIEymzIlWbKkFB3XXddeTrqe0gMAAAAAgFNz/Hjy5JPl2arnn++cX3RR0tvblBwrVyazZrWTkwlH6QEAAAAAwK/32WfJ4GBTcgwONt8fVlXJvfeWbY477mg+BmeY0gMAAAAAgF9V18kLL5RtjscfT4aGyvycc5K1a5uNjrVrk/PPby0qDFN6AAAAAADQOHAg2by5HCF/773O+a23lm2On/wkmey3mBlb/DcSAAAAAGAie/31coR827bk8OEyO+usZMWKZpujtze54orWYsL3ofQAAAAAAJhIjhxJHn20PFv16qud8yuvLNscS5c2xQeME0oPAAAAAIBut3t3s80xMJBs3Jjs319mkycnixeXouPGGx0hZ9xSegAAAAAAdJuhoWTHjrLN8cwznfP588uTVatXJ3PmtJMTRpjSAwAAAACgG3zxRbPFMTCQrF+f7NnTOb/77rLNcdddSU9PKzFhNCk9AAAAAADGo7pOXnmlbHM8+mhy/HiZz57dbHH09ibr1iUXXtheVjhDlB4AAAAAAOPFV18lW7c2JcfAQPLWW53zG28s2xz33ZdMndpKTGiL0gMAAAAAYCx7++1ScmzZ0hQfw6ZNS5Yta7Y5+vqSq69uLyeMAUoPAAAAAICx5NixZPv28mzVSy91zi+9tGxzLF+ezJzZTk4Yg5QeAAAAAABt+/jj5vh4f3+yYUOyd2+Z9fQkixaVouPWW5Oqai8rjGFKDwAAAACAM21oKNm5s2xzPP10c5h82Lx5zfHxvr7mGPm557aXFcYRpQcAAAAAwJmwb1/y4IPlPsfu3Z3zO+8stznuuSeZNKmdnDCOKT0AAAAAAEZDXSe7dpVtjkceSY4eLfOZM5NVq5qSo7c3ufji9rJCl1B6AAAAAACMlEOHkoceKtscr7/eOb/uunKb4/77k2nT2skJXUrpAQAAAADwQ7z3XlNw9Pc3z1cdPFhmU6cmS5aUZ6uuu669nDABKD0AAAAAAE7F8ePJE0+UZ6t+/vPO+cUXl5Jj5crk7LPbyQkTkNIDAAAAAODX+fTTZHCw2egYHEw++6zMqipZuLA8W3X77c3HgDNO6QEAAAAA8HV13WxwDG9zPPFEMjRU5nPnJmvXNhsda9cm553XXlbgryk9AAAAAACS5Msvk82bm22OgYHmVsfJfvSjss2xcGEy2W+vwljjqxIAAAAAmLhef71sc2zblhw5UmZnndXc5Ojtbf66/PLWYgLfj9IDAAAAAJg4jhxJHnmkFB27dnXOr7qqbHMsXZpMn95KTOD0KD0AAAAAgO724YflyapNm5L9+8ts8uTk/vubTY6+vuTGGx0hh3FM6QEAAAAAdJehoeTpp8s2x7PPds7nzy8lx6pVyZw57eQERpzSAwAAAAAY/774ItmwoSk5BgeTjz/unC9Y0JQcvb3JXXclPT2txARGl9IDAAAAABh/6jp56aXmyar+/uSxx5Ljx8t89uxk9eqm6Fi3LrnggvayAmeM0gMAAAAAGB8OHky2bm1KjoGB5O23O+c33VSOkN93XzJlSjs5gdYoPQAAAACAseutt8ptjq1bk0OHymzatGT58vJs1VVXtRYTGBuUHgAAAADA2HH0aLJ9eyk6Xn65c37ZZWWbY/nyZMaMdnICY5LSAwAAAABo1549yfr1TcmxcWOyd2+ZTZqULFpUio5bbkmqqr2swJim9AAAAAAAzqyhoeTZZ8s2x44dzWHyYeed1xwf7+1N1qxJ5s5tLyswrig9AAAAAIDRt29fsmlTOUL+0Ued8x//uCk5+vqSBQuaDQ+AU6T0AAAAAABGXl0nr75atjkeeSQ5dqzMzz47WbWqKTnWrUsuvri9rEDXUHoAAAAAACPj0KFk27ayzfHGG53z668v2xz3359Mm9ZKTKB7KT0AAAAAgNP37rtNwdHfn2zenBw8WGZTpyZLl5ai49prW4sJTAxKDwAAAADg+zt2LHniifJs1QsvdM4vvrgpOPr6khUrmmesAM4QpQcAAAAA8N0++STZsKEpOQYHk88/L7OenmThwrLNcfvtSVW1lxWY0JQeAAAAAECnuk6ef75sczz5ZDI0VOZz5yZr1zYlx5o1yXnntZcV4CRKDwAAAAAg+fLL5MEHyxHyDz7onN92W1Ny9PY2mx2T/dYiMPb4XyYAAAAAmKh++cuyzfHQQ8mRI2U2Y0Zzk2O46LjssvZyAnxPSg8AAAAAmCiOHEkefrhsc+za1Tm/+upyhHzJkmT69HZyApwmpQcAAAAAdLMPPkjWr2+Kjk2bmmeshk2enNx/fyk6brjBEXJgXFN6AAAAAEA3OX48efrp8mzVzp2d8wsuaJ6r6utLVq1KZs9uJyfAKFB6AAAAAMB49/nnyYYNTckxOJh88kmZVVWyYEG5zfHjHyc9Pe1lBRhFSg8AAAAAGG/qOnnppbLNsX17s+ExbM6cZM2apuRYty6ZP7+9rABnkNIDAAAAAMaDgweTLVvKEfJ33umc33xzuc2xaFEyZUo7OQFapPQAAAAAgLHqzTdLybF1a3LoUJlNn54sX16erbryytZiAowVSg8AAAAAGCuOHk0efbQpOfr7k1de6ZxffnnZ5li2LJkxo52cAGOU0gMAAAAA2vTRR8n69U3JsXFjsm9fmU2alNx3Xyk6br65OUwOwDdSegAAAADAmTQ0lDzzTDlCvmNH5/z885vj4319yapVydy57eQEGIeUHgAAAAAw2vbuTTZtakqO9eub7Y6T3XVXc5ejry9ZsCDp6WknJ8A4p/QAAAAAgJFW18kvflG2OR59NDl2rMxnzWq2OPr6mq2Oiy5qLytAF1F6AAAAAMBIOHQo2bq1HCF/883O+Q03NCVHb29y//3J1Knt5AToYkoPAAAAADhd775btjk2b06++qrMpk5Nli4tR8ivuaa1mAATxSmVHlVV/TTJ30pyY5KvkmxP8vt1Xb960udUSf4wyW8nmZvkySR/v67rl0YqNAAAAAC04tix5PHHyzbHCy90zi+5pGxzrFiRnH12OzkBJqhT3fRYkuTPkjx94u/9Z0k2VlV1c13XB058zu8l+YdJ/l6SXUn+SZJNVVXdUNf1/hFJDQAAAABnyiefJIODTcmxYUPy+edl1tOTLFxYtjluuy2pqvayAkxwVV3Xp/83V9X5SfYkWVLX9cMntjw+SPIndV3/yxOfMy3JR2k2Qv7t9/hnzk6yd+/evZk9e/ZpZwMAAACA01LXyXPPNSXHwEDyxBPNx4ade26ydm1TcqxZk8yb11pUgIlg3759mTNnTpLMqet633d97g+96THnxLefnfj2qiQXJtk4/Al1XR+uquqhJIuS/ErpcaIUmXbSh2b9wEwAAAAAcGr2729ucgwXHR980Dm/7bayzXHvvclkp3IBxqLT/l/nE1sdP0vyaF3XL5748IUnvv3oa5/+UZIrvuUf9dM0N0AAAAAA4Mx57bVyhPzhh5MjR8psxoxk5cpyn+PSS9vLCcD39kMq6X+d5LYki79h9vU3s6pv+NiwP05TngybleS9H5ALAAAAAH7V4cNNuTG8zfHaa53za64pJceSJcn06e3kBOC0nVbpUVXVnyb5G0keqOv65IJi94lvL0zy4Ukfn59f3f5I0jx/leTwSf/s04kEAAAAAL/q/feT9eubouPBB5MvvyyzyZOTBx4oz1Zdf70j5ADj3CmVHieetPrTJL+RZGld129+7VPeTFN8rEqy88TfMzXJkiS//4PTAgAAAMB3OX48eeqp8mzVc891zi+8sNnk6Otrnq+aPbuVmACMjlPd9PizJH8nyd9Msr+qquEbHnvruv6qruu6qqo/SfIHVVW9luS1JH+Q5GCSfzdCmQEAAACg+OyzZMOGpuQYHEw+/bTMqiq5557ybNWddyY9Pe1lBWBUnWrp8Tsnvt32tY//VpI/P/Gf/1WSs5L8myRzkzyZZHVd1/tPLyIAAAAAnKSukxdeaO5y9Pcn27cnQ0NlPmdOsmZNU3SsXZvMn99eVgDOqKquv+2+eDuqqpqdZO/evXsz23ohAAAAAEly4ECyZUs5Qv7uu53zW24ptzkWLWrudQDQFfbt25c5c+YkyZy6rvd91+f6X38AAAAAxqY33ii3ObZtSw4fLrPp05MVK8qzVVdc0VpMAMYOpQcAAAAAY8ORI8ljj5Wi4xe/6JxfcUXZ5li2LDnrrHZyAjBmKT0AAAAAaM/u3cn69U3JsXFjsv+ks7CTJiWLF5ei46abmsPkAPAtlB4AAAAAnDlDQ8mOHeU2x44dnfPzz2+eq+rtTVavTs45p5WYAIxPSg8AAAAARtcXXySbNjVFx/r1yZ49nfO77irbHHffnfT0tBITgPFP6QEAAADAyKrr5JVXym2Oxx5Ljh0r81mzmi2Ovr5k3brkwgvbywpAV1F6AAAAAPDDffVVsm1bKTreeqtzfsMNZZtj8eJk6tQ2UgLQ5ZQeAAAAAJyed94pJceWLU3xMWzatGTp0qbk6O1NrrmmtZgATBxKDwAAAAC+n2PHku3byxHyF1/snF96aSk5VqxIZs5sJycAE5bSAwAAAIBv9/HHyeBgU3Rs2NAcJR/W05P85Cfl2aof/SipqtaiAoDSAwAAAICirpOdO8s2x5NPNh8bdu65zfHxvr7mGPm8ee1lBYCvUXoAAAAATHT79ycPPliKjg8/7JzffnvZ5rj33mTSpHZyAsCvofQAAAAAmIh27SpHyB9+ODl6tMxmzkxWrmxKjnXrmlsdADAOKD0AAAAAJoLDh5tyY7jo+OUvO+fXXFO2OZYsSaZNaycnAPwASg8AAACAbvX++81zVf39zfNVBw6U2ZQpyQMPlKLj+uvbywkAI0TpAQAAANAtjh9vDo8PFx3PPdc5v+iipLe3KTlWrkxmzWolJgCMFqUHAAAAwHj22WfJhg1NyTE4mHz6aZlVVXLPPWWb4447kp6e1qICwGhTegAAAACMJ3WdvPBCuc3x+OPJ0FCZn3NOsmZNU3KsXZucf35rUQHgTFN6AAAAAIx1Bw4kmzc3JcfAQPLee53zW29tSo7e3mTRomSy3/IBYGLyb0AAAACAsej118ttjm3bksOHy+yss5Lly0vRccUVrcUEgLFE6QEAAAAwFhw5kjz6aHm26tVXO+dXXllucyxd2hQfAEAHpQcAAABAW3bvbrY5BgaSjRuT/fvLbPLkZPHiZpOjry+56abmMDkA8K2UHgAAAABnytBQ8vTT5dmqZ57pnM+fn6xb15Qcq1cnc+a0kxMAximlBwAAAMBo+uKLZoujvz9Zvz75+OPO+d13l2er7ror6elpJSYAdAOlBwAAAMBIquvk5ZfLbY7HHkuOHy/z2bObLY7e3mar48IL28sKAF1G6QEAAADwQ331VbJ1ayk63n67c37jjWWb4777kqlT28kJAF1O6QEAAABwOt5+u5QcW7Ykhw6V2bRpybJl5Qj51Ve3lxMAJhClBwAAAMD3cexYsn17KTpeeqlzfumlZZtj+fJk5sx2cgLABKb0AAAAAPg2H3/cHB/v7082bEj27i2znp5k0aJSdNx6a1JV7WUFAJQeAAAAAH9taCjZuTMZGGiKjqeeag6TD5s3L1m7tik51qxJzj23vawAwK9QegAAAAAT2/79yaZNTckxMJDs3t05v+OOss1xzz3JpEmtxAQAfj2lBwAAADCx1HWya1fZ5nj44eTo0TKfOTNZtaopOdatSy65pL2sAMApUXoAAAAA3e/w4eShh8oR8tdf75xfd11TcvT2Jg88kEyb1k5OAOAHUXoAAAAA3en998uTVQ8+mBw4UGZTpiRLlpRnq667rr2cAMCIUXoAAAAA3eH48eTJJ8s2x/PPd84vvrjZ5OjrS1asSGbNaicnADBqlB4AAADA+PXZZ8ngYFNyDA423x9WVcnCheXZqjvuaD4GAHQtpQcAAAAwftR18vOfl2erHn88GRoq83POSdaubYqOtWuT885rLSoAcOYpPQAAAICx7cCBZPPmUnS8917n/Ec/Krc5Fi5MJvvtDgCYqPwsAAAAABh7Xn+93ObYti05cqTMzjorWbmyebKqtze5/PLWYgIAY4vSAwAAAGjfkSPJI4+UomPXrs75VVeVbY6lS5Pp01uJCQCMbUoPAAAAoB0ffpisX9+UHJs2Jfv3l9nkycn99zebHH19yY03OkIOAPxaSg8AAADgzBgaSp5+umxzPPts53z+/FJyrFqVzJnTTk4AYNxSegAAAACj54svkg0bmpJjcDD5+OPO+YIFTcnR25vcdVfS09NKTACgOyg9AAAAgJFT18nLL5dtjsceS44fL/PZs5PVq5uiY9265IIL2ssKAHQdpQcAAADwwxw8mGzd2pQcAwPJ2293zm+6qRwhv+++ZMqUdnICAF1P6QEAAACcurfeagqO/v5ky5bk0KEymzYtWbasFB1XXdVaTABgYlF6AAAAAL/e0aPJ9u3l2aqXX+6cX3ZZKTmWL09mzGgnJwAwoSk9AAAAgG+2Z0+yfn2z0bFhQ7J3b5lNmpQsWlSOkN96a1JV7WUFAIjSAwAAABg2NJTs3Fm2OZ5+ujlMPmzevOb4eF9fsmZNMndue1kBAL6B0gMAAAAmsn37kk2bmpJj/fpk9+7O+Z13lmerFixoNjwAAMYopQcAAABMJHWd7NpVtjkeeaS51zHs7LOTVauaJ6t6e5OLL24vKwDAKVJ6AAAAQLc7dCh56KFSdLzxRuf8uuvKNsf99yfTprWTEwDgB1J6AAAAQDd6772m4BgYSB58MDl4sMymTk2WLClHyK+7rr2cAAAjSOkBAAAA3eDYseTJJ8s2x89/3jm/+OKyzbFiRfOMFQBAl1F6AAAAwHj16afJ4GBTcmzYkHz2WZn19CQLFzabHH19ye23J1XVXlYAgDNA6QEAAADjRV0nzz/fPFnV35888UQyNFTmc+cma9c2JceaNcl557WXFQCgBUoPAAAAGMu+/DLZvLnc53j//c75bbeV2xwLFyaT/VIfAJi4/EwIAAAAxppf/rLc5njooeTIkTKbMaO5yTFcdFx2WXs5AQDGGKUHAAAAtO3IkeThh8uzVbt2dc6vvrocIV+yJJk+vZ2cAABjnNIDAAAA2vDhh6Xk2LSpecZq2OTJyQMPlG2OG25whBwA4HtQegAAAMCZcPx48vTT5TbHs892zi+4oCk4+vqSVauS2bPbyQkAMI4pPQAAAGC0fP55snFjU3SsX5988kmZVVWyYEHZ5vjxj5OenvayAgB0AaUHAAAAjJS6Tl56qRwh37692fAYNnt2smZNU3SsW5fMn99eVgCALqT0AAAAgB/i4MFky5Zyn+OddzrnN99cjpAvWpRMmdJOTgCACUDpAQAAAKfqrbfKNsfWrcmhQ2U2fXqyfHm5z3HllW2lBACYcJQeAAAA8OscPZo89lg5Qv7yy53zyy8v2xzLliUzZrSTEwBgglN6AAAAwDfZs6c5Pt7f3xwj37u3zCZNSu67r2xz3HJLc5gcAIBWKT0AAAAgSYaGkmefLc9W7djRHCYfdt55zfHxvr5k9epk7tz2sgIA8I2UHgAAAExc+/Y1WxwDA81fH33UOf/xj8uzVXff3Wx4AAAwZik9AAAAmDjqOnn11bLN8cgjybFjZX722cmqVU3JsW5dcvHF7WUFAOCUKT0AAADobocOJdu2lSPkb7zROb/++rLNcf/9ydSprcQEAOCHO+XSo6qqB5L8oyR3JbkoyW/Udf1XJ83/PMl//rW/7cm6rheefkwAAAA4Be++2xQc/f3J5s3JwYNlNnVqsnRpU3L09ibXXttaTAAARtbpbHrMTPJ8kv82yV9+y+cMJvmtk75/5DR+HAAAAPh+jh1LnniiPFv1wgud80suaQqOvr5kxYrmGSsAALrOKZcedV2vT7I+Saqq+rZPO1zX9e4fkAsAAAC+2yefJIODTcmxYUPy+edl1tOTLFxYnq267bbk238NCwBAlxitmx5Lq6rak+SLJA8l+cd1Xe/5pk+sqmpakmknfWjWKGUCAABgPKvr5Lnnym2OJ55oPjbs3HOTtWubjY61a5N581qLCgBAO0aj9Fif5D8keTvJVUn+aZItVVXdVdf14W/4/J8m+cNRyAEAAMB49+WXyYMPlqLjgw8657fdVrY57r03mTxaf7YPAIDxYMR/NljX9f940ndfrKpqR5oCpC/Jf/yGv+WPk/zspO/PSvLeSOcCAABgnHjttXKb4+GHkyMnnYmcMSNZubIcIb/00vZyAgAw5oz6H4Gp6/rDqqreTnLdt8wPJ/nrDZDvuBMCAABANzp8uCk3hrc5Xnutc3711WWbY8mSZPr0dnICADDmjXrpUVXVvCSXJflwtH8sAAAAxokPPmgKjv7+5vmqL78ss8mTkwceKEXH9dc7Qg4AwPdyyqVHVVVnJ7n2pA9dVVXVHUk+O/HXHyX5yzQlx5VJ/nmST5L8Tz8sKgAAAOPW8ePJU0+VbY6dOzvnF17YPFfV19c8XzV7djs5AQAY105n0+PuJFtP+v7wPY6/SPI7SX6U5O8mOSdN8bE1yW/Wdb3/9GMCAAAw7nz+ebJhQ1N0DA4mn3xSZlWVLFhQtjnuvDPp6WkvKwAAXeGUS4+6rrcl+a694jWnnQYAAIDxq66TF18sR8i3b0+Ghsp8zpxkzZqm5Fi7Npk/v72sAAB0pVG/6QEAAEAXO3gw2by53Od4993O+S23lGerFi1KpkxpJycAABOC0gMAAIBT8+abZZtj69bk8OEymz49Wb68KTl6e5Mrr2wtJgAAE4/SAwAAgO929Gjy6KNlm+OVVzrnV1xRbnMsXZrMmNFKTAAAUHoAAADwqz76KFm/vik5Nm5M9u0rs0mTkvvuK0XHzTc3h8kBAKBlSg8AAACag+PPPFOerdqxo3N+/vnJunXNk1WrVydz57aTEwAAvoPSAwAAYKLau7fZ4hgYaLY6Pvqoc37XXeU2x4IFSU9POzkBAOB7UnoAAABMFHXd3OMYvs3x6KPJsWNlPmtWsmpVU3SsW5dcdFF7WQEA4DQoPQAAALrZV18l27aVZ6veeqtzfsMN5TbH4sXJ1KltpAQAgBGh9AAAAOg277zTFBwDA8nmzU3xMWzq1GTZsvJs1TXXtJcTAABGmNIDAABgvDt2LHn88bLN8eKLnfNLL20Kjr6+ZMWKZObMdnICAMAoU3oAAACMRx9/nAwONiXHhg3JF1+UWU9P8pOflGerfvSjpKpaiwoAAGeK0gMAAGA8qOtk587ybNWTTzYfG3buuc3x8b6+ZPXqZN689rICAEBLlB4AAABj1f79yYMPlqLjww8757ffXrY57r03mTSpnZwAADBGKD0AAADGkl27Ssnx0EPJ0aNlNnNmsnJlOUJ+ySXt5QQAgDFI6QEAANCmw4eThx8uR8h/+cvO+bXXlpJjyZJk2rR2cgIAwDig9AAAADjT3n+/2eTo72+erzpwoMymTEkeeKA8W3X99e3lBACAcUbpAQAAMNqOH0+eeqpsczz3XOf8oouaTY6+vub5qlmzWokJAADjndIDAABgNHz2WbJhQ1NyDA4mn35aZlWV3HNP2ea4446kp6e1qAAA0C2UHgAAACOhrpMXXijPVm3fngwNlfk55yRr1jQlx9q1yfnntxYVAAC6ldIDAADgdB04kGzZ0pQcAwPJu+92zm+9tTxbtWhRMtkvwQAAYDT5GTcAAMCpeOONcptj27bk8OEyO+usZPnypuTo7U2uuKK1mAAAMBEpPQAAAL7LkSPJY4+VouMXv+icX3llKTmWLWuKDwAAoBVKDwAAgK/bvTtZv74pOTZuTPbvL7NJk5LFi8sR8ptuag6TAwAArVN6AAAADA0lO3aUbY5nnumcz5+frFvXlByrVjVHyQEAgDFH6QEAAExMX3zRbHEMDDRbHXv2dM7vvrs8W3X33UlPTysxAQCA70/pAQAATAx1nbzyStnmePTR5PjxMp81K1m9uik61q1LLrywvawAAMBpUXoAAADd66uvkq1bm5JjYCB5663O+Y03ltsc992XTJ3aSkwAAGBkKD0AAIDu8vbbpeTYsqUpPoZNm5YsW9Y8WdXXl1x9dXs5AQCAEaf0AAAAxrdjx5Lt28uzVS+91Dm/9NKyzbF8eTJzZjs5AQCAUaf0AAAAxp+PP26Oj/f3Jxs2JHv3lllPT7JoUSk6br01qar2sgIAAGeM0gMAABj7hoaSnTubJ6v6+5OnnmoOkw+bNy9Zu7YpOdasSc49t72sAABAa5QeAADA2LR/f7JpU7nPsXt35/yOO8o2xz33JJMmtRITAAAYO5QeAADA2FDXya5dZZvj4YeTo0fLfObMZNWqpuRYty655JL2sgIAAGOS0gMAAGjP4cPJQw+VI+Svv945v/bass3xwAPJtGnt5AQAAMYFpQcAAHBmvfde2ebYvDk5cKDMpkxJlixpSo7e3uT669vLCQAAjDtKDwAAYHQdP548+WTZ5nj++c75RRc1BUdfX7JyZTJrVjs5AQCAcU/pAQAAjLzPPksGB5uSY3Cw+f6wqkruvbc8W3XHHc3HAAAAfiClBwAA8MPVdfLznzclx8BA8vjjydBQmZ9zTrJmTVNyrF2bnH9+a1EBAIDupfQAAABOz4EDzU2O4aLjvfc657feWrY5fvKTZLJffgAAAKPLrzoAAIDv7/XXy22ObduSI0fK7KyzkhUryhHyyy9vLSYAADAxKT0AAIBvd+RI8sgjZZvj1Vc751ddVUqOpUub4gMAAKAlSg8AAKDThx82BcfAQLJpU7J/f5lNnpwsXlyerbrxRkfIAQCAMUPpAQAAE93QUPL00+XZqmef7ZzPn99scvT1JatWJXPmtJMTAADg11B6AADARPTFF8mGDU3JMTiYfPxx53zBgvJs1V13JT09rcQEAAA4FUoPAACYCOo6eeml5smq/v7ksceS48fLfPbsZPXqpuhYty654IL2sgIAAJwmpQcAAHSrgweTrVvLEfK33+6c33RTuc1x333JlCnt5AQAABghSg8AAOgmb71VSo4tW5JDh8ps2rRk+fJyn+Oqq1qLCQAAMBqUHgAAMJ4dPZps316OkL/8cuf8ssvKNsfy5cmMGe3kBAAAOAOUHgAAMN7s2ZOsX9+UHBs3Jnv3ltmkScmiRaXouOWWpKraywoAAHAGKT0AAGCsGxpKdu4s2xxPP90cJh82b15zfLyvL1mzJpk7t72sAAAALVJ6AADAWLRvX7JpU1NyrF+f7N7dOb/zzrLNsWBBs+EBAAAwwSk9AABgLKjrZNeuss3xyCPNvY5hZ5+drFrVHCHv7U0uvri9rAAAAGOU0gMAANpy6FDy0EOl6Hjjjc75ddeVbY7770+mTWsnJwAAwDih9AAAgDPpvfeSgYGm5HjwweTgwTKbOjVZsqQpOXp7m9IDAACA703pAQAAo+n48eSJJ8o2x89/3jm/+OKm4OjrS1aubJ6xAgAA4LQoPQAAYKR9+mkyONhsdAwOJp99VmZVlSxcWJ6tuv325mMAAAD8YEoPAAD4oeq62eAY3uZ44olkaKjM585N1q5tSo41a5LzzmsvKwAAQBdTegAAwOn48stk8+Zmm2NgoLnVcbLbbivPVi1cmEz2U28AAIDR5ldeAADwfb3+etnm2LYtOXKkzGbMSFasKEfIL7ustZgAAAATldIDAAC+zZEjySOPlKJj167O+dVXl5Jj6dJk+vRWYgIAANBQegAAwMk+/DBZv74pOTZtSvbvL7PJk5P77y9HyG+4wRFyAACAMUTpAQDAxDY0lDz9dNnmePbZzvkFF5TbHKtWJbNnt5MTAACAX0vpAQDAxPPFF8mGDU3JMTiYfPxxmVVVsmBB2ea4886kp6e1qAAAAHx/Sg8AALpfXScvvZQMDDRFx2OPJcePl/mcOcmaNc1Gx7p1yfz57WUFAADgtCk9AADoTgcPJlu3NiXHwEDy9tud85tvLtscixYlU6a0kxMAAIARo/QAAKB7vPVWuc2xdWty6FCZTZ+eLF9e7nNceWVbKQEAABglSg8AAMavo0eT7dtL0fHyy53zyy8v2xzLliUzZrSTEwAAgDNC6QEAwPiyZ0+yfn1TcmzcmOzdW2aTJiX33deUHL29yS23NIfJAQAAmBCUHgAAjG1DQ8mzz5Ztjh07msPkw847rzk+3teXrF6dzJ3bXlYAAABapfQAAGDs2bcv2bSpHCH/6KPO+Y9/XLY5FixoNjwAAACY8JQeAAC0r66TV18t2xyPPJIcO1bmZ5+drFrVFB3r1iUXX9xeVgAAAMasUy49qqp6IMk/SnJXkouS/EZd13910rxK8odJfjvJ3CRPJvn7dV2/NBKBAQDoEocOJdu2lW2ON97onF9/fbPJ0deX3H9/Mm1aKzEBAAAYP05n02NmkueT/LdJ/vIb5r+X5B8m+XtJdiX5J0k2VVV1Q13X+08zJwAA3eDdd5uCo78/2bw5OXiwzKZOTZYuLUXHtde2FhMAAIDx6ZRLj7qu1ydZnyTNUkdxYsvjHyT5Z3Vd/8cTH/vPk3yU5O8k+bc/LC4AAOPKsWPJE0+UZ6teeKFzfvHFTcHR15esWNE8YwUAAACnaaRvelyV5MIkG4c/UNf14aqqHkqyKN9QelRVNS3JyW8VzBrhTAAAnEmffJJs2NCUHIODyeefl1lPT7JwYdnmuP325Gt/kAYAAABO10iXHhee+Pajr338oyRXfMvf89M0N0AAABiP6jp5/vmyzfHkk8nQUJnPnZusXduUHGvWJOed115WAAAAutpIlx7D6q99v/qGjw374yQ/O+n7s5K8NxqhAAAYIV9+mTz4YDlC/sEHnfPbbmtKjt7eZrNj8mj9tBMAAACKkf7V5+4T316Y5MOTPj4/v7r9kaR5/irJ4eHvf/1OCAAAY8Qvf1m2OR56KDlypMxmzGhucgwXHZdd1l5OAAAAJqyRLj3eTFN8rEqyM0mqqpqaZEmS3x/hHwsAgNF05Ejy8MNlm2PXrs751VeXI+RLliTTp7eTEwAAAE445dKjqqqzk1x70oeuqqrqjiSf1XX9TlVVf5LkD6qqei3Ja0n+IMnBJP/uh8cFAGBUffBBsn59U3Rs2tQ8YzVs8uTk/vtL0XHDDY6QAwAAMKaczqbH3Um2nvT94Xscf5Hk7yX5V0nOSvJvksxN8mSS1XVd7z/9mAAAjIrjx5Onny7PVu3c2Tm/4ILmuaq+vmTVqmT27HZyAgAAwPdQ1fW33RdvR1VVs5Ps3bt3b2b7RTUAwMj7/PNkw4am5BgcTD75pMyqKlmwoNzm+PGPk56e9rICAAAw4e3bty9z5sxJkjl1Xe/7rs8d6ZseAACMNXWdvPRS2ebYvr3Z8Bg2Z06yZk1Tcqxbl8yf315WAAAA+AGUHgAA3ejgwWTLlnKE/J13Ouc331xucyxalEyZ0k5OAAAAGEFKDwCAbvHmm6Xk2Lo1OXSozKZPT5YvL89WXXllazEBAABgtCg9AADGq6NHk0cfbUqO/v7klVc655dfXrY5li1LZsxoJycAAACcIUoPAIDx5KOPkvXrm5Jj48Zk30n32yZNSu67rxQdN9/cHCYHAACACULpAQAwlg0NJc88U7Y5nn66c37++c3x8b6+ZNWqZO7cdnICAADAGKD0AAAYa/buTTZtakqO9eub7Y6T3XVXc5ejry9ZsCDp6WknJwAAAIwxSg8AgLbVdfKLXzQlR39/c6fj2LEynzWr2eLo62u2Oi66qL2sAAAAMIYpPQAA2nDoULJ1a3m26s03O+c33NCUHL29yf33J1OntpMTAAAAxhGlBwDAmfLuu2WbY/Pm5Kuvymzq1GTp0nKE/JprWosJAAAA45XSAwBgtBw7ljz+eNnmeOGFzvkll5SSY8WKZObMdnICAABAl1B6AACMpE8+SQYHm5Jjw4bk88/LrKcnWbiwFB233ZZUVXtZAQAAoMsoPQAAfoi6Tp57rik5BgaSJ55oPjbs3HOTtWubkmPNmmTevNaiAgAAQLdTegAAnKr9+5ubHMNFxwcfdM5vv70cIV+4MJk0qZ2cAAAAMMEoPQAAvo/XXitHyB9+ODlypMxmzEhWrixFx6WXtpcTAAAAJjClBwDANzl8uCk3hrc5Xnutc37NNeU2xwMPJNOnt5MTAAAA+GtKDwCAYe+/n6xf3xQdDz6YfPllmU2Z0pQbvb1N0XH99Y6QAwAAwBij9AAAJq7jx5OnnirPVj33XOf8wgtLybFyZTJ7disxAQAAgO9H6QEATCyffZZs2NCUHIODyaeflllVJffcU56tuuOOpKentagAAADAqVF6AADdra6TF15o7nL09yfbtydDQ2U+Z06yZk1Tcqxdm8yf315WAAAA4AdRegAA3efAgWTLlnKE/N13O+e33FK2ORYtSib7KREAAAB0A7/CBwC6wxtvlNsc27Ylhw+X2fTpyYoVTcnR25tccUVrMQEAAIDRo/QAAManI0eSxx4rRccvftE5v+KKss2xbFly1lnt5AQAAADOGKUHADB+7N6drF/flBwbNyb795fZpEnJ4sWl6LjppuYwOQAAADBhKD0AgLFraCjZsaPc5tixo3N+/vnNc1W9vcnq1ck557QSEwAAABgblB4AwNiyd2+zxdHf32x17NnTOb/rrrLNcffdSU9POzkBAACAMUfpAQC0q66TV14p2xyPPpocO1bms2Y1Wxx9fcm6dcmFF7aXFQAAABjTlB4AwJn31VfJtm3lCPlbb3XOb7ihbHMsXpxMndpGSgAAAGCcUXoAAGfGO++UkmPLlqb4GDZtWrJ0aVNy9PYm11zTWkwAAABg/FJ6AACj49ix5PHHS9Hx4oud80svLSXHihXJzJnt5AQAAAC6htIDABg5H3+cDA42JceGDckXX5RZT0/yk5+UZ6t+9KOkqlqLCgAAAHQfpQcAcPrqOtm5s2xzPPVU87Fh556brF3blBxr1iTz5rWXFQAAAOh6Sg8A4NTs359s2pQMDDR/ffhh5/yOO5onq/r6knvvTSZNaiUmAAAAMPEoPQCAX2/XrrLN8fDDydGjZTZzZrJyZbnPcckl7eUEAAAAJjSlBwDwqw4fTh56qCk5BgaSX/6yc37tteU2xwMPJNOmtZMTAAAA4CRKDwCg8d575cmqBx9MDhwosylTmnJjuOi4/vr2cgIAAAB8C6UHAExUx48nTz5Znq16/vnO+UUXldscK1cms2a1kxMAAADge1J6AMBE8tlnyeBgU3IMDjbfH1ZVzeHx4W2OO+5oPgYAAAAwTig9AKCb1XXy85+X2xyPP54MDZX5Oecka9c2Gx1r1ybnn99aVAAAAIAfSukBAN3mwIFk8+ZSdLz3Xuf81lvLNsdPfpJM9tMBAAAAoDv4XQ4A6Aavv15Kjm3bksOHy+yss5IVK5qSY9265IorWosJAAAAMJqUHgAwHh05kjz6aDlC/uqrnfOrrmpKjt7eZOnSpvgAAAAA6HJKDwAYL3bvbjY5+vuTTZuS/fvLbPLkZPHi8mzVjTc6Qg4AAABMOEoPABirhoaSHTvKNsczz3TO589vNjl6e5PVq5M5c9rJCQAAADBGKD0AYCz54otk48am5Fi/Pvn448753XeXbY677kp6elqJCQAAADAWKT0AoE11nbzyStnmePTR5PjxMp89u9ni6OtL1q5NLrywvawAAAAAY5zSAwDOtK++SrZubUqOgYHkrbc65zfeWLY5Fi9OpkxpJSYAAADAeKP0AIAz4e23S8mxZUtTfAybNi1ZtqwpOXp7k6uvbi8nAAAAwDim9ACA0XD0aPL44+XZqpde6pxfemnZ5li+PJk5s52cAAAAAF1E6QEAI+Xjj5vj4/39yYYNyd69ZdbTkyxaVIqOW29Nqqq9rAAAAABdSOkBAKdraCjZubNsczz9dHOYfNi8ecm6dU3JsXp1cu657WUFAAAAmACUHgBwKvbtSx58sNzn2L27c37nneU2xz33JJMmtZMTAAAAYAJSegDAd6nrZNeuss3xyCPNvY5hM2cmq1aVouPii9vLCgAAADDBKT0A4OsOHUoeeqhsc7z+euf8uuvKbY7770+mTWsnJwAAAAAdlB4AkCTvvdcUHP39zfNVBw+W2dSpyZIlzSZHX19TegAAAAAw5ig9AJiYjh9PnniiPFv18593zi++uJQcK1cmZ5/dTk4AAAAAvjelBwATx6efJoODzUbH4GDy2WdlVlXJwoXl2arbb28+BgAAAMC4ofQAoHvVdbPBMbzN8cQTydBQmc+dm6xd22x0rF2bnHdee1kBAAAA+MGUHgB0ly+/TDZvLkfI33+/c/6jH5VtjoULk8n+VQgAAADQLfxODwDj3+uvl22ObduSI0fKbMaMZMWKpuRYty65/PLWYgIAAAAwupQeAIw/R44kjzxSio5duzrnV11VtjmWLk2mT28lJgAAAABnltIDgPHhww+b56oGBpJNm5L9+8ts8uTk/vubkqO3N7nxRkfIAQAAACYgpQcAY9PQUPL002Wb49lnO+cXXNA8V9XXl6xalcyZ005OAAAAAMYMpQcAY8cXXyQbNjTbHOvXJx9/3DlfsKA8W/XjHyc9Pa3EBAAAAGBsUnoA0J66Tl56qSk5+vuTxx5Ljh8v89mzk9WryxHyCy5oLysAAAAAY57SA4Az6+DBZOvWpuQYGEjefrtzftNN5TbH4sXJlCnt5AQAAABg3FF6ADD63nqr3ObYujU5dKjMpk1Lli8vRcdVV7UWEwAAAIDxTekBwMg7erR5qmr42aqXX+6cX3ZZuc2xfHkyY0Y7OQEAAADoKkoPAEbGnj3N8fH+/mTjxmTv3jKbNClZtKgUHbfcklRVe1kBAAAA6EpKDwBOz9BQ8uyz5dmqHTuaw+TDzjuvOT7e19ccI587t72sAAAAAEwISg8Avr99+5otjoGB5q+PPuqc//jHzV2Ovr5kwYJmwwMAAAAAzpARLz2qqvqjJH/4tQ9/VNf1hSP9YwEwyuo6efXVss3xyCPJsWNlfvbZyapVTcmxbl1y8cXtZQUAAABgwhutTY+Xkqw86fvHR+nHAWCkHTqUbNvWlBwDA8kbb3TOr7++3OZYvDiZNq2VmAAAAADwdaNVehyr63r3KP2zARhp777bFBz9/cnmzcnBg2U2dWqyZEkpOq69tr2cAAAAAPAdRqv0uK6qqg+SHE7yZJI/qOv6jW/6xKqqpiU5+Y8JzxqlTAAMO3YseeKJ8mzVCy90zi+5pNzmWLGiecYKAAAAAMa40Sg9nkzyd5PsSnJBkn+SZHtVVbfUdf3pN3z+T/OrN0AAGGmffJIMDjYlx4YNyeefl1lPT7JwYVNy9PYmt9+eVFV7WQEAAADgNFR1XY/uD1BVM5O8nuRf1XX9s2+Yf9Omx3t79+7N7NmzRzUbQFer6+T558s2x5NPJkNDZT53brJ2bVN0rF2bzJvXXlYAAAAA+Bb79u3LnDlzkmROXdf7vutzR+t5q79W1/WBqqpeSHLdt8wPp3kGK0lS+ZPFAKfvyy+TBx8sR8g/+KBzfttt5TbHvfcmk0f9XwMAAAAAcMaM+u92ndjkuCnJI6P9YwFMSK+9Vo6QP/RQcuRImc2Y0dzkGH626rLL2ssJAAAAAKNsxEuPqqr+6yT/Kck7SeanuekxO8lfjPSPBTAhHTmSPPxwebbqtdc651dfXbY5lixJpk9vJycAAAAAnGGjselxaZJ/n+S8JB8neSLJwrqu3x6FHwtgYvjgg2T9+qbk2LSpecZq2OTJyQMPlG2OG25whBwAAACACWnES4+6rv/2SP8zASac48eTp58u2xw7d3bOL7igKTj6+pJVq5LZs9vJCQAAAABjiAu2AGPF558nGzY09znWr08++aTMqipZsKBsc/z4x0lPT3tZAQAAAGAMUnoAtKWuk5deKtsc27c3Gx7D5sxJ1qxpSo5165L589vLCgAAAADjgNID4Ew6eDDZsqUpOQYGknfe6ZzffHM5Qr5oUTJlSjs5AQAAAGAcUnoAjLa33irbHFu3JocOldn06cny5eXZqiuvbCslAAAAAIx7Sg+AkXb0aPLYY2Wb4+WXO+eXX162OZYtS2bMaCcnAAAAAHQZpQfASNizpzk+3t+fbNyY7N1bZpMmJffdV4qOm29uDpMDAAAAACNK6QFwOoaGkmefLc9W7djRHCYfdv75zfHxvr5k9erknHNaiwoAAAAAE4XSA+D72rev2eIYGGj++uijzvldd5XbHAsWJD097eQEAAAAgAlK6QHwbeo6efXVss3xyCPJsWNlPmtWsmpVU3SsW5dcdFF7WQEAAAAApQdAh0OHkm3byhHyN97onN9wQ7nNsXhxMnVqKzEBAAAAgF+l9AB4992m4OjvTzZvTg4eLLOpU5OlS0vRcc01rcUEAAAAAL6b0gOYeI4dS554ojxb9cILnfNLLiklx4oVycyZ7eQEAAAAAE6J0gOYGD75JBkcbEqODRuSzz8vs56eZOHCUnTcdltSVe1lBQAAAABOi9ID6E51nTz3XLnN8cQTzceGnXtusnZtU3KsWZPMm9daVAAAAABgZCg9gO7x5ZfJgw+WouODDzrnt9/elBy9vc1mx6RJ7eQEAAAAAEaF0gMY3157rdzmePjh5MiRMpsxI1m5shQdl17aXk4AAAAAYNQpPYDx5fDhptwY3uZ47bXO+dVXl9scS5Yk06e3kxMAAAAAOOOUHsDY98EHTcHR3988X/Xll2U2eXLywAOl6Lj+ekfIAQAAAGCCUnoAY8/x48lTT5Vtjp07O+cXXtg8V9XX1zxfNXt2OzkBAAAAgDFF6QGMDZ9/nmzY0BQdg4PJJ5+UWVUlCxaUbY4770x6etrLCgAAAACMSUoPoB11nbz4YjlCvn17MjRU5nPmJGvWNCXH2rXJ/PntZQUAAAAAxgWlB3DmHDyYbN5c7nO8+27n/JZbyrNVixYlU6a0kxMAAAAAGJeUHsDoevPNss2xdWty+HCZTZ+eLF/elBy9vcmVV7YWEwAAAAAY/5QewMg6ejR59NGyzfHKK53zK64otzmWLk1mzGglJgAAAADQfZQewA/30UfJ+vVNybFxY7JvX5lNmpTcd18pOm6+uTlMDgAAAAAwwpQewKkbGkqeeaY8W7VjR+f8/POTdeuaJ6tWr07mzm0nJwAAAAAwoSg9gO9n795mi6O/v9nq2LOnc37XXeU2x4IFSU9POzkBAAAAgAlL6QF8s7pu7nEM3+Z49NHk2LEynzUrWbWqKTrWrUsuuqi9rAAAAAAAUXoAJ/vqq2TbtvJs1Vtvdc5vuKHc5li8OJk6tY2UAAAAAADfSOkBE9077zQFx8BAsnlzU3wMmzo1WbasPFt1zTXt5QQAAAAA+DWUHjDRHDuWbN9enq168cXO+aWXNgVHX1+yYkUyc2Y7OQEAAAAATpHSAyaCjz9OBgebkmPDhuSLL8qspyf5yU/Ks1U/+lFSVa1FBQAAAAA4XUoP6EZ1nezcWW5zPPVU87Fh557bHB/v60tWr07mzWsvKwAAAADACFF6QLfYvz958MFyn+PDDzvnd9xRnq26995k0qRWYgIAAAAAjBalB4xnu3aVbY6HH06OHi2zmTOTlSvLEfJLLmkvJwAAAADAGaD0gPHk8OGm3BguOn75y875NdeU2xxLliTTprWTEwAAAACgBUoPGOvef795rqq/v3m+6sCBMpsyJXnggVJ0XH99ezkBAAAAAFqm9ICx5vjx5MknS9Hx3HOd84suKrc5Vq5MZs1qJSYAAAAAwFij9ICx4LPPkg0bmpJjcDD59NMyq6rknnvKNscddyQ9Pa1FBQAAAAAYq5Qe0Ia6Tl54oWxzbN+eDA2V+TnnJGvWNCXH2rXJ+ee3FhUAAAAAYLxQesCZcuBAsmVLU3IMDCTvvts5v/XW8mzVokXJZF+eAAAAAACnwu+qwmh6442m5OjvT7ZtSw4fLrOzzkqWL29Kjt7e5IorWosJAAAAANANlB4wko4cSR57rBQdv/hF5/zKK0vJsWxZU3wAAAAAADAilB7wQ+3enaxf35QcGzcm+/eX2aRJyeLF5Qj5TTc1h8kBAAAAABhxSg84VUNDyY4dZZvjmWc65/PnJ+vWNSXHqlXNUXIAAAAAAEad0gO+jy++aLY4BgaarY49ezrnd99dnq26++6kp6eVmAAAAAAAE5nSA75JXSevvFK2OR59NDl+vMxnz05Wr25KjnXrkgsvbC8rAAAAAABJlB5QfPVVsnVrU3IMDCRvvdU5v/HGcpvjvvuSqVNbiQkAAAAAwDdTejCxvf12KTm2bGmKj2HTpiXLlpVnq66+ur2cAAAAAAD8WkoPJpZjx5Lt28uzVS+91Dm/9NKyzbF8eTJzZjs5AQAAAAA4ZUoPut/HHzfHx/v7kw0bkr17y6ynJ1m0qBQdt96aVFV7WQEAAAAAOG1KD7rP0FCyc2fzZFV/f/LUU81h8mHz5jXHx/v6mmPk557bXlYAAAAAAEaM0oPusH9/smlTuc+xe3fn/I47yjbHPfckkya1EhMAAAAAgNGj9GB8qutk166yzfHww8nRo2U+c2ayalVTcqxbl1xySXtZAQAAAAA4I5QejB+HDycPPVSOkL/+euf82mvLNscDDyTTprWTEwAAAACAVig9GNvee69sc2zenBw4UGZTpiRLlpSi47rr2ssJAAAAAEDrlB6MLcePJ08+WbY5nn++c37RRUlvb1NyrFyZzJrVTk4AAAAAAMYcpQft++yzZHCwKTkGB5vvD6uq5N57yzbHHXc0HwMAAAAAgK9RenDm1XXy8583JcfAQPL448nQUJmfc06yZk1Tcqxdm5x/fmtRAQAAAAAYP5QenBkHDjQ3OYaLjvfe65zfemvZ5vjJT5LJ/qsJAAAAAMCp8TvLjJ7XXy+3ObZtS44cKbOzzkpWrGhKjt7e5PLLW4sJAAAAAEB3UHowco4cSR55pGxzvPpq5/yqq0rJsXRpU3wAAAAAAMAIUXrww3z4YVNwDAwkmzYl+/eX2eTJyeLF5dmqG290hBwAAAAAgFGj9ODUDA0lTz9dnq169tnO+fz5zSZHX1+yalUyZ047OQEAAAAAmHCUHvx6X3yRbNjQlByDg8nHH3fOFywoz1bddVfS09NKTAAAAAAAJjalB7+qrpOXXmqerOrvTx57LDl+vMxnz05Wr26KjnXrkgsuaC8rAAAAAACcoPSgcfBgsnVrOUL+9tud85tuKrc57rsvmTKlnZwAAAAAAPAtlB4T2VtvlZJjy5bk0KEymzYtWb683Oe46qrWYgIAAAAAwPeh9JhIjh5Ntm8vR8hffrlzftllZZtj+fJkxox2cgIAAAAAwGlQenS7PXuS9eubkmPjxmTv3jKbNClZtKgUHbfcklRVe1kBAAAAAOAHUHp0m6GhZOfOss3x9NPNYfJh8+Y1x8f7+pI1a5K5c9vLCgAAAAAAI2jUSo+qqn43yT9KclGSl5L8g7quHxmtH29C27cv2bSpKTnWr0927+6c33ln2eZYsKDZ8AAAAAAAgC4zKqVHVVW/meRPkvxukseS/BdJ1ldVdXNd1++Mxo85odR1smtX2eZ45JHmXsewmTOTVauakqO3N7n44vayAgAAAADAGVLVJz99NFL/0Kp6MsmzdV3/zkkfeyXJX9V1/dNf8/fOTrJ37969mT179ohnG7cOH062bStFxxtvdM6vu65sc9x/fzJtWisxAQAAAABgJO3bty9z5sxJkjl1Xe/7rs8d8U2PqqqmJrkryb/42mhjkkXf8PnTkpz8O/SzRjpTV9i5M1m7tnx/6tRkyZJmk6Ovryk9AAAAAABgAhuN563OSzIpyUdf+/hHSS78hs//aZI/HIUc3WXBguT225tv+/qSlSuTs89uOxUAAAAAAIwZo3bIPMnX382qvuFjSfLHSX520vdnJXlvtEKNW5MmJc8913YKAAAAAAAYs0aj9PgkyfH86lbH/Pzq9kfquj6c5PDw96uqGoVIAAAAAABAt+sZ6X9gXddHkjyTZNXXRquSbB/pHw8AAAAAACAZveetfpbkv6+qakeSx5P8dpLLk/w3o/TjAQAAAAAAE9yolB51Xf+PVVXNS/JfJbkoyYtJeuu6fns0fjwAAAAAAIBRO2Re1/W/SfJvRuufDwAAAAAAcLIRv+kBAAAAAADQBqUHAAAAAADQFZQeAAAAAABAV1B6AAAAAAAAXUHpAQAAAAAAdAWlBwAAAAAA0BWUHgAAAAAAQFdQegAAAAAAAF1B6QEAAAAAAHQFpQcAAAAAANAVlB4AAAAAAEBXUHoAAAAAAABdYXLbAb7Nvn372o4AAAAAAAC07FT6gqqu61GMcuqqqrokyXtt5wAAAAAAAMaUS+u6fv+7PmEslh5VkouT7G87yxg0K00hdGn83wfONF9/0B5ff9AuX4PQHl9/0B5ff9AuX4N8k1lJPqh/Takx5p63OhH4O5uaiarpg5Ik++u69v4XnEG+/qA9vv6gXb4GoT2+/qA9vv6gXb4G+Rbf678LDpkDAAAAAABdQekBAAAAAAB0BaXH+HI4yf/hxLfAmeXrD9rj6w/a5WsQ2uPrD9rj6w/a5WuQ0zbmDpkDAAAAAACcDpseAAAAAABAV1B6AAAAAAAAXUHpAQAAAAAAdAWlBwAAAAAA0BWUHgAAAAAAQFdQeowTVVX9blVVb1ZVdaiqqmeqqrq/7UwwEVRV9dOqqp6uqmp/VVV7qqr6q6qqbmg7F0xEJ74e66qq/qTtLDARVFV1SVVV/8+qqj6tqupgVVXPVVV1V9u5YCKoqmpyVVX/pxO/Bvyqqqo3qqr6r6qq8mt4GGFVVT1QVdV/qqrqgxM/1/yffW1eVVX1RyfmX1VVta2qqltaigtd5bu+/qqqmlJV1b+squqFqqoOnPic/66qqotbjMw44SdM40BVVb+Z5E+S/LMkdyZ5JMn6qqoubzMXTBBLkvxZkoVJViWZnGRjVVUzW00FE0xVVQuS/HaSn7edBSaCqqrmJnksydEk65LcnOR/n+SLFmPBRPL7Sf43Sf7LJDcl+b0k/yjJ/7bNUNClZiZ5Ps3X2zf5vST/8MR8QZLdSTZVVTXrzMSDrvZdX38zkvw4yT898e3fSnJ9kv/vGUvHuFXVdd12Bn6NqqqeTPJsXde/c9LHXknyV3Vd/7S9ZDDxVFV1fpI9SZbUdf1w23lgIqiq6uwkzyb53ST/JMlzdV3/g1ZDQZerqupfJLmvrmvbxdCCqqr+f0k+quv6f3XSx/4yycG6rv+X7SWD7lZVVZ3kN+q6/qsT36+SfJDkT+q6/pcnPjYtyUdJfr+u63/bVlboNl//+vuWz1mQ5KkkV9R1/c6Zysb4Y9NjjKuqamqSu5Js/NpoY5JFZz4RTHhzTnz7WaspYGL5syT9dV0/2HYQmED+RpIdVVX9hxPPO+6squp/3XYomEAeTbKiqqrrk6SqqtuTLE4y0GoqmHiuSnJhTvo9mbquDyd5KH5PBtowJ0kd28f8GpPbDsCvdV6SSWn+FMHJPkrzL17gDDnxp3x+luTRuq5fbDsPTARVVf3tNKvMC9rOAhPM1Ul+J82/9/55knuS/N+qqjpc1/V/12oymBj+ZZrf2PlFVVXH0/ya8B/Xdf3v240FE87w77t80+/JXHGGs8CEVlXV9CT/Ism/q+t6X9t5GNuUHuPH198hq77hY8Do+tdJbkvzp+yAUVZV1WVJ/q9JVtd1fajtPDDB9CTZUdf1H5z4/s4TR1t/J4nSA0bfbyb5XyT5O0leSnJHkj+pquqDuq7/os1gMEH5PRloUVVVU5L8D2l+jvq7LcdhHFB6jH2fJDmeX93qmJ9f/ZMGwCipqupP0zz18UBd1++1nQcmiLvS/PvumWbRKknzJ10fqKrqv0wyra7r422Fgy73YZKXv/axV5L8z1vIAhPR/znJv6jr+n848f0Xqqq6IslPkyg94MzZfeLbC9P8u3GY35OBM+RE4fH/TvPc3HJbHnwfbnqMcXVdH0nyTJJVXxutSrL9zCeCiaVq/OskfyvNv1zfbDsTTCCbk/wozZ9uHf5rR5L/V5I7FB4wqh5LcsPXPnZ9krdbyAIT0YwkQ1/72PH4NTycaW+mKT7++vdkTtxeXRK/JwOj7qTC47okK+u6/rTlSIwTNj3Gh58l+e+rqtqR5PEkv53k8iT/TaupYGL4szTPCvzNJPurqhreutpb1/VX7cWC7lfX9f4kHfdzqqo6kORTd3Vg1P1fkmyvquoP0vxC8540Pwf97VZTwcTxn5L846qq3knzvNWdSf5hkv9Hq6mgC1VVdXaSa0/60FVVVd2R5LO6rt+pqupPkvxBVVWvJXktyR8kOZjk353prNBtvuvrL8kHSf4/aW48/mdJJp30ezKfnfiD4vCNqrr2BOF4UFXV7yb5vSQXpfkNoP9dXdcPt5sKul9VVd/2P5K/Vdf1n5/JLEBSVdW2JM/Vdf0PWo4CXa+qqv8syR+n+ZN1byb5WV3X//d2U8HEUFXVrCT/NMlvpHlG54Mk/z7J/9Fv8sDIqqpqaZKt3zD6i7qu/17VvLP6h0n+iyRzkzyZ5O/7Qzjww33X11+SP0rzc9Bvsqyu622jEoquoPQAAAAAAAC6gvdAAQAAAACArqD0AAAAAAAAuoLSAwAAAAAA6ApKDwAAAAAAoCsoPQAAAAAAgK6g9AAAAAAAALqC0gMAAAAAAOgKSg8AAAAAAKArKD0AAAAAAICuoPQAAAAAAAC6gtIDAAAAAADoCv9/1MXeuKac8eEAAAAASUVORK5CYII=\n",
+ "text/plain": [
+ "<Figure size 2000x600 with 1 Axes>"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "do_plot(is_sin = False)"
+ ]
+},'
+# rubocop:enable Layout/LineLength
+
+base = '{
+ "cells": [
+ <<>>{
+ "cell_type": "markdown",
+ "id": "1",
+ "metadata": {
+ "tags": [
+ "hello",
+ "world"
+ ]
+ },
+ "source": [
+ "# A\n",
+ "\n",
+ "B"
+ ]
+ }
+ ],
+ "metadata": {
+ }
+}'
+
+SMALL_NOTEBOOK = base.gsub('<<>>', large_cell)
+LARGE_NOTEBOOK = base.gsub('<<>>', Array.new(100, large_cell).join("\n"))
+
+puts "Small Notebook: #{SMALL_NOTEBOOK.bytesize}"
+puts "Large Notebook: #{LARGE_NOTEBOOK.bytesize}"
+
+def cases(benchmark_runner)
+ benchmark_runner.report('small_notebook') { IpynbDiff.transform(SMALL_NOTEBOOK) }
+ benchmark_runner.report('large_notebook') { IpynbDiff.transform(LARGE_NOTEBOOK) }
+end
+
+Benchmark.benchmark { |x| cases(x) }
+Benchmark.memory { |x| cases(x) }
diff --git a/gems/ipynbdiff/spec/ipynb_diff/symbol_map_spec.rb b/gems/ipynbdiff/spec/ipynb_diff/symbol_map_spec.rb
new file mode 100644
index 00000000000..94cb10772aa
--- /dev/null
+++ b/gems/ipynbdiff/spec/ipynb_diff/symbol_map_spec.rb
@@ -0,0 +1,55 @@
+# frozen_string_literal: true
+
+require_relative '../test_helper'
+
+describe IpynbDiff::SymbolMap do
+ def res(*cases)
+ cases&.to_h || []
+ end
+
+ describe '.parse' do
+ subject(:symbol_map) { described_class.parse(JSON.pretty_generate(source)) }
+
+ context 'when object has blank key' do
+ let(:source) { { "": { "": 5 } } }
+
+ it { is_expected.to match_array(res([".", 2], ["..", 3])) }
+ end
+
+ context 'when object is empty' do
+ let(:source) { {} }
+
+ it { is_expected.to be_empty }
+ end
+
+ context 'when object is empty array' do
+ let(:source) { [] }
+
+ it { is_expected.to be_empty }
+ end
+
+ context 'when object has inner object and number' do
+ let(:source) { { obj1: { obj2: 1 } } }
+
+ it { is_expected.to match_array(res(['.obj1', 2], ['.obj1.obj2', 3])) }
+ end
+
+ context 'when object has inner object and number, string and array with object' do
+ let(:source) { { obj1: { obj2: [123, 2, true], obj3: "hel\nlo", obj4: true, obj5: 123, obj6: 'a' } } }
+
+ specify do
+ expect(symbol_map).to match_array(
+ res(['.obj1', 2],
+ ['.obj1.obj2', 3],
+ ['.obj1.obj2.0', 4],
+ ['.obj1.obj2.1', 5],
+ ['.obj1.obj2.2', 6],
+ ['.obj1.obj3', 8],
+ ['.obj1.obj4', 9],
+ ['.obj1.obj5', 10],
+ ['.obj1.obj6', 11])
+ )
+ end
+ end
+ end
+end
diff --git a/gems/ipynbdiff/spec/ipynb_diff/transformer_spec.rb b/gems/ipynbdiff/spec/ipynb_diff/transformer_spec.rb
new file mode 100644
index 00000000000..214a8192542
--- /dev/null
+++ b/gems/ipynbdiff/spec/ipynb_diff/transformer_spec.rb
@@ -0,0 +1,94 @@
+# frozen_string_literal: true
+
+require_relative '../test_helper'
+
+describe IpynbDiff::Transformer do
+ describe '.transform' do
+ using RSpec::Parameterized::TableSyntax
+
+ let!(:default_config) { { include_frontmatter: false, hide_images: false } }
+
+ let(:test_case) { read_test_case(test_case_name) }
+ let(:notebook) { test_case[:input] || FROM_IPYNB }
+ let(:config) { {} }
+
+ subject { described_class.new(**default_config.merge(config)).transform(notebook) }
+
+ where(:ctx, :test_case_name, :config) do
+ 'renders metadata' | 'no_cells' | { include_frontmatter: true }
+ 'is empty for no cells, but metadata is false' | 'no_cells_no_metadata' | {}
+ 'adds markdown cell' | 'only_md' | {}
+ 'adds block with only one line of markdown' | 'single_line_md' | {}
+ 'adds raw block' | 'only_raw' | {}
+ 'code cell, but no output' | 'only_code' | {}
+ 'code cell, but no language' | 'only_code_no_language' | {}
+ 'code cell, but no kernelspec' | 'only_code_no_kernelspec' | {}
+ 'code cell, but no nb metadata' | 'only_code_no_metadata' | {}
+ 'text output' | 'text_output' | {}
+ 'ignores html output' | 'ignore_html_output' | {}
+ 'extracts png output along with text' | 'text_png_output' | {}
+ 'embeds svg as image' | 'svg' | {}
+ 'extracts latex output' | 'latex_output' | {}
+ 'extracts error output' | 'error_output' | {}
+ 'does not fetch tags if there is no cell metadata' | 'no_metadata_on_cell' | {}
+ 'generates :percent decorator' | 'percent_decorator' | {}
+ 'parses stream output' | 'stream_text' | {}
+ 'ignores unknown output type' | 'unknown_output_type' | {}
+ 'handles backslash correctly' | 'backslash_as_last_char' | {}
+ 'multiline png output' | 'multiline_png_output' | {}
+ 'hides images when option passed' | 'hide_images' | { hide_images: true }
+ '\n within source lines' | 'source_with_linebreak' | { hide_images: true }
+ end
+
+ with_them do
+ it 'generates the expected markdown' do
+ expect(subject.as_text).to eq test_case[:expected_markdown]
+ end
+
+ it 'marks the lines correctly' do
+ blocks = subject.blocks.map { |b| b[:source_symbol] }.join("\n")
+
+ expect(blocks).to eq test_case[:expected_symbols]
+ end
+ end
+
+ describe 'Source line map' do
+ let(:config) { { include_frontmatter: false } }
+ let(:test_case_name) { 'text_png_output' }
+
+ it 'generates the correct transformed to source line map' do
+ line_numbers = subject.blocks.map { |b| b[:source_line] }.join("\n")
+
+ expect(line_numbers).to eq test_case[:expected_line_numbers]
+ end
+ end
+
+ context 'when json is invalid' do
+ let(:notebook) { 'a' }
+
+ it 'raises error' do
+ expect { subject }.to raise_error(IpynbDiff::InvalidNotebookError)
+ end
+ end
+
+ context 'when it does not have the cell tag' do
+ let(:notebook) { '{"metadata":[]}' }
+
+ it 'raises error' do
+ expect { subject }.to raise_error(IpynbDiff::InvalidNotebookError)
+ end
+ end
+
+ context 'when notebook can not be parsed' do
+ let(:notebook) { '{"cells":[]}' }
+
+ before do
+ allow(Oj::Parser.usual).to receive(:parse).and_return(nil)
+ end
+
+ it 'raises error' do
+ expect { subject }.to raise_error(IpynbDiff::InvalidNotebookError)
+ end
+ end
+ end
+end
diff --git a/gems/ipynbdiff/spec/ipynb_diff_spec.rb b/gems/ipynbdiff/spec/ipynb_diff_spec.rb
new file mode 100644
index 00000000000..3ca092aaf5c
--- /dev/null
+++ b/gems/ipynbdiff/spec/ipynb_diff_spec.rb
@@ -0,0 +1,127 @@
+# frozen_string_literal: true
+
+require_relative 'test_helper'
+
+describe IpynbDiff do
+ def diff_signs(diff)
+ diff.to_s(:text).scan(/.*\n/).map { |l| l[0] }.join('')
+ end
+
+ describe '.diff' do
+ let(:from_path) { FROM_PATH }
+ let(:to_path) { TO_PATH }
+ let(:from) { File.read(from_path) }
+ let(:to) { File.read(to_path) }
+ let(:include_frontmatter) { false }
+ let(:hide_images) { false }
+
+ subject { described_class.diff(from, to, include_frontmatter: include_frontmatter, hide_images: hide_images) }
+
+ context 'if preprocessing is active' do
+ it { is_expected.not_to include('<td>') }
+ end
+
+ context 'when to is nil' do
+ let(:to) { nil }
+ let(:from_path) { test_case_input_path('only_md') }
+
+ it 'all lines are removals' do
+ expect(diff_signs(subject)).to eq('-----')
+ end
+ end
+
+ context 'when from is nil' do
+ let(:from) { nil }
+ let(:to_path) { test_case_input_path('only_md') }
+
+ it 'all lines are additions' do
+ expect(diff_signs(subject)).to eq('+++++')
+ end
+ end
+
+ context 'when include_frontmatter is true' do
+ let(:include_frontmatter) { true }
+
+ it 'shows changes metadata in the metadata' do
+ expect(subject.to_s(:text)).to include('+ display_name: New Python 3 (ipykernel)')
+ end
+ end
+
+ context 'when hide_images is true' do
+ let(:hide_images) { true }
+
+ it 'hides images' do
+ expect(subject.to_s(:text)).to include(' [Hidden Image Output]')
+ end
+ end
+
+ context 'when include_frontmatter is false' do
+ it 'drops metadata from the diff' do
+ expect(subject.to_s(:text)).not_to include('+ display_name: New Python 3 (ipykernel)')
+ end
+ end
+
+ context 'when either notebook can not be processed' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:ctx, :from, :to) do
+ 'because from is invalid' | 'a' | nil
+ 'because from does not have the cell tag' | '{"metadata":[]}' | nil
+ 'because to is invalid' | nil | 'a'
+ 'because to does not have the cell tag' | nil | '{"metadata":[]}'
+ end
+
+ with_them do
+ it { is_expected.to be_nil }
+ end
+ end
+ end
+
+ describe '.transform' do
+ let(:notebook) { FROM_IPYNB }
+ let(:include_frontmatter) { false }
+ let(:hide_images) { false }
+
+ subject do
+ described_class.transform(notebook,
+ include_frontmatter: include_frontmatter,
+ hide_images: hide_images)
+ end
+
+ describe 'error cases' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:ctx, :notebook) do
+ 'notebook is nil' | nil
+ 'notebook is invalid' | 'a'
+ 'notebook does not have cell' | '{"metadata":[]}'
+ end
+
+ with_them do
+ it { is_expected.to be_nil }
+ end
+ end
+
+ describe 'options' do
+ context 'when include_frontmatter is false' do
+ it { is_expected.not_to include('display_name: Python 3 (ipykernel)') }
+ end
+
+ context 'when include_frontmatter is true' do
+ let(:include_frontmatter) { true }
+
+ it { is_expected.to include('display_name: Python 3 (ipykernel)') }
+ end
+
+ context 'when hide_images is false' do
+ it { is_expected.not_to include('[Hidden Image Output]') }
+ end
+
+ context 'when hide_images is true' do
+ let(:hide_images) { true }
+
+ it { is_expected.to include(' [Hidden Image Output]') }
+ end
+ end
+ end
+end
diff --git a/gems/ipynbdiff/spec/test_helper.rb b/gems/ipynbdiff/spec/test_helper.rb
new file mode 100644
index 00000000000..626b72b99f0
--- /dev/null
+++ b/gems/ipynbdiff/spec/test_helper.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+require 'simplecov'
+SimpleCov.start
+
+require 'ipynb_diff'
+require 'rspec'
+require 'rspec-parameterized'
+require 'json'
+
+BASE_PATH = File.join(__dir__ || '', 'testdata')
+
+FROM_PATH = File.join(BASE_PATH, 'from.ipynb')
+TO_PATH = File.join(BASE_PATH, 'to.ipynb')
+
+FROM_IPYNB = File.read(FROM_PATH)
+TO_IPYNB = File.read(TO_PATH)
+
+def test_case_input_path(test_case)
+ File.join(BASE_PATH, test_case, 'input.ipynb')
+end
+
+def test_case_symbols_path(test_case)
+ File.join(BASE_PATH, test_case, 'expected_symbols.txt')
+end
+
+def test_case_md_path(test_case)
+ File.join(BASE_PATH, test_case, 'expected.md')
+end
+
+def test_case_line_numbers_path(test_case)
+ File.join(BASE_PATH, test_case, 'expected_line_numbers.txt')
+end
+
+def read_file_if_exists(path)
+ File.read(path) if File.file?(path)
+end
+
+def read_test_case(test_case_name)
+ {
+ input: read_file_if_exists(test_case_input_path(test_case_name)),
+ expected_markdown: read_file_if_exists(test_case_md_path(test_case_name)),
+ expected_symbols: read_file_if_exists(test_case_symbols_path(test_case_name)),
+ expected_line_numbers: read_file_if_exists(test_case_line_numbers_path(test_case_name))
+ }
+end
diff --git a/vendor/gems/ipynbdiff/spec/testdata/backslash_as_last_char/expected.md b/gems/ipynbdiff/spec/testdata/backslash_as_last_char/expected.md
index 299e286c679..299e286c679 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/backslash_as_last_char/expected.md
+++ b/gems/ipynbdiff/spec/testdata/backslash_as_last_char/expected.md
diff --git a/vendor/gems/ipynbdiff/spec/testdata/backslash_as_last_char/expected_symbols.txt b/gems/ipynbdiff/spec/testdata/backslash_as_last_char/expected_symbols.txt
index 6fa29ae28de..6fa29ae28de 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/backslash_as_last_char/expected_symbols.txt
+++ b/gems/ipynbdiff/spec/testdata/backslash_as_last_char/expected_symbols.txt
diff --git a/vendor/gems/ipynbdiff/spec/testdata/backslash_as_last_char/input.ipynb b/gems/ipynbdiff/spec/testdata/backslash_as_last_char/input.ipynb
index 0714044e3ae..0714044e3ae 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/backslash_as_last_char/input.ipynb
+++ b/gems/ipynbdiff/spec/testdata/backslash_as_last_char/input.ipynb
diff --git a/vendor/gems/ipynbdiff/spec/testdata/error_output/expected.md b/gems/ipynbdiff/spec/testdata/error_output/expected.md
index e6e8a075598..e6e8a075598 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/error_output/expected.md
+++ b/gems/ipynbdiff/spec/testdata/error_output/expected.md
diff --git a/vendor/gems/ipynbdiff/spec/testdata/error_output/expected_symbols.txt b/gems/ipynbdiff/spec/testdata/error_output/expected_symbols.txt
index 5d2f248135d..5d2f248135d 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/error_output/expected_symbols.txt
+++ b/gems/ipynbdiff/spec/testdata/error_output/expected_symbols.txt
diff --git a/vendor/gems/ipynbdiff/spec/testdata/error_output/input.ipynb b/gems/ipynbdiff/spec/testdata/error_output/input.ipynb
index 45ee81a0e2d..45ee81a0e2d 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/error_output/input.ipynb
+++ b/gems/ipynbdiff/spec/testdata/error_output/input.ipynb
diff --git a/vendor/gems/ipynbdiff/spec/testdata/from.ipynb b/gems/ipynbdiff/spec/testdata/from.ipynb
index 68a4b11cbbc..68a4b11cbbc 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/from.ipynb
+++ b/gems/ipynbdiff/spec/testdata/from.ipynb
diff --git a/vendor/gems/ipynbdiff/spec/testdata/hide_images/expected.md b/gems/ipynbdiff/spec/testdata/hide_images/expected.md
index ff63d351a3b..ff63d351a3b 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/hide_images/expected.md
+++ b/gems/ipynbdiff/spec/testdata/hide_images/expected.md
diff --git a/vendor/gems/ipynbdiff/spec/testdata/hide_images/expected_symbols.txt b/gems/ipynbdiff/spec/testdata/hide_images/expected_symbols.txt
index b8f24f9fba5..b8f24f9fba5 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/hide_images/expected_symbols.txt
+++ b/gems/ipynbdiff/spec/testdata/hide_images/expected_symbols.txt
diff --git a/vendor/gems/ipynbdiff/spec/testdata/hide_images/input.ipynb b/gems/ipynbdiff/spec/testdata/hide_images/input.ipynb
index dab0e5bb9cf..dab0e5bb9cf 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/hide_images/input.ipynb
+++ b/gems/ipynbdiff/spec/testdata/hide_images/input.ipynb
diff --git a/vendor/gems/ipynbdiff/spec/testdata/ignore_html_output/expected.md b/gems/ipynbdiff/spec/testdata/ignore_html_output/expected.md
index 3085da739ed..3085da739ed 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/ignore_html_output/expected.md
+++ b/gems/ipynbdiff/spec/testdata/ignore_html_output/expected.md
diff --git a/vendor/gems/ipynbdiff/spec/testdata/ignore_html_output/expected_symbols.txt b/gems/ipynbdiff/spec/testdata/ignore_html_output/expected_symbols.txt
index 3bf319d1fa6..3bf319d1fa6 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/ignore_html_output/expected_symbols.txt
+++ b/gems/ipynbdiff/spec/testdata/ignore_html_output/expected_symbols.txt
diff --git a/vendor/gems/ipynbdiff/spec/testdata/ignore_html_output/input.ipynb b/gems/ipynbdiff/spec/testdata/ignore_html_output/input.ipynb
index 26117a78934..26117a78934 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/ignore_html_output/input.ipynb
+++ b/gems/ipynbdiff/spec/testdata/ignore_html_output/input.ipynb
diff --git a/vendor/gems/ipynbdiff/spec/testdata/latex_output/expected.md b/gems/ipynbdiff/spec/testdata/latex_output/expected.md
index 194c1f43c42..194c1f43c42 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/latex_output/expected.md
+++ b/gems/ipynbdiff/spec/testdata/latex_output/expected.md
diff --git a/vendor/gems/ipynbdiff/spec/testdata/latex_output/expected_symbols.txt b/gems/ipynbdiff/spec/testdata/latex_output/expected_symbols.txt
index 868adca2712..868adca2712 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/latex_output/expected_symbols.txt
+++ b/gems/ipynbdiff/spec/testdata/latex_output/expected_symbols.txt
diff --git a/vendor/gems/ipynbdiff/spec/testdata/latex_output/input.ipynb b/gems/ipynbdiff/spec/testdata/latex_output/input.ipynb
index f8ff3e72beb..f8ff3e72beb 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/latex_output/input.ipynb
+++ b/gems/ipynbdiff/spec/testdata/latex_output/input.ipynb
diff --git a/vendor/gems/ipynbdiff/spec/testdata/multiline_png_output/expected.md b/gems/ipynbdiff/spec/testdata/multiline_png_output/expected.md
index 0a69c8370e7..0a69c8370e7 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/multiline_png_output/expected.md
+++ b/gems/ipynbdiff/spec/testdata/multiline_png_output/expected.md
diff --git a/vendor/gems/ipynbdiff/spec/testdata/multiline_png_output/expected_symbols.txt b/gems/ipynbdiff/spec/testdata/multiline_png_output/expected_symbols.txt
index 1b66012ef20..1b66012ef20 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/multiline_png_output/expected_symbols.txt
+++ b/gems/ipynbdiff/spec/testdata/multiline_png_output/expected_symbols.txt
diff --git a/vendor/gems/ipynbdiff/spec/testdata/multiline_png_output/input.ipynb b/gems/ipynbdiff/spec/testdata/multiline_png_output/input.ipynb
index 4d19a504553..4d19a504553 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/multiline_png_output/input.ipynb
+++ b/gems/ipynbdiff/spec/testdata/multiline_png_output/input.ipynb
diff --git a/vendor/gems/ipynbdiff/spec/testdata/no_cells/expected.md b/gems/ipynbdiff/spec/testdata/no_cells/expected.md
index b7c09c51fb8..b7c09c51fb8 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/no_cells/expected.md
+++ b/gems/ipynbdiff/spec/testdata/no_cells/expected.md
diff --git a/vendor/gems/ipynbdiff/spec/testdata/no_cells/expected_symbols.txt b/gems/ipynbdiff/spec/testdata/no_cells/expected_symbols.txt
index a60f3032882..a60f3032882 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/no_cells/expected_symbols.txt
+++ b/gems/ipynbdiff/spec/testdata/no_cells/expected_symbols.txt
diff --git a/vendor/gems/ipynbdiff/spec/testdata/no_cells/input.ipynb b/gems/ipynbdiff/spec/testdata/no_cells/input.ipynb
index c2ba0ebf50a..c2ba0ebf50a 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/no_cells/input.ipynb
+++ b/gems/ipynbdiff/spec/testdata/no_cells/input.ipynb
diff --git a/vendor/gems/ipynbdiff/spec/testdata/no_cells_no_metadata/expected.md b/gems/ipynbdiff/spec/testdata/no_cells_no_metadata/expected.md
index e69de29bb2d..e69de29bb2d 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/no_cells_no_metadata/expected.md
+++ b/gems/ipynbdiff/spec/testdata/no_cells_no_metadata/expected.md
diff --git a/vendor/gems/ipynbdiff/spec/testdata/no_cells_no_metadata/expected_symbols.txt b/gems/ipynbdiff/spec/testdata/no_cells_no_metadata/expected_symbols.txt
index e69de29bb2d..e69de29bb2d 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/no_cells_no_metadata/expected_symbols.txt
+++ b/gems/ipynbdiff/spec/testdata/no_cells_no_metadata/expected_symbols.txt
diff --git a/vendor/gems/ipynbdiff/spec/testdata/no_cells_no_metadata/input.ipynb b/gems/ipynbdiff/spec/testdata/no_cells_no_metadata/input.ipynb
index c2ba0ebf50a..c2ba0ebf50a 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/no_cells_no_metadata/input.ipynb
+++ b/gems/ipynbdiff/spec/testdata/no_cells_no_metadata/input.ipynb
diff --git a/vendor/gems/ipynbdiff/spec/testdata/no_metadata_on_cell/expected.md b/gems/ipynbdiff/spec/testdata/no_metadata_on_cell/expected.md
index d9d72bf8f76..d9d72bf8f76 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/no_metadata_on_cell/expected.md
+++ b/gems/ipynbdiff/spec/testdata/no_metadata_on_cell/expected.md
diff --git a/vendor/gems/ipynbdiff/spec/testdata/no_metadata_on_cell/expected_symbols.txt b/gems/ipynbdiff/spec/testdata/no_metadata_on_cell/expected_symbols.txt
index a7000494a1b..a7000494a1b 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/no_metadata_on_cell/expected_symbols.txt
+++ b/gems/ipynbdiff/spec/testdata/no_metadata_on_cell/expected_symbols.txt
diff --git a/vendor/gems/ipynbdiff/spec/testdata/no_metadata_on_cell/input.ipynb b/gems/ipynbdiff/spec/testdata/no_metadata_on_cell/input.ipynb
index 62060124a2a..62060124a2a 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/no_metadata_on_cell/input.ipynb
+++ b/gems/ipynbdiff/spec/testdata/no_metadata_on_cell/input.ipynb
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_code/expected.md b/gems/ipynbdiff/spec/testdata/only_code/expected.md
index 124b8217a6a..124b8217a6a 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/only_code/expected.md
+++ b/gems/ipynbdiff/spec/testdata/only_code/expected.md
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_code/expected_symbols.txt b/gems/ipynbdiff/spec/testdata/only_code/expected_symbols.txt
index 59b11103195..59b11103195 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/only_code/expected_symbols.txt
+++ b/gems/ipynbdiff/spec/testdata/only_code/expected_symbols.txt
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_code/input.ipynb b/gems/ipynbdiff/spec/testdata/only_code/input.ipynb
index a93108dccb8..a93108dccb8 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/only_code/input.ipynb
+++ b/gems/ipynbdiff/spec/testdata/only_code/input.ipynb
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_code_no_kernelspec/expected.md b/gems/ipynbdiff/spec/testdata/only_code_no_kernelspec/expected.md
index c6d8e13fc3a..c6d8e13fc3a 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/only_code_no_kernelspec/expected.md
+++ b/gems/ipynbdiff/spec/testdata/only_code_no_kernelspec/expected.md
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_code_no_kernelspec/expected_symbols.txt b/gems/ipynbdiff/spec/testdata/only_code_no_kernelspec/expected_symbols.txt
index 2e902582e14..2e902582e14 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/only_code_no_kernelspec/expected_symbols.txt
+++ b/gems/ipynbdiff/spec/testdata/only_code_no_kernelspec/expected_symbols.txt
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_code_no_kernelspec/input.ipynb b/gems/ipynbdiff/spec/testdata/only_code_no_kernelspec/input.ipynb
index c3ff71057a6..c3ff71057a6 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/only_code_no_kernelspec/input.ipynb
+++ b/gems/ipynbdiff/spec/testdata/only_code_no_kernelspec/input.ipynb
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_code_no_language/expected.md b/gems/ipynbdiff/spec/testdata/only_code_no_language/expected.md
index c6d8e13fc3a..c6d8e13fc3a 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/only_code_no_language/expected.md
+++ b/gems/ipynbdiff/spec/testdata/only_code_no_language/expected.md
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_code_no_language/expected_symbols.txt b/gems/ipynbdiff/spec/testdata/only_code_no_language/expected_symbols.txt
index 2e902582e14..2e902582e14 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/only_code_no_language/expected_symbols.txt
+++ b/gems/ipynbdiff/spec/testdata/only_code_no_language/expected_symbols.txt
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_code_no_language/input.ipynb b/gems/ipynbdiff/spec/testdata/only_code_no_language/input.ipynb
index fb16b106cbe..fb16b106cbe 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/only_code_no_language/input.ipynb
+++ b/gems/ipynbdiff/spec/testdata/only_code_no_language/input.ipynb
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_code_no_metadata/expected.md b/gems/ipynbdiff/spec/testdata/only_code_no_metadata/expected.md
index c6d8e13fc3a..c6d8e13fc3a 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/only_code_no_metadata/expected.md
+++ b/gems/ipynbdiff/spec/testdata/only_code_no_metadata/expected.md
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_code_no_metadata/expected_symbols.txt b/gems/ipynbdiff/spec/testdata/only_code_no_metadata/expected_symbols.txt
index 2e902582e14..2e902582e14 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/only_code_no_metadata/expected_symbols.txt
+++ b/gems/ipynbdiff/spec/testdata/only_code_no_metadata/expected_symbols.txt
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_code_no_metadata/input.ipynb b/gems/ipynbdiff/spec/testdata/only_code_no_metadata/input.ipynb
index 364c080168b..364c080168b 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/only_code_no_metadata/input.ipynb
+++ b/gems/ipynbdiff/spec/testdata/only_code_no_metadata/input.ipynb
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_md/expected.md b/gems/ipynbdiff/spec/testdata/only_md/expected.md
index bdf4db5aea5..bdf4db5aea5 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/only_md/expected.md
+++ b/gems/ipynbdiff/spec/testdata/only_md/expected.md
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_md/expected_symbols.txt b/gems/ipynbdiff/spec/testdata/only_md/expected_symbols.txt
index d3d6d526fc3..d3d6d526fc3 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/only_md/expected_symbols.txt
+++ b/gems/ipynbdiff/spec/testdata/only_md/expected_symbols.txt
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_md/input.ipynb b/gems/ipynbdiff/spec/testdata/only_md/input.ipynb
index 9d6b550af31..9d6b550af31 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/only_md/input.ipynb
+++ b/gems/ipynbdiff/spec/testdata/only_md/input.ipynb
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_raw/expected.md b/gems/ipynbdiff/spec/testdata/only_raw/expected.md
index 91c476e843b..91c476e843b 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/only_raw/expected.md
+++ b/gems/ipynbdiff/spec/testdata/only_raw/expected.md
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_raw/expected_symbols.txt b/gems/ipynbdiff/spec/testdata/only_raw/expected_symbols.txt
index bceaf355c2f..bceaf355c2f 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/only_raw/expected_symbols.txt
+++ b/gems/ipynbdiff/spec/testdata/only_raw/expected_symbols.txt
diff --git a/vendor/gems/ipynbdiff/spec/testdata/only_raw/input.ipynb b/gems/ipynbdiff/spec/testdata/only_raw/input.ipynb
index 750e1bba615..750e1bba615 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/only_raw/input.ipynb
+++ b/gems/ipynbdiff/spec/testdata/only_raw/input.ipynb
diff --git a/vendor/gems/ipynbdiff/spec/testdata/percent_decorator/expected.md b/gems/ipynbdiff/spec/testdata/percent_decorator/expected.md
index 1ece1f2fd06..1ece1f2fd06 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/percent_decorator/expected.md
+++ b/gems/ipynbdiff/spec/testdata/percent_decorator/expected.md
diff --git a/vendor/gems/ipynbdiff/spec/testdata/percent_decorator/expected_symbols.txt b/gems/ipynbdiff/spec/testdata/percent_decorator/expected_symbols.txt
index c95665d1903..c95665d1903 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/percent_decorator/expected_symbols.txt
+++ b/gems/ipynbdiff/spec/testdata/percent_decorator/expected_symbols.txt
diff --git a/vendor/gems/ipynbdiff/spec/testdata/single_line_md/expected.md b/gems/ipynbdiff/spec/testdata/single_line_md/expected.md
index 392a5048f59..392a5048f59 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/single_line_md/expected.md
+++ b/gems/ipynbdiff/spec/testdata/single_line_md/expected.md
diff --git a/vendor/gems/ipynbdiff/spec/testdata/single_line_md/expected_symbols.txt b/gems/ipynbdiff/spec/testdata/single_line_md/expected_symbols.txt
index 86a7f6b3960..86a7f6b3960 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/single_line_md/expected_symbols.txt
+++ b/gems/ipynbdiff/spec/testdata/single_line_md/expected_symbols.txt
diff --git a/vendor/gems/ipynbdiff/spec/testdata/single_line_md/input.ipynb b/gems/ipynbdiff/spec/testdata/single_line_md/input.ipynb
index 5ebd41adbfa..5ebd41adbfa 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/single_line_md/input.ipynb
+++ b/gems/ipynbdiff/spec/testdata/single_line_md/input.ipynb
diff --git a/vendor/gems/ipynbdiff/spec/testdata/source_with_linebreak/expected.md b/gems/ipynbdiff/spec/testdata/source_with_linebreak/expected.md
index 180fffe24ce..180fffe24ce 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/source_with_linebreak/expected.md
+++ b/gems/ipynbdiff/spec/testdata/source_with_linebreak/expected.md
diff --git a/vendor/gems/ipynbdiff/spec/testdata/source_with_linebreak/expected_symbols.txt b/gems/ipynbdiff/spec/testdata/source_with_linebreak/expected_symbols.txt
index 1e8bdda4b9a..1e8bdda4b9a 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/source_with_linebreak/expected_symbols.txt
+++ b/gems/ipynbdiff/spec/testdata/source_with_linebreak/expected_symbols.txt
diff --git a/vendor/gems/ipynbdiff/spec/testdata/source_with_linebreak/input.ipynb b/gems/ipynbdiff/spec/testdata/source_with_linebreak/input.ipynb
index faacc703969..faacc703969 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/source_with_linebreak/input.ipynb
+++ b/gems/ipynbdiff/spec/testdata/source_with_linebreak/input.ipynb
diff --git a/vendor/gems/ipynbdiff/spec/testdata/stream_text/expected.md b/gems/ipynbdiff/spec/testdata/stream_text/expected.md
index 0448bf21111..0448bf21111 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/stream_text/expected.md
+++ b/gems/ipynbdiff/spec/testdata/stream_text/expected.md
diff --git a/vendor/gems/ipynbdiff/spec/testdata/stream_text/expected_symbols.txt b/gems/ipynbdiff/spec/testdata/stream_text/expected_symbols.txt
index be4e2861ea9..be4e2861ea9 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/stream_text/expected_symbols.txt
+++ b/gems/ipynbdiff/spec/testdata/stream_text/expected_symbols.txt
diff --git a/vendor/gems/ipynbdiff/spec/testdata/stream_text/input.ipynb b/gems/ipynbdiff/spec/testdata/stream_text/input.ipynb
index 14601fe35e5..14601fe35e5 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/stream_text/input.ipynb
+++ b/gems/ipynbdiff/spec/testdata/stream_text/input.ipynb
diff --git a/vendor/gems/ipynbdiff/spec/testdata/svg/expected.md b/gems/ipynbdiff/spec/testdata/svg/expected.md
index a5a167d31c5..a5a167d31c5 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/svg/expected.md
+++ b/gems/ipynbdiff/spec/testdata/svg/expected.md
diff --git a/vendor/gems/ipynbdiff/spec/testdata/svg/expected_symbols.txt b/gems/ipynbdiff/spec/testdata/svg/expected_symbols.txt
index 861198a8c92..861198a8c92 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/svg/expected_symbols.txt
+++ b/gems/ipynbdiff/spec/testdata/svg/expected_symbols.txt
diff --git a/vendor/gems/ipynbdiff/spec/testdata/svg/input.ipynb b/gems/ipynbdiff/spec/testdata/svg/input.ipynb
index a02d01f7bf2..a02d01f7bf2 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/svg/input.ipynb
+++ b/gems/ipynbdiff/spec/testdata/svg/input.ipynb
diff --git a/vendor/gems/ipynbdiff/spec/testdata/text_output/expected.md b/gems/ipynbdiff/spec/testdata/text_output/expected.md
index 1b6c086ecd5..1b6c086ecd5 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/text_output/expected.md
+++ b/gems/ipynbdiff/spec/testdata/text_output/expected.md
diff --git a/vendor/gems/ipynbdiff/spec/testdata/text_output/expected_symbols.txt b/gems/ipynbdiff/spec/testdata/text_output/expected_symbols.txt
index a004d852ba4..a004d852ba4 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/text_output/expected_symbols.txt
+++ b/gems/ipynbdiff/spec/testdata/text_output/expected_symbols.txt
diff --git a/vendor/gems/ipynbdiff/spec/testdata/text_output/input.ipynb b/gems/ipynbdiff/spec/testdata/text_output/input.ipynb
index b1b387bb99d..b1b387bb99d 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/text_output/input.ipynb
+++ b/gems/ipynbdiff/spec/testdata/text_output/input.ipynb
diff --git a/vendor/gems/ipynbdiff/spec/testdata/text_png_output/expected.md b/gems/ipynbdiff/spec/testdata/text_png_output/expected.md
index c77f109378c..c77f109378c 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/text_png_output/expected.md
+++ b/gems/ipynbdiff/spec/testdata/text_png_output/expected.md
diff --git a/vendor/gems/ipynbdiff/spec/testdata/text_png_output/expected_line_numbers.txt b/gems/ipynbdiff/spec/testdata/text_png_output/expected_line_numbers.txt
index 62e35deb96d..62e35deb96d 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/text_png_output/expected_line_numbers.txt
+++ b/gems/ipynbdiff/spec/testdata/text_png_output/expected_line_numbers.txt
diff --git a/vendor/gems/ipynbdiff/spec/testdata/text_png_output/expected_symbols.txt b/gems/ipynbdiff/spec/testdata/text_png_output/expected_symbols.txt
index 49f2d7149d8..49f2d7149d8 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/text_png_output/expected_symbols.txt
+++ b/gems/ipynbdiff/spec/testdata/text_png_output/expected_symbols.txt
diff --git a/vendor/gems/ipynbdiff/spec/testdata/text_png_output/input.ipynb b/gems/ipynbdiff/spec/testdata/text_png_output/input.ipynb
index 3728b129d26..3728b129d26 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/text_png_output/input.ipynb
+++ b/gems/ipynbdiff/spec/testdata/text_png_output/input.ipynb
diff --git a/vendor/gems/ipynbdiff/spec/testdata/to.ipynb b/gems/ipynbdiff/spec/testdata/to.ipynb
index 99b51f3b857..99b51f3b857 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/to.ipynb
+++ b/gems/ipynbdiff/spec/testdata/to.ipynb
diff --git a/vendor/gems/ipynbdiff/spec/testdata/unknown_output_type/expected.md b/gems/ipynbdiff/spec/testdata/unknown_output_type/expected.md
index af34d6eb8c3..af34d6eb8c3 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/unknown_output_type/expected.md
+++ b/gems/ipynbdiff/spec/testdata/unknown_output_type/expected.md
diff --git a/vendor/gems/ipynbdiff/spec/testdata/unknown_output_type/expected_symbols.txt b/gems/ipynbdiff/spec/testdata/unknown_output_type/expected_symbols.txt
index cb35f88c897..cb35f88c897 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/unknown_output_type/expected_symbols.txt
+++ b/gems/ipynbdiff/spec/testdata/unknown_output_type/expected_symbols.txt
diff --git a/vendor/gems/ipynbdiff/spec/testdata/unknown_output_type/input.ipynb b/gems/ipynbdiff/spec/testdata/unknown_output_type/input.ipynb
index 42f4b39b365..42f4b39b365 100644
--- a/vendor/gems/ipynbdiff/spec/testdata/unknown_output_type/input.ipynb
+++ b/gems/ipynbdiff/spec/testdata/unknown_output_type/input.ipynb
diff --git a/gems/rspec_flaky/.gitignore b/gems/rspec_flaky/.gitignore
new file mode 100644
index 00000000000..b04a8c840df
--- /dev/null
+++ b/gems/rspec_flaky/.gitignore
@@ -0,0 +1,11 @@
+/.bundle/
+/.yardoc
+/_yardoc/
+/coverage/
+/doc/
+/pkg/
+/spec/reports/
+/tmp/
+
+# rspec failure tracking
+.rspec_status
diff --git a/gems/rspec_flaky/.gitlab-ci.yml b/gems/rspec_flaky/.gitlab-ci.yml
new file mode 100644
index 00000000000..41fac86e7a5
--- /dev/null
+++ b/gems/rspec_flaky/.gitlab-ci.yml
@@ -0,0 +1,4 @@
+include:
+ - local: gems/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "rspec_flaky"
diff --git a/gems/rspec_flaky/.rspec b/gems/rspec_flaky/.rspec
new file mode 100644
index 00000000000..34c5164d9b5
--- /dev/null
+++ b/gems/rspec_flaky/.rspec
@@ -0,0 +1,3 @@
+--format documentation
+--color
+--require spec_helper
diff --git a/gems/rspec_flaky/.rubocop.yml b/gems/rspec_flaky/.rubocop.yml
new file mode 100644
index 00000000000..62cb8a982c5
--- /dev/null
+++ b/gems/rspec_flaky/.rubocop.yml
@@ -0,0 +1,13 @@
+inherit_from:
+ - ../config/rubocop.yml
+
+# FIXME once Gitlab::Json is in a gem
+Gitlab/Json:
+ Enabled: false
+
+# FIXME
+RSpec/MultipleMemoizedHelpers:
+ Enabled: false
+
+RSpec/VerifiedDoubles:
+ Enabled: false
diff --git a/gems/rspec_flaky/Gemfile b/gems/rspec_flaky/Gemfile
new file mode 100644
index 00000000000..90bf29fb647
--- /dev/null
+++ b/gems/rspec_flaky/Gemfile
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+source "https://rubygems.org"
+
+# Specify your gem's dependencies in rspec_flaky.gemspec
+gemspec
+
+gem "gitlab-rspec", "~> 0.1", path: "../gitlab-rspec"
diff --git a/gems/rspec_flaky/Gemfile.lock b/gems/rspec_flaky/Gemfile.lock
new file mode 100644
index 00000000000..547dc24e375
--- /dev/null
+++ b/gems/rspec_flaky/Gemfile.lock
@@ -0,0 +1,126 @@
+PATH
+ remote: ../gitlab-rspec
+ specs:
+ gitlab-rspec (0.1.0)
+ activesupport (>= 6.1, < 7.1)
+ rspec (~> 3.0)
+
+PATH
+ remote: .
+ specs:
+ rspec_flaky (0.1.0)
+ activesupport (>= 6.1, < 7.1)
+ rspec (~> 3.0)
+
+GEM
+ remote: https://rubygems.org/
+ specs:
+ activesupport (7.0.6)
+ concurrent-ruby (~> 1.0, >= 1.0.2)
+ i18n (>= 1.6, < 2)
+ minitest (>= 5.1)
+ tzinfo (~> 2.0)
+ ast (2.4.2)
+ binding_of_caller (1.0.0)
+ debug_inspector (>= 0.0.1)
+ coderay (1.1.3)
+ concurrent-ruby (1.2.2)
+ debug_inspector (1.1.0)
+ diff-lcs (1.5.0)
+ gitlab-styles (10.1.0)
+ rubocop (~> 1.50.2)
+ rubocop-graphql (~> 0.18)
+ rubocop-performance (~> 1.15)
+ rubocop-rails (~> 2.17)
+ rubocop-rspec (~> 2.22)
+ i18n (1.14.1)
+ concurrent-ruby (~> 1.0)
+ json (2.6.3)
+ minitest (5.18.1)
+ parallel (1.23.0)
+ parser (3.2.2.3)
+ ast (~> 2.4.1)
+ racc
+ proc_to_ast (0.1.0)
+ coderay
+ parser
+ unparser
+ racc (1.7.1)
+ rack (3.0.8)
+ rainbow (3.1.1)
+ regexp_parser (2.8.1)
+ rexml (3.2.5)
+ rspec (3.12.0)
+ rspec-core (~> 3.12.0)
+ rspec-expectations (~> 3.12.0)
+ rspec-mocks (~> 3.12.0)
+ rspec-core (3.12.2)
+ rspec-support (~> 3.12.0)
+ rspec-expectations (3.12.3)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.12.0)
+ rspec-mocks (3.12.5)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.12.0)
+ rspec-parameterized (1.0.0)
+ rspec-parameterized-core (< 2)
+ rspec-parameterized-table_syntax (< 2)
+ rspec-parameterized-core (1.0.0)
+ parser
+ proc_to_ast
+ rspec (>= 2.13, < 4)
+ unparser
+ rspec-parameterized-table_syntax (1.0.0)
+ binding_of_caller
+ rspec-parameterized-core (< 2)
+ rspec-support (3.12.1)
+ rubocop (1.50.2)
+ json (~> 2.3)
+ parallel (~> 1.10)
+ parser (>= 3.2.0.0)
+ rainbow (>= 2.2.2, < 4.0)
+ regexp_parser (>= 1.8, < 3.0)
+ rexml (>= 3.2.5, < 4.0)
+ rubocop-ast (>= 1.28.0, < 2.0)
+ ruby-progressbar (~> 1.7)
+ unicode-display_width (>= 2.4.0, < 3.0)
+ rubocop-ast (1.29.0)
+ parser (>= 3.2.1.0)
+ rubocop-capybara (2.18.0)
+ rubocop (~> 1.41)
+ rubocop-factory_bot (2.23.1)
+ rubocop (~> 1.33)
+ rubocop-graphql (0.19.0)
+ rubocop (>= 0.87, < 2)
+ rubocop-performance (1.18.0)
+ rubocop (>= 1.7.0, < 2.0)
+ rubocop-ast (>= 0.4.0)
+ rubocop-rails (2.20.2)
+ activesupport (>= 4.2.0)
+ rack (>= 1.1)
+ rubocop (>= 1.33.0, < 2.0)
+ rubocop-rspec (2.22.0)
+ rubocop (~> 1.33)
+ rubocop-capybara (~> 2.17)
+ rubocop-factory_bot (~> 2.22)
+ ruby-progressbar (1.13.0)
+ tzinfo (2.0.6)
+ concurrent-ruby (~> 1.0)
+ unicode-display_width (2.4.2)
+ unparser (0.6.8)
+ diff-lcs (~> 1.3)
+ parser (>= 3.2.0)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ gitlab-rspec (~> 0.1)!
+ gitlab-styles (~> 10.1.0)
+ rspec-parameterized (~> 1.0)
+ rspec_flaky!
+ rubocop (~> 1.50)
+ rubocop-rspec (~> 2.22)
+
+BUNDLED WITH
+ 2.4.14
diff --git a/gems/rspec_flaky/lib/rspec_flaky.rb b/gems/rspec_flaky/lib/rspec_flaky.rb
new file mode 100644
index 00000000000..90fc6b1dc49
--- /dev/null
+++ b/gems/rspec_flaky/lib/rspec_flaky.rb
@@ -0,0 +1,6 @@
+# frozen_string_literal: true
+
+require "rspec"
+require_relative "rspec_flaky/config"
+require_relative "rspec_flaky/listener"
+require_relative "rspec_flaky/version"
diff --git a/gems/rspec_flaky/lib/rspec_flaky/config.rb b/gems/rspec_flaky/lib/rspec_flaky/config.rb
new file mode 100644
index 00000000000..ca57d1e08be
--- /dev/null
+++ b/gems/rspec_flaky/lib/rspec_flaky/config.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module RspecFlaky
+ class Config
+ def self.generate_report?
+ !!(ENV['FLAKY_RSPEC_GENERATE_REPORT'] =~ /1|true/)
+ end
+
+ def self.suite_flaky_examples_report_path
+ ENV['FLAKY_RSPEC_SUITE_REPORT_PATH'] || "rspec/flaky/suite-report.json"
+ end
+
+ def self.flaky_examples_report_path
+ ENV['FLAKY_RSPEC_REPORT_PATH'] || "rspec/flaky/report.json"
+ end
+
+ def self.new_flaky_examples_report_path
+ ENV['NEW_FLAKY_RSPEC_REPORT_PATH'] || "rspec/flaky/new-report.json"
+ end
+ end
+end
diff --git a/gems/rspec_flaky/lib/rspec_flaky/example.rb b/gems/rspec_flaky/lib/rspec_flaky/example.rb
new file mode 100644
index 00000000000..4a128a151dc
--- /dev/null
+++ b/gems/rspec_flaky/lib/rspec_flaky/example.rb
@@ -0,0 +1,68 @@
+# frozen_string_literal: true
+
+require 'forwardable'
+require 'digest'
+
+module RspecFlaky
+ # This is a wrapper class for RSpec::Core::Example
+ class Example
+ extend Forwardable
+
+ def_delegators :execution_result, :status, :exception
+
+ def initialize(rspec_example)
+ @rspec_example = rspec_example.respond_to?(:example) ? rspec_example.example : rspec_example
+ end
+
+ def uid
+ @uid ||= Digest::MD5.hexdigest("#{description}-#{file}") # rubocop:disable Fips/MD5
+ end
+
+ def example_id
+ rspec_example.id
+ end
+
+ def file
+ metadata[:file_path]
+ end
+
+ def line
+ metadata[:line_number]
+ end
+
+ def description
+ metadata[:full_description]
+ end
+
+ def attempts
+ rspec_example.respond_to?(:attempts) ? rspec_example.attempts : 1
+ end
+
+ def feature_category
+ metadata[:feature_category]
+ end
+
+ def to_h
+ {
+ example_id: example_id,
+ file: file,
+ line: line,
+ description: description,
+ last_attempts_count: attempts,
+ feature_category: feature_category
+ }
+ end
+
+ private
+
+ attr_reader :rspec_example
+
+ def metadata
+ rspec_example.metadata
+ end
+
+ def execution_result
+ rspec_example.execution_result
+ end
+ end
+end
diff --git a/gems/rspec_flaky/lib/rspec_flaky/flaky_example.rb b/gems/rspec_flaky/lib/rspec_flaky/flaky_example.rb
new file mode 100644
index 00000000000..35d1f34d2a2
--- /dev/null
+++ b/gems/rspec_flaky/lib/rspec_flaky/flaky_example.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+require 'ostruct'
+
+module RspecFlaky
+ # This represents a flaky RSpec example and is mainly meant to be saved in a JSON file
+ class FlakyExample
+ ALLOWED_ATTRIBUTES = %i[
+ example_id
+ file
+ line
+ description
+ first_flaky_at
+ last_flaky_at
+ last_flaky_job
+ last_attempts_count
+ flaky_reports
+ feature_category
+ ].freeze
+
+ def initialize(example_hash)
+ @attributes = {
+ first_flaky_at: Time.now,
+ last_flaky_at: Time.now,
+ last_flaky_job: nil,
+ last_attempts_count: example_hash[:attempts],
+ flaky_reports: 0,
+ feature_category: example_hash[:feature_category]
+ }.merge(example_hash.slice(*ALLOWED_ATTRIBUTES))
+
+ %i[first_flaky_at last_flaky_at].each do |attr|
+ attributes[attr] = Time.parse(attributes[attr]) if attributes[attr].is_a?(String)
+ end
+ end
+
+ def update!(example_hash)
+ attributes[:file] = example_hash[:file]
+ attributes[:line] = example_hash[:line]
+ attributes[:description] = example_hash[:description]
+ attributes[:first_flaky_at] ||= Time.now
+ attributes[:last_flaky_at] = Time.now
+ attributes[:flaky_reports] += 1
+ attributes[:feature_category] = example_hash[:feature_category]
+ attributes[:last_attempts_count] = example_hash[:last_attempts_count] if example_hash[:last_attempts_count]
+
+ return unless ENV['CI_JOB_URL']
+
+ attributes[:last_flaky_job] = (ENV['CI_JOB_URL']).to_s
+ end
+
+ def to_h
+ attributes.dup
+ end
+
+ private
+
+ attr_reader :attributes
+ end
+end
diff --git a/gems/rspec_flaky/lib/rspec_flaky/flaky_examples_collection.rb b/gems/rspec_flaky/lib/rspec_flaky/flaky_examples_collection.rb
new file mode 100644
index 00000000000..f03fe63d11b
--- /dev/null
+++ b/gems/rspec_flaky/lib/rspec_flaky/flaky_examples_collection.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+require 'active_support/hash_with_indifferent_access'
+require 'delegate'
+
+require_relative 'flaky_example'
+
+module RspecFlaky
+ class FlakyExamplesCollection < SimpleDelegator
+ def initialize(collection = {})
+ raise ArgumentError, "`collection` must be a Hash, #{collection.class} given!" unless collection.is_a?(Hash)
+
+ collection_of_flaky_examples =
+ collection.map do |uid, example|
+ [
+ uid,
+ FlakyExample.new(example.to_h.symbolize_keys)
+ ]
+ end
+
+ super(Hash[collection_of_flaky_examples])
+ end
+
+ def to_h
+ transform_values(&:to_h).deep_symbolize_keys
+ end
+
+ def -(other)
+ raise ArgumentError, "`other` must respond to `#key?`, #{other.class} does not!" unless other.respond_to?(:key)
+
+ self.class.new(reject { |uid, _| other.key?(uid) })
+ end
+ end
+end
diff --git a/gems/rspec_flaky/lib/rspec_flaky/listener.rb b/gems/rspec_flaky/lib/rspec_flaky/listener.rb
new file mode 100644
index 00000000000..c2deb1c327a
--- /dev/null
+++ b/gems/rspec_flaky/lib/rspec_flaky/listener.rb
@@ -0,0 +1,70 @@
+# frozen_string_literal: true
+
+require 'json'
+
+require_relative 'config'
+require_relative 'example'
+require_relative 'flaky_example'
+require_relative 'flaky_examples_collection'
+require_relative 'report'
+
+module RspecFlaky
+ class Listener
+ # - suite_flaky_examples: contains all the currently tracked flacky example
+ # for the whole RSpec suite
+ # - flaky_examples: contains the examples detected as flaky during the
+ # current RSpec run
+ attr_reader :suite_flaky_examples, :flaky_examples
+
+ def initialize(suite_flaky_examples_json = nil)
+ @flaky_examples = FlakyExamplesCollection.new
+ @suite_flaky_examples = init_suite_flaky_examples(suite_flaky_examples_json)
+ end
+
+ def example_passed(notification)
+ current_example = Example.new(notification.example)
+
+ return unless current_example.attempts > 1
+
+ flaky_example = suite_flaky_examples.fetch(current_example.uid) do
+ FlakyExample.new(current_example.to_h)
+ end
+ flaky_example.update!(current_example.to_h)
+
+ flaky_examples[current_example.uid] = flaky_example
+ end
+
+ def dump_summary(_)
+ Report.new(flaky_examples).write(Config.flaky_examples_report_path)
+
+ return unless new_flaky_examples.any?
+
+ rails_logger_warn("\nNew flaky examples detected:\n")
+ rails_logger_warn(JSON.pretty_generate(new_flaky_examples.to_h))
+
+ Report.new(new_flaky_examples).write(Config.new_flaky_examples_report_path)
+ end
+
+ private
+
+ def new_flaky_examples
+ @new_flaky_examples ||= flaky_examples - suite_flaky_examples
+ end
+
+ def init_suite_flaky_examples(suite_flaky_examples_json = nil)
+ if suite_flaky_examples_json
+ Report.load_json(suite_flaky_examples_json).flaky_examples
+ else
+ return {} unless File.exist?(Config.suite_flaky_examples_report_path)
+
+ Report.load(Config.suite_flaky_examples_report_path).flaky_examples
+ end
+ end
+
+ def rails_logger_warn(text)
+ target = defined?(Rails) ? Rails.logger : Kernel
+
+ target.warn(text)
+ end
+ end
+end
diff --git a/gems/rspec_flaky/lib/rspec_flaky/report.rb b/gems/rspec_flaky/lib/rspec_flaky/report.rb
new file mode 100644
index 00000000000..cc213d336ae
--- /dev/null
+++ b/gems/rspec_flaky/lib/rspec_flaky/report.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+require 'json'
+require 'time'
+require 'fileutils'
+
+require_relative 'config'
+require_relative 'flaky_examples_collection'
+
+module RspecFlaky
+ # This class is responsible for loading/saving JSON reports, and pruning
+ # outdated examples.
+ class Report < SimpleDelegator
+ OUTDATED_DAYS_THRESHOLD = 7
+
+ attr_reader :flaky_examples
+
+ def self.load(file_path)
+ load_json(File.read(file_path))
+ end
+
+ def self.load_json(json)
+ new(FlakyExamplesCollection.new(JSON.parse(json)))
+ end
+
+ def initialize(flaky_examples)
+ unless flaky_examples.is_a?(FlakyExamplesCollection)
+ raise ArgumentError,
+ "`flaky_examples` must be a RspecFlaky::FlakyExamplesCollection, #{flaky_examples.class} given!"
+ end
+
+ @flaky_examples = flaky_examples
+ super(flaky_examples)
+ end
+
+ def write(file_path)
+ unless Config.generate_report?
+ Kernel.warn "! Generating reports is disabled. To enable it, please set the `FLAKY_RSPEC_GENERATE_REPORT=1` !"
+ return
+ end
+
+ report_path_dir = File.dirname(file_path)
+ FileUtils.mkdir_p(report_path_dir)
+
+ File.write(file_path, JSON.pretty_generate(flaky_examples.to_h))
+ end
+
+ def prune_outdated(days: OUTDATED_DAYS_THRESHOLD)
+ outdated_date_threshold = Time.now - (3600 * 24 * days)
+ recent_flaky_examples = flaky_examples.dup
+ .delete_if do |_uid, flaky_example|
+ last_flaky_at = flaky_example.to_h[:last_flaky_at]
+ last_flaky_at && last_flaky_at.to_i < outdated_date_threshold.to_i
+ end
+
+ self.class.new(FlakyExamplesCollection.new(recent_flaky_examples))
+ end
+ end
+end
diff --git a/gems/rspec_flaky/lib/rspec_flaky/version.rb b/gems/rspec_flaky/lib/rspec_flaky/version.rb
new file mode 100644
index 00000000000..ec507d734c8
--- /dev/null
+++ b/gems/rspec_flaky/lib/rspec_flaky/version.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+module RspecFlaky
+ module Version
+ VERSION = "0.1.0"
+ end
+end
diff --git a/gems/rspec_flaky/rspec_flaky.gemspec b/gems/rspec_flaky/rspec_flaky.gemspec
new file mode 100644
index 00000000000..5c0a434218f
--- /dev/null
+++ b/gems/rspec_flaky/rspec_flaky.gemspec
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+require_relative "lib/rspec_flaky/version"
+
+Gem::Specification.new do |spec|
+ spec.name = "rspec_flaky"
+ spec.version = RspecFlaky::Version::VERSION
+ spec.authors = ["Engineering Productivity"]
+ spec.email = ["quality@gitlab.com"]
+
+ spec.summary = "GitLab's RSpec Flaky test detector"
+ spec.description =
+ "This gem provide an RSpec listener that allows to detect flaky examples. See " \
+ "https://docs.gitlab.com/ee/development/testing_guide/flaky_tests.html#automatic-retries-and-flaky-tests-detection."
+ spec.homepage = "https://gitlab.com/gitlab-org/gitlab/-/tree/master/gems/rspec_flaky"
+ spec.license = "MIT"
+ spec.required_ruby_version = ">= 3.0"
+ spec.metadata["rubygems_mfa_required"] = "true"
+
+ spec.files = Dir["lib/**/*.rb"]
+ spec.require_paths = ["lib"]
+
+ spec.add_runtime_dependency "activesupport", ">= 6.1", "< 7.1"
+ spec.add_runtime_dependency "rspec", "~> 3.0"
+
+ spec.add_development_dependency "gitlab-styles", "~> 10.1.0"
+ spec.add_development_dependency "rspec-parameterized", "~> 1.0"
+ spec.add_development_dependency "rubocop", "~> 1.50"
+ spec.add_development_dependency "rubocop-rspec", "~> 2.22"
+end
diff --git a/gems/rspec_flaky/spec/rspec_flaky/config_spec.rb b/gems/rspec_flaky/spec/rspec_flaky/config_spec.rb
new file mode 100644
index 00000000000..827249efefa
--- /dev/null
+++ b/gems/rspec_flaky/spec/rspec_flaky/config_spec.rb
@@ -0,0 +1,99 @@
+# frozen_string_literal: true
+
+require 'rspec_flaky/config'
+
+RSpec.describe RspecFlaky::Config, :aggregate_failures do
+ include StubENV
+
+ before do
+ # Stub these env variables otherwise specs don't behave the same on the CI
+ stub_env('FLAKY_RSPEC_GENERATE_REPORT', nil)
+ stub_env('FLAKY_RSPEC_SUITE_REPORT_PATH', nil)
+ stub_env('FLAKY_RSPEC_REPORT_PATH', nil)
+ stub_env('NEW_FLAKY_RSPEC_REPORT_PATH', nil)
+ end
+
+ describe '.generate_report?' do
+ context "when ENV['FLAKY_RSPEC_GENERATE_REPORT'] is not set" do
+ it 'returns false' do
+ expect(described_class).not_to be_generate_report
+ end
+ end
+
+ context "when ENV['FLAKY_RSPEC_GENERATE_REPORT'] is set" do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:env_value, :result) do
+ '1' | true
+ 'true' | true
+ 'foo' | false
+ '0' | false
+ 'false' | false
+ end
+
+ with_them do
+ before do
+ stub_env('FLAKY_RSPEC_GENERATE_REPORT', env_value)
+ end
+
+ it 'returns false' do
+ expect(described_class.generate_report?).to be(result)
+ end
+ end
+ end
+ end
+
+ describe '.suite_flaky_examples_report_path' do
+ context "when ENV['FLAKY_RSPEC_SUITE_REPORT_PATH'] is not set" do
+ it 'returns the default path' do
+ expect(described_class.suite_flaky_examples_report_path).to eq('rspec/flaky/suite-report.json')
+ end
+ end
+
+ context "when ENV['FLAKY_RSPEC_SUITE_REPORT_PATH'] is set" do
+ before do
+ stub_env('FLAKY_RSPEC_SUITE_REPORT_PATH', 'foo/suite-report.json')
+ end
+
+ it 'returns the value of the env variable' do
+ expect(described_class.suite_flaky_examples_report_path).to eq('foo/suite-report.json')
+ end
+ end
+ end
+
+ describe '.flaky_examples_report_path' do
+ context "when ENV['FLAKY_RSPEC_REPORT_PATH'] is not set" do
+ it 'returns the default path' do
+ expect(described_class.flaky_examples_report_path).to eq('rspec/flaky/report.json')
+ end
+ end
+
+ context "when ENV['FLAKY_RSPEC_REPORT_PATH'] is set" do
+ before do
+ stub_env('FLAKY_RSPEC_REPORT_PATH', 'foo/report.json')
+ end
+
+ it 'returns the value of the env variable' do
+ expect(described_class.flaky_examples_report_path).to eq('foo/report.json')
+ end
+ end
+ end
+
+ describe '.new_flaky_examples_report_path' do
+ context "when ENV['NEW_FLAKY_RSPEC_REPORT_PATH'] is not set" do
+ it 'returns the default path' do
+ expect(described_class.new_flaky_examples_report_path).to eq('rspec/flaky/new-report.json')
+ end
+ end
+
+ context "when ENV['NEW_FLAKY_RSPEC_REPORT_PATH'] is set" do
+ before do
+ stub_env('NEW_FLAKY_RSPEC_REPORT_PATH', 'foo/new-report.json')
+ end
+
+ it 'returns the value of the env variable' do
+ expect(described_class.new_flaky_examples_report_path).to eq('foo/new-report.json')
+ end
+ end
+ end
+end
diff --git a/gems/rspec_flaky/spec/rspec_flaky/example_spec.rb b/gems/rspec_flaky/spec/rspec_flaky/example_spec.rb
new file mode 100644
index 00000000000..64d65c0e170
--- /dev/null
+++ b/gems/rspec_flaky/spec/rspec_flaky/example_spec.rb
@@ -0,0 +1,99 @@
+# frozen_string_literal: true
+
+require 'rspec_flaky/example'
+
+RSpec.describe RspecFlaky::Example do
+ let(:example_attrs) do
+ {
+ id: 'spec/foo/bar_spec.rb:2',
+ metadata: {
+ file_path: 'spec/foo/bar_spec.rb',
+ line_number: 2,
+ full_description: 'hello world',
+ feature_category: :feature_category
+ },
+ execution_result: double(status: 'passed', exception: 'BOOM!'),
+ attempts: 1
+ }
+ end
+
+ let(:rspec_example) { double(example_attrs) }
+
+ describe '#initialize' do
+ shared_examples 'a valid Example instance' do
+ it 'returns valid attributes' do
+ example = described_class.new(args)
+
+ expect(example.example_id).to eq(example_attrs[:id])
+ end
+ end
+
+ context 'when given an Rspec::Core::Example that responds to #example' do
+ let(:args) { double(example: rspec_example) }
+
+ it_behaves_like 'a valid Example instance'
+ end
+
+ context 'when given an Rspec::Core::Example that does not respond to #example' do
+ let(:args) { rspec_example }
+
+ it_behaves_like 'a valid Example instance'
+ end
+ end
+
+ subject { described_class.new(rspec_example) }
+
+ describe '#uid' do
+ it 'returns a hash of the full description' do
+ expect(subject.uid).to eq(Digest::MD5.hexdigest("#{subject.description}-#{subject.file}")) # rubocop:disable Fips/MD5
+ end
+ end
+
+ describe '#example_id' do
+ it 'returns the ID of the RSpec::Core::Example' do
+ expect(subject.example_id).to eq(rspec_example.id)
+ end
+ end
+
+ describe '#attempts' do
+ it 'returns the attempts of the RSpec::Core::Example' do
+ expect(subject.attempts).to eq(rspec_example.attempts)
+ end
+ end
+
+ describe '#file' do
+ it 'returns the metadata[:file_path] of the RSpec::Core::Example' do
+ expect(subject.file).to eq(rspec_example.metadata[:file_path])
+ end
+ end
+
+ describe '#line' do
+ it 'returns the metadata[:line_number] of the RSpec::Core::Example' do
+ expect(subject.line).to eq(rspec_example.metadata[:line_number])
+ end
+ end
+
+ describe '#description' do
+ it 'returns the metadata[:full_description] of the RSpec::Core::Example' do
+ expect(subject.description).to eq(rspec_example.metadata[:full_description])
+ end
+ end
+
+ describe '#status' do
+ it 'returns the execution_result.status of the RSpec::Core::Example' do
+ expect(subject.status).to eq(rspec_example.execution_result.status)
+ end
+ end
+
+ describe '#exception' do
+ it 'returns the execution_result.exception of the RSpec::Core::Example' do
+ expect(subject.exception).to eq(rspec_example.execution_result.exception)
+ end
+ end
+
+ describe '#feature_category' do
+ it 'returns the metadata[:feature_category] of the RSpec::Core::Example' do
+ expect(subject.feature_category).to eq(rspec_example.metadata[:feature_category])
+ end
+ end
+end
diff --git a/gems/rspec_flaky/spec/rspec_flaky/flaky_example_spec.rb b/gems/rspec_flaky/spec/rspec_flaky/flaky_example_spec.rb
new file mode 100644
index 00000000000..244ca275f14
--- /dev/null
+++ b/gems/rspec_flaky/spec/rspec_flaky/flaky_example_spec.rb
@@ -0,0 +1,144 @@
+# frozen_string_literal: true
+
+require 'rspec_flaky/flaky_example'
+
+RSpec.describe RspecFlaky::FlakyExample, :aggregate_failures do
+ include StubENV
+
+ let(:example_attrs) do
+ {
+ example_id: 'spec/foo/bar_spec.rb:2',
+ file: 'spec/foo/bar_spec.rb',
+ line: 2,
+ description: 'hello world',
+ last_attempts_count: 2,
+ feature_category: :feature_category
+ }
+ end
+
+ before do
+ # Stub these env variables otherwise specs don't behave the same on the CI
+ stub_env('CI_JOB_URL', nil)
+ end
+
+ describe '#initialize', :freeze_time do
+ shared_examples 'a valid FlakyExample instance' do
+ let(:flaky_example) { described_class.new(args) }
+
+ it 'returns valid attributes' do
+ attrs = flaky_example.to_h
+
+ expect(attrs[:uid]).to eq(example_attrs[:uid])
+ expect(attrs[:file]).to eq(example_attrs[:file])
+ expect(attrs[:line]).to eq(example_attrs[:line])
+ expect(attrs[:description]).to eq(example_attrs[:description])
+ expect(attrs[:feature_category]).to eq(example_attrs[:feature_category])
+ expect(attrs[:first_flaky_at]).to eq(expected_first_flaky_at)
+ expect(attrs[:last_flaky_at]).to eq(expected_last_flaky_at)
+ expect(attrs[:last_attempts_count]).to eq(example_attrs[:last_attempts_count])
+ expect(attrs[:flaky_reports]).to eq(expected_flaky_reports)
+ end
+ end
+
+ context 'when given an Example.to_h' do
+ it_behaves_like 'a valid FlakyExample instance' do
+ let(:args) { example_attrs }
+ let(:expected_first_flaky_at) { Time.now }
+ let(:expected_last_flaky_at) { Time.now }
+ let(:expected_flaky_reports) { 0 }
+ end
+ end
+ end
+
+ describe '#update!' do
+ shared_examples 'an up-to-date FlakyExample instance' do
+ let(:flaky_example) { described_class.new(args) }
+
+ it 'sets the first_flaky_at if none exists' do
+ args[:first_flaky_at] = nil
+
+ freeze_time do
+ flaky_example.update!(example_attrs)
+
+ expect(flaky_example.to_h[:first_flaky_at]).to eq(Time.now)
+ end
+ end
+
+ it 'maintains the first_flaky_at if exists' do
+ flaky_example.update!(example_attrs)
+ expected_first_flaky_at = flaky_example.to_h[:first_flaky_at]
+
+ travel_to(Time.now + 42) do
+ flaky_example.update!(example_attrs)
+ expect(flaky_example.to_h[:first_flaky_at]).to eq(expected_first_flaky_at)
+ end
+ end
+
+ it 'updates the last_flaky_at' do
+ travel_to(Time.now + 42) do
+ the_future = Time.now
+ flaky_example.update!(example_attrs)
+
+ expect(flaky_example.to_h[:last_flaky_at]).to eq(the_future)
+ end
+ end
+
+ it 'updates the flaky_reports' do
+ expected_flaky_reports = flaky_example.to_h[:first_flaky_at] ? flaky_example.to_h[:flaky_reports] + 1 : 1
+
+ expect { flaky_example.update!(example_attrs) }.to change { flaky_example.to_h[:flaky_reports] }.by(1)
+ expect(flaky_example.to_h[:flaky_reports]).to eq(expected_flaky_reports)
+ end
+
+ it 'updates the last_attempts_count' do
+ example_attrs[:last_attempts_count] = 42
+ flaky_example.update!(example_attrs)
+
+ expect(flaky_example.to_h[:last_attempts_count]).to eq(42)
+ end
+
+ context 'when run on the CI' do
+ let(:job_url) { 'https://gitlab.com/gitlab-org/gitlab-foss/-/jobs/42' }
+
+ before do
+ stub_env('CI_JOB_URL', job_url)
+ end
+
+ it 'updates the last_flaky_job' do
+ flaky_example.update!(example_attrs)
+
+ expect(flaky_example.to_h[:last_flaky_job]).to eq(job_url)
+ end
+ end
+ end
+
+ context 'when given an Example hash' do
+ it_behaves_like 'an up-to-date FlakyExample instance' do
+ let(:args) { example_attrs }
+ end
+ end
+ end
+
+ describe '#to_h', :freeze_time do
+ shared_examples 'a valid FlakyExample hash' do
+ let(:additional_attrs) { {} }
+
+ it 'returns a valid hash' do
+ flaky_example = described_class.new(args)
+ final_hash = example_attrs.merge(additional_attrs)
+
+ expect(flaky_example.to_h).to eq(final_hash)
+ end
+ end
+
+ context 'when given an Example hash' do
+ let(:args) { example_attrs }
+
+ it_behaves_like 'a valid FlakyExample hash' do
+ let(:additional_attrs) do
+ { first_flaky_at: Time.now, last_flaky_at: Time.now, last_flaky_job: nil, flaky_reports: 0 }
+ end
+ end
+ end
+ end
+end
diff --git a/gems/rspec_flaky/spec/rspec_flaky/flaky_examples_collection_spec.rb b/gems/rspec_flaky/spec/rspec_flaky/flaky_examples_collection_spec.rb
new file mode 100644
index 00000000000..260ebc72192
--- /dev/null
+++ b/gems/rspec_flaky/spec/rspec_flaky/flaky_examples_collection_spec.rb
@@ -0,0 +1,87 @@
+# frozen_string_literal: true
+
+require 'rspec_flaky/flaky_examples_collection'
+
+RSpec.describe RspecFlaky::FlakyExamplesCollection, :aggregate_failures, :freeze_time do
+ let(:collection_hash) do
+ {
+ a: { example_id: 'spec/foo/bar_spec.rb:2' },
+ b: { example_id: 'spec/foo/baz_spec.rb:3' }
+ }
+ end
+
+ let(:collection_report) do
+ {
+ a: {
+ example_id: 'spec/foo/bar_spec.rb:2',
+ first_flaky_at: Time.now,
+ last_flaky_at: Time.now,
+ last_flaky_job: nil,
+ flaky_reports: 0,
+ feature_category: nil,
+ last_attempts_count: nil
+ },
+ b: {
+ example_id: 'spec/foo/baz_spec.rb:3',
+ first_flaky_at: Time.now,
+ last_flaky_at: Time.now,
+ last_flaky_job: nil,
+ flaky_reports: 0,
+ feature_category: nil,
+ last_attempts_count: nil
+ }
+ }
+ end
+
+ describe '#initialize' do
+ it 'accepts no argument' do
+ expect { described_class.new }.not_to raise_error
+ end
+
+ it 'accepts a hash' do
+ expect { described_class.new(collection_hash) }.not_to raise_error
+ end
+
+ it 'does not accept anything else' do
+ expect do
+ described_class.new([1, 2, 3])
+ end.to raise_error(ArgumentError, "`collection` must be a Hash, Array given!")
+ end
+ end
+
+ describe '#to_h' do
+ it 'calls #to_h on the values' do
+ collection = described_class.new(collection_hash)
+
+ expect(collection.to_h).to eq(collection_report)
+ end
+ end
+
+ describe '#-' do
+ it 'returns only examples that are not present in the given collection' do
+ collection1 = described_class.new(collection_hash)
+ collection2 = described_class.new(
+ a: { example_id: 'spec/foo/bar_spec.rb:2' },
+ c: { example_id: 'spec/bar/baz_spec.rb:4' })
+
+ expect((collection2 - collection1).to_h).to eq(
+ c: {
+ example_id: 'spec/bar/baz_spec.rb:4',
+ first_flaky_at: Time.now,
+ last_flaky_at: Time.now,
+ last_flaky_job: nil,
+ flaky_reports: 0,
+ feature_category: nil,
+ last_attempts_count: nil
+ })
+ end
+
+ it 'fails if the given collection does not respond to `#key?`' do
+ collection = described_class.new(collection_hash)
+
+ expect do
+ collection - [1, 2, 3]
+ end.to raise_error(ArgumentError, "`other` must respond to `#key?`, Array does not!")
+ end
+ end
+end
diff --git a/gems/rspec_flaky/spec/rspec_flaky/listener_spec.rb b/gems/rspec_flaky/spec/rspec_flaky/listener_spec.rb
new file mode 100644
index 00000000000..cbc5422a763
--- /dev/null
+++ b/gems/rspec_flaky/spec/rspec_flaky/listener_spec.rb
@@ -0,0 +1,229 @@
+# frozen_string_literal: true
+
+require 'rspec_flaky/listener'
+
+RSpec.describe RspecFlaky::Listener, :aggregate_failures do
+ include StubENV
+
+ let(:already_flaky_example_uid) { '6e869794f4cfd2badd93eb68719371d1' }
+ let(:suite_flaky_example_report) do
+ {
+ "#{already_flaky_example_uid}": {
+ example_id: 'spec/foo/bar_spec.rb:2',
+ file: 'spec/foo/bar_spec.rb',
+ line: 2,
+ description: 'hello world',
+ first_flaky_at: 1234,
+ last_flaky_at: 4321,
+ last_attempts_count: 3,
+ flaky_reports: 1,
+ last_flaky_job: nil
+ }
+ }
+ end
+
+ let(:already_flaky_example_attrs) do
+ {
+ id: 'spec/foo/bar_spec.rb:2',
+ metadata: {
+ file_path: 'spec/foo/bar_spec.rb',
+ line_number: 2,
+ full_description: 'hello world'
+ },
+ execution_result: double(status: 'passed', exception: nil)
+ }
+ end
+
+ let(:already_flaky_example) do
+ RspecFlaky::FlakyExample.new(suite_flaky_example_report[already_flaky_example_uid])
+ end
+
+ let(:new_example_attrs) do
+ {
+ id: 'spec/foo/baz_spec.rb:3',
+ metadata: {
+ file_path: 'spec/foo/baz_spec.rb',
+ line_number: 3,
+ full_description: 'hello GitLab'
+ },
+ execution_result: double(status: 'passed', exception: nil)
+ }
+ end
+
+ before do
+ # Stub these env variables otherwise specs don't behave the same on the CI
+ stub_env('CI_JOB_URL', nil)
+ stub_env('FLAKY_RSPEC_SUITE_REPORT_PATH', nil)
+ end
+
+ describe '#initialize' do
+ shared_examples 'a valid Listener instance' do
+ let(:expected_suite_flaky_examples) { {} }
+
+ it 'returns a valid Listener instance' do
+ listener = described_class.new
+
+ expect(listener.suite_flaky_examples.to_h).to eq(expected_suite_flaky_examples)
+ expect(listener.flaky_examples).to eq({})
+ end
+ end
+
+ context 'when no report file exists' do
+ it_behaves_like 'a valid Listener instance'
+ end
+
+ context 'when FLAKY_RSPEC_SUITE_REPORT_PATH is set' do
+ let(:report_file_path) { 'foo/report.json' }
+
+ before do
+ stub_env('FLAKY_RSPEC_SUITE_REPORT_PATH', report_file_path)
+ end
+
+ context 'when report file exists' do
+ before do
+ allow(File).to receive(:exist?).with(report_file_path).and_return(true)
+ end
+
+ it 'delegates the load to RspecFlaky::Report' do
+ report = RspecFlaky::Report
+ .new(RspecFlaky::FlakyExamplesCollection.new(suite_flaky_example_report))
+
+ expect(RspecFlaky::Report).to receive(:load).with(report_file_path).and_return(report)
+ expect(described_class.new.suite_flaky_examples.to_h).to eq(report.flaky_examples.to_h)
+ end
+ end
+
+ context 'when report file does not exist' do
+ before do
+ allow(File).to receive(:exist?).with(report_file_path).and_return(false)
+ end
+
+ it 'return an empty hash' do
+ expect(RspecFlaky::Report).not_to receive(:load)
+ expect(described_class.new.suite_flaky_examples.to_h).to eq({})
+ end
+ end
+ end
+ end
+
+ describe '#example_passed' do
+ let(:rspec_example) { double(new_example_attrs) }
+ let(:notification) { double(example: rspec_example) }
+ let(:listener) { described_class.new(suite_flaky_example_report.to_json) }
+
+ shared_examples 'a non-flaky example' do
+ it 'does not change the flaky examples hash' do
+ expect { listener.example_passed(notification) }
+ .not_to change { listener.flaky_examples }
+ end
+ end
+
+ shared_examples 'an existing flaky example' do
+ let(:expected_flaky_example) do
+ {
+ example_id: 'spec/foo/bar_spec.rb:2',
+ file: 'spec/foo/bar_spec.rb',
+ line: 2,
+ description: 'hello world',
+ first_flaky_at: 1234,
+ last_attempts_count: 2,
+ flaky_reports: 2,
+ feature_category: nil,
+ last_flaky_job: nil
+ }
+ end
+
+ it 'changes the flaky examples hash' do
+ new_example = RspecFlaky::Example.new(rspec_example)
+
+ travel_to(Time.now + 42) do
+ the_future = Time.now
+ expect { listener.example_passed(notification) }
+ .to change { listener.flaky_examples[new_example.uid].to_h }
+ expect(listener.flaky_examples[new_example.uid].to_h)
+ .to eq(expected_flaky_example.merge(last_flaky_at: the_future))
+ end
+ end
+ end
+
+ shared_examples 'a new flaky example' do
+ let(:expected_flaky_example) do
+ {
+ example_id: 'spec/foo/baz_spec.rb:3',
+ file: 'spec/foo/baz_spec.rb',
+ line: 3,
+ description: 'hello GitLab',
+ last_attempts_count: 2,
+ flaky_reports: 1,
+ feature_category: nil,
+ last_flaky_job: nil
+ }
+ end
+
+ it 'changes the all flaky examples hash' do
+ new_example = RspecFlaky::Example.new(rspec_example)
+
+ travel_to(Time.now + 42) do
+ the_future = Time.now
+ expect { listener.example_passed(notification) }
+ .to change { listener.flaky_examples[new_example.uid].to_h }
+ expect(listener.flaky_examples[new_example.uid].to_h)
+ .to eq(expected_flaky_example.merge(first_flaky_at: the_future, last_flaky_at: the_future))
+ end
+ end
+ end
+
+ describe 'when the RSpec example does not respond to attempts' do
+ it_behaves_like 'a non-flaky example'
+ end
+
+ describe 'when the RSpec example has 1 attempt' do
+ let(:rspec_example) { double(new_example_attrs.merge(attempts: 1)) }
+
+ it_behaves_like 'a non-flaky example'
+ end
+
+ describe 'when the RSpec example has 2 attempts' do
+ let(:rspec_example) { double(new_example_attrs.merge(attempts: 2)) }
+
+ it_behaves_like 'a new flaky example'
+
+ context 'with an existing flaky example' do
+ let(:rspec_example) { double(already_flaky_example_attrs.merge(attempts: 2)) }
+
+ it_behaves_like 'an existing flaky example'
+ end
+ end
+ end
+
+ describe '#dump_summary' do
+ let(:listener) { described_class.new(suite_flaky_example_report.to_json) }
+ let(:new_flaky_rspec_example) { double(new_example_attrs.merge(attempts: 2)) }
+ let(:already_flaky_rspec_example) { double(already_flaky_example_attrs.merge(attempts: 2)) }
+ let(:notification_new_flaky_rspec_example) { double(example: new_flaky_rspec_example) }
+ let(:notification_already_flaky_rspec_example) { double(example: already_flaky_rspec_example) }
+
+ before do
+ allow(Kernel).to receive(:warn)
+ end
+
+ context 'when a report file path is set by FLAKY_RSPEC_REPORT_PATH' do
+ it 'delegates the writes to RspecFlaky::Report' do
+ listener.example_passed(notification_new_flaky_rspec_example)
+ listener.example_passed(notification_already_flaky_rspec_example)
+
+ report1 = double
+ report2 = double
+
+ expect(RspecFlaky::Report).to receive(:new).with(listener.flaky_examples).and_return(report1)
+ expect(report1).to receive(:write).with(RspecFlaky::Config.flaky_examples_report_path)
+
+ expect(RspecFlaky::Report)
+ .to receive(:new).with(listener.__send__(:new_flaky_examples)).and_return(report2)
+ expect(report2).to receive(:write).with(RspecFlaky::Config.new_flaky_examples_report_path)
+
+ listener.dump_summary(nil)
+ end
+ end
+ end
+end
diff --git a/gems/rspec_flaky/spec/rspec_flaky/report_spec.rb b/gems/rspec_flaky/spec/rspec_flaky/report_spec.rb
new file mode 100644
index 00000000000..e1e9bd6a7b1
--- /dev/null
+++ b/gems/rspec_flaky/spec/rspec_flaky/report_spec.rb
@@ -0,0 +1,141 @@
+# frozen_string_literal: true
+
+require 'tempfile'
+
+require 'rspec_flaky/report'
+
+RSpec.describe RspecFlaky::Report, :aggregate_failures, :freeze_time do
+ let(:thirty_one_days) { 3600 * 24 * 31 }
+ let(:collection_hash) do
+ {
+ a: { example_id: 'spec/foo/bar_spec.rb:2' },
+ b: { example_id: 'spec/foo/baz_spec.rb:3', first_flaky_at: (Time.now - thirty_one_days).to_s,
+ last_flaky_at: (Time.now - thirty_one_days).to_s }
+ }
+ end
+
+ let(:suite_flaky_example_report) do
+ {
+ '6e869794f4cfd2badd93eb68719371d1': {
+ example_id: 'spec/foo/bar_spec.rb:2',
+ file: 'spec/foo/bar_spec.rb',
+ line: 2,
+ description: 'hello world',
+ first_flaky_at: 1234,
+ last_flaky_at: 4321,
+ last_attempts_count: 3,
+ flaky_reports: 1,
+ feature_category: 'feature_category',
+ last_flaky_job: nil
+ }
+ }
+ end
+
+ let(:flaky_examples) { RspecFlaky::FlakyExamplesCollection.new(collection_hash) }
+ let(:report) { described_class.new(flaky_examples) }
+
+ before do
+ allow(Kernel).to receive(:warn)
+ end
+
+ describe '.load' do
+ let!(:report_file) do
+ Tempfile.new(%w[rspec_flaky_report .json]).tap do |f|
+ f.write(JSON.pretty_generate(suite_flaky_example_report))
+ f.rewind
+ end
+ end
+
+ after do
+ report_file.close
+ report_file.unlink
+ end
+
+ it 'loads the report file' do
+ expect(described_class.load(report_file.path).flaky_examples.to_h).to eq(suite_flaky_example_report)
+ end
+ end
+
+ describe '.load_json' do
+ let(:report_json) do
+ JSON.pretty_generate(suite_flaky_example_report)
+ end
+
+ it 'loads the report file' do
+ expect(described_class.load_json(report_json).flaky_examples.to_h).to eq(suite_flaky_example_report)
+ end
+ end
+
+ describe '#initialize' do
+ it 'accepts a RspecFlaky::FlakyExamplesCollection' do
+ expect { report }.not_to raise_error
+ end
+
+ it 'does not accept anything else' do
+ expect do
+ described_class.new([1, 2,
+ 3])
+ end.to raise_error(ArgumentError,
+ "`flaky_examples` must be a RspecFlaky::FlakyExamplesCollection, Array given!")
+ end
+ end
+
+ it 'delegates to #flaky_examples using SimpleDelegator' do
+ expect(report.__getobj__).to eq(flaky_examples)
+ end
+
+ describe '#write' do
+ let(:report_file_path) { File.join('tmp', 'rspec_flaky_report.json') }
+
+ before do
+ FileUtils.rm_f(report_file_path)
+ end
+
+ after do
+ FileUtils.rm_f(report_file_path)
+ end
+
+ context 'when RspecFlaky::Config.generate_report? is false' do
+ before do
+ allow(RspecFlaky::Config).to receive(:generate_report?).and_return(false)
+ end
+
+ it 'does not write any report file' do
+ report.write(report_file_path)
+
+ expect(File.exist?(report_file_path)).to be(false)
+ end
+ end
+
+ context 'when RspecFlaky::Config.generate_report? is true' do
+ before do
+ allow(RspecFlaky::Config).to receive(:generate_report?).and_return(true)
+ end
+
+ it 'delegates the writes to RspecFlaky::Report' do
+ report.write(report_file_path)
+
+ expect(File.exist?(report_file_path)).to be(true)
+ expect(File.read(report_file_path))
+ .to eq(JSON.pretty_generate(report.flaky_examples.to_h))
+ end
+ end
+ end
+
+ describe '#prune_outdated' do
+ it 'returns a new collection without the examples older than 30 days by default' do
+ new_report = flaky_examples.to_h.dup.tap { |r| r.delete(:b) }
+ new_flaky_examples = report.prune_outdated
+
+ expect(new_flaky_examples).to be_a(described_class)
+ expect(new_flaky_examples.to_h).to eq(new_report)
+ expect(flaky_examples).to have_key(:b)
+ end
+
+ it 'accepts a given number of days' do
+ new_flaky_examples = report.prune_outdated(days: 32)
+
+ expect(new_flaky_examples.to_h).to eq(report.to_h)
+ end
+ end
+end
diff --git a/gems/rspec_flaky/spec/spec_helper.rb b/gems/rspec_flaky/spec/spec_helper.rb
new file mode 100644
index 00000000000..72d48ee6e63
--- /dev/null
+++ b/gems/rspec_flaky/spec/spec_helper.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+require "rspec-parameterized"
+require "gitlab/rspec/all"
+require "rspec_flaky"
+
+RSpec.configure do |config|
+ # Enable flags like --only-failures and --next-failure
+ config.example_status_persistence_file_path = ".rspec_status"
+
+ # Disable RSpec exposing methods globally on `Module` and `main`
+ config.disable_monkey_patching!
+
+ config.expect_with :rspec do |c|
+ c.syntax = :expect
+ end
+end
diff --git a/generator_templates/active_record/migration/create_table_migration.rb b/generator_templates/active_record/migration/create_table_migration.rb.tt
index 0b0cb05249c..0b0cb05249c 100644
--- a/generator_templates/active_record/migration/create_table_migration.rb
+++ b/generator_templates/active_record/migration/create_table_migration.rb.tt
diff --git a/generator_templates/active_record/migration/migration.rb b/generator_templates/active_record/migration/migration.rb.tt
index 50d2b018ae7..50d2b018ae7 100644
--- a/generator_templates/active_record/migration/migration.rb
+++ b/generator_templates/active_record/migration/migration.rb.tt
diff --git a/generator_templates/gitlab_internal_events/metric_definition.yml b/generator_templates/gitlab_internal_events/metric_definition.yml
index c0ff71a09ce..108db77d0d0 100644
--- a/generator_templates/gitlab_internal_events/metric_definition.yml
+++ b/generator_templates/gitlab_internal_events/metric_definition.yml
@@ -10,7 +10,7 @@ status: active
milestone: "<%= milestone %>"
introduced_by_url: <%= options.fetch(:mr) %>
time_frame: <%= args.third %>
-data_source: redis_hll
+data_source: internal_events
data_category: optional
instrumentation_class: <%= class_name %>
distribution: <%= distributions %>
diff --git a/generator_templates/post_deployment_migration/post_deployment_migration/migration.rb b/generator_templates/post_deployment_migration/post_deployment_migration/migration.rb.tt
index dcc9d1e4563..dcc9d1e4563 100644
--- a/generator_templates/post_deployment_migration/post_deployment_migration/migration.rb
+++ b/generator_templates/post_deployment_migration/post_deployment_migration/migration.rb.tt
diff --git a/glfm_specification/output_example_snapshots/html.yml b/glfm_specification/output_example_snapshots/html.yml
index d47d1d71b27..a301ab48fc0 100644
--- a/glfm_specification/output_example_snapshots/html.yml
+++ b/glfm_specification/output_example_snapshots/html.yml
@@ -34,7 +34,7 @@
</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>foo</p><p>bar</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">foo</p><p dir="auto">bar</p></li></ul>
02_01_00__preliminaries__tabs__005:
canonical: |
<ul>
@@ -55,7 +55,7 @@
</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>foo</p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code> bar</code></pre></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">foo</p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code> bar</code></pre></li></ul>
02_01_00__preliminaries__tabs__006:
canonical: |
<blockquote>
@@ -89,7 +89,7 @@
</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p></p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code> foo</code></pre></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto"></p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code> foo</code></pre></li></ul>
02_01_00__preliminaries__tabs__008:
canonical: |
<pre><code>foo
@@ -130,7 +130,7 @@
</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>foo</p><ul dir="auto" bullet="*"><li dir="auto"><p>bar</p><ul dir="auto" bullet="*"><li dir="auto"><p>baz</p></li></ul></li></ul></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">foo</p><ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">bar</p><ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">baz</p></li></ul></li></ul></li></ul>
02_01_00__preliminaries__tabs__010:
canonical: |
<h1>Foo</h1>
@@ -158,7 +158,7 @@
<li data-sourcepos="2:1-2:6">two`</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>`one</p></li><li dir="auto"><p>two`</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">`one</p></li><li dir="auto"><p dir="auto">two`</p></li></ul>
04_01_00__leaf_blocks__thematic_breaks__001:
canonical: |
<hr />
@@ -178,14 +178,14 @@
static: |-
<p data-sourcepos="1:1-1:3" dir="auto">+++</p>
wysiwyg: |-
- <p>+++</p>
+ <p dir="auto">+++</p>
04_01_00__leaf_blocks__thematic_breaks__003:
canonical: |
<p>===</p>
static: |-
<p data-sourcepos="1:1-1:3" dir="auto">===</p>
wysiwyg: |-
- <p>===</p>
+ <p dir="auto">===</p>
04_01_00__leaf_blocks__thematic_breaks__004:
canonical: |
<p>--
@@ -196,7 +196,7 @@
**
__</p>
wysiwyg: |-
- <p>--
+ <p dir="auto">--
**
__</p>
04_01_00__leaf_blocks__thematic_breaks__005:
@@ -231,7 +231,7 @@
<p data-sourcepos="1:1-2:7" dir="auto">Foo
***</p>
wysiwyg: |-
- <p>Foo
+ <p dir="auto">Foo
***</p>
04_01_00__leaf_blocks__thematic_breaks__008:
canonical: |
@@ -278,16 +278,16 @@
<p data-sourcepos="3:1-3:7" dir="auto">a------</p>
<p data-sourcepos="5:1-5:7" dir="auto">---a---</p>
wysiwyg: |-
- <p>_ _ _ _ a</p>
- <p>a------</p>
- <p>---a---</p>
+ <p dir="auto">_ _ _ _ a</p>
+ <p dir="auto">a------</p>
+ <p dir="auto">---a---</p>
04_01_00__leaf_blocks__thematic_breaks__014:
canonical: |
<p><em>-</em></p>
static: |-
<p data-sourcepos="1:2-1:4" dir="auto"><em>-</em></p>
wysiwyg: |-
- <p><em>-</em></p>
+ <p dir="auto"><em>-</em></p>
04_01_00__leaf_blocks__thematic_breaks__015:
canonical: |
<ul>
@@ -306,9 +306,9 @@
<li data-sourcepos="3:1-3:5">bar</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>foo</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">foo</p></li></ul>
<hr>
- <ul dir="auto" bullet="*"><li dir="auto"><p>bar</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">bar</p></li></ul>
04_01_00__leaf_blocks__thematic_breaks__016:
canonical: |
<p>Foo</p>
@@ -319,9 +319,9 @@
<hr data-sourcepos="2:1-2:3">
<p data-sourcepos="3:1-3:3" dir="auto">bar</p>
wysiwyg: |-
- <p>Foo</p>
+ <p dir="auto">Foo</p>
<hr>
- <p>bar</p>
+ <p dir="auto">bar</p>
04_01_00__leaf_blocks__thematic_breaks__017:
canonical: |
<h2>Foo</h2>
@@ -332,7 +332,7 @@
<p data-sourcepos="3:1-3:3" dir="auto">bar</p>
wysiwyg: |-
<h2 dir="auto">Foo</h2>
- <p>bar</p>
+ <p dir="auto">bar</p>
04_01_00__leaf_blocks__thematic_breaks__018:
canonical: |
<ul>
@@ -351,9 +351,9 @@
<li data-sourcepos="3:1-3:5">Bar</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>Foo</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">Foo</p></li></ul>
<hr>
- <ul dir="auto" bullet="*"><li dir="auto"><p>Bar</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">Bar</p></li></ul>
04_01_00__leaf_blocks__thematic_breaks__019:
canonical: |
<ul>
@@ -370,7 +370,7 @@
</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>Foo</p></li><li dir="auto"><p></p><hr></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">Foo</p></li><li dir="auto"><p dir="auto"></p><hr></li></ul>
04_02_00__leaf_blocks__atx_headings__001:
canonical: |
<h1>foo</h1>
@@ -405,7 +405,7 @@
static: |-
<p data-sourcepos="1:1-1:11" dir="auto">####### foo</p>
wysiwyg: |-
- <p>####### foo</p>
+ <p dir="auto">####### foo</p>
04_02_00__leaf_blocks__atx_headings__003:
canonical: |
<p>#5 bolt</p>
@@ -414,15 +414,15 @@
<p data-sourcepos="1:1-1:7" dir="auto">#5 bolt</p>
<p data-sourcepos="3:1-3:8" dir="auto">#hashtag</p>
wysiwyg: |-
- <p>#5 bolt</p>
- <p>#hashtag</p>
+ <p dir="auto">#5 bolt</p>
+ <p dir="auto">#hashtag</p>
04_02_00__leaf_blocks__atx_headings__004:
canonical: |
<p>## foo</p>
static: |-
<p data-sourcepos="1:1-1:28" dir="auto"><span data-escaped-char>#</span># foo</p>
wysiwyg: |-
- <p>## foo</p>
+ <p dir="auto">## foo</p>
04_02_00__leaf_blocks__atx_headings__005:
canonical: |
<h1>foo <em>bar</em> *baz*</h1>
@@ -474,7 +474,7 @@
<p data-sourcepos="1:1-2:9" dir="auto">foo
# bar</p>
wysiwyg: |-
- <p>foo
+ <p dir="auto">foo
# bar</p>
04_02_00__leaf_blocks__atx_headings__010:
canonical: |
@@ -566,9 +566,9 @@
<a id="user-content-baz" class="anchor" href="#baz" aria-hidden="true"></a>baz</h1>
<p data-sourcepos="3:1-3:7" dir="auto">Bar foo</p>
wysiwyg: |-
- <p>Foo bar</p>
+ <p dir="auto">Foo bar</p>
<h1 dir="auto">baz</h1>
- <p>Bar foo</p>
+ <p dir="auto">Bar foo</p>
04_02_00__leaf_blocks__atx_headings__018:
canonical: |
<h2></h2>
@@ -687,7 +687,7 @@
<p data-sourcepos="1:1-2:7" dir="auto">Foo
---</p>
wysiwyg: |-
- <p>Foo
+ <p dir="auto">Foo
---</p>
04_03_00__leaf_blocks__setext_headings__009:
canonical: |
@@ -701,9 +701,9 @@
<p data-sourcepos="4:1-4:3" dir="auto">Foo</p>
<hr data-sourcepos="5:1-5:5">
wysiwyg: |-
- <p>Foo
+ <p dir="auto">Foo
= =</p>
- <p>Foo</p>
+ <p dir="auto">Foo</p>
<hr>
04_03_00__leaf_blocks__setext_headings__010:
canonical: |
@@ -736,9 +736,9 @@
<p data-sourcepos="7:1-7:12" dir="auto">of dashes"/&gt;</p>
wysiwyg: |-
<h2 dir="auto">`Foo</h2>
- <p>`</p>
+ <p dir="auto">`</p>
<h2 dir="auto">&lt;a title="a lot</h2>
- <p>of dashes"/&gt;</p>
+ <p dir="auto">of dashes"/&gt;</p>
04_03_00__leaf_blocks__setext_headings__013:
canonical: |
<blockquote>
@@ -751,7 +751,7 @@
</blockquote>
<hr data-sourcepos="2:1-2:3">
wysiwyg: |-
- <blockquote dir="auto" multiline="false"><p>Foo</p></blockquote>
+ <blockquote dir="auto" multiline="false"><p dir="auto">Foo</p></blockquote>
<hr>
04_03_00__leaf_blocks__setext_headings__014:
canonical: |
@@ -767,7 +767,7 @@
===</p>
</blockquote>
wysiwyg: |-
- <blockquote dir="auto" multiline="false"><p>foo
+ <blockquote dir="auto" multiline="false"><p dir="auto">foo
bar
===</p></blockquote>
04_03_00__leaf_blocks__setext_headings__015:
@@ -782,7 +782,7 @@
</ul>
<hr data-sourcepos="2:1-2:3">
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>Foo</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">Foo</p></li></ul>
<hr>
04_03_00__leaf_blocks__setext_headings__016:
canonical: |
@@ -812,14 +812,14 @@
wysiwyg: |-
<pre language="yaml" class="content-editor-code-block undefined code highlight" isfrontmatter="true"><code>Foo</code></pre>
<h2 dir="auto">Bar</h2>
- <p>Baz</p>
+ <p dir="auto">Baz</p>
04_03_00__leaf_blocks__setext_headings__018:
canonical: |
<p>====</p>
static: |-
<p data-sourcepos="2:1-2:4" dir="auto">====</p>
wysiwyg: |-
- <p>====</p>
+ <p dir="auto">====</p>
04_03_00__leaf_blocks__setext_headings__019:
canonical: |
<hr />
@@ -843,7 +843,7 @@
</ul>
<hr data-sourcepos="2:1-2:5">
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>foo</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">foo</p></li></ul>
<hr>
04_03_00__leaf_blocks__setext_headings__021:
canonical: |
@@ -871,7 +871,7 @@
</blockquote>
<hr data-sourcepos="2:1-2:5">
wysiwyg: |-
- <blockquote dir="auto" multiline="false"><p>foo</p></blockquote>
+ <blockquote dir="auto" multiline="false"><p dir="auto">foo</p></blockquote>
<hr>
04_03_00__leaf_blocks__setext_headings__023:
canonical: |
@@ -892,9 +892,9 @@
<a id="user-content-bar" class="anchor" href="#bar" aria-hidden="true"></a>bar</h2>
<p data-sourcepos="5:1-5:3" dir="auto">baz</p>
wysiwyg: |-
- <p>Foo</p>
+ <p dir="auto">Foo</p>
<h2 dir="auto">bar</h2>
- <p>baz</p>
+ <p dir="auto">baz</p>
04_03_00__leaf_blocks__setext_headings__025:
canonical: |
<p>Foo
@@ -907,10 +907,10 @@
<hr data-sourcepos="4:1-5:0">
<p data-sourcepos="6:1-6:3" dir="auto">baz</p>
wysiwyg: |-
- <p>Foo
+ <p dir="auto">Foo
bar</p>
<hr>
- <p>baz</p>
+ <p dir="auto">baz</p>
04_03_00__leaf_blocks__setext_headings__026:
canonical: |
<p>Foo
@@ -923,10 +923,10 @@
<hr data-sourcepos="3:1-3:5">
<p data-sourcepos="4:1-4:3" dir="auto">baz</p>
wysiwyg: |-
- <p>Foo
+ <p dir="auto">Foo
bar</p>
<hr>
- <p>baz</p>
+ <p dir="auto">baz</p>
04_03_00__leaf_blocks__setext_headings__027:
canonical: |
<p>Foo
@@ -939,7 +939,7 @@
---
baz</p>
wysiwyg: |-
- <p>Foo
+ <p dir="auto">Foo
bar
---
baz</p>
@@ -973,7 +973,7 @@
</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>foo</p><p>bar</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">foo</p><p dir="auto">bar</p></li></ul>
04_04_00__leaf_blocks__indented_code_blocks__003:
canonical: |
<ol>
@@ -994,7 +994,7 @@
</li>
</ol>
wysiwyg: |-
- <ol dir="auto" parens="false"><li dir="auto"><p>foo</p><ul dir="auto" bullet="*"><li dir="auto"><p>bar</p></li></ul></li></ol>
+ <ol dir="auto" parens="false"><li dir="auto"><p dir="auto">foo</p><ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">bar</p></li></ul></li></ol>
04_04_00__leaf_blocks__indented_code_blocks__004:
canonical: |
<pre><code>&lt;a/&gt;
@@ -1063,7 +1063,7 @@
<p data-sourcepos="1:1-2:7" dir="auto">Foo
bar</p>
wysiwyg: |-
- <p>Foo
+ <p dir="auto">Foo
bar</p>
04_04_00__leaf_blocks__indented_code_blocks__008:
canonical: |
@@ -1078,7 +1078,7 @@
<p data-sourcepos="2:1-2:3" dir="auto">bar</p>
wysiwyg: |-
<pre dir="auto" class="content-editor-code-block undefined code highlight"><code>foo</code></pre>
- <p>bar</p>
+ <p dir="auto">bar</p>
04_04_00__leaf_blocks__indented_code_blocks__009:
canonical: |
<h1>Heading</h1>
@@ -1176,7 +1176,7 @@
static: |-
<p data-sourcepos="1:1-3:2" dir="auto"><code>foo</code></p>
wysiwyg: |-
- <p><code>foo</code></p>
+ <p dir="auto"><code>foo</code></p>
04_05_00__leaf_blocks__fenced_code_blocks__004:
canonical: |
<pre><code>aaa
@@ -1277,7 +1277,7 @@
<p data-sourcepos="4:1-4:3" dir="auto">bbb</p>
wysiwyg: |-
<blockquote dir="auto" multiline="false"><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>aaa</code></pre></blockquote>
- <p>bbb</p>
+ <p dir="auto">bbb</p>
04_05_00__leaf_blocks__fenced_code_blocks__011:
canonical: "<pre><code>\n \n</code></pre>\n"
static: |-
@@ -1407,7 +1407,7 @@
<p data-sourcepos="1:1-2:3" dir="auto"><code> </code>
aaa</p>
wysiwyg: |-
- <p>
+ <p dir="auto">
aaa</p>
04_05_00__leaf_blocks__fenced_code_blocks__021:
canonical: |
@@ -1437,9 +1437,9 @@
</div>
<p data-sourcepos="5:1-5:3" dir="auto">baz</p>
wysiwyg: |-
- <p>foo</p>
+ <p dir="auto">foo</p>
<pre dir="auto" class="content-editor-code-block undefined code highlight"><code>bar</code></pre>
- <p>baz</p>
+ <p dir="auto">baz</p>
04_05_00__leaf_blocks__fenced_code_blocks__023:
canonical: |
<h2>foo</h2>
@@ -1511,7 +1511,7 @@
<p data-sourcepos="1:1-2:3" dir="auto"><code>aa</code>
foo</p>
wysiwyg: |-
- <p><code>aa</code>
+ <p dir="auto"><code>aa</code>
foo</p>
04_05_00__leaf_blocks__fenced_code_blocks__028:
canonical: |
@@ -1551,9 +1551,9 @@
</p></pre>
</td></tr></table>
wysiwyg: |-
- <table><tbody><tr><td colspan="1" rowspan="1"><pre><p>**Hello**,
- </p><p><em>world</em>.
- </p></pre><p></p></td></tr></tbody></table>
+ <table><tbody><tr><td colspan="1" rowspan="1"><pre><p dir="auto">**Hello**,
+ </p><p dir="auto"><em>world</em>.
+ </p></pre><p dir="auto"></p></td></tr></tbody></table>
04_06_00__leaf_blocks__html_blocks__002:
canonical: |
<table>
@@ -1574,10 +1574,10 @@
</table>
<p data-sourcepos="9:1-9:5" dir="auto">okay.</p>
wysiwyg: |-
- <table><tbody><tr><td colspan="1" rowspan="1"><p>
+ <table><tbody><tr><td colspan="1" rowspan="1"><p dir="auto">
hi
</p></td></tr></tbody></table>
- <p>okay.</p>
+ <p dir="auto">okay.</p>
04_06_00__leaf_blocks__html_blocks__003:
canonical: |2
<div>
@@ -1589,7 +1589,7 @@
<a></a>
</div>
wysiwyg: |-
- <div><p>
+ <div><p dir="auto">
*hello*
</p></div>
04_06_00__leaf_blocks__html_blocks__004:
@@ -1600,7 +1600,7 @@
*foo*
wysiwyg: |-
- <p>
+ <p dir="auto">
*foo*</p>
04_06_00__leaf_blocks__html_blocks__005:
canonical: |
@@ -1612,7 +1612,7 @@
<p data-sourcepos="3:1-3:10"><em>Markdown</em></p>
</div>
wysiwyg: |-
- <div><p><em>Markdown</em></p></div>
+ <div><p dir="auto"><em>Markdown</em></p></div>
04_06_00__leaf_blocks__html_blocks__006:
canonical: |
<div id="foo"
@@ -1644,9 +1644,9 @@
<p data-sourcepos="4:1-4:5"><em>bar</em></p>
</div>
wysiwyg: |-
- <div><p>
+ <div><p dir="auto">
*foo*
- </p><p><em>bar</em></p></div>
+ </p><p dir="auto"><em>bar</em></p></div>
04_06_00__leaf_blocks__html_blocks__009:
canonical: |
<div id="foo"
@@ -1654,7 +1654,7 @@
static: |-
<div></div>
wysiwyg: |-
- <p></p>
+ <p dir="auto"></p>
04_06_00__leaf_blocks__html_blocks__010:
canonical: |
<div class
@@ -1662,7 +1662,7 @@
static: |-
<div></div>
wysiwyg: |-
- <p></p>
+ <p dir="auto"></p>
04_06_00__leaf_blocks__html_blocks__011:
canonical: |
<div *???-&&&-<---
@@ -1670,14 +1670,14 @@
static: |-
<div></div>
wysiwyg: |-
- <p></p>
+ <p dir="auto"></p>
04_06_00__leaf_blocks__html_blocks__012:
canonical: |
<div><a href="bar">*foo*</a></div>
static: |-
<div><a href="bar">*foo*</a></div>
wysiwyg: |-
- <div><p><a target="_blank" rel="noopener noreferrer nofollow" href="bar">*foo*</a></p></div>
+ <div><p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="bar">*foo*</a></p></div>
04_06_00__leaf_blocks__html_blocks__013:
canonical: |
<table><tr><td>
@@ -1688,7 +1688,7 @@
foo
</td></tr></table>
wysiwyg: |-
- <table><tbody><tr><td colspan="1" rowspan="1"><p>
+ <table><tbody><tr><td colspan="1" rowspan="1"><p dir="auto">
foo
</p></td></tr></tbody></table>
04_06_00__leaf_blocks__html_blocks__014:
@@ -1704,7 +1704,7 @@
```
wysiwyg: |-
<div></div>
- <p>
+ <p dir="auto">
``` c
int x = 33;
```</p>
@@ -1718,7 +1718,7 @@
*bar*
</a>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="foo">
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="foo">
*bar*
</a></p>
04_06_00__leaf_blocks__html_blocks__016:
@@ -1730,7 +1730,7 @@
*bar*
wysiwyg: |-
- <p></p>
+ <p dir="auto"></p>
04_06_00__leaf_blocks__html_blocks__017:
canonical: |
<i class="foo">
@@ -1741,7 +1741,7 @@
*bar*
</i>
wysiwyg: |-
- <p><em>
+ <p dir="auto"><em>
*bar*
</em></p>
04_06_00__leaf_blocks__html_blocks__018:
@@ -1752,7 +1752,7 @@
*bar*
wysiwyg: |-
- <p>
+ <p dir="auto">
*bar*</p>
04_06_00__leaf_blocks__html_blocks__019:
canonical: |
@@ -1764,7 +1764,7 @@
*foo*
</del>
wysiwyg: |-
- <p><s>
+ <p dir="auto"><s>
*foo*
</s></p>
04_06_00__leaf_blocks__html_blocks__020:
@@ -1777,14 +1777,14 @@
<p data-sourcepos="3:1-3:5"><em>foo</em></p>
</del>
wysiwyg: |-
- <p><em><s>foo</s></em></p>
+ <p dir="auto"><em><s>foo</s></em></p>
04_06_00__leaf_blocks__html_blocks__021:
canonical: |
<p><del><em>foo</em></del></p>
static: |-
<p data-sourcepos="1:1-1:16" dir="auto"><del><em>foo</em></del></p>
wysiwyg: |-
- <p><em><s>foo</s></em></p>
+ <p dir="auto"><em><s>foo</s></em></p>
04_06_00__leaf_blocks__html_blocks__022:
canonical: |
<pre language="haskell"><code>
@@ -1805,13 +1805,13 @@
</div>
<p data-sourcepos="7:1-7:4" dir="auto">okay</p>
wysiwyg: |-
- <pre><p><code>
+ <pre><p dir="auto"><code>
import Text.HTML.TagSoup
main :: IO ()
main = print $ parseTags tags
</code></p></pre>
- <p>okay</p>
+ <p dir="auto">okay</p>
04_06_00__leaf_blocks__html_blocks__023:
canonical: |
<script type="text/javascript">
@@ -1824,7 +1824,7 @@
<p data-sourcepos="6:1-6:4" dir="auto">okay</p>
wysiwyg: |-
- <p>okay</p>
+ <p dir="auto">okay</p>
04_06_00__leaf_blocks__html_blocks__024:
canonical: |
<style
@@ -1842,7 +1842,7 @@
<p data-sourcepos="7:1-7:4" dir="auto">okay</p>
wysiwyg: |-
- <p>okay</p>
+ <p dir="auto">okay</p>
04_06_00__leaf_blocks__html_blocks__025:
canonical: |
<style
@@ -1854,7 +1854,7 @@
foo
wysiwyg: |-
- <p></p>
+ <p dir="auto"></p>
04_06_00__leaf_blocks__html_blocks__026:
canonical: |
<blockquote>
@@ -1871,10 +1871,10 @@
</div>
</blockquote>
wysiwyg: |-
- <blockquote dir="auto" multiline="false"><div><p>
+ <blockquote dir="auto" multiline="false"><div><p dir="auto">
foo
</p></div></blockquote>
- <p>bar</p>
+ <p dir="auto">bar</p>
04_06_00__leaf_blocks__html_blocks__027:
canonical: |
<ul>
@@ -1893,7 +1893,7 @@
</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p></p><div></div></li><li dir="auto"><p>foo</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto"></p><div></div></li><li dir="auto"><p dir="auto">foo</p></li></ul>
04_06_00__leaf_blocks__html_blocks__028:
canonical: |
<style>p{color:red;}</style>
@@ -1902,18 +1902,18 @@
p{color:red;}
<p data-sourcepos="2:1-2:5" dir="auto"><em>foo</em></p>
wysiwyg: |-
- <p><em>foo</em></p>
+ <p dir="auto"><em>foo</em></p>
04_06_00__leaf_blocks__html_blocks__029:
canonical: |
<!-- foo -->*bar*
<p><em>baz</em></p>
static: |-
- <!-- foo -->*bar*
+ *bar*
<p data-sourcepos="2:1-2:5" dir="auto"><em>baz</em></p>
wysiwyg: |-
- <p>*bar*
+ <p dir="auto">*bar*
</p>
- <p><em>baz</em></p>
+ <p dir="auto"><em>baz</em></p>
04_06_00__leaf_blocks__html_blocks__030:
canonical: |
<script>
@@ -1922,7 +1922,7 @@
static: |-
1. *bar*
wysiwyg: |-
- <p>1. *bar*</p>
+ <p dir="auto">1. *bar*</p>
04_06_00__leaf_blocks__html_blocks__031:
canonical: |
<!-- Foo
@@ -1930,14 +1930,11 @@
bar
baz -->
<p>okay</p>
- static: |-
- <!-- Foo
+ static: |2-
- bar
- baz -->
<p data-sourcepos="5:1-5:4" dir="auto">okay</p>
wysiwyg: |-
- <p>okay</p>
+ <p dir="auto">okay</p>
04_06_00__leaf_blocks__html_blocks__032:
canonical: |
<?php
@@ -1952,17 +1949,17 @@
?&gt;
<p data-sourcepos="6:1-6:4" dir="auto">okay</p>
wysiwyg: |-
- <p>';
+ <p dir="auto">';
?&gt;
</p>
- <p>okay</p>
+ <p dir="auto">okay</p>
04_06_00__leaf_blocks__html_blocks__033:
canonical: |
<!DOCTYPE html>
static: ""
wysiwyg: |-
- <p></p>
+ <p dir="auto"></p>
04_06_00__leaf_blocks__html_blocks__034:
canonical: |
<![CDATA[
@@ -1982,18 +1979,16 @@
<p data-sourcepos="13:1-13:4" dir="auto">okay</p>
wysiwyg: |-
- <p>okay</p>
+ <p dir="auto">okay</p>
04_06_00__leaf_blocks__html_blocks__035:
canonical: |2
<!-- foo -->
<pre><code>&lt;!-- foo --&gt;
</code></pre>
- static: |2-
- <!-- foo -->
- <div class="gl-relative markdown-code-block js-markdown-code">
- <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>
- <copy-code></copy-code>
- </div>
+ static: " \n<div class=\"gl-relative markdown-code-block js-markdown-code\">\n<pre
+ data-sourcepos=\"3:5-3:16\" class=\"code highlight js-syntax-highlight language-plaintext\"
+ lang=\"plaintext\" v-pre=\"true\"><code><span id=\"LC1\" class=\"line\" lang=\"plaintext\">&lt;!--
+ foo --&gt;</span></code></pre>\n<copy-code></copy-code>\n</div>"
wysiwyg: |-
<pre dir="auto" class="content-editor-code-block undefined code highlight"><code>&lt;!-- foo --&gt;</code></pre>
04_06_00__leaf_blocks__html_blocks__036:
@@ -2022,8 +2017,8 @@
bar
</div>
wysiwyg: |-
- <p>Foo</p>
- <div><p>
+ <p dir="auto">Foo</p>
+ <div><p dir="auto">
bar
</p></div>
04_06_00__leaf_blocks__html_blocks__038:
@@ -2038,10 +2033,10 @@
</div>
*foo*
wysiwyg: |-
- <div><p>
+ <div><p dir="auto">
bar
</p></div>
- <p>
+ <p dir="auto">
*foo*</p>
04_06_00__leaf_blocks__html_blocks__039:
canonical: |
@@ -2053,7 +2048,7 @@
<a href="bar">
baz</a></p>
wysiwyg: |-
- <p>Foo
+ <p dir="auto">Foo
<a target="_blank" rel="noopener noreferrer nofollow" href="bar">
baz</a></p>
04_06_00__leaf_blocks__html_blocks__040:
@@ -2066,7 +2061,7 @@
<p data-sourcepos="3:1-3:18"><em>Emphasized</em> text.</p>
</div>
wysiwyg: |-
- <div><p><em>Emphasized</em> text.</p></div>
+ <div><p dir="auto"><em>Emphasized</em> text.</p></div>
04_06_00__leaf_blocks__html_blocks__041:
canonical: |
<div>
@@ -2077,7 +2072,7 @@
*Emphasized* text.
</div>
wysiwyg: |-
- <div><p>
+ <div><p dir="auto">
*Emphasized* text.
</p></div>
04_06_00__leaf_blocks__html_blocks__042:
@@ -2098,7 +2093,7 @@
</tr>
</table>
wysiwyg: |-
- <table><tbody><tr><td colspan="1" rowspan="1"><p>
+ <table><tbody><tr><td colspan="1" rowspan="1"><p dir="auto">
Hi
</p></td></tr></tbody></table>
04_06_00__leaf_blocks__html_blocks__043:
@@ -2134,7 +2129,7 @@
<p data-sourcepos="3:1-3:5" dir="auto"><a href="/url" title="title">foo</a></p>
wysiwyg: |-
<pre>[foo]: /url "title"</pre>
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">foo</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">foo</a></p>
04_07_00__leaf_blocks__link_reference_definitions__002:
canonical: |
<p><a href="/url" title="the title">foo</a></p>
@@ -2142,7 +2137,7 @@
<p data-sourcepos="5:1-5:5" dir="auto"><a href="/url" title="the title">foo</a></p>
wysiwyg: |-
<pre>[foo]: /url "the title"</pre>
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="the title">foo</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="the title">foo</a></p>
04_07_00__leaf_blocks__link_reference_definitions__003:
canonical: |
<p><a href="my_(url)" title="title (with parens)">Foo*bar]</a></p>
@@ -2150,7 +2145,7 @@
<p data-sourcepos="3:1-3:11" dir="auto"><a href="my_(url)" title="title (with parens)">Foo*bar]</a></p>
wysiwyg: |-
<pre>[foo*bar\]]: my_(url) "title (with parens)"</pre>
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="my_(url)" title="title (with parens)">Foo*bar]</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="my_(url)" title="title (with parens)">Foo*bar]</a></p>
04_07_00__leaf_blocks__link_reference_definitions__004:
canonical: |
<p><a href="my%20url" title="title">Foo bar</a></p>
@@ -2158,7 +2153,7 @@
<p data-sourcepos="5:1-5:9" dir="auto"><a href="my%20url" title="title">Foo bar</a></p>
wysiwyg: |-
<pre>[foo bar]: my url "title"</pre>
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="my%20url" title="title">Foo bar</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="my%20url" title="title">Foo bar</a></p>
04_07_00__leaf_blocks__link_reference_definitions__005:
canonical: |
<p><a href="/url" title="
@@ -2178,7 +2173,7 @@
line1
line2
"</pre>
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="
title
line1
line2
@@ -2193,9 +2188,9 @@
<p data-sourcepos="3:1-3:16" dir="auto">with blank line'</p>
<p data-sourcepos="5:1-5:5" dir="auto">[foo]</p>
wysiwyg: |-
- <p>[foo]: /url 'title</p>
- <p>with blank line'</p>
- <p>[foo]</p>
+ <p dir="auto">[foo]: /url 'title</p>
+ <p dir="auto">with blank line'</p>
+ <p dir="auto">[foo]</p>
04_07_00__leaf_blocks__link_reference_definitions__007:
canonical: |
<p><a href="/url">foo</a></p>
@@ -2203,7 +2198,7 @@
<p data-sourcepos="4:1-4:5" dir="auto"><a href="/url">foo</a></p>
wysiwyg: |-
<pre>[foo]: /url</pre>
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url">foo</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/url">foo</a></p>
04_07_00__leaf_blocks__link_reference_definitions__008:
canonical: |
<p>[foo]:</p>
@@ -2212,8 +2207,8 @@
<p data-sourcepos="1:1-1:6" dir="auto">[foo]:</p>
<p data-sourcepos="3:1-3:5" dir="auto">[foo]</p>
wysiwyg: |-
- <p>[foo]:</p>
- <p>[foo]</p>
+ <p dir="auto">[foo]:</p>
+ <p dir="auto">[foo]</p>
04_07_00__leaf_blocks__link_reference_definitions__009:
canonical: |
<p><a href="">foo</a></p>
@@ -2221,7 +2216,7 @@
<p data-sourcepos="3:1-3:5" dir="auto"><a href="">foo</a></p>
wysiwyg: |-
<pre>[foo]: </pre>
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="">foo</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="">foo</a></p>
04_07_00__leaf_blocks__link_reference_definitions__010:
canonical: |
<p>[foo]: <bar>(baz)</p>
@@ -2230,8 +2225,8 @@
<p data-sourcepos="1:1-1:17" dir="auto">[foo]: (baz)</p>
<p data-sourcepos="3:1-3:5" dir="auto">[foo]</p>
wysiwyg: |-
- <p>[foo]: </p>
- <p>[foo]</p>
+ <p dir="auto">[foo]: </p>
+ <p dir="auto">[foo]</p>
04_07_00__leaf_blocks__link_reference_definitions__011:
canonical: |
<p><a href="/url%5Cbar*baz" title="foo&quot;bar\baz">foo</a></p>
@@ -2239,14 +2234,14 @@
<p data-sourcepos="3:1-3:5" dir="auto"><a href="/url%5Cbar*baz" title='foo"bar\baz'>foo</a></p>
wysiwyg: |-
<pre>[foo]: /url\bar*baz "foo"bar\baz"</pre>
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url%5Cbar*baz" title="foo&quot;bar\baz">foo</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/url%5Cbar*baz" title="foo&quot;bar\baz">foo</a></p>
04_07_00__leaf_blocks__link_reference_definitions__012:
canonical: |
<p><a href="url">foo</a></p>
static: |-
<p data-sourcepos="1:1-1:5" dir="auto"><a href="url">foo</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="url">foo</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="url">foo</a></p>
<pre>[foo]: url</pre>
04_07_00__leaf_blocks__link_reference_definitions__013:
canonical: |
@@ -2254,7 +2249,7 @@
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>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="first">foo</a></p>
<pre>[foo]: first</pre>
<pre>[foo]: second</pre>
04_07_00__leaf_blocks__link_reference_definitions__014:
@@ -2264,7 +2259,7 @@
<p data-sourcepos="3:1-3:5" dir="auto"><a href="/url">Foo</a></p>
wysiwyg: |-
<pre>[foo]: /url</pre>
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url">Foo</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/url">Foo</a></p>
04_07_00__leaf_blocks__link_reference_definitions__015:
canonical: |
<p><a href="/%CF%86%CE%BF%CF%85">αγω</a></p>
@@ -2272,7 +2267,7 @@
<p data-sourcepos="3:1-3:8" dir="auto"><a href="/%CF%86%CE%BF%CF%85">αγω</a></p>
wysiwyg: |-
<pre>[αγω]: /φου</pre>
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/%CF%86%CE%BF%CF%85">αγω</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/%CF%86%CE%BF%CF%85">αγω</a></p>
04_07_00__leaf_blocks__link_reference_definitions__016:
canonical: ""
static: ""
@@ -2285,14 +2280,14 @@
<p data-sourcepos="1:1-4:3" dir="auto">bar</p>
wysiwyg: |-
<pre>[foo]: /url</pre>
- <p>bar</p>
+ <p dir="auto">bar</p>
04_07_00__leaf_blocks__link_reference_definitions__018:
canonical: |
<p>[foo]: /url &quot;title&quot; ok</p>
static: |-
<p data-sourcepos="1:1-1:22" dir="auto">[foo]: /url "title" ok</p>
wysiwyg: |-
- <p>[foo]: /url "title" ok</p>
+ <p dir="auto">[foo]: /url "title" ok</p>
04_07_00__leaf_blocks__link_reference_definitions__019:
canonical: |
<p>&quot;title&quot; ok</p>
@@ -2300,7 +2295,7 @@
<p data-sourcepos="1:1-2:10" dir="auto">"title" ok</p>
wysiwyg: |-
<pre>[foo]: /url</pre>
- <p>"title" ok</p>
+ <p dir="auto">"title" ok</p>
04_07_00__leaf_blocks__link_reference_definitions__020:
canonical: |
<pre><code>[foo]: /url &quot;title&quot;
@@ -2314,7 +2309,7 @@
<p data-sourcepos="3:1-3:5" dir="auto">[foo]</p>
wysiwyg: |-
<pre dir="auto" class="content-editor-code-block undefined code highlight"><code>[foo]: /url "title"</code></pre>
- <p>[foo]</p>
+ <p dir="auto">[foo]</p>
04_07_00__leaf_blocks__link_reference_definitions__021:
canonical: |
<pre><code>[foo]: /url
@@ -2328,7 +2323,7 @@
<p data-sourcepos="5:1-5:5" dir="auto">[foo]</p>
wysiwyg: |-
<pre dir="auto" class="content-editor-code-block undefined code highlight"><code>[foo]: /url</code></pre>
- <p>[foo]</p>
+ <p dir="auto">[foo]</p>
04_07_00__leaf_blocks__link_reference_definitions__022:
canonical: |
<p>Foo
@@ -2339,9 +2334,9 @@
[bar]: /baz</p>
<p data-sourcepos="4:1-4:5" dir="auto">[bar]</p>
wysiwyg: |-
- <p>Foo
+ <p dir="auto">Foo
[bar]: /baz</p>
- <p>[bar]</p>
+ <p dir="auto">[bar]</p>
04_07_00__leaf_blocks__link_reference_definitions__023:
canonical: |
<h1><a href="/url">Foo</a></h1>
@@ -2358,7 +2353,7 @@
wysiwyg: |-
<h1 dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/url">Foo</a></h1>
<pre>[foo]: /url</pre>
- <blockquote dir="auto" multiline="false"><p>bar</p></blockquote>
+ <blockquote dir="auto" multiline="false"><p dir="auto">bar</p></blockquote>
04_07_00__leaf_blocks__link_reference_definitions__024:
canonical: |
<h1>bar</h1>
@@ -2370,7 +2365,7 @@
wysiwyg: |-
<pre>[foo]: /url</pre>
<h1 dir="auto">bar</h1>
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url">foo</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/url">foo</a></p>
04_07_00__leaf_blocks__link_reference_definitions__025:
canonical: |
<p>===
@@ -2380,7 +2375,7 @@
<a href="/url">foo</a></p>
wysiwyg: |-
<pre>[foo]: /url</pre>
- <p>===
+ <p dir="auto">===
<a target="_blank" rel="noopener noreferrer nofollow" href="/url">foo</a></p>
04_07_00__leaf_blocks__link_reference_definitions__026:
canonical: |
@@ -2395,7 +2390,7 @@
<pre>[foo]: /foo-url "foo"</pre>
<pre>[bar]: /bar-url "bar"</pre>
<pre>[baz]: /baz-url</pre>
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/foo-url" title="foo">foo</a>,
+ <p dir="auto"><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_00__leaf_blocks__link_reference_definitions__027:
@@ -2408,7 +2403,7 @@
<blockquote data-sourcepos="3:1-3:13" dir="auto">
</blockquote>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url">foo</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/url">foo</a></p>
<blockquote dir="auto" multiline="false"><pre>[foo]: /url</pre></blockquote>
04_07_00__leaf_blocks__link_reference_definitions__028:
canonical: ""
@@ -2423,8 +2418,8 @@
<p data-sourcepos="1:1-1:3" dir="auto">aaa</p>
<p data-sourcepos="3:1-3:3" dir="auto">bbb</p>
wysiwyg: |-
- <p>aaa</p>
- <p>bbb</p>
+ <p dir="auto">aaa</p>
+ <p dir="auto">bbb</p>
04_08_00__leaf_blocks__paragraphs__002:
canonical: |
<p>aaa
@@ -2437,9 +2432,9 @@
<p data-sourcepos="4:1-5:3" dir="auto">ccc
ddd</p>
wysiwyg: |-
- <p>aaa
+ <p dir="auto">aaa
bbb</p>
- <p>ccc
+ <p dir="auto">ccc
ddd</p>
04_08_00__leaf_blocks__paragraphs__003:
canonical: |
@@ -2449,8 +2444,8 @@
<p data-sourcepos="1:1-1:3" dir="auto">aaa</p>
<p data-sourcepos="4:1-4:3" dir="auto">bbb</p>
wysiwyg: |-
- <p>aaa</p>
- <p>bbb</p>
+ <p dir="auto">aaa</p>
+ <p dir="auto">bbb</p>
04_08_00__leaf_blocks__paragraphs__004:
canonical: |
<p>aaa
@@ -2459,7 +2454,7 @@
<p data-sourcepos="1:3-2:4" dir="auto">aaa
bbb</p>
wysiwyg: |-
- <p>aaa
+ <p dir="auto">aaa
bbb</p>
04_08_00__leaf_blocks__paragraphs__005:
canonical: |
@@ -2471,7 +2466,7 @@
bbb
ccc</p>
wysiwyg: |-
- <p>aaa
+ <p dir="auto">aaa
bbb
ccc</p>
04_08_00__leaf_blocks__paragraphs__006:
@@ -2482,7 +2477,7 @@
<p data-sourcepos="1:4-2:3" dir="auto">aaa
bbb</p>
wysiwyg: |-
- <p>aaa
+ <p dir="auto">aaa
bbb</p>
04_08_00__leaf_blocks__paragraphs__007:
canonical: |
@@ -2497,7 +2492,7 @@
<p data-sourcepos="2:1-2:3" dir="auto">bbb</p>
wysiwyg: |-
<pre dir="auto" class="content-editor-code-block undefined code highlight"><code>aaa</code></pre>
- <p>bbb</p>
+ <p dir="auto">bbb</p>
04_08_00__leaf_blocks__paragraphs__008:
canonical: |
<p>aaa<br />
@@ -2506,7 +2501,7 @@
<p data-sourcepos="1:1-2:8" dir="auto">aaa<br>
bbb</p>
wysiwyg: |-
- <p>aaa<br>
+ <p dir="auto">aaa<br>
bbb</p>
04_09_00__leaf_blocks__blank_lines__001:
canonical: |
@@ -2517,7 +2512,7 @@
<h1 data-sourcepos="6:1-6:5" dir="auto">
<a id="user-content-aaa" class="anchor" href="#aaa" aria-hidden="true"></a>aaa</h1>
wysiwyg: |-
- <p>aaa</p>
+ <p dir="auto">aaa</p>
<h1 dir="auto">aaa</h1>
04_10_00__leaf_blocks__tables_extension__001:
canonical: |
@@ -2551,7 +2546,7 @@
</tbody>
</table>
wysiwyg: |-
- <table><tbody><tr><th colspan="1" rowspan="1"><p>foo</p></th><th colspan="1" rowspan="1"><p>bar</p></th></tr><tr><td colspan="1" rowspan="1"><p>baz</p></td><td colspan="1" rowspan="1"><p>bim</p></td></tr></tbody></table>
+ <table><tbody><tr><th colspan="1" rowspan="1"><p dir="auto">foo</p></th><th colspan="1" rowspan="1"><p dir="auto">bar</p></th></tr><tr><td colspan="1" rowspan="1"><p dir="auto">baz</p></td><td colspan="1" rowspan="1"><p dir="auto">bim</p></td></tr></tbody></table>
04_10_00__leaf_blocks__tables_extension__002:
canonical: |
<table>
@@ -2584,7 +2579,7 @@
</tbody>
</table>
wysiwyg: |-
- <table><tbody><tr><th colspan="1" rowspan="1"><p>abc</p></th><th colspan="1" rowspan="1"><p>defghi</p></th></tr><tr><td colspan="1" rowspan="1"><p>bar</p></td><td colspan="1" rowspan="1"><p>baz</p></td></tr></tbody></table>
+ <table><tbody><tr><th colspan="1" rowspan="1"><p dir="auto">abc</p></th><th colspan="1" rowspan="1"><p dir="auto">defghi</p></th></tr><tr><td colspan="1" rowspan="1"><p dir="auto">bar</p></td><td colspan="1" rowspan="1"><p dir="auto">baz</p></td></tr></tbody></table>
04_10_00__leaf_blocks__tables_extension__003:
canonical: |
<table>
@@ -2619,7 +2614,7 @@
</tbody>
</table>
wysiwyg: |-
- <table><tbody><tr><th colspan="1" rowspan="1"><p>f|oo</p></th></tr><tr><td colspan="1" rowspan="1"><p>b <code>|</code> az</p></td></tr><tr><td colspan="1" rowspan="1"><p>b <strong>|</strong> im</p></td></tr></tbody></table>
+ <table><tbody><tr><th colspan="1" rowspan="1"><p dir="auto">f|oo</p></th></tr><tr><td colspan="1" rowspan="1"><p dir="auto">b <code>|</code> az</p></td></tr><tr><td colspan="1" rowspan="1"><p dir="auto">b <strong>|</strong> im</p></td></tr></tbody></table>
04_10_00__leaf_blocks__tables_extension__004:
canonical: |
<table>
@@ -2658,8 +2653,8 @@
<p data-sourcepos="4:3-4:5">bar</p>
</blockquote>
wysiwyg: |-
- <table><tbody><tr><th colspan="1" rowspan="1"><p>abc</p></th><th colspan="1" rowspan="1"><p>def</p></th></tr><tr><td colspan="1" rowspan="1"><p>bar</p></td><td colspan="1" rowspan="1"><p>baz</p></td></tr></tbody></table>
- <blockquote dir="auto" multiline="false"><p>bar</p></blockquote>
+ <table><tbody><tr><th colspan="1" rowspan="1"><p dir="auto">abc</p></th><th colspan="1" rowspan="1"><p dir="auto">def</p></th></tr><tr><td colspan="1" rowspan="1"><p dir="auto">bar</p></td><td colspan="1" rowspan="1"><p dir="auto">baz</p></td></tr></tbody></table>
+ <blockquote dir="auto" multiline="false"><p dir="auto">bar</p></blockquote>
04_10_00__leaf_blocks__tables_extension__005:
canonical: |
<table>
@@ -2702,8 +2697,8 @@
</table>
<p data-sourcepos="6:1-6:3" dir="auto">bar</p>
wysiwyg: |-
- <table><tbody><tr><th colspan="1" rowspan="1"><p>abc</p></th><th colspan="1" rowspan="1"><p>def</p></th></tr><tr><td colspan="1" rowspan="1"><p>bar</p></td><td colspan="1" rowspan="1"><p>baz</p></td></tr><tr><td colspan="1" rowspan="1"><p>bar</p></td><td colspan="1" rowspan="1"><p></p></td></tr></tbody></table>
- <p>bar</p>
+ <table><tbody><tr><th colspan="1" rowspan="1"><p dir="auto">abc</p></th><th colspan="1" rowspan="1"><p dir="auto">def</p></th></tr><tr><td colspan="1" rowspan="1"><p dir="auto">bar</p></td><td colspan="1" rowspan="1"><p dir="auto">baz</p></td></tr><tr><td colspan="1" rowspan="1"><p dir="auto">bar</p></td><td colspan="1" rowspan="1"><p dir="auto"></p></td></tr></tbody></table>
+ <p dir="auto">bar</p>
04_10_00__leaf_blocks__tables_extension__006:
canonical: |
<p>| abc | def |
@@ -2714,7 +2709,7 @@
| --- |
| bar |</p>
wysiwyg: |-
- <p>| abc | def |
+ <p dir="auto">| abc | def |
| --- |
| bar |</p>
04_10_00__leaf_blocks__tables_extension__007:
@@ -2757,7 +2752,7 @@
</tbody>
</table>
wysiwyg: |-
- <table><tbody><tr><th colspan="1" rowspan="1"><p>abc</p></th><th colspan="1" rowspan="1"><p>def</p></th></tr><tr><td colspan="1" rowspan="1"><p>bar</p></td><td colspan="1" rowspan="1"><p></p></td></tr><tr><td colspan="1" rowspan="1"><p>bar</p></td><td colspan="1" rowspan="1"><p>baz</p></td></tr></tbody></table>
+ <table><tbody><tr><th colspan="1" rowspan="1"><p dir="auto">abc</p></th><th colspan="1" rowspan="1"><p dir="auto">def</p></th></tr><tr><td colspan="1" rowspan="1"><p dir="auto">bar</p></td><td colspan="1" rowspan="1"><p dir="auto"></p></td></tr><tr><td colspan="1" rowspan="1"><p dir="auto">bar</p></td><td colspan="1" rowspan="1"><p dir="auto">baz</p></td></tr></tbody></table>
04_10_00__leaf_blocks__tables_extension__008:
canonical: |
<table>
@@ -2778,7 +2773,7 @@
</thead>
</table>
wysiwyg: |-
- <table><tbody><tr><th colspan="1" rowspan="1"><p>abc</p></th><th colspan="1" rowspan="1"><p>def</p></th></tr></tbody></table>
+ <table><tbody><tr><th colspan="1" rowspan="1"><p dir="auto">abc</p></th><th colspan="1" rowspan="1"><p dir="auto">def</p></th></tr></tbody></table>
05_01_00__container_blocks__block_quotes__001:
canonical: |
<blockquote>
@@ -2794,7 +2789,7 @@
baz</p>
</blockquote>
wysiwyg: |-
- <blockquote dir="auto" multiline="false"><h1 dir="auto">Foo</h1><p>bar
+ <blockquote dir="auto" multiline="false"><h1 dir="auto">Foo</h1><p dir="auto">bar
baz</p></blockquote>
05_01_00__container_blocks__block_quotes__002:
canonical: |
@@ -2811,7 +2806,7 @@
baz</p>
</blockquote>
wysiwyg: |-
- <blockquote dir="auto" multiline="false"><h1 dir="auto">Foo</h1><p>bar
+ <blockquote dir="auto" multiline="false"><h1 dir="auto">Foo</h1><p dir="auto">bar
baz</p></blockquote>
05_01_00__container_blocks__block_quotes__003:
canonical: |
@@ -2828,7 +2823,7 @@
baz</p>
</blockquote>
wysiwyg: |-
- <blockquote dir="auto" multiline="false"><h1 dir="auto">Foo</h1><p>bar
+ <blockquote dir="auto" multiline="false"><h1 dir="auto">Foo</h1><p dir="auto">bar
baz</p></blockquote>
05_01_00__container_blocks__block_quotes__004:
canonical: |
@@ -2862,7 +2857,7 @@
baz</p>
</blockquote>
wysiwyg: |-
- <blockquote dir="auto" multiline="false"><h1 dir="auto">Foo</h1><p>bar
+ <blockquote dir="auto" multiline="false"><h1 dir="auto">Foo</h1><p dir="auto">bar
baz</p></blockquote>
05_01_00__container_blocks__block_quotes__006:
canonical: |
@@ -2878,7 +2873,7 @@
foo</p>
</blockquote>
wysiwyg: |-
- <blockquote dir="auto" multiline="false"><p>bar
+ <blockquote dir="auto" multiline="false"><p dir="auto">bar
baz
foo</p></blockquote>
05_01_00__container_blocks__block_quotes__007:
@@ -2893,7 +2888,7 @@
</blockquote>
<hr data-sourcepos="2:1-2:3">
wysiwyg: |-
- <blockquote dir="auto" multiline="false"><p>foo</p></blockquote>
+ <blockquote dir="auto" multiline="false"><p dir="auto">foo</p></blockquote>
<hr>
05_01_00__container_blocks__block_quotes__008:
canonical: |
@@ -2915,8 +2910,8 @@
<li data-sourcepos="2:1-2:5">bar</li>
</ul>
wysiwyg: |-
- <blockquote dir="auto" multiline="false"><ul dir="auto" bullet="*"><li dir="auto"><p>foo</p></li></ul></blockquote>
- <ul dir="auto" bullet="*"><li dir="auto"><p>bar</p></li></ul>
+ <blockquote dir="auto" multiline="false"><ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">foo</p></li></ul></blockquote>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">bar</p></li></ul>
05_01_00__container_blocks__block_quotes__009:
canonical: |
<blockquote>
@@ -2960,7 +2955,7 @@
</div>
wysiwyg: |-
<blockquote dir="auto" multiline="false"><pre dir="auto" class="content-editor-code-block undefined code highlight"><code></code></pre></blockquote>
- <p>foo</p>
+ <p dir="auto">foo</p>
<pre dir="auto" class="content-editor-code-block undefined code highlight"><code></code></pre>
05_01_00__container_blocks__block_quotes__011:
canonical: |
@@ -2974,7 +2969,7 @@
- bar</p>
</blockquote>
wysiwyg: |-
- <blockquote dir="auto" multiline="false"><p>foo
+ <blockquote dir="auto" multiline="false"><p dir="auto">foo
- bar</p></blockquote>
05_01_00__container_blocks__block_quotes__012:
canonical: |
@@ -2984,7 +2979,7 @@
<blockquote data-sourcepos="1:1-1:1" dir="auto">
</blockquote>
wysiwyg: |-
- <blockquote dir="auto" multiline="false"><p></p></blockquote>
+ <blockquote dir="auto" multiline="false"><p dir="auto"></p></blockquote>
05_01_00__container_blocks__block_quotes__013:
canonical: |
<blockquote>
@@ -2993,7 +2988,7 @@
<blockquote data-sourcepos="1:1-3:2" dir="auto">
</blockquote>
wysiwyg: |-
- <blockquote dir="auto" multiline="false"><p></p></blockquote>
+ <blockquote dir="auto" multiline="false"><p dir="auto"></p></blockquote>
05_01_00__container_blocks__block_quotes__014:
canonical: |
<blockquote>
@@ -3004,7 +2999,7 @@
<p data-sourcepos="2:3-2:5">foo</p>
</blockquote>
wysiwyg: |-
- <blockquote dir="auto" multiline="false"><p>foo</p></blockquote>
+ <blockquote dir="auto" multiline="false"><p dir="auto">foo</p></blockquote>
05_01_00__container_blocks__block_quotes__015:
canonical: |
<blockquote>
@@ -3021,8 +3016,8 @@
<p data-sourcepos="3:3-3:5">bar</p>
</blockquote>
wysiwyg: |-
- <blockquote dir="auto" multiline="false"><p>foo</p></blockquote>
- <blockquote dir="auto" multiline="false"><p>bar</p></blockquote>
+ <blockquote dir="auto" multiline="false"><p dir="auto">foo</p></blockquote>
+ <blockquote dir="auto" multiline="false"><p dir="auto">bar</p></blockquote>
05_01_00__container_blocks__block_quotes__016:
canonical: |
<blockquote>
@@ -3035,7 +3030,7 @@
bar</p>
</blockquote>
wysiwyg: |-
- <blockquote dir="auto" multiline="false"><p>foo
+ <blockquote dir="auto" multiline="false"><p dir="auto">foo
bar</p></blockquote>
05_01_00__container_blocks__block_quotes__017:
canonical: |
@@ -3049,7 +3044,7 @@
<p data-sourcepos="3:3-3:5">bar</p>
</blockquote>
wysiwyg: |-
- <blockquote dir="auto" multiline="false"><p>foo</p><p>bar</p></blockquote>
+ <blockquote dir="auto" multiline="false"><p dir="auto">foo</p><p dir="auto">bar</p></blockquote>
05_01_00__container_blocks__block_quotes__018:
canonical: |
<p>foo</p>
@@ -3062,8 +3057,8 @@
<p data-sourcepos="2:3-2:5">bar</p>
</blockquote>
wysiwyg: |-
- <p>foo</p>
- <blockquote dir="auto" multiline="false"><p>bar</p></blockquote>
+ <p dir="auto">foo</p>
+ <blockquote dir="auto" multiline="false"><p dir="auto">bar</p></blockquote>
05_01_00__container_blocks__block_quotes__019:
canonical: |
<blockquote>
@@ -3082,9 +3077,9 @@
<p data-sourcepos="3:3-3:5">bbb</p>
</blockquote>
wysiwyg: |-
- <blockquote dir="auto" multiline="false"><p>aaa</p></blockquote>
+ <blockquote dir="auto" multiline="false"><p dir="auto">aaa</p></blockquote>
<hr>
- <blockquote dir="auto" multiline="false"><p>bbb</p></blockquote>
+ <blockquote dir="auto" multiline="false"><p dir="auto">bbb</p></blockquote>
05_01_00__container_blocks__block_quotes__020:
canonical: |
<blockquote>
@@ -3097,7 +3092,7 @@
baz</p>
</blockquote>
wysiwyg: |-
- <blockquote dir="auto" multiline="false"><p>bar
+ <blockquote dir="auto" multiline="false"><p dir="auto">bar
baz</p></blockquote>
05_01_00__container_blocks__block_quotes__021:
canonical: |
@@ -3111,8 +3106,8 @@
</blockquote>
<p data-sourcepos="3:1-3:3" dir="auto">baz</p>
wysiwyg: |-
- <blockquote dir="auto" multiline="false"><p>bar</p></blockquote>
- <p>baz</p>
+ <blockquote dir="auto" multiline="false"><p dir="auto">bar</p></blockquote>
+ <p dir="auto">baz</p>
05_01_00__container_blocks__block_quotes__022:
canonical: |
<blockquote>
@@ -3125,8 +3120,8 @@
</blockquote>
<p data-sourcepos="3:1-3:3" dir="auto">baz</p>
wysiwyg: |-
- <blockquote dir="auto" multiline="false"><p>bar</p></blockquote>
- <p>baz</p>
+ <blockquote dir="auto" multiline="false"><p dir="auto">bar</p></blockquote>
+ <p dir="auto">baz</p>
05_01_00__container_blocks__block_quotes__023:
canonical: |
<blockquote>
@@ -3147,7 +3142,7 @@
</blockquote>
</blockquote>
wysiwyg: |-
- <blockquote dir="auto" multiline="false"><blockquote dir="auto" multiline="false"><blockquote dir="auto" multiline="false"><p>foo
+ <blockquote dir="auto" multiline="false"><blockquote dir="auto" multiline="false"><blockquote dir="auto" multiline="false"><p dir="auto">foo
bar</p></blockquote></blockquote></blockquote>
05_01_00__container_blocks__block_quotes__024:
canonical: |
@@ -3171,7 +3166,7 @@
</blockquote>
</blockquote>
wysiwyg: |-
- <blockquote dir="auto" multiline="false"><blockquote dir="auto" multiline="false"><blockquote dir="auto" multiline="false"><p>foo
+ <blockquote dir="auto" multiline="false"><blockquote dir="auto" multiline="false"><blockquote dir="auto" multiline="false"><p dir="auto">foo
bar
baz</p></blockquote></blockquote></blockquote>
05_01_00__container_blocks__block_quotes__025:
@@ -3195,7 +3190,7 @@
</blockquote>
wysiwyg: |-
<blockquote dir="auto" multiline="false"><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>code</code></pre></blockquote>
- <blockquote dir="auto" multiline="false"><p>not code</p></blockquote>
+ <blockquote dir="auto" multiline="false"><p dir="auto">not code</p></blockquote>
05_02_00__container_blocks__list_items__001:
canonical: |
<p>A paragraph
@@ -3216,10 +3211,10 @@
<p data-sourcepos="6:3-6:16">A block quote.</p>
</blockquote>
wysiwyg: |-
- <p>A paragraph
+ <p dir="auto">A paragraph
with two lines.</p>
<pre dir="auto" class="content-editor-code-block undefined code highlight"><code>indented code</code></pre>
- <blockquote dir="auto" multiline="false"><p>A block quote.</p></blockquote>
+ <blockquote dir="auto" multiline="false"><p dir="auto">A block quote.</p></blockquote>
05_02_00__container_blocks__list_items__002:
canonical: |
<ol>
@@ -3248,8 +3243,8 @@
</li>
</ol>
wysiwyg: |-
- <ol dir="auto" parens="false"><li dir="auto"><p>A paragraph
- with two lines.</p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>indented code</code></pre><blockquote dir="auto" multiline="false"><p>A block quote.</p></blockquote></li></ol>
+ <ol dir="auto" parens="false"><li dir="auto"><p dir="auto">A paragraph
+ with two lines.</p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>indented code</code></pre><blockquote dir="auto" multiline="false"><p dir="auto">A block quote.</p></blockquote></li></ol>
05_02_00__container_blocks__list_items__003:
canonical: |
<ul>
@@ -3262,8 +3257,8 @@
</ul>
<p data-sourcepos="3:2-3:4" dir="auto">two</p>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>one</p></li></ul>
- <p>two</p>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">one</p></li></ul>
+ <p dir="auto">two</p>
05_02_00__container_blocks__list_items__004:
canonical: |
<ul>
@@ -3280,7 +3275,7 @@
</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>one</p><p>two</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">one</p><p dir="auto">two</p></li></ul>
05_02_00__container_blocks__list_items__005:
canonical: |
<ul>
@@ -3297,7 +3292,7 @@
<copy-code></copy-code>
</div>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>one</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">one</p></li></ul>
<pre dir="auto" class="content-editor-code-block undefined code highlight"><code> two</code></pre>
05_02_00__container_blocks__list_items__006:
canonical: |
@@ -3315,7 +3310,7 @@
</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>one</p><p>two</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">one</p><p dir="auto">two</p></li></ul>
05_02_00__container_blocks__list_items__007:
canonical: |
<blockquote>
@@ -3340,7 +3335,7 @@
</blockquote>
</blockquote>
wysiwyg: |-
- <blockquote dir="auto" multiline="false"><blockquote dir="auto" multiline="false"><ol dir="auto" parens="false"><li dir="auto"><p>one</p><p>two</p></li></ol></blockquote></blockquote>
+ <blockquote dir="auto" multiline="false"><blockquote dir="auto" multiline="false"><ol dir="auto" parens="false"><li dir="auto"><p dir="auto">one</p><p dir="auto">two</p></li></ol></blockquote></blockquote>
05_02_00__container_blocks__list_items__008:
canonical: |
<blockquote>
@@ -3361,7 +3356,7 @@
</blockquote>
</blockquote>
wysiwyg: |-
- <blockquote dir="auto" multiline="false"><blockquote dir="auto" multiline="false"><ul dir="auto" bullet="*"><li dir="auto"><p>one</p></li></ul><p>two</p></blockquote></blockquote>
+ <blockquote dir="auto" multiline="false"><blockquote dir="auto" multiline="false"><ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">one</p></li></ul><p dir="auto">two</p></blockquote></blockquote>
05_02_00__container_blocks__list_items__009:
canonical: |
<p>-one</p>
@@ -3370,8 +3365,8 @@
<p data-sourcepos="1:1-1:4" dir="auto">-one</p>
<p data-sourcepos="3:1-3:5" dir="auto">2.two</p>
wysiwyg: |-
- <p>-one</p>
- <p>2.two</p>
+ <p dir="auto">-one</p>
+ <p dir="auto">2.two</p>
05_02_00__container_blocks__list_items__010:
canonical: |
<ul>
@@ -3388,7 +3383,7 @@
</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>foo</p><p>bar</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">foo</p><p dir="auto">bar</p></li></ul>
05_02_00__container_blocks__list_items__011:
canonical: |
<ol>
@@ -3417,7 +3412,7 @@
</li>
</ol>
wysiwyg: |-
- <ol dir="auto" parens="false"><li dir="auto"><p>foo</p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>bar</code></pre><p>baz</p><blockquote dir="auto" multiline="false"><p>bam</p></blockquote></li></ol>
+ <ol dir="auto" parens="false"><li dir="auto"><p dir="auto">foo</p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>bar</code></pre><p dir="auto">baz</p><blockquote dir="auto" multiline="false"><p dir="auto">bam</p></blockquote></li></ol>
05_02_00__container_blocks__list_items__012:
canonical: |
<ul>
@@ -3444,7 +3439,7 @@
</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>Foo</p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>bar
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">Foo</p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>bar
baz</code></pre></li></ul>
@@ -3458,14 +3453,14 @@
<li data-sourcepos="1:1-1:13">ok</li>
</ol>
wysiwyg: |-
- <ol dir="auto" parens="false"><li dir="auto"><p>ok</p></li></ol>
+ <ol dir="auto" parens="false"><li dir="auto"><p dir="auto">ok</p></li></ol>
05_02_00__container_blocks__list_items__014:
canonical: |
<p>1234567890. not ok</p>
static: |-
<p data-sourcepos="1:1-1:18" dir="auto">1234567890. not ok</p>
wysiwyg: |-
- <p>1234567890. not ok</p>
+ <p dir="auto">1234567890. not ok</p>
05_02_00__container_blocks__list_items__015:
canonical: |
<ol start="0">
@@ -3476,7 +3471,7 @@
<li data-sourcepos="1:1-1:5">ok</li>
</ol>
wysiwyg: |-
- <ol dir="auto" parens="false"><li dir="auto"><p>ok</p></li></ol>
+ <ol dir="auto" parens="false"><li dir="auto"><p dir="auto">ok</p></li></ol>
05_02_00__container_blocks__list_items__016:
canonical: |
<ol start="3">
@@ -3487,14 +3482,14 @@
<li data-sourcepos="1:1-1:7">ok</li>
</ol>
wysiwyg: |-
- <ol dir="auto" parens="false"><li dir="auto"><p>ok</p></li></ol>
+ <ol dir="auto" parens="false"><li dir="auto"><p dir="auto">ok</p></li></ol>
05_02_00__container_blocks__list_items__017:
canonical: |
<p>-1. not ok</p>
static: |-
<p data-sourcepos="1:1-1:10" dir="auto">-1. not ok</p>
wysiwyg: |-
- <p>-1. not ok</p>
+ <p dir="auto">-1. not ok</p>
05_02_00__container_blocks__list_items__018:
canonical: |
<ul>
@@ -3515,7 +3510,7 @@
</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>foo</p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>bar</code></pre></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">foo</p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>bar</code></pre></li></ul>
05_02_00__container_blocks__list_items__019:
canonical: |
<ol start="10">
@@ -3536,7 +3531,7 @@
</li>
</ol>
wysiwyg: |-
- <ol dir="auto" parens="false"><li dir="auto"><p>foo</p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>bar</code></pre></li></ol>
+ <ol dir="auto" parens="false"><li dir="auto"><p dir="auto">foo</p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>bar</code></pre></li></ol>
05_02_00__container_blocks__list_items__020:
canonical: |
<pre><code>indented code
@@ -3556,7 +3551,7 @@
</div>
wysiwyg: |-
<pre dir="auto" class="content-editor-code-block undefined code highlight"><code>indented code</code></pre>
- <p>paragraph</p>
+ <p dir="auto">paragraph</p>
<pre dir="auto" class="content-editor-code-block undefined code highlight"><code>more code</code></pre>
05_02_00__container_blocks__list_items__021:
canonical: |
@@ -3584,7 +3579,7 @@
</li>
</ol>
wysiwyg: |-
- <ol dir="auto" parens="false"><li dir="auto"><p></p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>indented code</code></pre><p>paragraph</p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>more code</code></pre></li></ol>
+ <ol dir="auto" parens="false"><li dir="auto"><p dir="auto"></p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>indented code</code></pre><p dir="auto">paragraph</p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>more code</code></pre></li></ol>
05_02_00__container_blocks__list_items__022:
canonical: |
<ol>
@@ -3611,7 +3606,7 @@
</li>
</ol>
wysiwyg: |-
- <ol dir="auto" parens="false"><li dir="auto"><p></p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code> indented code</code></pre><p>paragraph</p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>more code</code></pre></li></ol>
+ <ol dir="auto" parens="false"><li dir="auto"><p dir="auto"></p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code> indented code</code></pre><p dir="auto">paragraph</p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>more code</code></pre></li></ol>
05_02_00__container_blocks__list_items__023:
canonical: |
<p>foo</p>
@@ -3620,8 +3615,8 @@
<p data-sourcepos="1:4-1:6" dir="auto">foo</p>
<p data-sourcepos="3:1-3:3" dir="auto">bar</p>
wysiwyg: |-
- <p>foo</p>
- <p>bar</p>
+ <p dir="auto">foo</p>
+ <p dir="auto">bar</p>
05_02_00__container_blocks__list_items__024:
canonical: |
<ul>
@@ -3634,8 +3629,8 @@
</ul>
<p data-sourcepos="3:3-3:5" dir="auto">bar</p>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>foo</p></li></ul>
- <p>bar</p>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">foo</p></li></ul>
+ <p dir="auto">bar</p>
05_02_00__container_blocks__list_items__025:
canonical: |
<ul>
@@ -3652,7 +3647,7 @@
</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>foo</p><p>bar</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">foo</p><p dir="auto">bar</p></li></ul>
05_02_00__container_blocks__list_items__026:
canonical: |
<ul>
@@ -3683,7 +3678,7 @@
</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>foo</p></li><li dir="auto"><p></p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>bar</code></pre></li><li dir="auto"><p></p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>baz</code></pre></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">foo</p></li><li dir="auto"><p dir="auto"></p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>bar</code></pre></li><li dir="auto"><p dir="auto"></p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>baz</code></pre></li></ul>
05_02_00__container_blocks__list_items__027:
canonical: |
<ul>
@@ -3694,7 +3689,7 @@
<li data-sourcepos="1:1-2:5">foo</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>foo</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">foo</p></li></ul>
05_02_00__container_blocks__list_items__028:
canonical: |
<ul>
@@ -3708,8 +3703,8 @@
</ul>
<p data-sourcepos="3:3-3:5" dir="auto">foo</p>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p></p></li></ul>
- <p>foo</p>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto"></p></li></ul>
+ <p dir="auto">foo</p>
05_02_00__container_blocks__list_items__029:
canonical: |
<ul>
@@ -3725,7 +3720,7 @@
<li data-sourcepos="3:1-3:5">bar</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>foo</p></li><li dir="auto"><p></p></li><li dir="auto"><p>bar</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">foo</p></li><li dir="auto"><p dir="auto"></p></li><li dir="auto"><p dir="auto">bar</p></li></ul>
05_02_00__container_blocks__list_items__030:
canonical: |
<ul>
@@ -3741,7 +3736,7 @@
<li data-sourcepos="3:1-3:5">bar</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>foo</p></li><li dir="auto"><p></p></li><li dir="auto"><p>bar</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">foo</p></li><li dir="auto"><p dir="auto"></p></li><li dir="auto"><p dir="auto">bar</p></li></ul>
05_02_00__container_blocks__list_items__031:
canonical: |
<ol>
@@ -3757,7 +3752,7 @@
<li data-sourcepos="3:1-3:6">bar</li>
</ol>
wysiwyg: |-
- <ol dir="auto" parens="false"><li dir="auto"><p>foo</p></li><li dir="auto"><p></p></li><li dir="auto"><p>bar</p></li></ol>
+ <ol dir="auto" parens="false"><li dir="auto"><p dir="auto">foo</p></li><li dir="auto"><p dir="auto"></p></li><li dir="auto"><p dir="auto">bar</p></li></ol>
05_02_00__container_blocks__list_items__032:
canonical: |
<ul>
@@ -3769,7 +3764,7 @@
</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p></p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto"></p></li></ul>
05_02_00__container_blocks__list_items__033:
canonical: |
<p>foo
@@ -3782,9 +3777,9 @@
<p data-sourcepos="4:1-5:2" dir="auto">foo
1.</p>
wysiwyg: |-
- <p>foo
+ <p dir="auto">foo
*</p>
- <p>foo
+ <p dir="auto">foo
1.</p>
05_02_00__container_blocks__list_items__034:
canonical: |
@@ -3814,8 +3809,8 @@
</li>
</ol>
wysiwyg: |-
- <ol dir="auto" parens="false"><li dir="auto"><p>A paragraph
- with two lines.</p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>indented code</code></pre><blockquote dir="auto" multiline="false"><p>A block quote.</p></blockquote></li></ol>
+ <ol dir="auto" parens="false"><li dir="auto"><p dir="auto">A paragraph
+ with two lines.</p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>indented code</code></pre><blockquote dir="auto" multiline="false"><p dir="auto">A block quote.</p></blockquote></li></ol>
05_02_00__container_blocks__list_items__035:
canonical: |
<ol>
@@ -3844,8 +3839,8 @@
</li>
</ol>
wysiwyg: |-
- <ol dir="auto" parens="false"><li dir="auto"><p>A paragraph
- with two lines.</p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>indented code</code></pre><blockquote dir="auto" multiline="false"><p>A block quote.</p></blockquote></li></ol>
+ <ol dir="auto" parens="false"><li dir="auto"><p dir="auto">A paragraph
+ with two lines.</p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>indented code</code></pre><blockquote dir="auto" multiline="false"><p dir="auto">A block quote.</p></blockquote></li></ol>
05_02_00__container_blocks__list_items__036:
canonical: |
<ol>
@@ -3874,8 +3869,8 @@
</li>
</ol>
wysiwyg: |-
- <ol dir="auto" parens="false"><li dir="auto"><p>A paragraph
- with two lines.</p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>indented code</code></pre><blockquote dir="auto" multiline="false"><p>A block quote.</p></blockquote></li></ol>
+ <ol dir="auto" parens="false"><li dir="auto"><p dir="auto">A paragraph
+ with two lines.</p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>indented code</code></pre><blockquote dir="auto" multiline="false"><p dir="auto">A block quote.</p></blockquote></li></ol>
05_02_00__container_blocks__list_items__037:
canonical: |
<pre><code>1. A paragraph
@@ -3930,8 +3925,8 @@
</li>
</ol>
wysiwyg: |-
- <ol dir="auto" parens="false"><li dir="auto"><p>A paragraph
- with two lines.</p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>indented code</code></pre><blockquote dir="auto" multiline="false"><p>A block quote.</p></blockquote></li></ol>
+ <ol dir="auto" parens="false"><li dir="auto"><p dir="auto">A paragraph
+ with two lines.</p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>indented code</code></pre><blockquote dir="auto" multiline="false"><p dir="auto">A block quote.</p></blockquote></li></ol>
05_02_00__container_blocks__list_items__039:
canonical: |
<ol>
@@ -3944,7 +3939,7 @@
with two lines.</li>
</ol>
wysiwyg: |-
- <ol dir="auto" parens="false"><li dir="auto"><p>A paragraph
+ <ol dir="auto" parens="false"><li dir="auto"><p dir="auto">A paragraph
with two lines.</p></li></ol>
05_02_00__container_blocks__list_items__040:
canonical: |
@@ -3970,7 +3965,7 @@
</ol>
</blockquote>
wysiwyg: |-
- <blockquote dir="auto" multiline="false"><ol dir="auto" parens="false"><li dir="auto"><p></p><blockquote dir="auto" multiline="false"><p>Blockquote
+ <blockquote dir="auto" multiline="false"><ol dir="auto" parens="false"><li dir="auto"><p dir="auto"></p><blockquote dir="auto" multiline="false"><p dir="auto">Blockquote
continued here.</p></blockquote></li></ol></blockquote>
05_02_00__container_blocks__list_items__041:
canonical: |
@@ -3996,7 +3991,7 @@
</ol>
</blockquote>
wysiwyg: |-
- <blockquote dir="auto" multiline="false"><ol dir="auto" parens="false"><li dir="auto"><p></p><blockquote dir="auto" multiline="false"><p>Blockquote
+ <blockquote dir="auto" multiline="false"><ol dir="auto" parens="false"><li dir="auto"><p dir="auto"></p><blockquote dir="auto" multiline="false"><p dir="auto">Blockquote
continued here.</p></blockquote></li></ol></blockquote>
05_02_00__container_blocks__list_items__042:
canonical: |
@@ -4032,7 +4027,7 @@
</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>foo</p><ul dir="auto" bullet="*"><li dir="auto"><p>bar</p><ul dir="auto" bullet="*"><li dir="auto"><p>baz</p><ul dir="auto" bullet="*"><li dir="auto"><p>boo</p></li></ul></li></ul></li></ul></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">foo</p><ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">bar</p><ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">baz</p><ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">boo</p></li></ul></li></ul></li></ul></li></ul>
05_02_00__container_blocks__list_items__043:
canonical: |
<ul>
@@ -4049,7 +4044,7 @@
<li data-sourcepos="4:4-4:8">boo</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>foo</p></li><li dir="auto"><p>bar</p></li><li dir="auto"><p>baz</p></li><li dir="auto"><p>boo</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">foo</p></li><li dir="auto"><p dir="auto">bar</p></li><li dir="auto"><p dir="auto">baz</p></li><li dir="auto"><p dir="auto">boo</p></li></ul>
05_02_00__container_blocks__list_items__044:
canonical: |
<ol start="10">
@@ -4068,7 +4063,7 @@
</li>
</ol>
wysiwyg: |-
- <ol dir="auto" parens="false"><li dir="auto"><p>foo</p><ul dir="auto" bullet="*"><li dir="auto"><p>bar</p></li></ul></li></ol>
+ <ol dir="auto" parens="false"><li dir="auto"><p dir="auto">foo</p><ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">bar</p></li></ul></li></ol>
05_02_00__container_blocks__list_items__045:
canonical: |
<ol start="10">
@@ -4085,8 +4080,8 @@
<li data-sourcepos="2:4-2:8">bar</li>
</ul>
wysiwyg: |-
- <ol dir="auto" parens="false"><li dir="auto"><p>foo</p></li></ol>
- <ul dir="auto" bullet="*"><li dir="auto"><p>bar</p></li></ul>
+ <ol dir="auto" parens="false"><li dir="auto"><p dir="auto">foo</p></li></ol>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">bar</p></li></ul>
05_02_00__container_blocks__list_items__046:
canonical: |
<ul>
@@ -4105,7 +4100,7 @@
</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p></p><ul dir="auto" bullet="*"><li dir="auto"><p>foo</p></li></ul></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto"></p><ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">foo</p></li></ul></li></ul>
05_02_00__container_blocks__list_items__047:
canonical: |
<ol>
@@ -4132,7 +4127,7 @@
</li>
</ol>
wysiwyg: |-
- <ol dir="auto" parens="false"><li dir="auto"><p></p><ul dir="auto" bullet="*"><li dir="auto"><p></p><ol dir="auto" parens="false"><li dir="auto"><p>foo</p></li></ol></li></ul></li></ol>
+ <ol dir="auto" parens="false"><li dir="auto"><p dir="auto"></p><ul dir="auto" bullet="*"><li dir="auto"><p dir="auto"></p><ol dir="auto" parens="false"><li dir="auto"><p dir="auto">foo</p></li></ol></li></ul></li></ol>
05_02_00__container_blocks__list_items__048:
canonical: |
<ul>
@@ -4155,7 +4150,7 @@
baz</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p></p><h1 dir="auto">Foo</h1></li><li dir="auto"><p></p><h2 dir="auto">Bar</h2><p>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto"></p><h1 dir="auto">Foo</h1></li><li dir="auto"><p dir="auto"></p><h2 dir="auto">Bar</h2><p dir="auto">
baz</p></li></ul>
05_04_00__container_blocks__lists__001:
canonical: |
@@ -4175,8 +4170,8 @@
<li data-sourcepos="3:1-3:5">baz</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>foo</p></li><li dir="auto"><p>bar</p></li></ul>
- <ul dir="auto" bullet="*"><li dir="auto"><p>baz</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">foo</p></li><li dir="auto"><p dir="auto">bar</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">baz</p></li></ul>
05_04_00__container_blocks__lists__002:
canonical: |
<ol>
@@ -4195,8 +4190,8 @@
<li data-sourcepos="3:1-3:6">baz</li>
</ol>
wysiwyg: |-
- <ol dir="auto" parens="false"><li dir="auto"><p>foo</p></li><li dir="auto"><p>bar</p></li></ol>
- <ol dir="auto" parens="false"><li dir="auto"><p>baz</p></li></ol>
+ <ol dir="auto" parens="false"><li dir="auto"><p dir="auto">foo</p></li><li dir="auto"><p dir="auto">bar</p></li></ol>
+ <ol dir="auto" parens="false"><li dir="auto"><p dir="auto">baz</p></li></ol>
05_04_00__container_blocks__lists__003:
canonical: |
<p>Foo</p>
@@ -4211,8 +4206,8 @@
<li data-sourcepos="3:1-3:5">baz</li>
</ul>
wysiwyg: |-
- <p>Foo</p>
- <ul dir="auto" bullet="*"><li dir="auto"><p>bar</p></li><li dir="auto"><p>baz</p></li></ul>
+ <p dir="auto">Foo</p>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">bar</p></li><li dir="auto"><p dir="auto">baz</p></li></ul>
05_04_00__container_blocks__lists__004:
canonical: |
<p>The number of windows in my house is
@@ -4221,7 +4216,7 @@
<p data-sourcepos="1:1-2:30" dir="auto">The number of windows in my house is
14. The number of doors is 6.</p>
wysiwyg: |-
- <p>The number of windows in my house is
+ <p dir="auto">The number of windows in my house is
14. The number of doors is 6.</p>
05_04_00__container_blocks__lists__005:
canonical: |
@@ -4235,8 +4230,8 @@
<li data-sourcepos="2:1-2:29">The number of doors is 6.</li>
</ol>
wysiwyg: |-
- <p>The number of windows in my house is</p>
- <ol dir="auto" parens="false"><li dir="auto"><p>The number of doors is 6.</p></li></ol>
+ <p dir="auto">The number of windows in my house is</p>
+ <ol dir="auto" parens="false"><li dir="auto"><p dir="auto">The number of doors is 6.</p></li></ol>
05_04_00__container_blocks__lists__006:
canonical: |
<ul>
@@ -4263,7 +4258,7 @@
</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>foo</p></li><li dir="auto"><p>bar</p></li><li dir="auto"><p>baz</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">foo</p></li><li dir="auto"><p dir="auto">bar</p></li><li dir="auto"><p dir="auto">baz</p></li></ul>
05_04_00__container_blocks__lists__007:
canonical: |
<ul>
@@ -4296,7 +4291,7 @@
</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>foo</p><ul dir="auto" bullet="*"><li dir="auto"><p>bar</p><ul dir="auto" bullet="*"><li dir="auto"><p>baz</p><p>bim</p></li></ul></li></ul></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">foo</p><ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">bar</p><ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">baz</p><p dir="auto">bim</p></li></ul></li></ul></li></ul>
05_04_00__container_blocks__lists__008:
canonical: |
<ul>
@@ -4313,14 +4308,14 @@
<li data-sourcepos="1:1-1:5">foo</li>
<li data-sourcepos="2:1-3:0">bar</li>
</ul>
- <!-- -->
+
<ul data-sourcepos="6:1-7:5" dir="auto">
<li data-sourcepos="6:1-6:5">baz</li>
<li data-sourcepos="7:1-7:5">bim</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>foo</p></li><li dir="auto"><p>bar</p></li></ul>
- <ul dir="auto" bullet="*"><li dir="auto"><p>baz</p></li><li dir="auto"><p>bim</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">foo</p></li><li dir="auto"><p dir="auto">bar</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">baz</p></li><li dir="auto"><p dir="auto">bim</p></li></ul>
05_04_00__container_blocks__lists__009:
canonical: |
<ul>
@@ -4345,13 +4340,13 @@
<p data-sourcepos="5:5-5:7">foo</p>
</li>
</ul>
- <!-- -->
+
<div class="gl-relative markdown-code-block js-markdown-code">
<pre data-sourcepos="9:5-9:8" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">code</span></code></pre>
<copy-code></copy-code>
</div>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>foo</p><p>notcode</p></li><li dir="auto"><p>foo</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">foo</p><p dir="auto">notcode</p></li><li dir="auto"><p dir="auto">foo</p></li></ul>
<pre dir="auto" class="content-editor-code-block undefined code highlight"><code>code</code></pre>
05_04_00__container_blocks__lists__010:
canonical: |
@@ -4375,7 +4370,7 @@
<li data-sourcepos="7:1-7:3">g</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>a</p></li><li dir="auto"><p>b</p></li><li dir="auto"><p>c</p></li><li dir="auto"><p>d</p></li><li dir="auto"><p>e</p></li><li dir="auto"><p>f</p></li><li dir="auto"><p>g</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">a</p></li><li dir="auto"><p dir="auto">b</p></li><li dir="auto"><p dir="auto">c</p></li><li dir="auto"><p dir="auto">d</p></li><li dir="auto"><p dir="auto">e</p></li><li dir="auto"><p dir="auto">f</p></li><li dir="auto"><p dir="auto">g</p></li></ul>
05_04_00__container_blocks__lists__011:
canonical: |
<ol>
@@ -4402,7 +4397,7 @@
</li>
</ol>
wysiwyg: |-
- <ol dir="auto" parens="false"><li dir="auto"><p>a</p></li><li dir="auto"><p>b</p></li><li dir="auto"><p>c</p></li></ol>
+ <ol dir="auto" parens="false"><li dir="auto"><p dir="auto">a</p></li><li dir="auto"><p dir="auto">b</p></li><li dir="auto"><p dir="auto">c</p></li></ol>
05_04_00__container_blocks__lists__012:
canonical: |
<ul>
@@ -4421,7 +4416,7 @@
- e</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>a</p></li><li dir="auto"><p>b</p></li><li dir="auto"><p>c</p></li><li dir="auto"><p>d
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">a</p></li><li dir="auto"><p dir="auto">b</p></li><li dir="auto"><p dir="auto">c</p></li><li dir="auto"><p dir="auto">d
- e</p></li></ul>
05_04_00__container_blocks__lists__013:
canonical: |
@@ -4449,7 +4444,7 @@
<copy-code></copy-code>
</div>
wysiwyg: |-
- <ol dir="auto" parens="false"><li dir="auto"><p>a</p></li><li dir="auto"><p>b</p></li></ol>
+ <ol dir="auto" parens="false"><li dir="auto"><p dir="auto">a</p></li><li dir="auto"><p dir="auto">b</p></li></ol>
<pre dir="auto" class="content-editor-code-block undefined code highlight"><code>3. c</code></pre>
05_04_00__container_blocks__lists__014:
canonical: |
@@ -4477,7 +4472,7 @@
</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>a</p></li><li dir="auto"><p>b</p></li><li dir="auto"><p>c</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">a</p></li><li dir="auto"><p dir="auto">b</p></li><li dir="auto"><p dir="auto">c</p></li></ul>
05_04_00__container_blocks__lists__015:
canonical: |
<ul>
@@ -4501,7 +4496,7 @@
</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>a</p></li><li dir="auto"><p></p></li><li dir="auto"><p>c</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">a</p></li><li dir="auto"><p dir="auto"></p></li><li dir="auto"><p dir="auto">c</p></li></ul>
05_04_00__container_blocks__lists__016:
canonical: |
<ul>
@@ -4530,7 +4525,7 @@
</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>a</p></li><li dir="auto"><p>b</p><p>c</p></li><li dir="auto"><p>d</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">a</p></li><li dir="auto"><p dir="auto">b</p><p dir="auto">c</p></li><li dir="auto"><p dir="auto">d</p></li></ul>
05_04_00__container_blocks__lists__017:
canonical: |
<ul>
@@ -4557,7 +4552,7 @@
</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>a</p></li><li dir="auto"><p>b</p><pre>[ref]: /url</pre></li><li dir="auto"><p>d</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">a</p></li><li dir="auto"><p dir="auto">b</p><pre>[ref]: /url</pre></li><li dir="auto"><p dir="auto">d</p></li></ul>
05_04_00__container_blocks__lists__018:
canonical: |
<ul>
@@ -4584,7 +4579,7 @@
<li data-sourcepos="7:1-7:3">c</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>a</p></li><li dir="auto"><p></p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>b</code></pre></li><li dir="auto"><p>c</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">a</p></li><li dir="auto"><p dir="auto"></p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>b</code></pre></li><li dir="auto"><p dir="auto">c</p></li></ul>
05_04_00__container_blocks__lists__019:
canonical: |
<ul>
@@ -4611,7 +4606,7 @@
<li data-sourcepos="5:1-5:3">d</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>a</p><ul dir="auto" bullet="*"><li dir="auto"><p>b</p><p>c</p></li></ul></li><li dir="auto"><p>d</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">a</p><ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">b</p><p dir="auto">c</p></li></ul></li><li dir="auto"><p dir="auto">d</p></li></ul>
05_04_00__container_blocks__lists__020:
canonical: |
<ul>
@@ -4632,7 +4627,7 @@
<li data-sourcepos="4:1-4:3">c</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>a</p><blockquote dir="auto" multiline="false"><p>b</p></blockquote></li><li dir="auto"><p>c</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">a</p><blockquote dir="auto" multiline="false"><p dir="auto">b</p></blockquote></li><li dir="auto"><p dir="auto">c</p></li></ul>
05_04_00__container_blocks__lists__021:
canonical: |
<ul>
@@ -4659,7 +4654,7 @@
<li data-sourcepos="6:1-6:3">d</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>a</p><blockquote dir="auto" multiline="false"><p>b</p></blockquote><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>c</code></pre></li><li dir="auto"><p>d</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">a</p><blockquote dir="auto" multiline="false"><p dir="auto">b</p></blockquote><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>c</code></pre></li><li dir="auto"><p dir="auto">d</p></li></ul>
05_04_00__container_blocks__lists__022:
canonical: |
<ul>
@@ -4670,7 +4665,7 @@
<li data-sourcepos="1:1-1:3">a</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>a</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">a</p></li></ul>
05_04_00__container_blocks__lists__023:
canonical: |
<ul>
@@ -4689,7 +4684,7 @@
</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>a</p><ul dir="auto" bullet="*"><li dir="auto"><p>b</p></li></ul></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">a</p><ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">b</p></li></ul></li></ul>
05_04_00__container_blocks__lists__024:
canonical: |
<ol>
@@ -4710,7 +4705,7 @@
</li>
</ol>
wysiwyg: |-
- <ol dir="auto" parens="false"><li dir="auto"><p></p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>foo</code></pre><p>bar</p></li></ol>
+ <ol dir="auto" parens="false"><li dir="auto"><p dir="auto"></p><pre dir="auto" class="content-editor-code-block undefined code highlight"><code>foo</code></pre><p dir="auto">bar</p></li></ol>
05_04_00__container_blocks__lists__025:
canonical: |
<ul>
@@ -4733,7 +4728,7 @@
</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>foo</p><ul dir="auto" bullet="*"><li dir="auto"><p>bar</p></li></ul><p>baz</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">foo</p><ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">bar</p></li></ul><p dir="auto">baz</p></li></ul>
05_04_00__container_blocks__lists__026:
canonical: |
<ul>
@@ -4770,25 +4765,25 @@
</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>a</p><ul dir="auto" bullet="*"><li dir="auto"><p>b</p></li><li dir="auto"><p>c</p></li></ul></li><li dir="auto"><p>d</p><ul dir="auto" bullet="*"><li dir="auto"><p>e</p></li><li dir="auto"><p>f</p></li></ul></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">a</p><ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">b</p></li><li dir="auto"><p dir="auto">c</p></li></ul></li><li dir="auto"><p dir="auto">d</p><ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">e</p></li><li dir="auto"><p dir="auto">f</p></li></ul></li></ul>
06_01_00__inlines__001:
canonical: |
<p><code>hi</code>lo`</p>
static: |-
<p data-sourcepos="1:1-1:7" dir="auto"><code>hi</code>lo`</p>
wysiwyg: |-
- <p><code>hi</code>lo`</p>
+ <p dir="auto"><code>hi</code>lo`</p>
06_02_00__inlines__backslash_escapes__001:
canonical: |
<p>!&quot;#$%&amp;'()*+,-./:;&lt;=&gt;?@[\]^_`{|}~</p>
static: |-
<p data-sourcepos="1:1-1:295" dir="auto"><span data-escaped-char>!</span>"<span data-escaped-char>#</span><span data-escaped-char>$</span><span data-escaped-char>%</span><span data-escaped-char>&amp;</span>'()*+,-./:;&lt;=&gt;?<span data-escaped-char>@</span>[\]<span data-escaped-char>^</span>_`{|}<span data-escaped-char>~</span></p>
wysiwyg: |-
- <p>!"#$%&amp;'()*+,-./:;&lt;=&gt;?@[\]^_`{|}~</p>
+ <p dir="auto">!"#$%&amp;'()*+,-./:;&lt;=&gt;?@[\]^_`{|}~</p>
06_02_00__inlines__backslash_escapes__002:
canonical: "<p>\\\t\\A\\a\\ \\3\\φ\\«</p>\n"
static: "<p data-sourcepos=\"1:1-1:16\" dir=\"auto\">\\\t\\A\\a\\ \\3\\φ\\«</p>"
- wysiwyg: "<p>\\\t\\A\\a\\ \\3\\φ\\«</p>"
+ wysiwyg: "<p dir=\"auto\">\\\t\\A\\a\\ \\3\\φ\\«</p>"
06_02_00__inlines__backslash_escapes__003:
canonical: |
<p>*not emphasized*
@@ -4811,7 +4806,7 @@
[foo]: /url "not a reference"
<span data-escaped-char>&amp;</span>ouml; not a character entity</p>
wysiwyg: |-
- <p>*not emphasized*
+ <p dir="auto">*not emphasized*
&lt;br/&gt; not a tag
[not a link](/foo)
`not code`
@@ -4826,7 +4821,7 @@
static: |-
<p data-sourcepos="1:1-1:12" dir="auto">\<em>emphasis</em></p>
wysiwyg: |-
- <p>\<em>emphasis</em></p>
+ <p dir="auto">\<em>emphasis</em></p>
06_02_00__inlines__backslash_escapes__005:
canonical: |
<p>foo<br />
@@ -4835,7 +4830,7 @@
<p data-sourcepos="1:1-2:3" dir="auto">foo<br>
bar</p>
wysiwyg: |-
- <p>foo<br>
+ <p dir="auto">foo<br>
bar</p>
06_02_00__inlines__backslash_escapes__006:
canonical: |
@@ -4843,7 +4838,7 @@
static: |-
<p data-sourcepos="1:1-1:10" dir="auto"><code>\[\`</code></p>
wysiwyg: |-
- <p><code>\[\`</code></p>
+ <p dir="auto"><code>\[\`</code></p>
06_02_00__inlines__backslash_escapes__007:
canonical: |
<pre><code>\[\]
@@ -4872,28 +4867,28 @@
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>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="http://example.com?find=%5C*">http://example.com?find=\*</a></p>
06_02_00__inlines__backslash_escapes__010:
canonical: |
<a href="/bar\/)">
static: |-
<a href="/bar\/)" rel="nofollow noreferrer noopener" target="_blank"></a>
wysiwyg: |-
- <p></p>
+ <p dir="auto"></p>
06_02_00__inlines__backslash_escapes__011:
canonical: |
<p><a href="/bar*" title="ti*tle">foo</a></p>
static: |-
<p data-sourcepos="1:1-1:23" dir="auto"><a href="/bar*" title="ti*tle">foo</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/bar*" title="ti*tle">foo</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/bar*" title="ti*tle">foo</a></p>
06_02_00__inlines__backslash_escapes__012:
canonical: |
<p><a href="/bar*" title="ti*tle">foo</a></p>
static: |-
<p data-sourcepos="1:1-1:5" dir="auto"><a href="/bar*" title="ti*tle">foo</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/bar*" title="ti*tle">foo</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/bar*" title="ti*tle">foo</a></p>
<pre>[foo]: /bar* "ti*tle"</pre>
06_02_00__inlines__backslash_escapes__013:
canonical: |
@@ -4916,7 +4911,7 @@
¾ ℋ ⅆ
∲ ≧̸</p>
wysiwyg: |-
- <p>&nbsp; &amp; © Æ Ď
+ <p dir="auto">&nbsp; &amp; © Æ Ď
¾ ℋ ⅆ
∲ ≧̸</p>
06_03_00__inlines__entity_and_numeric_character_references__002:
@@ -4925,14 +4920,14 @@
static: |-
<p data-sourcepos="1:1-1:25" dir="auto"># Ӓ Ϡ �</p>
wysiwyg: |-
- <p># Ӓ Ϡ �</p>
+ <p dir="auto"># Ӓ Ϡ �</p>
06_03_00__inlines__entity_and_numeric_character_references__003:
canonical: |
<p>&quot; ആ ಫ</p>
static: |-
<p data-sourcepos="1:1-1:22" dir="auto">" ആ ಫ</p>
wysiwyg: |-
- <p>" ആ ಫ</p>
+ <p dir="auto">" ആ ಫ</p>
06_03_00__inlines__entity_and_numeric_character_references__004:
canonical: |
<p>&amp;nbsp &amp;x; &amp;#; &amp;#x;
@@ -4945,7 +4940,7 @@
&amp;#abcdef0;
&amp;ThisIsNotDefined; &amp;hi?;</p>
wysiwyg: |-
- <p>&amp;nbsp &amp;x; &amp;#; &amp;#x;
+ <p dir="auto">&amp;nbsp &amp;x; &amp;#; &amp;#x;
&amp;#987654321;
&amp;#abcdef0;
&amp;ThisIsNotDefined; &amp;hi?;</p>
@@ -4955,35 +4950,35 @@
static: |-
<p data-sourcepos="1:1-1:5" dir="auto">&amp;copy</p>
wysiwyg: |-
- <p>&amp;copy</p>
+ <p dir="auto">&amp;copy</p>
06_03_00__inlines__entity_and_numeric_character_references__006:
canonical: |
<p>&amp;MadeUpEntity;</p>
static: |-
<p data-sourcepos="1:1-1:14" dir="auto">&amp;MadeUpEntity;</p>
wysiwyg: |-
- <p>&amp;MadeUpEntity;</p>
+ <p dir="auto">&amp;MadeUpEntity;</p>
06_03_00__inlines__entity_and_numeric_character_references__007:
canonical: |
<a href="&ouml;&ouml;.html">
static: |-
<a href="%C3%B6%C3%B6.html" rel="nofollow noreferrer noopener" target="_blank"></a>
wysiwyg: |-
- <p></p>
+ <p dir="auto"></p>
06_03_00__inlines__entity_and_numeric_character_references__008:
canonical: |
<p><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p>
static: |-
<p data-sourcepos="1:1-1:37" dir="auto"><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/f%C3%B6%C3%B6" title="föö">foo</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/f%C3%B6%C3%B6" title="föö">foo</a></p>
06_03_00__inlines__entity_and_numeric_character_references__009:
canonical: |
<p><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p>
static: |-
<p data-sourcepos="1:1-1:5" dir="auto"><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/f%C3%B6%C3%B6" title="föö">foo</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/f%C3%B6%C3%B6" title="föö">foo</a></p>
<pre>[foo]: /föö "föö"</pre>
06_03_00__inlines__entity_and_numeric_character_references__010:
canonical: |
@@ -5002,7 +4997,7 @@
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>
+ <p dir="auto"><code>f&amp;ouml;&amp;ouml;</code></p>
06_03_00__inlines__entity_and_numeric_character_references__012:
canonical: |
<pre><code>f&amp;ouml;f&amp;ouml;
@@ -5022,7 +5017,7 @@
<p data-sourcepos="1:1-2:5" dir="auto">*foo*
<em>foo</em></p>
wysiwyg: |-
- <p>*foo*
+ <p dir="auto">*foo*
<em>foo</em></p>
06_03_00__inlines__entity_and_numeric_character_references__014:
canonical: |
@@ -5036,8 +5031,8 @@
<li data-sourcepos="3:1-3:5">foo</li>
</ul>
wysiwyg: |-
- <p>* foo</p>
- <ul dir="auto" bullet="*"><li dir="auto"><p>foo</p></li></ul>
+ <p dir="auto">* foo</p>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">foo</p></li></ul>
06_03_00__inlines__entity_and_numeric_character_references__015:
canonical: |
<p>foo
@@ -5048,62 +5043,62 @@
bar</p>
wysiwyg: |-
- <p>foo
+ <p dir="auto">foo
bar</p>
06_03_00__inlines__entity_and_numeric_character_references__016:
canonical: "<p>\tfoo</p>\n"
static: "<p data-sourcepos=\"1:1-1:7\" dir=\"auto\">\tfoo</p>"
- wysiwyg: "<p>\tfoo</p>"
+ wysiwyg: "<p dir=\"auto\">\tfoo</p>"
06_03_00__inlines__entity_and_numeric_character_references__017:
canonical: |
<p>[a](url &quot;tit&quot;)</p>
static: |-
<p data-sourcepos="1:1-1:24" dir="auto"><a href="url" title="tit">a</a></p>
wysiwyg: |-
- <p>[a](url "tit")</p>
+ <p dir="auto">[a](url "tit")</p>
06_04_00__inlines__code_spans__001:
canonical: |
<p><code>foo</code></p>
static: |-
<p data-sourcepos="1:1-1:5" dir="auto"><code>foo</code></p>
wysiwyg: |-
- <p><code>foo</code></p>
+ <p dir="auto"><code>foo</code></p>
06_04_00__inlines__code_spans__002:
canonical: |
<p><code>foo ` bar</code></p>
static: |-
<p data-sourcepos="1:1-1:15" dir="auto"><code>foo ` bar</code></p>
wysiwyg: |-
- <p><code>foo ` bar</code></p>
+ <p dir="auto"><code>foo ` bar</code></p>
06_04_00__inlines__code_spans__003:
canonical: |
<p><code>``</code></p>
static: |-
<p data-sourcepos="1:1-1:6" dir="auto"><code>``</code></p>
wysiwyg: |-
- <p><code>``</code></p>
+ <p dir="auto"><code>``</code></p>
06_04_00__inlines__code_spans__004:
canonical: |
<p><code> `` </code></p>
static: |-
<p data-sourcepos="1:1-1:8" dir="auto"><code> `` </code></p>
wysiwyg: |-
- <p><code> `` </code></p>
+ <p dir="auto"><code> `` </code></p>
06_04_00__inlines__code_spans__005:
canonical: |
<p><code> a</code></p>
static: |-
<p data-sourcepos="1:1-1:4" dir="auto"><code> a</code></p>
wysiwyg: |-
- <p><code> a</code></p>
+ <p dir="auto"><code> a</code></p>
06_04_00__inlines__code_spans__006:
canonical: |
<p><code> b </code></p>
static: |-
<p data-sourcepos="1:1-1:7" dir="auto"><code> b </code></p>
wysiwyg: |-
- <p><code>&nbsp;b&nbsp;</code></p>
+ <p dir="auto"><code>&nbsp;b&nbsp;</code></p>
06_04_00__inlines__code_spans__007:
canonical: |
<p><code> </code>
@@ -5112,224 +5107,224 @@
<p data-sourcepos="1:1-2:4" dir="auto"><code> </code>
<code> </code></p>
wysiwyg: |-
- <p></p>
+ <p dir="auto"></p>
06_04_00__inlines__code_spans__008:
canonical: |
<p><code>foo bar baz</code></p>
static: |-
<p data-sourcepos="1:1-5:2" dir="auto"><code>foo bar baz</code></p>
wysiwyg: |-
- <p><code>foo bar baz</code></p>
+ <p dir="auto"><code>foo bar baz</code></p>
06_04_00__inlines__code_spans__009:
canonical: |
<p><code>foo </code></p>
static: |-
<p data-sourcepos="1:1-3:2" dir="auto"><code>foo </code></p>
wysiwyg: |-
- <p><code>foo </code></p>
+ <p dir="auto"><code>foo </code></p>
06_04_00__inlines__code_spans__010:
canonical: |
<p><code>foo bar baz</code></p>
static: |-
<p data-sourcepos="1:1-2:4" dir="auto"><code>foo bar baz</code></p>
wysiwyg: |-
- <p><code>foo bar baz</code></p>
+ <p dir="auto"><code>foo bar baz</code></p>
06_04_00__inlines__code_spans__011:
canonical: |
<p><code>foo\</code>bar`</p>
static: |-
<p data-sourcepos="1:1-1:10" dir="auto"><code>foo\</code>bar`</p>
wysiwyg: |-
- <p><code>foo\</code>bar`</p>
+ <p dir="auto"><code>foo\</code>bar`</p>
06_04_00__inlines__code_spans__012:
canonical: |
<p><code>foo`bar</code></p>
static: |-
<p data-sourcepos="1:1-1:11" dir="auto"><code>foo`bar</code></p>
wysiwyg: |-
- <p><code>foo`bar</code></p>
+ <p dir="auto"><code>foo`bar</code></p>
06_04_00__inlines__code_spans__013:
canonical: |
<p><code>foo `` bar</code></p>
static: |-
<p data-sourcepos="1:1-1:14" dir="auto"><code>foo `` bar</code></p>
wysiwyg: |-
- <p><code>foo `` bar</code></p>
+ <p dir="auto"><code>foo `` bar</code></p>
06_04_00__inlines__code_spans__014:
canonical: |
<p>*foo<code>*</code></p>
static: |-
<p data-sourcepos="1:1-1:7" dir="auto">*foo<code>*</code></p>
wysiwyg: |-
- <p>*foo<code>*</code></p>
+ <p dir="auto">*foo<code>*</code></p>
06_04_00__inlines__code_spans__015:
canonical: |
<p>[not a <code>link](/foo</code>)</p>
static: |-
<p data-sourcepos="1:1-1:20" dir="auto">[not a <code>link](/foo</code>)</p>
wysiwyg: |-
- <p>[not a <code>link](/foo</code>)</p>
+ <p dir="auto">[not a <code>link](/foo</code>)</p>
06_04_00__inlines__code_spans__016:
canonical: |
<p><code>&lt;a href=&quot;</code>&quot;&gt;`</p>
static: |-
<p data-sourcepos="1:1-1:14" dir="auto"><code>&lt;a href="</code>"&gt;`</p>
wysiwyg: |-
- <p><code>&lt;a href="</code>"&gt;`</p>
+ <p dir="auto"><code>&lt;a href="</code>"&gt;`</p>
06_04_00__inlines__code_spans__017:
canonical: |
<p><a href="`">`</p>
static: |-
<p data-sourcepos="1:1-1:13" dir="auto"><a href="`" rel="nofollow noreferrer noopener" target="_blank">`</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="`">`</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="`">`</a></p>
06_04_00__inlines__code_spans__018:
canonical: |
<p><code>&lt;http://foo.bar.</code>baz&gt;`</p>
static: |-
<p data-sourcepos="1:1-1:23" dir="auto"><code>&lt;http://foo.bar.</code>baz&gt;`</p>
wysiwyg: |-
- <p><code>&lt;http://foo.bar.</code>baz&gt;`</p>
+ <p dir="auto"><code>&lt;http://foo.bar.</code>baz&gt;`</p>
06_04_00__inlines__code_spans__019:
canonical: |
<p><a href="http://foo.bar.%60baz">http://foo.bar.`baz</a>`</p>
static: |-
<p data-sourcepos="1:1-1:22" dir="auto"><a href="http://foo.bar.%60baz" rel="nofollow noreferrer noopener" target="_blank">http://foo.bar.`baz</a>`</p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://foo.bar.%60baz">http://foo.bar.`baz</a>`</p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="http://foo.bar.%60baz">http://foo.bar.`baz</a>`</p>
06_04_00__inlines__code_spans__020:
canonical: |
<p>```foo``</p>
static: |-
<p data-sourcepos="1:1-1:8" dir="auto">```foo``</p>
wysiwyg: |-
- <p>```foo``</p>
+ <p dir="auto">```foo``</p>
06_04_00__inlines__code_spans__021:
canonical: |
<p>`foo</p>
static: |-
<p data-sourcepos="1:1-1:4" dir="auto">`foo</p>
wysiwyg: |-
- <p>`foo</p>
+ <p dir="auto">`foo</p>
06_04_00__inlines__code_spans__022:
canonical: |
<p>`foo<code>bar</code></p>
static: |-
<p data-sourcepos="1:1-1:11" dir="auto">`foo<code>bar</code></p>
wysiwyg: |-
- <p>`foo<code>bar</code></p>
+ <p dir="auto">`foo<code>bar</code></p>
06_05_00__inlines__emphasis_and_strong_emphasis__001:
canonical: |
<p><em>foo bar</em></p>
static: |-
<p data-sourcepos="1:1-1:9" dir="auto"><em>foo bar</em></p>
wysiwyg: |-
- <p><em>foo bar</em></p>
+ <p dir="auto"><em>foo bar</em></p>
06_05_00__inlines__emphasis_and_strong_emphasis__002:
canonical: |
<p>a * foo bar*</p>
static: |-
<p data-sourcepos="1:1-1:12" dir="auto">a * foo bar*</p>
wysiwyg: |-
- <p>a * foo bar*</p>
+ <p dir="auto">a * foo bar*</p>
06_05_00__inlines__emphasis_and_strong_emphasis__003:
canonical: |
<p>a*&quot;foo&quot;*</p>
static: |-
<p data-sourcepos="1:1-1:8" dir="auto">a*"foo"*</p>
wysiwyg: |-
- <p>a*"foo"*</p>
+ <p dir="auto">a*"foo"*</p>
06_05_00__inlines__emphasis_and_strong_emphasis__004:
canonical: |
<p>* a *</p>
static: |-
<p data-sourcepos="1:1-1:7" dir="auto">* a *</p>
wysiwyg: |-
- <p>*&nbsp;a&nbsp;*</p>
+ <p dir="auto">*&nbsp;a&nbsp;*</p>
06_05_00__inlines__emphasis_and_strong_emphasis__005:
canonical: |
<p>foo<em>bar</em></p>
static: |-
<p data-sourcepos="1:1-1:8" dir="auto">foo<em>bar</em></p>
wysiwyg: |-
- <p>foo<em>bar</em></p>
+ <p dir="auto">foo<em>bar</em></p>
06_05_00__inlines__emphasis_and_strong_emphasis__006:
canonical: |
<p>5<em>6</em>78</p>
static: |-
<p data-sourcepos="1:1-1:6" dir="auto">5<em>6</em>78</p>
wysiwyg: |-
- <p>5<em>6</em>78</p>
+ <p dir="auto">5<em>6</em>78</p>
06_05_00__inlines__emphasis_and_strong_emphasis__007:
canonical: |
<p><em>foo bar</em></p>
static: |-
<p data-sourcepos="1:1-1:9" dir="auto"><em>foo bar</em></p>
wysiwyg: |-
- <p><em>foo bar</em></p>
+ <p dir="auto"><em>foo bar</em></p>
06_05_00__inlines__emphasis_and_strong_emphasis__008:
canonical: |
<p>_ foo bar_</p>
static: |-
<p data-sourcepos="1:1-1:10" dir="auto">_ foo bar_</p>
wysiwyg: |-
- <p>_ foo bar_</p>
+ <p dir="auto">_ foo bar_</p>
06_05_00__inlines__emphasis_and_strong_emphasis__009:
canonical: |
<p>a_&quot;foo&quot;_</p>
static: |-
<p data-sourcepos="1:1-1:8" dir="auto">a_"foo"_</p>
wysiwyg: |-
- <p>a_"foo"_</p>
+ <p dir="auto">a_"foo"_</p>
06_05_00__inlines__emphasis_and_strong_emphasis__010:
canonical: |
<p>foo_bar_</p>
static: |-
<p data-sourcepos="1:1-1:8" dir="auto">foo_bar_</p>
wysiwyg: |-
- <p>foo_bar_</p>
+ <p dir="auto">foo_bar_</p>
06_05_00__inlines__emphasis_and_strong_emphasis__011:
canonical: |
<p>5_6_78</p>
static: |-
<p data-sourcepos="1:1-1:6" dir="auto">5_6_78</p>
wysiwyg: |-
- <p>5_6_78</p>
+ <p dir="auto">5_6_78</p>
06_05_00__inlines__emphasis_and_strong_emphasis__012:
canonical: |
<p>приÑтанÑм_ÑтремÑÑ‚ÑÑ_</p>
static: |-
<p data-sourcepos="1:1-1:38" dir="auto">приÑтанÑм_ÑтремÑÑ‚ÑÑ_</p>
wysiwyg: |-
- <p>приÑтанÑм_ÑтремÑÑ‚ÑÑ_</p>
+ <p dir="auto">приÑтанÑм_ÑтремÑÑ‚ÑÑ_</p>
06_05_00__inlines__emphasis_and_strong_emphasis__013:
canonical: |
<p>aa_&quot;bb&quot;_cc</p>
static: |-
<p data-sourcepos="1:1-1:10" dir="auto">aa_"bb"_cc</p>
wysiwyg: |-
- <p>aa_"bb"_cc</p>
+ <p dir="auto">aa_"bb"_cc</p>
06_05_00__inlines__emphasis_and_strong_emphasis__014:
canonical: |
<p>foo-<em>(bar)</em></p>
static: |-
<p data-sourcepos="1:1-1:11" dir="auto">foo-<em>(bar)</em></p>
wysiwyg: |-
- <p>foo-<em>(bar)</em></p>
+ <p dir="auto">foo-<em>(bar)</em></p>
06_05_00__inlines__emphasis_and_strong_emphasis__015:
canonical: |
<p>_foo*</p>
static: |-
<p data-sourcepos="1:1-1:5" dir="auto">_foo*</p>
wysiwyg: |-
- <p>_foo*</p>
+ <p dir="auto">_foo*</p>
06_05_00__inlines__emphasis_and_strong_emphasis__016:
canonical: |
<p>*foo bar *</p>
static: |-
<p data-sourcepos="1:1-1:10" dir="auto">*foo bar *</p>
wysiwyg: |-
- <p>*foo bar *</p>
+ <p dir="auto">*foo bar *</p>
06_05_00__inlines__emphasis_and_strong_emphasis__017:
canonical: |
<p>*foo bar
@@ -5338,7 +5333,7 @@
<p data-sourcepos="1:1-2:1" dir="auto">*foo bar
*</p>
wysiwyg: |-
- <p>*foo bar
+ <p dir="auto">*foo bar
*</p>
06_05_00__inlines__emphasis_and_strong_emphasis__018:
canonical: |
@@ -5346,112 +5341,112 @@
static: |-
<p data-sourcepos="1:1-1:7" dir="auto">*(*foo)</p>
wysiwyg: |-
- <p>*(*foo)</p>
+ <p dir="auto">*(*foo)</p>
06_05_00__inlines__emphasis_and_strong_emphasis__019:
canonical: |
<p><em>(<em>foo</em>)</em></p>
static: |-
<p data-sourcepos="1:1-1:9" dir="auto"><em>(<em>foo</em>)</em></p>
wysiwyg: |-
- <p><em>(foo</em>)</p>
+ <p dir="auto"><em>(foo</em>)</p>
06_05_00__inlines__emphasis_and_strong_emphasis__020:
canonical: |
<p><em>foo</em>bar</p>
static: |-
<p data-sourcepos="1:1-1:8" dir="auto"><em>foo</em>bar</p>
wysiwyg: |-
- <p><em>foo</em>bar</p>
+ <p dir="auto"><em>foo</em>bar</p>
06_05_00__inlines__emphasis_and_strong_emphasis__021:
canonical: |
<p>_foo bar _</p>
static: |-
<p data-sourcepos="1:1-1:10" dir="auto">_foo bar _</p>
wysiwyg: |-
- <p>_foo bar _</p>
+ <p dir="auto">_foo bar _</p>
06_05_00__inlines__emphasis_and_strong_emphasis__022:
canonical: |
<p>_(_foo)</p>
static: |-
<p data-sourcepos="1:1-1:7" dir="auto">_(_foo)</p>
wysiwyg: |-
- <p>_(_foo)</p>
+ <p dir="auto">_(_foo)</p>
06_05_00__inlines__emphasis_and_strong_emphasis__023:
canonical: |
<p><em>(<em>foo</em>)</em></p>
static: |-
<p data-sourcepos="1:1-1:9" dir="auto"><em>(<em>foo</em>)</em></p>
wysiwyg: |-
- <p><em>(foo</em>)</p>
+ <p dir="auto"><em>(foo</em>)</p>
06_05_00__inlines__emphasis_and_strong_emphasis__024:
canonical: |
<p>_foo_bar</p>
static: |-
<p data-sourcepos="1:1-1:8" dir="auto">_foo_bar</p>
wysiwyg: |-
- <p>_foo_bar</p>
+ <p dir="auto">_foo_bar</p>
06_05_00__inlines__emphasis_and_strong_emphasis__025:
canonical: |
<p>_приÑтанÑм_ÑтремÑÑ‚ÑÑ</p>
static: |-
<p data-sourcepos="1:1-1:38" dir="auto">_приÑтанÑм_ÑтремÑÑ‚ÑÑ</p>
wysiwyg: |-
- <p>_приÑтанÑм_ÑтремÑÑ‚ÑÑ</p>
+ <p dir="auto">_приÑтанÑм_ÑтремÑÑ‚ÑÑ</p>
06_05_00__inlines__emphasis_and_strong_emphasis__026:
canonical: |
<p><em>foo_bar_baz</em></p>
static: |-
<p data-sourcepos="1:1-1:13" dir="auto"><em>foo_bar_baz</em></p>
wysiwyg: |-
- <p><em>foo_bar_baz</em></p>
+ <p dir="auto"><em>foo_bar_baz</em></p>
06_05_00__inlines__emphasis_and_strong_emphasis__027:
canonical: |
<p><em>(bar)</em>.</p>
static: |-
<p data-sourcepos="1:1-1:8" dir="auto"><em>(bar)</em>.</p>
wysiwyg: |-
- <p><em>(bar)</em>.</p>
+ <p dir="auto"><em>(bar)</em>.</p>
06_05_00__inlines__emphasis_and_strong_emphasis__028:
canonical: |
<p><strong>foo bar</strong></p>
static: |-
<p data-sourcepos="1:1-1:11" dir="auto"><strong>foo bar</strong></p>
wysiwyg: |-
- <p><strong>foo bar</strong></p>
+ <p dir="auto"><strong>foo bar</strong></p>
06_05_00__inlines__emphasis_and_strong_emphasis__029:
canonical: |
<p>** foo bar**</p>
static: |-
<p data-sourcepos="1:1-1:12" dir="auto">** foo bar**</p>
wysiwyg: |-
- <p>** foo bar**</p>
+ <p dir="auto">** foo bar**</p>
06_05_00__inlines__emphasis_and_strong_emphasis__030:
canonical: |
<p>a**&quot;foo&quot;**</p>
static: |-
<p data-sourcepos="1:1-1:10" dir="auto">a**"foo"**</p>
wysiwyg: |-
- <p>a**"foo"**</p>
+ <p dir="auto">a**"foo"**</p>
06_05_00__inlines__emphasis_and_strong_emphasis__031:
canonical: |
<p>foo<strong>bar</strong></p>
static: |-
<p data-sourcepos="1:1-1:10" dir="auto">foo<strong>bar</strong></p>
wysiwyg: |-
- <p>foo<strong>bar</strong></p>
+ <p dir="auto">foo<strong>bar</strong></p>
06_05_00__inlines__emphasis_and_strong_emphasis__032:
canonical: |
<p><strong>foo bar</strong></p>
static: |-
<p data-sourcepos="1:1-1:11" dir="auto"><strong>foo bar</strong></p>
wysiwyg: |-
- <p><strong>foo bar</strong></p>
+ <p dir="auto"><strong>foo bar</strong></p>
06_05_00__inlines__emphasis_and_strong_emphasis__033:
canonical: |
<p>__ foo bar__</p>
static: |-
<p data-sourcepos="1:1-1:12" dir="auto">__ foo bar__</p>
wysiwyg: |-
- <p>__ foo bar__</p>
+ <p dir="auto">__ foo bar__</p>
06_05_00__inlines__emphasis_and_strong_emphasis__034:
canonical: |
<p>__
@@ -5460,7 +5455,7 @@
<p data-sourcepos="1:1-2:9" dir="auto">__
foo bar__</p>
wysiwyg: |-
- <p>__
+ <p dir="auto">__
foo bar__</p>
06_05_00__inlines__emphasis_and_strong_emphasis__035:
canonical: |
@@ -5468,63 +5463,63 @@
static: |-
<p data-sourcepos="1:1-1:10" dir="auto">a__"foo"__</p>
wysiwyg: |-
- <p>a__"foo"__</p>
+ <p dir="auto">a__"foo"__</p>
06_05_00__inlines__emphasis_and_strong_emphasis__036:
canonical: |
<p>foo__bar__</p>
static: |-
<p data-sourcepos="1:1-1:10" dir="auto">foo__bar__</p>
wysiwyg: |-
- <p>foo__bar__</p>
+ <p dir="auto">foo__bar__</p>
06_05_00__inlines__emphasis_and_strong_emphasis__037:
canonical: |
<p>5__6__78</p>
static: |-
<p data-sourcepos="1:1-1:8" dir="auto">5__6__78</p>
wysiwyg: |-
- <p>5__6__78</p>
+ <p dir="auto">5__6__78</p>
06_05_00__inlines__emphasis_and_strong_emphasis__038:
canonical: |
<p>приÑтанÑм__ÑтремÑÑ‚ÑÑ__</p>
static: |-
<p data-sourcepos="1:1-1:40" dir="auto">приÑтанÑм__ÑтремÑÑ‚ÑÑ__</p>
wysiwyg: |-
- <p>приÑтанÑм__ÑтремÑÑ‚ÑÑ__</p>
+ <p dir="auto">приÑтанÑм__ÑтремÑÑ‚ÑÑ__</p>
06_05_00__inlines__emphasis_and_strong_emphasis__039:
canonical: |
<p><strong>foo, <strong>bar</strong>, baz</strong></p>
static: |-
<p data-sourcepos="1:1-1:21" dir="auto"><strong>foo, bar, baz</strong></p>
wysiwyg: |-
- <p><strong>foo, bar</strong>, baz</p>
+ <p dir="auto"><strong>foo, bar</strong>, baz</p>
06_05_00__inlines__emphasis_and_strong_emphasis__040:
canonical: |
<p>foo-<strong>(bar)</strong></p>
static: |-
<p data-sourcepos="1:1-1:13" dir="auto">foo-<strong>(bar)</strong></p>
wysiwyg: |-
- <p>foo-<strong>(bar)</strong></p>
+ <p dir="auto">foo-<strong>(bar)</strong></p>
06_05_00__inlines__emphasis_and_strong_emphasis__041:
canonical: |
<p>**foo bar **</p>
static: |-
<p data-sourcepos="1:1-1:12" dir="auto">**foo bar **</p>
wysiwyg: |-
- <p>**foo bar **</p>
+ <p dir="auto">**foo bar **</p>
06_05_00__inlines__emphasis_and_strong_emphasis__042:
canonical: |
<p>**(**foo)</p>
static: |-
<p data-sourcepos="1:1-1:9" dir="auto">**(**foo)</p>
wysiwyg: |-
- <p>**(**foo)</p>
+ <p dir="auto">**(**foo)</p>
06_05_00__inlines__emphasis_and_strong_emphasis__043:
canonical: |
<p><em>(<strong>foo</strong>)</em></p>
static: |-
<p data-sourcepos="1:1-1:11" dir="auto"><em>(<strong>foo</strong>)</em></p>
wysiwyg: |-
- <p><em>(</em><strong><em>foo</em></strong><em>)</em></p>
+ <p dir="auto"><em>(</em><strong><em>foo</em></strong><em>)</em></p>
06_05_00__inlines__emphasis_and_strong_emphasis__044:
canonical: |
<p><strong>Gomphocarpus (<em>Gomphocarpus physocarpus</em>, syn.
@@ -5533,7 +5528,7 @@
<p data-sourcepos="1:1-2:25" dir="auto"><strong>Gomphocarpus (<em>Gomphocarpus physocarpus</em>, syn.
<em>Asclepias physocarpa</em>)</strong></p>
wysiwyg: |-
- <p><strong>Gomphocarpus (<em>Gomphocarpus physocarpus</em>, syn.
+ <p dir="auto"><strong>Gomphocarpus (<em>Gomphocarpus physocarpus</em>, syn.
<em>Asclepias physocarpa</em>)</strong></p>
06_05_00__inlines__emphasis_and_strong_emphasis__045:
canonical: |
@@ -5541,70 +5536,70 @@
static: |-
<p data-sourcepos="1:1-1:19" dir="auto"><strong>foo "<em>bar</em>" foo</strong></p>
wysiwyg: |-
- <p><strong>foo "<em>bar</em>" foo</strong></p>
+ <p dir="auto"><strong>foo "<em>bar</em>" foo</strong></p>
06_05_00__inlines__emphasis_and_strong_emphasis__046:
canonical: |
<p><strong>foo</strong>bar</p>
static: |-
<p data-sourcepos="1:1-1:10" dir="auto"><strong>foo</strong>bar</p>
wysiwyg: |-
- <p><strong>foo</strong>bar</p>
+ <p dir="auto"><strong>foo</strong>bar</p>
06_05_00__inlines__emphasis_and_strong_emphasis__047:
canonical: |
<p>__foo bar __</p>
static: |-
<p data-sourcepos="1:1-1:12" dir="auto">__foo bar __</p>
wysiwyg: |-
- <p>__foo bar __</p>
+ <p dir="auto">__foo bar __</p>
06_05_00__inlines__emphasis_and_strong_emphasis__048:
canonical: |
<p>__(__foo)</p>
static: |-
<p data-sourcepos="1:1-1:9" dir="auto">__(__foo)</p>
wysiwyg: |-
- <p>__(__foo)</p>
+ <p dir="auto">__(__foo)</p>
06_05_00__inlines__emphasis_and_strong_emphasis__049:
canonical: |
<p><em>(<strong>foo</strong>)</em></p>
static: |-
<p data-sourcepos="1:1-1:11" dir="auto"><em>(<strong>foo</strong>)</em></p>
wysiwyg: |-
- <p><em>(</em><strong><em>foo</em></strong><em>)</em></p>
+ <p dir="auto"><em>(</em><strong><em>foo</em></strong><em>)</em></p>
06_05_00__inlines__emphasis_and_strong_emphasis__050:
canonical: |
<p>__foo__bar</p>
static: |-
<p data-sourcepos="1:1-1:10" dir="auto">__foo__bar</p>
wysiwyg: |-
- <p>__foo__bar</p>
+ <p dir="auto">__foo__bar</p>
06_05_00__inlines__emphasis_and_strong_emphasis__051:
canonical: |
<p>__приÑтанÑм__ÑтремÑÑ‚ÑÑ</p>
static: |-
<p data-sourcepos="1:1-1:40" dir="auto">__приÑтанÑм__ÑтремÑÑ‚ÑÑ</p>
wysiwyg: |-
- <p>__приÑтанÑм__ÑтремÑÑ‚ÑÑ</p>
+ <p dir="auto">__приÑтанÑм__ÑтремÑÑ‚ÑÑ</p>
06_05_00__inlines__emphasis_and_strong_emphasis__052:
canonical: |
<p><strong>foo__bar__baz</strong></p>
static: |-
<p data-sourcepos="1:1-1:17" dir="auto"><strong>foo__bar__baz</strong></p>
wysiwyg: |-
- <p><strong>foo__bar__baz</strong></p>
+ <p dir="auto"><strong>foo__bar__baz</strong></p>
06_05_00__inlines__emphasis_and_strong_emphasis__053:
canonical: |
<p><strong>(bar)</strong>.</p>
static: |-
<p data-sourcepos="1:1-1:10" dir="auto"><strong>(bar)</strong>.</p>
wysiwyg: |-
- <p><strong>(bar)</strong>.</p>
+ <p dir="auto"><strong>(bar)</strong>.</p>
06_05_00__inlines__emphasis_and_strong_emphasis__054:
canonical: |
<p><em>foo <a href="/url">bar</a></em></p>
static: |-
<p data-sourcepos="1:1-1:17" dir="auto"><em>foo <a href="/url">bar</a></em></p>
wysiwyg: |-
- <p><em>foo </em><a target="_blank" rel="noopener noreferrer nofollow" href="/url"><em>bar</em></a></p>
+ <p dir="auto"><em>foo </em><a target="_blank" rel="noopener noreferrer nofollow" href="/url"><em>bar</em></a></p>
06_05_00__inlines__emphasis_and_strong_emphasis__055:
canonical: |
<p><em>foo
@@ -5613,7 +5608,7 @@
<p data-sourcepos="1:1-2:4" dir="auto"><em>foo
bar</em></p>
wysiwyg: |-
- <p><em>foo
+ <p dir="auto"><em>foo
bar</em></p>
06_05_00__inlines__emphasis_and_strong_emphasis__056:
canonical: |
@@ -5621,119 +5616,119 @@
static: |-
<p data-sourcepos="1:1-1:17" dir="auto"><em>foo <strong>bar</strong> baz</em></p>
wysiwyg: |-
- <p><em>foo </em><strong><em>bar</em></strong><em> baz</em></p>
+ <p dir="auto"><em>foo </em><strong><em>bar</em></strong><em> baz</em></p>
06_05_00__inlines__emphasis_and_strong_emphasis__057:
canonical: |
<p><em>foo <em>bar</em> baz</em></p>
static: |-
<p data-sourcepos="1:1-1:15" dir="auto"><em>foo <em>bar</em> baz</em></p>
wysiwyg: |-
- <p><em>foo bar</em> baz</p>
+ <p dir="auto"><em>foo bar</em> baz</p>
06_05_00__inlines__emphasis_and_strong_emphasis__058:
canonical: |
<p><em><em>foo</em> bar</em></p>
static: |-
<p data-sourcepos="1:1-1:11" dir="auto"><em><em>foo</em> bar</em></p>
wysiwyg: |-
- <p><em>foo</em> bar</p>
+ <p dir="auto"><em>foo</em> bar</p>
06_05_00__inlines__emphasis_and_strong_emphasis__059:
canonical: |
<p><em>foo <em>bar</em></em></p>
static: |-
<p data-sourcepos="1:1-1:11" dir="auto"><em>foo <em>bar</em></em></p>
wysiwyg: |-
- <p><em>foo bar</em></p>
+ <p dir="auto"><em>foo bar</em></p>
06_05_00__inlines__emphasis_and_strong_emphasis__060:
canonical: |
<p><em>foo <strong>bar</strong> baz</em></p>
static: |-
<p data-sourcepos="1:1-1:17" dir="auto"><em>foo <strong>bar</strong> baz</em></p>
wysiwyg: |-
- <p><em>foo </em><strong><em>bar</em></strong><em> baz</em></p>
+ <p dir="auto"><em>foo </em><strong><em>bar</em></strong><em> baz</em></p>
06_05_00__inlines__emphasis_and_strong_emphasis__061:
canonical: |
<p><em>foo<strong>bar</strong>baz</em></p>
static: |-
<p data-sourcepos="1:1-1:15" dir="auto"><em>foo<strong>bar</strong>baz</em></p>
wysiwyg: |-
- <p><em>foo</em><strong><em>bar</em></strong><em>baz</em></p>
+ <p dir="auto"><em>foo</em><strong><em>bar</em></strong><em>baz</em></p>
06_05_00__inlines__emphasis_and_strong_emphasis__062:
canonical: |
<p><em>foo**bar</em></p>
static: |-
<p data-sourcepos="1:1-1:10" dir="auto"><em>foo**bar</em></p>
wysiwyg: |-
- <p><em>foo**bar</em></p>
+ <p dir="auto"><em>foo**bar</em></p>
06_05_00__inlines__emphasis_and_strong_emphasis__063:
canonical: |
<p><em><strong>foo</strong> bar</em></p>
static: |-
<p data-sourcepos="1:1-1:13" dir="auto"><em><strong>foo</strong> bar</em></p>
wysiwyg: |-
- <p><strong><em>foo</em></strong><em> bar</em></p>
+ <p dir="auto"><strong><em>foo</em></strong><em> bar</em></p>
06_05_00__inlines__emphasis_and_strong_emphasis__064:
canonical: |
<p><em>foo <strong>bar</strong></em></p>
static: |-
<p data-sourcepos="1:1-1:13" dir="auto"><em>foo <strong>bar</strong></em></p>
wysiwyg: |-
- <p><em>foo </em><strong><em>bar</em></strong></p>
+ <p dir="auto"><em>foo </em><strong><em>bar</em></strong></p>
06_05_00__inlines__emphasis_and_strong_emphasis__065:
canonical: |
<p><em>foo<strong>bar</strong></em></p>
static: |-
<p data-sourcepos="1:1-1:12" dir="auto"><em>foo<strong>bar</strong></em></p>
wysiwyg: |-
- <p><em>foo</em><strong><em>bar</em></strong></p>
+ <p dir="auto"><em>foo</em><strong><em>bar</em></strong></p>
06_05_00__inlines__emphasis_and_strong_emphasis__066:
canonical: |
<p>foo<em><strong>bar</strong></em>baz</p>
static: |-
<p data-sourcepos="1:1-1:15" dir="auto">foo<em><strong>bar</strong></em>baz</p>
wysiwyg: |-
- <p>foo<strong><em>bar</em></strong>baz</p>
+ <p dir="auto">foo<strong><em>bar</em></strong>baz</p>
06_05_00__inlines__emphasis_and_strong_emphasis__067:
canonical: |
<p>foo<strong><strong><strong>bar</strong></strong></strong>***baz</p>
static: |-
<p data-sourcepos="1:1-1:24" dir="auto">foo<strong>bar</strong>***baz</p>
wysiwyg: |-
- <p>foo<strong>bar</strong>***baz</p>
+ <p dir="auto">foo<strong>bar</strong>***baz</p>
06_05_00__inlines__emphasis_and_strong_emphasis__068:
canonical: |
<p><em>foo <strong>bar <em>baz</em> bim</strong> bop</em></p>
static: |-
<p data-sourcepos="1:1-1:27" dir="auto"><em>foo <strong>bar <em>baz</em> bim</strong> bop</em></p>
wysiwyg: |-
- <p><em>foo </em><strong><em>bar baz</em> bim</strong> bop</p>
+ <p dir="auto"><em>foo </em><strong><em>bar baz</em> bim</strong> bop</p>
06_05_00__inlines__emphasis_and_strong_emphasis__069:
canonical: |
<p><em>foo <a href="/url"><em>bar</em></a></em></p>
static: |-
<p data-sourcepos="1:1-1:19" dir="auto"><em>foo <a href="/url"><em>bar</em></a></em></p>
wysiwyg: |-
- <p><em>foo </em><a target="_blank" rel="noopener noreferrer nofollow" href="/url"><em>bar</em></a></p>
+ <p dir="auto"><em>foo </em><a target="_blank" rel="noopener noreferrer nofollow" href="/url"><em>bar</em></a></p>
06_05_00__inlines__emphasis_and_strong_emphasis__070:
canonical: |
<p>** is not an empty emphasis</p>
static: |-
<p data-sourcepos="1:1-1:27" dir="auto">** is not an empty emphasis</p>
wysiwyg: |-
- <p>** is not an empty emphasis</p>
+ <p dir="auto">** is not an empty emphasis</p>
06_05_00__inlines__emphasis_and_strong_emphasis__071:
canonical: |
<p>**** is not an empty strong emphasis</p>
static: |-
<p data-sourcepos="1:1-1:36" dir="auto">**** is not an empty strong emphasis</p>
wysiwyg: |-
- <p>**** is not an empty strong emphasis</p>
+ <p dir="auto">**** is not an empty strong emphasis</p>
06_05_00__inlines__emphasis_and_strong_emphasis__072:
canonical: |
<p><strong>foo <a href="/url">bar</a></strong></p>
static: |-
<p data-sourcepos="1:1-1:19" dir="auto"><strong>foo <a href="/url">bar</a></strong></p>
wysiwyg: |-
- <p><strong>foo </strong><a target="_blank" rel="noopener noreferrer nofollow" href="/url"><strong>bar</strong></a></p>
+ <p dir="auto"><strong>foo </strong><a target="_blank" rel="noopener noreferrer nofollow" href="/url"><strong>bar</strong></a></p>
06_05_00__inlines__emphasis_and_strong_emphasis__073:
canonical: |
<p><strong>foo
@@ -5742,7 +5737,7 @@
<p data-sourcepos="1:1-2:5" dir="auto"><strong>foo
bar</strong></p>
wysiwyg: |-
- <p><strong>foo
+ <p dir="auto"><strong>foo
bar</strong></p>
06_05_00__inlines__emphasis_and_strong_emphasis__074:
canonical: |
@@ -5750,56 +5745,56 @@
static: |-
<p data-sourcepos="1:1-1:17" dir="auto"><strong>foo <em>bar</em> baz</strong></p>
wysiwyg: |-
- <p><strong>foo <em>bar</em> baz</strong></p>
+ <p dir="auto"><strong>foo <em>bar</em> baz</strong></p>
06_05_00__inlines__emphasis_and_strong_emphasis__075:
canonical: |
<p><strong>foo <strong>bar</strong> baz</strong></p>
static: |-
<p data-sourcepos="1:1-1:19" dir="auto"><strong>foo bar baz</strong></p>
wysiwyg: |-
- <p><strong>foo bar</strong> baz</p>
+ <p dir="auto"><strong>foo bar</strong> baz</p>
06_05_00__inlines__emphasis_and_strong_emphasis__076:
canonical: |
<p><strong><strong>foo</strong> bar</strong></p>
static: |-
<p data-sourcepos="1:1-1:15" dir="auto"><strong>foo bar</strong></p>
wysiwyg: |-
- <p><strong>foo</strong> bar</p>
+ <p dir="auto"><strong>foo</strong> bar</p>
06_05_00__inlines__emphasis_and_strong_emphasis__077:
canonical: |
<p><strong>foo <strong>bar</strong></strong></p>
static: |-
<p data-sourcepos="1:1-1:15" dir="auto"><strong>foo bar</strong></p>
wysiwyg: |-
- <p><strong>foo bar</strong></p>
+ <p dir="auto"><strong>foo bar</strong></p>
06_05_00__inlines__emphasis_and_strong_emphasis__078:
canonical: |
<p><strong>foo <em>bar</em> baz</strong></p>
static: |-
<p data-sourcepos="1:1-1:17" dir="auto"><strong>foo <em>bar</em> baz</strong></p>
wysiwyg: |-
- <p><strong>foo <em>bar</em> baz</strong></p>
+ <p dir="auto"><strong>foo <em>bar</em> baz</strong></p>
06_05_00__inlines__emphasis_and_strong_emphasis__079:
canonical: |
<p><strong>foo<em>bar</em>baz</strong></p>
static: |-
<p data-sourcepos="1:1-1:15" dir="auto"><strong>foo<em>bar</em>baz</strong></p>
wysiwyg: |-
- <p><strong>foo<em>bar</em>baz</strong></p>
+ <p dir="auto"><strong>foo<em>bar</em>baz</strong></p>
06_05_00__inlines__emphasis_and_strong_emphasis__080:
canonical: |
<p><strong><em>foo</em> bar</strong></p>
static: |-
<p data-sourcepos="1:1-1:13" dir="auto"><strong><em>foo</em> bar</strong></p>
wysiwyg: |-
- <p><strong><em>foo</em> bar</strong></p>
+ <p dir="auto"><strong><em>foo</em> bar</strong></p>
06_05_00__inlines__emphasis_and_strong_emphasis__081:
canonical: |
<p><strong>foo <em>bar</em></strong></p>
static: |-
<p data-sourcepos="1:1-1:13" dir="auto"><strong>foo <em>bar</em></strong></p>
wysiwyg: |-
- <p><strong>foo <em>bar</em></strong></p>
+ <p dir="auto"><strong>foo <em>bar</em></strong></p>
06_05_00__inlines__emphasis_and_strong_emphasis__082:
canonical: |
<p><strong>foo <em>bar <strong>baz</strong>
@@ -5808,7 +5803,7 @@
<p data-sourcepos="1:1-2:10" dir="auto"><strong>foo <em>bar <strong>baz</strong>
bim</em> bop</strong></p>
wysiwyg: |-
- <p><strong>foo <em>bar baz</em></strong><em>
+ <p dir="auto"><strong>foo <em>bar baz</em></strong><em>
bim</em> bop</p>
06_05_00__inlines__emphasis_and_strong_emphasis__083:
canonical: |
@@ -5816,350 +5811,350 @@
static: |-
<p data-sourcepos="1:1-1:21" dir="auto"><strong>foo <a href="/url"><em>bar</em></a></strong></p>
wysiwyg: |-
- <p><strong>foo </strong><a target="_blank" rel="noopener noreferrer nofollow" href="/url"><strong><em>bar</em></strong></a></p>
+ <p dir="auto"><strong>foo </strong><a target="_blank" rel="noopener noreferrer nofollow" href="/url"><strong><em>bar</em></strong></a></p>
06_05_00__inlines__emphasis_and_strong_emphasis__084:
canonical: |
<p>__ is not an empty emphasis</p>
static: |-
<p data-sourcepos="1:1-1:27" dir="auto">__ is not an empty emphasis</p>
wysiwyg: |-
- <p>__ is not an empty emphasis</p>
+ <p dir="auto">__ is not an empty emphasis</p>
06_05_00__inlines__emphasis_and_strong_emphasis__085:
canonical: |
<p>____ is not an empty strong emphasis</p>
static: |-
<p data-sourcepos="1:1-1:36" dir="auto">____ is not an empty strong emphasis</p>
wysiwyg: |-
- <p>____ is not an empty strong emphasis</p>
+ <p dir="auto">____ is not an empty strong emphasis</p>
06_05_00__inlines__emphasis_and_strong_emphasis__086:
canonical: |
<p>foo ***</p>
static: |-
<p data-sourcepos="1:1-1:7" dir="auto">foo ***</p>
wysiwyg: |-
- <p>foo ***</p>
+ <p dir="auto">foo ***</p>
06_05_00__inlines__emphasis_and_strong_emphasis__087:
canonical: |
<p>foo <em>*</em></p>
static: |-
<p data-sourcepos="1:1-1:8" dir="auto">foo <em>*</em></p>
wysiwyg: |-
- <p>foo <em>*</em></p>
+ <p dir="auto">foo <em>*</em></p>
06_05_00__inlines__emphasis_and_strong_emphasis__088:
canonical: |
<p>foo <em>_</em></p>
static: |-
<p data-sourcepos="1:1-1:7" dir="auto">foo <em>_</em></p>
wysiwyg: |-
- <p>foo <em>_</em></p>
+ <p dir="auto">foo <em>_</em></p>
06_05_00__inlines__emphasis_and_strong_emphasis__089:
canonical: |
<p>foo *****</p>
static: |-
<p data-sourcepos="1:1-1:9" dir="auto">foo *****</p>
wysiwyg: |-
- <p>foo *****</p>
+ <p dir="auto">foo *****</p>
06_05_00__inlines__emphasis_and_strong_emphasis__090:
canonical: |
<p>foo <strong>*</strong></p>
static: |-
<p data-sourcepos="1:1-1:10" dir="auto">foo <strong>*</strong></p>
wysiwyg: |-
- <p>foo <strong>*</strong></p>
+ <p dir="auto">foo <strong>*</strong></p>
06_05_00__inlines__emphasis_and_strong_emphasis__091:
canonical: |
<p>foo <strong>_</strong></p>
static: |-
<p data-sourcepos="1:1-1:9" dir="auto">foo <strong>_</strong></p>
wysiwyg: |-
- <p>foo <strong>_</strong></p>
+ <p dir="auto">foo <strong>_</strong></p>
06_05_00__inlines__emphasis_and_strong_emphasis__092:
canonical: |
<p>*<em>foo</em></p>
static: |-
<p data-sourcepos="1:1-1:6" dir="auto">*<em>foo</em></p>
wysiwyg: |-
- <p>*<em>foo</em></p>
+ <p dir="auto">*<em>foo</em></p>
06_05_00__inlines__emphasis_and_strong_emphasis__093:
canonical: |
<p><em>foo</em>*</p>
static: |-
<p data-sourcepos="1:1-1:6" dir="auto"><em>foo</em>*</p>
wysiwyg: |-
- <p><em>foo</em>*</p>
+ <p dir="auto"><em>foo</em>*</p>
06_05_00__inlines__emphasis_and_strong_emphasis__094:
canonical: |
<p>*<strong>foo</strong></p>
static: |-
<p data-sourcepos="1:1-1:8" dir="auto">*<strong>foo</strong></p>
wysiwyg: |-
- <p>*<strong>foo</strong></p>
+ <p dir="auto">*<strong>foo</strong></p>
06_05_00__inlines__emphasis_and_strong_emphasis__095:
canonical: |
<p>***<em>foo</em></p>
static: |-
<p data-sourcepos="1:1-1:8" dir="auto">***<em>foo</em></p>
wysiwyg: |-
- <p>***<em>foo</em></p>
+ <p dir="auto">***<em>foo</em></p>
06_05_00__inlines__emphasis_and_strong_emphasis__096:
canonical: |
<p><strong>foo</strong>*</p>
static: |-
<p data-sourcepos="1:1-1:8" dir="auto"><strong>foo</strong>*</p>
wysiwyg: |-
- <p><strong>foo</strong>*</p>
+ <p dir="auto"><strong>foo</strong>*</p>
06_05_00__inlines__emphasis_and_strong_emphasis__097:
canonical: |
<p><em>foo</em>***</p>
static: |-
<p data-sourcepos="1:1-1:8" dir="auto"><em>foo</em>***</p>
wysiwyg: |-
- <p><em>foo</em>***</p>
+ <p dir="auto"><em>foo</em>***</p>
06_05_00__inlines__emphasis_and_strong_emphasis__098:
canonical: |
<p>foo ___</p>
static: |-
<p data-sourcepos="1:1-1:7" dir="auto">foo ___</p>
wysiwyg: |-
- <p>foo ___</p>
+ <p dir="auto">foo ___</p>
06_05_00__inlines__emphasis_and_strong_emphasis__099:
canonical: |
<p>foo <em>_</em></p>
static: |-
<p data-sourcepos="1:1-1:29" dir="auto">foo <em>_</em></p>
wysiwyg: |-
- <p>foo <em>_</em></p>
+ <p dir="auto">foo <em>_</em></p>
06_05_00__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>
+ <p dir="auto">foo <em>*</em></p>
06_05_00__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>
+ <p dir="auto">foo _____</p>
06_05_00__inlines__emphasis_and_strong_emphasis__102:
canonical: |
<p>foo <strong>_</strong></p>
static: |-
<p data-sourcepos="1:1-1:31" dir="auto">foo <strong>_</strong></p>
wysiwyg: |-
- <p>foo <strong>_</strong></p>
+ <p dir="auto">foo <strong>_</strong></p>
06_05_00__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>
+ <p dir="auto">foo <strong>*</strong></p>
06_05_00__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>
+ <p dir="auto">_<em>foo</em></p>
06_05_00__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>
+ <p dir="auto"><em>foo</em>_</p>
06_05_00__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>
+ <p dir="auto">_<strong>foo</strong></p>
06_05_00__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>
+ <p dir="auto">___<em>foo</em></p>
06_05_00__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>
+ <p dir="auto"><strong>foo</strong>_</p>
06_05_00__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>
+ <p dir="auto"><em>foo</em>___</p>
06_05_00__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>
+ <p dir="auto"><strong>foo</strong></p>
06_05_00__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>
+ <p dir="auto"><em>foo</em></p>
06_05_00__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>
+ <p dir="auto"><strong>foo</strong></p>
06_05_00__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>
+ <p dir="auto"><em>foo</em></p>
06_05_00__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>foo</strong></p>
wysiwyg: |-
- <p><strong>foo</strong></p>
+ <p dir="auto"><strong>foo</strong></p>
06_05_00__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>foo</strong></p>
wysiwyg: |-
- <p><strong>foo</strong></p>
+ <p dir="auto"><strong>foo</strong></p>
06_05_00__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>foo</strong></p>
wysiwyg: |-
- <p><strong>foo</strong></p>
+ <p dir="auto"><strong>foo</strong></p>
06_05_00__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>
+ <p dir="auto"><strong><em>foo</em></strong></p>
06_05_00__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>foo</strong></em></p>
wysiwyg: |-
- <p><strong><em>foo</em></strong></p>
+ <p dir="auto"><strong><em>foo</em></strong></p>
06_05_00__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>
+ <p dir="auto"><em>foo _bar</em> baz_</p>
06_05_00__inlines__emphasis_and_strong_emphasis__120:
canonical: |
<p><em>foo <strong>bar *baz bim</strong> bam</em></p>
static: |-
<p data-sourcepos="1:1-1:26" dir="auto"><em>foo <strong>bar *baz bim</strong> bam</em></p>
wysiwyg: |-
- <p><em>foo </em><strong><em>bar *baz bim</em></strong><em> bam</em></p>
+ <p dir="auto"><em>foo </em><strong><em>bar *baz bim</em></strong><em> bam</em></p>
06_05_00__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>
+ <p dir="auto">**foo <strong>bar baz</strong></p>
06_05_00__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>
+ <p dir="auto">*foo <em>bar baz</em></p>
06_05_00__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>
+ <p dir="auto">*<a target="_blank" rel="noopener noreferrer nofollow" href="/url">bar*</a></p>
06_05_00__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>
+ <p dir="auto">_foo <a target="_blank" rel="noopener noreferrer nofollow" href="/url">bar_</a></p>
06_05_00__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>
+ <p dir="auto">*<img src="foo" title="*"></p>
06_05_00__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>
+ <p dir="auto">**</p>
06_05_00__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>
+ <p dir="auto">__</p>
06_05_00__inlines__emphasis_and_strong_emphasis__128:
canonical: |
<p><em>a <code>*</code></em></p>
static: |-
<p data-sourcepos="1:1-1:7" dir="auto"><em>a <code>*</code></em></p>
wysiwyg: |-
- <p><em>a <code>*</code></em></p>
+ <p dir="auto"><em>a <code>*</code></em></p>
06_05_00__inlines__emphasis_and_strong_emphasis__129:
canonical: |
<p><em>a <code>_</code></em></p>
static: |-
<p data-sourcepos="1:1-1:7" dir="auto"><em>a <code>_</code></em></p>
wysiwyg: |-
- <p><em>a <code>_</code></em></p>
+ <p dir="auto"><em>a <code>_</code></em></p>
06_05_00__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>
+ <p dir="auto">**a<a target="_blank" rel="noopener noreferrer nofollow" href="http://foo.bar/?q=**">http://foo.bar/?q=**</a></p>
06_05_00__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>
+ <p dir="auto">__a<a target="_blank" rel="noopener noreferrer nofollow" href="http://foo.bar/?q=__">http://foo.bar/?q=__</a></p>
06_06_00__inlines__strikethrough_extension__001:
canonical: |
<p><del>Hi</del> Hello, world!</p>
static: |-
<p data-sourcepos="1:1-1:20" dir="auto"><del>Hi</del> Hello, world!</p>
wysiwyg: |-
- <p><s>Hi</s> Hello, world!</p>
+ <p dir="auto"><s>Hi</s> Hello, world!</p>
06_06_00__inlines__strikethrough_extension__002:
canonical: |
<p>This ~~has a</p>
@@ -6168,50 +6163,50 @@
<p data-sourcepos="1:1-1:12" dir="auto">This ~~has a</p>
<p data-sourcepos="3:1-3:16" dir="auto">new paragraph~~.</p>
wysiwyg: |-
- <p>This ~~has a</p>
- <p>new paragraph~~.</p>
+ <p dir="auto">This ~~has a</p>
+ <p dir="auto">new paragraph~~.</p>
06_07_00__inlines__links__001:
canonical: |
<p><a href="/uri" title="title">link</a></p>
static: |-
<p data-sourcepos="1:1-1:20" dir="auto"><a href="/uri" title="title">link</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri" title="title">link</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/uri" title="title">link</a></p>
06_07_00__inlines__links__002:
canonical: |
<p><a href="/uri">link</a></p>
static: |-
<p data-sourcepos="1:1-1:12" dir="auto"><a href="/uri">link</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">link</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">link</a></p>
06_07_00__inlines__links__003:
canonical: |
<p><a href="">link</a></p>
static: |-
<p data-sourcepos="1:1-1:8" dir="auto"><a href="">link</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="">link</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="">link</a></p>
06_07_00__inlines__links__004:
canonical: |
<p><a href="">link</a></p>
static: |-
<p data-sourcepos="1:1-1:10" dir="auto"><a href="">link</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="">link</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="">link</a></p>
06_07_00__inlines__links__005:
canonical: |
<p>[link](/my uri)</p>
static: |-
<p data-sourcepos="1:1-1:15" dir="auto"><a href="/my%20uri">link</a></p>
wysiwyg: |-
- <p>[link](/my uri)</p>
+ <p dir="auto">[link](/my uri)</p>
06_07_00__inlines__links__006:
canonical: |
<p><a href="/my%20uri">link</a></p>
static: |-
<p data-sourcepos="1:1-1:17" dir="auto"><a href="/my%20uri">link</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/my%20uri">link</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/my%20uri">link</a></p>
06_07_00__inlines__links__007:
canonical: |
<p>[link](foo
@@ -6220,7 +6215,7 @@
<p data-sourcepos="1:1-2:4" dir="auto">[link](foo
bar)</p>
wysiwyg: |-
- <p>[link](foo
+ <p dir="auto">[link](foo
bar)</p>
06_07_00__inlines__links__008:
canonical: |
@@ -6229,21 +6224,21 @@
static: |-
<p data-sourcepos="1:1-2:5" dir="auto">[link]()</p>
wysiwyg: |-
- <p>[link](</p>
+ <p dir="auto">[link](</p>
06_07_00__inlines__links__009:
canonical: |
<p><a href="b)c">a</a></p>
static: |-
<p data-sourcepos="1:1-1:10" dir="auto"><a href="b)c">a</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="b)c">a</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="b)c">a</a></p>
06_07_00__inlines__links__010:
canonical: |
<p>[link](&lt;foo&gt;)</p>
static: |-
<p data-sourcepos="1:1-1:14" dir="auto"><a href="%3Cfoo%3E">link</a></p>
wysiwyg: |-
- <p>[link](&lt;foo&gt;)</p>
+ <p dir="auto">[link](&lt;foo&gt;)</p>
06_07_00__inlines__links__011:
canonical: |
<p>[a](&lt;b)c
@@ -6254,7 +6249,7 @@
<a href="%3Cb">a</a>c&gt;
[a](<b>c)</b></p>
wysiwyg: |-
- <p>[a](&lt;b)c
+ <p dir="auto">[a](&lt;b)c
[a](&lt;b)c&gt;
[a](<strong>c)</strong></p>
06_07_00__inlines__links__012:
@@ -6263,35 +6258,35 @@
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>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="(foo)">link</a></p>
06_07_00__inlines__links__013:
canonical: |
<p><a href="foo(and(bar))">link</a></p>
static: |-
<p data-sourcepos="1:1-1:21" dir="auto"><a href="foo(and(bar))">link</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="foo(and(bar))">link</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="foo(and(bar))">link</a></p>
06_07_00__inlines__links__014:
canonical: |
<p><a href="foo(and(bar)">link</a></p>
static: |-
<p data-sourcepos="1:1-1:23" dir="auto"><a href="foo(and(bar)">link</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="foo(and(bar)">link</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="foo(and(bar)">link</a></p>
06_07_00__inlines__links__015:
canonical: |
<p><a href="foo(and(bar)">link</a></p>
static: |-
<p data-sourcepos="1:1-1:22" dir="auto"><a href="foo(and(bar)">link</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="foo(and(bar)">link</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="foo(and(bar)">link</a></p>
06_07_00__inlines__links__016:
canonical: |
<p><a href="foo):">link</a></p>
static: |-
<p data-sourcepos="1:1-1:15" dir="auto"><a>link</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="foo):">link</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="foo):">link</a></p>
06_07_00__inlines__links__017:
canonical: |
<p><a href="#fragment">link</a></p>
@@ -6302,30 +6297,30 @@
<p data-sourcepos="3:1-3:35" dir="auto"><a href="http://example.com#fragment" rel="nofollow noreferrer noopener" target="_blank">link</a></p>
<p data-sourcepos="5:1-5:37" dir="auto"><a href="http://example.com?foo=3#frag" rel="nofollow noreferrer noopener" target="_blank">link</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="#fragment">link</a></p>
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://example.com#fragment">link</a></p>
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://example.com?foo=3#frag">link</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="#fragment">link</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="http://example.com#fragment">link</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="http://example.com?foo=3#frag">link</a></p>
06_07_00__inlines__links__018:
canonical: |
<p><a href="foo%5Cbar">link</a></p>
static: |-
<p data-sourcepos="1:1-1:15" dir="auto"><a href="foo%5Cbar">link</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="foo%5Cbar">link</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="foo%5Cbar">link</a></p>
06_07_00__inlines__links__019:
canonical: |
<p><a href="foo%20b%C3%A4">link</a></p>
static: |-
<p data-sourcepos="1:1-1:21" dir="auto"><a href="foo%20b%C3%A4">link</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="foo%20b%C3%A4">link</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="foo%20b%C3%A4">link</a></p>
06_07_00__inlines__links__020:
canonical: |
<p><a href="%22title%22">link</a></p>
static: |-
<p data-sourcepos="1:1-1:15" dir="auto"><a href="%22title%22">link</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="%22title%22">link</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="%22title%22">link</a></p>
06_07_00__inlines__links__021:
canonical: |
<p><a href="/url" title="title">link</a>
@@ -6336,161 +6331,161 @@
<a href="/url" title="title">link</a>
<a href="/url" title="title">link</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">linklinklink</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">linklinklink</a></p>
06_07_00__inlines__links__022:
canonical: |
<p><a href="/url" title="title &quot;&quot;">link</a></p>
static: |-
<p data-sourcepos="1:1-1:29" dir="auto"><a href="/url" title='title ""'>link</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title &quot;&quot;">link</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title &quot;&quot;">link</a></p>
06_07_00__inlines__links__023:
canonical: |
<p><a href="/url%C2%A0%22title%22">link</a></p>
static: |-
<p data-sourcepos="1:1-1:21" dir="auto"><a href="/url%C2%A0%22title%22">link</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url%C2%A0%22title%22">link</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/url%C2%A0%22title%22">link</a></p>
06_07_00__inlines__links__024:
canonical: |
<p>[link](/url &quot;title &quot;and&quot; title&quot;)</p>
static: |-
<p data-sourcepos="1:1-1:32" dir="auto">[link](/url "title "and" title")</p>
wysiwyg: |-
- <p>[link](/url "title "and" title")</p>
+ <p dir="auto">[link](/url "title "and" title")</p>
06_07_00__inlines__links__025:
canonical: |
<p><a href="/url" title="title &quot;and&quot; title">link</a></p>
static: |-
<p data-sourcepos="1:1-1:32" dir="auto"><a href="/url" title='title "and" title'>link</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title &quot;and&quot; title">link</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title &quot;and&quot; title">link</a></p>
06_07_00__inlines__links__026:
canonical: |
<p><a href="/uri" title="title">link</a></p>
static: |-
<p data-sourcepos="1:1-2:12" dir="auto"><a href="/uri" title="title">link</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri" title="title">link</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/uri" title="title">link</a></p>
06_07_00__inlines__links__027:
canonical: |
<p>[link] (/uri)</p>
static: |-
<p data-sourcepos="1:1-1:13" dir="auto">[link] (/uri)</p>
wysiwyg: |-
- <p>[link] (/uri)</p>
+ <p dir="auto">[link] (/uri)</p>
06_07_00__inlines__links__028:
canonical: |
<p><a href="/uri">link [foo [bar]]</a></p>
static: |-
<p data-sourcepos="1:1-1:24" dir="auto"><a href="/uri">link [foo [bar]]</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">link [foo [bar]]</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">link [foo [bar]]</a></p>
06_07_00__inlines__links__029:
canonical: |
<p>[link] bar](/uri)</p>
static: |-
<p data-sourcepos="1:1-1:17" dir="auto">[link] bar](/uri)</p>
wysiwyg: |-
- <p>[link] bar](/uri)</p>
+ <p dir="auto">[link] bar](/uri)</p>
06_07_00__inlines__links__030:
canonical: |
<p>[link <a href="/uri">bar</a></p>
static: |-
<p data-sourcepos="1:1-1:17" dir="auto">[link <a href="/uri">bar</a></p>
wysiwyg: |-
- <p>[link <a target="_blank" rel="noopener noreferrer nofollow" href="/uri">bar</a></p>
+ <p dir="auto">[link <a target="_blank" rel="noopener noreferrer nofollow" href="/uri">bar</a></p>
06_07_00__inlines__links__031:
canonical: |
<p><a href="/uri">link [bar</a></p>
static: |-
<p data-sourcepos="1:1-1:18" dir="auto"><a href="/uri">link [bar</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">link [bar</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">link [bar</a></p>
06_07_00__inlines__links__032:
canonical: |
<p><a href="/uri">link <em>foo <strong>bar</strong> <code>#</code></em></a></p>
static: |-
<p data-sourcepos="1:1-1:30" dir="auto"><a href="/uri">link <em>foo <strong>bar</strong> <code>#</code></em></a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">link <em>foo </em><strong><em>bar<code>#</code></em></strong></a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">link <em>foo </em><strong><em>bar<code>#</code></em></strong></a></p>
06_07_00__inlines__links__033:
canonical: |
<p><a href="/uri"><img src="moon.jpg" alt="moon" /></a></p>
static: |-
<p data-sourcepos="1:1-1:25" dir="auto"><a href="/uri"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="moon" decoding="async" class="lazy" data-src="moon.jpg"></a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri"><img src="moon.jpg" alt="moon"></a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/uri"><img src="moon.jpg" alt="moon"></a></p>
06_07_00__inlines__links__034:
canonical: |
<p>[foo <a href="/uri">bar</a>](/uri)</p>
static: |-
<p data-sourcepos="1:1-1:23" dir="auto">[foo <a href="/uri">bar</a>](/uri)</p>
wysiwyg: |-
- <p>[foo <a target="_blank" rel="noopener noreferrer nofollow" href="/uri">bar</a>](/uri)</p>
+ <p dir="auto">[foo <a target="_blank" rel="noopener noreferrer nofollow" href="/uri">bar</a>](/uri)</p>
06_07_00__inlines__links__035:
canonical: |
<p>[foo <em>[bar <a href="/uri">baz</a>](/uri)</em>](/uri)</p>
static: |-
<p data-sourcepos="1:1-1:37" dir="auto">[foo <em>[bar <a href="/uri">baz</a>](/uri)</em>](/uri)</p>
wysiwyg: |-
- <p>[foo <em>[bar </em><a target="_blank" rel="noopener noreferrer nofollow" href="/uri"><em>baz</em></a><em>](/uri)</em>](/uri)</p>
+ <p dir="auto">[foo <em>[bar </em><a target="_blank" rel="noopener noreferrer nofollow" href="/uri"><em>baz</em></a><em>](/uri)</em>](/uri)</p>
06_07_00__inlines__links__036:
canonical: |
<p><img src="uri3" alt="[foo](uri2)" /></p>
static: |-
<p data-sourcepos="1:1-1:28" dir="auto"><a class="no-attachment-icon" href="uri3" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="[foo](uri2)" decoding="async" class="lazy" data-src="uri3"></a></p>
wysiwyg: |-
- <p><img src="uri3" alt="[foo](uri2)"></p>
+ <p dir="auto"><img src="uri3" alt="[foo](uri2)"></p>
06_07_00__inlines__links__037:
canonical: |
<p>*<a href="/uri">foo*</a></p>
static: |-
<p data-sourcepos="1:1-1:13" dir="auto">*<a href="/uri">foo*</a></p>
wysiwyg: |-
- <p>*<a target="_blank" rel="noopener noreferrer nofollow" href="/uri">foo*</a></p>
+ <p dir="auto">*<a target="_blank" rel="noopener noreferrer nofollow" href="/uri">foo*</a></p>
06_07_00__inlines__links__038:
canonical: |
<p><a href="baz*">foo *bar</a></p>
static: |-
<p data-sourcepos="1:1-1:16" dir="auto"><a href="baz*">foo *bar</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="baz*">foo *bar</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="baz*">foo *bar</a></p>
06_07_00__inlines__links__039:
canonical: |
<p><em>foo [bar</em> baz]</p>
static: |-
<p data-sourcepos="1:1-1:15" dir="auto"><em>foo [bar</em> baz]</p>
wysiwyg: |-
- <p><em>foo [bar</em> baz]</p>
+ <p dir="auto"><em>foo [bar</em> baz]</p>
06_07_00__inlines__links__040:
canonical: |
<p>[foo <bar attr="](baz)"></p>
static: |-
<p data-sourcepos="1:1-1:24" dir="auto">[foo </p>
wysiwyg: |-
- <p>[foo </p>
+ <p dir="auto">[foo </p>
06_07_00__inlines__links__041:
canonical: |
<p>[foo<code>](/uri)</code></p>
static: |-
<p data-sourcepos="1:1-1:13" dir="auto">[foo<code>](/uri)</code></p>
wysiwyg: |-
- <p>[foo<code>](/uri)</code></p>
+ <p dir="auto">[foo<code>](/uri)</code></p>
06_07_00__inlines__links__042:
canonical: |
<p>[foo<a href="http://example.com/?search=%5D(uri)">http://example.com/?search=](uri)</a></p>
static: |-
<p data-sourcepos="1:1-1:39" dir="auto">[foo<a href="http://example.com/?search=%5D(uri)" rel="nofollow noreferrer noopener" target="_blank">http://example.com/?search=](uri)</a></p>
wysiwyg: |-
- <p>[foo<a target="_blank" rel="noopener noreferrer nofollow" href="http://example.com/?search=%5D(uri)">http://example.com/?search=](uri)</a></p>
+ <p dir="auto">[foo<a target="_blank" rel="noopener noreferrer nofollow" href="http://example.com/?search=%5D(uri)">http://example.com/?search=](uri)</a></p>
06_07_00__inlines__links__043:
canonical: |
<p><a href="/url" title="title">foo</a></p>
static: |-
<p data-sourcepos="1:1-1:10" dir="auto"><a href="/url" title="title">foo</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">foo</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">foo</a></p>
<pre>[bar]: /url "title"</pre>
06_07_00__inlines__links__044:
canonical: |
@@ -6498,7 +6493,7 @@
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>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">link [foo [bar]]</a></p>
<pre>[ref]: /uri</pre>
06_07_00__inlines__links__045:
canonical: |
@@ -6506,7 +6501,7 @@
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>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">link [bar</a></p>
<pre>[ref]: /uri</pre>
06_07_00__inlines__links__046:
canonical: |
@@ -6514,7 +6509,7 @@
static: |-
<p data-sourcepos="1:1-1:29" dir="auto"><a href="/uri">link <em>foo <strong>bar</strong> <code>#</code></em></a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">link <em>foo </em><strong><em>bar<code>#</code></em></strong></a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">link <em>foo </em><strong><em>bar<code>#</code></em></strong></a></p>
<pre>[ref]: /uri</pre>
06_07_00__inlines__links__047:
canonical: |
@@ -6522,7 +6517,7 @@
static: |-
<p data-sourcepos="1:1-1:24" dir="auto"><a href="/uri"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="moon" decoding="async" class="lazy" data-src="moon.jpg"></a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri"><img src="moon.jpg" alt="moon"></a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/uri"><img src="moon.jpg" alt="moon"></a></p>
<pre>[ref]: /uri</pre>
06_07_00__inlines__links__048:
canonical: |
@@ -6530,7 +6525,7 @@
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>
+ <p dir="auto">[foo <a target="_blank" rel="noopener noreferrer nofollow" href="/uri">bar</a>]<a target="_blank" rel="noopener noreferrer nofollow" href="/uri">ref</a></p>
<pre>[ref]: /uri</pre>
06_07_00__inlines__links__049:
canonical: |
@@ -6538,7 +6533,7 @@
static: |-
<p data-sourcepos="1:1-1:27" dir="auto">[foo <em>bar <a href="/uri">baz</a></em>]<a href="/uri">ref</a></p>
wysiwyg: |-
- <p>[foo <em>bar </em><a target="_blank" rel="noopener noreferrer nofollow" href="/uri"><em>baz</em></a>]<a target="_blank" rel="noopener noreferrer nofollow" href="/uri">ref</a></p>
+ <p dir="auto">[foo <em>bar </em><a target="_blank" rel="noopener noreferrer nofollow" href="/uri"><em>baz</em></a>]<a target="_blank" rel="noopener noreferrer nofollow" href="/uri">ref</a></p>
<pre>[ref]: /uri</pre>
06_07_00__inlines__links__050:
canonical: |
@@ -6546,7 +6541,7 @@
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>
+ <p dir="auto">*<a target="_blank" rel="noopener noreferrer nofollow" href="/uri">foo*</a></p>
<pre>[ref]: /uri</pre>
06_07_00__inlines__links__051:
canonical: |
@@ -6554,7 +6549,7 @@
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>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">foo *bar</a></p>
<pre>[ref]: /uri</pre>
06_07_00__inlines__links__052:
canonical: |
@@ -6562,7 +6557,7 @@
static: |-
<p data-sourcepos="1:1-1:24" dir="auto">[foo </p>
wysiwyg: |-
- <p>[foo </p>
+ <p dir="auto">[foo </p>
<pre>[ref]: /uri</pre>
06_07_00__inlines__links__053:
canonical: |
@@ -6570,7 +6565,7 @@
static: |-
<p data-sourcepos="1:1-1:12" dir="auto">[foo<code>][ref]</code></p>
wysiwyg: |-
- <p>[foo<code>][ref]</code></p>
+ <p dir="auto">[foo<code>][ref]</code></p>
<pre>[ref]: /uri</pre>
06_07_00__inlines__links__054:
canonical: |
@@ -6578,7 +6573,7 @@
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>
+ <p dir="auto">[foo<a target="_blank" rel="noopener noreferrer nofollow" href="http://example.com/?search=%5D%5Bref%5D">http://example.com/?search=][ref]</a></p>
<pre>[ref]: /uri</pre>
06_07_00__inlines__links__055:
canonical: |
@@ -6586,7 +6581,7 @@
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>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">foo</a></p>
<pre>[bar]: /url "title"</pre>
06_07_00__inlines__links__056:
canonical: |
@@ -6594,7 +6589,7 @@
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>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/url">Толпой</a> is a Russian word.</p>
<pre>[толпой]: /url</pre>
06_07_00__inlines__links__057:
canonical: |
@@ -6603,14 +6598,14 @@
<p data-sourcepos="4:1-4:14" dir="auto"><a href="/url">Baz</a></p>
wysiwyg: |-
<pre>[foo bar]: /url</pre>
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url">Baz</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/url">Baz</a></p>
06_07_00__inlines__links__058:
canonical: |
<p>[foo] <a href="/url" title="title">bar</a></p>
static: |-
<p data-sourcepos="1:1-1:11" dir="auto">[foo] <a href="/url" title="title">bar</a></p>
wysiwyg: |-
- <p>[foo] <a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">bar</a></p>
+ <p dir="auto">[foo] <a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">bar</a></p>
<pre>[bar]: /url "title"</pre>
06_07_00__inlines__links__059:
canonical: |
@@ -6620,7 +6615,7 @@
<p data-sourcepos="1:1-2:5" dir="auto">[foo]
<a href="/url" title="title">bar</a></p>
wysiwyg: |-
- <p>[foo]
+ <p dir="auto">[foo]
<a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">bar</a></p>
<pre>[bar]: /url "title"</pre>
06_07_00__inlines__links__060:
@@ -6631,14 +6626,14 @@
wysiwyg: |-
<pre>[foo]: /url1</pre>
<pre>[foo]: /url2</pre>
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url1">bar</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/url1">bar</a></p>
06_07_00__inlines__links__061:
canonical: |
<p>[bar][foo!]</p>
static: |-
<p data-sourcepos="1:1-1:33" dir="auto">[bar][foo<span data-escaped-char>!</span>]</p>
wysiwyg: |-
- <p>[bar][foo!]</p>
+ <p dir="auto">[bar][foo!]</p>
<pre>[foo!]: /url</pre>
06_07_00__inlines__links__062:
canonical: |
@@ -6648,8 +6643,8 @@
<p data-sourcepos="1:1-1:11" dir="auto">[foo][ref[]</p>
<p data-sourcepos="3:1-3:12" dir="auto">[ref[]: /uri</p>
wysiwyg: |-
- <p>[foo][ref[]</p>
- <p>[ref[]: /uri</p>
+ <p dir="auto">[foo][ref[]</p>
+ <p dir="auto">[ref[]: /uri</p>
06_07_00__inlines__links__063:
canonical: |
<p>[foo][ref[bar]]</p>
@@ -6658,8 +6653,8 @@
<p data-sourcepos="1:1-1:15" dir="auto">[foo][ref[bar]]</p>
<p data-sourcepos="3:1-3:16" dir="auto">[ref[bar]]: /uri</p>
wysiwyg: |-
- <p>[foo][ref[bar]]</p>
- <p>[ref[bar]]: /uri</p>
+ <p dir="auto">[foo][ref[bar]]</p>
+ <p dir="auto">[ref[bar]]: /uri</p>
06_07_00__inlines__links__064:
canonical: |
<p>[[[foo]]]</p>
@@ -6668,15 +6663,15 @@
<p data-sourcepos="1:1-1:9" dir="auto">[[[foo]]]</p>
<p data-sourcepos="3:1-3:15" dir="auto">[[[foo]]]: /url</p>
wysiwyg: |-
- <p>[[[foo]]]</p>
- <p>[[[foo]]]: /url</p>
+ <p dir="auto">[[[foo]]]</p>
+ <p dir="auto">[[[foo]]]: /url</p>
06_07_00__inlines__links__065:
canonical: |
<p><a href="/uri">foo</a></p>
static: |-
<p data-sourcepos="1:1-1:12" dir="auto"><a href="/uri">foo</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">foo</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">foo</a></p>
<pre>[ref\[]: /uri</pre>
06_07_00__inlines__links__066:
canonical: |
@@ -6685,7 +6680,7 @@
<p data-sourcepos="3:1-3:7" dir="auto"><a href="/uri">bar\</a></p>
wysiwyg: |-
<pre>[bar\\]: /uri</pre>
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">bar\</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/uri">bar\</a></p>
06_07_00__inlines__links__067:
canonical: |
<p>[]</p>
@@ -6694,8 +6689,8 @@
<p data-sourcepos="1:1-1:2" dir="auto">[]</p>
<p data-sourcepos="3:1-3:8" dir="auto">[]: /uri</p>
wysiwyg: |-
- <p>[]</p>
- <p>[]: /uri</p>
+ <p dir="auto">[]</p>
+ <p dir="auto">[]: /uri</p>
06_07_00__inlines__links__068:
canonical: |
<p>[
@@ -6708,9 +6703,9 @@
<p data-sourcepos="4:1-5:8" dir="auto">[
]: /uri</p>
wysiwyg: |-
- <p>[
+ <p dir="auto">[
]</p>
- <p>[
+ <p dir="auto">[
]: /uri</p>
06_07_00__inlines__links__069:
canonical: |
@@ -6718,7 +6713,7 @@
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>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">foo</a></p>
<pre>[foo]: /url "title"</pre>
06_07_00__inlines__links__070:
canonical: |
@@ -6726,7 +6721,7 @@
static: |-
<p data-sourcepos="1:1-1:13" dir="auto"><a href="/url" title="title"><em>foo</em> bar</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title"><em>foo</em> bar</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title"><em>foo</em> bar</a></p>
<pre>[*foo* bar]: /url "title"</pre>
06_07_00__inlines__links__071:
canonical: |
@@ -6734,7 +6729,7 @@
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>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">Foo</a></p>
<pre>[foo]: /url "title"</pre>
06_07_00__inlines__links__072:
canonical: |
@@ -6744,7 +6739,7 @@
<p data-sourcepos="1:1-2:2" dir="auto"><a href="/url" title="title">foo</a>
[]</p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">foo</a>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">foo</a>
[]</p>
<pre>[foo]: /url "title"</pre>
06_07_00__inlines__links__073:
@@ -6753,7 +6748,7 @@
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>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">foo</a></p>
<pre>[foo]: /url "title"</pre>
06_07_00__inlines__links__074:
canonical: |
@@ -6761,7 +6756,7 @@
static: |-
<p data-sourcepos="1:1-1:11" dir="auto"><a href="/url" title="title"><em>foo</em> bar</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title"><em>foo</em> bar</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title"><em>foo</em> bar</a></p>
<pre>[*foo* bar]: /url "title"</pre>
06_07_00__inlines__links__075:
canonical: |
@@ -6769,7 +6764,7 @@
static: |-
<p data-sourcepos="1:1-1:13" dir="auto">[<a href="/url" title="title"><em>foo</em> bar</a>]</p>
wysiwyg: |-
- <p>[<a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title"><em>foo</em> bar</a>]</p>
+ <p dir="auto">[<a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title"><em>foo</em> bar</a>]</p>
<pre>[*foo* bar]: /url "title"</pre>
06_07_00__inlines__links__076:
canonical: |
@@ -6777,7 +6772,7 @@
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>
+ <p dir="auto">[[bar <a target="_blank" rel="noopener noreferrer nofollow" href="/url">foo</a></p>
<pre>[foo]: /url</pre>
06_07_00__inlines__links__077:
canonical: |
@@ -6785,7 +6780,7 @@
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>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">Foo</a></p>
<pre>[foo]: /url "title"</pre>
06_07_00__inlines__links__078:
canonical: |
@@ -6793,7 +6788,7 @@
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>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/url">foo</a> bar</p>
<pre>[foo]: /url</pre>
06_07_00__inlines__links__079:
canonical: |
@@ -6801,7 +6796,7 @@
static: |-
<p data-sourcepos="1:1-1:6" dir="auto">[foo]</p>
wysiwyg: |-
- <p>[foo]</p>
+ <p dir="auto">[foo]</p>
<pre>[foo]: /url "title"</pre>
06_07_00__inlines__links__080:
canonical: |
@@ -6810,14 +6805,14 @@
<p data-sourcepos="3:1-3:7" dir="auto">*<a href="/url">foo*</a></p>
wysiwyg: |-
<pre>[foo*]: /url</pre>
- <p>*<a target="_blank" rel="noopener noreferrer nofollow" href="/url">foo*</a></p>
+ <p dir="auto">*<a target="_blank" rel="noopener noreferrer nofollow" href="/url">foo*</a></p>
06_07_00__inlines__links__081:
canonical: |
<p><a href="/url2">foo</a></p>
static: |-
<p data-sourcepos="1:1-1:10" dir="auto"><a href="/url2">foo</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url2">foo</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/url2">foo</a></p>
<pre>[foo]: /url1</pre>
<pre>[bar]: /url2</pre>
06_07_00__inlines__links__082:
@@ -6826,7 +6821,7 @@
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>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/url1">foo</a></p>
<pre>[foo]: /url1</pre>
06_07_00__inlines__links__083:
canonical: |
@@ -6834,7 +6829,7 @@
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>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="">foo</a></p>
<pre>[foo]: /url1</pre>
06_07_00__inlines__links__084:
canonical: |
@@ -6842,7 +6837,7 @@
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>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/url1">foo</a>(not a link)</p>
<pre>[foo]: /url1</pre>
06_07_00__inlines__links__085:
canonical: |
@@ -6850,7 +6845,7 @@
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>
+ <p dir="auto">[foo]<a target="_blank" rel="noopener noreferrer nofollow" href="/url">bar</a></p>
<pre>[baz]: /url</pre>
06_07_00__inlines__links__086:
canonical: |
@@ -6858,7 +6853,7 @@
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>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/url2">foo</a><a target="_blank" rel="noopener noreferrer nofollow" href="/url1">baz</a></p>
<pre>[baz]: /url1</pre>
<pre>[bar]: /url2</pre>
06_07_00__inlines__links__087:
@@ -6867,7 +6862,7 @@
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>
+ <p dir="auto">[foo]<a target="_blank" rel="noopener noreferrer nofollow" href="/url1">bar</a></p>
<pre>[baz]: /url1</pre>
<pre>[foo]: /url2</pre>
06_08_00__inlines__images__001:
@@ -6876,14 +6871,14 @@
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>
+ <p dir="auto"><img src="/url" alt="foo" title="title"></p>
06_08_00__inlines__images__002:
canonical: |
<p><img src="train.jpg" alt="foo bar" title="train &amp; tracks" /></p>
static: |-
<p data-sourcepos="1:1-1:12" dir="auto"><a class="no-attachment-icon" href="train.jpg" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo bar" title="train &amp; tracks" decoding="async" class="lazy" data-src="train.jpg"></a></p>
wysiwyg: |-
- <p><img src="train.jpg" alt="foo bar" title="train &amp; tracks"></p>
+ <p dir="auto"><img src="train.jpg" alt="foo bar" title="train &amp; tracks"></p>
<pre>[foo *bar*]: train.jpg "train &amp; tracks"</pre>
06_08_00__inlines__images__003:
canonical: |
@@ -6891,21 +6886,21 @@
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>
+ <p dir="auto"><img src="/url2" alt="foo bar"></p>
06_08_00__inlines__images__004:
canonical: |
<p><img src="/url2" alt="foo bar" /></p>
static: |-
<p data-sourcepos="1:1-1:25" dir="auto"><a class="no-attachment-icon" href="/url2" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo bar" decoding="async" class="lazy" data-src="/url2"></a></p>
wysiwyg: |-
- <p><img src="/url2" alt="foo bar"></p>
+ <p dir="auto"><img src="/url2" alt="foo bar"></p>
06_08_00__inlines__images__005:
canonical: |
<p><img src="train.jpg" alt="foo bar" title="train &amp; tracks" /></p>
static: |-
<p data-sourcepos="1:1-1:14" dir="auto"><a class="no-attachment-icon" href="train.jpg" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo bar" title="train &amp; tracks" decoding="async" class="lazy" data-src="train.jpg"></a></p>
wysiwyg: |-
- <p><img src="train.jpg" alt="foo bar" title="train &amp; tracks"></p>
+ <p dir="auto"><img src="train.jpg" alt="foo bar" title="train &amp; tracks"></p>
<pre>[foo *bar*]: train.jpg "train &amp; tracks"</pre>
06_08_00__inlines__images__006:
canonical: |
@@ -6913,7 +6908,7 @@
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>
+ <p dir="auto"><img src="train.jpg" alt="foo bar" title="train &amp; tracks"></p>
<pre>[foobar]: train.jpg "train &amp; tracks"</pre>
06_08_00__inlines__images__007:
canonical: |
@@ -6921,35 +6916,35 @@
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>
+ <p dir="auto"><img src="train.jpg" alt="foo"></p>
06_08_00__inlines__images__008:
canonical: |
<p>My <img src="/path/to/train.jpg" alt="foo bar" title="title" /></p>
static: |-
<p data-sourcepos="1:1-1:45" dir="auto">My <a class="no-attachment-icon" href="/path/to/train.jpg" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo bar" title="title" decoding="async" class="lazy" data-src="/path/to/train.jpg"></a></p>
wysiwyg: |-
- <p>My <img src="/path/to/train.jpg" alt="foo bar" title="title"></p>
+ <p dir="auto">My <img src="/path/to/train.jpg" alt="foo bar" title="title"></p>
06_08_00__inlines__images__009:
canonical: |
<p><img src="url" alt="foo" /></p>
static: |-
<p data-sourcepos="1:1-1:13" dir="auto"><a class="no-attachment-icon" href="url" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo" decoding="async" class="lazy" data-src="url"></a></p>
wysiwyg: |-
- <p><img src="url" alt="foo"></p>
+ <p dir="auto"><img src="url" alt="foo"></p>
06_08_00__inlines__images__010:
canonical: |
<p><img src="/url" alt="" /></p>
static: |-
<p data-sourcepos="1:1-1:9" dir="auto"><a class="no-attachment-icon" href="/url" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="" decoding="async" class="lazy" data-src="/url"></a></p>
wysiwyg: |-
- <p><img src="/url" alt=""></p>
+ <p dir="auto"><img src="/url" alt=""></p>
06_08_00__inlines__images__011:
canonical: |
<p><img src="/url" alt="foo" /></p>
static: |-
<p data-sourcepos="1:1-1:11" dir="auto"><a class="no-attachment-icon" href="/url" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo" decoding="async" class="lazy" data-src="/url"></a></p>
wysiwyg: |-
- <p><img src="/url" alt="foo"></p>
+ <p dir="auto"><img src="/url" alt="foo"></p>
<pre>[bar]: /url</pre>
06_08_00__inlines__images__012:
canonical: |
@@ -6957,7 +6952,7 @@
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>
+ <p dir="auto"><img src="/url" alt="foo"></p>
<pre>[bar]: /url</pre>
06_08_00__inlines__images__013:
canonical: |
@@ -6965,7 +6960,7 @@
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>
+ <p dir="auto"><img src="/url" alt="foo" title="title"></p>
<pre>[foo]: /url "title"</pre>
06_08_00__inlines__images__014:
canonical: |
@@ -6973,7 +6968,7 @@
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>
+ <p dir="auto"><img src="/url" alt="foo bar" title="title"></p>
<pre>[*foo* bar]: /url "title"</pre>
06_08_00__inlines__images__015:
canonical: |
@@ -6981,7 +6976,7 @@
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>
+ <p dir="auto"><img src="/url" alt="Foo" title="title"></p>
<pre>[foo]: /url "title"</pre>
06_08_00__inlines__images__016:
canonical: |
@@ -6991,7 +6986,7 @@
<p data-sourcepos="1:1-2:2" dir="auto"><a class="no-attachment-icon" href="/url" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="foo" title="title" decoding="async" class="lazy" data-src="/url"></a>
[]</p>
wysiwyg: |-
- <p><img src="/url" alt="foo" title="title">
+ <p dir="auto"><img src="/url" alt="foo" title="title">
[]</p>
<pre>[foo]: /url "title"</pre>
06_08_00__inlines__images__017:
@@ -7000,7 +6995,7 @@
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>
+ <p dir="auto"><img src="/url" alt="foo" title="title"></p>
<pre>[foo]: /url "title"</pre>
06_08_00__inlines__images__018:
canonical: |
@@ -7008,7 +7003,7 @@
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>
+ <p dir="auto"><img src="/url" alt="foo bar" title="title"></p>
<pre>[*foo* bar]: /url "title"</pre>
06_08_00__inlines__images__019:
canonical: |
@@ -7018,15 +7013,15 @@
<p data-sourcepos="1:1-1:8" dir="auto">![[foo]]</p>
<p data-sourcepos="3:1-3:21" dir="auto">[[foo]]: /url "title"</p>
wysiwyg: |-
- <p>![[foo]]</p>
- <p>[[foo]]: /url "title"</p>
+ <p dir="auto">![[foo]]</p>
+ <p dir="auto">[[foo]]: /url "title"</p>
06_08_00__inlines__images__020:
canonical: |
<p><img src="/url" alt="Foo" title="title" /></p>
static: |-
<p data-sourcepos="1:1-1:6" dir="auto"><a class="no-attachment-icon" href="/url" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Foo" title="title" decoding="async" class="lazy" data-src="/url"></a></p>
wysiwyg: |-
- <p><img src="/url" alt="Foo" title="title"></p>
+ <p dir="auto"><img src="/url" alt="Foo" title="title"></p>
<pre>[foo]: /url "title"</pre>
06_08_00__inlines__images__021:
canonical: |
@@ -7034,7 +7029,7 @@
static: |-
<p data-sourcepos="1:1-1:7" dir="auto">![foo]</p>
wysiwyg: |-
- <p>![foo]</p>
+ <p dir="auto">![foo]</p>
<pre>[foo]: /url "title"</pre>
06_08_00__inlines__images__022:
canonical: |
@@ -7042,7 +7037,7 @@
static: |-
<p data-sourcepos="1:1-1:28" dir="auto"><span data-escaped-char>!</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>
+ <p dir="auto">!<a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">foo</a></p>
<pre>[foo]: /url "title"</pre>
06_09_00__inlines__autolinks__001:
canonical: |
@@ -7050,147 +7045,147 @@
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>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="http://foo.bar.baz">http://foo.bar.baz</a></p>
06_09_00__inlines__autolinks__002:
canonical: |
<p><a href="http://foo.bar.baz/test?q=hello&amp;id=22&amp;boolean">http://foo.bar.baz/test?q=hello&amp;id=22&amp;boolean</a></p>
static: |-
<p data-sourcepos="1:1-1:47" dir="auto"><a href="http://foo.bar.baz/test?q=hello&amp;id=22&amp;boolean" rel="nofollow noreferrer noopener" target="_blank">http://foo.bar.baz/test?q=hello&amp;id=22&amp;boolean</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://foo.bar.baz/test?q=hello&amp;id=22&amp;boolean">http://foo.bar.baz/test?q=hello&amp;id=22&amp;boolean</a></p>
+ <p dir="auto"><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_00__inlines__autolinks__003:
canonical: |
<p><a href="irc://foo.bar:2233/baz">irc://foo.bar:2233/baz</a></p>
static: |-
<p data-sourcepos="1:1-1:24" dir="auto"><a href="irc://foo.bar:2233/baz">irc://foo.bar:2233/baz</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow">irc://foo.bar:2233/baz</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow">irc://foo.bar:2233/baz</a></p>
06_09_00__inlines__autolinks__004:
canonical: |
<p><a href="MAILTO:FOO@BAR.BAZ">MAILTO:FOO@BAR.BAZ</a></p>
static: |-
<p data-sourcepos="1:1-1:20" dir="auto"><a href="mailto:FOO@BAR.BAZ">MAILTO:FOO@BAR.BAZ</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="MAILTO:FOO@BAR.BAZ">MAILTO:FOO@BAR.BAZ</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="MAILTO:FOO@BAR.BAZ">MAILTO:FOO@BAR.BAZ</a></p>
06_09_00__inlines__autolinks__005:
canonical: |
<p><a href="a+b+c:d">a+b+c:d</a></p>
static: |-
<p data-sourcepos="1:1-1:9" dir="auto"><a href="a+b+c:d">a+b+c:d</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow">a+b+c:d</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow">a+b+c:d</a></p>
06_09_00__inlines__autolinks__006:
canonical: |
<p><a href="made-up-scheme://foo,bar">made-up-scheme://foo,bar</a></p>
static: |-
<p data-sourcepos="1:1-1:26" dir="auto"><a href="made-up-scheme://foo,bar">made-up-scheme://foo,bar</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow">made-up-scheme://foo,bar</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow">made-up-scheme://foo,bar</a></p>
06_09_00__inlines__autolinks__007:
canonical: |
<p><a href="http://../">http://../</a></p>
static: |-
<p data-sourcepos="1:1-1:12" dir="auto"><a href="http://../" rel="nofollow noreferrer noopener" target="_blank">http://../</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://../">http://../</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="http://../">http://../</a></p>
06_09_00__inlines__autolinks__008:
canonical: |
<p><a href="localhost:5001/foo">localhost:5001/foo</a></p>
static: |-
<p data-sourcepos="1:1-1:20" dir="auto"><a href="localhost:5001/foo">localhost:5001/foo</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow">localhost:5001/foo</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow">localhost:5001/foo</a></p>
06_09_00__inlines__autolinks__009:
canonical: |
<p>&lt;http://foo.bar/baz bim&gt;</p>
static: |-
<p data-sourcepos="1:1-1:24" dir="auto">&lt;<a href="http://foo.bar/baz" rel="nofollow noreferrer noopener" target="_blank">http://foo.bar/baz</a> bim&gt;</p>
wysiwyg: |-
- <p>&lt;<a target="_blank" rel="noopener noreferrer nofollow" href="http://foo.bar/baz">http://foo.bar/baz</a> bim&gt;</p>
+ <p dir="auto">&lt;<a target="_blank" rel="noopener noreferrer nofollow" href="http://foo.bar/baz">http://foo.bar/baz</a> bim&gt;</p>
06_09_00__inlines__autolinks__010:
canonical: |
<p><a href="http://example.com/%5C%5B%5C">http://example.com/\[\</a></p>
static: |-
<p data-sourcepos="1:1-1:24" dir="auto"><a href="http://example.com/%5C%5B%5C" rel="nofollow noreferrer noopener" target="_blank">http://example.com/\[\</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://example.com/%5C%5B%5C">http://example.com/\[\</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="http://example.com/%5C%5B%5C">http://example.com/\[\</a></p>
06_09_00__inlines__autolinks__011:
canonical: |
<p><a href="mailto:foo@bar.example.com">foo@bar.example.com</a></p>
static: |-
<p data-sourcepos="1:1-1:21" dir="auto"><a href="mailto:foo@bar.example.com">foo@bar.example.com</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="mailto:foo@bar.example.com">foo@bar.example.com</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="mailto:foo@bar.example.com">foo@bar.example.com</a></p>
06_09_00__inlines__autolinks__012:
canonical: |
<p><a href="mailto:foo+special@Bar.baz-bar0.com">foo+special@Bar.baz-bar0.com</a></p>
static: |-
<p data-sourcepos="1:1-1:30" dir="auto"><a href="mailto:foo+special@Bar.baz-bar0.com">foo+special@Bar.baz-bar0.com</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="mailto:foo+special@Bar.baz-bar0.com">foo+special@Bar.baz-bar0.com</a></p>
+ <p dir="auto"><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_00__inlines__autolinks__013:
canonical: |
<p>&lt;foo+@bar.example.com&gt;</p>
static: |-
<p data-sourcepos="1:1-1:23" dir="auto">&lt;<a href="mailto:foo+@bar.example.com">foo+@bar.example.com</a>&gt;</p>
wysiwyg: |-
- <p>&lt;<a target="_blank" rel="noopener noreferrer nofollow" href="mailto:foo+@bar.example.com">foo+@bar.example.com</a>&gt;</p>
+ <p dir="auto">&lt;<a target="_blank" rel="noopener noreferrer nofollow" href="mailto:foo+@bar.example.com">foo+@bar.example.com</a>&gt;</p>
06_09_00__inlines__autolinks__014:
canonical: |
<p>&lt;&gt;</p>
static: |-
<p data-sourcepos="1:1-1:2" dir="auto">&lt;&gt;</p>
wysiwyg: |-
- <p>&lt;&gt;</p>
+ <p dir="auto">&lt;&gt;</p>
06_09_00__inlines__autolinks__015:
canonical: |
<p>&lt; http://foo.bar &gt;</p>
static: |-
<p data-sourcepos="1:1-1:18" dir="auto">&lt; <a href="http://foo.bar" rel="nofollow noreferrer noopener" target="_blank">http://foo.bar</a> &gt;</p>
wysiwyg: |-
- <p>&lt; <a target="_blank" rel="noopener noreferrer nofollow" href="http://foo.bar">http://foo.bar</a> &gt;</p>
+ <p dir="auto">&lt; <a target="_blank" rel="noopener noreferrer nofollow" href="http://foo.bar">http://foo.bar</a> &gt;</p>
06_09_00__inlines__autolinks__016:
canonical: |
<p>&lt;m:abc&gt;</p>
static: |-
<p data-sourcepos="1:1-1:7" dir="auto">&lt;m:abc&gt;</p>
wysiwyg: |-
- <p>&lt;m:abc&gt;</p>
+ <p dir="auto">&lt;m:abc&gt;</p>
06_09_00__inlines__autolinks__017:
canonical: |
<p>&lt;foo.bar.baz&gt;</p>
static: |-
<p data-sourcepos="1:1-1:13" dir="auto">&lt;foo.bar.baz&gt;</p>
wysiwyg: |-
- <p>&lt;foo.bar.baz&gt;</p>
+ <p dir="auto">&lt;foo.bar.baz&gt;</p>
06_09_00__inlines__autolinks__018:
canonical: |
<p>http://example.com</p>
static: |-
<p data-sourcepos="1:1-1:18" dir="auto"><a href="http://example.com" rel="nofollow noreferrer noopener" target="_blank">http://example.com</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://example.com">http://example.com</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="http://example.com">http://example.com</a></p>
06_09_00__inlines__autolinks__019:
canonical: |
<p>foo@bar.example.com</p>
static: |-
<p data-sourcepos="1:1-1:19" dir="auto"><a href="mailto:foo@bar.example.com">foo@bar.example.com</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="mailto:foo@bar.example.com">foo@bar.example.com</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="mailto:foo@bar.example.com">foo@bar.example.com</a></p>
06_10_00__inlines__autolinks_extension__001:
canonical: |
<p><a href="http://www.commonmark.org">www.commonmark.org</a></p>
static: |-
<p data-sourcepos="1:1-1:18" dir="auto"><a href="http://www.commonmark.org" rel="nofollow noreferrer noopener" target="_blank">www.commonmark.org</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://www.commonmark.org">www.commonmark.org</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="http://www.commonmark.org">www.commonmark.org</a></p>
06_10_00__inlines__autolinks_extension__002:
canonical: |
<p>Visit <a href="http://www.commonmark.org/help">www.commonmark.org/help</a> for more information.</p>
static: |-
<p data-sourcepos="1:1-1:51" dir="auto">Visit <a href="http://www.commonmark.org/help" rel="nofollow noreferrer noopener" target="_blank">www.commonmark.org/help</a> for more information.</p>
wysiwyg: |-
- <p>Visit <a target="_blank" rel="noopener noreferrer nofollow" href="http://www.commonmark.org/help">www.commonmark.org/help</a> for more information.</p>
+ <p dir="auto">Visit <a target="_blank" rel="noopener noreferrer nofollow" href="http://www.commonmark.org/help">www.commonmark.org/help</a> for more information.</p>
06_10_00__inlines__autolinks_extension__003:
canonical: |
<p>Visit <a href="http://www.commonmark.org">www.commonmark.org</a>.</p>
@@ -7199,8 +7194,8 @@
<p data-sourcepos="1:1-1:25" dir="auto">Visit <a href="http://www.commonmark.org" rel="nofollow noreferrer noopener" target="_blank">www.commonmark.org</a>.</p>
<p data-sourcepos="3:1-3:29" dir="auto">Visit <a href="http://www.commonmark.org/a.b" rel="nofollow noreferrer noopener" target="_blank">www.commonmark.org/a.b</a>.</p>
wysiwyg: |-
- <p>Visit <a target="_blank" rel="noopener noreferrer nofollow" href="http://www.commonmark.org">www.commonmark.org</a>.</p>
- <p>Visit <a target="_blank" rel="noopener noreferrer nofollow" href="http://www.commonmark.org/a.b">www.commonmark.org/a.b</a>.</p>
+ <p dir="auto">Visit <a target="_blank" rel="noopener noreferrer nofollow" href="http://www.commonmark.org">www.commonmark.org</a>.</p>
+ <p dir="auto">Visit <a target="_blank" rel="noopener noreferrer nofollow" href="http://www.commonmark.org/a.b">www.commonmark.org/a.b</a>.</p>
06_10_00__inlines__autolinks_extension__004:
canonical: |
<p><a href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a></p>
@@ -7213,17 +7208,17 @@
<p data-sourcepos="5:1-5:43" dir="auto">(<a href="http://www.google.com/search?q=Markup+(business)" rel="nofollow noreferrer noopener" target="_blank">www.google.com/search?q=Markup+(business)</a>)</p>
<p data-sourcepos="7:1-7:42" dir="auto">(<a href="http://www.google.com/search?q=Markup+(business)" rel="nofollow noreferrer noopener" target="_blank">www.google.com/search?q=Markup+(business)</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a></p>
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a>))</p>
- <p>(<a target="_blank" rel="noopener noreferrer nofollow" href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a>)</p>
- <p>(<a target="_blank" rel="noopener noreferrer nofollow" href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a>))</p>
+ <p dir="auto">(<a target="_blank" rel="noopener noreferrer nofollow" href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a>)</p>
+ <p dir="auto">(<a target="_blank" rel="noopener noreferrer nofollow" href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a></p>
06_10_00__inlines__autolinks_extension__005:
canonical: |
<p><a href="http://www.google.com/search?q=(business))+ok">www.google.com/search?q=(business))+ok</a></p>
static: |-
<p data-sourcepos="1:1-1:38" dir="auto"><a href="http://www.google.com/search?q=(business))+ok" rel="nofollow noreferrer noopener" target="_blank">www.google.com/search?q=(business))+ok</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://www.google.com/search?q=(business))+ok">www.google.com/search?q=(business))+ok</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="http://www.google.com/search?q=(business))+ok">www.google.com/search?q=(business))+ok</a></p>
06_10_00__inlines__autolinks_extension__006:
canonical: |
<p><a href="http://www.google.com/search?q=commonmark&amp;hl=en">www.google.com/search?q=commonmark&amp;hl=en</a></p>
@@ -7232,15 +7227,15 @@
<p data-sourcepos="1:1-1:40" dir="auto"><a href="http://www.google.com/search?q=commonmark&amp;hl=en" rel="nofollow noreferrer noopener" target="_blank">www.google.com/search?q=commonmark&amp;hl=en</a></p>
<p data-sourcepos="3:1-3:38" dir="auto"><a href="http://www.google.com/search?q=commonmark" rel="nofollow noreferrer noopener" target="_blank">www.google.com/search?q=commonmark</a>&amp;hl;</p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://www.google.com/search?q=commonmark&amp;hl=en">www.google.com/search?q=commonmark&amp;hl=en</a></p>
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://www.google.com/search?q=commonmark">www.google.com/search?q=commonmark</a>&amp;hl;</p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="http://www.google.com/search?q=commonmark&amp;hl=en">www.google.com/search?q=commonmark&amp;hl=en</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="http://www.google.com/search?q=commonmark">www.google.com/search?q=commonmark</a>&amp;hl;</p>
06_10_00__inlines__autolinks_extension__007:
canonical: |
<p><a href="http://www.commonmark.org/he">www.commonmark.org/he</a>&lt;lp</p>
static: |-
<p data-sourcepos="1:1-1:24" dir="auto"><a href="http://www.commonmark.org/he" rel="nofollow noreferrer noopener" target="_blank">www.commonmark.org/he</a>&lt;lp</p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://www.commonmark.org/he">www.commonmark.org/he</a>&lt;lp</p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="http://www.commonmark.org/he">www.commonmark.org/he</a>&lt;lp</p>
06_10_00__inlines__autolinks_extension__008:
canonical: |
<p><a href="http://commonmark.org">http://commonmark.org</a></p>
@@ -7251,23 +7246,23 @@
<p data-sourcepos="3:1-3:63" dir="auto">(Visit <a href="https://encrypted.google.com/search?q=Markup+(business)" rel="nofollow noreferrer noopener" target="_blank">https://encrypted.google.com/search?q=Markup+(business)</a>)</p>
<p data-sourcepos="5:1-5:48" dir="auto">Anonymous FTP is available at <a href="ftp://foo.bar.baz/">ftp://foo.bar.baz</a>.</p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://commonmark.org">http://commonmark.org</a></p>
- <p>(Visit <a target="_blank" rel="noopener noreferrer nofollow" href="https://encrypted.google.com/search?q=Markup+(business)">https://encrypted.google.com/search?q=Markup+(business)</a>)</p>
- <p>Anonymous FTP is available at ftp://foo.bar.baz.</p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="http://commonmark.org">http://commonmark.org</a></p>
+ <p dir="auto">(Visit <a target="_blank" rel="noopener noreferrer nofollow" href="https://encrypted.google.com/search?q=Markup+(business)">https://encrypted.google.com/search?q=Markup+(business)</a>)</p>
+ <p dir="auto">Anonymous FTP is available at ftp://foo.bar.baz.</p>
06_10_00__inlines__autolinks_extension__009:
canonical: |
<p><a href="mailto:foo@bar.baz">foo@bar.baz</a></p>
static: |-
<p data-sourcepos="1:1-1:11" dir="auto"><a href="mailto:foo@bar.baz">foo@bar.baz</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="mailto:foo@bar.baz">foo@bar.baz</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="mailto:foo@bar.baz">foo@bar.baz</a></p>
06_10_00__inlines__autolinks_extension__010:
canonical: |
<p>hello@mail+xyz.example isn't valid, but <a href="mailto:hello+xyz@mail.example">hello+xyz@mail.example</a> is.</p>
static: |-
<p data-sourcepos="1:1-1:66" dir="auto">hello@mail+xyz.example isn't valid, but <a href="mailto:hello+xyz@mail.example">hello+xyz@mail.example</a> is.</p>
wysiwyg: |-
- <p>hello@mail+xyz.example isn't valid, but <a target="_blank" rel="noopener noreferrer nofollow" href="mailto:hello+xyz@mail.example">hello+xyz@mail.example</a> is.</p>
+ <p dir="auto">hello@mail+xyz.example isn't valid, but <a target="_blank" rel="noopener noreferrer nofollow" href="mailto:hello+xyz@mail.example">hello+xyz@mail.example</a> is.</p>
06_10_00__inlines__autolinks_extension__011:
canonical: |
<p><a href="mailto:a.b-c_d@a.b">a.b-c_d@a.b</a></p>
@@ -7280,24 +7275,24 @@
<p data-sourcepos="5:1-5:12" dir="auto">a.b-c_d@a.b-</p>
<p data-sourcepos="7:1-7:12" dir="auto">a.b-c_d@a.b_</p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="mailto:a.b-c_d@a.b">a.b-c_d@a.b</a></p>
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="mailto:a.b-c_d@a.b">a.b-c_d@a.b</a>.</p>
- <p>a.b-c_d@a.b-</p>
- <p>a.b-c_d@a.b_</p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="mailto:a.b-c_d@a.b">a.b-c_d@a.b</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="mailto:a.b-c_d@a.b">a.b-c_d@a.b</a>.</p>
+ <p dir="auto">a.b-c_d@a.b-</p>
+ <p dir="auto">a.b-c_d@a.b_</p>
06_11_00__inlines__raw_html__001:
canonical: |
<p><a><bab><c2c></p>
static: |-
<p data-sourcepos="1:1-1:13" dir="auto"><a></a></p>
wysiwyg: |-
- <p></p>
+ <p dir="auto"></p>
06_11_00__inlines__raw_html__002:
canonical: |
<p><a/><b2/></p>
static: |-
<p data-sourcepos="1:1-1:9" dir="auto"><a></a></p>
wysiwyg: |-
- <p></p>
+ <p dir="auto"></p>
06_11_00__inlines__raw_html__003:
canonical: |
<p><a /><b2
@@ -7305,7 +7300,7 @@
static: |-
<p data-sourcepos="1:1-2:12" dir="auto"><a></a></p>
wysiwyg: |-
- <p></p>
+ <p dir="auto"></p>
06_11_00__inlines__raw_html__004:
canonical: |
<p><a foo="bar" bam = 'baz <em>"</em>'
@@ -7313,35 +7308,35 @@
static: |-
<p data-sourcepos="1:1-2:27" dir="auto"><a></a></p>
wysiwyg: |-
- <p></p>
+ <p dir="auto"></p>
06_11_00__inlines__raw_html__005:
canonical: |
<p>Foo <responsive-image src="foo.jpg" /></p>
static: |-
<p data-sourcepos="1:1-1:38" dir="auto">Foo </p>
wysiwyg: |-
- <p>Foo </p>
+ <p dir="auto">Foo </p>
06_11_00__inlines__raw_html__006:
canonical: |
<p>&lt;33&gt; &lt;__&gt;</p>
static: |-
<p data-sourcepos="1:1-1:9" dir="auto">&lt;33&gt; &lt;__&gt;</p>
wysiwyg: |-
- <p>&lt;33&gt; &lt;__&gt;</p>
+ <p dir="auto">&lt;33&gt; &lt;__&gt;</p>
06_11_00__inlines__raw_html__007:
canonical: |
<p>&lt;a h*#ref=&quot;hi&quot;&gt;</p>
static: |-
<p data-sourcepos="1:1-1:15" dir="auto">&lt;a h*#ref="hi"&gt;</p>
wysiwyg: |-
- <p>&lt;a h*#ref="hi"&gt;</p>
+ <p dir="auto">&lt;a h*#ref="hi"&gt;</p>
06_11_00__inlines__raw_html__008:
canonical: |
<p>&lt;a href=&quot;hi'&gt; &lt;a href=hi'&gt;</p>
static: |-
<p data-sourcepos="1:1-1:26" dir="auto">&lt;a href="hi'&gt; &lt;a href=hi'&gt;</p>
wysiwyg: |-
- <p>&lt;a href="hi'&gt; &lt;a href=hi'&gt;</p>
+ <p dir="auto">&lt;a href="hi'&gt; &lt;a href=hi'&gt;</p>
06_11_00__inlines__raw_html__009:
canonical: |
<p>&lt; a&gt;&lt;
@@ -7354,7 +7349,7 @@
&lt;foo bar=baz
bim!bop /&gt;</p>
wysiwyg: |-
- <p>&lt; a&gt;&lt;
+ <p dir="auto">&lt; a&gt;&lt;
foo&gt;&lt;bar/ &gt;
&lt;foo bar=baz
bim!bop /&gt;</p>
@@ -7364,89 +7359,88 @@
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>
+ <p dir="auto">&lt;a href='bar'title=title&gt;</p>
06_11_00__inlines__raw_html__011:
canonical: |
<p></a></foo ></p>
static: |-
<p data-sourcepos="1:1-1:11" dir="auto"></p>
wysiwyg: |-
- <p></p>
+ <p dir="auto"></p>
06_11_00__inlines__raw_html__012:
canonical: |
<p>&lt;/a href=&quot;foo&quot;&gt;</p>
static: |-
<p data-sourcepos="1:1-1:15" dir="auto">&lt;/a href="foo"&gt;</p>
wysiwyg: |-
- <p>&lt;/a href="foo"&gt;</p>
+ <p dir="auto">&lt;/a href="foo"&gt;</p>
06_11_00__inlines__raw_html__013:
canonical: |
<p>foo <!-- this is a
comment - with hyphen --></p>
static: |-
- <p data-sourcepos="1:1-2:25" dir="auto">foo <!-- this is a
- comment - with hyphen --></p>
+ <p data-sourcepos="1:1-2:25" dir="auto">foo </p>
wysiwyg: |-
- <p>foo </p>
+ <p dir="auto">foo </p>
06_11_00__inlines__raw_html__014:
canonical: |
<p>foo &lt;!-- not a comment -- two hyphens --&gt;</p>
static: |-
- <p data-sourcepos="1:1-1:41" dir="auto">foo <!-- not a comment -- two hyphens --></p>
+ <p data-sourcepos="1:1-1:41" dir="auto">foo </p>
wysiwyg: |-
- <p>foo &lt;!-- not a comment -- two hyphens --&gt;</p>
+ <p dir="auto">foo &lt;!-- not a comment -- two hyphens --&gt;</p>
06_11_00__inlines__raw_html__015:
canonical: |
<p>foo &lt;!--&gt; foo --&gt;</p>
<p>foo &lt;!-- foo---&gt;</p>
static: |-
- <p data-sourcepos="1:1-1:17" dir="auto">foo <!----> foo --&gt;</p>
+ <p data-sourcepos="1:1-1:17" dir="auto">foo foo --&gt;</p>
<p data-sourcepos="3:1-3:16" dir="auto">foo &lt;!-- foo---&gt;</p>
wysiwyg: |-
- <p>foo &lt;!--&gt; foo --&gt;</p>
- <p>foo &lt;!-- foo---&gt;</p>
+ <p dir="auto">foo &lt;!--&gt; foo --&gt;</p>
+ <p dir="auto">foo &lt;!-- foo---&gt;</p>
06_11_00__inlines__raw_html__016:
canonical: |
<p>foo <?php echo $a; ?></p>
static: |-
<p data-sourcepos="1:1-1:21" dir="auto">foo <?php echo $a; ?></p>
wysiwyg: |-
- <p>foo </p>
+ <p dir="auto">foo </p>
06_11_00__inlines__raw_html__017:
canonical: |
<p>foo <!ELEMENT br EMPTY></p>
static: |-
<p data-sourcepos="1:1-1:23" dir="auto">foo </p>
wysiwyg: |-
- <p>foo </p>
+ <p dir="auto">foo </p>
06_11_00__inlines__raw_html__018:
canonical: |
<p>foo <![CDATA[>&<]]></p>
static: |-
<p data-sourcepos="1:1-1:19" dir="auto">foo &amp;&lt;]]&gt;</p>
wysiwyg: |-
- <p>foo &amp;&lt;]]&gt;</p>
+ <p dir="auto">foo &amp;&lt;]]&gt;</p>
06_11_00__inlines__raw_html__019:
canonical: |
<p>foo <a href="&ouml;"></p>
static: |-
<p data-sourcepos="1:1-1:21" dir="auto">foo <a href="%C3%B6" rel="nofollow noreferrer noopener" target="_blank"></a></p>
wysiwyg: |-
- <p>foo </p>
+ <p dir="auto">foo </p>
06_11_00__inlines__raw_html__020:
canonical: |
<p>foo <a href="\*"></p>
static: |-
<p data-sourcepos="1:1-1:17" dir="auto">foo <a href="\*" rel="nofollow noreferrer noopener" target="_blank"></a></p>
wysiwyg: |-
- <p>foo </p>
+ <p dir="auto">foo </p>
06_11_00__inlines__raw_html__021:
canonical: |
<p>&lt;a href=&quot;&quot;&quot;&gt;</p>
static: |-
<p data-sourcepos="1:1-1:13" dir="auto">&lt;a href="""&gt;</p>
wysiwyg: |-
- <p>&lt;a href="""&gt;</p>
+ <p dir="auto">&lt;a href="""&gt;</p>
06_12_00__inlines__disallowed_raw_html_extension__001:
canonical: |
<p><strong> &lt;title> &lt;style> <em></p>
@@ -7459,8 +7453,8 @@
&lt;xmp&gt; is disallowed. &lt;XMP&gt; is also disallowed.
&lt;/blockquote&gt;</strong></p>
wysiwyg: |-
- <p></p>
- <blockquote dir="auto" multiline="false"><p></p></blockquote>
+ <p dir="auto"></p>
+ <blockquote dir="auto" multiline="false"><p dir="auto"></p></blockquote>
06_13_00__inlines__hard_line_breaks__001:
canonical: |
<p>foo<br />
@@ -7469,7 +7463,7 @@
<p data-sourcepos="1:1-2:3" dir="auto">foo<br>
baz</p>
wysiwyg: |-
- <p>foo<br>
+ <p dir="auto">foo<br>
baz</p>
06_13_00__inlines__hard_line_breaks__002:
canonical: |
@@ -7479,7 +7473,7 @@
<p data-sourcepos="1:1-2:3" dir="auto">foo<br>
baz</p>
wysiwyg: |-
- <p>foo<br>
+ <p dir="auto">foo<br>
baz</p>
06_13_00__inlines__hard_line_breaks__003:
canonical: |
@@ -7489,7 +7483,7 @@
<p data-sourcepos="1:1-2:3" dir="auto">foo<br>
baz</p>
wysiwyg: |-
- <p>foo<br>
+ <p dir="auto">foo<br>
baz</p>
06_13_00__inlines__hard_line_breaks__004:
canonical: |
@@ -7499,7 +7493,7 @@
<p data-sourcepos="1:1-2:8" dir="auto">foo<br>
bar</p>
wysiwyg: |-
- <p>foo<br>
+ <p dir="auto">foo<br>
bar</p>
06_13_00__inlines__hard_line_breaks__005:
canonical: |
@@ -7509,7 +7503,7 @@
<p data-sourcepos="1:1-2:8" dir="auto">foo<br>
bar</p>
wysiwyg: |-
- <p>foo<br>
+ <p dir="auto">foo<br>
bar</p>
06_13_00__inlines__hard_line_breaks__006:
canonical: |
@@ -7519,7 +7513,7 @@
<p data-sourcepos="1:1-2:4" dir="auto"><em>foo<br>
bar</em></p>
wysiwyg: |-
- <p><em>foo<br>
+ <p dir="auto"><em>foo<br>
bar</em></p>
06_13_00__inlines__hard_line_breaks__007:
canonical: |
@@ -7529,7 +7523,7 @@
<p data-sourcepos="1:1-2:4" dir="auto"><em>foo<br>
bar</em></p>
wysiwyg: |-
- <p><em>foo<br>
+ <p dir="auto"><em>foo<br>
bar</em></p>
06_13_00__inlines__hard_line_breaks__008:
canonical: |
@@ -7537,20 +7531,20 @@
static: |-
<p data-sourcepos="1:1-2:5" dir="auto"><code>code span</code></p>
wysiwyg: |-
- <p><code>code span</code></p>
+ <p dir="auto"><code>code span</code></p>
06_13_00__inlines__hard_line_breaks__009:
canonical: |
<p><code>code\ span</code></p>
static: |-
<p data-sourcepos="1:1-2:5" dir="auto"><code>code\ span</code></p>
wysiwyg: |-
- <p><code>code\ span</code></p>
+ <p dir="auto"><code>code\ span</code></p>
06_13_00__inlines__hard_line_breaks__010:
canonical: "<p><a href=\"foo \nbar\"></p>\n"
static: |-
<p data-sourcepos="1:1-2:5" dir="auto"><a href="foo%20%20%0Abar" rel="nofollow noreferrer noopener" target="_blank"></a></p>
wysiwyg: |-
- <p></p>
+ <p dir="auto"></p>
06_13_00__inlines__hard_line_breaks__011:
canonical: |
<p><a href="foo\
@@ -7558,21 +7552,21 @@
static: |-
<p data-sourcepos="1:1-2:5" dir="auto"><a href="foo\%0Abar" rel="nofollow noreferrer noopener" target="_blank"></a></p>
wysiwyg: |-
- <p></p>
+ <p dir="auto"></p>
06_13_00__inlines__hard_line_breaks__012:
canonical: |
<p>foo\</p>
static: |-
<p data-sourcepos="1:1-1:4" dir="auto">foo\</p>
wysiwyg: |-
- <p>foo\</p>
+ <p dir="auto">foo\</p>
06_13_00__inlines__hard_line_breaks__013:
canonical: |
<p>foo</p>
static: |-
<p data-sourcepos="1:1-1:5" dir="auto">foo</p>
wysiwyg: |-
- <p>foo</p>
+ <p dir="auto">foo</p>
06_13_00__inlines__hard_line_breaks__014:
canonical: |
<h3>foo\</h3>
@@ -7597,7 +7591,7 @@
<p data-sourcepos="1:1-2:3" dir="auto">foo
baz</p>
wysiwyg: |-
- <p>foo
+ <p dir="auto">foo
baz</p>
06_14_00__inlines__soft_line_breaks__002:
canonical: |
@@ -7607,7 +7601,7 @@
<p data-sourcepos="1:1-2:4" dir="auto">foo
baz</p>
wysiwyg: |-
- <p>foo
+ <p dir="auto">foo
baz</p>
06_15_00__inlines__textual_content__001:
canonical: |
@@ -7615,21 +7609,21 @@
static: |-
<p data-sourcepos="1:1-1:15" dir="auto">hello $.;'there</p>
wysiwyg: |-
- <p>hello $.;'there</p>
+ <p dir="auto">hello $.;'there</p>
06_15_00__inlines__textual_content__002:
canonical: |
<p>Foo χÏῆν</p>
static: |-
<p data-sourcepos="1:1-1:13" dir="auto">Foo χÏῆν</p>
wysiwyg: |-
- <p>Foo χÏῆν</p>
+ <p dir="auto">Foo χÏῆν</p>
06_15_00__inlines__textual_content__003:
canonical: |
<p>Multiple spaces</p>
static: |-
<p data-sourcepos="1:1-1:19" dir="auto">Multiple spaces</p>
wysiwyg: |-
- <p>Multiple spaces</p>
+ <p dir="auto">Multiple spaces</p>
07_01_00__gitlab_official_specification_markdown__task_list_items__001:
canonical: |
<ul>
@@ -7645,7 +7639,7 @@
<task-button></task-button><input type="checkbox" class="task-list-item-checkbox" disabled> incomplete</li>
</ul>
wysiwyg: |-
- <ul dir="auto" start="1" parens="false" data-type="taskList"><li dir="auto" data-checked="false" data-type="taskItem"><label><input type="checkbox"><span></span></label><div><p>incomplete</p></div></li></ul>
+ <ul dir="auto" start="1" parens="false" data-type="taskList"><li dir="auto" data-checked="false" data-type="taskItem"><label><input type="checkbox"><span></span></label><div><p dir="auto">incomplete</p></div></li></ul>
07_01_00__gitlab_official_specification_markdown__task_list_items__002:
canonical: |
<ul>
@@ -7661,7 +7655,7 @@
<task-button></task-button><input type="checkbox" class="task-list-item-checkbox" checked disabled> completed</li>
</ul>
wysiwyg: |-
- <ul dir="auto" start="1" parens="false" data-type="taskList"><li dir="auto" data-checked="true" data-type="taskItem"><label><input type="checkbox" checked="checked"><span></span></label><div><p>completed</p></div></li></ul>
+ <ul dir="auto" start="1" parens="false" data-type="taskList"><li dir="auto" data-checked="true" data-type="taskItem"><label><input type="checkbox" checked="checked"><span></span></label><div><p dir="auto">completed</p></div></li></ul>
07_01_00__gitlab_official_specification_markdown__task_list_items__003:
canonical: |
<ul>
@@ -7761,7 +7755,7 @@
<h2 data-sourcepos="4:1-5:3" dir="auto">
<a id="user-content-title-yaml-front-matter" class="anchor" href="#title-yaml-front-matter" aria-hidden="true"></a>title: YAML front matter</h2>
wysiwyg: |-
- <p>text</p>
+ <p dir="auto">text</p>
<hr>
<h2 dir="auto">title: YAML front matter</h2>
07_02_00__gitlab_official_specification_markdown__front_matter__005:
@@ -7833,9 +7827,9 @@
<p data-sourcepos="4:1-5:5" dir="auto">text
[TOC]</p>
wysiwyg: |-
- <p>[[<em>TOC</em>]]
+ <p dir="auto">[[<em>TOC</em>]]
text</p>
- <p>text
+ <p dir="auto">text
[TOC]</p>
07_03_00__gitlab_official_specification_markdown__table_of_contents__004:
canonical: |
@@ -7858,7 +7852,7 @@
static: |-
<p data-sourcepos="1:1-1:33" dir="auto"><span class="media-container audio-container"><audio src="audio.oga" controls="true" data-setup="{}" data-title="audio title"></audio><a href="audio.oga" target="_blank" rel="noopener noreferrer" title="Download 'audio title'">audio title</a></span></p>
wysiwyg: |-
- <p><span class="media-container audio-container"><audio src="audio.oga" controls="true" data-setup="{}" data-title="audio"></audio><a href="audio.oga" class="with-attachment-icon">audio</a></span></p>
+ <p dir="auto"><span class="media-container audio-container"><audio src="audio.oga" controls="true" data-setup="{}" data-title="audio"></audio><a href="audio.oga" class="with-attachment-icon">audio</a></span></p>
08_01_00__gitlab_internal_extension_markdown__audio__002:
canonical: |
<p><audio src="audio.oga" title="audio title"></audio></p>
@@ -7866,14 +7860,14 @@
<p data-sourcepos="3:1-3:15" dir="auto"><span class="media-container audio-container"><audio src="audio.oga" controls="true" data-setup="{}" data-title="audio title"></audio><a href="audio.oga" target="_blank" rel="noopener noreferrer" title="Download 'audio title'">audio title</a></span></p>
wysiwyg: |-
<pre>[audio]: audio.oga "audio title"</pre>
- <p><span class="media-container audio-container"><audio src="audio.oga" controls="true" data-setup="{}" data-title="audio"></audio><a href="audio.oga" class="with-attachment-icon">audio</a></span></p>
+ <p dir="auto"><span class="media-container audio-container"><audio src="audio.oga" controls="true" data-setup="{}" data-title="audio"></audio><a href="audio.oga" class="with-attachment-icon">audio</a></span></p>
08_02_00__gitlab_internal_extension_markdown__video__001:
canonical: |
<p><video src="video.m4v" title="video title"></video></p>
static: |-
<p data-sourcepos="1:1-1:33" dir="auto"><span class="media-container video-container"><video src="video.m4v" controls="true" data-setup="{}" data-title="video title" preload="metadata" width="400"></video><a href="video.m4v" target="_blank" rel="noopener noreferrer" title="Download 'video title'">video title</a></span></p>
wysiwyg: |-
- <p><span class="media-container video-container"><video src="video.m4v" controls="true" data-setup="{}" data-title="video"></video><a href="video.m4v" class="with-attachment-icon">video</a></span></p>
+ <p dir="auto"><span class="media-container video-container"><video src="video.m4v" controls="true" data-setup="{}" data-title="video"></video><a href="video.m4v" class="with-attachment-icon">video</a></span></p>
08_02_00__gitlab_internal_extension_markdown__video__002:
canonical: |
<p><video src="video.mov" title="video title"></video></p>
@@ -7881,7 +7875,7 @@
<p data-sourcepos="3:1-3:15" dir="auto"><span class="media-container video-container"><video src="video.mov" controls="true" data-setup="{}" data-title="video title" preload="metadata" width="400"></video><a href="video.mov" target="_blank" rel="noopener noreferrer" title="Download 'video title'">video title</a></span></p>
wysiwyg: |-
<pre>[video]: video.mov "video title"</pre>
- <p><span class="media-container video-container"><video src="video.mov" controls="true" data-setup="{}" data-title="video"></video><a href="video.mov" class="with-attachment-icon">video</a></span></p>
+ <p dir="auto"><span class="media-container video-container"><video src="video.mov" controls="true" data-setup="{}" data-title="video"></video><a href="video.mov" class="with-attachment-icon">video</a></span></p>
08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__001:
canonical: |
<p><a href="groups-test-file">groups-test-file</a></p>
@@ -7918,35 +7912,35 @@
static: |-
<p data-sourcepos="1:1-1:69" dir="auto"><a class="no-attachment-icon gfm" href="/groups/glfm_group/-/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/glfm_group/-/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png" data-canonical-src="/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png"></a></p>
wysiwyg: |-
- <p><img src="/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png" alt="test-file"></p>
+ <p dir="auto"><img src="/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png" alt="test-file"></p>
08_04_02__gitlab_internal_extension_markdown__migrated_golden_master_examples__attachment_image_for_project__001:
canonical: |
TODO: Write canonical HTML for this example
static: |-
<p data-sourcepos="1:1-1:69" dir="auto"><a class="no-attachment-icon gfm" href="/glfm_group/glfm_project/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="/glfm_group/glfm_project/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png" data-canonical-src="/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png"></a></p>
wysiwyg: |-
- <p><img src="/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png" alt="test-file"></p>
+ <p dir="auto"><img src="/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png" alt="test-file"></p>
08_04_03__gitlab_internal_extension_markdown__migrated_golden_master_examples__attachment_image_for_project_wiki__001:
canonical: |
TODO: Write canonical HTML for this example
static: |-
<p data-sourcepos="1:1-1:27" dir="auto"><a class="no-attachment-icon" href="/glfm_group/glfm_project/-/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="/glfm_group/glfm_project/-/wikis/test-file.png" data-canonical-src="test-file.png"></a></p>
wysiwyg: |-
- <p><img src="test-file.png" alt="test-file"></p>
+ <p dir="auto"><img src="test-file.png" alt="test-file"></p>
08_04_04__gitlab_internal_extension_markdown__migrated_golden_master_examples__attachment_link_for_group__001:
canonical: |
TODO: Write canonical HTML for this example
static: |-
<p data-sourcepos="1:1-1:68" dir="auto"><a href="/groups/glfm_group/-/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.zip" data-canonical-src="/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.zip" data-link="true" class="gfm">test-file</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.zip">test-file</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.zip">test-file</a></p>
08_04_05__gitlab_internal_extension_markdown__migrated_golden_master_examples__attachment_link_for_project__001:
canonical: |
TODO: Write canonical HTML for this example
static: |-
<p data-sourcepos="1:1-1:68" dir="auto"><a href="/glfm_group/glfm_project/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.zip" data-canonical-src="/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.zip" data-link="true" class="gfm">test-file</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.zip">test-file</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.zip">test-file</a></p>
08_04_06__gitlab_internal_extension_markdown__migrated_golden_master_examples__attachment_link_for_project_wiki__001:
canonical: |
TODO: Write canonical HTML for this example
@@ -7958,14 +7952,14 @@
static: |-
<p data-sourcepos="1:1-1:26" dir="auto"><a href="/groups/glfm_group/-/wikis/test-file.zip" data-canonical-src="test-file.zip">test-file</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="test-file.zip">test-file</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="test-file.zip">test-file</a></p>
08_04_08__gitlab_internal_extension_markdown__migrated_golden_master_examples__audio__001:
canonical: |
TODO: Write canonical HTML for this example
static: |-
<p data-sourcepos="1:1-1:46" dir="auto"><span class="media-container audio-container"><audio src="https://gitlab.com/gitlab.mp3" controls="true" data-setup="{}" data-title="Sample Audio"></audio><a href="https://gitlab.com/gitlab.mp3" target="_blank" rel="nofollow noreferrer noopener" title="Download 'Sample Audio'">Sample Audio</a></span></p>
wysiwyg: |-
- <p><span class="media-container audio-container"><audio src="https://gitlab.com/gitlab.mp3" controls="true" data-setup="{}" data-title="Sample Audio"></audio><a href="https://gitlab.com/gitlab.mp3" class="with-attachment-icon">Sample Audio</a></span></p>
+ <p dir="auto"><span class="media-container audio-container"><audio src="https://gitlab.com/gitlab.mp3" controls="true" data-setup="{}" data-title="Sample Audio"></audio><a href="https://gitlab.com/gitlab.mp3" class="with-attachment-icon">Sample Audio</a></span></p>
08_04_09__gitlab_internal_extension_markdown__migrated_golden_master_examples__audio_and_video_in_lists__001:
canonical: |
TODO: Write canonical HTML for this example
@@ -7990,9 +7984,9 @@
</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p><span class="media-container audio-container"><audio src="https://gitlab.com/1.mp3" controls="true" data-setup="{}" data-title="Sample Audio"></audio><a href="https://gitlab.com/1.mp3" class="with-attachment-icon">Sample Audio</a></span></p></li><li dir="auto"><p><span class="media-container video-container"><video src="https://gitlab.com/2.mp4" controls="true" data-setup="{}" data-title="Sample Video"></video><a href="https://gitlab.com/2.mp4" class="with-attachment-icon">Sample Video</a></span></p></li></ul>
- <ol dir="auto" parens="false"><li dir="auto"><p><span class="media-container video-container"><video src="https://gitlab.com/1.mp4" controls="true" data-setup="{}" data-title="Sample Video"></video><a href="https://gitlab.com/1.mp4" class="with-attachment-icon">Sample Video</a></span></p></li><li dir="auto"><p><span class="media-container audio-container"><audio src="https://gitlab.com/2.mp3" controls="true" data-setup="{}" data-title="Sample Audio"></audio><a href="https://gitlab.com/2.mp3" class="with-attachment-icon">Sample Audio</a></span></p></li></ol>
- <ul dir="auto" start="1" parens="false" data-type="taskList"><li dir="auto" data-checked="true" data-type="taskItem"><label><input type="checkbox" checked="checked"><span></span></label><div><p><span class="media-container audio-container"><audio src="https://gitlab.com/1.mp3" controls="true" data-setup="{}" data-title="Sample Audio"></audio><a href="https://gitlab.com/1.mp3" class="with-attachment-icon">Sample Audio</a></span></p></div></li><li dir="auto" data-checked="true" data-type="taskItem"><label><input type="checkbox" checked="checked"><span></span></label><div><p><span class="media-container audio-container"><audio src="https://gitlab.com/2.mp3" controls="true" data-setup="{}" data-title="Sample Audio"></audio><a href="https://gitlab.com/2.mp3" class="with-attachment-icon">Sample Audio</a></span></p></div></li><li dir="auto" data-checked="true" data-type="taskItem"><label><input type="checkbox" checked="checked"><span></span></label><div><p><span class="media-container video-container"><video src="https://gitlab.com/3.mp4" controls="true" data-setup="{}" data-title="Sample Video"></video><a href="https://gitlab.com/3.mp4" class="with-attachment-icon">Sample Video</a></span></p></div></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto"><span class="media-container audio-container"><audio src="https://gitlab.com/1.mp3" controls="true" data-setup="{}" data-title="Sample Audio"></audio><a href="https://gitlab.com/1.mp3" class="with-attachment-icon">Sample Audio</a></span></p></li><li dir="auto"><p dir="auto"><span class="media-container video-container"><video src="https://gitlab.com/2.mp4" controls="true" data-setup="{}" data-title="Sample Video"></video><a href="https://gitlab.com/2.mp4" class="with-attachment-icon">Sample Video</a></span></p></li></ul>
+ <ol dir="auto" parens="false"><li dir="auto"><p dir="auto"><span class="media-container video-container"><video src="https://gitlab.com/1.mp4" controls="true" data-setup="{}" data-title="Sample Video"></video><a href="https://gitlab.com/1.mp4" class="with-attachment-icon">Sample Video</a></span></p></li><li dir="auto"><p dir="auto"><span class="media-container audio-container"><audio src="https://gitlab.com/2.mp3" controls="true" data-setup="{}" data-title="Sample Audio"></audio><a href="https://gitlab.com/2.mp3" class="with-attachment-icon">Sample Audio</a></span></p></li></ol>
+ <ul dir="auto" start="1" parens="false" data-type="taskList"><li dir="auto" data-checked="true" data-type="taskItem"><label><input type="checkbox" checked="checked"><span></span></label><div><p dir="auto"><span class="media-container audio-container"><audio src="https://gitlab.com/1.mp3" controls="true" data-setup="{}" data-title="Sample Audio"></audio><a href="https://gitlab.com/1.mp3" class="with-attachment-icon">Sample Audio</a></span></p></div></li><li dir="auto" data-checked="true" data-type="taskItem"><label><input type="checkbox" checked="checked"><span></span></label><div><p dir="auto"><span class="media-container audio-container"><audio src="https://gitlab.com/2.mp3" controls="true" data-setup="{}" data-title="Sample Audio"></audio><a href="https://gitlab.com/2.mp3" class="with-attachment-icon">Sample Audio</a></span></p></div></li><li dir="auto" data-checked="true" data-type="taskItem"><label><input type="checkbox" checked="checked"><span></span></label><div><p dir="auto"><span class="media-container video-container"><video src="https://gitlab.com/3.mp4" controls="true" data-setup="{}" data-title="Sample Video"></video><a href="https://gitlab.com/3.mp4" class="with-attachment-icon">Sample Video</a></span></p></div></li></ul>
08_04_10__gitlab_internal_extension_markdown__migrated_golden_master_examples__blockquote__001:
canonical: |
TODO: Write canonical HTML for this example
@@ -8002,14 +7996,14 @@
<p data-sourcepos="3:3-3:21">This is another one</p>
</blockquote>
wysiwyg: |-
- <blockquote dir="auto" multiline="false"><p>This is a blockquote</p><p>This is another one</p></blockquote>
+ <blockquote dir="auto" multiline="false"><p dir="auto">This is a blockquote</p><p dir="auto">This is another one</p></blockquote>
08_04_11__gitlab_internal_extension_markdown__migrated_golden_master_examples__bold__001:
canonical: |
TODO: Write canonical HTML for this example
static: |-
<p data-sourcepos="1:1-1:8" dir="auto"><strong>bold</strong></p>
wysiwyg: |-
- <p><strong>bold</strong></p>
+ <p dir="auto"><strong>bold</strong></p>
08_04_12__gitlab_internal_extension_markdown__migrated_golden_master_examples__bullet_list_style_1__001:
canonical: |
TODO: Write canonical HTML for this example
@@ -8023,7 +8017,7 @@
</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>list item 1</p></li><li dir="auto"><p>list item 2</p><ul dir="auto" bullet="*"><li dir="auto"><p>embedded list item 3</p></li></ul></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">list item 1</p></li><li dir="auto"><p dir="auto">list item 2</p><ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">embedded list item 3</p></li></ul></li></ul>
08_04_13__gitlab_internal_extension_markdown__migrated_golden_master_examples__bullet_list_style_2__001:
canonical: |
TODO: Write canonical HTML for this example
@@ -8037,7 +8031,7 @@
</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>list item 1</p></li><li dir="auto"><p>list item 2</p><ul dir="auto" bullet="*"><li dir="auto"><p>embedded list item 3</p></li></ul></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">list item 1</p></li><li dir="auto"><p dir="auto">list item 2</p><ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">embedded list item 3</p></li></ul></li></ul>
08_04_14__gitlab_internal_extension_markdown__migrated_golden_master_examples__bullet_list_style_3__001:
canonical: |
TODO: Write canonical HTML for this example
@@ -8051,7 +8045,7 @@
</li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>list item 1</p></li><li dir="auto"><p>list item 2</p><ul dir="auto" bullet="*"><li dir="auto"><p>embedded list item 3</p></li></ul></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">list item 1</p></li><li dir="auto"><p dir="auto">list item 2</p><ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">embedded list item 3</p></li></ul></li></ul>
08_04_15__gitlab_internal_extension_markdown__migrated_golden_master_examples__code_block_javascript__001:
canonical: |
TODO: Write canonical HTML for this example
@@ -8098,7 +8092,7 @@
<li data-sourcepos="9:1-9:25"><code>HSLA(540,70%,50%,0.3)<span class="gfm-color_chip"><span style="background-color: HSLA(540,70%,50%,0.3);"></span></span></code></li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p><code>#F00</code></p></li><li dir="auto"><p><code>#F00A</code></p></li><li dir="auto"><p><code>#FF0000</code></p></li><li dir="auto"><p><code>#FF0000AA</code></p></li><li dir="auto"><p><code>RGB(0,255,0)</code></p></li><li dir="auto"><p><code>RGB(0%,100%,0%)</code></p></li><li dir="auto"><p><code>RGBA(0,255,0,0.3)</code></p></li><li dir="auto"><p><code>HSL(540,70%,50%)</code></p></li><li dir="auto"><p><code>HSLA(540,70%,50%,0.3)</code></p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto"><code>#F00</code></p></li><li dir="auto"><p dir="auto"><code>#F00A</code></p></li><li dir="auto"><p dir="auto"><code>#FF0000</code></p></li><li dir="auto"><p dir="auto"><code>#FF0000AA</code></p></li><li dir="auto"><p dir="auto"><code>RGB(0,255,0)</code></p></li><li dir="auto"><p dir="auto"><code>RGB(0%,100%,0%)</code></p></li><li dir="auto"><p dir="auto"><code>RGBA(0,255,0,0.3)</code></p></li><li dir="auto"><p dir="auto"><code>HSL(540,70%,50%)</code></p></li><li dir="auto"><p dir="auto"><code>HSLA(540,70%,50%,0.3)</code></p></li></ul>
08_04_19__gitlab_internal_extension_markdown__migrated_golden_master_examples__description_list__001:
canonical: |
TODO: Write canonical HTML for this example
@@ -8118,7 +8112,7 @@
</dd>
</dl>
wysiwyg: |-
- <p></p>
+ <p dir="auto"></p>
08_04_20__gitlab_internal_extension_markdown__migrated_golden_master_examples__details__001:
canonical: |
TODO: Write canonical HTML for this example
@@ -8131,7 +8125,7 @@
</ol>
</details>
wysiwyg: |-
- <p></p>
+ <p dir="auto"></p>
08_04_21__gitlab_internal_extension_markdown__migrated_golden_master_examples__diagram_kroki_nomnoml__001:
canonical: |
TODO: Write canonical HTML for this example
@@ -8195,8 +8189,8 @@
<p data-sourcepos="4:1-4:43">just a plain ol' div, not much to <em>expect</em>!</p>
</div>
wysiwyg: |-
- <div><p>plain text</p></div>
- <div><p>just a plain ol' div, not much to <em>expect</em>!</p></div>
+ <div><p dir="auto">plain text</p></div>
+ <div><p dir="auto">just a plain ol' div, not much to <em>expect</em>!</p></div>
08_04_25__gitlab_internal_extension_markdown__migrated_golden_master_examples__emoji__001:
canonical: |
TODO: Write canonical HTML for this example
@@ -8205,14 +8199,14 @@
black heart\" data-name=\"heart\" data-unicode-version=\"1.1\">â¤</gl-emoji> <gl-emoji
title=\"hundred points symbol\" data-name=\"100\" data-unicode-version=\"6.0\">\U0001F4AF</gl-emoji></p>"
wysiwyg: |-
- <p>:sparkles: :heart: :100:</p>
+ <p dir="auto">:sparkles: :heart: :100:</p>
08_04_26__gitlab_internal_extension_markdown__migrated_golden_master_examples__emphasis__001:
canonical: |
TODO: Write canonical HTML for this example
static: |-
<p data-sourcepos="1:1-1:17" dir="auto"><em>emphasized text</em></p>
wysiwyg: |-
- <p><em>emphasized text</em></p>
+ <p dir="auto"><em>emphasized text</em></p>
08_04_27__gitlab_internal_extension_markdown__migrated_golden_master_examples__figure__001:
canonical: |
TODO: Write canonical HTML for this example
@@ -8228,7 +8222,7 @@
</figcaption>
</figure>
wysiwyg: |-
- <p></p>
+ <p dir="auto"></p>
08_04_28__gitlab_internal_extension_markdown__migrated_golden_master_examples__footnotes__001:
canonical: |
TODO: Write canonical HTML for this example
@@ -8246,10 +8240,10 @@
</ol>
</section>
wysiwyg: |-
- <p>A footnote reference tag looks like this: <sup dir="auto" identifier="1">1</sup></p>
- <p>This reference tag is a mix of letters and numbers. <sup dir="auto" identifier="footnote">footnote</sup></p>
- <div node="footnoteDefinition(paragraph(&quot;This is the text inside a footnote.&quot;))" htmlattributes="[object Object]"><p>This is the text inside a footnote.</p></div>
- <div node="footnoteDefinition(paragraph(&quot;This is another footnote.&quot;))" htmlattributes="[object Object]"><p>This is another footnote.</p></div>
+ <p dir="auto">A footnote reference tag looks like this: <sup dir="auto" identifier="1">1</sup></p>
+ <p dir="auto">This reference tag is a mix of letters and numbers. <sup dir="auto" identifier="footnote">footnote</sup></p>
+ <div node="footnoteDefinition(paragraph(&quot;This is the text inside a footnote.&quot;))" htmlattributes="[object Object]"><p dir="auto">This is the text inside a footnote.</p></div>
+ <div node="footnoteDefinition(paragraph(&quot;This is another footnote.&quot;))" htmlattributes="[object Object]"><p dir="auto">This is another footnote.</p></div>
08_04_29__gitlab_internal_extension_markdown__migrated_golden_master_examples__frontmatter_json__001:
canonical: |
TODO: Write canonical HTML for this example
@@ -8291,7 +8285,7 @@
<p data-sourcepos="1:1-2:10" dir="auto">This is a line after a<br>
hard break</p>
wysiwyg: |-
- <p>This is a line after a<br>
+ <p dir="auto">This is a line after a<br>
hard break</p>
08_04_33__gitlab_internal_extension_markdown__migrated_golden_master_examples__headings__001:
canonical: |
@@ -8351,35 +8345,41 @@
+ H<sub>2</sub>O</li>\n<li data-sourcepos=\"15:1-15:130\">The <strong>Pythagorean
theorem</strong> is often expressed as <var>a<sup>2</sup></var> + <var>b<sup>2</sup></var>
= <var>c<sup>2</sup></var>\n</li>\n</ul>"
- wysiwyg: "<ul dir=\"auto\" bullet=\"*\"><li dir=\"auto\"><p>Content editor is<s>great</s></p><p>.</p></li><li
- dir=\"auto\"><p>If the changes</p><p>, please</p><p>.</p></li><li dir=\"auto\"><p>The
- English song</p><p> looks like this in Hebrew:</p><p>. In the computer's memory,
- this is stored as</p><p>.</p></li><li dir=\"auto\"><p> by Edvard Munch. Painted
- in 1893.</p></li><li dir=\"auto\"><p> is the standard markup language for creating
- web pages.</p></li><li dir=\"auto\"><p>Do not forget to buy</p><p> today.</p></li><li
- dir=\"auto\"><p>This is a paragraph and</p><p>.</p></li><li dir=\"auto\"><p>The
- concert starts at</p><p> and you'll be able to enjoy the band for at least</p><p>.</p></li><li
- dir=\"auto\"><p>Press</p><p> +</p><p> to copy text (Windows).</p></li><li dir=\"auto\"><p>WWF's
- goal is to:</p><p> We hope they succeed.</p></li><li dir=\"auto\"><p>The error
- occurred was:</p></li><li dir=\"auto\"><p>The area of a triangle is: 1/2 x</p><p>
- x</p><p>, where</p><p> is the base, and</p><p> is the vertical height.</p></li><li
- dir=\"auto\"><p></p></li><li dir=\"auto\"><p>C</p><p>H</p><p> + O</p><p> \t CO</p><p>
- + H</p><p>O</p></li><li dir=\"auto\"><p>The<strong>Pythagorean theorem</strong>
- is often expressed as</p><p> +</p><p> =</p></li></ul>"
+ wysiwyg: "<ul dir=\"auto\" bullet=\"*\"><li dir=\"auto\"><p dir=\"auto\">Content
+ editor is<s>great</s></p><p dir=\"auto\">.</p></li><li dir=\"auto\"><p dir=\"auto\">If
+ the changes</p><p dir=\"auto\">, please</p><p dir=\"auto\">.</p></li><li dir=\"auto\"><p
+ dir=\"auto\">The English song</p><p dir=\"auto\"> looks like this in Hebrew:</p><p
+ dir=\"auto\">. In the computer's memory, this is stored as</p><p dir=\"auto\">.</p></li><li
+ dir=\"auto\"><p dir=\"auto\"> by Edvard Munch. Painted in 1893.</p></li><li dir=\"auto\"><p
+ dir=\"auto\"> is the standard markup language for creating web pages.</p></li><li
+ dir=\"auto\"><p dir=\"auto\">Do not forget to buy</p><p dir=\"auto\"> today.</p></li><li
+ dir=\"auto\"><p dir=\"auto\">This is a paragraph and</p><p dir=\"auto\">.</p></li><li
+ dir=\"auto\"><p dir=\"auto\">The concert starts at</p><p dir=\"auto\"> and you'll
+ be able to enjoy the band for at least</p><p dir=\"auto\">.</p></li><li dir=\"auto\"><p
+ dir=\"auto\">Press</p><p dir=\"auto\"> +</p><p dir=\"auto\"> to copy text (Windows).</p></li><li
+ dir=\"auto\"><p dir=\"auto\">WWF's goal is to:</p><p dir=\"auto\"> We hope they
+ succeed.</p></li><li dir=\"auto\"><p dir=\"auto\">The error occurred was:</p></li><li
+ dir=\"auto\"><p dir=\"auto\">The area of a triangle is: 1/2 x</p><p dir=\"auto\">
+ x</p><p dir=\"auto\">, where</p><p dir=\"auto\"> is the base, and</p><p dir=\"auto\">
+ is the vertical height.</p></li><li dir=\"auto\"><p dir=\"auto\"></p></li><li
+ dir=\"auto\"><p dir=\"auto\">C</p><p dir=\"auto\">H</p><p dir=\"auto\"> + O</p><p
+ dir=\"auto\"> \t CO</p><p dir=\"auto\"> + H</p><p dir=\"auto\">O</p></li><li dir=\"auto\"><p
+ dir=\"auto\">The<strong>Pythagorean theorem</strong> is often expressed as</p><p
+ dir=\"auto\"> +</p><p dir=\"auto\"> =</p></li></ul>"
08_04_36__gitlab_internal_extension_markdown__migrated_golden_master_examples__image__001:
canonical: |
TODO: Write canonical HTML for this example
static: |-
<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>
wysiwyg: |-
- <p><img src="https://gitlab.com/logo.png" alt="alt text"></p>
+ <p dir="auto"><img src="https://gitlab.com/logo.png" alt="alt text"></p>
08_04_37__gitlab_internal_extension_markdown__migrated_golden_master_examples__inline_code__001:
canonical: |
TODO: Write canonical HTML for this example
static: |-
<p data-sourcepos="1:1-1:6" dir="auto"><code>code</code></p>
wysiwyg: |-
- <p><code>code</code></p>
+ <p dir="auto"><code>code</code></p>
08_04_38__gitlab_internal_extension_markdown__migrated_golden_master_examples__inline_diff__001:
canonical: |
TODO: Write canonical HTML for this example
@@ -8389,21 +8389,21 @@
<li data-sourcepos="2:1-2:11"><span class="idiff left right addition">added</span></li>
</ul>
wysiwyg: |-
- <ul dir="auto" bullet="*"><li dir="auto"><p>{-deleted-}</p></li><li dir="auto"><p>{+added+}</p></li></ul>
+ <ul dir="auto" bullet="*"><li dir="auto"><p dir="auto">{-deleted-}</p></li><li dir="auto"><p dir="auto">{+added+}</p></li></ul>
08_04_39__gitlab_internal_extension_markdown__migrated_golden_master_examples__label__001:
canonical: |
TODO: Write canonical HTML for this example
static: |-
<p data-sourcepos="1:1-1:4" dir="auto">~bug</p>
wysiwyg: |-
- <p>~bug</p>
+ <p dir="auto">~bug</p>
08_04_40__gitlab_internal_extension_markdown__migrated_golden_master_examples__link__001:
canonical: |
TODO: Write canonical HTML for this example
static: |-
<p data-sourcepos="1:1-1:28" dir="auto"><a href="https://gitlab.com" rel="nofollow noreferrer noopener" target="_blank">GitLab</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="https://gitlab.com">GitLab</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="https://gitlab.com">GitLab</a></p>
08_04_41__gitlab_internal_extension_markdown__migrated_golden_master_examples__math__001:
canonical: |
TODO: Write canonical HTML for this example
@@ -8415,8 +8415,8 @@
<copy-code></copy-code>
</div>
wysiwyg: |-
- <p>This math is inline $<code>a^2+b^2=c^2</code>$.</p>
- <p>This is on a separate line:</p>
+ <p dir="auto">This math is inline $<code>a^2+b^2=c^2</code>$.</p>
+ <p dir="auto">This is on a separate line:</p>
<pre dir="auto" language="math" class="content-editor-code-block undefined code highlight"><code>a^2+b^2=c^2</code></pre>
08_04_42__gitlab_internal_extension_markdown__migrated_golden_master_examples__ordered_list__001:
canonical: |
@@ -8428,7 +8428,7 @@
<li data-sourcepos="3:1-3:14">list item 3</li>
</ol>
wysiwyg: |-
- <ol dir="auto" parens="false"><li dir="auto"><p>list item 1</p></li><li dir="auto"><p>list item 2</p></li><li dir="auto"><p>list item 3</p></li></ol>
+ <ol dir="auto" parens="false"><li dir="auto"><p dir="auto">list item 1</p></li><li dir="auto"><p dir="auto">list item 2</p></li><li dir="auto"><p dir="auto">list item 3</p></li></ol>
08_04_43__gitlab_internal_extension_markdown__migrated_golden_master_examples__ordered_list_with_start_order__001:
canonical: |
TODO: Write canonical HTML for this example
@@ -8439,7 +8439,7 @@
<li data-sourcepos="3:1-3:16">list item 3</li>
</ol>
wysiwyg: |-
- <ol dir="auto" parens="false"><li dir="auto"><p>list item 1</p></li><li dir="auto"><p>list item 2</p></li><li dir="auto"><p>list item 3</p></li></ol>
+ <ol dir="auto" parens="false"><li dir="auto"><p dir="auto">list item 1</p></li><li dir="auto"><p dir="auto">list item 2</p></li><li dir="auto"><p dir="auto">list item 3</p></li></ol>
08_04_44__gitlab_internal_extension_markdown__migrated_golden_master_examples__ordered_task_list__001:
canonical: |
TODO: Write canonical HTML for this example
@@ -8477,21 +8477,21 @@
<task-button></task-button><input type="checkbox" class="task-list-item-checkbox" disabled> example</li>
</ol>
wysiwyg: |-
- <ol dir="auto" start="1" parens="false" data-type="taskList"><li dir="auto" data-checked="true" data-type="taskItem"><label><input type="checkbox" checked="checked"><span></span></label><div><p>hello</p></div></li><li dir="auto" data-checked="true" data-type="taskItem"><label><input type="checkbox" checked="checked"><span></span></label><div><p>world</p></div></li><li dir="auto" data-checked="false" data-type="taskItem"><label><input type="checkbox"><span></span></label><div><p>example</p></div></li></ol>
+ <ol dir="auto" start="1" parens="false" data-type="taskList"><li dir="auto" data-checked="true" data-type="taskItem"><label><input type="checkbox" checked="checked"><span></span></label><div><p dir="auto">hello</p></div></li><li dir="auto" data-checked="true" data-type="taskItem"><label><input type="checkbox" checked="checked"><span></span></label><div><p dir="auto">world</p></div></li><li dir="auto" data-checked="false" data-type="taskItem"><label><input type="checkbox"><span></span></label><div><p dir="auto">example</p></div></li></ol>
08_04_46__gitlab_internal_extension_markdown__migrated_golden_master_examples__reference_for_project_wiki__001:
canonical: |
TODO: Write canonical HTML for this example
static: |-
<p data-sourcepos="1:1-1:98" dir="auto">Hi @gfm_user - thank you for reporting this ~"UX bug" (#1) we hope to fix it in %1.1 as part of !1</p>
wysiwyg: |-
- <p>Hi @gfm_user - thank you for reporting this ~"UX bug" (#1) we hope to fix it in %1.1 as part of !1</p>
+ <p dir="auto">Hi @gfm_user - thank you for reporting this ~"UX bug" (#1) we hope to fix it in %1.1 as part of !1</p>
08_04_47__gitlab_internal_extension_markdown__migrated_golden_master_examples__strike__001:
canonical: |
TODO: Write canonical HTML for this example
static: |-
<p data-sourcepos="1:1-1:7" dir="auto"><del>del</del></p>
wysiwyg: |-
- <p><s>del</s></p>
+ <p dir="auto"><s>del</s></p>
08_04_48__gitlab_internal_extension_markdown__migrated_golden_master_examples__table__001:
canonical: |
TODO: Write canonical HTML for this example
@@ -8519,7 +8519,7 @@
<h1 data-sourcepos="6:1-6:21" dir="auto">
<a id="user-content-content-after-table" class="anchor" href="#content-after-table" aria-hidden="true"></a>content after table</h1>
wysiwyg: |-
- <table><tbody><tr><th colspan="1" rowspan="1"><p>header</p></th><th colspan="1" rowspan="1"><p>header</p></th></tr><tr><td colspan="1" rowspan="1"><p><code>code</code></p></td><td colspan="1" rowspan="1"><p>cell with <strong>bold</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p><s>strike</s></p></td><td colspan="1" rowspan="1"><p>cell with <em>italic</em></p></td></tr></tbody></table>
+ <table><tbody><tr><th colspan="1" rowspan="1"><p dir="auto">header</p></th><th colspan="1" rowspan="1"><p dir="auto">header</p></th></tr><tr><td colspan="1" rowspan="1"><p dir="auto"><code>code</code></p></td><td colspan="1" rowspan="1"><p dir="auto">cell with <strong>bold</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p dir="auto"><s>strike</s></p></td><td colspan="1" rowspan="1"><p dir="auto">cell with <em>italic</em></p></td></tr></tbody></table>
<h1 dir="auto">content after table</h1>
08_04_49__gitlab_internal_extension_markdown__migrated_golden_master_examples__table_of_contents__001:
canonical: |
@@ -8549,7 +8549,7 @@
wysiwyg: |-
<div class="table-of-contents gl-border-1 gl-border-solid gl-text-center gl-border-gray-100 gl-mb-5">Table of contents</div>
<h1 dir="auto">Lorem</h1>
- <p>Well, that's just like... your opinion.. man.</p>
+ <p dir="auto">Well, that's just like... your opinion.. man.</p>
<h2 dir="auto">Ipsum</h2>
<h3 dir="auto">Dolar</h3>
<h1 dir="auto">Sit amit</h1>
@@ -8584,14 +8584,14 @@
static: |-
<p data-sourcepos="1:1-1:46" dir="auto"><span class="media-container video-container"><video src="https://gitlab.com/gitlab.mp4" controls="true" data-setup="{}" data-title="Sample Video" preload="metadata" width="400"></video><a href="https://gitlab.com/gitlab.mp4" target="_blank" rel="nofollow noreferrer noopener" title="Download 'Sample Video'">Sample Video</a></span></p>
wysiwyg: |-
- <p><span class="media-container video-container"><video src="https://gitlab.com/gitlab.mp4" controls="true" data-setup="{}" data-title="Sample Video"></video><a href="https://gitlab.com/gitlab.mp4" class="with-attachment-icon">Sample Video</a></span></p>
+ <p dir="auto"><span class="media-container video-container"><video src="https://gitlab.com/gitlab.mp4" controls="true" data-setup="{}" data-title="Sample Video"></video><a href="https://gitlab.com/gitlab.mp4" class="with-attachment-icon">Sample Video</a></span></p>
08_04_52__gitlab_internal_extension_markdown__migrated_golden_master_examples__word_break__001:
canonical: |
TODO: Write canonical HTML for this example
static: |-
<p data-sourcepos="1:1-1:60" dir="auto">Fernstraßen<wbr>bau<wbr>privat<wbr>finanzierungs<wbr>gesetz</wbr></wbr></wbr></wbr></p>
wysiwyg: |-
- <p>Fernstraßenbauprivatfinanzierungsgesetz</p>
+ <p dir="auto">Fernstraßenbauprivatfinanzierungsgesetz</p>
08_05_00__gitlab_internal_extension_markdown__image_attributes__001:
canonical: |
<p><img src="https://gitlab.com/logo.png" width="100" height="100"></p>
@@ -8648,5 +8648,5 @@
</ol>
</section>
wysiwyg: |-
- <p>footnote reference tag <sup dir="auto" identifier="fortytwo">fortytwo</sup></p>
- <div node="footnoteDefinition(paragraph(&quot;footnote text&quot;))" htmlattributes="[object Object]"><p>footnote text</p></div>
+ <p dir="auto">footnote reference tag <sup dir="auto" identifier="fortytwo">fortytwo</sup></p>
+ <div node="footnoteDefinition(paragraph(&quot;footnote text&quot;))" htmlattributes="[object Object]"><p dir="auto">footnote text</p></div>
diff --git a/glfm_specification/output_spec/spec.html b/glfm_specification/output_spec/spec.html
index 4ec7f683124..6ede9858af1 100644
--- a/glfm_specification/output_spec/spec.html
+++ b/glfm_specification/output_spec/spec.html
@@ -267,7 +267,7 @@ for a complete list of all examples, which are a superset of examples from:</p>
<li data-sourcepos="23:1-23:88">GitLab Flavored Markdown Official Specification (the same ones from this specifiation)</li>
<li data-sourcepos="24:1-25:0">GitLab Flavored Markdown Internal Extensions.</li>
</ul>
-<!-- BEGIN TESTS -->
+
<h1 data-sourcepos="27:1-27:40" dir="auto">
<a id="user-content-gitlab-official-specification-markdown" class="anchor" href="#gitlab-official-specification-markdown" aria-hidden="true"></a>GitLab Official Specification Markdown</h1>
<p data-sourcepos="29:1-31:104" dir="auto">Note: This specification is a work in progress. Only some of the official GLFM extensions
@@ -563,7 +563,7 @@ line.</p>
<copy-code></copy-code>
</div>
</div>
-<!-- END TESTS -->
+
</body>
</html>
diff --git a/jest.config.base.js b/jest.config.base.js
index 88ccee4d201..1907b084fb6 100644
--- a/jest.config.base.js
+++ b/jest.config.base.js
@@ -30,6 +30,7 @@ module.exports = (path, options = {}) => {
'^@gitlab/ui/dist/([^.]*)$': [
'<rootDir>/node_modules/@gitlab/ui/src/$1.vue',
'<rootDir>/node_modules/@gitlab/ui/src/$1.js',
+ '<rootDir>/node_modules/@gitlab/ui/dist/$1.js',
],
'^@gitlab/ui$': '<rootDir>/node_modules/@gitlab/ui/src/index.js',
});
diff --git a/lefthook.yml b/lefthook.yml
index 0d67d6521a2..f29de0a791d 100644
--- a/lefthook.yml
+++ b/lefthook.yml
@@ -44,7 +44,7 @@ pre-push:
tags: backend style
files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
glob: '*.{rb,rake}'
- run: REVEAL_RUBOCOP_TODO=0 bundle exec rubocop --parallel --force-exclusion {files}
+ run: REVEAL_RUBOCOP_TODO=0 bundle exec rubocop --config .rubocop.yml --parallel --force-exclusion {files}
sidekiq-queues:
tags: backend
files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
@@ -61,11 +61,10 @@ pre-push:
glob: 'doc/*.md'
run: 'if [ $VALE_WARNINGS ]; then minWarnings=warning; else minWarnings=error; fi; if command -v vale > /dev/null 2>&1; then if ! vale --config .vale.ini --minAlertLevel $minWarnings {files}; then echo "ERROR: Fix any linting errors and make sure you are using the latest version of Vale."; exit 1; fi; else echo "ERROR: Vale not found. For more information, see https://docs.errata.ai/vale/install."; exit 1; fi'
gettext:
- skip: true # This is disabled by default. You can enable this check by adding skip: false in lefthook-local.yml https://github.com/evilmartians/lefthook/blob/master/docs/configuration.md#skip
tags: backend frontend view haml
files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD | while read file;do git diff --unified=1 $(git merge-base origin/master HEAD)..HEAD $file | grep -Fqe '_(' && echo $file;done; true
glob: '*.{haml,rb,js,vue}'
- run: bin/rake gettext:updated_check
+ run: tooling/bin/gettext_extractor /dev/stdout --silent | diff - locale/gitlab.pot
docs-metadata: # See https://docs.gitlab.com/ee/development/documentation/#metadata
tags: documentation style
files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
@@ -81,11 +80,6 @@ pre-push:
files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
glob: 'data/deprecations/*.yml'
run: echo "Changes to deprecation files detected. Checking deprecations..\n"; bundle exec rake gitlab:docs:check_deprecations
- docs-removals:
- tags: documentation
- files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
- glob: 'data/removals/*.yml'
- run: echo "Changes to removals files detected. Checking removals..\n"; bundle exec rake gitlab:docs:check_removals
db-schema-changes:
tags: database
files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
@@ -140,4 +134,9 @@ auto-fix:
tags: backend style
files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
glob: '*.{rb,rake}'
- run: REVEAL_RUBOCOP_TODO=0 bundle exec rubocop --parallel --autocorrect --force-exclusion {files}
+ run: REVEAL_RUBOCOP_TODO=0 bundle exec rubocop --config .rubocop.yml --parallel --autocorrect --force-exclusion {files}
+ gettext:
+ tags: backend frontend view haml
+ files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD | while read file;do git diff --unified=1 $(git merge-base origin/master HEAD)..HEAD $file | grep -Fqe '_(' && echo $file;done; true
+ glob: '*.{haml,rb,js,vue}'
+ run: tooling/bin/gettext_extractor locale/gitlab.pot
diff --git a/lib/api/api.rb b/lib/api/api.rb
index 090fbaa7f93..7da5f21b21f 100644
--- a/lib/api/api.rb
+++ b/lib/api/api.rb
@@ -316,6 +316,7 @@ module API
mount ::API::UsageDataQueries
mount ::API::Users
mount ::API::UserCounts
+ mount ::API::UserRunners
mount ::API::Wikis
add_open_api_documentation!
diff --git a/lib/api/award_emoji.rb b/lib/api/award_emoji.rb
index f7a39db7249..aa7468723b7 100644
--- a/lib/api/award_emoji.rb
+++ b/lib/api/award_emoji.rb
@@ -82,7 +82,9 @@ module API
unauthorized! unless award.user == current_user || current_user&.can_admin_all_resources?
- destroy_conditionally!(award)
+ destroy_conditionally!(award) do
+ AwardEmojis::DestroyService.new(awardable, award.name, award.user).execute
+ end
end
end
end
diff --git a/lib/api/badges.rb b/lib/api/badges.rb
index 84c9f780a53..62eecdbd5e5 100644
--- a/lib/api/badges.rb
+++ b/lib/api/badges.rb
@@ -22,7 +22,9 @@ module API
%w[group project].each do |source_type|
params do
- requires :id, type: String, desc: "The ID of a #{source_type}"
+ requires :id,
+ type: String,
+ desc: "The ID or URL-encoded path of the #{source_type} owned by the authenticated user."
end
resource source_type.pluralize, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
desc "Gets a list of #{source_type} badges viewable by the authenticated user." do
diff --git a/lib/api/ci/pipeline_schedules.rb b/lib/api/ci/pipeline_schedules.rb
index e27ec24fb44..1606d5ba649 100644
--- a/lib/api/ci/pipeline_schedules.rb
+++ b/lib/api/ci/pipeline_schedules.rb
@@ -90,14 +90,28 @@ module API
post ':id/pipeline_schedules' do
authorize! :create_pipeline_schedule, user_project
- pipeline_schedule = ::Ci::CreatePipelineScheduleService
- .new(user_project, current_user, declared_params(include_missing: false))
- .execute
+ if ::Feature.enabled?(:ci_refactoring_pipeline_schedule_create_service, @project)
+ response = ::Ci::PipelineSchedules::CreateService
+ .new(user_project, current_user, declared_params(include_missing: false))
+ .execute
- if pipeline_schedule.persisted?
- present pipeline_schedule, with: Entities::Ci::PipelineScheduleDetails
+ pipeline_schedule = response.payload
+
+ if response.success?
+ present pipeline_schedule, with: Entities::Ci::PipelineScheduleDetails
+ else
+ render_validation_error!(pipeline_schedule)
+ end
else
- render_validation_error!(pipeline_schedule)
+ pipeline_schedule = ::Ci::CreatePipelineScheduleService
+ .new(user_project, current_user, declared_params(include_missing: false))
+ .execute
+
+ if pipeline_schedule.persisted?
+ present pipeline_schedule, with: Entities::Ci::PipelineScheduleDetails
+ else
+ render_validation_error!(pipeline_schedule)
+ end
end
end
@@ -121,10 +135,22 @@ module API
put ':id/pipeline_schedules/:pipeline_schedule_id' do
authorize! :update_pipeline_schedule, pipeline_schedule
- if pipeline_schedule.update(declared_params(include_missing: false))
- present pipeline_schedule, with: Entities::Ci::PipelineScheduleDetails
+ if ::Feature.enabled?(:ci_refactoring_pipeline_schedule_create_service, @project)
+ response = ::Ci::PipelineSchedules::UpdateService
+ .new(pipeline_schedule, current_user, declared_params(include_missing: false))
+ .execute
+
+ if response.success?
+ present pipeline_schedule, with: Entities::Ci::PipelineScheduleDetails
+ else
+ render_validation_error!(pipeline_schedule)
+ end
else
- render_validation_error!(pipeline_schedule)
+ if pipeline_schedule.update(declared_params(include_missing: false)) # rubocop:disable Style/IfInsideElse
+ present pipeline_schedule, with: Entities::Ci::PipelineScheduleDetails
+ else
+ render_validation_error!(pipeline_schedule)
+ end
end
end
diff --git a/lib/api/ci/variables.rb b/lib/api/ci/variables.rb
index f5331eb75da..49a6ec279fb 100644
--- a/lib/api/ci/variables.rb
+++ b/lib/api/ci/variables.rb
@@ -63,6 +63,7 @@ module API
optional :raw, type: Boolean, desc: 'Whether the variable will be expanded'
optional :variable_type, type: String, values: ::Ci::Variable.variable_types.keys, desc: 'The type of the variable. Default: env_var'
optional :environment_scope, type: String, desc: 'The environment_scope of the variable'
+ optional :description, type: String, desc: 'The description of the variable'
end
post ':id/variables' do
variable = ::Ci::ChangeVariableService.new(
@@ -95,6 +96,7 @@ module API
optional :filter, type: Hash, desc: 'Available filters: [environment_scope]. Example: filter[environment_scope]=production' do
optional :environment_scope, type: String, desc: 'The environment scope of a variable'
end
+ optional :description, type: String, desc: 'The description of the variable'
end
# rubocop: disable CodeReuse/ActiveRecord
put ':id/variables/:key' do
diff --git a/lib/api/concerns/packages/debian_package_endpoints.rb b/lib/api/concerns/packages/debian_package_endpoints.rb
index 25c97932e31..45290cb3e44 100644
--- a/lib/api/concerns/packages/debian_package_endpoints.rb
+++ b/lib/api/concerns/packages/debian_package_endpoints.rb
@@ -13,7 +13,6 @@ module API
component: ::Packages::Debian::COMPONENT_REGEX,
architecture: ::Packages::Debian::ARCHITECTURE_REGEX
}.freeze
- LIST_PACKAGE = 'list_package'
included do
feature_category :package_registry
@@ -41,8 +40,6 @@ module API
package_file = distribution_from!(project).package_files.with_file_name(params[:file_name]).last!
- track_debian_package_event 'pull_package'
-
present_package_file!(package_file)
end
@@ -73,22 +70,8 @@ module API
no_content! # empty component files are not always persisted in DB
end
- track_debian_package_event LIST_PACKAGE
-
present_carrierwave_file!(component_file.file)
end
-
- def track_debian_package_event(action)
- if project_or_group.is_a?(Project)
- project = project_or_group
- namespace = project_or_group.namespace
- else
- project = nil
- namespace = project_or_group
- end
-
- track_package_event(action, :debian, project: project, namespace: namespace, user: current_user)
- end
end
rescue_from ArgumentError do |e|
@@ -146,7 +129,6 @@ module API
get 'Release' do
distribution = distribution_from!(project_or_group)
- track_debian_package_event LIST_PACKAGE
present_carrierwave_file!(distribution.file)
end
@@ -166,7 +148,6 @@ module API
get 'InRelease' do
distribution = distribution_from!(project_or_group)
- track_debian_package_event LIST_PACKAGE
present_carrierwave_file!(distribution.signed_file)
end
diff --git a/lib/api/concerns/packages/npm_endpoints.rb b/lib/api/concerns/packages/npm_endpoints.rb
index 74ad3bb296f..ec20440f013 100644
--- a/lib/api/concerns/packages/npm_endpoints.rb
+++ b/lib/api/concerns/packages/npm_endpoints.rb
@@ -21,12 +21,18 @@ module API
included do
helpers ::API::Helpers::Packages::DependencyProxyHelpers
+ rescue_from ActiveRecord::RecordInvalid do |e|
+ render_structured_api_error!({ message: e.message, error: e.message }, 400)
+ end
+
before do
require_packages_enabled!
authenticate_non_get!
end
helpers do
+ include Gitlab::Utils::StrongMemoize
+
params :package_name do
requires :package_name, type: String, file_path: true, desc: 'Package name',
documentation: { example: 'mypackage' }
@@ -51,6 +57,12 @@ module API
def generate_metadata_service(packages)
::Packages::Npm::GenerateMetadataService.new(params[:package_name], packages)
end
+
+ def metadata_cache
+ ::Packages::Npm::MetadataCache
+ .find_by_package_name_and_project_id(params[:package_name], project.id)
+ end
+ strong_memoize_attr :metadata_cache
end
params do
@@ -80,7 +92,7 @@ module API
packages = ::Packages::Npm::PackageFinder.new(package_name, project: project)
.execute
- not_found! if packages.empty?
+ not_found!('Package') if packages.empty?
track_package_event(:list_tags, :npm, project: project, namespace: project.namespace)
@@ -122,6 +134,8 @@ module API
track_package_event(:create_tag, :npm, project: project, namespace: project.namespace)
+ enqueue_sync_metadata_cache_worker(project, package_name)
+
::Packages::Npm::CreateTagService.new(package, tag).execute
no_content!
@@ -156,6 +170,8 @@ module API
track_package_event(:delete_tag, :npm, project: project, namespace: project.namespace)
+ enqueue_sync_metadata_cache_worker(project, package_name)
+
::Packages::RemoveTagService.new(package_tag).execute
no_content!
@@ -202,6 +218,17 @@ module API
not_found!('Packages') if packages.empty?
+ if endpoint_scope == :project && Feature.enabled?(:npm_metadata_cache, project)
+ if metadata_cache&.file&.exists?
+ metadata_cache.touch_last_downloaded_at
+ present_carrierwave_file!(metadata_cache.file)
+
+ break
+ end
+
+ enqueue_sync_metadata_cache_worker(project, package_name)
+ end
+
present ::Packages::Npm::PackagePresenter.new(generate_metadata_service(packages).execute),
with: ::API::Entities::NpmPackage
end
diff --git a/lib/api/debian_project_packages.rb b/lib/api/debian_project_packages.rb
index e1531847b87..a2b2d781797 100644
--- a/lib/api/debian_project_packages.rb
+++ b/lib/api/debian_project_packages.rb
@@ -111,8 +111,6 @@ module API
::Packages::Debian::CreatePackageFileService.new(package: package, current_user: current_user, params: file_params).execute
- track_debian_package_event 'push_package'
-
created!
rescue ObjectStorage::RemoteStoreError => e
Gitlab::ErrorTracking.track_exception(e, extra: { file_name: params[:file_name], project_id: project_or_group.id })
diff --git a/lib/api/deployments.rb b/lib/api/deployments.rb
index 3a0eea677b8..8161c2b850f 100644
--- a/lib/api/deployments.rb
+++ b/lib/api/deployments.rb
@@ -68,6 +68,7 @@ module API
desc: 'The status to filter deployments by. One of `created`, `running`, `success`, `failed`, `canceled`, or `blocked`'
end
+ route_setting :authentication, job_token_allowed: true
get ':id/deployments' do
authorize! :read_deployment, user_project
@@ -92,6 +93,7 @@ module API
params do
requires :deployment_id, type: Integer, desc: 'The ID of the deployment'
end
+ route_setting :authentication, job_token_allowed: true
get ':id/deployments/:deployment_id' do
authorize! :read_deployment, user_project
@@ -129,9 +131,10 @@ module API
requires :status,
type: String,
- desc: 'The status to filter deployments by. One of `running`, `success`, `failed`, or `canceled`',
+ desc: 'The status of the deployment that is created. One of `running`, `success`, `failed`, or `canceled`',
values: %w[running success failed canceled]
end
+ route_setting :authentication, job_token_allowed: true
post ':id/deployments' do
authorize!(:create_deployment, user_project)
authorize!(:create_environment, user_project)
@@ -175,6 +178,7 @@ module API
desc: 'The new status of the deployment. One of `running`, `success`, `failed`, or `canceled`',
values: %w[running success failed canceled]
end
+ route_setting :authentication, job_token_allowed: true
put ':id/deployments/:deployment_id' do
authorize!(:read_deployment, user_project)
@@ -207,6 +211,7 @@ module API
params do
requires :deployment_id, type: Integer, desc: 'The ID of the deployment'
end
+ route_setting :authentication, job_token_allowed: true
delete ':id/deployments/:deployment_id' do
deployment = user_project.deployments.find(params[:deployment_id])
@@ -240,7 +245,7 @@ module API
use :merge_requests_base_params
end
-
+ route_setting :authentication, job_token_allowed: true
get ':id/deployments/:deployment_id/merge_requests' do
authorize! :read_deployment, user_project
diff --git a/lib/api/entities/blob.rb b/lib/api/entities/blob.rb
index 12700d99865..b4206679ac9 100644
--- a/lib/api/entities/blob.rb
+++ b/lib/api/entities/blob.rb
@@ -15,6 +15,13 @@ module API
expose :ref
expose :startline
expose :project_id
+ expose :group_id, if: ->(object) { object.is_a?(Gitlab::Search::FoundWikiPage) }
+
+ private
+
+ def group_id
+ object.group&.id
+ end
end
end
end
diff --git a/lib/api/entities/bulk_imports/export_batch_status.rb b/lib/api/entities/bulk_imports/export_batch_status.rb
new file mode 100644
index 00000000000..6e4a2fc8f93
--- /dev/null
+++ b/lib/api/entities/bulk_imports/export_batch_status.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ module BulkImports
+ class ExportBatchStatus < Grape::Entity
+ expose :status, documentation: { type: 'string', example: 'started', values: %w[started finished failed] }
+ expose :batch_number, documentation: { type: 'integer', example: 1 }
+ expose :objects_count, documentation: { type: 'integer', example: 100 }
+ expose :error, documentation: { type: 'string', example: 'Error message' }
+ expose :updated_at, documentation: { type: 'dateTime', example: '2012-05-28T04:42:42-07:00' }
+ end
+ end
+ end
+end
diff --git a/lib/api/entities/bulk_imports/export_status.rb b/lib/api/entities/bulk_imports/export_status.rb
index fee983c6fd8..1e5ee6ec210 100644
--- a/lib/api/entities/bulk_imports/export_status.rb
+++ b/lib/api/entities/bulk_imports/export_status.rb
@@ -8,6 +8,10 @@ module API
expose :status, documentation: { type: 'string', example: 'started', values: %w[started finished failed] }
expose :error, documentation: { type: 'string', example: 'Error message' }
expose :updated_at, documentation: { type: 'dateTime', example: '2012-05-28T04:42:42-07:00' }
+ expose :batched, documentation: { type: 'boolean', example: true }
+ expose :batches_count, documentation: { type: 'integer', example: 2 }
+ expose :total_objects_count, documentation: { type: 'integer', example: 100 }
+ expose :batches, if: ->(export, _options) { export.batched? }, using: ExportBatchStatus
end
end
end
diff --git a/lib/api/entities/ci/runner.rb b/lib/api/entities/ci/runner.rb
index 9361709b6ed..441e1dc1117 100644
--- a/lib/api/entities/ci/runner.rb
+++ b/lib/api/entities/ci/runner.rb
@@ -6,6 +6,7 @@ module API
class Runner < Grape::Entity
expose :id, documentation: { type: 'integer', example: 8 }
expose :description, documentation: { type: 'string', example: 'test-1-20150125' }
+ # TODO: return null in 17.0 and remove in v5 https://gitlab.com/gitlab-org/gitlab/-/issues/415159
expose :ip_address, documentation: { type: 'string', example: '127.0.0.1' }
# TODO Remove in v5 in favor of `paused` for REST calls, see https://gitlab.com/gitlab-org/gitlab/-/issues/375709
expose :active, documentation: { type: 'boolean', example: true }
diff --git a/lib/api/entities/ci/variable.rb b/lib/api/entities/ci/variable.rb
index 47597cb77be..4336f82fb5e 100644
--- a/lib/api/entities/ci/variable.rb
+++ b/lib/api/entities/ci/variable.rb
@@ -14,6 +14,8 @@ module API
expose :raw?, as: :raw, if: -> (entity, _) { entity.respond_to?(:raw?) }, documentation: { type: 'boolean' }
expose :environment_scope, if: -> (entity, _) { entity.respond_to?(:environment_scope) },
documentation: { type: 'string', example: '*' }
+ expose :description, if: -> (entity, _) { entity.respond_to?(:description) },
+ documentation: { type: 'string', example: 'This variable is being used for ...' }
end
end
end
diff --git a/lib/api/entities/dictionary/table.rb b/lib/api/entities/dictionary/table.rb
index 8d4e3fb959d..93e82d34b14 100644
--- a/lib/api/entities/dictionary/table.rb
+++ b/lib/api/entities/dictionary/table.rb
@@ -5,7 +5,7 @@ module API
module Dictionary
class Table < Grape::Entity
expose :table_name, documentation: { type: :string, example: 'users' }
- expose :feature_categories, documentation: { type: :array, example: ['database'] }
+ expose :feature_categories, documentation: { type: :string, is_array: true, example: 'database' }
end
end
end
diff --git a/lib/api/entities/group.rb b/lib/api/entities/group.rb
index 246fb819890..9296617dac9 100644
--- a/lib/api/entities/group.rb
+++ b/lib/api/entities/group.rb
@@ -21,6 +21,7 @@ module API
expose :full_name, :full_path
expose :created_at
expose :parent_id
+ expose :shared_runners_setting
expose :custom_attributes, using: 'API::Entities::CustomAttribute', if: :with_custom_attributes
diff --git a/lib/api/entities/plan_limit.rb b/lib/api/entities/plan_limit.rb
index 753c595d65f..27b24a60305 100644
--- a/lib/api/entities/plan_limit.rb
+++ b/lib/api/entities/plan_limit.rb
@@ -14,6 +14,11 @@ module API
expose :enforcement_limit, documentation: { type: 'integer', example: 15000 }
expose :generic_packages_max_file_size, documentation: { type: 'integer', example: 5368709120 }
expose :helm_max_file_size, documentation: { type: 'integer', example: 5242880 }
+ expose :limits_history, documentation: {
+ type: 'object',
+ example: '{"enforcement_limit"=>[{"timestamp"=>1686909124, "user_id"=>1, "username"=>"x", "value"=>5}],
+ "notification_limit"=>[{"timestamp"=>1686909124, "user_id"=>2, "username"=>"y", "value"=>7}]}'
+ }
expose :maven_max_file_size, documentation: { type: 'integer', example: 3221225472 }
expose :notification_limit, documentation: { type: 'integer', example: 15000 }
expose :npm_max_file_size, documentation: { type: 'integer', example: 524288000 }
diff --git a/lib/api/entities/project_hook.rb b/lib/api/entities/project_hook.rb
index bffb057abed..b85d2747226 100644
--- a/lib/api/entities/project_hook.rb
+++ b/lib/api/entities/project_hook.rb
@@ -14,6 +14,7 @@ module API
expose :job_events, documentation: { type: 'boolean' }
expose :releases_events, documentation: { type: 'boolean' }
expose :push_events_branch_filter, documentation: { type: 'string', example: 'my-branch-*' }
+ expose :emoji_events, documentation: { type: 'boolean' }
end
end
end
diff --git a/lib/api/entities/protected_ref_access.rb b/lib/api/entities/protected_ref_access.rb
index 28e0ef540d5..3cac91ccddc 100644
--- a/lib/api/entities/protected_ref_access.rb
+++ b/lib/api/entities/protected_ref_access.rb
@@ -5,12 +5,9 @@ module API
class ProtectedRefAccess < Grape::Entity
expose :id, documentation: { type: 'integer', example: 1 }
expose :access_level, documentation: { type: 'integer', example: 40 }
- expose :access_level_description,
- documentation: { type: 'string', example: 'Maintainers' } do |protected_ref_access|
- protected_ref_access.humanize
- end
+ expose :humanize, as: :access_level_description, documentation: { type: 'string', example: 'Maintainers' }
expose :deploy_key_id, documentation: { type: 'integer', example: 1 },
- if: ->(access) { access.has_attribute?(:deploy_key_id) && access.deploy_key_id }
+ if: ->(access) { access.has_attribute?(:deploy_key_id) }
end
end
end
diff --git a/lib/api/environments.rb b/lib/api/environments.rb
index bb261079d2a..b94391359ed 100644
--- a/lib/api/environments.rb
+++ b/lib/api/environments.rb
@@ -38,6 +38,7 @@ module API
desc: 'List all environments that match a specific state. Accepted values: `available`, `stopping`, or `stopped`. If no state value given, returns all environments'
mutually_exclusive :name, :search, message: 'cannot be used together'
end
+ route_setting :authentication, job_token_allowed: true
get ':id/environments' do
authorize! :read_environment, user_project
@@ -66,6 +67,7 @@ module API
optional :slug, absence: { message: "is automatically generated and cannot be changed" }, documentation: { hidden: true }
optional :tier, type: String, values: Environment.tiers.keys, desc: 'The tier of the new environment. Allowed values are `production`, `staging`, `testing`, `development`, and `other`'
end
+ route_setting :authentication, job_token_allowed: true
post ':id/environments' do
authorize! :create_environment, user_project
@@ -94,6 +96,7 @@ module API
optional :slug, absence: { message: "is automatically generated and cannot be changed" }, documentation: { hidden: true }
optional :tier, type: String, values: Environment.tiers.keys, desc: 'The tier of the new environment. Allowed values are `production`, `staging`, `testing`, `development`, and `other`'
end
+ route_setting :authentication, job_token_allowed: true
put ':id/environments/:environment_id' do
authorize! :update_environment, user_project
@@ -126,6 +129,7 @@ module API
optional :limit, type: Integer, desc: "Maximum number of environments to delete. Defaults to 100", default: 100, values: 1..1000
optional :dry_run, type: Boolean, desc: "Defaults to true for safety reasons. It performs a dry run where no actual deletion will be performed. Set to false to actually delete the environment", default: true
end
+ route_setting :authentication, job_token_allowed: true
delete ":id/environments/review_apps" do
authorize! :read_environment, user_project
@@ -156,6 +160,7 @@ module API
params do
requires :environment_id, type: Integer, desc: 'The ID of the environment'
end
+ route_setting :authentication, job_token_allowed: true
delete ':id/environments/:environment_id' do
authorize! :read_environment, user_project
@@ -178,6 +183,7 @@ module API
requires :environment_id, type: Integer, desc: 'The ID of the environment'
optional :force, type: Boolean, default: false, desc: 'Force environment to stop without executing `on_stop` actions'
end
+ route_setting :authentication, job_token_allowed: true
post ':id/environments/:environment_id/stop' do
authorize! :read_environment, user_project
@@ -202,6 +208,7 @@ module API
type: DateTime,
desc: 'Stop all environments that were last modified or deployed to before this date.'
end
+ route_setting :authentication, job_token_allowed: true
post ':id/environments/stop_stale' do
authorize! :stop_environment, user_project
@@ -229,6 +236,7 @@ module API
params do
requires :environment_id, type: Integer, desc: 'The ID of the environment'
end
+ route_setting :authentication, job_token_allowed: true
get ':id/environments/:environment_id' do
authorize! :read_environment, user_project
diff --git a/lib/api/files.rb b/lib/api/files.rb
index 45e935d7ea2..c140cec658d 100644
--- a/lib/api/files.rb
+++ b/lib/api/files.rb
@@ -49,7 +49,14 @@ module API
end
def content_sha
- cache_client.fetch("blob_content_sha256:#{user_project.full_path}:#{@blob.id}") do
+ cache_client.fetch(
+ "blob_content_sha256:#{user_project.full_path}:#{@blob.id}",
+ nil,
+ {
+ cache_identifier: 'API::Files#content_sha',
+ backing_resource: :gitaly
+ }
+ ) do
@blob.load_all_data!
Digest::SHA256.hexdigest(@blob.data)
@@ -57,10 +64,8 @@ module API
end
def cache_client
- Gitlab::Cache::Client.build_with_metadata(
- cache_identifier: 'API::Files#content_sha',
- feature_category: :source_code_management,
- backing_resource: :gitaly
+ @cache_client ||= Gitlab::Cache::Client.new(
+ Gitlab::Cache::Metrics.new(Gitlab::Cache::Metadata.new(feature_category: :source_code_management))
)
end
diff --git a/lib/api/group_export.rb b/lib/api/group_export.rb
index 37dfbfdb925..4cac707ff66 100644
--- a/lib/api/group_export.rb
+++ b/lib/api/group_export.rb
@@ -80,8 +80,13 @@ module API
{ code: 503, message: 'Service unavailable' }
]
end
+ params do
+ optional :batched, type: Boolean, desc: 'Whether to export in batches'
+ end
post ':id/export_relations' do
- response = ::BulkImports::ExportService.new(portable: user_group, user: current_user).execute
+ response = ::BulkImports::ExportService
+ .new(portable: user_group, user: current_user, batched: params[:batched])
+ .execute
if response.success?
accepted!
@@ -104,15 +109,32 @@ module API
end
params do
requires :relation, type: String, desc: 'Group relation name'
+ optional :batched, type: Boolean, desc: 'Whether to download in batches'
+ optional :batch_number, type: Integer, desc: 'Batch number to download'
+
+ all_or_none_of :batched, :batch_number
end
get ':id/export_relations/download' do
export = user_group.bulk_import_exports.find_by_relation(params[:relation])
- file = export&.upload&.export_file
- if file
- present_carrierwave_file!(file)
+ break render_api_error!('Export not found', 404) unless export
+
+ if params[:batched]
+ batch = export.batches.find_by_batch_number(params[:batch_number])
+ batch_file = batch&.upload&.export_file
+
+ break render_api_error!('Export is not batched', 400) unless export.batched?
+ break render_api_error!('Batch not found', 404) unless batch
+ break render_api_error!('Batch file not found', 404) unless batch_file
+
+ present_carrierwave_file!(batch_file)
else
- render_api_error!('404 Not found', 404)
+ file = export&.upload&.export_file
+
+ break render_api_error!('Export is batched', 400) if export.batched?
+ break render_api_error!('Export file not found', 404) unless file
+
+ present_carrierwave_file!(file)
end
end
@@ -128,8 +150,19 @@ module API
{ code: 503, message: 'Service unavailable' }
]
end
+ params do
+ optional :relation, type: String, desc: 'Group relation name'
+ end
get ':id/export_relations/status' do
- present user_group.bulk_import_exports, with: Entities::BulkImports::ExportStatus
+ if params[:relation]
+ export = user_group.bulk_import_exports.find_by_relation(params[:relation])
+
+ break render_api_error!('Export not found', 404) unless export
+
+ present export, with: Entities::BulkImports::ExportStatus
+ else
+ present user_group.bulk_import_exports, with: Entities::BulkImports::ExportStatus
+ end
end
end
end
diff --git a/lib/api/group_variables.rb b/lib/api/group_variables.rb
index 295bee475c3..f320fa06394 100644
--- a/lib/api/group_variables.rb
+++ b/lib/api/group_variables.rb
@@ -59,6 +59,8 @@ module API
optional :raw, type: String, desc: 'Whether the variable will be expanded'
optional :variable_type, type: String, values: ::Ci::GroupVariable.variable_types.keys, desc: 'The type of the variable. Default: env_var'
optional :environment_scope, type: String, desc: 'The environment scope of a variable'
+ optional :description, type: String, desc: 'The description of the variable'
+
use :optional_group_variable_params_ee
end
post ':id/variables' do
@@ -94,6 +96,7 @@ module API
optional :raw, type: String, desc: 'Whether the variable will be expanded'
optional :variable_type, type: String, values: ::Ci::GroupVariable.variable_types.keys, desc: 'The type of the variable. Default: env_var'
optional :environment_scope, type: String, desc: 'The environment scope of a variable'
+ optional :description, type: String, desc: 'The description of the variable'
use :optional_group_variable_params_ee
end
diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb
index df080c8e666..b616f1b35b3 100644
--- a/lib/api/helpers.rb
+++ b/lib/api/helpers.rb
@@ -657,6 +657,19 @@ module API
Gitlab::AppLogger.warn("Redis tracking event failed for event: #{event_name}, message: #{error.message}")
end
+ def track_event(event_name, user_id:, namespace_id: nil, project_id: nil)
+ return unless user_id.present?
+
+ Gitlab::InternalEvents.track_event(
+ event_name,
+ user_id: user_id,
+ namespace_id: namespace_id,
+ project_id: project_id
+ )
+ rescue StandardError => error
+ Gitlab::AppLogger.warn("Internal Event tracking event failed for event: #{event_name}, message: #{error.message}")
+ end
+
def order_by_similarity?(allow_unauthorized: true)
params[:order_by] == 'similarity' && params[:search].present? && (allow_unauthorized || current_user.present?)
end
diff --git a/lib/api/helpers/custom_attributes.rb b/lib/api/helpers/custom_attributes.rb
index 88208226c40..fc3f42f0d58 100644
--- a/lib/api/helpers/custom_attributes.rb
+++ b/lib/api/helpers/custom_attributes.rb
@@ -8,7 +8,7 @@ module API
included do
helpers do
params :with_custom_attributes do
- optional :with_custom_attributes, type: Boolean, default: false, desc: 'Include custom attributes in the response'
+ optional :with_custom_attributes, type: ::Grape::API::Boolean, default: false, desc: 'Include custom attributes in the response'
optional :custom_attributes, type: Hash,
desc: 'Filter with custom attributes'
diff --git a/lib/api/helpers/integrations_helpers.rb b/lib/api/helpers/integrations_helpers.rb
index 850cc61af2c..09dd69ef03b 100644
--- a/lib/api/helpers/integrations_helpers.rb
+++ b/lib/api/helpers/integrations_helpers.rb
@@ -41,7 +41,7 @@ module API
{
required: false,
name: :notify_only_broken_pipelines,
- type: Boolean,
+ type: ::Grape::API::Boolean,
desc: 'Send notifications for broken pipelines'
}
].freeze
@@ -129,85 +129,85 @@ module API
{
required: false,
name: :commit_events,
- type: Boolean,
+ type: ::Grape::API::Boolean,
desc: 'Enable notifications for commit_events'
},
{
required: false,
name: :push_events,
- type: Boolean,
+ type: ::Grape::API::Boolean,
desc: 'Enable notifications for push_events'
},
{
required: false,
name: :issues_events,
- type: Boolean,
+ type: ::Grape::API::Boolean,
desc: 'Enable notifications for issues_events'
},
{
required: false,
name: :incident_events,
- type: Boolean,
+ type: ::Grape::API::Boolean,
desc: 'Enable notifications for incident_events'
},
{
required: false,
name: :alert_events,
- type: Boolean,
+ type: ::Grape::API::Boolean,
desc: 'Enable notifications for alert_events'
},
{
required: false,
name: :confidential_issues_events,
- type: Boolean,
+ type: ::Grape::API::Boolean,
desc: 'Enable notifications for confidential_issues_events'
},
{
required: false,
name: :merge_requests_events,
- type: Boolean,
+ type: ::Grape::API::Boolean,
desc: 'Enable notifications for merge_requests_events'
},
{
required: false,
name: :note_events,
- type: Boolean,
+ type: ::Grape::API::Boolean,
desc: 'Enable notifications for note_events'
},
{
required: false,
name: :confidential_note_events,
- type: Boolean,
+ type: ::Grape::API::Boolean,
desc: 'Enable notifications for confidential_note_events'
},
{
required: false,
name: :tag_push_events,
- type: Boolean,
+ type: ::Grape::API::Boolean,
desc: 'Enable notifications for tag_push_events'
},
{
required: false,
name: :deployment_events,
- type: Boolean,
+ type: ::Grape::API::Boolean,
desc: 'Enable notifications for deployment_events'
},
{
required: false,
name: :job_events,
- type: Boolean,
+ type: ::Grape::API::Boolean,
desc: 'Enable notifications for job_events'
},
{
required: false,
name: :pipeline_events,
- type: Boolean,
+ type: ::Grape::API::Boolean,
desc: 'Enable notifications for pipeline_events'
},
{
required: false,
name: :wiki_page_events,
- type: Boolean,
+ type: ::Grape::API::Boolean,
desc: 'Enable notifications for wiki_page_events'
}
].freeze
@@ -243,7 +243,7 @@ module API
{
required: false,
name: :app_store_protected_refs,
- type: Boolean,
+ type: ::Grape::API::Boolean,
desc: 'Only enable for protected refs'
}
],
@@ -285,7 +285,7 @@ module API
{
required: false,
name: :enable_ssl_verification,
- type: Boolean,
+ type: ::Grape::API::Boolean,
desc: 'Enable SSL verification'
},
{
@@ -343,7 +343,7 @@ module API
{
required: false,
name: :enable_ssl_verification,
- type: Boolean,
+ type: ::Grape::API::Boolean,
desc: 'DEPRECATED: This parameter has no effect since SSL verification will always be enabled'
}
],
@@ -417,7 +417,7 @@ module API
{
required: false,
name: :archive_trace_events,
- type: Boolean,
+ type: ::Grape::API::Boolean,
desc: 'When enabled, job logs will be collected by Datadog and shown along pipeline execution traces'
},
{
@@ -471,7 +471,7 @@ module API
{
required: false,
name: :enable_ssl_verification,
- type: Boolean,
+ type: ::Grape::API::Boolean,
desc: 'Enable SSL verification'
}
],
@@ -485,13 +485,13 @@ module API
{
required: false,
name: :disable_diffs,
- type: Boolean,
+ type: ::Grape::API::Boolean,
desc: 'Disable code diffs'
},
{
required: false,
name: :send_from_committer_email,
- type: Boolean,
+ type: ::Grape::API::Boolean,
desc: 'Send from committer'
},
{
@@ -598,7 +598,7 @@ module API
{
required: false,
name: :colorize_messages,
- type: Boolean,
+ type: ::Grape::API::Boolean,
desc: 'Colorize messages'
}
],
@@ -612,7 +612,7 @@ module API
{
required: false,
name: :enable_ssl_verification,
- type: Boolean,
+ type: ::Grape::API::Boolean,
desc: 'Enable SSL verification'
},
{
@@ -668,7 +668,7 @@ module API
{
required: false,
name: :jira_issue_transition_automatic,
- type: Boolean,
+ type: ::Grape::API::Boolean,
desc: 'Enable automatic issue transitions'
},
{
@@ -692,7 +692,7 @@ module API
{
required: false,
name: :comment_on_event_enabled,
- type: Boolean,
+ type: ::Grape::API::Boolean,
desc: 'Enable comments inside Jira issues on each GitLab event (commit / merge request)'
}
],
@@ -750,13 +750,13 @@ module API
{
required: false,
name: :notify_only_broken_pipelines,
- type: Boolean,
+ type: ::Grape::API::Boolean,
desc: 'Notify only broken pipelines'
},
{
required: false,
name: :notify_only_default_branch,
- type: Boolean,
+ type: ::Grape::API::Boolean,
desc: 'Send notifications only for the default branch'
},
{
@@ -946,7 +946,7 @@ module API
{
required: false,
name: :enable_ssl_verification,
- type: Boolean,
+ type: ::Grape::API::Boolean,
desc: 'Enable SSL verification'
},
{
diff --git a/lib/api/helpers/members_helpers.rb b/lib/api/helpers/members_helpers.rb
index b3c79486465..a82aed507fd 100644
--- a/lib/api/helpers/members_helpers.rb
+++ b/lib/api/helpers/members_helpers.rb
@@ -29,6 +29,7 @@ module API
# rubocop: disable CodeReuse/ActiveRecord
def retrieve_members(source, params:, deep: false)
members = deep ? find_all_members(source) : source_members(source).connected_to_user
+ members = members.allow_cross_joins_across_databases(url: "https://gitlab.com/gitlab-org/gitlab/-/issues/417456")
members = members.includes(:user)
members = members.references(:user).merge(User.search(params[:query], use_minimum_char_limit: false)) if params[:query].present?
members = members.where(user_id: params[:user_ids]) if params[:user_ids].present?
diff --git a/lib/api/helpers/packages/maven.rb b/lib/api/helpers/packages/maven.rb
new file mode 100644
index 00000000000..694a1ec6436
--- /dev/null
+++ b/lib/api/helpers/packages/maven.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+module API
+ module Helpers
+ module Packages
+ module Maven
+ extend Grape::API::Helpers
+
+ params :path_and_file_name do
+ requires :path,
+ type: String,
+ desc: 'Package path',
+ documentation: { example: 'foo/bar/mypkg/1.0-SNAPSHOT' }
+ requires :file_name,
+ type: String,
+ desc: 'Package file name',
+ documentation: { example: 'mypkg-1.0-SNAPSHOT.jar' }
+ end
+ end
+ end
+ end
+end
diff --git a/lib/api/helpers/packages/npm.rb b/lib/api/helpers/packages/npm.rb
index be7f57fda0c..a80122c5309 100644
--- a/lib/api/helpers/packages/npm.rb
+++ b/lib/api/helpers/packages/npm.rb
@@ -6,6 +6,7 @@ module API
module Npm
include Gitlab::Utils::StrongMemoize
include ::API::Helpers::PackagesHelpers
+ extend ::Gitlab::Utils::Override
NPM_ENDPOINT_REQUIREMENTS = {
package_name: API::NO_SLASH_URL_PART_REGEX
@@ -55,8 +56,7 @@ module API
when :group
finder = ::Packages::Npm::PackageFinder.new(
params[:package_name],
- namespace: group,
- last_of_each_version: false
+ namespace: group
)
finder.last&.project_id
@@ -77,8 +77,7 @@ module API
finder = ::Packages::Npm::PackageFinder.new(
package_name,
- namespace: namespace,
- last_of_each_version: false
+ namespace: namespace
)
finder.last&.project_id
@@ -86,6 +85,12 @@ module API
end
strong_memoize_attr :project_id_or_nil
+ def enqueue_sync_metadata_cache_worker(project, package_name)
+ return unless Feature.enabled?(:npm_metadata_cache, project)
+
+ ::Packages::Npm::CreateMetadataCacheWorker.perform_async(project.id, package_name)
+ end
+
private
def top_namespace_from(package_name)
@@ -101,6 +106,20 @@ module API
group
end
strong_memoize_attr :group
+
+ override :not_found!
+ def not_found!(resource = nil)
+ reason = "#{resource} not found"
+ message = "404 #{reason}".titleize
+ render_structured_api_error!({ message: message, error: reason }, 404)
+ end
+
+ override :bad_request_missing_attribute!
+ def bad_request_missing_attribute!(attribute)
+ reason = "\"#{attribute}\" not given"
+ message = "400 Bad request - #{reason}"
+ render_structured_api_error!({ message: message, error: reason }, 400)
+ end
end
end
end
diff --git a/lib/api/helpers/projects_helpers.rb b/lib/api/helpers/projects_helpers.rb
index b96e8efba61..642963768f8 100644
--- a/lib/api/helpers/projects_helpers.rb
+++ b/lib/api/helpers/projects_helpers.rb
@@ -15,7 +15,6 @@ module API
optional :auto_cancel_pending_pipelines, type: String, values: %w(disabled enabled), desc: 'Auto-cancel pending pipelines'
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.'
# TODO: remove in API v5, replaced by *_access_level
optional :issues_enabled, type: Boolean, desc: 'Flag indication if the issue tracker is enabled'
@@ -71,7 +70,6 @@ module API
optional :squash_commit_template, type: String, desc: 'Template used to create squash commit message'
optional :issue_branch_template, type: String, desc: 'Template used to create a branch from an issue'
optional :initialize_with_readme, type: Boolean, desc: "Initialize a project with a README.md"
- optional :ci_default_git_depth, type: Integer, desc: 'Default number of revisions for shallow cloning'
optional :auto_devops_enabled, type: Boolean, desc: 'Flag indication if Auto DevOps is enabled'
optional :auto_devops_deploy_strategy, type: String, values: %w(continuous manual timed_incremental), desc: 'Auto Deploy strategy'
optional :autoclose_referenced_issues, type: Boolean, desc: 'Flag indication if referenced issues auto-closing is enabled'
@@ -101,6 +99,8 @@ module API
end
params :optional_update_params_ce do
+ optional :ci_default_git_depth, type: Integer, desc: 'Default number of revisions for shallow cloning'
+ optional :keep_latest_artifact, type: Boolean, desc: 'Indicates if the latest artifact should be kept for this project.'
optional :ci_forward_deployment_enabled, type: Boolean, desc: 'Prevent older deployment jobs that are still pending'
optional :ci_allow_fork_pipelines_to_run_in_parent_project, type: Boolean, desc: 'Allow fork merge request pipelines to run in parent project'
optional :ci_separated_caches, type: Boolean, desc: 'Enable or disable separated caches based on branch protection.'
@@ -205,9 +205,6 @@ module API
def filter_attributes_using_license!(attrs)
end
- def filter_attributes_under_feature_flag!(attrs, project)
- end
-
def validate_git_import_url!(import_url)
return if import_url.blank?
diff --git a/lib/api/helpers/remote_mirrors_helpers.rb b/lib/api/helpers/remote_mirrors_helpers.rb
index efd81a5ac5a..2c00f7cdb14 100644
--- a/lib/api/helpers/remote_mirrors_helpers.rb
+++ b/lib/api/helpers/remote_mirrors_helpers.rb
@@ -18,7 +18,7 @@ module API
use :mirror_branches_setting_ee
end
- def verify_mirror_branches_setting(attrs, project); end
+ def verify_mirror_branches_setting(attrs); end
end
end
end
diff --git a/lib/api/import_github.rb b/lib/api/import_github.rb
index 6550808a563..ab7ac6624a8 100644
--- a/lib/api/import_github.rb
+++ b/lib/api/import_github.rb
@@ -20,7 +20,10 @@ module API
end
def access_params
- { github_access_token: params[:personal_access_token] }
+ {
+ github_access_token: params[:personal_access_token],
+ additional_access_tokens: params[:additional_access_tokens]
+ }
end
def client_options
@@ -59,6 +62,11 @@ module API
requires :target_namespace, type: String, allow_blank: false, desc: 'Namespace or group to import repository into'
optional :github_hostname, type: String, desc: 'Custom GitHub enterprise hostname'
optional :optional_stages, type: Hash, desc: 'Optional stages of import to be performed'
+ optional :additional_access_tokens,
+ type: Array[String],
+ coerce_with: ::API::Validations::Types::CommaSeparatedToArray.coerce,
+ desc: 'Additional list of personal access tokens',
+ documentation: { example: 'foo,bar' }
end
post 'import/github' do
result = Import::GithubService.new(client, current_user, params).execute(access_params, provider)
diff --git a/lib/api/internal/kubernetes.rb b/lib/api/internal/kubernetes.rb
index 5592207c4b5..8783a8dd57c 100644
--- a/lib/api/internal/kubernetes.rb
+++ b/lib/api/internal/kubernetes.rb
@@ -29,21 +29,13 @@ module API
end
def gitaly_info(project)
- shard = repo_type.repository_for(project).shard
- {
- address: Gitlab::GitalyClient.address(shard),
- token: Gitlab::GitalyClient.token(shard),
- features: Feature::Gitaly.server_feature_flags
- }
+ gitaly_features = Feature::Gitaly.server_feature_flags
+
+ Gitlab::GitalyClient.connection_data(project.repository_storage).merge(features: gitaly_features)
end
def gitaly_repository(project)
- {
- storage_name: project.repository_storage,
- relative_path: project.disk_path + '.git',
- gl_repository: repo_type.identifier_for_container(project),
- gl_project_path: repo_type.repository_for(project).full_path
- }
+ project.repository.gitaly_repository.to_h
end
def check_feature_enabled
@@ -61,7 +53,12 @@ module API
end
def increment_unique_events
- events = params[:unique_counters]&.slice(:agent_users_using_ci_tunnel)
+ events = params[:unique_counters]&.slice(
+ :agent_users_using_ci_tunnel,
+ :k8s_api_proxy_requests_unique_users_via_ci_access, :k8s_api_proxy_requests_unique_agents_via_ci_access,
+ :k8s_api_proxy_requests_unique_users_via_user_access, :k8s_api_proxy_requests_unique_agents_via_user_access,
+ :flux_git_push_notified_unique_projects
+ )
events&.each do |event, entity_ids|
increment_unique_values(event, entity_ids)
@@ -69,7 +66,10 @@ module API
end
def increment_count_events
- events = params[:counters]&.slice(:gitops_sync, :k8s_api_proxy_request, :flux_git_push_notifications_total)
+ events = params[:counters]&.slice(
+ :gitops_sync, :k8s_api_proxy_request, :flux_git_push_notifications_total,
+ :k8s_api_proxy_requests_via_ci_access, :k8s_api_proxy_requests_via_user_access
+ )
Gitlab::UsageDataCounters::KubernetesAgentCounter.increment_event_counts(events)
end
@@ -185,7 +185,7 @@ module API
# Load agent
agent = ::Clusters::Agent.find(params[:agent_id])
- unauthorized!('Feature disabled for agent') unless ::Gitlab::Kas::UserAccess.enabled_for?(agent)
+ unauthorized!('Feature disabled for agent') unless ::Gitlab::Kas::UserAccess.enabled?
service_response = ::Clusters::Agents::AuthorizeProxyUserService.new(user, agent).execute
render_api_error!(service_response[:message], service_response[:reason]) unless service_response.success?
@@ -203,10 +203,17 @@ module API
optional :gitops_sync, type: Integer, desc: 'The count to increment the gitops_sync metric by'
optional :k8s_api_proxy_request, type: Integer, desc: 'The count to increment the k8s_api_proxy_request metric by'
optional :flux_git_push_notifications_total, type: Integer, desc: 'The count to increment the flux_git_push_notifications_total metrics by'
+ optional :k8s_api_proxy_requests_via_ci_access, type: Integer, desc: 'The count to increment the k8s_api_proxy_requests_via_ci_access metric by'
+ optional :k8s_api_proxy_requests_via_user_access, type: Integer, desc: 'The count to increment the k8s_api_proxy_requests_via_user_access metric by'
end
optional :unique_counters, type: Hash do
optional :agent_users_using_ci_tunnel, type: Array[Integer], desc: 'An array of user ids that have interacted with CI Tunnel'
+ optional :k8s_api_proxy_requests_unique_users_via_ci_access, type: Array[Integer], desc: 'An array of users that have interacted with the CI tunnel via `ci_access`'
+ optional :k8s_api_proxy_requests_unique_agents_via_ci_access, type: Array[Integer], desc: 'An array of agents that have interacted with the CI tunnel via `ci_access`'
+ optional :k8s_api_proxy_requests_unique_users_via_user_access, type: Array[Integer], desc: 'An array of users that have interacted with the CI tunnel via `user_access`'
+ optional :k8s_api_proxy_requests_unique_agents_via_user_access, type: Array[Integer], desc: 'An array of agents that have interacted with the CI tunnel via `user_access`'
+ optional :flux_git_push_notified_unique_projects, type: Array[Integer], desc: 'An array of projects that have been notified to reconcile their Flux workloads'
end
end
post '/', feature_category: :deployment_management do
diff --git a/lib/api/lint.rb b/lib/api/lint.rb
index dee04b6bb00..71965fc05c9 100644
--- a/lib/api/lint.rb
+++ b/lib/api/lint.rb
@@ -4,34 +4,6 @@ module API
class Lint < ::API::Base
feature_category :pipeline_composition
- helpers do
- def can_lint_ci?
- signup_unrestricted = Gitlab::CurrentSettings.signup_enabled? && !Gitlab::CurrentSettings.signup_limited?
- internal_user = current_user.present? && !current_user.external?
- is_developer = current_user.present? && current_user.projects.any? { |p| p.member?(current_user, Gitlab::Access::DEVELOPER) }
-
- signup_unrestricted || internal_user || is_developer
- end
- end
-
- namespace :ci do
- desc 'REMOVED: Validates the .gitlab-ci.yml content' do
- detail 'Checks if CI/CD YAML configuration is valid'
- success code: 200, model: Entities::Ci::Lint::Result
- tags %w[ci_lint]
- end
- params do
- requires :content, type: String, desc: 'The CI/CD configuration content'
- optional :include_merged_yaml, type: Boolean, desc: 'If the expanded CI/CD configuration should be included in the response'
- optional :include_jobs, type: Boolean, desc: 'If the list of jobs should be included in the response. This is
- false by default'
- end
-
- post '/lint', urgency: :low do
- render_api_error!('410 Gone', 410)
- end
- end
-
resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
desc 'Validates a CI YAML configuration with a namespace' do
detail 'Checks if a project’s latest (HEAD of the project’s default branch) .gitlab-ci.yml configuration is
diff --git a/lib/api/markdown.rb b/lib/api/markdown.rb
index 5ef60ab0b94..08b172cd608 100644
--- a/lib/api/markdown.rb
+++ b/lib/api/markdown.rb
@@ -40,10 +40,7 @@ module API
context[:skip_project_check] = true
end
- # Disable comments in markdown for IE browsers because comments in IE
- # could allow script execution.
- browser = Browser.new(headers['User-Agent'])
- context[:allow_comments] = !browser.ie?
+ context[:allow_comments] = false
present({ html: Banzai.render_and_post_process(params[:text], context) }, with: Entities::Markdown)
end
diff --git a/lib/api/maven_packages.rb b/lib/api/maven_packages.rb
index 241cd93f380..eccc55ed158 100644
--- a/lib/api/maven_packages.rb
+++ b/lib/api/maven_packages.rb
@@ -23,14 +23,10 @@ module API
helpers ::API::Helpers::PackagesHelpers
helpers ::API::Helpers::Packages::DependencyProxyHelpers
+ helpers ::API::Helpers::Packages::Maven
helpers ::API::Helpers::Packages::Maven::BasicAuthHelpers
helpers do
- params :path_and_file_name do
- requires :path, type: String, desc: 'Package path', documentation: { example: 'foo/bar/mypkg/1.0-SNAPSHOT' }
- requires :file_name, type: String, desc: 'Package file name', documentation: { example: 'mypkg-1.0-SNAPSHOT.jar' }
- end
-
def path_exists?(path)
return false if path.blank?
diff --git a/lib/api/merge_requests.rb b/lib/api/merge_requests.rb
index c29a7eee923..ff9d0e2c371 100644
--- a/lib/api/merge_requests.rb
+++ b/lib/api/merge_requests.rb
@@ -124,6 +124,10 @@ module API
merge_requests.each { |mr| mr.check_mergeability(async: true) }
end
+ def batch_process_mergeability_checks(merge_requests)
+ ::MergeRequests::MergeabilityCheckBatchService.new(merge_requests, current_user).execute
+ end
+
params :merge_requests_params do
use :merge_requests_base_params
use :optional_merge_requests_search_params
@@ -177,8 +181,16 @@ module API
get ":id/merge_requests", feature_category: :code_review_workflow, urgency: :low do
validate_search_rate_limit! if declared_params[:search].present?
merge_requests = find_merge_requests(group_id: user_group.id, include_subgroups: true)
+ options = serializer_options_for(merge_requests).merge(group: user_group)
+
+ if !options[:skip_merge_status_recheck] && ::Feature.enabled?(:batched_api_mergeability_checks, user_group)
+ batch_process_mergeability_checks(merge_requests)
+
+ # NOTE: skipping individual mergeability checks in the presenter
+ options[:skip_merge_status_recheck] = true
+ end
- present merge_requests, serializer_options_for(merge_requests).merge(group: user_group)
+ present merge_requests, options
end
end
diff --git a/lib/api/ml_model_packages.rb b/lib/api/ml_model_packages.rb
index fec72b03ffd..35d231d9fe1 100644
--- a/lib/api/ml_model_packages.rb
+++ b/lib/api/ml_model_packages.rb
@@ -6,7 +6,7 @@ module API
include ::API::Helpers::Authentication
ML_MODEL_PACKAGES_REQUIREMENTS = {
- package_name: API::NO_SLASH_URL_PART_REGEX,
+ model_name: API::NO_SLASH_URL_PART_REGEX,
file_name: API::NO_SLASH_URL_PART_REGEX
}.freeze
@@ -47,15 +47,15 @@ module API
resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
namespace ':id/packages/ml_models' do
params do
- requires :package_name, type: String, desc: 'Package name', regexp: Gitlab::Regex.ml_model_name_regex,
+ requires :model_name, type: String, desc: 'Model name', regexp: Gitlab::Regex.ml_model_name_regex,
file_path: true
- requires :package_version, type: String, desc: 'Package version',
+ requires :model_version, type: String, desc: 'Model version',
regexp: Gitlab::Regex.ml_model_version_regex
requires :file_name, type: String, desc: 'Package file name',
regexp: Gitlab::Regex.ml_model_file_name_regex, file_path: true
optional :status, type: String, values: ALLOWED_STATUSES, desc: 'Package status'
end
- namespace ':package_name/*package_version/:file_name', requirements: ML_MODEL_PACKAGES_REQUIREMENTS do
+ namespace ':model_name/*model_version/:file_name', requirements: ML_MODEL_PACKAGES_REQUIREMENTS do
desc 'Workhorse authorize model package file' do
detail 'Introduced in GitLab 16.1'
success code: 200
@@ -71,7 +71,7 @@ module API
end
desc 'Workhorse upload model package file' do
- detail 'Introduced in GitLab 16.1'
+ detail 'Introduced in GitLab 16.2'
success code: 201
failure [
{ code: 401, message: 'Unauthorized' },
@@ -91,7 +91,12 @@ module API
bad_request!('File is too large') if max_file_size_exceeded?
- create_package_file_params = declared(params).merge(build: current_authenticated_job)
+ create_package_file_params = declared(params).merge(
+ build: current_authenticated_job,
+ package_name: params[:model_name],
+ package_version: params[:model_version]
+ )
+
package_file = ::Packages::MlModel::CreatePackageFileService
.new(project, current_user, create_package_file_params)
.execute
@@ -104,6 +109,26 @@ module API
forbidden!
end
+
+ desc 'Download an ml_model package file' do
+ detail 'This feature was introduced in GitLab 16.2'
+ success code: 200
+ failure [
+ { code: 401, message: 'Unauthorized' },
+ { code: 403, message: 'Forbidden' },
+ { code: 404, message: 'Not Found' }
+ ]
+ tags %w[ml_model_registry]
+ end
+ get do
+ authorize_read_package!(project)
+
+ package = ::Packages::MlModel::PackageFinder.new(project)
+ .execute!(params[:model_name], params[:model_version])
+ package_file = ::Packages::PackageFileFinder.new(package, params[:file_name]).execute!
+
+ present_package_file!(package_file)
+ end
end
end
end
diff --git a/lib/api/npm_instance_packages.rb b/lib/api/npm_instance_packages.rb
index 8215296b617..ea92818e76c 100644
--- a/lib/api/npm_instance_packages.rb
+++ b/lib/api/npm_instance_packages.rb
@@ -6,10 +6,6 @@ module API
feature_category :package_registry
urgency :low
- rescue_from ActiveRecord::RecordInvalid do |e|
- render_api_error!(e.message, 400)
- end
-
helpers do
def endpoint_scope
:instance
diff --git a/lib/api/npm_project_packages.rb b/lib/api/npm_project_packages.rb
index 61409909b06..e1d0455b1e2 100644
--- a/lib/api/npm_project_packages.rb
+++ b/lib/api/npm_project_packages.rb
@@ -7,7 +7,7 @@ module API
urgency :low
rescue_from ActiveRecord::RecordInvalid do |e|
- render_api_error!(e.message, 400)
+ render_structured_api_error!({ message: e.message, error: e.message }, 400)
end
helpers do
@@ -78,8 +78,9 @@ module API
.new(project, current_user, params.merge(build: current_authenticated_job)).execute
if created_package[:status] == :error
- render_api_error!(created_package[:message], created_package[:http_status])
+ render_structured_api_error!({ message: created_package[:message], error: created_package[:message] }, created_package[:http_status])
else
+ enqueue_sync_metadata_cache_worker(project, created_package.name)
track_package_event('push_package', :npm, category: 'API::NpmPackages', project: project, namespace: project.namespace)
created_package
end
diff --git a/lib/api/package_files.rb b/lib/api/package_files.rb
index 7ff49f326d9..6a02769519f 100644
--- a/lib/api/package_files.rb
+++ b/lib/api/package_files.rb
@@ -14,6 +14,7 @@ module API
urgency :low
helpers ::API::Helpers::PackagesHelpers
+ helpers ::API::Helpers::Packages::Npm
params do
requires :id, types: [String, Integer], desc: 'ID or URL-encoded path of the project'
@@ -70,6 +71,8 @@ module API
destroy_conditionally!(package_file) do |package_file|
package_file.pending_destruction!
+
+ enqueue_sync_metadata_cache_worker(user_project, package.name) if package.npm?
end
end
end
diff --git a/lib/api/project_export.rb b/lib/api/project_export.rb
index 19e5ed3f9e0..8a72ec051dc 100644
--- a/lib/api/project_export.rb
+++ b/lib/api/project_export.rb
@@ -127,8 +127,13 @@ module API
]
tags ['project_export']
end
+ params do
+ optional :batched, type: Boolean, desc: 'Whether to export in batches'
+ end
post ':id/export_relations' do
- response = ::BulkImports::ExportService.new(portable: user_project, user: current_user).execute
+ response = ::BulkImports::ExportService
+ .new(portable: user_project, user: current_user, batched: params[:batched])
+ .execute
if response.success?
accepted!
@@ -152,19 +157,33 @@ module API
produces %w[application/octet-stream application/json]
end
params do
- requires :relation,
- type: String,
- project_portable: true,
- desc: 'Project relation name'
+ requires :relation, type: String, project_portable: true, desc: 'Project relation name'
+ optional :batched, type: Boolean, desc: 'Whether to download in batches'
+ optional :batch_number, type: Integer, desc: 'Batch number to download'
+
+ all_or_none_of :batched, :batch_number
end
get ':id/export_relations/download' do
export = user_project.bulk_import_exports.find_by_relation(params[:relation])
- file = export&.upload&.export_file
- if file
- present_carrierwave_file!(file)
+ break render_api_error!('Export not found', 404) unless export
+
+ if params[:batched]
+ batch = export.batches.find_by_batch_number(params[:batch_number])
+ batch_file = batch&.upload&.export_file
+
+ break render_api_error!('Export is not batched', 400) unless export.batched?
+ break render_api_error!('Batch not found', 404) unless batch
+ break render_api_error!('Batch file not found', 404) unless batch_file
+
+ present_carrierwave_file!(batch_file)
else
- render_api_error!('404 Not found', 404)
+ file = export&.upload&.export_file
+
+ break render_api_error!('Export is batched', 400) if export.batched?
+ break render_api_error!('Export file not found', 404) unless file
+
+ present_carrierwave_file!(file)
end
end
@@ -180,8 +199,19 @@ module API
]
tags ['project_export']
end
+ params do
+ optional :relation, type: String, desc: 'Project relation name'
+ end
get ':id/export_relations/status' do
- present user_project.bulk_import_exports, with: Entities::BulkImports::ExportStatus
+ if params[:relation]
+ export = user_project.bulk_import_exports.find_by_relation(params[:relation])
+
+ break render_api_error!('Export not found', 404) unless export
+
+ present export, with: Entities::BulkImports::ExportStatus
+ else
+ present user_project.bulk_import_exports, with: Entities::BulkImports::ExportStatus
+ end
end
end
end
diff --git a/lib/api/project_hooks.rb b/lib/api/project_hooks.rb
index db97f4988e1..c9cba397f5c 100644
--- a/lib/api/project_hooks.rb
+++ b/lib/api/project_hooks.rb
@@ -31,6 +31,7 @@ module API
optional :wiki_page_events, type: Boolean, desc: "Trigger hook on wiki events"
optional :deployment_events, type: Boolean, desc: "Trigger hook on deployment events"
optional :releases_events, type: Boolean, desc: "Trigger hook on release events"
+ optional :emoji_events, type: Boolean, desc: "Trigger hook on emoji events"
optional :enable_ssl_verification, type: Boolean, desc: "Do SSL verification when triggering the hook"
optional :token, type: String, desc: "Secret token to validate received payloads; this will not be returned in the response"
optional :push_events_branch_filter, type: String, desc: "Trigger hook on specified branch only"
diff --git a/lib/api/project_packages.rb b/lib/api/project_packages.rb
index 43bd15931ef..2aa6858e41d 100644
--- a/lib/api/project_packages.rb
+++ b/lib/api/project_packages.rb
@@ -15,6 +15,7 @@ module API
urgency :low
helpers ::API::Helpers::PackagesHelpers
+ helpers ::API::Helpers::Packages::Npm
helpers do
def package
strong_memoize(:package) do # rubocop:disable Gitlab/StrongMemoizeAttr
@@ -133,6 +134,8 @@ module API
destroy_conditionally!(package) do |package|
::Packages::MarkPackageForDestructionService.new(container: package, current_user: current_user).execute
+
+ enqueue_sync_metadata_cache_worker(user_project, package.name) if package.npm?
end
end
end
diff --git a/lib/api/projects.rb b/lib/api/projects.rb
index 7ec9f72e0b2..468f284f136 100644
--- a/lib/api/projects.rb
+++ b/lib/api/projects.rb
@@ -251,6 +251,28 @@ module API
present_projects load_projects
end
+ desc 'Get projects that a user has contributed to' do
+ success code: 200, model: Entities::BasicProjectDetails
+ failure [{ code: 404, message: '404 User Not Found' }]
+ tags %w[projects]
+ is_array true
+ end
+ params do
+ requires :user_id, type: String, desc: 'The ID or username of the user'
+ use :sort_params
+ use :pagination
+
+ optional :simple, type: Boolean, default: false,
+ desc: 'Return only the ID, URL, name, and path of each project'
+ end
+ get ":user_id/contributed_projects", feature_category: :groups_and_projects, urgency: :low do
+ user = find_user(params[:user_id])
+ not_found!('User') unless user
+
+ contributed_projects = ContributedProjectsFinder.new(user).execute(current_user).joined(user)
+ present_projects contributed_projects
+ end
+
desc 'Get projects starred by a user' do
success code: 200, model: Entities::BasicProjectDetails
failure [{ code: 404, message: '404 User Not Found' }]
@@ -534,7 +556,6 @@ module API
attrs = translate_params_for_compatibility(attrs)
attrs = add_import_params(attrs)
filter_attributes_using_license!(attrs)
- filter_attributes_under_feature_flag!(attrs, user_project)
verify_update_project_attrs!(user_project, attrs)
user_project.remove_avatar! if attrs.key?(:avatar) && attrs[:avatar].nil?
diff --git a/lib/api/remote_mirrors.rb b/lib/api/remote_mirrors.rb
index c3c7d9370e0..5346476ed0d 100644
--- a/lib/api/remote_mirrors.rb
+++ b/lib/api/remote_mirrors.rb
@@ -67,7 +67,7 @@ module API
end
post ':id/remote_mirrors' do
create_params = declared_params(include_missing: false)
- verify_mirror_branches_setting(create_params, user_project)
+ verify_mirror_branches_setting(create_params)
new_mirror = user_project.remote_mirrors.create(create_params)
if new_mirror.persisted?
@@ -99,7 +99,7 @@ module API
mirror_params = declared_params(include_missing: false)
mirror_params[:id] = mirror_params.delete(:mirror_id)
- verify_mirror_branches_setting(mirror_params, user_project)
+ verify_mirror_branches_setting(mirror_params)
update_params = { remote_mirrors_attributes: mirror_params }
result = ::Projects::UpdateService
diff --git a/lib/api/search.rb b/lib/api/search.rb
index 954c3cd9f9e..b14fce13f5e 100644
--- a/lib/api/search.rb
+++ b/lib/api/search.rb
@@ -59,6 +59,8 @@ module API
end
def search(additional_params = {})
+ return Kaminari.paginate_array([]) if @project.present? && !project_scope_allowed?
+
search_service = search_service(additional_params)
if search_service.global_search? && !search_service.global_search_enabled_for_scope?
forbidden!('Global Search is disabled for this scope')
@@ -95,6 +97,10 @@ module API
)
end
+ def project_scope_allowed?
+ ::Search::Navigation.new(user: current_user, project: @project).tab_enabled_for_project?(params[:scope].to_sym)
+ end
+
def snippets?
%w(snippet_titles).include?(params[:scope]).to_s
end
@@ -108,9 +114,7 @@ module API
end
def verify_search_scope!(resource:)
- # In EE we have additional validation requirements for searches.
- # Defining this method here as a noop allows us to easily extend it in
- # EE, without having to modify this file directly.
+ # no-op
end
def search_type(additional_params = {})
diff --git a/lib/api/settings.rb b/lib/api/settings.rb
index 5d20444cb54..b12ca48829b 100644
--- a/lib/api/settings.rb
+++ b/lib/api/settings.rb
@@ -203,6 +203,13 @@ module API
optional :allow_runner_registration_token, type: Boolean, desc: 'Allow registering runners using a registration token'
optional :ci_max_includes, type: Integer, desc: 'Maximum number of includes per pipeline'
optional :security_policy_global_group_approvers_enabled, type: Boolean, desc: 'Query scan result policy approval groups globally'
+ optional :slack_app_enabled, type: Grape::API::Boolean, desc: 'Enable the GitLab for Slack app'
+ given slack_app_enabled: -> (val) { val } do
+ requires :slack_app_id, type: String, desc: 'The client ID of the GitLab for Slack app'
+ requires :slack_app_secret, type: String, desc: 'The client secret of the GitLab for Slack app. Used for authenticating OAuth requests from the app'
+ requires :slack_app_signing_secret, type: String, desc: 'The signing secret of the GitLab for Slack app. Used for authenticating API requests from the app'
+ requires :slack_app_verification_token, type: String, desc: 'The verification token of the GitLab for Slack app. This method of authentication is deprecated by Slack and used only for authenticating slash commands from the app'
+ end
Gitlab::SSHPublicKey.supported_types.each do |type|
optional :"#{type}_key_restriction",
diff --git a/lib/api/usage_data.rb b/lib/api/usage_data.rb
index 3e2023d769f..0a343093c33 100644
--- a/lib/api/usage_data.rb
+++ b/lib/api/usage_data.rb
@@ -53,6 +53,38 @@ module API
status :ok
end
+ desc 'Track gitlab internal events' do
+ detail 'This feature was introduced in GitLab 16.2.'
+ success code: 200
+ failure [
+ { code: 403, message: 'Invalid CSRF token is provided' },
+ { code: 404, message: 'Not found' }
+ ]
+ tags %w[usage_data]
+ end
+ params do
+ requires :event, type: String, desc: 'The event name that should be tracked',
+ documentation: { example: 'i_quickactions_page' }
+ optional :namespace_id, type: Integer, desc: 'Namespace ID',
+ documentation: { example: 1234 }
+ optional :project_id, type: Integer, desc: 'Project ID',
+ documentation: { example: 1234 }
+ end
+ post 'track_event', urgency: :low do
+ event_name = params[:event]
+ namespace_id = params[:namespace_id]
+ project_id = params[:project_id]
+
+ track_event(
+ event_name,
+ user_id: current_user.id,
+ namespace_id: namespace_id,
+ project_id: project_id
+ )
+
+ status :ok
+ end
+
desc 'Get a list of all metric definitions' do
detail 'This feature was introduced in GitLab 13.11.'
success code: 200
diff --git a/lib/api/user_runners.rb b/lib/api/user_runners.rb
new file mode 100644
index 00000000000..edbd0214bb8
--- /dev/null
+++ b/lib/api/user_runners.rb
@@ -0,0 +1,72 @@
+# frozen_string_literal: true
+
+module API
+ class UserRunners < ::API::Base
+ include APIGuard
+
+ resource :user do
+ before do
+ authenticate!
+ end
+
+ allow_access_with_scope :create_runner, if: ->(request) { request.post? }
+
+ desc 'Create a runner owned by currently authenticated user' do
+ detail 'Create a new runner'
+ success Entities::Ci::RunnerRegistrationDetails
+ failure [[400, 'Bad Request'], [403, 'Forbidden']]
+ tags %w[user runners]
+ end
+ params do
+ requires :runner_type, type: String, values: ::Ci::Runner.runner_types.keys,
+ desc: %q(Specifies the scope of the runner)
+ given runner_type: ->(runner_type) { runner_type == 'group_type' } do
+ requires :group_id, type: Integer,
+ desc: 'The ID of the group that the runner is created in',
+ documentation: { example: 1 }
+ end
+ given runner_type: ->(runner_type) { runner_type == 'project_type' } do
+ requires :project_id, type: Integer,
+ desc: 'The ID of the project that the runner is created in',
+ documentation: { example: 1 }
+ end
+ optional :description, type: String, desc: %q(Description of the runner)
+ optional :maintenance_note, type: String,
+ desc: %q(Free-form maintenance notes for the runner (1024 characters))
+ optional :paused, type: Boolean, desc: 'Specifies if the runner should ignore new jobs (defaults to false)'
+ optional :locked, type: Boolean,
+ desc: 'Specifies if the runner should be locked for the current project (defaults to false)'
+ optional :access_level, type: String, values: ::Ci::Runner.access_levels.keys,
+ desc: 'The access level of the runner'
+ optional :run_untagged, type: Boolean,
+ desc: 'Specifies if the runner should handle untagged jobs (defaults to true)'
+ optional :tag_list, type: Array[String], coerce_with: ::API::Validations::Types::CommaSeparatedToArray.coerce,
+ desc: %q(A list of runner tags)
+ optional :maximum_timeout, type: Integer,
+ desc: 'Maximum timeout that limits the amount of time (in seconds) that runners can run jobs'
+ end
+ post 'runners', urgency: :low, feature_category: :runner_fleet do
+ attributes = attributes_for_keys(
+ %i[runner_type group_id project_id description maintenance_note paused locked run_untagged tag_list
+ access_level maximum_timeout]
+ )
+
+ case attributes[:runner_type]
+ when 'group_type'
+ attributes[:scope] = ::Group.find_by_id(attributes.delete(:group_id))
+ when 'project_type'
+ attributes[:scope] = ::Project.find_by_id(attributes.delete(:project_id))
+ end
+
+ result = ::Ci::Runners::CreateRunnerService.new(user: current_user, params: attributes).execute
+ if result.error?
+ message = result.errors.to_sentence
+ forbidden!(message) if result.reason == :forbidden
+ bad_request!(message)
+ end
+
+ present result.payload[:runner], with: Entities::Ci::RunnerRegistrationDetails
+ end
+ end
+ end
+end
diff --git a/lib/api/users.rb b/lib/api/users.rb
index ff36a4cfe95..fff0e9fee06 100644
--- a/lib/api/users.rb
+++ b/lib/api/users.rb
@@ -6,7 +6,7 @@ module API
include APIGuard
include Helpers::CustomAttributes
- allow_access_with_scope :read_user, if: -> (request) { request.get? || request.head? }
+ allow_access_with_scope :read_user, if: ->(request) { request.get? || request.head? }
feature_category :user_profile,
%w[
@@ -134,7 +134,7 @@ module API
entity = current_user&.can_read_all_resources? ? Entities::UserWithAdmin : Entities::UserBasic
if entity == Entities::UserWithAdmin
- users = users.preload(:identities, :webauthn_registrations, :namespace, :followers, :followees, :user_preference)
+ users = users.preload(:identities, :webauthn_registrations, :namespace, :followers, :followees, :user_preference, :user_detail)
end
users, options = with_custom_attributes(users, { with: entity, current_user: current_user })
@@ -1369,63 +1369,6 @@ module API
get 'status', feature_category: :user_profile do
present current_user.status || {}, with: Entities::UserStatus
end
-
- desc 'Create a runner owned by currently authenticated user' do
- detail 'Create a new runner'
- success Entities::Ci::RunnerRegistrationDetails
- failure [[400, 'Bad Request'], [403, 'Forbidden']]
- tags %w[user runners]
- end
- params do
- requires :runner_type, type: String, values: ::Ci::Runner.runner_types.keys,
- desc: %q(Specifies the scope of the runner)
- given runner_type: ->(runner_type) { runner_type == 'group_type' } do
- requires :group_id, type: Integer,
- desc: 'The ID of the group that the runner is created in',
- documentation: { example: 1 }
- end
- given runner_type: ->(runner_type) { runner_type == 'project_type' } do
- requires :project_id, type: Integer,
- desc: 'The ID of the project that the runner is created in',
- documentation: { example: 1 }
- end
- optional :description, type: String, desc: %q(Description of the runner)
- optional :maintenance_note, type: String,
- desc: %q(Free-form maintenance notes for the runner (1024 characters))
- optional :paused, type: Boolean, desc: 'Specifies if the runner should ignore new jobs (defaults to false)'
- optional :locked, type: Boolean,
- desc: 'Specifies if the runner should be locked for the current project (defaults to false)'
- optional :access_level, type: String, values: ::Ci::Runner.access_levels.keys,
- desc: 'The access level of the runner'
- optional :run_untagged, type: Boolean,
- desc: 'Specifies if the runner should handle untagged jobs (defaults to true)'
- optional :tag_list, type: Array[String], coerce_with: ::API::Validations::Types::CommaSeparatedToArray.coerce,
- desc: %q(A list of runner tags)
- optional :maximum_timeout, type: Integer,
- desc: 'Maximum timeout that limits the amount of time (in seconds) that runners can run jobs'
- end
- post 'runners', urgency: :low, feature_category: :runner_fleet do
- attributes = attributes_for_keys(
- %i[runner_type group_id project_id description maintenance_note paused locked run_untagged tag_list
- access_level maximum_timeout]
- )
-
- case attributes[:runner_type]
- when 'group_type'
- attributes[:scope] = ::Group.find_by_id(attributes.delete(:group_id))
- when 'project_type'
- attributes[:scope] = ::Project.find_by_id(attributes.delete(:project_id))
- end
-
- result = ::Ci::Runners::CreateRunnerService.new(user: current_user, params: attributes).execute
- if result.error?
- message = result.errors.to_sentence
- forbidden!(message) if result.reason == :forbidden
- bad_request!(message)
- end
-
- present result.payload[:runner], with: Entities::Ci::RunnerRegistrationDetails
- end
end
end
end
diff --git a/lib/atlassian/jira_connect/serializers/build_entity.rb b/lib/atlassian/jira_connect/serializers/build_entity.rb
index b595d0c2a92..31ab4ece8fe 100644
--- a/lib/atlassian/jira_connect/serializers/build_entity.rb
+++ b/lib/atlassian/jira_connect/serializers/build_entity.rb
@@ -22,13 +22,7 @@ module Atlassian
expose :references
def issue_keys
- commit_message_issue_keys = JiraIssueKeyExtractor.new(pipeline.git_commit_message).issue_keys
-
- # extract Jira issue keys from either the source branch/ref or the merge request title.
- @issue_keys ||= commit_message_issue_keys + pipeline.all_merge_requests.flat_map do |mr|
- src = "#{mr.source_branch} #{mr.title} #{mr.description}"
- JiraIssueKeyExtractor.new(src).issue_keys
- end.uniq
+ @issue_keys ||= (pipeline_commit_issue_keys + pipeline_mrs_issue_keys).uniq
end
private
@@ -89,6 +83,18 @@ module Atlassian
def update_sequence_id
options[:update_sequence_id] || Client.generate_update_sequence_id
end
+
+ def pipeline_commit_issue_keys
+ JiraIssueKeyExtractor.new(pipeline.git_commit_message).issue_keys
+ end
+
+ # Extract Jira issue keys from either the source branch/ref, merge request title or merge request description.
+ def pipeline_mrs_issue_keys
+ pipeline.all_merge_requests.flat_map do |mr|
+ src = "#{mr.source_branch} #{mr.title} #{mr.description}"
+ JiraIssueKeyExtractor.new(src).issue_keys
+ end
+ end
end
end
end
diff --git a/lib/atlassian/jira_connect/serializers/deployment_entity.rb b/lib/atlassian/jira_connect/serializers/deployment_entity.rb
index 9ef1666b61c..96e7b1726cb 100644
--- a/lib/atlassian/jira_connect/serializers/deployment_entity.rb
+++ b/lib/atlassian/jira_connect/serializers/deployment_entity.rb
@@ -6,6 +6,8 @@ module Atlassian
class DeploymentEntity < Grape::Entity
include Gitlab::Routing
+ COMMITS_LIMIT = 5_000
+
format_with(:iso8601, &:iso8601)
expose :schema_version, as: :schemaVersion
@@ -22,9 +24,7 @@ module Atlassian
expose :environment_entity, as: :environment
def issue_keys
- return [] unless build&.pipeline.present?
-
- @issue_keys ||= BuildEntity.new(build.pipeline).issue_keys
+ @issue_keys ||= (issue_keys_from_pipeline + issue_keys_from_commits_since_last_deploy).uniq
end
private
@@ -74,7 +74,7 @@ module Atlassian
end
def pipeline_entity
- PipelineEntity.new(build.pipeline) if build&.pipeline.present?
+ PipelineEntity.new(build.pipeline) if pipeline?
end
def environment_entity
@@ -84,6 +84,44 @@ module Atlassian
def update_sequence_id
options[:update_sequence_id] || Client.generate_update_sequence_id
end
+
+ def pipeline?
+ build&.pipeline.present?
+ end
+
+ def issue_keys_from_pipeline
+ return [] unless pipeline?
+
+ BuildEntity.new(build.pipeline).issue_keys
+ end
+
+ # Extract Jira issue keys from commits made to the deployment's branch or tag
+ # since the last successful deployment was made to the environment.
+ def issue_keys_from_commits_since_last_deploy
+ return [] if Feature.disabled?(:jira_deployment_issue_keys, project)
+
+ last_deployed_commit = environment
+ .successful_deployments
+ .id_not_in(deployment.id)
+ .ordered
+ .find_by_ref(deployment.ref)
+ &.commit
+
+ commits = project.repository.commits(
+ deployment.ref,
+ before: deployment.commit.created_at,
+ after: last_deployed_commit&.created_at,
+ skip_merges: true,
+ limit: COMMITS_LIMIT
+ )
+
+ # Include this deploy's commit, as the `before:` param in `Repository#list_commits_by` excluded it.
+ commits << deployment.commit
+
+ commits.flat_map do |commit|
+ JiraIssueKeyExtractor.new(commit.message).issue_keys
+ end.compact
+ end
end
end
end
diff --git a/lib/backup/database.rb b/lib/backup/database.rb
index 28bc78a3932..12656cb3702 100644
--- a/lib/backup/database.rb
+++ b/lib/backup/database.rb
@@ -63,7 +63,7 @@ module Backup
progress.flush
end
ensure
- ::Gitlab::Database::EachDatabase.each_database_connection(
+ ::Gitlab::Database::EachDatabase.each_connection(
only: base_models_for_backup.keys, include_shared: false
) do |connection, _|
Gitlab::Database::TransactionTimeoutSettings.new(connection).restore_timeouts
@@ -259,7 +259,7 @@ module Backup
@database_to_snapshot_id = {}
if @database_to_snapshot_id.empty?
- ::Gitlab::Database::EachDatabase.each_database_connection(
+ ::Gitlab::Database::EachDatabase.each_connection(
only: base_models_for_backup.keys, include_shared: false
) do |connection, database_name|
@database_to_snapshot_id[database_name] = nil
diff --git a/lib/backup/repositories.rb b/lib/backup/repositories.rb
index 56726665d14..199da8821d9 100644
--- a/lib/backup/repositories.rb
+++ b/lib/backup/repositories.rb
@@ -58,8 +58,11 @@ module Backup
end
def enqueue_consecutive_projects
- project_relation.find_each(batch_size: 1000) do |project|
- enqueue_project(project)
+ cross_join_issue = "https://gitlab.com/gitlab-org/gitlab/-/issues/417467"
+ ::Gitlab::Database.allow_cross_joins_across_databases(url: cross_join_issue) do
+ project_relation.find_each(batch_size: 1000) do |project|
+ enqueue_project(project)
+ end
end
end
diff --git a/lib/banzai/filter/references/external_issue_reference_filter.rb b/lib/banzai/filter/references/external_issue_reference_filter.rb
index 1061a9917dd..ead816abab3 100644
--- a/lib/banzai/filter/references/external_issue_reference_filter.rb
+++ b/lib/banzai/filter/references/external_issue_reference_filter.rb
@@ -24,8 +24,15 @@ module Banzai
#
# Returns a String replaced with the return of the block.
def references_in(text, pattern = object_reference_pattern)
- text.gsub(pattern) do |match|
- yield match, $~[:issue]
+ case pattern
+ when Regexp
+ text.gsub(pattern) do |match|
+ yield match, $~[:issue]
+ end
+ when Gitlab::UntrustedRegexp
+ pattern.replace_gsub(text) do |match|
+ yield match, match[:issue]
+ end
end
end
diff --git a/lib/banzai/filter/references/reference_filter.rb b/lib/banzai/filter/references/reference_filter.rb
index a687ae2882e..5353d3f4e49 100644
--- a/lib/banzai/filter/references/reference_filter.rb
+++ b/lib/banzai/filter/references/reference_filter.rb
@@ -206,7 +206,8 @@ module Banzai
end
def replace_text_when_pattern_matches(node, index, pattern)
- return unless node.text =~ pattern
+ return if pattern.is_a?(Gitlab::UntrustedRegexp) && !pattern.match?(node.text)
+ return if pattern.is_a?(Regexp) && !(pattern =~ node.text)
content = node.to_html
html = yield content
diff --git a/lib/banzai/filter/references/user_reference_filter.rb b/lib/banzai/filter/references/user_reference_filter.rb
index d6b6fdb7149..a3784004087 100644
--- a/lib/banzai/filter/references/user_reference_filter.rb
+++ b/lib/banzai/filter/references/user_reference_filter.rb
@@ -65,10 +65,13 @@ module Banzai
# The keys of this Hash are the namespace paths, the values the
# corresponding Namespace objects.
def namespaces
- @namespaces ||= Namespace.eager_load(:owner, :route)
- .where_full_path_in(usernames)
- .index_by(&:full_path)
- .transform_keys(&:downcase)
+ cross_join_issue = "https://gitlab.com/gitlab-org/gitlab/-/issues/417466"
+ Gitlab::Database.allow_cross_joins_across_databases(url: cross_join_issue) do
+ @namespaces ||= Namespace.eager_load(:owner, :route)
+ .where_full_path_in(usernames)
+ .index_by(&:full_path)
+ .transform_keys(&:downcase)
+ end
end
# Returns all usernames referenced in the current document.
diff --git a/lib/banzai/pipeline/single_line_pipeline.rb b/lib/banzai/pipeline/single_line_pipeline.rb
index 0031ccc7011..f1dada9176f 100644
--- a/lib/banzai/pipeline/single_line_pipeline.rb
+++ b/lib/banzai/pipeline/single_line_pipeline.rb
@@ -9,6 +9,7 @@ module Banzai
Filter::SanitizationFilter,
Filter::AssetProxyFilter,
Filter::EmojiFilter,
+ Filter::CustomEmojiFilter,
Filter::AutolinkFilter,
Filter::ExternalLinkFilter,
*reference_filters
diff --git a/lib/banzai/reference_parser/user_parser.rb b/lib/banzai/reference_parser/user_parser.rb
index 48e2bcc9a11..ec96181e7f1 100644
--- a/lib/banzai/reference_parser/user_parser.rb
+++ b/lib/banzai/reference_parser/user_parser.rb
@@ -97,9 +97,12 @@ module Banzai
def find_users_for_groups(ids)
return [] if ids.empty?
- User.joins(:group_members).where(members: {
- source_id: Namespace.where(id: ids).where('mentions_disabled IS NOT TRUE').select(:id)
- }).to_a
+ cross_join_issue = "https://gitlab.com/gitlab-org/gitlab/-/issues/417466"
+ ::Gitlab::Database.allow_cross_joins_across_databases(url: cross_join_issue) do
+ User.joins(:group_members).where(members: {
+ source_id: Namespace.where(id: ids).where('mentions_disabled IS NOT TRUE').select(:id)
+ }).to_a
+ end
end
def find_users_for_projects(ids)
diff --git a/lib/bulk_imports/common/extractors/ndjson_extractor.rb b/lib/bulk_imports/common/extractors/ndjson_extractor.rb
index 04febebff8e..e1a0e5cf2fb 100644
--- a/lib/bulk_imports/common/extractors/ndjson_extractor.rb
+++ b/lib/bulk_imports/common/extractors/ndjson_extractor.rb
@@ -33,7 +33,7 @@ module BulkImports
def download_service(context)
@download_service ||= BulkImports::FileDownloadService.new(
configuration: context.configuration,
- relative_url: context.entity.relation_download_url_path(relation),
+ relative_url: context.entity.relation_download_url_path(relation, context.extra[:batch_number]),
tmpdir: tmpdir,
filename: filename
)
diff --git a/lib/bulk_imports/common/pipelines/lfs_objects_pipeline.rb b/lib/bulk_imports/common/pipelines/lfs_objects_pipeline.rb
index 68bd64dc2ff..0bf4d341aad 100644
--- a/lib/bulk_imports/common/pipelines/lfs_objects_pipeline.rb
+++ b/lib/bulk_imports/common/pipelines/lfs_objects_pipeline.rb
@@ -6,6 +6,8 @@ module BulkImports
class LfsObjectsPipeline
include Pipeline
+ file_extraction_pipeline!
+
def extract(_context)
download_service.execute
decompression_service.execute
@@ -48,7 +50,7 @@ module BulkImports
def download_service
BulkImports::FileDownloadService.new(
configuration: context.configuration,
- relative_url: context.entity.relation_download_url_path(relation),
+ relative_url: context.entity.relation_download_url_path(relation, context.extra[:batch_number]),
tmpdir: tmpdir,
filename: targz_filename
)
diff --git a/lib/bulk_imports/common/pipelines/uploads_pipeline.rb b/lib/bulk_imports/common/pipelines/uploads_pipeline.rb
index 06132791ea6..81ce20db9ab 100644
--- a/lib/bulk_imports/common/pipelines/uploads_pipeline.rb
+++ b/lib/bulk_imports/common/pipelines/uploads_pipeline.rb
@@ -10,6 +10,8 @@ module BulkImports
AvatarLoadingError = Class.new(StandardError)
+ file_extraction_pipeline!
+
def extract(_context)
download_service.execute
decompression_service.execute
@@ -46,7 +48,7 @@ module BulkImports
def download_service
BulkImports::FileDownloadService.new(
configuration: context.configuration,
- relative_url: context.entity.relation_download_url_path(relation),
+ relative_url: context.entity.relation_download_url_path(relation, context.extra[:batch_number]),
tmpdir: tmpdir,
filename: targz_filename
)
diff --git a/lib/container_registry/client.rb b/lib/container_registry/client.rb
index c879ec41d86..b83d67c359d 100644
--- a/lib/container_registry/client.rb
+++ b/lib/container_registry/client.rb
@@ -88,7 +88,7 @@ module ContainerRegistry
def supports_tag_delete?
strong_memoize(:supports_tag_delete) do
registry_features = Gitlab::CurrentSettings.container_registry_features || []
- next true if ::Gitlab.com? && registry_features.include?(REGISTRY_TAG_DELETE_FEATURE)
+ next true if ::Gitlab.com_except_jh? && registry_features.include?(REGISTRY_TAG_DELETE_FEATURE)
response = faraday.run_request(:options, '/v2/name/tags/reference/tag', '', {})
response.success? && response.headers['allow']&.include?('DELETE')
diff --git a/lib/container_registry/gitlab_api_client.rb b/lib/container_registry/gitlab_api_client.rb
index 00877bb5a48..f5982e96622 100644
--- a/lib/container_registry/gitlab_api_client.rb
+++ b/lib/container_registry/gitlab_api_client.rb
@@ -85,7 +85,7 @@ module ContainerRegistry
def supports_gitlab_api?
strong_memoize(:supports_gitlab_api) do
registry_features = Gitlab::CurrentSettings.container_registry_features || []
- next true if ::Gitlab.com? && registry_features.include?(REGISTRY_GITLAB_V1_API_FEATURE)
+ next true if ::Gitlab.com_except_jh? && registry_features.include?(REGISTRY_GITLAB_V1_API_FEATURE)
with_token_faraday do |faraday_client|
response = faraday_client.get('/gitlab/v1/')
diff --git a/lib/expand_variables.rb b/lib/expand_variables.rb
index 06160b55f5c..51a66958ba0 100644
--- a/lib/expand_variables.rb
+++ b/lib/expand_variables.rb
@@ -4,15 +4,15 @@ module ExpandVariables
VARIABLES_REGEXP = /\$([a-zA-Z_][a-zA-Z0-9_]*)|\${\g<1>}|%\g<1>%/.freeze
class << self
- def expand(value, variables)
- replace_with(value, variables) do |vars_hash, last_match|
- match_or_blank_value(vars_hash, last_match)
+ def expand(value, variables, expand_file_refs: true)
+ replace_with(value, variables) do |collection, last_match|
+ match_or_blank_value(collection, last_match, expand_file_refs: expand_file_refs)
end
end
- def expand_existing(value, variables)
- replace_with(value, variables) do |vars_hash, last_match|
- match_or_original_value(vars_hash, last_match)
+ def expand_existing(value, variables, expand_file_refs: true)
+ replace_with(value, variables) do |collection, last_match|
+ match_or_original_value(collection, last_match, expand_file_refs: expand_file_refs)
end
end
@@ -25,37 +25,32 @@ module ExpandVariables
private
def replace_with(value, variables)
- variables_hash = nil
+ # We lazily fabricate the variables collection in case there is no variable in the value string.
+ # `collection` needs to be initialized to nil here
+ # so that it is memoized in the closure block for `gsub`.
+ collection = nil
value.gsub(VARIABLES_REGEXP) do
- variables_hash ||= transform_variables(variables)
- yield(variables_hash, Regexp.last_match)
+ collection ||= Gitlab::Ci::Variables::Collection.fabricate(variables)
+ yield(collection, Regexp.last_match)
end
end
- def match_or_blank_value(variables, last_match)
- variables[last_match[1] || last_match[2]]
- end
-
- def match_or_original_value(variables, last_match)
- match_or_blank_value(variables, last_match) || last_match[0]
- end
+ def match_or_blank_value(collection, last_match, expand_file_refs:)
+ match = last_match[1] || last_match[2]
+ replacement = collection[match]
- def transform_variables(variables)
- # Lazily initialise variables
- variables = variables.call if variables.is_a?(Proc)
-
- # Convert Collection to variables
- variables = variables.to_hash if variables.is_a?(Gitlab::Ci::Variables::Collection)
-
- # Convert hash array to variables
- if variables.is_a?(Array)
- variables = variables.each_with_object({}) do |variable, hash|
- hash[variable[:key]] = variable[:value]
- end
+ if replacement.nil?
+ nil
+ elsif replacement.file?
+ expand_file_refs ? replacement.value : last_match
+ else
+ replacement.value
end
+ end
- variables
+ def match_or_original_value(collection, last_match, expand_file_refs:)
+ match_or_blank_value(collection, last_match, expand_file_refs: expand_file_refs) || last_match[0]
end
end
end
diff --git a/lib/extracts_ref.rb b/lib/extracts_ref.rb
index 49ec564eb8d..2a48b66bb5c 100644
--- a/lib/extracts_ref.rb
+++ b/lib/extracts_ref.rb
@@ -100,7 +100,7 @@ module ExtractsRef
# rubocop:enable Gitlab/ModuleWithInstanceVariables
def tree
- @tree ||= @repo.tree(@commit.id, @path) # rubocop:disable Gitlab/ModuleWithInstanceVariables
+ @tree ||= @repo.tree(@commit.id, @path, ref_type: ref_type) # rubocop:disable Gitlab/ModuleWithInstanceVariables
end
def extract_ref_path
diff --git a/lib/extracts_ref/requested_ref.rb b/lib/extracts_ref/requested_ref.rb
new file mode 100644
index 00000000000..f20018b5ef4
--- /dev/null
+++ b/lib/extracts_ref/requested_ref.rb
@@ -0,0 +1,61 @@
+# frozen_string_literal: true
+
+module ExtractsRef
+ class RequestedRef
+ include Gitlab::Utils::StrongMemoize
+
+ SYMBOLIC_REF_PREFIX = %r{((refs/)?(heads|tags)/)+}
+ def initialize(repository, ref_type:, ref:)
+ @ref_type = ref_type
+ @ref = ref
+ @repository = repository
+ end
+
+ attr_reader :repository, :ref_type, :ref
+
+ def find
+ case ref_type
+ when 'tags'
+ { ref_type: ref_type, commit: tag }
+ when 'heads'
+ { ref_type: ref_type, commit: branch }
+ else
+ commit_without_ref_type
+ end
+ end
+
+ private
+
+ def commit_without_ref_type
+ if commit.nil?
+ { ref_type: nil, commit: nil }
+ elsif commit.id == ref
+ # ref is probably complete 40 character sha
+ { ref_type: nil, commit: commit }
+ elsif tag.present?
+ { ref_type: 'tags', commit: tag, ambiguous: branch.present? }
+ elsif branch.present?
+ { ref_type: 'heads', commit: branch }
+ else
+ { ref_type: nil, commit: commit, ambiguous: ref.match?(SYMBOLIC_REF_PREFIX) }
+ end
+ end
+
+ def commit
+ repository.commit(ref)
+ end
+ strong_memoize_attr :commit
+
+ def tag
+ raw_commit = repository.find_tag(ref)&.dereferenced_target
+ ::Commit.new(raw_commit, repository.container) if raw_commit
+ end
+ strong_memoize_attr :tag
+
+ def branch
+ raw_commit = repository.find_branch(ref)&.dereferenced_target
+ ::Commit.new(raw_commit, repository.container) if raw_commit
+ end
+ strong_memoize_attr :branch
+ end
+end
diff --git a/lib/generators/batched_background_migration/batched_background_migration_generator.rb b/lib/generators/batched_background_migration/batched_background_migration_generator.rb
index c68ed52c1a0..44aff6fe17a 100644
--- a/lib/generators/batched_background_migration/batched_background_migration_generator.rb
+++ b/lib/generators/batched_background_migration/batched_background_migration_generator.rb
@@ -6,9 +6,12 @@ module BatchedBackgroundMigration
class BatchedBackgroundMigrationGenerator < ActiveRecord::Generators::Base
source_root File.expand_path('templates', __dir__)
- class_option :table_name
- class_option :column_name
- class_option :feature_category
+ class_option :table_name, type: :string, required: true, desc: "Table from which records we will be batching"
+ class_option :column_name, type: :string, required: true, desc: "Column to use for batching", default: :id
+ class_option :feature_category, type: :string, required: true,
+ desc: "Feature category to which this batched background migration belongs to"
+ class_option :ee_only, type: :boolean, desc: "Generate files for EE-only batched background migration",
+ default: false
def validate!
raise ArgumentError, "table_name is required" unless table_name.present?
@@ -29,15 +32,32 @@ module BatchedBackgroundMigration
end
def create_batched_background_migration_class_and_specs
- template(
- "batched_background_migration_job.template",
- File.join("lib/gitlab/background_migration/#{file_name}.rb")
- )
+ if ee_only?
+ template(
+ "ee_batched_background_migration_job.template",
+ File.join("ee/lib/ee/gitlab/background_migration/#{file_name}.rb")
+ )
- template(
- "batched_background_migration_job_spec.template",
- File.join("spec/lib/gitlab/background_migration/#{file_name}_spec.rb")
- )
+ template(
+ "foss_batched_background_migration_job.template",
+ File.join("lib/gitlab/background_migration/#{file_name}.rb")
+ )
+
+ template(
+ "batched_background_migration_job_spec.template",
+ File.join("ee/spec/lib/ee/gitlab/background_migration/#{file_name}_spec.rb")
+ )
+ else
+ template(
+ "batched_background_migration_job.template",
+ File.join("lib/gitlab/background_migration/#{file_name}.rb")
+ )
+
+ template(
+ "batched_background_migration_job_spec.template",
+ File.join("spec/lib/gitlab/background_migration/#{file_name}_spec.rb")
+ )
+ end
end
def create_dictionary_file
@@ -65,6 +85,10 @@ module BatchedBackgroundMigration
options[:feature_category]
end
+ def ee_only?
+ options[:ee_only]
+ end
+
def current_milestone
version = Gem::Version.new(File.read('VERSION'))
version.release.segments.first(2).join('.')
diff --git a/lib/generators/batched_background_migration/templates/ee_batched_background_migration_job.template b/lib/generators/batched_background_migration/templates/ee_batched_background_migration_job.template
new file mode 100644
index 00000000000..b36fc216acd
--- /dev/null
+++ b/lib/generators/batched_background_migration/templates/ee_batched_background_migration_job.template
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+# See https://docs.gitlab.com/ee/development/database/batched_background_migrations.html
+# for more information on how to use batched background migrations
+
+# Update below commented lines with appropriate values.
+
+module EE
+ module Gitlab
+ module BackgroundMigration
+ module <%= class_name %>
+ extend ActiveSupport::Concern
+ extend ::Gitlab::Utils::Override
+
+ prepended do
+ # operation_name :my_operation
+ # scope_to ->(relation) { relation.where(column: "value") }
+ end
+
+ override :perform
+ def perform
+ each_sub_batch do |sub_batch|
+ # Your action on each sub_batch
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/generators/batched_background_migration/templates/foss_batched_background_migration_job.template b/lib/generators/batched_background_migration/templates/foss_batched_background_migration_job.template
new file mode 100644
index 00000000000..6a39c32955d
--- /dev/null
+++ b/lib/generators/batched_background_migration/templates/foss_batched_background_migration_job.template
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # TODO Add a top-level documentation comment for the class
+ class <%= class_name %> < BatchedMigrationJob
+ feature_category :<%= feature_category %>
+
+ def perform; end
+ end
+ end
+end
+
+Gitlab::BackgroundMigration::<%= class_name %>.prepend_mod
diff --git a/lib/generators/gitlab/analytics/internal_events_generator.rb b/lib/generators/gitlab/analytics/internal_events_generator.rb
index a85cdd352d5..d4c3a10c00e 100644
--- a/lib/generators/gitlab/analytics/internal_events_generator.rb
+++ b/lib/generators/gitlab/analytics/internal_events_generator.rb
@@ -26,8 +26,8 @@ module Gitlab
end
end.freeze
- NEGATIVE_ANSWERS = %w[no n].freeze
- POSITIVE_ANSWERS = %w[yes y].freeze
+ NEGATIVE_ANSWERS = %w[no n No NO N].freeze
+ POSITIVE_ANSWERS = %w[yes y Yes YES Y].freeze
TOP_LEVEL_DIR = 'config'
TOP_LEVEL_DIR_EE = 'ee'
DESCRIPTION_MIN_LENGTH = 50
@@ -81,7 +81,7 @@ module Gitlab
type: :string,
optional: false,
desc: 'Name of the event that this metric counts'
- class_option :unique_on,
+ class_option :unique,
type: :string,
optional: false,
desc: 'Name of the event property that this metric counts'
@@ -185,7 +185,7 @@ module Gitlab
end
def key_path(time_frame)
- "count_distinct_#{options[:unique_on]}_from_#{event}_#{time_frame}"
+ "count_distinct_#{options[:unique].sub('.', '_')}_from_#{event}_#{time_frame}"
end
def metric_file_path(time_frame)
@@ -204,7 +204,7 @@ module Gitlab
validate_tiers!
- %i[unique_on event mr section stage group].each do |option|
+ %i[unique event mr section stage group].each do |option|
raise "The option: --#{option} is missing" unless options.key? option
end
diff --git a/lib/gitlab/access/branch_protection.rb b/lib/gitlab/access/branch_protection.rb
index 6ac8de407b0..81f02c004af 100644
--- a/lib/gitlab/access/branch_protection.rb
+++ b/lib/gitlab/access/branch_protection.rb
@@ -45,6 +45,63 @@ module Gitlab
def fully_protected?
level == PROTECTION_FULL
end
+
+ def to_hash
+ # translate the original integer values into a json payload
+ # that matches the protected branches API:
+ # https://docs.gitlab.com/ee/api/protected_branches.html#update-a-protected-branch
+ case level
+ when PROTECTION_NONE
+ self.class.protection_none
+ when PROTECTION_DEV_CAN_PUSH
+ self.class.protection_partial
+ when PROTECTION_FULL
+ self.class.protected_fully
+ when PROTECTION_DEV_CAN_MERGE
+ self.class.protected_against_developer_pushes
+ when PROTECTION_DEV_CAN_INITIAL_PUSH
+ self.class.protected_after_initial_push
+ end
+ end
+
+ class << self
+ def protection_none
+ {
+ allowed_to_push: [{ 'access_level' => Gitlab::Access::DEVELOPER }],
+ allowed_to_merge: [{ 'access_level' => Gitlab::Access::DEVELOPER }],
+ allow_force_push: true
+ }
+ end
+
+ def protection_partial
+ protection_none.merge(allow_force_push: false)
+ end
+
+ def protected_fully
+ {
+ allowed_to_push: [{ 'access_level' => Gitlab::Access::MAINTAINER }],
+ allowed_to_merge: [{ 'access_level' => Gitlab::Access::MAINTAINER }],
+ allow_force_push: false
+ }
+ end
+
+ def protected_against_developer_pushes
+ {
+ allowed_to_push: [{ 'access_level' => Gitlab::Access::MAINTAINER }],
+ allowed_to_merge: [{ 'access_level' => Gitlab::Access::DEVELOPER }],
+ allow_force_push: true
+ }
+ end
+
+ def protected_after_initial_push
+ {
+ allowed_to_push: [{ 'access_level' => Gitlab::Access::MAINTAINER }],
+ allowed_to_merge: [{ 'access_level' => Gitlab::Access::DEVELOPER }],
+ allow_force_push: true,
+ developer_can_initial_push: true
+ }
+ end
+ end
end
end
end
diff --git a/lib/gitlab/alert_management/payload/base.rb b/lib/gitlab/alert_management/payload/base.rb
index 5b136431ce7..3840a560c57 100644
--- a/lib/gitlab/alert_management/payload/base.rb
+++ b/lib/gitlab/alert_management/payload/base.rb
@@ -33,7 +33,6 @@ module Gitlab
:has_required_attributes?,
:hosts,
:metric_id,
- :metrics_dashboard_url,
:monitoring_tool,
:resolved?,
:runbook,
diff --git a/lib/gitlab/alert_management/payload/managed_prometheus.rb b/lib/gitlab/alert_management/payload/managed_prometheus.rb
index 2236e60a0c6..4ed21108d3e 100644
--- a/lib/gitlab/alert_management/payload/managed_prometheus.rb
+++ b/lib/gitlab/alert_management/payload/managed_prometheus.rb
@@ -35,18 +35,6 @@ module Gitlab
gitlab_alert&.environment || super
end
- def metrics_dashboard_url
- return unless gitlab_alert
-
- metrics_dashboard_project_prometheus_alert_url(
- project,
- gitlab_alert.prometheus_metric_id,
- environment_id: environment.id,
- embedded: true,
- **alert_embed_window_params
- )
- end
-
private
def plain_gitlab_fingerprint
diff --git a/lib/gitlab/alert_management/payload/prometheus.rb b/lib/gitlab/alert_management/payload/prometheus.rb
index 76f3da8366b..15fa91646c8 100644
--- a/lib/gitlab/alert_management/payload/prometheus.rb
+++ b/lib/gitlab/alert_management/payload/prometheus.rb
@@ -78,18 +78,6 @@ module Gitlab
rescue URI::InvalidURIError, KeyError
end
- def metrics_dashboard_url
- return unless environment && full_query && title
-
- metrics_dashboard_project_environment_url(
- project,
- environment,
- embed_json: dashboard_json,
- embedded: true,
- **alert_embed_window_params
- )
- end
-
def has_required_attributes?
project && title && starts_at_raw
end
@@ -108,29 +96,6 @@ module Gitlab
def plain_gitlab_fingerprint
[starts_at_raw, title, full_query].join('/')
end
-
- # Formatted for parsing by JS
- def alert_embed_window_params
- {
- start: (starts_at - METRIC_TIME_WINDOW).utc.strftime('%FT%TZ'),
- end: (starts_at + METRIC_TIME_WINDOW).utc.strftime('%FT%TZ')
- }
- end
-
- def dashboard_json
- {
- panel_groups: [{
- panels: [{
- type: 'area-chart',
- title: title,
- y_label: gitlab_y_label,
- metrics: [{
- query_range: full_query
- }]
- }]
- }]
- }.to_json
- end
end
end
end
diff --git a/lib/gitlab/application_context.rb b/lib/gitlab/application_context.rb
index 0ea52b7b7c8..67fc2ae2fcc 100644
--- a/lib/gitlab/application_context.rb
+++ b/lib/gitlab/application_context.rb
@@ -47,11 +47,16 @@ module Gitlab
Attribute.new(:root_caller_id, String),
Attribute.new(:merge_action_status, String)
].freeze
+ private_constant :APPLICATION_ATTRIBUTES
def self.known_keys
KNOWN_KEYS
end
+ def self.application_attributes
+ APPLICATION_ATTRIBUTES
+ end
+
def self.with_context(args, &block)
application_context = new(**args)
application_context.use(&block)
@@ -79,12 +84,13 @@ module Gitlab
end
def initialize(**args)
- unknown_attributes = args.keys - APPLICATION_ATTRIBUTES.map(&:name)
+ unknown_attributes = args.keys - self.class.application_attributes.map(&:name)
raise ArgumentError, "#{unknown_attributes} are not known keys" if unknown_attributes.any?
@set_values = args.keys
assign_attributes(args)
+ set_attr_readers
end
# rubocop: disable Metrics/CyclomaticComplexity
@@ -122,12 +128,14 @@ module Gitlab
attr_reader :set_values
- APPLICATION_ATTRIBUTES.each do |attr|
- lazy_attr_reader attr.name, type: attr.type
+ def set_attr_readers
+ self.class.application_attributes.each do |attr|
+ self.class.lazy_attr_reader attr.name, type: attr.type
+ end
end
def assign_hash_if_value(hash, attribute_name)
- unless KNOWN_KEYS.include?(attribute_name)
+ unless self.class.known_keys.include?(attribute_name)
raise ArgumentError, "unknown attribute `#{attribute_name}`"
end
@@ -137,7 +145,7 @@ module Gitlab
end
def assign_attributes(values)
- values.slice(*APPLICATION_ATTRIBUTES.map(&:name)).each do |name, value|
+ values.slice(*self.class.application_attributes.map(&:name)).each do |name, value|
instance_variable_set("@#{name}", value)
end
end
diff --git a/lib/gitlab/auth.rb b/lib/gitlab/auth.rb
index 83d94d168a0..1bb92b7fa62 100644
--- a/lib/gitlab/auth.rb
+++ b/lib/gitlab/auth.rb
@@ -9,7 +9,8 @@ module Gitlab
API_SCOPE = :api
READ_API_SCOPE = :read_api
READ_USER_SCOPE = :read_user
- API_SCOPES = [API_SCOPE, READ_API_SCOPE, READ_USER_SCOPE].freeze
+ CREATE_RUNNER_SCOPE = :create_runner
+ API_SCOPES = [API_SCOPE, READ_API_SCOPE, READ_USER_SCOPE, CREATE_RUNNER_SCOPE].freeze
PROFILE_SCOPE = :profile
EMAIL_SCOPE = :email
@@ -236,6 +237,10 @@ module Gitlab
user.can?(:read_project, project)
end
+ def bot_user_can_read_project?(user, project)
+ (user.project_bot? || user.security_policy_bot?) && can_read_project?(user, project)
+ end
+
def valid_oauth_token?(token)
token && token.accessible? && valid_scoped_token?(token, Doorkeeper.configuration.scopes)
end
@@ -251,7 +256,8 @@ module Gitlab
read_registry: [:read_container_image],
write_registry: [:create_container_image],
read_repository: [:download_code],
- write_repository: [:download_code, :push_code]
+ write_repository: [:download_code, :push_code],
+ create_runner: [:create_instance_runner, :create_runner]
}
scopes.flat_map do |scope|
@@ -316,7 +322,7 @@ module Gitlab
return unless build.project.builds_enabled?
if build.user
- return unless build.user.can_log_in_with_non_expired_password? || (build.user.project_bot? && can_read_project?(build.user, build.project))
+ return unless build.user.can_log_in_with_non_expired_password? || bot_user_can_read_project?(build.user, build.project)
# If user is assigned to build, use restricted credentials of user
Gitlab::Auth::Result.new(build.user, build.project, :build, build_authentication_abilities)
diff --git a/lib/gitlab/auth/auth_finders.rb b/lib/gitlab/auth/auth_finders.rb
index 4a610b26290..966520655a5 100644
--- a/lib/gitlab/auth/auth_finders.rb
+++ b/lib/gitlab/auth/auth_finders.rb
@@ -30,6 +30,7 @@ module Gitlab
DEPLOY_TOKEN_HEADER = 'HTTP_DEPLOY_TOKEN'
RUNNER_TOKEN_PARAM = :token
RUNNER_JOB_TOKEN_PARAM = :token
+ PATH_DEPENDENT_FEED_TOKEN_REGEX = /\A#{User::FEED_TOKEN_PREFIX}(\h{64})-(\d+)\z/
# Check the Rails session for valid authentication details
def find_user_from_warden
@@ -54,7 +55,7 @@ module Gitlab
token = current_request.params[:feed_token].presence || current_request.params[:rss_token].presence
return unless token
- User.find_by_feed_token(token) || raise(UnauthorizedError)
+ find_feed_token_user(token) || raise(UnauthorizedError)
end
def find_user_from_bearer_token
@@ -195,6 +196,8 @@ module Gitlab
when AccessTokenValidationService::EXPIRED
raise ExpiredError
when AccessTokenValidationService::REVOKED
+ revoke_token_family(access_token)
+
raise RevokedError
when AccessTokenValidationService::IMPERSONATION_DISABLED
raise ImpersonationDisabled
@@ -277,6 +280,30 @@ module Gitlab
PersonalAccessToken.find_by_token(password)
end
+ def find_feed_token_user(token)
+ find_user_from_path_feed_token(token) || User.find_by_feed_token(token)
+ end
+
+ def find_user_from_path_feed_token(token)
+ glft = token.match(PATH_DEPENDENT_FEED_TOKEN_REGEX)
+
+ return unless glft
+
+ # make sure that user id uses decimal notation
+ user_id = glft[2].to_i(10)
+ digest = glft[1]
+
+ user = User.find_by_id(user_id)
+ return unless user
+
+ feed_token = user.feed_token
+ our_digest = OpenSSL::HMAC.hexdigest("SHA256", feed_token, current_request.path)
+
+ return unless ActiveSupport::SecurityUtils.secure_compare(digest, our_digest)
+
+ user
+ end
+
def parsed_oauth_token
Doorkeeper::OAuth::Token.from_request(current_request, *Doorkeeper.configuration.access_token_methods)
end
@@ -374,6 +401,12 @@ module Gitlab
raise UnauthorizedError unless job
end
end
+
+ def revoke_token_family(token)
+ return unless Feature.enabled?(:pat_reuse_detection)
+
+ PersonalAccessTokens::RevokeTokenFamilyService.new(token).execute
+ end
end
end
end
diff --git a/lib/gitlab/auth/ldap/config.rb b/lib/gitlab/auth/ldap/config.rb
index 30896637eff..13ca4f01154 100644
--- a/lib/gitlab/auth/ldap/config.rb
+++ b/lib/gitlab/auth/ldap/config.rb
@@ -264,7 +264,7 @@ module Gitlab
return {} unless options['tls_options']
# Dup so we don't overwrite the original value
- custom_options = options['tls_options'].dup.delete_if { |_, value| value.nil? || value.blank? }
+ custom_options = options['tls_options'].to_hash.delete_if { |_, value| value.nil? || value.blank? }
custom_options.symbolize_keys!
if custom_options[:cert]
diff --git a/lib/gitlab/background_migration/.rubocop.yml b/lib/gitlab/background_migration/.rubocop.yml
index 116c84c3759..9424686340f 100644
--- a/lib/gitlab/background_migration/.rubocop.yml
+++ b/lib/gitlab/background_migration/.rubocop.yml
@@ -59,3 +59,8 @@ Migration/BackgroundMigrationBaseClass:
- 'base_job.rb'
- 'batched_migration_job.rb'
- 'logger.rb'
+
+BackgroundMigration/AvoidSilentRescueExceptions:
+ Enabled: true
+ Description: >-
+ Rescuing errors in batched background migration jobs can lead to undesired results
diff --git a/lib/gitlab/background_migration/backfill_missing_ci_cd_settings.rb b/lib/gitlab/background_migration/backfill_missing_ci_cd_settings.rb
new file mode 100644
index 00000000000..e3ad63aac2e
--- /dev/null
+++ b/lib/gitlab/background_migration/backfill_missing_ci_cd_settings.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # backfills project_ci_cd_settings
+ class BackfillMissingCiCdSettings < BatchedMigrationJob
+ # migrations only version of `project_ci_cd_settings` table
+ class ProjectCiCdSetting < ::ApplicationRecord
+ self.table_name = 'project_ci_cd_settings'
+ end
+
+ operation_name :backfill_missing_ci_cd_settings
+ feature_category :source_code_management
+
+ def perform
+ each_sub_batch do |sub_batch|
+ sub_batch = sub_batch.where(%{
+ NOT EXISTS (
+ SELECT 1
+ FROM project_ci_cd_settings
+ WHERE project_ci_cd_settings.project_id = projects.id
+ )
+ })
+ next unless sub_batch.present?
+
+ ci_cd_attributes = sub_batch.map do |project|
+ {
+ project_id: project.id,
+ default_git_depth: 20,
+ forward_deployment_enabled: true
+ }
+ end
+
+ ProjectCiCdSetting.insert_all(ci_cd_attributes)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/backfill_uuid_conversion_column_in_vulnerability_occurrences.rb b/lib/gitlab/background_migration/backfill_uuid_conversion_column_in_vulnerability_occurrences.rb
new file mode 100644
index 00000000000..4dccd3fd852
--- /dev/null
+++ b/lib/gitlab/background_migration/backfill_uuid_conversion_column_in_vulnerability_occurrences.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # This batched background migration will backfill values for `uuid_convert_string_to_uuid` column in
+ # vulnerability_occurrences table to allow us to migrate the column type from `varchar(36)` to `uuid`
+ class BackfillUuidConversionColumnInVulnerabilityOccurrences < BatchedMigrationJob
+ operation_name :backfill_uuid_conversion_column_in_vulnerability_occurrences
+ scope_to ->(relation) do
+ relation.where("uuid_convert_string_to_uuid = '00000000-0000-0000-0000-000000000000'::uuid")
+ end
+ feature_category :vulnerability_management
+
+ def perform
+ each_sub_batch do |sub_batch|
+ sub_batch.update_all("uuid_convert_string_to_uuid = uuid::uuid")
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/redis/backfill_project_pipeline_status_ttl.rb b/lib/gitlab/background_migration/redis/backfill_project_pipeline_status_ttl.rb
new file mode 100644
index 00000000000..2672498b627
--- /dev/null
+++ b/lib/gitlab/background_migration/redis/backfill_project_pipeline_status_ttl.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ module Redis
+ # BackfillProjectPipelineStatusTtl cleans up keys written by
+ # Gitlab::Cache::Ci::ProjectPipelineStatus by adding a minimum 8-hour ttl
+ # to all keys. This either sets or extends the ttl of matching keys.
+ #
+ class BackfillProjectPipelineStatusTtl # rubocop:disable Migration/BackgroundMigrationBaseClass
+ def perform(keys)
+ # spread out deletes over a 4 hour period starting in 8 hours time
+ ttl_duration = 10.hours.to_i
+ ttl_jitter = 2.hours.to_i
+
+ Gitlab::Instrumentation::RedisClusterValidator.allow_cross_slot_commands do
+ Gitlab::Redis::CrossSlot::Pipeline.new(redis).pipelined do |pipeline|
+ keys.each { |key| pipeline.expire(key, ttl_duration + rand(-ttl_jitter..ttl_jitter)) }
+ end
+ end
+ end
+
+ def scan_match_pattern
+ "#{Gitlab::Redis::Cache::CACHE_NAMESPACE}:project:*:pipeline_status"
+ end
+
+ def redis
+ @redis ||= ::Redis.new(Gitlab::Redis::Cache.params)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/cache/ci/project_pipeline_status.rb b/lib/gitlab/cache/ci/project_pipeline_status.rb
index b2630a7ad7a..4beb8f54abf 100644
--- a/lib/gitlab/cache/ci/project_pipeline_status.rb
+++ b/lib/gitlab/cache/ci/project_pipeline_status.rb
@@ -9,6 +9,8 @@ module Gitlab
class ProjectPipelineStatus
include Gitlab::Utils::StrongMemoize
+ STATUS_KEY_TTL = 8.hours
+
attr_accessor :sha, :status, :ref, :project, :loaded
def self.load_for_project(project)
@@ -89,12 +91,17 @@ module Gitlab
self.sha, self.status, self.ref = redis.hmget(cache_key, :sha, :status, :ref)
self.status = nil if self.status.empty?
+
+ redis.expire(cache_key, STATUS_KEY_TTL)
end
end
def store_in_cache
with_redis do |redis|
- redis.mapped_hmset(cache_key, { sha: sha, status: status, ref: ref })
+ redis.pipelined do |p|
+ p.mapped_hmset(cache_key, { sha: sha, status: status, ref: ref })
+ p.expire(cache_key, STATUS_KEY_TTL)
+ end
end
end
diff --git a/lib/gitlab/cache/client.rb b/lib/gitlab/cache/client.rb
index 37d6cac8d43..1e2962a5151 100644
--- a/lib/gitlab/cache/client.rb
+++ b/lib/gitlab/cache/client.rb
@@ -5,61 +5,40 @@ module Gitlab
# It replaces Rails.cache with metrics support
class Client
DEFAULT_BACKING_RESOURCE = :unknown
+ DEFAULT_FEATURE_CATEGORY = :not_owned
- # Build Cache client with the metadata support
- #
- # @param cache_identifier [String] defines the location of the cache definition
- # Example: "ProtectedBranches::CacheService#fetch"
- # @param feature_category [Symbol] name of the feature category (from config/feature_categories.yml)
- # @param backing_resource [Symbol] most affected resource by cache generation (full list: VALID_BACKING_RESOURCES)
- # @return [Gitlab::Cache::Client]
- def self.build_with_metadata(
- cache_identifier:,
- feature_category:,
- backing_resource: DEFAULT_BACKING_RESOURCE
- )
- new(Metadata.new(
- cache_identifier: cache_identifier,
- feature_category: feature_category,
- backing_resource: backing_resource
- ))
- end
-
- def initialize(metadata, backend: Rails.cache)
- @metadata = metadata
- @metrics = Metrics.new(metadata)
+ def initialize(metrics, backend: Rails.cache)
+ @metrics = metrics
@backend = backend
end
- def read(name)
- read_result = backend.read(name)
+ def read(name, options = nil, labels = {})
+ read_result = backend.read(name, options)
if read_result.nil?
- metrics.increment_cache_miss
+ metrics.increment_cache_miss(labels)
else
- metrics.increment_cache_hit
+ metrics.increment_cache_hit(labels)
end
read_result
end
- def fetch(name, options = nil, &block)
- read_result = read(name)
+ def fetch(name, options = nil, labels = {}, &block)
+ read_result = read(name, options, labels)
return read_result unless block || read_result
backend.fetch(name, options) do
- metrics.observe_cache_generation(&block)
+ metrics.observe_cache_generation(labels, &block)
end
end
delegate :write, :exist?, :delete, to: :backend
- attr_reader :metadata, :metrics
-
private
- attr_reader :backend
+ attr_reader :metrics, :backend
end
end
end
diff --git a/lib/gitlab/cache/metadata.rb b/lib/gitlab/cache/metadata.rb
index de35b332300..03ee48399d9 100644
--- a/lib/gitlab/cache/metadata.rb
+++ b/lib/gitlab/cache/metadata.rb
@@ -12,12 +12,12 @@ module Gitlab
# @param backing_resource [Symbol] most affected resource by cache generation (full list: VALID_BACKING_RESOURCES)
# @return [Gitlab::Cache::Metadata]
def initialize(
- cache_identifier:,
- feature_category:,
+ cache_identifier: nil,
+ feature_category: Client::DEFAULT_FEATURE_CATEGORY,
backing_resource: Client::DEFAULT_BACKING_RESOURCE
)
@cache_identifier = cache_identifier
- @feature_category = Gitlab::FeatureCategories.default.get!(feature_category)
+ @feature_category = fetch_feature_category!(feature_category)
@backing_resource = fetch_backing_resource!(backing_resource)
end
@@ -25,6 +25,12 @@ module Gitlab
private
+ def fetch_feature_category!(feature_category)
+ return feature_category if feature_category == Client::DEFAULT_FEATURE_CATEGORY
+
+ Gitlab::FeatureCategories.default.get!(feature_category)
+ end
+
def fetch_backing_resource!(resource)
return resource if VALID_BACKING_RESOURCES.include?(resource)
diff --git a/lib/gitlab/cache/metrics.rb b/lib/gitlab/cache/metrics.rb
index d9c80f076b9..26a1f346f13 100644
--- a/lib/gitlab/cache/metrics.rb
+++ b/lib/gitlab/cache/metrics.rb
@@ -12,14 +12,14 @@ module Gitlab
# Increase cache hit counter
#
- def increment_cache_hit
- counter.increment(labels.merge(cache_hit: true))
+ def increment_cache_hit(labels = {})
+ counter.increment(base_labels.merge(labels, cache_hit: true))
end
# Increase cache miss counter
#
- def increment_cache_miss
- counter.increment(labels.merge(cache_hit: false))
+ def increment_cache_miss(labels = {})
+ counter.increment(base_labels.merge(labels, cache_hit: false))
end
# Measure the duration of cacheable action
@@ -29,12 +29,12 @@ module Gitlab
# cacheable_action
# end
#
- def observe_cache_generation(&block)
+ def observe_cache_generation(labels = {}, &block)
real_start = Gitlab::Metrics::System.monotonic_time
value = yield
- histogram.observe({}, Gitlab::Metrics::System.monotonic_time - real_start)
+ histogram.observe(base_labels.merge(labels), Gitlab::Metrics::System.monotonic_time - real_start)
value
end
@@ -44,20 +44,24 @@ module Gitlab
attr_reader :cache_metadata
def counter
- @counter ||= Gitlab::Metrics.counter(:redis_hit_miss_operations_total, "Hit/miss Redis cache counter")
+ @counter ||= Gitlab::Metrics.counter(
+ :redis_hit_miss_operations_total,
+ "Hit/miss Redis cache counter",
+ base_labels
+ )
end
def histogram
@histogram ||= Gitlab::Metrics.histogram(
:redis_cache_generation_duration_seconds,
'Duration of Redis cache generation',
- labels,
+ base_labels,
DEFAULT_BUCKETS
)
end
- def labels
- @labels ||= {
+ def base_labels
+ @base_labels ||= {
cache_identifier: cache_metadata.cache_identifier,
feature_category: cache_metadata.feature_category,
backing_resource: cache_metadata.backing_resource
diff --git a/lib/gitlab/checks/changes_access.rb b/lib/gitlab/checks/changes_access.rb
index 194e3f6e938..3fd7e44985e 100644
--- a/lib/gitlab/checks/changes_access.rb
+++ b/lib/gitlab/checks/changes_access.rb
@@ -117,6 +117,7 @@ module Gitlab
def bulk_access_checks!
Gitlab::Checks::LfsCheck.new(self).validate!
+ Gitlab::Checks::GlobalFileSizeCheck.new(self).validate!
end
def blank_rev?(rev)
diff --git a/lib/gitlab/checks/diff_check.rb b/lib/gitlab/checks/diff_check.rb
index 1186b532baf..bce4f969284 100644
--- a/lib/gitlab/checks/diff_check.rb
+++ b/lib/gitlab/checks/diff_check.rb
@@ -74,7 +74,7 @@ module Gitlab
lfs_lock = project.lfs_file_locks.where(path: paths).where.not(user_id: user_access.user.id).take
if lfs_lock
- return "The path '#{lfs_lock.path}' is locked in Git LFS by #{lfs_lock.user.name}"
+ return "The path '#{lfs_lock.path}' is locked in Git LFS by #{lfs_lock.user.username}"
end
end
end
diff --git a/lib/gitlab/checks/file_size_check/allow_existing_oversized_blobs.rb b/lib/gitlab/checks/file_size_check/allow_existing_oversized_blobs.rb
new file mode 100644
index 00000000000..78f1716274e
--- /dev/null
+++ b/lib/gitlab/checks/file_size_check/allow_existing_oversized_blobs.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Checks
+ module FileSizeCheck
+ class AllowExistingOversizedBlobs
+ def initialize(project:, changes:, file_size_limit_megabytes:)
+ @project = project
+ @changes = changes
+ @oldrevs = changes.pluck(:oldrev).compact # rubocop:disable CodeReuse/ActiveRecord just plucking from an array
+ @file_size_limit_megabytes = file_size_limit_megabytes
+ end
+
+ def find(timeout: nil)
+ oversize_blobs = any_oversize_blobs.find(timeout: timeout)
+
+ return oversize_blobs unless oldrevs.present?
+
+ revs_paths = oldrevs.product(oversize_blobs.map(&:path))
+ existing_blobs = project.repository.blobs_at(revs_paths, blob_size_limit: 1)
+ map_existing_path_to_size = existing_blobs.group_by(&:path).transform_values { |blobs| blobs.map(&:size).max }
+
+ # return blobs that are going to be over the limit that were previously within the limit
+ oversize_blobs.select { |blob| map_existing_path_to_size.fetch(blob.path, 0) <= file_size_limit_megabytes }
+ end
+
+ private
+
+ attr_reader :project, :changes, :newrevs, :oldrevs, :file_size_limit_megabytes
+
+ def any_oversize_blobs
+ AnyOversizedBlobs.new(project: project, changes: changes,
+ file_size_limit_megabytes: file_size_limit_megabytes)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/checks/file_size_check/any_oversized_blobs.rb b/lib/gitlab/checks/file_size_check/any_oversized_blobs.rb
new file mode 100644
index 00000000000..35f969dbb46
--- /dev/null
+++ b/lib/gitlab/checks/file_size_check/any_oversized_blobs.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Checks
+ module FileSizeCheck
+ class AnyOversizedBlobs
+ def initialize(project:, changes:, file_size_limit_megabytes:)
+ @project = project
+ @newrevs = changes.pluck(:newrev).compact # rubocop:disable CodeReuse/ActiveRecord just plucking from an array
+ @file_size_limit_megabytes = file_size_limit_megabytes
+ end
+
+ def find(timeout: nil)
+ blobs = project.repository.new_blobs(newrevs, dynamic_timeout: timeout)
+
+ blobs.select do |blob|
+ ::Gitlab::Utils.bytes_to_megabytes(blob.size) > file_size_limit_megabytes
+ end
+ end
+
+ private
+
+ attr_reader :project, :newrevs, :file_size_limit_megabytes
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/checks/global_file_size_check.rb b/lib/gitlab/checks/global_file_size_check.rb
new file mode 100644
index 00000000000..418d2d32b57
--- /dev/null
+++ b/lib/gitlab/checks/global_file_size_check.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Checks
+ class GlobalFileSizeCheck < BaseBulkChecker
+ MAX_FILE_SIZE_MB = 100
+ LOG_MESSAGE = 'Checking for blobs over the file size limit'
+
+ def validate!
+ return unless Feature.enabled?(:global_file_size_check, project)
+
+ Gitlab::AppJsonLogger.info(LOG_MESSAGE)
+ logger.log_timed(LOG_MESSAGE) do
+ Gitlab::Checks::FileSizeCheck::AllowExistingOversizedBlobs.new(
+ project: project,
+ changes: changes,
+ file_size_limit_megabytes: MAX_FILE_SIZE_MB
+ ).find
+
+ # TODO: https://gitlab.com/gitlab-org/gitlab/-/issues/393535
+ # - set limit per plan tier
+ # - raise an error if large blobs are found
+ end
+
+ true
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/artifact_file_reader.rb b/lib/gitlab/ci/artifact_file_reader.rb
index 2eb8df01d58..0d8f6f3ea40 100644
--- a/lib/gitlab/ci/artifact_file_reader.rb
+++ b/lib/gitlab/ci/artifact_file_reader.rb
@@ -14,7 +14,8 @@ module Gitlab
def initialize(job)
@job = job
- raise ArgumentError, 'Job does not have artifacts' unless @job.artifacts?
+ raise Error, 'Job doesnt exist' unless @job
+ raise Error, 'Job does not have artifacts' unless @job.artifacts?
validate!
end
diff --git a/lib/gitlab/ci/build/rules.rb b/lib/gitlab/ci/build/rules.rb
index 17b9f30db33..8b503290e6e 100644
--- a/lib/gitlab/ci/build/rules.rb
+++ b/lib/gitlab/ci/build/rules.rb
@@ -32,18 +32,13 @@ module Gitlab
if @rule_list.nil?
Result.new(when: @default_when)
elsif matched_rule = match_rule(pipeline, context)
- result = Result.new(
+ Result.new(
when: matched_rule.attributes[:when] || @default_when,
start_in: matched_rule.attributes[:start_in],
allow_failure: matched_rule.attributes[:allow_failure],
- variables: matched_rule.attributes[:variables]
+ variables: matched_rule.attributes[:variables],
+ needs: matched_rule.attributes[:needs]
)
-
- if Feature.enabled?(:introduce_rules_with_needs, pipeline.project)
- result.needs = matched_rule.attributes[:needs]
- end
-
- result
else
Result.new(when: 'never')
end
diff --git a/lib/gitlab/ci/components/instance_path.rb b/lib/gitlab/ci/components/instance_path.rb
index 27a7611ffdd..e0ef598da1b 100644
--- a/lib/gitlab/ci/components/instance_path.rb
+++ b/lib/gitlab/ci/components/instance_path.rb
@@ -73,9 +73,7 @@ module Gitlab
end
def latest_version_sha
- return unless catalog_resource = project&.catalog_resource
-
- catalog_resource.latest_version&.sha
+ project.releases.latest&.sha
end
end
end
diff --git a/lib/gitlab/ci/config/README.md b/lib/gitlab/ci/config/README.md
new file mode 100644
index 00000000000..e850afc5253
--- /dev/null
+++ b/lib/gitlab/ci/config/README.md
@@ -0,0 +1,178 @@
+# `::Gitlab::Ci::Config` module overview
+
+`::Gitlab::Ci::Config` is a concrete implementation of abstract
+`::Gitlab::Config` module. It's being used to build, traverse and translate
+hierarchical, user-provided, CI configuration, usually provided in
+`.gitlab-ci.yml` and included files.
+
+## High-level Overview
+
+`::Gitlab::Ci::Config` is an indirection layer between user-provided data and
+GitLab itself.
+
+1. A user provides YAML configuration in `.gitlab-ci.yml` and all included files.
+1. `::Gitlab::Ci::Config` loads the provided YAML using Ruby standard `Psych` library.
+1. The resulting Hash is then passed to the module to build an Abstract Syntax Tree.
+1. The module validates, transforms, translates and augments the data to build
+ a stable representation of user-provided configuration.
+
+This additional layer helps us to validate the user-provided configuration and
+surface any errors to a user if it is not valid. In case of a valid
+configuration, it makes it possible to build a stable representation of
+config that we can depend on.
+
+For example, both following configurations using the
+[environment](https://docs.gitlab.com/ee/ci/yaml/#environment)
+keyword are correct:
+
+```yaml
+# First way to define an environment:
+
+deploy:
+ environment: production
+ script: cap deploy
+
+# Second way to define an environment:
+
+deploy:
+ environment:
+ name: production
+ url: https://prod.example.com
+ kubernetes:
+ namespace: production
+```
+
+This demonstrates the concept of hidden / expanding complexity: if users need
+more flexibility, they can opt-in into using a much more elaborate syntax to
+configure their environments. **We use this technique to make it possible for
+simplicity to coexist with flexibility without additional complexity**.
+
+`::Gitlab::Ci::Config` allows us to achieve this, because it is an indirection
+layer, that translates user-provided configuration into a known and expected
+format when users can achieve the same thing in `.gitlab-ci.yml` in a few
+different ways.
+
+## Hierarchical configuration
+
+`.gitlab-ci.yml` configuration is hierarchical but same keywords can often be
+used on different levels in the hierarchy. `::Gitlab::Ci::Config` module makes
+it easier to manage the complexity that stems from having same keyword
+available in [many different places](https://docs.gitlab.com/ee/ci/yaml/#default):
+
+```yaml
+default:
+ image: ruby:3.0
+
+rspec:
+ script: bundle exec rspec
+
+rspec 2.7:
+ image: ruby:2.7
+ script: bundle exec rspec
+```
+
+We can achieve that, because in `::Gitlab::Ci::Config` most of the keywords are
+implemented within separate Ruby classes, that then can be reused:
+
+```ruby
+# Simplified version of an entry class that describes a Docker image.
+#
+class Gitlab::Ci::Config::Entry
+ class Image < ::Gitlab::Config::Entry::Node
+
+ validates :config, allowed_keys: ALLOWED_IMAGE_CONFIG_KEYS
+
+ def value
+ if string?
+ { name: @config }
+ elsif hash?
+ {
+ name: @config[:name],
+ entrypoint: @config[:entrypoint],
+ ports: (ports_value if ports_defined?),
+ pull_policy: pull_policy_value
+ }
+ else
+ {}
+ end
+ end
+ end
+end
+```
+
+The config above is a simple demonstration of the translation layer, into a
+stable configuration, depending on what simplification strategy has been used
+by a user. There more complex examples, though:
+
+```ruby
+module Gitlab::Ci::Config::Entry
+ class Need < ::Gitlab::Config::Entry::Simplifiable
+ strategy :JobString, if: -> (config) { config.is_a?(String) }
+
+ strategy :JobHash,
+ if: -> (config) { config.is_a?(Hash) && same_pipeline_need?(config) }
+
+ strategy :CrossPipelineDependency,
+ if: -> (config) { config.is_a?(Hash) && cross_pipeline_need?(config) }
+
+ # [ ... ]
+ end
+end
+```
+
+Every time we load config, an Abstract Syntax Tree is being built, because
+nodes / entries know what the child nodes can be:
+
+```ruby
+# Simplified root entry code
+#
+module Gitlab::Ci::Config::Entry
+ class Root < ::Gitlab::Config::Entry::Node
+ include ::Gitlab::Config::Entry::Configurable
+
+ entry :default, Entry::Default,
+ description: 'Default configuration for all jobs.'
+
+ entry :include, Entry::Includes,
+ description: 'List of external YAML files to include.'
+
+ entry :before_script, Entry::Commands,
+ description: 'Script that will be executed before each job.'
+
+ entry :image, Entry::Image,
+ description: 'Docker image that will be used to execute jobs.'
+
+ entry :services, Entry::Services,
+ description: 'Docker images that will be linked to the container.'
+
+ entry :after_script, Entry::Commands,
+ description: 'Script that will be executed after each job.'
+
+ entry :variables, Entry::Variables,
+ description: 'Environment variables that will be used.'
+
+ # [ ... ]
+ end
+end
+```
+
+Loading the configuration script mentioned at the beginning of this pargraph
+will result in build a following AST:
+
+```
+Entry::Root
+`-
+ |- Entry::Default
+ | `- Entry::Image('ruby:3.0')
+ |
+ |- Entry::Job('rspec')
+ | `- Entry::Script('bundle exec rspec')
+ |
+ |- Entry::Job('rspec 2.7')
+ | |- Entry::Image('ruby:2.7)
+ | `- Entry::Script('bundle exec rspec')
+```
+
+The AST will be validated, and eventually will generate a stable representation
+of configuration that we can use to persist pipelines / stages / jobs in the
+database, and start pipeline processing.
diff --git a/lib/gitlab/ci/config/external/file/artifact.rb b/lib/gitlab/ci/config/external/file/artifact.rb
index 273d78bd583..f23fa2e6401 100644
--- a/lib/gitlab/ci/config/external/file/artifact.rb
+++ b/lib/gitlab/ci/config/external/file/artifact.rb
@@ -19,12 +19,15 @@ module Gitlab
end
def content
- strong_memoize(:content) do
- Gitlab::Ci::ArtifactFileReader.new(artifact_job).read(location)
- rescue Gitlab::Ci::ArtifactFileReader::Error => error
- errors.push(error.message) # TODO this memoizes the error message as a content!
- end
+ return unless context.parent_pipeline.present?
+
+ Gitlab::Ci::ArtifactFileReader.new(artifact_job).read(location)
+ rescue Gitlab::Ci::ArtifactFileReader::Error => error
+ errors.push(error.message)
+
+ nil
end
+ strong_memoize_attr :content
def metadata
super.merge(
diff --git a/lib/gitlab/ci/config/external/file/base.rb b/lib/gitlab/ci/config/external/file/base.rb
index 61d95c8d4e6..8bcb2a389d2 100644
--- a/lib/gitlab/ci/config/external/file/base.rb
+++ b/lib/gitlab/ci/config/external/file/base.rb
@@ -90,15 +90,7 @@ module Gitlab
end
def load_and_validate_expanded_hash!
- context.logger.instrument(:config_file_fetch_content_hash) do
- content_result # calling the method loads YAML then memoizes the content result
- end
-
- context.logger.instrument(:config_file_interpolate_result) do
- interpolator.interpolate!
- end
-
- return validate_interpolation! unless interpolator.valid?
+ return errors.push("`#{masked_location}`: #{content_result.error}") unless content_result.valid?
context.logger.instrument(:config_file_expand_content_includes) do
expanded_content_hash # calling the method expands then memoizes the result
@@ -109,36 +101,24 @@ module Gitlab
protected
- def content_result
- ::Gitlab::Ci::Config::Yaml
- .load_result!(content, project: context.project)
- end
- strong_memoize_attr :content_result
-
def content_inputs
# TODO: remove support for `with` syntax in 16.1, see https://gitlab.com/gitlab-org/gitlab/-/issues/408369
# In the interim prefer `inputs` over `with` while allow either syntax.
params.to_h.slice(:inputs, :with).each_value.first
end
- strong_memoize_attr :content_inputs
-
- def content_hash
- interpolator.interpolate!
- interpolator.to_hash
- end
- strong_memoize_attr :content_hash
-
- def interpolator
- Yaml::Interpolator.new(content_result, content_inputs, context)
+ def content_result
+ context.logger.instrument(:config_file_fetch_content_hash) do
+ ::Gitlab::Ci::Config::Yaml::Loader.new(content, inputs: content_inputs, current_user: context.user).load
+ end
end
- strong_memoize_attr :interpolator
+ strong_memoize_attr :content_result
def expanded_content_hash
- return if content_hash.blank?
+ return if content_result.content.blank?
strong_memoize(:expanded_content_hash) do
- expand_includes(content_hash)
+ expand_includes(content_result.content)
end
end
@@ -148,12 +128,6 @@ module Gitlab
end
end
- def validate_interpolation!
- return if interpolator.valid?
-
- errors.push("`#{masked_location}`: #{interpolator.error_message}")
- end
-
def expand_includes(hash)
External::Processor.new(hash, context.mutate(expand_context_attrs)).perform
end
diff --git a/lib/gitlab/ci/config/external/rules.rb b/lib/gitlab/ci/config/external/rules.rb
index 134306332e6..59e666b8bb5 100644
--- a/lib/gitlab/ci/config/external/rules.rb
+++ b/lib/gitlab/ci/config/external/rules.rb
@@ -17,16 +17,12 @@ module Gitlab
end
def evaluate(context)
- if Feature.enabled?(:ci_support_include_rules_when_never, context.project)
- if @rule_list.nil?
- Result.new('always')
- elsif matched_rule = match_rule(context)
- Result.new(matched_rule.attributes[:when])
- else
- Result.new('never')
- end
+ if @rule_list.nil?
+ Result.new('always')
+ elsif matched_rule = match_rule(context)
+ Result.new(matched_rule.attributes[:when])
else
- LegacyResult.new(@rule_list.nil? || match_rule(context))
+ Result.new('never')
end
end
@@ -55,12 +51,6 @@ module Gitlab
self.when != 'never'
end
end
-
- LegacyResult = Struct.new(:result) do
- def pass?
- !!result
- end
- end
end
end
end
diff --git a/lib/gitlab/ci/config/yaml.rb b/lib/gitlab/ci/config/yaml.rb
index f74ef95a832..e3010ac3fdb 100644
--- a/lib/gitlab/ci/config/yaml.rb
+++ b/lib/gitlab/ci/config/yaml.rb
@@ -4,21 +4,17 @@ module Gitlab
module Ci
class Config
module Yaml
+ LoadError = Class.new(StandardError)
+
class << self
- def load!(content, project: nil)
- Loader.new(content, project: project).to_result.then do |result|
- ##
- # raise an error for backwards compatibility
- #
- raise result.error unless result.valid?
+ def load!(content, current_user: nil)
+ Loader.new(content, current_user: current_user).load.then do |result|
+ raise result.error_class, result.error if !result.valid? && result.error_class.present?
+ raise LoadError, result.error unless result.valid?
result.content
end
end
-
- def load_result!(content, project: nil)
- Loader.new(content, project: project).to_result
- end
end
end
end
diff --git a/lib/gitlab/ci/config/yaml/interpolator.rb b/lib/gitlab/ci/config/yaml/interpolator.rb
index 4ae191dfedf..2909c2ac798 100644
--- a/lib/gitlab/ci/config/yaml/interpolator.rb
+++ b/lib/gitlab/ci/config/yaml/interpolator.rb
@@ -5,42 +5,23 @@ module Gitlab
class Config
module Yaml
##
- # Config::Yaml::Interpolation performs includable file interpolation, and surfaces all possible interpolation
+ # Config::Yaml::Interpolator performs CI config file interpolation, and surfaces all possible interpolation
# errors. It is designed to provide an external file's validation context too.
#
class Interpolator
- include ::Gitlab::Utils::StrongMemoize
+ attr_reader :config, :args, :current_user, :errors
- attr_reader :config, :args, :ctx, :errors
-
- def initialize(config, args, ctx = nil)
+ def initialize(config, args, current_user: nil)
@config = config
@args = args.to_h
- @ctx = ctx
+ @current_user = current_user
@errors = []
-
- validate!
end
def valid?
@errors.none?
end
- def ready?
- ##
- # Interpolation is ready when it has been either interrupted by an error or finished with a result.
- #
- @result || @errors.any?
- end
-
- def interpolate?
- enabled? && has_header? && valid?
- end
-
- def has_header?
- config.has_header? && config.header.present?
- end
-
def to_hash
@result.to_h
end
@@ -55,43 +36,25 @@ module Gitlab
@errors.first(3).join(', ')
end
- ##
- # TODO Add `instrument.logger` instrumentation blocks:
- # https://gitlab.com/gitlab-org/gitlab/-/issues/396722
- #
def interpolate!
- return {} unless valid?
- return @result ||= content.to_h unless interpolate?
+ return @errors.push(config.error) unless config.valid?
+ return @result ||= config.content unless config.has_header?
return @errors.concat(header.errors) unless header.valid?
return @errors.concat(inputs.errors) unless inputs.valid?
return @errors.concat(context.errors) unless context.valid?
return @errors.concat(template.errors) unless template.valid?
- if ctx&.user
- ::Gitlab::UsageDataCounters::HLLRedisCounter.track_event('ci_interpolation_users', values: ctx.user.id)
+ if current_user.present?
+ ::Gitlab::UsageDataCounters::HLLRedisCounter
+ .track_event('ci_interpolation_users', values: current_user.id)
end
@result ||= template.interpolated.to_h.deep_symbolize_keys
end
- strong_memoize_attr :interpolate!
private
- def validate!
- return errors.push('content does not have a valid YAML syntax') unless config.valid?
-
- return unless has_header? && !enabled?
-
- errors.push('can not evaluate included file because interpolation is disabled')
- end
-
- def enabled?
- return false if ctx.nil?
-
- ::Feature.enabled?(:ci_includable_files_interpolation, ctx.project)
- end
-
def header
@entry ||= Ci::Config::Header::Root.new(config.header).tap do |header|
header.key = 'header'
diff --git a/lib/gitlab/ci/config/yaml/loader.rb b/lib/gitlab/ci/config/yaml/loader.rb
index 924a1f2e46b..fb24a2874e4 100644
--- a/lib/gitlab/ci/config/yaml/loader.rb
+++ b/lib/gitlab/ci/config/yaml/loader.rb
@@ -5,33 +5,45 @@ module Gitlab
class Config
module Yaml
class Loader
+ include Gitlab::Utils::StrongMemoize
+
AVAILABLE_TAGS = [Config::Yaml::Tags::Reference].freeze
MAX_DOCUMENTS = 2
- def initialize(content, project: nil)
+ def initialize(content, inputs: {}, current_user: nil)
@content = content
- @project = project
+ @current_user = current_user
+ @inputs = inputs
end
- def to_result
- Yaml::Result.new(config: load!, error: nil)
- rescue ::Gitlab::Config::Loader::FormatError => e
- Yaml::Result.new(error: e)
- end
+ def load
+ yaml_result = load_uninterpolated_yaml
- private
+ return yaml_result unless yaml_result.valid?
- attr_reader :content, :project
+ interpolator = Yaml::Interpolator.new(yaml_result, inputs, current_user: current_user)
- def ensure_custom_tags
- @ensure_custom_tags ||= begin
- AVAILABLE_TAGS.each { |klass| Psych.add_tag(klass.tag, klass) }
+ interpolator.interpolate!
- true
+ if interpolator.valid?
+ # This Result contains only the interpolated config and does not have a header
+ Yaml::Result.new(config: interpolator.to_hash, error: nil)
+ else
+ Yaml::Result.new(error: interpolator.error_message)
end
end
- def load!
+ private
+
+ attr_reader :content, :current_user, :inputs
+
+ def load_uninterpolated_yaml
+ Yaml::Result.new(config: load_yaml!, error: nil)
+ rescue ::Gitlab::Config::Loader::FormatError => e
+ Yaml::Result.new(error: e.message, error_class: e)
+ end
+
+ def load_yaml!
ensure_custom_tags
::Gitlab::Config::Loader::MultiDocYaml.new(
@@ -41,6 +53,14 @@ module Gitlab
reject_empty: true
).load!
end
+
+ def ensure_custom_tags
+ @ensure_custom_tags ||= begin
+ AVAILABLE_TAGS.each { |klass| Psych.add_tag(klass.tag, klass) }
+
+ true
+ end
+ end
end
end
end
diff --git a/lib/gitlab/ci/config/yaml/result.rb b/lib/gitlab/ci/config/yaml/result.rb
index 6b53adc3a57..6b20eeae203 100644
--- a/lib/gitlab/ci/config/yaml/result.rb
+++ b/lib/gitlab/ci/config/yaml/result.rb
@@ -5,11 +5,12 @@ module Gitlab
class Config
module Yaml
class Result
- attr_reader :error
+ attr_reader :error, :error_class
- def initialize(config: nil, error: nil)
+ def initialize(config: nil, error: nil, error_class: nil)
@config = Array.wrap(config)
@error = error
+ @error_class = error_class
end
def valid?
diff --git a/lib/gitlab/ci/jwt_v2.rb b/lib/gitlab/ci/jwt_v2.rb
index 9e71a9e8e91..6ce662bdead 100644
--- a/lib/gitlab/ci/jwt_v2.rb
+++ b/lib/gitlab/ci/jwt_v2.rb
@@ -3,6 +3,8 @@
module Gitlab
module Ci
class JwtV2 < Jwt
+ include Gitlab::Utils::StrongMemoize
+
DEFAULT_AUD = Settings.gitlab.base_url
GITLAB_HOSTED_RUNNER = 'gitlab-hosted'
SELF_HOSTED_RUNNER = 'self-hosted'
@@ -48,31 +50,35 @@ module Gitlab
sha: pipeline.sha
}
- if Feature.enabled?(:ci_jwt_v2_ref_uri_claim, pipeline.project)
+ if project_config&.source == :repository_source
additional_claims[:ci_config_ref_uri] = ci_config_ref_uri
+ additional_claims[:ci_config_sha] = pipeline.sha
end
super.merge(additional_claims)
end
def ci_config_ref_uri
- project_config = Gitlab::Ci::ProjectConfig.new(
+ "#{project_config&.url}@#{pipeline.source_ref_path}"
+ rescue StandardError => e
+ # We don't want endpoints relying on this code to fail if there's an error here.
+ Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e, pipeline_id: pipeline.id)
+ nil
+ end
+
+ def project_config
+ Gitlab::Ci::ProjectConfig.new(
project: project,
sha: pipeline.sha,
pipeline_source: pipeline.source&.to_sym,
pipeline_source_bridge: pipeline.source_bridge
)
-
- return unless project_config&.source == :repository_source
-
- "#{project_config.url}@#{pipeline.source_ref_path}"
-
- # Errors are rescued to mitigate risk. This can be removed if no errors are observed.
- # See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/117923#note_1387660746 for context.
rescue StandardError => e
+ # We don't want endpoints relying on this code to fail if there's an error here.
Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e, pipeline_id: pipeline.id)
nil
end
+ strong_memoize_attr(:project_config)
def runner_environment
return unless runner
diff --git a/lib/gitlab/ci/parsers/security/common.rb b/lib/gitlab/ci/parsers/security/common.rb
index 21408beb8cb..ee1da82f285 100644
--- a/lib/gitlab/ci/parsers/security/common.rb
+++ b/lib/gitlab/ci/parsers/security/common.rb
@@ -126,8 +126,8 @@ module Gitlab
compare_key: data['cve'] || '',
location: location,
evidence: evidence,
- severity: parse_severity_level(data['severity']),
- confidence: parse_confidence_level(data['confidence']),
+ severity: ::Enums::Vulnerability.parse_severity_level(data['severity']),
+ confidence: ::Enums::Vulnerability.parse_confidence_level(data['confidence']),
scanner: create_scanner(top_level_scanner_data || data['scanner']),
scan: report&.scan,
identifiers: identifiers,
@@ -260,14 +260,6 @@ module Gitlab
::Gitlab::Ci::Reports::Security::Link.new(name: link['name'], url: link['url'])
end
- def parse_severity_level(input)
- input&.downcase.then { |value| ::Enums::Vulnerability.severity_levels.key?(value) ? value : 'unknown' }
- end
-
- def parse_confidence_level(input)
- input&.downcase.then { |value| ::Enums::Vulnerability.confidence_levels.key?(value) ? value : 'unknown' }
- end
-
def create_location(location_data)
raise NotImplementedError
end
diff --git a/lib/gitlab/ci/parsers/security/validators/schema_validator.rb b/lib/gitlab/ci/parsers/security/validators/schema_validator.rb
index 92d9d170575..e39482481c7 100644
--- a/lib/gitlab/ci/parsers/security/validators/schema_validator.rb
+++ b/lib/gitlab/ci/parsers/security/validators/schema_validator.rb
@@ -7,14 +7,14 @@ module Gitlab
module Validators
class SchemaValidator
SUPPORTED_VERSIONS = {
- cluster_image_scanning: %w[15.0.0 15.0.1 15.0.2 15.0.4 15.0.6],
- container_scanning: %w[15.0.0 15.0.1 15.0.2 15.0.4 15.0.6],
- coverage_fuzzing: %w[15.0.0 15.0.1 15.0.2 15.0.4 15.0.6],
- dast: %w[15.0.0 15.0.1 15.0.2 15.0.4 15.0.6],
- api_fuzzing: %w[15.0.0 15.0.1 15.0.2 15.0.4 15.0.6],
- dependency_scanning: %w[15.0.0 15.0.1 15.0.2 15.0.4 15.0.6],
- sast: %w[15.0.0 15.0.1 15.0.2 15.0.4 15.0.6],
- secret_detection: %w[15.0.0 15.0.1 15.0.2 15.0.4 15.0.6]
+ cluster_image_scanning: %w[15.0.0 15.0.1 15.0.2 15.0.4 15.0.5 15.0.6],
+ container_scanning: %w[15.0.0 15.0.1 15.0.2 15.0.4 15.0.5 15.0.6],
+ coverage_fuzzing: %w[15.0.0 15.0.1 15.0.2 15.0.4 15.0.5 15.0.6],
+ dast: %w[15.0.0 15.0.1 15.0.2 15.0.4 15.0.5 15.0.6],
+ api_fuzzing: %w[15.0.0 15.0.1 15.0.2 15.0.4 15.0.5 15.0.6],
+ dependency_scanning: %w[15.0.0 15.0.1 15.0.2 15.0.4 15.0.5 15.0.6],
+ sast: %w[15.0.0 15.0.1 15.0.2 15.0.4 15.0.5 15.0.6],
+ secret_detection: %w[15.0.0 15.0.1 15.0.2 15.0.4 15.0.5 15.0.6]
}.freeze
VERSIONS_TO_REMOVE_IN_17_0 = %w[].freeze
diff --git a/lib/gitlab/ci/parsers/security/validators/schemas/15.0.5/cluster-image-scanning-report-format.json b/lib/gitlab/ci/parsers/security/validators/schemas/15.0.5/cluster-image-scanning-report-format.json
new file mode 100644
index 00000000000..5563acbe232
--- /dev/null
+++ b/lib/gitlab/ci/parsers/security/validators/schemas/15.0.5/cluster-image-scanning-report-format.json
@@ -0,0 +1,1035 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "$id": "https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/raw/master/dist/cluster-image-scanning-report-format.json",
+ "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",
+ "type": "string",
+ "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": "15.0.5"
+ },
+ "type": "object",
+ "required": [
+ "scan",
+ "version",
+ "vulnerabilities"
+ ],
+ "additionalProperties": true,
+ "properties": {
+ "scan": {
+ "type": "object",
+ "required": [
+ "analyzer",
+ "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"
+ ]
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "A configuration option used for this scan.",
+ "required": [
+ "name",
+ "value"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The configuration option name.",
+ "maxLength": 255,
+ "minLength": 1,
+ "examples": [
+ "DAST_FF_ENABLE_BAS",
+ "DOCKER_TLS_CERTDIR",
+ "DS_MAX_DEPTH",
+ "SECURE_LOG_LEVEL"
+ ]
+ },
+ "source": {
+ "type": "string",
+ "description": "The source of this option.",
+ "enum": [
+ "argument",
+ "file",
+ "env_variable",
+ "other"
+ ]
+ },
+ "value": {
+ "type": [
+ "boolean",
+ "integer",
+ "null",
+ "string"
+ ],
+ "description": "The value used for this scan.",
+ "examples": [
+ true,
+ 2,
+ null,
+ "fatal",
+ ""
+ ]
+ }
+ }
+ }
+ },
+ "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",
+ "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"
+ ]
+ },
+ "primary_identifiers": {
+ "type": "array",
+ "description": "An unordered array containing an exhaustive list of primary identifiers for which the analyzer may return results",
+ "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.",
+ "pattern": "^https?://.+"
+ },
+ "value": {
+ "type": "string",
+ "description": "Value of the identifier, for matching purpose.",
+ "minLength": 1
+ }
+ }
+ }
+ }
+ }
+ },
+ "schema": {
+ "type": "string",
+ "description": "URI pointing to the validating security report schema.",
+ "pattern": "^https?://.+"
+ },
+ "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": [
+ "id",
+ "identifiers",
+ "location"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Unique identifier of the vulnerability. This is recommended to be a UUID.",
+ "examples": [
+ "642735a5-1425-428d-8d4e-3c854885a3c9"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 255,
+ "description": "The name of the vulnerability. This must not include the finding's specific information."
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 1048576,
+ "description": "A long text section describing the vulnerability more fully."
+ },
+ "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"
+ ]
+ },
+ "solution": {
+ "type": "string",
+ "maxLength": 7000,
+ "description": "Explanation of how to fix the vulnerability."
+ },
+ "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.",
+ "pattern": "^https?://.+"
+ },
+ "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.",
+ "pattern": "^https?://.+"
+ }
+ }
+ }
+ },
+ "details": {
+ "$ref": "#/definitions/named_list/properties/items"
+ },
+ "tracking": {
+ "type": "object",
+ "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.",
+ "type": "object",
+ "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.",
+ "required": [
+ "package",
+ "version"
+ ],
+ "properties": {
+ "package": {
+ "type": "object",
+ "description": "Provides information on the package where the vulnerability is located.",
+ "required": [
+ "name"
+ ],
+ "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": [
+ "id"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Unique identifier of the vulnerability. This is recommended to be a UUID.",
+ "examples": [
+ "642735a5-1425-428d-8d4e-3c854885a3c9"
+ ]
+ }
+ }
+ }
+ },
+ "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/15.0.5/container-scanning-report-format.json b/lib/gitlab/ci/parsers/security/validators/schemas/15.0.5/container-scanning-report-format.json
new file mode 100644
index 00000000000..820811100ea
--- /dev/null
+++ b/lib/gitlab/ci/parsers/security/validators/schemas/15.0.5/container-scanning-report-format.json
@@ -0,0 +1,967 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "$id": "https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/raw/master/dist/container-scanning-report-format.json",
+ "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",
+ "type": "string",
+ "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": "15.0.5"
+ },
+ "type": "object",
+ "required": [
+ "scan",
+ "version",
+ "vulnerabilities"
+ ],
+ "additionalProperties": true,
+ "properties": {
+ "scan": {
+ "type": "object",
+ "required": [
+ "analyzer",
+ "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"
+ ]
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "A configuration option used for this scan.",
+ "required": [
+ "name",
+ "value"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The configuration option name.",
+ "maxLength": 255,
+ "minLength": 1,
+ "examples": [
+ "DAST_FF_ENABLE_BAS",
+ "DOCKER_TLS_CERTDIR",
+ "DS_MAX_DEPTH",
+ "SECURE_LOG_LEVEL"
+ ]
+ },
+ "source": {
+ "type": "string",
+ "description": "The source of this option.",
+ "enum": [
+ "argument",
+ "file",
+ "env_variable",
+ "other"
+ ]
+ },
+ "value": {
+ "type": [
+ "boolean",
+ "integer",
+ "null",
+ "string"
+ ],
+ "description": "The value used for this scan.",
+ "examples": [
+ true,
+ 2,
+ null,
+ "fatal",
+ ""
+ ]
+ }
+ }
+ }
+ },
+ "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",
+ "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"
+ ]
+ },
+ "primary_identifiers": {
+ "type": "array",
+ "description": "An unordered array containing an exhaustive list of primary identifiers for which the analyzer may return results",
+ "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.",
+ "pattern": "^https?://.+"
+ },
+ "value": {
+ "type": "string",
+ "description": "Value of the identifier, for matching purpose.",
+ "minLength": 1
+ }
+ }
+ }
+ }
+ }
+ },
+ "schema": {
+ "type": "string",
+ "description": "URI pointing to the validating security report schema.",
+ "pattern": "^https?://.+"
+ },
+ "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": [
+ "id",
+ "identifiers",
+ "location"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Unique identifier of the vulnerability. This is recommended to be a UUID.",
+ "examples": [
+ "642735a5-1425-428d-8d4e-3c854885a3c9"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 255,
+ "description": "The name of the vulnerability. This must not include the finding's specific information."
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 1048576,
+ "description": "A long text section describing the vulnerability more fully."
+ },
+ "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"
+ ]
+ },
+ "solution": {
+ "type": "string",
+ "maxLength": 7000,
+ "description": "Explanation of how to fix the vulnerability."
+ },
+ "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.",
+ "pattern": "^https?://.+"
+ },
+ "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.",
+ "pattern": "^https?://.+"
+ }
+ }
+ }
+ },
+ "details": {
+ "$ref": "#/definitions/named_list/properties/items"
+ },
+ "tracking": {
+ "type": "object",
+ "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.",
+ "type": "object",
+ "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.",
+ "required": [
+ "package",
+ "version"
+ ],
+ "properties": {
+ "package": {
+ "type": "object",
+ "description": "Provides information on the package where the vulnerability is located.",
+ "required": [
+ "name"
+ ],
+ "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,
+ "description": "The analyzed Docker image."
+ },
+ "default_branch_image": {
+ "type": "string",
+ "maxLength": 255,
+ "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": [
+ "id"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Unique identifier of the vulnerability. This is recommended to be a UUID.",
+ "examples": [
+ "642735a5-1425-428d-8d4e-3c854885a3c9"
+ ]
+ }
+ }
+ }
+ },
+ "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/15.0.5/coverage-fuzzing-report-format.json b/lib/gitlab/ci/parsers/security/validators/schemas/15.0.5/coverage-fuzzing-report-format.json
new file mode 100644
index 00000000000..63e39395772
--- /dev/null
+++ b/lib/gitlab/ci/parsers/security/validators/schemas/15.0.5/coverage-fuzzing-report-format.json
@@ -0,0 +1,925 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "$id": "https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/raw/master/dist/coverage-fuzzing-report-format.json",
+ "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",
+ "type": "string",
+ "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": "15.0.5"
+ },
+ "type": "object",
+ "required": [
+ "scan",
+ "version",
+ "vulnerabilities"
+ ],
+ "additionalProperties": true,
+ "properties": {
+ "scan": {
+ "type": "object",
+ "required": [
+ "analyzer",
+ "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"
+ ]
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "A configuration option used for this scan.",
+ "required": [
+ "name",
+ "value"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The configuration option name.",
+ "maxLength": 255,
+ "minLength": 1,
+ "examples": [
+ "DAST_FF_ENABLE_BAS",
+ "DOCKER_TLS_CERTDIR",
+ "DS_MAX_DEPTH",
+ "SECURE_LOG_LEVEL"
+ ]
+ },
+ "source": {
+ "type": "string",
+ "description": "The source of this option.",
+ "enum": [
+ "argument",
+ "file",
+ "env_variable",
+ "other"
+ ]
+ },
+ "value": {
+ "type": [
+ "boolean",
+ "integer",
+ "null",
+ "string"
+ ],
+ "description": "The value used for this scan.",
+ "examples": [
+ true,
+ 2,
+ null,
+ "fatal",
+ ""
+ ]
+ }
+ }
+ }
+ },
+ "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",
+ "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"
+ ]
+ },
+ "primary_identifiers": {
+ "type": "array",
+ "description": "An unordered array containing an exhaustive list of primary identifiers for which the analyzer may return results",
+ "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.",
+ "pattern": "^https?://.+"
+ },
+ "value": {
+ "type": "string",
+ "description": "Value of the identifier, for matching purpose.",
+ "minLength": 1
+ }
+ }
+ }
+ }
+ }
+ },
+ "schema": {
+ "type": "string",
+ "description": "URI pointing to the validating security report schema.",
+ "pattern": "^https?://.+"
+ },
+ "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": [
+ "id",
+ "identifiers",
+ "location"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Unique identifier of the vulnerability. This is recommended to be a UUID.",
+ "examples": [
+ "642735a5-1425-428d-8d4e-3c854885a3c9"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 255,
+ "description": "The name of the vulnerability. This must not include the finding's specific information."
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 1048576,
+ "description": "A long text section describing the vulnerability more fully."
+ },
+ "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"
+ ]
+ },
+ "solution": {
+ "type": "string",
+ "maxLength": 7000,
+ "description": "Explanation of how to fix the vulnerability."
+ },
+ "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.",
+ "pattern": "^https?://.+"
+ },
+ "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.",
+ "pattern": "^https?://.+"
+ }
+ }
+ }
+ },
+ "details": {
+ "$ref": "#/definitions/named_list/properties/items"
+ },
+ "tracking": {
+ "type": "object",
+ "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.",
+ "type": "object",
+ "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": [
+ "id"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Unique identifier of the vulnerability. This is recommended to be a UUID.",
+ "examples": [
+ "642735a5-1425-428d-8d4e-3c854885a3c9"
+ ]
+ }
+ }
+ }
+ },
+ "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/15.0.5/dast-report-format.json b/lib/gitlab/ci/parsers/security/validators/schemas/15.0.5/dast-report-format.json
new file mode 100644
index 00000000000..86e62558a39
--- /dev/null
+++ b/lib/gitlab/ci/parsers/security/validators/schemas/15.0.5/dast-report-format.json
@@ -0,0 +1,1330 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "$id": "https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/raw/master/dist/dast-report-format.json",
+ "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",
+ "type": "string",
+ "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": "15.0.5"
+ },
+ "type": "object",
+ "required": [
+ "scan",
+ "version",
+ "vulnerabilities"
+ ],
+ "additionalProperties": true,
+ "properties": {
+ "scan": {
+ "type": "object",
+ "required": [
+ "analyzer",
+ "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"
+ ]
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "A configuration option used for this scan.",
+ "required": [
+ "name",
+ "value"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The configuration option name.",
+ "maxLength": 255,
+ "minLength": 1,
+ "examples": [
+ "DAST_FF_ENABLE_BAS",
+ "DOCKER_TLS_CERTDIR",
+ "DS_MAX_DEPTH",
+ "SECURE_LOG_LEVEL"
+ ]
+ },
+ "source": {
+ "type": "string",
+ "description": "The source of this option.",
+ "enum": [
+ "argument",
+ "file",
+ "env_variable",
+ "other"
+ ]
+ },
+ "value": {
+ "type": [
+ "boolean",
+ "integer",
+ "null",
+ "string"
+ ],
+ "description": "The value used for this scan.",
+ "examples": [
+ true,
+ 2,
+ null,
+ "fatal",
+ ""
+ ]
+ }
+ }
+ }
+ },
+ "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",
+ "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"
+ ]
+ },
+ "primary_identifiers": {
+ "type": "array",
+ "description": "An unordered array containing an exhaustive list of primary identifiers for which the analyzer may return results",
+ "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.",
+ "pattern": "^https?://.+"
+ },
+ "value": {
+ "type": "string",
+ "description": "Value of the identifier, for matching purpose.",
+ "minLength": 1
+ }
+ }
+ }
+ },
+ "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.",
+ "pattern": "^https?://.+"
+ },
+ "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": [
+ "id",
+ "identifiers",
+ "location"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Unique identifier of the vulnerability. This is recommended to be a UUID.",
+ "examples": [
+ "642735a5-1425-428d-8d4e-3c854885a3c9"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 255,
+ "description": "The name of the vulnerability. This must not include the finding's specific information."
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 1048576,
+ "description": "A long text section describing the vulnerability more fully."
+ },
+ "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"
+ ]
+ },
+ "solution": {
+ "type": "string",
+ "maxLength": 7000,
+ "description": "Explanation of how to fix the vulnerability."
+ },
+ "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.",
+ "pattern": "^https?://.+"
+ },
+ "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.",
+ "pattern": "^https?://.+"
+ }
+ }
+ }
+ },
+ "details": {
+ "$ref": "#/definitions/named_list/properties/items"
+ },
+ "tracking": {
+ "type": "object",
+ "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.",
+ "type": "object",
+ "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"
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "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": [
+ "id"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Unique identifier of the vulnerability. This is recommended to be a UUID.",
+ "examples": [
+ "642735a5-1425-428d-8d4e-3c854885a3c9"
+ ]
+ }
+ }
+ }
+ },
+ "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/15.0.5/dependency-scanning-report-format.json b/lib/gitlab/ci/parsers/security/validators/schemas/15.0.5/dependency-scanning-report-format.json
new file mode 100644
index 00000000000..c08cbcffc5b
--- /dev/null
+++ b/lib/gitlab/ci/parsers/security/validators/schemas/15.0.5/dependency-scanning-report-format.json
@@ -0,0 +1,1033 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "$id": "https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/raw/master/dist/dependency-scanning-report-format.json",
+ "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",
+ "type": "string",
+ "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": "15.0.5"
+ },
+ "type": "object",
+ "required": [
+ "dependency_files",
+ "scan",
+ "version",
+ "vulnerabilities"
+ ],
+ "additionalProperties": true,
+ "properties": {
+ "scan": {
+ "type": "object",
+ "required": [
+ "analyzer",
+ "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"
+ ]
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "A configuration option used for this scan.",
+ "required": [
+ "name",
+ "value"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The configuration option name.",
+ "maxLength": 255,
+ "minLength": 1,
+ "examples": [
+ "DAST_FF_ENABLE_BAS",
+ "DOCKER_TLS_CERTDIR",
+ "DS_MAX_DEPTH",
+ "SECURE_LOG_LEVEL"
+ ]
+ },
+ "source": {
+ "type": "string",
+ "description": "The source of this option.",
+ "enum": [
+ "argument",
+ "file",
+ "env_variable",
+ "other"
+ ]
+ },
+ "value": {
+ "type": [
+ "boolean",
+ "integer",
+ "null",
+ "string"
+ ],
+ "description": "The value used for this scan.",
+ "examples": [
+ true,
+ 2,
+ null,
+ "fatal",
+ ""
+ ]
+ }
+ }
+ }
+ },
+ "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",
+ "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"
+ ]
+ },
+ "primary_identifiers": {
+ "type": "array",
+ "description": "An unordered array containing an exhaustive list of primary identifiers for which the analyzer may return results",
+ "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.",
+ "pattern": "^https?://.+"
+ },
+ "value": {
+ "type": "string",
+ "description": "Value of the identifier, for matching purpose.",
+ "minLength": 1
+ }
+ }
+ }
+ }
+ }
+ },
+ "schema": {
+ "type": "string",
+ "description": "URI pointing to the validating security report schema.",
+ "pattern": "^https?://.+"
+ },
+ "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": [
+ "id",
+ "identifiers",
+ "location"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Unique identifier of the vulnerability. This is recommended to be a UUID.",
+ "examples": [
+ "642735a5-1425-428d-8d4e-3c854885a3c9"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 255,
+ "description": "The name of the vulnerability. This must not include the finding's specific information."
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 1048576,
+ "description": "A long text section describing the vulnerability more fully."
+ },
+ "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"
+ ]
+ },
+ "solution": {
+ "type": "string",
+ "maxLength": 7000,
+ "description": "Explanation of how to fix the vulnerability."
+ },
+ "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.",
+ "pattern": "^https?://.+"
+ },
+ "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.",
+ "pattern": "^https?://.+"
+ }
+ }
+ }
+ },
+ "details": {
+ "$ref": "#/definitions/named_list/properties/items"
+ },
+ "tracking": {
+ "type": "object",
+ "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.",
+ "type": "object",
+ "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.",
+ "required": [
+ "package",
+ "version"
+ ],
+ "properties": {
+ "package": {
+ "type": "object",
+ "description": "Provides information on the package where the vulnerability is located.",
+ "required": [
+ "name"
+ ],
+ "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": [
+ "id"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Unique identifier of the vulnerability. This is recommended to be a UUID.",
+ "examples": [
+ "642735a5-1425-428d-8d4e-3c854885a3c9"
+ ]
+ }
+ }
+ }
+ },
+ "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.",
+ "required": [
+ "package",
+ "version"
+ ],
+ "properties": {
+ "package": {
+ "type": "object",
+ "description": "Provides information on the package where the vulnerability is located.",
+ "required": [
+ "name"
+ ],
+ "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/15.0.5/sast-report-format.json b/lib/gitlab/ci/parsers/security/validators/schemas/15.0.5/sast-report-format.json
new file mode 100644
index 00000000000..f1869950d20
--- /dev/null
+++ b/lib/gitlab/ci/parsers/security/validators/schemas/15.0.5/sast-report-format.json
@@ -0,0 +1,920 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "$id": "https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/raw/master/dist/sast-report-format.json",
+ "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",
+ "type": "string",
+ "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": "15.0.5"
+ },
+ "type": "object",
+ "required": [
+ "scan",
+ "version",
+ "vulnerabilities"
+ ],
+ "additionalProperties": true,
+ "properties": {
+ "scan": {
+ "type": "object",
+ "required": [
+ "analyzer",
+ "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"
+ ]
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "A configuration option used for this scan.",
+ "required": [
+ "name",
+ "value"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The configuration option name.",
+ "maxLength": 255,
+ "minLength": 1,
+ "examples": [
+ "DAST_FF_ENABLE_BAS",
+ "DOCKER_TLS_CERTDIR",
+ "DS_MAX_DEPTH",
+ "SECURE_LOG_LEVEL"
+ ]
+ },
+ "source": {
+ "type": "string",
+ "description": "The source of this option.",
+ "enum": [
+ "argument",
+ "file",
+ "env_variable",
+ "other"
+ ]
+ },
+ "value": {
+ "type": [
+ "boolean",
+ "integer",
+ "null",
+ "string"
+ ],
+ "description": "The value used for this scan.",
+ "examples": [
+ true,
+ 2,
+ null,
+ "fatal",
+ ""
+ ]
+ }
+ }
+ }
+ },
+ "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",
+ "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"
+ ]
+ },
+ "primary_identifiers": {
+ "type": "array",
+ "description": "An unordered array containing an exhaustive list of primary identifiers for which the analyzer may return results",
+ "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.",
+ "pattern": "^https?://.+"
+ },
+ "value": {
+ "type": "string",
+ "description": "Value of the identifier, for matching purpose.",
+ "minLength": 1
+ }
+ }
+ }
+ }
+ }
+ },
+ "schema": {
+ "type": "string",
+ "description": "URI pointing to the validating security report schema.",
+ "pattern": "^https?://.+"
+ },
+ "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": [
+ "id",
+ "identifiers",
+ "location"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Unique identifier of the vulnerability. This is recommended to be a UUID.",
+ "examples": [
+ "642735a5-1425-428d-8d4e-3c854885a3c9"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 255,
+ "description": "The name of the vulnerability. This must not include the finding's specific information."
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 1048576,
+ "description": "A long text section describing the vulnerability more fully."
+ },
+ "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"
+ ]
+ },
+ "solution": {
+ "type": "string",
+ "maxLength": 7000,
+ "description": "Explanation of how to fix the vulnerability."
+ },
+ "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.",
+ "pattern": "^https?://.+"
+ },
+ "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.",
+ "pattern": "^https?://.+"
+ }
+ }
+ }
+ },
+ "details": {
+ "$ref": "#/definitions/named_list/properties/items"
+ },
+ "tracking": {
+ "type": "object",
+ "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.",
+ "type": "object",
+ "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": [
+ "id"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Unique identifier of the vulnerability. This is recommended to be a UUID.",
+ "examples": [
+ "642735a5-1425-428d-8d4e-3c854885a3c9"
+ ]
+ }
+ }
+ }
+ },
+ "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/15.0.5/secret-detection-report-format.json b/lib/gitlab/ci/parsers/security/validators/schemas/15.0.5/secret-detection-report-format.json
new file mode 100644
index 00000000000..e9bfd6186a3
--- /dev/null
+++ b/lib/gitlab/ci/parsers/security/validators/schemas/15.0.5/secret-detection-report-format.json
@@ -0,0 +1,944 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "$id": "https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/raw/master/dist/secret-detection-report-format.json",
+ "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",
+ "type": "string",
+ "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": "15.0.5"
+ },
+ "type": "object",
+ "required": [
+ "scan",
+ "version",
+ "vulnerabilities"
+ ],
+ "additionalProperties": true,
+ "properties": {
+ "scan": {
+ "type": "object",
+ "required": [
+ "analyzer",
+ "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"
+ ]
+ }
+ }
+ }
+ },
+ "options": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "A configuration option used for this scan.",
+ "required": [
+ "name",
+ "value"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The configuration option name.",
+ "maxLength": 255,
+ "minLength": 1,
+ "examples": [
+ "DAST_FF_ENABLE_BAS",
+ "DOCKER_TLS_CERTDIR",
+ "DS_MAX_DEPTH",
+ "SECURE_LOG_LEVEL"
+ ]
+ },
+ "source": {
+ "type": "string",
+ "description": "The source of this option.",
+ "enum": [
+ "argument",
+ "file",
+ "env_variable",
+ "other"
+ ]
+ },
+ "value": {
+ "type": [
+ "boolean",
+ "integer",
+ "null",
+ "string"
+ ],
+ "description": "The value used for this scan.",
+ "examples": [
+ true,
+ 2,
+ null,
+ "fatal",
+ ""
+ ]
+ }
+ }
+ }
+ },
+ "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",
+ "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"
+ ]
+ },
+ "primary_identifiers": {
+ "type": "array",
+ "description": "An unordered array containing an exhaustive list of primary identifiers for which the analyzer may return results",
+ "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.",
+ "pattern": "^https?://.+"
+ },
+ "value": {
+ "type": "string",
+ "description": "Value of the identifier, for matching purpose.",
+ "minLength": 1
+ }
+ }
+ }
+ }
+ }
+ },
+ "schema": {
+ "type": "string",
+ "description": "URI pointing to the validating security report schema.",
+ "pattern": "^https?://.+"
+ },
+ "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": [
+ "id",
+ "identifiers",
+ "location"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Unique identifier of the vulnerability. This is recommended to be a UUID.",
+ "examples": [
+ "642735a5-1425-428d-8d4e-3c854885a3c9"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 255,
+ "description": "The name of the vulnerability. This must not include the finding's specific information."
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 1048576,
+ "description": "A long text section describing the vulnerability more fully."
+ },
+ "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"
+ ]
+ },
+ "solution": {
+ "type": "string",
+ "maxLength": 7000,
+ "description": "Explanation of how to fix the vulnerability."
+ },
+ "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.",
+ "pattern": "^https?://.+"
+ },
+ "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.",
+ "pattern": "^https?://.+"
+ }
+ }
+ }
+ },
+ "details": {
+ "$ref": "#/definitions/named_list/properties/items"
+ },
+ "tracking": {
+ "type": "object",
+ "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.",
+ "type": "object",
+ "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"
+ ],
+ "type": "object",
+ "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": [
+ "id"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Unique identifier of the vulnerability. This is recommended to be a UUID.",
+ "examples": [
+ "642735a5-1425-428d-8d4e-3c854885a3c9"
+ ]
+ }
+ }
+ }
+ },
+ "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/validate/abilities.rb b/lib/gitlab/ci/pipeline/chain/validate/abilities.rb
index 035167f1a74..b8b70a6b6b6 100644
--- a/lib/gitlab/ci/pipeline/chain/validate/abilities.rb
+++ b/lib/gitlab/ci/pipeline/chain/validate/abilities.rb
@@ -22,7 +22,7 @@ module Gitlab
return error('Insufficient permissions to create a new pipeline')
end
- unless allowed_to_write_ref?
+ unless allowed_to_run_pipeline?
error("You do not have sufficient permission to run a pipeline on '#{command.ref}'. Please select a different branch or contact your administrator for assistance.")
end
end
@@ -37,6 +37,10 @@ module Gitlab
can?(current_user, :create_pipeline, project)
end
+ def allowed_to_run_pipeline?
+ allowed_to_write_ref?
+ end
+
def allowed_to_write_ref?
access = Gitlab::UserAccess.new(current_user, container: project)
diff --git a/lib/gitlab/ci/project_config/bridge.rb b/lib/gitlab/ci/project_config/bridge.rb
index c342ab2c215..45aa330508f 100644
--- a/lib/gitlab/ci/project_config/bridge.rb
+++ b/lib/gitlab/ci/project_config/bridge.rb
@@ -10,6 +10,11 @@ module Gitlab
pipeline_source_bridge.yaml_for_downstream
end
+ # Bridge.yaml_for_downstream injects an `include`
+ def internal_include_prepended?
+ true
+ end
+
def source
:bridge_source
end
diff --git a/lib/gitlab/ci/project_config/repository.rb b/lib/gitlab/ci/project_config/repository.rb
index 7dfd528fd6f..a08cf27b74c 100644
--- a/lib/gitlab/ci/project_config/repository.rb
+++ b/lib/gitlab/ci/project_config/repository.rb
@@ -4,6 +4,8 @@ module Gitlab
module Ci
class ProjectConfig
class Repository < Source
+ extend ::Gitlab::Utils::Override
+
def content
strong_memoize(:content) do
next unless file_in_repository?
diff --git a/lib/gitlab/ci/project_config/source.rb b/lib/gitlab/ci/project_config/source.rb
index 68853ca8296..5f37c3bad7b 100644
--- a/lib/gitlab/ci/project_config/source.rb
+++ b/lib/gitlab/ci/project_config/source.rb
@@ -5,7 +5,6 @@ module Gitlab
class ProjectConfig
class Source
include Gitlab::Utils::StrongMemoize
- extend ::Gitlab::Utils::Override
def initialize(project, sha, custom_content, pipeline_source, pipeline_source_bridge)
@project = project
diff --git a/lib/gitlab/ci/reports/sbom/source.rb b/lib/gitlab/ci/reports/sbom/source.rb
index fbb8644c1b0..b7af6ea17c3 100644
--- a/lib/gitlab/ci/reports/sbom/source.rb
+++ b/lib/gitlab/ci/reports/sbom/source.rb
@@ -11,6 +11,22 @@ module Gitlab
@source_type = type
@data = data
end
+
+ def source_file_path
+ data.dig('source_file', 'path')
+ end
+
+ def input_file_path
+ data.dig('input_file', 'path')
+ end
+
+ def packager
+ data.dig('package_manager', 'name')
+ end
+
+ def language
+ data.dig('language', 'name')
+ end
end
end
end
diff --git a/lib/gitlab/ci/reports/security/link.rb b/lib/gitlab/ci/reports/security/link.rb
index 1c4c05cd9ac..6804d2b2a29 100644
--- a/lib/gitlab/ci/reports/security/link.rb
+++ b/lib/gitlab/ci/reports/security/link.rb
@@ -18,6 +18,10 @@ module Gitlab
url: url
}.compact
end
+
+ def ==(other)
+ name == other.name && url == other.url
+ end
end
end
end
diff --git a/lib/gitlab/ci/templates/Jobs/Build.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/Build.gitlab-ci.yml
index 49d3c270bac..46d0b92b243 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.34.0'
+ AUTO_BUILD_IMAGE_VERSION: 'v1.37.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 49d3c270bac..46d0b92b243 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.34.0'
+ AUTO_BUILD_IMAGE_VERSION: 'v1.37.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 f4a13d61ba2..b1e498a9d09 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.50.0'
+ DAST_AUTO_DEPLOY_IMAGE_VERSION: 'v2.51.0'
.dast-auto-deploy:
image: "${CI_TEMPLATE_REGISTRY_HOST}/gitlab-org/cluster-integration/auto-deploy-image:${DAST_AUTO_DEPLOY_IMAGE_VERSION}"
diff --git a/lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml
index c1a3daa7f5b..5a7e69b62d9 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.50.0'
+ AUTO_DEPLOY_IMAGE_VERSION: 'v2.51.0'
.auto-deploy:
image: "${CI_TEMPLATE_REGISTRY_HOST}/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 a3c7c6baf02..dac559db8d5 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.50.0'
+ AUTO_DEPLOY_IMAGE_VERSION: 'v2.51.0'
.auto-deploy:
image: "${CI_TEMPLATE_REGISTRY_HOST}/gitlab-org/cluster-integration/auto-deploy-image:${AUTO_DEPLOY_IMAGE_VERSION}"
diff --git a/lib/gitlab/ci/templates/Terraform/Base.gitlab-ci.yml b/lib/gitlab/ci/templates/Terraform/Base.gitlab-ci.yml
index f16c28e7b60..87d0894b67a 100644
--- a/lib/gitlab/ci/templates/Terraform/Base.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Terraform/Base.gitlab-ci.yml
@@ -20,18 +20,18 @@ cache:
paths:
- ${TF_ROOT}/.terraform/
-.terraform:fmt: &terraform_fmt
+.terraform:fmt:
stage: validate
script:
- gitlab-terraform fmt
allow_failure: true
-.terraform:validate: &terraform_validate
+.terraform:validate:
stage: validate
script:
- gitlab-terraform validate
-.terraform:build: &terraform_build
+.terraform:build:
stage: build
script:
- gitlab-terraform plan
@@ -46,7 +46,7 @@ cache:
reports:
terraform: ${TF_ROOT}/plan.json
-.terraform:deploy: &terraform_deploy
+.terraform:deploy:
stage: deploy
script:
- gitlab-terraform apply
@@ -56,7 +56,7 @@ cache:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
when: manual
-.terraform:destroy: &terraform_destroy
+.terraform:destroy:
stage: cleanup
script:
- gitlab-terraform destroy
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 793030d302a..d2b929cf995 100644
--- a/lib/gitlab/ci/templates/Terraform/Base.latest.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Terraform/Base.latest.gitlab-ci.yml
@@ -22,7 +22,7 @@ variables:
TF_ROOT: ${CI_PROJECT_DIR} # The relative path to the root directory of the Terraform project
TF_STATE_NAME: default # The name of the state file used by the GitLab Managed Terraform state backend
-.terraform:fmt: &terraform_fmt
+.terraform:fmt:
stage: validate
script:
- gitlab-terraform fmt
@@ -33,7 +33,7 @@ variables:
when: never
- if: $CI_COMMIT_BRANCH # If there's no open merge request, add it to a *branch* pipeline instead.
-.terraform:validate: &terraform_validate
+.terraform:validate:
stage: validate
script:
- gitlab-terraform validate
@@ -43,7 +43,7 @@ variables:
when: never
- if: $CI_COMMIT_BRANCH # If there's no open merge request, add it to a *branch* pipeline instead.
-.terraform:build: &terraform_build
+.terraform:build:
stage: build
script:
- gitlab-terraform plan
@@ -63,7 +63,7 @@ variables:
when: never
- if: $CI_COMMIT_BRANCH # If there's no open merge request, add it to a *branch* pipeline instead.
-.terraform:deploy: &terraform_deploy
+.terraform:deploy:
stage: deploy
script:
- gitlab-terraform apply
@@ -73,7 +73,7 @@ variables:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
when: manual
-.terraform:destroy: &terraform_destroy
+.terraform:destroy:
stage: cleanup
script:
- gitlab-terraform destroy
diff --git a/lib/gitlab/ci/templates/npm.gitlab-ci.yml b/lib/gitlab/ci/templates/npm.gitlab-ci.yml
index fb0d300338b..ae2edd6f3fa 100644
--- a/lib/gitlab/ci/templates/npm.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/npm.gitlab-ci.yml
@@ -37,9 +37,15 @@ publish:
# Compare the version in package.json to all published versions.
# If the package.json version has not yet been published, run `npm publish`.
+ # If $SIGSTORE_ID_TOKEN is set this template will generate a provenance
+ # document. For more information refer to the documentation: https://docs.gitlab.com/ee/ci/yaml/signing_examples/
- |
if [[ "$(npm view ${NPM_PACKAGE_NAME} versions)" != *"'${NPM_PACKAGE_VERSION}'"* ]]; then
- npm publish
+ if [[ -n "${SIGSTORE_ID_TOKEN}" ]]; then
+ npm publish --provenance
+ else
+ npm publish
+ fi
echo "Successfully published version ${NPM_PACKAGE_VERSION} of ${NPM_PACKAGE_NAME} to GitLab's NPM registry: ${CI_PROJECT_URL}/-/packages"
else
echo "Version ${NPM_PACKAGE_VERSION} of ${NPM_PACKAGE_NAME} has already been published, so no new version has been published."
diff --git a/lib/gitlab/ci/variables/collection.rb b/lib/gitlab/ci/variables/collection.rb
index 9960a6fbdf5..f77ef262236 100644
--- a/lib/gitlab/ci/variables/collection.rb
+++ b/lib/gitlab/ci/variables/collection.rb
@@ -8,6 +8,21 @@ module Gitlab
attr_reader :errors
+ def self.fabricate(input)
+ case input
+ when Array
+ new(input)
+ when Hash
+ new(input.map { |key, value| { key: key, value: value } })
+ when Proc
+ fabricate(input.call)
+ when self
+ input
+ else
+ raise ArgumentError, "Unknown `#{input.class}` variable collection!"
+ end
+ end
+
def initialize(variables = [], errors = nil)
@variables = []
@variables_by_key = Hash.new { |h, k| h[k] = [] }
diff --git a/lib/gitlab/ci/variables/collection/item.rb b/lib/gitlab/ci/variables/collection/item.rb
index 0fcf11121fa..73452d83bce 100644
--- a/lib/gitlab/ci/variables/collection/item.rb
+++ b/lib/gitlab/ci/variables/collection/item.rb
@@ -17,6 +17,10 @@ module Gitlab
@variable = { key: key, value: value, public: public, file: file, masked: masked, raw: raw }
end
+ def key
+ @variable.fetch(:key)
+ end
+
def value
@variable.fetch(:value)
end
diff --git a/lib/gitlab/ci/variables/downstream/base.rb b/lib/gitlab/ci/variables/downstream/base.rb
new file mode 100644
index 00000000000..6845ed4cc1b
--- /dev/null
+++ b/lib/gitlab/ci/variables/downstream/base.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ module Variables
+ module Downstream
+ class Base
+ def initialize(context)
+ @context = context
+ end
+
+ private
+
+ attr_reader :context
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/variables/downstream/expandable_variable_generator.rb b/lib/gitlab/ci/variables/downstream/expandable_variable_generator.rb
new file mode 100644
index 00000000000..6690e9f1c1f
--- /dev/null
+++ b/lib/gitlab/ci/variables/downstream/expandable_variable_generator.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ module Variables
+ module Downstream
+ class ExpandableVariableGenerator < Base
+ def for(item)
+ expanded_value = ::ExpandVariables.expand(item.value, context.all_bridge_variables)
+
+ [{ key: item.key, value: expanded_value }]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/variables/downstream/generator.rb b/lib/gitlab/ci/variables/downstream/generator.rb
new file mode 100644
index 00000000000..93c995cc918
--- /dev/null
+++ b/lib/gitlab/ci/variables/downstream/generator.rb
@@ -0,0 +1,73 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ module Variables
+ module Downstream
+ class Generator
+ include Gitlab::Utils::StrongMemoize
+
+ Context = Struct.new(:all_bridge_variables, keyword_init: true)
+
+ def initialize(bridge)
+ @bridge = bridge
+
+ context = Context.new(all_bridge_variables: bridge.variables)
+
+ @raw_variable_generator = RawVariableGenerator.new(context)
+ @expandable_variable_generator = ExpandableVariableGenerator.new(context)
+ end
+
+ def calculate
+ calculate_downstream_variables
+ .reverse # variables priority
+ .uniq { |var| var[:key] } # only one variable key to pass
+ .reverse
+ end
+
+ private
+
+ attr_reader :bridge, :all_bridge_variables
+
+ def calculate_downstream_variables
+ # The order of this list refers to the priority of the variables
+ # The variables added later takes priority.
+ downstream_yaml_variables +
+ downstream_pipeline_variables +
+ downstream_pipeline_schedule_variables
+ end
+
+ def downstream_yaml_variables
+ return [] unless bridge.forward_yaml_variables?
+
+ build_downstream_variables_from(bridge.yaml_variables)
+ end
+
+ def downstream_pipeline_variables
+ return [] unless bridge.forward_pipeline_variables?
+
+ pipeline_variables = bridge.pipeline_variables.to_a
+ build_downstream_variables_from(pipeline_variables)
+ end
+
+ def downstream_pipeline_schedule_variables
+ return [] unless bridge.forward_pipeline_variables?
+
+ pipeline_schedule_variables = bridge.pipeline_schedule_variables.to_a
+ build_downstream_variables_from(pipeline_schedule_variables)
+ end
+
+ def build_downstream_variables_from(variables)
+ Gitlab::Ci::Variables::Collection.fabricate(variables).flat_map do |item|
+ if item.raw?
+ @raw_variable_generator.for(item)
+ else
+ @expandable_variable_generator.for(item)
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/variables/downstream/raw_variable_generator.rb b/lib/gitlab/ci/variables/downstream/raw_variable_generator.rb
new file mode 100644
index 00000000000..42c795b4398
--- /dev/null
+++ b/lib/gitlab/ci/variables/downstream/raw_variable_generator.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ module Variables
+ module Downstream
+ class RawVariableGenerator < Base
+ def for(item)
+ [{ key: item.key, value: item.value, raw: true }]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/cleanup/remote_uploads.rb b/lib/gitlab/cleanup/remote_uploads.rb
index 6cadb9424f7..5811b6223a3 100644
--- a/lib/gitlab/cleanup/remote_uploads.rb
+++ b/lib/gitlab/cleanup/remote_uploads.rb
@@ -17,6 +17,13 @@ module Gitlab
return
end
+ if bucket_prefix.present?
+ error_message = "Uploads are configured with a bucket prefix '#{bucket_prefix}'.\n"
+ error_message += "Unfortunately, prefixes are not supported for this Rake task.\n"
+ # At the moment, Fog does not provide a cloud-agnostic way of iterating through a bucket with a prefix.
+ raise error_message
+ end
+
logger.info "Looking for orphaned remote uploads to remove#{'. Dry run' if dry_run}..."
each_orphan_file do |file|
@@ -77,6 +84,10 @@ module Gitlab
def configuration
Gitlab.config.uploads.object_store
end
+
+ def bucket_prefix
+ configuration.bucket_prefix
+ end
end
end
end
diff --git a/lib/gitlab/cluster/lifecycle_events.rb b/lib/gitlab/cluster/lifecycle_events.rb
index b39d2a02f02..c6ce0aa6160 100644
--- a/lib/gitlab/cluster/lifecycle_events.rb
+++ b/lib/gitlab/cluster/lifecycle_events.rb
@@ -1,6 +1,6 @@
# frozen_string_literal: true
-require_relative '../utils' # Gitlab::Utils
+require 'gitlab/utils/all' # Gitlab::Utils
module Gitlab
module Cluster
diff --git a/lib/gitlab/config/README.md b/lib/gitlab/config/README.md
new file mode 100644
index 00000000000..355dbdc8cfe
--- /dev/null
+++ b/lib/gitlab/config/README.md
@@ -0,0 +1,29 @@
+# `::Gitlab::Config` module overview
+
+`::Gitlab::Config` is an abstract module used to build, traverse and translate
+any kind of hierarchical, user-provided configuration.
+
+The most complex and widely used implementation is `::Gitlab::Ci::Config`
+facade class. Please see `lib/gitlab/ci/config/README.md` for more information
+around how it works.
+
+## High-level Overview
+
+The main motivation behind how `::Gitlab::Config` and `::Gitlab::Ci::Config`
+work is to build an indirection layer between complex user-provided
+configuration and GitLab itself. This helps us to extend configuration keywords
+in a backwards-compatible way, and make sure that validation and transformation
+rules are encapsulated within domain classes, what significantly helps to
+reduce cognitive load on Engineers working on that part of the codebase.
+
+`Gitlab::Config` is a tool to work with hierarchical configuration:
+
+1. First we parse YAML with Ruby standard library `Psych`.
+1. The resulting hash is being used to initialize a concrete implementation of `Gitlab::Config`.
+1. In `::Gitlab::Ci::Config` abstract classes from `::Gitlab::Config` have their implementations.
+1. Each domain class represents one or a group of hierarchical YAML entries, like `job:artifacts`.
+1. Each entry knows what subentires are supported and how to validate them.
+1. Upon loading a configuration we build an abstract syntax tree, and validate configuration.
+1. If there are errors, the module can surface them to a user.
+1. In case of config being valid, the config gets translated and augmented.
+1. The result is a consistent representation that we can depend on in other parts of the codebase.
diff --git a/lib/gitlab/data_builder/build.rb b/lib/gitlab/data_builder/build.rb
index 8fec5cf3303..e1e9e4720bb 100644
--- a/lib/gitlab/data_builder/build.rb
+++ b/lib/gitlab/data_builder/build.rb
@@ -12,13 +12,14 @@ module Gitlab
author_url = build_author_url(build.commit, commit)
- data = {
+ {
object_kind: 'build',
ref: build.ref,
tag: build.tag,
before_sha: build.before_sha,
sha: build.sha,
+ retries_count: build.retries_count,
# TODO: should this be not prefixed with build_?
# Leaving this way to have backward compatibility
@@ -69,10 +70,6 @@ module Gitlab
environment: build_environment(build)
}
-
- data[:retries_count] = build.retries_count if Feature.enabled?(:job_webhook_retries_count, project)
-
- data
end
private
diff --git a/lib/gitlab/data_builder/emoji.rb b/lib/gitlab/data_builder/emoji.rb
new file mode 100644
index 00000000000..63562eca155
--- /dev/null
+++ b/lib/gitlab/data_builder/emoji.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module DataBuilder
+ module Emoji
+ extend self
+
+ def build(award_emoji, user, action)
+ project = award_emoji.awardable.project
+ data = build_base_data(project, user, award_emoji, action)
+
+ if award_emoji.awardable.is_a?(::Note)
+ note = award_emoji.awardable
+ data[:note] = note.hook_attrs
+ noteable = note.noteable
+ else
+ noteable = award_emoji.awardable
+ end
+
+ if noteable.respond_to?(:hook_attrs)
+ data[noteable.class.underscore.to_sym] = noteable.hook_attrs
+ else
+ Gitlab::AppLogger.error(
+ "Error building payload data for emoji webhook. #{noteable.class} does not respond to hook_attrs.")
+ end
+
+ data
+ end
+
+ def build_base_data(project, user, award_emoji, action)
+ base_data = {
+ object_kind: 'emoji',
+ event_type: action,
+ user: user.hook_attrs,
+ project_id: project.id,
+ project: project.hook_attrs,
+ object_attributes: award_emoji.hook_attrs
+ }
+
+ base_data[:object_attributes][:awarded_on_url] = Gitlab::UrlBuilder.build(award_emoji.awardable)
+ base_data
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/data_builder/push.rb b/lib/gitlab/data_builder/push.rb
index f941c57a6dd..46110937132 100644
--- a/lib/gitlab/data_builder/push.rb
+++ b/lib/gitlab/data_builder/push.rb
@@ -12,6 +12,7 @@ module Gitlab
before: "95790bf891e76fee5e1747ab589903a6a1f80f22",
after: "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
ref: "refs/heads/master",
+ ref_protected: true,
checkout_sha: "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
message: "Hello World",
user_id: 4,
@@ -55,6 +56,7 @@ module Gitlab
# before: String,
# after: String,
# ref: String,
+ # ref_protected: Boolean,
# user_id: String,
# user_name: String,
# user_username: String,
@@ -116,6 +118,7 @@ module Gitlab
before: oldrev,
after: newrev,
ref: ref,
+ ref_protected: project.protected_for?(ref),
checkout_sha: checkout_sha(project.repository, newrev, ref),
message: message,
user_id: user.id,
diff --git a/lib/gitlab/database.rb b/lib/gitlab/database.rb
index da9ebf4ab0f..fd83f27ef31 100644
--- a/lib/gitlab/database.rb
+++ b/lib/gitlab/database.rb
@@ -145,7 +145,7 @@ module Gitlab
# Database configured. Returns true even if the database is shared
def self.has_config?(database_name)
ActiveRecord::Base.configurations
- .configs_for(env_name: Rails.env, name: database_name.to_s, include_replicas: true)
+ .configs_for(env_name: Rails.env, name: database_name.to_s, include_hidden: true)
.present?
end
diff --git a/lib/gitlab/database/async_indexes/migration_helpers.rb b/lib/gitlab/database/async_indexes/migration_helpers.rb
index d7128a20a0b..db05635c73d 100644
--- a/lib/gitlab/database/async_indexes/migration_helpers.rb
+++ b/lib/gitlab/database/async_indexes/migration_helpers.rb
@@ -95,7 +95,7 @@ module Gitlab
async_index = Gitlab::Database::AsyncIndexes::PostgresAsyncIndex.find_or_create_by!(name: index_name) do |rec|
rec.table_name = table_name
- rec.definition = definition
+ rec.definition = definition.to_s.strip
end
Gitlab::AppLogger.info(
diff --git a/lib/gitlab/database/async_indexes/postgres_async_index.rb b/lib/gitlab/database/async_indexes/postgres_async_index.rb
index a3c600a4519..98eb282e43f 100644
--- a/lib/gitlab/database/async_indexes/postgres_async_index.rb
+++ b/lib/gitlab/database/async_indexes/postgres_async_index.rb
@@ -13,6 +13,8 @@ module Gitlab
MAX_IDENTIFIER_LENGTH = Gitlab::Database::MigrationHelpers::MAX_IDENTIFIER_NAME_LENGTH
MAX_DEFINITION_LENGTH = 2048
+ before_validation :remove_whitespaces
+
validates :name, presence: true, length: { maximum: MAX_IDENTIFIER_LENGTH }
validates :table_name, presence: true, length: { maximum: MAX_TABLE_NAME_LENGTH }
validates :definition, presence: true, length: { maximum: MAX_DEFINITION_LENGTH }
@@ -29,6 +31,10 @@ module Gitlab
private
+ def remove_whitespaces
+ definition.strip! if definition.present?
+ end
+
def ensure_correct_schema_and_table_name
return unless table_name
diff --git a/lib/gitlab/database/ci_builds_partitioning.rb b/lib/gitlab/database/ci_builds_partitioning.rb
new file mode 100644
index 00000000000..9f8b19f2d23
--- /dev/null
+++ b/lib/gitlab/database/ci_builds_partitioning.rb
@@ -0,0 +1,224 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ class CiBuildsPartitioning
+ include AsyncDdlExclusiveLeaseGuard
+
+ ATTEMPTS = 5
+ LOCK_TIMEOUT = 10.seconds
+ LEASE_TIMEOUT = 30.minutes
+
+ FK_NAME = :fk_e20479742e_p
+ TEMP_FK_NAME = :temp_fk_e20479742e_p
+ NEXT_PARTITION_ID = 101
+ BUILDS_PARTITION_NAME = 'gitlab_partitions_dynamic.ci_builds_101'
+ ANNOTATION_PARTITION_NAME = 'gitlab_partitions_dynamic.ci_job_annotations_101'
+ RUNNER_MACHINE_PARTITION_NAME = 'gitlab_partitions_dynamic.ci_runner_machine_builds_101'
+
+ def initialize(logger: Gitlab::AppLogger)
+ @connection = ::Ci::ApplicationRecord.connection
+ @timing_configuration = Array.new(ATTEMPTS) { [LOCK_TIMEOUT, 3.minutes] }
+ @logger = logger
+ end
+
+ def execute
+ return unless can_execute?
+
+ try_obtain_lease do
+ swap_foreign_keys
+ create_new_ci_builds_partition
+ create_new_job_annotations_partition
+ create_new_runner_machine_partition
+ end
+
+ rescue StandardError => e
+ log_info("Failed to execute: #{e.message}")
+ end
+
+ private
+
+ attr_reader :connection, :timing_configuration, :logger
+
+ delegate :quote_table_name, :quote_column_name, to: :connection
+
+ def swap_foreign_keys
+ if new_foreign_key_exists?
+ log_info('Foreign key already renamed, nothing to do')
+
+ return
+ end
+
+ with_lock_retries do
+ connection.execute drop_old_foreign_key_sql
+
+ rename_constraint :p_ci_builds_metadata, TEMP_FK_NAME, FK_NAME
+
+ each_partition do |partition|
+ rename_constraint partition.identifier, TEMP_FK_NAME, FK_NAME
+ end
+ end
+
+ log_info('Foreign key successfully renamed')
+ end
+
+ def create_new_ci_builds_partition
+ if connection.table_exists?(BUILDS_PARTITION_NAME)
+ log_info('p_ci_builds partition exists, nothing to do')
+ return
+ end
+
+ with_lock_retries do
+ connection.execute new_ci_builds_partition_sql
+ end
+
+ log_info('Partition for p_ci_builds successfully created')
+ end
+
+ def create_new_job_annotations_partition
+ if connection.table_exists?(ANNOTATION_PARTITION_NAME)
+ log_info('p_ci_job_annotations partition exists, nothing to do')
+ return
+ end
+
+ with_lock_retries do
+ connection.execute new_job_annotations_partition_sql
+ end
+
+ log_info('Partition for p_ci_job_annotations successfully created')
+ end
+
+ def create_new_runner_machine_partition
+ if connection.table_exists?(RUNNER_MACHINE_PARTITION_NAME)
+ log_info('p_ci_runner_machine_builds partition exists, nothing to do')
+ return
+ end
+
+ with_lock_retries do
+ connection.execute new_runner_machine_partition_sql
+ end
+
+ log_info('Partition for p_ci_runner_machine_builds successfully created')
+ end
+
+ def can_execute?
+ return false if process_disabled?
+ return false unless Gitlab.com?
+
+ if vacuum_running?
+ log_info('Autovacuum detected')
+
+ return false
+ end
+
+ true
+ end
+
+ def process_disabled?
+ ::Feature.disabled?(:complete_p_ci_builds_partitioning)
+ end
+
+ def new_foreign_key_exists?
+ Gitlab::Database::SharedModel.using_connection(connection) do
+ Gitlab::Database::PostgresForeignKey
+ .by_constrained_table_name_or_identifier(:p_ci_builds_metadata)
+ .by_referenced_table_name(:p_ci_builds)
+ .by_name(FK_NAME)
+ .exists?
+ end
+ end
+
+ def vacuum_running?
+ Gitlab::Database::SharedModel.using_connection(connection) do
+ Gitlab::Database::PostgresAutovacuumActivity
+ .wraparound_prevention
+ .for_tables(%i[ci_builds ci_builds_metadata])
+ .any?
+ end
+ end
+
+ def drop_old_foreign_key_sql
+ <<~SQL.squish
+ SET LOCAL statement_timeout TO '11s';
+
+ LOCK TABLE ci_builds, p_ci_builds_metadata IN ACCESS EXCLUSIVE MODE;
+
+ ALTER TABLE p_ci_builds_metadata DROP CONSTRAINT #{FK_NAME};
+ SQL
+ end
+
+ def rename_constraint(table_name, old_name, new_name)
+ connection.execute <<~SQL
+ ALTER TABLE #{quote_table_name(table_name)}
+ RENAME CONSTRAINT #{quote_column_name(old_name)} TO #{quote_column_name(new_name)}
+ SQL
+ end
+
+ def new_ci_builds_partition_sql
+ <<~SQL
+ SET LOCAL statement_timeout TO '11s';
+
+ LOCK ci_pipelines, ci_stages IN SHARE ROW EXCLUSIVE MODE;
+ LOCK TABLE ONLY p_ci_builds IN ACCESS EXCLUSIVE MODE;
+
+ CREATE TABLE IF NOT EXISTS #{BUILDS_PARTITION_NAME}
+ PARTITION OF p_ci_builds
+ FOR VALUES IN (#{NEXT_PARTITION_ID});
+ SQL
+ end
+
+ def new_job_annotations_partition_sql
+ <<~SQL
+ SET LOCAL statement_timeout TO '11s';
+
+ LOCK TABLE p_ci_builds IN SHARE ROW EXCLUSIVE MODE;
+ LOCK TABLE ONLY p_ci_job_annotations IN ACCESS EXCLUSIVE MODE;
+
+ CREATE TABLE IF NOT EXISTS #{ANNOTATION_PARTITION_NAME}
+ PARTITION OF p_ci_job_annotations
+ FOR VALUES IN (#{NEXT_PARTITION_ID});
+ SQL
+ end
+
+ def new_runner_machine_partition_sql
+ <<~SQL
+ SET LOCAL statement_timeout TO '11s';
+
+ LOCK TABLE p_ci_builds IN SHARE ROW EXCLUSIVE MODE;
+ LOCK TABLE ONLY p_ci_runner_machine_builds IN ACCESS EXCLUSIVE MODE;
+
+ CREATE TABLE IF NOT EXISTS #{RUNNER_MACHINE_PARTITION_NAME}
+ PARTITION OF p_ci_runner_machine_builds
+ FOR VALUES IN (#{NEXT_PARTITION_ID});
+ SQL
+ end
+
+ def with_lock_retries(&block)
+ Gitlab::Database::WithLockRetries.new(
+ timing_configuration: timing_configuration,
+ connection: connection,
+ logger: logger,
+ klass: self.class
+ ).run(raise_on_exhaustion: true, &block)
+ end
+
+ def each_partition(&block)
+ Gitlab::Database::SharedModel.using_connection(connection) do
+ Gitlab::Database::PostgresPartitionedTable.each_partition(:p_ci_builds_metadata, &block)
+ end
+ end
+
+ def log_info(message)
+ logger.info(message: message, class: self.class.to_s)
+ end
+
+ def connection_db_config
+ ::Ci::ApplicationRecord.connection_db_config
+ end
+
+ def lease_timeout
+ LEASE_TIMEOUT
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database/database_connection_info.rb b/lib/gitlab/database/database_connection_info.rb
index 57ecbcd64ae..f0cafcf041b 100644
--- a/lib/gitlab/database/database_connection_info.rb
+++ b/lib/gitlab/database/database_connection_info.rb
@@ -6,6 +6,7 @@ module Gitlab
:name,
:description,
:gitlab_schemas,
+ :lock_gitlab_schemas,
:klass,
:fallback_database,
:db_dir,
@@ -20,6 +21,7 @@ module Gitlab
self.name = name.to_sym
self.gitlab_schemas = gitlab_schemas.map(&:to_sym)
self.klass = klass.constantize
+ self.lock_gitlab_schemas = (lock_gitlab_schemas || []).map(&:to_sym)
self.fallback_database = fallback_database&.to_sym
self.db_dir = Rails.root.join(db_dir || 'db')
end
diff --git a/lib/gitlab/database/each_database.rb b/lib/gitlab/database/each_database.rb
index b1af62e4875..e1974aac371 100644
--- a/lib/gitlab/database/each_database.rb
+++ b/lib/gitlab/database/each_database.rb
@@ -4,7 +4,7 @@ module Gitlab
module Database
module EachDatabase
class << self
- def each_database_connection(only: nil, include_shared: true)
+ def each_connection(only: nil, include_shared: true)
selected_names = Array.wrap(only)
base_models = select_base_models(selected_names)
@@ -18,7 +18,6 @@ module Gitlab
end
end
end
- alias_method :each_db_connection, :each_database_connection
def each_model_connection(models, only_on: nil, &blk)
selected_databases = Array.wrap(only_on).map(&:to_sym)
diff --git a/lib/gitlab/database/gitlab_schema.rb b/lib/gitlab/database/gitlab_schema.rb
index 9b58284b389..0bd357b7730 100644
--- a/lib/gitlab/database/gitlab_schema.rb
+++ b/lib/gitlab/database/gitlab_schema.rb
@@ -23,6 +23,21 @@ module Gitlab
tables.map { |table| table_schema!(table) }.to_set
end
+ # Mainly used for test tables
+ # It maps table names prefixes to gitlab_schemas.
+ # The order of keys matter. Prefixes that contain other prefixes should come first.
+ IMPLICIT_GITLAB_SCHEMAS = {
+ '_test_gitlab_main_clusterwide_' => :gitlab_main_clusterwide,
+ '_test_gitlab_main_cell_' => :gitlab_main_cell,
+ '_test_gitlab_main_' => :gitlab_main,
+ '_test_gitlab_ci_' => :gitlab_ci,
+ '_test_gitlab_embedding_' => :gitlab_embedding,
+ '_test_gitlab_geo_' => :gitlab_geo,
+ '_test_gitlab_pm_' => :gitlab_pm,
+ '_test_' => :gitlab_shared,
+ 'pg_' => :gitlab_internal
+ }.freeze
+
# rubocop:disable Metrics/CyclomaticComplexity
def self.table_schema(name)
schema_name, table_name = name.split('.', 2) # Strip schema name like: `public.`
@@ -54,19 +69,11 @@ module Gitlab
# All tables from `information_schema.` are marked as `internal`
return :gitlab_internal if schema_name == 'information_schema'
- return :gitlab_main if table_name.start_with?('_test_gitlab_main_')
-
- return :gitlab_ci if table_name.start_with?('_test_gitlab_ci_')
-
- return :gitlab_embedding if table_name.start_with?('_test_gitlab_embedding_')
-
- return :gitlab_geo if table_name.start_with?('_test_gitlab_geo_')
-
- # All tables that start with `_test_` without a following schema are shared and ignored
- return :gitlab_shared if table_name.start_with?('_test_')
+ IMPLICIT_GITLAB_SCHEMAS.each do |prefix, gitlab_schema|
+ return gitlab_schema if table_name.start_with?(prefix)
+ end
- # All `pg_` tables are marked as `internal`
- return :gitlab_internal if table_name.start_with?('pg_')
+ nil
end
# rubocop:enable Metrics/CyclomaticComplexity
diff --git a/lib/gitlab/database/load_balancing/connection_proxy.rb b/lib/gitlab/database/load_balancing/connection_proxy.rb
index 02f14e020c1..2c480eb2cdc 100644
--- a/lib/gitlab/database/load_balancing/connection_proxy.rb
+++ b/lib/gitlab/database/load_balancing/connection_proxy.rb
@@ -39,7 +39,7 @@ module Gitlab
@load_balancer = load_balancer
end
- def select_all(arel, name = nil, binds = [], preparable: nil)
+ def select_all(arel, name = nil, binds = [], preparable: nil, async: false)
if arel.respond_to?(:locked) && arel.locked
# SELECT ... FOR UPDATE queries should be sent to the primary.
current_session.write!
diff --git a/lib/gitlab/database/load_balancing/load_balancer.rb b/lib/gitlab/database/load_balancing/load_balancer.rb
index 23476e1f5e9..f6144b7b772 100644
--- a/lib/gitlab/database/load_balancing/load_balancer.rb
+++ b/lib/gitlab/database/load_balancing/load_balancer.rb
@@ -12,6 +12,8 @@ module Gitlab
REPLICA_SUFFIX = '_replica'
+ attr_accessor :service_discovery
+
attr_reader :host_list, :configuration
# configuration - An instance of `LoadBalancing::Configuration` that
@@ -45,6 +47,8 @@ module Gitlab
# If no secondaries were available this method will use the primary
# instead.
def read(&block)
+ service_discovery&.log_refresh_thread_interruption
+
conflict_retried = 0
while host
@@ -103,6 +107,8 @@ module Gitlab
# Yields a connection that can be used for both reads and writes.
def read_write
+ service_discovery&.log_refresh_thread_interruption
+
connection = nil
transaction_open = nil
@@ -285,7 +291,7 @@ module Gitlab
def pool
ActiveRecord::Base.connection_handler.retrieve_connection_pool(
@configuration.connection_specification_name,
- role: ActiveRecord::Base.writing_role,
+ role: ActiveRecord.writing_role,
shard: ActiveRecord::Base.default_shard
) || raise(::ActiveRecord::ConnectionNotEstablished)
end
diff --git a/lib/gitlab/database/load_balancing/service_discovery.rb b/lib/gitlab/database/load_balancing/service_discovery.rb
index 57a588db8a8..a0b0ad19f73 100644
--- a/lib/gitlab/database/load_balancing/service_discovery.rb
+++ b/lib/gitlab/database/load_balancing/service_discovery.rb
@@ -15,12 +15,14 @@ module Gitlab
class ServiceDiscovery
EmptyDnsResponse = Class.new(StandardError)
+ attr_accessor :refresh_thread, :refresh_thread_last_run, :refresh_thread_interruption_logged
+
attr_reader :interval, :record, :record_type, :disconnect_timeout,
:load_balancer
MAX_SLEEP_ADJUSTMENT = 10
-
MAX_DISCOVERY_RETRIES = 3
+ DISCOVERY_THREAD_REFRESH_DELTA = 5
RETRY_DELAY_RANGE = (0.1..0.2).freeze
@@ -74,8 +76,10 @@ module Gitlab
# rubocop:enable Metrics/ParameterLists
def start
- Thread.new do
+ self.refresh_thread = Thread.new do
loop do
+ self.refresh_thread_last_run = Time.current
+
next_sleep_duration = perform_service_discovery
# We slightly randomize the sleep() interval. This should reduce
@@ -103,15 +107,6 @@ module Gitlab
# Slightly randomize the retry delay so that, in the case of a total
# dns outage, all starting services do not pressure the dns server at the same time.
sleep(rand(RETRY_DELAY_RANGE))
- rescue Exception => error # rubocop:disable Lint/RescueException
- # All exceptions are logged to find any pattern and solve https://gitlab.com/gitlab-org/gitlab/-/issues/364370
- # This will be removed in https://gitlab.com/gitlab-org/gitlab/-/merge_requests/120173
- Gitlab::Database::LoadBalancing::Logger.error(
- event: :service_discovery_unexpected_exception,
- message: "Service discovery encountered an uncaught error: #{error.message}"
- )
-
- raise
end
interval
@@ -214,6 +209,20 @@ module Gitlab
)
end
+ def log_refresh_thread_interruption
+ return if refresh_thread_last_run.blank? || refresh_thread_interruption_logged ||
+ (refresh_thread_last_run + DISCOVERY_THREAD_REFRESH_DELTA.minutes).future?
+
+ Gitlab::Database::LoadBalancing::Logger.error(
+ event: :service_discovery_refresh_thread_interrupt,
+ refresh_thread_last_run: refresh_thread_last_run,
+ thread_status: refresh_thread&.status&.to_s,
+ thread_backtrace: refresh_thread&.backtrace&.join('\n')
+ )
+
+ self.refresh_thread_interruption_logged = true
+ end
+
private
def record_type_for(type)
diff --git a/lib/gitlab/database/load_balancing/setup.rb b/lib/gitlab/database/load_balancing/setup.rb
index eceea1d8d9c..2e65e1c8e56 100644
--- a/lib/gitlab/database/load_balancing/setup.rb
+++ b/lib/gitlab/database/load_balancing/setup.rb
@@ -55,6 +55,8 @@ module Gitlab
sv = ServiceDiscovery.new(load_balancer, **configuration.service_discovery)
+ load_balancer.service_discovery = sv
+
sv.perform_service_discovery
sv.start if @start_service_discovery
diff --git a/lib/gitlab/database/migration_helpers.rb b/lib/gitlab/database/migration_helpers.rb
index 291f483e6e4..256c524e989 100644
--- a/lib/gitlab/database/migration_helpers.rb
+++ b/lib/gitlab/database/migration_helpers.rb
@@ -11,6 +11,7 @@ module Gitlab
include Migrations::ConstraintsHelpers
include Migrations::ExtensionHelpers
include Migrations::SidekiqHelpers
+ include Migrations::RedisHelpers
include DynamicModelHelpers
include RenameTableHelpers
include AsyncIndexes::MigrationHelpers
diff --git a/lib/gitlab/database/migration_helpers/automatic_lock_writes_on_tables.rb b/lib/gitlab/database/migration_helpers/automatic_lock_writes_on_tables.rb
index 55c4fd6a7af..fe456fab505 100644
--- a/lib/gitlab/database/migration_helpers/automatic_lock_writes_on_tables.rb
+++ b/lib/gitlab/database/migration_helpers/automatic_lock_writes_on_tables.rb
@@ -11,7 +11,9 @@ module Gitlab
end
def exec_migration(connection, direction)
- return super if %w[main ci].exclude?(Gitlab::Database.db_config_name(connection))
+ db_config_name = Gitlab::Database.db_config_name(connection)
+ db_info = Gitlab::Database.all_database_connections.fetch(db_config_name)
+ return super if db_info.lock_gitlab_schemas.empty?
return super if automatic_lock_on_writes_disabled?
# This compares the tables only on the `public` schema. Partitions are not affected
@@ -20,7 +22,7 @@ module Gitlab
new_tables = connection.tables - tables
new_tables.each do |table_name|
- lock_writes_on_table(connection, table_name) if should_lock_writes_on_table?(table_name)
+ lock_writes_on_table(connection, table_name) if should_lock_writes_on_table?(db_info, table_name)
end
end
@@ -39,16 +41,17 @@ module Gitlab
end
end
- def should_lock_writes_on_table?(table_name)
- # currently gitlab_schema represents only present existing tables, this is workaround for deleted tables
- # that should be skipped as they will be removed in a future migration.
+ def should_lock_writes_on_table?(db_info, table_name)
+ # We skip locking writes on tables that are scheduled for deletion in a future migration
return false if Gitlab::Database::GitlabSchema.deleted_tables_to_schema[table_name]
table_schema = Gitlab::Database::GitlabSchema.table_schema!(table_name.to_s)
- return false unless %i[gitlab_main gitlab_ci].include?(table_schema)
-
- Gitlab::Database.gitlab_schemas_for_connection(connection).exclude?(table_schema)
+ # This takes into consideration which database mode is used.
+ # In single-db and single-db-ci-connection the main database includes gitlab_ci tables,
+ # so we don't lock them there.
+ Gitlab::Database.gitlab_schemas_for_connection(connection).exclude?(table_schema) &&
+ db_info.lock_gitlab_schemas.include?(table_schema)
end
# with_retries creates new a transaction. So we set it to false if the connection is
diff --git a/lib/gitlab/database/migrations/redis_helpers.rb b/lib/gitlab/database/migrations/redis_helpers.rb
new file mode 100644
index 00000000000..41a2841da7c
--- /dev/null
+++ b/lib/gitlab/database/migrations/redis_helpers.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ module Migrations
+ module RedisHelpers
+ SCAN_START_CURSOR = '0'
+
+ # Check if the migration exists before enqueueing the worker
+ def queue_redis_migration_job(job_name)
+ RedisMigrationWorker.fetch_migrator!(job_name)
+ RedisMigrationWorker.perform_async(job_name, SCAN_START_CURSOR)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database/migrations/runner.rb b/lib/gitlab/database/migrations/runner.rb
index ed55081c9ab..dc9ea304aac 100644
--- a/lib/gitlab/database/migrations/runner.rb
+++ b/lib/gitlab/database/migrations/runner.rb
@@ -32,7 +32,7 @@ module Gitlab
result_dir = background_migrations_dir(for_database, legacy_mode)
# Only one loop iteration since we pass `only:` here
- Gitlab::Database::EachDatabase.each_database_connection(only: for_database) do |connection|
+ Gitlab::Database::EachDatabase.each_connection(only: for_database) do |connection|
from_id = batched_migrations_last_id(for_database).read
runner = Gitlab::Database::Migrations::TestBatchedBackgroundRunner
@@ -68,7 +68,7 @@ module Gitlab
runner = nil
base_dir = background_migrations_dir(for_database, false)
- Gitlab::Database::EachDatabase.each_database_connection(only: for_database) do |connection|
+ Gitlab::Database::EachDatabase.each_connection(only: for_database) do |connection|
runner = Gitlab::Database::Migrations::BatchedMigrationLastId
.new(connection, base_dir)
end
diff --git a/lib/gitlab/database/migrations/test_batched_background_runner.rb b/lib/gitlab/database/migrations/test_batched_background_runner.rb
index af853c933ba..c5e0b361df5 100644
--- a/lib/gitlab/database/migrations/test_batched_background_runner.rb
+++ b/lib/gitlab/database/migrations/test_batched_background_runner.rb
@@ -57,6 +57,20 @@ module Gitlab
job_arguments: migration.job_arguments
)
+ # If no rows match, the next_bounds are nil.
+ # This will only happen if there are zero rows to match from the current sampling point to the end
+ # of the table
+ # Simulate the approach in the actual background migration worker by not sampling a batch
+ # from this range.
+ # (The actual worker would finish the migration, but we may find batches that can be sampled elsewhere
+ # in the table)
+ if next_bounds.nil?
+ # If the migration has no work to do across the entire table, sampling can get stuck
+ # in a loop if we don't mark the attempted batches as completed
+ completed_batches << (batch_start..(batch_start + migration.batch_size))
+ next
+ end
+
batch_min, batch_max = next_bounds
job = migration.create_batched_job!(batch_min, batch_max)
@@ -65,7 +79,7 @@ module Gitlab
job
end
- end
+ end.reject(&:nil?) # Remove skipped batches from the lazy list of batches to test
job_class_name = migration.job_class_name
diff --git a/lib/gitlab/database/partitioning.rb b/lib/gitlab/database/partitioning.rb
index 9895a68ec8d..48f58920d52 100644
--- a/lib/gitlab/database/partitioning.rb
+++ b/lib/gitlab/database/partitioning.rb
@@ -40,7 +40,7 @@ module Gitlab
next if model < ::Gitlab::Database::SharedModel && !(model < TableWithoutModel)
model_connection_name = model.connection_db_config.name
- Gitlab::Database::EachDatabase.each_db_connection(include_shared: false) do |connection, connection_name|
+ Gitlab::Database::EachDatabase.each_connection(include_shared: false) do |connection, connection_name|
if connection_name != model_connection_name
PartitionManager.new(model, connection: connection).sync_partitions
end
@@ -64,7 +64,7 @@ module Gitlab
Gitlab::AppLogger.info(message: 'Dropping detached postgres partitions')
- Gitlab::Database::EachDatabase.each_database_connection do
+ Gitlab::Database::EachDatabase.each_connection do
DetachedPartitionDropper.new.perform
end
diff --git a/lib/gitlab/database/postgresql_adapter/empty_query_ping.rb b/lib/gitlab/database/postgresql_adapter/empty_query_ping.rb
deleted file mode 100644
index 88affaa9757..00000000000
--- a/lib/gitlab/database/postgresql_adapter/empty_query_ping.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-# This patch will be included in the next Rails release: https://github.com/rails/rails/pull/42368
-raise 'This patch can be removed' if Rails::VERSION::MAJOR > 6
-
-# rubocop:disable Gitlab/ModuleWithInstanceVariables
-module Gitlab
- module Database
- module PostgresqlAdapter
- module EmptyQueryPing
- # ActiveRecord uses `SELECT 1` to check if the connection is alive
- # We patch this here to use an empty query instead, which is a bit faster
- def active?
- @lock.synchronize do
- @connection.query ';'
- end
- true
- rescue PG::Error
- false
- end
- end
- end
- end
-end
-# rubocop:enable Gitlab/ModuleWithInstanceVariables
diff --git a/lib/gitlab/database/reindexing.rb b/lib/gitlab/database/reindexing.rb
index 739e573b6c4..9c860ebc6aa 100644
--- a/lib/gitlab/database/reindexing.rb
+++ b/lib/gitlab/database/reindexing.rb
@@ -20,7 +20,7 @@ module Gitlab
end
def self.invoke(database = nil)
- Gitlab::Database::EachDatabase.each_database_connection do |connection, connection_name|
+ Gitlab::Database::EachDatabase.each_connection do |connection, connection_name|
next if database && database.to_s != connection_name.to_s
Gitlab::Database::SharedModel.logger = Logger.new($stdout) if Gitlab::Utils.to_boolean(ENV['LOG_QUERIES_TO_CONSOLE'], default: false)
@@ -59,6 +59,7 @@ module Gitlab
# most bloated indexes for reindexing.
def self.perform_with_heuristic(candidate_indexes = Gitlab::Database::PostgresIndex.reindexing_support, maximum_records: DEFAULT_INDEXES_PER_INVOCATION)
IndexSelection.new(candidate_indexes).take(maximum_records).each do |index|
+ Gitlab::Database::CiBuildsPartitioning.new.execute
Coordinator.new(index).perform
end
end
diff --git a/lib/gitlab/database/schema_validation/adapters/column_database_adapter.rb b/lib/gitlab/database/schema_validation/adapters/column_database_adapter.rb
deleted file mode 100644
index 32d638380ea..00000000000
--- a/lib/gitlab/database/schema_validation/adapters/column_database_adapter.rb
+++ /dev/null
@@ -1,47 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module SchemaValidation
- module Adapters
- class ColumnDatabaseAdapter
- def initialize(query_result)
- @query_result = query_result
- end
-
- def name
- @name ||= query_result['column_name']
- end
-
- def table_name
- query_result['table_name']
- end
-
- def data_type
- query_result['data_type']
- end
-
- def default
- return unless query_result['column_default']
-
- return if name == 'id' || query_result['column_default'].include?('nextval')
-
- "DEFAULT #{query_result['column_default']}"
- end
-
- def nullable
- 'NOT NULL' if query_result['not_null']
- end
-
- def partition_key?
- query_result['partition_key']
- end
-
- private
-
- attr_reader :query_result
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/schema_validation/adapters/column_structure_sql_adapter.rb b/lib/gitlab/database/schema_validation/adapters/column_structure_sql_adapter.rb
deleted file mode 100644
index 20814b098c1..00000000000
--- a/lib/gitlab/database/schema_validation/adapters/column_structure_sql_adapter.rb
+++ /dev/null
@@ -1,139 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module SchemaValidation
- module Adapters
- UndefinedPGType = Class.new(StandardError)
-
- class ColumnStructureSqlAdapter
- NOT_NULL_CONSTR = :CONSTR_NOTNULL
- DEFAULT_CONSTR = :CONSTR_DEFAULT
-
- MAPPINGS = {
- 't' => 'true',
- 'f' => 'false'
- }.freeze
-
- attr_reader :table_name
-
- def initialize(table_name, pg_query_stmt, partitioning_stmt)
- @table_name = table_name
- @pg_query_stmt = pg_query_stmt
- @partitioning_stmt = partitioning_stmt
- end
-
- def name
- @name ||= pg_query_stmt.colname
- end
-
- def data_type
- type(pg_query_stmt.type_name)
- end
-
- def default
- return if name == 'id'
-
- value = parse_node(constraints.find { |node| node.constraint.contype == DEFAULT_CONSTR })
-
- return unless value
-
- "DEFAULT #{value}"
- end
-
- def nullable
- 'NOT NULL' if constraints.any? { |node| node.constraint.contype == NOT_NULL_CONSTR }
- end
-
- def partition_key?
- partition_keys.include?(name)
- end
-
- private
-
- attr_reader :pg_query_stmt, :partitioning_stmt
-
- def constraints
- @constraints ||= pg_query_stmt.constraints
- end
-
- # Returns the node type
- #
- # pg_type:: type alias, used internally by postgres, +int4+, +int8+, +bool+, +varchar+
- # type:: type name, like +integer+, +bigint+, +boolean+, +character varying+.
- # array_ext:: adds the +[]+ extension for array types.
- # precision_ext:: adds the precision, if have any, like +(255)+, +(6)+.
- #
- # @info +timestamp+ and +timestamptz+ have a particular case when precision is defined.
- # In this case, the order of the statement needs to be re-arranged from
- # timestamp without time zone(6) to timestamp(6) without a time zone.
- def type(node)
- pg_type = parse_node(node.names.last)
- type = PgTypes::TYPES.fetch(pg_type).dup
- array_ext = '[]' if node.array_bounds.any?
- precision_ext = "(#{node.typmods.map { |typmod| parse_node(typmod) }.join(',')})" if node.typmods.any?
-
- if %w[timestamp timestamptz].include?(pg_type)
- type.gsub!('timestamp', ['timestamp', precision_ext].compact.join(''))
- precision_ext = nil
- end
-
- [type, precision_ext, array_ext].compact.join('')
- rescue KeyError => exception
- raise UndefinedPGType, exception.message
- end
-
- # Parses PGQuery nodes recursively
- #
- # :constraint:: nodes that groups column default info
- # :partition_elem:: node that store partition key info
- # :func_cal:: nodes that stores functions, like +now()+
- # :a_const:: nodes that stores constant values, like +t+, +f+, +0.0.0.0+, +255+, +1.0+
- # :type_cast:: nodes that stores casting values, like +'name'::text+, +'0.0.0.0'::inet+
- # else:: extract node values in the last iteration of the recursion, like +int4+, +1.0+, +now+, +255+
- #
- # @note boolean types types are mapped from +t+, +f+ to +true+, +false+
- def parse_node(node)
- return unless node
-
- case node.node
- when :constraint
- parse_node(node.constraint.raw_expr)
- when :partition_elem
- node.partition_elem.name
- when :func_call
- "#{parse_node(node.func_call.funcname.first)}()"
- when :a_const
- parse_a_const(node.a_const)
- when :type_cast
- value = parse_node(node.type_cast.arg)
- type = type(node.type_cast.type_name)
- separator = MAPPINGS.key?(value) ? '' : "::#{type}"
-
- [MAPPINGS.fetch(value, "'#{value}'"), separator].compact.join('')
- else
- get_value_from_key(node, key: node.node)
- end
- end
-
- def parse_a_const(a_const)
- return unless a_const
-
- type = a_const.val
- get_value_from_key(a_const, key: type)
- end
-
- def get_value_from_key(node, key:)
- node.to_h[key].values.last
- end
-
- def partition_keys
- return [] unless partitioning_stmt
-
- @partition_keys ||= partitioning_stmt.part_params.map { |key_stmt| parse_node(key_stmt) }
- end
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/schema_validation/adapters/foreign_key_database_adapter.rb b/lib/gitlab/database/schema_validation/adapters/foreign_key_database_adapter.rb
deleted file mode 100644
index 3b45f5c77ca..00000000000
--- a/lib/gitlab/database/schema_validation/adapters/foreign_key_database_adapter.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module SchemaValidation
- module Adapters
- class ForeignKeyDatabaseAdapter
- def initialize(query_result)
- @query_result = query_result
- end
-
- def name
- "#{query_result['schema']}.#{query_result['foreign_key_name']}"
- end
-
- def table_name
- query_result['table_name']
- end
-
- def statement
- query_result['foreign_key_definition']
- end
-
- private
-
- attr_reader :query_result
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/schema_validation/adapters/foreign_key_structure_sql_adapter.rb b/lib/gitlab/database/schema_validation/adapters/foreign_key_structure_sql_adapter.rb
deleted file mode 100644
index e4c1e1adab3..00000000000
--- a/lib/gitlab/database/schema_validation/adapters/foreign_key_structure_sql_adapter.rb
+++ /dev/null
@@ -1,50 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module SchemaValidation
- module Adapters
- class ForeignKeyStructureSqlAdapter
- STATEMENT_REGEX = /\bREFERENCES\s\K\S+\K\s\(/
- EXTRACT_REGEX = /\bFOREIGN KEY.*/
-
- def initialize(parsed_stmt)
- @parsed_stmt = parsed_stmt
- end
-
- def name
- "#{schema_name}.#{foreign_key_name}"
- end
-
- def table_name
- parsed_stmt.relation.relname
- end
-
- # PgQuery parses FK statements with an extra space in the referenced table column.
- # This extra space needs to be removed.
- #
- # @example REFERENCES ci_pipelines (id) => REFERENCES ci_pipelines(id)
- def statement
- deparse_stmt[EXTRACT_REGEX].gsub(STATEMENT_REGEX, '(')
- end
-
- private
-
- attr_reader :parsed_stmt
-
- def schema_name
- parsed_stmt.relation.schemaname
- end
-
- def foreign_key_name
- parsed_stmt.cmds.first.alter_table_cmd.def.constraint.conname
- end
-
- def deparse_stmt
- PgQuery.deparse_stmt(parsed_stmt)
- end
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/schema_validation/database.rb b/lib/gitlab/database/schema_validation/database.rb
deleted file mode 100644
index 858bf618f44..00000000000
--- a/lib/gitlab/database/schema_validation/database.rb
+++ /dev/null
@@ -1,166 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module SchemaValidation
- class Database
- STATIC_PARTITIONS_SCHEMA = 'gitlab_partitions_static'
-
- def initialize(connection)
- @connection = connection
- end
-
- def fetch_index_by_name(index_name)
- index_map[index_name]
- end
-
- def fetch_trigger_by_name(trigger_name)
- trigger_map[trigger_name]
- end
-
- def fetch_foreign_key_by_name(foreign_key_name)
- foreign_key_map[foreign_key_name]
- end
-
- def fetch_table_by_name(table_name)
- table_map[table_name]
- end
-
- def index_exists?(index_name)
- index_map[index_name].present?
- end
-
- def trigger_exists?(trigger_name)
- trigger_map[trigger_name].present?
- end
-
- def foreign_key_exists?(foreign_key_name)
- fetch_foreign_key_by_name(foreign_key_name).present?
- end
-
- def table_exists?(table_name)
- fetch_table_by_name(table_name).present?
- end
-
- def indexes
- index_map.values
- end
-
- def triggers
- trigger_map.values
- end
-
- def foreign_keys
- foreign_key_map.values
- end
-
- def tables
- table_map.values
- end
-
- private
-
- attr_reader :connection
-
- def schemas
- @schemas ||= [STATIC_PARTITIONS_SCHEMA, connection.current_schema]
- end
-
- def index_map
- @index_map ||=
- fetch_indexes.transform_values! do |index_stmt|
- SchemaObjects::Index.new(PgQuery.parse(index_stmt).tree.stmts.first.stmt.index_stmt)
- end
- end
-
- def trigger_map
- @trigger_map ||=
- fetch_triggers.transform_values! do |trigger_stmt|
- SchemaObjects::Trigger.new(PgQuery.parse(trigger_stmt).tree.stmts.first.stmt.create_trig_stmt)
- end
- end
-
- def foreign_key_map
- @foreign_key_map ||= fetch_fks.each_with_object({}) do |stmt, result|
- adapter = Adapters::ForeignKeyDatabaseAdapter.new(stmt)
-
- result[adapter.name] = SchemaObjects::ForeignKey.new(adapter)
- end
- end
-
- def table_map
- @table_map ||= fetch_tables.transform_values! do |stmt|
- columns = stmt.map { |column| SchemaObjects::Column.new(Adapters::ColumnDatabaseAdapter.new(column)) }
-
- SchemaObjects::Table.new(stmt.first['table_name'], columns)
- end
- end
-
- def fetch_indexes
- sql = <<~SQL
- SELECT indexname, indexdef
- FROM pg_indexes
- WHERE indexname NOT LIKE '%_pkey' AND schemaname IN ($1, $2);
- SQL
-
- connection.select_rows(sql, nil, schemas).to_h
- end
-
- def fetch_triggers
- sql = <<~SQL
- SELECT triggers.tgname, pg_get_triggerdef(triggers.oid)
- FROM pg_catalog.pg_trigger triggers
- INNER JOIN pg_catalog.pg_class rel ON triggers.tgrelid = rel.oid
- INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = rel.relnamespace
- WHERE triggers.tgisinternal IS FALSE
- AND nsp.nspname IN ($1, $2)
- SQL
-
- connection.select_rows(sql, nil, schemas).to_h
- end
-
- def fetch_tables
- sql = <<~SQL
- SELECT
- table_information.relname AS table_name,
- col_information.attname AS column_name,
- col_information.attnotnull AS not_null,
- col_information.attnum = ANY(pg_partitioned_table.partattrs) as partition_key,
- format_type(col_information.atttypid, col_information.atttypmod) AS data_type,
- pg_get_expr(col_default_information.adbin, col_default_information.adrelid) AS column_default
- FROM pg_attribute AS col_information
- JOIN pg_class AS table_information ON col_information.attrelid = table_information.oid
- JOIN pg_namespace AS schema_information ON table_information.relnamespace = schema_information.oid
- LEFT JOIN pg_partitioned_table ON pg_partitioned_table.partrelid = table_information.oid
- LEFT JOIN pg_attrdef AS col_default_information ON col_information.attrelid = col_default_information.adrelid
- AND col_information.attnum = col_default_information.adnum
- WHERE NOT col_information.attisdropped
- AND col_information.attnum > 0
- AND table_information.relkind IN ('r', 'p')
- AND schema_information.nspname IN ($1, $2)
- SQL
-
- connection.exec_query(sql, nil, schemas).group_by { |row| row['table_name'] }
- end
-
- def fetch_fks
- sql = <<~SQL
- SELECT
- pg_namespace.nspname::text AS schema,
- pg_class.relname::text AS table_name,
- pg_constraint.conname AS foreign_key_name,
- pg_get_constraintdef(pg_constraint.oid) AS foreign_key_definition
- FROM pg_constraint
- INNER JOIN pg_class ON pg_constraint.conrelid = pg_class.oid
- INNER JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid
- WHERE contype = 'f'
- AND pg_namespace.nspname = $1
- AND pg_constraint.conparentid = 0
- SQL
-
- connection.exec_query(sql, nil, [connection.current_schema])
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/schema_validation/inconsistency.rb b/lib/gitlab/database/schema_validation/inconsistency.rb
deleted file mode 100644
index 766f48ef339..00000000000
--- a/lib/gitlab/database/schema_validation/inconsistency.rb
+++ /dev/null
@@ -1,65 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module SchemaValidation
- class Inconsistency
- def initialize(validator_class, structure_sql_object, database_object)
- @validator_class = validator_class
- @structure_sql_object = structure_sql_object
- @database_object = database_object
- end
-
- def error_message
- format(validator_class::ERROR_MESSAGE, object_name)
- end
-
- def type
- validator_class.name.demodulize.underscore
- end
-
- def object_type
- structure_sql_object&.class&.name&.demodulize || database_object&.class&.name&.demodulize
- end
-
- def table_name
- structure_sql_object&.table_name || database_object&.table_name
- end
-
- def object_name
- structure_sql_object&.name || database_object&.name
- end
-
- def diff
- Diffy::Diff.new(structure_sql_statement, database_statement)
- end
-
- def inspect
- <<~MSG
- #{'-' * 54}
- #{error_message}
- Diff:
- #{diff.to_s(:color)}
- #{'-' * 54}
- MSG
- end
-
- def structure_sql_statement
- return unless structure_sql_object
-
- "#{structure_sql_object.statement}\n"
- end
-
- def database_statement
- return unless database_object
-
- "#{database_object.statement}\n"
- end
-
- private
-
- attr_reader :validator_class, :structure_sql_object, :database_object
- end
- end
- end
-end
diff --git a/lib/gitlab/database/schema_validation/pg_types.rb b/lib/gitlab/database/schema_validation/pg_types.rb
deleted file mode 100644
index 0a1999d056e..00000000000
--- a/lib/gitlab/database/schema_validation/pg_types.rb
+++ /dev/null
@@ -1,73 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module SchemaValidation
- class PgTypes
- TYPES = {
- 'bool' => 'boolean',
- 'bytea' => 'bytea',
- 'char' => '"char"',
- 'int8' => 'bigint',
- 'int2' => 'smallint',
- 'int4' => 'integer',
- 'regproc' => 'regproc',
- 'text' => 'text',
- 'oid' => 'oid',
- 'tid' => 'tid',
- 'xid' => 'xid',
- 'cid' => 'cid',
- 'json' => 'json',
- 'xml' => 'xml',
- 'pg_node_tree' => 'pg_node_tree',
- 'pg_ndistinct' => 'pg_ndistinct',
- 'pg_dependencies' => 'pg_dependencies',
- 'pg_mcv_list' => 'pg_mcv_list',
- 'xid8' => 'xid8',
- 'path' => 'path',
- 'polygon' => 'polygon',
- 'float4' => 'real',
- 'float8' => 'double precision',
- 'circle' => 'circle',
- 'money' => 'money',
- 'macaddr' => 'macaddr',
- 'inet' => 'inet',
- 'cidr' => 'cidr',
- 'macaddr8' => 'macaddr8',
- 'aclitem' => 'aclitem',
- 'bpchar' => 'character',
- 'varchar' => 'character varying',
- 'date' => 'date',
- 'time' => 'time without time zone',
- 'timestamp' => 'timestamp without time zone',
- 'timestamptz' => 'timestamp with time zone',
- 'interval' => 'interval',
- 'timetz' => 'time with time zone',
- 'bit' => 'bit',
- 'varbit' => 'bit varying',
- 'numeric' => 'numeric',
- 'refcursor' => 'refcursor',
- 'regprocedure' => 'regprocedure',
- 'regoper' => 'regoper',
- 'regoperator' => 'regoperator',
- 'regclass' => 'regclass',
- 'regcollation' => 'regcollation',
- 'regtype' => 'regtype',
- 'regrole' => 'regrole',
- 'regnamespace' => 'regnamespace',
- 'uuid' => 'uuid',
- 'pg_lsn' => 'pg_lsn',
- 'tsvector' => 'tsvector',
- 'gtsvector' => 'gtsvector',
- 'tsquery' => 'tsquery',
- 'regconfig' => 'regconfig',
- 'regdictionary' => 'regdictionary',
- 'jsonb' => 'jsonb',
- 'jsonpath' => 'jsonpath',
- 'txid_snapshot' => 'txid_snapshot',
- 'pg_snapshot' => 'pg_snapshot'
- }.freeze
- end
- end
- end
-end
diff --git a/lib/gitlab/database/schema_validation/runner.rb b/lib/gitlab/database/schema_validation/runner.rb
deleted file mode 100644
index 7a02c8a16d6..00000000000
--- a/lib/gitlab/database/schema_validation/runner.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module SchemaValidation
- class Runner
- def initialize(structure_sql, database, validators: Validators::BaseValidator.all_validators)
- @structure_sql = structure_sql
- @database = database
- @validators = validators
- end
-
- def execute
- validators.flat_map { |c| c.new(structure_sql, database).execute }
- end
-
- private
-
- attr_reader :structure_sql, :database, :validators
- end
- end
- end
-end
diff --git a/lib/gitlab/database/schema_validation/schema_objects/base.rb b/lib/gitlab/database/schema_validation/schema_objects/base.rb
deleted file mode 100644
index 43d30dc54ae..00000000000
--- a/lib/gitlab/database/schema_validation/schema_objects/base.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module SchemaValidation
- module SchemaObjects
- class Base
- def initialize(parsed_stmt)
- @parsed_stmt = parsed_stmt
- end
-
- def name
- raise NoMethodError, "subclasses of #{self.class.name} must implement #{__method__}"
- end
-
- def table_name
- parsed_stmt.relation.relname
- end
-
- def statement
- @statement ||= PgQuery.deparse_stmt(parsed_stmt)
- end
-
- private
-
- attr_reader :parsed_stmt
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/schema_validation/schema_objects/column.rb b/lib/gitlab/database/schema_validation/schema_objects/column.rb
deleted file mode 100644
index bd219300a13..00000000000
--- a/lib/gitlab/database/schema_validation/schema_objects/column.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module SchemaValidation
- module SchemaObjects
- class Column
- def initialize(adapter)
- @adapter = adapter
- end
-
- attr_reader :adapter
-
- delegate :name, :table_name, :partition_key?, to: :adapter
-
- def statement
- [name, adapter.data_type, adapter.default, adapter.nullable].compact.join(' ')
- end
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/schema_validation/schema_objects/foreign_key.rb b/lib/gitlab/database/schema_validation/schema_objects/foreign_key.rb
deleted file mode 100644
index b616b1a72b7..00000000000
--- a/lib/gitlab/database/schema_validation/schema_objects/foreign_key.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module SchemaValidation
- module SchemaObjects
- class ForeignKey
- def initialize(adapter)
- @adapter = adapter
- end
-
- # Foreign key name should include the schema, as the same name could be used across different schemas
- #
- # @example public.foreign_key_name
- def name
- @name ||= adapter.name
- end
-
- def table_name
- @table_name ||= adapter.table_name
- end
-
- def statement
- @statement ||= adapter.statement
- end
-
- private
-
- attr_reader :adapter
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/schema_validation/schema_objects/index.rb b/lib/gitlab/database/schema_validation/schema_objects/index.rb
deleted file mode 100644
index 28d61b18266..00000000000
--- a/lib/gitlab/database/schema_validation/schema_objects/index.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module SchemaValidation
- module SchemaObjects
- class Index < Base
- def name
- parsed_stmt.idxname
- end
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/schema_validation/schema_objects/table.rb b/lib/gitlab/database/schema_validation/schema_objects/table.rb
deleted file mode 100644
index de2e675d20e..00000000000
--- a/lib/gitlab/database/schema_validation/schema_objects/table.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module SchemaValidation
- module SchemaObjects
- class Table
- def initialize(name, columns)
- @name = name
- @columns = columns
- end
-
- attr_reader :name, :columns
-
- def table_name
- name
- end
-
- def statement
- format('CREATE TABLE %s (%s)', name, columns_statement)
- end
-
- def fetch_column_by_name(column_name)
- columns.find { |column| column.name == column_name }
- end
-
- def column_exists?(column_name)
- fetch_column_by_name(column_name).present?
- end
-
- private
-
- def columns_statement
- columns.reject(&:partition_key?).map(&:statement).join(', ')
- end
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/schema_validation/schema_objects/trigger.rb b/lib/gitlab/database/schema_validation/schema_objects/trigger.rb
deleted file mode 100644
index 508e6b27ed3..00000000000
--- a/lib/gitlab/database/schema_validation/schema_objects/trigger.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module SchemaValidation
- module SchemaObjects
- class Trigger < Base
- def name
- parsed_stmt.trigname
- end
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/schema_validation/structure_sql.rb b/lib/gitlab/database/schema_validation/structure_sql.rb
deleted file mode 100644
index 4d6fa17f0fc..00000000000
--- a/lib/gitlab/database/schema_validation/structure_sql.rb
+++ /dev/null
@@ -1,125 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module SchemaValidation
- class StructureSql
- DEFAULT_SCHEMA = 'public'
-
- def initialize(structure_file_path, schema_name = DEFAULT_SCHEMA)
- @structure_file_path = structure_file_path
- @schema_name = schema_name
- end
-
- def index_exists?(index_name)
- indexes.find { |index| index.name == index_name }.present?
- end
-
- def trigger_exists?(trigger_name)
- triggers.find { |trigger| trigger.name == trigger_name }.present?
- end
-
- def foreign_key_exists?(foreign_key_name)
- foreign_keys.find { |fk| fk.name == foreign_key_name }.present?
- end
-
- def fetch_table_by_name(table_name)
- tables.find { |table| table.name == table_name }
- end
-
- def table_exists?(table_name)
- fetch_table_by_name(table_name).present?
- end
-
- def indexes
- @indexes ||= map_with_default_schema(index_statements, SchemaObjects::Index)
- end
-
- def triggers
- @triggers ||= map_with_default_schema(trigger_statements, SchemaObjects::Trigger)
- end
-
- def foreign_keys
- @foreign_keys ||= foreign_key_statements.map do |stmt|
- stmt.relation.schemaname = schema_name if stmt.relation.schemaname == ''
-
- SchemaObjects::ForeignKey.new(Adapters::ForeignKeyStructureSqlAdapter.new(stmt))
- end
- end
-
- def tables
- @tables ||= table_statements.map do |stmt|
- table_name = stmt.relation.relname
- partition_stmt = stmt.partspec
-
- columns = stmt.table_elts.select { |n| n.node == :column_def }.map do |column|
- adapter = Adapters::ColumnStructureSqlAdapter.new(table_name, column.column_def, partition_stmt)
- SchemaObjects::Column.new(adapter)
- end
-
- SchemaObjects::Table.new(table_name, columns)
- end
- end
-
- private
-
- attr_reader :structure_file_path, :schema_name
-
- def index_statements
- statements.filter_map { |s| s.stmt.index_stmt }
- end
-
- def trigger_statements
- statements.filter_map { |s| s.stmt.create_trig_stmt }
- end
-
- def table_statements
- statements.filter_map { |s| s.stmt.create_stmt }
- end
-
- def foreign_key_statements
- constraint_statements(:CONSTR_FOREIGN)
- end
-
- # Filter constraint statement nodes
- #
- # @param constraint_type [Symbol] node type. One of CONSTR_PRIMARY, CONSTR_CHECK, CONSTR_EXCLUSION,
- # CONSTR_UNIQUE or CONSTR_FOREIGN.
- def constraint_statements(constraint_type)
- alter_table_statements(:AT_AddConstraint).filter do |stmt|
- stmt.cmds.first.alter_table_cmd.def.constraint.contype == constraint_type
- end
- end
-
- # Filter alter table statement nodes
- #
- # @param subtype [Symbol] node subtype +AT_AttachPartition+, +AT_ColumnDefault+ or +AT_AddConstraint+
- def alter_table_statements(subtype)
- statements.filter_map do |statement|
- node = statement.stmt.alter_table_stmt
-
- next unless node
-
- node if node.cmds.first.alter_table_cmd.subtype == subtype
- end
- end
-
- def statements
- @statements ||= parsed_structure_file.tree.stmts
- end
-
- def parsed_structure_file
- PgQuery.parse(File.read(structure_file_path))
- end
-
- def map_with_default_schema(statements, validation_class)
- statements.map do |statement|
- statement.relation.schemaname = schema_name if statement.relation.schemaname == ''
-
- validation_class.new(statement)
- end
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/schema_validation/track_inconsistency.rb b/lib/gitlab/database/schema_validation/track_inconsistency.rb
deleted file mode 100644
index 6e167653d32..00000000000
--- a/lib/gitlab/database/schema_validation/track_inconsistency.rb
+++ /dev/null
@@ -1,138 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module SchemaValidation
- class TrackInconsistency
- COLUMN_TEXT_LIMIT = 6144
-
- def initialize(inconsistency, project, user)
- @inconsistency = inconsistency
- @project = project
- @user = user
- end
-
- def execute
- return unless Gitlab.com?
- return refresh_issue if inconsistency_record.present?
-
- result = ::Issues::CreateService.new(
- container: project,
- current_user: user,
- params: params,
- perform_spam_check: false).execute
-
- track_inconsistency(result[:issue]) if result.success?
- end
-
- private
-
- attr_reader :inconsistency, :project, :user
-
- def track_inconsistency(issue)
- schema_inconsistency_model.create!(
- issue: issue,
- object_name: inconsistency.object_name,
- table_name: inconsistency.table_name,
- valitador_name: inconsistency.type,
- diff: inconsistency_diff
- )
- end
-
- def params
- {
- title: issue_title,
- description: description,
- issue_type: 'issue',
- labels: default_labels + group_labels
- }
- end
-
- def issue_title
- "New schema inconsistency: #{inconsistency.object_name}"
- end
-
- def description
- <<~MSG
- We have detected a new schema inconsistency.
-
- **Table name:** #{inconsistency.table_name}\
- **Object name:** #{inconsistency.object_name}\
- **Validator name:** #{inconsistency.type}\
- **Object type:** #{inconsistency.object_type}\
- **Error message:** #{inconsistency.error_message}
-
-
- **Structure.sql statement:**
-
- ```sql
- #{inconsistency.structure_sql_statement}
- ```
-
- **Database statement:**
-
- ```sql
- #{inconsistency.database_statement}
- ```
-
- **Diff:**
-
- ```diff
- #{inconsistency.diff}
-
- ```
-
-
- For more information, please contact the database team.
- MSG
- end
-
- def group_labels
- dictionary = YAML.safe_load(File.read(table_file_path))
-
- dictionary['feature_categories'].to_a.filter_map do |feature_category|
- Gitlab::Database::ConvertFeatureCategoryToGroupLabel.new(feature_category).execute
- end
- rescue Errno::ENOENT
- []
- end
-
- def default_labels
- %w[database database-inconsistency-report type::maintenance severity::4]
- end
-
- def table_file_path
- Rails.root.join(Gitlab::Database::GitlabSchema.dictionary_paths.first, "#{inconsistency.table_name}.yml")
- end
-
- def schema_inconsistency_model
- Gitlab::Database::SchemaValidation::SchemaInconsistency
- end
-
- def refresh_issue
- return if inconsistency_diff == inconsistency_record.diff # Nothing to refresh
-
- note = ::Notes::CreateService.new(
- inconsistency_record.issue.project,
- user,
- { noteable_type: 'Issue', noteable: inconsistency_record.issue, note: description }
- ).execute
-
- inconsistency_record.update!(diff: inconsistency_diff) if note.persisted?
- end
-
- def inconsistency_diff
- @inconsistency_diff ||= inconsistency.diff.to_s.first(COLUMN_TEXT_LIMIT)
- end
-
- def inconsistency_record
- @inconsistency_record ||= schema_inconsistency_model.with_open_issues.find_by(
- object_name: inconsistency.object_name,
- table_name: inconsistency.table_name,
- valitador_name: inconsistency.type
- )
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/schema_validation/validators/base_validator.rb b/lib/gitlab/database/schema_validation/validators/base_validator.rb
deleted file mode 100644
index ee322e50a2c..00000000000
--- a/lib/gitlab/database/schema_validation/validators/base_validator.rb
+++ /dev/null
@@ -1,49 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module SchemaValidation
- module Validators
- class BaseValidator
- ERROR_MESSAGE = 'A schema inconsistency has been found'
-
- def initialize(structure_sql, database)
- @structure_sql = structure_sql
- @database = database
- end
-
- def self.all_validators
- [
- ExtraTables,
- ExtraTableColumns,
- ExtraIndexes,
- ExtraTriggers,
- ExtraForeignKeys,
- MissingTables,
- MissingTableColumns,
- MissingIndexes,
- MissingTriggers,
- MissingForeignKeys,
- DifferentDefinitionTables,
- DifferentDefinitionIndexes,
- DifferentDefinitionTriggers,
- DifferentDefinitionForeignKeys
- ]
- end
-
- def execute
- raise NoMethodError, "subclasses of #{self.class.name} must implement #{__method__}"
- end
-
- private
-
- attr_reader :structure_sql, :database
-
- def build_inconsistency(validator_class, structure_sql_object, database_object)
- Inconsistency.new(validator_class, structure_sql_object, database_object)
- end
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/schema_validation/validators/different_definition_foreign_keys.rb b/lib/gitlab/database/schema_validation/validators/different_definition_foreign_keys.rb
deleted file mode 100644
index 8969fa76cd8..00000000000
--- a/lib/gitlab/database/schema_validation/validators/different_definition_foreign_keys.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module SchemaValidation
- module Validators
- class DifferentDefinitionForeignKeys < BaseValidator
- ERROR_MESSAGE = "The %s foreign key has a different statement between structure.sql and database"
-
- def execute
- structure_sql.foreign_keys.filter_map do |structure_sql_fk|
- database_fk = database.fetch_foreign_key_by_name(structure_sql_fk.name)
-
- next if database_fk.nil?
- next if database_fk.statement == structure_sql_fk.statement
-
- build_inconsistency(self.class, structure_sql_fk, database_fk)
- end
- end
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/schema_validation/validators/different_definition_indexes.rb b/lib/gitlab/database/schema_validation/validators/different_definition_indexes.rb
deleted file mode 100644
index ba12b3cdc61..00000000000
--- a/lib/gitlab/database/schema_validation/validators/different_definition_indexes.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module SchemaValidation
- module Validators
- class DifferentDefinitionIndexes < BaseValidator
- ERROR_MESSAGE = "The %s index has a different statement between structure.sql and database"
-
- def execute
- structure_sql.indexes.filter_map do |structure_sql_index|
- database_index = database.fetch_index_by_name(structure_sql_index.name)
-
- next if database_index.nil?
- next if database_index.statement == structure_sql_index.statement
-
- build_inconsistency(self.class, structure_sql_index, database_index)
- end
- end
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/schema_validation/validators/different_definition_tables.rb b/lib/gitlab/database/schema_validation/validators/different_definition_tables.rb
deleted file mode 100644
index 9fbddbd3fcd..00000000000
--- a/lib/gitlab/database/schema_validation/validators/different_definition_tables.rb
+++ /dev/null
@@ -1,50 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module SchemaValidation
- module Validators
- class DifferentDefinitionTables < BaseValidator
- ERROR_MESSAGE = "The table %s has a different column statement between structure.sql and database"
-
- def execute
- structure_sql.tables.filter_map do |structure_sql_table|
- table_name = structure_sql_table.name
- database_table = database.fetch_table_by_name(table_name)
-
- next unless database_table
-
- db_diffs, structure_diffs = column_diffs(database_table, structure_sql_table.columns)
-
- if db_diffs.any?
- build_inconsistency(self.class,
- SchemaObjects::Table.new(table_name, db_diffs),
- SchemaObjects::Table.new(table_name, structure_diffs))
- end
- end
- end
-
- private
-
- def column_diffs(db_table, columns)
- db_diffs = []
- structure_diffs = []
-
- columns.each do |column|
- db_column = db_table.fetch_column_by_name(column.name)
-
- next unless db_column
-
- next if db_column.statement == column.statement
-
- db_diffs << db_column
- structure_diffs << column
- end
-
- [db_diffs, structure_diffs]
- end
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/schema_validation/validators/different_definition_triggers.rb b/lib/gitlab/database/schema_validation/validators/different_definition_triggers.rb
deleted file mode 100644
index 79ffe9a6a98..00000000000
--- a/lib/gitlab/database/schema_validation/validators/different_definition_triggers.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module SchemaValidation
- module Validators
- class DifferentDefinitionTriggers < BaseValidator
- ERROR_MESSAGE = "The %s trigger has a different statement between structure.sql and database"
-
- def execute
- structure_sql.triggers.filter_map do |structure_sql_trigger|
- database_trigger = database.fetch_trigger_by_name(structure_sql_trigger.name)
-
- next if database_trigger.nil?
- next if database_trigger.statement == structure_sql_trigger.statement
-
- build_inconsistency(self.class, structure_sql_trigger, nil)
- end
- end
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/schema_validation/validators/extra_foreign_keys.rb b/lib/gitlab/database/schema_validation/validators/extra_foreign_keys.rb
deleted file mode 100644
index 887e86c7bfd..00000000000
--- a/lib/gitlab/database/schema_validation/validators/extra_foreign_keys.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module SchemaValidation
- module Validators
- class ExtraForeignKeys < BaseValidator
- ERROR_MESSAGE = "The foreign key %s is present in the database, but not in the structure.sql file"
-
- def execute
- database.foreign_keys.filter_map do |database_fk|
- next if structure_sql.foreign_key_exists?(database_fk.name)
-
- build_inconsistency(self.class, nil, database_fk)
- end
- end
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/schema_validation/validators/extra_indexes.rb b/lib/gitlab/database/schema_validation/validators/extra_indexes.rb
deleted file mode 100644
index c8d3749894b..00000000000
--- a/lib/gitlab/database/schema_validation/validators/extra_indexes.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module SchemaValidation
- module Validators
- class ExtraIndexes < BaseValidator
- ERROR_MESSAGE = "The index %s is present in the database, but not in the structure.sql file"
-
- def execute
- database.indexes.filter_map do |database_index|
- next if structure_sql.index_exists?(database_index.name)
-
- build_inconsistency(self.class, nil, database_index)
- end
- end
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/schema_validation/validators/extra_table_columns.rb b/lib/gitlab/database/schema_validation/validators/extra_table_columns.rb
deleted file mode 100644
index 823b01cf808..00000000000
--- a/lib/gitlab/database/schema_validation/validators/extra_table_columns.rb
+++ /dev/null
@@ -1,32 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module SchemaValidation
- module Validators
- class ExtraTableColumns < BaseValidator
- ERROR_MESSAGE = "The table %s has columns present in the database, but not in the structure.sql file"
-
- def execute
- database.tables.filter_map do |database_table|
- table_name = database_table.name
- structure_sql_table = structure_sql.fetch_table_by_name(table_name)
-
- next unless structure_sql_table
-
- inconsistencies = database_table.columns.filter_map do |database_table_column|
- next if structure_sql_table.column_exists?(database_table_column.name)
-
- database_table_column
- end
-
- if inconsistencies.any?
- build_inconsistency(self.class, nil, SchemaObjects::Table.new(table_name, inconsistencies))
- end
- end
- end
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/schema_validation/validators/extra_tables.rb b/lib/gitlab/database/schema_validation/validators/extra_tables.rb
deleted file mode 100644
index 99e98eb8f67..00000000000
--- a/lib/gitlab/database/schema_validation/validators/extra_tables.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module SchemaValidation
- module Validators
- class ExtraTables < BaseValidator
- ERROR_MESSAGE = "The table %s is present in the database, but not in the structure.sql file"
-
- def execute
- database.tables.filter_map do |database_table|
- next if structure_sql.table_exists?(database_table.name)
-
- build_inconsistency(self.class, nil, database_table)
- end
- end
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/schema_validation/validators/extra_triggers.rb b/lib/gitlab/database/schema_validation/validators/extra_triggers.rb
deleted file mode 100644
index 37dcbc53e2e..00000000000
--- a/lib/gitlab/database/schema_validation/validators/extra_triggers.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module SchemaValidation
- module Validators
- class ExtraTriggers < BaseValidator
- ERROR_MESSAGE = "The trigger %s is present in the database, but not in the structure.sql file"
-
- def execute
- database.triggers.filter_map do |database_trigger|
- next if structure_sql.trigger_exists?(database_trigger.name)
-
- build_inconsistency(self.class, nil, database_trigger)
- end
- end
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/schema_validation/validators/missing_foreign_keys.rb b/lib/gitlab/database/schema_validation/validators/missing_foreign_keys.rb
deleted file mode 100644
index b20f8474426..00000000000
--- a/lib/gitlab/database/schema_validation/validators/missing_foreign_keys.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module SchemaValidation
- module Validators
- class MissingForeignKeys < BaseValidator
- ERROR_MESSAGE = "The foreign key %s is missing from the database"
-
- def execute
- structure_sql.foreign_keys.filter_map do |structure_sql_fk|
- next if database.foreign_key_exists?(structure_sql_fk.name)
-
- build_inconsistency(self.class, structure_sql_fk, nil)
- end
- end
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/schema_validation/validators/missing_indexes.rb b/lib/gitlab/database/schema_validation/validators/missing_indexes.rb
deleted file mode 100644
index 7f81aaccf0f..00000000000
--- a/lib/gitlab/database/schema_validation/validators/missing_indexes.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module SchemaValidation
- module Validators
- class MissingIndexes < BaseValidator
- ERROR_MESSAGE = "The index %s is missing from the database"
-
- def execute
- structure_sql.indexes.filter_map do |structure_sql_index|
- next if database.index_exists?(structure_sql_index.name)
-
- build_inconsistency(self.class, structure_sql_index, nil)
- end
- end
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/schema_validation/validators/missing_table_columns.rb b/lib/gitlab/database/schema_validation/validators/missing_table_columns.rb
deleted file mode 100644
index b49d53823ee..00000000000
--- a/lib/gitlab/database/schema_validation/validators/missing_table_columns.rb
+++ /dev/null
@@ -1,32 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module SchemaValidation
- module Validators
- class MissingTableColumns < BaseValidator
- ERROR_MESSAGE = "The table %s has columns missing from the database"
-
- def execute
- structure_sql.tables.filter_map do |structure_sql_table|
- table_name = structure_sql_table.name
- database_table = database.fetch_table_by_name(table_name)
-
- next unless database_table
-
- inconsistencies = structure_sql_table.columns.filter_map do |structure_table_column|
- next if database_table.column_exists?(structure_table_column.name)
-
- structure_table_column
- end
-
- if inconsistencies.any?
- build_inconsistency(self.class, nil, SchemaObjects::Table.new(table_name, inconsistencies))
- end
- end
- end
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/schema_validation/validators/missing_tables.rb b/lib/gitlab/database/schema_validation/validators/missing_tables.rb
deleted file mode 100644
index f1c9383487d..00000000000
--- a/lib/gitlab/database/schema_validation/validators/missing_tables.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module SchemaValidation
- module Validators
- class MissingTables < BaseValidator
- ERROR_MESSAGE = "The table %s is missing from the database"
-
- def execute
- structure_sql.tables.filter_map do |structure_sql_table|
- next if database.table_exists?(structure_sql_table.name)
-
- build_inconsistency(self.class, structure_sql_table, nil)
- end
- end
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/schema_validation/validators/missing_triggers.rb b/lib/gitlab/database/schema_validation/validators/missing_triggers.rb
deleted file mode 100644
index 36236463bbf..00000000000
--- a/lib/gitlab/database/schema_validation/validators/missing_triggers.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module SchemaValidation
- module Validators
- class MissingTriggers < BaseValidator
- ERROR_MESSAGE = "The trigger %s is missing from the database"
-
- def execute
- structure_sql.triggers.filter_map do |structure_sql_trigger|
- next if database.trigger_exists?(structure_sql_trigger.name)
-
- build_inconsistency(self.class, structure_sql_trigger, nil)
- end
- end
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/tables_locker.rb b/lib/gitlab/database/tables_locker.rb
index 02e0da022f9..aa880b709fe 100644
--- a/lib/gitlab/database/tables_locker.rb
+++ b/lib/gitlab/database/tables_locker.rb
@@ -13,7 +13,7 @@ module Gitlab
end
def unlock_writes
- Gitlab::Database::EachDatabase.each_database_connection do |connection, database_name|
+ Gitlab::Database::EachDatabase.each_connection do |connection, database_name|
tables_to_lock(connection) do |table_name, schema_name|
# TODO: https://gitlab.com/gitlab-org/gitlab/-/issues/366834
next if schema_name.in? GITLAB_SCHEMAS_TO_IGNORE
@@ -28,7 +28,7 @@ module Gitlab
# It locks the tables on the database where they don't belong. Also it unlocks the tables
# on the database where they belong
def lock_writes
- Gitlab::Database::EachDatabase.each_database_connection(include_shared: false) do |connection, database_name|
+ Gitlab::Database::EachDatabase.each_connection(include_shared: false) do |connection, database_name|
schemas_for_connection = Gitlab::Database.gitlab_schemas_for_connection(connection)
tables_to_lock(connection) do |table_name, schema_name|
diff --git a/lib/gitlab/discussions_diff/highlight_cache.rb b/lib/gitlab/discussions_diff/highlight_cache.rb
index 18ff7c28e17..31b214a4af9 100644
--- a/lib/gitlab/discussions_diff/highlight_cache.rb
+++ b/lib/gitlab/discussions_diff/highlight_cache.rb
@@ -42,8 +42,10 @@ module Gitlab
with_redis do |redis|
Gitlab::Instrumentation::RedisClusterValidator.allow_cross_slot_commands do
if Gitlab::Redis::ClusterUtil.cluster?(redis)
- Gitlab::Redis::CrossSlot::Pipeline.new(redis).pipelined do |pipeline|
- keys.each { |key| pipeline.get(key) }
+ redis.with_readonly_pipeline do
+ Gitlab::Redis::CrossSlot::Pipeline.new(redis).pipelined do |pipeline|
+ keys.each { |key| pipeline.get(key) }
+ end
end
else
redis.mget(keys)
diff --git a/lib/gitlab/email/handler/service_desk_handler.rb b/lib/gitlab/email/handler/service_desk_handler.rb
index 215ba77db13..5d0e6ea61e1 100644
--- a/lib/gitlab/email/handler/service_desk_handler.rb
+++ b/lib/gitlab/email/handler/service_desk_handler.rb
@@ -32,6 +32,9 @@ module Gitlab
def execute
raise ProjectNotFound if project.nil?
+ # Verification emails should never create issues
+ return if handled_custom_email_address_verification?
+
create_issue_or_note
if from_address
@@ -70,6 +73,27 @@ module Gitlab
attr_reader :project_id, :project_path, :service_desk_key
+ def contains_custom_email_address_verification_subaddress?
+ return false unless Feature.enabled?(:service_desk_custom_email, project)
+
+ # Verification email only has one recipient
+ mail.to.first.include?(ServiceDeskSetting::CUSTOM_EMAIL_VERIFICATION_SUBADDRESS)
+ end
+
+ def handled_custom_email_address_verification?
+ return false unless contains_custom_email_address_verification_subaddress?
+
+ ::ServiceDesk::CustomEmailVerifications::UpdateService.new(
+ project: project,
+ current_user: nil,
+ params: {
+ mail: mail
+ }
+ ).execute
+
+ true
+ end
+
def project_from_key
return unless match = service_desk_key.match(PROJECT_KEY_PATTERN)
diff --git a/lib/gitlab/email/receiver.rb b/lib/gitlab/email/receiver.rb
index 51d250ea98c..ee11105537b 100644
--- a/lib/gitlab/email/receiver.rb
+++ b/lib/gitlab/email/receiver.rb
@@ -8,7 +8,7 @@ module Gitlab
class Receiver
include Gitlab::Utils::StrongMemoize
- RECEIVED_HEADER_REGEX = /for\s+\<(.+)\>/.freeze
+ RECEIVED_HEADER_REGEX = /for\s+\<([^<]+)\>/.freeze
# Errors that are purely from users and not anything we can control
USER_ERRORS = [
diff --git a/lib/gitlab/error_tracking/error_repository.rb b/lib/gitlab/error_tracking/error_repository.rb
index 3871305c9c5..79557838abf 100644
--- a/lib/gitlab/error_tracking/error_repository.rb
+++ b/lib/gitlab/error_tracking/error_repository.rb
@@ -15,12 +15,7 @@ module Gitlab
#
# @return [self]
def self.build(project)
- strategy =
- if Feature.enabled?(:gitlab_error_tracking, project)
- OpenApiStrategy.new(project)
- else
- ActiveRecordStrategy.new(project)
- end
+ strategy = OpenApiStrategy.new(project)
new(strategy)
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
deleted file mode 100644
index 01e7fbda384..00000000000
--- a/lib/gitlab/error_tracking/error_repository/active_record_strategy.rb
+++ /dev/null
@@ -1,117 +0,0 @@
-# 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:, query:, sort:, limit:, cursor:)
- errors = project_errors
- errors = filter_by_status(errors, filters[:status])
- errors = sort(errors, sort)
- errors = errors.keyset_paginate(cursor: cursor, per_page: limit)
- # query is not supported
-
- pagination = ErrorRepository::Pagination.new(errors.cursor_for_next_page, errors.cursor_for_previous_page)
-
- [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
-
- def dsn_url(public_key)
- gitlab = Settings.gitlab
-
- custom_port = Settings.gitlab_on_standard_port? ? nil : ":#{gitlab.port}"
-
- base_url = [
- gitlab.protocol,
- "://",
- public_key,
- '@',
- gitlab.host,
- custom_port,
- gitlab.relative_url_root
- ].join('')
-
- "#{base_url}/api/v4/error_tracking/collector/#{project.id}"
- end
-
- private
-
- attr_reader :project
-
- 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/error_tracking/processor/grpc_error_processor.rb b/lib/gitlab/error_tracking/processor/grpc_error_processor.rb
index ab0df39e512..c141398bee0 100644
--- a/lib/gitlab/error_tracking/processor/grpc_error_processor.rb
+++ b/lib/gitlab/error_tracking/processor/grpc_error_processor.rb
@@ -6,7 +6,8 @@ module Gitlab
module GrpcErrorProcessor
extend Gitlab::ErrorTracking::Processor::Concerns::ProcessesExceptions
- DEBUG_ERROR_STRING_REGEX = RE2('(.*) debug_error_string:(.*)')
+ # Braces added by gRPC Ruby code: https://github.com/grpc/grpc/blob/0e38b075ffff72ab2ad5326e3f60ba6dcc234f46/src/ruby/lib/grpc/errors.rb#L46
+ DEBUG_ERROR_STRING_REGEX = RE2('(.*) debug_error_string:\{(.*)\}')
class << self
def call(event)
diff --git a/lib/gitlab/exception_log_formatter.rb b/lib/gitlab/exception_log_formatter.rb
index 52ad67d6f8b..a32f837eee9 100644
--- a/lib/gitlab/exception_log_formatter.rb
+++ b/lib/gitlab/exception_log_formatter.rb
@@ -21,6 +21,10 @@ module Gitlab
payload['exception.cause_class'] = exception.cause.class.name
end
+ if gitaly_metadata = find_gitaly_metadata(exception)
+ payload['exception.gitaly'] = gitaly_metadata.to_s
+ end
+
if sql = find_sql(exception)
payload['exception.sql'] = sql
end
@@ -35,6 +39,16 @@ module Gitlab
end
end
+ def find_gitaly_metadata(exception)
+ if exception.is_a?(::Gitlab::Git::BaseError)
+ exception.metadata
+ elsif exception.is_a?(::GRPC::BadStatus)
+ exception.metadata[::Gitlab::Git::BaseError::METADATA_KEY]
+ elsif exception.cause.present?
+ find_gitaly_metadata(exception.cause)
+ end
+ end
+
private
def normalize_query(sql)
diff --git a/lib/gitlab/git/base_error.rb b/lib/gitlab/git/base_error.rb
index 0b0fdef54cc..330e947844c 100644
--- a/lib/gitlab/git/base_error.rb
+++ b/lib/gitlab/git/base_error.rb
@@ -4,6 +4,7 @@ require 'grpc'
module Gitlab
module Git
class BaseError < StandardError
+ METADATA_KEY = :gitaly_error_metadata
DEBUG_ERROR_STRING_REGEX = /(.*?) debug_error_string:.*$/m.freeze
GRPC_CODES = {
'0' => 'ok',
@@ -25,12 +26,15 @@ module Gitlab
'16' => 'unauthenticated'
}.freeze
- attr_reader :status, :code, :service
+ attr_reader :status, :code, :service, :metadata
def initialize(msg = nil)
super && return if msg.nil?
- set_grpc_error_code(msg) if msg.is_a?(::GRPC::BadStatus)
+ if msg.is_a?(::GRPC::BadStatus)
+ set_grpc_error_code(msg)
+ set_grpc_error_metadata(msg)
+ end
super(build_raw_message(msg))
end
@@ -46,6 +50,10 @@ module Gitlab
@code = GRPC_CODES[@status.to_s]
@service = 'git'
end
+
+ def set_grpc_error_metadata(grpc_error)
+ @metadata = grpc_error.metadata.fetch(METADATA_KEY, {}).clone
+ end
end
end
end
diff --git a/lib/gitlab/git/commit.rb b/lib/gitlab/git/commit.rb
index 11eb0a584ab..c0601c7795c 100644
--- a/lib/gitlab/git/commit.rb
+++ b/lib/gitlab/git/commit.rb
@@ -320,7 +320,7 @@ module Gitlab
end
def first_ref_by_oid(repo)
- ref = repo.refs_by_oid(oid: id, limit: 1)&.first
+ ref = repo.refs_by_oid(oid: id, limit: 1).first
return unless ref
diff --git a/lib/gitlab/git/finders/refs_finder.rb b/lib/gitlab/git/finders/refs_finder.rb
new file mode 100644
index 00000000000..a0117bc0fa9
--- /dev/null
+++ b/lib/gitlab/git/finders/refs_finder.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Git
+ module Finders
+ class RefsFinder
+ attr_reader :repository, :search, :ref_type
+
+ UnknownRefTypeError = Class.new(StandardError)
+
+ def initialize(repository, search:, ref_type:)
+ @repository = repository
+ @search = search
+ @ref_type = ref_type
+ end
+
+ def execute
+ pattern = [prefix, search, "*"].compact.join
+
+ repository.list_refs(
+ [pattern]
+ )
+ end
+
+ private
+
+ def prefix
+ case ref_type
+ when :branches
+ Gitlab::Git::BRANCH_REF_PREFIX
+ when :tags
+ Gitlab::Git::TAG_REF_PREFIX
+ else
+ raise UnknownRefTypeError, "ref_type must be one of [:branches, :tags]"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/git/hook_env.rb b/lib/gitlab/git/hook_env.rb
index f93ab19fc65..2524d4c4cfb 100644
--- a/lib/gitlab/git/hook_env.rb
+++ b/lib/gitlab/git/hook_env.rb
@@ -14,7 +14,7 @@ module Gitlab
#
# This class is thread-safe via RequestStore.
class HookEnv
- WHITELISTED_VARIABLES = %w[
+ ALLOWLISTED_VARIABLES = %w[
GIT_OBJECT_DIRECTORY_RELATIVE
GIT_ALTERNATE_OBJECT_DIRECTORIES_RELATIVE
].freeze
@@ -25,7 +25,7 @@ module Gitlab
raise "missing gl_repository" if gl_repository.blank?
Gitlab::SafeRequestStore[:gitlab_git_env] ||= {}
- Gitlab::SafeRequestStore[:gitlab_git_env][gl_repository] = whitelist_git_env(env)
+ Gitlab::SafeRequestStore[:gitlab_git_env][gl_repository] = allowlist_git_env(env)
end
def self.all(gl_repository)
@@ -46,8 +46,8 @@ module Gitlab
env
end
- def self.whitelist_git_env(env)
- env.select { |key, _| WHITELISTED_VARIABLES.include?(key.to_s) }.with_indifferent_access
+ def self.allowlist_git_env(env)
+ env.select { |key, _| ALLOWLISTED_VARIABLES.include?(key.to_s) }.with_indifferent_access
end
end
end
diff --git a/lib/gitlab/git/keep_around.rb b/lib/gitlab/git/keep_around.rb
index 38f0e47c4c7..5835a7001af 100644
--- a/lib/gitlab/git/keep_around.rb
+++ b/lib/gitlab/git/keep_around.rb
@@ -19,6 +19,8 @@ module Gitlab
end
def execute(shas)
+ return if disabled?
+
shas.uniq.each do |sha|
next unless sha.present? && commit_by(oid: sha)
@@ -32,6 +34,8 @@ module Gitlab
end
def kept_around?(sha)
+ return true if disabled?
+
ref_exists?(keep_around_ref_name(sha))
end
@@ -40,6 +44,11 @@ module Gitlab
private
+ def disabled?
+ Feature.enabled?(:disable_keep_around_refs, @repository, type: :ops) ||
+ (@repository.project && Feature.enabled?(:disable_keep_around_refs, @repository.project, type: :ops))
+ end
+
def keep_around_ref_name(sha)
"refs/#{::Repository::REF_KEEP_AROUND}/#{sha}"
end
diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb
index ed45d3eb030..71be986882c 100644
--- a/lib/gitlab/git/repository.rb
+++ b/lib/gitlab/git/repository.rb
@@ -337,9 +337,15 @@ module Gitlab
# Return repo size in megabytes
def size
- size = gitaly_repository_client.repository_size
+ if Feature.enabled?(:use_repository_info_for_repository_size)
+ bytes = gitaly_repository_client.repository_info.size
- (size.to_f / 1024).round(2)
+ (bytes.to_f / 1024 / 1024).round(2)
+ else
+ kilobytes = gitaly_repository_client.repository_size
+
+ (kilobytes.to_f / 1024).round(2)
+ end
end
# Return git object directory size in bytes
@@ -401,11 +407,12 @@ module Gitlab
newrevs = newrevs.uniq.sort
- @new_blobs ||= Hash.new do |h, revs|
- h[revs] = blobs(['--not', '--all', '--not'] + newrevs, with_paths: true, dynamic_timeout: dynamic_timeout)
- end
-
- @new_blobs[newrevs]
+ @new_blobs ||= {}
+ @new_blobs[newrevs] ||= blobs(
+ ['--not', '--all', '--not'] + newrevs,
+ with_paths: true,
+ dynamic_timeout: dynamic_timeout
+ ).to_a
end
# List blobs reachable via a set of revisions. Supports the
@@ -554,10 +561,10 @@ module Gitlab
# Limit of 0 means there is no limit.
def refs_by_oid(oid:, limit: 0, ref_patterns: nil)
wrapped_gitaly_errors do
- gitaly_ref_client.find_refs_by_oid(oid: oid, limit: limit, ref_patterns: ref_patterns)
+ gitaly_ref_client.find_refs_by_oid(oid: oid, limit: limit, ref_patterns: ref_patterns) || []
end
rescue CommandError, TypeError, NoRepository
- nil
+ []
end
# Returns url for submodule
diff --git a/lib/gitlab/git/tree.rb b/lib/gitlab/git/tree.rb
index df3d8165ef2..140dc791135 100644
--- a/lib/gitlab/git/tree.rb
+++ b/lib/gitlab/git/tree.rb
@@ -26,6 +26,11 @@ module Gitlab
repository.gitaly_commit_client.tree_entries(
repository, sha, path, recursive, skip_flat_paths, pagination_params)
end
+
+ # Incorrect revision or path could lead to index error.
+ # We silently handle such errors by returning an empty set of entries and cursor.
+ rescue Gitlab::Git::Index::IndexError
+ [[], nil]
end
private
diff --git a/lib/gitlab/gitaly_client/call.rb b/lib/gitlab/gitaly_client/call.rb
index 3fe3702cfe1..37d3921d6d5 100644
--- a/lib/gitlab/gitaly_client/call.rb
+++ b/lib/gitlab/gitaly_client/call.rb
@@ -32,6 +32,8 @@ module Gitlab
end
rescue StandardError => err
store_timings
+ set_gitaly_error_metadata(err) if err.is_a?(::GRPC::BadStatus)
+
raise err
end
@@ -44,6 +46,9 @@ module Gitlab
yielder.yield(value)
end
+ rescue ::GRPC::BadStatus => err
+ set_gitaly_error_metadata(err)
+ raise err
ensure
store_timings
end
@@ -73,6 +78,15 @@ module Gitlab
backtrace: Gitlab::BacktraceCleaner.clean_backtrace(caller)
)
end
+
+ def set_gitaly_error_metadata(err)
+ err.metadata[::Gitlab::Git::BaseError::METADATA_KEY] = {
+ storage: @storage,
+ address: ::Gitlab::GitalyClient.address(@storage),
+ service: @service,
+ rpc: @rpc
+ }
+ end
end
end
end
diff --git a/lib/gitlab/gitaly_client/commit_service.rb b/lib/gitlab/gitaly_client/commit_service.rb
index aa25fd3589a..c10f780665c 100644
--- a/lib/gitlab/gitaly_client/commit_service.rb
+++ b/lib/gitlab/gitaly_client/commit_service.rb
@@ -531,14 +531,24 @@ module Gitlab
request = Gitaly::GetCommitSignaturesRequest.new(repository: @gitaly_repo, commit_ids: commit_ids)
response = gitaly_client_call(@repository.storage, :commit_service, :get_commit_signatures, request, timeout: GitalyClient.fast_timeout)
- signatures = Hash.new { |h, k| h[k] = [+''.b, +''.b] }
+ signatures = Hash.new do |h, k|
+ h[k] = {
+ signature: +''.b,
+ signed_text: +''.b,
+ signer: :SIGNER_UNSPECIFIED
+ }
+ end
+
current_commit_id = nil
response.each do |message|
current_commit_id = message.commit_id if message.commit_id.present?
- signatures[current_commit_id].first << message.signature
- signatures[current_commit_id].last << message.signed_text
+ signatures[current_commit_id][:signature] << message.signature
+ signatures[current_commit_id][:signed_text] << message.signed_text
+
+ # The actual value is send once. All the other chunks send SIGNER_UNSPECIFIED
+ signatures[current_commit_id][:signer] = message.signer unless message.signer == :SIGNER_UNSPECIFIED
end
signatures
@@ -585,9 +595,7 @@ module Gitlab
end
def call_commit_diff(request_params, options = {})
- request_params[:ignore_whitespace_change] = options.fetch(:ignore_whitespace_change, false)
-
- if Feature.enabled?(:add_ignore_all_white_spaces) && (request_params[:ignore_whitespace_change])
+ if options.fetch(:ignore_whitespace_change, false)
request_params[:whitespace_changes] = WHITESPACE_CHANGES['ignore_all_spaces']
end
@@ -641,10 +649,6 @@ module Gitlab
def find_changed_paths_request(commits, merge_commit_diff_mode)
diff_mode = MERGE_COMMIT_DIFF_MODES[merge_commit_diff_mode] if Feature.enabled?(:merge_commit_diff_modes)
- if Feature.disabled?(:find_changed_paths_new_format)
- return Gitaly::FindChangedPathsRequest.new(repository: @gitaly_repo, commits: commits, merge_commit_diff_mode: diff_mode)
- end
-
commit_requests = commits.map do |commit|
Gitaly::FindChangedPathsRequest::Request.new(
commit_request: Gitaly::FindChangedPathsRequest::Request::CommitRequest.new(commit_revision: commit)
diff --git a/lib/gitlab/gitaly_client/operation_service.rb b/lib/gitlab/gitaly_client/operation_service.rb
index bd6cc9105d9..67e135bb530 100644
--- a/lib/gitlab/gitaly_client/operation_service.rb
+++ b/lib/gitlab/gitaly_client/operation_service.rb
@@ -135,7 +135,7 @@ module Gitlab
end
end
- def user_merge_to_ref(user, source_sha:, branch:, target_ref:, message:, first_parent_ref:, allow_conflicts: false)
+ def user_merge_to_ref(user, source_sha:, branch:, target_ref:, message:, first_parent_ref:)
request = Gitaly::UserMergeToRefRequest.new(
repository: @gitaly_repo,
source_sha: source_sha,
@@ -144,7 +144,6 @@ module Gitlab
user: Gitlab::Git::User.from_gitlab(user).to_gitaly,
message: encode_binary(message),
first_parent_ref: encode_binary(first_parent_ref),
- allow_conflicts: allow_conflicts,
timestamp: Google::Protobuf::Timestamp.new(seconds: Time.now.utc.to_i)
)
diff --git a/lib/gitlab/gitaly_client/repository_service.rb b/lib/gitlab/gitaly_client/repository_service.rb
index 93d58710b0c..b5b7d94b4d0 100644
--- a/lib/gitlab/gitaly_client/repository_service.rb
+++ b/lib/gitlab/gitaly_client/repository_service.rb
@@ -52,6 +52,12 @@ module Gitlab
response.size
end
+ def repository_info
+ request = Gitaly::RepositoryInfoRequest.new(repository: @gitaly_repo)
+
+ gitaly_client_call(@storage, :repository_service, :repository_info, request, timeout: GitalyClient.long_timeout)
+ end
+
def get_object_directory_size
request = Gitaly::GetObjectDirectorySizeRequest.new(repository: @gitaly_repo)
response = gitaly_client_call(@storage, :repository_service, :get_object_directory_size, request, timeout: GitalyClient.medium_timeout)
diff --git a/lib/gitlab/github_import.rb b/lib/gitlab/github_import.rb
index 9556a9e98ba..24e77363e1b 100644
--- a/lib/gitlab/github_import.rb
+++ b/lib/gitlab/github_import.rb
@@ -8,12 +8,18 @@ module Gitlab
def self.new_client_for(project, token: nil, host: nil, parallel: true)
token_to_use = token || project.import_data&.credentials&.fetch(:user)
- Client.new(
- token_to_use,
+ token_pool = project.import_data&.credentials&.dig(:additional_access_tokens)
+ options = {
host: host.presence || self.formatted_import_url(project),
per_page: self.per_page(project),
parallel: parallel
- )
+ }
+
+ if token_pool
+ ClientPool.new(token_pool: token_pool, **options)
+ else
+ Client.new(token_to_use, **options)
+ end
end
# Returns the ID of the ghost user.
diff --git a/lib/gitlab/github_import/client_pool.rb b/lib/gitlab/github_import/client_pool.rb
new file mode 100644
index 00000000000..e8414942d1b
--- /dev/null
+++ b/lib/gitlab/github_import/client_pool.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module GithubImport
+ class ClientPool
+ delegate_missing_to :best_client
+
+ def initialize(token_pool:, per_page:, parallel:, host: nil)
+ @token_pool = token_pool
+ @host = host
+ @per_page = per_page
+ @parallel = parallel
+ end
+
+ # Returns the client with the most remaining requests, or the client with
+ # the closest rate limit reset time, if all clients are rate limited.
+ def best_client
+ clients_with_requests_remaining = clients.select(&:requests_remaining?)
+
+ return clients_with_requests_remaining.max_by(&:remaining_requests) if clients_with_requests_remaining.any?
+
+ clients.min_by(&:rate_limit_resets_in)
+ end
+
+ private
+
+ def clients
+ @clients ||= @token_pool.map do |token|
+ Client.new(
+ token,
+ host: @host,
+ per_page: @per_page,
+ parallel: @parallel
+ )
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/github_import/importer/issue_importer.rb b/lib/gitlab/github_import/importer/issue_importer.rb
index b477468d327..a537841ecf3 100644
--- a/lib/gitlab/github_import/importer/issue_importer.rb
+++ b/lib/gitlab/github_import/importer/issue_importer.rb
@@ -31,7 +31,7 @@ module Gitlab
if (issue_id = create_issue)
create_assignees(issue_id)
issuable_finder.cache_database_id(issue_id)
- update_search_data(issue_id) if Feature.enabled?(:issues_full_text_search)
+ update_search_data(issue_id)
end
end
end
diff --git a/lib/gitlab/github_import/settings.rb b/lib/gitlab/github_import/settings.rb
index 0b883de8ed0..73a5f49a9e3 100644
--- a/lib/gitlab/github_import/settings.rb
+++ b/lib/gitlab/github_import/settings.rb
@@ -56,8 +56,16 @@ module Gitlab
def write(user_settings)
user_settings = user_settings.to_h.with_indifferent_access
- optional_stages = fetch_stages_from_params(user_settings)
- import_data = project.create_or_update_import_data(data: { optional_stages: optional_stages })
+ optional_stages = fetch_stages_from_params(user_settings[:optional_stages])
+ credentials = project.import_data&.credentials&.merge(
+ additional_access_tokens: user_settings[:additional_access_tokens]
+ )
+
+ import_data = project.create_or_update_import_data(
+ data: { optional_stages: optional_stages },
+ credentials: credentials
+ )
+
import_data.save!
end
@@ -74,6 +82,8 @@ module Gitlab
attr_reader :project
def fetch_stages_from_params(user_settings)
+ user_settings = user_settings.to_h.with_indifferent_access
+
OPTIONAL_STAGES.keys.to_h do |stage_name|
enabled = Gitlab::Utils.to_boolean(user_settings[stage_name], default: false)
[stage_name, enabled]
diff --git a/lib/gitlab/github_import/user_finder.rb b/lib/gitlab/github_import/user_finder.rb
index dd71edbd205..57365ebe206 100644
--- a/lib/gitlab/github_import/user_finder.rb
+++ b/lib/gitlab/github_import/user_finder.rb
@@ -28,9 +28,6 @@ module Gitlab
EMAIL_FOR_USERNAME_CACHE_KEY =
'github-import/user-finder/email-for-username/%s'
- # The base cache key to use for caching inexistence of GitHub usernames.
- INEXISTENCE_OF_GITHUB_USERNAME_CACHE_KEY = 'github-import/user-finder/inexistence-of-username/%s'
-
# project - An instance of `Project`
# client - An instance of `Gitlab::GithubImport::Client`
def initialize(project, client)
@@ -112,18 +109,24 @@ module Gitlab
id_for_github_id(id) || id_for_github_email(email)
end
+ # Find the public email of a given username in GitHub. The public email is cached to avoid multiple calls to
+ # GitHub. In case the username does not exist or the public email is nil, a blank value is cached to also prevent
+ # multiple calls to GitHub.
+ #
+ # @return [String] If public email is found
+ # @return [Nil] If public email or username does not exist
def email_for_github_username(username)
cache_key = EMAIL_FOR_USERNAME_CACHE_KEY % username
email = Gitlab::Cache::Import::Caching.read(cache_key)
- if email.blank? && !github_username_inexists?(username)
+ if email.nil?
user = client.user(username)
- email = Gitlab::Cache::Import::Caching.write(cache_key, user[:email], timeout: timeout(user[:email])) if user
+ email = Gitlab::Cache::Import::Caching.write(cache_key, user[:email].to_s, timeout: timeout(user[:email]))
end
- email
+ email.presence
rescue ::Octokit::NotFound
- cache_github_username_inexistence(username)
+ Gitlab::Cache::Import::Caching.write(cache_key, '')
nil
end
@@ -196,18 +199,6 @@ module Gitlab
Gitlab::Cache::Import::Caching::SHORTER_TIMEOUT
end
end
-
- def github_username_inexists?(username)
- cache_key = INEXISTENCE_OF_GITHUB_USERNAME_CACHE_KEY % username
-
- Gitlab::Cache::Import::Caching.read(cache_key) == 'true'
- end
-
- def cache_github_username_inexistence(username)
- cache_key = INEXISTENCE_OF_GITHUB_USERNAME_CACHE_KEY % username
-
- Gitlab::Cache::Import::Caching.write(cache_key, true)
- end
end
end
end
diff --git a/lib/gitlab/gon_helper.rb b/lib/gitlab/gon_helper.rb
index 9eeea7336b5..ff171c24549 100644
--- a/lib/gitlab/gon_helper.rb
+++ b/lib/gitlab/gon_helper.rb
@@ -75,6 +75,7 @@ module Gitlab
# To be removed with https://gitlab.com/gitlab-org/gitlab/-/issues/399248
push_frontend_feature_flag(:remove_monitor_metrics)
push_frontend_feature_flag(:gitlab_duo, current_user)
+ push_frontend_feature_flag(:custom_emoji)
end
# Exposes the state of a feature flag to the frontend code.
diff --git a/lib/gitlab/gpg/commit.rb b/lib/gitlab/gpg/commit.rb
index a03aeb9c293..1fc95181767 100644
--- a/lib/gitlab/gpg/commit.rb
+++ b/lib/gitlab/gpg/commit.rb
@@ -87,6 +87,7 @@ module Gitlab
end
def verification_status(gpg_key)
+ return :verified_system if verified_by_gitlab?
return :multiple_signatures if multiple_signatures?
return :unknown_key unless gpg_key
return :unverified_key unless gpg_key.verified?
@@ -101,6 +102,15 @@ module Gitlab
end
end
+ # If a commit is signed by Gitaly, the Gitaly returns `SIGNER_SYSTEM` as a signer
+ # In order to calculate it, the signature is Verified using the Gitaly's public key:
+ # https://gitlab.com/gitlab-org/gitaly/-/blob/v16.2.0-rc2/internal/gitaly/service/commit/commit_signatures.go#L63
+ #
+ # It is safe to skip verification step if the commit has been signed by Gitaly
+ def verified_by_gitlab?
+ signer == :SIGNER_SYSTEM
+ end
+
def user_infos(gpg_key)
gpg_key&.verified_user_infos&.first || gpg_key&.user_infos&.first || {}
end
diff --git a/lib/gitlab/grape_logging/loggers/response_logger.rb b/lib/gitlab/grape_logging/loggers/response_logger.rb
index 767c282d62e..b87566a62b0 100644
--- a/lib/gitlab/grape_logging/loggers/response_logger.rb
+++ b/lib/gitlab/grape_logging/loggers/response_logger.rb
@@ -5,8 +5,6 @@ module Gitlab
module Loggers
class ResponseLogger < ::GrapeLogging::Loggers::Base
def parameters(_, response)
- return {} unless Feature.enabled?(:log_response_length)
-
response_bytes = 0
case response
diff --git a/lib/gitlab/graphql/generic_tracing.rb b/lib/gitlab/graphql/generic_tracing.rb
deleted file mode 100644
index dc3f6574631..00000000000
--- a/lib/gitlab/graphql/generic_tracing.rb
+++ /dev/null
@@ -1,71 +0,0 @@
-# frozen_string_literal: true
-
-# This class is used as a hook to observe graphql runtime events. From this
-# hook both gitlab metrics and opentracking measurements are generated
-
-module Gitlab
- module Graphql
- class GenericTracing < GraphQL::Tracing::PlatformTracing
- self.platform_keys = {
- 'lex' => 'graphql.lex',
- 'parse' => 'graphql.parse',
- 'validate' => 'graphql.validate',
- 'analyze_query' => 'graphql.analyze',
- 'analyze_multiplex' => 'graphql.analyze',
- 'execute_multiplex' => 'graphql.execute',
- 'execute_query' => 'graphql.execute',
- 'execute_query_lazy' => 'graphql.execute',
- 'execute_field' => 'graphql.execute',
- 'execute_field_lazy' => 'graphql.execute'
- }
-
- def platform_field_key(type, field)
- "#{type.name}.#{field.name}"
- end
-
- def platform_authorized_key(type)
- "#{type.graphql_name}.authorized"
- end
-
- def platform_resolve_type_key(type)
- "#{type.graphql_name}.resolve_type"
- end
-
- def platform_trace(platform_key, key, data, &block)
- tags = { platform_key: platform_key, key: key }
- start = Gitlab::Metrics::System.monotonic_time
-
- with_labkit_tracing(tags, &block)
- ensure
- duration = Gitlab::Metrics::System.monotonic_time - start
-
- graphql_duration_seconds.observe(tags, duration) unless deactivated?
- end
-
- private
-
- def deactivated?
- Feature.enabled?(:graphql_generic_tracing_metrics_deactivate)
- end
-
- def with_labkit_tracing(tags, &block)
- return yield unless Labkit::Tracing.enabled?
-
- name = "#{tags[:platform_key]}.#{tags[:key]}"
- span_tags = {
- 'component' => 'web',
- 'span.kind' => 'server'
- }.merge(tags.stringify_keys)
-
- Labkit::Tracing.with_tracing(operation_name: name, tags: span_tags, &block)
- end
-
- def graphql_duration_seconds
- @graphql_duration_seconds ||= Gitlab::Metrics.histogram(
- :graphql_duration_seconds,
- 'GraphQL execution time'
- )
- end
- end
- end
-end
diff --git a/lib/gitlab/group_search_results.rb b/lib/gitlab/group_search_results.rb
index b112740c4ad..8ca88859b22 100644
--- a/lib/gitlab/group_search_results.rb
+++ b/lib/gitlab/group_search_results.rb
@@ -13,6 +13,7 @@ module Gitlab
# rubocop:disable CodeReuse/ActiveRecord
def users
groups = group.self_and_hierarchy_intersecting_with_user_groups(current_user)
+ groups = groups.allow_cross_joins_across_databases(url: "https://gitlab.com/gitlab-org/gitlab/-/issues/417455")
members = GroupMember.where(group: groups).non_invite
users = super
diff --git a/lib/gitlab/hook_data/emoji_builder.rb b/lib/gitlab/hook_data/emoji_builder.rb
new file mode 100644
index 00000000000..673eb516e43
--- /dev/null
+++ b/lib/gitlab/hook_data/emoji_builder.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module HookData
+ class EmojiBuilder < BaseBuilder
+ SAFE_HOOK_ATTRIBUTES = %i[
+ user_id
+ created_at
+ id
+ name
+ awardable_type
+ awardable_id
+ updated_at
+ ].freeze
+
+ alias_method :award_emoji, :object
+
+ def build
+ award_emoji
+ .attributes
+ .with_indifferent_access
+ .slice(*SAFE_HOOK_ATTRIBUTES)
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/i18n.rb b/lib/gitlab/i18n.rb
index 180ccf21264..fabc02af70a 100644
--- a/lib/gitlab/i18n.rb
+++ b/lib/gitlab/i18n.rb
@@ -44,30 +44,30 @@ module Gitlab
TRANSLATION_LEVELS = {
'bg' => 0,
'cs_CZ' => 0,
- 'da_DK' => 31,
- 'de' => 97,
+ 'da_DK' => 30,
+ 'de' => 99,
'en' => 100,
'eo' => 0,
- 'es' => 30,
+ 'es' => 29,
'fil_PH' => 0,
- 'fr' => 98,
+ 'fr' => 99,
'gl_ES' => 0,
'id_ID' => 0,
'it' => 1,
- 'ja' => 98,
- 'ko' => 18,
+ 'ja' => 99,
+ 'ko' => 17,
'nb_NO' => 22,
'nl_NL' => 0,
'pl_PL' => 3,
- 'pt_BR' => 56,
- 'ro_RO' => 82,
+ 'pt_BR' => 57,
+ 'ro_RO' => 80,
'ru' => 23,
'si_LK' => 10,
'tr_TR' => 9,
'uk' => 53,
'zh_CN' => 98,
'zh_HK' => 1,
- 'zh_TW' => 99
+ 'zh_TW' => 100
}.freeze
private_constant :TRANSLATION_LEVELS
diff --git a/lib/gitlab/import_export/group/import_export.yml b/lib/gitlab/import_export/group/import_export.yml
index c2a1a1f8575..7a91cfb340a 100644
--- a/lib/gitlab/import_export/group/import_export.yml
+++ b/lib/gitlab/import_export/group/import_export.yml
@@ -7,12 +7,10 @@ tree:
group:
- :milestones
- :badges
- - labels:
- - :priorities
+ - :labels
- boards:
- lists:
- - label:
- - :priorities
+ - :label
- :board
- members:
- :user
@@ -126,8 +124,7 @@ ee:
- boards:
- :board_assignee
- :milestone
- - labels:
- - :priorities
+ - :labels
- lists:
- milestone:
- events:
diff --git a/lib/gitlab/import_export/group/relation_factory.rb b/lib/gitlab/import_export/group/relation_factory.rb
index 1b8436c4ed9..664ef5358ef 100644
--- a/lib/gitlab/import_export/group/relation_factory.rb
+++ b/lib/gitlab/import_export/group/relation_factory.rb
@@ -6,7 +6,6 @@ module Gitlab
class RelationFactory < Base::RelationFactory
OVERRIDES = {
labels: :group_labels,
- priorities: :label_priorities,
label: :group_label,
parent: :epic,
iterations_cadences: 'Iterations::Cadence'
diff --git a/lib/gitlab/import_export/project/import_export.yml b/lib/gitlab/import_export/project/import_export.yml
index 410e918649b..5986c5de441 100644
--- a/lib/gitlab/import_export/project/import_export.yml
+++ b/lib/gitlab/import_export/project/import_export.yml
@@ -44,6 +44,7 @@ tree:
- :zoom_meetings
- :sentry_issue
- :award_emoji
+ - :work_item_type
- snippets:
- :award_emoji
- notes:
@@ -771,6 +772,8 @@ included_attributes:
- :source_commit
- :close_after_error_tracking_resolve
- :close_auto_resolve_prometheus_alert
+ work_item_type:
+ - :base_type
# Do not include the following attributes for the models specified.
excluded_attributes:
@@ -1101,6 +1104,15 @@ excluded_attributes:
- :roll_over
- :description
- :sequence
+ work_item_type:
+ - :id
+ - :cached_markdown_version
+ - :name
+ - :description
+ - :description_html
+ - :icon_name
+ - :namespace_id
+ - :updated_at
methods:
project:
diff --git a/lib/gitlab/import_export/project/object_builder.rb b/lib/gitlab/import_export/project/object_builder.rb
index ac28ae6bfe0..5534a0f2aa4 100644
--- a/lib/gitlab/import_export/project/object_builder.rb
+++ b/lib/gitlab/import_export/project/object_builder.rb
@@ -24,6 +24,7 @@ module Gitlab
return if group_relation_without_group?
return find_diff_commit_user if diff_commit_user?
return find_diff_commit if diff_commit?
+ return find_work_item_type if work_item_type?
super
end
@@ -142,6 +143,10 @@ module Gitlab
klass == MergeRequestDiffCommit
end
+ def work_item_type?
+ klass == ::WorkItems::Type
+ end
+
# If an existing group milestone used the IID
# claim the IID back and set the group milestone to use one available
# This is necessary to fix situations like the following:
@@ -166,6 +171,18 @@ module Gitlab
def group_level_object?
epic?
end
+
+ def find_work_item_type
+ base_type = @attributes['base_type']
+
+ find_with_cache([::WorkItems::Type, base_type]) do
+ if ::WorkItems::Type.base_types.key?(base_type)
+ ::WorkItems::Type.default_by_type(base_type)
+ else
+ ::WorkItems::Type.default_issue_type
+ end
+ end
+ end
end
end
end
diff --git a/lib/gitlab/import_export/project/relation_factory.rb b/lib/gitlab/import_export/project/relation_factory.rb
index 8c673acdd1a..7af65235492 100644
--- a/lib/gitlab/import_export/project/relation_factory.rb
+++ b/lib/gitlab/import_export/project/relation_factory.rb
@@ -16,6 +16,8 @@ module Gitlab
bridges: 'Ci::Bridge',
runners: 'Ci::Runner',
pipeline_metadata: 'Ci::PipelineMetadata',
+ external_pull_request: 'Ci::ExternalPullRequest',
+ external_pull_requests: 'Ci::ExternalPullRequest',
hooks: 'ProjectHook',
merge_access_levels: 'ProtectedBranch::MergeAccessLevel',
push_access_levels: 'ProtectedBranch::PushAccessLevel',
@@ -39,7 +41,8 @@ module Gitlab
metrics_setting: 'ProjectMetricsSetting',
commit_author: 'MergeRequest::DiffCommitUser',
committer: 'MergeRequest::DiffCommitUser',
- merge_request_diff_commits: 'MergeRequestDiffCommit' }.freeze
+ merge_request_diff_commits: 'MergeRequestDiffCommit',
+ work_item_type: 'WorkItems::Type' }.freeze
BUILD_MODELS = %i[Ci::Build Ci::Bridge commit_status generic_commit_status].freeze
@@ -61,11 +64,11 @@ module Gitlab
epic
ProjectCiCdSetting
container_expiration_policy
- external_pull_request
- external_pull_requests
+ Ci::ExternalPullRequest
DesignManagement::Design
MergeRequest::DiffCommitUser
MergeRequestDiffCommit
+ WorkItems::Type
].freeze
def create
@@ -90,7 +93,7 @@ module Gitlab
when :notes, :Note then setup_note
when :'Ci::Pipeline' then setup_pipeline
when *BUILD_MODELS then setup_build
- when :issues then setup_issue
+ when :issues then setup_work_item
when :'Ci::PipelineSchedule' then setup_pipeline_schedule
when :'ProtectedBranch::MergeAccessLevel' then setup_protected_branch_access_level
when :'ProtectedBranch::PushAccessLevel' then setup_protected_branch_access_level
@@ -166,8 +169,11 @@ module Gitlab
end
end
- def setup_issue
+ def setup_work_item
@relation_hash['relative_position'] = compute_relative_position
+
+ issue_type = @relation_hash.delete('issue_type')
+ @relation_hash['work_item_type'] ||= ::WorkItems::Type.default_by_type(issue_type) if issue_type
end
def setup_release
diff --git a/lib/gitlab/internal_events.rb b/lib/gitlab/internal_events.rb
index cde83068de1..92bf2a826ff 100644
--- a/lib/gitlab/internal_events.rb
+++ b/lib/gitlab/internal_events.rb
@@ -2,21 +2,38 @@
module Gitlab
module InternalEvents
+ UnknownEventError = Class.new(StandardError)
+ InvalidPropertyError = Class.new(StandardError)
+ InvalidMethodError = Class.new(StandardError)
+
class << self
include Gitlab::Tracking::Helpers
def track_event(event_name, **kwargs)
- user_id = kwargs.delete(:user_id)
- UsageDataCounters::HLLRedisCounter.track_event(event_name, values: user_id)
+ raise UnknownEventError, "Unknown event: #{event_name}" unless EventDefinitions.known_event?(event_name)
+
+ unique_property = EventDefinitions.unique_property(event_name)
+ unique_method = :id
+
+ unless kwargs.has_key?(unique_property)
+ raise InvalidPropertyError, "#{event_name} should be triggered with a named parameter '#{unique_property}'."
+ end
+
+ unless kwargs[unique_property].respond_to?(unique_method)
+ raise InvalidMethodError, "'#{unique_property}' should have a '#{unique_method}' method."
+ end
+
+ unique_value = kwargs[unique_property].public_send(unique_method) # rubocop:disable GitlabSecurity/PublicSend
- project_id = kwargs.delete(:project_id)
- namespace_id = kwargs.delete(:namespace_id)
+ UsageDataCounters::HLLRedisCounter.track_event(event_name, values: unique_value)
- namespace = Namespace.find(namespace_id) if namespace_id
+ user = kwargs[:user]
+ project = kwargs[:project]
+ namespace = kwargs[:namespace]
standard_context = Tracking::StandardContext.new(
- project_id: project_id,
- user_id: user_id,
+ project_id: project&.id,
+ user_id: user&.id,
namespace_id: namespace&.id,
plan_name: namespace&.actual_plan_name
).to_context
@@ -27,6 +44,9 @@ module Gitlab
).to_context
track_struct_event(event_name, contexts: [standard_context, service_ping_context])
+ rescue StandardError => e
+ Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e, event_name: event_name, kwargs: kwargs)
+ nil
end
private
diff --git a/lib/gitlab/internal_events/event_definitions.rb b/lib/gitlab/internal_events/event_definitions.rb
new file mode 100644
index 00000000000..e1c9faa12de
--- /dev/null
+++ b/lib/gitlab/internal_events/event_definitions.rb
@@ -0,0 +1,75 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module InternalEvents
+ module EventDefinitions
+ InvalidMetricConfiguration = Class.new(StandardError)
+
+ class << self
+ VALID_UNIQUE_VALUES = %w[user.id project.id namespace.id].freeze
+
+ def clear_events
+ @events = nil
+ end
+
+ def load_configurations
+ @events = load_metric_definitions
+ nil
+ end
+
+ def unique_property(event_name)
+ unique_value = events[event_name]&.to_s
+
+ raise(InvalidMetricConfiguration, "Unique property not defined for #{event_name}") unless unique_value
+
+ unless VALID_UNIQUE_VALUES.include?(unique_value)
+ raise(InvalidMetricConfiguration, "Invalid unique value '#{unique_value}' for #{event_name}")
+ end
+
+ unique_value.split('.').first.to_sym
+ end
+
+ def known_event?(event_name)
+ events.key?(event_name)
+ end
+
+ private
+
+ def events
+ load_configurations if @events.nil? || Gitlab::Usage::MetricDefinition.metric_definitions_changed?
+
+ @events
+ end
+
+ def load_metric_definitions
+ all_events = {}
+
+ Gitlab::Usage::MetricDefinition.all.each do |metric_definition|
+ next unless metric_definition.available?
+
+ process_events(all_events, metric_definition.events)
+ rescue StandardError => e
+ Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e)
+ end
+
+ all_events
+ end
+
+ def process_events(all_events, metric_events)
+ metric_events.each do |event_name, event_unique_attribute|
+ unless all_events[event_name]
+ all_events[event_name] = event_unique_attribute
+ next
+ end
+
+ next if event_unique_attribute.nil? || event_unique_attribute == all_events[event_name]
+
+ raise InvalidMetricConfiguration,
+ "The same event cannot have several unique properties defined. " \
+ "Event: #{event_name}, unique values: #{event_unique_attribute}, #{all_events[event_name]}"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/issues/rebalancing/state.rb b/lib/gitlab/issues/rebalancing/state.rb
index f1f6cc55a2b..12cc5f6e5dd 100644
--- a/lib/gitlab/issues/rebalancing/state.rb
+++ b/lib/gitlab/issues/rebalancing/state.rb
@@ -53,7 +53,7 @@ module Gitlab
end
def can_start_rebalance?
- rebalance_in_progress? || too_many_rebalances_running?
+ rebalance_in_progress? || concurrent_rebalance_within_limit?
end
def cache_issue_ids(issue_ids)
@@ -100,11 +100,11 @@ module Gitlab
def refresh_keys_expiration
with_redis do |redis|
Gitlab::Instrumentation::RedisClusterValidator.allow_cross_slot_commands do
- redis.multi do |multi|
- multi.expire(issue_ids_key, REDIS_EXPIRY_TIME)
- multi.expire(current_index_key, REDIS_EXPIRY_TIME)
- multi.expire(current_project_key, REDIS_EXPIRY_TIME)
- multi.expire(CONCURRENT_RUNNING_REBALANCES_KEY, REDIS_EXPIRY_TIME)
+ redis.pipelined do |pipeline|
+ pipeline.expire(issue_ids_key, REDIS_EXPIRY_TIME)
+ pipeline.expire(current_index_key, REDIS_EXPIRY_TIME)
+ pipeline.expire(current_project_key, REDIS_EXPIRY_TIME)
+ pipeline.expire(CONCURRENT_RUNNING_REBALANCES_KEY, REDIS_EXPIRY_TIME)
end
end
end
@@ -113,16 +113,20 @@ module Gitlab
def cleanup_cache
value = "#{rebalanced_container_type}/#{rebalanced_container_id}"
+ # The clean up is done sequentially to be compatible with Redis Cluster
+ # Do not use a pipeline as it fans-out in a Redis-Cluster setting and forego ordering guarantees
with_redis do |redis|
- Gitlab::Instrumentation::RedisClusterValidator.allow_cross_slot_commands do
- redis.multi do |multi|
- multi.del(issue_ids_key)
- multi.del(current_index_key)
- multi.del(current_project_key)
- multi.srem?(CONCURRENT_RUNNING_REBALANCES_KEY, value)
- multi.set(self.class.recently_finished_key(rebalanced_container_type, rebalanced_container_id), true, ex: 1.hour)
- end
- end
+ # srem followed by .del(issue_ids_key) to ensure that any subsequent redis errors would
+ # result in a no-op job retry since current_index_key still exists
+ redis.srem?(CONCURRENT_RUNNING_REBALANCES_KEY, value)
+ redis.del(issue_ids_key)
+
+ # delete current_index_key to ensure that subsequent redis errors would
+ # result in a fresh job retry
+ redis.del(current_index_key)
+
+ # setting recently_finished_key last after job details is cleaned up
+ redis.set(self.class.recently_finished_key(rebalanced_container_type, rebalanced_container_id), true, ex: 1.hour)
end
end
@@ -159,7 +163,7 @@ module Gitlab
attr_accessor :root_namespace, :projects, :rebalanced_container_type, :rebalanced_container_id
- def too_many_rebalances_running?
+ def concurrent_rebalance_within_limit?
concurrent_running_rebalances_count <= MAX_NUMBER_OF_CONCURRENT_REBALANCES
end
diff --git a/lib/gitlab/jwt_authenticatable.rb b/lib/gitlab/jwt_authenticatable.rb
index 7c36bbf3426..d7a341b3ba2 100644
--- a/lib/gitlab/jwt_authenticatable.rb
+++ b/lib/gitlab/jwt_authenticatable.rb
@@ -13,8 +13,8 @@ module Gitlab
module ClassMethods
include Gitlab::Utils::StrongMemoize
- def decode_jwt(encoded_message, jwt_secret = secret, issuer: nil, iat_after: nil)
- options = { algorithm: 'HS256' }
+ def decode_jwt(encoded_message, jwt_secret = secret, algorithm: 'HS256', issuer: nil, iat_after: nil)
+ options = { algorithm: algorithm }
options = options.merge(iss: issuer, verify_iss: true) if issuer.present?
options = options.merge(verify_iat: true) if iat_after.present?
diff --git a/lib/gitlab/kas/client.rb b/lib/gitlab/kas/client.rb
index 43546d04087..fe244bd88a0 100644
--- a/lib/gitlab/kas/client.rb
+++ b/lib/gitlab/kas/client.rb
@@ -31,7 +31,7 @@ module Gitlab
def list_agent_config_files(project:)
request = Gitlab::Agent::ConfigurationProject::Rpc::ListAgentConfigFilesRequest.new(
repository: repository(project),
- gitaly_address: gitaly_address(project)
+ gitaly_info: gitaly_info(project)
)
stub_for(:configuration_project)
@@ -42,9 +42,11 @@ module Gitlab
def send_git_push_event(project:)
request = Gitlab::Agent::Notifications::Rpc::GitPushEventRequest.new(
- project: Gitlab::Agent::Notifications::Rpc::Project.new(
- id: project.id,
- full_path: project.full_path
+ event: Gitlab::Agent::Event::GitPushEvent.new(
+ project: Gitlab::Agent::Event::Project.new(
+ id: project.id,
+ full_path: project.full_path
+ )
)
)
@@ -62,13 +64,15 @@ module Gitlab
def repository(project)
gitaly_repository = project.repository.gitaly_repository
- Gitlab::Agent::Modserver::Repository.new(gitaly_repository.to_h)
+ Gitlab::Agent::Entity::GitalyRepository.new(gitaly_repository.to_h)
end
- def gitaly_address(project)
+ def gitaly_info(project)
+ gitaly_features = Feature::Gitaly.server_feature_flags
connection_data = Gitlab::GitalyClient.connection_data(project.repository_storage)
+ .merge(features: gitaly_features)
- Gitlab::Agent::Modserver::GitalyAddress.new(connection_data)
+ Gitlab::Agent::Entity::GitalyInfo.new(connection_data)
end
def kas_endpoint_url
diff --git a/lib/gitlab/kas/user_access.rb b/lib/gitlab/kas/user_access.rb
index 65ae399d826..587aa4803c6 100644
--- a/lib/gitlab/kas/user_access.rb
+++ b/lib/gitlab/kas/user_access.rb
@@ -9,11 +9,7 @@ module Gitlab
class UserAccess
class << self
def enabled?
- ::Gitlab::Kas.enabled? && ::Feature.enabled?(:kas_user_access)
- end
-
- def enabled_for?(agent)
- enabled? && ::Feature.enabled?(:kas_user_access_project, agent.project)
+ ::Gitlab::Kas.enabled?
end
def encrypt_public_session_id(data)
diff --git a/lib/gitlab/lograge/custom_options.rb b/lib/gitlab/lograge/custom_options.rb
index f8ec58cf217..9abad44b10e 100644
--- a/lib/gitlab/lograge/custom_options.rb
+++ b/lib/gitlab/lograge/custom_options.rb
@@ -36,10 +36,6 @@ module Gitlab
payload[:feature_flag_states] = Feature.logged_states.map { |key, state| "#{key}:#{state ? 1 : 0}" }
end
- if Feature.disabled?(:log_response_length)
- payload.delete(:response_bytes)
- end
-
payload
end
end
diff --git a/lib/gitlab/manifest_import/metadata.rb b/lib/gitlab/manifest_import/metadata.rb
index 3747431c6a7..81711be729e 100644
--- a/lib/gitlab/manifest_import/metadata.rb
+++ b/lib/gitlab/manifest_import/metadata.rb
@@ -4,6 +4,7 @@ module Gitlab
module ManifestImport
class Metadata
EXPIRY_TIME = 1.week
+ KEY_PREFIX = 'manifest_import:metadata:user'
attr_reader :user, :fallback
@@ -14,11 +15,9 @@ module Gitlab
def save(repositories, group_id)
Gitlab::Redis::SharedState.with do |redis|
- Gitlab::Instrumentation::RedisClusterValidator.allow_cross_slot_commands do
- redis.multi do |multi|
- multi.set(key_for('repositories'), Gitlab::Json.dump(repositories), ex: EXPIRY_TIME)
- multi.set(key_for('group_id'), group_id, ex: EXPIRY_TIME)
- end
+ redis.multi do |multi|
+ multi.set(hashtag_key_for('repositories'), Gitlab::Json.dump(repositories), ex: EXPIRY_TIME)
+ multi.set(hashtag_key_for('group_id'), group_id, ex: EXPIRY_TIME)
end
end
end
@@ -37,13 +36,17 @@ module Gitlab
private
+ def hashtag_key_for(field)
+ "#{KEY_PREFIX}:{#{user.id}}:#{field}"
+ end
+
def key_for(field)
- "manifest_import:metadata:user:#{user.id}:#{field}"
+ "#{KEY_PREFIX}:#{user.id}:#{field}"
end
def redis_get(field)
Gitlab::Redis::SharedState.with do |redis|
- redis.get(key_for(field))
+ redis.get(hashtag_key_for(field)) || redis.get(key_for(field))
end
end
end
diff --git a/lib/gitlab/markdown_cache/redis/store.rb b/lib/gitlab/markdown_cache/redis/store.rb
index f742cb82b8d..52260623c55 100644
--- a/lib/gitlab/markdown_cache/redis/store.rb
+++ b/lib/gitlab/markdown_cache/redis/store.rb
@@ -11,9 +11,11 @@ module Gitlab
Gitlab::Redis::Cache.with do |r|
Gitlab::Instrumentation::RedisClusterValidator.allow_cross_slot_commands do
- Gitlab::Redis::CrossSlot::Pipeline.new(r).pipelined do |pipeline|
- subjects.each do |subject|
- results[subject.cache_key] = new(subject).read(pipeline)
+ r.with_readonly_pipeline do
+ Gitlab::Redis::CrossSlot::Pipeline.new(r).pipelined do |pipeline|
+ subjects.each do |subject|
+ results[subject.cache_key] = new(subject).read(pipeline)
+ end
end
end
end
diff --git a/lib/gitlab/metrics/dashboard/stages/cluster_endpoint_inserter.rb b/lib/gitlab/metrics/dashboard/stages/cluster_endpoint_inserter.rb
index 31d75225972..56a82d1df46 100644
--- a/lib/gitlab/metrics/dashboard/stages/cluster_endpoint_inserter.rb
+++ b/lib/gitlab/metrics/dashboard/stages/cluster_endpoint_inserter.rb
@@ -7,59 +7,14 @@ module Gitlab
class ClusterEndpointInserter < BaseStage
def transform!
verify_params
-
- for_metrics do |metric|
- metric[:prometheus_endpoint_path] = endpoint_for_metric(metric)
- end
end
private
- def admin_url(metric)
- Gitlab::Routing.url_helpers.prometheus_api_admin_cluster_path(
- params[:cluster],
- proxy_path: query_type(metric),
- query: query_for_metric(metric)
- )
- end
-
- def endpoint_for_metric(metric)
- case params[:cluster_type]
- when :admin
- admin_url(metric)
- when :group
- error!(_('Group is required when cluster_type is :group')) unless params[:group]
- group_url(metric)
- when :project
- error!(_('Project is required when cluster_type is :project')) unless project
- project_url(metric)
- else
- error!(_('Unrecognized cluster type'))
- end
- end
-
def error!(message)
raise Errors::DashboardProcessingError, message
end
- def group_url(metric)
- Gitlab::Routing.url_helpers.prometheus_api_group_cluster_path(
- params[:group],
- params[:cluster],
- proxy_path: query_type(metric),
- query: query_for_metric(metric)
- )
- end
-
- def project_url(metric)
- Gitlab::Routing.url_helpers.prometheus_api_project_cluster_path(
- project,
- params[:cluster],
- proxy_path: query_type(metric),
- query: query_for_metric(metric)
- )
- end
-
def query_type(metric)
metric[:query] ? :query : :query_range
end
diff --git a/lib/gitlab/metrics/dashboard/stages/grafana_formatter.rb b/lib/gitlab/metrics/dashboard/stages/grafana_formatter.rb
index 622b6adec7e..03370ae7370 100644
--- a/lib/gitlab/metrics/dashboard/stages/grafana_formatter.rb
+++ b/lib/gitlab/metrics/dashboard/stages/grafana_formatter.rb
@@ -53,8 +53,7 @@ module Gitlab
{
id: "#{metric[:legendFormat]}_#{idx}",
query_range: format_query(metric),
- label: replace_variables(metric[:legendFormat]),
- prometheus_endpoint_path: prometheus_endpoint_for_metric(metric)
+ label: replace_variables(metric[:legendFormat])
}.compact
end
@@ -89,17 +88,6 @@ module Gitlab
end
end
- # Endpoint which will return prometheus metric data
- # for the metric
- def prometheus_endpoint_for_metric(metric)
- Gitlab::Routing.url_helpers.project_grafana_api_path(
- project,
- datasource_id: datasource[:id],
- proxy_path: PROXY_PATH,
- query: format_query(metric)
- )
- end
-
# Reformats query for compatibility with prometheus api.
def format_query(metric)
expression = remove_new_lines(metric[:expr])
diff --git a/lib/gitlab/metrics/dashboard/url.rb b/lib/gitlab/metrics/dashboard/url.rb
index bdd28744137..e7b901861ef 100644
--- a/lib/gitlab/metrics/dashboard/url.rb
+++ b/lib/gitlab/metrics/dashboard/url.rb
@@ -12,26 +12,6 @@ module Gitlab
ANCHOR_PATTERN = '(?<anchor>\#[a-z0-9_-]+)?'
DASH_PATTERN = '(?:/-)'
- # Matches urls for a metrics dashboard.
- # This regex needs to match the old metrics URL, the new metrics URL,
- # and the dashboard URL (inline_metrics_redactor_filter.rb
- # uses this regex to match against the dashboard URL.)
- #
- # EX - Old URL: https://<host>/<namespace>/<project>/environments/<env_id>/metrics
- # OR
- # New URL: https://<host>/<namespace>/<project>/-/metrics?environment=<env_id>
- # OR
- # dashboard URL: https://<host>/<namespace>/<project>/environments/<env_id>/metrics_dashboard
- def metrics_regex
- strong_memoize(:metrics_regex) do
- regex_for_project_metrics(
- %r{
- ( #{environment_metrics_regex} ) | ( #{non_environment_metrics_regex} )
- }x
- )
- end
- end
-
# Matches dashboard urls for a Grafana embed.
#
# EX - https://<host>/<namespace>/<project>/grafana/metrics_dashboard
@@ -99,11 +79,6 @@ module Gitlab
.symbolize_keys
end
- # Builds a metrics dashboard url based on the passed in arguments
- def build_dashboard_url(...)
- Gitlab::Routing.url_helpers.metrics_dashboard_namespace_project_environment_url(...)
- end
-
private
def environment_metrics_regex
diff --git a/lib/gitlab/metrics/sidekiq_slis.rb b/lib/gitlab/metrics/sidekiq_slis.rb
index f28cf4ac967..748666f2200 100644
--- a/lib/gitlab/metrics/sidekiq_slis.rb
+++ b/lib/gitlab/metrics/sidekiq_slis.rb
@@ -8,16 +8,26 @@ module Gitlab
"low" => 300,
"throttled" => 300
}.freeze
+ QUEUEING_URGENCY_DURATIONS = {
+ "high" => 10,
+ "low" => 60,
+ "throttled" => Float::INFINITY # no queueing target duration for throttled urgency
+ }.freeze
# workers without urgency attribute have "low" urgency by default in
# WorkerAttributes.get_urgency, just mirroring it here
DEFAULT_EXECUTION_URGENCY_DURATION = EXECUTION_URGENCY_DURATIONS["low"]
+ DEFAULT_QUEUEING_URGENCY_DURATION = QUEUEING_URGENCY_DURATIONS["low"]
class << self
- def initialize_slis!(possible_labels)
+ def initialize_execution_slis!(possible_labels)
Gitlab::Metrics::Sli::Apdex.initialize_sli(:sidekiq_execution, possible_labels)
Gitlab::Metrics::Sli::ErrorRate.initialize_sli(:sidekiq_execution, possible_labels)
end
+ def initialize_queueing_slis!(possible_labels)
+ Gitlab::Metrics::Sli::Apdex.initialize_sli(:sidekiq_queueing, possible_labels)
+ end
+
def record_execution_apdex(labels, job_completion_duration)
urgency_requirement = execution_duration_for_urgency(labels[:urgency])
Gitlab::Metrics::Sli::Apdex[:sidekiq_execution].increment(
@@ -30,9 +40,21 @@ module Gitlab
Gitlab::Metrics::Sli::ErrorRate[:sidekiq_execution].increment(labels: labels, error: error)
end
+ def record_queueing_apdex(labels, queue_duration)
+ urgency_requirement = queueing_duration_for_urgency(labels[:urgency])
+ Gitlab::Metrics::Sli::Apdex[:sidekiq_queueing].increment(
+ labels: labels,
+ success: queue_duration < urgency_requirement
+ )
+ end
+
def execution_duration_for_urgency(urgency)
EXECUTION_URGENCY_DURATIONS.fetch(urgency, DEFAULT_EXECUTION_URGENCY_DURATION)
end
+
+ def queueing_duration_for_urgency(urgency)
+ QUEUEING_URGENCY_DURATIONS.fetch(urgency, DEFAULT_QUEUEING_URGENCY_DURATION)
+ end
end
end
end
diff --git a/lib/gitlab/nav/top_nav_menu_item.rb b/lib/gitlab/nav/top_nav_menu_item.rb
index a83cdbe15df..e7790fd77d0 100644
--- a/lib/gitlab/nav/top_nav_menu_item.rb
+++ b/lib/gitlab/nav/top_nav_menu_item.rb
@@ -21,7 +21,7 @@ module Gitlab
href: href,
view: view.to_s,
css_class: css_class,
- data: data || { qa_selector: 'menu_item_link', qa_title: title },
+ data: data || { testid: 'menu_item_link', qa_title: title },
partial: partial,
component: component
}
diff --git a/lib/gitlab/observability.rb b/lib/gitlab/observability.rb
index f7f65c91339..b500df86363 100644
--- a/lib/gitlab/observability.rb
+++ b/lib/gitlab/observability.rb
@@ -23,7 +23,22 @@ module Gitlab
'https://observe.gitlab.com'
end
- # Returns true if the Observability feature flag is enabled
+ def oauth_url
+ "#{Gitlab::Observability.observability_url}/v1/auth/start"
+ end
+
+ def tracing_url(project)
+ "#{Gitlab::Observability.observability_url}/query/#{project.group.id}/#{project.id}/v1/traces"
+ end
+
+ def provisioning_url(_project)
+ # TODO Change to correct endpoint when API is ready
+ Gitlab::Observability.observability_url.to_s
+ end
+
+ # Returns true if the GitLab Observability UI (GOUI) feature flag is enabled
+ #
+ # @deprecated
#
def enabled?(group = nil)
return Feature.enabled?(:observability_group_tab, group) if group
@@ -31,6 +46,11 @@ module Gitlab
Feature.enabled?(:observability_group_tab)
end
+ # Returns true if Tracing UI is enabled
+ def tracing_enabled?(project)
+ Feature.enabled?(:observability_tracing, project)
+ end
+
# Returns the embeddable Observability URL of a given URL
#
# - Validates the URL
diff --git a/lib/gitlab/pages/url_builder.rb b/lib/gitlab/pages/url_builder.rb
new file mode 100644
index 00000000000..215154b7248
--- /dev/null
+++ b/lib/gitlab/pages/url_builder.rb
@@ -0,0 +1,94 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Pages
+ class UrlBuilder
+ attr_reader :project_namespace
+
+ ALLOWED_ARTIFACT_EXTENSIONS = %w[.html .htm .txt .json .xml .log].freeze
+ ARTIFACT_URL = "%{host}/-/%{project_path}/-/jobs/%{job_id}/artifacts/%{artifact_path}"
+
+ def initialize(project)
+ @project = project
+ @project_namespace, _, @project_path = project.full_path.partition('/')
+ end
+
+ def pages_url(with_unique_domain: false)
+ return unique_url if with_unique_domain && unique_domain_enabled?
+
+ project_path_url = "#{config.protocol}://#{project_path}".downcase
+
+ # If the project path is the same as host, we serve it as group page
+ # On development we ignore the URL port to make it work on GDK
+ return namespace_url if Rails.env.development? && portless(namespace_url) == project_path_url
+ # If the project path is the same as host, we serve it as group page
+ return namespace_url if namespace_url == project_path_url
+
+ "#{namespace_url}/#{project_path}"
+ end
+
+ def unique_host
+ return unless unique_domain_enabled?
+
+ URI(unique_url).host
+ end
+
+ def namespace_pages?
+ namespace_url == pages_url
+ end
+
+ def artifact_url(artifact, job)
+ return unless artifact_url_available?(artifact, job)
+
+ format(
+ ARTIFACT_URL,
+ host: namespace_url,
+ project_path: project_path,
+ job_id: job.id,
+ artifact_path: artifact.path)
+ end
+
+ def artifact_url_available?(artifact, job)
+ config.enabled &&
+ config.artifacts_server &&
+ ALLOWED_ARTIFACT_EXTENSIONS.include?(File.extname(artifact.name)) &&
+ (config.access_control || job.project.public?)
+ end
+
+ private
+
+ attr_reader :project, :project_path
+
+ def namespace_url
+ @namespace_url ||= url_for(project_namespace)
+ end
+
+ def unique_url
+ @unique_url ||= url_for(project.project_setting.pages_unique_domain)
+ end
+
+ def url_for(subdomain)
+ URI(config.url)
+ .tap { |url| url.port = config.port }
+ .tap { |url| url.host.prepend("#{subdomain}.") }
+ .to_s
+ .downcase
+ end
+
+ def portless(url)
+ URI(url)
+ .tap { |u| u.port = nil }
+ .to_s
+ end
+
+ def unique_domain_enabled?
+ Feature.enabled?(:pages_unique_domain, project) &&
+ project.project_setting.pages_unique_domain_enabled?
+ end
+
+ def config
+ Gitlab.config.pages
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder.rb b/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder.rb
index 8c0f082f61c..422839dcde1 100644
--- a/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder.rb
+++ b/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder.rb
@@ -67,7 +67,7 @@ module Gitlab
.select(finder_strategy.final_projections)
.where("count <> 0") # filter out the initializer row
- model.from(q.arel.as(table_name))
+ model.select(Arel.star).from(q.arel.as(table_name))
end
private
diff --git a/lib/gitlab/pagination/keyset/in_operator_optimization/strategies/record_loader_strategy.rb b/lib/gitlab/pagination/keyset/in_operator_optimization/strategies/record_loader_strategy.rb
index 4f79a3593f4..786ae282c88 100644
--- a/lib/gitlab/pagination/keyset/in_operator_optimization/strategies/record_loader_strategy.rb
+++ b/lib/gitlab/pagination/keyset/in_operator_optimization/strategies/record_loader_strategy.rb
@@ -14,6 +14,7 @@ module Gitlab
@finder_query = finder_query
@order_by_columns = order_by_columns
@table_name = model.table_name
+ @model = model
end
def initializer_columns
@@ -30,7 +31,11 @@ module Gitlab
end
def final_projections
- ["(#{RECORDS_COLUMN}).*"]
+ if @model.default_select_columns.is_a?(Array)
+ @model.default_select_columns.map { |column| "(#{RECORDS_COLUMN}).#{column.name}" }
+ else
+ ["(#{RECORDS_COLUMN}).*"]
+ end
end
private
diff --git a/lib/gitlab/pagination/keyset/order.rb b/lib/gitlab/pagination/keyset/order.rb
index 0d8e4ea6fee..a7faef2fdad 100644
--- a/lib/gitlab/pagination/keyset/order.rb
+++ b/lib/gitlab/pagination/keyset/order.rb
@@ -98,7 +98,7 @@ module Gitlab
hash[column_definition.attribute_name] = if field_value.is_a?(Time)
# use :inspect formatter to provide specific timezone info
# eg 2022-07-05 21:57:56.041499000 +0800
- field_value.to_s(:inspect)
+ field_value.to_fs(:inspect)
elsif field_value.nil?
nil
elsif lower_named_function?(column_definition)
@@ -246,7 +246,8 @@ module Gitlab
scopes = where_values.map do |where_value|
scope.dup.where(where_value).reorder(self) # rubocop: disable CodeReuse/ActiveRecord
end
- scope.model.from_union(scopes, remove_duplicates: false, remove_order: false)
+
+ scope.model.select(scope.select_values).from_union(scopes, remove_duplicates: false, remove_order: false)
end
def to_sql_literal(column_definitions)
diff --git a/lib/gitlab/patch/action_cable_redis_listener.rb b/lib/gitlab/patch/action_cable_redis_listener.rb
deleted file mode 100644
index b21bee45991..00000000000
--- a/lib/gitlab/patch/action_cable_redis_listener.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-# frozen_string_literal: true
-
-# Modifies https://github.com/rails/rails/blob/v6.1.4.6/actioncable/lib/action_cable/subscription_adapter/redis.rb
-# so that it is resilient to Redis connection errors.
-# See https://github.com/rails/rails/issues/27659.
-
-# rubocop:disable Gitlab/ModuleWithInstanceVariables
-module Gitlab
- module Patch
- module ActionCableRedisListener
- private
-
- def ensure_listener_running
- @thread ||= Thread.new do
- Thread.current.abort_on_exception = true
-
- conn = @adapter.redis_connection_for_subscriptions
- listen conn
- rescue ::Redis::BaseConnectionError
- @thread = @raw_client = nil
- ::ActionCable.server.restart
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/patch/redis_cache_store.rb b/lib/gitlab/patch/redis_cache_store.rb
index 5279c4081b2..041cb2d44bd 100644
--- a/lib/gitlab/patch/redis_cache_store.rb
+++ b/lib/gitlab/patch/redis_cache_store.rb
@@ -43,7 +43,13 @@ module Gitlab
keys = names.map { |name| normalize_key(name, options) }
values = failsafe(:patched_read_multi_mget, returning: {}) do
- redis.with { |c| pipeline_mget(c, keys) }
+ redis.with do |c|
+ if c.is_a?(Gitlab::Redis::MultiStore)
+ c.with_readonly_pipeline { pipeline_mget(c, keys) }
+ else
+ pipeline_mget(c, keys)
+ end
+ end
end
names.zip(values).each_with_object({}) do |(name, value), results|
diff --git a/lib/gitlab/push_options.rb b/lib/gitlab/push_options.rb
index 28d195238ea..8a604c7d8a6 100644
--- a/lib/gitlab/push_options.rb
+++ b/lib/gitlab/push_options.rb
@@ -21,6 +21,9 @@ module Gitlab
},
ci: {
keys: [:skip, :variable]
+ },
+ integrations: {
+ keys: [:skip_ci]
}
}).freeze
diff --git a/lib/gitlab/quick_actions/dsl.rb b/lib/gitlab/quick_actions/dsl.rb
index dfbc00ef847..1a61b33fd9e 100644
--- a/lib/gitlab/quick_actions/dsl.rb
+++ b/lib/gitlab/quick_actions/dsl.rb
@@ -61,7 +61,7 @@ module Gitlab
# Example:
#
# explanation do |arguments|
- # "Adds label(s) #{arguments.join(' ')}"
+ # "Adds labels #{arguments.join(' ')}"
# end
# command :command_key do |arguments|
# # Awesome code block
@@ -76,7 +76,7 @@ module Gitlab
# Example:
#
# execution_message do |arguments|
- # "Added label(s) #{arguments.join(' ')}"
+ # "Added labels #{arguments.join(' ')}"
# end
# command :command_key do |arguments|
# # Awesome code block
diff --git a/lib/gitlab/quick_actions/issuable_actions.rb b/lib/gitlab/quick_actions/issuable_actions.rb
index 96e3112f32f..57ed6c5c35e 100644
--- a/lib/gitlab/quick_actions/issuable_actions.rb
+++ b/lib/gitlab/quick_actions/issuable_actions.rb
@@ -69,7 +69,7 @@ module Gitlab
@updates[:title] = title_param
end
- desc { _('Add label(s)') }
+ desc { _('Add labels') }
explanation do |labels_param|
labels = find_label_references(labels_param)
@@ -88,7 +88,7 @@ module Gitlab
run_label_command(labels: find_labels(labels_param), command: :label, updates_key: :add_label_ids)
end
- desc { _('Remove all or specific label(s)') }
+ desc { _('Remove all or specific labels') }
explanation do |labels_param = nil|
label_references = labels_param.present? ? find_label_references(labels_param) : []
if label_references.any?
@@ -125,7 +125,7 @@ module Gitlab
@execution_message[:unlabel] = remove_label_message(label_references)
end
- desc { _('Replace all label(s)') }
+ desc { _('Replace all labels') }
explanation do |labels_param|
labels = find_label_references(labels_param)
"Replaces all labels with #{labels.join(' ')} #{'label'.pluralize(labels.count)}." if labels.any?
diff --git a/lib/gitlab/quick_actions/issue_actions.rb b/lib/gitlab/quick_actions/issue_actions.rb
index d7e9e1a980b..ae79db723f2 100644
--- a/lib/gitlab/quick_actions/issue_actions.rb
+++ b/lib/gitlab/quick_actions/issue_actions.rb
@@ -259,7 +259,6 @@ module Gitlab
current_user.can?(:"set_#{quick_action_target.issue_type}_metadata", quick_action_target)
end
command :promote_to_incident do
- @updates[:issue_type] = :incident
@updates[:work_item_type] = ::WorkItems::Type.default_by_type(:incident)
end
diff --git a/lib/gitlab/quick_actions/issue_and_merge_request_actions.rb b/lib/gitlab/quick_actions/issue_and_merge_request_actions.rb
index e549ee2e43a..e01be4e0604 100644
--- a/lib/gitlab/quick_actions/issue_and_merge_request_actions.rb
+++ b/lib/gitlab/quick_actions/issue_and_merge_request_actions.rb
@@ -44,7 +44,7 @@ module Gitlab
desc do
if quick_action_target.allows_multiple_assignees?
- _('Remove all or specific assignee(s)')
+ _('Remove all or specific assignees')
else
_('Remove assignee')
end
diff --git a/lib/gitlab/quick_actions/merge_request_actions.rb b/lib/gitlab/quick_actions/merge_request_actions.rb
index c374593bf01..9798b0eca2c 100644
--- a/lib/gitlab/quick_actions/merge_request_actions.rb
+++ b/lib/gitlab/quick_actions/merge_request_actions.rb
@@ -202,7 +202,7 @@ module Gitlab
desc do
if quick_action_target.allows_multiple_reviewers?
- _('Assign reviewer(s)')
+ _('Assign reviewers')
else
_('Assign reviewer')
end
@@ -244,7 +244,7 @@ module Gitlab
desc do
if quick_action_target.allows_multiple_reviewers?
- _('Remove all or specific reviewer(s)')
+ _('Remove all or specific reviewers')
else
_('Remove reviewer')
end
diff --git a/lib/gitlab/quick_actions/work_item_actions.rb b/lib/gitlab/quick_actions/work_item_actions.rb
index 5664410f3ca..a5c3c6a56be 100644
--- a/lib/gitlab/quick_actions/work_item_actions.rb
+++ b/lib/gitlab/quick_actions/work_item_actions.rb
@@ -98,7 +98,7 @@ module Gitlab
def success_msg
{
type: _('Type changed successfully.'),
- promote_to: _("Work Item promoted successfully.")
+ promote_to: _("Work item promoted successfully.")
}
end
end
diff --git a/lib/gitlab/redis/multi_store.rb b/lib/gitlab/redis/multi_store.rb
index d36ef6b99ee..7f4d611a490 100644
--- a/lib/gitlab/redis/multi_store.rb
+++ b/lib/gitlab/redis/multi_store.rb
@@ -6,15 +6,15 @@ module Gitlab
include Gitlab::Utils::StrongMemoize
class PipelinedDiffError < StandardError
- def initialize(result_primary, result_secondary)
- @result_primary = result_primary
- @result_secondary = result_secondary
+ def initialize(non_default_store_result, default_store_result)
+ @non_default_store_result = non_default_store_result
+ @default_store_result = default_store_result
end
def message
"Pipelined command executed on both stores successfully but results differ between them. " \
- "Result from the primary: #{@result_primary.inspect}. " \
- "Result from the secondary: #{@result_secondary.inspect}."
+ "Result from the non-default store: #{@non_default_store_result.inspect}. " \
+ "Result from the default store: #{@default_store_result.inspect}."
end
end
@@ -24,11 +24,17 @@ module Gitlab
end
end
+ class NestedReadonlyPipelineError < StandardError
+ def message
+ 'Nested use of with_readonly_pipeline is detected.'
+ end
+ end
+
attr_reader :primary_store, :secondary_store, :instance_name
FAILED_TO_READ_ERROR_MESSAGE = 'Failed to read from the redis default_store.'
- FAILED_TO_WRITE_ERROR_MESSAGE = 'Failed to write to the redis primary_store.'
- FAILED_TO_RUN_PIPELINE = 'Failed to execute pipeline on the redis primary_store.'
+ FAILED_TO_WRITE_ERROR_MESSAGE = 'Failed to write to the redis non_default_store.'
+ FAILED_TO_RUN_PIPELINE = 'Failed to execute pipeline on the redis non_default_store.'
SKIP_LOG_METHOD_MISSING_FOR_COMMANDS = %i[info].freeze
@@ -100,6 +106,25 @@ module Gitlab
validate_stores!
end
+ # Pipelines are sent to both instances by default since
+ # they could execute both read and write commands.
+ #
+ # But for pipelines that only consists of read commands, this method
+ # can be used to scope the pipeline and send it only to the default store.
+ def with_readonly_pipeline
+ raise NestedReadonlyPipelineError if readonly_pipeline?
+
+ Thread.current[:readonly_pipeline] = true
+
+ yield
+ ensure
+ Thread.current[:readonly_pipeline] = false
+ end
+
+ def readonly_pipeline?
+ Thread.current[:readonly_pipeline].present?
+ end
+
# rubocop:disable GitlabSecurity/PublicSend
READ_COMMANDS.each do |name|
define_method(name) do |*args, **kwargs, &block|
@@ -123,7 +148,7 @@ module Gitlab
PIPELINED_COMMANDS.each do |name|
define_method(name) do |*args, **kwargs, &block|
- if use_primary_and_secondary_stores?
+ if use_primary_and_secondary_stores? && !readonly_pipeline?
pipelined_both(name, *args, **kwargs, &block)
else
send_command(default_store, name, *args, **kwargs, &block)
@@ -192,7 +217,7 @@ module Gitlab
use_primary_store_as_default? ? primary_store : secondary_store
end
- def fallback_store
+ def non_default_store
use_primary_store_as_default? ? secondary_store : primary_store
end
@@ -252,36 +277,39 @@ module Gitlab
end
def write_both(command_name, *args, **kwargs, &block)
+ result = send_command(default_store, command_name, *args, **kwargs, &block)
+
+ # write to the non-default store only if write on default store is successful
begin
- send_command(primary_store, command_name, *args, **kwargs, &block)
+ send_command(non_default_store, command_name, *args, **kwargs, &block)
rescue StandardError => e
log_error(e, command_name,
multi_store_error_message: FAILED_TO_WRITE_ERROR_MESSAGE)
end
- send_command(secondary_store, command_name, *args, **kwargs, &block)
+ result
end
# Run the entire pipeline on both stores. We assume that `&block` is idempotent.
def pipelined_both(command_name, *args, **kwargs, &block)
+ result_default = send_command(default_store, command_name, *args, **kwargs, &block)
+
begin
- result_primary = send_command(primary_store, command_name, *args, **kwargs, &block)
+ result_non_default = send_command(non_default_store, command_name, *args, **kwargs, &block)
rescue StandardError => e
log_error(e, command_name, multi_store_error_message: FAILED_TO_RUN_PIPELINE)
end
- result_secondary = send_command(secondary_store, command_name, *args, **kwargs, &block)
-
# Pipelined commands return an array with all results. If they differ, log an error
- if result_primary && result_primary != result_secondary
- error = PipelinedDiffError.new(result_primary, result_secondary)
+ if result_non_default && result_non_default != result_default
+ error = PipelinedDiffError.new(result_non_default, result_default)
error.set_backtrace(Thread.current.backtrace[1..]) # Manually set backtrace, since the error is not `raise`d
log_error(error, command_name)
increment_pipelined_command_error_count(command_name)
end
- result_secondary
+ result_default
end
def same_redis_store?
diff --git a/lib/gitlab/regex.rb b/lib/gitlab/regex.rb
index 26ca9d2547c..4e666dbaf77 100644
--- a/lib/gitlab/regex.rb
+++ b/lib/gitlab/regex.rb
@@ -78,6 +78,10 @@ module Gitlab
@npm_package_name_regex ||= %r{\A(?:@(#{Gitlab::PathRegex::NAMESPACE_FORMAT_REGEX})/)?[-+\.\_a-zA-Z0-9]+\z}o
end
+ def npm_package_name_regex_message
+ 'should be a valid NPM package name: https://github.com/npm/validate-npm-package-name#naming-rules.'
+ end
+
def nuget_package_name_regex
@nuget_package_name_regex ||= %r{\A[-+\.\_a-zA-Z0-9]+\z}.freeze
end
@@ -177,6 +181,10 @@ module Gitlab
@semver_regex ||= Regexp.new("\\A#{::Gitlab::Regex.unbounded_semver_regex.source}\\z", ::Gitlab::Regex.unbounded_semver_regex.options).freeze
end
+ def semver_regex_message
+ 'should follow SemVer: https://semver.org'
+ end
+
# These partial semver regexes are intended for use in composing other
# regexes rather than being used alone.
def _semver_major_minor_patch_regex
diff --git a/lib/gitlab/search/found_blob.rb b/lib/gitlab/search/found_blob.rb
index 79d6cfc84a3..c9051b6a5ff 100644
--- a/lib/gitlab/search/found_blob.rb
+++ b/lib/gitlab/search/found_blob.rb
@@ -9,7 +9,7 @@ module Gitlab
include Gitlab::Utils::StrongMemoize
include BlobActiveModel
- attr_reader :project, :content_match, :blob_path, :highlight_line, :matched_lines_count
+ attr_reader :project, :content_match, :blob_path, :highlight_line, :matched_lines_count, :group_level_blob, :group
PATH_REGEXP = /\A(?<ref>[^:]*):(?<path>[^\x00]*)\x00/.freeze
CONTENT_REGEXP = /^(?<ref>[^:]*):(?<path>[^\x00]*)\x00(?<startline>\d+)\x00/.freeze
@@ -31,14 +31,17 @@ module Gitlab
@binary_data = opts.fetch(:data, nil)
@per_page = opts.fetch(:per_page, 20)
@project = opts.fetch(:project, nil)
+ @group = opts.fetch(:group, nil)
# Some callers (e.g. Elasticsearch) do not have the Project object,
# yet they can trigger many calls in one go,
# causing duplicated queries.
# Allow those to just pass project_id instead.
@project_id = opts.fetch(:project_id, nil)
+ @group_id = opts.fetch(:group_id, nil)
@content_match = opts.fetch(:content_match, nil)
@blob_path = opts.fetch(:blob_path, nil)
@repository = opts.fetch(:repository, nil)
+ @group_level_blob = opts.fetch(:group_level_blob, false)
end
def id
diff --git a/lib/gitlab/search/found_wiki_page.rb b/lib/gitlab/search/found_wiki_page.rb
index 99ca6a79fe2..650bae2af4d 100644
--- a/lib/gitlab/search/found_wiki_page.rb
+++ b/lib/gitlab/search/found_wiki_page.rb
@@ -14,7 +14,8 @@ module Gitlab
# @param found_blob [Gitlab::Search::FoundBlob]
def initialize(found_blob)
super
- @wiki = found_blob.project.wiki
+
+ @wiki ||= found_blob.project.wiki
end
def to_ability_name
@@ -23,3 +24,5 @@ module Gitlab
end
end
end
+
+Gitlab::Search::FoundWikiPage.prepend_mod_with('Gitlab::Search::FoundWikiPage')
diff --git a/lib/gitlab/search_results.rb b/lib/gitlab/search_results.rb
index a733dca6a56..4fedc450f9b 100644
--- a/lib/gitlab/search_results.rb
+++ b/lib/gitlab/search_results.rb
@@ -107,11 +107,7 @@ module Gitlab
def users
return User.none unless Ability.allowed?(current_user, :read_users_list)
- if Feature.enabled?(:autocomplete_users_use_search_service)
- UsersFinder.new(current_user, { search: query, use_minimum_char_limit: false }).execute
- else
- UsersFinder.new(current_user, search: query).execute
- end
+ UsersFinder.new(current_user, { search: query, use_minimum_char_limit: false }).execute
end
# highlighting is only performed by Elasticsearch backed results
diff --git a/lib/gitlab/seeder.rb b/lib/gitlab/seeder.rb
index ec514adafc8..d5d9b794cd9 100644
--- a/lib/gitlab/seeder.rb
+++ b/lib/gitlab/seeder.rb
@@ -126,12 +126,12 @@ module Gitlab
end
def self.without_statement_timeout
- Gitlab::Database::EachDatabase.each_database_connection do |connection|
+ Gitlab::Database::EachDatabase.each_connection do |connection|
connection.execute('SET statement_timeout=0')
end
yield
ensure
- Gitlab::Database::EachDatabase.each_database_connection do |connection|
+ Gitlab::Database::EachDatabase.each_connection do |connection|
connection.execute('RESET statement_timeout')
end
end
diff --git a/lib/gitlab/seeders/ci/runner/runner_fleet_pipeline_seeder.rb b/lib/gitlab/seeders/ci/runner/runner_fleet_pipeline_seeder.rb
index c77db02061c..2cd9afc5bdc 100644
--- a/lib/gitlab/seeders/ci/runner/runner_fleet_pipeline_seeder.rb
+++ b/lib/gitlab/seeders/ci/runner/runner_fleet_pipeline_seeder.rb
@@ -169,7 +169,10 @@ module Gitlab
}
logger.info(message: 'Creating build', **build_attrs)
- ::Ci::Build.new(importing: true, **build_attrs).tap(&:save!)
+ ::Ci::Build.transaction do
+ build = ::Ci::Build.new(importing: true, **build_attrs).tap(&:save!)
+ ::Ci::RunningBuild.upsert_shared_runner_build!(build) if build.running? && build.shared_runner_build?
+ end
end
def random_pipeline_status
diff --git a/lib/gitlab/sidekiq_logging/structured_logger.rb b/lib/gitlab/sidekiq_logging/structured_logger.rb
index c4566a6dc2a..56762c0fb4b 100644
--- a/lib/gitlab/sidekiq_logging/structured_logger.rb
+++ b/lib/gitlab/sidekiq_logging/structured_logger.rb
@@ -78,6 +78,8 @@ module Gitlab
job_status = if job_exception
'fail'
+ elsif job['dropped']
+ 'dropped'
elsif job['deferred']
'deferred'
else
@@ -87,12 +89,19 @@ module Gitlab
payload['message'] = "#{message}: #{job_status}: #{payload['duration_s']} sec"
payload['job_status'] = job_status
payload['job_deferred_by'] = job['deferred_by'] if job['deferred']
+ payload['deferred_count'] = job['deferred_count'] if job['deferred']
Gitlab::ExceptionLogFormatter.format!(job_exception, payload) if job_exception
db_duration = ActiveRecord::LogSubscriber.runtime
payload['db_duration_s'] = Gitlab::Utils.ms_to_round_sec(db_duration)
+ job_urgency = payload['class'].safe_constantize&.get_urgency.to_s
+ unless job_urgency.empty?
+ payload['urgency'] = job_urgency
+ payload['target_duration_s'] = Gitlab::Metrics::SidekiqSlis.execution_duration_for_urgency(job_urgency)
+ end
+
payload
end
diff --git a/lib/gitlab/sidekiq_middleware.rb b/lib/gitlab/sidekiq_middleware.rb
index ec2a6472809..614cd11421e 100644
--- a/lib/gitlab/sidekiq_middleware.rb
+++ b/lib/gitlab/sidekiq_middleware.rb
@@ -7,7 +7,7 @@ module Gitlab
# The result of this method should be passed to
# Sidekiq's `config.server_middleware` method
# eg: `config.server_middleware(&Gitlab::SidekiqMiddleware.server_configurator)`
- def self.server_configurator(metrics: true, arguments_logger: true, defer_jobs: true)
+ def self.server_configurator(metrics: true, arguments_logger: true, skip_jobs: true)
lambda do |chain|
# Size limiter should be placed at the top
chain.add ::Gitlab::SidekiqMiddleware::SizeLimiter::Server
@@ -40,7 +40,7 @@ module Gitlab
# so we can compare the latest WAL location against replica
chain.add ::Gitlab::SidekiqMiddleware::DuplicateJobs::Server
chain.add ::Gitlab::Database::LoadBalancing::SidekiqServerMiddleware
- chain.add ::Gitlab::SidekiqMiddleware::DeferJobs if defer_jobs
+ chain.add ::Gitlab::SidekiqMiddleware::SkipJobs if skip_jobs
end
end
diff --git a/lib/gitlab/sidekiq_middleware/defer_jobs.rb b/lib/gitlab/sidekiq_middleware/defer_jobs.rb
deleted file mode 100644
index 0a12667865c..00000000000
--- a/lib/gitlab/sidekiq_middleware/defer_jobs.rb
+++ /dev/null
@@ -1,78 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module SidekiqMiddleware
- class DeferJobs
- DELAY = ENV.fetch("SIDEKIQ_DEFER_JOBS_DELAY", 5.minutes)
- FEATURE_FLAG_PREFIX = "defer_sidekiq_jobs"
-
- DatabaseHealthStatusChecker = Struct.new(:id, :job_class_name)
-
- # There are 2 scenarios under which this middleware defers a job
- # 1. defer_sidekiq_jobs_#{worker_name} FF, jobs are deferred indefinitely until this feature flag
- # is turned off or when Feature.enabled? returns false by chance while using `percentage of time` value.
- # 2. Gitlab::Database::HealthStatus, on evaluating the db health status if it returns any indicator
- # with stop signal, the jobs will be delayed by 'x' seconds (set in worker).
- def call(worker, job, _queue)
- # ActiveJobs have wrapped class stored in 'wrapped' key
- resolved_class = job['wrapped']&.safe_constantize || worker.class
- defer_job, delay, deferred_by = defer_job_info(resolved_class, job)
-
- if !!defer_job
- # Referred in job_logger's 'log_job_done' method to compute proper 'job_status'
- job['deferred'] = true
- job['deferred_by'] = deferred_by
-
- worker.class.perform_in(delay, *job['args'])
- counter.increment({ worker: worker.class.name })
-
- # This breaks the middleware chain and return
- return
- end
-
- yield
- end
-
- private
-
- def defer_job_info(worker_class, job)
- if defer_job_by_ff?(worker_class)
- [true, DELAY, :feature_flag]
- elsif defer_job_by_database_health_signal?(job, worker_class)
- [true, worker_class.database_health_check_attrs[:delay_by], :database_health_check]
- end
- end
-
- def defer_job_by_ff?(worker_class)
- Feature.enabled?(
- :"#{FEATURE_FLAG_PREFIX}_#{worker_class.name}",
- type: :worker,
- default_enabled_if_undefined: false
- )
- end
-
- def defer_job_by_database_health_signal?(job, worker_class)
- unless worker_class.respond_to?(:defer_on_database_health_signal?) &&
- worker_class.defer_on_database_health_signal?
- return false
- end
-
- health_check_attrs = worker_class.database_health_check_attrs
- job_base_model = Gitlab::Database.schemas_to_base_models[health_check_attrs[:gitlab_schema]].first
-
- health_context = Gitlab::Database::HealthStatus::Context.new(
- DatabaseHealthStatusChecker.new(job['jid'], worker_class.name),
- job_base_model.connection,
- health_check_attrs[:gitlab_schema],
- health_check_attrs[:tables]
- )
-
- Gitlab::Database::HealthStatus.evaluate(health_context).any?(&:stop?)
- end
-
- def counter
- @counter ||= Gitlab::Metrics.counter(:sidekiq_jobs_deferred_total, 'The number of jobs deferred')
- end
- end
- end
-end
diff --git a/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb b/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb
index 3ed9c1743ed..46939d70c9e 100644
--- a/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb
+++ b/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb
@@ -97,13 +97,13 @@ module Gitlab
local connection = ARGV[i]
local current_offset = cookie.offsets[connection]
local new_offset = tonumber(ARGV[i+1])
- if not current_offset or current_offset < new_offset then
+ if not current_offset or (new_offset and current_offset < new_offset) then
cookie.offsets[connection] = new_offset
cookie.wal_locations[connection] = ARGV[i+2]
end
end
- redis.call("set", KEYS[1], cmsgpack.pack(cookie), "ex", redis.call("ttl", KEYS[1]))
+ redis.call("set", KEYS[1], cmsgpack.pack(cookie), "keepttl")
LUA
def latest_wal_locations
@@ -147,10 +147,7 @@ module Gitlab
end
local cookie = cmsgpack.unpack(cookie_msgpack)
cookie.deduplicated = "1"
- local ttl = redis.call("ttl", KEYS[1])
- if ttl > 0 then
- redis.call("set", KEYS[1], cmsgpack.pack(cookie), "ex", ttl)
- end
+ redis.call("set", KEYS[1], cmsgpack.pack(cookie), "keepttl")
LUA
def should_reschedule?
diff --git a/lib/gitlab/sidekiq_middleware/server_metrics.rb b/lib/gitlab/sidekiq_middleware/server_metrics.rb
index b3c3c94a0a3..058c23178f8 100644
--- a/lib/gitlab/sidekiq_middleware/server_metrics.rb
+++ b/lib/gitlab/sidekiq_middleware/server_metrics.rb
@@ -18,7 +18,7 @@ module Gitlab
SIDEKIQ_QUEUE_DURATION_BUCKETS = [10, 60].freeze
# These labels from Gitlab::SidekiqMiddleware::MetricsHelper are included in SLI metrics
- SIDEKIQ_SLI_LABELS = [:worker, :feature_category, :urgency].freeze
+ SIDEKIQ_SLI_LABELS = [:worker, :feature_category, :urgency, :external_dependencies].freeze
class << self
include ::Gitlab::SidekiqMiddleware::MetricsHelper
@@ -64,7 +64,8 @@ module Gitlab
end
end
- Gitlab::Metrics::SidekiqSlis.initialize_slis!(possible_sli_labels) if ::Feature.enabled?(:sidekiq_execution_application_slis)
+ Gitlab::Metrics::SidekiqSlis.initialize_execution_slis!(possible_sli_labels) if ::Feature.enabled?(:sidekiq_execution_application_slis)
+ Gitlab::Metrics::SidekiqSlis.initialize_queueing_slis!(possible_sli_labels) if ::Feature.enabled?(:sidekiq_queueing_application_slis)
end
end
@@ -147,6 +148,11 @@ module Gitlab
Gitlab::Metrics::SidekiqSlis.record_execution_apdex(sli_labels, monotonic_time) if job_succeeded
Gitlab::Metrics::SidekiqSlis.record_execution_error(sli_labels, !job_succeeded)
end
+
+ if ::Feature.enabled?(:sidekiq_queueing_application_slis)
+ sli_labels = labels.slice(*SIDEKIQ_SLI_LABELS)
+ Gitlab::Metrics::SidekiqSlis.record_queueing_apdex(sli_labels, queue_duration) if queue_duration
+ end
end
end
diff --git a/lib/gitlab/sidekiq_middleware/size_limiter/validator.rb b/lib/gitlab/sidekiq_middleware/size_limiter/validator.rb
index acc3e1712ab..b19cc994d32 100644
--- a/lib/gitlab/sidekiq_middleware/size_limiter/validator.rb
+++ b/lib/gitlab/sidekiq_middleware/size_limiter/validator.rb
@@ -33,7 +33,8 @@ module Gitlab
EXEMPT_WORKER_NAMES = %w[BackgroundMigrationWorker
BackgroundMigration::CiDatabaseWorker
Database::BatchedBackgroundMigrationWorker
- Database::BatchedBackgroundMigration::CiDatabaseWorker].to_set
+ Database::BatchedBackgroundMigration::CiDatabaseWorker
+ RedisMigrationWorker].to_set
JOB_STATUS_KEY = 'size_limiter'
diff --git a/lib/gitlab/sidekiq_middleware/skip_jobs.rb b/lib/gitlab/sidekiq_middleware/skip_jobs.rb
new file mode 100644
index 00000000000..8932607df52
--- /dev/null
+++ b/lib/gitlab/sidekiq_middleware/skip_jobs.rb
@@ -0,0 +1,125 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module SidekiqMiddleware
+ class SkipJobs
+ DELAY = ENV.fetch("SIDEKIQ_DEFER_JOBS_DELAY", 5.minutes)
+ RUN_FEATURE_FLAG_PREFIX = "run_sidekiq_jobs"
+ DROP_FEATURE_FLAG_PREFIX = "drop_sidekiq_jobs"
+
+ DatabaseHealthStatusChecker = Struct.new(:id, :job_class_name)
+
+ COUNTER = :sidekiq_jobs_skipped_total
+
+ def initialize
+ @metrics = init_metrics
+ end
+
+ # This middleware decides whether a job is dropped, deferred or runs normally.
+ # In short:
+ # - `drop_sidekiq_jobs_#{worker_name}` FF enabled (disabled by default) --> drops the job
+ # - `run_sidekiq_jobs_#{worker_name}` FF disabled (enabled by default) --> defers the job
+ #
+ # DROPPING JOBS
+ # A job is dropped when `drop_sidekiq_jobs_#{worker_name}` FF is enabled. This FF is disabled by default for
+ # all workers. Dropped jobs are completely ignored and not requeued for future processing.
+ #
+ # DEFERRING JOBS
+ # Deferred jobs are rescheduled to perform in the future.
+ # There are 2 scenarios under which this middleware defers a job:
+ # 1. When run_sidekiq_jobs_#{worker_name} FF is disabled. This FF is enabled by default
+ # for all workers.
+ # 2. Gitlab::Database::HealthStatus, on evaluating the db health status if it returns any indicator
+ # with stop signal, the jobs will be delayed by 'x' seconds (set in worker).
+ #
+ # Dropping jobs takes higher priority over deferring jobs. For example, when `drop_sidekiq_jobs` is enabled and
+ # `run_sidekiq_jobs` is disabled, it results to jobs being dropped.
+ def call(worker, job, _queue)
+ # ActiveJobs have wrapped class stored in 'wrapped' key
+ resolved_class = job['wrapped']&.safe_constantize || worker.class
+ if drop_job?(resolved_class)
+ # no-op, drop the job entirely
+ drop_job!(job, worker)
+ return
+ elsif !!defer_job?(resolved_class, job)
+ defer_job!(job, worker)
+ return
+ end
+
+ yield
+ end
+
+ private
+
+ def defer_job?(worker_class, job)
+ if !run_job_by_ff?(worker_class)
+ @delay = DELAY
+ @deferred_by = :feature_flag
+ true
+ elsif defer_job_by_database_health_signal?(job, worker_class)
+ @delay = worker_class.database_health_check_attrs[:delay_by]
+ @deferred_by = :database_health_check
+ true
+ end
+ end
+
+ def run_job_by_ff?(worker_class)
+ # always returns true by default for all workers unless the FF is specifically disabled, e.g. during an incident
+ Feature.enabled?(
+ :"#{RUN_FEATURE_FLAG_PREFIX}_#{worker_class.name}",
+ type: :worker,
+ default_enabled_if_undefined: true
+ )
+ end
+
+ def defer_job_by_database_health_signal?(job, worker_class)
+ unless worker_class.respond_to?(:defer_on_database_health_signal?) &&
+ worker_class.defer_on_database_health_signal?
+ return false
+ end
+
+ health_check_attrs = worker_class.database_health_check_attrs
+ job_base_model = Gitlab::Database.schemas_to_base_models[health_check_attrs[:gitlab_schema]].first
+
+ health_context = Gitlab::Database::HealthStatus::Context.new(
+ DatabaseHealthStatusChecker.new(job['jid'], worker_class.name),
+ job_base_model.connection,
+ health_check_attrs[:gitlab_schema],
+ health_check_attrs[:tables]
+ )
+
+ Gitlab::Database::HealthStatus.evaluate(health_context).any?(&:stop?)
+ end
+
+ def drop_job?(worker_class)
+ Feature.enabled?(
+ :"#{DROP_FEATURE_FLAG_PREFIX}_#{worker_class.name}",
+ type: :worker,
+ default_enabled_if_undefined: false
+ )
+ end
+
+ def drop_job!(job, worker)
+ job['dropped'] = true
+ @metrics.fetch(COUNTER).increment({ worker: worker.class.name, action: "dropped" })
+ end
+
+ def defer_job!(job, worker)
+ # Referred in job_logger's 'log_job_done' method to compute proper 'job_status'
+ job['deferred'] = true
+ job['deferred_by'] = @deferred_by
+ job['deferred_count'] ||= 0
+ job['deferred_count'] += 1
+
+ worker.class.perform_in(@delay, *job['args'])
+ @metrics.fetch(COUNTER).increment({ worker: worker.class.name, action: "deferred" })
+ end
+
+ def init_metrics
+ {
+ COUNTER => Gitlab::Metrics.counter(COUNTER, 'The number of skipped jobs')
+ }
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/signed_commit.rb b/lib/gitlab/signed_commit.rb
index 410e71f51a1..be6592dd231 100644
--- a/lib/gitlab/signed_commit.rb
+++ b/lib/gitlab/signed_commit.rb
@@ -34,13 +34,19 @@ module Gitlab
def signature_text
strong_memoize(:signature_text) do
- @signature_data.itself ? @signature_data[0] : nil
+ @signature_data.itself ? @signature_data[:signature] : nil
end
end
def signed_text
strong_memoize(:signed_text) do
- @signature_data.itself ? @signature_data[1] : nil
+ @signature_data.itself ? @signature_data[:signed_text] : nil
+ end
+ end
+
+ def signer
+ strong_memoize(:signer) do
+ @signature_data.itself ? @signature_data[:signer] : nil
end
end
diff --git a/lib/gitlab/slash_commands/presenters/access.rb b/lib/gitlab/slash_commands/presenters/access.rb
index c9c5c6da3bf..e098762f290 100644
--- a/lib/gitlab/slash_commands/presenters/access.rb
+++ b/lib/gitlab/slash_commands/presenters/access.rb
@@ -21,8 +21,8 @@ module Gitlab
def deactivated
ephemeral_response(text: <<~MESSAGE)
- You are not allowed to perform the given chatops command since
- your account has been deactivated by your administrator.
+ You are not allowed to perform the given ChatOps command. Most likely
+ your #{Gitlab.config.gitlab.url} account needs to be reactivated.
Please log back in from a web browser to reactivate your account at #{Gitlab.config.gitlab.url}
MESSAGE
diff --git a/lib/gitlab/spamcheck/client.rb b/lib/gitlab/spamcheck/client.rb
index 0afaf46fa9b..d13c3be0a09 100644
--- a/lib/gitlab/spamcheck/client.rb
+++ b/lib/gitlab/spamcheck/client.rb
@@ -58,7 +58,7 @@ module Gitlab
pb.title = spammable.spam_title || '' if pb.respond_to?(:title)
pb.description = spammable.spam_description || '' if pb.respond_to?(:description)
pb.text = spammable.spammable_text || '' if pb.respond_to?(:text)
- pb.type = spammable.spammable_entity_type if pb.respond_to?(:type)
+ pb.type = spammable.to_ability_name if pb.respond_to?(:type)
pb.created_at = convert_to_pb_timestamp(spammable.created_at) if spammable.created_at
pb.updated_at = convert_to_pb_timestamp(spammable.updated_at) if spammable.updated_at
pb.action = ACTION_MAPPING.fetch(context.fetch(:action)) if context.has_key?(:action)
diff --git a/lib/gitlab/ssh/commit.rb b/lib/gitlab/ssh/commit.rb
index d9ac8c1b881..7d7cc529b1a 100644
--- a/lib/gitlab/ssh/commit.rb
+++ b/lib/gitlab/ssh/commit.rb
@@ -10,7 +10,7 @@ module Gitlab
end
def attributes
- signature = ::Gitlab::Ssh::Signature.new(signature_text, signed_text, @commit.committer_email)
+ signature = ::Gitlab::Ssh::Signature.new(signature_text, signed_text, signer, @commit.committer_email)
{
commit_sha: @commit.sha,
diff --git a/lib/gitlab/ssh/signature.rb b/lib/gitlab/ssh/signature.rb
index 763d89116f1..6b0cab75557 100644
--- a/lib/gitlab/ssh/signature.rb
+++ b/lib/gitlab/ssh/signature.rb
@@ -11,15 +11,17 @@ module Gitlab
GIT_NAMESPACE = 'git'
- def initialize(signature_text, signed_text, committer_email)
+ def initialize(signature_text, signed_text, signer, committer_email)
@signature_text = signature_text
@signed_text = signed_text
+ @signer = signer
@committer_email = committer_email
end
def verification_status
strong_memoize(:verification_status) do
next :unverified unless all_attributes_present?
+ next :verified_system if verified_by_gitlab?
next :unverified unless valid_signature_blob?
next :unknown_key unless signed_by_key
next :other_user unless committer
@@ -81,6 +83,15 @@ module Gitlab
nil
end
end
+
+ # If a commit is signed by Gitaly, the Gitaly returns `SIGNER_SYSTEM` as a signer
+ # In order to calculate it, the signature is Verified using the Gitaly's public key:
+ # https://gitlab.com/gitlab-org/gitaly/-/blob/v16.2.0-rc2/internal/gitaly/service/commit/commit_signatures.go#L63
+ #
+ # It is safe to skip verification step if the commit has been signed by Gitaly
+ def verified_by_gitlab?
+ @signer == :SIGNER_SYSTEM
+ end
end
end
end
diff --git a/lib/gitlab/subscription_portal.rb b/lib/gitlab/subscription_portal.rb
index 1d9ecb624b2..bbcefabcb40 100644
--- a/lib/gitlab/subscription_portal.rb
+++ b/lib/gitlab/subscription_portal.rb
@@ -21,6 +21,14 @@ module Gitlab
def self.renewal_service_email
'renewals-service@customers.gitlab.com'
end
+
+ def self.default_staging_customer_portal_url
+ 'https://customers.staging.gitlab.com'
+ end
+
+ def self.default_production_customer_portal_url
+ 'https://customers.gitlab.com'
+ end
end
end
diff --git a/lib/gitlab/task_helpers.rb b/lib/gitlab/task_helpers.rb
index b9800a4db73..f756d229ba1 100644
--- a/lib/gitlab/task_helpers.rb
+++ b/lib/gitlab/task_helpers.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
require 'rainbow/ext/string'
-require_relative 'utils/strong_memoize'
+require 'gitlab/utils/all'
# rubocop:disable Rails/Output
module Gitlab
diff --git a/lib/gitlab/testing/action_cable_blocker.rb b/lib/gitlab/testing/action_cable_blocker.rb
new file mode 100644
index 00000000000..aebb0732035
--- /dev/null
+++ b/lib/gitlab/testing/action_cable_blocker.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+# rubocop:disable Style/ClassVars
+
+# This is inspired by http://www.salsify.com/blog/engineering/tearing-capybara-ajax-tests
+# Rack middleware that keeps track of the number of active requests and can block new requests.
+module Gitlab
+ module Testing
+ class ActionCableBlocker
+ @@num_active_requests = Concurrent::AtomicFixnum.new(0)
+ @@block_requests = Concurrent::AtomicBoolean.new(false)
+
+ # Returns the number of requests the server is currently processing.
+ def self.num_active_requests
+ @@num_active_requests.value
+ end
+
+ # Prevents the server from accepting new requests. Any new requests will be skipped.
+ def self.block_requests!
+ @@block_requests.value = true
+ end
+
+ # Allows the server to accept requests again.
+ def self.allow_requests!
+ @@block_requests.value = false
+ end
+
+ def self.install
+ ::ActionCable::Server::Worker.set_callback :work, :around do |_, inner|
+ @@num_active_requests.increment
+
+ inner.call if @@block_requests.false?
+ ensure
+ @@num_active_requests.decrement
+ end
+ end
+ end
+ end
+end
+# rubocop:enable Style/ClassVars
diff --git a/lib/gitlab/usage/metric_definition.rb b/lib/gitlab/usage/metric_definition.rb
index 065ede75c60..bd42586731e 100644
--- a/lib/gitlab/usage/metric_definition.rb
+++ b/lib/gitlab/usage/metric_definition.rb
@@ -22,6 +22,10 @@ module Gitlab
key_path
end
+ def events
+ events_from_new_structure || events_from_old_structure || {}
+ end
+
def to_h
attributes
end
@@ -44,7 +48,7 @@ module Gitlab
def validate!
unless skip_validation?
- self.class.schemer.validate(attributes.stringify_keys).each do |error|
+ self.class.schemer.validate(attributes.deep_stringify_keys).each do |error|
error_message = <<~ERROR_MSG
Error type: #{error['type']}
Data: #{error['data']}
@@ -102,6 +106,19 @@ module Gitlab
@metrics_yaml ||= definitions.values.map(&:to_h).map(&:deep_stringify_keys).to_yaml
end
+ def metric_definitions_changed?
+ return false unless Rails.env.development?
+
+ return false if @last_change_check && @last_change_check > 3.seconds.ago
+
+ @last_change_check = Time.current
+
+ last_change = Dir.glob(paths).map { |f| File.mtime(f) }.max
+ did_change = @last_metric_update != last_change
+ @last_metric_update = last_change
+ did_change
+ end
+
private
def load_all!
@@ -146,6 +163,20 @@ module Gitlab
def skip_validation?
!!attributes[:skip_validation] || @skip_validation || attributes[:status] == SKIP_VALIDATION_STATUS
end
+
+ def events_from_new_structure
+ events = attributes[:events]
+ return unless events
+
+ events.to_h { |event| [event[:name], event[:unique].to_sym] }
+ end
+
+ def events_from_old_structure
+ options_events = attributes.dig(:options, :events)
+ return unless options_events
+
+ options_events.index_with { nil }
+ end
end
end
end
diff --git a/lib/gitlab/usage/metrics/aggregates.rb b/lib/gitlab/usage/metrics/aggregates.rb
index 4b38809dde4..0edd9f7914a 100644
--- a/lib/gitlab/usage/metrics/aggregates.rb
+++ b/lib/gitlab/usage/metrics/aggregates.rb
@@ -15,10 +15,14 @@ module Gitlab
DATABASE_SOURCE = 'database'
REDIS_SOURCE = 'redis_hll'
+ INTERNAL_EVENTS_SOURCE = 'internal_events'
SOURCES = {
DATABASE_SOURCE => Sources::PostgresHll,
- REDIS_SOURCE => Sources::RedisHll
+ REDIS_SOURCE => Sources::RedisHll,
+ # Same strategy as RedisHLL, since they are a part of internal events
+ # and should get counted together with other RedisHLL-based aggregations
+ INTERNAL_EVENTS_SOURCE => Sources::RedisHll
}.freeze
end
end
diff --git a/lib/gitlab/usage/metrics/instrumentations/batched_background_migrations_metric.rb b/lib/gitlab/usage/metrics/instrumentations/batched_background_migrations_metric.rb
new file mode 100644
index 00000000000..f5529b96678
--- /dev/null
+++ b/lib/gitlab/usage/metrics/instrumentations/batched_background_migrations_metric.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Usage
+ module Metrics
+ module Instrumentations
+ class BatchedBackgroundMigrationsMetric < DatabaseMetric
+ relation { Gitlab::Database::BackgroundMigration::BatchedMigration.with_status(:finished) }
+
+ timestamp_column(:finished_at)
+
+ operation :count
+
+ def value
+ relation.map do |batched_migration|
+ {
+ job_class_name: batched_migration.job_class_name,
+ elapsed_time: batched_migration.finished_at.to_i - batched_migration.started_at.to_i
+ }
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/usage/metrics/instrumentations/count_projects_with_jira_dvcs_integration_metric.rb b/lib/gitlab/usage/metrics/instrumentations/count_projects_with_jira_dvcs_integration_metric.rb
new file mode 100644
index 00000000000..25a45a259e2
--- /dev/null
+++ b/lib/gitlab/usage/metrics/instrumentations/count_projects_with_jira_dvcs_integration_metric.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Usage
+ module Metrics
+ module Instrumentations
+ class CountProjectsWithJiraDvcsIntegrationMetric < DatabaseMetric
+ operation :count
+
+ def initialize(metric_definition)
+ super
+
+ raise ArgumentError, "option 'cloud' must be a boolean" unless [true, false].include?(options[:cloud])
+ end
+
+ relation do |options|
+ ProjectFeatureUsage.with_jira_dvcs_integration_enabled(cloud: options[:cloud])
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/usage/metrics/instrumentations/count_slack_app_installations_gbp_metric.rb b/lib/gitlab/usage/metrics/instrumentations/count_slack_app_installations_gbp_metric.rb
new file mode 100644
index 00000000000..0a796c9fae9
--- /dev/null
+++ b/lib/gitlab/usage/metrics/instrumentations/count_slack_app_installations_gbp_metric.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Usage
+ module Metrics
+ module Instrumentations
+ class CountSlackAppInstallationsGbpMetric < DatabaseMetric
+ operation :count
+
+ relation { SlackIntegration.with_bot }
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/usage/metrics/instrumentations/count_slack_app_installations_metric.rb b/lib/gitlab/usage/metrics/instrumentations/count_slack_app_installations_metric.rb
new file mode 100644
index 00000000000..af9cf957dab
--- /dev/null
+++ b/lib/gitlab/usage/metrics/instrumentations/count_slack_app_installations_metric.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Usage
+ module Metrics
+ module Instrumentations
+ class CountSlackAppInstallationsMetric < DatabaseMetric
+ operation :count
+
+ relation { SlackIntegration }
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/usage/metrics/instrumentations/generic_metric.rb b/lib/gitlab/usage/metrics/instrumentations/generic_metric.rb
index 7c646281598..d57dd7eac20 100644
--- a/lib/gitlab/usage/metrics/instrumentations/generic_metric.rb
+++ b/lib/gitlab/usage/metrics/instrumentations/generic_metric.rb
@@ -32,9 +32,9 @@ module Gitlab
super(metric_definition.reverse_merge(time_frame: 'none'))
end
- def value
+ def value(...)
alt_usage_data(fallback: self.class.fallback) do
- self.class.metric_value.call
+ self.class.metric_value.call(...)
end
end
diff --git a/lib/gitlab/usage/metrics/instrumentations/gitaly_apdex_metric.rb b/lib/gitlab/usage/metrics/instrumentations/gitaly_apdex_metric.rb
new file mode 100644
index 00000000000..ae1d076af19
--- /dev/null
+++ b/lib/gitlab/usage/metrics/instrumentations/gitaly_apdex_metric.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Usage
+ module Metrics
+ module Instrumentations
+ class GitalyApdexMetric < PrometheusMetric
+ value do |client|
+ result = client.query('avg_over_time(gitlab_usage_ping:gitaly_apdex:ratio_avg_over_time_5m[1w])').first
+
+ break FALLBACK unless result
+
+ result['value'].last.to_f
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/usage/metrics/instrumentations/index_inconsistencies_metric.rb b/lib/gitlab/usage/metrics/instrumentations/index_inconsistencies_metric.rb
index 409027925d1..2ce7e95ce77 100644
--- a/lib/gitlab/usage/metrics/instrumentations/index_inconsistencies_metric.rb
+++ b/lib/gitlab/usage/metrics/instrumentations/index_inconsistencies_metric.rb
@@ -6,7 +6,7 @@ module Gitlab
module Instrumentations
class IndexInconsistenciesMetric < GenericMetric
value do
- runner = Gitlab::Database::SchemaValidation::Runner.new(structure_sql, database, validators: validators)
+ runner = Gitlab::Schema::Validation::Runner.new(structure_sql, database, validators: validators)
inconsistencies = runner.execute
@@ -23,19 +23,19 @@ module Gitlab
def database
database_model = Gitlab::Database.database_base_models[Gitlab::Database::MAIN_DATABASE_NAME]
- Gitlab::Database::SchemaValidation::Database.new(database_model.connection)
+ Gitlab::Schema::Validation::Sources::Database.new(database_model.connection)
end
def structure_sql
stucture_sql_path = Rails.root.join('db/structure.sql')
- Gitlab::Database::SchemaValidation::StructureSql.new(stucture_sql_path)
+ Gitlab::Schema::Validation::Sources::StructureSql.new(stucture_sql_path)
end
def validators
[
- Gitlab::Database::SchemaValidation::Validators::MissingIndexes,
- Gitlab::Database::SchemaValidation::Validators::DifferentDefinitionIndexes,
- Gitlab::Database::SchemaValidation::Validators::ExtraIndexes
+ Gitlab::Schema::Validation::Validators::MissingIndexes,
+ Gitlab::Schema::Validation::Validators::DifferentDefinitionIndexes,
+ Gitlab::Schema::Validation::Validators::ExtraIndexes
]
end
end
diff --git a/lib/gitlab/usage/metrics/instrumentations/ldap_encrypted_secrets_metric.rb b/lib/gitlab/usage/metrics/instrumentations/ldap_encrypted_secrets_metric.rb
new file mode 100644
index 00000000000..7667cff06e0
--- /dev/null
+++ b/lib/gitlab/usage/metrics/instrumentations/ldap_encrypted_secrets_metric.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Usage
+ module Metrics
+ module Instrumentations
+ class LdapEncryptedSecretsMetric < GenericMetric
+ value do
+ Gitlab::Auth::Ldap::Config.encrypted_secrets.active?
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/usage/metrics/instrumentations/operating_system_metric.rb b/lib/gitlab/usage/metrics/instrumentations/operating_system_metric.rb
new file mode 100644
index 00000000000..9bfe12d8ead
--- /dev/null
+++ b/lib/gitlab/usage/metrics/instrumentations/operating_system_metric.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Usage
+ module Metrics
+ module Instrumentations
+ class OperatingSystemMetric < GenericMetric
+ value do
+ ohai_data = Ohai::System.new.tap do |oh|
+ oh.all_plugins(['platform'])
+ end.data
+
+ platform = ohai_data['platform']
+ if ohai_data['platform'] == 'debian' && ohai_data['kernel']['machine']&.include?('armv')
+ platform = 'raspbian'
+ end
+
+ "#{platform}-#{ohai_data['platform_version']}"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/usage/metrics/instrumentations/prometheus_metric.rb b/lib/gitlab/usage/metrics/instrumentations/prometheus_metric.rb
new file mode 100644
index 00000000000..ab1298b63c3
--- /dev/null
+++ b/lib/gitlab/usage/metrics/instrumentations/prometheus_metric.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Usage
+ module Metrics
+ module Instrumentations
+ class PrometheusMetric < GenericMetric
+ # Usage example
+ #
+ # class GitalyApdexMetric < PrometheusMetric
+ # value do
+ # result = client.query('avg_over_time(gitlab_usage_ping:gitaly_apdex:ratio_avg_over_time_5m[1w])').first
+ #
+ # break FALLBACK unless result
+ #
+ # result['value'].last.to_f
+ # end
+ # end
+ def value
+ with_prometheus_client(verify: false, fallback: FALLBACK) do |client|
+ super(client)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/usage/metrics/instrumentations/schema_inconsistencies_metric.rb b/lib/gitlab/usage/metrics/instrumentations/schema_inconsistencies_metric.rb
new file mode 100644
index 00000000000..a481f7a5682
--- /dev/null
+++ b/lib/gitlab/usage/metrics/instrumentations/schema_inconsistencies_metric.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Usage
+ module Metrics
+ module Instrumentations
+ class SchemaInconsistenciesMetric < GenericMetric
+ MAX_INCONSISTENCIES = 150 # Limit the number of inconsistencies reported to avoid large payloads
+
+ value do
+ runner = Gitlab::Schema::Validation::Runner.new(structure_sql, database, validators: validators)
+
+ inconsistencies = runner.execute
+
+ inconsistencies.take(MAX_INCONSISTENCIES).map do |inconsistency|
+ {
+ object_name: inconsistency.object_name,
+ inconsistency_type: inconsistency.type,
+ object_type: inconsistency.object_type
+ }
+ end
+ end
+
+ class << self
+ private
+
+ def validators
+ Gitlab::Schema::Validation::Validators::Base.all_validators
+ end
+
+ def database
+ database_model = Gitlab::Database.database_base_models[Gitlab::Database::MAIN_DATABASE_NAME]
+ Gitlab::Schema::Validation::Sources::Database.new(database_model.connection)
+ end
+
+ def structure_sql
+ stucture_sql_path = Rails.root.join('db/structure.sql')
+ Gitlab::Schema::Validation::Sources::StructureSql.new(stucture_sql_path)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/usage/metrics/instrumentations/smtp_encrypted_secrets_metric.rb b/lib/gitlab/usage/metrics/instrumentations/smtp_encrypted_secrets_metric.rb
new file mode 100644
index 00000000000..1e1925f9933
--- /dev/null
+++ b/lib/gitlab/usage/metrics/instrumentations/smtp_encrypted_secrets_metric.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Usage
+ module Metrics
+ module Instrumentations
+ class SmtpEncryptedSecretsMetric < GenericMetric
+ value do
+ Gitlab::Email::SmtpConfig.encrypted_secrets.active?
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/usage_data.rb b/lib/gitlab/usage_data.rb
index 72168bce782..ab041a31bde 100644
--- a/lib/gitlab/usage_data.rb
+++ b/lib/gitlab/usage_data.rb
@@ -152,22 +152,6 @@ module Gitlab
}
end
- def system_usage_data_settings
- {
- settings: {
- ldap_encrypted_secrets_enabled: alt_usage_data(fallback: nil) { Gitlab::Auth::Ldap::Config.encrypted_secrets.active? },
- smtp_encrypted_secrets_enabled: alt_usage_data(fallback: nil) { Gitlab::Email::SmtpConfig.encrypted_secrets.active? },
- operating_system: alt_usage_data(fallback: nil) { operating_system },
- gitaly_apdex: alt_usage_data { gitaly_apdex },
- collected_data_categories: add_metric('CollectedDataCategoriesMetric', time_frame: 'none'),
- service_ping_features_enabled: add_metric('ServicePingFeaturesMetric', time_frame: 'none'),
- snowplow_enabled: add_metric('SnowplowEnabledMetric', time_frame: 'none'),
- snowplow_configured_to_gitlab_collector: add_metric('SnowplowConfiguredToGitlabCollectorMetric', time_frame: 'none'),
- certificate_based_clusters_ff: add_metric('CertBasedClustersFfMetric')
- }
- }
- end
-
def system_usage_data_weekly
{
counts_weekly: {}
@@ -286,16 +270,9 @@ module Gitlab
response[:"instances_#{name}_active"] = count(Integration.active.where(instance: true, type: type))
response[:"projects_inheriting_#{name}_active"] = count(Integration.active.where.not(project: nil).where.not(inherit_from_id: nil).where(type: type))
response[:"groups_inheriting_#{name}_active"] = count(Integration.active.where.not(group: nil).where.not(inherit_from_id: nil).where(type: type))
- end.merge(jira_usage, jira_import_usage)
+ end.merge(jira_import_usage)
# rubocop: enable UsageData/LargeTable:
end
-
- def jira_usage
- {
- projects_jira_dvcs_cloud_active: count(ProjectFeatureUsage.with_jira_dvcs_integration_enabled),
- projects_jira_dvcs_server_active: count(ProjectFeatureUsage.with_jira_dvcs_integration_enabled(cloud: false))
- }
- end
# rubocop: enable CodeReuse/ActiveRecord
def jira_import_usage
@@ -328,17 +305,6 @@ module Gitlab
}
end
- def operating_system
- ohai_data = Ohai::System.new.tap do |oh|
- oh.all_plugins(['platform'])
- end.data
-
- platform = ohai_data['platform']
- platform = 'raspbian' if ohai_data['platform'] == 'debian' && ohai_data['kernel']['machine']&.include?('armv')
-
- "#{platform}-#{ohai_data['platform_version']}"
- end
-
# Source: https://gitlab.com/gitlab-data/analytics/blob/master/transform/snowflake-dbt/data/ping_metrics_to_stage_mapping_data.csv
def usage_activity_by_stage(key = :usage_activity_by_stage, time_period = {})
{
@@ -371,7 +337,11 @@ module Gitlab
group_clusters_disabled: clusters_user_distinct_count(::Clusters::Cluster.disabled.group_type, time_period),
group_clusters_enabled: clusters_user_distinct_count(::Clusters::Cluster.enabled.group_type, time_period),
project_clusters_disabled: clusters_user_distinct_count(::Clusters::Cluster.disabled.project_type, time_period),
- project_clusters_enabled: clusters_user_distinct_count(::Clusters::Cluster.enabled.project_type, time_period)
+ project_clusters_enabled: clusters_user_distinct_count(::Clusters::Cluster.enabled.project_type, time_period),
+ # These two `projects_slack_x` metrics are owned by the Manage stage, but are in this method as their key paths can't change.
+ # See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/123442#note_1427961339.
+ projects_slack_notifications_active: distinct_count(::Project.with_slack_integration.where(time_period), :creator_id),
+ projects_slack_slash_active: distinct_count(::Project.with_slack_slash_commands_integration.where(time_period), :creator_id)
}
end
# rubocop: enable UsageData/LargeTable
@@ -527,7 +497,6 @@ module Gitlab
def usage_data_metrics
system_usage_data_license
- .merge(system_usage_data_settings)
.merge(system_usage_data)
.merge(system_usage_data_monthly)
.merge(system_usage_data_weekly)
@@ -543,16 +512,6 @@ module Gitlab
time_period.present? ? '28d' : 'none'
end
- def gitaly_apdex
- with_prometheus_client(verify: false, fallback: FALLBACK) do |client|
- result = client.query('avg_over_time(gitlab_usage_ping:gitaly_apdex:ratio_avg_over_time_5m[1w])').first
-
- break FALLBACK unless result
-
- result['value'].last.to_f
- end
- end
-
def distinct_count_service_desk_enabled_projects(time_period)
project_creator_id_start = minimum_id(User)
project_creator_id_finish = maximum_id(User)
diff --git a/lib/gitlab/usage_data_counters/hll_redis_counter.rb b/lib/gitlab/usage_data_counters/hll_redis_counter.rb
index eaa4bf15fe1..e71061c4522 100644
--- a/lib/gitlab/usage_data_counters/hll_redis_counter.rb
+++ b/lib/gitlab/usage_data_counters/hll_redis_counter.rb
@@ -15,14 +15,7 @@ module Gitlab
# Track event on entity_id
# Increment a Redis HLL counter for unique event_name and entity_id
#
- # All events should be added to known_events yml files lib/gitlab/usage_data_counters/known_events/
- #
- # Event example:
- #
- # - name: g_compliance_dashboard # Unique event name
- #
# Usage:
- #
# * Track event: Gitlab::UsageDataCounters::HLLRedisCounter.track_event('g_compliance_dashboard', values: user_id)
# * Get unique counts per user: Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names: 'g_compliance_dashboard', start_date: 28.days.ago, end_date: Date.current)
class << self
@@ -119,8 +112,18 @@ module Gitlab
end
def load_events(wildcard)
- Dir[wildcard].each_with_object([]) do |path, events|
- events.push(*load_yaml_from_path(path))
+ if Feature.enabled?(:use_metric_definitions_for_events_list)
+ events = Gitlab::Usage::MetricDefinition.not_removed.values.map do |d|
+ d.attributes[:options] && d.attributes[:options][:events]
+ end.flatten.compact.uniq
+
+ events.map do |e|
+ { name: e }.with_indifferent_access
+ end
+ else
+ Dir[wildcard].each_with_object([]) do |path, events|
+ events.push(*load_yaml_from_path(path))
+ end
end
end
@@ -129,7 +132,7 @@ module Gitlab
end
def known_events_names
- known_events.map { |event| event[:name] }
+ @known_events_names ||= known_events.map { |event| event[:name] }
end
def event_for(event_name)
diff --git a/lib/gitlab/usage_data_counters/issue_activity_unique_counter.rb b/lib/gitlab/usage_data_counters/issue_activity_unique_counter.rb
index 31f090e0f51..54464b63fce 100644
--- a/lib/gitlab/usage_data_counters/issue_activity_unique_counter.rb
+++ b/lib/gitlab/usage_data_counters/issue_activity_unique_counter.rb
@@ -38,8 +38,7 @@ module Gitlab
class << self
def track_issue_created_action(author:, namespace:)
- track_snowplow_action(ISSUE_CREATED, author, namespace)
- track_unique_action(ISSUE_CREATED, author)
+ track_internal_action(ISSUE_CREATED, author, namespace)
end
def track_issue_title_changed_action(author:, project:)
@@ -180,14 +179,7 @@ module Gitlab
private
def track_snowplow_action(event_name, author, container)
- namespace, project = case container
- when Project
- [container.namespace, container]
- when Namespaces::ProjectNamespace
- [container.parent, container.project]
- else
- [container, nil]
- end
+ namespace, project = get_params_from_container(container)
return unless author
@@ -208,6 +200,30 @@ module Gitlab
Gitlab::UsageDataCounters::HLLRedisCounter.track_event(event_name, values: author.id)
end
+
+ def track_internal_action(event_name, author, container)
+ return unless author
+
+ namespace, project = get_params_from_container(container)
+
+ Gitlab::InternalEvents.track_event(
+ event_name,
+ user: author,
+ project: project,
+ namespace: namespace
+ )
+ end
+
+ def get_params_from_container(container)
+ case container
+ when Project
+ [container.namespace, container]
+ when Namespaces::ProjectNamespace
+ [container.parent, container.project]
+ else
+ [container, nil]
+ end
+ end
end
end
end
diff --git a/lib/gitlab/usage_data_counters/known_events/kubernetes_agent.yml b/lib/gitlab/usage_data_counters/known_events/kubernetes_agent.yml
index b3d1c51c0e7..fe779a9a25f 100644
--- a/lib/gitlab/usage_data_counters/known_events/kubernetes_agent.yml
+++ b/lib/gitlab/usage_data_counters/known_events/kubernetes_agent.yml
@@ -1,2 +1,22 @@
- name: agent_users_using_ci_tunnel
aggregation: weekly
+- name: k8s_api_proxy_requests_unique_users_via_ci_access
+ aggregation: weekly
+- name: k8s_api_proxy_requests_unique_users_via_ci_access
+ aggregation: monthly
+- name: k8s_api_proxy_requests_unique_agents_via_ci_access
+ aggregation: weekly
+- name: k8s_api_proxy_requests_unique_agents_via_ci_access
+ aggregation: monthly
+- name: k8s_api_proxy_requests_unique_users_via_user_access
+ aggregation: weekly
+- name: k8s_api_proxy_requests_unique_users_via_user_access
+ aggregation: monthly
+- name: k8s_api_proxy_requests_unique_agents_via_user_access
+ aggregation: weekly
+- name: k8s_api_proxy_requests_unique_agents_via_user_access
+ aggregation: monthly
+- name: flux_git_push_notified_unique_projects
+ aggregation: weekly
+- name: flux_git_push_notified_unique_projects
+ aggregation: monthly
diff --git a/lib/gitlab/usage_data_counters/kubernetes_agent_counter.rb b/lib/gitlab/usage_data_counters/kubernetes_agent_counter.rb
index ece2ffea83b..9e8c207a19a 100644
--- a/lib/gitlab/usage_data_counters/kubernetes_agent_counter.rb
+++ b/lib/gitlab/usage_data_counters/kubernetes_agent_counter.rb
@@ -4,7 +4,13 @@ module Gitlab
module UsageDataCounters
class KubernetesAgentCounter < BaseCounter
PREFIX = 'kubernetes_agent'
- KNOWN_EVENTS = %w[gitops_sync k8s_api_proxy_request flux_git_push_notifications_total].freeze
+ KNOWN_EVENTS = %w[
+ gitops_sync
+ k8s_api_proxy_request
+ flux_git_push_notifications_total
+ k8s_api_proxy_requests_via_ci_access
+ k8s_api_proxy_requests_via_user_access
+ ].freeze
class << self
def increment_event_counts(events)
diff --git a/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter.rb b/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter.rb
index 1ed2e891a1f..d26b7ce951d 100644
--- a/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter.rb
+++ b/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter.rb
@@ -70,9 +70,9 @@ module Gitlab
Gitlab::InternalEvents.track_event(
MR_USER_CREATE_ACTION,
- user_id: user.id,
- project_id: project.id,
- namespace_id: project.namespace_id
+ user: user,
+ project: project,
+ namespace: project.namespace
)
end
diff --git a/lib/gitlab/utils.rb b/lib/gitlab/utils.rb
deleted file mode 100644
index dc0112c14d6..00000000000
--- a/lib/gitlab/utils.rb
+++ /dev/null
@@ -1,259 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Utils
- extend self
- DoubleEncodingError ||= Class.new(StandardError)
-
- def allowlisted?(absolute_path, allowlist)
- path = absolute_path.downcase
-
- allowlist.map(&:downcase).any? do |allowed_path|
- path.start_with?(allowed_path)
- end
- end
-
- def decode_path(encoded_path)
- decoded = CGI.unescape(encoded_path)
- if decoded != CGI.unescape(decoded)
- raise DoubleEncodingError, "path #{encoded_path} is not allowed"
- end
-
- decoded
- end
-
- def force_utf8(str)
- str.dup.force_encoding(Encoding::UTF_8)
- end
-
- def ensure_utf8_size(str, bytes:)
- raise ArgumentError, 'Empty string provided!' if str.empty?
- raise ArgumentError, 'Negative string size provided!' if bytes < 0
-
- truncated = str.each_char.each_with_object(+'') do |char, object|
- if object.bytesize + char.bytesize > bytes
- break object
- else
- object.concat(char)
- end
- end
-
- truncated + ('0' * (bytes - truncated.bytesize))
- end
-
- # Append path to host, making sure there's one single / in between
- def append_path(host, path)
- "#{host.to_s.sub(%r{\/+$}, '')}/#{remove_leading_slashes(path)}"
- end
-
- def remove_leading_slashes(str)
- str.to_s.sub(%r{^/+}, '')
- end
-
- # A slugified version of the string, suitable for inclusion in URLs and
- # domain names. Rules:
- #
- # * Lowercased
- # * Anything not matching [a-z0-9-] is replaced with a -
- # * Maximum length is 63 bytes
- # * First/Last Character is not a hyphen
- def slugify(str)
- str.downcase
- .gsub(/[^a-z0-9]/, '-')[0..62]
- .gsub(/(\A-+|-+\z)/, '')
- end
-
- # Converts newlines into HTML line break elements
- def nlbr(str)
- ActionView::Base.full_sanitizer.sanitize(+str, tags: []).gsub(/\r?\n/, '<br>').html_safe
- end
-
- def remove_line_breaks(str)
- str.gsub(/\r?\n/, '')
- end
-
- def to_boolean(value, default: nil)
- value = value.to_s if [0, 1].include?(value)
-
- return value if [true, false].include?(value)
- return true if value =~ /^(true|t|yes|y|1|on)$/i
- return false if value =~ /^(false|f|no|n|0|off)$/i
-
- default
- end
-
- def boolean_to_yes_no(bool)
- if bool
- 'Yes'
- else
- 'No'
- end
- end
-
- # Behaves like `which` on Linux machines: given PATH, try to resolve the given
- # executable name to an absolute path, or return nil.
- #
- # which('ruby') #=> /usr/bin/ruby
- def which(filename)
- ENV['PATH']&.split(File::PATH_SEPARATOR)&.each do |path|
- full_path = File.join(path, filename)
- return full_path if File.executable?(full_path)
- end
-
- nil
- end
-
- def try_megabytes_to_bytes(size)
- Integer(size).megabytes
- rescue ArgumentError
- size
- end
-
- def bytes_to_megabytes(bytes)
- bytes.to_f / Numeric::MEGABYTE
- end
-
- def ms_to_round_sec(ms)
- (ms.to_f / 1000).round(6)
- end
-
- # Used in EE
- # Accepts either an Array or a String and returns an array
- def ensure_array_from_string(string_or_array)
- return string_or_array if string_or_array.is_a?(Array)
-
- string_or_array.split(',').map(&:strip)
- end
-
- def deep_indifferent_access(data)
- case data
- when Array
- data.map(&method(:deep_indifferent_access))
- when Hash
- data.with_indifferent_access
- else
- data
- end
- end
-
- def deep_symbolized_access(data)
- case data
- when Array
- data.map(&method(:deep_symbolized_access))
- when Hash
- data.deep_symbolize_keys
- else
- data
- end
- end
-
- def string_to_ip_object(str)
- return unless str
-
- IPAddr.new(str)
- rescue IPAddr::InvalidAddressError
- end
-
- # A safe alternative to String#downcase!
- #
- # This will make copies of frozen strings but downcase unfrozen
- # strings in place, reducing allocations.
- def safe_downcase!(str)
- if str.frozen?
- str.downcase
- else
- str.downcase! || str
- end
- end
-
- # Converts a string to an Addressable::URI object.
- # If the string is not a valid URI, it returns nil.
- # Param uri_string should be a String object.
- # This method returns an Addressable::URI object or nil.
- def parse_url(uri_string)
- Addressable::URI.parse(uri_string)
- rescue Addressable::URI::InvalidURIError, TypeError
- end
-
- def add_url_parameters(url, params)
- uri = parse_url(url.to_s)
- uri.query_values = uri.query_values.to_h.merge(params.to_h.stringify_keys)
- uri.query_values = nil if uri.query_values.empty?
- uri.to_s
- end
-
- def removes_sensitive_data_from_url(uri_string)
- uri = parse_url(uri_string)
-
- return unless uri
- return uri_string unless uri.fragment
-
- stripped_params = CGI.parse(uri.fragment)
- if stripped_params['access_token']
- stripped_params['access_token'] = 'filtered'
- filtered_query = Addressable::URI.new
- filtered_query.query_values = stripped_params
-
- uri.fragment = filtered_query.query
- end
-
- uri.to_s
- end
-
- # Invert a hash, collecting all keys that map to a given value in an array.
- #
- # Unlike `Hash#invert`, where the last encountered pair wins, and which has the
- # type `Hash[k, v] => Hash[v, k]`, `multiple_key_invert` does not lose any
- # information, has the type `Hash[k, v] => Hash[v, Array[k]]`, and the original
- # hash can always be reconstructed.
- #
- # example:
- #
- # multiple_key_invert({ a: 1, b: 2, c: 1 })
- # # => { 1 => [:a, :c], 2 => [:b] }
- #
- def multiple_key_invert(hash)
- hash.flat_map { |k, v| Array.wrap(v).zip([k].cycle) }
- .group_by(&:first)
- .transform_values { |kvs| kvs.map(&:last) }
- end
-
- # This sort is stable (see https://en.wikipedia.org/wiki/Sorting_algorithm#Stability)
- # contrary to the bare Ruby sort_by method. Using just sort_by leads to
- # instability across different platforms (e.g., x86_64-linux and x86_64-darwin18)
- # which in turn leads to different sorting results for the equal elements across
- # these platforms.
- # This method uses a list item's original index position to break ties.
- def stable_sort_by(list)
- list.sort_by.with_index { |x, idx| [yield(x), idx] }
- end
-
- # Check for valid brackets (`[` and `]`) in a string using this aspects:
- # * open brackets count == closed brackets count
- # * (optionally) reject nested brackets via `allow_nested: false`
- # * open / close brackets coherence, eg. ][[] -> invalid
- def valid_brackets?(string = '', allow_nested: true)
- # remove everything except brackets
- brackets = string.remove(/[^\[\]]/)
-
- return true if brackets.empty?
- # balanced counts check
- return false if brackets.size.odd?
-
- unless allow_nested
- # nested brackets check
- return false if brackets.include?('[[') || brackets.include?(']]')
- end
-
- # open / close brackets coherence check
- untrimmed = brackets
- loop do
- trimmed = untrimmed.gsub('[]', '')
- return true if trimmed.empty?
- return false if trimmed == untrimmed
-
- untrimmed = trimmed
- end
- end
- end
-end
diff --git a/lib/gitlab/utils/override.rb b/lib/gitlab/utils/override.rb
index 1d02bcbb2d2..10370811bb5 100644
--- a/lib/gitlab/utils/override.rb
+++ b/lib/gitlab/utils/override.rb
@@ -1,6 +1,6 @@
# frozen_string_literal: true
-require_relative '../utils'
+require 'gitlab/utils/all'
require_relative '../environment'
module Gitlab
diff --git a/lib/gitlab/utils/usage_data.rb b/lib/gitlab/utils/usage_data.rb
index 4106084b301..1e482901929 100644
--- a/lib/gitlab/utils/usage_data.rb
+++ b/lib/gitlab/utils/usage_data.rb
@@ -240,7 +240,7 @@ module Gitlab
yield.merge(key => Time.current)
end
- # @param event_name [String] the event name
+ # @param event_name [String, Symbol] the event name
# @param values [Array|String] the values counted
def track_usage_event(event_name, values)
Gitlab::UsageDataCounters::HLLRedisCounter.track_event(event_name.to_s, values: values)
diff --git a/lib/gitlab/uuid.rb b/lib/gitlab/uuid.rb
index 016c25eb94b..a3abe90a412 100644
--- a/lib/gitlab/uuid.rb
+++ b/lib/gitlab/uuid.rb
@@ -10,8 +10,6 @@ module Gitlab
}.freeze
UUID_V5_PATTERN = /\h{8}-\h{4}-5\h{3}-\h{4}-\h{12}/.freeze
- NAMESPACE_REGEX = /(\h{8})-(\h{4})-(\h{4})-(\h{4})-(\h{4})(\h{8})/.freeze
- PACK_PATTERN = "NnnnnN"
class << self
def v5(name, namespace_id: default_namespace_id)
@@ -25,12 +23,7 @@ module Gitlab
private
def default_namespace_id
- @default_namespace_id ||= begin
- namespace_uuid = NAMESPACE_IDS.fetch(Rails.env.to_sym)
- # Digest::UUID is broken when using a UUID as a namespace_id
- # https://github.com/rails/rails/issues/37681#issue-520718028
- namespace_uuid.scan(NAMESPACE_REGEX).flatten.map { |s| s.to_i(16) }.pack(PACK_PATTERN)
- end
+ NAMESPACE_IDS.fetch(Rails.env.to_sym)
end
end
end
diff --git a/lib/gitlab/version_info.rb b/lib/gitlab/version_info.rb
deleted file mode 100644
index 0351c9b30b3..00000000000
--- a/lib/gitlab/version_info.rb
+++ /dev/null
@@ -1,98 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- class VersionInfo
- include Comparable
-
- attr_reader :major, :minor, :patch
-
- VERSION_REGEX = /(\d+)\.(\d+)\.(\d+)/.freeze
- # To mitigate ReDoS, limit the length of the version string we're
- # willing to check
- MAX_VERSION_LENGTH = 128
-
- def self.parse(str, parse_suffix: false)
- if str.is_a?(self)
- str
- elsif str && str.length <= MAX_VERSION_LENGTH && m = str.match(VERSION_REGEX)
- VersionInfo.new(m[1].to_i, m[2].to_i, m[3].to_i, parse_suffix ? m.post_match : nil)
- else
- VersionInfo.new
- end
- end
-
- def initialize(major = 0, minor = 0, patch = 0, suffix = nil)
- @major = major
- @minor = minor
- @patch = patch
- @suffix_s = suffix.to_s
- end
-
- # rubocop:disable Metrics/CyclomaticComplexity
- # rubocop:disable Metrics/PerceivedComplexity
- def <=>(other)
- return unless other.is_a? VersionInfo
- return unless valid? && other.valid?
-
- if other.major < @major
- 1
- elsif @major < other.major
- -1
- elsif other.minor < @minor
- 1
- elsif @minor < other.minor
- -1
- elsif other.patch < @patch
- 1
- elsif @patch < other.patch
- -1
- elsif @suffix_s.empty? && other.suffix.present?
- 1
- elsif other.suffix.empty? && @suffix_s.present?
- -1
- else
- suffix <=> other.suffix
- end
- end
- # rubocop:enable Metrics/CyclomaticComplexity
- # rubocop:enable Metrics/PerceivedComplexity
-
- def to_s
- if valid?
- "%d.%d.%d%s" % [@major, @minor, @patch, @suffix_s]
- else
- 'Unknown'
- end
- end
-
- def to_json(*_args)
- { major: @major, minor: @minor, patch: @patch }.to_json
- end
-
- def suffix
- @suffix ||= @suffix_s.strip.gsub('-', '.pre.').scan(/\d+|[a-z]+/i).map do |s|
- /^\d+$/ =~ s ? s.to_i : s
- end.freeze
- end
-
- def valid?
- @major >= 0 && @minor >= 0 && @patch >= 0 && @major + @minor + @patch > 0
- end
-
- def hash
- [self.class, to_s].hash
- end
-
- def eql?(other)
- (self <=> other) == 0
- end
-
- def same_minor_version?(other)
- @major == other.major && @minor == other.minor
- end
-
- def without_patch
- self.class.new(@major, @minor, 0)
- end
- end
-end
diff --git a/lib/gitlab/web_hooks.rb b/lib/gitlab/web_hooks.rb
index 8c6de56292a..031f69f3679 100644
--- a/lib/gitlab/web_hooks.rb
+++ b/lib/gitlab/web_hooks.rb
@@ -4,5 +4,6 @@ module Gitlab
module WebHooks
GITLAB_EVENT_HEADER = 'X-Gitlab-Event'
GITLAB_INSTANCE_HEADER = 'X-Gitlab-Instance'
+ GITLAB_UUID_HEADER = 'X-Gitlab-Webhook-UUID'
end
end
diff --git a/lib/gitlab_settings/options.rb b/lib/gitlab_settings/options.rb
index 077c1aa944a..68555794436 100644
--- a/lib/gitlab_settings/options.rb
+++ b/lib/gitlab_settings/options.rb
@@ -1,7 +1,42 @@
# frozen_string_literal: true
+require 'forwardable'
+
module GitlabSettings
class Options
+ extend Forwardable
+
+ def_delegators :@options,
+ :count,
+ :deep_stringify_keys,
+ :deep_symbolize_keys,
+ :default_proc,
+ :dig,
+ :each_key,
+ :each_pair,
+ :each_value,
+ :each,
+ :empty?,
+ :fetch_values,
+ :fetch,
+ :filter,
+ :keys,
+ :length,
+ :map,
+ :member?,
+ :merge,
+ :reject,
+ :select,
+ :size,
+ :slice,
+ :stringify_keys,
+ :symbolize_keys,
+ :transform_keys,
+ :transform_values,
+ :value?,
+ :values_at,
+ :values
+
# Recursively build GitlabSettings::Options
def self.build(obj)
case obj
@@ -26,22 +61,25 @@ module GitlabSettings
@options[key.to_s] = self.class.build(value)
end
- def key?(name)
- @options.key?(name.to_s) || @options.key?(name.to_sym)
+ def key?(key)
+ @options.key?(key.to_s)
end
alias_method :has_key?, :key?
- def to_hash
- @options.deep_transform_values do |option|
- case option
- when self.class
- option.to_hash
- else
- option
- end
- end
+ # Some configurations use the 'default' key, like:
+ # https://gitlab.com/gitlab-org/gitlab/-/blob/c4d5c77c87494bb320fa7fdf19b0e4d7d52af1d1/spec/support/helpers/stub_configuration.rb#L96
+ # But since `default` is also a method in Hash, this can be confusing and
+ # raise an exception instead of returning nil, as expected in some places.
+ # To avoid that, we use #default always as a possible internal key
+ def default
+ @options['default']
+ end
+
+ # For backward compatibility, like:
+ # https://gitlab.com/gitlab-org/gitlab/-/blob/adf67e90428670aaa955731f3bdeafb8b3a874cd/lib/gitlab/database/health_status/indicators/patroni_apdex.rb#L58
+ def with_indifferent_access
+ to_hash.with_indifferent_access
end
- alias_method :to_h, :to_hash
def dup
self.class.build(to_hash)
@@ -51,16 +89,56 @@ module GitlabSettings
self.class.build(to_hash.merge(other.deep_stringify_keys))
end
+ def merge!(other)
+ @options = to_hash.merge(other.deep_stringify_keys)
+ end
+
def deep_merge(other)
self.class.build(to_hash.deep_merge(other.deep_stringify_keys))
end
+ def deep_merge!(other)
+ @options = to_hash.deep_merge(other.deep_stringify_keys)
+ end
+
def is_a?(klass)
return true if klass == Hash
super(klass)
end
+ def to_hash
+ @options.deep_transform_values do |option|
+ case option
+ when self.class
+ option.to_hash
+ else
+ option
+ end
+ end
+ end
+ alias_method :to_h, :to_hash
+
+ # Don't alter the internal keys
+ def stringify_keys!
+ error_msg = "Warning: Do not mutate #{self.class} objects: `#{__method__}`"
+
+ Gitlab::ErrorTracking.track_and_raise_for_dev_exception(RuntimeError.new(error_msg), method: __method__)
+
+ to_hash.deep_stringify_keys
+ end
+ alias_method :deep_stringify_keys!, :stringify_keys!
+
+ # Don't alter the internal keys
+ def symbolize_keys!
+ error_msg = "Warning: Do not mutate #{self.class} objects: `#{__method__}`"
+
+ Gitlab::ErrorTracking.track_and_raise_for_dev_exception(RuntimeError.new(error_msg), method: __method__)
+
+ to_hash.deep_symbolize_keys
+ end
+ alias_method :deep_symbolize_keys!, :symbolize_keys!
+
def method_missing(name, *args, &block)
name_string = +name.to_s
@@ -70,7 +148,13 @@ module GitlabSettings
return self[name_string]
end
- return @options.public_send(name, *args, &block) if @options.respond_to?(name) # rubocop: disable GitlabSecurity/PublicSend
+ if @options.respond_to?(name)
+ error_msg = "Calling a hash method on #{self.class}: `#{name}`"
+
+ Gitlab::ErrorTracking.track_and_raise_for_dev_exception(RuntimeError.new(error_msg), method: name)
+
+ return @options.public_send(name, *args, &block) # rubocop: disable GitlabSecurity/PublicSend
+ end
raise ::GitlabSettings::MissingSetting, "option '#{name}' not defined"
end
diff --git a/lib/result.rb b/lib/result.rb
new file mode 100644
index 00000000000..5e72b3f13cb
--- /dev/null
+++ b/lib/result.rb
@@ -0,0 +1,209 @@
+# frozen_string_literal: true
+
+# A (partial) implementation of the functional Result type, with naming conventions based on the
+# Rust implementation (https://doc.rust-lang.org/std/result/index.html)
+#
+# Modern Ruby 3+ destructuring and pattern matching are supported.
+#
+# - See "Railway Oriented Programming and the Result Class" in `ee/lib/remote_development/README.md` for details
+# and example usage.
+# - See `spec/lib/result_spec.rb` for detailed executable example usage.
+# - See https://en.wikipedia.org/wiki/Result_type for a general description of the Result pattern.
+# - See https://fsharpforfunandprofit.com/rop/ for how this can be used with Railway Oriented Programming (ROP)
+# to improve design and architecture
+# - See https://doc.rust-lang.org/std/result/ for the Rust implementation.
+
+# NOTE: This class is intentionally not namespaced to allow for more concise, readable, and explicit usage.
+# It it a generic reusable implementation of the Result type, and is not specific to any domain
+# rubocop:disable Gitlab/NamespacedClass
+class Result
+ # The .ok and .err factory class methods are the only way to create a Result
+ #
+ # "self.ok" corresponds to Ok(T) in Rust: https://doc.rust-lang.org/std/result/enum.Result.html#variant.Ok
+ #
+ # @param [Object, #new] ok_value
+ # @return [Result]
+ def self.ok(ok_value)
+ new(ok_value: ok_value)
+ end
+
+ # "self.err" corresponds to Err(E) in Rust: https://doc.rust-lang.org/std/result/enum.Result.html#variant.Err
+ #
+ # @param [Object, #new] ok_value
+ # @return [Result]
+ def self.err(err_value)
+ new(err_value: err_value)
+ end
+
+ # "#unwrap" corresponds to "unwrap" in Rust.
+ #
+ # @return [Object]
+ # @raise [RuntimeError] if called on an "err" Result
+ def unwrap
+ ok? ? value : raise("Called Result#unwrap on an 'err' Result")
+ end
+
+ # "#unwrap" corresponds to "unwrap" in Rust.
+ #
+ # @return [Object]
+ # @raise [RuntimeError] if called on an "ok" Result
+ def unwrap_err
+ err? ? value : raise("Called Result#unwrap_err on an 'ok' Result")
+ end
+
+ # The `ok?` attribute will be true if the Result was constructed with .ok, and false if it was constructed with .err
+ #
+ # "#ok?" corresponds to "is_ok" in Rust.
+ # @return [Boolean]
+ def ok?
+ # We don't make `@ok` an attr_reader, because we don't want to confusingly shadow the class method `.ok`
+ @ok
+ end
+
+ # The `err?` attribute will be false if the Result was constructed with .ok, and true if it was constructed with .err
+ # "#err?" corresponds to "is_err" in Rust.
+ #
+ # @return [Boolean]
+ def err?
+ !ok?
+ end
+
+ # `and_then` is a functional way to chain together operations which may succeed or have errors. It is passed
+ # a lambda or class (singleton) method object, and must return a Result object representing "ok"
+ # or "err".
+ #
+ # If the Result object it is called on is "ok", then the passed lambda or singleton method
+ # is called with the value contained in the Result.
+ #
+ # If the Result object it is called on is "err", then it is returned without calling the passed
+ # lambda or method.
+ #
+ # It only supports being passed a lambda, or a class (singleton) method object
+ # which responds to `call` with a single argument (arity of 1). If multiple values are needed,
+ # pass a hash or array. Note that passing `Proc` objects is NOT supported, even though the YARD
+ # annotation contains `Proc` (because the type of a lambda is also `Proc`).
+ #
+ # Passing instance methods to `and_then` is not supported, because the methods in the chain should be
+ # stateless "pure functions", and should not be persisting or referencing any instance state anyway.
+ #
+ # "#and_then" corresponds to "and_then" in Rust: https://doc.rust-lang.org/std/result/enum.Result.html#method.and_then
+ #
+ # @param [Proc, Method] lambda_or_singleton_method
+ # @return [Result]
+ # @raise [TypeError]
+ def and_then(lambda_or_singleton_method)
+ validate_lambda_or_singleton_method(lambda_or_singleton_method)
+
+ # Return/passthough the Result itself if it is an err
+ return self if err?
+
+ # If the Result is ok, call the lambda or singleton method with the contained value
+ result = lambda_or_singleton_method.call(value)
+
+ unless result.is_a?(Result)
+ err_msg = "'Result##{__method__}' expects a lambda or singleton method object which returns a 'Result' type " \
+ ", but instead received '#{lambda_or_singleton_method.inspect}' which returned '#{result.class}'. " \
+ "Check that the previous method calls in the '#and_then' chain are correct."
+ raise(TypeError, err_msg)
+ end
+
+ result
+ end
+
+ # `map` is similar to `and_then`, but it is used for "single track" methods which always succeed,
+ # and have no possibility of returning an error (but they may still raise exceptions,
+ # which is unrelated to the Result handling). The passed lambda or singleton method must return
+ # a value, not a Result.
+ #
+ # If the Result object it is called on is "ok", then the passed lambda or singleton method
+ # is called with the value contained in the Result.
+ #
+ # If the Result object it is called on is "err", then it is returned without calling the passed
+ # lambda or method.
+ #
+ # "#map" corresponds to "map" in Rust: https://doc.rust-lang.org/std/result/enum.Result.html#method.map
+ #
+ # @param [Proc, Method] lambda_or_singleton_method
+ # @return [Result]
+ # @raise [TypeError]
+ def map(lambda_or_singleton_method)
+ validate_lambda_or_singleton_method(lambda_or_singleton_method)
+
+ # Return/passthrough the Result itself if it is an err
+ return self if err?
+
+ # If the Result is ok, call the lambda or singleton method with the contained value
+ mapped_value = lambda_or_singleton_method.call(value)
+
+ if mapped_value.is_a?(Result)
+ err_msg = "'Result##{__method__}' expects a lambda or singleton method object which returns an unwrapped " \
+ "value, not a 'Result', but instead received '#{lambda_or_singleton_method.inspect}' which returned " \
+ "a 'Result'."
+ raise(TypeError, err_msg)
+ end
+
+ # wrap the returned mapped_value in an "ok" Result.
+ Result.ok(mapped_value)
+ end
+
+ # `to_h` supports destructuring of a result object, for example: `result => { ok: }; puts ok`
+ #
+ # @return [Hash]
+ def to_h
+ ok? ? { ok: value } : { err: value }
+ end
+
+ # `deconstruct_keys` supports pattern matching on a Result object with a `case` statement. See specs for examples.
+ #
+ # @param [Array] keys
+ # @return [Hash]
+ # @raise [ArgumentError]
+ def deconstruct_keys(keys)
+ raise(ArgumentError, 'Use either :ok or :err for pattern matching') unless [[:ok], [:err]].include?(keys)
+
+ to_h
+ end
+
+ # @return [Boolean]
+ def ==(other)
+ # NOTE: The underlying `@ok` instance variable is a boolean, so we only need to check `ok?`, not `err?` too
+ self.class == other.class && other.ok? == ok? && other.instance_variable_get(:@value) == value
+ end
+
+ private
+
+ # The `value` attribute will contain either the ok_value or the err_value
+ attr_reader :value
+
+ def initialize(ok_value: nil, err_value: nil)
+ if (!ok_value.nil? && !err_value.nil?) || (ok_value.nil? && err_value.nil?)
+ raise(ArgumentError, 'Do not directly use private constructor, use Result.ok or Result.err')
+ end
+
+ @ok = err_value.nil?
+ @value = ok? ? ok_value : err_value
+ end
+
+ # @param [Proc, Method] lambda_or_singleton_method
+ # @return [void]
+ # @raise [TypeError]
+ def validate_lambda_or_singleton_method(lambda_or_singleton_method)
+ is_lambda = lambda_or_singleton_method.is_a?(Proc) && lambda_or_singleton_method.lambda?
+ is_singleton_method = lambda_or_singleton_method.is_a?(Method) && lambda_or_singleton_method.owner.singleton_class?
+ unless is_lambda || is_singleton_method
+ err_msg = "'Result##{__method__}' expects a lambda or singleton method object, " \
+ "but instead received '#{lambda_or_singleton_method.inspect}'."
+ raise(TypeError, err_msg)
+ end
+
+ arity = lambda_or_singleton_method.arity
+
+ return if arity == 1
+
+ err_msg = "'Result##{__method__}' expects a lambda or singleton method object with a single argument " \
+ "(arity of 1), but instead received '#{lambda_or_singleton_method.inspect}' with an arity of #{arity}."
+ raise(ArgumentError, err_msg)
+ end
+end
+
+# rubocop:enable Gitlab/NamespacedClass
diff --git a/lib/search/navigation.rb b/lib/search/navigation.rb
new file mode 100644
index 00000000000..3594ac0dc30
--- /dev/null
+++ b/lib/search/navigation.rb
@@ -0,0 +1,158 @@
+# frozen_string_literal: true
+
+module Search
+ class Navigation
+ include Gitlab::Allowable
+
+ def initialize(user:, project: nil, group: nil, options: {})
+ @user = user
+ @project = project
+ @group = group
+ @options = options
+ end
+
+ def tab_enabled_for_project?(tab)
+ return false unless project.present?
+
+ abilities = Array(search_tab_ability_map[tab])
+ Array.wrap(project).any? { |p| abilities.any? { |ability| can?(user, ability, p) } }
+ end
+
+ def tabs
+ {
+ projects: {
+ sort: 1,
+ label: _("Projects"),
+ data: { qa_selector: 'projects_tab' },
+ condition: project.nil?
+ },
+ blobs: {
+ sort: 2,
+ label: _("Code"),
+ data: { qa_selector: 'code_tab' },
+ condition: show_code_search_tab?
+ },
+ # sort: 3 is reserved for EE items
+ issues: {
+ sort: 4,
+ label: _("Issues"),
+ condition: show_issues_search_tab?
+ },
+ merge_requests: {
+ sort: 5,
+ label: _("Merge requests"),
+ condition: show_merge_requests_search_tab?
+ },
+ wiki_blobs: {
+ sort: 6,
+ label: _("Wiki"),
+ condition: show_wiki_search_tab?
+ },
+ commits: {
+ sort: 7,
+ label: _("Commits"),
+ condition: show_commits_search_tab?
+ },
+ notes: {
+ sort: 8,
+ label: _("Comments"),
+ condition: show_comments_search_tab?
+ },
+ milestones: {
+ sort: 9, label: _("Milestones"),
+ condition: show_milestones_search_tab?
+ },
+ users: {
+ sort: 10,
+ label: _("Users"),
+ condition: show_user_search_tab?
+ },
+ snippet_titles: {
+ sort: 11,
+ label: _("Snippets"),
+ search: { snippets: true, group_id: nil, project_id: nil },
+ condition: show_snippets_search_tab?
+ }
+ }
+ end
+
+ private
+
+ attr_reader :user, :project, :group, :options
+
+ def show_elasticsearch_tabs?
+ !!options[:show_elasticsearch_tabs]
+ end
+
+ def search_tab_ability_map
+ {
+ milestones: :read_milestone,
+ snippets: :read_snippet,
+ issues: :read_issue,
+ blobs: :read_code,
+ commits: :read_code,
+ merge_requests: :read_merge_request,
+ notes: [:read_merge_request, :read_code, :read_issue, :read_snippet],
+ users: :read_project_member,
+ wiki_blobs: :read_wiki
+ }
+ end
+
+ def show_user_search_tab?
+ return true if tab_enabled_for_project?(:users)
+ return false unless can?(user, :read_users_list)
+
+ project.nil? && feature_flag_tab_enabled?(:global_search_users_tab)
+ end
+
+ def show_code_search_tab?
+ return true if tab_enabled_for_project?(:blobs)
+
+ project.nil? && show_elasticsearch_tabs? && feature_flag_tab_enabled?(:global_search_code_tab)
+ end
+
+ def show_wiki_search_tab?
+ return true if tab_enabled_for_project?(:wiki_blobs)
+
+ project.nil? && show_elasticsearch_tabs? && feature_flag_tab_enabled?(:global_search_wiki_tab)
+ end
+
+ def show_commits_search_tab?
+ return true if tab_enabled_for_project?(:commits)
+
+ project.nil? && show_elasticsearch_tabs? && feature_flag_tab_enabled?(:global_search_commits_tab)
+ end
+
+ def show_issues_search_tab?
+ return true if tab_enabled_for_project?(:issues)
+
+ project.nil? && feature_flag_tab_enabled?(:global_search_issues_tab)
+ end
+
+ def show_merge_requests_search_tab?
+ return true if tab_enabled_for_project?(:merge_requests)
+
+ project.nil? && feature_flag_tab_enabled?(:global_search_merge_requests_tab)
+ end
+
+ def show_comments_search_tab?
+ return true if tab_enabled_for_project?(:notes)
+
+ project.nil? && show_elasticsearch_tabs?
+ end
+
+ def show_snippets_search_tab?
+ !!options[:show_snippets] && project.nil? && feature_flag_tab_enabled?(:global_search_snippet_titles_tab)
+ end
+
+ def show_milestones_search_tab?
+ project.nil? || tab_enabled_for_project?(:milestones)
+ end
+
+ def feature_flag_tab_enabled?(flag)
+ group.present? || Feature.enabled?(flag, user, type: :ops)
+ end
+ end
+end
+
+Search::Navigation.prepend_mod
diff --git a/lib/sidebars/groups/super_sidebar_menus/analyze_menu.rb b/lib/sidebars/groups/super_sidebar_menus/analyze_menu.rb
index 65393336797..a053288ccea 100644
--- a/lib/sidebars/groups/super_sidebar_menus/analyze_menu.rb
+++ b/lib/sidebars/groups/super_sidebar_menus/analyze_menu.rb
@@ -17,6 +17,8 @@ module Sidebars
override :configure_menu_items
def configure_menu_items
[
+ :analytics_dashboards,
+ :dashboards_analytics,
:cycle_analytics,
:ci_cd_analytics,
:contribution_analytics,
diff --git a/lib/sidebars/organizations/menus/manage_menu.rb b/lib/sidebars/organizations/menus/manage_menu.rb
new file mode 100644
index 00000000000..0df716cdd3f
--- /dev/null
+++ b/lib/sidebars/organizations/menus/manage_menu.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+module Sidebars
+ module Organizations
+ module Menus
+ class ManageMenu < ::Sidebars::Menu
+ override :title
+ def title
+ s_('Navigation|Manage')
+ end
+
+ override :sprite_icon
+ def sprite_icon
+ 'users'
+ end
+
+ override :pick_into_super_sidebar?
+ def pick_into_super_sidebar?
+ true
+ end
+
+ override :configure_menu_items
+ def configure_menu_items
+ add_item(
+ ::Sidebars::MenuItem.new(
+ title: _('Groups and projects'),
+ link: groups_and_projects_organization_path(context.container),
+ super_sidebar_parent: ::Sidebars::Organizations::Menus::ManageMenu,
+ active_routes: { path: 'organizations/organizations#groups_and_projects' },
+ item_id: :organization_groups_and_projects
+ )
+ )
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sidebars/organizations/menus/scope_menu.rb b/lib/sidebars/organizations/menus/scope_menu.rb
new file mode 100644
index 00000000000..86f0a083731
--- /dev/null
+++ b/lib/sidebars/organizations/menus/scope_menu.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+module Sidebars
+ module Organizations
+ module Menus
+ class ScopeMenu < ::Sidebars::Menu
+ override :link
+ def link
+ organization_path(context.container)
+ end
+
+ override :title
+ def title
+ context.container.name
+ end
+
+ override :active_routes
+ def active_routes
+ { path: 'organizations/organizations#show' }
+ end
+
+ override :render?
+ def render?
+ true
+ end
+
+ override :extra_nav_link_html_options
+ def extra_nav_link_html_options
+ {
+ class: 'context-header'
+ }
+ end
+
+ override :serialize_as_menu_item_args
+ def serialize_as_menu_item_args
+ super.merge({
+ title: s_('Organization|Organization overview'),
+ sprite_icon: 'organization',
+ super_sidebar_parent: ::Sidebars::StaticMenu,
+ item_id: :organization_overview
+ })
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sidebars/organizations/panel.rb b/lib/sidebars/organizations/panel.rb
new file mode 100644
index 00000000000..159ccb6cbe9
--- /dev/null
+++ b/lib/sidebars/organizations/panel.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module Sidebars
+ module Organizations
+ class Panel < ::Sidebars::Panel
+ include ::Sidebars::Concerns::SuperSidebarPanel
+
+ override :aria_label
+ def aria_label
+ s_('Organization|Organization navigation')
+ end
+
+ override :configure_menus
+ def configure_menus
+ set_scope_menu(Sidebars::Organizations::Menus::ScopeMenu.new(context))
+ add_menu(Sidebars::StaticMenu.new(context))
+ add_menu(Sidebars::Organizations::Menus::ManageMenu.new(context))
+ end
+ end
+ end
+end
diff --git a/lib/sidebars/organizations/super_sidebar_panel.rb b/lib/sidebars/organizations/super_sidebar_panel.rb
new file mode 100644
index 00000000000..acc3d9a0ddf
--- /dev/null
+++ b/lib/sidebars/organizations/super_sidebar_panel.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+module Sidebars
+ module Organizations
+ class SuperSidebarPanel < ::Sidebars::Organizations::Panel
+ include ::Sidebars::Concerns::SuperSidebarPanel
+ extend ::Gitlab::Utils::Override
+
+ override :configure_menus
+ def configure_menus
+ super
+ old_menus = @menus
+ @menus = []
+
+ add_menu(Sidebars::StaticMenu.new(context))
+
+ # Pick old menus, will be obsolete once everything is in their own
+ # super sidebar menu
+ pick_from_old_menus(old_menus)
+
+ transform_old_menus(@menus, @scope_menu, *old_menus)
+ end
+
+ override :super_sidebar_context_header
+ def super_sidebar_context_header
+ {
+ title: context.container.name,
+ id: context.container.id
+ }
+ end
+ end
+ end
+end
diff --git a/lib/sidebars/projects/menus/deployments_menu.rb b/lib/sidebars/projects/menus/deployments_menu.rb
index 0a411f075b7..ff2f833763a 100644
--- a/lib/sidebars/projects/menus/deployments_menu.rb
+++ b/lib/sidebars/projects/menus/deployments_menu.rb
@@ -9,10 +9,7 @@ module Sidebars
add_item(environments_menu_item)
add_item(feature_flags_menu_item)
add_item(releases_menu_item)
-
- if Feature.enabled?(:show_pages_in_deployments_menu, context.current_user, type: :experiment)
- add_item(pages_menu_item)
- end
+ add_item(pages_menu_item)
true
end
@@ -95,8 +92,8 @@ module Sidebars
::Sidebars::MenuItem.new(
title: _('Pages'),
link: project_pages_path(context.project),
- super_sidebar_parent: Sidebars::Projects::SuperSidebarMenus::OperationsMenu,
- active_routes: { path: 'pages#show' },
+ super_sidebar_parent: Sidebars::Projects::SuperSidebarMenus::DeployMenu,
+ active_routes: { path: %w[pages#new pages#show] },
item_id: :pages
)
end
diff --git a/lib/sidebars/projects/menus/monitor_menu.rb b/lib/sidebars/projects/menus/monitor_menu.rb
index a74448d0bdc..87b09e42fe1 100644
--- a/lib/sidebars/projects/menus/monitor_menu.rb
+++ b/lib/sidebars/projects/menus/monitor_menu.rb
@@ -8,6 +8,7 @@ module Sidebars
def configure_menu_items
return false unless feature_enabled?
+ add_item(tracing_menu_item)
add_item(error_tracking_menu_item)
add_item(alert_management_menu_item)
add_item(incidents_menu_item)
@@ -62,6 +63,20 @@ module Sidebars
)
end
+ def tracing_menu_item
+ unless Gitlab::Observability.tracing_enabled?(context.project)
+ return ::Sidebars::NilMenuItem.new(item_id: :tracing)
+ end
+
+ ::Sidebars::MenuItem.new(
+ title: _('Tracing'),
+ link: project_tracing_index_path(context.project),
+ super_sidebar_parent: ::Sidebars::Projects::SuperSidebarMenus::MonitorMenu,
+ active_routes: { controller: :tracing },
+ item_id: :tracing
+ )
+ end
+
def alert_management_menu_item
unless can?(context.current_user, :read_alert_management_alert, context.project)
return ::Sidebars::NilMenuItem.new(item_id: :alert_management)
diff --git a/lib/sidebars/projects/menus/packages_registries_menu.rb b/lib/sidebars/projects/menus/packages_registries_menu.rb
index f41b7ce1a73..053ce5e82fd 100644
--- a/lib/sidebars/projects/menus/packages_registries_menu.rb
+++ b/lib/sidebars/projects/menus/packages_registries_menu.rb
@@ -98,7 +98,7 @@ module Sidebars
::Sidebars::MenuItem.new(
title: _('Model experiments'),
link: project_ml_experiments_path(context.project),
- super_sidebar_parent: Sidebars::Projects::SuperSidebarMenus::DeployMenu,
+ super_sidebar_parent: Sidebars::Projects::SuperSidebarMenus::AnalyzeMenu,
active_routes: { controller: %w[projects/ml/experiments projects/ml/candidates] },
item_id: :model_experiments
)
diff --git a/lib/sidebars/projects/menus/settings_menu.rb b/lib/sidebars/projects/menus/settings_menu.rb
index 9ed142f7f60..9219312ede8 100644
--- a/lib/sidebars/projects/menus/settings_menu.rb
+++ b/lib/sidebars/projects/menus/settings_menu.rb
@@ -16,11 +16,6 @@ module Sidebars
add_item(merge_requests_menu_item)
add_item(ci_cd_menu_item)
add_item(packages_and_registries_menu_item)
-
- if Feature.disabled?(:show_pages_in_deployments_menu, context.current_user, type: :experiment)
- add_item(pages_menu_item)
- end
-
add_item(monitor_menu_item)
add_item(usage_quotas_menu_item)
@@ -131,19 +126,6 @@ module Sidebars
)
end
- def pages_menu_item
- unless context.project.pages_available?
- return ::Sidebars::NilMenuItem.new(item_id: :pages)
- end
-
- ::Sidebars::MenuItem.new(
- title: _('Pages'),
- link: project_pages_path(context.project),
- active_routes: { path: 'pages#show' },
- item_id: :pages
- )
- end
-
def monitor_menu_item
if context.project.archived? || !can?(context.current_user, :admin_operations, context.project)
return ::Sidebars::NilMenuItem.new(item_id: :monitor)
diff --git a/lib/sidebars/projects/super_sidebar_menus/analyze_menu.rb b/lib/sidebars/projects/super_sidebar_menus/analyze_menu.rb
index 2c5dc8a08e7..58b231a269c 100644
--- a/lib/sidebars/projects/super_sidebar_menus/analyze_menu.rb
+++ b/lib/sidebars/projects/super_sidebar_menus/analyze_menu.rb
@@ -25,7 +25,8 @@ module Sidebars
:code_review,
:merge_request_analytics,
:issues,
- :insights
+ :insights,
+ :model_experiments
].each { |id| add_item(::Sidebars::NilMenuItem.new(item_id: id)) }
end
end
diff --git a/lib/sidebars/projects/super_sidebar_menus/deploy_menu.rb b/lib/sidebars/projects/super_sidebar_menus/deploy_menu.rb
index 49aa6a23a0e..9f667466d1c 100644
--- a/lib/sidebars/projects/super_sidebar_menus/deploy_menu.rb
+++ b/lib/sidebars/projects/super_sidebar_menus/deploy_menu.rb
@@ -20,8 +20,7 @@ module Sidebars
:releases,
:feature_flags,
:packages_registry,
- :container_registry,
- :model_experiments
+ :container_registry
].each { |id| add_item(::Sidebars::NilMenuItem.new(item_id: id)) }
end
end
diff --git a/lib/sidebars/projects/super_sidebar_menus/monitor_menu.rb b/lib/sidebars/projects/super_sidebar_menus/monitor_menu.rb
index 6e64ac01ffa..0441d3b4a03 100644
--- a/lib/sidebars/projects/super_sidebar_menus/monitor_menu.rb
+++ b/lib/sidebars/projects/super_sidebar_menus/monitor_menu.rb
@@ -17,6 +17,7 @@ module Sidebars
override :configure_menu_items
def configure_menu_items
[
+ :tracing,
:error_tracking,
:alert_management,
:incidents,
diff --git a/lib/sidebars/user_settings/menus/access_tokens_menu.rb b/lib/sidebars/user_settings/menus/access_tokens_menu.rb
index f52be22e044..ed39b5d6720 100644
--- a/lib/sidebars/user_settings/menus/access_tokens_menu.rb
+++ b/lib/sidebars/user_settings/menus/access_tokens_menu.rb
@@ -31,7 +31,7 @@ module Sidebars
override :extra_container_html_options
def extra_container_html_options
- { 'data-qa-selector': 'access_token_link' }
+ { 'data-testid': 'access_token_link' }
end
end
end
diff --git a/lib/sidebars/user_settings/menus/account_menu.rb b/lib/sidebars/user_settings/menus/account_menu.rb
index a26dee83da3..53e8b60ea4d 100644
--- a/lib/sidebars/user_settings/menus/account_menu.rb
+++ b/lib/sidebars/user_settings/menus/account_menu.rb
@@ -28,7 +28,7 @@ module Sidebars
override :extra_container_html_options
def extra_container_html_options
- { 'data-qa-selector': 'profile_account_link' }
+ { 'data-testid': 'profile_account_link' }
end
end
end
diff --git a/lib/sidebars/user_settings/menus/emails_menu.rb b/lib/sidebars/user_settings/menus/emails_menu.rb
index 3b6b4ae1daf..7df7a76238e 100644
--- a/lib/sidebars/user_settings/menus/emails_menu.rb
+++ b/lib/sidebars/user_settings/menus/emails_menu.rb
@@ -28,7 +28,7 @@ module Sidebars
override :extra_container_html_options
def extra_container_html_options
- { 'data-qa-selector': 'profile_emails_link' }
+ { 'data-testid': 'profile_emails_link' }
end
end
end
diff --git a/lib/sidebars/user_settings/menus/password_menu.rb b/lib/sidebars/user_settings/menus/password_menu.rb
index 9a53e0c727e..e518e1f8bf7 100644
--- a/lib/sidebars/user_settings/menus/password_menu.rb
+++ b/lib/sidebars/user_settings/menus/password_menu.rb
@@ -31,7 +31,7 @@ module Sidebars
override :extra_container_html_options
def extra_container_html_options
- { 'data-qa-selector': 'profile_password_link' }
+ { 'data-testid': 'profile_password_link' }
end
end
end
diff --git a/lib/sidebars/user_settings/menus/ssh_keys_menu.rb b/lib/sidebars/user_settings/menus/ssh_keys_menu.rb
index 8d92db0147a..bd3cbe30e64 100644
--- a/lib/sidebars/user_settings/menus/ssh_keys_menu.rb
+++ b/lib/sidebars/user_settings/menus/ssh_keys_menu.rb
@@ -28,7 +28,7 @@ module Sidebars
override :extra_container_html_options
def extra_container_html_options
- { 'data-qa-selector': 'ssh_keys_link' }
+ { 'data-testid': 'ssh_keys_link' }
end
end
end
diff --git a/lib/slack/manifest.rb b/lib/slack/manifest.rb
new file mode 100644
index 00000000000..de189f3bdf5
--- /dev/null
+++ b/lib/slack/manifest.rb
@@ -0,0 +1,114 @@
+# frozen_string_literal: true
+
+module Slack
+ module Manifest
+ class << self
+ delegate :to_json, to: :to_h
+
+ def share_url
+ "https://api.slack.com/apps?new_app=1&manifest_json=#{ERB::Util.url_encode(to_json)}"
+ end
+
+ def to_h
+ {
+ display_information: display_information,
+ features: features,
+ oauth_config: oauth_config,
+ settings: settings
+ }
+ end
+
+ private
+
+ def display_information
+ {
+ name: "GitLab (#{Gitlab.config.gitlab.host.first(26)})",
+ description: s_('SlackIntegration|Interact with GitLab without leaving your Slack workspace!'),
+ background_color: '#171321',
+ # Each element in this array will become a paragraph joined with `\r\n\r\n'.
+ long_description: [
+ format(
+ s_(
+ 'SlackIntegration|Generated for %{host} by GitLab %{version}.'
+ ),
+ host: Gitlab.config.gitlab.host,
+ version: Gitlab::VERSION
+ ),
+ s_(
+ 'SlackIntegration|- *Notifications:* Get notifications to your team\'s Slack channel about events ' \
+ 'happening inside your GitLab projects.'
+ ),
+ format(
+ s_(
+ 'SlackIntegration|- *Slash commands:* Quickly open, access, or close issues from Slack using the ' \
+ '`%{slash_command}` command. Streamline your GitLab deployments with ChatOps.'
+ ),
+ slash_command: '/gitlab'
+ )
+ ].join("\r\n\r\n")
+ }
+ end
+
+ def features
+ {
+ app_home: {
+ home_tab_enabled: true,
+ messages_tab_enabled: false,
+ messages_tab_read_only_enabled: true
+ },
+ bot_user: {
+ display_name: 'GitLab',
+ always_online: true
+ },
+ slash_commands: [
+ {
+ command: '/gitlab',
+ url: api_v4('slack/trigger'),
+ description: s_('SlackIntegration|GitLab slash commands'),
+ usage_hint: s_('SlackIntegration|your-project-name-or-alias command'),
+ should_escape: false
+ }
+ ]
+ }
+ end
+
+ def oauth_config
+ {
+ redirect_urls: [
+ Gitlab.config.gitlab.url
+ ],
+ scopes: {
+ bot: %w[
+ commands
+ chat:write
+ chat:write.public
+ ]
+ }
+ }
+ end
+
+ def settings
+ {
+ event_subscriptions: {
+ request_url: api_v4('integrations/slack/events'),
+ bot_events: %w[
+ app_home_opened
+ ]
+ },
+ interactivity: {
+ is_enabled: true,
+ request_url: api_v4('integrations/slack/interactions'),
+ message_menu_options_url: api_v4('integrations/slack/options')
+ },
+ org_deploy_enabled: false,
+ socket_mode_enabled: false,
+ token_rotation_enabled: false
+ }
+ end
+
+ def api_v4(path)
+ "#{Gitlab.config.gitlab.url}/api/v4/#{path}"
+ end
+ end
+ end
+end
diff --git a/lib/tasks/dev.rake b/lib/tasks/dev.rake
index 22ca5d9039c..e1799617ea0 100644
--- a/lib/tasks/dev.rake
+++ b/lib/tasks/dev.rake
@@ -8,7 +8,7 @@ namespace :dev do
ENV['force'] = 'yes'
Rake::Task["gitlab:setup"].invoke
- Gitlab::Database::EachDatabase.each_database_connection do |connection|
+ Gitlab::Database::EachDatabase.each_connection do |connection|
# Make sure DB statistics are up to date.
# gitlab:setup task can insert quite a bit of data, especially with MASS_INSERT=1
# so ANALYZE can take more than default 15s statement timeout. This being a dev task,
@@ -61,7 +61,7 @@ namespace :dev do
AND pid <> pg_backend_pid();
SQL
- Gitlab::Database::EachDatabase.each_database_connection(include_shared: false) do |connection|
+ Gitlab::Database::EachDatabase.each_connection(include_shared: false) do |connection|
connection.execute(cmd)
rescue ActiveRecord::NoDatabaseError
end
diff --git a/lib/tasks/gettext.rake b/lib/tasks/gettext.rake
index 825388461bc..1a659a930ab 100644
--- a/lib/tasks/gettext.rake
+++ b/lib/tasks/gettext.rake
@@ -42,7 +42,7 @@ namespace :gettext do
desc 'Lint all po files in `locale/'
task lint: :environment do
require 'simple_po_parser'
- require 'gitlab/utils'
+ require 'gitlab/utils/all'
require 'parallel'
FastGettext.silence_errors
diff --git a/lib/tasks/gitlab/db.rake b/lib/tasks/gitlab/db.rake
index 026cb39a92f..546f5621515 100644
--- a/lib/tasks/gitlab/db.rake
+++ b/lib/tasks/gitlab/db.rake
@@ -33,7 +33,7 @@ namespace :gitlab do
exit 1
end
- Gitlab::Database::EachDatabase.each_database_connection(only: only_on) do |connection, name|
+ Gitlab::Database::EachDatabase.each_connection(only: only_on) do |connection, name|
connection.execute("INSERT INTO schema_migrations (version) VALUES (#{connection.quote(version)})")
puts "Successfully marked '#{version}' as complete on database #{name}".color(:green)
@@ -57,7 +57,7 @@ namespace :gitlab do
end
def drop_tables(only_on: nil)
- Gitlab::Database::EachDatabase.each_database_connection(only: only_on) do |connection, name|
+ Gitlab::Database::EachDatabase.each_connection(only: only_on) do |connection, name|
# In PostgreSQLAdapter, data_sources returns both views and tables, so use tables instead
tables = connection.tables
@@ -142,7 +142,7 @@ namespace :gitlab do
desc 'This adjusts and cleans db/structure.sql - it runs after db:schema:dump'
task :clean_structure_sql do |task_name|
ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).each do |db_config|
- structure_file = ActiveRecord::Tasks::DatabaseTasks.dump_filename(db_config.name)
+ structure_file = ActiveRecord::Tasks::DatabaseTasks.schema_dump_path(db_config)
schema = File.read(structure_file)
@@ -292,7 +292,7 @@ namespace :gitlab do
exit
end
- Gitlab::Database::EachDatabase.each_database_connection(only: database_name) do
+ Gitlab::Database::EachDatabase.each_connection(only: database_name) do
Gitlab::Database::AsyncIndexes.execute_pending_actions!(how_many: args[:pick].to_i)
end
end
@@ -322,7 +322,7 @@ namespace :gitlab do
exit
end
- Gitlab::Database::EachDatabase.each_database_connection(only: database_name) do
+ Gitlab::Database::EachDatabase.each_connection(only: database_name) do
Gitlab::Database::AsyncConstraints.validate_pending_entries!(how_many: args[:pick].to_i)
end
end
@@ -413,7 +413,7 @@ namespace :gitlab do
desc 'Run all pending batched migrations'
task execute_batched_migrations: :environment do
- Gitlab::Database::EachDatabase.each_database_connection do |connection, name|
+ Gitlab::Database::EachDatabase.each_connection do |connection, name|
Gitlab::Database::BackgroundMigration::BatchedMigration.with_status(:active).queue_order.each do |migration|
Gitlab::AppLogger.info("Executing batched migration #{migration.id} on database #{name} inline")
Gitlab::Database::BackgroundMigration::BatchedMigrationRunner.new(connection: connection).run_entire_migration(migration)
@@ -457,26 +457,20 @@ namespace :gitlab do
desc 'Checks schema inconsistencies'
task run: :environment do
database_model = Gitlab::Database.database_base_models[Gitlab::Database::MAIN_DATABASE_NAME]
- database = Gitlab::Database::SchemaValidation::Database.new(database_model.connection)
+ database = Gitlab::Schema::Validation::Sources::Database.new(database_model.connection)
stucture_sql_path = Rails.root.join('db/structure.sql')
- structure_sql = Gitlab::Database::SchemaValidation::StructureSql.new(stucture_sql_path)
+ structure_sql = Gitlab::Schema::Validation::Sources::StructureSql.new(stucture_sql_path)
filter = Gitlab::Database::SchemaValidation::InconsistencyFilter.new(IGNORED_TABLES, IGNORED_TRIGGERS)
- inconsistencies =
- Gitlab::Database::SchemaValidation::Runner.new(structure_sql, database).execute.filter_map(&filter)
+ validators = Gitlab::Schema::Validation::Validators::Base.all_validators
- gitlab_url = 'gitlab-org/gitlab'
+ inconsistencies =
+ Gitlab::Schema::Validation::Runner.new(structure_sql, database, validators: validators).execute.filter_map(&filter)
inconsistencies.each do |inconsistency|
- Gitlab::Database::SchemaValidation::TrackInconsistency.new(
- inconsistency,
- Project.find_by_full_path(gitlab_url),
- User.automation_bot
- ).execute
-
- puts inconsistency.inspect
+ puts inconsistency.display
end
end
end
diff --git a/lib/tasks/gitlab/db/migration_fix_15_11.rake b/lib/tasks/gitlab/db/migration_fix_15_11.rake
index fbfee856abb..4716ac5fe9f 100644
--- a/lib/tasks/gitlab/db/migration_fix_15_11.rake
+++ b/lib/tasks/gitlab/db/migration_fix_15_11.rake
@@ -5,7 +5,7 @@ task migration_fix_15_11: [:environment] do
next if Gitlab.com?
only_on = %i[main ci].select { |db| Gitlab::Database.has_database?(db) }
- Gitlab::Database::EachDatabase.each_database_connection(only: only_on) do |conn, database|
+ Gitlab::Database::EachDatabase.each_connection(only: only_on) do |conn, database|
begin
first_migration = conn.execute('SELECT * FROM schema_migrations ORDER BY version ASC LIMIT 1')
rescue ActiveRecord::StatementInvalid
diff --git a/lib/tasks/gitlab/db/validate_config.rake b/lib/tasks/gitlab/db/validate_config.rake
index b3c98e91d17..f42d30e9817 100644
--- a/lib/tasks/gitlab/db/validate_config.rake
+++ b/lib/tasks/gitlab/db/validate_config.rake
@@ -25,10 +25,7 @@ namespace :gitlab do
task validate_config: :environment do
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`
- # Ref.: https://github.com/rails/rails/blob/f2d9316ba965e150ad04596085ee10eea4f58d3e/activerecord/lib/active_record/database_configurations.rb#L48
- db_configs = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, include_replicas: true)
+ db_configs = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, include_hidden: true)
db_configs = db_configs.reject(&:replica?)
# The `pg_control_system()` is not enough to properly discover matching database systems
diff --git a/lib/tasks/gitlab/docs/compile_deprecations.rake b/lib/tasks/gitlab/docs/compile_deprecations.rake
index f7821315f82..f6d8944c5a1 100644
--- a/lib/tasks/gitlab/docs/compile_deprecations.rake
+++ b/lib/tasks/gitlab/docs/compile_deprecations.rake
@@ -35,34 +35,5 @@ namespace :gitlab do
abort
end
end
-
- desc "Generate removal list from individual files"
- task :compile_removals do
- require_relative '../../../../tooling/docs/deprecation_handling'
- path = Rails.root.join("doc/update/removals.md")
- File.write(path, Docs::DeprecationHandling.new('removal').render)
- puts "#{COLOR_CODE_GREEN}INFO: Removals compiled to #{path}.#{COLOR_CODE_RESET}"
- end
-
- desc "Check that the removal documentation is up to date"
- task :check_removals do
- require_relative '../../../../tooling/docs/deprecation_handling'
- path = Rails.root.join("doc/update/removals.md")
- contents = Docs::DeprecationHandling.new('removal').render
- doc = File.read(path)
-
- if doc == contents
- puts "#{COLOR_CODE_GREEN}INFO: Removals documentation is up to date.#{COLOR_CODE_RESET}"
- else
- warn <<~EOS
- #{COLOR_CODE_RED}ERROR: Removals documentation is outdated!#{COLOR_CODE_RESET}
- To update the removals documentation, either:
-
- - Run `bin/rake gitlab:docs:compile_removals` and commit the changes to this branch.
- - Have a technical writer resolve the issue.
- EOS
- abort
- end
- end
end
end
diff --git a/lib/tasks/gitlab/metrics_exporter.rake b/lib/tasks/gitlab/metrics_exporter.rake
deleted file mode 100644
index 70719648fc5..00000000000
--- a/lib/tasks/gitlab/metrics_exporter.rake
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-namespace :gitlab do
- require_relative Rails.root.join('metrics_server', 'dependencies')
- require_relative Rails.root.join('metrics_server', 'metrics_server')
-
- 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/packages/events.rake b/lib/tasks/gitlab/packages/events.rake
deleted file mode 100644
index b5dfd163dba..00000000000
--- a/lib/tasks/gitlab/packages/events.rake
+++ /dev/null
@@ -1,69 +0,0 @@
-# frozen_string_literal: true
-
-desc "GitLab | Packages | Events | Generate hll counter events file for packages"
-namespace :gitlab do
- namespace :packages do
- namespace :events do
- task generate: :environment do
- Rake::Task["gitlab:packages:events:generate_counts"].invoke
- Rake::Task["gitlab:packages:events:generate_unique"].invoke
- rescue StandardError => e
- logger.error("Error building events list: #{e}")
- end
-
- task generate_counts: :environment do
- logger = Logger.new($stdout)
- logger.info('Building list of package events...')
-
- path = Gitlab::UsageDataCounters::PackageEventCounter::KNOWN_EVENTS_PATH
- File.open(path, "w") { |file| file << counter_events_list.to_yaml }
-
- logger.info("Events file `#{path}` generated successfully")
- rescue StandardError => e
- logger.error("Error building events list: #{e}")
- end
-
- task generate_unique: :environment do
- logger = Logger.new($stdout)
- logger.info('Building list of package events...')
-
- path = File.join(File.dirname(Gitlab::UsageDataCounters::HLLRedisCounter::KNOWN_EVENTS_PATH), 'package_events.yml')
- File.open(path, "w") { |file| file << generate_unique_events_list.to_yaml }
-
- logger.info("Events file `#{path}` generated successfully")
- rescue StandardError => e
- logger.error("Error building events list: #{e}")
- end
-
- private
-
- def event_pairs
- Packages::Event::EVENT_TYPES.product(Packages::Event::EVENT_SCOPES.keys)
- end
-
- def generate_unique_events_list
- events = event_pairs.each_with_object([]) do |(event_type, event_scope), events|
- Packages::Event::ORIGINATOR_TYPES.excluding(:guest).each do |originator_type|
- events_definition = Packages::Event.unique_counters_for(event_scope, event_type, originator_type).map do |event_name|
- { "name" => event_name }
- end
-
- events.concat(events_definition)
- end
- end
-
- events.sort_by { |event| event["name"] }.uniq
- end
-
- def counter_events_list
- counters = event_pairs.flat_map do |event_type, event_scope|
- Packages::Event::ORIGINATOR_TYPES.flat_map do |originator_type|
- Packages::Event.counters_for(event_scope, event_type, originator_type)
- end
- end
-
- counters.compact.sort.uniq
- end
- end
- end
-end
diff --git a/lib/tasks/gitlab/shell.rake b/lib/tasks/gitlab/shell.rake
index a5dcb23450f..8b305d68c68 100644
--- a/lib/tasks/gitlab/shell.rake
+++ b/lib/tasks/gitlab/shell.rake
@@ -44,7 +44,7 @@ namespace :gitlab do
desc "GitLab | Shell | Setup gitlab-shell"
task setup: :gitlab_environment do
- setup
+ setup_gitlab_shell
end
desc "GitLab | Shell | Build missing projects"
@@ -63,10 +63,13 @@ namespace :gitlab do
end
end
- def setup
- warn_user_is_not_gitlab
+ def setup_gitlab_shell
+ unless Gitlab::CurrentSettings.authorized_keys_enabled?
+ puts 'The "Write to authorized_keys" setting is disabled. Skipping rebuilding the authorized_keys file...'
+ return
+ end
- ensure_write_to_authorized_keys_is_enabled
+ warn_user_is_not_gitlab
unless ENV['force'] == 'yes'
puts "This task will now rebuild the authorized_keys file."
@@ -89,44 +92,4 @@ namespace :gitlab do
puts "Quitting...".color(:red)
exit 1
end
-
- def ensure_write_to_authorized_keys_is_enabled
- return if Gitlab::CurrentSettings.authorized_keys_enabled?
-
- puts authorized_keys_is_disabled_warning
-
- unless ENV['force'] == 'yes'
- puts 'Do you want to permanently enable the "Write to authorized_keys file" setting now?'
- ask_to_continue
- end
-
- puts 'Enabling the "Write to authorized_keys file" setting...'
- Gitlab::CurrentSettings.update!(authorized_keys_enabled: true)
-
- puts 'Successfully enabled "Write to authorized_keys file"!'
- puts ''
- end
-
- def authorized_keys_is_disabled_warning
- <<-MSG.strip_heredoc
- WARNING
-
- The "Write to authorized_keys file" setting is disabled, which prevents
- the file from being rebuilt!
-
- It should be enabled for most GitLab installations. Large installations
- may wish to disable it as part of speeding up SSH operations.
-
- See https://docs.gitlab.com/ee/administration/operations/fast_ssh_key_lookup.html
-
- If you did not intentionally disable this option in Admin Area > Settings,
- then you may have been affected by the 9.3.0 bug in which the new setting
- was disabled by default.
-
- https://gitlab.com/gitlab-org/gitlab/issues/2738
-
- It was reverted in 9.3.1 and fixed in 9.3.3, however, if Settings were
- saved while the setting was unchecked, then it is still disabled.
- MSG
- end
end
diff --git a/lib/tasks/gitlab/usage_data.rake b/lib/tasks/gitlab/usage_data.rake
index f5bf1a266e5..1cd72ee6a1b 100644
--- a/lib/tasks/gitlab/usage_data.rake
+++ b/lib/tasks/gitlab/usage_data.rake
@@ -34,21 +34,6 @@ namespace :gitlab do
puts Gitlab::Json.pretty_generate(Gitlab::UsageDataMetrics.uncached_data)
end
- desc 'GitLab | UsageDataMetrics | Generate known_events/ci_templates.yml based on template definitions'
- task generate_ci_template_events: :environment do
- banner = <<~BANNER
- # This file is generated automatically by
- # bin/rake gitlab:usage_data:generate_ci_template_events
- #
- # Do not edit it manually!
- BANNER
-
- all_includes = explicit_template_includes + implicit_auto_devops_includes
- yaml = banner + YAML.dump(all_includes).gsub(/ *$/m, '')
-
- File.write(Gitlab::UsageDataCounters::CiTemplateUniqueCounter::KNOWN_EVENTS_FILE_PATH, yaml)
- end
-
desc 'GitLab | UsageDataMetrics | Generate raw SQL metrics queries for RSpec'
task generate_sql_metrics_queries: :environment do
require 'active_support/testing/time_helpers'
diff --git a/locale/am_ET/gitlab.po b/locale/am_ET/gitlab.po
index 80c5ddcd0e3..2e28ac306d9 100644
--- a/locale/am_ET/gitlab.po
+++ b/locale/am_ET/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: am\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:48\n"
+"PO-Revision-Date: 2023-07-11 04:51\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] "%d ተጨማሪ አስተያየት"
msgstr[1] "%d ተጨማሪ አስተያየቶች"
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr "%{count} ተዛማጅ %{pluralized_subject}: %{links}"
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr "%{duration}ሚ"
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Filter by audit event type"
+msgstr ""
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
+msgstr ""
+
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/ar_SA/gitlab.po b/locale/ar_SA/gitlab.po
index 41dee541faa..3d9ec266722 100644
--- a/locale/ar_SA/gitlab.po
+++ b/locale/ar_SA/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ar\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:43\n"
+"PO-Revision-Date: 2023-07-11 04:46\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -115,6 +115,24 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -250,6 +268,15 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -574,24 +601,6 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -1042,9 +1051,6 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -1087,6 +1093,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -1159,7 +1168,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -1183,6 +1195,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1534,6 +1549,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1561,7 +1582,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1723,9 +1744,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -2515,6 +2533,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2968,6 +2992,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2986,12 +3013,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -3010,6 +3043,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -3019,6 +3061,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -3070,13 +3115,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -3187,9 +3232,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -3238,6 +3280,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -3493,6 +3538,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -3514,9 +3562,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3940,22 +3985,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator email"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -4039,6 +4075,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -4108,9 +4147,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -4120,9 +4156,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -4153,10 +4186,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -4165,9 +4198,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -4390,9 +4420,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -4438,6 +4465,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -4477,7 +4507,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4747,9 +4777,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4786,7 +4813,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4891,10 +4918,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -5005,9 +5032,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -5044,9 +5068,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -5143,6 +5164,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -5308,6 +5332,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -5359,12 +5386,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -5407,6 +5428,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -5566,9 +5593,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5689,9 +5713,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5782,7 +5803,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5848,12 +5869,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5863,7 +5893,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5902,6 +5932,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5914,6 +5956,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5932,6 +5977,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5956,6 +6007,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6787,9 +6841,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6895,6 +6946,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6949,7 +7003,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -7012,9 +7066,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -7162,16 +7213,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -7183,19 +7240,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Filter by audit event type"
+msgstr ""
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -7204,6 +7276,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -7231,10 +7306,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -7246,6 +7318,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7783,28 +7861,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7975,6 +8053,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -8002,10 +8083,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -8065,10 +8143,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -8080,7 +8158,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -8386,12 +8464,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -8458,9 +8542,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -8518,6 +8599,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8935,19 +9019,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -9184,6 +9277,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9682,10 +9778,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9703,10 +9799,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9730,7 +9826,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9778,13 +9877,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9826,9 +9925,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9934,7 +10030,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9952,15 +10048,18 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
@@ -9970,9 +10069,6 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -10012,7 +10108,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -10153,10 +10249,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -10183,7 +10279,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -10231,6 +10327,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -10258,16 +10357,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -10282,6 +10381,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -10309,6 +10411,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10684,6 +10789,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10741,6 +10849,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -11338,9 +11449,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -11425,9 +11533,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -11488,9 +11593,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11734,6 +11836,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11779,6 +11884,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11794,10 +11905,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11893,15 +12001,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11998,18 +12115,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -12136,15 +12247,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -12154,6 +12280,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -12190,10 +12322,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -12391,6 +12526,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -12436,13 +12574,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -12499,9 +12637,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -12538,9 +12673,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12703,15 +12835,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -13111,9 +13237,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -13237,6 +13360,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -13366,9 +13522,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -13534,6 +13687,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -13588,9 +13744,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -13633,6 +13786,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13918,6 +14074,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -14062,9 +14221,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -15298,6 +15454,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -15571,6 +15733,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -15703,6 +15868,12 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15745,9 +15916,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15781,6 +15958,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15799,6 +15979,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15823,6 +16006,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15832,6 +16018,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -16156,9 +16345,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -16315,12 +16501,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -16330,9 +16510,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -17101,7 +17278,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -17146,15 +17323,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -17440,6 +17617,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -17545,6 +17725,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17881,9 +18064,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17944,9 +18124,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17974,16 +18151,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
+msgstr ""
+
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -18148,9 +18328,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -18163,9 +18340,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -18361,12 +18535,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -18382,9 +18550,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -19345,12 +19510,18 @@ msgstr[5] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -19393,9 +19564,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -19540,6 +19708,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -19561,6 +19732,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -19627,9 +19801,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19936,6 +20107,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -20167,9 +20341,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -20179,6 +20350,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -20365,6 +20539,9 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -20425,6 +20602,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -20482,6 +20662,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -21106,9 +21289,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -21589,6 +21769,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -21628,6 +21811,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -21646,6 +21832,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -21658,6 +21847,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -21694,6 +21886,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -22123,9 +22318,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -22417,6 +22609,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -23098,12 +23293,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -23218,15 +23407,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
-
msgid "Hide comments"
msgstr ""
@@ -23377,12 +23557,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -24013,6 +24205,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -24076,6 +24271,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24898,6 +25096,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -25015,7 +25219,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -25048,9 +25252,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -26134,6 +26335,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -26491,9 +26695,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -26728,6 +26938,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -26746,6 +26959,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26911,6 +27127,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -27073,6 +27292,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -27136,9 +27361,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -27364,6 +27586,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -28030,9 +28255,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -28180,7 +28402,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -28246,6 +28468,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -28438,6 +28663,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -28471,6 +28699,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -28528,6 +28759,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -28552,9 +28786,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -28654,7 +28885,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -28705,7 +28936,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -28732,7 +28963,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -28741,7 +28972,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -28777,7 +29008,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -28798,7 +29029,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -28819,12 +29053,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -28849,7 +29089,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28882,7 +29122,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -29239,6 +29479,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -29257,6 +29500,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -29374,9 +29620,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -29404,9 +29647,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -29431,6 +29671,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -29497,6 +29740,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -29593,9 +29848,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -29650,219 +29902,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -29872,24 +29950,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -30280,6 +30346,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -30316,6 +30385,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -30376,9 +30448,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -30556,6 +30625,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -31312,12 +31387,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -31456,9 +31525,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -31501,6 +31567,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -31648,9 +31717,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31963,6 +32029,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -32068,18 +32137,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
+msgstr ""
+
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -32254,6 +32329,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32938,6 +33016,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -33463,6 +33547,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -34033,9 +34129,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -34237,6 +34330,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -34246,6 +34348,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -34303,9 +34408,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -34492,9 +34594,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -34606,6 +34705,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -34657,9 +34759,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -34678,7 +34777,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -34738,9 +34837,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -34807,6 +34912,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -34891,6 +35002,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -35017,9 +35131,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -35170,7 +35281,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -35686,6 +35797,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -35725,6 +35839,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -35866,6 +35983,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -36382,9 +36502,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -36922,18 +37039,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -37117,9 +37222,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -37141,9 +37243,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -37180,10 +37279,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -37666,6 +37762,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -37681,6 +37780,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -38473,9 +38575,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -38548,6 +38647,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -38734,7 +38836,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -38746,7 +38848,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -38761,18 +38863,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38992,13 +39082,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -39259,6 +39349,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -39283,6 +39376,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -39301,6 +39397,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -39724,7 +39823,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -40117,9 +40216,6 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -40165,12 +40261,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -40339,6 +40444,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -40444,6 +40552,9 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
@@ -40453,6 +40564,9 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -40513,9 +40627,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -40693,6 +40804,15 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -40946,7 +41066,13 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d 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[3] ""
+msgstr[4] ""
+msgstr[5] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -41269,10 +41395,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -41281,12 +41410,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -41305,6 +41455,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -41320,6 +41473,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -41329,6 +41485,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -41341,6 +41500,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -41362,6 +41527,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -41410,6 +41578,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -41896,7 +42067,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -41920,9 +42091,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -42007,9 +42175,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -42124,6 +42289,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -42247,6 +42415,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -42289,7 +42460,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -42436,6 +42607,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -42829,6 +43003,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -43009,7 +43186,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -43072,10 +43249,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -43222,6 +43405,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -43252,6 +43438,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -43261,6 +43450,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -43270,6 +43465,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -43297,6 +43495,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -43609,6 +43813,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -43693,7 +43906,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -43702,9 +43915,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -44017,7 +44227,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -44242,6 +44452,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -44812,6 +45025,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -44950,9 +45166,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -45154,9 +45367,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -45205,7 +45415,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -45640,6 +45850,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -45871,10 +46087,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -46138,7 +46354,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -46228,6 +46444,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -46408,9 +46639,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -46675,9 +46903,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -46756,13 +46981,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -46966,9 +47191,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -46984,9 +47215,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -47113,6 +47341,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -47341,6 +47572,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -47551,6 +47785,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -47692,6 +47929,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -48073,9 +48313,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -48247,9 +48484,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -48529,6 +48763,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -48622,13 +48859,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -48697,6 +48931,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -48724,9 +48961,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -48802,6 +49036,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -48811,6 +49048,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -48982,9 +49225,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -48994,6 +49234,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -49042,12 +49285,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -49126,6 +49363,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -49459,12 +49699,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -49522,9 +49756,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -49708,9 +49939,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -49762,7 +49990,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -49783,6 +50011,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -49792,9 +50023,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -50074,7 +50302,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -50122,6 +50350,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -50161,16 +50392,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -50230,7 +50455,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -50539,6 +50770,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -50692,9 +50926,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -50713,6 +50953,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -50794,6 +51037,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -51043,7 +51289,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -51169,7 +51415,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -51184,9 +51430,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -51268,15 +51511,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -51307,9 +51541,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -51364,9 +51595,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -51388,6 +51616,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -51400,9 +51631,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -51757,6 +51985,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -51811,6 +52042,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -51886,6 +52120,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -51943,9 +52180,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -51985,9 +52219,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -52006,9 +52237,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -52396,6 +52624,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -52723,6 +52954,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -52822,6 +53056,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -52846,9 +53083,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -52963,6 +53197,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -53041,6 +53281,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -53137,6 +53380,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -53251,9 +53497,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -53542,6 +53785,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -53989,6 +54235,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -54040,6 +54292,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -54100,7 +54358,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -54268,10 +54526,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -54577,7 +54838,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -55043,10 +55304,13 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
msgid "comment"
msgstr ""
@@ -55285,18 +55549,6 @@ msgstr[5] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -55411,7 +55663,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -55420,6 +55672,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -55618,9 +55873,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -55807,9 +56059,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -55939,9 +56188,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -56005,16 +56251,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -56053,6 +56299,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -56086,9 +56338,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -56168,7 +56417,13 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
msgid "or"
msgstr ""
@@ -56524,6 +56779,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -56581,9 +56839,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -56716,9 +56971,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/as_IN/gitlab.po b/locale/as_IN/gitlab.po
index 99139bb4cb5..a03a2d78e00 100644
--- a/locale/as_IN/gitlab.po
+++ b/locale/as_IN/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: as\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:48\n"
+"PO-Revision-Date: 2023-07-11 04:50\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/az_AZ/gitlab.po b/locale/az_AZ/gitlab.po
index 52b24c2934a..40992ad49b8 100644
--- a/locale/az_AZ/gitlab.po
+++ b/locale/az_AZ/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: az\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:47\n"
+"PO-Revision-Date: 2023-07-11 04:49\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/ba_RU/gitlab.po b/locale/ba_RU/gitlab.po
index 3af9307fc44..dd03aac726f 100644
--- a/locale/ba_RU/gitlab.po
+++ b/locale/ba_RU/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ba\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:48\n"
+"PO-Revision-Date: 2023-07-11 04:50\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -95,6 +95,14 @@ msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -155,6 +163,10 @@ msgid "%d assigned issue"
msgid_plural "%d assigned issues"
msgstr[0] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -299,14 +311,6 @@ msgid "%d more comment"
msgid_plural "%d more comments"
msgstr[0] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -562,9 +566,6 @@ msgid "%{count} project"
msgid_plural "%{count} projects"
msgstr[0] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -607,6 +608,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -679,7 +683,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -703,6 +710,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1009,6 +1019,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1036,7 +1052,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1148,9 +1164,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1805,6 +1818,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2258,6 +2277,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2276,12 +2298,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2300,6 +2328,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2309,6 +2346,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2360,13 +2400,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2477,9 +2517,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2528,6 +2565,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2783,6 +2823,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2804,9 +2847,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3230,22 +3270,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3329,6 +3360,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3398,9 +3432,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3410,9 +3441,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3443,10 +3471,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3455,9 +3483,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3680,9 +3705,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3728,6 +3750,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3767,7 +3792,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4037,9 +4062,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4076,7 +4098,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4181,10 +4203,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4295,9 +4317,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4334,9 +4353,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4433,6 +4449,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4598,6 +4617,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4649,12 +4671,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4697,6 +4713,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4856,9 +4878,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -4974,9 +4993,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5062,7 +5078,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5128,12 +5144,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5143,7 +5168,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5182,6 +5207,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5194,6 +5231,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5212,6 +5252,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5236,6 +5282,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6012,9 +6061,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6095,6 +6141,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6149,7 +6198,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6207,9 +6256,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6347,16 +6393,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6368,19 +6420,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Filter by audit event type"
+msgstr ""
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6389,6 +6456,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6416,10 +6486,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6431,6 +6498,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -6968,28 +7041,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7160,6 +7233,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7187,10 +7263,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7250,10 +7323,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7265,7 +7338,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7556,12 +7629,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7623,9 +7702,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7683,6 +7759,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8100,19 +8179,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8349,6 +8437,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -8842,10 +8933,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -8863,10 +8954,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -8890,7 +8981,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -8938,13 +9032,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -8986,9 +9080,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9094,7 +9185,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9107,22 +9198,22 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9162,7 +9253,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9303,10 +9394,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9333,7 +9424,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9381,6 +9472,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9408,16 +9502,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9432,6 +9526,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9459,6 +9556,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -9829,6 +9929,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -9886,6 +9989,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10478,9 +10584,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10565,9 +10668,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10628,9 +10728,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -10874,6 +10971,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -10919,6 +11019,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -10934,10 +11040,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11033,15 +11136,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11133,18 +11245,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11271,15 +11377,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11289,6 +11410,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11325,10 +11452,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export full report as CSV"
+msgstr ""
+
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11526,6 +11656,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11571,13 +11704,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11634,9 +11767,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11673,9 +11803,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -11838,15 +11965,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12231,9 +12352,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12357,6 +12475,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12486,9 +12637,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12654,6 +12802,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12708,9 +12859,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12753,6 +12901,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13038,6 +13189,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13182,9 +13336,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14403,6 +14554,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14666,6 +14823,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14778,6 +14938,12 @@ msgid "Dependencies|%d vulnerability detected"
msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -14820,9 +14986,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -14856,6 +15028,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -14874,6 +15049,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -14898,6 +15076,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -14907,6 +15088,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15216,9 +15400,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15370,12 +15551,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15385,9 +15560,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16131,7 +16303,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16176,15 +16348,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16470,6 +16642,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16575,6 +16750,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -16911,9 +17089,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -16974,9 +17149,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17004,16 +17176,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
+msgstr ""
+
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17178,9 +17353,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17193,9 +17365,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17391,12 +17560,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17412,9 +17575,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18365,12 +18525,18 @@ msgstr[0] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18408,9 +18574,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18555,6 +18718,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18576,6 +18742,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18642,9 +18811,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -18946,6 +19112,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19177,9 +19346,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19189,6 +19355,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19370,6 +19539,9 @@ msgid "Free groups are limited to %{free_user_limit} member and the remaining me
msgid_plural "Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group."
msgstr[0] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19430,6 +19602,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19487,6 +19662,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20101,9 +20279,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20584,6 +20759,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20623,6 +20801,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20641,6 +20822,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20653,6 +20837,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20689,6 +20876,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21118,9 +21308,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21412,6 +21599,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22083,12 +22273,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22203,10 +22387,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-
msgid "Hide comments"
msgstr ""
@@ -22352,12 +22532,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -22978,6 +23170,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23036,6 +23231,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -23858,6 +24056,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -23975,7 +24179,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24008,9 +24212,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25084,6 +25285,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25441,9 +25645,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25678,6 +25888,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25696,6 +25909,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -25861,6 +26077,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26023,6 +26242,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26086,9 +26311,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26304,6 +26526,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -26935,9 +27160,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27085,7 +27307,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27151,6 +27373,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27343,6 +27568,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27376,6 +27604,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27433,6 +27664,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27457,9 +27691,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27559,7 +27790,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27610,7 +27841,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27637,7 +27868,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27646,7 +27877,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27682,7 +27913,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27703,7 +27934,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27724,12 +27958,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27754,7 +27994,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -27787,7 +28027,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28129,6 +28369,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28147,6 +28390,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28264,9 +28510,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28294,9 +28537,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28321,6 +28561,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28387,6 +28630,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28483,9 +28738,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28540,214 +28792,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28757,24 +28840,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29160,6 +29231,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29196,6 +29270,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29256,9 +29333,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29436,6 +29510,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30182,12 +30262,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30326,9 +30400,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30371,6 +30442,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30513,9 +30587,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -30808,6 +30879,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -30913,18 +30987,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31099,6 +31179,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -31773,6 +31856,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32293,6 +32382,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -32863,9 +32964,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33067,6 +33165,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33076,6 +33183,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33133,9 +33243,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33322,9 +33429,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33436,6 +33540,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33487,9 +33594,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33508,7 +33612,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33568,9 +33672,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33637,6 +33747,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33721,6 +33837,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -33847,9 +33966,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34000,7 +34116,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34516,6 +34632,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34555,6 +34674,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34696,6 +34818,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35212,9 +35337,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35752,18 +35874,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -35947,9 +36057,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -35971,9 +36078,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36010,10 +36114,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36496,6 +36597,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36511,6 +36615,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37293,9 +37400,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37368,6 +37472,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37549,7 +37656,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37561,7 +37668,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37576,18 +37683,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -37802,13 +37897,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38069,6 +38164,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38093,6 +38191,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38111,6 +38212,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38504,7 +38608,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -38877,9 +38981,6 @@ msgid "Reviewer"
msgid_plural "%d Reviewers"
msgstr[0] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -38925,12 +39026,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39079,6 +39189,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39184,10 +39297,16 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39248,9 +39367,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39423,6 +39539,10 @@ msgid "Runners|Permanently delete %d runner"
msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39676,7 +39796,8 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d 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] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -39994,10 +40115,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40006,12 +40130,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40030,6 +40175,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40045,6 +40193,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40054,6 +40205,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40066,6 +40220,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40087,6 +40247,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40135,6 +40298,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40566,7 +40732,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40590,9 +40756,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40677,9 +40840,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -40794,6 +40954,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -40917,6 +41080,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -40959,7 +41125,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41101,6 +41267,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41494,6 +41663,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41674,7 +41846,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -41737,10 +41909,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -41887,6 +42065,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -41917,6 +42098,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -41926,6 +42110,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -41935,6 +42125,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -41962,6 +42155,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42269,6 +42468,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42353,7 +42561,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42362,9 +42570,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42672,7 +42877,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -42897,6 +43102,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43467,6 +43675,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43605,9 +43816,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -43809,9 +44017,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -43860,7 +44065,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44295,6 +44500,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44521,10 +44732,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -44788,7 +44999,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -44873,6 +45084,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45043,9 +45269,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45295,9 +45518,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45376,13 +45596,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45576,9 +45796,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45594,9 +45820,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -45723,6 +45946,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -45951,6 +46177,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46161,6 +46390,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46302,6 +46534,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46683,9 +46918,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -46857,9 +47089,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47139,6 +47368,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47222,13 +47454,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47297,6 +47526,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47324,9 +47556,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47397,6 +47626,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47406,6 +47638,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47577,9 +47815,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47589,6 +47824,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47637,12 +47875,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47716,6 +47948,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48044,12 +48279,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48107,9 +48336,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48293,9 +48519,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48347,7 +48570,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48368,6 +48591,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48377,9 +48603,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48659,7 +48882,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48707,6 +48930,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -48746,16 +48972,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -48815,7 +49035,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49119,6 +49345,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49272,9 +49501,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49293,6 +49528,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49374,6 +49612,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49623,7 +49864,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -49749,7 +49990,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -49764,9 +50005,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -49848,10 +50086,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -49877,9 +50111,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -49934,9 +50165,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -49953,6 +50181,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -49965,9 +50196,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50322,6 +50550,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50376,6 +50607,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50451,6 +50685,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50508,9 +50745,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50550,9 +50784,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50571,9 +50802,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -50961,6 +51189,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51273,6 +51504,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51367,6 +51601,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51391,9 +51628,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51508,6 +51742,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51586,6 +51826,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51682,6 +51925,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -51791,9 +52037,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52082,6 +52325,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52519,6 +52765,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52570,6 +52822,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52630,7 +52888,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -52788,10 +53046,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53082,7 +53343,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53508,10 +53769,8 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
msgid "comment"
msgstr ""
@@ -53730,18 +53989,6 @@ msgstr[0] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -53846,7 +54093,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -53855,6 +54102,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54038,9 +54288,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54217,9 +54464,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54339,9 +54583,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54405,16 +54646,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54453,6 +54694,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54486,9 +54733,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54568,7 +54812,8 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
msgid "or"
msgstr ""
@@ -54889,6 +55134,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -54946,9 +55194,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55071,9 +55316,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/be_BY/gitlab.po b/locale/be_BY/gitlab.po
index e4f40e353bf..74d791297ad 100644
--- a/locale/be_BY/gitlab.po
+++ b/locale/be_BY/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: be\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:43\n"
+"PO-Revision-Date: 2023-07-11 04:46\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -107,6 +107,20 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -212,6 +226,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -464,20 +485,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -850,9 +857,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -895,6 +899,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -967,7 +974,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -991,6 +1001,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1324,6 +1337,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1351,7 +1370,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1493,9 +1512,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -2231,6 +2247,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2684,6 +2706,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2702,12 +2727,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2726,6 +2757,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2735,6 +2775,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2786,13 +2829,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2903,9 +2946,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2954,6 +2994,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -3209,6 +3252,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -3230,9 +3276,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3656,22 +3699,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator email"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3755,6 +3789,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3824,9 +3861,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3836,9 +3870,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3869,10 +3900,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3881,9 +3912,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -4106,9 +4134,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -4154,6 +4179,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -4193,7 +4221,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4463,9 +4491,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4502,7 +4527,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4607,10 +4632,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4721,9 +4746,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4760,9 +4782,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4859,6 +4878,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -5024,6 +5046,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -5075,12 +5100,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -5123,6 +5142,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -5282,9 +5307,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5403,9 +5425,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5494,7 +5513,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5560,12 +5579,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5575,7 +5603,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5614,6 +5642,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5626,6 +5666,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5644,6 +5687,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5668,6 +5717,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6477,9 +6529,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6575,6 +6624,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6629,7 +6681,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6690,9 +6742,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6836,16 +6885,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6857,19 +6912,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Filter by audit event type"
+msgstr ""
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6878,6 +6948,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6905,10 +6978,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6920,6 +6990,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7457,28 +7533,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7649,6 +7725,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7676,10 +7755,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7739,10 +7815,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7754,7 +7830,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -8054,12 +8130,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -8124,9 +8206,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -8184,6 +8263,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8601,19 +8683,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8850,6 +8941,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9346,10 +9440,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9367,10 +9461,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9394,7 +9488,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9442,13 +9539,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9490,9 +9587,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9598,7 +9692,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9614,15 +9708,18 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
@@ -9630,9 +9727,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9672,7 +9766,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9813,10 +9907,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9843,7 +9937,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9891,6 +9985,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9918,16 +10015,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9942,6 +10039,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9969,6 +10069,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10342,6 +10445,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10399,6 +10505,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10994,9 +11103,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -11081,9 +11187,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -11144,9 +11247,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11390,6 +11490,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11435,6 +11538,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11450,10 +11559,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11549,15 +11655,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11652,18 +11767,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11790,15 +11899,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11808,6 +11932,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11844,10 +11974,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -12045,6 +12178,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -12090,13 +12226,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -12153,9 +12289,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -12192,9 +12325,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12357,15 +12487,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12759,9 +12883,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12885,6 +13006,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -13014,9 +13168,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -13182,6 +13333,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -13236,9 +13390,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -13281,6 +13432,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13566,6 +13720,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13710,9 +13867,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14940,6 +15094,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -15209,6 +15369,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -15333,6 +15496,12 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15375,9 +15544,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15411,6 +15586,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15429,6 +15607,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15453,6 +15634,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15462,6 +15646,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15780,9 +15967,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15937,12 +16121,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15952,9 +16130,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16713,7 +16888,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16758,15 +16933,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -17052,6 +17227,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -17157,6 +17335,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17493,9 +17674,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17556,9 +17734,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17586,16 +17761,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
+msgstr ""
+
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17760,9 +17938,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17775,9 +17950,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17973,12 +18145,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17994,9 +18160,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18953,12 +19116,18 @@ msgstr[3] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18999,9 +19168,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -19146,6 +19312,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -19167,6 +19336,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -19233,9 +19405,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19540,6 +19709,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19771,9 +19943,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19783,6 +19952,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19967,6 +20139,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -20027,6 +20202,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -20084,6 +20262,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20704,9 +20885,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -21187,6 +21365,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -21226,6 +21407,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -21244,6 +21428,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -21256,6 +21443,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -21292,6 +21482,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21721,9 +21914,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -22015,6 +22205,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22692,12 +22885,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22812,13 +22999,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "Hide comments"
msgstr ""
@@ -22967,12 +23147,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23599,6 +23791,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23660,6 +23855,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24482,6 +24680,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24599,7 +24803,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24632,9 +24836,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25714,6 +25915,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -26071,9 +26275,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -26308,6 +26518,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -26326,6 +26539,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26491,6 +26707,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26653,6 +26872,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26716,9 +26941,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26940,6 +27162,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27592,9 +27817,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27742,7 +27964,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27808,6 +28030,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -28000,6 +28225,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -28033,6 +28261,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -28090,6 +28321,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -28114,9 +28348,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -28216,7 +28447,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -28267,7 +28498,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -28294,7 +28525,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -28303,7 +28534,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -28339,7 +28570,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -28360,7 +28591,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -28381,12 +28615,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -28411,7 +28651,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28444,7 +28684,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28795,6 +29035,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28813,6 +29056,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28930,9 +29176,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28960,9 +29203,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28987,6 +29227,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -29053,6 +29296,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -29149,9 +29404,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -29206,217 +29458,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -29426,24 +29506,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29832,6 +29900,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29868,6 +29939,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29928,9 +30002,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -30108,6 +30179,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30860,12 +30937,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -31004,9 +31075,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -31049,6 +31117,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -31194,9 +31265,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31501,6 +31569,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31606,18 +31677,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
+msgstr ""
+
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31792,6 +31869,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32472,6 +32552,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32995,6 +33081,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33565,9 +33663,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33769,6 +33864,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33778,6 +33882,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33835,9 +33942,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -34024,9 +34128,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -34138,6 +34239,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -34189,9 +34293,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -34210,7 +34311,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -34270,9 +34371,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -34339,6 +34446,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -34423,6 +34536,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34549,9 +34665,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34702,7 +34815,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -35218,6 +35331,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -35257,6 +35373,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -35398,6 +35517,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35914,9 +36036,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -36454,18 +36573,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36649,9 +36756,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36673,9 +36777,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36712,10 +36813,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -37198,6 +37296,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -37213,6 +37314,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -38001,9 +38105,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -38076,6 +38177,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -38260,7 +38364,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -38272,7 +38376,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -38287,18 +38391,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38516,13 +38608,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38783,6 +38875,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38807,6 +38902,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38825,6 +38923,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -39236,7 +39337,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39621,9 +39722,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39669,12 +39767,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39835,6 +39942,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39940,6 +40050,9 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
@@ -39947,6 +40060,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -40007,9 +40123,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -40185,6 +40298,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -40438,7 +40558,11 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d 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[3] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40759,10 +40883,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40771,12 +40898,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40795,6 +40943,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40810,6 +40961,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40819,6 +40973,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40831,6 +40988,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40852,6 +41015,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40900,6 +41066,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -41364,7 +41533,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -41388,9 +41557,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -41475,9 +41641,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41592,6 +41755,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41715,6 +41881,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41757,7 +41926,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41902,6 +42071,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -42295,6 +42467,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -42475,7 +42650,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42538,10 +42713,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42688,6 +42869,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42718,6 +42902,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42727,6 +42914,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42736,6 +42929,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42763,6 +42959,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -43073,6 +43275,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -43157,7 +43368,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -43166,9 +43377,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -43479,7 +43687,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43704,6 +43912,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -44274,6 +44485,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -44412,9 +44626,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44616,9 +44827,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44667,7 +44875,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -45102,6 +45310,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -45331,10 +45545,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45598,7 +45812,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45686,6 +45900,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45862,9 +46091,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -46123,9 +46349,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -46204,13 +46427,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -46410,9 +46633,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -46428,9 +46657,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46557,6 +46783,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46785,6 +47014,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46995,6 +47227,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -47136,6 +47371,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -47517,9 +47755,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47691,9 +47926,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47973,6 +48205,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -48062,13 +48297,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -48137,6 +48369,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -48164,9 +48399,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -48240,6 +48472,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -48249,6 +48484,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -48420,9 +48661,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -48432,6 +48670,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -48480,12 +48721,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -48562,6 +48797,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48893,12 +49131,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48956,9 +49188,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -49142,9 +49371,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -49196,7 +49422,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -49217,6 +49443,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -49226,9 +49455,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -49508,7 +49734,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -49556,6 +49782,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49595,16 +49824,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49664,7 +49887,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49971,6 +50200,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -50124,9 +50356,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -50145,6 +50383,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -50226,6 +50467,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -50475,7 +50719,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50601,7 +50845,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50616,9 +50860,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50700,13 +50941,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50735,9 +50969,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50792,9 +51023,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50814,6 +51042,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50826,9 +51057,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -51183,6 +51411,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -51237,6 +51468,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -51312,6 +51546,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -51369,9 +51606,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -51411,9 +51645,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -51432,9 +51663,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51822,6 +52050,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -52143,6 +52374,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -52240,6 +52474,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -52264,9 +52501,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -52381,6 +52615,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -52459,6 +52699,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -52555,6 +52798,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52667,9 +52913,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52958,6 +53201,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -53401,6 +53647,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -53452,6 +53704,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -53512,7 +53770,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53676,10 +53934,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53979,7 +54240,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -54429,10 +54690,11 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "comment"
msgstr ""
@@ -54663,18 +54925,6 @@ msgstr[3] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54785,7 +55035,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54794,6 +55044,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54986,9 +55239,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -55171,9 +55421,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -55299,9 +55546,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -55365,16 +55609,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -55413,6 +55657,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -55446,9 +55696,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -55528,7 +55775,11 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "or"
msgstr ""
@@ -55870,6 +56121,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55927,9 +56181,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -56058,9 +56309,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/bg/gitlab.po b/locale/bg/gitlab.po
index 45c20e77d56..4e2d14d7a3c 100644
--- a/locale/bg/gitlab.po
+++ b/locale/bg/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: bg\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:43\n"
+"PO-Revision-Date: 2023-07-11 04:46\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr "Съобщение за подаването"
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr "Подаване"
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr "ОпиÑание"
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr "От Ñъздаването на проблема до внедрÑването в крайната верÑиÑ"
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr "От прилагането на заÑвката за Ñливане до внедрÑването в крайната верÑиÑ"
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr "ОÑвежаването започна уÑпешно"
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr "ÐÑма хранилище"
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr "Планове за Ñхема"
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr "Ðктивно"
msgid "PipelineSchedules|All"
msgstr "Ð’Ñички"
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr "Преминаване към клон/етикет"
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr "Преглед на отворената заÑвка за ÑливанÐ
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr "ИÑкате ли да видите данните? Помолете админиÑтратор за доÑтъп."
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr "ОттеглÑне на заÑвката за доÑтъп"
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/bn_BD/gitlab.po b/locale/bn_BD/gitlab.po
index 81f3844cb21..c08d301fc28 100644
--- a/locale/bn_BD/gitlab.po
+++ b/locale/bn_BD/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: bn\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:46\n"
+"PO-Revision-Date: 2023-07-11 04:49\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/bn_IN/gitlab.po b/locale/bn_IN/gitlab.po
index f491c7939a2..4883fd2c89d 100644
--- a/locale/bn_IN/gitlab.po
+++ b/locale/bn_IN/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: bn-IN\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:48\n"
+"PO-Revision-Date: 2023-07-11 04:51\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/br_FR/gitlab.po b/locale/br_FR/gitlab.po
index e730abc6e76..8cb07bc71de 100644
--- a/locale/br_FR/gitlab.po
+++ b/locale/br_FR/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: br-FR\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:47\n"
+"PO-Revision-Date: 2023-07-11 04:50\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -111,6 +111,22 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -231,6 +247,14 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -519,22 +543,6 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -946,9 +954,6 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -991,6 +996,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -1063,7 +1071,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -1087,6 +1098,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1429,6 +1443,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1456,7 +1476,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1608,9 +1628,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -2373,6 +2390,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2826,6 +2849,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2844,12 +2870,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2868,6 +2900,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2877,6 +2918,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2928,13 +2972,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -3045,9 +3089,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -3096,6 +3137,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -3351,6 +3395,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -3372,9 +3419,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3798,22 +3842,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator email"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3897,6 +3932,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3966,9 +4004,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3978,9 +4013,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -4011,10 +4043,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -4023,9 +4055,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -4248,9 +4277,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -4296,6 +4322,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -4335,7 +4364,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4605,9 +4634,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4644,7 +4670,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4749,10 +4775,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4863,9 +4889,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4902,9 +4925,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -5001,6 +5021,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -5166,6 +5189,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -5217,12 +5243,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -5265,6 +5285,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -5424,9 +5450,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5546,9 +5569,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5638,7 +5658,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5704,12 +5724,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5719,7 +5748,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5758,6 +5787,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5770,6 +5811,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5788,6 +5832,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5812,6 +5862,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6632,9 +6685,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6735,6 +6785,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6789,7 +6842,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6851,9 +6904,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6999,16 +7049,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -7020,19 +7076,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Filter by audit event type"
+msgstr ""
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -7041,6 +7112,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -7068,10 +7142,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -7083,6 +7154,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7620,28 +7697,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7812,6 +7889,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7839,10 +7919,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7902,10 +7979,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7917,7 +7994,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -8220,12 +8297,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -8291,9 +8374,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -8351,6 +8431,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8768,19 +8851,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -9017,6 +9109,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9514,10 +9609,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9535,10 +9630,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9562,7 +9657,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9610,13 +9708,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9658,9 +9756,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9766,7 +9861,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9783,15 +9878,18 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
@@ -9800,9 +9898,6 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9842,7 +9937,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9983,10 +10078,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -10013,7 +10108,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -10061,6 +10156,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -10088,16 +10186,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -10112,6 +10210,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -10139,6 +10240,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10513,6 +10617,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10570,6 +10677,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -11166,9 +11276,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -11253,9 +11360,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -11316,9 +11420,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11562,6 +11663,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11607,6 +11711,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11622,10 +11732,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11721,15 +11828,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11825,18 +11941,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11963,15 +12073,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11981,6 +12106,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -12017,10 +12148,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -12218,6 +12352,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -12263,13 +12400,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -12326,9 +12463,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -12365,9 +12499,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12530,15 +12661,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12935,9 +13060,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -13061,6 +13183,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -13190,9 +13345,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -13358,6 +13510,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -13412,9 +13567,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -13457,6 +13609,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13742,6 +13897,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13886,9 +14044,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -15119,6 +15274,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -15390,6 +15551,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -15518,6 +15682,12 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15560,9 +15730,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15596,6 +15772,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15614,6 +15793,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15638,6 +15820,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15647,6 +15832,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15968,9 +16156,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -16126,12 +16311,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -16141,9 +16320,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16907,7 +17083,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16952,15 +17128,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -17246,6 +17422,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -17351,6 +17530,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17687,9 +17869,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17750,9 +17929,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17780,16 +17956,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
+msgstr ""
+
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17954,9 +18133,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17969,9 +18145,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -18167,12 +18340,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -18188,9 +18355,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -19149,12 +19313,18 @@ msgstr[4] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -19196,9 +19366,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -19343,6 +19510,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -19364,6 +19534,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -19430,9 +19603,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19738,6 +19908,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19969,9 +20142,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19981,6 +20151,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -20166,6 +20339,9 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -20226,6 +20402,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -20283,6 +20462,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20905,9 +21087,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -21388,6 +21567,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -21427,6 +21609,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -21445,6 +21630,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -21457,6 +21645,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -21493,6 +21684,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21922,9 +22116,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -22216,6 +22407,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22895,12 +23089,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -23015,14 +23203,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-
msgid "Hide comments"
msgstr ""
@@ -23172,12 +23352,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23806,6 +23998,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23868,6 +24063,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24690,6 +24888,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24807,7 +25011,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24840,9 +25044,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25924,6 +26125,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -26281,9 +26485,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -26518,6 +26728,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -26536,6 +26749,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26701,6 +26917,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26863,6 +27082,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26926,9 +27151,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -27152,6 +27374,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27811,9 +28036,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27961,7 +28183,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -28027,6 +28249,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -28219,6 +28444,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -28252,6 +28480,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -28309,6 +28540,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -28333,9 +28567,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -28435,7 +28666,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -28486,7 +28717,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -28513,7 +28744,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -28522,7 +28753,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -28558,7 +28789,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -28579,7 +28810,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -28600,12 +28834,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -28630,7 +28870,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28663,7 +28903,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -29017,6 +29257,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -29035,6 +29278,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -29152,9 +29398,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -29182,9 +29425,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -29209,6 +29449,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -29275,6 +29518,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -29371,9 +29626,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -29428,218 +29680,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -29649,24 +29728,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -30056,6 +30123,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -30092,6 +30162,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -30152,9 +30225,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -30332,6 +30402,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -31086,12 +31162,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -31230,9 +31300,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -31275,6 +31342,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -31421,9 +31491,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31732,6 +31799,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31837,18 +31907,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
+msgstr ""
+
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -32023,6 +32099,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32705,6 +32784,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -33229,6 +33314,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33799,9 +33896,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -34003,6 +34097,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -34012,6 +34115,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -34069,9 +34175,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -34258,9 +34361,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -34372,6 +34472,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -34423,9 +34526,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -34444,7 +34544,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -34504,9 +34604,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -34573,6 +34679,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -34657,6 +34769,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34783,9 +34898,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34936,7 +35048,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -35452,6 +35564,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -35491,6 +35606,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -35632,6 +35750,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -36148,9 +36269,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -36688,18 +36806,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36883,9 +36989,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36907,9 +37010,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36946,10 +37046,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -37432,6 +37529,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -37447,6 +37547,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -38237,9 +38340,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -38312,6 +38412,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -38497,7 +38600,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -38509,7 +38612,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -38524,18 +38627,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38754,13 +38845,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -39021,6 +39112,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -39045,6 +39139,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -39063,6 +39160,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -39480,7 +39580,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39869,9 +39969,6 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39917,12 +40014,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -40087,6 +40193,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -40192,6 +40301,9 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
@@ -40200,6 +40312,9 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -40260,9 +40375,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -40439,6 +40551,14 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -40692,7 +40812,12 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d 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[3] ""
+msgstr[4] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -41014,10 +41139,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -41026,12 +41154,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -41050,6 +41199,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -41065,6 +41217,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -41074,6 +41229,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -41086,6 +41244,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -41107,6 +41271,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -41155,6 +41322,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -41630,7 +41800,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -41654,9 +41824,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -41741,9 +41908,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41858,6 +42022,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41981,6 +42148,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -42023,7 +42193,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -42169,6 +42339,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -42562,6 +42735,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -42742,7 +42918,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42805,10 +42981,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42955,6 +43137,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42985,6 +43170,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42994,6 +43182,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -43003,6 +43197,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -43030,6 +43227,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -43341,6 +43544,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -43425,7 +43637,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -43434,9 +43646,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -43748,7 +43957,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43973,6 +44182,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -44543,6 +44755,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -44681,9 +44896,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44885,9 +45097,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44936,7 +45145,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -45371,6 +45580,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -45601,10 +45816,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45868,7 +46083,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45957,6 +46172,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -46135,9 +46365,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -46399,9 +46626,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -46480,13 +46704,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -46688,9 +46912,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -46706,9 +46936,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46835,6 +47062,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -47063,6 +47293,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -47273,6 +47506,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -47414,6 +47650,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -47795,9 +48034,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47969,9 +48205,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -48251,6 +48484,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -48342,13 +48578,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -48417,6 +48650,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -48444,9 +48680,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -48521,6 +48754,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -48530,6 +48766,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -48701,9 +48943,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -48713,6 +48952,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -48761,12 +49003,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -48844,6 +49080,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -49176,12 +49415,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -49239,9 +49472,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -49425,9 +49655,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -49479,7 +49706,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -49500,6 +49727,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -49509,9 +49739,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -49791,7 +50018,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -49839,6 +50066,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49878,16 +50108,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49947,7 +50171,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -50255,6 +50485,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -50408,9 +50641,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -50429,6 +50668,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -50510,6 +50752,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -50759,7 +51004,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50885,7 +51130,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50900,9 +51145,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50984,14 +51226,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -51021,9 +51255,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -51078,9 +51309,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -51101,6 +51329,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -51113,9 +51344,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -51470,6 +51698,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -51524,6 +51755,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -51599,6 +51833,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -51656,9 +51893,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -51698,9 +51932,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -51719,9 +51950,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -52109,6 +52337,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -52433,6 +52664,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -52531,6 +52765,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -52555,9 +52792,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -52672,6 +52906,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -52750,6 +52990,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -52846,6 +53089,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52959,9 +53205,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -53250,6 +53493,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -53695,6 +53941,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -53746,6 +53998,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -53806,7 +54064,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53972,10 +54230,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -54278,7 +54539,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -54736,10 +54997,12 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
msgid "comment"
msgstr ""
@@ -54974,18 +55237,6 @@ msgstr[4] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -55098,7 +55349,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -55107,6 +55358,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -55302,9 +55556,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -55489,9 +55740,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -55619,9 +55867,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -55685,16 +55930,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -55733,6 +55978,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -55766,9 +56017,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -55848,7 +56096,12 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
msgid "or"
msgstr ""
@@ -56197,6 +56450,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -56254,9 +56510,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -56387,9 +56640,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/bs_BA/gitlab.po b/locale/bs_BA/gitlab.po
index 918d17f4c25..22bc76b375e 100644
--- a/locale/bs_BA/gitlab.po
+++ b/locale/bs_BA/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: bs\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:47\n"
+"PO-Revision-Date: 2023-07-11 04:50\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -103,6 +103,18 @@ msgstr[0] "%d odobrenje"
msgstr[1] "%d odobrenja"
msgstr[2] "%d odobrenja"
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -193,6 +205,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -409,18 +427,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -754,9 +760,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -799,6 +802,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -871,7 +877,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -895,6 +904,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1219,6 +1231,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1246,7 +1264,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1378,9 +1396,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -2089,6 +2104,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2542,6 +2563,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2560,12 +2584,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2584,6 +2614,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2593,6 +2632,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2644,13 +2686,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2761,9 +2803,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2812,6 +2851,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -3067,6 +3109,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -3088,9 +3133,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3514,22 +3556,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator email"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3613,6 +3646,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3682,9 +3718,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3694,9 +3727,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3727,10 +3757,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3739,9 +3769,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3964,9 +3991,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -4012,6 +4036,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -4051,7 +4078,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4321,9 +4348,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4360,7 +4384,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4465,10 +4489,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4579,9 +4603,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4618,9 +4639,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4717,6 +4735,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4882,6 +4903,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4933,12 +4957,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4981,6 +4999,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -5140,9 +5164,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5260,9 +5281,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5350,7 +5368,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5416,12 +5434,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5431,7 +5458,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5470,6 +5497,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5482,6 +5521,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5500,6 +5542,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5524,6 +5572,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6322,9 +6373,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6415,6 +6463,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6469,7 +6520,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6529,9 +6580,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6673,16 +6721,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6694,19 +6748,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6715,6 +6784,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6742,10 +6814,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6757,6 +6826,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7294,28 +7369,28 @@ msgstr "Naplata"
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7486,6 +7561,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7513,10 +7591,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7576,10 +7651,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7591,7 +7666,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7888,12 +7963,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7957,9 +8038,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -8017,6 +8095,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8434,19 +8515,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8683,6 +8773,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9178,10 +9271,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9199,10 +9292,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9226,7 +9319,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9274,13 +9370,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9322,9 +9418,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9430,7 +9523,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9445,24 +9538,24 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9502,7 +9595,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9643,10 +9736,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9673,7 +9766,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9721,6 +9814,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9748,16 +9844,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9772,6 +9868,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9799,6 +9898,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10171,6 +10273,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10228,6 +10333,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10822,9 +10930,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10909,9 +11014,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10972,9 +11074,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11218,6 +11317,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11263,6 +11365,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11278,10 +11386,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11377,15 +11482,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11479,18 +11593,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11617,15 +11725,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11635,6 +11758,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11671,10 +11800,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export full report as CSV"
+msgstr ""
+
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11872,6 +12004,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11917,13 +12052,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11980,9 +12115,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -12019,9 +12151,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12184,15 +12313,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12583,9 +12706,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12709,6 +12829,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12838,9 +12991,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -13006,6 +13156,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -13060,9 +13213,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -13105,6 +13255,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr "Kreiraj novi zadatak"
@@ -13390,6 +13543,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13534,9 +13690,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14761,6 +14914,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -15028,6 +15187,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -15148,6 +15310,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15190,9 +15358,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15226,6 +15400,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15244,6 +15421,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15268,6 +15448,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15277,6 +15460,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15592,9 +15778,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15748,12 +15931,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15763,9 +15940,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16519,7 +16693,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16564,15 +16738,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16858,6 +17032,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16963,6 +17140,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17299,9 +17479,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17362,9 +17539,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17392,16 +17566,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
+msgstr ""
+
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17566,9 +17743,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17581,9 +17755,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17779,12 +17950,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17800,9 +17965,6 @@ msgstr "Jesi li siguran da želiš ukloniti %{bStart}%{targetIssueTitle}%{bEnd}
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18757,12 +18919,18 @@ msgstr[2] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18802,9 +18970,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18949,6 +19114,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18970,6 +19138,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -19036,9 +19207,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19342,6 +19510,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19573,9 +19744,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19585,6 +19753,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19768,6 +19939,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19828,6 +20002,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19885,6 +20062,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20503,9 +20683,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20986,6 +21163,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -21025,6 +21205,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -21043,6 +21226,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -21055,6 +21241,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -21091,6 +21280,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21520,9 +21712,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21814,6 +22003,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22489,12 +22681,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22609,12 +22795,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "Hide comments"
msgstr ""
@@ -22762,12 +22942,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23392,6 +23584,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23452,6 +23647,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24274,6 +24472,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24391,7 +24595,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24424,9 +24628,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25504,6 +25705,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25861,9 +26065,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -26098,6 +26308,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -26116,6 +26329,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26281,6 +26497,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26443,6 +26662,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26506,9 +26731,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26728,6 +26950,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27373,9 +27598,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27523,7 +27745,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27589,6 +27811,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27781,6 +28006,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27814,6 +28042,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27871,6 +28102,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27895,9 +28129,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27997,7 +28228,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -28048,7 +28279,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -28075,7 +28306,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -28084,7 +28315,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -28120,7 +28351,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -28141,7 +28372,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -28162,12 +28396,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -28192,7 +28432,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28225,7 +28465,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28573,6 +28813,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28591,6 +28834,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28708,9 +28954,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28738,9 +28981,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28765,6 +29005,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28831,6 +29074,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28927,9 +29182,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28984,216 +29236,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -29203,24 +29284,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29608,6 +29677,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29644,6 +29716,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29704,9 +29779,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29884,6 +29956,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30634,12 +30712,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30778,9 +30850,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30823,6 +30892,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30967,9 +31039,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31270,6 +31339,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31375,18 +31447,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31561,6 +31639,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32239,6 +32320,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32761,6 +32848,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33331,9 +33430,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33535,6 +33631,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33544,6 +33649,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33601,9 +33709,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33790,9 +33895,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33904,6 +34006,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33955,9 +34060,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33976,7 +34078,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -34036,9 +34138,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -34105,6 +34213,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -34189,6 +34303,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34315,9 +34432,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34468,7 +34582,7 @@ msgstr "Pokušaj ponovo"
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34984,6 +35098,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -35023,6 +35140,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -35164,6 +35284,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35680,9 +35803,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -36220,18 +36340,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36415,9 +36523,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36439,9 +36544,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36478,10 +36580,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36964,6 +37063,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36979,6 +37081,9 @@ msgstr "Zadatak promoviran u epik."
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37765,9 +37870,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37840,6 +37942,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -38023,7 +38128,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -38035,7 +38140,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -38050,18 +38155,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38278,13 +38371,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38545,6 +38638,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38569,6 +38665,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38587,6 +38686,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38992,7 +39094,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39373,9 +39475,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39421,12 +39520,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39583,6 +39691,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39688,12 +39799,18 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39754,9 +39871,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39931,6 +40045,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -40184,7 +40304,10 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d 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] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40504,10 +40627,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40516,12 +40642,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40540,6 +40687,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40555,6 +40705,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40564,6 +40717,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40576,6 +40732,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40597,6 +40759,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40645,6 +40810,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -41098,7 +41266,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -41122,9 +41290,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -41209,9 +41374,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41326,6 +41488,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41449,6 +41614,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41491,7 +41659,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41635,6 +41803,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -42028,6 +42199,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -42208,7 +42382,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42271,10 +42445,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42421,6 +42601,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42451,6 +42634,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42460,6 +42646,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42469,6 +42661,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42496,6 +42691,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42805,6 +43006,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42889,7 +43099,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42898,9 +43108,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -43210,7 +43417,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43435,6 +43642,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -44005,6 +44215,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -44143,9 +44356,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44347,9 +44557,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44398,7 +44605,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44833,6 +45040,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -45061,10 +45274,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45328,7 +45541,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45415,6 +45628,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45589,9 +45817,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45847,9 +46072,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45928,13 +46150,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -46132,9 +46354,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -46150,9 +46378,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46279,6 +46504,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46507,6 +46735,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46717,6 +46948,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46858,6 +47092,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -47239,9 +47476,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47413,9 +47647,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47695,6 +47926,9 @@ msgstr "maloprije"
msgid "Timeago|right now"
msgstr "upravo sada"
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47782,13 +48016,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47857,6 +48088,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47884,9 +48118,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47959,6 +48190,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47968,6 +48202,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -48139,9 +48379,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -48151,6 +48388,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -48199,12 +48439,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -48280,6 +48514,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48610,12 +48847,6 @@ msgstr ""
msgid "URL"
msgstr "URL"
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48673,9 +48904,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48859,9 +49087,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48913,7 +49138,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48934,6 +49159,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48943,9 +49171,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -49225,7 +49450,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -49273,6 +49498,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49312,16 +49540,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49381,7 +49603,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49687,6 +49915,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49840,9 +50071,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49861,6 +50098,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49942,6 +50182,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -50191,7 +50434,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50317,7 +50560,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50332,9 +50575,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50416,12 +50656,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50449,9 +50683,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50506,9 +50737,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50527,6 +50755,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50539,9 +50770,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50896,6 +51124,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50950,6 +51181,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -51025,6 +51259,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -51082,9 +51319,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -51124,9 +51358,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -51145,9 +51376,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51535,6 +51763,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51853,6 +52084,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51949,6 +52183,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51973,9 +52210,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -52090,6 +52324,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -52168,6 +52408,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -52264,6 +52507,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52375,9 +52621,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52666,6 +52909,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -53107,6 +53353,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -53158,6 +53410,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -53218,7 +53476,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53380,10 +53638,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53680,7 +53941,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -54122,10 +54383,10 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "comment"
msgstr "komentar"
@@ -54352,18 +54613,6 @@ msgstr[2] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54472,7 +54721,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54481,6 +54730,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54670,9 +54922,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54853,9 +55102,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54979,9 +55225,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -55045,16 +55288,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -55093,6 +55336,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -55126,9 +55375,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -55208,7 +55454,10 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "or"
msgstr ""
@@ -55543,6 +55792,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55600,9 +55852,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55729,9 +55978,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/ca_ES/gitlab.po b/locale/ca_ES/gitlab.po
index bdb3348194d..4d3d6364481 100644
--- a/locale/ca_ES/gitlab.po
+++ b/locale/ca_ES/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ca\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:43\n"
+"PO-Revision-Date: 2023-07-11 04:46\n"
msgid " %{start} to %{end}"
msgstr " Des de %{start} fins %{end}"
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] "%d fitxer modificat"
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr "Analítiques"
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr "Anònim"
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr "ag."
@@ -7131,28 +7205,28 @@ msgstr "Facturació"
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr "Xat"
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr "Trieu un tipus..."
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr "Tanca"
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr "S'està connectant..."
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr "Descripció"
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr "Tasca"
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr "Informació del grup:"
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr "Mètriques"
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr "Crea una mètrica"
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr "Mètrica nova"
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr "Tanca"
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr "Més informació"
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/cs_CZ/gitlab.po b/locale/cs_CZ/gitlab.po
index 5bb7f57bccc..4ba13456462 100644
--- a/locale/cs_CZ/gitlab.po
+++ b/locale/cs_CZ/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: cs\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:44\n"
+"PO-Revision-Date: 2023-07-11 04:46\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -107,6 +107,20 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -212,6 +226,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -464,20 +485,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -850,9 +857,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -895,6 +899,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -967,7 +974,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -991,6 +1001,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1324,6 +1337,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1351,7 +1370,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1493,9 +1512,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -2231,6 +2247,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2684,6 +2706,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2702,12 +2727,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2726,6 +2757,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2735,6 +2775,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2786,13 +2829,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2903,9 +2946,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2954,6 +2994,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -3209,6 +3252,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -3230,9 +3276,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3656,22 +3699,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator email"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3755,6 +3789,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3824,9 +3861,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3836,9 +3870,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3869,10 +3900,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3881,9 +3912,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -4106,9 +4134,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -4154,6 +4179,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -4193,7 +4221,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4463,9 +4491,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4502,7 +4527,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4607,10 +4632,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4721,9 +4746,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4760,9 +4782,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4859,6 +4878,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -5024,6 +5046,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -5075,12 +5100,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -5123,6 +5142,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -5282,9 +5307,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5403,9 +5425,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5494,7 +5513,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5560,12 +5579,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5575,7 +5603,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5614,6 +5642,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5626,6 +5666,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5644,6 +5687,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5668,6 +5717,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6477,9 +6529,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6575,6 +6624,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6629,7 +6681,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6690,9 +6742,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6836,16 +6885,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6857,19 +6912,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Filter by audit event type"
+msgstr ""
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6878,6 +6948,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6905,10 +6978,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6920,6 +6990,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr "Srp"
@@ -7457,28 +7533,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7649,6 +7725,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7676,10 +7755,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7739,10 +7815,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7754,7 +7830,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -8054,12 +8130,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -8124,9 +8206,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -8184,6 +8263,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8601,19 +8683,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8850,6 +8941,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9346,10 +9440,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9367,10 +9461,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9394,7 +9488,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9442,13 +9539,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9490,9 +9587,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9598,7 +9692,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9614,15 +9708,18 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
@@ -9630,9 +9727,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9672,7 +9766,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9813,10 +9907,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9843,7 +9937,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9891,6 +9985,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9918,16 +10015,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9942,6 +10039,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9969,6 +10069,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10342,6 +10445,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10399,6 +10505,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10994,9 +11103,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -11081,9 +11187,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -11144,9 +11247,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11390,6 +11490,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11435,6 +11538,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11450,10 +11559,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11549,15 +11655,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11652,18 +11767,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11790,15 +11899,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11808,6 +11932,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11844,10 +11974,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -12045,6 +12178,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -12090,13 +12226,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -12153,9 +12289,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -12192,9 +12325,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12357,15 +12487,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12759,9 +12883,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12885,6 +13006,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -13014,9 +13168,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -13182,6 +13333,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -13236,9 +13390,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -13281,6 +13432,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13566,6 +13720,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13710,9 +13867,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14940,6 +15094,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -15209,6 +15369,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -15333,6 +15496,12 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15375,9 +15544,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15411,6 +15586,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15429,6 +15607,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15453,6 +15634,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15462,6 +15646,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15780,9 +15967,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15937,12 +16121,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15952,9 +16130,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16713,7 +16888,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16758,15 +16933,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -17052,6 +17227,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -17157,6 +17335,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17493,9 +17674,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17556,9 +17734,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17586,16 +17761,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
+msgstr ""
+
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17760,9 +17938,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17775,9 +17950,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17973,12 +18145,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17994,9 +18160,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18953,12 +19116,18 @@ msgstr[3] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18999,9 +19168,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -19146,6 +19312,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -19167,6 +19336,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -19233,9 +19405,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19540,6 +19709,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19771,9 +19943,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19783,6 +19952,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19967,6 +20139,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -20027,6 +20202,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -20084,6 +20262,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20704,9 +20885,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -21187,6 +21365,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -21226,6 +21407,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -21244,6 +21428,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -21256,6 +21443,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -21292,6 +21482,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21721,9 +21914,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -22015,6 +22205,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22692,12 +22885,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22812,13 +22999,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "Hide comments"
msgstr ""
@@ -22967,12 +23147,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23599,6 +23791,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23660,6 +23855,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24482,6 +24680,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24599,7 +24803,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24632,9 +24836,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25714,6 +25915,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -26071,9 +26275,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -26308,6 +26518,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -26326,6 +26539,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26491,6 +26707,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26653,6 +26872,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26716,9 +26941,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26940,6 +27162,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27592,9 +27817,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27742,7 +27964,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27808,6 +28030,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -28000,6 +28225,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -28033,6 +28261,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -28090,6 +28321,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -28114,9 +28348,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -28216,7 +28447,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -28267,7 +28498,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -28294,7 +28525,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -28303,7 +28534,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -28339,7 +28570,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -28360,7 +28591,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -28381,12 +28615,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -28411,7 +28651,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28444,7 +28684,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28795,6 +29035,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28813,6 +29056,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28930,9 +29176,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28960,9 +29203,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28987,6 +29227,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -29053,6 +29296,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -29149,9 +29404,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -29206,217 +29458,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -29426,24 +29506,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29832,6 +29900,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29868,6 +29939,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29928,9 +30002,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -30108,6 +30179,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30860,12 +30937,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -31004,9 +31075,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -31049,6 +31117,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -31194,9 +31265,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31501,6 +31569,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31606,18 +31677,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
+msgstr ""
+
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31792,6 +31869,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32472,6 +32552,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32995,6 +33081,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33565,9 +33663,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33769,6 +33864,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33778,6 +33882,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33835,9 +33942,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -34024,9 +34128,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -34138,6 +34239,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -34189,9 +34293,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -34210,7 +34311,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -34270,9 +34371,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -34339,6 +34446,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -34423,6 +34536,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34549,9 +34665,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34702,7 +34815,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -35218,6 +35331,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -35257,6 +35373,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -35398,6 +35517,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35914,9 +36036,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -36454,18 +36573,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36649,9 +36756,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36673,9 +36777,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36712,10 +36813,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -37198,6 +37296,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -37213,6 +37314,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -38001,9 +38105,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -38076,6 +38177,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -38260,7 +38364,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -38272,7 +38376,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -38287,18 +38391,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38516,13 +38608,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38783,6 +38875,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38807,6 +38902,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38825,6 +38923,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -39236,7 +39337,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39621,9 +39722,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39669,12 +39767,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39835,6 +39942,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39940,6 +40050,9 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
@@ -39947,6 +40060,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -40007,9 +40123,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -40185,6 +40298,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -40438,7 +40558,11 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d 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[3] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40759,10 +40883,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40771,12 +40898,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40795,6 +40943,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40810,6 +40961,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40819,6 +40973,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40831,6 +40988,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40852,6 +41015,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40900,6 +41066,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -41364,7 +41533,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -41388,9 +41557,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -41475,9 +41641,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41592,6 +41755,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41715,6 +41881,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41757,7 +41926,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41902,6 +42071,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -42295,6 +42467,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -42475,7 +42650,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42538,10 +42713,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42688,6 +42869,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42718,6 +42902,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42727,6 +42914,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42736,6 +42929,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42763,6 +42959,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -43073,6 +43275,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -43157,7 +43368,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -43166,9 +43377,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -43479,7 +43687,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43704,6 +43912,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -44274,6 +44485,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -44412,9 +44626,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44616,9 +44827,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44667,7 +44875,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -45102,6 +45310,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -45331,10 +45545,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45598,7 +45812,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45686,6 +45900,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45862,9 +46091,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -46123,9 +46349,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -46204,13 +46427,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -46410,9 +46633,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -46428,9 +46657,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46557,6 +46783,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46785,6 +47014,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46995,6 +47227,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -47136,6 +47371,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -47517,9 +47755,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47691,9 +47926,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47973,6 +48205,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -48062,13 +48297,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -48137,6 +48369,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -48164,9 +48399,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -48240,6 +48472,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -48249,6 +48484,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -48420,9 +48661,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -48432,6 +48670,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -48480,12 +48721,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -48562,6 +48797,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48893,12 +49131,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48956,9 +49188,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -49142,9 +49371,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -49196,7 +49422,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -49217,6 +49443,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -49226,9 +49455,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -49508,7 +49734,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -49556,6 +49782,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49595,16 +49824,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49664,7 +49887,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49971,6 +50200,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -50124,9 +50356,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -50145,6 +50383,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -50226,6 +50467,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -50475,7 +50719,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50601,7 +50845,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50616,9 +50860,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50700,13 +50941,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50735,9 +50969,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50792,9 +51023,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50814,6 +51042,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50826,9 +51057,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -51183,6 +51411,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -51237,6 +51468,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -51312,6 +51546,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -51369,9 +51606,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -51411,9 +51645,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -51432,9 +51663,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51822,6 +52050,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -52143,6 +52374,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -52240,6 +52474,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -52264,9 +52501,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -52381,6 +52615,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -52459,6 +52699,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -52555,6 +52798,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52667,9 +52913,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52958,6 +53201,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -53401,6 +53647,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -53452,6 +53704,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -53512,7 +53770,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53676,10 +53934,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53979,7 +54240,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -54429,10 +54690,11 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "comment"
msgstr ""
@@ -54663,18 +54925,6 @@ msgstr[3] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54785,7 +55035,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54794,6 +55044,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54986,9 +55239,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -55171,9 +55421,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -55299,9 +55546,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -55365,16 +55609,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -55413,6 +55657,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -55446,9 +55696,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -55528,7 +55775,11 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "or"
msgstr ""
@@ -55870,6 +56121,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55927,9 +56181,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -56058,9 +56309,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/cy_GB/gitlab.po b/locale/cy_GB/gitlab.po
index 6366225029b..c7438f2b5e5 100644
--- a/locale/cy_GB/gitlab.po
+++ b/locale/cy_GB/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: cy\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:47\n"
+"PO-Revision-Date: 2023-07-11 04:49\n"
msgid " %{start} to %{end}"
msgstr " %{start} i %{end}"
@@ -115,6 +115,24 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -250,6 +268,15 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -574,24 +601,6 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -1042,9 +1051,6 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr "%{count} %{pluralized_subject} cysylltiedig: %{links}"
-
msgid "%{count} selected"
msgstr ""
@@ -1087,6 +1093,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr "%{duration}ms"
@@ -1159,7 +1168,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -1183,6 +1195,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1534,6 +1549,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1561,7 +1582,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1723,9 +1744,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -2515,6 +2533,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2968,6 +2992,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2986,12 +3013,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -3010,6 +3043,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -3019,6 +3061,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -3070,13 +3115,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -3187,9 +3232,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -3238,6 +3280,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -3493,6 +3538,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -3514,9 +3562,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3940,22 +3985,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -4039,6 +4075,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -4108,9 +4147,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -4120,9 +4156,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -4153,10 +4186,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -4165,9 +4198,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -4390,9 +4420,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -4438,6 +4465,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -4477,7 +4507,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4747,9 +4777,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4786,7 +4813,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4891,10 +4918,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -5005,9 +5032,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -5044,9 +5068,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -5143,6 +5164,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -5308,6 +5332,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -5359,12 +5386,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -5407,6 +5428,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -5566,9 +5593,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5689,9 +5713,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5782,7 +5803,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5848,12 +5869,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5863,7 +5893,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5902,6 +5932,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5914,6 +5956,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5932,6 +5977,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5956,6 +6007,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6787,9 +6841,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6895,6 +6946,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6949,7 +7003,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -7012,9 +7066,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -7162,16 +7213,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -7183,19 +7240,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -7204,6 +7276,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -7231,10 +7306,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -7246,6 +7318,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7783,28 +7861,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7975,6 +8053,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -8002,10 +8083,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -8065,10 +8143,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -8080,7 +8158,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -8386,12 +8464,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -8458,9 +8542,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -8518,6 +8599,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8935,19 +9019,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -9184,6 +9277,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9682,10 +9778,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9703,10 +9799,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9730,7 +9826,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9778,13 +9877,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9826,9 +9925,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9934,7 +10030,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9952,15 +10048,18 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
@@ -9970,9 +10069,6 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -10012,7 +10108,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -10153,10 +10249,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -10183,7 +10279,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -10231,6 +10327,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -10258,16 +10357,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -10282,6 +10381,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -10309,6 +10411,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10684,6 +10789,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10741,6 +10849,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -11338,9 +11449,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -11425,9 +11533,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -11488,9 +11593,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11734,6 +11836,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11779,6 +11884,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11794,10 +11905,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11893,15 +12001,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11998,18 +12115,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -12136,15 +12247,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -12154,6 +12280,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -12190,10 +12322,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -12391,6 +12526,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -12436,13 +12574,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -12499,9 +12637,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -12538,9 +12673,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12703,15 +12835,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -13111,9 +13237,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -13237,6 +13360,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -13366,9 +13522,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -13534,6 +13687,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -13588,9 +13744,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -13633,6 +13786,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13918,6 +14074,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -14062,9 +14221,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -15298,6 +15454,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -15571,6 +15733,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -15703,6 +15868,12 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15745,9 +15916,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15781,6 +15958,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15799,6 +15979,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15823,6 +16006,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15832,6 +16018,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -16156,9 +16345,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -16315,12 +16501,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -16330,9 +16510,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -17101,7 +17278,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -17146,15 +17323,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -17440,6 +17617,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -17545,6 +17725,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17881,9 +18064,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17944,9 +18124,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17974,16 +18151,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
+msgstr ""
+
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -18148,9 +18328,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -18163,9 +18340,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -18361,12 +18535,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -18382,9 +18550,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -19345,12 +19510,18 @@ msgstr[5] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -19393,9 +19564,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -19540,6 +19708,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -19561,6 +19732,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -19627,9 +19801,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19936,6 +20107,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -20167,9 +20341,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -20179,6 +20350,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -20365,6 +20539,9 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -20425,6 +20602,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -20482,6 +20662,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -21106,9 +21289,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -21589,6 +21769,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -21628,6 +21811,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -21646,6 +21832,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -21658,6 +21847,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -21694,6 +21886,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -22123,9 +22318,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -22417,6 +22609,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -23098,12 +23293,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -23218,15 +23407,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
-
msgid "Hide comments"
msgstr ""
@@ -23377,12 +23557,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -24013,6 +24205,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -24076,6 +24271,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24898,6 +25096,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -25015,7 +25219,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -25048,9 +25252,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -26134,6 +26335,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -26491,9 +26695,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -26728,6 +26938,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -26746,6 +26959,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26911,6 +27127,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -27073,6 +27292,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -27136,9 +27361,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -27364,6 +27586,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -28030,9 +28255,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -28180,7 +28402,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -28246,6 +28468,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -28438,6 +28663,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -28471,6 +28699,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -28528,6 +28759,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -28552,9 +28786,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -28654,7 +28885,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -28705,7 +28936,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -28732,7 +28963,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -28741,7 +28972,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -28777,7 +29008,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -28798,7 +29029,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -28819,12 +29053,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -28849,7 +29089,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28882,7 +29122,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -29239,6 +29479,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -29257,6 +29500,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -29374,9 +29620,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -29404,9 +29647,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -29431,6 +29671,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -29497,6 +29740,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -29593,9 +29848,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -29650,219 +29902,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -29872,24 +29950,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -30280,6 +30346,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -30316,6 +30385,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -30376,9 +30448,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -30556,6 +30625,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -31312,12 +31387,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -31456,9 +31525,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -31501,6 +31567,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -31648,9 +31717,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31963,6 +32029,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -32068,18 +32137,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
+msgstr ""
+
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -32254,6 +32329,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32938,6 +33016,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -33463,6 +33547,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -34033,9 +34129,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -34237,6 +34330,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -34246,6 +34348,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -34303,9 +34408,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -34492,9 +34594,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -34606,6 +34705,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -34657,9 +34759,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -34678,7 +34777,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -34738,9 +34837,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -34807,6 +34912,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -34891,6 +35002,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -35017,9 +35131,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -35170,7 +35281,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -35686,6 +35797,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -35725,6 +35839,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -35866,6 +35983,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -36382,9 +36502,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -36922,18 +37039,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -37117,9 +37222,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -37141,9 +37243,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -37180,10 +37279,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -37666,6 +37762,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -37681,6 +37780,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -38473,9 +38575,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -38548,6 +38647,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -38734,7 +38836,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -38746,7 +38848,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -38761,18 +38863,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38992,13 +39082,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -39259,6 +39349,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -39283,6 +39376,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -39301,6 +39397,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -39724,7 +39823,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -40117,9 +40216,6 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -40165,12 +40261,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -40339,6 +40444,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -40444,6 +40552,9 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
@@ -40453,6 +40564,9 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -40513,9 +40627,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -40693,6 +40804,15 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -40946,7 +41066,13 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d 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[3] ""
+msgstr[4] ""
+msgstr[5] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -41269,10 +41395,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -41281,12 +41410,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -41305,6 +41455,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -41320,6 +41473,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -41329,6 +41485,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -41341,6 +41500,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -41362,6 +41527,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -41410,6 +41578,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -41896,7 +42067,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -41920,9 +42091,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -42007,9 +42175,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -42124,6 +42289,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -42247,6 +42415,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -42289,7 +42460,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -42436,6 +42607,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -42829,6 +43003,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -43009,7 +43186,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -43072,10 +43249,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -43222,6 +43405,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -43252,6 +43438,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -43261,6 +43450,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -43270,6 +43465,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -43297,6 +43495,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -43609,6 +43813,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -43693,7 +43906,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -43702,9 +43915,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -44017,7 +44227,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -44242,6 +44452,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -44812,6 +45025,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -44950,9 +45166,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -45154,9 +45367,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -45205,7 +45415,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -45640,6 +45850,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -45871,10 +46087,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -46138,7 +46354,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -46228,6 +46444,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -46408,9 +46639,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -46675,9 +46903,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -46756,13 +46981,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -46966,9 +47191,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -46984,9 +47215,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -47113,6 +47341,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -47341,6 +47572,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -47551,6 +47785,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -47692,6 +47929,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -48073,9 +48313,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -48247,9 +48484,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -48529,6 +48763,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -48622,13 +48859,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -48697,6 +48931,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -48724,9 +48961,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -48802,6 +49036,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -48811,6 +49048,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -48982,9 +49225,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -48994,6 +49234,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -49042,12 +49285,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -49126,6 +49363,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -49459,12 +49699,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -49522,9 +49756,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -49708,9 +49939,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -49762,7 +49990,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -49783,6 +50011,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -49792,9 +50023,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -50074,7 +50302,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -50122,6 +50350,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -50161,16 +50392,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -50230,7 +50455,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -50539,6 +50770,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -50692,9 +50926,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -50713,6 +50953,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -50794,6 +51037,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -51043,7 +51289,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -51169,7 +51415,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -51184,9 +51430,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -51268,15 +51511,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -51307,9 +51541,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -51364,9 +51595,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -51388,6 +51616,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -51400,9 +51631,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -51757,6 +51985,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -51811,6 +52042,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -51886,6 +52120,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -51943,9 +52180,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -51985,9 +52219,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -52006,9 +52237,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -52396,6 +52624,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -52723,6 +52954,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -52822,6 +53056,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -52846,9 +53083,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -52963,6 +53197,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -53041,6 +53281,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -53137,6 +53380,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -53251,9 +53497,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -53542,6 +53785,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -53989,6 +54235,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -54040,6 +54292,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -54100,7 +54358,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -54268,10 +54526,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -54577,7 +54838,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -55043,10 +55304,13 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
msgid "comment"
msgstr ""
@@ -55285,18 +55549,6 @@ msgstr[5] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -55411,7 +55663,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -55420,6 +55672,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -55618,9 +55873,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -55807,9 +56059,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -55939,9 +56188,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -56005,16 +56251,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -56053,6 +56299,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -56086,9 +56338,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -56168,7 +56417,13 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
msgid "or"
msgstr ""
@@ -56524,6 +56779,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -56581,9 +56839,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -56716,9 +56971,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/da_DK/gitlab.po b/locale/da_DK/gitlab.po
index 4bfc74d1367..78eb89c4056 100644
--- a/locale/da_DK/gitlab.po
+++ b/locale/da_DK/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: da\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:44\n"
+"PO-Revision-Date: 2023-07-11 04:46\n"
msgid " %{start} to %{end}"
msgstr " %{start} til %{end}"
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] "%d godkendelse"
msgstr[1] "%d godkendelser"
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] "%d modul"
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] "%d ændret fil"
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] "%d kommentar mere"
msgstr[1] "%d kommentarer mere"
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr "%{count} relaterede %{pluralized_subject}: %{links}"
-
msgid "%{count} selected"
msgstr "%{count} valgt"
@@ -703,6 +705,9 @@ msgstr "%{docs_link_start}Hvad er Large File Storage?%{docs_link_end}"
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr "%{docs_link_start}Hvad er totrinsgodkendelse?%{docs_link_end}"
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr "%{duration} ms"
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr "%{integrations_link_start}Integreringer%{link_end} giver dig mulighed for at gøre programmer fra tredjepart en del af dit GitLab-workflow. Hvis de tilgængelige integreringer ikke opfylder dine behov, så overvej at bruge en %{webhooks_link_start}webhook%{link_end}."
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr "%{italic_start}Nyheder%{italic_end} er inaktiv og kan ikke vises."
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr "%{itemsCount} problemstillinger med en grænse på %{maxIssueCount}"
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr "%{spanStart}på linje%{spanEnd} %{errorLine}%{errorColumn}"
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr "%{spanStart}i%{spanEnd} %{errorFn}"
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr "%{start} til %{end}"
@@ -1141,8 +1158,8 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
-msgstr "%{strongOpen}Advarsel:%{strongClose} SAML-gruppelinks kan få GitLab til automatisk at fjerne medlemmer fra grupper."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
+msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
msgid_plural "%{strongStart}%{count}%{strongEnd} commits"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr "%{userName} (kan ikke sammenlægge)"
-
msgid "%{userName}'s avatar"
msgstr "%{userName}s avatar"
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr "Adgangstokens"
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr "Er du sikker?"
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr "Oprettet"
msgid "AccessTokens|Feed token"
msgstr "Feedtoken"
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr "Indgående e-mailtoken"
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr "Personlige adgangstokens"
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr "Statisk objekttoken"
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr "De er de eneste adgangskoder som accepteres når du har totrinsgodkendelse (2FA) aktiveret."
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr "Tilføj Zoom-møde"
-msgid "Add a %{type}"
-msgstr "Tilføj en %{type}"
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr "Tilføj en ny problemstilling"
msgid "Add a numbered list"
msgstr "Tilføj en nummereret liste"
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr "Tilføjet i denne version"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr "Tilføjelse af nye programmer er deaktiveret i din GitLab-instans. Kontakt din GitLab-administrator for at få tilladelsen"
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr "Yderligere tekst som skal vises på indlogningssiden"
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr "Adresse"
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr "Beskyt CI-/CD-variabler som standard"
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr "Kræv at brugere beviser ejerskab for tilpassede domæner"
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr "Indstillinger for størrelse og domæne for statiske Pages-websteder."
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr "Vigtig information om forbrug på din GitLab-instans"
msgid "AdminUsers|Is using seat"
msgstr "Bruger sæde"
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr "Det er dig!"
@@ -3870,6 +3893,9 @@ msgstr "Personlige projekter, grupper og brugerhistorik efterlades intakte"
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr "Genaktivering af en bruger vil:"
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr "Sortér efter"
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr "Efter adgangskoden er blevet opdateret vil du blive omdirigeret til indlogningsskærmen."
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr "Efter adgangskoden er blevet opdateret vil du blive omdirigeret til indlogningsskærmen hvor du kan logge ind med din nye adgangskode."
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr "Aktivitetsfeed"
msgid "AlertManagement|Alert"
msgstr "Alertbesked"
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,11 +4346,11 @@ msgstr "Der opstod en fejl ved visning af alertbeskeden. Opdater venligst siden
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr "Der opstod en fejl ved visning af alertbeskederne. Bekræft dit slutpunkts konfigurationsdetaljer for at sikre at alertbeskederne vises."
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
-msgstr "Der opstod en fejl ved opdatering af tildelerlisten. Prøv venligst igen."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
+msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
-msgstr "Der opstod en fejl ved opdatering af alertbeskedens tildelere. Prøv venligst igen."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
+msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
msgstr "Der opstod en fejl ved opdatering af alertbeskedens status."
@@ -4437,9 +4460,6 @@ msgstr "Forsæt med redigering"
msgid "AlertSettings|Prometheus"
msgstr "Prometheus"
-msgid "AlertSettings|Prometheus API base URL"
-msgstr "Grund-URL for Prometheus API"
-
msgid "AlertSettings|Reset Key"
msgstr "Nulstil nøgle"
@@ -4476,9 +4496,6 @@ msgstr "Formularen har ændringer som ikke er blevet gemt. Hvordan vil du fortsÃ
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr "URL'en må ikke være tom og skal begynde med http: eller https:."
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr "Alle grene"
msgid "All changes are committed"
msgstr "Alle ændringer er committed"
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr "Fjern også direkte brugermedlemskab fra undergrupper og projekter"
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr "Alternativ support-URL til hjælpeside og hjælperullegardin."
@@ -4791,12 +4814,6 @@ msgstr "Der er opstået en fejl"
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr "Der opstod en fejl ved tilføjelse af et udkast til tråden."
-
-msgid "An error occurred adding a new draft."
-msgstr "Der opstod en fejl ved tilføjelse af et nyt udkast."
-
msgid "An error occurred creating the new branch."
msgstr "Der opstod en fejl ved oprettelse af den nye gren."
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr "Der opstod en fejl under tjek af gruppesti. Opdater venligst og prøv igen."
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr "Der opstod en fejl under afkodning af filen."
@@ -4998,9 +5021,6 @@ msgstr "Der opstod en fejl under indlæsning af projekter."
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr "Der opstod en fejl under indlæsning af dataene. Prøv venligst igen."
-
msgid "An error occurred while loading the file"
msgstr "Der opstod en fejl under indlæsning af filen"
@@ -5117,9 +5137,6 @@ msgstr "Der opstod en fejl under opdatering af konfiguration."
msgid "An error occurred while updating labels."
msgstr "Der opstod en fejl under opdatering af etiketter."
-msgid "An error occurred while updating the comment"
-msgstr "Der opstod en fejl under opdatering af kommentaren"
-
msgid "An error occurred while updating the configuration."
msgstr "Der opstod en fejl under opdatering af konfigurationen."
@@ -5206,7 +5223,7 @@ msgstr "Der opstod en ukendt fejl."
msgid "Analytics"
msgstr "Analyse"
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr "Analyser dine afhængigheder for kendte sårbarheder."
@@ -5380,6 +5427,9 @@ msgstr "Og denne registreringstoken:"
msgid "Anonymous"
msgstr "Anonym"
+msgid "Anonymous user"
+msgstr ""
+
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"
@@ -6167,9 +6217,6 @@ msgstr "Er du sikker? Fjernelse af GPG-nøglen påvirker ikke commits som allere
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr "Er du sikker? Enheden vil blive logget ud af GitLab og alle husk mig-tokens tilbagekaldt."
-msgid "Arrange charts"
-msgstr "Opstil diagrammer"
-
msgid "Artifact"
msgstr "Artefakt"
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,8 +6359,8 @@ msgstr ""
msgid "Assign reviewer"
msgstr "Tildel kontrollant"
-msgid "Assign reviewer(s)"
-msgstr "Tildel kontrollanter"
+msgid "Assign reviewers"
+msgstr ""
msgid "Assign severity"
msgstr ""
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr "Tildeltelister ikke tilgængelige med din nuværende licens"
-msgid "Assignee(s)"
-msgstr "Tildelte"
-
msgid "Assignees"
msgstr "Tildelere"
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Filter by audit event type"
+msgstr ""
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr "Aug."
@@ -7131,28 +7205,28 @@ msgstr "Fakturering"
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr "Gruppen bruger den plan som er tilknyttet med dens forældergruppe."
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ 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."
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr "Validér konto"
msgid "Billings|Validate user account"
msgstr "Validér brugerkonto"
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr "Der opstod en fejl under oprettelse af problemstillingen. Prøv venligst
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr "Der opstod en fejl under oprettelse af listen. Prøv venligst igen."
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr "Der opstod en fejl under hentning af gruppeprojekter. Prøv venligst igen."
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr "Der opstod en fejl under hentning af problemstillinger. Genindlæs venligst siden."
@@ -7790,9 +7870,6 @@ msgstr "Udfold"
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr "Kunne ikke hente blokerende %{issuableType}s"
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr "Indlæs flere problemstillinger"
msgid "Board|Loading epics"
msgstr "Indlæser epics"
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr "Fed tekst"
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,11 +9102,11 @@ msgstr ""
msgid "Change assignee"
msgstr "Ændr tildeler"
-msgid "Change assignee(s)"
-msgstr "Ændr tildeler(e)"
+msgid "Change assignees"
+msgstr ""
-msgid "Change assignee(s)."
-msgstr "Ændr tildeler(e)."
+msgid "Change assignees."
+msgstr ""
msgid "Change branches"
msgstr ""
@@ -9031,11 +9123,11 @@ msgstr "Ændr milepæl"
msgid "Change path"
msgstr "Ændr sti"
-msgid "Change reviewer(s)"
-msgstr "Ændr kontrollanter"
+msgid "Change reviewers"
+msgstr ""
-msgid "Change reviewer(s)."
-msgstr "Ændr kontrollanter."
+msgid "Change reviewers."
+msgstr ""
msgid "Change role"
msgstr "Ændr rolle"
@@ -9058,8 +9150,11 @@ msgstr ""
msgid "Change your password"
msgstr "Ændr din adgangskode"
-msgid "Change your password or recover your current one"
-msgstr "Ændr din adgangskode eller gendan din nuværende"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
+msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
@@ -9106,14 +9201,14 @@ msgstr "Dine ændringer vil blive sammenlagt i %{branchName} da en sammenlægnin
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
-msgstr "Ændrede tildeler(e)."
+msgid "Changed assignees."
+msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
-msgstr "Ændrede kontrollanter."
+msgid "Changed reviewers."
+msgstr ""
msgid "Changed squash option to %{squash_option}"
msgstr ""
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr "Diagrammer kan ikke vises fordi anmodningen om data har fået timeout. %{documentationLink}"
-
msgid "Chat"
msgstr "Chat"
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr "%{cardType} slutter med %{lastFourDigits}"
msgid "Checkout|%{name}'s GitLab subscription"
msgstr "%{name}s GitLab-abonnement"
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr "%{quantity} GB lager"
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr "%{selectedPlanText}-plan"
@@ -9332,7 +9424,7 @@ msgstr "By"
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,12 +9565,12 @@ msgstr "Afgift"
msgid "Checkout|Total"
msgstr "I alt"
+msgid "Checkout|Total compute minutes: %{quantity}"
+msgstr ""
+
msgid "Checkout|Total storage: %{quantity} GB"
msgstr "Lager i alt: %{quantity} GB"
-msgid "Checkout|Total units of compute: %{quantity}"
-msgstr ""
-
msgid "Checkout|Users"
msgstr "Brugere"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr "virksomhed eller team"
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr "Vælg en type ..."
msgid "Choose file…"
msgstr "Vælg fil …"
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr "Vælg topniveaugruppen for dine depotimporter."
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr "Kloner problemstillingen, uden kommentarer, til %{project}."
msgid "Close"
msgstr "Luk"
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr "Luk %{issueType}"
@@ -10057,6 +10161,9 @@ msgstr "Lukker denne %{quick_action_target}."
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr "Avancerede valgmuligheder på Kubernetes-klyngens integrering"
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr "Amazon EKS"
@@ -10737,9 +10841,6 @@ msgstr "Vidste du det?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr "Aktivér eller deaktivér GitLabs forbindelse til din Kubernetes-klynge."
@@ -10800,9 +10901,6 @@ msgstr "Integrering deaktiveret"
msgid "ClusterIntegration|Integration enabled"
msgstr "Integrering aktiveret"
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr "Commit slettet"
msgid "Commit message"
msgstr "Commit-meddelelse"
-msgid "Commit message (optional)"
-msgstr "Commit-meddelelse (valgfrit)"
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr "Commit-statistik for %{ref} %{start_time} - %{end_time}"
-msgid "Commit to %{branchName} branch"
-msgstr "Commit til grenen %{branchName}"
-
msgid "CommitBoxTitle|Commit"
msgstr "Commit"
@@ -11444,15 +11551,30 @@ msgstr "Der er intet at sammenligne."
msgid "CompareRevisions|Branches"
msgstr "Grene"
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr "Sammenlign"
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr "Opret sammenlægningsanmodning"
msgid "CompareRevisions|Filter by Git revision"
msgstr "Filtrér efter Git-revision"
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr "Vælg Git-revision"
@@ -11462,6 +11584,12 @@ msgstr "Vælg gren/mærkat"
msgid "CompareRevisions|Select target project"
msgstr "Vælg målprojekt"
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr "Fuldført"
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,15 +11878,15 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
+msgid "Compute minutes"
+msgstr ""
+
msgid "Compute quota"
msgstr ""
msgid "Compute quota:"
msgstr ""
-msgid "Confidence"
-msgstr "Selvtillid"
-
msgid "Confidential"
msgstr "Fortroligt"
@@ -11807,9 +11941,6 @@ msgstr "Konfigurer Gitaly-timeouts."
msgid "Configure Integrations"
msgstr "Konfigurer integreringer"
-msgid "Configure Prometheus"
-msgstr "Konfigurer 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 ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr "Konfigurer eksisterende installation"
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr "Opretter forbindelse ..."
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr "Fejl ved forbindelse"
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr "Kopiér link"
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr "Kopiér link til diagram"
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr "Kunne ikke fjerne udløseren."
msgid "Could not restore the group"
msgstr "Kunne ikke gendanne gruppen"
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr "Opret %{environment}"
msgid "Create %{humanized_resource_name}"
msgstr "Opret %{humanized_resource_name}"
-msgid "Create %{type}"
-msgstr "Opret %{type}"
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr "Opret en ny gren"
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr "Opret en ny problemstilling"
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr "Maksimale længde %{maxLength} tegn"
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr "Navn kræves"
@@ -13358,9 +13513,6 @@ msgstr "Opretter"
msgid "Creating epic"
msgstr "Opretter epic"
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr "Slet variabel"
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] "%d sårbarhed registreret"
msgstr[1] "%d sårbarheder registreret"
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr "%{remainingLicensesCount} mere"
@@ -15005,9 +15172,15 @@ msgstr "Placering og afhængighedssti"
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr "lykkedes"
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr "Beskriv målet for ændringerne og hvad kontrollanter skal være opmærk
msgid "Description"
msgstr "Beskrivelse"
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr "Beskrivelse (valgfrit)"
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr "Download (%{fileSizeReadable})"
msgid "Download (%{size})"
msgstr "Download (%{size})"
-msgid "Download CSV"
-msgstr "Download CSV"
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr "Download artefakter"
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr "Download koder"
@@ -16664,6 +16837,9 @@ msgstr "Rediger offentlig udsendelsesnøgle"
msgid "Edit sidebar"
msgstr "Rediger sidebjælke"
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr "Rediger tabel"
@@ -16769,6 +16945,9 @@ msgstr "E-mail kunne ikke sendes"
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr "E-mail ikke verificeret. Verificer venligst din e-mail i Salesforce."
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr "Indtast din adgangskode for at godkende"
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr "Job"
-msgid "Environments|Learn about environments"
-msgstr "Lær om miljøer"
-
msgid "Environments|Learn more about stopping environments"
msgstr "Lær mere om at stoppe miljøer"
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr "Nyt miljø"
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr "Epics, problemstillinger og sammenlægningsanmodninger"
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr "%{startDate} – %{dueDate}"
-
-msgid "Epics|%{startDate} – No due date"
-msgstr "%{startDate} – ingen forfaldsdato"
-
msgid "Epics|Add a new epic"
msgstr "Tilføj en ny epic"
@@ -17606,9 +17770,6 @@ msgstr "Er du sikker på, at du vil fjerne %{bStart}%{targetIssueTitle}%{bEnd} f
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr "Lad den være tom for at nedarve fra milepælsdatoer"
-msgid "Epics|No start date – %{dueDate}"
-msgstr "Ingen startdato – %{dueDate}"
-
msgid "Epics|Remove epic"
msgstr "Fjern epic"
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr "Mislykket"
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr "Kunne ikke tilføje et Zoom-møde"
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr "Kunne ikke anvende kommandoer."
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr "Kunne ikke oprette en gren for problemstillingen. Prøv venligst igen."
@@ -18752,6 +18916,9 @@ msgstr "Kunne ikke fjerne et Zoom-møde"
msgid "Failed to remove a to-do item for the design."
msgstr "Kunne ikke fjerne et gøremålselement for designet."
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr "Kunne ikke hente side"
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr "Kunne ikke gemme sammenlægningskonfliktløsninger. Prøv venligst igen!"
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr "Kunne ikke gemme nye indstillinger"
@@ -18839,9 +19009,6 @@ msgstr "Favicon fjernes. Er du sikker?"
msgid "Feature Flags"
msgstr "Funktionsflag"
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr "Status for funktionsflag"
@@ -19144,6 +19311,9 @@ msgstr "Filer med store ændringer er sammenfoldet som standard."
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr "Fra %{providerTitle}"
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr "Fra sammenlægning af sammenlægningsanmodning til udsendelse til produktion"
@@ -19686,6 +19862,9 @@ msgstr "Generer ny eksport"
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr "Kom godt i gang med GitLab"
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr "Kom godt i gang med ydelsesovervågning"
-
msgid "Get started!"
msgstr "Kom godt i gang!"
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr "https://gitpod.example.com"
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr "Gruppeinformation:"
msgid "Group information"
msgstr "Gruppeinformation"
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr "Gruppér job efter"
@@ -21613,6 +21801,9 @@ msgstr "SCIM-token"
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr "Skjul arkiverede projekter"
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] "Skjul diagram"
-msgstr[1] "Skjul diagrammer"
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr "Husarbejde"
msgid "Housekeeping successfully started"
msgstr "Husarbejde startet"
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr "Hvordan konfigurerer jeg Akismet?"
msgid "How do I configure this integration?"
msgstr "Hvordan konfigurerer jeg integreringen?"
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr "Hvordan genererer jeg den?"
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr "Forbedr kundesupport med serviceskranke"
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,8 +24387,8 @@ msgstr "Indsæt kolonne før"
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
-msgstr "Indsæt link"
+msgid "Insert link (%{modifierKey}K)"
+msgstr ""
msgid "Insert or edit diagram"
msgstr ""
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr "Installer GitLab Runner og sørg for at det kører."
-msgid "Install on clusters"
-msgstr "Installer på klynger"
-
msgid "Installation"
msgstr "Installation"
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr "Det er dig"
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr "Kursiv tekst"
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr "Job %{jobName}"
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr "Jobbet sidder fast. Tjek runnere."
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr "må mislykkes"
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr "Kerberos-adgang afvist"
@@ -26516,6 +26738,9 @@ msgstr "Sidste %{days} dage"
msgid "Last 2 weeks"
msgstr "Sidste 2 uger"
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr "Sidst tilgået"
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr "Link kopieret"
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr "Indlæser mere"
msgid "Loading snippet"
msgstr "Indlæser udklip"
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr "LÃ¥ste debatten."
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr "LÃ¥ser debatten."
@@ -27562,6 +27787,9 @@ msgstr "HÃ¥ndter projekter."
msgid "Manage two-factor authentication"
msgstr "HÃ¥ndter totrinsgodkendelse"
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr "Håndter dit projekts udløsere"
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr "Mar."
@@ -27652,6 +27883,9 @@ msgstr "Tilføj kursiv tekst (%{modifierKey}I)"
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr "Tilføj kursiv tekst (%{modifier_key}I)"
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,8 +28009,8 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
-msgstr "Maks. filstørrelse er 200 KB."
+msgid "Max file size is 200 KiB."
+msgstr ""
msgid "Max role"
msgstr "Maks. rolle"
@@ -27829,8 +28060,8 @@ msgstr "Maksimale størrelse for artefakter (MB)"
msgid "Maximum attachment size"
msgstr "Maksimale størrelse på vedhæftning"
-msgid "Maximum attachment size (MB)"
-msgstr "Maksimale størrelse på vedhæftning (MB)"
+msgid "Maximum attachment size (MiB)"
+msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
msgstr ""
@@ -27856,8 +28087,8 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr "Maksimale størrelse på diff-patch"
-msgid "Maximum diff patch size (Bytes)"
-msgstr "Maksimale størrelse på diff-patch (byte)"
+msgid "Maximum diff patch size (bytes)"
+msgstr ""
msgid "Maximum duration of a session."
msgstr ""
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,8 +28132,8 @@ msgstr ""
msgid "Maximum import size"
msgstr "Maksimale størrelse på import"
-msgid "Maximum import size (MB)"
-msgstr "Maksimale størrelse på import (MB)"
+msgid "Maximum import size (MiB)"
+msgstr ""
msgid "Maximum job artifact size"
msgstr "Maksimale størrelse på jobartefakt"
@@ -27922,7 +28153,10 @@ msgstr "Maksimale filstørrelse for npm-pakke i byte"
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,8 +28213,8 @@ msgstr ""
msgid "Maximum push size"
msgstr "Maksimale størrelse på push"
-msgid "Maximum push size (MB)"
-msgstr "Maksimale størrelse på push (MB)"
+msgid "Maximum push size (MiB)"
+msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
msgstr ""
@@ -28006,8 +28246,8 @@ msgstr "Maksimale størrelse på importfiler."
msgid "Maximum size of individual attachments in comments."
msgstr "Maksimale størrelse på individuelle vedhæftninger i kommentarer."
-msgid "Maximum size of pages (MB)"
-msgstr "Maksimale størrelse på sider (MB)"
+msgid "Maximum size of pages (MiB)"
+msgstr ""
msgid "Maximum snippet size"
msgstr "Maksimale størrelse på udklip"
@@ -28351,6 +28591,9 @@ msgstr "Sammenlægningsanalyse"
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr "Der opstod en fejl under gemning af kladdekommentaren."
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr "Kunne ikke gemme kommentaren"
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr "Vis fil @ %{commitId}"
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr "Vis erstattet fil @ %{commitId}"
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr "kommenterede på commiten %{commitLink}"
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr "MÃ¥linger"
-
msgid "Metrics - Grafana"
msgstr "MÃ¥linger - Grafana"
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr "2. Indsæt panel-YAML i betjeningspanel"
-
-msgid "Metrics|Add metric"
-msgstr "Tilføj måling"
-
-msgid "Metrics|Add panel"
-msgstr "Tilføj panel"
-
-msgid "Metrics|Avg"
-msgstr "Gns."
-
-msgid "Metrics|Back to dashboard"
-msgstr "Tilbage til betjeningspanel"
-
-msgid "Metrics|Cancel"
-msgstr "Annuller"
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr "Sammenfold panel"
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr "Sammenfold panel (Esc)"
-
-msgid "Metrics|Copy YAML"
-msgstr "Kopiér YAML"
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr "Kopiér og indsæt panel-YAML'en i din betjeningspanel-YAML-fil."
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr "Opret tilpasset betjeningspanel %{fileName}"
-
msgid "Metrics|Create metric"
msgstr "Opret måling"
-msgid "Metrics|Create new dashboard"
-msgstr "Opret nyt betjeningspanel"
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr "Nuværende"
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr "Angiv panel-YAML nedenunder for at forhåndsvise panel."
-
msgid "Metrics|Delete metric"
msgstr "Slet måling"
msgid "Metrics|Delete metric?"
msgstr "Slet måling?"
-msgid "Metrics|Duplicate"
-msgstr "Dupliker"
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr "Dupliker nuværende betjeningspanel"
-
-msgid "Metrics|Duplicate dashboard"
-msgstr "Dupliker betjeningspanel"
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr "Dupliker betjeningspanelet for at tilføje panel eller redigere betjeningspanel-YAML."
-
-msgid "Metrics|Duplicating..."
-msgstr "Duplikerer ..."
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr "Rediger betjeningspanel-YAML"
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] "Rediger måling"
-msgstr[1] "Rediger målinger"
-
-msgid "Metrics|Expand panel"
-msgstr "Udfold panel"
+msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr "Til gruppering af lignende målinger"
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr "Maks."
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr "Min."
-
-msgid "Metrics|More actions"
-msgstr "Flere handlinger"
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr "Ny måling"
-msgid "Metrics|Open repository"
-msgstr "Ã…bn depot"
-
-msgid "Metrics|Panel YAML"
-msgstr "Panel-YAML"
-
-msgid "Metrics|Panel YAML copied"
-msgstr "Panel-YAML kopieret"
-
-msgid "Metrics|Preview panel"
-msgstr "Forhåndsvis panel"
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr "Opdater betjeningspanel"
-
-msgid "Metrics|Select a value"
-msgstr "Vælg en værdi"
-
-msgid "Metrics|Set refresh rate"
-msgstr "Indstil opdateringshastighed"
-
-msgid "Metrics|Star dashboard"
-msgstr "Stjernemarkér betjeningspanel"
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr "Der opstod en fejl ved oprettelse af betjeningspanelet."
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr "Der opstod en fejl ved oprettelse af betjeningspanelet. %{error}"
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr "Der opstod en fejl ved hentning af annoteringer. Prøv venligst igen."
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr "Der opstod en fejl under hentning af miljødataene. Prøv venligst igen"
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr "Der var en fejl under hentning af annoteringsinformation."
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr "Der opstod en fejl under hentning af udsendelsesinformation."
-
-msgid "Metrics|There was an error getting environments information."
-msgstr "Der opstod en fejl under hentning af miljøinformation."
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr "Der opstod en fejl ved hentning af valgmuligheder for variablen \"%{name}\"."
-
msgid "Metrics|There was an error trying to validate your query"
msgstr "Der opstod en fejl under forsøg på at validere din forespørgsel"
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr "Der opstod en fejl under indhentning af målinger"
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr "Der opstod en fejl under indhentning af målinger. %{message}"
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr "For at oprette et ny betjeningspanel tilføjes en ny YAML-fil til %{codeStart}.gitlab/dashboards%{codeEnd} i roden af projektet."
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr "Uventet udsendelsesdatasvar fra prometheus-slutpunkt"
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr "Værdier"
-
-msgid "Metrics|View documentation"
-msgstr "Vis dokumentation"
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr "Du kan gemme en kopi af betjeningspanelet til dit depot, så det kan tilpasses. Vælg et filnavn og en gren for at gemme det."
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr "Du er ved at slette målingen permanent. Det kan ikke fortrydes."
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr "Luk"
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr "Ændret"
@@ -29480,9 +29556,6 @@ msgstr "Mere information"
msgid "More information is available|here"
msgstr "Der findes mere information|her"
-msgid "More information."
-msgstr "Mere information."
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr "Navnerums-id:"
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr "Ingen data fundet"
-
-msgid "No data to display"
-msgstr "Ingen data at vise"
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr "Ingen udsendelser registreret. Brug miljøer til at styre din softwares løbende udsendelse. %{linkStart}Lær mere om udsendelsesjob%{linkEnd}."
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr "Ingen relaterede sammenlægningsanmodninger fundet."
-
msgid "No repository"
msgstr "Intet depot"
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr "Antal replikaer"
msgid "Number of shards"
msgstr "Antal shards"
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr "OK"
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr "Forælderløst medlem"
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr "Pipelineplanlægninger"
msgid "Pipeline URL"
msgstr "Pipeline-URL"
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr "Aktiv"
msgid "PipelineSchedules|All"
msgstr "Alle"
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr "Ryd runnermellemlagre"
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr "Dette er en barnepipeline i forælderpipelinen"
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr "Projektet er i øjeblikket ikke opsat til at køre pipelines."
msgid "Pipelines|Token"
msgstr "Token"
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr "ugyldig"
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr "Udløserforfatter"
@@ -34081,9 +34199,6 @@ msgstr "Bekræft venligst din e-mailadresse"
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr "Kontakt venligst en administrator for at registrere runnere."
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr "Kontakt venligst din GitLab-administrator hvis du tror det er en fejl."
@@ -34234,7 +34349,7 @@ msgstr "Prøv venligst igen"
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr "Prøv venligst at opdatere siden. Hvis problemet fortsætter, så kontakt venligst supporten."
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr "på"
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 " Du er ved at slette %{yourAccount} og alle de problemstillinger, sammenlægningsanmodninger og grupper som er linket til din konto permanent. Når du har bekræftet %{deleteAccount}, så kan det ikke fortrydes eller gendannes."
+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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr " Du er ved at ændre brugernavnet %{currentUsernameBold} til %{newUsernameBold}. Profil og projekter vil blive omdirigeret til navnerummet %{newUsername} men omdirigeringen udløber når navnerummet %{currentUsername} registreres af en anden bruger eller gruppe. Opdater venligst dit Git-depotremotes så snart som muligt."
@@ -35446,9 +35570,6 @@ msgstr "Projektinformation:"
msgid "Project information"
msgstr "Projektinformation"
-msgid "Project is required when cluster_type is :project"
-msgstr "Projekt er krævet når cluster_type er :project"
-
msgid "Project members"
msgstr "Projektmedlemmer"
@@ -35986,18 +36107,6 @@ msgstr "Internt"
msgid "ProjectSettings|Issues"
msgstr "Problemstillinger"
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr "LFS-objekter fra depotet er tilgængelige til forgreninger. %{linkStart}Hvordan fjerner jeg dem?%{linkEnd}"
@@ -36181,9 +36290,6 @@ msgstr "Indsend ændringer som skal sammenlægges upstream."
msgid "ProjectSettings|Target project"
msgstr "MÃ¥lprojekt"
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr "Upstream-projekt"
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr "Forfrem til gruppeetiket"
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr "Kun projektmilepæle kan forfremmes."
@@ -36745,6 +36848,9 @@ msgstr "Forfrem problemstilling til en epic."
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr "Forfremmelse understøttes ikke."
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr "Forespørgsel"
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr "Sat i kø"
@@ -37604,6 +37707,9 @@ msgstr "Læs mere om GitLab på %{link_to_promo}."
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr "Læs deres dokumentation."
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr "Din GitLab-gruppe"
-
-msgid "Registration|Your first project"
-msgstr "Dit første projekt"
-
-msgid "Registration|Your profile"
-msgstr "Din profil"
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr "Fjern adgang"
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr "Forny abonnement"
msgid "Reopen"
msgstr "Genåbn"
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr "Genåbn %{issueType}"
@@ -38331,6 +38428,9 @@ msgstr "Genåbn denne %{quick_action_target}"
msgid "Reopened this %{quick_action_target}."
msgstr "Genåbnede denne %{quick_action_target}."
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr "Erstat alle etiketter"
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr "Erstat fil"
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] "Kontrollant"
msgstr[1] "%d kontrollanter"
-msgid "Reviewer(s)"
-msgstr "Kontrollanter"
-
msgid "Reviewers"
msgstr "Kontrollanter"
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr "Rolle"
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr "Tilbagerul"
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr "Ruby"
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr "Der er opstået en fejl under hentning af instruktioner"
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr "Platform"
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr "Gemmer"
msgid "Saving project."
msgstr "Gemmer projekt."
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr "Konfigurationsvejledning"
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr "Regelsættype"
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr "Der opstod en fejl ved tilføjelse af kommentaren."
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr "Der opstod en fejl ved oprettelse af problemstillingen."
@@ -41941,7 +42114,7 @@ msgstr "Vælg et gennemløb"
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,11 +42177,17 @@ msgstr ""
msgid "Select projects"
msgstr "Vælg projekter"
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
-msgstr "Vælg kontrollanter"
+msgid "Select reviewers"
+msgstr ""
msgid "Select severity (optional)"
msgstr ""
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr "Aktivér serviceskranke"
@@ -42202,6 +42393,9 @@ msgstr "Kontakt venligst en administrator for at få hjælp med at opsætning se
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr "Problemstillinger som er oprettet med e-mails fra serviceskranken vises her. Hver kommentar bliver en del af e-mail-samtalen."
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr "Serviceskranke er ikke aktiveret"
@@ -42229,6 +42423,12 @@ msgstr "Dine brugere kan sende e-mails til denne adresse:"
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr "Vis detaljer"
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr "Vis filvælger"
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,8 +43147,8 @@ msgstr "Størrelse"
msgid "Size Limits"
msgstr "Størrelsesgrænser"
-msgid "Size limit per repository (MB)"
-msgstr "Størrelsesgrænse pr. depot (MB)"
+msgid "Size limit per repository (MiB)"
+msgstr ""
msgid "Skip to main content"
msgstr ""
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr "Filer"
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr "Spamlog indsendt som ham."
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr "Start sammenlægningstog"
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,8 +44335,8 @@ msgstr "Ukendt"
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
-msgstr "Gennemstreget"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
+msgstr ""
msgid "Strikethrough text"
msgstr ""
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr "Skift gren/mærkat"
msgid "Switch to GitLab Next"
msgstr "Skift til GitLab Next"
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr "beskyttet"
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr "Problemstillingsporingen er stedet hvor ting tilføjes som har brug for
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr "Problemstillingsporingen er stedet hvor ting tilføjes som har brug for at blive forbedret eller løst i et projekt. Du kan tilmelde eller logge ind for at oprette problemstillinger til projektet."
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,15 +45873,15 @@ msgstr "Den nuværende problemstilling"
msgid "The current user is not authorized to access the job log."
msgstr ""
+msgid "The current user is not authorized to create the pipeline schedule"
+msgstr ""
+
msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
-msgstr "Datakilden er tilsluttet men der er ingen data at vise. %{documentationLink}"
-
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
msgstr ""
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr "Den maksimale tilladte filstørrelse er %{size}."
@@ -45872,9 +46099,6 @@ msgstr "Den maksimale tilladte filstørrelse er %{size}."
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr "Sammenlægningskonflikterne for sammenlægningen kan ikke løses gennem GitLab. Prøv venligst at løs dem lokalt."
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr "Udklippet kan ikke tilgås uden godkendelse."
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr "Udklippet er kun synligt for mig."
@@ -46229,6 +46456,9 @@ msgstr "Der var problemer med at hente emojier."
msgid "There was a problem fetching epics."
msgstr "Der var problemer med at hente epics."
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr "Der var problemer med at hente grupper."
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr "Der opstod en fejl med reCAPTCHA'en. Løs venligst reCAPTCHA'en igen."
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
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."
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr "lige nu"
msgid "Timeago|right now"
msgstr "lige nu"
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr "Titel:"
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr "Titler og beskrivelser"
-
msgid "To"
msgstr "Til"
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr "Kom i gang ved at bruge linket nedenunder for at bekræfte din konto."
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr "For at angive underretningsniveauet pr. projekt i en gruppe du tilhører
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr "Indsæt venligst følgende link i din browser for at fjerne abonnering fra problemstillingen:"
@@ -47858,9 +48097,6 @@ msgstr "Sidebjælke til/fra"
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr "Sammenfold til/fra"
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr "Commit-liste til/fra"
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr "Emojibelønning til/fra"
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr "Vælg omfang"
-
msgid "Tomorrow"
msgstr "I morgen"
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr "I alt"
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr "URL"
-msgid "URL cannot be blank"
-msgstr "URL'en må ikke være tom"
-
-msgid "URL is invalid"
-msgstr "URL'en er ugyldig"
-
msgid "URL is required"
msgstr "URL kræves"
@@ -48390,9 +48620,6 @@ msgstr "Kan ikke indsamle information om CPU"
msgid "Unable to collect memory info"
msgstr "Kan ikke indsamle information om hukommelse"
-msgid "Unable to connect to Prometheus server"
-msgstr "Kan ikke oprette forbindelse til Prometheus-server"
-
msgid "Unable to connect to server: %{error}"
msgstr "Kan ikke oprette forbindelse til server: %{error}"
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr "Utilfreds?"
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr "Aflink"
msgid "Unlock"
msgstr "Oplås"
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr "Oplåst"
msgid "Unlocked the discussion."
msgstr "Oplåste debatten."
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr "Oplåser debatten."
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr "Pipelineartefakter og jobartefakter, oprettet med CI/CD."
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr "Aktivitet"
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr "Projekter med bidrag"
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr "Rediger profil"
@@ -49658,6 +49897,9 @@ msgstr "Brugeren følger ikke andre brugere."
msgid "UserProfile|Unconfirmed user"
msgstr "Ubekræftet bruger"
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr "Verificer kode"
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr "Version"
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] "Vis diagram"
-msgstr[1] "Vis diagrammer"
-
msgid "View dependency details for your project"
msgstr "Vis afhængighedsdetaljer for dit projekt"
@@ -50163,9 +50397,6 @@ msgstr "Vis fil @ "
msgid "View file @ %{commitSha}"
msgstr "Vis fil @ %{commitSha}"
-msgid "View full dashboard"
-msgstr "Vis hele betjeningspanelet"
-
msgid "View group in admin area"
msgstr "Vis gruppe i administratorområde"
@@ -50220,9 +50451,6 @@ msgstr "Vis åben sammenlægningsanmodning"
msgid "View page @ "
msgstr "Vis side @ "
-msgid "View performance dashboard."
-msgstr "Vis ydelsesbetjeningspanel."
-
msgid "View project in admin area"
msgstr "Vis projekt i administratorområde"
@@ -50240,6 +50468,9 @@ msgstr "Vis erstattet fil @ "
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr "Vis understøttede sprog og frameworks"
@@ -50252,9 +50483,6 @@ msgstr "Vis dokumentationen"
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr "Vis forbrugsdetaljer"
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr "Kommentarer"
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr "Alvorlighed"
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr "Status"
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr "Venter på sammenlægning (åbne og tildelte)"
-msgid "Waiting for performance data"
-msgstr "Venter på ydelsesdata"
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr "Vil du se dataene? Spørg venligst en administrator om adgang."
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr "Vi kunne ikke finde nogle %{scope} som matcher %{term} i projektet %{project}"
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr "Vi registererede potentiel spam i %{humanized_resource_name}. Løs venligst reCAPTCHA'en for at fortsætte."
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr "Hvad er squashing?"
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr "Vil du oprette en ny gren?"
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr "Du er forbundet til Prometheus-serveren men der er i øjeblikket ingen data at vise."
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr "Du kan ikke skrive til denne skrivebeskyttede GitLab-instans."
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr "Din WebAuthn-enhed blev tilmeldt!"
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr "Din konto er blevet deaktiveret"
@@ -52924,8 +53182,8 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr "Din kommentar kunne ikke indsendes! Tjek venligst din netværksforbindelse og prøv igen."
-msgid "Your comment could not be updated! Please check your network connection and try again."
-msgstr "Din kommentar kunne ikke opdateres! Tjek venligst din netværksforbindelse og prøv igen."
+msgid "Your comment could not be updated because %{reason}."
+msgstr ""
msgid "Your comment will be discarded."
msgstr "Din kommentar kasseres."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr "lukket problemstilling"
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr "kommentar"
@@ -54041,18 +54301,6 @@ msgstr[1] "filer"
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr "for %{link_to_merge_request} med %{link_to_merge_request_source_branch}"
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr "for %{link_to_merge_request} med %{link_to_merge_request_source_branch} i %{link_to_merge_request_target_branch}"
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr "for %{link_to_pipeline_ref}"
-
-msgid "for %{ref}"
-msgstr "for %{ref}"
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr "i"
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr "i gruppen %{link_to_group}"
msgid "in project %{link_to_project}"
msgstr "i projektet %{link_to_project}"
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] "instans fuldført"
@@ -54354,9 +54605,6 @@ msgstr "indlæs det alligevel"
msgid "loading"
msgstr "indlæser"
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr "låst af %{path_lock_user_name} %{created_at}"
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr "Sammenlægning mislykkedes."
msgid "mrWidget|Merged by"
msgstr "Sammenlagt af"
-msgid "mrWidget|More information"
-msgstr "Mere information"
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr "Sammenlægningsanmodningen kunne ikke sammenlægges automatisk"
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr "skal være større end startdato"
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr "Ã¥ben problemstilling"
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr "eller"
@@ -55216,6 +55463,9 @@ msgstr "mærkatnavn"
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr "parameteren type mangler og kræves"
msgid "unicode domains should use IDNA encoding"
msgstr "unicode-domæner skal bruge IDNA-kodning"
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr "opdateret"
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr "dine indstillinger"
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/de/gitlab.po b/locale/de/gitlab.po
index fc61ac39bb2..22b422b5c83 100644
--- a/locale/de/gitlab.po
+++ b/locale/de/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: de\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 06:14\n"
+"PO-Revision-Date: 2023-07-11 04:46\n"
msgid " %{start} to %{end}"
msgstr " %{start} bis %{end}"
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] "%d Genehmigung"
msgstr[1] "%d Genehmigungen"
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] "%d Ticket"
+msgstr[1] "%d Tickets"
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] "%d Merge Request"
+msgstr[1] "%d Merge Requests"
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] "%d Modul"
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] "%d zugewiesenes Ticket"
msgstr[1] "%d zugewiesene Tickets"
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] "%d geänderte Datei"
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] "%d weiterer Kommentar"
msgstr[1] "%d weitere Kommentare"
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] "%d Paket"
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] "%{count} Projekt"
msgstr[1] "%{count} Projekte"
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr "%{count} verwandte %{pluralized_subject}: %{links}"
-
msgid "%{count} selected"
msgstr "%{count} ausgewählt"
@@ -695,7 +697,7 @@ msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
msgstr "%{docs_link_start}Erfahre mehr über Sichtbarkeitsstufen.%{docs_link_end}"
msgid "%{docs_link_start}Setting up a verified domain%{docs_link_end} requires being linked to a project."
-msgstr "%{docs_link_start}Um eine verifizierte Domain%{docs_link_end} einzurichten, muss ein Projekt verknüpft werden."
+msgstr "%{docs_link_start}Um eine verifizierte Domain einzurichten%{docs_link_end}, muss ein Projekt verknüpft werden."
msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
msgstr "%{docs_link_start}Was ist „Large File Storage“?%{docs_link_end}"
@@ -703,6 +705,9 @@ msgstr "%{docs_link_start}Was ist „Large File Storage“?%{docs_link_end}"
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr "%{docs_link_start}Was ist Zwei-Faktor-Authentifizierung?%{docs_link_end}"
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr "%{duration}, in der Warteschlange seit %{queuedDuration} Sekunden"
+
msgid "%{duration}ms"
msgstr "%{duration} ms"
@@ -775,8 +780,11 @@ msgstr "%{human_readable_key} ist weniger als %{min_value_length} Zeichen"
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr "%{integrations_link_start}Integrationen%{link_end} ermöglichen es dir, Anwendungen von Drittanbietern in deinen GitLab-Workflow aufzunehmen. Wenn die verfügbaren Integrationen nicht deinen Anforderungen entsprechen, solltest du einen %{webhooks_link_start}Webhook%{link_end} verwenden."
-msgid "%{issuableDisplayName} %{lockStatus}."
-msgstr "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr "%{issuableDisplayName} gesperrt."
+
+msgid "%{issuableDisplayName} unlocked."
+msgstr "%{issuableDisplayName} entsperrt."
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} wird entfernt! Bist du sicher?"
@@ -799,6 +807,9 @@ msgstr "%{italic_start}Neue Funktionen%{italic_end} ist inaktiv und kann nicht a
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr "%{itemsCount} Tickets mit einem Limit von %{maxIssueCount}"
+msgid "%{jobName} job is being retried"
+msgstr "%{jobName} Job wird wiederholt"
+
msgid "%{jobs} Jobs"
msgstr "%{jobs} Aufgaben"
@@ -908,7 +919,7 @@ msgid "%{milliseconds}ms"
msgstr "%{milliseconds}ms"
msgid "%{minutesUsed} units"
-msgstr ""
+msgstr "%{minutesUsed} Einheiten"
msgid "%{model_name} not found"
msgstr "%{model_name} nicht gefunden"
@@ -1006,7 +1017,7 @@ msgid "%{project_name}"
msgstr "%{project_name}"
msgid "%{project_path} is a project that you can use to add a README to your GitLab profile. Create a public project and initialize the repository with a README to get started. %{help_link_start}Learn more%{help_link_end}."
-msgstr "%{project_path} ist ein Projekt, mit dem Sie eine README-Datei zu Ihrem GitLab-Profil hinzufügen können. Erstellen Sie ein öffentliches Projekt und initialisieren Sie das Repository mit einer README-Datei, um zu beginnen. %{help_link_start}Erfahren Sie mehr%{help_link_end}."
+msgstr "%{project_path} ist ein Projekt, mit dem du eine README-Datei zu deinem GitLab-Profil hinzufügen kannst. Erstelle ein öffentliches Projekt und initialisiere das Repository mit einer README-Datei, um zu beginnen. %{help_link_start}Erfahre mehr%{help_link_end}."
msgid "%{ref} cannot be added: %{error}"
msgstr "%{ref} kann nicht hinzugefügt werden: %{error}"
@@ -1085,7 +1096,7 @@ msgstr[0] "%{selectedProjectsCount} Projekt"
msgstr[1] "%{selectedProjectsCount} Projekte"
msgid "%{size} B"
-msgstr ""
+msgstr "%{size} B"
msgid "%{size} GiB"
msgstr "%{size} GiB"
@@ -1114,35 +1125,41 @@ msgstr "%{spanStart}in Zeile%{spanEnd} %{errorLine}%{errorColumn}"
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr "%{spanStart}in%{spanEnd} %{errorFn}"
+msgid "%{startDate} – %{dueDate}"
+msgstr "%{startDate} – %{dueDate}"
+
+msgid "%{startDate} – No due date"
+msgstr "%{startDate} – Kein Fälligkeitsdatum"
+
msgid "%{start} to %{end}"
msgstr "%{start} bis %{end}"
msgid "%{statusStart}Dismissed%{statusEnd}"
-msgstr ""
+msgstr "%{statusStart}Verworfen%{statusEnd}"
msgid "%{statusStart}Dismissed%{statusEnd} at %{projectLink}"
-msgstr ""
+msgstr "%{statusStart}Verworfen%{statusEnd} bei %{projectLink}"
msgid "%{statusStart}Dismissed%{statusEnd} on pipeline %{pipelineLink}"
-msgstr ""
+msgstr "%{statusStart}Verworfen%{statusEnd} in Pipeline %{pipelineLink}"
msgid "%{statusStart}Dismissed%{statusEnd} on pipeline %{pipelineLink} at %{projectLink}"
-msgstr ""
+msgstr "%{statusStart}Verworfen%{statusEnd} in Pipeline %{pipelineLink} bei %{projectLink}"
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason}"
-msgstr ""
+msgstr "%{statusStart}Verworfen%{statusEnd}: %{dismissalReason}"
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} at %{projectLink}"
-msgstr ""
+msgstr "%{statusStart}Verworfen%{statusEnd}: %{dismissalReason} bei %{projectLink}"
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink}"
-msgstr ""
+msgstr "%{statusStart}Verworfen%{statusEnd}: %{dismissalReason} in Pipeline %{pipelineLink}"
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
-msgstr ""
+msgstr "%{statusStart}Verworfen%{statusEnd}: %{dismissalReason} in Pipeline %{pipelineLink} bei %{projectLink}"
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
-msgstr "%{strongOpen}Warnung:%{strongClose} SAML-Gruppen-Links können GitLab dazu veranlassen, automatisch Mitglieder aus Gruppen zu entfernen."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
+msgstr "%{strongOpen}Warnung:%{strongClose} SAML-Gruppen-Links können GitLab dazu veranlassen, automatisch Mitglieder-Rollen zu ändern oder Mitglieder aus Gruppen zu entfernen."
msgid "%{strongStart}%{count}%{strongEnd} commit"
msgid_plural "%{strongStart}%{count}%{strongEnd} commits"
@@ -1263,9 +1280,6 @@ msgstr "%{type} unterstützt nur den Namen %{name}"
msgid "%{url} (optional)"
msgstr "%{url} (optional)"
-msgid "%{userName} (cannot merge)"
-msgstr "%{userName} (kann nicht mergen)"
-
msgid "%{userName}'s avatar"
msgstr "Avatar von %{userName}"
@@ -1539,7 +1553,7 @@ msgid "/day"
msgstr "/Tag"
msgid "0 B"
-msgstr ""
+msgstr "0 B"
msgid "1 Code quality finding"
msgid_plural "%d Code quality findings"
@@ -1897,10 +1911,10 @@ msgid "AI-generated summary"
msgstr "KI-generierte Zusammenfassung"
msgid "AISummary|Generates a summary of all comments"
-msgstr "AISummary|Erstellt eine Zusammenfassung aller Kommentare"
+msgstr "Erstellt eine Zusammenfassung aller Kommentare"
msgid "AISummary|View summary"
-msgstr "KI Zusammenfassung|Zusammenfassung anzeigen"
+msgstr "Zusammenfassung anzeigen"
msgid "AI| %{link_start}How is my data used?%{link_end}"
msgstr "%{link_start}Wie werden meine Daten verwendet?%{link_end}"
@@ -1909,10 +1923,10 @@ msgid "AI| %{link_start}What are Experiment features?%{link_end}"
msgstr "%{link_start}Was sind Experimentfunktionen?%{link_end}"
msgid "AI|AI generated explanations will appear here."
-msgstr ""
+msgstr "KI-generierte Erklärungen werden hier angezeigt."
msgid "AI|Ask a question"
-msgstr ""
+msgstr "Stelle eine Frage"
msgid "AI|Autocomplete"
msgstr "Autovervollständigung"
@@ -1939,16 +1953,22 @@ msgid "AI|Features that use third-party AI services require transmission of data
msgstr "Funktionen, die KI-Dienste von Drittanbietern nutzen, erfordern die Übermittlung von Daten, einschließlich personenbezogener Daten."
msgid "AI|For example: Organizations should be able to forecast into the future by using value stream analytics charts. This feature would help them understand how their metrics are trending."
-msgstr ""
+msgstr "Zum Beispiel: Unternehmen sollten in der Lage sein, mithilfe von Analysediagrammen zur Wertschöpfungskette Prognosen für die Zukunft zu erstellen. Diese Funktion würde ihnen dabei helfen, die Entwicklung ihrer Kennzahlen zu verstehen."
msgid "AI|Helpful"
msgstr "Hilfreich"
msgid "AI|I don't see how I can help. Please give better instructions!"
-msgstr "AI|Ich sehe nicht, wie ich helfen kann. Bitte bessere Anweisungen geben!"
+msgstr "Ich weiß nicht, wie ich helfen kann. Bitte gib genauere Anweisungen!"
+
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr "Kann unangemessene Antworten liefern, die nicht den Ansichten von GitLab entsprechen. Gib keine personenbezogenen Daten ein."
+
+msgid "AI|New chat"
+msgstr "Neues Gespräch"
msgid "AI|Populate issue description"
-msgstr ""
+msgstr "Beschreibung des Tickets befüllen"
msgid "AI|Responses generated by AI"
msgstr "Antworten generiert von KI"
@@ -1963,7 +1983,7 @@ msgid "AI|The container element wasn't found, stopping AI Genie."
msgstr "Das Containerelement wurde nicht gefunden; stoppe KI Genie"
msgid "AI|The existing description will be replaced when you submit."
-msgstr ""
+msgstr "Die vorhandene Beschreibung wird beim Absenden ersetzt."
msgid "AI|There is too much text in the chat. Please try again with a shorter text."
msgstr "Es ist zu viele Buchstaben und Wörter. Bitte versuche es mit einem kürzeren Text."
@@ -1987,7 +2007,7 @@ msgid "AI|What does the selected code mean?"
msgstr "Was bedeutet der ausgewählte Code?"
msgid "AI|Write a brief description and have AI fill in the details."
-msgstr ""
+msgstr "Schreibe eine kurze Beschreibung und lasse die KI die Details befüllen."
msgid "AI|Write a summary to fill out the selected issue template"
msgstr "Schreibe eine Zusammenfassung, um die ausgewählte Ticketvorlage auszufüllen"
@@ -2158,25 +2178,25 @@ msgid "Abuse reports notification email"
msgstr "E-Mail zur Benachrichtigung von Missbrauchsberichten"
msgid "AbuseReportEvent|Successfully banned the user"
-msgstr "AbuseReportEvent|Benutzer erfolgreich gebannt"
+msgstr "Benutzer(in) erfolgreich gebannt"
msgid "AbuseReportEvent|Successfully banned the user and closed the report"
-msgstr "AbuseReportEvent|Benutzer erfolgreich gesperrt und Bericht geschlossen"
+msgstr "Benutzer(in) erfolgreich gesperrt und Bericht geschlossen"
msgid "AbuseReportEvent|Successfully blocked the user"
-msgstr "AbuseReportEvent|Benutzer erfolgreich gesperrt"
+msgstr "Benutzer(in) erfolgreich gesperrt"
msgid "AbuseReportEvent|Successfully blocked the user and closed the report"
-msgstr "AbuseReportEvent|Benutzer erfolgreich gesperrt und Bericht geschlossen"
+msgstr "Benutzer(in) erfolgreich gesperrt und Bericht geschlossen"
msgid "AbuseReportEvent|Successfully closed the report"
-msgstr "AbuseReportEvent|Der Bericht wurde erfolgreich geschlossen"
+msgstr "Der Bericht wurde erfolgreich geschlossen"
msgid "AbuseReportEvent|Successfully scheduled the user for deletion"
-msgstr "AbuseReportEvent|Die Löschung des Benutzers wurde erfolgreich geplant"
+msgstr "Die Löschung des Benutzers/der Benutzerin wurde erfolgreich geplant"
msgid "AbuseReportEvent|Successfully scheduled the user for deletion and closed the report"
-msgstr "AbuseReportEvent|Die Löschung des Benutzers wurde erfolgreich geplant und der Bericht geschlossen"
+msgstr "Die Löschung des Benutzers/der Benutzerin wurde erfolgreich geplant und der Bericht geschlossen"
msgid "AbuseReports|%{reportedUser} reported for %{category} by %{reporter}"
msgstr "%{reportedUser} gemeldet für %{category} von %{reporter}"
@@ -2194,13 +2214,13 @@ msgid "AbuseReport|Abuse reports"
msgstr "Missbrauchsmeldungen"
msgid "AbuseReport|Abuse unconfirmed"
-msgstr "AbuseReport|Missbrauch unbestätigt"
+msgstr "Missbrauch nicht bestätigt"
msgid "AbuseReport|Action"
-msgstr "AbuseReport|Aktion"
+msgstr "Aktion"
msgid "AbuseReport|Actions"
-msgstr "AbuseReport|Aktionen"
+msgstr "Aktionen"
msgid "AbuseReport|Activity"
msgstr "Aktivität"
@@ -2209,52 +2229,52 @@ msgid "AbuseReport|Admin profile"
msgstr "Admin-Profil"
msgid "AbuseReport|Ban user"
-msgstr "AbuseReport|Benutzer sperren"
+msgstr "Benutzer(in) sperren"
msgid "AbuseReport|Block user"
-msgstr "AbuseReport|Benutzer blockieren"
+msgstr "Benutzer(in) blockieren"
msgid "AbuseReport|Card matches %{cardMatchesLinkStart}%{count} accounts%{cardMatchesLinkEnd}"
msgstr "Karte stimmt mit %{cardMatchesLinkStart}%{count} Konten%{cardMatchesLinkEnd} überein"
msgid "AbuseReport|Close report"
-msgstr "AbuseReport|Bericht schließen"
+msgstr "Bericht schließen"
msgid "AbuseReport|Comment"
-msgstr "AbuseReport|Kommentieren"
+msgstr "Kommentar"
msgid "AbuseReport|Comments"
msgstr "Kommentare"
msgid "AbuseReport|Confirm"
-msgstr "AbuseReport|Bestätigen"
+msgstr "Bestätigen"
msgid "AbuseReport|Confirmed crypto mining"
-msgstr "AbuseReport|Krypto-Mining bestätigt"
+msgstr "Krypto-Mining bestätigt"
msgid "AbuseReport|Confirmed offensive or abusive behavior"
-msgstr "AbuseReport|Anstößiges oder missbräuchliches Verhalten bestätigt"
+msgstr "Anstößiges oder missbräuchliches Verhalten bestätigt"
msgid "AbuseReport|Confirmed phishing"
-msgstr "AbuseReport|Bestätigtes Phishing"
+msgstr "Phishing bestätigt"
msgid "AbuseReport|Confirmed posting of malware"
-msgstr "AbuseReport|Bestätigtes Veröffentlichen von Malware"
+msgstr "Veröffentlichen von Malware bestätigt"
msgid "AbuseReport|Confirmed posting of personal information or credentials"
-msgstr "AbuseReport|Bestätigte Veröffentlichung persönlicher Informationen oder Anmeldeinformationen"
+msgstr "Veröffentlichung persönlicher Informationen oder Anmeldeinformationen bestätigt"
msgid "AbuseReport|Confirmed spam"
-msgstr "AbuseReport|Bestätigter Spam"
+msgstr "Spam bestätigt"
msgid "AbuseReport|Confirmed violation of a copyright or a trademark"
-msgstr "AbuseReport|Bestätigte Urheber- oder Markenrechtsverletzung"
+msgstr "Urheber- oder Markenrechtsverletzung bestätigt"
msgid "AbuseReport|Credit card"
msgstr "Kreditkarte"
msgid "AbuseReport|Delete user"
-msgstr "AbuseReport|Benutzer löschen"
+msgstr "Benutzer(in) löschen"
msgid "AbuseReport|Email"
msgstr "E-Mail"
@@ -2284,7 +2304,7 @@ msgid "AbuseReport|Member since"
msgstr "Mitglied seit"
msgid "AbuseReport|No action"
-msgstr "AbuseReport|Keine Aktion"
+msgstr "Keine Aktion"
msgid "AbuseReport|No user found"
msgstr "Kein(e) Benutzer(in) gefunden"
@@ -2296,7 +2316,7 @@ msgid "AbuseReport|Phone"
msgstr "Telefon"
msgid "AbuseReport|Reason"
-msgstr "AbuseReport|Grund"
+msgstr "Grund"
msgid "AbuseReport|Registered with name %{name}."
msgstr "Registriert mit dem Namen %{name}."
@@ -2329,7 +2349,7 @@ msgid "AbuseReport|Snippets"
msgstr "Codeausschnitte"
msgid "AbuseReport|Something else"
-msgstr "AbuseReport|Etwas anderes"
+msgstr "Etwas anderes"
msgid "AbuseReport|Tier"
msgstr "Stufe"
@@ -2398,7 +2418,10 @@ msgid "AccessTokens|Access Tokens"
msgstr "Zugangs-Token"
msgid "AccessTokens|Access token limit reached"
-msgstr ""
+msgstr "Zugriffstoken-Limit erreicht"
+
+msgid "AccessTokens|Add a %{type}"
+msgstr "Fügt %{type} hinzu"
msgid "AccessTokens|Are you sure?"
msgstr "Bist du sicher?"
@@ -2418,12 +2441,18 @@ msgstr "Token für eingehende E-Mails kopieren"
msgid "AccessTokens|Copy static object token"
msgstr "Token für statische Objekte kopieren"
+msgid "AccessTokens|Create %{type}"
+msgstr "%{type} erstellen"
+
msgid "AccessTokens|Created"
msgstr "Erstellt"
msgid "AccessTokens|Feed token"
msgstr "Feed-Token"
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr "Zum Beispiel die Anwendung, die das Token verwendet, oder der Zweck des Tokens. Gib keine vertraulichen Informationen als Namen des Tokens an, da dieser für alle %{resource_type}-Mitglieder sichtbar ist."
+
msgid "AccessTokens|Incoming email token"
msgstr "Token für eingehende E-Mails"
@@ -2442,6 +2471,15 @@ msgstr "Halte dieses Token geheim. Jeder, der es besitzt, kann Aktivitäts- und
msgid "AccessTokens|Personal Access Tokens"
msgstr "Persönliches Zugangs-Token"
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr "Geltungsbereiche legen die dem Token gewährten Berechtigungsstufen fest."
+
+msgid "AccessTokens|Select a role"
+msgstr "Wähle eine Rolle aus"
+
+msgid "AccessTokens|Select scopes"
+msgstr "Geltungsbereiche auswählen"
+
msgid "AccessTokens|Static object token"
msgstr "Statisches Objekt-Token"
@@ -2451,6 +2489,9 @@ msgstr "Das letzte Mal, dass ein Token verwendet wurde."
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr "Dies sind die einzigen akzeptierten Kennwörter, wenn die Zwei-Faktor-Authentifizierung (2FA) aktiviert ist."
+msgid "AccessTokens|Token name"
+msgstr "Token-Name"
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr "Du kannst auch persönliche Zugriffstokens verwenden, um dich bei Git über HTTP zu authentifizieren."
@@ -2458,7 +2499,7 @@ msgid "AccessTokens|You can generate a personal access token for each applicatio
msgstr "Du kannst für jede von dir verwendete Anwendung, die Zugriff auf die GitLab-API benötigt, ein persönliches Zugriffstoken erstellen."
msgid "AccessTokens|You can only have one active project access token with a trial license. You cannot generate a new token until the existing token is deleted, or you upgrade your subscription."
-msgstr ""
+msgstr "Mit einer Testlizenz kannst du nur ein aktives Projektzugriffstoken haben. Du kannst kein neues Token generieren, bis das vorhandene Token gelöscht wurde oder du dein Abonnement aktualisierst."
msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr "Dein Feed-Token authentifiziert dich, wenn dein RSS-Reader einen personalisierten RSS-Feed lädt oder wenn deine Kalenderanwendung einen personalisierten Kalender lädt. Es ist in diesen Feed-URLs sichtbar."
@@ -2502,13 +2543,13 @@ msgstr "Repariere deine Pipelines, indem du dein Konto validierst"
msgid "AccountValidation|I'll bring my own runners"
msgstr "Ich werde meine eigenen Runner verwenden"
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr "Mehr erfahren."
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2518,7 +2559,7 @@ msgid "AccountValidation|Verification is required to discourage and reduce the a
msgstr "Die Verifizierung ist erforderlich, um den Missbrauch der GitLab-Infrastruktur zu verhindern und zu reduzieren. Wenn du dich mit einer Kredit- oder Debitkarte verifizierst, %{strong_start}belastet GitLab deine Karte nicht, sie wird nur zur Validierung verwendet.%{strong_end} %{learn_more_link}"
msgid "Achievements"
-msgstr "Errungenschaften"
+msgstr "Erfolge"
msgid "Achievements|%{namespace_full_path} awarded you the %{achievement_name} achievement"
msgstr "%{namespace_full_path} hat dir den %{achievement_name} Erfolg verliehen"
@@ -2548,7 +2589,7 @@ msgid "Action"
msgstr "Aktion"
msgid "Action '%{action}' in registry %{registry_id} entry is not supported."
-msgstr ""
+msgstr "Aktion '%{action}' in Registry-Eintrag %{registry_id} wird nicht unterstützt."
msgid "Action not allowed."
msgstr "Aktion nicht erlaubt."
@@ -2619,9 +2660,6 @@ msgstr "Wiki hinzufügen"
msgid "Add Zoom meeting"
msgstr "Zoom-Besprechung hinzufügen"
-msgid "Add a %{type}"
-msgstr "%{type} hinzufügen"
-
msgid "Add a GCP region"
msgstr "Eine GCP-Region hinzufügen"
@@ -2670,6 +2708,9 @@ msgstr "Neues Ticket hinzufügen"
msgid "Add a numbered list"
msgstr "Eine nummerierte Liste hinzufügen"
+msgid "Add a quick action"
+msgstr "Füge einen Schnellzugriff hinzu"
+
msgid "Add a related epic"
msgstr "Verwandtes Epic hinzufügen"
@@ -2925,6 +2966,9 @@ msgstr "In dieser Version hinzugefügt"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr "Das Hinzufügen neuer Anwendungen ist in deiner GitLab-Instanz deaktiviert. Bitte kontaktiere deine(n) GitLab-Administrator(in), um die Berechtigung zu erhalten"
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr "Zusätzliche Diagrammformate"
@@ -2944,10 +2988,7 @@ msgid "Additional text to show on the sign-in page"
msgstr "Zusätzlicher Text, der auf der Anmeldeseite angezeigt wird"
msgid "Additional units"
-msgstr ""
-
-msgid "Additional units of compute:"
-msgstr ""
+msgstr "Zusätzliche Einheiten"
msgid "Address"
msgstr "Adresse"
@@ -3007,7 +3048,7 @@ msgid "Admin message"
msgstr "Admin Nachricht"
msgid "Admin mode"
-msgstr ""
+msgstr "Admin-Modus"
msgid "Admin mode already enabled"
msgstr "Admin-Modus bereits aktiviert"
@@ -3372,24 +3413,15 @@ msgstr "Wenn es noch keinen Index gibt, erstellt GitLab einen."
msgid "AdminSettings|Import sources"
msgstr "Quellen importieren"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
+msgstr "Verbessere den Durchsatz bei der Nicht-Code-Indizierung, indem du Sidekiq-Jobs in die Warteschlange stellst, bis alle Dokumente verarbeitet sind."
+
msgid "AdminSettings|Inactive project deletion"
msgstr "Löschen inaktiver Projekte"
msgid "AdminSettings|Instance runners expiration"
msgstr "Ablauf der Instanz-Runner"
-msgid "AdminSettings|Jitsu administrator email"
-msgstr "Jitsu Administrator-E-Mail"
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr "Jitsu Administrator-Passwort"
-
-msgid "AdminSettings|Jitsu host"
-msgstr "Jitsu-Host"
-
-msgid "AdminSettings|Jitsu project ID"
-msgstr "Jitsu Projekt-ID"
-
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
msgstr "Behalte mindestens die neusten Artefakte aller Jobs der letzten erfolgreichen Pipeline"
@@ -3471,6 +3503,9 @@ msgstr "CI/CD-Variablen standardmäßig schützen"
msgid "AdminSettings|Registration Features include:"
msgstr "Die Registrierung umfasst folgende Funktionen:"
+msgid "AdminSettings|Requeue indexing workers"
+msgstr "Indizierungs-Worker erneut in die Warteschlange stellen"
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr "Benutzer(innen) müssen den Besitz von individuellen Domänen nachweisen"
@@ -3540,9 +3575,6 @@ msgstr "Der Wert muss größer als 0 sein."
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr "Größen- und Domain-Einstellungen für statische Pages-Seiten."
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr "Die ID des Projekts in Jitsu. Das Projekt enthält alle Analyseinstanzen."
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr "Die URL deiner Cube-Instanz."
@@ -3552,9 +3584,6 @@ msgstr "Die Verbindungszeichenfolge deiner Instanz des Produktanalysekonfigurato
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr "Die Standard-Domain zur Nutzung von Auto-Review-Apps und Auto-Bereitstellungsphasen in allen Projekten."
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr "Der Host deiner Jitsu-Instanz."
-
msgid "AdminSettings|The host of your data collector instance."
msgstr "Der Host deiner Datensammlerinstanz."
@@ -3585,11 +3614,11 @@ msgstr "Anzahl der Aufträge in aktiven Pipelines"
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr "AWS OpenSearch Dienst mit IAM-Zugangsdaten verwenden"
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr "Wird verwendet, um Jitsu mit der Clickhouse-Instanz zu verbinden."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
+msgstr "Für Cluster- und Indexmigrationen verwenden. Wenn die Indizierung pausiert ist, verfolgt GitLab weiterhin Änderungen."
-msgid "AdminSettings|Used to generate short-lived API access tokens."
-msgstr "Wird verwendet, um kurzlebige API-Zugriffstoken zu generieren."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
+msgstr "Wird verwendet, um Snowplow mit der Clickhouse-Instanz zu verbinden."
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
msgstr "Wird verwendet, um Dashboard-Daten aus der Cube Instanz abzurufen."
@@ -3597,9 +3626,6 @@ msgstr "Wird verwendet, um Dashboard-Daten aus der Cube Instanz abzurufen."
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr "Benutzer(innen) und Gruppen müssen die Einladung annehmen, bevor sie einer Gruppe oder einem Projekt hinzugefügt werden."
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr "Im angehaltenen Zustand verfolgt GitLab die Änderungen weiterhin. Dies ist nützlich für Cluster-/Indexmigrationen."
-
msgid "AdminSettings|When to delete inactive projects"
msgstr "Wann sollen inaktive Projekte gelöscht werden"
@@ -3763,7 +3789,7 @@ msgid "AdminUsers|Cohorts"
msgstr "Kohorten"
msgid "AdminUsers|Compute quota"
-msgstr ""
+msgstr "Rechenkontingent"
msgid "AdminUsers|Confirm user"
msgstr "Benutzer(in) bestätigen"
@@ -3822,9 +3848,6 @@ msgstr "Wichtige Informationen über die Verwendung auf deiner GitLab-Instanz"
msgid "AdminUsers|Is using seat"
msgstr "Verbraucht eine Benutzer-Lizenz"
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr "Issues und Merge Requests dieses Benutzers sind anderen Benutzern ausgeblendet."
-
msgid "AdminUsers|It's you!"
msgstr "Das bist du!"
@@ -3870,6 +3893,9 @@ msgstr "Persönliche Projekte, Gruppen- und Benutzerhistorie bleiben intakt"
msgid "AdminUsers|Private profile"
msgstr "Privates Profil"
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr "Projekte, Tickets, Merge Requests und Kommentare dieses Benutzers/dieser Benutzerin werden für andere Benutzer(innen) ausgeblendet."
+
msgid "AdminUsers|Reactivating a user will:"
msgstr "Wenn der/die Benutzer(in) reaktiviert wird, hat dies folgende Auswirkungen:"
@@ -3909,7 +3935,7 @@ msgstr "Skype"
msgid "AdminUsers|Sort by"
msgstr "Sortiert nach"
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr "Du verwendest veraltete Codesuch-Zuordnungen. Um die Qualität der Codes
msgid "After a successful password update you will be redirected to login screen."
msgstr "Nach dem erfolgreichen Ändern des Passwortes wirst du zum Anmeldebildschirm weitergeleitet."
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr "Nach einer erfolgreichen Passwortaktualisierung wirst du zur Anmeldeseite weitergeleitet, wo du dich mit deinem neuen Passwort anmelden kannst."
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr "Nach dem Entfernen kann die Fork-Beziehung nur mithilfe der API wiederhergestellt werden. Dieses Projekt wird nicht länger in der Lage sein, Merge Requests an das Upstream-Projekt oder andere Forks zu empfangen oder zu senden."
@@ -4218,8 +4241,8 @@ msgstr "Aktivitätsfeed"
msgid "AlertManagement|Alert"
msgstr "Alarm"
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
-msgstr "Alarm-Beauftragte(r): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
+msgstr "Alarmbeauftragte: %{assignees}"
msgid "AlertManagement|Alert detail"
msgstr "Alarm-Details"
@@ -4323,10 +4346,10 @@ msgstr "Es gab einen Fehler bei der Anzeige des Alarms. Bitte aktualisiere die S
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr "Ein Fehler ist beim Anzeigen der Warnungen aufgetreten. Prüfe bitte die Konfigurationsdetails des Endpunkts, um sicherzustellen, dass Warnungen angezeigt werden."
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
-msgstr "Beim Aktualisieren der Beauftragten-Liste ist ein Fehler aufgetreten. Bitte versuche es erneut."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
+msgstr "Beim Aktualisieren der Liste der Beauftragten ist ein Fehler aufgetreten. Bitte versuche es erneut."
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr "Beim Aktualisieren der Beauftragten des Alarms ist ein Fehler aufgetreten. Bitte versuche es erneut."
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr "Mit der Bearbeitung fortfahren"
msgid "AlertSettings|Prometheus"
msgstr "Prometheus"
-msgid "AlertSettings|Prometheus API base URL"
-msgstr "Prometheus API Basis-URL"
-
msgid "AlertSettings|Reset Key"
msgstr "Schlüssel zurücksetzen"
@@ -4476,9 +4496,6 @@ msgstr "Das Formular hat nicht gespeicherte Änderungen. Wie möchtest Du fortfa
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr "Um eine benutzerdefinierte Zuordnung zu erstellen, gib eine Beispielnutzlast aus Deinem Überwachungstool im JSON-Format ein. Klicke auf die Schaltfläche „Nutzdatenfelder analysieren“, um fortzufahren."
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr "Die URL darf nicht leer sein und muss mit http: oder https: beginnen."
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr "Verwende die unten stehende URL und den Autorisierungsschlüssel, um zu konfigurieren, wie Prometheus Warnungen an GitLab sendet. In der %{linkStart}GitLab-Dokumentation%{linkEnd} erfährst Du, wie Du Deinen Endpunkt konfigurierst."
@@ -4575,6 +4592,9 @@ msgstr "Alle Branches"
msgid "All changes are committed"
msgstr "Alle Änderungen sind committed"
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr "Alle berechtigten Benutzer(innen)"
@@ -4740,6 +4760,9 @@ msgstr "Auch direkte Benutzermitgliedschaft aus Untergruppen und Projekten entfe
msgid "Also unassign this user from related issues and merge requests"
msgstr "Diese(n) Benutzer(in) auch von zugehörigen Tickets und Merge Requests entfernen"
+msgid "Alt text"
+msgstr "Alt-Text"
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr "Alternative Support-URL für die Hilfeseite und die Hilfe-Auswahl-Liste."
@@ -4791,12 +4814,6 @@ msgstr "Es ist ein Fehler aufgetreten"
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr "Ein Fehler im Berichtswesen, in dem ein Testresultat fehlerhaft das Vorhandensein einer Verwundbarkeit in einem System anzeigt, wenn die Verwundbarkeit nicht vorhanden ist."
-msgid "An error occurred adding a draft to the thread."
-msgstr "Beim Hinzufügen eines Entwurfs zur Diskussion ist ein Fehler aufgetreten."
-
-msgid "An error occurred adding a new draft."
-msgstr "Beim Hinzufügen eines neuen Entwurfs ist ein Fehler aufgetreten."
-
msgid "An error occurred creating the new branch."
msgstr "Beim Anlegen des neuen Branches ist ein Fehler aufgetreten."
@@ -4839,6 +4856,12 @@ msgstr "Beim Genehmigen ist ein Fehler aufgetreten. Bitte versuche es erneut."
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr "Beim Überprüfen des Gruppenpfads ist ein Fehler aufgetreten. Bitte aktualisiere und versuche es erneut."
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr "Beim Dekodieren der Datei ist ein Fehler aufgetreten."
@@ -4998,9 +5021,6 @@ msgstr "Beim Laden der Projekte ist ein Fehler aufgetreten."
msgid "An error occurred while loading the blob controls."
msgstr "Beim Laden der Blob-Steuerelemente ist ein Fehler aufgetreten."
-msgid "An error occurred while loading the data. Please try again."
-msgstr "Beim Laden der Daten ist ein Fehler aufgetreten. Bitte versuche es erneut."
-
msgid "An error occurred while loading the file"
msgstr "Beim Laden der Datei ist ein Fehler aufgetreten"
@@ -5062,7 +5082,7 @@ msgid "An error occurred while reordering issues."
msgstr "Beim Umordnen von Tickets ist ein Fehler aufgetreten."
msgid "An error occurred while resetting the compute usage."
-msgstr ""
+msgstr "Beim Zurücksetzen des Rechenkontingents ist ein Fehler aufgetreten."
msgid "An error occurred while retrieving calendar activity"
msgstr "Beim Abrufen der Kalenderaktivität ist ein Fehler aufgetreten"
@@ -5117,9 +5137,6 @@ msgstr "Beim Aktualisieren der Konfiguration ist ein Fehler aufgetreten."
msgid "An error occurred while updating labels."
msgstr "Beim Aktualisieren der Labels ist ein Fehler aufgetreten."
-msgid "An error occurred while updating the comment"
-msgstr "Beim Aktualisieren des Kommentars ist ein Fehler aufgetreten"
-
msgid "An error occurred while updating the configuration."
msgstr "Beim Aktualisieren der Konfiguration ist ein Fehler aufgetreten."
@@ -5206,11 +5223,11 @@ msgstr "Unbekannter Fehler aufgetreten."
msgid "Analytics"
msgstr "Analysen"
-msgid "Analytics|Add to Dashboard"
-msgstr "Zum Dashboard hinzufügen"
+msgid "Analytics|A visualization with that name already exists."
+msgstr "Es ist bereits eine Visualisierung mit diesem Namen vorhanden."
msgid "Analytics|Add visualizations"
-msgstr ""
+msgstr "Visualisierungen hinzufügen"
msgid "Analytics|An error occurred while loading data"
msgstr "Beim Laden der Daten ist ein Fehler aufgetreten"
@@ -5228,7 +5245,7 @@ msgid "Analytics|Browser Family"
msgstr "Browser-Familie"
msgid "Analytics|By GitLab"
-msgstr ""
+msgstr "Von GitLab"
msgid "Analytics|Cancel"
msgstr "Abbrechen"
@@ -5272,12 +5289,21 @@ msgstr "Daten"
msgid "Analytics|Data Table"
msgstr "Datentabelle"
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr "Daten und Uhrzeiten werden in der UTC-Zeitzone angezeigt"
+
msgid "Analytics|Edit"
msgstr "Bearbeiten"
+msgid "Analytics|Enter a visualization name"
+msgstr "Gib einen Visualisierungsnamen ein"
+
msgid "Analytics|Error while saving dashboard"
msgstr "Fehler beim Speichern des Dashboards"
+msgid "Analytics|Error while saving visualization."
+msgstr "Fehler beim Speichern der Visualisierung."
+
msgid "Analytics|Host"
msgstr "Host"
@@ -5287,8 +5313,8 @@ msgstr "Sprache"
msgid "Analytics|Line Chart"
msgstr "Liniendiagramm"
-msgid "Analytics|New Analytics Visualization Title"
-msgstr "Neuer Analytics-Visualisierungstitel"
+msgid "Analytics|New analytics visualization name"
+msgstr "Neuer Name der Analytik-Visualisierung"
msgid "Analytics|New dashboard"
msgstr "Neues Dashboard"
@@ -5326,6 +5352,18 @@ msgstr "Ergebnisdaten"
msgid "Analytics|Save"
msgstr "Speichern"
+msgid "Analytics|Save and add to Dashboard"
+msgstr "Speichern und zum Dashboard hinzufügen"
+
+msgid "Analytics|Save new visualization"
+msgstr "Neue Visualisierung speichern"
+
+msgid "Analytics|Select a measurement"
+msgstr "Wähle ein Maß aus"
+
+msgid "Analytics|Select a visualization type"
+msgstr "Wähle einen Visualisierungstyp aus"
+
msgid "Analytics|Single Statistic"
msgstr "Einzelne Statistik"
@@ -5338,6 +5376,9 @@ msgstr "URL"
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr "Dashboard wird aktualisiert %{dashboardId}"
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr "Aktualisieren der Visualisierung %{visualizationName}"
+
msgid "Analytics|Users"
msgstr "Benutzer(innen)"
@@ -5356,6 +5397,12 @@ msgstr "Visualisierungs-Designer"
msgid "Analytics|Visualization Type"
msgstr "Visualisierungstyp"
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr "Visualisierung wurde erfolgreich gespeichert"
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr "Analysiere deine Abhängigkeiten auf bekannte Schwachstellen."
@@ -5380,6 +5427,9 @@ msgstr "Und dieses Registrierungstoken:"
msgid "Anonymous"
msgstr "Anonym"
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr "Ein anderer Anliegen-Aufzeichnungs-Dienst wird bereits verwendet. Es kann jedoch nur ein Anliegen-Aufzeichnungs-Dienst aktiv sein"
@@ -5444,10 +5494,10 @@ msgid "AppleAppStore|Leave empty to use your current Private Key."
msgstr "Leer lassen, um Ihren aktuellen privaten Schlüssel zu verwenden."
msgid "AppleAppStore|Only set variables on protected branches and tags"
-msgstr ""
+msgstr "Lege Variablen nur für geschützte Branches und Tags fest"
msgid "AppleAppStore|Protected branches and tags only"
-msgstr ""
+msgstr "Nur geschützte Branches und Tags"
msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
msgstr "Die Apple App Store Connect Issuer ID."
@@ -5510,7 +5560,7 @@ msgid "ApplicationSettings|Allowed domains for sign-ups"
msgstr "Erlaubte Domains für Anmeldungen"
msgid "ApplicationSettings|Allows users to delete their own accounts"
-msgstr ""
+msgstr "Erlaubt Benutzer(innen) das Löschen ihrer eigenen Konten"
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 "Jeder Benutzer, der %{host} besucht und ein Konto erstellt, muss ausdrücklich von einem Administrator genehmigt werden, bevor er sich anmelden kann. Nur wirksam, wenn Anmeldungen aktiviert sind."
@@ -5785,7 +5835,7 @@ msgid "ApprovalRule|Name"
msgstr "Name"
msgid "ApprovalRule|Need triage"
-msgstr ""
+msgstr "Triage erforderlich"
msgid "ApprovalRule|Needs triage"
msgstr "Triage erforderlich"
@@ -6167,9 +6217,6 @@ msgstr "Bist du sicher? Das Entfernen dieses GPG-Schlüssels wirkt sich nicht au
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr "Bist du sicher? Das Gerät wird von GitLab abgemeldet und alle Remember-Me-Tokens werden widerrufen."
-msgid "Arrange charts"
-msgstr "Diagramme anordnen"
-
msgid "Artifact"
msgstr "Artefakt"
@@ -6255,6 +6302,9 @@ msgstr "Gesamtgröße Artefakte"
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr "Wir möchten, dass Du diese Seite verwendest, um Deine CI/CD Job-Artefakte einfach zu verwalten. Wir arbeiten daran, diese Erfahrung zu verbessern und würden uns über Deine Rückmeldungen zu den von uns vorgenommenen Verbesserungen freuen."
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr "Da es sich um ein neu erstelltes Konto handelt, klicke zunächst auf den Link unten, um dein Konto zu bestätigen."
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr "Da wir weiterhin weitere Funktionen für SAST erstellen, würden wir uns über Dein Feedback zur SAST-Konfigurationsfunktion in %{linkStart}diesem Ticket%{linkEnd} freuen."
@@ -6309,8 +6359,8 @@ msgstr "Dich selbst zuweisen"
msgid "Assign reviewer"
msgstr "Reviewer zuweisen"
-msgid "Assign reviewer(s)"
-msgstr "Reviewer zuweisen"
+msgid "Assign reviewers"
+msgstr "Prüfer zuweisen"
msgid "Assign severity"
msgstr "Schweregrad zuweisen"
@@ -6368,9 +6418,6 @@ msgstr "Beauftragte(r) hat keine Berechtigungen"
msgid "Assignee lists not available with your current license"
msgstr "Zuweisungslisten sind mit deiner momentanen Lizenz nicht verfügbar"
-msgid "Assignee(s)"
-msgstr "Zugewiesene Personen"
-
msgid "Assignees"
msgstr "Beauftragte"
@@ -6510,17 +6557,23 @@ msgstr "Beim Abrufen der externen Audit-Event-Streams ist ein Fehler aufgetreten
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr "Beim Aktualisieren des Ziels des externen Audit-Ereignisstreams ist ein Fehler aufgetreten. Bitte erneut versuchen."
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr "Bist du sicher, dass du dieses Ziel löschen möchtest?"
+
msgid "AuditStreams|Cancel editing"
msgstr "Bearbeitung abbrechen"
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr "Benutzerdefinierte HTTP-Header (optional)"
-msgid "AuditStreams|Defines which streaming events are captured"
-msgstr "Definiert welche Streaming-Ereignisse erfasst werden"
+msgid "AuditStreams|Delete destination"
+msgstr "Ziel löschen"
-msgid "AuditStreams|Delete %{link}"
-msgstr "%{link} löschen"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
+msgstr "Durch das Löschen des Streaming-Ziels %{destination} wird das Streamen von Audit-Ereignissen gestoppt"
msgid "AuditStreams|Destination URL"
msgstr "Ziel-URL"
@@ -6531,20 +6584,35 @@ msgstr "Ziel hat Filter angewendet. %{linkStart}Was sind Filter?%{linkEnd}"
msgid "AuditStreams|Destinations receive all audit event data"
msgstr "Ziele empfangen alle Auditereignisdaten"
-msgid "AuditStreams|Edit %{link}"
-msgstr "%{link} bearbeiten"
-
msgid "AuditStreams|Event filtering (optional)"
msgstr "Ereignisfilterung (optional)"
+msgid "AuditStreams|Filter by audit event type"
+msgstr ""
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
+msgstr ""
+
msgid "AuditStreams|Header"
msgstr "Header"
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr "Die maximale Anzahl von %{number} HTTP-Headern wurde erreicht."
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
-msgstr "Keine Filter verfügbar. %{linkStart}Wie füge ich einen Filter hinzu?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
+msgstr ""
msgid "AuditStreams|Remove custom header"
msgstr "Benutzerdefinierten Header entfernen"
@@ -6552,6 +6620,9 @@ msgstr "Benutzerdefinierten Header entfernen"
msgid "AuditStreams|Save external stream destination"
msgstr "Externes Stream-Ziel speichern"
+msgid "AuditStreams|Select events"
+msgstr "Ereignisse auswählen"
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr "Streaming für Audit-Ereignisse einrichten"
@@ -6579,21 +6650,24 @@ msgstr "Wert"
msgid "AuditStreams|Verification token"
msgstr "Bestätigungstoken"
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr "Verifizierungstoken für den Stream %{link}"
-
-msgid "AuditStreams|View verification token"
-msgstr "Verifizierungstoken anzeigen"
+msgid "AuditStreams|audit-events"
+msgstr ""
msgid "AuditStreams|ex: 1000"
-msgstr ""
+msgstr "Beispiel: 1000"
msgid "AuditStreams|ex: limitation"
-msgstr ""
+msgstr "ex: Einschränkung"
msgid "AuditStreams|filtered"
msgstr "Gefiltert"
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr "Aug"
@@ -7131,28 +7205,28 @@ msgstr "Abrechnung"
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr "%{group_name} verwendet derzeit %{plan_name}"
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr "10 GB Übertragung pro Monat"
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr "5 Benutzer pro Namensraum"
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr "Support"
msgid "BillingPlans|Talk to an expert today."
msgstr "Sprich noch heute mit einem Experten."
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr "Dann %{move_link_start}verschiebe alle Projekte%{move_link_end}, die du mit deinem Abonnement verwenden möchtest, in diese Gruppe."
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr "Diese Gruppe verwendet den Tarif der übergeordneten Gruppe."
@@ -7350,11 +7427,8 @@ msgstr "Wir sind hier, um zu helfen."
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 "Während GitLab die Verfügbarkeit des Bronze-Plans beendet, kannst du dein Bronze-Abonnement noch vor %{eoa_bronze_plan_end_date}verlängern. Wir bieten auch ein zeitlich begrenztes kostenloses Upgrade auf unseren Premium Plan (bis zu 25 Benutzer(innen))! Erfahre mehr über die Änderungen und Angebote in unseren %{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 "Du hast keine Gruppen. Du musst %{create_group_link_start}eine Gruppe erstellen%{create_group_link_end} und %{move_link_start}dieses Projekt zu ihr verschieben%{move_link_end}."
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
-msgstr "Du musst %{move_link_start}dieses Projekt%{move_link_end} in eine deiner Gruppen verschieben."
+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 your projects to it%{move_link_end}."
+msgstr "Du hast keine Gruppen. Du musst %{create_group_link_start}eine Gruppe erstellen%{create_group_link_end} und %{move_link_start}deine Projekte dorthin verschieben%{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 "Deine GitLab.com %{plan} Testversion läuft %{strong_open} am %{expiration_date}%{strong_close} ab. Du kannst den Zugriff auf die %{plan} Funktionen behalten, indem du unten ein Upgrade durchführst."
@@ -7413,10 +7487,10 @@ msgstr "Genutzte Plätze / Plätze im Abonnement"
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr "Gemeinsame Runner können erst aktiviert werden, wenn eine gültige Kreditkarte hinterlegt ist."
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr "Konto validieren"
msgid "Billings|Validate user account"
msgstr "Benutzer(innen)-Konto validieren"
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7548,7 +7622,7 @@ msgid "Blame could not be loaded as a single page."
msgstr "Blame konnte nicht als einzelne Seite geladen werden."
msgid "Blame for binary files is not supported."
-msgstr "Blaming für Binärdateien wird nicht unterstützt."
+msgstr "Blame wird für Binärdateien nicht unterstützt."
msgid "BlobViewer|View on %{environmentName}"
msgstr "Ansicht auf %{environmentName}"
@@ -7722,12 +7796,18 @@ msgstr "Beim Erstellen des Tickets trat ein Fehler auf. Bitte versuche es erneut
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr "Beim Erstellen der Liste trat ein Fehler auf. Bitte versuche es erneut."
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr "Beim Abrufen der untergeordneten Gruppen ist ein Fehler aufgetreten. Bitte versuche es erneut."
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr "Beim Abrufen von Gruppenprojekten ist ein Fehler aufgetreten. Bitte versuche es erneut."
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr "Beim Abrufen der Gruppen ist ein Fehler aufgetreten. Bitte versuche es erneut."
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr "Beim Abrufen der Tickets ist ein Fehler aufgetreten. Bitte lade die Seite neu."
@@ -7790,9 +7870,6 @@ msgstr "Aufklappen"
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr "Fehler beim Abrufen der %{issuableType}-Blockierung"
-msgid "Boards|List actions"
-msgstr "Aktionen auflisten"
-
msgid "Boards|Move card"
msgstr "Karte verschieben"
@@ -7850,6 +7927,9 @@ msgstr "Weitere Anliegen laden"
msgid "Board|Loading epics"
msgstr "Epics werden geladen"
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr "Fettgedruckter Text"
@@ -8232,7 +8312,7 @@ msgid "BroadcastMessages|Ends at"
msgstr "Endet bei"
msgid "BroadcastMessages|Git remote responses"
-msgstr ""
+msgstr "Git-Remote-Antworten"
msgid "BroadcastMessages|Green"
msgstr "Grün"
@@ -8267,8 +8347,17 @@ msgstr "Pfade können Platzhalter wie */welcome enthalten"
msgid "BroadcastMessages|Red"
msgstr "Rot"
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr "Nur für Benutzer anzeigen, die bestimmte Rollen auf Gruppen-/Projektseiten haben"
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
-msgstr ""
+msgstr "Zeige die Broadcast-Nachricht in einer Kommandozeile als Git-Remote-Antwort an"
+
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr "Für alle Benutzer auf allen Seiten anzeigen"
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr "Für alle Benutzer auf bestimmten passenden Seiten anzeigen"
msgid "BroadcastMessages|Starts at"
msgstr "Beginnt bei"
@@ -8276,12 +8365,12 @@ msgstr "Beginnt bei"
msgid "BroadcastMessages|Target Path"
msgstr "Zielpfad"
+msgid "BroadcastMessages|Target broadcast message"
+msgstr "Ziel-Broadcast-Nachricht"
+
msgid "BroadcastMessages|Target roles"
msgstr "Zielrollen"
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
-msgstr "Die Broadcast-Nachricht wird nur Benutzern in Projekten und Gruppen angezeigt, die diese Rollen haben."
-
msgid "BroadcastMessages|Theme"
msgstr "Thema"
@@ -8304,7 +8393,7 @@ msgid "BroadcastMessages|Your message here"
msgstr "Deine Nachricht hier"
msgid "Browse CI/CD Catalog"
-msgstr ""
+msgstr "CI/CD-Katalog durchsuchen"
msgid "Browse Directory"
msgstr "Verzeichnis durchsuchen"
@@ -8516,6 +8605,9 @@ msgstr "Nach Monat"
msgid "By quarter"
msgstr "Nach Quartal"
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr "Durch die Verwendung einer primären E-Mail-Adresse, die mit einer Unternehmens-E-Mail-Adresse verknüpft ist, bestätigst du, dass es sich bei diesem Konto um eine(n) Unternehmensbenutzer(in) handelt."
+
msgid "By week"
msgstr "Nach Woche"
@@ -8526,7 +8618,7 @@ msgid "CHANGELOG"
msgstr "CHANGELOG"
msgid "CI"
-msgstr ""
+msgstr "CI"
msgid "CI Lint"
msgstr "CI Lint"
@@ -8894,7 +8986,7 @@ msgid "Cannot create the abuse report. The user has been deleted."
msgstr "Der Missbrauchsbericht kann nicht erstellt werden. Der/die Benutzer(in) wurde gelöscht."
msgid "Cannot create the abuse report. This user has been banned."
-msgstr "Der Missbrauchsbericht kann nicht erstellt werden. Der Benutzer wurde gesperrt."
+msgstr "Der Missbrauchsbericht kann nicht erstellt werden. Der/die Benutzer(in) wurde gesperrt."
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr "Kann %{profile_name}, auf den in der Sicherheitsrichtlinie verwiesen wird, nicht löschen"
@@ -9010,11 +9102,11 @@ msgstr "Fehlerquote bei Änderungen"
msgid "Change assignee"
msgstr "Beauftragte(n) ändern"
-msgid "Change assignee(s)"
-msgstr "Zuweisung(en) ändern"
+msgid "Change assignees"
+msgstr "Beauftragte ändern"
-msgid "Change assignee(s)."
-msgstr "Zuweisung(en) ändern."
+msgid "Change assignees."
+msgstr "Beauftragte ändern."
msgid "Change branches"
msgstr "Zweige wechseln"
@@ -9031,11 +9123,11 @@ msgstr "Meilenstein ändern"
msgid "Change path"
msgstr "Pfad ändern"
-msgid "Change reviewer(s)"
-msgstr "Reviewer ändern"
+msgid "Change reviewers"
+msgstr "Prüfer(in) ändern"
-msgid "Change reviewer(s)."
-msgstr "Reviewer ändern."
+msgid "Change reviewers."
+msgstr "Prüfer(innen) ändern."
msgid "Change role"
msgstr "Rolle ändern"
@@ -9058,8 +9150,11 @@ msgstr "Art der Arbeitsaufgabe ändern"
msgid "Change your password"
msgstr "Ändere dein Passwort"
-msgid "Change your password or recover your current one"
-msgstr "Ändere dein Passwort oder stelle dein aktuelles wieder her"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
+msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
msgstr "Alle Überprüfer wurden entfernt."
@@ -9106,14 +9201,14 @@ msgstr "Deine Änderungen werden auf %{branchName} angewandt, weil eine Merge Re
msgid "Changed"
msgstr "Geändert"
-msgid "Changed assignee(s)."
-msgstr "Beauftragte(n) geändert."
+msgid "Changed assignees."
+msgstr "Beauftragte geändert."
msgid "Changed merge method to %{merge_method}"
msgstr "Merge-Methode auf %{merge_method} geändert"
-msgid "Changed reviewer(s)."
-msgstr "Reviewer geändert."
+msgid "Changed reviewers."
+msgstr "Prüfer(innen) geändert."
msgid "Changed squash option to %{squash_option}"
msgstr "Squash-Option auf %{squash_option} geändert"
@@ -9154,9 +9249,6 @@ msgstr "Zeichen übrig"
msgid "Characters over limit"
msgstr "Zeichen zuviel"
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr "Diagrammanzeige unmöglich, da eine Zeitüberschreitung bei der Datenabfrage auftrat. %{documentationLink}"
-
msgid "Chat"
msgstr "Chat"
@@ -9262,13 +9354,13 @@ msgstr "%{pricePerUserPerYear} $ pro Benutzer(in) pro Jahr"
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr "%{selectedPlanPrice} $ pro Speicherpaket mit 10 GB pro Jahr"
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
msgid_plural "Checkout|%d compute packs"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Rechenpaket"
+msgstr[1] "%d Rechenpakete"
msgid "Checkout|%{cardType} ending in %{lastFourDigits}"
msgstr "%{cardType} endet mit %{lastFourDigits}"
@@ -9276,23 +9368,23 @@ msgstr "%{cardType} endet mit %{lastFourDigits}"
msgid "Checkout|%{name}'s GitLab subscription"
msgstr "%{name}s GitLab-Abonnement"
+msgid "Checkout|%{name}'s compute minutes"
+msgstr ""
+
msgid "Checkout|%{name}'s storage subscription"
msgstr "Speicherabonnement von %{name}"
-msgid "Checkout|%{name}'s units of compute"
-msgstr ""
-
msgid "Checkout|%{quantity} GB of storage"
msgstr "%{quantity} GB Speicherplatz"
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] "%{quantity} Speicherpaket"
msgstr[1] "%{quantity} Speicherpakete"
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr "%{selectedPlanText}-Tarif"
@@ -9330,9 +9422,9 @@ msgid "Checkout|City"
msgstr "Stadt"
msgid "Checkout|Compute pack"
-msgstr ""
+msgstr "Rechenpaket"
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,12 +9565,12 @@ msgstr "Steuern"
msgid "Checkout|Total"
msgstr "Gesamtsumme"
+msgid "Checkout|Total compute minutes: %{quantity}"
+msgstr ""
+
msgid "Checkout|Total storage: %{quantity} GB"
msgstr "Gesamter Speicherplatz: %{quantity} GB"
-msgid "Checkout|Total units of compute: %{quantity}"
-msgstr ""
-
msgid "Checkout|Users"
msgstr "Benutzer"
@@ -9503,7 +9595,7 @@ msgstr "Speicherabonnement"
msgid "Checkout|company or team"
msgstr "Unternehmen oder Team"
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr "Typ auswählen..."
msgid "Choose file…"
msgstr "Datei auswählen…"
+msgid "Choose protected branch"
+msgstr "Geschützten Branch auswählen"
+
msgid "Choose the top-level group for your repository imports."
msgstr "Wähle die übergeordnetste Gruppe für deine Repository-Importe."
@@ -9576,31 +9671,34 @@ msgid "Ci config already present"
msgstr "Ci Konfiguration bereits vorhanden"
msgid "CiCatalog|About this project"
-msgstr ""
+msgstr "Ãœber dieses Projekt"
-msgid "CiCatalog|CI/CD Catalog resource"
-msgstr ""
+msgid "CiCatalog|CI/CD Catalog"
+msgstr "CI/CD-Katalog"
-msgid "CiCatalog|CI/CD catalog"
-msgstr "CI/CD Katalog"
+msgid "CiCatalog|CI/CD Catalog resource"
+msgstr "CI/CD-Katalogressource"
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr "Erstelle ein Repository für die Pipeline-Komponenten und mache die Wiederverwendung von Pipeline-Konfigurationen schneller und einfacher."
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr "Erste Schritte mit dem CI/CD-Katalog"
msgid "CiCatalog|Go to the project"
-msgstr ""
+msgstr "Gehe zum Projekt"
msgid "CiCatalog|Last release at %{date}"
-msgstr ""
+msgstr "Letzte Veröffentlichung am %{date}"
msgid "CiCatalog|Mark project as a CI/CD Catalog resource"
-msgstr ""
+msgstr "Projekt als CI/CD-Katalogressource markieren"
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
-msgstr ""
+msgstr "Projekt als CI/CD-Katalogressource markieren. %{linkStart}Was ist der CI/CD-Katalog?%{linkEnd}"
+
+msgid "CiCatalog|No release available"
+msgstr "Keine Veröffentlichung verfügbar"
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr "Seite %{currentPage} von %{totalPage}"
@@ -9612,25 +9710,28 @@ msgid "CiCatalog|Repositories of pipeline components available in this namespace
msgstr "Repositorys mit Pipeline-Komponenten sind in diesem Namensraum verfügbar."
msgid "CiCatalog|The project must contain a README.md file and a template.yml file. When enabled, the repository is available in the CI/CD Catalog."
-msgstr ""
+msgstr "Das Projekt muss eine README.md-Datei und eine template.yml-Datei enthalten. Wenn aktiviert, ist das Repository im CI/CD-Katalog verfügbar."
msgid "CiCatalog|There was a problem fetching the CI/CD Catalog setting."
-msgstr ""
+msgstr "Es gab ein Problem beim Abrufen der CI-/CD-Katalogeinstellung."
msgid "CiCatalog|There was a problem marking the project as a CI/CD Catalog resource."
-msgstr ""
+msgstr "Es gab ein Problem beim Markieren des Projekts als CI/CD Katalogressource."
msgid "CiCatalog|There was an error fetching CI/CD Catalog resources."
msgstr "Beim Abrufen der CI/CD-Katalogressourcen ist ein Fehler aufgetreten."
msgid "CiCatalog|This project is now a CI/CD Catalog resource."
-msgstr ""
+msgstr "Dieses Projekt ist jetzt eine CI/CD Katalogressource."
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
-msgstr ""
+msgstr "Dieses Projekt wird als CI/CD Katalogressource gekennzeichnet und wird im CI/CD Katalog sichtbar sein. Diese Aktion kann nicht rückgängig gemacht werden."
+
+msgid "CiCatalog|Unreleased"
+msgstr "Unveröffentlicht"
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
-msgstr ""
+msgstr "Wir wollen dir helfen, Repositorys für Pipeline-Komponenten zu erstellen und zu verwalten, und gleichzeitig die Wiederverwendung von Pipeline-Konfigurationen erleichtern. Lass uns wissen, wie wir uns machen!"
msgid "CiCdAnalytics|Date range: %{range}"
msgstr "Datumsbereich: %{range}"
@@ -9660,7 +9761,7 @@ msgid "CiStatusLabel|preparing"
msgstr "Vorbereitung"
msgid "CiStatusLabel|scheduled"
-msgstr ""
+msgstr "geplant"
msgid "CiStatusLabel|skipped"
msgstr "übersprungen"
@@ -9702,7 +9803,7 @@ msgid "CiStatusText|preparing"
msgstr "Vorbereitung"
msgid "CiStatusText|scheduled"
-msgstr ""
+msgstr "geplant"
msgid "CiStatusText|skipped"
msgstr "übersprungen"
@@ -9711,13 +9812,13 @@ msgid "CiStatusText|waiting"
msgstr "warte"
msgid "CiStatusText|warning"
-msgstr ""
+msgstr "Warnung"
msgid "CiStatus|running"
msgstr "laufend"
msgid "CiVariables|Attributes"
-msgstr ""
+msgstr "Attribute"
msgid "CiVariables|Cancel"
msgstr "Abbrechen"
@@ -9732,10 +9833,10 @@ msgid "CiVariables|Expanded"
msgstr "Erweitert"
msgid "CiVariables|File"
-msgstr ""
+msgstr "Datei"
msgid "CiVariables|Group"
-msgstr ""
+msgstr "Gruppe"
msgid "CiVariables|Input variable key"
msgstr "Variablenschlüssel eingeben"
@@ -9750,7 +9851,7 @@ msgid "CiVariables|Masked"
msgstr "Maskiert"
msgid "CiVariables|Maximum number of Inherited Group CI variables loaded (2000)"
-msgstr ""
+msgstr "Maximale Anzahl der geerbten Gruppen-CI-Variablen geladen (2000)"
msgid "CiVariables|Maximum number of variables reached."
msgstr "Maximale Anzahl an Variablen erreicht."
@@ -9783,7 +9884,7 @@ msgid "CiVariables|State"
msgstr "Status"
msgid "CiVariables|There was an error fetching the inherited CI variables."
-msgstr ""
+msgstr "Es gab einen Fehler beim Abrufen der geerbten CI-Variablen."
msgid "CiVariables|This %{entity} has %{currentVariableCount} defined CI/CD variables. The maximum number of variables per %{entity} is %{maxVariableLimit}. To add new variables, you must reduce the number of defined variables."
msgstr "Diese %{entity} hat %{currentVariableCount} definierte CI/CD-Variablen. Die maximale Anzahl an Variablen pro %{entity} ist %{maxVariableLimit}. Um neue Variablen hinzuzufügen, musst du die Anzahl der definierten Variablen reduzieren."
@@ -9869,7 +9970,7 @@ msgid "Clear All"
msgstr "Alle löschen"
msgid "Clear all"
-msgstr ""
+msgstr "Alle löschen"
msgid "Clear all repository checks"
msgstr "Alle Repository-Prüfungen löschen"
@@ -10000,6 +10101,9 @@ msgstr "Dieses Ticket, ohne Kommentare, zu %{project} duplizieren."
msgid "Close"
msgstr "Schließen"
+msgid "Close %{issuableType}"
+msgstr "%{issuableType} schließen"
+
msgid "Close %{issueType}"
msgstr "%{issueType} schließen"
@@ -10057,6 +10161,9 @@ msgstr "Schließt dieses %{quick_action_target}."
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr "Dieses Problem wurde geschlossen. Markiert als verwandt mit und ein Duplikat von %{duplicate_reference}."
+msgid "Closing %{issuableType}..."
+msgstr "%{issuableType} wird geschlossen..."
+
msgid "Cloud Run"
msgstr "Cloud Run"
@@ -10424,7 +10531,7 @@ msgid "ClusterAgents|Event occurred"
msgstr "Ereignis eingetreten"
msgid "ClusterAgents|External project"
-msgstr ""
+msgstr "Externes Projekt"
msgid "ClusterAgents|Failed to create a token"
msgstr "Token konnte nicht erstellt werden"
@@ -10597,10 +10704,10 @@ msgid "ClusterAgents|Your instance doesn't have the %{linkStart}GitLab Agent Ser
msgstr "Für deine Instanz ist %{linkStart}GitLab Agent Server (KAS)%{linkEnd} eingerichtet. Bitte eine(n) GitLab-Administrator(in), ihn zu installieren."
msgid "ClusterAgents|shared"
-msgstr ""
+msgstr "geteilt"
msgid "ClusterAgent|An agent can have only two active tokens at a time"
-msgstr ""
+msgstr "Ein Agent kann jeweils nur zwei aktive Token haben"
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr "Benutzer(in) hat unzureichend Berechtigungen, um ein Token für dieses Projekt zu erstellen."
@@ -10650,9 +10757,6 @@ msgstr "Erweiterte Optionen für die Integration dieses Kubernetes-Clusters"
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr "Erlaube GitLab, Namensräume und Dienstkonten für diesen Cluster zu verwalten."
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr "Ermöglicht es GitLab, Metriken von einer speziell konfigurierten, clusterinternen Prometheus-Instanz zu erhalten"
-
msgid "ClusterIntegration|Amazon EKS"
msgstr "Amazon EKS"
@@ -10737,9 +10841,6 @@ msgstr "Wusstest du schon?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr "Elastic Kubernetes Service"
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr "Prometheus-Integration aktivieren"
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr "Aktiviere oder deaktiviere die Verbindung zwischen GitLab und deinem Kubernetes-Cluster."
@@ -10800,9 +10901,6 @@ msgstr "Integration deaktiviert"
msgid "ClusterIntegration|Integration enabled"
msgstr "Integration aktiviert"
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr "Integrationen ermöglichen es dir, Anwendung, die auf deinen Clustern installiert sind, als Teil deines GitLab-Workflows zu nutzen."
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr "Kubernetes Cluster wird erstellt..."
@@ -11038,22 +11136,25 @@ msgid "CodeNavigation|No references found"
msgstr "Keine Referenzen gefunden"
msgid "CodeOwners|An error occurred while loading code owners."
-msgstr ""
+msgstr "Beim Laden der Code-Eigentümer(innen) ist ein Fehler aufgetreten."
msgid "CodeOwners|Assign users and groups as approvers for specific file changes."
-msgstr ""
+msgstr "Benutzer(innen) und Gruppen als Genehmigungsberechtigte für bestimmte Dateiänderungen zuweisen."
msgid "CodeOwners|Code owners"
+msgstr "Code-Eigentümer(innen)"
+
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
msgstr ""
msgid "CodeOwners|Hide all"
-msgstr ""
+msgstr "Alle ausblenden"
msgid "CodeOwners|Learn more."
-msgstr ""
+msgstr "Erfahre mehr."
msgid "CodeOwners|Show all"
-msgstr ""
+msgstr "Alle anzeigen"
msgid "CodeOwner|Pattern"
msgstr "Muster"
@@ -11062,34 +11163,40 @@ msgid "CodeQuality|New code quality degradations on this line"
msgstr "Neue Verschlechterungen der Codequalität in dieser Zeile"
msgid "CodeSuggestionsAlert|Code faster and more efficiently with AI-powered code suggestions in VS Code. 13 languages are supported, including JavaScript, Python, Go, Java, and Kotlin. Enable Code Suggestions in your %{preference_link_start}user profile preferences%{link_end} or %{docs_link_start}see the documentation%{link_end} to learn more."
-msgstr ""
+msgstr "Code schneller und effizienter mit KI-gestützten Codevorschlägen in VS Code. Es werden 13 Sprachen unterstützt, darunter JavaScript, Python, Go, Java und Kotlin. Aktiviere die Codevorschläge in den %{preference_link_start}Einstellungen deines Benutzerprofils%{link_end} oder %{docs_link_start}lies die Dokumentation%{link_end}, um mehr zu erfahren."
msgid "CodeSuggestionsAlert|Enable Code Suggestions"
-msgstr ""
+msgstr "Code-Vorschläge aktivieren"
msgid "CodeSuggestionsAlert|Get started with Code Suggestions, available for free during the beta period."
-msgstr ""
+msgstr "Nutze die Funktion Codevorschläge, die während der Beta-Phase kostenlos verfügbar sind."
msgid "CodeSuggestionsSM|&#8226; Agree to the %{terms_link_start}GitLab Testing Agreement%{link_end}.%{br} &#8226; Acknowledge that GitLab will send data from the instance, including personal data, to Google for cloud hosting.%{br} &nbsp;&nbsp;&nbsp;We may also send data to %{ai_docs_link_start}third-party AI providers%{link_end} to provide this feature."
-msgstr ""
+msgstr "• Stimme der %{terms_link_start}GitLab-Testvereinbarung%{link_end} zu.%{br} • Bestätige, dass GitLab Daten von der Instanz, einschließlich persönlicher Daten, an Google für das Cloud-Hosting senden darf.%{br} Es kann auch sein, dass wir Daten an %{ai_docs_link_start}KI-Drittanbieter%{link_end} senden, um diese Funktion bereitzustellen."
msgid "CodeSuggestionsSM|Code Suggestions"
-msgstr ""
+msgstr "Code-Vorschläge"
msgid "CodeSuggestionsSM|Enable Code Suggestion for users of this GitLab instance."
-msgstr ""
+msgstr "Code-Vorschläge für Benutzer(innen) dieser GitLab-Instanz aktivieren."
msgid "CodeSuggestionsSM|Enter new personal access token"
-msgstr ""
+msgstr "Gib ein neues persönliches Zugriffstoken ein"
msgid "CodeSuggestionsSM|Personal access token"
-msgstr ""
+msgstr "Persönliches Zugriffstoken"
msgid "CodeSuggestionsSM|Turn on Code Suggestions for this instance. By turning on this feature, you:"
-msgstr ""
+msgstr "Aktiviere Codevorschläge für diese Instanz. Wenn du diese Funktion verwendest, kannst du:"
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
-msgstr ""
+msgstr "Dein persönliches Zugangstoken von GitLab.com. In der %{link_start}Dokumentation%{link_end} findest du Informationen zur Erstellung eines persönlichen Zugangstokens."
+
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr "%{code_suggestions_link_start}Codevorschläge%{link_end} nutzt jetzt KI-Dienste von Drittanbietern, um noch bessere Vorschläge zu machen. Du kannst %{third_party_link_start}Dienste von Drittanbietern%{link_end} für deine Gruppe blockieren oder Codevorschläge in %{profile_settings_link_start}deinem Benutzerprofil%{link_end} ganz deaktivieren."
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr "Wir nutzen KI-Dienste von Drittanbietern, um Codevorschläge zu verbessern."
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr "%{link_start}Was sind Codevorschläge?%{link_end}"
@@ -11098,19 +11205,16 @@ msgid "CodeSuggestions|Code Suggestions"
msgstr "Codevorschläge"
msgid "CodeSuggestions|Enable Code Suggestions"
-msgstr ""
+msgstr "Code-Vorschläge aktivieren"
msgid "CodeSuggestions|Get code suggestions as you write code in your IDE. %{link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "Erhalte Codevorschläge, während du Code in deiner IDE schreibst. %{link_start}Mehr erfahren.%{link_end}"
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
+msgstr "Projekte in dieser Gruppe können Codevorschläge verwenden."
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
-msgstr ""
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
+msgstr "Unterliegt den %{terms_link_start}Nutzungsbedingungen für Tests%{link_end}. Codevorschläge nutzt derzeit KI-Dienste von Drittanbietern, es sei denn, diese sind %{third_party_features_link_start}deaktiviert%{link_end}."
msgid "Cohorts|Inactive users"
msgstr "Inaktive Benutzer"
@@ -11194,28 +11298,37 @@ msgid "Command"
msgstr "Befehl"
msgid "Command id '%{command}' must not start with '%{prefix}'"
-msgstr "Die Befehls-ID „%{command}“ darf nicht mit „%{prefix}“ beginnen."
+msgstr "Die Befehls-ID „%{command}“ darf nicht mit „%{prefix}“ beginnen"
msgid "Command line instructions"
msgstr "Kommandozeilenbefehle"
msgid "CommandPalette|Global Commands"
-msgstr ""
+msgstr "Globale Befehle"
msgid "CommandPalette|Pages"
-msgstr ""
+msgstr "Seiten"
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
-msgstr ""
+msgid "CommandPalette|Project files"
+msgstr "Projektdateien"
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
-msgstr ""
+msgstr "Befehl"
+
+msgid "CommandPalette|go to project file"
+msgstr "Gehe zu Projektdatei"
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr "Ticket (mindestens 3 Zeichen eingeben)"
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr "Projekt (mindestens 3 Zeichen eingeben)"
msgid "CommandPalette|user (enter at least 3 chars)"
-msgstr ""
+msgstr "Benutzer(in) (mindestens 3 Zeichen eingeben)"
msgid "Commands applied"
msgstr "Befehle angewendet"
@@ -11251,7 +11364,7 @@ msgid "Comment on lines %{startLine} to %{endLine}"
msgstr "Kommentar zu den Zeilen %{startLine} bis %{endLine}"
msgid "Comment on this file"
-msgstr ""
+msgstr "Kommentiere diese Datei"
msgid "Comment template actions"
msgstr "Kommentarvorlagenaktionen"
@@ -11306,18 +11419,12 @@ msgstr "Commit gelöscht"
msgid "Commit message"
msgstr "Commit Nachricht"
-msgid "Commit message (optional)"
-msgstr "Commit-Nachricht (optional)"
-
msgid "Commit message generated by AI"
msgstr "Von KI generierte Commit-Nachricht"
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr "Commit-Statistik für %{ref} %{start_time} - %{end_time}"
-msgid "Commit to %{branchName} branch"
-msgstr "Committe zum %{branchName}-Branch"
-
msgid "CommitBoxTitle|Commit"
msgstr "Commit"
@@ -11379,16 +11486,16 @@ msgid "Committed-before"
msgstr "Committet-vor"
msgid "Commit|Branches"
-msgstr ""
+msgstr "Branches"
msgid "Commit|Tags"
-msgstr ""
+msgstr "Tags"
msgid "Commit|There was an error fetching the commit references. Please try again later."
-msgstr ""
+msgstr "Beim Abrufen der Commit-Referenzen ist ein Fehler aufgetreten. Bitte versuche es später noch einmal."
msgid "Commit|containing commit"
-msgstr ""
+msgstr "enthält Commit"
msgid "Community forum"
msgstr "Community-Forum"
@@ -11444,15 +11551,30 @@ msgstr "Es gibt nichts zu vergleichen."
msgid "CompareRevisions|Branches"
msgstr "Branches"
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr "Änderungen werden so angezeigt, als ob die %{boldStart}Quellrevision%{boldEnd} mit der %{boldStart}Zielrevision%{boldEnd} zusammengeführt würde. %{linkStart}Erfahre mehr über den Vergleich von Revisionen.%{linkEnd}"
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr "Commits auf Quelle (%{commits_amount})"
+
msgid "CompareRevisions|Compare"
msgstr "Vergleichen"
+msgid "CompareRevisions|Compare revisions"
+msgstr "Revisionen vergleichen"
+
msgid "CompareRevisions|Create merge request"
msgstr "Merge Request erstellen"
msgid "CompareRevisions|Filter by Git revision"
msgstr "Nach Git-Revision filtern"
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr "Änderungen am Ziel seit Erstellung der Quelle einbeziehen"
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr "Nur eingehende Änderungen aus der Quelle"
+
msgid "CompareRevisions|Select Git revision"
msgstr "Git-Revision auswählen"
@@ -11462,6 +11584,12 @@ msgstr "Branch/Tag auswählen"
msgid "CompareRevisions|Select target project"
msgstr "Zielprojekt auswählen"
+msgid "CompareRevisions|Show changes"
+msgstr "Änderungen anzeigen"
+
+msgid "CompareRevisions|Swap"
+msgstr "Tauschen"
+
msgid "CompareRevisions|Swap revisions"
msgstr "Revision wechseln"
@@ -11498,17 +11626,20 @@ msgstr "Fertig"
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr "Abgeschlossen in %{duration_seconds} Sekunden (%{relative_time})"
-msgid "Compliance Report|Export as CSV"
-msgstr "Export als CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr "Exportiere Frameworks als CSV. Du erhältst eine E-Mail, sobald der Export verarbeitet wurde."
+
+msgid "Compliance Report|Export full report as CSV"
+msgstr "Vollständigen Bericht als CSV exportieren"
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
-msgstr "Frameworks als CSV exportieren. Du wirst per E-Mail benachrichtigt, nachdem der Export verarbeitet wurde."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
+msgstr "Exportiere Merge Request-Verletzungen als CSV. Du erhältst eine E-Mail, sobald der Export verarbeitet wurde."
msgid "Compliance Report|Frameworks"
msgstr "Frameworks"
msgid "Compliance Report|Standards Adherence"
-msgstr ""
+msgstr "Einhalten von Normen"
msgid "Compliance Report|Violations"
msgstr "Verstöße"
@@ -11699,6 +11830,9 @@ msgstr "Weniger als 2 Genehmigungsberechtigte"
msgid "ComplianceReport|No projects found"
msgstr "Keine Projekte gefunden"
+msgid "ComplianceReport|No projects found that match filters"
+msgstr "Keine Projekte gefunden, die den Filtern entsprechen"
+
msgid "ComplianceReport|No violations found"
msgstr "Keine Verstöße gefunden"
@@ -11739,19 +11873,19 @@ msgid "Component name '%{component}' must not start with '%{prefix}'"
msgstr "Komponentenname „%{component}“ darf nicht mit „%{prefix}“ beginnen"
msgid "Component type '%s' is not yet supported"
-msgstr "Der Komponententyp '%s' wird noch nicht unterstützt"
+msgstr "Der Komponententyp „%s“ wird noch nicht unterstützt"
msgid "Components must have a 'name'"
-msgstr "Komponenten müssen einen 'Namen' haben"
+msgstr "Komponenten müssen einen „Namen“ haben"
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
-msgstr ""
+msgid "Compute quota"
+msgstr "Rechenkontingent"
-msgid "Confidence"
-msgstr "Vertrauen"
+msgid "Compute quota:"
+msgstr "Rechenkontingent:"
msgid "Confidential"
msgstr "Vertraulich"
@@ -11807,9 +11941,6 @@ msgstr "Zeitüberschreitung für Gitaly konfigurieren."
msgid "Configure Integrations"
msgstr "Konfiguriere Integrationen"
-msgid "Configure Prometheus"
-msgstr "Prometheus konfigurieren"
-
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 "Konfiguriere SAST IaC in der Datei „.gitlab-ci.yml“ mithilfe der von GitLab verwalteten Vorlage. Du kannst [Variablenüberschreibungen hinzufügen](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings), um die SAST-IaC-Einstellungen anzupassen."
@@ -11846,9 +11977,6 @@ msgstr "Konfiguriere erweiterte Berechtigungen, Speicherung großer Dateien, Zwe
msgid "Configure custom rules for Jira issue key matching"
msgstr "Konfiguriere benutzerdefinierte Regeln für den Abgleich von Jira-Tickets"
-msgid "Configure existing installation"
-msgstr "Vorhandene Installation konfigurieren"
-
msgid "Configure pipeline"
msgstr "Pipeline konfigurieren"
@@ -12011,15 +12139,9 @@ msgstr "Verbindung zur Remote-Umgebung wird hergestellt..."
msgid "Connecting..."
msgstr "Verbinden..."
-msgid "Connection failed"
-msgstr "Verbindung fehlgeschlagen"
-
msgid "Connection failure"
msgstr "Verbindungsfehler"
-msgid "Connection timed out"
-msgstr "Zeitüberschreitung der Verbindung"
-
msgid "Consistency guarantee method"
msgstr "Konsistenzgarantiemethode"
@@ -12039,7 +12161,7 @@ msgid "Container Scanning"
msgstr "Container-Scanning"
msgid "Container must be a group."
-msgstr ""
+msgstr "Der Container muss eine Gruppe sein."
msgid "Container must be a project or a group."
msgstr "Container muss ein Projekt oder eine Gruppe sein."
@@ -12399,7 +12521,7 @@ msgid "Containers"
msgstr "Container"
msgid "Contains only whitespace changes."
-msgstr ""
+msgstr "Enthält nur Leerzeichenänderungen."
msgid "Content"
msgstr "Inhalt"
@@ -12407,9 +12529,6 @@ msgstr "Inhalt"
msgid "Content parsed with %{link}."
msgstr "Inhalt geparst mit %{link}."
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr "Für %{quickActionsDocsLinkStart}Schnellaktionen%{quickActionsDocsLinkEnd}gib %{keyboardStart}/%{keyboardEnd}ein."
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr "Du musst eine renderMarkdown Funktion oder einen eigenen Serializer bereitstellen"
@@ -12533,6 +12652,39 @@ msgstr "Es sind zu viele Daten zu berechnen. Versuche die Einstellung period_lim
msgid "ContributionAnalytics|Total Contributions"
msgstr "Gesamtbeiträge"
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr "Genehmigte Merge Requests %{targetLink} in %{resourceParentLink}."
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr "Projekt %{resourceParentLink} beigetreten."
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr "Projekt %{resourceParentLink} verlassen."
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr "Aufgrund des Ablaufs der Mitgliedschaft von %{resourceParentLink} entfernt."
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr "Beiträge für %{calendar_date}"
@@ -12624,7 +12776,7 @@ msgid "Copy environment"
msgstr "Umgebung kopieren"
msgid "Copy epic URL"
-msgstr "Epic URL kopieren"
+msgstr "Epic-URL kopieren"
msgid "Copy evidence SHA"
msgstr "Kopiere Beweis SHA"
@@ -12662,11 +12814,8 @@ msgstr "Link kopieren"
msgid "Copy link URL"
msgstr "Link-URL kopieren"
-msgid "Copy link to chart"
-msgstr "Link zu Diagramm kopieren"
-
msgid "Copy merge request URL"
-msgstr ""
+msgstr "Merge-Request-URL kopieren"
msgid "Copy reference"
msgstr "Referenz kopieren"
@@ -12830,6 +12979,9 @@ msgstr "Der Trigger konnte nicht entfernt werden."
msgid "Could not restore the group"
msgstr "Gruppe konnte nicht wiederhergestellt werden"
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr "Zugriffstoken %{access_token_name} konnte nicht widerrufen werden."
@@ -12884,9 +13036,6 @@ msgstr "%{environment} erstellen"
msgid "Create %{humanized_resource_name}"
msgstr "%{humanized_resource_name} erzeugen"
-msgid "Create %{type}"
-msgstr "Erstelle %{type}"
-
msgid "Create %{workspace} label"
msgstr "%{workspace}-Label erstellen"
@@ -12929,6 +13078,9 @@ msgstr "Erstelle einen neuen Branch"
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr "Erstelle eine neue Datei, da noch keine Dateien vorhanden sind. Anschließend kannst du deine Änderungen committen."
+msgid "Create a new fork"
+msgstr "Erstelle einen neuen Fork"
+
msgid "Create a new issue"
msgstr "Neues Ticket erstellen"
@@ -13214,6 +13366,9 @@ msgstr "Ticket Phasen-Ende"
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr "Maximal-Länge %{maxLength} Zeichen"
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr "Mindestlänge %{minLength} Zeichen"
+
msgid "CreateValueStreamForm|Name is required"
msgstr "Name ist erforderlich"
@@ -13358,9 +13513,6 @@ msgstr "Erstellen"
msgid "Creating epic"
msgstr "Epic wird angelegt"
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr "Die Erstellung von Graphen verwendet die Daten vom Prometheus-Server. Wenn dies lange dauert, stelle sicher, dass Daten verfügbar sind."
-
msgid "Creator"
msgstr "Autor(in)"
@@ -13829,7 +13981,7 @@ msgid "DORA4Metrics|Change failure rate (percentage)"
msgstr "Fehlerrate ändern (Prozent)"
msgid "DORA4Metrics|Closed issues"
-msgstr ""
+msgstr "Geschlossene Tickets"
msgid "DORA4Metrics|Critical Vulnerabilities over time"
msgstr "Kritische Sicherheitslücken im Zeitverlauf"
@@ -13895,7 +14047,7 @@ msgid "DORA4Metrics|Median time an incident was open in a production environment
msgstr "Mittlere Zeit, in der ein Vorfall in einer Produktionsumgebung im angegebenen Zeitraum offen war."
msgid "DORA4Metrics|Merge request throughput"
-msgstr ""
+msgstr "Durchsatz der Merge Requests"
msgid "DORA4Metrics|Metrics comparison for %{name} group"
msgstr "Metrikvergleich für die Gruppe %{name}"
@@ -13952,7 +14104,7 @@ msgid "DORA4Metrics|The chart displays the median time between a merge request b
msgstr "Das Diagramm zeigt die durchschnittliche Zeit an, die vergeht, bis ein Merge Request gemerged und in der/den Produktionsumgebung(en) deployt wird, welche auf dem %{linkStart}deployment_tier%{linkEnd}-Wert basieren."
msgid "DORA4Metrics|This is a lower-bound approximation. Your group has too many issues and MRs to calculate in real time."
-msgstr ""
+msgstr "Dies ist eine Annäherung an die Untergrenze. Deine Gruppe hat zu viele Tickets und MRs, um sie in Echtzeit zu berechnen."
msgid "DORA4Metrics|Time to Restore Service"
msgstr "Zeit zum Wiederherstellen des Dienstes"
@@ -14452,7 +14604,7 @@ msgid "Data type"
msgstr "Datentyp"
msgid "Database '%{database_name}' is using PostgreSQL %{pg_version_current}, but this version of GitLab requires PostgreSQL %{pg_version_minimum}. Please upgrade your environment to a supported PostgreSQL version. See %{pg_requirements_url} for details."
-msgstr ""
+msgstr "Die Datenbank „%{database_name}“ verwendet PostgreSQL %{pg_version_current}, aber diese Version von GitLab benötigt PostgreSQL %{pg_version_minimum}. Bitte aktualisiere deine Umgebung auf eine unterstützte PostgreSQL-Version. Details findest du unter %{pg_requirements_url}."
msgid "Database update failed"
msgstr "Datenbankaktualisierung fehlgeschlagen"
@@ -14582,6 +14734,12 @@ msgstr "Überprüfung der dekomprimierten Archivgröße ist fehlgeschlagen."
msgid "Decrease"
msgstr "Verringern"
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr "Standard - Nie ausführen"
@@ -14634,7 +14792,7 @@ msgid "DefaultBranchProtection|Both developers and maintainers can push new comm
msgstr "Sowohl Entwickler als auch Betreuer können neue Commits pushen, Push erzwingen oder den Branch löschen."
msgid "DefaultBranchProtection|Developers can push the initial commit to a repository, but none afterward. Maintainers can always push. No one can force push."
-msgstr ""
+msgstr "Entwickler(innen) können den ersten Commit in ein Repository pushen, aber danach keinen mehr. Projektbetreuer(innen) können immer pushen. Niemand kann einen Push erzwingen."
msgid "DefaultBranchProtection|Developers cannot push new commits, but are allowed to accept merge requests to the branch. Maintainers can push to the branch."
msgstr "Entwickler können keine neuen Commits pushen, dürfen aber Merge-Anfragen an den Branch annehmen. Betreuer können auf den Zweig pushen."
@@ -14646,7 +14804,7 @@ msgid "DefaultBranchProtection|Fully protected"
msgstr "Vollständig geschützt"
msgid "DefaultBranchProtection|Fully protected after initial push"
-msgstr ""
+msgstr "Vollständig geschützt nach dem ersten Push"
msgid "DefaultBranchProtection|Not protected"
msgstr "Nicht geschützt"
@@ -14743,8 +14901,8 @@ msgstr "Codeblock löschen"
msgid "Delete column"
msgid_plural "Delete %d columns"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Spalte löschen"
+msgstr[1] "%d Spalten löschen"
msgid "Delete comment"
msgstr "Kommentar entfernen"
@@ -14805,8 +14963,8 @@ msgstr "Release %{release} löschen?"
msgid "Delete row"
msgid_plural "Delete %d rows"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Zeile löschen"
+msgstr[1] "%d Zeilen löschen"
msgid "Delete selected"
msgstr "Ausgewählte löschen"
@@ -14847,6 +15005,9 @@ msgstr "Variable löschen"
msgid "Delete video"
msgstr "Video löschen"
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr "Entfernen des Projektarchivs fehlgeschlagen. Bitte versuche es erneut oder kontaktiere deine(n) Administrator(in)."
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr "Entfernen der Ereignisse fehlgeschlagen. Bitte versuche es erneut oder kontaktiere den/die Administrator(in)."
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] "%d Sicherheitslücke erkannt"
msgstr[1] "%d Sicherheitslücken erkannt"
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr "%{remainingLicensesCount} mehr"
@@ -15005,9 +15172,15 @@ msgstr "Speicherort und Abhängigkeitspfade"
msgid "Dependencies|Packager"
msgstr "Packer"
+msgid "Dependencies|Projects"
+msgstr "Projekte"
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr "Software Bill of Materials (SBOM) basierend auf dem %{linkStart}letzten erfolgreichen%{linkEnd} Scan"
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr "Software Bill of Materials (SBOM) basierend auf dem letzten erfolgreichen Scan jedes Projekts."
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr "Der Job %{codeStartTag}dependency_scanning%{codeEndTag} ist fehlgeschlagen und kann die Liste nicht generieren. Stelle sicher, dass der Job ordnungsgemäß ausgeführt wird, und führe die Pipeline erneut aus."
@@ -15041,6 +15214,9 @@ msgstr "Abhängigkeitsketten werden nicht unterstützt"
msgid "Dependency list"
msgstr "Liste der Abhängigkeiten"
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr "Alle Objekte im Zwischenspeicher sind zur Löschung vorgesehen."
@@ -15059,6 +15235,9 @@ msgstr "In Einstellungen konfigurieren"
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr "Enthält %{count} Bildblöcke/Blobs (%{size})"
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr "Pfad zum Abbild kopieren"
@@ -15083,6 +15262,9 @@ msgstr "Aktiviert den Proxy für die Abhängigkeiten und Einstellungen zum Säub
msgid "DependencyProxy|Image list"
msgstr "Bildliste"
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr "Zur Löschung vorgesehen"
@@ -15092,6 +15274,9 @@ msgstr "Es befinden sich keine Bilder im Cache"
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr "Um das Abbild-Präfix sowie den Cache-Inhalt anzusehen, besuche den %{linkStart} Abhängigkeits-Proxy%{linkEnd}"
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr "Ist diese Option aktiviert, werden Abbilder, die älter als 90 Tage sind, aus dem Cache entfernt."
@@ -15404,9 +15589,6 @@ msgstr "Betreuer(in)"
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr "Lege fest, wie Genehmigungsregeln für Deployments in geschützten Umgebungen angewendet werden."
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr "Wenn eine Pipeline läuft, werden Bauaufträge automatisch in der Pipeline genehmigt, wenn der Trigger genehmigt werden darf."
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr "Aktuelle Zustimmungen: %{current}"
@@ -15559,12 +15741,6 @@ msgstr "Erfolg"
msgid "Deprecated API rate limits"
msgstr "Ratenbegrenzung für veraltete API"
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr "%{epicStart}Erfahre mehr über Opstrace als möglichen Ersatz%{epicEnd}."
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr "Die Metrikfunktion wurde in GitLab 14.7 eingestellt."
-
msgid "Deprioritize label"
msgstr "Label entpriorisieren"
@@ -15574,9 +15750,6 @@ msgstr "Beschreiben das Ziel der Änderungen und was Reviewer wissen sollten."
msgid "Description"
msgstr "Beschreibung"
-msgid "Description (alt text)"
-msgstr "Beschreibung (alternativer Text)"
-
msgid "Description (optional)"
msgstr "Beschreibung (optional)"
@@ -15640,7 +15813,7 @@ msgid "DesignManagement|Are you sure you want to cancel editing this comment?"
msgstr "Bist du sicher, dass du die Bearbeitung dieses Kommentars abbrechen möchtest?"
msgid "DesignManagement|Cancel"
-msgstr ""
+msgstr "Abbrechen"
msgid "DesignManagement|Click the image where you'd like to start a new discussion"
msgstr "Klicke auf das Bild, auf dem du eine neue Diskussion beginnen möchtest"
@@ -15667,7 +15840,7 @@ msgid "DesignManagement|Could not update comment. Please try again."
msgstr "Kommentar konnte nicht aktualisiert werden. Bitte versuche es erneut."
msgid "DesignManagement|Could not update description. Please try again."
-msgstr ""
+msgstr "Beschreibung konnte nicht aktualisiert werden. Bitte versuche es erneut."
msgid "DesignManagement|Could not update discussion. Please try again."
msgstr "Konnte Diskussion nicht aktualisieren. Bitte versuche es erneut."
@@ -15676,7 +15849,7 @@ msgid "DesignManagement|Deselect all"
msgstr "Auswahl aufheben"
msgid "DesignManagement|Design description"
-msgstr ""
+msgstr "Designbeschreibung"
msgid "DesignManagement|Designs"
msgstr "Designs"
@@ -15691,7 +15864,7 @@ msgid "DesignManagement|Download design"
msgstr "Design herunterladen"
msgid "DesignManagement|Edit description"
-msgstr ""
+msgstr "Beschreibung bearbeiten"
msgid "DesignManagement|Error uploading a new design. Please try again."
msgstr "Fehler beim Hochladen eines neuen Designs. Bitte erneut versuchen."
@@ -15706,7 +15879,7 @@ msgid "DesignManagement|Go to previous design"
msgstr "Zum vorherigen Design"
msgid "DesignManagement|None"
-msgstr ""
+msgstr "Keine"
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr "Angeforderte Designversion existiert nicht. Zeige stattdessen die letzte Version an"
@@ -15718,7 +15891,7 @@ msgid "DesignManagement|Resolved Comments"
msgstr "Beendete Kommentare"
msgid "DesignManagement|Save"
-msgstr ""
+msgstr "Speichern"
msgid "DesignManagement|Save comment"
msgstr "Kommentar speichern"
@@ -15751,7 +15924,7 @@ msgid "DesignManagement|Upload skipped. %{reason}"
msgstr "Hochladen übersprungen. %{reason}"
msgid "DesignManagement|Write a comment or drag your files here…"
-msgstr ""
+msgstr "Schreibe einen Kommentar oder ziehe deine Dateien hierher…"
msgid "DesignManagement|Your designs are being copied and are on their way… Please refresh to update."
msgstr "Deine Designs werden kopiert und sind unterwegs… Bitte aktualisiere zum Updaten."
@@ -15988,10 +16161,10 @@ msgid "Diagram saved successfully."
msgstr "Diagramm erfolgreich gespeichert."
msgid "Diagrams.net"
-msgstr ""
+msgstr "Diagrams.net"
msgid "Diagrams.net URL"
-msgstr ""
+msgstr "Diagrams.net-URL"
msgid "Did not delete the source branch."
msgstr "Hat den Quellbranch nicht gelöscht."
@@ -16278,10 +16451,10 @@ msgid "DomainVerification|Add Domain"
msgstr "Domain hinzufügen"
msgid "DomainVerification|Are you sure you want to delete this domain?"
-msgstr ""
+msgstr "Bist Du sicher, dass Du diese Domain löschen möchtest?"
msgid "DomainVerification|Delete domain"
-msgstr ""
+msgstr "Domain löschen"
msgid "DomainVerification|Domain was added"
msgstr "Domain wurde hinzugefügt"
@@ -16293,10 +16466,10 @@ msgid "DomainVerification|Domain was updated"
msgstr "Domain wurde aktualisiert"
msgid "DomainVerification|Edit Domain"
-msgstr ""
+msgstr "Domain bearbeiten"
msgid "DomainVerification|Enter your domain"
-msgstr ""
+msgstr "Gib deine Domain ein"
msgid "DomainVerification|Failed to verify domain ownership"
msgstr "Domain-Inhaberschaft konnte nicht verifiziert werden"
@@ -16305,19 +16478,19 @@ msgid "DomainVerification|How do I configure a domain?"
msgstr "Wie konfiguriere ich eine Domain?"
msgid "DomainVerification|How to set up DNS records?"
-msgstr ""
+msgstr "Wie richtet man DNS-Einträge ein?"
msgid "DomainVerification|Manually enter certificate information"
-msgstr ""
+msgstr "Zertifikatinformationen manuell eingeben"
msgid "DomainVerification|New Domain"
-msgstr ""
+msgstr "Neue Domain"
msgid "DomainVerification|No domains configured. Create a domain in a project in this group hierarchy."
msgstr "Keine Domains konfiguriert. Erstelle eine Domain in einem Projekt in dieser Gruppenhierarchie."
msgid "DomainVerification|Remove certificate"
-msgstr ""
+msgstr "Zertifikat entfernen"
msgid "DomainVerification|Successfully verified domain ownership"
msgstr "Domain-Inhaberschaft erfolgreich verifiziert"
@@ -16325,8 +16498,8 @@ msgstr "Domain-Inhaberschaft erfolgreich verifiziert"
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr "Die folgenden Domains sind für Projekte in dieser Gruppe konfiguriert. Benutzer(innen) mit E-Mail-Adressen, die mit einer verifizierten Domain übereinstimmen, müssen ihr Konto nicht bestätigen."
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
-msgstr ""
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
+msgstr "Um den Besitz deiner Domain zu bestätigen, füge den oben genannten Schlüssel innerhalb von sieben Tagen als TXT-Eintrag zu deiner DNS-Konfiguration hinzu. %{link_to_help}"
msgid "Don't have a group?"
msgstr "Hast du keine Gruppe?"
@@ -16370,15 +16543,15 @@ msgstr "Herunterladen (%{fileSizeReadable})"
msgid "Download (%{size})"
msgstr "Herunterladen (%{size})"
-msgid "Download CSV"
-msgstr "CSV herunterladen"
-
msgid "Download PDF"
msgstr "PDF herunterladen"
msgid "Download artifacts"
msgstr "Artefakte herunterladen"
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr "Codes herunterladen"
@@ -16407,7 +16580,7 @@ msgid "DownloadSource|Download"
msgstr "Herunterladen"
msgid "Downloads"
-msgstr ""
+msgstr "Downloads"
msgid "Downstream"
msgstr "Downstream"
@@ -16664,6 +16837,9 @@ msgstr "Öffentlichen Bereitstellungsschlüssel bearbeiten"
msgid "Edit sidebar"
msgstr "Seitenleiste bearbeiten"
+msgid "Edit single file"
+msgstr "Einzelne Datei bearbeiten"
+
msgid "Edit table"
msgstr "Tabelle bearbeiten"
@@ -16769,6 +16945,9 @@ msgstr "E-Mail konnte nicht verschickt werden"
msgid "Email display name"
msgstr "E-Mail-Anzeigename"
+msgid "Email must be provided."
+msgstr "E-Mail-Adresse muss angegeben werden."
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr "E-Mail nicht bestätigt. Bitte verifiziere deine E-Mail in Salesforce."
@@ -16950,7 +17129,7 @@ msgid "Enable dashboard limits on namespaces"
msgstr "Aktiviere Dashboard-Limits für Namespaces"
msgid "Enable diagrams.net"
-msgstr ""
+msgstr "Aktiviere diagrams.net"
msgid "Enable email notification"
msgstr "E-Mail-Benachrichtigungen aktivieren"
@@ -17105,9 +17284,6 @@ msgstr "Zwei-Faktor-Authentifizierung für alle Benutzer(innen)anmeldungen erzwi
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr "Verbessere die Sicherheit durch Speicherung von Service-Account-Schlüsseln in Geheimnis-Managern. Mehr darüber erfährst du unter %{docLinkStart}Geheimnismanagement mit GitLab%{docLinkEnd}"
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr "Stelle sicher, dass die Verbindung vom GitLab Server zum Prometheus Server verfügbar ist"
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr "Stelle sicher, dass deine %{linkStart}Umgebung Teil der Bereitstellungsphase%{linkEnd} deiner CI-Pipeline ist, um Bereitstellungen in deinem Cluster nachzuverfolgen."
@@ -17168,9 +17344,6 @@ msgstr "Gib den Code aus deiner Zwei-Faktor-App ein. Wenn du dein Gerät verlore
msgid "Enter the following to confirm:"
msgstr "Bitte gib zur Bestätigung Folgendes ein:"
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr "Gib den Namen deiner Anwendung ein und wir geben eine(n) eindeutige(n) %{type} zurück. "
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr "Gib die Anzahl der Sekunden oder andere menschenlesbare Eingaben wie „1 Stunde“ ein. Dieser Timeout hat Vorrang vor den für das Projekt festgelegten niedrigeren Timeouts."
@@ -17198,17 +17371,20 @@ msgstr "Gib dein Kennwort ein, um zu genehmigen"
msgid "Enterprise"
msgstr "Unternehmen"
+msgid "Enterprise User"
+msgstr "Unternehmensbenutzer(in)"
+
+msgid "Enterprise User Account on GitLab"
+msgstr "Unternehmens-Benutzerkonto auf GitLab"
+
msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr "Die Benutzerdetails können nicht aktualisiert werden"
msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr "Der/Die Benutzer(in) stimmt nicht mit der Definition „Enterprise User“ für die Gruppe überein"
-msgid "EnterpriseUsers|The user is already an enterprise user"
-msgstr "Der/Die Benutzer(in) ist bereits ein Enterprise User. "
-
-msgid "EnterpriseUsers|The user is not a member of the group"
-msgstr "Der/Die Benutzer(in) ist kein Mitglied der Gruppe"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
+msgstr "Der/die Benutzer(in) ist bereits ein(e) Unternehmensbenutzer(in) der Gruppe"
msgid "Environment"
msgstr "Umgebung"
@@ -17367,14 +17543,11 @@ msgid "Environments|Get started with environments"
msgstr "Erste Schritte mit Umgebungen"
msgid "Environments|GitLab agent"
-msgstr ""
+msgstr "GitLab-Agent"
msgid "Environments|Job"
msgstr "Job"
-msgid "Environments|Learn about environments"
-msgstr "Erfahre mehr über Umgebungen"
-
msgid "Environments|Learn more about stopping environments"
msgstr "Erfahre mehr über das Stoppen von Umgebungen"
@@ -17387,9 +17560,6 @@ msgstr "Neue Umgebung"
msgid "Environments|New environment"
msgstr "Neue Umgebung"
-msgid "Environments|No deployed environments"
-msgstr "Keine bereitgestellten Umgebungen"
-
msgid "Environments|No deployments yet"
msgstr "Noch keine Bereitstellungen"
@@ -17424,7 +17594,7 @@ msgid "Environments|Search by environment name"
msgstr "Suche nach Umgebungsnamen"
msgid "Environments|Select agent"
-msgstr ""
+msgstr "Agent auswählen"
msgid "Environments|Select which environments to clean up. Protected environments are excluded. Learn more about cleaning up environments."
msgstr "Wähle aus, welche Umgebungen bereinigt werden sollen. Geschützte Umgebungen sind ausgeschlossen. Erfahre mehr über die Bereinigung von Umgebungen."
@@ -17493,7 +17663,7 @@ msgid "Environment|Deployments"
msgstr "Bereitstellungen"
msgid "Environment|Environment health"
-msgstr ""
+msgstr "Umgebungsgesundheit"
msgid "Environment|External IP"
msgstr "Externe IP"
@@ -17502,7 +17672,7 @@ msgid "Environment|Failed"
msgstr "Fehlgeschlagen"
msgid "Environment|Healthy"
-msgstr ""
+msgstr "Gesund"
msgid "Environment|Jobs"
msgstr "Jobs"
@@ -17538,7 +17708,7 @@ msgid "Environment|Summary"
msgstr "Zusammenfassung"
msgid "Environment|Unhealthy"
-msgstr ""
+msgstr "Ungesund"
msgid "Epic"
msgstr "Epic"
@@ -17547,7 +17717,7 @@ msgid "Epic Boards"
msgstr "Boards vom Epic"
msgid "Epic ID"
-msgstr ""
+msgstr "Epic-ID"
msgid "Epic actions"
msgstr "Aktionen zum Epic"
@@ -17571,7 +17741,7 @@ msgid "Epic summary"
msgstr "Epic Zusammenfassung"
msgid "Epic title"
-msgstr "Epic Titel"
+msgstr "Epic-Titel"
msgid "Epics"
msgstr "Epics"
@@ -17585,12 +17755,6 @@ msgstr "Mit Epics kannst du deine Projekte effizienter und mit weniger Aufwand v
msgid "Epics, issues, and merge requests"
msgstr "Epics, Tickets und Merge Requests"
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr "%{startDate} – %{dueDate}"
-
-msgid "Epics|%{startDate} – No due date"
-msgstr "%{startDate} – Kein Fälligkeitsdatum"
-
msgid "Epics|Add a new epic"
msgstr "Füge neue Epic hinzu"
@@ -17606,9 +17770,6 @@ msgstr "Bist du dir sicher, dass du %{bStart}%{targetIssueTitle}%{bEnd} aus %{bS
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr "Leer lassen um Daten des Meilensteins zu vererben"
-msgid "Epics|No start date – %{dueDate}"
-msgstr "Kein Startdatum – %{dueDate}"
-
msgid "Epics|Remove epic"
msgstr "Epic löschen"
@@ -18054,13 +18215,13 @@ msgid "Even if you reach the number of seats in your subscription, you can conti
msgstr "Auch wenn du die Anzahl der Plätze in deinem Abonnement erreichst, kannst du weiterhin Benutzer(innen) hinzufügen und GitLab wird dir den Überschuss abrechnen."
msgid "Event '%{event}' of type '%{event_type}' must not start with '%{prefix}'"
-msgstr "Ereignis '%{event}' vom Typ '%{event_type}' darf nicht mit '%{prefix}' beginnen"
+msgstr "Ereignis „%{event}“ vom Typ „%{event_type}“ darf nicht mit „%{prefix}“ beginnen"
msgid "Event tag (optional)"
msgstr "Event-Tag (optional)"
msgid "Event type '%s' is not yet supported"
-msgstr "Der Ereignistyp '%s' wird noch nicht unterstützt"
+msgstr "Der Ereignistyp „%s“ wird noch nicht unterstützt"
msgid "EventFilterBy|Filter by all"
msgstr "Nach allem filtern"
@@ -18561,12 +18722,18 @@ msgstr[1] "Fehlgeschlagene Jobs"
msgid "Failed on"
msgstr "Fehlgeschlagen am"
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr "%{action} ist bei diesem Workitem fehlgeschlagen: %{reason}."
+
msgid "Failed to add a Zoom meeting"
msgstr "Das Hinzufügen einer Zoom-Besprechung ist fehlgeschlagen"
msgid "Failed to add a resource link"
msgstr "Fehler beim Hinzufügen eines Ressourcen-Links"
+msgid "Failed to add emoji. Please try again"
+msgstr "Emoji konnte nicht hinzugefügt werden. Bitte versuche es erneut"
+
msgid "Failed to apply commands."
msgstr "Fehlgeschlagene Befehle anzuwenden."
@@ -18605,9 +18772,6 @@ msgstr "Fehler beim Duplizieren dieses Tickets, da das Zielprojekt nicht existie
msgid "Failed to clone this issue: wrong parameters."
msgstr "Fehler beim klonen dieses Problems: falsche Parameter."
-msgid "Failed to convert this work item: %{reason}."
-msgstr "Die Konvertierung dieses Workitems ist fehlgeschlagen: %{reason}."
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr "Erstellen eines Branches für dieses Ticket fehlgeschlagen. Bitte versuche es erneut."
@@ -18752,6 +18916,9 @@ msgstr "Das Entfernen einer Zoom-Besprechung ist fehlgeschlagen"
msgid "Failed to remove a to-do item for the design."
msgstr "Fehler beim Löschen der Aufgabe für das Design."
+msgid "Failed to remove emoji. Please try again"
+msgstr "Emoji konnte nicht entfernt werden. Bitte versuche es erneut"
+
msgid "Failed to remove mirror."
msgstr "Fehler beim Entfernen des Mirrors."
@@ -18773,6 +18940,9 @@ msgstr "Abruf der Seite fehlgeschlagen"
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr "Fehler beim speichern von Merge-Konflikten. Bitte versuche es erneut!"
+msgid "Failed to save namespace commit email."
+msgstr "Fehler beim Speichern der Namensraum-Commit-E-Mail."
+
msgid "Failed to save new settings"
msgstr "Speichern der neuen Einstellungen fehlgeschlagen"
@@ -18839,9 +19009,6 @@ msgstr "Favicon wird entfernt. Bist du sicher?"
msgid "Feature Flags"
msgstr "Feature-Flags"
-msgid "Feature deprecation"
-msgstr "Funktion veraltet"
-
msgid "Feature flag status"
msgstr "Feature-Flag Status"
@@ -19144,6 +19311,9 @@ msgstr "Dateien mit großen Änderungen werden standardmäßig eingeklappt."
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr "Dateien, Ordner und Submodule im Pfad %{path} der Commit Referenz %{ref}"
+msgid "Fill in merge request template"
+msgstr "Fülle die Merge-Request-Vorlage aus"
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr "Fülle die folgenden Felder aus, schalte %{strong_open}SAML-Authentifizierung für diese Gruppe aktivieren%{strong_close} ein und klicke %{strong_open}Änderungen speichern%{strong_close}"
@@ -19375,9 +19545,6 @@ msgstr "Für jeden Job das Repository klonen."
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr "Für jeden Job den Arbeitsbereich des Projekts wiederverwenden. Falls der Arbeitsbereich nicht existiert, %{code_open}git clone%{code_close}."
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr "Beispielsweise die Anwendung, die das Token verwendet, oder der Zweck des Tokens. Gib keine sensiblen Informationen für den Namen des Tokens an, da dieser für alle %{resource_type}-Mitglieder sichtbar ist."
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr "Alle Dateien, die größer als dieses Limit sind, indizieren nur den Dateinamen. Der Dateiinhalt ist weder indiziert noch durchsuchbar."
@@ -19387,6 +19554,9 @@ msgstr "Für allgemeine Arbeit"
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr "Zur individuellen Nutzung erstelle ein separates Konto mit deiner persönlichen E-Mail-Adresse, die nicht an die Enterprise-E-Mail-Domain oder Gruppe gebunden ist."
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr "Erstelle dir für die individuelle Nutzung ein separates Konto unter deiner persönlichen E-Mail-Adresse, die nicht mit der E-Mail-Domäne des Unternehmens verbunden ist."
+
msgid "For investigating IT service disruptions or outages"
msgstr "Zur Untersuchung von Störungen oder Ausfällen von IT Services"
@@ -19403,13 +19573,13 @@ msgid "For more information, see the File Hooks documentation."
msgstr "Weitere Informationen findest du in der Datei-Hooks-Dokumentation"
msgid "For the next few releases, you can go to your avatar at any time to turn the new navigation on and off."
-msgstr ""
+msgstr "In den nächsten Versionen kannst du jederzeit auf deinen Avatar klicken, um die neue Navigation ein- und auszuschalten."
msgid "Forbidden"
msgstr "Verboten"
msgid "Forecast horizon must be positive and %{max_horizon} days at the most."
-msgstr ""
+msgstr "Der Vorhersagehorizont muss positiv sein und darf höchstens %{max_horizon} Tage betragen."
msgid "Forgot your password?"
msgstr "Hast du dein Passwort vergessen?"
@@ -19556,7 +19726,7 @@ msgid "Framework successfully deleted"
msgstr "Framework erfolgreich gelöscht"
msgid "Frameworks can not be added to projects in personal namespaces. %{linkStart}What are personal namespaces?%{linkEnd}"
-msgstr ""
+msgstr "Frameworks können nicht zu Projekten in persönlichen Namensräumen hinzugefügt werden. %{linkStart}Was sind persönliche Namensräume?%{linkEnd}"
msgid "Free Trial of GitLab.com Ultimate"
msgstr "Kostenlose Testversion von GitLab.com Ultimate"
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] "Kostenlose Gruppen sind auf %{free_user_limit} Mitglied begrenzt und die überbleibenden Mitglieder erhalten den Status „over-limit“ und verlieren den Zugriff auf die Gruppe. "
msgstr[1] "Kostenlose Gruppen sind auf %{free_user_limit} Mitglieder begrenzt und die überbleibenden Mitglieder erhalten den Status „over-limit„ und verlieren den Zugriff auf die Gruppe. "
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr "Freie Gruppen auf oberster Stufe werden demnächst auf %{free_users_limit} Benutzer(innen) und %{free_storage_limit} Daten begrenzt."
+
msgid "Free trial will expire in %{days}"
msgstr "Die kostenlose Testversion läuft in %{days} ab"
@@ -19629,6 +19802,9 @@ msgstr "Von %{providerTitle}"
msgid "From issue creation until deploy to production"
msgstr "Von der Ticketbeschreibung bis zur Bereitstellung"
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr "Vom Umsetzen des Merge Request bis zur Bereitstellung auf dem Produktivsystem"
@@ -19686,6 +19862,9 @@ msgstr "Neuen Export generieren"
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr "Generiere Projekt-Zugrifftokens für Anwendungen, die Zugriff auf die GitLab API benötigen. "
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr "Generiere Website- und private Schlüssel unter"
@@ -20302,9 +20481,6 @@ msgstr "Erste Schritte mit GitLab"
msgid "Get started with error tracking"
msgstr "Beginne mit Fehler-Tracking"
-msgid "Get started with performance monitoring"
-msgstr "Erste Schritte zur Performance-Ãœberwachung"
-
msgid "Get started!"
msgstr "Loslegen!"
@@ -20785,9 +20961,12 @@ msgstr "Um die Integration zu verwenden, müssen alle Benutzer(innen) Gitpod in
msgid "Gitpod|https://gitpod.example.com"
msgstr "https://gitpod.example.com"
-msgid "Give us some feedback"
+msgid "Give feedback"
msgstr ""
+msgid "Give us some feedback"
+msgstr "Gib uns Feedback"
+
msgid "Given access %{time_ago}"
msgstr "Zugriff vor %{time_ago} gewährt"
@@ -20824,6 +21003,9 @@ msgstr "Fehler beim Laden von Aggregationen."
msgid "GlobalSearch|Close"
msgstr "Schließen"
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr "Aggregationsfehler werden abgerufen."
+
msgid "GlobalSearch|Group"
msgstr "Gruppe"
@@ -20842,6 +21024,9 @@ msgstr "Tickets, die ich erstellt habe"
msgid "GlobalSearch|Issues assigned to me"
msgstr "Tickets, die mir zugewiesen sind"
+msgid "GlobalSearch|Label(s)"
+msgstr "Label(s)"
+
msgid "GlobalSearch|Language"
msgstr "Sprache"
@@ -20854,6 +21039,9 @@ msgstr "Merge-Requests, die mir zugewiesen sind"
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr "Merge Requests, bei denen ich Prüfer*in bin"
+msgid "GlobalSearch|No labels found"
+msgstr "Keine Labels gefunden"
+
msgid "GlobalSearch|Project"
msgstr "Projekt"
@@ -20890,6 +21078,9 @@ msgstr "Suche GitLab %{kbdOpen}/%{kbdClose}"
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr "Suche nach Projekten, Tickets, etc."
+msgid "GlobalSearch|Search labels"
+msgstr "Suche Labels"
+
msgid "GlobalSearch|Search results are loading"
msgstr "Suchergebnisse werden geladen"
@@ -21319,9 +21510,6 @@ msgstr "Gruppeninfo:"
msgid "Group information"
msgstr "Gruppeninformation"
-msgid "Group is required when cluster_type is :group"
-msgstr "Gruppe ist erforderlich, wenn cluster_type: group ist"
-
msgid "Group jobs by"
msgstr "Jobs gruppieren nach"
@@ -21613,6 +21801,9 @@ msgstr "SCIM-Token"
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr "SHA-1-Fingerabdruck des SAML-Tokensignaturzertifikats. Hole diesen von deinem Identitätsanbieter, welcher ihn auch als „Daumenabdruck (Thumbprint)“ bezeichnen kann."
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr "Auf einige Branches kann nicht zugegriffen werden, da deine SAML-Sitzung abgelaufen ist. Um auf die Branches zuzugreifen, wähle den Pfad der Gruppe zur erneuten Authentifizierung aus."
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr "Einige Aufgaben sind möglicherweise ausgeblendet, da deine SAML-Sitzung abgelaufen ist. Wähle den Pfad der Gruppe aus, um dich erneut zu authentifizieren und die ausgeblendeten Aufgaben anzuzeigen."
@@ -21740,7 +21931,7 @@ msgid "GroupSettings|Email notifications are disabled"
msgstr "E-Mail-Benachrichtigungen sind deaktiviert"
msgid "GroupSettings|Enable overview background aggregation for Value Streams Dashboard"
-msgstr "GroupSettings|Übersichts-Hintergrundaggregation für das Value Streams Dashboard aktivieren"
+msgstr "Übersichts-Hintergrundaggregation für das Dashboard für Wertschöpfungsketten aktivieren"
msgid "GroupSettings|Export group"
msgstr "Gruppe exportieren"
@@ -21836,7 +22027,7 @@ msgid "GroupSettings|Users can create %{link_start_project}project access tokens
msgstr "Benutzer(innen) können in dieser Gruppe %{link_start_project}Projektzugriffstoken%{link_end} und %{link_start_group}Gruppenzugriffstoken%{link_end} erstellen"
msgid "GroupSettings|Value Streams Dashboard"
-msgstr ""
+msgstr "Dashboard für Wertschöpfungsketten"
msgid "GroupSettings|What are badges?"
msgstr "Was sind Badges?"
@@ -22286,12 +22477,6 @@ msgstr "Benachrichtigungen und andere %{issueType}-Aktionen wurden in dieses Men
msgid "HeaderAction|Okay!"
msgstr "Okay!"
-msgid "HeaderAction|incident"
-msgstr "Vorfall"
-
-msgid "HeaderAction|issue"
-msgstr "Ticket"
-
msgid "Headers"
msgstr "Kopfzeilen"
@@ -22406,11 +22591,6 @@ msgstr "Live-Vorschau ausblenden"
msgid "Hide archived projects"
msgstr "Archivierte Projekte ausblenden"
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] "Diagramm ausblenden"
-msgstr[1] "Diagramme ausblenden"
-
msgid "Hide comments"
msgstr "Kommentare ausblenden"
@@ -22557,12 +22737,24 @@ msgstr "Hauswirtschaft"
msgid "Housekeeping successfully started"
msgstr "Bereinigung erfolgreich gestartet"
+msgid "How do I change my password in GitLab?"
+msgstr "Wie ändere ich mein Passwort in GitLab?"
+
+msgid "How do I clone a repository?"
+msgstr "Wie klone ich ein Repository?"
+
msgid "How do I configure Akismet?"
msgstr "Wie kann ich Akismet konfigurieren?"
msgid "How do I configure this integration?"
msgstr "Wie konfiguriere ich diese Integration?"
+msgid "How do I create a template?"
+msgstr "Wie erstelle ich eine Vorlage?"
+
+msgid "How do I fork a project?"
+msgstr "Wie forke ich ein Projekt?"
+
msgid "How do I generate it?"
msgstr "Wie generiere ich es?"
@@ -23185,6 +23377,9 @@ msgstr "Inhaberschaft"
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr "Beim erneuten Importieren wird ein neues Projekt erstellt, es wird jedoch nicht mit dem vorhandenen Projekt synchronisiert."
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr "Repository oberhalb der zulässigen Grenze."
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr "Anfordern von Namensräumen fehlgeschlagen"
@@ -23244,6 +23439,9 @@ msgstr "Es gibt kein gültiges Git-Repository unter dieser URL. Falls dein HTTP-
msgid "Improve customer support with Service Desk"
msgstr "Verbessere den Kundensupport mit Service-Desk"
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr "Verbessere die Indizierungsleistung, indem du die Sidekiq-Last erhöhst. Werte größer als das aktuelle Shard-Limit (%{limit}) sind nicht zulässig."
+
msgid "Improve quality with test cases"
msgstr "Qualität mit Testfällen verbessern"
@@ -24066,6 +24264,12 @@ msgstr "Unvollständig"
msgid "Increase"
msgstr "Erhöhen"
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr "%{featureName} befindet sich in der Inkubationsphase."
@@ -24166,7 +24370,7 @@ msgid "Insert"
msgstr "Einfügen"
msgid "Insert a %{rows}×%{cols} table"
-msgstr ""
+msgstr "%{rows}x%{cols}-Tabelle einfügen"
msgid "Insert a quote"
msgstr "Zitat einfügen"
@@ -24183,8 +24387,8 @@ msgstr "Spalte davor einfügen"
msgid "Insert comment template"
msgstr "Kommentarvorlage einfügen"
-msgid "Insert link"
-msgstr "Link einfügen"
+msgid "Insert link (%{modifierKey}K)"
+msgstr ""
msgid "Insert or edit diagram"
msgstr "Diagramm einfügen oder bearbeiten"
@@ -24216,9 +24420,6 @@ msgstr "Dieses Projekt wird in der Datei „insights.yml“ herausgefiltert (wei
msgid "Install GitLab Runner and ensure it's running."
msgstr "Installiere GitLab Runner und stelle sicher, dass es ausgeführt wird."
-msgid "Install on clusters"
-msgstr "Auf Cluster installieren"
-
msgid "Installation"
msgstr "Installation"
@@ -24558,7 +24759,7 @@ msgid "Introducing Your DevOps Reports"
msgstr "Wir stellen vor: Deine DevOps-Berichte"
msgid "Invalid 'schemaVersion' '%s'"
-msgstr "Ungültige 'schemaVersion' '%s'"
+msgstr "Ungültige „schemaVersion“ „%s“"
msgid "Invalid Insights config file detected"
msgstr "Ungültige Insights-Konfigurationsdatei erkannt"
@@ -24573,7 +24774,7 @@ msgid "Invalid URL: %{url}"
msgstr "Ungültige URL: %{url}"
msgid "Invalid context type. %{type} is expected."
-msgstr ""
+msgstr "Ungültiger Kontexttyp. %{type} wird erwartet."
msgid "Invalid date"
msgstr "Ungültiges Datum"
@@ -25019,7 +25220,7 @@ msgid "Issue Boards"
msgstr "Ticketboards"
msgid "Issue ID"
-msgstr "Ticket ID"
+msgstr "Ticket-ID"
msgid "Issue Type"
msgstr "Ticket-Typ"
@@ -25067,7 +25268,7 @@ msgid "Issue published on status page."
msgstr "Ticket auf der Statusseite veröffentlicht."
msgid "Issue summary"
-msgstr "Ticketzusammenfassung"
+msgstr "Ticket-Zusammenfassung"
msgid "Issue title"
msgstr "Ticket-Titel"
@@ -25163,10 +25364,10 @@ msgid "IssueTracker|Use Bugzilla as this project's issue tracker. %{docs_link}"
msgstr "Verwende Bugzilla als Ticketverwaltung für dieses Projekt. %{docs_link}"
msgid "IssueTracker|Use ClickUp as this project's issue tracker. %{docs_link}"
-msgstr ""
+msgstr "Verwende ClickUp als Ticket-System für dieses Projekts. %{docs_link}"
msgid "IssueTracker|Use Clickup as this project's issue tracker."
-msgstr ""
+msgstr "Verwendet Clickup als Ticketsystem für dieses Projekt."
msgid "IssueTracker|Use IBM Engineering Workflow Management as this project's issue tracker."
msgstr "Verwende IBM Engineering Workflow Management als Ticketverwaltung für dieses Projekt."
@@ -25294,6 +25495,9 @@ msgstr "Es sieht so aus, als wären derzeit keine Daten zur Testabdeckung verfü
msgid "It's you"
msgstr "Das bist du"
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr "Kursiver Text"
@@ -25538,19 +25742,19 @@ msgid "Jira-GitLab user mapping template"
msgstr "Vorlage für die Jira-GitLab-Benutzerzuordnung"
msgid "JiraConnect|Are you a GitLab administrator?"
-msgstr ""
+msgstr "Bist du ein(e) GitLab-Administrator(in)?"
msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
msgstr "Namensraum kann nicht gefunden werden. Stelle sicher, dass du ausreichende Berechtigungen hast."
msgid "JiraConnect|Change GitLab version"
-msgstr ""
+msgstr "GitLab-Version ändern"
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr "Konfiguriere deine Jira Connect-Anwendungs-ID."
msgid "JiraConnect|Continue setup in GitLab"
-msgstr ""
+msgstr "Einrichtung in GitLab fortsetzen"
msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
msgstr "Es konnten keine Benutzerinformationen aus Jira abgerufen werden. Überprüfe die Berechtigungen in Jira und versuche es erneut."
@@ -25562,7 +25766,7 @@ msgid "JiraConnect|Enable public key storage"
msgstr "Speicherung öffentlicher Schlüssel aktivieren"
msgid "JiraConnect|Ensure your instance URL is correct and your instance is configured correctly. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
+msgstr "Stelle sicher, dass die URL deiner Instanz korrekt ist und deine Instanz richtig konfiguriert ist. %{linkStart}Mehr erfahren%{linkEnd}."
msgid "JiraConnect|Failed to create branch."
msgstr "Branch konnte nicht erstellt werden."
@@ -25571,46 +25775,46 @@ msgid "JiraConnect|Failed to create branch. Please try again."
msgstr "Branch konnte nicht erstellt werden. Bitte versuche es erneut."
msgid "JiraConnect|Failed to link group. Please try again."
-msgstr ""
+msgstr "Gruppe konnte nicht verknüpft werden. Bitte versuche es erneut."
msgid "JiraConnect|Failed to load Jira Connect Application ID. Please try again."
-msgstr ""
+msgstr "JiraConnect|werden. Bitte versuche es erneut."
msgid "JiraConnect|Failed to load groups. Please try again."
-msgstr ""
+msgstr "Gruppen konnten nicht geladen werden. Bitte versuche es erneut."
msgid "JiraConnect|Failed to load subscriptions."
-msgstr ""
+msgstr "Abos konnten nicht geladen werden."
msgid "JiraConnect|Failed to sign in to GitLab."
-msgstr ""
+msgstr "Anmeldung bei GitLab fehlgeschlagen."
msgid "JiraConnect|Failed to unlink group. Please try again."
-msgstr ""
+msgstr "Die Verknüpfung der Gruppe konnte nicht aufgehoben werden. Bitte versuche es erneut."
msgid "JiraConnect|Failed to update the GitLab instance. See the %{linkStart}troubleshooting documentation%{linkEnd}."
-msgstr ""
+msgstr "Die Aktualisierung der GitLab-Instanz ist fehlgeschlagen. Weitere Informationen findest du in der %{linkStart}Dokumentation zur Fehlerbehebung%{linkEnd}."
msgid "JiraConnect|For example: https://gitlab.example.com"
-msgstr ""
+msgstr "Zum Beispiel: https://gitlab.example.com"
msgid "JiraConnect|GitLab for Jira App"
msgstr "GitLab für Jira-App"
msgid "JiraConnect|GitLab for Jira Configuration"
-msgstr ""
+msgstr "GitLab für Jira-Konfiguration"
msgid "JiraConnect|GitLab instance URL"
-msgstr ""
+msgstr "GitLab-Instanz-URL"
msgid "JiraConnect|Group successfully linked"
-msgstr ""
+msgstr "Gruppe erfolgreich verknüpft"
msgid "JiraConnect|Groups are the GitLab groups and subgroups you link to this Jira instance."
-msgstr ""
+msgstr "Gruppen sind die GitLab-Gruppen und -Untergruppen, die du mit dieser Jira-Instanz verknüpfst."
msgid "JiraConnect|In order to complete the set up, you’ll need to complete a few steps in GitLab."
-msgstr ""
+msgstr "Um die Einrichtung abzuschließen, musst du einige Schritte in GitLab ausführen."
msgid "JiraConnect|Jira Connect Application ID"
msgstr "Jira Connect-Anwendungs-ID"
@@ -25619,46 +25823,52 @@ msgid "JiraConnect|Jira Connect Proxy URL"
msgstr "Jira-Connect-Proxy-URL"
msgid "JiraConnect|Link groups"
-msgstr ""
+msgstr "Gruppen verknüpfen"
msgid "JiraConnect|Linked groups"
-msgstr ""
+msgstr "Verknüpfte Gruppen"
msgid "JiraConnect|New branch was successfully created."
msgstr "Neuer Zweig Branch erfolgreich erstellt."
msgid "JiraConnect|No groups found."
-msgstr ""
+msgstr "Keine Gruppen gefunden."
msgid "JiraConnect|No linked groups"
-msgstr ""
+msgstr "Keine verknüpften Gruppen"
msgid "JiraConnect|Not seeing your groups? Only groups you have at least the Maintainer role for appear here."
-msgstr ""
+msgstr "Siehst du deine Gruppen nicht? Hier werden nur Gruppen angezeigt, für die du mindestens die Rolle „Betreuer(in)“ hast."
msgid "JiraConnect|Setting up this integration is only possible if you're a GitLab administrator."
-msgstr ""
+msgstr "Das Einrichten dieser Integration ist nur möglich, wenn du GitLab-Administrator(in) bist."
msgid "JiraConnect|Sign in to %{url}"
-msgstr ""
+msgstr "Anmelden bei %{url}"
msgid "JiraConnect|Sign in to GitLab to get started."
-msgstr ""
+msgstr "Melde dich bei GitLab an, um zu beginnen."
msgid "JiraConnect|Sign in to GitLab to link groups."
-msgstr ""
+msgstr "Melde dich bei GitLab an, um Gruppen zu verknüpfen."
msgid "JiraConnect|Sign in to link groups"
+msgstr "Melde dich an, um Gruppen zu verknüpfen"
+
+msgid "JiraConnect|Tell us what you think!"
msgstr ""
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr "Der/die Jira-Benutzer(in) ist nicht Administrator(in) der Seite. Überprüfe die Berechtigungen in Jira und versuche es erneut."
-msgid "JiraConnect|Welcome to GitLab for Jira"
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
msgstr ""
+msgid "JiraConnect|Welcome to GitLab for Jira"
+msgstr "Willkommen bei GitLab für Jira"
+
msgid "JiraConnect|What version of GitLab are you using?"
-msgstr ""
+msgstr "Welche GitLab-Version verwendest du?"
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr "Du kannst dieses Fenster jetzt schließen und zu Jira zurückkehren."
@@ -25667,13 +25877,13 @@ msgid "JiraConnect|You don't have permission to create branches for this project
msgstr "Du bist nicht berechtigt, Branches für dieses Projekt zu erstellen. Wähle ein anderes Projekt aus oder kontaktiere den/die Projekteigentümer(in), um Zugriff zu erhalten. %{linkStart}Mehr erfahren.%{linkEnd}"
msgid "JiraConnect|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
-msgstr ""
+msgstr "Du musst einen %{linkStart}unterstützten Browser%{linkEnd} verwenden, um die GitLab für Jira-App nutzen zu können."
msgid "JiraConnect|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
+msgstr "GitLab.com-Aktivitäten sollten jetzt in deinen Jira-Cloud-Tickets angezeigt werden. %{linkStart}Mehr erfahren%{linkEnd}"
msgid "JiraConnect|Your browser is not supported"
-msgstr ""
+msgstr "Dein Browser wird nicht unterstützt"
msgid "JiraRequest|A connection error occurred while connecting to Jira. Try your request again."
msgstr "Bei der Verbindung mit Jira ist ein Verbindungsfehler aufgetreten. Versuche es noch einmal mit deiner Anfrage."
@@ -25715,7 +25925,7 @@ msgid "JiraService|API token for Jira Cloud or password for Jira Data Center and
msgstr "API-Token für Jira Cloud oder Passwort für Jira Data Center und Jira Server"
msgid "JiraService|API token or password"
-msgstr "JiraService|API-Token oder Passwort"
+msgstr "API-Token oder Passwort"
msgid "JiraService|An error occurred while fetching issue list"
msgstr "Fehler beim Abrufen der Ticketliste."
@@ -25739,7 +25949,7 @@ msgid "JiraService|Displaying Jira issues while leaving GitLab issues also enabl
msgstr "Die Anzeige von Jira-Tickets bei gleichzeitiger Aktivierung von GitLab-Fragen könnte verwirrend sein. Ziehe in Erwägung, %{gitlab_issues_link_start}GitLab-Tickets zu deaktivieren%{link_end}, wenn sie nicht anderweitig verwendet werden."
msgid "JiraService|Email for Jira Cloud or username for Jira Data Center and Jira Server"
-msgstr "JiraService|E-Mail für Jira Cloud oder Benutzername für Jira Data Center und Jira Server"
+msgstr "E-Mail-Adresse für Jira Cloud oder Benutzername für Jira Data Center und Jira Server"
msgid "JiraService|Email or username"
msgstr "E-Mail-Adresse oder Benutzername"
@@ -25799,7 +26009,7 @@ msgid "JiraService|Jira issues"
msgstr "Jira-Tickets"
msgid "JiraService|Jira personal access token"
-msgstr "JiraService|Jira Zugangs-Token"
+msgstr "Jira-Zugangstoken"
msgid "JiraService|Jira personal access token (Jira Data Center and Jira Server only)"
msgstr "Persönliches Jira-Zugriffstoken (nur Jira Data Center und Jira Server)"
@@ -25814,10 +26024,10 @@ msgid "JiraService|Move to Done"
msgstr "Nach „Fertig“ verschieben"
msgid "JiraService|New API token or password"
-msgstr "JiraService|Neuer API-Token oder Passwort"
+msgstr "Neues API-Token oder Passwort"
msgid "JiraService|New Jira personal access token"
-msgstr "JiraService|Neuer persönlicher Jira Zugangs-Token"
+msgstr "Neues persönliches Jira-Zugangstoken"
msgid "JiraService|Open Jira"
msgstr "Jira öffnen"
@@ -25829,7 +26039,7 @@ msgid "JiraService|Project key is required to generate issue types"
msgstr "Projektschlüssel ist erforderlich, um Ticketarten zu generieren"
msgid "JiraService|Recommended. Only available for Jira Data Center and Jira Server."
-msgstr "JiraService|Empfohlen. Nur verfügbar für Jira Data Center und Jira Server."
+msgstr "Empfohlen. Nur verfügbar für Jira Data Center und Jira Server."
msgid "JiraService|Select issue type"
msgstr "Ticketkategorie auswählen"
@@ -25888,6 +26098,9 @@ msgstr "Job %{jobName}"
msgid "Job Failed #%{build_id}"
msgstr "Job #%{build_id} fehlgeschlagen"
+msgid "Job ID"
+msgstr "Job-ID"
+
msgid "Job artifacts"
msgstr "Job-Artefakte"
@@ -25906,6 +26119,9 @@ msgstr "Der Auftrag hängt fest. Überprüfe die Runner."
msgid "Job logs and artifacts"
msgstr "Auftragsprotokolle und Artefakte"
+msgid "Job name"
+msgstr "Jobname"
+
msgid "Job was retried"
msgstr "Job wurde erneut versucht"
@@ -25949,7 +26165,7 @@ msgid "JobAssistant|Image name (optional)"
msgstr "Bildname (optional)"
msgid "JobAssistant|Include or exclude jobs in pipelines. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
+msgstr "Jobs in Pipelines einschließen oder ausschließen. %{linkStart}Mehr erfahren%{linkEnd}"
msgid "JobAssistant|Input format"
msgstr "Eingabeformat"
@@ -25985,13 +26201,13 @@ msgid "JobAssistant|Services"
msgstr "Dienste"
msgid "JobAssistant|Specify a Docker image that the job runs in. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
+msgstr "Gib ein Docker-Image an, in dem der Job ausgeführt wird. %{linkStart}Mehr erfahren%{linkEnd}"
msgid "JobAssistant|Specify any additional Docker images that your scripts require to run successfully. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
+msgstr "Gib alle zusätzlichen Docker-Images an, die deine Skripte für eine erfolgreiche Ausführung benötigen. %{linkStart}Mehr erfahren%{linkEnd}"
msgid "JobAssistant|Specify the %{artifactsLinkStart}artifacts%{artifactsLinkEnd} and %{cacheLinkStart}cache%{cacheLinkEnd} of the job."
-msgstr ""
+msgstr "Spezifiziere die %{artifactsLinkStart}Artefakte%{artifactsLinkEnd} und den %{cacheLinkStart}Cache%{cacheLinkEnd} des Jobs."
msgid "JobAssistant|Stage (optional)"
msgstr "Stage (optional)"
@@ -26071,6 +26287,9 @@ msgstr "Keine Jobs zum Anzeigen"
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr "Die Rohtextsuche wird derzeit nicht für die gefilterte Suche nach Jobs unterstützt. Bitte verwende die verfügbaren Such-Token."
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr "Beim Abrufen der fehlgeschlagenen Jobs ist ein Fehler aufgetreten."
@@ -26233,6 +26452,12 @@ msgstr "Auf Ressource warten"
msgid "Job|We could not find this element"
msgstr "Wir konnten dieses Element nicht finden"
+msgid "Job|You do not have permission to read this job's log"
+msgstr "Du hast keine Berechtigung, das Protokoll dieses Jobs zu lesen"
+
+msgid "Job|You do not have permission to retry this job"
+msgstr "Du bist nicht berechtigt, diesen Job erneut auszuführen"
+
msgid "Job|allowed to fail"
msgstr "Fehlschlagen erlaubt"
@@ -26296,9 +26521,6 @@ msgstr "Artefakte aus den letzten erfolgreichen Jobs aufbewahren"
msgid "Keep divergent refs"
msgstr "Abweichende Refs behalten"
-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 "Aktiviere alle SAST-Analysatoren, um das Projekt zukunftssicher machen, falls später neue Sprachen hinzugefügt werden. Die Auswahl der anzuwendenden Analysatoren verbraucht minimale Ressourcen und verlängert die Ausführungsdauer der Pipeline nur minimal. Wenn alle SAST-Analysatoren aktiviert sind, wird eine maximale Abdeckung gewährleistet."
-
msgid "Kerberos access denied"
msgstr "Kerberos-Zugriff verweigert"
@@ -26516,6 +26738,9 @@ msgstr "Letzte %{days} Tage"
msgid "Last 2 weeks"
msgstr "Letze 2 Wochen"
+msgid "Last 24 hours"
+msgstr "Letzte 24 Stunden"
+
msgid "Last Accessed On"
msgstr "Letzter Zugriff am"
@@ -26874,7 +27099,7 @@ msgid "Leave edit mode? All unsaved changes will be lost."
msgstr "Bearbeitungsmodus verlassen? Alle nicht gespeicherten Änderungen werden verloren gehen."
msgid "Leave feedback"
-msgstr ""
+msgstr "Kommentar hinterlassen"
msgid "Leave feedback."
msgstr "Hinterlasse Kommentar."
@@ -26889,7 +27114,7 @@ msgid "Leave zen mode"
msgstr "Zen-Modus verlassen"
msgid "Legacy Prometheus integrations cannot currently be removed"
-msgstr ""
+msgstr "Ältere Prometheus-Integrationen können derzeit nicht entfernt werden"
msgid "Legacy Web IDE"
msgstr "Alte Web-IDE"
@@ -27123,7 +27348,7 @@ msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr "Begrenze die Größe der Sidekiq-Jobs, die in Redis gespeichert sind."
msgid "Limitation on this view"
-msgstr ""
+msgstr "Einschränkung dieser Ansicht"
msgid "Limiting mode"
msgstr "Begrenzungsmodus"
@@ -27154,9 +27379,6 @@ msgstr "Verknüpfe Sentry mit GitLab, um die von deiner Anwendung generierten Fe
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr "Verknüpfe ein externes Wiki aus der Seitenleiste des Projekts. %{docs_link}"
-msgid "Link copied"
-msgstr "Link kopiert"
-
msgid "Link copied to clipboard."
msgstr "Link in die Zwischenablage kopiert."
@@ -27304,8 +27526,8 @@ msgstr "Mehr wird geladen"
msgid "Loading snippet"
msgstr "Lade Code-Schnipsel"
-msgid "Loading the GitLab IDE..."
-msgstr "Laden der GitLab IDE..."
+msgid "Loading the GitLab IDE"
+msgstr "Laden der GitLab-IDE"
msgid "Loading, please wait."
msgstr "Lädt, bitte warten."
@@ -27370,6 +27592,9 @@ msgstr "Gesperrte Dateien"
msgid "Locked the discussion."
msgstr "Die Diskussion wurde gesperrt."
+msgid "Locking %{issuableDisplayName}"
+msgstr "%{issuableDisplayName} wird gesperrt"
+
msgid "Locks the discussion."
msgstr "Diskussion sperren."
@@ -27562,6 +27787,9 @@ msgstr "Projekte verwalten."
msgid "Manage two-factor authentication"
msgstr "Zwei-Faktor-Authentifizierung verwalten"
+msgid "Manage usage"
+msgstr "Nutzung verwalten"
+
msgid "Manage your project's triggers"
msgstr "Trigger deines Projekts verwalten"
@@ -27595,6 +27823,9 @@ msgstr "Verknüpfe dieses Problem manuell, indem du es dem Abschnitt „Verknüp
msgid "Map a FogBugz account ID to a GitLab user"
msgstr "Ordne eine FogBugz-Konto-ID einem/einer GitLab-Benutzer(in) zu"
+msgid "Map data from"
+msgstr "Daten zuordnen von"
+
msgid "Mar"
msgstr "März"
@@ -27652,6 +27883,9 @@ msgstr "Kursiven Text hinzufügen (%{modifierKey}I)"
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr "Kursiven Text hinzufügen (%{modifier_key}I)"
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr "Durchgestrichenen Text hinzufügen (%{modifierKey}⇧X)"
@@ -27676,9 +27910,6 @@ msgstr "Zeile ausrücken (%{modifier_key}[)"
msgid "MarkdownEditor|header"
msgstr "Header"
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr "Unterstützt %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-
msgid "Marked"
msgstr "Markiert"
@@ -27719,7 +27950,7 @@ msgid "Marks to do as done."
msgstr "Markiert To-do als erledigt."
msgid "Mask this variable in job logs if it meets %{linkStart}regular expression requirements%{linkEnd}."
-msgstr ""
+msgstr "Maskiere diese Variable in den Jobprotokollen, wenn sie die %{linkStart}Anforderungen des regelmäßigen Ausdrucks%{linkEnd} erfüllt."
msgid "Mask variable"
msgstr "Variablen maskieren"
@@ -27778,8 +28009,8 @@ msgstr "Max. Wert"
msgid "Max authenticated Git LFS requests per period per user"
msgstr "Maximale authentifizierte Git LFS-Anfragen pro Zeitraum pro Benutzer"
-msgid "Max file size is 200 KB."
-msgstr "Die maximale Dateigröße beträgt 200 KB."
+msgid "Max file size is 200 KiB."
+msgstr "Die maximale Dateigröße beträgt 200 KiB."
msgid "Max role"
msgstr "Max. Rolle"
@@ -27829,8 +28060,8 @@ msgstr "Maximale Artefaktgröße (MB)"
msgid "Maximum attachment size"
msgstr "Maximale Anhangsgröße"
-msgid "Maximum attachment size (MB)"
-msgstr "Maximale Anhanggröße (MB)"
+msgid "Maximum attachment size (MiB)"
+msgstr "Maximale Anhanggröße (MiB)"
msgid "Maximum authenticated API requests per rate limit period per user"
msgstr "Maximale authentifizierte API-Anfragen pro Ratenlimitzeitraum pro Benutzer"
@@ -27856,7 +28087,7 @@ msgstr "Maximale Verzögerung (Minuten)"
msgid "Maximum diff patch size"
msgstr "Maximale Größe des Diff-Patches"
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr "Maximale Größe von Diff-Patches (Bytes)"
msgid "Maximum duration of a session."
@@ -27865,8 +28096,8 @@ msgstr "Maximale Sitzungsdauer."
msgid "Maximum export size"
msgstr "Maximale Exportgröße"
-msgid "Maximum export size (MB)"
-msgstr "Maximale Exportgröße (MB)"
+msgid "Maximum export size (MiB)"
+msgstr "Maximale Exportgröße (MiB)"
msgid "Maximum field length"
msgstr "Maximale Feldlänge"
@@ -27901,8 +28132,8 @@ msgstr "Maximale Gruppen-Import-Anfragen pro Minute"
msgid "Maximum import size"
msgstr "Maximale Importgröße"
-msgid "Maximum import size (MB)"
-msgstr "Maximale Importgröße (MB)"
+msgid "Maximum import size (MiB)"
+msgstr "Maximale Importgröße (MiB)"
msgid "Maximum job artifact size"
msgstr "Maximale Größe des Jobartefakts"
@@ -27922,8 +28153,11 @@ msgstr "Maximale Dateigröße des npm-Pakets in Byte"
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr "Maximalzahl an %{name} (%{count}) überschritten"
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
-msgstr "Maximale Anzahl von Änderungen (Branches oder Tags) in einem einzigen Push, für die Webhooks und Dienste ausgelöst werden (Standard ist 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr "Maximale Anzahl von Änderungen (Branches oder Tags) in einem einzelnen Push, ab der ein Massen-Push-Ereignis erstellt wird (Standard ist „3“). Durch die Einstellung „0“ wird die Drosselung nicht deaktiviert."
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
+msgstr "Maximale Anzahl von Änderungen (Branches oder Tags) in einem einzelnen Push, ab der keine Webhooks und Integrationen ausgelöst werden (Standard ist „3“). Durch die Einstellung „0“ wird die Drosselung nicht deaktiviert."
msgid "Maximum number of comments exceeded"
msgstr "Maximale Anzahl von Kommentaren überschritten"
@@ -27943,12 +28177,18 @@ msgstr "Maximale Anzahl von Anfragen pro Minute für einen authentifizierten Ben
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr "Maximale Anzahl von Anfragen pro Minute für eine nicht authentifizierte IP-Adresse"
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
-msgstr "Maximale Anzahl von Anfragen pro Minute für jeden Raw-Pfad (Standard ist 300). Auf 0 setzen, um die Drosselung zu deaktivieren."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr "Maximale Anzahl von Anfragen pro Minute für jeden rohen Pfad (Standard ist „300“). Auf „0“ setzen, um die Drosselung zu deaktivieren."
+
+msgid "Maximum number of stages per value stream exceeded"
+msgstr "Maximale Anzahl von Phasen pro Wertschöpfungskette überschritten"
msgid "Maximum number of unique IP addresses per user."
msgstr "Maximale Anzahl eindeutiger IP-Adressen pro Benutzer."
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr "Maximale Anzahl von Wertschöpfungsketten pro Namensraum überschritten"
+
msgid "Maximum number of variables loaded (2000)"
msgstr "Maximale Anzahl der geladenen Variablen (2000)"
@@ -27973,8 +28213,8 @@ msgstr "Maximale Projekt-Import-Anfragen pro Minute"
msgid "Maximum push size"
msgstr "Maximale Push-Größe"
-msgid "Maximum push size (MB)"
-msgstr "Maximale Push-Größe (MB)"
+msgid "Maximum push size (MiB)"
+msgstr "Maximale Push-Größe (MiB)"
msgid "Maximum requests per 10 minutes per IP address"
msgstr "Maximale Anforderungen pro 10 Minuten pro IP-Adresse"
@@ -28006,8 +28246,8 @@ msgstr "Maximale Größe von Importdateien"
msgid "Maximum size of individual attachments in comments."
msgstr "Maximale Größe einzelner Anhänge in Kommentaren"
-msgid "Maximum size of pages (MB)"
-msgstr "Maximale Seitengröße (MB)"
+msgid "Maximum size of pages (MiB)"
+msgstr "Maximale Seitengröße (MiB)"
msgid "Maximum snippet size"
msgstr "Maximale Größe des Code-Schnipsels"
@@ -28061,7 +28301,7 @@ msgid "MemberInviteEmail|Invitation to join the %{project_or_group} %{project_or
msgstr "Einladung zum Beitritt zu %{project_or_group} %{project_or_group_name}"
msgid "MemberRole|%{requirement} has to be enabled in order to enable %{permission}."
-msgstr ""
+msgstr "%{requirement} muss aktiviert sein, um %{permission} zu aktivieren."
msgid "MemberRole|%{role} - custom"
msgstr "%{role} – Benutzerdefiniert"
@@ -28079,7 +28319,7 @@ msgid "MemberRole|maximum number of Member Roles are already in use by the group
msgstr "Die maximale Anzahl von Mitgliedsrollen wird bereits von der Gruppenhierarchie verwendet. Bitte lösche eine vorhandene Mitgliedsrolle."
msgid "MemberRole|minimal base access level must be %{min_access_level}."
-msgstr ""
+msgstr "minimales Basiszugriffslevel muss %{min_access_level} sein."
msgid "MemberRole|must be top-level namespace"
msgstr "muss oberster Namensraum sein"
@@ -28279,8 +28519,8 @@ msgstr "Merge"
msgid "Merge %d cell"
msgid_plural "Merge %d cells"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Zelle zusammenführen"
+msgstr[1] "%d Zellen zusammenführen"
msgid "Merge Conflicts"
msgstr "Konflikte zusammenführen"
@@ -28340,7 +28580,7 @@ msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr "Merge Request %{mr_link} wurde von %{mr_author} überprüft"
msgid "Merge request ID"
-msgstr "Merge-Request ID"
+msgstr "Merge-Request-ID"
msgid "Merge request actions"
msgstr "Merge Request-Aktionen"
@@ -28351,6 +28591,9 @@ msgstr "Merge Request zu Analysen"
msgid "Merge request approvals"
msgstr "Merge-Request-Genehmigungen"
+msgid "Merge request change summary"
+msgstr "Merge Request Änderungszusammenfassung"
+
msgid "Merge request commits"
msgstr "Merge Request zu Commits"
@@ -28369,14 +28612,17 @@ msgstr "Merge Request-Berichte"
msgid "Merge request status"
msgstr "Merge Request-Status"
+msgid "Merge request summaries"
+msgstr "Merge Request Zusammenfassungen"
+
msgid "Merge request summary"
-msgstr "Merge-Request Zusammenfassung"
+msgstr "Merge-Request-Zusammenfassung"
msgid "Merge request title"
-msgstr "Merge-Request Titel"
+msgstr "Merge-Request-Titel"
msgid "Merge request was set to auto-merge"
-msgstr ""
+msgstr "Merge Request wurde auf Auto-Merge gesetzt"
msgid "Merge requests"
msgstr "Merge Requests"
@@ -28486,9 +28732,6 @@ msgstr "Kommentare in Zeilen %{selectStart}beginnen%{selectEnd} bis %{end}"
msgid "MergeRequestDiffs|Select comment starting line"
msgstr "Startzeile für Kommentare auswählen"
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr "Beim Hinzufügen des Kommentarentwurfs ist ein Fehler aufgetreten."
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr "Diese Aktion kann nicht automatisch ausgeführt werden. Es kann bereits geschehen sein, oder ein neuerer Commit hat möglicherweise einige dieser Inhalte aktualisiert. Bitte führe diese Aktion lokal aus."
@@ -28516,9 +28759,6 @@ msgstr "Zurücksetzen des Merge Request fehlgeschlagen"
msgid "MergeRequests|Reference copied"
msgstr "Referenz kopiert"
-msgid "MergeRequests|Saving the comment failed"
-msgstr "Speichern des Kommentars fehlgeschlagen"
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr "Squashing fehlgeschlagen: Squashe die Commits lokal, löse alle Konflikte auf und pushe dann den Branch."
@@ -28543,6 +28783,9 @@ msgstr "Datei anzeigen @ %{commitId}"
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr "Ersetzte Datei anzeigen @ %{commitId}"
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr "Dein Kommentar konnte nicht übermittelt werden, weil %{reason}."
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr "kommentierte den Commit %{commitLink}"
@@ -28550,10 +28793,10 @@ msgid "MergeRequests|started a thread"
msgstr "startete eine Diskussion"
msgid "MergeRequests|started a thread on %{linkStart}a file%{linkEnd}"
-msgstr ""
+msgstr "hat einen Thread für %{linkStart}eine Datei%{linkEnd} gestartet"
msgid "MergeRequests|started a thread on %{linkStart}an old version of a file%{linkEnd}"
-msgstr ""
+msgstr "hat einen Thread für %{linkStart}eine alte Version einer Datei%{linkEnd} gestartet"
msgid "MergeRequests|started a thread on %{linkStart}an old version of the diff%{linkEnd}"
msgstr "hat eine Diskussion über %{linkStart}eine alte Version des Diff%{linkEnd} begonnen"
@@ -28609,6 +28852,18 @@ msgstr "Überprüft von @%{username}, aber noch nicht genehmigt"
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr "Suche (z.B. *.vue) (%{MODIFIER_KEY}P)"
+msgid "MergeRequest|Summaries are written by AI"
+msgstr "Zusammenfassungen werden von einer KI geschrieben"
+
+msgid "MergeRequest|Summary notes"
+msgstr "Zusammenfassungsnotizen"
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr "Diese Beschreibung für die Revision %{revision} wurde mit einer KI erstellt."
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr "Diese Beschreibung wurde mit einer KI erstellt."
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr "%{sourceTopic} wird entfernt"
@@ -28705,9 +28960,6 @@ msgstr "Beim Aktualisieren deines Abbilds ist ein Fehler aufgetreten."
msgid "MetricImages|There was an issue uploading your image."
msgstr "Beim Hochladen deines Abbilds ist ein Fehler aufgetreten."
-msgid "Metrics"
-msgstr "Metriken"
-
msgid "Metrics - Grafana"
msgstr "Metriken – Grafana"
@@ -28762,215 +29014,45 @@ msgstr "Dashboard mit angefordertem Pfad kann nicht gefunden werden"
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr "Du bist nicht berechtigt, diesem Dashboard einen Stern hinzuzufügen"
-msgid "Metrics|1. Define and preview panel"
-msgstr "1. Panel definieren und Vorschau"
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr "2. Einfügen des YAML-Paneels in das Dashboard"
-
-msgid "Metrics|Add metric"
-msgstr "Metrik hinzufügen"
-
-msgid "Metrics|Add panel"
-msgstr "Panel hinzufügen"
-
-msgid "Metrics|Avg"
-msgstr "Durchschnittlich"
-
-msgid "Metrics|Back to dashboard"
-msgstr "Zurück zum Dashboard"
-
-msgid "Metrics|Cancel"
-msgstr "Abbrechen"
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr "Sieh dir die CI-/CD-Dokumentation zur Bereitstellung in einer Umgebung an"
-
-msgid "Metrics|Collapse panel"
-msgstr "Panel einklappen"
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr "Panel einklappen (Esc)"
-
-msgid "Metrics|Copy YAML"
-msgstr "YAML kopieren"
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr "Kopiere die Paneel-YAML und füge es in deine YAML-Datei des Dashboards ein."
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr "Benutzerdefiniertes Dashboard erstellen %{fileName}"
-
msgid "Metrics|Create metric"
msgstr "Metrik erstellen"
-msgid "Metrics|Create new dashboard"
-msgstr "Neues Dashboard erstellen"
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr "Erstelle deine Konfigurationsdatei des Dashboards"
-
-msgid "Metrics|Current"
-msgstr "Aktuell"
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr "Dashboard-Dateien findest du in %{codeStart}.gitlab/dashboards%{codeEnd} im root-Verzeichnis dieses Projekts."
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr "Definiere das Panel-YAML unten, um eine Vorschau des Panels anzuzeigen."
-
msgid "Metrics|Delete metric"
msgstr "Metrik löschen"
msgid "Metrics|Delete metric?"
msgstr "Metrik löschen?"
-msgid "Metrics|Duplicate"
-msgstr "Duplizieren"
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr "Duplizieren des aktuellen Dashboards"
-
-msgid "Metrics|Duplicate dashboard"
-msgstr "Dashboard duplizieren"
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr "Dupliziere dieses Dashboard, um ein Panel hinzuzufügen oder die Dashboard-YAML zu bearbeiten."
-
-msgid "Metrics|Duplicating..."
-msgstr "Duplizieren..."
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr "YAML des Dashboards bearbeiten"
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] "Metrik bearbeiten"
-msgstr[1] "Metriken bearbeiten"
-
-msgid "Metrics|Expand panel"
-msgstr "Panel erweitern"
+msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr "Zum Gruppieren ähnlicher Metriken"
-msgid "Metrics|Invalid time range, please verify."
-msgstr "Ungültiges Zeitintervall, bitte überprüfen."
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr "Bezeichnung der y-Achse (normalerweise die Einheit). Die x-Achse repräsentiert immer die Zeit."
msgid "Metrics|Legend label (optional)"
msgstr "Legendenbeschriftung (optional)"
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr "Link enthält ein ungültiges Zeitfenster. Überprüfe den Link, um das angeforderte Zeitintervall anzuzeigen."
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr "Link enthält ungültige Diagramminformationen. Überprüfe den Link, um das ausgeklappte Panel anzuzeigen."
-
-msgid "Metrics|Manage chart links"
-msgstr "Diagrammlinks verwalten"
-
-msgid "Metrics|Max"
-msgstr "Max"
-
-msgid "Metrics|Metrics Settings"
-msgstr "Metrikeinstellungen"
-
-msgid "Metrics|Min"
-msgstr "min."
-
-msgid "Metrics|More actions"
-msgstr "Weitere Aktionen"
-
msgid "Metrics|Must be a valid PromQL query."
msgstr "Muss eine gültige PromQL-Abfrage sein."
msgid "Metrics|New metric"
msgstr "Neue Metrik"
-msgid "Metrics|Open repository"
-msgstr "Repository öffnen"
-
-msgid "Metrics|Panel YAML"
-msgstr "Panel-YAML"
-
-msgid "Metrics|Panel YAML copied"
-msgstr "Panel-YAML kopiert"
-
-msgid "Metrics|Preview panel"
-msgstr "Vorschaufenster"
-
msgid "Metrics|PromQL query is valid"
msgstr "PromQL-Abfrage ist gültig"
msgid "Metrics|Prometheus Query Documentation"
msgstr "Prometheus-Abfragedokumentation"
-msgid "Metrics|Refresh Prometheus data"
-msgstr "Prometheus-Daten aktualisieren"
-
-msgid "Metrics|Refresh dashboard"
-msgstr "Dashboard aktualisieren"
-
-msgid "Metrics|Select a value"
-msgstr "Wert auswählen"
-
-msgid "Metrics|Set refresh rate"
-msgstr "Aktualisierungsrate festlegen"
-
-msgid "Metrics|Star dashboard"
-msgstr "Markiertes Dashboard"
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr "Beim Erstellen des Dashboards ist ein Fehler aufgetreten."
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr "Beim Erstellen des Zeigwerkzeugs/Dashboards ist ein Fehler aufgetreten. %{error}"
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr "Beim Abrufen der Annotationen ist ein Fehler aufgetreten. Versuche es erneut."
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr "Beim Abrufen der Umgebungsdaten ist ein Fehler aufgetreten, bitte versuche es erneut"
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr "Fehler beim Abrufen der Annotationsinformationen"
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr "Fehler beim Abrufen von Dashboard-Validierungswarnungen"
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr "Beim Abrufen der Bereitstellungsinformationen ist ein Fehler aufgetreten."
-
-msgid "Metrics|There was an error getting environments information."
-msgstr "Beim Abrufen der Umgebungsinformationen ist ein Fehler aufgetreten."
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr "Fehler beim Abrufen der Optionen für die Variable „%{name}“"
-
msgid "Metrics|There was an error trying to validate your query"
msgstr "Fehler beim Versuch, deine Anfrage zu validieren"
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr "Beim Abrufen der Metriken ist ein Fehler aufgetreten"
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr "Fehler beim Abrufen der Metriken: %{message}"
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr "Um ein neues Dashboard zu erstellen, füge eine neue YAML-Datei zu %{codeStart}.gitlab/dashboards%{codeEnd} im Stammverzeichnis dieses Projekts hinzu."
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr "Unerwartete Bereitstellungs-Datenantwort vom Prometheus-Endpunkt"
-
msgid "Metrics|Unit label"
msgstr "Bezeichnung der Einheit"
-msgid "Metrics|Unstar dashboard"
-msgstr "Dashboard entfavorisieren"
-
msgid "Metrics|Used as a title for the chart"
msgstr "Wird als Titel für das Diagramm verwendet"
@@ -28980,24 +29062,12 @@ msgstr "Wird verwendet, wenn die Abfrage eine einzelne Serie zurückgibt. Wenn m
msgid "Metrics|Validating query"
msgstr "Abfrage validieren"
-msgid "Metrics|Values"
-msgstr "Werte"
-
-msgid "Metrics|View documentation"
-msgstr "Dokumentation anzeigen"
-
msgid "Metrics|Y-axis label"
msgstr "Y-Achsen-Bezeichnung"
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr "Speichere eine Kopie dieses Dashboards in deinem Repository, damit du es anpassen kannst. Wähle einen Dateinamen und einen Branch, um es zu speichern."
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr "Du bist dabei, diese Metrik dauerhaft zu löschen. Dies kann nicht rückgängig gemacht werden."
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr "Dein Dashboard-Schema ist ungültig. Bearbeite das Dashboard und korrigiere das YAML-Schema."
-
msgid "Metrics|e.g. HTTP requests"
msgstr "z. B. HTTP-Anfragen"
@@ -29349,13 +29419,13 @@ msgid "MlExperimentTracking|Experiment removed"
msgstr "Experiment entfernt"
msgid "MlExperimentTracking|Experiments keep track of comparable model candidates, and determine which parameters provides the best performance. Create experiments using the MLflow client"
-msgstr ""
+msgstr "Experimente verfolgen vergleichbare Modellkandidaten nach und ermitteln, welche Parameter die beste Performance liefern. Erstelle Experimente mit dem MLflow-Client."
msgid "MlExperimentTracking|Filter candidates"
msgstr "Kandidaten filtern"
msgid "MlExperimentTracking|Get started with model experiments!"
-msgstr ""
+msgstr "Probiere die Funktion Modellexperimente aus!"
msgid "MlExperimentTracking|ID"
msgstr "ID"
@@ -29384,6 +29454,9 @@ msgstr "Modellkandidatendetails"
msgid "MlExperimentTracking|Model experiments"
msgstr "Modellexperimente"
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr "Name"
@@ -29406,7 +29479,7 @@ msgid "MlExperimentTracking|Status"
msgstr "Status"
msgid "MlExperimentTracking|Triggered by"
-msgstr ""
+msgstr "Ausgelöst durch"
msgid "Modal updated"
msgstr "Modal aktualisiert"
@@ -29420,6 +29493,9 @@ msgstr "Schließen"
msgid "Model experiments"
msgstr "Modellexperimente"
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr "Geändert"
@@ -29480,9 +29556,6 @@ msgstr "Mehr Informationen"
msgid "More information is available|here"
msgstr "hier"
-msgid "More information."
-msgstr "Mehr Informationen."
-
msgid "More options"
msgstr "Weitere Optionen"
@@ -29592,10 +29665,10 @@ msgid "Multiple Prometheus integrations are not supported"
msgstr "Mehrere Prometheus-Integrationen werden nicht unterstützt"
msgid "Multiple components(%s) have 'gl/inject-editor' attribute"
-msgstr "Mehrere Komponenten (%s) haben das Attribut „gl/inject-editor“."
+msgstr "Mehrere Komponenten (%s) haben das Attribut „gl/inject-editor“"
msgid "Multiple integrations of a single type are not supported for this project"
-msgstr ""
+msgstr "Mehrere Integrationen eines einzelnen Typs werden für dieses Projekt nicht unterstützt"
msgid "Multiple signatures"
msgstr "Mehrere Signaturen"
@@ -29660,6 +29733,12 @@ msgstr "Namensraum-ID:"
msgid "Namespace Limits"
msgstr "Namensraumlimits"
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr "Namensraum existiert nicht oder du hast keine Berechtigung."
+
+msgid "Namespace must be provided."
+msgstr "Namensraum muss angegeben werden."
+
msgid "Namespace or group to import repository into does not exist."
msgstr "Namensraum oder Gruppe zum Importieren des Projektarchivs existiert nicht."
@@ -29673,159 +29752,159 @@ msgid "NamespaceLimits|%{linkStart}%{username}%{linkEnd} changed the limit to %{
msgstr "%{linkStart}%{username}%{linkEnd} hat das Limit am %{date} zu %{limit} geändert"
msgid "NamespaceLimits|Add minimum free storage amount (in GiB) that will be used to enforce storage usage for namespaces on free plan. To remove the limit, set the value to 0 and click \"Update limit\" button."
-msgstr ""
+msgstr "Gib eine Mindestmenge an freiem Speicherplatz (in GiB) an, die verwendet wird, um die Speichernutzung für Namensräume im kostenlosen Tarif durchzusetzen. Um das Limit zu entfernen, setze den Wert auf 0 und klicke auf die Schaltfläche „Limit aktualisieren“."
msgid "NamespaceLimits|Add minimum free storage amount (in GiB) that will be used to set the dashboard limit for namespaces on free plan. To remove the limit, set the value to 0 and click \"Update limit\" button."
-msgstr ""
+msgstr "Füge die minimale freie Speichermenge (in GiB) hinzu, die zum Festlegen des Dashboard-Limits für Namensräume im kostenlosen Plan verwendet wird. Um das Limit zu entfernen, setze den Wert auf 0 und klicke auf „Limit aktualisieren“."
msgid "NamespaceLimits|Add minimum free storage amount (in GiB) that will be used to show notifications for namespace on free plan. To remove the limit, set the value to 0 and click \"Update limit\" button."
-msgstr ""
+msgstr "Füge die Mindestmenge an freiem Speicherplatz (in GiB) hinzu, die verwendet wird, um Benachrichtigungen für Namensräume im kostenlosen Tarif anzuzeigen. Um das Limit zu entfernen, setze den Wert auf 0 und klicke auf die Schaltfläche „Limit aktualisieren“."
msgid "NamespaceLimits|Confirm deletion"
-msgstr ""
+msgstr "Löschen bestätigen"
msgid "NamespaceLimits|Confirm limits change"
msgstr "Änderung der Limits bestätigen"
msgid "NamespaceLimits|Dashboard Limit"
-msgstr ""
+msgstr "Dashboard-Limit"
msgid "NamespaceLimits|Dashboard limit was successfully added"
-msgstr ""
+msgstr "Dashboard-Limit wurde erfolgreich hinzugefügt"
msgid "NamespaceLimits|Dashboard limit was successfully removed"
-msgstr ""
+msgstr "Dashboard-Limit wurde erfolgreich entfernt"
msgid "NamespaceLimits|Deletion confirmation"
-msgstr ""
+msgstr "Löschbestätigung"
msgid "NamespaceLimits|Do you confirm the deletion of the selected namespace from the exclusion list?"
-msgstr ""
+msgstr "Möchtest du den ausgewählten Namensraum wirklich aus der Ausschlussliste entfernen?"
msgid "NamespaceLimits|Enforcement Limit"
-msgstr ""
+msgstr "Durchsetzungslimit"
msgid "NamespaceLimits|Enforcement limit was successfully added"
-msgstr ""
+msgstr "Durchsetzungslimit wurde erfolgreich hinzugefügt"
msgid "NamespaceLimits|Enforcement limit was successfully removed"
-msgstr ""
+msgstr "Durchsetzungslimit wurde erfolgreich entfernt"
msgid "NamespaceLimits|Enter a valid number greater or equal to zero."
-msgstr ""
+msgstr "Gib eine gültige Zahl größer oder gleich Null ein."
msgid "NamespaceLimits|Exclude"
-msgstr ""
+msgstr "Ausschließen"
msgid "NamespaceLimits|Exclude namespace"
-msgstr ""
+msgstr "Namensraum ausschließen"
msgid "NamespaceLimits|Excluded Namespaces"
-msgstr ""
+msgstr "Ausgeschlossene Namensräume"
msgid "NamespaceLimits|Exclusion added successfully"
-msgstr ""
+msgstr "Ausschluss erfolgreich hinzugefügt"
msgid "NamespaceLimits|Free Tier"
msgstr "Kostenlose Stufe"
msgid "NamespaceLimits|Notifications Limit"
-msgstr ""
+msgstr "Benachrichtigungslimit"
msgid "NamespaceLimits|Notifications limit was successfully added"
-msgstr ""
+msgstr "Benachrichtigungslimit wurde erfolgreich hinzugefügt"
msgid "NamespaceLimits|Notifications limit was successfully removed"
-msgstr ""
+msgstr "Benachrichtigungslimit wurde erfolgreich entfernt"
msgid "NamespaceLimits|Reason"
-msgstr ""
+msgstr "Grund"
msgid "NamespaceLimits|Reason for excluding this namespace"
-msgstr ""
+msgstr "Grund für den Ausschluss dieses Namensraums"
msgid "NamespaceLimits|Set Dashboard limit"
-msgstr ""
+msgstr "Dashboard-Limit festlegen"
msgid "NamespaceLimits|Set Enforcement limit"
-msgstr ""
+msgstr "Durchsetzungslimit festlegen"
msgid "NamespaceLimits|Set Notifications limit"
-msgstr ""
+msgstr "Benachrichtigungslimit festlegen"
msgid "NamespaceLimits|Storage Phased Notification"
msgstr "Speicherphasenbenachrichtigung"
msgid "NamespaceLimits|There was an error deleting the namespace: \"%{errorMessage}\"."
-msgstr ""
+msgstr "Beim Löschen des Namensraumes ist ein Fehler aufgetreten: \"%{errorMessage}\"."
msgid "NamespaceLimits|There was an error fetching the exclusion list, try refreshing the page."
-msgstr ""
+msgstr "Beim Abrufen der Ausschlussliste ist ein Fehler aufgetreten. Versuche, die Seite zu aktualisieren."
msgid "NamespaceLimits|These namespaces won't receive any notifications nor any degraded functionality while they remain on this list"
msgstr "Diese Namensbereiche erhalten keine Benachrichtigungen oder eingeschränkte Funktionen, solange sie auf dieser Liste bleiben"
msgid "NamespaceLimits|This will change the dashboard limit for all free namespaces except the excluded namespaces, the limit can be removed later."
-msgstr ""
+msgstr "Dies ändert das Dashboard-Limit für alle freien Namensräume außer den ausgeschlossenen Namensräumen. Das Limit kann später entfernt werden."
msgid "NamespaceLimits|This will change when free namespaces get storage enforcement except the excluded namespaces, the limit can be removed later."
-msgstr ""
+msgstr "Dies ändert sich, wenn der Speicherplatz für freie Namensräume (mit Ausnahme der ausgeschlossenen Namensräume) freigegeben wird. Der Grenzwert kann später aufgehoben werden."
msgid "NamespaceLimits|This will limit the amount of notifications all free namespaces receives except the excluded namespaces, the limit can be removed later."
-msgstr ""
+msgstr "Dies begrenzt die Anzahl der Benachrichtigungen, die alle freien Namensräume (mit Ausnahme der ausgeschlossenen Namensräume) erhalten. Der Grenzwert kann später aufgehoben werden."
msgid "NamespaceLimits|Update limit"
msgstr "Limit aktualisieren"
msgid "NamespaceLimits|You must select a namespace and add a reason for excluding it"
-msgstr ""
+msgstr "Du musst einen Namesraum auswählen und einen Grund für den Ausschluss hinzufügen"
msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Your ability to write new data to this namespace is restricted. %{read_only_link_start}Which actions are restricted?%{link_end}"
-msgstr ""
+msgstr "%{namespace_name} ist jetzt schreibgeschützt. Du kannst keine neue Daten in diesen Namensraum mehr schreiben. %{read_only_link_start}Welche Aktionen sind eingeschränkt?%{link_end}"
msgid "NamespaceStorageSize|For more information about storage limits, see our %{faq_link_start}FAQ%{link_end}."
-msgstr ""
+msgstr "Weitere Informationen über Speicherbeschränkungen findest du in unseren %{faq_link_start}FAQs%{link_end}."
msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, your ability to write new data to this namespace will be restricted. %{read_only_link_start}Which actions become restricted?%{link_end}"
-msgstr ""
+msgstr "Wenn %{namespace_name} das Speicherkontingent überschreitet, wird deine Möglichkeit, neue Daten in diesen Namensraum zu schreiben, eingeschränkt. %{read_only_link_start}Welche Aktionen werden eingeschränkt?%{link_end}"
msgid "NamespaceStorageSize|If a project reaches 100%% of the storage quota (%{free_size_limit}) the project will be in a read-only state, and you won't be able to push to your repository or add large files."
-msgstr ""
+msgstr "Wenn ein Projekt 100 %% des Speicherkontingents (%{free_size_limit}) erreicht, wird das Projekt in einen schreibgeschützten Zustand versetzt. Du kannst dann nicht mehr in dein Repository pushen oder große Dateien hinzufügen."
msgid "NamespaceStorageSize|To prevent your projects from being in a read-only state %{manage_storage_link_start}manage your storage usage%{link_end}, or %{purchase_more_link_start}purchase more storage%{link_end}."
-msgstr ""
+msgstr "Um zu verhindern, dass deine Projekte schreibgeschützt sind, kannst du %{manage_storage_link_start}die Speichernutzung verwalten%{link_end} oder %{purchase_more_link_start}mehr Speicherplatz kaufen%{link_end}."
msgid "NamespaceStorageSize|To prevent your projects from being in a read-only state %{manage_storage_link_start}manage your storage usage%{link_end}, or contact a user with the %{group_member_link_start}owner role for this namespace%{link_end} and ask them to %{purchase_more_link_start}purchase more storage%{link_end}."
-msgstr ""
+msgstr "Um zu verhindern, dass deine Projekte schreibgeschützt sind, kannst du %{manage_storage_link_start}deine Speichernutzung verwalten%{link_end} oder eine(n) Benutzer(in) mit der %{group_member_link_start}Eigentümerrolle für diesen Namensraum%{link_end} kontaktieren und darum bitten, %{purchase_more_link_start}mehr Speicherplatz zu kaufen%{link_end}."
msgid "NamespaceStorageSize|To reduce storage usage, reduce git repository and git LFS storage."
-msgstr ""
+msgstr "Um die Speichernutzung zu reduzieren, reduziere den Git Repository- und Git LFS-Speicher."
msgid "NamespaceStorageSize|To remove the read-only state %{manage_storage_link_start}manage your storage usage%{link_end}, or %{purchase_more_link_start}purchase more storage%{link_end}."
-msgstr ""
+msgstr "Um den schreibgeschützten Status zu entfernen, kannst du %{manage_storage_link_start}deine Speichernutzung verwalten%{link_end} oder %{purchase_more_link_start}mehr Speicherplatz erwerben%{link_end}."
msgid "NamespaceStorageSize|To remove the read-only state %{manage_storage_link_start}manage your storage usage%{link_end}, or contact a user with the %{group_member_link_start}owner role for this namespace%{link_end} and ask them to %{purchase_more_link_start}purchase more storage%{link_end}."
-msgstr ""
+msgstr "Um den schreibgeschützten Status zu entfernen, kannst du %{manage_storage_link_start}deine Speichernutzung verwalten%{link_end} oder eine(n) Benutzer(in) mit der %{group_member_link_start}Eigentümerrolle für diesen Namensraum%{link_end} kontaktieren und darum bitten, %{purchase_more_link_start}mehr Speicherplatz zu kaufen%{link_end}."
msgid "NamespaceStorageSize|To remove the read-only state, reduce git repository and git LFS storage, or %{purchase_more_link_start}purchase more storage%{link_end}."
-msgstr ""
+msgstr "Um den schreibgeschützten Status zu entfernen, kannst du den Git-Repository- und Git-LFS-Speicher reduzieren oder %{purchase_more_link_start}mehr Speicherplatz kaufen%{link_end}."
msgid "NamespaceStorageSize|To remove the read-only state, reduce git repository and git LFS storage, or contact a user with the %{group_member_link_start}owner role for this namespace%{link_end} and ask them to %{purchase_more_link_start}purchase more storage%{link_end}."
-msgstr ""
+msgstr "Um den schreibgeschützten Status zu entfernen, kannst du den Git-Repository- und Git-LFS-Speicher reduzieren oder eine(n) Benutzer(in) mit der %{group_member_link_start}Eigentümerrolle für diesen Namespace%{link_end} kontaktieren und darum bitten, %{purchase_more_link_start}mehr Speicherplatz zu kaufen%{link_end}."
msgid "NamespaceStorageSize|You have consumed all available storage and you can't push or add large files to projects over the free tier limit (%{free_size_limit})."
-msgstr ""
+msgstr "Du hast den gesamten verfügbaren Speicherplatz verbraucht und kannst keine großen Dateien zu Projekten pushen oder hinzufügen, die sie das Limit des kostenlosen Tarifs (%{free_size_limit}) überschreiten."
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} for %{namespace_name}"
-msgstr ""
+msgstr "Du hast das kostenfreie Speicherlimit von %{free_size_limit} für %{namespace_name} erreicht."
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on %{readonly_project_count} project"
msgid_plural "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on %{readonly_project_count} projects"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Du hast das kostenfreie Speicherlimit von %{free_size_limit} für %{readonly_project_count} Projekt erreicht."
+msgstr[1] "Du hast das kostenfreie Speicherlimit von %{free_size_limit} für %{readonly_project_count} Projekte erreicht."
msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name}"
-msgstr ""
+msgstr "Du hast %{usage_in_percent} des Speicherkontingents für %{namespace_name} verbraucht."
msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
msgstr "Du hast %{usage_in_percent} des Speicherkontingents für %{namespace_name} (%{used_storage} von %{storage_limit}) verwendet. "
@@ -29957,7 +30036,7 @@ msgid "Navigation|Context navigation"
msgstr "Kontextnavigation"
msgid "Navigation|Deploy"
-msgstr ""
+msgstr "Bereitstellung"
msgid "Navigation|Enter admin mode"
msgstr "Adminmodus aktivieren"
@@ -29981,7 +30060,7 @@ msgid "Navigation|Leave admin mode"
msgstr "Adminmodus verlassen"
msgid "Navigation|Main navigation"
-msgstr ""
+msgstr "Hauptnavigation"
msgid "Navigation|Manage"
msgstr "Verwalten"
@@ -30408,12 +30487,6 @@ msgstr "Keine Kreditkarte erforderlich."
msgid "No data available"
msgstr "Keine Daten verfügbar"
-msgid "No data found"
-msgstr "Keine Daten gefunden"
-
-msgid "No data to display"
-msgstr "Keine anzuzeigenden Daten"
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr "Keine Bereitstellungen erkannt. Verwende Umgebungen, um die kontinuierliche Bereitstellung deiner Software zu steuern. %{linkStart}Erfahre mehr über Bereitstellungsjobs.%{linkEnd}"
@@ -30469,7 +30542,7 @@ msgid "No labels with such name or description"
msgstr "Keine Labels mit einem solchen Namen oder einer solchen Beschreibung"
msgid "No linked issue matches the provided parameter."
-msgstr ""
+msgstr "Kein verknüpftes Ticket entspricht dem angegebenen Parameter."
msgid "No matches found"
msgstr "Keine Ãœbereinstimmungen gefunden"
@@ -30552,9 +30625,6 @@ msgstr "Keine Referenz ausgewählt"
msgid "No regions configured"
msgstr "Keine Regionen konfiguriert"
-msgid "No related merge requests found."
-msgstr "Keine zugehörigen Merge Requests gefunden."
-
msgid "No repository"
msgstr "Kein Repository"
@@ -30597,6 +30667,9 @@ msgstr "Keine Stapelverfolgung für diesen Fehler"
msgid "No starrers matched your search"
msgstr "Keine Starrer(innen) für deine Suche gefunden"
+msgid "No start date – %{dueDate}"
+msgstr "Kein Startdatum – %{dueDate}"
+
msgid "No suggestions found"
msgstr "Keine Vorschläge gefunden"
@@ -30740,9 +30813,6 @@ msgstr "Hinweis: Aktuelle Forks werden ihre Sichtbarkeitsstufe behalten."
msgid "NoteForm|Note"
msgstr "Hinweis"
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr "Unterstützt %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. Gebe für %{quickActionsDocsLinkStart}Schnellaktionen%{quickActionsDocsLinkEnd} %{keyboardStart}/%{keyboardEnd} ein."
-
msgid "Notes"
msgstr "Notizen"
@@ -31039,6 +31109,9 @@ msgstr "Autor des Commits"
msgid "Notify|Committed by"
msgstr "Commited von"
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr "Die folgenden Werte der Spalte %{column} im Projekt %{project}%{parent_groups_clause} konnten nicht gefunden werden: %{error_lines}"
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr "Möchtest du keine Updates von GitLab-Administratoren erhalten?"
@@ -31144,18 +31217,24 @@ msgstr "Keine Vorschau für diesen Dateityp"
msgid "Notify|No work items have been imported."
msgstr "Es wurden keine Arbeitsaufgaben importiert."
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
-msgstr "Pipeline #%{pipeline_id} ist fehlgeschlagen!"
-
msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr "Pipeline %{pipeline_link} ausgelöst durch"
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
-msgstr "Die Pipeline wurde repariert und #%{pipeline_id} hat bestanden!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
+msgstr "Pipeline %{pipeline_name_or_id} ist fehlgeschlagen!"
+
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr "Pipeline %{pipeline_name_or_id} war erfolgreich!"
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
+msgstr "Pipeline wurde repariert und %{pipeline_name_or_id} war erfolgreich!"
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr "Bitte überprüfen, ob dein Dienstanbieter E-Mail-Unteradressen unterstützt und ob du die E-Mail-Weiterleitung korrekt eingerichtet hast."
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr "Bitte behebe die oben genannten Fehler und versuche die CSV-Datei erneut zu importieren."
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr "Bitte korrigiere die Zeilen mit Fehlern und versuche den CSV-Import erneut."
@@ -31330,6 +31409,9 @@ msgstr "Anzahl der Replikas"
msgid "Number of shards"
msgstr "Anzahl der Fragmente"
+msgid "Number of shards for non-code indexing"
+msgstr "Anzahl der Shards für die Nicht-Code-Indizierung"
+
msgid "OK"
msgstr "OK"
@@ -32006,6 +32088,12 @@ msgstr "Sortierte Liste"
msgid "Organizations"
msgstr "Organisationen"
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr "Verwaistes Mitglied"
@@ -32325,13 +32413,13 @@ msgid "PackageRegistry|Debian"
msgstr "Debian"
msgid "PackageRegistry|Delete %{count} assets"
-msgstr ""
+msgstr "%{count} Assets löschen"
msgid "PackageRegistry|Delete Package Version"
msgstr "Paketversion löschen"
msgid "PackageRegistry|Delete asset"
-msgstr ""
+msgstr "Asset löschen"
msgid "PackageRegistry|Delete package"
msgstr "Paket löschen"
@@ -32527,6 +32615,18 @@ msgstr "Projektebene"
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr "Pakete veröffentlichen, wenn der Name oder die Version mit dieser Regex übereinstimmt."
+msgid "PackageRegistry|Published %{date}"
+msgstr "Veröffentlicht am: %{date}"
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr "Veröffentlicht von: %{author}, am: %{date}"
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr "Veröffentlicht in Projekt %{projectName} von: %{author}, am: %{date}"
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr "Veröffentlicht in Projekt %{projectName}, am: %{date}"
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr "Veröffentlicht in der %{project} Package-Registry %{datetime}"
@@ -32582,7 +32682,7 @@ msgid "PackageRegistry|Something went wrong while deleting the package."
msgstr "Beim Löschen des Pakets ist etwas schief gelaufen."
msgid "PackageRegistry|Something went wrong while fetching package assets."
-msgstr ""
+msgstr "Beim Abrufen der Paket-Assets ist etwas schief gelaufen."
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr "Beim Abrufen des Paketverlaufs ist etwas schiefgelaufen."
@@ -32642,7 +32742,7 @@ msgid "PackageRegistry|Yes, delete selected packages"
msgstr "Ja, ausgewählte Pakete löschen"
msgid "PackageRegistry|You are about to delete %{count} assets. This operation is irreversible."
-msgstr ""
+msgstr "%{count} Assets werden gelöscht. Dieser Vorgang ist nicht umkehrbar."
msgid "PackageRegistry|You are about to delete %{count} packages. This operation is irreversible."
msgstr "Du bist im Begriff, %{count} Pakete zu löschen. Dieser Vorgang kann nicht rückgängig gemacht werden."
@@ -33097,9 +33197,6 @@ msgstr "Zeitpläne der Pipeline"
msgid "Pipeline URL"
msgstr "Pipeline-URL"
-msgid "Pipeline artifacts"
-msgstr "Pipeline-Artefakte"
-
msgid "Pipeline creation rate limits"
msgstr "Ratenlimit für die Pipeline-Erstellung"
@@ -33301,6 +33398,15 @@ msgstr "Aktiv"
msgid "PipelineSchedules|All"
msgstr "Alle"
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr "Beim Erstellen des Pipelineplans ist ein Fehler aufgetreten."
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr "Möchtest du diesen Pipeline-Zeitplan wirklich löschen?"
@@ -33310,6 +33416,9 @@ msgstr "Kann benutzerdefinierte CI/CD Variablen haben.&nbsp;"
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr "Erstelle einen neuen Pipeline-Zeitplan"
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr "Cron-Zeitzone"
@@ -33367,9 +33476,6 @@ msgstr "Läuft für einen bestimmten Zweig oder Tag."
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr "Wird mit den gleichen Projektberechtigungen wie der Eigentümer des Zeitplans ausgeführt."
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr "Pipeline-Zeitplan speichern"
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr "Die Ausführung einer Pipeline wurde erfolgreich geplant. Einzelheiten findest du auf der %{linkEnd}Pipelines Seite%{linkStart}. "
@@ -33554,10 +33660,7 @@ msgid "Pipelines|CI/CD Catalog"
msgstr "CI/CD-Katalog"
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
-msgstr "Pipelines|Untergeordnete Pipeline (%{linkStart}Ãœbergeordnete%{linkEnd})"
-
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr "Untergeordnete Pipeline (%{link_start}übergeordnet%{link_end})"
+msgstr "Untergeordnete Pipeline (%{linkStart}übergeordnet%{linkEnd})"
msgid "Pipelines|Clear runner caches"
msgstr "Runner-Caches löschen"
@@ -33670,11 +33773,14 @@ msgstr "Bist du bereit, CI/CD für dein Projekt einzurichten?"
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr "Rebasing erstellt eine Pipeline, die Code aus einem verzweigten Merge Request ausführt. Folglich gibt es potenzielle Auswirkungen auf die Sicherheit, wie z. B. die Offenlegung von CI-Variablen."
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr "Job %{jobName} wiederholen"
+
msgid "Pipelines|Revoke trigger"
msgstr "Trigger widerrufen"
msgid "Pipelines|Scheduled"
-msgstr "Pipelines|Geplant"
+msgstr "Geplant"
msgid "Pipelines|Set up a runner"
msgstr "Richte einen Runner ein"
@@ -33721,11 +33827,8 @@ msgstr "Diese GitLab-CI-Konfiguration ist ungültig: %{reason}. %{linkStart}Mehr
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr "Diese GitLab-CI-Konfiguration ist gültig."
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr "Dies ist eine untergeordnete Pipeline innerhalb der übergeordneten Pipeline."
-
msgid "Pipelines|This pipeline is stuck"
-msgstr "Pipelines|Die Pipeline steckt fest"
+msgstr "Die Pipeline steckt fest"
msgid "Pipelines|This pipeline ran on the contents of this merge request combined with the contents of all other merge requests queued for merging into the target branch."
msgstr "Diese Pipeline lief auf dem Inhalt dieses Merge Requests in Kombination mit dem Inhalt aller anderen Merge Requests, die für die Zusammenführung in den Zielbranch in die Warteschlange eingereiht wurden."
@@ -33742,11 +33845,11 @@ msgstr "Dieses Projekt ist derzeit nicht zum Ausführen von Pipelines eingericht
msgid "Pipelines|Token"
msgstr "Token"
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
-msgstr ""
+msgstr "Gesamtzahl der Jobs für die Pipeline"
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr "Trigger-Benutzer(in) hat unzureichende Berechtigungen für das Projekt."
@@ -33797,14 +33900,20 @@ msgid "Pipelines|You should review the code thoroughly before running this pipel
msgstr "Du solltest den Code gründlich überprüfen, bevor du diese Pipeline mit den CI/CD-Ressourcen des übergeordneten Projekts ausführst."
msgid "Pipelines|You will see a maximum of 100 jobs in this list. To view all failed jobs, %{linkStart}go to the details page%{linkEnd} of this pipeline."
-msgstr ""
+msgstr "In dieser Liste siehst du maximal 100 Jobs. %{linkStart}Gehe auf Detailseite%{linkEnd} dieser Pipeline, um alle fehlgeschlagenen Jobs zu sehen."
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr "Deine Änderungen wurden erfolgreich übertragen. Du wirst auf die neue Merge Request-Seite umgeleitet."
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr "Fehler"
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr "ungültig"
@@ -33871,6 +33980,12 @@ msgstr "Merge-Train-Pipeline-Jobs können nicht wiederholt werden"
msgid "Pipeline|Merged result pipeline"
msgstr "Pipeline für zusammengeführtes Ergebnis"
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr "Erfolgreich"
@@ -33955,6 +34070,9 @@ msgstr "Diese Pipeline lief auf dem Inhalt des Quellbranches dieses Merge Reques
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr "Um eine Merge-Request-Pipeline auszuführen, müssen die Jobs in der CI/CD-Konfigurationsdatei %{linkStart}für die Ausführung in Merge-Request-Pipelines konfiguriert sein%{linkEnd}."
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr "Trigger-Autor(in)"
@@ -34081,9 +34199,6 @@ msgstr "Bitte bestätige deine E-Mail Adresse"
msgid "Please contact an admin to create runners."
msgstr "Bitte kontaktiere eine(n) Administrator(in), um Runner zu erstellen."
-msgid "Please contact an admin to register runners."
-msgstr "Bitte kontaktiere eine(n) Administrator(in), um Runner zu registrieren."
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr "Wende dich bitte an deine(n) GitLab-Administrator(in), wenn du glaubst, dass dies ein Fehler ist."
@@ -34234,8 +34349,8 @@ msgstr "Bitte versuche es erneut"
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr "Bitte versuche, die Seite zu aktualisieren. Wenn das Problem weiterhin besteht, wende dich bitte an den Support."
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
-msgstr "Bitte gib %{phrase_code} ein, um fortzufahren oder schließe das Modal-Fenster, um abzubrechen."
+msgid "Please type %{phrase_code} to proceed."
+msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
msgstr "Bitte verwende dieses Formular, um den Administrator-Benutzer(innen) zu melden, die Spamtickets oder -kommentare erstellen oder sich unangemessen verhalten."
@@ -34301,7 +34416,7 @@ msgid "Port"
msgstr "Port"
msgid "Possible to override in each project."
-msgstr ""
+msgstr "Kann in jedem Projekt überschrieben werden."
msgid "Postman collection"
msgstr "Postman-Sammlung"
@@ -34436,7 +34551,7 @@ msgid "Preferences|Enable Gitpod integration"
msgstr "Gitpod-Integration aktivieren"
msgid "Preferences|Enable Zoekt code search"
-msgstr ""
+msgstr "Zoekt-Codesuche aktivieren"
msgid "Preferences|Enable follow users"
msgstr "Aktiviere „Benutzer(innen) folgen“"
@@ -34487,7 +34602,7 @@ msgid "Preferences|Show one file at a time on merge request's Changes tab"
msgstr "Jeweils nur eine Datei auf der Registerkarte „Änderungen“ der Merge Requests anzeigen"
msgid "Preferences|Show shortcut buttons above files on project overview"
-msgstr ""
+msgstr "Shortcut-Schaltflächen über Dateien in der Projektübersicht anzeigen"
msgid "Preferences|Show whitespace changes in diffs"
msgstr "Leerzeichenänderungen in Änderungen anzeigen"
@@ -34514,7 +34629,7 @@ msgid "Preferences|Turns on or off the ability to follow or be followed by other
msgstr "Aktiviert oder deaktiviert die Möglichkeit, anderen Benutzer(innen) zu folgen oder von ihnen verfolgt zu werden."
msgid "Preferences|Turns on or off the preference to search with Zoekt instead of Elasticsearch."
-msgstr ""
+msgstr "Aktiviert oder deaktiviert die Voreinstellung, mit Zoekt statt Elasticsearch zu suchen."
msgid "Preferences|Use relative times"
msgstr "Relative Zeiten verwenden"
@@ -34628,7 +34743,7 @@ msgid "Private projects can be created in your personal namespace with:"
msgstr "Private Projekte können in deinem persönlichen Namensraum erstellt werden:"
msgid "Private projects compute cost factor"
-msgstr ""
+msgstr "Rechen-Kostenfaktor für private Projekte"
msgid "Problem with %{name} command: %{message}."
msgstr "Problem mit %{name}-Befehl: %{message}."
@@ -34643,25 +34758,25 @@ msgid "Product analytics"
msgstr "Produktanalytik"
msgid "ProductAnalytics|1. Add the NPM package to your package.json using your preferred package manager"
-msgstr ""
+msgstr "1. Füge das NPM-Paket mit deinem bevorzugten Paketmanager zu deiner package.json hinzu"
msgid "ProductAnalytics|2. Import the new package into your JS code"
-msgstr ""
+msgstr "2. Importiere das neue Paket in deinen JS-Code"
msgid "ProductAnalytics|3. Initiate the tracking"
-msgstr ""
+msgstr "3. Initiiere das Tracking"
msgid "ProductAnalytics|Add another dimension"
msgstr "Andere Abmessung hinzufügen"
msgid "ProductAnalytics|Add the script to the page and assign the client SDK to window"
-msgstr ""
+msgstr "Füge das Skript zur Seite hinzu und weise die Client-SDK dem Fenster zu"
msgid "ProductAnalytics|Add the script to the page and assign the client SDK to window:"
msgstr "Füge das Skript der Seite hinzu und weise das Client-SDK dem Fenster zu:"
msgid "ProductAnalytics|After your application has been instrumented and data is being collected, you can visualize and monitor behaviors in your %{linkStart}analytics dashboards%{linkEnd}."
-msgstr ""
+msgstr "Nachdem deine Anwendung instrumentiert wurde und Daten gesammelt wurden, kannst du Verhaltensweisen in deinen %{linkStart}Analytics-Dashboards%{linkEnd} visualisieren und überwachen."
msgid "ProductAnalytics|All Clicks Compared"
msgstr "Alle Klicks verglichen"
@@ -34724,7 +34839,7 @@ msgid "ProductAnalytics|Compares page views of all pages against each other"
msgstr "Vergleicht Seitenaufrufe aller Seiten gegeneinander"
msgid "ProductAnalytics|Create a visualization"
-msgstr ""
+msgstr "Visualisierung erstellen"
msgid "ProductAnalytics|Creating your product analytics instance..."
msgstr "Erstellen deiner Produkt-Analyseinstanz..."
@@ -34750,6 +34865,9 @@ msgstr "Ereignisse im Laufe der Zeit"
msgid "ProductAnalytics|Feature Usages"
msgstr "Funktionsverwendungen"
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr "Weitere Informationen findest du in den %{linkStart}Dokumenten%{linkEnd}."
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr "Füge den Analytics-Tracking-Code zu deinem Projekt hinzu, um Daten im Produktanalyse-Dashboard anzuzeigen."
@@ -34789,17 +34907,20 @@ msgstr "Worüber möchtest du Einblicke erhalten? "
msgid "ProductAnalytics|Page Views"
msgstr "Seitenaufrufe"
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr "Prozentsatz wiederholter Besuche"
msgid "ProductAnalytics|SDK application ID"
-msgstr ""
+msgstr "SDK-Anwendungs-ID"
msgid "ProductAnalytics|SDK clients"
-msgstr ""
+msgstr "SDK-Clients"
msgid "ProductAnalytics|SDK host"
-msgstr ""
+msgstr "SDK-Host"
msgid "ProductAnalytics|Sessions"
msgstr "Sitzungen"
@@ -34817,7 +34938,7 @@ msgid "ProductAnalytics|The host to send all tracking events to"
msgstr "Der Host, an den alle Tracking-Ereignisse gesendet werden"
msgid "ProductAnalytics|The sender of tracking events"
-msgstr ""
+msgstr "Der Absender von Tracking-Ereignissen"
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 "Es gibt derzeit keine Daten für diesen Diagrammtyp. Wenn du das Produktanalyse-Tool noch nicht konfiguriert hast, findest du weitere Informationen auf der Registerkarte „Setup“."
@@ -34844,7 +34965,7 @@ msgid "ProductAnalytics|Users"
msgstr "Benutzer(innen)"
msgid "ProductAnalytics|Using JS module"
-msgstr ""
+msgstr "Verwendung des JS-Moduls"
msgid "ProductAnalytics|Waiting for events"
msgstr "Warten auf Ereignisse"
@@ -34853,7 +34974,7 @@ msgid "ProductAnalytics|What do you want to measure?"
msgstr "Was möchtest du messen?"
msgid "ProductAnalytics|You can instrument your application using a JS module or an HTML script. Follow the instructions below for the option you prefer."
-msgstr ""
+msgstr "Du kannst deine Anwendung mit einem JS-Modul oder einem HTML-Skript steuern. Befolge die Anweisungen unten für die von dir bevorzugte Option."
msgid "Productivity"
msgstr "Produktivität"
@@ -34930,6 +35051,9 @@ msgstr "ein"
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 "Du bist im Begriff, %{yourAccount} permanent zu löschen, inklusive aller Tickets, Merge-Requests und Gruppen, die mit deinem Account verknüpft sind. Sobald du %{deleteAccount} bestätigst, kann diese Aktion nicht rückgängig gemacht werden."
+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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr "%{yourAccount} sowie alle Tickets, Merge Requests und Gruppen, die mit deinem Konto verknüpft sind, werden endgültig gelöscht. Wenn du %{deleteAccount} bestätigst, kann der Vorgang nicht mehr rückgängig gemacht werden und dein Konto kann nicht wiederhergestellt werden. Es kann sein, dass du sieben Tage warten musst, bevor du ein neues Konto mit demselben Benutzernamen oder derselben E-Mail-Adresse anlegen kannst."
+
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 "Du bist im Begriff, deinen Benutzernamen von %{currentUsernameBold} in %{newUsernameBold} zu ändern. Profile und Projekte werden auf den neuen %{newUsername}-Namensraum umgeleitet, aber diese Umleitung wird auslaufen, sobald der %{currentUsername}-Namensraum von einem anderen Benutzer oder einer anderen Gruppe registriert wird. Bitte aktualisiere deine Git-Repository-Remotes so bald wie möglich."
@@ -34943,10 +35067,10 @@ msgid "Profiles|Account could not be deleted. GitLab was unable to verify your i
msgstr "Konto konnte nicht gelöscht werden. GitLab konnte deine Identität nicht verifizieren."
msgid "Profiles|Account deletion is not allowed by your administrator."
-msgstr ""
+msgstr "Dein Administrator erlaubt die Kontolöschung nicht."
msgid "Profiles|Account deletion is not allowed."
-msgstr ""
+msgstr "Die Kontolöschung ist nicht erlaubt."
msgid "Profiles|Account scheduled for removal."
msgstr "Konto zur Löschung vorgemerkt."
@@ -35446,9 +35570,6 @@ msgstr "Projektinformation:"
msgid "Project information"
msgstr "Projektinformation"
-msgid "Project is required when cluster_type is :project"
-msgstr "Projekt ist erforderlich, wenn „cluster_type“ gleich „:project“ ist."
-
msgid "Project members"
msgstr "Projektmitglieder"
@@ -35876,7 +35997,7 @@ msgid "ProjectSettings|Configure your infrastructure."
msgstr "Konfiguriere Deine Infrastruktur."
msgid "ProjectSettings|Connect to your instance"
-msgstr ""
+msgstr "Mit deiner Instanz verbinden"
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "Kontaktiere eine(n) Administrator(in), um diese Einstellung zu ändern."
@@ -35978,7 +36099,7 @@ msgid "ProjectSettings|Infrastructure"
msgstr "Infrastruktur"
msgid "ProjectSettings|Instrument your application to track events and behaviors."
-msgstr ""
+msgstr "Steuere deine Anwendung, um Ereignisse und Verhaltensweisen zu verfolgen."
msgid "ProjectSettings|Internal"
msgstr "Intern"
@@ -35986,18 +36107,6 @@ msgstr "Intern"
msgid "ProjectSettings|Issues"
msgstr "Tickets"
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr "Jitsu-Administrator-E-Mail-Adresse"
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr "Jitsu-Administrator-Passwort"
-
-msgid "ProjectSettings|Jitsu host"
-msgstr "Jitsu-Host"
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr "Jitsu-Projekt-ID"
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr "LFS-Objekte aus diesem Projektarchiv sind für Forks verfügbar. %{linkStart}Wie entferne ich sie?%{linkEnd}"
@@ -36047,7 +36156,7 @@ msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-d
msgstr "Zusammenführen ist nur erlaubt, wenn der Quellbranch mit seinem Ziel auf dem neuesten Stand ist."
msgid "ProjectSettings|Model experiments"
-msgstr ""
+msgstr "Modellexperimente"
msgid "ProjectSettings|Monitor"
msgstr "Ãœberwachung"
@@ -36068,7 +36177,7 @@ msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr "Nur signierte Commits können zu diesem Repository gepusht werden."
msgid "ProjectSettings|Override instance analytics configuration for this project"
-msgstr ""
+msgstr "Überschreibe die Konfiguration der Instanz-Analyse für dieses Projekt"
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr "Diese Einstellung überschreibt die Benachrichtigungseinstellungen für alle Projektmitglieder."
@@ -36089,10 +36198,10 @@ msgid "ProjectSettings|Private"
msgstr "Privat"
msgid "ProjectSettings|Product analytics configurator connection string"
-msgstr "ProjectSettings|Produktanalyse-Konfigurator-Verbindungsdetails"
+msgstr "Verbindungsdetails des Produktanalyse-Konfigurators"
msgid "ProjectSettings|Product analytics needs to be set up before your application can be instrumented. Follow the %{link_start}set up process%{link_end}."
-msgstr ""
+msgstr "Produktanalyse muss eingerichtet werden, bevor deine Anwendung gesteuert werden kann. Befolge dazu den %{link_start}Einrichtungsprozess%{link_end}."
msgid "ProjectSettings|Project visibility"
msgstr "Projekt-Sichtbarkeit"
@@ -36137,7 +36246,7 @@ msgid "ProjectSettings|Security and compliance for this project."
msgstr "Sicherheit und Compliance für dieses Projekt."
msgid "ProjectSettings|Select a project"
-msgstr ""
+msgstr "Projekt wählen"
msgid "ProjectSettings|Select the default branch for this project, and configure the template for branch names."
msgstr "Wähle den Standard Branch für dieses Projekt aus und konfiguriere die Vorlage für Branchennamen."
@@ -36181,9 +36290,6 @@ msgstr "Reiche Änderungen ein, die upstream zusammengeführt werden sollen."
msgid "ProjectSettings|Target project"
msgstr "Zielprojekt"
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr "Die ID des Projekts in Jitsu. Das Projekt enthält alle Analyseinstanzen."
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr "Die URL deiner Cube-Instanz."
@@ -36197,7 +36303,7 @@ msgid "ProjectSettings|The commit message used when squashing commits."
msgstr "Die Commit-Nachricht, die beim Squashen von Commits verwendet wird."
msgid "ProjectSettings|The connection string of your product analytics configurator instance for Snowplow configuration."
-msgstr "ProjectSettings|Die Verbindungszeichenfolge Ihrer Produktanalyse-Konfiguratorinstanz für die Snowplow-Konfiguration."
+msgstr "Die Verbindungszeichenfolge deiner Produktanalyse-Konfiguratorinstanz für die Snowplow-Konfiguration."
msgid "ProjectSettings|The default target project for merge requests created in this fork project."
msgstr "Das Standard-Zielprojekt für Merge Requests, die in diesem Fork-Projekt erstellt wurden."
@@ -36205,9 +36311,6 @@ msgstr "Das Standard-Zielprojekt für Merge Requests, die in diesem Fork-Projekt
msgid "ProjectSettings|The default template will be applied on save."
msgstr "Die Standardvorlage wird beim Speichern angewendet."
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr "Der Host deiner Jitsu-Instanz."
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr "Der Host deiner Datensammlerinstanz."
@@ -36233,7 +36336,7 @@ msgid "ProjectSettings|Topics are publicly visible even on private projects. Do
msgstr "Themen sind auch bei privaten Projekten öffentlich sichtbar. Füge keine vertraulichen Informationen in die Themennamen ein. %{linkStart}Mehr erfahren%{linkEnd}."
msgid "ProjectSettings|Track machine learning model experiments and artifacts."
-msgstr ""
+msgstr "Verfolge Modellexperimente und Artefakte für maschinelles Lernen."
msgid "ProjectSettings|Transfer project"
msgstr "Projekt übertragen"
@@ -36244,11 +36347,8 @@ msgstr "Upstream-Projekt"
msgid "ProjectSettings|Used for every new merge request."
msgstr "Wird für jeden neuen Merge Request verwendet."
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr "Wird verwendet, um Jitsu mit der Clickhouse-Instanz zu verbinden."
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
-msgstr "Wird verwendet, um kurzlebige API-Zugriffstoken zu generieren."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
+msgstr "Wird verwendet, um Snowplow mit der Clickhouse-Instanz zu verbinden."
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
msgstr "Wird verwendet, um Dashboard-Daten aus der Cube-Instanz abzurufen."
@@ -36413,7 +36513,7 @@ msgid "ProjectView|Readme"
msgstr "Readme"
msgid "ProjectView|Wiki"
-msgstr ""
+msgstr "Wiki"
msgid "Projects"
msgstr "Projekte"
@@ -36730,6 +36830,9 @@ msgstr "Zum Gruppenlabel hochstufen"
msgid "Promote to objective"
msgstr "Zum Ziel hochstufen"
+msgid "Promote work item"
+msgstr "Workitem hochstufen"
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr "Nur Projektmeilensteine können hochgestuft werden."
@@ -36745,6 +36848,9 @@ msgstr "Stufte Ticket zu Epic hoch."
msgid "Promotes issue to incident"
msgstr "Stuft Ticket zu Vorfall herauf"
+msgid "Promotes work item to %{type}."
+msgstr "Befördert Workitem zu %{type}."
+
msgid "Promotion is not supported."
msgstr "Hochstufung wird nicht unterstützt."
@@ -36896,7 +37002,7 @@ msgid "Prompt users to upload SSH keys"
msgstr "Benutzer(innen) auffordern, SSH-Schlüssel hochzuladen"
msgid "Property 'dedicatedPod' of component '%s' is not yet supported"
-msgstr "Die Eigenschaft 'dedicatedPod' der Komponente '%s' wird noch nicht unterstützt"
+msgstr "Die Eigenschaft „dedicatedPod“ der Komponente „%s“ wird noch nicht unterstützt"
msgid "Protect"
msgstr "Schützen"
@@ -37128,7 +37234,7 @@ msgid "ProtectedEnvironments|Number of approvals must be between 1 and 5"
msgstr "Die Anzahl der Genehmigungen muss zwischen 1 und 5 liegen"
msgid "ProtectedEnvironments|Remove approval rule"
-msgstr ""
+msgstr "Entferne die Genehmigungsregel."
msgid "ProtectedEnvironments|Required approval count"
msgstr "Erforderliche Anzahl der Genehmigungen"
@@ -37302,7 +37408,7 @@ msgid "Public projects are an easy way to allow everyone to have read-only acces
msgstr "Öffentliche Projekte sind eine einfache Möglichkeit, jedermann Lesezugriff zu ermöglichen."
msgid "Public projects compute cost factor"
-msgstr ""
+msgstr "Rechen-Kostenfaktor für öffentliche Projekte"
msgid "Publish to status page"
msgstr "Auf Statusseite veröffentlichen"
@@ -37529,9 +37635,6 @@ msgstr "Projektqualität"
msgid "Query"
msgstr "Abfrage"
-msgid "Query cannot be processed"
-msgstr "Abfrage kann nicht verarbeitet werden"
-
msgid "Queued"
msgstr "In Warteschlange"
@@ -37602,7 +37705,10 @@ msgid "Read more about GitLab at %{link_to_promo}."
msgstr "Erfahre mehr über GitLab unter %{link_to_promo}."
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
-msgstr ""
+msgstr "Lies mehr über die %{changes_link_start}Änderungen%{link_end}, die %{vision_link_start}Vision%{link_end} und das %{design_link_start}Design%{link_end}."
+
+msgid "Read the documentation before applying changes."
+msgstr "Lies die Dokumentation, bevor du Änderungen vornimmst."
msgid "Read their documentation."
msgstr "Lies ihre Dokumentation."
@@ -37786,7 +37892,7 @@ msgstr "diese Funktion verwenden"
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr "Möchtest du diesen Schritt wirklich überspringen?"
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr "Pipelines, die gemeinsam genutzte GitLab-Runner verwenden, schlagen fehl
msgid "RegistrationVerification|Skip this for now"
msgstr "Vorerst überspringen"
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,23 +37919,11 @@ msgstr "Ja, überspringen"
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr "Du kannst dein Konto jederzeit zu einem späteren Zeitpunkt verifizieren."
-msgid "Registration|Checkout"
-msgstr "Checkout"
-
-msgid "Registration|Your GitLab group"
-msgstr "Deine GitLab-Gruppe"
-
-msgid "Registration|Your first project"
-msgstr "Dein erstes Projekt"
-
-msgid "Registration|Your profile"
-msgstr "Dein Profil"
-
msgid "Registry entry enqueued to be resynced"
-msgstr ""
+msgstr "Registry-Eintrag in der Warteschlange zur Neusynchronisierung"
msgid "Registry entry enqueued to be reverified"
-msgstr ""
+msgstr "Registry-Eintrag in der Warteschlange für die erneute Verifizierung"
msgid "Registry setup"
msgstr "Registry-Einrichtung"
@@ -37859,10 +37953,10 @@ msgid "Related issues"
msgstr "Zugehörige Tickets"
msgid "Related merge request %{link_to_merge_request} to merge %{link_to_merge_request_source_branch}"
-msgstr ""
+msgstr "Zugehöriger Merge Request %{link_to_merge_request} zum Merge von %{link_to_merge_request_source_branch}"
msgid "Related merge request %{link_to_merge_request} to merge %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
+msgstr "Zugehöriger Merge Request %{link_to_merge_request} zum Merge von %{link_to_merge_request_source_branch} in %{link_to_merge_request_target_branch}"
msgid "Related merge requests"
msgstr "Zugehörige Merge Requests"
@@ -38040,14 +38134,14 @@ msgstr "Zoom-Besprechung entfernen."
msgid "Remove access"
msgstr "Zugriff entfernen"
-msgid "Remove all or specific assignee(s)"
-msgstr "Alle oder bestimmte(n) Beauftragte(n) entfernen"
+msgid "Remove all or specific assignees"
+msgstr "Alle oder bestimmte Beauftragte entfernen"
msgid "Remove all or specific label(s)"
msgstr "Alle oder bestimmte Etiketts entfernen"
-msgid "Remove all or specific reviewer(s)"
-msgstr "Alle Prüfer(innen) oder bestimmte(n) Prüfer(in) entfernen"
+msgid "Remove all or specific reviewers"
+msgstr "Alle oder bestimmte Prüfer entfernen"
msgid "Remove approvers"
msgstr "Genehmigungsberechtigte entfernen"
@@ -38086,7 +38180,7 @@ msgid "Remove due date"
msgstr "Fälligkeitsdatum entfernen"
msgid "Remove epic reference"
-msgstr ""
+msgstr "Epic-Referenz entfernen"
msgid "Remove favicon"
msgstr "Favicon entfernen"
@@ -38113,7 +38207,7 @@ msgid "Remove icon"
msgstr "Icon entfernen"
msgid "Remove issue reference"
-msgstr ""
+msgstr "Ticket-Referenz entfernen"
msgid "Remove iteration"
msgstr "Iteration entfernen"
@@ -38128,7 +38222,7 @@ msgid "Remove link"
msgstr "Link entfernen"
msgid "Remove link with another issue"
-msgstr ""
+msgstr "Link zu einem anderen Ticket entfernen"
msgid "Remove list"
msgstr "Liste entfernen"
@@ -38143,7 +38237,7 @@ msgid "Remove member"
msgstr "Mitglied entfernen"
msgid "Remove merge request reference"
-msgstr ""
+msgstr "Merge-Request-Referenz entfernen"
msgid "Remove milestone"
msgstr "Meilenstein entfernen"
@@ -38221,7 +38315,7 @@ msgid "Removed group can not be restored!"
msgstr "Entfernte Gruppe kann nicht wiederhergestellt werden!"
msgid "Removed link with %{issue_ref}."
-msgstr ""
+msgstr "Link mit %{issue_ref} entfernt."
msgid "Removed parent epic %{epic_ref}."
msgstr "Ãœbergeordnetes Epic %{epic_ref} entfernt."
@@ -38269,7 +38363,7 @@ msgid "Removes an issue from an epic."
msgstr "Entfernt ein Ticket von einem Epic."
msgid "Removes link with %{issue_ref}."
-msgstr ""
+msgstr "Entfernt den Link mit %{issue_ref}."
msgid "Removes parent epic %{epic_ref}."
msgstr "Entfernt übergeordnetes Epic %{epic_ref}."
@@ -38299,7 +38393,7 @@ msgid "Render diagrams in your documents using PlantUML."
msgstr "Rendere Diagramme in deinen Dokumenten mit PlantUML."
msgid "Render diagrams in your documents using diagrams.net."
-msgstr ""
+msgstr "Rendere Diagramme in deinen Dokumenten mit diagrams.net."
msgid "Renew subscription"
msgstr "Abonnement verlängern"
@@ -38307,6 +38401,9 @@ msgstr "Abonnement verlängern"
msgid "Reopen"
msgstr "Wieder öffnen"
+msgid "Reopen %{issuableType}"
+msgstr "Wiedereröffnen von %{issuableType}"
+
msgid "Reopen %{issueType}"
msgstr "%{issueType} wieder eröffnen"
@@ -38331,6 +38428,9 @@ msgstr "Öffnet diese(s) %{quick_action_target} erneut"
msgid "Reopened this %{quick_action_target}."
msgstr "Öffnete diese(s) %{quick_action_target} erneut."
+msgid "Reopening %{issuableType}..."
+msgstr "Wiedereröffnen von %{issuableType}..."
+
msgid "Reopening..."
msgstr "Erneut öffnen..."
@@ -38349,6 +38449,9 @@ msgstr "Alle Etiketts ersetzen"
msgid "Replace audio"
msgstr "Audio ersetzen"
+msgid "Replace current template with filled in placeholders"
+msgstr "Ersetze die aktuelle Vorlage durch ausgefüllte Platzhalter"
+
msgid "Replace file"
msgstr "Datei ersetzen"
@@ -38748,8 +38851,8 @@ msgstr "Das Repository muss mindestens eine Datei enthalten."
msgid "Repository size is above the limit."
msgstr "Die Repository-Größe liegt über dem Limit."
-msgid "Repository size limit (MB)"
-msgstr "Maximale Größe des Repositorys (MB)"
+msgid "Repository size limit (MiB)"
+msgstr "Maximale Größe des Repositorys (MiB)"
msgid "Repository storage"
msgstr "Repository-Speicher"
@@ -38984,7 +39087,7 @@ msgid "Response didn't include `service_desk_address`"
msgstr "`service_desk_address` fehlte in Antwort"
msgid "Response generated by AI"
-msgstr ""
+msgstr "Antwort von KI generiert"
msgid "Response initiated"
msgstr "Reaktion eingeleitet"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] "Prüfer(in)"
msgstr[1] "%d Prüfer(innen)"
-msgid "Reviewer(s)"
-msgstr "Reviewer(s)"
-
msgid "Reviewers"
msgstr "Prüfer(innen)"
@@ -39173,12 +39273,21 @@ msgstr "Roadmap-Ansicht"
msgid "Role"
msgstr "Rolle"
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr "Zurücksetzen"
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr "Einrichtung von Benutzerobergrenzen für freie Benutzer(innen) in GitLab.com. Bearbeite diese Werte nicht, es sei denn, die Genehmigung wurde über %{link_start}dieses Ticket%{link_end} erteilt."
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr "Ruby"
@@ -39263,7 +39372,7 @@ msgstr[0] "%d ausgewählter Runner gelöscht"
msgstr[1] "%d ausgewählte Runner gelöscht"
msgid "Runners|%{count} runners in this group"
-msgstr ""
+msgstr "%{count} Runner in dieser Gruppe"
msgid "Runners|%{highlightStart}%{duration}%{highlightEnd} second"
msgid_plural "Runners|%{highlightStart}%{duration}%{highlightEnd} seconds"
@@ -39271,7 +39380,7 @@ msgstr[0] "%{highlightStart}%{duration}%{highlightEnd} Sekunde"
msgstr[1] "%{highlightStart}%{duration}%{highlightEnd} Sekunden"
msgid "Runners|%{linkStart}Create a new runner%{linkEnd} to get started."
-msgstr ""
+msgstr "%{linkStart}Erstelle einen neuen Runner%{linkEnd}, um zu beginnen."
msgid "Runners|%{link_start}These runners%{link_end} are available to all groups and projects."
msgstr "%{link_start}Diese Runner%{link_end} stehen allen Gruppen und Projekten zur Verfügung."
@@ -39331,6 +39440,9 @@ msgstr "Amazon Linux 2 Docker HV mit manueller Skalierung und optionaler Zeitpla
msgid "Runners|An error has occurred fetching instructions"
msgstr "Beim Abrufen der Anleitung ist ein Fehler aufgetreten"
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr "Beim Erstellen des Runners ist ein Fehler aufgetreten. Bitte versuche es erneut."
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr "Beim Löschen ist ein Fehler aufgetreten. Einige Runners wurden möglicherweise nicht gelöscht."
@@ -39341,7 +39453,7 @@ msgid "Runners|An upgrade is recommended for this runner"
msgstr "Für diesen Runner ist ein Upgrade empfohlen"
msgid "Runners|Arch/Platform"
-msgstr ""
+msgstr "Arch/Plattform"
msgid "Runners|Architecture"
msgstr "Architektur"
@@ -39428,7 +39540,7 @@ msgid "Runners|Create an instance runner to generate a command that registers th
msgstr "Erstelle einen Instanz-Runner, um einen Befehl zu generieren, der den Runner mit allen seinen Konfigurationen registriert."
msgid "Runners|Create runner"
-msgstr ""
+msgstr "Runner erstellen"
msgid "Runners|Created %{timeAgo}"
msgstr "Erstellt %{timeAgo}"
@@ -39436,11 +39548,17 @@ msgstr "Erstellt %{timeAgo}"
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr "Erstellt %{timeAgo} von %{avatar}"
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] "%d Runner löschen"
msgstr[1] "%d Runner löschen"
+msgid "Runners|Delete %{count} runners?"
+msgstr "%{count} Runner löschen?"
+
msgid "Runners|Delete runner"
msgstr "Runner löschen"
@@ -39501,9 +39619,6 @@ msgstr "Fetch GitLab Runner Release-Daten von GitLab.com"
msgid "Runners|Filter projects"
msgstr "Projekte filtern"
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr "Einstieg mit Runners"
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] "%d Runner dauerhaft löschen"
msgstr[1] "%d Runner dauerhaft löschen"
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] "Runner dauerhaft löschen"
+msgstr[1] "%d Runner dauerhaft löschen"
+
msgid "Runners|Platform"
msgstr "Plattform"
@@ -39828,10 +39948,10 @@ msgid "Runners|Runners are either:"
msgstr "Runner sind entweder:"
msgid "Runners|Runners are grouped when they have the same authentication token. This happens when you re-use a runner configuration in more than one runner manager. %{linkStart}How does this work?%{linkEnd}"
-msgstr ""
+msgstr "Runner werden gruppiert, wenn sie dasselbe Authentifizierungstoken haben. Dies geschieht, wenn du eine Runner-Konfiguration in mehr als einem Runner-Manager wiederverwendest. %{linkStart}Wie funktioniert das?%{linkEnd}"
msgid "Runners|Runners are the agents that run your CI/CD jobs."
-msgstr ""
+msgstr "Runner sind die Agenten, die deine CI/CD Jobs ausführen."
msgid "Runners|Runners performance"
msgstr "Runner Leistung"
@@ -39903,7 +40023,7 @@ msgid "Runners|Step 3 (optional)"
msgstr "Schritt 3 (optional)"
msgid "Runners|Still using registration tokens?"
-msgstr ""
+msgstr "Benutzt Du immer noch Registrierungstoken?"
msgid "Runners|Stop the runner from accepting new jobs."
msgstr "Halte den Runner davon ab, neue Jobs anzunehmen."
@@ -39912,7 +40032,7 @@ msgid "Runners|Support for registration tokens is deprecated"
msgstr "Unterstützung für Registrierungs-Token ist veraltet"
msgid "Runners|System ID"
-msgstr ""
+msgstr "System-ID"
msgid "Runners|Tags"
msgstr "Schlagworte"
@@ -39930,10 +40050,12 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr "Das Projekt, die Gruppe oder die Instanz, in der der Runner registriert wurde. Runner der Instanz sind immer im Besitz des/der Administrator(in)."
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 "Der Runner wird dauerhaft gelöscht und wird für Projekte oder Gruppen in der Instanz nicht mehr verfügbar sein. Willst du wirklich fortfahren?"
+msgid_plural "Runners|%d 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] "Der Runner wird dauerhaft gelöscht und wird für Projekte oder Gruppen in der Instanz nicht mehr verfügbar sein. Möchtest du wirklich fortfahren?"
+msgstr[1] "%d Runner werden dauerhaft gelöscht und werden für Projekte oder Gruppen in der Instanz nicht mehr verfügbar sein. Möchtest du wirklich fortfahren?"
msgid "Runners|The unique ID for each runner that uses this configuration."
-msgstr ""
+msgstr "Die eindeutige ID für jeden Runner, der diese Konfiguration verwendet."
msgid "Runners|These runners are assigned to this project."
msgstr "Diese Runner sind diesem Projekt zugeordnet."
@@ -39977,10 +40099,10 @@ msgid "Runners|To install Runner in a container follow the instructions describe
msgstr "Um Runner in einem Container zu installieren, befolge die Anweisungen in der GitLab-Dokumentation"
msgid "Runners|To register new runners, contact your administrator."
-msgstr ""
+msgstr "Kontaktiere Deinen Administrator, um neue Runner zu registrieren."
msgid "Runners|To register them, go to the %{link_start}group's Runners page%{link_end}."
-msgstr "Um sie zu registrieren, gehe auf %{link_end}die Seite der Runner dieser Gruppe%{link_start}."
+msgstr "Um sie zu registrieren, gehe auf %{link_start}die Seite der Runner dieser Gruppe%{link_end}."
msgid "Runners|To view the runner, go to %{runnerListName}."
msgstr "Um den Runner anzuzeigen, gehe zu %{runnerListName}."
@@ -40249,30 +40371,54 @@ msgstr "Speichern"
msgid "Saving project."
msgstr "Projekt wird gespeichert."
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
-msgstr "%{period} %{days} um %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr "Zeitzone von %{hostname}"
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
-msgstr ""
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
+msgstr "%{period} %{days} um %{time} %{timezoneLabel} %{timezone}"
+
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
+msgstr "%{rules} Aktionen für %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
-msgstr ""
+msgstr "%{rules} jedes Mal, wenn eine Pipeline für %{scopes} %{branches} %{agents} %{namespaces} läuft"
msgid "ScanExecutionPolicy|Add condition"
msgstr "Bedingung hinzufügen"
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr "Bedingungen"
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr "Wenn das Feld leer ist, wird der Runner automatisch ausgewählt"
-msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
+msgid "ScanExecutionPolicy|Key"
msgstr ""
-msgid "ScanExecutionPolicy|Run a %{scan} scan with %{dastProfiles} on runner that %{tags}"
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr "Zeitzone des Kubernetes-Agenten"
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
msgstr ""
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
+msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
+msgstr "Führe einen %{scan}-Scan auf dem Runner mit %{tags} aus."
+
+msgid "ScanExecutionPolicy|Run a %{scan} scan with %{dastProfiles} on runner that %{tags}"
+msgstr "Führe einen %{scan}-Scan mit %{dastProfiles} auf dem Runner mit %{tags} aus."
+
msgid "ScanExecutionPolicy|Scanner profile"
msgstr "Scanner Profil"
@@ -40280,9 +40426,12 @@ msgid "ScanExecutionPolicy|Schedule rule component"
msgstr "Regelkomponente planen"
msgid "ScanExecutionPolicy|Schedules:"
-msgstr ""
+msgstr "Zeitpläne:"
msgid "ScanExecutionPolicy|Select a scanner"
+msgstr "Wähle einen Scanner"
+
+msgid "ScanExecutionPolicy|Select a variable"
msgstr ""
msgid "ScanExecutionPolicy|Select agent"
@@ -40300,6 +40449,9 @@ msgstr "Scanner-Profil auswählen"
msgid "ScanExecutionPolicy|Select site profile"
msgstr "Site-Profil auswählen"
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr "Wähle die Zeitzone"
+
msgid "ScanExecutionPolicy|Site profile"
msgstr "Seitenprofil"
@@ -40307,6 +40459,9 @@ msgid "ScanExecutionPolicy|Tags"
msgstr "Tags"
msgid "ScanExecutionPolicy|Triggers:"
+msgstr "Trigger:"
+
+msgid "ScanExecutionPolicy|Value"
msgstr ""
msgid "ScanExecutionPolicy|agent"
@@ -40321,6 +40476,12 @@ msgstr "hat ein bestimmtes Tag"
msgid "ScanExecutionPolicy|in namespaces"
msgstr "in Namensräumen"
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr "auf %{hostname}"
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr "auf dem Kubernetes Agent-Pod"
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr "Scannerprofil %{scannerProfile} und Seitenprofil %{siteProfile}"
@@ -40340,19 +40501,22 @@ msgid "ScanResultPolicy|Choose criteria type"
msgstr "Wähle den Kriterientyp aus"
msgid "ScanResultPolicy|Clear all"
+msgstr "Alle leeren"
+
+msgid "ScanResultPolicy|Customized CI Variables"
msgstr ""
msgid "ScanResultPolicy|Except"
-msgstr ""
+msgstr "Außer"
msgid "ScanResultPolicy|License is:"
-msgstr ""
+msgstr "Die Lizenz lautet:"
msgid "ScanResultPolicy|License scanning allows only one criteria: Status"
msgstr "Lizenzscanning erlaubt nur ein Kriterium: Status"
msgid "ScanResultPolicy|Matching"
-msgstr ""
+msgstr "Ãœbereinstimmung"
msgid "ScanResultPolicy|Maximum number of severity-criteria is one"
msgstr "Die maximale Anzahl an Schweregradkriterien lautet eins"
@@ -40376,13 +40540,13 @@ msgid "ScanResultPolicy|Select a scan type before adding criteria"
msgstr "Wähle einen Scan-Typ aus, bevor du Kriterien hinzufügst"
msgid "ScanResultPolicy|Select all"
-msgstr ""
+msgstr "Alle auswählen"
msgid "ScanResultPolicy|Select license types"
-msgstr ""
+msgstr "Lizenztypen auswählen"
msgid "ScanResultPolicy|Select licenses"
-msgstr ""
+msgstr "Lizenzen auswählen"
msgid "ScanResultPolicy|Severity is:"
msgstr "Der Schweregrad lautet:"
@@ -40390,11 +40554,14 @@ msgstr "Der Schweregrad lautet:"
msgid "ScanResultPolicy|Status is:"
msgstr "Der Status lautet:"
+msgid "ScanResultPolicy|Unknown"
+msgstr "Unbekannt"
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr "Wenn %{scanType}-%{scanners} für %{branches} ausgeführt wird und %{vulnerabilitiesNumber} %{boldDescription} der folgenden Kriterien findet:"
msgid "ScanResultPolicy|When %{scanType} in an open merge request targeting the %{branches} and the licenses match all of the following criteria:"
-msgstr ""
+msgstr "Wenn %{scanType} in einem offenen Merge Request auf die %{branches} zielt und die Lizenzen alle folgenden Kriterien erfüllen:"
msgid "ScanResultPolicy|When %{scanners} find scanner specified conditions in an open merge request targeting the %{branches} and match %{boldDescription} of the following criteria"
msgstr "Wenn %{scanners} scanner-spezifische Bedingungen in einem offenen Merge Request zu den %{branches} finden und %{boldDescription} der folgenden Kriterien übereinstimmen"
@@ -40832,8 +40999,8 @@ msgstr "Abdeckungsprüfungen"
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr "Erfahre mehr über Abdeckungsprüfungen"
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
-msgstr "Erfordert die Genehmigung für die Verringerung der Testabdeckung. %{linkStart}Mehr erfahren.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr "%{featureName} Merge-Request-Erstellungs-Mutation fehlgeschlagen"
@@ -40856,9 +41023,6 @@ msgstr "Verstoß- und Angriffssimulation (BAS)"
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr "Eine Verstoß- und Angriffssimulation ist eine Inkubationsfunktion, die vorhandene Sicherheitstests durch Simulation von gegnerischen Aktivitäten erweitert."
-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 "Standardmäßig werden alle Analysatoren angewendet, um alle Sprachen in deinem Projekt abzudecken, und werden nur ausgeführt, wenn die Sprache in dem Merge Request erkannt wird."
-
msgid "SecurityConfiguration|Configuration guide"
msgstr "Konfigurationsanleitung"
@@ -40943,9 +41107,6 @@ msgstr "Aktiviere schnell alle kontinuierlichen Test- und Konformitäts-Tools, i
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr "Laufzeit-Sicherheitsmetriken für Anwendungsumgebungen"
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr "SAST-Analysatoren"
-
msgid "SecurityConfiguration|SAST configuration"
msgstr "SAST-Konfiguration"
@@ -40983,7 +41144,7 @@ msgid "SecurityOrchestration| and "
msgstr "und "
msgid "SecurityOrchestration| and all the following apply:"
-msgstr ""
+msgstr "und alle folgenden zutreffen:"
msgid "SecurityOrchestration| or "
msgstr "oder "
@@ -41001,7 +41162,7 @@ msgid "SecurityOrchestration|%{branches} branch"
msgstr "%{branches} Branch"
msgid "SecurityOrchestration|%{cadence} on the %{branches}"
-msgstr "SicherheitsOrchestrierung|%{cadence} auf den %{branches}"
+msgstr "%{cadence} in den %{branches}"
msgid "SecurityOrchestration|%{licenses} and %{lastLicense}"
msgstr "%{licenses} und %{lastLicense}"
@@ -41010,7 +41171,7 @@ msgid "SecurityOrchestration|%{scanners}"
msgstr "%{scanners}"
msgid "SecurityOrchestration|%{state} and %{statuses}"
-msgstr ""
+msgstr "%{state} und %{statuses}"
msgid "SecurityOrchestration|, and %{count} more"
msgstr ", und %{count} mehr"
@@ -41055,11 +41216,14 @@ msgid "SecurityOrchestration|An error occurred while fetching the scan result po
msgstr "Beim Abrufen der Scan-Ergebnisrichtlinien ist ein Fehler aufgetreten."
msgid "SecurityOrchestration|And scans to be performed:"
-msgstr "SecurityOrchestration|Und durchzuführende Scans:"
+msgstr "Und durchzuführende Scans:"
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr "Möchtest du diese Richtlinie wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden."
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr "Branchtypen stimmen mit keinen bestehenden Branches überein."
+
msgid "SecurityOrchestration|Choose a project"
msgstr "Wähle ein Projekt"
@@ -41160,7 +41324,7 @@ msgid "SecurityOrchestration|License Scan"
msgstr "Lizenz-Scan"
msgid "SecurityOrchestration|Logic error"
-msgstr "SecurityOrchestration|Logikfehler"
+msgstr "Logikfehler"
msgid "SecurityOrchestration|New policy"
msgstr "Neue Richtlinie"
@@ -41183,6 +41347,9 @@ msgstr "Keine Regeln definiert – Richtlinie wird nicht ausgeführt."
msgid "SecurityOrchestration|No tags available"
msgstr "Keine Tags verfügbar"
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr "Nicht vorhandene DAST-Profile wurden in der Richtlinien-Yaml erkannt. Infolgedessen wurde der Regelmodus deaktiviert. Um den Regelmodus zu aktivieren, entferne die nicht vorhandenen Profile aus der Richtlinien-Yaml."
@@ -41225,8 +41392,8 @@ msgstr "Richtlinientyp"
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr "Erfordere %{approvals} %{plural} von %{approvers}, wenn einer der folgenden Fälle eintritt:"
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
-msgstr "SecurityOrchestration|Erforderliche Genehmigungen überschreiten die Anzahl berechtigter Genehmiger"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
+msgstr "Erforderliche Genehmigungen übersteigen die Anzahl der berechtigten Genehmiger(innen)."
msgid "SecurityOrchestration|Roles"
msgstr "Rollen"
@@ -41241,12 +41408,12 @@ msgid "SecurityOrchestration|Rules"
msgstr "Regeln"
msgid "SecurityOrchestration|Run %{scannerStart}%{scanner}%{scannerEnd}"
-msgstr "SecurityOrchestration|Führe %{scannerStart}%{scanner}%{scannerEnd} aus"
+msgstr "Führe %{scannerStart}%{scanner}%{scannerEnd} aus"
msgid "SecurityOrchestration|Run %{scannerStart}%{scanner}%{scannerEnd} on runners with tag:"
msgid_plural "SecurityOrchestration|Run %{scannerStart}%{scanner}%{scannerEnd} on runners with the tags:"
-msgstr[0] "SecurityOrchestration|Führen Sie %{scannerStart}%{scanner}%{scannerEnd} auf Läufern mit dem Tags aus:"
-msgstr[1] "SecurityOrchestration|Run %{scannerStart}%{scanner}%{scannerEnd} auf Runnern mit den Tags:"
+msgstr[0] "Führe %{scannerStart}%{scanner}%{scannerEnd} auf Runnern mit dem folgenden Tag aus:"
+msgstr[1] "Führe %{scannerStart}%{scanner}%{scannerEnd} auf Runnern mit den folgenden Tags aus:"
msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
msgstr "Führe einen DAST-Scan mit Scan-Profil A und Site-Profil A aus, wenn eine Pipeline gegen den Hauptbranch ausgeführt wird."
@@ -41312,7 +41479,7 @@ msgid "SecurityOrchestration|Select users"
msgstr "Benutzer(innen) auswählen"
msgid "SecurityOrchestration|Severity is %{severity}."
-msgstr ""
+msgstr "Schweregrad ist %{severity}."
msgid "SecurityOrchestration|Something went wrong, unable to fetch policies"
msgstr "Etwas ist schiefgelaufen. Richtlinien können nicht abgerufen werden"
@@ -41368,6 +41535,9 @@ msgstr "Dieses Projekt"
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 "In dieser Ansicht werden nur Scan-Ergebnisse für den Agenten %{agent} angezeigt. Du kannst die Scanergebnisse für alle Agenten auf der Registerkarte %{linkStart}Operationale Sicherheitslücken des Sicherheitsanfälligkeitsberichts%{linkEnd} anzeigen."
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr "Die Zeitzone ist ungültig."
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr "Um deine Suche zu erweitern, ändere die Filter oben oder wähle ein anderes Sicherheitsrichtlinienprojekt aus."
@@ -41390,13 +41560,13 @@ msgid "SecurityOrchestration|View policy project"
msgstr "Richtlinienprojekt anzeigen"
msgid "SecurityOrchestration|Vulnerabilities are %{vulnerabilityStates}."
-msgstr ""
+msgstr "Sicherheitslücken sind %{vulnerabilityStates}."
msgid "SecurityOrchestration|When %{scanners} %{vulnerabilitiesAllowed} %{vulnerability} in an open merge request targeting %{branches}%{criteriaApply}"
-msgstr ""
+msgstr "Wenn %{scanners} %{vulnerabilitiesAllowed} %{vulnerability} in einem offenen Merge Request findet, die auf %{branches} zielt und %{criteriaApply}"
msgid "SecurityOrchestration|When license scanner finds any license %{matching} %{licenses}%{detection} in an open merge request targeting %{branches}."
-msgstr ""
+msgstr "Wenn der Lizenzscanner in einem offenen Merge Request eine Lizenz findet, die %{matching} %{licenses}%{detection} und auf %{branches} zielt."
msgid "SecurityOrchestration|YAML"
msgstr "YAML"
@@ -41414,7 +41584,7 @@ msgid "SecurityOrchestration|any"
msgstr "beliebig"
msgid "SecurityOrchestration|any security scanner finds"
-msgstr ""
+msgstr "ein Sicherheitsscanner findet"
msgid "SecurityOrchestration|branch"
msgstr "Branch"
@@ -41423,7 +41593,7 @@ msgid "SecurityOrchestration|branches"
msgstr "Branches"
msgid "SecurityOrchestration|by the agent named %{agents} %{cadence}"
-msgstr "SecurityOrchestration|vom Agenten namens %{agents} %{cadence}"
+msgstr "vom Agenten namens %{agents} %{cadence}"
msgid "SecurityOrchestration|group level branch input"
msgstr "Branch-Input auf Gruppenebene"
@@ -41435,7 +41605,7 @@ msgid "SecurityOrchestration|more than %{allowed}"
msgstr "mehr als %{allowed}"
msgid "SecurityOrchestration|on every pipeline on the %{branches}"
-msgstr "SecurityOrchestration|auf jeder Pipeline auf den %{branches}"
+msgstr "in jeder Pipeline in den %{branches}"
msgid "SecurityOrchestration|or from:"
msgstr "oder von:"
@@ -41600,7 +41770,7 @@ msgid "SecurityReports|Failed to get security report information. Please reload
msgstr "Informationen zum Sicherheitsbericht konnten nicht abgerufen werden. Bitte lade die Seite neu oder versuche es später erneut."
msgid "SecurityReports|Failed updating vulnerabilities with the following IDs: %{ids}"
-msgstr ""
+msgstr "Die Aktualisierung von Sicherheitslücken mit den folgenden IDs ist fehlgeschlagen: %{ids}"
msgid "SecurityReports|Has issue"
msgstr "Hat Issue"
@@ -41761,6 +41931,9 @@ msgstr "Der Sicherheitsbericht für diese Pipeline ist %{helpPageLinkStart}abgel
msgid "SecurityReports|There was an error adding the comment."
msgstr "Fehler beim Hinzufügen des Kommentars"
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr "Beim Erstellen eines Jira-Tickets für dieses Ergebnis ist ein Fehler aufgetreten. Bitte versuche es erneut."
+
msgid "SecurityReports|There was an error creating the issue."
msgstr "Fehler beim Erstellen des Tickets"
@@ -41941,8 +42114,8 @@ msgstr "Wähle eine Iteration aus"
msgid "Select assignee"
msgstr "Beauftragte(n) auswählen"
-msgid "Select assignee(s)"
-msgstr "Beauftragte(n) auswählen"
+msgid "Select assignees"
+msgstr "Beauftragte auswählen"
msgid "Select branch"
msgstr "Branch auswählen"
@@ -42004,11 +42177,17 @@ msgstr "Wähle das zu erstellende Projekt aus %{type}"
msgid "Select projects"
msgstr "Projekte auswählen"
+msgid "Select protected branch"
+msgstr "Geschützten Branch auswählen"
+
+msgid "Select protected branches"
+msgstr "Geschützte Branches auswählen"
+
msgid "Select report"
msgstr "Bericht auswählen"
-msgid "Select reviewer(s)"
-msgstr "Prüfer(innen) auswählen"
+msgid "Select reviewers"
+msgstr "Prüfer auswählen"
msgid "Select severity (optional)"
msgstr "Schweregrad auswählen (optional)"
@@ -42154,6 +42333,9 @@ msgstr "Dienstkonto"
msgid "Service Account Key"
msgstr "Dienstkontoschlüssel"
+msgid "Service Accounts"
+msgstr "Dienstkonten"
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr "Dienstkontenschlüssel autorisieren GitLab zur Bereitstellung deines Google Cloud-Projekts"
@@ -42184,14 +42366,23 @@ msgstr "Der/die Benutzer(in) ist nicht berechtigt, ein Dienstkonto in diesem Nam
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr "Der/die Benutzer(in) ist nicht berechtigt, ein Dienstkonto zu erstellen."
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
-msgstr "ServiceDesk|Die benutzerdefinierte E-Mail-Adresse konnte nicht verifiziert werden."
+msgstr "Die benutzerdefinierte E-Mail-Adresse konnte nicht verifiziert werden."
msgid "ServiceDesk|Custom email address has already been verified."
-msgstr "ServiceDesk|Die benutzerdefinierte E-Mail-Adresse wurde bereits verifiziert."
+msgstr "Die benutzerdefinierte E-Mail-Adresse wurde bereits verifiziert."
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
-msgstr "ServiceDesk|Die Überprüfung der benutzerdefinierten E-Mail-Adresse wurde bereits bearbeitet und ist fehlgeschlagen."
+msgstr "Die Überprüfung der benutzerdefinierten E-Mail-Adresse wurde bereits durchgeführt und ist fehlgeschlagen."
+
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
msgid "ServiceDesk|Enable Service Desk"
msgstr "Service-Desk aktivieren"
@@ -42202,6 +42393,9 @@ msgstr "Wenn du Hilfe bei der Einrichtung des Service-Desks für deine Instanz b
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr "Tickets, die aus Service-Desk-E-Mails erstellt wurden, werden hier angezeigt. Jeder Kommentar wird Teil der E-Mail-Konversation."
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr "Service-Desk ist nicht aktiviert"
@@ -42209,10 +42403,10 @@ msgid "ServiceDesk|Service Desk is not supported"
msgstr "Service-Desk wird nicht unterstützt"
msgid "ServiceDesk|Service Desk setting missing"
-msgstr "ServiceDesk|Service Desk Einstellung fehlt"
+msgstr "Service-Desk-Einstellung fehlt"
msgid "ServiceDesk|Service Desk setting or verification object missing"
-msgstr "Service Desk|Einstellung oder Verifizierungsobjekt fehlt"
+msgstr "Einstellung oder Verifizierungsobjekt fehlt"
msgid "ServiceDesk|To enable Service Desk on this instance, an instance administrator must first set up incoming email."
msgstr "Um den Service-Desk auf dieser Instanz zu aktivieren, muss ein(e) Instanzadministrator(in) zunächst eingehende E-Mails einrichten."
@@ -42221,7 +42415,7 @@ msgid "ServiceDesk|Use Service Desk to connect with your users and offer custome
msgstr "Verwende den Service-Desk, um dich mit deinen Benutzer(inne)n zu verbinden und Kund(inn)ensupport per E-Mail direkt in GitLab anzubieten"
msgid "ServiceDesk|User cannot manage project."
-msgstr "ServiceDesk|Der Benutzer darf das Projekt nicht verwalten."
+msgstr "Der/die Benutzer(in) darf das Projekt nicht verwalten."
msgid "ServiceDesk|Your users can send emails to this address:"
msgstr "Deine Benutzer können E-Mails an diese Adresse senden:"
@@ -42229,6 +42423,12 @@ msgstr "Deine Benutzer können E-Mails an diese Adresse senden:"
msgid "ServicePing|Service ping is off"
msgstr "Service Ping ist ausgeschaltet"
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr "Bitte eine/-n Administrator(in), %{docLinkStart}Service Ping%{docLinkEnd} zu aktivieren, um Analysen auf Instanz-Ebene anzuzeigen."
@@ -42532,10 +42732,19 @@ msgid "Shared runners help link"
msgstr "Hilfelink zu gemeinsam genutzten Runnern"
msgid "SharedRunnersMinutesSettings|Reset compute usage"
-msgstr ""
+msgstr "Rechennutzung zurücksetzen"
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
-msgstr ""
+msgstr "Wenn du die Rechennutzung für diesen Namensraum zurücksetzt, ändert sich die Rechennutzung auf Null."
+
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr "Grenzwert für Git SSH-Vorgänge"
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr "Begrenzt die Anzahl der Git-Vorgänge, die ein(e) Benutzer(in) pro Minute und pro Repository durchführen kann."
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr "Maximale Anzahl an Git-Vorgängen pro Minute"
msgid "Shimo|Go to Shimo Workspace"
msgstr "Gehe zu Shimo Workspace"
@@ -42598,7 +42807,7 @@ msgid "Show archived projects only"
msgstr "Nur archivierte Projekte anzeigen"
msgid "Show changes"
-msgstr ""
+msgstr "Änderungen anzeigen"
msgid "Show closed epics"
msgstr "Geschlossene Epics anzeigen"
@@ -42621,7 +42830,7 @@ msgstr "Zeige vollständiges Rohprotokoll"
msgid "Show details"
msgstr "Details anzeigen"
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr "Dateibrowser anzeigen"
msgid "Show file contents"
msgstr "Dateiinhalt anzeigen"
-msgid "Show filters"
-msgstr "Filter anzeigen"
-
msgid "Show full blame"
msgstr "Blame vollständig anzeigen"
@@ -42941,8 +43147,8 @@ msgstr "Größe"
msgid "Size Limits"
msgstr "Größenlimit"
-msgid "Size limit per repository (MB)"
-msgstr "Größenbegrenzung pro Repository (MB)"
+msgid "Size limit per repository (MiB)"
+msgstr "Größenlimit pro Repository (MiB)"
msgid "Skip to main content"
msgstr "Zum Hauptinhalt springen"
@@ -43166,6 +43372,9 @@ msgstr "Dateiname (z. B. test.rb)"
msgid "Snippets|Files"
msgstr "Dateien"
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr "Code-Schnipsel sind auf %{total} Dateien beschränkt."
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr "Code-Schnipsel dürfen keine leeren Dateien enthalten. Stelle sicher, dass alle Dateien Inhalt haben, oder lösche sie."
@@ -43212,7 +43421,7 @@ msgid "Someone edited this merge request at the same time you did. Please refres
msgstr "Jemand hat diese Merge Request zur gleichen Zeit bearbeitet. Bitte aktualisiere die Seite, um die Änderungen zu sehen."
msgid "Someone edited this milestone at the same time you did. Please refresh the page to see changes."
-msgstr ""
+msgstr "Jemand hat diesen Meilenstein zur gleichen Zeit bearbeitet wie du. Bitte aktualisiere die Seite, um die Änderungen anzuzeigen."
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 "Jemand hat diesen Testfall zur gleichen Zeit bearbeitet wie du. Die Beschreibung wurde aktualisiert und du musst deine Änderungen erneut vornehmen."
@@ -43620,7 +43829,7 @@ msgid "Source IP"
msgstr "Quell-IP"
msgid "Source Project"
-msgstr ""
+msgstr "Quellprojekt"
msgid "Source branch"
msgstr "Quellbranch"
@@ -43736,6 +43945,9 @@ msgstr "Spam-Protokoll erfolgreich als Ham übermittelt."
msgid "Specific branches"
msgstr "Spezifische Branches"
+msgid "Specific protected branches"
+msgstr "Bestimmte geschützte Branches."
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr "Angegebene URL kann nicht verwendet werden: „%{reason}“"
@@ -43758,7 +43970,7 @@ msgid "Spent at can't be a future date and time."
msgstr "Verbracht am darf kein zukünftiges Datum und keine zukünftige Uhrzeit sein."
msgid "Split cell"
-msgstr ""
+msgstr "Zelle teilen"
msgid "Squash commit message"
msgstr "Commit-Nachricht squashen"
@@ -43874,9 +44086,6 @@ msgstr "Internen Thread starten"
msgid "Start merge train"
msgstr "Merge-Zug starten"
-msgid "Start merge train when pipeline succeeds"
-msgstr "Merge-Zug starten, wenn die Pipeline erfolgreich abgeschlossen wurde"
-
msgid "Start merge train..."
msgstr "Starte Merge-Zug…"
@@ -44078,9 +44287,6 @@ msgstr "Konfigurationsdokumentation"
msgid "StatusPage|your status page frontend."
msgstr "Dein Statusseiten-Frontend"
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr "Bleibe über die Leistung und den Zustand deiner Umgebung auf dem Laufenden, indem du Prometheus für die Überwachung deiner Bereitstellungen konfigurierst."
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr "Schritt %{currentStep} von %{stepCount}"
@@ -44129,8 +44335,8 @@ msgstr "Unbekannt"
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr "Speichere deine Dateien, plane deine Arbeit, arbeite gemeinsam an Code und mehr."
-msgid "Strikethrough"
-msgstr "Durchgestrichen"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
+msgstr ""
msgid "Strikethrough text"
msgstr "Durchgestrichener Text"
@@ -44412,7 +44618,7 @@ msgid "Successfully removed email."
msgstr "E-Mail erfolgreich entfernt."
msgid "Successfully reset compute usage for namespace."
-msgstr ""
+msgstr "Nutzung des Rechenkontingents für Namensraum erfolgreich zurückgesetzt."
msgid "Successfully scheduled a pipeline to run. Go to the %{pipelines_link_start}Pipelines page%{pipelines_link_end} for details."
msgstr "Eine Pipeline-Ausführung wurde erfolgreich geplant. Weitere Informationen findest du auf der %{pipelines_link_start}Seite „Pipelines“%{pipelines_link_end}."
@@ -44439,7 +44645,7 @@ msgid "Suggest code changes which can be immediately applied in one click. Try i
msgstr "Schlage Codeänderungen vor, die mit einem Klick angewendet werden können. Probiere es aus!"
msgid "Suggest test cases"
-msgstr ""
+msgstr "Testfälle vorschlagen"
msgid "Suggested change"
msgstr "Vorgeschlagene Änderung"
@@ -44564,6 +44770,12 @@ msgstr "Zusammenfassung / Notiz"
msgid "Summary comment (optional)"
msgstr "Kommentar hinzufügen (optional)"
+msgid "Summary generated by AI"
+msgstr "Zusammenfassung generiert von KI"
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr "Die Zusammenfassung wird mit dem nächsten Push zu diesem Merge Request erstellt und erscheint hier."
+
msgid "Sun"
msgstr "So"
@@ -44791,11 +45003,11 @@ msgstr "Zu Branch/Tag wechseln"
msgid "Switch to GitLab Next"
msgstr "Zu GitLab Next wechseln"
-msgid "Switch to Markdown"
-msgstr "Zu Markdown wechseln"
+msgid "Switch to plain text editing"
+msgstr "Zur Plain-Text-Bearbeitung wechseln"
-msgid "Switch to rich text"
-msgstr "Zu Rich Text wechseln"
+msgid "Switch to rich text editing"
+msgstr "Zur Rich-Text-Bearbeitung wechseln"
msgid "Switch to the source to copy the file contents"
msgstr "Wechsle zur Quelle, um den Dateiinhalt zu kopieren."
@@ -44876,7 +45088,7 @@ msgid "System started"
msgstr "System gestartet"
msgid "TXT"
-msgstr ""
+msgstr "TXT"
msgid "Table of Contents"
msgstr "Inhaltsverzeichnis"
@@ -45058,8 +45270,8 @@ msgstr "geschützt"
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr "Wirf einen Blick in die Dokumentation, um alle Funktionen von GitLab kennenzulernen."
-msgid "TanukiBot|Ask GitLab Chat"
-msgstr "Frage den GitLab-Chat"
+msgid "TanukiBot|Ask GitLab Duo"
+msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
msgstr "Stelle eine Frage zu GitLab"
@@ -45075,8 +45287,8 @@ msgstr "Feedback geben"
msgid "TanukiBot|Source"
msgid_plural "TanukiBot|Sources"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Quelle"
+msgstr[1] "Quellen"
msgid "TanukiBot|There was an error communicating with GitLab Chat. Please try again later."
msgstr "Bei der Kommunikation mit dem GitLab-Chat ist ein Fehler aufgetreten. Bitte versuche es später erneut."
@@ -45144,6 +45356,21 @@ msgstr "TeamCity-CI auslösen, nachdem ein Merge Request erstellt oder aktualisi
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr "TeamCity-CI nach jedem Push an das Repository auslösen, außer bei Löschen eines Branches"
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr "Lass dieses Feld leer, um dein aktuelles Token zu verwenden."
+
+msgid "TelegramIntegration|New token"
+msgstr "Neues Token"
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr "Sende Benachrichtigungen über Projektereignisse zu Telegram."
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr "Sende Benachrichtigungen über Projektereignisse zu Telegram. %{docs_link}"
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr "Eindeutiges Authentifizierungstoken."
+
msgid "Telephone number"
msgstr "Telefonnummer"
@@ -45316,9 +45543,6 @@ msgstr "Gemeldete Ressourcenänderungen: %{addNum} hinzufügen, %{changeNum} än
msgid "Terraform|Terraform init command"
msgstr "Terraform init-Befehl"
-msgid "Terraform|Terraform reports"
-msgstr "Terraform-Berichte"
-
msgid "Terraform|Terraform states"
msgstr "Terraform-Status"
@@ -45372,7 +45596,7 @@ msgstr[0] "Testabdeckung: %d Aufruf"
msgstr[1] "Testabdeckung: %d Aufrufe"
msgid "Test generated by AI"
-msgstr ""
+msgstr "Von KI generierter Test"
msgid "Test settings"
msgstr "Testeinstellungen"
@@ -45571,9 +45795,6 @@ msgstr "Das Ticketsystem ist der Ort, um Dinge hinzuzufügen, die in einem Proje
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr "Das Ticketsystem ist der Ort, um Dinge hinzuzufügen, die in einem Projekt verbessert oder Probleme anzuführen, die gelöst werden müssen. Du kannst dich registrieren oder anmelden, um Tickets für dieses Projekt zu erstellen."
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr "Der Prometheus-Server antwortete: „bad request“. Bitte überprüfe die Korrektheit deiner Abfragen, und ob sie von deiner Prometheus-Version unterstützt werden. %{documentationLink}"
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr "Die Integration für Slack-Benachrichtigungen ist veraltet und wird in einer zukünftigen Version entfernt. Verwende stattdessen die GitLab für Slack-App, um weiterhin Benachrichtigungen von Slack zu erhalten. %{learn_more_link_start}Mehr erfahren%{link_end}"
@@ -45652,15 +45873,15 @@ msgstr "Das aktuelle Ticket"
msgid "The current user is not authorized to access the job log."
msgstr "Der/die aktuelle Benutzer(in) ist nicht berechtigt, auf das Jobprotokoll zuzugreifen."
+msgid "The current user is not authorized to create the pipeline schedule"
+msgstr "Der/die aktuelle Benutzer(in) ist nicht berechtigt, den Pipelineplan zu erstellen."
+
msgid "The current user is not authorized to update the pipeline schedule"
msgstr "Der/die aktuelle Benutzer(in) ist nicht berechtigt, den Pipeline-Zeitplan zu aktualisieren"
msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr "Die Daten in dieser Pipeline sind zu alt, um als Diagramm gerendert zu werden. Bitte überprüfe die Registerkarte „Jobs“, um auf historische Daten zuzugreifen."
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
-msgstr "Die Datenquelle ist verbunden, aber es sind keine Daten vorhanden. %{documentationLink}"
-
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
msgstr "Das Datum, an dem die Veröffentlichung fertig ist. Eine Veröffentlichung mit einem Datum in der Zukunft ist als %{linkStart}bevorstehende Version%{linkEnd} gekennzeichnet."
@@ -45786,7 +46007,7 @@ msgid "The hostname of your Snowplow collector."
msgstr "Der Hostname deines Snowplow-Sammlers."
msgid "The hostname of your diagrams.net server."
-msgstr ""
+msgstr "Der Hostname deines diagrams.net-Servers."
msgid "The import cannot be canceled because it is %{project_status}"
msgstr "Der Import kann nicht abgebrochen werden, da er %{project_status} ist"
@@ -45854,9 +46075,15 @@ msgstr "Die hochgeladene Lizenz ist ungültig. Wenn das Problem weiterhin besteh
msgid "The list creation wizard is already open"
msgstr "Der Listenerstellungsassistent ist bereits geöffnet"
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr "Die Karte kann nicht angezeigt werden, weil beim Laden der GeoJSON-Datei ein Fehler aufgetreten ist."
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr "Die maximale Zeit, die Benutzer(innen) für die Einrichtung der Zwei-Faktor-Authentifizierung haben, bevor sie gezwungen werden."
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr "Die maximal zulässige Dateigröße beträgt %{size}."
@@ -45872,9 +46099,6 @@ msgstr "Die maximale Dateigröße beträgt %{size}."
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr "Die maximale Anzahl von Tags, die ein einzelner Arbeitsvorgang zum Bereinigen zulässt. Wenn die Anzahl der Tags diesen Grenzwert überschreitet, wird die Liste der zu löschenden Tags auf diese Anzahl gekürzt. Um diese Begrenzung zu entfernen, setzen man sie auf 0."
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr "Die Merge-Konflikte dieser Merge Request konnten durch GitLab nicht gelöst werden. Bitte versuche, diese lokal zu lösen."
@@ -46001,6 +46225,9 @@ msgstr "Das ausgewählte Bild ist zu groß."
msgid "The snippet can be accessed without any authentication."
msgstr "Der Code-Schnipsel kann ohne Authentifizierung aufgerufen werden."
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr "Der Code-Schnipsel ist nur für mich sichtbar."
@@ -46229,6 +46456,9 @@ msgstr "Es gab ein Problem beim Abrufen von Emojis."
msgid "There was a problem fetching epics."
msgstr "Es gab ein Problem beim Abrufen von Epics."
+msgid "There was a problem fetching failed jobs"
+msgstr "Fehler beim Abrufen von fehlgeschlagenen Jobs"
+
msgid "There was a problem fetching groups."
msgstr "Es gab ein Problem beim Abrufen von Gruppen."
@@ -46365,7 +46595,7 @@ msgid "There was an error gathering the chart data"
msgstr "Fehler beim Sammeln der Diagrammdaten."
msgid "There was an error generating commit message."
-msgstr "Fehler beim Generieren der commit Nachricht"
+msgstr "Fehler beim Generieren der commit Nachricht."
msgid "There was an error getting the epic participants."
msgstr "Beim Aufrufen der Epic-Teilnehmer ist ein Fehler aufgetreten"
@@ -46439,6 +46669,9 @@ msgstr "Beim Datenabruf von Wertstromanalyse-Analysedaten ist ein Fehler aufgetr
msgid "There was an error while fetching value stream analytics duration data."
msgstr "Beim Datenabruf der Wertstromanalysedauer ist ein Fehler aufgetreten."
+msgid "There was an error while retrying this job"
+msgstr "Bei der Wiederholung dieses Jobs ist ein Fehler aufgetreten."
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr "Es ist ein Fehler mit dem reCAPTCHA aufgetreten. Bitte löse das reCAPTCHA erneut."
@@ -46479,7 +46712,7 @@ msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_cl
msgstr "%{issuable} ist gesperrt. Nur %{strong_open}Projektmitglieder%{strong_close} können Kommentare erstellen."
msgid "This %{issuable} is locked. Only project members can comment."
-msgstr ""
+msgstr "Dieses %{issuable} ist gesperrt. Nur Projektmitglieder können Kommentare abgeben."
msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr "Dieser %{noteableTypeText} ist %{confidentialLinkStart}vertraulich%{confidentialLinkEnd} und %{lockedLinkStart}gesperrt %{lockedLinkEnd}."
@@ -46575,11 +46808,14 @@ msgid "This comment changed after you started editing it. Review the %{startTag}
msgstr "Dieser Kommentar wurde geändert, nachdem du mit der Bearbeitung begonnen hast. Überprüfe den %{startTag}aktualisierten Kommentar%{endTag}, um sicherzustellen, dass keine Informationen verloren gegangen sind."
msgid "This comment was generated by AI"
-msgstr ""
+msgstr "Dieser Kommentar wurde von der KI generiert"
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 "Dieser Commit ist Teil der Merge Request %{link_to_merge_request}. Hier erstellte Kommentare werden im Kontext dieser Merge Request erstellt."
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr "Dieser Commit wurde mit einer %{strong_open}verifizierten%{strong_close} Signatur signiert, und die E-Mail-Adresse des/der Committer(in) wurde verifiziert und gehört derselben Person."
@@ -46689,7 +46925,7 @@ msgid "This feature requires local storage to be enabled"
msgstr "Um diese Funktion verwenden zu können, muss der lokale Speicher aktiviert werden."
msgid "This field is auto-calculated based on the Progress score of its direct children. You can overwrite this value but it will be replaced by the auto-calculation anytime the Progress score of its direct children is updated."
-msgstr "Dieses Feld wird automatisch auf der Grundlage des Fortschrittswerts seiner direkten Kinder berechnet. Du kannst diesen Wert überschreiben, aber er wird jedes Mal durch die automatische Berechnung ersetzt, wenn der Fortschrittswert seiner direkten Kinder aktualisiert wird."
+msgstr "Dieses Feld wird automatisch auf der Grundlage des Fortschrittswerts seiner direkt untergeordneten Elemente berechnet. Du kannst diesen Wert überschreiben, aber er wird jedes Mal durch die automatische Berechnung ersetzt, wenn der Fortschrittswert der direkt untergeordneten Elemente aktualisiert wird."
msgid "This field is required"
msgstr "Dieses Feld ist erforderlich"
@@ -46746,7 +46982,7 @@ msgid "This incident is already escalated with '%{escalation_policy_name}'."
msgstr "Dieser Vorfall wurde bereits mit „%{escalation_policy_name}“ eskaliert."
msgid "This instance is now read-only. Don't worry, your data is safe. To change to GitLab Free and restore write access to this instance, delete your expired license."
-msgstr ""
+msgstr "Diese Instanz ist jetzt schreibgeschützt. Keine Sorge, deine Daten sind nicht verloren. Lösche deine abgelaufene Lizenz, um zu GitLab Free zu wechseln und den Schreibzugriff auf diese Instanz wiederherzustellen."
msgid "This invitation was sent to %{mail_to_invite_email}, but you are signed in as %{link_to_current_user} with email %{mail_to_current_user}."
msgstr "Diese Einladung wurde an %{mail_to_invite_email} gesendet, doch du bist als %{link_to_current_user} mit der E-Mail-Adresse %{mail_to_current_user} angemeldet."
@@ -46812,7 +47048,7 @@ msgid "This issue is in a child epic of the filtered epic"
msgstr "Dieses Ticket befindet sich in einem untergeordneten Epic des gefilterten Epics"
msgid "This issue is locked. Only project members can comment."
-msgstr ""
+msgstr "Dieses Ticket ist gesperrt. Nur Projektmitglieder können Kommentare abgeben."
msgid "This job could not start because it could not retrieve the needed artifacts%{punctuation}%{invalid_dependencies}"
msgstr "Dieser Job konnte nicht gestartet werden, da die benötigten Artefakte nicht abgerufen werden konnten%{punctuation}%{invalid_dependencies}"
@@ -46961,9 +47197,6 @@ msgstr "Diese Seite wird auf GitLab Pages gehostet, enthält jedoch von Benutzer
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."
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr "Diese Pipeline nutzt eine vordefinierte CI/CD-Konfiguration mit Unterstützung von %{b_open}Auto DevOps%{b_close}."
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr "Diese Pipeline nutzt eine vordefinierte CI/CD-Konfiguration mit Unterstützung von %{strongStart}Auto DevOps%{strongEnd}."
@@ -47106,10 +47339,10 @@ msgid "This user is the author of this %{noteable}."
msgstr "Diese(r) Benutzer(in) ist der/die Autor(in) von %{noteable}."
msgid "This user is the author of this %{workItemType}."
-msgstr ""
+msgstr "Dieser/diese Benutzer(in) ist Autor(in) von %{workItemType}."
msgid "This variable value does not meet the masking requirements."
-msgstr ""
+msgstr "Dieser Variablenwert entspricht nicht den Maskierungsanforderungen."
msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr "Diese Sicherheitslücke wurde automatisch behoben, da der Sicherheitslückentyp in diesem Projekt deaktiviert oder aus dem GitLab-Standardregelsatz entfernt wurde."
@@ -47135,9 +47368,6 @@ msgstr "Schwellenwert in Bytes, ab dem Sidekiq-Job-Argumente komprimiert werden
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 "Schwellenwert in Bytes, ab dem Sidekiq-Jobs abgelehnt werden sollen. Setze diesen Wert auf 0, wenn du Sidekiq-Jobs nicht einschränken möchtest."
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr "Schwellenanzahl von Änderungen (Branches oder Tags) in einem einzigen Push, bei deren Überschreitung ein Bulk-Push-Ereignis erstellt wird (Standard ist 3)."
-
msgid "Throughput"
msgstr "Durchsatz"
@@ -47214,7 +47444,7 @@ msgid "Time spent must be formatted correctly. For example: 1h 30m."
msgstr "Die aufgewendete Zeit muss korrekt formatiert werden. Zum Beispiel: 1h 30m."
msgid "Time to Merge"
-msgstr ""
+msgstr "Dauer bis zum Merge"
msgid "Time to Restore Service"
msgstr "Zeit bis zur Wiederherstellung des Dienstes"
@@ -47417,6 +47647,9 @@ msgstr "vor kurzem"
msgid "Timeago|right now"
msgstr "gerade jetzt"
+msgid "Timeline"
+msgstr "Zeitleiste"
+
msgid "Timeline event added successfully."
msgstr "Timeline-Ereignis erfolgreich hinzugefügt."
@@ -47502,14 +47735,11 @@ msgstr "Titel:"
msgid "Titles"
msgstr "Titel"
-msgid "Titles and Descriptions"
-msgstr "Titel und Beschreibung"
-
msgid "To"
msgstr "An"
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
-msgstr "Füge den obigen Schlüssel zu einem TXT-Datensatz innerhalb deiner DNS-Konfiguration zu %{link_to_help} deiner Domain hinzu."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
+msgstr "Um %{link_to_help} deiner Domain zu erhalten, füge den oben genannten Schlüssel innerhalb von sieben Tagen zu einem TXT-Eintrag in deiner DNS-Konfiguration hinzu."
msgid "To Do"
msgstr "To-Do"
@@ -47577,6 +47807,9 @@ msgstr "Überprüfe, ob die Aktivität von GitLab protokolliert wurde, um sicher
msgid "To ensure %{project_name} is unscheduled for deletion, check that activity has been logged by GitLab. For example:"
msgstr "Überprüfe, ob die Aktivität von GitLab protokolliert wurde, um sicherzustellen, dass die geplante Löschung von %{project_name} aufgehoben wurde. Zum Beispiel:"
+msgid "To ensure no loss of access to personal content, only use this account for matters related to %{group_name}."
+msgstr "Um sicherzustellen, dass du den Zugriff auf persönliche Inhalte nicht verlierst, verwende dieses Konto nur für Angelegenheiten, die mit %{group_name} zu tun haben."
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr "Um sicherzustellen, dass keine persönlichen Inhalte verloren gehen, sollte dieses Konto nur für Angelegenheiten im Zusammenhang mit %{group_name} verwendet werden."
@@ -47604,16 +47837,13 @@ msgstr "Um zu beginnen, verwende den unten stehenden Link, um dein Konto zu best
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr "Wähle %{pages_link} links in der Seitenleiste aus, um zu den GitLab Pages zu gelangen."
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr "Um GitLab zu verbessern, möchten wir regelmäßig %{docs_link}. Dies kann jederzeit in %{settings_link} geändert werden."
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr "Um ein SVN-Repository zu importieren, schaue dir %{svn_link} an."
msgid "To invite more users, you can reduce the number of users in your top-level group to %{free_limit} user or less. You can also upgrade to a paid tier which do not have user limits. If you need additional time, you can start a free 30-day trial which includes unlimited users."
msgid_plural "To invite more users, you can reduce the number of users in your top-level group to %{free_limit} users or less. You can also upgrade to a paid tier which do not have user limits. If you need additional time, you can start a free 30-day trial which includes unlimited users."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Reduziere die Anzahl der Benutzer(innen) in deiner Gruppe der obersten Ebene auf maximal %{free_limit}, um weitere Benutzer(innen) einladen zu können. Du kannst auch ein Upgrade auf einen kostenpflichtigen Tarif ohne Benutzer-Limits durchführen. Wenn du mehr Zeit benötigst, kannst du eine kostenlose 30-Tage-Testversion mit beliebig vielen Benutzern(innen) starten."
+msgstr[1] "Reduziere die Anzahl der Benutzer(innen) in deiner Gruppe der obersten Ebene auf maximal %{free_limit}, um weitere Benutzer(innen) einladen zu können. Du kannst auch ein Upgrade auf einen kostenpflichtigen Tarif ohne Benutzer-Limits durchführen. Wenn du mehr Zeit benötigst, kannst du eine kostenlose 30-Tage-Testversion mit beliebig vielen Benutzern(innen) starten."
msgid "To keep this project going, create a new issue"
msgstr "Um dieses Projekt voranzutreiben, erstelle ein neues Ticket"
@@ -47655,7 +47885,7 @@ msgid "To remove the %{link_start}read-only%{link_end} state and regain write ac
msgstr "Um den %{link_start}Schreibschutz%{link_end} aufzuheben und den Schreibzugriff wiederherzustellen, bitte den/die Eigentümer(innen) der Gruppe der obersten Ebene, die Anzahl der Benutzer(innen) in deiner Gruppe der obersten Ebene auf maximal %{free_limit} Benutzer(innen) zu reduzieren oder ein Upgrade auf einen kostenpflichtigen Tarif ohne Benutzer-Limit durchzuführen."
msgid "To remove the %{link_start}read-only%{link_end} state and regain write access, you can reduce the number of users in your top-level group to %{free_limit} users or less. You can also upgrade to a paid tier, which do not have user limits. If you need additional time, you can start a free 30-day trial which includes unlimited users. To minimize the impact to operations, for a limited time, GitLab is offering a %{promotion_link_start}one-time 70 percent discount%{link_end} off the list price at time of purchase for a new, one year subscription of GitLab Premium SaaS to %{offer_availability_link_start}qualifying top-level groups%{link_end}. The offer is valid until %{offer_date}."
-msgstr ""
+msgstr "Um den Status %{link_start}Schreibgeschützt%{link_end} aufzuheben und wieder Schreibrechte zu erhalten, kannst du die Benutzeranzahl in deiner obersten Stufe auf %{free_limit} Benutzer(innen) oder weniger reduzieren. Du kannst auch auf einen kostenpflichtigen Tarif upgraden, bei dem es keine Benutzer-Limits gibt. Wenn du mehr Zeit brauchst, kannst du eine kostenlose 30-Tage-Testversion mit beliebig vielen Benutzer(innen) starten. Um die Auswirkungen auf den Betrieb so gering wie möglich zu halten, bietet GitLab für einen begrenzten Zeitraum einen %{promotion_link_start}einmaligen Rabatt von 70 Prozent%{link_end} auf den Listenpreis zum Zeitpunkt des Kaufs eines neuen, einjährigen Abonnements von GitLab Premium SaaS für %{offer_availability_link_start}qualifizierte Gruppen der obersten Stufe%{link_end}. Das Angebot ist bis zum %{offer_date} gültig."
msgid "To resolve this, try to:"
msgstr "Um dies zu beheben, versuche Folgendes:"
@@ -47678,6 +47908,9 @@ msgstr "Um anzuzeigen, was geändert wurde, oder einen Merge Request zu erstelle
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr "So richtest du die SAML-Authentifizierung für deine Gruppe über einen Identitätsanbieter wie Azure, Okta, Onelogin, Ping Identity oder deinen benutzerdefinierten SAML 2.0-Anbieter ein:"
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr "Um diese Integration einzurichten:"
@@ -47687,6 +47920,12 @@ msgstr "Um in einer Gruppe, der du angehörst, die Benachrichtigungsstufe einzel
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 "Um die GitLab Enterprise Edition zu verwenden, lade die Datei %{codeOpen}.gitlab-license%{codeClose} hoch oder gib den Lizenzschlüssel ein, den du von GitLab Inc. erhalten hast."
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr "Um deine Änderungen in einem Merge Request zu übermitteln, erstelle einen neuen Fork."
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr "Um deine Änderungen in einem Merge Request zu übermitteln, wechsle zu einem dieser Forks oder erstelle einen neuen Fork."
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr "Füge den folgenden Link in deinem Browser ein, um dieses Ticket abzubestellen:"
@@ -47694,7 +47933,7 @@ msgid "To update Snippets with multiple files, you must use the `files` paramete
msgstr "Verwende den Parameter „files“, um Codeausschnitte mit mehreren Dateien zu aktualisieren."
msgid "To use Service Desk in this project, you must %{linkStart}activate the issue tracker%{linkEnd}."
-msgstr "Um den Service Desk in diesem Projekt nutzen zu können, musst du %{linkStart}den Issue-Tracker aktivieren%{linkEnd}."
+msgstr "Um den Service-Desk in diesem Projekt nutzen zu können, musst du den %{linkStart}Issue-Tracker aktivieren%{linkEnd}."
msgid "To use the additional formats, you must start the required %{container_link_start}companion containers%{container_link_end}."
msgstr "Um die zusätzlichen Formate zu verwenden, musst du die erforderlichen %{container_link_start}Begleitcontainer%{container_link_end} starten."
@@ -47858,9 +48097,6 @@ msgstr "Seitenleiste ein-/ausblenden"
msgid "Toggle backtrace"
msgstr "Rückverfolgung umschalten"
-msgid "Toggle collapse"
-msgstr "Ein- oder ausklappen"
-
msgid "Toggle comments for this file"
msgstr "Kommentare für diese Datei umschalten"
@@ -47870,6 +48106,9 @@ msgstr "Beschreibung des Commits ein-/ausblenden"
msgid "Toggle commit list"
msgstr "Commit-Liste ein-/ausklappen"
+msgid "Toggle details"
+msgstr "Details umschalten"
+
msgid "Toggle emoji award"
msgstr "Emoji-Auszeichnung umschalten"
@@ -47918,12 +48157,6 @@ msgstr "Token gültig bis auf Widerruf"
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr "Dieses persönliche Zugangstoken wurde bei der Erkennung automatisch widerrufen. Untersuche die Situation und tausche das Token, bevor du diese Sicherheitslücke als behoben markierst."
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr "Geltungsbereiche legen die Berechtigungsstufen fest, die dem Token gewährt werden."
-
-msgid "Tokens|Select scopes"
-msgstr "Geltungsbereiche auswählen"
-
msgid "Tomorrow"
msgstr "Morgen"
@@ -47998,6 +48231,9 @@ msgstr "Themen"
msgid "Topics could not be merged!"
msgstr "Themen konnten nicht zusammengeführt werden!"
+msgid "Topics|Subscribe to the new projects feed"
+msgstr "Abonniere den Feed für neue Projekte."
+
msgid "Total"
msgstr "Total"
@@ -48292,7 +48528,7 @@ msgid "Two-factor authentication disabled"
msgstr "Zweiâ€Faktorâ€Authentifizierung deaktiviert"
msgid "Two-factor authentication for admin mode"
-msgstr ""
+msgstr "Zwei-Faktor-Authentifizierung für Admin-Benutzer(in)"
msgid "Two-factor authentication grace period"
msgstr "Übergangsfrist für die Zwei-Faktor-Authentifizierung"
@@ -48327,12 +48563,6 @@ msgstr "Tippen zum Suchen"
msgid "URL"
msgstr "URL"
-msgid "URL cannot be blank"
-msgstr "Die URL darf nicht leer sein"
-
-msgid "URL is invalid"
-msgstr "Die URL ist ungültig"
-
msgid "URL is required"
msgstr "URL erforderlich"
@@ -48390,9 +48620,6 @@ msgstr "CPU-Informationen können nicht abgerufen werden"
msgid "Unable to collect memory info"
msgstr "Speicherinformationen können nicht abgerufen werden"
-msgid "Unable to connect to Prometheus server"
-msgstr "Keine Verbindung zum Prometheus-Server"
-
msgid "Unable to connect to server: %{error}"
msgstr "Kann keine Verbindung zum Server herstellen: %{error}"
@@ -48529,13 +48756,13 @@ msgid "Unauthenticated web rate limit period in seconds"
msgstr "Limitzeitraum für nicht authentifizierte Webrate in Sekunden"
msgid "Unauthorized to access the cluster agent in this project"
-msgstr ""
+msgstr "Du hast keinen Zugriff auf den Cluster-Agent in diesem Projekt."
msgid "Unauthorized to create an environment"
-msgstr ""
+msgstr "Nicht berechtigt, eine Umgebung zu erstellen"
msgid "Unauthorized to update the environment"
-msgstr ""
+msgstr "Nicht berechtigt, die Umgebung zu aktualisieren"
msgid "Unavailable"
msgstr "Nicht verfügbar"
@@ -48562,7 +48789,7 @@ msgid "Unexpected error"
msgstr "Unerwarteter Fehler"
msgid "Unexpected error: Cannot serialize resource"
-msgstr ""
+msgstr "Unerwarteter Fehler: Ressource kann nicht serialisiert werden"
msgid "Unexpected scope"
msgstr "Unerwarteter Geltunsgbereich"
@@ -48576,9 +48803,6 @@ msgstr "Leider konnte deine E-Mail an GitLab nicht verarbeitet werden."
msgid "Unhappy?"
msgstr "Unzufrieden?"
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr "d"
@@ -48630,8 +48854,8 @@ msgstr "Verknüpfung aufheben"
msgid "Unlock"
msgstr "Entsperren"
-msgid "Unlock %{issuableType}"
-msgstr "%{issuableType} entsperren"
+msgid "Unlock %{issuableDisplayName}"
+msgstr "Entsperre %{issuableDisplayName}."
msgid "Unlock account"
msgstr "Konto entsperren"
@@ -48651,6 +48875,9 @@ msgstr "Entsperrt"
msgid "Unlocked the discussion."
msgstr "Diskussion entsperrt."
+msgid "Unlocking %{issuableDisplayName}"
+msgstr "%{issuableDisplayName} wird entsperrt."
+
msgid "Unlocks the discussion."
msgstr "Entsperrt die Diskussion."
@@ -48660,9 +48887,6 @@ msgstr "Nicht erreichbar"
msgid "Unrecognized approval status."
msgstr "Unbekannter Genehmigungsstatus."
-msgid "Unrecognized cluster type"
-msgstr "Unbekannter Clustertyp"
-
msgid "Unresolve"
msgstr "Auflösung rückgängig machen"
@@ -48682,7 +48906,7 @@ msgid "Unselect all"
msgstr "Alles abwählen"
msgid "Unselected"
-msgstr ""
+msgstr "Nicht ausgewählt"
msgid "Unstar"
msgstr "Entfavorisieren"
@@ -48709,7 +48933,7 @@ msgid "Unsubscribes from this %{quick_action_target}."
msgstr "Bestellt %{quick_action_target} ab."
msgid "Unsupported forecast type."
-msgstr ""
+msgstr "Nicht unterstützter Prognosetyp."
msgid "Unsupported sort value."
msgstr "Nicht unterstützter Sortierwert."
@@ -48942,7 +49166,7 @@ msgstr "Demnächst wird ein %{storage_limit_link_start}Speicherlimit für Namens
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr "Hörbeispiele, Videos, Datensätze und Grafiken."
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48952,16 +49176,16 @@ msgid "UsageQuota|Code packages and container images."
msgstr "Code-Pakete und Container-Abbilder."
msgid "UsageQuota|Compute usage"
-msgstr ""
+msgstr "Nutzung des Rechenkontingents"
msgid "UsageQuota|Compute usage by month"
-msgstr ""
+msgstr "Nutzung des Rechenkontingents pro Monat"
msgid "UsageQuota|Compute usage by project"
-msgstr ""
+msgstr "Nutzung des Rechenkontingents nach Projekt"
msgid "UsageQuota|Compute usage since %{usageSince}"
-msgstr ""
+msgstr "Berechnen der Nutzung seit %{usageSince}"
msgid "UsageQuota|Container Registry"
msgstr "Container-Registry"
@@ -48990,6 +49214,9 @@ msgstr "Mit GitLab integrierte Docker-Container-Registry zum Speichern von Docke
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr "Gruppeneinstellungen &gt; Nutzungskontingente"
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr "Inbegriffen in Abonnement %{planName}"
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr "Umfasst Artefakte, Repositorys, Wiki und andere Elemente."
@@ -49012,13 +49239,13 @@ msgid "UsageQuota|Month"
msgstr "Monat"
msgid "UsageQuota|Namespace overview"
-msgstr "UsageQuota|Namespace-Ãœbersicht"
+msgstr "Namensraumübersicht"
msgid "UsageQuota|Namespace storage used"
msgstr "Verwendeter Namensraumspeicher"
msgid "UsageQuota|No compute usage data available."
-msgstr ""
+msgstr "Keine Daten zur Nutzung des Rechenkontingents verfügbar."
msgid "UsageQuota|No projects to display."
msgstr "Keine anzuzeigenden Projekte."
@@ -49029,17 +49256,11 @@ msgstr "Ausstehende Mitglieder"
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr "Pipeline-Artefakte und Job-Artefakte, erstellt mit CI/CD."
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr "Pipeline-Artefakte erstellt von CI/CD."
-
msgid "UsageQuota|Pipelines"
msgstr "Pipelines"
-msgid "UsageQuota|Purchased storage"
-msgstr "Gekaufter Speicher"
-
-msgid "UsageQuota|Purchased storage used"
-msgstr "Nutzung des gekauften Speichers"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
+msgstr ""
msgid "UsageQuota|Recalculate repository usage"
msgstr "Repository-Nutzung neu berechnen"
@@ -49075,7 +49296,7 @@ msgid "UsageQuota|Storage type"
msgstr "Speichertyp"
msgid "UsageQuota|Storage usage breakdown"
-msgstr "UsageQuota|Aufschlüsselung der Speichernutzung"
+msgstr "Aufschlüsselung der Speichernutzung"
msgid "UsageQuota|Storage used"
msgstr "Belegter Speicher"
@@ -49098,9 +49319,15 @@ msgstr "Die folgende Tabelle zeigt die Nutzung seit %{usageSince}."
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr "Dieser Namensraum enthält keine Projekte, die im aktuellen Zeitraum gemeinsam genutzte Runner verwendet haben"
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
msgstr ""
+msgid "UsageQuota|Total purchased storage"
+msgstr "Gekaufter Gesamtspeicher"
+
+msgid "UsageQuota|Total storage"
+msgstr "Gesamtspeicher"
+
msgid "UsageQuota|Transfer"
msgstr "Ãœbertragung"
@@ -49380,7 +49607,7 @@ msgid "User Settings"
msgstr "Benutzereinstellungen"
msgid "User Status"
-msgstr ""
+msgstr "Benutzerstatus"
msgid "User and IP rate limits"
msgstr "Benutzer- und IP-Beschränkungen"
@@ -49395,7 +49622,7 @@ msgid "User created at"
msgstr "Benutzer(in) erstellt am"
msgid "User deleted own account on %{timestamp}"
-msgstr ""
+msgstr "Benutzer(in) hat sein/ihr eigenes Konto am %{timestamp} gelöscht"
msgid "User does not have a pending request"
msgstr "Diese(r) Benutzer(in) hat keine ausstehende Anfrage"
@@ -49403,8 +49630,11 @@ msgstr "Diese(r) Benutzer(in) hat keine ausstehende Anfrage"
msgid "User does not have permission to create a Security Policy project."
msgstr "Der/die Benutzer(in) ist nicht berechtigt, ein Sicherheitsprojekt zu erstellen."
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr "Der/die Benutzer(in) existiert nicht oder du hast keine Berechtigung, um Namensraum-Commit-E-Mails zu ändern."
+
msgid "User has already been deactivated"
-msgstr ""
+msgstr "Benutzer(in) wurde bereits deaktiviert"
msgid "User identity was successfully created."
msgstr "Benutzeridentität wurde erfolgreich erstellt."
@@ -49545,19 +49775,25 @@ msgid "UserList|created %{timeago}"
msgstr "erstellt %{timeago}"
msgid "UserProfiles|No snippets found."
-msgstr "UserProfiles|Keine Snippets gefunden."
+msgstr "Keine Snippets gefunden."
msgid "UserProfile|%{count} %{file}"
-msgstr ""
+msgstr "%{count} %{file}"
msgid "UserProfile|%{id} · created %{created} by %{author}"
-msgstr ""
+msgstr "%{id} · erstellt %{created} von %{author}"
msgid "UserProfile|Activity"
msgstr "Aktivität"
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr "Beim Laden der Aktivität ist ein Fehler aufgetreten. Bitte aktualisiere die Seite, um es erneut zu versuchen."
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
-msgstr ""
+msgstr "Beim Laden der Follower ist ein Fehler aufgetreten. Bitte aktualisiere die Seite, um es noch einmal zu versuchen."
+
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr "Beim Laden der Konten, denen du folgst, ist ein Fehler aufgetreten. Bitte aktualisiere die Seite, um es noch einmal zu versuchen."
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr "Beim Laden der persönlichen Projekte ist ein Fehler aufgetreten. Bitte aktualisiere die Seite und versuche es erneut."
@@ -49577,6 +49813,9 @@ msgstr "Projektbeteiligungen"
msgid "UserProfile|Copy user ID"
msgstr "Benutzer-ID kopieren"
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr "Profil bearbeiten"
@@ -49658,6 +49897,9 @@ msgstr "Diese(r) Benutzer(in) folgt keinen anderen Benutzer(innen)."
msgid "UserProfile|Unconfirmed user"
msgstr "Unbestätigte(r) Benutzer(in)"
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr "Benutzer-ID: %{id}"
@@ -49695,7 +49937,7 @@ msgid "UserProfile|made a private contribution"
msgstr "hat einen privaten Beitrag geleistet"
msgid "UserProfile|updated %{updated}"
-msgstr ""
+msgstr "aktualisiert %{updated}"
msgid "Username"
msgstr "Nutzername"
@@ -49809,7 +50051,7 @@ msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%
msgstr "Durch die Benutzung von %{code_start}::%{code_end} wird ein %{link_start}gescoptes Label%{link_end} bezeichnet"
msgid "Using HTML script"
-msgstr ""
+msgstr "Verwendung von HTML-Skript"
msgid "Using required encryption strategy when encrypted field is missing!"
msgstr "Erforderliche Verschlüsselungsstrategie wird verwendet, wenn ein verschlüsseltes Feld fehlt!"
@@ -49854,7 +50096,7 @@ msgid "Value might contain a variable reference"
msgstr "Der Wert kann eine Variablenreferenz enthalten"
msgid "Value must meet regular expression requirements to be masked."
-msgstr ""
+msgstr "Der Wert muss den Anforderungen des regulären Ausdrucks entsprechen, um maskiert zu werden."
msgid "Value stream"
msgstr "Wertschöpfungskette"
@@ -49907,8 +50149,8 @@ msgstr "Dokumente aufrufen"
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr "Sicherheitslücken mit hoher Priorität im Laufe der Zeit."
-msgid "ValueStreamAnalytics|Key metrics"
-msgstr "Schlüsselmetriken"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
+msgstr "Lebenszyklus-Metriken"
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
msgstr "Mittlere Dauer, über die Vorfälle in einer Produktionsumgebung in der angegebenen Zeitspanne geöffnet waren."
@@ -49923,7 +50165,7 @@ msgid "ValueStreamAnalytics|Median time from the earliest commit of a linked iss
msgstr "Medianzeit vom frühesten Commit in einer mit einem Ticket verknüpften Merge-Request bis zum Schließen dieses Tickets."
msgid "ValueStreamAnalytics|Merge request analytics"
-msgstr ""
+msgstr "Merge Request-Analysen"
msgid "ValueStreamAnalytics|New Value Stream"
msgstr "Neue Wertschöpfungskette"
@@ -49932,7 +50174,7 @@ msgid "ValueStreamAnalytics|Number of commits pushed to the default branch"
msgstr "Anzahl der in den Standard-Branch übertragenen Commits"
msgid "ValueStreamAnalytics|Number of issues closed by month."
-msgstr ""
+msgstr "Anzahl der abgeschlossenen Tickets pro Monat."
msgid "ValueStreamAnalytics|Number of new issues created."
msgstr "Anzahl der neu erstellten Tickets."
@@ -49995,7 +50237,7 @@ msgid "Variable"
msgstr "Variable"
msgid "Variable name '%{variable}' must not start with '%{prefix}'"
-msgstr "Der Variablenname '%{variable}' darf nicht mit '%{prefix} ' beginnen"
+msgstr "Der Variablenname '%{variable}' darf nicht mit '%{prefix}' beginnen"
msgid "Variable value will be evaluated as raw string."
msgstr "Variablenwert wird als unveränderte Zeichenfolge ausgewertet."
@@ -50033,7 +50275,7 @@ msgstr "Bis dahin sind gemeinsam genutzte Runner nicht verfügbar. %{validateLin
msgid "VerificationReminder|Your account has been validated"
msgstr "Dein Konto wurde validiert"
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr "Überprüfen der SAML-Konfiguration"
msgid "Verify code"
msgstr "Code überprüfen"
-msgid "Verify configuration"
-msgstr "Konfiguration verifizieren"
-
msgid "Version"
msgstr "Version"
@@ -50132,11 +50371,6 @@ msgstr "Blame vor dieser Änderung anzeigen"
msgid "View card matches"
msgstr "Kartenübereinstimmungen anzeigen"
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] "Diagramm anzeigen"
-msgstr[1] "Diagramme anzeigen"
-
msgid "View dependency details for your project"
msgstr "Abhängigkeitsdetails für dein Projekt anzeigen"
@@ -50163,9 +50397,6 @@ msgstr "Zeige Datei @ "
msgid "View file @ %{commitSha}"
msgstr "Datei @ %{commitSha} anzeigen"
-msgid "View full dashboard"
-msgstr "Vollständiges Dashboard anzeigen"
-
msgid "View group in admin area"
msgstr "Gruppe im Adminbereich anzeigen"
@@ -50220,9 +50451,6 @@ msgstr "Zeige offene Merge Requests"
msgid "View page @ "
msgstr "Seite @ anzeigen "
-msgid "View performance dashboard."
-msgstr "Performance-Dashboard anzeigen"
-
msgid "View project in admin area"
msgstr "Projekt im Adminbereich anzeigen"
@@ -50240,6 +50468,9 @@ msgstr "Zeige ersetzte Datei @ "
msgid "View seat usage"
msgstr "Sitzplatznutzung anzeigen"
+msgid "View summary notes"
+msgstr "Zusammenfassende Notizen anzeigen"
+
msgid "View supported languages and frameworks"
msgstr "Unterstützte Sprachen und Frameworks anzeigen"
@@ -50252,9 +50483,6 @@ msgstr "Dokumentation anzeigen"
msgid "View the latest successful deployment to this environment"
msgstr "Letzte erfolgreiche Bereitstellung in dieser Umgebung anzeigen"
-msgid "View the performance dashboard at"
-msgstr "Das Performance-Dashboard befindet sich unter"
-
msgid "View usage details"
msgstr "Nutzungsdetails anzeigen"
@@ -50268,7 +50496,7 @@ msgid "Viewing commit"
msgstr "Commit anzeigen"
msgid "Viewing projects data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
-msgstr ""
+msgstr "Das Anzeigen von Projektdaten von einer primären Website ist nicht möglich, wenn eine einheitliche URL verwendet wird. Besuche die sekundäre Website direkt. %{geo_help_url}"
msgid "Violation"
msgstr "Verstoß"
@@ -50609,6 +50837,9 @@ msgstr "Code-Prüfung"
msgid "Vulnerability|Comments"
msgstr "Kommentare"
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr "Absturzadresse"
@@ -50663,6 +50894,9 @@ msgstr "Datei:"
msgid "Vulnerability|GitLab Security Report"
msgstr "GitLab-Sicherheitsbericht"
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr "Bezeichner"
@@ -50712,7 +50946,7 @@ msgid "Vulnerability|Request/Response"
msgstr "Anfrage/Antwort"
msgid "Vulnerability|Response generated by AI"
-msgstr ""
+msgstr "Von KI generierte Reaktion"
msgid "Vulnerability|Scanner Provider"
msgstr "Scanner-Anbieter"
@@ -50738,6 +50972,9 @@ msgstr "Schweregrad"
msgid "Vulnerability|Severity:"
msgstr "Schweregrad:"
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr "Status"
@@ -50795,9 +51032,6 @@ msgstr "Auf Genehmigung warten"
msgid "Waiting for merge (open and assigned)"
msgstr "Warte auf Zusammenführung (offen und zugewiesen)"
-msgid "Waiting for performance data"
-msgstr "Warten auf Leistungsdaten"
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr "Du möchtest die Daten sehen? Bitte frage eine(n) Administrator(in) nach dem Zugang."
@@ -50837,9 +51071,6 @@ msgstr "Wir konnten keinen %{scope} finden, der zu %{term} in der Gruppe %{group
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr "Wir konnten keinen %{scope} finden, der zu %{term} in dem Projekt %{project} passt"
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr "Prometheus-Server ist nicht erreichbar. Entweder existiert der Server nicht mehr oder die Konfigurationsdetails müssen aktualisiert werden."
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr "Wir haben potenziellen Spam in %{humanized_resource_name} gefunden. Bitte löse den reCAPTCHA, um fortzufahren."
@@ -50858,9 +51089,6 @@ msgstr "Wir laden dich ein, %{featureLinkStart}eine Funktion anzufordern%{featur
msgid "We recommend a work email address."
msgstr "Wir empfehlen, eine geschäftliche E-Mail-Adresse zu verwenden."
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr "Wir empfehlen, alle SAST-Analysatoren aktiviert zu lassen"
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr "Wir empfehlen dir, zusätzliche Pipeline-Minuten zu kaufen, um eine Unterbrechung des Dienstes zu vermeiden."
@@ -51210,7 +51438,7 @@ msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr "Willkommen bei GitLab,%{br_tag}%{name}!"
msgid "Welcome to a new navigation experience"
-msgstr ""
+msgstr "Willkommen zu einem neuen Navigationserlebnis"
msgid "Welcome, %{name}!"
msgstr "Willkommen, %{name}!"
@@ -51240,7 +51468,7 @@ msgid "What is Markdown?"
msgstr "Was ist Markdown?"
msgid "What is a compute quota?"
-msgstr ""
+msgstr "Was ist ein Rechenkontingent?"
msgid "What is listed here?"
msgstr "Was ist hier aufgelistet?"
@@ -51248,6 +51476,9 @@ msgstr "Was ist hier aufgelistet?"
msgid "What is repository mirroring?"
msgstr "Was bedeutet das Spiegeln eines Repositorys?"
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr "Was bedeutet Squashing?"
@@ -51282,7 +51513,7 @@ msgid "When enabled, job logs are collected by Datadog and displayed along with
msgstr "Wenn diese Option aktiviert ist, werden Job-Protokolle von Datadog gesammelt und zusammen mit Pipeline-Ausführungsspuren angezeigt."
msgid "When left blank, default value of 365 is applied. When set, value must be 365 or less. When changed, existing access tokens with an expiration date beyond the maximum allowable lifetime are revoked."
-msgstr ""
+msgstr "Wenn dieses Feld leer gelassen wird, wird der Standardwert 365 verwendet. Wenn ein Wert eingegeben wird, darf dieser höchstens 365 sein. Wenn er geändert wird, werden bestehende Zugangstoken mit einem Ablaufdatum, das über die maximal zulässige Lebensdauer hinausgeht, widerrufen."
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr "Wenn Merge Requests und Commits im Standardbranch geschlossen werden, werden auch alle Tickets geschlossen, auf die sie verweisen."
@@ -51563,6 +51794,9 @@ msgstr "Zugriffsanfrage widerrufen"
msgid "Won't fix / Accept risk"
msgstr "Wird nicht behoben / Risiko hinnehmen"
+msgid "Work Item promoted successfully."
+msgstr "Workitem erfolgreich hochgestuft."
+
msgid "Work Item type with id %{id} was not found"
msgstr "Arbeitsaufgabentyp mit ID %{id} wurde nicht gefunden"
@@ -51641,7 +51875,7 @@ msgid "WorkItem|Child objectives and key results"
msgstr "Untergeordnete Ziele und Schlüsselergebnisse"
msgid "WorkItem|Child removal reverted"
-msgstr ""
+msgstr "Das Entfernen des untergeordneten Elementes wurde rückgängig gemacht"
msgid "WorkItem|Child removed"
msgstr "Kindelement entfernt"
@@ -51658,6 +51892,9 @@ msgstr "In Aufgabe umwandeln"
msgid "WorkItem|Converted to task"
msgstr "In Aufgabe konvertiert"
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr "E-Mail-Adresse von %{workItemType} kopieren"
+
msgid "WorkItem|Create %{workItemType}"
msgstr "%{workItemType} erstellen"
@@ -51682,9 +51919,6 @@ msgstr "Fälligkeitsdatum"
msgid "WorkItem|Existing task"
msgstr "Vorhandene Aufgabe"
-msgid "WorkItem|Failed to award emoji"
-msgstr "Emoji konnte nicht vergeben werden"
-
msgid "WorkItem|Health status"
msgstr "Integritätsstatus"
@@ -51799,6 +52033,12 @@ msgstr "Beim Versuch, ein untergeordnetes Element hinzuzufügen, ist ein Fehler
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr "Beim Erstellen eines untergeordneten Elements ist etwas schiefgelaufen. Bitte erneut versuchen."
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr "Beim Kopieren der E-Mail-Adresse %{workItemType} ist etwas schief gegangen. Bitte versuche es noch einmal."
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr "Beim Kopieren der Referenz %{workItemType} ist etwas schief gelaufen. Bitte versuche es noch einmal."
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr "Beim Abrufen von Meilensteinen ist etwas schief gelaufen. Bitte versuche es erneut."
@@ -51877,6 +52117,9 @@ msgstr "Ein Arbeitsbereich ist eine virtuelle Sandbox-Umgebung für deinen Code
msgid "Workspaces|Cancel"
msgstr "Abbrechen"
+msgid "Workspaces|Could not load workspaces"
+msgstr "Arbeitsbereiche konnten nicht geladen werden"
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr "Cluster-Agenten für dieses Projekt konnten nicht abgerufen werden"
@@ -51968,11 +52211,14 @@ msgid "Workspaces|Workspaces"
msgstr "Arbeitsbereiche"
msgid "Workspaces|You can create a workspace for public projects only."
-msgstr ""
+msgstr "Du kannst einen Workspace nur für öffentliche Projekte erstellen."
msgid "Workspaces|You can't create a workspace for this project"
msgstr "Du kannst keinen Arbeitsbereich für dieses Projekt erstellen"
+msgid "Workspaces|Your workspaces"
+msgstr "Deine Arbeitsbereiche"
+
msgid "Would you like to create a new branch?"
msgstr "Möchtest du einen neuen Branch erstellen?"
@@ -52083,9 +52329,6 @@ msgstr "Du wirst von GitLab weggeleitet"
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr "Wenn du diese Zahl überschreitest, werden dir Kosten in Rechnung gestellt. %{qsrOverageLinkStart}Wie funktioniert die Abrechnung?%{qsrOverageLinkEnd}"
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr "Du bist mit dem Prometheus-Server verbunden, aber es sind derzeit keine Daten vorhanden."
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr "Du bist derzeit offline oder die GitLab-Instanz ist nicht erreichbar."
@@ -52374,6 +52617,9 @@ msgstr "Du kannst nicht auf eine schreibgeschützte sekundäre Gitlab Geo-Instan
msgid "You cannot write to this read-only GitLab instance."
msgstr "Du kannst nicht auf dieser schreibgeschützte GitLab-Instanz schreiben."
+msgid "You can’t edit files directly in this project."
+msgstr "Du kannst Dateien in diesem Projekt nicht direkt bearbeiten."
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr "Du kannst keine Dateien direkt in diesem Projekt bearbeiten. Forke dieses Projekt und reiche einen Merge Request mit deinen Änderungen ein."
@@ -52390,7 +52636,7 @@ msgid "You do not have any subscriptions yet"
msgstr "Du hast noch keine Abonnements"
msgid "You do not have permission to access DORA4 metrics."
-msgstr ""
+msgstr "Du hast keine Berechtigung, auf DORA4-Metriken zuzugreifen."
msgid "You do not have permission to access dora metrics."
msgstr "Du hast keine Berechtigung, auf DORA-Metriken zuzugreifen."
@@ -52769,7 +53015,7 @@ msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change
msgstr "Deine %{spammable_entity_type} wurde als Spam erkannt. Bitte ändere den Inhalt oder löse das reCAPTCHA, um fortzufahren."
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content to proceed."
-msgstr ""
+msgstr "Dein(e) %{spammable_entity_type} wurde als Spam erkannt. Bitte ändere den Inhalt, um fortzufahren."
msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr "Dein %{strong}%{plan_name}%{strong_close}-Abonnement für %{strong}%{namespace_name}%{strong_close} läuft am %{strong}%{expires_on}%{strong_close} ab."
@@ -52813,6 +53059,12 @@ msgstr "Deine kostenlose Testversion von GitLab Ultimate dauert 30 Tage. Nach Ab
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 "Dein GitLab-Konto wurde aufgrund einer übermäßigen Anzahl fehlgeschlagener Anmeldeversuche gesperrt. Du kannst warten, bis dein Konto in %{duration} automatisch entsperrt wird oder auf den unten stehenden Link klicken, um es jetzt zu entsperren."
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr "Dein GitLab-Konto ist jetzt ein(e) %{source_link}:"
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr "Dein GitLab-Konto ist jetzt ein(e) Unternehmensbenutzer(in) (%{source_link}):"
+
msgid "Your GitLab account request has been approved!"
msgstr "Deine GitLab-Kontoanfrage wurde genehmigt!"
@@ -52864,6 +53116,12 @@ msgstr "Dein WebAuthn-Gerät wurde registriert!"
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr "Deine Zugriffsanfrage an %{source_type} wurde zurückgezogen."
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr "Dein Konto wurde gesperrt. Wende dich an %{support} für Hilfe."
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr "Dein Konto wurde gesperrt. Wende dich an deinen GitLab-Administrator."
+
msgid "Your account has been deactivated"
msgstr "Dein Konto wurde deaktiviert"
@@ -52919,13 +53177,13 @@ msgid "Your changes have been successfully committed."
msgstr "Deine Änderungen wurde erfolgreich comitted."
msgid "Your comment could not be submitted because %{reason}."
-msgstr ""
+msgstr "Dein Kommentar konnte wegen %{reason} nicht übermittelt werden."
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr "Dein Kommentar konnte nicht abgesendet werden! Bitte überprüfe deine Netzwerkverbindung und versuche es erneut."
-msgid "Your comment could not be updated! Please check your network connection and try again."
-msgstr "Dein Kommentar konnte nicht aktualisiert werden! Bitte überprüfe deine Netzwerkverbindung und versuche es erneut."
+msgid "Your comment could not be updated because %{reason}."
+msgstr "Dein Kommentar konnte wegen %{reason} nicht geändert werden."
msgid "Your comment will be discarded."
msgstr "Dein Kommentar wird verworfen."
@@ -53084,12 +53342,15 @@ msgstr "Deine Gruppe der obersten Ebene (%{namespace_name}) hat das Benutzer-Lim
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr "Deine Gruppe der obersten Ebene (%{namespace_name}) wird bald als schreibgeschützt festgelegt."
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
-msgstr "Deine Gruppe der obersten Ebene hat das Benutzer-sowie das Speicher-Limit überschritten und wurde als schreibgeschützt festgelegt."
-
msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr "Deine Gruppe der obersten Ebene hat das Benutzer-Limit überschritten und wurde als schreibgeschützt festgelegt."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr "Deine Gruppe der obersten Stufe (%{group_name}), hat mehr als %{free_users_limit} Benutzer(innen) und nutzt mehr als %{free_storage_limit} an Daten. Nach der Anwendung von Nutzungsbeschränkungen auf Gruppen der obersten Stufe im kostenlosen Tarif befinden sich die Projekte in dieser Gruppe im %{read_only_link_start}schreibgeschützten Zustand%{link_end}. Um sicherzustellen, dass deine Gruppe nicht schreibgeschützt wird, solltest du dich an eine(n) Benutzer(in) mit der Eigentümerrolle für diese Gruppe wenden, um ein Upgrade auf eine kostenpflichtige Stufe durchzuführen oder deine Nutzung zu verwalten. Weitere Informationen über die kommenden Nutzungsbeschränkungen findest du in unseren %{faq_link_start}FAQ%{link_end}."
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr "Deine Gruppe der obersten Stufe (%{group_name}), hat mehr als %{free_users_limit} Benutzer(innen) und nutzt mehr als %{free_storage_limit} an Daten. Nach der Anwendung von Nutzungsbeschränkungen auf Gruppen der obersten Stufe im kostenlosen Tarif angewendet wurden, befinden sich die Projekte in dieser Gruppe im %{read_only_link_start}schreibgeschützten Zustand%{link_end}. Um mehr Plätze und zusätzlichen Speicherplatz zu erhalten, musst du ein Upgrade auf einen kostenpflichtigen Tarif durchführen. Du kannst auch deine Nutzung verwalten. Weitere Informationen über die kommenden Nutzungsgrenzen findest du in unseren %{faq_link_start}FAQ%{link_end}."
+
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
msgstr "Deine Aktualisierung ist fehlgeschlagen. Du kannst nur ein Design hochladen, wenn du es auf ein vorhandenes Design ziehst."
@@ -53381,8 +53642,8 @@ msgstr "kann nicht geändert werden, wenn gemeinsam genutzte Runner aktiviert si
msgid "cannot be changed since member is associated with a custom role"
msgstr "kann nicht geändert werden, da das Mitglied mit einer benutzerdefinierten Rolle verknüpft ist"
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
-msgstr "kann nicht zu %{new_type} mit %{parent_type} als übergeordnetem Typ geändert werden."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
+msgstr "kann nicht in %{new_type} geändert werden, wenn eine Verbindung zu einem übergeordneten %{parent_type} besteht."
msgid "cannot be changed to %{new_type} with these child item types."
msgstr "kann nicht zu %{new_type} mit diesen untergeordneten Elementtypen geändert werden."
@@ -53433,7 +53694,7 @@ msgstr[0] "Checklistenpunkt"
msgstr[1] "Checklistenpunkte"
msgid "ci secure files"
-msgstr "ci sichere Dateien"
+msgstr "ci abgesicherte Dateien"
msgid "ciReport|%{criticalStart}critical%{criticalEnd}, %{highStart}high%{highEnd} and %{otherStart}others%{otherEnd}"
msgstr "%{criticalStart}kritisch%{criticalEnd}, %{highStart}hoch%{highEnd} und %{otherStart}andere%{otherEnd}"
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr "vor %{timeago} geschlossen"
msgid "closed issue"
-msgstr "Ticket geschlossen"
-
-msgid "collect usage information"
-msgstr "Nutzungsdaten sammeln"
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr "Kommentar"
@@ -54041,18 +54301,6 @@ msgstr[1] "Dateien"
msgid "finding is not found or is already attached to a vulnerability"
msgstr "Fund wurde nicht gefunden oder ist bereits mit einer Sicherheitslücke verknüpft."
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr "für %{link_to_merge_request} mit %{link_to_merge_request_source_branch}"
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr "für %{link_to_merge_request} mit %{link_to_merge_request_source_branch} in %{link_to_merge_request_target_branch}"
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr "für %{link_to_pipeline_ref}"
-
-msgid "for %{ref}"
-msgstr "für %{ref}"
-
msgid "for Workspace is required to be public"
msgstr "für den Arbeitsbereich ist erforderlich, um öffentlich zu sein"
@@ -54159,8 +54407,8 @@ msgstr "in"
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr "in %{duration} und wurde in die Warteschlange gestellt für %{queued_duration}"
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
-msgstr "in %{duration}, mit Compute-Credits %{compute_credits}, und wurde in die Warteschlange gestellt für %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
+msgstr ""
msgid "in group %{link_to_group}"
msgstr "In Gruppe %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr "In Gruppe %{link_to_group}"
msgid "in project %{link_to_project}"
msgstr "Im Projekt %{link_to_project}"
+msgid "incident"
+msgstr "Vorfall"
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] "Instanz abgeschlossen"
@@ -54264,7 +54515,7 @@ msgid "is read-only"
msgstr "ist schreibgeschützt"
msgid "is required to enable Code Suggestions"
-msgstr ""
+msgstr "ist erforderlich, um die Funktion Codevorschläge zu aktivieren"
msgid "is too long (%{current_value}). The maximum size is %{max_size}."
msgstr "ist zu lang (%{current_value}). Die maximale Länge beträgt %{max_size}."
@@ -54354,9 +54605,6 @@ msgstr "trotzdem laden"
msgid "loading"
msgstr "lädt"
-msgid "locked"
-msgstr "gesperrt"
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr "gesperrt durch %{path_lock_user_name} %{created_at}"
@@ -54422,10 +54670,10 @@ msgid "mrWidgetCommitsAdded|The changes were not merged into %{targetBranch}."
msgstr "Die Änderungen wurden nicht in zusammengeführt in %{targetBranch}."
msgid "mrWidgetNothingToMerge|Merge request contains no changes"
-msgstr ""
+msgstr "Merge Request enthält keine Änderungen."
msgid "mrWidgetNothingToMerge|Use merge requests to propose changes to your project and discuss them with your team. To make changes, use the %{boldStart}Code%{boldEnd} dropdown list above, then test them with %{linkStart}CI/CD%{linkEnd} before merging."
-msgstr ""
+msgstr "Benutze Merge Requests, um Änderungen an deinem Projekt vorzuschlagen und sie mit deinem Team zu besprechen. Um Änderungen vorzunehmen, verwende die obige Dropdown-Liste %{boldStart}Code%{boldEnd} und teste sie dann mit %{linkStart}CI/CD%{linkEnd}, bevor du sie zusammenführst."
msgid "mrWidget|%{boldHeaderStart}Looks like there's no pipeline here.%{boldHeaderEnd}"
msgstr "%{boldHeaderStart} Anscheinend gibt es hier keine Pipeline.%{boldHeaderEnd}"
@@ -54535,9 +54783,6 @@ msgstr "%{rules} ungültige Regel wurde automatisch genehmigt"
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr "%{rules} ungültige Regeln wurden automatisch genehmigt"
-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 "Ein Merge-Zug ist eine Liste von Merge Requests, die darauf warten, im Ziel-Branch zusammengeführt zu werden. Die Änderungen in jedem Merge Request werden mit den Änderungen in früheren Merge Requests kombiniert und vor der Zusammenführung getestet."
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr "Ein neuer Merge-Zug wurde gestartet. Dies ist der erste Merge Request in der Warteschlange."
@@ -54659,9 +54904,6 @@ msgstr "Merge fehlgeschlagen."
msgid "mrWidget|Merged by"
msgstr "Merged von"
-msgid "mrWidget|More information"
-msgstr "Weitere Informationen"
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr "Stelle ihn wieder her oder verwende einen anderen %{type}-Branch."
@@ -54725,17 +54967,17 @@ msgstr "Dieser Merge Request konnte nicht automatisch gemerged werden"
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr "Um diesen Merge Request zu genehmigen, gib bitte dein Passwort ein. Dieses Projekt erfordert die Authentifizierung aller Genehmigungen."
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
-msgstr "Um diese Standardmeldungen zu ändern, bearbeite die Vorlagen für die Merge- und Squash-Commit-Meldungen. %{linkStart}Mehr erfahren.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
+msgstr "Bearbeite die Vorlagen für die Merge- und Squash-Commit-Meldungen, um diese Standardmeldungen zu ändern. %{linkStart}Mehr erfahren%{linkEnd}."
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
-msgstr "Um diese Standardmeldungen zu ändern, bearbeite die Vorlagen für die Merge- und Squash-Commit-Meldungen. %{linkStart}Mehr erfahren.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
+msgstr "Bearbeite die Vorlage für Merge-Commit-Meldungen, um diese Standardmeldung zu ändern. %{linkStart}Mehr erfahren%{linkEnd}."
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
-msgstr "Um diese Standardnachricht zu ändern, bearbeite die Vorlage für Squash-Commit-Nachrichten. %{linkStart}Mehr erfahren.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
+msgstr "Bearbeite die Vorlage für Squash-Commit-Meldungen, um diese Standardnachricht zu ändern. %{linkStart}Mehr erfahren%{linkEnd}."
-msgid "mrWidget|What is a merge train?"
-msgstr "Was ist ein Merge-Zug?"
+msgid "mrWidget|Your merge request is almost ready!"
+msgstr "Dein Merge Request ist fast fertig!"
msgid "mrWidget|Your password"
msgstr "Dein Password"
@@ -54773,6 +55015,12 @@ msgstr "muss Bezug zu einer Gruppe oder Projekt haben"
msgid "must be at least 1 day"
msgstr "muss mindestens 1 Tag sein"
+msgid "must be before %{expiry_date}"
+msgstr "muss vor %{expiry_date} liegen"
+
+msgid "must be false when email confirmation setting is off"
+msgstr "muss falsch sein, wenn die E-Mail-Bestätigungseinstellung deaktiviert ist"
+
msgid "must be greater than start date"
msgstr "muss nach dem Anfangsdatum liegen"
@@ -54806,9 +55054,6 @@ msgstr "muss zum selben Projekt wie die Arbeitsaufgabe gehören."
msgid "must contain only a discord user ID."
msgstr "darf nur eine Discord-Benutzer(innen)-ID enthalten"
-msgid "must expire in 365 days"
-msgstr "muss in 365 Tagen ablaufen"
-
msgid "must have a repository"
msgstr "muss ein Repository haben"
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr "unterstützt nur gültige HTTP(S)-URLs"
msgid "open issue"
-msgstr "offenes Ticket"
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr "oder"
@@ -55157,7 +55404,7 @@ msgid "smartcn custom analyzer"
msgstr "smartcn benutzerdefinierter Analysator"
msgid "snippet"
-msgstr ""
+msgstr "Code-Schnipsel"
msgid "source"
msgstr "Quelle"
@@ -55216,6 +55463,9 @@ msgstr "Tag-Name"
msgid "terraform states"
msgstr "Terraform-Status"
+msgid "test case"
+msgstr "Testfall"
+
msgid "the correct format."
msgstr "das richtige Format."
@@ -55259,7 +55509,7 @@ msgid "triggered"
msgstr "ausgelöst"
msgid "triggered pipeline for commit %{linkStart}%{shortId}%{linkEnd}"
-msgstr ""
+msgstr "hat Pipeline für Commit %{linkStart}%{shortId}%{linkEnd} ausgelöst"
msgid "two-factor authentication settings"
msgstr "Einrichtung Zwei-Faktor-Authentifizierung"
@@ -55273,9 +55523,6 @@ msgstr "Typparameter fehlt und ist erforderlich"
msgid "unicode domains should use IDNA encoding"
msgstr "Unicode-Domains sollten IDNA-Kodierung verwenden"
-msgid "unlocked"
-msgstr "entsperrt"
-
msgid "updated"
msgstr "aktualisiert"
@@ -55371,7 +55618,7 @@ msgid "vulnerability|dismissed"
msgstr "verworfen"
msgid "was set to auto-merge by"
-msgstr ""
+msgstr "wurde auf Auto-Merge gesetzt von"
msgid "weekly"
msgstr "wöchentlich"
@@ -55400,9 +55647,6 @@ msgstr "Deine GitLab-Instanz"
msgid "your group (%{group_name})"
msgstr "Deine Gruppe (%{group_name})"
-msgid "your settings"
-msgstr "Deine Einstellungen"
-
msgid "yyyy-mm-dd"
msgstr "TT.MM.JJJJ"
diff --git a/locale/el_GR/gitlab.po b/locale/el_GR/gitlab.po
index e13fde47085..c400c639989 100644
--- a/locale/el_GR/gitlab.po
+++ b/locale/el_GR/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: el\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:44\n"
+"PO-Revision-Date: 2023-07-11 04:46\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/en_GB/gitlab.po b/locale/en_GB/gitlab.po
index 7fa02276adf..b671688a984 100644
--- a/locale/en_GB/gitlab.po
+++ b/locale/en_GB/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: en-GB\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:47\n"
+"PO-Revision-Date: 2023-07-11 04:49\n"
msgid " %{start} to %{end}"
msgstr " %{start} to %{end}"
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] "%d Approval"
msgstr[1] "%d Approvals"
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] "%d Module"
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] "%d assigned issue"
msgstr[1] "%d assigned issues"
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] "%d changed file"
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] "%d more comment"
msgstr[1] "%d more comments"
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr "%{count} related %{pluralized_subject}: %{links}"
-
msgid "%{count} selected"
msgstr "%{count} selected"
@@ -703,6 +705,9 @@ msgstr "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr "%{duration}ms"
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr "%{italic_start}What's new%{italic_end} is inactive and cannot be viewed.
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr "%{itemsCount} issues with a limit of %{maxIssueCount}"
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr "Skype"
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr "All eligible users"
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr "Assign myself"
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Filter by audit event type"
+msgstr ""
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr "Header"
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr "Maximum of %{number} HTTP headers has been reached."
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr "Value"
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr "Enable the Dependency Proxy and settings for clearing the cache."
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
+msgstr ""
+
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] "Failed jobs"
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr "The Jira user is not a site administrator. Check the permissions in Jira and try again."
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr "We could not find this element"
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
-msgstr ""
-
msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr "Pipeline %{pipeline_link} triggered by"
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
+msgstr ""
+
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr "Ordered list"
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr "Get started with runners"
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr "Store your files, plan your work, collaborate on code, and more."
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr "Summary / note"
msgid "Summary comment (optional)"
msgstr "Summary comment (optional)"
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr "The maximum amount of time users have to set up two-factor authentication before it's enforced."
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr "Something went wrong when trying to add a child. Please try again."
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr "closed %{timeago}"
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr "your GitLab instance"
msgid "your group (%{group_name})"
msgstr "your group (%{group_name})"
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/eo/gitlab.po b/locale/eo/gitlab.po
index 33190b73dc7..5a85acac17d 100644
--- a/locale/eo/gitlab.po
+++ b/locale/eo/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: eo\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:47\n"
+"PO-Revision-Date: 2023-07-11 04:50\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr "MesaÄo pri la enmetado"
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr "Enmeti"
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr "Priskribo"
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr "De la kreado de la problemo Äis la disponigado en la publika versio"
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr "De la kunfandado de la peto pri kunfando Äis la disponigado en la publika versio"
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr "La refreÅigo komenciÄis sukcese"
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr "Ne estas deponejo"
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr "Ĉenstablaj planoj"
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr "Åœaltitaj"
msgid "PipelineSchedules|All"
msgstr "Ĉiuj"
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr "Iri al branĉo/etikedo"
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr "Vidi la malfermitan peton pri kunfando"
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr "Ĉu vi volas vidi la datenojn? Bonvolu peti atingeblon de administranto."
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr "Nuligi la peton pri atingeblo"
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/es/gitlab.po b/locale/es/gitlab.po
index e10708585c2..bc36bc4e166 100644
--- a/locale/es/gitlab.po
+++ b/locale/es/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: es-ES\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:43\n"
+"PO-Revision-Date: 2023-07-11 04:46\n"
msgid " %{start} to %{end}"
msgstr " %{start} hasta %{end}"
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] "%d Módulo"
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] "%d archivo modificado"
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] "%d comentario más"
msgstr[1] "%d comentarios más"
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr "%{count} %{pluralized_subject} relacionados: %{links}"
-
msgid "%{count} selected"
msgstr "%{count} seleccionados"
@@ -703,6 +705,9 @@ msgstr "%{docs_link_start}¿Qué es el almacenamiento para grandes ficheros?%{do
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr "%{docs_link_start}¿Qué es la autenticación de dos factores?%{docs_link_end}"
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr "%{duration}ms"
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr "Las %{integrations_link_start}integraciones%{link_end} le permiten utilizar aplicaciones de terceros en su flujo de trabajo de GitLab. Si las integraciones disponibles no satisfacen sus necesidades. Puede considerar utilizar un %{webhooks_link_start}webhook%{link_end}."
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr "%{italic_start}Novedades%{italic_end} está inactivo y no se puede ver."
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr "%{itemsCount} incidencias con un límite de %{maxIssueCount}"
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr "%{spanStart}en la línea%{spanEnd} %{errorLine}%{errorColumn}"
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr "%{spanStart}en%{spanEnd} %{errorFn}"
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr "%{start} hasta %{end}"
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr "%{type} solo admite %{name} nombre"
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr "Avatar de %{userName}"
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr "Tokens de acceso"
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr "¿Está seguro?"
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr "Creado"
msgid "AccessTokens|Feed token"
msgstr "Token de Feed"
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr "Token de correo entrante"
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr "Tokens de acceso personal"
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr "Token de objeto estático"
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr "Son las únicas contraseñas aceptadas cuando tiene la autenticación de dos factores (2FA) habilitada."
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr "También puede utilizar los tokens de acceso personal para autenticarse contra Git a través de HTTP."
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr "Más información."
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr "Añadir una reunión de Zoom"
-msgid "Add a %{type}"
-msgstr "Añadir un %{type}"
-
msgid "Add a GCP region"
msgstr "Añadir una región de GCP"
@@ -2670,6 +2708,9 @@ msgstr "Añadir una nueva incidencia"
msgid "Add a numbered list"
msgstr "Añadir una lista numerada"
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr "Añadido en esta versión"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr "Se ha deshabilitado la opción de añadir nuevas aplicaciones en su instancia de GitLab. Póngase en contacto con su administrador de GitLab para obtener el permiso"
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr "Texto adicional para mostrar en la página de inicio de sesión"
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr "Dirección"
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Instance runners expiration"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr "Proteger las variables de CI/CD de forma predeterminada"
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr "Cuándo eliminar proyectos inactivos"
@@ -3822,9 +3848,6 @@ msgstr "AdminUsers|Información importante sobre el uso en su instancia de GitLa
msgid "AdminUsers|Is using seat"
msgstr "Está utilizando un asiento"
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr "¡Es usted!"
@@ -3870,6 +3893,9 @@ msgstr "Los proyectos personales, los grupos y el historial de usuario se quedar
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr "Al reactivar un usuario:"
@@ -3909,7 +3935,7 @@ msgstr "Skype"
msgid "AdminUsers|Sort by"
msgstr "Ordenar por"
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr "Después de una actualización correcta de la contraseña, será redirigido a la pantalla de inicio de sesión."
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr "Después de una actualización correcta de la contraseña, se le redirigirá a la página de inicio de sesión donde podrá iniciar sesión con su nueva contraseña."
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr "Feed de actividad"
msgid "AlertManagement|Alert"
msgstr "Alerta"
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
-msgstr "Se ha producido un error mientras se actualizaba la lista de asignados. Por favor, inténtelo de nuevo."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
+msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr "Prometheus"
-msgid "AlertSettings|Prometheus API base URL"
-msgstr "URL base del API de Prometheus"
-
msgid "AlertSettings|Reset Key"
msgstr "Restablecer clave"
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr "Todas las ramas"
msgid "All changes are committed"
msgstr "Se ha realizado commit de todos los cambios"
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr "Todos los usuarios elegibles"
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr "Se ha producido un error"
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr "Se ha producido un error al agregar un borrador a la discusión."
-
-msgid "An error occurred adding a new draft."
-msgstr "Se ha producido un error al añadir un nuevo borrador."
-
msgid "An error occurred creating the new branch."
msgstr "Se ha producido un error al crear una rama nueva."
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr "Se ha producido un error durante la comprobación de ruta del grupo. Por favor, actualice y vuelva a intentarlo."
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr "Se ha producido un error mientras al cargar el archivo."
@@ -4998,9 +5021,6 @@ msgstr "Se ha producido un error al cargar los proyectos."
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr "Se ha producido un error al cargar los datos. Por favor, inténtelo de nuevo."
-
msgid "An error occurred while loading the file"
msgstr "Se ha producido un error al cargar el archivo"
@@ -5117,9 +5137,6 @@ msgstr "Se ha producido un error al actualizar la configuración."
msgid "An error occurred while updating labels."
msgstr "Se ha producido un error al actualizar las etiquetas."
-msgid "An error occurred while updating the comment"
-msgstr "Se ha producido un error al actualizar el comentario"
-
msgid "An error occurred while updating the configuration."
msgstr "Se ha producido un error mientras se actualizaba la configuración."
@@ -5206,7 +5223,7 @@ msgstr "Se ha producido un error desconocido."
msgid "Analytics"
msgstr "Analíticas"
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr "Analizar sus dependencias en busca de vulnerabilidades conocidas."
@@ -5380,6 +5427,9 @@ msgstr "Y este token de registro:"
msgid "Anonymous"
msgstr "Anónimo"
+msgid "Anonymous user"
+msgstr ""
+
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"
@@ -6167,9 +6217,6 @@ msgstr "¿Está seguro? Eliminar esta clave GPG no afecta a los commits ya firma
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr "¿Está seguro de que desea continuar? Se cerrará la sesión en el dispositivo y todos los tokens serán revocados."
-msgid "Arrange charts"
-msgstr "Organizar gráficas"
-
msgid "Artifact"
msgstr "Artefacto"
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr "A medida que continuamos construyendo más características para SAST, nos gustaría conocer su opinión sobre la función de configuración SAST en %{linkStart}esta incidencia%{linkEnd}."
@@ -6309,8 +6359,8 @@ msgstr "Asignar a mi mismo"
msgid "Assign reviewer"
msgstr "Asignar revisor"
-msgid "Assign reviewer(s)"
-msgstr "Asignar revisores"
+msgid "Assign reviewers"
+msgstr ""
msgid "Assign severity"
msgstr "Asignar gravedad"
@@ -6368,9 +6418,6 @@ msgstr "El usuario asignado no tiene permisos"
msgid "Assignee lists not available with your current license"
msgstr "Las listas de asignaciones no se encuentran disponibles con su licencia actual"
-msgid "Assignee(s)"
-msgstr "Asignado(s)"
-
msgid "Assignees"
msgstr "Asignados"
@@ -6510,17 +6557,23 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr "Cancelar edición"
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
-msgstr "Eliminar %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
+msgstr ""
msgid "AuditStreams|Destination URL"
msgstr "URL de destino"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr "Los destinos reciben todos los datos del evento de auditoría"
-msgid "AuditStreams|Edit %{link}"
-msgstr "Editar %{link}"
-
msgid "AuditStreams|Event filtering (optional)"
msgstr ""
+msgid "AuditStreams|Filter by audit event type"
+msgstr ""
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
+msgstr ""
+
msgid "AuditStreams|Header"
msgstr "AuditStreams|Cabecera"
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr "Se alcanzó el número máximo de %{number} encabezados HTTP."
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr "AuditStreams|Valor"
msgid "AuditStreams|Verification token"
msgstr "Token de verificación"
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr "Ago"
@@ -7131,28 +7205,28 @@ msgstr "Facturación"
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr "Transferencia de 10 GB por mes"
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr "5 usuarios por espacio de nombres"
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr "Soporte"
msgid "BillingPlans|Talk to an expert today."
msgstr "Hable con un experto hoy mismo."
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr "Este grupo utiliza el mismo plan asociado que su grupo principal."
@@ -7350,10 +7427,7 @@ msgstr "Estamos aquí para ayudarle."
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ 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."
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr "Validar la cuenta"
msgid "Billings|Validate user account"
msgstr "Validar la cuenta de usuario"
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr "Se ha producido un error al crear la incidencia. Por favor, inténtelo d
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr "Se ha producido un error al crear la lista. Por favor, inténtelo de nuevo."
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr "Se ha producido un error al buscar los grupos secundarios. Por favor, inténtelo de nuevo."
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr "Se ha producido un error al obtener los proyectos del grupo. Por favor, inténtelo de nuevo."
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr "Se ha producido un error al obtener las incidencias. Por favor, vuelva a cargar la página."
@@ -7790,9 +7870,6 @@ msgstr "Expandir"
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr "Cargar más incidencias"
msgid "Board|Loading epics"
msgstr "Cargando épicas"
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr "Negrita"
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr "Por mes"
msgid "By quarter"
msgstr "Por trimestre"
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr "Por semana"
@@ -9010,11 +9102,11 @@ msgstr ""
msgid "Change assignee"
msgstr "Cambiar el asignado"
-msgid "Change assignee(s)"
-msgstr "Cambiar asignado(s)"
+msgid "Change assignees"
+msgstr ""
-msgid "Change assignee(s)."
-msgstr "Cambiar asignado(s)."
+msgid "Change assignees."
+msgstr ""
msgid "Change branches"
msgstr "Cambiar ramas"
@@ -9031,11 +9123,11 @@ msgstr "Cambiar el hito"
msgid "Change path"
msgstr "Cambiar la ruta"
-msgid "Change reviewer(s)"
-msgstr "Cambiar revisores"
+msgid "Change reviewers"
+msgstr ""
-msgid "Change reviewer(s)."
-msgstr "Cambiar revisores."
+msgid "Change reviewers."
+msgstr ""
msgid "Change role"
msgstr "Cambiar rol"
@@ -9058,8 +9150,11 @@ msgstr ""
msgid "Change your password"
msgstr "Cambia su contraseña"
-msgid "Change your password or recover your current one"
-msgstr "Cambia o recuperar su contraseña"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
+msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
@@ -9106,14 +9201,14 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
-msgstr "Asignado(s) cambiado(s)."
+msgid "Changed assignees."
+msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
-msgstr "Revisores cambiados."
+msgid "Changed reviewers."
+msgstr ""
msgid "Changed squash option to %{squash_option}"
msgstr ""
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr "Chat"
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr "$%{selectedPlanPrice} por cada 10 GB de almacenamiento por año"
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr "%{cardType} terminada en %{lastFourDigits}"
msgid "Checkout|%{name}'s GitLab subscription"
msgstr "Suscripción de GitLab de%{name}"
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr "plan %{selectedPlanText}"
@@ -9332,7 +9424,7 @@ msgstr "Ciudad"
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,12 +9565,12 @@ msgstr "Impuestos"
msgid "Checkout|Total"
msgstr "Total"
+msgid "Checkout|Total compute minutes: %{quantity}"
+msgstr ""
+
msgid "Checkout|Total storage: %{quantity} GB"
msgstr "Almacenamiento total: %{quantity} GB"
-msgid "Checkout|Total units of compute: %{quantity}"
-msgstr ""
-
msgid "Checkout|Users"
msgstr "Usuarios"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr "empresa o equipo"
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr "Elegir un tipo..."
msgid "Choose file…"
msgstr "Seleccione un archivo…"
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr "Seleccione el grupo de nivel superior para las importaciones de su repositorio."
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr "Clona este problema, sin comentarios, a %{project}."
msgid "Close"
msgstr "Cerrar"
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr "Cerrar %{issueType}"
@@ -10057,6 +10161,9 @@ msgstr "Cierra este %{quick_action_target}."
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr "Amazon EKS"
@@ -10737,9 +10841,6 @@ msgstr "¿Sabía usted?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr "Elastic Kubernetes Service"
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr "Habilita o inhabilita la conexión de GitLab con su clúster Kubernetes."
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr "Integración habilitada"
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr "Se está creando el clúster de Kubernetes..."
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr "Commit borrado"
msgid "Commit message"
msgstr "Mensaje del cambio"
-msgid "Commit message (optional)"
-msgstr "Mensaje de commit (opcional)"
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr "Estadísticas de los commits para %{ref} %{start_time} - %{end_time}"
-msgid "Commit to %{branchName} branch"
-msgstr "Commit en la rama %{branchName}"
-
msgid "CommitBoxTitle|Commit"
msgstr "Cambio"
@@ -11444,15 +11551,30 @@ msgstr "No hay nada que comparar."
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr "Comparar"
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr "Filtrar por revisión Git"
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr "Seleccionar revisión Git"
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr "Seleccione el proyecto objetivo"
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr "Completado"
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export full report as CSV"
+msgstr ""
+
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,15 +11878,15 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
+msgid "Compute minutes"
+msgstr ""
+
msgid "Compute quota"
msgstr ""
msgid "Compute quota:"
msgstr ""
-msgid "Confidence"
-msgstr "Confianza"
-
msgid "Confidential"
msgstr "Confidencial"
@@ -11807,9 +11941,6 @@ msgstr "Configurar los tiempos de espera de Gitaly."
msgid "Configure Integrations"
msgstr "Configurar integraciones"
-msgid "Configure Prometheus"
-msgstr "Configurar 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 ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr "Configurar la instalación existente"
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr "Conectando..."
-msgid "Connection failed"
-msgstr "Conexión fallida"
-
msgid "Connection failure"
msgstr "Error de conexión"
-msgid "Connection timed out"
-msgstr "Tiempo de espera agotado"
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr "Contribuciones para %{calendar_date}"
@@ -12662,9 +12814,6 @@ msgstr "Copiar enlace"
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr "Copiar enlace al gráfico"
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr "No es posible eliminar el disparador."
msgid "Could not restore the group"
msgstr "Se ha producido un error al restaurar el grupo"
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr "Crear %{environment}"
msgid "Create %{humanized_resource_name}"
msgstr "Crear %{humanized_resource_name}"
-msgid "Create %{type}"
-msgstr "Crear %{type}"
-
msgid "Create %{workspace} label"
msgstr "Crear etiqueta de %{workspace}"
@@ -12929,6 +13078,9 @@ msgstr "Crear un nuevo 'branch'"
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr "Cree un nuevo archivo ya todavía no hay archivos. Posteriormente, podrá confirmar los cambios con sus commits."
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr "Crear una nueva incidencia"
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr "Creando"
msgid "Creating epic"
msgstr "Creando épica"
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr "La creación de los gráficos utiliza los datos del servidor Prometheus. Si esta proceso tarda mucho tiempo, asegúrese de que los datos estén disponibles."
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr "Reducir"
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr "Eliminar variable"
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] "detectada %d vulnerabilidad"
msgstr[1] "detectadas %d vulnerabilidades"
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr "%{remainingLicensesCount} más"
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr "Empaquetador"
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr "exitoso"
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr "Bajar la prioridad de la etiqueta"
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr "Descripción"
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr "Descripción (opcional)"
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr "Descargar CSV"
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr "Descargar artefactos"
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr "Descargar codigos"
@@ -16664,6 +16837,9 @@ msgstr "Editar clave pública de despliegue"
msgid "Edit sidebar"
msgstr "Editar barra lateral"
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr "Editar tabla"
@@ -16769,6 +16945,9 @@ msgstr "No se ha podido enviar el correo electrónico"
msgid "Email display name"
msgstr "Nombre para mostrar en el correo electrónico"
+msgid "Email must be provided."
+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."
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr "Introduzca el nombre de su aplicación y le devolveremos un único %{type}."
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr "Introduzca su contraseña para aprobar"
msgid "Enterprise"
msgstr "Empresa"
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
+msgstr ""
+
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr "Trabajo"
-msgid "Environments|Learn about environments"
-msgstr "Obtenga más información sobre los entornos"
-
msgid "Environments|Learn more about stopping environments"
msgstr "Obtenga más información sobre cómo detener los entornos"
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr "Nuevo entorno"
-msgid "Environments|No deployed environments"
-msgstr "No hay entornos desplegados"
-
msgid "Environments|No deployments yet"
msgstr "Todavía no hay despliegues"
@@ -17585,12 +17755,6 @@ msgstr "Las tareas épicas le permiten administrar sus proyectos de manera más
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr "Añadir una nueva tarea épica"
@@ -17606,9 +17770,6 @@ msgstr "¿Está seguro de que desea eliminar %{bStart}%{targetIssueTitle}%{bEnd}
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr "Eliminar tarea épica"
@@ -18561,12 +18722,18 @@ msgstr[1] "Trabajos fallidos"
msgid "Failed on"
msgstr "Error en"
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr "Se ha producido un error al añadir una reunión de Zoom"
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr "Se ha producido un error al aplicar los comandos."
@@ -18605,9 +18772,6 @@ msgstr "Se ha producido un error al clonar este problema porque el proyecto obje
msgid "Failed to clone this issue: wrong parameters."
msgstr "Se ha producido un error al clonar este problema: parámetros incorrectos."
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr "Se ha producido un erro al crear una rama para esta incidencia. Por favor, inténtalo de nuevo."
@@ -18752,6 +18916,9 @@ msgstr "Se ha producido un error al eliminar una reunión de Zoom"
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr "Se ha producido un error al eliminar el mirror."
@@ -18773,6 +18940,9 @@ msgstr "Se ha producido un error al recuperar la página"
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr "Se ha producido un error al guardar las resoluciones de los conflictos producidos durante el merge. ¡Por favor, inténtelo de nuevo!"
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr "Se ha producido un error al guardar los nuevos ajustes"
@@ -18839,9 +19009,6 @@ msgstr "Se eliminará el favicon. ¿Seguro que quieres hacerlo?"
msgid "Feature Flags"
msgstr "Feature Flags"
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr "Archivos, directorios y submódulos en la ruta %{path} para la referencia del commit %{ref}"
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr "Para cada trabajo, clone el repositorio."
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr "Para trabajo general"
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr "De %{providerTitle}"
msgid "From issue creation until deploy to production"
msgstr "Desde la creación de la incidencia hasta el despliegue a producción"
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr "Desde la integración de la solicitud de fusión hasta el despliegue a producción"
@@ -19686,6 +19862,9 @@ msgstr "Generar nueva exportación"
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr "Primeros pasos con Gitlab"
msgid "Get started with error tracking"
msgstr "Comenzar con el control de errores"
-msgid "Get started with performance monitoring"
-msgstr "Comenzar con la monitorización de rendimiento"
-
msgid "Get started!"
msgstr "¡Empecemos!"
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr "https://gitpod.example.com"
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr "Incidencias que he creado"
msgid "GlobalSearch|Issues assigned to me"
msgstr "Incidencias asignadas a mí"
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr "Se están cargando los resultados de la búsqueda"
@@ -21319,9 +21510,6 @@ msgstr "Información del grupo:"
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr "Agrupar trabajos por"
@@ -21613,6 +21801,9 @@ msgstr "Token SCIM"
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr "La huella digital SHA1 del certificado de firma de tokens SAML. Puede obtener esta información de su proveedor de identidad, donde también se puede llamar \"Huella digital\"."
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr "incidente"
-
-msgid "HeaderAction|issue"
-msgstr "incidencia"
-
msgid "Headers"
msgstr "Encabezados"
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr "Ocultar proyectos archivados"
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] "Ocultar gráfico"
-msgstr[1] "Ocultar gráficos"
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr "Mantenimiento"
msgid "Housekeeping successfully started"
msgstr "Servicio de limpieza iniciado con éxito"
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr "¿Cómo configuro esta integración?"
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr "Incompleto"
msgid "Increase"
msgstr "Incrementar"
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,8 +24387,8 @@ msgstr "Insertar columna antes"
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
-msgstr "Insertar un enlace"
+msgid "Insert link (%{modifierKey}K)"
+msgstr ""
msgid "Insert or edit diagram"
msgstr ""
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr "Instala en los clústeres"
-
msgid "Installation"
msgstr "Instalación"
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr "¡Es usted!"
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr "Texto en cursiva"
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr "Trabajo %{jobName}"
msgid "Job Failed #%{build_id}"
msgstr "Trabajo fallido #%{build_id}"
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr "El trabajo está bloqueado. Por favor, compruebe los ejecutores."
msgid "Job logs and artifacts"
msgstr "Registros de las tareas y artefactos"
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr "Se reintentó el trabajo"
@@ -26071,6 +26287,9 @@ msgstr "No hay trabajos a mostrar"
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr "No se ha encontrado este elemento."
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr "Último acceso el"
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr "Enlace copiado"
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,8 +27526,8 @@ msgstr "Cargar más"
msgid "Loading snippet"
msgstr "Cargando fragmento de código"
-msgid "Loading the GitLab IDE..."
-msgstr "Cargando el IDE de GitLab..."
+msgid "Loading the GitLab IDE"
+msgstr ""
msgid "Loading, please wait."
msgstr ""
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr "Bloqueó la discusión."
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr "Bloquea la discusión."
@@ -27562,6 +27787,9 @@ msgstr "Administrar proyectos"
msgid "Manage two-factor authentication"
msgstr "Administrar autenticación de dos factores"
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr "Asigne una ID de cuenta de FogBugz a un usuario de GitLab"
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr "Marzo"
@@ -27652,6 +27883,9 @@ msgstr "Añadir texto en cursiva (%{modifierKey}I)"
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr "Añadir texto en cursiva (%{modifier_key}I)"
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,8 +28009,8 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
-msgstr "El tamaño máximo del archivo es de 200 KB."
+msgid "Max file size is 200 KiB."
+msgstr ""
msgid "Max role"
msgstr ""
@@ -27829,8 +28060,8 @@ msgstr "Tamaño máximo de los artefactos (MB)"
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
-msgstr "Tamaño máximo del archivo adjunto (MB)"
+msgid "Maximum attachment size (MiB)"
+msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
msgstr ""
@@ -27856,7 +28087,7 @@ msgstr "Retraso máximo (minutos)"
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr "Duración máxima de una sesión."
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr "Número máximo de %{name} (%{count}) excedido"
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,8 +28213,8 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
-msgstr "Tamaño máximo para los archivos a subir al ejecutar un comando push (MB)"
+msgid "Maximum push size (MiB)"
+msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
msgstr ""
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr "Aprobar los merge request"
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr "Se ha producido un error al guardar el borrador del comentario."
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr "Se ha producido un error al guardar el comentario"
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr "Ver el archivo @ %{commitId}"
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr "Ver el archivo reemplazado @ %{commitId}"
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr "comentado en el commit %{commitLink}"
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr "Métricas"
-
msgid "Metrics - Grafana"
msgstr "Métricas - Grafana"
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr "Añadir métrica"
-
-msgid "Metrics|Add panel"
-msgstr "Añadir panel"
-
-msgid "Metrics|Avg"
-msgstr "Avg"
-
-msgid "Metrics|Back to dashboard"
-msgstr "Metrics|Volver al tablero"
-
-msgid "Metrics|Cancel"
-msgstr "Cancelar"
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr "Consulte la documentación de CI/CD sobre la implementación en un entorno"
-
-msgid "Metrics|Collapse panel"
-msgstr "Contraer panel"
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr "Contraer panel (Esc)"
-
-msgid "Metrics|Copy YAML"
-msgstr "Copiar YAML"
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr "Metrics|Crear panel personalizado %{fileName}"
-
msgid "Metrics|Create metric"
msgstr "Crear métrica"
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr "Actual"
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr "Eliminar métrica"
msgid "Metrics|Delete metric?"
msgstr "¿Eliminar métrica?"
-msgid "Metrics|Duplicate"
-msgstr "Duplicado"
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr "Duplicar panel"
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr "Duplicando..."
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] "Editar métrica"
-msgstr[1] "Editar métricas"
-
-msgid "Metrics|Expand panel"
-msgstr "Expandir el panel"
+msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr "Para agrupar métricas similares"
-msgid "Metrics|Invalid time range, please verify."
-msgstr "Rango de tiempo inválido, por favor verifíquelo."
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr "Etiqueta del eje Y (normalmente la unidad). El eje X siempre representa el tiempo."
msgid "Metrics|Legend label (optional)"
msgstr "Leyenda de la etiqueta (opcional)"
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr "El link contiene una ventana de tiempo no válida, por favor compruébelo para poder ver el rango de tiempo solicitado."
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr "Max"
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr "Min"
-
-msgid "Metrics|More actions"
-msgstr "Más acciones"
-
msgid "Metrics|Must be a valid PromQL query."
msgstr "Debe ser una consulta PromQL válida."
msgid "Metrics|New metric"
msgstr "Nueva métrica"
-msgid "Metrics|Open repository"
-msgstr "Abrir repositorio"
-
-msgid "Metrics|Panel YAML"
-msgstr "Panel YAML"
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr "La consulta PromQL es válida"
msgid "Metrics|Prometheus Query Documentation"
msgstr "Documentción sobre las consultas de Prometheus"
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr "Metrics|Actualizar el tablero"
-
-msgid "Metrics|Select a value"
-msgstr "Seleccione un valor"
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr "Metrics|Se ha producido un error al crear el tablero."
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr "Se ha producido un error al recuperar los datos de los distintos entornos, por favor inténtelo de nuevo"
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr "Se ha producido un error al obtener información sobre los despliegues."
-
-msgid "Metrics|There was an error getting environments information."
-msgstr "Se ha producido un error al obtener información sobre los entornos."
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr "Se ha producido un error al intentar validar su consulta"
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr "Se ha producido un error al obtener las métricas"
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr "Se ha producido una respuesta inesperada de los datos de las métricas desde el endpoint de Prometheus"
-
msgid "Metrics|Unit label"
msgstr "Etiqueta de las unidades"
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr "Utilizado como título para el gráfico"
@@ -28980,24 +29062,12 @@ msgstr "Se utiliza si la consulta devuelve una sola serie. Si devuelve varias se
msgid "Metrics|Validating query"
msgstr "Validando consulta"
-msgid "Metrics|Values"
-msgstr "Nombre"
-
-msgid "Metrics|View documentation"
-msgstr "Ver la documentación"
-
msgid "Metrics|Y-axis label"
msgstr "Etiqueta del eje Y"
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr "Está a punto de eliminar permanentemente esta métrica. Esta acción no se puede deshacer."
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr "Por ejemplo, solicitudes HTTP"
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr "Cerrar"
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr "Modificado"
@@ -29480,9 +29556,6 @@ msgstr "Más información"
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr "ID del namespace :"
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr "No se necesita tarjeta de crédito."
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr "No se han encontrado datos"
-
-msgid "No data to display"
-msgstr "No hay ningún dato para mostrar"
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr "Ningún ref seleccionado"
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr "No hay repositorio"
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr "No hay ningún favorito que coincida con su búsqueda"
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr "Nota"
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
-msgstr ""
-
msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr "Pipeline %{pipeline_link} activado por"
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
+msgstr ""
+
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr "Número de réplicas"
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr "OK"
@@ -32006,6 +32088,12 @@ msgstr "Lista ordenada"
msgid "Organizations"
msgstr "Organización"
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr "Miembro huérfano"
@@ -32527,6 +32615,18 @@ msgstr "Nivel de proyecto"
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr "Programaciones de los Pipelines"
msgid "Pipeline URL"
msgstr "URL del pipeline"
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr "Activos"
msgid "PipelineSchedules|All"
msgstr "Todos"
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr "Este proyecto no está configurado para ejecutar pipelines."
msgid "Pipelines|Token"
msgstr "Token"
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr "error"
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr "no válido"
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr "Por favor, confirme su dirección de correo electrónico"
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr "Póngase en contacto con un administrador para registrar ejecutores."
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,8 +34349,8 @@ msgstr "Por favor inténtelo de nuevo"
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
-msgstr "Por favor, escriba %{phrase_code} para continuar o cierre esta ventana modal para cancelar."
+msgid "Please type %{phrase_code} to proceed."
+msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
msgstr ""
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr "Encendido"
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 "Está a punto de eliminar permanentemente %{yourAccount}, y todas las incidencias, solicitudes de fusión y grupos vinculados a su cuenta. Una vez que confirme %{deleteAccount}, no se podrá deshacerse esta acción ni recuperar los datos borrados."
+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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr "Está a punto de renombrar el usuario %{currentUsernameBold} a %{newUsernameBold}. El perfil del usuario y los proyectos serán redirigidos al espacio de nombres %{newUsername} pero este redireccionamiento caducará una vez que otro usuario o grupo registre el %{currentUsername}. Por favor, actualice los remotos de su repositorio Git tan pronto como sea posible."
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr "Información del proyecto"
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr "Miembros del proyecto"
@@ -35986,18 +36107,6 @@ msgstr "Interno"
msgid "ProjectSettings|Issues"
msgstr "Incidencias"
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr "Promocionar a etiqueta de grupo"
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr "Solo se pueden promover los hitos del proyecto."
@@ -36745,6 +36848,9 @@ msgstr "Incidencia promocionada a tarea épica."
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr "Consulta"
-msgid "Query cannot be processed"
-msgstr "Se ha producido un error al procesar la consulta"
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr "Su grupo de GitLab"
-
-msgid "Registration|Your first project"
-msgstr "Su primer proyecto"
-
-msgid "Registration|Your profile"
-msgstr "Su perfil"
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr "Eliminar reunión de Zoom."
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
-msgstr "Eliminar todos los asignados o los asignados específicos"
+msgid "Remove all or specific assignees"
+msgstr ""
msgid "Remove all or specific label(s)"
msgstr "Eliminar todas las etiquetas o las etiquetas específicas"
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr "Renovar la suscripción"
msgid "Reopen"
msgstr "Volver a abrir"
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr "Reabrir %{issueType}"
@@ -38331,6 +38428,9 @@ msgstr "Reabrir este%{quick_action_target}"
msgid "Reopened this %{quick_action_target}."
msgstr "Reabrió este %{quick_action_target}."
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr "Reemplazar todas las etiquetas"
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr "El repositorio debe contener al menos 1 archivo."
msgid "Repository size is above the limit."
msgstr "El tamaño del repositorio está por encima del límite."
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] "Revisor"
msgstr[1] "%d Revisores"
-msgid "Reviewer(s)"
-msgstr "Revisor(es)"
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr "Rol"
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr "Restaurar"
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr "Ruby"
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr "Runners|Empezar con los ejecutores"
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr "Guardando"
msgid "Saving project."
msgstr "Guardar proyecto."
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr "Seleccione un proyecto"
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr "Este proyecto"
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr "Para ampliar su búsqueda, cambie los filtros anteriores o seleccione un proyecto de política de seguridad diferente."
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr "Se ha producido un error al añadir el comentario."
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr "Se ha producido un error al crear la incidencia."
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr "Seleccionar asignado"
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,11 +42177,17 @@ msgstr ""
msgid "Select projects"
msgstr "Seleccione los proyectos"
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
-msgstr "Seleccionar revisor(es)"
+msgid "Select reviewers"
+msgstr ""
msgid "Select severity (optional)"
msgstr ""
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr "Mostrar el registro completo sin procesar"
msgid "Show details"
msgstr "Mostrar detalles"
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr "Mostrar el explorador de archivos"
msgid "Show file contents"
msgstr "Mostrar el contenido del archivo"
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,8 +43147,8 @@ msgstr "Tamaño"
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
-msgstr "Límite de tamaño por repositorio (MB)"
+msgid "Size limit per repository (MiB)"
+msgstr ""
msgid "Skip to main content"
msgstr ""
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr "Se ha enviado el registro de spam correctamente."
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr "No se puede usar la URL especificada: \"%{reason}\""
@@ -43874,9 +44086,6 @@ msgstr "Comenzar hilo interno"
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr "Documentación de configuración"
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr "Manténgase informado sobre el rendimiento y la salud de su entorno mediante la configuración dePrometheus para monitorizar sus despliegues."
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr "Paso %{currentStep} de %{stepCount}"
@@ -44129,7 +44335,7 @@ msgstr "Desconocido"
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr "Resumen / nota"
msgid "Summary comment (optional)"
msgstr "Comentario de resumen (opcional)"
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr "Cambiar rama/etiqueta"
msgid "Switch to GitLab Next"
msgstr "Cambiar a GitLab Next"
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr "protegido"
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr "El comando Terraform init"
-msgid "Terraform|Terraform reports"
-msgstr "Informes de Terraform"
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr "El gestor de incidencias es el lugar para añadir cosas que necesitan se
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr "El gestor de incidencias es el lugar para añadir cosas que necesitan ser mejoradas o resueltas en un proyecto. Puede registrarse o iniciar sesión para crear incidencias para este proyecto."
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr "La incidencia actual"
msgid "The current user is not authorized to access the job log."
msgstr "El usuario actual no está autorizado a acceder al registro de ejecución del trabajo."
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr "La licencia que ha subido no es válida. Si el problema persiste, pónga
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr "El tamaño máximo de archivo permitido es de %{size}."
@@ -45872,9 +46099,6 @@ msgstr "El tamaño máximo del archivo es %{size}."
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr "Los conflictos en el merge para este merge request no se pueden resolver a través de GitLab. Por favor, intente resolverlos localmente."
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr "Se puede acceder al fragmento de código sin necesidad ningún tipo de autenticación."
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr "El fragmento de código sólo es visible por mí."
@@ -46229,6 +46456,9 @@ msgstr "Se ha producido un problema al obtener los emojis."
msgid "There was a problem fetching epics."
msgstr "Se ha producido un problema al recuperar las tareas épicas."
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr "Se ha producido un problema al recuperar los grupos."
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr "Se ha producido un error con reCAPTCHA. Por favor, resuelva el reCAPTCHA de nuevo."
@@ -46580,6 +46813,9 @@ 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 "Este commit es parte de un merge request %{link_to_merge_request}. Los comentarios creados aquí se crearán en el contexto del merge request."
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
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."
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr "Este pipeline utiliza una configuración de CI/CD predefinida habilitada por %{strongStart}Auto DevOps.%{strongEnd}"
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr "solo ahora"
msgid "Timeago|right now"
msgstr "justo ahora"
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr "Título:"
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr "Títulos y descripciones"
-
msgid "To"
msgstr "Para"
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr "Para garantizar que no se pierda el contenido personal, esta cuenta solo debe utilizarse para asuntos relacionados con %{group_name}."
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr "Para importar un repositorio SVN, puede ver %{svn_link}."
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr "Para configurar la autenticación SAML para su grupo a través de un proveedor de identidad como Azure, Okta, Onelogin, Ping Identity o su proveedor SAML 2.0 personalizado:"
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr "Para especificar el nivel de notificación por proyecto de un grupo al q
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr "Ocultar barra lateral"
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr "Mostrar/ocultar los comentarios para este archivo"
@@ -47870,6 +48106,9 @@ msgstr "Cambiar la descripción del commit"
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr "Mañana"
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr "Total"
@@ -48327,12 +48563,6 @@ msgstr "Teclee para buscar"
msgid "URL"
msgstr "URL"
-msgid "URL cannot be blank"
-msgstr "La URL no puede estar en blanco"
-
-msgid "URL is invalid"
-msgstr "La URL no es válida"
-
msgid "URL is required"
msgstr "Se requiere la URL"
@@ -48390,9 +48620,6 @@ msgstr "No se puede recopilar la información de la CPU"
msgid "Unable to collect memory info"
msgstr "No se puede recopilar la información de la memoria"
-msgid "Unable to connect to Prometheus server"
-msgstr "No se ha podido conectar con el servidor de Prometheus"
-
msgid "Unable to connect to server: %{error}"
msgstr "Imposible conectar con el servidor: %{error}"
@@ -48576,9 +48803,6 @@ msgstr "Desafortunadamente, su mensaje de correo electrónico a GitLab no pudo s
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr "Desbloquear"
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr "Desbloqueado"
msgid "Unlocked the discussion."
msgstr "Desbloqueó la discusión."
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr "Desbloquea la discusión."
@@ -48660,9 +48887,6 @@ msgstr "Inalcanzable"
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr "Tipo de clúster no reconocido"
-
msgid "Unresolve"
msgstr "Sin resolver"
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr "Pipelines"
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr "El usuario no tiene una solicitudes pendientes"
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr "Actividad"
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr "Proyectos contribuidos"
msgid "UserProfile|Copy user ID"
msgstr "Copiar ID de usuario"
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr "Editar perfil"
@@ -49658,6 +49897,9 @@ msgstr "Este usuario no está siguiendo a otros usuarios."
msgid "UserProfile|Unconfirmed user"
msgstr "Usuario no confirmado"
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr "ID del usuario: %{id}"
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr "Verificar la configuración SAML"
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr "Verificar la configuración"
-
msgid "Version"
msgstr "Versión"
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] "Ver gráfico"
-msgstr[1] "Ver gráficos"
-
msgid "View dependency details for your project"
msgstr "Ver los detalles de las dependencia para su proyecto"
@@ -50163,9 +50397,6 @@ msgstr "Ver archivo @ "
msgid "View file @ %{commitSha}"
msgstr "Ver archivo @ %{commitSha}"
-msgid "View full dashboard"
-msgstr "Ver el tablero completo"
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr "Ver solicitud de fusión abierta"
msgid "View page @ "
msgstr "Ver página @ "
-msgid "View performance dashboard."
-msgstr "Ver el tablero de rendimiento."
-
msgid "View project in admin area"
msgstr "Ver el proyecto en el área de administración"
@@ -50240,6 +50468,9 @@ msgstr "Ver archivo reemplazado @ "
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr "Ver idiomas y marcos soportados"
@@ -50252,9 +50483,6 @@ msgstr "Ver documentación"
msgid "View the latest successful deployment to this environment"
msgstr "Vea la última despliegue con éxito en este entorno"
-msgid "View the performance dashboard at"
-msgstr "Ver el tablero de rendimiento en"
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr "Comentarios"
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr "Identificador"
@@ -50738,6 +50972,9 @@ msgstr "Severidad"
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr "Estado"
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr "Esperar por los datos de rendimiento"
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr "¿Quieres ver los datos? Por favor pide acceso al administrador."
@@ -50837,9 +51071,6 @@ msgstr "No hemos podido encontrar ningún %{scope} que coincida con %{term} en e
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr "No hemos podido encontrar ningún %{scope} que coincida con %{term} en el proyecto %{project}"
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr "No ha sido posible conectar al servidor de Prometheus. O el servidor ya no existe o debe actualizar los detalles de configuración."
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr "Hemos detectado spam potencial en %{humanized_resource_name}. Por favor resuelva el reCAPTCHA para poder continuar."
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr "¿Qué se enumera aquí?"
msgid "What is repository mirroring?"
msgstr "¿Qué es la duplicación de repositorios?"
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr "Retirar solicitud de acceso"
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr "Se ha producido un error al intentar añadir un trabajo hijo. Por favor,
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr "Está conectado al servidor de Prometheus, pero actualmente no hay datos disponibles para mostrar."
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr "Actualmente está desconectado, o la instancia de GitLab no es accesible."
@@ -52374,6 +52617,9 @@ msgstr "No puedes escribir en una instancia secundaria de sólo lectura de GitLa
msgid "You cannot write to this read-only GitLab instance."
msgstr "No puede escribir en esta instancia de sólo lectura de GitLab."
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr "¡Su dispositivo WebAuthn se ha registrado correctamente!"
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr "Su solicitud de acceso a %{source_type} ha sido retirada."
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,8 +53182,8 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr "Se ha producido un error al enviar su comentario. Por favor, compruebe su conexión de red y vuelva a intentarlo."
-msgid "Your comment could not be updated! Please check your network connection and try again."
-msgstr "Se ha producido un error al editar su comentario. Por favor, compruebe su conexión de red y vuelva a intentarlo."
+msgid "Your comment could not be updated because %{reason}."
+msgstr ""
msgid "Your comment will be discarded."
msgstr "Su comentario será descartado."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr "cerrado %{timeago}"
msgid "closed issue"
-msgstr "incidencia cerrada"
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr "comentario"
@@ -54041,18 +54301,6 @@ msgstr[1] "archivos"
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr "para %{link_to_merge_request} con %{link_to_merge_request_source_branch}"
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr "para %{link_to_merge_request} con %{link_to_merge_request_source_branch} en %{link_to_merge_request_target_branch}"
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr "para %{link_to_pipeline_ref}"
-
-msgid "for %{ref}"
-msgstr "para %{ref}"
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr "en"
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr "en el grupo %{link_to_group}"
msgid "in project %{link_to_project}"
msgstr "en el proyecto %{link_to_project}"
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] "instancia completada"
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr "cargando"
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr "bloqueado por %{path_lock_user_name} %{created_at}"
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr "Merge fallido."
msgid "mrWidget|Merged by"
msgstr "Merge realizado por"
-msgid "mrWidget|More information"
-msgstr "Más información"
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr "Esta merge request no se realizó automáticamente"
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr "para aprobar este merge request, por favor introduzca su contraseña. Este proyecto requiere de todas las aprobaciones para ser autenticado."
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr "debe ser mayor que la fecha de inicio"
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr "incidencia abierta"
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr "o"
@@ -55216,6 +55463,9 @@ msgstr "nombre de la etiqueta"
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr "los dominios unicode deben utilizar codificación IDNA"
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr "actualizado"
@@ -55400,9 +55647,6 @@ msgstr "su instancia de GitLab"
msgid "your group (%{group_name})"
msgstr "su grupo (%{group_name})"
-msgid "your settings"
-msgstr "sus ajustes"
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/et_EE/gitlab.po b/locale/et_EE/gitlab.po
index abcc1c848aa..8a45ceb0d08 100644
--- a/locale/et_EE/gitlab.po
+++ b/locale/et_EE/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: et\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:47\n"
+"PO-Revision-Date: 2023-07-11 04:49\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/fa_IR/gitlab.po b/locale/fa_IR/gitlab.po
index 8d2fc8250a2..fa6e273ed58 100644
--- a/locale/fa_IR/gitlab.po
+++ b/locale/fa_IR/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: fa\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:46\n"
+"PO-Revision-Date: 2023-07-11 04:49\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/fi_FI/gitlab.po b/locale/fi_FI/gitlab.po
index c786770ece7..63de111b8ae 100644
--- a/locale/fi_FI/gitlab.po
+++ b/locale/fi_FI/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: fi\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:44\n"
+"PO-Revision-Date: 2023-07-11 04:46\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/fil_PH/gitlab.po b/locale/fil_PH/gitlab.po
index 22df51e48a0..9a6e037aba2 100644
--- a/locale/fil_PH/gitlab.po
+++ b/locale/fil_PH/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: fil\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:47\n"
+"PO-Revision-Date: 2023-07-11 04:50\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/fr/gitlab.po b/locale/fr/gitlab.po
index ef4e13f53c1..6801526810a 100644
--- a/locale/fr/gitlab.po
+++ b/locale/fr/gitlab.po
@@ -14,10 +14,10 @@ msgstr ""
"X-Crowdin-Language: fr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 06:14\n"
+"PO-Revision-Date: 2023-07-11 04:46\n"
msgid " %{start} to %{end}"
-msgstr " %{start} à %{end}"
+msgstr " %{start} au %{end}"
msgid " (from %{timeoutSource})"
msgstr " (depuis %{timeoutSource})"
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] "%d Approbation"
msgstr[1] "%d Approbations"
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] "%d ticket"
+msgstr[1] "%d tickets"
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] "%d requête de fusion"
+msgstr[1] "%d requêtes de fusion"
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] "%d Module"
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] "%d ticket assigné"
msgstr[1] "%d tickets assignés"
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] "%d fichier modifié"
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] "%d autre commentaire"
msgstr[1] "%d autres commentaires"
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] "%d paquet"
@@ -658,14 +663,11 @@ msgid_plural "%{count} projects"
msgstr[0] "%{count} projet"
msgstr[1] "%{count} projets"
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr "%{count} %{pluralized_subject} associée(s) : %{links}"
-
msgid "%{count} selected"
msgstr "%{count} sélectionné"
msgid "%{count} tags"
-msgstr "%{count} étiquettes"
+msgstr "%{count} étiquettes"
msgid "%{count} total weight"
msgstr "%{count} poids total"
@@ -695,7 +697,7 @@ msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
msgstr "%{docs_link_start}En savoir plus sur les niveaux de visibilité.%{docs_link_end}"
msgid "%{docs_link_start}Setting up a verified domain%{docs_link_end} requires being linked to a project."
-msgstr "La %{docs_link_start}mise en œuvre d'un domaine vérifié%{docs_link_end} impose que celui-ci soit lié à un projet."
+msgstr "La %{docs_link_start}mise en œuvre d'un domaine vérifié%{docs_link_end} impose que celui-ci soit associé à un projet."
msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
msgstr "%{docs_link_start}Qu'est-ce que le stockage de fichiers volumineux ?%{docs_link_end}"
@@ -703,6 +705,9 @@ msgstr "%{docs_link_start}Qu'est-ce que le stockage de fichiers volumineux ?%{d
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr "%{docs_link_start}Qu'est-ce que l'authentification à deux facteurs ?%{docs_link_end}"
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr "%{duration}, mis en file d'attente pendant %{queuedDuration} secondes"
+
msgid "%{duration}ms"
msgstr "%{duration} ms"
@@ -775,8 +780,11 @@ msgstr "%{human_readable_key} comporte moins de %{min_value_length} caractères
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr "Les %{integrations_link_start}intégrations%{link_end} vous permettent d'inclure des applications tierces à votre flux de travail GitLab. Si les intégrations disponibles ne répondent pas à vos besoins, envisagez l'utilisation d'un %{webhooks_link_start}crochet Web%{link_end}."
-msgid "%{issuableDisplayName} %{lockStatus}."
-msgstr "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr "%{issuableDisplayName} verrouillé."
+
+msgid "%{issuableDisplayName} unlocked."
+msgstr "%{issuableDisplayName} déverrouillé."
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} sera supprimé ! Êtesâ€vous sûr de vouloir continuer ?"
@@ -799,8 +807,11 @@ msgstr "Les %{italic_start}Nouveautés%{italic_end} ne sont pas actives et ne pe
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr "%{itemsCount} tickets avec une limite de %{maxIssueCount}"
+msgid "%{jobName} job is being retried"
+msgstr "%{jobName} job est en cours de nouvelle tentative"
+
msgid "%{jobs} Jobs"
-msgstr "%{jobs} tâches"
+msgstr "%{jobs} jobs"
msgid "%{key} is not a valid URL."
msgstr "%{key} n'est pas une URL valide."
@@ -893,7 +904,7 @@ msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
msgstr "%{lock_path} est verrouillé par l'utilisateur GitLab %{lock_user_id}"
msgid "%{locked} created %{timeago}"
-msgstr ""
+msgstr "%{locked} créé %{timeago}"
msgid "%{mergeLength}/%{usersLength} can merge"
msgstr "%{mergeLength}/%{usersLength} peuvent fusionner"
@@ -908,7 +919,7 @@ msgid "%{milliseconds}ms"
msgstr "%{milliseconds} ms"
msgid "%{minutesUsed} units"
-msgstr "%{minutesUsed} unités"
+msgstr "%{minutesUsed} unités"
msgid "%{model_name} not found"
msgstr "%{model_name} introuvable"
@@ -1076,7 +1087,7 @@ msgstr[1] "Les résultats de %{securityScanner} ne sont pas disponibles, car auc
msgid "%{selectedLabelsCount} label"
msgid_plural "%{selectedLabelsCount} labels"
-msgstr[0] "%{selectedLabelsCount} étiquette"
+msgstr[0] "%{selectedLabelsCount} label"
msgstr[1] "%{selectedLabelsCount} labels"
msgid "%{selectedProjectsCount} project"
@@ -1085,7 +1096,7 @@ msgstr[0] "%{selectedProjectsCount} projet"
msgstr[1] "%{selectedProjectsCount} projets"
msgid "%{size} B"
-msgstr ""
+msgstr "%{size} o"
msgid "%{size} GiB"
msgstr "%{size} Gio"
@@ -1114,35 +1125,41 @@ msgstr "%{spanStart}à la ligne%{spanEnd} %{errorLine}%{errorColumn}"
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr "%{spanStart}dans%{spanEnd} %{errorFn}"
+msgid "%{startDate} – %{dueDate}"
+msgstr "%{startDate}-%{dueDate}"
+
+msgid "%{startDate} – No due date"
+msgstr "%{startDate}-Aucune date d'échéance"
+
msgid "%{start} to %{end}"
msgstr "%{start} au %{end}"
msgid "%{statusStart}Dismissed%{statusEnd}"
-msgstr ""
+msgstr "%{statusStart}a rejeté%{statusEnd}"
msgid "%{statusStart}Dismissed%{statusEnd} at %{projectLink}"
-msgstr ""
+msgstr "%{statusStart}a rejeté%{statusEnd} à %{projectLink}"
msgid "%{statusStart}Dismissed%{statusEnd} on pipeline %{pipelineLink}"
-msgstr ""
+msgstr "%{statusStart}a rejeté%{statusEnd} sur le pipeline %{pipelineLink}"
msgid "%{statusStart}Dismissed%{statusEnd} on pipeline %{pipelineLink} at %{projectLink}"
-msgstr ""
+msgstr "%{statusStart}A rejeté%{statusEnd} sur le pipeline %{pipelineLink} à %{projectLink}"
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason}"
-msgstr ""
+msgstr "%{statusStart}a rejeté%{statusEnd} : %{dismissalReason}"
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} at %{projectLink}"
-msgstr ""
+msgstr "%{statusStart}a rejeté%{statusEnd} : %{dismissalReason} à %{projectLink}"
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink}"
-msgstr ""
+msgstr "%{statusStart}a rejeté%{statusEnd} : %{dismissalReason} sur le pipeline %{pipelineLink}"
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
-msgstr ""
+msgstr "%{statusStart}a rejeté%{statusEnd} : %{dismissalReason} sur le pipeline %{pipelineLink} à %{projectLink}"
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
-msgstr "%{strongOpen}Avertissement :%{strongClose} les liens de groupe SAML peuvent conduire GitLab à retirer automatiquement des membres de certains groupes."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
+msgstr "%{strongOpen}Avertissement :%{strongClose} les liens de groupe SAML peuvent conduire GitLab à modifier les rôles des membres et à retirer automatiquement des membres de certains groupes."
msgid "%{strongStart}%{count}%{strongEnd} commit"
msgid_plural "%{strongStart}%{count}%{strongEnd} commits"
@@ -1263,9 +1280,6 @@ msgstr "%{type} ne prend en charge que le nom %{name}"
msgid "%{url} (optional)"
msgstr "%{url} (facultatif)"
-msgid "%{userName} (cannot merge)"
-msgstr "%{userName} (ne peut pas fusionner)"
-
msgid "%{userName}'s avatar"
msgstr "Avatar de %{userName}"
@@ -1360,7 +1374,7 @@ msgid "'projects' is not yet supported"
msgstr "« projets » n'est pas encore pris en charge"
msgid "'schemaVersion' '%{given_version}' is not supported, it must be '%{required_version}'"
-msgstr ""
+msgstr "La « schemaVersion » « %{given_version} » n'est pas supportée, elle doit être « %{required_version} »"
msgid "'starterProjects' is not yet supported"
msgstr "« starterProjects » n'est pas encore pris en charge"
@@ -1539,7 +1553,7 @@ msgid "/day"
msgstr "/jour"
msgid "0 B"
-msgstr ""
+msgstr "0 o"
msgid "1 Code quality finding"
msgid_plural "%d Code quality findings"
@@ -1723,7 +1737,7 @@ msgid "A %{incident_docs_start}modified issue%{incident_docs_end} to guide the r
msgstr "Un %{incident_docs_start}ticket modifié%{incident_docs_end} pour guider la résolution des incidents."
msgid "A %{linkStart}merge train%{linkEnd} is a queued list of merge requests, each waiting to be merged into the target branch."
-msgstr "Un %{linkStart}train de fusion%{linkEnd} est une liste de requêtes de fusion en file d'attente, chacune d'elles attendant d'être fusionnée dans la branche cible."
+msgstr "Un %{linkStart}train de fusion%{linkEnd} est une liste de requêtes de fusion en file d'attente, chacune d'elles attentant d'être fusionnée dans la branche cible."
msgid "A .NET Core console application template, customizable for any .NET Core project"
msgstr "Un modèle d'application de console .NET Core, personnalisable pour tout projet .NET Core"
@@ -1939,16 +1953,22 @@ msgid "AI|Features that use third-party AI services require transmission of data
msgstr "Les fonctionnalités qui utilisent des services d'IA tiers nécessitent la transmission de données, y compris des données personnelles."
msgid "AI|For example: Organizations should be able to forecast into the future by using value stream analytics charts. This feature would help them understand how their metrics are trending."
-msgstr ""
+msgstr "Par exemple : les entreprises devraient être en mesure de faire des prévisions grâce aux graphiques analytiques de la chaîne de valeur. Cette fonctionnalité les aiderait à comprendre comment évoluent leurs métriques."
msgid "AI|Helpful"
msgstr "Utile"
msgid "AI|I don't see how I can help. Please give better instructions!"
-msgstr "Je ne vois pas comment je peux aider. Veuillez fournir de meilleures instructions !"
+msgstr "Je ne vois pas comment je peux aider. Veuillez fournir de meilleures instructions !"
+
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr "Peut fournir des réponses inappropriées ne représentant pas les opinions de GitLab. Ne saisissez pas de données personnelles."
+
+msgid "AI|New chat"
+msgstr "Nouveau chat"
msgid "AI|Populate issue description"
-msgstr ""
+msgstr "Remplir la description du ticket"
msgid "AI|Responses generated by AI"
msgstr "Réponses générées par l'IA"
@@ -1963,7 +1983,7 @@ msgid "AI|The container element wasn't found, stopping AI Genie."
msgstr "L'élément du conteneur n'a pas été trouvé, ce qui a interrompu AI Genie."
msgid "AI|The existing description will be replaced when you submit."
-msgstr ""
+msgstr "La description existante sera remplacée lors de la soumission."
msgid "AI|There is too much text in the chat. Please try again with a shorter text."
msgstr "Il y a trop de texte dans la discussion par chat. Veuillez réessayer avec un texte plus court."
@@ -1987,7 +2007,7 @@ msgid "AI|What does the selected code mean?"
msgstr "Que signifie le code sélectionné ?"
msgid "AI|Write a brief description and have AI fill in the details."
-msgstr ""
+msgstr "Rédigez une brève description et l'IA complètera les détails."
msgid "AI|Write a summary to fill out the selected issue template"
msgstr "Écrivez un résumé pour remplir le modèle du ticket sélectionné"
@@ -2245,7 +2265,7 @@ msgid "AbuseReport|Confirmed posting of personal information or credentials"
msgstr "Publication d'informations personnelles ou d'identifiants confirmée"
msgid "AbuseReport|Confirmed spam"
-msgstr "Indésirable confirmé"
+msgstr "Spam confirmé"
msgid "AbuseReport|Confirmed violation of a copyright or a trademark"
msgstr "Violation de droit d'auteur ou de marque déposée confirmée"
@@ -2254,7 +2274,7 @@ msgid "AbuseReport|Credit card"
msgstr "Carte de crédit"
msgid "AbuseReport|Delete user"
-msgstr "Supprimer l’utilisateur"
+msgstr "Supprimer l'utilisateur"
msgid "AbuseReport|Email"
msgstr "Courriel"
@@ -2266,13 +2286,13 @@ msgid "AbuseReport|Go to content"
msgstr "Accéder au contenu"
msgid "AbuseReport|Go to issue"
-msgstr "Accéder au ticket"
+msgstr "Aller au ticket"
msgid "AbuseReport|Go to merge request"
msgstr "Accéder à la demande de fusion"
msgid "AbuseReport|Go to profile"
-msgstr "Accéder au profil"
+msgstr "Aller au profil"
msgid "AbuseReport|Groups"
msgstr "Groupes"
@@ -2362,7 +2382,7 @@ msgid "Access Tokens"
msgstr "Jetons d'accès"
msgid "Access denied"
-msgstr "Accés refusé"
+msgstr "Accès refusé"
msgid "Access denied for your LDAP account."
msgstr "Accès refusé pour votre compte LDAP."
@@ -2398,7 +2418,10 @@ msgid "AccessTokens|Access Tokens"
msgstr "Jetons d'accès"
msgid "AccessTokens|Access token limit reached"
-msgstr ""
+msgstr "Limite de jetons d'accès atteinte"
+
+msgid "AccessTokens|Add a %{type}"
+msgstr "Ajouter un(e) %{type}"
msgid "AccessTokens|Are you sure?"
msgstr "Voulez-vous vraiment continuer ?"
@@ -2418,12 +2441,18 @@ msgstr "Copier le jeton de courriel entrant"
msgid "AccessTokens|Copy static object token"
msgstr "Copier le jeton d'objet statique"
+msgid "AccessTokens|Create %{type}"
+msgstr "Créer un(e) %{type}"
+
msgid "AccessTokens|Created"
msgstr "Créés"
msgid "AccessTokens|Feed token"
msgstr "Jeton de flux"
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr "Par exemple, l'application utilisant le jeton ou le but du jeton. N'incluez pas d'informations sensibles dans le nom du jeton, car elles seront visibles pour tous les membres de %{resource_type}."
+
msgid "AccessTokens|Incoming email token"
msgstr "Jeton de courriel entrant"
@@ -2442,6 +2471,15 @@ msgstr "Gardez ce jeton secret. Quiconque s'en empare peut lire les flux RSS de
msgid "AccessTokens|Personal Access Tokens"
msgstr "Jetons d'accès personnels"
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr "Les portées définissent les niveaux de permission accordés au jeton."
+
+msgid "AccessTokens|Select a role"
+msgstr "Sélectionner un rôle"
+
+msgid "AccessTokens|Select scopes"
+msgstr "Sélectionner les portées"
+
msgid "AccessTokens|Static object token"
msgstr "Jeton d'objet statique"
@@ -2451,6 +2489,9 @@ msgstr "La dernière fois qu'un jeton a été utilisé"
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr "Ce sont les seuls mots de passe acceptés lorsque l'authentification à deux facteurs (2FA) est activée."
+msgid "AccessTokens|Token name"
+msgstr "Nom du jeton"
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr "Vous pouvez également utiliser des jetons d'accès personnels pour vous authentifier auprès de Git via HTTP."
@@ -2458,7 +2499,7 @@ msgid "AccessTokens|You can generate a personal access token for each applicatio
msgstr "Vous pouvez générer un jeton d'accès personnel pour chaque application utilisée nécessitant un accès à l'API GitLab."
msgid "AccessTokens|You can only have one active project access token with a trial license. You cannot generate a new token until the existing token is deleted, or you upgrade your subscription."
-msgstr ""
+msgstr "Vous ne pouvez avoir qu'un seul jeton d'accès au projet actif avec une licence d'essai. Vous ne pouvez pas générer de nouveau jeton tant que le jeton existant n'est pas supprimé, ou que vous n'avez pas mis à niveau votre abonnement."
msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr "Votre jeton de flux vous authentifie lorsque votre lecteur RSS charge un flux RSS personnalisé ou lorsque votre application de calendrier charge un calendrier personnalisé. Il est visible dans les URL de ces flux."
@@ -2502,13 +2543,13 @@ msgstr "Bénéficiez de vos pipelines grâce à la validation de votre compte"
msgid "AccountValidation|I'll bring my own runners"
msgstr "J'apporterai mes propres runners"
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr "En savoir plus."
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2548,7 +2589,7 @@ msgid "Action"
msgstr "Action"
msgid "Action '%{action}' in registry %{registry_id} entry is not supported."
-msgstr "L'action « %{action} » dans l'entrée de registre %{registry_id} n'est pas prise en charge."
+msgstr "L'action « %{action} » dans l'entrée de registre %{registry_id} n'est pas prise en charge."
msgid "Action not allowed."
msgstr "Action non autorisée."
@@ -2619,9 +2660,6 @@ msgstr "Ajouter une page wiki"
msgid "Add Zoom meeting"
msgstr "Ajouter une réunion Zoom"
-msgid "Add a %{type}"
-msgstr "Ajouter un %{type}"
-
msgid "Add a GCP region"
msgstr "Ajouter une région GCP"
@@ -2670,6 +2708,9 @@ msgstr "Ajouter un nouveau ticket"
msgid "Add a numbered list"
msgstr "Ajouter une liste numérotée"
+msgid "Add a quick action"
+msgstr "Ajouter une action rapide"
+
msgid "Add a related epic"
msgstr "Ajouter une épopée associée"
@@ -2925,6 +2966,9 @@ msgstr "Ajoutée dans cette version"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr "L'ajout de nouvelles applications est désactivé dans votre instance GitLab. Veuillez contacter votre administrateur GitLab pour en obtenir la permission"
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr "Formats de diagrammes supplémentaires"
@@ -2946,9 +2990,6 @@ msgstr "Texte supplémentaire à afficher sur la page de connexion"
msgid "Additional units"
msgstr "Unités supplémentaires"
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr "Adresse"
@@ -3007,7 +3048,7 @@ msgid "Admin message"
msgstr "Message de l'administrateur"
msgid "Admin mode"
-msgstr "Mode admin"
+msgstr "Mode administrateur"
msgid "Admin mode already enabled"
msgstr "Mode Administrateur déjà activé"
@@ -3346,7 +3387,7 @@ msgid "AdminSettings|Git abuse rate limit"
msgstr "Taux limite avant abus de Git"
msgid "AdminSettings|Group runners expiration"
-msgstr "Expiration des exécuteurs de groupe"
+msgstr "Expiration des runners du groupe"
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr "J'ai lu et j'accepte les %{link_start}Conditions d'Utilisation%{link_end} (PDF) de Let's Encrypt."
@@ -3372,24 +3413,15 @@ msgstr "Si aucun index n'existe, GitLab en crée un."
msgid "AdminSettings|Import sources"
msgstr "Sources d'importation"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
+msgstr "Améliorez le débit d'indexation non codée en mettant en file d'attente les jobs Sidekiq jusqu'à ce que tous les documents soient traités."
+
msgid "AdminSettings|Inactive project deletion"
msgstr "Suppression de projet inactif"
msgid "AdminSettings|Instance runners expiration"
msgstr "Expiration des runners d'instance"
-msgid "AdminSettings|Jitsu administrator email"
-msgstr "Adresse de courriel de l'administrateur Jitsu"
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr "Mot de passe de l'administrateur Jitsu"
-
-msgid "AdminSettings|Jitsu host"
-msgstr "Hôte Jitsu"
-
-msgid "AdminSettings|Jitsu project ID"
-msgstr "ID du projet Jitsu"
-
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
msgstr "Conserver les derniers artéfacts de toutes les tâches des pipelines réussis le plus récemment"
@@ -3471,6 +3503,9 @@ msgstr "Protéger les variables CI/CD par défaut"
msgid "AdminSettings|Registration Features include:"
msgstr "Les fonctionnalités payantes incluent :"
+msgid "AdminSettings|Requeue indexing workers"
+msgstr "Remettre en file d'attente les workers d'indexation"
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr "Exiger des utilisateurs qu'ils prouvent qu'ils sont propriétaires de domaines personnalisés"
@@ -3540,9 +3575,6 @@ msgstr "Le paramètre doit être supérieur à 0."
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr "Paramètres de taille et de domaine pour les sites statiques Pages."
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr "L'ID du projet dans Jitsu. Le projet contient toutes les instances de données d'analyse."
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr "L'URL de votre instance Cube."
@@ -3552,9 +3584,6 @@ msgstr "La chaîne de connexion de l'instance de votre configurateur des donnée
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr "Le domaine par défaut à utiliser pour l'Automatisation des Applications de Revue et les déploiements automatiques des étapes dans tous les projets."
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr "L'hôte de votre instance Jitsu."
-
msgid "AdminSettings|The host of your data collector instance."
msgstr "L'hôte de l'instance de votre collecteur de données."
@@ -3585,11 +3614,11 @@ msgstr "Nombre total de jobs dans les pipelines actuellement actifs"
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr "Utiliser le service AWS OpenSearch avec les identifiants IAM"
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr "Utilisée pour connecter Jitsu à l'instance Clickhouse."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
+msgstr "À utiliser pour les migrations de clusters et d'index. Lorsque l'indexation est interrompue, GitLab continue à effectuer le suivi des modifications."
-msgid "AdminSettings|Used to generate short-lived API access tokens."
-msgstr "Utilisée pour générer des jetons d'accès API de courte durée."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
+msgstr "Sert à connecter Snowplow à l'instance Clickhouse."
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
msgstr "Utilisée pour récupérer les données du tableau de bord à partir de l'instance de Cube."
@@ -3597,9 +3626,6 @@ msgstr "Utilisée pour récupérer les données du tableau de bord à partir de
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr "Les utilisateurs et les groupes doivent accepter l'invitation avant de pouvoir être ajoutés à un groupe ou à un projet."
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr "Même en pause, GitLab continue à effectuer le suivi des modifications. Ceci est utile pour les migrations de cluster/index."
-
msgid "AdminSettings|When to delete inactive projects"
msgstr "Quand supprimer les projets inactifs"
@@ -3822,9 +3848,6 @@ msgstr "Informations importantes sur l'utilisation de votre instance GitLab"
msgid "AdminUsers|Is using seat"
msgstr "Utilise un siège"
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr "Les tickets et les requêtes de fusion rédigés par cet utilisateur sont cachés aux autres utilisateurs."
-
msgid "AdminUsers|It's you!"
msgstr "C'est vous°!"
@@ -3870,6 +3893,9 @@ msgstr "L'historique de l'utilisateur, de groupe et des projets personnels reste
msgid "AdminUsers|Private profile"
msgstr "Profil privé"
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr "Les projets, les tickets, les requêtes de fusion et les commentaires de cet utilisateur sont cachés aux autres utilisateurs."
+
msgid "AdminUsers|Reactivating a user will:"
msgstr "La réactivation d'un utilisateur va :"
@@ -3909,8 +3935,8 @@ msgstr "Skype"
msgid "AdminUsers|Sort by"
msgstr "Trier par"
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
-msgstr "Le nombre maximum d'unités de calcul que les tâches d'un espace de noms peuvent utiliser chaque mois sur les exécuteurs partagés. Définissez-le à 0 pour illimité. Laissez vide pour hériter du paramètre global qui est de %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
msgid "AdminUsers|The user can't access git repositories."
msgstr "L'utilisateur ne peut pas accéder aux dépôts git."
@@ -4179,9 +4205,6 @@ msgstr "Vous utilisez des associations de recherche de code obsolètes. Pour amÃ
msgid "After a successful password update you will be redirected to login screen."
msgstr "Après modification de votre mot de passe, vous serez redirigé vers l'écran de connexion."
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr "Après une mise à jour réussie du mot de passe, vous serez redirigé vers la page de connexion où vous pourrez vous connecter avec votre nouveau mot de passe."
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr "Une fois supprimée, la relation de bifurcation ne peut être restaurée qu'à l'aide de l'API. Ce projet ne sera plus en mesure ni de recevoir ni d'envoyer des requêtes de fusion vers le projet en amont ou d'autres bifurcations."
@@ -4218,7 +4241,7 @@ msgstr "Flux d'activité"
msgid "AlertManagement|Alert"
msgstr "Alerte"
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr "Personnes assignées à l'alerte : %{assignees}"
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr "Une erreur s'est produite lors de l'affichage de l'alerte. Veuillez actu
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr "Une erreur s'est produite lors de l'affichage des alertes. Confirmez les détails de configuration de vos points de terminaison pour permettre l'affichage des alertes."
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
-msgstr "Une erreur s'est produite lors de la mise à jour de la liste des assignés. Veuillez réessayer."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
+msgstr "Une erreur s'est produite lors de la mise à jour de la liste des personnes assignées. Veuillez réessayer."
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr "Une erreur s'est produite lors de la mise à jour des personnes assignées à l'alerte. Veuillez réessayer."
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr "Procéder à la modification"
msgid "AlertSettings|Prometheus"
msgstr "Prometheus"
-msgid "AlertSettings|Prometheus API base URL"
-msgstr "URL de base de l'API Prometheus"
-
msgid "AlertSettings|Reset Key"
msgstr "Réinitialiser la clé"
@@ -4476,9 +4496,6 @@ msgstr "Le formulaire contient des modifications non enregistrées. Comment voud
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr "Pour créer une association personnalisée, entrez un exemple de charge utile issue de votre outil de supervision au format JSON. Sélectionnez le bouton « Analyser les champs de la charge utile°» pour continuer."
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr "L'URL ne peut pas être vide et doit commencer par http: ou https:."
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr "Utilisez l'URL et la clé d'autorisation ci-dessous pour configurer la façon dont Prometheus envoie des alertes à GitLab. Consultez la %{linkStart}documentation de GitLab%{linkEnd} pour apprendre à configurer votre point de terminaison."
@@ -4575,6 +4592,9 @@ msgstr "Toutes les branches"
msgid "All changes are committed"
msgstr "Toutes les modifications sont validées"
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr "Tous les utilisateurs éligibles"
@@ -4740,6 +4760,9 @@ msgstr "Supprimer également l'appartenance des utilisateurs directs des projets
msgid "Also unassign this user from related issues and merge requests"
msgstr "Supprimer également l'assignation de cet utilisateur aux demandes de fusion et tickets associés"
+msgid "Alt text"
+msgstr "Alternative textuelle"
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr "URL alternative de support pour la page d'aide et la liste déroulante d'aide."
@@ -4791,12 +4814,6 @@ msgstr "Une erreur est survenue"
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr "Une erreur de rapport dans lequel un résultat de test indique de manière erronée la présence d'une vulnérabilité système alors que celle-ci n'existe pas."
-msgid "An error occurred adding a draft to the thread."
-msgstr "Une erreur s'est produite lors de l'ajout d'un brouillon au fil de conversation."
-
-msgid "An error occurred adding a new draft."
-msgstr "Une erreur est survenue lors de l'ajout d'un nouveau brouillon."
-
msgid "An error occurred creating the new branch."
msgstr "Une erreur s'est produite lors de la création de la nouvelle branche."
@@ -4839,6 +4856,12 @@ msgstr "Une erreur s'est produite lors de l'approbation, veuillez réessayer."
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr "Une erreur s'est produite lors de la vérification du chemin d'accès du groupe. Veuillez actualiser la page puis réessayer."
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr "Une erreur s'est produite lors du décodage du fichier."
@@ -4998,9 +5021,6 @@ msgstr "Une erreur s'est produite lors du chargement des projets."
msgid "An error occurred while loading the blob controls."
msgstr "Une erreur s'est produite lors du chargement des contrôles du BLOB (Binary large object)"
-msgid "An error occurred while loading the data. Please try again."
-msgstr "Une erreur s'est produite lors du chargement des données. Veuillez réessayer."
-
msgid "An error occurred while loading the file"
msgstr "Une erreur s'est produite lors du chargement du fichier"
@@ -5062,7 +5082,7 @@ msgid "An error occurred while reordering issues."
msgstr "Une erreur s'est produite lors de la réorganisation des tickets."
msgid "An error occurred while resetting the compute usage."
-msgstr ""
+msgstr "Une erreur s'est produite lors de la réinitialisation de la quantité d'unités de calcul utilisée."
msgid "An error occurred while retrieving calendar activity"
msgstr "Une erreur s'est produite lors de la récupération de l'activité du calendrier"
@@ -5117,9 +5137,6 @@ msgstr "Une erreur s'est produite lors de la mise à jour de la configuration."
msgid "An error occurred while updating labels."
msgstr "Une erreur s'est produite lors de la mise à jour des labels."
-msgid "An error occurred while updating the comment"
-msgstr "Une erreur est survenue lors de la mise à jour du commentaire"
-
msgid "An error occurred while updating the configuration."
msgstr "Une erreur s'est produite lors de la mise à jour de la configuration."
@@ -5206,8 +5223,8 @@ msgstr "Une erreur inconnue s'est produite."
msgid "Analytics"
msgstr "Analytique"
-msgid "Analytics|Add to Dashboard"
-msgstr "Ajouter au tableau de bord"
+msgid "Analytics|A visualization with that name already exists."
+msgstr "Une visualisation portant ce nom existe déjà."
msgid "Analytics|Add visualizations"
msgstr "Ajouter des visualisations"
@@ -5272,12 +5289,21 @@ msgstr "Données"
msgid "Analytics|Data Table"
msgstr "Tableau de données"
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr "Les dates et heures sont affichées dans le fuseau horaire UTC"
+
msgid "Analytics|Edit"
msgstr "Modifier"
+msgid "Analytics|Enter a visualization name"
+msgstr "Entrer un nom de visualisation"
+
msgid "Analytics|Error while saving dashboard"
msgstr "Erreur lors de l'enregistrement du tableau de bord"
+msgid "Analytics|Error while saving visualization."
+msgstr "Erreur lors de l'enregistrement de la visualisation."
+
msgid "Analytics|Host"
msgstr "Hôte"
@@ -5287,8 +5313,8 @@ msgstr "Langue"
msgid "Analytics|Line Chart"
msgstr "Graphique linéaire"
-msgid "Analytics|New Analytics Visualization Title"
-msgstr "Titre de la nouvelle visualisation des données d'analyse"
+msgid "Analytics|New analytics visualization name"
+msgstr "Nom de la nouvelle visualisation des données d'analyse"
msgid "Analytics|New dashboard"
msgstr "Nouveau tableau de bord"
@@ -5326,6 +5352,18 @@ msgstr "Données de résultats"
msgid "Analytics|Save"
msgstr "Enregistrer"
+msgid "Analytics|Save and add to Dashboard"
+msgstr "Enregistrer et ajouter au tableau de bord"
+
+msgid "Analytics|Save new visualization"
+msgstr "Enregistrer une nouvelle visualisation"
+
+msgid "Analytics|Select a measurement"
+msgstr "Sélectionner une mesure"
+
+msgid "Analytics|Select a visualization type"
+msgstr "Sélectionner un type de visualisation"
+
msgid "Analytics|Single Statistic"
msgstr "Statistique unique"
@@ -5338,6 +5376,9 @@ msgstr "URL"
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr "Mise à jour du tableau de bord %{dashboardId}"
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr "Mise à jour de la visualisation %{visualizationName}"
+
msgid "Analytics|Users"
msgstr "Utilisateurs"
@@ -5356,6 +5397,12 @@ msgstr "Designer de visualisation"
msgid "Analytics|Visualization Type"
msgstr "Type de visualisation"
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr "La visualisation a été enregistrée avec succès"
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr "Analysez vos dépendances pour révéler les vulnérabilités connues."
@@ -5380,6 +5427,9 @@ msgstr "Et ce jeton d'inscription°:"
msgid "Anonymous"
msgstr "Anonyme"
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr "Un autre gestionnaire de tickets de suivi est déjà en cours d'utilisation. Un seul peut être actif à la fois"
@@ -5444,7 +5494,7 @@ msgid "AppleAppStore|Leave empty to use your current Private Key."
msgstr "Laissez vide pour utiliser votre clé privée actuelle."
msgid "AppleAppStore|Only set variables on protected branches and tags"
-msgstr ""
+msgstr "Ne définir des variables que sur les étiquettes et branches protégées"
msgid "AppleAppStore|Protected branches and tags only"
msgstr "Étiquettes et branches protégées uniquement"
@@ -5785,7 +5835,7 @@ msgid "ApprovalRule|Name"
msgstr "Nom"
msgid "ApprovalRule|Need triage"
-msgstr ""
+msgstr "Besoin d'un triage"
msgid "ApprovalRule|Needs triage"
msgstr "Nécessite un triage"
@@ -6167,9 +6217,6 @@ msgstr "Voulez-vous vraiment continuer ? La suppression de cette clé GPG n'aff
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr "Voulez-vous vraiment continuer ? L'appareil sera déconnecté de GitLab et tous les jetons « se souvenir de moi » seront révoqués."
-msgid "Arrange charts"
-msgstr "Organiser les graphiques"
-
msgid "Artifact"
msgstr "Artefact"
@@ -6255,6 +6302,9 @@ msgstr "Taille totale des artefacts"
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr "Nous voulons que vous puissiez utiliser cette page pour gérer facilement les artefacts de vos jobs CI/CD. Nous cherchons à améliorer votre expérience et souhaiterions connaître votre avis sur les améliorations que nous apportons."
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr "Comme il s'agit d'un compte créé récemment, cliquez sur le lien ci-dessous pour confirmer votre compte avant de commencer."
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr "Nous développons sans cesse de nouvelles fonctionnalités pour SAST. Dans ce cadre, nous souhaiterions connaître votre avis sur la fonctionnalité de configuration SAST via %{linkStart}ce ticket%{linkEnd}."
@@ -6309,8 +6359,8 @@ msgstr "Me l'assigner"
msgid "Assign reviewer"
msgstr "Assigner un relecteur"
-msgid "Assign reviewer(s)"
-msgstr "Assigner un ou des relecteurs"
+msgid "Assign reviewers"
+msgstr "Assigner des relecteurs"
msgid "Assign severity"
msgstr "Assigner la gravité"
@@ -6368,9 +6418,6 @@ msgstr "La personne assignée ne dispose d'aucune permission"
msgid "Assignee lists not available with your current license"
msgstr "La liste des personnes assignées n'est pas disponible avec votre licence actuelle"
-msgid "Assignee(s)"
-msgstr "Assigné(s)"
-
msgid "Assignees"
msgstr "Assignés"
@@ -6510,17 +6557,23 @@ msgstr "Une erreur s'est produite lors de la récupération des flux d'événeme
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr "Une erreur s'est produite lors de la mise à jour de la destination du flux d'événements d'audit externe. Veuillez réessayer."
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr "Voulez-vous vraiment supprimer cette destination ?"
+
msgid "AuditStreams|Cancel editing"
msgstr "Annuler la modification"
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr "En-têtes HTTP personnalisés (facultatif)"
-msgid "AuditStreams|Defines which streaming events are captured"
-msgstr "Définit les événements de flux qui sont capturés"
+msgid "AuditStreams|Delete destination"
+msgstr "Supprimer la destination"
-msgid "AuditStreams|Delete %{link}"
-msgstr "Supprimer %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
+msgstr "La suppression de la destination de diffusion %{destination} arrêtera la diffusion des événements d'audit"
msgid "AuditStreams|Destination URL"
msgstr "URL de destination"
@@ -6531,20 +6584,35 @@ msgstr "Des filtres sont appliqués à la destination. %{linkStart}Que sont les
msgid "AuditStreams|Destinations receive all audit event data"
msgstr "Les destinations reçoivent toutes les données des événements d'audit"
-msgid "AuditStreams|Edit %{link}"
-msgstr "Modifier %{link}"
-
msgid "AuditStreams|Event filtering (optional)"
msgstr "Filtrage des événements (facultatif)"
+msgid "AuditStreams|Filter by audit event type"
+msgstr ""
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
+msgstr ""
+
msgid "AuditStreams|Header"
msgstr "En-tête"
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr "Le maximum de %{number} en-têtes HTTP a été atteint."
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
-msgstr "Aucun filtre disponible. %{linkStart}Comment puis-je ajouter un filtre ?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
+msgstr ""
msgid "AuditStreams|Remove custom header"
msgstr "Supprimer l'en-tête personnalisé"
@@ -6552,6 +6620,9 @@ msgstr "Supprimer l'en-tête personnalisé"
msgid "AuditStreams|Save external stream destination"
msgstr "Sauvegarder la destination du flux externe"
+msgid "AuditStreams|Select events"
+msgstr "Sélectionner des événements"
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr "Configurer les flux d'événements d'audit"
@@ -6579,21 +6650,24 @@ msgstr "Valeur"
msgid "AuditStreams|Verification token"
msgstr "Jeton de vérification"
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr "Jeton de vérification pour le flux %{link}"
-
-msgid "AuditStreams|View verification token"
-msgstr "Voir le jeton de vérification"
+msgid "AuditStreams|audit-events"
+msgstr ""
msgid "AuditStreams|ex: 1000"
-msgstr ""
+msgstr "ex : 1 000"
msgid "AuditStreams|ex: limitation"
-msgstr ""
+msgstr "ex : limitation"
msgid "AuditStreams|filtered"
msgstr "filtré"
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr "août"
@@ -7131,28 +7205,28 @@ msgstr "Facturation"
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr "%{group_name} utilise actuellement le %{plan_name}"
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr "10 Go de transfert par mois"
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr "5 utilisateurs par espace de nommage"
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr "Support"
msgid "BillingPlans|Talk to an expert today."
msgstr "Parlez à un expert dès aujourd'hui."
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr "Puis %{move_link_start}déplacez tous les projets%{move_link_end} que vous souhaitez utiliser avec votre abonnement vers ce groupe."
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr "Ce groupe utilise le forfait associé à son groupe parent."
@@ -7350,11 +7427,8 @@ msgstr "Nous sommes là pour vous aider."
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 "Alors que GitLab met fin à la disponibilité du forfait Bronze, il vous est toujours possible de renouveler votre abonnement Bronze une dernière fois avant %{eoa_bronze_plan_end_date}. Nous proposons également pour une durée limitée une mise à niveau gratuite vers notre forfait Premium (jusqu'à 25°utilisateurs) ! En savoir plus sur les modifications et offres sur notre %{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 "Vous n'avez aucun groupe. Vous devrez %{create_group_link_start}en créer un%{create_group_link_end} pour %{move_link_start}y déplacer ce projet%{move_link_end}."
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
-msgstr "Vous devrez %{move_link_start}déplacer ce projet%{move_link_end} dans un de vos groupes."
+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 your projects to it%{move_link_end}."
+msgstr "Vous n'avez aucun groupe. Vous devrez %{create_group_link_start}en créer un%{create_group_link_end} et %{move_link_start}y déplacer vos projets%{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 "Votre version d'essai de GitLab.com %{plan} va %{strong_open}expirer après le %{expiration_date}%{strong_close}. Vous pouvez conserver votre accès aux fonctionnalités %{plan} en effectuant une mise à niveau ci-dessous."
@@ -7413,10 +7487,10 @@ msgstr "Sièges utilisés/sièges dans l'abonnement"
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr "Les runners partagés ne peuvent pas être activés tant qu'aucune carte de crédit valide n'est enregistrée."
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr "Valider le compte"
msgid "Billings|Validate user account"
msgstr "Valider le compte utilisateur"
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7548,7 +7622,7 @@ msgid "Blame could not be loaded as a single page."
msgstr "Le blame n'a pas pu être chargé en tant que page unique."
msgid "Blame for binary files is not supported."
-msgstr "L'inspection des fichiers binaires n'est pas prise en charge."
+msgstr "Le blame des fichiers binaires n'est pas pris en charge."
msgid "BlobViewer|View on %{environmentName}"
msgstr "Voir sur %{environmentName}"
@@ -7722,12 +7796,18 @@ msgstr "Une erreur s'est produite lors de la création du ticket. Veuillez rées
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr "Une erreur s'est produite lors de la création de la liste. Veuillez réessayer."
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr "Une erreur s'est produite lors de la récupération des groupes enfants. Veuillez réessayer."
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr "Une erreur s'est produite lors de la récupération des projets de groupe. Veuillez réessayer."
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr "Une erreur s'est produite lors de la récupération des groupes. Veuillez réessayer."
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr "Une erreur s'est produite lors de la récupération des tickets. Veuillez recharger la page."
@@ -7790,9 +7870,6 @@ msgstr "Étendre"
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr "Échec de la récupération des %{issuableType}s bloquant(e)s"
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr "Déplacer la carte"
@@ -7850,6 +7927,9 @@ msgstr "Charger plus de tickets"
msgid "Board|Loading epics"
msgstr "Chargement des épopées"
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr "Texte en gras"
@@ -8232,7 +8312,7 @@ msgid "BroadcastMessages|Ends at"
msgstr "Se termine à"
msgid "BroadcastMessages|Git remote responses"
-msgstr ""
+msgstr "Réponses distantes Git"
msgid "BroadcastMessages|Green"
msgstr "Vert"
@@ -8267,8 +8347,17 @@ msgstr "Les chemins d'accès peuvent contenir des jokers, comme */welcome"
msgid "BroadcastMessages|Red"
msgstr "Rouge"
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr "N'afficher que pour les utilisateurs qui ont des rôles spécifiques sur les pages de groupes/projets"
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
-msgstr ""
+msgstr "Afficher le message de diffusion dans une interface en ligne de commande en tant que réponse distante Git"
+
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr "Afficher pour tous les utilisateurs sur toutes les pages"
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr "Afficher pour tous les utilisateurs sur les pages correspondantes spécifiques"
msgid "BroadcastMessages|Starts at"
msgstr "Démarre à"
@@ -8276,12 +8365,12 @@ msgstr "Démarre à"
msgid "BroadcastMessages|Target Path"
msgstr "Chemin d'accès cible"
+msgid "BroadcastMessages|Target broadcast message"
+msgstr "Message de diffusion cible"
+
msgid "BroadcastMessages|Target roles"
msgstr "Rôles cibles"
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
-msgstr "Le message de diffusion ne s'affiche que pour les utilisateurs des projets et des groupes qui ont ces rôles."
-
msgid "BroadcastMessages|Theme"
msgstr "Thème"
@@ -8516,6 +8605,9 @@ msgstr "Par mois"
msgid "By quarter"
msgstr "Par trimestre"
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr "Lorsque vous utilisez une adresse de courriel principale liée à une adresse de courriel Enterprise, vous reconnaissez que ce compte est celui d'un utilisateur Enterprise."
+
msgid "By week"
msgstr "Par semaine"
@@ -8526,7 +8618,7 @@ msgid "CHANGELOG"
msgstr "CHANGELOG"
msgid "CI"
-msgstr "CI"
+msgstr "Cl"
msgid "CI Lint"
msgstr "CI Lint"
@@ -9010,10 +9102,10 @@ msgstr "Taux d'échec des modifications"
msgid "Change assignee"
msgstr "Modifier la personne assignée"
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr "Modifier les personnes assignées"
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr "Modifiez les personnes assignées."
msgid "Change branches"
@@ -9031,11 +9123,11 @@ msgstr "Modifier le jalon"
msgid "Change path"
msgstr "Changer le chemin"
-msgid "Change reviewer(s)"
-msgstr "Changer de relecteur(s)"
+msgid "Change reviewers"
+msgstr "Modifier les relecteurs"
-msgid "Change reviewer(s)."
-msgstr "Changez le ou les relecteurs."
+msgid "Change reviewers."
+msgstr "Modifiez les relecteurs."
msgid "Change role"
msgstr "Changer le rôle"
@@ -9058,8 +9150,11 @@ msgstr "Modifier le type de l'élément de travail"
msgid "Change your password"
msgstr "Modifiez votre mot de passe"
-msgid "Change your password or recover your current one"
-msgstr "Changez votre mot de passe ou récupérez votre mot de passe actuel"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
+msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
msgstr "Tous les relecteurs ont été supprimés."
@@ -9106,17 +9201,17 @@ msgstr "Vos modifications seront validées sur %{branchName}, car une requête d
msgid "Changed"
msgstr "Modifié"
-msgid "Changed assignee(s)."
-msgstr "Modification des personnes assignées."
+msgid "Changed assignees."
+msgstr "Personnes assignées modifiées."
msgid "Changed merge method to %{merge_method}"
msgstr "Méthode de fusion modifiée à %{merge_method}"
-msgid "Changed reviewer(s)."
-msgstr "Relecteur(s) changé(s)."
+msgid "Changed reviewers."
+msgstr "Personnes assignées modifiées."
msgid "Changed squash option to %{squash_option}"
-msgstr ""
+msgstr "Option de squash modifiée à %{squash_option}"
msgid "Changed the title to \"%{title_param}\"."
msgstr "Le titre a été modifié : « %{title_param} »."
@@ -9154,9 +9249,6 @@ msgstr "Caractères restants"
msgid "Characters over limit"
msgstr "Caractères au-delà de la limite"
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr "Les graphiques ne peuvent pas être affichés car la requête pour accéder aux données a expiré. %{documentationLink}"
-
msgid "Chat"
msgstr "Discussion"
@@ -9262,13 +9354,13 @@ msgstr "%{pricePerUserPerYear} $ par utilisateur et par an"
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr "%{selectedPlanPrice} $ par pack de 10 Go de stokage et par année"
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
msgid_plural "Checkout|%d compute packs"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d pack d'unités de calcul"
+msgstr[1] "%d packs d'unités de calcul"
msgid "Checkout|%{cardType} ending in %{lastFourDigits}"
msgstr "%{cardType} finissant par %{lastFourDigits}"
@@ -9276,23 +9368,23 @@ msgstr "%{cardType} finissant par %{lastFourDigits}"
msgid "Checkout|%{name}'s GitLab subscription"
msgstr "Abonnement GitLab de %{name}"
+msgid "Checkout|%{name}'s compute minutes"
+msgstr ""
+
msgid "Checkout|%{name}'s storage subscription"
msgstr "Abonnement au stockage de %{name}"
-msgid "Checkout|%{name}'s units of compute"
-msgstr ""
-
msgid "Checkout|%{quantity} GB of storage"
msgstr "%{quantity} Go de stockage"
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] "%{quantity} pack de stockage"
msgstr[1] "%{quantity} packs de stockage"
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr "Forfait %{selectedPlanText}"
@@ -9330,9 +9422,9 @@ msgid "Checkout|City"
msgstr "Ville"
msgid "Checkout|Compute pack"
-msgstr ""
+msgstr "Pack de calcul"
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,12 +9565,12 @@ msgstr "Taxe"
msgid "Checkout|Total"
msgstr "Total"
+msgid "Checkout|Total compute minutes: %{quantity}"
+msgstr ""
+
msgid "Checkout|Total storage: %{quantity} GB"
msgstr "Stockage total : %{quantity} Go"
-msgid "Checkout|Total units of compute: %{quantity}"
-msgstr ""
-
msgid "Checkout|Users"
msgstr "Utilisateurs"
@@ -9503,7 +9595,7 @@ msgstr "un abonnement au stockage"
msgid "Checkout|company or team"
msgstr "entreprise ou équipe"
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr "Choisir un type…"
msgid "Choose file…"
msgstr "Choisir un fichier…"
+msgid "Choose protected branch"
+msgstr "Choisir une branche protégée"
+
msgid "Choose the top-level group for your repository imports."
msgstr "Choisissez le groupe de premier niveau pour vos importations dans le dépôt."
@@ -9576,31 +9671,34 @@ msgid "Ci config already present"
msgstr "Configuration CI déjà présente"
msgid "CiCatalog|About this project"
-msgstr ""
+msgstr "À propos de ce projet"
-msgid "CiCatalog|CI/CD Catalog resource"
-msgstr ""
-
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog"
msgstr "Catalogue CI/CD"
+msgid "CiCatalog|CI/CD Catalog resource"
+msgstr "Ressource du catalogue CI/CD"
+
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr "Créez un dépôt de composants de pipeline et rendez la réutilisation des configurations de pipeline plus rapide et plus simple."
-msgid "CiCatalog|Get started with the CI/CD catalog"
-msgstr "Premiers pas avec le catalogue CI/CD"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
+msgstr "Commencer avec le catalogue CI/CD"
msgid "CiCatalog|Go to the project"
-msgstr ""
+msgstr "Aller au projet"
msgid "CiCatalog|Last release at %{date}"
-msgstr ""
+msgstr "Dernière release au %{date}"
msgid "CiCatalog|Mark project as a CI/CD Catalog resource"
-msgstr ""
+msgstr "Marquer le projet comme une ressource de catalogue CI/CD"
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
-msgstr ""
+msgstr "Marquez le projet comme une ressource de catalogue CI/CD. %{linkStart}Qu'est-ce que le catalogue CI/CD ?%{linkEnd}"
+
+msgid "CiCatalog|No release available"
+msgstr "Aucune version de release disponible"
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr "Page %{currentPage} sur %{totalPage}"
@@ -9612,25 +9710,28 @@ msgid "CiCatalog|Repositories of pipeline components available in this namespace
msgstr "Dépôts de composants de pipeline disponibles dans cet espace de nommage."
msgid "CiCatalog|The project must contain a README.md file and a template.yml file. When enabled, the repository is available in the CI/CD Catalog."
-msgstr ""
+msgstr "Le projet doit contenir un fichier README.md et un fichier template.yml. Lorsqu'il est activé, le dépôt est disponible dans le catalogue CI/CD."
msgid "CiCatalog|There was a problem fetching the CI/CD Catalog setting."
-msgstr ""
+msgstr "Un problème est survenu lors de la récupération des paramètres du catalogue CI/CD."
msgid "CiCatalog|There was a problem marking the project as a CI/CD Catalog resource."
-msgstr ""
+msgstr "Un problème est survenu lors du marquage du projet en tant que ressource du catalogue CI/CD."
msgid "CiCatalog|There was an error fetching CI/CD Catalog resources."
msgstr "Une erreur s'est produite lors de la récupération des ressources du catalogue CI/CD."
msgid "CiCatalog|This project is now a CI/CD Catalog resource."
-msgstr ""
+msgstr "Ce projet est maintenant une ressource de catalogue CI/CD."
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
-msgstr ""
+msgstr "Ce projet sera marqué comme une ressource de catalogue CI/CD et sera visible dans le catalogue CI/CD. Cette action n'est pas réversible."
+
+msgid "CiCatalog|Unreleased"
+msgstr "Non publié"
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
-msgstr "Nous souhaitons vous aider à créer et gérer des dépôts de composants de pipelines tout en facilitant la réutilisation des configurations des pipelines. Dites-nous ce que vous en pensez !"
+msgstr "Nous souhaitons vous aider à créer et gérer des dépôts de composants de pipelines tout en facilitant la réutilisation des configurations des pipelines. Dites-nous ce que vous en pensez !"
msgid "CiCdAnalytics|Date range: %{range}"
msgstr "Plage de dates°: %{range}"
@@ -9660,7 +9761,7 @@ msgid "CiStatusLabel|preparing"
msgstr "en préparation"
msgid "CiStatusLabel|scheduled"
-msgstr ""
+msgstr "planifié"
msgid "CiStatusLabel|skipped"
msgstr "ignoré"
@@ -9702,7 +9803,7 @@ msgid "CiStatusText|preparing"
msgstr "en préparation"
msgid "CiStatusText|scheduled"
-msgstr ""
+msgstr "planifié"
msgid "CiStatusText|skipped"
msgstr "ignoré"
@@ -9711,13 +9812,13 @@ msgid "CiStatusText|waiting"
msgstr "en attente"
msgid "CiStatusText|warning"
-msgstr ""
+msgstr "avertissement"
msgid "CiStatus|running"
msgstr "en cours"
msgid "CiVariables|Attributes"
-msgstr ""
+msgstr "Attributs"
msgid "CiVariables|Cancel"
msgstr "Annuler"
@@ -9732,10 +9833,10 @@ msgid "CiVariables|Expanded"
msgstr "Développé"
msgid "CiVariables|File"
-msgstr ""
+msgstr "Fichier"
msgid "CiVariables|Group"
-msgstr ""
+msgstr "Groupe"
msgid "CiVariables|Input variable key"
msgstr "Nom de la variable d'entrée"
@@ -9750,7 +9851,7 @@ msgid "CiVariables|Masked"
msgstr "Masquée"
msgid "CiVariables|Maximum number of Inherited Group CI variables loaded (2000)"
-msgstr ""
+msgstr "Nombre maximal de variables CI du groupe héritées chargées (2 000)"
msgid "CiVariables|Maximum number of variables reached."
msgstr "Nombre maximum de variables atteint."
@@ -9783,7 +9884,7 @@ msgid "CiVariables|State"
msgstr "État"
msgid "CiVariables|There was an error fetching the inherited CI variables."
-msgstr ""
+msgstr "Une erreur s'est produite lors de la récupération des variables CI héritées."
msgid "CiVariables|This %{entity} has %{currentVariableCount} defined CI/CD variables. The maximum number of variables per %{entity} is %{maxVariableLimit}. To add new variables, you must reduce the number of defined variables."
msgstr "Ce %{entity} comporte %{currentVariableCount} variables CI/CD définies. Le nombre maximum de variables par %{entity} est de %{maxVariableLimit}. Pour en ajouter de nouvelles, vous devez réduire le nombre de variables définies."
@@ -9862,14 +9963,14 @@ msgstr "Effacer"
msgid "Clear %{count} image from cache?"
msgid_plural "Clear %{count} images from cache?"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Supprimer %{count} image du cache ?"
+msgstr[1] "Supprimer %{count} images du cache ?"
msgid "Clear All"
msgstr "Tout effacer"
msgid "Clear all"
-msgstr ""
+msgstr "Tout effacer"
msgid "Clear all repository checks"
msgstr "Effacer toutes les vérifications de dépôt"
@@ -10000,6 +10101,9 @@ msgstr "Clone ce ticket, sans les commentaires, vers %{project}."
msgid "Close"
msgstr "Fermer"
+msgid "Close %{issuableType}"
+msgstr "Fermer %{issuableType}"
+
msgid "Close %{issueType}"
msgstr "Fermer %{issueType}"
@@ -10057,6 +10161,9 @@ msgstr "Ferme l'élément suivant : %{quick_action_target}."
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr "Ferme ce ticket. Le marque comme étant associé à %{duplicate_reference} ou en étant un doublon."
+msgid "Closing %{issuableType}..."
+msgstr "Fermeture de %{issuableType}…"
+
msgid "Cloud Run"
msgstr "Cloud Run"
@@ -10262,13 +10369,13 @@ msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr "Le type de cluster doit être spécifié pour Stages::ClusterEndpointInserter"
msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
-msgstr ""
+msgstr "%{linkStart}Voir la documentation%{linkEnd} de l'installation avancée. Assurez-vous d'être en possession de votre jeton d'accès."
msgid "ClusterAgents|%{name} successfully deleted"
msgstr "%{name} supprimé avec succès"
msgid "ClusterAgents|%{name} successfully revoked"
-msgstr ""
+msgstr "%{name} a été révoqué avec succès"
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr "%{number} agents sur %{total}"
@@ -10650,9 +10757,6 @@ msgstr "Options avancées de l'intégration de ce cluster Kubernetes"
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr "Permettre à GitLab de gérer les espaces de noms et les comptes de service de ce cluster."
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr "Permet à GitLab d'interroger l'instance Prometheus d'un cluster spécifiquement configuré pour les métriques."
-
msgid "ClusterIntegration|Amazon EKS"
msgstr "Amazon EKS"
@@ -10737,9 +10841,6 @@ msgstr "Le saviezâ€vous ?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr "Elastic Kubernetes Service"
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr "Activer l'intégration Prometheus"
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr "Activez ou désactivez la connexion de GitLab à votre grappe de serveurs Kubernetes."
@@ -10800,9 +10901,6 @@ msgstr "Intégration désactivée"
msgid "ClusterIntegration|Integration enabled"
msgstr "Intégration activée"
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr "Les intégrations vous permettent d'utiliser des applications installées dans votre cluster comme faisant partie de votre flux de travail GitLab."
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr "Le cluster Kubernetes est en cours de création…"
@@ -11038,22 +11136,25 @@ msgid "CodeNavigation|No references found"
msgstr "Aucune référence trouvée"
msgid "CodeOwners|An error occurred while loading code owners."
-msgstr "Une erreur s’est produite lors du chargement des propriétaires de code."
+msgstr "Une erreur s'est produite lors du chargement des propriétaires de code."
msgid "CodeOwners|Assign users and groups as approvers for specific file changes."
-msgstr "Assigner des utilisateurs et des groupes en tant qu’approbateurs pour des modifications de fichiers spécifiques."
+msgstr "Assignez des utilisateurs et des groupes en tant qu'approbateurs pour des modifications de fichiers spécifiques."
msgid "CodeOwners|Code owners"
msgstr "Propriétaires du code"
-msgid "CodeOwners|Hide all"
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
msgstr ""
+msgid "CodeOwners|Hide all"
+msgstr "Masquer tout"
+
msgid "CodeOwners|Learn more."
msgstr "En savoir plus."
msgid "CodeOwners|Show all"
-msgstr ""
+msgstr "Afficher tout"
msgid "CodeOwner|Pattern"
msgstr "Motif"
@@ -11062,34 +11163,40 @@ msgid "CodeQuality|New code quality degradations on this line"
msgstr "Nouvelles dégradations de la qualité du code sur cette ligne"
msgid "CodeSuggestionsAlert|Code faster and more efficiently with AI-powered code suggestions in VS Code. 13 languages are supported, including JavaScript, Python, Go, Java, and Kotlin. Enable Code Suggestions in your %{preference_link_start}user profile preferences%{link_end} or %{docs_link_start}see the documentation%{link_end} to learn more."
-msgstr ""
+msgstr "Codez plus vite et plus efficacement grâce à des suggestions de code basées sur l'IA dans VS Code. 13 langages sont pris en charge, notamment JavaScript, Python, Go, Java et Kotlin. Activez les suggestions de code dans les %{preference_link_start}préférences de votre profil utilisateur%{link_end} ou %{docs_link_start}consultez la documentation%{link_end} pour en savoir plus."
msgid "CodeSuggestionsAlert|Enable Code Suggestions"
msgstr "Activer les suggestions de code"
msgid "CodeSuggestionsAlert|Get started with Code Suggestions, available for free during the beta period."
-msgstr "Premiers pas avec les suggestions de code, disponibles gratuitement tant qu'elles sont en version bêta."
+msgstr "Démarrez avec les suggestions de code, disponibles gratuitement tant qu'elles sont en version bêta."
msgid "CodeSuggestionsSM|&#8226; Agree to the %{terms_link_start}GitLab Testing Agreement%{link_end}.%{br} &#8226; Acknowledge that GitLab will send data from the instance, including personal data, to Google for cloud hosting.%{br} &nbsp;&nbsp;&nbsp;We may also send data to %{ai_docs_link_start}third-party AI providers%{link_end} to provide this feature."
-msgstr ""
+msgstr "• Vous acceptez l'%{terms_link_start}Accord de test de GitLab%{link_end}. %{br}• Vous acceptez que GitLab envoie des données de l'instance, y compris des données personnelles, à Google pour l'hébergement dans le cloud.%{br} Nous pouvons également envoyer des données à %{ai_docs_link_start}des fournisseurs d'IA tiers%{link_end} pour fournir cette fonctionnalité."
msgid "CodeSuggestionsSM|Code Suggestions"
-msgstr ""
+msgstr "Suggestions de code"
msgid "CodeSuggestionsSM|Enable Code Suggestion for users of this GitLab instance."
-msgstr ""
+msgstr "Activez les suggestions de code pour les utilisateurs de cette instance de GitLab."
msgid "CodeSuggestionsSM|Enter new personal access token"
-msgstr ""
+msgstr "Entrer un nouveau jeton d'accès personnel"
msgid "CodeSuggestionsSM|Personal access token"
-msgstr ""
+msgstr "Jeton d'accès personnel"
msgid "CodeSuggestionsSM|Turn on Code Suggestions for this instance. By turning on this feature, you:"
-msgstr ""
+msgstr "Activez les suggestions de code pour cette instance. En activant cette fonctionnalité, vous :"
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
-msgstr ""
+msgstr "Votre jeton d'accès personnel depuis GitLab.com. Consultez la %{link_start}documentation%{link_end} pour en savoir plus sur la création d'un jeton d'accès personnel."
+
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr "Les %{code_suggestions_link_start}suggestions de code%{link_end} utilisent désormais des services d'IA tiers pour fournir des suggestions de meilleure qualité. Vous pouvez %{third_party_link_start}désactiver les services tiers%{link_end} pour votre groupe ou désactiver entièrement les suggestions de code dans %{profile_settings_link_start}votre profil d'utilisateur%{link_end}."
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr "Nous utilisons des services d'IA tiers pour améliorer les suggestions de code."
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr "%{link_start}Que sont les suggestions de code ?%{link_end}"
@@ -11101,16 +11208,13 @@ msgid "CodeSuggestions|Enable Code Suggestions"
msgstr "Activer les suggestions de code"
msgid "CodeSuggestions|Get code suggestions as you write code in your IDE. %{link_start}Learn more.%{link_end}"
-msgstr "Obtenez des suggestions de code au fur et à mesure que vous écrivez du code dans votre EDI. %{link_start}En savoir plus.%{link_end}"
+msgstr "Obtenez des suggestions de code au fur et à mesure que vous écrivez du code dans votre IDE. %{link_start}En savoir plus.%{link_end}"
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr "Les projets dans ce groupe peuvent utiliser les suggestions de code"
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr "Soumises aux %{link_start}Conditions d'utilisation des tests%{link_end}"
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
-msgstr "Soumises aux %{link_start}Conditions d'utilisation des tests%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
+msgstr "Sous réserve des %{terms_link_start}Conditions d'utilisation des tests%{link_end}. Les suggestions de code utilisent actuellement des services d'IA tiers, à moins qu'ils ne soient %{third_party_features_link_start}désactivés%{link_end}."
msgid "Cohorts|Inactive users"
msgstr "Utilisateurs inactifs"
@@ -11194,28 +11298,37 @@ msgid "Command"
msgstr "Commande"
msgid "Command id '%{command}' must not start with '%{prefix}'"
-msgstr "L'id de commande « %{command} » ne doit pas commencer par « %{prefix} »"
+msgstr "L'ID de commande « %{command} » ne doit pas commencer par « %{prefix} »"
msgid "Command line instructions"
msgstr "Instructions en ligne de commande"
msgid "CommandPalette|Global Commands"
-msgstr ""
+msgstr "Commandes globales"
msgid "CommandPalette|Pages"
-msgstr ""
+msgstr "Pages"
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
-msgstr "Tapez %{commandHandle} pour une commande, %{userHandle} pour un utilisateur, ou effectuez une recherche générique..."
+msgid "CommandPalette|Project files"
+msgstr "Fichiers de projet"
-msgid "CommandPalette|Users"
-msgstr "Utilisateurs"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
+msgstr ""
msgid "CommandPalette|command"
msgstr "commande"
+msgid "CommandPalette|go to project file"
+msgstr "accéder au fichier du projet"
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr "ticket (saisissez au moins 3 caractères)"
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr "projet (saisissez au moins 3 caractères)"
+
msgid "CommandPalette|user (enter at least 3 chars)"
-msgstr "utilisateur (entrez au moins 3 caractères)"
+msgstr "utilisateur (entrer au moins 3 caractères)"
msgid "Commands applied"
msgstr "Commandes appliquées"
@@ -11251,7 +11364,7 @@ msgid "Comment on lines %{startLine} to %{endLine}"
msgstr "Commenter les lignes %{startLine} à %{endLine}"
msgid "Comment on this file"
-msgstr ""
+msgstr "Commenter ce fichier"
msgid "Comment template actions"
msgstr "Actions de modèle de commentaire"
@@ -11306,18 +11419,12 @@ msgstr "Commit supprimé"
msgid "Commit message"
msgstr "Message de commit"
-msgid "Commit message (optional)"
-msgstr "Message de validation (facultatif)"
-
msgid "Commit message generated by AI"
msgstr "Message de validation généré par l'IA"
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr "Statistiques des validations pour %{ref} de %{start_time} à %{end_time}"
-msgid "Commit to %{branchName} branch"
-msgstr "Valider dans la branche %{branchName}"
-
msgid "CommitBoxTitle|Commit"
msgstr "Valider"
@@ -11388,7 +11495,7 @@ msgid "Commit|There was an error fetching the commit references. Please try agai
msgstr "Une erreur s'est produite lors de la récupération des références de la validation. Veuillez réessayer plus tard."
msgid "Commit|containing commit"
-msgstr "contenant le commit"
+msgstr "contenant la validation"
msgid "Community forum"
msgstr "Forum de la communauté"
@@ -11444,15 +11551,30 @@ msgstr "Il n'y a rien à comparer."
msgid "CompareRevisions|Branches"
msgstr "Branches"
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr "Les modifications sont affichées comme si la révision %{boldStart}source%{boldEnd} était fusionnée avec la révision %{boldStart}cible%{boldEnd}. %{linkStart}En savoir plus sur la comparaison des révisions.%{linkEnd}"
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr "Validations sur la source (%{commits_amount})"
+
msgid "CompareRevisions|Compare"
msgstr "Comparer"
+msgid "CompareRevisions|Compare revisions"
+msgstr "Comparer les révisions"
+
msgid "CompareRevisions|Create merge request"
msgstr "Créer une requête de fusion"
msgid "CompareRevisions|Filter by Git revision"
msgstr "Filtrer par révision Git"
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr "Inclure les modifications apportées à la cible depuis la création de la source"
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr "Uniquement les modifications entrantes de la source"
+
msgid "CompareRevisions|Select Git revision"
msgstr "Sélectionner une révision Git"
@@ -11462,6 +11584,12 @@ msgstr "Sélectionner une branche/étiquette"
msgid "CompareRevisions|Select target project"
msgstr "Sélectionner le projet cible"
+msgid "CompareRevisions|Show changes"
+msgstr "Afficher les modifications"
+
+msgid "CompareRevisions|Swap"
+msgstr "Échanger"
+
msgid "CompareRevisions|Swap revisions"
msgstr "Échanger les révisions"
@@ -11498,17 +11626,20 @@ msgstr "Processus terminé"
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr "Terminé en %{duration_seconds} secondes (%{relative_time})"
-msgid "Compliance Report|Export as CSV"
-msgstr "Exporter au format CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr "Exportez les cadriciels au format CSV. Vous recevrez un courriel une fois l'exportation traitée."
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
-msgstr "Exportez les cadres en CSV. Un couriel vous sera envoyé une fois l'exportation réalisée."
+msgid "Compliance Report|Export full report as CSV"
+msgstr "Exporter le rapport complet au format CSV"
+
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
+msgstr "Exportez les violations de requêtes de fusion au format CSV. Vous recevrez un courriel une fois l'exportation traitée."
msgid "Compliance Report|Frameworks"
msgstr "Cadriciels"
msgid "Compliance Report|Standards Adherence"
-msgstr ""
+msgstr "Respect des normes"
msgid "Compliance Report|Violations"
msgstr "Violations"
@@ -11613,7 +11744,7 @@ msgid "ComplianceFrameworks|Saved changes to compliance framework"
msgstr "Modifications du cadriciel de conformité enregistrées"
msgid "ComplianceFrameworks|Set compliance pipeline configuration for projects that use this framework. %{linkStart}How do I create the configuration?%{linkEnd}"
-msgstr "Définir la configuration du pipeline de conformité pour les projets qui utilisent ce cadre. %{linkStart}Comment puis-je créer la configuration ?%{linkEnd}"
+msgstr "Définissez la configuration du pipeline de conformité pour les projets qui utilisent ce cadriciel. %{linkStart}Comment puis-je créer la configuration ?%{linkEnd}"
msgid "ComplianceFrameworks|Set default"
msgstr "Définir par défaut"
@@ -11699,6 +11830,9 @@ msgstr "Moins de 2 approbateurs"
msgid "ComplianceReport|No projects found"
msgstr "Aucun projet trouvé"
+msgid "ComplianceReport|No projects found that match filters"
+msgstr "Aucun projet trouvé correspondant aux filtres"
+
msgid "ComplianceReport|No violations found"
msgstr "Aucune violation trouvée"
@@ -11733,25 +11867,25 @@ msgid "Component"
msgstr "Composant"
msgid "Component name '%{component}' for command id '%{command}' must not start with '%{prefix}'"
-msgstr "Le nom de composant « %{component} » pour l'id de commande « %{command} » ne doit pas commencer par « %{prefix} »"
+msgstr "Le nom de composant « %{component} » pour l'ID de commande « %{command} » ne doit pas commencer par « %{prefix} »"
msgid "Component name '%{component}' must not start with '%{prefix}'"
-msgstr "Le nom de composant « %{component} » ne doit pas commencer par « %{prefix} »"
+msgstr "Le nom de composant « %{component} » ne doit pas commencer par « %{prefix} »"
msgid "Component type '%s' is not yet supported"
-msgstr "Le type de composant « %s » n'est pas encore pris en charge"
+msgstr "Le type de composant « %s » n'est pas encore pris en charge"
msgid "Components must have a 'name'"
+msgstr "Les composants doivent avoir un « nom »"
+
+msgid "Compute minutes"
msgstr ""
msgid "Compute quota"
msgstr "Quota de calcul"
msgid "Compute quota:"
-msgstr ""
-
-msgid "Confidence"
-msgstr "Confiance"
+msgstr "Quota des unités de calcul :"
msgid "Confidential"
msgstr "Confidentiel"
@@ -11807,9 +11941,6 @@ msgstr "Configurer les délais d'expiration de Gitaly."
msgid "Configure Integrations"
msgstr "Configurer les intégrations"
-msgid "Configure Prometheus"
-msgstr "Configurer 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 "Paramétrez SAST pour IaC dans « f.gitlab-ci.yml » en utilisant le modèle géré de GitLab. Vous pouvez [modifier des variables](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) pour personnaliser les paramètres SAST pour IaC."
@@ -11846,9 +11977,6 @@ msgstr "Configurez les autorisations avancées, la fonctionnalité Stockage de f
msgid "Configure custom rules for Jira issue key matching"
msgstr "Configurer les règles personnalisées pour établir la correspondance avec les clés de tickets Jira"
-msgid "Configure existing installation"
-msgstr "Configurer l'installation existante"
-
msgid "Configure pipeline"
msgstr "Configurer le pipeline"
@@ -12011,15 +12139,9 @@ msgstr "Connexion à l'environnement de dépôt distant..."
msgid "Connecting..."
msgstr "Connexion en cours…"
-msgid "Connection failed"
-msgstr "La connexion a échoué"
-
msgid "Connection failure"
msgstr "Échec de connexion"
-msgid "Connection timed out"
-msgstr "La connexion a expiré"
-
msgid "Consistency guarantee method"
msgstr "Méthode de garantie de cohérence"
@@ -12399,7 +12521,7 @@ msgid "Containers"
msgstr "Conteneurs"
msgid "Contains only whitespace changes."
-msgstr ""
+msgstr "Contient uniquement des modifications d'espaces."
msgid "Content"
msgstr "Contenu"
@@ -12407,9 +12529,6 @@ msgstr "Contenu"
msgid "Content parsed with %{link}."
msgstr "Contenu analysé avec %{link}."
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr "Pour les %{quickActionsDocsLinkStart}actions rapides%{quickActionsDocsLinkEnd}, tapez %{keyboardStart}/%{keyboardEnd}."
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr "Vous devez fournir une fonction renderMarkdown ou un sérialiseur personnalisé"
@@ -12533,6 +12652,39 @@ msgstr "Il y a trop de données à calculer. Essayez de diminuer le paramètre p
msgid "ContributionAnalytics|Total Contributions"
msgstr "Total des contributions"
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr "Requête de fusion %{targetLink} approuvée dans %{resourceParentLink}."
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr "Projet %{resourceParentLink} rejoint."
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr "Projet %{resourceParentLink} quitté."
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr "Suppression due à l'expiration de l'abonnement de %{resourceParentLink}."
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr "Contributions du %{calendar_date}"
@@ -12662,11 +12814,8 @@ msgstr "Copier le lien"
msgid "Copy link URL"
msgstr "Copier l'URL du lien"
-msgid "Copy link to chart"
-msgstr "Copier le lien du graphique"
-
msgid "Copy merge request URL"
-msgstr "Copier l'URL de la demande de fusion"
+msgstr "Copier l'URL de la requête de fusion"
msgid "Copy reference"
msgstr "Copier la référence"
@@ -12830,6 +12979,9 @@ msgstr "Impossible de supprimer le déclencheur."
msgid "Could not restore the group"
msgstr "Impossible de restaurer le groupe"
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr "Impossible de révoquer le jeton d'accès %{access_token_name}."
@@ -12884,9 +13036,6 @@ msgstr "Créer %{environment}"
msgid "Create %{humanized_resource_name}"
msgstr "Créer %{humanized_resource_name}"
-msgid "Create %{type}"
-msgstr "Créer %{type}"
-
msgid "Create %{workspace} label"
msgstr "Créer un label de %{workspace}"
@@ -12929,6 +13078,9 @@ msgstr "Créer une nouvelle branche"
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr "Veuillez créer un nouveau fichier, car il n'en existe pas encore. Vous pourrez ensuite valider vos modifications."
+msgid "Create a new fork"
+msgstr "Créer une nouvelle bifurcation"
+
msgid "Create a new issue"
msgstr "Créer un nouveau ticket"
@@ -13214,6 +13366,9 @@ msgstr "Fin de l'étape de ticket"
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr "Longueur maximale de %{maxLength} caractères"
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr "%{minLength} caractères minimum"
+
msgid "CreateValueStreamForm|Name is required"
msgstr "Le nom est requis"
@@ -13358,9 +13513,6 @@ msgstr "Création en cours"
msgid "Creating epic"
msgstr "Création de l'épopée en cours"
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr "La création de graphes utilise les données en provenance du serveur Prometheus. Si cela prend beaucoup de temps, assurez-vous que les données sont disponibles."
-
msgid "Creator"
msgstr "Créateur"
@@ -13829,7 +13981,7 @@ msgid "DORA4Metrics|Change failure rate (percentage)"
msgstr "Taux d'échec des modifications (pourcentage)"
msgid "DORA4Metrics|Closed issues"
-msgstr ""
+msgstr "Tickets fermés"
msgid "DORA4Metrics|Critical Vulnerabilities over time"
msgstr "Vulnérabilités critiques au cours du temps"
@@ -13895,7 +14047,7 @@ msgid "DORA4Metrics|Median time an incident was open in a production environment
msgstr "Durée médiane pendant laquelle un incident était ouvert dans un environnement de production au cours de la période de temps donnée."
msgid "DORA4Metrics|Merge request throughput"
-msgstr ""
+msgstr "Débit des requêtes de fusion"
msgid "DORA4Metrics|Metrics comparison for %{name} group"
msgstr "Comparaison des métriques pour le groupe %{name}"
@@ -13952,7 +14104,7 @@ msgid "DORA4Metrics|The chart displays the median time between a merge request b
msgstr "Le graphique affiche le temps médian entre la fusion d'une requête de fusion et son déploiement vers le ou les environnements de production basés sur la valeur %{linkStart}deployment_tier%{linkEnd}."
msgid "DORA4Metrics|This is a lower-bound approximation. Your group has too many issues and MRs to calculate in real time."
-msgstr ""
+msgstr "Il s'agit d'une approximation de limite inférieure. Votre groupe a trop de tickets et de MR pour un calcul en temps réel."
msgid "DORA4Metrics|Time to Restore Service"
msgstr "Délai de restauration du service"
@@ -14452,7 +14604,7 @@ msgid "Data type"
msgstr "Type de données"
msgid "Database '%{database_name}' is using PostgreSQL %{pg_version_current}, but this version of GitLab requires PostgreSQL %{pg_version_minimum}. Please upgrade your environment to a supported PostgreSQL version. See %{pg_requirements_url} for details."
-msgstr "La base de données « %{database_name} » utilise PostgreSQL %{pg_version_current} mais cette version de GitLab nécessite PostgreSQL %{pg_version_minimum}. Veuillez mettre à jour votre environnement vers une version de PostgreSQL prise en charge. Voir %{pg_requirements_url} pour plus de détails."
+msgstr "La base de données « %{database_name} » utilise PostgreSQL %{pg_version_current}, mais cette version de GitLab nécessite PostgreSQL %{pg_version_minimum}. Veuillez mettre à niveau votre environnement vers une version de PostgreSQL prise en charge. Consultez %{pg_requirements_url} pour plus de détails."
msgid "Database update failed"
msgstr "La mise à jour de la base de données a échoué"
@@ -14582,6 +14734,12 @@ msgstr "La validation de la taille de l'archive décompressée a échoué."
msgid "Decrease"
msgstr "Diminuer"
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr "Par défaut, ne jamais exécuter"
@@ -14634,7 +14792,7 @@ msgid "DefaultBranchProtection|Both developers and maintainers can push new comm
msgstr "Les développeurs et les chargés de maintenance peuvent pousser de nouvelles validations, forcer les poussées ou supprimer la branche."
msgid "DefaultBranchProtection|Developers can push the initial commit to a repository, but none afterward. Maintainers can always push. No one can force push."
-msgstr "Les développeurs peuvent pousser le commit initial vers un dépôt, mais aucun après. Les mainteneurs peuvent toujours pousser. Personne ne peut forcer les poussées."
+msgstr "Les développeurs peuvent pousser la validation initiale vers un dépôt, mais aucune après. Les chargés de maintenance peuvent toujours pousser. Personne ne peut forcer les poussées."
msgid "DefaultBranchProtection|Developers cannot push new commits, but are allowed to accept merge requests to the branch. Maintainers can push to the branch."
msgstr "Les développeurs ne peuvent pas pousser de nouvelles validations, mais sont autorisés à accepter des requêtes de fusion vers la branche. Les chargés de maintenance peuvent pousser vers la branche."
@@ -14743,8 +14901,8 @@ msgstr "Supprimer le bloc de code"
msgid "Delete column"
msgid_plural "Delete %d columns"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Supprimer la colonne"
+msgstr[1] "Supprimer %d colonnes"
msgid "Delete comment"
msgstr "Supprimer le commentaire"
@@ -14805,8 +14963,8 @@ msgstr "Supprimer la version de release %{release} ?"
msgid "Delete row"
msgid_plural "Delete %d rows"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Supprimer la ligne"
+msgstr[1] "Supprimer %d lignes"
msgid "Delete selected"
msgstr "Supprimer la sélection"
@@ -14847,6 +15005,9 @@ msgstr "Supprimer la variable"
msgid "Delete video"
msgstr "Supprimer la vidéo"
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr "Échec de la suppression du dépôt du design. Veuillez réessayer ou contacter l'administrateur."
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr "Impossible de supprimer les événements. Veuillez réessayer ou contacter l'administrateur."
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] "%d vulnérabilité détectée"
msgstr[1] "%d vulnérabilités détectées"
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr "%{remainingLicensesCount} autres"
@@ -15005,9 +15172,15 @@ msgstr "Emplacement et chemin de dépendance"
msgid "Dependencies|Packager"
msgstr "Empaqueteur"
+msgid "Dependencies|Projects"
+msgstr "Projets"
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr "Nomenclature logicielle (SBOM) basée sur l'analyse %{linkStart}réussie la plus récente%{linkEnd}"
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr "Nomenclature logicielle (SBOM) basée sur l'analyse réussie la plus récente de chaque projet."
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr "Le job %{codeStartTag}dependency_scanning%{codeEndTag} a échoué et ne peut pas générer la liste. Assurez-vous que le job s'exécute correctement et réexécutez le pipeline."
@@ -15041,6 +15214,9 @@ msgstr "Les chaînes de dépendances ne sont pas prises en charge"
msgid "Dependency list"
msgstr "Liste des dépendances"
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr "Tous les éléments du cache sont programmés pour suppression."
@@ -15059,6 +15235,9 @@ msgstr "Configurer dans les paramètres"
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr "Contient %{count} blobs d'images (%{size})"
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr "Copier le chemin d'accès de l'image"
@@ -15083,6 +15262,9 @@ msgstr "Activez le proxy de dépendance et les paramètres pour vider le cache."
msgid "DependencyProxy|Image list"
msgstr "Liste d'images"
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr "Programmé pour suppression"
@@ -15092,6 +15274,9 @@ msgstr "Il n'y a aucune image dans le cache"
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr "Pour voir le préfixe d'image et ce qu'il y a dans le cache, visitez le %{linkStart}Proxy de Dépendance%{linkEnd}"
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr "Cette option activée, les images de plus de 90 jours seront supprimées du cache."
@@ -15404,9 +15589,6 @@ msgstr "Chargés de maintenance"
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr "Définissez la façon dont les règles d'approbation sont appliquées aux déploiements dans les environnements protégés."
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr "Lorsqu'un pipeline s'exécute, les jobs de déploiement sont automatiquement approuvées dans le pipeline si l'auteur du déclenchement est autorisé à approuver."
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr "Approbations actuelles : %{current}"
@@ -15559,12 +15741,6 @@ msgstr "réussi"
msgid "Deprecated API rate limits"
msgstr "Limitations de fréquence des API dépréciées"
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr "Pour plus d'informations sur un possible remplacement, %{epicStart} apprenez-en plus sur Opstrace %{epicEnd}."
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr "La fonctionnalité des métriques est obsolète depuis GitLab 14.7."
-
msgid "Deprioritize label"
msgstr "Déprioriser le label"
@@ -15574,9 +15750,6 @@ msgstr "Décrivez l'objectif des modifications et ce que les relecteurs doivent
msgid "Description"
msgstr "Description"
-msgid "Description (alt text)"
-msgstr "Description (texte alternatif)"
-
msgid "Description (optional)"
msgstr "Description (facultative)"
@@ -15596,7 +15769,7 @@ msgid "Descriptive label"
msgstr "Label descriptif"
msgid "Design"
-msgstr "Esquisse"
+msgstr "Design"
msgid "Design Management files and data"
msgstr "Fichiers et données de la gestion des designs"
@@ -15640,7 +15813,7 @@ msgid "DesignManagement|Are you sure you want to cancel editing this comment?"
msgstr "Voulez-vous vraiment annuler la modification de ce commentaire ?"
msgid "DesignManagement|Cancel"
-msgstr ""
+msgstr "Annuler"
msgid "DesignManagement|Click the image where you'd like to start a new discussion"
msgstr "Cliquez sur l'image à l'emplacement où vous souhaitez démarrer une nouvelle discussion"
@@ -15667,7 +15840,7 @@ msgid "DesignManagement|Could not update comment. Please try again."
msgstr "Impossible de mettre à jour le commentaire. Veuillez réessayer."
msgid "DesignManagement|Could not update description. Please try again."
-msgstr ""
+msgstr "Impossible de mettre à jour la description. Veuillez réessayer."
msgid "DesignManagement|Could not update discussion. Please try again."
msgstr "Impossible de mettre à jour la discussion. Veuillez réessayer."
@@ -15676,7 +15849,7 @@ msgid "DesignManagement|Deselect all"
msgstr "Tout désélectionner"
msgid "DesignManagement|Design description"
-msgstr ""
+msgstr "Description du design"
msgid "DesignManagement|Designs"
msgstr "Designs"
@@ -15691,7 +15864,7 @@ msgid "DesignManagement|Download design"
msgstr "Télécharger le design"
msgid "DesignManagement|Edit description"
-msgstr ""
+msgstr "Modifier la description"
msgid "DesignManagement|Error uploading a new design. Please try again."
msgstr "Une erreur s'est produite lors du téléversement d'un nouveau design. Veuillez réessayer."
@@ -15706,7 +15879,7 @@ msgid "DesignManagement|Go to previous design"
msgstr "Aller au design précédent"
msgid "DesignManagement|None"
-msgstr ""
+msgstr "Aucun"
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr "La version de design demandée n'existe pas. La dernière version est affichée à la place"
@@ -15718,7 +15891,7 @@ msgid "DesignManagement|Resolved Comments"
msgstr "Commentaires résolus"
msgid "DesignManagement|Save"
-msgstr ""
+msgstr "Enregistrer"
msgid "DesignManagement|Save comment"
msgstr "Enregistrer le commentaire"
@@ -15751,7 +15924,7 @@ msgid "DesignManagement|Upload skipped. %{reason}"
msgstr "Téléversement ignoré. %{reason}"
msgid "DesignManagement|Write a comment or drag your files here…"
-msgstr ""
+msgstr "Écrivez un commentaire ou faites glisser vos fichiers ici…"
msgid "DesignManagement|Your designs are being copied and are on their way… Please refresh to update."
msgstr "Vos designs sont en cours de copie et sont en route… Veuillez actualiser pour effectuer la mise à jour."
@@ -16221,7 +16394,7 @@ msgid "Display alerts from all configured monitoring tools."
msgstr "Affichez les alertes depuis tous les outils de supervision configurés."
msgid "Display as:"
-msgstr "Afficher comme :"
+msgstr "Afficher comme :"
msgid "Display milestones"
msgstr "Afficher les jalons"
@@ -16278,7 +16451,7 @@ msgid "DomainVerification|Add Domain"
msgstr "Ajouter un domaine"
msgid "DomainVerification|Are you sure you want to delete this domain?"
-msgstr "Voulez-vous vraiment supprimer ce domaine ?"
+msgstr "Voulez-vous vraiment supprimer ce domaine ?"
msgid "DomainVerification|Delete domain"
msgstr "Supprimer le domaine"
@@ -16296,7 +16469,7 @@ msgid "DomainVerification|Edit Domain"
msgstr "Modifier le domaine"
msgid "DomainVerification|Enter your domain"
-msgstr "Entrez votre domaine"
+msgstr "Entrer votre domaine"
msgid "DomainVerification|Failed to verify domain ownership"
msgstr "La vérification de la propriété du domaine a échoué"
@@ -16305,10 +16478,10 @@ msgid "DomainVerification|How do I configure a domain?"
msgstr "Comment configurer un domaine ?"
msgid "DomainVerification|How to set up DNS records?"
-msgstr "Comment configurer les enregistrements DNS ?"
+msgstr "Comment configurer les enregistrements DNS ?"
msgid "DomainVerification|Manually enter certificate information"
-msgstr "Entrez manuellement les informations du certificat"
+msgstr "Entrer manuellement les informations du certificat"
msgid "DomainVerification|New Domain"
msgstr "Nouveau domaine"
@@ -16325,8 +16498,8 @@ msgstr "La propriété du domaine a été vérifiée avec succès"
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr "Les domaines suivants sont configurés pour les projets de ce groupe. Les utilisateurs dont les adresses de courriel correspondent à un domaine vérifié n'ont pas besoin de confirmer leur compte."
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
-msgstr "Pour vérifier qui est propriétaire de votre domaine, ajoutez la clé ci-dessus à un enregistrement TXT dans votre configuration DNS. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
+msgstr "Pour vérifier la propriété de votre domaine, ajoutez la clé ci-dessus à un enregistrement TXT dans votre configuration DNS sous sept jours. %{link_to_help}"
msgid "Don't have a group?"
msgstr "Vous n'avez pas de groupe ?"
@@ -16370,15 +16543,15 @@ msgstr "Télécharger (%{fileSizeReadable})"
msgid "Download (%{size})"
msgstr "Télécharger (%{size})"
-msgid "Download CSV"
-msgstr "Télécharger le CSV"
-
msgid "Download PDF"
msgstr "Télécharger le PDF"
msgid "Download artifacts"
msgstr "Télécharger les artéfacts"
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr "Télécharger les codes"
@@ -16407,7 +16580,7 @@ msgid "DownloadSource|Download"
msgstr "Télécharger"
msgid "Downloads"
-msgstr ""
+msgstr "Téléchargements"
msgid "Downstream"
msgstr "En aval"
@@ -16664,6 +16837,9 @@ msgstr "Modifier la clé de déploiement publique"
msgid "Edit sidebar"
msgstr "Modifier la barre latérale"
+msgid "Edit single file"
+msgstr "Modifier le fichier unique"
+
msgid "Edit table"
msgstr "Modifier le tableau"
@@ -16769,6 +16945,9 @@ msgstr "Impossible d'envoyer le courriel"
msgid "Email display name"
msgstr "Nom à afficher pour le courriel"
+msgid "Email must be provided."
+msgstr "L'adresse de courriel doit être fournie."
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr "Adresse de courriel non vérifiée. Veuillez vérifier votre adresse de courriel dans Salesforce."
@@ -17085,7 +17264,7 @@ msgid "End time"
msgstr "Heure de fin"
msgid "Endpoint name '%{endpoint}' of component '%{component}' must not start with '%{prefix}'"
-msgstr "Le nom du point de terminaison « %{endpoint} » du composant « %{component} » ne doit pas commencer par « %{prefix} »"
+msgstr "Le nom du point de terminaison « %{endpoint} » du composant « %{component} » ne doit pas commencer par « %{prefix} »"
msgid "Ends"
msgstr "Se termine"
@@ -17105,9 +17284,6 @@ msgstr "Imposer l'authentification à deux facteurs pour toutes les connexions d
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr "Améliorez la sécurité en stockant les clés de compte de service dans des gestionnaires de secrets. En savoir plus sur la %{docLinkStart}gestion de secrets avec GitLab%{docLinkEnd}"
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr "Assurez-vous que la connectivité est disponible entre le serveur GitLab et le serveur Prometheus"
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr "Assurez-vous que votre %{linkStart}environnement fait partie de l'étape de déploiement%{linkEnd} de votre pipeline CI pour pouvoir suivre les déploiements dans votre cluster."
@@ -17168,9 +17344,6 @@ msgstr "Entrez le code fourni par votre application d'authentification à deux f
msgid "Enter the following to confirm:"
msgstr "Entrez ce qui suit pour confirmer :"
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr "Saisissez le nom de votre application. Un %{type} unique vous sera ensuite fourni."
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr "Entrez le nombre de secondes ou toute autre expression lisible telle que «°1°heure°». Ce délai d'expiration a la priorité sur les délais plus courts définis pour le projet."
@@ -17198,17 +17371,20 @@ msgstr "Saisissez votre mot de passe pour approuver"
msgid "Enterprise"
msgstr "Entreprise"
+msgid "Enterprise User"
+msgstr "Utilisateur Enterprise"
+
+msgid "Enterprise User Account on GitLab"
+msgstr "Compte d'utilisateur Enterprise sur GitLab"
+
msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr "Les détails de l'utilisateur ne peuvent pas être mis à jour"
msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr "L'utilisateur ne correspond pas à la définition « Utilisateur Enterprise » de ce groupe"
-msgid "EnterpriseUsers|The user is already an enterprise user"
-msgstr "L'utilisateur est déjà un utilisateur Enterprise"
-
-msgid "EnterpriseUsers|The user is not a member of the group"
-msgstr "L'utilisateur n'est pas membre de ce groupe"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
+msgstr "L'utilisateur est déjà un utilisateur Enterprise du groupe"
msgid "Environment"
msgstr "Environnement"
@@ -17372,9 +17548,6 @@ msgstr "Agent GitLab"
msgid "Environments|Job"
msgstr "Tâche"
-msgid "Environments|Learn about environments"
-msgstr "En savoir plus sur les environnements"
-
msgid "Environments|Learn more about stopping environments"
msgstr "En savoir plus sur l'arrêt des environnements"
@@ -17387,9 +17560,6 @@ msgstr "Nouvel environnement"
msgid "Environments|New environment"
msgstr "Nouvel environnement"
-msgid "Environments|No deployed environments"
-msgstr "Aucun environnement déployé"
-
msgid "Environments|No deployments yet"
msgstr "Aucun déploiement pour le moment"
@@ -17424,7 +17594,7 @@ msgid "Environments|Search by environment name"
msgstr "Rechercher par nom d'environnement"
msgid "Environments|Select agent"
-msgstr "Sélectionnez un agent"
+msgstr "Sélectionner un agent"
msgid "Environments|Select which environments to clean up. Protected environments are excluded. Learn more about cleaning up environments."
msgstr "Sélectionnez les environnements à nettoyer. Les environnements protégés sont exclus. En savoir plus sur le nettoyage des environnements."
@@ -17493,7 +17663,7 @@ msgid "Environment|Deployments"
msgstr "Déploiements"
msgid "Environment|Environment health"
-msgstr ""
+msgstr "Santé environnementale"
msgid "Environment|External IP"
msgstr "IP externe"
@@ -17502,7 +17672,7 @@ msgid "Environment|Failed"
msgstr "Échec"
msgid "Environment|Healthy"
-msgstr ""
+msgstr "En bonne santé"
msgid "Environment|Jobs"
msgstr "Jobs"
@@ -17538,7 +17708,7 @@ msgid "Environment|Summary"
msgstr "Résumé"
msgid "Environment|Unhealthy"
-msgstr ""
+msgstr "En mauvaise santé"
msgid "Epic"
msgstr "Épopée"
@@ -17585,12 +17755,6 @@ msgstr "Les épopées vous permettent de gérer votre portefeuille de projets pl
msgid "Epics, issues, and merge requests"
msgstr "Épopées, tickets et requêtes de fusion"
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr "%{startDate} – %{dueDate}"
-
-msgid "Epics|%{startDate} – No due date"
-msgstr "%{startDate} – Pas de date d'échéance"
-
msgid "Epics|Add a new epic"
msgstr "Ajouter une nouvelle épopée"
@@ -17606,9 +17770,6 @@ msgstr "Voulez-vous vraiment supprimer %{bStart}%{targetIssueTitle}%{bEnd} de %{
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr "Laisser vide pour hériter des dates du jalon"
-msgid "Epics|No start date – %{dueDate}"
-msgstr "Pas de date de début – %{dueDate}"
-
msgid "Epics|Remove epic"
msgstr "Supprimer l'épopée"
@@ -18054,13 +18215,13 @@ msgid "Even if you reach the number of seats in your subscription, you can conti
msgstr "Même si vous atteignez le nombre de sièges dans votre abonnement, vous pouvez continuer à ajouter des utilisateurs. GitLab vous facturera l'excédent."
msgid "Event '%{event}' of type '%{event_type}' must not start with '%{prefix}'"
-msgstr "L'événement « %{event} » de type « %{event_type} » ne doit pas commencer par « %{prefix} »"
+msgstr "L'événement « %{event} » de type « %{event_type} » ne doit pas commencer par « %{prefix} »"
msgid "Event tag (optional)"
msgstr "Tag d'événement (facultatif)"
msgid "Event type '%s' is not yet supported"
-msgstr "Le type d'événement « %s » n'est pas encore pris en charge"
+msgstr "Le type d'événement « %s » n'est pas encore pris en charge"
msgid "EventFilterBy|Filter by all"
msgstr "Tout filtrer"
@@ -18561,12 +18722,18 @@ msgstr[1] "Jobs ayant échoué"
msgid "Failed on"
msgstr "Échec le"
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr "Cette action (%{action}) a échoué pour cet élément de travail : %{reason}."
+
msgid "Failed to add a Zoom meeting"
msgstr "Échec de l'ajout d'une réunion Zoom"
msgid "Failed to add a resource link"
msgstr "Échec de l'ajout d'un lien de ressource"
+msgid "Failed to add emoji. Please try again"
+msgstr "Échec de l'ajout d'un émoji. Veuillez réessayer"
+
msgid "Failed to apply commands."
msgstr "Échec de l'application des commandes."
@@ -18605,9 +18772,6 @@ msgstr "Impossible de cloner ce ticket, car le projet cible n'existe pas."
msgid "Failed to clone this issue: wrong parameters."
msgstr "Impossible de cloner ce ticket°: paramètres incorrects."
-msgid "Failed to convert this work item: %{reason}."
-msgstr "Échec de la conversion de cet élément de travail : %{reason}."
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr "Échec de la création d'une branche pour ce ticket. Veuillez réessayer."
@@ -18752,6 +18916,9 @@ msgstr "Échec de la suppression d'une réunion Zoom"
msgid "Failed to remove a to-do item for the design."
msgstr "Échec de la suppression d'un pense-bête pour le design."
+msgid "Failed to remove emoji. Please try again"
+msgstr "Échec de la suppression de l'émoji. Veuillez réessayer"
+
msgid "Failed to remove mirror."
msgstr "Impossible de supprimer le miroir."
@@ -18773,6 +18940,9 @@ msgstr "Échec de la récupération de la page"
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr "Échec de l'enregistrement des résolutions des conflits de fusion. Veuillez réessayer !"
+msgid "Failed to save namespace commit email."
+msgstr "Échec de l'enregistrement de l'adresse de courriel de validation de l'espace de nommage."
+
msgid "Failed to save new settings"
msgstr "Échec de l'enregistrement des nouveaux paramètres"
@@ -18839,9 +19009,6 @@ msgstr "La favicon sera supprimée. Voulez-vous continuer ?"
msgid "Feature Flags"
msgstr "Indicateurs de fonctionnalités"
-msgid "Feature deprecation"
-msgstr "Dépréciation de fonctionnalité"
-
msgid "Feature flag status"
msgstr "État de l'indicateur de fonctionnalité"
@@ -19144,6 +19311,9 @@ msgstr "Les fichiers avec des modifications importantes sont réduits par défau
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr "Fichiers, répertoires et sous-modules du chemin d'accès %{path} pour la référence de validation %{ref}"
+msgid "Fill in merge request template"
+msgstr "Remplir le modèle de requête de fusion"
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr "Remplissez les champs ci-dessous, sélectionnez %{strong_open}Activer l'authentification SAML pour ce groupe%{strong_close} et appuyez sur %{strong_open}Enregistrer les modifications%{strong_close}"
@@ -19375,9 +19545,6 @@ msgstr "Pour chaque tâche, clonez le dépôt."
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr "Pour chaque tâche, réutilisez l'espace de travail du projet. S'il n'en existe pas, utilisez %{code_open}git clone%{code_close}."
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr "Par exemple, l'application utilisant le jeton ou le but du jeton. Ne donnez pas d'informations sensibles pour le nom du jeton, car elles seront visibles pour tous les membres du %{resource_type}."
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr "Pour les fichiers de taille supérieure à cette limite, n'indexer que le nom. Le contenu du fichier ne sera ni indexé ni accessible aux recherches."
@@ -19387,6 +19554,9 @@ msgstr "Pour un usage générique"
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr "Pour une utilisation individuelle, créez un compte distinct avec votre adresse de courriel personnelle, non relié à votre groupe ou domaine de messagerie Entreprise."
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr "Pour une utilisation individuelle, créez un compte distinct avec votre adresse de courriel personnelle, non relié à votre domaine de messagerie Entreprise."
+
msgid "For investigating IT service disruptions or outages"
msgstr "Pour enquêter sur les perturbations ou les pannes des services informatiques"
@@ -19403,13 +19573,13 @@ msgid "For more information, see the File Hooks documentation."
msgstr "Pour en savoir plus, consultez la documentation sur les crochets de fichiers."
msgid "For the next few releases, you can go to your avatar at any time to turn the new navigation on and off."
-msgstr "Pour encore quelques prochaines versions, vous pouvez aller à tout moment sur votre avatar pour activer ou désactiver la nouvelle navigation."
+msgstr "Pour encore quelques versions de release, vous pouvez aller à tout moment sur votre avatar pour activer ou désactiver la nouvelle navigation."
msgid "Forbidden"
msgstr "Interdit"
msgid "Forecast horizon must be positive and %{max_horizon} days at the most."
-msgstr "L'horizon de prévision doit être positif et de %{max_horizon} jours au maximum."
+msgstr "L'horizon de prévision doit être positif et de %{max_horizon} jours au maximum."
msgid "Forgot your password?"
msgstr "Mot de passe oublié ?"
@@ -19556,7 +19726,7 @@ msgid "Framework successfully deleted"
msgstr "Cadriciel supprimé avec succès"
msgid "Frameworks can not be added to projects in personal namespaces. %{linkStart}What are personal namespaces?%{linkEnd}"
-msgstr ""
+msgstr "Les cadriciels ne peuvent pas être ajoutés aux projets dans les espaces de nommage personnels. %{linkStart}Que sont les espaces de nommage personnels ?%{linkEnd}"
msgid "Free Trial of GitLab.com Ultimate"
msgstr "Essai Gratuit de GitLab.com Ultimate"
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] "Les groupes gratuits sont limités à %{free_user_limit} membre. Les autres membres, qui dépasseront la limite, n'auront plus accès au groupe."
msgstr[1] "Les groupes gratuits sont limités à %{free_user_limit} membres. Les autres membres, qui dépasseront la limite, n'auront plus accès au groupe."
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr "Les groupes principaux gratuits seront bientôt limités à %{free_users_limit} utilisateurs et à %{free_storage_limit} de données"
+
msgid "Free trial will expire in %{days}"
msgstr "La période d'essai gratuit se termine dans %{days}"
@@ -19629,6 +19802,9 @@ msgstr "De %{providerTitle}"
msgid "From issue creation until deploy to production"
msgstr "Depuis la création du ticket jusqu'au déploiement en production"
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr "Depuis la fusion de la demande de fusion jusqu'au déploiement en production"
@@ -19686,6 +19862,9 @@ msgstr "Générer un nouvel export"
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr "Générer des jetons d'accès au projet, de portée limitée au projet, pour vos applications qui ont besoin de l'API GitLab."
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr "Générer la clé du site et la clé privée sur"
@@ -20302,9 +20481,6 @@ msgstr "Premiers pas avec GitLab"
msgid "Get started with error tracking"
msgstr "Premiers pas avec le suivi des erreurs"
-msgid "Get started with performance monitoring"
-msgstr "Premiers pas avec la surveillance des performances"
-
msgid "Get started!"
msgstr "Lancez-vous !"
@@ -20420,10 +20596,10 @@ msgid "GitLab Billing Team."
msgstr "Équipe de facturation GitLab."
msgid "GitLab Community Edition"
-msgstr "GitLab Édition Communautaire"
+msgstr "GitLab Community Edition"
msgid "GitLab Enterprise Edition"
-msgstr "GitLab Édition Entreprise"
+msgstr "GitLab Enterprise Edition"
msgid "GitLab Error Tracking"
msgstr "Suivi d'erreurs de GitLab"
@@ -20785,8 +20961,11 @@ msgstr "Pour utiliser l'intégration, chaque utilisateur doit également activer
msgid "Gitpod|https://gitpod.example.com"
msgstr "https://gitpod.exemple.com"
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
-msgstr "Donnez-nous votre avis"
+msgstr "Donner votre avis"
msgid "Given access %{time_ago}"
msgstr "Accès donné %{time_ago}"
@@ -20824,6 +21003,9 @@ msgstr "Erreur lors du chargement des agrégations."
msgid "GlobalSearch|Close"
msgstr "Fermer"
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr "Erreur de récupération des agrégations."
+
msgid "GlobalSearch|Group"
msgstr "Groupe"
@@ -20842,6 +21024,9 @@ msgstr "Tickets que j'ai créés"
msgid "GlobalSearch|Issues assigned to me"
msgstr "Tickets qui me sont assignés"
+msgid "GlobalSearch|Label(s)"
+msgstr "Label(s)"
+
msgid "GlobalSearch|Language"
msgstr "Langage"
@@ -20854,6 +21039,9 @@ msgstr "Requêtes de fusion qui me sont assignées"
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr "Requêtes de fusion dont je suis relecteur"
+msgid "GlobalSearch|No labels found"
+msgstr "Aucun label trouvé"
+
msgid "GlobalSearch|Project"
msgstr "Projet"
@@ -20890,6 +21078,9 @@ msgstr "Rechercher sur GitLab %{kbdOpen}/%{kbdClose}"
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr "Rechercher des projets, des tickets et d'autres choses."
+msgid "GlobalSearch|Search labels"
+msgstr "Rechercher des labels"
+
msgid "GlobalSearch|Search results are loading"
msgstr "Les résultats de la recherche sont en cours de chargement"
@@ -21319,9 +21510,6 @@ msgstr "Informations du groupe :"
msgid "Group information"
msgstr "Informations du groupe"
-msgid "Group is required when cluster_type is :group"
-msgstr "Un groupe est requis lorsque cluster_type est :group"
-
msgid "Group jobs by"
msgstr "Grouper les tâches par"
@@ -21613,6 +21801,9 @@ msgstr "Jeton SCIM"
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr "Empreinte SHA1 du certificat de signature du jeton SAML. Obtenez-la auprès de votre fournisseur d'identité, où elle peut également être appelée «°fingerprint°» ou «°thumbprint°»."
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr "Certaines branches sont inaccessibles, car votre session SAML a expiré. Pour accéder aux branches, sélectionnez le chemin d'accès du groupe pour vous réauthentifier."
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr "Certains pense-bêtes peuvent être masqués car votre session SAML a expiré. Sélectionnez le chemin du groupe pour vous réauthentifier et les voir."
@@ -21740,7 +21931,7 @@ msgid "GroupSettings|Email notifications are disabled"
msgstr "Les notifications par courriel sont désactivées"
msgid "GroupSettings|Enable overview background aggregation for Value Streams Dashboard"
-msgstr ""
+msgstr "Activer l'agrégation en arrière-plan de la vue d'ensemble pour le tableau de bord des chaînes de valeur"
msgid "GroupSettings|Export group"
msgstr "Exporter un groupe"
@@ -21836,7 +22027,7 @@ msgid "GroupSettings|Users can create %{link_start_project}project access tokens
msgstr "Les utilisateurs peuvent créer des %{link_start_project}jetons d'accès au projet%{link_end} et des %{link_start_group}jetons d'accès au groupe%{link_end} dans ce groupe"
msgid "GroupSettings|Value Streams Dashboard"
-msgstr "Tableau de bord de la chaîne de valeur"
+msgstr "Tableau de bord des chaînes de valeur"
msgid "GroupSettings|What are badges?"
msgstr "Que sont les badges°?"
@@ -22286,12 +22477,6 @@ msgstr "Les notifications et autres actions %{issueType} ont été déplacées v
msgid "HeaderAction|Okay!"
msgstr "D'accord !"
-msgid "HeaderAction|incident"
-msgstr "incident"
-
-msgid "HeaderAction|issue"
-msgstr "ticket"
-
msgid "Headers"
msgstr "En-têtes"
@@ -22406,11 +22591,6 @@ msgstr "Masquer l'aperçu en direct"
msgid "Hide archived projects"
msgstr "Masquer les projets archivés"
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] "Masquer le graphique"
-msgstr[1] "Masquer les graphiques"
-
msgid "Hide comments"
msgstr "Masquer les commentaires"
@@ -22557,12 +22737,24 @@ msgstr "Maintenance"
msgid "Housekeeping successfully started"
msgstr "Maintenance démarrée avec succès"
+msgid "How do I change my password in GitLab?"
+msgstr "Comment puis-je modifier mon mot de passe dans GitLab ?"
+
+msgid "How do I clone a repository?"
+msgstr "Comment puis-je cloner un dépôt ?"
+
msgid "How do I configure Akismet?"
msgstr "Comment configurer Akismet ?"
msgid "How do I configure this integration?"
msgstr "Comment configurer cette intégration ?"
+msgid "How do I create a template?"
+msgstr "Comment puis-je créer un modèle ?"
+
+msgid "How do I fork a project?"
+msgstr "Comment puis-je créer une bifurcation pour un projet ?"
+
msgid "How do I generate it?"
msgstr "Comment puis-je la générer ?"
@@ -23185,6 +23377,9 @@ msgstr "Propriétaire"
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr "La réimportation crée un nouveau projet. Il n'est pas synchronisé avec le projet existant."
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr "Dépôt dépassant la limite de taille autorisée."
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr "L'interrogation des espaces de noms a échoué"
@@ -23244,6 +23439,9 @@ msgstr "Il n'y a pas de dépôt Git valide à cette URL. Si votre dépôt HTTP n
msgid "Improve customer support with Service Desk"
msgstr "Améliorer le support client avec Service Desk"
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr "Améliorez les performances d'indexation en augmentant la charge Sidekiq. Les valeurs supérieures à la limite de shard actuelle (%{limit}) ne sont pas autorisées."
+
msgid "Improve quality with test cases"
msgstr "Améliorer la qualité avec les scénarios de test"
@@ -23260,7 +23458,7 @@ msgid "In progress"
msgstr "En cours"
msgid "In progress, queued for %{queuedDuration} seconds"
-msgstr "En cours, mis en file d'attente pendant %{queuedDuration} secondes"
+msgstr "En cours, mis en file d'attente pendant %{queuedDuration} secondes"
msgid "In the background, we're attempting to connect you again."
msgstr "En arrière-plan, nous essayons de vous reconnecter."
@@ -24066,6 +24264,12 @@ msgstr "Non terminé(s)"
msgid "Increase"
msgstr "Augmenter"
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr "La fonctionnalité %{featureName} est en phase d'incubation"
@@ -24183,8 +24387,8 @@ msgstr "Insérer une colonne avant"
msgid "Insert comment template"
msgstr "Insérer un modèle de commentaire"
-msgid "Insert link"
-msgstr "Insérer un lien"
+msgid "Insert link (%{modifierKey}K)"
+msgstr ""
msgid "Insert or edit diagram"
msgstr "Insérer ou modifier un diagramme"
@@ -24216,9 +24420,6 @@ msgstr "Ce projet est masqué par un filtre du fichier insights.yml (veuillez co
msgid "Install GitLab Runner and ensure it's running."
msgstr "Installez GitLab Runner et assurez-vous qu'il est en cours d'exécution."
-msgid "Install on clusters"
-msgstr "Installer sur des clusters"
-
msgid "Installation"
msgstr "Installation"
@@ -24558,7 +24759,7 @@ msgid "Introducing Your DevOps Reports"
msgstr "Présentation de Vos Rapports DevOps"
msgid "Invalid 'schemaVersion' '%s'"
-msgstr ""
+msgstr "La version « %s » pour « schemaVersion » n'est pas valide"
msgid "Invalid Insights config file detected"
msgstr "Fichier de configuration Insights non valide détecté"
@@ -25163,10 +25364,10 @@ msgid "IssueTracker|Use Bugzilla as this project's issue tracker. %{docs_link}"
msgstr "Utiliser Bugzilla comme gestionnaire de tickets pour ce projet. %{docs_link}"
msgid "IssueTracker|Use ClickUp as this project's issue tracker. %{docs_link}"
-msgstr "Utiliser ClickUp comme gestionnaire de tickets pour ce projet. %{docs_link}"
+msgstr "Utilisez ClickUp comme gestionnaire de tickets pour ce projet. %{docs_link}"
msgid "IssueTracker|Use Clickup as this project's issue tracker."
-msgstr "Utiliser Clickup comme gestionnaire de tickets pour ce projet."
+msgstr "Utilisez Clickup comme gestionnaire de tickets pour ce projet."
msgid "IssueTracker|Use IBM Engineering Workflow Management as this project's issue tracker."
msgstr "Utiliser IBM Engineering Workflow Management comme gestionnaire de tickets pour ce projet."
@@ -25294,6 +25495,9 @@ msgstr "Aucune donnée ne semble être actuellement disponible pour la couvertur
msgid "It's you"
msgstr "C'est vous"
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr "Texte en italique"
@@ -25538,31 +25742,31 @@ msgid "Jira-GitLab user mapping template"
msgstr "Modèle de correspondances d'utilisateurs Jira-GitLab"
msgid "JiraConnect|Are you a GitLab administrator?"
-msgstr ""
+msgstr "Êtes-vous un administrateur GitLab ?"
msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
msgstr "Impossible de trouver l'espace de nommage. Assurez-vous d'avoir les permissions suffisantes."
msgid "JiraConnect|Change GitLab version"
-msgstr ""
+msgstr "Modifier la version de GitLab"
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr "Configurez l'ID de votre application Jira Connect."
msgid "JiraConnect|Continue setup in GitLab"
-msgstr ""
+msgstr "Poursuivre la configuration dans GitLab"
msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
msgstr "Impossible de récupérer les informations utilisateur depuis Jira. Vérifiez les permissions dans Jira et réessayez."
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
-msgstr ""
+msgstr "Créer une branche pour le ticket Jira %{jiraIssue}"
msgid "JiraConnect|Enable public key storage"
msgstr "Activer le stockage des clés publiques"
msgid "JiraConnect|Ensure your instance URL is correct and your instance is configured correctly. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
+msgstr "Assurez-vous que l'URL de votre instance est correcte et que votre instance est correctement configurée. %{linkStart}En savoir plus%{linkEnd}."
msgid "JiraConnect|Failed to create branch."
msgstr "Échec de la création de la branche."
@@ -25571,46 +25775,46 @@ msgid "JiraConnect|Failed to create branch. Please try again."
msgstr "Échec de la création de la branche. Veuillez réessayer."
msgid "JiraConnect|Failed to link group. Please try again."
-msgstr ""
+msgstr "Échec de l'association du groupe. Veuillez réessayer."
msgid "JiraConnect|Failed to load Jira Connect Application ID. Please try again."
-msgstr ""
+msgstr "Échec du chargement de l'ID de l'application Connect de Jira. Veuillez réessayer."
msgid "JiraConnect|Failed to load groups. Please try again."
-msgstr ""
+msgstr "Échec du chargement des groupes. Veuillez réessayer."
msgid "JiraConnect|Failed to load subscriptions."
-msgstr ""
+msgstr "Échec du chargement des abonnements."
msgid "JiraConnect|Failed to sign in to GitLab."
-msgstr ""
+msgstr "Échec de la connexion à GitLab."
msgid "JiraConnect|Failed to unlink group. Please try again."
-msgstr ""
+msgstr "Échec de la dissociation du groupe. Veuillez réessayer."
msgid "JiraConnect|Failed to update the GitLab instance. See the %{linkStart}troubleshooting documentation%{linkEnd}."
-msgstr ""
+msgstr "Échec de la mise à jour de l'instance GitLab. Consultez la %{linkStart}documentation de dépannage%{linkEnd}."
msgid "JiraConnect|For example: https://gitlab.example.com"
-msgstr ""
+msgstr "Par exemple : https://gitlab.exemple.com"
msgid "JiraConnect|GitLab for Jira App"
msgstr "Application GitLab pour Jira"
msgid "JiraConnect|GitLab for Jira Configuration"
-msgstr ""
+msgstr "Configuration de GitLab pour Jira"
msgid "JiraConnect|GitLab instance URL"
-msgstr ""
+msgstr "URL de l'instance GitLab"
msgid "JiraConnect|Group successfully linked"
-msgstr ""
+msgstr "Groupe associé avec succès"
msgid "JiraConnect|Groups are the GitLab groups and subgroups you link to this Jira instance."
-msgstr ""
+msgstr "Les groupes sont les groupes et sous-groupes de GitLab que vous associez à cette instance de Jira."
msgid "JiraConnect|In order to complete the set up, you’ll need to complete a few steps in GitLab."
-msgstr ""
+msgstr "Afin de terminer la configuration, vous devez effectuer quelques étapes dans GitLab."
msgid "JiraConnect|Jira Connect Application ID"
msgstr "ID de l'application Jira Connect"
@@ -25619,46 +25823,52 @@ msgid "JiraConnect|Jira Connect Proxy URL"
msgstr "URL du proxy Jira Connect"
msgid "JiraConnect|Link groups"
-msgstr ""
+msgstr "Associer des groupes"
msgid "JiraConnect|Linked groups"
-msgstr ""
+msgstr "Groupes associés"
msgid "JiraConnect|New branch was successfully created."
msgstr "La nouvelle branche a été créée avec succès."
msgid "JiraConnect|No groups found."
-msgstr ""
+msgstr "Aucun groupe trouvé."
msgid "JiraConnect|No linked groups"
-msgstr ""
+msgstr "Aucun groupe associé"
msgid "JiraConnect|Not seeing your groups? Only groups you have at least the Maintainer role for appear here."
-msgstr ""
+msgstr "Vous ne voyez pas vos groupes ? Seuls les groupes pour lesquels vous avez au moins le rôle de Chargé de maintenance apparaissent ici."
msgid "JiraConnect|Setting up this integration is only possible if you're a GitLab administrator."
-msgstr ""
+msgstr "La configuration de cette intégration n'est possible que si vous êtes un administrateur GitLab."
msgid "JiraConnect|Sign in to %{url}"
-msgstr ""
+msgstr "Connexion à %{url}"
msgid "JiraConnect|Sign in to GitLab to get started."
-msgstr ""
+msgstr "Connectez-vous à GitLab pour commencer."
msgid "JiraConnect|Sign in to GitLab to link groups."
-msgstr ""
+msgstr "Connectez-vous à GitLab pour associer des groupes."
msgid "JiraConnect|Sign in to link groups"
+msgstr "Se connecter pour associer des groupes"
+
+msgid "JiraConnect|Tell us what you think!"
msgstr ""
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr "L'utilisateur Jira n'est pas un administrateur du site. Vérifiez les permissions dans Jira et réessayez."
-msgid "JiraConnect|Welcome to GitLab for Jira"
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
msgstr ""
+msgid "JiraConnect|Welcome to GitLab for Jira"
+msgstr "Bienvenue sur GitLab pour Jira"
+
msgid "JiraConnect|What version of GitLab are you using?"
-msgstr ""
+msgstr "Quelle version de GitLab utilisez-vous ?"
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr "Vous pouvez maintenant fermer cette fenêtre et retourner dans Jira."
@@ -25667,13 +25877,13 @@ msgid "JiraConnect|You don't have permission to create branches for this project
msgstr "Vous n'avez pas la permission de créer des branches pour ce projet. Sélectionnez un projet différent ou contactez son propriétaire pour en obtenir l'accès. %{linkStart}En savoir plus.%{linkEnd}"
msgid "JiraConnect|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
-msgstr ""
+msgstr "Vous devez utiliser un %{linkStart}navigateur pris en charge%{linkEnd} afin d'utiliser l'application GitLab pour Jira."
msgid "JiraConnect|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
+msgstr "Vous devriez à présent voir l'activité de GitLab.com dans vos tickets Jira Cloud. %{linkStart}En savoir plus%{linkEnd}"
msgid "JiraConnect|Your browser is not supported"
-msgstr ""
+msgstr "Votre navigateur n'est pas pris en charge"
msgid "JiraRequest|A connection error occurred while connecting to Jira. Try your request again."
msgstr "Une erreur de connexion s'est produite lors de la connexion à Jira. Réessayez votre requête."
@@ -25682,7 +25892,7 @@ msgid "JiraRequest|A timeout error occurred while connecting to Jira. Try your r
msgstr "Une erreur de délai d'attente dépassé s'est produite lors de la connexion à Jira. Réessayez votre requête."
msgid "JiraRequest|An SSL error occurred while connecting to Jira: %{message}. Try your request again."
-msgstr ""
+msgstr "Une erreur SSL s'est produite lors de la connexion à Jira : %{message}. Réessayez votre demande."
msgid "JiraRequest|An error occurred while requesting data from Jira. Check your %{docs_link_start}Jira integration configuration%{docs_link_end} and try again."
msgstr "Une erreur s'est produite lors de la requête de données depuis Jira. Vérifiez la %{docs_link_start}configuration de votre intégration Jira%{docs_link_end} et réessayez."
@@ -25739,7 +25949,7 @@ msgid "JiraService|Displaying Jira issues while leaving GitLab issues also enabl
msgstr "Afficher les tickets Jira tout en laissant aussi les tickets GitLab activés peut prêter à confusion. Envisagez de %{gitlab_issues_link_start}désactiver les tickets GitLab%{link_end} s'ils ne seront pas utilisés autrement."
msgid "JiraService|Email for Jira Cloud or username for Jira Data Center and Jira Server"
-msgstr "Courriel pour Jira Cloud ou nom d'utilisateur pour Jira Data Center et Jira Server"
+msgstr "Adresse de courriel pour Jira Cloud ou nom d'utilisateur pour Jira Data Center et Jira Server"
msgid "JiraService|Email or username"
msgstr "Adresse de courriel ou nom d'utilisateur"
@@ -25888,6 +26098,9 @@ msgstr "Tâche %{jobName}"
msgid "Job Failed #%{build_id}"
msgstr "Échec de la tâche n°%{build_id}"
+msgid "Job ID"
+msgstr "ID du job"
+
msgid "Job artifacts"
msgstr "Artefacts de job"
@@ -25906,6 +26119,9 @@ msgstr "La tâche est bloquée. Vérifiez les exécuteurs."
msgid "Job logs and artifacts"
msgstr "Artefacts et journaux des jobs"
+msgid "Job name"
+msgstr "Nom du job"
+
msgid "Job was retried"
msgstr "La tâche a été retentée"
@@ -25949,7 +26165,7 @@ msgid "JobAssistant|Image name (optional)"
msgstr "Nom de l'image (facultatif)"
msgid "JobAssistant|Include or exclude jobs in pipelines. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
+msgstr "Incluez ou excluez des jobs dans les pipelines. %{linkStart}En savoir plus%{linkEnd}"
msgid "JobAssistant|Input format"
msgstr "Format de saisie"
@@ -25985,13 +26201,13 @@ msgid "JobAssistant|Services"
msgstr "Services"
msgid "JobAssistant|Specify a Docker image that the job runs in. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
+msgstr "Indiquez une image Docker où le job s'exécutera. %{linkStart}En savoir plus%{linkEnd}"
msgid "JobAssistant|Specify any additional Docker images that your scripts require to run successfully. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
+msgstr "Indiquez toute image Docker supplémentaire dont vos scripts ont besoin pour s'exécuter avec succès. %{linkStart}En savoir plus%{linkEnd}"
msgid "JobAssistant|Specify the %{artifactsLinkStart}artifacts%{artifactsLinkEnd} and %{cacheLinkStart}cache%{cacheLinkEnd} of the job."
-msgstr ""
+msgstr "Indiquez les %{artifactsLinkStart}artefacts%{artifactsLinkEnd} et le %{cacheLinkStart}cache%{cacheLinkEnd} du job."
msgid "JobAssistant|Stage (optional)"
msgstr "Étape (facultatif)"
@@ -26039,7 +26255,7 @@ msgid "Jobs fail if they run longer than the timeout time. Input value is in sec
msgstr "Les jobs échouent s'ils s'exécutent toujours quand le délai d'attente arrive à expiration. La valeur d'entrée est en secondes par défaut. Une expression lisible est également acceptée, par exemple %{code_open}1°heure%{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 ""
+msgstr "Les tâches antérieures à la durée configurée sont considérées expirées et sont archivées. Les tâches archivées ne peuvent plus être retentées. Laissez vide pour ne jamais archiver les tâches automatiquement. L'unité par défaut est en jours, mais vous pouvez en utiliser d'autres, par exemple %{code_open}15 days%{code_close}, %{code_open}1 month%{code_close}, %{code_open}2 years%{code_close}. La valeur minimale est de 1 jour."
msgid "Jobs|All"
msgstr "Tous"
@@ -26071,6 +26287,9 @@ msgstr "Aucun job à afficher"
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr "La recherche de texte brut n'est actuellement pas prise en charge pour la fonction de recherche filtrée. Veuillez utiliser les jetons de recherche disponibles."
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr "Une erreur s'est produite lors de la récupération des jobs en échec."
@@ -26233,6 +26452,12 @@ msgstr "En attente de ressource"
msgid "Job|We could not find this element"
msgstr "Cet élément n'a pas pu être trouvé"
+msgid "Job|You do not have permission to read this job's log"
+msgstr "Vous n'avez pas la permission de lire le journal de ce job"
+
+msgid "Job|You do not have permission to retry this job"
+msgstr "Vous n'avez pas la permission de réessayer ce job"
+
msgid "Job|allowed to fail"
msgstr "autorisée à échouer"
@@ -26296,9 +26521,6 @@ msgstr "Conserver les artéfacts des jobs réussis les plus récents"
msgid "Keep divergent refs"
msgstr "Conserver les références divergentes"
-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 "Le fait de garder tous les analyseurs SAST activés couvre le projet dans le cas où de nouveaux langages sont ajoutés après coup. La détermination des analyseurs à appliquer est un processus qui consomme des ressources minimales et qui n'ajoute au pipeline qu'une durée minimale. Laisser tous les analyseurs SAST activés garantit une couverture maximale."
-
msgid "Kerberos access denied"
msgstr "Accès Kerberos refusé"
@@ -26516,6 +26738,9 @@ msgstr "Les %{days} derniers jours"
msgid "Last 2 weeks"
msgstr "Les 2°dernières semaines"
+msgid "Last 24 hours"
+msgstr "Dernières 24 heures"
+
msgid "Last Accessed On"
msgstr "Dernier accès le"
@@ -26889,7 +27114,7 @@ msgid "Leave zen mode"
msgstr "Quitter le mode Zen"
msgid "Legacy Prometheus integrations cannot currently be removed"
-msgstr "Les intégrations de Prometheus dans leur ancienne version ne peuvent pas être supprimées actuellement"
+msgstr "Les intégrations de Prometheus héritées ne peuvent pas être supprimées actuellement"
msgid "Legacy Web IDE"
msgstr "Web IDE hérité"
@@ -27123,7 +27348,7 @@ msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr "Limiter la taille des tâches Sidekiq stockées dans Redis."
msgid "Limitation on this view"
-msgstr ""
+msgstr "Limitation de cette vue"
msgid "Limiting mode"
msgstr "Mode de limitation"
@@ -27154,9 +27379,6 @@ msgstr "Associer Sentry à GitLab pour découvrir et afficher les erreurs géné
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr "Lier un wiki externe à la barre latérale du projet. %{docs_link}"
-msgid "Link copied"
-msgstr "Lien copié"
-
msgid "Link copied to clipboard."
msgstr "Lien copié dans le presse-papiers."
@@ -27304,8 +27526,8 @@ msgstr "Suite en cours de chargement"
msgid "Loading snippet"
msgstr "Chargement de l'extrait de code"
-msgid "Loading the GitLab IDE..."
-msgstr "Chargement de l'EDI de GitLab…"
+msgid "Loading the GitLab IDE"
+msgstr "Chargement de l'IDE de GitLab"
msgid "Loading, please wait."
msgstr "Chargement en cours, veuillez patienter."
@@ -27370,6 +27592,9 @@ msgstr "Fichiers verrouillés"
msgid "Locked the discussion."
msgstr "Discussion verrouillée."
+msgid "Locking %{issuableDisplayName}"
+msgstr "Verrouillage de %{issuableDisplayName}"
+
msgid "Locks the discussion."
msgstr "Verrouille la discussion."
@@ -27562,6 +27787,9 @@ msgstr "Gérer les projets."
msgid "Manage two-factor authentication"
msgstr "Gérer l'authentification à deux facteurs"
+msgid "Manage usage"
+msgstr "Gérer l'utilisation"
+
msgid "Manage your project's triggers"
msgstr "Gérer les déclencheurs de votre projet"
@@ -27595,6 +27823,9 @@ msgstr "Liez manuellement ce ticket en l'ajoutant à la section des tickets lié
msgid "Map a FogBugz account ID to a GitLab user"
msgstr "Associer un ID de compte FogBugz à un utilisateur GitLab"
+msgid "Map data from"
+msgstr "Associer les données depuis"
+
msgid "Mar"
msgstr "mars"
@@ -27652,6 +27883,9 @@ msgstr "Ajouter du texte en italique (%{modifierKey}I)"
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr "Ajouter du texte en italique (%{modifier_key}I)"
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr "Ajouter un texte barré (%{modifierKey}⇧X)"
@@ -27676,9 +27910,6 @@ msgstr "Désindentation d'une ligne (%{modifier_key}[)"
msgid "MarkdownEditor|header"
msgstr "en-tête"
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr "Prend en charge le %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-
msgid "Marked"
msgstr "Marqué"
@@ -27719,7 +27950,7 @@ msgid "Marks to do as done."
msgstr "Marque le pense-bête comme terminé."
msgid "Mask this variable in job logs if it meets %{linkStart}regular expression requirements%{linkEnd}."
-msgstr ""
+msgstr "Masquez cette variable dans les journaux des jobs si elle répond aux %{linkStart}exigences de l'expression rationnelle%{linkEnd}."
msgid "Mask variable"
msgstr "Masquer la variable"
@@ -27778,8 +28009,8 @@ msgstr "Valeur max."
msgid "Max authenticated Git LFS requests per period per user"
msgstr "Nombre maximal de requêtes Git LFS authentifiées par période et par utilisateur"
-msgid "Max file size is 200 KB."
-msgstr "La taille maximale de fichier est de 200°Ko."
+msgid "Max file size is 200 KiB."
+msgstr "La taille maximale de fichier est de 200 Kio."
msgid "Max role"
msgstr "Rôle max"
@@ -27829,8 +28060,8 @@ msgstr "Taille maximale des artéfacts (Mo)"
msgid "Maximum attachment size"
msgstr "Taille maximale des pièces jointes"
-msgid "Maximum attachment size (MB)"
-msgstr "Taille maximale des pièces jointes (Mo)"
+msgid "Maximum attachment size (MiB)"
+msgstr "Taille maximale des pièces jointes (Mio)"
msgid "Maximum authenticated API requests per rate limit period per user"
msgstr "Nombre maximum de requêtes d'API authentifiées par période de limite de fréquence et par utilisateur"
@@ -27856,7 +28087,7 @@ msgstr "Délai maximal (minutes)"
msgid "Maximum diff patch size"
msgstr "Taille maximale du correctif diff"
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr "Taille maximale du correctif diff (octets)"
msgid "Maximum duration of a session."
@@ -27865,8 +28096,8 @@ msgstr "Durée maximale d'une session."
msgid "Maximum export size"
msgstr "Taille maximale de l'exportation"
-msgid "Maximum export size (MB)"
-msgstr "Taille maximale de l'exportation (Mo)"
+msgid "Maximum export size (MiB)"
+msgstr "Taille maximale de l'exportation (Mio)"
msgid "Maximum field length"
msgstr "Longueur maximale de champ"
@@ -27901,8 +28132,8 @@ msgstr "Nombre maximum de requêtes d'importation de groupes par minute"
msgid "Maximum import size"
msgstr "Taille maximale de l'importation"
-msgid "Maximum import size (MB)"
-msgstr "Taille maximale de l'importation (Mo)"
+msgid "Maximum import size (MiB)"
+msgstr "Taille maximale de l'importation (Mio)"
msgid "Maximum job artifact size"
msgstr "Taille maximale des artefacts des tâches"
@@ -27922,8 +28153,11 @@ msgstr "Taille de fichier maximale des paquets npm en octets"
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr "Nombre maximum de %{name} (%{count}) atteint"
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
-msgstr "Nombre maximum de modifications (branches ou étiquettes) au sein d'une poussée unique pour lequel les crochets web et les services se déclenchent (3 par défaut)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr "Nombre maximum de modifications (branches ou étiquettes) dans une seule poussée au-delà duquel un événement de poussée en bloc est créé (3 par défaut). Choisir « 0 » ne désactive pas la limitation."
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
+msgstr "Nombre maximum de modifications (branches ou étiquettes) dans une seule poussée au-delà duquel les crochets web et les intégrations ne sont pas déclenchés (3 par défaut). Choisir « 0 » ne désactive pas la limitation."
msgid "Maximum number of comments exceeded"
msgstr "Nombre maximum de commentaires atteint"
@@ -27943,12 +28177,18 @@ msgstr "Nombre maximum de requêtes par minute pour un utilisateur authentifié"
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr "Nombre maximum de requêtes par minute pour une adresse IP non authentifiée"
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
-msgstr "Nombre maximum de requêtes par minute pour chaque chemin brut (la valeur par défaut est 300). Définir à 0 pour désactiver la limitation."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr "Nombre maximum de requêtes par minute pour chaque chemin d'accès brut (la valeur par défaut est « 300 »). Choisissez « 0 » pour désactiver la limitation."
+
+msgid "Maximum number of stages per value stream exceeded"
+msgstr "Nombre maximum d'étapes par chaîne de valeur dépassé"
msgid "Maximum number of unique IP addresses per user."
msgstr "Nombre maximum d'adresses IP uniques par utilisateur."
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr "Nombre maximum de chaîne de valeur par espace de nommage dépassé"
+
msgid "Maximum number of variables loaded (2000)"
msgstr "Nombre maximum de variables chargées (2 000)"
@@ -27973,8 +28213,8 @@ msgstr "Nombre maximum de requêtes d'importation de projets par minute"
msgid "Maximum push size"
msgstr "Taille maximale de poussée"
-msgid "Maximum push size (MB)"
-msgstr "Taille maximale de poussée (Mo)"
+msgid "Maximum push size (MiB)"
+msgstr "Taille maximale de poussée (Mio)"
msgid "Maximum requests per 10 minutes per IP address"
msgstr "Nombre maximum de requêtes par période de 10 minutes et par adresse IP"
@@ -28006,8 +28246,8 @@ msgstr "Taille maximale des fichiers d'importation."
msgid "Maximum size of individual attachments in comments."
msgstr "Taille maximale des pièces jointes individuelles dans les commentaires."
-msgid "Maximum size of pages (MB)"
-msgstr "Taille maximale des pages (Mo)"
+msgid "Maximum size of pages (MiB)"
+msgstr "Taille maximale des pages (Mio)"
msgid "Maximum snippet size"
msgstr "Taille maximale d'extrait"
@@ -28061,7 +28301,7 @@ msgid "MemberInviteEmail|Invitation to join the %{project_or_group} %{project_or
msgstr "Invitation à rejoindre le %{project_or_group} %{project_or_group_name}"
msgid "MemberRole|%{requirement} has to be enabled in order to enable %{permission}."
-msgstr ""
+msgstr "%{requirement} doit être activé pour pouvoir activer %{permission}."
msgid "MemberRole|%{role} - custom"
msgstr "%{role}, personnalisé"
@@ -28279,8 +28519,8 @@ msgstr "Fusionner"
msgid "Merge %d cell"
msgid_plural "Merge %d cells"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Fusionner %d cellule"
+msgstr[1] "Fusionner %d cellules"
msgid "Merge Conflicts"
msgstr "Conflits de fusion"
@@ -28340,7 +28580,7 @@ msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr "La demande de fusion %{mr_link} a été examinée par %{mr_author}"
msgid "Merge request ID"
-msgstr "ID de la demande de fusion"
+msgstr "ID de la requête de fusion"
msgid "Merge request actions"
msgstr "Actions de requête de fusion"
@@ -28351,6 +28591,9 @@ msgstr "Données analytiques des requêtes de fusion"
msgid "Merge request approvals"
msgstr "Approbations de la demande de fusion"
+msgid "Merge request change summary"
+msgstr "Résumé des modifications de la requête de fusion"
+
msgid "Merge request commits"
msgstr "Validations des requêtes de fusion"
@@ -28369,14 +28612,17 @@ msgstr "Rapports de requête de fusion"
msgid "Merge request status"
msgstr "État de la demande de fusion"
+msgid "Merge request summaries"
+msgstr "Résumés des requêtes de fusion"
+
msgid "Merge request summary"
-msgstr "Résumé de la demande de fusion"
+msgstr "Résumé de la requête de fusion"
msgid "Merge request title"
-msgstr "Titre de la demande de fusion"
+msgstr "Titre de la requête de fusion"
msgid "Merge request was set to auto-merge"
-msgstr ""
+msgstr "La requête de fusion a été définie sur fusion automatique"
msgid "Merge requests"
msgstr "Demandes de fusion"
@@ -28486,9 +28732,6 @@ msgstr "Mise en commentaire des lignes %{selectStart}start%{selectEnd} à %{end}
msgid "MergeRequestDiffs|Select comment starting line"
msgstr "Sélectionnez la ligne de départ du commentaire"
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr "Une erreur est survenue lors de l'enregistrement du brouillon du commentaire."
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr "Impossible d'effectuer cette action automatiquement. Elle a peut-être déjà été réalisée, ou une validation plus récente a peut-être mis à jour une partie de ce contenu. Veuillez effectuer cette action localement."
@@ -28516,9 +28759,6 @@ msgstr "La requête de fusion n'a pas pu être défaite"
msgid "MergeRequests|Reference copied"
msgstr "Référence copiée"
-msgid "MergeRequests|Saving the comment failed"
-msgstr "L'enregistrement du commentaire a échoué"
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr "L'écrasement a échoué : Écrasez les validations en local, résolvez les éventuels conflits, puis poussez la branche."
@@ -28543,6 +28783,9 @@ msgstr "Afficher le fichier @ %{commitId}"
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr "Afficher le fichier @ %{commitId}"
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr "Votre commentaire n'a pas pu être envoyé, car %{reason}."
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr "a commenté la validation %{commitLink}"
@@ -28550,10 +28793,10 @@ msgid "MergeRequests|started a thread"
msgstr "fil de conversation démarré"
msgid "MergeRequests|started a thread on %{linkStart}a file%{linkEnd}"
-msgstr ""
+msgstr "a démarré un fil de conversation sur %{linkStart}un fichier%{linkEnd}"
msgid "MergeRequests|started a thread on %{linkStart}an old version of a file%{linkEnd}"
-msgstr ""
+msgstr "a démarré un fil de conversation sur %{linkStart}une version antérieure d'un fichier%{linkEnd}"
msgid "MergeRequests|started a thread on %{linkStart}an old version of the diff%{linkEnd}"
msgstr "fil de conversation démarré sur %{linkStart}une ancienne version du diff%{linkEnd}"
@@ -28609,6 +28852,18 @@ msgstr "Examinée par @%{username} mais pas encore approuvée"
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr "Rechercher (par ex. *.vue) (%{MODIFIER_KEY}P)"
+msgid "MergeRequest|Summaries are written by AI"
+msgstr "Les résumés sont rédigés par l'IA"
+
+msgid "MergeRequest|Summary notes"
+msgstr "Notes de synthèse"
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr "Cette description a été générée pour la révision %{revision} à l'aide de l'IA"
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr "Cette description a été générée à l'aide de l'IA"
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr "%{sourceTopic} sera supprimé"
@@ -28705,9 +28960,6 @@ msgstr "Une erreur s'est produite lors de la mise à jour de votre image."
msgid "MetricImages|There was an issue uploading your image."
msgstr "Une erreur s'est produite lors du téléversement de votre image."
-msgid "Metrics"
-msgstr "Métriques"
-
msgid "Metrics - Grafana"
msgstr "Métriques : Grafana"
@@ -28762,215 +29014,45 @@ msgstr "Le tableau de bord avec le chemin demandé est introuvable"
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr "Vous n'avez pas l'autorisation d'ajouter une étoile à ce tableau de bord"
-msgid "Metrics|1. Define and preview panel"
-msgstr "1. Définir et prévisualiser le panneau"
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr "2. Coller le code YAML du panneau dans le tableau de bord"
-
-msgid "Metrics|Add metric"
-msgstr "Ajouter une métrique"
-
-msgid "Metrics|Add panel"
-msgstr "Ajouter un panneau"
-
-msgid "Metrics|Avg"
-msgstr "Moy"
-
-msgid "Metrics|Back to dashboard"
-msgstr "Retour au tableau de bord"
-
-msgid "Metrics|Cancel"
-msgstr "Annuler"
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr "Consultez la documentation sur l'intégration et la livraison continues (CI/CD) concernant le déploiement dans un environnement"
-
-msgid "Metrics|Collapse panel"
-msgstr "Réduire le panneau"
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr "Réduire le panneau (Échap)"
-
-msgid "Metrics|Copy YAML"
-msgstr "Copier YAML"
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr "Copiez et collez le YAML du panneau dans le fichier YAML de votre tableau de bord."
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr "Création du tableau de bord personnalisé %{fileName}"
-
msgid "Metrics|Create metric"
msgstr "Créer une métrique"
-msgid "Metrics|Create new dashboard"
-msgstr "Créer un nouveau tableau de bord"
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr "Créer votre fichier de configuration de tableau de bord"
-
-msgid "Metrics|Current"
-msgstr "En cours"
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr "Les fichiers des tableaux de bord se trouvent à la racine de ce projet dans %{codeStart}.gitlab/dashboards%{codeEnd}."
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr "Définissez le YAML du panneau ci-dessous pour prévisualiser le panneau."
-
msgid "Metrics|Delete metric"
msgstr "Supprimer une métrique"
msgid "Metrics|Delete metric?"
msgstr "Supprimer la métrique°?"
-msgid "Metrics|Duplicate"
-msgstr "Dupliquer"
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr "Dupliquer le tableau de bord actuel"
-
-msgid "Metrics|Duplicate dashboard"
-msgstr "Dupliquer le tableau de bord"
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr "Dupliquez ce tableau de bord pour ajouter un panneau ou modifiez le YAML du tableau de bord."
-
-msgid "Metrics|Duplicating..."
-msgstr "Duplication en cours…"
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr "Modifier le YAML du tableau de bord"
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] "Modifier la métrique"
-msgstr[1] "Modifier les métriques"
-
-msgid "Metrics|Expand panel"
-msgstr "Étendre le panneau"
+msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr "Pour regrouper des métriques similaires"
-msgid "Metrics|Invalid time range, please verify."
-msgstr "L'intervalle de temps n'est pas valide, veuillez vérifier."
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr "Libellé de l'axe des Y (généralement l'unité). L'axe des X représente toujours le temps."
msgid "Metrics|Legend label (optional)"
msgstr "Libellé de légende (facultatif)"
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr "Le lien contient une fenêtre de temps non valide. Veuillez vérifier le lien pour voir la période demandée."
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr "Le lien contient des informations de graphique non valides. Veuillez le vérifier pour voir le panneau étendu."
-
-msgid "Metrics|Manage chart links"
-msgstr "Gérer les liens du graphique"
-
-msgid "Metrics|Max"
-msgstr "Max"
-
-msgid "Metrics|Metrics Settings"
-msgstr "Paramètres des métriques"
-
-msgid "Metrics|Min"
-msgstr "Min"
-
-msgid "Metrics|More actions"
-msgstr "Plus d'actions"
-
msgid "Metrics|Must be a valid PromQL query."
msgstr "La requête doit être une requête PromQL valide."
msgid "Metrics|New metric"
msgstr "Nouvelle métrique"
-msgid "Metrics|Open repository"
-msgstr "Ouvrir le dépôt"
-
-msgid "Metrics|Panel YAML"
-msgstr "YAML du panneau"
-
-msgid "Metrics|Panel YAML copied"
-msgstr "YAML du panneau copié"
-
-msgid "Metrics|Preview panel"
-msgstr "Aperçu du panneau"
-
msgid "Metrics|PromQL query is valid"
msgstr "La requête PromQL est valide"
msgid "Metrics|Prometheus Query Documentation"
msgstr "Documentation des requêtes Prometheus"
-msgid "Metrics|Refresh Prometheus data"
-msgstr "Actualiser les données Prometheus"
-
-msgid "Metrics|Refresh dashboard"
-msgstr "Actualiser le tableau de bord"
-
-msgid "Metrics|Select a value"
-msgstr "Sélectionner une valeur"
-
-msgid "Metrics|Set refresh rate"
-msgstr "Définir la fréquence d'actualisation"
-
-msgid "Metrics|Star dashboard"
-msgstr "Ajouter le tableau de bord aux favoris"
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr "Une erreur s'est produite lors de la création du tableau de bord."
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr "Une erreur s'est produite lors de la création du tableau de bord. %{error}"
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr "Une erreur s'est produite lors de la récupération des annotations. Veuillez réessayer."
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr "Une erreur s'est produite lors de la récupération des données d'environnement. Veuillez réessayer."
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr "Une erreur s'est produite lors de l'obtention des informations d'annotations."
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr "Une erreur s'est produite lors de l'obtention des informations sur les avertissements de validation du tableau de bord."
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr "Une erreur s'est produite lors de l'obtention des informations de déploiement."
-
-msgid "Metrics|There was an error getting environments information."
-msgstr "Une erreur s'est produite lors de l'obtention des informations d'environnement."
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr "Une erreur s'est produite lors de l'obtention des options pour la variable « %{name} »."
-
msgid "Metrics|There was an error trying to validate your query"
msgstr "Une erreur s'est produite lors de la tentative pour valider votre requête"
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr "Une erreur est survenue lors de la récupération des métriques"
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr "Une erreur s'est produite lors de la récupération des métriques. %{message}"
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr "Pour créer un nouveau tableau de bord, ajoutez un nouveau fichier YAML dans %{codeStart}.gitlab/dashboards%{codeEnd} à la racine de ce projet."
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr "Le point de terminaison Prometheus a renvoyé une réponse contenant des données de déploiement inattendues"
-
msgid "Metrics|Unit label"
msgstr "Label de l'unité"
-msgid "Metrics|Unstar dashboard"
-msgstr "Supprimer le tableau de bord des favoris"
-
msgid "Metrics|Used as a title for the chart"
msgstr "Utilisé comme titre pour le graphique"
@@ -28980,24 +29062,12 @@ msgstr "Utilisé si la requête ne renvoie qu'une seule série. Si elle renvoie
msgid "Metrics|Validating query"
msgstr "Validation de la requête"
-msgid "Metrics|Values"
-msgstr "Valeurs"
-
-msgid "Metrics|View documentation"
-msgstr "Voir la documentation"
-
msgid "Metrics|Y-axis label"
msgstr "Libellé de l'axe Y"
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr "Vous pouvez enregistrer une copie de ce tableau de bord dans votre dépôt afin de le personnaliser. Pour ce faire, veuillez sélectionner un nom de fichier et une branche."
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr "Vous êtes sur le point de supprimer définitivement cette métrique. Cette opération est irréversible."
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr "Le schéma de votre tableau de bord n'est pas valide. Modifiez le tableau de bord pour corriger le schéma YAML."
-
msgid "Metrics|e.g. HTTP requests"
msgstr "par ex. requêtes HTTP"
@@ -29355,7 +29425,7 @@ msgid "MlExperimentTracking|Filter candidates"
msgstr "Filtrer les candidats"
msgid "MlExperimentTracking|Get started with model experiments!"
-msgstr "Premiers pas avec les expériences de modèle !"
+msgstr "Démarrez avec les expériences de modèle !"
msgid "MlExperimentTracking|ID"
msgstr "ID"
@@ -29384,6 +29454,9 @@ msgstr "Informations sur le candidat du modèle"
msgid "MlExperimentTracking|Model experiments"
msgstr "Expériences avec ce modèle"
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr "Nom"
@@ -29406,7 +29479,7 @@ msgid "MlExperimentTracking|Status"
msgstr "Statut"
msgid "MlExperimentTracking|Triggered by"
-msgstr "Déclenchée par"
+msgstr "Déclenché par"
msgid "Modal updated"
msgstr "Fenêtre modale mise à jour"
@@ -29420,6 +29493,9 @@ msgstr "Fermer"
msgid "Model experiments"
msgstr "Expériences du modèle"
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr "Modifié"
@@ -29480,9 +29556,6 @@ msgstr "Plus d'informations"
msgid "More information is available|here"
msgstr "ici"
-msgid "More information."
-msgstr "Plus d'informations."
-
msgid "More options"
msgstr "Plus d'options"
@@ -29592,10 +29665,10 @@ msgid "Multiple Prometheus integrations are not supported"
msgstr "Les intégrations multiples de Prometheus ne sont pas prises en charge"
msgid "Multiple components(%s) have 'gl/inject-editor' attribute"
-msgstr "Plusieurs composants (%s) ont l'attribut « gl/inject-editor »"
+msgstr "Plusieurs composants (%s) ont l'attribut « gl/inject-editor »"
msgid "Multiple integrations of a single type are not supported for this project"
-msgstr ""
+msgstr "Plusieurs intégrations d'un seul type ne sont pas prises en charge pour ce projet"
msgid "Multiple signatures"
msgstr "Signatures multiples"
@@ -29660,6 +29733,12 @@ msgstr "ID de l'espace de noms°:"
msgid "Namespace Limits"
msgstr "Limites de l'espace de nommage"
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr "L'espace de nommage n'existe pas ou vous n'avez pas la permission."
+
+msgid "Namespace must be provided."
+msgstr "L'espace de nommage doit être fourni."
+
msgid "Namespace or group to import repository into does not exist."
msgstr "L'espace de nommage ou le groupe dans lequel importer un dépôt n'existe pas."
@@ -29673,43 +29752,43 @@ msgid "NamespaceLimits|%{linkStart}%{username}%{linkEnd} changed the limit to %{
msgstr "%{linkStart}%{username}%{linkEnd} a modifié la limite, qui est désormais de %{limit}, le %{date}"
msgid "NamespaceLimits|Add minimum free storage amount (in GiB) that will be used to enforce storage usage for namespaces on free plan. To remove the limit, set the value to 0 and click \"Update limit\" button."
-msgstr ""
+msgstr "Ajoutez une quantité minimale de stockage gratuit (en Gio) qui sera utilisée pour faire respecter l'utilisation du stockage pour les espaces de nommage sur le forfait gratuit. Pour supprimer la limite, définissez la valeur sur 0 et cliquez sur le bouton « Mettre à jour la limite »."
msgid "NamespaceLimits|Add minimum free storage amount (in GiB) that will be used to set the dashboard limit for namespaces on free plan. To remove the limit, set the value to 0 and click \"Update limit\" button."
-msgstr ""
+msgstr "Ajoutez une quantité minimale de stockage gratuit (en Gio) qui sera utilisée pour définir la limite du tableau de bord pour les espaces de nommage sur le forfait Gratuit. Pour supprimer la limite, définissez la valeur sur 0 et cliquez sur le bouton « Mettre à jour la limite »."
msgid "NamespaceLimits|Add minimum free storage amount (in GiB) that will be used to show notifications for namespace on free plan. To remove the limit, set the value to 0 and click \"Update limit\" button."
-msgstr ""
+msgstr "Ajoutez une quantité minimale de stockage gratuit (en Gio) qui sera utilisée pour afficher les notifications pour l'espace de nommage sur le forfait gratuit. Pour supprimer la limite, définissez la valeur sur 0 et cliquez sur le bouton « Mettre à jour la limite »."
msgid "NamespaceLimits|Confirm deletion"
-msgstr ""
+msgstr "Confirmer la suppression"
msgid "NamespaceLimits|Confirm limits change"
msgstr "Confirmer la modification des limites"
msgid "NamespaceLimits|Dashboard Limit"
-msgstr ""
+msgstr "Limite du tableau de bord"
msgid "NamespaceLimits|Dashboard limit was successfully added"
-msgstr ""
+msgstr "La limite du tableau de bord a été ajoutée avec succès"
msgid "NamespaceLimits|Dashboard limit was successfully removed"
-msgstr ""
+msgstr "La limite du tableau de bord a été supprimée avec succès"
msgid "NamespaceLimits|Deletion confirmation"
-msgstr ""
+msgstr "Confirmation de suppression"
msgid "NamespaceLimits|Do you confirm the deletion of the selected namespace from the exclusion list?"
-msgstr ""
+msgstr "Confirmez-vous la suppression de l'espace de nommage sélectionné de la liste d'exclusion ?"
msgid "NamespaceLimits|Enforcement Limit"
-msgstr ""
+msgstr "Limite de mise en Å“uvre"
msgid "NamespaceLimits|Enforcement limit was successfully added"
-msgstr ""
+msgstr "La limite de mise en œuvre a été ajoutée avec succès"
msgid "NamespaceLimits|Enforcement limit was successfully removed"
-msgstr ""
+msgstr "La limite de mise en œuvre a été supprimée avec succès"
msgid "NamespaceLimits|Enter a valid number greater or equal to zero."
msgstr "Entrez un nombre valide supérieur ou égal à zéro."
@@ -29718,10 +29797,10 @@ msgid "NamespaceLimits|Exclude"
msgstr "Exclure"
msgid "NamespaceLimits|Exclude namespace"
-msgstr "Exclure un espace de noms"
+msgstr "Exclure un espace de nommage"
msgid "NamespaceLimits|Excluded Namespaces"
-msgstr ""
+msgstr "Espaces de nommage exclus"
msgid "NamespaceLimits|Exclusion added successfully"
msgstr "Exclusion ajoutée avec succès"
@@ -29730,99 +29809,99 @@ msgid "NamespaceLimits|Free Tier"
msgstr "Forfait Gratuit"
msgid "NamespaceLimits|Notifications Limit"
-msgstr ""
+msgstr "Limite de notifications"
msgid "NamespaceLimits|Notifications limit was successfully added"
-msgstr ""
+msgstr "La limite de notifications a été ajoutée avec succès"
msgid "NamespaceLimits|Notifications limit was successfully removed"
-msgstr ""
+msgstr "La limite de notifications a été supprimée avec succès"
msgid "NamespaceLimits|Reason"
msgstr "Raison"
msgid "NamespaceLimits|Reason for excluding this namespace"
-msgstr "Raison pour laquelle cet espace de noms est exclu"
+msgstr "Raison pour laquelle cet espace de nommage est exclu"
msgid "NamespaceLimits|Set Dashboard limit"
-msgstr ""
+msgstr "Configurer la limite du tableau de bord"
msgid "NamespaceLimits|Set Enforcement limit"
-msgstr ""
+msgstr "Configurer la limite de mise en Å“uvre"
msgid "NamespaceLimits|Set Notifications limit"
-msgstr ""
+msgstr "Configurer la limite de notifications"
msgid "NamespaceLimits|Storage Phased Notification"
msgstr "Stockage progressif pour les notifications"
msgid "NamespaceLimits|There was an error deleting the namespace: \"%{errorMessage}\"."
-msgstr ""
+msgstr "Une erreur s'est produite lors de la suppression de l'espace de nommage : « %{errorMessage} »."
msgid "NamespaceLimits|There was an error fetching the exclusion list, try refreshing the page."
-msgstr "Une erreur s’est produite lors de la récupération de la liste d’exclusion, essayez de rafraîchir la page."
+msgstr "Une erreur s'est produite lors de la récupération de la liste d'exclusion, essayez de rafraîchir la page."
msgid "NamespaceLimits|These namespaces won't receive any notifications nor any degraded functionality while they remain on this list"
msgstr "Ces espaces de noms ne recevront aucune notification ni aucune fonctionnalité dégradée tant qu'ils resteront sur cette liste"
msgid "NamespaceLimits|This will change the dashboard limit for all free namespaces except the excluded namespaces, the limit can be removed later."
-msgstr ""
+msgstr "La limite du tableau de bord sera modifiée pour tous les espaces de nommage libres, à l'exception des espaces de nommage exclus. La limite pourra être supprimée ultérieurement."
msgid "NamespaceLimits|This will change when free namespaces get storage enforcement except the excluded namespaces, the limit can be removed later."
-msgstr ""
+msgstr "Le moment où le stockage sera imposé aux espaces de nommage gratuits sera modifié, à l'exception des espaces de nommage exclus. La limite pourra être supprimée ultérieurement."
msgid "NamespaceLimits|This will limit the amount of notifications all free namespaces receives except the excluded namespaces, the limit can be removed later."
-msgstr ""
+msgstr "Le nombre de notifications reçues par tous les espaces de nommage gratuits sera limité, à l'exception des espaces de nommage exclus. La limite pourra être supprimée ultérieurement."
msgid "NamespaceLimits|Update limit"
msgstr "Mettre à jour la limite"
msgid "NamespaceLimits|You must select a namespace and add a reason for excluding it"
-msgstr "Vous devez sélectionner un espace de noms et donner une raison à son exclusion"
+msgstr "Vous devez sélectionner un espace de nommage et donner une raison pour son exclusion"
msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Your ability to write new data to this namespace is restricted. %{read_only_link_start}Which actions are restricted?%{link_end}"
-msgstr "%{namespace_name} est maintenant en lecture seule. Votre capacité à écrire de nouvelles données dans cet espace de noms est restreinte. %{read_only_link_start}Quelles actions ont été restreintes ?%{link_end}"
+msgstr "%{namespace_name} est maintenant en lecture seule. Votre capacité à écrire de nouvelles données dans cet espace de nommage est restreinte. %{read_only_link_start}Quelles actions ont été restreintes ?%{link_end}"
msgid "NamespaceStorageSize|For more information about storage limits, see our %{faq_link_start}FAQ%{link_end}."
msgstr "Pour plus d'informations sur les limites de stockage, consultez notre %{faq_link_start}FAQ%{link_end}."
msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, your ability to write new data to this namespace will be restricted. %{read_only_link_start}Which actions become restricted?%{link_end}"
-msgstr "Si %{namespace_name} dépasse le quota de stockage, votre capacité à écrire de nouvelles données dans cet espace de noms sera restreinte. %{read_only_link_start}Quelles actions seront restreintes ?%{link_end}"
+msgstr "Si %{namespace_name} dépasse le quota de stockage, votre capacité à écrire de nouvelles données dans cet espace de nommage sera restreinte. %{read_only_link_start}Quelles actions seront restreintes ?%{link_end}"
msgid "NamespaceStorageSize|If a project reaches 100%% of the storage quota (%{free_size_limit}) the project will be in a read-only state, and you won't be able to push to your repository or add large files."
-msgstr "Si un projet atteint 100%% du quota de stockage (%{free_size_limit}), le projet sera placé en lecture seule et vous ne serez pas en mesure de pousser dans votre dépôt ni d'ajouter des fichiers volumineux."
+msgstr "Si un projet atteint 100 %% du quota de stockage (%{free_size_limit}), le projet sera placé en lecture seule et vous ne serez pas en mesure de pousser dans votre dépôt ni d'ajouter des fichiers volumineux."
msgid "NamespaceStorageSize|To prevent your projects from being in a read-only state %{manage_storage_link_start}manage your storage usage%{link_end}, or %{purchase_more_link_start}purchase more storage%{link_end}."
msgstr "Pour éviter que vos projets ne soient placés en lecture seule, %{manage_storage_link_start}gérez votre utilisation du stockage%{link_end} ou %{purchase_more_link_start}achetez-en davantage%{link_end}."
msgid "NamespaceStorageSize|To prevent your projects from being in a read-only state %{manage_storage_link_start}manage your storage usage%{link_end}, or contact a user with the %{group_member_link_start}owner role for this namespace%{link_end} and ask them to %{purchase_more_link_start}purchase more storage%{link_end}."
-msgstr "Pour éviter que vos projets ne soient placés en lecture seule, %{manage_storage_link_start}gérez votre utilisation du stockage%{link_end} ou contactez un utilisateur ayant le %{group_member_link_start}rôle de propriétaire pour cet espace de noms%{link_end} et demandez-lui d'%{purchase_more_link_start}acheter plus de stockage%{link_end}."
+msgstr "Pour éviter que vos projets ne soient placés en lecture seule, %{manage_storage_link_start}gérez votre utilisation du stockage%{link_end} ou contactez un utilisateur ayant le %{group_member_link_start}rôle de propriétaire pour cet espace de nommage%{link_end} et demandez-lui d'%{purchase_more_link_start}acheter plus de stockage%{link_end}."
msgid "NamespaceStorageSize|To reduce storage usage, reduce git repository and git LFS storage."
msgstr "Pour diminuer l'utilisation du stockage, réduisez le dépôt git et le stockage git LFS."
msgid "NamespaceStorageSize|To remove the read-only state %{manage_storage_link_start}manage your storage usage%{link_end}, or %{purchase_more_link_start}purchase more storage%{link_end}."
-msgstr "Pour supprimer l’état de lecture seule, %{manage_storage_link_start}gérez votre utilisation du stockage%{link_end} ou %{purchase_more_link_start}achetez-en davantage%{link_end}."
+msgstr "Pour supprimer l'état de lecture seule, %{manage_storage_link_start}gérez votre utilisation du stockage%{link_end} ou %{purchase_more_link_start}achetez-en davantage%{link_end}."
msgid "NamespaceStorageSize|To remove the read-only state %{manage_storage_link_start}manage your storage usage%{link_end}, or contact a user with the %{group_member_link_start}owner role for this namespace%{link_end} and ask them to %{purchase_more_link_start}purchase more storage%{link_end}."
-msgstr "Pour supprimer l’état de lecture seule, %{manage_storage_link_start}gérez votre utilisation du stockage%{link_end} ou contactez un utilisateur ayant le %{group_member_link_start}rôle de propriétaire pour cet espace de noms%{link_end} et demandez-lui d'%{purchase_more_link_start}acheter plus de stockage%{link_end}."
+msgstr "Pour supprimer l'état de lecture seule, %{manage_storage_link_start}gérez votre utilisation du stockage%{link_end} ou contactez un utilisateur ayant le %{group_member_link_start}rôle de propriétaire pour cet espace de nommage%{link_end} et demandez-lui d'%{purchase_more_link_start}acheter plus de stockage%{link_end}."
msgid "NamespaceStorageSize|To remove the read-only state, reduce git repository and git LFS storage, or %{purchase_more_link_start}purchase more storage%{link_end}."
-msgstr "Pour supprimer l’état de lecture seule, réduisez le dépôt git et le stockage git LFS ou %{purchase_more_link_start}achetez plus de stockage%{link_end}."
+msgstr "Pour supprimer l'état de lecture seule, réduisez le dépôt git et le stockage git LFS ou %{purchase_more_link_start}achetez plus de stockage%{link_end}."
msgid "NamespaceStorageSize|To remove the read-only state, reduce git repository and git LFS storage, or contact a user with the %{group_member_link_start}owner role for this namespace%{link_end} and ask them to %{purchase_more_link_start}purchase more storage%{link_end}."
-msgstr "Pour supprimer l’état de lecture seule, réduisez le dépôt git et le stockage git LFS ou contactez un utilisateur ayant le %{group_member_link_start}rôle de propriétaire pour cet espace de noms%{link_end} et demandez-lui d'%{purchase_more_link_start}acheter davantage de stockage%{link_end}."
+msgstr "Pour supprimer l'état de lecture seule, réduisez le dépôt git et le stockage git LFS ou contactez un utilisateur ayant le %{group_member_link_start}rôle de propriétaire pour cet espace de nommage%{link_end} et demandez-lui d'%{purchase_more_link_start}acheter plus de stockage%{link_end}."
msgid "NamespaceStorageSize|You have consumed all available storage and you can't push or add large files to projects over the free tier limit (%{free_size_limit})."
-msgstr "Vous avez consommé tout le stockage disponible et vous ne pouvez plus pousser ni ajouter de fichiers volumineux à des projets dépassant la limite de l'édition gratuite (%{free_size_limit})."
+msgstr "Vous avez consommé tout le stockage disponible et vous ne pouvez plus pousser ni ajouter de fichiers volumineux à des projets dépassant la limite du forfait gratuit (%{free_size_limit})."
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} for %{namespace_name}"
msgstr "Vous avez atteint la limite de stockage gratuit de %{free_size_limit} pour %{namespace_name}"
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on %{readonly_project_count} project"
msgid_plural "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on %{readonly_project_count} projects"
-msgstr[0] "Vous avez atteint la limite de stockage gratuit de %{free_size_limit} sur %{readonly_project_count} projet "
-msgstr[1] "Vous avez atteint la limite de stockage gratuit de %{free_size_limit} sur %{readonly_project_count} projets"
+msgstr[0] "Vous avez atteint la limite de stockage gratuit de %{free_size_limit} sur %{readonly_project_count} projet "
+msgstr[1] "Vous avez atteint la limite de stockage gratuit de %{free_size_limit} sur %{readonly_project_count} projets"
msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name}"
msgstr "Vous avez utilisé %{usage_in_percent} du quota de stockage pour %{namespace_name}"
@@ -30408,12 +30487,6 @@ msgstr "Aucune carte de crédit n'est nécessaire."
msgid "No data available"
msgstr "Aucune donnée disponible"
-msgid "No data found"
-msgstr "Aucune donnée trouvée"
-
-msgid "No data to display"
-msgstr "Aucune donnée à afficher"
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr "Aucun déploiement détecté. Utilisez des environnements pour contrôler le déploiement continu de votre logiciel. %{linkStart}En savoir plus sur les tâches de déploiement.%{linkEnd}"
@@ -30469,7 +30542,7 @@ msgid "No labels with such name or description"
msgstr "Aucun label avec un tel nom ou une telle description"
msgid "No linked issue matches the provided parameter."
-msgstr ""
+msgstr "Aucun problème associé ne correspond au paramètre fourni."
msgid "No matches found"
msgstr "Aucune correspondance trouvée"
@@ -30552,9 +30625,6 @@ msgstr "Pas de réf sélectionnée"
msgid "No regions configured"
msgstr "Aucune région configurée"
-msgid "No related merge requests found."
-msgstr "Aucune demande de fusion associée n'a été trouvée."
-
msgid "No repository"
msgstr "Aucun dépôt"
@@ -30597,6 +30667,9 @@ msgstr "Pas de trace de pile pour cette erreur"
msgid "No starrers matched your search"
msgstr "Aucun supporteur ne correspond à votre recherche"
+msgid "No start date – %{dueDate}"
+msgstr "Pas de date de début-%{dueDate}"
+
msgid "No suggestions found"
msgstr "Aucune suggestion trouvée"
@@ -30740,9 +30813,6 @@ msgstr "Remarque : les bifurcations actuelles conserveront leur niveau de visib
msgid "NoteForm|Note"
msgstr "Note"
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr "Prend en charge le %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. Pour les %{quickActionsDocsLinkStart}actions rapides%{quickActionsDocsLinkEnd}, tapez %{keyboardStart}/%{keyboardEnd}."
-
msgid "Notes"
msgstr "Notes"
@@ -31039,6 +31109,9 @@ msgstr "Auteur de la validation"
msgid "Notify|Committed by"
msgstr "Validation effectuée par"
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr "Impossible de trouver les valeurs %{column} suivantes dans %{project}%{parent_groups_clause} : %{error_lines}"
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr "Vous ne souhaitez pas recevoir de mises à jour de la part des administrateurs de GitLab ?"
@@ -31144,18 +31217,24 @@ msgstr "Aucun aperçu pour ce type de fichier"
msgid "Notify|No work items have been imported."
msgstr "Aucun élément de travail n'a été importé."
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
-msgstr "Le pipeline #%{pipeline_id} a échoué !"
-
msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr "Pipeline %{pipeline_link} déclenché par"
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
-msgstr "Le pipeline a été corrigé et #%{pipeline_id} a réussi !"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
+msgstr "Le pipeline %{pipeline_name_or_id} a échoué !"
+
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr "Le pipeline %{pipeline_name_or_id} a réussi !"
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
+msgstr "Le pipeline a été corrigé et %{pipeline_name_or_id} a réussi !"
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr "Veuillez vérifier que votre fournisseur de services prend en charge le sous-adressage de courriel et que vous avez configuré correctement le transfert des courriers électroniques."
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr "Veuillez corriger les erreurs ci-dessus et réessayez d'importer le fichier au format CSV."
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr "Veuillez corriger les lignes contenant des erreurs et réessayez d'importer le CSV."
@@ -31330,6 +31409,9 @@ msgstr "Nombre de répliques"
msgid "Number of shards"
msgstr "Nombre de fragments"
+msgid "Number of shards for non-code indexing"
+msgstr "Nombre de shards pour l'indexation non codée"
+
msgid "OK"
msgstr "OK"
@@ -32006,6 +32088,12 @@ msgstr "Liste numérotée"
msgid "Organizations"
msgstr "Entreprises"
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr "Membre orphelin"
@@ -32325,13 +32413,13 @@ msgid "PackageRegistry|Debian"
msgstr "Debian"
msgid "PackageRegistry|Delete %{count} assets"
-msgstr ""
+msgstr "Supprimer %{count} ressources"
msgid "PackageRegistry|Delete Package Version"
msgstr "Supprimer la version du paquet"
msgid "PackageRegistry|Delete asset"
-msgstr ""
+msgstr "Supprimer la ressource"
msgid "PackageRegistry|Delete package"
msgstr "Supprimer le paquet"
@@ -32527,6 +32615,18 @@ msgstr "Niveau projet"
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr "Publier les paquets si leur nom ou leur version correspond à cette expression rationnelle."
+msgid "PackageRegistry|Published %{date}"
+msgstr "Publié le %{date}"
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr "Publié par %{author}, le %{date}"
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr "Publié sur %{projectName} par %{author}, le %{date}"
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr "Publié sur %{projectName}, le %{date}"
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr "Publié dans le registre de paquets %{project} %{datetime}"
@@ -32582,7 +32682,7 @@ msgid "PackageRegistry|Something went wrong while deleting the package."
msgstr "Une erreur s'est produite lors de la suppression du paquet."
msgid "PackageRegistry|Something went wrong while fetching package assets."
-msgstr "Une erreur s’est produite lors de la récupération des actifs du paquet."
+msgstr "Une erreur s'est produite lors de la récupération des ressources du paquet."
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr "Une erreur s'est produite lors de la récupération de l'historique du paquet."
@@ -32642,7 +32742,7 @@ msgid "PackageRegistry|Yes, delete selected packages"
msgstr "Oui, supprimer les paquets sélectionnés"
msgid "PackageRegistry|You are about to delete %{count} assets. This operation is irreversible."
-msgstr ""
+msgstr "Vous êtes sur le point de supprimer %{count} ressources. Cette opération est irréversible."
msgid "PackageRegistry|You are about to delete %{count} packages. This operation is irreversible."
msgstr "Vous êtes sur le point de supprimer %{count} paquets. Cette opération est irréversible."
@@ -33097,9 +33197,6 @@ msgstr "Planifications de pipelines"
msgid "Pipeline URL"
msgstr "URL du pipeline"
-msgid "Pipeline artifacts"
-msgstr "Artefacts de pipeline"
-
msgid "Pipeline creation rate limits"
msgstr "Limitations de la fréquence de création de pipelines"
@@ -33275,7 +33372,7 @@ msgid "PipelineEditor|Waiting for CI content to load..."
msgstr "En attente du chargement du contenu CI..."
msgid "PipelineGraph|Are you sure you want to retry %{jobName}?"
-msgstr ""
+msgstr "Voulez-vous vraiment réessayer %{jobName} ?"
msgid "PipelineGraph|Downstream pipeline might not display in the graph while the new downstream pipeline is being created."
msgstr "Le pipeline en aval pourrait ne pas s'afficher sur le graphique tant que le nouveau pipeau en aval est en cours de création."
@@ -33301,6 +33398,15 @@ msgstr "Actif"
msgid "PipelineSchedules|All"
msgstr "Tous"
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr "Une erreur s'est produite lors de la création de la planification du pipeline."
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr "Voulez-vous vraiment supprimer la planification de ce pipeline ?"
@@ -33310,6 +33416,9 @@ msgstr "Peut avoir des variables CI/CD personnalisées."
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr "Créer une nouvelle planification de pipeline"
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr "Fuseau horaire Cron"
@@ -33367,9 +33476,6 @@ msgstr "S'exécute pour une branche ou une étiquette spécifique."
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr "S'exécute avec les mêmes permissions de projet que celles du propriétaire du programme."
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr "Enregistrer la planification de pipeline"
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr "L'exécution d'un pipeline a été programmée avec succès. Allez à la %{linkStart}page des pipelines%{linkEnd} pour voir les détails. "
@@ -33556,9 +33662,6 @@ msgstr "Catalogue CI/CD"
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr "Pipeline enfant (%{linkStart}parent%{linkEnd})"
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr "Pipeline enfant (%{link_start}parent%{link_end})"
-
msgid "Pipelines|Clear runner caches"
msgstr "Vider les caches des runners"
@@ -33670,6 +33773,9 @@ msgstr "Prêt pour la configuration CI/CD de votre projet ?"
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr "Rebaser crée un pipeline qui exécute du code provenant d'une requête de fusion d'un projet qui a bifurqué. Par conséquent, il existe des implications potentielles sur la sécurité comme l'exposition de variables CI."
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr "Réessayer le job %{jobName}"
+
msgid "Pipelines|Revoke trigger"
msgstr "Révoquer le déclencheur"
@@ -33721,9 +33827,6 @@ msgstr "Cette configuration CI de GitLab n'est pas valide : %{reason}. %{linkSt
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr "Cette configuration de GitLab CI est valide."
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr "Il s'agit d'un pipeline enfant dans le pipeline parent"
-
msgid "Pipelines|This pipeline is stuck"
msgstr "Ce pipeline est bloqué"
@@ -33742,11 +33845,11 @@ msgstr "Ce projet n'est actuellement pas configuré pour exécuter des pipelines
msgid "Pipelines|Token"
msgstr "Jeton"
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
-msgstr ""
+msgstr "Nombre total de jobs pour le pipeline"
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr "L'utilisateur du déclencheur n'a pas les autorisations suffisantes pour le projet"
@@ -33797,14 +33900,20 @@ msgid "Pipelines|You should review the code thoroughly before running this pipel
msgstr "Vous devriez examiner le code minutieusement avant d'exécuter ce pipeline avec les ressources CI/CD du projet parent."
msgid "Pipelines|You will see a maximum of 100 jobs in this list. To view all failed jobs, %{linkStart}go to the details page%{linkEnd} of this pipeline."
-msgstr ""
+msgstr "Vous verrez un maximum de 100 jobs dans cette liste. Pour afficher tous les jobs ayant échoué, %{linkStart}accédez à la page correspondante pour voir les détails%{linkEnd} de ce pipeline."
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr "Vos modifications ont été validées avec succès. Redirection vers la page de nouvelle requête de fusion."
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr "erreur"
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr "non valide"
@@ -33871,6 +33980,12 @@ msgstr "Les tâches du pipeline de train de fusion ne peuvent pas être retenté
msgid "Pipeline|Merged result pipeline"
msgstr "Pipeline du résultat de fusion"
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr "Passé"
@@ -33955,6 +34070,9 @@ msgstr "Ce pipeline s'est exécuté sur le contenu de la branche source de cette
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr "Pour exécuter un pipeline de requête de fusion, les jobs dans le fichier de configuration CI/CD %{linkStart}doivent être configurées%{linkEnd} pour s'exécuter dans les pipelines de requête de fusion."
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr "Auteur du déclencheur"
@@ -34081,9 +34199,6 @@ msgstr "Veuillez confirmer votre adresse de courriel"
msgid "Please contact an admin to create runners."
msgstr "Veuillez contacter un administrateur pour créer des runners."
-msgid "Please contact an admin to register runners."
-msgstr "Veuillez contacter un administrateur pour enregistrer des runners."
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr "Veuillez contacter votre administrateur GitLab si vous pensez qu'il s'agit d'une erreur."
@@ -34234,8 +34349,8 @@ msgstr "Veuillez réessayer"
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr "Veuillez essayer et actualiser la page. Si le problème persiste, veuillez contacter le support."
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
-msgstr "Veuillez saisir %{phrase_code} pour continuer, ou fermer ce dialogue pour annuler."
+msgid "Please type %{phrase_code} to proceed."
+msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
msgstr "Veuillez utiliser ce formulaire pour signaler à l'administrateur les utilisateurs qui créent des tickets ou des commentaires indésirables, ou qui se comportent de manière inappropriée."
@@ -34301,7 +34416,7 @@ msgid "Port"
msgstr "Port"
msgid "Possible to override in each project."
-msgstr ""
+msgstr "Remplacement possible dans chaque projet."
msgid "Postman collection"
msgstr "Collection Postman"
@@ -34436,7 +34551,7 @@ msgid "Preferences|Enable Gitpod integration"
msgstr "Activer l'intégration de Gitpod"
msgid "Preferences|Enable Zoekt code search"
-msgstr ""
+msgstr "Activer la recherche de code Zoekt"
msgid "Preferences|Enable follow users"
msgstr "Activer le suivi des utilisateurs"
@@ -34514,7 +34629,7 @@ msgid "Preferences|Turns on or off the ability to follow or be followed by other
msgstr "Active ou désactive la possibilité de suivre d'autres utilisateurs ou d'être suivi."
msgid "Preferences|Turns on or off the preference to search with Zoekt instead of Elasticsearch."
-msgstr ""
+msgstr "Active ou désactive la préférence de recherche avec Zoekt plutôt qu'avec Elasticsearch."
msgid "Preferences|Use relative times"
msgstr "Dates et heures relatives à l'heure actuelle"
@@ -34628,7 +34743,7 @@ msgid "Private projects can be created in your personal namespace with:"
msgstr "Des projets privés peuvent être créés dans votre espace de noms personnel avec :"
msgid "Private projects compute cost factor"
-msgstr ""
+msgstr "Facteur de coût de calcul des projets privés"
msgid "Problem with %{name} command: %{message}."
msgstr "Problème avec la commande %{name} : %{message}."
@@ -34643,10 +34758,10 @@ msgid "Product analytics"
msgstr "Analyse des produits"
msgid "ProductAnalytics|1. Add the NPM package to your package.json using your preferred package manager"
-msgstr "1. Ajoutez le paquet NPM à votre fichier package.json à l'aide de votre gestionnaire de paquets préféré "
+msgstr "1. Ajoutez le paquet NPM à votre fichier package.json à l'aide de votre gestionnaire de paquets préféré"
msgid "ProductAnalytics|2. Import the new package into your JS code"
-msgstr "2. Importez le nouveau paquet dans votre code JS "
+msgstr "2. Importez le nouveau paquet dans votre code JS"
msgid "ProductAnalytics|3. Initiate the tracking"
msgstr "3. Lancez le suivi"
@@ -34655,7 +34770,7 @@ msgid "ProductAnalytics|Add another dimension"
msgstr "Ajouter une autre dimension"
msgid "ProductAnalytics|Add the script to the page and assign the client SDK to window"
-msgstr "Ajoutez le script dans la page et assignez le SDK client à l'objet window"
+msgstr "Ajouter le script dans la page et assigner le SDK client à l'objet window"
msgid "ProductAnalytics|Add the script to the page and assign the client SDK to window:"
msgstr "Ajoutez le script dans la page et assignez le SDK client à la fenêtre :"
@@ -34750,6 +34865,9 @@ msgstr "Événements au cours du temps"
msgid "ProductAnalytics|Feature Usages"
msgstr "Utilisation des fonctionnalités"
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr "Pour en savoir plus, consultez les %{linkStart}documents%{linkEnd}."
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr "Pour que le tableau de bord des données d'analyse des produits commence à afficher des données, vous devez ajouter le code de suivi des données d'analyse à votre projet."
@@ -34789,6 +34907,9 @@ msgstr "Sur quel élément voulez-vous obtenir des insights ?"
msgid "ProductAnalytics|Page Views"
msgstr "Vues de pages"
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr "Pourcentage de visites répétées"
@@ -34817,7 +34938,7 @@ msgid "ProductAnalytics|The host to send all tracking events to"
msgstr "L'hôte auquel envoyer tous les événements de suivi"
msgid "ProductAnalytics|The sender of tracking events"
-msgstr "L’expéditeur des événements de suivi"
+msgstr "L'expéditeur des événements de suivi"
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 "Il n'y a pas de données pour ce type de graphique actuellement. Veuillez consulter l'onglet Configuration si vous n'avez pas déjà configuré l'outil des données analytiques de produit."
@@ -34853,7 +34974,7 @@ msgid "ProductAnalytics|What do you want to measure?"
msgstr "Que voulez-vous mesurer ?"
msgid "ProductAnalytics|You can instrument your application using a JS module or an HTML script. Follow the instructions below for the option you prefer."
-msgstr "Vous pouvez instrumenter votre application en utilisant un module JavaScript ou un script HTML. Suivez les instructions ci-dessous selon l’option que vous préférez."
+msgstr "Vous pouvez instrumenter votre application en utilisant un module JS ou un script HTML. Suivez les instructions ci-dessous selon l'option que vous préférez."
msgid "Productivity"
msgstr "Productivité"
@@ -34930,6 +35051,9 @@ msgstr "depuis"
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 "Vous êtes sur le point de supprimer définitivement %{yourAccount}, ainsi que l'ensemble des tickets, demandes de fusion et groupes liés à votre compte. Une fois que vous avez confirmé l'opération %{deleteAccount}, vous ne pouvez ni l'annuler ni la restaurer."
+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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr "Vous êtes sur le point de supprimer définitivement %{yourAccount}, ainsi que l'ensemble des tickets, requêtes de fusion et groupes associés à votre compte. Une fois que vous avez confirmé l'opération%{deleteAccount}, vous ne pouvez ni l'annuler ni restaurer. Vous devrez peut-être attendre sept jours avant de créer un nouveau compte avec le même nom d'utilisateur ou la même adresse de courriel."
+
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 "Vous êtes sur le point de changer le nom d'utilisateur %{currentUsernameBold} en %{newUsernameBold}. Le profil et les projets seront redirigés vers l'espace de noms %{newUsername}, mais cette redirection expirera si un nouvel utilisateur ou un nouveau groupe est créé avec l'ancien nom %{currentUsername}. Veuillez mettre à jour vos dépôts Git dès que possible."
@@ -34943,10 +35067,10 @@ msgid "Profiles|Account could not be deleted. GitLab was unable to verify your i
msgstr "Le compte n'a pas pu être supprimé. GitLab n'a pas réussi à vérifier votre identité."
msgid "Profiles|Account deletion is not allowed by your administrator."
-msgstr "La suppression du compte n’est pas autorisée par votre administrateur."
+msgstr "La suppression du compte n'est pas autorisée par votre administrateur."
msgid "Profiles|Account deletion is not allowed."
-msgstr "La suppression du compte n’est pas autorisée."
+msgstr "La suppression du compte n'est pas autorisée."
msgid "Profiles|Account scheduled for removal."
msgstr "Compte programmé pour la suppression."
@@ -35446,9 +35570,6 @@ msgstr "Infos du projet°:"
msgid "Project information"
msgstr "Informations sur le projet"
-msgid "Project is required when cluster_type is :project"
-msgstr "Le projet est requis lorsque cluster_type est défini sur :project"
-
msgid "Project members"
msgstr "Membres du projet"
@@ -35876,7 +35997,7 @@ msgid "ProjectSettings|Configure your infrastructure."
msgstr "Configurez votre infrastructure."
msgid "ProjectSettings|Connect to your instance"
-msgstr "Se connecter à votre instance"
+msgstr "Connexion à votre instance"
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "Contactez un administrateur pour modifier ce paramètre."
@@ -35948,7 +36069,7 @@ msgid "ProjectSettings|Fast-forward merges only."
msgstr "Fusions en avance rapide uniquement."
msgid "ProjectSettings|Feature flags"
-msgstr "Indicateurs de fonctionnalité"
+msgstr "ProjectSettings|Feature flags"
msgid "ProjectSettings|Flexible tool to collaboratively develop ideas and plan work in this project."
msgstr "Un outil souple pour développer des idées collaborativement et pour planifier le travail sur ce projet."
@@ -35986,18 +36107,6 @@ msgstr "Interne"
msgid "ProjectSettings|Issues"
msgstr "Tickets"
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr "Adresse de courriel de l'administrateur Jitsu"
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr "Mot de passe de l'administrateur Jitsu"
-
-msgid "ProjectSettings|Jitsu host"
-msgstr "Hôte Jitsu"
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr "ID du projet Jitsu"
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr "Les objets LFS de ce dépôt sont disponibles pour les bifurcations. %{linkStart}Comment puis-je les supprimer ?%{linkEnd}"
@@ -36047,7 +36156,7 @@ msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-d
msgstr "La fusion n'est autorisée que lorsque la branche source est à jour avec sa cible."
msgid "ProjectSettings|Model experiments"
-msgstr ""
+msgstr "Expériences du modèle"
msgid "ProjectSettings|Monitor"
msgstr "Supervision"
@@ -36068,7 +36177,7 @@ msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr "Seuls les commits signés peuvent être poussés sur ce dépôt Git."
msgid "ProjectSettings|Override instance analytics configuration for this project"
-msgstr "Outrepassez la configuration de l'instance analytique pour ce projet"
+msgstr "Remplacer la configuration de l'analyse de l'instance pour ce projet"
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr "Remplacer les préférences de notification utilisateur pour tous les membres du projet."
@@ -36089,10 +36198,10 @@ msgid "ProjectSettings|Private"
msgstr "Privée"
msgid "ProjectSettings|Product analytics configurator connection string"
-msgstr "Chaîne de connexion du configurateur de l'analytique de produits"
+msgstr "Chaîne de connexion du configurateur de l'analyse de produits"
msgid "ProjectSettings|Product analytics needs to be set up before your application can be instrumented. Follow the %{link_start}set up process%{link_end}."
-msgstr "L'analytique des produits a besoin d'être configurée avant que votre application ne puisse être instrumentée. Suivez le %{link_start}processus de configuration%{link_end}."
+msgstr "L'analyse des produits doit être configurée avant que votre application ne puisse être instrumentée. Suivez le %{link_start}processus de configuration%{link_end}."
msgid "ProjectSettings|Project visibility"
msgstr "Visibilité du projet"
@@ -36137,7 +36246,7 @@ msgid "ProjectSettings|Security and compliance for this project."
msgstr "Sécurité et conformité de ce projet."
msgid "ProjectSettings|Select a project"
-msgstr "Sélectionnez un projet"
+msgstr "Sélectionner un projet"
msgid "ProjectSettings|Select the default branch for this project, and configure the template for branch names."
msgstr "Sélectionnez la branche par défaut pour ce projet et configurez le modèle pour les noms de branches."
@@ -36181,9 +36290,6 @@ msgstr "Soumettez les modifications à fusionner en amont."
msgid "ProjectSettings|Target project"
msgstr "Projet cible"
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr "L'ID du projet dans Jitsu. Le projet contient toutes les instances de donnés d'analyse."
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr "L'URL de votre instance Cube."
@@ -36197,7 +36303,7 @@ msgid "ProjectSettings|The commit message used when squashing commits."
msgstr "Le message de validation utilisé lors de l'écrasement de validations."
msgid "ProjectSettings|The connection string of your product analytics configurator instance for Snowplow configuration."
-msgstr "La chaîne de connexion de l'instance du configurateur de l'analytique de produits pour la configuration de Snowplow."
+msgstr "La chaîne de connexion de l'instance du configurateur de l'analyse de produits pour la configuration de Snowplow."
msgid "ProjectSettings|The default target project for merge requests created in this fork project."
msgstr "Le projet cible par défaut pour les requêtes de fusion créées dans ce projet dupliqué."
@@ -36205,9 +36311,6 @@ msgstr "Le projet cible par défaut pour les requêtes de fusion créées dans c
msgid "ProjectSettings|The default template will be applied on save."
msgstr "Le modèle par défaut s'appliquera à l'enregistrement."
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr "L'hôte de votre instance Jitsu."
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr "L'hôte de l'instance de votre collecteur de données."
@@ -36233,7 +36336,7 @@ msgid "ProjectSettings|Topics are publicly visible even on private projects. Do
msgstr "Les sujets sont visibles publiquement, même sur les projets privés. N'incluez pas d'informations sensibles dans leurs noms. %{linkStart}En savoir plus%{linkEnd}."
msgid "ProjectSettings|Track machine learning model experiments and artifacts."
-msgstr ""
+msgstr "Suivez les expériences et les artefacts du modèle d'apprentissage automatique."
msgid "ProjectSettings|Transfer project"
msgstr "Transférer le projet"
@@ -36244,11 +36347,8 @@ msgstr "Projet en amont"
msgid "ProjectSettings|Used for every new merge request."
msgstr "Utilisé pour chaque nouvelle requête de fusion."
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr "Utilisée pour connecter Jitsu à l'instance Clickhouse."
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
-msgstr "Utilisé pour générer des jetons d'accès d'API de courte durée."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
+msgstr "Sert à connecter Snowplow à l'instance Clickhouse."
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
msgstr "Utilisée pour récupérer les données du tableau de bord à partir de l'instance de Cube."
@@ -36730,6 +36830,9 @@ msgstr "Promouvoir en tant qu'étiquette de groupe"
msgid "Promote to objective"
msgstr "Définir comme objectif"
+msgid "Promote work item"
+msgstr "Promouvoir l'élément de travail"
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr "Seuls les jalons du projet peuvent être promus."
@@ -36745,6 +36848,9 @@ msgstr "Le ticket a été promu en épopée."
msgid "Promotes issue to incident"
msgstr "Transforme le ticket en incident"
+msgid "Promotes work item to %{type}."
+msgstr "Promeut l'élément de travail vers %{type}."
+
msgid "Promotion is not supported."
msgstr "La promotion n'est pas prise en charge."
@@ -36875,7 +36981,7 @@ msgid "Promotions|Upgrade your plan to improve repositories."
msgstr "Mettez à niveau votre forfait pour améliorer les dépôts."
msgid "Promotions|Use GitLab Mobile DevOps to quickly build, sign, and release native and cross-platform mobile apps for Android and iOS using GitLab CI/CD."
-msgstr "Utilisez GitLab Mobile DevOps pour construire, signer et publier rapidement des applications mobiles natives et multiplateformes pour Android et iOS en utilisant GitLab CI/CD."
+msgstr "Utilisez GitLab Mobile DevOps pour compiler, signer et publier rapidement des applications mobiles natives et multiplateformes pour Android et iOS en utilisant GitLab CI/CD."
msgid "Promotions|Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
msgstr "Les crochets Web vous permettent de déclencher une URL si, par exemple, du nouveau code est poussé ou si un nouveau ticket est créé. Vous pouvez en configurer pour écouter des événements spécifiques tels que des poussées, des tickets ou des requêtes de fusion. Les crochets Web de groupe s'appliqueront à tous les projets d'un groupe, ce qui vous permet d'uniformiser leurs fonctionnalités dans la totalité de votre groupe."
@@ -36896,7 +37002,7 @@ msgid "Prompt users to upload SSH keys"
msgstr "Inviter les utilisateurs à téléverser des clés SSH"
msgid "Property 'dedicatedPod' of component '%s' is not yet supported"
-msgstr "La propriété « dedicatedPod » du composant « %s » n'est pas encore prise en charge"
+msgstr "La propriété « dedicatedPod » du composant « %s » n'est pas encore prise en charge"
msgid "Protect"
msgstr "Protéger"
@@ -37302,7 +37408,7 @@ msgid "Public projects are an easy way to allow everyone to have read-only acces
msgstr "Les projets publics sont un moyen simple de permettre à chacun d'avoir un accès en lecture seule."
msgid "Public projects compute cost factor"
-msgstr ""
+msgstr "Facteur de coût de calcul des projets publics"
msgid "Publish to status page"
msgstr "Publier sur la page d'état"
@@ -37529,9 +37635,6 @@ msgstr "Qualité du projet"
msgid "Query"
msgstr "Requête"
-msgid "Query cannot be processed"
-msgstr "La requête ne peut pas être traitée"
-
msgid "Queued"
msgstr "En file d'attente"
@@ -37602,7 +37705,10 @@ msgid "Read more about GitLab at %{link_to_promo}."
msgstr "En savoir plus sur GitLab sur %{link_to_promo}."
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
-msgstr "En savoir plus sur les %{changes_link_start}modifications%{link_end}, la %{vision_link_start}stratégie%{link_end} et l'%{design_link_start}apparence%{link_end}."
+msgstr "En savoir plus sur les %{changes_link_start}modifications%{link_end}, la %{vision_link_start}stratégie%{link_end} et le %{design_link_start}design%{link_end}."
+
+msgid "Read the documentation before applying changes."
+msgstr "Lisez la documentation avant d'appliquer les modifications."
msgid "Read their documentation."
msgstr "Lisez leur documentation."
@@ -37786,7 +37892,7 @@ msgstr "utiliser cette fonctionnalité"
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr "Voulez-vous vraiment ignorer cette étape ?"
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr "Les pipelines utilisant les runners partagés de GitLab échoueront tant
msgid "RegistrationVerification|Skip this for now"
msgstr "Ignorer cela pour l'instant"
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr "Oui, je voudrais l'ignorer"
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr "Vous pourrez toujours vérifier votre compte ultérieurement."
-msgid "Registration|Checkout"
-msgstr "Extraire"
-
-msgid "Registration|Your GitLab group"
-msgstr "Votre groupe GitLab"
-
-msgid "Registration|Your first project"
-msgstr "Votre premier projet"
-
-msgid "Registration|Your profile"
-msgstr "Votre profil"
-
msgid "Registry entry enqueued to be resynced"
msgstr "Entrée de registre mise en file d'attente pour être resynchronisée"
@@ -37859,10 +37953,10 @@ msgid "Related issues"
msgstr "Tickets associés"
msgid "Related merge request %{link_to_merge_request} to merge %{link_to_merge_request_source_branch}"
-msgstr ""
+msgstr "Requête de fusion %{link_to_merge_request} associée pour fusionner %{link_to_merge_request_source_branch}"
msgid "Related merge request %{link_to_merge_request} to merge %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
+msgstr "Requête de fusion %{link_to_merge_request} associée pour fusionner %{link_to_merge_request_source_branch} dans %{link_to_merge_request_target_branch}"
msgid "Related merge requests"
msgstr "Demandes de fusion liées"
@@ -38040,14 +38134,14 @@ msgstr "Supprimer la réunion Zoom."
msgid "Remove access"
msgstr "Supprimer l'accès"
-msgid "Remove all or specific assignee(s)"
-msgstr "Supprimer tout ou partie des personnes assignées"
+msgid "Remove all or specific assignees"
+msgstr "Supprimer toutes les personnes assignées ou certaines d'entre elles"
msgid "Remove all or specific label(s)"
msgstr "Supprimer tout ou partie des labels"
-msgid "Remove all or specific reviewer(s)"
-msgstr "Supprimer tout ou partie des relecteurs"
+msgid "Remove all or specific reviewers"
+msgstr "Supprimer tous les relecteurs ou certains d'entre eux"
msgid "Remove approvers"
msgstr "Supprimer les approbateurs"
@@ -38128,7 +38222,7 @@ msgid "Remove link"
msgstr "Supprimer le lien"
msgid "Remove link with another issue"
-msgstr ""
+msgstr "Supprimer l'association avec un autre ticket"
msgid "Remove list"
msgstr "Supprimer la liste"
@@ -38143,7 +38237,7 @@ msgid "Remove member"
msgstr "Supprimer le membre"
msgid "Remove merge request reference"
-msgstr "Supprimer la référence de la demande de fusion"
+msgstr "Supprimer la référence de la requête de fusion"
msgid "Remove milestone"
msgstr "Supprimer le jalon"
@@ -38221,7 +38315,7 @@ msgid "Removed group can not be restored!"
msgstr "Un groupe supprimé ne peut être restauré."
msgid "Removed link with %{issue_ref}."
-msgstr ""
+msgstr "Association avec %{issue_ref} supprimée."
msgid "Removed parent epic %{epic_ref}."
msgstr "Épopée parente %{epic_ref} supprimée."
@@ -38269,7 +38363,7 @@ msgid "Removes an issue from an epic."
msgstr "Supprime un ticket d'une épopée."
msgid "Removes link with %{issue_ref}."
-msgstr ""
+msgstr "Supprime l'association avec %{issue_ref}."
msgid "Removes parent epic %{epic_ref}."
msgstr "Supprime l'épopée parente %{epic_ref}."
@@ -38299,7 +38393,7 @@ msgid "Render diagrams in your documents using PlantUML."
msgstr "Générer des diagrammes dans vos documents grâce à PlantUML."
msgid "Render diagrams in your documents using diagrams.net."
-msgstr "Générer des diagrammes dans vos documents grâce à diagrams.net."
+msgstr "Générez des diagrammes dans vos documents grâce à diagrams.net."
msgid "Renew subscription"
msgstr "Renouveler l'abonnement"
@@ -38307,6 +38401,9 @@ msgstr "Renouveler l'abonnement"
msgid "Reopen"
msgstr "Rouvrir"
+msgid "Reopen %{issuableType}"
+msgstr "Rouvrir %{issuableType}"
+
msgid "Reopen %{issueType}"
msgstr "Rouvrir %{issueType}"
@@ -38331,6 +38428,9 @@ msgstr "Rouvrir l'élément suivant : %{quick_action_target}"
msgid "Reopened this %{quick_action_target}."
msgstr "Cet élément a été rouvert : %{quick_action_target}."
+msgid "Reopening %{issuableType}..."
+msgstr "Réouverture de %{issuableType}..."
+
msgid "Reopening..."
msgstr "Réouverture..."
@@ -38349,6 +38449,9 @@ msgstr "Remplacer tous les labels"
msgid "Replace audio"
msgstr "Remplacer l'audio"
+msgid "Replace current template with filled in placeholders"
+msgstr "Remplacer le modèle actuel par des espaces réservés remplis"
+
msgid "Replace file"
msgstr "Remplacer le fichier"
@@ -38748,8 +38851,8 @@ msgstr "Le dépôt doit contenir au moins 1°fichier."
msgid "Repository size is above the limit."
msgstr "La taille du dépôt est supérieure à la limite."
-msgid "Repository size limit (MB)"
-msgstr "Limite de taille du dépôt (Mo)"
+msgid "Repository size limit (MiB)"
+msgstr "Limite de taille du dépôt (Mio)"
msgid "Repository storage"
msgstr "Stockage du dépôt"
@@ -38879,7 +38982,7 @@ msgstr[0] "Nécessite %{count} approbation de %{names}."
msgstr[1] "Nécessite %{count} approbations de %{names}."
msgid "Requires a verified GitLab email address."
-msgstr ""
+msgstr "Nécessite une adresse de courriel GitLab vérifiée."
msgid "Requires you to deploy or set up cloud-hosted Sentry."
msgstr "Nécessite que vous déployiez ou configuriez Sentry dans le Cloud."
@@ -38984,7 +39087,7 @@ msgid "Response didn't include `service_desk_address`"
msgstr "La réponse n'incluait pas «°service_desk_address »"
msgid "Response generated by AI"
-msgstr ""
+msgstr "Réponse générée par l'IA"
msgid "Response initiated"
msgstr "Réponse initiée"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] "Relecteur"
msgstr[1] "%d relecteurs"
-msgid "Reviewer(s)"
-msgstr "Relecteur(s)"
-
msgid "Reviewers"
msgstr "Relecteurs"
@@ -39173,12 +39273,21 @@ msgstr "Vue de la feuille de route"
msgid "Role"
msgstr "Rôle"
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr "Restaurer"
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr "Ruby"
@@ -39263,7 +39372,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "Runners|%{count} runners in this group"
-msgstr "%{count} exécuteurs dans ce groupe"
+msgstr "%{count} runners dans ce groupe"
msgid "Runners|%{highlightStart}%{duration}%{highlightEnd} second"
msgid_plural "Runners|%{highlightStart}%{duration}%{highlightEnd} seconds"
@@ -39271,7 +39380,7 @@ msgstr[0] "%{highlightStart}%{duration}%{highlightEnd} seconde"
msgstr[1] "%{highlightStart}%{duration}%{highlightEnd} secondes"
msgid "Runners|%{linkStart}Create a new runner%{linkEnd} to get started."
-msgstr ""
+msgstr "%{linkStart}Créez un nouveau runner%{linkEnd} pour commencer."
msgid "Runners|%{link_start}These runners%{link_end} are available to all groups and projects."
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr "Docker HA Amazon Linux 2 avec mise à l'échelle manuelle et planificati
msgid "Runners|An error has occurred fetching instructions"
msgstr "Une erreur s'est produite lors de la récupération des instructions"
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr "Une erreur s'est produite lors de la création du runner. Veuillez réessayer."
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr "Une erreur s'est produite lors de la suppression. Certains runners peuvent ne pas avoir été supprimés."
@@ -39341,7 +39453,7 @@ msgid "Runners|An upgrade is recommended for this runner"
msgstr "Une mise à niveau est recommandée pour ce runner"
msgid "Runners|Arch/Platform"
-msgstr "Architecture/Plateforme"
+msgstr "Architecture/plateforme"
msgid "Runners|Architecture"
msgstr "Architecture"
@@ -39428,19 +39540,25 @@ msgid "Runners|Create an instance runner to generate a command that registers th
msgstr "Créez un runner d'instance pour générer une commande qui enregistre le runner avec toutes ses configurations."
msgid "Runners|Create runner"
-msgstr "Créer un exécuteur"
+msgstr "Créer un runner"
msgid "Runners|Created %{timeAgo}"
-msgstr ""
+msgstr "Créé %{timeAgo}"
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr "Création %{timeAgo} par %{avatar}"
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] "Supprimer %d runner"
msgstr[1] "Supprimer %d runners"
+msgid "Runners|Delete %{count} runners?"
+msgstr "Supprimer %{count} runners ?"
+
msgid "Runners|Delete runner"
msgstr "Supprimer le runner"
@@ -39487,7 +39605,7 @@ msgid "Runners|Executor"
msgstr "Exécuteur"
msgid "Runners|Existing runners are not affected. To permit runner registration for all groups, enable this setting in the Admin Area in Settings &gt; CI/CD."
-msgstr "Les runners existants ne sont pas affectés. Pour permettre l'enregistrement de runners pour tous les groupes, activez ce paramètre dans l'interface d'administration, dans Paramètres &gt; CI/CD."
+msgstr "Les exécuteurs existants ne sont pas affectés. Pour permettre l’inscription d’exécuteurs pour tous les groupes, activez ce paramètre dans l'Espace d’administration, Paramètres &gt; Intégration et livraison continues."
msgid "Runners|Existing runners are not affected. To permit runner registration for all projects, enable this setting in the Admin Area in Settings &gt; CI/CD."
msgstr "Les runners existants ne sont pas affectés. Pour permettre l'enregistrement de runners pour tous les projets, activez ce paramètre dans l'interface d'administration, dans Paramètres &gt; CI/CD."
@@ -39501,9 +39619,6 @@ msgstr "Récupérer les données de la version de release de GitLab Runner depui
msgid "Runners|Filter projects"
msgstr "Filtrer les projets"
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr "Démarrer avec les runners"
@@ -39559,7 +39674,7 @@ msgid "Runners|Last contact"
msgstr "Dernier contact"
msgid "Runners|Last contact: %{timeAgo}"
-msgstr ""
+msgstr "Dernier contact : %{timeAgo}"
msgid "Runners|Locked to this project"
msgstr "Verrouillé sur ce projet"
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] "Supprimer définitivement %d runner"
msgstr[1] "Supprimer définitivement %d runners"
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] "Supprimer définitivement le runner"
+msgstr[1] "Supprimer définitivement %d runners"
+
msgid "Runners|Platform"
msgstr "Plateforme"
@@ -39828,10 +39948,10 @@ msgid "Runners|Runners are either:"
msgstr "Les runners sont soit :"
msgid "Runners|Runners are grouped when they have the same authentication token. This happens when you re-use a runner configuration in more than one runner manager. %{linkStart}How does this work?%{linkEnd}"
-msgstr "Les exécuteurs sont regroupés lorsqu'ils ont le même jeton d'authentification. Cela se produit lorsque vous réutilisez une configuration d'exécuteur dans plus d'un gestionnaire d'exécuteur. %{linkStart}Comment cela fonctionne-t-il ?%{linkEnd}"
+msgstr "Les runners sont regroupés lorsqu'ils ont le même jeton d'authentification. Cela se produit lorsque vous réutilisez une configuration de runner dans plus d'un gestionnaire de runner. %{linkStart}Comment cela fonctionne-t-il ?%{linkEnd}"
msgid "Runners|Runners are the agents that run your CI/CD jobs."
-msgstr ""
+msgstr "Les runners sont les agents qui exécutent vos jobs CI/CD."
msgid "Runners|Runners performance"
msgstr "Performance des runners"
@@ -39903,7 +40023,7 @@ msgid "Runners|Step 3 (optional)"
msgstr "Étape 3 (facultatif)"
msgid "Runners|Still using registration tokens?"
-msgstr ""
+msgstr "Vous utilisez toujours des jetons d'enregistrement ?"
msgid "Runners|Stop the runner from accepting new jobs."
msgstr "Ne plus accepter de nouvelles tâches pour le runner."
@@ -39930,10 +40050,12 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr "Le projet, le groupe ou l'instance où le runner a été enregistré. Les runners d'instance sont toujours détenus par l'administrateur."
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 "L'runner sera définitivement supprimé et ne sera plus disponible pour les projets ou les groupes de l'instance. Voulez-vous vraiment continuer ?"
+msgid_plural "Runners|%d 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] "Le runner sera définitivement supprimé et ne sera plus disponible pour les projets ou les groupes de l'instance. Voulez-vous vraiment continuer ?"
+msgstr[1] "%d runners seront définitivement supprimés et ne seront plus disponibles pour les projets ou les groupes de l'instance. Voulez-vous vraiment continuer ?"
msgid "Runners|The unique ID for each runner that uses this configuration."
-msgstr "L'ID unique pour chaque exécuteur qui utilise cette configuration."
+msgstr "L'ID unique pour chaque runner qui utilise cette configuration."
msgid "Runners|These runners are assigned to this project."
msgstr "Ces runners sont assignés à ce projet."
@@ -39977,10 +40099,10 @@ msgid "Runners|To install Runner in a container follow the instructions describe
msgstr "Pour installer Runner dans un conteneur, suivez les instructions décrites dans la documentation de GitLab"
msgid "Runners|To register new runners, contact your administrator."
-msgstr ""
+msgstr "Contactez votre administrateur pour enregistrer de nouveaux runners."
msgid "Runners|To register them, go to the %{link_start}group's Runners page%{link_end}."
-msgstr ""
+msgstr "Pour les enregistrer, allez sur la %{link_start}page des Exécuteurs du groupe%{link_end}."
msgid "Runners|To view the runner, go to %{runnerListName}."
msgstr "Pour voir le runner, allez dans %{runnerListName}."
@@ -40151,7 +40273,7 @@ msgid "SSH Keys Help"
msgstr "Aide sur les clés SSH"
msgid "SSH fingerprints verify that the client is connecting to the correct host. Check the %{config_link_start}current instance configuration%{config_link_end}."
-msgstr ""
+msgstr "Les empreintes SSH garantissent que le client se connecte au bon hôte. Vérifiez la %{config_link_start}configuration de l'instance actuelle%{config_link_end}."
msgid "SSH host key fingerprints"
msgstr "Empreintes de la clé SSH de l'hôte"
@@ -40249,29 +40371,53 @@ msgstr "Sauvegarde"
msgid "Saving project."
msgstr "Sauvegarde du projet."
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
-msgstr ""
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr "Fuseau horaire de : %{hostname}"
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
-msgstr ""
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
+msgstr "%{period} %{days} à %{time} %{timezoneLabel} %{timezone}"
+
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
+msgstr "Actions %{rules} pour %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
-msgstr ""
+msgstr "%{rules} chaque fois qu'un pipeline s'exécute pour %{scopes} %{branches} %{agents} %{namespaces}"
msgid "ScanExecutionPolicy|Add condition"
msgstr "Ajouter une condition"
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr "Conditions"
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr "Si le champ est vide, le runner sera choisi automatiquement"
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr "Fuseau horaire de l'agent Kubernetes"
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
-msgstr "Exécuter une analyse %{scan} sur l'exécuteur qui %{tags}"
+msgstr "Exécuter une analyse %{scan} sur le runner qui %{tags}"
msgid "ScanExecutionPolicy|Run a %{scan} scan with %{dastProfiles} on runner that %{tags}"
-msgstr "Exécuter une analyse %{scan} avec %{dastProfiles} sur l'exécuteur qui %{tags}"
+msgstr "Exécuter une analyse %{scan} avec %{dastProfiles} sur le runner qui %{tags}"
msgid "ScanExecutionPolicy|Scanner profile"
msgstr "Profil de scanner"
@@ -40280,10 +40426,13 @@ msgid "ScanExecutionPolicy|Schedule rule component"
msgstr "Composant de règle de planification"
msgid "ScanExecutionPolicy|Schedules:"
-msgstr "Programme :"
+msgstr "Programme :"
msgid "ScanExecutionPolicy|Select a scanner"
-msgstr "Sélectionnez un scanner"
+msgstr "Sélectionner un scanner"
+
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
msgid "ScanExecutionPolicy|Select agent"
msgstr "Sélectionner un agent"
@@ -40300,6 +40449,9 @@ msgstr "Sélectionner un profil de scanner"
msgid "ScanExecutionPolicy|Select site profile"
msgstr "Sélectionner un profil de site"
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr "Sélectionner un fuseau horaire"
+
msgid "ScanExecutionPolicy|Site profile"
msgstr "Profil de site"
@@ -40309,6 +40461,9 @@ msgstr "Étiquettes"
msgid "ScanExecutionPolicy|Triggers:"
msgstr "Déclenche :"
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr "agent"
@@ -40321,6 +40476,12 @@ msgstr "a une étiquette spécifique"
msgid "ScanExecutionPolicy|in namespaces"
msgstr "dans les espaces de nommage"
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr "sur %{hostname}"
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr "sur le pod de l'agent Kubernetes"
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr "le profil de scanner %{scannerProfile} et le profil de site %{siteProfile}"
@@ -40340,19 +40501,22 @@ msgid "ScanResultPolicy|Choose criteria type"
msgstr "Choisir un type de critères"
msgid "ScanResultPolicy|Clear all"
+msgstr "Tout effacer"
+
+msgid "ScanResultPolicy|Customized CI Variables"
msgstr ""
msgid "ScanResultPolicy|Except"
-msgstr ""
+msgstr "Sauf"
msgid "ScanResultPolicy|License is:"
-msgstr ""
+msgstr "La licence est :"
msgid "ScanResultPolicy|License scanning allows only one criteria: Status"
msgstr "L'analyse de licence n'autorise qu'un seul critère : statut"
msgid "ScanResultPolicy|Matching"
-msgstr ""
+msgstr "Correspondant à"
msgid "ScanResultPolicy|Maximum number of severity-criteria is one"
msgstr "Le nombre maximal de severity-criteria est de un"
@@ -40376,13 +40540,13 @@ msgid "ScanResultPolicy|Select a scan type before adding criteria"
msgstr "Sélectionner un type d'analyse avant d'ajouter des critères"
msgid "ScanResultPolicy|Select all"
-msgstr ""
+msgstr "Tout sélectionner"
msgid "ScanResultPolicy|Select license types"
-msgstr "Sélectionnez les types de licence"
+msgstr "Sélectionner les types de licence"
msgid "ScanResultPolicy|Select licenses"
-msgstr ""
+msgstr "Sélectionner des licences"
msgid "ScanResultPolicy|Severity is:"
msgstr "La gravité est :"
@@ -40390,11 +40554,14 @@ msgstr "La gravité est :"
msgid "ScanResultPolicy|Status is:"
msgstr "Le statut est :"
+msgid "ScanResultPolicy|Unknown"
+msgstr "Inconnu"
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr "Lorsque %{scanners} %{scanType} s'exécute(nt) sur les %{branches} et trouve(nt) %{vulnerabilitiesNumber} %{boldDescription} des critères suivants :"
msgid "ScanResultPolicy|When %{scanType} in an open merge request targeting the %{branches} and the licenses match all of the following criteria:"
-msgstr ""
+msgstr "Lorsque %{scanType} dans une requête de fusion ouverte ciblant les %{branches} et que les licences correspondent à tous les critères suivants :"
msgid "ScanResultPolicy|When %{scanners} find scanner specified conditions in an open merge request targeting the %{branches} and match %{boldDescription} of the following criteria"
msgstr "Lorsque %{scanners} trouve les conditions spécifiées du scanner dans une requête de fusion ouverte ciblant %{branches} et correspondant à %{boldDescription} des critères suivants"
@@ -40832,8 +40999,8 @@ msgstr "Vérification de Couverture"
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr "En savoir plus sur la Vérification de Couverture"
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
-msgstr "Nécessite une approbation en cas de diminution de la couverture de tests. %{linkStart}En savoir plus.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr "La mutation pour créer la requête de fusion de %{featureName} a échoué"
@@ -40856,9 +41023,6 @@ msgstr "Simulation de brèches et d'attaques (BAS)"
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr "La simulation de brèches et d'attaques est une fonctionnalité en phase d'incubation qui étend les tests de sécurité existants en simulant l'activité de l'adversaire."
-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 "Par défaut, tous les analyseurs sont appliqués afin de couvrir tous les langages de votre projet et ne s'exécutent que si le langage est détecté dans la requête de fusion."
-
msgid "SecurityConfiguration|Configuration guide"
msgstr "Guide de configuration"
@@ -40943,9 +41107,6 @@ msgstr "Activer rapidement tous les outils de test continu et de conformité en
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr "Métriques de sécurité en cours d'exécution pour les environnements des applications"
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr "Analyseurs SAST"
-
msgid "SecurityConfiguration|SAST configuration"
msgstr "Configuration SAST"
@@ -40983,7 +41144,7 @@ msgid "SecurityOrchestration| and "
msgstr "et "
msgid "SecurityOrchestration| and all the following apply:"
-msgstr "et que toutes les conditions suivantes s'appliquent :"
+msgstr "et que toutes les conditions suivantes s'appliquent :"
msgid "SecurityOrchestration| or "
msgstr " ou "
@@ -41055,11 +41216,14 @@ msgid "SecurityOrchestration|An error occurred while fetching the scan result po
msgstr "Une erreur s'est produite lors de la récupération des politiques de résultats d'analyse."
msgid "SecurityOrchestration|And scans to be performed:"
-msgstr "Et analyses à effectuer :"
+msgstr "Et analyses à effectuer :"
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr "Voulez-vous vraiment supprimer cette politique ? Cette action ne pourra pas être annulée."
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr "Les types de branches ne correspondent à aucune branche existante."
+
msgid "SecurityOrchestration|Choose a project"
msgstr "Choisir un projet"
@@ -41183,6 +41347,9 @@ msgstr "Aucune règle définie - la politique ne sera pas exécutée."
msgid "SecurityOrchestration|No tags available"
msgstr "Aucune étiquette disponible"
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr "Des profils DAST inexistants ont été détectés dans le yaml de la stratégie. En conséquence, le mode règle a été désactivé. Pour le réactiver, supprimez ces profils inexistants du yaml de la stratégie."
@@ -41225,8 +41392,8 @@ msgstr "Type de politique"
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr "Nécessite %{approvals} %{plural} de %{approvers} s'il se produit un ou plusieurs des cas suivants :"
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
-msgstr "Le nombre d'approbations requises dépasse celui des approbateurs éligibles"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
+msgstr "Le nombre d'approbations requises dépasse le nombre d'approbateurs éligibles."
msgid "SecurityOrchestration|Roles"
msgstr "Rôles"
@@ -41245,8 +41412,8 @@ msgstr "Exécuter %{scannerStart}%{scanner}%{scannerEnd}"
msgid "SecurityOrchestration|Run %{scannerStart}%{scanner}%{scannerEnd} on runners with tag:"
msgid_plural "SecurityOrchestration|Run %{scannerStart}%{scanner}%{scannerEnd} on runners with the tags:"
-msgstr[0] "Exécuter %{scannerStart}%{scanner}%{scannerEnd} sur les exécuteurs avec l'étiquette :"
-msgstr[1] "Exécuter %{scannerStart}%{scanner}%{scannerEnd} sur les exécuteurs avec les étiquettes :"
+msgstr[0] "Exécuter %{scannerStart}%{scanner}%{scannerEnd} sur les runners avec l'étiquette :"
+msgstr[1] "Exécuter %{scannerStart}%{scanner}%{scannerEnd} sur les runners avec les étiquettes :"
msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
msgstr "Exécutez une analyse DAST avec le profil d'analyse A et le profil de site A lorsqu'un pipeline s'exécute sur la branche principale."
@@ -41368,6 +41535,9 @@ msgstr "Ce projet"
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 "Cette vue n'affiche que les résultats d'analyse de l'agent %{agent}. Vous pouvez consulter les résultats d'analyse de tous les agents dans l'%{linkStart}onglet Vulnérabilités opérationnelles du rapport de vulnérabilités%{linkEnd}."
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr "Le fuseau horaire n'est pas valide"
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr "Pour élargir votre recherche, modifiez les filtres ci-dessus ou sélectionnez un projet de politique de sécurité différent."
@@ -41393,10 +41563,10 @@ msgid "SecurityOrchestration|Vulnerabilities are %{vulnerabilityStates}."
msgstr "Les vulnérabilités sont %{vulnerabilityStates}."
msgid "SecurityOrchestration|When %{scanners} %{vulnerabilitiesAllowed} %{vulnerability} in an open merge request targeting %{branches}%{criteriaApply}"
-msgstr "Lorsque %{scanners} %{vulnerabilitiesAllowed} %{vulnerability} dans une demande de fusion ouverte ciblant %{branches}%{criteriaApply}"
+msgstr "Lorsque %{scanners} %{vulnerabilitiesAllowed} %{vulnerability} dans une requête de fusion ouverte ciblant %{branches}%{criteriaApply}"
msgid "SecurityOrchestration|When license scanner finds any license %{matching} %{licenses}%{detection} in an open merge request targeting %{branches}."
-msgstr "Lorsque le scanner de licences trouve toute licence %{matching} %{licenses}%{detection} dans une demande de fusion ouverte ciblant %{branches}."
+msgstr "Lorsque le scanner de licences trouve toute licence %{matching} %{licenses}%{detection} dans une requête de fusion ouverte ciblant %{branches}."
msgid "SecurityOrchestration|YAML"
msgstr "YAML"
@@ -41435,7 +41605,7 @@ msgid "SecurityOrchestration|more than %{allowed}"
msgstr "plus de %{allowed}"
msgid "SecurityOrchestration|on every pipeline on the %{branches}"
-msgstr "sur chaque pipeline sur les %{branches}"
+msgstr "sur chaque pipeline sur la %{branches}"
msgid "SecurityOrchestration|or from:"
msgstr "ou depuis :"
@@ -41600,7 +41770,7 @@ msgid "SecurityReports|Failed to get security report information. Please reload
msgstr "Échec de l'obtention des informations de rapport de sécurité. Veuillez recharger la page ou réessayer plus tard."
msgid "SecurityReports|Failed updating vulnerabilities with the following IDs: %{ids}"
-msgstr "Échec de la mise à jour des vulnérabilités avec les identifiants suivants : %{ids}"
+msgstr "Échec de la mise à jour des vulnérabilités avec les ID suivants : %{ids}"
msgid "SecurityReports|Has issue"
msgstr "A un ticket"
@@ -41744,7 +41914,7 @@ msgid "SecurityReports|Status"
msgstr "État"
msgid "SecurityReports|Still detected"
-msgstr "Toujours détectée"
+msgstr "Détection toujours active"
msgid "SecurityReports|Submit vulnerability"
msgstr "Soumettre une vulnérabilité"
@@ -41761,6 +41931,9 @@ msgstr "Le rapport de sécurité de ce pipeline a %{helpPageLinkStart}expiré%{h
msgid "SecurityReports|There was an error adding the comment."
msgstr "Une erreur s'est produite lors de l'ajout du commentaire."
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr "Une erreur s'est produite lors de la création d'un ticket Jira pour la découverte de vulnérabilité. Veuillez réessayer."
+
msgid "SecurityReports|There was an error creating the issue."
msgstr "Une erreur s'est produite lors de la création du ticket."
@@ -41941,7 +42114,7 @@ msgstr "Sélectionner une itération"
msgid "Select assignee"
msgstr "Sélectionner une personne assignée"
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr "Sélectionner des personnes assignées"
msgid "Select branch"
@@ -42004,11 +42177,17 @@ msgstr "Sélectionner un projet pour lancer une création de %{type}"
msgid "Select projects"
msgstr "Sélectionner des projets"
+msgid "Select protected branch"
+msgstr "Sélectionner une branche protégée"
+
+msgid "Select protected branches"
+msgstr "Sélectionner des branches protégées"
+
msgid "Select report"
msgstr "Sélectionner un rapport"
-msgid "Select reviewer(s)"
-msgstr "Sélectionner un ou plusieurs relecteurs"
+msgid "Select reviewers"
+msgstr "Sélectionner des relecteurs"
msgid "Select severity (optional)"
msgstr "Sélectionner la gravité (facultatif)"
@@ -42154,6 +42333,9 @@ msgstr "Compte de Service"
msgid "Service Account Key"
msgstr "Clé de Compte de Service"
+msgid "Service Accounts"
+msgstr "Comptes de service"
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr "Les clés de Comptes de Service autorisent GitLab à déployer votre projet Google Cloud"
@@ -42184,6 +42366,9 @@ msgstr "L'utilisateur n'a pas l'autorisation de créer un compte de service dans
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr "L'utilisateur n'a pas l'autorisation de créer un compte de service."
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr "L'adresse de courriel personnalisée n'a pas pu être vérifiée."
@@ -42191,7 +42376,13 @@ msgid "ServiceDesk|Custom email address has already been verified."
msgstr "L'adresse de courriel personnalisée a déjà été vérifiée."
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
-msgstr "La vérification de l’adresse de courriel personnalisée a déjà été traitée et a échoué."
+msgstr "La vérification de l'adresse de courriel personnalisée a déjà été traitée et a échoué."
+
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
msgid "ServiceDesk|Enable Service Desk"
msgstr "Activer le Service d'Assistance"
@@ -42202,6 +42393,9 @@ msgstr "Pour obtenir de l'aide sur la mise en place du Service d'Assistance sur
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr "Les tickets créés à partir des courriels du Service d'Assistance apparaîtront ici. Chaque commentaire devient un élément de la discussion par courriel."
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr "Le Service d'Assistance n'est pas activé"
@@ -42209,10 +42403,10 @@ msgid "ServiceDesk|Service Desk is not supported"
msgstr "Le Service d'Assistance n'est pas pris en charge"
msgid "ServiceDesk|Service Desk setting missing"
-msgstr "Configuration du service d'assistance absente"
+msgstr "Configuration du Service Desk absente"
msgid "ServiceDesk|Service Desk setting or verification object missing"
-msgstr "Paramètre du service d'assistance ou objet de vérification manquant"
+msgstr "Paramètre du Service Desk ou objet de vérification manquant"
msgid "ServiceDesk|To enable Service Desk on this instance, an instance administrator must first set up incoming email."
msgstr "Pour activer le Service d'Assistance sur cette instance, un administrateur de celle-ci doit au préalable définir une adresse de courriel entrant."
@@ -42221,7 +42415,7 @@ msgid "ServiceDesk|Use Service Desk to connect with your users and offer custome
msgstr "Utilisez le Service d'Assistance pour être en contact avec vos utilisateurs et proposer un support client par courriel directement dans GitLab"
msgid "ServiceDesk|User cannot manage project."
-msgstr "L’utilisateur ne peut pas gérer le projet."
+msgstr "L'utilisateur ne peut pas gérer le projet."
msgid "ServiceDesk|Your users can send emails to this address:"
msgstr "Vos utilisateurs peuvent envoyer des courriels à cette adresse :"
@@ -42229,6 +42423,12 @@ msgstr "Vos utilisateurs peuvent envoyer des courriels à cette adresse :"
msgid "ServicePing|Service ping is off"
msgstr "Le ping de service est désactivé"
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr "Pour afficher les données analytiques de niveau instance, demandez à un administrateur d'activer le %{docLinkStart}ping de service%{docLinkEnd}."
@@ -42532,10 +42732,19 @@ msgid "Shared runners help link"
msgstr "Lien d'aide pour les runners partagés"
msgid "SharedRunnersMinutesSettings|Reset compute usage"
-msgstr ""
+msgstr "Réinitialiser la quantité d'unités de calcul utilisée"
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
-msgstr ""
+msgstr "Lorsque vous réinitialisez la quantité d'unités de calcul utilisée pour cet espace de nommage, celle-ci passe à zéro."
+
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr "Limite de fréquence des opérations Git SSH"
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr "Limitez le nombre d'opérations Git qu'un utilisateur peut effectuer par minute, par dépôt."
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr "Nombre maximum d'opérations Git par minute"
msgid "Shimo|Go to Shimo Workspace"
msgstr "Aller sur l'Espace de travail Shimo"
@@ -42598,7 +42807,7 @@ msgid "Show archived projects only"
msgstr "Afficher uniquement les projets archivés"
msgid "Show changes"
-msgstr ""
+msgstr "Afficher les modifications"
msgid "Show closed epics"
msgstr "Afficher les épopées fermées"
@@ -42621,7 +42830,7 @@ msgstr "Afficher le journal brut complet"
msgid "Show details"
msgstr "Afficher les détails"
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr "Afficher le navigateur de fichiers"
msgid "Show file contents"
msgstr "Afficher le contenu du fichier"
-msgid "Show filters"
-msgstr "Afficher les filtres"
-
msgid "Show full blame"
msgstr "Afficher le blame en intégralité"
@@ -42941,8 +43147,8 @@ msgstr "Taille"
msgid "Size Limits"
msgstr "Limitations des Tailles"
-msgid "Size limit per repository (MB)"
-msgstr "Limite de taille par dépôt (Mo)"
+msgid "Size limit per repository (MiB)"
+msgstr "Limite de taille par dépôt (Mio)"
msgid "Skip to main content"
msgstr "Passer au contenu principal"
@@ -43166,6 +43372,9 @@ msgstr "Nom du fichier (par exemple, test.rb)"
msgid "Snippets|Files"
msgstr "Fichiers"
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr "Les extraits de code sont limités à %{total} fichiers."
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr "Les extraits de code ne peuvent pas contenir de fichiers vides. Assurez-vous que tous les fichiers ont du contenu, ou supprimez-les."
@@ -43736,6 +43945,9 @@ msgstr "Le journal d'indésirables a été soumis avec succès comme acceptable.
msgid "Specific branches"
msgstr "Branches spécifiques"
+msgid "Specific protected branches"
+msgstr "Branches protégées spécifiques"
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr "L'URL spécifiée ne peut pas être utilisée : « %{reason} »"
@@ -43758,7 +43970,7 @@ msgid "Spent at can't be a future date and time."
msgstr "L'heure et la date à partir desquelles le temps est décompté ne peuvent pas être dans le futur."
msgid "Split cell"
-msgstr ""
+msgstr "Diviser la cellule"
msgid "Squash commit message"
msgstr "Message du squash des commits"
@@ -43874,9 +44086,6 @@ msgstr "Démarrer un fil de conversation interne"
msgid "Start merge train"
msgstr "Démarrer un train de fusion"
-msgid "Start merge train when pipeline succeeds"
-msgstr "Démarrer un train de fusion lorsque le pipeline réussit"
-
msgid "Start merge train..."
msgstr "Démarrer un train de fusion…"
@@ -44078,9 +44287,6 @@ msgstr "Documentation sur la configuration"
msgid "StatusPage|your status page frontend."
msgstr "votre page frontend d'état."
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr "Surveillez les performances et l'état de santé de votre environnement en configurant Prometheus pour superviser vos déploiements."
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr "Étape %{currentStep} sur %{stepCount}"
@@ -44129,8 +44335,8 @@ msgstr "Inconnu"
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr "Stocker vos fichiers, planifiez votre travail, collaborez sur du code et bien plus encore."
-msgid "Strikethrough"
-msgstr "Barré"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
+msgstr ""
msgid "Strikethrough text"
msgstr "Texte barré"
@@ -44412,7 +44618,7 @@ msgid "Successfully removed email."
msgstr "Courriel supprimé avec succès."
msgid "Successfully reset compute usage for namespace."
-msgstr ""
+msgstr "La quantité d'unités de calcul utilisée pour cet espace de nommage a été réinitialisée avec succès."
msgid "Successfully scheduled a pipeline to run. Go to the %{pipelines_link_start}Pipelines page%{pipelines_link_end} for details."
msgstr "L'exécution d'un pipeline a été planifiée avec succès. Accédez à la %{pipelines_link_start}page Pipelines%{pipelines_link_end} pour plus de détails."
@@ -44439,7 +44645,7 @@ msgid "Suggest code changes which can be immediately applied in one click. Try i
msgstr "Proposez des modifications de code qui peuvent être appliquées immédiatement et en un clic. Lancez-vous !"
msgid "Suggest test cases"
-msgstr ""
+msgstr "Suggérer des scénarios de test"
msgid "Suggested change"
msgstr "Modification suggérée"
@@ -44564,6 +44770,12 @@ msgstr "Résumé/note"
msgid "Summary comment (optional)"
msgstr "Commentaire récapitulatif (facultatif)"
+msgid "Summary generated by AI"
+msgstr "Résumé généré par l'IA"
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr "Le résumé sera généré lors de la prochaine poussée de cette requête de fusion et apparaîtra ici."
+
msgid "Sun"
msgstr "Dim"
@@ -44791,11 +45003,11 @@ msgstr "Changer de branche/d'étiquette"
msgid "Switch to GitLab Next"
msgstr "Passer à GitLab Next"
-msgid "Switch to Markdown"
-msgstr "Passer à Markdown"
+msgid "Switch to plain text editing"
+msgstr "Passer à l'édition en texte brut"
-msgid "Switch to rich text"
-msgstr "Passer au texte enrichi"
+msgid "Switch to rich text editing"
+msgstr "Passer à l'édition en texte enrichi"
msgid "Switch to the source to copy the file contents"
msgstr "Basculer sur la source pour copier le contenu du fichier"
@@ -45058,7 +45270,7 @@ msgstr "protégée"
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr "Jetez un œil à la documentation pour découvrir toutes les fonctionnalités de GitLab."
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr "Déclencher TeamCity CI après la création ou la mise à jour d'une req
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr "Déclencher TeamCity CI après chaque poussée vers le dépôt, sauf suppression de branche"
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr "Laissez vide pour utiliser votre jeton actuel."
+
+msgid "TelegramIntegration|New token"
+msgstr "Nouveau jeton"
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr "Envoyez des notifications sur les événements du projet sur Telegram."
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr "Envoyez des notifications sur les événements du projet sur Telegram. %{docs_link}"
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr "Jeton d'authentification unique."
+
msgid "Telephone number"
msgstr "Numéro de téléphone"
@@ -45316,9 +45543,6 @@ msgstr "Modifications de ressources signalées°: %{addNum} à ajouter, %{change
msgid "Terraform|Terraform init command"
msgstr "Commande Terraform init"
-msgid "Terraform|Terraform reports"
-msgstr "Rapports Terraform"
-
msgid "Terraform|Terraform states"
msgstr "Statuts Terraform"
@@ -45571,9 +45795,6 @@ msgstr "Le gestionnaire de ticket de suivi est un endroit où l'on peut ouvrir u
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr "Le système de suivi est un endroit où l'on peut ouvrir un ticket pour signaler des choses à améliorer ou des dysfonctionnements à résoudre dans un projet. Vous pouvez vous inscrire ou vous connecter pour créer des tickets de suivi pour ce projet."
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr "Réponse du serveur Prometheus : « mauvaise requête ». Veuillez vérifier que vos requêtes sont correctes et qu'elles sont prises en charge par votre version de Prometheus. %{documentationLink}"
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr "L'intégration des notifications Slack est obsolète et sera supprimée dans une prochaine version de release. Pour continuer à recevoir des notifications de Slack, utilisez l'application GitLab pour Slack à la place. %{learn_more_link_start}En savoir plus%{link_end}."
@@ -45652,15 +45873,15 @@ msgstr "Le ticket actuel"
msgid "The current user is not authorized to access the job log."
msgstr "L'utilisateur actuel n'est pas autorisé à accéder au journal des jobs."
+msgid "The current user is not authorized to create the pipeline schedule"
+msgstr "L'utilisateur actuel n'est pas autorisé à créer la planification de pipeline"
+
msgid "The current user is not authorized to update the pipeline schedule"
msgstr "L'utilisateur actuel n'est pas autorisé à mettre à jour planification de pipeline"
msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr "Les données de ce pipeline sont trop anciennes pour être rendues sous forme de graphique. Veuillez vérifier l'onglet Tâches pour accéder à l'historique des données."
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
-msgstr "La source de données est connectée, mais il n'y a aucune donnée à afficher. %{documentationLink}"
-
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
msgstr "La date à laquelle la release est prête. Une release dont la date est dans le futur porte le label %{linkStart}Version de release à venir%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr "La licence que vous avez téléversée n'est pas valide. Si le problème
msgid "The list creation wizard is already open"
msgstr "L'assistant de création de liste est déjà ouvert"
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr "La carte ne peut pas être affichée, car une erreur s'est produite lors du chargement du fichier GeoJSON."
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr "La durée maximale dont les utilisateurs disposent pour configurer l'authentification à deux facteurs avant qu'elle ne soit imposée."
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr "La taille de fichier maximale autorisée est de %{size}."
@@ -45872,9 +46099,6 @@ msgstr "La taille de fichier maximale est de %{size}."
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr "Le nombre maximal d'étiquettes qu'un worker unique accepte de nettoyer. Si le nombre d'étiquettes vient à dépasser cette limite, la liste des étiquettes à supprimer est tronquée à cette valeur. Pour enlever cette limite, définissez-la à 0."
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr "Le nombre maximum d'unités de calcul que les tâches d'un espace de noms peuvent utiliser chaque mois sur les exécuteurs partagés. 0 pour illimité."
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr "Les conflits de fusion pour cette demande de fusion ne peuvent pas être résolus via GitLab. Veuillez essayer de les résoudre localement."
@@ -46001,6 +46225,9 @@ msgstr "L'image sélectionnée est trop volumineuse."
msgid "The snippet can be accessed without any authentication."
msgstr "L'extrait de code peut être consulté sans aucune authentification."
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr "L'extrait de code est visible seulement par moi."
@@ -46229,6 +46456,9 @@ msgstr "Une erreur s'est produite lors de la récupération des émojis."
msgid "There was a problem fetching epics."
msgstr "Une erreur s'est produite lors de la récupération des épopées."
+msgid "There was a problem fetching failed jobs"
+msgstr "Une erreur s'est produite lors de la récupération des jobs échoués"
+
msgid "There was a problem fetching groups."
msgstr "Une erreur s'est produite lors de la récupération des groupes."
@@ -46439,6 +46669,9 @@ msgstr "Une erreur s'est produite lors de la récupération des données de l'an
msgid "There was an error while fetching value stream analytics duration data."
msgstr "Une erreur s'est produite lors de la récupération des données de durée de l'analyse des chaînes de valeur."
+msgid "There was an error while retrying this job"
+msgstr "Une erreur s'est produite lors du nouveau lancement de ce job"
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr "Une erreur s'est produite avec le reCAPTCHA. Veuillez le résoudre à nouveau."
@@ -46479,7 +46712,7 @@ msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_cl
msgstr "Cet élément %{issuable} est verrouillé. Seuls les %{strong_open}membres du projet%{strong_close} peuvent apporter des commentaires."
msgid "This %{issuable} is locked. Only project members can comment."
-msgstr ""
+msgstr "Cet élément (%{issuable}) est verrouillé. Seuls les membres du projet peuvent commenter."
msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr "Ce %{noteableTypeText} est %{confidentialLinkStart}confidentiel%{confidentialLinkEnd} et %{lockedLinkStart}verrouillé%{lockedLinkEnd}."
@@ -46575,11 +46808,14 @@ msgid "This comment changed after you started editing it. Review the %{startTag}
msgstr "Ce commentaire a changé depuis que vous avez commencé à le modifier. Examinez sa %{startTag}version actualisée%{endTag} pour vous assurer qu'il n'y a pas de perte d'information."
msgid "This comment was generated by AI"
-msgstr "Ce commentaire a été généré par une IA"
+msgstr "Ce commentaire a été généré par l'IA"
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 "Ce commit fait partie de la demande de fusion %{link_to_merge_request}. Les commentaires créés ici seront créés dans le contexte de cette demande de fusion."
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr "Cette validation a été signée avec une signature %{strong_open}vérifiée%{strong_close} et le courriel du contributeur a bien été vérifié comme correspondant au même utilisateur."
@@ -46689,7 +46925,7 @@ msgid "This feature requires local storage to be enabled"
msgstr "Cette fonctionnalité nécessite que le stockage local soit activé"
msgid "This field is auto-calculated based on the Progress score of its direct children. You can overwrite this value but it will be replaced by the auto-calculation anytime the Progress score of its direct children is updated."
-msgstr "Ce champ est calculé automatiquement en fonction de la note de progression de ses enfants directs. Vous pouvez écraser cette valeur, mais elle sera remplacée à tout moment par le calcul automatique à chaque fois que la note de progression de ses enfants directs est actualisée."
+msgstr "Ce champ est calculé automatiquement en fonction du score de progression de ses enfants directs. Vous pouvez écraser cette valeur, mais elle sera remplacée à tout moment par le calcul automatique à chaque fois que le score de progression de ses enfants directs est actualisée."
msgid "This field is required"
msgstr "Ce champ est requis"
@@ -46746,7 +46982,7 @@ msgid "This incident is already escalated with '%{escalation_policy_name}'."
msgstr "Cet incident est déjà escaladé avec « %{escalation_policy_name} »."
msgid "This instance is now read-only. Don't worry, your data is safe. To change to GitLab Free and restore write access to this instance, delete your expired license."
-msgstr "Cette instance est maintenant en lecture seule. Ne vous inquiétez pas, vos données sont en sécurité. Pour passer à GitLab Gratuit et rétablir l'accès en écriture sur cette instance, supprimez votre licence qui a expiré."
+msgstr "Cette instance est maintenant en lecture seule. Ne vous inquiétez pas, vos données sont en sécurité. Pour passer au forfait gratuit GitLab et rétablir l'accès en écriture à cette instance, supprimez votre licence qui a expiré."
msgid "This invitation was sent to %{mail_to_invite_email}, but you are signed in as %{link_to_current_user} with email %{mail_to_current_user}."
msgstr "Cette invitation a été envoyée à %{mail_to_invite_email}, mais vous êtes connecté en tant que %{link_to_current_user} avec l'adresse de courriel %{mail_to_current_user}."
@@ -46812,7 +47048,7 @@ msgid "This issue is in a child epic of the filtered epic"
msgstr "Ce ticket est une épopée enfant de l'épopée filtrée"
msgid "This issue is locked. Only project members can comment."
-msgstr ""
+msgstr "Ce ticket est verrouillé. Seuls les membres du projet peuvent commenter."
msgid "This job could not start because it could not retrieve the needed artifacts%{punctuation}%{invalid_dependencies}"
msgstr "Ce job n'a pas pu démarrer car il n'a pas pu récupérer les artefacts%{punctuation}%{invalid_dependencies} requis"
@@ -46961,9 +47197,6 @@ msgstr "Cette page est hébergée sur GitLab Pages, mais contient du contenu crÃ
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."
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr "Ce pipeline utilise une configuration CI/CD prédéfinie activée par %{b_open}Auto DevOps.%{b_close}"
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr "Ce pipeline fait usage d'une configuration CI/CD prédéfinie activée par %{strongStart}Auto DevOps.%{strongEnd}"
@@ -47106,10 +47339,10 @@ msgid "This user is the author of this %{noteable}."
msgstr "Cet utilisateur est l'auteur de l'élément suivant : %{noteable}."
msgid "This user is the author of this %{workItemType}."
-msgstr ""
+msgstr "Cet utilisateur est l'auteur de l'élément suivant : %{workItemType}."
msgid "This variable value does not meet the masking requirements."
-msgstr ""
+msgstr "Cette valeur variable ne répond pas aux exigences de masquage."
msgid "This vulnerability was automatically resolved because its vulnerability type was disabled in this project or removed from GitLab's default ruleset."
msgstr "Cette vulnérabilité a été automatiquement résolue, car son type de vulnérabilité a été désactivé dans ce projet ou supprimé du jeu de règles par défaut de GitLab."
@@ -47135,9 +47368,6 @@ msgstr "Seuil en octets à partir duquel compresser les arguments des tâches Si
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 "Seuil en octets à partir duquel rejeter les tâches Sidekiq. Définissez-le sur 0 si vous ne souhaitez pas de limite sur les tâches 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 "Seuil du nombre de modifications (branches ou étiquettes) au sein d'une poussée unique pour lequel un événement de poussée en masse est créé (3 par défaut)."
-
msgid "Throughput"
msgstr "Débit"
@@ -47417,6 +47647,9 @@ msgstr "à l'instant"
msgid "Timeago|right now"
msgstr "immédiatement"
+msgid "Timeline"
+msgstr "Chronologie"
+
msgid "Timeline event added successfully."
msgstr "Événement de chronologie ajouté avec succès."
@@ -47502,14 +47735,11 @@ msgstr "Titre :"
msgid "Titles"
msgstr "Titres"
-msgid "Titles and Descriptions"
-msgstr "Titres et descriptions"
-
msgid "To"
msgstr "Au"
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
-msgstr "Pour %{link_to_help} de votre domaine, ajoutez la clé ci-dessus à un enregistrement TXT dans votre configuration DNS."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
+msgstr "Pour %{link_to_help} de votre domaine, ajoutez la clé ci-dessus à un enregistrement TXT dans votre configuration DNS sous sept jours."
msgid "To Do"
msgstr "À traiter"
@@ -47577,6 +47807,9 @@ msgstr "Pour s'assurer que %{project_link} n'est pas planifié pour suppression,
msgid "To ensure %{project_name} is unscheduled for deletion, check that activity has been logged by GitLab. For example:"
msgstr "Pour s'assurer que %{project_name} n'est pas planifié pour suppression, vérifiez que l'activité a été enregistrée par GitLab. Par exemple :"
+msgid "To ensure no loss of access to personal content, only use this account for matters related to %{group_name}."
+msgstr "Pour éviter toute perte d'accès au contenu personnel, n'utilisez ce compte qu'en rapport avec %{group_name}."
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr "Pour éviter toute perte de contenu personnel, ce compte ne doit être utilisé qu'en rapport avec %{group_name}."
@@ -47604,16 +47837,13 @@ msgstr "Pour commencer, utilisez le lien ci-dessous pour confirmer votre compte.
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr "Pour aller sur GitLab Pages, dans la barre latérale gauche, sélectionnez %{pages_link}."
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr "Pour contribuer à améliorer GitLab, nous souhaiterions périodiquement %{docs_link}. Cela peut être modifié à tout moment dans %{settings_link}."
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr "Pour importer un dépôt SVN, consultez %{svn_link}."
msgid "To invite more users, you can reduce the number of users in your top-level group to %{free_limit} user or less. You can also upgrade to a paid tier which do not have user limits. If you need additional time, you can start a free 30-day trial which includes unlimited users."
msgid_plural "To invite more users, you can reduce the number of users in your top-level group to %{free_limit} users or less. You can also upgrade to a paid tier which do not have user limits. If you need additional time, you can start a free 30-day trial which includes unlimited users."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Pour inviter plus d'utilisateurs, vous pouvez réduire le nombre d'utilisateurs dans votre groupe principal à %{free_limit} ou moins. Vous pouvez également passer à une édition payante, sans limite d'utilisateurs. Si vous avez besoin d'un temps de réflexion, vous pouvez démarrer un essai gratuit de 30 jours qui comprend un nombre illimité d'utilisateurs."
+msgstr[1] "Pour inviter plus d'utilisateurs, vous pouvez réduire le nombre d'utilisateurs dans votre groupe principal à %{free_limit} ou moins. Vous pouvez également passer à une édition payante, sans limite d'utilisateurs. Si vous avez besoin d'un temps de réflexion, vous pouvez démarrer un essai gratuit de 30 jours qui comprend un nombre illimité d'utilisateurs."
msgid "To keep this project going, create a new issue"
msgstr "Pour maintenir ce projet actif, créez un nouveau ticket"
@@ -47655,7 +47885,7 @@ msgid "To remove the %{link_start}read-only%{link_end} state and regain write ac
msgstr "Pour supprimer le statut %{link_start}lecture seule%{link_end} et retrouver l'accès en écriture, demandez au(x) propriétaire(s) de votre groupe de premier niveau de réduire le nombre d'utilisateurs dans celui-ci à %{free_limit} ou moins, ou de passer à une édition payante qui n'a pas de limite d'utilisateurs."
msgid "To remove the %{link_start}read-only%{link_end} state and regain write access, you can reduce the number of users in your top-level group to %{free_limit} users or less. You can also upgrade to a paid tier, which do not have user limits. If you need additional time, you can start a free 30-day trial which includes unlimited users. To minimize the impact to operations, for a limited time, GitLab is offering a %{promotion_link_start}one-time 70 percent discount%{link_end} off the list price at time of purchase for a new, one year subscription of GitLab Premium SaaS to %{offer_availability_link_start}qualifying top-level groups%{link_end}. The offer is valid until %{offer_date}."
-msgstr ""
+msgstr "Pour supprimer le mode de %{link_start}lecture seule%{link_end} et retrouver l'accès en écriture, vous pouvez réduire le nombre d'utilisateurs dans votre groupe principal à %{free_limit} ou moins. Vous pouvez également passer à une édition payante, sans limite d'utilisateurs. Si vous avez besoin d'un temps de réflexion, vous pouvez démarrer un essai gratuit de 30 jours qui comprend un nombre illimité d'utilisateurs. Pour minimiser l'impact sur les opérations, pour une durée limitée, GitLab offre une %{promotion_link_start}réduction unique de 70 %%{link_end} sur le prix catalogue au moment de l'achat d'un nouvel abonnement d'un an à GitLab SaaS Premium aux %{offer_availability_link_start}groupes principaux éligibles%{link_end}. L'offre est valable jusqu'au %{offer_date}."
msgid "To resolve this, try to:"
msgstr "Pour résoudre cela, essayez de :"
@@ -47678,6 +47908,9 @@ msgstr "Pour voir ce qui a été modifié ou pour créer une requête de fusion,
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr "Pour configurer l'authentification SAML pour votre groupe via un fournisseur d'identité tel qu'Azure, Okta, Onelogin, Ping Identity ou votre fournisseur SAML 2.0 personnalisé :"
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr "Pour configurer cette intégration :"
@@ -47687,6 +47920,12 @@ msgstr "Pour spécifier le niveau de notification par projet d'un groupe auquel
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 "Pour commencer à utiliser GitLab Enterprise Edition, téléversez le fichier %{codeOpen}.gitlab-license%{codeClose} ou entrez la clé de licence que vous avez reçue de GitLab Inc."
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr "Pour envoyer vos modifications dans une requête de fusion, créez une nouvelle bifurcation."
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr "Pour envoyer vos modifications dans une requête de fusion, passez à l'une de ces bifurcations ou créez-en une nouvelle."
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr "Pour vous désabonner de ce ticket, veuillez coller le lien suivant dans votre navigateur°:"
@@ -47694,7 +47933,7 @@ msgid "To update Snippets with multiple files, you must use the `files` paramete
msgstr "Pour mettre à jour les extraits de code avec plusieurs fichiers, vous devez utiliser le paramètre «°files°»"
msgid "To use Service Desk in this project, you must %{linkStart}activate the issue tracker%{linkEnd}."
-msgstr "Pour utiliser le service d'assistance sur ce projet, vous devez %{linkStart}activer le gestionnaire de tickets%{linkEnd}."
+msgstr "Pour utiliser Service Desk sur ce projet, vous devez %{linkStart}activer le gestionnaire de tickets%{linkEnd}."
msgid "To use the additional formats, you must start the required %{container_link_start}companion containers%{container_link_end}."
msgstr "Pour utiliser des formats supplémentaires, vous devez démarrer les %{container_link_start}conteneurs complémentaires%{container_link_end} requis."
@@ -47858,9 +48097,6 @@ msgstr "Basculer la barre latérale"
msgid "Toggle backtrace"
msgstr "Basculer la trace d'appels"
-msgid "Toggle collapse"
-msgstr "Basculer le contrôle d’arborescence"
-
msgid "Toggle comments for this file"
msgstr "Afficher/masquer les commentaires pour ce fichier"
@@ -47870,6 +48106,9 @@ msgstr "Afficher ou masquer la description du commit"
msgid "Toggle commit list"
msgstr "Afficher/masquer la liste des validations"
+msgid "Toggle details"
+msgstr "Afficher/masquer les détails"
+
msgid "Toggle emoji award"
msgstr "Basculer la récompense émoji"
@@ -47918,12 +48157,6 @@ msgstr "Jeton valide jusqu'à sa révocation"
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr "Ce jeton d'accès personnel a été automatiquement révoqué lorsqu'il a été détecté. Envisagez de faire des recherches et d'effectuer un changement avant de marquer cette vulnérabilité comme résolue."
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr "Les portées définissent les niveaux de permissions accordés au jeton."
-
-msgid "Tokens|Select scopes"
-msgstr "Sélectionner les portées"
-
msgid "Tomorrow"
msgstr "Demain"
@@ -47998,6 +48231,9 @@ msgstr "Sujets"
msgid "Topics could not be merged!"
msgstr "Les sujets n'ont pas pu être fusionnés !"
+msgid "Topics|Subscribe to the new projects feed"
+msgstr "S'abonner au flux des nouveaux projets"
+
msgid "Total"
msgstr "Total"
@@ -48292,7 +48528,7 @@ msgid "Two-factor authentication disabled"
msgstr "Authentification à deux facteurs désactivée"
msgid "Two-factor authentication for admin mode"
-msgstr "Authentification à deux facteurs pour le mode admin"
+msgstr "Authentification à deux facteurs pour le mode administrateur"
msgid "Two-factor authentication grace period"
msgstr "Délai de grâce pour l'authentification à deux facteurs"
@@ -48327,12 +48563,6 @@ msgstr "Taper pour rechercher"
msgid "URL"
msgstr "URL"
-msgid "URL cannot be blank"
-msgstr "L'URL ne peut pas être vide"
-
-msgid "URL is invalid"
-msgstr "L'URL n'est pas valide"
-
msgid "URL is required"
msgstr "Une URL est requise"
@@ -48390,9 +48620,6 @@ msgstr "Impossible de collecter les informations sur le CPU"
msgid "Unable to collect memory info"
msgstr "Impossible de collecter les informations sur la mémoire"
-msgid "Unable to connect to Prometheus server"
-msgstr "Connexion au serveur Prometheus impossible"
-
msgid "Unable to connect to server: %{error}"
msgstr "Impossible de se connecter au serveur : %{error}"
@@ -48529,7 +48756,7 @@ msgid "Unauthenticated web rate limit period in seconds"
msgstr "Durée de la limitation de fréquence des requêtes Web non authentifiées en secondes"
msgid "Unauthorized to access the cluster agent in this project"
-msgstr "Non autorisé à accéder à l'agent de la grappe de serveurs dans ce projet"
+msgstr "Non autorisé à accéder à l'agent du cluster dans ce projet"
msgid "Unauthorized to create an environment"
msgstr "Non autorisé à créer un environnement"
@@ -48562,7 +48789,7 @@ msgid "Unexpected error"
msgstr "Erreur inattendue"
msgid "Unexpected error: Cannot serialize resource"
-msgstr ""
+msgstr "Erreur inattendue : impossible de sérialiser la ressource"
msgid "Unexpected scope"
msgstr "Portée inattendue"
@@ -48576,9 +48803,6 @@ msgstr "Malheureusement, votre courriel à GitLab n'a pas pu être traité."
msgid "Unhappy?"
msgstr "Non satisfait ?"
-msgid "Units of compute"
-msgstr "Unités de calcul"
-
msgid "Units|d"
msgstr "j"
@@ -48630,8 +48854,8 @@ msgstr "Dissocier"
msgid "Unlock"
msgstr "Déverrouiller"
-msgid "Unlock %{issuableType}"
-msgstr "Déverrouiller %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
+msgstr "Déverrouiller %{issuableDisplayName}"
msgid "Unlock account"
msgstr "Déverrouiller le compte"
@@ -48651,6 +48875,9 @@ msgstr "Déverrouillé"
msgid "Unlocked the discussion."
msgstr "Discussion déverrouillée."
+msgid "Unlocking %{issuableDisplayName}"
+msgstr "Déverrouillage de %{issuableDisplayName}"
+
msgid "Unlocks the discussion."
msgstr "Déverrouille la discussion."
@@ -48660,9 +48887,6 @@ msgstr "Injoignable"
msgid "Unrecognized approval status."
msgstr "Statut d'approbation non reconnu."
-msgid "Unrecognized cluster type"
-msgstr "Type de cluster non reconnu"
-
msgid "Unresolve"
msgstr "Révoquer la solution"
@@ -48682,7 +48906,7 @@ msgid "Unselect all"
msgstr "Tout déselectionner"
msgid "Unselected"
-msgstr ""
+msgstr "Non sélectionné"
msgid "Unstar"
msgstr "Supprimer des favoris"
@@ -48942,8 +49166,8 @@ msgstr "%{storage_limit_link_start}Une limite de stockage d'espace de nommage%{l
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr "Échantillons sonores, vidéos, jeux de données et graphismes."
-msgid "UsageQuota|Buy additional units of compute"
-msgstr "Acheter des unités de calcul supplémentaires"
+msgid "UsageQuota|Buy additional compute minutes"
+msgstr ""
msgid "UsageQuota|Buy storage"
msgstr "Acheter du stockage"
@@ -48952,16 +49176,16 @@ msgid "UsageQuota|Code packages and container images."
msgstr "Paquets de code et images de conteneur."
msgid "UsageQuota|Compute usage"
-msgstr ""
+msgstr "Unités de calcul utilisées"
msgid "UsageQuota|Compute usage by month"
-msgstr ""
+msgstr "Unités de calcul utilisées par mois"
msgid "UsageQuota|Compute usage by project"
-msgstr ""
+msgstr "Unités de calcul utilisées par projet"
msgid "UsageQuota|Compute usage since %{usageSince}"
-msgstr ""
+msgstr "Unités de calcul utilisées depuis le %{usageSince}"
msgid "UsageQuota|Container Registry"
msgstr "Registre de conteneur"
@@ -48990,6 +49214,9 @@ msgstr "Registre de conteneurs Docker intégré à GitLab pour le stockage d'ima
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr "Paramètres de groupe &gt; Quotas d'utilisation"
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr "Inclus dans l'abonnement %{planName}"
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr "Comprend les artefacts, les dépôts, les pages wiki et d'autres éléments."
@@ -49012,13 +49239,13 @@ msgid "UsageQuota|Month"
msgstr "Mois"
msgid "UsageQuota|Namespace overview"
-msgstr "Vue d'ensemble de l'espace de noms"
+msgstr "Vue d'ensemble de l'espace de nommage"
msgid "UsageQuota|Namespace storage used"
msgstr "Stockage utilisé par les espaces de nommage"
msgid "UsageQuota|No compute usage data available."
-msgstr ""
+msgstr "Aucune donnée disponible sur les unités de calcul utilisées."
msgid "UsageQuota|No projects to display."
msgstr "Aucun projet à afficher."
@@ -49029,17 +49256,11 @@ msgstr "Membres en attente"
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr "Artefacts de pipeline et de tâches créés par CI/CD."
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr "Artefacts de jobs créés par CI/CD."
-
msgid "UsageQuota|Pipelines"
msgstr "Pipelines"
-msgid "UsageQuota|Purchased storage"
-msgstr "Stockage acheté"
-
-msgid "UsageQuota|Purchased storage used"
-msgstr "Stockage acheté utilisé"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
+msgstr ""
msgid "UsageQuota|Recalculate repository usage"
msgstr "Recalculer l'utilisation du dépôt"
@@ -49098,9 +49319,15 @@ msgstr "Le tableau ci-dessous montre l'utilisation depuis : %{usageSince}"
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr "Aucun projet de cet espace de nommage n'a utilisé de runners partagés sur la période actuelle"
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
msgstr ""
+msgid "UsageQuota|Total purchased storage"
+msgstr "Total du stockage acheté"
+
+msgid "UsageQuota|Total storage"
+msgstr "Total du stockage"
+
msgid "UsageQuota|Transfer"
msgstr "Transfert"
@@ -49380,7 +49607,7 @@ msgid "User Settings"
msgstr "Paramètres de l'utilisateur"
msgid "User Status"
-msgstr "État de l'utilisateur"
+msgstr "Statut de l'utilisateur"
msgid "User and IP rate limits"
msgstr "Limitations de fréquence des IP et Utilisateurs"
@@ -49403,8 +49630,11 @@ msgstr "L'utilisateur n'a pas de requête en attente"
msgid "User does not have permission to create a Security Policy project."
msgstr "L'utilisateur n'a pas l'autorisation de créer un projet de stratégie de sécurité."
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr "L'utilisateur n'existe pas ou vous n'avez pas la permission de modifier les adresses de courriel de validation de l'espace de nommage."
+
msgid "User has already been deactivated"
-msgstr "L’utilisateur a déjà été désactivé"
+msgstr "L'utilisateur a déjà été désactivé"
msgid "User identity was successfully created."
msgstr "L'identité de l'utilisateur a été créée avec succès."
@@ -49545,19 +49775,25 @@ msgid "UserList|created %{timeago}"
msgstr "créée %{timeago}"
msgid "UserProfiles|No snippets found."
-msgstr "Aucun extrait trouvé."
+msgstr "Aucun extrait de code trouvé."
msgid "UserProfile|%{count} %{file}"
-msgstr "%{count} %{file}"
+msgstr "%{count} %{file}"
msgid "UserProfile|%{id} · created %{created} by %{author}"
-msgstr "%{id} · créé %{created} par %{author}"
+msgstr "%{id} · créé il y a %{created} par %{author}"
msgid "UserProfile|Activity"
msgstr "Activité"
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr "Une erreur s'est produite lors du chargement de l'activité. Veuillez actualiser la page pour réessayer."
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
-msgstr "Une erreur s'est produite lors du chargement des suiveurs. Veuillez actualiser la page pour réessayer."
+msgstr "Une erreur s'est produite lors du chargement des abonnés. Veuillez actualiser la page pour réessayer."
+
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr "Une erreur s'est produite lors du chargement du suivi. Veuillez actualiser la page pour réessayer."
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr "Une erreur s'est produite lors du chargement des projets personnels. Veuillez actualiser la page pour réessayer."
@@ -49577,6 +49813,9 @@ msgstr "A contribué aux projets"
msgid "UserProfile|Copy user ID"
msgstr "Copier l'ID utilisateur"
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr "Modifier le profil"
@@ -49658,6 +49897,9 @@ msgstr "Cet utilisateur ne suit pas d'autres utilisateurs."
msgid "UserProfile|Unconfirmed user"
msgstr "Utilisateur non confirmé"
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr "ID utilisateur : %{id}"
@@ -49695,7 +49937,7 @@ msgid "UserProfile|made a private contribution"
msgstr "a fait une contribution privée"
msgid "UserProfile|updated %{updated}"
-msgstr "mis à jour %{updated}"
+msgstr "mis à jour il y a %{updated}"
msgid "Username"
msgstr "Nom d'utilisateur"
@@ -49854,7 +50096,7 @@ msgid "Value might contain a variable reference"
msgstr "La valeur peut contenir une référence de variable"
msgid "Value must meet regular expression requirements to be masked."
-msgstr ""
+msgstr "La valeur doit répondre aux exigences de l'expression rationnelle pour être masquée."
msgid "Value stream"
msgstr "Chaînes de valeur"
@@ -49907,8 +50149,8 @@ msgstr "Accéder aux documents"
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr "Vulnérabilités élevées au cours du temps."
-msgid "ValueStreamAnalytics|Key metrics"
-msgstr "Métriques clés"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
+msgstr "Métriques du cycle de vie"
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
msgstr "Temps médian pendant lequel un incident est resté ouvert dans un environnement de production sur la période temps donnée."
@@ -49923,7 +50165,7 @@ msgid "ValueStreamAnalytics|Median time from the earliest commit of a linked iss
msgstr "Durée médiane de la validation la plus ancienne sur une requête de fusion d'un ticket associé jusqu'à la fermeture de ce ticket."
msgid "ValueStreamAnalytics|Merge request analytics"
-msgstr "Analytique de demandes de fusion"
+msgstr "Analyse des requêtes de fusion"
msgid "ValueStreamAnalytics|New Value Stream"
msgstr "Nouvelle chaîne de valeur"
@@ -49932,7 +50174,7 @@ msgid "ValueStreamAnalytics|Number of commits pushed to the default branch"
msgstr "Nombre de commits poussés vers la branche par défaut"
msgid "ValueStreamAnalytics|Number of issues closed by month."
-msgstr ""
+msgstr "Nombre de tickets fermés par mois."
msgid "ValueStreamAnalytics|Number of new issues created."
msgstr "Nombre de nouveaux tickets créés."
@@ -49956,7 +50198,7 @@ msgid "ValueStreamAnalytics|Tasks by type"
msgstr "Tâches par type"
msgid "ValueStreamAnalytics|The number of merge requests merged by month."
-msgstr ""
+msgstr "Le nombre de requêtes de fusion fusionnées par mois."
msgid "ValueStreamAnalytics|The time it takes an organization to recover from a failure in production."
msgstr "Le temps qu'il faut à une organisation pour rétablir la production après une panne."
@@ -49995,7 +50237,7 @@ msgid "Variable"
msgstr "Variable"
msgid "Variable name '%{variable}' must not start with '%{prefix}'"
-msgstr "Le nom de variable « %{variable} » ne doit pas commencer par « %{prefix} »"
+msgstr "Le nom de variable « %{variable} » ne doit pas commencer par « %{prefix} »"
msgid "Variable value will be evaluated as raw string."
msgstr "La valeur de la variable sera évaluée comme une chaîne brute."
@@ -50033,7 +50275,7 @@ msgstr "D'ici-là, les runners partagés ne seront pas disponibles. %{validateLi
msgid "VerificationReminder|Your account has been validated"
msgstr "Votre compte a été validé"
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr "Vérifier la configuration SAML"
msgid "Verify code"
msgstr "Vérifier le code"
-msgid "Verify configuration"
-msgstr "Vérifier la configuration"
-
msgid "Version"
msgstr "Version"
@@ -50132,11 +50371,6 @@ msgstr "Voir le blame antérieur à cette modification"
msgid "View card matches"
msgstr "Afficher les correspondances de carte"
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] "Voir le graphique"
-msgstr[1] "Voir les graphiques"
-
msgid "View dependency details for your project"
msgstr "Voir les détails de dépendance pour votre projet"
@@ -50163,9 +50397,6 @@ msgstr "Voir le fichier @ "
msgid "View file @ %{commitSha}"
msgstr "Voir le fichier @ %{commitSha}"
-msgid "View full dashboard"
-msgstr "Voir le tableau de bord complet"
-
msgid "View group in admin area"
msgstr "Voir le groupe dans l'espace d'administration"
@@ -50220,9 +50451,6 @@ msgstr "Afficher la demande de fusion ouverte"
msgid "View page @ "
msgstr "Voir la page @ "
-msgid "View performance dashboard."
-msgstr "Voir le tableau de bord des performances."
-
msgid "View project in admin area"
msgstr "Voir le projet dans l'espace d'administration"
@@ -50240,6 +50468,9 @@ msgstr "Voir le fichier remplacé @ "
msgid "View seat usage"
msgstr "Voir l'utilisation des sièges"
+msgid "View summary notes"
+msgstr "Voir les notes de synthèse"
+
msgid "View supported languages and frameworks"
msgstr "Voir les cadres et langages pris en charge"
@@ -50252,9 +50483,6 @@ msgstr "Afficher la documentation"
msgid "View the latest successful deployment to this environment"
msgstr "Voir le dernier déploiement réussi dans cet environnement"
-msgid "View the performance dashboard at"
-msgstr "Voir le tableau de bord des performances sur"
-
msgid "View usage details"
msgstr "Afficher les détails d'utilisation"
@@ -50268,7 +50496,7 @@ msgid "Viewing commit"
msgstr "Affichage du commit"
msgid "Viewing projects data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
-msgstr ""
+msgstr "L'affichage des données des projets depuis un site principal n'est pas possible quand une URL unifiée est utilisée. Consultez le site secondaire directement. %{geo_help_url}"
msgid "Violation"
msgstr "Violation"
@@ -50609,6 +50837,9 @@ msgstr "Revue de Code"
msgid "Vulnerability|Comments"
msgstr "Commentaires"
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr "Adresse du plantage"
@@ -50663,6 +50894,9 @@ msgstr "Fichier :"
msgid "Vulnerability|GitLab Security Report"
msgstr "Rapport de Sécurité de GitLab"
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr "Identifiant"
@@ -50738,6 +50972,9 @@ msgstr "Gravité"
msgid "Vulnerability|Severity:"
msgstr "Gravité :"
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr "État"
@@ -50795,9 +51032,6 @@ msgstr "En attente d'approbation"
msgid "Waiting for merge (open and assigned)"
msgstr "En attente de fusion (ouvertes et assignées)"
-msgid "Waiting for performance data"
-msgstr "En attente des données de performance"
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr "Vous voulez voir les données ? Merci de contacter un administrateur pour en obtenir l'accès."
@@ -50837,9 +51071,6 @@ msgstr "Nous n'avons pas trouvé de %{scope} correspondant à %{term} dans le gr
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr "Nous n'avons pas trouvé de %{scope} correspondant à %{term} dans le projet %{project}"
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr "Le serveur Prometheus n'a pas pu être atteint. Il est possible que serveur n'existe plus, ou que les détails de la configuration doivent être mis à jour."
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr "Nous avons détecté un spam potentiel dans %{humanized_resource_name}. Veuillez résoudre le reCAPTCHA pour continuer."
@@ -50858,9 +51089,6 @@ msgstr "Nous vous invitons à %{featureLinkStart}faire une requête de fonctionn
msgid "We recommend a work email address."
msgstr "Nous recommandons une adresse de courriel professionnelle."
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr "Nous vous recommandons de laisser tous les analyseurs SAST activés"
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr "Nous vous recommandons d'acheter des minutes de pipeline supplémentaires pour éviter une interruption de service."
@@ -51240,7 +51468,7 @@ msgid "What is Markdown?"
msgstr "Qu'est-ce que Markdown ?"
msgid "What is a compute quota?"
-msgstr "Qu'est-ce qu'un quota de calcul ?"
+msgstr "Qu'est-ce qu'un quota de calcul ?"
msgid "What is listed here?"
msgstr "Qu'est-ce qui est listé ici ?"
@@ -51248,6 +51476,9 @@ msgstr "Qu'est-ce qui est listé ici ?"
msgid "What is repository mirroring?"
msgstr "Qu'est-ce que la mise en miroir de dépôt ?"
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr "Que signifie «°squasher°»°?"
@@ -51552,7 +51783,7 @@ msgid "Will deploy to"
msgstr "Sera déployé sur"
msgid "Wireframe"
-msgstr "Fil de fer"
+msgstr "Maquette"
msgid "With requirements, you can set criteria to check your products against."
msgstr "Avec les exigences, vous pouvez définir des critères avec lesquels comparer vos produits."
@@ -51563,6 +51794,9 @@ msgstr "Retirer la demande d'accès"
msgid "Won't fix / Accept risk"
msgstr "Une correction ne sera pas apportée / risque accepté"
+msgid "Work Item promoted successfully."
+msgstr "Élément de travail promu avec succès."
+
msgid "Work Item type with id %{id} was not found"
msgstr "Le type d'élément de travail avec l'ID %{id} n'a pas été trouvé"
@@ -51641,7 +51875,7 @@ msgid "WorkItem|Child objectives and key results"
msgstr "Objectifs et résultats clés de l'enfant"
msgid "WorkItem|Child removal reverted"
-msgstr "La suppression de l’enfant a été annulée"
+msgstr "La suppression de l'enfant a été défaite"
msgid "WorkItem|Child removed"
msgstr "Enfant supprimé"
@@ -51658,6 +51892,9 @@ msgstr "Convertir en tâche"
msgid "WorkItem|Converted to task"
msgstr "Converti en tâche"
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr "Copier l'adresse de courriel %{workItemType}"
+
msgid "WorkItem|Create %{workItemType}"
msgstr "Créer %{workItemType}"
@@ -51682,9 +51919,6 @@ msgstr "Date d'échéance"
msgid "WorkItem|Existing task"
msgstr "Tâche existante"
-msgid "WorkItem|Failed to award emoji"
-msgstr "Échec de l'attribution de l'émoji"
-
msgid "WorkItem|Health status"
msgstr "État de santé"
@@ -51799,6 +52033,12 @@ msgstr "Une erreur s'est produite lors de la tentative d'ajout d'un enfant. Veui
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr "Une erreur s'est produite lors de la tentative de création d'un enfant. Veuillez réessayer."
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr "Une erreur s'est produite lors de la copie de l'adresse de courriel %{workItemType}. Veuillez réessayer."
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr "Une erreur s'est produite lors de la copie de la référence %{workItemType}. Veuillez réessayer."
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr "Une erreur s'est produite lors de la récupération des jalons. Veuillez réessayer."
@@ -51877,6 +52117,9 @@ msgstr "Un espace de travail est un environnement de bac à sable virtuel dans G
msgid "Workspaces|Cancel"
msgstr "Annuler"
+msgid "Workspaces|Could not load workspaces"
+msgstr "Impossible de charger les espaces de travail"
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr "Impossible de récupérer les agents de cluster pour ce projet"
@@ -51973,6 +52216,9 @@ msgstr "Vous ne pouvez créer un espace de travail que pour les projets publics.
msgid "Workspaces|You can't create a workspace for this project"
msgstr "Vous ne pouvez pas créer d'espace de travail pour ce projet"
+msgid "Workspaces|Your workspaces"
+msgstr "Vos espaces de travail"
+
msgid "Would you like to create a new branch?"
msgstr "Voulez-vous créer une nouvelle branche°?"
@@ -52083,9 +52329,6 @@ msgstr "Vous êtes redirigé en dehors de GitLab"
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr "Vous serez facturé si ce nombre est dépassé. %{qsrOverageLinkStart}Comment fonctionne la facturation ?%{qsrOverageLinkEnd}"
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr "Vous êtes connecté au serveur Prometheus, mais il n'y a actuellement aucune donnée à afficher."
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr "Vous êtes actuellement hors ligne, ou l'instance GitLab n'est pas accessible."
@@ -52374,6 +52617,9 @@ msgstr "Vous ne pouvez pas écrire sur une instance GitLab Geo secondaire en le
msgid "You cannot write to this read-only GitLab instance."
msgstr "Vous ne pouvez pas écrire sur cette instance GitLab en lecture seule."
+msgid "You can’t edit files directly in this project."
+msgstr "Vous ne pouvez pas modifier les fichiers directement dans ce projet."
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr "Vous ne pouvez pas modifier directement des fichiers dans ce projet. Créez une bifurcation, puis proposez une requête de fusion avec vos modifications."
@@ -52769,7 +53015,7 @@ msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change
msgstr "Votre %{spammable_entity_type} a été reconnu comme un spam. Veuillez modifier le contenu ou résoudre le reCAPTCHA pour continuer."
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content to proceed."
-msgstr ""
+msgstr "Votre %{spammable_entity_type} s'apparente à un spam. Veuillez modifier le contenu pour continuer."
msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr "Votre abonnement %{strong}%{plan_name}%{strong_close} pour %{strong}%{namespace_name}%{strong_close} expirera le %{strong}%{expires_on}%{strong_close}."
@@ -52813,6 +53059,12 @@ msgstr "Votre essai gratuit de GitLab Ultimate dure 30 jours. Après cette péri
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 "Votre compte GitLab a été verrouillé en raison d'un nombre excessif de tentatives de connexion infructueuses. Vous pouvez attendre que votre compte soit déverrouillé automatiquement dans %{duration} ou vous pouvez cliquer sur le lien ci-dessous pour le déverrouiller maintenant."
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr "Votre compte GitLab est désormais un(e) %{source_link} :"
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr "Votre compte GitLab est désormais un utilisateur Enterprise (%{source_link}) :"
+
msgid "Your GitLab account request has been approved!"
msgstr "Votre demande de compte GitLab a été approuvée."
@@ -52864,6 +53116,12 @@ msgstr "Votre appareil WebAuthn a été enregistré."
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr "Votre demande d'accès au %{source_type} a été retirée."
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr "Votre compte a été bloqué. Contactez %{support} pour obtenir de l'aide."
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr "Votre compte a été bloqué. Contactez votre administrateur GitLab pour obtenir de l'aide."
+
msgid "Your account has been deactivated"
msgstr "Votre compte a été désactivé"
@@ -52919,13 +53177,13 @@ msgid "Your changes have been successfully committed."
msgstr "Vos modifications ont été validées avec succès."
msgid "Your comment could not be submitted because %{reason}."
-msgstr ""
+msgstr "Votre commentaire n'a pas pu être envoyé, car %{reason}."
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr "Votre commentaire n'a pas pu être soumis ! Veuillez vérifier votre connexion réseau et réessayer."
-msgid "Your comment could not be updated! Please check your network connection and try again."
-msgstr "Votre commentaire n'a pas pu être mis à jour ! Veuillez vérifier votre connexion réseau et réessayer."
+msgid "Your comment could not be updated because %{reason}."
+msgstr "Votre commentaire n'a pas pu être mis à jour, car %{reason}."
msgid "Your comment will be discarded."
msgstr "Votre commentaire sera abandonné."
@@ -53084,12 +53342,15 @@ msgstr "Votre groupe de premier niveau %{namespace_name} dépasse la limite du n
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr "Votre groupe de premier niveau %{namespace_name} va bientôt passer en lecture seule"
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
-msgstr "Votre groupe de premier niveau dépasse les limites de nombre d'utilisateurs et de stockage. Il a été placé en lecture seule."
-
msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr "Votre groupe de premier niveau dépasse la limite de nombre d'utilisateurs et a été placé en lecture seule."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr "Votre groupe principal, %{group_name}, compte plus de %{free_users_limit} utilisateurs et utilise plus de %{free_storage_limit} de données. Une fois les limites d'utilisation appliquées au groupe principal du forfait Gratuit, les projets de ce groupe fonctionneront %{read_only_link_start}en lecture seule%{link_end}. Pour éviter que votre groupe ne passe en lecture seule, vous devez contacter un utilisateur ayant le rôle de Propriétaire pour ce groupe afin de passer à une édition payante ou de gérer votre utilisation. Pour plus d'informations sur les limites d'utilisation à venir, consultez notre %{faq_link_start}FAQ%{link_end}"
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr "Votre groupe pricnipal, %{group_name}, compte plus de %{free_users_limit} utilisateurs et utilise plus de %{free_storage_limit} de données. Une fois les limites d'utilisation appliquées au groupe principal du forfait Gratuit, les projets de ce groupe seront %{read_only_link_start}en lecture seule%{link_end}. Pour obtenir plus de sièges et d'espace de stockage, passez à une édition payante. Vous pouvez également gérer votre utilisation. Pour plus d'informations sur les limites d'utilisation à venir, consultez notre %{faq_link_start}FAQ%{link_end}"
+
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
msgstr "Votre mise à jour a échoué. Vous ne pouvez téléverser qu'un seul design lorsque vous le déposez sur un design existant."
@@ -53381,8 +53642,8 @@ msgstr "ne peut pas être modifié si les runners partagés sont activés"
msgid "cannot be changed since member is associated with a custom role"
msgstr "ne peut pas être modifié, car le membre est associé à un rôle personnalisé"
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
-msgstr "ne peut pas être modifié en %{new_type} lorsque le type de parent est %{parent_type}."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
+msgstr "ne peut pas passer à %{new_type} en cas d'association avec un parent %{parent_type}."
msgid "cannot be changed to %{new_type} with these child item types."
msgstr "ne peut pas être modifié en %{new_type} avec ces types d'éléments enfants."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr "fermé %{timeago}"
msgid "closed issue"
-msgstr "ticket fermé"
-
-msgid "collect usage information"
-msgstr "collecter des informations d'utilisation"
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr "commentaire"
@@ -54041,18 +54301,6 @@ msgstr[1] "fichiers"
msgid "finding is not found or is already attached to a vulnerability"
msgstr "la découverte est introuvable ou est déjà rattachée à une vulnérabilité"
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr "pour %{link_to_merge_request} avec %{link_to_merge_request_source_branch}"
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr "pour %{link_to_merge_request} avec %{link_to_merge_request_source_branch} dans %{link_to_merge_request_target_branch}"
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr "pour %{link_to_pipeline_ref}"
-
-msgid "for %{ref}"
-msgstr "pour %{ref}"
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,8 +54407,8 @@ msgstr "dans"
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr "en %{duration} et était resté en file d'attente pendant %{queued_duration}"
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
-msgstr "en %{duration}, en utilisant %{compute_credits} crédits de calcul, et était resté en file d'attente pendant %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
+msgstr ""
msgid "in group %{link_to_group}"
msgstr "dans le groupe %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr "dans le groupe %{link_to_group}"
msgid "in project %{link_to_project}"
msgstr "dans le projet %{link_to_project}"
+msgid "incident"
+msgstr "incident"
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] "instance terminée"
@@ -54264,7 +54515,7 @@ msgid "is read-only"
msgstr "est en lecture seule"
msgid "is required to enable Code Suggestions"
-msgstr ""
+msgstr "est obligatoire pour activer les suggestions de code"
msgid "is too long (%{current_value}). The maximum size is %{max_size}."
msgstr "est de taille trop longue (%{current_value}). La taille maximale est de %{max_size}."
@@ -54354,9 +54605,6 @@ msgstr "le charger quand même"
msgid "loading"
msgstr "en cours de chargement"
-msgid "locked"
-msgstr "verrouillé"
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr "verrouillé par %{path_lock_user_name} %{created_at}"
@@ -54422,10 +54670,10 @@ msgid "mrWidgetCommitsAdded|The changes were not merged into %{targetBranch}."
msgstr "Les modifications n'ont pas été fusionnées dans %{targetBranch}."
msgid "mrWidgetNothingToMerge|Merge request contains no changes"
-msgstr "La demande de fusion ne contient aucune modification"
+msgstr "La requête de fusion ne contient aucune modification"
msgid "mrWidgetNothingToMerge|Use merge requests to propose changes to your project and discuss them with your team. To make changes, use the %{boldStart}Code%{boldEnd} dropdown list above, then test them with %{linkStart}CI/CD%{linkEnd} before merging."
-msgstr "Utilisez les demandes de fusion pour proposer des modifications à votre projet et discutez-en avec votre équipe. Utilisez la liste déroulante %{boldStart}Code%{boldEnd} ci-dessus pour faire les modifications puis testez ces dernières avec la %{linkStart}CI / CD%{linkEnd} avant de fusionner."
+msgstr "Utilisez les requêtes de fusion pour proposer des modifications à votre projet et en discuter avec votre équipe. Utilisez la liste déroulante %{boldStart}Code%{boldEnd} ci-dessus pour faire les modifications, puis testez ces dernières avec %{linkStart}CI/CD%{linkEnd} avant de fusionner."
msgid "mrWidget|%{boldHeaderStart}Looks like there's no pipeline here.%{boldHeaderEnd}"
msgstr "%{boldHeaderStart}Il semble ne pas y avoir de pipeline ici.%{boldHeaderEnd}"
@@ -54535,9 +54783,6 @@ msgstr "%{rules} règle non valide a été approuvée automatiquement"
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr "%{rules} règles non valides ont été approuvées automatiquement"
-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 "Un train de fusion est une file d'attente constituée de requêtes de fusions attendant d'être fusionnées dans la branche cible. Les modifications de chaque requête de fusion sont combinées avec celles des requêtes de fusion antérieures et testées avant la fusion."
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr "Un nouveau train de fusion a démarré et cette requête de fusion est la première de la file d'attente."
@@ -54659,9 +54904,6 @@ msgstr "La fusion a échoué."
msgid "mrWidget|Merged by"
msgstr "Fusionnée par"
-msgid "mrWidget|More information"
-msgstr "En savoir plus"
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr "Veuillez le restaurer ou utiliser une branche %{type} différente."
@@ -54725,17 +54967,17 @@ msgstr "Cette demande de fusion n'a pas pu être fusionnée automatiquement"
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr "Pour approuver cette demande de fusion, veuillez saisir votre mot de passe. Ce projet nécessite que toutes les approbations soient authentifiées."
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
-msgstr "Pour modifier ces messages par défaut, éditez les modèles pour les messages de validation de fusion et ceux des messages de validation squash. %{linkStart}En savoir plus.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
+msgstr "Pour apporter des modifications à ces messages par défaut, modifiez les modèles pour les messages de validation de fusion et ceux des messages de validation squash. %{linkStart}En savoir plus%{linkEnd}."
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
-msgstr "Pour modifier ce message par défaut, éditez le modèle des messages pour les validations de fusion. %{linkStart}En savoir plus.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
+msgstr "Pour apporter des modifications à ce message par défaut, modifiez le modèle des messages pour les validations de fusion. %{linkStart}En savoir plus%{linkEnd}."
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
-msgstr "Pour modifier ce message par défaut, éditez le modèle des messages pour les validations squash. %{linkStart}En savoir plus.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
+msgstr "Pour apporter des modifications à ce message par défaut, modifiez le modèle des messages pour les validations squash. %{linkStart}En savoir plus%{linkEnd}."
-msgid "mrWidget|What is a merge train?"
-msgstr "Qu'est-ce qu'un train de fusion ?"
+msgid "mrWidget|Your merge request is almost ready!"
+msgstr "Votre requête de fusion est presque prête !"
msgid "mrWidget|Your password"
msgstr "Votre mot de passe"
@@ -54773,6 +55015,12 @@ msgstr "doit être associé à un groupe ou à un projet"
msgid "must be at least 1 day"
msgstr "doit être d'au moins 1 jour"
+msgid "must be before %{expiry_date}"
+msgstr "doit être antérieur(e) à %{expiry_date}"
+
+msgid "must be false when email confirmation setting is off"
+msgstr "doit avoir la valeur Faux lorsque le paramètre de confirmation de l'adresse de courriel est désactivé"
+
msgid "must be greater than start date"
msgstr "doit être supérieure à la date de début"
@@ -54806,9 +55054,6 @@ msgstr "doit appartenir au même projet que l'élément de travail."
msgid "must contain only a discord user ID."
msgstr "doit contenir uniquement un ID d'utilisateur Discord."
-msgid "must expire in 365 days"
-msgstr "doit expirer dans 365 jours"
-
msgid "must have a repository"
msgstr "doit avoir un dépôt"
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr "ne prend en charge que les URL HTTP(S) valides"
msgid "open issue"
-msgstr "ouvrir un ticket"
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr "ou"
@@ -55157,7 +55404,7 @@ msgid "smartcn custom analyzer"
msgstr "analyseur personnalisé smartcn"
msgid "snippet"
-msgstr ""
+msgstr "extrait de code"
msgid "source"
msgstr "source"
@@ -55216,6 +55463,9 @@ msgstr "nom d'étiquette"
msgid "terraform states"
msgstr "états terraform"
+msgid "test case"
+msgstr "scénario de test"
+
msgid "the correct format."
msgstr "le format correct."
@@ -55259,7 +55509,7 @@ msgid "triggered"
msgstr "déclenché"
msgid "triggered pipeline for commit %{linkStart}%{shortId}%{linkEnd}"
-msgstr ""
+msgstr "a déclenché un pipeline pour la validation %{linkStart}%{shortId}%{linkEnd}"
msgid "two-factor authentication settings"
msgstr "paramètres d'authentification à deux facteurs"
@@ -55273,9 +55523,6 @@ msgstr "le paramètre de type est manquant et est requis"
msgid "unicode domains should use IDNA encoding"
msgstr "les domaines unicode doivent utiliser l'encodage IDNA"
-msgid "unlocked"
-msgstr "déverrouillé"
-
msgid "updated"
msgstr "mis à jour"
@@ -55371,7 +55618,7 @@ msgid "vulnerability|dismissed"
msgstr "rejetée"
msgid "was set to auto-merge by"
-msgstr ""
+msgstr "a été défini(e) sur fusion automatique par"
msgid "weekly"
msgstr "hebdomadaire"
@@ -55400,9 +55647,6 @@ msgstr "votre instance GitLab"
msgid "your group (%{group_name})"
msgstr "votre groupe (%{group_name})"
-msgid "your settings"
-msgstr "vos paramètres"
-
msgid "yyyy-mm-dd"
msgstr "jj-mm-aaaa"
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 4b7414f4480..5a15c526b7e 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -72,6 +72,9 @@ msgstr ""
msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
msgstr ""
+msgid "### Rich text editor"
+msgstr ""
+
msgid "##### ERROR ##### You have used %{usage_percentage} of the storage quota for %{namespace_name} (%{current_size} of %{size_limit}). %{namespace_name} is now read-only. Projects under this namespace are locked and actions will be restricted. To manage storage, or purchase additional storage, see %{manage_storage_url}. To learn more about restricted actions, see %{restricted_actions_url}"
msgstr ""
@@ -89,23 +92,23 @@ msgid_plural "%d Alerts"
msgstr[0] ""
msgstr[1] ""
-msgid "%d Alert:"
-msgid_plural "%d Alerts:"
+msgid "%d Approval"
+msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "%d Approval"
-msgid_plural "%d Approvals"
+msgid "%d Issue"
+msgid_plural "%d Issues"
msgstr[0] ""
msgstr[1] ""
-msgid "%d Module"
-msgid_plural "%d Modules"
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
msgstr[0] ""
msgstr[1] ""
-msgid "%d Other"
-msgid_plural "%d Others"
+msgid "%d Module"
+msgid_plural "%d Modules"
msgstr[0] ""
msgstr[1] ""
@@ -174,6 +177,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +362,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +656,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -670,9 +665,6 @@ msgstr ""
msgid "%{count} total weight"
msgstr ""
-msgid "%{criticalStart}%{critical} Critical%{criticalEnd} %{highStart}%{high} High%{highEnd} and %{otherStart}%{otherMessage}%{otherEnd}"
-msgstr ""
-
msgid "%{dashboard_path} could not be found."
msgstr ""
@@ -805,6 +797,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -889,6 +884,9 @@ msgstr ""
msgid "%{linkStart} Learn more%{linkEnd}."
msgstr ""
+msgid "%{linkStart}%{linkEnd} review summary"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -1031,15 +1029,6 @@ msgstr[1] ""
msgid "%{remaining_approvals} left"
msgstr ""
-msgid "%{reportType} %{status}"
-msgstr ""
-
-msgid "%{reportType} detected %{totalStart}%{total}%{totalEnd} potential %{vulnMessage}"
-msgstr ""
-
-msgid "%{reportType} detected no new vulnerabilities."
-msgstr ""
-
msgid "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approval%{approvalEnd} from:"
msgid_plural "%{requireStart}Require%{requireEnd} %{approvalsRequired} %{approvalStart}approvals%{approvalEnd} from:"
msgstr[0] ""
@@ -1120,6 +1109,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1147,7 +1142,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1209,6 +1204,11 @@ msgid_plural "%{strong_start}%{tag_count}%{strong_end} Tags"
msgstr[0] ""
msgstr[1] ""
+msgid "%{strong_start}%{terraform_states_count}%{strong_end} Terraform State"
+msgid_plural "%{strong_start}%{terraform_states_count}%{strong_end} Terraform States"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{tabname} changed"
msgstr ""
@@ -1236,9 +1236,6 @@ msgstr ""
msgid "%{time} UTC"
msgstr ""
-msgid "%{title} %{operator} %{threshold}"
-msgstr ""
-
msgid "%{title} changes"
msgstr ""
@@ -1269,9 +1266,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1547,8 +1541,8 @@ msgstr ""
msgid "0 B"
msgstr ""
-msgid "1 Code quality finding"
-msgid_plural "%d Code quality findings"
+msgid "1 Code Quality finding"
+msgid_plural "%d Code Quality findings"
msgstr[0] ""
msgstr[1] ""
@@ -1562,6 +1556,11 @@ msgid_plural "%d Issues"
msgstr[0] ""
msgstr[1] ""
+msgid "1 Security finding"
+msgid_plural "%d Security findings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 closed issue"
msgid_plural "%{issues} closed issues"
msgstr[0] ""
@@ -1917,6 +1916,9 @@ msgstr ""
msgid "AI|AI generated explanations will appear here."
msgstr ""
+msgid "AI|Apply AI-generated description"
+msgstr ""
+
msgid "AI|Ask a question"
msgstr ""
@@ -1929,6 +1931,12 @@ msgstr ""
msgid "AI|Code Explanation"
msgstr ""
+msgid "AI|Creates issue description based on a short prompt"
+msgstr ""
+
+msgid "AI|Description is required"
+msgstr ""
+
msgid "AI|Enabling these features is your acceptance of the %{link_start}GitLab Testing Agreement%{link_end}."
msgstr ""
@@ -1938,7 +1946,10 @@ msgstr ""
msgid "AI|Experiment features"
msgstr ""
-msgid "AI|Explain the code from %{filePath} in human understandable language presented in Markdown format. In the response add neither original code snippet nor any title. `%{text}`. If it is not programming code, say \"The selected text is not code. I am afraid this feature is for explaining code only. Would you like to ask a different question about the selected text?\" and wait for another question."
+msgid "AI|Explain the code from %{filePath} in human understandable language presented in Markdown format. In the response add neither original code snippet nor any title. `%{text}`. If it is not programming code, say `The selected text is not code. I am afraid this feature is for explaining code only. Would you like to ask a different question about the selected text?` and wait for another question."
+msgstr ""
+
+msgid "AI|Explain your rating (optional)"
msgstr ""
msgid "AI|Features that use third-party AI services require transmission of data, including personal data."
@@ -1947,15 +1958,27 @@ msgstr ""
msgid "AI|For example: Organizations should be able to forecast into the future by using value stream analytics charts. This feature would help them understand how their metrics are trending."
msgstr ""
+msgid "AI|Generate issue description"
+msgstr ""
+
msgid "AI|Helpful"
msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
+msgid "AI|Replace the existing description with an AI-generated description? Any changes you have made will be lost."
+msgstr ""
+
msgid "AI|Responses generated by AI"
msgstr ""
@@ -2256,9 +2279,15 @@ msgstr ""
msgid "AbuseReport|Confirmed violation of a copyright or a trademark"
msgstr ""
+msgid "AbuseReport|Copyright or trademark violation"
+msgstr ""
+
msgid "AbuseReport|Credit card"
msgstr ""
+msgid "AbuseReport|Crypto Mining"
+msgstr ""
+
msgid "AbuseReport|Delete user"
msgstr ""
@@ -2286,6 +2315,9 @@ msgstr ""
msgid "AbuseReport|Last login"
msgstr ""
+msgid "AbuseReport|Malware"
+msgstr ""
+
msgid "AbuseReport|Member since"
msgstr ""
@@ -2298,6 +2330,18 @@ msgstr ""
msgid "AbuseReport|Normal location"
msgstr ""
+msgid "AbuseReport|Offensive or Abusive"
+msgstr ""
+
+msgid "AbuseReport|Other"
+msgstr ""
+
+msgid "AbuseReport|Personal information or credentials"
+msgstr ""
+
+msgid "AbuseReport|Phishing"
+msgstr ""
+
msgid "AbuseReport|Phone"
msgstr ""
@@ -2337,6 +2381,9 @@ msgstr ""
msgid "AbuseReport|Something else"
msgstr ""
+msgid "AbuseReport|Spam"
+msgstr ""
+
msgid "AbuseReport|Tier"
msgstr ""
@@ -2433,9 +2480,6 @@ msgstr ""
msgid "AccessTokens|Created"
msgstr ""
-msgid "AccessTokens|Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "AccessTokens|Feed token"
msgstr ""
@@ -2532,13 +2576,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2655,7 +2699,7 @@ msgstr ""
msgid "Add a GPG key"
msgstr ""
-msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
+msgid "Add a GPG key for secure access to GitLab. %{help_link_start}Learn more%{help_link_end}."
msgstr ""
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
@@ -2697,6 +2741,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2724,7 +2771,7 @@ msgstr ""
msgid "Add an SSH key"
msgstr ""
-msgid "Add an SSH key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
+msgid "Add an SSH key for secure access to GitLab. %{help_link_start}Learn more%{help_link_end}."
msgstr ""
msgid "Add an existing issue"
@@ -2802,9 +2849,6 @@ msgstr ""
msgid "Add key"
msgstr ""
-msgid "Add label(s)"
-msgstr ""
-
msgid "Add labels"
msgstr ""
@@ -2823,6 +2867,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new webhook"
+msgstr ""
+
msgid "Add or remove a user."
msgstr ""
@@ -2856,9 +2903,6 @@ msgstr ""
msgid "Add suggestion to batch"
msgstr ""
-msgid "Add system hook"
-msgstr ""
-
msgid "Add text to the sign-in page. Markdown enabled."
msgstr ""
@@ -2952,6 +2996,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2973,9 +3020,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3399,22 +3443,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Instance runners expiration"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3498,6 +3533,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3567,9 +3605,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3579,9 +3614,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3612,10 +3644,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3624,9 +3656,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3849,9 +3878,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3897,6 +3923,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3936,7 +3965,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4206,9 +4235,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4245,7 +4271,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4350,10 +4376,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4464,9 +4490,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4503,9 +4526,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4767,6 +4787,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4818,12 +4841,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4866,6 +4883,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -5025,9 +5048,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5144,9 +5164,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5212,6 +5229,9 @@ msgstr ""
msgid "An unexpected error occurred while communicating with the Web Terminal."
msgstr ""
+msgid "An unexpected error occurred while loading the Sast diff."
+msgstr ""
+
msgid "An unexpected error occurred while loading the code quality diff."
msgstr ""
@@ -5233,7 +5253,10 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics dashboards"
+msgstr ""
+
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5275,7 +5298,7 @@ msgstr ""
msgid "Analytics|Configure Dashboard Project"
msgstr ""
-msgid "Analytics|Create dashboard %{dashboardId}"
+msgid "Analytics|Create dashboard %{dashboardSlug}"
msgstr ""
msgid "Analytics|Custom dashboards"
@@ -5290,6 +5313,9 @@ msgstr ""
msgid "Analytics|Dashboard was saved successfully"
msgstr ""
+msgid "Analytics|Dashboards are created by editing the groups dashboard files."
+msgstr ""
+
msgid "Analytics|Dashboards are created by editing the projects dashboard files."
msgstr ""
@@ -5305,9 +5331,15 @@ msgstr ""
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5317,7 +5349,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5356,6 +5388,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5365,7 +5409,10 @@ msgstr ""
msgid "Analytics|URL"
msgstr ""
-msgid "Analytics|Updating dashboard %{dashboardId}"
+msgid "Analytics|Updating dashboard %{dashboardSlug}"
+msgstr ""
+
+msgid "Analytics|Updating visualization %{visualizationName}"
msgstr ""
msgid "Analytics|Users"
@@ -5386,6 +5433,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5410,6 +5463,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -5588,7 +5644,7 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable Slack application"
+msgid "ApplicationSettings|Enable GitLab for Slack app"
msgstr ""
msgid "ApplicationSettings|Enable domain denylist for sign-ups"
@@ -5657,9 +5713,6 @@ msgstr ""
msgid "ApplicationSettings|This feature is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|This option is only available on GitLab.com"
-msgstr ""
-
msgid "ApplicationSettings|Upload denylist file"
msgstr ""
@@ -5835,6 +5888,12 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
+msgid "ApprovalRule|Search in"
+msgstr ""
+
+msgid "ApprovalRule|Search users or groups"
+msgstr ""
+
msgid "ApprovalRule|Select eligible approvers by expertise or files changed."
msgstr ""
@@ -5844,6 +5903,12 @@ msgstr ""
msgid "ApprovalRule|Try for free"
msgstr ""
+msgid "ApprovalRule|all groups"
+msgstr ""
+
+msgid "ApprovalRule|project groups"
+msgstr ""
+
msgid "ApprovalSettings|Keep approvals"
msgstr ""
@@ -6197,9 +6262,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6285,6 +6347,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6333,13 +6398,10 @@ msgstr ""
msgid "Assign labels"
msgstr ""
-msgid "Assign myself"
-msgstr ""
-
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6357,6 +6419,9 @@ msgstr ""
msgid "Assign to me"
msgstr ""
+msgid "Assign yourself"
+msgstr ""
+
msgid "Assigned"
msgstr ""
@@ -6398,9 +6463,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6540,13 +6602,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Delete destination"
+msgstr ""
+
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6558,21 +6629,36 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Filter by audit event type"
+msgstr ""
+
+msgid "AuditStreams|Google Cloud Logging"
msgstr ""
-msgid "AuditStreams|Filter by stream event"
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
+msgstr ""
+
msgid "AuditStreams|Remove custom header"
msgstr ""
@@ -6609,10 +6695,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6624,6 +6707,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7161,28 +7250,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7428,6 +7517,9 @@ msgstr ""
msgid "Billings|Free groups are limited to %{number} seats."
msgstr ""
+msgid "Billings|Free seats used"
+msgstr ""
+
msgid "Billings|Free tier and trial groups can invite a maximum of 20 members per day."
msgstr ""
@@ -7443,10 +7535,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7458,7 +7550,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7752,12 +7844,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7820,9 +7918,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7880,6 +7975,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8297,19 +8395,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8537,7 +8644,7 @@ msgstr ""
msgid "By authenticating with an account tied to an Enterprise e-mail address, it is understood that this account is an Enterprise User. "
msgstr ""
-msgid "By default, all projects and groups will use the global notifications setting."
+msgid "By default, all projects and groups use the global notifications setting."
msgstr ""
msgid "By month"
@@ -8546,6 +8653,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9040,10 +9150,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9061,10 +9171,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9088,7 +9198,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9136,13 +9249,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9157,9 +9270,6 @@ msgstr ""
msgid "Changes"
msgstr ""
-msgid "Changes are shown as if the %{b_open}source%{b_close} revision was being merged into the %{b_open}target%{b_close} revision."
-msgstr ""
-
msgid "Changes saved."
msgstr ""
@@ -9184,9 +9294,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9292,7 +9399,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9306,23 +9413,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9362,7 +9469,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9503,10 +9610,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9533,7 +9640,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9635,6 +9742,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -10692,9 +10802,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10779,9 +10886,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10842,9 +10946,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -10938,10 +11039,10 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of February 2023. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}."
+msgid "ClusterIntegration|The certificate-based Kubernetes integration is deprecated and will be removed in the future. You should %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}. For more information, see the %{deprecationLinkStart}deprecation epic%{deprecationLinkEnd}, or contact GitLab support."
msgstr ""
-msgid "ClusterIntegration|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of February 2023. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}. Contact GitLab Support if you have any additional questions."
+msgid "ClusterIntegration|The certificate-based Kubernetes integration is deprecated and will be removed in the future. You should %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}. For more information, see the %{deprecationLinkStart}deprecation epic%{deprecationLinkEnd}."
msgstr ""
msgid "ClusterIntegration|The certificate-based method to connect clusters to GitLab was %{linkStart}deprecated%{linkEnd} in GitLab 14.5."
@@ -11088,6 +11189,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11112,25 +11216,25 @@ msgstr ""
msgid "CodeSuggestionsAlert|Get started with Code Suggestions, available for free during the beta period."
msgstr ""
-msgid "CodeSuggestionsSM|&#8226; Agree to the %{terms_link_start}GitLab Testing Agreement%{link_end}.%{br} &#8226; Acknowledge that GitLab will send data from the instance, including personal data, to Google for cloud hosting.%{br} &nbsp;&nbsp;&nbsp;We may also send data to %{ai_docs_link_start}third-party AI providers%{link_end} to provide this feature."
+msgid "CodeSuggestionsSM|By enabling this feature, you agree to the %{terms_link_start}GitLab Testing Agreement%{link_end} and acknowledge that GitLab will send data from the instance, including personal data, to our %{ai_docs_link_start}AI providers%{link_end} to provide this feature."
msgstr ""
msgid "CodeSuggestionsSM|Code Suggestions"
msgstr ""
-msgid "CodeSuggestionsSM|Enable Code Suggestion for users of this GitLab instance."
+msgid "CodeSuggestionsSM|Enable Code Suggestions for this instance %{beta}"
msgstr ""
-msgid "CodeSuggestionsSM|Enter new personal access token"
+msgid "CodeSuggestionsSM|Enable Code Suggestions for users of this instance. %{link_start}What are Code Suggestions?%{link_end}"
msgstr ""
-msgid "CodeSuggestionsSM|Personal access token"
+msgid "CodeSuggestionsSM|Enter new personal access token"
msgstr ""
-msgid "CodeSuggestionsSM|Turn on Code Suggestions for this instance. By turning on this feature, you:"
+msgid "CodeSuggestionsSM|On GitLab.com, create a token. This token is required to use Code Suggestions on your self-managed instance. %{link_start}How do I create a token?%{link_end}"
msgstr ""
-msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
+msgid "CodeSuggestionsSM|Personal access token"
msgstr ""
msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
@@ -11250,12 +11354,18 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{issueHandle} for issue or perform generic search..."
+msgid "CommandPalette|Project files"
+msgstr ""
+
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
msgid "CommandPalette|issue (enter at least 3 chars)"
msgstr ""
@@ -11310,6 +11420,9 @@ msgstr ""
msgid "Comment templates can be used when creating comments inside issues, merge requests, and epics."
msgstr ""
+msgid "Comment type"
+msgstr ""
+
msgid "Comment/Reply (quoting selected text)"
msgstr ""
@@ -11354,18 +11467,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11453,9 +11560,6 @@ msgstr ""
msgid "Compare %{oldCommitId}...%{newCommitId}"
msgstr ""
-msgid "Compare Git revisions"
-msgstr ""
-
msgid "Compare GitLab editions"
msgstr ""
@@ -11483,24 +11587,36 @@ msgstr ""
msgid "Compare with previous version"
msgstr ""
-msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
+msgid "CompareRevisions|%{source_branch} and %{target_branch} are the same."
msgstr ""
-msgid "CompareBranches|There isn't anything to compare."
+msgid "CompareRevisions|Branches"
msgstr ""
-msgid "CompareRevisions|Branches"
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
msgstr ""
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11510,12 +11626,21 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
msgid "CompareRevisions|Tags"
msgstr ""
+msgid "CompareRevisions|There isn't anything to compare."
+msgstr ""
+
msgid "CompareRevisions|There was an error while loading the branch/tag list. Please try again."
msgstr ""
@@ -11546,10 +11671,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11747,6 +11875,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11786,12 +11917,15 @@ msgstr ""
msgid "Component name '%{component}' must not start with '%{prefix}'"
msgstr ""
-msgid "Component type '%s' is not yet supported"
+msgid "Component type '%{type}' is not yet supported"
msgstr ""
msgid "Components must have a 'name'"
msgstr ""
+msgid "Compute minutes"
+msgstr ""
+
msgid "Compute quota"
msgstr ""
@@ -11852,9 +11986,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11891,9 +12022,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12056,15 +12184,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12452,9 +12574,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12578,9 +12697,45 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Accepted merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
msgstr ""
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Made a private contribution."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12710,9 +12865,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12878,6 +13030,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -13103,6 +13258,9 @@ msgstr ""
msgid "Create or import your first project"
msgstr ""
+msgid "Create phone verification exemption"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -13409,9 +13567,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -13864,6 +14019,12 @@ msgstr ""
msgid "DORA4Metrics|Accept testing terms of use?"
msgstr ""
+msgid "DORA4Metrics|All labels"
+msgstr ""
+
+msgid "DORA4Metrics|Analytics Dashboards"
+msgstr ""
+
msgid "DORA4Metrics|Average (last %{days}d)"
msgstr ""
@@ -13915,6 +14076,12 @@ msgstr ""
msgid "DORA4Metrics|Failed to load comparison chart for Namespace: %{fullPath}"
msgstr ""
+msgid "DORA4Metrics|Failed to load labels matching the filter: %{labels}"
+msgstr ""
+
+msgid "DORA4Metrics|Filtered by"
+msgstr ""
+
msgid "DORA4Metrics|Forecast"
msgstr ""
@@ -14573,6 +14740,9 @@ msgstr ""
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
+msgid "Date range too large"
+msgstr ""
+
msgid "Date to enact enforcement on newly created namespaces"
msgstr ""
@@ -14633,6 +14803,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14898,6 +15074,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -15014,6 +15193,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15056,9 +15241,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15092,6 +15283,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15110,6 +15304,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15134,6 +15331,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15143,6 +15343,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15455,9 +15658,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15610,12 +15810,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15625,9 +15819,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -15646,6 +15837,9 @@ msgstr ""
msgid "Descriptive label"
msgstr ""
+msgid "Deselect all"
+msgstr ""
+
msgid "Design"
msgstr ""
@@ -16376,7 +16570,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16421,15 +16615,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -17162,9 +17356,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17252,6 +17443,12 @@ msgstr ""
msgid "Enterprise"
msgstr ""
+msgid "Enterprise User"
+msgstr ""
+
+msgid "Enterprise User Account on GitLab"
+msgstr ""
+
msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
@@ -17261,9 +17458,6 @@ msgstr ""
msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
-msgstr ""
-
msgid "Environment"
msgstr ""
@@ -17426,7 +17620,7 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
+msgid "Environments|Kubernetes namespace (optional)"
msgstr ""
msgid "Environments|Learn more about stopping environments"
@@ -17441,9 +17635,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17480,6 +17671,9 @@ msgstr ""
msgid "Environments|Select agent"
msgstr ""
+msgid "Environments|Select namespace"
+msgstr ""
+
msgid "Environments|Select which environments to clean up. Protected environments are excluded. Learn more about cleaning up environments."
msgstr ""
@@ -17534,6 +17728,9 @@ msgstr ""
msgid "Environment|Cluster IP"
msgstr ""
+msgid "Environment|Cluster agent not found."
+msgstr ""
+
msgid "Environment|CronJobs"
msgstr ""
@@ -17555,6 +17752,9 @@ msgstr ""
msgid "Environment|Failed"
msgstr ""
+msgid "Environment|Forbidden to access the cluster agent from this environment."
+msgstr ""
+
msgid "Environment|Healthy"
msgstr ""
@@ -17591,6 +17791,12 @@ msgstr ""
msgid "Environment|Summary"
msgstr ""
+msgid "Environment|There was an error connecting to the cluster agent."
+msgstr ""
+
+msgid "Environment|Unauthorized to access the cluster agent from this environment. Check your authentication and try again."
+msgstr ""
+
msgid "Environment|Unhealthy"
msgstr ""
@@ -17639,12 +17845,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17660,9 +17860,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18113,7 +18310,7 @@ msgstr ""
msgid "Event tag (optional)"
msgstr ""
-msgid "Event type '%s' is not yet supported"
+msgid "Event type '%{type}' is not yet supported"
msgstr ""
msgid "EventFilterBy|Filter by all"
@@ -18624,6 +18821,9 @@ msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18686,6 +18886,9 @@ msgstr ""
msgid "Failed to deploy to"
msgstr ""
+msgid "Failed to enable tracing."
+msgstr ""
+
msgid "Failed to enqueue the rebase operation, possibly due to a long-lived transaction. Try again later."
msgstr ""
@@ -18764,6 +18967,9 @@ msgstr ""
msgid "Failed to load milestones. Please try again."
msgstr ""
+msgid "Failed to load page."
+msgstr ""
+
msgid "Failed to load projects"
msgstr ""
@@ -18773,6 +18979,9 @@ msgstr ""
msgid "Failed to load stacktrace."
msgstr ""
+msgid "Failed to load traces."
+msgstr ""
+
msgid "Failed to make repository read-only. %{reason}"
msgstr ""
@@ -18806,6 +19015,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18896,9 +19108,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19135,9 +19344,6 @@ msgstr ""
msgid "File Hooks"
msgstr ""
-msgid "File Hooks (%{count})"
-msgstr ""
-
msgid "File Tree"
msgstr ""
@@ -19201,12 +19407,18 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
msgid "Filter"
msgstr ""
+msgid "Filter activity"
+msgstr ""
+
msgid "Filter by"
msgstr ""
@@ -19441,6 +19653,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19686,6 +19901,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19743,6 +19961,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -19810,9 +20031,6 @@ msgstr ""
msgid "Geo|%{label} should be between 1-999"
msgstr ""
-msgid "Geo|%{name} is scheduled for forced re-download"
-msgstr ""
-
msgid "Geo|%{name} is scheduled for re-sync"
msgstr ""
@@ -20086,9 +20304,6 @@ msgstr ""
msgid "Geo|Re-verification interval"
msgstr ""
-msgid "Geo|Redownload"
-msgstr ""
-
msgid "Geo|Remove"
msgstr ""
@@ -20356,10 +20571,10 @@ msgstr ""
msgid "Get started with GitLab"
msgstr ""
-msgid "Get started with error tracking"
+msgid "Get started with Tracing"
msgstr ""
-msgid "Get started with performance monitoring"
+msgid "Get started with error tracking"
msgstr ""
msgid "Get started!"
@@ -20842,6 +21057,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20866,9 +21084,6 @@ msgstr ""
msgid "Global notification level"
msgstr ""
-msgid "Global notification settings"
-msgstr ""
-
msgid "GlobalSearch| %{search} %{description} %{scope}"
msgstr ""
@@ -20902,7 +21117,7 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
-msgid "GlobalSearch|Label(s)"
+msgid "GlobalSearch|Labels"
msgstr ""
msgid "GlobalSearch|Language"
@@ -20917,6 +21132,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -21328,7 +21546,7 @@ msgstr ""
msgid "Group URL"
msgstr ""
-msgid "Group access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
+msgid "Group access token creation is disabled in this group."
msgstr ""
msgid "Group application: %{name}"
@@ -21385,9 +21603,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21400,6 +21615,12 @@ msgstr ""
msgid "Group membership expiration date removed"
msgstr ""
+msgid "Group mention in private"
+msgstr ""
+
+msgid "Group mention in public"
+msgstr ""
+
msgid "Group milestone"
msgstr ""
@@ -21730,6 +21951,9 @@ msgstr ""
msgid "GroupSaml|Your SCIM token"
msgstr ""
+msgid "GroupSelect|An error occurred fetching the groups. Please refresh the page to try again."
+msgstr ""
+
msgid "GroupSelect|No matching results"
msgstr ""
@@ -22355,12 +22579,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22475,11 +22693,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22926,6 +23139,9 @@ msgstr ""
msgid "IdentityVerification|You've reached the maximum amount of resends. Wait %{interval} and try again."
msgstr ""
+msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} and try again."
+msgstr ""
+
msgid "IdentityVerification|You've reached the maximum amount of tries. Wait %{interval} or send a new code and try again."
msgstr ""
@@ -23328,6 +23544,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24150,6 +24369,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24267,7 +24492,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24300,9 +24525,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -24641,7 +24863,7 @@ msgstr ""
msgid "Introducing Your DevOps Reports"
msgstr ""
-msgid "Invalid 'schemaVersion' '%s'"
+msgid "Invalid 'schemaVersion' '%{schema_version}'"
msgstr ""
msgid "Invalid Insights config file detected"
@@ -24668,6 +24890,9 @@ msgstr ""
msgid "Invalid date range"
msgstr ""
+msgid "Invalid dates set"
+msgstr ""
+
msgid "Invalid feature"
msgstr ""
@@ -25378,6 +25603,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25735,9 +25963,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -26161,6 +26395,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26323,6 +26560,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26386,9 +26629,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -27247,9 +27487,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27754,6 +27991,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27778,9 +28018,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -28051,9 +28288,15 @@ msgstr ""
msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
msgstr ""
+msgid "Maximum number of stages per value stream exceeded"
+msgstr ""
+
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -28456,6 +28699,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28474,6 +28720,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28591,9 +28840,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28621,9 +28867,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28648,6 +28891,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28714,6 +28960,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28810,9 +29068,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28867,258 +29122,109 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
+msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error getting environments information."
+msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
+msgid "Metrics|Used as a title for the chart"
msgstr ""
-msgid "Metrics|There was an error trying to validate your query"
+msgid "Metrics|Used if the query returns a single series. If it returns multiple series, their legend labels will be picked up from the response."
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
+msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
+msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
+msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
+msgid "Metrics|e.g. HTTP requests"
msgstr ""
-msgid "Metrics|Unit label"
+msgid "Metrics|e.g. Requests/second"
msgstr ""
-msgid "Metrics|Unstar dashboard"
+msgid "Metrics|e.g. Throughput"
msgstr ""
-msgid "Metrics|Used as a title for the chart"
+msgid "Metrics|e.g. rate(http_requests_total[5m])"
msgstr ""
-msgid "Metrics|Used if the query returns a single series. If it returns multiple series, their legend labels will be picked up from the response."
+msgid "Metrics|e.g. req/sec"
msgstr ""
-msgid "Metrics|Validating query"
+msgid "Mi"
msgstr ""
-msgid "Metrics|Values"
+msgid "Microsoft|Client ID"
msgstr ""
-msgid "Metrics|View documentation"
+msgid "Microsoft|Client secret"
msgstr ""
-msgid "Metrics|Y-axis label"
+msgid "Microsoft|Enable Microsoft Azure integration for this group"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
+msgid "Microsoft|Graph API endpoint"
msgstr ""
-msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
+msgid "Microsoft|Login API endpoint"
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
+msgid "Microsoft|Microsoft Azure Integration"
msgstr ""
-msgid "Metrics|e.g. HTTP requests"
+msgid "Microsoft|Microsoft Azure integration settings failed to save. %{errors}"
msgstr ""
-msgid "Metrics|e.g. Requests/second"
+msgid "Microsoft|Microsoft Azure integration settings were successfully updated."
msgstr ""
-msgid "Metrics|e.g. Throughput"
+msgid "Microsoft|Tenant ID"
msgstr ""
-msgid "Metrics|e.g. rate(http_requests_total[5m])"
+msgid "Microsoft|Use the default value, unless you're using Azure AD for US Government or Azure AD China operated by 22Vianet."
msgstr ""
-msgid "Metrics|e.g. req/sec"
-msgstr ""
-
-msgid "Mi"
+msgid "Microsoft|Use the default value, unless you're using using Microsoft Graph for US Government or Microsoft Graph China operated by 22Vianet."
msgstr ""
msgid "Migrated %{success_count}/%{total_count} files."
@@ -29489,6 +29595,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29525,6 +29634,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29555,6 +29667,9 @@ msgstr ""
msgid "Monitor Settings"
msgstr ""
+msgid "Monitor your applications with GitLab Distributed Tracing."
+msgstr ""
+
msgid "Monitor your errors directly in GitLab."
msgstr ""
@@ -29585,9 +29700,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29696,7 +29808,7 @@ msgstr ""
msgid "Multiple Prometheus integrations are not supported"
msgstr ""
-msgid "Multiple components(%s) have 'gl/inject-editor' attribute"
+msgid "Multiple components '%{name}' have 'gl/inject-editor' attribute"
msgstr ""
msgid "Multiple integrations of a single type are not supported for this project"
@@ -29840,6 +29952,9 @@ msgstr ""
msgid "NamespaceLimits|Free Tier"
msgstr ""
+msgid "NamespaceLimits|Namespace limits could not be loaded. Reload the page to try again."
+msgstr ""
+
msgid "NamespaceLimits|Notifications Limit"
msgstr ""
@@ -30240,6 +30355,9 @@ msgstr ""
msgid "New Requirement"
msgstr ""
+msgid "New Security findings"
+msgstr ""
+
msgid "New Snippet"
msgstr ""
@@ -30519,12 +30637,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30663,9 +30775,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30708,6 +30817,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30720,6 +30832,9 @@ msgstr ""
msgid "No test coverage"
msgstr ""
+msgid "No traces to display."
+msgstr ""
+
msgid "No user provided"
msgstr ""
@@ -30767,6 +30882,9 @@ msgstr ""
msgid "Normal text"
msgstr ""
+msgid "Normal view"
+msgstr ""
+
msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
msgstr ""
@@ -30851,9 +30969,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -30908,9 +31023,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Notification Email"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -31150,6 +31262,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31255,18 +31370,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
+msgstr ""
+
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31441,6 +31562,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32063,6 +32187,9 @@ msgstr ""
msgid "Opens new window"
msgstr ""
+msgid "Operation"
+msgstr ""
+
msgid "Operation not allowed"
msgstr ""
@@ -32117,6 +32244,15 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|An error occurred loading the projects. Please refresh the page to try again."
+msgstr ""
+
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32638,6 +32774,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33154,6 +33302,15 @@ msgstr ""
msgid "Phone"
msgstr ""
+msgid "Phone verification exemption"
+msgstr ""
+
+msgid "Phone verification exemption has been created."
+msgstr ""
+
+msgid "Phone verification exemption has been removed."
+msgstr ""
+
msgid "PhoneVerification|Enter a valid code."
msgstr ""
@@ -33208,9 +33365,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33412,6 +33566,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33421,6 +33584,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33478,9 +33644,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33667,9 +33830,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33835,9 +33995,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33856,7 +34013,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33916,9 +34073,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33985,6 +34148,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -34069,6 +34238,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34195,9 +34367,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34348,7 +34517,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34864,6 +35033,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34903,6 +35075,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -35044,6 +35219,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35500,7 +35678,7 @@ msgstr ""
msgid "Project URL"
msgstr ""
-msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
+msgid "Project access token creation is disabled in this group."
msgstr ""
msgid "Project already deleted"
@@ -35560,9 +35738,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35887,6 +36062,12 @@ msgstr ""
msgid "ProjectService|Trigger event when a deployment starts or finishes."
msgstr ""
+msgid "ProjectService|Trigger event when a group is mentioned in a confidential context."
+msgstr ""
+
+msgid "ProjectService|Trigger event when a group is mentioned in a public context."
+msgstr ""
+
msgid "ProjectService|Trigger event when a merge request is created, updated, or merged."
msgstr ""
@@ -36091,25 +36272,19 @@ msgstr ""
msgid "ProjectSettings|Infrastructure"
msgstr ""
-msgid "ProjectSettings|Instrument your application to track events and behaviors."
+msgid "ProjectSettings|Instrument your application"
msgstr ""
-msgid "ProjectSettings|Internal"
-msgstr ""
-
-msgid "ProjectSettings|Issues"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator email"
+msgid "ProjectSettings|Instrument your application to track events and behaviors."
msgstr ""
-msgid "ProjectSettings|Jitsu administrator password"
+msgid "ProjectSettings|Instrumentation details"
msgstr ""
-msgid "ProjectSettings|Jitsu host"
+msgid "ProjectSettings|Internal"
msgstr ""
-msgid "ProjectSettings|Jitsu project ID"
+msgid "ProjectSettings|Issues"
msgstr ""
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
@@ -36205,9 +36380,6 @@ msgstr ""
msgid "ProjectSettings|Product analytics configurator connection string"
msgstr ""
-msgid "ProjectSettings|Product analytics needs to be set up before your application can be instrumented. Follow the %{link_start}set up process%{link_end}."
-msgstr ""
-
msgid "ProjectSettings|Project visibility"
msgstr ""
@@ -36295,9 +36467,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36319,9 +36488,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36358,10 +36524,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36421,6 +36584,12 @@ msgstr ""
msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab. GitLab Pages uses a caching mechanism for efficiency. Your changes may not take effect until that cache is invalidated, which usually takes less than a minute."
msgstr ""
+msgid "ProjectSettings|You need to %{linkStart}set up product analytics%{linkEnd} before your application can be instrumented."
+msgstr ""
+
+msgid "ProjectSettings|Your project is set up. %{linkStart}View instrumentation instructions%{linkEnd}."
+msgstr ""
+
msgid "ProjectTemplates|.NET Core"
msgstr ""
@@ -37015,7 +37184,7 @@ msgstr ""
msgid "Prompt users to upload SSH keys"
msgstr ""
-msgid "Property 'dedicatedPod' of component '%s' is not yet supported"
+msgid "Property 'dedicatedPod' of component '%{name}' is not yet supported"
msgstr ""
msgid "Protect"
@@ -37649,9 +37818,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37724,6 +37890,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37906,7 +38075,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37918,7 +38087,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -38148,13 +38317,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
-msgid "Remove all or specific label(s)"
+msgid "Remove all or specific labels"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38259,6 +38428,9 @@ msgstr ""
msgid "Remove parent epic from an epic"
msgstr ""
+msgid "Remove phone verification exemption"
+msgstr ""
+
msgid "Remove priority"
msgstr ""
@@ -38457,12 +38629,15 @@ msgstr ""
msgid "Replace %{name}"
msgstr ""
-msgid "Replace all label(s)"
+msgid "Replace all labels"
msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -39239,9 +39414,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39287,12 +39459,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39415,6 +39596,9 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Active runners"
+msgstr ""
+
msgid "Runners|Add notes such as the runner owner or what it should be used for."
msgstr ""
@@ -39553,6 +39737,9 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Delete"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
@@ -39621,7 +39808,7 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
+msgid "Runners|Fleet dashboard"
msgstr ""
msgid "Runners|Get started with runners"
@@ -39964,6 +40151,9 @@ msgstr ""
msgid "Runners|Running"
msgstr ""
+msgid "Runners|Running Jobs"
+msgstr ""
+
msgid "Runners|Runs untagged jobs"
msgstr ""
@@ -40062,6 +40252,9 @@ msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
+msgid "Runners|There are no runners running jobs right now. Active runners will populate here as they pick up jobs."
+msgstr ""
+
msgid "Runners|These runners are assigned to this project."
msgstr ""
@@ -40208,6 +40401,9 @@ msgstr ""
msgid "Runners|shared"
msgstr ""
+msgid "Runner|Runner actions"
+msgstr ""
+
msgid "Running"
msgstr ""
@@ -40265,9 +40461,6 @@ msgstr ""
msgid "SHA256"
msgstr ""
-msgid "SSH Fingerprints"
-msgstr ""
-
msgid "SSH Key"
msgstr ""
@@ -40388,22 +40581,49 @@ msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
msgstr ""
+msgid "ScanExecutionPolicy|A runner will be selected automatically from those available."
+msgstr ""
+
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
-msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Key"
msgstr ""
msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
msgstr ""
-msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
msgstr ""
-msgid "ScanExecutionPolicy|Run a %{scan} scan with %{dastProfiles} on runner that %{tags}"
+msgid "ScanExecutionPolicy|Maximum number of runner tags-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
+msgid "ScanExecutionPolicy|Run a %{scan} scan with %{dastProfiles} with the following options:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Run a %{scan} scan with the following options:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Runner tags"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Runner tags:"
msgstr ""
msgid "ScanExecutionPolicy|Scanner profile"
@@ -40427,6 +40647,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|Select or Create a Key"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select scanner profile"
msgstr ""
@@ -40445,6 +40668,12 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Use a custom key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40484,6 +40713,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40538,7 +40770,7 @@ msgstr ""
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
-msgid "ScanResultPolicy|When %{scanType} in an open merge request targeting the %{branches} and the licenses match all of the following criteria:"
+msgid "ScanResultPolicy|When %{scanType} in an open merge request targeting %{branches} and the licenses match all of the following criteria:"
msgstr ""
msgid "ScanResultPolicy|When %{scanners} find scanner specified conditions in an open merge request targeting the %{branches} and match %{boldDescription} of the following criteria"
@@ -40763,9 +40995,6 @@ msgstr ""
msgid "Search users"
msgstr ""
-msgid "Search users or groups"
-msgstr ""
-
msgid "Search your projects"
msgstr ""
@@ -40962,12 +41191,6 @@ msgstr ""
msgid "Security dashboard"
msgstr ""
-msgid "Security report is out of date. Please update your branch with the latest changes from the target branch (%{targetBranchName})"
-msgstr ""
-
-msgid "Security report is out of date. Run %{newPipelineLinkStart}a new pipeline%{newPipelineLinkEnd} for the target branch (%{targetBranchName})"
-msgstr ""
-
msgid "SecurityApprovals|A merge request approval is required when test coverage declines."
msgstr ""
@@ -40977,7 +41200,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -41001,9 +41224,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -41088,9 +41308,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41139,13 +41356,7 @@ msgstr ""
msgid "SecurityOrchestration|%{agent} for %{namespaces}"
msgstr ""
-msgid "SecurityOrchestration|%{branches} and %{lastBranch} branches"
-msgstr ""
-
-msgid "SecurityOrchestration|%{branches} branch"
-msgstr ""
-
-msgid "SecurityOrchestration|%{cadence} on the %{branches}"
+msgid "SecurityOrchestration|%{cadence} on %{branches}"
msgstr ""
msgid "SecurityOrchestration|%{licenses} and %{lastLicense}"
@@ -41205,6 +41416,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Automatically selected runners"
+msgstr ""
+
msgid "SecurityOrchestration|Branch types don't match any existing branches."
msgstr ""
@@ -41271,6 +41485,9 @@ msgstr ""
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
msgstr ""
+msgid "SecurityOrchestration|Every time a pipeline runs for %{branches}"
+msgstr ""
+
msgid "SecurityOrchestration|Failed to load cluster agents."
msgstr ""
@@ -41295,6 +41512,9 @@ msgstr ""
msgid "SecurityOrchestration|Inherited from %{namespace}"
msgstr ""
+msgid "SecurityOrchestration|Invalid branch type detected - rule will not be applied."
+msgstr ""
+
msgid "SecurityOrchestration|Invalid policy"
msgstr ""
@@ -41340,6 +41560,11 @@ msgstr ""
msgid "SecurityOrchestration|Not enabled"
msgstr ""
+msgid "SecurityOrchestration|On runners with tag:"
+msgid_plural "SecurityOrchestration|On runners with the tags:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "SecurityOrchestration|Only owners can update Security Policy Project"
msgstr ""
@@ -41373,7 +41598,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41388,14 +41613,9 @@ msgstr ""
msgid "SecurityOrchestration|Rules"
msgstr ""
-msgid "SecurityOrchestration|Run %{scannerStart}%{scanner}%{scannerEnd}"
+msgid "SecurityOrchestration|Run %{scannerStart}%{scanner}%{scannerEnd} with the following options:"
msgstr ""
-msgid "SecurityOrchestration|Run %{scannerStart}%{scanner}%{scannerEnd} on runners with tag:"
-msgid_plural "SecurityOrchestration|Run %{scannerStart}%{scanner}%{scannerEnd} on runners with the tags:"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
msgstr ""
@@ -41516,6 +41736,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41540,10 +41763,16 @@ msgstr ""
msgid "SecurityOrchestration|Vulnerabilities are %{vulnerabilityStates}."
msgstr ""
-msgid "SecurityOrchestration|When %{scanners} %{vulnerabilitiesAllowed} %{vulnerability} in an open merge request targeting %{branches}%{criteriaApply}"
+msgid "SecurityOrchestration|When %{scanners} %{vulnerabilitiesAllowed} %{vulnerability} in an open merge request %{targeting}%{branches}%{criteriaApply}"
msgstr ""
-msgid "SecurityOrchestration|When license scanner finds any license %{matching} %{licenses}%{detection} in an open merge request targeting %{branches}."
+msgid "SecurityOrchestration|When license scanner finds any license except %{licenses}%{detection} in an open merge request %{targeting}%{branches}."
+msgstr ""
+
+msgid "SecurityOrchestration|When license scanner finds any license matching %{licenses}%{detection} in an open merge request %{targeting}%{branches}."
+msgstr ""
+
+msgid "SecurityOrchestration|With the following customized CI variables:"
msgstr ""
msgid "SecurityOrchestration|YAML"
@@ -41555,10 +41784,16 @@ msgstr ""
msgid "SecurityOrchestration|all namespaces"
msgstr ""
-msgid "SecurityOrchestration|all protected branches"
+msgid "SecurityOrchestration|any"
msgstr ""
-msgid "SecurityOrchestration|any"
+msgid "SecurityOrchestration|any branch"
+msgstr ""
+
+msgid "SecurityOrchestration|any default branch"
+msgstr ""
+
+msgid "SecurityOrchestration|any protected branch"
msgstr ""
msgid "SecurityOrchestration|any security scanner finds"
@@ -41582,9 +41817,6 @@ msgstr ""
msgid "SecurityOrchestration|more than %{allowed}"
msgstr ""
-msgid "SecurityOrchestration|on every pipeline on the %{branches}"
-msgstr ""
-
msgid "SecurityOrchestration|or from:"
msgstr ""
@@ -41594,15 +41826,27 @@ msgstr ""
msgid "SecurityOrchestration|scanners find"
msgstr ""
+msgid "SecurityOrchestration|targeting %{branchTypeText}"
+msgstr ""
+
msgid "SecurityOrchestration|the %{branches}"
msgstr ""
+msgid "SecurityOrchestration|the %{branches} and %{lastBranch} branches"
+msgstr ""
+
+msgid "SecurityOrchestration|the %{branches} branch"
+msgstr ""
+
msgid "SecurityOrchestration|the %{namespaces} and %{lastNamespace} namespaces"
msgstr ""
msgid "SecurityOrchestration|the %{namespaces} namespace"
msgstr ""
+msgid "SecurityOrchestration|the default branch"
+msgstr ""
+
msgid "SecurityPolicies|Invalid or empty policy"
msgstr ""
@@ -41801,9 +42045,6 @@ msgstr ""
msgid "SecurityReports|More info"
msgstr ""
-msgid "SecurityReports|New vulnerabilities are vulnerabilities that the security scan detects in the merge request that are different to existing vulnerabilities in the default branch."
-msgstr ""
-
msgid "SecurityReports|No longer detected"
msgstr ""
@@ -41858,12 +42099,6 @@ msgstr ""
msgid "SecurityReports|Security reports can only be accessed by authorized users."
msgstr ""
-msgid "SecurityReports|Security reports help page link"
-msgstr ""
-
-msgid "SecurityReports|Security scan results"
-msgstr ""
-
msgid "SecurityReports|Security scans have run"
msgstr ""
@@ -41909,6 +42144,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41960,12 +42198,6 @@ msgstr ""
msgid "SecurityReports|Undo dismiss"
msgstr ""
-msgid "SecurityReports|Upgrade to interact, track and shift left with vulnerability management features in the UI."
-msgstr ""
-
-msgid "SecurityReports|Upgrade to manage vulnerabilities"
-msgstr ""
-
msgid "SecurityReports|Vulnerability report"
msgstr ""
@@ -42089,7 +42321,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42161,7 +42393,7 @@ msgstr ""
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42308,6 +42540,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42338,6 +42573,12 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
+msgid "ServiceDesk|Cannot update custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42347,6 +42588,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42356,6 +42603,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42383,6 +42633,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42691,6 +42947,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42775,7 +43040,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -43107,12 +43372,6 @@ msgstr ""
msgid "Skype:"
msgstr ""
-msgid "Slack application"
-msgstr ""
-
-msgid "Slack integration allows you to interact with GitLab via slash commands in a chat window."
-msgstr ""
-
msgid "Slack logo"
msgstr ""
@@ -43125,6 +43384,12 @@ msgstr ""
msgid "Slack notifications will be deprecated"
msgstr ""
+msgid "SlackIntegration|- *Notifications:* Get notifications to your team's Slack channel about events happening inside your GitLab projects."
+msgstr ""
+
+msgid "SlackIntegration|- *Slash commands:* Quickly open, access, or close issues from Slack using the `%{slash_command}` command. Streamline your GitLab deployments with ChatOps."
+msgstr ""
+
msgid "SlackIntegration|Are you sure you want to remove this project from the GitLab for Slack app?"
msgstr ""
@@ -43134,16 +43399,37 @@ msgstr ""
msgid "SlackIntegration|Client secret"
msgstr ""
+msgid "SlackIntegration|Configure your GitLab for Slack app."
+msgstr ""
+
+msgid "SlackIntegration|Copy the %{link_start}settings%{link_end} from %{strong_open}%{settings_heading}%{strong_close} in your GitLab for Slack app."
+msgstr ""
+
+msgid "SlackIntegration|Create Slack app"
+msgstr ""
+
msgid "SlackIntegration|Create and read issue data and comments."
msgstr ""
+msgid "SlackIntegration|Download latest manifest file"
+msgstr ""
+
+msgid "SlackIntegration|Generated for %{host} by GitLab %{version}."
+msgstr ""
+
msgid "SlackIntegration|GitLab for Slack"
msgstr ""
msgid "SlackIntegration|GitLab for Slack was successfully installed."
msgstr ""
-msgid "SlackIntegration|Install GitLab for Slack app"
+msgid "SlackIntegration|GitLab slash commands"
+msgstr ""
+
+msgid "SlackIntegration|Install GitLab for Slack app…"
+msgstr ""
+
+msgid "SlackIntegration|Interact with GitLab without leaving your Slack workspace!"
msgstr ""
msgid "SlackIntegration|Perform deployments."
@@ -43152,7 +43438,7 @@ msgstr ""
msgid "SlackIntegration|Project alias"
msgstr ""
-msgid "SlackIntegration|Reinstall GitLab for Slack app"
+msgid "SlackIntegration|Reinstall GitLab for Slack app…"
msgstr ""
msgid "SlackIntegration|Remove project"
@@ -43173,6 +43459,12 @@ msgstr ""
msgid "SlackIntegration|Signing secret"
msgstr ""
+msgid "SlackIntegration|Step 1: Create your GitLab for Slack app"
+msgstr ""
+
+msgid "SlackIntegration|Step 2: Configure the app settings"
+msgstr ""
+
msgid "SlackIntegration|Team name"
msgstr ""
@@ -43188,9 +43480,24 @@ msgstr ""
msgid "SlackIntegration|Update to the latest version to receive notifications from GitLab."
msgstr ""
+msgid "SlackIntegration|Update your Slack app"
+msgstr ""
+
+msgid "SlackIntegration|Used for authenticating API requests from the GitLab for Slack app."
+msgstr ""
+
+msgid "SlackIntegration|Used for authenticating OAuth requests from the GitLab for Slack app."
+msgstr ""
+
+msgid "SlackIntegration|Used only for authenticating slash commands from the GitLab for Slack app. This method of authentication is deprecated by Slack."
+msgstr ""
+
msgid "SlackIntegration|Verification token"
msgstr ""
+msgid "SlackIntegration|When GitLab releases new features for the GitLab for Slack app, you might have to manually update your copy to use the new features."
+msgstr ""
+
msgid "SlackIntegration|You can now close this window and go to your Slack workspace."
msgstr ""
@@ -43200,9 +43507,15 @@ msgstr ""
msgid "SlackIntegration|You may need to reinstall the GitLab for Slack app when we %{linkStart}make updates or change permissions%{linkEnd}."
msgstr ""
+msgid "SlackIntegration|You must do this step only once."
+msgstr ""
+
msgid "SlackIntegration|cannot have more than %{limit} channels"
msgstr ""
+msgid "SlackIntegration|your-project-name-or-alias command"
+msgstr ""
+
msgid "SlackModal|Are you sure you want to change the project?"
msgstr ""
@@ -43578,6 +43891,12 @@ msgstr ""
msgid "Something went wrong. Try again later."
msgstr ""
+msgid "Something went wrong. Unable to create phone exemption."
+msgstr ""
+
+msgid "Something went wrong. Unable to remove phone exemption."
+msgstr ""
+
msgid "Sorry, no projects matched your search"
msgstr ""
@@ -43890,9 +44209,6 @@ msgstr ""
msgid "Specific branches"
msgstr ""
-msgid "Specific protected branches"
-msgstr ""
-
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -44031,9 +44347,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44235,9 +44548,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44286,7 +44596,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44721,6 +45031,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44948,10 +45264,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45215,7 +45531,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45224,7 +45540,7 @@ msgstr ""
msgid "TanukiBot|For example, %{linkStart}what is a fork%{linkEnd}?"
msgstr ""
-msgid "TanukiBot|GitLab Chat"
+msgid "TanukiBot|GitLab Duo Chat"
msgstr ""
msgid "TanukiBot|Give feedback"
@@ -45235,7 +45551,7 @@ msgid_plural "TanukiBot|Sources"
msgstr[0] ""
msgstr[1] ""
-msgid "TanukiBot|There was an error communicating with GitLab Chat. Please try again later."
+msgid "TanukiBot|There was an error communicating with GitLab Duo Chat. Please try again later."
msgstr ""
msgid "TanukiBot|What is a fork?"
@@ -45488,9 +45804,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45743,9 +46056,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45824,13 +46134,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -46032,6 +46342,9 @@ msgstr ""
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -46047,9 +46360,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46176,6 +46486,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46470,9 +46783,6 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was a problem with the credit card details you entered. Use a different credit card and try again."
-msgstr ""
-
msgid "There was an error creating the dashboard, branch name is invalid."
msgstr ""
@@ -46617,6 +46927,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46758,6 +47071,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -47139,9 +47455,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47280,6 +47593,9 @@ msgstr ""
msgid "This user has the %{access} role in the %{name} project."
msgstr ""
+msgid "This user is currently exempt from phone verification. Remove the exemption using the button below."
+msgstr ""
+
msgid "This user is the author of this %{noteable}."
msgstr ""
@@ -47680,13 +47996,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47755,6 +48068,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47782,9 +48098,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47835,6 +48148,9 @@ msgstr ""
msgid "To remove the %{link_start}read-only%{link_end} state and regain write access, you can reduce the number of users in your top-level group to %{free_limit} users or less. You can also upgrade to a paid tier, which do not have user limits. If you need additional time, you can start a free 30-day trial which includes unlimited users. To minimize the impact to operations, for a limited time, GitLab is offering a %{promotion_link_start}one-time 70 percent discount%{link_end} off the list price at time of purchase for a new, one year subscription of GitLab Premium SaaS to %{offer_availability_link_start}qualifying top-level groups%{link_end}. The offer is valid until %{offer_date}."
msgstr ""
+msgid "To replace phone verification with credit card verification, create a phone verification exemption using the button below."
+msgstr ""
+
msgid "To resolve this, try to:"
msgstr ""
@@ -47850,16 +48166,16 @@ msgstr ""
msgid "To see this project's operational details, contact an owner of group %{groupName} to upgrade the plan. You can also remove the project from the dashboard."
msgstr ""
-msgid "To see what's changed or create a merge request, choose a branch or tag (like %{branch}), or enter a commit (like %{sha})."
+msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
+msgid "To set up this feature, contact your administrator."
msgstr ""
msgid "To set up this integration:"
msgstr ""
-msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
+msgid "To specify the notification level per project of a group you belong to, visit the project page and change the notification level there."
msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
@@ -48042,9 +48358,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -48054,6 +48367,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -48176,6 +48492,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48209,6 +48528,12 @@ msgstr ""
msgid "TotalRefCountIndicator|1000+"
msgstr ""
+msgid "Traces"
+msgstr ""
+
+msgid "Tracing"
+msgstr ""
+
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -48412,9 +48737,15 @@ msgstr ""
msgid "Try grouping with different labels"
msgstr ""
+msgid "Try out **styling** _your_ content right here or read the [direction](%{directionUrl})."
+msgstr ""
+
msgid "Try out GitLab Pipelines"
msgstr ""
+msgid "Try the rich text editor now"
+msgstr ""
+
msgid "Try the troubleshooting steps here."
msgstr ""
@@ -48505,12 +48836,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48568,9 +48893,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48754,9 +49076,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48841,9 +49160,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -49099,10 +49415,13 @@ msgstr ""
msgid "Usage statistics"
msgstr ""
+msgid "UsageQuotas|(of %{totalStorageSize})"
+msgstr ""
+
msgid "UsageQuotas|An error occurred loading the transfer data. Please refresh the page to try again."
msgstr ""
-msgid "UsageQuotas|Container Registry storage statistics are not used to calculate the total project storage. After namespace container deduplication, the total of all unique containers is added to the namespace storage total."
+msgid "UsageQuotas|Container Registry storage statistics are not used to calculate the total project storage. Total project storage is calculated after namespace container deduplication, where the total of all unique containers is added to the namespace storage total."
msgstr ""
msgid "UsageQuotas|Namespace transfer data used"
@@ -49123,7 +49442,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -49165,9 +49484,6 @@ msgstr ""
msgid "UsageQuota|Gitlab-integrated Docker Container Registry for storing Docker Images."
msgstr ""
-msgid "UsageQuota|Gitlab-integrated Docker Container Registry for storing Docker Images. %{linkStart}More information%{linkEnd}"
-msgstr ""
-
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
@@ -49213,10 +49529,13 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
+msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Pipelines"
+msgid "UsageQuota|Precise calculation of Container Registry storage size is delayed because it is too large for synchronous estimation. Precise evaluation will be scheduled within 24 hours."
+msgstr ""
+
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49276,7 +49595,7 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
msgstr ""
msgid "UsageQuota|Total purchased storage"
@@ -49495,6 +49814,9 @@ msgstr ""
msgid "Use the link below to confirm your email address."
msgstr ""
+msgid "Use the new rich text editor to see your text and tables fully formatted as you type. No need to remember any formatting syntax, or switch between preview and editing modes!"
+msgstr ""
+
msgid "Use the public cloud instance URL (%{kroki_public_url}) or %{install_link_start}install Kroki%{install_link_end} on your own infrastructure and use your own instance URL."
msgstr ""
@@ -49731,9 +50053,6 @@ msgstr ""
msgid "UserList|created %{timeago}"
msgstr ""
-msgid "UserProfiles|No snippets found."
-msgstr ""
-
msgid "UserProfile|%{count} %{file}"
msgstr ""
@@ -49749,6 +50068,9 @@ msgstr ""
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49767,6 +50089,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49782,6 +50107,9 @@ msgstr ""
msgid "UserProfile|Following"
msgstr ""
+msgid "UserProfile|Get started with snippets"
+msgstr ""
+
msgid "UserProfile|Groups"
msgstr ""
@@ -49821,15 +50149,24 @@ msgstr ""
msgid "UserProfile|Starred projects"
msgstr ""
+msgid "UserProfile|Store, share, and embed bits of code and text."
+msgstr ""
+
msgid "UserProfile|Subscribe"
msgstr ""
msgid "UserProfile|There are no projects available to be displayed here."
msgstr ""
+msgid "UserProfile|This user doesn't have any followers"
+msgstr ""
+
msgid "UserProfile|This user doesn't have any followers."
msgstr ""
+msgid "UserProfile|This user doesn't have any snippets"
+msgstr ""
+
msgid "UserProfile|This user has a private profile"
msgstr ""
@@ -49842,12 +50179,18 @@ msgstr ""
msgid "UserProfile|This user is blocked"
msgstr ""
+msgid "UserProfile|This user isn't following other users"
+msgstr ""
+
msgid "UserProfile|This user isn't following other users."
msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49860,12 +50203,18 @@ msgstr ""
msgid "UserProfile|View user in admin area"
msgstr ""
+msgid "UserProfile|You are not following other users"
+msgstr ""
+
msgid "UserProfile|You are not following other users."
msgstr ""
msgid "UserProfile|You can create a group for several dependent projects."
msgstr ""
+msgid "UserProfile|You do not have any followers"
+msgstr ""
+
msgid "UserProfile|You do not have any followers."
msgstr ""
@@ -50097,7 +50446,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50223,7 +50572,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50238,9 +50587,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50322,11 +50668,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50353,9 +50694,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50410,9 +50748,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50430,6 +50765,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50442,9 +50780,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50799,6 +51134,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50853,6 +51191,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50928,6 +51269,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50985,9 +51329,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -51027,9 +51368,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -51048,9 +51386,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51228,6 +51563,9 @@ msgstr ""
msgid "Webhooks|A wiki page is created or updated."
msgstr ""
+msgid "Webhooks|An emoji is awarded or revoked. %{help_link}?"
+msgstr ""
+
msgid "Webhooks|An issue is created, updated, closed, or reopened."
msgstr ""
@@ -51438,6 +51776,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51507,6 +51848,9 @@ msgstr ""
msgid "Which API requests are affected?"
msgstr ""
+msgid "Which emoji events trigger webhooks"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -51624,16 +51968,13 @@ msgstr ""
msgid "WikiEmpty|You've enabled the Confluence Workspace integration. Your wiki will be viewable directly within Confluence. We are hard at work integrating Confluence more seamlessly into GitLab. If you'd like to stay up to date, follow our %{wiki_confluence_epic_link_start}Confluence epic%{wiki_confluence_epic_link_end}."
msgstr ""
-msgid "WikiHistoricalPage|This is an old version of this page."
-msgstr ""
-
-msgid "WikiHistoricalPage|You can view the %{most_recent_link} or browse the %{history_link}."
+msgid "WikiHistoricalPage|Browse history"
msgstr ""
-msgid "WikiHistoricalPage|history"
+msgid "WikiHistoricalPage|Go to most recent version"
msgstr ""
-msgid "WikiHistoricalPage|most recent version"
+msgid "WikiHistoricalPage|This is an old version of this page."
msgstr ""
msgid "WikiPageConfirmDelete|Are you sure you want to delete this page?"
@@ -51753,9 +52094,6 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
-msgid "Work Item promoted successfully."
-msgstr ""
-
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51765,6 +52103,9 @@ msgstr ""
msgid "Work in progress limit"
msgstr ""
+msgid "Work item promoted successfully."
+msgstr ""
+
msgid "WorkItem|%{count} more assignees"
msgstr ""
@@ -51878,9 +52219,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -52004,6 +52342,9 @@ msgstr ""
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while fetching work item award emojis. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while promoting the %{workItemType}. Please try again."
msgstr ""
@@ -52079,6 +52420,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -52175,6 +52519,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52211,6 +52558,9 @@ msgstr ""
msgid "Write your release notes or drag your files here…"
msgstr ""
+msgid "Writing just got easier"
+msgstr ""
+
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
@@ -52285,9 +52635,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52516,15 +52863,15 @@ msgstr ""
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}."
msgstr ""
-msgid "You can see your chat accounts."
-msgstr ""
-
msgid "You can set up jobs to only use runners with specific tags. Separate tags with commas."
msgstr ""
msgid "You can specify notification level per group or per project."
msgstr ""
+msgid "You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr ""
@@ -52588,6 +52935,12 @@ msgstr ""
msgid "You currently have no custom domains."
msgstr ""
+msgid "You do not belong to any groups yet."
+msgstr ""
+
+msgid "You do not belong to any projects yet."
+msgstr ""
+
msgid "You do not have access to any projects for creating incidents."
msgstr ""
@@ -53018,6 +53371,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -53069,6 +53428,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -53420,6 +53785,15 @@ msgstr ""
msgid "all"
msgstr ""
+msgid "all branches"
+msgstr ""
+
+msgid "all default branches"
+msgstr ""
+
+msgid "all protected branches"
+msgstr ""
+
msgid "allowed to fail"
msgstr ""
@@ -53655,27 +54029,6 @@ msgstr ""
msgid "ciReport|%{improvedNum} improved"
msgstr ""
-msgid "ciReport|%{linkStartTag}Learn more about API Fuzzing%{linkEndTag}"
-msgstr ""
-
-msgid "ciReport|%{linkStartTag}Learn more about Container Scanning %{linkEndTag}"
-msgstr ""
-
-msgid "ciReport|%{linkStartTag}Learn more about Coverage Fuzzing %{linkEndTag}"
-msgstr ""
-
-msgid "ciReport|%{linkStartTag}Learn more about DAST %{linkEndTag}"
-msgstr ""
-
-msgid "ciReport|%{linkStartTag}Learn more about Dependency Scanning %{linkEndTag}"
-msgstr ""
-
-msgid "ciReport|%{linkStartTag}Learn more about SAST %{linkEndTag}"
-msgstr ""
-
-msgid "ciReport|%{linkStartTag}Learn more about Secret Detection %{linkEndTag}"
-msgstr ""
-
msgid "ciReport|%{linkStartTag}Learn more about codequality reports %{linkEndTag}"
msgstr ""
@@ -53685,13 +54038,10 @@ msgstr ""
msgid "ciReport|%{remainingPackagesCount} more"
msgstr ""
-msgid "ciReport|%{reportType} is loading"
+msgid "ciReport|%{sameNum} same"
msgstr ""
-msgid "ciReport|%{reportType}: Loading resulted in an error"
-msgstr ""
-
-msgid "ciReport|%{sameNum} same"
+msgid "ciReport|%{scanner} detected %{atleastStart}at least%{atleastEnd} %{number} new potential %{vulnStr}"
msgstr ""
msgid "ciReport|%{scanner} detected %{number} new potential %{vulnStr}"
@@ -53709,9 +54059,6 @@ msgstr ""
msgid "ciReport|%{scanner}: Loading resulted in an error"
msgstr ""
-msgid "ciReport|: Loading resulted in an error"
-msgstr ""
-
msgid "ciReport|API Fuzzing"
msgstr ""
@@ -53781,18 +54128,12 @@ msgstr ""
msgid "ciReport|Container Scanning"
msgstr ""
-msgid "ciReport|Container Scanning detects known vulnerabilities in your container images."
-msgstr ""
-
msgid "ciReport|Container scanning"
msgstr ""
msgid "ciReport|Container scanning detects known vulnerabilities in your docker images."
msgstr ""
-msgid "ciReport|Could not dismiss vulnerability because the associated pipeline no longer exists. Refresh the page and try again."
-msgstr ""
-
msgid "ciReport|Coverage Fuzzing"
msgstr ""
@@ -53814,9 +54155,6 @@ msgstr ""
msgid "ciReport|Dependency Scanning"
msgstr ""
-msgid "ciReport|Dependency Scanning detects known vulnerabilities in your project's dependencies."
-msgstr ""
-
msgid "ciReport|Dependency scanning"
msgstr ""
@@ -53841,9 +54179,6 @@ msgstr ""
msgid "ciReport|Dynamic Application Security Testing (DAST)"
msgstr ""
-msgid "ciReport|Dynamic Application Security Testing (DAST) detects vulnerabilities in your web application."
-msgstr ""
-
msgid "ciReport|Failed to load %{reportName} report"
msgstr ""
@@ -53906,9 +54241,6 @@ msgstr ""
msgid "ciReport|Manually added"
msgstr ""
-msgid "ciReport|New"
-msgstr ""
-
msgid "ciReport|New vulnerabilities are vulnerabilities that the security scan detects in the merge request that are different to existing vulnerabilities in the default branch."
msgstr ""
@@ -53933,9 +54265,6 @@ msgstr ""
msgid "ciReport|Secret Detection"
msgstr ""
-msgid "ciReport|Secret Detection detects leaked credentials in your source code."
-msgstr ""
-
msgid "ciReport|Secret detection"
msgstr ""
@@ -53948,9 +54277,6 @@ msgstr ""
msgid "ciReport|Security scanning"
msgstr ""
-msgid "ciReport|Security scanning failed loading any results"
-msgstr ""
-
msgid "ciReport|Security scanning is loading"
msgstr ""
@@ -53966,9 +54292,6 @@ msgstr ""
msgid "ciReport|Static Application Security Testing (SAST)"
msgstr ""
-msgid "ciReport|Static Application Security Testing (SAST) detects potential vulnerabilities in your source code."
-msgstr ""
-
msgid "ciReport|TTFB P90"
msgstr ""
@@ -54010,12 +54333,6 @@ msgstr ""
msgid "ciReport|in"
msgstr ""
-msgid "ciReport|is loading"
-msgstr ""
-
-msgid "ciReport|is loading, errors when loading results"
-msgstr ""
-
msgid "closed"
msgstr ""
@@ -54023,10 +54340,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54249,18 +54565,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54367,7 +54671,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54376,6 +54680,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54740,9 +55047,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54864,9 +55168,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54930,16 +55231,13 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "mrWidget|Your merge request is almost ready!"
@@ -54981,6 +55279,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -55014,9 +55318,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -55096,7 +55397,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55373,6 +55676,9 @@ msgstr ""
msgid "source diff"
msgstr ""
+msgid "specific protected branches"
+msgstr ""
+
msgid "specified top is not part of the tree"
msgstr ""
@@ -55391,7 +55697,7 @@ msgstr ""
msgid "starts on %{timebox_start_date}"
msgstr ""
-msgid "structure is too large"
+msgid "structure is too large. Maximum size is %{max_size} characters"
msgstr ""
msgid "stuck"
@@ -55421,9 +55727,15 @@ msgstr ""
msgid "tag name"
msgstr ""
+msgid "targeting "
+msgstr ""
+
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55605,9 +55917,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/gl_ES/gitlab.po b/locale/gl_ES/gitlab.po
index 788e5e6b754..20c5c35bc70 100644
--- a/locale/gl_ES/gitlab.po
+++ b/locale/gl_ES/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: gl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:46\n"
+"PO-Revision-Date: 2023-07-11 04:48\n"
msgid " %{start} to %{end}"
msgstr " %{start} a %{end}"
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/he_IL/gitlab.po b/locale/he_IL/gitlab.po
index 19f39e8ccd3..f48980751a4 100644
--- a/locale/he_IL/gitlab.po
+++ b/locale/he_IL/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: he\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:44\n"
+"PO-Revision-Date: 2023-07-11 04:47\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -107,6 +107,20 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -212,6 +226,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -464,20 +485,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -850,9 +857,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -895,6 +899,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -967,7 +974,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -991,6 +1001,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1324,6 +1337,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1351,7 +1370,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1493,9 +1512,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -2231,6 +2247,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2684,6 +2706,9 @@ msgstr "×סימוני גישה"
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr "להמשיך?"
@@ -2702,12 +2727,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2726,6 +2757,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2735,6 +2775,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2786,13 +2829,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2903,9 +2946,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr "הוספת פגישת Zoom"
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2954,6 +2994,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr "הוספת רשימה ממוספרת"
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -3209,6 +3252,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -3230,9 +3276,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr "כתובת"
@@ -3656,22 +3699,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator email"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3755,6 +3789,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3824,9 +3861,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3836,9 +3870,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3869,10 +3900,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3881,9 +3912,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -4106,9 +4134,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -4154,6 +4179,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -4193,7 +4221,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4463,9 +4491,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4502,7 +4527,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4607,10 +4632,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4721,9 +4746,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4760,9 +4782,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4859,6 +4878,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -5024,6 +5046,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -5075,12 +5100,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -5123,6 +5142,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -5282,9 +5307,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5403,9 +5425,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5494,7 +5513,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5560,12 +5579,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5575,7 +5603,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5614,6 +5642,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5626,6 +5666,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5644,6 +5687,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5668,6 +5717,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6477,9 +6529,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6575,6 +6624,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6629,7 +6681,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6690,9 +6742,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6836,16 +6885,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6857,19 +6912,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Filter by audit event type"
+msgstr ""
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6878,6 +6948,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6905,10 +6978,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6920,6 +6990,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7457,28 +7533,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7649,6 +7725,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7676,10 +7755,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7739,10 +7815,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7754,7 +7830,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -8054,12 +8130,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -8124,9 +8206,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -8184,6 +8263,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8601,19 +8683,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8850,6 +8941,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9346,10 +9440,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9367,10 +9461,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9394,7 +9488,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9442,13 +9539,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9490,9 +9587,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9598,7 +9692,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9614,15 +9708,18 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
@@ -9630,9 +9727,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9672,7 +9766,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9813,10 +9907,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9843,7 +9937,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9891,6 +9985,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9918,16 +10015,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9942,6 +10039,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9969,6 +10069,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10342,6 +10445,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10399,6 +10505,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10994,9 +11103,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -11081,9 +11187,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -11144,9 +11247,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11390,6 +11490,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11435,6 +11538,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11450,10 +11559,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11549,15 +11655,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11652,18 +11767,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11790,15 +11899,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11808,6 +11932,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11844,10 +11974,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -12045,6 +12178,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -12090,13 +12226,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -12153,9 +12289,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -12192,9 +12325,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12357,15 +12487,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12759,9 +12883,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12885,6 +13006,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -13014,9 +13168,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -13182,6 +13333,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -13236,9 +13390,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -13281,6 +13432,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13566,6 +13720,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13710,9 +13867,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14940,6 +15094,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -15209,6 +15369,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -15333,6 +15496,12 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15375,9 +15544,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15411,6 +15586,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15429,6 +15607,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15453,6 +15634,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15462,6 +15646,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15780,9 +15967,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15937,12 +16121,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15952,9 +16130,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16713,7 +16888,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16758,15 +16933,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -17052,6 +17227,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -17157,6 +17335,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17493,9 +17674,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17556,9 +17734,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17586,16 +17761,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
+msgstr ""
+
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17760,9 +17938,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17775,9 +17950,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17973,12 +18145,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17994,9 +18160,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18953,12 +19116,18 @@ msgstr[3] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18999,9 +19168,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -19146,6 +19312,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -19167,6 +19336,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -19233,9 +19405,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19540,6 +19709,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19771,9 +19943,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19783,6 +19952,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19967,6 +20139,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -20027,6 +20202,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -20084,6 +20262,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20704,9 +20885,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -21187,6 +21365,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -21226,6 +21407,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -21244,6 +21428,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -21256,6 +21443,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -21292,6 +21482,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21721,9 +21914,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -22015,6 +22205,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22692,12 +22885,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22812,13 +22999,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "Hide comments"
msgstr ""
@@ -22967,12 +23147,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23599,6 +23791,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23660,6 +23855,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24482,6 +24680,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24599,7 +24803,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24632,9 +24836,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25714,6 +25915,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -26071,9 +26275,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -26308,6 +26518,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -26326,6 +26539,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26491,6 +26707,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26653,6 +26872,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26716,9 +26941,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26940,6 +27162,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27592,9 +27817,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27742,7 +27964,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27808,6 +28030,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -28000,6 +28225,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -28033,6 +28261,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -28090,6 +28321,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -28114,9 +28348,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -28216,7 +28447,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -28267,7 +28498,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -28294,7 +28525,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -28303,7 +28534,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -28339,7 +28570,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -28360,7 +28591,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -28381,12 +28615,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -28411,7 +28651,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28444,7 +28684,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28795,6 +29035,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28813,6 +29056,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28930,9 +29176,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28960,9 +29203,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28987,6 +29227,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -29053,6 +29296,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -29149,9 +29404,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -29206,217 +29458,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -29426,24 +29506,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29832,6 +29900,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29868,6 +29939,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29928,9 +30002,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -30108,6 +30179,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30860,12 +30937,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -31004,9 +31075,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -31049,6 +31117,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -31194,9 +31265,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31501,6 +31569,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31606,18 +31677,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
+msgstr ""
+
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31792,6 +31869,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32472,6 +32552,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32995,6 +33081,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33565,9 +33663,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33769,6 +33864,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33778,6 +33882,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33835,9 +33942,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -34024,9 +34128,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -34138,6 +34239,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -34189,9 +34293,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -34210,7 +34311,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -34270,9 +34371,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -34339,6 +34446,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -34423,6 +34536,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34549,9 +34665,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34702,7 +34815,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -35218,6 +35331,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -35257,6 +35373,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -35398,6 +35517,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35914,9 +36036,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -36454,18 +36573,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36649,9 +36756,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36673,9 +36777,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36712,10 +36813,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -37198,6 +37296,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -37213,6 +37314,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -38001,9 +38105,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -38076,6 +38177,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -38260,7 +38364,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -38272,7 +38376,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -38287,18 +38391,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38516,13 +38608,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38783,6 +38875,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38807,6 +38902,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38825,6 +38923,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -39236,7 +39337,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39621,9 +39722,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39669,12 +39767,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39835,6 +39942,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39940,6 +40050,9 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
@@ -39947,6 +40060,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -40007,9 +40123,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -40185,6 +40298,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -40438,7 +40558,11 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d 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[3] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40759,10 +40883,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40771,12 +40898,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40795,6 +40943,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40810,6 +40961,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40819,6 +40973,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40831,6 +40988,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40852,6 +41015,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40900,6 +41066,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -41364,7 +41533,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -41388,9 +41557,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -41475,9 +41641,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41592,6 +41755,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41715,6 +41881,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41757,7 +41926,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41902,6 +42071,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -42295,6 +42467,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -42475,7 +42650,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42538,10 +42713,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42688,6 +42869,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42718,6 +42902,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42727,6 +42914,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42736,6 +42929,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42763,6 +42959,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -43073,6 +43275,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -43157,7 +43368,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -43166,9 +43377,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -43479,7 +43687,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43704,6 +43912,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -44274,6 +44485,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -44412,9 +44626,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44616,9 +44827,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44667,7 +44875,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -45102,6 +45310,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -45331,10 +45545,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45598,7 +45812,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45686,6 +45900,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45862,9 +46091,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -46123,9 +46349,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -46204,13 +46427,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -46410,9 +46633,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -46428,9 +46657,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46557,6 +46783,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46785,6 +47014,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46995,6 +47227,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -47136,6 +47371,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -47517,9 +47755,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47691,9 +47926,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47973,6 +48205,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -48062,13 +48297,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -48137,6 +48369,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -48164,9 +48399,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -48240,6 +48472,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -48249,6 +48484,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -48420,9 +48661,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -48432,6 +48670,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -48480,12 +48721,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -48562,6 +48797,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48893,12 +49131,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48956,9 +49188,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -49142,9 +49371,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -49196,7 +49422,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -49217,6 +49443,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -49226,9 +49455,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -49508,7 +49734,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -49556,6 +49782,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49595,16 +49824,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49664,7 +49887,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49971,6 +50200,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -50124,9 +50356,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -50145,6 +50383,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -50226,6 +50467,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -50475,7 +50719,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50601,7 +50845,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50616,9 +50860,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50700,13 +50941,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50735,9 +50969,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50792,9 +51023,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50814,6 +51042,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50826,9 +51057,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -51183,6 +51411,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -51237,6 +51468,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -51312,6 +51546,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -51369,9 +51606,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -51411,9 +51645,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -51432,9 +51663,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51822,6 +52050,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -52143,6 +52374,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -52240,6 +52474,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -52264,9 +52501,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -52381,6 +52615,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -52459,6 +52699,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -52555,6 +52798,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52667,9 +52913,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52958,6 +53201,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -53401,6 +53647,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -53452,6 +53704,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -53512,7 +53770,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53676,10 +53934,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53979,7 +54240,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -54429,10 +54690,11 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "comment"
msgstr ""
@@ -54663,18 +54925,6 @@ msgstr[3] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54785,7 +55035,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54794,6 +55044,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54986,9 +55239,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -55171,9 +55421,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -55299,9 +55546,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -55365,16 +55609,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -55413,6 +55657,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -55446,9 +55696,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -55528,7 +55775,11 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "or"
msgstr ""
@@ -55870,6 +56121,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55927,9 +56181,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -56058,9 +56309,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/hi_IN/gitlab.po b/locale/hi_IN/gitlab.po
index 1cc6f390e2c..a58fc3c4e8b 100644
--- a/locale/hi_IN/gitlab.po
+++ b/locale/hi_IN/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: hi\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:47\n"
+"PO-Revision-Date: 2023-07-11 04:49\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/hr_HR/gitlab.po b/locale/hr_HR/gitlab.po
index 582ee399dba..de550b50587 100644
--- a/locale/hr_HR/gitlab.po
+++ b/locale/hr_HR/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: hr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:46\n"
+"PO-Revision-Date: 2023-07-11 04:49\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -103,6 +103,18 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -193,6 +205,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -409,18 +427,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -754,9 +760,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -799,6 +802,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -871,7 +877,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -895,6 +904,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1219,6 +1231,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1246,7 +1264,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1378,9 +1396,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -2089,6 +2104,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2542,6 +2563,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2560,12 +2584,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2584,6 +2614,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2593,6 +2632,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2644,13 +2686,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2761,9 +2803,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2812,6 +2851,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -3067,6 +3109,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -3088,9 +3133,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3514,22 +3556,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator email"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3613,6 +3646,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3682,9 +3718,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3694,9 +3727,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3727,10 +3757,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3739,9 +3769,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3964,9 +3991,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -4012,6 +4036,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -4051,7 +4078,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4321,9 +4348,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4360,7 +4384,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4465,10 +4489,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4579,9 +4603,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4618,9 +4639,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4717,6 +4735,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4882,6 +4903,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4933,12 +4957,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4981,6 +4999,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -5140,9 +5164,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5260,9 +5281,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5350,7 +5368,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5416,12 +5434,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5431,7 +5458,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5470,6 +5497,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5482,6 +5521,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5500,6 +5542,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5524,6 +5572,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6322,9 +6373,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6415,6 +6463,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6469,7 +6520,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6529,9 +6580,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6673,16 +6721,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6694,19 +6748,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6715,6 +6784,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6742,10 +6814,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6757,6 +6826,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7294,28 +7369,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7486,6 +7561,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7513,10 +7591,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7576,10 +7651,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7591,7 +7666,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7888,12 +7963,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7957,9 +8038,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -8017,6 +8095,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8434,19 +8515,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8683,6 +8773,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9178,10 +9271,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9199,10 +9292,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9226,7 +9319,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9274,13 +9370,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9322,9 +9418,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9430,7 +9523,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9445,24 +9538,24 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9502,7 +9595,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9643,10 +9736,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9673,7 +9766,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9721,6 +9814,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9748,16 +9844,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9772,6 +9868,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9799,6 +9898,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10171,6 +10273,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10228,6 +10333,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10822,9 +10930,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10909,9 +11014,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10972,9 +11074,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11218,6 +11317,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11263,6 +11365,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11278,10 +11386,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11377,15 +11482,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11479,18 +11593,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11617,15 +11725,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11635,6 +11758,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11671,10 +11800,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export full report as CSV"
+msgstr ""
+
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11872,6 +12004,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11917,13 +12052,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11980,9 +12115,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -12019,9 +12151,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12184,15 +12313,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12583,9 +12706,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12709,6 +12829,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12838,9 +12991,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -13006,6 +13156,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -13060,9 +13213,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -13105,6 +13255,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13390,6 +13543,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13534,9 +13690,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14761,6 +14914,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -15028,6 +15187,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -15148,6 +15310,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15190,9 +15358,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15226,6 +15400,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15244,6 +15421,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15268,6 +15448,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15277,6 +15460,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15592,9 +15778,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15748,12 +15931,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15763,9 +15940,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16519,7 +16693,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16564,15 +16738,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16858,6 +17032,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16963,6 +17140,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17299,9 +17479,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17362,9 +17539,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17392,16 +17566,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
+msgstr ""
+
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17566,9 +17743,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17581,9 +17755,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17779,12 +17950,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17800,9 +17965,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18757,12 +18919,18 @@ msgstr[2] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18802,9 +18970,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18949,6 +19114,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18970,6 +19138,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -19036,9 +19207,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19342,6 +19510,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19573,9 +19744,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19585,6 +19753,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19768,6 +19939,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19828,6 +20002,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19885,6 +20062,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20503,9 +20683,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20986,6 +21163,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -21025,6 +21205,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -21043,6 +21226,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -21055,6 +21241,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -21091,6 +21280,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21520,9 +21712,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21814,6 +22003,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22489,12 +22681,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22609,12 +22795,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "Hide comments"
msgstr ""
@@ -22762,12 +22942,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23392,6 +23584,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23452,6 +23647,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24274,6 +24472,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24391,7 +24595,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24424,9 +24628,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25504,6 +25705,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25861,9 +26065,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -26098,6 +26308,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -26116,6 +26329,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26281,6 +26497,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26443,6 +26662,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26506,9 +26731,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26728,6 +26950,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27373,9 +27598,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27523,7 +27745,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27589,6 +27811,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27781,6 +28006,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27814,6 +28042,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27871,6 +28102,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27895,9 +28129,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27997,7 +28228,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -28048,7 +28279,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -28075,7 +28306,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -28084,7 +28315,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -28120,7 +28351,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -28141,7 +28372,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -28162,12 +28396,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -28192,7 +28432,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28225,7 +28465,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28573,6 +28813,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28591,6 +28834,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28708,9 +28954,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28738,9 +28981,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28765,6 +29005,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28831,6 +29074,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28927,9 +29182,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28984,216 +29236,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -29203,24 +29284,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29608,6 +29677,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29644,6 +29716,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29704,9 +29779,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29884,6 +29956,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30634,12 +30712,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30778,9 +30850,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30823,6 +30892,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30967,9 +31039,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31270,6 +31339,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31375,18 +31447,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31561,6 +31639,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32239,6 +32320,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32761,6 +32848,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33331,9 +33430,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33535,6 +33631,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33544,6 +33649,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33601,9 +33709,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33790,9 +33895,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33904,6 +34006,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33955,9 +34060,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33976,7 +34078,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -34036,9 +34138,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -34105,6 +34213,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -34189,6 +34303,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34315,9 +34432,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34468,7 +34582,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34984,6 +35098,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -35023,6 +35140,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -35164,6 +35284,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35680,9 +35803,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -36220,18 +36340,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36415,9 +36523,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36439,9 +36544,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36478,10 +36580,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36964,6 +37063,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36979,6 +37081,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37765,9 +37870,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37840,6 +37942,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -38023,7 +38128,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -38035,7 +38140,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -38050,18 +38155,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38278,13 +38371,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38545,6 +38638,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38569,6 +38665,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38587,6 +38686,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38992,7 +39094,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39373,9 +39475,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39421,12 +39520,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39583,6 +39691,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39688,12 +39799,18 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39754,9 +39871,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39931,6 +40045,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -40184,7 +40304,10 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d 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] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40504,10 +40627,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40516,12 +40642,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40540,6 +40687,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40555,6 +40705,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40564,6 +40717,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40576,6 +40732,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40597,6 +40759,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40645,6 +40810,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -41098,7 +41266,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -41122,9 +41290,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -41209,9 +41374,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41326,6 +41488,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41449,6 +41614,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41491,7 +41659,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41635,6 +41803,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -42028,6 +42199,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -42208,7 +42382,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42271,10 +42445,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42421,6 +42601,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42451,6 +42634,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42460,6 +42646,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42469,6 +42661,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42496,6 +42691,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42805,6 +43006,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42889,7 +43099,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42898,9 +43108,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -43210,7 +43417,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43435,6 +43642,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -44005,6 +44215,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -44143,9 +44356,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44347,9 +44557,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44398,7 +44605,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44833,6 +45040,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -45061,10 +45274,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45328,7 +45541,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45415,6 +45628,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45589,9 +45817,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45847,9 +46072,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45928,13 +46150,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -46132,9 +46354,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -46150,9 +46378,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46279,6 +46504,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46507,6 +46735,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46717,6 +46948,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46858,6 +47092,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -47239,9 +47476,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47413,9 +47647,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47695,6 +47926,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47782,13 +48016,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47857,6 +48088,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47884,9 +48118,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47959,6 +48190,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47968,6 +48202,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -48139,9 +48379,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -48151,6 +48388,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -48199,12 +48439,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -48280,6 +48514,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48610,12 +48847,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48673,9 +48904,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48859,9 +49087,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48913,7 +49138,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48934,6 +49159,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48943,9 +49171,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -49225,7 +49450,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -49273,6 +49498,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49312,16 +49540,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49381,7 +49603,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49687,6 +49915,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49840,9 +50071,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49861,6 +50098,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49942,6 +50182,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -50191,7 +50434,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50317,7 +50560,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50332,9 +50575,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50416,12 +50656,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50449,9 +50683,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50506,9 +50737,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50527,6 +50755,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50539,9 +50770,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50896,6 +51124,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50950,6 +51181,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -51025,6 +51259,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -51082,9 +51319,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -51124,9 +51358,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -51145,9 +51376,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51535,6 +51763,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51853,6 +52084,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51949,6 +52183,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51973,9 +52210,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -52090,6 +52324,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -52168,6 +52408,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -52264,6 +52507,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52375,9 +52621,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52666,6 +52909,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -53107,6 +53353,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -53158,6 +53410,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -53218,7 +53476,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53380,10 +53638,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53680,7 +53941,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -54122,10 +54383,10 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "comment"
msgstr ""
@@ -54352,18 +54613,6 @@ msgstr[2] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54472,7 +54721,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54481,6 +54730,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54670,9 +54922,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54853,9 +55102,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54979,9 +55225,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -55045,16 +55288,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -55093,6 +55336,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -55126,9 +55375,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -55208,7 +55454,10 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "or"
msgstr ""
@@ -55543,6 +55792,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55600,9 +55852,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55729,9 +55978,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/hu_HU/gitlab.po b/locale/hu_HU/gitlab.po
index bfa889081c7..c72f8bdd27a 100644
--- a/locale/hu_HU/gitlab.po
+++ b/locale/hu_HU/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: hu\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:44\n"
+"PO-Revision-Date: 2023-07-11 04:47\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/hy_AM/gitlab.po b/locale/hy_AM/gitlab.po
index 45e9c835883..67687960417 100644
--- a/locale/hy_AM/gitlab.po
+++ b/locale/hy_AM/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: hy-AM\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:44\n"
+"PO-Revision-Date: 2023-07-11 04:47\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/id_ID/gitlab.po b/locale/id_ID/gitlab.po
index 84c50162e25..8fd129da8a6 100644
--- a/locale/id_ID/gitlab.po
+++ b/locale/id_ID/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: id\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:46\n"
+"PO-Revision-Date: 2023-07-11 04:49\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -95,6 +95,14 @@ msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -155,6 +163,10 @@ msgid "%d assigned issue"
msgid_plural "%d assigned issues"
msgstr[0] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -299,14 +311,6 @@ msgid "%d more comment"
msgid_plural "%d more comments"
msgstr[0] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -562,9 +566,6 @@ msgid "%{count} project"
msgid_plural "%{count} projects"
msgstr[0] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -607,6 +608,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -679,7 +683,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -703,6 +710,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1009,6 +1019,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1036,7 +1052,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1148,9 +1164,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1805,6 +1818,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2258,6 +2277,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2276,12 +2298,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2300,6 +2328,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2309,6 +2346,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2360,13 +2400,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2477,9 +2517,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2528,6 +2565,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2783,6 +2823,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2804,9 +2847,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3230,22 +3270,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3329,6 +3360,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3398,9 +3432,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3410,9 +3441,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3443,10 +3471,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3455,9 +3483,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3680,9 +3705,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3728,6 +3750,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3767,7 +3792,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4037,9 +4062,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4076,7 +4098,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4181,10 +4203,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4295,9 +4317,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4334,9 +4353,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4433,6 +4449,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4598,6 +4617,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4649,12 +4671,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4697,6 +4713,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4856,9 +4878,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -4974,9 +4993,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5062,7 +5078,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5128,12 +5144,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5143,7 +5168,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5182,6 +5207,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5194,6 +5231,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5212,6 +5252,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5236,6 +5282,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6012,9 +6061,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6095,6 +6141,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6149,7 +6198,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6207,9 +6256,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6347,16 +6393,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6368,19 +6420,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Filter by audit event type"
+msgstr ""
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6389,6 +6456,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6416,10 +6486,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6431,6 +6498,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -6968,28 +7041,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7160,6 +7233,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7187,10 +7263,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7250,10 +7323,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7265,7 +7338,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7556,12 +7629,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7623,9 +7702,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7683,6 +7759,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8100,19 +8179,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8349,6 +8437,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -8842,10 +8933,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -8863,10 +8954,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -8890,7 +8981,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -8938,13 +9032,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -8986,9 +9080,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9094,7 +9185,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9107,22 +9198,22 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9162,7 +9253,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9303,10 +9394,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9333,7 +9424,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9381,6 +9472,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9408,16 +9502,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9432,6 +9526,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9459,6 +9556,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -9829,6 +9929,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -9886,6 +9989,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10478,9 +10584,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10565,9 +10668,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10628,9 +10728,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -10874,6 +10971,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -10919,6 +11019,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -10934,10 +11040,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11033,15 +11136,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11133,18 +11245,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11271,15 +11377,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11289,6 +11410,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11325,10 +11452,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export full report as CSV"
+msgstr ""
+
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11526,6 +11656,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11571,13 +11704,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11634,9 +11767,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11673,9 +11803,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -11838,15 +11965,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12231,9 +12352,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12357,6 +12475,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12486,9 +12637,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12654,6 +12802,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12708,9 +12859,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12753,6 +12901,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13038,6 +13189,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13182,9 +13336,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14403,6 +14554,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14666,6 +14823,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14778,6 +14938,12 @@ msgid "Dependencies|%d vulnerability detected"
msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -14820,9 +14986,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -14856,6 +15028,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -14874,6 +15049,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -14898,6 +15076,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -14907,6 +15088,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15216,9 +15400,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15370,12 +15551,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15385,9 +15560,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16131,7 +16303,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16176,15 +16348,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16470,6 +16642,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16575,6 +16750,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -16911,9 +17089,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -16974,9 +17149,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17004,16 +17176,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
+msgstr ""
+
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17178,9 +17353,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17193,9 +17365,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17391,12 +17560,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17412,9 +17575,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18365,12 +18525,18 @@ msgstr[0] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18408,9 +18574,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18555,6 +18718,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18576,6 +18742,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18642,9 +18811,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -18946,6 +19112,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19177,9 +19346,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19189,6 +19355,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19370,6 +19539,9 @@ msgid "Free groups are limited to %{free_user_limit} member and the remaining me
msgid_plural "Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group."
msgstr[0] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19430,6 +19602,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19487,6 +19662,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20101,9 +20279,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20584,6 +20759,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20623,6 +20801,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20641,6 +20822,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20653,6 +20837,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20689,6 +20876,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21118,9 +21308,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21412,6 +21599,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22083,12 +22273,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22203,10 +22387,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-
msgid "Hide comments"
msgstr ""
@@ -22352,12 +22532,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -22978,6 +23170,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23036,6 +23231,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -23858,6 +24056,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -23975,7 +24179,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24008,9 +24212,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25084,6 +25285,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25441,9 +25645,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25678,6 +25888,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25696,6 +25909,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -25861,6 +26077,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26023,6 +26242,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26086,9 +26311,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26304,6 +26526,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -26935,9 +27160,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27085,7 +27307,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27151,6 +27373,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27343,6 +27568,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27376,6 +27604,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27433,6 +27664,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27457,9 +27691,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27559,7 +27790,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27610,7 +27841,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27637,7 +27868,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27646,7 +27877,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27682,7 +27913,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27703,7 +27934,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27724,12 +27958,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27754,7 +27994,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -27787,7 +28027,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28129,6 +28369,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28147,6 +28390,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28264,9 +28510,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28294,9 +28537,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28321,6 +28561,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28387,6 +28630,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28483,9 +28738,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28540,214 +28792,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28757,24 +28840,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29160,6 +29231,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29196,6 +29270,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29256,9 +29333,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29436,6 +29510,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30182,12 +30262,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30326,9 +30400,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30371,6 +30442,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30513,9 +30587,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -30808,6 +30879,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -30913,18 +30987,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31099,6 +31179,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -31773,6 +31856,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32293,6 +32382,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -32863,9 +32964,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33067,6 +33165,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33076,6 +33183,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33133,9 +33243,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33322,9 +33429,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33436,6 +33540,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33487,9 +33594,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33508,7 +33612,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33568,9 +33672,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33637,6 +33747,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33721,6 +33837,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -33847,9 +33966,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34000,7 +34116,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34516,6 +34632,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34555,6 +34674,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34696,6 +34818,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35212,9 +35337,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35752,18 +35874,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -35947,9 +36057,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -35971,9 +36078,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36010,10 +36114,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36496,6 +36597,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36511,6 +36615,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37293,9 +37400,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37368,6 +37472,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37549,7 +37656,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37561,7 +37668,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37576,18 +37683,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -37802,13 +37897,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38069,6 +38164,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38093,6 +38191,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38111,6 +38212,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38504,7 +38608,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -38877,9 +38981,6 @@ msgid "Reviewer"
msgid_plural "%d Reviewers"
msgstr[0] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -38925,12 +39026,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39079,6 +39189,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39184,10 +39297,16 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39248,9 +39367,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39423,6 +39539,10 @@ msgid "Runners|Permanently delete %d runner"
msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39676,7 +39796,8 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d 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] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -39994,10 +40115,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40006,12 +40130,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40030,6 +40175,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40045,6 +40193,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40054,6 +40205,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40066,6 +40220,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40087,6 +40247,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40135,6 +40298,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40566,7 +40732,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40590,9 +40756,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40677,9 +40840,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -40794,6 +40954,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -40917,6 +41080,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -40959,7 +41125,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41101,6 +41267,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41494,6 +41663,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41674,7 +41846,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -41737,10 +41909,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -41887,6 +42065,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -41917,6 +42098,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -41926,6 +42110,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -41935,6 +42125,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -41962,6 +42155,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42269,6 +42468,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42353,7 +42561,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42362,9 +42570,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42672,7 +42877,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -42897,6 +43102,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43467,6 +43675,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43605,9 +43816,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -43809,9 +44017,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -43860,7 +44065,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44295,6 +44500,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44521,10 +44732,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -44788,7 +44999,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -44873,6 +45084,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45043,9 +45269,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45295,9 +45518,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45376,13 +45596,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45576,9 +45796,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45594,9 +45820,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -45723,6 +45946,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -45951,6 +46177,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46161,6 +46390,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46302,6 +46534,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46683,9 +46918,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -46857,9 +47089,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47139,6 +47368,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47222,13 +47454,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47297,6 +47526,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47324,9 +47556,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47397,6 +47626,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47406,6 +47638,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47577,9 +47815,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47589,6 +47824,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47637,12 +47875,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47716,6 +47948,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48044,12 +48279,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48107,9 +48336,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48293,9 +48519,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48347,7 +48570,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48368,6 +48591,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48377,9 +48603,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48659,7 +48882,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48707,6 +48930,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -48746,16 +48972,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -48815,7 +49035,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49119,6 +49345,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49272,9 +49501,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49293,6 +49528,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49374,6 +49612,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49623,7 +49864,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -49749,7 +49990,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -49764,9 +50005,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -49848,10 +50086,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -49877,9 +50111,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -49934,9 +50165,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -49953,6 +50181,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -49965,9 +50196,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50322,6 +50550,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50376,6 +50607,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50451,6 +50685,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50508,9 +50745,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50550,9 +50784,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50571,9 +50802,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -50961,6 +51189,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51273,6 +51504,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51367,6 +51601,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51391,9 +51628,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51508,6 +51742,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51586,6 +51826,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51682,6 +51925,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -51791,9 +52037,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52082,6 +52325,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52519,6 +52765,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52570,6 +52822,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52630,7 +52888,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -52788,10 +53046,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53082,7 +53343,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53508,10 +53769,8 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
msgid "comment"
msgstr ""
@@ -53730,18 +53989,6 @@ msgstr[0] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -53846,7 +54093,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -53855,6 +54102,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54038,9 +54288,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54217,9 +54464,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54339,9 +54583,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54405,16 +54646,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54453,6 +54694,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54486,9 +54733,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54568,7 +54812,8 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
msgid "or"
msgstr ""
@@ -54889,6 +55134,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -54946,9 +55194,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55071,9 +55316,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/ig_NG/gitlab.po b/locale/ig_NG/gitlab.po
index 197a5bebd3a..9d816985e13 100644
--- a/locale/ig_NG/gitlab.po
+++ b/locale/ig_NG/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ig\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:48\n"
+"PO-Revision-Date: 2023-07-11 04:51\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -95,6 +95,14 @@ msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -155,6 +163,10 @@ msgid "%d assigned issue"
msgid_plural "%d assigned issues"
msgstr[0] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -299,14 +311,6 @@ msgid "%d more comment"
msgid_plural "%d more comments"
msgstr[0] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -562,9 +566,6 @@ msgid "%{count} project"
msgid_plural "%{count} projects"
msgstr[0] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -607,6 +608,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -679,7 +683,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -703,6 +710,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1009,6 +1019,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1036,7 +1052,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1148,9 +1164,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1805,6 +1818,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2258,6 +2277,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2276,12 +2298,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2300,6 +2328,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2309,6 +2346,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2360,13 +2400,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2477,9 +2517,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2528,6 +2565,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2783,6 +2823,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2804,9 +2847,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3230,22 +3270,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3329,6 +3360,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3398,9 +3432,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3410,9 +3441,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3443,10 +3471,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3455,9 +3483,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3680,9 +3705,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3728,6 +3750,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3767,7 +3792,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4037,9 +4062,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4076,7 +4098,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4181,10 +4203,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4295,9 +4317,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4334,9 +4353,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4433,6 +4449,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4598,6 +4617,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4649,12 +4671,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4697,6 +4713,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4856,9 +4878,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -4974,9 +4993,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5062,7 +5078,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5128,12 +5144,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5143,7 +5168,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5182,6 +5207,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5194,6 +5231,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5212,6 +5252,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5236,6 +5282,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6012,9 +6061,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6095,6 +6141,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6149,7 +6198,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6207,9 +6256,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6347,16 +6393,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6368,19 +6420,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Filter by audit event type"
+msgstr ""
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6389,6 +6456,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6416,10 +6486,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6431,6 +6498,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -6968,28 +7041,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7160,6 +7233,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7187,10 +7263,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7250,10 +7323,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7265,7 +7338,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7556,12 +7629,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7623,9 +7702,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7683,6 +7759,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8100,19 +8179,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8349,6 +8437,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -8842,10 +8933,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -8863,10 +8954,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -8890,7 +8981,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -8938,13 +9032,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -8986,9 +9080,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9094,7 +9185,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9107,22 +9198,22 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9162,7 +9253,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9303,10 +9394,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9333,7 +9424,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9381,6 +9472,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9408,16 +9502,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9432,6 +9526,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9459,6 +9556,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -9829,6 +9929,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -9886,6 +9989,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10478,9 +10584,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10565,9 +10668,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10628,9 +10728,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -10874,6 +10971,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -10919,6 +11019,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -10934,10 +11040,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11033,15 +11136,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11133,18 +11245,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11271,15 +11377,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11289,6 +11410,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11325,10 +11452,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export full report as CSV"
+msgstr ""
+
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11526,6 +11656,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11571,13 +11704,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11634,9 +11767,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11673,9 +11803,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -11838,15 +11965,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12231,9 +12352,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12357,6 +12475,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12486,9 +12637,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12654,6 +12802,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12708,9 +12859,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12753,6 +12901,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13038,6 +13189,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13182,9 +13336,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14403,6 +14554,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14666,6 +14823,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14778,6 +14938,12 @@ msgid "Dependencies|%d vulnerability detected"
msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -14820,9 +14986,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -14856,6 +15028,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -14874,6 +15049,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -14898,6 +15076,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -14907,6 +15088,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15216,9 +15400,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15370,12 +15551,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15385,9 +15560,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16131,7 +16303,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16176,15 +16348,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16470,6 +16642,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16575,6 +16750,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -16911,9 +17089,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -16974,9 +17149,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17004,16 +17176,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
+msgstr ""
+
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17178,9 +17353,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17193,9 +17365,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17391,12 +17560,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17412,9 +17575,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18365,12 +18525,18 @@ msgstr[0] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18408,9 +18574,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18555,6 +18718,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18576,6 +18742,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18642,9 +18811,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -18946,6 +19112,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19177,9 +19346,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19189,6 +19355,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19370,6 +19539,9 @@ msgid "Free groups are limited to %{free_user_limit} member and the remaining me
msgid_plural "Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group."
msgstr[0] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19430,6 +19602,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19487,6 +19662,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20101,9 +20279,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20584,6 +20759,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20623,6 +20801,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20641,6 +20822,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20653,6 +20837,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20689,6 +20876,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21118,9 +21308,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21412,6 +21599,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22083,12 +22273,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22203,10 +22387,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-
msgid "Hide comments"
msgstr ""
@@ -22352,12 +22532,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -22978,6 +23170,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23036,6 +23231,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -23858,6 +24056,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -23975,7 +24179,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24008,9 +24212,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25084,6 +25285,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25441,9 +25645,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25678,6 +25888,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25696,6 +25909,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -25861,6 +26077,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26023,6 +26242,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26086,9 +26311,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26304,6 +26526,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -26935,9 +27160,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27085,7 +27307,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27151,6 +27373,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27343,6 +27568,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27376,6 +27604,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27433,6 +27664,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27457,9 +27691,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27559,7 +27790,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27610,7 +27841,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27637,7 +27868,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27646,7 +27877,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27682,7 +27913,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27703,7 +27934,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27724,12 +27958,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27754,7 +27994,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -27787,7 +28027,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28129,6 +28369,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28147,6 +28390,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28264,9 +28510,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28294,9 +28537,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28321,6 +28561,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28387,6 +28630,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28483,9 +28738,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28540,214 +28792,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28757,24 +28840,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29160,6 +29231,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29196,6 +29270,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29256,9 +29333,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29436,6 +29510,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30182,12 +30262,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30326,9 +30400,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30371,6 +30442,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30513,9 +30587,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -30808,6 +30879,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -30913,18 +30987,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31099,6 +31179,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -31773,6 +31856,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32293,6 +32382,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -32863,9 +32964,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33067,6 +33165,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33076,6 +33183,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33133,9 +33243,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33322,9 +33429,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33436,6 +33540,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33487,9 +33594,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33508,7 +33612,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33568,9 +33672,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33637,6 +33747,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33721,6 +33837,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -33847,9 +33966,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34000,7 +34116,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34516,6 +34632,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34555,6 +34674,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34696,6 +34818,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35212,9 +35337,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35752,18 +35874,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -35947,9 +36057,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -35971,9 +36078,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36010,10 +36114,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36496,6 +36597,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36511,6 +36615,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37293,9 +37400,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37368,6 +37472,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37549,7 +37656,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37561,7 +37668,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37576,18 +37683,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -37802,13 +37897,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38069,6 +38164,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38093,6 +38191,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38111,6 +38212,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38504,7 +38608,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -38877,9 +38981,6 @@ msgid "Reviewer"
msgid_plural "%d Reviewers"
msgstr[0] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -38925,12 +39026,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39079,6 +39189,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39184,10 +39297,16 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39248,9 +39367,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39423,6 +39539,10 @@ msgid "Runners|Permanently delete %d runner"
msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39676,7 +39796,8 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d 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] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -39994,10 +40115,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40006,12 +40130,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40030,6 +40175,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40045,6 +40193,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40054,6 +40205,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40066,6 +40220,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40087,6 +40247,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40135,6 +40298,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40566,7 +40732,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40590,9 +40756,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40677,9 +40840,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -40794,6 +40954,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -40917,6 +41080,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -40959,7 +41125,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41101,6 +41267,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41494,6 +41663,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41674,7 +41846,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -41737,10 +41909,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -41887,6 +42065,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -41917,6 +42098,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -41926,6 +42110,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -41935,6 +42125,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -41962,6 +42155,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42269,6 +42468,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42353,7 +42561,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42362,9 +42570,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42672,7 +42877,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -42897,6 +43102,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43467,6 +43675,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43605,9 +43816,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -43809,9 +44017,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -43860,7 +44065,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44295,6 +44500,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44521,10 +44732,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -44788,7 +44999,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -44873,6 +45084,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45043,9 +45269,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45295,9 +45518,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45376,13 +45596,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45576,9 +45796,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45594,9 +45820,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -45723,6 +45946,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -45951,6 +46177,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46161,6 +46390,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46302,6 +46534,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46683,9 +46918,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -46857,9 +47089,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47139,6 +47368,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47222,13 +47454,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47297,6 +47526,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47324,9 +47556,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47397,6 +47626,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47406,6 +47638,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47577,9 +47815,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47589,6 +47824,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47637,12 +47875,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47716,6 +47948,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48044,12 +48279,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48107,9 +48336,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48293,9 +48519,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48347,7 +48570,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48368,6 +48591,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48377,9 +48603,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48659,7 +48882,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48707,6 +48930,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -48746,16 +48972,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -48815,7 +49035,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49119,6 +49345,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49272,9 +49501,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49293,6 +49528,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49374,6 +49612,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49623,7 +49864,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -49749,7 +49990,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -49764,9 +50005,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -49848,10 +50086,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -49877,9 +50111,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -49934,9 +50165,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -49953,6 +50181,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -49965,9 +50196,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50322,6 +50550,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50376,6 +50607,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50451,6 +50685,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50508,9 +50745,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50550,9 +50784,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50571,9 +50802,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -50961,6 +51189,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51273,6 +51504,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51367,6 +51601,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51391,9 +51628,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51508,6 +51742,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51586,6 +51826,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51682,6 +51925,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -51791,9 +52037,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52082,6 +52325,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52519,6 +52765,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52570,6 +52822,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52630,7 +52888,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -52788,10 +53046,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53082,7 +53343,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53508,10 +53769,8 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
msgid "comment"
msgstr ""
@@ -53730,18 +53989,6 @@ msgstr[0] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -53846,7 +54093,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -53855,6 +54102,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54038,9 +54288,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54217,9 +54464,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54339,9 +54583,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54405,16 +54646,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54453,6 +54694,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54486,9 +54733,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54568,7 +54812,8 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
msgid "or"
msgstr ""
@@ -54889,6 +55134,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -54946,9 +55194,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55071,9 +55316,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/is_IS/gitlab.po b/locale/is_IS/gitlab.po
index 109ebe06bf8..bf53b36eb96 100644
--- a/locale/is_IS/gitlab.po
+++ b/locale/is_IS/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: is\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:46\n"
+"PO-Revision-Date: 2023-07-11 04:49\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/it/gitlab.po b/locale/it/gitlab.po
index 65ed1d400ab..c6a98f803bd 100644
--- a/locale/it/gitlab.po
+++ b/locale/it/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: it\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:44\n"
+"PO-Revision-Date: 2023-07-11 04:47\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] "%d altro commento"
msgstr[1] "Altri %d commenti"
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr "Ago"
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr "Chat"
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr "Messaggio del commit"
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr "Commit"
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr "Descrizione"
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr "Job"
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr "Nuovo ambiente"
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr "Ancora nessuna chiave di rilascio"
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr "Dalla creazione di un issue fino al rilascio in produzione"
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr "Dalla richiesta di merge fino effettua il merge fino al rilascio in produzione"
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr "Housekeeping iniziato con successo"
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr "Mar"
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr "Nessuna Repository"
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr "Pianificazione multipla Pipeline"
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr "Attiva"
msgid "PipelineSchedules|All"
msgstr "Tutto"
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr "Cambia branch/tag"
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr "poco fa"
msgid "Timeago|right now"
msgstr "adesso"
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr "Mostra la richieste di merge aperte"
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr "Vuoi visualizzare i dati? Richiedi l'accesso ad un amministratore, grazie."
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr "Ritira richiesta d'accesso"
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr "Non puoi scrivere su un'istanza di GitLab Geo secondaria di sola lettura
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/ja/gitlab.po b/locale/ja/gitlab.po
index f8d54ef6b86..4caee96939b 100644
--- a/locale/ja/gitlab.po
+++ b/locale/ja/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ja\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 06:15\n"
+"PO-Revision-Date: 2023-07-11 04:47\n"
msgid " %{start} to %{end}"
msgstr " %{start} ã‹ã‚‰ %{end} ã¾ã§"
@@ -95,6 +95,14 @@ msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] "%d 件ã®æ‰¿èª"
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] "%d件ã®ã‚¤ã‚·ãƒ¥ãƒ¼"
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] "%d件ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆ"
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] "%d モジュール"
@@ -155,6 +163,10 @@ msgid "%d assigned issue"
msgid_plural "%d assigned issues"
msgstr[0] "%d 件ã®å‰²ã‚Šå½“ã¦æ¸ˆã¿ã®ã‚¤ã‚·ãƒ¥ãƒ¼"
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] "%d 個ã®å¤‰æ›´ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«"
@@ -299,14 +311,6 @@ msgid "%d more comment"
msgid_plural "%d more comments"
msgstr[0] "%d 件以上ã®ã‚³ãƒ¡ãƒ³ãƒˆ"
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] "%d 件ã®æœªå®Œäº†ã®ã‚¤ã‚·ãƒ¥ãƒ¼"
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] "%d件ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆ"
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] "%d 件ã®ãƒ‘ッケージ"
@@ -562,9 +566,6 @@ msgid "%{count} project"
msgid_plural "%{count} projects"
msgstr[0] "%{count} 個ã®ãƒ—ロジェクト"
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr "%{count} 件ã®é–¢é€£ã—㟠%{pluralized_subject}: %{links}"
-
msgid "%{count} selected"
msgstr "%{count} 件é¸æŠžã—ã¾ã—ãŸ"
@@ -599,7 +600,7 @@ msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
msgstr "%{docs_link_start} 表示レベルã«ã¤ã„ã¦å­¦ã³ã¾ã—ょã†ã€‚%{docs_link_end}"
msgid "%{docs_link_start}Setting up a verified domain%{docs_link_end} requires being linked to a project."
-msgstr "%{docs_link_start}検証済ã¿ãƒ‰ãƒ¡ã‚¤ãƒ³ã‚’設定ã™ã‚‹%{docs_link_end} ã«ã¯ãƒ—ロジェクトã«ãƒªãƒ³ã‚¯ã—ã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+msgstr "%{docs_link_start}検証済ã¿ãƒ‰ãƒ¡ã‚¤ãƒ³ã‚’設定ã™ã‚‹%{docs_link_end}ã«ã¯ãƒ—ロジェクトã«ãƒªãƒ³ã‚¯æ¸ˆã¿ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
msgstr "%{docs_link_start} Large File Storage ã¨ã¯ä½•ã§ã™ã‹? %{docs_link_end}"
@@ -607,6 +608,9 @@ msgstr "%{docs_link_start} Large File Storage ã¨ã¯ä½•ã§ã™ã‹? %{docs_link_en
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr "%{docs_link_start}二è¦ç´ èªè¨¼ã¨ã¯ä½•ã§ã™ã‹ï¼Ÿ%{docs_link_end}"
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr "%{duration}ã€%{queuedDuration}秒間キューã«è¿½åŠ ã—ã¾ã—ãŸ"
+
msgid "%{duration}ms"
msgstr "%{duration}ms"
@@ -679,8 +683,11 @@ msgstr "%{human_readable_key} ã¯æœ€å°æ–‡å­—æ•° %{min_value_length} 文字未æº
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr "%{integrations_link_start}インテグレーション%{link_end} を利用ã—ã¦ã€ã‚µãƒ¼ãƒ‰ãƒ‘ーティアプリケーションを GitLab ワークフローã«çµ±åˆã§ãã¾ã™ã€‚利用å¯èƒ½ãªã‚¤ãƒ³ãƒ†ã‚°ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒè¦ä»¶ã‚’満ãŸã•ãªã„å ´åˆã¯ã€ %{webhooks_link_start}ウェブフック%{link_end} ã®ä½¿ç”¨ã‚’検討ã—ã¦ãã ã•ã„。"
-msgid "%{issuableDisplayName} %{lockStatus}."
-msgstr "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr "%{issuableDisplayName}ã¯ãƒ­ãƒƒã‚¯ã•ã‚Œã¾ã—ãŸã€‚"
+
+msgid "%{issuableDisplayName} unlocked."
+msgstr "%{issuableDisplayName}ã®ãƒ­ãƒƒã‚¯ã¯è§£é™¤ã•ã‚Œã¾ã—ãŸã€‚"
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType}を削除ã—ã¾ã™ï¼ã‚ˆã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
@@ -703,8 +710,11 @@ msgstr "%{italic_start}新機能%{italic_end} ã¯éžã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã§ã‚ã‚Šã€è
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr "ä¸Šé™ %{maxIssueCount} 件ã®ã†ã¡ %{itemsCount} 件ã®ã‚¤ã‚·ãƒ¥ãƒ¼"
+msgid "%{jobName} job is being retried"
+msgstr "%{jobName}ジョブãŒå†è©¦è¡Œã•ã‚Œã¦ã„ã¾ã™"
+
msgid "%{jobs} Jobs"
-msgstr "%{jobs} 件ã®ã‚¸ãƒ§ãƒ–"
+msgstr "%{jobs}件ã®ã‚¸ãƒ§ãƒ–"
msgid "%{key} is not a valid URL."
msgstr "%{key} 㯠有効ãªURLã§ã¯ã‚ã‚Šã¾ã›ã‚“。"
@@ -797,7 +807,7 @@ msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
msgstr "%{lock_path} ã¯GitLab ユーザー %{lock_user_id} ã«ã‚ˆã£ã¦ãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™"
msgid "%{locked} created %{timeago}"
-msgstr ""
+msgstr "%{locked}ãŒ%{timeago}ã«ä½œæˆã•ã‚Œã¾ã—ãŸ"
msgid "%{mergeLength}/%{usersLength} can merge"
msgstr "%{mergeLength}/%{usersLength} 人ãŒãƒžãƒ¼ã‚¸ã§ãã¾ã™"
@@ -812,7 +822,7 @@ msgid "%{milliseconds}ms"
msgstr "%{milliseconds} ミリ秒"
msgid "%{minutesUsed} units"
-msgstr ""
+msgstr "%{minutesUsed}個"
msgid "%{model_name} not found"
msgstr "%{model_name} ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
@@ -864,13 +874,13 @@ msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commi
msgstr "%{default_branch} ã‹ã‚‰ %{number_commits_behind} コミットé…ã‚Œã¦ã„ã¦ã€ %{number_commits_ahead} コミット進んã§ã„ã¾ã™ã€‚"
msgid "%{oneMonthAgo} - %{today}"
-msgstr ""
+msgstr "%{oneMonthAgo} - %{today}"
msgid "%{oneWeekAgo} - %{today}"
-msgstr ""
+msgstr "%{oneWeekAgo} - %{today}"
msgid "%{oneYearAgo} - %{today}"
-msgstr ""
+msgstr "%{oneYearAgo} - %{today}"
msgid "%{openedEpics} open, %{closedEpics} closed"
msgstr "%{openedEpics} オープン, %{closedEpics} 完了"
@@ -909,7 +919,7 @@ msgid "%{project_name}"
msgstr "%{project_name}"
msgid "%{project_path} is a project that you can use to add a README to your GitLab profile. Create a public project and initialize the repository with a README to get started. %{help_link_start}Learn more%{help_link_end}."
-msgstr "%{project_path} ã¯ã€GitLab プロファイルã«READMEを追加ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã™ã‚‹ãƒ—ロジェクトã§ã™ã€‚開始ã™ã‚‹ã«ã¯ã€ãƒ‘ブリックプロジェクトを作æˆã—ã€README ãŒå«ã¾ã‚ŒãŸçŠ¶æ…‹ã§ãƒªãƒã‚¸ãƒˆãƒªã‚’åˆæœŸåŒ–ã—ã¾ã™ã€‚ %{help_link_start}詳細ã¯ã“ã¡ã‚‰%{help_link_end}。"
+msgstr "%{project_path}ã¯ã€GitLabプロフィールã«READMEを追加ã™ã‚‹éš›ã«ä½¿ç”¨ã™ã‚‹ãƒ—ロジェクトã§ã™ã€‚開始ã™ã‚‹ã«ã¯ã€å…¬é–‹ãƒ—ロジェクトを作æˆã—ã€READMEã¨ã¨ã‚‚ã«ãƒªãƒã‚¸ãƒˆãƒªã‚’åˆæœŸåŒ–ã—ã¾ã™ã€‚%{help_link_start}詳細ã¯ã“ã¡ã‚‰%{help_link_end}。"
msgid "%{ref} cannot be added: %{error}"
msgstr "%{ref} を追加ã™ã‚‹ãã¾ã›ã‚“ã§ã—ãŸ: %{error}"
@@ -1009,6 +1019,12 @@ msgstr "%{spanStart}行%{spanEnd} %{errorLine}%{errorColumn}"
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr "%{spanStart} 関数内%{spanEnd} %{errorFn}"
+msgid "%{startDate} – %{dueDate}"
+msgstr "%{startDate} – %{dueDate}"
+
+msgid "%{startDate} – No due date"
+msgstr "%{startDate} – 期é™ãªã—"
+
msgid "%{start} to %{end}"
msgstr "%{start} ã‹ã‚‰ %{end} ã¾ã§"
@@ -1016,28 +1032,28 @@ msgid "%{statusStart}Dismissed%{statusEnd}"
msgstr "%{statusStart}å´ä¸‹%{statusEnd}"
msgid "%{statusStart}Dismissed%{statusEnd} at %{projectLink}"
-msgstr ""
+msgstr "%{projectLink}ã§%{statusStart}å´ä¸‹ã•ã‚Œã¾ã—ãŸ%{statusEnd}"
msgid "%{statusStart}Dismissed%{statusEnd} on pipeline %{pipelineLink}"
-msgstr ""
+msgstr "パイプライン%{pipelineLink}ã§%{statusStart}å´ä¸‹ã•ã‚Œã¾ã—ãŸ%{statusEnd}"
msgid "%{statusStart}Dismissed%{statusEnd} on pipeline %{pipelineLink} at %{projectLink}"
-msgstr ""
+msgstr "%{projectLink}ã®ãƒ‘イプライン%{pipelineLink}ã§%{statusStart}å´ä¸‹ã•ã‚Œã¾ã—ãŸ%{statusEnd}"
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason}"
-msgstr ""
+msgstr "%{statusStart}å´ä¸‹ã•ã‚Œã¾ã—ãŸ%{statusEnd}: %{dismissalReason}"
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} at %{projectLink}"
-msgstr ""
+msgstr "%{statusStart}å´ä¸‹ã•ã‚Œã¾ã—ãŸ%{statusEnd}: %{projectLink}ã®%{dismissalReason}"
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink}"
-msgstr ""
+msgstr "%{statusStart}å´ä¸‹ã•ã‚Œã¾ã—ãŸ%{statusEnd}: %{pipelineLink}ã®ãƒ‘イプラインã§%{dismissalReason}"
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
-msgstr ""
+msgstr "%{statusEnd} å´ä¸‹ã•ã‚Œã¾ã—ãŸ%{statusStart}: %{projectLink}ã®ãƒ‘イプライン%{pipelineLink}ã§%{dismissalReason}"
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
-msgstr "%{strongOpen}警告:%{strongClose} SAML グループ リンクã«ã‚ˆã‚Šã€GitLab ã¯ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰ãƒ¡ãƒ³ãƒãƒ¼ã‚’自動的ã«å‰Šé™¤ã—ã¾ã™ã€‚"
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
+msgstr "%{strongOpen}警告:%{strongClose} SAMLグループリンクã«ã‚ˆã‚Šã€GitLabã¯è‡ªå‹•çš„ã«ãƒ¡ãƒ³ãƒãƒ¼ã®ãƒ­ãƒ¼ãƒ«ã‚’変更ã¾ãŸã¯ãƒ¡ãƒ³ãƒãƒ¼ã‚’グループã‹ã‚‰å‰Šé™¤ã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚"
msgid "%{strongStart}%{count}%{strongEnd} commit"
msgid_plural "%{strongStart}%{count}%{strongEnd} commits"
@@ -1148,9 +1164,6 @@ msgstr "%{type} %{name} åå‰ã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™"
msgid "%{url} (optional)"
msgstr "%{url} (オプション)"
-msgid "%{userName} (cannot merge)"
-msgstr "%{userName} (マージã§ãã¾ã›ã‚“)"
-
msgid "%{userName}'s avatar"
msgstr "%{userName}ã®ã‚¢ãƒã‚¿ãƒ¼"
@@ -1245,7 +1258,7 @@ msgid "'projects' is not yet supported"
msgstr "'projects'ã¯ã¾ã ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
msgid "'schemaVersion' '%{given_version}' is not supported, it must be '%{required_version}'"
-msgstr ""
+msgstr "「schemaVersionã€ã€Œ%{given_version}ã€ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“。「%{required_version}ã€ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
msgid "'starterProjects' is not yet supported"
msgstr "'starterProjects'ã¯ã¾ã ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
@@ -1752,10 +1765,10 @@ msgid "AI actions"
msgstr "AI アクション"
msgid "AI-generated summary"
-msgstr "AI生æˆã®è¦ç´„"
+msgstr "AIãŒç”Ÿæˆã—ãŸæ¦‚è¦"
msgid "AISummary|Generates a summary of all comments"
-msgstr "ã™ã¹ã¦ã®ã‚³ãƒ¡ãƒ³ãƒˆã®æ¦‚è¦ã‚’生æˆã—ã¾ã™"
+msgstr "ã™ã¹ã¦ã®ã‚³ãƒ¡ãƒ³ãƒˆã®æ¦‚è¦ã‚’生æˆ"
msgid "AISummary|View summary"
msgstr "概è¦ã‚’表示"
@@ -1797,13 +1810,19 @@ msgid "AI|Features that use third-party AI services require transmission of data
msgstr "サードパーティ製AIサービスを利用ã™ã‚‹æ©Ÿèƒ½ã«ã¯ã€å€‹äººãƒ‡ãƒ¼ã‚¿ã‚’å«ã‚€ãƒ‡ãƒ¼ã‚¿ã®é€ä¿¡ãŒå¿…è¦ã§ã™ã€‚"
msgid "AI|For example: Organizations should be able to forecast into the future by using value stream analytics charts. This feature would help them understand how their metrics are trending."
-msgstr "例ãˆã°: ãƒãƒªãƒ¥ãƒ¼ã‚¹ãƒˆãƒªãƒ¼ãƒ åˆ†æžãƒãƒ£ãƒ¼ãƒˆã‚’使用ã™ã‚‹ã“ã¨ã§ã€çµ„ç¹”ã¯å°†æ¥ã‚’予測ã§ãã‚‹ã¯ãšã§ã™ã€‚ ã“ã®æ©Ÿèƒ½ã¯ã€å½¼ã‚‰ãŒè‡ªåˆ†ãŸã¡ã®ãƒ¡ãƒˆãƒªã‚¯ã‚¹ã«ã©ã®ã‚ˆã†ãªå‚¾å‘ãŒã‚ã‚‹ã‹ã‚’ç†è§£ã™ã‚‹ã®ã«å½¹ç«‹ã¡ã¾ã™ã€‚"
+msgstr "例:ãƒãƒªãƒ¥ãƒ¼ã‚¹ãƒˆãƒªãƒ¼ãƒ åˆ†æžãƒãƒ£ãƒ¼ãƒˆã‚’使用ã™ã‚‹ã“ã¨ã§ã€çµ„ç¹”ã¯å°†æ¥ã‚’予測ã§ãã‚‹ã¯ãšã§ã™ã€‚ã“ã®æ©Ÿèƒ½ã¯ã€çµ„ç¹”ãŒè‡ªåˆ†ãŸã¡ã®ãƒ¡ãƒˆãƒªã‚¯ã‚¹ã«ã©ã®ã‚ˆã†ãªå‚¾å‘ãŒã‚ã‚‹ã‹ã‚’ç†è§£ã™ã‚‹ã®ã«å½¹ç«‹ã¡ã¾ã™ã€‚"
msgid "AI|Helpful"
msgstr "å½¹ã«ç«‹ã¤"
msgid "AI|I don't see how I can help. Please give better instructions!"
-msgstr "ãªã«ã‚’ã™ã‚Œã°ã‚ˆã„ã‹ã‚ã‹ã‚Šã¾ã›ã‚“。より良ã„指示を与ãˆã¦ãã ã•ã„!"
+msgstr "ã©ã®ã‚ˆã†ã«ãŠæ‰‹ä¼ã„ã™ã‚Œã°ã‚ˆã„ã‹ã‚ã‹ã‚Šã¾ã›ã‚“。よりã‚ã‹ã‚Šã‚„ã™ã指示ã—ã¦ãã ã•ã„!"
+
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr "GitLabã®è¦‹è§£ã‚’代表ã—ã¦ã„ãªã„ã€ä¸é©åˆ‡ãªè¿”答をæä¾›ã™ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚個人データを入力ã—ãªã„ã§ãã ã•ã„。"
+
+msgid "AI|New chat"
+msgstr "æ–°ã—ã„ãƒãƒ£ãƒƒãƒˆ"
msgid "AI|Populate issue description"
msgstr "イシューã®èª¬æ˜Žã‚’追加"
@@ -1821,7 +1840,7 @@ msgid "AI|The container element wasn't found, stopping AI Genie."
msgstr "コンテナè¦ç´ ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚AI Genieã‚’åœæ­¢ã—ã¾ã™ã€‚"
msgid "AI|The existing description will be replaced when you submit."
-msgstr "æ出時ã«æ—¢å­˜ã®èª¬æ˜ŽãŒç½®ãæ›ãˆã‚‰ã‚Œã¾ã™ã€‚"
+msgstr "é€ä¿¡ã™ã‚‹ã¨ã€æ—¢å­˜ã®èª¬æ˜ŽãŒç½®ãæ›ãˆã‚‰ã‚Œã¾ã™ã€‚"
msgid "AI|There is too much text in the chat. Please try again with a shorter text."
msgstr "ãƒãƒ£ãƒƒãƒˆã«ãƒ†ã‚­ã‚¹ãƒˆãŒå¤šã™ãŽã¾ã™ã€‚短ã„テキストã§ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
@@ -1845,7 +1864,7 @@ msgid "AI|What does the selected code mean?"
msgstr "é¸æŠžã—ãŸã‚³ãƒ¼ãƒ‰ã¯ä½•ã‚’æ„味ã—ã¾ã™ã‹?"
msgid "AI|Write a brief description and have AI fill in the details."
-msgstr "ç°¡å˜ãªèª¬æ˜Žã‚’書ãã€è©³ç´°ã‚’AIã«è¨˜å…¥ã•ã›ã¾ã™ã€‚"
+msgstr "ç°¡å˜ãªèª¬æ˜Žã‚’入力ã—ã€è©³ç´°ã¯AIã«è¨˜å…¥ã•ã›ã¾ã™ã€‚"
msgid "AI|Write a summary to fill out the selected issue template"
msgstr "é¸æŠžã—ãŸã‚¤ã‚·ãƒ¥ãƒ¼ãƒ†ãƒ³ãƒ—レートã«è¨˜å…¥ã™ã‚‹è¦ç´„を書ã"
@@ -2031,10 +2050,10 @@ msgid "AbuseReportEvent|Successfully closed the report"
msgstr "レãƒãƒ¼ãƒˆã‚’正常ã«é–‰ã˜ã¾ã—ãŸ"
msgid "AbuseReportEvent|Successfully scheduled the user for deletion"
-msgstr "ユーザーã®å‰Šé™¤ã‚’スケジュールã¸è¿½åŠ ã—ã¾ã—ãŸ"
+msgstr "ユーザーã®å‰Šé™¤ãŒæ­£å¸¸ã«ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã•ã‚Œã¾ã—ãŸ"
msgid "AbuseReportEvent|Successfully scheduled the user for deletion and closed the report"
-msgstr "ユーザーã®å‰Šé™¤ã®ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒªãƒ³ã‚°ã«æˆåŠŸã—ã€ãƒ¬ãƒãƒ¼ãƒˆã‚’é–‰ã˜ã¾ã—ãŸ"
+msgstr "ユーザーã®å‰Šé™¤ã®ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã«æˆåŠŸã—ã€ãƒ¬ãƒãƒ¼ãƒˆã‚’é–‰ã˜ã¾ã—ãŸ"
msgid "AbuseReports|%{reportedUser} reported for %{category} by %{reporter}"
msgstr "%{reporter} ã«ã‚ˆã£ã¦%{category} ã¨ã—ã¦%{reportedUser} ãŒå ±å‘Šã•ã‚Œã¾ã—ãŸ"
@@ -2052,7 +2071,7 @@ msgid "AbuseReport|Abuse reports"
msgstr "ä¸æ­£åˆ©ç”¨ã®å ±å‘Š"
msgid "AbuseReport|Abuse unconfirmed"
-msgstr "ä¸æ­£ä½¿ç”¨ã¯æœªæ‰¿èª"
+msgstr "ä¸æ­£åˆ©ç”¨ã¯æœªç¢ºèª"
msgid "AbuseReport|Action"
msgstr "アクション"
@@ -2067,10 +2086,10 @@ msgid "AbuseReport|Admin profile"
msgstr "管ç†è€…プロフィール"
msgid "AbuseReport|Ban user"
-msgstr "ユーザーã®BAN"
+msgstr "ユーザーをBAN"
msgid "AbuseReport|Block user"
-msgstr "ユーザーã®ãƒ–ロック"
+msgstr "ユーザーをブロック"
msgid "AbuseReport|Card matches %{cardMatchesLinkStart}%{count} accounts%{cardMatchesLinkEnd}"
msgstr "カード㌠%{cardMatchesLinkStart}%{count} 件ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆ%{cardMatchesLinkEnd} ã«ä¸€è‡´ã—ã¾ã—ãŸ"
@@ -2088,25 +2107,25 @@ msgid "AbuseReport|Confirm"
msgstr "確èª"
msgid "AbuseReport|Confirmed crypto mining"
-msgstr "æš—å·ãƒžã‚¤ãƒ‹ãƒ³ã‚°ã®ç¢ºèª"
+msgstr "æš—å·ãƒžã‚¤ãƒ‹ãƒ³ã‚°ã‚’確èª"
msgid "AbuseReport|Confirmed offensive or abusive behavior"
-msgstr "攻撃的ã¾ãŸã¯è™å¾…çš„ãªè¡Œå‹•ã‚’確èª"
+msgstr "攻撃的ã¾ãŸã¯ä¸æ­£ãªè¡Œå‹•ã‚’確èª"
msgid "AbuseReport|Confirmed phishing"
-msgstr "フィッシングã®ç¢ºèª"
+msgstr "フィッシングを確èª"
msgid "AbuseReport|Confirmed posting of malware"
msgstr "マルウェアã®æŠ•ç¨¿ã‚’確èª"
msgid "AbuseReport|Confirmed posting of personal information or credentials"
-msgstr "個人情報ã¾ãŸã¯èªè¨¼æƒ…å ±ã®æŠ•ç¨¿"
+msgstr "個人情報ã¾ãŸã¯èªè¨¼æƒ…å ±ã®æŠ•ç¨¿ã‚’確èª"
msgid "AbuseReport|Confirmed spam"
-msgstr "スパムã®ç¢ºèª"
+msgstr "スパムを確èª"
msgid "AbuseReport|Confirmed violation of a copyright or a trademark"
-msgstr "著作権ã¾ãŸã¯å•†æ¨™ã®ä¾µå®³ã‚’確èªã—ã¾ã—ãŸ"
+msgstr "著作権ã¾ãŸã¯å•†æ¨™ã®ä¾µå®³ã‚’確èª"
msgid "AbuseReport|Credit card"
msgstr "クレジットカード"
@@ -2220,7 +2239,7 @@ msgid "Access Tokens"
msgstr "アクセス トークン"
msgid "Access denied"
-msgstr "アクセス拒å¦"
+msgstr "アクセスãŒæ‹’å¦ã•ã‚Œã¾ã—ãŸ"
msgid "Access denied for your LDAP account."
msgstr "ã‚ãªãŸã® LDAP アカウントã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•ã‚Œã¾ã—ãŸã€‚"
@@ -2258,6 +2277,9 @@ msgstr "アクセストークン"
msgid "AccessTokens|Access token limit reached"
msgstr "アクセストークンã®ä¸Šé™ã«é”ã—ã¾ã—ãŸ"
+msgid "AccessTokens|Add a %{type}"
+msgstr "%{type}を追加"
+
msgid "AccessTokens|Are you sure?"
msgstr "よã‚ã—ã„ã§ã™ã‹?"
@@ -2276,12 +2298,18 @@ msgstr "å—信メールトークンをコピー"
msgid "AccessTokens|Copy static object token"
msgstr "é™çš„オブジェクトトークンをコピー"
+msgid "AccessTokens|Create %{type}"
+msgstr "%{type}を作æˆ"
+
msgid "AccessTokens|Created"
msgstr "作æˆæ¸ˆã¿"
msgid "AccessTokens|Feed token"
msgstr "フィードトークン"
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr "例ãˆã°ã€ãƒˆãƒ¼ã‚¯ãƒ³ã‚„トークンã®ç›®çš„を使用ã™ã‚‹ã‚¢ãƒ—リケーションã§ã™ã€‚ã™ã¹ã¦ã®%{resource_type}メンãƒãƒ¼ã«è¡¨ç¤ºã•ã‚Œã‚‹ãŸã‚ã€ãƒˆãƒ¼ã‚¯ãƒ³ã®åå‰ã«ã¯æ©Ÿå¯†æƒ…報をå«ã‚ãªã„ã§ãã ã•ã„。"
+
msgid "AccessTokens|Incoming email token"
msgstr "å—信メールトークン"
@@ -2300,6 +2328,15 @@ msgstr "ã“ã®ãƒˆãƒ¼ã‚¯ãƒ³ã‚’外部ã«æ¼ã‚‰ã•ãªã„ã§ãã ã•ã„。ã“れを
msgid "AccessTokens|Personal Access Tokens"
msgstr "パーソナルアクセストークン"
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr "スコープã«ã‚ˆã£ã¦ã€ãƒˆãƒ¼ã‚¯ãƒ³ã«ä»˜ä¸Žã™ã‚‹æ¨©é™ãƒ¬ãƒ™ãƒ«ã‚’設定ã—ã¾ã™ã€‚"
+
+msgid "AccessTokens|Select a role"
+msgstr "ロールをé¸æŠž"
+
+msgid "AccessTokens|Select scopes"
+msgstr "スコープをé¸æŠž"
+
msgid "AccessTokens|Static object token"
msgstr "é™çš„オブジェクトトークン"
@@ -2309,6 +2346,9 @@ msgstr "å‰å›žãƒˆãƒ¼ã‚¯ãƒ³ãŒä½¿ç”¨ã•ã‚ŒãŸæ—¥æ™‚"
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr "2è¦ç´ èªè¨¼(2FA) ãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹å ´åˆã€ã“ã‚Œã¯å”¯ä¸€ã®æ‰¿èªæ¸ˆã¿ãƒ‘スワードã§ã™ã€‚"
+msgid "AccessTokens|Token name"
+msgstr "トークンå"
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr "パーソナルアクセストークンを使用ã—ã¦Git over HTTPã«å¯¾ã—ã¦èªè¨¼ã§ãã¾ã™ã€‚"
@@ -2316,7 +2356,7 @@ msgid "AccessTokens|You can generate a personal access token for each applicatio
msgstr "GitLab APIã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹å¿…è¦ãŒã‚るアプリケーションã”ã¨ã«ã€ãƒ‘ーソナルアクセストークンを生æˆã§ãã¾ã™ã€‚"
msgid "AccessTokens|You can only have one active project access token with a trial license. You cannot generate a new token until the existing token is deleted, or you upgrade your subscription."
-msgstr ""
+msgstr "トライアルライセンスã§ã¯æœ‰åŠ¹ãªãƒ—ロジェクトアクセストークンを1ã¤ã—ã‹æŒã¤ã“ã¨ãŒã§ãã¾ã›ã‚“。 既存ã®ãƒˆãƒ¼ã‚¯ãƒ³ã‚’削除ã™ã‚‹ã‹ã€ã‚µãƒ–スクリプションをアップグレードã™ã‚‹ã¾ã§ã€æ–°ã—ã„トークンを生æˆã§ãã¾ã›ã‚“。"
msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr "RSS リーダーãŒå€‹äººç”¨RSS フィードを読ã¿è¾¼ã‚€ã¨ãã€ã¾ãŸã¯ã‚«ãƒ¬ãƒ³ãƒ€ãƒ¼ã‚¢ãƒ—リケーションãŒå€‹äººç”¨ã‚«ãƒ¬ãƒ³ãƒ€ãƒ¼ã‚’読ã¿è¾¼ã‚€ã¨ãã«ã€ãƒ•ã‚£ãƒ¼ãƒ‰ãƒˆãƒ¼ã‚¯ãƒ³ã‚’使用ã—ã¦ã‚ãªãŸã‚’èªè¨¼ã—ã¾ã™ã€‚トークンã¯ãƒ•ã‚£ãƒ¼ãƒ‰ URL ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚"
@@ -2360,13 +2400,13 @@ msgstr "アカウントを検証ã—ã¦ãƒ‘イプラインを修正ã™ã‚‹"
msgid "AccountValidation|I'll bring my own runners"
msgstr "自分㮠Runner ã‚’æŒã¡è¾¼ã¿ã¾ã™"
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr "詳ã—ã見る"
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2406,7 +2446,7 @@ msgid "Action"
msgstr "アクション"
msgid "Action '%{action}' in registry %{registry_id} entry is not supported."
-msgstr "レジストリ㮠%{registry_id} エントリã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ '%{action}'ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“。"
+msgstr "レジストリ%{registry_id}エントリã§ã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã€Œ%{action}ã€ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“。"
msgid "Action not allowed."
msgstr "アクションãŒè¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“"
@@ -2477,9 +2517,6 @@ msgstr "Wikiを追加ã™ã‚‹"
msgid "Add Zoom meeting"
msgstr "Zoom ミーティングを追加"
-msgid "Add a %{type}"
-msgstr "%{type} を追加"
-
msgid "Add a GCP region"
msgstr "GCP リージョンを追加"
@@ -2528,6 +2565,9 @@ msgstr "æ–°ã—ã„イシューを作æˆã™ã‚‹"
msgid "Add a numbered list"
msgstr "番å·ä»˜ãリストを追加"
+msgid "Add a quick action"
+msgstr "クイックアクションを追加"
+
msgid "Add a related epic"
msgstr "関連ã™ã‚‹ã‚¨ãƒ”ックを追加"
@@ -2783,6 +2823,9 @@ msgstr "ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®æ–°æ©Ÿèƒ½"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr "ã‚ãªãŸã® GitLab インスタンスã§æ–°ã—ã„アプリケーションを追加ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。権é™ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€GitLab 管ç†è€…ã«é€£çµ¡ã—ã¦ãã ã•ã„。"
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr "追加ã®ãƒ€ã‚¤ã‚¢ã‚°ãƒ©ãƒ ã®å½¢å¼"
@@ -2802,10 +2845,7 @@ msgid "Additional text to show on the sign-in page"
msgstr "サインインページã«è¡¨ç¤ºã™ã‚‹è¿½åŠ ãƒ†ã‚­ã‚¹ãƒˆ"
msgid "Additional units"
-msgstr ""
-
-msgid "Additional units of compute:"
-msgstr ""
+msgstr "追加ユニット"
msgid "Address"
msgstr "アドレス"
@@ -3230,24 +3270,15 @@ msgstr "既存ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ãŒãªã„å ´åˆã€GitLab ãŒã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚
msgid "AdminSettings|Import sources"
msgstr "ソースをインãƒãƒ¼ãƒˆ"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
+msgstr "ã™ã¹ã¦ã®æ–‡æ›¸ãŒå‡¦ç†ã•ã‚Œã‚‹ã¾ã§Sidekiqジョブをキューã«å…¥ã‚Œã‚‹ã“ã¨ã§ã€ã‚³ãƒ¼ãƒ‰ä»¥å¤–ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ä½œæˆã®ã‚¹ãƒ«ãƒ¼ãƒ—ットをå‘上ã•ã›ã¾ã™ã€‚"
+
msgid "AdminSettings|Inactive project deletion"
msgstr "無効ãªãƒ—ロジェクトã®å‰Šé™¤"
msgid "AdminSettings|Instance runners expiration"
msgstr "インスタンス Runner ã®æœ‰åŠ¹æœŸé™"
-msgid "AdminSettings|Jitsu administrator email"
-msgstr "Jitsu 管ç†è€…メールアドレス"
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr "Jitsu 管ç†è€…パスワード"
-
-msgid "AdminSettings|Jitsu host"
-msgstr "Jitsuホスト"
-
-msgid "AdminSettings|Jitsu project ID"
-msgstr "Jitsu プロジェクトID"
-
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
msgstr "最新ã®æˆåŠŸã—ãŸãƒ‘イプライン内ã®ã™ã¹ã¦ã®ã‚¸ãƒ§ãƒ–ã®ã€æœ€æ–°ã®ã‚¢ãƒ¼ãƒ†ã‚£ãƒ•ã‚¡ã‚¯ãƒˆã‚’ä¿æŒã—ã¾ã™"
@@ -3329,6 +3360,9 @@ msgstr "デフォルトã§ä¿è­·ã•ã‚Œã‚‹CI/CD変数"
msgid "AdminSettings|Registration Features include:"
msgstr "登録機能ã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™:"
+msgid "AdminSettings|Requeue indexing workers"
+msgstr "インデックス作æˆãƒ¯ãƒ¼ã‚«ãƒ¼ã‚’キューã«å†åº¦è¿½åŠ "
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr "ユーザーã«ã‚«ã‚¹ã‚¿ãƒ ãƒ‰ãƒ¡ã‚¤ãƒ³ã®æ‰€æœ‰ã‚’証明ã™ã‚‹ã“ã¨ã‚’è¦æ±‚ã™ã‚‹"
@@ -3398,9 +3432,6 @@ msgstr "設定㯠0 より大ãããªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr "Pagesé™çš„サイトã®ã‚µã‚¤ã‚ºã¨ãƒ‰ãƒ¡ã‚¤ãƒ³è¨­å®šã€‚"
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr "Jitsuã®ãƒ—ロジェクトã®ID。プロジェクトã«ã¯ã™ã¹ã¦ã®åˆ†æžã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚"
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr "Cubeインスタンスã®URL。"
@@ -3410,9 +3441,6 @@ msgstr "Snowplow 構æˆç”¨ã®è£½å“分æžã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ãƒ¼ã‚¤ãƒ³ã‚¹
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr "ã™ã¹ã¦ã®ãƒ—ロジェクトã§è‡ªå‹• Review App ãŠã‚ˆã³è‡ªå‹•ãƒ‡ãƒ—ロイステージã«ä½¿ç”¨ã•ã‚Œã‚‹ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒ‰ãƒ¡ã‚¤ãƒ³ã€‚"
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr "ã‚ãªãŸã®Jitsuインスタンスã®ãƒ›ã‚¹ãƒˆã€‚"
-
msgid "AdminSettings|The host of your data collector instance."
msgstr "データコレクタインスタンスã®ãƒ›ã‚¹ãƒˆã€‚"
@@ -3443,11 +3471,11 @@ msgstr "ç¾åœ¨ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªãƒ‘イプラインã®åˆè¨ˆã‚¸ãƒ§ãƒ–æ•°"
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr "IAMèªè¨¼æƒ…å ±ã§AWS OpenSearch を使用ã™ã‚‹"
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr "Jitsuã‚’Clickhouseインスタンスã«æŽ¥ç¶šã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã—ã¾ã™ã€‚"
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
+msgstr "クラスターã¨ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã®ç§»è¡Œã«ä½¿ç”¨ã—ã¾ã™ã€‚インデックス作æˆã‚’一時åœæ­¢ã—ã¦ã‚‚ã€GitLabã¯å¤‰æ›´ã‚’追跡ã—ã¾ã™ã€‚"
-msgid "AdminSettings|Used to generate short-lived API access tokens."
-msgstr "有効期間ã®çŸ­ã„ API アクセストークンã®ç”Ÿæˆã«ä½¿ç”¨ã—ã¾ã™ã€‚"
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
+msgstr "Clickhouseインスタンスã«Snowplowを接続ã™ã‚‹éš›ã«ä½¿ç”¨ã—ã¾ã™ã€‚"
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
msgstr "Cubeインスタンスã‹ã‚‰ãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰ãƒ‡ãƒ¼ã‚¿ã‚’å–å¾—ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚"
@@ -3455,9 +3483,6 @@ msgstr "Cubeインスタンスã‹ã‚‰ãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰ãƒ‡ãƒ¼ã‚¿ã‚’å–å¾—ã™ã‚
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr "グループã¾ãŸã¯ãƒ—ロジェクトã«è¿½åŠ ã•ã‚Œã‚‹å‰ã«ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¨ã‚°ãƒ«ãƒ¼ãƒ—ã¯æ‹›å¾…を承諾ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr "一時åœæ­¢ã—ãŸã¨ã—ã¦ã‚‚ã€GitLab ã¯å¤‰æ›´ã‚’追跡ã—ã¾ã™ã€‚ã“ã‚Œã¯ã‚¯ãƒ©ã‚¹ã‚¿/インデックスã®ç§»è¡Œã«å½¹ç«‹ã¡ã¾ã™ã€‚"
-
msgid "AdminSettings|When to delete inactive projects"
msgstr "無効ãªãƒ—ロジェクトを削除ã™ã‚‹æ™‚"
@@ -3680,9 +3705,6 @@ msgstr "GitLab インスタンスã§ã®ä½¿ç”¨ã«é–¢ã™ã‚‹é‡è¦ãªæƒ…å ±"
msgid "AdminUsers|Is using seat"
msgstr "シートを使用中"
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr "ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒä½œæˆã—ãŸã‚¤ã‚·ãƒ¥ãƒ¼ãƒ»ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã¯ã€ä»–ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã¯è¡¨ç¤ºã•ã‚Œã¾ã›ã‚“。"
-
msgid "AdminUsers|It's you!"
msgstr "ã‚ãªãŸã§ã™ï¼"
@@ -3728,6 +3750,9 @@ msgstr "個人プロジェクトã€ã‚°ãƒ«ãƒ¼ãƒ—ã€ã¨ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®å±¥æ­´ã¯ã
msgid "AdminUsers|Private profile"
msgstr "プライベートプロフィール"
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr "ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒ—ロジェクトã€ã‚¤ã‚·ãƒ¥ãƒ¼ã€ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã€ãŠã‚ˆã³ã‚³ãƒ¡ãƒ³ãƒˆã¯ã€ä»–ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã¯è¡¨ç¤ºã•ã‚Œã¾ã›ã‚“。"
+
msgid "AdminUsers|Reactivating a user will:"
msgstr "ユーザーã®å†æœ‰åŠ¹åŒ–:"
@@ -3767,7 +3792,7 @@ msgstr "Skype"
msgid "AdminUsers|Sort by"
msgstr "並ã³æ›¿ãˆ"
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4037,9 +4062,6 @@ msgstr "å¤ã„コード検索マッピングを使用ã—ã¦ã„ã¾ã™ã€‚ コーãƒ
msgid "After a successful password update you will be redirected to login screen."
msgstr "パスワードã®æ›´æ–°ã«æˆåŠŸã™ã‚‹ã¨ã€ãƒ­ã‚°ã‚¤ãƒ³ç”»é¢ã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã•ã‚Œã¾ã™ã€‚"
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr "パスワードを正常ã«æ›´æ–°ã—ãŸå¾Œã€ãƒ­ã‚°ã‚¤ãƒ³ãƒšãƒ¼ã‚¸ã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã•ã‚Œã‚‹ã®ã§ã€ãã“ã§æ–°ã—ã„パスワードã§ãƒ­ã‚°ã‚¤ãƒ³ã§ãã¾ã™ã€‚"
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr "一度削除ã™ã‚‹ã¨ã€forkã®é–¢ä¿‚ã‚’å…ƒã«æˆ»ã™ã«ã¯ã“ã®APIを使ã†å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®ãƒ—ロジェクトã¯ãã®ã‚¢ãƒƒãƒ—ストリームã¾ãŸã¯ä»–ã®ãƒ•ã‚©ãƒ¼ã‚¯ãƒ—ロジェクトã¸ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’é€ä¿¡ã¾ãŸã¯å—ä¿¡ã§ããªããªã‚Šã¾ã™ã€‚"
@@ -4076,7 +4098,7 @@ msgstr "アクティビティフィード"
msgid "AlertManagement|Alert"
msgstr "アラート"
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr "アラートã®æ‹…当者: %{assignees}"
msgid "AlertManagement|Alert detail"
@@ -4181,10 +4203,10 @@ msgstr "アラートã®è¡¨ç¤ºä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã“ã®ãƒšãƒ¼
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr "アラートã®è¡¨ç¤ºä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚エンドãƒã‚¤ãƒ³ãƒˆã®è©³ç´°è¨­å®šã‚’確èªã—ã¦ã€ã‚¢ãƒ©ãƒ¼ãƒˆãŒè¡¨ç¤ºã•ã‚Œã‚‹ã‚ˆã†ã«ã—ã¦ãã ã•ã„。"
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr "担当者リストã®æ›´æ–°ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr "アラートã®æ‹…当者ã®æ›´æ–°ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4295,9 +4317,6 @@ msgstr "編集を続行ã™ã‚‹"
msgid "AlertSettings|Prometheus"
msgstr "Prometheus"
-msgid "AlertSettings|Prometheus API base URL"
-msgstr "Prometheus API ã®ãƒ™ãƒ¼ã‚¹URL"
-
msgid "AlertSettings|Reset Key"
msgstr "キーをリセット"
@@ -4334,9 +4353,6 @@ msgstr "フォームã«ä¿å­˜ã•ã‚Œã¦ã„ãªã„変更ãŒã‚ã‚Šã¾ã™ã€‚ã©ã®ã‚ˆ
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr "カスタムマッピングを作æˆã™ã‚‹ã«ã¯ã€ãƒ¢ãƒ‹ã‚¿ãƒªãƒ³ã‚°ãƒ„ールã‹ã‚‰ã‚µãƒ³ãƒ—ルペイロードを JSON å½¢å¼ã§å…¥åŠ›ã—ã¾ã™ã€‚続行ã™ã‚‹ã«ã¯ã€\"ペイロードフィールドã®è§£æž\"ボタンをé¸æŠžã—ã¾ã™ã€‚"
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr "URL ã¯ç©ºç™½ã«ã§ãã¾ã›ã‚“。URL㯠http: ã¾ãŸã¯ https: ã§å§‹ã¾ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr "下ã®URLã¨èªè¨¼ã‚­ãƒ¼ã‚’使用ã—ã¦ã€Prometheus ㌠GitLab ã¸ã©ã®ã‚ˆã†ã«ã‚¢ãƒ©ãƒ¼ãƒˆã‚’é€ä¿¡ã™ã‚‹ã“ã¨ã‚’調整ã—ã¾ã™ã€‚エンドãƒã‚¤ãƒ³ãƒˆã‚’ã©ã®ã‚ˆã†ã«èª¿æ•´ã™ã‚‹ã‹ã«ã¤ã„ã¦ã¯ã€%{linkStart} GitLab ドキュメント%{linkEnd} ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
@@ -4433,6 +4449,9 @@ msgstr "ã™ã¹ã¦ã®ãƒ–ランãƒ"
msgid "All changes are committed"
msgstr "ã™ã¹ã¦ã®å¤‰æ›´ãŒã‚³ãƒŸãƒƒãƒˆã•ã‚Œã¦ã„ã¾ã™"
+msgid "All default branches"
+msgstr "ã™ã¹ã¦ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒ–ランãƒ"
+
msgid "All eligible users"
msgstr "ã™ã¹ã¦ã®å¯¾è±¡ãƒ¦ãƒ¼ã‚¶ãƒ¼"
@@ -4598,6 +4617,9 @@ msgstr "サブグループやプロジェクトã‹ã‚‰ç›´æŽ¥ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒ¡ãƒ³
msgid "Also unassign this user from related issues and merge requests"
msgstr "ã¾ãŸã€é–¢é€£ã™ã‚‹ã‚¤ã‚·ãƒ¥ãƒ¼ã¨ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‹ã‚‰ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®å‰²ã‚Šå½“ã¦ã‚’解除ã—ã¾ã™"
+msgid "Alt text"
+msgstr "代替テキスト"
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr "ヘルプページã¨ãƒ˜ãƒ«ãƒ—ドロップダウン用ã®ä»£æ›¿ã‚µãƒãƒ¼ãƒˆURL。"
@@ -4649,12 +4671,6 @@ msgstr "エラーãŒç™ºç”Ÿã—ã¾ã—ãŸ"
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr "脆弱性ãŒãªã„å ´åˆã®ãƒ†ã‚¹ãƒˆçµæžœã®ã‚¨ãƒ©ãƒ¼ã¯ã€èª¤ã£ã¦ã‚·ã‚¹ãƒ†ãƒ ä¸Šã«è„†å¼±æ€§ãŒã‚ã‚‹ã¨ç¤ºã—ã¦ã„る。"
-msgid "An error occurred adding a draft to the thread."
-msgstr "ã“ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã«ä¸‹æ›¸ãを追加ã™ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
-
-msgid "An error occurred adding a new draft."
-msgstr "æ–°ã—ã„ドラフトã®è¿½åŠ ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
-
msgid "An error occurred creating the new branch."
msgstr "æ–°ã—ã„ブランãƒã®ä½œæˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -4697,6 +4713,12 @@ msgstr "承èªä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr "グループパスã®ç¢ºèªä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚æ›´æ–°ã—ã¦ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。"
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr " %{issuableType}ã®ä½œæˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr "イシューã®ä½œæˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
+
msgid "An error occurred while decoding the file."
msgstr "ファイルã®ãƒ‡ã‚³ãƒ¼ãƒ‰ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -4856,9 +4878,6 @@ msgstr "プロジェクトã®èª­ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ."
msgid "An error occurred while loading the blob controls."
msgstr "Blob コントロールã®èª­ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
-msgid "An error occurred while loading the data. Please try again."
-msgstr "データ読ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
-
msgid "An error occurred while loading the file"
msgstr "ファイルã®èª­ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
@@ -4920,7 +4939,7 @@ msgid "An error occurred while reordering issues."
msgstr "イシューã®ä¸¦ã¹æ›¿ãˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "An error occurred while resetting the compute usage."
-msgstr ""
+msgstr "コンピューティングã®ä½¿ç”¨çŠ¶æ³ã®ãƒªã‚»ãƒƒãƒˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "An error occurred while retrieving calendar activity"
msgstr "カレンダーアクティビティå–å¾—ã®éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
@@ -4974,9 +4993,6 @@ msgstr "設定ã®æ›´æ–°ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "An error occurred while updating labels."
msgstr "ラベルã®æ›´æ–°ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
-msgid "An error occurred while updating the comment"
-msgstr "コメントを更新中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
-
msgid "An error occurred while updating the configuration."
msgstr "設定ã®æ›´æ–°ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -5062,8 +5078,8 @@ msgstr "ä¸æ˜Žãªã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "Analytics"
msgstr "分æž"
-msgid "Analytics|Add to Dashboard"
-msgstr "ダッシュボードã«è¿½åŠ "
+msgid "Analytics|A visualization with that name already exists."
+msgstr "åŒåã®å¯è¦–化ãŒå­˜åœ¨ã—ã¾ã™ã€‚"
msgid "Analytics|Add visualizations"
msgstr "å¯è¦–化を追加"
@@ -5084,7 +5100,7 @@ msgid "Analytics|Browser Family"
msgstr "ブラウザファミリー"
msgid "Analytics|By GitLab"
-msgstr ""
+msgstr "GitLabã«ã‚ˆã‚‹"
msgid "Analytics|Cancel"
msgstr "キャンセル"
@@ -5128,12 +5144,21 @@ msgstr "データ"
msgid "Analytics|Data Table"
msgstr "データテーブル"
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr "日付ã¨æ™‚刻ã¯UTCタイムゾーンã§è¡¨ç¤ºã—ã¾ã™"
+
msgid "Analytics|Edit"
msgstr "編集"
+msgid "Analytics|Enter a visualization name"
+msgstr "å¯è¦–化ã®åå‰ã‚’入力"
+
msgid "Analytics|Error while saving dashboard"
msgstr "ダッシュボードã®ä¿å­˜ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+msgid "Analytics|Error while saving visualization."
+msgstr "å¯è¦–化ã®ä¿å­˜ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
+
msgid "Analytics|Host"
msgstr "ホスト"
@@ -5143,8 +5168,8 @@ msgstr "言語"
msgid "Analytics|Line Chart"
msgstr "折れ線グラフ"
-msgid "Analytics|New Analytics Visualization Title"
-msgstr "æ–°ã—ã„分æžå¯è¦–化タイトル"
+msgid "Analytics|New analytics visualization name"
+msgstr "æ–°ã—ã„分æžã®å¯è¦–化ã®åå‰"
msgid "Analytics|New dashboard"
msgstr "æ–°è¦ãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰"
@@ -5182,6 +5207,18 @@ msgstr "çµæžœãƒ‡ãƒ¼ã‚¿"
msgid "Analytics|Save"
msgstr "ä¿å­˜"
+msgid "Analytics|Save and add to Dashboard"
+msgstr "ä¿å­˜ã—ã¦ãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰ã«è¿½åŠ "
+
+msgid "Analytics|Save new visualization"
+msgstr "æ–°ã—ã„å¯è¦–化をä¿å­˜"
+
+msgid "Analytics|Select a measurement"
+msgstr "測定をé¸æŠž"
+
+msgid "Analytics|Select a visualization type"
+msgstr "å¯è¦–化ã®ç¨®é¡žã‚’é¸æŠž"
+
msgid "Analytics|Single Statistic"
msgstr "å˜ä¸€çµ±è¨ˆ"
@@ -5194,6 +5231,9 @@ msgstr "URL"
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr "ダッシュボード %{dashboardId} ã®æ›´æ–°"
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr "å¯è¦–化ã®%{visualizationName}を更新中"
+
msgid "Analytics|Users"
msgstr "ユーザー"
@@ -5212,6 +5252,12 @@ msgstr "å¯è¦–化デザイナ"
msgid "Analytics|Visualization Type"
msgstr "å¯è¦–化タイプ"
+msgid "Analytics|Visualization designer"
+msgstr "å¯è¦–化デザイナ"
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr "å¯è¦–化ã¯æ­£å¸¸ã«ä¿å­˜ã•ã‚Œã¾ã—ãŸ"
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr "ä¾å­˜é–¢ä¿‚ã«å«ã¾ã‚Œã¦ã„る既知ã®è„†å¼±æ€§ã‚’分æžã—ã¾ã™ã€‚"
@@ -5236,6 +5282,9 @@ msgstr "ãã—ã¦ã€ã“ã®ç™»éŒ²ãƒˆãƒ¼ã‚¯ãƒ³:"
msgid "Anonymous"
msgstr "匿å"
+msgid "Anonymous user"
+msgstr "匿åユーザー"
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr "別ã®ã‚¤ã‚·ãƒ¥ãƒ¼ãƒˆãƒ©ãƒƒã‚«ãƒ¼ã‚’ã™ã§ã«ä½¿ç”¨ã—ã¦ã„ã¾ã™ã€‚一度ã«ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã«ã§ãるイシュートラッカーサービスã¯1ã¤ã ã‘ã§ã™"
@@ -5300,10 +5349,10 @@ msgid "AppleAppStore|Leave empty to use your current Private Key."
msgstr "ç¾åœ¨ã®ãƒ—ライベートキーを使用ã™ã‚‹ã«ã¯ç©ºã®ã¾ã¾ã«ã—ã¦ãã ã•ã„。"
msgid "AppleAppStore|Only set variables on protected branches and tags"
-msgstr "ä¿è­·ã•ã‚ŒãŸãƒ–ランãƒã¨ã‚¿ã‚°ã«ã®ã¿å¤‰æ•°ã‚’設定ã™ã‚‹"
+msgstr "ä¿è­·ãƒ–ランãƒã¨ä¿è­·ã‚¿ã‚°ã«ã®ã¿å¤‰æ•°ã‚’設定ã™ã‚‹"
msgid "AppleAppStore|Protected branches and tags only"
-msgstr "ä¿è­·ã•ã‚ŒãŸãƒ–ランãƒã¨ã‚¿ã‚°ã®ã¿"
+msgstr "ä¿è­·ãƒ–ランãƒã¨ä¿è­·ã‚¿ã‚°ã®ã¿"
msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
msgstr "Apple ã® App Store Connect Issuer ID"
@@ -5366,7 +5415,7 @@ msgid "ApplicationSettings|Allowed domains for sign-ups"
msgstr "サインアップã«è¨±å¯ã•ã‚ŒãŸãƒ‰ãƒ¡ã‚¤ãƒ³"
msgid "ApplicationSettings|Allows users to delete their own accounts"
-msgstr "ユーザーãŒè‡ªåˆ†ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’削除ã§ãるよã†ã«ã—ã¾ã™"
+msgstr "ユーザーãŒè‡ªåˆ†ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’削除ã™ã‚‹ã“ã¨ã‚’許å¯ã™ã‚‹"
msgid "ApplicationSettings|Any user that visits %{host} and creates an account must be explicitly approved by an administrator before they can sign in. Only effective if sign-ups are enabled."
msgstr "%{host} ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’作æˆã™ã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒã€ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã§ãるよã†ã«ãªã‚‹ã«ã¯ç®¡ç†è€…ãŒæ˜Žç¤ºçš„ã«æ‰¿èªã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ ã“ã®è¨­å®šã¯ã‚µã‚¤ãƒ³ã‚¢ãƒƒãƒ—ãŒæœ‰åŠ¹ãªå ´åˆã«ã®ã¿æœ‰åŠ¹ã§ã™ã€‚"
@@ -6012,9 +6061,6 @@ msgstr "本当ã«ã‚ˆã‚ã—ã„ã§ã™ã‹ï¼Ÿã“ã®GPGキーを削除ã—ã¦ã‚‚ã€ã™
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr "本当ã«ã‚ˆã‚ã—ã„ã§ã™ã‹ï¼Ÿã“ã®ãƒ‡ãƒã‚¤ã‚¹ã¯GitLabã‹ã‚‰ã‚µã‚¤ãƒ³ã‚¢ã‚¦ãƒˆã•ã‚Œã€ã™ã¹ã¦ã®ãƒˆãƒ¼ã‚¯ãƒ³ãŒå–り消ã•ã‚Œã¾ã™ã€‚"
-msgid "Arrange charts"
-msgstr "ãƒãƒ£ãƒ¼ãƒˆã®ã‚¢ãƒ¬ãƒ³ã‚¸"
-
msgid "Artifact"
msgstr "アーティファクト"
@@ -6095,6 +6141,9 @@ msgstr "アーティファクトã®åˆè¨ˆã‚µã‚¤ã‚º"
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr "CI/CD ジョブã®ã‚¢ãƒ¼ãƒ†ã‚£ãƒ•ã‚¡ã‚¯ãƒˆã‚’ç°¡å˜ã«ç®¡ç†ã™ã‚‹ãŸã‚ã«ã€ã“ã®ãƒšãƒ¼ã‚¸ã‚’使用ã§ãるよã†ã«ã—ã¦ãã ã•ã„。 ç§ãŸã¡ã¯ä½¿ã„å‹æ‰‹ã‚’改善ã™ã‚‹ãŸã‚ã«å–り組んã§ãŠã‚Šã€ç§ãŸã¡ãŒè¡Œã£ã¦ã„る改善ã«ã¤ã„ã¦ã‚ãªãŸãŒæŒã£ã¦ã„るフィードãƒãƒƒã‚¯ã‚’æ„Ÿè¬ã—ã¾ã™ã€‚"
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr "ã“ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯æ–°è¦ã«ä½œæˆã•ã‚ŒãŸã‚‚ã®ã§ã‚ã‚‹ãŸã‚ã€ã¾ãšã¯ä»¥ä¸‹ã®ãƒªãƒ³ã‚¯ã‚’クリックã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’確èªã—ã¦ãã ã•ã„。"
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr "SASTã®æ©Ÿèƒ½ã‚’ã•ã‚‰ã«æ§‹ç¯‰ã—ã¦ã„ã中ã§ã€%{linkStart}ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼%{linkEnd}ã®SAST設定機能ã«é–¢ã™ã‚‹ãƒ•ã‚£ãƒ¼ãƒ‰ãƒãƒƒã‚¯ã‚’ãŠå¾…ã¡ã—ã¦ã„ã¾ã™ã€‚"
@@ -6149,7 +6198,7 @@ msgstr "自分自身を割り当ã¦ã‚‹"
msgid "Assign reviewer"
msgstr "レビュアーを割り当ã¦ã‚‹"
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr "レビュアーを割り当ã¦ã‚‹"
msgid "Assign severity"
@@ -6207,9 +6256,6 @@ msgstr "担当者ã«æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“"
msgid "Assignee lists not available with your current license"
msgstr "ç¾åœ¨ã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã§ã¯æ‹…当者リストを利用ã§ãã¾ã›ã‚“"
-msgid "Assignee(s)"
-msgstr "担当者"
-
msgid "Assignees"
msgstr "担当者"
@@ -6347,17 +6393,23 @@ msgstr "外部監査イベントストリームをå–å¾—ã™ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒ
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr "外部監査イベントストリームã®å®›å…ˆã‚’æ›´æ–°ã™ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr "ã“ã®ç§»å‹•å…ˆã‚’削除ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹?"
+
msgid "AuditStreams|Cancel editing"
msgstr "編集をキャンセル"
+msgid "AuditStreams|Client Email"
+msgstr "クライアントã®ãƒ¡ãƒ¼ãƒ«"
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr "カスタム HTTP ヘッダー(オプション)"
-msgid "AuditStreams|Defines which streaming events are captured"
-msgstr "ã©ã®ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã‚¤ãƒ™ãƒ³ãƒˆã‚’キャプãƒãƒ£ã™ã‚‹ã‹ã‚’定義ã—ã¾ã™"
+msgid "AuditStreams|Delete destination"
+msgstr "移動先を削除"
-msgid "AuditStreams|Delete %{link}"
-msgstr "%{link} を削除"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
+msgstr "ストリーミング先%{destination}を削除ã™ã‚‹ã¨ã€ã‚¹ãƒˆãƒªãƒ¼ãƒ ã•ã‚Œã¦ã„る監査イベントãŒåœæ­¢ã•ã‚Œã¾ã™"
msgid "AuditStreams|Destination URL"
msgstr "宛先URL"
@@ -6368,20 +6420,35 @@ msgstr "宛先ã«ãƒ•ã‚£ãƒ«ã‚¿ãŒé©ç”¨ã•ã‚Œã¦ã„ã¾ã™ã€‚ %{linkStart}フィãƒ
msgid "AuditStreams|Destinations receive all audit event data"
msgstr "宛先ã¯ã™ã¹ã¦ã®ç›£æŸ»ã‚¤ãƒ™ãƒ³ãƒˆãƒ‡ãƒ¼ã‚¿ã‚’å—ä¿¡ã—ã¾ã™"
-msgid "AuditStreams|Edit %{link}"
-msgstr "%{link} を編集"
-
msgid "AuditStreams|Event filtering (optional)"
msgstr "イベントã®ãƒ•ã‚£ãƒ«ã‚¿ãƒªãƒ³ã‚° (オプション)"
+msgid "AuditStreams|Filter by audit event type"
+msgstr "監査イベントタイプã§ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼"
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr "Google Cloud Logging"
+
+msgid "AuditStreams|HTTP endpoint"
+msgstr "HTTP エンドãƒã‚¤ãƒ³ãƒˆ"
+
msgid "AuditStreams|Header"
msgstr "ヘッダー"
+msgid "AuditStreams|Log ID"
+msgstr "ログID"
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr "最大 %{number} ã® HTTP ヘッダーã«é”ã—ã¾ã—ãŸã€‚"
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
-msgstr "利用å¯èƒ½ãªãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã¯ã‚ã‚Šã¾ã›ã‚“。 %{linkStart}フィルターを追加ã™ã‚‹ã«ã¯ã©ã†ã™ã‚Œã°ã„ã„ã§ã™ã‹ï¼Ÿ%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr "ヘッダーãŒã¾ã ä½œæˆã•ã‚Œã¦ã„ã¾ã›ã‚“。"
+
+msgid "AuditStreams|Private key"
+msgstr "プライベートキー"
+
+msgid "AuditStreams|Project ID"
+msgstr "プロジェクトID"
msgid "AuditStreams|Remove custom header"
msgstr "カスタムヘッダーを削除"
@@ -6389,6 +6456,9 @@ msgstr "カスタムヘッダーを削除"
msgid "AuditStreams|Save external stream destination"
msgstr "外部ストリームã®å®›å…ˆã‚’ä¿å­˜"
+msgid "AuditStreams|Select events"
+msgstr "イベントをé¸æŠž"
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr "監査イベントã®ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã‚’設定ã™ã‚‹"
@@ -6416,21 +6486,24 @@ msgstr "値"
msgid "AuditStreams|Verification token"
msgstr "検証トークン"
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr "%{link} ストリームã®æ¤œè¨¼ãƒˆãƒ¼ã‚¯ãƒ³"
-
-msgid "AuditStreams|View verification token"
-msgstr "検証トークンを表示"
+msgid "AuditStreams|audit-events"
+msgstr "監査イベント"
msgid "AuditStreams|ex: 1000"
msgstr "例: 1000"
msgid "AuditStreams|ex: limitation"
-msgstr "例: 制é™"
+msgstr "例:制é™"
msgid "AuditStreams|filtered"
msgstr "フィルター済ã¿"
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr "my-email@my-google-project.iam.gservice.account.com"
+
+msgid "AuditStreams|my-google-project"
+msgstr "my-google-project"
+
msgid "Aug"
msgstr "8月"
@@ -6968,28 +7041,28 @@ msgstr "請求"
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr "%{group_name}ã®ç¾åœ¨ã®ãƒ—ランã¯%{plan_name}ã§ã™ã€‚"
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr "1ヶ月ã‚ãŸã‚Š10GBã®è»¢é€"
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr "åå‰ç©ºé–“ã‚ãŸã‚Š5人ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼"
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7160,6 +7233,9 @@ msgstr "サãƒãƒ¼ãƒˆ"
msgid "BillingPlans|Talk to an expert today."
msgstr "今日ã€å°‚門家ã«ç›¸è«‡ã™ã‚‹ã€‚"
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr "ãã®å¾Œã€ã‚µãƒ–スクリプションã§ä½¿ç”¨ã™ã‚‹%{move_link_start}プロジェクトをãã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ç§»å‹•%{move_link_end}ã—ã¾ã™ã€‚"
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr "ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã¯ã€è¦ªã‚°ãƒ«ãƒ¼ãƒ—ã¨åŒã˜ãƒ—ランを使用ã—ã¾ã™ã€‚"
@@ -7187,11 +7263,8 @@ msgstr "ç§ãŸã¡ãŒãŠæ‰‹ä¼ã„ã—ã¾ã™ã€‚"
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr "GitLab ãŒãƒ–ロンズプランã®åˆ©ç”¨ã‚’終了ã—ã¦ã„ã‚‹é–“ã‚‚ã€%{eoa_bronze_plan_end_date}ã®å‰ã«ãƒ–ロンズサブスクリプションをもã†ä¸€åº¦æ›´æ–°ã§ãã¾ã™ã€‚ プレミアムプラン(最大25ユーザー)ã¸ã®æœŸé–“é™å®šã®ç„¡æ–™ã‚¢ãƒƒãƒ—グレードもæä¾›ã—ã¦ã„ã¾ã™ï¼ 変更点ã¨ç‰¹å…¸ã®è©³ç´°ã«ã¤ã„ã¦ã¯ã€%{announcement_link}ã‚’ã”覧ãã ã•ã„。"
-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 "グループãŒã‚ã‚Šã¾ã›ã‚“。 %{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 "%{move_link_start}ã“ã®ãƒ—ロジェクトをグループã«ç§»å‹•%{move_link_end} ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+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 your projects to it%{move_link_end}."
+msgstr "グループãŒã‚ã‚Šã¾ã›ã‚“。%{create_group_link_start}グループを作æˆ%{create_group_link_end}ã—ã€%{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} ã®æ©Ÿèƒ½ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’ãã®ã¾ã¾ã«ã§ãã¾ã™ã€‚"
@@ -7250,10 +7323,10 @@ msgstr "割当済ã¿ã®åˆ©ç”¨æž /ç¾åœ¨ãƒ—ランã§ã®åˆ©ç”¨å¯èƒ½æž "
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr "共有ランナーã¯ã€æœ‰åŠ¹ãªã‚¯ãƒ¬ã‚¸ãƒƒãƒˆã‚«ãƒ¼ãƒ‰ãŒç™»éŒ²ã•ã‚Œã‚‹ã¾ã§æœ‰åŠ¹ã«ã§ãã¾ã›ã‚“。"
-msgid "Billings|To use free units of compute 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 "共有ランナーã§CI/CDã‚’ç„¡æ–™ã§åˆ©ç”¨ã™ã‚‹ã«ã¯ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’クレジットカードã§èªè¨¼ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚クレジットカード情報をæä¾›ã—ãŸããªã„å ´åˆã¯ã€ç‹¬è‡ªã®ãƒ©ãƒ³ãƒŠãƒ¼ã‚’用æ„ã—ã€ãƒ—ロジェクトã®å…±æœ‰ãƒ©ãƒ³ãƒŠãƒ¼ã‚’無効ã«ã™ã‚‹ã“ã¨ã§ã‚‚パイプラインを実行ã§ãã¾ã™ã€‚ã“ã‚Œã«ã‚ˆã‚Šã€GitLabインフラストラクãƒãƒ£ã®ä¹±ç”¨ã‚’防止ã—ã€è»½æ¸›ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚%{strongStart}GitLabã¯ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆã‚«ãƒ¼ãƒ‰ã«è«‹æ±‚ã™ã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“。ã“ã®æƒ…å ±ã¯èªè¨¼ã®ãŸã‚ã«ã®ã¿ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚%{strongEnd}%{linkStart}詳細ã¯ã“ã¡ã‚‰%{linkEnd}。"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
+msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7265,7 +7338,7 @@ msgstr "アカウントを検証"
msgid "Billings|Validate user account"
msgstr "ユーザーアカウントを検証"
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7384,7 +7457,7 @@ msgid "Blame could not be loaded as a single page."
msgstr "Blame ã‚’å˜ä¸€ãƒšãƒ¼ã‚¸ã¨ã—ã¦èª­ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸã€‚"
msgid "Blame for binary files is not supported."
-msgstr "ãƒã‚¤ãƒŠãƒªãƒ•ã‚¡ã‚¤ãƒ«ã® blame ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“。"
+msgstr "ãƒã‚¤ãƒŠãƒªãƒ•ã‚¡ã‚¤ãƒ«ã®blameã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“。"
msgid "BlobViewer|View on %{environmentName}"
msgstr "%{environmentName} ã§è¡¨ç¤º"
@@ -7556,12 +7629,18 @@ msgstr "イシューã®ä½œæˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr "リストã®ä½œæˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr "ボードã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr "å­ã‚°ãƒ«ãƒ¼ãƒ—ã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr "グループプロジェクトã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr "グループã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr "イシューã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
@@ -7623,9 +7702,6 @@ msgstr "å…¨ã¦è¡¨ç¤º"
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr "%{issuableType} ã®ãƒ–ロックをå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ"
-msgid "Boards|List actions"
-msgstr "アクションã®ãƒªã‚¹ãƒˆ"
-
msgid "Boards|Move card"
msgstr "カードを移動"
@@ -7683,6 +7759,9 @@ msgstr "ã•ã‚‰ã«ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’読ã¿è¾¼ã‚€"
msgid "Board|Loading epics"
msgstr "エピックを読ã¿è¾¼ã¿ä¸­"
+msgid "Bold (%{modifierKey}B)"
+msgstr "Bold (%{modifierKey}B)"
+
msgid "Bold text"
msgstr "太字"
@@ -8065,7 +8144,7 @@ msgid "BroadcastMessages|Ends at"
msgstr "終了期日"
msgid "BroadcastMessages|Git remote responses"
-msgstr "Git リモートレスãƒãƒ³ã‚¹"
+msgstr "gitリモートレスãƒãƒ³ã‚¹"
msgid "BroadcastMessages|Green"
msgstr "ç·‘"
@@ -8100,8 +8179,17 @@ msgstr "パスã«ã¯ã€*/welcomeã®ã‚ˆã†ãªãƒ¯ã‚¤ãƒ«ãƒ‰ã‚«ãƒ¼ãƒ‰ã‚’å«ã‚ã‚‹ã“
msgid "BroadcastMessages|Red"
msgstr "赤"
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr "グループ/プロジェクトページã§ç‰¹å®šã®ãƒ­ãƒ¼ãƒ«ã‚’æŒã¤ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã®ã¿è¡¨ç¤º"
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
-msgstr "Git リモートレスãƒãƒ³ã‚¹ã¨ã—ã¦ãƒ–ロードキャストメッセージをコマンドラインインターフェイスã§è¡¨ç¤ºã™ã‚‹"
+msgstr "gitリモートレスãƒãƒ³ã‚¹ã¨ã—ã¦ãƒ–ロードキャストメッセージをコマンドラインインターフェースã§è¡¨ç¤º"
+
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr "ã™ã¹ã¦ã®ãƒšãƒ¼ã‚¸ã®å…¨ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«è¡¨ç¤º"
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr "特定ã®ãƒžãƒƒãƒã™ã‚‹ãƒšãƒ¼ã‚¸ã®ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«è¡¨ç¤º"
msgid "BroadcastMessages|Starts at"
msgstr "開始日時"
@@ -8109,12 +8197,12 @@ msgstr "開始日時"
msgid "BroadcastMessages|Target Path"
msgstr "対象ã®ãƒ‘ス"
+msgid "BroadcastMessages|Target broadcast message"
+msgstr "対象ã®ãƒ–ロードキャストメッセージ"
+
msgid "BroadcastMessages|Target roles"
msgstr "対象ã®ãƒ­ãƒ¼ãƒ«"
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
-msgstr "ブロードキャストメッセージã¯ã€ã“れらã®ãƒ­ãƒ¼ãƒ«ã‚’æŒã¤ãƒ—ロジェクトãŠã‚ˆã³ã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã®ã¿è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚"
-
msgid "BroadcastMessages|Theme"
msgstr "テーマ"
@@ -8137,7 +8225,7 @@ msgid "BroadcastMessages|Your message here"
msgstr "ã“ã“ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒã‚ã‚Šã¾ã™"
msgid "Browse CI/CD Catalog"
-msgstr "CI/CD カタログを閲覧ã™ã‚‹"
+msgstr "CI/CDカタログをå‚ç…§"
msgid "Browse Directory"
msgstr "ディレクトリを表示"
@@ -8349,6 +8437,9 @@ msgstr "月別"
msgid "By quarter"
msgstr "å››åŠæœŸåˆ¥"
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr "エンタープライズã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã«é–¢é€£ä»˜ã‘られãŸãƒ—ライマリメールを使用ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ã“ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒã‚¨ãƒ³ã‚¿ãƒ¼ãƒ—ライズユーザーã§ã‚ã‚‹ã“ã¨ã‚’èªã‚ã‚‹ã‚‚ã®ã¨ã—ã¾ã™ã€‚"
+
msgid "By week"
msgstr "週別"
@@ -8726,7 +8817,7 @@ msgid "Cannot create the abuse report. The user has been deleted."
msgstr "ä¸æ­£åˆ©ç”¨ãƒ¬ãƒãƒ¼ãƒˆã¯ä½œæˆã§ãã¾ã›ã‚“。ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯å‰Šé™¤ã•ã‚Œã¦ã„ã¾ã™ã€‚"
msgid "Cannot create the abuse report. This user has been banned."
-msgstr "ä¸æ­£åˆ©ç”¨ãƒ¬ãƒãƒ¼ãƒˆã‚’作æˆã§ãã¾ã›ã‚“。ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ãƒ–ロックã•ã‚Œã¦ã„ã¾ã™ã€‚"
+msgstr "ä¸æ­£åˆ©ç”¨ãƒ¬ãƒãƒ¼ãƒˆã‚’作æˆã§ãã¾ã›ã‚“。ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯BANã•ã‚Œã¦ã„ã¾ã™ã€‚"
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr "セキュリティãƒãƒªã‚·ãƒ¼ãŒå‚ç…§ã—ã¦ã„ã‚‹ %{profile_name} を削除ã§ãã¾ã›ã‚“"
@@ -8842,10 +8933,10 @@ msgstr "失敗率ã®å¤‰æ›´"
msgid "Change assignee"
msgstr "担当者ã®å¤‰æ›´"
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr "担当者を変更"
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr "担当者を変更ã—ã¾ã™ã€‚"
msgid "Change branches"
@@ -8863,10 +8954,10 @@ msgstr "マイルストーンã®å¤‰æ›´"
msgid "Change path"
msgstr "パスを変更"
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr "レビュアーを変更"
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr "レビュアーを変更ã—ã¾ã™ã€‚"
msgid "Change role"
@@ -8890,8 +8981,11 @@ msgstr "作業アイテムタイプを変更"
msgid "Change your password"
msgstr "パスワードを変更ã—ã¦ãã ã•ã„"
-msgid "Change your password or recover your current one"
-msgstr "パスワードを変更ã™ã‚‹ã‹ã€ç¾åœ¨ã®ãƒ‘スワードを入力ã—ã¦ãã ã•ã„"
+msgid "Change your password or recover your current one."
+msgstr "パスワードを変更ã™ã‚‹ã‹ã€ç¾åœ¨ã®ãƒ‘スワードを入力ã—ã¦ãã ã•ã„."
+
+msgid "Change your password."
+msgstr "パスワードを変更ã—ã¦ãã ã•ã„."
msgid "ChangeReviewer|All reviewers were removed."
msgstr "ã™ã¹ã¦ã®ãƒ¬ãƒ“ュアーãŒå‰Šé™¤ã•ã‚Œã¾ã—ãŸã€‚"
@@ -8938,14 +9032,14 @@ msgstr "マージリクエストãŒæœ‰åŠ¹ãªãŸã‚ã€å¤‰æ›´ã¯ %{branchName} ã«
msgid "Changed"
msgstr "変更"
-msgid "Changed assignee(s)."
-msgstr "担当者を変更ã—ã¾ã—ãŸã€‚"
+msgid "Changed assignees."
+msgstr "担当者ãŒå¤‰æ›´ã•ã‚Œã¾ã—ãŸã€‚"
msgid "Changed merge method to %{merge_method}"
msgstr "マージメ方法を %{merge_method} ã«å¤‰æ›´ã—ã¾ã—ãŸ"
-msgid "Changed reviewer(s)."
-msgstr "レビュアーを変更ã—ã¾ã—ãŸã€‚"
+msgid "Changed reviewers."
+msgstr "レビュアーãŒå¤‰æ›´ã•ã‚Œã¾ã—ãŸã€‚"
msgid "Changed squash option to %{squash_option}"
msgstr "スカッシュオプションを %{squash_option} ã«å¤‰æ›´ã—ã¾ã—ãŸ"
@@ -8986,9 +9080,6 @@ msgstr "残りã®æ–‡å­—æ•°"
msgid "Characters over limit"
msgstr "文字数制é™"
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr "グラフを表示ã§ãã¾ã›ã‚“。データリクエストãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã—ãŸãŸã‚ã§ã™ã€‚%{documentationLink}"
-
msgid "Chat"
msgstr "ãƒãƒ£ãƒƒãƒˆ"
@@ -9094,12 +9185,12 @@ msgstr "ユーザー・年間ã‚ãŸã‚Š %{pricePerUserPerYear} ドル"
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr "ユーザーã€10GBストレージã‚ãŸã‚Š %{selectedPlanPrice} ドル"
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
msgid_plural "Checkout|%d compute packs"
-msgstr[0] ""
+msgstr[0] "%dコンピューティングパック"
msgid "Checkout|%{cardType} ending in %{lastFourDigits}"
msgstr "%{cardType} ã®æœ«å°¾ %{lastFourDigits}"
@@ -9107,22 +9198,22 @@ msgstr "%{cardType} ã®æœ«å°¾ %{lastFourDigits}"
msgid "Checkout|%{name}'s GitLab subscription"
msgstr "%{name} 㮠GitLab サブスクリプション"
+msgid "Checkout|%{name}'s compute minutes"
+msgstr ""
+
msgid "Checkout|%{name}'s storage subscription"
msgstr "%{name} ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚µãƒ–スクリプション"
-msgid "Checkout|%{name}'s units of compute"
-msgstr ""
-
msgid "Checkout|%{quantity} GB of storage"
msgstr "%{quantity} GB ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸"
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] "%{quantity} ストレージ パック"
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr "%{selectedPlanText} プラン"
@@ -9160,9 +9251,9 @@ msgid "Checkout|City"
msgstr "市"
msgid "Checkout|Compute pack"
-msgstr ""
+msgstr "コンピューティングパック"
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9303,12 +9394,12 @@ msgstr "税"
msgid "Checkout|Total"
msgstr "åˆè¨ˆ"
+msgid "Checkout|Total compute minutes: %{quantity}"
+msgstr ""
+
msgid "Checkout|Total storage: %{quantity} GB"
msgstr "全ストレージ: %{quantity} GB"
-msgid "Checkout|Total units of compute: %{quantity}"
-msgstr ""
-
msgid "Checkout|Users"
msgstr "ユーザー"
@@ -9333,7 +9424,7 @@ msgstr "ストレージサブスクリプション"
msgid "Checkout|company or team"
msgstr "会社ã¾ãŸã¯ãƒãƒ¼ãƒ "
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9381,6 +9472,9 @@ msgstr "タイプをé¸æŠžã—ã¦ãã ã•ã„..."
msgid "Choose file…"
msgstr "ファイルをé¸æŠž..."
+msgid "Choose protected branch"
+msgstr "ä¿è­·ãƒ–ランãƒã‚’é¸æŠž"
+
msgid "Choose the top-level group for your repository imports."
msgstr "インãƒãƒ¼ãƒˆãƒªãƒã‚¸ãƒˆãƒªã®ãƒˆãƒƒãƒ—レベルã®ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžã—ã¦ãã ã•ã„。"
@@ -9408,29 +9502,32 @@ msgstr "Ci configã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™"
msgid "CiCatalog|About this project"
msgstr "ã“ã®ãƒ—ロジェクトã«ã¤ã„ã¦"
-msgid "CiCatalog|CI/CD Catalog resource"
-msgstr "CI/CD カタログリソース"
+msgid "CiCatalog|CI/CD Catalog"
+msgstr "CI/CDカタログ"
-msgid "CiCatalog|CI/CD catalog"
-msgstr "CI/CD カタログ"
+msgid "CiCatalog|CI/CD Catalog resource"
+msgstr "CI/CDカタログリソース"
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr "パイプラインコンãƒãƒ¼ãƒãƒ³ãƒˆãƒªãƒã‚¸ãƒˆãƒªã‚’作æˆã—ã€ãƒ‘イプライン構æˆã®å†åˆ©ç”¨ã‚’迅速ã‹ã¤å®¹æ˜“ã«ã—ã¾ã™ã€‚"
-msgid "CiCatalog|Get started with the CI/CD catalog"
-msgstr "CI/CD カタログã‹ã‚‰å§‹ã‚ã¾ã—ょã†"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
+msgstr "CI/CDカタログを使ã„始ã‚ã‚‹"
msgid "CiCatalog|Go to the project"
msgstr "プロジェクトã«ç§»å‹•"
msgid "CiCatalog|Last release at %{date}"
-msgstr "最終リリース %{date}"
+msgstr "最終リリース: %{date}"
msgid "CiCatalog|Mark project as a CI/CD Catalog resource"
msgstr "プロジェクトをCI/CDカタログリソースã¨ã—ã¦ãƒžãƒ¼ã‚¯"
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
-msgstr "プロジェクトをCI/CDカタログリソースã¨ã—ã¦ãƒžãƒ¼ã‚¯ã—ã¾ã™ã€‚ %{linkStart}CI/CDカタログã¨ã¯ä½•ã§ã™ã‹ï¼Ÿ%{linkEnd}"
+msgstr "プロジェクトをCI/CDカタログリソースã¨ã—ã¦ãƒžãƒ¼ã‚¯ã—ã¾ã™ã€‚%{linkStart}CI/CDカタログã¨ã¯ä½•ã§ã™ã‹?%{linkEnd}"
+
+msgid "CiCatalog|No release available"
+msgstr "利用å¯èƒ½ãªãƒªãƒªãƒ¼ã‚¹ã¯ã‚ã‚Šã¾ã›ã‚“"
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr "%{currentPage} / %{totalPage}"
@@ -9442,10 +9539,10 @@ msgid "CiCatalog|Repositories of pipeline components available in this namespace
msgstr "ã“ã®åå‰ç©ºé–“ã§åˆ©ç”¨ã§ãã‚‹ã€ãƒ‘イプラインコンãƒãƒ¼ãƒãƒ³ãƒˆã®ãƒªãƒã‚¸ãƒˆãƒªã€‚"
msgid "CiCatalog|The project must contain a README.md file and a template.yml file. When enabled, the repository is available in the CI/CD Catalog."
-msgstr "プロジェクトã«ã¯README.md ファイル㨠template.yml ファイルãŒå«ã¾ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚有効ã«ã™ã‚‹ã¨ã€ãƒªãƒã‚¸ãƒˆãƒªã¯ CI/CD カタログã§ä½¿ç”¨ã§ãã¾ã™ã€‚"
+msgstr "プロジェクトã«ã¯README.mdファイルã¨template.ymlファイルãŒå«ã¾ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚有効ã«ã™ã‚‹ã¨ã€CI/CDカタログã§ãƒªãƒã‚¸ãƒˆãƒªã‚’利用å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚"
msgid "CiCatalog|There was a problem fetching the CI/CD Catalog setting."
-msgstr "CI/CD カタログ設定ã®å–得中ã«å•é¡ŒãŒã‚ã‚Šã¾ã—ãŸã€‚"
+msgstr "CI/CDカタログ設定ã®å–得中ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "CiCatalog|There was a problem marking the project as a CI/CD Catalog resource."
msgstr "プロジェクトをCI/CDカタログリソースã¨ã—ã¦ãƒžãƒ¼ã‚¯ã™ã‚‹éš›ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -9454,13 +9551,16 @@ msgid "CiCatalog|There was an error fetching CI/CD Catalog resources."
msgstr "CI/CDカタログリソースã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "CiCatalog|This project is now a CI/CD Catalog resource."
-msgstr "プロジェクトã¯CI/CDカタログリソースã§ã™ã€‚"
+msgstr "ã“ã®ãƒ—ロジェクトã¯ç¾åœ¨ã€CI/CDカタログリソースã§ã™ã€‚"
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr "ã“ã®ãƒ—ロジェクトã¯CI/CDカタログリソースã¨ã—ã¦ãƒžãƒ¼ã‚¯ã•ã‚Œã€CI/CDカタログã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ã“ã®æ“作ã¯å–り消ã›ã¾ã›ã‚“。"
+msgid "CiCatalog|Unreleased"
+msgstr "未リリース"
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
-msgstr ""
+msgstr "パイプラインコンãƒãƒ¼ãƒãƒ³ãƒˆãƒªãƒã‚¸ãƒˆãƒªã®ä½œæˆã¨ç®¡ç†ã‚’支æ´ã—ã¤ã¤ã€ãƒ‘イプライン構æˆã®å†åˆ©ç”¨ã‚’容易ã«ã—ã¾ã™ã€‚ã”æ„見・ã”感想をãŠå¯„ã›ãã ã•ã„。"
msgid "CiCdAnalytics|Date range: %{range}"
msgstr "日付範囲: %{range}"
@@ -9490,7 +9590,7 @@ msgid "CiStatusLabel|preparing"
msgstr "準備"
msgid "CiStatusLabel|scheduled"
-msgstr ""
+msgstr "スケジュール済ã¿"
msgid "CiStatusLabel|skipped"
msgstr "スキップ済ã¿"
@@ -9532,7 +9632,7 @@ msgid "CiStatusText|preparing"
msgstr "準備"
msgid "CiStatusText|scheduled"
-msgstr ""
+msgstr "スケジュール済ã¿"
msgid "CiStatusText|skipped"
msgstr "スキップ済ã¿"
@@ -9541,13 +9641,13 @@ msgid "CiStatusText|waiting"
msgstr "å¾…ã¡"
msgid "CiStatusText|warning"
-msgstr ""
+msgstr "警告"
msgid "CiStatus|running"
msgstr "実行中"
msgid "CiVariables|Attributes"
-msgstr ""
+msgstr "属性"
msgid "CiVariables|Cancel"
msgstr "キャンセル"
@@ -9562,7 +9662,7 @@ msgid "CiVariables|Expanded"
msgstr "Expanded"
msgid "CiVariables|File"
-msgstr ""
+msgstr "ファイル"
msgid "CiVariables|Group"
msgstr "グループ"
@@ -9580,7 +9680,7 @@ msgid "CiVariables|Masked"
msgstr "マスク"
msgid "CiVariables|Maximum number of Inherited Group CI variables loaded (2000)"
-msgstr "ロードã•ã‚Œã‚‹ã€ç¶™æ‰¿ã•ã‚ŒãŸã‚°ãƒ«ãƒ¼ãƒ— CI 変数ã®æœ€å¤§æ•° (2000)"
+msgstr "継承ã•ã‚ŒãŸã‚°ãƒ«ãƒ¼ãƒ—ã®CI変数ã®æœ€å¤§æ•°(2000)ãŒãƒ­ãƒ¼ãƒ‰ã•ã‚Œã¾ã—ãŸ"
msgid "CiVariables|Maximum number of variables reached."
msgstr "変数ã®æœ€å¤§æ•°ã«é”ã—ã¾ã—ãŸã€‚"
@@ -9695,10 +9795,10 @@ msgid_plural "Clear %{count} images from cache?"
msgstr[0] "キャッシュã‹ã‚‰%{count}æžšã®ç”»åƒã‚’消去ã—ã¾ã™ã‹ ?"
msgid "Clear All"
-msgstr "å…¨ã¦ã‚¯ãƒªã‚¢"
+msgstr "ã™ã¹ã¦ã‚¯ãƒªã‚¢"
msgid "Clear all"
-msgstr ""
+msgstr "ã™ã¹ã¦ã‚¯ãƒªã‚¢"
msgid "Clear all repository checks"
msgstr "ã™ã¹ã¦ã®ãƒªãƒã‚¸ãƒˆãƒªã®ãƒã‚§ãƒƒã‚¯ã‚’クリアã™ã‚‹"
@@ -9829,6 +9929,9 @@ msgstr "ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’コメントãªã—㧠%{project} ã«ã‚¯ãƒ­ãƒ¼ãƒ³ã—
msgid "Close"
msgstr "クローズ"
+msgid "Close %{issuableType}"
+msgstr "%{issuableType}ã‚’é–‰ã˜ã‚‹"
+
msgid "Close %{issueType}"
msgstr "%{issueType} ã‚’é–‰ã˜ã‚‹"
@@ -9886,6 +9989,9 @@ msgstr "ã“ã® %{quick_action_target} ã‚’é–‰ã˜ã‚‹ã€‚"
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr "ã“ã®å•é¡Œã‚’%{duplicate_reference}ã¨é–¢é€£ã—ã¦ã€ã‹ã¤é‡è¤‡ã—ã¦ã„ã‚‹ã‚‚ã®ã¨ã—ã¦ã€ã‚¯ãƒ­ãƒ¼ã‚ºã—ã¾ã™ã€‚"
+msgid "Closing %{issuableType}..."
+msgstr "%{issuableType}ã‚’é–‰ã˜ã¦ã„ã¾ã™..."
+
msgid "Cloud Run"
msgstr "Cloud Run"
@@ -10428,7 +10534,7 @@ msgid "ClusterAgents|shared"
msgstr "共有"
msgid "ClusterAgent|An agent can have only two active tokens at a time"
-msgstr ""
+msgstr "エージェントãŒä¸€åº¦ã«æŒã¤ã“ã¨ãŒã§ãる有効ãªãƒˆãƒ¼ã‚¯ãƒ³ã¯2ã¤ã®ã¿ã§ã™"
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr "ユーザーã«ã¯ã€ã“ã®ãƒ—ロジェクトã®ãƒˆãƒ¼ã‚¯ãƒ³ã‚’作æˆã™ã‚‹ãŸã‚ã®æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“"
@@ -10478,9 +10584,6 @@ msgstr "ã“ã®Kubernetesクラスタ統åˆã«é–¢ã™ã‚‹è©³ç´°ã‚ªãƒ—ション"
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr "ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼ã®åå‰ç©ºé–“ã¨ã‚µãƒ¼ãƒ“スアカウントã®ç®¡ç†ã‚’GitLabã«è¨±å¯ã™ã‚‹ã€‚"
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr "GitLab ã¯ã€ã‚¯ãƒ©ã‚¹ã‚¿å†…ã®ãƒ¡ãƒˆãƒªã‚¯ã‚¹ç”¨ã«è¨­å®šã•ã‚ŒãŸPrometheusをクエリ検索ã§ãるよã†ã«ã—ã¾ã™ã€‚"
-
msgid "ClusterIntegration|Amazon EKS"
msgstr "Amazon EKS"
@@ -10565,9 +10668,6 @@ msgstr "ã”存知ã§ã™ã‹ï¼Ÿ"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr "Elastic Kubernetes サービス"
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr "Prometheus ã®çµ±åˆã‚’有効化"
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr "Kubernetes クラスターã¸ã® GitLab 接続を有効ã¾ãŸã¯ç„¡åŠ¹ã«ã—ã¾ã™ã€‚"
@@ -10628,9 +10728,6 @@ msgstr "çµ±åˆãŒç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™"
msgid "ClusterIntegration|Integration enabled"
msgstr "çµ±åˆãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã™"
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr "çµ±åˆã«ã‚ˆã‚Šã€ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚ŒãŸã‚¢ãƒ—リケーションを GitLab ワークフローã®ä¸€éƒ¨ã¨ã—ã¦ä½¿ç”¨ã§ãã¾ã™ã€‚"
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr "Kubernetesクラスターを作æˆã—ã¦ã„ã¾ã™..."
@@ -10866,19 +10963,22 @@ msgid "CodeNavigation|No references found"
msgstr "å‚ç…§ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
msgid "CodeOwners|An error occurred while loading code owners."
-msgstr "コードオーナーã®èª­ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ."
+msgstr "コードオーナーã®èª­ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "CodeOwners|Assign users and groups as approvers for specific file changes."
-msgstr "特定ã®ãƒ•ã‚¡ã‚¤ãƒ«å¤‰æ›´ã®æ‰¿èªè€…ã¨ã—ã¦ãƒ¦ãƒ¼ã‚¶ã¨ã‚°ãƒ«ãƒ¼ãƒ—を割り当ã¦ã¾ã™ã€‚"
+msgstr "特定ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¸ã®å¤‰æ›´ã®æ‰¿èªè€…ã¨ã—ã¦ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¨ã‚°ãƒ«ãƒ¼ãƒ—を割り当ã¦ã¾ã™ã€‚"
msgid "CodeOwners|Code owners"
msgstr "コードオーナー"
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr "コードオーナーã¯ã€ç‰¹å®šã®ãƒ•ã‚¡ã‚¤ãƒ«å¤‰æ›´ã‚’承èªã§ãるユーザーã¨ã‚°ãƒ«ãƒ¼ãƒ—ã§ã™ã€‚"
+
msgid "CodeOwners|Hide all"
msgstr "ã™ã¹ã¦éžè¡¨ç¤º"
msgid "CodeOwners|Learn more."
-msgstr "詳細情報"
+msgstr "詳細をã”覧ãã ã•ã„。"
msgid "CodeOwners|Show all"
msgstr "ã™ã¹ã¦è¡¨ç¤º"
@@ -10890,22 +10990,22 @@ msgid "CodeQuality|New code quality degradations on this line"
msgstr "ã“ã®è¡Œã®æ–°ã—ã„コードå“質ã¯ä½Žä¸‹"
msgid "CodeSuggestionsAlert|Code faster and more efficiently with AI-powered code suggestions in VS Code. 13 languages are supported, including JavaScript, Python, Go, Java, and Kotlin. Enable Code Suggestions in your %{preference_link_start}user profile preferences%{link_end} or %{docs_link_start}see the documentation%{link_end} to learn more."
-msgstr ""
+msgstr "Visual Studio Codeã§AIを活用ã—ãŸã‚³ãƒ¼ãƒ‰ã®æ案機能を使用ã—ã¦ã€ã‚ˆã‚Šé«˜é€Ÿã‹ã¤åŠ¹çŽ‡çš„ã«ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã—ã¾ã—ょã†ã€‚JavaScriptã€Pythonã€Goã€Javaã€Kotlinã‚’å«ã‚€13種類ã®è¨€èªžãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã™ã€‚%{preference_link_start}ユーザープロフィールã®è¨­å®š%{link_end}ã§ã€ã‚³ãƒ¼ãƒ‰ã®æ案機能を有効ã«ã™ã‚‹ã‹ã€ã¾ãŸã¯ %{docs_link_start}文書をå‚ç…§ã—ã¦%{link_end}詳細を確èªã—ã¦ãã ã•ã„。"
msgid "CodeSuggestionsAlert|Enable Code Suggestions"
-msgstr ""
+msgstr "コードã®æ案を有効化"
msgid "CodeSuggestionsAlert|Get started with Code Suggestions, available for free during the beta period."
-msgstr ""
+msgstr "ベータ期間中ã¯ç„¡æ–™ã§åˆ©ç”¨ã§ãるコードã®æ案を使ã„始ã‚ã¾ã—ょã†ã€‚"
msgid "CodeSuggestionsSM|&#8226; Agree to the %{terms_link_start}GitLab Testing Agreement%{link_end}.%{br} &#8226; Acknowledge that GitLab will send data from the instance, including personal data, to Google for cloud hosting.%{br} &nbsp;&nbsp;&nbsp;We may also send data to %{ai_docs_link_start}third-party AI providers%{link_end} to provide this feature."
-msgstr ""
+msgstr "• %{terms_link_start}GitLab Testing Agreement%{link_end}ã«åŒæ„ã—ã¾ã™ã€‚%{br}• GitLabãŒã‚¯ãƒ©ã‚¦ãƒ‰ãƒ›ã‚¹ãƒ†ã‚£ãƒ³ã‚°ã®ãŸã‚ã«ã€å€‹äººãƒ‡ãƒ¼ã‚¿ã‚’å«ã‚€ãƒ‡ãƒ¼ã‚¿ã‚’インスタンスã‹ã‚‰Googleã¸é€ä¿¡ã™ã‚‹ã“ã¨ã‚’èªã‚ã¾ã™ã€‚%{br} ã¾ãŸã€ã“ã®æ©Ÿèƒ½ã‚’æä¾›ã™ã‚‹ãŸã‚ã«ã€%{ai_docs_link_start}サードパーティã®AIプロãƒã‚¤ãƒ€ãƒ¼ã¸ãƒ‡ãƒ¼ã‚¿ã‚’é€ä¿¡%{link_end}ã™ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚"
msgid "CodeSuggestionsSM|Code Suggestions"
msgstr "コードã®æ案"
msgid "CodeSuggestionsSM|Enable Code Suggestion for users of this GitLab instance."
-msgstr "ã“ã® GitLab インスタンスã®ãƒ¦ãƒ¼ã‚¶å‘ã‘ã®ã‚³ãƒ¼ãƒ‰æ案を有効ã«ã—ã¾ã™ã€‚"
+msgstr "ã“ã®GitLabインスタンスã®ãƒ¦ãƒ¼ã‚¶ãƒ¼å‘ã‘ã«ã€ã‚³ãƒ¼ãƒ‰ã®æ案を有効ã«ã—ã¾ã™ã€‚"
msgid "CodeSuggestionsSM|Enter new personal access token"
msgstr "æ–°ã—ã„パーソナルアクセストークンを入力"
@@ -10914,10 +11014,16 @@ msgid "CodeSuggestionsSM|Personal access token"
msgstr "パーソナルアクセストークン"
msgid "CodeSuggestionsSM|Turn on Code Suggestions for this instance. By turning on this feature, you:"
-msgstr "ã“ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã®ã‚³ãƒ¼ãƒ‰æ案をオンã«ã—ã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã‚’オンã«ã™ã‚‹ã¨ã€ã‚ãªãŸã¯æ¬¡ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚"
+msgstr "ã“ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã§ã®ã‚³ãƒ¼ãƒ‰ã®æ案をオンã«ã—ã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã‚’オンã«ã™ã‚‹ã¨ã€æ¬¡ã®ã“ã¨ã‚’è¡Œãˆã¾ã™ã€‚"
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
-msgstr "GitLab.comã®ãƒ‘ーソナルアクセストークンã§ã™ã€‚パーソナルアクセストークンã®ä½œæˆã«ã¤ã„ã¦ã¯ã€ %{link_start}ドキュメント%{link_end} ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+msgstr "GitLab.comã®ãƒ‘ーソナルアクセストークンã§ã™ã€‚パーソナルアクセストークンã®ä½œæˆã«ã¤ã„ã¦ã¯ã€%{link_start}文書%{link_end}ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr "より高å“質ãªæ案をæä¾›ã™ã‚‹ãŸã‚ã€ç¾åœ¨%{code_suggestions_link_start}コードã®æ案%{link_end}ã§ã¯ã‚µãƒ¼ãƒ‰ãƒ‘ーティã®AIサービスを導入ã—ã¦ã„ã¾ã™ã€‚グループã®%{third_party_link_start}サードパーティサービスを無効ã«ã™ã‚‹%{link_end}ã‹ã€%{profile_settings_link_start}ユーザープロフィール%{link_end}ã§ã‚³ãƒ¼ãƒ‰ã®æ案全体を無効ã«ã§ãã¾ã™ã€‚"
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr "コードã®æ案を改善ã™ã‚‹ãŸã‚ã€ã‚µãƒ¼ãƒ‰ãƒ‘ーティã®AIサービスを使用ã—ã¦ã„ã¾ã™ã€‚"
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr "%{link_start}コードæ案ã¨ã¯?%{link_end}"
@@ -10926,19 +11032,16 @@ msgid "CodeSuggestions|Code Suggestions"
msgstr "コードã®æ案"
msgid "CodeSuggestions|Enable Code Suggestions"
-msgstr "コードæ案を有効化"
+msgstr "コードã®æ案を有効化"
msgid "CodeSuggestions|Get code suggestions as you write code in your IDE. %{link_start}Learn more.%{link_end}"
-msgstr "IDEã§ã‚³ãƒ¼ãƒ‰ã‚’書ãéš›ã®ã‚³ãƒ¼ãƒ‰ã®æ案をå—ã‘å–ã‚Šã¾ã—ょã†ã€‚ %{link_start}詳細ã¯ã“ã¡ã‚‰ã€‚%{link_end}"
+msgstr "IDEã§ã‚³ãƒ¼ãƒ‰ã‚’書ãéš›ã«ã€ã‚³ãƒ¼ãƒ‰ã®æ案を利用ã—ã¾ã—ょã†ã€‚%{link_start}詳細ã¯ã“ã¡ã‚‰%{link_end}"
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
-msgstr "ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ—ロジェクトã¯ã‚³ãƒ¼ãƒ‰æ案を使用ã§ãã¾ã™"
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr "%{link_start}テスト利用è¦ç´„%{link_end}ã®å¯¾è±¡"
+msgstr "ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ—ロジェクトã§ã¯ã‚³ãƒ¼ãƒ‰ã®æ案を使用ã§ãã¾ã™"
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
-msgstr "%{link_start}テスト利用è¦ç´„%{link_end}ã®å¯¾è±¡ã€‚"
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
+msgstr "%{terms_link_start}テスト利用è¦ç´„%{link_end}ãŒé©ç”¨ã•ã‚Œã¾ã™ã€‚コードã®æ案ã¯ç¾åœ¨ã€%{third_party_features_link_start}無効化%{link_end}ã•ã‚Œã¦ã„ã‚‹å ´åˆã‚’除ãã€ã‚µãƒ¼ãƒ‰ãƒ‘ーティã®AIサービスを使用ã—ã¦ã„ã¾ã™ã€‚"
msgid "Cohorts|Inactive users"
msgstr "アクティブã§ã¯ãªã„ユーザー"
@@ -11022,28 +11125,37 @@ msgid "Command"
msgstr "コマンド"
msgid "Command id '%{command}' must not start with '%{prefix}'"
-msgstr ""
+msgstr "コマンドID「%{command}ã€ã‚’「%{prefix}ã€ã§å§‹ã‚ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
msgid "Command line instructions"
msgstr "コマンドライン命令"
msgid "CommandPalette|Global Commands"
-msgstr ""
+msgstr "グローãƒãƒ«ã‚³ãƒžãƒ³ãƒ‰"
msgid "CommandPalette|Pages"
-msgstr ""
+msgstr "Pages"
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
-msgstr ""
+msgid "CommandPalette|Project files"
+msgstr "プロジェクトファイル"
-msgid "CommandPalette|Users"
-msgstr "ユーザー"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
+msgstr ""
msgid "CommandPalette|command"
msgstr "コマンド"
+msgid "CommandPalette|go to project file"
+msgstr "プロジェクトファイルã«ç§»å‹•"
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr "イシュー(3文字以上入力)"
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr "プロジェクト(3文字以上入力)"
+
msgid "CommandPalette|user (enter at least 3 chars)"
-msgstr "ユーザー (3 文字以上入力)"
+msgstr "ユーザー(3文字以上入力)"
msgid "Commands applied"
msgstr "é©ç”¨æ¸ˆã¿ã‚³ãƒžãƒ³ãƒ‰"
@@ -11133,18 +11245,12 @@ msgstr "コミットを削除ã—ã¾ã—ãŸ"
msgid "Commit message"
msgstr "コミットメッセージ"
-msgid "Commit message (optional)"
-msgstr "コミットメッセージ (オプション)"
-
msgid "Commit message generated by AI"
msgstr "AIã«ã‚ˆã£ã¦ç”Ÿæˆã•ã‚ŒãŸã‚³ãƒŸãƒƒãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸"
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr "%{start_time} ã‹ã‚‰ %{end_time} ã¾ã§ã® %{ref} ブランãƒã®çµ±è¨ˆ"
-msgid "Commit to %{branchName} branch"
-msgstr "%{branchName} ブランãƒã«ã‚³ãƒŸãƒƒãƒˆ"
-
msgid "CommitBoxTitle|Commit"
msgstr "コミット"
@@ -11212,7 +11318,7 @@ msgid "Commit|Tags"
msgstr "ã‚¿ã‚°"
msgid "Commit|There was an error fetching the commit references. Please try again later."
-msgstr "コミットå‚ç…§ã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
+msgstr "コミットã®å‚ç…§ã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
msgid "Commit|containing commit"
msgstr "コミットをå«ã‚€"
@@ -11271,15 +11377,30 @@ msgstr "比較ã™ã‚‹ã‚‚ã®ã¯ã‚ã‚Šã¾ã›ã‚“。"
msgid "CompareRevisions|Branches"
msgstr "ブランãƒ"
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr "%{boldStart}ソース%{boldEnd}リビジョンãŒ%{boldStart}ターゲット%{boldEnd} リビジョンã«ãƒžãƒ¼ã‚¸ã•ã‚Œã¦ã„るよã†ã«å¤‰æ›´ç‚¹ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚%{linkStart}リビジョンã®æ¯”較ã«ã¤ã„ã¦è©³ã—ãã¯ã“ã¡ã‚‰ã‚’ã”覧ãã ã•ã„。%{linkEnd}"
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr "ソース上ã®ã‚³ãƒŸãƒƒãƒˆ(%{commits_amount})"
+
msgid "CompareRevisions|Compare"
msgstr "比較"
+msgid "CompareRevisions|Compare revisions"
+msgstr "リビジョンを比較"
+
msgid "CompareRevisions|Create merge request"
msgstr "マージリクエストを作æˆ"
msgid "CompareRevisions|Filter by Git revision"
msgstr "Git リビジョンã§ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼"
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr "ソース作æˆä»¥é™ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã¸ã®å¤‰æ›´ã‚’å«ã‚ã‚‹"
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr "ソースã‹ã‚‰ã®å¤‰æ›´ã®ã¿"
+
msgid "CompareRevisions|Select Git revision"
msgstr "Git リビジョンã®é¸æŠž"
@@ -11289,6 +11410,12 @@ msgstr "ブランãƒ/ã‚¿ã‚°ã‚’é¸æŠž"
msgid "CompareRevisions|Select target project"
msgstr "ターゲットプロジェクトをé¸æŠž"
+msgid "CompareRevisions|Show changes"
+msgstr "変更を表示"
+
+msgid "CompareRevisions|Swap"
+msgstr "入れ替ãˆ"
+
msgid "CompareRevisions|Swap revisions"
msgstr "リビジョンã®å…¥ã‚Œæ›¿ãˆ"
@@ -11325,12 +11452,15 @@ msgstr "完了"
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr "%{duration_seconds} 秒ã§å®Œäº† (%{relative_time})"
-msgid "Compliance Report|Export as CSV"
-msgstr "CSV ã¨ã—ã¦ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ"
-
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
msgstr "フレームワークをCSVã¨ã—ã¦ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã—ã¾ã™ã€‚エクスãƒãƒ¼ãƒˆãŒå‡¦ç†ã•ã‚Œã‚‹ã¨ãƒ¡ãƒ¼ãƒ«ã§é€ä¿¡ã•ã‚Œã¾ã™ã€‚"
+msgid "Compliance Report|Export full report as CSV"
+msgstr "完全ãªãƒ¬ãƒãƒ¼ãƒˆã‚’CSVã¨ã—ã¦ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ"
+
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
+msgstr "マージリクエストé•åã‚’CSVã¨ã—ã¦ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã—ã¾ã™ã€‚エクスãƒãƒ¼ãƒˆãŒå‡¦ç†ã•ã‚Œã‚‹ã¨ãƒ¡ãƒ¼ãƒ«ã§é€ä¿¡ã•ã‚Œã¾ã™ã€‚"
+
msgid "Compliance Report|Frameworks"
msgstr "フレームワーク"
@@ -11440,7 +11570,7 @@ msgid "ComplianceFrameworks|Saved changes to compliance framework"
msgstr "コンプライアンスフレームワークã®å¤‰æ›´ã‚’ä¿å­˜ã—ãŸ"
msgid "ComplianceFrameworks|Set compliance pipeline configuration for projects that use this framework. %{linkStart}How do I create the configuration?%{linkEnd}"
-msgstr "ã“ã®ãƒ•ãƒ¬ãƒ¼ãƒ ãƒ¯ãƒ¼ã‚¯ã‚’使用ã™ã‚‹ãƒ—ロジェクトã®ã‚³ãƒ³ãƒ—ライアンスパイプラインã®è¨­å®šã‚’è¡Œã„ã¾ã™ã€‚%{linkStart}ã©ã†ã™ã‚Œã°ã“ã®è¨­å®šã‚’作æˆã§ãã¾ã™ã‹ ?%{linkEnd}"
+msgstr "ã“ã®ãƒ•ãƒ¬ãƒ¼ãƒ ãƒ¯ãƒ¼ã‚¯ã‚’使用ã™ã‚‹ãƒ—ロジェクトã®ã‚³ãƒ³ãƒ—ライアンスパイプラインã®è¨­å®šã‚’è¡Œã„ã¾ã™ã€‚%{linkStart}ã©ã†ã™ã‚Œã°ã“ã®è¨­å®šã‚’作æˆã§ãã¾ã™ã‹?%{linkEnd}"
msgid "ComplianceFrameworks|Set default"
msgstr "デフォルトを設定"
@@ -11526,6 +11656,9 @@ msgstr "2人未満ã®æ‰¿èª"
msgid "ComplianceReport|No projects found"
msgstr "プロジェクトãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+msgid "ComplianceReport|No projects found that match filters"
+msgstr "フィルターã«ä¸€è‡´ã™ã‚‹ãƒ—ロジェクトãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
msgid "ComplianceReport|No violations found"
msgstr "é•åã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
@@ -11560,25 +11693,25 @@ msgid "Component"
msgstr "コンãƒãƒ¼ãƒãƒ³ãƒˆ"
msgid "Component name '%{component}' for command id '%{command}' must not start with '%{prefix}'"
-msgstr ""
+msgstr "コマンドID「%{command}ã€ã®ã‚³ãƒ³ãƒãƒ¼ãƒãƒ³ãƒˆå「%{component}ã€ã‚’「%{prefix}ã€ã§å§‹ã‚ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
msgid "Component name '%{component}' must not start with '%{prefix}'"
-msgstr ""
+msgstr "コンãƒãƒ¼ãƒãƒ³ãƒˆå「%{component}ã€ã‚’「%{prefix}ã€ã§å§‹ã‚ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
msgid "Component type '%s' is not yet supported"
-msgstr "コンãƒãƒ¼ãƒãƒ³ãƒˆã‚¿ã‚¤ãƒ— '%s' ã¯ã¾ã ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
+msgstr "コンãƒãƒ¼ãƒãƒ³ãƒˆã‚¿ã‚¤ãƒ—「%sã€ã¯ã¾ã ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
msgid "Components must have a 'name'"
-msgstr "コンãƒãƒ¼ãƒãƒ³ãƒˆã«ã¯ 'name' ãŒå¿…è¦ã§ã™"
+msgstr "コンãƒãƒ¼ãƒãƒ³ãƒˆã«ã¯ã€Œnameã€ãŒå¿…è¦ã§ã™"
+
+msgid "Compute minutes"
+msgstr ""
msgid "Compute quota"
msgstr "クォータを計算"
msgid "Compute quota:"
-msgstr ""
-
-msgid "Confidence"
-msgstr "ä¿¡é ¼"
+msgstr "コンピューティングクォータ:"
msgid "Confidential"
msgstr "コンフィデンシャル"
@@ -11634,9 +11767,6 @@ msgstr "Gitaly ã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã‚’設定ã—ã¾ã™ã€‚"
msgid "Configure Integrations"
msgstr "連æºè¨­å®š"
-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 "GitLab 管ç†ãƒ†ãƒ³ãƒ—レートを使用ã—ã¦`.gitlab-ci.yml` ã§SAST IaC を設定ã—ã¦ãã ã•ã„。SAST IaC 設定をカスタマイズã™ã‚‹ã«ã¯ã€[変数ã®ã‚ªãƒ¼ãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã‚’追加](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) ã—ã¦ãã ã•ã„。"
@@ -11673,9 +11803,6 @@ msgstr "権é™ã€Large File Storageã€2è¦ç´ èªè¨¼ã¨é¡§å®¢é–¢ä¿‚ã®é«˜åº¦ãªè¨
msgid "Configure custom rules for Jira issue key matching"
msgstr "Jira 課題 キーã®ãƒžãƒƒãƒãƒ³ã‚°ã®ãŸã‚ã®ã‚«ã‚¹ã‚¿ãƒ ãƒ«ãƒ¼ãƒ«ã‚’設定ã™ã‚‹"
-msgid "Configure existing installation"
-msgstr "既存ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’設定ã™ã‚‹"
-
msgid "Configure pipeline"
msgstr "パイプラインã®è¨­å®š"
@@ -11838,15 +11965,9 @@ msgstr "リモート環境ã«æŽ¥ç¶šä¸­..."
msgid "Connecting..."
msgstr "接続ã—ã¦ã„ã¾ã™..."
-msgid "Connection failed"
-msgstr "接続ã«å¤±æ•—ã—ã¾ã—ãŸ"
-
msgid "Connection failure"
msgstr "接続ã«å¤±æ•—ã—ã¾ã—ãŸ"
-msgid "Connection timed out"
-msgstr "接続タイムアウト"
-
msgid "Consistency guarantee method"
msgstr "一貫性をä¿è¨¼ã™ã‚‹æ–¹æ³•"
@@ -12223,7 +12344,7 @@ msgid "Containers"
msgstr " コンテナ"
msgid "Contains only whitespace changes."
-msgstr "空白ã®å¤‰æ›´ã ã‘ã‚’å«ã¿ã¾ã™ã€‚"
+msgstr "ホワイトスペースã®å¤‰æ›´ã ã‘ã‚’å«ã¿ã¾ã™ã€‚"
msgid "Content"
msgstr "コンテンツ"
@@ -12231,9 +12352,6 @@ msgstr "コンテンツ"
msgid "Content parsed with %{link}."
msgstr "%{link} ã§ãƒ‘ースã•ã‚ŒãŸã‚³ãƒ³ãƒ†ãƒ³ãƒ„。"
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr "%{quickActionsDocsLinkStart}クイックアクション%{quickActionsDocsLinkEnd}ã®å ´åˆã¯ã€ %{keyboardStart}/%{keyboardEnd} を入力ã—ã¾ã™ã€‚"
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr "renderMarkdown 関数ã¾ãŸã¯ã‚«ã‚¹ã‚¿ãƒ ã‚·ãƒªã‚¢ãƒ©ã‚¤ã‚¶ã‚’æä¾›ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"
@@ -12357,6 +12475,39 @@ msgstr "計算ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãŒå¤šã™ãŽã¾ã™ã€‚インサイト設定ファイ
msgid "ContributionAnalytics|Total Contributions"
msgstr "ç·è²¢çŒ®åº¦"
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr "%{resourceParentLink}ã§æ‰¿èªã•ã‚ŒãŸãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆ%{targetLink}。"
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr " %{resourceParentLink} ã®%{refLink} ブランãƒã‚’削除ã—ã¾ã—ãŸã€‚"
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr " %{resourceParentLink} ã®%{refLink} タグを削除ã—ã¾ã—ãŸã€‚"
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr "プロジェクト(%{resourceParentLink})ã«å‚加ã—ã¾ã—ãŸã€‚"
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr "プロジェクト(%{resourceParentLink})を離脱ã—ã¾ã—ãŸã€‚"
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr " %{resourceParentLink} ã®%{refLink} ブランãƒã‚’プッシュã—ã¾ã—ãŸã€‚"
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr " %{resourceParentLink} ã®æ–°ã—ã„ã‚¿ã‚°%{refLink} をプッシュã—ã¾ã—ãŸã€‚"
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr " %{resourceParentLink} ã®%{refLink} ブランãƒã«ãƒ—ッシュã—ã¾ã—ãŸã€‚"
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr " %{resourceParentLink} ã®æ–°ã—ã„ã‚¿ã‚°%{refLink} ã«ãƒ—ッシュã—ã¾ã—ãŸã€‚"
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr "メンãƒãƒ¼ã‚·ãƒƒãƒ—ã®æœ‰åŠ¹æœŸé™ã®ãŸã‚ã€%{resourceParentLink}ã‹ã‚‰å‰Šé™¤ã•ã‚ŒãŸã€‚"
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr "…ãã®ä»– %{count} 件ã®ã‚³ãƒŸãƒƒãƒˆã‚り。 %{linkStart}比較%{linkEnd}"
+
msgid "Contributions for %{calendar_date}"
msgstr "%{calendar_date}ã®è²¢çŒ®"
@@ -12448,7 +12599,7 @@ msgid "Copy environment"
msgstr "環境をコピー"
msgid "Copy epic URL"
-msgstr "エピックURLをコピー"
+msgstr "エピックã®URLをコピー"
msgid "Copy evidence SHA"
msgstr "証拠 SHA をコピー"
@@ -12466,7 +12617,7 @@ msgid "Copy image URL"
msgstr "ç”»åƒã® URL をコピー"
msgid "Copy issue URL"
-msgstr "イシュー㮠URL をコピー"
+msgstr "イシューã®URLをコピー"
msgid "Copy issue URL to clipboard"
msgstr "イシュー㮠URL をクリップボードã«ã‚³ãƒ”ー"
@@ -12486,11 +12637,8 @@ msgstr "リンクをコピー"
msgid "Copy link URL"
msgstr "リンク㮠URL をコピー"
-msgid "Copy link to chart"
-msgstr "ãƒãƒ£ãƒ¼ãƒˆã¸ã®ãƒªãƒ³ã‚¯ã‚’コピー"
-
msgid "Copy merge request URL"
-msgstr "マージリクエスト URL をコピー"
+msgstr "マージリクエストã®URLをコピー"
msgid "Copy reference"
msgstr "å‚ç…§ã®ã‚³ãƒ”ー"
@@ -12654,6 +12802,9 @@ msgstr "トリガーを除去ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
msgid "Could not restore the group"
msgstr "グループをリストアã§ãã¾ã›ã‚“ã§ã—ãŸ"
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr "アクセストークン %{access_token_name} を無効ã«ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
@@ -12708,9 +12859,6 @@ msgstr "%{environment} を作æˆ"
msgid "Create %{humanized_resource_name}"
msgstr "%{humanized_resource_name} を作æˆ"
-msgid "Create %{type}"
-msgstr "%{type} を作æˆ"
-
msgid "Create %{workspace} label"
msgstr "%{workspace} ラベルを作æˆ"
@@ -12753,6 +12901,9 @@ msgstr "æ–°ã—ã„ブランãƒã‚’作æˆ"
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr "ã¾ã ãƒ•ã‚¡ã‚¤ãƒ«ãŒãªã„ãŸã‚ã€æ–°ã—ã„ファイルを作æˆã—ã¾ã™ã€‚ ãã®å¾Œã€ã‚ãªãŸã¯å¤‰æ›´ã‚’コミットã§ãã¾ã™ã€‚"
+msgid "Create a new fork"
+msgstr "æ–°ã—ã„フォークを作æˆ"
+
msgid "Create a new issue"
msgstr "イシューã®æ–°è¦ä½œæˆ"
@@ -13038,6 +13189,9 @@ msgstr "イシューステージã®çµ‚了"
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr "最大長 %{maxLength} 文字"
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr "最低%{minLength}文字"
+
msgid "CreateValueStreamForm|Name is required"
msgstr "åå‰ã¯å¿…é ˆã§ã™"
@@ -13182,9 +13336,6 @@ msgstr "作æˆä¸­"
msgid "Creating epic"
msgstr "エピックを作æˆã—ã¦ã„ã¾ã™"
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr "グラフを作æˆã™ã‚‹ã«ã¯ã€Prometheusサーãƒãƒ¼ã‹ã‚‰ã®ãƒ‡ãƒ¼ã‚¿ã‚’使用ã—ã¾ã™ã€‚ã“ã‚Œã«æ™‚é–“ãŒã‹ã‹ã‚‹å ´åˆã¯ã€ãƒ‡ãƒ¼ã‚¿ãŒåˆ©ç”¨ã§ãã‚‹ã‹ã©ã†ã‹ã‚’確èªã—ã¦ãã ã•ã„。"
-
msgid "Creator"
msgstr "作æˆè€…"
@@ -13652,7 +13803,7 @@ msgid "DORA4Metrics|Change failure rate (percentage)"
msgstr "失敗率を変更 (パーセント)"
msgid "DORA4Metrics|Closed issues"
-msgstr "クローズã•ã‚ŒãŸã‚¤ã‚·ãƒ¥ãƒ¼"
+msgstr "完了ã—ãŸã‚¤ã‚·ãƒ¥ãƒ¼"
msgid "DORA4Metrics|Critical Vulnerabilities over time"
msgstr "時間ã®çµŒéŽã¨ã¨ã‚‚ã«ç™ºç”Ÿã™ã‚‹é‡å¤§ãªè„†å¼±æ€§"
@@ -13775,7 +13926,7 @@ msgid "DORA4Metrics|The chart displays the median time between a merge request b
msgstr "ã“ã®ãƒãƒ£ãƒ¼ãƒˆã«ã¯ã€ %{linkStart}deployment_tier%{linkEnd} ã®å€¤ã«åŸºã¥ã„ãŸã€ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒãƒžãƒ¼ã‚¸ã•ã‚Œã¦ã‹ã‚‰ã€æœ¬ç•ªç¨¼åƒç’°å¢ƒã«ãƒ‡ãƒ—ロイã•ã‚Œã‚‹ã¾ã§ã®æ™‚é–“ã®ä¸­å¤®å€¤ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚"
msgid "DORA4Metrics|This is a lower-bound approximation. Your group has too many issues and MRs to calculate in real time."
-msgstr ""
+msgstr "ã“ã‚Œã¯ä¸‹é™è¿‘似値ã§ã™ã€‚グループã®ã‚¤ã‚·ãƒ¥ãƒ¼ã¨ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒå¤šã™ãŽã‚‹ãŸã‚ã€ãƒªã‚¢ãƒ«ã‚¿ã‚¤ãƒ ã§è¨ˆç®—ã§ãã¾ã›ã‚“。"
msgid "DORA4Metrics|Time to Restore Service"
msgstr "サービス復元ã¾ã§ã®æ™‚é–“"
@@ -14274,7 +14425,7 @@ msgid "Data type"
msgstr "データã®ç¨®é¡ž"
msgid "Database '%{database_name}' is using PostgreSQL %{pg_version_current}, but this version of GitLab requires PostgreSQL %{pg_version_minimum}. Please upgrade your environment to a supported PostgreSQL version. See %{pg_requirements_url} for details."
-msgstr "データベース㮠'%{database_name}' ã«ã¯ã€PostgreSQLã®%{pg_version_current} ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’使用ã—ã¦ã„ã¾ã™ã€‚ã—ã‹ã—ã€ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®GitLabã«ã¯å°‘ãã¨ã‚‚ PostgreSQL %{pg_version_minimum} ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒå¿…è¦ã§ã™ã€‚サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã‚‹PostgreSQLãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«ã‚¢ãƒƒãƒ—グレードã—ã¦ãã ã•ã„。詳細ã«ã¤ã„ã¦ã¯ã€ %{pg_requirements_url} ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+msgstr "データベース「%{database_name}ã€ã§ã¯ã€PostgreSQL %{pg_version_current}ãŒä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã™ãŒã€ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®GitLabã«ã¯å°‘ãªãã¨ã‚‚PostgreSQL %{pg_version_minimum}ãŒå¿…è¦ã§ã™ã€‚サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã‚‹PostgreSQLãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«ã”利用環境をアップグレードã—ã¦ãã ã•ã„。詳細ã«ã¤ã„ã¦ã¯ã€%{pg_requirements_url}ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
msgid "Database update failed"
msgstr "データベースã®æ›´æ–°ã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
@@ -14403,6 +14554,12 @@ msgstr "アーカイブã®è§£å‡å¾Œã‚µã‚¤ã‚ºã®æ¤œè¨¼ã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
msgid "Decrease"
msgstr "減少"
+msgid "Decrement suggestion line end"
+msgstr "æ案行ã®æœ«å°¾ã‚’減らã™"
+
+msgid "Decrement suggestion line start"
+msgstr "æ案行ã®å…ˆé ­ã‚’減らã™"
+
msgid "Default - Never run"
msgstr "デフォルト - 実行ã—ãªã„"
@@ -14455,7 +14612,7 @@ msgid "DefaultBranchProtection|Both developers and maintainers can push new comm
msgstr "開発者ã¨ãƒ¡ãƒ³ãƒ†ãƒŠãƒ¼ã¯ã€æ–°ã—ã„コミットをプッシュã—ãŸã‚Šã€å¼·åˆ¶çš„ã«ãƒ—ッシュã—ãŸã‚Šã€ãƒ–ランãƒã‚’削除ã—ãŸã‚Šã§ãã¾ã™ã€‚"
msgid "DefaultBranchProtection|Developers can push the initial commit to a repository, but none afterward. Maintainers can always push. No one can force push."
-msgstr "開発者ã¯åˆæœŸã‚³ãƒŸãƒƒãƒˆã‚’リãƒã‚¸ãƒˆãƒªã«ãƒ—ッシュã§ãã¾ã™ãŒã€ãã®å¾Œã¯ãƒ—ッシュã§ãã¾ã›ã‚“。メンテナã¯å¸¸ã«ãƒ—ッシュã§ãã¾ã™ã€‚誰も強制プッシュã§ãã¾ã›ã‚“。"
+msgstr "デベロッパーã¯åˆæœŸã‚³ãƒŸãƒƒãƒˆã‚’リãƒã‚¸ãƒˆãƒªã«ãƒ—ッシュã§ãã¾ã™ãŒã€ãã®å¾Œã¯ãƒ—ッシュã§ãã¾ã›ã‚“。メンテナーã¯å¸¸ã«ãƒ—ッシュã§ãã¾ã™ã€‚誰も強制プッシュã¯è¡Œãˆã¾ã›ã‚“。"
msgid "DefaultBranchProtection|Developers cannot push new commits, but are allowed to accept merge requests to the branch. Maintainers can push to the branch."
msgstr "開発者ã¯æ–°ã—ã„コミットをプッシュã§ãã¾ã›ã‚“ãŒã€ãƒ–ランãƒã¸ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’å—ã‘付ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
@@ -14467,7 +14624,7 @@ msgid "DefaultBranchProtection|Fully protected"
msgstr "完全ã«ä¿è­·"
msgid "DefaultBranchProtection|Fully protected after initial push"
-msgstr "最åˆã®ãƒ—ッシュ後ã«å®Œå…¨ãªä¿è­·"
+msgstr "最åˆã®ãƒ—ッシュ後ã«å®Œå…¨ã«ä¿è­·"
msgid "DefaultBranchProtection|Not protected"
msgstr "ä¿è­·ã•ã‚Œã¦ã„ãªã„"
@@ -14564,7 +14721,7 @@ msgstr "コードブロックを削除"
msgid "Delete column"
msgid_plural "Delete %d columns"
-msgstr[0] ""
+msgstr[0] "%d列を削除"
msgid "Delete comment"
msgstr "コメントを削除"
@@ -14625,7 +14782,7 @@ msgstr "リリース㮠%{release} を削除ã—ã¾ã™ã‹ï¼Ÿ"
msgid "Delete row"
msgid_plural "Delete %d rows"
-msgstr[0] ""
+msgstr[0] "%d行を削除"
msgid "Delete selected"
msgstr "é¸æŠžã—ãŸé …目を削除"
@@ -14666,6 +14823,9 @@ msgstr "変数を削除"
msgid "Delete video"
msgstr "ビデオを削除"
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr "デザインリãƒã‚¸ãƒˆãƒªã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã™ã‹ã€ç®¡ç†è€…ã«é€£çµ¡ã—ã¦ãã ã•ã„。"
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr "イベントã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã™ã‹ã€ç®¡ç†è€…ã«é€£çµ¡ã—ã¦ãã ã•ã„。"
@@ -14778,6 +14938,12 @@ msgid "Dependencies|%d vulnerability detected"
msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] "%d 件ã®è„†å¼±æ€§ãŒæ¤œå‡ºã•ã‚Œã¾ã—ãŸ"
+msgid "Dependencies|%{locationCount} locations"
+msgstr "%{locationCount} 箇所"
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr "%{projectCount} 件ã®ãƒ—ロジェクト"
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr "%{remainingLicensesCount} 件以上"
@@ -14820,9 +14986,15 @@ msgstr "場所ã¨ä¾å­˜é–¢ä¿‚ã®ãƒ‘ス"
msgid "Dependencies|Packager"
msgstr "パッケージャー"
+msgid "Dependencies|Projects"
+msgstr "プロジェクト"
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr "%{linkStart}最新ã®æˆåŠŸã—ãŸ%{linkEnd} スキャンã«åŸºã¥ãソフトウェア部å“表(SBOM)"
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr "最新ã®æˆåŠŸã—ãŸã‚¹ã‚­ãƒ£ãƒ³ã«åŸºã¥ãå„プロジェクトã®ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢éƒ¨å“表(SBOM)。"
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr "%{codeStartTag}ä¾å­˜é–¢ä¿‚スキャニング%{codeEndTag}ジョブã«å¤±æ•—ã—ä¾å­˜é–¢ä¿‚リストを生æˆã§ãã¾ã›ã‚“。ジョブãŒæ­£ã—ã実行ã•ã‚Œã¦ã„ã‚‹ã‹ç¢ºèªã—ãŸä¸Šã§ãƒ‘イプラインをå†å®Ÿè¡Œã—ã¦ãã ã•ã„。"
@@ -14856,6 +15028,9 @@ msgstr "ä¾å­˜é–¢ä¿‚ãƒã‚§ãƒ¼ãƒ³ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
msgid "Dependency list"
msgstr "ä¾å­˜é–¢ä¿‚リスト"
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr "ä¾å­˜æ€§ãƒ—ロキシキャッシュ㫠Docker イメージをä¿å­˜ã™ã‚‹ä»–ã®æ–¹æ³•ã«ã¤ã„ã¦ã¯ã€%{docLinkStart}ドキュメントをå‚ç…§%{docLinkEnd}ã—ã¦ãã ã•ã„。"
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr "キャッシュ内ã®ã™ã¹ã¦ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯å‰Šé™¤äºˆå®šã§ã™ã€‚"
@@ -14874,6 +15049,9 @@ msgstr "設定ã®æ§‹æˆ"
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr "%{count} ブロブã®ç”»åƒãŒå«ã¾ã‚Œã¦ã„ã¾ã™ï¼ˆ%{size})"
+msgid "DependencyProxy|Copy example"
+msgstr "サンプルをコピー"
+
msgid "DependencyProxy|Copy image path"
msgstr "イメージã®ãƒ‘スをコピー"
@@ -14898,6 +15076,9 @@ msgstr "ä¾å­˜é–¢ä¿‚プロキシを有効ã«ã—ã€ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’クリアã™
msgid "DependencyProxy|Image list"
msgstr "DependencyProxy |ç”»åƒãƒªã‚¹ãƒˆ"
+msgid "DependencyProxy|Pull image by digest example"
+msgstr "ダイジェストã®ä¾‹ã§ã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’å–å¾—ã™ã‚‹"
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr "削除スケジュール"
@@ -14907,6 +15088,9 @@ msgstr "キャッシュã«ã‚¤ãƒ¡ãƒ¼ã‚¸ãŒã‚ã‚Šã¾ã›ã‚“"
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr "イメージプレフィックスã¨ã‚­ãƒ£ãƒƒã‚·ãƒ¥å†…ã®ã‚‚ã®ã‚’見るã«ã¯ã€ %{linkStart}ä¾å­˜é–¢ä¿‚プロキシ%{linkEnd} ã‚’å‚ç…§ã—ã¦ãã ã•ã„"
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr "ä¾å­˜ãƒ—ロキシã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã« Docker イメージをä¿å­˜ã™ã‚‹ã«ã¯ã€ %{codeStart}.gitlab-ci.yml%{codeEnd} ファイル内ã®ã‚¿ã‚°ã«ã‚ˆã£ã¦ã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’プルã—ã¾ã™ã€‚ã“ã®ä¾‹ã§ã¯ã€ã‚¤ãƒ¡ãƒ¼ã‚¸ã¯ %{codeStart}alpine:latest%{codeEnd}ã§ã™ã€‚"
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr "有効ã«ã™ã‚‹ã¨ã€90日以上éŽãŽãŸç”»åƒãŒã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‹ã‚‰å‰Šé™¤ã•ã‚Œã¾ã™ã€‚"
@@ -15216,9 +15400,6 @@ msgstr "メンテナー"
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr "ä¿è­·ã•ã‚ŒãŸç’°å¢ƒã§ã®ãƒ‡ãƒ—ロイメントã«æ‰¿èªãƒ«ãƒ¼ãƒ«ãŒã©ã®ã‚ˆã†ã«é©ç”¨ã•ã‚Œã‚‹ã‹ã‚’設定ã—ã¾ã™ã€‚"
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr "パイプラインãŒå®Ÿè¡Œã•ã‚Œã‚‹ã¨ã€ãƒˆãƒªã‚¬ãƒ¼ãŒæ‰¿èªã•ã‚ŒãŸã¨ãã€ãƒ‡ãƒ—ロイジョブã¯è‡ªå‹•çš„ã«ãƒ‘イプラインã§æ‰¿èªã•ã‚Œã¾ã™ã€‚"
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr "ç¾åœ¨ã®æ‰¿èª: %{current}"
@@ -15370,12 +15551,6 @@ msgstr "æˆåŠŸ"
msgid "Deprecated API rate limits"
msgstr "éžæŽ¨å¥¨ã®APIレート制é™"
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr "å¯èƒ½ãªä»£æ›¿å“ã«ã¤ã„ã¦ã¯ã€ %{epicStart} 詳細ã«ã¤ã„㦠%{epicEnd}ã‚’ã”覧ãã ã•ã„。"
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr "メトリクス機能ã¯GitLab14.7ã§éžæŽ¨å¥¨ã«ãªã‚Šã¾ã—ãŸã€‚"
-
msgid "Deprioritize label"
msgstr "éžå„ªå…ˆãƒ©ãƒ™ãƒ«"
@@ -15385,9 +15560,6 @@ msgstr "変更ã®ç›®çš„ã¨ãƒ¬ãƒ“ュアーãŒçŸ¥ã£ã¦ãŠãã¹ãã“ã¨ã‚’説明
msgid "Description"
msgstr "説明"
-msgid "Description (alt text)"
-msgstr "説明 (代替テキスト)"
-
msgid "Description (optional)"
msgstr "説明 (オプション)"
@@ -15501,7 +15673,7 @@ msgid "DesignManagement|Download design"
msgstr "デザインをダウンロード"
msgid "DesignManagement|Edit description"
-msgstr "説明ã®ç·¨é›†"
+msgstr "説明を編集"
msgid "DesignManagement|Error uploading a new design. Please try again."
msgstr "æ–°ã—ã„デザインã®ã‚¢ãƒƒãƒ—ロード中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„."
@@ -15798,10 +15970,10 @@ msgid "Diagram saved successfully."
msgstr "ダイアグラムã¯æ­£å¸¸ã«ä¿å­˜ã•ã‚Œã¾ã—ãŸã€‚"
msgid "Diagrams.net"
-msgstr ""
+msgstr "Diagrams.net"
msgid "Diagrams.net URL"
-msgstr ""
+msgstr "Diagrams.net ã®URL"
msgid "Did not delete the source branch."
msgstr "ソースブランãƒã‚’削除ã—ãªã„。"
@@ -16027,7 +16199,7 @@ msgid "Display alerts from all configured monitoring tools."
msgstr "構æˆã•ã‚Œã¦ã„ã‚‹ã™ã¹ã¦ã®ç›£è¦–ツールã‹ã‚‰ã®ã‚¢ãƒ©ãƒ¼ãƒˆã‚’表示ã—ã¾ã™ã€‚"
msgid "Display as:"
-msgstr ""
+msgstr "表示形å¼:"
msgid "Display milestones"
msgstr "マイルストーンを表示"
@@ -16111,7 +16283,7 @@ msgid "DomainVerification|How do I configure a domain?"
msgstr "ドメインを設定ã™ã‚‹ã«ã¯?"
msgid "DomainVerification|How to set up DNS records?"
-msgstr "DNS レコードを設定ã™ã‚‹ã«ã¯ã©ã†ã™ã‚Œã°ã‚ˆã„ã§ã™ã‹?"
+msgstr "DNSレコードを設定ã™ã‚‹ã«ã¯ã©ã†ã™ã‚Œã°ã‚ˆã„ã§ã™ã‹?"
msgid "DomainVerification|Manually enter certificate information"
msgstr "証明書情報を手動ã§å…¥åŠ›"
@@ -16131,8 +16303,8 @@ msgstr "ドメイン所有権ã®æ¤œè¨¼ã«æˆåŠŸã—ã¾ã—ãŸ"
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr "次ã®ãƒ‰ãƒ¡ã‚¤ãƒ³ã¯ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ—ロジェクトã«å¯¾ã—ã¦è¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ 検証済ã¿ãƒ‰ãƒ¡ã‚¤ãƒ³ã«ãƒžãƒƒãƒã™ã‚‹ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’æŒã¤ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’確èªã™ã‚‹å¿…è¦ã¯ã‚ã‚Šã¾ã›ã‚“。"
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
-msgstr "ドメインã®æ‰€æœ‰æ¨©ã‚’確èªã™ã‚‹ã«ã¯ã€DNS設定内ã®TXTレコードã«ä¸Šè¨˜ã®ã‚­ãƒ¼ã‚’追加ã—ã¾ã™ã€‚ %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
+msgstr "ドメインã®æ‰€æœ‰æ¨©ã‚’確èªã™ã‚‹ã«ã¯ã€7日以内ã«DNS設定内ã®TXTレコードã«ä¸Šè¨˜ã®ã‚­ãƒ¼ã‚’追加ã—ã¾ã™ã€‚%{link_to_help}"
msgid "Don't have a group?"
msgstr "グループをãŠæŒã¡ã§ã¯ã‚ã‚Šã¾ã›ã‚“ã‹ï¼Ÿ"
@@ -16176,15 +16348,15 @@ msgstr "ダウンロード (%{fileSizeReadable})"
msgid "Download (%{size})"
msgstr "ダウンロード (%{size})"
-msgid "Download CSV"
-msgstr "CSV をダウンロード"
-
msgid "Download PDF"
msgstr "PDFダウンロード"
msgid "Download artifacts"
msgstr "アーティファクトã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰"
+msgid "Download artifacts archive"
+msgstr "アーティファクトã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–をダウンロード"
+
msgid "Download codes"
msgstr "コードをダウンロード"
@@ -16470,6 +16642,9 @@ msgstr "公開デプロイキーã®ç·¨é›†"
msgid "Edit sidebar"
msgstr "サイドãƒãƒ¼ã‚’編集"
+msgid "Edit single file"
+msgstr "å˜ä¸€ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’編集"
+
msgid "Edit table"
msgstr "テーブルを編集"
@@ -16575,6 +16750,9 @@ msgstr "メールをé€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ"
msgid "Email display name"
msgstr "メールã®è¡¨ç¤ºå"
+msgid "Email must be provided."
+msgstr "メールアドレスã®å…¥åŠ›ãŒå¿…è¦ã§ã™ã€‚"
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr "メールãŒç¢ºèªã§ãã¦ã„ã¾ã›ã‚“。 Salesforce ã§ãƒ¡ãƒ¼ãƒ«ã‚’確èªã—ã¦ãã ã•ã„。"
@@ -16756,7 +16934,7 @@ msgid "Enable dashboard limits on namespaces"
msgstr "åå‰ç©ºé–“ã®ãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰åˆ¶é™ã‚’有効ã«ã™ã‚‹"
msgid "Enable diagrams.net"
-msgstr ""
+msgstr "Diagrams.netを有効ã«ã™ã‚‹"
msgid "Enable email notification"
msgstr "メール通知を有効化"
@@ -16891,7 +17069,7 @@ msgid "End time"
msgstr "終了時間"
msgid "Endpoint name '%{endpoint}' of component '%{component}' must not start with '%{prefix}'"
-msgstr ""
+msgstr "コンãƒãƒ¼ãƒãƒ³ãƒˆã€Œ%{component}ã€ã®ã‚¨ãƒ³ãƒ‰ãƒã‚¤ãƒ³ãƒˆå「%{endpoint}ã€ã‚’「%{prefix}ã€ã§å§‹ã‚ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
msgid "Ends"
msgstr "終了"
@@ -16911,9 +17089,6 @@ msgstr "ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«äºŒè¦ç´ èªè¨¼ã‚’強制ã—ã¾ã™ã€‚"
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr "サービスアカウントキーをシークレットマãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã«ä¿å­˜ã™ã‚‹ã“ã¨ã§ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã‚’強化 - %{docLinkStart}GitLab ã§ã®ã‚·ãƒ¼ã‚¯ãƒ¬ãƒƒãƒˆãƒžãƒãƒ¼ã‚¸ãƒ¡ãƒ³ãƒˆ%{docLinkEnd} ã®è©³ç´°ã«ã¤ã„ã¦"
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr "GitLab サーãƒãƒ¼ã‹ã‚‰ Prometheus サーãƒãƒ¼ã¸ã®æŽ¥ç¶šãŒåˆ©ç”¨ã§ãã‚‹ã“ã¨ã‚’確èªã—ã¾ã™ã€‚"
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr "%{linkStart}環境ãŒCIパイプラインã®ãƒ‡ãƒ—ロイステージã®ä¸€éƒ¨ %{linkEnd}ã§ã‚ã‚‹ã“ã¨ã‚’確èªã—ã¦ã€ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼ã¸ã®ãƒ‡ãƒ—ロイを追跡ã—ã¾ã™ã€‚"
@@ -16974,9 +17149,6 @@ msgstr "モãƒã‚¤ãƒ«ç«¯æœ«ã®2è¦ç´ èªè¨¼ã‚¢ãƒ—リã‹ã‚‰ã®ã‚³ãƒ¼ãƒ‰ã‚’入力ã
msgid "Enter the following to confirm:"
msgstr "以下を入力ã—ã¦ç¢ºèªã—ã¾ã™:"
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr "アプリケーションã®åå‰ã‚’入力ã—ã¦ãã ã•ã„。固有㮠%{type} ã‚’è¿”ã—ã¾ã™ã€‚"
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr "秒数ã¾ãŸã¯\"1 hour\" ã®ã‚ˆã†ã«äººé–“ãŒèª­ã‚る入力を入力ã—ã¾ã™ã€‚ã“ã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã¯ã€ãƒ—ロジェクトã«è¨­å®šã•ã‚ŒãŸã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã‚ˆã‚Šã‚‚低ã„時間切れよりも優先ã•ã‚Œã¾ã™ã€‚"
@@ -17004,17 +17176,20 @@ msgstr "承èªã™ã‚‹ã«ã¯ãƒ‘スワードを入力ã—ã¦ãã ã•ã„"
msgid "Enterprise"
msgstr "エンタープライズ"
+msgid "Enterprise User"
+msgstr "エンタープライズユーザー"
+
+msgid "Enterprise User Account on GitLab"
+msgstr "GitLabã®ã‚¨ãƒ³ã‚¿ãƒ¼ãƒ—ライズユーザーアカウント"
+
msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr "ユーザー詳細を更新ã§ãã¾ã›ã‚“"
msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr "ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã€ã€Œã‚¨ãƒ³ã‚¿ãƒ¼ãƒ—ライズ ユーザーã€ã‚°ãƒ«ãƒ¼ãƒ—ã«ã¦å®šç¾©ã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ãƒ¼ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
-msgid "EnterpriseUsers|The user is already an enterprise user"
-msgstr "ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã™ã§ã«ã‚¨ãƒ³ã‚¿ãƒ¼ãƒ—ライズ ユーザーã§ã™ã€‚"
-
-msgid "EnterpriseUsers|The user is not a member of the group"
-msgstr "ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ¡ãƒ³ãƒãƒ¼ã§ã¯ã‚ã‚Šã¾ã›ã‚“。"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
+msgstr "ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã™ã§ã«ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚¨ãƒ³ã‚¿ãƒ¼ãƒ—ライズユーザーã§ã™"
msgid "Environment"
msgstr "環境"
@@ -17173,14 +17348,11 @@ msgid "Environments|Get started with environments"
msgstr "環境を始ã‚ã¾ã—ょã†"
msgid "Environments|GitLab agent"
-msgstr "GitLab エージェント"
+msgstr "GitLabエージェント"
msgid "Environments|Job"
msgstr "ジョブ"
-msgid "Environments|Learn about environments"
-msgstr "環境ã®è©³ç´°ã«ã¤ã„ã¦å­¦ã¶"
-
msgid "Environments|Learn more about stopping environments"
msgstr "環境ã®åœæ­¢ã«ã¤ã„ã¦"
@@ -17193,9 +17365,6 @@ msgstr "æ–°ã—ã„環境"
msgid "Environments|New environment"
msgstr "æ–°ã—ã„環境"
-msgid "Environments|No deployed environments"
-msgstr "デプロイã•ã‚ŒãŸç’°å¢ƒã¯ã‚ã‚Šã¾ã›ã‚“"
-
msgid "Environments|No deployments yet"
msgstr "未デプロイ"
@@ -17353,7 +17522,7 @@ msgid "Epic Boards"
msgstr "エピックボード"
msgid "Epic ID"
-msgstr ""
+msgstr "エピックID"
msgid "Epic actions"
msgstr "Epic アクション"
@@ -17374,10 +17543,10 @@ msgid "Epic not found for given params"
msgstr "指定ã•ã‚ŒãŸãƒ‘ラメータã«ã‚ã¦ã¯ã¾ã‚‹ã‚¨ãƒ”ックãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
msgid "Epic summary"
-msgstr ""
+msgstr "エピックã®æ¦‚è¦"
msgid "Epic title"
-msgstr ""
+msgstr "エピックタイトル"
msgid "Epics"
msgstr "エピック"
@@ -17391,12 +17560,6 @@ msgstr "エピックを使用ã™ã‚‹ã¨ã€ãƒ—ロジェクトã®ãƒãƒ¼ãƒˆãƒ•ã‚©ãƒª
msgid "Epics, issues, and merge requests"
msgstr "エピックã€ã‚¤ã‚·ãƒ¥ãƒ¼ã€ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆ"
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr "%{startDate} – %{dueDate}"
-
-msgid "Epics|%{startDate} – No due date"
-msgstr "%{startDate} – 期é™ãªã—"
-
msgid "Epics|Add a new epic"
msgstr "æ–°ã—ã„エピックを追加"
@@ -17412,9 +17575,6 @@ msgstr "本当㫠%{bStart}%{parentEpicTitle}%{bEnd} ã‹ã‚‰ %{bStart}%{targetIss
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr "空ã®ã¾ã¾ã«ã—ãŸå ´åˆã€ãƒžã‚¤ãƒ«ã‚¹ãƒˆãƒ¼ãƒ³ã®æ—¥ä»˜ã‚’継承ã—ã¾ã™"
-msgid "Epics|No start date – %{dueDate}"
-msgstr "開始日ãªã— – %{dueDate}"
-
msgid "Epics|Remove epic"
msgstr "エピックを削除"
@@ -17860,13 +18020,13 @@ msgid "Even if you reach the number of seats in your subscription, you can conti
msgstr "サブスクリプションã®ã‚·ãƒ¼ãƒˆæ•°ã«é”ã—ãŸã¨ã—ã¦ã‚‚ã€å¼•ã続ãユーザーを追加ã§ãã¾ã™ã€‚GitLab ã¯è¶…éŽæ–™é‡‘を請求ã—ã¾ã™ã€‚"
msgid "Event '%{event}' of type '%{event_type}' must not start with '%{prefix}'"
-msgstr ""
+msgstr "タイプ「%{event_type}ã€ã®ã‚¤ãƒ™ãƒ³ãƒˆã€Œ%{event}ã€ã‚’「%{prefix}ã€ã§å§‹ã‚ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
msgid "Event tag (optional)"
msgstr "イベントタグ(オプション) "
msgid "Event type '%s' is not yet supported"
-msgstr "イベント タイプ㮠'%s' ã¯ã¾ã ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
+msgstr "イベントタイプ「%sã€ã¯ã¾ã ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
msgid "EventFilterBy|Filter by all"
msgstr "ã™ã¹ã¦"
@@ -18365,12 +18525,18 @@ msgstr[0] "失敗ã—ãŸã‚¸ãƒ§ãƒ–"
msgid "Failed on"
msgstr "失敗日"
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr "ã“ã®ä½œæ¥­ã‚¢ã‚¤ãƒ†ãƒ ã‚’%{action}ã™ã‚‹ã®ã«å¤±æ•—ã—ã¾ã—ãŸ: %{reason}。"
+
msgid "Failed to add a Zoom meeting"
msgstr "Zoom ミーティングã®è¿½åŠ ã«å¤±æ•—ã—ã¾ã—ãŸ"
msgid "Failed to add a resource link"
msgstr "リソースリンクã®è¿½åŠ ã«å¤±æ•—ã—ã¾ã—ãŸ"
+msgid "Failed to add emoji. Please try again"
+msgstr "絵文字ã®è¿½åŠ ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„"
+
msgid "Failed to apply commands."
msgstr "コマンドã®é©ç”¨ã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
@@ -18408,9 +18574,6 @@ msgstr "ターゲットã®ãƒ—ロジェクトãŒå­˜åœ¨ã—ãªã„ã®ã§ã€ã“ã®ã‚¤
msgid "Failed to clone this issue: wrong parameters."
msgstr "ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã®ã‚¯ãƒ­ãƒ¼ãƒ³ã«å¤±æ•—ã—ã¾ã—ãŸ: パラメータãŒé–“é•ã£ã¦ã„ã¾ã™ã€‚"
-msgid "Failed to convert this work item: %{reason}."
-msgstr "ã“ã®ä½œæ¥­ã‚¢ã‚¤ãƒ†ãƒ ã®å¤‰æ›ã«å¤±æ•—ã—ã¾ã—ãŸ: %{reason}。"
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr "ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã®ãŸã‚ã®ãƒ–ランãƒã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
@@ -18555,6 +18718,9 @@ msgstr "Zoom ミーティングã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ"
msgid "Failed to remove a to-do item for the design."
msgstr "デザイン㮠ToDo アイテムã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
+msgid "Failed to remove emoji. Please try again"
+msgstr "絵文字ã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„"
+
msgid "Failed to remove mirror."
msgstr "ミラーã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
@@ -18576,6 +18742,9 @@ msgstr "ページã®å–å¾—ã«å¤±æ•—ã—ã¾ã—ãŸ"
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr "マージã®ç«¶åˆã®è§£æ±ºã‚’ä¿å­˜ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
+msgid "Failed to save namespace commit email."
+msgstr "åå‰ç©ºé–“ã®ã‚³ãƒŸãƒƒãƒˆãƒ¡ãƒ¼ãƒ«ã®ä¿å­˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
+
msgid "Failed to save new settings"
msgstr "æ–°ã—ã„設定をä¿å­˜ã§ãã¾ã›ã‚“ã§ã—ãŸ"
@@ -18642,9 +18811,6 @@ msgstr "ファビコンを削除ã—ã¾ã™ã€‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
msgid "Feature Flags"
msgstr "機能フラグ"
-msgid "Feature deprecation"
-msgstr "機能ã®å»ƒæ­¢"
-
msgid "Feature flag status"
msgstr "フィーãƒãƒ£ãƒ¼ãƒ•ãƒ©ã‚°ã®çŠ¶æ…‹"
@@ -18946,6 +19112,9 @@ msgstr "大ããªå¤‰æ›´ãŒã‚るファイルã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§æŠ˜ã‚ŠãŸãŸã¾
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr "パス %{path} 内ã®ãƒ•ã‚¡ã‚¤ãƒ«ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã€ãŠã‚ˆã³ã‚µãƒ–モジュールã®ã‚³ãƒŸãƒƒãƒˆå‚ç…§ %{ref}"
+msgid "Fill in merge request template"
+msgstr "マージリクエストã®ãƒ†ãƒ³ãƒ—レートã«è¨˜å…¥"
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr "以下ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã‚’入力ã—ã¦ãã ã•ã„。 %{strong_open}ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã® SAML èªè¨¼ã‚’有効ã«%{strong_close}ã—ã¦ã€ %{strong_open}変更をä¿å­˜%{strong_close}を押ã—ã¦ãã ã•ã„"
@@ -19151,10 +19320,10 @@ msgid "Footer message"
msgstr "フッターメッセージ"
msgid "For %{link_to_pipeline_ref}"
-msgstr ""
+msgstr "%{link_to_pipeline_ref}ã®å ´åˆ"
msgid "For %{ref}"
-msgstr ""
+msgstr "%{ref}ã®å ´åˆ"
msgid "For a faster browsing experience, only %{strongStart}%{visible} of %{total}%{strongEnd} files are shown. Download one of the files below to see all changes."
msgstr "より高速ãªãƒ–ラウジング体験をæä¾›ã™ã‚‹ãŸã‚ã€%{strongStart}%{total}個ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ã†ã¡ã€%{visible}個%{strongEnd}ã®ã¿ã‚’表示ã—ã¾ã™ã€‚ã™ã¹ã¦ã®å¤‰æ›´ã‚’表示ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã®ã„ãšã‚Œã‹ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ダウンロードã—ã¦ãã ã•ã„。"
@@ -19177,9 +19346,6 @@ msgstr "ãã‚Œãžã‚Œã®ã‚¸ãƒ§ãƒ–ã«å¯¾ã—ã¦ã€ãƒªãƒã‚¸ãƒˆãƒªã‚’クローンã—
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr "ãã‚Œãžã‚Œã®ã‚¸ãƒ§ãƒ–ã«å¯¾ã—ã¦ã€ãƒ—ロジェクトã®ãƒ¯ãƒ¼ã‚¯ã‚¹ãƒšãƒ¼ã‚¹ã‚’å†åˆ©ç”¨ã—ã¾ã™ã€‚ワークスペースãŒå­˜åœ¨ã—ãªã„å ´åˆã¯ã€ %{code_open}git clone%{code_close} を使用ã—ã¾ã™ã€‚"
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr "ãŸã¨ãˆã°ã€ãƒˆãƒ¼ã‚¯ãƒ³ã‚„トークンã®ç›®çš„を使用ã™ã‚‹ã‚¢ãƒ—リケーションã§ã™ã€‚ ã™ã¹ã¦ã® %{resource_type} メンãƒãƒ¼ã«è¡¨ç¤ºã•ã‚Œã‚‹ãŸã‚ã€ãƒˆãƒ¼ã‚¯ãƒ³ã®åå‰ã«æ©Ÿå¯†æƒ…報を与ãˆãªã„ã§ãã ã•ã„。"
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr "ã“ã®åˆ¶é™ã‚ˆã‚Šå¤§ããªãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«åã®ã¿ã‚’インデックスã—ã¾ã™ã€‚ファイルã®å†…容ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹åŒ–ã¯ã§ããšã€æ¤œç´¢ã‚‚ã§ãã¾ã›ã‚“。"
@@ -19189,6 +19355,9 @@ msgstr "一般的ãªä»•äº‹ã®ãŸã‚ã«"
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr "個人ã§ä½¿ç”¨ã™ã‚‹å ´åˆã¯ã€Enterpriseã®ãƒ¡ãƒ¼ãƒ«ãƒ‰ãƒ¡ã‚¤ãƒ³ã¾ãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—ã«é–¢é€£ã—ã¦ã„ãªã„ã€å€‹äººã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã§åˆ¥ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’作æˆã—ã¦ãã ã•ã„。"
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr "個人ã§ä½¿ç”¨ã™ã‚‹å ´åˆã¯ã€ä¼šç¤¾ã®ãƒ¡ãƒ¼ãƒ«ãƒ‰ãƒ¡ã‚¤ãƒ³ã«é–¢é€£ã—ã¦ã„ãªã„ã€å€‹äººã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã§åˆ¥ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’作æˆã—ã¦ãã ã•ã„。"
+
msgid "For investigating IT service disruptions or outages"
msgstr "ITサービスã®ä¸­æ–­ã‚„åœæ­¢ã‚’調査ã™ã‚‹ãŸã‚"
@@ -19205,13 +19374,13 @@ msgid "For more information, see the File Hooks documentation."
msgstr "詳ã—ã„情報ã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ãƒ•ãƒƒã‚¯ã®æ–‡æ›¸ã‚’ã”覧ãã ã•ã„"
msgid "For the next few releases, you can go to your avatar at any time to turn the new navigation on and off."
-msgstr "次ã®ã„ãã¤ã‹ã®ãƒªãƒªãƒ¼ã‚¹ã§ã¯ã€ã‚¢ãƒã‚¿ãƒ¼ã§ã„ã¤ã§ã‚‚æ–°ã—ã„ナビゲーションをオンã¾ãŸã¯ã‚ªãƒ•ã«ã§ãã¾ã™ã€‚"
+msgstr "今後ã®ã„ãã¤ã‹ã®ãƒªãƒªãƒ¼ã‚¹ã§ã¯ã€ã‚¢ãƒã‚¿ãƒ¼ã§ã„ã¤ã§ã‚‚æ–°ã—ã„ナビゲーションをオンã¾ãŸã¯ã‚ªãƒ•ã«ã§ãã¾ã™ã€‚"
msgid "Forbidden"
msgstr "ç¦æ­¢"
msgid "Forecast horizon must be positive and %{max_horizon} days at the most."
-msgstr ""
+msgstr "予測ホライズンã¯æ­£ã®æ•°å€¤ã§ã€æœ€å¤§%{max_horizon}æ—¥ã¾ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
msgid "Forgot your password?"
msgstr "パスワードを忘れã¾ã—ãŸã‹ï¼Ÿ"
@@ -19358,7 +19527,7 @@ msgid "Framework successfully deleted"
msgstr "フレームワークãŒæ­£å¸¸ã«å‰Šé™¤ã•ã‚Œã¾ã—ãŸ"
msgid "Frameworks can not be added to projects in personal namespaces. %{linkStart}What are personal namespaces?%{linkEnd}"
-msgstr "フレームワークã¯å€‹äººã®åå‰ç©ºé–“ã®ãƒ—ロジェクトã«è¿½åŠ ã§ãã¾ã›ã‚“。 %{linkStart}個人ã®åå‰ç©ºé–“ã¨ã¯ä½•ã§ã™ã‹ï¼Ÿ%{linkEnd}"
+msgstr "フレームワークã¯å€‹äººã®åå‰ç©ºé–“ã®ãƒ—ロジェクトã«ã¯è¿½åŠ ã§ãã¾ã›ã‚“。%{linkStart}個人ã®åå‰ç©ºé–“ã¨ã¯ä½•ã§ã™ã‹?%{linkEnd}"
msgid "Free Trial of GitLab.com Ultimate"
msgstr "GitLab.com 究極プランã®ç„¡å„Ÿè©¦ç”¨"
@@ -19370,6 +19539,9 @@ msgid "Free groups are limited to %{free_user_limit} member and the remaining me
msgid_plural "Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group."
msgstr[0] "無料グループã¯%{free_user_limit}人ã®ãƒ¡ãƒ³ãƒãƒ¼é™å®šã§ã€æ®‹ã‚Šã®ãƒ¡ãƒ³ãƒãƒ¼ã¯è¶…éŽã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã¨ãªã‚Šã€ã‚°ãƒ«ãƒ¼ãƒ—ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©ã‚’失ã„ã¾ã™ã€‚"
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr "Freeã®æœ€ä¸Šä½ã‚°ãƒ«ãƒ¼ãƒ—ã¯ã¾ã‚‚ãªãユーザー数ãŒ%{free_users_limit}人ã¾ã§ã«ã€ãƒ‡ãƒ¼ã‚¿ã¯%{free_storage_limit}ã¾ã§ã«åˆ¶é™ã•ã‚Œã¾ã™"
+
msgid "Free trial will expire in %{days}"
msgstr "無料トライアルã¯%{days}後ã«æœŸé™åˆ‡ã‚Œã«ãªã‚Šã¾ã™"
@@ -19430,6 +19602,9 @@ msgstr "%{providerTitle} ã‹ã‚‰"
msgid "From issue creation until deploy to production"
msgstr "イシューãŒç™»éŒ²ã•ã‚Œã¦ã‹ã‚‰ãƒ—ロダクションã«ãƒ‡ãƒ—ロイã•ã‚Œã‚‹ã¾ã§"
+msgid "From line %{line1} to %{line2}"
+msgstr "%{line1} è¡Œã‹ã‚‰ %{line2} è¡Œã¾ã§"
+
msgid "From merge request merge until deploy to production"
msgstr "マージリクエストãŒãƒžãƒ¼ã‚¸ã•ã‚Œã¦ã‹ã‚‰ãƒ—ロダクションã«ãƒ‡ãƒ—ロイã•ã‚Œã‚‹ã¾ã§"
@@ -19487,6 +19662,9 @@ msgstr "æ–°ã—ㄠエクスãƒãƒ¼ãƒˆã‚’生æˆ"
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr "GitLab API ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒå¿…è¦ãªã‚¢ãƒ—リケーションã®ãŸã‚ã«ã€ã“ã®ãƒ—ロジェクトã«é©ç”¨ã•ã‚Œã‚‹ãƒ—ロジェクトアクセストークンを生æˆã—ã¾ã™ã€‚"
+msgid "Generate root cause analysis"
+msgstr "根本原因ã®åˆ†æžã‚’生æˆã™ã‚‹"
+
msgid "Generate site and private keys at"
msgstr "サイトã¨ç§˜å¯†éµã‚’生æˆã™ã‚‹"
@@ -20101,9 +20279,6 @@ msgstr "GitLabを始ã‚よã†"
msgid "Get started with error tracking"
msgstr "エラー追跡を開始"
-msgid "Get started with performance monitoring"
-msgstr "パフォーマンスモニタリングã—ãªãŒã‚‰å§‹ã‚ã‚‹"
-
msgid "Get started!"
msgstr "始ã‚ã¾ã—ょã†"
@@ -20584,8 +20759,11 @@ msgstr "ã“ã®çµ±åˆã‚’使用ã™ã‚‹ã«ã¯ã€å„ユーザー ㌠GitLab アカウ
msgid "Gitpod|https://gitpod.example.com"
msgstr "https://gitpod.example.com"
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
-msgstr "フィードãƒãƒƒã‚¯ã‚’é€ã‚‹"
+msgstr "フィードãƒãƒƒã‚¯ã‚’ãŠå¯„ã›ãã ã•ã„"
msgid "Given access %{time_ago}"
msgstr "%{time_ago} ã«ã‚¢ã‚¯ã‚»ã‚¹è¨±å¯"
@@ -20623,6 +20801,9 @@ msgstr "集約ã®èª­ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼ã€‚"
msgid "GlobalSearch|Close"
msgstr "é–‰ã˜ã‚‹"
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr "集計エラーをå–得中ã§ã™ã€‚"
+
msgid "GlobalSearch|Group"
msgstr "グループ"
@@ -20641,6 +20822,9 @@ msgstr "ç§ãŒä½œæˆã—ãŸã‚¤ã‚·ãƒ¥ãƒ¼"
msgid "GlobalSearch|Issues assigned to me"
msgstr "自分ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸã‚¤ã‚·ãƒ¥ãƒ¼"
+msgid "GlobalSearch|Label(s)"
+msgstr "ラベル"
+
msgid "GlobalSearch|Language"
msgstr "言語"
@@ -20653,6 +20837,9 @@ msgstr "自分ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆ"
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr "ç§ãŒãƒ¬ãƒ“ューアã§ã‚ã‚‹ã€ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆ"
+msgid "GlobalSearch|No labels found"
+msgstr "ラベルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
msgid "GlobalSearch|Project"
msgstr "プロジェクト"
@@ -20689,6 +20876,9 @@ msgstr "GitLab を検索 %{kbdOpen}/%{kbdClose}"
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr "プロジェクトやイシューãªã©ã‚’検索ã™ã‚‹ã€‚"
+msgid "GlobalSearch|Search labels"
+msgstr "ラベルを検索"
+
msgid "GlobalSearch|Search results are loading"
msgstr "検索çµæžœã‚’読ã¿è¾¼ã¿ä¸­"
@@ -21118,9 +21308,6 @@ msgstr "グループ情報:"
msgid "Group information"
msgstr "グループ情報"
-msgid "Group is required when cluster_type is :group"
-msgstr "cluster_type ãŒã‚°ãƒ«ãƒ¼ãƒ—ã®å ´åˆã€ã‚°ãƒ«ãƒ¼ãƒ—ãŒå¿…è¦ã§ã™"
-
msgid "Group jobs by"
msgstr "ジョブをグループ化"
@@ -21412,6 +21599,9 @@ msgstr "SCIMトークン"
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr "SAML トークン㮠SHA1 フィンガープリントã§è¨¼æ˜Žæ›¸ã«ç½²åã—ã¾ã™ã€‚ã“ã‚Œã¯ã‚µãƒ ãƒ—リントã¨å‘¼ã°ã‚Œã‚¢ã‚¤ãƒ‡ãƒ³ãƒ†ã‚£ãƒ†ã‚£ãƒ—ロãƒã‚¤ãƒ€ãƒ¼ã‹ã‚‰å–å¾—ã§ãã¾ã™ã€‚"
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr "SAMLセッションã®æœ‰åŠ¹æœŸé™ãŒåˆ‡ã‚Œã¦ã„ã‚‹ãŸã‚ã€ä¸€éƒ¨ã®ãƒ–ランãƒã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“。ブランãƒã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ã€å†èªè¨¼ã™ã‚‹ã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ‘スをé¸æŠžã—ã¦ãã ã•ã„。"
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr "SAMLセッションã®æœ‰åŠ¹æœŸé™ãŒåˆ‡ã‚Œã¦ã„ã‚‹ãŸã‚ã€ã„ãã¤ã‹ã®To-doアイテムãŒéžè¡¨ç¤ºã«ãªã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚å†èªè¨¼ã™ã‚‹ã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ‘スをé¸æŠžã—ã€éžè¡¨ç¤ºã®to-doアイテムを表示ã—ã¾ã™ã€‚"
@@ -21539,7 +21729,7 @@ msgid "GroupSettings|Email notifications are disabled"
msgstr "メール通知ãŒç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™"
msgid "GroupSettings|Enable overview background aggregation for Value Streams Dashboard"
-msgstr "ãƒãƒªãƒ¥ãƒ¼ã‚¹ãƒˆãƒªãƒ¼ãƒ ãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰ã®æ¦‚è¦ç”»é¢ã®ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã‚¢ã‚°ãƒªã‚²ãƒ¼ã‚·ãƒ§ãƒ³ã‚’有効ã«ã™ã‚‹"
+msgstr "ãƒãƒªãƒ¥ãƒ¼ã‚¹ãƒˆãƒªãƒ¼ãƒ ãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰ã®æ¦‚è¦ç”»é¢ã®ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã§ã®é›†è¨ˆã‚’有効ã«ã™ã‚‹"
msgid "GroupSettings|Export group"
msgstr "グループをエクスãƒãƒ¼ãƒˆ"
@@ -22083,12 +22273,6 @@ msgstr "通知ã¨ãã®ä»–ã® %{issueType} アクションãŒã“ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã
msgid "HeaderAction|Okay!"
msgstr "OKï¼"
-msgid "HeaderAction|incident"
-msgstr "インシデント"
-
-msgid "HeaderAction|issue"
-msgstr "イシュー"
-
msgid "Headers"
msgstr "ヘッダー"
@@ -22203,10 +22387,6 @@ msgstr "ライブプレビューを隠ã™"
msgid "Hide archived projects"
msgstr "アーカイブã—ãŸãƒ—ロジェクトをéžè¡¨ç¤ºã«"
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] "ãƒãƒ£ãƒ¼ãƒˆã‚’éžè¡¨ç¤º"
-
msgid "Hide comments"
msgstr "コメントをéžè¡¨ç¤ºã«ã™ã‚‹"
@@ -22352,12 +22532,24 @@ msgstr "ãƒã‚¦ã‚¹ã‚­ãƒ¼ãƒ”ング"
msgid "Housekeeping successfully started"
msgstr "ãƒã‚¦ã‚¹ã‚­ãƒ¼ãƒ”ングã¯æ­£å¸¸ã«èµ·å‹•ã—ã¾ã—ãŸã€‚"
+msgid "How do I change my password in GitLab?"
+msgstr "GitLabã§ãƒ‘スワードを変更ã™ã‚‹ã«ã¯ã©ã†ã™ã‚Œã°ã‚ˆã„ã§ã™ã‹?"
+
+msgid "How do I clone a repository?"
+msgstr "リãƒã‚¸ãƒˆãƒªã‚’クローンã™ã‚‹ã«ã¯ã©ã†ã™ã‚Œã°ã‚ˆã„ã§ã™ã‹?"
+
msgid "How do I configure Akismet?"
msgstr "Akismet ã®è¨­å®šæ–¹æ³•ã¯?"
msgid "How do I configure this integration?"
msgstr "ã“ã®çµ±åˆã‚’構æˆã™ã‚‹ã«ã¯ã©ã†ã™ã‚Œã°ã‚ˆã„ã§ã™ã‹?"
+msgid "How do I create a template?"
+msgstr "テンプレートを作æˆã™ã‚‹ã«ã¯ã©ã†ã™ã‚Œã°ã‚ˆã„ã§ã™ã‹?"
+
+msgid "How do I fork a project?"
+msgstr "プロジェクトをフォークã™ã‚‹ã«ã¯ã©ã†ã™ã‚Œã°ã‚ˆã„ã§ã™ã‹?"
+
msgid "How do I generate it?"
msgstr "ã©ã†ã™ã‚Œã°ç”Ÿæˆã§ãã¾ã™ã‹?"
@@ -22978,6 +23170,9 @@ msgstr "所有"
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr "å†ã‚¤ãƒ³ãƒãƒ¼ãƒˆã™ã‚‹ã¨ã€æ–°ã—ã„プロジェクトãŒä½œæˆã•ã‚Œã¾ã™ã€‚既存ã®ãƒ—ロジェクトã¨ã¯åŒæœŸã•ã‚Œã¾ã›ã‚“。"
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr "許å¯ã•ã‚ŒãŸã‚µã‚¤ã‚ºåˆ¶é™ã‚’超ãˆãŸãƒªãƒã‚¸ãƒˆãƒªã€‚"
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr "åå‰ç©ºé–“ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«å¤±æ•—ã—ã¾ã—ãŸ"
@@ -23036,6 +23231,9 @@ msgstr "ã“ã®URLã¯æœ‰åŠ¹ãªGitリãƒã‚¸ãƒˆãƒªã§ã¯ã‚ã‚Šã¾ã›ã‚“。HTTPã®ãƒ
msgid "Improve customer support with Service Desk"
msgstr "サービスデスクã§ã‚«ã‚¹ã‚¿ãƒžãƒ¼ã‚µãƒãƒ¼ãƒˆã‚’改善ã—ã¾ã™ã€‚"
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr "Sidekiqã®è² è·ã‚’増やã™ã“ã¨ã§ã€ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã®ãƒ‘フォーマンスをå‘上ã•ã›ã¾ã™ã€‚ ç¾åœ¨ã®ã‚·ãƒ£ãƒ¼ãƒ‰åˆ¶é™ï¼ˆ%{limit})を超ãˆã‚‹å€¤ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。"
+
msgid "Improve quality with test cases"
msgstr "テストケースã§å“質をå‘上"
@@ -23052,7 +23250,7 @@ msgid "In progress"
msgstr "進行中"
msgid "In progress, queued for %{queuedDuration} seconds"
-msgstr ""
+msgstr "進行中ã€%{queuedDuration}秒間キューã«è¿½åŠ ã•ã‚Œã¾ã—ãŸ"
msgid "In the background, we're attempting to connect you again."
msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã§ã€ç§ãŸã¡ã¯ã‚ãªãŸã‚’å†ã³æŽ¥ç¶šã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚"
@@ -23858,6 +24056,12 @@ msgstr "未完æˆ"
msgid "Increase"
msgstr "増加"
+msgid "Increment suggestion line end"
+msgstr "æ案行ã®æœ«å°¾ã‚’増やã™"
+
+msgid "Increment suggestion line start"
+msgstr "æ案行ã®å…ˆé ­ã‚’増やã™"
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr "%{featureName} ã¯ã‚¤ãƒ³ã‚­ãƒ¥ãƒ™ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚§ãƒ¼ã‚ºã«ã‚ã‚Šã¾ã™"
@@ -23958,7 +24162,7 @@ msgid "Insert"
msgstr "挿入"
msgid "Insert a %{rows}×%{cols} table"
-msgstr "%{rows}x%{cols} ã®è¡¨ã‚’挿入ã—ã¾ã™ã€‚"
+msgstr "%{rows}x%{cols}ã®è¡¨ã‚’挿入"
msgid "Insert a quote"
msgstr "引用を挿入"
@@ -23975,8 +24179,8 @@ msgstr "å‰ã«åˆ—を挿入"
msgid "Insert comment template"
msgstr "コードテンプレートã®æŒ¿å…¥"
-msgid "Insert link"
-msgstr "リンクを挿入"
+msgid "Insert link (%{modifierKey}K)"
+msgstr "リンク挿入 (%{modifierKey}K)"
msgid "Insert or edit diagram"
msgstr "ダイアグラムã®æŒ¿å…¥ã¾ãŸã¯ç·¨é›†"
@@ -24008,9 +24212,6 @@ msgstr "ã“ã®ãƒ—ロジェクトã¯insights.ymlファイルã§é™¤å¤–ã•ã‚Œã¾ã™
msgid "Install GitLab Runner and ensure it's running."
msgstr "GitLab Runner をインストールã—ã€å®Ÿè¡Œä¸­ã§ã‚ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。"
-msgid "Install on clusters"
-msgstr "クラスタ上ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹"
-
msgid "Installation"
msgstr "インストール"
@@ -24349,7 +24550,7 @@ msgid "Introducing Your DevOps Reports"
msgstr "DevOps レãƒãƒ¼ãƒˆã®ç´¹ä»‹"
msgid "Invalid 'schemaVersion' '%s'"
-msgstr ""
+msgstr "「schemaVersionã€ã€Œ%sã€ãŒç„¡åŠ¹ã§ã™"
msgid "Invalid Insights config file detected"
msgstr "無効ãªã‚¤ãƒ³ã‚µã‚¤ãƒˆè¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ãŒã¿ã¤ã‹ã‚Šã¾ã—ãŸ"
@@ -24364,7 +24565,7 @@ msgid "Invalid URL: %{url}"
msgstr "無効㪠URL: %{url}"
msgid "Invalid context type. %{type} is expected."
-msgstr "無効ãªã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚¿ã‚¤ãƒ—ã§ã™ã€‚ %{type} ãŒå¿…è¦ã§ã™ã€‚"
+msgstr "無効ãªã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚¿ã‚¤ãƒ—ã§ã™ã€‚%{type}ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
msgid "Invalid date"
msgstr "無効ãªæ—¥ä»˜"
@@ -24953,10 +25154,10 @@ msgid "IssueTracker|Use Bugzilla as this project's issue tracker. %{docs_link}"
msgstr "ã“ã®ãƒ—ロジェクトã®ã‚¤ã‚·ãƒ¥ãƒ¼ãƒˆãƒ©ãƒƒã‚«ãƒ¼ã¨ã—㦠Bugzilla を使用ã—ã¾ã™ã€‚%{docs_link}"
msgid "IssueTracker|Use ClickUp as this project's issue tracker. %{docs_link}"
-msgstr "ã“ã®ãƒ—ロジェクトã®ã‚¤ã‚·ãƒ¥ãƒ¼ãƒˆãƒ©ãƒƒã‚«ãƒ¼ã¨ã—㦠ClickUp を使用ã—ã¾ã™ã€‚%{docs_link}"
+msgstr "ã“ã®ãƒ—ロジェクトã®ã‚¤ã‚·ãƒ¥ãƒ¼ãƒˆãƒ©ãƒƒã‚«ãƒ¼ã¨ã—ã¦ClickUpを使用ã—ã¾ã™ã€‚%{docs_link}"
msgid "IssueTracker|Use Clickup as this project's issue tracker."
-msgstr "ã“ã®ãƒ—ロジェクトã®ã‚¤ã‚·ãƒ¥ãƒ¼ãƒˆãƒ©ãƒƒã‚«ãƒ¼ã¨ã—㦠Clickup を使用ã—ã¾ã™ã€‚"
+msgstr "ã“ã®ãƒ—ロジェクトã®ã‚¤ã‚·ãƒ¥ãƒ¼ãƒˆãƒ©ãƒƒã‚«ãƒ¼ã¨ã—ã¦Clickupを使用ã—ã¾ã™ã€‚"
msgid "IssueTracker|Use IBM Engineering Workflow Management as this project's issue tracker."
msgstr "ã“ã®ãƒ—ロジェクトã®ã‚¤ã‚·ãƒ¥ãƒ¼ãƒˆãƒ©ãƒƒã‚«ãƒ¼ã¨ã—ã¦IBM Engineering Workflow Management を使用ã—ã¾ã™ã€‚"
@@ -25084,6 +25285,9 @@ msgstr "ç¾åœ¨ã€ã‚³ãƒ¼ãƒ‰ã‚«ãƒãƒ¬ãƒƒã‚¸ã«åˆ©ç”¨ã§ãるデータãŒã‚ã‚Šã¾
msgid "It's you"
msgstr "ã‚ãªãŸã§ã™"
+msgid "Italic (%{modifierKey}I)"
+msgstr "イタリック (%{modifierKey}I)"
+
msgid "Italic text"
msgstr "斜体"
@@ -25328,19 +25532,19 @@ msgid "Jira-GitLab user mapping template"
msgstr "Jira-GitLab ユーザーマッピングテンプレート"
msgid "JiraConnect|Are you a GitLab administrator?"
-msgstr ""
+msgstr "ã‚ãªãŸã¯GitLabã®ç®¡ç†è€…ã§ã™ã‹?"
msgid "JiraConnect|Cannot find namespace. Make sure you have sufficient permissions."
msgstr "åå‰ç©ºé–“ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。å分ãªæ¨©é™ãŒã‚ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。"
msgid "JiraConnect|Change GitLab version"
-msgstr ""
+msgstr "GitLabã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’変更"
msgid "JiraConnect|Configure your Jira Connect Application ID."
msgstr "Jira接続アプリケーションIDを設定ã—ã¾ã™ã€‚"
msgid "JiraConnect|Continue setup in GitLab"
-msgstr ""
+msgstr "GitLabã§ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—を続ã‘ã‚‹"
msgid "JiraConnect|Could not fetch user information from Jira. Check the permissions in Jira and try again."
msgstr "Jira ã‹ã‚‰ãƒ¦ãƒ¼ã‚¶ãƒ¼æƒ…報をå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚Jiraã®æ¨©é™ã‚’確èªã—ã¦ã€ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
@@ -25352,7 +25556,7 @@ msgid "JiraConnect|Enable public key storage"
msgstr "公開キーã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚’有効ã«ã™ã‚‹"
msgid "JiraConnect|Ensure your instance URL is correct and your instance is configured correctly. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
+msgstr "インスタンスã®URLãŒæ­£ã—ãã€ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ãŒæ­£ã—ã構æˆã•ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。%{linkStart}詳細ã¯ã“ã¡ã‚‰%{linkEnd}。"
msgid "JiraConnect|Failed to create branch."
msgstr "ブランãƒã‚’作æˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
@@ -25361,46 +25565,46 @@ msgid "JiraConnect|Failed to create branch. Please try again."
msgstr "ブランãƒã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
msgid "JiraConnect|Failed to link group. Please try again."
-msgstr ""
+msgstr "グループã®ãƒªãƒ³ã‚¯ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
msgid "JiraConnect|Failed to load Jira Connect Application ID. Please try again."
-msgstr ""
+msgstr "Jira Connect Application IDã®èª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
msgid "JiraConnect|Failed to load groups. Please try again."
-msgstr ""
+msgstr "グループã®èª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
msgid "JiraConnect|Failed to load subscriptions."
-msgstr ""
+msgstr "サブスクリプションã®èª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
msgid "JiraConnect|Failed to sign in to GitLab."
-msgstr ""
+msgstr "GitLabã¸ã®ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
msgid "JiraConnect|Failed to unlink group. Please try again."
-msgstr ""
+msgstr "グループã®ãƒªãƒ³ã‚¯è§£é™¤ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
msgid "JiraConnect|Failed to update the GitLab instance. See the %{linkStart}troubleshooting documentation%{linkEnd}."
-msgstr ""
+msgstr "GitLabインスタンスã®æ›´æ–°ã«å¤±æ•—ã—ã¾ã—ãŸã€‚%{linkStart}トラブルシューティングã«é–¢ã™ã‚‹æ–‡æ›¸%{linkEnd}ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
msgid "JiraConnect|For example: https://gitlab.example.com"
-msgstr ""
+msgstr "例: https://gitlab.example.com"
msgid "JiraConnect|GitLab for Jira App"
msgstr "GitLab for Jira App"
msgid "JiraConnect|GitLab for Jira Configuration"
-msgstr ""
+msgstr "GitLab for Jiraã®è¨­å®š"
msgid "JiraConnect|GitLab instance URL"
-msgstr ""
+msgstr "GitLabインスタンスã®URL"
msgid "JiraConnect|Group successfully linked"
-msgstr ""
+msgstr "グループãŒæ­£å¸¸ã«ãƒªãƒ³ã‚¯ã•ã‚Œã¾ã—ãŸ"
msgid "JiraConnect|Groups are the GitLab groups and subgroups you link to this Jira instance."
-msgstr ""
+msgstr "グループã¯ã€ã“ã®Jiraインスタンスã«ãƒªãƒ³ã‚¯ã™ã‚‹GitLabã®ã‚°ãƒ«ãƒ¼ãƒ—やサブグループã§ã™ã€‚"
msgid "JiraConnect|In order to complete the set up, you’ll need to complete a few steps in GitLab."
-msgstr ""
+msgstr "設定を完了ã™ã‚‹ã«ã¯ã€GitLabã§ã„ãã¤ã‹ã®ã‚¹ãƒ†ãƒƒãƒ—を完了ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
msgid "JiraConnect|Jira Connect Application ID"
msgstr "Jira接続アプリケーションID"
@@ -25409,46 +25613,52 @@ msgid "JiraConnect|Jira Connect Proxy URL"
msgstr "Jira Connect ã®ãƒ—ロキシ㮠URL"
msgid "JiraConnect|Link groups"
-msgstr ""
+msgstr "グループをリンク"
msgid "JiraConnect|Linked groups"
-msgstr ""
+msgstr "リンクã•ã‚ŒãŸã‚°ãƒ«ãƒ¼ãƒ—"
msgid "JiraConnect|New branch was successfully created."
msgstr "æ–°ã—ã„ブランãƒã¯æ­£å¸¸ã«ä½œæˆã•ã‚Œã¾ã—ãŸã€‚"
msgid "JiraConnect|No groups found."
-msgstr ""
+msgstr "グループãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。"
msgid "JiraConnect|No linked groups"
-msgstr ""
+msgstr "リンクã•ã‚ŒãŸã‚°ãƒ«ãƒ¼ãƒ—ãŒã‚ã‚Šã¾ã›ã‚“"
msgid "JiraConnect|Not seeing your groups? Only groups you have at least the Maintainer role for appear here."
-msgstr ""
+msgstr "グループãŒè¡¨ç¤ºã•ã‚Œã¾ã›ã‚“ã‹? ã“ã“ã«ã¯ã€å°‘ãªãã¨ã‚‚メンテナーロールãŒã‚るグループã®ã¿ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚"
msgid "JiraConnect|Setting up this integration is only possible if you're a GitLab administrator."
-msgstr ""
+msgstr "GitLab管ç†è€…ã§ã‚ã‚‹å ´åˆã€ã“ã®ã‚¤ãƒ³ãƒ†ã‚°ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã®è¨­å®šã‚’è¡Œã†ã“ã¨ãŒã§ãã¾ã™ã€‚"
msgid "JiraConnect|Sign in to %{url}"
-msgstr ""
+msgstr "%{url}ã«ã‚µã‚¤ãƒ³ã‚¤ãƒ³"
msgid "JiraConnect|Sign in to GitLab to get started."
-msgstr ""
+msgstr "開始ã™ã‚‹ã«ã¯ã€GitLabã«ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã—ã¾ã™ã€‚"
msgid "JiraConnect|Sign in to GitLab to link groups."
-msgstr ""
+msgstr "グループをリンクã™ã‚‹ã«ã¯GitLabã«ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã—ã¦ãã ã•ã„。"
msgid "JiraConnect|Sign in to link groups"
+msgstr "グループをリンクã™ã‚‹ã«ã¯ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã—ã¦ãã ã•ã„"
+
+msgid "JiraConnect|Tell us what you think!"
msgstr ""
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr "ã“ã®Jira ユーザã¯ã‚µã‚¤ãƒˆç®¡ç†è€…ã§ã¯ã‚ã‚Šã¾ã›ã‚“。Jiraã®æ¨©é™ã‚’確èªã—ã¦å†åº¦ãŠè©¦ã—下ã•ã„。"
-msgid "JiraConnect|Welcome to GitLab for Jira"
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
msgstr ""
+msgid "JiraConnect|Welcome to GitLab for Jira"
+msgstr "GitLab for Jiraã¸ã‚ˆã†ã“ã"
+
msgid "JiraConnect|What version of GitLab are you using?"
-msgstr ""
+msgstr "GitLabã®ã©ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’使用ã—ã¦ã„ã¾ã™ã‹?"
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr "ã“ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã¦Jiraã«æˆ»ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
@@ -25457,13 +25667,13 @@ msgid "JiraConnect|You don't have permission to create branches for this project
msgstr "ã“ã®ãƒ—ロジェクトã«ãƒ–ランãƒã‚’作æˆã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。別ã®ãƒ—ロジェクトをé¸æŠžã™ã‚‹ã‹ã€ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ãƒ—ロジェクトã®ã‚ªãƒ¼ãƒŠãƒ¼ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 %{linkStart}詳細ã¯ã“ã¡ã‚‰ã‚’ã”覧ãã ã•ã„。%{linkEnd}"
msgid "JiraConnect|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
-msgstr ""
+msgstr "GitLab for Jiraアプリを使用ã™ã‚‹ã«ã¯ã€%{linkStart}対応ã—ã¦ã„るブラウザー%{linkEnd}を使用ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
msgid "JiraConnect|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
+msgstr "ã“ã‚Œã§ã€Jira Cloudã®ã‚¤ã‚·ãƒ¥ãƒ¼å†…ã«GitLab.comã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ“ティーãŒè¡¨ç¤ºã•ã‚Œã‚‹ã¯ãšã§ã™ã€‚%{linkStart}詳細ã¯ã“ã¡ã‚‰%{linkEnd}"
msgid "JiraConnect|Your browser is not supported"
-msgstr ""
+msgstr "ãŠä½¿ã„ã®ãƒ–ラウザã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
msgid "JiraRequest|A connection error occurred while connecting to Jira. Try your request again."
msgstr "Jira ã¸ã®æŽ¥ç¶šä¸­ã«æŽ¥ç¶šã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚リクエストをもã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
@@ -25505,7 +25715,7 @@ msgid "JiraService|API token for Jira Cloud or password for Jira Data Center and
msgstr "Jiraクラウドã®APIトークンã¾ãŸã¯Jira Data Centerã¨Jira Serverã®ãƒ‘スワード"
msgid "JiraService|API token or password"
-msgstr "API トークンã¾ãŸã¯ãƒ‘スワード"
+msgstr "APIトークンã¾ãŸã¯ãƒ‘スワード"
msgid "JiraService|An error occurred while fetching issue list"
msgstr "イシューリストã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -25529,7 +25739,7 @@ msgid "JiraService|Displaying Jira issues while leaving GitLab issues also enabl
msgstr "GitLab イシュー機能を有効ã«ã—ãŸã¾ã¾ã€Jira Issueを表示ã™ã‚‹ã¨ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒæ··ä¹±ã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ä»–ã®æ–¹æ³•ã§ä½¿ç”¨ã—ãªã„ã®ã§ã‚ã‚Œã°ã€%{gitlab_issues_link_start}GitLab イシューã®ç„¡åŠ¹åŒ–%{link_end} を検討ã—ã¦ãã ã•ã„。"
msgid "JiraService|Email for Jira Cloud or username for Jira Data Center and Jira Server"
-msgstr "Jiraクラウドã®APIトークンã€ã¾ãŸã¯Jira Data Centerã¨Jira Serverã®ãƒ‘スワード"
+msgstr "Jira Cloudã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã€ã¾ãŸã¯Jira Data Centerã¨Jira Serverã®ãƒ¦ãƒ¼ã‚¶ãƒ¼å"
msgid "JiraService|Email or username"
msgstr "メールアドレスã¾ãŸã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼å"
@@ -25619,7 +25829,7 @@ msgid "JiraService|Project key is required to generate issue types"
msgstr "Jira Issueã®ç¨®é¡žã‚’生æˆã™ã‚‹ã«ã¯ãƒ—ロジェクトキーãŒå¿…è¦ã§ã™"
msgid "JiraService|Recommended. Only available for Jira Data Center and Jira Server."
-msgstr "推奨。Jiraデータセンターã¨Jiraサーãƒãƒ¼ã§ã®ã¿åˆ©ç”¨ã§ãã¾ã™ã€‚"
+msgstr "推奨ã—ã¾ã™ã€‚Jira Data Centerã¨Jira Serverã§ã®ã¿åˆ©ç”¨ã§ãã¾ã™ã€‚"
msgid "JiraService|Select issue type"
msgstr "イシューã®ç¨®é¡žã‚’é¸æŠž"
@@ -25678,6 +25888,9 @@ msgstr "ジョブ %{jobName}"
msgid "Job Failed #%{build_id}"
msgstr "#%{build_id} ã®ã‚¸ãƒ§ãƒ–ãŒå¤±æ•—"
+msgid "Job ID"
+msgstr "ジョブID"
+
msgid "Job artifacts"
msgstr "ジョブã®ã‚¢ãƒ¼ãƒ†ã‚£ãƒ•ã‚¡ã‚¯ãƒˆ"
@@ -25696,6 +25909,9 @@ msgstr "ジョブãŒæºœã¾ã£ã¦ã„ã¾ã™ã€‚Runner を確èªã—ã¦ãã ã•ã„ã€
msgid "Job logs and artifacts"
msgstr "ジョブã®ãƒ­ã‚°ã¨ã‚¢ãƒ¼ãƒ†ã‚£ãƒ•ã‚¡ã‚¯ãƒˆ"
+msgid "Job name"
+msgstr "ジョブå"
+
msgid "Job was retried"
msgstr "ジョブãŒå†è©¦è¡Œã•ã‚Œã¾ã—ãŸ"
@@ -25739,7 +25955,7 @@ msgid "JobAssistant|Image name (optional)"
msgstr "イメージå (ä»»æ„)"
msgid "JobAssistant|Include or exclude jobs in pipelines. %{linkStart}Learn more%{linkEnd}"
-msgstr "パイプラインã®ã‚¸ãƒ§ãƒ–ã‚’å«ã‚ã‚‹ã‹é™¤å¤–ã™ã‚‹ã€‚ %{linkStart}詳ã—ã見る%{linkEnd}"
+msgstr "パイプラインã«ã‚¸ãƒ§ãƒ–ã‚’å«ã‚ã‚‹ã‹é™¤å¤–ã—ã¾ã™ã€‚%{linkStart}詳ã—ã見る%{linkEnd}"
msgid "JobAssistant|Input format"
msgstr "入力形å¼"
@@ -25775,13 +25991,13 @@ msgid "JobAssistant|Services"
msgstr "サービス"
msgid "JobAssistant|Specify a Docker image that the job runs in. %{linkStart}Learn more%{linkEnd}"
-msgstr "ジョブãŒå®Ÿè¡Œã•ã‚Œã‚‹Dockerイメージを指定ã—ã¾ã™ã€‚ %{linkStart}詳ã—ã見る%{linkEnd}"
+msgstr "ジョブãŒå®Ÿè¡Œã•ã‚Œã‚‹Dockerイメージを指定ã—ã¾ã™ã€‚%{linkStart}詳ã—ã見る%{linkEnd}"
msgid "JobAssistant|Specify any additional Docker images that your scripts require to run successfully. %{linkStart}Learn more%{linkEnd}"
-msgstr "スクリプトを正常ã«å®Ÿè¡Œã™ã‚‹ãŸã‚ã«å¿…è¦ãªè¿½åŠ ã® Docker イメージを指定ã—ã¾ã™ã€‚ %{linkStart}詳ã—ã見る%{linkEnd}"
+msgstr "スクリプトを正常ã«å®Ÿè¡Œã™ã‚‹ãŸã‚ã«å¿…è¦ã¨ãªã‚‹è¿½åŠ ã®Dockerイメージを指定ã—ã¾ã™ã€‚%{linkStart}詳ã—ã見る%{linkEnd}"
msgid "JobAssistant|Specify the %{artifactsLinkStart}artifacts%{artifactsLinkEnd} and %{cacheLinkStart}cache%{cacheLinkEnd} of the job."
-msgstr "ジョブ㮠%{artifactsLinkStart}アーティファクト%{artifactsLinkEnd} 㨠ジョブã®%{cacheLinkStart}キャッシュ%{cacheLinkEnd} を指定ã—ã¾ã™ã€‚"
+msgstr "ジョブã®%{artifactsLinkStart}アーティファクト%{artifactsLinkEnd}ã¨%{cacheLinkStart}キャッシュ%{cacheLinkEnd}を指定ã—ã¾ã™ã€‚"
msgid "JobAssistant|Stage (optional)"
msgstr "ステージ (オプション)"
@@ -25861,6 +26077,9 @@ msgstr "表示ã™ã‚‹ã‚¸ãƒ§ãƒ–ãŒã‚ã‚Šã¾ã›ã‚“"
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr "ジョブã®ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼æ¤œç´¢æ©Ÿèƒ½ã§ã¯ã€ç¾åœ¨ã¯rawテキスト検索ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“。利用å¯èƒ½ãªæ¤œç´¢ãƒˆãƒ¼ã‚¯ãƒ³ã‚’使用ã—ã¦ãã ã•ã„。"
+msgid "Jobs|Root cause analysis"
+msgstr "根本原因ã®åˆ†æž"
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr "失敗ã—ãŸã‚¸ãƒ§ãƒ–ã®å–得中ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -26023,6 +26242,12 @@ msgstr "リソース待機中"
msgid "Job|We could not find this element"
msgstr "ã“ã®è¦ç´ ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+msgid "Job|You do not have permission to read this job's log"
+msgstr "ã“ã®ã‚¸ãƒ§ãƒ–ã®ãƒ­ã‚°ã‚’読ã¿è¾¼ã‚€æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“"
+
+msgid "Job|You do not have permission to retry this job"
+msgstr "ã“ã®ã‚¸ãƒ§ãƒ–ã‚’å†è©¦è¡Œã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“"
+
msgid "Job|allowed to fail"
msgstr "失敗を許容"
@@ -26086,9 +26311,6 @@ msgstr "æˆåŠŸã—ãŸæœ€æ–°ã®ã‚¸ãƒ§ãƒ–ã®ã‚¢ãƒ¼ãƒ†ã‚£ãƒ•ã‚¡ã‚¯ãƒˆã‚’ä¿æŒã™ã‚‹
msgid "Keep divergent refs"
msgstr "分å²ã—ãŸå‚照をä¿æŒã™ã‚‹"
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr "後ã§æ–°ã—ã„言語ãŒè¿½åŠ ã•ã‚Œã‚‹å ´åˆã«å‚™ãˆã¦ã€ã™ã¹ã¦ã® SAST アナライザをプロジェクトã§æœ‰åŠ¹ã«ã—続ã‘ã¾ã™ã€‚ ã©ã®ã‚¢ãƒŠãƒ©ã‚¤ã‚¶ãŒé©ç”¨ã•ã‚Œã‚‹ã‹ã‚’決定ã™ã‚Œã°ã€æœ€å°é™ã®ãƒªã‚½ãƒ¼ã‚¹ã ã‘を消費ã—ã€ãƒ‘イプラインã®æ™‚間を最å°é™ã«ã—ã¾ã™ã€‚ã™ã¹ã¦ã®SASTアナライザを有効ã«ã—ã¦ãŠãã¨ã€æœ€å¤§é™ã®ã‚«ãƒãƒ¬ãƒƒã‚¸ãŒä¿è¨¼ã•ã‚Œã¾ã™ã€‚"
-
msgid "Kerberos access denied"
msgstr "Kerberos アクセスãŒæ‹’å¦ã•ã‚Œã¾ã—ãŸ"
@@ -26304,6 +26526,9 @@ msgstr "éŽåŽ»%{days} 日間"
msgid "Last 2 weeks"
msgstr "éŽåŽ» 2 週間"
+msgid "Last 24 hours"
+msgstr "ç›´è¿‘ã®24時間"
+
msgid "Last Accessed On"
msgstr "最終アクセス"
@@ -26677,7 +26902,7 @@ msgid "Leave zen mode"
msgstr "禅モードを終了ã™ã‚‹"
msgid "Legacy Prometheus integrations cannot currently be removed"
-msgstr "従æ¥ã®Prometheusçµ±åˆã¯ç¾åœ¨å‰Šé™¤ã§ãã¾ã›ã‚“"
+msgstr "従æ¥ã®Prometheusインテグレーションã¯ç¾åœ¨å‰Šé™¤ã§ãã¾ã›ã‚“"
msgid "Legacy Web IDE"
msgstr "レガシーWeb IDE"
@@ -26905,7 +27130,7 @@ msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr "Redisã«ä¿å­˜ã•ã‚Œã¦ã„ã‚‹Sidekiqジョブã®ã‚µã‚¤ã‚ºã‚’制é™ã—ã¾ã™ã€‚"
msgid "Limitation on this view"
-msgstr ""
+msgstr "ã“ã®è¡¨ç¤ºã®åˆ¶é™"
msgid "Limiting mode"
msgstr "制é™ãƒ¢ãƒ¼ãƒ‰"
@@ -26935,9 +27160,6 @@ msgstr "Sentry ã‚’ GitLab ã«ãƒªãƒ³ã‚¯ã—ã¦ã€ã‚¢ãƒ—リケーションãŒç”Ÿæˆ
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr "プロジェクトã®ã‚µã‚¤ãƒ‰ãƒãƒ¼ã‹ã‚‰å¤–部Wikiã«ãƒªãƒ³ã‚¯ã—ã¾ã™ã€‚ %{docs_link}"
-msgid "Link copied"
-msgstr "リンクをコピーã—ã¾ã—ãŸ"
-
msgid "Link copied to clipboard."
msgstr "リンクをクリップボードã«ã‚³ãƒ”ーã—ã¾ã—ãŸ."
@@ -27085,8 +27307,8 @@ msgstr "ã•ã‚‰ã«èª­ã¿è¾¼ã‚€"
msgid "Loading snippet"
msgstr "スニペットã®ãƒ­ãƒ¼ãƒ‰ä¸­"
-msgid "Loading the GitLab IDE..."
-msgstr "GitLab IDE ã®èª­ã¿è¾¼ã¿ä¸­..."
+msgid "Loading the GitLab IDE"
+msgstr "GitLab IDEã®èª­ã¿è¾¼ã¿ä¸­"
msgid "Loading, please wait."
msgstr "読ã¿è¾¼ã¿ä¸­ã§ã™ã€‚ã—ã°ã‚‰ããŠå¾…ã¡ä¸‹ã•ã„。"
@@ -27151,6 +27373,9 @@ msgstr "ロックã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«"
msgid "Locked the discussion."
msgstr "ロックã—ãŸè­°è«–"
+msgid "Locking %{issuableDisplayName}"
+msgstr "%{issuableDisplayName}をロック中"
+
msgid "Locks the discussion."
msgstr " ディスカッションをロックã™ã‚‹."
@@ -27343,6 +27568,9 @@ msgstr "プロジェクトã®ç®¡ç†ã€‚"
msgid "Manage two-factor authentication"
msgstr "2è¦ç´ èªè¨¼ã®ç®¡ç†"
+msgid "Manage usage"
+msgstr "使用é‡ã®ç®¡ç†"
+
msgid "Manage your project's triggers"
msgstr "プロジェクトã®ãƒˆãƒªã‚¬ãƒ¼ã‚’管ç†"
@@ -27376,6 +27604,9 @@ msgstr "%{linkStart}発信元ã®è„†å¼±æ€§%{linkEnd} ã®ãƒªãƒ³ã‚¯ã•ã‚ŒãŸãƒã‚±ã
msgid "Map a FogBugz account ID to a GitLab user"
msgstr "FogBugz アカウントIDã‚’ GitLab ユーザーã«ãƒžãƒƒãƒ—ã™ã‚‹"
+msgid "Map data from"
+msgstr "次ã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’マップ:"
+
msgid "Mar"
msgstr "3月"
@@ -27433,6 +27664,9 @@ msgstr "斜体テキストを追加 (%{modifierKey}I)"
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr "斜体テキストを追加 (%{modifier_key}I)"
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr "å–消ã—ç·šã¤ãテキストã®è¿½åŠ  (%{modifierKey}%{shiftKey}X)"
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr "å–消ã—ç·šã¤ãテキストã®è¿½åŠ  (%{modifierKey}⇧X)"
@@ -27457,9 +27691,6 @@ msgstr "行をアウトデント (%{modifier_key}[)"
msgid "MarkdownEditor|header"
msgstr "ヘッダー"
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr "%{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd} をサãƒãƒ¼ãƒˆ"
-
msgid "Marked"
msgstr "マークã—ãŸ"
@@ -27500,7 +27731,7 @@ msgid "Marks to do as done."
msgstr "Todo を完了ã«ã™ã‚‹ã€‚"
msgid "Mask this variable in job logs if it meets %{linkStart}regular expression requirements%{linkEnd}."
-msgstr "%{linkStart}æ­£è¦è¡¨ç¾ã®è¦ä»¶%{linkEnd} を満ãŸã—ã¦ã„ã‚‹å ´åˆã€ã“ã®ã‚¸ãƒ§ãƒ–ログã“ã®å¤‰æ•°ã‚’マスクã—ã¾ã™ã€‚"
+msgstr "%{linkStart}æ­£è¦è¡¨ç¾è¦ä»¶%{linkEnd}を満ãŸã—ã¦ã„ã‚‹å ´åˆã€ã‚¸ãƒ§ãƒ–ログã§ã“ã®å¤‰æ•°ã‚’マスクã—ã¾ã™ã€‚"
msgid "Mask variable"
msgstr "変数をマスク"
@@ -27559,8 +27790,8 @@ msgstr "最大値"
msgid "Max authenticated Git LFS requests per period per user"
msgstr "ユーザーã‚ãŸã‚Šã®æœŸé–“ã‚ãŸã‚Šã®èªè¨¼ã•ã‚ŒãŸæœ€å¤§Git LFSリクエスト"
-msgid "Max file size is 200 KB."
-msgstr "最大ファイルサイズ㯠200 KBã§ã™ã€‚"
+msgid "Max file size is 200 KiB."
+msgstr "最大ファイルサイズã¯200KiBã§ã™ã€‚"
msgid "Max role"
msgstr "最大ã®å½¹å‰²"
@@ -27610,8 +27841,8 @@ msgstr "アーティファクトサイズã®ä¸Šé™ (MB)"
msgid "Maximum attachment size"
msgstr "添付ファイルサイズã®ä¸Šé™"
-msgid "Maximum attachment size (MB)"
-msgstr "添付ファイルサイズã®ä¸Šé™ (MB)"
+msgid "Maximum attachment size (MiB)"
+msgstr "添付ファイルサイズã®ä¸Šé™(MiB)"
msgid "Maximum authenticated API requests per rate limit period per user"
msgstr "ユーザーã‚ãŸã‚Šã®ãƒ¬ãƒ¼ãƒˆåˆ¶é™æœŸé–“ã‚ãŸã‚Šã®æœ€å¤§èªè¨¼APIè¦æ±‚æ•°"
@@ -27637,8 +27868,8 @@ msgstr "最大é…延時間(分)"
msgid "Maximum diff patch size"
msgstr "差分パッãƒã®æœ€å¤§ã‚µã‚¤ã‚º"
-msgid "Maximum diff patch size (Bytes)"
-msgstr "差分パッãƒã®æœ€å¤§ã‚µã‚¤ã‚º (ãƒã‚¤ãƒˆæ•°)"
+msgid "Maximum diff patch size (bytes)"
+msgstr "差分パッãƒã®æœ€å¤§ã‚µã‚¤ã‚º(ãƒã‚¤ãƒˆæ•°)"
msgid "Maximum duration of a session."
msgstr "セッションã®æœ€å¤§ç¶™ç¶šæ™‚é–“"
@@ -27646,8 +27877,8 @@ msgstr "セッションã®æœ€å¤§ç¶™ç¶šæ™‚é–“"
msgid "Maximum export size"
msgstr "最大エクスãƒãƒ¼ãƒˆã‚µã‚¤ã‚º"
-msgid "Maximum export size (MB)"
-msgstr "最大エクスãƒãƒ¼ãƒˆã‚µã‚¤ã‚º (MB)"
+msgid "Maximum export size (MiB)"
+msgstr "最大エクスãƒãƒ¼ãƒˆã‚µã‚¤ã‚º(MiB)"
msgid "Maximum field length"
msgstr "最大フィールド長"
@@ -27682,8 +27913,8 @@ msgstr "最大グループインãƒãƒ¼ãƒˆãƒªã‚¯ã‚¨ã‚¹ãƒˆ/分"
msgid "Maximum import size"
msgstr "最大インãƒãƒ¼ãƒˆã‚µã‚¤ã‚º"
-msgid "Maximum import size (MB)"
-msgstr "最大インãƒãƒ¼ãƒˆã‚µã‚¤ã‚º (MB)"
+msgid "Maximum import size (MiB)"
+msgstr "最大インãƒãƒ¼ãƒˆã‚µã‚¤ã‚º(MiB)"
msgid "Maximum job artifact size"
msgstr "ジョブアーティファクトサイズã®ä¸Šé™"
@@ -27703,8 +27934,11 @@ msgstr "npm パッケージã®æœ€å¤§ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚ºï¼ˆãƒã‚¤ãƒˆæ•°ï¼‰"
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr "%{name} ã®ä¸Šé™(%{count})を超ãˆã¾ã—ãŸ"
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
-msgstr "WebhookãŠã‚ˆã³ã‚µãƒ¼ãƒ“ストリガーã®1回ã®ãƒ—ッシュã§ã®å¤‰æ›´æ•°(ブランãƒã¾ãŸã¯ã‚¿ã‚°)ã®æœ€å¤§æ•°(デフォルトã¯3)"
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr "一括プッシュイベントãŒä½œæˆã•ã‚Œã‚‹ä¸Šè¨˜1回ã®ãƒ—ッシュã§ã®æœ€å¤§å¤‰æ›´æ•°(ブランãƒã¾ãŸã¯ã‚¿ã‚°)。デフォルトã¯ã€Œ3ã€ã€‚「0ã€ã«è¨­å®šã—ã¦ã‚‚ã€ã‚¹ãƒ­ãƒƒãƒˆãƒªãƒ³ã‚°ã¯ç„¡åŠ¹ã«ãªã‚Šã¾ã›ã‚“。"
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
+msgstr "WebhooksやインテグレーションãŒãƒˆãƒªã‚¬ãƒ¼ã•ã‚Œãªã„上記1回ã®ãƒ—ッシュã§ã®æœ€å¤§å¤‰æ›´æ•°(ブランãƒã¾ãŸã¯ã‚¿ã‚°)。デフォルトã¯ã€Œ3ã€ã€‚「0ã€ã«è¨­å®šã—ã¦ã‚‚ã€ã‚¹ãƒ­ãƒƒãƒˆãƒªãƒ³ã‚°ã¯ç„¡åŠ¹ã«ãªã‚Šã¾ã›ã‚“。"
msgid "Maximum number of comments exceeded"
msgstr "コメント数ãŒä¸Šé™ã«é”ã—ã¾ã—ãŸã€‚"
@@ -27724,12 +27958,18 @@ msgstr "èªè¨¼æ¸ˆã¿ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®1分ã‚ãŸã‚Šã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®æœ€å¤§æ•°"
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr "未èªè¨¼ IPアドレスã®1分ã‚ãŸã‚Šã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®æœ€å¤§æ•°"
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
-msgstr "å„rawパスã®1分ã‚ãŸã‚Šã®æœ€å¤§ãƒªã‚¯ã‚¨ã‚¹ãƒˆæ•°ã€‚デフォルトã¯300ã§ã™ã€‚スロットリングを無効ã«ã™ã‚‹ã«ã¯0ã«è¨­å®šã—ã¾ã™ã€‚"
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr "å„rawパスã®1分ã‚ãŸã‚Šã®æœ€å¤§ãƒªã‚¯ã‚¨ã‚¹ãƒˆæ•°ã€‚デフォルトã¯ã€Œ300ã€ã€‚スロットリングを無効ã«ã™ã‚‹ã«ã¯ã€Œ0ã€ã«è¨­å®šã—ã¾ã™ã€‚"
+
+msgid "Maximum number of stages per value stream exceeded"
+msgstr "ãƒãƒªãƒ¥ãƒ¼ã‚¹ãƒˆãƒªãƒ¼ãƒ ã‚ãŸã‚Šã®æœ€å¤§ã‚¹ãƒ†ãƒ¼ã‚¸æ•°ã‚’超ãˆã¾ã—ãŸ"
msgid "Maximum number of unique IP addresses per user."
msgstr "ユーザーã‚ãŸã‚Šã®ä¸€æ„ã® IP アドレスã®æœ€å¤§æ•°ã€‚"
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr "åå‰ç©ºé–“ã‚ãŸã‚Šã®æœ€å¤§ãƒãƒªãƒ¥ãƒ¼ã‚¹ãƒˆãƒªãƒ¼ãƒ æ•°ã‚’超ãˆã¾ã—ãŸ"
+
msgid "Maximum number of variables loaded (2000)"
msgstr "ロードã™ã‚‹å¤‰æ•°ã®æœ€å¤§æ•° (2000)"
@@ -27754,8 +27994,8 @@ msgstr "1分ã‚ãŸã‚Šã®ãƒ—ロジェクトã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆãƒªã‚¯ã‚¨ã‚¹ãƒˆæœ€å¤
msgid "Maximum push size"
msgstr "最大プッシュサイズ"
-msgid "Maximum push size (MB)"
-msgstr "最大プッシュサイズ (MB)"
+msgid "Maximum push size (MiB)"
+msgstr "最大プッシュサイズ(MiB)"
msgid "Maximum requests per 10 minutes per IP address"
msgstr "IPアドレス・10分ã‚ãŸã‚Šã®æœ€å¤§ãƒªã‚¯ã‚¨ã‚¹ãƒˆæ•°"
@@ -27787,8 +28027,8 @@ msgstr "インãƒãƒ¼ãƒˆãƒ•ã‚¡ã‚¤ãƒ«ã®æœ€å¤§ã‚µã‚¤ã‚ºã€‚"
msgid "Maximum size of individual attachments in comments."
msgstr "コメント内ã®å€‹ã€…ã®æ·»ä»˜ãƒ•ã‚¡ã‚¤ãƒ«ã®æœ€å¤§ã‚µã‚¤ã‚ºã€‚"
-msgid "Maximum size of pages (MB)"
-msgstr "ページã®æœ€å¤§ã‚µã‚¤ã‚º (MB)"
+msgid "Maximum size of pages (MiB)"
+msgstr "ページã®æœ€å¤§ã‚µã‚¤ã‚º(MiB)"
msgid "Maximum snippet size"
msgstr "最大スニペットサイズ"
@@ -27842,7 +28082,7 @@ msgid "MemberInviteEmail|Invitation to join the %{project_or_group} %{project_or
msgstr "%{project_or_group} ã® %{project_or_group_name} ã«å‚加ã™ã‚‹ã‚ˆã†æ‹›å¾…"
msgid "MemberRole|%{requirement} has to be enabled in order to enable %{permission}."
-msgstr "%{permission}を有効ã«ã™ã‚‹ã«ã¯ã€%{requirement} を有効ã«ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+msgstr "%{permission}を有効ã«ã™ã‚‹ã«ã¯ã€%{requirement}を有効ã«ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
msgid "MemberRole|%{role} - custom"
msgstr "%{role} - カスタム"
@@ -27860,7 +28100,7 @@ msgid "MemberRole|maximum number of Member Roles are already in use by the group
msgstr "メンãƒãƒ¼ãƒ­ãƒ¼ãƒ«ã®æœ€å¤§æ•°ã¯æ—¢ã«ã‚°ãƒ«ãƒ¼ãƒ—ã«ã‚ˆã£ã¦ä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã™ã€‚既存ã®ãƒ¡ãƒ³ãƒãƒ¼ãƒ­ãƒ¼ãƒ«ã‚’削除ã—ã¦ãã ã•ã„。"
msgid "MemberRole|minimal base access level must be %{min_access_level}."
-msgstr ""
+msgstr "最低é™ã®åŸºæœ¬ã‚¢ã‚¯ã‚»ã‚¹ãƒ¬ãƒ™ãƒ«ã¯%{min_access_level}ã§ã™ã€‚"
msgid "MemberRole|must be top-level namespace"
msgstr "トップレベルã®åå‰ç©ºé–“ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"
@@ -28058,7 +28298,7 @@ msgstr "マージ"
msgid "Merge %d cell"
msgid_plural "Merge %d cells"
-msgstr[0] ""
+msgstr[0] "%dセルをマージ"
msgid "Merge Conflicts"
msgstr "マージã®ç«¶åˆ"
@@ -28129,6 +28369,9 @@ msgstr "マージリクエスト分æž"
msgid "Merge request approvals"
msgstr "マージリクエスト承èª"
+msgid "Merge request change summary"
+msgstr "マージリクエストã®å¤‰æ›´ã®æ¦‚è¦"
+
msgid "Merge request commits"
msgstr "マージリクエストコミット"
@@ -28147,6 +28390,9 @@ msgstr "マージリクエストレãƒãƒ¼ãƒˆ"
msgid "Merge request status"
msgstr "マージリクエストã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹"
+msgid "Merge request summaries"
+msgstr "マージリクエストã®æ¦‚è¦"
+
msgid "Merge request summary"
msgstr "マージリクエストã®æ¦‚è¦"
@@ -28154,7 +28400,7 @@ msgid "Merge request title"
msgstr "マージリクエストタイトル"
msgid "Merge request was set to auto-merge"
-msgstr ""
+msgstr "マージリクエストã¯è‡ªå‹•ãƒžãƒ¼ã‚¸ã«è¨­å®šã•ã‚Œã¾ã—ãŸ"
msgid "Merge requests"
msgstr "マージリクエスト"
@@ -28264,9 +28510,6 @@ msgstr "%{selectStart} ã‹ã‚‰ %{selectEnd} ã¾ã§ %{end} ã®è¡Œã¸ã®ã‚³ãƒ¡ãƒ³ãƒ
msgid "MergeRequestDiffs|Select comment starting line"
msgstr "コメントã®é–‹å§‹è¡Œã‚’é¸æŠž"
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr "下書ãコメントã®ä¿å­˜ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr "ã“ã®æ“作ã¯è‡ªå‹•çš„ã«å®Ÿè¡Œã§ãã¾ã›ã‚“。 æ—¢ã«å®Ÿè¡Œã•ã‚Œã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ã¾ãŸã¯ã€æœ€æ–°ã®ã‚³ãƒŸãƒƒãƒˆãŒã“ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ä¸€éƒ¨ã‚’æ›´æ–°ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®æ“作をローカルã§å®Ÿè¡Œã—ã¦ãã ã•ã„。"
@@ -28294,9 +28537,6 @@ msgstr "マージリクエストã®ãƒªãƒãƒ¼ãƒˆã«å¤±æ•—ã—ã¾ã—ãŸ"
msgid "MergeRequests|Reference copied"
msgstr "å‚照をコピーã—ã¾ã—ãŸ"
-msgid "MergeRequests|Saving the comment failed"
-msgstr "コメントã®ä¿å­˜ã«å¤±æ•—ã—ã¾ã—ãŸ"
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr "スカッシュã«å¤±æ•—ã—ã¾ã—ãŸ: コミットをローカルã«ã‚¹ã‚«ãƒƒã‚·ãƒ¥ã—ã€ç«¶åˆã‚’解決ã—ã€ãƒ–ランãƒã‚’プッシュã—ã¾ã™ã€‚"
@@ -28321,6 +28561,9 @@ msgstr "%{commitId} ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示"
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr "%{commitId} ã§ç½®æ›ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示"
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr "%{reason}ã¨ã„ã†ç†ç”±ã§ã‚³ãƒ¡ãƒ³ãƒˆã‚’é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr "コミット %{commitLink} ã«ã¤ã„ã¦ã‚³ãƒ¡ãƒ³ãƒˆã•ã‚Œã¾ã—ãŸ"
@@ -28328,10 +28571,10 @@ msgid "MergeRequests|started a thread"
msgstr "スレッドを開始ã—ã¾ã—ãŸ"
msgid "MergeRequests|started a thread on %{linkStart}a file%{linkEnd}"
-msgstr "%{linkStart}ファイル%{linkEnd} ã«ã¤ã„ã¦ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’開始ã—ã¾ã—ãŸ"
+msgstr "%{linkStart}ファイル%{linkEnd}ã«ã¤ã„ã¦ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’開始ã—ã¾ã—ãŸ"
msgid "MergeRequests|started a thread on %{linkStart}an old version of a file%{linkEnd}"
-msgstr "%{linkStart}å¤ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ãƒ•ã‚¡ã‚¤ãƒ«%{linkEnd}ã«ã¤ã„ã¦ã‚¹ãƒ¬ãƒƒãƒ‰ãŒé–‹å§‹ã•ã‚Œã¾ã—ãŸ"
+msgstr "%{linkStart}å¤ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ãƒ•ã‚¡ã‚¤ãƒ«%{linkEnd}ã«ã¤ã„ã¦ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’開始ã—ã¾ã—ãŸ"
msgid "MergeRequests|started a thread on %{linkStart}an old version of the diff%{linkEnd}"
msgstr "%{linkStart}å¤ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®å·®åˆ†%{linkEnd} ã«ã¤ã„ã¦ã‚¹ãƒ¬ãƒƒãƒ‰ãŒé–‹å§‹ã•ã‚Œã¾ã—ãŸ"
@@ -28387,6 +28630,18 @@ msgstr "@%{username} ã«ã‚ˆã£ã¦ãƒ¬ãƒ“ューã•ã‚Œã¾ã—ãŸãŒã€ã¾ã æ‰¿èªã
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr "ファイルã®æ¤œç´¢(例 *.vue)(%{MODIFIER_KEY}P)"
+msgid "MergeRequest|Summaries are written by AI"
+msgstr "概è¦ã¯AIãŒç”Ÿæˆã—ã¾ã—ãŸ"
+
+msgid "MergeRequest|Summary notes"
+msgstr "概è¦ãƒŽãƒ¼ãƒˆ"
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr "リビジョン%{revision}ã«é–¢ã™ã‚‹ã“ã®èª¬æ˜Žã¯AIãŒç”Ÿæˆã—ã¾ã—ãŸ"
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr "ã“ã®èª¬æ˜Žã¯AIãŒç”Ÿæˆã—ã¾ã—ãŸ"
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr "%{sourceTopic} ã¯å‰Šé™¤ã•ã‚Œã¾ã™"
@@ -28483,9 +28738,6 @@ msgstr "イメージを更新ã™ã‚‹éš›ã«ã‚¤ã‚·ãƒ¥ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "MetricImages|There was an issue uploading your image."
msgstr "イメージをアップロードã™ã‚‹éš›ã«ã‚¤ã‚·ãƒ¥ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
-msgid "Metrics"
-msgstr "メトリクス"
-
msgid "Metrics - Grafana"
msgstr "メトリクス - Grafana"
@@ -28540,214 +28792,45 @@ msgstr "è¦æ±‚ã•ã‚ŒãŸãƒ‘スをæŒã¤ãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰ãŒè¦‹ã¤ã‹ã‚Šã¾ã›
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr "ã“ã®ãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰ã«ãŠæ°—ã«ã„ã‚Šã«è¿½åŠ ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“"
-msgid "Metrics|1. Define and preview panel"
-msgstr "1. パãƒãƒ«ã®å®šç¾©ã¨ãƒ‘ãƒãƒ«ã®ãƒ—レビュー"
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr "2. パãƒãƒ«ã® YAML をダッシュボードã«ã‚³ãƒ”ーペースト"
-
-msgid "Metrics|Add metric"
-msgstr "メトリクスを追加"
-
-msgid "Metrics|Add panel"
-msgstr "パãƒãƒ«ã‚’追加"
-
-msgid "Metrics|Avg"
-msgstr "å¹³å‡"
-
-msgid "Metrics|Back to dashboard"
-msgstr "ダッシュボードã«æˆ»ã‚‹"
-
-msgid "Metrics|Cancel"
-msgstr "キャンセル"
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr "環境ã¸ã®ãƒ‡ãƒ—ロイã«ã¤ã„ã¦ã¯ã€CI / CD ã®æ–‡æ›¸ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
-
-msgid "Metrics|Collapse panel"
-msgstr "パãƒãƒ«ã‚’é–‰ã˜ã‚‹"
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr "折り畳ã¿ãƒ‘ãƒãƒ« (Esc)"
-
-msgid "Metrics|Copy YAML"
-msgstr "YAML をコピー"
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr "パãƒãƒ« YAML をダッシュボード㮠YAML ファイルã«ã‚³ãƒ”ーペーストã—ã¾ã™ã€‚"
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr "カスタムダッシュボード %{fileName} を作æˆ"
-
msgid "Metrics|Create metric"
msgstr "メトリクスを作æˆ"
-msgid "Metrics|Create new dashboard"
-msgstr "æ–°è¦ãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰ã‚’作æˆ"
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr "ダッシュボード設定ファイルを作æˆ"
-
-msgid "Metrics|Current"
-msgstr "ç¾åœ¨"
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr "ダッシュボードファイルã¯ã€ã“ã®ãƒ—ロジェクトã®ãƒ«ãƒ¼ãƒˆã«ã‚ã‚‹ %{codeStart}.gitlab/ダッシュボード%{codeEnd} ã«ã‚ã‚Šã¾ã™ã€‚"
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr "パãƒãƒ«ã‚’プレビューã™ã‚‹ã«ã¯ä¸‹ã®ãƒ‘ãƒãƒ«ã® YAML を定義ã—ã¾ã™ã€‚"
-
msgid "Metrics|Delete metric"
msgstr "メトリクスを削除"
msgid "Metrics|Delete metric?"
msgstr "メトリクスを削除?"
-msgid "Metrics|Duplicate"
-msgstr "複製"
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr "ç¾åœ¨ã®ãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰ã‚’複製"
-
-msgid "Metrics|Duplicate dashboard"
-msgstr "ダッシュボードを複製"
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr "ã“ã®ãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰ã‚’コピーã—ã¦ãƒ‘ãƒãƒ«ã‚’追加ã¾ãŸã¯ãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰ã® YAML を編集ã—ã¾ã™ã€‚"
-
-msgid "Metrics|Duplicating..."
-msgstr "複製..."
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr "ダッシュボード㮠YAML を編集"
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] "メトリクスを編集"
-
-msgid "Metrics|Expand panel"
-msgstr "拡張パãƒãƒ«"
+msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr "é¡žä¼¼ã®ãƒ¡ãƒˆãƒªã‚¯ã‚¹ã‚’グループ化"
-msgid "Metrics|Invalid time range, please verify."
-msgstr "時間範囲ãŒç„¡åŠ¹ã§ã™ã€‚確èªã—ã¦ãã ã•ã„。"
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr "y軸ã®ãƒ©ãƒ™ãƒ«(通常ã¯å˜ä½)。 x軸ã¯å¸¸ã«æ™‚間を表ã—ã¾ã™ã€‚"
msgid "Metrics|Legend label (optional)"
msgstr "汎用ラベル(オプション)"
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr "リンクã«ç„¡åŠ¹ãªæ™‚間範囲ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚リンクを確èªã—ã€ãƒªã‚¯ã‚¨ã‚¹ãƒˆã—ãŸæ™‚間範囲を確èªã—ã¦ãã ã•ã„。"
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr "リンクã«ç„¡åŠ¹ãªãƒãƒ£ãƒ¼ãƒˆæƒ…å ±ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚リンクを確èªã—ã¦æ‹¡å¼µã•ã‚ŒãŸãƒ‘ãƒãƒ«ã‚’見ã¦ãã ã•ã„。"
-
-msgid "Metrics|Manage chart links"
-msgstr "ãƒãƒ£ãƒ¼ãƒˆãƒªãƒ³ã‚¯ã®ç®¡ç†"
-
-msgid "Metrics|Max"
-msgstr "最大"
-
-msgid "Metrics|Metrics Settings"
-msgstr "メトリクス設定"
-
-msgid "Metrics|Min"
-msgstr "最å°"
-
-msgid "Metrics|More actions"
-msgstr "ãã®ä»–ã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³"
-
msgid "Metrics|Must be a valid PromQL query."
msgstr "有効㪠PromQL クエリã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
msgid "Metrics|New metric"
msgstr "æ–°è¦ãƒ¡ãƒˆãƒªã‚¯ã‚¹"
-msgid "Metrics|Open repository"
-msgstr "リãƒã‚¸ãƒˆãƒªã‚’é–‹ã"
-
-msgid "Metrics|Panel YAML"
-msgstr "パãƒãƒ«YAML"
-
-msgid "Metrics|Panel YAML copied"
-msgstr "パãƒãƒ«ã® YAML をコピーã—ã¾ã—ãŸ"
-
-msgid "Metrics|Preview panel"
-msgstr "プレビューパãƒãƒ«"
-
msgid "Metrics|PromQL query is valid"
msgstr "PromQLクエリã¯æœ‰åŠ¹ã§ã™"
msgid "Metrics|Prometheus Query Documentation"
msgstr "Prometheus クエリã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆ"
-msgid "Metrics|Refresh Prometheus data"
-msgstr "Prometheus データを更新"
-
-msgid "Metrics|Refresh dashboard"
-msgstr "ダッシュボードをリフレッシュ"
-
-msgid "Metrics|Select a value"
-msgstr "値をé¸æŠž"
-
-msgid "Metrics|Set refresh rate"
-msgstr "更新レートã®è¨­å®š"
-
-msgid "Metrics|Star dashboard"
-msgstr "ダッシュボードをãŠæ°—ã«ã„ã‚Šã«ç™»éŒ²"
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr "ダッシュボードを作æˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr "ダッシュボードを作æˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚: %{error}"
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr " アノテーションã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„."
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr "環境データã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„"
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr " アノテーション情報ã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr "ダッシュボードã®æ¤œè¨¼è­¦å‘Šæƒ…å ±ã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr "デプロイ情報ã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
-
-msgid "Metrics|There was an error getting environments information."
-msgstr "環境情報ã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr "変数 \"%{name}\" ã®ã‚ªãƒ—ションã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
-
msgid "Metrics|There was an error trying to validate your query"
msgstr "クエリã®æ¤œè¨¼ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr "メトリクスã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr "メトリクスã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚%{message}"
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr "æ–°ã—ã„ダッシュボードを作æˆã™ã‚‹ã«ã¯ã€ã“ã®ãƒ—ロジェクトã®ãƒ«ãƒ¼ãƒˆã«ã‚ã‚‹ %{codeStart}.gitlab/dashboard%{codeEnd} ã«æ–°ã—ã„ YAML ファイルを追加ã—ã¾ã™ã€‚"
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr "Prometheus エンドãƒã‚¤ãƒ³ãƒˆã‹ã‚‰ã®äºˆæœŸã—ãªã„デプロイデータ応答"
-
msgid "Metrics|Unit label"
msgstr "ユニットラベル"
-msgid "Metrics|Unstar dashboard"
-msgstr "ダッシュボードをãŠæ°—ã«ã„り登録ã‹ã‚‰è§£é™¤"
-
msgid "Metrics|Used as a title for the chart"
msgstr "ãƒãƒ£ãƒ¼ãƒˆã®ã‚¿ã‚¤ãƒˆãƒ«ã¨ã—ã¦ä½¿ç”¨ã•ã‚Œã¾ã™"
@@ -28757,24 +28840,12 @@ msgstr "クエリãŒå˜ä¸€ã®ç³»åˆ—ã‚’è¿”ã™ã¨ãã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚複数
msgid "Metrics|Validating query"
msgstr "クエリã®æ¤œè¨¼"
-msgid "Metrics|Values"
-msgstr "値"
-
-msgid "Metrics|View documentation"
-msgstr "ドキュメントを表示"
-
msgid "Metrics|Y-axis label"
msgstr "Y軸ラベル"
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr "ã“ã®ãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰ã‚’ã‚ãªãŸã®ãƒªãƒã‚¸ãƒˆãƒªã«ã‚³ãƒ”ーã—ã¦ã€ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚ºã§ãるよã†ã«ã—ã¾ã™ã€‚ã“れをä¿å­˜ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«åã¨ãƒ–ランãƒã‚’é¸æŠžã—ã¦ãã ã•ã„。"
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr "ã“ã®ãƒ¡ãƒˆãƒªã‚¯ã‚¹ã‚’完全ã«å‰Šé™¤ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ã“ã®æ“作ã¯ã€å…ƒã«æˆ»ã›ã¾ã›ã‚“。"
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr "ダッシュボードã®ã‚¹ã‚­ãƒ¼ãƒžãŒç„¡åŠ¹ã§ã™ã€‚ダッシュボードを編集ã—ã¦YAML スキーマを修正ã—ã¦ãã ã•ã„。"
-
msgid "Metrics|e.g. HTTP requests"
msgstr "例: HTTP リクエスト"
@@ -29125,13 +29196,13 @@ msgid "MlExperimentTracking|Experiment removed"
msgstr "実験ãŒå‰Šé™¤ã•ã‚Œã¾ã—ãŸ"
msgid "MlExperimentTracking|Experiments keep track of comparable model candidates, and determine which parameters provides the best performance. Create experiments using the MLflow client"
-msgstr "実験ã¯ã€åŒç­‰ã®ãƒ¢ãƒ‡ãƒ«å€™è£œã‚’追跡ã—ã€ã©ã®ãƒ‘ラメータãŒæœ€é«˜ã®ãƒ‘フォーマンスをæä¾›ã™ã‚‹ã‹ã‚’決定ã—ã¾ã™ã€‚MLflowクライアントを使用ã—ã¦å®Ÿé¨“を作æˆã—ã¾ã™ã€‚"
+msgstr "実験ã«ã‚ˆã‚Šã€åŒç­‰ã®ãƒ¢ãƒ‡ãƒ«å€™è£œã‚’追跡ã—ã€ã©ã®ãƒ‘ラメータãŒæœ€é«˜ã®ãƒ‘フォーマンスをæä¾›ã™ã‚‹ã‹ã‚’決定ã—ã¾ã™ã€‚MLflowクライアントを使用ã—ã¦å®Ÿé¨“を作æˆã—ã¾ã—ょã†"
msgid "MlExperimentTracking|Filter candidates"
msgstr "候補をフィルター"
msgid "MlExperimentTracking|Get started with model experiments!"
-msgstr "モデル実験を始ã‚ã¾ã—ょã†ï¼"
+msgstr "モデル実験を始ã‚ã¾ã—ょã†!"
msgid "MlExperimentTracking|ID"
msgstr "ID"
@@ -29160,6 +29231,9 @@ msgstr "モデル候補ã®è©³ç´°"
msgid "MlExperimentTracking|Model experiments"
msgstr "モデル実験"
+msgid "MlExperimentTracking|Model registry"
+msgstr "モデルレジストリ"
+
msgid "MlExperimentTracking|Name"
msgstr "åå‰"
@@ -29182,7 +29256,7 @@ msgid "MlExperimentTracking|Status"
msgstr "状態"
msgid "MlExperimentTracking|Triggered by"
-msgstr ""
+msgstr "トリガー元"
msgid "Modal updated"
msgstr "モーダルãŒæ›´æ–°ã•ã‚Œã¾ã—ãŸ"
@@ -29196,6 +29270,9 @@ msgstr "é–‰ã˜ã‚‹"
msgid "Model experiments"
msgstr "モデル実験"
+msgid "ModelRegistry|Model registry"
+msgstr "モデルレジストリ"
+
msgid "Modified"
msgstr "修正済"
@@ -29256,9 +29333,6 @@ msgstr "詳ã—ã„情報"
msgid "More information is available|here"
msgstr "ã“ã¡ã‚‰"
-msgid "More information."
-msgstr "詳細情報ã«ã¤ã„ã¦"
-
msgid "More options"
msgstr "ãã®ä»–ã®ã‚ªãƒ—ション"
@@ -29368,10 +29442,10 @@ msgid "Multiple Prometheus integrations are not supported"
msgstr "複数㮠Prometheus çµ±åˆã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“"
msgid "Multiple components(%s) have 'gl/inject-editor' attribute"
-msgstr ""
+msgstr "複数ã®ã‚³ãƒ³ãƒãƒ¼ãƒãƒ³ãƒˆï¼ˆ%s)ãŒã€Œgl/inject - editorã€å±žæ€§ã‚’æŒã£ã¦ã„ã¾ã™"
msgid "Multiple integrations of a single type are not supported for this project"
-msgstr "ã“ã®ãƒ—ロジェクトã§ã¯ã€å˜ä¸€ã®ã‚¿ã‚¤ãƒ—ã®è¤‡æ•°ã®çµ±åˆã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
+msgstr "ã“ã®ãƒ—ロジェクトã§ã¯ã€å˜ä¸€ã‚¿ã‚¤ãƒ—ã®è¤‡æ•°ã®ã‚¤ãƒ³ãƒ†ã‚°ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
msgid "Multiple signatures"
msgstr "複数署å"
@@ -29436,6 +29510,12 @@ msgstr "åå‰ç©ºé–“ ID:"
msgid "Namespace Limits"
msgstr "åå‰ç©ºé–“ã®åˆ¶é™"
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr "åå‰ç©ºé–“ãŒå­˜åœ¨ã—ãªã„ã‹ã€æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。"
+
+msgid "Namespace must be provided."
+msgstr "åå‰ç©ºé–“ã®å…¥åŠ›ãŒå¿…è¦ã§ã™ã€‚"
+
msgid "Namespace or group to import repository into does not exist."
msgstr "リãƒã‚¸ãƒˆãƒªã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆå…ˆã®åå‰ç©ºé–“ã¾ãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—ãŒå­˜åœ¨ã—ã¾ã›ã‚“。"
@@ -29449,16 +29529,16 @@ msgid "NamespaceLimits|%{linkStart}%{username}%{linkEnd} changed the limit to %{
msgstr "%{linkStart}%{username}%{linkEnd} ãŒ%{date}ã«åˆ¶é™ã‚’%{limit} ã«å¤‰æ›´ã—ã¾ã—㟠"
msgid "NamespaceLimits|Add minimum free storage amount (in GiB) that will be used to enforce storage usage for namespaces on free plan. To remove the limit, set the value to 0 and click \"Update limit\" button."
-msgstr "無料プランã®åå‰ç©ºé–“ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ä½¿ç”¨ã‚’強制ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã™ã‚‹ã€æœ€å°ç©ºãストレージé‡(GiB)を追加ã—ã¾ã™ã€‚ 制é™ã‚’削除ã™ã‚‹ã«ã¯ã€0を設定ã—ã€ã€Œåˆ¶é™ã‚’æ›´æ–°ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¾ã™ã€‚"
+msgstr "Freeプランã§åå‰ç©ºé–“ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã®ä½¿ç”¨é‡ã‚’実施ã™ã‚‹éš›ã«ä½¿ç”¨ã•ã‚Œã‚‹ã€æœ€å°ç©ºãストレージé‡(GiB)を追加ã—ã¾ã™ã€‚制é™ã‚’削除ã™ã‚‹ã«ã¯ã€å€¤ã‚’0ã«è¨­å®šã—ã€ã€Œåˆ¶é™ã‚’æ›´æ–°ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¾ã™ã€‚"
msgid "NamespaceLimits|Add minimum free storage amount (in GiB) that will be used to set the dashboard limit for namespaces on free plan. To remove the limit, set the value to 0 and click \"Update limit\" button."
-msgstr "無料プランã®åå‰ç©ºé–“ã®ãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰åˆ¶é™ã‚’設定ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã™ã‚‹ã€æœ€å°ç©ºãストレージé‡(GiB)を追加ã—ã¾ã™ã€‚ 制é™ã‚’削除ã™ã‚‹ã«ã¯ã€0を設定ã—ã€ã€Œåˆ¶é™ã‚’æ›´æ–°ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¾ã™ã€‚"
+msgstr "Freeプランã§åå‰ç©ºé–“ã®ãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰åˆ¶é™ã‚’設定ã™ã‚‹éš›ã«ä½¿ç”¨ã•ã‚Œã‚‹ã€æœ€å°ç©ºãストレージé‡(GiB)を追加ã—ã¾ã™ã€‚制é™ã‚’削除ã™ã‚‹ã«ã¯ã€å€¤ã‚’0ã«è¨­å®šã—ã€ã€Œåˆ¶é™ã‚’æ›´æ–°ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¾ã™ã€‚"
msgid "NamespaceLimits|Add minimum free storage amount (in GiB) that will be used to show notifications for namespace on free plan. To remove the limit, set the value to 0 and click \"Update limit\" button."
-msgstr "無料プランã®åå‰ç©ºé–“ã®é€šçŸ¥ã‚’表示ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã™ã‚‹ã€æœ€å°ç©ºãストレージé‡(GiB)を追加ã—ã¾ã™ã€‚ 制é™ã‚’削除ã™ã‚‹ã«ã¯ã€0を設定ã—ã€ã€Œåˆ¶é™ã‚’æ›´æ–°ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¾ã™ã€‚"
+msgstr "Freeプランã®åå‰ç©ºé–“ã§é€šçŸ¥ã‚’表示ã™ã‚‹éš›ã«ä½¿ç”¨ã•ã‚Œã‚‹ã€æœ€å°ç©ºãストレージé‡(GiB)を追加ã—ã¾ã™ã€‚制é™ã‚’削除ã™ã‚‹ã«ã¯ã€å€¤ã‚’0ã«è¨­å®šã—ã€ã€Œåˆ¶é™ã‚’æ›´æ–°ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¾ã™ã€‚"
msgid "NamespaceLimits|Confirm deletion"
-msgstr "削除ã®ç¢ºèª"
+msgstr "削除を確èª"
msgid "NamespaceLimits|Confirm limits change"
msgstr "制é™ã®å¤‰æ›´ã‚’確èª"
@@ -29476,7 +29556,7 @@ msgid "NamespaceLimits|Deletion confirmation"
msgstr "削除ã®ç¢ºèª"
msgid "NamespaceLimits|Do you confirm the deletion of the selected namespace from the exclusion list?"
-msgstr "除外リストã‹ã‚‰é¸æŠžã—ãŸåå‰ç©ºé–“を削除ã™ã‚‹ä¸Šã§ã®ç¢ºèªã‚’ã—ã¾ã™ã‹?"
+msgstr "除外リストã‹ã‚‰é¸æŠžã—ãŸåå‰ç©ºé–“を削除ã™ã‚‹ã“ã¨ã‚’確èªã—ã¾ã™ã‹?"
msgid "NamespaceLimits|Enforcement Limit"
msgstr "制é™ã®é©ç”¨"
@@ -29524,83 +29604,83 @@ msgid "NamespaceLimits|Set Dashboard limit"
msgstr "ダッシュボードã®åˆ¶é™ã‚’設定"
msgid "NamespaceLimits|Set Enforcement limit"
-msgstr "制é™ã®é©ç”¨ã®è¨­å®š"
+msgstr "制é™ã®é©ç”¨ã‚’設定"
msgid "NamespaceLimits|Set Notifications limit"
-msgstr "通知制é™ã®è¨­å®š"
+msgstr "通知制é™ã‚’設定"
msgid "NamespaceLimits|Storage Phased Notification"
msgstr "ストレージã®ãƒ•ã‚§ãƒ¼ã‚ºã«é–¢ã™ã‚‹é€šçŸ¥"
msgid "NamespaceLimits|There was an error deleting the namespace: \"%{errorMessage}\"."
-msgstr "åå‰ç©ºé–“ã®å‰Šé™¤ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ: \"%{errorMessage}\"。"
+msgstr "åå‰ç©ºé–“ã®å‰Šé™¤ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ:「%{errorMessage}ã€ã€‚"
msgid "NamespaceLimits|There was an error fetching the exclusion list, try refreshing the page."
-msgstr ""
+msgstr "除外リストã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ページを更新ã—ã¦ãã ã•ã„。"
msgid "NamespaceLimits|These namespaces won't receive any notifications nor any degraded functionality while they remain on this list"
msgstr "ã“ã®ãƒªã‚¹ãƒˆã«è¼‰ã£ã¦ã„ã‚‹é™ã‚Šã€ã“れらã®åå‰ç©ºé–“ã¯é€šçŸ¥ã‚’å—ã‘å–ã‚‹ã“ã¨ã‚‚ã€æ©Ÿèƒ½ãŒä½Žä¸‹ã™ã‚‹ã“ã¨ã‚‚ã‚ã‚Šã¾ã›ã‚“"
msgid "NamespaceLimits|This will change the dashboard limit for all free namespaces except the excluded namespaces, the limit can be removed later."
-msgstr "ã“ã‚Œã¯é™¤å¤–ã•ã‚ŒãŸåå‰ç©ºé–“を除ãã™ã¹ã¦ã®ç„¡æ–™ã®åå‰ç©ºé–“ã®ãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰ã®åˆ¶é™ã‚’変更ã—ã¾ã™ã€‚制é™ã¯å¾Œã§å‰Šé™¤ã§ãã¾ã™ã€‚"
+msgstr "ã“ã‚Œã¯ã€é™¤å¤–ã•ã‚ŒãŸåå‰ç©ºé–“を除ãã™ã¹ã¦ã®ç„¡æ–™ã®åå‰ç©ºé–“ã«ãŠã‘るダッシュボードã®åˆ¶é™ã‚’変更ã—ã¾ã™ã€‚制é™ã¯å¾Œã§å‰Šé™¤ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚"
msgid "NamespaceLimits|This will change when free namespaces get storage enforcement except the excluded namespaces, the limit can be removed later."
-msgstr "ã“ã‚Œã¯é™¤å¤–ã•ã‚ŒãŸåå‰ç©ºé–“を除ãã™ã¹ã¦ã®ç„¡æ–™ã®åå‰ç©ºé–“ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸åˆ¶é™ã‚’å–å¾—ã™ã‚‹ã¨ãã«å¤‰æ›´ã—ã¾ã™ã€‚制é™ã¯å¾Œã§å‰Šé™¤ã§ãã¾ã™ã€‚"
+msgstr "ã“ã‚Œã¯ã€é™¤å¤–ã•ã‚ŒãŸåå‰ç©ºé–“を除ãã™ã¹ã¦ã®ç„¡æ–™ã®åå‰ç©ºé–“ã«ãŠã„ã¦ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸åˆ¶é™ãŒé©ç”¨ã•ã‚Œã‚‹ã‚¿ã‚¤ãƒŸãƒ³ã‚°ã‚’変更ã—ã¾ã™ã€‚制é™ã¯å¾Œã§å‰Šé™¤ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚"
msgid "NamespaceLimits|This will limit the amount of notifications all free namespaces receives except the excluded namespaces, the limit can be removed later."
-msgstr "ã“ã‚Œã¯é™¤å¤–ã•ã‚ŒãŸåå‰ç©ºé–“を除ãã™ã¹ã¦ã®ç„¡æ–™ã®åå‰ç©ºé–“ã®é€šçŸ¥ã®é‡ã‚’制é™ã—ã¾ã™ã€‚制é™ã¯å¾Œã§å‰Šé™¤ã§ãã¾ã™ã€‚"
+msgstr "ã“ã‚Œã¯ã€é™¤å¤–ã•ã‚ŒãŸåå‰ç©ºé–“を除ãã™ã¹ã¦ã®ç„¡æ–™ã®åå‰ç©ºé–“ã«ãŠã‘る通知ã®é‡ã‚’制é™ã—ã¾ã™ã€‚制é™ã¯å¾Œã§å‰Šé™¤ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚"
msgid "NamespaceLimits|Update limit"
msgstr "制é™ã‚’æ›´æ–°"
msgid "NamespaceLimits|You must select a namespace and add a reason for excluding it"
-msgstr "åå‰ç©ºé–“ã‚’é¸æŠžã—ã€ãれを除外ã™ã‚‹ç†ç”±ã‚’追加ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"
+msgstr "åå‰ç©ºé–“ã‚’é¸æŠžã—ã€é™¤å¤–ã™ã‚‹ç†ç”±ã‚’追加ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"
msgid "NamespaceStorageSize|%{namespace_name} is now read-only. Your ability to write new data to this namespace is restricted. %{read_only_link_start}Which actions are restricted?%{link_end}"
-msgstr "%{namespace_name} ãŒèª­ã¿å–り専用ã«ãªã‚Šã¾ã—ãŸã€‚ã“ã®åå‰ç©ºé–“ã«æ–°ã—ã„データを書ã込む機能ãŒåˆ¶é™ã•ã‚Œã¦ã„ã¾ã™ã€‚ %{read_only_link_start}ã©ã‚“ãªæ“作ãŒåˆ¶é™ã•ã‚Œã¦ã„ã¾ã™ã‹ï¼Ÿ%{link_end}"
+msgstr "%{namespace_name}ãŒèª­ã¿å–り専用ã«ãªã‚Šã¾ã—ãŸã€‚ã“ã®åå‰ç©ºé–“ã¸ã®æ–°ã—ã„データã®æ›¸ãè¾¼ã¿ã¯åˆ¶é™ã•ã‚Œã¦ã„ã¾ã™ã€‚%{read_only_link_start}ã©ã®ã‚ˆã†ãªæ“作ãŒåˆ¶é™ã•ã‚Œã¦ã„ã¾ã™ã‹?%{link_end}"
msgid "NamespaceStorageSize|For more information about storage limits, see our %{faq_link_start}FAQ%{link_end}."
-msgstr "ストレージ制é™ã®è©³ç´°ã«ã¤ã„ã¦ã¯ã€ %{faq_link_start}FAQ%{link_end} ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+msgstr "ストレージ制é™ã®è©³ç´°ã«ã¤ã„ã¦ã¯ã€%{faq_link_start}FAQ%{link_end}ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
msgid "NamespaceStorageSize|If %{namespace_name} exceeds the storage quota, your ability to write new data to this namespace will be restricted. %{read_only_link_start}Which actions become restricted?%{link_end}"
-msgstr "ã‚‚ã—%{namespace_name} ãŒã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã®åˆ¶é™ã‚’超ãˆãŸå ´åˆã€ã“ã®åå‰ç©ºé–“ã«æ–°ã—ã„データを書ã込む機能ãŒåˆ¶é™ã•ã‚Œã¾ã™ã€‚ %{read_only_link_start}ã©ã‚“ãªæ“作ãŒåˆ¶é™ã•ã‚Œã¦ã„ã¾ã™ã‹ï¼Ÿ%{link_end}"
+msgstr "%{namespace_name}ãŒã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸åˆ¶é™ã‚’超ãˆãŸå ´åˆã€ã“ã®åå‰ç©ºé–“ã¸ã®æ–°ã—ã„データã®æ›¸ãè¾¼ã¿ãŒåˆ¶é™ã•ã‚Œã¾ã™ã€‚%{read_only_link_start}ã©ã®ã‚ˆã†ãªæ“作ãŒåˆ¶é™ã•ã‚Œã¾ã™ã‹?%{link_end}"
msgid "NamespaceStorageSize|If a project reaches 100%% of the storage quota (%{free_size_limit}) the project will be in a read-only state, and you won't be able to push to your repository or add large files."
-msgstr "ã‚‚ã—プロジェクトãŒã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ 制é™ã® 100%% (%{free_size_limit}) ã«é”ã™ã‚‹ã¨ã€ãƒ—ロジェクトã¯èª­ã¿å–り専用状態ã«ãªã‚Šã€ãƒªãƒã‚¸ãƒˆãƒªã«ãƒ—ッシュã—ãŸã‚Šã€å¤§ããªãƒ•ã‚¡ã‚¤ãƒ«ã‚’追加ã—ãŸã‚Šã™ã‚‹ã“ã¨ãŒã§ããªããªã‚Šã¾ã™ã€‚"
+msgstr "プロジェクトãŒã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸åˆ¶é™ã®100%% (%{free_size_limit})ã«é”ã™ã‚‹ã¨ã€ãƒ—ロジェクトã¯èª­ã¿å–り専用状態ã«ãªã‚Šã€ãƒªãƒã‚¸ãƒˆãƒªã«ãƒ—ッシュã—ãŸã‚Šã€å¤§ããªãƒ•ã‚¡ã‚¤ãƒ«ã‚’追加ã—ãŸã‚Šã™ã‚‹ã“ã¨ãŒã§ããªããªã‚Šã¾ã™ã€‚"
msgid "NamespaceStorageSize|To prevent your projects from being in a read-only state %{manage_storage_link_start}manage your storage usage%{link_end}, or %{purchase_more_link_start}purchase more storage%{link_end}."
-msgstr "プロジェクトãŒèª­ã¿å–り専用状態ã«ãªã‚‰ãªã„よã†ã«ã™ã‚‹ã«ã¯ %{manage_storage_link_start}ストレージ使用é‡ã‚’管ç†%{link_end}ã€ã¾ãŸã¯ %{purchase_more_link_start}追加ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚’購入%{link_end}ã—ã¦ãã ã•ã„。"
+msgstr "プロジェクトãŒèª­ã¿å–り専用状態ã«ãªã‚‰ãªã„よã†ã«ã™ã‚‹ã«ã¯ã€%{manage_storage_link_start}ストレージ使用é‡ã‚’管ç†%{link_end}ã™ã‚‹ã‹ã€ã¾ãŸã¯%{purchase_more_link_start}追加ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚’購入%{link_end}ã—ã¦ãã ã•ã„。"
msgid "NamespaceStorageSize|To prevent your projects from being in a read-only state %{manage_storage_link_start}manage your storage usage%{link_end}, or contact a user with the %{group_member_link_start}owner role for this namespace%{link_end} and ask them to %{purchase_more_link_start}purchase more storage%{link_end}."
-msgstr "プロジェクトãŒèª­ã¿å–り専用状態ã«ãªã‚‰ãªã„よã†ã«ã™ã‚‹ã«ã¯ %{manage_storage_link_start}ストレージ使用é‡ã‚’管ç†%{link_end}ã€ã¾ãŸã¯ %{group_member_link_start}ã“ã®åå‰ç©ºé–“ã®ã‚ªãƒ¼ãƒŠãƒ¼æ¨©é™ã‚’ã‚‚ã¤ãƒ¦ãƒ¼ã‚¶ãƒ¼%{link_end} ã«é€£çµ¡ã—ã¦ã€%{purchase_more_link_start}追加ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚’購入%{link_end}ã™ã‚‹ã‚ˆã†ã«ä¾é ¼ã—ã¦ãã ã•ã„。"
+msgstr "プロジェクトãŒèª­ã¿å–り専用状態ã«ãªã‚‰ãªã„よã†ã«ã™ã‚‹ã«ã¯ã€%{manage_storage_link_start}ストレージ使用é‡ã‚’管ç†%{link_end}ã™ã‚‹ã‹ã€ã¾ãŸã¯%{group_member_link_start}ã“ã®åå‰ç©ºé–“ã®ã‚ªãƒ¼ãƒŠãƒ¼ãƒ­ãƒ¼ãƒ«ã‚’æŒã¤ãƒ¦ãƒ¼ã‚¶ãƒ¼%{link_end}ã«é€£çµ¡ã—ã¦ã€%{purchase_more_link_start}追加ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚’購入%{link_end}ã™ã‚‹ã‚ˆã†ä¾é ¼ã—ã¦ãã ã•ã„。"
msgid "NamespaceStorageSize|To reduce storage usage, reduce git repository and git LFS storage."
-msgstr "ストレージ使用é‡ã‚’削減ã™ã‚‹ã«ã¯ã€git リãƒã‚¸ãƒˆãƒªã¨ git LFS ストレージを減らã—ã¾ã™ã€‚"
+msgstr "ストレージ使用é‡ã‚’削減ã™ã‚‹ã«ã¯ã€gitリãƒã‚¸ãƒˆãƒªã¨git LFSストレージを減らã—ã¾ã™ã€‚"
msgid "NamespaceStorageSize|To remove the read-only state %{manage_storage_link_start}manage your storage usage%{link_end}, or %{purchase_more_link_start}purchase more storage%{link_end}."
-msgstr "プロジェクトãŒèª­ã¿å–り専用状態を解除ã™ã‚‹ã«ã¯ %{manage_storage_link_start}ストレージ使用é‡ã‚’管ç†%{link_end}ã€ã¾ãŸã¯ %{purchase_more_link_start}追加ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚’購入%{link_end}ã—ã¦ãã ã•ã„。"
+msgstr "プロジェクトã®èª­ã¿å–り専用状態を解除ã™ã‚‹ã«ã¯ã€%{manage_storage_link_start}ストレージ使用é‡ã‚’管ç†%{link_end}ã™ã‚‹ã‹ã€ã¾ãŸã¯%{purchase_more_link_start}追加ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚’購入%{link_end}ã—ã¦ãã ã•ã„。"
msgid "NamespaceStorageSize|To remove the read-only state %{manage_storage_link_start}manage your storage usage%{link_end}, or contact a user with the %{group_member_link_start}owner role for this namespace%{link_end} and ask them to %{purchase_more_link_start}purchase more storage%{link_end}."
-msgstr "プロジェクトãŒèª­ã¿å–り専用状態を解除ã™ã‚‹ã«ã¯ %{manage_storage_link_start}ストレージ使用é‡ã‚’管ç†%{link_end}ã€ã¾ãŸã¯ %{group_member_link_start}ã“ã®åå‰ç©ºé–“ã®ã‚ªãƒ¼ãƒŠãƒ¼æ¨©é™ã‚’ã‚‚ã¤ãƒ¦ãƒ¼ã‚¶ãƒ¼%{link_end} ã«é€£çµ¡ã—ã¦ã€%{purchase_more_link_start}追加ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚’購入%{link_end}ã™ã‚‹ã‚ˆã†ã«ä¾é ¼ã—ã¦ãã ã•ã„。"
+msgstr "プロジェクトã®èª­ã¿å–り専用状態を解除ã™ã‚‹ã«ã¯ã€%{manage_storage_link_start}ストレージ使用é‡ã‚’管ç†%{link_end}ã™ã‚‹ã‹ã€ã¾ãŸã¯%{group_member_link_start}ã“ã®åå‰ç©ºé–“ã®ã‚ªãƒ¼ãƒŠãƒ¼ãƒ­ãƒ¼ãƒ«ã‚’æŒã¤ãƒ¦ãƒ¼ã‚¶ãƒ¼%{link_end}ã«é€£çµ¡ã—ã¦ã€%{purchase_more_link_start}追加ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚’購入%{link_end}ã™ã‚‹ã‚ˆã†ä¾é ¼ã—ã¦ãã ã•ã„。"
msgid "NamespaceStorageSize|To remove the read-only state, reduce git repository and git LFS storage, or %{purchase_more_link_start}purchase more storage%{link_end}."
-msgstr "プロジェクトãŒèª­ã¿å–り専用状態を解除ã™ã‚‹ã«ã¯ gitリãƒã‚¸ãƒˆãƒªã¾ãŸã¯git LFSã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚’削減ã¾ãŸã¯ %{purchase_more_link_start}追加ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚’購入%{link_end}ã—ã¦ãã ã•ã„。"
+msgstr "プロジェクトã®èª­ã¿å–り専用状態を解除ã™ã‚‹ã«ã¯ã€gitリãƒã‚¸ãƒˆãƒªã¨git LFSã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚’削減ã™ã‚‹ã‹ã€ã¾ãŸã¯%{purchase_more_link_start}追加ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚’購入%{link_end}ã—ã¦ãã ã•ã„。"
msgid "NamespaceStorageSize|To remove the read-only state, reduce git repository and git LFS storage, or contact a user with the %{group_member_link_start}owner role for this namespace%{link_end} and ask them to %{purchase_more_link_start}purchase more storage%{link_end}."
-msgstr "プロジェクトã®èª­ã¿å–り専用状態を解除ã™ã‚‹ã«ã¯ã€git リãƒã‚¸ãƒˆãƒªã¨ git LFSã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚’削減ã€ã¾ãŸã¯ %{group_member_link_start}ã“ã®åå‰ç©ºé–“ã®ã‚ªãƒ¼ãƒŠãƒ¼æ¨©é™ã‚’ã‚‚ã¤ãƒ¦ãƒ¼ã‚¶ãƒ¼%{link_end} ã«é€£çµ¡ã—ã¦ã€%{purchase_more_link_start}追加ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚’購入%{link_end}ã™ã‚‹ã‚ˆã†ã«ä¾é ¼ã—ã¦ãã ã•ã„。"
+msgstr "プロジェクトã®èª­ã¿å–り専用状態を解除ã™ã‚‹ã«ã¯ã€gitリãƒã‚¸ãƒˆãƒªã¨git LFSã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚’削減ã™ã‚‹ã‹ã€ã¾ãŸã¯%{group_member_link_start}ã“ã®åå‰ç©ºé–“ã®ã‚ªãƒ¼ãƒŠãƒ¼ãƒ­ãƒ¼ãƒ«ã‚’æŒã¤ãƒ¦ãƒ¼ã‚¶ãƒ¼%{link_end}ã«é€£çµ¡ã—ã¦ã€%{purchase_more_link_start}追加ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚’購入%{link_end}ã™ã‚‹ã‚ˆã†ä¾é ¼ã—ã¦ãã ã•ã„。"
msgid "NamespaceStorageSize|You have consumed all available storage and you can't push or add large files to projects over the free tier limit (%{free_size_limit})."
-msgstr "利用å¯èƒ½ãªã™ã¹ã¦ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚’使用ã—ã¦ã„ã‚‹ãŸã‚ã€ç„¡æ–™ã®ã‚µã‚¤ã‚ºåˆ¶é™(%{free_size_limit})を超ãˆã¦ãƒ—ロジェクトã«å¤§ããªãƒ•ã‚¡ã‚¤ãƒ«ã‚’プッシュã¾ãŸã¯è¿½åŠ ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。"
+msgstr "利用å¯èƒ½ãªã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚’ã™ã¹ã¦ä½¿ç”¨ã—ã¦ã„ã¾ã™ã€‚Freeプランã®ã‚µã‚¤ã‚ºåˆ¶é™(%{free_size_limit})を超ãˆã¦ãƒ—ッシュã—ãŸã‚Šã€ãƒ—ロジェクトã«å¤§ããªãƒ•ã‚¡ã‚¤ãƒ«ã‚’追加ã—ãŸã‚Šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。"
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} for %{namespace_name}"
-msgstr "%{namespace_name}ã®ç©ºãストレージ上é™ã® %{free_size_limit} ã«é”ã—ã¾ã—ãŸã€‚"
+msgstr "%{namespace_name}ã®ç„¡æ–™ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ä¸Šé™(%{free_size_limit})ã«é”ã—ã¾ã—ãŸ"
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on %{readonly_project_count} project"
msgid_plural "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on %{readonly_project_count} projects"
-msgstr[0] ""
+msgstr[0] "%{readonly_project_count}プロジェクトã§%{free_size_limit}ã®ç„¡æ–™å®¹é‡ã®ä¸Šé™ã«é”ã—ã¾ã—ãŸ"
msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name}"
-msgstr "%{namespace_name} ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸å®¹é‡ã‚’ %{usage_in_percent} ã¾ã§ä½¿ç”¨ã—ã¾ã—ãŸã€‚"
+msgstr "%{namespace_name}ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸å®¹é‡ã‚’%{usage_in_percent}ã¾ã§ä½¿ç”¨ã—ã¾ã—ãŸ"
msgid "NamespaceStorageSize|You have used %{usage_in_percent} of the storage quota for %{namespace_name} (%{used_storage} of %{storage_limit})"
msgstr "%{namespace_name} ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸å®¹é‡ã‚’ %{usage_in_percent} ã¾ã§ä½¿ç”¨ã—ã¾ã—㟠(%{used_storage} / %{storage_limit})"
@@ -30159,7 +30239,7 @@ msgid "No component has 'gl/inject-editor' attribute"
msgstr "'gl/inject - editor'属性をæŒã¤ã‚³ãƒ³ãƒãƒ¼ãƒãƒ³ãƒˆã¯ã‚ã‚Šã¾ã›ã‚“"
msgid "No components present in devfile"
-msgstr ""
+msgstr "devfileã«ã‚³ãƒ³ãƒãƒ¼ãƒãƒ³ãƒˆãŒã‚ã‚Šã¾ã›ã‚“"
msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr "確èªãƒ¡ãƒ¼ãƒ«ãŒå±Šã„ã¦ã¾ã›ã‚“ã‹ ?迷惑メールフォルダを確èªã™ã‚‹ã‹ã€%{request_link_start}æ–°ã—ã„確èªãƒ¡ãƒ¼ãƒ«ã®é€ä¿¡ã‚’リクエストã—ã¦ãã ã•ã„%{request_link_end}。"
@@ -30182,12 +30262,6 @@ msgstr "クレジット カードã¯å¿…è¦ã‚ã‚Šã¾ã›ã‚“"
msgid "No data available"
msgstr "利用å¯èƒ½ãªãƒ‡ãƒ¼ã‚¿ãŒã‚ã‚Šã¾ã›ã‚“。"
-msgid "No data found"
-msgstr "データãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
-
-msgid "No data to display"
-msgstr "表示ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ã¯ã‚ã‚Šã¾ã›ã‚“"
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr "デプロイメントãŒæ¤œå‡ºã•ã‚Œã¾ã›ã‚“ã§ã—ãŸã€‚ソフトウェアã®ç¶™ç¶šçš„デプロイを制御ã™ã‚‹ãŸã‚ã«ç’°å¢ƒã‚’使用ã—ã¦ãã ã•ã„。 %{linkStart}デプロイメントジョブã®è©³ç´°ã«ã¤ã„ã¦%{linkEnd}ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
@@ -30243,7 +30317,7 @@ msgid "No labels with such name or description"
msgstr "ãã®åå‰ã¾ãŸã¯èª¬æ˜Žã®ãƒ©ãƒ™ãƒ«ãŒã‚ã‚Šã¾ã›ã‚“"
msgid "No linked issue matches the provided parameter."
-msgstr "指定ã•ã‚ŒãŸãƒ‘ラメータã«ä¸€è‡´ã™ã‚‹ãƒªãƒ³ã‚¯ã™ã‚‹ã‚¤ã‚·ãƒ¥ãƒ¼ã¯ã‚ã‚Šã¾ã›ã‚“。"
+msgstr "指定ã•ã‚ŒãŸãƒ‘ラメータã«ä¸€è‡´ã™ã‚‹ãƒªãƒ³ã‚¯ã•ã‚ŒãŸã‚¤ã‚·ãƒ¥ãƒ¼ã¯ã‚ã‚Šã¾ã›ã‚“。"
msgid "No matches found"
msgstr "一致ã™ã‚‹é …ç›®ãŒã‚ã‚Šã¾ã›ã‚“"
@@ -30326,9 +30400,6 @@ msgstr "refãŒé¸æŠžã•ã‚Œã¦ã„ãªã„"
msgid "No regions configured"
msgstr "リージョンãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
-msgid "No related merge requests found."
-msgstr "関連ã™ã‚‹ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
-
msgid "No repository"
msgstr "リãƒã‚¸ãƒˆãƒªãŒã‚ã‚Šã¾ã›ã‚“"
@@ -30371,6 +30442,9 @@ msgstr "ã“ã®ã‚¨ãƒ©ãƒ¼ã®ã‚¹ã‚¿ãƒƒã‚¯ãƒˆãƒ¬ãƒ¼ã‚¹ã¯ã‚ã‚Šã¾ã›ã‚“"
msgid "No starrers matched your search"
msgstr "ã‚ãªãŸã®æ¤œç´¢ã«ãƒžãƒƒãƒã—ãŸãŠæ°—ã«å…¥ã‚Šã¯ã‚ã‚Šã¾ã›ã‚“"
+msgid "No start date – %{dueDate}"
+msgstr "開始日ãªã— – %{dueDate}"
+
msgid "No suggestions found"
msgstr "æ案ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
@@ -30513,9 +30587,6 @@ msgstr "注:ç¾åœ¨ã®ãƒ•ã‚©ãƒ¼ã‚¯ã¯è¡¨ç¤ºãƒ¬ãƒ™ãƒ«ã‚’維æŒã—ã¦ã„ã¾ã™ã€‚"
msgid "NoteForm|Note"
msgstr "メモ"
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr "%{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd} をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã™ã€‚ %{quickActionsDocsLinkStart}クイックアクション%{quickActionsDocsLinkEnd} ã®ãŸã‚ã«ã¯ã€%{keyboardStart}/%{keyboardEnd}を入力ã—ã¾ã™ã€‚"
-
msgid "Notes"
msgstr "ノート"
@@ -30808,6 +30879,9 @@ msgstr "作æˆè€…をコミット"
msgid "Notify|Committed by"
msgstr "コミットã—ãŸæ‹…当者: "
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr "%{project}%{parent_groups_clause}ã§æ¬¡ã®%{column}ã®å€¤ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ: %{error_lines}"
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr "GitLab 管ç†è€…ã‹ã‚‰æ›´æ–°ã‚’å—ä¿¡ã—ãŸããªã„ã§ã™ã‹ï¼Ÿ"
@@ -30913,18 +30987,24 @@ msgstr "ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚¿ã‚¤ãƒ—ã®ãƒ—レビューã¯ã‚ã‚Šã¾ã›ã‚“"
msgid "Notify|No work items have been imported."
msgstr "作業アイテムã¯ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•ã‚Œã¾ã›ã‚“ã§ã—ãŸã€‚"
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
-msgstr "パイプライン #%{pipeline_id} ãŒå¤±æ•—ã—ã¾ã—ãŸ!"
-
msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr "パイプライン %{pipeline_link} ã®ãƒˆãƒªã‚¬ãƒ¼ã‚ã‚Šã¾ã—ãŸ"
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
-msgstr "パイプラインãŒä¿®æ­£ã•ã‚Œã€#%{pipeline_id}ãŒåˆæ ¼ã—ã¾ã—㟠!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
+msgstr "パイプライン%{pipeline_name_or_id}ãŒå¤±æ•—ã—ã¾ã—ãŸ!"
+
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr "パイプライン%{pipeline_name_or_id}ãŒæˆåŠŸã—ã¾ã—ãŸ!"
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
+msgstr "パイプラインãŒä¿®æ­£ã•ã‚Œã€%{pipeline_name_or_id}ãŒæˆåŠŸã—ã¾ã—ãŸ!"
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr "ãŠä½¿ã„ã®ã‚µãƒ¼ãƒ“スプロãƒã‚¤ãƒ€ãŒãƒ¡ãƒ¼ãƒ«ã®ã‚µãƒ–アドレスをサãƒãƒ¼ãƒˆã—ã¦ã„ã‚‹ã“ã¨ã€ãŠã‚ˆã³ãƒ¡ãƒ¼ãƒ«ã®è»¢é€ã‚’æ­£ã—ã設定ã—ã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。"
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr "上記ã®ã‚¨ãƒ©ãƒ¼ã‚’修正ã—ã¦ã€CSVã¸ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚’ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。"
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr "エラーã®ã‚る行を修正ã—ã¦ã€CSVã¸ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚’ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。"
@@ -31099,6 +31179,9 @@ msgstr "レプリカã®æ•°"
msgid "Number of shards"
msgstr "シャードã®æ•°"
+msgid "Number of shards for non-code indexing"
+msgstr "éžã‚³ãƒ¼ãƒ‰ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ä½œæˆã®ã‚·ãƒ£ãƒ¼ãƒ‰æ•°"
+
msgid "OK"
msgstr "OK"
@@ -31773,6 +31856,12 @@ msgstr "é †åºä»˜ãリスト"
msgid "Organizations"
msgstr "組織"
+msgid "Organization|Organization navigation"
+msgstr "組織ã®ãƒŠãƒ“ゲーション"
+
+msgid "Organization|Organization overview"
+msgstr "組織ã®æ¦‚è¦"
+
msgid "Orphaned member"
msgstr "孤立ã—ãŸãƒ¡ãƒ³ãƒãƒ¼"
@@ -32293,6 +32382,18 @@ msgstr "プロジェクトレベル"
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr "åå‰ã¾ãŸã¯ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã“ã®æ­£è¦è¡¨ç¾ã«ä¸€è‡´ã™ã‚‹å ´åˆã€ãƒ‘ッケージを公開ã—ã¾ã™ã€‚"
+msgid "PackageRegistry|Published %{date}"
+msgstr "%{date}ã«å…¬é–‹"
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr "%{author}ãŒ%{date}ã«å…¬é–‹"
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr "%{date}ã«%{author}ãŒ%{projectName}ã§å…¬é–‹"
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr "%{date}ã«%{projectName}ã§å…¬é–‹"
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr "%{project} ã®ãƒ‘ッケージレジストリ㫠%{datetime} ã«å…¬é–‹"
@@ -32348,7 +32449,7 @@ msgid "PackageRegistry|Something went wrong while deleting the package."
msgstr "パッケージã®å‰Šé™¤ä¸­ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "PackageRegistry|Something went wrong while fetching package assets."
-msgstr ""
+msgstr "パッケージアセットã®å–得中ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "PackageRegistry|Something went wrong while fetching the package history."
msgstr "パッケージ履歴ã®å‰Šé™¤ä¸­ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -32863,9 +32964,6 @@ msgstr "パイプラインスケジュール"
msgid "Pipeline URL"
msgstr "パイプラインURL"
-msgid "Pipeline artifacts"
-msgstr "パイプラインアーティファクト"
-
msgid "Pipeline creation rate limits"
msgstr "パイプライン作æˆãƒ¬ãƒ¼ãƒˆã®åˆ¶é™"
@@ -33067,6 +33165,15 @@ msgstr "アクティブ"
msgid "PipelineSchedules|All"
msgstr "全件"
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr "パイプラインスケジュールã®ä½œæˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr "パイプラインスケジュールã®å–得試行中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr "パイプラインスケジュールã®æ›´æ–°ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr "本当ã«ã“ã®ãƒ‘イプラインスケジュールを削除ã—ã¾ã™ã‹ ?"
@@ -33076,6 +33183,9 @@ msgstr "カスタムCI/CD変数をæŒã¤ã“ã¨ãŒã§ãã¾ã™ã€‚"
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr "æ–°ã—ã„パイプラインスケジュールを作æˆ"
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr "パイプラインスケジュールを作æˆ"
+
msgid "PipelineSchedules|Cron timezone"
msgstr "Cron ã®ã‚¿ã‚¤ãƒ ã‚¾ãƒ¼ãƒ³"
@@ -33133,9 +33243,6 @@ msgstr "特定ã®ãƒ–ランãƒã¾ãŸã¯ã‚¿ã‚°ã«å¯¾ã—ã¦å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚"
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr "スケジュールオーナーã¨åŒã˜ãƒ—ロジェクト権é™ã§å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚"
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr "パイプラインスケジュールをä¿å­˜"
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr "パイプラインã®å®Ÿè¡Œã‚’æ­£ã—ãスケジュールã—ã¾ã—ãŸã€‚詳細ã«ã¤ã„ã¦ã¯ã€%{linkStart}パイプラインã®ãƒšãƒ¼ã‚¸%{linkEnd}ã‚’ã”覧ãã ã•ã„。"
@@ -33320,10 +33427,7 @@ msgid "Pipelines|CI/CD Catalog"
msgstr "CI/CD カタログ"
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
-msgstr ""
-
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr "å­ãƒ‘イプライン(%{link_start}親%{link_end})"
+msgstr "å­ãƒ‘イプライン(%{linkStart}親%{linkEnd})"
msgid "Pipelines|Clear runner caches"
msgstr "Runnerキャッシュを削除"
@@ -33436,11 +33540,14 @@ msgstr "CI/CDをプロジェクトã«ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—ã™ã‚‹æº–å‚™ã¯ã§ãã¾ã
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr "rebaseã«ã‚ˆã‚Šã€åˆ†å²ã—ãŸãƒ—ロジェクトマージリクエストã‹ã‚‰ç”Ÿæˆã•ã‚ŒãŸã‚³ãƒ¼ãƒ‰ã‚’実行ã™ã‚‹ãƒ‘イプラインãŒä½œæˆã•ã‚Œã¾ã™ã€‚çµæžœã¨ã—ã¦ã€CI変数ã®éœ²å‡ºãªã©ã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ä¸Šã®å½±éŸ¿ãŒç”Ÿã˜ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚"
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr "%{jobName}ジョブをå†è©¦è¡Œã™ã‚‹"
+
msgid "Pipelines|Revoke trigger"
msgstr "トリガーã®å–り消ã—"
msgid "Pipelines|Scheduled"
-msgstr ""
+msgstr "スケジュール済ã¿"
msgid "Pipelines|Set up a runner"
msgstr "Runner ã®è¨­å®š"
@@ -33487,11 +33594,8 @@ msgstr "ã“ã® GitLab CI 設定ã¯ç„¡åŠ¹ã§ã™: %{reason}. %{linkStart}詳細ã¯
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr "ã“ã® GitLab CI 設定ã¯æœ‰åŠ¹ã§ã™ã€‚"
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr "ã“ã‚Œã¯è¦ªãƒ‘イプライン内ã«ã‚ã‚‹å­ãƒ‘イプラインã§ã™"
-
msgid "Pipelines|This pipeline is stuck"
-msgstr ""
+msgstr "ã“ã®ãƒ‘イプラインã¯ã‚¹ã‚¿ãƒƒã‚¯ã—ã¦ã„ã¾ã™"
msgid "Pipelines|This pipeline ran on the contents of this merge request combined with the contents of all other merge requests queued for merging into the target branch."
msgstr "ã“ã®ãƒ‘イプラインã¯ã€ã“ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®å†…容ã¨ã€ã‚¿ãƒ¼ã‚²ãƒƒãƒˆãƒ–ランãƒã«ãƒžãƒ¼ã‚¸ã™ã‚‹ãŸã‚ã«ã‚­ãƒ¥ãƒ¼ã«å…¥ã‚Œã‚‰ã‚ŒãŸä»–ã®ã™ã¹ã¦ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®å†…容を組ã¿åˆã‚ã›ã¦å®Ÿè¡Œã—ã¾ã—ãŸã€‚"
@@ -33508,11 +33612,11 @@ msgstr "ã“ã®ãƒ—ロジェクトã¯ç¾åœ¨ãƒ‘イプラインを実行ã™ã‚‹ã‚ˆã†
msgid "Pipelines|Token"
msgstr "トークン"
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
-msgstr ""
+msgstr "パイプラインã®åˆè¨ˆã‚¸ãƒ§ãƒ–æ•°"
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr "トリガーユーザーã«ã¯ãƒ—ロジェクトã«å¿…è¦ãªæ¨©é™ãŒä¸è¶³ã—ã¦ã„ã¾ã™"
@@ -33563,14 +33667,20 @@ msgid "Pipelines|You should review the code thoroughly before running this pipel
msgstr "親プロジェクトã®CI/CDリソースを使用ã—ã¦ã“ã®ãƒ‘イプラインを実行ã™ã‚‹å‰ã«ã€ã‚³ãƒ¼ãƒ‰ã‚’徹底的ã«ç¢ºèªã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
msgid "Pipelines|You will see a maximum of 100 jobs in this list. To view all failed jobs, %{linkStart}go to the details page%{linkEnd} of this pipeline."
-msgstr ""
+msgstr "ã“ã®ãƒªã‚¹ãƒˆã«ã¯æœ€å¤§100件ã®ã‚¸ãƒ§ãƒ–ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚失敗ã—ãŸã‚¸ãƒ§ãƒ–ã‚’ã™ã¹ã¦è¡¨ç¤ºã™ã‚‹ã«ã¯ã€ã“ã®ãƒ‘イプラインã®%{linkStart}詳細ページã«ç§»å‹•%{linkEnd}ã—ã¾ã™ã€‚"
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr "変更ã¯æ­£å¸¸ã«ã‚³ãƒŸãƒƒãƒˆã•ã‚Œã¾ã—ãŸã€‚次ã«ã€æ–°ã—ã„マージリクエストページã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã—ã¾ã™ã€‚"
+msgid "Pipelines|created"
+msgstr "作æˆæ¸ˆã¿"
+
msgid "Pipelines|error"
msgstr "エラー"
+msgid "Pipelines|finished"
+msgstr "完了"
+
msgid "Pipelines|invalid"
msgstr "無効"
@@ -33637,6 +33747,12 @@ msgstr "マージトレインパイプラインジョブã¯å†è©¦è¡Œã§ãã¾ã›
msgid "Pipeline|Merged result pipeline"
msgstr "マージçµæžœãƒ‘イプライン"
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr "ã“ã®ãƒ‘イプラインã«å¤±æ•—ã—ãŸã‚¸ãƒ§ãƒ–ã¯ã‚ã‚Šã¾ã›ã‚“ 🎉"
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr "åˆæ ¼æ¸ˆã¿"
@@ -33721,6 +33837,9 @@ msgstr "ã“ã®ãƒ‘イプラインã¯ã€ã‚¿ãƒ¼ã‚²ãƒƒãƒˆãƒ–ランãƒã§ã¯ãªãã€
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr "マージリクエストパイプラインを実行ã™ã‚‹ã«ã¯ã€ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆãƒ‘イプラインã§ã‚¸ãƒ§ãƒ–を実行ã™ã‚‹ã‚ˆã†ã«%{linkStart}CI/CD 設定ファイルを設定ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。%{linkEnd}"
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr "トリガー作æˆè€…"
@@ -33847,9 +33966,6 @@ msgstr "ã‚ãªãŸã®ãƒ¡ãƒ¼ãƒ« アドレスを確èªã—ã¦ãã ã•ã„。"
msgid "Please contact an admin to create runners."
msgstr "ランナーを作æˆã™ã‚‹ã«ã¯ç®¡ç†è€…ã«é€£çµ¡ã—ã¦ãã ã•ã„。"
-msgid "Please contact an admin to register runners."
-msgstr "ランナーを登録ã™ã‚‹ã«ã¯ç®¡ç†è€…ã«é€£çµ¡ã—ã¦ãã ã•ã„。"
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr "ã“ã®ã‚¨ãƒ©ãƒ¼ã«ã¤ã„ã¦ã€GitLab 管ç†è€…ã«é€£çµ¡ã—ã¦ãã ã•ã„。"
@@ -34000,8 +34116,8 @@ msgstr "ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„"
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr "å†åº¦ãŠè©¦ã—ãã ã•ã„。ã¾ãŸã“ã®ãƒšãƒ¼ã‚¸ã‚’æ›´æ–°ã—ã¦ãã ã•ã„。ã“ã®å•é¡ŒãŒè§£æ±ºã—ãªã„å ´åˆã¯ã€ã‚µãƒãƒ¼ãƒˆã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。"
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
-msgstr "続行ã™ã‚‹ã«ã¯ %{phrase_code} を入力ã—ã¦ãã ã•ã„。キャンセルã™ã‚‹å ´åˆã¯ã“ã®ãƒ¢ãƒ¼ãƒ€ãƒ«ã‚’é–‰ã˜ã¦ãã ã•ã„。"
+msgid "Please type %{phrase_code} to proceed."
+msgstr "続行ã™ã‚‹ã«ã¯ %{phrase_code} を入力ã—ã¦ãã ã•ã„。"
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
msgstr "イシューやコメントã¸ã®ã‚¹ãƒ‘ム行為ã€ã¾ãŸä¸é©åˆ‡ãªæŒ™å‹•ã‚’ã™ã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã¤ã„ã¦ã¯ã€ã“ã¡ã‚‰ã®ãƒ•ã‚©ãƒ¼ãƒ ã‹ã‚‰ç®¡ç†è€…ã«å ±å‘Šã—ã¦ãã ã•ã„。"
@@ -34202,7 +34318,7 @@ msgid "Preferences|Enable Gitpod integration"
msgstr "Gitpod インテグレーションを有効ã«ã™ã‚‹"
msgid "Preferences|Enable Zoekt code search"
-msgstr ""
+msgstr "Zoektコード検索を有効ã«ã™ã‚‹"
msgid "Preferences|Enable follow users"
msgstr "ユーザーã®ãƒ•ã‚©ãƒ­ãƒ¼ã‚’有効ã«ã™ã‚‹"
@@ -34253,7 +34369,7 @@ msgid "Preferences|Show one file at a time on merge request's Changes tab"
msgstr "マージリクエストã®å¤‰æ›´ã‚¿ãƒ–ã«ä¸€åº¦ã« 1 ã¤ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示"
msgid "Preferences|Show shortcut buttons above files on project overview"
-msgstr "プロジェクトã®æ¦‚è¦ã«ãƒ•ã‚¡ã‚¤ãƒ«ã®ä¸Šã«ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆãƒœã‚¿ãƒ³ã‚’表示ã™ã‚‹"
+msgstr "プロジェクトã®æ¦‚è¦ã§ãƒ•ã‚¡ã‚¤ãƒ«ã®ä¸Šã«ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆãƒœã‚¿ãƒ³ã‚’表示ã™ã‚‹"
msgid "Preferences|Show whitespace changes in diffs"
msgstr "空白をå«ã‚ãŸå·®åˆ†ã‚’表示"
@@ -34280,7 +34396,7 @@ msgid "Preferences|Turns on or off the ability to follow or be followed by other
msgstr "ä»–ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’フォローã¾ãŸã¯ãƒ•ã‚©ãƒ­ãƒ¼ã•ã‚Œã‚‹æ©Ÿèƒ½ã‚’有効ã¾ãŸã¯ç„¡åŠ¹ã«ã—ã¾ã™ã€‚"
msgid "Preferences|Turns on or off the preference to search with Zoekt instead of Elasticsearch."
-msgstr ""
+msgstr "Elasticsearchã®ä»£ã‚ã‚Šã«Zoektã§æ¤œç´¢ã™ã‚‹è¨­å®šã‚’オンã¾ãŸã¯ã‚ªãƒ•ã«ã—ã¾ã™ã€‚"
msgid "Preferences|Use relative times"
msgstr "相対時間を使用"
@@ -34394,7 +34510,7 @@ msgid "Private projects can be created in your personal namespace with:"
msgstr "ã‚ãªãŸå€‹äººã®åå‰ç©ºé–“ã«ãƒ—ライベートプロジェクトを作æˆã§ãã¾ã™:"
msgid "Private projects compute cost factor"
-msgstr ""
+msgstr "プライベートプロジェクトã®ã‚³ãƒ³ãƒ”ューティングコストè¦ç´ "
msgid "Problem with %{name} command: %{message}."
msgstr "%{name}コマンドã«é–¢ã™ã‚‹å•é¡Œ: %{message}。"
@@ -34409,10 +34525,10 @@ msgid "Product analytics"
msgstr "プロダクト分æž"
msgid "ProductAnalytics|1. Add the NPM package to your package.json using your preferred package manager"
-msgstr "1. ã”希望ã®ãƒ‘ッケージマãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’使用ã—ã¦ã€NPMパッケージをpackage.jsonã«è¿½åŠ ã—ã¾ã™ã€‚"
+msgstr "1. ãŠå¥½ã¿ã®ãƒ‘ッケージマãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’使用ã—ã¦ã€NPMパッケージをpackage.jsonã«è¿½åŠ ã™ã‚‹"
msgid "ProductAnalytics|2. Import the new package into your JS code"
-msgstr "2. æ–°ã—ã„パッケージを JS コードã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¾ã™ã€‚"
+msgstr "2. æ–°ã—ã„パッケージをJSコードã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆã™ã‚‹"
msgid "ProductAnalytics|3. Initiate the tracking"
msgstr "3. トラッキングを開始ã™ã‚‹"
@@ -34421,13 +34537,13 @@ msgid "ProductAnalytics|Add another dimension"
msgstr "別ã®ãƒ‡ã‚£ãƒ¡ãƒ³ã‚·ãƒ§ãƒ³ã‚’追加"
msgid "ProductAnalytics|Add the script to the page and assign the client SDK to window"
-msgstr "スクリプトをページã«è¿½åŠ ã—ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆSDKをウィンドウã«å‰²ã‚Šå½“ã¦ã¾ã™"
+msgstr "スクリプトをページã«è¿½åŠ ã—ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆSDKをウィンドウã«å‰²ã‚Šå½“ã¦ã‚‹"
msgid "ProductAnalytics|Add the script to the page and assign the client SDK to window:"
msgstr "スクリプトをページã«è¿½åŠ ã—ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆSDKをウィンドウã«å‰²ã‚Šå½“ã¦ã¾ã™:"
msgid "ProductAnalytics|After your application has been instrumented and data is being collected, you can visualize and monitor behaviors in your %{linkStart}analytics dashboards%{linkEnd}."
-msgstr "アプリケーションを準備ã—ã€ãƒ‡ãƒ¼ã‚¿ãŒåŽé›†ã•ã‚ŒãŸå¾Œã€ %{linkStart}分æžãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰%{linkEnd} ã§æŒ¯èˆžã„を視覚化ã—ã€ç›£è¦–ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
+msgstr "アプリケーションãŒè¨ˆæ¸¬ã•ã‚Œã¦ãƒ‡ãƒ¼ã‚¿ãŒåŽé›†ã•ã‚ŒãŸã‚‰ã€%{linkStart}分æžãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰%{linkEnd}ã§å‹•ä½œã‚’視覚化ã—ã€ãƒ¢ãƒ‹ã‚¿ãƒªãƒ³ã‚°ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
msgid "ProductAnalytics|All Clicks Compared"
msgstr "ã™ã¹ã¦ã®ã‚¯ãƒªãƒƒã‚¯ã¨æ¯”較"
@@ -34516,6 +34632,9 @@ msgstr "時系列ã®ã‚¤ãƒ™ãƒ³ãƒˆ"
msgid "ProductAnalytics|Feature Usages"
msgstr "機能ã®ä½¿ç”¨"
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr "詳細ã«ã¤ã„ã¦ã¯ã€%{linkStart}文書%{linkEnd}ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr "製å“分æžãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰ã§ãƒ‡ãƒ¼ã‚¿ã®è¡¨ç¤ºã‚’開始ã™ã‚‹ã«ã¯ã€åˆ†æžãƒˆãƒ©ãƒƒã‚­ãƒ³ã‚°ã‚³ãƒ¼ãƒ‰ã‚’プロジェクトã«è¿½åŠ ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
@@ -34555,17 +34674,20 @@ msgstr "インサイトをå–å¾—ã—ãŸã„ã®ã¯ä½•ã§ã™ã‹ï¼Ÿ"
msgid "ProductAnalytics|Page Views"
msgstr "ページビュー"
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr "製å“分æžã®ã‚ªãƒ³ãƒœãƒ¼ãƒ‡ã‚£ãƒ³ã‚°"
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr "リピート訪å•çŽ‡"
msgid "ProductAnalytics|SDK application ID"
-msgstr "SDK アプリ ID"
+msgstr "SDKアプリケーションID"
msgid "ProductAnalytics|SDK clients"
-msgstr "SDK クライアント"
+msgstr "SDKクライアント"
msgid "ProductAnalytics|SDK host"
-msgstr "SDK ホスト"
+msgstr "SDKホスト"
msgid "ProductAnalytics|Sessions"
msgstr "セッション"
@@ -34619,7 +34741,7 @@ msgid "ProductAnalytics|What do you want to measure?"
msgstr "何を測定ã—ã¾ã™ã‹ï¼Ÿ"
msgid "ProductAnalytics|You can instrument your application using a JS module or an HTML script. Follow the instructions below for the option you prefer."
-msgstr "JSモジュールã¾ãŸã¯HTMLスクリプトを使用ã—ã¦ã‚¢ãƒ—リケーションを準備ã§ãã¾ã™ã€‚ãŠå¥½ã¿ã®ã‚ªãƒ—ションã«ã¤ã„ã¦ã¯ã€ä»¥ä¸‹ã®æ‰‹é †ã«å¾“ã£ã¦ãã ã•ã„。"
+msgstr "JSモジュールã¾ãŸã¯HTMLスクリプトを使用ã—ã¦ã‚¢ãƒ—リケーションを計測ã§ãã¾ã™ã€‚ãŠå¥½ã¿ã®ã‚ªãƒ—ションã«ã¤ã„ã¦ã¯ã€ä»¥ä¸‹ã®æ‰‹é †ã«å¾“ã£ã¦ãã ã•ã„。"
msgid "Productivity"
msgstr "生産性"
@@ -34696,6 +34818,9 @@ msgstr "オン"
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr "ã‚ãªãŸã¯ %{yourAccount} ã¨ã€ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ãƒªãƒ³ã‚¯ã•ã‚Œã¦ã„ã‚‹ã™ã¹ã¦ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã€ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã€ã‚°ãƒ«ãƒ¼ãƒ—を削除ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ %{deleteAccount} を確èªã™ã‚‹ã¨ã€å…ƒã«æˆ»ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“。"
+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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr "ã‚ãªãŸã¯%{yourAccount}ã¨ã€ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ãƒªãƒ³ã‚¯ã•ã‚Œã¦ã„ã‚‹ã™ã¹ã¦ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã€ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã€ã‚°ãƒ«ãƒ¼ãƒ—を削除ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚%{deleteAccount}を確èªã™ã‚‹ã¨ã€å–り消ã™ã“ã¨ã‚„当該アカウントを復元ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。åŒã˜ãƒ¦ãƒ¼ã‚¶ãƒ¼åã¾ãŸã¯ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’使用ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’作æˆã™ã‚‹ã«ã¯7日間待ã¤å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+
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 "ユーザåã‚’ %{currentUsernameBold} ã‹ã‚‰ %{newUsernameBold} ã«å¤‰æ›´ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚プロファイルã¨ãƒ—ロジェクト㯠%{newUsername} åå‰ç©ºé–“ã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã•ã‚Œã¾ã™ã€‚ã—ã‹ã—〠%{currentUsername} åå‰ç©ºé–“ãŒåˆ¥ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¾ãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—ã«ã‚ˆã£ã¦ç™»éŒ²ã•ã‚Œã‚‹ã¨ã€ã“ã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã¯æœŸé™åˆ‡ã‚Œã«ãªã‚Šã¾ã™ã€‚ Gitリãƒã‚¸ãƒˆãƒªã®ãƒªãƒ¢ãƒ¼ãƒˆã‚’ã§ãã‚‹ã ã‘æ—©ãæ›´æ–°ã—ã¦ãã ã•ã„。"
@@ -34709,10 +34834,10 @@ msgid "Profiles|Account could not be deleted. GitLab was unable to verify your i
msgstr "アカウントを削除ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚GitLab ã¯ã‚ãªãŸã®èº«å…ƒã‚’確èªã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
msgid "Profiles|Account deletion is not allowed by your administrator."
-msgstr "アカウント削除ã¯ç®¡ç†è€…ã«ã‚ˆã£ã¦è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。"
+msgstr "アカウントã®å‰Šé™¤ã¯ç®¡ç†è€…ã«ã‚ˆã£ã¦è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。"
msgid "Profiles|Account deletion is not allowed."
-msgstr "アカウント削除ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。"
+msgstr "アカウントã®å‰Šé™¤ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。"
msgid "Profiles|Account scheduled for removal."
msgstr "削除予定ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã§ã™ã€‚"
@@ -35212,9 +35337,6 @@ msgstr "プロジェクト情報"
msgid "Project information"
msgstr "プロジェクト情報"
-msgid "Project is required when cluster_type is :project"
-msgstr "cluster_type ㌠:project ã®å ´åˆã€ãƒ—ロジェクトãŒå¿…è¦ã§ã™ã€‚"
-
msgid "Project members"
msgstr "プロジェクトメンãƒãƒ¼"
@@ -35752,18 +35874,6 @@ msgstr "内部"
msgid "ProjectSettings|Issues"
msgstr "イシュー"
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr "Jitsu 管ç†è€…メールアドレス"
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr "Jitsu管ç†è€…パスワード"
-
-msgid "ProjectSettings|Jitsu host"
-msgstr "Jitsuホスト"
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr "JitsuプロジェクトID"
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr "ã“ã®ãƒªãƒã‚¸ãƒˆãƒªã®LFSオブジェクトã¯å¼•ã続ãフォークã§ãã¾ã™ã€‚ %{linkStart}ã©ã†ã™ã‚Œã°å‰Šé™¤ã§ãã¾ã™ã‹ï¼Ÿ%{linkEnd}"
@@ -35834,7 +35944,7 @@ msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr "ã“ã®ãƒªãƒã‚¸ãƒˆãƒªã«ã¯ç½²åã•ã‚ŒãŸã‚³ãƒŸãƒƒãƒˆã®ã¿ãƒ—ッシュã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
msgid "ProjectSettings|Override instance analytics configuration for this project"
-msgstr "ã“ã®ãƒ—ロジェクトã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹åˆ†æžè¨­å®šã‚’上書ãã™ã‚‹"
+msgstr "ã“ã®ãƒ—ロジェクトã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹åˆ†æžè¨­å®šã‚’上書ãã—ã¾ã™"
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr "ã™ã¹ã¦ã®ãƒ—ロジェクトメンãƒãƒ¼ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼é€šçŸ¥è¨­å®šã‚’上書ãã—ã¾ã™ã€‚"
@@ -35858,7 +35968,7 @@ msgid "ProjectSettings|Product analytics configurator connection string"
msgstr "製å“分æžã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ãƒ¼æŽ¥ç¶šæ–‡å­—列"
msgid "ProjectSettings|Product analytics needs to be set up before your application can be instrumented. Follow the %{link_start}set up process%{link_end}."
-msgstr "アプリケーションを計測ã™ã‚‹ã«ã¯ã€è£½å“分æžã‚’セットアップã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ %{link_start}プロセスã®è¨­å®š%{link_end} ã«å¾“ã£ã¦ãã ã•ã„。"
+msgstr "アプリケーションを計測ã™ã‚‹ã«ã¯ã€äº‹å‰ã«è£½å“分æžã‚’セットアップã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚%{link_start}セットアッププロセス%{link_end}ã«å¾“ã£ã¦ãã ã•ã„。"
msgid "ProjectSettings|Project visibility"
msgstr "プロジェクトã®å¯è¦–性"
@@ -35947,9 +36057,6 @@ msgstr "upstreamã§ãƒžãƒ¼ã‚¸ã•ã‚Œã‚‹ã‚ˆã†ã«å¤‰æ›´ã‚’é€ä¿¡ã—ã¾ã™ã€‚"
msgid "ProjectSettings|Target project"
msgstr "ターゲットプロジェクト"
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr "Jitsu内ã®ãƒ—ロジェクトã®ID。プロジェクトã«ã¯ã™ã¹ã¦ã®åˆ†æžã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚"
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr "Cubeインスタンスã®URL。"
@@ -35963,7 +36070,7 @@ msgid "ProjectSettings|The commit message used when squashing commits."
msgstr "コミットã®ã‚¹ã‚«ãƒƒã‚·ãƒ¥æ™‚ã«ä½¿ç”¨ã™ã‚‹ã‚³ãƒŸãƒƒãƒˆ メッセージ。"
msgid "ProjectSettings|The connection string of your product analytics configurator instance for Snowplow configuration."
-msgstr ""
+msgstr "Snowplow設定ã®ãŸã‚ã®è£½å“分æžã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ãƒ¼ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã®æŽ¥ç¶šæ–‡å­—列。"
msgid "ProjectSettings|The default target project for merge requests created in this fork project."
msgstr "ã“ã®ãƒ•ã‚©ãƒ¼ã‚¯ãƒ—ロジェクトã§ä½œæˆã•ã‚ŒãŸãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆãƒ—ロジェクト。"
@@ -35971,9 +36078,6 @@ msgstr "ã“ã®ãƒ•ã‚©ãƒ¼ã‚¯ãƒ—ロジェクトã§ä½œæˆã•ã‚ŒãŸãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨
msgid "ProjectSettings|The default template will be applied on save."
msgstr "デフォルトテンプレートã¯ä¿å­˜æ™‚ã«é©ç”¨ã•ã‚Œã¾ã™ã€‚"
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr "Jitsuインスタンスã®ãƒ›ã‚¹ãƒˆã€‚"
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr "データコレクターインスタンスã®ãƒ›ã‚¹ãƒˆã€‚"
@@ -36010,11 +36114,8 @@ msgstr "アップストリームã®ãƒ—ロジェクト"
msgid "ProjectSettings|Used for every new merge request."
msgstr "æ–°è¦ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã”ã¨ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚"
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr "Clickhouseインスタンスã«Jitsuを接続ã™ã‚‹éš›ã«ä½¿ç”¨ã—ã¾ã™ã€‚"
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
-msgstr "有効期間ã®çŸ­ã„APIアクセストークンã®ç”Ÿæˆã«ä½¿ç”¨ã—ã¾ã™ã€‚"
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
+msgstr "Clickhouseインスタンスã«Snowplowを接続ã™ã‚‹éš›ã«ä½¿ç”¨ã—ã¾ã™ã€‚"
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
msgstr "Cubeインスタンスã‹ã‚‰ãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰ãƒ‡ãƒ¼ã‚¿ã‚’å–å¾—ã™ã‚‹éš›ã«ä½¿ç”¨ã—ã¾ã™ã€‚"
@@ -36496,6 +36597,9 @@ msgstr "グループラベルã¸æ˜‡æ ¼"
msgid "Promote to objective"
msgstr "目標ã«æ˜‡æ ¼ã™ã‚‹"
+msgid "Promote work item"
+msgstr "作業アイテムをプロモートã™ã‚‹"
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr "プロジェクトã®ãƒžã‚¤ãƒ«ã‚¹ トーンã ã‘ãŒãƒ—ロモートã§ãã¾ã™ã€‚"
@@ -36511,6 +36615,9 @@ msgstr "イシューをエピックã«æ˜‡æ ¼æ¸ˆã¿"
msgid "Promotes issue to incident"
msgstr "イシューをインシデントã«ãƒ—ロモート"
+msgid "Promotes work item to %{type}."
+msgstr "作業アイテムを%{type}ã«ãƒ—ロモートã—ã¾ã™ã€‚"
+
msgid "Promotion is not supported."
msgstr "昇格ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“。"
@@ -36662,7 +36769,7 @@ msgid "Prompt users to upload SSH keys"
msgstr "SSH éµã‚’アップロードã™ã‚‹ã‚ˆã†ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ä¿ƒã™"
msgid "Property 'dedicatedPod' of component '%s' is not yet supported"
-msgstr ""
+msgstr "コンãƒãƒ¼ãƒãƒ³ãƒˆã€Œ%sã€ã®ãƒ—ロパティ「dedicatedPodã€ã¯ã¾ã ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
msgid "Protect"
msgstr "ä¿è­·"
@@ -37066,7 +37173,7 @@ msgid "Public projects are an easy way to allow everyone to have read-only acces
msgstr "公開プロジェクトã¯ã€èª°ã‚‚ãŒèª­ã¿å–り専用ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒå¯èƒ½ã¨ãªã‚‹ã€ç°¡å˜ãªæ–¹æ³•ã§ã™ã€‚"
msgid "Public projects compute cost factor"
-msgstr ""
+msgstr "パブリックプロジェクトã®ã‚³ãƒ³ãƒ”ューティングコストè¦ç´ "
msgid "Publish to status page"
msgstr "ステータスページã«å…¬é–‹"
@@ -37293,9 +37400,6 @@ msgstr "プロジェクトã®å“質"
msgid "Query"
msgstr "クエリ"
-msgid "Query cannot be processed"
-msgstr "クエリーを処ç†ã§ãã¾ã›ã‚“"
-
msgid "Queued"
msgstr "キュー済"
@@ -37366,7 +37470,10 @@ msgid "Read more about GitLab at %{link_to_promo}."
msgstr "GitLab ã®è©³ç´°ã«ã¤ã„ã¦ã€%{link_to_promo} ã‚’ã”覧ãã ã•ã„。"
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
-msgstr "%{changes_link_start}変更%{link_end}〠%{vision_link_start}ビジョン%{link_end}〠%{design_link_start}デザイン%{link_end} ã®è©³ç´°ã‚’ã”覧ãã ã•ã„。"
+msgstr "%{changes_link_start}変更%{link_end}ã€%{vision_link_start}ビジョン%{link_end}ã€ãŠã‚ˆã³%{design_link_start}デザイン%{link_end}ã®è©³ç´°ã‚’ãŠèª­ã¿ãã ã•ã„。"
+
+msgid "Read the documentation before applying changes."
+msgstr "変更をé©ç”¨ã™ã‚‹å‰ã«æ–‡æ›¸ã‚’ãŠèª­ã¿ãã ã•ã„。"
msgid "Read their documentation."
msgstr "文書を読む"
@@ -37549,7 +37656,7 @@ msgstr "ã“ã®æ©Ÿèƒ½ã‚’使用ã™ã‚‹"
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr "ã“ã®æ‰‹é †ã‚’スキップã—ã¦ã‚‚本当ã«ã‚ˆã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37561,7 +37668,7 @@ msgstr "共有 GitLab ランナーを使用ã—ãŸãƒ‘イプラインã¯ã€ã‚¢ã‚«ã
msgid "RegistrationVerification|Skip this for now"
msgstr "今ã®ã¨ã“ã‚スキップã™ã‚‹"
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37576,23 +37683,11 @@ msgstr "ã¯ã„ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™"
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr "アカウントã®ç¢ºèªã¯å¾Œã»ã©è¡Œã†ã“ã¨ãŒã§ãã¾ã™ã€‚"
-msgid "Registration|Checkout"
-msgstr "checkout"
-
-msgid "Registration|Your GitLab group"
-msgstr "ã‚ãªãŸã®GitLab グループ"
-
-msgid "Registration|Your first project"
-msgstr "ã‚ãªãŸã®æœ€åˆã®ãƒ—ロジェクト"
-
-msgid "Registration|Your profile"
-msgstr "ã‚ãªãŸã®ãƒ—ロフィール"
-
msgid "Registry entry enqueued to be resynced"
-msgstr ""
+msgstr "レジストリエントリã¯å†åŒæœŸã™ã‚‹ãŸã‚ã«ã‚­ãƒ¥ãƒ¼ã«å…¥ã£ã¦ã„ã¾ã™"
msgid "Registry entry enqueued to be reverified"
-msgstr ""
+msgstr "レジストリエントリã¯å†æ¤œè¨¼ã®ãŸã‚ã«ã‚­ãƒ¥ãƒ¼ã«å…¥ã£ã¦ã„ã¾ã™"
msgid "Registry setup"
msgstr "レジストリã®ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—"
@@ -37622,10 +37717,10 @@ msgid "Related issues"
msgstr "関連ã™ã‚‹ã‚¤ã‚·ãƒ¥ãƒ¼"
msgid "Related merge request %{link_to_merge_request} to merge %{link_to_merge_request_source_branch}"
-msgstr ""
+msgstr "%{link_to_merge_request_source_branch}をマージã™ã‚‹é–¢é€£ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆ%{link_to_merge_request}"
msgid "Related merge request %{link_to_merge_request} to merge %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
+msgstr "%{link_to_merge_request_source_branch}ã‚’%{link_to_merge_request_target_branch}ã«ãƒžãƒ¼ã‚¸ã™ã‚‹é–¢é€£ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆ%{link_to_merge_request}"
msgid "Related merge requests"
msgstr "関連ã™ã‚‹ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆ"
@@ -37802,13 +37897,13 @@ msgstr "Zoom ミーティングを削除."
msgid "Remove access"
msgstr "アクセスを削除ã™ã‚‹"
-msgid "Remove all or specific assignee(s)"
-msgstr "ã™ã¹ã¦ã®æ‹…当者ã¾ãŸã¯ç‰¹å®šã®æ‹…当者を削除"
+msgid "Remove all or specific assignees"
+msgstr "ã™ã¹ã¦ã®ã€ã¾ãŸã¯ç‰¹å®šã®æ‹…当者を削除"
msgid "Remove all or specific label(s)"
msgstr "ã™ã¹ã¦ã®ãƒ©ãƒ™ãƒ«ã¾ãŸã¯ç‰¹å®šã®ãƒ©ãƒ™ãƒ«ã‚’削除ã™ã‚‹"
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr "ã™ã¹ã¦ã®ã€ã¾ãŸã¯ç‰¹å®šã®ãƒ¬ãƒ“ュアーを削除"
msgid "Remove approvers"
@@ -37848,7 +37943,7 @@ msgid "Remove due date"
msgstr "期日を削除"
msgid "Remove epic reference"
-msgstr ""
+msgstr "エピックå‚照を削除"
msgid "Remove favicon"
msgstr "ファビコンを削除"
@@ -37875,7 +37970,7 @@ msgid "Remove icon"
msgstr "アイコンを削除"
msgid "Remove issue reference"
-msgstr ""
+msgstr "イシューå‚照を削除"
msgid "Remove iteration"
msgstr "イテレーションを削除"
@@ -37905,7 +38000,7 @@ msgid "Remove member"
msgstr "メンãƒãƒ¼ã‚’削除"
msgid "Remove merge request reference"
-msgstr ""
+msgstr "マージリクエストå‚照を削除"
msgid "Remove milestone"
msgstr "マイルストーンを削除"
@@ -37983,7 +38078,7 @@ msgid "Removed group can not be restored!"
msgstr "削除ã•ã‚ŒãŸã‚°ãƒ«ãƒ¼ãƒ—ã¯ãƒªã‚¹ãƒˆã‚¢ã§ãã¾ã›ã‚“ï¼"
msgid "Removed link with %{issue_ref}."
-msgstr "%{issue_ref} ã¨ã®ãƒªãƒ³ã‚¯ã‚’削除ã—ã¾ã—ãŸã€‚"
+msgstr "%{issue_ref}ã¨ã®ãƒªãƒ³ã‚¯ã‚’削除ã—ã¾ã—ãŸã€‚"
msgid "Removed parent epic %{epic_ref}."
msgstr "親エピック %{epic_ref} を削除ã—ã¾ã—ãŸã€‚"
@@ -38031,7 +38126,7 @@ msgid "Removes an issue from an epic."
msgstr "エピックã‹ã‚‰ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’削除"
msgid "Removes link with %{issue_ref}."
-msgstr "%{issue_ref} ã¨ã®ãƒªãƒ³ã‚¯ã‚’削除ã™ã‚‹"
+msgstr "%{issue_ref}ã¨ã®ãƒªãƒ³ã‚¯ã‚’削除ã—ã¾ã™ã€‚"
msgid "Removes parent epic %{epic_ref}."
msgstr "親エピック %{epic_ref} を削除ã—ã¾ã™ã€‚"
@@ -38061,7 +38156,7 @@ msgid "Render diagrams in your documents using PlantUML."
msgstr "PlantUML を使用ã—ã¦ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆå†…ã®å›³ã‚’レンダリングã—ã¾ã™ã€‚"
msgid "Render diagrams in your documents using diagrams.net."
-msgstr ""
+msgstr "Diagrams.netを使用ã—ã¦ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆå†…ã®å›³ã‚’レンダリングã—ã¾ã™ã€‚"
msgid "Renew subscription"
msgstr "サブスクリプションã®æ›´æ–°"
@@ -38069,6 +38164,9 @@ msgstr "サブスクリプションã®æ›´æ–°"
msgid "Reopen"
msgstr "å†é–‹"
+msgid "Reopen %{issuableType}"
+msgstr "%{issuableType}ã‚’å†é–‹"
+
msgid "Reopen %{issueType}"
msgstr "%{issueType} ã‚’å†åº¦é–‹ã"
@@ -38093,6 +38191,9 @@ msgstr "ã“ã® %{quick_action_target} ã‚’å†ã³é–‹ã"
msgid "Reopened this %{quick_action_target}."
msgstr "ã“ã® %{quick_action_target} ã‚’å†ã³é–‹ã„ãŸã€‚"
+msgid "Reopening %{issuableType}..."
+msgstr "%{issuableType}ã‚’å†é–‹ã—ã¦ã„ã¾ã™..."
+
msgid "Reopening..."
msgstr "å†é–‹ä¸­..."
@@ -38111,6 +38212,9 @@ msgstr "ã™ã¹ã¦ã®ãƒ©ãƒ™ãƒ«ã‚’ç½®æ›"
msgid "Replace audio"
msgstr "音声ã®å…¥ã‚Œæ›¿ãˆ"
+msgid "Replace current template with filled in placeholders"
+msgstr "ç¾åœ¨ã®ãƒ†ãƒ³ãƒ—レートを入力ã•ã‚ŒãŸãƒ—レースホルダーã§ç½®ãæ›ãˆã‚‹"
+
msgid "Replace file"
msgstr "ファイルを置ãæ›ãˆ"
@@ -38504,8 +38608,8 @@ msgstr "リãƒã‚¸ãƒˆãƒªã«ã¯å°‘ãªãã¨ã‚‚ 1 ã¤ã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒå«ã¾ã‚Œã¦
msgid "Repository size is above the limit."
msgstr "リãƒã‚¸ãƒˆãƒªã®ã‚µã‚¤ã‚ºãŒåˆ¶é™ã‚’超ãˆã¦ã„ã¾ã™ã€‚"
-msgid "Repository size limit (MB)"
-msgstr "リãƒã‚¸ãƒˆãƒªã‚µã‚¤ã‚ºåˆ¶é™ (MB)"
+msgid "Repository size limit (MiB)"
+msgstr "リãƒã‚¸ãƒˆãƒªã‚µã‚¤ã‚ºåˆ¶é™(MiB)"
msgid "Repository storage"
msgstr "リãƒã‚¸ãƒˆãƒªã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸"
@@ -38633,7 +38737,7 @@ msgid_plural "Requires %{count} approvals from %{names}."
msgstr[0] "%{names}ã‹ã‚‰ã€%{count}件ã®æ‰¿èªãŒå¿…è¦ã§ã™ã€‚"
msgid "Requires a verified GitLab email address."
-msgstr ""
+msgstr "確èªæ¸ˆã¿ã®GitLabメールアドレスãŒå¿…è¦ã§ã™ã€‚"
msgid "Requires you to deploy or set up cloud-hosted Sentry."
msgstr "クラウド型ã®Sentryをデプロイã¾ãŸã¯è¨­å®šã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
@@ -38877,9 +38981,6 @@ msgid "Reviewer"
msgid_plural "%d Reviewers"
msgstr[0] "%d レビューア"
-msgid "Reviewer(s)"
-msgstr "レビューアー"
-
msgid "Reviewers"
msgstr "レビュー担当者"
@@ -38925,12 +39026,21 @@ msgstr "ロードマップ表示"
msgid "Role"
msgstr "役割"
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr "ロールãƒãƒƒã‚¯"
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr "GitLab.com 内ã§ã®ç„¡æ–™ãƒ¦ãƒ¼ã‚¶ãƒ¼åˆ¶é™ã®ãƒ­ãƒ¼ãƒ«ã‚¢ã‚¦ãƒˆã€‚ %{link_start}ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼%{link_end}ã«ã‚ˆã£ã¦æ‰¿èªãŒä¸Žãˆã‚‰ã‚Œã¦ã„ãªã„é™ã‚Šã€ã“れらã®å€¤ã‚’編集ã—ãªã„ã§ãã ã•ã„。"
+msgid "Root cause analysis"
+msgstr "根本原因ã®åˆ†æž"
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr "根本原因ã®åˆ†æžã¯ã€ãƒ­ã‚°ã‚’分æžã—ã¦ã€ã‚¸ãƒ§ãƒ–ãŒå¤±æ•—ã—ãŸç†ç”±ã¨ãれを修正ã™ã‚‹æ–¹æ³•ã‚’判断ã™ã‚‹æ©Ÿèƒ½ã§ã™ã€‚ ã“ã®åˆ†æžã‚’生æˆã™ã‚‹ãŸã‚ã«ã€ %{linkStart}サードパーティー㮠AI プロãƒã‚¤ãƒ€ãƒ¼%{linkEnd}ã¨ã‚ãªãŸã®ã‚¸ãƒ§ãƒ–ログã®æƒ…報を共有ã™ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚ ã“ã®åˆ†æžã‚’開始ã™ã‚‹å‰ã«ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã¾ãŸã¯ãƒ—ライãƒã‚·ãƒ¼ã«å½±éŸ¿ã‚’åŠã¼ã™å¯èƒ½æ€§ã®ã‚る情報をログã«è¨˜è¼‰ã—ãªã„ã§ãã ã•ã„。"
+
msgid "Ruby"
msgstr "Ruby"
@@ -39014,14 +39124,14 @@ msgid_plural "Runners|%d selected runners deleted"
msgstr[0] "é¸æŠžã—ãŸ%d 件ã®RunnerãŒå‰Šé™¤ã•ã‚Œã¾ã—ãŸ"
msgid "Runners|%{count} runners in this group"
-msgstr "ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã¯%{count} 件ã®ãƒ©ãƒ³ãƒŠãƒ¼ãŒã‚ã‚Šã¾ã™"
+msgstr "ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã¯%{count}件ã®RunnerãŒã‚ã‚Šã¾ã™"
msgid "Runners|%{highlightStart}%{duration}%{highlightEnd} second"
msgid_plural "Runners|%{highlightStart}%{duration}%{highlightEnd} seconds"
msgstr[0] "%{highlightStart}%{duration}%{highlightEnd} 秒"
msgid "Runners|%{linkStart}Create a new runner%{linkEnd} to get started."
-msgstr "%{linkStart}æ–°ã—ã„Runnerを作æˆ%{linkEnd} ã—ã¦å§‹ã‚ã¾ã—ょã†ã€‚"
+msgstr "%{linkStart}æ–°ã—ã„Runnerを作æˆ%{linkEnd}ã—ã¦å§‹ã‚ã¾ã—ょã†ã€‚"
msgid "Runners|%{link_start}These runners%{link_end} are available to all groups and projects."
msgstr "%{link_start}ã“れらã®ãƒ©ãƒ³ãƒŠãƒ¼%{link_end} ã¯ã€ã™ã¹ã¦ã®ã‚°ãƒ«ãƒ¼ãƒ—ã¨ãƒ—ロジェクトã§åˆ©ç”¨ã§ãã¾ã™ã€‚"
@@ -39079,6 +39189,9 @@ msgstr "手動スケーリングã¨ã‚ªãƒ—ションã®ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒªãƒ³ã‚°ã‚’
msgid "Runners|An error has occurred fetching instructions"
msgstr "指示ã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr "Runnerã®ä½œæˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr "削除中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚一部㮠Runner ã¯å‰Šé™¤ã•ã‚Œã¦ã„ãªã„å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚"
@@ -39089,7 +39202,7 @@ msgid "Runners|An upgrade is recommended for this runner"
msgstr "ã“ã® Runner ã«ã¯ã‚¢ãƒƒãƒ—グレードをãŠå‹§ã‚ã—ã¾ã™"
msgid "Runners|Arch/Platform"
-msgstr ""
+msgstr "アーãƒ/プラットフォーム"
msgid "Runners|Architecture"
msgstr "アーキテクãƒãƒ£"
@@ -39176,7 +39289,7 @@ msgid "Runners|Create an instance runner to generate a command that registers th
msgstr "インスタンスRunner を作æˆã—ã¦ã€ã™ã¹ã¦ã®è¨­å®šã§ Runner を登録ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’生æˆã—ã¾ã™ã€‚"
msgid "Runners|Create runner"
-msgstr ""
+msgstr "ランナーを作æˆ"
msgid "Runners|Created %{timeAgo}"
msgstr "%{timeAgo} ã«ä½œæˆã•ã‚Œã¾ã—ãŸ"
@@ -39184,10 +39297,16 @@ msgstr "%{timeAgo} ã«ä½œæˆã•ã‚Œã¾ã—ãŸ"
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr "%{avatar} ㌠%{timeAgo} ã«ä½œæˆ"
+msgid "Runners|Dashboard"
+msgstr "ダッシュボード"
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] "Runner を%d 件削除"
+msgid "Runners|Delete %{count} runners?"
+msgstr "%{count}件ã®Runnerを削除ã—ã¾ã™ã‹?"
+
msgid "Runners|Delete runner"
msgstr "ランナーを削除"
@@ -39248,9 +39367,6 @@ msgstr "GitLab.com ã‹ã‚‰ GitLab Runner ã®ãƒªãƒªãƒ¼ã‚¹ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãƒ‡ãƒ¼ã‚¿ã
msgid "Runners|Filter projects"
msgstr "プロジェクトã®ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼"
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr "%{linkStart}インストールã¨ç™»éŒ²ã®æ‰‹é †%{linkEnd} ã«å¾“ã£ã¦Runnerを設定ã—ã¾ã™ã€‚"
-
msgid "Runners|Get started with runners"
msgstr "Runners を始ã‚ã¾ã—ょã†"
@@ -39423,6 +39539,10 @@ msgid "Runners|Permanently delete %d runner"
msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] "%d 件ã®Runnerを完全ã«å‰Šé™¤"
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] "%d件ã®ãƒ©ãƒ³ãƒŠãƒ¼ã‚’永久ã«å‰Šé™¤"
+
msgid "Runners|Platform"
msgstr "プラットフォーム"
@@ -39574,10 +39694,10 @@ msgid "Runners|Runners are either:"
msgstr "Runnerã¯ãã®ã„ãšã‚Œã‹ã§ã™:"
msgid "Runners|Runners are grouped when they have the same authentication token. This happens when you re-use a runner configuration in more than one runner manager. %{linkStart}How does this work?%{linkEnd}"
-msgstr ""
+msgstr "åŒã˜èªè¨¼ãƒˆãƒ¼ã‚¯ãƒ³ã‚’æŒã£ã¦ã„るランナーã¯ã‚°ãƒ«ãƒ¼ãƒ—化ã•ã‚Œã¾ã™ã€‚ã“ã‚Œã¯ã€è¤‡æ•°ã®ãƒ©ãƒ³ãƒŠãƒ¼ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã§ãƒ©ãƒ³ãƒŠãƒ¼è¨­å®šã‚’å†åˆ©ç”¨ã™ã‚‹ã¨ç™ºç”Ÿã—ã¾ã™ã€‚%{linkStart}ã“ã‚Œã¯ã©ã®ã‚ˆã†ã«æ©Ÿèƒ½ã™ã‚‹ã®ã§ã™ã‹ï¼Ÿ%{linkEnd}"
msgid "Runners|Runners are the agents that run your CI/CD jobs."
-msgstr "Runnersã¯CI/CD ジョブを実行ã™ã‚‹ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã§ã™ã€‚"
+msgstr "Runnersã¯CI/CDジョブを実行ã™ã‚‹ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã§ã™ã€‚"
msgid "Runners|Runners performance"
msgstr "Runnersã®ãƒ‘フォーマンス"
@@ -39649,7 +39769,7 @@ msgid "Runners|Step 3 (optional)"
msgstr "ステップ 3 (オプション)"
msgid "Runners|Still using registration tokens?"
-msgstr "登録トークンを使ã„ã¾ã™ã‹?"
+msgstr "登録トークンをã¾ã ä½¿ç”¨ã—ã¦ã„ã¾ã™ã‹?"
msgid "Runners|Stop the runner from accepting new jobs."
msgstr "Runner ã¯æ–°ã—ã„ジョブをå—ã‘付ã‘ã‚’åœæ­¢ã—ã¾ã™ã€‚"
@@ -39658,7 +39778,7 @@ msgid "Runners|Support for registration tokens is deprecated"
msgstr "登録トークンã®ã‚µãƒãƒ¼ãƒˆã¯éžæŽ¨å¥¨ã§ã™"
msgid "Runners|System ID"
-msgstr ""
+msgstr "システムID"
msgid "Runners|Tags"
msgstr "Tags"
@@ -39676,10 +39796,11 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr "Runner ãŒç™»éŒ²ã•ã‚ŒãŸãƒ—ロジェクトã€ã‚°ãƒ«ãƒ¼ãƒ—ã€ã¾ãŸã¯ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã€‚インスタンスã®Runner ã¯å¸¸ã«ç®¡ç†è€…ãŒæ‰€æœ‰ã—ã¾ã™ã€‚"
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 "ã“ã® runner ã¯å®Œå…¨ã«å‰Šé™¤ã•ã‚Œã€ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹å†…ã®ãƒ—ロジェクトやグループã§ã¯ä½¿ç”¨ã§ããªããªã‚Šã¾ã™ã€‚続行ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
+msgid_plural "Runners|%d 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] "%d件ã®ãƒ©ãƒ³ãƒŠãƒ¼ãŒæ°¸ä¹…ã«å‰Šé™¤ã•ã‚Œã€ã“ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã®ãƒ—ロジェクトやグループã§ã¯åˆ©ç”¨ã§ããªããªã‚Šã¾ã™ã€‚本当ã«ç¶šã‘ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹?"
msgid "Runners|The unique ID for each runner that uses this configuration."
-msgstr ""
+msgstr "ã“ã®è¨­å®šã‚’使用ã™ã‚‹ãƒ©ãƒ³ãƒŠãƒ¼ã”ã¨ã®ä¸€æ„ã®ID。"
msgid "Runners|These runners are assigned to this project."
msgstr "ã“れらã®ãƒ©ãƒ³ãƒŠãƒ¼ã¯ã“ã®ãƒ—ロジェクトã«å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ã¾ã™ã€‚"
@@ -39994,29 +40115,53 @@ msgstr "ä¿å­˜ä¸­"
msgid "Saving project."
msgstr "プロジェクトをä¿å­˜"
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
-msgstr "%{period}%{days} %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr "%{hostname}ã®ã‚¿ã‚¤ãƒ ã‚¾ãƒ¼ãƒ³"
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
-msgstr ""
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
+msgstr "%{time}%{timezoneLabel}%{timezone}ã«ãŠã‘ã‚‹%{period}%{days}"
+
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
+msgstr "%{scopes}%{branches}%{agents}%{namespaces}%{period}ã«ãŠã‘ã‚‹%{rules}アクション"
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
-msgstr ""
+msgstr "%{rules}ã®æ¡ä»¶: 次ã§ãƒ‘イプランを実行ã™ã‚‹ãŸã³: %{scopes}%{branches}%{agents} %{namespaces}"
msgid "ScanExecutionPolicy|Add condition"
msgstr "æ¡ä»¶ã‚’追加"
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr "æ–°ã—ã„CI変数を追加"
+
msgid "ScanExecutionPolicy|Conditions"
msgstr "æ¡ä»¶"
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr "カスタマイズã—ãŸCI変数:"
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr "カスタマイズã—ãŸå¤‰æ•°ã¯ã€ãƒ—ロジェクト CI/CD ファイルã¨è¨­å®šã§å®šç¾©ã•ã‚ŒãŸå¤‰æ•°ã‚’上書ãã—ã¾ã™"
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr "フィールドãŒç©ºã®å ´åˆã€Runner ã¯è‡ªå‹•çš„ã«é¸æŠžã•ã‚Œã¾ã™"
+msgid "ScanExecutionPolicy|Key"
+msgstr "キー"
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr "Kubernetesエージェントã®ã‚¿ã‚¤ãƒ ã‚¾ãƒ¼ãƒ³"
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr "CI基準ã®æœ€å¤§æ•°ã¯1ã¤ã§ã™"
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr "ScanExecutionPolicy|一度ã«è¿½åŠ ã§ãる変数㯠1 ã¤ã ã‘ã§ã™ã€‚"
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
-msgstr "Runner 㧠%{scan} スキャンを実行ã™ã‚‹ %{tags}"
+msgstr "%{tags}Runnerã§%{scan}スキャンを実行"
msgid "ScanExecutionPolicy|Run a %{scan} scan with %{dastProfiles} on runner that %{tags}"
-msgstr "%{tags}ã® Runner 㧠%{dastProfiles} ã‚ã‚Šã®%{scan} スキャンを実行ã™ã‚‹"
+msgstr "%{tags}Runnerã§%{dastProfiles}ã‚ã‚Šã®%{scan}スキャンを実行"
msgid "ScanExecutionPolicy|Scanner profile"
msgstr "スキャナプロフィール"
@@ -40025,11 +40170,14 @@ msgid "ScanExecutionPolicy|Schedule rule component"
msgstr "スケジュールルール コンãƒãƒ¼ãƒãƒ³ãƒˆ"
msgid "ScanExecutionPolicy|Schedules:"
-msgstr ""
+msgstr "スケジュール:"
msgid "ScanExecutionPolicy|Select a scanner"
msgstr "スキャナーをé¸æŠž"
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr "変数をé¸æŠž"
+
msgid "ScanExecutionPolicy|Select agent"
msgstr "エージェントをé¸æŠž"
@@ -40045,6 +40193,9 @@ msgstr "スキャナプロファイルをé¸æŠž"
msgid "ScanExecutionPolicy|Select site profile"
msgstr "サイトプロファイルをé¸æŠž"
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr "タイムゾーンをé¸æŠž"
+
msgid "ScanExecutionPolicy|Site profile"
msgstr "サイトプロファイル"
@@ -40052,7 +40203,10 @@ msgid "ScanExecutionPolicy|Tags"
msgstr "ã‚¿ã‚°"
msgid "ScanExecutionPolicy|Triggers:"
-msgstr ""
+msgstr "トリガー:"
+
+msgid "ScanExecutionPolicy|Value"
+msgstr "値"
msgid "ScanExecutionPolicy|agent"
msgstr "エージェント"
@@ -40066,6 +40220,12 @@ msgstr "特定ã®ã‚¿ã‚°ãŒã‚ã‚Šã¾ã™"
msgid "ScanExecutionPolicy|in namespaces"
msgstr "åå‰ç©ºé–“内"
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr "%{hostname}上"
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr "Kubernetesエージェントã®ãƒãƒƒãƒ‰ä¸Š"
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr "スキャナプロファイル %{scannerProfile} ã¨ã‚µã‚¤ãƒˆãƒ—ロファイル %{siteProfile}"
@@ -40087,8 +40247,11 @@ msgstr "基準ã®ç¨®é¡žã‚’é¸æŠž"
msgid "ScanResultPolicy|Clear all"
msgstr "ã™ã¹ã¦ã‚¯ãƒªã‚¢"
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr "カスタマイズã—ãŸCI変数"
+
msgid "ScanResultPolicy|Except"
-msgstr "例外"
+msgstr "次を除ã"
msgid "ScanResultPolicy|License is:"
msgstr "ライセンス:"
@@ -40097,7 +40260,7 @@ msgid "ScanResultPolicy|License scanning allows only one criteria: Status"
msgstr "ライセンススキャンã¯1ã¤ã®åŸºæº–ã®ã¿ã‚’許å¯ã—ã¾ã™: ステータス"
msgid "ScanResultPolicy|Matching"
-msgstr "マッãƒ"
+msgstr "一致"
msgid "ScanResultPolicy|Maximum number of severity-criteria is one"
msgstr "ScanResultPolicy|é‡è¦åº¦åŸºæº–ã®æœ€å¤§æ•°ã¯ 1 ã¤ã§ã™"
@@ -40135,11 +40298,14 @@ msgstr "é‡è¦åº¦ãƒ¬ãƒ™ãƒ«:"
msgid "ScanResultPolicy|Status is:"
msgstr "状態:"
+msgid "ScanResultPolicy|Unknown"
+msgstr "ä¸æ˜Ž"
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr "%{scanType} %{scanners} ㌠%{branches} ã«å¯¾ã—ã¦å®Ÿè¡Œã•ã‚Œã€ä»¥ä¸‹ã®æ¡ä»¶ã® %{vulnerabilitiesNumber} %{boldDescription} を見ã¤ã‘ãŸã¨ã:"
msgid "ScanResultPolicy|When %{scanType} in an open merge request targeting the %{branches} and the licenses match all of the following criteria:"
-msgstr ""
+msgstr "%{branches}を対象ã¨ã™ã‚‹ã‚ªãƒ¼ãƒ—ンマージリクエスト内ã®%{scanType}ã¨ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ãŒæ¬¡ã®æ¡ä»¶ã®ã™ã¹ã¦ã«ä¸€è‡´ã™ã‚‹å ´åˆ:"
msgid "ScanResultPolicy|When %{scanners} find scanner specified conditions in an open merge request targeting the %{branches} and match %{boldDescription} of the following criteria"
msgstr "%{scanners}ã«ã‚ˆã‚Šã€%{branches}を対象ã¨ã—ãŸã‚ªãƒ¼ãƒ—ンマージリクエスト内ã§æŒ‡å®šã•ã‚ŒãŸæ¡ä»¶ã®ã‚¹ã‚­ãƒ£ãƒŠãƒ¼ãŒè¦‹ã¤ã‹ã‚Šã€ã‹ã¤æ¬¡ã®æ¡ä»¶ã®%{boldDescription}ã«ä¸€è‡´ã™ã‚‹å ´åˆ"
@@ -40566,8 +40732,8 @@ msgstr "ã‚«ãƒãƒ¬ãƒƒã‚¸ãƒã‚§ãƒƒã‚¯"
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr "ã‚«ãƒãƒ¬ãƒƒã‚¸ãƒã‚§ãƒƒã‚¯ã®è©³ç´°"
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
-msgstr "テストカãƒãƒ¬ãƒƒã‚¸ãŒæ¸›å°‘ã—ãŸãŸã‚ã€æ‰¿èªãŒå¿…è¦ã§ã™ã€‚ %{linkStart}詳ã—ãã¯ã“ã¡ã‚‰%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
+msgstr "テストカãƒãƒ¬ãƒƒã‚¸ãŒæ¸›å°‘ã—ãŸãŸã‚ã€æ‰¿èªãŒå¿…è¦ã§ã™ã€‚ %{linkStart}詳ã—ãã¯ã“ã¡ã‚‰%{linkEnd}。"
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr "%{featureName} マージリクエストã®ä½œæˆå¤‰æ›´ã«å¤±æ•—ã—ã¾ã—ãŸ"
@@ -40590,9 +40756,6 @@ msgstr "侵害ãŠã‚ˆã³æ”»æ’ƒã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ (BAS)"
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr "侵害ãŠã‚ˆã³æ”»æ’ƒã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã¯ã€æ”»æ’ƒè€…ã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ“ティーをシミュレーションã™ã‚‹ã“ã¨ã§æ—¢å­˜ã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒ†ã‚¹ãƒˆã‚’æ‹¡å¼µã™ã‚‹ã‚¤ãƒ³ã‚­ãƒ¥ãƒ™ãƒ¼ã‚·ãƒ§ãƒ³æ©Ÿèƒ½ã§ã™ã€‚"
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr "デフォルトã§ã¯ã€ãƒ—ロジェクト全体ã®ã™ã¹ã¦ã®è¨€èªžã‚’ã‚«ãƒãƒ¼ã™ã‚‹ãŸã‚ã«ã™ã¹ã¦ã®ã‚¢ãƒŠãƒ©ã‚¤ã‚¶ãŒé©ç”¨ã•ã‚Œã¾ã™ã€‚ マージリクエストã§è¨€èªžãŒæ¤œå‡ºã•ã‚ŒãŸå ´åˆã«ã®ã¿å®Ÿè¡Œã—ã¾ã™ã€‚"
-
msgid "SecurityConfiguration|Configuration guide"
msgstr "設定ガイド"
@@ -40677,9 +40840,6 @@ msgstr "%{linkStart}Auto DevOps%{linkEnd} を有効ã«ã™ã‚‹ã¨ã€ã™ã¹ã¦ã®ç¶
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr "アプリケーション環境ã®ãƒ©ãƒ³ã‚¿ã‚¤ãƒ ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒ¡ãƒˆãƒªã‚¯ã‚¹"
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr "SAST 解æž"
-
msgid "SecurityConfiguration|SAST configuration"
msgstr "SAST 設定"
@@ -40717,7 +40877,7 @@ msgid "SecurityOrchestration| and "
msgstr "ãŠã‚ˆã³"
msgid "SecurityOrchestration| and all the following apply:"
-msgstr ""
+msgstr "ãŠã‚ˆã³æ¬¡ã®ã™ã¹ã¦ã‚’満ãŸã™å ´åˆ:"
msgid "SecurityOrchestration| or "
msgstr "ã¾ãŸã¯"
@@ -40744,7 +40904,7 @@ msgid "SecurityOrchestration|%{scanners}"
msgstr "%{scanners}"
msgid "SecurityOrchestration|%{state} and %{statuses}"
-msgstr ""
+msgstr "%{state}ãŠã‚ˆã³%{statuses}"
msgid "SecurityOrchestration|, and %{count} more"
msgstr "ã€ãŠã‚ˆã³ãã®ä»–%{count}件"
@@ -40789,11 +40949,14 @@ msgid "SecurityOrchestration|An error occurred while fetching the scan result po
msgstr "スキャンçµæžœãƒãƒªã‚·ãƒ¼ã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "SecurityOrchestration|And scans to be performed:"
-msgstr "ã¨å®Ÿè¡Œã•ã‚Œã‚‹ã‚¹ã‚­ãƒ£ãƒ³:"
+msgstr "ã¾ãŸã€æ¬¡ã®ã‚¹ã‚­ãƒ£ãƒ³ãŒå®Ÿè¡Œã•ã‚Œã¾ã™:"
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr "本当ã«ã“ã®ãƒãƒªã‚·ãƒ¼ã‚’削除ã—ã¾ã™ã‹ ?ã“ã®æ“作ã¯å…ƒã«æˆ»ã›ã¾ã›ã‚“。"
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr "ブランãƒã‚¿ã‚¤ãƒ—ãŒæ—¢å­˜ã®ãƒ–ランãƒã¨ä¸€è‡´ã—ã¾ã›ã‚“。"
+
msgid "SecurityOrchestration|Choose a project"
msgstr "プロジェクトをé¸æŠž"
@@ -40917,6 +41080,9 @@ msgstr "ルールãŒå®šç¾©ã•ã‚Œã¦ã„ã¾ã›ã‚“ - ãƒãƒªã‚·ãƒ¼ã¯å®Ÿè¡Œã•ã‚Œã¾
msgid "SecurityOrchestration|No tags available"
msgstr "利用å¯èƒ½ãªã‚¿ã‚°ã¯ã‚ã‚Šã¾ã›ã‚“"
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr "ãƒãƒªã‚·ãƒ¼YAMLã«å­˜åœ¨ã—ãªã„CI変数ãŒæ¤œå‡ºã•ã‚Œã¾ã—ãŸã€‚çµæžœã¨ã—ã¦ã€ãƒ«ãƒ¼ãƒ«ãƒ¢ãƒ¼ãƒ‰ãŒç„¡åŠ¹ã«ãªã‚Šã¾ã—ãŸã€‚ルールモードを有効ã«ã™ã‚‹ã«ã¯ã€ãƒãƒªã‚·ãƒ¼YAMLã‹ã‚‰å­˜åœ¨ã—ãªã„CI変数を削除ã—ã¦ãã ã•ã„。"
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr "ãƒãƒªã‚·ãƒ¼YAMLã«å­˜åœ¨ã—ãªã„DASTプロファイルãŒæ¤œå‡ºã•ã‚Œã¾ã—ãŸã€‚çµæžœã¨ã—ã¦ã€ãƒ«ãƒ¼ãƒ«ãƒ¢ãƒ¼ãƒ‰ãŒç„¡åŠ¹ã«ãªã‚Šã¾ã—ãŸã€‚ルールモードを有効ã«ã™ã‚‹ã«ã¯ã€ãƒãƒªã‚·ãƒ¼YAMLã‹ã‚‰å­˜åœ¨ã—ãªã„プロファイルを削除ã—ã¦ãã ã•ã„。"
@@ -40959,8 +41125,8 @@ msgstr "ãƒãƒªã‚·ãƒ¼ã®ã‚¿ã‚¤ãƒ—"
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr "次ã®ã„ãšã‚Œã‹ãŒç™ºç”Ÿã—ãŸå ´åˆã¯ã€%{approvals} %{plural}ã‚’%{approvers}ã«è¦æ±‚ã—ã¾ã™:"
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
-msgstr "å¿…è¦ãªæ‰¿èªæ•°ãŒé©æ ¼æ‰¿èªè€…ã®äººæ•°ã‚’超ãˆã¦ã„ã¾ã™"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
+msgstr "å¿…è¦ãªæ‰¿èªæ•°ãŒé©æ ¼ãªæ‰¿èªè€…数を超ãˆã¦ã„ã¾ã™ã€‚"
msgid "SecurityOrchestration|Roles"
msgstr "ロール"
@@ -40975,11 +41141,11 @@ msgid "SecurityOrchestration|Rules"
msgstr "ルール"
msgid "SecurityOrchestration|Run %{scannerStart}%{scanner}%{scannerEnd}"
-msgstr "%{scannerStart}%{scanner}%{scannerEnd}ã®å®Ÿè¡Œ"
+msgstr "%{scannerStart}%{scanner}%{scannerEnd}を実行"
msgid "SecurityOrchestration|Run %{scannerStart}%{scanner}%{scannerEnd} on runners with tag:"
msgid_plural "SecurityOrchestration|Run %{scannerStart}%{scanner}%{scannerEnd} on runners with the tags:"
-msgstr[0] ""
+msgstr[0] "次ã®ã‚¿ã‚°ã‚’æŒã¤ãƒ©ãƒ³ãƒŠãƒ¼ã§%{scannerStart}%{scanner}%{scannerEnd}を実行:"
msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
msgstr "メインブランãƒã«å¯¾ã—ã¦ãƒ‘イプラインãŒå®Ÿè¡Œã•ã‚ŒãŸã¨ãã«ã€ã‚¹ã‚­ãƒ£ãƒ³ãƒ—ロファイルAã¨ã‚µã‚¤ãƒˆãƒ—ロファイルAã§DASTスキャンを実行ã—ã¾ã™ã€‚"
@@ -41045,7 +41211,7 @@ msgid "SecurityOrchestration|Select users"
msgstr "ユーザーã®é¸æŠž"
msgid "SecurityOrchestration|Severity is %{severity}."
-msgstr ""
+msgstr "é‡è¦åº¦ã¯%{severity}ã§ã™ã€‚"
msgid "SecurityOrchestration|Something went wrong, unable to fetch policies"
msgstr "å•é¡ŒãŒç™ºç”Ÿã—ãŸãŸã‚ã€ãƒãƒªã‚·ãƒ¼ã‚’フェッãƒã§ãã¾ã›ã‚“"
@@ -41101,6 +41267,9 @@ 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}脆弱性レãƒãƒ¼ãƒˆã®[é‹ç”¨ä¸Šã®è„†å¼±æ€§]タブ%{linkEnd}ã§ã€ã™ã¹ã¦ã®ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã®ã‚¹ã‚­ãƒ£ãƒ³çµæžœã‚’表示ã§ãã¾ã™ã€‚"
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr "タイムゾーンãŒç„¡åŠ¹ã§ã™"
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr "検索を拡大ã™ã‚‹ã«ã¯ã€ä¸Šè¨˜ã®ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã‚’変更ã™ã‚‹ã‹ã€åˆ¥ã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒãƒªã‚·ãƒ¼ãƒ—ロジェクトをé¸æŠžã—ã¾ã™ã€‚"
@@ -41123,13 +41292,13 @@ msgid "SecurityOrchestration|View policy project"
msgstr "ãƒãƒªã‚·ãƒ¼ãƒ—ロジェクトを表示"
msgid "SecurityOrchestration|Vulnerabilities are %{vulnerabilityStates}."
-msgstr ""
+msgstr "%{vulnerabilityStates}ã®è„†å¼±æ€§ãŒã‚ã‚Šã¾ã™ã€‚"
msgid "SecurityOrchestration|When %{scanners} %{vulnerabilitiesAllowed} %{vulnerability} in an open merge request targeting %{branches}%{criteriaApply}"
-msgstr ""
+msgstr "%{scanners}ãŒ%{branches}%{criteriaApply}を対象ã¨ã™ã‚‹ã‚ªãƒ¼ãƒ—ンマージリクエスト内ã§%{vulnerability}ã‚’%{vulnerabilitiesAllowed}ã—ã€"
msgid "SecurityOrchestration|When license scanner finds any license %{matching} %{licenses}%{detection} in an open merge request targeting %{branches}."
-msgstr ""
+msgstr "ライセンススキャナーãŒ%{branches}を対象ã¨ã™ã‚‹ã‚ªãƒ¼ãƒ—ンマージリクエスト内ã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹%{matching} %{licenses}%{detection}を見ã¤ã‘ãŸå ´åˆã€‚"
msgid "SecurityOrchestration|YAML"
msgstr "YAML"
@@ -41147,7 +41316,7 @@ msgid "SecurityOrchestration|any"
msgstr "SecurityOrchestration | ä»»æ„"
msgid "SecurityOrchestration|any security scanner finds"
-msgstr ""
+msgstr "ä»»æ„ã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã‚¹ã‚­ãƒ£ãƒŠãƒ¼ãŒæ¬¡ã‚’見ã¤ã‘ãŸå ´åˆ:"
msgid "SecurityOrchestration|branch"
msgstr "ブランãƒ"
@@ -41156,7 +41325,7 @@ msgid "SecurityOrchestration|branches"
msgstr "ブランãƒ"
msgid "SecurityOrchestration|by the agent named %{agents} %{cadence}"
-msgstr ""
+msgstr "%{agents}ã¨ã„ã†åå‰ã®ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã«ã‚ˆã£ã¦%{cadence}ã§"
msgid "SecurityOrchestration|group level branch input"
msgstr "グループレベルã®ãƒ–ランãƒå…¥åŠ›"
@@ -41168,7 +41337,7 @@ msgid "SecurityOrchestration|more than %{allowed}"
msgstr "%{allowed}より多ã„"
msgid "SecurityOrchestration|on every pipeline on the %{branches}"
-msgstr ""
+msgstr "%{branches}上ã®ã™ã¹ã¦ã®ãƒ‘イプラインã§"
msgid "SecurityOrchestration|or from:"
msgstr "ã¾ãŸã¯æ¬¡ã‹ã‚‰:"
@@ -41333,7 +41502,7 @@ msgid "SecurityReports|Failed to get security report information. Please reload
msgstr "セキュリティレãƒãƒ¼ãƒˆæƒ…å ±ã®å–å¾—ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ページをå†èª­ã¿è¾¼ã¿ã™ã‚‹ã‹ã€å¾Œã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。"
msgid "SecurityReports|Failed updating vulnerabilities with the following IDs: %{ids}"
-msgstr ""
+msgstr "次ã®IDã®è„†å¼±æ€§ã®æ›´æ–°ã«å¤±æ•—ã—ã¾ã—ãŸ: %{ids}"
msgid "SecurityReports|Has issue"
msgstr "イシューã‚ã‚Š"
@@ -41494,6 +41663,9 @@ msgstr "ã“ã®ãƒ‘イプラインã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒ¬ãƒãƒ¼ãƒˆã¯%{helpPageLi
msgid "SecurityReports|There was an error adding the comment."
msgstr "コメントã®è¿½åŠ ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr "調査çµæžœã®JIRAイシューã®ä½œæˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
+
msgid "SecurityReports|There was an error creating the issue."
msgstr "イシューã®ä½œæˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -41674,7 +41846,7 @@ msgstr "イテレーションをé¸æŠž"
msgid "Select assignee"
msgstr "担当者をé¸æŠž"
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr "担当者をé¸æŠž"
msgid "Select branch"
@@ -41737,11 +41909,17 @@ msgstr "%{type} を作æˆã™ã‚‹ãƒ—ロジェクトをé¸æŠž"
msgid "Select projects"
msgstr "プロジェクトã®é¸æŠž"
+msgid "Select protected branch"
+msgstr "ä¿è­·ãƒ–ランãƒã‚’é¸æŠž"
+
+msgid "Select protected branches"
+msgstr "ä¿è­·ãƒ–ランãƒã‚’é¸æŠž"
+
msgid "Select report"
msgstr "レãƒãƒ¼ãƒˆã‚’é¸æŠž"
-msgid "Select reviewer(s)"
-msgstr "レビューアをé¸æŠž"
+msgid "Select reviewers"
+msgstr "レビュアーをé¸æŠž"
msgid "Select severity (optional)"
msgstr "é‡è¦åº¦ã‚’é¸æŠž (オプション)"
@@ -41887,6 +42065,9 @@ msgstr "サービスアカウント"
msgid "Service Account Key"
msgstr "サービスアカウントéµ"
+msgid "Service Accounts"
+msgstr "サービスアカウント"
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr "GitLab ãŒGoogle Cloud プロジェクトをデプロイã™ã‚‹ã“ã¨ã‚’許å¯ã™ã‚‹ã«ã¯ã€Service Accounts éµãŒå¿…è¦ã§ã™ã€‚"
@@ -41917,14 +42098,23 @@ msgstr "ã“ã®åå‰ç©ºé–“ã§ã‚µãƒ¼ãƒ“スアカウントを作æˆã™ã‚‹æ¨©é™ãŒ
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr "サービスアカウントを作æˆã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。"
+msgid "ServiceDesk|Cannot create custom email"
+msgstr "カスタムメールを作æˆã§ãã¾ã›ã‚“"
+
msgid "ServiceDesk|Custom email address could not be verified."
-msgstr "カスタムメールアドレスã¯ç¢ºèªã§ãã¾ã›ã‚“。"
+msgstr "カスタムメールアドレスã¯æ¤œè¨¼ã§ãã¾ã›ã‚“。"
msgid "ServiceDesk|Custom email address has already been verified."
-msgstr "カスタムメールアドレスã¯ã™ã§ã«ç¢ºèªã—ã¦ã„ã¾ã™ã€‚"
+msgstr "カスタムメールアドレスを検証済ã¿ã§ã™ã€‚"
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
-msgstr "カスタムメールアドレスã®ç¢ºèªã¯ã™ã§ã«å‡¦ç†ã—ã¦ãŠã‚Šã€å¤±æ•—ã—ã¦ã„ã¾ã™ã€‚"
+msgstr "カスタムメールアドレスã®æ¤œè¨¼å‡¦ç†ã¯æ—¢ã«å®Œäº†ã—ã€å¤±æ•—ã—ã¾ã—ãŸã€‚"
+
+msgid "ServiceDesk|Custom email already exists"
+msgstr "カスタムメールã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™"
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr "カスタムメールã¯å­˜åœ¨ã—ã¦ã„ã¾ã›ã‚“。"
msgid "ServiceDesk|Enable Service Desk"
msgstr "サービスデスクを有効ã«ã™ã‚‹"
@@ -41935,6 +42125,9 @@ msgstr "インスタンスã®ã‚µãƒ¼ãƒ“スデスクã®è¨­å®šã«ã¤ã„ã¦ã¯ã€ç®¡
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr "サービスデスクã®ãƒ¡ãƒ¼ãƒ«ã‹ã‚‰ä½œæˆã•ã‚ŒãŸå•é¡Œã¯ã“ã“ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚å„コメントã¯ãƒ¡ãƒ¼ãƒ«ä¼šè©±ã®ä¸€éƒ¨ã«ãªã‚Šã¾ã™ã€‚"
+msgid "ServiceDesk|Parameters missing"
+msgstr "パラメータãŒã‚ã‚Šã¾ã›ã‚“"
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr "サービスデスクãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã›ã‚“"
@@ -41962,6 +42155,12 @@ msgstr "ユーザã¯ã“ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã«ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã§ãã¾ã™:"
msgid "ServicePing|Service ping is off"
msgstr "Service Pingã¯ç„¡åŠ¹ã§ã™"
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr "ã“ã‚Œã¯ã€ %{link_start}設定%{link_end} ã§ã„ã¤ã§ã‚‚変更ã§ãã¾ã™ã€‚"
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr "GitLabã®æ”¹å–„を支æ´ã™ã‚‹ãŸã‚ã€å®šæœŸçš„ã« %{link_start}使用状æ³æƒ…å ±%{link_end}ã‚’åŽé›†ã—ãŸã„ã¨æ€ã„ã¾ã™ã€‚"
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr "インスタンスレベルã®åˆ†æžã‚’表示ã™ã‚‹ã«ã¯ã€ç®¡ç†è€…ã« %{docLinkStart} Service ping%{docLinkEnd} をオンã«ã™ã‚‹ã‚ˆã†ä¾é ¼ã—ã¦ãã ã•ã„。"
@@ -42264,10 +42463,19 @@ msgid "Shared runners help link"
msgstr "共有Runnerã®ãƒ˜ãƒ«ãƒ—リンク"
msgid "SharedRunnersMinutesSettings|Reset compute usage"
-msgstr ""
+msgstr "コンピューティングã®ä½¿ç”¨çŠ¶æ³ã‚’リセットã™ã‚‹"
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
-msgstr ""
+msgstr "ã“ã®åå‰ç©ºé–“ã«å¯¾ã™ã‚‹ã‚³ãƒ³ãƒ”ューティングã®ä½¿ç”¨çŠ¶æ³ã‚’リセットã™ã‚‹ã¨ã€ãã®å€¤ãŒã‚¼ãƒ­ã«å¤‰ã‚ã‚Šã¾ã™ã€‚"
+
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr "git SSHæ“作ã®ãƒ¬ãƒ¼ãƒˆåˆ¶é™"
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr "リãƒã‚¸ãƒˆãƒªã”ã¨ã«ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒå®Ÿè¡Œã§ãã‚‹gitæ“作ã®æ•°ã‚’分å˜ä½ã§åˆ¶é™ã—ã¾ã™ã€‚"
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr "1分ã‚ãŸã‚Šã®gitæ“作ã®æœ€å¤§æ•°"
msgid "Shimo|Go to Shimo Workspace"
msgstr "Shimo ワークスペースã¸ç§»å‹•"
@@ -42330,7 +42538,7 @@ msgid "Show archived projects only"
msgstr "アーカイブã—ãŸãƒ—ロジェクトã®ã¿ã‚’表示"
msgid "Show changes"
-msgstr "変更点を表示"
+msgstr "変更を表示"
msgid "Show closed epics"
msgstr "クローズã—ãŸã‚¨ãƒ”ックを表示"
@@ -42353,8 +42561,8 @@ msgstr "完全ãªç”Ÿãƒ­ã‚°ã‚’表示ã™ã‚‹"
msgid "Show details"
msgstr "詳細を表示"
-msgid "Show failed jobs"
-msgstr ""
+msgid "Show failed jobs (%{count})"
+msgstr "失敗ã—ãŸã‚¸ãƒ§ãƒ–を表示 (%{count})"
msgid "Show file browser"
msgstr "ファイルブラウザを表示"
@@ -42362,9 +42570,6 @@ msgstr "ファイルブラウザを表示"
msgid "Show file contents"
msgstr "ファイルã®å†…容を表示"
-msgid "Show filters"
-msgstr "フィルターを表示"
-
msgid "Show full blame"
msgstr "Blameを完全ã«è¡¨ç¤º"
@@ -42672,8 +42877,8 @@ msgstr "サイズ"
msgid "Size Limits"
msgstr "サイズ制é™"
-msgid "Size limit per repository (MB)"
-msgstr "リãƒã‚¸ãƒˆãƒªæ¯Žã®ã‚µã‚¤ã‚ºåˆ¶é™ (MB)"
+msgid "Size limit per repository (MiB)"
+msgstr "リãƒã‚¸ãƒˆãƒªã”ã¨ã®ã‚µã‚¤ã‚ºåˆ¶é™(MiB)"
msgid "Skip to main content"
msgstr "メインコンテンツã¾ã§ã‚¹ã‚­ãƒƒãƒ—"
@@ -42897,6 +43102,9 @@ msgstr "ファイルå (例: test.rb)"
msgid "Snippets|Files"
msgstr "ファイル"
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr "スニペットã¯%{total}個ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«åˆ¶é™ã•ã‚Œã¦ã„ã¾ã™ã€‚"
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr "スニペットã«ã¯ç©ºã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’å«ã‚ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。ã™ã¹ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ä¸­èº«ãŒã‚ã‚‹ã“ã¨ã‚’確èªã™ã‚‹ã‹ã€å‰Šé™¤ã—ã¦ãã ã•ã„。"
@@ -42934,16 +43142,16 @@ msgid "Someone edited this %{issueType} at the same time you did. The descriptio
msgstr "ã‚ãªãŸã®ç·¨é›†ã¨åŒæ™‚ã«èª°ã‹ãŒã“ã® %{issueType} を編集ã—ãŸãŸã‚ã€èª¬æ˜ŽãŒæ›´æ–°ã•ã‚Œã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ç·¨é›†ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
msgid "Someone edited this %{model_name} at the same time you did. Please check out the %{link_to_model} and make sure your changes will not unintentionally remove theirs."
-msgstr "ã‚ãªãŸã¨åŒæ™‚ã«èª°ã‹ãŒã“ã®%{model_name}を編集ã—ã¾ã—ãŸã€‚%{link_to_model}ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦ã€ã‚ãªãŸãŒåŠ ãˆãŸå¤‰æ›´ã«ã‚ˆã£ã¦èª¤ã£ã¦ç›¸æ‰‹ã®å¤‰æ›´å†…容ãŒå‰Šé™¤ã•ã‚Œã¦ã„ãªã„ã‹ã©ã†ã‹ç¢ºèªã—ã¦ãã ã•ã„。"
+msgstr "ã‚ãªãŸã¨åŒæ™‚ã«èª°ã‹ãŒã“ã®%{model_name}を編集ã—ã¾ã—ãŸã€‚%{link_to_model}ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦ã€ã‚ãªãŸãŒåŠ ãˆãŸå¤‰æ›´ã«ã‚ˆã£ã¦èª¤ã£ã¦ç›¸æ‰‹ã®å¤‰æ›´å†…容ãŒå‰Šé™¤ã•ã‚Œã¦ã„ãªã„ã‹ã©ã†ã‹ã‚’確èªã—ã¦ãã ã•ã„。"
msgid "Someone edited this %{model_name} at the same time you did. Please refresh your browser and make sure your changes will not unintentionally remove theirs."
-msgstr "ã‚ãªãŸã¨åŒæ™‚ã«èª°ã‹ãŒã“ã®%{model_name}を編集ã—ã¾ã—ãŸã€‚ブラウザを更新ã—ã€ã‚ãªãŸãŒåŠ ãˆãŸå¤‰æ›´ã«ã‚ˆã£ã¦èª¤ã£ã¦ç›¸æ‰‹ã®å¤‰æ›´å†…容ãŒå‰Šé™¤ã•ã‚Œã¦ã„ãªã„ã‹ã©ã†ã‹ç¢ºèªã—ã¦ãã ã•ã„。"
+msgstr "ã‚ãªãŸã¨åŒæ™‚ã«èª°ã‹ãŒã“ã®%{model_name}を編集ã—ã¾ã—ãŸã€‚ブラウザを更新ã—ã€ã‚ãªãŸãŒåŠ ãˆãŸå¤‰æ›´ã«ã‚ˆã£ã¦èª¤ã£ã¦ç›¸æ‰‹ã®å¤‰æ›´å†…容ãŒå‰Šé™¤ã•ã‚Œã¦ã„ãªã„ã‹ã©ã†ã‹ã‚’確èªã—ã¦ãã ã•ã„。"
msgid "Someone edited this merge request at the same time you did. Please refresh the page to see changes."
msgstr "ã‚ãªãŸã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®ç·¨é›†ã¨åŒæ™‚ã«èª°ã‹ãŒç·¨é›†ã—ã¾ã—ãŸã€‚変更を確èªã™ã‚‹ã«ã¯ã€ãƒšãƒ¼ã‚¸ã‚’æ›´æ–°ã—ã¦ãã ã•ã„。"
msgid "Someone edited this milestone at the same time you did. Please refresh the page to see changes."
-msgstr ""
+msgstr "ã‚ãªãŸã¨åŒæ™‚ã«èª°ã‹ãŒã“ã®ãƒžã‚¤ãƒ«ã‚¹ãƒˆãƒ¼ãƒ³ã‚’編集ã—ã¾ã—ãŸã€‚変更点を確èªã™ã‚‹ã«ã¯ã€ãƒšãƒ¼ã‚¸ã‚’æ›´æ–°ã—ã¦ãã ã•ã„。"
msgid "Someone edited this test case at the same time you did. The description has been updated and you will need to make your changes again."
msgstr "ã‚ãªãŸã®ç·¨é›†ã¨åŒæ™‚ã«èª°ã‹ãŒã“ã®ãƒ†ã‚¹ãƒˆã‚±ãƒ¼ã‚¹ã‚’編集ã—ãŸãŸã‚ã€èª¬æ˜ŽãŒæ›´æ–°ã•ã‚Œã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ç·¨é›†ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
@@ -43351,7 +43559,7 @@ msgid "Source IP"
msgstr "ソースIP"
msgid "Source Project"
-msgstr "ソース プロジェクト"
+msgstr "ソースプロジェクト"
msgid "Source branch"
msgstr "ソースブランãƒ"
@@ -43467,6 +43675,9 @@ msgstr "スパムログã¯ãƒãƒ ã¨ã—ã¦é€ä¿¡ã•ã‚Œã¾ã—ãŸã€‚"
msgid "Specific branches"
msgstr "特定ã®ãƒ–ランãƒ"
+msgid "Specific protected branches"
+msgstr "特定ã®ä¿è­·ãƒ–ランãƒ"
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr "指定ã®URLã¯ä½¿ç”¨ã§ãã¾ã›ã‚“: \"%{reason}\""
@@ -43489,7 +43700,7 @@ msgid "Spent at can't be a future date and time."
msgstr "å°†æ¥ã®æ—¥æ™‚を日時ã¨ã—ã¦è¨­å®šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。"
msgid "Split cell"
-msgstr ""
+msgstr "セルを分割"
msgid "Squash commit message"
msgstr "コミットメッセージをスカッシュ"
@@ -43605,9 +43816,6 @@ msgstr "内部スレッドを開始"
msgid "Start merge train"
msgstr "マージトレインを開始"
-msgid "Start merge train when pipeline succeeds"
-msgstr "パイプラインãŒæˆåŠŸã—ãŸã¨ãã«ãƒžãƒ¼ã‚¸ãƒˆãƒ¬ã‚¤ãƒ³ã‚’開始"
-
msgid "Start merge train..."
msgstr "マージトレインを開始..."
@@ -43809,9 +44017,6 @@ msgstr "設定ドキュメント"
msgid "StatusPage|your status page frontend."
msgstr "ステータスページã®ãƒ•ãƒ­ãƒ³ãƒˆã‚¨ãƒ³ãƒ‰ã€‚"
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr "Prometheus を設定ã™ã‚‹äº‹ã§ã‚ãªãŸã®ç’°å¢ƒã®ãƒ‘フォーマンスã¨å¥å…¨æ€§ã®æœ€æ–°çŠ¶æ…‹ã‚’å–å¾—ã§ãã¾ã™ã€‚"
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr "%{currentStep} ステップ/ %{stepCount} ステップ"
@@ -43860,8 +44065,8 @@ msgstr "ä¸æ˜Ž"
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr "ファイルã®ä¿å­˜ã‚„作業ã®è¨ˆç”»ã€ã‚³ãƒ¼ãƒ‰ã§ã®ã‚³ãƒ©ãƒœãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãªã©ãŒã§ãã¾ã™ã€‚"
-msgid "Strikethrough"
-msgstr "å–り消ã—ç·š"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
+msgstr "å–り消ã—ç·š (%{modifierKey}%{shiftKey}X)"
msgid "Strikethrough text"
msgstr "テキストã«å–り消ã—線を引ã"
@@ -44143,7 +44348,7 @@ msgid "Successfully removed email."
msgstr "メールを削除ã—ã¾ã—ãŸã€‚"
msgid "Successfully reset compute usage for namespace."
-msgstr ""
+msgstr "åå‰ç©ºé–“ã®ã‚³ãƒ³ãƒ”ューティングã®ä½¿ç”¨çŠ¶æ³ã‚’正常ã«ãƒªã‚»ãƒƒãƒˆã—ã¾ã—ãŸã€‚"
msgid "Successfully scheduled a pipeline to run. Go to the %{pipelines_link_start}Pipelines page%{pipelines_link_end} for details."
msgstr "実行ã™ã‚‹ãƒ‘イプラインをスケジュールã—ã¾ã—ãŸã€‚ 詳ã—ãã¯%{pipelines_link_start}パイプラインページ%{pipelines_link_end}ã‚’ã”覧ãã ã•ã„。"
@@ -44170,7 +44375,7 @@ msgid "Suggest code changes which can be immediately applied in one click. Try i
msgstr "ã™ãã«é©ç”¨ã•ã‚Œã‚‹ã‚³ãƒ¼ãƒ‰å¤‰æ›´ã‚’1クリックã§æ案ã—ã¦ã¿ã‚ˆã†ï¼"
msgid "Suggest test cases"
-msgstr "テストケースã®æ案"
+msgstr "テストケースをæ案"
msgid "Suggested change"
msgstr "変更ã®æ案"
@@ -44295,6 +44500,12 @@ msgstr "概è¦/メモ"
msgid "Summary comment (optional)"
msgstr "概è¦ã‚³ãƒ¡ãƒ³ãƒˆï¼ˆã‚ªãƒ—ション)"
+msgid "Summary generated by AI"
+msgstr "AIã«ã‚ˆã£ã¦ç”Ÿæˆã•ã‚ŒãŸæ¦‚è¦"
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr "概è¦ã¯ã“ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã¸ã®æ¬¡ã®ãƒ—ッシュ時ã«ç”Ÿæˆã•ã‚Œã€ã“ã“ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚"
+
msgid "Sun"
msgstr "æ—¥"
@@ -44521,11 +44732,11 @@ msgstr "ブランãƒãƒ»ã‚¿ã‚°åˆ‡ã‚Šæ›¿ãˆ"
msgid "Switch to GitLab Next"
msgstr "GitLab Nextã«åˆ‡ã‚Šæ›¿ãˆã‚‹"
-msgid "Switch to Markdown"
-msgstr "マークダウンã«åˆ‡ã‚Šæ›¿ãˆã‚‹"
+msgid "Switch to plain text editing"
+msgstr "テキスト編集ã«åˆ‡ã‚Šæ›¿ãˆã‚‹"
-msgid "Switch to rich text"
-msgstr "リッãƒãƒ†ã‚­ã‚¹ãƒˆã«åˆ‡ã‚Šæ›¿ãˆã‚‹"
+msgid "Switch to rich text editing"
+msgstr "リッãƒãƒ†ã‚­ã‚¹ãƒˆç·¨é›†ã«åˆ‡ã‚Šæ›¿ãˆã‚‹"
msgid "Switch to the source to copy the file contents"
msgstr "ソースã«åˆ‡ã‚Šæ›¿ãˆã€ãƒ•ã‚¡ã‚¤ãƒ«ã®å†…容をコピーã—ã¾ã™"
@@ -44788,8 +44999,8 @@ msgstr "ä¿è­·"
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr "GitLab ã®ã™ã¹ã¦ã®æ©Ÿèƒ½ã‚’見ã¤ã‘ã‚‹ã«ã¯ã€ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’ã”覧ãã ã•ã„。"
-msgid "TanukiBot|Ask GitLab Chat"
-msgstr "GitLabãƒãƒ£ãƒƒãƒˆã«èžã"
+msgid "TanukiBot|Ask GitLab Duo"
+msgstr "GitLab Duoã«èžã"
msgid "TanukiBot|Ask a question about GitLab"
msgstr "GitLabã«ã¤ã„ã¦è³ªå•ã™ã‚‹"
@@ -44873,6 +45084,21 @@ msgstr "マージリクエストãŒä½œæˆã¾ãŸã¯æ›´æ–°ã•ã‚ŒãŸå¾Œã«TeamCity
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr "ブランãƒã®å‰Šé™¤ã‚’除ãã€ãƒªãƒã‚¸ãƒˆãƒªã¸ã®ãƒ—ッシュã”ã¨ã«TeamCity CIをトリガーã™ã‚‹"
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr "ç¾åœ¨ã®ãƒˆãƒ¼ã‚¯ãƒ³ã‚’使用ã™ã‚‹ã«ã¯ç©ºç™½ã®ã¾ã¾ã«ã—ã¦ãã ã•ã„。"
+
+msgid "TelegramIntegration|New token"
+msgstr "æ–°ã—ã„トークン"
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr "プロジェクトイベントã«é–¢ã™ã‚‹é€šçŸ¥ã‚’Telegramã«é€ä¿¡ã—ã¾ã™ã€‚"
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr "プロジェクトイベントã«é–¢ã™ã‚‹é€šçŸ¥ã‚’Telegramã«é€ä¿¡ã—ã¾ã™ã€‚%{docs_link}"
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr "一æ„ã®èªè¨¼ãƒˆãƒ¼ã‚¯ãƒ³ã€‚"
+
msgid "Telephone number"
msgstr "電話番å·"
@@ -45043,9 +45269,6 @@ msgstr "リソース変更 ã®å ±å‘Š : 追加数 %{addNum} ã€å¤‰æ›´æ•° %{change
msgid "Terraform|Terraform init command"
msgstr "Terraform init コマンド"
-msgid "Terraform|Terraform reports"
-msgstr "Terraformレãƒãƒ¼ãƒˆ"
-
msgid "Terraform|Terraform states"
msgstr "Terraformステータス"
@@ -45295,9 +45518,6 @@ msgstr "イシュートラッカーã¯ã€ãƒ—ロジェクトを改善ã—ãŸã‚Šè§£
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr "イシュートラッカーã¯ã€ãƒ—ロジェクトを改善ã—ãŸã‚Šè§£æ±ºã—ãŸã‚Šã™ã‚‹ãŸã‚ã«å¿…è¦ãªæƒ…報を追加ã™ã‚‹å ´æ‰€ã§ã™ã€‚ã“ã®ãƒ—ロジェクトã«ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’作æˆã™ã‚‹ãŸã‚ã«ã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ç™»éŒ²ã¾ãŸã¯ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã—ã¦ãã ã•ã„。"
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr "Prometheusサーãƒãƒ¼ã¯ã€Œæ‚ªã„リクエストã€ã¨å¿œç­”ã—ã¾ã—ãŸã€‚クエリãŒæ­£ã—ãã‚ãªãŸã®Prometheusã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 %{documentationLink}"
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr "Slack通知インテグレーションã¯éžæŽ¨å¥¨ã§ã‚ã‚Šã€ä»Šå¾Œã®ãƒªãƒªãƒ¼ã‚¹ã§å‰Šé™¤ã•ã‚Œã¾ã™ã€‚ Slack ã‹ã‚‰é€šçŸ¥ã‚’å—ã‘å–り続ã‘ã‚‹ã«ã¯ã€ä»£ã‚ã‚Šã« GitLab for Slack appを使用ã—ã¦ãã ã•ã„。 %{learn_more_link_start}詳細ã¯ã“ã¡ã‚‰ã‚’ã”覧ãã ã•ã„。%{link_end} "
@@ -45376,15 +45596,15 @@ msgstr "ç¾åœ¨ã®ã‚¤ã‚·ãƒ¥ãƒ¼"
msgid "The current user is not authorized to access the job log."
msgstr "ç¾åœ¨ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã‚¸ãƒ§ãƒ–ログã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。"
+msgid "The current user is not authorized to create the pipeline schedule"
+msgstr "ç¾åœ¨ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ãƒ‘イプラインã®ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’作æˆã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“"
+
msgid "The current user is not authorized to update the pipeline schedule"
msgstr "ç¾åœ¨ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ãƒ‘イプラインã®ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’æ›´æ–°ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“"
msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr "ã“ã®ãƒ‘イプライン内ã®ãƒ‡ãƒ¼ã‚¿ã¯å¤ã™ãŽã¦ã‚°ãƒ©ãƒ•ã¨ã—ã¦ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã§ãã¾ã›ã‚“。履歴データã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ã‚¸ãƒ§ãƒ–タブを確èªã—ã¦ãã ã•ã„。"
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
-msgstr "データソースã«ã¯æŽ¥ç¶šã§ãã¦ã„ã¾ã™ãŒã€è¡¨ç¤ºã™ã‚‹ãƒ‡ãƒ¼ã‚¿ã¯ã‚ã‚Šã¾ã›ã‚“。 %{documentationLink}"
-
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
msgstr "リリースã®æº–å‚™ãŒæ•´ã£ãŸæ—¥ä»˜ã€‚ãã‚ŒãŒæœªæ¥ã®æ—¥ä»˜ã®å ´åˆã€ %{linkStart}今後ã®ãƒªãƒªãƒ¼ã‚¹%{linkEnd} ã¨ã„ã†ãƒ©ãƒ™ãƒ«ãŒä»˜ã‘られã¦ã„ã¾ã™ã€‚"
@@ -45508,7 +45728,7 @@ msgid "The hostname of your Snowplow collector."
msgstr "Snowplow コレクターã®ãƒ›ã‚¹ãƒˆå。"
msgid "The hostname of your diagrams.net server."
-msgstr ""
+msgstr "diagrams.netサーãƒãƒ¼ã®ãƒ›ã‚¹ãƒˆå。"
msgid "The import cannot be canceled because it is %{project_status}"
msgstr "%{project_status}ã§ã‚ã‚‹ãŸã‚ã€ã“ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚’キャンセルã§ãã¾ã›ã‚“"
@@ -45576,9 +45796,15 @@ msgstr "アップロードã•ã‚ŒãŸãƒ©ã‚¤ã‚»ãƒ³ã‚¹ãŒç„¡åŠ¹ã§ã™ã€‚ã“ã®å•é¡Œ
msgid "The list creation wizard is already open"
msgstr "リスト作æˆã‚¦ã‚£ã‚¶ãƒ¼ãƒ‰ã¯æ—¢ã«é–‹ã„ã¦ã„ã¾ã™"
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr "GeoJSONファイルã®èª­ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸãŸã‚ã€ãƒžãƒƒãƒ—を表示ã§ãã¾ã›ã‚“。"
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr "ユーザーãŒå¼·åˆ¶ã•ã‚Œã‚‹å‰ã«2è¦ç´ èªè¨¼ã‚’設定ã™ã‚‹å¿…è¦ãŒã‚る最大時間。"
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr "許å¯ã•ã‚Œã‚‹æœ€å¤§ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚ºã¯ %{size} ã§ã™ã€‚"
@@ -45594,9 +45820,6 @@ msgstr "最大ファイルサイズ㯠%{size} ã§ã™ã€‚"
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr "å˜ä¸€ã®ãƒ¯ãƒ¼ã‚«ãƒ¼ãŒã‚¯ãƒªãƒ¼ãƒ³ã‚¢ãƒƒãƒ—ã™ã‚‹ã‚¿ã‚°ã®æœ€å¤§æ•°ã€‚ ã‚¿ã‚°ã®æ•°ãŒã“ã®åˆ¶é™ã®ä¸Šã«è¡Œãå ´åˆã€å‰Šé™¤ã™ã‚‹ã‚¿ã‚°ã®ãƒªã‚¹ãƒˆã¯ã“ã®ç•ªå·ã«åˆ‡ã‚Šæ¨ã¦ã‚‰ã‚Œã¾ã™ã€‚ ã“ã®åˆ¶é™ã‚’削除ã™ã‚‹ã«ã¯ã€0 ã«è¨­å®šã—ã¾ã™ã€‚"
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr "ã“ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«å¯¾ã™ã‚‹ãƒžãƒ¼ã‚¸ã®ç«¶åˆã¯ GitLab ã§ã¯è§£æ±ºã§ãã¾ã›ã‚“。ローカルã§è§£æ±ºã—ã¦ãã ã•ã„。"
@@ -45723,6 +45946,9 @@ msgstr "é¸æŠžã—ãŸç”»åƒãŒå¤§ãã™ãŽã¾ã™ã€‚"
msgid "The snippet can be accessed without any authentication."
msgstr "ã“ã®ã‚¹ãƒ‹ãƒšãƒƒãƒˆã¯èªè¨¼ç„¡ã—ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™"
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr "スニペットã¯èªè¨¼ãªã—ã§ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™ã€‚スニペットを埋ã‚込むã«ã¯ã€ãƒ—ロジェクトãŒå…¬é–‹ã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+
msgid "The snippet is visible only to me."
msgstr "スニペットã¯ç§ã ã‘ãŒè¦‹ãˆã¾ã™ã€‚"
@@ -45951,6 +46177,9 @@ msgstr "emoji ã®å–得中ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "There was a problem fetching epics."
msgstr "エピックã®å–得中ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
+msgid "There was a problem fetching failed jobs"
+msgstr "失敗ã—ãŸã‚¸ãƒ§ãƒ–ã®å–得中ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+
msgid "There was a problem fetching groups."
msgstr "グループã®å–得中ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -46161,6 +46390,9 @@ msgstr "ãƒãƒªãƒ¥ãƒ¼ã‚¹ãƒˆãƒªãƒ¼ãƒ åˆ†æžãƒ‡ãƒ¼ã‚¿ã‚’å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™º
msgid "There was an error while fetching value stream analytics duration data."
msgstr "ãƒãƒªãƒ¥ãƒ¼ã‚¹ãƒˆãƒªãƒ¼ãƒ åˆ†æžã®æœŸé–“データをå–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
+msgid "There was an error while retrying this job"
+msgstr "ã“ã®ã‚¸ãƒ§ãƒ–ã®å†è©¦è¡Œä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr "reCAPTCHA ã«ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚Šã¾ã—ãŸã€‚ reCAPTCHA ã‚’ã‚‚ã†ä¸€åº¦å®Ÿæ–½ã—ã¦ãã ã•ã„。"
@@ -46201,7 +46433,7 @@ msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_cl
msgstr "ã“ã® %{issuable} ã¯ãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚%{strong_open}プロジェクトメンãƒãƒ¼%{strong_close} ã ã‘ãŒã‚³ãƒ¡ãƒ³ãƒˆã§ãã¾ã™ã€‚"
msgid "This %{issuable} is locked. Only project members can comment."
-msgstr ""
+msgstr "ã“ã®%{issuable}ã¯ãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚プロジェクトメンãƒãƒ¼ã ã‘ãŒã‚³ãƒ¡ãƒ³ãƒˆã§ãã¾ã™ã€‚"
msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
msgstr "ã“ã®%{noteableTypeText} 㯠%{confidentialLinkStart} 秘密 %{confidentialLinkEnd} ã§ã‚り〠%{lockedLinkStart}ロック%{lockedLinkEnd}ã•ã‚Œã¦ã„ã¾ã™ã€‚"
@@ -46297,11 +46529,14 @@ msgid "This comment changed after you started editing it. Review the %{startTag}
msgstr "ã“ã®ã‚³ãƒ¡ãƒ³ãƒˆã¯ç·¨é›†ã‚’始ã‚ã¦ã‹ã‚‰å¤‰æ›´ã•ã‚Œã¦ã„ã¾ã™ã€‚情報ãŒå¤±ã‚ã‚Œã¦ã„ãªã„ã“ã¨ã‚’確èªã™ã‚‹ãŸã‚ã«ã«ã€%{startTag}æ›´æ–°ã•ã‚ŒãŸã‚³ãƒ¡ãƒ³ãƒˆ%{endTag}をレビューã—ã¦ãã ã•ã„。"
msgid "This comment was generated by AI"
-msgstr "ã“ã®ã‚³ãƒ¡ãƒ³ãƒˆã¯ AI を使用ã—ã¦ç”Ÿæˆã•ã‚Œã¾ã—ãŸ"
+msgstr "ã“ã®ã‚³ãƒ¡ãƒ³ãƒˆã¯ AIã«ã‚ˆã£ã¦ç”Ÿæˆã•ã‚Œã¾ã—ãŸ"
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 "ã“ã®ã‚³ãƒŸãƒƒãƒˆã¯ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆ %{link_to_merge_request} ã®ä¸€éƒ¨ã§ã™ã€‚ã“ã®ã‚³ãƒ¡ãƒ³ãƒˆã¯ã€ãã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§ä½œæˆã—ã¾ã™ã€‚"
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr "ã“ã®ã‚³ãƒŸãƒƒãƒˆã¯ GitLab UI ã§ä½œæˆã•ã‚Œã€GitLab 検証済ã¿ç½²åã§ç½²åã•ã‚Œã¾ã—ãŸã€‚"
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr "ã“ã®ã‚³ãƒŸãƒƒãƒˆã¯ %{strong_open}検証済ã¿%{strong_close}ã®ç½²åã§ã‚µã‚¤ãƒ³ã•ã‚Œã¦ãŠã‚Šã€ã“ã®ã‚³ãƒŸãƒƒã‚¿ãƒ¼ã®ãƒ¡ãƒ¼ãƒ«ã¯åŒã˜ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ã‚‚ã®ã§ã‚ã‚‹ã“ã¨ãŒæ¤œè¨¼ã•ã‚Œã¦ã„ã¾ã™ã€‚"
@@ -46411,7 +46646,7 @@ msgid "This feature requires local storage to be enabled"
msgstr "ã“ã®æ©Ÿèƒ½ã¯ãƒ­ãƒ¼ã‚«ãƒ«ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚’有効ã«ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"
msgid "This field is auto-calculated based on the Progress score of its direct children. You can overwrite this value but it will be replaced by the auto-calculation anytime the Progress score of its direct children is updated."
-msgstr "ã“ã®é …ç›®ã¯ã€ç›´æŽ¥ã®å­è¦ç´ ã®é€²æ—スコアã«åŸºã¥ã„ã¦è‡ªå‹•è¨ˆç®—ã•ã‚Œã¾ã™ã€‚ ã“ã®å€¤ã‚’上書ãã™ã‚‹ã“ã¨ã¯ã§ãã¾ã™ãŒã€ç›´æŽ¥ã®å­è¦ç´ ã®é€²æ—スコアãŒæ›´æ–°ã•ã‚Œã‚‹ã¨ã€è‡ªå‹•è¨ˆç®—ã«ã‚ˆã£ã¦ç½®ãæ›ãˆã‚‰ã‚Œã¾ã™ã€‚"
+msgstr "ã“ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã¯ã€ç›´æŽ¥ã®å­è¦ç´ ã®é€²æ—スコアã«åŸºã¥ã„ã¦è‡ªå‹•è¨ˆç®—ã•ã‚Œã¾ã™ã€‚ã“ã®å€¤ã‚’上書ãã™ã‚‹ã“ã¨ã¯ã§ãã¾ã™ãŒã€ç›´æŽ¥ã®å­è¦ç´ ã®é€²æ—スコアãŒæ›´æ–°ã•ã‚Œã‚‹ã¨ã€è‡ªå‹•è¨ˆç®—ã«ã‚ˆã£ã¦ç½®ãæ›ãˆã‚‰ã‚Œã¾ã™ã€‚"
msgid "This field is required"
msgstr "ã“ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã¯å¿…é ˆ"
@@ -46468,7 +46703,7 @@ msgid "This incident is already escalated with '%{escalation_policy_name}'."
msgstr "ã“ã®ã‚¤ãƒ³ã‚·ãƒ‡ãƒ³ãƒˆã¯ '%{escalation_policy_name}' ã§ã‚¨ã‚¹ã‚«ãƒ¬ãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã™ã€‚"
msgid "This instance is now read-only. Don't worry, your data is safe. To change to GitLab Free and restore write access to this instance, delete your expired license."
-msgstr ""
+msgstr "ç¾åœ¨ã“ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã¯èª­ã¿å–り専用ã§ã™ã€‚データã¯å®‰å…¨ã§ã™ã®ã§ã”安心ãã ã•ã„。GitLab Freeã«å¤‰æ›´ã—ã€ã“ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã¸ã®æ›¸ãè¾¼ã¿ã‚¢ã‚¯ã‚»ã‚¹ã‚’復元ã™ã‚‹ã«ã¯ã€æœŸé™åˆ‡ã‚Œã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã‚’削除ã—ã¦ãã ã•ã„。"
msgid "This invitation was sent to %{mail_to_invite_email}, but you are signed in as %{link_to_current_user} with email %{mail_to_current_user}."
msgstr "ã“ã®æ‹›å¾…メール㯠%{mail_to_invite_email} å®›ã«é€ä¿¡ã—ã¾ã—ãŸãŒã€ã‚ãªãŸã¯ %{link_to_current_user} ã¨ã—ã¦ãŠã‚Šã€ãã®Eメールアドレス㯠%{mail_to_current_user} ã§ã™ã€‚"
@@ -46480,7 +46715,7 @@ msgid "This is a Jira user."
msgstr "ã“れ㯠Jira ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã§ã™"
msgid "This is a child pipeline within the parent pipeline"
-msgstr ""
+msgstr "ã“ã‚Œã¯è¦ªãƒ‘イプライン内ã«ã‚ã‚‹å­ãƒ‘イプラインã§ã™"
msgid "This is a confidential %{noteableTypeText}."
msgstr "ã“れ㯠%{noteableTypeText} ã®éžå…¬é–‹æƒ…å ±ã§ã™ã€‚"
@@ -46534,7 +46769,7 @@ msgid "This issue is in a child epic of the filtered epic"
msgstr "ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã¯ã€ãƒ•ã‚£ãƒ«ã‚¿ãƒªãƒ³ã‚°ã•ã‚ŒãŸã‚¨ãƒ”ックã®å­ã‚¨ãƒ”ックã«ã‚ã‚Šã¾ã™"
msgid "This issue is locked. Only project members can comment."
-msgstr ""
+msgstr "ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã¯ãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚プロジェクトメンãƒãƒ¼ã®ã¿ãŒã‚³ãƒ¡ãƒ³ãƒˆã§ãã¾ã™ã€‚"
msgid "This job could not start because it could not retrieve the needed artifacts%{punctuation}%{invalid_dependencies}"
msgstr "å¿…è¦ãªã‚¢ãƒ¼ãƒ†ã‚£ãƒ•ã‚¡ã‚¯ãƒˆ%{punctuation}%{invalid_dependencies} ã‚’å–å¾—ã§ããªã‹ã£ãŸãŸã‚ã€ã“ã®ã‚¸ãƒ§ãƒ–を開始ã§ãã¾ã›ã‚“ã§ã—ãŸ"
@@ -46683,17 +46918,14 @@ msgstr "ã“ã®ãƒšãƒ¼ã‚¸ã¯GitLabページã§ãƒ›ã‚¹ãƒˆã•ã‚Œã¦ã„ã¾ã™ãŒã€ãƒ¦
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr "複数ã®ãƒ—ロジェクト間ã§èª­ã¿è¾¼ã¿ãŒè¨±å¯ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€ã“ã®ãƒšãƒ¼ã‚¸ã¯åˆ©ç”¨ã§ãã¾ã›ã‚“。"
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr "ã“ã®ãƒ‘イプラインã¯ã€%{b_open}Auto DevOps%{b_close}ã«ã‚ˆã£ã¦æœ‰åŠ¹åŒ–ã•ã‚ŒãŸå®šç¾©æ¸ˆã¿ã®CI/CD構æˆã‚’利用ã—ã¾ã™ã€‚"
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr "ã“ã®ãƒ‘イプラインã¯ã€ %{strongStart}Auto DevOps%{strongEnd}ã«ã‚ˆã£ã¦æœ‰åŠ¹åŒ–ã•ã‚ŒãŸå®šç¾©æ¸ˆã¿ã®CI/CD構æˆã‚’利用ã—ã¾ã™ã€‚"
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by Auto DevOps."
-msgstr ""
+msgstr "ã“ã®ãƒ‘イプラインã¯ã€Auto DevOpsã«ã‚ˆã£ã¦æœ‰åŠ¹åŒ–ã•ã‚ŒãŸå®šç¾©æ¸ˆã¿ã®CI/CD設定を利用ã—ã¾ã™ã€‚"
msgid "This pipeline was triggered by a schedule"
-msgstr ""
+msgstr "ã“ã®ãƒ‘イプラインã¯ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã«ã‚ˆã£ã¦ãƒˆãƒªã‚¬ãƒ¼ã•ã‚Œã¾ã—ãŸ"
msgid "This pipeline was triggered by a schedule."
msgstr "ã“ã®ãƒ‘イプラインã¯ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã«ã‚ˆã£ã¦ç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -46828,7 +47060,7 @@ msgid "This user is the author of this %{noteable}."
msgstr "ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã“ã® %{noteable} ã®ä½œæˆè€…ã§ã™ã€‚"
msgid "This user is the author of this %{workItemType}."
-msgstr "ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã“ã®%{workItemType}ã®ä½œæˆè€…ã§ã™ã€‚"
+msgstr "ã“ã¡ã‚‰ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã“ã®%{workItemType}ã®ä½œæˆè€…ã§ã™ã€‚"
msgid "This variable value does not meet the masking requirements."
msgstr "ã“ã®å¤‰æ•°ã®å€¤ã¯ãƒžã‚¹ã‚­ãƒ³ã‚°è¦ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。"
@@ -46857,9 +47089,6 @@ msgstr "Sidekiq ジョブ引数を圧縮ã™ã‚‹ãƒã‚¤ãƒˆå˜ä½ã®ã—ãã„値。"
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr "Sidekiq ジョブを拒å¦ã™ã‚‹ãƒã‚¤ãƒˆæ•°ã®ã—ãã„値。Sidekiq ジョブを制é™ã—ãŸããªã„å ´åˆã¯ã€ã“れを 0 ã«è¨­å®šã—ã¾ã™ã€‚"
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr "一括プッシュイベントãŒä½œæˆã•ã‚Œã‚‹1回ã®ãƒ—ッシュã§ã®å¤‰æ›´æ•°(ブランãƒã¾ãŸã¯ã‚¿ã‚°)ã®ã—ãã„値(デフォルトã¯3)。"
-
msgid "Throughput"
msgstr "スループット"
@@ -47139,6 +47368,9 @@ msgstr "ãŸã£ãŸä»Š"
msgid "Timeago|right now"
msgstr "今"
+msgid "Timeline"
+msgstr "タイムライン"
+
msgid "Timeline event added successfully."
msgstr "タイムラインイベントを正常ã«è¿½åŠ ã—ã¾ã—ãŸã€‚"
@@ -47222,14 +47454,11 @@ msgstr "タイトル:"
msgid "Titles"
msgstr "タイトル"
-msgid "Titles and Descriptions"
-msgstr "タイトルãŠã‚ˆã³èª¬æ˜Ž"
-
msgid "To"
msgstr "終了日"
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
-msgstr "ドメイン㮠%{link_to_help} ã«ã€DNSã®TXTレコードã«ä¸Šè¨˜ã®ã‚­ãƒ¼ã‚’追加ã—ã¦ãã ã•ã„。"
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
+msgstr "7日以内ã«ãƒ‰ãƒ¡ã‚¤ãƒ³ã®%{link_to_help}ã«ã¯ã€DNS設定内ã®TXTレコードã«ä¸Šè¨˜ã®ã‚­ãƒ¼ã‚’追加ã—ã¦ãã ã•ã„。"
msgid "To Do"
msgstr "To Do"
@@ -47297,6 +47526,9 @@ msgstr "%{project_link}ã«å‰Šé™¤ã®äºˆå®šãŒãªã„ã“ã¨ã‚’確èªã™ã‚‹ã«ã¯ã€
msgid "To ensure %{project_name} is unscheduled for deletion, check that activity has been logged by GitLab. For example:"
msgstr "%{project_name}ã«å‰Šé™¤ã®äºˆå®šãŒãªã„ã“ã¨ã‚’確èªã™ã‚‹ã«ã¯ã€ã‚¢ã‚¯ãƒ†ã‚£ãƒ“ティãŒGitLabã«ã‚ˆã£ã¦è¨˜éŒ²ã•ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。例:"
+msgid "To ensure no loss of access to personal content, only use this account for matters related to %{group_name}."
+msgstr "個人的ãªã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæãªã‚ã‚Œãªã„よã†ã«ã™ã‚‹ãŸã‚ã«ã€%{group_name}ã«é–¢é€£ã™ã‚‹äº‹æŸ„ã«é™ã‚Šã€ã“ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’使用ã—ã¦ãã ã•ã„。"
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr "個人的ãªã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ失を防ããŸã‚ã«ã€ã“ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯ %{group_name} ã«é–¢é€£ã™ã‚‹å•é¡Œã«ã®ã¿ä½¿ç”¨ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
@@ -47324,15 +47556,12 @@ msgstr "開始ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã®ãƒªãƒ³ã‚¯ã‚’使用ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr "GitLab Pagesã«è¡Œãã«ã¯ã€å·¦å´ã®ã‚µã‚¤ãƒ‰ãƒãƒ¼ã§ã€ %{pages_link} ã‚’é¸æŠžã—ã¾ã™ã€‚"
-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}ã§ã„ã¤ã§ã‚‚変更ã§ãã¾ã™ã€‚"
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr "SVN リãƒã‚¸ãƒˆãƒªã‚’インãƒãƒ¼ãƒˆã™ã‚‹ã«ã¯ã€%{svn_link} ã‚’ã”確èªãã ã•ã„。"
msgid "To invite more users, you can reduce the number of users in your top-level group to %{free_limit} user or less. You can also upgrade to a paid tier which do not have user limits. If you need additional time, you can start a free 30-day trial which includes unlimited users."
msgid_plural "To invite more users, you can reduce the number of users in your top-level group to %{free_limit} users or less. You can also upgrade to a paid tier which do not have user limits. If you need additional time, you can start a free 30-day trial which includes unlimited users."
-msgstr[0] ""
+msgstr[0] "より多ãã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’招待ã™ã‚‹ã«ã¯ã€ãƒˆãƒƒãƒ—レベルグループã®ãƒ¦ãƒ¼ã‚¶ãƒ¼æ•°ã‚’%{free_limit}以下ã«æ¸›ã‚‰ã—ã¾ã™ã€‚ユーザー制é™ã®ãªã„有料ランクã«ã‚¢ãƒƒãƒ—グレードã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ã•ã‚‰ã«æ™‚é–“ãŒå¿…è¦ãªå ´åˆã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼æ•°ç„¡åˆ¶é™ã®30日間ã®ç„¡æ–™ãƒˆãƒ©ã‚¤ã‚¢ãƒ«ã‚’開始ã§ãã¾ã™ã€‚"
msgid "To keep this project going, create a new issue"
msgstr "ã“ã®ãƒ—ロジェクトを継続ã™ã‚‹ãŸã‚ã«ã€æ–°ã—ã„イシューを作æˆã—ã¦ãã ã•ã„"
@@ -47374,7 +47603,7 @@ msgid "To remove the %{link_start}read-only%{link_end} state and regain write ac
msgstr "%{link_start}読ã¿å–り専用%{link_end}状態を削除ã—ã¦æ›¸ãè¾¼ã¿ã‚¢ã‚¯ã‚»ã‚¹æ¨©ã‚’å†å–å¾—ã™ã‚‹ã«ã¯ã€ãƒˆãƒƒãƒ—レベルグループã®ã‚ªãƒ¼ãƒŠãƒ¼ã«ä¾é ¼ã—ã¦ã€ãƒˆãƒƒãƒ—レベルグループã®ãƒ¦ãƒ¼ã‚¶ãƒ¼æ•°ã‚’%{free_limit}ユーザー以下ã«æ¸›ã‚‰ã™ã‹ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼æ•°ã®åˆ¶é™ã®ãªã„有料プランã«ã‚¢ãƒƒãƒ—グレードã—ã¦ãã ã•ã„。"
msgid "To remove the %{link_start}read-only%{link_end} state and regain write access, you can reduce the number of users in your top-level group to %{free_limit} users or less. You can also upgrade to a paid tier, which do not have user limits. If you need additional time, you can start a free 30-day trial which includes unlimited users. To minimize the impact to operations, for a limited time, GitLab is offering a %{promotion_link_start}one-time 70 percent discount%{link_end} off the list price at time of purchase for a new, one year subscription of GitLab Premium SaaS to %{offer_availability_link_start}qualifying top-level groups%{link_end}. The offer is valid until %{offer_date}."
-msgstr ""
+msgstr "%{link_start}読ã¿å–り専用%{link_end}状態を削除ã—ã¦æ›¸ãè¾¼ã¿ã‚¢ã‚¯ã‚»ã‚¹æ¨©ã‚’回復ã™ã‚‹ã«ã¯ã€ãƒˆãƒƒãƒ—レベルグループã®ãƒ¦ãƒ¼ã‚¶ãƒ¼æ•°ã‚’%{free_limit}以下ã«æ¸›ã‚‰ã—ã¦ãã ã•ã„。ã¾ãŸã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼æ•°ã®åˆ¶é™ã®ãªã„有料プランã«ã‚¢ãƒƒãƒ—グレードã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ã•ã‚‰ã«æ™‚é–“ãŒå¿…è¦ãªå ´åˆã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼æ•°ç„¡åˆ¶é™ã®30日間ã®ç„¡æ–™ãƒˆãƒ©ã‚¤ã‚¢ãƒ«ã‚’開始ã§ãã¾ã™ã€‚é‹ç”¨ã¸ã®å½±éŸ¿ã‚’最å°é™ã«æŠ‘ãˆã‚‹ãŸã‚ã«ã€GitLabã§ã¯æœŸé–“é™å®šã§ã€GitLab Premium SaaSã®æ–°è¦ã®1å¹´é–“ã®ã‚µãƒ–スクリプションã§ã€%{offer_availability_link_start}資格ã®ã‚るトップレベルグループ%{link_end}ã«å¯¾ã—ã¦ã€è³¼å…¥æ™‚ã®å®šä¾¡ã‹ã‚‰%{promotion_link_start}1回é™ã‚Šã®70%割引%{link_end}ã‚’æä¾›ã—ã¦ã„ ã¾ã™ã€‚ã“ã®ç‰¹å…¸ã¯%{offer_date}ã¾ã§æœ‰åŠ¹ã§ã™ã€‚"
msgid "To resolve this, try to:"
msgstr "ã“ã®å•é¡Œã‚’解決ã™ã‚‹ã«ã¯ã€æ¬¡ã‚’試ã—ã¦ãã ã•ã„:"
@@ -47397,6 +47626,9 @@ msgstr "変更ã¾ãŸã¯ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®ä½œæˆå†…容を確èªã™ã‚‹ã«
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr "Azureã€Oktaã€Oneloginã€Ping Identyã€ã¾ãŸã¯ã‚«ã‚¹ã‚¿ãƒ  SAML 2.0 プロãƒã‚¤ãƒ€ãƒ¼ãªã©ã® ID プロãƒã‚¤ãƒ€ãƒ¼ã‚’利用ã—ã¦ã€ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—ã® SAML èªè¨¼ã‚’設定ã™ã‚‹ã«ã¯:"
+msgid "To set up this feature, contact your administrator."
+msgstr "ã“ã®æ©Ÿèƒ½ã‚’設定ã™ã‚‹ã«ã¯ã€ç®¡ç†è€…ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。"
+
msgid "To set up this integration:"
msgstr "ã“ã®ã‚¤ãƒ³ãƒ†ã‚°ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’設定ã™ã‚‹ã«ã¯:"
@@ -47406,6 +47638,12 @@ 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 Enterprise Edition を引ã続ã使用ã™ã‚‹ã«ã¯ã€ %{codeOpen}.gitlab-license%{codeClose} ファイルをアップロードã™ã‚‹ã‹ã€GitLab Incã‹ã‚‰å—ã‘å–ã£ãŸãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã‚­ãƒ¼ã‚’入力ã—ã¦ãã ã•ã„。"
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr "マージリクエストã§å¤‰æ›´ã‚’é€ä¿¡ã™ã‚‹ã«ã¯ã€æ–°ã—ã„フォークを作æˆã—ã¾ã™ã€‚"
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr "マージリクエストã§å¤‰æ›´ã‚’é€ä¿¡ã™ã‚‹ã«ã¯ã€ã“れらã®ãƒ•ã‚©ãƒ¼ã‚¯ã®ã„ãšã‚Œã‹ã«åˆ‡ã‚Šæ›¿ãˆã‚‹ã‹ã€æ–°ã—ã„フォークを作æˆã—ã¾ã™ã€‚"
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr "ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’解除ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã®ãƒªãƒ³ã‚¯ã‚’ブラウザã«è²¼ã‚Šä»˜ã‘ã¦ãã ã•ã„:"
@@ -47413,7 +47651,7 @@ msgid "To update Snippets with multiple files, you must use the `files` paramete
msgstr "複数ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ã¾ãŸãŒã‚‹ã‚¹ãƒ‹ãƒšãƒƒãƒˆã‚’æ›´æ–°ã™ã‚‹ã«ã¯ã€`files`パラメータを使用ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
msgid "To use Service Desk in this project, you must %{linkStart}activate the issue tracker%{linkEnd}."
-msgstr "ã“ã®ãƒ—ロジェクトã§ã‚µãƒ¼ãƒ“スデスクを使用ã™ã‚‹ã«ã¯ã€ %{linkStart}イシュートラッカーを有効%{linkEnd}ã«ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+msgstr "ã“ã®ãƒ—ロジェクトã§ã‚µãƒ¼ãƒ“スデスクを使用ã™ã‚‹ã«ã¯ã€%{linkStart}イシュートラッカーを有効化ã™ã‚‹%{linkEnd}å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
msgid "To use the additional formats, you must start the required %{container_link_start}companion containers%{container_link_end}."
msgstr "追加フォーマットを使用ã™ã‚‹ã«ã¯ã€å¿…è¦ãª %{container_link_start}コンパニオンコンテナ%{container_link_end} ã‚’èµ·å‹•ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
@@ -47577,9 +47815,6 @@ msgstr "サイドãƒãƒ¼ã‚’切り替ãˆ"
msgid "Toggle backtrace"
msgstr "ãƒãƒƒã‚¯ãƒˆãƒ¬ãƒ¼ã‚¹ã‚’切り替ãˆ"
-msgid "Toggle collapse"
-msgstr "表示・éžè¡¨ç¤ºåˆ‡ã‚Šæ›¿ãˆ"
-
msgid "Toggle comments for this file"
msgstr "ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚³ãƒ¡ãƒ³ãƒˆã®åˆ‡ã‚Šæ›¿ãˆ"
@@ -47589,6 +47824,9 @@ msgstr "コミットã®èª¬æ˜Žã®åˆ‡ã‚Šæ›¿ãˆ"
msgid "Toggle commit list"
msgstr "コミットリストを切り替ãˆ"
+msgid "Toggle details"
+msgstr "詳細を切り替ãˆã‚‹"
+
msgid "Toggle emoji award"
msgstr "絵文字リアクションをトグル"
@@ -47637,12 +47875,6 @@ msgstr "å–り消ã•ã‚Œã‚‹ã¾ã§æœ‰åŠ¹ãªãƒˆãƒ¼ã‚¯ãƒ³"
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr "ã“ã®ãƒ‘ーソナルアクセストークンã¯ã€æ¤œå‡ºæ™‚ã«è‡ªå‹•çš„ã«å¤±åŠ¹ã—ã¾ã—ãŸã€‚ã“ã®è„†å¼±æ€§ã‚’解決済ã¿ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã™ã‚‹å‰ã«ã€èª¿æŸ»ãŠã‚ˆã³ãƒ­ãƒ¼ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ã™ã‚‹ã“ã¨ã‚’検討ã—ã¦ãã ã•ã„。"
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr "スコープã§ãƒˆãƒ¼ã‚¯ãƒ³ã«ä¸Žãˆã‚‰ã‚ŒãŸæ¨©é™ãƒ¬ãƒ™ãƒ«ã‚’設定ã—ã¾ã™ã€‚"
-
-msgid "Tokens|Select scopes"
-msgstr "スコープã®é¸æŠž"
-
msgid "Tomorrow"
msgstr "明日"
@@ -47716,6 +47948,9 @@ msgstr "トピック"
msgid "Topics could not be merged!"
msgstr "トピックをマージã§ãã¾ã›ã‚“ã§ã—ãŸï¼"
+msgid "Topics|Subscribe to the new projects feed"
+msgstr "æ–°ã—ã„プロジェクトフィードを購読ã™ã‚‹"
+
msgid "Total"
msgstr "åˆè¨ˆ"
@@ -48044,12 +48279,6 @@ msgstr "入力ã—ã¦æ¤œç´¢"
msgid "URL"
msgstr "URL"
-msgid "URL cannot be blank"
-msgstr "URLã¯ç©ºç™½ã«ã§ãã¾ã›ã‚“"
-
-msgid "URL is invalid"
-msgstr "URL ãŒç„¡åŠ¹ã§ã™"
-
msgid "URL is required"
msgstr "URLãŒå¿…è¦ã§ã™ã€‚"
@@ -48107,9 +48336,6 @@ msgstr "CPU ã®æƒ…報をåŽé›†ã§ããªã„"
msgid "Unable to collect memory info"
msgstr "メモリ情報をåŽé›†ã§ããªã„"
-msgid "Unable to connect to Prometheus server"
-msgstr "Prometheus サーãƒãƒ¼ã«æŽ¥ç¶šã§ãã¾ã›ã‚“"
-
msgid "Unable to connect to server: %{error}"
msgstr "サーãƒãƒ¼ã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸ: %{error}"
@@ -48246,7 +48472,7 @@ msgid "Unauthenticated web rate limit period in seconds"
msgstr "èªè¨¼ã•ã‚Œã¦ã„ãªã„Webレート制é™æœŸé–“(秒å˜ä½ï¼‰"
msgid "Unauthorized to access the cluster agent in this project"
-msgstr ""
+msgstr "ã“ã®ãƒ—ロジェクトã®ã‚¯ãƒ©ã‚¹ã‚¿ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“"
msgid "Unauthorized to create an environment"
msgstr "環境を作æˆã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“"
@@ -48279,7 +48505,7 @@ msgid "Unexpected error"
msgstr "予期ã—ãªã„エラー"
msgid "Unexpected error: Cannot serialize resource"
-msgstr ""
+msgstr "予期ã—ãªã„エラー:リソースをシリアライズã§ãã¾ã›ã‚“"
msgid "Unexpected scope"
msgstr "予期ã—ãªã„スコープ"
@@ -48293,9 +48519,6 @@ msgstr "残念ãªãŒã‚‰ã€GitLab ã¸ã®ãƒ¡ãƒ¼ãƒ«å‡¦ç†ã¯ã§ãã¾ã›ã‚“ã§ã—ã
msgid "Unhappy?"
msgstr "ä¸æº€ï¼Ÿ"
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr "æ—¥"
@@ -48347,8 +48570,8 @@ msgstr "リンク解除"
msgid "Unlock"
msgstr "アンロック"
-msgid "Unlock %{issuableType}"
-msgstr "%{issuableType}ã®ãƒ­ãƒƒã‚¯ã‚’解除 "
+msgid "Unlock %{issuableDisplayName}"
+msgstr "%{issuableDisplayName}ã®ãƒ­ãƒƒã‚¯ã‚’解除 "
msgid "Unlock account"
msgstr "アカウントã®ãƒ­ãƒƒã‚¯ã‚’解除"
@@ -48368,6 +48591,9 @@ msgstr "未ロック"
msgid "Unlocked the discussion."
msgstr "ディスカッションã®ãƒ­ãƒƒã‚¯ã‚’解除ã—ãŸ"
+msgid "Unlocking %{issuableDisplayName}"
+msgstr "%{issuableDisplayName}ã®ãƒ­ãƒƒã‚¯ã‚’解除中"
+
msgid "Unlocks the discussion."
msgstr "ディスカッションã®ãƒ­ãƒƒã‚¯ã‚’解除ã™ã‚‹."
@@ -48377,9 +48603,6 @@ msgstr "到é”ä¸å¯èƒ½"
msgid "Unrecognized approval status."
msgstr "承èªã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ãŒèªè­˜ã§ãã¾ã›ã‚“。"
-msgid "Unrecognized cluster type"
-msgstr "クラスタータイプをèªè­˜ã§ãã¾ã›ã‚“。"
-
msgid "Unresolve"
msgstr "未解決ã«ã™ã‚‹"
@@ -48399,7 +48622,7 @@ msgid "Unselect all"
msgstr "å…¨ã¦é¸æŠžè§£é™¤"
msgid "Unselected"
-msgstr "é¸æŠžã‚’解除"
+msgstr "é¸æŠžã‚’解除済ã¿"
msgid "Unstar"
msgstr "スターを外ã™"
@@ -48426,7 +48649,7 @@ msgid "Unsubscribes from this %{quick_action_target}."
msgstr "ã“ã®%{quick_action_target} ã‹ã‚‰é€€ä¼šã—ã¾ã™ã€‚"
msgid "Unsupported forecast type."
-msgstr ""
+msgstr "サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„予測タイプ。"
msgid "Unsupported sort value."
msgstr "サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„ソート値。"
@@ -48659,7 +48882,7 @@ msgstr "é–“ã‚‚ãªã%{storage_limit_link_start}åå‰ç©ºé–“ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸åˆ¶
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr "オーディオサンプルã€ãƒ“デオã€ãƒ‡ãƒ¼ã‚¿ã‚»ãƒƒãƒˆã€ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚¹ã€‚"
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48669,16 +48892,16 @@ msgid "UsageQuota|Code packages and container images."
msgstr "コードパッケージã¨ã‚³ãƒ³ãƒ†ãƒŠã‚¤ãƒ¡ãƒ¼ã‚¸ã€‚"
msgid "UsageQuota|Compute usage"
-msgstr ""
+msgstr "コンピューティング使用状æ³"
msgid "UsageQuota|Compute usage by month"
-msgstr ""
+msgstr "月別コンピューティング使用状æ³"
msgid "UsageQuota|Compute usage by project"
-msgstr ""
+msgstr "プロジェクト別コンピューティング使用状æ³"
msgid "UsageQuota|Compute usage since %{usageSince}"
-msgstr ""
+msgstr "%{usageSince}以é™ã®ã‚³ãƒ³ãƒ”ューティング使用状æ³"
msgid "UsageQuota|Container Registry"
msgstr "コンテナレジストリ"
@@ -48707,6 +48930,9 @@ msgstr "Dockerイメージを格ç´ã™ã‚‹ãŸã‚ã®Gitlabçµ±åˆDockerコンテナ
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr "グループ設定 &gt; 使用クォータ"
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr "%{planName}サブスクリプションã«å«ã¾ã‚Œã¦ã„ã¾ã™"
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr "アーティファクトã€ãƒªãƒã‚¸ãƒˆãƒªã€Wikiã€ãã®ä»–ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’å«ã¿ã¾ã™ã€‚"
@@ -48729,13 +48955,13 @@ msgid "UsageQuota|Month"
msgstr "月"
msgid "UsageQuota|Namespace overview"
-msgstr ""
+msgstr "åå‰ç©ºé–“ã®æ¦‚è¦"
msgid "UsageQuota|Namespace storage used"
msgstr "使用済ã¿ã®åå‰ç©ºé–“ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸"
msgid "UsageQuota|No compute usage data available."
-msgstr ""
+msgstr "利用å¯èƒ½ãªã‚³ãƒ³ãƒ”ューティング使用状æ³ãƒ‡ãƒ¼ã‚¿ãŒã‚ã‚Šã¾ã›ã‚“。"
msgid "UsageQuota|No projects to display."
msgstr "表示ã™ã‚‹ãƒ—ロジェクトãŒã‚ã‚Šã¾ã›ã‚“。"
@@ -48746,17 +48972,11 @@ msgstr "ä¿ç•™ä¸­ã®ãƒ¡ãƒ³ãƒãƒ¼"
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr "CI/CD ã§ä½œæˆã•ã‚ŒãŸãƒ‘イプラインã®ã‚¢ãƒ¼ãƒ†ã‚£ãƒ•ã‚¡ã‚¯ãƒˆã¨ã‚¸ãƒ§ãƒ–ã®ã‚¢ãƒ¼ãƒ†ã‚£ãƒ•ã‚¡ã‚¯ãƒˆã€‚"
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr "CI/CDãŒä½œæˆã—ãŸãƒ‘イプラインã®ã‚¢ãƒ¼ãƒ†ã‚£ãƒ•ã‚¡ã‚¯ãƒˆã€‚"
-
msgid "UsageQuota|Pipelines"
msgstr "パイプライン"
-msgid "UsageQuota|Purchased storage"
-msgstr "購入ã—ãŸã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸"
-
-msgid "UsageQuota|Purchased storage used"
-msgstr "使用ã•ã‚ŒãŸè³¼å…¥æ¸ˆã¿ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
+msgstr " %{planName} サブスクリプションã«å«ã‚€ãƒ—ロジェクトストレージ"
msgid "UsageQuota|Recalculate repository usage"
msgstr "リãƒã‚¸ãƒˆãƒªã®ä½¿ç”¨é‡ã‚’å†è¨ˆç®—ã™ã‚‹"
@@ -48792,7 +49012,7 @@ msgid "UsageQuota|Storage type"
msgstr "ストレージタイプ"
msgid "UsageQuota|Storage usage breakdown"
-msgstr ""
+msgstr "ストレージ使用状æ³ã®å†…訳"
msgid "UsageQuota|Storage used"
msgstr "ストレージã®ä½¿ç”¨é‡"
@@ -48815,9 +49035,15 @@ msgstr "下ã®è¡¨ã¯ %{usageSince} 以é™ã®ä½¿ç”¨çŠ¶æ³ã‚’示ã—ã¦ã„ã¾ã™"
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr "ã“ã®åå‰ç©ºé–“ã«ã¯ã€ç¾åœ¨ã®æœŸé–“ã«å…±æœ‰Runnerを使用ã—ãŸãƒ—ロジェクトãŒã‚ã‚Šã¾ã›ã‚“"
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
msgstr ""
+msgid "UsageQuota|Total purchased storage"
+msgstr "購入ã—ãŸã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸å®¹é‡ã®åˆè¨ˆ"
+
+msgid "UsageQuota|Total storage"
+msgstr "åˆè¨ˆã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸å®¹é‡"
+
msgid "UsageQuota|Transfer"
msgstr "転é€"
@@ -49111,7 +49337,7 @@ msgid "User created at"
msgstr "ユーザーãŒä½œæˆã•ã‚ŒãŸå ´æ‰€: "
msgid "User deleted own account on %{timestamp}"
-msgstr "ユーザー㌠%{timestamp} ã«è‡ªåˆ†ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’削除ã—ã¾ã—ãŸ"
+msgstr "ユーザーãŒ%{timestamp}ã«è‡ªåˆ†ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’削除ã—ã¾ã—ãŸ"
msgid "User does not have a pending request"
msgstr "ユーザーã«ä¿ç•™ä¸­ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã¯ã‚ã‚Šã¾ã›ã‚“。"
@@ -49119,8 +49345,11 @@ msgstr "ユーザーã«ä¿ç•™ä¸­ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã¯ã‚ã‚Šã¾ã›ã‚“。"
msgid "User does not have permission to create a Security Policy project."
msgstr "ユーザーã«ã¯ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒãƒªã‚·ãƒ¼ãƒ—ロジェクトを作æˆã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。"
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr "ユーザーãŒå­˜åœ¨ã—ãªã„ã‹ã€ã¾ãŸã¯åå‰ç©ºé–“ã®ã‚³ãƒŸãƒƒãƒˆãƒ¡ãƒ¼ãƒ«ã‚’変更ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。"
+
msgid "User has already been deactivated"
-msgstr "ユーザーã¯æ—¢ã«ã‚¢ã‚¯ãƒ†ã‚£ãƒ™ãƒ¼ãƒˆã‚’解除ã•ã‚Œã¦ã„ã¾ã™"
+msgstr "ユーザーã¯æ—¢ã«ç„¡åŠ¹åŒ–ã•ã‚Œã¦ã„ã¾ã™"
msgid "User identity was successfully created."
msgstr "ユーザーã®è­˜åˆ¥å­ãŒæ­£å¸¸ã«ä½œæˆã§ãã¾ã—ãŸã€‚"
@@ -49264,16 +49493,22 @@ msgid "UserProfiles|No snippets found."
msgstr "スニペットãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。"
msgid "UserProfile|%{count} %{file}"
-msgstr "UserProfile|%{count} %{file}"
+msgstr "%{count}個ã®%{file}"
msgid "UserProfile|%{id} · created %{created} by %{author}"
-msgstr "%{id} · %{created} ã« %{author} ãŒä½œæˆ"
+msgstr "%{id} · %{created}ã«%{author}ãŒä½œæˆ"
msgid "UserProfile|Activity"
msgstr "アクティビティ"
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr "アクティビティã®èª­ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ページを更新ã—ã¦ã€ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
-msgstr ""
+msgstr "フォロワーã®èª­ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ ページを更新ã—ã¦ã€ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
+
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr "次ã®èª­ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ページを更新ã—ã¦ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。"
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr "個人プロジェクトã®èª­ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ページを更新ã—ã¦ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。"
@@ -49293,6 +49528,9 @@ msgstr "貢献ã—ãŸãƒ—ロジェクト"
msgid "UserProfile|Copy user ID"
msgstr "ユーザー ID をコピー"
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr "ユーザーIDをコピー:%{id}"
+
msgid "UserProfile|Edit profile"
msgstr "プロフィールを編集"
@@ -49374,6 +49612,9 @@ msgstr "ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ä»–ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’フォローã—ã¦ã„ã¾ã›ã‚“
msgid "UserProfile|Unconfirmed user"
msgstr "未確èªãƒ¦ãƒ¼ã‚¶ãƒ¼"
+msgid "UserProfile|User ID copied to clipboard"
+msgstr "ユーザー ID をクリップボードã«ã‚³ãƒ”ーã—ã¾ã—ãŸ"
+
msgid "UserProfile|User ID: %{id}"
msgstr "ユーザー ID: %{id}"
@@ -49411,7 +49652,7 @@ msgid "UserProfile|made a private contribution"
msgstr "貢献をéžå…¬é–‹ã«ã™ã‚‹"
msgid "UserProfile|updated %{updated}"
-msgstr "%{updated} ã«æ›´æ–°"
+msgstr "%{updated}ã«æ›´æ–°"
msgid "Username"
msgstr "ユーザーå"
@@ -49570,7 +49811,7 @@ msgid "Value might contain a variable reference"
msgstr "値ã«ã¯å¤‰æ•°ã¸ã®å‚照をå«ã‚ã‚‹ã“ã¨ãŒã§ãã¾ã™"
msgid "Value must meet regular expression requirements to be masked."
-msgstr "値ã¯ãƒžã‚¹ã‚¯ã•ã‚Œã‚‹æ­£è¦è¡¨ç¾è¦ä»¶ã‚’満ãŸã—ã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+msgstr "値ãŒãƒžã‚¹ã‚¯ã•ã‚Œã‚‹ã«ã¯ã€æ­£è¦è¡¨ç¾è¦ä»¶ã‚’満ãŸã—ã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
msgid "Value stream"
msgstr "ãƒãƒªãƒ¥ãƒ¼ã‚¹ãƒˆãƒªãƒ¼ãƒ "
@@ -49623,8 +49864,8 @@ msgstr "ドキュメントã¸ç§»å‹•"
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr "時間ã®çµŒéŽã¨ã¨ã‚‚ã«ç™ºç”Ÿã™ã‚‹é«˜è„†å¼±æ€§ã€‚"
-msgid "ValueStreamAnalytics|Key metrics"
-msgstr "主è¦ãªãƒ¡ãƒˆãƒªã‚¯ã‚¹"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
+msgstr "ライフサイクルメトリクス"
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
msgstr "指定期間内ã§ã€æœ¬ç•ªç’°å¢ƒã§ã‚¤ãƒ³ã‚·ãƒ‡ãƒ³ãƒˆãŒã‚ªãƒ¼ãƒ—ンã ã£ãŸæ™‚é–“ã®ä¸­å¤®å€¤"
@@ -49648,7 +49889,7 @@ msgid "ValueStreamAnalytics|Number of commits pushed to the default branch"
msgstr "デフォルトブランãƒã¸ãƒ—ッシュã•ã‚ŒãŸã‚³ãƒŸãƒƒãƒˆã®æ•°"
msgid "ValueStreamAnalytics|Number of issues closed by month."
-msgstr ""
+msgstr "月別ã®ã‚¯ãƒ­ãƒ¼ã‚ºã—ãŸã‚¤ã‚·ãƒ¥ãƒ¼ã®æ•°"
msgid "ValueStreamAnalytics|Number of new issues created."
msgstr "æ–°è¦ã«ä½œæˆã•ã‚ŒãŸã‚¤ã‚·ãƒ¥ãƒ¼ã®æ•°"
@@ -49672,7 +49913,7 @@ msgid "ValueStreamAnalytics|Tasks by type"
msgstr "タイプ別ã®ã‚¿ã‚¹ã‚¯"
msgid "ValueStreamAnalytics|The number of merge requests merged by month."
-msgstr "月ã”ã¨ã«ãƒžãƒ¼ã‚¸ã•ã‚ŒãŸãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®æ•°"
+msgstr "月別ã®ãƒžãƒ¼ã‚¸ã•ã‚ŒãŸãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®ä»¶æ•°ã€‚"
msgid "ValueStreamAnalytics|The time it takes an organization to recover from a failure in production."
msgstr "本番環境ã®éšœå®³ç™ºç”Ÿã‹ã‚‰çµ„ç¹”ãŒå›žå¾©ã•ã›ã‚‹ã®ã«ã‹ã‹ã‚‹æ™‚間。"
@@ -49711,7 +49952,7 @@ msgid "Variable"
msgstr "変数"
msgid "Variable name '%{variable}' must not start with '%{prefix}'"
-msgstr ""
+msgstr "変数å「%{variable}ã€ã¯ã€Œ%{prefix}ã€ã§å§‹ã‚ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
msgid "Variable value will be evaluated as raw string."
msgstr "変数ã®å€¤ã¯ç”Ÿã®æ–‡å­—列ã¨ã—ã¦è©•ä¾¡ã•ã‚Œã¾ã™ã€‚"
@@ -49749,7 +49990,7 @@ msgstr "ãã‚Œã¾ã§ã¯å…±æœ‰ãƒ©ãƒ³ãƒŠãƒ¼ã‚’利用ã§ãã¾ã›ã‚“。%{validateLi
msgid "VerificationReminder|Your account has been validated"
msgstr "ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒæ¤œè¨¼ã•ã‚Œã¾ã—ãŸ"
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -49764,9 +50005,6 @@ msgstr "SAML構æˆã®ç¢ºèª"
msgid "Verify code"
msgstr "コードを確èª"
-msgid "Verify configuration"
-msgstr "設定ã®ç¢ºèª"
-
msgid "Version"
msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³"
@@ -49848,10 +50086,6 @@ msgstr "ã“ã®å¤‰æ›´å‰ã® blame を表示"
msgid "View card matches"
msgstr "一致ã—ãŸã‚«ãƒ¼ãƒ‰ã‚’表示"
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] "ãƒãƒ£ãƒ¼ãƒˆã‚’表示"
-
msgid "View dependency details for your project"
msgstr "プロジェクトä¾å­˜é–¢ä¿‚ã®è©³ç´°è¡¨ç¤º"
@@ -49877,9 +50111,6 @@ msgstr "ファイルを表示 @ "
msgid "View file @ %{commitSha}"
msgstr "@ %{commitSha} ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示"
-msgid "View full dashboard"
-msgstr "ダッシュボードã®ãƒ•ãƒ«è¡¨ç¤º"
-
msgid "View group in admin area"
msgstr "管ç†ã‚¨ãƒªã‚¢ã§ã‚°ãƒ«ãƒ¼ãƒ—を表示"
@@ -49934,9 +50165,6 @@ msgstr "オープンãªãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’表示"
msgid "View page @ "
msgstr "ページを表示 @ "
-msgid "View performance dashboard."
-msgstr "パフォーマンスダッシュボードを見る。"
-
msgid "View project in admin area"
msgstr "管ç†ã‚¨ãƒªã‚¢ã§ãƒ—ロジェクトを表示"
@@ -49953,6 +50181,9 @@ msgstr "変更後ファイルを表示 @ "
msgid "View seat usage"
msgstr "シートã®ä½¿ç”¨çŠ¶æ³ã‚’表示"
+msgid "View summary notes"
+msgstr "è¦ç´„ノートを表示"
+
msgid "View supported languages and frameworks"
msgstr "サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„る言語ã¨ãƒ•ãƒ¬ãƒ¼ãƒ ãƒ¯ãƒ¼ã‚¯ã‚’表示ã™ã‚‹"
@@ -49965,9 +50196,6 @@ msgstr "ドキュメントã®è¡¨ç¤º"
msgid "View the latest successful deployment to this environment"
msgstr "ã“ã®ç’°å¢ƒã¸ã®æœ€æ–°ã®æˆåŠŸã—ãŸãƒ‡ãƒ—ロイメントを表示ã™ã‚‹"
-msgid "View the performance dashboard at"
-msgstr "パフォーマンスダッシュボードを表示:"
-
msgid "View usage details"
msgstr "使用状æ³ã®è©³ç´°ã‚’表示"
@@ -49981,7 +50209,7 @@ msgid "Viewing commit"
msgstr "コミットを表示中"
msgid "Viewing projects data from a primary site is not possible when using a unified URL. Visit the secondary site directly. %{geo_help_url}"
-msgstr "統一ã•ã‚ŒãŸURLを使用ã—ã¦ã„ã‚‹å ´åˆã€ãƒ—ライマリサイトã‹ã‚‰ãƒ—ロジェクトデータを表示ã§ãã¾ã›ã‚“。セカンダリサイトを直接ã”覧ãã ã•ã„。%{geo_help_url}"
+msgstr "çµ±åˆURLを使用ã—ã¦ã„ã‚‹å ´åˆã€ãƒ—ライマリサイトã‹ã‚‰ãƒ—ロジェクトデータを表示ã§ãã¾ã›ã‚“。セカンダリサイトを直接ã”覧ãã ã•ã„。%{geo_help_url}"
msgid "Violation"
msgstr "é•å"
@@ -50322,6 +50550,9 @@ msgstr "コードレビュー"
msgid "Vulnerability|Comments"
msgstr "コメント"
+msgid "Vulnerability|Could not load prompt."
+msgstr "プロンプトを読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸã€‚"
+
msgid "Vulnerability|Crash address"
msgstr "クラッシュアドレス"
@@ -50376,6 +50607,9 @@ msgstr "ファイル:"
msgid "Vulnerability|GitLab Security Report"
msgstr "GitLab セキュリティレãƒãƒ¼ãƒˆ"
+msgid "Vulnerability|Hide prompt"
+msgstr "プロンプトを隠ã™"
+
msgid "Vulnerability|Identifier"
msgstr "識別å­"
@@ -50451,6 +50685,9 @@ msgstr "é‡è¦åº¦"
msgid "Vulnerability|Severity:"
msgstr "é‡è¦åº¦:"
+msgid "Vulnerability|Show prompt"
+msgstr "プロンプトを表示"
+
msgid "Vulnerability|Status"
msgstr "状態"
@@ -50508,9 +50745,6 @@ msgstr "承èªå¾…ã¡"
msgid "Waiting for merge (open and assigned)"
msgstr "マージ待㡠(オープンã•ã‚Œã€å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ã¾ã™)"
-msgid "Waiting for performance data"
-msgstr "パフォーマンスデータ待ã¡"
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr "ã“ã®ãƒ‡ãƒ¼ã‚¿ã‚’å‚ç…§ã—ãŸã„ã§ã™ã‹ï¼Ÿã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ç®¡ç†è€…ã«å•ã„åˆã‚ã›ã¦ãã ã•ã„。"
@@ -50550,9 +50784,6 @@ msgstr "%{group} グループ㫠%{term} ã«ä¸€è‡´ã™ã‚‹ %{scope} 見ã¤ã‹ã‚Šã
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr "%{project} プロジェクト㫠%{term} ã«ä¸€è‡´ã™ã‚‹ %{scope} 見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr "Prometheusサーãƒãƒ¼ã«åˆ°é”ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚サーãƒãƒ¼ãŒå­˜åœ¨ã—ãªã„ã‹ã€è¨­å®šã®è©³ç´°ã‚’æ›´æ–°ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr "%{humanized_resource_name} ã«ã‚¹ãƒ‘ムãŒã‚ã‚‹å¯èƒ½æ€§ã‚’検出ã—ã¾ã—ãŸã€‚続行ã™ã‚‹ã«ã¯ reCAPTCHA を実行ã—ã¦ãã ã•ã„。"
@@ -50571,9 +50802,6 @@ msgstr "ç§ãŸã¡ã¯ %{featureLinkStart}機能ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆ%{featureLinkEnd
msgid "We recommend a work email address."
msgstr "作業用ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚"
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr "ã™ã¹ã¦ã®SASTアナライザを有効ã«ã—ã¦ãŠãã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™"
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr "サービスã®ä¸­æ–­ã‚’é¿ã‘ã‚‹ãŸã‚ã«ã¯ã€è¿½åŠ ã®ãƒ‘イプライン分を購入ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚"
@@ -50923,7 +51151,7 @@ msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr "%{name}ã•ã‚“%{br_tag} GitLab ã¸ã‚ˆã†ã“ãï¼"
msgid "Welcome to a new navigation experience"
-msgstr "æ–°ã—ã„ナビゲーションã¸ã‚ˆã†ã“ã"
+msgstr "æ–°ã—ã„ナビゲーション体験ã¸ã‚ˆã†ã“ã"
msgid "Welcome, %{name}!"
msgstr "%{name}ã•ã‚“ã€ã‚ˆã†ã“ãï¼"
@@ -50953,7 +51181,7 @@ msgid "What is Markdown?"
msgstr "Markdownã¨ã¯"
msgid "What is a compute quota?"
-msgstr ""
+msgstr "コンピューティングクォータã¨ã¯ä½•ã§ã™ã‹?"
msgid "What is listed here?"
msgstr "ã“ã“ã«ã¯ä½•ãŒè¨˜è¼‰ã•ã‚Œã¦ã„ã¾ã™ã‹ ?"
@@ -50961,6 +51189,9 @@ msgstr "ã“ã“ã«ã¯ä½•ãŒè¨˜è¼‰ã•ã‚Œã¦ã„ã¾ã™ã‹ ?"
msgid "What is repository mirroring?"
msgstr "リãƒã‚¸ãƒˆãƒªã®ãƒŸãƒ©ãƒ¼ãƒªãƒ³ã‚°ã¨ã¯ä½•ã§ã™ã‹?"
+msgid "What is root cause analysis?"
+msgstr "根本原因ã®åˆ†æžã®ç”Ÿæˆã¨ã¯ä½•ã§ã™ã‹?"
+
msgid "What is squashing?"
msgstr "スカッシュã¨ã¯ä½•ã§ã™ã‹?"
@@ -50995,7 +51226,7 @@ msgid "When enabled, job logs are collected by Datadog and displayed along with
msgstr "有効ã«ã™ã‚‹ã¨ã€ã‚¸ãƒ§ãƒ–ログã¯ãƒ‡ãƒ¼ã‚¿ãƒ­ã‚°ã«ã‚ˆã£ã¦åŽé›†ã•ã‚Œã€ãƒ‘イプラインã®å®Ÿè¡Œãƒˆãƒ¬ãƒ¼ã‚¹ã¨ã¨ã‚‚ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚"
msgid "When left blank, default value of 365 is applied. When set, value must be 365 or less. When changed, existing access tokens with an expiration date beyond the maximum allowable lifetime are revoked."
-msgstr "空白ã®å ´åˆã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®å€¤ 365 ãŒé©ç”¨ã•ã‚Œã¾ã™ã€‚設定ã™ã‚‹å ´åˆã€å€¤ã¯365以下ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 変更ã•ã‚Œã‚‹ã¨ã€æœ‰åŠ¹æœŸé™ãŒæœ€å¤§è¨±å®¹æœŸé–“を超ãˆãŸæ—¢å­˜ã®ã‚¢ã‚¯ã‚»ã‚¹ãƒˆãƒ¼ã‚¯ãƒ³ãŒå–り消ã•ã‚Œã¾ã™ã€‚"
+msgstr "空白ã®å ´åˆã¯ã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå€¤ã€Œ365ã€ãŒé©ç”¨ã•ã‚Œã¾ã™ã€‚設定ã™ã‚‹å ´åˆã€å€¤ã¯ã€Œ365ã€ä»¥ä¸‹ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。変更ã™ã‚‹ã¨ã€æœ‰åŠ¹æœŸé™ãŒæœ€å¤§è¨±å®¹å­˜ç¶šæœŸé–“を超ãˆãŸæ—¢å­˜ã®ã‚¢ã‚¯ã‚»ã‚¹ãƒˆãƒ¼ã‚¯ãƒ³ãŒå¤±åŠ¹ã—ã¾ã™ã€‚"
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr "デフォルトã®ãƒ–ランãƒã§ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚„コミットãŒã‚¯ãƒ­ãƒ¼ã‚ºã•ã‚Œã‚‹ã¨ã€å‚ç…§ã•ã‚Œã¦ã„ã‚‹ã™ã¹ã¦ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã‚‚クローズã—ã¾ã™ã€‚"
@@ -51273,6 +51504,9 @@ msgstr "アクセスリクエストをå–り消ã™"
msgid "Won't fix / Accept risk"
msgstr "修正ã—ãªã„ / リスクをå—ã‘入れる"
+msgid "Work Item promoted successfully."
+msgstr "作業アイテムã¯æ­£å¸¸ã«æ˜‡æ ¼ã—ã¾ã—ãŸã€‚"
+
msgid "Work Item type with id %{id} was not found"
msgstr "Id %{id} ã‚’æŒã¤ä½œæ¥­ã‚¢ã‚¤ãƒ†ãƒ ã‚¿ã‚¤ãƒ—ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
@@ -51350,7 +51584,7 @@ msgid "WorkItem|Child objectives and key results"
msgstr "å­ã®ç›®æ¨™ã¨ä¸»ãªçµæžœ"
msgid "WorkItem|Child removal reverted"
-msgstr "å­ã®å‰Šé™¤ãŒæˆ»ã•ã‚Œã¾ã—ãŸ"
+msgstr "å­ã®å‰Šé™¤ãŒå–り消ã•ã‚Œã¾ã—ãŸ"
msgid "WorkItem|Child removed"
msgstr "削除ã•ã‚ŒãŸå­è¦ç´ "
@@ -51367,6 +51601,9 @@ msgstr "タスクã«å¤‰æ›"
msgid "WorkItem|Converted to task"
msgstr "タスクã«å¤‰æ›"
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr "%{workItemType}ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’コピー"
+
msgid "WorkItem|Create %{workItemType}"
msgstr "%{workItemType}を作æˆ"
@@ -51391,9 +51628,6 @@ msgstr "期é™"
msgid "WorkItem|Existing task"
msgstr "既存ã®ã‚¿ã‚¹ã‚¯"
-msgid "WorkItem|Failed to award emoji"
-msgstr "絵文字をé€ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ"
-
msgid "WorkItem|Health status"
msgstr "å¥å…¨æ€§ã®çŠ¶æ…‹"
@@ -51508,6 +51742,12 @@ msgstr "å­ã‚’追加ã™ã‚‹ã¨ãã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr "å­ã‚’作æˆã™ã‚‹ã¨ãã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr "%{workItemType}ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’コピーã™ã‚‹éš›ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr "%{workItemType}ã®å‚照をコピーã™ã‚‹éš›ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr "マイルストーンをå–å¾—ã™ã‚‹é–“ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
@@ -51586,6 +51826,9 @@ msgstr "ワークスペースã¯ã€GitLab内ã®ã‚³ãƒ¼ãƒ‰ã®ä»®æƒ³ã‚µãƒ³ãƒ‰ãƒœãƒƒ
msgid "Workspaces|Cancel"
msgstr "キャンセル"
+msgid "Workspaces|Could not load workspaces"
+msgstr "ワークスペースをロードã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr "ã“ã®ãƒ—ロジェクトã®ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ"
@@ -51677,11 +51920,14 @@ msgid "Workspaces|Workspaces"
msgstr "ワークスペース"
msgid "Workspaces|You can create a workspace for public projects only."
-msgstr "公開ã®ãƒ—ロジェクト用ã®ãƒ¯ãƒ¼ã‚¯ã‚¹ãƒšãƒ¼ã‚¹ã‚’作æˆã§ãã¾ã™ã€‚"
+msgstr "公開プロジェクト用ã®ãƒ¯ãƒ¼ã‚¯ã‚¹ãƒšãƒ¼ã‚¹ã®ã¿ä½œæˆã§ãã¾ã™ã€‚"
msgid "Workspaces|You can't create a workspace for this project"
msgstr "ã“ã®ãƒ—ロジェクト用ã®ãƒ¯ãƒ¼ã‚¯ã‚¹ãƒšãƒ¼ã‚¹ã‚’作æˆã§ãã¾ã™ã€‚"
+msgid "Workspaces|Your workspaces"
+msgstr "ã‚ãªãŸã®ãƒ¯ãƒ¼ã‚¯ã‚¹ãƒšãƒ¼ã‚¹"
+
msgid "Would you like to create a new branch?"
msgstr "æ–°ã—ã„ブランãƒã‚’作æˆã—ã¾ã™ã‹?"
@@ -51791,9 +52037,6 @@ msgstr "GitLabã‹ã‚‰ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã•ã‚Œã¦ã„ã¾ã™"
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr "ã“ã®æ•°ã‚’超ãˆã‚‹ã¨æœ‰æ–™ã«ãªã‚Šã¾ã™ã€‚%{qsrOverageLinkStart}請求ã®ä»•çµ„ã¿ã¯ã©ã†ãªã£ã¦ã„ã¾ã™ã‹?%{qsrOverageLinkEnd}"
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr "Prometheusサーãƒãƒ¼ã«æŽ¥ç¶šã§ãã¾ã—ãŸãŒã€ç¾åœ¨è¡¨ç¤ºã§ãるデータã¯ã‚ã‚Šã¾ã›ã‚“。"
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr "ç¾åœ¨ã‚ªãƒ•ãƒ©ã‚¤ãƒ³ã§ã‚ã‚‹ã‹ã€GitLabインスタンスã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“。"
@@ -52082,6 +52325,9 @@ msgstr "読ã¿å–り専用ã®ã‚»ã‚«ãƒ³ãƒ€ãƒª GitLab Geo インスタンスã«æ›¸
msgid "You cannot write to this read-only GitLab instance."
msgstr "ã“ã®èª­ã¿å–り専用 GitLab インスタンスã«ã¯æ›¸ã込むã“ã¨ãŒã§ãã¾ã›ã‚“。"
+msgid "You can’t edit files directly in this project."
+msgstr "ã“ã®ãƒ—ロジェクトã§ã¯ãƒ•ã‚¡ã‚¤ãƒ«ã‚’直接編集ã§ãã¾ã›ã‚“。"
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr "ã“ã®ãƒ—ロジェクトã§ãƒ•ã‚¡ã‚¤ãƒ«ã‚’直接編集 ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。ã“ã®ãƒ—ロジェクトをフォークã—ã¦ã€å¤‰æ›´ã‚’マージリクエストã«ã—ã¦é€ä¿¡ã—ã¦ãã ã•ã„。"
@@ -52098,7 +52344,7 @@ msgid "You do not have any subscriptions yet"
msgstr "ã‚ãªãŸã«ã¯ã‚µãƒ–スクリプションãŒã‚ã‚Šã¾ã›ã‚“"
msgid "You do not have permission to access DORA4 metrics."
-msgstr "DORA4 メトリクスã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。"
+msgstr "DORA4メトリクスã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。"
msgid "You do not have permission to access dora metrics."
msgstr "DORAメトリックスã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。"
@@ -52475,7 +52721,7 @@ msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change
msgstr "ã‚ãªãŸã® %{spammable_entity_type} ã¯ã‚¹ãƒ‘ムã¨ã—ã¦èªè­˜ã•ã‚Œã¾ã—ãŸã€‚コンテンツを変更ã™ã‚‹ã‹ã€reCAPTCHA を解ã„ã¦ç¶šè¡Œã—ã¦ãã ã•ã„。"
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content to proceed."
-msgstr ""
+msgstr "ã‚ãªãŸã®%{spammable_entity_type}ã¯ã‚¹ãƒ‘ムã¨ã—ã¦èªè­˜ã•ã‚Œã¾ã—ãŸã€‚コンテンツを変更ã—ã¦ç¶šè¡Œã—ã¦ãã ã•ã„。"
msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr "%{strong}%{namespace_name}%{strong_close} ã® %{strong}%{plan_name}%{strong_close} サブスクリプション㯠%{strong}%{expires_on}%{strong_close} ã«å¤±åŠ¹ã—ã¾ã™ã€‚"
@@ -52519,6 +52765,12 @@ msgstr "GitLab Ultimate ã®ç„¡æ–™è©¦ç”¨æœŸé–“㯠30 日間ã§ã™ã€‚ ã“ã®æœŸé–“
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 "GitLab アカウントã¯ã€è©¦è¡Œä¸­ã®ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã«å¤±æ•—ã—ãŸãŸã‚ロックã•ã‚Œã¦ã„ã¾ã™ã€‚ ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯ %{duration} 後ã«è‡ªå‹•çš„ã«ãƒ­ãƒƒã‚¯ãŒè§£é™¤ã•ã‚Œã¾ã™ã€‚ã“れを待ã¤ã‹ã€ä¸‹ã®ãƒªãƒ³ã‚¯ã‚’クリックã—ã¦ãƒ­ãƒƒã‚¯ã‚’解除ã—ã¦ãã ã•ã„。"
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr "GitLabアカウントã¯%{source_link}ã«ãªã‚Šã¾ã—ãŸ:"
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr "GitLabアカウントãŒã‚¨ãƒ³ã‚¿ãƒ¼ãƒ—ライズユーザー(%{source_link})ã«ãªã‚Šã¾ã—ãŸ:"
+
msgid "Your GitLab account request has been approved!"
msgstr "GitLab アカウントã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒæ‰¿èªã•ã‚Œã¾ã—ãŸï¼"
@@ -52570,6 +52822,12 @@ msgstr "ã‚ãªãŸã® WebAuthn デãƒã‚¤ã‚¹ãŒç™»éŒ²ã•ã‚Œã¾ã—ãŸã€‚"
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr "%{source_type} ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹è¦æ±‚ã¯å–り消ã•ã‚Œã¾ã—ãŸã€‚"
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr "ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯ãƒ–ロックã•ã‚Œã¾ã—ãŸã€‚サãƒãƒ¼ãƒˆãŒå¿…è¦ãªå ´åˆã¯ã€%{support}ã«ã”連絡ãã ã•ã„。"
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr "ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯ãƒ–ロックã•ã‚Œã¾ã—ãŸã€‚サãƒãƒ¼ãƒˆãŒå¿…è¦ãªå ´åˆã¯ã€GitLabã®ç®¡ç†è€…ã«ã”連絡ãã ã•ã„。"
+
msgid "Your account has been deactivated"
msgstr "アカウントãŒç„¡åŠ¹ã«ãªã‚Šã¾ã—ãŸ"
@@ -52630,8 +52888,8 @@ msgstr "%{reason}ã¨ã„ã†ç†ç”±ã§ã‚³ãƒ¡ãƒ³ãƒˆã‚’é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr "ã‚ãªãŸã®ã‚³ãƒ¡ãƒ³ãƒˆã¯é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æŽ¥ç¶šã‚’確èªã—ã¦ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
-msgid "Your comment could not be updated! Please check your network connection and try again."
-msgstr "ã‚ãªãŸã®ã‚³ãƒ¡ãƒ³ãƒˆã¯æ›´æ–°ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æŽ¥ç¶šã‚’確èªã—ã¦ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
+msgid "Your comment could not be updated because %{reason}."
+msgstr "%{reason}ã¨ã„ã†ç†ç”±ã§ã‚³ãƒ¡ãƒ³ãƒˆã‚’æ›´æ–°ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
msgid "Your comment will be discarded."
msgstr "コメントã¯ç ´æ£„ã•ã‚Œã¾ã™ã€‚"
@@ -52667,7 +52925,7 @@ msgid "Your device was successfully set up! Give it a name and register it with
msgstr "ã‚ãªãŸã®ãƒ‡ãƒã‚¤ã‚¹ã¯æ­£å¸¸ã«è¨­å®šã•ã‚Œã¾ã—ãŸã€‚åå‰ã‚’付ã‘ã¦GitLabサーãƒãƒ¼ã«ç™»éŒ²ã—ã¾ã™ã€‚"
msgid "Your feedback is important to us 👋"
-msgstr "ã”æ„見・ã”感想をå‚考ã«ã•ã›ã¦ã„ãŸã ãã¾ã™ðŸ‘‹"
+msgstr "皆様ã®ãƒ•ã‚£ãƒ¼ãƒ‰ãƒãƒƒã‚¯ã¯ã€ç§ãŸã¡ã«ã¨ã£ã¦å¤§å¤‰è²´é‡ãªã‚‚ã®ã§ã™ðŸ‘‹"
msgid "Your file must contain a column named %{codeStart}title%{codeEnd}. A %{codeStart}description%{codeEnd} column is optional. The maximum file size allowed is 10 MB."
msgstr "ã‚ãªãŸã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ã¯ã€%{codeStart}title%{codeEnd}ã¨ã„ã†åå‰ã®ã‚«ãƒ©ãƒ ãŒå¿…è¦ã§ã™ã€‚%{codeStart}description%{codeEnd}カラムã¯ã‚ªãƒ—ションã§ã™ã€‚ファイルã®æœ€å¤§ã‚µã‚¤ã‚ºã¯ 10 MBã§ã™ã€‚"
@@ -52788,12 +53046,15 @@ msgstr "トップレベルグループ%{namespace_name}ã¯%{free_limit}ã®ãƒ¦ãƒ¼
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr "トップレベルグループ %{namespace_name} ã¯ã™ãã«èª­ã¿å–り専用ã®çŠ¶æ…‹ã«ç§»å‹•ã—ã¾ã™"
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
-msgstr "トップレベルグループã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼åˆ¶é™ã¨ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸åˆ¶é™ã‚’超ãˆãŸãŸã‚ã€èª­ã¿å–り専用状態ã«ãªã£ã¦ã„ã¾ã™ã€‚"
-
msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr "トップレベルグループã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼åˆ¶é™ã‚’超ãˆãŸãŸã‚ã€èª­ã¿å–り専用状態ã«ãªã£ã¦ã„ã¾ã™ã€‚"
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr "最上ä½ã‚°ãƒ«ãƒ¼ãƒ—ã®%{group_name}ã«ã¯%{free_users_limit}人以上ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒã„ã¦ã€%{free_storage_limit}以上ã®ãƒ‡ãƒ¼ã‚¿ã‚’使用ã—ã¦ã„ã¾ã™ã€‚Freeã®æœ€ä¸Šä½ã‚°ãƒ«ãƒ¼ãƒ—ã«ä½¿ç”¨åˆ¶é™ãŒé©ç”¨ã•ã‚Œã‚‹ã¨ã€ã‚°ãƒ«ãƒ¼ãƒ—内ã®ãƒ—ロジェクトã¯%{read_only_link_start}読ã¿å–り専用%{link_end}ã«ãªã‚Šã¾ã™ã€‚グループãŒèª­ã¿å–り専用ã«ãªã‚‰ãªã„よã†ã«ã™ã‚‹ã«ã¯ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚ªãƒ¼ãƒŠãƒ¼ãƒ­ãƒ¼ãƒ«ã‚’æŒã¤ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«é€£çµ¡ã—ã¦ã€æœ‰æ–™ãƒ—ランã«ã‚¢ãƒƒãƒ—グレードã™ã‚‹ã‹ã€ä½¿ç”¨é‡ã‚’管ç†ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚今後ã®ä½¿ç”¨åˆ¶é™ã®è©³ç´°ã«ã¤ã„ã¦ã¯ã€%{faq_link_start}FAQ%{link_end}ã‚’å‚ç…§ã—ã¦ãã ã•ã„"
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr "最上ä½ã‚°ãƒ«ãƒ¼ãƒ—ã®%{group_name}ã«ã¯%{free_users_limit}人以上ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒã„ã¦ã€%{free_storage_limit}以上ã®ãƒ‡ãƒ¼ã‚¿ã‚’使用ã—ã¦ã„ã¾ã™ã€‚Freeã®æœ€ä¸Šä½ã‚°ãƒ«ãƒ¼ãƒ—ã«ä½¿ç”¨åˆ¶é™ãŒé©ç”¨ã•ã‚Œã‚‹ã¨ã€ã‚°ãƒ«ãƒ¼ãƒ—内ã®ãƒ—ロジェクトã¯%{read_only_link_start}読ã¿å–り専用%{link_end}ã«ãªã‚Šã¾ã™ã€‚シート数やストレージ容é‡ã‚’追加ã™ã‚‹ã«ã¯ã€æœ‰æ–™ãƒ—ランã«ã‚¢ãƒƒãƒ—グレードã—ã¦ãã ã•ã„。ã¾ãŸä½¿ç”¨é‡ã‚’管ç†ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚今後ã®ä½¿ç”¨åˆ¶é™ã®è©³ç´°ã«ã¤ã„ã¦ã¯ã€%{faq_link_start}FAQ%{link_end}ã‚’å‚ç…§ã—ã¦ãã ã•ã„"
+
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
msgstr "æ›´æ–°ã«å¤±æ•—ã—ã¾ã—ãŸã€‚既存ã®ãƒ‡ã‚¶ã‚¤ãƒ³ã«ç ´æ£„ã—ãŸã¨ãã«ã‚¢ãƒƒãƒ—ロードã§ãるデザインã¯1ã¤ã ã‘ã§ã™ã€‚"
@@ -53082,8 +53343,8 @@ msgstr "共有ランナーãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹å ´åˆã¯å¤‰æ›´ã§ãã¾ã›
msgid "cannot be changed since member is associated with a custom role"
msgstr "メンãƒãƒ¼ãŒã‚«ã‚¹ã‚¿ãƒ ãƒ­ãƒ¼ãƒ«ã«é–¢é€£ä»˜ã‘られã¦ã„ã‚‹ãŸã‚ã€å¤‰æ›´ã§ãã¾ã›ã‚“"
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
-msgstr "親タイプã¨ã—㦠%{new_type} を指定ã—㦠%{parent_type} ã«å¤‰æ›´ã§ãã¾ã›ã‚“。"
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
+msgstr "親%{new_type}ã«ãƒªãƒ³ã‚¯ã•ã‚Œã¦ã„ã‚‹å ´åˆã¯ã€%{parent_type}ã«å¤‰æ›´ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。"
msgid "cannot be changed to %{new_type} with these child item types."
msgstr "å­ã‚¿ã‚¤ãƒ—ã¨ã—㦠%{new_type} を指定ã—ã¦å¤‰æ›´ã§ãã¾ã›ã‚“。"
@@ -53131,7 +53392,7 @@ msgid_plural "checklist items"
msgstr[0] "ãƒã‚§ãƒƒã‚¯ãƒªã‚¹ãƒˆã‚¢ã‚¤ãƒ†ãƒ "
msgid "ci secure files"
-msgstr ""
+msgstr "CI安全ãªãƒ•ã‚¡ã‚¤ãƒ«"
msgid "ciReport|%{criticalStart}critical%{criticalEnd}, %{highStart}high%{highEnd} and %{otherStart}others%{otherEnd}"
msgstr "%{criticalStart}é‡è¦%{criticalEnd}ã€%{highStart}高%{highEnd}ã€ãŠã‚ˆã³%{otherStart}ãã®ä»–%{otherEnd}"
@@ -53508,10 +53769,8 @@ msgid "closed %{timeago}"
msgstr "%{timeago}ã«å®Œäº†"
msgid "closed issue"
-msgstr "クローズã—ãŸã‚¤ã‚·ãƒ¥ãƒ¼"
-
-msgid "collect usage information"
-msgstr "使用状æ³æƒ…å ±ã®åŽé›†"
+msgid_plural "closed issues"
+msgstr[0] ""
msgid "comment"
msgstr "コメント"
@@ -53730,18 +53989,6 @@ msgstr[0] "ファイル"
msgid "finding is not found or is already attached to a vulnerability"
msgstr "検出çµæžœãŒè¦‹ã¤ã‹ã‚‰ãªã„ã‹ã€ã™ã§ã«è„†å¼±æ€§ã«é–¢é€£ä»˜ã‘られã¦ã„ã¾ã™"
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr "%{link_to_merge_request} ã¨%{link_to_merge_request_source_branch} ã®å ´åˆ"
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr "%{link_to_merge_request_source_branch} ã¨%{link_to_merge_request_target_branch} を組ã¿åˆã‚ã›ãŸ%{link_to_merge_request} ã®å ´åˆ"
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr "%{link_to_pipeline_ref} ã®å ´åˆ"
-
-msgid "for %{ref}"
-msgstr "%{ref} ã®å ´åˆ"
-
msgid "for Workspace is required to be public"
msgstr "ワークスペースã¯å…¬é–‹ã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚‹ãŸã‚"
@@ -53846,8 +54093,8 @@ msgstr "ã«"
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr "%{duration}ã®é–“ã«%{queued_duration}キューã«å…¥ã‚Šã¾ã—ãŸ"
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
-msgstr "%{duration}ã®é–“ã«%{compute_credits}ã®è¨ˆç®—クレジットを使用ã—ã€%{queued_duration}キューã«å…¥ã‚Šã¾ã—ãŸ"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
+msgstr ""
msgid "in group %{link_to_group}"
msgstr "(グループ %{link_to_group})"
@@ -53855,6 +54102,9 @@ msgstr "(グループ %{link_to_group})"
msgid "in project %{link_to_project}"
msgstr "プロジェクト %{link_to_project}"
+msgid "incident"
+msgstr "インシデント"
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] "インスタンスãŒå®Œäº†ã—ã¾ã—ãŸ"
@@ -53950,7 +54200,7 @@ msgid "is read-only"
msgstr "ã¯èª­ã¿å–り専用"
msgid "is required to enable Code Suggestions"
-msgstr "コードæ案を有効ã«ã™ã‚‹ã«ã¯å¿…é ˆã§ã™"
+msgstr "ã¯ã€ã‚³ãƒ¼ãƒ‰ã®æ案を有効ã«ã™ã‚‹ãŸã‚ã«å¿…é ˆã§ã™"
msgid "is too long (%{current_value}). The maximum size is %{max_size}."
msgstr "é•·ã™ãŽã¾ã™(%{current_value})。最大サイズ㯠%{max_size} ã§ã™ã€‚"
@@ -54038,9 +54288,6 @@ msgstr "ã¨ã«ã‹ã読ã¿è¾¼ã‚€"
msgid "loading"
msgstr "読ã¿è¾¼ã¿ä¸­"
-msgid "locked"
-msgstr "ロック済ã¿"
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr "%{path_lock_user_name} ã«ã‚ˆã£ã¦ %{created_at} ã«ãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚"
@@ -54104,10 +54351,10 @@ msgid "mrWidgetCommitsAdded|The changes were not merged into %{targetBranch}."
msgstr "%{targetBranch}ã«ãƒžãƒ¼ã‚¸ã•ã‚Œãªã‹ã£ãŸå¤‰æ›´ã€‚"
msgid "mrWidgetNothingToMerge|Merge request contains no changes"
-msgstr "ã“ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«ã¯å¤‰æ›´ãŒã‚ã‚Šã¾ã›ã‚“。"
+msgstr "ã“ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«ã¯å¤‰æ›´ãŒã‚ã‚Šã¾ã›ã‚“"
msgid "mrWidgetNothingToMerge|Use merge requests to propose changes to your project and discuss them with your team. To make changes, use the %{boldStart}Code%{boldEnd} dropdown list above, then test them with %{linkStart}CI/CD%{linkEnd} before merging."
-msgstr "マージリクエストを使用ã—ã¦ã€ãƒ—ロジェクトã¸ã®å¤‰æ›´ã‚’æ案ã—ã€ãƒãƒ¼ãƒ ã¨è­°è«–ã—ã¾ã™ã€‚ 変更を行ã†ã«ã¯ã€ä¸Šã®%{boldStart}コード%{boldEnd}ã®ãƒ‰ãƒ­ãƒƒãƒ—ダウンリストを使ã£ã¦ãƒžãƒ¼ã‚¸ã™ã‚‹å‰ã« %{linkStart}CI/CD%{linkEnd}ã§å¤‰æ›´ã‚’テストã—ã¾ã™ã€‚"
+msgstr "マージリクエストを使用ã—ã¦ã€ãƒ—ロジェクトã¸ã®å¤‰æ›´ã‚’æ案ã—ã€ãƒãƒ¼ãƒ ã¨è©±ã—åˆã„ã¾ã™ã€‚変更を行ã†ã«ã¯ã€ä¸Šã®%{boldStart}コード%{boldEnd}ã®ãƒ‰ãƒ­ãƒƒãƒ—ダウンリストを使ã£ã¦ã€ãƒžãƒ¼ã‚¸ã™ã‚‹å‰ã«%{linkStart}CI/CD%{linkEnd}ã§å¤‰æ›´ã‚’テストã—ã¾ã™ã€‚"
msgid "mrWidget|%{boldHeaderStart}Looks like there's no pipeline here.%{boldHeaderEnd}"
msgstr "%{boldHeaderStart}ã“ã“ã«ãƒ‘イプラインãŒãªã„よã†ã§ã™ã€‚%{boldHeaderEnd}"
@@ -54217,9 +54464,6 @@ msgstr "無効ãªãƒ«ãƒ¼ãƒ« %{rules} ãŒè‡ªå‹•çš„ã«æ‰¿èªã•ã‚Œã¾ã—ãŸ"
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr "無効ãªãƒ«ãƒ¼ãƒ« %{rules} ãŒè‡ªå‹•çš„ã«æ‰¿èªã•ã‚Œã¾ã—ãŸ"
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr "マージトレインã¯ã€ãƒžãƒ¼ã‚¸ã•ã‚Œã‚‹ã®ã‚’å¾…ã¤ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®ã‚­ãƒ¥ãƒ¼ãƒªã‚¹ãƒˆã§ã™ã€‚ å„マージリクエストã®å¤‰æ›´ã¯ã€ä»¥å‰ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®å¤‰æ›´ã¨çµåˆã•ã‚Œã€ãƒžãƒ¼ã‚¸å‰ã«ãƒ†ã‚¹ãƒˆã•ã‚Œã¾ã™ã€‚"
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr "æ–°ã—ã„マージトレインãŒé–‹å§‹ã•ã‚Œã¾ã—ãŸã€‚ã“ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã¯ã‚­ãƒ¥ãƒ¼ã®æœ€åˆã«ãŠã‹ã‚Œã¦ã„ã¾ã™ã€‚"
@@ -54339,9 +54583,6 @@ msgstr "マージã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
msgid "mrWidget|Merged by"
msgstr "マージ作業者"
-msgid "mrWidget|More information"
-msgstr "詳ã—ã„情報"
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr "復元ã™ã‚‹ã‹ã€åˆ¥ã® %{type} ブランãƒã‚’使用ã—ã¦ãã ã•ã„."
@@ -54405,17 +54646,17 @@ msgstr "ã“ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã¯è‡ªå‹•çš„ã«ãƒžãƒ¼ã‚¸ã•ã‚Œã¾ã›ã‚“ã§
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr "ã“ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’承èªã™ã‚‹ã«ã¯ã€ãƒ‘スワードを入力ã—ã¦ãã ã•ã„。ã“ã®ãƒ—ロジェクトã§ã¯ã€ã™ã¹ã¦ã®æ‰¿èªãŒèªè¨¼ã•ã‚Œã¦ã„ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
-msgstr "ã“れらã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’変更ã™ã‚‹ã«ã¯ã€ãƒžãƒ¼ã‚¸ã¨ã‚¹ã‚«ãƒƒã‚·ãƒ¥ã‚³ãƒŸãƒƒãƒˆã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä¸¡æ–¹ã®ãƒ†ãƒ³ãƒ—レートを編集ã—ã¦ãã ã•ã„。 %{linkStart}詳ã—ãã¯ã“ã¡ã‚‰%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
+msgstr "ã“れらã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’変更ã™ã‚‹ã«ã¯ã€ãƒžãƒ¼ã‚¸ã¨ã‚¹ã‚«ãƒƒã‚·ãƒ¥ã‚³ãƒŸãƒƒãƒˆã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä¸¡æ–¹ã®ãƒ†ãƒ³ãƒ—レートを編集ã—ã¦ãã ã•ã„。%{linkStart}詳ã—ãã¯ã“ã¡ã‚‰ã‚’ã”覧ãã ã•ã„%{linkEnd}。"
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
-msgstr "ã“れらã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’変更ã™ã‚‹ã«ã¯ã€ãƒžãƒ¼ã‚¸ã‚³ãƒŸãƒƒãƒˆã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒ†ãƒ³ãƒ—レートを編集ã—ã¦ãã ã•ã„。 %{linkStart}詳ã—ãã¯ã“ã¡ã‚‰%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
+msgstr "ã“れらã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’変更ã™ã‚‹ã«ã¯ã€ãƒžãƒ¼ã‚¸ã‚³ãƒŸãƒƒãƒˆã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒ†ãƒ³ãƒ—レートを編集ã—ã¦ãã ã•ã„。%{linkStart}詳ã—ãã¯ã“ã¡ã‚‰ã‚’ã”覧ãã ã•ã„%{linkEnd}。"
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
-msgstr "ã“れらã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’変更ã™ã‚‹ã«ã¯ã€ã‚¹ã‚«ãƒƒã‚·ãƒ¥ã‚³ãƒŸãƒƒãƒˆã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒ†ãƒ³ãƒ—レートを編集ã—ã¦ãã ã•ã„。 %{linkStart}詳ã—ãã¯ã“ã¡ã‚‰%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
+msgstr "ã“れらã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’変更ã™ã‚‹ã«ã¯ã€ã‚¹ã‚«ãƒƒã‚·ãƒ¥ã‚³ãƒŸãƒƒãƒˆã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒ†ãƒ³ãƒ—レートを編集ã—ã¦ãã ã•ã„。%{linkStart}詳ã—ãã¯ã“ã¡ã‚‰ã‚’ã”覧ãã ã•ã„%{linkEnd}。"
-msgid "mrWidget|What is a merge train?"
-msgstr "マージトレインã¨ã¯ä½•ã§ã™ã‹ ?"
+msgid "mrWidget|Your merge request is almost ready!"
+msgstr "マージリクエストã®æº–å‚™ãŒã»ã¼å®Œäº†ã—ã¾ã—ãŸ!"
msgid "mrWidget|Your password"
msgstr "パスワード"
@@ -54453,6 +54694,12 @@ msgstr "グループã¾ãŸã¯ãƒ—ロジェクトã«é–¢é€£ä»˜ã‘られã¦ã„ã‚‹å¿…
msgid "must be at least 1 day"
msgstr "ã¯1日以上ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+msgid "must be before %{expiry_date}"
+msgstr "ã¯%{expiry_date}よりå‰ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+msgid "must be false when email confirmation setting is off"
+msgstr "ã¯ã€ãƒ¡ãƒ¼ãƒ«ã®ç¢ºèªè¨­å®šãŒã‚ªãƒ•ã®å ´åˆã€falseã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"
+
msgid "must be greater than start date"
msgstr "開始日より後ã«ã—ã¦ãã ã•ã„。"
@@ -54486,9 +54733,6 @@ msgstr "作業項目ã¨åŒã˜ãƒ—ロジェクトã«å±žã—ã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Š
msgid "must contain only a discord user ID."
msgstr "DiscordユーザーIDã®ã¿ã‚’å«ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
-msgid "must expire in 365 days"
-msgstr "ã®æœ‰åŠ¹æœŸé™ã¯365æ—¥ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
-
msgid "must have a repository"
msgstr "リãƒã‚¸ãƒˆãƒªãŒå¿…è¦ã§ã™"
@@ -54568,7 +54812,8 @@ msgid "only supports valid HTTP(S) URLs"
msgstr "有効㪠HTTP(S) URL ã®ã¿ã‚µãƒãƒ¼ãƒˆ"
msgid "open issue"
-msgstr "イシューを開ã"
+msgid_plural "open issues"
+msgstr[0] ""
msgid "or"
msgstr "ã¾ãŸã¯"
@@ -54830,7 +55075,7 @@ msgid "smartcn custom analyzer"
msgstr "smartcn カスタムアナライザー"
msgid "snippet"
-msgstr ""
+msgstr "スニペット"
msgid "source"
msgstr "ソース"
@@ -54889,6 +55134,9 @@ msgstr "ã‚¿ã‚°å"
msgid "terraform states"
msgstr "terraform ã®çŠ¶æ…‹"
+msgid "test case"
+msgstr "テストケース"
+
msgid "the correct format."
msgstr "æ­£ã—ã„å½¢å¼ã§ã™"
@@ -54932,7 +55180,7 @@ msgid "triggered"
msgstr "トリガーã•ã‚ŒãŸ"
msgid "triggered pipeline for commit %{linkStart}%{shortId}%{linkEnd}"
-msgstr ""
+msgstr "コミット%{linkStart}%{shortId}%{linkEnd}ã®ãŸã‚ã«ãƒˆãƒªã‚¬ãƒ¼ã•ã‚ŒãŸãƒ‘イプライン"
msgid "two-factor authentication settings"
msgstr "二è¦ç´ èªè¨¼ã®è¨­å®š"
@@ -54946,9 +55194,6 @@ msgstr "型パラメータãŒã‚ã‚Šã¾ã›ã‚“。ã“ã‚Œã¯å¿…é ˆã§ã™ã€‚"
msgid "unicode domains should use IDNA encoding"
msgstr "Unicodeドメインã«ã¯IDNAエンコーディングを使用ã—ã¦ãã ã•ã„"
-msgid "unlocked"
-msgstr "アンロック済ã¿"
-
msgid "updated"
msgstr "æ›´æ–°ã•ã‚ŒãŸ"
@@ -55042,7 +55287,7 @@ msgid "vulnerability|dismissed"
msgstr "å´ä¸‹ã•ã‚Œã¾ã—ãŸ"
msgid "was set to auto-merge by"
-msgstr ""
+msgstr "ã¯æ¬¡ã«ã‚ˆã£ã¦è‡ªå‹•ãƒžãƒ¼ã‚¸ã«è¨­å®šã•ã‚Œã¾ã—ãŸ"
msgid "weekly"
msgstr "毎週"
@@ -55071,9 +55316,6 @@ msgstr "GitLab インスタンス"
msgid "your group (%{group_name})"
msgstr "ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—(%{group_name})"
-msgid "your settings"
-msgstr "ã‚ãªãŸã®è¨­å®š"
-
msgid "yyyy-mm-dd"
msgstr "yyyy-mm-dd"
diff --git a/locale/ka_GE/gitlab.po b/locale/ka_GE/gitlab.po
index 5ea09862fb9..fb1575458e5 100644
--- a/locale/ka_GE/gitlab.po
+++ b/locale/ka_GE/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ka\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:44\n"
+"PO-Revision-Date: 2023-07-11 04:47\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/kab/gitlab.po b/locale/kab/gitlab.po
index 6bdc92cc071..050e83a4965 100644
--- a/locale/kab/gitlab.po
+++ b/locale/kab/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: kab\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:48\n"
+"PO-Revision-Date: 2023-07-11 04:51\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/ko/gitlab.po b/locale/ko/gitlab.po
index f33ce6d4cd3..f38d8e3522e 100644
--- a/locale/ko/gitlab.po
+++ b/locale/ko/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ko\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:44\n"
+"PO-Revision-Date: 2023-07-11 04:47\n"
msgid " %{start} to %{end}"
msgstr " %{start}부터 %{end}까지"
@@ -95,6 +95,14 @@ msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] "%dê±´ì˜ ìŠ¹ì¸"
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] "%dê°œì˜ ëª¨ë“ˆ"
@@ -155,6 +163,10 @@ msgid "%d assigned issue"
msgid_plural "%d assigned issues"
msgstr[0] "%dê°œì˜ í• ë‹¹ëœ ì´ìŠˆ"
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] "%dê°œì˜ ë³€ê²½ëœ íŒŒì¼"
@@ -299,14 +311,6 @@ msgid "%d more comment"
msgid_plural "%d more comments"
msgstr[0] "%d 댓글 ë” ë³´ê¸°"
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] "%dê°œì˜ íŒ¨í‚¤ì§€"
@@ -562,9 +566,6 @@ msgid "%{count} project"
msgid_plural "%{count} projects"
msgstr[0] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr "%{count} ê±´ê³¼ ê´€ë ¨ëœ %{pluralized_subject}: %{links}"
-
msgid "%{count} selected"
msgstr "%{count}ê°œ ì„ íƒë¨"
@@ -607,6 +608,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr "%{duration}ms"
@@ -679,7 +683,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -703,6 +710,9 @@ msgstr "%{italic_start}새로운 기능%{italic_end} 메뉴는 비활성화ë˜ì–
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1009,6 +1019,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr "%{start}부터 %{end}까지"
@@ -1036,8 +1052,8 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
-msgstr "%{strongOpen}경고:%{strongClose} SAML 그룹 ë§í¬ë¡œ ì¸í•´ GitLabì´ ê·¸ë£¹ì—ì„œ 구성ì›ì„ ìžë™ìœ¼ë¡œ 제거할 수 있습니다."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
+msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
msgid_plural "%{strongStart}%{count}%{strongEnd} commits"
@@ -1148,9 +1164,6 @@ msgstr "%{type} ì€ %{name} ì´ë¦„만 지ì›í•©ë‹ˆë‹¤."
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr "%{userName} (머지할 수 ì—†ìŒ)"
-
msgid "%{userName}'s avatar"
msgstr "%{userName}ì˜ ì•„ë°”íƒ€"
@@ -1386,7 +1399,7 @@ msgid "- Not available to run jobs."
msgstr ""
msgid "- Push code to the repository."
-msgstr "- ì €ìž¥ì†Œì— ì½”ë“œë¥¼ 푸시합니다."
+msgstr ""
msgid "- Select -"
msgstr "- ì„ íƒ -"
@@ -1623,7 +1636,7 @@ msgid "A complete DevOps platform"
msgstr "완벽한 DevOps 플랫í¼"
msgid "A confidential issue cannot have a parent that already has non-confidential children."
-msgstr "기밀 ì´ìŠˆëŠ” ì´ë¯¸ ê¸°ë°€ì´ ì•„ë‹Œ ìžì‹ì´ 있는 부모를 가질 수 없습니다."
+msgstr ""
msgid "A confidential work item cannot have a parent that already has non-confidential children."
msgstr "기밀 ìž‘ì—… í•­ëª©ì€ ì´ë¯¸ ê¸°ë°€ì´ ì•„ë‹Œ ìžì‹ í•­ëª©ì´ ìžˆëŠ” 부모 í•­ëª©ì„ ê°€ì§ˆ 수 없습니다."
@@ -1689,7 +1702,7 @@ msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr ""
msgid "A non-confidential issue cannot have a confidential parent."
-msgstr "ê¸°ë°€ì´ ì•„ë‹Œ ì´ìŠˆëŠ” 기밀 부모를 가질 수 없습니다."
+msgstr ""
msgid "A non-confidential work item cannot have a confidential parent."
msgstr "ê¸°ë°€ì´ ì•„ë‹Œ ìž‘ì—… 항목ì—는 기밀 부모를 가질 수 없습니다."
@@ -1805,6 +1818,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr "ë‚´ê°€ 어떻게 ë„울 수 있ì„지 모르겠습니다. ë” ë‚˜ì€ ì§€ì¹¨ì„ ì œê³µí•˜ì‹­ì‹œì˜¤!"
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2258,6 +2277,9 @@ msgstr "액세스 토í°"
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr "확실한가요?"
@@ -2276,12 +2298,18 @@ msgstr "수신 ì´ë©”ì¼ í† í° ë³µì‚¬"
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr "피드 토í°"
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr "수신 ì´ë©”ì¼ í† í°"
@@ -2300,6 +2328,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr "ê°œì¸ ì•¡ì„¸ìŠ¤ 토í°"
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr "ì •ì  ê°ì²´ 토í°"
@@ -2309,6 +2346,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr "2FA (ì´ì¤‘ ì¸ì¦)ì„ í™œì„±í™”í•œ 경우, 유ì¼í•˜ê²Œ 사용할 수 있는 비밀번호입니다."
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr "Git over HTTP ì—­ì‹œ ê°œì¸ ì—‘ì„¸ìŠ¤ 토í°ì„ 사용하여 ì¸ì¦í•  수 있습니다."
@@ -2360,13 +2400,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr "내가 소유한 러너를 사용하겠습니다."
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr "ìžì„¸ížˆ 보기"
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2477,9 +2517,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr "Zoom 미팅 추가"
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr "GCP 리전 추가"
@@ -2528,6 +2565,9 @@ msgstr "ì´ìŠˆ 추가"
msgid "Add a numbered list"
msgstr "번호 매기기 ëª©ë¡ ì¶”ê°€"
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr "관련 ì—픽 추가"
@@ -2783,6 +2823,9 @@ msgstr "ì´ ë²„ì „ì— ì¶”ê°€ë¨"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr "GitLab ì¸ìŠ¤í„´ìŠ¤ì— 새 애플리케ì´ì…˜ì„ 추가 í•  수 없습니다. ê¶Œí•œì„ ì–»ìœ¼ë ¤ë©´ GitLab 관리ìžì—게 문ì˜í•˜ì‹­ì‹œì˜¤."
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2804,9 +2847,6 @@ msgstr "ë¡œê·¸ì¸ íŽ˜ì´ì§€ì— 표시할 추가 í…스트"
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr "주소"
@@ -3168,7 +3208,7 @@ msgid "AdminSettings|Enable Service Ping"
msgstr "서비스 핑 활성화"
msgid "AdminSettings|Enable collection of application metrics. Restart required. %{link_start}Learn how to export metrics to Prometheus%{link_end}."
-msgstr "ì‘ìš© 프로그램 메트릭 ìˆ˜ì§‘ì„ í™œì„±í™”í•©ë‹ˆë‹¤. 다시 시작해야 합니다. %{link_start}Prometheus%{link_end}ë¡œ ë©”íŠ¸ë¦­ì„ ë‚´ë³´ë‚´ëŠ” ë°©ë²•ì„ ì•Œì•„ë´…ë‹ˆë‹¤."
+msgstr ""
msgid "AdminSettings|Enable kuromoji custom analyzer: Indexing"
msgstr ""
@@ -3230,24 +3270,15 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr "소스 가져오기"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
+msgstr ""
+
msgid "AdminSettings|Inactive project deletion"
msgstr ""
msgid "AdminSettings|Instance runners expiration"
msgstr "ì¸ìŠ¤í„´ìŠ¤ 러너 만료"
-msgid "AdminSettings|Jitsu administrator email"
-msgstr "Jitsu ê´€ë¦¬ìž ì´ë©”ì¼"
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr "Jitsu ê´€ë¦¬ìž ì•”í˜¸"
-
-msgid "AdminSettings|Jitsu host"
-msgstr "Jitsu 호스트"
-
-msgid "AdminSettings|Jitsu project ID"
-msgstr "Jitsu 프로ì íŠ¸ ID"
-
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
msgstr ""
@@ -3329,6 +3360,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3398,9 +3432,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr "Cube ì¸ìŠ¤í„´ìŠ¤ì˜ URL"
@@ -3410,9 +3441,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr "Jitsu ì¸ìŠ¤í„´ìŠ¤ì˜ 호스트."
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3443,10 +3471,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr "AdminSettings|IAM ìžê²© ì¦ëª…으로 AWS OpenSearch Service 사용"
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3455,9 +3483,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr "ì‚¬ìš©ìž ë° ê·¸ë£¹ì€ ê·¸ë£¹ ë˜ëŠ” 프로ì íŠ¸ì— 추가ë˜ê¸° ì „ì— ì´ˆëŒ€ë¥¼ 수ë½í•´ì•¼ 합니다."
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3680,9 +3705,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr "ì´ê²ƒì€ 나!"
@@ -3728,6 +3750,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr "비공개 프로필"
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3767,7 +3792,7 @@ msgstr "Skype"
msgid "AdminUsers|Sort by"
msgstr "정렬 기준"
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4037,9 +4062,6 @@ msgstr "ì˜¤ëž˜ëœ ì½”ë“œ 검색 ë§¤í•‘ì„ ì‚¬ìš©í•˜ê³  있습니다. 코드 ê²€ì
msgid "After a successful password update you will be redirected to login screen."
msgstr "비밀번호가 성공ì ìœ¼ë¡œ ë³€ê²½ëœ ë’¤ì— ë¡œê·¸ì¸ í™”ë©´ìœ¼ë¡œ ì´ë™ 합니다."
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr "비밀번호 ì—…ë°ì´íŠ¸ì— 성공하면, 새 비밀번호로 ë¡œê·¸ì¸ í•  수있는 ë¡œê·¸ì¸ íŽ˜ì´ì§€ë¡œ 리디렉션 ë©ë‹ˆë‹¤."
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4076,7 +4098,7 @@ msgstr "í™œë™ í”¼ë“œ"
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4181,10 +4203,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
-msgstr "ë‹´ë‹¹ìž ëª©ë¡ì„ ì—…ë°ì´íŠ¸í•˜ëŠ” ë™ì•ˆ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. 다시 ì‹œë„í•´ 주세요."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
+msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4295,9 +4317,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr "키 리셋"
@@ -4334,9 +4353,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr "ì‚¬ìš©ìž ì •ì˜ ë§µí•‘ì„ ìƒì„±í•˜ë ¤ë©´ ëª¨ë‹ˆí„°ë§ ë„구를 통해 예시 페ì´ë¡œë“œë¥¼ JSON형ì‹ìœ¼ë¡œ 입력하세요. 계ì†í•˜ë ¤ë©´ \"페ì´ë¡œë“œ í•„ë“œ 분ì„\"ë²„íŠ¼ì„ ì„ íƒí•˜ì„¸ìš”."
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4433,6 +4449,9 @@ msgstr "모든 브랜치"
msgid "All changes are committed"
msgstr "모든 ë³€ê²½ì‚¬í•­ì´ ì»¤ë°‹ë˜ì—ˆìŠµë‹ˆë‹¤."
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr "ìžê²©ì´ 있는 모든 사용ìž"
@@ -4598,6 +4617,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4649,12 +4671,6 @@ msgstr "ì—러가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr "새 드래프트를 추가하는 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
-
msgid "An error occurred creating the new branch."
msgstr "새 브랜치를 만드는 ë™ì•ˆ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
@@ -4697,6 +4713,12 @@ msgstr "승ì¸í•˜ëŠ” ë™ì•ˆ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. 다시 ì‹œë„í•´ 주ì„
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr "그룹 경로를 확ì¸í•˜ëŠ” ë„중 ì—러가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. 새로고침 후 다시 ì‹œë„하십시오."
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr "파ì¼ì„ 불러오는 ë„중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
@@ -4856,9 +4878,6 @@ msgstr "프로ì íŠ¸ë¥¼ 불러오는 ë„중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
msgid "An error occurred while loading the blob controls."
msgstr "Blob ì»¨íŠ¸ë¡¤ì„ ë¡œë“œí•˜ëŠ” ë™ì•ˆ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr "íŒŒì¼ ë¡œë“œ 중 오류가 ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤."
@@ -4974,9 +4993,6 @@ msgstr "ì„¤ì •ì„ ì—…ë°ì´íŠ¸í•˜ëŠ” ë™ì•ˆ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
msgid "An error occurred while updating labels."
msgstr "ë¼ë²¨ì„ ì—…ë°ì´íŠ¸í•˜ëŠ” ë™ì•ˆ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
-msgid "An error occurred while updating the comment"
-msgstr "ëŒ“ê¸€ì„ ì—…ë°ì´íŠ¸í•˜ëŠ” 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5062,7 +5078,7 @@ msgstr "ì•Œ 수 없는 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
msgid "Analytics"
msgstr "분ì„"
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5128,12 +5144,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5143,7 +5168,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5182,6 +5207,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5194,6 +5231,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5212,6 +5252,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5236,6 +5282,9 @@ msgstr "그리고 ì´ ë“±ë¡ í† í°:"
msgid "Anonymous"
msgstr "ìµëª…"
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6012,9 +6061,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr "차트 정렬"
-
msgid "Artifact"
msgstr "아티팩트"
@@ -6095,6 +6141,9 @@ msgstr "ì´ ì•„í‹°íŒ©íŠ¸ í¬ê¸°"
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6149,8 +6198,8 @@ msgstr "나ì—게 할당하기"
msgid "Assign reviewer"
msgstr "리뷰어 지정하기"
-msgid "Assign reviewer(s)"
-msgstr "리뷰어 지정하기"
+msgid "Assign reviewers"
+msgstr ""
msgid "Assign severity"
msgstr "심ê°ë„ 지정"
@@ -6207,9 +6256,6 @@ msgstr "담당ìžì—게 ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤."
msgid "Assignee lists not available with your current license"
msgstr "ë‹´ë‹¹ìž ëª©ë¡ì€ 현재 ë¼ì´ì„¼ìŠ¤ë¡œëŠ” 사용할 수 없습니다."
-msgid "Assignee(s)"
-msgstr "담당ìž"
-
msgid "Assignees"
msgstr "담당ìž"
@@ -6347,16 +6393,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr "편집 취소"
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr "ì‚¬ìš©ìž ì •ì˜ HTTP í—¤ë”(옵션)"
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6368,19 +6420,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
-msgstr "%{link} 편집"
-
msgid "AuditStreams|Event filtering (optional)"
msgstr ""
+msgid "AuditStreams|Filter by audit event type"
+msgstr ""
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
+msgstr ""
+
msgid "AuditStreams|Header"
msgstr "í—¤ë”"
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr "최대 %{number} ê°œì˜ HTTP í—¤ë”ì— ë„달했습니다."
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6389,6 +6456,9 @@ msgstr "ì‚¬ìš©ìž ì •ì˜ í—¤ë” ì œê±°"
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6416,10 +6486,7 @@ msgstr "ê°’"
msgid "AuditStreams|Verification token"
msgstr "ì¸ì¦ 토í°"
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6431,6 +6498,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr "8ì›”"
@@ -6968,28 +7041,28 @@ msgstr "결제"
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7160,6 +7233,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr "ì´ ê·¸ë£¹ì€ ìƒìœ„ ê·¸ë£¹ì˜ í”Œëžœê³¼ ì—°ê²°ë©ë‹ˆë‹¤."
@@ -7187,10 +7263,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7250,10 +7323,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7265,7 +7338,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7556,12 +7629,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7623,9 +7702,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr "ì¹´ë“œ ì´ë™"
@@ -7683,6 +7759,9 @@ msgstr "추가 ì´ìŠˆ 로드"
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8100,19 +8179,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8349,6 +8437,9 @@ msgstr "월별"
msgid "By quarter"
msgstr "분기별"
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr "주별"
@@ -8842,10 +8933,10 @@ msgstr ""
msgid "Change assignee"
msgstr "ë‹´ë‹¹ìž ë³€ê²½"
-msgid "Change assignee(s)"
-msgstr "ë‹´ë‹¹ìž ë³€ê²½"
+msgid "Change assignees"
+msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -8863,11 +8954,11 @@ msgstr "마ì¼ìŠ¤í†¤ 변경"
msgid "Change path"
msgstr "경로 변경"
-msgid "Change reviewer(s)"
-msgstr "리뷰어 변경하기"
+msgid "Change reviewers"
+msgstr ""
-msgid "Change reviewer(s)."
-msgstr "리뷰어 변경하기"
+msgid "Change reviewers."
+msgstr ""
msgid "Change role"
msgstr ""
@@ -8890,8 +8981,11 @@ msgstr ""
msgid "Change your password"
msgstr "비밀번호 변경"
-msgid "Change your password or recover your current one"
-msgstr "비밀번호 변경 ë˜ëŠ” 비밀번호 복구"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
+msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
@@ -8938,14 +9032,14 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
-msgstr "ë‹´ë‹¹ìž ë³€ê²½"
+msgid "Changed assignees."
+msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
-msgstr "리뷰어 변경ë¨"
+msgid "Changed reviewers."
+msgstr ""
msgid "Changed squash option to %{squash_option}"
msgstr ""
@@ -8986,9 +9080,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr "채팅"
@@ -9094,7 +9185,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9107,22 +9198,22 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9162,7 +9253,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9303,10 +9394,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9333,7 +9424,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9381,6 +9472,9 @@ msgstr "ìœ í˜•ì„ ì„ íƒ..."
msgid "Choose file…"
msgstr "íŒŒì¼ ì„ íƒâ€¦"
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr "저장소 ê°€ì ¸ì˜¤ê¸°ì— ëŒ€í•œ 최ìƒìœ„ ê·¸ë£¹ì„ ì„ íƒí•˜ì„¸ìš”."
@@ -9408,16 +9502,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9432,6 +9526,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9459,6 +9556,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr "우리는 파ì´í”„ë¼ì¸ 구성 요소 리í¬ì§€í† ë¦¬ë¥¼ 만들고 관리하는 ë™ì‹œì— 파ì´í”„ë¼ì¸ êµ¬ì„±ì„ ë” ì‰½ê²Œ 재사용할 수 있ë„ë¡ ë•ê³  싶습니다. 우리가 어떻게 해야 하는지 알려주세요!"
@@ -9829,6 +9929,9 @@ msgstr ""
msgid "Close"
msgstr "닫기"
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr "%{issueType} 닫기"
@@ -9886,6 +9989,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10478,9 +10584,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10565,9 +10668,6 @@ msgstr "알고 계셨나요?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr "Kubernetes í´ëŸ¬ìŠ¤í„°ì— 대한 GitLabì˜ ì—°ê²°ì„ í™œì„±í™” ë˜ëŠ” 비활성화."
@@ -10628,9 +10728,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -10874,6 +10971,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -10919,6 +11019,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -10934,10 +11040,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11033,15 +11136,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11133,18 +11245,12 @@ msgstr "ì»¤ë°‹ì´ ì‚­ì œë¨"
msgid "Commit message"
msgstr "커밋 메시지"
-msgid "Commit message (optional)"
-msgstr "커밋 메시지 (ì„ íƒ ì‚¬í•­)"
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr "%{ref} ì— ëŒ€í•œ 커밋 통계 %{start_time} - %{end_time}"
-msgid "Commit to %{branchName} branch"
-msgstr "%{branchName} 브랜치로 커밋"
-
msgid "CommitBoxTitle|Commit"
msgstr "커밋"
@@ -11271,15 +11377,30 @@ msgstr "비êµí•  ê²ƒì´ ì—†ìŠµë‹ˆë‹¤."
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11289,6 +11410,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11325,10 +11452,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export full report as CSV"
+msgstr ""
+
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11526,6 +11656,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11571,13 +11704,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11634,9 +11767,6 @@ msgstr "Gitaly 시간 제한 설정."
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11673,9 +11803,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -11838,15 +11965,9 @@ msgstr ""
msgid "Connecting..."
msgstr "연결중..."
-msgid "Connection failed"
-msgstr "연결 실패"
-
msgid "Connection failure"
msgstr "연결 실패"
-msgid "Connection timed out"
-msgstr "ì—°ê²° ì‹œê°„ì´ ì´ˆê³¼ë˜ì—ˆìŠµë‹ˆë‹¤."
-
msgid "Consistency guarantee method"
msgstr "ì¼ê´€ì„± 보장 방법"
@@ -11860,7 +11981,7 @@ msgid "Container Registry"
msgstr "컨테ì´ë„ˆ 레지스트리"
msgid "Container Repository"
-msgstr "컨테ì´ë„ˆ 저장소"
+msgstr ""
msgid "Container Scanning"
msgstr ""
@@ -12231,9 +12352,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12357,6 +12475,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12486,9 +12637,6 @@ msgstr "ë§í¬ 복사"
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr "병합 요청 URL 복사"
@@ -12654,6 +12802,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12708,9 +12859,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12753,6 +12901,9 @@ msgstr "새 브랜치 ìƒì„±"
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr "새 ì´ìŠˆ 만들기"
@@ -13038,6 +13189,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13182,9 +13336,6 @@ msgstr ""
msgid "Creating epic"
msgstr "ì—픽 ìƒì„± 중"
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14403,6 +14554,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr "기본값 - 실행ë˜ì§€ ì•ŠìŒ"
@@ -14666,6 +14823,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr "ì´ë²¤íŠ¸ë¥¼ 제거하지 못했습니다. 다시 ì‹œë„하거나 관리ìžì—게 문ì˜í•˜ì„¸ìš”."
@@ -14778,6 +14938,12 @@ msgid "Dependencies|%d vulnerability detected"
msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -14820,9 +14986,15 @@ msgstr "위치 ë° ì¢…ì†ì„± 경로"
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -14856,6 +15028,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -14874,6 +15049,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -14898,6 +15076,9 @@ msgstr "ìºì‹œ 지우기를 위한 종ì†ì„± 프ë¡ì‹œ ë° ì„¤ì •ì„ í™œì„±í™”í•
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -14907,6 +15088,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15216,9 +15400,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15370,12 +15551,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr "ë¼ë²¨ ìš°ì„  순위 낮추기"
@@ -15385,9 +15560,6 @@ msgstr "ë³€ê²½ì˜ ëª©í‘œì™€ 리뷰어가 알아야 í•  ì‚¬í•­ì„ ì„¤ëª…í•©ë‹ˆë‹¤
msgid "Description"
msgstr "설명"
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16131,7 +16303,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr "ì´ ê·¸ë£¹ì˜ í”„ë¡œì íŠ¸ì— 대해 ë‹¤ìŒ ë„ë©”ì¸ì´ 구성ë©ë‹ˆë‹¤. 확ì¸ëœ ë„ë©”ì¸ê³¼ ì¼ì¹˜í•˜ëŠ” ì´ë©”ì¼ ì£¼ì†Œë¥¼ 가진 사용ìžëŠ” ê³„ì •ì„ í™•ì¸í•  필요가 없습니다."
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16176,15 +16348,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr "CSV 다운로드"
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr "아티팩트 다운로드"
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr "코드 다운로드"
@@ -16470,6 +16642,9 @@ msgstr "공개 ë°°í¬ í‚¤ 편집"
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16575,6 +16750,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -16687,7 +16865,7 @@ msgid "Enable GitLab Error Tracking"
msgstr "GitLab 오류 ì¶”ì  í™œì„±í™”"
msgid "Enable GitLab Prometheus metrics endpoint"
-msgstr "GitLab Prometheus 메트릭 엔드í¬ì¸íŠ¸ 활성화"
+msgstr ""
msgid "Enable Gitpod"
msgstr ""
@@ -16861,7 +17039,7 @@ msgid "EnableReviewApp|Recommended: Set up a job that manually stops the Review
msgstr "권장: 리뷰 ì•±ì„ ìˆ˜ë™ìœ¼ë¡œ 중지하ë„ë¡ ìž‘ì—…ì„ ì„¤ì •í•©ë‹ˆë‹¤."
msgid "EnableReviewApp|Review apps are dynamic environments that you can use to provide a live preview of changes made in a feature branch."
-msgstr "검토 ì•±ì€ ê¸°ëŠ¥ 분기ì—ì„œ ìˆ˜í–‰ëœ ë³€ê²½ ì‚¬í•­ì˜ ì‹¤ì‹œê°„ 미리 보기를 제공하는 ë° ì‚¬ìš©í•  수 있는 ë™ì  환경입니다."
+msgstr ""
msgid "EnableReviewApp|To configure a dynamic review app, you must:"
msgstr "ë™ì  검토 ì•±ì„ êµ¬ì„±í•˜ë ¤ë©´ 다ìŒì„ 수행해야 합니다."
@@ -16911,9 +17089,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -16974,9 +17149,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17004,16 +17176,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
+msgstr ""
+
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17178,9 +17353,6 @@ msgstr ""
msgid "Environments|Job"
msgstr "ìž‘ì—…"
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr "환경 ì •ì§€ì— ëŒ€í•´ ìžì„¸ížˆ 알아보기"
@@ -17193,9 +17365,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr "새 환경"
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr "ë°°í¬ê°€ 없습니다."
@@ -17391,12 +17560,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr "%{startDate} – %{dueDate}"
-
-msgid "Epics|%{startDate} – No due date"
-msgstr "%{startDate} – 마ê°ì¼ ì—†ìŒ"
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17412,9 +17575,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr "ì‹œìž‘ì¼ ì—†ìŒ â€“ %{dueDate}"
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18365,12 +18525,18 @@ msgstr[0] "실패한 작업"
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr "리소스 ë§í¬ë¥¼ 추가하지 못했습니다."
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18408,9 +18574,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18555,6 +18718,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr "미러를 제거하지 못했습니다."
@@ -18576,6 +18742,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18642,9 +18811,6 @@ msgstr ""
msgid "Feature Flags"
msgstr "기능 플래그"
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -18946,6 +19112,9 @@ msgstr "변경 ì‚¬í•­ì´ í° íŒŒì¼ì€ 기본ì ìœ¼ë¡œ 접혀있습니다."
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19177,9 +19346,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19189,6 +19355,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19370,6 +19539,9 @@ msgid "Free groups are limited to %{free_user_limit} member and the remaining me
msgid_plural "Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group."
msgstr[0] "무료 요금제ì—ì„œ ê·¸ë£¹ì€ êµ¬ì„±ì›ì´ %{free_user_limit}명으로 제한ë˜ë©° 나머지 구성ì›ì€ 제한 초과 ìƒíƒœê°€ ë˜ì–´ ê·¸ë£¹ì— ì•¡ì„¸ìŠ¤í•  수 없습니다."
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19430,6 +19602,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr "ì´ìŠˆ ìƒì„±ì—ì„œ 프로ë•ì…˜ ë°°í¬ê¹Œì§€"
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr "머지 리퀘스트(MR) 머지ì—ì„œ 프로ë•ì…˜ í™˜ê²½ì— ë°°í¬ê¹Œì§€"
@@ -19487,6 +19662,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20101,9 +20279,6 @@ msgstr "GitLab 시작하기"
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20584,6 +20759,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr "ì˜ê²¬ì„ 남겨주세요."
@@ -20623,6 +20801,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr "닫기"
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr "그룹"
@@ -20641,6 +20822,9 @@ msgstr "ë‚´ê°€ 만든 ì´ìŠˆ"
msgid "GlobalSearch|Issues assigned to me"
msgstr "나ì—게 í• ë‹¹ëœ ì´ìŠˆ"
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr "언어"
@@ -20653,6 +20837,9 @@ msgstr "나ì—게 í• ë‹¹ëœ ë¨¸ì§€ 리퀘스트"
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr "ë‚´ê°€ 검토ìžì¸ 머지 리퀘스트"
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr "프로ì íŠ¸"
@@ -20689,6 +20876,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr "프로ì íŠ¸, ì´ìŠˆ, 기타 검색"
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr "검색 결과가 로드 중입니다."
@@ -21118,9 +21308,6 @@ msgstr "그룹 정보:"
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21412,6 +21599,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22083,12 +22273,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr "í—¤ë”"
@@ -22203,10 +22387,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-
msgid "Hide comments"
msgstr "댓글 숨기기"
@@ -22352,12 +22532,24 @@ msgstr "정리"
msgid "Housekeeping successfully started"
msgstr "정리가 성공ì ìœ¼ë¡œ 시작ë˜ì—ˆìŠµë‹ˆë‹¤"
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -22978,6 +23170,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23036,6 +23231,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -23858,6 +24056,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -23975,7 +24179,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24008,9 +24212,6 @@ msgstr "ì´ í”„ë¡œì íŠ¸ëŠ” insights.yml 파ì¼ì—ì„œ í•„í„°ë§ë©ë‹ˆë‹¤. (ìžì„
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25084,6 +25285,9 @@ msgstr ""
msgid "It's you"
msgstr "바로 너"
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25441,9 +25645,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25678,6 +25888,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25696,6 +25909,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr "ìž‘ì—… 로그 ë° ì•„í‹°íŒ©íŠ¸"
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -25861,6 +26077,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26023,6 +26242,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr "Job|ì´ ìš”ì†Œë¥¼ ì°¾ì„ ìˆ˜ 없습니다."
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26086,9 +26311,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26304,6 +26526,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -26935,9 +27160,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27085,8 +27307,8 @@ msgstr "ë” ë¶ˆëŸ¬ì˜¤ê¸°"
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
-msgstr "GitLab IDE 로드 중..."
+msgid "Loading the GitLab IDE"
+msgstr ""
msgid "Loading, please wait."
msgstr ""
@@ -27151,6 +27373,9 @@ msgstr "잠긴 파ì¼"
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27343,6 +27568,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27376,6 +27604,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr "3ì›”"
@@ -27433,6 +27664,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27457,9 +27691,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr "í—¤ë”"
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr "%{markdownDocsLinkStart}마í¬ë‹¤ìš´%{markdownDocsLinkEnd} 지ì›"
-
msgid "Marked"
msgstr "표시ëœ"
@@ -27559,7 +27790,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27610,7 +27841,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27637,7 +27868,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27646,7 +27877,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27682,7 +27913,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27703,7 +27934,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27724,12 +27958,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27754,7 +27994,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -27787,7 +28027,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28129,6 +28369,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr "머지 리퀘스트(MR) 승ì¸"
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28147,6 +28390,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr " 머지 요청 요약"
@@ -28264,9 +28510,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28294,9 +28537,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr "댓글 저장 실패"
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28321,6 +28561,9 @@ msgstr "íŒŒì¼ ë³´ê¸° @ %{commitId}"
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr "êµì²´ëœ íŒŒì¼ ë³´ê¸° @ %{commitId}"
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28387,6 +28630,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr "MergeTopics|%{sourceTopic} ì´ ì œê±°ë©ë‹ˆë‹¤"
@@ -28483,9 +28738,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28540,214 +28792,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28757,24 +28840,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29160,6 +29231,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29196,6 +29270,9 @@ msgstr "닫기"
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29256,9 +29333,6 @@ msgstr "ë” ë§Žì€ ì •ë³´"
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29436,6 +29510,12 @@ msgstr "네임스페ì´ìŠ¤ ID:"
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30182,12 +30262,6 @@ msgstr "신용 카드가 필요하지 않습니다."
msgid "No data available"
msgstr "ìžë£Œ ì—†ìŒ"
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30326,9 +30400,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr "저장소 ì—†ìŒ"
@@ -30371,6 +30442,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30513,9 +30587,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr "%{markdownDocsLinkStart}마í¬ë‹¤ìš´%{markdownDocsLinkEnd} 지ì›. %{quickActionsDocsLinkStart}퀵 ì•¡ì…˜%{quickActionsDocsLinkEnd}ì„ ì‚¬ìš©í•˜ë ¤ë©´ %{keyboardStart}/%{keyboardEnd}를 입력하세요."
-
msgid "Notes"
msgstr ""
@@ -30808,6 +30879,9 @@ msgstr "커밋 작성ìž"
msgid "Notify|Committed by"
msgstr "ì˜í•´ì„œ 커밋ë¨"
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr "GitLab 관리ìžë¡œë¶€í„° ì—…ë°ì´íŠ¸ë¥¼ 받고 싶지 않습니까?"
@@ -30913,18 +30987,24 @@ msgstr "ì´ íŒŒì¼ í˜•ì‹ì— 대한 미리보기가 없습니다."
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
-msgstr ""
-
msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr "다ìŒì— ì˜í•´ íŠ¸ë¦¬ê±°ëœ íŒŒì´í”„ë¼ì¸ %{pipeline_link}"
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
-msgstr "파ì´í”„ë¼ì¸ì´ 수정ë˜ì—ˆìœ¼ë©° #%{pipeline_id} ì´ í†µê³¼ë˜ì—ˆìŠµë‹ˆë‹¤!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
+msgstr ""
+
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
+msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31099,6 +31179,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr "확ì¸"
@@ -31773,6 +31856,12 @@ msgstr "번호순 목ë¡"
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32293,6 +32382,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -32863,9 +32964,6 @@ msgstr "파ì´í”„ë¼ì¸ 스케쥴"
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33067,6 +33165,15 @@ msgstr "활성"
msgid "PipelineSchedules|All"
msgstr "모ë‘"
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr "ì´ íŒŒì´í”„ë¼ì¸ ì¼ì •ì„ 삭제하시겠습니까?"
@@ -33076,6 +33183,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33133,9 +33243,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33322,9 +33429,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33436,6 +33540,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33487,9 +33594,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33508,7 +33612,7 @@ msgstr "ì´ í”„ë¡œì íŠ¸ëŠ” 현재 파ì´í”„ë¼ì¸ì„ 실행하ë„ë¡ ì„¤ì •ë˜ì
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33568,9 +33672,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33637,6 +33747,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33721,6 +33837,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -33847,9 +33966,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34000,7 +34116,7 @@ msgstr "다시 ì‹œë„í•´ 주세요."
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34516,6 +34632,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34555,6 +34674,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34696,6 +34818,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr "%{yourAccount}를 ì˜êµ¬ì ìœ¼ë¡œ 삭제하려고 합니다. ì´ìŠˆ, 머지 리퀘스트(MR), 그리고 ë‚´ ê³„ì •ì— ì—°ê²°ëœ ê·¸ë£¹ê°€ ì‚­ì œë ê²ƒìž…니다. %{deleteAccount}ì„ í™•ì¸í•˜ë©´ ë˜ëŒë¦¬ê±°ë‚˜, 취소할 수 없습니다."
+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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr "ì‚¬ìš©ìž ì´ë¦„ì„ %{currentUsernameBold}ì—ì„œ %{newUsernameBold}으로 변경하려고 합니다. 기존 프로필과 프로ì íŠ¸ë“¤ì€ %{newUsername}으로 리디렉션ë˜ì§€ë§Œ, %{currentUsername}ê°€ 다른 유저나 ê·¸ë£¹ì— ì˜í•´ 등ë¡ë˜ë©´ ë” ì´ìƒ 리디렉션ë˜ì§€ 않습니다. ì‚¬ìš©ìž ì´ë¦„ì„ ë³€ê²½í•œ ë’¤ git ì €ìž¥ì†Œì˜ ë¦¬ëª¨íŠ¸ë¥¼ 변경하세요."
@@ -34751,7 +34876,7 @@ msgid "Profiles|Choose file..."
msgstr "íŒŒì¼ ì„ íƒ.."
msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information."
-msgstr "프로ì íŠ¸, 저장소 ë˜ëŠ” ì¡°ì§ ì •ë³´ ì—†ì´ ê³µê°œ í”„ë¡œí•„ì— ë¹„ê³µê°œ 프로ì íŠ¸ì˜ 기여ë„를 표시하려면 ì„ íƒí•©ë‹ˆë‹¤."
+msgstr ""
msgid "Profiles|City, country"
msgstr "ë„ì‹œ, êµ­ê°€"
@@ -35212,9 +35337,6 @@ msgstr "프로ì íŠ¸ ì •ë³´:"
msgid "Project information"
msgstr "프로ì íŠ¸ ì •ë³´"
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr "프로ì íŠ¸ 구성ì›"
@@ -35752,18 +35874,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -35828,7 +35938,7 @@ msgid "ProjectSettings|Note: The container registry is always visible when a pro
msgstr ""
msgid "ProjectSettings|Only commits that include a %{code_block_start}Signed-off-by:%{code_block_end} element can be pushed to this repository."
-msgstr "%{code_block_start}Signed-off-by:%{code_block_end} 요소를 í¬í•¨í•˜ëŠ” 커밋만 ì´ ì €ìž¥ì†Œë¡œ 푸시할 수 있습니다."
+msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr "ì´ ì €ìž¥ì†Œì—는 ì„œëª…ëœ ì»¤ë°‹ë§Œ 푸쉬할 수 있습니다."
@@ -35947,9 +36057,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -35971,9 +36078,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36010,10 +36114,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36496,6 +36597,9 @@ msgstr "그룹 ë¼ë²¨ë¡œ 승격"
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36511,6 +36615,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37293,9 +37400,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37368,6 +37472,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37549,7 +37656,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37561,7 +37668,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37576,18 +37683,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -37802,14 +37897,14 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
-msgstr "ì „ì²´ ë˜ëŠ” 특정 리뷰어 제거"
+msgid "Remove all or specific reviewers"
+msgstr ""
msgid "Remove approvers"
msgstr ""
@@ -38069,6 +38164,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38093,6 +38191,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38111,6 +38212,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38504,7 +38608,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -38877,9 +38981,6 @@ msgid "Reviewer"
msgid_plural "%d Reviewers"
msgstr[0] "%dëª…ì˜ ë¦¬ë·°ì–´"
-msgid "Reviewer(s)"
-msgstr "리뷰어"
-
msgid "Reviewers"
msgstr "리뷰어"
@@ -38925,12 +39026,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39079,6 +39189,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39184,10 +39297,16 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr " %{timeAgo} ì „ì— ìƒì„±ëœ %{avatar} ì— ì˜í•´ì„œ"
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39248,9 +39367,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr "프로ì íŠ¸ í•„í„°"
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr "Runners|러너 시작하기"
@@ -39423,6 +39539,10 @@ msgid "Runners|Permanently delete %d runner"
msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39676,7 +39796,8 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr "러너가 등ë¡ëœ 프로ì íŠ¸, 그룹 ë˜ëŠ” ì¸ìŠ¤í„´ìŠ¤. ì¸ìŠ¤í„´ìŠ¤ 실행기는 í•­ìƒ ê´€ë¦¬ìžê°€ 소유합니다."
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr "러너는 ì˜êµ¬ì ìœ¼ë¡œ ì‚­ì œë˜ë©° ì¸ìŠ¤í„´ìŠ¤ì˜ 프로ì íŠ¸ ë˜ëŠ” 그룹ì—ì„œ ë” ì´ìƒ 사용할 수 없습니다. ê³„ì† ì§„í–‰í•˜ì‹œê² ìŠµë‹ˆê¹Œ?"
+msgid_plural "Runners|%d 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] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -39994,11 +40115,14 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
-msgstr "ScanExecutionPolicy| %{time}ì—ì„œ%{period} %{days}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
+msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
-msgstr "%{scopes} %{branches} %{agents} %{namespaces}ì— ëŒ€í•œ %{rules} %{period}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
+msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
msgstr " %{scopes} %{branches} %{agents} %{namespaces} ì— ëŒ€í•œ 파ì´í”„ë¼ì¸ì´ 실행ë˜ëŠ” %{rules} 모든 시간"
@@ -40006,12 +40130,33 @@ msgstr " %{scopes} %{branches} %{agents} %{namespaces} ì— ëŒ€í•œ 파ì´í”„ë¼ì
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40030,6 +40175,9 @@ msgstr "스케줄:"
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr "ì—ì´ì „트 ì„ íƒ"
@@ -40045,6 +40193,9 @@ msgstr "스ìºë„ˆ 프로필 ì„ íƒ"
msgid "ScanExecutionPolicy|Select site profile"
msgstr "사ì´íŠ¸ 프로필 ì„ íƒ"
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr "사ì´íŠ¸ 프로필"
@@ -40054,6 +40205,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr "트리거:"
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr "ì—ì´ì „트"
@@ -40066,6 +40220,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr "네임스페ì´ìŠ¤ ë‚´"
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40087,6 +40247,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40135,6 +40298,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40566,7 +40732,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40590,9 +40756,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40677,9 +40840,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -40794,6 +40954,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -40917,6 +41080,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -40959,7 +41125,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41101,6 +41267,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41494,6 +41663,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41674,8 +41846,8 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
-msgstr "ë‹´ë‹¹ìž ì„ íƒ"
+msgid "Select assignees"
+msgstr ""
msgid "Select branch"
msgstr ""
@@ -41737,11 +41909,17 @@ msgstr ""
msgid "Select projects"
msgstr "프로ì íŠ¸ ì„ íƒ"
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr "ë³´ê³ ì„œ ì„ íƒ"
-msgid "Select reviewer(s)"
-msgstr "리뷰어 ì„ íƒí•˜ê¸°"
+msgid "Select reviewers"
+msgstr ""
msgid "Select severity (optional)"
msgstr ""
@@ -41887,6 +42065,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -41917,6 +42098,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -41926,6 +42110,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -41935,6 +42125,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -41962,6 +42155,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42269,6 +42468,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42353,7 +42561,7 @@ msgstr "완료 로그 표시"
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42362,9 +42570,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42672,7 +42877,7 @@ msgstr "í¬ê¸°"
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -42897,6 +43102,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43467,6 +43675,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43605,9 +43816,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -43809,9 +44017,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr "ë°°í¬ë¥¼ 모니터ë§í•˜ë„ë¡ Prometheus를 설정하여 í™˜ê²½ì˜ ì„±ëŠ¥ ë° ìƒíƒœì— 대한 최신 정보를 얻으십시오."
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -43860,7 +44065,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44295,6 +44500,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr "ì¼"
@@ -44521,10 +44732,10 @@ msgstr "스위치 브랜치/태그"
msgid "Switch to GitLab Next"
msgstr "GitLab Next로 전환"
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -44788,7 +44999,7 @@ msgstr "보호ë¨"
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -44873,6 +45084,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45043,9 +45269,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45295,9 +45518,6 @@ msgstr "ì´ìŠˆ 트래커는 프로ì íŠ¸ì—ì„œ 개선해야하거나 í•´ê²°í•´ì•
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr "ì´ìŠˆ 트래커는 프로ì íŠ¸ì—ì„œ 개선해야하거나 해결해야할 ì‚¬í•­ì„ ì¶”ê°€í•  수 있는 곳입니다. ì´ í”„ë¡œì íŠ¸ì—ì„œ ì´ìŠˆë¥¼ 만들려면 가입하거나 로그ì¸í•˜ì‹­ì‹œì˜¤."
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr "Prometheus 서버가 \"ìž˜ëª»ëœ ìš”ì²­\"으로 ì‘답했습니다. 쿼리가 정확한지, 그리고 해당 Prometheus 버전ì—ì„œ 지ì›ë˜ëŠ”지 확ì¸í•˜ì„¸ìš”. %{documentationLink}"
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45376,13 +45596,13 @@ msgstr "현재 ì´ìŠˆ"
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45576,9 +45796,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45594,9 +45820,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -45723,6 +45946,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -45805,7 +46031,7 @@ msgid "The vulnerability is no longer detected. Verify the vulnerability has bee
msgstr ""
msgid "There are currently no mirrored repositories."
-msgstr "현재 미러ë§ëœ 저장소가 없습니다."
+msgstr ""
msgid "There are merge conflicts"
msgstr ""
@@ -45951,6 +46177,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr "ì—í”½ì„ ê°€ì ¸ì˜¤ëŠ” ì¤‘ì— ë¬¸ì œê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤."
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr "ê·¸ë£¹ì„ ê°€ì ¸ì˜¤ëŠ” ì¤‘ì— ë¬¸ì œê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤."
@@ -46161,6 +46390,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46302,6 +46534,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46683,9 +46918,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr "여러 프로ì íŠ¸ì—ì„œ 정보를 ì½ì„ 수 없으므로 ì´ íŽ˜ì´ì§€ë¥¼ 사용할 수 없습니다."
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -46756,7 +46988,7 @@ msgid "This project will be deleted on %{date} since its parent group '%{parent_
msgstr ""
msgid "This project's pipeline configuration is located outside this repository"
-msgstr "ì´ í”„ë¡œì íŠ¸ì˜ 파ì´í”„ë¼ì¸ ì„¤ì •ì´ ì´ ì €ìž¥ì†Œ ì™¸ë¶€ì— ìžˆìŠµë‹ˆë‹¤."
+msgstr ""
msgid "This release was created with a date in the past. Evidence collection at the moment of the release is unavailable."
msgstr ""
@@ -46857,9 +47089,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47139,6 +47368,9 @@ msgstr "방금 전"
msgid "Timeago|right now"
msgstr "지금"
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr "타임ë¼ì¸ ì´ë²¤íŠ¸ê°€ 성공ì ìœ¼ë¡œ 추가ë˜ì—ˆìŠµë‹ˆë‹¤."
@@ -47222,14 +47454,11 @@ msgstr "제목:"
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr "제목 ë° ì„¤ëª…"
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
-msgstr "ë„ë©”ì¸ì˜ %{link_to_help} ì— ìœ„ì˜ í‚¤ë¥¼ DNS 설정 ë‚´ì˜ TXT ë ˆì½”ë“œì— ì¶”ê°€í•˜ì‹­ì‹œì˜¤."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
+msgstr ""
msgid "To Do"
msgstr "í•  ì¼ ëª©ë¡"
@@ -47297,6 +47526,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47324,9 +47556,6 @@ msgstr "시작하려면 아래 ë§í¬ë¥¼ 사용하여 ê³„ì •ì„ í™•ì¸í•˜ì„¸ìš”.
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr "SVN 저장소ì—ì„œ 가져오려면, %{svn_link}(ì„)를 확ì¸í•˜ì„¸ìš”."
@@ -47397,6 +47626,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47406,6 +47638,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47577,9 +47815,6 @@ msgstr "사ì´ë“œë°” 전환"
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47589,6 +47824,9 @@ msgstr "커밋 설명 토글"
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47637,12 +47875,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr "ë‚´ì¼"
@@ -47716,6 +47948,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr "주제를 병합할 수 없습니다!"
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48044,12 +48279,6 @@ msgstr "입력하여 검색"
msgid "URL"
msgstr "URL"
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr "URLì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤."
-
msgid "URL is required"
msgstr "URLì´ í•„ìš”í•©ë‹ˆë‹¤."
@@ -48107,9 +48336,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr "Prometheus ì„œë²„ì— ì—°ê²°í•  수 없습니다."
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48293,9 +48519,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48347,7 +48570,7 @@ msgstr ""
msgid "Unlock"
msgstr "잠금 해제"
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48368,6 +48591,9 @@ msgstr "잠금 í•´ì œë¨"
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48377,9 +48603,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48659,7 +48882,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48707,6 +48930,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr "그룹 설정 &gt; 사용 할당량"
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -48746,16 +48972,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr "파ì´í”„ë¼ì¸"
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -48815,7 +49035,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49119,6 +49345,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49272,9 +49501,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr "활ë™"
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr "팔로어를 로드하는 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. 다시 ì‹œë„하려면 페ì´ì§€ë¥¼ 새로고침하세요."
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49293,6 +49528,9 @@ msgstr "기여한 프로ì íŠ¸"
msgid "UserProfile|Copy user ID"
msgstr "ì‚¬ìš©ìž ID 복사"
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr "프로필 수정"
@@ -49374,6 +49612,9 @@ msgstr "ì´ ì‚¬ìš©ìžëŠ” 다른 사용ìžë¥¼ 팔로우하고 있지 않습니다
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr "ì‚¬ìš©ìž ID: %{id}"
@@ -49623,7 +49864,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -49749,7 +49990,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -49764,9 +50005,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr "버전"
@@ -49848,10 +50086,6 @@ msgstr ""
msgid "View card matches"
msgstr "매칭ë˜ëŠ” ì¹´ë“œ 보기"
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -49877,9 +50111,6 @@ msgstr "파ì¼ë³´ê¸° @ "
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -49934,9 +50165,6 @@ msgstr "열린 머지 리퀘스트(MR)보기"
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -49953,6 +50181,9 @@ msgstr "êµì²´ëœ íŒŒì¼ ë³´ê¸° @ "
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -49965,9 +50196,6 @@ msgstr "문서 보기"
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50322,6 +50550,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr "댓글"
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50376,6 +50607,9 @@ msgstr "파ì¼:"
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50451,6 +50685,9 @@ msgstr "심ê°ë„"
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr "ìƒíƒœ"
@@ -50508,9 +50745,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr "ì´ ë°ì´í„°ë¥¼ ë³´ê³  싶ì€ê°€ìš”? 관리ìžì—게 액세스 ê¶Œí•œì„ ìš”ì²­í•˜ì„¸ìš”."
@@ -50550,9 +50784,6 @@ msgstr "그룹 %{group}ì—ì„œ %{term} ê³¼ ì¼ì¹˜í•˜ëŠ” %{scope}를 ì°¾ì„ ìˆ˜ ì—
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr "프로ì íŠ¸ %{project}ì—ì„œ %{term} ê³¼ ì¼ì¹˜í•˜ëŠ” %{scope}를 ì°¾ì„ ìˆ˜ 없습니다."
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr "Prometheus ì„œë²„ì— ì—°ê²°í•  수 없습니다. 서버가 ë” ì´ìƒ 존재하지 않거나 설정 세부 정보를 ì—…ë°ì´íŠ¸í•´ì•¼ 합니다."
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr "%{humanized_resource_name}ì—ì„œ 잠재ì ì¸ ìŠ¤íŒ¸ì„ íƒì§€í–ˆìŠµë‹ˆë‹¤. 계ì†í•˜ë ¤ë©´ reCAPTCHA를 진행하세요."
@@ -50571,9 +50802,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -50961,6 +51189,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51273,6 +51504,9 @@ msgstr "액세스 요청 철회"
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51367,6 +51601,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51391,9 +51628,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51508,6 +51742,12 @@ msgstr "WorkItem|하위 ìž‘ì—…ì„ ì¶”ê°€í•˜ëŠ” ë™ì•ˆ 문제가 ë°œìƒí–ˆìŠµë‹ˆë
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51586,6 +51826,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51682,6 +51925,9 @@ msgstr "공개 프로ì íŠ¸ì— 대해서만 ìž‘ì—… ê³µê°„ì„ ìƒì„±í•  수 있ìŠ
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -51791,9 +52037,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr "Prometheus ì„œë²„ì— ì—°ê²°ë˜ì–´ 있지만 현재 표시할 ë°ì´í„°ê°€ 없습니다."
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52082,6 +52325,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr "ì½ê¸° ì „ìš© GitLab ì¸ìŠ¤í„´ìŠ¤ì—는 쓰기가 불가능합니다."
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52519,6 +52765,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52570,6 +52822,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52630,7 +52888,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -52788,10 +53046,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53082,7 +53343,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr "구성ì›ì´ ì‚¬ìš©ìž ì§€ì • ì—­í• ê³¼ ì—°ê²°ë˜ì–´ 있으므로 변경할 수 없습니다."
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53508,10 +53769,8 @@ msgid "closed %{timeago}"
msgstr "종료 %{timeago}"
msgid "closed issue"
-msgstr "닫힌 ì´ìŠˆ"
-
-msgid "collect usage information"
-msgstr "사용정보 수집"
+msgid_plural "closed issues"
+msgstr[0] ""
msgid "comment"
msgstr "댓글"
@@ -53730,18 +53989,6 @@ msgstr[0] "파ì¼"
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -53846,7 +54093,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -53855,6 +54102,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54038,9 +54288,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54217,9 +54464,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54339,9 +54583,6 @@ msgstr "머지 실패."
msgid "mrWidget|Merged by"
msgstr "머지:"
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54405,16 +54646,16 @@ msgstr "ì´ ë¨¸ì§€ 리퀘스트(MR)를 ìžë™ìœ¼ë¡œ ë¨¸ì§€í•˜ëŠ”ë° ì‹¤íŒ¨í•˜ì˜€
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr "ì´ ë¨¸ì§€ 리퀘스트를 승ì¸í•˜ë ¤ë©´ 비밀번호를 입력하세요. ì´ í”„ë¡œì íŠ¸ëŠ” ì¸ì¦ëœ ìƒíƒœì—서만 모든 승ì¸ì´ 가능합니다."
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54453,6 +54694,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54486,9 +54733,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54568,7 +54812,8 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr "ì´ìŠˆ 열기"
+msgid_plural "open issues"
+msgstr[0] ""
msgid "or"
msgstr ""
@@ -54889,6 +55134,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -54946,9 +55194,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55071,9 +55316,6 @@ msgstr "ë‹¹ì‹ ì˜ GitLab ì¸ìŠ¤í„´ìŠ¤"
msgid "your group (%{group_name})"
msgstr "본ì¸ì˜ 그룹 (%{group_name})"
-msgid "your settings"
-msgstr "ë‹¹ì‹ ì˜ ì„¤ì •"
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/ku_TR/gitlab.po b/locale/ku_TR/gitlab.po
index 4a3a26ca5c1..1326dbf1627 100644
--- a/locale/ku_TR/gitlab.po
+++ b/locale/ku_TR/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ku\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:44\n"
+"PO-Revision-Date: 2023-07-11 04:47\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/ky_KG/gitlab.po b/locale/ky_KG/gitlab.po
index 3005367321b..fad7d231aea 100644
--- a/locale/ky_KG/gitlab.po
+++ b/locale/ky_KG/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ky\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:47\n"
+"PO-Revision-Date: 2023-07-11 04:49\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/lt_LT/gitlab.po b/locale/lt_LT/gitlab.po
index 063366795e8..569a8e15b45 100644
--- a/locale/lt_LT/gitlab.po
+++ b/locale/lt_LT/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: lt\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:45\n"
+"PO-Revision-Date: 2023-07-11 04:47\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -107,6 +107,20 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -212,6 +226,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -464,20 +485,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -850,9 +857,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -895,6 +899,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -967,7 +974,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -991,6 +1001,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1324,6 +1337,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1351,7 +1370,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1493,9 +1512,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -2231,6 +2247,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2684,6 +2706,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2702,12 +2727,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2726,6 +2757,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2735,6 +2775,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2786,13 +2829,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2903,9 +2946,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2954,6 +2994,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -3209,6 +3252,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -3230,9 +3276,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3656,22 +3699,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator email"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3755,6 +3789,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3824,9 +3861,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3836,9 +3870,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3869,10 +3900,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3881,9 +3912,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -4106,9 +4134,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -4154,6 +4179,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -4193,7 +4221,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4463,9 +4491,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4502,7 +4527,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4607,10 +4632,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4721,9 +4746,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4760,9 +4782,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4859,6 +4878,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -5024,6 +5046,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -5075,12 +5100,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -5123,6 +5142,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -5282,9 +5307,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5403,9 +5425,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5494,7 +5513,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5560,12 +5579,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5575,7 +5603,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5614,6 +5642,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5626,6 +5666,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5644,6 +5687,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5668,6 +5717,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6477,9 +6529,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6575,6 +6624,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6629,7 +6681,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6690,9 +6742,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6836,16 +6885,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6857,19 +6912,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Filter by audit event type"
+msgstr ""
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6878,6 +6948,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6905,10 +6978,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6920,6 +6990,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7457,28 +7533,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7649,6 +7725,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7676,10 +7755,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7739,10 +7815,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7754,7 +7830,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -8054,12 +8130,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -8124,9 +8206,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -8184,6 +8263,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8601,19 +8683,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8850,6 +8941,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9346,10 +9440,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9367,10 +9461,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9394,7 +9488,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9442,13 +9539,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9490,9 +9587,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9598,7 +9692,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9614,15 +9708,18 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
@@ -9630,9 +9727,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9672,7 +9766,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9813,10 +9907,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9843,7 +9937,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9891,6 +9985,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9918,16 +10015,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9942,6 +10039,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9969,6 +10069,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10342,6 +10445,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10399,6 +10505,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10994,9 +11103,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -11081,9 +11187,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -11144,9 +11247,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11390,6 +11490,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11435,6 +11538,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11450,10 +11559,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11549,15 +11655,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11652,18 +11767,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11790,15 +11899,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11808,6 +11932,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11844,10 +11974,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -12045,6 +12178,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -12090,13 +12226,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -12153,9 +12289,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -12192,9 +12325,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12357,15 +12487,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12759,9 +12883,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12885,6 +13006,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -13014,9 +13168,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -13182,6 +13333,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -13236,9 +13390,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -13281,6 +13432,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13566,6 +13720,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13710,9 +13867,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14940,6 +15094,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -15209,6 +15369,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -15333,6 +15496,12 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15375,9 +15544,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15411,6 +15586,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15429,6 +15607,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15453,6 +15634,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15462,6 +15646,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15780,9 +15967,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15937,12 +16121,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15952,9 +16130,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16713,7 +16888,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16758,15 +16933,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -17052,6 +17227,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -17157,6 +17335,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17493,9 +17674,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17556,9 +17734,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17586,16 +17761,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
+msgstr ""
+
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17760,9 +17938,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17775,9 +17950,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17973,12 +18145,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17994,9 +18160,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18953,12 +19116,18 @@ msgstr[3] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18999,9 +19168,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -19146,6 +19312,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -19167,6 +19336,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -19233,9 +19405,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19540,6 +19709,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19771,9 +19943,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19783,6 +19952,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19967,6 +20139,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -20027,6 +20202,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -20084,6 +20262,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20704,9 +20885,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -21187,6 +21365,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -21226,6 +21407,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -21244,6 +21428,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -21256,6 +21443,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -21292,6 +21482,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21721,9 +21914,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -22015,6 +22205,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22692,12 +22885,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22812,13 +22999,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "Hide comments"
msgstr ""
@@ -22967,12 +23147,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23599,6 +23791,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23660,6 +23855,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24482,6 +24680,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24599,7 +24803,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24632,9 +24836,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25714,6 +25915,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -26071,9 +26275,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -26308,6 +26518,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -26326,6 +26539,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26491,6 +26707,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26653,6 +26872,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26716,9 +26941,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26940,6 +27162,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27592,9 +27817,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27742,7 +27964,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27808,6 +28030,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -28000,6 +28225,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -28033,6 +28261,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -28090,6 +28321,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -28114,9 +28348,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -28216,7 +28447,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -28267,7 +28498,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -28294,7 +28525,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -28303,7 +28534,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -28339,7 +28570,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -28360,7 +28591,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -28381,12 +28615,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -28411,7 +28651,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28444,7 +28684,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28795,6 +29035,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28813,6 +29056,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28930,9 +29176,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28960,9 +29203,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28987,6 +29227,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -29053,6 +29296,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -29149,9 +29404,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -29206,217 +29458,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -29426,24 +29506,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29832,6 +29900,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29868,6 +29939,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29928,9 +30002,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -30108,6 +30179,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30860,12 +30937,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -31004,9 +31075,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -31049,6 +31117,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -31194,9 +31265,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31501,6 +31569,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31606,18 +31677,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
+msgstr ""
+
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31792,6 +31869,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32472,6 +32552,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32995,6 +33081,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33565,9 +33663,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33769,6 +33864,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33778,6 +33882,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33835,9 +33942,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -34024,9 +34128,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -34138,6 +34239,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -34189,9 +34293,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -34210,7 +34311,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -34270,9 +34371,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -34339,6 +34446,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -34423,6 +34536,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34549,9 +34665,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34702,7 +34815,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -35218,6 +35331,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -35257,6 +35373,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -35398,6 +35517,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35914,9 +36036,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -36454,18 +36573,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36649,9 +36756,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36673,9 +36777,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36712,10 +36813,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -37198,6 +37296,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -37213,6 +37314,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -38001,9 +38105,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -38076,6 +38177,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -38260,7 +38364,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -38272,7 +38376,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -38287,18 +38391,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38516,13 +38608,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38783,6 +38875,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38807,6 +38902,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38825,6 +38923,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -39236,7 +39337,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39621,9 +39722,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39669,12 +39767,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39835,6 +39942,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39940,6 +40050,9 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
@@ -39947,6 +40060,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -40007,9 +40123,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -40185,6 +40298,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -40438,7 +40558,11 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d 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[3] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40759,10 +40883,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40771,12 +40898,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40795,6 +40943,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40810,6 +40961,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40819,6 +40973,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40831,6 +40988,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40852,6 +41015,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40900,6 +41066,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -41364,7 +41533,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -41388,9 +41557,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -41475,9 +41641,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41592,6 +41755,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41715,6 +41881,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41757,7 +41926,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41902,6 +42071,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -42295,6 +42467,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -42475,7 +42650,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42538,10 +42713,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42688,6 +42869,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42718,6 +42902,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42727,6 +42914,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42736,6 +42929,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42763,6 +42959,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -43073,6 +43275,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -43157,7 +43368,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -43166,9 +43377,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -43479,7 +43687,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43704,6 +43912,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -44274,6 +44485,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -44412,9 +44626,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44616,9 +44827,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44667,7 +44875,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -45102,6 +45310,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -45331,10 +45545,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45598,7 +45812,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45686,6 +45900,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45862,9 +46091,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -46123,9 +46349,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -46204,13 +46427,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -46410,9 +46633,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -46428,9 +46657,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46557,6 +46783,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46785,6 +47014,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46995,6 +47227,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -47136,6 +47371,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -47517,9 +47755,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47691,9 +47926,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47973,6 +48205,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -48062,13 +48297,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -48137,6 +48369,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -48164,9 +48399,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -48240,6 +48472,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -48249,6 +48484,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -48420,9 +48661,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -48432,6 +48670,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -48480,12 +48721,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -48562,6 +48797,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48893,12 +49131,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48956,9 +49188,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -49142,9 +49371,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -49196,7 +49422,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -49217,6 +49443,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -49226,9 +49455,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -49508,7 +49734,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -49556,6 +49782,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49595,16 +49824,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49664,7 +49887,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49971,6 +50200,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -50124,9 +50356,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -50145,6 +50383,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -50226,6 +50467,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -50475,7 +50719,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50601,7 +50845,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50616,9 +50860,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50700,13 +50941,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50735,9 +50969,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50792,9 +51023,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50814,6 +51042,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50826,9 +51057,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -51183,6 +51411,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -51237,6 +51468,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -51312,6 +51546,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -51369,9 +51606,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -51411,9 +51645,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -51432,9 +51663,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51822,6 +52050,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -52143,6 +52374,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -52240,6 +52474,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -52264,9 +52501,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -52381,6 +52615,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -52459,6 +52699,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -52555,6 +52798,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52667,9 +52913,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52958,6 +53201,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -53401,6 +53647,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -53452,6 +53704,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -53512,7 +53770,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53676,10 +53934,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53979,7 +54240,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -54429,10 +54690,11 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "comment"
msgstr ""
@@ -54663,18 +54925,6 @@ msgstr[3] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54785,7 +55035,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54794,6 +55044,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54986,9 +55239,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -55171,9 +55421,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -55299,9 +55546,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -55365,16 +55609,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -55413,6 +55657,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -55446,9 +55696,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -55528,7 +55775,11 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "or"
msgstr ""
@@ -55870,6 +56121,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55927,9 +56181,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -56058,9 +56309,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/mk_MK/gitlab.po b/locale/mk_MK/gitlab.po
index 066dee04641..69db4bff4fa 100644
--- a/locale/mk_MK/gitlab.po
+++ b/locale/mk_MK/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: mk\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:45\n"
+"PO-Revision-Date: 2023-07-11 04:47\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/ml_IN/gitlab.po b/locale/ml_IN/gitlab.po
index f5732ad42c1..eb1686b923c 100644
--- a/locale/ml_IN/gitlab.po
+++ b/locale/ml_IN/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ml-IN\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:47\n"
+"PO-Revision-Date: 2023-07-11 04:50\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/mn_MN/gitlab.po b/locale/mn_MN/gitlab.po
index 1607ce01075..e20f0bf1dbe 100644
--- a/locale/mn_MN/gitlab.po
+++ b/locale/mn_MN/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: mn\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:45\n"
+"PO-Revision-Date: 2023-07-11 04:47\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/ms_MY/gitlab.po b/locale/ms_MY/gitlab.po
index 9c3ec79802c..2b28ef97627 100644
--- a/locale/ms_MY/gitlab.po
+++ b/locale/ms_MY/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ms\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:47\n"
+"PO-Revision-Date: 2023-07-11 04:49\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -95,6 +95,14 @@ msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -155,6 +163,10 @@ msgid "%d assigned issue"
msgid_plural "%d assigned issues"
msgstr[0] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -299,14 +311,6 @@ msgid "%d more comment"
msgid_plural "%d more comments"
msgstr[0] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -562,9 +566,6 @@ msgid "%{count} project"
msgid_plural "%{count} projects"
msgstr[0] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -607,6 +608,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -679,7 +683,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -703,6 +710,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1009,6 +1019,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1036,7 +1052,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1148,9 +1164,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1805,6 +1818,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2258,6 +2277,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2276,12 +2298,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2300,6 +2328,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2309,6 +2346,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2360,13 +2400,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2477,9 +2517,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2528,6 +2565,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2783,6 +2823,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2804,9 +2847,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3230,22 +3270,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3329,6 +3360,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3398,9 +3432,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3410,9 +3441,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3443,10 +3471,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3455,9 +3483,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3680,9 +3705,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3728,6 +3750,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3767,7 +3792,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4037,9 +4062,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4076,7 +4098,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4181,10 +4203,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4295,9 +4317,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4334,9 +4353,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4433,6 +4449,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4598,6 +4617,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4649,12 +4671,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4697,6 +4713,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4856,9 +4878,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -4974,9 +4993,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5062,7 +5078,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5128,12 +5144,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5143,7 +5168,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5182,6 +5207,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5194,6 +5231,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5212,6 +5252,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5236,6 +5282,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6012,9 +6061,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6095,6 +6141,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6149,7 +6198,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6207,9 +6256,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6347,16 +6393,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6368,19 +6420,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Filter by audit event type"
+msgstr ""
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6389,6 +6456,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6416,10 +6486,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6431,6 +6498,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -6968,28 +7041,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7160,6 +7233,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7187,10 +7263,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7250,10 +7323,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7265,7 +7338,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7556,12 +7629,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7623,9 +7702,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7683,6 +7759,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8100,19 +8179,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8349,6 +8437,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -8842,10 +8933,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -8863,10 +8954,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -8890,7 +8981,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -8938,13 +9032,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -8986,9 +9080,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9094,7 +9185,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9107,22 +9198,22 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9162,7 +9253,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9303,10 +9394,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9333,7 +9424,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9381,6 +9472,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9408,16 +9502,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9432,6 +9526,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9459,6 +9556,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -9829,6 +9929,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -9886,6 +9989,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10478,9 +10584,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10565,9 +10668,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10628,9 +10728,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -10874,6 +10971,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -10919,6 +11019,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -10934,10 +11040,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11033,15 +11136,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11133,18 +11245,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11271,15 +11377,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11289,6 +11410,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11325,10 +11452,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export full report as CSV"
+msgstr ""
+
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11526,6 +11656,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11571,13 +11704,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11634,9 +11767,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11673,9 +11803,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -11838,15 +11965,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12231,9 +12352,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12357,6 +12475,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12486,9 +12637,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12654,6 +12802,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12708,9 +12859,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12753,6 +12901,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13038,6 +13189,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13182,9 +13336,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14403,6 +14554,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14666,6 +14823,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14778,6 +14938,12 @@ msgid "Dependencies|%d vulnerability detected"
msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -14820,9 +14986,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -14856,6 +15028,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -14874,6 +15049,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -14898,6 +15076,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -14907,6 +15088,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15216,9 +15400,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15370,12 +15551,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15385,9 +15560,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16131,7 +16303,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16176,15 +16348,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16470,6 +16642,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16575,6 +16750,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -16911,9 +17089,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -16974,9 +17149,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17004,16 +17176,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
+msgstr ""
+
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17178,9 +17353,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17193,9 +17365,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17391,12 +17560,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17412,9 +17575,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18365,12 +18525,18 @@ msgstr[0] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18408,9 +18574,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18555,6 +18718,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18576,6 +18742,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18642,9 +18811,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -18946,6 +19112,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19177,9 +19346,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19189,6 +19355,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19370,6 +19539,9 @@ msgid "Free groups are limited to %{free_user_limit} member and the remaining me
msgid_plural "Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group."
msgstr[0] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19430,6 +19602,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19487,6 +19662,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20101,9 +20279,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20584,6 +20759,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20623,6 +20801,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20641,6 +20822,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20653,6 +20837,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20689,6 +20876,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21118,9 +21308,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21412,6 +21599,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22083,12 +22273,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22203,10 +22387,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-
msgid "Hide comments"
msgstr ""
@@ -22352,12 +22532,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -22978,6 +23170,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23036,6 +23231,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -23858,6 +24056,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -23975,7 +24179,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24008,9 +24212,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25084,6 +25285,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25441,9 +25645,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25678,6 +25888,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25696,6 +25909,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -25861,6 +26077,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26023,6 +26242,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26086,9 +26311,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26304,6 +26526,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -26935,9 +27160,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27085,7 +27307,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27151,6 +27373,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27343,6 +27568,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27376,6 +27604,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27433,6 +27664,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27457,9 +27691,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27559,7 +27790,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27610,7 +27841,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27637,7 +27868,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27646,7 +27877,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27682,7 +27913,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27703,7 +27934,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27724,12 +27958,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27754,7 +27994,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -27787,7 +28027,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28129,6 +28369,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28147,6 +28390,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28264,9 +28510,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28294,9 +28537,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28321,6 +28561,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28387,6 +28630,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28483,9 +28738,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28540,214 +28792,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28757,24 +28840,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29160,6 +29231,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29196,6 +29270,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29256,9 +29333,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29436,6 +29510,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30182,12 +30262,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30326,9 +30400,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30371,6 +30442,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30513,9 +30587,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -30808,6 +30879,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -30913,18 +30987,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31099,6 +31179,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -31773,6 +31856,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32293,6 +32382,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -32863,9 +32964,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33067,6 +33165,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33076,6 +33183,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33133,9 +33243,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33322,9 +33429,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33436,6 +33540,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33487,9 +33594,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33508,7 +33612,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33568,9 +33672,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33637,6 +33747,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33721,6 +33837,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -33847,9 +33966,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34000,7 +34116,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34516,6 +34632,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34555,6 +34674,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34696,6 +34818,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35212,9 +35337,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35752,18 +35874,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -35947,9 +36057,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -35971,9 +36078,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36010,10 +36114,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36496,6 +36597,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36511,6 +36615,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37293,9 +37400,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37368,6 +37472,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37549,7 +37656,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37561,7 +37668,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37576,18 +37683,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -37802,13 +37897,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38069,6 +38164,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38093,6 +38191,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38111,6 +38212,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38504,7 +38608,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -38877,9 +38981,6 @@ msgid "Reviewer"
msgid_plural "%d Reviewers"
msgstr[0] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -38925,12 +39026,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39079,6 +39189,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39184,10 +39297,16 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39248,9 +39367,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39423,6 +39539,10 @@ msgid "Runners|Permanently delete %d runner"
msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39676,7 +39796,8 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d 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] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -39994,10 +40115,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40006,12 +40130,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40030,6 +40175,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40045,6 +40193,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40054,6 +40205,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40066,6 +40220,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40087,6 +40247,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40135,6 +40298,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40566,7 +40732,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40590,9 +40756,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40677,9 +40840,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -40794,6 +40954,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -40917,6 +41080,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -40959,7 +41125,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41101,6 +41267,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41494,6 +41663,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41674,7 +41846,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -41737,10 +41909,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -41887,6 +42065,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -41917,6 +42098,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -41926,6 +42110,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -41935,6 +42125,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -41962,6 +42155,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42269,6 +42468,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42353,7 +42561,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42362,9 +42570,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42672,7 +42877,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -42897,6 +43102,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43467,6 +43675,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43605,9 +43816,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -43809,9 +44017,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -43860,7 +44065,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44295,6 +44500,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44521,10 +44732,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -44788,7 +44999,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -44873,6 +45084,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45043,9 +45269,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45295,9 +45518,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45376,13 +45596,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45576,9 +45796,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45594,9 +45820,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -45723,6 +45946,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -45951,6 +46177,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46161,6 +46390,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46302,6 +46534,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46683,9 +46918,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -46857,9 +47089,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47139,6 +47368,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47222,13 +47454,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47297,6 +47526,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47324,9 +47556,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47397,6 +47626,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47406,6 +47638,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47577,9 +47815,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47589,6 +47824,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47637,12 +47875,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47716,6 +47948,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48044,12 +48279,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48107,9 +48336,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48293,9 +48519,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48347,7 +48570,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48368,6 +48591,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48377,9 +48603,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48659,7 +48882,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48707,6 +48930,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -48746,16 +48972,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -48815,7 +49035,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49119,6 +49345,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49272,9 +49501,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49293,6 +49528,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49374,6 +49612,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49623,7 +49864,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -49749,7 +49990,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -49764,9 +50005,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -49848,10 +50086,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -49877,9 +50111,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -49934,9 +50165,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -49953,6 +50181,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -49965,9 +50196,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50322,6 +50550,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50376,6 +50607,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50451,6 +50685,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50508,9 +50745,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50550,9 +50784,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50571,9 +50802,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -50961,6 +51189,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51273,6 +51504,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51367,6 +51601,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51391,9 +51628,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51508,6 +51742,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51586,6 +51826,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51682,6 +51925,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -51791,9 +52037,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52082,6 +52325,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52519,6 +52765,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52570,6 +52822,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52630,7 +52888,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -52788,10 +53046,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53082,7 +53343,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53508,10 +53769,8 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
msgid "comment"
msgstr ""
@@ -53730,18 +53989,6 @@ msgstr[0] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -53846,7 +54093,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -53855,6 +54102,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54038,9 +54288,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54217,9 +54464,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54339,9 +54583,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54405,16 +54646,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54453,6 +54694,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54486,9 +54733,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54568,7 +54812,8 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
msgid "or"
msgstr ""
@@ -54889,6 +55134,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -54946,9 +55194,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55071,9 +55316,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/nb_NO/gitlab.po b/locale/nb_NO/gitlab.po
index 0e9de7df373..d925fe590af 100644
--- a/locale/nb_NO/gitlab.po
+++ b/locale/nb_NO/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: nb\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:48\n"
+"PO-Revision-Date: 2023-07-11 04:50\n"
msgid " %{start} to %{end}"
msgstr " %{start} til %{end}"
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] "%d godkjennelse"
msgstr[1] "%d godkjennelser"
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] "%d modul"
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] "%d tildelt sak"
msgstr[1] "%d tildelte saker"
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] "%d endret fil"
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] "%d flere kommentarer"
msgstr[1] "%d flere kommentarer"
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr "%{count} relatert(e) %{pluralized_subject}: %{links}"
-
msgid "%{count} selected"
msgstr "%{count} valgt"
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr "%{docs_link_start}Hva er 2-trinnsautentisering?%{docs_link_end}"
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr "%{duration}ms"
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr "%{integrations_link_start}Integrasjoner%{link_end} lar deg gjøre tredjepartsapplikasjoner til en del av GitLab-arbeidsflyten. Hvis de tilgjengelige integrasjonene ikke tilfredsstiller dine behov, kan du vurdere å bruke en %{webhooks_link_start}webhook%{link_end}."
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr "%{italic_start}Hva er nytt%{italic_end} er inaktiv og kan ikke vises."
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr "%{itemsCount} saker med en grense på %{maxIssueCount}"
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr "%{spanStart}i linje%{spanEnd} %{errorLine}%{errorColumn}"
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr "%{spanStart}i%{spanEnd} %{errorFn}"
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr "%{start} til %{end}"
@@ -1141,8 +1158,8 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
-msgstr "%{strongOpen}!%{strongClose} SAML-gruppelenker kan føre til at GitLab automatisk fjerner medlemmer fra grupper."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
+msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
msgid_plural "%{strongStart}%{count}%{strongEnd} commits"
@@ -1263,9 +1280,6 @@ msgstr "%{type} støtter kun %{name} navn"
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr "%{userName} (kan ikke flette)"
-
msgid "%{userName}'s avatar"
msgstr "%{userName} sin avatar"
@@ -1947,6 +1961,12 @@ msgstr "Hjelpsom"
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr "Tilgangssjetonger"
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr "Er du sikker?"
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr "Opprettet"
msgid "AccessTokens|Feed token"
msgstr "Strøm-sjetong"
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr "Innkommende E-postsjetong"
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr "Sjetonger for personlig tilgang"
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr "Statisk objektssjetong"
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr "De er det eneste aksepterte passordet dersom du har 2-trinnsautentisering (2FA) skrudd på."
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr "Du kan også bruke personlige tilgangssjetonger til å autentisere til Git over HTTP."
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr "Legg til Zoom-møte"
-msgid "Add a %{type}"
-msgstr "Legg til en %{type}"
-
msgid "Add a GCP region"
msgstr "Legg til en GCP-region"
@@ -2670,6 +2708,9 @@ msgstr "Legg til en ny sak"
msgid "Add a numbered list"
msgstr "Legg til en nummerert liste"
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr "Lagt til i denne versjonen"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr "Å legge til nye applikasjoner er deaktivert i GitLab-instansen din. Ta kontakt med GitLab-administratoren din for å få tillatelse til det"
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr "Ytterligere tekst å vise på påloggingssiden"
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr "Adresse"
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr "Benytter setet"
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr "Det er deg!"
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr "Ã… reaktivere en bruker vil:"
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr "Sorter etter"
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr "Etter en vellykket passordoppdatering vil du bli omdirigert til påloggingsskjermen."
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr "Etter en vellykket passordoppdatering, vil du bli omdirigert til påloggingssiden der du kan logge på med ditt nye passord."
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr "Aktivitetsstrøm"
msgid "AlertManagement|Alert"
msgstr "Alarm"
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr "En feil oppstod under visning av varselet. Oppdater siden for å prøve
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr "En feil oppstod under visning av alarmene. Bekreft ditt endepunkts konfigurasjonsdetaljer for å sikre at alarmer vises."
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
-msgstr "En feil oppstod under oppdatering av listen over tilordnede. Vennligst prøv igjen."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
+msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr "Fortsett med å redigere"
msgid "AlertSettings|Prometheus"
msgstr "Prometheus"
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr "Tilbakestill nøkkel"
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr "Alle grener"
msgid "All changes are committed"
msgstr "Alle endringer er loggført"
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr "En feil har oppstått"
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr "En feil oppstod under tillegging av et utkast til tråden."
-
-msgid "An error occurred adding a new draft."
-msgstr "En feil oppstod under tillegging av et nytt utkast."
-
msgid "An error occurred creating the new branch."
msgstr "En feil oppstod under opprettelsen av den nye grenen."
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr "En feil oppstod under sjekking av gruppefilbanen. Vennligst oppdater og prøv igjen."
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr "En feil oppstod under dekoding av filen."
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr "En feil oppstod under innlasting av dataene. Vennligst prøv igjen."
-
msgid "An error occurred while loading the file"
msgstr "En feil oppstod under innlasting av filen"
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr "En feil oppstod under oppdatering av kommentaren"
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr "En ukjent feil har oppstått."
msgid "Analytics"
msgstr "Analyser"
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr "Data"
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr "Vert"
@@ -5287,7 +5313,7 @@ msgstr "Språk"
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr "Nettadresse"
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr "Brukere"
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr "Analyser avhengighetene dine for kjente sårbarheter."
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr "Anonym"
+msgid "Anonymous user"
+msgstr ""
+
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"
@@ -6167,9 +6217,6 @@ msgstr "Er du sikker? Å fjerne denne GPG-nøkkelen påvirker ikke commits som a
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr "Still opp diagrammer"
-
msgid "Artifact"
msgstr "Artifakt"
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,8 +6359,8 @@ msgstr ""
msgid "Assign reviewer"
msgstr "Tilordne godkjenner"
-msgid "Assign reviewer(s)"
-msgstr "Tilordne godkjenner(e)"
+msgid "Assign reviewers"
+msgstr ""
msgid "Assign severity"
msgstr "Tilordne alvorlighetsgrad"
@@ -6368,9 +6418,6 @@ msgstr "Den tilordnede har ingen tillatelser"
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr "Tilordnet(e)"
-
msgid "Assignees"
msgstr "Tilordnede"
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Filter by audit event type"
+msgstr ""
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr "Topptekst"
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr "Verdi"
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr "Aug"
@@ -7131,28 +7205,28 @@ msgstr "Fakturering"
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr "Støtte"
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ 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 "Mens GitLab avslutter tilgjengeligheten til BronSe-planen, kan du fortsatt fornye Bronse-abonnementet én siste gang før %{eoa_bronze_plan_end_date}. Vi tilbyr også en gratis oppgradering til Premium-abonnementet vårt i en kort tidsperiode (opptil 25 brukere)! Lær mer om endringene og tilbudene i vår %{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 ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr "Valider konto"
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr "Utvid"
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr "Last inn flere saker"
msgid "Board|Loading epics"
msgstr "Laster inn eposer"
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr "Fet tekst"
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr "Rød"
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr "MÃ¥lsti"
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr "Etter måned"
msgid "By quarter"
msgstr "Etter kvartal"
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr "Etter uke"
@@ -9010,11 +9102,11 @@ msgstr ""
msgid "Change assignee"
msgstr "Endre tilordnet person"
-msgid "Change assignee(s)"
-msgstr "Endre tilordnet person(er)"
+msgid "Change assignees"
+msgstr ""
-msgid "Change assignee(s)."
-msgstr "Endre tilordnet person(er)."
+msgid "Change assignees."
+msgstr ""
msgid "Change branches"
msgstr "Endre grener"
@@ -9031,11 +9123,11 @@ msgstr "Endre milepæl"
msgid "Change path"
msgstr "Endre bane"
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
-msgstr "Endre anmelder(e)."
+msgid "Change reviewers."
+msgstr ""
msgid "Change role"
msgstr "Endre rolle"
@@ -9058,8 +9150,11 @@ msgstr ""
msgid "Change your password"
msgstr "Endre ditt passord"
-msgid "Change your password or recover your current one"
-msgstr "Endre passordet ditt eller gjenopprett ditt nåværende"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
+msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
@@ -9106,14 +9201,14 @@ msgstr ""
msgid "Changed"
msgstr "Endret"
-msgid "Changed assignee(s)."
-msgstr "Endret tilordnet person(er)."
+msgid "Changed assignees."
+msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
-msgstr "Endret anmelder(e)."
+msgid "Changed reviewers."
+msgstr ""
msgid "Changed squash option to %{squash_option}"
msgstr ""
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr "Chat"
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr "%{cardType} som slutter på %{lastFourDigits}"
msgid "Checkout|%{name}'s GitLab subscription"
msgstr "%{name} sitt GitLab-abonnement"
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr "%{selectedPlanText}-plan"
@@ -9332,7 +9424,7 @@ msgstr "By"
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr "Avgift"
msgid "Checkout|Total"
msgstr "Totalt"
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr "firma eller team"
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr "Velg en type …"
msgid "Choose file…"
msgstr "Velg fil …"
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr "Lukk"
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr "Lukk %{issueType}"
@@ -10057,6 +10161,9 @@ msgstr "Lukker denne %{quick_action_target}."
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr "Cloud Run"
@@ -10650,9 +10757,6 @@ msgstr "Avanserte alternativer for denne Kubernetes-klyngens integrering"
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr "Amazon EKS"
@@ -10737,9 +10841,6 @@ msgstr "Visste du det?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr "Integrasjon er skrudd av"
msgid "ClusterIntegration|Integration enabled"
msgstr "Integrasjon er skrudd på"
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr "Kubernetes-klynge blir for øyeblikket opprettet..."
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr "Commiten ble slettet"
msgid "Commit message"
msgstr "Commit-beskjed"
-msgid "Commit message (optional)"
-msgstr "Commit-melding (valgfritt)"
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr "Commit"
@@ -11444,15 +11551,30 @@ msgstr "Det er ikke noe å sammenligne."
msgid "CompareRevisions|Branches"
msgstr "Grener"
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr "Sammenlign"
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr "Opprett en fletteforespørsel"
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr "Velg Git-revisjon"
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr "Fullført"
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,15 +11878,15 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
+msgid "Compute minutes"
+msgstr ""
+
msgid "Compute quota"
msgstr ""
msgid "Compute quota:"
msgstr ""
-msgid "Confidence"
-msgstr "Tillit"
-
msgid "Confidential"
msgstr "Konfidensiell"
@@ -11807,9 +11941,6 @@ msgstr "Konfigurer Gitaly-tidsavbrudd."
msgid "Configure Integrations"
msgstr "Sett opp integrasjoner"
-msgid "Configure Prometheus"
-msgstr "Sett opp 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 ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr "Sett opp eksisterende installasjon"
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr "Kobler til..."
-msgid "Connection failed"
-msgstr "Tilkobling mislyktes"
-
msgid "Connection failure"
msgstr "Feil ved tilkobling"
-msgid "Connection timed out"
-msgstr "Tilkoblingen ble tidsavbrutt"
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr "Innhold"
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr "For %{quickActionsDocsLinkStart}hurtighandlinger%{quickActionsDocsLinkEnd}, skriv %{keyboardStart}/%{keyboardEnd}."
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr "Totalt antall bidrag"
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr "Bidrag på %{calendar_date}"
@@ -12662,9 +12814,6 @@ msgstr "Kopier lenke"
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr "Kopier lenke til diagram"
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr "Klarte ikke å fjerne trigger."
msgid "Could not restore the group"
msgstr "Klarte ikke å gjenopprette gruppen"
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr "Opprett %{environment}"
msgid "Create %{humanized_resource_name}"
msgstr "Opprett %{humanized_resource_name}"
-msgid "Create %{type}"
-msgstr "Opprett %{type}"
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr "Opprette en ny gren"
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr "Opprett en ny fil siden det ikke er noen filer ennå. Etterpå vil du kunne utføre endringene dine."
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr "Opprett et nytt sak"
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr "Makslengden er på %{maxLength} tegn"
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr "Navn er påkrevd"
@@ -13358,9 +13513,6 @@ msgstr "Oppretter"
msgid "Creating epic"
msgstr "Oppretter epos"
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr "Opprettet av"
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr "Minsk"
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr "Slett variabel"
msgid "Delete video"
msgstr "Slett video"
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] "%d sårbarhet oppdaget"
msgstr[1] "%d sårbarheter oppdaget"
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr "%{remainingLicensesCount} til"
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr "Innpakker"
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr "Bildeliste"
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr "Ledere:"
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr "suksess"
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr "Beskrivelse"
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr "Beskrivelse (valgfritt)"
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr "Last ned (%{fileSizeReadable})"
msgid "Download (%{size})"
msgstr "Last ned (%{size})"
-msgid "Download CSV"
-msgstr "Last ned CSV"
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr "Last ned artefakter"
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr "Last ned koder"
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr "Rediger sidepanel"
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr "Rediger tabell"
@@ -16769,6 +16945,9 @@ msgstr "E-post kunne ikke sendes"
msgid "Email display name"
msgstr "E-postvisningsnavn"
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr "E-post er ikke bekreftet. Vennligst bekreft din e-post i Salesforce."
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr "Skriv inn navnet til programmet ditt, så returnerer vi en unik %{type}."
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr "Skriv inn passordet ditt for å godkjenne"
msgid "Enterprise"
msgstr "Bedrift"
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
+msgstr ""
+
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr "Jobb"
-msgid "Environments|Learn about environments"
-msgstr "Lær om miljøer"
-
msgid "Environments|Learn more about stopping environments"
msgstr "Lær mer om hvordan stoppe miljøer"
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr "Nytt miljø"
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr "Eposer, saker og fletteforespørsler"
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr "%{startDate} – %{dueDate}"
-
-msgid "Epics|%{startDate} – No due date"
-msgstr "%{startDate} – Ingen forfallsdato"
-
msgid "Epics|Add a new epic"
msgstr "Legg til et nytt epos"
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr "Ingen startdato – %{dueDate}"
-
msgid "Epics|Remove epic"
msgstr "Fjern epos"
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr "Mislyktes den"
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr "Mislyktes i å legge til et Zoom-møte"
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr "Mislyktes i å benytte kommandoer."
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr "Mislyktes i å fjerne et Zoom-møte"
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr "Mislyktes i å fjerne speilvendingen."
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr "Funksjonsflagg"
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr "Funksjonsflaggstatus"
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr "For generelt arbeid"
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr "Fra %{providerTitle}"
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr "Generer ny eksportering"
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr "Kom i gang med GitLab"
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr "Kom i gang!"
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr "https://gitpod.example.com"
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr "Lukk"
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr "Gruppe"
@@ -20842,6 +21024,9 @@ msgstr "Saker jeg har opprettet"
msgid "GlobalSearch|Issues assigned to me"
msgstr "Saker tildelt til meg"
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr "Språk"
@@ -20854,6 +21039,9 @@ msgstr "Fletteforespørsler tildelt til meg"
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr "Prosjekt"
@@ -20890,6 +21078,9 @@ msgstr "Søk på GitLab %{kbdOpen}/%{kbdClose}"
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr "GlobalSearch|Søk etter prosjekter, problemer, osv."
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr "GlobalSearch|Søkeresultater lastes inn"
@@ -21319,9 +21510,6 @@ msgstr "Gruppeinfo:"
msgid "Group information"
msgstr "Gruppeinformasjon"
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr "Gruppér jobber etter"
@@ -21613,6 +21801,9 @@ msgstr "SCIM-sjetong"
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr "Sak"
-
msgid "Headers"
msgstr "Meldingshoder"
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr "Skjul arkiverte prosjekter"
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] "Skjul diagram"
-msgstr[1] "Skjul diagrammer"
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr "Renhold"
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr "Hvordan konfigurerer jeg denne integrasjonen?"
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr "Hvordan genererer jeg den?"
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr "Uferdig"
msgid "Increase"
msgstr "Forstørr"
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,8 +24387,8 @@ msgstr "Sett inn kolonne før"
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
-msgstr "Sett inn lenke"
+msgid "Insert link (%{modifierKey}K)"
+msgstr ""
msgid "Insert or edit diagram"
msgstr ""
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr "Installer i klynger"
-
msgid "Installation"
msgstr "Installasjon"
@@ -25294,6 +25495,9 @@ msgstr "Det ser ut til at det for øyeblikket ikke er tilgjengelige data for kod
msgid "It's you"
msgstr "Det er deg"
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr "Kursiv tekst"
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr "Jobben mislyktes #%{build_id}"
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr "Jobb-artefakter"
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr "Jobb-loggføringer og -artefakter"
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr "Jobben ble forsøkt på nytt"
@@ -26071,6 +26287,9 @@ msgstr "Ingen jobber å vise"
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr "tillatt å mislykkes"
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr "Kerberos-tilgang ble nektet"
@@ -26516,6 +26738,9 @@ msgstr "Seneste %{days} dager"
msgid "Last 2 weeks"
msgstr "Seneste 2 uker"
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr "Lenken er kopiert"
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,8 +27526,8 @@ msgstr "Laster inn mer"
msgid "Loading snippet"
msgstr "Laster inn utdrag"
-msgid "Loading the GitLab IDE..."
-msgstr "Laster inn GitLab IDE …"
+msgid "Loading the GitLab IDE"
+msgstr ""
msgid "Loading, please wait."
msgstr ""
@@ -27370,6 +27592,9 @@ msgstr "LÃ¥ste filer"
msgid "Locked the discussion."
msgstr "LÃ¥ste diskusjonen."
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr "LÃ¥ser diskusjonen."
@@ -27562,6 +27787,9 @@ msgstr "Behandle prosjekter."
msgid "Manage two-factor authentication"
msgstr "Behandle 2-trinnsautentisering"
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr "Mar"
@@ -27652,6 +27883,9 @@ msgstr "Legg til kursiv tekst (%{modifierKey}I)"
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr "Legg til kursiv tekst (%{modifier_key}I)"
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr "Legg til gjennomstreket tekst (%{modifierKey}⇧X)"
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr "Støtter %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-
msgid "Marked"
msgstr ""
@@ -27778,8 +28009,8 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
-msgstr "Maks filstørrelse er 200 KB."
+msgid "Max file size is 200 KiB."
+msgstr ""
msgid "Max role"
msgstr ""
@@ -27829,7 +28060,7 @@ msgstr "Maks artefaktstørrelse (MB)"
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr "Maksforsinkelse (i minutter)"
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr "En økts maksvarighet."
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,8 +28132,8 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
-msgstr "Maks importstørrelse (MB)"
+msgid "Maximum import size (MiB)"
+msgstr ""
msgid "Maximum job artifact size"
msgstr ""
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr "Maks antall %{name} (%{count}) har blitt overskredet"
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,8 +28213,8 @@ msgstr ""
msgid "Maximum push size"
msgstr "Maks push-størrelse"
-msgid "Maximum push size (MB)"
-msgstr "Maksimal pushstørrelse (MB)"
+msgid "Maximum push size (MiB)"
+msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
msgstr ""
@@ -28006,8 +28246,8 @@ msgstr "Maksstørrelse på importfiler."
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
-msgstr "Maks sidestørrelse (MB)"
+msgid "Maximum size of pages (MiB)"
+msgstr ""
msgid "Maximum snippet size"
msgstr ""
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr "Godkjenninger av fletteforespørsel"
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr "Lagring av kommentaren mislyktes"
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr "Vis filen @ %{commitId}"
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr "Vis den erstattede filen @ %{commitId}"
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr "kommenterte på commiten %{commitLink}"
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr "MÃ¥ltall"
-
msgid "Metrics - Grafana"
msgstr "MÃ¥ltall - Grafana"
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr "Legg til måltall"
-
-msgid "Metrics|Add panel"
-msgstr "Legg til panel"
-
-msgid "Metrics|Avg"
-msgstr "Gj.snitt"
-
-msgid "Metrics|Back to dashboard"
-msgstr "Tilbake til kontrollpanelet"
-
-msgid "Metrics|Cancel"
-msgstr "Avbryt"
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr "Klapp sammen panel"
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr "Klapp sammen panel (Esc)"
-
-msgid "Metrics|Copy YAML"
-msgstr "Kopier YAML"
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr "Opprett metrikk"
-msgid "Metrics|Create new dashboard"
-msgstr "Opprett nytt kontrollpanel"
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr "Nåværende"
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr "Slett måltall"
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr "Dupliser"
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr "Dupliser det nåværende kontrollpanelet"
-
-msgid "Metrics|Duplicate dashboard"
-msgstr "Dupliser kontrollpanel"
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr "Dupliser dette kontrollpanelet for å legge til et panel eller redigere kontrollpanelets YAML."
-
-msgid "Metrics|Duplicating..."
-msgstr "Dupliserer …"
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr "Rediger kontrollpanels-YAML"
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] "Rediger måltall"
-msgstr[1] "Rediger måltall"
-
-msgid "Metrics|Expand panel"
-msgstr "Utvid panel"
+msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr "For gruppering av lignende metrikker"
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr "Maks"
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr "Min."
-
-msgid "Metrics|More actions"
-msgstr "Flere handlinger"
-
msgid "Metrics|Must be a valid PromQL query."
msgstr "Må være en gyldig PromQL-spørring."
msgid "Metrics|New metric"
msgstr "Ny metrikk"
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr "Panel-YAML"
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr "Forhåndsvisningspanel"
-
msgid "Metrics|PromQL query is valid"
msgstr "PromQL-spørringen er gyldig"
msgid "Metrics|Prometheus Query Documentation"
msgstr "Prometheus spørrings-dokumentasjon"
-msgid "Metrics|Refresh Prometheus data"
-msgstr "Oppfrisk Prometheus-data"
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr "Velg en verdi"
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr "En feil oppstod under oppretting av kontrollpanelet. %{error}"
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr "Det oppstod en feil under henting av miljødataene, prøv igjen"
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr "Det oppsto en feil ved henting av distribusjonsinformasjon."
-
-msgid "Metrics|There was an error getting environments information."
-msgstr "Det oppsto en feil ved henting av informasjon om miljøene."
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr "En feil oppstod under henting av innstillinger for variabelen «%{name}»."
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr "Det oppstod en feil ved henting av metrikker"
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr "Enhets-etikett"
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr "Brukes som tittel for diagrammet"
@@ -28980,24 +29062,12 @@ msgstr "Brukes hvis spørringen returnerer en enkelt serie. Hvis den returnerer
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr "Verdier"
-
-msgid "Metrics|View documentation"
-msgstr "Vis dokumentasjon"
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr "f.eks. HTTP-forespørsler"
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr "Lukk"
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr "Endret"
@@ -29480,9 +29556,6 @@ msgstr "Mer informasjon"
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr "Mere informasjon."
-
msgid "More options"
msgstr "Flere alternativer"
@@ -29660,6 +29733,12 @@ msgstr "Navneområde-ID:"
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr "Ingen kredittkort nødvendig."
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr "Ingen data funnet"
-
-msgid "No data to display"
-msgstr "Ingen data å vise"
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr "Ingen kodelager"
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr "Notis"
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr "Støtter %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}hurtighandlinger%{quickActionsDocsLinkEnd}, tast %{keyboardStart}/%{keyboardEnd}."
-
msgid "Notes"
msgstr "Merknader"
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr "Loggført av"
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr "Ingen forhåndsvisning for denne filtypen"
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
+msgstr ""
+
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr "Antall kopier"
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr "OK"
@@ -32006,6 +32088,12 @@ msgstr "Sortert liste"
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr "Rørledningsplanlegginger"
msgid "Pipeline URL"
msgstr "Rørlednings-URL"
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr "Aktiv"
msgid "PipelineSchedules|All"
msgstr "Alle"
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr "Er du sikker på at du vil slette denne rørledningsplanleggingen?"
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr "Sjetong"
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr "feil"
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr "ugyldig"
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr "Bestått"
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr "Bekreft E-postadressen din"
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr "Vennligst prøv igjen"
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr "den"
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 "Du er i ferd med å slette %{yourAccount} permanent, og alle sakene, fletteforespørslene og gruppene som er knyttet til kontoen din. Når du har bekreftet %{deleteAccount}, kan den ikke angres på eller gjenopprettes."
+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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr "Du er i ferd med å endre brukernavnet %{currentUsernameBold} til %{newUsernameBold}. Profilen og prosjektene blir omdirigert til %{newUsername}-navnefeltet, men denne viderekoblingen utløper når %{currentUsername}-navnene har blitt registrert av en annen bruker eller gruppe. Oppdater Git-kodelagerfjernkontrollene dine så snart som mulig."
@@ -35446,9 +35570,6 @@ msgstr "Prosjektinfo:"
msgid "Project information"
msgstr "Prosjektinformasjon"
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr "Prosjektmedlemmer"
@@ -35986,18 +36107,6 @@ msgstr "Internt"
msgid "ProjectSettings|Issues"
msgstr "Saker"
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr "Oppstrømsprosjekt"
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr "Forfrem til gruppestempel"
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr "Forfremmet saken til en epos."
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr "Forfremming er ikke støttet."
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr "Spørring"
-msgid "Query cannot be processed"
-msgstr "Spørringen kan ikke behandles"
-
msgid "Queued"
msgstr "Satt i kø"
@@ -37604,6 +37707,9 @@ msgstr "Les mer om GitLab på %{link_to_promo}."
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr "Kasse"
-
-msgid "Registration|Your GitLab group"
-msgstr "Din GitLab-gruppe"
-
-msgid "Registration|Your first project"
-msgstr "Ditt første prosjekt"
-
-msgid "Registration|Your profile"
-msgstr "Profilen din"
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr "Fjern tilgang"
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr "Forny abonnement"
msgid "Reopen"
msgstr "Åpne på nytt"
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr "Gjenåpne %{issueType}"
@@ -38331,6 +38428,9 @@ msgstr "Gjenåpne denne %{quick_action_target}"
msgid "Reopened this %{quick_action_target}."
msgstr "Gjenåpnet denne %{quick_action_target}."
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr "Erstatt alle stempler"
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr "Erstatt fil"
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr "Anmelder(e)"
-
msgid "Reviewers"
msgstr "Anmeldere"
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr "Rolle"
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr "Tilbakeføring"
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr "Ruby"
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr "Opprettet for %{timeAgo}"
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr "Opprettet for %{timeAgo} av %{avatar}"
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr "Plattform"
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr "Lagrer"
msgid "Saving project."
msgstr "Lagrer prosjekt."
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr "Tagger"
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr "SAST-analytikere"
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr "Retningslinjetype"
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr "Det oppstod en feil under tillegging av kommentaren."
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr "En feil oppstod under oppretting av saken."
@@ -41941,7 +42114,7 @@ msgstr "Velg en iterasjon"
msgid "Select assignee"
msgstr "Velg tilordnet"
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,11 +42177,17 @@ msgstr ""
msgid "Select projects"
msgstr "Velg prosjekter"
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
-msgstr "Velg anmelder(e)"
+msgid "Select reviewers"
+msgstr ""
msgid "Select severity (optional)"
msgstr ""
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr "Vis detaljer"
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr "Vis filutforsker"
msgid "Show file contents"
msgstr "Vis filens innhold"
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,8 +43147,8 @@ msgstr "Størrelse"
msgid "Size Limits"
msgstr "Størrelsesgrenser"
-msgid "Size limit per repository (MB)"
-msgstr "Størrelsesgrense per kodelager (MB)"
+msgid "Size limit per repository (MiB)"
+msgstr ""
msgid "Skip to main content"
msgstr "GÃ¥ til hovedinnholdet"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr "Filer"
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,8 +44335,8 @@ msgstr "Ukjent"
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
-msgstr "Gjennomstrek"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
+msgstr ""
msgid "Strikethrough text"
msgstr ""
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr "Søn"
@@ -44791,11 +45003,11 @@ msgstr "Bytt gren/etikett"
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
-msgstr "Bytt til Markdown"
+msgid "Switch to plain text editing"
+msgstr ""
-msgid "Switch to rich text"
-msgstr "Bytt til rik tekst"
+msgid "Switch to rich text editing"
+msgstr ""
msgid "Switch to the source to copy the file contents"
msgstr ""
@@ -45058,7 +45270,7 @@ msgstr "beskyttet"
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr "Telefonnummer"
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr "Den nåværende saken"
msgid "The current user is not authorized to access the job log."
msgstr "Den nåværende brukeren er ikke autorisert til å få tilgang til jobbloggen."
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr "Den maks tillatte filstørrelsen er %{size}."
@@ -45872,9 +46099,6 @@ msgstr "Den maks tillatte filstørrelsen er %{size}."
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr "Utdraget er bare synlig for meg."
@@ -46229,6 +46456,9 @@ msgstr "En feil oppstod under innhenting av emojier."
msgid "There was a problem fetching epics."
msgstr "En feil oppstod under innhenting av eposer."
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr "En feil oppstod under innhenting av grupper."
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr "Det oppstod en feil med reCAPTCHA-en. Vennligst løs reCAPTCHA-en på nytt."
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr "Gjennomstrømming"
@@ -47417,6 +47647,9 @@ msgstr "nå nettopp"
msgid "Timeago|right now"
msgstr "akkurat nå"
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr "Tittel:"
msgid "Titles"
msgstr "Titler"
-msgid "Titles and Descriptions"
-msgstr "Titler og beskrivelser"
-
msgid "To"
msgstr "Til"
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr "For å importere et SVN-kodelager, sjekk ut %{svn_link}."
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr "Veksle sidelinje"
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr "Veksle commit-beskrivelsen"
msgid "Toggle commit list"
msgstr "Veksle commit-listen"
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr "I morgen"
@@ -47998,6 +48231,9 @@ msgstr "Emner"
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr "Totalt"
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr "URL"
-msgid "URL cannot be blank"
-msgstr "URL-en kan ikke være blank"
-
-msgid "URL is invalid"
-msgstr "URL-en er ugyldig"
-
msgid "URL is required"
msgstr "Nettadresse er påkrevd"
@@ -48390,9 +48620,6 @@ msgstr "Klarte ikke å samle inn CPU-info"
msgid "Unable to collect memory info"
msgstr "Klarte ikke å samle inn minneinfo"
-msgid "Unable to connect to Prometheus server"
-msgstr "Klarte ikke å koble til Prometheus-tjeneren"
-
msgid "Unable to connect to server: %{error}"
msgstr "Klarte ikke å koble til tjeneren: %{error}"
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr "Misfornøyd?"
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr "d"
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr "LÃ¥s opp"
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr "LÃ¥st opp"
msgid "Unlocked the discussion."
msgstr "LÃ¥ste opp diskusjonen."
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr "LÃ¥ser opp diskusjonen."
@@ -48660,9 +48887,6 @@ msgstr "Utilgjengelig"
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr "Klyngetypen ble ikke gjenkjent"
-
msgid "Unresolve"
msgstr "Uoppklar"
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr "Rørledninger"
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr "Aktivitet"
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr "Bidratte prosjekter"
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr "Rediger profil"
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr "Ubekreftet bruker"
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr "Verifiser SAML-oppsettet"
msgid "Verify code"
msgstr "Verifiser koden"
-msgid "Verify configuration"
-msgstr "Verifiser oppsettet"
-
msgid "Version"
msgstr "Versjon"
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] "Vis diagram"
-msgstr[1] "Vis diagrammer"
-
msgid "View dependency details for your project"
msgstr "Vis avhengighetsdetaljer for prosjektet ditt"
@@ -50163,9 +50397,6 @@ msgstr "Vis fil @ "
msgid "View file @ %{commitSha}"
msgstr "Vis fil @ %{commitSha}"
-msgid "View full dashboard"
-msgstr "Vis full kontrollpanel"
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr "Vis åpne fletteforespørsler"
msgid "View page @ "
msgstr "Vis side @ "
-msgid "View performance dashboard."
-msgstr "Vis ytelseskontrollpanelet."
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr "Vis erstattet fil @ "
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr "Vis dokumentasjonen"
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr "Vis bruksdetaljer"
@@ -50609,6 +50837,9 @@ msgstr "Kodevurdering"
msgid "Vulnerability|Comments"
msgstr "Kommentarer"
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr "Fil:"
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr "Identifikator"
@@ -50738,6 +50972,9 @@ msgstr "Alvorlighetsgrad"
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr "Status"
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr "Venter på ytelsesdata"
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr "Ønsker du å se dataene? Vennligst kontakt en administrator for å få tilgang."
@@ -50837,9 +51071,6 @@ msgstr "Vi fant ingen %{scope} som samsvarer med %{term} i gruppen %{group}"
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr "Vi fant ingen %{scope} som samsvarer med %{term} i prosjektet %{project}"
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr "Forfallsdato"
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr "Mislyktes i å tildele emoji"
-
msgid "WorkItem|Health status"
msgstr "Helsestatus"
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr "Avbryt"
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr "Din tilgangsforespørsel til %{source_type} har blitt trukket tilbake."
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr "lukket saksrapport"
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr "kommentar"
@@ -54041,18 +54301,6 @@ msgstr[1] "filer"
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr "for %{link_to_merge_request} med %{link_to_merge_request_source_branch}"
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr "for %{link_to_merge_request} med %{link_to_merge_request_source_branch} til %{link_to_merge_request_target_branch}"
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr "for %{link_to_pipeline_ref}"
-
-msgid "for %{ref}"
-msgstr "for %{ref}"
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr "i"
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr "i gruppen %{link_to_group}"
msgid "in project %{link_to_project}"
msgstr "i prosjektet %{link_to_project}"
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] "instans fullført"
@@ -54354,9 +54605,6 @@ msgstr "last den inn likevel"
msgid "loading"
msgstr "laster"
-msgid "locked"
-msgstr "låst"
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr "låst av %{path_lock_user_name} %{created_at}"
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr "Fletting mislyktes."
msgid "mrWidget|Merged by"
msgstr "Flettet av"
-msgid "mrWidget|More information"
-msgstr "Mer informasjon"
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr "Denne fletteforespørsel ble ikke flettet automatisk"
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr "må være høyere enn startdatoen"
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr "Ã¥pen sak"
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr "eller"
@@ -55216,6 +55463,9 @@ msgstr "etikettnavn"
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr "det riktige formatet."
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr "låst opp"
-
msgid "updated"
msgstr "oppdatert"
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr "innstillingene dine"
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/nl_NL/gitlab.po b/locale/nl_NL/gitlab.po
index df9c9b52a75..1ebf82fcaa5 100644
--- a/locale/nl_NL/gitlab.po
+++ b/locale/nl_NL/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: nl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:45\n"
+"PO-Revision-Date: 2023-07-11 04:47\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr "Chat"
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr "Commit"
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/or_IN/gitlab.po b/locale/or_IN/gitlab.po
index 3760236601c..f5f9f193a10 100644
--- a/locale/or_IN/gitlab.po
+++ b/locale/or_IN/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: or\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:48\n"
+"PO-Revision-Date: 2023-07-11 04:50\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/pa_IN/gitlab.po b/locale/pa_IN/gitlab.po
index 25f9b202a4e..69eb8b2954c 100644
--- a/locale/pa_IN/gitlab.po
+++ b/locale/pa_IN/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: pa-IN\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:45\n"
+"PO-Revision-Date: 2023-07-11 04:47\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/pa_PK/gitlab.po b/locale/pa_PK/gitlab.po
index cc96ccde38f..6b57dc541da 100644
--- a/locale/pa_PK/gitlab.po
+++ b/locale/pa_PK/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: pa-PK\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:48\n"
+"PO-Revision-Date: 2023-07-11 04:51\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/pl_PL/gitlab.po b/locale/pl_PL/gitlab.po
index e00f611aced..862c34ea200 100644
--- a/locale/pl_PL/gitlab.po
+++ b/locale/pl_PL/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: pl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:45\n"
+"PO-Revision-Date: 2023-07-11 04:47\n"
msgid " %{start} to %{end}"
msgstr " %{start} do %{end}"
@@ -107,6 +107,20 @@ msgstr[1] "%d Zatwierdzenia"
msgstr[2] "%d Zatwierdzeń"
msgstr[3] "%d Zatwierdzenia"
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] "%d Moduł"
@@ -212,6 +226,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] "%d zmieniony plik"
@@ -464,20 +485,6 @@ msgstr[1] "%d dodatkowe komentarze"
msgstr[2] "%d dodatkowych komentarzy"
msgstr[3] "%d dodatkowego komentarza"
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -850,9 +857,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr "%{count} powiÄ…zanych %{pluralized_subject}: %{links}"
-
msgid "%{count} selected"
msgstr ""
@@ -895,6 +899,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr "%{duration}ms"
@@ -967,7 +974,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr "%{integrations_link_start}Integracje:%{link_end} pozwalają Ci użyć aplikacji firm trzecich jako część twojego workflow w GitLab. Jeśli dostępne integracje nie spełniają Twoich potrzeb, rozważ wykorzystanie %{webhooks_link_start}webhooka%{link_end}."
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -991,6 +1001,9 @@ msgstr "%{italic_start}Co nowego%{italic_end} jest nieaktywne i nie może zostaÄ
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr "%{itemsCount} problemów, z limitem %{maxIssueCount} problemów."
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1324,6 +1337,12 @@ msgstr "%{spanStart}w linii%{spanEnd} %{errorLine}%{errorColumn}"
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr "%{spanStart}w%{spanEnd} %{errorFn}"
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr "%{start} do %{end}"
@@ -1351,7 +1370,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1493,9 +1512,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr "%{userName} (nie może zmergować)"
-
msgid "%{userName}'s avatar"
msgstr "awatar użytkownika %{userName}"
@@ -2231,6 +2247,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2684,6 +2706,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2702,12 +2727,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2726,6 +2757,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr "Osobiste tokeny dostępu"
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr "Token obiektu statycznego"
@@ -2735,6 +2775,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr "Są jedynym akceptowanym hasłem, gdy masz włączone uwierzytelnianie dwuskładnikowe (2FA)."
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr "Możesz także użyć osobistych tokenów dostępu do uwierzytelnienia w Git przez HTTP."
@@ -2786,13 +2829,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2903,9 +2946,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr "Dodaj spotkanie Zoom"
-msgid "Add a %{type}"
-msgstr "Dodaj %{type}"
-
msgid "Add a GCP region"
msgstr ""
@@ -2954,6 +2994,9 @@ msgstr "Dodaj nowe zgłoszenie"
msgid "Add a numbered list"
msgstr "Dodaj listÄ™ numerowanÄ…"
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -3209,6 +3252,9 @@ msgstr "Dodano w tej wersji"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr "W Twojej instancji GitLaba wyłączono dodawanie nowych aplikacji. Aby uzyskać pozwolenie, skontaktuj się z administratorem swojego GitLaba"
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -3230,9 +3276,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr "Adres"
@@ -3656,22 +3699,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Instance runners expiration"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3755,6 +3789,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3824,9 +3861,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3836,9 +3870,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3869,10 +3900,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3881,9 +3912,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -4106,9 +4134,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -4154,6 +4179,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -4193,7 +4221,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr "Sortuj według"
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4463,9 +4491,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr "Po udanej aktualizacji hasła zostaniesz przekierowany do ekranu logowania."
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr "Po udanej aktualizacji hasła, zostaniesz przekierowany na stronę logowania, gdzie można zalogować się przy użyciu nowego hasła."
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4502,7 +4527,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr "Ostrzeżenie"
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4607,10 +4632,10 @@ msgstr "Wystąpił błąd podczas wyświetlania alertu. Odśwież stronę, aby s
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
-msgstr "Wystąpił błąd podczas aktualizacji listy przypisanych. Spróbuj ponownie."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
+msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4721,9 +4746,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4760,9 +4782,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4859,6 +4878,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -5024,6 +5046,9 @@ msgstr "Usuń również bezpośrednie członkostwo użytkownika z podgrup i proj
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -5075,12 +5100,6 @@ msgstr "Wystapił błąd"
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr "Wystąpił błąd podczas dodawania szkicu do wątku."
-
-msgid "An error occurred adding a new draft."
-msgstr "Wystąpił błąd podczas dodawania nowej wersji roboczej."
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -5123,6 +5142,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr "Wystąpił błąd podczas dekodowania pliku."
@@ -5282,9 +5307,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr "Wystąpił błąd podczas ładowania danych. Proszę, spróbuj ponownie."
-
msgid "An error occurred while loading the file"
msgstr "Wystąpił błąd podczas wczytywania pliku"
@@ -5403,9 +5425,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr "Wystąpił błąd podczas aktualizacji komentarza"
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5494,7 +5513,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5560,12 +5579,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5575,7 +5603,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5614,6 +5642,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5626,6 +5666,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5644,6 +5687,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5668,6 +5717,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6477,9 +6529,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6575,6 +6624,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6629,7 +6681,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6690,9 +6742,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6836,16 +6885,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6857,19 +6912,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Filter by audit event type"
+msgstr ""
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6878,6 +6948,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6905,10 +6978,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6920,6 +6990,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7457,28 +7533,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7649,6 +7725,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7676,10 +7755,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7739,10 +7815,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7754,7 +7830,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -8054,12 +8130,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -8124,9 +8206,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -8184,6 +8263,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8601,19 +8683,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8850,6 +8941,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9346,10 +9440,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9367,10 +9461,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9394,7 +9488,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9442,13 +9539,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9490,9 +9587,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9598,7 +9692,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9614,15 +9708,18 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
@@ -9630,9 +9727,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9672,7 +9766,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9813,10 +9907,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9843,7 +9937,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9891,6 +9985,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9918,16 +10015,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9942,6 +10039,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9969,6 +10069,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10342,6 +10445,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10399,6 +10505,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10994,9 +11103,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -11081,9 +11187,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr "Włącz lub wyłącz połączenie GitLab z klastrem Kubernetes."
@@ -11144,9 +11247,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11390,6 +11490,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11435,6 +11538,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11450,10 +11559,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11549,15 +11655,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11652,18 +11767,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11790,15 +11899,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11808,6 +11932,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11844,10 +11974,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -12045,6 +12178,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -12090,13 +12226,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -12153,9 +12289,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -12192,9 +12325,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12357,15 +12487,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12759,9 +12883,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12885,6 +13006,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -13014,9 +13168,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -13182,6 +13333,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -13236,9 +13390,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -13281,6 +13432,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13566,6 +13720,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13710,9 +13867,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14940,6 +15094,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -15209,6 +15369,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -15333,6 +15496,12 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15375,9 +15544,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15411,6 +15586,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15429,6 +15607,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15453,6 +15634,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15462,6 +15646,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15780,9 +15967,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15937,12 +16121,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15952,9 +16130,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16713,7 +16888,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16758,15 +16933,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -17052,6 +17227,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -17157,6 +17335,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17493,9 +17674,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17556,9 +17734,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17586,16 +17761,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
+msgstr ""
+
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17760,9 +17938,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17775,9 +17950,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17973,12 +18145,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17994,9 +18160,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18953,12 +19116,18 @@ msgstr[3] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18999,9 +19168,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -19146,6 +19312,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -19167,6 +19336,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -19233,9 +19405,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19540,6 +19709,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19771,9 +19943,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19783,6 +19952,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19967,6 +20139,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -20027,6 +20202,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -20084,6 +20262,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20704,9 +20885,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -21187,6 +21365,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -21226,6 +21407,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -21244,6 +21428,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -21256,6 +21443,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -21292,6 +21482,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21721,9 +21914,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -22015,6 +22205,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22692,12 +22885,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22812,13 +22999,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "Hide comments"
msgstr ""
@@ -22967,12 +23147,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23599,6 +23791,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23660,6 +23855,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24482,6 +24680,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24599,7 +24803,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24632,9 +24836,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25714,6 +25915,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -26071,9 +26275,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -26308,6 +26518,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -26326,6 +26539,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26491,6 +26707,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26653,6 +26872,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26716,9 +26941,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26940,6 +27162,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27592,9 +27817,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27742,7 +27964,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27808,6 +28030,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -28000,6 +28225,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -28033,6 +28261,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -28090,6 +28321,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -28114,9 +28348,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -28216,7 +28447,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -28267,7 +28498,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -28294,7 +28525,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -28303,7 +28534,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -28339,7 +28570,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -28360,7 +28591,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -28381,12 +28615,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -28411,7 +28651,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28444,7 +28684,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28795,6 +29035,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28813,6 +29056,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28930,9 +29176,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28960,9 +29203,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28987,6 +29227,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -29053,6 +29296,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -29149,9 +29404,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -29206,217 +29458,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -29426,24 +29506,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29832,6 +29900,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29868,6 +29939,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29928,9 +30002,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -30108,6 +30179,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30860,12 +30937,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -31004,9 +31075,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -31049,6 +31117,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -31194,9 +31265,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31501,6 +31569,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31606,18 +31677,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
+msgstr ""
+
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31792,6 +31869,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32472,6 +32552,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32995,6 +33081,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33565,9 +33663,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33769,6 +33864,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33778,6 +33882,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33835,9 +33942,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -34024,9 +34128,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -34138,6 +34239,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -34189,9 +34293,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -34210,7 +34311,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -34270,9 +34371,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -34339,6 +34446,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -34423,6 +34536,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34549,9 +34665,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34702,7 +34815,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -35218,6 +35331,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -35257,6 +35373,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -35398,6 +35517,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35914,9 +36036,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -36454,18 +36573,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36649,9 +36756,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36673,9 +36777,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36712,10 +36813,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -37198,6 +37296,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -37213,6 +37314,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -38001,9 +38105,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -38076,6 +38177,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -38260,7 +38364,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -38272,7 +38376,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -38287,18 +38391,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38516,13 +38608,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38783,6 +38875,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38807,6 +38902,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38825,6 +38923,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -39236,7 +39337,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39621,9 +39722,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39669,12 +39767,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39835,6 +39942,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39940,6 +40050,9 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
@@ -39947,6 +40060,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -40007,9 +40123,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -40185,6 +40298,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -40438,7 +40558,11 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d 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[3] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40759,10 +40883,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40771,12 +40898,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40795,6 +40943,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40810,6 +40961,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40819,6 +40973,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40831,6 +40988,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40852,6 +41015,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40900,6 +41066,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -41364,7 +41533,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -41388,9 +41557,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -41475,9 +41641,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41592,6 +41755,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41715,6 +41881,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41757,7 +41926,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41902,6 +42071,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -42295,6 +42467,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -42475,7 +42650,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42538,10 +42713,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42688,6 +42869,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42718,6 +42902,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42727,6 +42914,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42736,6 +42929,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42763,6 +42959,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -43073,6 +43275,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -43157,7 +43368,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -43166,9 +43377,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -43479,7 +43687,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43704,6 +43912,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -44274,6 +44485,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -44412,9 +44626,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44616,9 +44827,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44667,7 +44875,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -45102,6 +45310,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -45331,10 +45545,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45598,7 +45812,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45686,6 +45900,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45862,9 +46091,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -46123,9 +46349,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -46204,13 +46427,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -46410,9 +46633,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -46428,9 +46657,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46557,6 +46783,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46785,6 +47014,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46995,6 +47227,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -47136,6 +47371,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -47517,9 +47755,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47691,9 +47926,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47973,6 +48205,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -48062,13 +48297,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -48137,6 +48369,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -48164,9 +48399,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -48240,6 +48472,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -48249,6 +48484,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -48420,9 +48661,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -48432,6 +48670,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -48480,12 +48721,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -48562,6 +48797,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48893,12 +49131,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48956,9 +49188,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -49142,9 +49371,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -49196,7 +49422,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -49217,6 +49443,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -49226,9 +49455,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -49508,7 +49734,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -49556,6 +49782,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49595,16 +49824,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49664,7 +49887,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49971,6 +50200,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -50124,9 +50356,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -50145,6 +50383,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -50226,6 +50467,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -50475,7 +50719,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50601,7 +50845,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50616,9 +50860,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50700,13 +50941,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50735,9 +50969,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50792,9 +51023,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50814,6 +51042,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50826,9 +51057,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -51183,6 +51411,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -51237,6 +51468,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -51312,6 +51546,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -51369,9 +51606,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -51411,9 +51645,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -51432,9 +51663,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51822,6 +52050,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -52143,6 +52374,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -52240,6 +52474,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -52264,9 +52501,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -52381,6 +52615,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -52459,6 +52699,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -52555,6 +52798,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52667,9 +52913,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52958,6 +53201,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -53401,6 +53647,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -53452,6 +53704,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -53512,7 +53770,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53676,10 +53934,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53979,7 +54240,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -54429,10 +54690,11 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "comment"
msgstr ""
@@ -54663,18 +54925,6 @@ msgstr[3] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54785,7 +55035,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54794,6 +55044,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54986,9 +55239,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -55171,9 +55421,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -55299,9 +55546,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -55365,16 +55609,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -55413,6 +55657,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -55446,9 +55696,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -55528,7 +55775,11 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "or"
msgstr ""
@@ -55870,6 +56121,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55927,9 +56181,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -56058,9 +56309,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/pt_BR/gitlab.po b/locale/pt_BR/gitlab.po
index ed37138751a..d9b74a39cf6 100644
--- a/locale/pt_BR/gitlab.po
+++ b/locale/pt_BR/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: pt-BR\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:46\n"
+"PO-Revision-Date: 2023-07-11 04:49\n"
msgid " %{start} to %{end}"
msgstr " %{start} até %{end}"
@@ -61,7 +61,7 @@ msgid " or %{emphasisStart}&epic id%{emphasisEnd}"
msgstr " ou %{emphasisStart}&id do épico%{emphasisEnd}"
msgid " or references"
-msgstr ""
+msgstr " ou referências"
msgid " reacted with :%{name}:"
msgstr " reagiu com :%{name}"
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] "%d Aprovação"
msgstr[1] "%d Aprovações"
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] "%d Issue"
+msgstr[1] "%d Issues"
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] "%d Solicitação de mesclagem"
+msgstr[1] "%d Solicitações de mesclagem"
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] "%d Módulo"
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] "%d tarefa não atribuído"
msgstr[1] "%d tarefas não atribuídas"
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] "%d arquivo alterado"
@@ -281,8 +296,8 @@ msgstr[1] "%d grupos"
msgid "%d group found"
msgid_plural "%d groups found"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d grupo encontrado"
+msgstr[1] "%d grupos encontrados"
msgid "%d hour"
msgid_plural "%d hours"
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] "mais %d comentário"
msgstr[1] "mais %d comentários"
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] "%d issue aberta"
-msgstr[1] "%d issues abertas"
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] "%d pacote"
@@ -446,8 +451,8 @@ msgstr[1] "%d tópicos não resolvidos"
msgid "%d version"
msgid_plural "%d versions"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d versão"
+msgstr[1] "%d versões"
msgid "%d vulnerability"
msgid_plural "%d vulnerabilities"
@@ -486,8 +491,8 @@ msgstr[1] "%d advertências encontradas:"
msgid "%d work item"
msgid_plural "%d work items"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d item de trabalho"
+msgstr[1] "%d itens de trabalho"
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
@@ -495,10 +500,10 @@ msgstr[0] "%s commit adicional foi omitido para prevenir problemas de performanc
msgstr[1] "%s commits adicionais foram omitidos para prevenir problemas de performance."
msgid "%{actionText} %{actionDetail}"
-msgstr ""
+msgstr "%{actionText} %{actionDetail}"
msgid "%{actionText} %{actionDetail} %{timeago} by %{author}"
-msgstr ""
+msgstr "%{actionText} %{actionDetail} %{timeago} por %{author}"
msgid "%{actionText} & %{openOrClose} %{noteable}"
msgstr "%{actionText} & %{openOrClose} %{noteable}"
@@ -658,14 +663,11 @@ msgid_plural "%{count} projects"
msgstr[0] "%{count} projeto"
msgstr[1] "%{count} projetos"
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr "%{count} %{pluralized_subject} relacionados: %{links}"
-
msgid "%{count} selected"
msgstr "%{count} selecionado"
msgid "%{count} tags"
-msgstr ""
+msgstr "%{count} marcadores"
msgid "%{count} total weight"
msgstr "%{count} peso total"
@@ -695,7 +697,7 @@ msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
msgstr "%{docs_link_start}Aprenda sobre os níveis de visibilidade.%{docs_link_end}"
msgid "%{docs_link_start}Setting up a verified domain%{docs_link_end} requires being linked to a project."
-msgstr ""
+msgstr "%{docs_link_start}Configurar um domínio verificado%{docs_link_end} requer estar vinculado a um projeto."
msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
msgstr "%{docs_link_start}O que é armazenamento de arquivos grandes?%{docs_link_end}"
@@ -703,6 +705,9 @@ msgstr "%{docs_link_start}O que é armazenamento de arquivos grandes?%{docs_link
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr "%{docs_link_start}O que é autenticação de dois fatores?%{docs_link_end}"
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr "%{duration}, na fila por %{queuedDuration} segundo"
+
msgid "%{duration}ms"
msgstr "%{duration}ms"
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr "%{integrations_link_start}Integrações%{link_end} permitem que aplicativos de terceiros façam parte do seu fluxo de trabalho do GitLab. Se as integrações disponíveis não atenderem às suas necessidades, considere usar um %{webhooks_link_start}webhook%{link_end}."
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr "%{italic_start}Novidades%{italic_end} está inativo e não pode ser vist
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr "%{itemsCount} issues com um limite de %{maxIssueCount}"
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -908,7 +919,7 @@ msgid "%{milliseconds}ms"
msgstr "%{milliseconds}ms"
msgid "%{minutesUsed} units"
-msgstr ""
+msgstr "%{minutesUsed} unidades"
msgid "%{model_name} not found"
msgstr "%{model_name} não encontrado"
@@ -1114,6 +1125,12 @@ msgstr "%{spanStart}na linha%{spanEnd} %{errorLine}%{errorColumn}"
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr "%{spanStart}em%{spanEnd} %{errorFn}"
+msgid "%{startDate} – %{dueDate}"
+msgstr "%{startDate} - %{dueDate}"
+
+msgid "%{startDate} – No due date"
+msgstr "%{startDate} - Sem validade"
+
msgid "%{start} to %{end}"
msgstr "%{start} até %{end}"
@@ -1141,8 +1158,8 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
-msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
+msgstr "%{strongOpen}Aviso:%{strongClose} links de grupo SAML podem fazer com que o GitLab altere automaticamente as funções dos membros ou remova membros dos grupos."
msgid "%{strongStart}%{count}%{strongEnd} commit"
msgid_plural "%{strongStart}%{count}%{strongEnd} commits"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr "%{url} (opcional)"
-msgid "%{userName} (cannot merge)"
-msgstr "%{userName} (não pode mesclar)"
-
msgid "%{userName}'s avatar"
msgstr "Avatar de %{userName}"
@@ -1947,6 +1961,12 @@ msgstr "Útil"
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr "Não vejo como posso ajudar. Por favor, dê instruções melhores!"
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr "Pode fornecer respostas inadequadas que não representam as opiniões do GitLab. Não insira dados pessoais."
+
+msgid "AI|New chat"
+msgstr "Novo chat"
+
msgid "AI|Populate issue description"
msgstr "Preencher descrição da descrição"
@@ -2050,7 +2070,7 @@ msgid "APIFuzzing|Enter the name of the CI variable containing the username. For
msgstr ""
msgid "APIFuzzing|File path or URL to APIs to be tested. For example, folder/example_fuzz.har. HAR files may contain sensitive information such as authentication tokens, API keys, and session cookies. We recommend that you review the HAR files' contents before adding them to a repository."
-msgstr ""
+msgstr "O caminho do arquivo ou URL para APIs a serem testados. Por exemplo, pasta/exemplo_fuzz.har. Arquivos HAR podem conter informações sensíveis como tokens de autenticação, chaves API e cookies de sessão. Recomendamos que você revise o conteúdo dos arquivos HAR antes de adicioná-los a um repositório."
msgid "APIFuzzing|File path or URL to OpenAPI specification. For example, folder/openapi.json or http://www.example.com/openapi.json."
msgstr ""
@@ -2227,34 +2247,34 @@ msgid "AbuseReport|Comments"
msgstr "Comentários"
msgid "AbuseReport|Confirm"
-msgstr ""
+msgstr "Confirmar"
msgid "AbuseReport|Confirmed crypto mining"
-msgstr ""
+msgstr "Cripto mineração confirmada"
msgid "AbuseReport|Confirmed offensive or abusive behavior"
-msgstr ""
+msgstr "Comportamento ofensivo ou abusivo confirmado"
msgid "AbuseReport|Confirmed phishing"
-msgstr ""
+msgstr "Phishing confirmado"
msgid "AbuseReport|Confirmed posting of malware"
-msgstr ""
+msgstr "Postagem de malware confirmada"
msgid "AbuseReport|Confirmed posting of personal information or credentials"
-msgstr ""
+msgstr "Postagem de informação pessoal ou credencial confirmada"
msgid "AbuseReport|Confirmed spam"
-msgstr ""
+msgstr "Spam confirmado"
msgid "AbuseReport|Confirmed violation of a copyright or a trademark"
-msgstr ""
+msgstr "Violação de direitos autorais ou marca registrada confirmada"
msgid "AbuseReport|Credit card"
msgstr "Cartão de crédito"
msgid "AbuseReport|Delete user"
-msgstr ""
+msgstr "Excluir usuário"
msgid "AbuseReport|Email"
msgstr "E-mail"
@@ -2284,7 +2304,7 @@ msgid "AbuseReport|Member since"
msgstr "Membro desde"
msgid "AbuseReport|No action"
-msgstr ""
+msgstr "Nenhuma ação"
msgid "AbuseReport|No user found"
msgstr "Nenhum usuário encontrado"
@@ -2296,16 +2316,16 @@ msgid "AbuseReport|Phone"
msgstr "Telefone"
msgid "AbuseReport|Reason"
-msgstr ""
+msgstr "Motivo"
msgid "AbuseReport|Registered with name %{name}."
-msgstr ""
+msgstr "Registrado com o nome%{name}."
msgid "AbuseReport|Reported by"
msgstr "Relatado por"
msgid "AbuseReport|Reported by %{name} for %{category}."
-msgstr ""
+msgstr "Relatado por %{name} por %{category}."
msgid "AbuseReport|Reported comment"
msgstr "Comentário reportado"
@@ -2317,7 +2337,7 @@ msgid "AbuseReport|Reported issue"
msgstr "Issue relatada"
msgid "AbuseReport|Reported merge request"
-msgstr ""
+msgstr "Solicitação de mesclagem relatado"
msgid "AbuseReport|Reported profile"
msgstr "Perfil relatado"
@@ -2326,10 +2346,10 @@ msgid "AbuseReport|Screenshot of reported abuse"
msgstr "Captura de tela do abuso relatado"
msgid "AbuseReport|Snippets"
-msgstr ""
+msgstr "Snippets"
msgid "AbuseReport|Something else"
-msgstr ""
+msgstr "Algo mais"
msgid "AbuseReport|Tier"
msgstr ""
@@ -2362,7 +2382,7 @@ msgid "Access Tokens"
msgstr "Tokens de acesso"
msgid "Access denied"
-msgstr ""
+msgstr "Acesso negado"
msgid "Access denied for your LDAP account."
msgstr "Acesso negado para sua conta LDAP."
@@ -2400,6 +2420,9 @@ msgstr "Token de acesso"
msgid "AccessTokens|Access token limit reached"
msgstr "Limite de token de acesso atingido"
+msgid "AccessTokens|Add a %{type}"
+msgstr "Adicionar um %{type}"
+
msgid "AccessTokens|Are you sure?"
msgstr "Você tem certeza?"
@@ -2418,12 +2441,18 @@ msgstr "Copiar token de e-mail recebido"
msgid "AccessTokens|Copy static object token"
msgstr "Copiar token de objeto estático"
+msgid "AccessTokens|Create %{type}"
+msgstr "Criar %{type}"
+
msgid "AccessTokens|Created"
msgstr "Criado"
msgid "AccessTokens|Feed token"
msgstr "Token de feed"
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr "O nome da aplicação que vai usar o token ou seu propósito, por exemplo. Não coloque informações sensíveis no nome do token. Ele vai estar visível a todos os membros de %{resource_type}."
+
msgid "AccessTokens|Incoming email token"
msgstr "Token de e-mail recebido"
@@ -2442,6 +2471,15 @@ msgstr "Mantenha este token em segredo. Qualquer pessoa que o tenha pode ler a a
msgid "AccessTokens|Personal Access Tokens"
msgstr "Token de acesso pessoal"
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr "Escopos definem os níveis de permissão concedidos ao token."
+
+msgid "AccessTokens|Select a role"
+msgstr "Selecione uma função"
+
+msgid "AccessTokens|Select scopes"
+msgstr "Selecionar escopos"
+
msgid "AccessTokens|Static object token"
msgstr "Token de objeto estático"
@@ -2451,6 +2489,9 @@ msgstr "A última vez que um token foi usado"
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr "Eles são a única senha aceita quando você tem a autenticação de dois fatores (2FA) ativada."
+msgid "AccessTokens|Token name"
+msgstr "Nome do token"
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr "Você também pode usar tokens de acesso pessoal para autenticar no Git por HTTP."
@@ -2502,14 +2543,14 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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 "Para usar unidades de computação gratuitas em corredores compartilhados, você precisará validar sua conta usando uma de nossas opções de verificação. Se preferir, você pode executar pipelines trazendo seus próprios executores e desativando os executores compartilhados para seu projeto."
+msgid "AccountValidation|In order to use free compute 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 "Para usar minutos de computação gratuitos em executores compartilhados, você precisará validar sua conta usando uma de nossas opções de verificação. Se preferir, você pode executar pipelines trazendo seus próprios executores e desativando os executores compartilhados para seu projeto."
msgid "AccountValidation|Learn more."
msgstr "Saiba mais."
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
-msgstr "Parece que você precisará validar sua conta para usar unidades de computação gratuitas"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
+msgstr "Parece que você precisará validar sua conta para usar os minutos de computação gratuitos"
msgid "AccountValidation|Validate your account"
msgstr "Validar sua conta"
@@ -2533,7 +2574,7 @@ msgid "Achievements|Awarded %{timeAgo} by %{namespace}"
msgstr "Premiado há %{timeAgo} por %{namespace}"
msgid "Achievements|Awarded %{timeAgo} by a private namespace"
-msgstr ""
+msgstr "Premiado há %{timeAgo} por um espaço de nome privado"
msgid "Achievements|View your achievements on your %{link_start}profile%{link_end}."
msgstr "Veja suas conquistas em seu %{link_start}perfil%{link_end}."
@@ -2548,7 +2589,7 @@ msgid "Action"
msgstr "Ação"
msgid "Action '%{action}' in registry %{registry_id} entry is not supported."
-msgstr ""
+msgstr "A ação '%{action}' no registro de entrada %{registry_id} não é suportada"
msgid "Action not allowed."
msgstr "Ação não permitida."
@@ -2619,9 +2660,6 @@ msgstr "Adicionar wiki"
msgid "Add Zoom meeting"
msgstr "Adicionar uma reunião do Zoom"
-msgid "Add a %{type}"
-msgstr "Adicionar um %{type}"
-
msgid "Add a GCP region"
msgstr "Adicionar região de GCP"
@@ -2670,6 +2708,9 @@ msgstr "Adicionar uma nova issue"
msgid "Add a numbered list"
msgstr "Adicionar uma lista numerada"
+msgid "Add a quick action"
+msgstr "Adicionar uma ação rápida"
+
msgid "Add a related epic"
msgstr "Adicionar um épico relacionado"
@@ -2925,6 +2966,9 @@ msgstr "Adicionado nesta versão"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr "A adição de novos aplicativos está desativada na sua instância do GitLab. Entre em contato com seu administrador do GitLab para obter a permissão"
+msgid "Additional compute minutes:"
+msgstr "Minutos adicionais de computação:"
+
msgid "Additional diagram formats"
msgstr ""
@@ -2932,7 +2976,7 @@ msgid "Additional text"
msgstr "Texto adicional"
msgid "Additional text for deactivation email"
-msgstr ""
+msgstr "Texto adicional para e-mail de desativação"
msgid "Additional text for the sign-in and Help page."
msgstr "Texto adicional para a página de login e ajuda."
@@ -2944,10 +2988,7 @@ msgid "Additional text to show on the sign-in page"
msgstr "Texto adicional para mostrar na página de entrada"
msgid "Additional units"
-msgstr ""
-
-msgid "Additional units of compute:"
-msgstr "Unidades adicionais de computação:"
+msgstr "Unidades adicionais"
msgid "Address"
msgstr "Endereço"
@@ -3004,7 +3045,7 @@ msgid "Admin Notifications"
msgstr "Notificações do administrador"
msgid "Admin message"
-msgstr ""
+msgstr "Mensagem do administrador"
msgid "Admin mode"
msgstr ""
@@ -3181,7 +3222,7 @@ msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "Erro ao carregar as estatísticas. Por favor, tente novamente"
msgid "AdminEmail|An error occurred fetching the groups and projects. Please refresh the page to try again."
-msgstr ""
+msgstr "Erro ao buscar grupos e projetos. Por favor, atualize a página para tentar novamente."
msgid "AdminEmail|Body"
msgstr "Corpo"
@@ -3372,24 +3413,15 @@ msgstr "Se não houver nenhum índice existente, o GitLab cria um."
msgid "AdminSettings|Import sources"
msgstr "Importar fontes"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
+msgstr "Melhore a taxa de transferência de indexação sem código, enfileirando trabalhos do Sidekiq até que todos os documentos sejam processados."
+
msgid "AdminSettings|Inactive project deletion"
msgstr "Exclusão de projeto inativo"
msgid "AdminSettings|Instance runners expiration"
msgstr "Expiração dos executores da instância"
-msgid "AdminSettings|Jitsu administrator email"
-msgstr "E-mail do administrador do Jitsu"
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr "Senha do administrador do Jitsu"
-
-msgid "AdminSettings|Jitsu host"
-msgstr ""
-
-msgid "AdminSettings|Jitsu project ID"
-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"
@@ -3471,6 +3503,9 @@ msgstr "Proteger variáveis CI/CD por padrão"
msgid "AdminSettings|Registration Features include:"
msgstr "Recursos de registro incluem:"
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr "Exigir que os usuários comprovem a propriedade de domínios personalizados"
@@ -3540,9 +3575,6 @@ msgstr "A configuração deve ser maior que 0."
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr "Configurações de tamanho e domínio para sites estáticos do Pages."
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr "O caminho de conexão de sua instância do configurador de análise de p
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr "O domínio padrão a ser usado para os estágios de Auto Review Apps e Auto Deploy em todos os projetos."
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr "O host de sua instância do coletor de dados."
@@ -3585,10 +3614,10 @@ msgstr "Número total de tarefas em pipelines ativos no momento"
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr "Usar o AWS OpenSearch Service com credenciais do IAM"
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
+msgstr "Use para migrações de cluster e índice. Quando a indexação é pausada, o GitLab ainda rastreia as alterações."
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr "Usuários e grupos devem aceitar o convite antes de serem adicionados a um grupo ou projeto."
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr "Quando pausado, o GitLab ainda acompanha as alterações. Isso é útil para migrações de cluster/índice."
-
msgid "AdminSettings|When to delete inactive projects"
msgstr "Quando excluir projetos inativos"
@@ -3822,9 +3848,6 @@ msgstr "Informações importantes sobre o uso em sua instância do GitLab"
msgid "AdminUsers|Is using seat"
msgstr "Está usando acento"
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr "Iissues e solicitações de mesclagem criadas por este usuário estão ocultas de outros usuários."
-
msgid "AdminUsers|It's you!"
msgstr "É você!"
@@ -3868,7 +3891,10 @@ msgid "AdminUsers|Personal projects, group and user history will be left intact"
msgstr "Projetos pessoais, histórico de usuários e de grupos permanecerão intactos"
msgid "AdminUsers|Private profile"
-msgstr ""
+msgstr "Perfil privado"
+
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr "Projetos, issues, solicitações de mesclagem e comentários deste usuário estão ocultos para outros usuários."
msgid "AdminUsers|Reactivating a user will:"
msgstr "Reativar um usuário irá:"
@@ -3909,7 +3935,7 @@ msgstr "Skype"
msgid "AdminUsers|Sort by"
msgstr "Ordenar por"
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,20 +4205,17 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr "Após uma atualização de senha bem-sucedida, você será redirecionado para a tela de entrada."
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr "Após uma atualização de senha bem sucedida, você será redirecionado para a página de entrada onde você pode entrar com sua nova senha."
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr "Depois de removido, o relacionamento de bifurcação só pode ser restaurado usando a API. Este projeto não poderá mais receber ou enviar solicitações de mesclagem para o fluxo de subida do projeto ou outras bifurcações."
msgid "After the Apple App Store Connect integration is activated, the following protected variables will be created for CI/CD use."
-msgstr ""
+msgstr "Depois que a integração do Apple App Store Connect for ativada, as seguintes variáveis protegidas serão criadas para uso de CI/CD."
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 "Depois que a exportação for concluída, baixe o arquivo de dados do e-mail de notificação ou desta página. Você pode então importar o arquivo de dados na página %{strong_text_start}Criar novo grupo%{strong_text_end} de outra instância do GitLab."
msgid "After you enable the integration, the following protected variable is created for CI/CD use:"
-msgstr ""
+msgstr "Depois de ativar a integração, a seguinte variável protegida é criada para uso de CI/CD:"
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr "Feed de atividades"
msgid "AlertManagement|Alert"
msgstr "Alerta"
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
-msgstr ""
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
+msgstr "Ocorreu um erro ao atualizar a lista de destinatários. Por favor, tente novamente."
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr "Prosseguir com a edição"
msgid "AlertSettings|Prometheus"
msgstr "Prometheus"
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr "Redefinir chave"
@@ -4476,9 +4496,6 @@ msgstr "O formulário tem alterações não salvas. Como você gostaria de proce
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr "Para criar um mapeamento customizado, insira um exemplo de carga útil de sua ferramenta de monitoramento, no formato JSON. Selecione o botão \"Analisar campos de carga útil\" para continuar."
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr "URL não pode ficar em branco e deve começar com http: ou https :."
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr "Use o URL e a chave de autorização abaixo para configurar como o Prometheus envia alertas para o GitLab. Revise a documentação %{linkStart}%{linkEnd} para aprender como configurar seu endpoint."
@@ -4575,6 +4592,9 @@ msgstr "Todas as ramificações"
msgid "All changes are committed"
msgstr "Houve commit com todas as mudanças"
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr "Todos os usuários elegíveis"
@@ -4669,7 +4689,7 @@ msgid "Allow password authentication for the web interface"
msgstr "Permitir autenticação de senha para a interface web"
msgid "Allow possible spam"
-msgstr ""
+msgstr "Permitir possível spam"
msgid "Allow project maintainers to configure repository mirroring"
msgstr "Permitir mantenedores do projeto de configurar o espelhamento do projeto"
@@ -4687,7 +4707,7 @@ msgid "Allow use of licensed EE features"
msgstr "Permitir o uso de funcionalidades da licença EE"
msgid "Allow users to extend their session"
-msgstr ""
+msgstr "Permitir que usuário estendam sua sessão"
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr "Permitir que os usuários registrem qualquer aplicativo para usar o GitLab como um provedor OAuth"
@@ -4740,6 +4760,9 @@ msgstr "Também remover a associação de usuário direta de subgrupos e projeto
msgid "Also unassign this user from related issues and merge requests"
msgstr "Também desatribuir este usuário de issues relacionadas e solicitações de mesclagem"
+msgid "Alt text"
+msgstr "Texto alternativo"
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr "URL de suporte alternativo para a página de Ajuda e lista suspensa de Ajuda."
@@ -4791,12 +4814,6 @@ msgstr "Ocorreu um erro"
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr "Ocorreu um erro ao adicionar um rascunho à discussão."
-
-msgid "An error occurred adding a new draft."
-msgstr "Ocorreu um erro ao adicionar um novo rascunho."
-
msgid "An error occurred creating the new branch."
msgstr "Um erro ocorreu ao criar o novo branch."
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr "Ocorreu um erro ao verificar o diretório do grupo. Atualize e tente novamente."
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr "Ocorreu um erro ao decodificar o arquivo."
@@ -4998,9 +5021,6 @@ msgstr "Um erro ocorreu durante o carregamento de projetos."
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr "Ocorreu um erro ao carregar os dados. Por favor, tente novamente."
-
msgid "An error occurred while loading the file"
msgstr "Erro ao carregar o arquivo"
@@ -5117,9 +5137,6 @@ msgstr "Ocorreu um erro ao atualizar a configuração."
msgid "An error occurred while updating labels."
msgstr "Ocorreu um erro ao atualizar as etiquetas."
-msgid "An error occurred while updating the comment"
-msgstr "Ocorreu um erro durante a atualização do comentário"
-
msgid "An error occurred while updating the configuration."
msgstr "Ocorreu um erro ao atualizar a configuração."
@@ -5167,8 +5184,8 @@ msgstr "Uma issue já existe"
msgid "An issue has been assigned to you."
msgid_plural "%d issues have been assigned to you."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Uma nova issue foi atribuída a você."
+msgstr[1] "%d novas issue foram atribuídas a você."
msgid "An unauthenticated user"
msgstr "Um usuário não autenticado"
@@ -5195,7 +5212,7 @@ msgid "An unexpected error occurred while stopping the Web Terminal."
msgstr "Ocorreu um erro inesperado ao parar o terminal da web."
msgid "An unexpected error occurred. Please try again."
-msgstr ""
+msgstr "Ocorreu um erro inesperado. Tente novamente."
msgid "An unknown error occurred while loading this graph."
msgstr "Ocorreu um erro desconhecido ao carregar este gráfico."
@@ -5206,8 +5223,8 @@ msgstr "Ocorreu um erro desconhecido."
msgid "Analytics"
msgstr "Telemetria"
-msgid "Analytics|Add to Dashboard"
-msgstr "Adicionar ao Painel"
+msgid "Analytics|A visualization with that name already exists."
+msgstr "Já existe uma visualização com esse nome."
msgid "Analytics|Add visualizations"
msgstr "Adicionar visualizações"
@@ -5272,12 +5289,21 @@ msgstr "Dados"
msgid "Analytics|Data Table"
msgstr "Tabela de dados"
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr "Editar"
+msgid "Analytics|Enter a visualization name"
+msgstr "Insira um nome de visualização"
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,8 +5313,8 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr "Gráfico de linhas"
-msgid "Analytics|New Analytics Visualization Title"
-msgstr ""
+msgid "Analytics|New analytics visualization name"
+msgstr "Novo nome de visualização de análise"
msgid "Analytics|New dashboard"
msgstr ""
@@ -5326,6 +5352,18 @@ msgstr "Dados resultantes"
msgid "Analytics|Save"
msgstr "Salvar"
+msgid "Analytics|Save and add to Dashboard"
+msgstr "Salvar e adicionar ao painel"
+
+msgid "Analytics|Save new visualization"
+msgstr "Salvar nova visualização"
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr "Estatística única"
@@ -5338,6 +5376,9 @@ msgstr "URL"
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr "Atualizando a visualização %{visualizationName}"
+
msgid "Analytics|Users"
msgstr "Usuários"
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr "Tipo de visualização"
+msgid "Analytics|Visualization designer"
+msgstr "Designer de visualização"
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr "Visualização foram salvas com sucesso"
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr "Analise suas dependências em busca de vulnerabilidades conhecidas."
@@ -5380,6 +5427,9 @@ msgstr "E esse token de registro:"
msgid "Anonymous"
msgstr "Anônimo"
+msgid "Anonymous user"
+msgstr ""
+
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"
@@ -5444,10 +5494,10 @@ msgid "AppleAppStore|Leave empty to use your current Private Key."
msgstr "Deixe em branco para usar sua chave privada atual."
msgid "AppleAppStore|Only set variables on protected branches and tags"
-msgstr ""
+msgstr "Apenas defina variáveis em ramificações e tags protegidas"
msgid "AppleAppStore|Protected branches and tags only"
-msgstr ""
+msgstr "Apenas ramificações e tags protegidas"
msgid "AppleAppStore|The Apple App Store Connect Issuer ID."
msgstr "O ID do emissor da Apple App Store Connect."
@@ -5459,7 +5509,7 @@ msgid "AppleAppStore|The Apple App Store Connect Private Key (.p8)"
msgstr "A Chave privada da Apple App Store Connect (.p8)"
msgid "AppleAppStore|Upload a new Apple App Store Connect Private Key (replace %{currentFileName})"
-msgstr ""
+msgstr "Faça o upload de uma nova chave privada de conexão da Apple App Store (substitua %{currentFileName})"
msgid "AppleAppStore|Use GitLab to build and release an app in the Apple App Store."
msgstr "Use o GitLab para criar e lançar um aplicativo na Apple App Store."
@@ -5905,7 +5955,7 @@ msgid "Approve"
msgstr "Aprovar"
msgid "Approve All"
-msgstr ""
+msgstr "Aprovar tudo"
msgid "Approve a merge request"
msgstr "Aprovar uma solicitação de mesclagem"
@@ -6167,9 +6217,6 @@ msgstr "Você tem certeza? A remoção dessa chave GPG não afeta commits já as
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr "Tem certeza? O dispositivo será desconectado do GitLab e todas os tokens de lembrar-me revogados."
-msgid "Arrange charts"
-msgstr "Organizar gráficos"
-
msgid "Artifact"
msgstr "Artefato"
@@ -6189,8 +6236,8 @@ msgstr[1] "%d artefatos selecionados excluídos"
msgid "Artifacts|%{strongStart}%{count}%{strongEnd} artifact selected"
msgid_plural "Artifacts|%{strongStart}%{count}%{strongEnd} artifacts selected"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{strongStart}%{count}%{strongEnd} artefato selecionado"
+msgstr[1] "%{strongStart}%{count}%{strongEnd} artefatos selecionados"
msgid "Artifacts|An error occurred while deleting the artifact"
msgstr ""
@@ -6253,6 +6300,9 @@ msgid "Artifacts|Total artifacts size"
msgstr "Tamanho total dos artefatos"
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
+msgstr "Queremos que você possa usar esta página para gerenciar facilmente seus artefatos de trabalho de CI/CD. Estamos trabalhando para melhorar essa experiência e agradecemos qualquer feedback que você tenha sobre as melhorias que estamos fazendo."
+
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
msgstr ""
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
@@ -6309,8 +6359,8 @@ msgstr "Atribuir a mim"
msgid "Assign reviewer"
msgstr "Atribuir revisor"
-msgid "Assign reviewer(s)"
-msgstr "Atribuir revisor(es)"
+msgid "Assign reviewers"
+msgstr "Atribuir revisores"
msgid "Assign severity"
msgstr "Atribuir severidade"
@@ -6368,9 +6418,6 @@ msgstr "O responsável não tem acesso"
msgid "Assignee lists not available with your current license"
msgstr "Quadro de responsáveis não disponível com sua licença atual"
-msgid "Assignee(s)"
-msgstr "Responsável(is)"
-
msgid "Assignees"
msgstr "Responsáveis"
@@ -6510,17 +6557,23 @@ msgstr "Ocorreu um erro ao buscar streams de eventos de auditoria externa. Por f
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr "Tem certeza sobre a exclusão deste destino?"
+
msgid "AuditStreams|Cancel editing"
msgstr "Cancelar edição"
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr "Cabeçalhos HTTP personalizados (opcional)"
-msgid "AuditStreams|Defines which streaming events are captured"
-msgstr ""
+msgid "AuditStreams|Delete destination"
+msgstr "Excluir destino"
-msgid "AuditStreams|Delete %{link}"
-msgstr "Excluir %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
+msgstr "Excluir o destino de transmissão %{destination} interromperá os eventos de auditoria sendo transmitidos"
msgid "AuditStreams|Destination URL"
msgstr "URL de destino"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr "Destinatário recebeu todos os dados do eventos de auditoria"
-msgid "AuditStreams|Edit %{link}"
-msgstr "Editar %{link}"
-
msgid "AuditStreams|Event filtering (optional)"
msgstr ""
+msgid "AuditStreams|Filter by audit event type"
+msgstr ""
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr "Registro do Google Cloud"
+
+msgid "AuditStreams|HTTP endpoint"
+msgstr ""
+
msgid "AuditStreams|Header"
msgstr "Cabeçalho"
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr "Nenhum cabeçalho criado ainda."
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr "Remover cabeçalho personalizado"
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr "Selecionar eventos"
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr "Configurar streaming para eventos de auditoria"
@@ -6579,11 +6650,8 @@ msgstr "Valor"
msgid "AuditStreams|Verification token"
msgstr "Token de verificação"
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr "Token de verificação para o fluxo %{link}"
-
-msgid "AuditStreams|View verification token"
-msgstr "Ver token de verificação"
+msgid "AuditStreams|audit-events"
+msgstr ""
msgid "AuditStreams|ex: 1000"
msgstr ""
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr "Ago"
@@ -6817,7 +6891,7 @@ msgid "Automatically update this project's branches and tags from the upstream r
msgstr "Atualiza automaticamente os branches e tags deste projeto do repositório upstream."
msgid "Automation"
-msgstr ""
+msgstr "Automação"
msgid "Automation|Automation App"
msgstr ""
@@ -7131,29 +7205,29 @@ msgstr "Cobrança"
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr "%{group_name} está atualmente usando o %{plan_name}"
-msgid "BillingPlans|10,000 units of compute per month"
-msgstr "10.000 unidades de computação por mês"
+msgid "BillingPlans|10,000 compute minutes per month"
+msgstr "10.000 minutos de computação por mês"
-msgid "BillingPlans|10000 units of compute"
-msgstr "10000 unidades de computação"
+msgid "BillingPlans|10000 compute minutes"
+msgstr "10000 minutos de computação"
msgid "BillingPlans|10GB transfer per month"
msgstr "Tansferência de 10 GB por mês"
-msgid "BillingPlans|400 units of compute"
-msgstr "400 unidades de computação"
+msgid "BillingPlans|400 compute minutes"
+msgstr "400 minutos de computação"
-msgid "BillingPlans|400 units of compute per month"
-msgstr "400 unidades de computação por mês"
+msgid "BillingPlans|400 compute minutes per month"
+msgstr "400 minutos de computação por mês"
msgid "BillingPlans|5 users per namespace"
msgstr "5 usuários por espaço de nome"
-msgid "BillingPlans|50,000 units of compute per month"
-msgstr "50,000 unidades de computação por mês"
+msgid "BillingPlans|50,000 compute minutes per month"
+msgstr "50.000 minutos de computação por mês"
-msgid "BillingPlans|50000 units of compute"
-msgstr "50000 unidades de computação"
+msgid "BillingPlans|50000 compute minutes"
+msgstr "50000 minutos de computação"
msgid "BillingPlans|5GB storage"
msgstr "5GB de armazenamento"
@@ -7323,6 +7397,9 @@ msgstr "Suporte"
msgid "BillingPlans|Talk to an expert today."
msgstr "Fale hoje com um especialista."
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr "Esse grupo usa o plano associado com seu grupo pai."
@@ -7350,11 +7427,8 @@ msgstr "Estamos aqui para ajudar."
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 "Enquanto o GitLab está terminando a disponibilidade do plano Bronze, você ainda pode renovar sua assinatura Bronze mais um tempo antes de %{eoa_bronze_plan_end_date}. Também estamos oferecendo uma atualização gratuita por tempo limitado para o nosso Plano Premium (até 25 usuários)! Saiba mais sobre as mudanças e ofertas em nosso %{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 "Você não tem nenhum grupo. Você precisará %{create_group_link_start}criar um%{create_group_link_end} e %{move_link_start}mover este projeto para ele%{move_link_end}."
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
-msgstr "Você terá que %{move_link_start}mover este projeto%{move_link_end} para um de seus grupos."
+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 your projects to it%{move_link_end}."
+msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr "Sua avaliação do GitLab.com %{plan} vai %{strong_open}expirar após %{expiration_date}%{strong_close}. Você pode manter o acesso aos recursos do %{plan} atualizando abaixo."
@@ -7413,11 +7487,11 @@ msgstr "Assentos em uso / Assentos na assinatura"
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."
-msgid "Billings|To use free units of compute 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 "Para usar unidades de computação gratuitas em corredores compartilhados, você precisará validar sua conta com um cartão de crédito. Se preferir não fornecer um, você pode executar pipelines trazendo seus próprios executores e desativando os executores compartilhados para seu projeto. Isso é necessário para desencorajar e reduzir o abuso na infraestrutura do GitLab. %{strongStart}O GitLab não debitará seu cartão, ele será usado apenas para validação.%{strongEnd} %{linkStart}Saiba mais%{linkEnd}."
+msgid "Billings|To use free compute 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 "Para usar minutos de computação gratuitos em executores compartilhados, você precisará validar sua conta com um cartão de crédito. Se preferir não fornecer um, você pode executar pipelines trazendo seus próprios executores e desativando os executores compartilhados para seu projeto. Isso é necessário para desencorajar e reduzir o abuso na infraestrutura do GitLab. %{strongStart}O GitLab não debitará seu cartão, ele será usado apenas para validação.%{strongEnd} %{linkStart}Saiba mais%{linkEnd}."
-msgid "Billings|To use free units of compute 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 "Para usar unidades de computação gratuitas em corredores compartilhados, você precisará validar sua conta com um cartão de crédito. Isso é necessário para desencorajar e reduzir o abuso na infraestrutura do GitLab. %{strongStart}O GitLab não debitará seu cartão, ele será usado apenas para validação.%{strongEnd}"
+msgid "Billings|To use free compute 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 "Para usar minutos de computação gratuitos em executores compartilhados, você precisará validar sua conta com um cartão de crédito. Isso é necessário para desencorajar e reduzir o abuso na infraestrutura do GitLab. %{strongStart}O GitLab não debitará seu cartão, ele será usado apenas para validação.%{strongEnd}"
msgid "Billings|User validation required"
msgstr "Validação de usuário necessária"
@@ -7428,8 +7502,8 @@ msgstr "Validar conta"
msgid "Billings|Validate user account"
msgstr "Validar conta de usuário"
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
-msgstr "Agora você poderá aproveitar as unidades de computação gratuitas em executores compartilhados."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
+msgstr "Agora você poderá aproveitar os minutos de computação gratuitos em executores compartilhados."
msgid "Billings|Your account has been validated"
msgstr "A sua conta foi validada."
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr "Ocorreu um erro ao buscar os grupos. Por favor, tente novamente."
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr "Ocorreu um erro ao buscar a issues. Por favor recarregue a página ."
@@ -7790,9 +7870,6 @@ msgstr "Expandir"
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr "Lista de ações"
-
msgid "Boards|Move card"
msgstr "Mover cartão"
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr "Carregando épicos"
+msgid "Bold (%{modifierKey}B)"
+msgstr "Negrito (%{modifierKey})"
+
msgid "Bold text"
msgstr "Texto em negrito"
@@ -7896,7 +7976,7 @@ msgid "Branch not loaded - %{branchId}"
msgstr "Branch não carregado - %{branchId}"
msgid "Branch rules"
-msgstr ""
+msgstr "Regras de ramificação"
msgid "BranchRules|%{linkStart}Wildcards%{linkEnd} such as *-stable or production/ are supported"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr "Vermelho"
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr "Mostrar apenas para usuários que possuem funções específicas em grupos/páginas de projetos"
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr "Mostrar para todos os usuários em todas as páginas"
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr "Mostrar para todos os usuários em páginas correspondentes específicas"
+
msgid "BroadcastMessages|Starts at"
msgstr "Começa em"
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
-msgstr ""
+msgid "BroadcastMessages|Target broadcast message"
+msgstr "Mensagem de transmissão de destino"
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr "Por mês"
msgid "By quarter"
msgstr "por trimestre"
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr "Por semana"
@@ -9010,11 +9102,11 @@ msgstr "Taxa de falha de mudança"
msgid "Change assignee"
msgstr "Alterar responsável"
-msgid "Change assignee(s)"
-msgstr "Alterar responsável(eis)"
+msgid "Change assignees"
+msgstr ""
-msgid "Change assignee(s)."
-msgstr "Alterar responsável(eis)."
+msgid "Change assignees."
+msgstr ""
msgid "Change branches"
msgstr "Mudar branches"
@@ -9031,11 +9123,11 @@ msgstr "Alterar marco"
msgid "Change path"
msgstr "Alterar caminho"
-msgid "Change reviewer(s)"
-msgstr "Alterar revisor(es)"
+msgid "Change reviewers"
+msgstr "Alterar revisores"
-msgid "Change reviewer(s)."
-msgstr "Alterar revisor(es)"
+msgid "Change reviewers."
+msgstr "Alterar revisores."
msgid "Change role"
msgstr "Alterar cargo"
@@ -9058,8 +9150,11 @@ msgstr ""
msgid "Change your password"
msgstr "Altere sua senha"
-msgid "Change your password or recover your current one"
-msgstr "Altere sua senha ou recupere sua senha atual"
+msgid "Change your password or recover your current one."
+msgstr "Altere sua senha ou recupere sua senha atual."
+
+msgid "Change your password."
+msgstr "Altere sua senha."
msgid "ChangeReviewer|All reviewers were removed."
msgstr "Todos os revisores foram removidos."
@@ -9106,14 +9201,14 @@ msgstr "Suas mudanças serão confirmadas para %{branchName} porque a sua solici
msgid "Changed"
msgstr "Alterado"
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr "Método de mesclagem alterado para %{merge_method}"
-msgid "Changed reviewer(s)."
-msgstr "Revisor(es) alterados."
+msgid "Changed reviewers."
+msgstr "Revisores alterados."
msgid "Changed squash option to %{squash_option}"
msgstr ""
@@ -9154,9 +9249,6 @@ msgstr "Caracteres restantes"
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr "Bate-papo"
@@ -9262,8 +9354,8 @@ msgstr "$%{pricePerUserPerYear} por usuário e ano"
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr "$%{selectedPlanPrice} pelo pacote de 10GB de armazenamento por ano."
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
-msgstr "$%{selectedPlanPrice} por pacote de 1.000 unidades de computação"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
+msgstr "$%{selectedPlanPrice} por pacote de 1.000 minutos de computação"
msgid "Checkout|%d compute pack"
msgid_plural "Checkout|%d compute packs"
@@ -9276,23 +9368,23 @@ msgstr "%{cardType} terminando em %{lastFourDigits}"
msgid "Checkout|%{name}'s GitLab subscription"
msgstr "Assinatura do GitLab de %{name}"
+msgid "Checkout|%{name}'s compute minutes"
+msgstr ""
+
msgid "Checkout|%{name}'s storage subscription"
msgstr "Assinatura de armazenamento de %{name}"
-msgid "Checkout|%{name}'s units of compute"
-msgstr ""
-
msgid "Checkout|%{quantity} GB of storage"
msgstr "%{quantity} GB de armazenamento"
+msgid "Checkout|%{quantity} compute minutes"
+msgstr "%{quantity} minutos de computação"
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] "%{quantity} de pacote de armazenamento"
msgstr[1] "%{quantity} de pacotes de armazenamento"
-msgid "Checkout|%{quantity} units of compute"
-msgstr "%{quantity} unidades de computação"
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr "plano %{selectedPlanText}"
@@ -9332,7 +9424,7 @@ msgstr "Cidade"
msgid "Checkout|Compute pack"
msgstr "Pacote de computação"
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,12 +9565,12 @@ msgstr "Impostos"
msgid "Checkout|Total"
msgstr "Total"
+msgid "Checkout|Total compute minutes: %{quantity}"
+msgstr "Total de minutos de computação: %{quantity}"
+
msgid "Checkout|Total storage: %{quantity} GB"
msgstr "Total de armazenamento: %{quantity} GB"
-msgid "Checkout|Total units of compute: %{quantity}"
-msgstr "Total de unidades de cálculo: %{quantity}"
-
msgid "Checkout|Users"
msgstr "Usuários"
@@ -9503,8 +9595,8 @@ msgstr "uma assinatura de armazenamento"
msgid "Checkout|company or team"
msgstr "empresa ou equipe"
-msgid "Checkout|units of compute"
-msgstr "unidades de computação"
+msgid "Checkout|compute minutes"
+msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
msgstr "x %{quantity} %{units} por pacote"
@@ -9551,6 +9643,9 @@ msgstr "Escolha um tipo..."
msgid "Choose file…"
msgstr "Escolher arquivo…"
+msgid "Choose protected branch"
+msgstr "Escolher ramificação protegida"
+
msgid "Choose the top-level group for your repository imports."
msgstr "Escolha o grupo principal para importar seus repositórios."
@@ -9578,17 +9673,17 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr "Sobre este projeto"
+msgid "CiCatalog|CI/CD Catalog"
+msgstr "Catálogo CI/CD"
+
msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
-msgstr "Catálogo CI/CD"
-
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
-msgstr ""
+msgid "CiCatalog|Get started with the CI/CD Catalog"
+msgstr "Introdução ao Catálogo CI/CD"
msgid "CiCatalog|Go to the project"
msgstr "Ir para o projeto"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr "Nenhuma versão disponível"
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr "Clone essa issue, sem comentários, para %{project}."
msgid "Close"
msgstr "Fechar"
+msgid "Close %{issuableType}"
+msgstr "Fechar %{issuableType}"
+
msgid "Close %{issueType}"
msgstr "Fechar %{issueType}"
@@ -10057,6 +10161,9 @@ msgstr "Fecha este %{quick_action_target}."
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr "Fechando %{issuableType}..."
+
msgid "Cloud Run"
msgstr "Cloud Run"
@@ -10650,9 +10757,6 @@ msgstr "Opções avançadas na integração deste cluster Kubernetes"
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr "Permitir ao GitLab gerenciar espaços de nome e contas de serviço para este cluster."
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr "Permitir ao GitLab consultar um Prometheus especificamente configurado no cluster para obter métricas."
-
msgid "ClusterIntegration|Amazon EKS"
msgstr "Amazon EKS"
@@ -10737,9 +10841,6 @@ msgstr "Você sabia?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr "Elastic Kubernetes Service"
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr "Ativar integração do Prometheus"
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr "Ative ou desative conexão do GitLab com seu cluster Kubernetes."
@@ -10800,9 +10901,6 @@ msgstr "Integração desativada"
msgid "ClusterIntegration|Integration enabled"
msgstr "Integração ativada"
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr "O cluster do Kubernetes está sendo criado..."
@@ -11046,6 +11144,9 @@ msgstr "Atribuir usuários e grupos como aprovadores para alterações específi
msgid "CodeOwners|Code owners"
msgstr "Proprietários de código"
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr "Ocultar tudo"
@@ -11091,6 +11192,12 @@ msgstr "Ative as sugestões de código para esta instância. Ao ativar esse recu
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr "Seu token de acesso pessoal do GitLab.com. Consulte a %{link_start}documentação%{link_end} para obter informações sobre como criar um token de acesso pessoal."
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr "%{code_suggestions_link_start}Sugestões de código%{link_end} agora usa serviços de IA de terceiros para fornecer sugestões de maior qualidade. Você pode %{third_party_link_start} desativar serviços de terceiros%{link_end} para o seu grupo, ou desabilitar totalmente as Sugestões de Código %{profile_settings_link_start}em seu perfil de usuário%{link_end}."
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr "Usamos serviços de IA de terceiros para melhorar as sugestões de código."
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr "%{link_start}O que são sugestões de código?%{link_end}"
@@ -11106,11 +11213,8 @@ msgstr "Obtenha sugestões de código enquanto escreve código em seu IDE. %{lin
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr "Projetos neste grupo podem usar sugestões de código"
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr "Sujeito aos %{link_start}termos de uso de teste%{link_end}"
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
-msgstr "Sujeito aos %{link_start}termos de uso de teste%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
+msgstr "Sujeito aos %{terms_link_start}termos de uso de yeste%{link_end}. As sugestões de código atualmente usam serviços de IA de terceiros, a menos que estejam desabilitados %{third_party_features_link_start}%{link_end}."
msgid "Cohorts|Inactive users"
msgstr "Usuários inativos"
@@ -11200,20 +11304,29 @@ msgid "Command line instructions"
msgstr "Instruções de linha de comando"
msgid "CommandPalette|Global Commands"
-msgstr ""
+msgstr "Comandos globais"
msgid "CommandPalette|Pages"
-msgstr ""
+msgstr "Páginas"
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
-msgstr ""
+msgid "CommandPalette|Project files"
+msgstr "Arquivos de projeto"
-msgid "CommandPalette|Users"
-msgstr "Usuários"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
+msgstr "Digite %{commandHandle} para comando, %{userHandle} para usuário, %{projectHandle} para projeto, %{pathHandle} para arquivo de projeto ou faça uma pesquisa genérica..."
msgid "CommandPalette|command"
msgstr "comando"
+msgid "CommandPalette|go to project file"
+msgstr "ir para o arquivo do projeto"
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr "issue (insira pelo menos 3 caracteres)"
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr "projeto (insira pelo menos 3 caracteres)"
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr "usuário (insira pelo menos 3 caracteres)"
@@ -11306,18 +11419,12 @@ msgstr "Commit excluído"
msgid "Commit message"
msgstr "Mensagem de commit"
-msgid "Commit message (optional)"
-msgstr "Mensagem de commit (opcional)"
-
msgid "Commit message generated by AI"
msgstr "Mensagem de commit gerado por IA"
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr "Estatísticas de commits para %{ref} %{start_time} - %{end_time}"
-msgid "Commit to %{branchName} branch"
-msgstr "Commit para a branch %{branchName}"
-
msgid "CommitBoxTitle|Commit"
msgstr "Commit"
@@ -11444,15 +11551,30 @@ msgstr "Não há nada para comparar."
msgid "CompareRevisions|Branches"
msgstr "Branches"
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr "Alterações são mostradas como se a revisão%{boldEnd} da fonte %{boldStart}estivesse sendo mesclada na revisão%{boldEnd} do destino %{boldStart}. %{linkStart}Saiba mais sobre como comparar revisões.%{linkEnd}"
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr "Comparar"
+msgid "CompareRevisions|Compare revisions"
+msgstr "Comparar revisões"
+
msgid "CompareRevisions|Create merge request"
msgstr "Criar solicitações de mesclagem"
msgid "CompareRevisions|Filter by Git revision"
msgstr "Filtrar por revisão do Git"
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr "Incluir alterações no destino desde que a origem foi criada"
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr "Apenas alterações recebidas da fonte"
+
msgid "CompareRevisions|Select Git revision"
msgstr "Selecionar revisão do Git"
@@ -11462,6 +11584,12 @@ msgstr "Selecionar ramificação/tag"
msgid "CompareRevisions|Select target project"
msgstr "Selecionar projeto alvo"
+msgid "CompareRevisions|Show changes"
+msgstr "Mostrar alterações"
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr "Completo"
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr "Completado em %{duration_seconds} segundos (%{relative_time})"
-msgid "Compliance Report|Export as CSV"
-msgstr "Exportar como CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr "Exportar estruturas como CSV. Você receberá um e-mail após o processamento da exportação."
+
+msgid "Compliance Report|Export full report as CSV"
+msgstr "Exportar relatório completo como CSV"
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr "Menos de 2 aprovadores"
msgid "ComplianceReport|No projects found"
msgstr "Nenhum projeto encontrado"
+msgid "ComplianceReport|No projects found that match filters"
+msgstr "Nenhum projeto encontrado que corresponda aos filtros"
+
msgid "ComplianceReport|No violations found"
msgstr "Nenhuma violação encontrada"
@@ -11744,15 +11878,15 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
+msgid "Compute minutes"
+msgstr ""
+
msgid "Compute quota"
msgstr ""
msgid "Compute quota:"
msgstr "Cota de computação:"
-msgid "Confidence"
-msgstr "Confiança"
-
msgid "Confidential"
msgstr "Confidencial"
@@ -11807,9 +11941,6 @@ msgstr "Configurar timeouts do Gitaly."
msgid "Configure Integrations"
msgstr "Configurar integrações"
-msgid "Configure Prometheus"
-msgstr "Configurar 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 ""
@@ -11846,9 +11977,6 @@ msgstr "Configure permissões avançadas, armazenamento de arquivos grandes, aut
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr "Configurar instalação existente"
-
msgid "Configure pipeline"
msgstr "Configurar pipeline"
@@ -12011,15 +12139,9 @@ msgstr "Conectando ao ambiente remoto..."
msgid "Connecting..."
msgstr "Conectando..."
-msgid "Connection failed"
-msgstr "A conexão falhou"
-
msgid "Connection failure"
msgstr "Falha na conexão"
-msgid "Connection timed out"
-msgstr "A conexão expirou"
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12097,7 +12219,7 @@ msgid "ContainerRegistry|Cleanup is disabled for this project"
msgstr "A limpeza está desativada para este projeto"
msgid "ContainerRegistry|Cleanup is not scheduled."
-msgstr ""
+msgstr "A limpeza não está agendada."
msgid "ContainerRegistry|Cleanup is ongoing"
msgstr "A limpeza está em andamento"
@@ -12407,9 +12529,6 @@ msgstr "Conteúdo"
msgid "Content parsed with %{link}."
msgstr "Conteúdo analisado com %{link}."
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr "Para %{quickActionsDocsLinkStart}ações rápidas%{quickActionsDocsLinkEnd}, digite %{keyboardStart}/%{keyboardEnd}."
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr "Há muitos dados para calcular. Tente diminuir a configuração period_l
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr "Solicitação de mesclagem aprovada %{targetLink} em %{resourceParentLink}."
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr "Iniciou o projeto %{resourceParentLink}."
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr "Removido devido à expiração da associação de %{resourceParentLink}."
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr "Contribuições para %{calendar_date}"
@@ -12662,9 +12814,6 @@ msgstr "Copiar link"
msgid "Copy link URL"
msgstr "Copiar URL do link"
-msgid "Copy link to chart"
-msgstr "Copiar link para o gráfico"
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr "Não foi possível remover o gatilho."
msgid "Could not restore the group"
msgstr "Não foi possível restaurar o grupo"
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr "Não foi possível revogar o token de acesso %{access_token_name}."
@@ -12884,9 +13036,6 @@ msgstr "Criar %{environment}"
msgid "Create %{humanized_resource_name}"
msgstr "Criar %{humanized_resource_name}"
-msgid "Create %{type}"
-msgstr "Criar %{type}"
-
msgid "Create %{workspace} label"
msgstr "Criar etiqueta para %{workspace}"
@@ -12929,6 +13078,9 @@ msgstr "Criar uma nova branch"
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr "Crie um novo arquivo, pois ainda não há arquivos. Depois, você poderá confirmar suas mudanças."
+msgid "Create a new fork"
+msgstr "Criar um novo fork"
+
msgid "Create a new issue"
msgstr "Criar uma nova issue"
@@ -13214,6 +13366,9 @@ msgstr "Etapa de término da Issue"
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr "O nome é obrigatório"
@@ -13358,9 +13513,6 @@ msgstr "Criando"
msgid "Creating epic"
msgstr "Criando épico"
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr "A criação de gráficos usa os dados do servidor Prometheus. Se isso levar muito tempo, verifique se os dados estão disponíveis."
-
msgid "Creator"
msgstr "Criador"
@@ -13814,7 +13966,7 @@ msgid "DORA4Metrics|Accept testing terms of use?"
msgstr "Aceitar os termos de uso do teste?"
msgid "DORA4Metrics|Average (last %{days}d)"
-msgstr ""
+msgstr "DORA4Metrics|Média (último %{days}d)"
msgid "DORA4Metrics|By enabling this feature, you accept the %{url}"
msgstr "Ao ativar este recurso, você aceita o %{url}"
@@ -13832,7 +13984,7 @@ msgid "DORA4Metrics|Closed issues"
msgstr "Issues encerradas"
msgid "DORA4Metrics|Critical Vulnerabilities over time"
-msgstr ""
+msgstr "Vulnerabilidades críticas ao longo do tempo"
msgid "DORA4Metrics|Cycle time"
msgstr ""
@@ -13847,13 +13999,13 @@ msgid "DORA4Metrics|Days from merge to deploy"
msgstr "Dias para a implantação da mesclagem"
msgid "DORA4Metrics|Deployment Frequency"
-msgstr ""
+msgstr "Frequência de implantação"
msgid "DORA4Metrics|Deployment frequency"
msgstr "Frequência de implantação"
msgid "DORA4Metrics|Deploys"
-msgstr ""
+msgstr "Implantações"
msgid "DORA4Metrics|Failed to load YAML config from Project: %{fullPath}"
msgstr ""
@@ -13868,16 +14020,16 @@ msgid "DORA4Metrics|Forecast"
msgstr "Previsão"
msgid "DORA4Metrics|Go to docs"
-msgstr ""
+msgstr "Ir para documentos"
msgid "DORA4Metrics|High Vulnerabilities over time"
-msgstr ""
+msgstr "Altas vulnerabilidades ao longo do tempo"
msgid "DORA4Metrics|Lead Time for Changes"
msgstr ""
msgid "DORA4Metrics|Lead time"
-msgstr ""
+msgstr "Tempo de espera"
msgid "DORA4Metrics|Lead time for changes"
msgstr "Tempo de espera para mudanças"
@@ -13886,10 +14038,10 @@ msgid "DORA4Metrics|Lead time for changes (median days)"
msgstr "Tempo de espera para mudanças (mediana dos dias)"
msgid "DORA4Metrics|Median (last %{days}d)"
-msgstr ""
+msgstr "Mediana (último %{days}d)"
msgid "DORA4Metrics|Median time (last %{days}d)"
-msgstr ""
+msgstr "Tempo mediano (últimos %{days}d)"
msgid "DORA4Metrics|Median time an incident was open in a production environment over the given time period."
msgstr "Tempo médio em que um incidente foi aberto em um ambiente de produção durante o período de tempo determinado."
@@ -13904,10 +14056,10 @@ msgid "DORA4Metrics|Metrics comparison for %{name} project"
msgstr ""
msgid "DORA4Metrics|Month to date"
-msgstr ""
+msgstr "Mês até à data"
msgid "DORA4Metrics|New issues"
-msgstr ""
+msgstr "Novas issues"
msgid "DORA4Metrics|No incidents during this period"
msgstr "Nenhum incidente durante este período"
@@ -13919,7 +14071,7 @@ msgid "DORA4Metrics|Number of incidents divided by the number of deployments to
msgstr "Número de incidentes dividido pelo número de implantações em um ambiente de produção no período de tempo determinado."
msgid "DORA4Metrics|Past 6 Months"
-msgstr ""
+msgstr "Últimos 6 meses"
msgid "DORA4Metrics|Percentage of failed deployments"
msgstr "Porcentagem de implantações com falha"
@@ -13934,7 +14086,7 @@ msgid "DORA4Metrics|Something went wrong while getting change failure rate data.
msgstr "Algo deu errado ao obter dados de taxa de falha de mudança."
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
-msgstr ""
+msgstr "Algo deu errado ao obter dados da frequência de implantações."
msgid "DORA4Metrics|Something went wrong while getting lead time data."
msgstr "Algo deu errado ao obter dados do tempo de espera."
@@ -13943,10 +14095,10 @@ msgid "DORA4Metrics|Something went wrong while getting time to restore service d
msgstr ""
msgid "DORA4Metrics|The Value Streams Dashboard allows all stakeholders from executives to individual contributors to identify trends, patterns, and opportunities for software development improvements."
-msgstr ""
+msgstr "O painel de fluxos de valor permite que todas as partes interessadas, desde executivos até colaboradores individuais, identifiquem tendências, padrões e oportunidades para melhorias no desenvolvimento de software."
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 "Este gráfico exibe a frequência de implantações para ambiente(s) de produção que são baseados no valor %{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 "O gráfico exibe a mediana de tempo entre uma solicitação de mesclagem sendo realizada e implantada no(s) ambient(s) de produção baseados no valor %{linkStart}deployment_tier%{linkEnd} ."
@@ -13964,7 +14116,7 @@ msgid "DORA4Metrics|Time to restore service (median days)"
msgstr "Tempo para restaurar o serviço (mediana dos dias)"
msgid "DORA4Metrics|Value Streams Dashboard"
-msgstr ""
+msgstr "Painel de fluxos de valor"
msgid "DSN"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr "Falha ao validar tamanho do arquivo descompactado."
msgid "Decrease"
msgstr "Diminuir"
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr "Padrão - Nunca executar"
@@ -14658,7 +14816,7 @@ msgid "DefaultBranchProtection|Protected against pushes"
msgstr "Protegido contra pushes"
msgid "Define a custom deploy freeze pattern with %{cronSyntaxStart}cron syntax%{cronSyntaxEnd}"
-msgstr ""
+msgstr "Defina um padrão personalizado de congelamento para deploy com sintaxe %{cronSyntaxStart}cron%{cronSyntaxEnd}"
msgid "Define a custom pattern with cron syntax"
msgstr "Defina um padrão personalizado utilizando a sintaxe do cron"
@@ -14809,7 +14967,7 @@ msgstr[0] "Excluir linha"
msgstr[1] "Excluir %d linhas"
msgid "Delete selected"
-msgstr ""
+msgstr "Excluir selecionado"
msgid "Delete snippet"
msgstr "Excluir snippet"
@@ -14847,6 +15005,9 @@ msgstr "Excluir a variável"
msgid "Delete video"
msgstr "Excluir vídeo"
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr "Falha ao remover os eventos. Por favor, tente novamente ou entre em contato com o administrador."
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr "Localização e caminho de dependência"
msgid "Dependencies|Packager"
msgstr "Empacotador"
+msgid "Dependencies|Projects"
+msgstr "Projetos"
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr "A tarefa %{codeStartTag}dependency_scanning%{codeEndTag} falhou e não pode gerar a lista. Certifique-se de que a tarefa esteja funcionando corretamente e execute o pipeline novamente."
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr "Lista de dependências"
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr "Todos os itens no cache estão agendados para remoção."
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr "Contém %{count} blobs de imagens (%{size})"
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr "Ative o proxy de dependências e as configurações para limpar o cache.
msgid "DependencyProxy|Image list"
msgstr "Lista de imagens"
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr "Programado para exclusão"
@@ -15092,6 +15274,9 @@ msgstr "Não há imagens no cache"
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr "Para ver o prefixo da imagem e o que está no cache, visite o %{linkStart}proxy de dependências%{linkEnd}"
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr "Quando ativado, as imagens com mais de 90 dias serão removidas do cache."
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr "Aprovações atuais: %{current}"
@@ -15559,12 +15741,6 @@ msgstr "sucesso"
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr "Para informações sobre uma possível substituição %{epicStart} leia mais sobre Opstrace %{epicEnd}."
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr "O recurso de métricas foi descontinuado no GitLab 14.7."
-
msgid "Deprioritize label"
msgstr "Despriorizar etiqueta"
@@ -15574,9 +15750,6 @@ msgstr "Descreva o objetivo das mudanças e o que os revisores devem estar cient
msgid "Description"
msgstr "Descrição"
-msgid "Description (alt text)"
-msgstr "Descrição (texto alternativo)"
-
msgid "Description (optional)"
msgstr "Descrição (opcional)"
@@ -16325,8 +16498,8 @@ msgstr "Propriedade do domínio verificada com sucesso"
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr "Os domínios a seguir estão configurados para projetos neste grupo. Os usuários com endereços de e-mail que correspondem a um domínio verificado não precisam confirmar sua conta."
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
-msgstr ""
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
+msgstr "Para verificar a propriedade de seu domínio, adicione a chave acima a um registro TXT dentro de sua configuração de DNS dentro de sete dias. %{link_to_help}"
msgid "Don't have a group?"
msgstr "Você não tem um grupo?"
@@ -16370,15 +16543,15 @@ msgstr "Baixar (%{fileSizeReadable})"
msgid "Download (%{size})"
msgstr "Baixar (%{size})"
-msgid "Download CSV"
-msgstr "Baixar CSV"
-
msgid "Download PDF"
msgstr "Baixar PDF"
msgid "Download artifacts"
msgstr "Baixar artefatos"
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr "Baixar códigos"
@@ -16664,6 +16837,9 @@ msgstr "Editar chave de implantação pública"
msgid "Edit sidebar"
msgstr "Editar barra lateral"
+msgid "Edit single file"
+msgstr "Editar arquivo único"
+
msgid "Edit table"
msgstr "Editar tabela"
@@ -16761,7 +16937,7 @@ msgid "Email address suffix"
msgstr "Sufixo do endereço de email"
msgid "Email address to use for Service Desk"
-msgstr ""
+msgstr "Endereço de e-mail a ser usado para a Central de serviços"
msgid "Email could not be sent"
msgstr "E-mail não pode ser enviado"
@@ -16769,6 +16945,9 @@ msgstr "E-mail não pode ser enviado"
msgid "Email display name"
msgstr "Nome de exibição no e-mail"
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr "E-mail não verificado. Por favor, verifique o seu email no Salesforce."
@@ -17105,9 +17284,6 @@ msgstr "Forçar Autenticação de dois fatores para todos os logins de usuários
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr "Assegure que a conectividade esteja disponível do servidor do GitLab ao servidor do Prometheus"
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr "Digite o código do seu aplicativo autenticador de dois fatores. Se vocÃ
msgid "Enter the following to confirm:"
msgstr "Digite o seguinte para confirmar:"
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr "Digite o nome da sua aplicação e devolveremos um %{type} único."
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,17 +17371,20 @@ msgstr "Digite sua senha para aprovar"
msgid "Enterprise"
msgstr "Empresa"
+msgid "Enterprise User"
+msgstr ""
+
+msgid "Enterprise User Account on GitLab"
+msgstr ""
+
msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr "O detalhe do usuário não pode ser atualizado"
msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr "O usuário não corresponde à definição de \"Usuário corporativo\" para o grupo"
-msgid "EnterpriseUsers|The user is already an enterprise user"
-msgstr "O usuário já é um usuário corporativo"
-
-msgid "EnterpriseUsers|The user is not a member of the group"
-msgstr "O usuário não é membro do grupo"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
+msgstr "O usuário já é um usuário corporativo do grupo"
msgid "Environment"
msgstr "Ambiente"
@@ -17372,9 +17548,6 @@ msgstr "GitLab agent"
msgid "Environments|Job"
msgstr "Tarefa"
-msgid "Environments|Learn about environments"
-msgstr "Ler mais sobre ambientes"
-
msgid "Environments|Learn more about stopping environments"
msgstr "Saiba mais sobre como parar ambientes"
@@ -17387,9 +17560,6 @@ msgstr "Novo ambiente"
msgid "Environments|New environment"
msgstr "Novo ambiente"
-msgid "Environments|No deployed environments"
-msgstr "Nenhum ambiente de implantação"
-
msgid "Environments|No deployments yet"
msgstr "Nenhuma implantação ainda"
@@ -17585,12 +17755,6 @@ msgstr "Epics permitem gerenciar seu portfólio de projetos de forma mais eficie
msgid "Epics, issues, and merge requests"
msgstr "Épicos, issues e solicitações de mesclagem"
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr "%{startDate} – %{dueDate}"
-
-msgid "Epics|%{startDate} – No due date"
-msgstr "%{startDate} – Sem validade"
-
msgid "Epics|Add a new epic"
msgstr "Adicionar um novo épico"
@@ -17606,9 +17770,6 @@ msgstr "Você tem certeza de que quer remover %{bStart}%{targetIssueTitle}%{bEnd
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr "Deixe em branco para herdar as datas do marco"
-msgid "Epics|No start date – %{dueDate}"
-msgstr "Sem data de início - %{dueDate}"
-
msgid "Epics|Remove epic"
msgstr "Remover épico"
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr "Falhou em"
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr "Falha ao adicionar uma reunião do Zoom"
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr "Falha ao aplicar comandos."
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr "Falha ao criar um branch para esta issue. Por favor, tente novamente."
@@ -18752,6 +18916,9 @@ msgstr "Falha ao remover uma reunião do Zoom"
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr "Falha ao remover a espelho."
@@ -18773,6 +18940,9 @@ msgstr "Falha ao recuperar a página"
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr "Falha ao salvar resoluções de conflitos de mesclar. Por favor, tente novamente!"
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr "Falha ao salvar novas configurações"
@@ -18839,9 +19009,6 @@ msgstr "Favicon será removido. Você tem certeza?"
msgid "Feature Flags"
msgstr "Feature flag"
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr "Status de feature flag"
@@ -19144,6 +19311,9 @@ msgstr "Arquivos com grandes alterações são ocultadas por padrão"
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr "Arquivos, diretórios e submódulos no caminho %{path} para referência de commit %{ref}"
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr "Preencha os campos abaixo, ative %{strong_open}Ativiar autenticação SAML para este grupo%{strong_close}e pressione %{strong_open}Salvar alterações%{strong_close}"
@@ -19375,9 +19545,6 @@ msgstr "Para cada tarefa, clone o repositório."
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr "Para cada tarefa, reutilize o espaço de tarefa do projeto. Se o espaço de tarefa não existir, use %{code_open}git clone%{code_close}."
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr "O nome da aplicação que vai usar o token ou seu propósito, por exemplo. Não coloque informações sensíveis no nome do token. Ele vai estar visível a todos os membros de %{resource_type}."
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr "Para arquivos maiores que este limite indexam apenas o nome do arquivo. O conteúdo do arquivo não é indexado nem pesquisável."
@@ -19387,6 +19554,9 @@ msgstr "Para trabalhos gerais"
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr "Para uso individual, crie uma conta separada em seu endereço de e-mail pessoal, não vinculada ao domínio ou grupo de e-mail corporativo."
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr "Para investigar interrupções ou interrupções de serviço de TI"
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] "Os grupos gratuitos são limitados a %{free_user_limit} membros e os membros restantes terão um status de limite e perderão o acesso ao grupo."
msgstr[1] "Os grupos gratuitos são limitados a %{free_user_limit} membros e os membros restantes terão um status de limite e perderão o acesso ao grupo."
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr "Do %{providerTitle}"
msgid "From issue creation until deploy to production"
msgstr "Da abertura de tarefas até a implantação para a produção"
+msgid "From line %{line1} to %{line2}"
+msgstr "Da linha %{line1} a %{line2}"
+
msgid "From merge request merge until deploy to production"
msgstr "Da solicitação de mesclagem até a implantação em produção"
@@ -19686,6 +19862,9 @@ msgstr "Gerar nova exportação"
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr "Gere tokens de acesso do projeto com escopo para este projeto para seus aplicativos que precisam de acesso à API do GitLab."
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr "Começar com o GitLab"
msgid "Get started with error tracking"
msgstr "Comece com o rastreamento de erros"
-msgid "Get started with performance monitoring"
-msgstr "Comece com o monitoramento de desempenho"
-
msgid "Get started!"
msgstr "Vamos começar!"
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr "Enviar comentários"
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr "Fechar"
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr "Erro ao buscar agregações."
+
msgid "GlobalSearch|Group"
msgstr "Grupo"
@@ -20842,6 +21024,9 @@ msgstr "Issues que eu criei"
msgid "GlobalSearch|Issues assigned to me"
msgstr "Issues atribuídas a mim"
+msgid "GlobalSearch|Label(s)"
+msgstr "Etiqueta(s)"
+
msgid "GlobalSearch|Language"
msgstr "Idioma"
@@ -20854,6 +21039,9 @@ msgstr "Solicitações de mesclagem atribuídas a mim"
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr "Solicitações de mesclagem que eu seja um revisor"
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr "Projeto"
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr "Pesquisar por projetos, issues, etc."
+msgid "GlobalSearch|Search labels"
+msgstr "Pesquisar etiquetas"
+
msgid "GlobalSearch|Search results are loading"
msgstr "Os resultados da pesquisa estão sendo carregados"
@@ -21119,7 +21310,7 @@ msgid "GoogleCloud|Cancel"
msgstr "Cancelar"
msgid "GoogleCloud|Configured region is linked to the selected branch or tag"
-msgstr ""
+msgstr "A região configurada está vinculada à ramificação ou tag selecionada"
msgid "GoogleCloud|Create service account"
msgstr "Criar conta de serviço"
@@ -21152,10 +21343,10 @@ msgid "GoogleCloud|Revoke authorizations granted to GitLab. This does not invali
msgstr ""
msgid "GooglePlay|Drag your key file here or %{linkStart}click to upload%{linkEnd}."
-msgstr ""
+msgstr "Arraste seu arquivo de chave aqui ou %{linkStart}clique para enviar%{linkEnd}."
msgid "GooglePlay|Drag your key file to start the upload."
-msgstr ""
+msgstr "Arraste seu arquivo de chave para iniciar o envio."
msgid "GooglePlay|Error: The file you're trying to upload is not a service account key."
msgstr ""
@@ -21164,16 +21355,16 @@ msgid "GooglePlay|Google Play"
msgstr "Google Play"
msgid "GooglePlay|Leave empty to use your current service account key."
-msgstr ""
+msgstr "Deixe em branco para usar sua chave de conta de serviço atual."
msgid "GooglePlay|Service account key (.json)"
-msgstr ""
+msgstr "Chave da conta de serviço (.json)"
msgid "GooglePlay|Upload a new service account key (replace %{currentFileName})"
-msgstr ""
+msgstr "Carregue uma nova chave de conta de serviço (substitua %{currentFileName})"
msgid "GooglePlay|Use GitLab to build and release an app in Google Play."
-msgstr ""
+msgstr "Use o GitLab para criar e lançar um aplicativo no Google Play."
msgid "Got it"
msgstr "Entendi"
@@ -21319,9 +21510,6 @@ msgstr "Info. do grupo:"
msgid "Group information"
msgstr "Informação do grupo"
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr "Grupo de tarefas por"
@@ -21613,6 +21801,9 @@ msgstr "Token de SCIM"
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr "Impressão digital SHA1 do certificado de assinatura de token SAML. Obtenha isso do seu provedor de identidade, onde ele também pode ser chamado de \"Thumbprint\"."
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -21740,7 +21931,7 @@ msgid "GroupSettings|Email notifications are disabled"
msgstr "As notificações por e-mail estão desativadas"
msgid "GroupSettings|Enable overview background aggregation for Value Streams Dashboard"
-msgstr ""
+msgstr "Ativar agregação de plano de fundo da visão geral para o painel de fluxos de valor"
msgid "GroupSettings|Export group"
msgstr "Exportar grupo"
@@ -21836,7 +22027,7 @@ msgid "GroupSettings|Users can create %{link_start_project}project access tokens
msgstr "Os usuários podem criar %{link_start_project}tokens de acesso de projeto%{link_end} e %%{link_start_group}tokens de acesso de grupo%{link_end} neste grupo"
msgid "GroupSettings|Value Streams Dashboard"
-msgstr ""
+msgstr "Painel de fluxos de valor"
msgid "GroupSettings|What are badges?"
msgstr "O que são selos?"
@@ -22286,12 +22477,6 @@ msgstr "Notificações e outras %{issueType} ações foram movidas para este men
msgid "HeaderAction|Okay!"
msgstr "OK!"
-msgid "HeaderAction|incident"
-msgstr "incidente"
-
-msgid "HeaderAction|issue"
-msgstr "issue"
-
msgid "Headers"
msgstr "Cabeçalhos\t"
@@ -22406,11 +22591,6 @@ msgstr "Ocultar pré-visualização ao vivo"
msgid "Hide archived projects"
msgstr "Ocultar projetos arquivados"
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] "Ocultar gráfico"
-msgstr[1] "Ocultar gráficos"
-
msgid "Hide comments"
msgstr "Ocultar comentários"
@@ -22557,12 +22737,24 @@ msgstr "Manutenção"
msgid "Housekeeping successfully started"
msgstr "Manutenção iniciada com sucesso"
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr "Como eu configuro o Akismet?"
msgid "How do I configure this integration?"
msgstr "Como configuro esta integração?"
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr "Como faço para gerar?"
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23242,6 +23437,9 @@ msgid "Import|There is not a valid Git repository at this URL. If your HTTP repo
msgstr "Não há um repositório de Git válido neste URL. Se seu repositório HTTP não for acessível publicamente, verifique suas credenciais."
msgid "Improve customer support with Service Desk"
+msgstr "Melhore o suporte ao cliente com a Central de serviços"
+
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
msgstr ""
msgid "Improve quality with test cases"
@@ -24066,6 +24264,12 @@ msgstr "Incompleto"
msgid "Increase"
msgstr "Aumentar"
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr "%{featureName} está em fase de incubação"
@@ -24183,8 +24387,8 @@ msgstr "Insira coluna antes"
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
-msgstr "Inserir link"
+msgid "Insert link (%{modifierKey}K)"
+msgstr "Inserir link (%{modifierKey}K)"
msgid "Insert or edit diagram"
msgstr "Inserir ou editar o diagrama"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr "Instale o GitLab Runner e verifique se está em execução."
-msgid "Install on clusters"
-msgstr "Instalar em clusters"
-
msgid "Installation"
msgstr "Instalação"
@@ -24384,7 +24585,7 @@ msgid "Integrations|Enable comments"
msgstr "Ativar comentários"
msgid "Integrations|Enable slash commands and notifications for a Slack workspace."
-msgstr ""
+msgstr "Ativar comandos de barra e notificações para um espaço de trabalho no Slack."
msgid "Integrations|Enter your alias"
msgstr "Digite seu alias"
@@ -24450,7 +24651,7 @@ msgid "Integrations|Resetting this integration will clear the settings and deact
msgstr ""
msgid "Integrations|Restrict to branch (optional)"
-msgstr ""
+msgstr "Restringir à ramificação (opcional)"
msgid "Integrations|SSL verification"
msgstr "Verificação de SSL"
@@ -24821,7 +25022,7 @@ msgid "InviteMembersModal|Username or email address"
msgstr "Nome de usuário ou endereço de e-mail"
msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
-msgstr ""
+msgstr "Você só tem espaço para mais %{count} %{members} em %{name}"
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr "Você está convidando membros para o grupo %{strongStart}%{name}%{strongEnd}."
@@ -24836,7 +25037,7 @@ msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{
msgstr "Você está convidando membros para o projeto %{strongStart}%{name}%{strongEnd}."
msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
-msgstr ""
+msgstr "=Você atingiu seu limite de %{count} %{members} para %{name}"
msgid "InviteMembersModal|Your top-level group %{namespaceName} is over the %{dashboardLimit} user limit."
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr "Parece que atualmente não há dados disponíveis para cobertura de cód
msgid "It's you"
msgstr "É você"
+msgid "Italic (%{modifierKey}I)"
+msgstr "Itálico (%{modifierKey}I)"
+
msgid "Italic text"
msgstr "Texto em itálico"
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr "Diga-nos o que você pensa!"
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr "Adoraríamos saber mais sobre sua experiência com o aplicativo GitLab for Jira Cloud."
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr "Tarefa falhou nº %{build_id}"
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr "A tarefa travou. Verifique os executores."
msgid "Job logs and artifacts"
msgstr "Registros e artefatos da tarefa"
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr "A tarefa foi retentada"
@@ -26071,6 +26287,9 @@ msgstr "Nenhuma tarefa para mostrar"
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr "Aguardando recurso"
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr "permitido falhar"
@@ -26296,9 +26521,6 @@ msgstr "Manter artefatos de tarefas com sucesso mais recentes"
msgid "Keep divergent refs"
msgstr "Manter referências divergentes"
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr "Últimos %{days} dias"
msgid "Last 2 weeks"
msgstr "Últimas 2 semanas"
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr "Acessado pela última vez em"
@@ -27154,9 +27379,6 @@ msgstr "Vincule o Sentry ao GitLab para descobrir e visualizar os erros gerados
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr "Vincule um wiki externo da barra lateral do projeto. %{docs_link}"
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr "Link copiado para a área de transferência."
@@ -27304,8 +27526,8 @@ msgstr "Carregando mais"
msgid "Loading snippet"
msgstr "Carregando snippet"
-msgid "Loading the GitLab IDE..."
-msgstr "Carregando IDE do GitLab..."
+msgid "Loading the GitLab IDE"
+msgstr ""
msgid "Loading, please wait."
msgstr ""
@@ -27370,6 +27592,9 @@ msgstr "Arquivos travados"
msgid "Locked the discussion."
msgstr "Bloqueou a discussão."
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr "Bloqueia a discussão."
@@ -27562,6 +27787,9 @@ msgstr "Gerencie projeto."
msgid "Manage two-factor authentication"
msgstr "Gerenciar a autenticação de dois fatores"
+msgid "Manage usage"
+msgstr "Gerenciar uso"
+
msgid "Manage your project's triggers"
msgstr "Gerenciar os gatilhos do seu projeto"
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr "Associar um ID de conta do FogBugz para um usuário do GitLab"
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr "Mar"
@@ -27652,6 +27883,9 @@ msgstr "Adicionar texto em itálico (%{modifierKey}I)"
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr "Adicionar texto em itálico (%{modifier_key}I)"
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr "Adicionar texto tachado (%{modifierKey}%{shiftKey}X)"
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr "Cabeçalho"
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr "Suporta %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-
msgid "Marked"
msgstr ""
@@ -27719,7 +27950,7 @@ msgid "Marks to do as done."
msgstr "Marca tarefa como concluída."
msgid "Mask this variable in job logs if it meets %{linkStart}regular expression requirements%{linkEnd}."
-msgstr ""
+msgstr "Máscarar essa variável nos logs da tarefa se ela atende a %{linkStart}requisitos de expressão regular%{linkEnd}."
msgid "Mask variable"
msgstr "Mascarar variável"
@@ -27778,8 +28009,8 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
-msgstr "O tamanho máximo do arquivo é 200 KB."
+msgid "Max file size is 200 KiB."
+msgstr "O tamanho máximo do arquivo é 200 KiB."
msgid "Max role"
msgstr "Cargo max"
@@ -27829,8 +28060,8 @@ msgstr "Tamanho máximo dos artefatos (MB)"
msgid "Maximum attachment size"
msgstr "Tamanho máximo do anexo"
-msgid "Maximum attachment size (MB)"
-msgstr "Tamanho máximo de anexos (MB)"
+msgid "Maximum attachment size (MiB)"
+msgstr "Tamanho máximo de anexos (MiB)"
msgid "Maximum authenticated API requests per rate limit period per user"
msgstr ""
@@ -27856,7 +28087,7 @@ msgstr "Atraso máximo (minutos)"
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,8 +28096,8 @@ msgstr "Duração mínima de uma sessão."
msgid "Maximum export size"
msgstr "Tamanho máximo de exportação"
-msgid "Maximum export size (MB)"
-msgstr "Tamanho máximo de exportação (MB)"
+msgid "Maximum export size (MiB)"
+msgstr "Tamanho máximo de exportação (MiB)"
msgid "Maximum field length"
msgstr ""
@@ -27881,7 +28112,7 @@ msgid "Maximum file size is 1 MB. Pages are optimized for a 128x128 px logo."
msgstr "O tamanho máximo do arquivo é 1 MB. Páginas são otimizadas para um logotipo de 128x128 px."
msgid "Maximum file size is 1MB."
-msgstr ""
+msgstr "Tamanho máximo do arquivo é 1MB."
msgid "Maximum file size is 1MB. Pages are optimized for a 24px tall header logo"
msgstr "O tamanho máximo do arquivo é 1 MB. As páginas são otimizadas para um logotipo de cabeçalho de 24px de altura"
@@ -27901,8 +28132,8 @@ msgstr "Máximo de requisições de importação de grupo por minuto"
msgid "Maximum import size"
msgstr "Tamanho máximo de importação"
-msgid "Maximum import size (MB)"
-msgstr "Tamanho máximo de importação (MB)"
+msgid "Maximum import size (MiB)"
+msgstr "Tamanho máximo de importação (MiB)"
msgid "Maximum job artifact size"
msgstr "Tamanho máximo do artefato de tarefa"
@@ -27922,7 +28153,10 @@ msgstr "Tamanho máximo de arquivo para pacote npm em bytes"
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr "Número máximo de %{name} (%{count}) excedido(a)"
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr "Número máximo de requisições por minuto para um usuário autenticado
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,8 +28213,8 @@ msgstr ""
msgid "Maximum push size"
msgstr "Tamanho máximo de push"
-msgid "Maximum push size (MB)"
-msgstr "Tamanho máximo de push (MB)"
+msgid "Maximum push size (MiB)"
+msgstr "Tamanho máximo de push (MiB)"
msgid "Maximum requests per 10 minutes per IP address"
msgstr ""
@@ -28006,8 +28246,8 @@ msgstr "Tamanho máximo dos arquivos de importação."
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
-msgstr ""
+msgid "Maximum size of pages (MiB)"
+msgstr "Tamanho máximo das páginas (MiB)"
msgid "Maximum snippet size"
msgstr "Tamanho máximo de snippet"
@@ -28351,6 +28591,9 @@ msgstr "Análise de solicitação de mesclagem"
msgid "Merge request approvals"
msgstr "Aprovações de solicitação de mesclagem"
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr "Commits de solicitação de mesclagem"
@@ -28369,6 +28612,9 @@ msgstr "Relatórios de solicitação de mesclagem"
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr "Comentando nas linhas %{selectStart}iniciam%{selectEnd} a %{end}"
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr "Ocorreu um erro ao salvar o rascunho do comentário."
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr "Referência copiada"
-msgid "MergeRequests|Saving the comment failed"
-msgstr "Falha ao salvar comentário"
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr "Visualizar o arquivo @ %{commitId}"
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr "Ver arquivo substituído @ %{commitId}"
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr "Seu comentário não pôde ser enviado porque %{reason}."
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr "comentou no commit %{commitLink}"
@@ -28609,6 +28852,18 @@ msgstr "Revisado por @%{username} mas ainda não aprovado"
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr "%{sourceTopic} será removido"
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr "Métricas"
-
msgid "Metrics - Grafana"
msgstr "Métricas - Grafana"
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr "1. Definir e visualizar o painel"
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr "2. Colar YAML do painel no painel"
-
-msgid "Metrics|Add metric"
-msgstr "Adicionar métrica"
-
-msgid "Metrics|Add panel"
-msgstr "Adicionar painel"
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr "Voltar para o painel"
-
-msgid "Metrics|Cancel"
-msgstr "Cancelar"
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr "Confira a documentação de CI/CD sobre como implantar em um ambiente"
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr "Copiar YAML"
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr "Criar painel personalizado %{fileName}"
-
msgid "Metrics|Create metric"
msgstr "Criar métricas"
-msgid "Metrics|Create new dashboard"
-msgstr "Criar novo painel"
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr "Atual"
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr "Excluir métrica"
msgid "Metrics|Delete metric?"
msgstr "Excluir métrica?"
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr "Duplicar painel atual"
-
-msgid "Metrics|Duplicate dashboard"
-msgstr "Duplicar painel"
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr "Duplicando..."
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr "Editar YAML do painel"
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] "Editar métrica"
-msgstr[1] "Editar métricas"
-
-msgid "Metrics|Expand panel"
-msgstr "Expandir painel"
+msgstr "Editar métrica"
msgid "Metrics|For grouping similar metrics"
msgstr "Para agrupar métricas similares"
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr "Etiqueta do eixo y (geralmente a unidade). O eixo x sempre representa tempo."
msgid "Metrics|Legend label (optional)"
msgstr "Rótulo de legenda (opcional)"
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr "Configurações de métricas"
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr "Mais ações"
-
msgid "Metrics|Must be a valid PromQL query."
msgstr "Deve ser uma consulta PromQL válida."
msgid "Metrics|New metric"
msgstr "Nova métrica"
-msgid "Metrics|Open repository"
-msgstr "Abrir repositório"
-
-msgid "Metrics|Panel YAML"
-msgstr "YAML do Panel"
-
-msgid "Metrics|Panel YAML copied"
-msgstr "YAML do Panel copiado"
-
-msgid "Metrics|Preview panel"
-msgstr "Painel de visualização"
-
msgid "Metrics|PromQL query is valid"
msgstr "Consulta PromQL é válida"
msgid "Metrics|Prometheus Query Documentation"
msgstr "Documentação de consulta do Prometheus"
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr "Atualizar painel"
-
-msgid "Metrics|Select a value"
-msgstr "Selecionar um valor"
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr "Favorirtar painel"
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr "Houve um erro ao obter os dados do ambiente; por favor, tente novamente"
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr "Houve um erro ao obter informações de implantação."
-
-msgid "Metrics|There was an error getting environments information."
-msgstr "Houve um erro ao obter informações dos ambientes."
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr "Houve um erro ao tentar validar sua consulta"
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr "Ocorreu um erro ao recuperar as métricas"
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr "Resposta de dados de implantação inesperada da outra ponta do prometheus"
-
msgid "Metrics|Unit label"
msgstr "Rótulo de unidade"
-msgid "Metrics|Unstar dashboard"
-msgstr "Desfavoritar painel"
-
msgid "Metrics|Used as a title for the chart"
msgstr "Usado como um título para o gráfico"
@@ -28980,24 +29062,12 @@ msgstr "Usado se a consulta retornar uma única série. Se ele retornar várias
msgid "Metrics|Validating query"
msgstr "Validando consulta"
-msgid "Metrics|Values"
-msgstr "Valores"
-
-msgid "Metrics|View documentation"
-msgstr "Ver documentação"
-
msgid "Metrics|Y-axis label"
msgstr "Rótulo do eixo Y"
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr "Você está prestes a excluir permanentemente essa métrica. Isso não poderá ser desfeito."
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr "ex., requisições HTTP"
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr "Experimentos de modelo"
+msgid "MlExperimentTracking|Model registry"
+msgstr "Registro do modelo"
+
msgid "MlExperimentTracking|Name"
msgstr "Nome"
@@ -29420,6 +29493,9 @@ msgstr "Fechar"
msgid "Model experiments"
msgstr "Experimentos de modelo"
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr "Modificado"
@@ -29480,9 +29556,6 @@ msgstr "Mais informações"
msgid "More information is available|here"
msgstr "Mais informações disponíveis|aqui"
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr "Mais opções"
@@ -29660,6 +29733,12 @@ msgstr "ID do espaço de nome:"
msgid "Namespace Limits"
msgstr "Limites de espaço de nome"
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr "O espaço de nome ou grupo para importar o repositório não existe."
@@ -30408,12 +30487,6 @@ msgstr "Não é necessário cartão de crédito."
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr "Nenhum dado encontrado"
-
-msgid "No data to display"
-msgstr "Nenhum dado para exibir"
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30454,7 +30527,7 @@ msgid "No group provided"
msgstr ""
msgid "No grouping"
-msgstr ""
+msgstr "Sem agrupamento"
msgid "No issues found"
msgstr "Nenhuma issue encontrada"
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr "Nenhuma região configurada"
-msgid "No related merge requests found."
-msgstr "Nenhuma solicitação de mesclagem relacionada foi encontrada."
-
msgid "No repository"
msgstr "Nenhum repositório"
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr "Nenhum favorito corresponde à sua pesquisa"
+msgid "No start date – %{dueDate}"
+msgstr "Sem data de início – %{dueDate}"
+
msgid "No suggestions found"
msgstr "Nenhuma sugestão encontrada"
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr "Nota"
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr "Suporta %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. Para %{quickActionsDocsLinkStart}ações rápidas%{quickActionsDocsLinkEnd}, digite %{keyboardStart}%{keyboardEnd}"
-
msgid "Notes"
msgstr "Notas"
@@ -31039,6 +31109,9 @@ msgstr "Autor do commit "
msgid "Notify|Committed by"
msgstr "Comit por"
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr "Nenhuma pré-visualização disponível para este tipo de arquivo"
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
-msgstr ""
-
msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr "Pipeline %{pipeline_link} acionado por"
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
-msgstr "Pipeline foi corrigido e #%{pipeline_id} foi aprovado!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
+msgstr ""
+
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
+msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr "Verifique se seu provedor de serviços suporta subendereçamento de e-mail e se você configurou o encaminhamento de e-mail corretamente."
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr "OK"
@@ -31486,7 +31568,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 "Observe que rotações com turnos de menos de quatro horas atualmente não são suportadas na visualização semanal."
msgid "OnCallSchedules|Removing this user may put their on-call team at risk of missing a notification."
msgstr "Remover este usuário pode colocar sua equipe de plantão em risco de perder uma notificação."
@@ -31495,19 +31577,19 @@ msgid "OnCallSchedules|Removing yourself may put your on-call team at risk of mi
msgstr ""
msgid "OnCallSchedules|Restrict to time intervals"
-msgstr ""
+msgstr "Restringir a intervalos de tempo"
msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
-msgstr ""
+msgstr "A data/hora final da rotação deve ser posterior à data/hora inicial"
msgid "OnCallSchedules|Rotation length"
-msgstr ""
+msgstr "Comprimento da rotação"
msgid "OnCallSchedules|Rotation length must be a positive number"
msgstr ""
msgid "OnCallSchedules|Rotation name cannot be empty"
-msgstr ""
+msgstr "O nome da rotação não pode estar vazio"
msgid "OnCallSchedules|Rotation participants cannot be empty"
msgstr ""
@@ -31516,7 +31598,7 @@ msgid "OnCallSchedules|Rotation start date cannot be empty"
msgstr ""
msgid "OnCallSchedules|Rotations"
-msgstr ""
+msgstr "Rotações"
msgid "OnCallSchedules|Route alerts directly to specific members of your team"
msgstr "Roteamento de alertas de diretamente para membros específicos de sua equipe"
@@ -31627,7 +31709,7 @@ msgid "OnDemandScans|Do you want to discard the changes or keep editing this pro
msgstr "Deseja descartar as alterações ou continuar editando este perfil? As alterações não salvas serão perdidas."
msgid "OnDemandScans|Dynamic Application Security Testing (DAST)"
-msgstr ""
+msgstr "Teste dinâmico de segurança de aplicativos (DAST)"
msgid "OnDemandScans|Edit %{profileType} profile"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr "Lista ordenada"
msgid "Organizations"
msgstr "Organizações"
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32214,7 +32302,7 @@ msgid "PackageRegistry|Add NuGet Source"
msgstr ""
msgid "PackageRegistry|Add composer registry"
-msgstr ""
+msgstr "Adicionar registro do compositor"
msgid "PackageRegistry|Additional metadata"
msgstr "Metadados adicionais"
@@ -32346,7 +32434,7 @@ msgid "PackageRegistry|Delete packages"
msgstr ""
msgid "PackageRegistry|Delete selected"
-msgstr ""
+msgstr "Excluir selecionado"
msgid "PackageRegistry|Delete this package"
msgstr "Excluir esse pacote"
@@ -32382,7 +32470,7 @@ msgid "PackageRegistry|Failed to load version data"
msgstr ""
msgid "PackageRegistry|For more information on Composer packages in GitLab, %{linkStart}see the documentation.%{linkEnd}"
-msgstr ""
+msgstr "Para mais informações sobre os pacotes do Compositor no GitLab, %{linkStart}consulte a documentação.%{linkEnd}"
msgid "PackageRegistry|For more information on the Conan registry, %{linkStart}see the documentation%{linkEnd}."
msgstr ""
@@ -32433,7 +32521,7 @@ msgid "PackageRegistry|If you haven't already done so, you will need to add the
msgstr ""
msgid "PackageRegistry|Install package version"
-msgstr ""
+msgstr "Instalar a versão do pacote"
msgid "PackageRegistry|Instance-level"
msgstr "Nível de instância"
@@ -32527,6 +32615,18 @@ msgstr "Nível do projeto"
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr "Publique pacotes se seu nome ou versão corresponder a este regex."
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr "Publicado por %{author}, %{date}"
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr "Publicado em %{projectName} por %{author}, %{date}"
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr "Publicado em %{projectName}, %{date}"
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr "Publicado no registro do pacote %{project} há %{datetime}"
@@ -32870,7 +32970,7 @@ msgid "Paused"
msgstr "Pausado"
msgid "Paused runners don't accept new jobs"
-msgstr ""
+msgstr "Executores pausados não aceitam novos trabalhos"
msgid "Peer review by"
msgstr "Revisão por pares por"
@@ -32885,7 +32985,7 @@ msgid "Pending comments"
msgstr ""
msgid "Pending comments are hidden until you submit your review."
-msgstr ""
+msgstr "Os comentários pendentes estão ocultos até que você envie sua avaliação."
msgid "Pending deletion"
msgstr "Exclusão pendente"
@@ -33097,9 +33197,6 @@ msgstr "Agendamentos da Pipeline"
msgid "Pipeline URL"
msgstr "URL do pipeline"
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33110,7 +33207,7 @@ msgid "Pipeline editor"
msgstr ""
msgid "Pipeline ran in fork of project"
-msgstr ""
+msgstr "O pipeline foi executado na ramificação do projeto"
msgid "Pipeline schedules"
msgstr ""
@@ -33161,10 +33258,10 @@ msgid "PipelineCharts|Total:"
msgstr "Total:"
msgid "PipelineEditorFileTree|Configuration files added with the include keyword"
-msgstr ""
+msgstr "Arquivos de configuração adicionados com a palavra-chave include"
msgid "PipelineEditorFileTree|When you use the include keyword to add pipeline configuration from files in the project, those files will be listed here."
-msgstr ""
+msgstr "Quando você usa a palavra-chave include para adicionar configuração de pipeline de arquivos no projeto, esses arquivos serão listados aqui."
msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr "Ativo"
msgid "PipelineSchedules|All"
msgstr "Todos"
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr "Tem certeza de que deseja excluir este agendamento de pipeline?"
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr "Criar agendamento de pipeline"
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr "Catálogo CI/CD"
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr "Limpar cache dos executores"
@@ -33670,6 +33773,9 @@ msgstr "Pronto para configurar CI/CD para seu projeto?"
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr "Essa configuração do GitLab CI é válida."
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr "Este é um pipeline filho dentro do pipeline pai"
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,8 +33845,8 @@ msgstr "Este projeto não está atualmente configurado para executar pipelines."
msgid "Pipelines|Token"
msgstr "Token"
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
-msgstr ""
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
+msgstr "Quantidade total de minutos de computação usados para o pipeline"
msgid "Pipelines|Total number of jobs for the pipeline"
msgstr ""
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr "erro"
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr "Inválido"
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr "Pipeline de resultado mesclado"
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr "Nenhuma tarefa com falha neste pipeline 🎉"
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr "Apenas as primeiras 100 tarefas por estágio são exibidos"
+
msgid "Pipeline|Passed"
msgstr "Passou"
@@ -33955,6 +34070,9 @@ msgstr "Este pipeline foi executado no conteúdo da ramificação de origem dest
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr "Para ver as tarefas restantes, acesse a aba %{boldStart}Tarefas%{boldEnd}."
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -33998,7 +34116,7 @@ msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker
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 ""
+msgstr "Lista separada por vírgulas de ramificações para inspecionar automaticamente. Deixe em branco para incluir todas as ramificações."
msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
@@ -34016,7 +34134,7 @@ msgid "Plan:"
msgstr ""
msgid "Planning hierarchy"
-msgstr ""
+msgstr "Hierarquia de planejamento"
msgid "PlantUML"
msgstr "PlantUML"
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr "Por favor, contate um administrador para registrar os executores."
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,8 +34349,8 @@ msgstr "Por favor, tente novamente"
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
-msgstr "Por favor, digite %{phrase_code} para continuar ou feche este modal para cancelar."
+msgid "Please type %{phrase_code} to proceed."
+msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
msgstr ""
@@ -34622,7 +34737,7 @@ msgid "Private profile"
msgstr "Perfil privado"
msgid "Private profile:"
-msgstr ""
+msgstr "Perfil privado:"
msgid "Private projects can be created in your personal namespace with:"
msgstr "Projetos privados podem ser criados em seu espaço de nome pessoal com:"
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr "Para mais informações, consulte os %{linkStart} documentos%{linkEnd}."
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr "Você está prestes a excluir permanentemente a %{yourAccount}, e todas as issues, solicitações de mesclagem e grupos vinculados a sua conta. Depois de confirmar clicando em %{deleteAccount}, isso não poderá ser desfeito ou recuperado."
+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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr "Você está prestes a excluir permanentemente %{yourAccount}e todas as issues, solicitações de mesclagem e grupos vinculados à sua conta. Depois de confirmar %{deleteAccount}, ele não pode ser desfeito ou recuperado. Você pode ter que esperar sete dias antes de criar uma nova conta com o mesmo nome de usuário ou e-mail."
+
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 "Você vai alterar o nome de usuário %{currentUsernameBold} para %{newUsernameBold}. O perfil e os projetos serão redirecionados para %{newUsername} mas esse redirecionamento expirará quando %{currentUsername} for registrado por outro usuário ou grupo. Por favor, atualize seus repositórios remotos Git o mais rápido possível."
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr "Informações do projeto"
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr "Membros do projeto"
@@ -35456,7 +35577,7 @@ msgid "Project milestone"
msgstr "Marco de projeto"
msgid "Project must have default branch"
-msgstr ""
+msgstr "O projeto deve ter ramificação padrão"
msgid "Project name"
msgstr "Nome do projeto"
@@ -35690,7 +35811,7 @@ msgid "ProjectService|Drone server URL"
msgstr "URL do servidor Drone"
msgid "ProjectService|Enter new API key"
-msgstr ""
+msgstr "Insira a nova chave de API"
msgid "ProjectService|Enter new password"
msgstr "Insira a nova senha"
@@ -35986,18 +36107,6 @@ msgstr "Interno"
msgid "ProjectSettings|Issues"
msgstr "Issues"
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36047,7 +36156,7 @@ msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-d
msgstr "Mesclar só é permitido quando a ramificação de origem está atualizada com seu destino."
msgid "ProjectSettings|Model experiments"
-msgstr ""
+msgstr "Experimentos de modelo"
msgid "ProjectSettings|Monitor"
msgstr "Monitor"
@@ -36181,9 +36290,6 @@ msgstr "Enviar alterações para serem mescladas no upstream."
msgid "ProjectSettings|Target project"
msgstr "Projeto alvo"
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr "O projeto de destino padrão para solicitações de mesclagem criadas ne
msgid "ProjectSettings|The default template will be applied on save."
msgstr "O modelo padrão será aplicado ao salvar."
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36233,7 +36336,7 @@ msgid "ProjectSettings|Topics are publicly visible even on private projects. Do
msgstr "Tópicos são publicamente visíveis mesmo em projetos privados. Não inclua informações confidenciais nos nomes dos tópicos. %{linkStart}Saiba mais%{linkEnd}."
msgid "ProjectSettings|Track machine learning model experiments and artifacts."
-msgstr ""
+msgstr "Acompanhe experimentos e artefatos do modelo de aprendizado de máquina."
msgid "ProjectSettings|Transfer project"
msgstr "Transferir projeto"
@@ -36244,11 +36347,8 @@ msgstr "Projeto upstream"
msgid "ProjectSettings|Used for every new merge request."
msgstr "Usado para cada nova solicitação de mesclagem."
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr "Usado para conectar Jitsu à instância Clickhouse."
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
-msgstr "Usado para gerar tokens de acesso à API de curta duração."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
+msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
msgstr "Usado para recuperar dados do painel da instância do Cubo."
@@ -36722,7 +36822,7 @@ msgid "Promote issue to incident"
msgstr "Promover issue para incidente"
msgid "Promote to epic"
-msgstr ""
+msgstr "Promover a épico"
msgid "Promote to group label"
msgstr "Promover para etiqueta de grupo"
@@ -36730,6 +36830,9 @@ msgstr "Promover para etiqueta de grupo"
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr "Apenas marcos do projeto podem ser promovidos."
@@ -36745,6 +36848,9 @@ msgstr "Issue promovida para um épico."
msgid "Promotes issue to incident"
msgstr "Promove issue para incidente"
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr "Qualidade do projeto"
msgid "Query"
msgstr "Consulta"
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr "Na fila"
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr "Leia mais sobre a %{changes_link_start}alterações%{link_end}, %{vision_link_start}visão%{link_end}e %{design_link_start}design%{link_end}."
+msgid "Read the documentation before applying changes."
+msgstr "Leia a documentação antes de aplicar as alterações."
+
msgid "Read their documentation."
msgstr ""
@@ -37745,13 +37851,13 @@ msgid "Register / Sign In"
msgstr "Registrar/Entrar"
msgid "Register a WebAuthn device"
-msgstr ""
+msgstr "Registrar um dispositivo WebAuthn"
msgid "Register a one-time password authenticator"
msgstr "Registrar um autenticador de senha de uso único"
msgid "Register a one-time password authenticator or a WebAuthn device first."
-msgstr ""
+msgstr "Registre um autenticador de senha única ou um dispositivo WebAuthn primeiro."
msgid "Register device"
msgstr "Registar dispositivo"
@@ -37786,8 +37892,8 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
-msgstr "Ativar unidades de computação gratuitas"
+msgid "RegistrationVerification|Enable free compute minutes"
+msgstr "Ativar minutos de computação gratuitos"
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
msgstr ""
@@ -37798,8 +37904,8 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
-msgstr "Para manter o GitLab livre de spam e abuso, pedimos que você verifique sua identidade com um método de pagamento válido, como cartão de débito ou crédito. Até então, você não pode usar unidades de computação gratuitas para criar seu aplicativo."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
+msgstr "Para manter o GitLab livre de spam e abuso, pedimos que você verifique sua identidade com um método de pagamento válido, como cartão de débito ou crédito. Até então, você não pode usar minutos de computação gratuitos para criar seu aplicativo."
msgid "RegistrationVerification|Validate account"
msgstr ""
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38011,7 +38105,7 @@ msgid "Reload page"
msgstr "Atualizar a página"
msgid "Reload the page to try again."
-msgstr ""
+msgstr "Recarregue a página para tentar novamente"
msgid "Remediations"
msgstr ""
@@ -38040,14 +38134,14 @@ msgstr ""
msgid "Remove access"
msgstr "Remover acesso"
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
-msgstr ""
+msgid "Remove all or specific reviewers"
+msgstr "Remover todos ou revisores específicos"
msgid "Remove approvers"
msgstr "Remover aprovadores"
@@ -38307,6 +38401,9 @@ msgstr "Renovar assinatura"
msgid "Reopen"
msgstr "Reabrir"
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr "Reabrir %{issueType}"
@@ -38331,6 +38428,9 @@ msgstr "Reabrir este %{quick_action_target}"
msgid "Reopened this %{quick_action_target}."
msgstr "%{quick_action_target} foi reaberto."
+msgid "Reopening %{issuableType}..."
+msgstr "Reabrindo %{issuableType}..."
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr "Substituir áudio"
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr "Substituir arquivo"
@@ -38716,7 +38819,7 @@ msgid "Repository files count over the limit"
msgstr ""
msgid "Repository graph"
-msgstr ""
+msgstr "Gráfico do repositório"
msgid "Repository has an invalid default branch name."
msgstr ""
@@ -38748,8 +38851,8 @@ msgstr "O repositório deve conter pelo menos 1 arquivo."
msgid "Repository size is above the limit."
msgstr "O tamanho do repositório está acima do limite."
-msgid "Repository size limit (MB)"
-msgstr "Limite de tamanho do repositório (MB)"
+msgid "Repository size limit (MiB)"
+msgstr "Limite de tamanho do repositório (MiB)"
msgid "Repository storage"
msgstr "Armazenamento do Repositório"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] "Revisor"
msgstr[1] "%d Revisores"
-msgid "Reviewer(s)"
-msgstr "Revisor(es)"
-
msgid "Reviewers"
msgstr "Revisores"
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr "Cargo"
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr "Reverter"
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr "Ruby"
@@ -39271,7 +39380,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "Runners|%{linkStart}Create a new runner%{linkEnd} to get started."
-msgstr ""
+msgstr "%{linkStart}Crie um novo executor%{linkEnd} para começar."
msgid "Runners|%{link_start}These runners%{link_end} are available to all groups and projects."
msgstr "%{link_start}Esses executores%{link_end} estão disponíveis para todos os grupos e projetos."
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr "Criado %{timeAgo} por %{avatar}"
+msgid "Runners|Dashboard"
+msgstr "Painel"
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr "Excluir %{count} executores?"
+
msgid "Runners|Delete runner"
msgstr "Excluir executor"
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr "Filtrar projetos"
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr "Comece com os executores"
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr "Plataforma"
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr "O projeto, grupo ou instância onde o executor foi registrado. Os executores de instâncias são sempre de propriedade do Administrador."
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr "Salvando"
msgid "Saving project."
msgstr "Salvando projeto."
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
-msgstr "%{period} %{days} a %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr "Adicionar condição"
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr "Condições"
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr "Variáveis de CI personalizadas:"
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr "As variáveis personalizadas substituirão as definidas no arquivo CI/CD do projeto e nas configurações"
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr "Se o campo estiver vazio, o executor será selecionado automaticamente"
+msgid "ScanExecutionPolicy|Key"
+msgstr "Chave"
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr "Número máximo de critérios de CI é um"
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr "Apenas uma variável pode ser adicionada por vez."
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr "Selecione um verificador"
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr "Selecionar uma variável"
+
msgid "ScanExecutionPolicy|Select agent"
msgstr "Selecionar agente"
@@ -40300,6 +40449,9 @@ msgstr "Selecionar perfil de verificação"
msgid "ScanExecutionPolicy|Select site profile"
msgstr "Selecionar perfil do site"
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr "Perfil do site"
@@ -40309,6 +40461,9 @@ msgstr "Tags"
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr "Valor"
+
msgid "ScanExecutionPolicy|agent"
msgstr "agente"
@@ -40321,6 +40476,12 @@ msgstr "tem tag específica"
msgid "ScanExecutionPolicy|in namespaces"
msgstr "em espaços de nome"
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr "perfil de verificação %{scannerProfile} e perfil do site %{siteProfile}"
@@ -40342,6 +40503,9 @@ msgstr "Escolha o tipo de critério"
msgid "ScanResultPolicy|Clear all"
msgstr "Limpar tudo"
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr "Variáveis de CI personalizadas"
+
msgid "ScanResultPolicy|Except"
msgstr "Exceto"
@@ -40390,6 +40554,9 @@ msgstr "Severidade é:"
msgid "ScanResultPolicy|Status is:"
msgstr "Status é:"
+msgid "ScanResultPolicy|Unknown"
+msgstr "Desconhecido"
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,8 +40999,8 @@ msgstr "Verificação de cobertura"
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr "Saiba mais sobre a verificação de cobertura"
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
-msgstr "Requer aprovação para reduções de cobertura de teste. %{linkStart}Saiba mais%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
@@ -40856,9 +41023,6 @@ msgstr "Invasão e Simulação de Ataque (BAS)"
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr "Invasão e Simulação de Ataque é um recurso incubado que estende os testes de segurança existentes ao simular a atividade adversária."
-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 "Por padrão, todos os analisadores são aplicados para cobrir todos os idiomas em seu projeto e só são executados se o idioma for detectado na solicitação de mesclagem."
-
msgid "SecurityConfiguration|Configuration guide"
msgstr "Guia de configuração"
@@ -40926,7 +41090,7 @@ msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr "Gerenciar perfis para uso pelas verificações de DAST."
msgid "SecurityConfiguration|More scan types, including DAST, Dependency Scanning, Fuzzing"
-msgstr ""
+msgstr "Mais tipos de verificação, incluindo DAST, verificação de dependência, fuzzing"
msgid "SecurityConfiguration|Not enabled"
msgstr "Não ativado"
@@ -40943,9 +41107,6 @@ msgstr "Ative rapidamente todos os testes contínuos e ferramentas de conformida
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr "Métricas de segurança de tempo de execução para ambientes de aplicações."
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr "Análises de SAST"
-
msgid "SecurityConfiguration|SAST configuration"
msgstr "Configuração SAST"
@@ -41060,6 +41221,9 @@ msgstr "E verificações a serem realizadas:"
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr "Escolha um projeto"
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr "Sem tags disponíveis"
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,8 +41392,8 @@ msgstr "Tipo de política"
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
-msgstr ""
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
+msgstr "As aprovações necessárias excedem os aprovadores qualificados."
msgid "SecurityOrchestration|Roles"
msgstr "Cargos"
@@ -41368,6 +41535,9 @@ msgstr "Este projeto"
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41654,7 +41824,7 @@ msgid "SecurityReports|More info"
msgstr "Mais informações"
msgid "SecurityReports|New vulnerabilities are vulnerabilities that the security scan detects in the merge request that are different to existing vulnerabilities in the default branch."
-msgstr ""
+msgstr "Novas vulnerabilidades são vulnerabilidades que a verificação de segurança detecta na solicitação de mesclagem que são diferentes das vulnerabilidades existentes na ramificação padrão."
msgid "SecurityReports|No longer detected"
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,8 +42114,8 @@ msgstr "Selecionar uma iteração"
msgid "Select assignee"
msgstr "Selecionar responsável"
-msgid "Select assignee(s)"
-msgstr "Selecionar responsável"
+msgid "Select assignees"
+msgstr ""
msgid "Select branch"
msgstr "Selecionar ramificação"
@@ -42004,11 +42177,17 @@ msgstr "Selecione o projeto para criar %{type}"
msgid "Select projects"
msgstr "Selecionar projetos"
+msgid "Select protected branch"
+msgstr "Selecionar ramificação protegida"
+
+msgid "Select protected branches"
+msgstr "Selecionar ramificações protegidas"
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
-msgstr "Selecionar revisor(es)"
+msgid "Select reviewers"
+msgstr "Selecionar revisores"
msgid "Select severity (optional)"
msgstr "Selecionar severidade (opcional)"
@@ -42154,6 +42333,9 @@ msgstr "Conta de serviço"
msgid "Service Account Key"
msgstr "Chave de conta de serviço"
+msgid "Service Accounts"
+msgstr "Contas de serviço"
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr "As chaves de contas de serviço autorizam o GitLab a implantar seu projeto do Google Cloud"
@@ -42167,7 +42349,7 @@ msgid "Service Ping payload not found in the application cache"
msgstr ""
msgid "Service account"
-msgstr ""
+msgstr "Conta de serviço"
msgid "Service account generated successfully"
msgstr ""
@@ -42184,14 +42366,23 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr "Não é possível criar um e-mail personalizado"
+
msgid "ServiceDesk|Custom email address could not be verified."
-msgstr ""
+msgstr "Endereço de e-mail personalizado não pôde ser verificado."
msgid "ServiceDesk|Custom email address has already been verified."
-msgstr ""
+msgstr "O endereço de e-mail personalizado já foi verificado."
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
-msgstr ""
+msgstr "A verificação do endereço de e-mail personalizado já foi processada e falhou."
+
+msgid "ServiceDesk|Custom email already exists"
+msgstr "E-mail personalizado já existe"
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr "E-mail personalizado não existe"
msgid "ServiceDesk|Enable Service Desk"
msgstr "Ativar central de Serviços"
@@ -42202,6 +42393,9 @@ msgstr "Para obter ajuda na configuração da central de serviços para sua inst
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr "issues criadas a partir da central de serviços aparecerão aqui. Cada comentário torna-se da conversa por e-mail"
+msgid "ServiceDesk|Parameters missing"
+msgstr "Parâmetros ausentes"
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr "Central de serviços não está ativada"
@@ -42209,10 +42403,10 @@ msgid "ServiceDesk|Service Desk is not supported"
msgstr "Central de serviços não é suportada"
msgid "ServiceDesk|Service Desk setting missing"
-msgstr ""
+msgstr "Configuração da Central de serviços ausente"
msgid "ServiceDesk|Service Desk setting or verification object missing"
-msgstr ""
+msgstr "Configuração da Central de serviços ou objeto de verificação ausente"
msgid "ServiceDesk|To enable Service Desk on this instance, an instance administrator must first set up incoming email."
msgstr "Para Ativar a central de serviços nesta instância, um administrador de instância deve primeiro configurar o e-mail de entrada."
@@ -42221,7 +42415,7 @@ msgid "ServiceDesk|Use Service Desk to connect with your users and offer custome
msgstr "Use a central de serviços para conectar com seus usuários e oferecer suporte ao cliente por e-mail dentro do GitLab"
msgid "ServiceDesk|User cannot manage project."
-msgstr ""
+msgstr "O usuário não pode gerenciar o projeto."
msgid "ServiceDesk|Your users can send emails to this address:"
msgstr "Seus usuários podem enviar e-mails para este endereço:"
@@ -42229,6 +42423,12 @@ msgstr "Seus usuários podem enviar e-mails para este endereço:"
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr "Isso pode ser alterado a qualquer momento em %{link_start}suas configurações%{link_end}."
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr "Para ajudar a melhorar o GitLab, gostaríamos de %{link_start}coletar periodicamente informações de uso%{link_end}."
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr "Visualizar raw log completo"
msgid "Show details"
msgstr "Mostrar detalhes"
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr "Mostrar navegador de arquivos"
msgid "Show file contents"
msgstr "Mostrar conteúdo do arquivo"
-msgid "Show filters"
-msgstr "Mostrar filtros"
-
msgid "Show full blame"
msgstr ""
@@ -42924,7 +43130,7 @@ msgid "Similar issues"
msgstr "Issues semelhantes"
msgid "Simulate a pipeline created for the default branch"
-msgstr ""
+msgstr "Simule um pipeline criado para a ramificação padrão"
msgid "Site profile failed to delete"
msgstr ""
@@ -42941,8 +43147,8 @@ msgstr "Tamanho"
msgid "Size Limits"
msgstr "Limite de tamanho"
-msgid "Size limit per repository (MB)"
-msgstr "Limite de tamanho por repositório (MB)"
+msgid "Size limit per repository (MiB)"
+msgstr ""
msgid "Skip to main content"
msgstr "Pular para o conteúdo principal"
@@ -43152,7 +43358,7 @@ msgid "Snippets|Delete file"
msgstr "Excluir arquivo"
msgid "Snippets|Describe what your snippet does or how to use it…"
-msgstr ""
+msgstr "Descreva o que seu snippet faz ou como usá-lo…"
msgid "Snippets|Description (optional)"
msgstr "Descrição (opcional)"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr "Arquivos"
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43248,7 +43457,7 @@ msgid "Something went wrong when deleting a comment. Please try again"
msgstr ""
msgid "Something went wrong when deleting a comment. Please try again."
-msgstr ""
+msgstr "Algo deu errado ao excluir um comentário. Por favor, tente novamente."
msgid "Something went wrong when reordering designs. Please try again"
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr "Registro de spam foi enviado com sucesso como ham."
msgid "Specific branches"
msgstr "Ramificações específicas"
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr "Começar um merge train quando o pipeline for bem-sucedido"
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr "Mantenha-se atualizado sobre o desempenho e a integridade do seu ambiente, configurando Prometheus para monitorar suas implantações."
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr "Desconhecido"
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr "Resumo gerado por IA"
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr "Dom"
@@ -44791,11 +45003,11 @@ msgstr "Trocar ramificação/tag"
msgid "Switch to GitLab Next"
msgstr "Mudar para GitLab Next"
-msgid "Switch to Markdown"
-msgstr ""
+msgid "Switch to plain text editing"
+msgstr "Mudar para edição de texto simples"
-msgid "Switch to rich text"
-msgstr ""
+msgid "Switch to rich text editing"
+msgstr "Mudar para edição de texto com formatação"
msgid "Switch to the source to copy the file contents"
msgstr "Alternar para a fonte para copiar o conteúdo do arquivo"
@@ -45058,7 +45270,7 @@ msgstr "protegido"
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr "Dê uma olhada na documentação para descobrir todos os recursos do GitLab."
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr "Disparar o TeamCity CI após a criação ou atualização de uma solicit
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr "Dispare o TeamCity CI após cada push para o repositório, exceto a exclusão de ramificação"
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr "Deixe em branco para usar seu token atual."
+
+msgid "TelegramIntegration|New token"
+msgstr "Novo token"
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr "Envia notificações sobre eventos do projeto para o Telegram."
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr "Envia notificações sobre eventos do projeto para o Telegram. %{docs_link}"
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr "Token de autenticação exclusivo."
+
msgid "Telephone number"
msgstr "Número de telefone"
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr "Comando init do Terraform"
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45513,7 +45737,7 @@ msgid "Text added to the body of all email messages. %{character_limit} characte
msgstr ""
msgid "Text added to the body of user deactivation email messages. 1000 character limit."
-msgstr ""
+msgstr "Texto adicionado ao corpo das mensagens de e-mail de desativação do usuário. Limite de 1.000 caracteres."
msgid "Text style"
msgstr "Estilo do texto"
@@ -45571,9 +45795,6 @@ msgstr "O rastreador de issue é o lugar para adicionar coisas que precisam ser
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr "O rastreador de issue é o lugar para adicionar coisas que precisam ser melhoradas ou resolvidas em um projeto. Você pode se registrar ou entrar para criar issues para este projeto."
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr "A integração de notificações do Slack está obsoleta e será removida em uma versão futura. Para continuar recebendo notificações do Slack, use o aplicativo GitLab para Slack. %{learn_more_link_start}Saiba mais%{link_end}."
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45731,7 +45952,7 @@ msgid "The following SSH key was deleted by an administrator, %{username}."
msgstr ""
msgid "The following files or directories can only be modified by the user who locked them."
-msgstr ""
+msgstr "Os seguintes arquivos ou diretórios só podem ser modificados pelo usuário que os bloqueou."
msgid "The following items will NOT be exported:"
msgstr "Os seguintes itens NÃO serão exportados:"
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr "A quantidade máxima de tempo que os usuários têm para configurar a autenticação de dois fatores antes de ser aplicada."
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr "O máximo de minutos de computação que as tarefas em um espaço de nomepodem usar em executores compartilhados a cada mês. 0 para ilimitado."
+
msgid "The maximum file size allowed is %{size}."
msgstr "O tamanho máximo do arquivo é %{size}."
@@ -45872,9 +46099,6 @@ msgstr "O tamanho máximo de arquivo é %{size}."
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr "Os conflitos de merge para esta solicitação de mesclagem não podem ser resolvidos pelo GitLab. Por favor, tente resolvê-los localmente."
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr "O snippet pode ser acessado sem nenhuma autenticação."
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr "O snippet está visível apenas para mim."
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr "Este comentário foi gerado pela IA"
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr "Este commit foi assinado com uma assinatura %{strong_open}confirmada%{strong_close} e o e-mail do committer está verificado como pertencente ao mesmo usuário."
@@ -46587,7 +46823,7 @@ msgid "This commit was signed with a different user's verified signature."
msgstr "Este commit foi assinado com uma assinatura verificada de um usuário diferente."
msgid "This commit was signed with a verified signature and the committer email was verified to belong to the same user."
-msgstr ""
+msgstr "Este commit foi assinado com uma assinatura confirmada e o e-mail do committer está verificado como pertencente ao mesmo usuário."
msgid "This commit was signed with a verified signature, but the committer email is not associated with the GPG Key."
msgstr ""
@@ -46596,10 +46832,10 @@ msgid "This commit was signed with an %{strong_open}unverified%{strong_close} si
msgstr "Este commit foi assinado com uma assinatura %{strong_open}não verificada%{strong_close}."
msgid "This commit was signed with an unverified signature."
-msgstr ""
+msgstr "Este commit foi assinado com uma assinatura não verificada."
msgid "This commit was signed with multiple signatures."
-msgstr ""
+msgstr "Este commit foi assinado com várias assinaturas."
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr "Esta página está hospedada nas páginas do GitLab, mas contém conteú
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."
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr "Este pipeline faz uso de uma configuração de CI/CD predefinida habilitada por %{strongStart}Auto DevOps.%{strongEnd}"
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr "Taxa de transferência"
@@ -47417,6 +47647,9 @@ msgstr "agora"
msgid "Timeago|right now"
msgstr "agora mesmo"
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,14 +47735,11 @@ msgstr "Título:"
msgid "Titles"
msgstr "Títulos"
-msgid "Titles and Descriptions"
-msgstr "Títulos e descrições"
-
msgid "To"
msgstr "Para"
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
-msgstr "Para %{link_to_help} de seu domínio, adicione a chave acima a um registro TXT dentro da sua configuração DNS."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
+msgstr "Para %{link_to_help} do seu domínio, adicione a chave acima a um registro TXT dentro de sua configuração de DNS dentro de sete dias."
msgid "To Do"
msgstr "Tarefas"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47602,10 +47835,7 @@ msgid "To get started, use the link below to confirm your account."
msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
-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 "Para ir para o GitLab Pages, na barra lateral esquerda, selecione %{pages_link}."
msgid "To import an SVN repository, check out %{svn_link}."
msgstr "Para importar um repositório SVN, confira %{svn_link}."
@@ -47678,6 +47908,9 @@ msgstr "Para ver o que mudou ou criar uma solicitação de mesclagem, escolha um
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr "Para configurar a autenticação SAML para o seu grupo por meio de um provedor de identidade, como Azure, Okta, Onelogin, Ping Identity ou seu provedor SAML 2.0 personalizado:"
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr "Para especificar o nível de notificação por projeto de um grupo a que
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47694,7 +47933,7 @@ msgid "To update Snippets with multiple files, you must use the `files` paramete
msgstr ""
msgid "To use Service Desk in this project, you must %{linkStart}activate the issue tracker%{linkEnd}."
-msgstr ""
+msgstr "Para usar o Central de serviços neste projeto, você deve %{linkStart}ativar o rastreador de problemas%{linkEnd}."
msgid "To use the additional formats, you must start the required %{container_link_start}companion containers%{container_link_end}."
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr "Alternar barra lateral"
msgid "Toggle backtrace"
msgstr "Alternar backtrace"
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr "Alternar comentários para este arquivo"
@@ -47870,6 +48106,9 @@ msgstr "Alternar descrição de commit"
msgid "Toggle commit list"
msgstr "Alternar lista de commits"
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr "Alternar prêmio de emoji"
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr "Escopos definem os níveis de permissão concedidos ao token."
-
-msgid "Tokens|Select scopes"
-msgstr "Selecionar escopos"
-
msgid "Tomorrow"
msgstr "Amanhã"
@@ -47998,6 +48231,9 @@ msgstr "Tópicos"
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr "Total"
@@ -48232,7 +48468,7 @@ msgid "Try changing or removing filters."
msgstr ""
msgid "Try grouping with different labels"
-msgstr ""
+msgstr "Tente agrupar com etiquetas diferentes"
msgid "Try out GitLab Pipelines"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr "Digite para pesquisar"
msgid "URL"
msgstr "URL"
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr "URL inválida"
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr "Não foi possível conectar ao servidor Prometheus"
-
msgid "Unable to connect to server: %{error}"
msgstr "Não foi possível conectar ao servidor: %{error}"
@@ -48460,7 +48687,7 @@ msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
msgid "Unable to load the page"
-msgstr ""
+msgstr "Não foi possível carregar a página"
msgid "Unable to parse JSON"
msgstr "Não foi possível analisar JSON"
@@ -48576,9 +48803,6 @@ msgstr "Infelizmente, sua mensagem de e-mail para o GitLab não pôde ser proces
msgid "Unhappy?"
msgstr "Infeliz?"
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr "Desvincular"
msgid "Unlock"
msgstr "Desbloquear"
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr "Desbloqueado"
msgid "Unlocked the discussion."
msgstr "Desbloqueou a discussão."
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr "Desbloqueia a discussão."
@@ -48660,9 +48887,6 @@ msgstr "Inacessível"
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr "Tipo de cluster não reconhecido"
-
msgid "Unresolve"
msgstr "Voltar para resolver"
@@ -48718,7 +48942,7 @@ msgid "Unsupported todo type passed. Supported todo types are: %{todo_types}"
msgstr ""
msgid "Untitled"
-msgstr ""
+msgstr "Sem título"
msgid "Unused"
msgstr "Não usado"
@@ -48730,7 +48954,7 @@ msgid "Unverified"
msgstr "Não verificado"
msgid "Unverified signature"
-msgstr ""
+msgstr "Assinatura não verificada"
msgid "Up to date"
msgstr "Atualizado"
@@ -48942,8 +49166,8 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr "Amostras de áudio, vídeos, conjuntos de dados e gráficos."
-msgid "UsageQuota|Buy additional units of compute"
-msgstr ""
+msgid "UsageQuota|Buy additional compute minutes"
+msgstr "Compre minutos de computação adicionais"
msgid "UsageQuota|Buy storage"
msgstr "Comprar armazenamento"
@@ -48952,16 +49176,16 @@ msgid "UsageQuota|Code packages and container images."
msgstr "Pacotes de código e imagens de contêiner."
msgid "UsageQuota|Compute usage"
-msgstr ""
+msgstr "Uso de computação"
msgid "UsageQuota|Compute usage by month"
-msgstr ""
+msgstr "Uso de computação por mês"
msgid "UsageQuota|Compute usage by project"
-msgstr ""
+msgstr "Uso de computação por projeto"
msgid "UsageQuota|Compute usage since %{usageSince}"
-msgstr ""
+msgstr "Uso de computação desde %{usageSince}"
msgid "UsageQuota|Container Registry"
msgstr "Registro de contêiner"
@@ -48990,6 +49214,9 @@ msgstr "Docker de registro de contêiner integrado ao Gitlab para armazenar imag
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr "Configurações do grupo &gt; Cotas de uso"
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr "Inclui artefatos, repositórios, wiki e outros itens."
@@ -49018,7 +49245,7 @@ msgid "UsageQuota|Namespace storage used"
msgstr "Armazenamento de espaço de nome usado"
msgid "UsageQuota|No compute usage data available."
-msgstr ""
+msgstr "Nenhum dado de uso de computação disponível."
msgid "UsageQuota|No projects to display."
msgstr "Nenhum projeto para exibir."
@@ -49029,17 +49256,11 @@ msgstr "Membros pendentes"
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr "Artefatos de pipeline e artefatos de tarefa, criados com CI/CD."
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr "Pipelines"
-msgid "UsageQuota|Purchased storage"
-msgstr "Armazenamento comprado"
-
-msgid "UsageQuota|Purchased storage used"
-msgstr "Armazenamento comprado usado"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
+msgstr ""
msgid "UsageQuota|Recalculate repository usage"
msgstr "Recalcular o uso do repositório"
@@ -49098,8 +49319,14 @@ msgstr "A tabela abaixo mostra o uso desde %{usageSince}"
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr "Este espaço de nome não tem projetos que usaram executores compartilhados no período atual"
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
-msgstr ""
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr "Esta tabela omite projetos que usaram 0 minutos de computação ou 0 duração de executores compartilhados"
+
+msgid "UsageQuota|Total purchased storage"
+msgstr "Total de armazenamento comprado"
+
+msgid "UsageQuota|Total storage"
+msgstr "Total de armazenamento"
msgid "UsageQuota|Transfer"
msgstr "Transferência"
@@ -49303,7 +49530,7 @@ msgid "Use the Apple App Store Connect integration to easily connect to the Appl
msgstr "Use a integração da Apple App Store Connect para se conectar facilmente à Apple App Store com Fastlane em pipelines de CI/CD."
msgid "Use the Google Play integration to connect to Google Play with fastlane in CI/CD pipelines."
-msgstr ""
+msgstr "Use a integração do Google Play para se conectar ao Google Play com fastlane em pipelines de CI/CD."
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -49403,6 +49630,9 @@ msgstr "Usuário não tem uma solicitação pendente"
msgid "User does not have permission to create a Security Policy project."
msgstr "O usuário não tem permissão para criar um projeto de política de segurança."
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr "O usuário já foi desativado"
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr "Atividade"
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr "Ocorreu um erro ao carregar a atividade. Atualize a página para tentar novamente."
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr "Ocorreu um erro ao carregar os seguidores. Atualize a página para tentar novamente."
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr "Ocorreu um erro ao carregar os projetos pessoais. Atualize a página para tentar novamente."
@@ -49577,6 +49813,9 @@ msgstr "Projetos contribuídos"
msgid "UserProfile|Copy user ID"
msgstr "Copiar ID do usuário"
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr "Copiar ID do usuário: %{id}"
+
msgid "UserProfile|Edit profile"
msgstr "Editar perfil"
@@ -49658,6 +49897,9 @@ msgstr "Este usuário não está seguindo outros usuários."
msgid "UserProfile|Unconfirmed user"
msgstr "Usuário não confirmado"
+msgid "UserProfile|User ID copied to clipboard"
+msgstr "ID do usuário copiado para a área de transferência"
+
msgid "UserProfile|User ID: %{id}"
msgstr "ID de usuário: %{id}"
@@ -49863,7 +50105,7 @@ msgid "Value stream analytics"
msgstr ""
msgid "ValueStreamAnalyticsStage|There are 0 items to show in this stage, for these filters, within this time range."
-msgstr ""
+msgstr "Existem 0 itens para mostrar neste estágio, para estes filtros, neste intervalo de tempo."
msgid "ValueStreamAnalytics|%{stageCount}+ items"
msgstr "%{stageCount}+ itens"
@@ -49907,8 +50149,8 @@ msgstr "Ir para docs"
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
-msgstr "Métricas-chave"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
+msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
msgstr "Tempo médio em que um incidente foi aberto em um ambiente de produção no período de tempo determinado."
@@ -50033,8 +50275,8 @@ msgstr "Até então, os executores compartilhados não estarão disponíveis. %{
msgid "VerificationReminder|Your account has been validated"
msgstr "Sua conta foi validada"
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
-msgstr "Agora você poderá aproveitar as unidades gratuitas de computação em executores compartilhados."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
+msgstr "Agora você poderá aproveitar os minutos de computação gratuitos em executores compartilhados."
msgid "Verified"
msgstr "Verificado"
@@ -50048,9 +50290,6 @@ msgstr "Verificar configuração SAML"
msgid "Verify code"
msgstr "Verificar código"
-msgid "Verify configuration"
-msgstr "Verificar configuração"
-
msgid "Version"
msgstr "Versão"
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] "Ver gráfico"
-msgstr[1] "Ver gráficos"
-
msgid "View dependency details for your project"
msgstr "Ver detalhes de dependências para seu projeto"
@@ -50163,9 +50397,6 @@ msgstr "Ver arquivo @ "
msgid "View file @ %{commitSha}"
msgstr "Visualizar arquivo @ %{commitSha}"
-msgid "View full dashboard"
-msgstr "Ver painel completo"
-
msgid "View group in admin area"
msgstr "Ver grupo na área do administrador"
@@ -50220,9 +50451,6 @@ msgstr "Ver solicitação de mesclagem aberta"
msgid "View page @ "
msgstr "Ver página @ "
-msgid "View performance dashboard."
-msgstr "Ver painel de desempenho"
-
msgid "View project in admin area"
msgstr "Ver projeto na área do administrador"
@@ -50240,6 +50468,9 @@ msgstr "Ver arquivo substituído @ "
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr "Ver a documentação"
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr "Ver detalhes de uso"
@@ -50609,6 +50837,9 @@ msgstr "Revisão de código"
msgid "Vulnerability|Comments"
msgstr "Comentários"
+msgid "Vulnerability|Could not load prompt."
+msgstr "Não foi possível carregar o prompt."
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr "Arquivo:"
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr "Ocultar prompt"
+
msgid "Vulnerability|Identifier"
msgstr "Identificador"
@@ -50738,6 +50972,9 @@ msgstr "Gravidade"
msgid "Vulnerability|Severity:"
msgstr "Severidade:"
+msgid "Vulnerability|Show prompt"
+msgstr "Mostrar prompt"
+
msgid "Vulnerability|Status"
msgstr "Status"
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr "Aguardando a mesclagem (aberta e atribuída)"
-msgid "Waiting for performance data"
-msgstr "Aguardando dados de desempenho"
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr "Precisa visualizar os dados? Solicite acesso ao administrador."
@@ -50837,9 +51071,6 @@ msgstr "Nós não conseguimos encontrar qualquer %{scope} correspondência %{ter
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
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 ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr "Detectamos spam potencial no %{humanized_resource_name}. Por favor, resolva o reCAPTCHA para continuar."
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr "O que é o espelhamento de repositório?"
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr "O que é o esmagamento?"
@@ -51563,6 +51794,9 @@ msgstr "Remover requisição de acesso"
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr "Converter em tarefa"
msgid "WorkItem|Converted to task"
msgstr "Convertido em tarefa"
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr "Criar %{workItemType}"
@@ -51682,9 +51919,6 @@ msgstr "Data de vencimento"
msgid "WorkItem|Existing task"
msgstr "Tarefa existente"
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr "Um espaço de trabalho é um ambiente de sandbox virtual para seu códig
msgid "Workspaces|Cancel"
msgstr "Cancelar"
+msgid "Workspaces|Could not load workspaces"
+msgstr "Não foi possível carregar os espaços de trabalho"
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51917,10 +52160,10 @@ msgid "Workspaces|Running"
msgstr "Executando"
msgid "Workspaces|Select cluster agent"
-msgstr ""
+msgstr "Selecionar agente de cluster"
msgid "Workspaces|Select default editor"
-msgstr ""
+msgstr "Selecionar editor padrão"
msgid "Workspaces|Select project"
msgstr "Selecionar projeto"
@@ -51973,6 +52216,9 @@ msgstr "Você pode criar um espaço de trabalho apenas para projetos públicos."
msgid "Workspaces|You can't create a workspace for this project"
msgstr "Você não pode criar um espaço de trabalho para este projeto"
+msgid "Workspaces|Your workspaces"
+msgstr "Seus espaços de trabalho"
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52001,7 +52247,7 @@ msgid "Write an internal note or drag your files here…"
msgstr "Escreva uma nota interna ou arraste seus arquivos aqui…"
msgid "Write comment template content here…"
-msgstr ""
+msgstr "Escreva o conteúdo do modelo de comentário aqui…"
msgid "Write milestone description..."
msgstr "Escreva a descrição do marco..."
@@ -52083,9 +52329,6 @@ msgstr "Você está sendo redirecionado para fora do GitLab"
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr "Você será cobrado se exceder esse número. %{qsrOverageLinkStart}Como funciona o faturamento?%{qsrOverageLinkEnd}"
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr "Você está conectado ao servidor Prometheus, mas atualmente não há dados para exibir."
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr "Você não pode escrever numa instância secundária de somente leitura
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."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
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."
@@ -52381,7 +52627,7 @@ msgid "You could not create a new trigger."
msgstr "Você não pôde criar um novo gatilho."
msgid "You currently have no custom domains."
-msgstr ""
+msgstr "Atualmente, você não tem domínios personalizados."
msgid "You do not have access to any projects for creating incidents."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr "Seu dispositivo WebAuthn foi registrado!"
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr "Sua conta foi desativada"
@@ -52924,8 +53182,8 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr "Seu comentário não pôde ser enviado! Por favor, verifique sua conexão de rede e tente novamente."
-msgid "Your comment could not be updated! Please check your network connection and try again."
-msgstr "Seu comentário não pôde ser atualizado! Por favor, verifique sua conexão de rede e tente novamente."
+msgid "Your comment could not be updated because %{reason}."
+msgstr ""
msgid "Your comment will be discarded."
msgstr ""
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53319,7 +53580,7 @@ msgid "can not be changed to %{new_type}"
msgstr ""
msgid "can not be changed when assigned to an epic"
-msgstr ""
+msgstr "não pode ser alterado quando atribuído a um épico"
msgid "can not be set for this resource"
msgstr ""
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53702,7 +53963,7 @@ msgid "ciReport|New"
msgstr "Novo"
msgid "ciReport|New vulnerabilities are vulnerabilities that the security scan detects in the merge request that are different to existing vulnerabilities in the default branch."
-msgstr ""
+msgstr "Novas vulnerabilidades são vulnerabilidades que a verificação de segurança detecta na solicitação de mesclagem que são diferentes das vulnerabilidades existentes na ramificação padrão."
msgid "ciReport|No changes to code quality"
msgstr "Sem mudanças na qualidade do código"
@@ -53735,7 +53996,7 @@ msgid "ciReport|Security reports failed loading results"
msgstr ""
msgid "ciReport|Security scan results"
-msgstr ""
+msgstr "Resultados de verificação de segurança"
msgid "ciReport|Security scanning"
msgstr "Verificação de segurança"
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr "fechado em %{timeago}"
msgid "closed issue"
-msgstr "issue fechada"
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] "issue fechada"
+msgstr[1] "issues fechadas"
msgid "comment"
msgstr "comentário"
@@ -54041,18 +54301,6 @@ msgstr[1] "arquivos"
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr "para %{link_to_merge_request} com %{link_to_merge_request_source_branch}"
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr "para %{link_to_merge_request} com %{link_to_merge_request_source_branch} em %{link_to_merge_request_target_branch}"
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr "para %{link_to_pipeline_ref}"
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54121,7 +54369,7 @@ msgid "help"
msgstr "ajuda"
msgid "hours"
-msgstr ""
+msgstr "horas"
msgid "http:"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr "no grupo %{link_to_group}"
msgid "in project %{link_to_project}"
msgstr "no projeto %{link_to_project}"
+msgid "incident"
+msgstr "incidente"
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] "instâncias completas"
@@ -54354,9 +54605,6 @@ msgstr "carregá-lo mesmo assim"
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr "bloqueador por %{path_lock_user_name} %{created_at}"
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr "Falha ao mesclar."
msgid "mrWidget|Merged by"
msgstr "Mesclado por"
-msgid "mrWidget|More information"
-msgstr "Mais informações"
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr "Por favor, restaurar ou usar um branch %{type} diferente."
@@ -54725,17 +54967,17 @@ msgstr "Falha ao realizar merge automaticamente"
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
+msgstr "Para alterar estas mensagens padrão, edite os modelos para as mensagens de mesclagem e mensagens de squash de commit. %{linkStart}Saiba mais%{linkEnd}."
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
-msgstr "Para alterar esta mensagem padrão, edite o modelo para mensagens de commit de mesclagem. %{linkStart}Saiba mais.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
+msgstr "Para alterar esta mensagem padrão, edite o modelo para mensagens de commit de mesclagem. %{linkStart}Saiba mais%{linkEnd}."
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
+msgstr "Para alterar esta mensagem padrão, edite o modelo para mensagens de commit de squash. %{linkStart}Saiba mais%{linkEnd}."
-msgid "mrWidget|What is a merge train?"
-msgstr ""
+msgid "mrWidget|Your merge request is almost ready!"
+msgstr "Sua solicitação de mesclagem está quase pronta!"
msgid "mrWidget|Your password"
msgstr "Sua senha"
@@ -54747,7 +54989,7 @@ msgid "must be a boolean value"
msgstr ""
msgid "must be a root group."
-msgstr ""
+msgstr "deve ser um grupo raiz."
msgid "must be a root namespace"
msgstr ""
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr "deve ser falso quando a configuração de confirmação de email estiver desativada"
+
msgid "must be greater than start date"
msgstr "deve ser maior que a data de início"
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr "deve ter um repositório"
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr "issue aberta"
+msgid_plural "open issues"
+msgstr[0] "issue aberta"
+msgstr[1] "issues abertas"
msgid "or"
msgstr "ou"
@@ -55216,6 +55463,9 @@ msgstr "nome da tag"
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr "caso de teste"
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr "atualizado"
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/pt_PT/gitlab.po b/locale/pt_PT/gitlab.po
index 3dd7bb3157b..41fa12e8b8c 100644
--- a/locale/pt_PT/gitlab.po
+++ b/locale/pt_PT/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: pt-PT\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:45\n"
+"PO-Revision-Date: 2023-07-11 04:48\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] "mais %d comentário"
msgstr[1] "mais %d comentários"
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr "Tokens de Acesso"
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr "Criado"
msgid "AccessTokens|Feed token"
msgstr "Token de feed"
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr "Token de email recebido"
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr "Tokens de Acesso Pessoal"
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr "Elas são as únicas palavras-passe aceites quando tens a autenticação de dois fatores (2FA) ativada."
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr "Também podes usar tokens de acesso pessoal para autenticar contra Git através de HTTP."
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr "Adicionar uma lista numerada"
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr "A adição de novas aplicações está desativada na tua instância do GitLab. Entra em contacto com o teu administrador do GitLab para obter a permissão"
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator email"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr "És tu!"
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr "Ordenar por"
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr "Após uma atualização de palavra-passe bem-sucedida, serás redirecionado à tela de início de sessão."
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr "Após uma atualização bem-sucedida da palavra-passe, serás redirecionado para a página de início de sessão, onde poderás iniciar a sessão com a nova palavra-passe."
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr "Todas as alterações foram enviadas"
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr "Ocorreu um erro"
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr "Ocorreu um erro ao adicionar um novo rascunho."
-
msgid "An error occurred creating the new branch."
msgstr "Ocorreu um erro ao criar o novo ramo."
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr "Ocorreu um erro ao carregar o ficheiro"
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr "Ocorreu um erro ao atualizar o comentário"
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr "Estatísticas"
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr "Anónimo"
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr "Tens a certeza? Remover esta chave GPG não afeta as confirmações já
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr "Listas de responsáveis não disponíveis com a tua licença atual"
-msgid "Assignee(s)"
-msgstr "Responsável(eis)"
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Filter by audit event type"
+msgstr ""
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr "ago"
@@ -7131,28 +7205,28 @@ msgstr "Faturação"
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr "Este grupo utiliza o plano de associados com o teu grupo pai."
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr "Expandir"
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,11 +9102,11 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
-msgstr "Alterar responsável(eis)"
+msgid "Change assignees"
+msgstr ""
-msgid "Change assignee(s)."
-msgstr "Alterar responsável(eis)."
+msgid "Change assignees."
+msgstr ""
msgid "Change branches"
msgstr ""
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr "Alterar caminho"
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,8 +9150,11 @@ msgstr ""
msgid "Change your password"
msgstr "Alterar a tua palavra-passe"
-msgid "Change your password or recover your current one"
-msgstr "Altera a tua palavra-passe ou recupera a tua atual"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
+msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr "Chat"
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr "Escolhe um tipo..."
msgid "Choose file…"
msgstr "Escolher um ficheiro…"
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr "Escolhe o grupo de nível superior para as tuas importações de repositório."
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr "Fechar"
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr "Sabias que?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr "Ativar ou desativar a conexão do GitLab com o teu cluster de Kubernetes."
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr "Enviar para o ramo %{branchName}"
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr "Configurar 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 ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr "Configurar instalação existente"
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
+msgstr ""
+
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr "Ficheiros, diretórios e submódulos no caminho %{path} para referência de envio %{ref}"
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr "comentou no envio %{commitLink}"
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr "Houve um erro ao tentar validar a tua consulta"
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr "Nenhum dado encontrado"
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ 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 "Esta confirmação faz parte do pedido de mesclagem %{link_to_merge_request}. Os comentários criados aqui, serão criados no contexto desse pedido de mesclagem."
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/ro_RO/gitlab.po b/locale/ro_RO/gitlab.po
index c525ec3ae4a..2b0113d551a 100644
--- a/locale/ro_RO/gitlab.po
+++ b/locale/ro_RO/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ro\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:43\n"
+"PO-Revision-Date: 2023-07-11 04:46\n"
msgid " %{start} to %{end}"
msgstr " de la %{start} până la %{end}"
@@ -103,6 +103,18 @@ msgstr[0] "%d Aprobare"
msgstr[1] "%d Aprobări"
msgstr[2] "%d de Aprobări"
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] "%d Modul"
@@ -193,6 +205,12 @@ msgstr[0] "%d problemă atribuită"
msgstr[1] "%d probleme atribuite"
msgstr[2] "%d de probleme atribuite"
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] "%d fișier modificat"
@@ -409,18 +427,6 @@ msgstr[0] "%d comentariu în plus"
msgstr[1] "%d comentarii în plus"
msgstr[2] "%d de comentarii în plus"
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -754,9 +760,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr "%{count} de %{pluralized_subject} conexe: %{links}"
-
msgid "%{count} selected"
msgstr "%{count} selectat(e)"
@@ -799,6 +802,9 @@ msgstr "%{docs_link_start}Ce este Large File Storage?%{docs_link_end}"
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr "%{docs_link_start}Ce este autentificarea cu doi factori?%{docs_link_end}"
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr "%{duration}ms"
@@ -871,7 +877,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr "%{integrations_link_start}Integrările%{link_end} vă permit să faceți aplicații terțe parte din fluxul de lucru GitLab. Dacă integrările disponibile nu vă satisfac nevoile, considerați posibilitatea de a utiliza un %{webhooks_link_start}webhook%{link_end}."
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -895,6 +904,9 @@ msgstr "%{italic_start}Ce este nou%{italic_end} este inactiv și nu poate fi viz
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr "%{itemsCount} probleme cu o limită de %{maxIssueCount}"
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1219,6 +1231,12 @@ msgstr "%{spanStart}la linia%{spanEnd} %{errorLine}%{errorColumn}"
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr "%{spanStart}în%{spanEnd} %{errorFn}"
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr "%{start} la %{end}"
@@ -1246,8 +1264,8 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
-msgstr "%{strongOpen}Avertisment:%{strongClose} Linkurile de grup SAML pot face ca GitLab să înlăture automat membrii din grupuri."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
+msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
msgid_plural "%{strongStart}%{count}%{strongEnd} commits"
@@ -1378,9 +1396,6 @@ msgstr "%{type} acceptă numai numele %{name}"
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr "%{userName} (nu poate îmbina)"
-
msgid "%{userName}'s avatar"
msgstr "Avatarul lui %{userName}"
@@ -2089,6 +2104,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2542,6 +2563,9 @@ msgstr "Tokenuri de acces"
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr "Sunteți sigur?"
@@ -2560,12 +2584,18 @@ msgstr "Copiați tokenul de e-mail primit"
msgid "AccessTokens|Copy static object token"
msgstr "Copiați tokenul obiectului static"
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr "Creat"
msgid "AccessTokens|Feed token"
msgstr "Token de flux"
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr "Token de e-mail primit"
@@ -2584,6 +2614,15 @@ msgstr "Păstrați acest token secret. Oricine îl are poate citi fluxurile RSS
msgid "AccessTokens|Personal Access Tokens"
msgstr "Tokenuri de acces personal"
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr "Token de obiect static"
@@ -2593,6 +2632,9 @@ msgstr "Ultima dată când a fost folosit un token"
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ă."
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr "De asemenea, puteți utiliza tokenuri de acces personale pentru a vă autentifica la Git prin HTTP."
@@ -2644,13 +2686,13 @@ msgstr "Reparați-vă pipeline-urile prin validarea contului dumneavoastră"
msgid "AccountValidation|I'll bring my own runners"
msgstr "ÃŽmi voi aduce proprii executori"
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr "Aflați mai multe."
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2761,9 +2803,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr "Adăugare reuniune Zoom."
-msgid "Add a %{type}"
-msgstr "Adăugare %{type}"
-
msgid "Add a GCP region"
msgstr "Adăugați o regiune GCP"
@@ -2812,6 +2851,9 @@ msgstr "Adăugați o nouă problemă"
msgid "Add a numbered list"
msgstr "Adăugați o listă numerotată"
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr "Adăugați o epică asociată"
@@ -3067,6 +3109,9 @@ msgstr "S-a adăugat în această versiune"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr "Adăugarea de aplicații noi este dezactivată în instanța dvs. GitLab. Vă rugăm să contactați administratorul dvs. GitLab pentru a obține permisiunea"
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -3088,9 +3133,6 @@ msgstr "Text suplimentar de afișat pe pagina de autentificare"
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr "Adresa"
@@ -3514,24 +3556,15 @@ msgstr "Dacă nu există niciun index existent, GitLab creează unul."
msgid "AdminSettings|Import sources"
msgstr "Surse de import"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
+msgstr ""
+
msgid "AdminSettings|Inactive project deletion"
msgstr "Ștergerea proiectelor inactive"
msgid "AdminSettings|Instance runners expiration"
msgstr "Expirarea executanților de instanță"
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
-msgstr ""
-
-msgid "AdminSettings|Jitsu project ID"
-msgstr ""
-
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"
@@ -3613,6 +3646,9 @@ msgstr "Protejați în mod implicit variabilele CI/CD"
msgid "AdminSettings|Registration Features include:"
msgstr "Funcțiile de înregistrare includ:"
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr "Solicitați utilizatorilor să dovedească proprietatea asupra domeniilor personalizate"
@@ -3682,9 +3718,6 @@ msgstr "Setarea trebuie să fie mai mare de 0."
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr "Setările de mărime și domeniu pentru site-urile statice Pages."
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3694,9 +3727,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr "Domeniul implicit de utilizat pentru etapele Auto Review Apps și Auto Deploy în toate proiectele."
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3727,10 +3757,10 @@ msgstr "Numărul total de joburi în pipeline-urile active în prezent"
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr "Utilizați serviciul AWS OpenSearch cu acreditările IAM"
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3739,9 +3769,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr "Atât utilizatorii, cât și grupurile trebuie să accepte invitația înainte de a fi adăugați la un grup sau la un proiect."
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr "Atunci când este în pauză, GitLab continuă să urmărească modificările. Acest lucru este util pentru migrările de clustere/indexuri."
-
msgid "AdminSettings|When to delete inactive projects"
msgstr "Când să ștergeți proiectele inactive"
@@ -3964,9 +3991,6 @@ msgstr "Informații importante despre utilizarea instanței dvs. GitLab"
msgid "AdminUsers|Is using seat"
msgstr "Folosește un seat"
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr "Sunteți d-voastră!"
@@ -4012,6 +4036,9 @@ msgstr "Proiectele personale, istoricul grupurilor și al utilizatorilor vor fi
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr "Reactivarea unui utilizator va:"
@@ -4051,7 +4078,7 @@ msgstr "Skype"
msgid "AdminUsers|Sort by"
msgstr "Sortare după"
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4321,9 +4348,6 @@ msgstr "Folosiți mapări de căutare a codurilor învechite. Pentru a îmbunăt
msgid "After a successful password update you will be redirected to login screen."
msgstr "După o actualizare reușită a parolei, veți fi redirecționat către ecranul de conectare."
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr "După o actualizare cu succes a parolei, veți fi redirecționat către pagina de autentificare, unde vă puteți conecta cu noua parolă."
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4360,8 +4384,8 @@ msgstr "Flux de activitate"
msgid "AlertManagement|Alert"
msgstr "Alertă"
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
-msgstr "Responsabil(i) alertă: %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
+msgstr ""
msgid "AlertManagement|Alert detail"
msgstr "Detaliu despre alerta"
@@ -4465,11 +4489,11 @@ msgstr "A survenit o eroare la afiÈ™area alertei. Vă rugăm să reîmprospătaÈ
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr "A survenit o eroare la afișarea alertelor. Confirmați detaliile de configurare ale punctului final pentru a vă asigura că apar alerte."
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
-msgstr "A survenit o eroare la actualizarea listei responsabililor. Vă rugăm să încercați din nou."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
+msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
-msgstr "A survenit o eroare la actualizarea celor responsabili la această alertă. Vă rugăm să încercați din nou."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
+msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
msgstr "A survenit o eroare la actualizarea statutului alertei."
@@ -4579,9 +4603,6 @@ msgstr "Continuați cu editarea"
msgid "AlertSettings|Prometheus"
msgstr "Prometheus"
-msgid "AlertSettings|Prometheus API base URL"
-msgstr "Adresa URL de bază a API-ului Prometheus"
-
msgid "AlertSettings|Reset Key"
msgstr "Resetare cheie"
@@ -4618,9 +4639,6 @@ msgstr "Formularul are modificări nesalvate. Cum doriți să continuați?"
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr "Pentru a crea o mapare personalizată, introduceți un exemplu de payload de la instrumentul de monitorizare, în format JSON. Selectați butonul „Analizare câmpuri payload†pentru a continua."
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr "URL-ul nu poate fi gol și trebuie să înceapă cu http: sau https:."
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr "Utilizați URL-ul și cheia de autorizare de mai jos pentru a configura modul în care Prometheus trimite alerte către GitLab. Consultați %{linkStart}documentația GitLab%{linkEnd} pentru a afla cum să vă configurați punctul final."
@@ -4717,6 +4735,9 @@ msgstr "Toate ramurile"
msgid "All changes are committed"
msgstr "Toate schimbările sunt comise"
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr "Toți utilizatorii eligibili"
@@ -4882,6 +4903,9 @@ msgstr "De asemenea, înlăturați apartenența directă a utilizatorilor la sub
msgid "Also unassign this user from related issues and merge requests"
msgstr "De asemenea, anulați atribuirea acestui utilizator de la problemele și merge request-urile asociate"
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr "URL alternativ de asistență pentru pagina de Ajutor și meniul derulant Ajutor."
@@ -4933,12 +4957,6 @@ msgstr "A apărut o eroare"
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr "O eroare de raportare în care rezultatul unui test indică în mod eronat prezența unei vulnerabilități într-un sistem atunci când vulnerabilitatea nu este prezentă."
-msgid "An error occurred adding a draft to the thread."
-msgstr "S-a produs o eroare la adăugarea unui draft la subiect."
-
-msgid "An error occurred adding a new draft."
-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 la crearea noii ramuri."
@@ -4981,6 +4999,12 @@ msgstr "A survenit o eroare la aprobare, încercați din nou."
msgid "An error occurred while checking group path. Please refresh and try again."
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 creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr "A apărut o eroare în timpul decodării fișierului."
@@ -5140,9 +5164,6 @@ msgstr "A apărut o eroare în timpul încărcării proiectelor."
msgid "An error occurred while loading the blob controls."
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 "A apărut o eroare în timpul încărcării datelor. Vă rugăm să încercați din nou."
-
msgid "An error occurred while loading the file"
msgstr "A apărut o eroare la încărcarea fișierului"
@@ -5260,9 +5281,6 @@ msgstr "S-a produs o eroare la actualizarea configurației."
msgid "An error occurred while updating labels."
msgstr "S-a produs o eroare la actualizarea etichetelor."
-msgid "An error occurred while updating the comment"
-msgstr "A apărut o eroare în timp ce se actualiza comentariul"
-
msgid "An error occurred while updating the configuration."
msgstr "A apărut o eroare în timp ce se actualiza configurația."
@@ -5350,7 +5368,7 @@ msgstr "A apărut o eroare necunoscută."
msgid "Analytics"
msgstr "Analize"
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5416,12 +5434,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5431,7 +5458,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5470,6 +5497,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5482,6 +5521,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5500,6 +5542,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr "Analizați-vă dependențele pentru vulnerabilități cunoscute."
@@ -5524,6 +5572,9 @@ msgstr "Și acest token de înregistrare:"
msgid "Anonymous"
msgstr "Anonim"
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr "Un alt tracker de probleme este deja în uz. Un singur serviciu de urmărire a problemelor poate fi activ la un moment dat."
@@ -6322,9 +6373,6 @@ msgstr "Sunteți sigur? Înlăturarea acestei chei GPG nu afectează commit-uril
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
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 graficele"
-
msgid "Artifact"
msgstr "Artefact"
@@ -6415,6 +6463,9 @@ msgstr "Mărimea totală a artefactelor"
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr "Pe măsură ce continuăm să dezvoltăm mai multe funcții pentru SAST, ne-ar plăcea să primim feedback-ul dvs. cu privire la funcția de configurare SAST în %{linkStart}această problemă%{linkEnd}."
@@ -6469,8 +6520,8 @@ msgstr "Atribuire personală"
msgid "Assign reviewer"
msgstr "Atribuiți un revizor"
-msgid "Assign reviewer(s)"
-msgstr "Atribuiți revizor(i)"
+msgid "Assign reviewers"
+msgstr ""
msgid "Assign severity"
msgstr "Atribuiți severitatea"
@@ -6529,9 +6580,6 @@ msgstr "Responsabilul nu are permisiuni"
msgid "Assignee lists not available with your current license"
msgstr "Listele de responsabili nu sunt disponibile cu licența dvs. actuală"
-msgid "Assignee(s)"
-msgstr "Responsabil(i)"
-
msgid "Assignees"
msgstr "Responsabili"
@@ -6673,17 +6721,23 @@ msgstr "S-a produs o eroare la preluarea fluxurilor de evenimente de audit exter
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr "A apărut o eroare la actualizarea destinației fluxului de evenimente de audit extern. Vă rugăm să încercați din nou."
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr "Anulați editarea"
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr "Anteturi HTTP personalizate (opțional)"
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
-msgstr "Ștergeți %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
+msgstr ""
msgid "AuditStreams|Destination URL"
msgstr "URL-ul de destinație"
@@ -6694,19 +6748,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr "Destinațiile primesc toate datele evenimentelor de audit"
-msgid "AuditStreams|Edit %{link}"
-msgstr "Editați %{link}"
-
msgid "AuditStreams|Event filtering (optional)"
msgstr ""
+msgid "AuditStreams|Filter by audit event type"
+msgstr ""
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
+msgstr ""
+
msgid "AuditStreams|Header"
msgstr "Antet"
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr "A fost atins numărul maxim de %{number} (de) anteturi HTTP."
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6715,6 +6784,9 @@ msgstr "Înlăturați antetul personalizat"
msgid "AuditStreams|Save external stream destination"
msgstr "Salvați destinația fluxului extern"
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr "Configurați streamingul pentru evenimentele de audit"
@@ -6742,10 +6814,7 @@ msgstr "Valoare"
msgid "AuditStreams|Verification token"
msgstr "Token de verificare"
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6757,6 +6826,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr "Aug"
@@ -7294,28 +7369,28 @@ msgstr "Facturare"
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr "%{group_name} folosește în prezent %{plan_name}."
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr "10GB de transfer pe lună"
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr "5 utilizatori pe spațiu de nume"
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7486,6 +7561,9 @@ msgstr "Asistență"
msgid "BillingPlans|Talk to an expert today."
msgstr "Discutați cu un expert astăzi."
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr "Acest grup utilizează planul asociat grupului său părinte."
@@ -7513,11 +7591,8 @@ msgstr "Suntem aici pentru a vă ajuta."
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 "Î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 "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 "Va trebui să %{move_link_start}mutați acest proiect%{move_link_end} într-unul din grupurile dumneavoastră."
+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 your projects to it%{move_link_end}."
+msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr "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."
@@ -7576,10 +7651,10 @@ msgstr "Seats în uz / Seats în abonament"
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
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 units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7591,7 +7666,7 @@ msgstr "Validați contul"
msgid "Billings|Validate user account"
msgstr "Validați contul de utilizator"
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7888,12 +7963,18 @@ msgstr "A apărut o eroare în timpul creării problemei. Vă rugăm să încerc
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr "A apărut o eroare în timpul creării listei. Vă rugăm să încercați din nou."
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr "S-a produs o eroare în timpul căutării grupurilor copil. Vă rugăm să încercați din nou."
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr "A apărut o eroare în timpul preluării proiectelor de grup. Vă rugăm să încercați din nou."
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr "A apărut o eroare în timpul preluării problemelor. Vă rugăm să reîncărcați pagina."
@@ -7957,9 +8038,6 @@ msgstr "Extindeți"
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr "Nu s-a reușit preluarea %{issuableType}s care blochează"
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr "Mutați cardul"
@@ -8017,6 +8095,9 @@ msgstr "Încărcați mai multe probleme"
msgid "Board|Loading epics"
msgstr "Se încarcă epicele"
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr "Text îngroșat"
@@ -8434,19 +8515,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8683,6 +8773,9 @@ msgstr "Pe lună"
msgid "By quarter"
msgstr "Pe trimestru"
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr "Pe săptămână"
@@ -9178,11 +9271,11 @@ msgstr "Rata eșecului schimbărilor"
msgid "Change assignee"
msgstr "Schimbare de responsabil"
-msgid "Change assignee(s)"
-msgstr "Schimbare de responsabil(i)"
+msgid "Change assignees"
+msgstr ""
-msgid "Change assignee(s)."
-msgstr "Schimbare de responsabil(i)"
+msgid "Change assignees."
+msgstr ""
msgid "Change branches"
msgstr "Schimbați ramurile"
@@ -9199,11 +9292,11 @@ msgstr "Schimbare de obiectiv"
msgid "Change path"
msgstr "Schimbați calea"
-msgid "Change reviewer(s)"
-msgstr "Schimbare de revizor(i)"
+msgid "Change reviewers"
+msgstr ""
-msgid "Change reviewer(s)."
-msgstr "Schimbare de revizor(i)"
+msgid "Change reviewers."
+msgstr ""
msgid "Change role"
msgstr "Schimbați rolul"
@@ -9226,8 +9319,11 @@ msgstr ""
msgid "Change your password"
msgstr "Schimbați-vă parola"
-msgid "Change your password or recover your current one"
-msgstr "Schimbați-vă parola sau recuperați-vă parola curentă"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
+msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
@@ -9274,14 +9370,14 @@ msgstr "Modificările dvs. vor fi comise în %{branchName} deoarece un merge req
msgid "Changed"
msgstr "Modificat"
-msgid "Changed assignee(s)."
-msgstr "Responsabil(i) schimbat(i)."
+msgid "Changed assignees."
+msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr "Metoda de îmbinare a fost schimbată în %{merge_method}"
-msgid "Changed reviewer(s)."
-msgstr "Recenzent(i) modificat(i)."
+msgid "Changed reviewers."
+msgstr ""
msgid "Changed squash option to %{squash_option}"
msgstr "Opțiunea squash a fost schimbată în %{squash_option}"
@@ -9322,9 +9418,6 @@ msgstr "Caractere rămase"
msgid "Characters over limit"
msgstr "Caractere peste limită"
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr "Graficele nu pot fi afișate deoarece solicitarea de date a expirat. %{documentationLink}"
-
msgid "Chat"
msgstr "Chat"
@@ -9430,7 +9523,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr "%{selectedPlanPrice} USD pe pachet de stocare de 10 GB pe an"
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9445,24 +9538,24 @@ msgstr "%{cardType} care se termină în %{lastFourDigits}"
msgid "Checkout|%{name}'s GitLab subscription"
msgstr "Abonament GitLab pentru %{name}"
+msgid "Checkout|%{name}'s compute minutes"
+msgstr ""
+
msgid "Checkout|%{name}'s storage subscription"
msgstr "Abonamentul de stocare pentru %{name}"
-msgid "Checkout|%{name}'s units of compute"
-msgstr ""
-
msgid "Checkout|%{quantity} GB of storage"
msgstr "%{quantity} GB de stocare"
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] "%{quantity} pachet de stocare"
msgstr[1] "%{quantity} pachete de stocare"
msgstr[2] "%{quantity} de pachete de stocare"
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr "Planul %{selectedPlanText}"
@@ -9502,7 +9595,7 @@ msgstr "OraÈ™"
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9643,12 +9736,12 @@ msgstr "Taxa"
msgid "Checkout|Total"
msgstr "Total"
+msgid "Checkout|Total compute minutes: %{quantity}"
+msgstr ""
+
msgid "Checkout|Total storage: %{quantity} GB"
msgstr "Spațiu de stocare total: %{quantity} GB"
-msgid "Checkout|Total units of compute: %{quantity}"
-msgstr ""
-
msgid "Checkout|Users"
msgstr "Utilizatori"
@@ -9673,7 +9766,7 @@ msgstr "un abonament de stocare"
msgid "Checkout|company or team"
msgstr "companie sau echipă"
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9721,6 +9814,9 @@ msgstr "Alegeți un tip…"
msgid "Choose file…"
msgstr "Alegeți fișierul…"
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr "Alegeți grupul de nivel superior pentru importurile de repozitoriu."
@@ -9748,16 +9844,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9772,6 +9868,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9799,6 +9898,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10171,6 +10273,9 @@ msgstr "Clonează această problemă, fără comentarii, în %{project}."
msgid "Close"
msgstr "Închideți"
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr "Închideți %{issueType}"
@@ -10228,6 +10333,9 @@ msgstr "Închideți această %{quick_action_target}."
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr "Cloud Run"
@@ -10822,9 +10930,6 @@ msgstr "Opțiuni avansate privind integrarea acestui cluster Kubernetes"
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr "Permiteți GitLab să administreze spațiile de nume și conturile de servicii pentru acest cluster."
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr "Permiteți ca GitLab să interogheze un Prometheus în cluster configurat în mod specific pentru metrici."
-
msgid "ClusterIntegration|Amazon EKS"
msgstr "Amazon EKS"
@@ -10909,9 +11014,6 @@ msgstr "Știați că?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr "Serviciul Elastic Kubernetes"
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr "Activați integrarea Prometheus"
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr "Activați sau dezactivați conexiunea GitLab la clusterul dvs. Kubernetes."
@@ -10972,9 +11074,6 @@ msgstr "Integrare dezactivată"
msgid "ClusterIntegration|Integration enabled"
msgstr "Integrare activată"
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr "Integrările vă permit să utilizați aplicațiile instalate în clusterul dvs. ca parte a fluxului de lucru GitLab."
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr "Se creează clusterul Kubernetes..."
@@ -11218,6 +11317,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11263,6 +11365,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11278,10 +11386,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11377,15 +11482,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11479,18 +11593,12 @@ msgstr "Commit șters"
msgid "Commit message"
msgstr "Mesajul commit-ului"
-msgid "Commit message (optional)"
-msgstr "Mesaj de commit (opțional)"
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr "Statistici de commit-uri pentru %{ref} %{start_time} - %{end_time}"
-msgid "Commit to %{branchName} branch"
-msgstr "Commit la ramura %{branchName}"
-
msgid "CommitBoxTitle|Commit"
msgstr "Commit"
@@ -11617,15 +11725,30 @@ msgstr "Nu este nimic de comparat."
msgid "CompareRevisions|Branches"
msgstr "Ramuri"
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr "Comparați"
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr "Creați un merge request"
msgid "CompareRevisions|Filter by Git revision"
msgstr "Filtrați după revizuirea Git"
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr "Selectați revizuirea Git"
@@ -11635,6 +11758,12 @@ msgstr "Selectați ramura/eticheta"
msgid "CompareRevisions|Select target project"
msgstr "Selectați proiectul țintă"
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr "Comutați revizuirile"
@@ -11671,10 +11800,13 @@ msgstr "Completat"
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr "S-a completat în %{duration_seconds} (de) secunde (%{relative_time})"
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11872,6 +12004,9 @@ msgstr "Mai puțin de 2 aprobatori"
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr "Nu s-au constatat încălcări"
@@ -11917,15 +12052,15 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
+msgid "Compute minutes"
+msgstr ""
+
msgid "Compute quota"
msgstr ""
msgid "Compute quota:"
msgstr ""
-msgid "Confidence"
-msgstr "ÃŽncredere"
-
msgid "Confidential"
msgstr "Confidențial"
@@ -11980,9 +12115,6 @@ msgstr "Configurați timeout-urile Gitaly."
msgid "Configure Integrations"
msgstr "Configurați integrările"
-msgid "Configure Prometheus"
-msgstr "Configurați 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 "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."
@@ -12019,9 +12151,6 @@ msgstr "Configurați permisiunile avansate, Large File Storage, autentificarea c
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr "Configurați instalația existentă"
-
msgid "Configure pipeline"
msgstr "Configurați pipeline-ul"
@@ -12184,15 +12313,9 @@ msgstr ""
msgid "Connecting..."
msgstr "Se conectează..."
-msgid "Connection failed"
-msgstr "Conectare eșuată"
-
msgid "Connection failure"
msgstr "Eșec de conectare"
-msgid "Connection timed out"
-msgstr "Conexiunea a expirat"
-
msgid "Consistency guarantee method"
msgstr "Metoda de garantare a consistenței"
@@ -12583,9 +12706,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr "Conținut analizat cu %{link}."
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr "Trebuie să furnizați o funcție renderMarkdown sau un serializator personalizat"
@@ -12709,6 +12829,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr "Contribuții pentru %{calendar_date}"
@@ -12838,9 +12991,6 @@ msgstr "Copiați linkul"
msgid "Copy link URL"
msgstr "Copiere URL de link"
-msgid "Copy link to chart"
-msgstr "Copiați linkul către grafic"
-
msgid "Copy merge request URL"
msgstr ""
@@ -13006,6 +13156,9 @@ msgstr "Nu s-a putut înlătura declanșatorul."
msgid "Could not restore the group"
msgstr "Nu s-a putut restabili grupul"
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr "Nu s-a putut revoca tokenul de acces %{access_token_name}."
@@ -13060,9 +13213,6 @@ msgstr "Creați %{environment}"
msgid "Create %{humanized_resource_name}"
msgstr "Creați %{humanized_resource_name}"
-msgid "Create %{type}"
-msgstr "Creați %{type}"
-
msgid "Create %{workspace} label"
msgstr "Creați eticheta %{workspace}"
@@ -13105,6 +13255,9 @@ msgstr "Creați o nouă ramură"
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr "Creați un fișier nou, deoarece nu există încă niciun fișier. După aceea, veți putea să vă comiteți modificările."
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr "Creați o nouă problemă"
@@ -13390,6 +13543,9 @@ msgstr "Sfârșitul etapei problemei"
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr "Lungime maximă %{maxLength} caractere"
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr "Numele este obligatoriu"
@@ -13534,9 +13690,6 @@ msgstr "Se creează"
msgid "Creating epic"
msgstr "Se creează epica"
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr "Crearea graficelor utilizează datele de pe serverul Prometheus. Dacă durează mult, asigurați-vă că datele sunt disponibile."
-
msgid "Creator"
msgstr "Creator"
@@ -14761,6 +14914,12 @@ msgstr "Validarea mărimii arhivei decomprimate a eșuat."
msgid "Decrease"
msgstr "Descreștere"
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr "Implicit - Nu se execută niciodată"
@@ -15028,6 +15187,9 @@ msgstr "Ștergeți variabila"
msgid "Delete video"
msgstr "Ștergeți videoclipul"
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr "Nu s-au putut elimina evenimentele. Vă rugăm să încercați din nou sau să contactați administratorul."
@@ -15148,6 +15310,12 @@ msgstr[0] "%d vulnerabilitate detectată"
msgstr[1] "%d vulnerabilități detectate"
msgstr[2] "%d de vulnerabilități detectate"
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr "%{remainingLicensesCount} mai mult"
@@ -15190,9 +15358,15 @@ msgstr "Locație și calea dependenței"
msgid "Dependencies|Packager"
msgstr "Manager de pachete"
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr "Software Bill of Materials (SBOM) bazat pe scanarea %{linkStart}reușită cea mai recentă%{linkEnd}"
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr "Jobul %{codeStartTag}dependency_scanning%{codeEndTag} a eșuat și nu poate genera lista. Vă rugăm să vă asigurați că lucrarea se execută corect și să rulați din nou pipeline-ul."
@@ -15226,6 +15400,9 @@ msgstr ""
msgid "Dependency list"
msgstr "Listă de dependențe"
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr "Toate elementele din cache sunt programate pentru înlăturare."
@@ -15244,6 +15421,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr "Conține %{count} blob-uri de imagini (%{size})"
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15268,6 +15448,9 @@ msgstr "Activați Proxy de Dependență și setările pentru ștergerea memoriei
msgid "DependencyProxy|Image list"
msgstr "Lista de imagini"
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr "Programat pentru ștergere"
@@ -15277,6 +15460,9 @@ 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 "Pentru a vedea prefixul imaginii și ce se află în cache, vizitați %{linkStart}Proxy de Dependență%{linkEnd}"
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr "Atunci când este activată, imaginile mai vechi de 90 de zile vor fi eliminate din cache."
@@ -15592,9 +15778,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr " Aprobări actuale: %{current}"
@@ -15748,12 +15931,6 @@ msgstr "succes"
msgid "Deprecated API rate limits"
msgstr "Limite de rată API depreciate"
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr "Pentru informații cu privire la un posibil înlocuitor, %{epicStart}aflați mai multe despre Opstrace %{epicEnd}."
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr "Funcția de metrici a fost abandonată în GitLab 14.7."
-
msgid "Deprioritize label"
msgstr "Deprioritizați eticheta"
@@ -15763,9 +15940,6 @@ msgstr "Descrieți scopul modificărilor și ce ar trebui să aibă în vedere r
msgid "Description"
msgstr "Descriere"
-msgid "Description (alt text)"
-msgstr "Descriere ( text alt)"
-
msgid "Description (optional)"
msgstr "Descriere (opțional)"
@@ -16519,7 +16693,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr "Domeniile următoare sunt configurate pentru proiectele din acest grup. Utilizatorii cu adrese de e-mail care corespund unui domeniu verificat nu trebuie să-și confirme contul."
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16564,15 +16738,15 @@ msgstr "Descărcați (%{fileSizeReadable})"
msgid "Download (%{size})"
msgstr "Descărcați (%{size})"
-msgid "Download CSV"
-msgstr "Descărcați CSV"
-
msgid "Download PDF"
msgstr "Descărcare PDF"
msgid "Download artifacts"
msgstr "Descărcați artefacte"
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr "Descărcați codurile"
@@ -16858,6 +17032,9 @@ msgstr "Modificați cheia de implementare publică"
msgid "Edit sidebar"
msgstr "Editați bara laterală"
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr "Editați tabelul"
@@ -16963,6 +17140,9 @@ msgstr "E-mailul nu a putut fi trimis"
msgid "Email display name"
msgstr "Numele afișat de e-mail"
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr "Email neverificat. Vă rugăm să vă verificați e-mailul în Salesforce."
@@ -17299,9 +17479,6 @@ msgstr "Impuneți autentificarea cu doi factori pentru toate autentificările ut
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr "Îmbunătățiți securitatea prin stocarea cheilor conturilor de servicii în administratorii de secrete - aflați mai multe despre %{docLinkStart}managementul secretului cu GitLab%{docLinkEnd}"
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr "Asigurați-vă că este disponibilă conectivitatea de la serverul GitLab la serverul Prometheus."
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr "Asigurați-vă că %{linkStart}mediul dvs. face parte din etapa de implementare%{linkEnd} a pipeline-ului dvs. CI pentru a urmări implementările în clusterul dvs."
@@ -17362,9 +17539,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr "Introduceți următoarele pentru a confirma:"
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr "Introduceți numele aplicației dvs., iar noi vom returna un %{type} unic."
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr "IntroduceÈ›i numărul de secunde sau alte date lizibile de către om, cum ar fi „1 orăâ€. Acest timp de expirare are prioritate față de timpii de expirare mai mici setaÈ›i pentru proiect."
@@ -17392,16 +17566,19 @@ msgstr "Introduceți parola pentru a aproba"
msgid "Enterprise"
msgstr "Enterprise"
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
+msgstr ""
+
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17566,9 +17743,6 @@ msgstr ""
msgid "Environments|Job"
msgstr "Joburi"
-msgid "Environments|Learn about environments"
-msgstr "Aflați mai multe despre medii"
-
msgid "Environments|Learn more about stopping environments"
msgstr "Aflați mai multe despre oprirea mediilor"
@@ -17581,9 +17755,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr "Mediu nou"
-msgid "Environments|No deployed environments"
-msgstr "Nu există medii implementate"
-
msgid "Environments|No deployments yet"
msgstr "Nu există încă implementări"
@@ -17779,12 +17950,6 @@ msgstr "Epicele vă permit să vă gestionați portofoliul de proiecte mai efici
msgid "Epics, issues, and merge requests"
msgstr "Epice, probleme și merge request-uri"
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr "%{startDate} – %{dueDate}"
-
-msgid "Epics|%{startDate} – No due date"
-msgstr "%{startDate} – Fără dată scadentă"
-
msgid "Epics|Add a new epic"
msgstr "Adăugați o nouă epică"
@@ -17800,9 +17965,6 @@ msgstr "Sunteți sigur că doriți să înlăturați %{bStart}%{targetIssueTitle
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr "Lăsați necomplet pentru a moșteni din datele obiectivului"
-msgid "Epics|No start date – %{dueDate}"
-msgstr "Fără dată de început – %{dueDate}"
-
msgid "Epics|Remove epic"
msgstr "Înlăturați epica"
@@ -18757,12 +18919,18 @@ msgstr[2] "Joburi eșuate"
msgid "Failed on"
msgstr "Eșuat pe"
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr "Nu s-a reușit adăugarea unei reuniuni Zoom"
msgid "Failed to add a resource link"
msgstr "Nu s-a putut adăuga un link de resurse"
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr "Nu s-a reușit aplicarea comenzilor."
@@ -18802,9 +18970,6 @@ msgstr "Nu s-a reușit clonarea acestei probleme deoarece proiectul țintă nu e
msgid "Failed to clone this issue: wrong parameters."
msgstr "Nu s-a reușit clonarea acestei probleme: parametri greșiți."
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr "Nu s-a reușit crearea unei ramuri pentru această problemă. Vă rugăm să încercați din nou."
@@ -18949,6 +19114,9 @@ msgstr "Nu s-a reușit înlăturarea unei ședințe Zoom"
msgid "Failed to remove a to-do item for the design."
msgstr "Nu s-a reușit înlăturarea unei sarcini de-făcut pentru elementul de design"
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr "Nu s-a reușit eliminarea replicii"
@@ -18970,6 +19138,9 @@ msgstr "Nu s-a reușit recuperarea paginii"
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr "Nu s-a reușit salvarea rezoluțiilor conflictelor de îmbinare. Vă rugăm să încercați din nou!"
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr "Nu s-a reușit salvarea noilor setări"
@@ -19036,9 +19207,6 @@ msgstr "Faviconul va fi eliminat. Sunteți sigur?"
msgid "Feature Flags"
msgstr "Feature Flags"
-msgid "Feature deprecation"
-msgstr "Deprecierea funcțiilor"
-
msgid "Feature flag status"
msgstr "Statusul Feature Flag"
@@ -19342,6 +19510,9 @@ msgstr "Fișierele cu modificări mari sunt restrânse în mod implicit."
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr "Fișiere, directoare și submodule din calea %{path} pentru referința de commit %{ref}"
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr "Completați câmpurile următoare, porniți %{strong_open}Activați autentificarea SAML pentru acest grup%{strong_close} și apăsați %{strong_open}Salvați modificările%{strong_close}"
@@ -19573,9 +19744,6 @@ msgstr "Pentru fiecare job, clonați repozitoriul."
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr "Pentru fiecare job, reutilizați spațiul de lucru al proiectului. Dacă spațiul de lucru nu există, utilizați %{code_open}git clone%{code_close}."
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr "De exemplu, aplicația care utilizează tokenul sau scopul său. Nu furnizați informații sensibile pentru numele tokenului, deoarece acesta va fi vizibil pentru toți membrii %{resource_type}."
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr "Pentru fișiere mai mari decât această limită, indexați numai numele fișierului. Conținutul fișierului nu este nici indexat, nici nu poate fi căutat."
@@ -19585,6 +19753,9 @@ msgstr "Pentru lucrări generale"
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr "Pentru utilizare personală, creați un cont separat cu adresa dvs. de e-mail personală, cont care să nu fie legat de domeniul sau grupul de e-mail Enterprise."
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr "Pentru investigarea întreruperilor sau indisponibilităților serviciilor IT"
@@ -19768,6 +19939,9 @@ msgstr[0] "Grupurile gratuite sunt limitate la %{free_user_limit} membru, iar me
msgstr[1] "Grupurile gratuite sunt limitate la %{free_user_limit} membri, iar membrii rămași vor primi statutul de peste limită și vor pierde accesul la grup."
msgstr[2] "Grupurile gratuite sunt limitate la %{free_user_limit} de membri, iar membrii rămași vor primi statutul de peste limită și vor pierde accesul la grup."
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19828,6 +20002,9 @@ msgstr "De la %{providerTitle}"
msgid "From issue creation until deploy to production"
msgstr "De la crearea problemei până la implementarea în producție"
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr "De la îmbinarea merge request-ului până la implementarea în producție"
@@ -19885,6 +20062,9 @@ msgstr "Generați un nou export"
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr "Generați tokenuri de acces de proiect cu scopuri specifice acestui proiect pentru aplicațiile dvs. care au nevoie de acces la GitLab API."
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr "Generați site-ul și cheile private la"
@@ -20503,9 +20683,6 @@ msgstr "Începeți cu GitLab"
msgid "Get started with error tracking"
msgstr "Începeți cu urmărirea erorilor"
-msgid "Get started with performance monitoring"
-msgstr "Începeți cu monitorizarea performanței"
-
msgid "Get started!"
msgstr "Începeți!"
@@ -20986,6 +21163,9 @@ msgstr "Pentru a utiliza integrarea, fiecare utilizator trebuie de asemenea să
msgid "Gitpod|https://gitpod.example.com"
msgstr "https://gitpod.example.com"
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -21025,6 +21205,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -21043,6 +21226,9 @@ msgstr "Problemele pe care le-am creat"
msgid "GlobalSearch|Issues assigned to me"
msgstr "Problemele care mi-au fost atribuite"
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -21055,6 +21241,9 @@ msgstr "Merge request-urile care mi-au fost atribuite"
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr "Merge request-uri pentru care sunt un recenzent"
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -21091,6 +21280,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr "Căutați proiecte, probleme etc."
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr "Rezultatele căutării se încarcă"
@@ -21520,9 +21712,6 @@ msgstr "Info grup:"
msgid "Group information"
msgstr "Informații despre grup"
-msgid "Group is required when cluster_type is :group"
-msgstr "Grupul este necesar atunci când cluster_type este: group"
-
msgid "Group jobs by"
msgstr "Grupați joburile după"
@@ -21814,6 +22003,9 @@ msgstr "Token SCIM"
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr "Amprenta SHA1 a certificatului de semnare a tokenului SAML. ObÈ›ineÈ›i acest lucru de la furnizorul de identitate, unde poate fi numit È™i „Thumbprintâ€."
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22489,12 +22681,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr "incident"
-
-msgid "HeaderAction|issue"
-msgstr "problemă"
-
msgid "Headers"
msgstr "Antete"
@@ -22609,12 +22795,6 @@ msgstr "Ascundeți previzualizarea în direct"
msgid "Hide archived projects"
msgstr "Ascundeți proiectele arhivate"
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] "Ascundeți graficul"
-msgstr[1] "Ascundeți graficele"
-msgstr[2] "Ascundeți graficele"
-
msgid "Hide comments"
msgstr "Ascundeți comentariile"
@@ -22762,12 +22942,24 @@ msgstr "Menaj"
msgid "Housekeeping successfully started"
msgstr "Menajul a început cu succes"
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr "Cum pot configura Akismet?"
msgid "How do I configure this integration?"
msgstr "Cum pot configura această integrare?"
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr "Cum o pot genera?"
@@ -23392,6 +23584,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr "Solicitarea spațiilor de nume a eșuat"
@@ -23452,6 +23647,9 @@ msgstr "Nu există un repozitoriu Git valid la această adresă URL. Dacă depoz
msgid "Improve customer support with Service Desk"
msgstr "Îmbunătățiți asistența pentru clienți cu Service Desk"
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24274,6 +24472,12 @@ msgstr "Incomplet"
msgid "Increase"
msgstr "Creștere"
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24391,8 +24595,8 @@ msgstr "Inserați coloana înainte"
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
-msgstr "Inserați un link"
+msgid "Insert link (%{modifierKey}K)"
+msgstr ""
msgid "Insert or edit diagram"
msgstr ""
@@ -24424,9 +24628,6 @@ msgstr "Acest proiect este filtrat în fișierul insights.yml (consultați confi
msgid "Install GitLab Runner and ensure it's running."
msgstr "Instalați GitLab Runner și asigurați-vă că rulează."
-msgid "Install on clusters"
-msgstr "Instalați pe clustere"
-
msgid "Installation"
msgstr "Instalare"
@@ -25504,6 +25705,9 @@ msgstr "Se pare că în prezent nu există date disponibile pentru coverage de c
msgid "It's you"
msgstr "Sunteți dvs."
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr "Text italic"
@@ -25861,9 +26065,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr "Utilizatorul Jira nu este un administrator de site. Verificați permisiunile din Jira și încercați din nou."
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -26098,6 +26308,9 @@ msgstr "Job %{jobName}"
msgid "Job Failed #%{build_id}"
msgstr "Jobul a eșuat #%{build_id}"
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -26116,6 +26329,9 @@ msgstr "Jobul este blocat. Verificați executorii."
msgid "Job logs and artifacts"
msgstr "Jurnale de job și artefacte"
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr "Jobul a fost reîncercat"
@@ -26281,6 +26497,9 @@ 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 "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|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr "A apărut o problemă la preluarea joburilor eșuate."
@@ -26443,6 +26662,12 @@ msgstr "În așteptare de resurse"
msgid "Job|We could not find this element"
msgstr "Nu s-a putut găsi acest element"
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr "permis să eșueze"
@@ -26506,9 +26731,6 @@ msgstr "Păstrați artefacte de la cele mai recente joburi de succes"
msgid "Keep divergent refs"
msgstr "Păstrați referințele divergente"
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr "Menținerea activată a tuturor analizatorilor SAST permite ca proiectul să fie pregătit pentru viitor, în cazul în care vor fi adăugate ulterior noi limbaje. Determinarea analizatorilor care se aplică este un proces care consumă resurse minime și adaugă un timp minim la procesul de lucru. Activarea tuturor analizatorilor SAST asigură o acoperire maximă."
-
msgid "Kerberos access denied"
msgstr "Accesul Kerberos refuzat"
@@ -26728,6 +26950,9 @@ msgstr "Ultimele %{days} zile"
msgid "Last 2 weeks"
msgstr "Ultimele 2 săptămâni"
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr "Ultimul acces la"
@@ -27373,9 +27598,6 @@ msgstr "Conectați Sentry la GitLab pentru a descoperi și a vizualiza erorile g
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr "Conectați un wiki extern din bara laterală a proiectului. %{docs_link}"
-msgid "Link copied"
-msgstr "Link copiat"
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27523,8 +27745,8 @@ msgstr "Se încarcă mai multe"
msgid "Loading snippet"
msgstr "Se încarcă fragmentul de cod"
-msgid "Loading the GitLab IDE..."
-msgstr "Se încarcă GitLab IDE..."
+msgid "Loading the GitLab IDE"
+msgstr ""
msgid "Loading, please wait."
msgstr "Se încarcă, vă rugăm să așteptați."
@@ -27589,6 +27811,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr "Discuția a fost închisă."
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr "Închideți discuția."
@@ -27781,6 +28006,9 @@ msgstr "Gestionați proiectele."
msgid "Manage two-factor authentication"
msgstr "Gestionați autentificarea cu două factori"
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr "Gestionați declanșatoarele proiectului dumneavoastră"
@@ -27814,6 +28042,9 @@ msgstr "Legați manual această problemă adăugând-o la secțiunea de probleme
msgid "Map a FogBugz account ID to a GitLab user"
msgstr "Maparea unui ID de cont FogBugz la un utilizator GitLab"
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr "Mar"
@@ -27871,6 +28102,9 @@ msgstr "Adăugați text italic (%{modifierKey}I)"
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr "Adăugați text italic (%{modifier_key}I)"
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr "Adăugați text tăiat cu o linie (%{modifierKey}⇧X)"
@@ -27895,9 +28129,6 @@ msgstr "Linie de indentare negativă (%{modifier_key}[)"
msgid "MarkdownEditor|header"
msgstr "antet"
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr "Acceptă %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-
msgid "Marked"
msgstr "Marcat"
@@ -27997,8 +28228,8 @@ msgstr "Valoarea maximă"
msgid "Max authenticated Git LFS requests per period per user"
msgstr "Numărul maxim de solicitări autentificate Git LFS pe perioadă și pe utilizator"
-msgid "Max file size is 200 KB."
-msgstr "Mărimea maximă a fișierului este de 200 KB."
+msgid "Max file size is 200 KiB."
+msgstr ""
msgid "Max role"
msgstr "Rolul maxim"
@@ -28048,8 +28279,8 @@ msgstr "Mărimea maximă a artefactelor (MB)"
msgid "Maximum attachment size"
msgstr "Mărimea maximă a atașamentului"
-msgid "Maximum attachment size (MB)"
-msgstr "Mărimea maximă a atașamentului (MB)"
+msgid "Maximum attachment size (MiB)"
+msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
msgstr "Numărul maxim de solicitări API autentificate pe perioada limită de ratei pe utilizator"
@@ -28075,8 +28306,8 @@ msgstr "Întârzierea maximă (minute)"
msgid "Maximum diff patch size"
msgstr "Mărimea maximă a patch-ului diff"
-msgid "Maximum diff patch size (Bytes)"
-msgstr "Mărimea maximă a patch-ului diff (Octeți)"
+msgid "Maximum diff patch size (bytes)"
+msgstr ""
msgid "Maximum duration of a session."
msgstr "Durata maximă a unei sesiuni."
@@ -28084,8 +28315,8 @@ msgstr "Durata maximă a unei sesiuni."
msgid "Maximum export size"
msgstr "Mărimea maximă a exportului"
-msgid "Maximum export size (MB)"
-msgstr "Mărimea maximă a exportului (MB)"
+msgid "Maximum export size (MiB)"
+msgstr ""
msgid "Maximum field length"
msgstr "Lungimea maximă a câmpului"
@@ -28120,8 +28351,8 @@ msgstr "Maximum de solicitări de import de grup pe minut"
msgid "Maximum import size"
msgstr "Mărimea maximă a importului"
-msgid "Maximum import size (MB)"
-msgstr "Mărimea maximă a importului (MB)"
+msgid "Maximum import size (MiB)"
+msgstr ""
msgid "Maximum job artifact size"
msgstr "Mărimea maximă a artefactului jobului"
@@ -28141,8 +28372,11 @@ msgstr "Mărimea maximă a fișierului pachetului npm în octeți"
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr "Numărul maxim de %{name} (%{count}) a fost depășit"
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
-msgstr "Numărul maxim de modificări (ramuri sau etichete) într-un singur push pentru care se declanșează webhook-urile și serviciile (valoarea implicită este 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
msgid "Maximum number of comments exceeded"
msgstr "Numărul maxim de comentarii a fost depășit"
@@ -28162,12 +28396,18 @@ msgstr "Numărul maxim de solicitări pe minut pentru un utilizator autentificat
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr "Numărul maxim de solicitări pe minut pentru o adresă IP neautentificată"
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
-msgstr "Numărul maxim de solicitări pe minut pentru fiecare cale brută (valoarea implicită este 300). Setați la 0 pentru a dezactiva limitarea."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
+msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr "Numărul maxim de adrese IP unice pe utilizator."
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr "Numărul maxim de variabile încărcate (2000)"
@@ -28192,8 +28432,8 @@ msgstr "Maximum de solicitări de import de proiecte pe minut"
msgid "Maximum push size"
msgstr "Mărime maximă de push"
-msgid "Maximum push size (MB)"
-msgstr "Mărimea maximă de push (MB)"
+msgid "Maximum push size (MiB)"
+msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
msgstr ""
@@ -28225,8 +28465,8 @@ msgstr "Mărimea maximă a fișierelor de import."
msgid "Maximum size of individual attachments in comments."
msgstr "Mărimea maximă a atașamentelor individuale în comentarii."
-msgid "Maximum size of pages (MB)"
-msgstr "Mărimea maximă a paginilor (MB)"
+msgid "Maximum size of pages (MiB)"
+msgstr ""
msgid "Maximum snippet size"
msgstr "Mărimea maximă a fragmentului de cod"
@@ -28573,6 +28813,9 @@ msgstr "Analiza merge request-urilor"
msgid "Merge request approvals"
msgstr "Aprobări de merge request-uri"
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr "Commit-uri de merge request"
@@ -28591,6 +28834,9 @@ msgstr "Rapoarte de merge request-uri"
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28708,9 +28954,6 @@ msgstr "Comentând liniile %{selectStart}start%{selectEnd} până la %{end}"
msgid "MergeRequestDiffs|Select comment starting line"
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 draftului de comentariu."
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28738,9 +28981,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr "Referință copiată"
-msgid "MergeRequests|Saving the comment failed"
-msgstr "Salvarea comentariului a eșuat"
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr "Squashing-ul a eșuat: Faceți squash de commit-uri la nivel local, rezolvați orice conflicte, apoi faceți push la ramură."
@@ -28765,6 +29005,9 @@ msgstr "Vizualizați fișierul @ %{commitId}"
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr "Vizualizați fișierul înlocuit @ %{commitId}"
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr "a comentat commit-ul %{commitLink}"
@@ -28831,6 +29074,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr "%{sourceTopic} va fi înlăturat"
@@ -28927,9 +29182,6 @@ msgstr "A apărut o problemă la actualizarea imaginii dvs."
msgid "MetricImages|There was an issue uploading your image."
msgstr "A apărut o problemă la încărcarea imaginii dvs."
-msgid "Metrics"
-msgstr "Metrici"
-
msgid "Metrics - Grafana"
msgstr "Metrici - Grafana"
@@ -28984,216 +29236,45 @@ 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 stele la acest tablou de bord"
-msgid "Metrics|1. Define and preview panel"
-msgstr "1. Definiți și previzualizați panoul"
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr "2. Lipiți panoul YAML în dashboard"
-
-msgid "Metrics|Add metric"
-msgstr "Adăugare metrică"
-
-msgid "Metrics|Add panel"
-msgstr "Adăugare panou"
-
-msgid "Metrics|Avg"
-msgstr "Med"
-
-msgid "Metrics|Back to dashboard"
-msgstr "ÃŽnapoi la dashboard"
-
-msgid "Metrics|Cancel"
-msgstr "Anulare"
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr "Consultați documentația CI/CD privind desfășurarea într-un mediu"
-
-msgid "Metrics|Collapse panel"
-msgstr "Restrângeți panoul"
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr "Restrângeți panoul (Esc)"
-
-msgid "Metrics|Copy YAML"
-msgstr "Copiați YAML"
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr "Copiați și lipiți YAML-ul panoului în fișierul YAML al dashboard-ului dumneavoastră."
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr "Creați un tablou de bord personalizat %{fileName}"
-
msgid "Metrics|Create metric"
msgstr "Creați o metrică"
-msgid "Metrics|Create new dashboard"
-msgstr "Creați un nou tablou de bord"
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr "Creați-vă fișierul de configurare al tabloului de bord"
-
-msgid "Metrics|Current"
-msgstr "Actual"
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr "Fișierele dashboard-ului pot fi găsite în %{codeStart}.gitlab/dashboards%{codeEnd} la rădăcina acestui proiect."
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr "Definiți panoul YAML de mai jos pentru a previzualiza panoul."
-
msgid "Metrics|Delete metric"
msgstr "Ștergeți metrica"
msgid "Metrics|Delete metric?"
msgstr "Ștergeți metrica?"
-msgid "Metrics|Duplicate"
-msgstr "Duplicați"
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr "Duplicați dashboard-ul curent"
-
-msgid "Metrics|Duplicate dashboard"
-msgstr "Duplicați dashboard-ul"
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr "Duplicați acest tablou de bord pentru a adăuga un panou sau pentru a edita YAML-ul tabloului de bord."
-
-msgid "Metrics|Duplicating..."
-msgstr "Duplicarea..."
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr "Editați YAML-ul tabloului de bord"
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] "Editați metrica"
-msgstr[1] "Editați metricile"
-msgstr[2] "Editați metricile"
-
-msgid "Metrics|Expand panel"
-msgstr "Extindeți panoul"
+msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr "Pentru gruparea metricilor similare"
-msgid "Metrics|Invalid time range, please verify."
-msgstr "Interval de timp invalid, vă rugăm să verificați."
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr "Eticheta axei y (de obicei, unitatea). Axa x reprezintă întotdeauna timpul."
msgid "Metrics|Legend label (optional)"
msgstr "Legenda etichetei (opțional)"
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr "Linkul conține o fereastră de timp invalidă, vă rugăm să verificați linkul pentru a vedea intervalul de timp solicitat."
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-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 "Gestionați linkurile graficului"
-
-msgid "Metrics|Max"
-msgstr "Max"
-
-msgid "Metrics|Metrics Settings"
-msgstr "Setări de metrice"
-
-msgid "Metrics|Min"
-msgstr "Min"
-
-msgid "Metrics|More actions"
-msgstr "Mai multe acțiuni"
-
msgid "Metrics|Must be a valid PromQL query."
msgstr "Trebuie să fie o interogare PromQL validă."
msgid "Metrics|New metric"
msgstr "Noua metrică"
-msgid "Metrics|Open repository"
-msgstr "Deschideți repozitoriul"
-
-msgid "Metrics|Panel YAML"
-msgstr "Panoul YAML"
-
-msgid "Metrics|Panel YAML copied"
-msgstr "Panou YAML copiat"
-
-msgid "Metrics|Preview panel"
-msgstr "Panou de previzualizare"
-
msgid "Metrics|PromQL query is valid"
msgstr "Interogarea PromQL este validă"
msgid "Metrics|Prometheus Query Documentation"
msgstr "Documentația interogării Prometheus"
-msgid "Metrics|Refresh Prometheus data"
-msgstr "Reîmprospătarea datelor Prometheus"
-
-msgid "Metrics|Refresh dashboard"
-msgstr "Reîmprospătați tabloul de bord"
-
-msgid "Metrics|Select a value"
-msgstr "Selectați o valoare"
-
-msgid "Metrics|Set refresh rate"
-msgstr "Setați rata de reîmprospătare"
-
-msgid "Metrics|Star dashboard"
-msgstr "Adăugați tabloul de bord în favorite"
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr "A apărut o eroare la crearea dashboard-ului."
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr "A apărut o eroare la crearea tabloului de bord. %{error}"
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr "A apărut o eroare la preluarea adnotărilor. Vă rugăm să încercați din nou."
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr "A apărut o eroare la preluarea datelor despre medii, vă rugăm să încercați din nou"
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr "A apărut o eroare la obținerea informațiilor despre adnotări."
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr "A apărut o eroare la obținerea informațiilor privind avertismentele de validare a tabloului de bord."
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr "A apărut o eroare la obținerea informațiilor despre desfășurare."
-
-msgid "Metrics|There was an error getting environments information."
-msgstr "A apărut o eroare în timpul obținerii informațiilor despre medii."
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr "A apărut o eroare la obÈ›inerea opÈ›iunilor pentru variabila „%{name}â€."
-
msgid "Metrics|There was an error trying to validate your query"
msgstr "A apărut o eroare în timpul încercării de validare a interogării dvs."
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr "A apărut o eroare în timpul recuperării metricilor"
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr "A apărut o eroare în timpul recuperării metricilor. %{message}"
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr "Pentru a crea un nou tablou de bord, adăugați un nou fișier YAML la %{codeStart}.gitlab/dashboards%{codeEnd} la rădăcina acestui proiect."
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr "Răspuns neașteptat la datele de desfășurare de la punctul final prometheus"
-
msgid "Metrics|Unit label"
msgstr "Eticheta unității"
-msgid "Metrics|Unstar dashboard"
-msgstr "Eliminați tabloul de bord din favorite"
-
msgid "Metrics|Used as a title for the chart"
msgstr "Utilizat ca titlu pentru grafic"
@@ -29203,24 +29284,12 @@ msgstr "Se utilizează atunci când interogarea returnează o singură serie. Da
msgid "Metrics|Validating query"
msgstr "Validarea interogării"
-msgid "Metrics|Values"
-msgstr "Valori"
-
-msgid "Metrics|View documentation"
-msgstr "Vizualizați documentația"
-
msgid "Metrics|Y-axis label"
msgstr "Eticheta axei Y"
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr "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 "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 dashboard-ului dvs. nu este validă. Editați dashboard-ul pentru a corecta schema YAML."
-
msgid "Metrics|e.g. HTTP requests"
msgstr "ex. solicitări HTTP"
@@ -29608,6 +29677,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29644,6 +29716,9 @@ msgstr "Închideți"
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr "Modificat"
@@ -29704,9 +29779,6 @@ msgstr "Mai multe informații"
msgid "More information is available|here"
msgstr "Mai multe informații sunt disponibile|aici"
-msgid "More information."
-msgstr "Mai multe informații"
-
msgid "More options"
msgstr ""
@@ -29884,6 +29956,12 @@ msgstr "ID-ul spațiului de nume:"
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30634,12 +30712,6 @@ msgstr "Nu este nevoie de card de credit."
msgid "No data available"
msgstr "Nu există date disponibile"
-msgid "No data found"
-msgstr "Nu s-au găsit date"
-
-msgid "No data to display"
-msgstr "Nu există date de afișat"
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr "Nu a fost detectată nicio implementare. Utilizați mediile pentru a controla implementarea continuă a software-ului dumneavoastră. %{linkStart}Aflați mai multe despre joburile de implementare.%{linkEnd}"
@@ -30778,9 +30850,6 @@ msgstr "Niciun ref selectat"
msgid "No regions configured"
msgstr "Nicio regiune configurată"
-msgid "No related merge requests found."
-msgstr "Niciun merge request asociat găsit."
-
msgid "No repository"
msgstr "Niciun repozitoriu"
@@ -30823,6 +30892,9 @@ msgstr "Nicio urmă de stivă pentru această eroare"
msgid "No starrers matched your search"
msgstr "Niciun marcator cu stele nu a corespuns căutării dvs."
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr "Nu s-au găsit sugestii"
@@ -30967,9 +31039,6 @@ msgstr "Notă: forkurile actuale își vor păstra nivelul de vizibilitate."
msgid "NoteForm|Note"
msgstr "Notă"
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr "Acceptă %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. Pentru %{quickActionsDocsLinkStart}acțiuni rapide%{quickActionsDocsLinkEnd}, tastați %{keyboardStart}/%{keyboardEnd}."
-
msgid "Notes"
msgstr "Note"
@@ -31270,6 +31339,9 @@ msgstr "Autorul commit-ului"
msgid "Notify|Committed by"
msgstr "Commit făcut de"
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr "Nu doriți să primiți actualizări de la administratorii GitLab?"
@@ -31375,18 +31447,24 @@ msgstr "Acest tip de fișier nu poate fi previzualizat"
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
-msgstr ""
-
msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr "Pipeline-ul %{pipeline_link} declanșat de"
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
-msgstr "Pipeline-ul a fost reparat și #%{pipeline_id} a trecut!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
+msgstr ""
+
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
+msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31561,6 +31639,9 @@ msgstr "Numărul de replici"
msgid "Number of shards"
msgstr "Numărul de fragmente"
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr "OK"
@@ -32239,6 +32320,12 @@ msgstr "Lista ordonată"
msgid "Organizations"
msgstr "Organizații"
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr "Membru orfan"
@@ -32761,6 +32848,18 @@ msgstr "Nivel de proiect"
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr "Publicați pachetele dacă numele sau versiunea lor se potrivește cu acest regex."
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr "Publicat în Registrul de pachete %{project} la %{datetime}"
@@ -33331,9 +33430,6 @@ msgstr "Programele pipeline-ului"
msgid "Pipeline URL"
msgstr "URL-ul pipeline-ului"
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr "Limitele ratei de creare a pipeline-urilor"
@@ -33535,6 +33631,15 @@ msgstr "Activ"
msgid "PipelineSchedules|All"
msgstr "Toate"
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr "Sigur doriți să ștergeți acest program de pipeline?"
@@ -33544,6 +33649,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33601,9 +33709,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33790,9 +33895,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr "Pipeline copil (%{link_start}părinte%{link_end})"
-
msgid "Pipelines|Clear runner caches"
msgstr "Ștergeți cache-urile executorilor"
@@ -33904,6 +34006,9 @@ msgstr "Sunteți gata să configurați CI/CD pentru proiectul dumneavoastră?"
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr "Revocare declanșator"
@@ -33955,9 +34060,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr "Această configurație GitLab CI este validă."
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr "Acesta este un pipeline copil în interiorul unui pipeline părinte"
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33976,7 +34078,7 @@ msgstr "Acest proiect nu este configurat în prezent pentru a executa pipeline-u
msgid "Pipelines|Token"
msgstr "Token"
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -34036,9 +34138,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr "Schimbările dvs. au fost comise cu succes. Acum se redirecționează către noua pagină a merge request-ului."
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr "eroare"
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr "invalid"
@@ -34105,6 +34213,12 @@ msgstr "Joburile pipeline de merge train nu pot fi reîncercate"
msgid "Pipeline|Merged result pipeline"
msgstr "Pipeline de rezultate îmbinate"
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr "A trecut"
@@ -34189,6 +34303,9 @@ msgstr "Acest pipeline a rulat pe conținutul ramurii sursă a acestui merge req
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr "Pentru a rula un pipeline de merge request, joburile din fișierul de configurare CI/CD %{linkStart} trebuie să fie configurate%{linkEnd} pentru a rula în pipeline-urile de merge request."
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr "Autorul declanșatorului"
@@ -34315,9 +34432,6 @@ msgstr "Vă rugăm să confirmați adresa dvs. de e-mail"
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr "Vă rugăm să contactați un administrator pentru a înregistra executori."
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr "Contactați administratorul dvs. GitLab dacă sunteți de părere că este vorba de o eroare."
@@ -34468,8 +34582,8 @@ msgstr "Vă rugăm să încercați din nou"
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr "Vă rugăm să încercați să reîmprospătați pagina. Dacă problema persistă, vă rugăm să contactați serviciul de asistență."
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
-msgstr "Vă rugăm să introduceți %{phrase_code} pentru a continua sau să închideți acest mod pentru a anula."
+msgid "Please type %{phrase_code} to proceed."
+msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
msgstr ""
@@ -34984,6 +35098,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -35023,6 +35140,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -35164,6 +35284,9 @@ 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 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr "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."
@@ -35680,9 +35803,6 @@ msgstr "Informații despre proiect:"
msgid "Project information"
msgstr "Informații despre proiect"
-msgid "Project is required when cluster_type is :project"
-msgstr "Proiectul este necesar atunci când cluster_type este: project"
-
msgid "Project members"
msgstr "Membrii proiectului"
@@ -36220,18 +36340,6 @@ msgstr "Intern"
msgid "ProjectSettings|Issues"
msgstr "Probleme"
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr "Obiectele LFS din acest repozitoriu sunt disponibile pentru fork-uri. %{linkStart}Cum le pot elimina?%{linkEnd}"
@@ -36415,9 +36523,6 @@ msgstr "Trimiteți modificările pentru a fi îmbinate în amonte."
msgid "ProjectSettings|Target project"
msgstr "Proiect țintă"
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36439,9 +36544,6 @@ msgstr "Proiectul țintă implicit pentru merge request-urile create în acest p
msgid "ProjectSettings|The default template will be applied on save."
msgstr "Șablonul implicit va fi aplicat la salvare."
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36478,10 +36580,7 @@ msgstr "Proiect în amonte"
msgid "ProjectSettings|Used for every new merge request."
msgstr "Utilizat pentru fiecare nou merge request."
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36964,6 +37063,9 @@ msgstr "Promovați la etichetă de grup"
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr "Numai obiectivele proiectului pot fi promovate."
@@ -36979,6 +37081,9 @@ msgstr "Problemă promovată la o epică."
msgid "Promotes issue to incident"
msgstr "Promovează problema în incident"
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr "Promovarea nu este acceptată."
@@ -37765,9 +37870,6 @@ msgstr "Calitatea proiectului"
msgid "Query"
msgstr "Interogare"
-msgid "Query cannot be processed"
-msgstr "Interogarea nu poate fi procesată"
-
msgid "Queued"
msgstr "În coadă"
@@ -37840,6 +37942,9 @@ msgstr "Citiți mai multe despre GitLab la %{link_to_promo}."
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr "Citiți documentația acestora."
@@ -38023,7 +38128,7 @@ msgstr "utilizați această funcție"
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr "Sunteți sigur că doriți să săriți peste această etapă?"
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -38035,7 +38140,7 @@ msgstr "Pipeline-urile care utilizează executori partajaÈ›i GitLab vor eÈ™ua pÃ
msgid "RegistrationVerification|Skip this for now"
msgstr "Săriți peste aceasta deocamdată."
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -38050,18 +38155,6 @@ msgstr "Da, aș vrea să sar peste"
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr "Puteți oricând să vă verificați contul ulterior."
-msgid "Registration|Checkout"
-msgstr "Validare"
-
-msgid "Registration|Your GitLab group"
-msgstr "Grupul d-voastră GitLab"
-
-msgid "Registration|Your first project"
-msgstr "Primul d-voastră proiect"
-
-msgid "Registration|Your profile"
-msgstr "Profilul dumneavoastră"
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38278,14 +38371,14 @@ msgstr "Înlăturați reuniunea Zoom."
msgid "Remove access"
msgstr "Înlăturați accesul"
-msgid "Remove all or specific assignee(s)"
-msgstr "Înlăturați toți sau anumiți responsabili"
+msgid "Remove all or specific assignees"
+msgstr ""
msgid "Remove all or specific label(s)"
msgstr "Înlăturați toate sau anumite etichete"
-msgid "Remove all or specific reviewer(s)"
-msgstr "Înlăturați toți sau anumiți recenzenți"
+msgid "Remove all or specific reviewers"
+msgstr ""
msgid "Remove approvers"
msgstr "Înlăturați aprobatorii"
@@ -38545,6 +38638,9 @@ msgstr "Reînnoiți abonamentul"
msgid "Reopen"
msgstr "Redeschideți"
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr "Redeschideți %{issueType}"
@@ -38569,6 +38665,9 @@ msgstr "Redeschideți acest / această %{quick_action_target}"
msgid "Reopened this %{quick_action_target}."
msgstr "S-a redeschis acest / această %{quick_action_target}."
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38587,6 +38686,9 @@ msgstr "Înlocuiți toate etichetele"
msgid "Replace audio"
msgstr "Înlocuiți audio"
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr "Înlocuiți fișierul"
@@ -38992,8 +39094,8 @@ msgstr "Repozitoriul trebuie să conțină cel puțin 1 fișier."
msgid "Repository size is above the limit."
msgstr "Mărimea repozitoriului depășește limita."
-msgid "Repository size limit (MB)"
-msgstr "Limita dimensiunii repozitoriului (MB)"
+msgid "Repository size limit (MiB)"
+msgstr ""
msgid "Repository storage"
msgstr "Stocarea repozitoriului"
@@ -39373,9 +39475,6 @@ msgstr[0] "Revizor"
msgstr[1] "%d Revizori"
msgstr[2] "%d de Revizori"
-msgid "Reviewer(s)"
-msgstr "Revizor(i)"
-
msgid "Reviewers"
msgstr "Recenzenți"
@@ -39421,12 +39520,21 @@ msgstr "Afișare foaie de parcurs"
msgid "Role"
msgstr "Rol"
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr "Rollback"
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr "Introducerea de limite gratuite de utilizatori în GitLab.com. Nu modificați aceste valori decât dacă s-a acordat aprobarea prin %{link_start}această problemă%{link_end}."
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr "Ruby"
@@ -39583,6 +39691,9 @@ msgstr "Amazon Linux 2 Docker HA cu scalare manuală și programare opțională.
msgid "Runners|An error has occurred fetching instructions"
msgstr "A apărut o eroare la preluarea instrucțiunilor"
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39688,12 +39799,18 @@ msgstr "Creat %{timeAgo}"
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] "Ștergeți %d executor"
msgstr[1] "Ștergeți %d executori"
msgstr[2] "Ștergeți %d de executori"
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr "Ștergeți executorul"
@@ -39754,9 +39871,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr "Filtrare proiecte"
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr "Începeți cu executorii"
@@ -39931,6 +40045,12 @@ msgstr[0] "Ștergeți permanent %d executor"
msgstr[1] "Ștergeți permanent %d executori"
msgstr[2] "Ștergeți permanent %d de executori"
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Runners|Platform"
msgstr "Platformă"
@@ -40184,7 +40304,10 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr "Proiectul, grupul sau instanța în care a fost înregistrat executorul. Executorii de instanță sunt întotdeauna deținuți de Administrator."
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 "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_plural "Runners|%d 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] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40504,10 +40627,13 @@ msgstr "Se salvează"
msgid "Saving project."
msgstr "Se salvează proiectul."
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
-msgstr "ScanExecutionPolicy|%{period} %{days} la %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
+msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40516,12 +40642,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40540,6 +40687,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr "Selectați un agent"
@@ -40555,6 +40705,9 @@ msgstr "Selectați profilul scanerului"
msgid "ScanExecutionPolicy|Select site profile"
msgstr "Selectați profilul site-ului"
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr "Profil de site"
@@ -40564,6 +40717,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr "agent"
@@ -40576,6 +40732,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr "în spațiile de nume"
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40597,6 +40759,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40645,6 +40810,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -41098,8 +41266,8 @@ msgstr "Verificare de coverage"
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr "Aflați mai multe despre Verificarea de coverage"
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
-msgstr "Necesită aprobare pentru diminuări în coverage de teste. %{linkStart}Aflați mai multe.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr "Merge request-ul %{featureName} de creare a mutației a eșuat"
@@ -41122,9 +41290,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr "În mod implicit, toate analizatoarele sunt aplicate pentru a acoperi toate limbajele din proiectul dvs. și se execută numai dacă limbajul este detectat în merge request."
-
msgid "SecurityConfiguration|Configuration guide"
msgstr "Ghid de configurare"
@@ -41209,9 +41374,6 @@ msgstr "Activați rapid toate instrumentele de testare continuă și de conformi
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr "Metricile de securitate runtime pentru mediile aplicațiilor"
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr "Analizatoare SAST"
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41326,6 +41488,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr "Sunteți sigur că doriți să ștergeți această politică? Această acțiune nu poate fi anulată."
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr "Alegeți un proiect"
@@ -41449,6 +41614,9 @@ msgstr "Nu s-au definit reguli - politica nu se va executa."
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41491,7 +41659,7 @@ 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|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41635,6 +41803,9 @@ msgstr "Acest proiect"
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 "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|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr "Pentru a vă extinde căutarea, modificați filtrele de mai sus sau selectați un alt proiect de politică de securitate."
@@ -42028,6 +42199,9 @@ msgstr "Raportul de securitate pentru acest pipeline a %{helpPageLinkStart}expir
msgid "SecurityReports|There was an error adding the comment."
msgstr "A apărut o eroare la adăugarea comentariului."
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr "A apărut o eroare la crearea problemei."
@@ -42208,8 +42382,8 @@ msgstr "Selectați o iterație"
msgid "Select assignee"
msgstr "Selectați responsabilul"
-msgid "Select assignee(s)"
-msgstr "Selectați responsabilul"
+msgid "Select assignees"
+msgstr ""
msgid "Select branch"
msgstr "Selectați ramura"
@@ -42271,11 +42445,17 @@ msgstr "Selectați proiectul pentru a crea %{type}"
msgid "Select projects"
msgstr "Selectați proiecte"
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr "Selectați raportul"
-msgid "Select reviewer(s)"
-msgstr "Selectare recenzent(i)"
+msgid "Select reviewers"
+msgstr ""
msgid "Select severity (optional)"
msgstr ""
@@ -42421,6 +42601,9 @@ msgstr "Contul de servicii"
msgid "Service Account Key"
msgstr "Cheia contului de servicii"
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr "Cheile conturilor de servicii autorizează GitLab să implementeze proiectul dvs. Google Cloud"
@@ -42451,6 +42634,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42460,6 +42646,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr "Activați Service Desk"
@@ -42469,6 +42661,9 @@ msgstr "Pentru a obține ajutor la configurarea Service Desk pentru instanța dv
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr "Problemele create din e-mailurile Service Desk vor apărea aici. Fiecare comentariu devine parte a conversației din e-mail."
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr "Service Desk nu este activat"
@@ -42496,6 +42691,12 @@ msgstr "Utilizatorii dvs. pot trimite e-mailuri la această adresă:"
msgid "ServicePing|Service ping is off"
msgstr "Serviciul Ping este oprit"
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr "Pentru a vizualiza analizele la nivel de instanță, cereți unui administrator să activeze %{docLinkStart}serviciul ping%{docLinkEnd}."
@@ -42805,6 +43006,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr "Mergeți la spațiul de lucru Shimo"
@@ -42889,7 +43099,7 @@ msgstr "Afișați jurnalul brut complet"
msgid "Show details"
msgstr "Afișați detaliile"
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42898,9 +43108,6 @@ msgstr "Afișați browserul de fișiere"
msgid "Show file contents"
msgstr "Afișați conținutul fișierului"
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -43210,8 +43417,8 @@ msgstr "Mărime"
msgid "Size Limits"
msgstr "Limite de mărime"
-msgid "Size limit per repository (MB)"
-msgstr "Limita de dimensiune pe depozit (MB)"
+msgid "Size limit per repository (MiB)"
+msgstr ""
msgid "Skip to main content"
msgstr ""
@@ -43435,6 +43642,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr "Fișiere"
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr "Fragmentele de cod nu pot conține fișiere goale. Asigurați-vă că toate fișierele au conținut sau ștergeți-le."
@@ -44005,6 +44215,9 @@ msgstr "Jurnalul de spam a fost trimis cu succes ca ham."
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr "URL-ul specificat nu poate fi utilizat: „%{reason}â€"
@@ -44143,9 +44356,6 @@ msgstr "Începeți un subiect intern"
msgid "Start merge train"
msgstr "Începeți merge train-ul"
-msgid "Start merge train when pipeline succeeds"
-msgstr "Porniți merge train-ul când conducta reușește"
-
msgid "Start merge train..."
msgstr "ÃŽncepe merge train-ul..."
@@ -44347,9 +44557,6 @@ msgstr "documentația de configurare"
msgid "StatusPage|your status page frontend."
msgstr "frontend-ul paginii dvs. de stare."
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr "Rămâneți la curent cu performanțele și starea de sănătate a mediului dvs. prin configurarea Prometheus pentru a vă monitoriza implementările."
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr "Etapa %{currentStep} din %{stepCount}"
@@ -44398,8 +44605,8 @@ msgstr "Necunoscut"
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr "Stocați-vă fișierele, planificați-vă activitatea, colaborați la cod și multe altele."
-msgid "Strikethrough"
-msgstr "Tăiat cu o linie"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
+msgstr ""
msgid "Strikethrough text"
msgstr "Text tăiat cu o linie"
@@ -44833,6 +45040,12 @@ msgstr "Rezumat / notă"
msgid "Summary comment (optional)"
msgstr "Comentariu sumar (opțional)"
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr "Dum"
@@ -45061,10 +45274,10 @@ msgstr "Schimbați ramura/eticheta"
msgid "Switch to GitLab Next"
msgstr "Treceți la GitLab Next"
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45328,7 +45541,7 @@ msgstr "protejate"
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr "Consultați documentația pentru a descoperi toate capacitățile GitLab."
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45415,6 +45628,21 @@ msgstr "Declanșează TeamCity CI după ce un merge request a fost creat sau act
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr "Declanșează TeamCity CI după fiecare push în depozit, cu excepția ștergerii ramurii"
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr "Număr de telefon"
@@ -45589,9 +45817,6 @@ msgstr "Modificări ale resurselor raportate: %{addNum} de adăugat, %{changeNum
msgid "Terraform|Terraform init command"
msgstr "Comanda Terraform init"
-msgid "Terraform|Terraform reports"
-msgstr "Rapoarte Terraform"
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45847,9 +46072,6 @@ msgstr "Trackerul de probleme este locul în care puteți adăuga lucruri care t
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr "Trackerul de probleme este locul în care puteți adăuga lucruri care trebuie îmbunătățite sau rezolvate într-un proiect. Vă puteți înregistra sau autentifica pentru a crea probleme pentru acest proiect."
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr "Serverul Prometheus a răspuns cu „solicitare greÈ™ităâ€. Vă rugăm să verificaÈ›i dacă interogările dvs. sunt corecte È™i sunt acceptate în versiunea dvs. de Prometheus. %{documentationLink}"
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45928,15 +46150,15 @@ msgstr "Problema actuală"
msgid "The current user is not authorized to access the job log."
msgstr "Utilizatorul curent nu este autorizat să acceseze jurnalul jobului."
+msgid "The current user is not authorized to create the pipeline schedule"
+msgstr ""
+
msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr "Datele acestui pipeline sunt prea vechi pentru a fi redate sub formă de grafic. Vă rugăm să verificați fila Joburi pentru a accesa datele istorice."
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
-msgstr "Sursa de date este conectată, dar nu există date de afișat. %{documentationLink}"
-
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
msgstr "Data la care versiunea este gata. O versiune cu o dată în viitor este etichetată ca fiind o %{linkStart}Versiune viitoare%{linkEnd}."
@@ -46132,9 +46354,15 @@ msgstr "Licența pe care ați încărcat-o nu este valabilă. Dacă problema per
msgid "The list creation wizard is already open"
msgstr "Expertul de creare a listei este deja deschis"
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr "Durata maximă de timp avută de utilizatori pentru a configura autentificarea cu doi factori înainte de a fi impusă."
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr "Mărimea maximă permisă a fișierului este %{size}."
@@ -46150,9 +46378,6 @@ msgstr "Mărimea maximă a fișierului este %{size}."
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr "Numărul maxim de etichete pe care un singur proces de curățare le acceptă pentru curățare. Dacă numărul de etichete depășește această limită, lista de etichete care urmează să fie șterse este trunchiată la acest număr. Pentru a înlătura această limită, setați-o la 0."
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr "Conflictele de îmbinare pentru acest merge request nu pot fi rezolvate prin GitLab. Încercați să le rezolvați pe plan local."
@@ -46279,6 +46504,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr "Fragmentul de cod poate fi accesat fără nicio autentificare."
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr "Fragmentul de cod este vizibil numai pentru mine."
@@ -46507,6 +46735,9 @@ msgstr "A apărut o problemă la preluarea emojiurilor."
msgid "There was a problem fetching epics."
msgstr "A existat o problemă la preluarea epicelor."
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr "A existat o problemă la preluarea grupurilor."
@@ -46717,6 +46948,9 @@ msgstr "S-a produs o eroare în timpul preluării datelor de analiză a fluxului
msgid "There was an error while fetching value stream analytics duration data."
msgstr "S-a produs o eroare în timpul preluării datelor privind durata analizei fluxului de valori."
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr "A apărut o eroare cu reCAPTCHA. Vă rugăm să rezolvați din nou reCAPTCHA."
@@ -46858,6 +47092,9 @@ 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 acestui merge request."
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr "Acest commit a fost semnat cu o semnătură %{strong_open}verificată%{strong_close} și s-a verificat că adresa de e-mail a celui care a făcut comiterea aparține aceluiași utilizator."
@@ -47239,9 +47476,6 @@ 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."
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr "Acest pipeline utilizează o configurație predefinită CI/CD activată de %{b_open}Auto DevOps.%{b_close}"
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr "Acest pipeline utilizează o configurație predefinită CI/CD activată de %{strongStart}Auto DevOps.%{strongEnd}"
@@ -47413,9 +47647,6 @@ msgstr "Pragul în octeți la care se comprimă argumentele jobului Sidekiq."
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr "Limita în octeți la care se resping joburile Sidekiq. Setați această valoare la 0 dacă nu doriți să limitați lucrările Sidekiq."
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr "Limita de modificări (ramuri sau etichete) într-un singur push, peste care se creează un eveniment de push în bloc (valoarea implicită este 3)."
-
msgid "Throughput"
msgstr "Debit"
@@ -47695,6 +47926,9 @@ msgstr "chiar acum"
msgid "Timeago|right now"
msgstr "chiar acum"
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr "Adăugarea evenimentului cronologic a reușit."
@@ -47782,14 +48016,11 @@ msgstr "Titlu:"
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr "Titluri și descrieri"
-
msgid "To"
msgstr "La"
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
-msgstr "Pentru %{link_to_help} domeniului dvs., adăugați cheia de mai sus la o înregistrare TXT în configurația DNS."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
+msgstr ""
msgid "To Do"
msgstr "De Făcut"
@@ -47857,6 +48088,9 @@ msgstr "Pentru a vă asigura că %{project_link} este deprogramat de la șterger
msgid "To ensure %{project_name} is unscheduled for deletion, check that activity has been logged by GitLab. For example:"
msgstr "Pentru a vă asigura că %{project_name} este deprogramat de la ștergere, verificați dacă s-a înregistrat vreo activitate de către GitLab. De exemplu:"
+msgid "To ensure no loss of access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr "Pentru a nu pierde conținutul personal, acest cont trebuie utilizat numai pentru aspecte legate de %{group_name}."
@@ -47884,9 +48118,6 @@ msgstr "Pentru a începe, utilizați linkul de mai jos pentru a vă confirma con
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr "Pentru a ajuta la îmbunătățirea GitLab, am dori ca periodic să %{docs_link}. Acest lucru poate fi schimbat în orice moment în %{settings_link}."
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr "Pentru a importa un repozitoriu SVN, consultați %{svn_link}."
@@ -47959,6 +48190,9 @@ msgstr "Pentru a vedea ce s-a schimbat sau pentru a crea un merge request, alege
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr "Pentru a configura autentificarea SAML pentru grupul dvs prin intermediul unui furnizor de identitate precum Azure, Okta, Onelogin, Ping Identity sau furnizorul dvs personalizat SAML 2.0:"
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr "Pentru a configura această integrare:"
@@ -47968,6 +48202,12 @@ msgstr "Pentru a specifica nivelul de notificare pentru fiecare proiect al unui
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr "Pentru a începe să utilizați Ediția GitLab Enterprise, încărcați fișierul %{codeOpen}.gitlab-license%{codeClose} sau introduceți cheia de licență pe care ați primit-o de la GitLab Inc."
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr "Pentru a vă dezabona de la această problemă, vă rugăm să introduceți următorul link în browserul d-voastră:"
@@ -48139,9 +48379,6 @@ msgstr "Comutați bara laterală"
msgid "Toggle backtrace"
msgstr "Comutați backtrace"
-msgid "Toggle collapse"
-msgstr "Comutare restrângere"
-
msgid "Toggle comments for this file"
msgstr "Comutați comentariile pentru acest fișier"
@@ -48151,6 +48388,9 @@ msgstr "Comutare la descrierea commit-ului"
msgid "Toggle commit list"
msgstr "Comutare la lista de commit-uri"
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr "Schimbați premiul emoji"
@@ -48199,12 +48439,6 @@ msgstr "Token valabil până la revocare"
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr "Scopurile stabilesc nivelurile de permisiune acordate tokenului."
-
-msgid "Tokens|Select scopes"
-msgstr "Selectați domeniile"
-
msgid "Tomorrow"
msgstr "Mâine"
@@ -48280,6 +48514,9 @@ msgstr "Subiecte"
msgid "Topics could not be merged!"
msgstr "Subiectele nu au putut fi îmbinate!"
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr "Total"
@@ -48610,12 +48847,6 @@ msgstr "Introduceți textul de căutat"
msgid "URL"
msgstr "URL"
-msgid "URL cannot be blank"
-msgstr "URL-ul nu poate fi gol"
-
-msgid "URL is invalid"
-msgstr "URL-ul este nevalid"
-
msgid "URL is required"
msgstr "URL-ul este necesar"
@@ -48673,9 +48904,6 @@ msgstr "Nu se pot colecta informații despre CPU"
msgid "Unable to collect memory info"
msgstr "Nu se pot colecta informații despre memorie"
-msgid "Unable to connect to Prometheus server"
-msgstr "Nu se poate conecta la serverul Prometheus"
-
msgid "Unable to connect to server: %{error}"
msgstr "Nu se poate conecta la server: %{error}"
@@ -48859,9 +49087,6 @@ msgstr "Din păcate, mesajul dvs. de e-mail către GitLab nu a putut fi procesat
msgid "Unhappy?"
msgstr "Nemulțumit(ă)?"
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48913,7 +49138,7 @@ msgstr "Dezlegare"
msgid "Unlock"
msgstr "Deblocați"
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48934,6 +49159,9 @@ msgstr "Deblocat"
msgid "Unlocked the discussion."
msgstr "Discuția a fost deblocată."
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr "Deblochează discuția."
@@ -48943,9 +49171,6 @@ msgstr "Inaccesibil"
msgid "Unrecognized approval status."
msgstr "Statusul de aprobare nerecunoscut."
-msgid "Unrecognized cluster type"
-msgstr "Tip de cluster nerecunoscut"
-
msgid "Unresolve"
msgstr "Marcați nerezolvat"
@@ -49225,7 +49450,7 @@ msgstr "%{storage_limit_link_start}O limită de stocare a spațiului de nume%{li
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr "Mostre audio, videoclipuri, seturi de date și grafice."
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -49273,6 +49498,9 @@ msgstr "Registrul de container Docker integrat în Gitlab pentru stocarea imagin
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr "Setări de grup &gt; Cote de utilizare"
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49312,17 +49540,11 @@ msgstr "Membri în așteptare"
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr "Artefacte de pipeline și artefacte de job, create cu CI/CD."
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr "Pipeline-uri"
-msgid "UsageQuota|Purchased storage"
-msgstr "Stocarea achiziționată"
-
-msgid "UsageQuota|Purchased storage used"
-msgstr "Stocarea achiziționată folosită"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
+msgstr ""
msgid "UsageQuota|Recalculate repository usage"
msgstr "Recalculați utilizarea repozitorului"
@@ -49381,7 +49603,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr "Acest spațiu de nume nu are proiecte care au folosit executorii partajați în perioada curentă."
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49687,6 +49915,9 @@ msgstr "Utilizatorul nu are o solicitare în așteptare"
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49840,9 +50071,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr "Activitate"
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49861,6 +50098,9 @@ msgstr "Proiecte contribuite"
msgid "UserProfile|Copy user ID"
msgstr "Copiați ID-ul de utilizator"
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr "Editare profil"
@@ -49942,6 +50182,9 @@ msgstr "Acest utilizator nu urmărește alți utilizatori."
msgid "UserProfile|Unconfirmed user"
msgstr "Utilizator neconfirmat"
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr "ID-ul de utilizator: %{id}"
@@ -50191,8 +50434,8 @@ msgstr "Mergeți la documente"
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
-msgstr "Metrici cheie"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
+msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
msgstr "Timpul mediu în care un incident a fost deschis într-un mediu de producție în perioada de timp dată."
@@ -50317,7 +50560,7 @@ msgstr "Până atunci, executorii partajați nu vor fi disponibili. %{validateLi
msgid "VerificationReminder|Your account has been validated"
msgstr "Contul dvs. a fost validat"
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50332,9 +50575,6 @@ msgstr "Verificați configurația SAML"
msgid "Verify code"
msgstr "Verificați codul"
-msgid "Verify configuration"
-msgstr "Verificați configurația"
-
msgid "Version"
msgstr "Versiune"
@@ -50416,12 +50656,6 @@ msgstr "Consultați blame înainte de această modificare"
msgid "View card matches"
msgstr "Vizualizați potriviri card"
-msgid "View chart"
-msgid_plural "View charts"
-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 dependențelor pentru proiectul dvs."
@@ -50449,9 +50683,6 @@ msgstr "Vizualizați fișierul @ "
msgid "View file @ %{commitSha}"
msgstr "Vizualizați fișierul @ %{commitSha}"
-msgid "View full dashboard"
-msgstr "Vizualizați dashboard-ul complet"
-
msgid "View group in admin area"
msgstr "Vizualizați grupul în Zona Admin"
@@ -50506,9 +50737,6 @@ msgstr "Vizualizați merge request-ul deschis"
msgid "View page @ "
msgstr "Vizualizați pagina @ "
-msgid "View performance dashboard."
-msgstr "Vizualizați tabloul de bord de performanță."
-
msgid "View project in admin area"
msgstr "Vizualizați proiectul în Zona Admin"
@@ -50527,6 +50755,9 @@ msgstr "Vizualizați fișierul înlocuit @ "
msgid "View seat usage"
msgstr "Vizualizare utilizare seats"
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr "Vedeți limbajele și framework-urile acceptate"
@@ -50539,9 +50770,6 @@ msgstr "Consultați documentația"
msgid "View the latest successful deployment to this environment"
msgstr "Vizualizați cea mai recentă implementare de succes în acest mediu"
-msgid "View the performance dashboard at"
-msgstr "Vizualizați dashboard-ul de performanță la"
-
msgid "View usage details"
msgstr "Vizualizați detaliile de utilizare"
@@ -50896,6 +51124,9 @@ msgstr "Revizuire de cod"
msgid "Vulnerability|Comments"
msgstr "Comentarii"
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr "Adresa incidentului"
@@ -50950,6 +51181,9 @@ msgstr "Fișier:"
msgid "Vulnerability|GitLab Security Report"
msgstr "Raport de securitate GitLab"
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr "Identificator"
@@ -51025,6 +51259,9 @@ msgstr "Severitate"
msgid "Vulnerability|Severity:"
msgstr "Severitate:"
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr "Status"
@@ -51082,9 +51319,6 @@ msgstr "Se așteaptă aprobarea"
msgid "Waiting for merge (open and assigned)"
msgstr "Se așteaptă pentru îmbinare (deschisă și atribuită)"
-msgid "Waiting for performance data"
-msgstr "Se așteaptă datele de performanță"
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr "Doriți să vedeți datele? Adresați-vă unui administrator pentru acces."
@@ -51124,9 +51358,6 @@ msgstr "Nu s-au găsit %{scope} care să corespundă cu %{term} în grupul %{gro
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr "Nu s-au găsit %{scope} care să corespundă cu %{term} din proiectul %{project}."
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr "Nu am putut ajunge la serverul Prometheus. Fie serverul nu mai există, fie detaliile de configurare trebuie actualizate."
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr "Am detectat un spam potențial în %{humanized_resource_name}. Vă rugăm să rezolvați reCAPTCHA pentru a continua."
@@ -51145,9 +51376,6 @@ msgstr "Vă invităm să %{featureLinkStart}solicitați o caracteristică%{featu
msgid "We recommend a work email address."
msgstr "Vă recomandăm o adresă de e-mail de serviciu."
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr "Vă recomandăm să lăsați toți analizatorii SAST activi"
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr "Vă recomandăm să cumpărați minute suplimentare pipeline pentru a evita orice întrerupere a serviciului."
@@ -51535,6 +51763,9 @@ msgstr "Ce este listat aici?"
msgid "What is repository mirroring?"
msgstr "Ce este replicarea repozitoriului?"
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr "Ce este squashing-ul?"
@@ -51853,6 +52084,9 @@ msgstr "Retrageți solicitarea de acces"
msgid "Won't fix / Accept risk"
msgstr "Nu se repară / Acceptați riscul"
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51949,6 +52183,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51973,9 +52210,6 @@ msgstr "Data scadenței"
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -52090,6 +52324,12 @@ msgstr "Ceva nu a mers bine atunci când s-a încercat adăugarea unui copil. VÄ
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr "Ceva nu a mers bine atunci când ați încercat să creați un copil. Încercați din nou."
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr "Ceva nu a mers bine în timpul recuperării obiectivelor. Încercați din nou."
@@ -52168,6 +52408,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -52264,6 +52507,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr "Doriți să creați o nouă ramură?"
@@ -52375,9 +52621,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr "Dacă depășiți acest număr, veți fi facturat. %{qsrOverageLinkStart}Cum funcționează facturarea?%{qsrOverageLinkEnd}"
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr "Sunteți conectat la serverul Prometheus, dar în prezent nu există date de afișat."
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr "În prezent sunteți offline sau instanța GitLab nu este accesibilă."
@@ -52666,6 +52909,9 @@ msgstr "Nu puteți scrie pe o instanță secundară GitLab Geo numai în citire.
msgid "You cannot write to this read-only GitLab instance."
msgstr "Nu puteți scrie în această instanță GitLab numai în citire."
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr "Nu puteți edita fișiere direct în acest proiect. Fork acest proiect și trimiteți un merge request cu modificările dumneavoastră."
@@ -53107,6 +53353,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr "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 is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr "Solicitarea dvs. de creare a contului GitLab a fost aprobată!"
@@ -53158,6 +53410,12 @@ msgstr "Dispozitivul dvs. WebAuthn a fost înregistrat!"
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr "Solicitarea dvs. de acces la %{source_type} a fost retrasă."
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr "Contul dvs. a fost dezactivat"
@@ -53218,8 +53476,8 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr "Comentariul dvs. nu a putut fi trimis! Vă rugăm să verificați conexiunea la rețea și să încercați din nou."
-msgid "Your comment could not be updated! Please check your network connection and try again."
-msgstr "Comentariul dvs. nu a putut fi actualizat! Vă rugăm să verificați conexiunea la rețea și să încercați din nou."
+msgid "Your comment could not be updated because %{reason}."
+msgstr ""
msgid "Your comment will be discarded."
msgstr "Comentariul dvs. va fi înlăturat."
@@ -53380,10 +53638,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53680,7 +53941,7 @@ msgstr "nu se poate modifica dacă executorii partajați sunt activați"
msgid "cannot be changed since member is associated with a custom role"
msgstr "nu se poate modifica, deoarece membrul este asociat cu un rol personalizat"
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -54122,10 +54383,10 @@ msgid "closed %{timeago}"
msgstr "închis %{timeago}"
msgid "closed issue"
-msgstr "problemă închisă"
-
-msgid "collect usage information"
-msgstr "colectează informații de utilizare"
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "comment"
msgstr "comentariu"
@@ -54352,18 +54613,6 @@ msgstr[2] "de fișiere"
msgid "finding is not found or is already attached to a vulnerability"
msgstr "constatarea nu este găsită sau este deja atașată unei vulnerabilități"
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr "pentru %{link_to_merge_request} cu %{link_to_merge_request_source_branch}"
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr "pentru %{link_to_merge_request} cu %{link_to_merge_request_source_branch} în %{link_to_merge_request_target_branch}"
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr "pentru %{link_to_pipeline_ref}"
-
-msgid "for %{ref}"
-msgstr "pentru %{ref}"
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54472,7 +54721,7 @@ msgstr "în"
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54481,6 +54730,9 @@ msgstr "în grupul %{link_to_group}"
msgid "in project %{link_to_project}"
msgstr "în proiectul %{link_to_project}"
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] "instanță finalizată"
@@ -54670,9 +54922,6 @@ msgstr "încărcați-l oricum"
msgid "loading"
msgstr "încărcare"
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr "blocat(ă) de %{path_lock_user_name} la %{created_at}"
@@ -54853,9 +55102,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr "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."
@@ -54979,9 +55225,6 @@ msgstr "Îmbinarea nu a reușit."
msgid "mrWidget|Merged by"
msgstr "ÃŽmbinat de"
-msgid "mrWidget|More information"
-msgstr "Mai multe informații"
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr "Vă rugăm să o restaurați sau să folosiți o altă ramură %{type}."
@@ -55045,17 +55288,17 @@ 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 "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 "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 these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
-msgstr "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 merge commit messages. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
-msgstr "Pentru a schimba acest mesaj implicit, editați șablonul mesajelor commit-urilor squash. %{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 ""
-msgid "mrWidget|What is a merge train?"
-msgstr "Ce este un merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
+msgstr ""
msgid "mrWidget|Your password"
msgstr "Parola dumneavoastră"
@@ -55093,6 +55336,12 @@ msgstr "trebuie să fie asociat cu un Grup sau un Proiect"
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr "trebuie să fie mai mare decât data de început"
@@ -55126,9 +55375,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr "trebuie să aibă un repozitoriu"
@@ -55208,7 +55454,10 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr "problemă deschisă"
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "or"
msgstr "sau"
@@ -55543,6 +55792,9 @@ msgstr "numele etichetei"
msgid "terraform states"
msgstr "stările terraform"
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr "formatul corect."
@@ -55600,9 +55852,6 @@ msgstr "parametrul tipului lipsește și este necesar"
msgid "unicode domains should use IDNA encoding"
msgstr "domeniile unicode ar trebui să utilizeze codificarea IDNA"
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr "s-a actualizat"
@@ -55729,9 +55978,6 @@ msgstr "instanța dvs. GitLab"
msgid "your group (%{group_name})"
msgstr "grupul dvs. (%{group_name})"
-msgid "your settings"
-msgstr "setările d-voastră"
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/ru/gitlab.po b/locale/ru/gitlab.po
index 11f092a29cb..b99706078a4 100644
--- a/locale/ru/gitlab.po
+++ b/locale/ru/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ru\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:45\n"
+"PO-Revision-Date: 2023-07-11 04:48\n"
msgid " %{start} to %{end}"
msgstr " %{start} по %{end}"
@@ -107,6 +107,20 @@ msgstr[1] "%d ÑоглаÑованиÑ"
msgstr[2] "%d ÑоглаÑований"
msgstr[3] "%d ÑоглаÑованиÑ"
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] "%d модуль"
@@ -212,6 +226,13 @@ msgstr[1] "%d назначенных обÑуждениÑ"
msgstr[2] "%d назначенных обÑуждений"
msgstr[3] "%d назначенных обÑуждений"
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] "%d измененный файл"
@@ -464,20 +485,6 @@ msgstr[1] "еще %d комментариÑ"
msgstr[2] "еще %d комментариев"
msgstr[3] "еще %d комментариев"
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -850,9 +857,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr "%{count} ÑвÑзанный %{pluralized_subject}: %{links}"
-
msgid "%{count} selected"
msgstr "%{count} выбрано"
@@ -895,6 +899,9 @@ msgstr "%{docs_link_start}Что такое хранилище больших ф
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr "%{docs_link_start}Что такое Ð´Ð²ÑƒÑ…Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð°Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ?%{docs_link_end}"
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr "%{duration}мÑ"
@@ -967,7 +974,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr "%{integrations_link_start}Интеграции%{link_end} позволÑÑŽÑ‚ вам Ñделать Ñторонние Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñ‡Ð°Ñтью вашего рабочего процеÑÑа GitLab. ЕÑли доÑтупные интеграции не ÑоответÑтвуют вашим потребноÑÑ‚Ñм, раÑÑмотрите возможноÑÑ‚ÑŒ иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ %{webhooks_link_start}веб-обработчика%{link_end}."
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -991,6 +1001,9 @@ msgstr "Раздел %{italic_start}Что нового%{italic_end} неактÐ
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1324,6 +1337,12 @@ msgstr "%{spanStart}в Ñтроке%{spanEnd} %{errorLine}%{errorColumn}"
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr "%{spanStart}в%{spanEnd} %{errorFn}"
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr "%{start} по %{end}"
@@ -1351,7 +1370,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1493,9 +1512,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr "%{userName}(не может выполнÑÑ‚ÑŒ ÑлиÑние)"
-
msgid "%{userName}'s avatar"
msgstr "Ðватар %{userName}"
@@ -2231,6 +2247,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2684,6 +2706,9 @@ msgstr "Токены доÑтупа"
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr "Вы уверены?"
@@ -2702,12 +2727,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr "Создано"
msgid "AccessTokens|Feed token"
msgstr "Токен потока"
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr "Токен входÑщей Ñлектронной почты"
@@ -2726,6 +2757,15 @@ msgstr "Храните Ñтот токен в Ñекрете. Любой, у кÐ
msgid "AccessTokens|Personal Access Tokens"
msgstr "Личные токены доÑтупа"
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr "Токен ÑтатичеÑкого объекта"
@@ -2735,6 +2775,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr "Тогда они будут ÑвлÑÑ‚ÑŒÑÑ ÐµÐ´Ð¸Ð½Ñтвенным возможным паролем, еÑли у Ð²Ð°Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð° Ð´Ð²ÑƒÑ…Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð°Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ (2FA)."
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr "Ð’Ñ‹ также можете иÑпользовать перÑональные токены Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ в Git по HTTP."
@@ -2786,13 +2829,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr "Узнать больше."
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2903,9 +2946,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr "ПриÑоединитьÑÑ Ðº вÑтрече в Zoom"
-msgid "Add a %{type}"
-msgstr "Добавить %{type}"
-
msgid "Add a GCP region"
msgstr ""
@@ -2954,6 +2994,9 @@ msgstr "Добавить новое обÑуждение"
msgid "Add a numbered list"
msgstr "Добавить нумерованный ÑпиÑок"
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -3209,6 +3252,9 @@ msgstr "Добавлено в Ñтой верÑии"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr "Добавление новых приложений отключено в вашем ÑкземплÑре GitLab. ОбратитеÑÑŒ к админиÑтратору GitLab, чтобы получить разрешение"
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -3230,9 +3276,6 @@ msgstr "Дополнительный текÑÑ‚ Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ð° на ÑÑ‚Ñ€Ð
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr "ÐдреÑ"
@@ -3656,22 +3699,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator email"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3755,6 +3789,9 @@ msgstr "Защищать переменные CI/CD по умолчанию"
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr "Требовать от пользователей Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð°Ð²Ð° ÑобÑтвенноÑти на Ñторонние домены"
@@ -3824,9 +3861,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr "ÐаÑтройки размера и домена Ð´Ð»Ñ ÑтатичеÑких Ñайтов Pages."
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3836,9 +3870,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3869,10 +3900,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3881,9 +3912,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -4106,9 +4134,6 @@ msgstr "Ð’Ð°Ð¶Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± иÑпользовании ваш
msgid "AdminUsers|Is using seat"
msgstr "ИÑпользует меÑто"
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr "Это вы!"
@@ -4154,6 +4179,9 @@ msgstr "Личные проекты, группы и иÑÑ‚Ð¾Ñ€Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr "ÐŸÐ¾Ð²Ñ‚Ð¾Ñ€Ð½Ð°Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±ÑƒÐ´ÐµÑ‚:"
@@ -4193,7 +4221,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr "Сортировать по"
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4463,9 +4491,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr "ПоÑле уÑпешного Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð²Ñ‹ будете перенаправлены на Ñкран входа в ÑиÑтему."
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr "ПоÑле уÑпешного Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð²Ñ‹ будете перенаправлены на Ñтраницу входа, где вы можете войти Ñ Ð½Ð¾Ð²Ñ‹Ð¼ паролем."
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4502,8 +4527,8 @@ msgstr "Лента активноÑти"
msgid "AlertManagement|Alert"
msgstr "Оповещение"
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
-msgstr "ОповеÑтить отвеÑтвенных: %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
+msgstr ""
msgid "AlertManagement|Alert detail"
msgstr "ПодробноÑти оповещениÑ"
@@ -4607,10 +4632,10 @@ msgstr "Возникла ошибка при отображении оповещ
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr "Произошла ошибка при отображении оповещений. Проверьте наÑтройки конечной точки, чтобы убедитьÑÑ, что Ð¾Ð¿Ð¾Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ÐºÐ°Ð·Ñ‹Ð²Ð°ÑŽÑ‚ÑÑ."
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
-msgstr "Произошла ошибка при обновлении ÑпиÑка ответÑтвенных. ПожалуйÑта, попробуйте еще раз."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
+msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4721,9 +4746,6 @@ msgstr "Продолжить редактирование"
msgid "AlertSettings|Prometheus"
msgstr "Prometheus"
-msgid "AlertSettings|Prometheus API base URL"
-msgstr "Базовый URL Prometheus API"
-
msgid "AlertSettings|Reset Key"
msgstr "Ключ ÑброÑа"
@@ -4760,9 +4782,6 @@ msgstr "Форма Ñодержит неÑохранённые изменениÑ
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr "Чтобы Ñоздать пользовательÑкое ÑопоÑтавление, введите пример полезной нагрузки из вашего инÑтрумента мониторинга в формате JSON. Чтобы продолжить, нажмите кнопку «Ðнализировать Ð¿Ð¾Ð»Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾Ð¹ нагрузки»."
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr "URL не может быть пуÑтым и должен начинатьÑÑ Ñ http: или https:."
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr "ИÑпользуйте указанный ниже URL-Ð°Ð´Ñ€ÐµÑ Ð¸ ключ авторизации в наÑтройках Prometheus Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ оповещений в GitLab. ИÑпользуйте %{linkStart}документацию GitLab%{linkEnd}, чтобы узнать, как наÑтроить конечную точку."
@@ -4859,6 +4878,9 @@ msgstr "Ð’Ñе ветви"
msgid "All changes are committed"
msgstr "Ð’Ñе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð·Ð°Ñ„Ð¸ÐºÑированы"
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -5024,6 +5046,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr "Также уберите назначение Ñтого Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð· ÑвÑзанных обÑуждений и запроÑов на ÑлиÑние"
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -5075,12 +5100,6 @@ msgstr "Произошла ошибка"
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr "Ошибка в отчёте, в которой результат теÑта неверно указывает на наличие уÑзвимоÑти в ÑиÑтеме, тогда как Ñта уÑзвимоÑÑ‚ÑŒ отÑутÑтвует."
-msgid "An error occurred adding a draft to the thread."
-msgstr "Произошла ошибка при добавлении черновика в тему."
-
-msgid "An error occurred adding a new draft."
-msgstr "Произошла ошибка Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ черновика."
-
msgid "An error occurred creating the new branch."
msgstr "Произошла ошибка при Ñоздании новой ветки."
@@ -5123,6 +5142,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr "Ошибка при проверке пути к группе. Обновите Ñтраницу и попробуйте ещё раз."
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr "Произошла ошибка при декодировании файла."
@@ -5282,9 +5307,6 @@ msgstr "При получении ÑпиÑка проектов произошл
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr "Произошла ошибка при загрузке данных. ПожалуйÑта, повторите попытку."
-
msgid "An error occurred while loading the file"
msgstr "Произошла ошибка при загрузке файла"
@@ -5403,9 +5425,6 @@ msgstr "Произошла ошибка при обновлении конфиг
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr "Произошла ошибка при обновлении комментариÑ"
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5494,7 +5513,7 @@ msgstr "Произошла неизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°."
msgid "Analytics"
msgstr "Ðналитика"
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5560,12 +5579,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5575,7 +5603,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5614,6 +5642,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5626,6 +5666,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5644,6 +5687,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr "Ðнализируйте ваши завиÑимоÑти на предмет извеÑтных уÑзвимоÑтей."
@@ -5668,6 +5717,9 @@ msgstr "И Ñтот токен региÑтрации:"
msgid "Anonymous"
msgstr "Ðноним"
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr "Ð”Ñ€ÑƒÐ³Ð°Ñ ÑиÑтема ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ Ð¾Ð±Ñуждений уже иÑпользуетÑÑ. Только одна Ñ‚Ð°ÐºÐ°Ñ ÑиÑтема может быть активна одновременно."
@@ -6477,9 +6529,6 @@ msgstr "Ð’Ñ‹ уверены? Удаление Ñтого ключа GPG не пÐ
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr "Ð’Ñ‹ уверены? УÑтройÑтво будет разлогинено из GitLab, а вÑе токены \"запомнить менÑ\" будут отозваны."
-msgid "Arrange charts"
-msgstr "УпорÑдочить диаграммы"
-
msgid "Artifact"
msgstr "Ðртефакт"
@@ -6575,6 +6624,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr "ПоÑкольку мы продолжаем Ñоздавать больше возможноÑтей Ð´Ð»Ñ SAST, мы будем рады вашему отзыву о функции наÑтройки SAST в %{linkStart}Ñтом обÑуждении%{linkEnd}."
@@ -6629,7 +6681,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6690,9 +6742,6 @@ msgstr "ОтветÑтвенный не имеет доÑтупа"
msgid "Assignee lists not available with your current license"
msgstr "СпиÑки ответÑтвенных не доÑтупны Ñ Ð²Ð°ÑˆÐµÐ¹ текущей лицензией"
-msgid "Assignee(s)"
-msgstr "ОтветÑтвенный(ые)"
-
msgid "Assignees"
msgstr "ОтветÑтвенные"
@@ -6836,16 +6885,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6857,19 +6912,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6878,6 +6948,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6905,10 +6978,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6920,6 +6990,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr "Ðвг."
@@ -7457,28 +7533,28 @@ msgstr "Тарифы"
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7649,6 +7725,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr "Эта группа иÑпользует тарифный план ÑвÑзанный Ñ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÑкой группой."
@@ -7676,10 +7755,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7739,10 +7815,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7754,7 +7830,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -8054,12 +8130,18 @@ msgstr "Произошла ошибка при Ñоздании обÑужден
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr "Произошла ошибка при Ñоздании ÑпиÑка. ПожалуйÑта, попробуйте ещё раз."
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr "Произошла ошибка при получении дочерних групп. ПожалуйÑта, попробуйте ещё раз."
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr "Произошла ошибка при получении проектов группы. ПожалуйÑта, попробуйте ещё раз."
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr "Возникла ошибка при получении обÑуждений. ПожалуйÑта, перезагрузите Ñтраницу."
@@ -8124,9 +8206,6 @@ msgstr "Развернуть"
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -8184,6 +8263,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8601,19 +8683,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8850,6 +8941,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9346,11 +9440,11 @@ msgstr ""
msgid "Change assignee"
msgstr "Изменить ответÑтвенного"
-msgid "Change assignee(s)"
-msgstr "Изменить ответÑтвенного(Ñ‹Ñ…)"
+msgid "Change assignees"
+msgstr ""
-msgid "Change assignee(s)."
-msgstr "Изменить ответÑтвенного(Ñ‹Ñ…)."
+msgid "Change assignees."
+msgstr ""
msgid "Change branches"
msgstr "Сменить ветки"
@@ -9367,10 +9461,10 @@ msgstr "Изменить Ñтап"
msgid "Change path"
msgstr "Изменить путь"
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9394,8 +9488,11 @@ msgstr ""
msgid "Change your password"
msgstr "Изменить пароль"
-msgid "Change your password or recover your current one"
-msgstr "Измените пароль или воÑÑтановите текущий"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
+msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
@@ -9442,13 +9539,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
-msgstr "Изменён ответÑтвенный(ые)."
+msgid "Changed assignees."
+msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9490,9 +9587,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr "Ðе удалоÑÑŒ отобразить диаграммы, так как Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа данных иÑтекло. %{documentationLink}"
-
msgid "Chat"
msgstr "Чат"
@@ -9598,7 +9692,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9614,15 +9708,18 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr "ПодпиÑка на GitLab Ð´Ð»Ñ %{name}"
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr "%{quantity} ГБ хранилища"
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
@@ -9630,9 +9727,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr "план %{selectedPlanText}"
@@ -9672,7 +9766,7 @@ msgstr "Город"
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9813,12 +9907,12 @@ msgstr "Ðалоги"
msgid "Checkout|Total"
msgstr "Итого"
+msgid "Checkout|Total compute minutes: %{quantity}"
+msgstr ""
+
msgid "Checkout|Total storage: %{quantity} GB"
msgstr "Ð’Ñего проÑтранÑтва: %{quantity} ГБ"
-msgid "Checkout|Total units of compute: %{quantity}"
-msgstr ""
-
msgid "Checkout|Users"
msgstr "Пользователи"
@@ -9843,7 +9937,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr "ÐºÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ команда"
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9891,6 +9985,9 @@ msgstr "Выберите тип..."
msgid "Choose file…"
msgstr "Выберите файл…"
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr "Выберите группу верхнего ÑƒÑ€Ð¾Ð²Ð½Ñ Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð° репозиториÑ."
@@ -9918,16 +10015,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9942,6 +10039,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9969,6 +10069,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10342,6 +10445,9 @@ msgstr ""
msgid "Close"
msgstr "Закрыть"
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr "Закрыть %{issueType}"
@@ -10399,6 +10505,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10994,9 +11103,6 @@ msgstr "РаÑширенные опции интеграции Ñтого кла
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr "Разрешить GitLab управлÑÑ‚ÑŒ проÑтранÑтвами имён и Ñлужебными аккаунтами Ñтого клаÑтера."
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr "Amazon EKS"
@@ -11081,9 +11187,6 @@ msgstr "Знаете ли вы?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr "Служба Elastic Kubernetes"
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr "Включить или выключить Ñоединение GitLab Ñ Ð²Ð°ÑˆÐ¸Ð¼ Kubernetes клаÑтером."
@@ -11144,9 +11247,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr "КлаÑтер Kubernetes ÑоздаетÑÑ..."
@@ -11390,6 +11490,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11435,6 +11538,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11450,10 +11559,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11549,15 +11655,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11652,18 +11767,12 @@ msgstr "Коммит удален"
msgid "Commit message"
msgstr "ОпиÑание коммита"
-msgid "Commit message (optional)"
-msgstr "ОпиÑание коммита (необÑзательно)"
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr "СтатиÑтика коммитов Ð´Ð»Ñ %{ref} в период Ñ %{start_time} по %{end_time}"
-msgid "Commit to %{branchName} branch"
-msgstr "Коммит в ветку %{branchName}"
-
msgid "CommitBoxTitle|Commit"
msgstr "Коммит"
@@ -11790,15 +11899,30 @@ msgstr "Ðечего Ñравнивать."
msgid "CompareRevisions|Branches"
msgstr "Ветки"
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr "Сравнить"
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr "Создать Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние"
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11808,6 +11932,12 @@ msgstr "Выбрать ветку/тег"
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11844,10 +11974,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export full report as CSV"
+msgstr ""
+
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -12045,6 +12178,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -12090,13 +12226,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -12153,9 +12289,6 @@ msgstr "ÐаÑтройка таймаутов Gitaly."
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -12192,9 +12325,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr "ÐаÑтроить ÑущеÑтвующую уÑтановку"
-
msgid "Configure pipeline"
msgstr ""
@@ -12357,15 +12487,9 @@ msgstr ""
msgid "Connecting..."
msgstr "Подключение..."
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr "Ошибка подключениÑ"
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12759,9 +12883,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12885,6 +13006,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -13014,9 +13168,6 @@ msgstr "Копировать ÑÑылку"
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -13182,6 +13333,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -13236,9 +13390,6 @@ msgstr "Создать %{environment}"
msgid "Create %{humanized_resource_name}"
msgstr "Создать %{humanized_resource_name}"
-msgid "Create %{type}"
-msgstr "Создать %{type}"
-
msgid "Create %{workspace} label"
msgstr "Создать метку %{workspace}"
@@ -13281,6 +13432,9 @@ msgstr "Создать новую ветку"
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr "Создайте новый файл, поÑкольку еще нет файлов. ПоÑле Ñтого вы Ñможете зафикÑировать Ñвои изменениÑ."
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr "Создать новое обÑуждение"
@@ -13566,6 +13720,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr "ТребуетÑÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ"
@@ -13710,9 +13867,6 @@ msgstr "Создание"
msgid "Creating epic"
msgstr "Цель ÑоздаетÑÑ"
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14940,6 +15094,12 @@ msgstr "Ошибка проверки размера раÑпакованногÐ
msgid "Decrease"
msgstr "Уменьшить"
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -15209,6 +15369,9 @@ msgstr "Удалить переменную"
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -15333,6 +15496,12 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr "ещё %{remainingLicensesCount}"
@@ -15375,9 +15544,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr "Упаковщик"
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr "Произошел Ñбой Ð·Ð°Ð´Ð°Ð½Ð¸Ñ %{codeStartTag}dependency_scanning%{codeEndTag} и не получилоÑÑŒ Ñгенерировать ÑпиÑок. ПожалуйÑта, убедитеÑÑŒ, что задание работает правильно и Ñнова запуÑтите Ñборку."
@@ -15411,6 +15586,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15429,6 +15607,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15453,6 +15634,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15462,6 +15646,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15780,9 +15967,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15937,12 +16121,6 @@ msgstr "уÑпешно"
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr "Понизить приоритет метки"
@@ -15952,9 +16130,6 @@ msgstr ""
msgid "Description"
msgstr "ОпиÑание"
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16713,7 +16888,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16758,15 +16933,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr "Скачать CSV"
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr "Скачать артефакты"
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr "Скачать коды"
@@ -17052,6 +17227,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -17157,6 +17335,9 @@ msgstr ""
msgid "Email display name"
msgstr "Отображаемое Ð¸Ð¼Ñ Ð´Ð»Ñ Ñл. почты"
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr "Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð° не подтверждена. ПожалуйÑта, подтвердите ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты в Salesforce."
@@ -17493,9 +17674,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr "УбедитеÑÑŒ, что ваша Ñреда %{linkStart}ÑвлÑетÑÑ Ñ‡Ð°Ñтью Ñтапа развёртываниÑ%{linkEnd} Ñборочной линии CI Ð´Ð»Ñ Ð¾Ñ‚ÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ñ€Ð°Ð·Ð²Ñ‘Ñ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð² ваш клаÑтер."
@@ -17556,9 +17734,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr "Введите Ð¸Ð¼Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ приложениÑ, и мы вернем уникальный %{type}."
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17586,16 +17761,19 @@ msgstr "Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ Ð²Ð²ÐµÐ´Ð¸Ñ‚Ðµ Ñвой пароль"
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
+msgstr ""
+
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17760,9 +17938,6 @@ msgstr ""
msgid "Environments|Job"
msgstr "Задание"
-msgid "Environments|Learn about environments"
-msgstr "Узнайте больше об окружениÑÑ…"
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17775,9 +17950,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr "Ðовое окружение"
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr "Еще нет развертываний"
@@ -17973,12 +18145,6 @@ msgstr "Цели позволÑÑ‚ вам управлÑÑ‚ÑŒ портфелем Ð
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17994,9 +18160,6 @@ msgstr "Ð’Ñ‹ дейÑтвительно хотите удалить %{bStart}%{t
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr "Удалить цель"
@@ -18953,12 +19116,18 @@ msgstr[3] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18999,9 +19168,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr "Ðе удалоÑÑŒ Ñоздать ветку Ð´Ð»Ñ Ñтого обÑуждениÑ. ПожалуйÑта, попробуйте ещё раз."
@@ -19146,6 +19312,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -19167,6 +19336,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -19233,9 +19405,6 @@ msgstr ""
msgid "Feature Flags"
msgstr "Функциональные опции"
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¾Ð½Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ флага"
@@ -19540,6 +19709,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr "Файлы, каталоги и Ñубмодули в пути %{path} Ð´Ð»Ñ ÑÑылки на коммит %{ref}"
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19771,9 +19943,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19783,6 +19952,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19967,6 +20139,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -20027,6 +20202,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr "От ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ð´Ð¾ Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ñ€ÐµÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸ в рабочей Ñреде"
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr "От запроÑа на ÑлиÑние до Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð² рабочей Ñреде"
@@ -20084,6 +20262,9 @@ msgstr "Создать новый ÑкÑпорт"
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20704,9 +20885,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr "Ðачать Ñ Ð¾Ñ‚ÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº"
-msgid "Get started with performance monitoring"
-msgstr "Ðачните Ñ Ð¼Ð¾Ð½Ð¸Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ð° производительноÑти"
-
msgid "Get started!"
msgstr ""
@@ -21187,6 +21365,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -21226,6 +21407,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -21244,6 +21428,9 @@ msgstr "ОбÑуждениÑ, которые Ñ Ñоздал"
msgid "GlobalSearch|Issues assigned to me"
msgstr "ОбÑуждениÑ, назначенные мне"
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -21256,6 +21443,9 @@ msgstr "ЗапроÑÑ‹ на ÑлиÑние, назначенные мне"
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr "ЗапроÑÑ‹ на ÑлиÑние, где Ñ Ñ€ÐµÐ²ÑŒÑŽÐµÑ€"
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -21292,6 +21482,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21721,9 +21914,6 @@ msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ группе:"
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -22015,6 +22205,9 @@ msgstr "SCIM токен"
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr "Отпечаток SHA1 Ñертификата, подпиÑывающего SAML-токен. Получите его у провайдера идентификации, у которого он так же может называтьÑÑ \"Thumbprint\"."
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22692,12 +22885,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22812,13 +22999,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr "Скрывать архивные проекты"
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] "Скрыть график"
-msgstr[1] "Скрыть графики"
-msgstr[2] "Скрыть графики"
-msgstr[3] "Скрыть графики"
-
msgid "Hide comments"
msgstr ""
@@ -22967,12 +23147,24 @@ msgstr "ОчиÑтка"
msgid "Housekeeping successfully started"
msgstr "ОчиÑтка уÑпешно запущена"
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23599,6 +23791,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23660,6 +23855,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24482,6 +24680,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24599,7 +24803,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24632,9 +24836,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr "УÑтановить на клаÑтеры"
-
msgid "Installation"
msgstr ""
@@ -25714,6 +25915,9 @@ msgstr "Похоже, что в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð½ÐµÑ‚ доÑтуÐ
msgid "It's you"
msgstr "Это вы"
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -26071,9 +26275,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -26308,6 +26518,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr "Ошибка Ð·Ð°Ð´Ð°Ð½Ð¸Ñ #%{build_id}"
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -26326,6 +26539,9 @@ msgstr "Задание завиÑло. Проверьте обработчик Ð
msgid "Job logs and artifacts"
msgstr "Логи Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð¸ артефакты"
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr "Задача была перезапущена"
@@ -26491,6 +26707,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26653,6 +26872,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26716,9 +26941,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26940,6 +27162,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr "ПоÑледнее обращение"
@@ -27592,9 +27817,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27742,8 +27964,8 @@ msgstr ""
msgid "Loading snippet"
msgstr "Загрузка Ñниппета"
-msgid "Loading the GitLab IDE..."
-msgstr "Загрузка GitLab IDE..."
+msgid "Loading the GitLab IDE"
+msgstr ""
msgid "Loading, please wait."
msgstr ""
@@ -27808,6 +28030,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr "ДиÑкуÑÑÐ¸Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð°."
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr "Блокирует диÑкуÑÑию."
@@ -28000,6 +28225,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr "Управление двухфакторной аутентификацией"
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -28033,6 +28261,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr "Мар."
@@ -28090,6 +28321,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -28114,9 +28348,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -28216,7 +28447,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -28267,8 +28498,8 @@ msgstr "МакÑимальный размер артефактов (Мбайт)"
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
-msgstr "МакÑимальный размер Ð²Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ (Мбайт)"
+msgid "Maximum attachment size (MiB)"
+msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
msgstr ""
@@ -28294,7 +28525,7 @@ msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð·Ð°Ð´ÐµÑ€Ð¶ÐºÐ° (в минутах)"
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -28303,7 +28534,7 @@ msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾ÑÑ‚ÑŒ ÑеÑÑии
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -28339,7 +28570,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -28360,7 +28591,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -28381,12 +28615,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -28411,8 +28651,8 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
-msgstr "МакÑимальный размер отправки (Мбайт)"
+msgid "Maximum push size (MiB)"
+msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
msgstr ""
@@ -28444,7 +28684,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr "МакÑимальный размер отдельных вложений в комментариÑÑ…."
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28795,6 +29035,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr "Подтверждение запроÑов на ÑлиÑние"
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28813,6 +29056,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28930,9 +29176,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28960,9 +29203,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28987,6 +29227,9 @@ msgstr "ПроÑмотр файла @ %{commitId}"
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr "ПроÑмотр заменÑемого файла @ %{commitId}"
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr "прокомментировано в коммите%{commitLink}"
@@ -29053,6 +29296,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr "%{sourceTopic} будет удален"
@@ -29149,9 +29404,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr "Метрики"
-
msgid "Metrics - Grafana"
msgstr "Метрики - Grafana"
@@ -29206,217 +29458,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr "Добавить метрику"
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr "Ср"
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr "Создать пользовательÑкую панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ %{fileName}"
-
msgid "Metrics|Create metric"
msgstr "Создать метрику"
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr "Удалить метрику"
msgid "Metrics|Delete metric?"
msgstr "Удалить метрику?"
-msgid "Metrics|Duplicate"
-msgstr "Дублировать"
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr "Дублировать панель управлениÑ"
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr "Дублирование..."
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] "Редактировать метрику"
-msgstr[1] "Редактировать метрики"
-msgstr[2] "Редактировать метрики"
-msgstr[3] "Редактировать метрики"
-
-msgid "Metrics|Expand panel"
-msgstr "Развернуть панель"
+msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr "Ð”Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð¸Ñ€Ð¾Ð²ÐºÐ¸ похожих метрик"
-msgid "Metrics|Invalid time range, please verify."
-msgstr "ÐедопуÑтимый промежуток времени, пожалуйÑта, проверьте его."
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr "Метка оÑи Y (обычно Ñто единица измерениÑ). ОÑÑŒ X вÑегда предÑтавлÑет времÑ."
msgid "Metrics|Legend label (optional)"
msgstr "Метка легенды (необÑзательно)"
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr "МакÑ"
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr "ÐÐ¾Ð²Ð°Ñ Ð¼ÐµÑ‚Ñ€Ð¸ÐºÐ°"
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ PromQL дейÑтвителен"
msgid "Metrics|Prometheus Query Documentation"
msgstr "Ð”Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð¿Ð¾ запроÑам Prometheus"
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr "Обновить панель управлениÑ"
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr "Произошла ошибка при Ñоздании панели управлениÑ"
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr "Произошла ошибка при Ñоздании панели управлениÑ. %{error}"
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr "Произошла ошибка при извлечении аннотаций. ПожалуйÑта, попробуйте ещё раз."
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr "Произошла ошибка при извлечении данных окружениÑ, пожалуйÑта, попробуйте ещё раз"
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr "Произошла ошибка при получении информации об аннотациÑÑ…."
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr "Произошла ошибка при получении Ñведений о развёртывании."
-
-msgid "Metrics|There was an error getting environments information."
-msgstr "Произошла ошибка при получении информации об окружениÑÑ…."
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr "Произошла ошибка при попытке проверить ваш запроÑ"
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr "Произошла ошибка при получении метрик"
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr "Произошла ошибка при получении метрик. %{message}"
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr "Ðеожиданные данные Ñ€Ð°Ð·Ð²Ñ‘Ñ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð² ответе от точки Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Prometheus"
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr "ИÑпользуетÑÑ ÐºÐ°Ðº заголовок Ð´Ð»Ñ Ð´Ð¸Ð°Ð³Ñ€Ð°Ð¼Ð¼Ñ‹"
@@ -29426,24 +29506,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr "Проверка запроÑа"
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr "ПодпиÑÑŒ оÑи Y"
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr "Ð’Ñ‹ ÑобираетеÑÑŒ навÑегда удалить Ñту метрику. Это дейÑтвие не может быть отменено."
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr "например, HTTP-запроÑÑ‹"
@@ -29832,6 +29900,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29868,6 +29939,9 @@ msgstr "Закрыть"
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29928,9 +30002,6 @@ msgstr "Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ"
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -30108,6 +30179,12 @@ msgstr "ID проÑтранÑтва имён:"
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30860,12 +30937,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr "Ðет данных Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ"
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -31004,9 +31075,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr "СвÑзанные запроÑÑ‹ на ÑлиÑние не найдены."
-
msgid "No repository"
msgstr "Ðет репозиториÑ"
@@ -31049,6 +31117,9 @@ msgstr "Ð”Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ ошибки недоÑтуна траÑÑировк
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -31194,9 +31265,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr "Примечание"
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31501,6 +31569,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31606,18 +31677,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgstr ""
+
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31792,6 +31869,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr "ОК"
@@ -32472,6 +32552,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32995,6 +33081,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33565,9 +33663,6 @@ msgstr "РаÑпиÑÐ°Ð½Ð¸Ñ Ð¡Ð±Ð¾Ñ€Ð¾Ñ‡Ð½Ñ‹Ñ… Линий"
msgid "Pipeline URL"
msgstr "URL Ñборочной линии"
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33769,6 +33864,15 @@ msgstr "Ðктивно"
msgid "PipelineSchedules|All"
msgstr "Ð’Ñе"
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33778,6 +33882,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33835,9 +33942,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -34024,9 +34128,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -34138,6 +34239,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -34189,9 +34293,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr "Это дочернÑÑ ÑÐ±Ð¾Ñ€Ð¾Ñ‡Ð½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ Ð² ÑоÑтаве родительÑкой"
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -34210,7 +34311,7 @@ msgstr "Этот проект в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð½Ðµ наÑтро
msgid "Pipelines|Token"
msgstr "Токен"
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -34270,9 +34371,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -34339,6 +34446,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -34423,6 +34536,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34549,9 +34665,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34702,8 +34815,8 @@ msgstr "ПожалуйÑта, попробуйте ещё раз"
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
-msgstr "ПожалуйÑта, введите %{phrase_code} чтобы продолжить, или закройте Ñто окно Ð´Ð»Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñ‹."
+msgid "Please type %{phrase_code} to proceed."
+msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
msgstr ""
@@ -35218,6 +35331,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -35257,6 +35373,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -35398,6 +35517,9 @@ msgstr "на"
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr "Ð’Ñ‹ ÑобираетеÑÑŒ навÑегда удалить %{yourAccount}, а также вÑе запроÑÑ‹ ÑлиÑÐ½Ð¸Ñ Ð¸ группы, ÑвÑзанные Ñ Ð²Ð°ÑˆÐµÐ¹ учетной запиÑью. ПоÑле Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ %{deleteAccount} его Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ или воÑÑтановить."
+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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr "Ð’Ñ‹ ÑобираетеÑÑŒ изменить Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %{currentUsernameBold} на %{newUsernameBold}. Профиль и проекты будут перенаправлены в проÑтранÑтво имен %{newUsername}, но Ñто перенаправление переÑтанет дейÑтвовать, как только проÑтранÑтво имён %{currentUsername} будет зарегиÑтрировано другим пользователем или группой. ПожалуйÑта, как можно Ñкорее, обновите указатели на Ñвои удаленные репозитории Git."
@@ -35914,9 +36036,6 @@ msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ проекте:"
msgid "Project information"
msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ проекте"
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr "УчаÑтники проекта"
@@ -36454,18 +36573,6 @@ msgstr "ВнутреннÑÑ"
msgid "ProjectSettings|Issues"
msgstr "ОбÑуждениÑ"
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36649,9 +36756,6 @@ msgstr "Отправка изменений Ð´Ð»Ñ ÑлиÑÐ½Ð¸Ñ Ð² upstream."
msgid "ProjectSettings|Target project"
msgstr "Целевой проект"
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36673,9 +36777,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36712,10 +36813,7 @@ msgstr "Upstream-проект"
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -37198,6 +37296,9 @@ msgstr "ПовыÑить до групповой метки"
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr "ПеренеÑти можно только Ñтапы проекта."
@@ -37213,6 +37314,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -38001,9 +38105,6 @@ msgstr ""
msgid "Query"
msgstr "ЗапроÑ"
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -38076,6 +38177,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -38260,7 +38364,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -38272,7 +38376,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -38287,18 +38391,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38516,13 +38608,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
-msgstr "Удалить вÑех ответÑтвенных или одного конкретного"
+msgid "Remove all or specific assignees"
+msgstr ""
msgid "Remove all or specific label(s)"
msgstr "Удалить вÑе или конкретные метки(и)"
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38783,6 +38875,9 @@ msgstr ""
msgid "Reopen"
msgstr "Открыть заново"
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38807,6 +38902,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38825,6 +38923,9 @@ msgstr "Заменить вÑе метки"
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -39236,7 +39337,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39621,9 +39722,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39669,12 +39767,21 @@ msgstr ""
msgid "Role"
msgstr "Роль"
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39835,6 +39942,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39940,6 +40050,9 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
@@ -39947,6 +40060,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -40007,9 +40123,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -40185,6 +40298,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -40438,7 +40558,11 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d 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[3] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40759,10 +40883,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40771,12 +40898,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40795,6 +40943,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40810,6 +40961,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40819,6 +40973,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40831,6 +40988,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40852,6 +41015,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40900,6 +41066,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -41364,7 +41533,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -41388,9 +41557,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -41475,9 +41641,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41592,6 +41755,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41715,6 +41881,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41757,7 +41926,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41902,6 +42071,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -42295,6 +42467,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr "Произошла ошибка при добавлении комментариÑ."
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr "Произошла ошибка при Ñоздании обÑуждениÑ."
@@ -42475,8 +42650,8 @@ msgstr ""
msgid "Select assignee"
msgstr "Выбрать ответÑтвенного"
-msgid "Select assignee(s)"
-msgstr "Выберите ответÑтвенного(Ñ‹Ñ…)"
+msgid "Select assignees"
+msgstr ""
msgid "Select branch"
msgstr ""
@@ -42538,10 +42713,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42688,6 +42869,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42718,6 +42902,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42727,6 +42914,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42736,6 +42929,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42763,6 +42959,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -43073,6 +43275,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -43157,7 +43368,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -43166,9 +43377,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -43479,8 +43687,8 @@ msgstr "Размер"
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
-msgstr "Лимит размера на репозиторий (Мбайт)"
+msgid "Size limit per repository (MiB)"
+msgstr ""
msgid "Skip to main content"
msgstr ""
@@ -43704,6 +43912,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr "Файлы"
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -44274,6 +44485,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -44412,9 +44626,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44616,9 +44827,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr "Будьте в курÑе производительноÑти и работоÑпоÑобноÑти вашего Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ наÑтройки Prometheus Ð´Ð»Ñ Ð¼Ð¾Ð½Ð¸Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ð° ваших развёртываний."
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44667,7 +44875,7 @@ msgstr "ÐеизвеÑтный"
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -45102,6 +45310,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -45331,10 +45545,10 @@ msgstr "Переключить ветка/тег"
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45598,7 +45812,7 @@ msgstr "защищенный"
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45686,6 +45900,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45862,9 +46091,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -46123,9 +46349,6 @@ msgstr "Трекер обÑуждений - Ñто меÑто, где можно
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr "Трекер обÑуждений - Ñто меÑто, где можно обÑудить то, что необходимо улучшить или иÑправить в проекте. Можете зарегиÑтрироватьÑÑ Ð¸Ð»Ð¸ войти в ÑиÑтему, поÑле чего Ñоздавать обÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñтого проекта."
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr "Сервер Prometheus ответил Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ð¾Ð¼ \"bad request\". ПожалуйÑта, убедитеÑÑŒ, что запроÑÑ‹ верны и поддерживаютÑÑ Ð² вашей верÑии Prometheus. %{documentationLink}"
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -46204,15 +46427,15 @@ msgstr "Текущее обÑуждение"
msgid "The current user is not authorized to access the job log."
msgstr ""
+msgid "The current user is not authorized to create the pipeline schedule"
+msgstr ""
+
msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
-msgstr "ИÑточник данных подключен, но нет данных Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ. %{documentationLink}"
-
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
msgstr ""
@@ -46410,9 +46633,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr "МакÑимальный размер файла - %{size}."
@@ -46428,9 +46657,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr "Конфликты ÑлиÑÐ½Ð¸Ñ Ð´Ð»Ñ Ñтого запроÑа на ÑлиÑние не могут быть разрешены Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ GitLab. ПожалуйÑта, попробуйте разрешить их локально."
@@ -46557,6 +46783,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr "ДоÑтуп к Ñниппету можно получить без какой-либо аутентификации."
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr "Сниппет виден только мне."
@@ -46785,6 +47014,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46995,6 +47227,9 @@ msgstr "Произошла ошибка при получении данных Ð
msgid "There was an error while fetching value stream analytics duration data."
msgstr "Произошла ошибка при получении аналитичеÑких данных о длительноÑти потока ценноÑти."
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -47136,6 +47371,9 @@ 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 "Данный коммит ÑвлÑетÑÑ Ñ‡Ð°Ñтью запроÑа на ÑлиÑние %{link_to_merge_request}. Комментарии, Ñозданные здеÑÑŒ, будут Ñозданы в контекÑте Ñтого запроÑа."
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -47517,9 +47755,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47691,9 +47926,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47973,6 +48205,9 @@ msgstr "Только что"
msgid "Timeago|right now"
msgstr "прÑмо ÑейчаÑ"
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -48062,13 +48297,10 @@ msgstr "Заголовок:"
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr "Ð’"
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -48137,6 +48369,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -48164,9 +48399,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -48240,6 +48472,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -48249,6 +48484,12 @@ msgstr "Чтобы указать уровень уведомлений по пÑ
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -48420,9 +48661,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr "Показать или Ñкрыть комментарии к Ñтому файлу"
@@ -48432,6 +48670,9 @@ msgstr "Переключить опиÑание коммита"
msgid "Toggle commit list"
msgstr "Открыть или закрыть ÑпиÑок коммитов"
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -48480,12 +48721,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr "Завтра"
@@ -48562,6 +48797,9 @@ msgstr "Теги"
msgid "Topics could not be merged!"
msgstr "Теги не могут быть объединены!"
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr "Ð’Ñего"
@@ -48893,12 +49131,6 @@ msgstr ""
msgid "URL"
msgstr "URL"
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48956,9 +49188,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr "Ðевозможно подключитьÑÑ Ðº Ñерверу Prometheus"
-
msgid "Unable to connect to server: %{error}"
msgstr "Ðевозможно подключитьÑÑ Ðº Ñерверу:%{error}"
@@ -49142,9 +49371,6 @@ msgstr "К Ñожалению, ваше пиÑьмо в GitLab не может Ð
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -49196,7 +49422,7 @@ msgstr ""
msgid "Unlock"
msgstr "Разблокировать"
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -49217,6 +49443,9 @@ msgstr "Разблокировано"
msgid "Unlocked the discussion."
msgstr "ДиÑкуÑÑÐ¸Ñ Ñ€Ð°Ð·Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð°."
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr "Разблокирует диÑкуÑÑию."
@@ -49226,9 +49455,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -49508,7 +49734,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -49556,6 +49782,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49595,16 +49824,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr "Сборочные линии"
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49664,7 +49887,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49971,6 +50200,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -50124,9 +50356,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr "ÐктивноÑÑ‚ÑŒ"
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -50145,6 +50383,9 @@ msgstr "Вклад в проекты"
msgid "UserProfile|Copy user ID"
msgstr "Копировать ID пользователÑ"
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr "Изменить профиль"
@@ -50226,6 +50467,9 @@ msgstr "Этот пользователь не подпиÑан на другиÑ
msgid "UserProfile|Unconfirmed user"
msgstr "Ðеподтвержденный пользователь"
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr "ID пользователÑ: %{id}"
@@ -50475,7 +50719,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50601,7 +50845,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50616,9 +50860,6 @@ msgstr "Проверить наÑтройки SAML"
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr "Проверить наÑтройки"
-
msgid "Version"
msgstr "ВерÑиÑ"
@@ -50700,13 +50941,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] "Показать график"
-msgstr[1] "Показать графики"
-msgstr[2] "Показать графики"
-msgstr[3] "Показать графики"
-
msgid "View dependency details for your project"
msgstr ""
@@ -50735,9 +50969,6 @@ msgstr "ПроÑмотр файла @ "
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr "Показать вÑÑŽ панель"
-
msgid "View group in admin area"
msgstr ""
@@ -50792,9 +51023,6 @@ msgstr "ПроÑмотреть открытый Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr "ПроÑмотр панели производительноÑти."
-
msgid "View project in admin area"
msgstr ""
@@ -50814,6 +51042,9 @@ msgstr "ПроÑмотр заменённого файла @ "
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr "ПроÑмотр поддерживаемых Ñзыков и фреймворков"
@@ -50826,9 +51057,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr "ПроÑмотр поÑледнего уÑпешного Ñ€Ð°Ð·Ð²Ñ‘Ñ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð² Ñто окружение"
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -51183,6 +51411,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -51237,6 +51468,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -51312,6 +51546,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -51369,9 +51606,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr "Хотите увидеть данные? ОбратитеÑÑŒ к админиÑтратору за доÑтупом."
@@ -51411,9 +51645,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -51432,9 +51663,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51822,6 +52050,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr "Что такое Ñжатие?"
@@ -52143,6 +52374,9 @@ msgstr "Отменить Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð¾Ñтупа"
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -52240,6 +52474,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -52264,9 +52501,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -52381,6 +52615,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -52459,6 +52699,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -52555,6 +52798,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52667,9 +52913,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr "Ð’Ñ‹ подключены к Ñерверу Prometheus, но в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð½ÐµÑ‚ данных Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ."
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52958,6 +53201,9 @@ msgstr "Ð’Ñ‹ не можете вноÑить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ð¾ втори
msgid "You cannot write to this read-only GitLab instance."
msgstr "Ð’Ñ‹ не можете запиÑывать на Ñтот ÑкземплÑÑ€ \"только Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ\" клаÑтера GitLab."
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -53401,6 +53647,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr "Ваша ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ GitLab заблокирована из-за Ñлишком большого количеÑтва неудачных попыток входа. Ð’Ñ‹ можете подождать, пока ваша ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ автоматичеÑки разблокируетÑÑ Ñ‡ÐµÑ€ÐµÐ· %{duration} или вы можете щелкнуть ÑÑылку ниже, чтобы разблокировать ÑейчаÑ."
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr "Ваш Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° Ñоздание учетной запиÑи GitLab одобрен!"
@@ -53452,6 +53704,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr "Ваш Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð¾Ñтупа к %{source_type} был отозван."
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr "Ваша ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ деактивирована"
@@ -53512,8 +53770,8 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr "Ваш комментарий не может быть отправлен! ПожалуйÑта, проверьте подключение к Ñети и повторите попытку."
-msgid "Your comment could not be updated! Please check your network connection and try again."
-msgstr "Ваш комментарий не может быть обновлен! ПожалуйÑта, проверьте подключение к Ñети и повторите попытку."
+msgid "Your comment could not be updated because %{reason}."
+msgstr ""
msgid "Your comment will be discarded."
msgstr ""
@@ -53676,10 +53934,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53979,7 +54240,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -54429,10 +54690,11 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr "закрытое обÑуждение"
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "comment"
msgstr "комментарий"
@@ -54663,18 +54925,6 @@ msgstr[3] "файлов"
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr "Ð´Ð»Ñ %{link_to_merge_request} из %{link_to_merge_request_source_branch}"
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr "Ð´Ð»Ñ %{link_to_merge_request} из %{link_to_merge_request_source_branch} в %{link_to_merge_request_target_branch}"
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr "Ð´Ð»Ñ %{link_to_pipeline_ref}"
-
-msgid "for %{ref}"
-msgstr "Ð´Ð»Ñ %{ref}"
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54785,7 +55035,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54794,6 +55044,9 @@ msgstr "в группе %{link_to_group}"
msgid "in project %{link_to_project}"
msgstr "в проекте %{link_to_project}"
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] "завершенный ÑкземплÑÑ€"
@@ -54986,9 +55239,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -55171,9 +55421,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -55299,9 +55546,6 @@ msgstr "СлиÑние не удалоÑÑŒ."
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr "Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ"
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -55365,16 +55609,16 @@ msgstr "Этот Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние не может быть выÐ
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr "Чтобы ÑоглаÑовать Ñтот запроÑ, пожалуйÑта, введите ваш пароль. Этот проект требует Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»ÐµÐ¼."
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -55413,6 +55657,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -55446,9 +55696,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -55528,7 +55775,11 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "or"
msgstr "или"
@@ -55870,6 +56121,9 @@ msgstr "название тега"
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55927,9 +56181,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr "домены, запиÑанные юникодом, должны иÑпользовать IDNA-кодировку"
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr "обновлено"
@@ -56058,9 +56309,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr "ваши наÑтройки"
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/si_LK/gitlab.po b/locale/si_LK/gitlab.po
index e6dfb9d0001..70be9a6df50 100644
--- a/locale/si_LK/gitlab.po
+++ b/locale/si_LK/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: si-LK\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:47\n"
+"PO-Revision-Date: 2023-07-11 04:50\n"
msgid " %{start} to %{end}"
msgstr " %{start} සිට %{end}"
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] "අනුමà·à¶­à·’ %d"
msgstr[1] "අනුමà·à¶­à·’ %d"
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] "ඒකක %d"
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] "වෙනස්කළ ගොනු %d"
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] "තවත් අදහස් %d"
msgstr[1] "තවත් අදහස් %d"
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr "තේරීම් %{count} කි"
@@ -703,6 +705,9 @@ msgstr "%{docs_link_start}විà·à·à¶½ ගොනු ආචයනය යනු
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr "%{docs_link_start}ද්වි à·ƒà·à¶°à¶š සත්â€à¶ºà·à¶´à¶±à¶º යනු කුමක්ද?%{docs_link_end}"
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr "මිලි ත. %{duration}"
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr "%{start} සිට %{end}"
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr "%{name} නමකට පමණක් %{type} සහà·à¶º දක්වà¶
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr "%{userName} (ඒකà·à¶¶à¶¯à·Šà¶° කිරීමට නොහà·à¶šà·’ය)"
-
msgid "%{userName}'s avatar"
msgstr "%{userName}ගේ ප්â€à¶»à¶­à·’රුව"
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr "ඔබට විà·à·Šà·€à·à·ƒà¶¯?"
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr "සෑදිණි"
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr "තව දà·à¶±à¶œà¶±à·Šà¶±."
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr "සූම් රà·à·ƒà·Šà·€à·“මක් යොදන්න"
-msgid "Add a %{type}"
-msgstr "%{type} ක් එකතු කරන්න"
-
msgid "Add a GCP region"
msgstr "GCP කලà·à¶´à¶ºà¶šà·Š යොදන්න"
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr "මෙම අනුවà·à¶¯à¶ºà·™à·„à·’ ඇත"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr "ලිපිනය"
@@ -3372,24 +3413,15 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr "මූලà·à·à·Šâ€à¶» ආයà·à¶­à¶º"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
+msgstr ""
+
msgid "AdminSettings|Inactive project deletion"
msgstr "අක්â€à¶»à·’ය ව්â€à¶ºà·à¶´à·˜à¶­à·’ මකà·à¶¯à·à¶¸à·“ම"
msgid "AdminSettings|Instance runners expiration"
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
-msgstr ""
-
-msgid "AdminSettings|Jitsu project ID"
-msgstr ""
-
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
msgstr ""
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr "අභිරුචි වසම්වල අයිතිය ඔප්පු කිරීමට පුද්ගලයින්ට සිදු වේ"
@@ -3540,9 +3575,6 @@ msgstr "à·ƒà·à¶šà·ƒà·”ම් 0 ට වඩ෠වà·à¶©à·’ විය යුතà·
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr "ඒ ඔබයි!"
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr "ස්කයිප්"
msgid "AdminUsers|Sort by"
msgstr "අනුව පෙළගසන්න"
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr "ඇඟවීම"
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr "ප්â€à¶»à·à¶¸à·’තියස්"
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr "සියළු à·à·à¶›à·"
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr "දà·à·‚යක් සිදුවී ඇත"
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’ පූරණය කිරීමේදී ද
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr "දත්ත පූරණය කිරීමේදී දà·à·‚යක් ඇති විය. පසුව බලන්න."
-
msgid "An error occurred while loading the file"
msgstr "ගොනුව පූරණය කිරීමේදී දà·à·‚යක් ඇති විය"
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr "නොදන්න෠දà·à·‚යක් සිදුවිය."
msgid "Analytics"
msgstr "විà·à·Šà¶½à·šà·‚ණ"
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr "නිර්නà·à¶¸à·’ක"
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,8 +6359,8 @@ msgstr "මටම පවරන්න"
msgid "Assign reviewer"
msgstr "සමà·à¶½à·à¶ à¶š පà·à·€à¶»à·“ම"
-msgid "Assign reviewer(s)"
-msgstr "සමà·à¶½à·à¶ à¶šà¶ºà·’න් පà·à·€à¶»à·“ම"
+msgid "Assign reviewers"
+msgstr ""
msgid "Assign severity"
msgstr "තීව්â€à¶»à¶­à·à·€ පවරන්න"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,17 +6557,23 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
-msgstr "%{link} මකන්න"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
+msgstr ""
msgid "AuditStreams|Destination URL"
msgstr "ගමනà·à¶±à·Šà¶­ ඒ.à·ƒ.නි."
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Filter by audit event type"
+msgstr ""
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr "à·à·Šâ€à¶»à·“ර්ෂය"
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr "උපරිම HTTP à·à·Šâ€à¶»à·“ර්ෂ %{number} වෙත ළඟ෠වී ඇත."
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr "අගය"
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr "නිකිණි"
@@ -7131,28 +7205,28 @@ msgstr "අයපත්"
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr "%{group_name} දà·à¶±à¶§ %{plan_name} භà·à·€à·’ත෠කරයි"
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr "සහà·à¶º"
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,11 +7427,8 @@ msgstr "අපි උදව් කිරීමට කà·à¶¸à·à¶­à·Šà¶­à·™à¶¸à·”
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr "ඔබ සතුව සමූහ නà·à¶­. %{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 "මෙම ව්â€à¶ºà·à¶´à·˜à¶­à·’ය %{move_link_end}ඔබගේ සමූහ වලින් එකකට%{move_link_start} ගෙන යà·à¶¸à¶§ සිදුවේ."
+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 your projects to it%{move_link_end}."
+msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr ""
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr "දිගහරින්න"
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr "තද පෙළ"
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr "පෙත සංà·à·à¶°à¶±à¶º"
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr "මුරපදය සංà·à·à¶°à¶±à¶º"
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr "වෙනස් විය"
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr "ඉතිරි අකුරු"
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr "සංවà·à¶¯à¶º"
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr "%{name}ගේ ගිට්ලà·à¶¶à·Š දà·à¶ºà¶šà¶­à·Šâ€à·€à¶º"
+msgid "Checkout|%{name}'s compute minutes"
+msgstr ""
+
msgid "Checkout|%{name}'s storage subscription"
msgstr "%{name}ගේ ආචයන දà·à¶ºà¶šà¶­à·Šâ€à·€à¶º"
-msgid "Checkout|%{name}'s units of compute"
-msgstr ""
-
msgid "Checkout|%{quantity} GB of storage"
msgstr "ආචයනය ගි.බ. %{quantity}"
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] "ආචයන ඇසුරුම් %{quantity}"
msgstr[1] "ආචයන ඇසුරුම් %{quantity}"
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr "%{selectedPlanText} à·ƒà·à¶½à·ƒà·”ම"
@@ -9332,7 +9424,7 @@ msgstr "නගරය"
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr "සමà·à¶œà¶¸ හ෠කණ්ඩà·à¶ºà¶¸"
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr "වර්ගයක් තà·à¶»à¶±à·Šà¶±..."
msgid "Choose file…"
msgstr "ගොනුව තà·à¶»à¶±à·Šà¶±â€¦"
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr "වසන්න"
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr "%{issueType} වසන්න"
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr "ඇමසන් EKS"
@@ -10737,9 +10841,6 @@ msgstr "ඔබ දà·à¶± සිටියà·à¶¯?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr "ප්â€à¶»à·à¶¸à·’තියස් අනුකලනය සබල කරන්න"
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr "අනුකලනය අබලයි"
msgid "ClusterIntegration|Integration enabled"
msgstr "අනුකලනය සබලයි"
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr "à·à·à¶›à·"
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr "සසඳන්න"
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr "ඒකà·à¶¶à¶¯à·Šà¶° ඉල්ලීමක් à·ƒà·à¶¯à¶±à·Šà¶±"
msgid "CompareRevisions|Filter by Git revision"
msgstr "ගිට් ප්â€à¶»à¶­à·’à·à·à¶°à¶±à¶º අනුව පෙරන්න"
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr "සම්පූර්ණයි"
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export full report as CSV"
+msgstr ""
+
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr "අනුකලන සකසන්න"
-msgid "Configure Prometheus"
-msgstr "ප්â€à¶»à·à¶¸à·’තියස් වින්â€à¶ºà·à·ƒ කිරීම"
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr "පවතින ස්ථà·à¶´à¶±à¶º සකසන්න"
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr "නව à·à·à¶›à·à·€à¶šà·Š à·ƒà·à¶¯à¶±à·Šà¶±"
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr "කේත බà·à¶œà¶±à·Šà¶±"
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr "පරිසර ගà·à¶± දà·à¶±à¶œà¶±à·Šà¶±"
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr "https://ගිට්පොඩ්.උදà·à·„රණය.ලංකà·"
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr "මà·à¶¯à·’න්"
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr "උපකරණ පුවරුවට ආපසු"
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr "නව උපකරණ පුවරුවක් à·ƒà·à¶¯à¶±à·Šà¶±"
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr "ප්â€à¶»à·à¶¸à·’තියස් විමසුම් ප්â€à¶»à¶½à·šà¶›à¶±à¶º"
-msgid "Metrics|Refresh Prometheus data"
-msgstr "ප්â€à¶»à·à¶¸à·’තියස් දත්ත නà·à·€à·”ම් කිරීම"
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
+msgstr ""
+
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr "සංවිධà·à¶±"
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr "ව්â€à¶ºà·à¶´à·˜à¶­à·’යේ තොරතුරු"
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr "ධà·à·€à¶š සමඟ පටන් ගන්න"
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr "අනන්â€à¶ºà¶±"
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr "ආවරණය-පරීක්â€à·‚à·à·€ ගà·à¶± තව දà·à¶±à¶œà¶±à·Šà¶±"
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr "නොදනී"
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr "à·ƒà·à¶»à·à¶‚à·à¶º / සටහන"
msgid "Summary comment (optional)"
msgstr "à·ƒà·à¶»à·à¶‚෠අදහස (විකල්ප)"
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr "à·à·à¶›à·à·€/අනන්â€à¶ºà¶±à¶º මà·à¶»à·”à·€"
msgid "Switch to GitLab Next"
msgstr "ගිට්ලà·à¶¶à·Š නෙක්â€à·ƒà·Šà¶§à·Š මà·à¶»à·”à·€"
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr "රක්â€à·‚ිතයි"
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr "දුරකථන අංකය"
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr "ටෙරà·à·†à·à¶¸à·Š init විධà·à¶±à¶º"
-msgid "Terraform|Terraform reports"
-msgstr "ටෙරà·à·†à·à¶¸à·Š à·€à·à¶»à·Šà¶­à·"
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr "ඔබ උඩුගත කළ බලපත්â€à¶»à¶º වලංගු à
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr "ඉඩ දෙන උපරිම ගොනුවක ප්â€à¶»à¶¸à·à¶«à¶º %{size}."
@@ -45872,9 +46099,6 @@ msgstr "උපරිම ගොනුවක ප්â€à¶»à¶¸à·à¶«à¶º %{size}."
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr "ඉමà·à¶¢à·’ ගà·à¶±à·“මේ දී ගà·à¶§à¶½à·”වකි."
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr "සමූහ ගà·à¶±à·“මේ දී ගà·à¶§à¶½à·”වකි."
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr "අභියà·à¶œà¶ºà·™à·„à·’ දà·à·‚යක් මතු විය. කරුණà·à¶šà¶» අභියà·à¶œà¶º නà·à·€à¶­ විසඳන්න."
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr "ඔබට ව්â€à¶ºà·à¶´à·˜à¶­à·’ කිහිපයක් හරහ෠තොරතුරු කියවීමට ඉඩ නà·à¶­à·’ නිස෠මෙම පිටුව නොතිබේ."
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr "මේ දà·à¶±à·Š"
msgid "Timeago|right now"
msgstr "හරියටම දà·à¶±à·Š"
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr "සිරà·à·ƒà·’ය:"
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr "සිරà·à·ƒà·’ සහ සවිස්තර"
-
msgid "To"
msgstr "වෙත"
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr "පහත සබà·à¶³à·’ය භà·à·€à·’තයෙන් ගිණුම
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr "අනුකලනය පිහිටුවීමට:"
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr "හෙට"
@@ -47998,6 +48231,9 @@ msgstr "මà·à¶­à·˜à¶šà·"
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr "මුළු"
@@ -48327,12 +48563,6 @@ msgstr "සෙවීමට ලියන්න"
msgid "URL"
msgstr "ඒ.ස.නි."
-msgid "URL cannot be blank"
-msgstr "ඒ.ස.නි. හිස් නොවිය යුතුය"
-
-msgid "URL is invalid"
-msgstr "ඒ.à·ƒ.නි. à·€à·à¶»à¶¯à·’ය"
-
msgid "URL is required"
msgstr "ඒ.à·ƒ.නි. අවà·à·Šâ€à¶ºà¶ºà·’"
@@ -48390,9 +48620,6 @@ msgstr "CPU තොරතුරු රà·à·ƒà·Š කළ නොහà·à¶šà·’ය"
msgid "Unable to collect memory info"
msgstr "මතකයේ තොරතුරු රà·à·ƒà·Š කළ නොහà·à¶šà·’ය"
-msgid "Unable to connect to Prometheus server"
-msgstr "ප්â€à¶»à·à¶¸à·’තියස් සේවà·à¶¯à·à¶ºà¶šà¶ºà¶§ සබà·à¶³à·“මට නොහà·à¶šà·’ය"
-
msgid "Unable to connect to server: %{error}"
msgstr "සේවà·à¶¯à·à¶ºà¶šà¶ºà¶§ සබà·à¶³à·“මට නොහà·à¶šà·’ය: %{error}"
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr "අසතුටුයිද?"
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr "අගුළු හරින්න"
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr "අගුළු à·„à·à¶» ඇත"
msgid "Unlocked the discussion."
msgstr "à·ƒà·à¶šà¶ à·Šà¶¡à·à·€ අගුළු à·„à·à¶» ඇත."
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr "à·ƒà·à¶šà¶ à·Šà¶¡à·à·€ අගුළු හරියි."
@@ -48660,9 +48887,6 @@ msgstr "ළඟ෠විය නොහà·à¶šà·’ය"
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,17 +49256,11 @@ msgstr "පොරොත්තු à·ƒà·à¶¸à·à¶¢à·’කයින්"
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr "මිලදී ගත් ආචයනය"
-
-msgid "UsageQuota|Purchased storage used"
-msgstr "මිලදී ගත් ආචයනය භà·à·€à·’ත෠කර ඇත"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
+msgstr ""
msgid "UsageQuota|Recalculate repository usage"
msgstr ""
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr "ක්â€à¶»à·’යà·à¶šà·à¶»à¶šà¶¸"
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr "දà·à¶ºà¶š වූ ව්â€à¶ºà·à¶´à·˜à¶­à·’"
msgid "UserProfile|Copy user ID"
msgstr "පරිà·à·“ලක à·„à·à¶³à·”. පිටපතක්"
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr "පà·à¶­à·’කඩ සංස්කරණය"
@@ -49658,6 +49897,9 @@ msgstr "මෙම පුද්ගලය෠වෙනත් පරිà·à·“ලක
msgid "UserProfile|Unconfirmed user"
msgstr "තහවුරු නොකළ පරිà·à·“ලක"
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr "පරිà·à·“ලක à·„à·à¶³à·”.: %{id}"
@@ -49907,7 +50149,7 @@ msgstr "ප්â€à¶»à¶½à·šà¶›à¶± වෙත යන්න"
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr "කේතය සත්â€à¶ºà·à¶´à¶±à¶º"
-msgid "Verify configuration"
-msgstr "වින්â€à¶ºà·à·ƒà¶º සත්â€à¶ºà·à¶´à¶±à¶º"
-
msgid "Version"
msgstr "අනුවà·à¶¯à¶º"
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr "@ ගොනුව බලන්න"
msgid "View file @ %{commitSha}"
msgstr "ගොනුව බලන්න @ %{commitSha}"
-msgid "View full dashboard"
-msgstr "උපකරණ පුවරුව බලන්න"
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr "@ පිටුව බලන්න"
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr "පරිපà·à¶½à¶š ප්â€à¶»à¶¯à·šà·à¶ºà·š ව්â€à¶ºà·à¶´à·˜à¶­à·’ය බලන්න"
@@ -50240,6 +50468,9 @@ msgstr "ප්â€à¶»à¶­à·’ස්ථà·à¶´à·’ත ගොනුව බලන්න
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr "ප්â€à¶»à¶½à·šà¶›à¶±à¶º බලන්න"
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr "භà·à·€à·’ත විස්තර බලන්න"
@@ -50609,6 +50837,9 @@ msgstr "කේත සමà·à¶½à·à¶ à¶±à¶º"
msgid "Vulnerability|Comments"
msgstr "අදහස්"
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr "බිඳවà·à¶§à·“මේ ලිපිනය"
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr "ගිට්ලà·à¶¶à·Š ආරක්â€à·‚ණ à·€à·à¶»à·Šà¶­à·à·€"
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr "හඳුන්වනය"
@@ -50738,6 +50972,9 @@ msgstr "තීව්â€à¶»à¶­à·à·€"
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr "තත්â€à·€à¶º"
@@ -50795,9 +51032,6 @@ msgstr "අනුමà·à¶­à·’යට රà·à¶³à·™à¶¸à·’න්"
msgid "Waiting for merge (open and assigned)"
msgstr "ඒකà·à¶¶à¶¯à·Šà¶°à¶ºà¶§ රà·à¶³à·™à¶¸à·’න් (විවෘත හ෠පවර෠ඇත)"
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr "දත්ත බà·à¶½à·“මට අවà·à·Šâ€à¶ºà¶¯? ප්â€à¶»à·€à·šà·à¶º සඳහ෠පරිපà·à¶½à¶šà¶ºà·™à¶šà·”ගෙන් අසන්න."
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr "අපට ප්â€à¶»à·à¶¸à·’තියස් සේවà·à¶¯à·à¶ºà¶šà¶º වෙත ළඟ෠වීමට නොහà·à¶šà·’යි. සේවà·à¶¯à·à¶ºà¶šà¶º නොපවතී හ෠වින්â€à¶ºà·à·ƒ විස්තර යà·à·€à¶­à·Šà¶šà·à¶½ කළ යුතුය."
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr "කà·à¶»à·Šà¶ºà·à¶½ වි-තà·à¶´à·‘ලක් නිර්දේ෠කෙරේ."
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr "සියළුම SAST විà·à·Šà¶½à·šà·‚ක සබල කර තà·à¶¶à·“මට නිර්දේ෠කෙරේ"
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr "ඔබ නව à·à·à¶›à·à·€à¶šà·Š සෑදීමට කà·à¶¸à¶­à·’ද?"
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr "ඔබ ප්â€à¶»à·à¶¸à·’තියස් සේවà·à¶¯à·à¶ºà¶šà¶ºà¶§ සම්බන්ධිතයි, දà·à¶±à¶§ පෙන්වීමට දත්ත නà·à¶­."
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr "ඔබගේ ගිට්ලà·à¶¶à·Š ගිණුමට අසà·à¶»à·Šà¶®à¶š ඇතුළු වීමේ තà·à¶­à·Š කිරීම් බොහොමයක් හේතුවෙන් අගුළු ල෠ඇත. ගිණුම %{duration} කින් ස්වයංක්â€à¶»à·“යව අගුළු à·„à·à¶»à·™à¶± තෙක් රà·à¶³à·“ සිටීමට à·„à·à¶šà·’ය, හ෠දà·à¶±à·Šà¶¸ අගුළු à·„à·à¶»à·“මට පහත සබà·à¶³à·’ය ඔබන්න."
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr "ඔබගේ ගිට්ලà·à¶¶à·Š ගිණුම සඳහ෠ඉල්ලීම අනුමතයි!"
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr "ඔබගේ ගිණුම අක්â€à¶»à·’ය කර ඇත"
@@ -52924,8 +53182,8 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr "ඔබගේ අදහස යොමු කළ නොහà·à¶šà·’ විය! ජà·à¶½ සම්බන්ධතà·à·€à¶º පරීක්â€à·‚෠කර යළි බලන්න."
-msgid "Your comment could not be updated! Please check your network connection and try again."
-msgstr "ඔබගේ අදහස යà·à·€à¶­à·Šà¶šà·à¶½ කළ නොහà·à¶šà·’ විය! ජà·à¶½ සම්බන්ධතà·à·€à¶º පරීක්â€à·‚෠කර යළි බලන්න."
+msgid "Your comment could not be updated because %{reason}."
+msgstr ""
msgid "Your comment will be discarded."
msgstr "ඔබගේ අදහස ඉවත දමනු ඇත."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr "හවුල් ධà·à·€à¶š සබල කර ඇත්නම් වෙà
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr "අදහස"
@@ -54041,18 +54301,6 @@ msgstr[1] "ගොනු"
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr "%{link_to_pipeline_ref} සඳහà·"
-
-msgid "for %{ref}"
-msgstr "%{ref} සඳහà·"
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr "කෙසේ හ෠පූරණය"
msgid "loading"
msgstr "පූරණය â€â€à·€à·™à¶¸à·’න්"
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr "ඒකà·à¶¶à¶¯à·Šà¶°à¶ºà¶§ අසමත් විය."
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr "තව තොරතුරු"
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr "මෙම ඒකà·à¶¶à¶¯à·Šà¶° ඉල්ලීම ස්වයංක්
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr "ආරම්භක දිනයට පසු විය යුතුය"
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr "කà·à·‚්ඨයක් තිබිය යුතුය"
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr "à·„à·"
@@ -55216,6 +55463,9 @@ msgstr "අනන්â€à¶ºà¶±à¶ºà·š නම"
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr "නිවà·à¶»à¶¯à·’ ආකෘතිය."
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr "යà·à·€à¶­à·Šà¶šà·à¶½à·“නයි"
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr "ඔබගේ සමූහය (%{group_name})"
-msgid "your settings"
-msgstr "ඔබගේ à·ƒà·à¶šà·ƒà·”ම්"
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/sk_SK/gitlab.po b/locale/sk_SK/gitlab.po
index 7d67b53397d..20afcbfde56 100644
--- a/locale/sk_SK/gitlab.po
+++ b/locale/sk_SK/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: sk\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:45\n"
+"PO-Revision-Date: 2023-07-11 04:48\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -107,6 +107,20 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -212,6 +226,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -464,20 +485,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -850,9 +857,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -895,6 +899,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -967,7 +974,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -991,6 +1001,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1324,6 +1337,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1351,7 +1370,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1493,9 +1512,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -2231,6 +2247,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2684,6 +2706,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2702,12 +2727,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2726,6 +2757,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2735,6 +2775,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2786,13 +2829,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2903,9 +2946,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2954,6 +2994,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -3209,6 +3252,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -3230,9 +3276,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3656,22 +3699,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator email"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3755,6 +3789,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3824,9 +3861,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3836,9 +3870,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3869,10 +3900,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3881,9 +3912,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -4106,9 +4134,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -4154,6 +4179,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -4193,7 +4221,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4463,9 +4491,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4502,7 +4527,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4607,10 +4632,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4721,9 +4746,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4760,9 +4782,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4859,6 +4878,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -5024,6 +5046,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -5075,12 +5100,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -5123,6 +5142,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -5282,9 +5307,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5403,9 +5425,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5494,7 +5513,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5560,12 +5579,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5575,7 +5603,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5614,6 +5642,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5626,6 +5666,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5644,6 +5687,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5668,6 +5717,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6477,9 +6529,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6575,6 +6624,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6629,7 +6681,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6690,9 +6742,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6836,16 +6885,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6857,19 +6912,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Filter by audit event type"
+msgstr ""
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6878,6 +6948,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6905,10 +6978,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6920,6 +6990,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7457,28 +7533,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7649,6 +7725,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7676,10 +7755,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7739,10 +7815,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7754,7 +7830,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -8054,12 +8130,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -8124,9 +8206,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -8184,6 +8263,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8601,19 +8683,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8850,6 +8941,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9346,10 +9440,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9367,10 +9461,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9394,7 +9488,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9442,13 +9539,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9490,9 +9587,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9598,7 +9692,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9614,15 +9708,18 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
@@ -9630,9 +9727,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9672,7 +9766,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9813,10 +9907,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9843,7 +9937,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9891,6 +9985,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9918,16 +10015,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9942,6 +10039,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9969,6 +10069,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10342,6 +10445,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10399,6 +10505,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10994,9 +11103,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -11081,9 +11187,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -11144,9 +11247,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11390,6 +11490,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11435,6 +11538,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11450,10 +11559,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11549,15 +11655,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11652,18 +11767,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11790,15 +11899,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11808,6 +11932,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11844,10 +11974,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -12045,6 +12178,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -12090,13 +12226,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -12153,9 +12289,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -12192,9 +12325,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12357,15 +12487,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12759,9 +12883,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12885,6 +13006,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -13014,9 +13168,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -13182,6 +13333,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -13236,9 +13390,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -13281,6 +13432,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13566,6 +13720,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13710,9 +13867,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14940,6 +15094,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -15209,6 +15369,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -15333,6 +15496,12 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15375,9 +15544,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15411,6 +15586,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15429,6 +15607,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15453,6 +15634,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15462,6 +15646,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15780,9 +15967,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15937,12 +16121,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15952,9 +16130,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16713,7 +16888,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16758,15 +16933,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -17052,6 +17227,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -17157,6 +17335,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17493,9 +17674,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17556,9 +17734,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17586,16 +17761,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
+msgstr ""
+
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17760,9 +17938,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17775,9 +17950,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17973,12 +18145,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17994,9 +18160,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18953,12 +19116,18 @@ msgstr[3] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18999,9 +19168,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -19146,6 +19312,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -19167,6 +19336,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -19233,9 +19405,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19540,6 +19709,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19771,9 +19943,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19783,6 +19952,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19967,6 +20139,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -20027,6 +20202,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -20084,6 +20262,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20704,9 +20885,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -21187,6 +21365,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -21226,6 +21407,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -21244,6 +21428,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -21256,6 +21443,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -21292,6 +21482,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21721,9 +21914,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -22015,6 +22205,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22692,12 +22885,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22812,13 +22999,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "Hide comments"
msgstr ""
@@ -22967,12 +23147,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23599,6 +23791,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23660,6 +23855,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24482,6 +24680,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24599,7 +24803,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24632,9 +24836,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25714,6 +25915,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -26071,9 +26275,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -26308,6 +26518,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -26326,6 +26539,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26491,6 +26707,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26653,6 +26872,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26716,9 +26941,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26940,6 +27162,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27592,9 +27817,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27742,7 +27964,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27808,6 +28030,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -28000,6 +28225,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -28033,6 +28261,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -28090,6 +28321,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -28114,9 +28348,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -28216,7 +28447,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -28267,7 +28498,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -28294,7 +28525,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -28303,7 +28534,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -28339,7 +28570,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -28360,7 +28591,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -28381,12 +28615,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -28411,7 +28651,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28444,7 +28684,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28795,6 +29035,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28813,6 +29056,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28930,9 +29176,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28960,9 +29203,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28987,6 +29227,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -29053,6 +29296,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -29149,9 +29404,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -29206,217 +29458,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -29426,24 +29506,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29832,6 +29900,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29868,6 +29939,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29928,9 +30002,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -30108,6 +30179,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30860,12 +30937,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -31004,9 +31075,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -31049,6 +31117,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -31194,9 +31265,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31501,6 +31569,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31606,18 +31677,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
+msgstr ""
+
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31792,6 +31869,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32472,6 +32552,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32995,6 +33081,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33565,9 +33663,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33769,6 +33864,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33778,6 +33882,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33835,9 +33942,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -34024,9 +34128,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -34138,6 +34239,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -34189,9 +34293,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -34210,7 +34311,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -34270,9 +34371,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -34339,6 +34446,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -34423,6 +34536,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34549,9 +34665,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34702,7 +34815,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -35218,6 +35331,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -35257,6 +35373,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -35398,6 +35517,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35914,9 +36036,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -36454,18 +36573,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36649,9 +36756,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36673,9 +36777,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36712,10 +36813,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -37198,6 +37296,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -37213,6 +37314,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -38001,9 +38105,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -38076,6 +38177,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -38260,7 +38364,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -38272,7 +38376,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -38287,18 +38391,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38516,13 +38608,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38783,6 +38875,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38807,6 +38902,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38825,6 +38923,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -39236,7 +39337,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39621,9 +39722,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39669,12 +39767,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39835,6 +39942,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39940,6 +40050,9 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
@@ -39947,6 +40060,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -40007,9 +40123,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -40185,6 +40298,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -40438,7 +40558,11 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d 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[3] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40759,10 +40883,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40771,12 +40898,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40795,6 +40943,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40810,6 +40961,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40819,6 +40973,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40831,6 +40988,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40852,6 +41015,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40900,6 +41066,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -41364,7 +41533,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -41388,9 +41557,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -41475,9 +41641,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41592,6 +41755,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41715,6 +41881,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41757,7 +41926,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41902,6 +42071,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -42295,6 +42467,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -42475,7 +42650,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42538,10 +42713,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42688,6 +42869,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42718,6 +42902,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42727,6 +42914,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42736,6 +42929,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42763,6 +42959,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -43073,6 +43275,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -43157,7 +43368,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -43166,9 +43377,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -43479,7 +43687,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43704,6 +43912,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -44274,6 +44485,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -44412,9 +44626,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44616,9 +44827,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44667,7 +44875,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -45102,6 +45310,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -45331,10 +45545,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45598,7 +45812,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45686,6 +45900,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45862,9 +46091,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -46123,9 +46349,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -46204,13 +46427,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -46410,9 +46633,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -46428,9 +46657,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46557,6 +46783,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46785,6 +47014,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46995,6 +47227,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -47136,6 +47371,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -47517,9 +47755,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47691,9 +47926,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47973,6 +48205,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -48062,13 +48297,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -48137,6 +48369,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -48164,9 +48399,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -48240,6 +48472,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -48249,6 +48484,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -48420,9 +48661,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -48432,6 +48670,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -48480,12 +48721,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -48562,6 +48797,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48893,12 +49131,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48956,9 +49188,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -49142,9 +49371,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -49196,7 +49422,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -49217,6 +49443,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -49226,9 +49455,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -49508,7 +49734,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -49556,6 +49782,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49595,16 +49824,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49664,7 +49887,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49971,6 +50200,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -50124,9 +50356,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -50145,6 +50383,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -50226,6 +50467,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -50475,7 +50719,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50601,7 +50845,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50616,9 +50860,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50700,13 +50941,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50735,9 +50969,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50792,9 +51023,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50814,6 +51042,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50826,9 +51057,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -51183,6 +51411,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -51237,6 +51468,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -51312,6 +51546,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -51369,9 +51606,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -51411,9 +51645,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -51432,9 +51663,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51822,6 +52050,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -52143,6 +52374,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -52240,6 +52474,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -52264,9 +52501,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -52381,6 +52615,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -52459,6 +52699,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -52555,6 +52798,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52667,9 +52913,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52958,6 +53201,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -53401,6 +53647,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -53452,6 +53704,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -53512,7 +53770,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53676,10 +53934,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53979,7 +54240,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -54429,10 +54690,11 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "comment"
msgstr ""
@@ -54663,18 +54925,6 @@ msgstr[3] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54785,7 +55035,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54794,6 +55044,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54986,9 +55239,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -55171,9 +55421,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -55299,9 +55546,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -55365,16 +55609,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -55413,6 +55657,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -55446,9 +55696,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -55528,7 +55775,11 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "or"
msgstr ""
@@ -55870,6 +56121,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55927,9 +56181,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -56058,9 +56309,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/sl_SI/gitlab.po b/locale/sl_SI/gitlab.po
index 2946de0e50f..5e74d627d77 100644
--- a/locale/sl_SI/gitlab.po
+++ b/locale/sl_SI/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: sl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:45\n"
+"PO-Revision-Date: 2023-07-11 04:48\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -107,6 +107,20 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -212,6 +226,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -464,20 +485,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -850,9 +857,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -895,6 +899,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -967,7 +974,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -991,6 +1001,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1324,6 +1337,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1351,7 +1370,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1493,9 +1512,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -2231,6 +2247,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2684,6 +2706,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2702,12 +2727,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2726,6 +2757,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2735,6 +2775,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2786,13 +2829,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2903,9 +2946,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2954,6 +2994,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -3209,6 +3252,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -3230,9 +3276,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3656,22 +3699,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator email"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3755,6 +3789,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3824,9 +3861,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3836,9 +3870,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3869,10 +3900,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3881,9 +3912,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -4106,9 +4134,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -4154,6 +4179,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -4193,7 +4221,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4463,9 +4491,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4502,7 +4527,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4607,10 +4632,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4721,9 +4746,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4760,9 +4782,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4859,6 +4878,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -5024,6 +5046,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -5075,12 +5100,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -5123,6 +5142,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -5282,9 +5307,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5403,9 +5425,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5494,7 +5513,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5560,12 +5579,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5575,7 +5603,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5614,6 +5642,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5626,6 +5666,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5644,6 +5687,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5668,6 +5717,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6477,9 +6529,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6575,6 +6624,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6629,7 +6681,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6690,9 +6742,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6836,16 +6885,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6857,19 +6912,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Filter by audit event type"
+msgstr ""
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6878,6 +6948,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6905,10 +6978,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6920,6 +6990,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7457,28 +7533,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7649,6 +7725,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7676,10 +7755,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7739,10 +7815,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7754,7 +7830,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -8054,12 +8130,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -8124,9 +8206,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -8184,6 +8263,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8601,19 +8683,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8850,6 +8941,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9346,10 +9440,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9367,10 +9461,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9394,7 +9488,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9442,13 +9539,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9490,9 +9587,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9598,7 +9692,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9614,15 +9708,18 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
@@ -9630,9 +9727,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9672,7 +9766,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9813,10 +9907,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9843,7 +9937,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9891,6 +9985,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9918,16 +10015,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9942,6 +10039,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9969,6 +10069,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10342,6 +10445,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10399,6 +10505,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10994,9 +11103,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -11081,9 +11187,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -11144,9 +11247,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11390,6 +11490,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11435,6 +11538,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11450,10 +11559,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11549,15 +11655,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11652,18 +11767,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11790,15 +11899,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11808,6 +11932,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11844,10 +11974,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -12045,6 +12178,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -12090,13 +12226,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -12153,9 +12289,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -12192,9 +12325,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12357,15 +12487,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12759,9 +12883,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12885,6 +13006,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -13014,9 +13168,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -13182,6 +13333,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -13236,9 +13390,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -13281,6 +13432,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13566,6 +13720,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13710,9 +13867,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14940,6 +15094,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -15209,6 +15369,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -15333,6 +15496,12 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15375,9 +15544,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15411,6 +15586,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15429,6 +15607,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15453,6 +15634,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15462,6 +15646,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15780,9 +15967,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15937,12 +16121,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15952,9 +16130,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16713,7 +16888,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16758,15 +16933,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -17052,6 +17227,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -17157,6 +17335,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17493,9 +17674,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17556,9 +17734,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17586,16 +17761,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
+msgstr ""
+
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17760,9 +17938,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17775,9 +17950,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17973,12 +18145,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17994,9 +18160,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18953,12 +19116,18 @@ msgstr[3] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18999,9 +19168,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -19146,6 +19312,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -19167,6 +19336,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -19233,9 +19405,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19540,6 +19709,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19771,9 +19943,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19783,6 +19952,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19967,6 +20139,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -20027,6 +20202,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -20084,6 +20262,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20704,9 +20885,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -21187,6 +21365,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -21226,6 +21407,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -21244,6 +21428,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -21256,6 +21443,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -21292,6 +21482,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21721,9 +21914,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -22015,6 +22205,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22692,12 +22885,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22812,13 +22999,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "Hide comments"
msgstr ""
@@ -22967,12 +23147,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23599,6 +23791,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23660,6 +23855,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24482,6 +24680,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24599,7 +24803,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24632,9 +24836,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25714,6 +25915,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -26071,9 +26275,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -26308,6 +26518,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -26326,6 +26539,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26491,6 +26707,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26653,6 +26872,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26716,9 +26941,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26940,6 +27162,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27592,9 +27817,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27742,7 +27964,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27808,6 +28030,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -28000,6 +28225,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -28033,6 +28261,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -28090,6 +28321,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -28114,9 +28348,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -28216,7 +28447,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -28267,7 +28498,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -28294,7 +28525,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -28303,7 +28534,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -28339,7 +28570,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -28360,7 +28591,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -28381,12 +28615,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -28411,7 +28651,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28444,7 +28684,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28795,6 +29035,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28813,6 +29056,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28930,9 +29176,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28960,9 +29203,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28987,6 +29227,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -29053,6 +29296,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -29149,9 +29404,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -29206,217 +29458,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -29426,24 +29506,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29832,6 +29900,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29868,6 +29939,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29928,9 +30002,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -30108,6 +30179,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30860,12 +30937,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -31004,9 +31075,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -31049,6 +31117,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -31194,9 +31265,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31501,6 +31569,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31606,18 +31677,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
+msgstr ""
+
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31792,6 +31869,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32472,6 +32552,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32995,6 +33081,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33565,9 +33663,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33769,6 +33864,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33778,6 +33882,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33835,9 +33942,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -34024,9 +34128,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -34138,6 +34239,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -34189,9 +34293,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -34210,7 +34311,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -34270,9 +34371,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -34339,6 +34446,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -34423,6 +34536,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34549,9 +34665,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34702,7 +34815,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -35218,6 +35331,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -35257,6 +35373,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -35398,6 +35517,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35914,9 +36036,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -36454,18 +36573,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36649,9 +36756,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36673,9 +36777,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36712,10 +36813,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -37198,6 +37296,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -37213,6 +37314,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -38001,9 +38105,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -38076,6 +38177,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -38260,7 +38364,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -38272,7 +38376,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -38287,18 +38391,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38516,13 +38608,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38783,6 +38875,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38807,6 +38902,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38825,6 +38923,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -39236,7 +39337,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39621,9 +39722,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39669,12 +39767,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39835,6 +39942,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39940,6 +40050,9 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
@@ -39947,6 +40060,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -40007,9 +40123,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -40185,6 +40298,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -40438,7 +40558,11 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d 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[3] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40759,10 +40883,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40771,12 +40898,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40795,6 +40943,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40810,6 +40961,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40819,6 +40973,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40831,6 +40988,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40852,6 +41015,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40900,6 +41066,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -41364,7 +41533,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -41388,9 +41557,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -41475,9 +41641,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41592,6 +41755,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41715,6 +41881,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41757,7 +41926,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41902,6 +42071,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -42295,6 +42467,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -42475,7 +42650,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42538,10 +42713,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42688,6 +42869,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42718,6 +42902,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42727,6 +42914,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42736,6 +42929,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42763,6 +42959,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -43073,6 +43275,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -43157,7 +43368,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -43166,9 +43377,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -43479,7 +43687,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43704,6 +43912,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -44274,6 +44485,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -44412,9 +44626,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44616,9 +44827,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44667,7 +44875,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -45102,6 +45310,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -45331,10 +45545,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45598,7 +45812,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45686,6 +45900,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45862,9 +46091,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -46123,9 +46349,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -46204,13 +46427,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -46410,9 +46633,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -46428,9 +46657,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46557,6 +46783,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46785,6 +47014,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46995,6 +47227,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -47136,6 +47371,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -47517,9 +47755,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47691,9 +47926,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47973,6 +48205,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -48062,13 +48297,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -48137,6 +48369,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -48164,9 +48399,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -48240,6 +48472,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -48249,6 +48484,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -48420,9 +48661,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -48432,6 +48670,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -48480,12 +48721,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -48562,6 +48797,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48893,12 +49131,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48956,9 +49188,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -49142,9 +49371,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -49196,7 +49422,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -49217,6 +49443,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -49226,9 +49455,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -49508,7 +49734,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -49556,6 +49782,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49595,16 +49824,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49664,7 +49887,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49971,6 +50200,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -50124,9 +50356,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -50145,6 +50383,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -50226,6 +50467,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -50475,7 +50719,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50601,7 +50845,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50616,9 +50860,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50700,13 +50941,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50735,9 +50969,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50792,9 +51023,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50814,6 +51042,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50826,9 +51057,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -51183,6 +51411,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -51237,6 +51468,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -51312,6 +51546,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -51369,9 +51606,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -51411,9 +51645,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -51432,9 +51663,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51822,6 +52050,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -52143,6 +52374,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -52240,6 +52474,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -52264,9 +52501,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -52381,6 +52615,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -52459,6 +52699,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -52555,6 +52798,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52667,9 +52913,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52958,6 +53201,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -53401,6 +53647,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -53452,6 +53704,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -53512,7 +53770,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53676,10 +53934,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53979,7 +54240,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -54429,10 +54690,11 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "comment"
msgstr ""
@@ -54663,18 +54925,6 @@ msgstr[3] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54785,7 +55035,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54794,6 +55044,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54986,9 +55239,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -55171,9 +55421,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -55299,9 +55546,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -55365,16 +55609,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -55413,6 +55657,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -55446,9 +55696,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -55528,7 +55775,11 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "or"
msgstr ""
@@ -55870,6 +56121,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55927,9 +56181,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -56058,9 +56309,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/sq_AL/gitlab.po b/locale/sq_AL/gitlab.po
index bcf5332fe2a..68ba0b3b571 100644
--- a/locale/sq_AL/gitlab.po
+++ b/locale/sq_AL/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: sq\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:45\n"
+"PO-Revision-Date: 2023-07-11 04:48\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/sr_CS/gitlab.po b/locale/sr_CS/gitlab.po
index 298edb3b39f..87c2ef36a1f 100644
--- a/locale/sr_CS/gitlab.po
+++ b/locale/sr_CS/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: sr-CS\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:48\n"
+"PO-Revision-Date: 2023-07-11 04:50\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -103,6 +103,18 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -193,6 +205,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -409,18 +427,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -754,9 +760,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -799,6 +802,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -871,7 +877,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -895,6 +904,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1219,6 +1231,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1246,7 +1264,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1378,9 +1396,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -2089,6 +2104,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2542,6 +2563,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2560,12 +2584,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2584,6 +2614,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2593,6 +2632,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2644,13 +2686,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2761,9 +2803,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2812,6 +2851,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -3067,6 +3109,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -3088,9 +3133,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3514,22 +3556,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator email"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3613,6 +3646,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3682,9 +3718,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3694,9 +3727,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3727,10 +3757,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3739,9 +3769,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3964,9 +3991,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -4012,6 +4036,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -4051,7 +4078,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4321,9 +4348,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4360,7 +4384,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4465,10 +4489,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4579,9 +4603,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4618,9 +4639,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4717,6 +4735,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4882,6 +4903,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4933,12 +4957,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4981,6 +4999,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -5140,9 +5164,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5260,9 +5281,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5350,7 +5368,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5416,12 +5434,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5431,7 +5458,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5470,6 +5497,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5482,6 +5521,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5500,6 +5542,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5524,6 +5572,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6322,9 +6373,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6415,6 +6463,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6469,7 +6520,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6529,9 +6580,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6673,16 +6721,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6694,19 +6748,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6715,6 +6784,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6742,10 +6814,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6757,6 +6826,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7294,28 +7369,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7486,6 +7561,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7513,10 +7591,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7576,10 +7651,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7591,7 +7666,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7888,12 +7963,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7957,9 +8038,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -8017,6 +8095,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8434,19 +8515,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8683,6 +8773,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9178,10 +9271,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9199,10 +9292,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9226,7 +9319,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9274,13 +9370,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9322,9 +9418,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9430,7 +9523,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9445,24 +9538,24 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9502,7 +9595,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9643,10 +9736,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9673,7 +9766,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9721,6 +9814,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9748,16 +9844,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9772,6 +9868,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9799,6 +9898,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10171,6 +10273,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10228,6 +10333,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10822,9 +10930,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10909,9 +11014,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10972,9 +11074,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11218,6 +11317,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11263,6 +11365,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11278,10 +11386,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11377,15 +11482,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11479,18 +11593,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11617,15 +11725,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11635,6 +11758,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11671,10 +11800,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export full report as CSV"
+msgstr ""
+
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11872,6 +12004,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11917,13 +12052,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11980,9 +12115,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -12019,9 +12151,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12184,15 +12313,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12583,9 +12706,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12709,6 +12829,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12838,9 +12991,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -13006,6 +13156,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -13060,9 +13213,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -13105,6 +13255,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13390,6 +13543,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13534,9 +13690,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14761,6 +14914,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -15028,6 +15187,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -15148,6 +15310,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15190,9 +15358,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15226,6 +15400,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15244,6 +15421,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15268,6 +15448,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15277,6 +15460,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15592,9 +15778,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15748,12 +15931,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15763,9 +15940,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16519,7 +16693,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16564,15 +16738,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16858,6 +17032,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16963,6 +17140,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17299,9 +17479,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17362,9 +17539,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17392,16 +17566,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
+msgstr ""
+
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17566,9 +17743,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17581,9 +17755,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17779,12 +17950,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17800,9 +17965,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18757,12 +18919,18 @@ msgstr[2] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18802,9 +18970,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18949,6 +19114,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18970,6 +19138,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -19036,9 +19207,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19342,6 +19510,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19573,9 +19744,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19585,6 +19753,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19768,6 +19939,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19828,6 +20002,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19885,6 +20062,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20503,9 +20683,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20986,6 +21163,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -21025,6 +21205,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -21043,6 +21226,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -21055,6 +21241,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -21091,6 +21280,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21520,9 +21712,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21814,6 +22003,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22489,12 +22681,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22609,12 +22795,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "Hide comments"
msgstr ""
@@ -22762,12 +22942,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23392,6 +23584,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23452,6 +23647,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24274,6 +24472,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24391,7 +24595,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24424,9 +24628,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25504,6 +25705,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25861,9 +26065,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -26098,6 +26308,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -26116,6 +26329,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26281,6 +26497,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26443,6 +26662,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26506,9 +26731,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26728,6 +26950,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27373,9 +27598,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27523,7 +27745,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27589,6 +27811,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27781,6 +28006,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27814,6 +28042,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27871,6 +28102,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27895,9 +28129,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27997,7 +28228,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -28048,7 +28279,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -28075,7 +28306,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -28084,7 +28315,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -28120,7 +28351,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -28141,7 +28372,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -28162,12 +28396,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -28192,7 +28432,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28225,7 +28465,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28573,6 +28813,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28591,6 +28834,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28708,9 +28954,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28738,9 +28981,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28765,6 +29005,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28831,6 +29074,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28927,9 +29182,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28984,216 +29236,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -29203,24 +29284,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29608,6 +29677,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29644,6 +29716,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29704,9 +29779,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29884,6 +29956,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30634,12 +30712,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30778,9 +30850,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30823,6 +30892,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30967,9 +31039,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31270,6 +31339,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31375,18 +31447,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31561,6 +31639,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32239,6 +32320,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32761,6 +32848,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33331,9 +33430,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33535,6 +33631,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33544,6 +33649,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33601,9 +33709,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33790,9 +33895,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33904,6 +34006,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33955,9 +34060,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33976,7 +34078,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -34036,9 +34138,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -34105,6 +34213,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -34189,6 +34303,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34315,9 +34432,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34468,7 +34582,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34984,6 +35098,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -35023,6 +35140,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -35164,6 +35284,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35680,9 +35803,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -36220,18 +36340,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36415,9 +36523,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36439,9 +36544,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36478,10 +36580,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36964,6 +37063,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36979,6 +37081,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37765,9 +37870,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37840,6 +37942,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -38023,7 +38128,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -38035,7 +38140,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -38050,18 +38155,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38278,13 +38371,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38545,6 +38638,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38569,6 +38665,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38587,6 +38686,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38992,7 +39094,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39373,9 +39475,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39421,12 +39520,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39583,6 +39691,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39688,12 +39799,18 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39754,9 +39871,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39931,6 +40045,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -40184,7 +40304,10 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d 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] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40504,10 +40627,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40516,12 +40642,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40540,6 +40687,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40555,6 +40705,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40564,6 +40717,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40576,6 +40732,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40597,6 +40759,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40645,6 +40810,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -41098,7 +41266,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -41122,9 +41290,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -41209,9 +41374,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41326,6 +41488,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41449,6 +41614,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41491,7 +41659,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41635,6 +41803,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -42028,6 +42199,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -42208,7 +42382,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42271,10 +42445,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42421,6 +42601,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42451,6 +42634,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42460,6 +42646,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42469,6 +42661,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42496,6 +42691,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42805,6 +43006,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42889,7 +43099,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42898,9 +43108,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -43210,7 +43417,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43435,6 +43642,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -44005,6 +44215,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -44143,9 +44356,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44347,9 +44557,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44398,7 +44605,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44833,6 +45040,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -45061,10 +45274,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45328,7 +45541,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45415,6 +45628,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45589,9 +45817,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45847,9 +46072,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45928,13 +46150,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -46132,9 +46354,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -46150,9 +46378,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46279,6 +46504,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46507,6 +46735,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46717,6 +46948,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46858,6 +47092,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -47239,9 +47476,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47413,9 +47647,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47695,6 +47926,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47782,13 +48016,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47857,6 +48088,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47884,9 +48118,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47959,6 +48190,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47968,6 +48202,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -48139,9 +48379,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -48151,6 +48388,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -48199,12 +48439,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -48280,6 +48514,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48610,12 +48847,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48673,9 +48904,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48859,9 +49087,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48913,7 +49138,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48934,6 +49159,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48943,9 +49171,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -49225,7 +49450,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -49273,6 +49498,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49312,16 +49540,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49381,7 +49603,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49687,6 +49915,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49840,9 +50071,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49861,6 +50098,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49942,6 +50182,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -50191,7 +50434,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50317,7 +50560,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50332,9 +50575,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50416,12 +50656,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50449,9 +50683,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50506,9 +50737,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50527,6 +50755,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50539,9 +50770,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50896,6 +51124,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50950,6 +51181,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -51025,6 +51259,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -51082,9 +51319,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -51124,9 +51358,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -51145,9 +51376,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51535,6 +51763,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51853,6 +52084,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51949,6 +52183,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51973,9 +52210,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -52090,6 +52324,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -52168,6 +52408,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -52264,6 +52507,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52375,9 +52621,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52666,6 +52909,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -53107,6 +53353,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -53158,6 +53410,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -53218,7 +53476,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53380,10 +53638,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53680,7 +53941,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -54122,10 +54383,10 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "comment"
msgstr ""
@@ -54352,18 +54613,6 @@ msgstr[2] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54472,7 +54721,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54481,6 +54730,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54670,9 +54922,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54853,9 +55102,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54979,9 +55225,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -55045,16 +55288,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -55093,6 +55336,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -55126,9 +55375,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -55208,7 +55454,10 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "or"
msgstr ""
@@ -55543,6 +55792,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55600,9 +55852,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55729,9 +55978,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/sr_SP/gitlab.po b/locale/sr_SP/gitlab.po
index 6ec4c0db5b4..770a669585b 100644
--- a/locale/sr_SP/gitlab.po
+++ b/locale/sr_SP/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: sr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:45\n"
+"PO-Revision-Date: 2023-07-11 04:48\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -103,6 +103,18 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -193,6 +205,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -409,18 +427,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -754,9 +760,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -799,6 +802,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -871,7 +877,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -895,6 +904,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1219,6 +1231,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1246,7 +1264,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1378,9 +1396,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -2089,6 +2104,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2542,6 +2563,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2560,12 +2584,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2584,6 +2614,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2593,6 +2632,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2644,13 +2686,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2761,9 +2803,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2812,6 +2851,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -3067,6 +3109,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -3088,9 +3133,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3514,22 +3556,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator email"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3613,6 +3646,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3682,9 +3718,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3694,9 +3727,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3727,10 +3757,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3739,9 +3769,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3964,9 +3991,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -4012,6 +4036,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -4051,7 +4078,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4321,9 +4348,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4360,7 +4384,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4465,10 +4489,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4579,9 +4603,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4618,9 +4639,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4717,6 +4735,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4882,6 +4903,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4933,12 +4957,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4981,6 +4999,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -5140,9 +5164,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5260,9 +5281,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5350,7 +5368,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5416,12 +5434,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5431,7 +5458,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5470,6 +5497,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5482,6 +5521,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5500,6 +5542,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5524,6 +5572,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6322,9 +6373,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6415,6 +6463,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6469,7 +6520,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6529,9 +6580,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6673,16 +6721,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6694,19 +6748,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6715,6 +6784,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6742,10 +6814,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6757,6 +6826,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7294,28 +7369,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7486,6 +7561,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7513,10 +7591,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7576,10 +7651,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7591,7 +7666,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7888,12 +7963,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7957,9 +8038,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -8017,6 +8095,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8434,19 +8515,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8683,6 +8773,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9178,10 +9271,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9199,10 +9292,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9226,7 +9319,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9274,13 +9370,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9322,9 +9418,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9430,7 +9523,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9445,24 +9538,24 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9502,7 +9595,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9643,10 +9736,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9673,7 +9766,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9721,6 +9814,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9748,16 +9844,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9772,6 +9868,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9799,6 +9898,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10171,6 +10273,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10228,6 +10333,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10822,9 +10930,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10909,9 +11014,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10972,9 +11074,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11218,6 +11317,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11263,6 +11365,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11278,10 +11386,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11377,15 +11482,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11479,18 +11593,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11617,15 +11725,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11635,6 +11758,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11671,10 +11800,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export full report as CSV"
+msgstr ""
+
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11872,6 +12004,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11917,13 +12052,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11980,9 +12115,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -12019,9 +12151,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12184,15 +12313,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12583,9 +12706,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12709,6 +12829,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12838,9 +12991,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -13006,6 +13156,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -13060,9 +13213,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -13105,6 +13255,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13390,6 +13543,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13534,9 +13690,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14761,6 +14914,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -15028,6 +15187,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -15148,6 +15310,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15190,9 +15358,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15226,6 +15400,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15244,6 +15421,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15268,6 +15448,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15277,6 +15460,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15592,9 +15778,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15748,12 +15931,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15763,9 +15940,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16519,7 +16693,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16564,15 +16738,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16858,6 +17032,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16963,6 +17140,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17299,9 +17479,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17362,9 +17539,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17392,16 +17566,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
+msgstr ""
+
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17566,9 +17743,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17581,9 +17755,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17779,12 +17950,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17800,9 +17965,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18757,12 +18919,18 @@ msgstr[2] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18802,9 +18970,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18949,6 +19114,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18970,6 +19138,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -19036,9 +19207,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19342,6 +19510,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19573,9 +19744,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19585,6 +19753,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19768,6 +19939,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19828,6 +20002,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19885,6 +20062,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20503,9 +20683,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20986,6 +21163,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -21025,6 +21205,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -21043,6 +21226,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -21055,6 +21241,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -21091,6 +21280,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21520,9 +21712,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21814,6 +22003,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22489,12 +22681,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22609,12 +22795,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "Hide comments"
msgstr ""
@@ -22762,12 +22942,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23392,6 +23584,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23452,6 +23647,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24274,6 +24472,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24391,7 +24595,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24424,9 +24628,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25504,6 +25705,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25861,9 +26065,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -26098,6 +26308,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -26116,6 +26329,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26281,6 +26497,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26443,6 +26662,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26506,9 +26731,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26728,6 +26950,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27373,9 +27598,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27523,7 +27745,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27589,6 +27811,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27781,6 +28006,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27814,6 +28042,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27871,6 +28102,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27895,9 +28129,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27997,7 +28228,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -28048,7 +28279,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -28075,7 +28306,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -28084,7 +28315,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -28120,7 +28351,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -28141,7 +28372,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -28162,12 +28396,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -28192,7 +28432,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28225,7 +28465,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28573,6 +28813,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28591,6 +28834,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28708,9 +28954,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28738,9 +28981,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28765,6 +29005,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28831,6 +29074,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28927,9 +29182,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28984,216 +29236,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -29203,24 +29284,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29608,6 +29677,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29644,6 +29716,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29704,9 +29779,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29884,6 +29956,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30634,12 +30712,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30778,9 +30850,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30823,6 +30892,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30967,9 +31039,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31270,6 +31339,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31375,18 +31447,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31561,6 +31639,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32239,6 +32320,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32761,6 +32848,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33331,9 +33430,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33535,6 +33631,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33544,6 +33649,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33601,9 +33709,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33790,9 +33895,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33904,6 +34006,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33955,9 +34060,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33976,7 +34078,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -34036,9 +34138,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -34105,6 +34213,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -34189,6 +34303,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34315,9 +34432,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34468,7 +34582,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34984,6 +35098,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -35023,6 +35140,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -35164,6 +35284,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35680,9 +35803,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -36220,18 +36340,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36415,9 +36523,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36439,9 +36544,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36478,10 +36580,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36964,6 +37063,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36979,6 +37081,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37765,9 +37870,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37840,6 +37942,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -38023,7 +38128,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -38035,7 +38140,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -38050,18 +38155,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38278,13 +38371,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38545,6 +38638,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38569,6 +38665,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38587,6 +38686,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38992,7 +39094,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39373,9 +39475,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39421,12 +39520,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39583,6 +39691,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39688,12 +39799,18 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39754,9 +39871,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39931,6 +40045,12 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -40184,7 +40304,10 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d 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] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40504,10 +40627,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40516,12 +40642,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40540,6 +40687,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40555,6 +40705,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40564,6 +40717,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40576,6 +40732,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40597,6 +40759,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40645,6 +40810,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -41098,7 +41266,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -41122,9 +41290,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -41209,9 +41374,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41326,6 +41488,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41449,6 +41614,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41491,7 +41659,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41635,6 +41803,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -42028,6 +42199,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -42208,7 +42382,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42271,10 +42445,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42421,6 +42601,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42451,6 +42634,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42460,6 +42646,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42469,6 +42661,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42496,6 +42691,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42805,6 +43006,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42889,7 +43099,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42898,9 +43108,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -43210,7 +43417,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43435,6 +43642,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -44005,6 +44215,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -44143,9 +44356,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44347,9 +44557,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44398,7 +44605,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44833,6 +45040,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -45061,10 +45274,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45328,7 +45541,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45415,6 +45628,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45589,9 +45817,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45847,9 +46072,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45928,13 +46150,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -46132,9 +46354,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -46150,9 +46378,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46279,6 +46504,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46507,6 +46735,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46717,6 +46948,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46858,6 +47092,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -47239,9 +47476,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47413,9 +47647,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47695,6 +47926,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47782,13 +48016,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47857,6 +48088,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47884,9 +48118,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47959,6 +48190,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47968,6 +48202,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -48139,9 +48379,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -48151,6 +48388,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -48199,12 +48439,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -48280,6 +48514,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48610,12 +48847,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48673,9 +48904,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48859,9 +49087,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48913,7 +49138,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48934,6 +49159,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48943,9 +49171,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -49225,7 +49450,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -49273,6 +49498,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49312,16 +49540,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49381,7 +49603,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49687,6 +49915,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49840,9 +50071,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49861,6 +50098,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49942,6 +50182,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -50191,7 +50434,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50317,7 +50560,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50332,9 +50575,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50416,12 +50656,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50449,9 +50683,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50506,9 +50737,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50527,6 +50755,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50539,9 +50770,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50896,6 +51124,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50950,6 +51181,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -51025,6 +51259,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -51082,9 +51319,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -51124,9 +51358,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -51145,9 +51376,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51535,6 +51763,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51853,6 +52084,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51949,6 +52183,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51973,9 +52210,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -52090,6 +52324,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -52168,6 +52408,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -52264,6 +52507,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52375,9 +52621,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52666,6 +52909,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -53107,6 +53353,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -53158,6 +53410,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -53218,7 +53476,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53380,10 +53638,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53680,7 +53941,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -54122,10 +54383,10 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "comment"
msgstr ""
@@ -54352,18 +54613,6 @@ msgstr[2] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54472,7 +54721,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54481,6 +54730,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54670,9 +54922,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54853,9 +55102,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54979,9 +55225,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -55045,16 +55288,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -55093,6 +55336,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -55126,9 +55375,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -55208,7 +55454,10 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "or"
msgstr ""
@@ -55543,6 +55792,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55600,9 +55852,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55729,9 +55978,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/sv_SE/gitlab.po b/locale/sv_SE/gitlab.po
index 9fc9c103e0f..16ba36d564c 100644
--- a/locale/sv_SE/gitlab.po
+++ b/locale/sv_SE/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: sv-SE\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:45\n"
+"PO-Revision-Date: 2023-07-11 04:48\n"
msgid " %{start} to %{end}"
msgstr "%{start} till %{end}"
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] "%d Godkännande"
msgstr[1] "%d Godkännanden"
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] "%d Modul"
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] "%d tilldelat ärende"
msgstr[1] "%d tilldelade ärenden"
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] "%d ändrad fil"
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] "%d kommentar till"
msgstr[1] "%d kommentarer till"
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] "%{count} projekt"
msgstr[1] "%{count} projekt"
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr "%{count} relaterade %{pluralized_subject}: %{links}"
-
msgid "%{count} selected"
msgstr "%{count} vald(a)"
@@ -703,6 +705,9 @@ msgstr "%{docs_link_start}Vad är Large File Storage?%{docs_link_end}"
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr "%{docs_link_start}Vad är tvåfaktorsautentisering?%{docs_link_end}"
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr "%{duration}ms"
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr "%{italic_start}Nyheter%{italic_end} är inaktivt och kan inte visas."
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr "%{itemsCount} ärenden med en gräns på %{maxIssueCount}"
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr "%{spanStart}på rad%{spanEnd} %{errorLine}%{errorColumn}"
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr "%{spanStart}i%{spanEnd} %{errorFn}"
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr "%{start} till %{end}"
@@ -1141,8 +1158,8 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
-msgstr "%{strongOpen}Varning:%{strongClose} SAML-grupplänkar kan få GitLab att automatiskt ta bort medlemmar från grupper."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
+msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
msgid_plural "%{strongStart}%{count}%{strongEnd} commits"
@@ -1263,9 +1280,6 @@ msgstr "%{type} stöder endast %{name} namn"
msgid "%{url} (optional)"
msgstr "%{url} (valfritt)"
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr "%{userName}s avatar"
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr "Är du säker?"
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr "De är det enda accepterade lösenordet när du har aktiverat tvåfaktorsautentisering (2FA)."
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr "Du kan också använda personliga åtkomstnycklar för att autentisera mot Git över HTTP."
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr "Läs mer."
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr "Lägg till wiki"
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr "Tillagd i denna version"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr "Importera källor"
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator email"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr "Data"
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr "Redigera"
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Filter by audit event type"
+msgstr ""
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export full report as CSV"
+msgstr ""
+
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,8 +44335,8 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
-msgstr "Genomstruken"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
+msgstr ""
msgid "Strikethrough text"
msgstr ""
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr "Titel:"
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr "Till"
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr "Imorgon"
@@ -47998,6 +48231,9 @@ msgstr "Ämnen"
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr "Totalt"
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr "URL"
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr "URL är ogiltig"
-
msgid "URL is required"
msgstr "En URL krävs"
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr "Missnöjd?"
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr "Verifiera kod"
-msgid "Verify configuration"
-msgstr "Verifiera konfiguration"
-
msgid "Version"
msgstr "Version"
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] "Visa diagram"
-msgstr[1] "Visa diagram"
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr "Visa fil @ "
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr "Visa sida @ "
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr "Visa ersatt fil @ "
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr "kommentar"
@@ -54041,18 +54301,6 @@ msgstr[1] "filer"
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr "för %{link_to_pipeline_ref}"
-
-msgid "for %{ref}"
-msgstr "för %{ref}"
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr "i"
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr "i grupp %{link_to_group}"
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr "ladda det ändå"
msgid "loading"
msgstr "laddar"
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr "öppna ärende"
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr "eller"
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr "rätt format."
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr "uppdaterad"
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr "dina inställningar"
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/sw_KE/gitlab.po b/locale/sw_KE/gitlab.po
index 2d9eaa47f8e..4aa4c33c06a 100644
--- a/locale/sw_KE/gitlab.po
+++ b/locale/sw_KE/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: sw\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:48\n"
+"PO-Revision-Date: 2023-07-11 04:50\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/ta_IN/gitlab.po b/locale/ta_IN/gitlab.po
index 9da82749e54..729561fcc7a 100644
--- a/locale/ta_IN/gitlab.po
+++ b/locale/ta_IN/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ta\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:46\n"
+"PO-Revision-Date: 2023-07-11 04:49\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/th_TH/gitlab.po b/locale/th_TH/gitlab.po
index ccfe47a3d81..552e02206c2 100644
--- a/locale/th_TH/gitlab.po
+++ b/locale/th_TH/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: th\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:46\n"
+"PO-Revision-Date: 2023-07-11 04:49\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -95,6 +95,14 @@ msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -155,6 +163,10 @@ msgid "%d assigned issue"
msgid_plural "%d assigned issues"
msgstr[0] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -299,14 +311,6 @@ msgid "%d more comment"
msgid_plural "%d more comments"
msgstr[0] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -562,9 +566,6 @@ msgid "%{count} project"
msgid_plural "%{count} projects"
msgstr[0] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -607,6 +608,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -679,7 +683,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -703,6 +710,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1009,6 +1019,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1036,7 +1052,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1148,9 +1164,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1805,6 +1818,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2258,6 +2277,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2276,12 +2298,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2300,6 +2328,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2309,6 +2346,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2360,13 +2400,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2477,9 +2517,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2528,6 +2565,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2783,6 +2823,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2804,9 +2847,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3230,22 +3270,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3329,6 +3360,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3398,9 +3432,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3410,9 +3441,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3443,10 +3471,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3455,9 +3483,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3680,9 +3705,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3728,6 +3750,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3767,7 +3792,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4037,9 +4062,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4076,7 +4098,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4181,10 +4203,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4295,9 +4317,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4334,9 +4353,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4433,6 +4449,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4598,6 +4617,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4649,12 +4671,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4697,6 +4713,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4856,9 +4878,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -4974,9 +4993,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5062,7 +5078,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5128,12 +5144,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5143,7 +5168,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5182,6 +5207,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5194,6 +5231,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5212,6 +5252,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5236,6 +5282,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6012,9 +6061,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6095,6 +6141,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6149,7 +6198,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6207,9 +6256,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6347,16 +6393,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6368,19 +6420,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Filter by audit event type"
+msgstr ""
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6389,6 +6456,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6416,10 +6486,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6431,6 +6498,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -6968,28 +7041,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7160,6 +7233,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7187,10 +7263,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7250,10 +7323,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7265,7 +7338,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7556,12 +7629,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7623,9 +7702,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7683,6 +7759,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8100,19 +8179,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8349,6 +8437,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -8842,10 +8933,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -8863,10 +8954,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -8890,7 +8981,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -8938,13 +9032,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -8986,9 +9080,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9094,7 +9185,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9107,22 +9198,22 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9162,7 +9253,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9303,10 +9394,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9333,7 +9424,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9381,6 +9472,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9408,16 +9502,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9432,6 +9526,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9459,6 +9556,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -9829,6 +9929,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -9886,6 +9989,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10478,9 +10584,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10565,9 +10668,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10628,9 +10728,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -10874,6 +10971,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -10919,6 +11019,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -10934,10 +11040,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11033,15 +11136,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11133,18 +11245,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11271,15 +11377,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11289,6 +11410,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11325,10 +11452,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export full report as CSV"
+msgstr ""
+
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11526,6 +11656,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11571,13 +11704,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11634,9 +11767,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11673,9 +11803,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -11838,15 +11965,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12231,9 +12352,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12357,6 +12475,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12486,9 +12637,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12654,6 +12802,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12708,9 +12859,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12753,6 +12901,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13038,6 +13189,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13182,9 +13336,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14403,6 +14554,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14666,6 +14823,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14778,6 +14938,12 @@ msgid "Dependencies|%d vulnerability detected"
msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -14820,9 +14986,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -14856,6 +15028,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -14874,6 +15049,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -14898,6 +15076,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -14907,6 +15088,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15216,9 +15400,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15370,12 +15551,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15385,9 +15560,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16131,7 +16303,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16176,15 +16348,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16470,6 +16642,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16575,6 +16750,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -16911,9 +17089,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -16974,9 +17149,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17004,16 +17176,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
+msgstr ""
+
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17178,9 +17353,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17193,9 +17365,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17391,12 +17560,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17412,9 +17575,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18365,12 +18525,18 @@ msgstr[0] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18408,9 +18574,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18555,6 +18718,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18576,6 +18742,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18642,9 +18811,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -18946,6 +19112,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19177,9 +19346,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19189,6 +19355,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19370,6 +19539,9 @@ msgid "Free groups are limited to %{free_user_limit} member and the remaining me
msgid_plural "Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group."
msgstr[0] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19430,6 +19602,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19487,6 +19662,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20101,9 +20279,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20584,6 +20759,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20623,6 +20801,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20641,6 +20822,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20653,6 +20837,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20689,6 +20876,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21118,9 +21308,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21412,6 +21599,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22083,12 +22273,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22203,10 +22387,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-
msgid "Hide comments"
msgstr ""
@@ -22352,12 +22532,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -22978,6 +23170,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23036,6 +23231,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -23858,6 +24056,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -23975,7 +24179,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24008,9 +24212,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25084,6 +25285,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25441,9 +25645,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25678,6 +25888,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25696,6 +25909,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -25861,6 +26077,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26023,6 +26242,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26086,9 +26311,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26304,6 +26526,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -26935,9 +27160,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27085,7 +27307,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27151,6 +27373,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27343,6 +27568,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27376,6 +27604,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27433,6 +27664,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27457,9 +27691,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27559,7 +27790,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27610,7 +27841,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27637,7 +27868,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27646,7 +27877,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27682,7 +27913,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27703,7 +27934,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27724,12 +27958,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27754,7 +27994,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -27787,7 +28027,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28129,6 +28369,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28147,6 +28390,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28264,9 +28510,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28294,9 +28537,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28321,6 +28561,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28387,6 +28630,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28483,9 +28738,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28540,214 +28792,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28757,24 +28840,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29160,6 +29231,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29196,6 +29270,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29256,9 +29333,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29436,6 +29510,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30182,12 +30262,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30326,9 +30400,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30371,6 +30442,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30513,9 +30587,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -30808,6 +30879,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -30913,18 +30987,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31099,6 +31179,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -31773,6 +31856,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32293,6 +32382,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -32863,9 +32964,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33067,6 +33165,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33076,6 +33183,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33133,9 +33243,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33322,9 +33429,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33436,6 +33540,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33487,9 +33594,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33508,7 +33612,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33568,9 +33672,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33637,6 +33747,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33721,6 +33837,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -33847,9 +33966,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34000,7 +34116,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34516,6 +34632,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34555,6 +34674,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34696,6 +34818,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35212,9 +35337,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35752,18 +35874,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -35947,9 +36057,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -35971,9 +36078,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36010,10 +36114,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36496,6 +36597,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36511,6 +36615,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37293,9 +37400,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37368,6 +37472,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37549,7 +37656,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37561,7 +37668,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37576,18 +37683,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -37802,13 +37897,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38069,6 +38164,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38093,6 +38191,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38111,6 +38212,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38504,7 +38608,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -38877,9 +38981,6 @@ msgid "Reviewer"
msgid_plural "%d Reviewers"
msgstr[0] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -38925,12 +39026,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39079,6 +39189,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39184,10 +39297,16 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39248,9 +39367,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39423,6 +39539,10 @@ msgid "Runners|Permanently delete %d runner"
msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39676,7 +39796,8 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d 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] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -39994,10 +40115,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40006,12 +40130,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40030,6 +40175,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40045,6 +40193,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40054,6 +40205,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40066,6 +40220,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40087,6 +40247,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40135,6 +40298,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40566,7 +40732,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40590,9 +40756,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40677,9 +40840,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -40794,6 +40954,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -40917,6 +41080,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -40959,7 +41125,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41101,6 +41267,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41494,6 +41663,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41674,7 +41846,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -41737,10 +41909,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -41887,6 +42065,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -41917,6 +42098,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -41926,6 +42110,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -41935,6 +42125,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -41962,6 +42155,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42269,6 +42468,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42353,7 +42561,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42362,9 +42570,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42672,7 +42877,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -42897,6 +43102,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43467,6 +43675,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43605,9 +43816,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -43809,9 +44017,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -43860,7 +44065,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44295,6 +44500,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44521,10 +44732,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -44788,7 +44999,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -44873,6 +45084,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45043,9 +45269,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45295,9 +45518,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45376,13 +45596,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45576,9 +45796,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45594,9 +45820,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -45723,6 +45946,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -45951,6 +46177,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46161,6 +46390,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46302,6 +46534,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46683,9 +46918,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -46857,9 +47089,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47139,6 +47368,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47222,13 +47454,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47297,6 +47526,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47324,9 +47556,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47397,6 +47626,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47406,6 +47638,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47577,9 +47815,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47589,6 +47824,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47637,12 +47875,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47716,6 +47948,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48044,12 +48279,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48107,9 +48336,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48293,9 +48519,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48347,7 +48570,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48368,6 +48591,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48377,9 +48603,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48659,7 +48882,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48707,6 +48930,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -48746,16 +48972,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -48815,7 +49035,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49119,6 +49345,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49272,9 +49501,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49293,6 +49528,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49374,6 +49612,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49623,7 +49864,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -49749,7 +49990,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -49764,9 +50005,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -49848,10 +50086,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -49877,9 +50111,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -49934,9 +50165,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -49953,6 +50181,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -49965,9 +50196,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50322,6 +50550,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50376,6 +50607,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50451,6 +50685,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50508,9 +50745,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50550,9 +50784,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50571,9 +50802,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -50961,6 +51189,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51273,6 +51504,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51367,6 +51601,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51391,9 +51628,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51508,6 +51742,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51586,6 +51826,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51682,6 +51925,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -51791,9 +52037,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52082,6 +52325,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52519,6 +52765,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52570,6 +52822,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52630,7 +52888,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -52788,10 +53046,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53082,7 +53343,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53508,10 +53769,8 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
msgid "comment"
msgstr ""
@@ -53730,18 +53989,6 @@ msgstr[0] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -53846,7 +54093,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -53855,6 +54102,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54038,9 +54288,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54217,9 +54464,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54339,9 +54583,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54405,16 +54646,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54453,6 +54694,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54486,9 +54733,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54568,7 +54812,8 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
msgid "or"
msgstr ""
@@ -54889,6 +55134,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -54946,9 +55194,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55071,9 +55316,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/tr_TR/gitlab.po b/locale/tr_TR/gitlab.po
index cda9d60a9ce..682409fb183 100644
--- a/locale/tr_TR/gitlab.po
+++ b/locale/tr_TR/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: tr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:45\n"
+"PO-Revision-Date: 2023-07-11 04:48\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] "%d Onay"
msgstr[1] "%d Onay"
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] "%d dosya deÄŸiÅŸtirildi"
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] "%d yorum daha"
msgstr[1] "%d yorum daha"
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr "%{duration}ms"
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr "%{start} - %{end}"
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr "%{userName} (birleÅŸtiremez)"
-
msgid "%{userName}'s avatar"
msgstr "%{userName} kullanıcısının profil resmi"
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr "Erişim Anahtarları"
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr "Emin misiniz?"
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr "OluÅŸturulan"
msgid "AccessTokens|Feed token"
msgstr "Besleme erişim anahtarı"
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr "Gelen e-posta erişim anahtarı"
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr "Kişisel Erişim Anahtarları"
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr "Statik nesne erişim anahtarı"
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr "Bunlar yalnızca İki Adımlı Kimlik Doğrulama (2FA) özelliğini etkinleştirdiğinizde, kabul edilen şifredir."
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr "Git üzerinden HTTP üzerinden kimlik doğrulaması yapmak için kişisel erişim anahtarlarını da kullanabilirsiniz."
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr "Zoom toplantısı ekle"
-msgid "Add a %{type}"
-msgstr "Bir %{type} ekle"
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr "Yeni sorun ekle"
msgid "Add a numbered list"
msgstr "Numaralı liste ekle"
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr "Bu sürümde eklendi"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr "GitLab örneğinizde yeni uygulamalar eklemek devre dışı bırakıldı. İzin almak için lütfen GitLab yöneticinize başvurun"
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr "Adres"
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr "Koltuğu kullanıyor"
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr "Bu sensin!"
@@ -3870,6 +3893,9 @@ msgstr "Kişisel projeler, grup ve kullanıcı geçmişi bozulmadan bırakılaca
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr "Sıralama"
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr "Başarılı bir şifre güncellemesinden sonra giriş ekranına yönlendirileceksiniz."
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr "Başarılı bir şifre güncellemesinden sonra, yeni şifrenizle giriş yapabileceğiniz giriş sayfasına yönlendirileceksiniz."
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr "Uyarı"
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr "Uyarı görüntülenirken bir hata oluştu. Lütfen tekrar denemek için
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr "Bütün dallar"
msgid "All changes are committed"
msgstr "Tüm değişiklikler işlendi"
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr "Bir hata oluÅŸtu"
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr "Konuya taslak eklenirken bir hata oluÅŸtu."
-
-msgid "An error occurred adding a new draft."
-msgstr "Yeni taslak eklenirken bir hata oluÅŸtu."
-
msgid "An error occurred creating the new branch."
msgstr "Yeni dal oluÅŸturulurken bir hata oluÅŸtu."
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr "Veriler yüklenirken bir hata oluştu. Lütfen tekrar deneyin."
-
msgid "An error occurred while loading the file"
msgstr "Dosya yüklenirken bir hata oluştu"
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr "Yorum güncellenirken bir hata oluştu"
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr "Analizler"
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr "Anonim"
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr "Grafikleri düzenle"
-
msgid "Artifact"
msgstr "Artifact"
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr "Atananın izni yok"
msgid "Assignee lists not available with your current license"
msgstr "Atanan listeleri mevcut lisansınızla birlikte kullanılamıyor"
-msgid "Assignee(s)"
-msgstr "Vekil(ler)"
-
msgid "Assignees"
msgstr "Atananlar"
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Filter by audit event type"
+msgstr ""
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr "AÄŸustos"
@@ -7131,28 +7205,28 @@ msgstr "Fatura"
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr "Bu grup, üst grup ile ilişkili planı kullanır."
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr "GeniÅŸlet"
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,11 +9102,11 @@ msgstr ""
msgid "Change assignee"
msgstr "Vekil deÄŸiÅŸtir"
-msgid "Change assignee(s)"
-msgstr "Vekil(ler)i deÄŸiÅŸtir"
+msgid "Change assignees"
+msgstr ""
-msgid "Change assignee(s)."
-msgstr "Vekil(ler)i deÄŸiÅŸtir."
+msgid "Change assignees."
+msgstr ""
msgid "Change branches"
msgstr "Dalları değiştir"
@@ -9031,10 +9123,10 @@ msgstr "Dönüm noktasını değiştir"
msgid "Change path"
msgstr "Yolu deÄŸiÅŸtir"
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,8 +9150,11 @@ msgstr ""
msgid "Change your password"
msgstr "Åžifrenizi deÄŸiÅŸtirin"
-msgid "Change your password or recover your current one"
-msgstr "Şifrenizi değiştirin veya mevcut şifrenizi kurtarın"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
+msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
msgstr ""
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
-msgstr "Vekil(ler) deÄŸiÅŸtirildi."
+msgid "Changed assignees."
+msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr "Sohbet"
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr "%{selectedPlanText} planı"
@@ -9332,7 +9424,7 @@ msgstr "Åžehir"
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr "ÅŸirket veya ekip"
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr "Bir tür seç..."
msgid "Choose file…"
msgstr "Dosya seçin…"
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr "Kapat"
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr "%{quick_action_target} bunu kapatır."
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr "Amazon EKS"
@@ -10737,9 +10841,6 @@ msgstr "Biliyor muydunuz?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr "GitLab'ın Kubernetes kümeniz ile olan bağlantısını etkinleştirin veya devre dışı bırakın."
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr "Kubernetes kümesi oluşturuluyor..."
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr "Ä°ÅŸlem silindi"
msgid "Commit message"
msgstr "İşlem mesajı"
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr "%{ref} %{start_time} -%{end_time} için işlem istatistikleri"
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr "Ä°ÅŸlem"
@@ -11444,15 +11551,30 @@ msgstr "Karşılaştırılacak bir şey bulunamadı."
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr "Git revizyonuna göre filtrele"
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export full report as CSV"
+msgstr ""
+
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr "Bağlanıyor…"
-msgid "Connection failed"
-msgstr "Bağlantı başarısız oldu"
-
msgid "Connection failure"
msgstr "Bağlantı başarısız"
-msgid "Connection timed out"
-msgstr "Bağlantı zaman aşımına uğradı"
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr "Bağlantıyı kopyala"
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr "Bağlantıyı grafiğe kopyala"
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr "Grup geri yüklenemedi"
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr "Yeni bir dal oluÅŸtur"
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr "Yeni bir sorun oluÅŸtur"
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr "OluÅŸturuluyor"
msgid "Creating epic"
msgstr "Epik oluÅŸturuluyor"
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr "DeÄŸiÅŸkeni sil"
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr "başarılı"
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr "Etiket önceliğini azalt"
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr "Açıklama"
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr "CSV olarak indir"
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr "Kodları indir"
@@ -16664,6 +16837,9 @@ msgstr "Genel dağıtım anahtarını düzenle"
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr "Görünen e-posta adı"
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr "Ä°ÅŸ"
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr "Yeni ortam"
-msgid "Environments|No deployed environments"
-msgstr "Dağıtılmış ortam yok"
-
msgid "Environments|No deployments yet"
msgstr "Henüz dağıtım yok"
@@ -17585,12 +17755,6 @@ msgstr "Epikler, proje portföyünüzü daha verimli ve daha az çaba ile yönet
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr "Yeni epik ekle"
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr "EpiÄŸi sil"
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr "Yeni ayarlar kaydedilemedi"
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr "Özellik Bayrakları"
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr "Performans izlemeye başlayın"
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr "ArÅŸivlenmiÅŸ projeleri gizle"
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr "Temizlik hizmeti"
msgid "Housekeeping successfully started"
msgstr "Temizlik hizmeti başarıyla başlatıldı"
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr "Bu sensin"
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr "İş Başarısız #%{build_id}"
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr "Son EriÅŸim Tarihi"
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,8 +27526,8 @@ msgstr ""
msgid "Loading snippet"
msgstr "Kod parçacığı yükleniyor"
-msgid "Loading the GitLab IDE..."
-msgstr "GitLab IDE yükleniyor..."
+msgid "Loading the GitLab IDE"
+msgstr ""
msgid "Loading, please wait."
msgstr ""
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr "Tartışma kilitlendi."
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr "Tartışmayı kilitler."
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr "Mar"
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,8 +28060,8 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
-msgstr "En yüksek ek boyutu (MB)"
+msgid "Maximum attachment size (MiB)"
+msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
msgstr ""
@@ -27856,7 +28087,7 @@ msgstr "Maksimum gecikme (dakika)"
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,8 +28132,8 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
-msgstr "Maksimum içe aktarma boyutu (MB)"
+msgid "Maximum import size (MiB)"
+msgstr ""
msgid "Maximum job artifact size"
msgstr ""
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr "Maksimum içe aktarılan dosya boyutu."
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr "Birleştirme isteği onayları"
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr "Taslak yorum kaydedilirken bir hata oluÅŸtu."
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr "Yorum kaydedilemedi"
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr "Dosyayı göster @ %{commitId}"
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr "Değiştirilen @ %{commitId} dosyasını görüntüle"
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr "%{commitLink} işlemine yorum yapıldı"
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr "Metrikler"
-
msgid "Metrics - Grafana"
msgstr "Metrikler - Grafana"
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr "Metrik ekle"
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr "Metrik oluÅŸtur"
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr "Dağıtım bilgisi alınırken bir hata oluştu."
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr "Birim etiketi"
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr "Grafik için başlık olarak kullanılır"
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr "Y ekseni etiketi"
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr "ör. HTTP istekleri"
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr "Kapat"
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr "Daha fazla bilgi"
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr "Kredi kartı gerektirmez."
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr "Depo bulunamadı"
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
+msgstr ""
+
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr "İş Hattı Zamanlamaları"
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr "Etkin"
msgid "PipelineSchedules|All"
msgstr "Tümü"
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,8 +34349,8 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
-msgstr "Lütfen devam etmek için %{phrase_code} yazın ya da iptal etmek için bu pencereyi kapatın."
+msgid "Please type %{phrase_code} to proceed."
+msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
msgstr ""
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr "-"
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr "Proje üyeleri"
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr "Sorunlar"
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr "Grup etiketini tanıtın"
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr "Sorun bir epiğe yükseltildi."
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
-msgstr "Tümünü veya özel vekil(ler)i kaldır"
+msgid "Remove all or specific assignees"
+msgstr ""
msgid "Remove all or specific label(s)"
msgstr "Tüm veya belirli etiketleri kaldır"
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr "Bu %{quick_action_target} yeniden açıldı."
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr "Tüm etiketleri değiştir"
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr "Rol"
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr "Projeleri seç"
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr "Bilinmeyen"
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr "Dal/etiketi deÄŸiÅŸtir"
msgid "Switch to GitLab Next"
msgstr "GitLab Next'e geçin"
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr "korumalı"
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr "ÅŸimdi"
msgid "Timeago|right now"
msgstr "hemen ÅŸimdi"
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr "Ait olduğunuz bir grubun proje başına bildirim seviyesini belirlemek
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr "Kenar çubuğunu aç/kapat"
msgid "Toggle backtrace"
msgstr "Geri izlemeyi aç/kapat"
-msgid "Toggle collapse"
-msgstr "Daraltmayı aç/kapat"
-
msgid "Toggle comments for this file"
msgstr "Bu dosya için yorumları aç/kapat"
@@ -47870,6 +48106,9 @@ msgstr "İşlem açıklamasını aç/kapat"
msgid "Toggle commit list"
msgstr "İşlem listesini aç/kapat"
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr "İfade ödülünü aç/kapat"
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr "Yarın"
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr "Kilidi aç"
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr "Kilitli"
msgid "Unlocked the discussion."
msgstr "Tartışmanın kilidi açıldı."
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr "İş hatları"
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr "Etkinlik"
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr "Katıldığı projeler"
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr "Profili düzenle"
@@ -49658,6 +49897,9 @@ msgstr "Bu kullanıcı diğer kullanıcıları takip etmiyor."
msgid "UserProfile|Unconfirmed user"
msgstr "Onaylanmamış kullanıcı"
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr "Sürüm"
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] "Çizelgeyi görüntüle"
-msgstr[1] "Çizelgeleri görüntüle"
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr "Dosyayı görüntüle @ "
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr "Açık birleştirme isteğini görüntüle"
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr "Değiştirilen @ dosyayı görüntüle "
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr "Erişim İsteğini Geri Çek"
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr "Bu salt okunur GitLab örneğine yazamazsınız."
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] "dosya"
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] "örnek tamamlandı"
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr "%{path_lock_user_name} tarafından kilitlendi %{created_at}"
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr "Birleştirme başarısız."
msgid "mrWidget|Merged by"
msgstr "BirleÅŸtiren:"
-msgid "mrWidget|More information"
-msgstr "Daha fazla bilgi"
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr "veya"
@@ -55216,6 +55463,9 @@ msgstr "etiket adı"
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr "güncellendi"
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/uk/gitlab.po b/locale/uk/gitlab.po
index b29cac522a1..81c5dfbe24c 100644
--- a/locale/uk/gitlab.po
+++ b/locale/uk/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: uk\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:46\n"
+"PO-Revision-Date: 2023-07-11 04:48\n"
msgid " %{start} to %{end}"
msgstr " %{start} до %{end}"
@@ -107,6 +107,20 @@ msgstr[1] "%d ЗатвердженнÑ"
msgstr[2] "%d Затверджень"
msgstr[3] "%d Затверджень"
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] "%d Модуль"
@@ -212,6 +226,13 @@ msgstr[1] "%d призначені задачі"
msgstr[2] "%d призначених задач"
msgstr[3] "%d призначених задач"
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] "%d змінений файл"
@@ -464,20 +485,6 @@ msgstr[1] "ще %d коментарі"
msgstr[2] "ще %d коментарів"
msgstr[3] "ще %d коментарів"
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] "%d пакет"
@@ -850,9 +857,6 @@ msgstr[1] "%{count} проєкти"
msgstr[2] "%{count} проєктів"
msgstr[3] "%{count} проєктів"
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr "%{count} пов’Ñзаних %{pluralized_subject}: %{links}"
-
msgid "%{count} selected"
msgstr "Вибрано: %{count}"
@@ -895,6 +899,9 @@ msgstr "%{docs_link_start}Що таке Ñховище великих файлі
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr "%{docs_link_start} Що таке Двофакторна автентифікаціÑ?%{docs_link_end}"
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr "%{duration}мÑ"
@@ -967,8 +974,11 @@ msgstr "%{human_readable_key} менше ніж %{min_value_length} Ñимвол
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr "%{integrations_link_start}Інтеграції%{link_end} дозволÑÑŽÑ‚ÑŒ зробити Ñторонні програми чаÑтиною вашого робочого процеÑу GitLab. Якщо наÑвні інтеграції не відповідають Вашим потребам, розглÑньте можливіÑÑ‚ÑŒ викориÑÑ‚Ð°Ð½Ð½Ñ %{webhooks_link_start}вебхуків (webhooks)%{link_end}."
-msgid "%{issuableDisplayName} %{lockStatus}."
-msgstr "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
+msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} буде видалено! Ви впевнені?"
@@ -991,6 +1001,9 @@ msgstr "%{italic_start}Що нового%{italic_end} неактивний і н
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr "%{itemsCount} задач з обмеженнÑм %{maxIssueCount}"
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1324,6 +1337,12 @@ msgstr "%{spanStart}в Ñ€Ñдку%{spanEnd} %{errorLine}%{errorColumn}"
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr "%{spanStart}в%{spanEnd} %{errorFn}"
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr "%{start} до %{end}"
@@ -1351,8 +1370,8 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
-msgstr "%{strongOpen}ПопередженнÑ:%{strongClose} поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð³Ñ€ÑƒÐ¿Ð¸ SAML може Ñпричинити автоматичне Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ ÑƒÑ‡Ð°Ñників із груп."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
+msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
msgid_plural "%{strongStart}%{count}%{strongEnd} commits"
@@ -1493,9 +1512,6 @@ msgstr "%{type} підтримує лише %{name} ім'Ñ"
msgid "%{url} (optional)"
msgstr "%{url} (необов'Ñзково)"
-msgid "%{userName} (cannot merge)"
-msgstr "%{userName} (не може виконувати злиттÑ)"
-
msgid "%{userName}'s avatar"
msgstr "%{userName} аватар"
@@ -2211,7 +2227,7 @@ msgid "AI|Enabling these features is your acceptance of the %{link_start}GitLab
msgstr ""
msgid "AI|Experiment"
-msgstr ""
+msgstr "ЕкÑперимент"
msgid "AI|Experiment features"
msgstr ""
@@ -2231,6 +2247,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2684,6 +2706,9 @@ msgstr "Токени доÑтупу"
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr "Ви впевнені?"
@@ -2702,12 +2727,18 @@ msgstr "Скопіювати токен Ð´Ð»Ñ Ð²Ñ…Ñ–Ð´Ð½Ð¸Ñ… повідомле
msgid "AccessTokens|Copy static object token"
msgstr "Скопіювати токен Ñтатичних об’єктів"
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr "Створено"
msgid "AccessTokens|Feed token"
msgstr "Токен доÑтупу до каналів"
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr "Токен Ð´Ð»Ñ Ð²Ñ…Ñ–Ð´Ð½Ð¸Ñ… повідомлень електронної пошти"
@@ -2726,6 +2757,15 @@ msgstr "Зберігайте цей токен в Ñекреті. Будь-Ñ…Ñ‚Ð
msgid "AccessTokens|Personal Access Tokens"
msgstr "ОÑобиÑÑ‚Ñ– токени доÑтупу"
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr "Токен Ñтатичних об’єктів"
@@ -2735,6 +2775,9 @@ msgstr "ОÑтанній раз був викориÑтаний токен"
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr "Вони Ñ” єдиними актуальними паролÑми, коли увімкнено двофакторну автентифікцію (2FA)."
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr "Ви також можете викориÑтовувати перÑональні токени доÑтупу Ð´Ð»Ñ Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— в Git через HTTP."
@@ -2786,13 +2829,13 @@ msgstr "Виправте Ñвої конвеєри, підтвердивши ÑÐ
msgid "AccountValidation|I'll bring my own runners"
msgstr "Я зареєÑтрую мої влаÑні раннери"
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr "ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ."
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2903,9 +2946,6 @@ msgstr "Додати Вікі"
msgid "Add Zoom meeting"
msgstr "Додати Zoom-зуÑтріч"
-msgid "Add a %{type}"
-msgstr "Додати %{type}"
-
msgid "Add a GCP region"
msgstr "Додати регіон GCP"
@@ -2954,6 +2994,9 @@ msgstr "Додати нову задачу"
msgid "Add a numbered list"
msgstr "Додати нумерований ÑпиÑок"
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr "Додати пов’Ñзаний епік"
@@ -3209,6 +3252,9 @@ msgstr "Додано в цій верÑÑ–Ñ—"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr "Ð”Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð½Ð¾Ð²Ð¸Ñ… проєктів Ð´Ð»Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ інÑтанÑу GitLab заборонено. ЗвернітьÑÑ Ð´Ð¾ Ñвого адмініÑтратора GitLab, щоб отримати дозвіл"
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr "Додаткові формати діаграм"
@@ -3230,9 +3276,6 @@ msgstr "Додатковий текÑÑ‚, що відображаєтьÑÑ Ð½Ð°
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr "ÐдреÑа"
@@ -3656,24 +3699,15 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr "Імпорт джерел"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
+msgstr ""
+
msgid "AdminSettings|Inactive project deletion"
msgstr "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð½ÐµÐ°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð³Ð¾ проєкту"
msgid "AdminSettings|Instance runners expiration"
msgstr "Термін дії групових раннерів"
-msgid "AdminSettings|Jitsu administrator email"
-msgstr "Електронна пошта адмініÑтратора Jitsu"
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr "Пароль адмініÑтратора Jitsu"
-
-msgid "AdminSettings|Jitsu host"
-msgstr "ХоÑÑ‚ Jitsu"
-
-msgid "AdminSettings|Jitsu project ID"
-msgstr "ID проєкту в Jitsu"
-
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
msgstr "Зберегти оÑтанні артефакти Ð´Ð»Ñ Ð²ÑÑ–Ñ… завдань в оÑтанніх уÑпішних конвеєрах"
@@ -3755,6 +3789,9 @@ msgstr "ЗахиÑтити змінні CI/CD за замовчуваннÑм"
msgid "AdminSettings|Registration Features include:"
msgstr "РеєÑтраційні функції включають:"
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr "Вимагати від кориÑтувачів Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð°Ð²Ð° влаÑноÑÑ‚Ñ– на влаÑні домени"
@@ -3824,9 +3861,6 @@ msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð°Ñ” бути більше 0."
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr "Розмір Ñ– параметри Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾Ð¼ÐµÐ½Ñƒ Ð´Ð»Ñ Ñтатичних Ñайтів Сторінок."
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3836,9 +3870,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr "Домен за замовчуваннÑм, Ñкий викориÑтовуєтьÑÑ Ð´Ð»Ñ ÐµÑ‚Ð°Ð¿Ñ–Ð² автоперевірки заÑтоÑунків Ñ– автоматичного Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð² уÑÑ–Ñ… проєктах."
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3869,10 +3900,10 @@ msgstr "Загальна кількіÑÑ‚ÑŒ завдань у поточних Ð
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr "ВикориÑтовуйте Ñлужбу AWS OpenSearch з обліковими даними IAM"
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3881,9 +3912,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr "КориÑтувачі та групи повинні прийнÑти Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ Ð´Ð¾ того, Ñк вони додадутьÑÑ Ð´Ð¾ групи або проєкту."
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -4106,9 +4134,6 @@ msgstr "Важлива Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ викориÑÑ‚Ð°Ð½Ð½Ñ Ð²Ð°
msgid "AdminUsers|Is using seat"
msgstr "ВикориÑтовує міÑце"
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr "Це ви!"
@@ -4154,6 +4179,9 @@ msgstr "ПерÑональні проєкти, групи, та Ñ–Ñторію Ð
msgid "AdminUsers|Private profile"
msgstr "Приватний профіль"
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr "Повторна Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ ÐºÐ¾Ñ€Ð¸Ñтувача зробить:"
@@ -4193,7 +4221,7 @@ msgstr "Skype"
msgid "AdminUsers|Sort by"
msgstr "Сортувати за"
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4463,9 +4491,6 @@ msgstr "Ви викориÑтовуєте заÑтарілі відображеÐ
msgid "After a successful password update you will be redirected to login screen."
msgstr "ПіÑÐ»Ñ ÑƒÑпішного Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð²Ð¸ перейдете на екран входу."
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr "ПіÑÐ»Ñ ÑƒÑпішного Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»ÑŽ ви будете перенаправлені на Ñторінку входу, де ви зможете увійти з новим паролем."
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4502,8 +4527,8 @@ msgstr "Канал активноÑÑ‚Ñ–"
msgid "AlertManagement|Alert"
msgstr "ПопередженнÑ"
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
-msgstr "Одержувач(-и) попередженнÑ: %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
+msgstr ""
msgid "AlertManagement|Alert detail"
msgstr "Деталі попередженнÑ"
@@ -4607,10 +4632,10 @@ msgstr "Під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ ÑталаÑ
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4721,9 +4746,6 @@ msgstr "Продовжити редагуваннÑ"
msgid "AlertSettings|Prometheus"
msgstr "Prometheus"
-msgid "AlertSettings|Prometheus API base URL"
-msgstr "ОÑновна URL-адреÑа API Prometheus"
-
msgid "AlertSettings|Reset Key"
msgstr "Скинути ключ"
@@ -4760,9 +4782,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4859,6 +4878,9 @@ msgstr "Ð’ÑÑ– гілки"
msgid "All changes are committed"
msgstr "Ð’ÑÑ– зміни закомічені"
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr "УÑÑ– дозволені кориÑтувачі"
@@ -5024,6 +5046,9 @@ msgstr "Також видаліть прÑме членÑтво кориÑтув
msgid "Also unassign this user from related issues and merge requests"
msgstr "Також ÑкаÑуйте Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ кориÑтувача з пов’Ñзаних задачами та запитами на злиттÑ"
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr "Ðльтернативна URL-адреÑа Ñлужби підтримки Ð´Ð»Ñ Ñторінки довідки та випадаючого ÑпиÑку."
@@ -5075,12 +5100,6 @@ msgstr "ТрапилаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°"
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr "Помилка у звіті, в Ñкому результат теÑту вказує на наÑвніÑÑ‚ÑŒ вразливоÑÑ‚Ñ– в ÑиÑтемі, коли не приÑутні вразливоÑÑ‚Ñ–."
-msgid "An error occurred adding a draft to the thread."
-msgstr "Помилка при додаванні чернетки до обговореннÑ."
-
-msgid "An error occurred adding a new draft."
-msgstr "Виникла помилка під Ñ‡Ð°Ñ Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð½Ð¾Ð²Ð¾Ñ— чернетки."
-
msgid "An error occurred creating the new branch."
msgstr "Помилка при Ñтворенні нової гілки."
@@ -5123,6 +5142,12 @@ msgstr "Помилка при затвердженні, будь лаÑка, ÑÐ
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr "Помилка під Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ шлÑху до групи. Оновіть Ñторінку та Ñпробуйте ще раз."
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ."
@@ -5282,9 +5307,6 @@ msgstr "Під Ñ‡Ð°Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñ–Ð² ÑталаÑÑ Ð
msgid "An error occurred while loading the blob controls."
msgstr "Виникла помилка під Ñ‡Ð°Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð±Ñ–Ð½Ð°Ñ€Ð½Ð¸Ñ… даних."
-msgid "An error occurred while loading the data. Please try again."
-msgstr "Під Ñ‡Ð°Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°. Будь лаÑка, Ñпробуйте ще раз."
-
msgid "An error occurred while loading the file"
msgstr "Помилка при завантаженні файлу"
@@ -5403,9 +5425,6 @@ msgstr "Під Ñ‡Ð°Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ— ÑталаÑÑ
msgid "An error occurred while updating labels."
msgstr "ВідбулаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¼Ñ–Ñ‚Ð¾Ðº."
-msgid "An error occurred while updating the comment"
-msgstr "Під Ñ‡Ð°Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ñ ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°"
-
msgid "An error occurred while updating the configuration."
msgstr "Під Ñ‡Ð°Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ— ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°."
@@ -5494,8 +5513,8 @@ msgstr "СталаÑÑ Ð½ÐµÐ²Ñ–Ð´Ð¾Ð¼Ð° помилка."
msgid "Analytics"
msgstr "Ðналітика"
-msgid "Analytics|Add to Dashboard"
-msgstr "Додати до панелі керуваннÑ"
+msgid "Analytics|A visualization with that name already exists."
+msgstr ""
msgid "Analytics|Add visualizations"
msgstr ""
@@ -5560,12 +5579,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr "Редагувати"
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5575,7 +5603,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5614,6 +5642,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5626,6 +5666,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5644,6 +5687,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr "Проаналізуйте ваші залежноÑÑ‚Ñ– на предмет відомих вразливоÑтей."
@@ -5668,6 +5717,9 @@ msgstr "І цей реєÑтраційний токен:"
msgid "Anonymous"
msgstr "Ðнонімно"
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr "Інший трекер задач вже викориÑтовуєтьÑÑ. Можна активувати лише одну Ñлужбу відÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð°Ð´Ð°Ñ‡"
@@ -6477,9 +6529,6 @@ msgstr "Ви впевнені? Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ GPG ключа не
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr "Ви впевнені? ПриÑтрій буде виведено з GitLab, Ñ– вÑÑ– токени, що запам'Ñтовують мене, будуть відкликані."
-msgid "Arrange charts"
-msgstr "ВпорÑдкувати графіки"
-
msgid "Artifact"
msgstr "Ðртефакт"
@@ -6575,6 +6624,9 @@ msgstr "Загальний розмір артефактів"
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr "Ми хочемо, щоб ви ÑкориÑталиÑÑ Ñ†Ñ–Ñ”ÑŽ Ñторінкою, щоб легко керувати Ñвоїми артефактами CI/CD. Ми працюємо над удоÑконаленнÑм цього доÑвіду Ñ– ми будемо оцінювати будь Ñкі відгуки ÑтоÑовно вдоÑконалень, Ñкі ми Ñтворюємо."
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr "ОÑкільки ми продовжуємо Ñтворювати більше функцій Ð´Ð»Ñ SAST, ми хотіли б отримати ваші відгуки про функцію конфігурації SAST у %{linkStart}цій задачі%{linkEnd}."
@@ -6629,8 +6681,8 @@ msgstr "Призначити Ñебе"
msgid "Assign reviewer"
msgstr "Призначити оглÑдача"
-msgid "Assign reviewer(s)"
-msgstr "Призначити оглÑдача(ів)"
+msgid "Assign reviewers"
+msgstr ""
msgid "Assign severity"
msgstr "Призначити рівень"
@@ -6690,9 +6742,6 @@ msgstr "Виконавець не має прав"
msgid "Assignee lists not available with your current license"
msgstr "СпиÑки виконавців не доÑтупні з вашою поточною ліцензією"
-msgid "Assignee(s)"
-msgstr "Виконавець(ці)"
-
msgid "Assignees"
msgstr "Виконавці"
@@ -6836,17 +6885,23 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr "Помилка при оновленні зовнішнього аудиторÑького потоку. Будь лаÑка, Ñпробуйте знову."
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr "СкаÑувати редагуваннÑ"
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr "КориÑтувацькі HTTP-заголовки (опціонально)"
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
-msgstr "Видалити %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
+msgstr ""
msgid "AuditStreams|Destination URL"
msgstr "URL-адреÑа призначеннÑ"
@@ -6857,19 +6912,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
-msgstr "Редагувати %{link}"
-
msgid "AuditStreams|Event filtering (optional)"
msgstr ""
+msgid "AuditStreams|Filter by audit event type"
+msgstr ""
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
+msgstr ""
+
msgid "AuditStreams|Header"
msgstr "Заголовок"
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6878,6 +6948,9 @@ msgstr "Видалити Ñпеціальний заголовок"
msgid "AuditStreams|Save external stream destination"
msgstr "Зберегти Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ потоку"
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6905,10 +6978,7 @@ msgstr "ЗначеннÑ"
msgid "AuditStreams|Verification token"
msgstr "Токен перевірки"
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6920,6 +6990,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr "відфільтровано"
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr "Ñерп."
@@ -7457,28 +7533,28 @@ msgstr "Білінг"
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr "10Гб передачі на міÑÑць"
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7649,6 +7725,9 @@ msgstr "Підтримка"
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr "Ð¦Ñ Ð³Ñ€ÑƒÐ¿Ð° викориÑтовує план, пов'Ñзаний з батьківÑькою групою."
@@ -7676,12 +7755,9 @@ msgstr "Ми тут, щоб допомогти."
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr "Ðе дивлÑчиÑÑŒ на те, що GitLab припинÑÑ” доÑтуп до Бронзового плану, ви можете продовжити бронзову підпиÑку ще один раз до %{eoa_bronze_plan_end_date}. Також ми пропонуємо обмежене за чаÑом безкоштовне Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð¾ Преміум плану (до 25 кориÑтувачів)! ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про зміни та пропозиції у нашому %{announcement_link}."
-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}."
+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 your projects to it%{move_link_end}."
msgstr ""
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
-msgstr "Ви повинні %{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} шлÑхом Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð¸Ð¶Ñ‡Ðµ."
@@ -7739,10 +7815,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr "ДоÑтупні раннери будуть ввімкнені піÑÐ»Ñ Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð´Ñ–Ð¹Ñної кредитної картки."
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7754,7 +7830,7 @@ msgstr "Підтвердити обліковий запиÑ"
msgid "Billings|Validate user account"
msgstr "Перевірити обліковий Ð·Ð°Ð¿Ð¸Ñ ÐºÐ¾Ñ€Ð¸Ñтувача"
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -8054,12 +8130,18 @@ msgstr "Під Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð°Ð´Ð°Ñ‡Ñ– ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»Ð
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr "Під Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÑпиÑку ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°. Будь лаÑка, Ñпробуйте ще раз."
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr "Під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾Ñ‡Ñ–Ñ€Ð½Ñ–Ñ… груп ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°. Будь лаÑка, Ñпробуйте ще раз."
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr "Під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð³Ñ€ÑƒÐ¿Ð¾Ð²Ð¸Ñ… проєктів ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°. Будь лаÑка, Ñпробуйте ще раз."
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr "Під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð·Ð°Ð´Ð°Ñ‡ ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°. Будь лаÑка, перезавантажте Ñторінку."
@@ -8124,9 +8206,6 @@ msgstr "Розгорнути"
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr "Помилка при отриманні Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ %{issuableType}s"
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr "ПереміÑтити картку"
@@ -8184,6 +8263,9 @@ msgstr "Завантажити більше задач"
msgid "Board|Loading epics"
msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ ÐµÐ¿Ñ–ÐºÑ–Ð²"
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr "Жирний текÑÑ‚"
@@ -8601,21 +8683,30 @@ msgstr "ШлÑхи можуть міÑтити шаблони, Ñк */welcome"
msgid "BroadcastMessages|Red"
msgstr "Червона"
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr "Показати широкомовне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð² інтерфейÑÑ– командного Ñ€Ñдка Ñк віддалену відповідь Git"
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr "ПочинаєтьÑÑ Ð¾"
msgid "BroadcastMessages|Target Path"
msgstr "Цільовий шлÑÑ…"
+msgid "BroadcastMessages|Target broadcast message"
+msgstr ""
+
msgid "BroadcastMessages|Target roles"
msgstr "Цільові ролі"
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
-msgstr "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶Ð°Ñ”Ñ‚ÑŒÑÑ Ð»Ð¸ÑˆÐµ Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувачів у проєктах Ñ– групах, що мають ці ролі."
-
msgid "BroadcastMessages|Theme"
msgstr "Тема"
@@ -8850,6 +8941,9 @@ msgstr "За міÑÑць"
msgid "By quarter"
msgstr "Щоквартально"
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr "За тиждень"
@@ -8960,7 +9054,7 @@ msgid "CICD|Allow CI job tokens from the following projects to access this proje
msgstr ""
msgid "CICD|Allow access to this project with a CI_JOB_TOKEN"
-msgstr ""
+msgstr "Дозволити доÑтуп до цього проєкту за допомогою CI_JOB_TOKEN"
msgid "CICD|Auto DevOps"
msgstr "Auto DevOps"
@@ -9002,7 +9096,7 @@ msgid "CICD|Limit CI_JOB_TOKEN access"
msgstr "Обмежити доÑтуп CI_JOB_TOKEN"
msgid "CICD|Manage which projects can use their CI_JOB_TOKEN to access this project. It is a security risk to disable this feature, because unauthorized projects might attempt to retrieve an active token and access the API. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
+msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð¸Ð¼, Ñкі проєкти можуть викориÑтовувати Ñвої CI_JOB_TOKEN Ð´Ð»Ñ Ð´Ð¾Ñтупу до цього проєкту. Ð’Ð¸Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ параметра Ñтановить ризик Ð´Ð»Ñ Ð±ÐµÐ·Ð¿ÐµÐºÐ¸, оÑкільки неавторизовані проєкти можуть Ñпробувати отримати активний токен Ñ– отримати доÑтуп до API. %{linkStart}ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ.%{linkEnd}"
msgid "CICD|Select the projects that 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. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -9346,11 +9440,11 @@ msgstr ""
msgid "Change assignee"
msgstr "Змінити виконавцÑ"
-msgid "Change assignee(s)"
-msgstr "Змінити виконавцÑ(ців)"
+msgid "Change assignees"
+msgstr ""
-msgid "Change assignee(s)."
-msgstr "Змінити виконавцÑ(ців)."
+msgid "Change assignees."
+msgstr ""
msgid "Change branches"
msgstr "Змінити гілки"
@@ -9367,11 +9461,11 @@ msgstr "Змінити етап"
msgid "Change path"
msgstr "Змінити шлÑÑ…"
-msgid "Change reviewer(s)"
-msgstr "Змінити оглÑдача(ів)"
+msgid "Change reviewers"
+msgstr ""
-msgid "Change reviewer(s)."
-msgstr "Змінити оглÑдача(ів)."
+msgid "Change reviewers."
+msgstr ""
msgid "Change role"
msgstr "Змінити роль"
@@ -9394,8 +9488,11 @@ msgstr ""
msgid "Change your password"
msgstr "Змінити пароль"
-msgid "Change your password or recover your current one"
-msgstr "Змініть пароль або відновіть поточний"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
+msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
msgstr "Ð’ÑÑ– оглÑдачі були видалені."
@@ -9442,14 +9539,14 @@ msgstr "Ваші зміни будуть внеÑені до %{branchName} , оÑ
msgid "Changed"
msgstr "Змінено"
-msgid "Changed assignee(s)."
-msgstr "Змінено виконавцÑ(ців)."
+msgid "Changed assignees."
+msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
-msgstr "Змінено оглÑдача(ів)."
+msgid "Changed reviewers."
+msgstr ""
msgid "Changed squash option to %{squash_option}"
msgstr ""
@@ -9490,9 +9587,6 @@ msgstr "ЗалишилоÑÑ Ñимволів"
msgid "Characters over limit"
msgstr "КількіÑÑ‚ÑŒ Ñимволів перевищена"
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr "Графіки не можуть відображатиÑÑ, оÑкільки вичерпано Ñ‡Ð°Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ даних. %{documentationLink}"
-
msgid "Chat"
msgstr "Чат"
@@ -9598,7 +9692,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr "$%{selectedPlanPrice} за 10 ГБ Ñховища на рік"
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9614,15 +9708,18 @@ msgstr "%{cardType} закінчуєтьÑÑ Ð½Ð° %{lastFourDigits}"
msgid "Checkout|%{name}'s GitLab subscription"
msgstr "ПідпиÑка GitLab Ð´Ð»Ñ %{name}"
+msgid "Checkout|%{name}'s compute minutes"
+msgstr ""
+
msgid "Checkout|%{name}'s storage subscription"
msgstr " ПідпиÑка на Ñховище%{name}"
-msgid "Checkout|%{name}'s units of compute"
-msgstr ""
-
msgid "Checkout|%{quantity} GB of storage"
msgstr "%{quantity} ГБ Ñховища"
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
@@ -9630,9 +9727,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr "%{selectedPlanText} план"
@@ -9672,7 +9766,7 @@ msgstr "МіÑто"
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9813,12 +9907,12 @@ msgstr "Податки"
msgid "Checkout|Total"
msgstr "Ð’Ñього"
+msgid "Checkout|Total compute minutes: %{quantity}"
+msgstr ""
+
msgid "Checkout|Total storage: %{quantity} GB"
msgstr "Загальний обÑÑг пам’ÑÑ‚Ñ–: %{quantity} ГБ"
-msgid "Checkout|Total units of compute: %{quantity}"
-msgstr ""
-
msgid "Checkout|Users"
msgstr "КориÑтувачі"
@@ -9843,7 +9937,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr "ÐºÐ¾Ð¼Ð¿Ð°Ð½Ñ–Ñ Ð°Ð±Ð¾ команда"
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9891,6 +9985,9 @@ msgstr "Виберіть тип..."
msgid "Choose file…"
msgstr "Виберіть файл…"
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr "Оберіть групу найвищого Ñ€Ñ–Ð²Ð½Ñ Ð´Ð»Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚Ñƒ репозиторіїв."
@@ -9918,16 +10015,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9942,6 +10039,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9969,6 +10069,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10057,7 +10160,7 @@ msgid "CiStatus|running"
msgstr "виконуєтьÑÑ"
msgid "CiVariables|Attributes"
-msgstr ""
+msgstr "Ðтрибути"
msgid "CiVariables|Cancel"
msgstr "СкаÑувати"
@@ -10072,10 +10175,10 @@ msgid "CiVariables|Expanded"
msgstr "Розширені"
msgid "CiVariables|File"
-msgstr ""
+msgstr "Файл"
msgid "CiVariables|Group"
-msgstr ""
+msgstr "Група"
msgid "CiVariables|Input variable key"
msgstr "Ключ вхідної змінної"
@@ -10159,7 +10262,7 @@ msgid "CiVariable|Define a CI/CD variable in the UI"
msgstr ""
msgid "CiVariable|Maximum of %{limit} environments listed. For more environments, enter a search query."
-msgstr ""
+msgstr "Відображено макÑимум %{limit} Ñередовищ. Щоб отримати більше Ñередовищ, введіть пошуковий запит."
msgid "CiVariable|New environment"
msgstr "Ðове Ñередовище"
@@ -10342,6 +10445,9 @@ msgstr "Клонує цю задачу без коментарів до %{projec
msgid "Close"
msgstr "Закрити"
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr "Закрити %{issueType}"
@@ -10399,6 +10505,9 @@ msgstr "Закриває %{quick_action_target}."
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr "Cloud Run"
@@ -10994,9 +11103,6 @@ msgstr "Детальні Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ— із ци
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr "Дозволити GitLab керувати проÑторами імен та Ñлужбовими обліковими запиÑами Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ клаÑтера."
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr "ДозволÑÑ” GitLab виконувати запит щодо метрик до Ñпеціально налаштованого Prometheus в клаÑтері."
-
msgid "ClusterIntegration|Amazon EKS"
msgstr "Amazon EKS"
@@ -11081,9 +11187,6 @@ msgstr "Чи знаєте ви?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr "Elastic Kubernetes СервіÑ"
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr "Увімкнути інтеграцію Prometheus"
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr "Увімкніть або вимкніть Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ GitLab до клаÑтера Kubernetes."
@@ -11144,9 +11247,6 @@ msgstr "Ð†Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð°"
msgid "ClusterIntegration|Integration enabled"
msgstr "Ð†Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ ÑƒÐ²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð°"
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr "Інтеграції дозволÑÑŽÑ‚ÑŒ вам викориÑтовувати заÑтоÑунки, вÑтановлені у вашому клаÑтері Ñк чаÑтину робочого процеÑу GitLab."
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr "СтворюєтьÑÑ ÐºÐ»Ð°Ñтер Kubernetes..."
@@ -11390,6 +11490,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11435,6 +11538,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr "%{link_start}Що таке пропозиції коду?%{link_end}"
@@ -11450,10 +11559,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11549,15 +11655,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11652,18 +11767,12 @@ msgstr "Коміт видалено"
msgid "Commit message"
msgstr "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ð¼Ñ–Ñ‚Ñƒ"
-msgid "Commit message (optional)"
-msgstr "ÐžÐ¿Ð¸Ñ ÐºÐ¾Ð¼Ñ–Ñ‚Ñƒ (необов'Ñзково)"
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr "СтатиÑтика комітів Ð´Ð»Ñ %{ref} %{start_time} - %{end_time}"
-msgid "Commit to %{branchName} branch"
-msgstr "Закомітити в гілку %{branchName}"
-
msgid "CommitBoxTitle|Commit"
msgstr "Коміт"
@@ -11790,15 +11899,30 @@ msgstr "Ðема чого порівнювати."
msgid "CompareRevisions|Branches"
msgstr "Гілки"
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr "ПорівнÑти"
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr "Створити запит на злиттÑ"
msgid "CompareRevisions|Filter by Git revision"
msgstr "Фільтрувати за ревізією Git"
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr "Обрати ревізію Git"
@@ -11808,6 +11932,12 @@ msgstr "Обрати гілку/тег"
msgid "CompareRevisions|Select target project"
msgstr "Обрати цільовий проєкт"
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr "ПомінÑти ревізії міÑцÑми"
@@ -11844,10 +11974,13 @@ msgstr "Завершено"
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr "Завершено за %{duration_seconds} Ñекунд (%{relative_time})"
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export full report as CSV"
+msgstr ""
+
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -12045,6 +12178,9 @@ msgstr "Менше, ніж 2 затверджувачі"
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr "ÐŸÐ¾Ñ€ÑƒÑˆÐµÐ½Ð½Ñ Ð½Ðµ виÑвлені"
@@ -12090,15 +12226,15 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
+msgid "Compute minutes"
+msgstr ""
+
msgid "Compute quota"
msgstr ""
msgid "Compute quota:"
msgstr ""
-msgid "Confidence"
-msgstr "ВпевненіÑÑ‚ÑŒ"
-
msgid "Confidential"
msgstr "Конфіденційний"
@@ -12153,9 +12289,6 @@ msgstr "Ðалаштувати таймаути Gitaly."
msgid "Configure Integrations"
msgstr "Ðалаштувати інтеграції"
-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 "Ðалаштуйте SAST IaC в `.gitlab-ci.yml`, викориÑтовуючи керований шаблон GitLab. Ви можете [додати Ð¿ÐµÑ€ÐµÐ²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½Ð½Ð¸Ñ…](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings), щоб налаштувати параметри SAST IaC."
@@ -12192,9 +12325,6 @@ msgstr "Ðалаштуйте додаткові права, Ñховище веÐ
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr "Ðалаштувати Ñ–Ñнуючу інÑталÑцію"
-
msgid "Configure pipeline"
msgstr "Ðалаштувати конвеєр"
@@ -12244,7 +12374,7 @@ msgid "Configure which lists are shown for anyone who visits this board"
msgstr "Ðалаштуйте, Ñкі ÑпиÑки відображатимутьÑÑ Ð´Ð»Ñ Ð²ÑÑ–Ñ…, хто відвідує цю дошку"
msgid "Configure with a merge request"
-msgstr ""
+msgstr "Ðалаштуйте за допомогою запиту на злиттÑ"
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr "Ðалаштуйте Ñвої Ñередовища Ð´Ð»Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð² певних географічних регіонах"
@@ -12357,15 +12487,9 @@ msgstr "ÐŸÑ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ віддаленого Ñередовища.
msgid "Connecting..."
msgstr "З'єднаннÑ..."
-msgid "Connection failed"
-msgstr "Помилка з’єднаннÑ"
-
msgid "Connection failure"
msgstr "Помилка з’єднаннÑ"
-msgid "Connection timed out"
-msgstr "Минув Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ"
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12759,9 +12883,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr "ВміÑÑ‚ аналізуєтьÑÑ Ð·Ð° допомогою %{link}."
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12885,6 +13006,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr "ВнеÑки за %{calendar_date}"
@@ -12898,7 +13052,7 @@ msgid "Control emails linked to your account"
msgstr "Керувати адреÑами електронної пошти, пов’Ñзаними з вашим обліковим запиÑом"
msgid "Control how the CI_JOB_TOKEN CI/CD variable is used for API access between projects."
-msgstr ""
+msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð¸Ð¼, Ñк змінна CI_JOB_TOKEN CI/CD викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð´Ð¾Ñтупу до API між проєктами."
msgid "Control whether to display customer experience improvement content and third-party offers in GitLab."
msgstr "Контролює, чи показувати контент Ð¿Ð¾ÐºÑ€Ð°Ñ‰ÐµÐ½Ð½Ñ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ñького доÑвіду та Ñторонні пропозиції в GitLab."
@@ -13014,9 +13168,6 @@ msgstr "Скопіювати поÑиланнÑ"
msgid "Copy link URL"
msgstr "Копіювати URL поÑиланнÑ"
-msgid "Copy link to chart"
-msgstr "Копіювати поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° графік"
-
msgid "Copy merge request URL"
msgstr ""
@@ -13182,6 +13333,9 @@ msgstr "Ðе вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ тригер."
msgid "Could not restore the group"
msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ групу"
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÐ»Ð¸ÐºÐ°Ñ‚Ð¸ токен доÑтупу %{access_token_name}."
@@ -13236,9 +13390,6 @@ msgstr "Створити %{environment}"
msgid "Create %{humanized_resource_name}"
msgstr "Створити %{humanized_resource_name}"
-msgid "Create %{type}"
-msgstr "Створити %{type}"
-
msgid "Create %{workspace} label"
msgstr "Створити мітку %{workspace}"
@@ -13281,6 +13432,9 @@ msgstr "Створити нову гілку"
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr "Створити новий файл, тому що наразі немає жодного файлу. Пізніше ви зможете закомітити ваші зміни."
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr "Створити нову задачу"
@@ -13566,6 +13720,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr "МакÑимальна довжина %{maxLength} Ñимволів"
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr "Потрібна назва"
@@ -13710,9 +13867,6 @@ msgstr "СтвореннÑ"
msgid "Creating epic"
msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐµÐ¿Ñ–ÐºÑƒ"
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð³Ñ€Ð°Ñ„Ñ–ÐºÑ–Ð² викориÑтовує дані з Ñервера Prometheus. Якщо це займає багато чаÑу, переконайтеÑÑ, що дані доÑтупні."
-
msgid "Creator"
msgstr ""
@@ -14156,7 +14310,7 @@ msgid "DAST profile not found: %{name}"
msgstr "Профіль DAST не знайдено: %{name}"
msgid "DAST profiles"
-msgstr ""
+msgstr "DAST профілі"
msgid "DNS"
msgstr "DNS"
@@ -14940,6 +15094,12 @@ msgstr "Ðе вдалоÑÑ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€Ð¸Ñ‚Ð¸ розмір розпакова
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr "За замовчуваннÑм - ніколи не запуÑкати"
@@ -15037,7 +15197,7 @@ msgid "Definition"
msgstr "ВизначеннÑ"
msgid "Delay 2FA enforcement (hours)"
-msgstr "Затримка заÑтоÑÑƒÐ²Ð°Ð½Ð½Ñ 2FA (годин)"
+msgstr "Затримка у впровадженні 2FA (години)"
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
msgstr "Ви впевнені, що ви хочете запуÑтити %{jobName} відразу? Ð’ іншому випадку це Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð±ÑƒÐ´Ðµ виконано автоматично по завершенню таймера."
@@ -15209,6 +15369,9 @@ msgstr "Видалити змінну"
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr "Помилка при видаленні подій. Будь лаÑка, Ñпробуйте знову, або зв'ÑжітьÑÑ Ð· адмініÑтратором."
@@ -15333,6 +15496,12 @@ msgstr[1] "виÑвлено %d вразливоÑÑ‚Ñ–"
msgstr[2] "виÑвлено %d вразливоÑтей"
msgstr[3] "виÑвлено %d вразливоÑтей"
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr "ще %{remainingLicensesCount}"
@@ -15375,9 +15544,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr "Пакувальник"
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr "Ð—Ð°Ð²Ð´Ð°Ð½Ð½Ñ %{codeStartTag}dependency_scanning%{codeEndTag} закінчилоÑÑ Ð½ÐµÑƒÑпішно Ñ– неможе згенерувати ÑпиÑок. Будь лаÑка, переконайтеÑÑ, що Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð²Ð¸ÐºÐ¾Ñ€ÑƒÑ”Ñ‚ÑŒÑÑ Ð½Ð°Ð»ÐµÐ¶Ð½Ð¸Ð¼ чином Ñ– перезапуÑÑ‚Ñ–Ñ‚ÑŒ конвеєр."
@@ -15411,6 +15586,9 @@ msgstr ""
msgid "Dependency list"
msgstr "СпиÑок залежноÑтей"
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15429,6 +15607,9 @@ msgstr "Ðалаштуйте в параметрах"
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr "Скопіювати шлÑÑ… до образу"
@@ -15453,6 +15634,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr "СпиÑок образів"
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15462,6 +15646,9 @@ msgstr "Ðемає образів у кеші"
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr "Щоб переглÑнути Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ Ð¾Ð±Ñ€Ð°Ð·Ñ–Ð² та вміÑÑ‚ кешу, перейдіть на %{linkStart}прокÑÑ–-залежніÑÑ‚ÑŒ%{linkEnd}"
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr "Якщо увімкнено, образ, що зберігаютьÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ ніж 90 днів, будуть видалені з кешу."
@@ -15780,9 +15967,6 @@ msgstr "Керівники"
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15937,12 +16121,6 @@ msgstr "уÑпішно"
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr "Зменшити пріоритет мітки"
@@ -15952,9 +16130,6 @@ msgstr "Опишіть мету зміни та на що оглÑдач повÐ
msgid "Description"
msgstr "ОпиÑ"
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr "ÐžÐ¿Ð¸Ñ (необов'Ñзково)"
@@ -16713,8 +16888,8 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
-msgstr "Щоб перевірити право влаÑноÑÑ‚Ñ– на ваш домен, додайте наведений вище ключ до TXT-запиÑу у вашій конфігурації DNS. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
+msgstr ""
msgid "Don't have a group?"
msgstr "Ðе маєте групи?"
@@ -16758,15 +16933,15 @@ msgstr "Завантажити (%{fileSizeReadable})"
msgid "Download (%{size})"
msgstr "Завантажити (%{size})"
-msgid "Download CSV"
-msgstr "Завантажити CSV"
-
msgid "Download PDF"
msgstr "Завантажити PDF"
msgid "Download artifacts"
msgstr "Завантажити артефакти"
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr "Завантажити коди"
@@ -17052,6 +17227,9 @@ msgstr "Редагувати публічний ключ Ð´Ð»Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°
msgid "Edit sidebar"
msgstr "Редагувати бічну панель"
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr "Редагувати таблицю"
@@ -17101,7 +17279,7 @@ msgid "Editing"
msgstr "РедагуваннÑ"
msgid "Edits"
-msgstr ""
+msgstr "РедагуваннÑ"
msgid "Elapsed time"
msgstr "Витрачений чаÑ"
@@ -17149,7 +17327,7 @@ msgid "Email address suffix"
msgstr "Ð¡ÑƒÑ„Ñ–ÐºÑ Ð°Ð´Ñ€ÐµÑи електронної пошти"
msgid "Email address to use for Service Desk"
-msgstr ""
+msgstr "ÐдреÑа електронної пошти Ð´Ð»Ñ Ð¡Ð»ÑƒÐ¶Ð±Ð¸ Підтримки"
msgid "Email could not be sent"
msgstr ""
@@ -17157,6 +17335,9 @@ msgstr ""
msgid "Email display name"
msgstr "Відображуване ім'Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ— пошти"
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr "Електронну пошту не перевірено. Будь лаÑка, перевірте Ñ—Ñ— в Salesforce."
@@ -17221,7 +17402,7 @@ msgid "Emails"
msgstr "ÐдреÑи електронної пошти"
msgid "Emails sent to %{email} are also supported."
-msgstr ""
+msgstr "Також підтримуютьÑÑ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ñ– лиÑти, надіÑлані на %{email}"
msgid "EmailsOnPushService|Disable code diffs"
msgstr "Вимкнути різницю коду (diff)"
@@ -17314,7 +17495,7 @@ msgid "Enable admin mode"
msgstr "Увімкнути режим адмініÑтратора"
msgid "Enable and disable Service Desk. Some additional configuration might be required. %{link_start}Learn more%{link_end}."
-msgstr ""
+msgstr "Ð£Ð²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ñ‚Ð° Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ñлужби підтримки. Може знадобитиÑÑ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ðµ налаштуваннÑ. %{link_start}ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ%{link_end}."
msgid "Enable authenticated API request rate limit"
msgstr "Увімкнути Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ñ‡Ð°Ñтоти API запитів з автентифікацією"
@@ -17493,9 +17674,6 @@ msgstr "ЗаÑтоÑовувати двофакторну автентифіка
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr "ПереконайтеÑÑ, що між Ñерверами GitLab та Prometheus Ñ–Ñнує з’єднаннÑ"
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr "ПереконайтеÑÑ Ð² тому, що %{linkStart}Ñередовище приÑутнє в Ñтадії розгортаннÑ%{linkEnd} вашого CI конвеєра Ð´Ð»Ñ Ð²Ñ–Ð´ÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½ÑŒ на ваш клаÑтер."
@@ -17556,9 +17734,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr "Введіть наÑтупне, щоб підтвердити:"
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr "Введіть назву вашого заÑтоÑунку, Ñ– ми надамо вам унікальний %{type}."
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr "Введіть кількіÑÑ‚ÑŒ Ñекунд або інший доÑтупний Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ‚ÐµÐºÑÑ‚, наприклад \"1 година\". Цей Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð°Ñ” пріоритет над меншим чаÑом очікуваннÑм, вÑтановленими Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ."
@@ -17586,16 +17761,19 @@ msgstr "Введіть пароль Ð´Ð»Ñ Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ"
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
+msgstr ""
+
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17608,7 +17786,7 @@ msgid "Environment is required for Stages::VariableEndpointInserter"
msgstr ""
msgid "Environment scope"
-msgstr ""
+msgstr "ОбÑÑг Ñередовища"
msgid "Environment variables on this GitLab instance are configured to be %{link_start}protected%{link_end} by default."
msgstr "Змінні Ñередовища на цьому інÑтанÑÑ– GitLab за замовчуваннÑм налаштовані на %{link_start} захищено%{link_end}."
@@ -17760,9 +17938,6 @@ msgstr "GitLab агент"
msgid "Environments|Job"
msgstr "ЗавданнÑ"
-msgid "Environments|Learn about environments"
-msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про Ñередовища"
-
msgid "Environments|Learn more about stopping environments"
msgstr "ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про зупинку Ñередовищ"
@@ -17775,9 +17950,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr "Ðове Ñередовище"
-msgid "Environments|No deployed environments"
-msgstr "Ðемає розгорнутих Ñередовищ"
-
msgid "Environments|No deployments yet"
msgstr "Ще немає розгортань"
@@ -17973,12 +18145,6 @@ msgstr "Епіки дозволÑÑŽÑ‚ÑŒ керувати вашим портфе
msgid "Epics, issues, and merge requests"
msgstr "Епіки, задачі та запити на злиттÑ"
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr "%{startDate} – %{dueDate}"
-
-msgid "Epics|%{startDate} – No due date"
-msgstr "%{startDate} – немає терміну"
-
msgid "Epics|Add a new epic"
msgstr "Додати новий епік"
@@ -17994,9 +18160,6 @@ msgstr "Ви впевнені, що хочете видалити %{bStart}%{tar
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr "Ðемає дати початку – %{dueDate}"
-
msgid "Epics|Remove epic"
msgstr "Видалити епік"
@@ -18953,12 +19116,18 @@ msgstr[3] "Ðевдалих завдань"
msgid "Failed on"
msgstr "Помилка на"
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr "Ðе вдалоÑÑ Ð´Ð¾Ð´Ð°Ñ‚Ð¸ Zoom-зуÑтріч"
msgid "Failed to add a resource link"
msgstr "Ðе вдалоÑÑ Ð´Ð¾Ð´Ð°Ñ‚Ð¸ поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° реÑурÑ"
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr "Ðе вдалоÑÑ Ð·Ð°ÑтоÑувати команди."
@@ -18999,9 +19168,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr "Ðе вдалоÑÑ ÐºÐ»Ð¾Ð½ÑƒÐ²Ð°Ñ‚Ð¸ цю задачу: неправильні параметри."
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr "Ðе вдалоÑÑ Ñтворити гілку Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— задачі. Будь лаÑка, Ñпробуйте знову."
@@ -19146,6 +19312,9 @@ msgstr "Ðе вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ Zoom-зуÑтріч"
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr "Ðе вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ дзеркало."
@@ -19167,6 +19336,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr "Ðе вдалоÑÑ Ð·Ð±ÐµÑ€ÐµÐ³Ñ‚Ð¸ Ð²Ð¸Ñ€Ñ–ÑˆÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ„Ð»Ñ–ÐºÑ‚Ñ–Ð² злиттÑ. Будь лаÑка, Ñпробуйте знову!"
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr "Ðе вдалоÑÑ Ð·Ð±ÐµÑ€ÐµÐ³Ñ‚Ð¸ нові параметри"
@@ -19233,9 +19405,6 @@ msgstr "Favicon буде видалено. Ви впевнені?"
msgid "Feature Flags"
msgstr "Перемикачі функцій"
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr "Стан перемикача функцій"
@@ -19540,6 +19709,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr "Файли, каталоги та підмодулі у шлÑху %{path} Ð´Ð»Ñ Ð¿Ð¾ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° коміт %{ref}"
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19766,13 +19938,10 @@ msgid "For additional information, review your group membership: %{link_to} or c
msgstr ""
msgid "For each job, clone the repository."
-msgstr ""
+msgstr "Ð”Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ ÐºÐ»Ð¾Ð½ÑƒÐ¹Ñ‚Ðµ репозиторій."
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
-msgstr ""
-
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr "Ðаприклад, заÑтоÑунок, що викориÑтовує токен, або Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð¾ÐºÐµÐ½Ð°. Ðе вказуйте конфіденційну інформацію Ð´Ð»Ñ Ð½Ð°Ð·Ð²Ð¸ токена, оÑкільки вона буде видимою Ð´Ð»Ñ Ð²ÑÑ–Ñ… учаÑників %{resource_type}."
+msgstr "Ð”Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾ викориÑтовуйте робочу облаÑÑ‚ÑŒ проєкту. Якщо робоча облаÑÑ‚ÑŒ відÑутнÑ, викориÑтовуйте %{code_open}git clone%{code_close}."
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19783,6 +19952,9 @@ msgstr "Ð”Ð»Ñ Ð·Ð°Ð³Ð°Ð»ÑŒÐ½Ð¾Ñ— роботи"
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr "Ð”Ð»Ñ Ñ€Ð¾Ð·ÑÐ»Ñ–Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð±Ð¾Ñ—Ð² або неÑправноÑтей в роботі ІТ-ÑервіÑів"
@@ -19967,6 +20139,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -20027,6 +20202,9 @@ msgstr "З %{providerTitle}"
msgid "From issue creation until deploy to production"
msgstr "З моменту ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð°Ð´Ð°Ñ‡Ñ– до Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð½Ð° production"
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr "Від Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð´Ð¾ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð½Ð° production"
@@ -20084,6 +20262,9 @@ msgstr "Створити новий екÑпорт"
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr "Згенеруйте токени доÑтупу до проєкту в межах цього проєкту Ð´Ð»Ñ Ð²Ð°ÑˆÐ¸Ñ… заÑтоÑунків, Ñким потрібен доÑтуп до API GitLab."
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr "Згенеруйте Ñайт Ñ– приватні ключі за адреÑою"
@@ -20704,9 +20885,6 @@ msgstr "Розпочати роботу з GitLab"
msgid "Get started with error tracking"
msgstr "Розпочати роботу з відÑтеженнÑм помилок"
-msgid "Get started with performance monitoring"
-msgstr "Розпочати роботу із відÑлідковуваннÑм продуктивноÑÑ‚Ñ–"
-
msgid "Get started!"
msgstr "Розпочати!"
@@ -21187,6 +21365,9 @@ msgstr "Щоб викориÑтовувати інтеграцію, кожен Ð
msgid "Gitpod|https://gitpod.example.com"
msgstr "https://gitpod.example.com"
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -21226,6 +21407,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr "Закрити"
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr "Група"
@@ -21244,6 +21428,9 @@ msgstr "Створені мною задачі"
msgid "GlobalSearch|Issues assigned to me"
msgstr "Задачі призначені Ð´Ð»Ñ Ð¼ÐµÐ½Ðµ"
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -21256,6 +21443,9 @@ msgstr "Запити на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ñ– Ð´Ð»Ñ Ð¼ÐµÐ½Ðµ"
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr "Запити на злиттÑ, Ñкі Ñ Ð¾Ð³Ð»Ñдаю"
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr "Проєкт"
@@ -21292,6 +21482,9 @@ msgstr "Пошук в GitLab %{kbdOpen}/%{kbdClose}"
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr "Пошук проєктів, задач і т.д."
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr "Результати пошуку завантажуютьÑÑ"
@@ -21721,9 +21914,6 @@ msgstr "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ групу:"
msgid "Group information"
msgstr "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ групу"
-msgid "Group is required when cluster_type is :group"
-msgstr "Група Ñ” обов'Ñзковою, Ñкщо cluster_type Ñ” :group"
-
msgid "Group jobs by"
msgstr "Групувати Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð·Ð°"
@@ -21770,7 +21960,7 @@ msgid "Group runners"
msgstr "Групові раннери"
msgid "Group runners can be managed with the %{link}."
-msgstr ""
+msgstr "Груповими раннерами можна керувати за допомогою %{link}."
msgid "Group variables (inherited)"
msgstr "Змінні групи (уÑпадковані)"
@@ -22015,6 +22205,9 @@ msgstr "Токен SCIM"
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr "SHA1-відбиток Ñертифікату Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñу SAML токена. Отримайте його від провайдера ідентифікації, де він також може називатиÑÑ \"Thumbprint\"."
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22379,13 +22572,13 @@ msgid "GroupsNew|Groups can also be nested by creating %{linkStart}subgroups%{li
msgstr "Групи також можуть бути вкладеними шлÑхом ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ %{linkStart}підгруп%{linkEnd}."
msgid "GroupsNew|Import a group and related data from another GitLab instance."
-msgstr ""
+msgstr "Імпортуйте групу та пов'Ñзані з нею дані з іншого інÑтанÑу GitLab."
msgid "GroupsNew|Import group"
msgstr "Імпортувати групу"
msgid "GroupsNew|Import groups by direct transfer"
-msgstr ""
+msgstr "Імпорт груп Ð´Ð»Ñ Ð¿Ñ€Ñмої передачі"
msgid "GroupsNew|Importing groups by direct transfer is currently disabled."
msgstr "Ð†Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð³Ñ€ÑƒÐ¿ через прÑму передачу вимкнуто."
@@ -22692,12 +22885,6 @@ msgstr "Ð¡Ð¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñ‚Ð° інші дії %{issueType} переміщеÐ
msgid "HeaderAction|Okay!"
msgstr "Гаразд!"
-msgid "HeaderAction|incident"
-msgstr "інцидент"
-
-msgid "HeaderAction|issue"
-msgstr "задача"
-
msgid "Headers"
msgstr "Заголовки"
@@ -22812,13 +22999,6 @@ msgstr "Приховати попередній переглÑд"
msgid "Hide archived projects"
msgstr "Сховати архівовані проєкти"
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] "Сховати графік"
-msgstr[1] "Сховати графіка"
-msgstr[2] "Сховати графіки"
-msgstr[3] "Сховати графіки"
-
msgid "Hide comments"
msgstr "Приховати коментарі"
@@ -22967,12 +23147,24 @@ msgstr "ОчищеннÑ"
msgid "Housekeeping successfully started"
msgstr "ÐžÑ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ ÑƒÑпішно розпочато"
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr "Як налаштувати Akismet?"
msgid "How do I configure this integration?"
msgstr "Як налаштувати цю інтеграцію?"
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr "Як це Ñтворити?"
@@ -23599,6 +23791,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr "Запит проÑторів імен не вдавÑÑ"
@@ -23631,7 +23826,7 @@ msgstr[2] "Ð†Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ %d репозиторіїв"
msgstr[3] "Ð†Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ %d репозиторіїв"
msgid "Importing GitLab projects? Migrating GitLab projects when migrating groups by direct transfer is in Beta. %{link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "Як імпортувати проєкти GitLab? Ð†Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñ–Ð² GitLab при перенеÑенні груп прÑмим перенеÑеннÑм знаходитьÑÑ Ð² бета-верÑÑ–Ñ—. %{link_start}ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ.%{link_end}"
msgid "Importing..."
msgstr "Імпорт..."
@@ -23660,6 +23855,9 @@ msgstr "За цією URL-адреÑою немає дійÑного репозÐ
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24482,6 +24680,12 @@ msgstr "Ðе завершено"
msgid "Increase"
msgstr "Збільшити"
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24599,8 +24803,8 @@ msgstr "Ð’Ñтавити Ñтовпець перед"
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
-msgstr "Ð’Ñтавити поÑиланнÑ"
+msgid "Insert link (%{modifierKey}K)"
+msgstr ""
msgid "Insert or edit diagram"
msgstr ""
@@ -24632,9 +24836,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr "Ð’Ñтановіть GitLab раннер Ñ– переконайтеÑÑ, що він працює."
-msgid "Install on clusters"
-msgstr "Ð’Ñтановити на клаÑтери"
-
msgid "Installation"
msgstr "УÑтановка"
@@ -25238,7 +25439,7 @@ msgid "InviteMembersModal|To invite new users to this top-level group, you must
msgstr ""
msgid "InviteMembersModal|Username or email address"
-msgstr ""
+msgstr "Ð†Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸Ñтувача або адреÑа електронної пошти"
msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
msgstr ""
@@ -25379,19 +25580,19 @@ msgid "Is using seat"
msgstr "ВикориÑтовує міÑце"
msgid "IssuableEvents|assigned to"
-msgstr ""
+msgstr "призначено"
msgid "IssuableEvents|removed review request for"
-msgstr ""
+msgstr "видалено запит на перевірку длÑ"
msgid "IssuableEvents|requested review from"
-msgstr ""
+msgstr "надіÑлано запит на перевірку від"
msgid "IssuableEvents|resolved all threads"
-msgstr ""
+msgstr "вирішено вÑÑ– теми"
msgid "IssuableEvents|unassigned"
-msgstr ""
+msgstr "непризначено"
msgid "IssuableStatus|%{wi_type} created %{created_at} by "
msgstr "%{wi_type} Ñтворено %{created_at} кориÑтувачем "
@@ -25714,6 +25915,9 @@ msgstr "ЗдаєтьÑÑ, наразі немає доÑтупних даних
msgid "It's you"
msgstr "Це ви"
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr "ТекÑÑ‚ курÑивом"
@@ -26071,9 +26275,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -26308,6 +26518,9 @@ msgstr "Ð—Ð°Ð²Ð´Ð°Ð½Ð½Ñ %{jobName}"
msgid "Job Failed #%{build_id}"
msgstr "Ð—Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð½ÐµÐ²Ð´Ð°Ð»Ðµ #%{build_id}"
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -26326,6 +26539,9 @@ msgstr "Ð—Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ðµ. Перевірте раннер
msgid "Job logs and artifacts"
msgstr "Журнали завдань та артефакти"
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr "Ð—Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð±ÑƒÐ»Ð¾ перезапущене"
@@ -26456,7 +26672,7 @@ msgid "Jobs"
msgstr "ЗавданнÑ"
msgid "Jobs fail if they run longer than the timeout time. Input value is in seconds by default. Human readable input is also accepted, for example %{code_open}1 hour%{code_close}."
-msgstr ""
+msgstr "Якщо Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð²Ð¸ÐºÐ¾Ð½ÑƒÑ”Ñ‚ÑŒÑÑ Ð´Ð¾Ð²ÑˆÐµ, ніж Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ, воно завершуєтьÑÑ Ð½ÐµÐ²Ð´Ð°Ñ‡ÐµÑŽ. За замовчуваннÑм Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð²Ð¾Ð´Ð¸Ñ‚ÑŒÑÑ Ñƒ Ñекундах. Також допуÑкаєтьÑÑ Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñƒ виглÑді, зрозумілому людині, наприклад %{code_open}1 hour%{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 "ЗавданнÑ, Ñтаріші за налаштований чаÑ, вважаютьÑÑ Ð¿Ñ€Ð¾Ñтроченими та архівуютьÑÑ. Заархівовані Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð±Ñ–Ð»ÑŒÑˆÐµ не можна повторити. Залиште пуÑтим, щоб ніколи не архівувати Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾. За замовчуваннÑм Ð¾Ð´Ð¸Ð½Ð¸Ñ†Ñ Ð²Ð¸Ð¼Ñ–Ñ€ÑŽÑ”Ñ‚ÑŒÑÑ Ð² днÑÑ…, але ви можете викориÑтовувати й інші одиниці, наприклад %{code_open}15 days%{code_close}, %{code_open}1 month%{code_close}, %{code_open}2 роки%{code_close}. Мінімальне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ â€“ 1 day."
@@ -26491,6 +26707,9 @@ msgstr "Ðемає завдань Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ"
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26653,6 +26872,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr "Ми не змогли знайти цей елемент"
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr "невдача дозволена"
@@ -26716,9 +26941,6 @@ msgstr "Зберігайте артефакти з оÑтанніх уÑпішн
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr "ДоÑтуп до Kerberos заборонено"
@@ -26895,7 +27117,7 @@ msgid "Labels can be applied to issues and merge requests to categorize them."
msgstr "Мітки можуть бути заÑтоÑовані до задач та запитів на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð´Ð»Ñ Ñ—Ñ… категоризації."
msgid "Labels can be applied to issues and merge requests. Group labels are available for any project within the group."
-msgstr ""
+msgstr "Мітки можна заÑтоÑовувати до задач Ñ– запитів на злиттÑ. Групові мітки доÑтупні Ð´Ð»Ñ Ð±ÑƒÐ´ÑŒ-Ñкого проєкту в групі."
msgid "Labels can be applied to issues and merge requests. Star a label to make it a priority label."
msgstr "Мітки можуть бути заÑтоÑовані до задач та запитів на злиттÑ. Позначте мітку, щоб зробити Ñ—Ñ— пріоритетною."
@@ -26940,6 +27162,9 @@ msgstr "ОÑтанні %{days} днів"
msgid "Last 2 weeks"
msgstr "ОÑтанні 2 тижні"
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27592,9 +27817,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr "ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñкопійовано"
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27742,8 +27964,8 @@ msgstr "Завантажити більше"
msgid "Loading snippet"
msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñніпета"
-msgid "Loading the GitLab IDE..."
-msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ IDE GitLab..."
+msgid "Loading the GitLab IDE"
+msgstr ""
msgid "Loading, please wait."
msgstr ""
@@ -27808,6 +28030,9 @@ msgstr "Заблоковані файли"
msgid "Locked the discussion."
msgstr "ДиÑкуÑÑ–ÑŽ закрито."
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr "Блокує обговореннÑ."
@@ -28000,9 +28225,12 @@ msgstr "Керувати проєктами"
msgid "Manage two-factor authentication"
msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð²Ð¾Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð¾ÑŽ автентифікацією"
-msgid "Manage your project's triggers"
+msgid "Manage usage"
msgstr ""
+msgid "Manage your project's triggers"
+msgstr "Керуйте тригерами вашого проєкту"
+
msgid "Manage your subscription"
msgstr "Керувати вашою підпиÑкою"
@@ -28033,6 +28261,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr "Зв’Ñзати обліковий Ð·Ð°Ð¿Ð¸Ñ FogBugz з кориÑтувачем GitLab"
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr "бер."
@@ -28090,6 +28321,9 @@ msgstr "Додати курÑивний текÑÑ‚ (%{modifierKey}I)"
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr "Додати курÑивний текÑÑ‚ (%{modifier_key}I)"
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr "Додати закреÑлений текÑÑ‚ (%{modifierKey}⇧X)"
@@ -28114,9 +28348,6 @@ msgstr "ВиÑтуп Ñ€Ñдка (%{modifier_key}[)"
msgid "MarkdownEditor|header"
msgstr "заголовок"
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr "ПідтримуєтьÑÑ %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-
msgid "Marked"
msgstr "Позначено"
@@ -28157,7 +28388,7 @@ msgid "Marks to do as done."
msgstr ""
msgid "Mask this variable in job logs if it meets %{linkStart}regular expression requirements%{linkEnd}."
-msgstr ""
+msgstr "МаÑкуйте цю змінну в журналах завдань, Ñкщо вона відповідає %{linkStart}вимогам регулÑрного виразу%{linkEnd}."
msgid "Mask variable"
msgstr "Приховати змінну"
@@ -28216,8 +28447,8 @@ msgstr "МакÑимальне значеннÑ"
msgid "Max authenticated Git LFS requests per period per user"
msgstr "МакÑимальна кількіÑÑ‚ÑŒ Git LFS запитів на період Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ ÑˆÐ²Ð¸Ð´ÐºÐ¾ÑÑ‚Ñ– на кориÑтувача з автентифікацією"
-msgid "Max file size is 200 KB."
-msgstr "МакÑимальний розмір файлу 200 KB."
+msgid "Max file size is 200 KiB."
+msgstr ""
msgid "Max role"
msgstr "МакÑимальна роль"
@@ -28267,8 +28498,8 @@ msgstr "МакÑимальний розмір артефактів (МБ)"
msgid "Maximum attachment size"
msgstr "МакÑимальний розмір вкладеннÑ"
-msgid "Maximum attachment size (MB)"
-msgstr "МакÑимальний розмір Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð½Ñ (МБ)"
+msgid "Maximum attachment size (MiB)"
+msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
msgstr "МакÑимальна кількіÑÑ‚ÑŒ автентифікованих запитів API за період дії тарифного Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ð° одного кориÑтувача"
@@ -28294,8 +28525,8 @@ msgstr "МакÑимальна затримка (хвилини)"
msgid "Maximum diff patch size"
msgstr "МакÑимальний розмір diff патчу"
-msgid "Maximum diff patch size (Bytes)"
-msgstr "МакÑимальний розмір diff патчу (байт)"
+msgid "Maximum diff patch size (bytes)"
+msgstr ""
msgid "Maximum duration of a session."
msgstr ""
@@ -28303,8 +28534,8 @@ msgstr ""
msgid "Maximum export size"
msgstr "МакÑимальний розмір екÑпорту"
-msgid "Maximum export size (MB)"
-msgstr "МакÑимальний розмір екÑпорту (МБ)"
+msgid "Maximum export size (MiB)"
+msgstr ""
msgid "Maximum field length"
msgstr "МакÑимальна довжина полÑ"
@@ -28339,8 +28570,8 @@ msgstr ""
msgid "Maximum import size"
msgstr "МакÑимальний розмір імпорту"
-msgid "Maximum import size (MB)"
-msgstr "МакÑимальний розмір Ð´Ð»Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚Ñƒ (МБ)"
+msgid "Maximum import size (MiB)"
+msgstr ""
msgid "Maximum job artifact size"
msgstr "МакÑимальний розмір артефакту у завданні"
@@ -28360,8 +28591,11 @@ msgstr "МакÑимальний розмір файлу пакета npm в бÐ
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
-msgstr "МакÑимальна кількіÑÑ‚ÑŒ змін (гілок або тегів) в одному надÑиланні, Ð´Ð»Ñ Ñких Ñпрацьовують веб хуки та ÑервіÑи (за замовчуваннÑм 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
msgid "Maximum number of comments exceeded"
msgstr "Перевищено макÑимальну кількіÑÑ‚ÑŒ коментарів"
@@ -28381,12 +28615,18 @@ msgstr "МакÑимальна кількіÑÑ‚ÑŒ запитів на хвили
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr "МакÑимальна кількіÑÑ‚ÑŒ запитів на хвилину Ð´Ð»Ñ Ð½ÐµÐ°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ¾Ð²Ð°Ð½Ð¾Ñ— IP-адреÑи"
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
-msgstr "МакÑимальна кількіÑÑ‚ÑŒ запитів на хвилину Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ неформатованого шлÑху (за замовчуваннÑм 300). Ð’Ñтановіть 0, щоб вимкнути регулюваннÑ."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
+msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr "МакÑимальна кількіÑÑ‚ÑŒ унікальних IP-Ð°Ð´Ñ€ÐµÑ Ð½Ð° кориÑтувача."
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -28411,8 +28651,8 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
-msgstr "МакÑимальний розмір Ð´Ð»Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ (МБ)"
+msgid "Maximum push size (MiB)"
+msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
msgstr ""
@@ -28444,8 +28684,8 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
-msgstr "МакÑимальний розмір Ñторінок (МБ)"
+msgid "Maximum size of pages (MiB)"
+msgstr ""
msgid "Maximum snippet size"
msgstr ""
@@ -28795,6 +29035,9 @@ msgstr "Ðналітика запиту на злиттÑ"
msgid "Merge request approvals"
msgstr "Ð—Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñ–Ð² на злиттÑ"
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr "Коміти запиту на злиттÑ"
@@ -28813,6 +29056,9 @@ msgstr "Звіти по запиту на злиттÑ"
msgid "Merge request status"
msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ на злиттÑ"
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28930,9 +29176,6 @@ msgstr "Коментарі в Ñ€Ñдках %{selectStart}почали%{selectEnd
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr "Виникла помилка під Ñ‡Ð°Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ñ‡ÐµÑ€Ð½ÐµÑ‚ÐºÐ¸ коментарÑ."
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28960,9 +29203,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr "ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñкопійовано"
-msgid "MergeRequests|Saving the comment failed"
-msgstr "Помилка при збереженні коментарÑ"
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28987,6 +29227,9 @@ msgstr "ПереглÑнути файл @ %{commitId}"
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr "ПереглÑнути замінений файл Ñтаном на %{commitId}"
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr "прокоментував (-ла) коміт %{commitLink}"
@@ -29053,6 +29296,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr "Пошук (наприклад, *.vue) (%{MODIFIER_KEY}P)"
+msgid "MergeRequest|Summaries are written by AI"
+msgstr "Резюме пише штучний інтелект"
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr "%{sourceTopic} буде видалено"
@@ -29149,9 +29404,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr "Метрики"
-
msgid "Metrics - Grafana"
msgstr "Метрики - Grafana"
@@ -29206,217 +29458,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr "Додати метрику"
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr "Сер"
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr "СкаÑувати"
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr "Перевірте документацію CI/CD щодо Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð² Ñередовищі"
-
-msgid "Metrics|Collapse panel"
-msgstr "Згорнути панель"
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr "Згорнути панель (Esc)"
-
-msgid "Metrics|Copy YAML"
-msgstr "Копіювати YAML"
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr "Створити метрику"
-msgid "Metrics|Create new dashboard"
-msgstr "Створити нову панель керуваннÑ"
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr "Створити файл конфігурації панелі керуваннÑ"
-
-msgid "Metrics|Current"
-msgstr "Поточні"
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr "Видалити метрику"
msgid "Metrics|Delete metric?"
msgstr "Видалити метрику?"
-msgid "Metrics|Duplicate"
-msgstr "Дублікат"
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr "ДублюваннÑ..."
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] "Редагувати метрику"
-msgstr[1] "Редагувати метрики"
-msgstr[2] "Редагувати метрик"
-msgstr[3] "Редагувати метрик"
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr "Ð”Ð»Ñ Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð´Ñ–Ð±Ð½Ð¸Ñ… метрик"
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr "Мітка оÑÑ– y (зазвичай Ð¾Ð´Ð¸Ð½Ð¸Ñ†Ñ Ð²Ð¸Ð¼Ñ–Ñ€ÑŽÐ²Ð°Ð½Ð½Ñ). Ð’Ñ–ÑÑŒ x завжди позначає чаÑ."
msgid "Metrics|Legend label (optional)"
msgstr "Заголовок легенди (необов’Ñзковий)"
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr "ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¼Ñ–Ñтить недійÑне чаÑове вікно, будь лаÑка, перевірте чаÑове вікно в запиті."
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr "МакÑ"
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr "Додаткові дії"
-
msgid "Metrics|Must be a valid PromQL query."
msgstr "Має бути коректним запитом PromQL."
msgid "Metrics|New metric"
msgstr "Ðова метрика"
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr "Запит PromQL Ñ” дійÑним"
msgid "Metrics|Prometheus Query Documentation"
msgstr "Ð”Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ñ–Ñ Ð¿Ð¾ запитам Prometheus"
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr "Виберіть значеннÑ"
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ð°Ð½ÐµÐ»Ñ– керуваннÑ."
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ð°Ð½ÐµÐ»Ñ– керуваннÑ. %{error}"
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при отриманні анотацій. Будь лаÑка, Ñпробуйте ще раз."
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr "ТрапилаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ— про Ñередовища. Будь лаÑка, Ñпробуйте ще раз"
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ— про анотації."
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr "ТрапилаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ— про розгортаннÑ."
-
-msgid "Metrics|There was an error getting environments information."
-msgstr "ТрапилаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ— про Ñередовища."
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr "Помилка при перевірці вашого запиту"
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr "ТрапилаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¼ÐµÑ‚Ñ€Ð¸Ðº"
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¼ÐµÑ‚Ñ€Ð¸Ðº. %{message}"
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr "Ðеочікувана відповідь про Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð²Ñ–Ð´ кінцевої точки Prometheus"
-
msgid "Metrics|Unit label"
msgstr "Одиниці вимірюваннÑ"
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr "ВикориÑтовуєтьÑÑ Ñк заголовок графіка"
@@ -29426,24 +29506,12 @@ msgstr "ВикориÑтовуєтьÑÑ, Ñкщо запит повертає Ñ
msgid "Metrics|Validating query"
msgstr "Перевірка запиту"
-msgid "Metrics|Values"
-msgstr "ЗначеннÑ"
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr "Ðазва оÑÑ– Y"
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr "Ви можете зберегти копію цієї панелі ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾ вашого репозиторію так, щоб Ñ—Ñ— можна було налаштувати. Виберіть ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ Ñ– гілку Ð´Ð»Ñ Ñ—Ñ— збереженнÑ."
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr "Ви збираєтеÑÑ Ð¾Ñтаточно видалити цю метрику. Це не можна відмінити."
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr "напр. HTTP-запити"
@@ -29832,6 +29900,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29868,6 +29939,9 @@ msgstr "Закрити"
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr "Змінено"
@@ -29928,9 +30002,6 @@ msgstr "Детальніше"
msgid "More information is available|here"
msgstr "тут"
-msgid "More information."
-msgstr "Докладніше."
-
msgid "More options"
msgstr ""
@@ -30094,7 +30165,7 @@ msgid "Name new label"
msgstr "Ðазвіть нову мітку"
msgid "Name to be used as the sender for emails from Service Desk."
-msgstr ""
+msgstr "Ім'Ñ, Ñке буде викориÑтовуватиÑÑ Ñк відправник Ð´Ð»Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¸Ñ… лиÑтів від Ñлужби підтримки."
msgid "Name:"
msgstr "Ім’Ñ:"
@@ -30108,6 +30179,12 @@ msgstr "ID проÑтору імен:"
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr "ПроÑÑ‚Ñ–Ñ€ імен або група Ð´Ð»Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚Ñƒ репозиторію не Ñ–Ñнує."
@@ -30860,12 +30937,6 @@ msgstr "Ðе потрібна кредитна картка."
msgid "No data available"
msgstr "Ðемає даних"
-msgid "No data found"
-msgstr "Даних не знайдено"
-
-msgid "No data to display"
-msgstr "Ðемає даних Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ"
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -31004,9 +31075,6 @@ msgstr "ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ðµ вибрано"
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr "Ðе знайдено пов'Ñзаних запитів на злиттÑ."
-
msgid "No repository"
msgstr "Ðемає репозиторію"
@@ -31049,6 +31117,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr "Ðіхто з тих, хто додав в обране не задовільнÑÑ” вашому пошуку"
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr "Пропозицій не знайдено"
@@ -31194,9 +31265,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr "Примітка"
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr "ПідтримуєтьÑÑ %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. Ð”Ð»Ñ %{quickActionsDocsLinkStart}швидких дій%{quickActionsDocsLinkEnd}, введіть %{keyboardStart}/%{keyboardEnd}."
-
msgid "Notes"
msgstr "Ðотатки"
@@ -31501,6 +31569,9 @@ msgstr "Ðвтор коміту"
msgid "Notify|Committed by"
msgstr "Закомічено"
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr "Ðе хочете отримувати Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ адмініÑтраторів GitLab?"
@@ -31606,18 +31677,24 @@ msgstr "Ðемає попереднього переглÑду Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
-msgstr "Конвеєр #%{pipeline_id} вийшов з ладу!"
-
msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr "Конвеєр %{pipeline_link} запущено"
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
-msgstr "Конвеєр виправлено, і #%{pipeline_id} виконано!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
+msgstr ""
+
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
+msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31792,6 +31869,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr "OK"
@@ -32046,7 +32126,7 @@ msgid "OnDemandScans|Add a schedule to run this scan at a specified date and tim
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 ""
+msgstr "Проаналізуйте розгорнуту верÑÑ–ÑŽ вашого вебзаÑтоÑунку на наÑвніÑÑ‚ÑŒ відомих вразливоÑтей, доÑлідивши його ззовні. DAST працює, імітуючи зовнішні атаки на ваш заÑтоÑунок під Ñ‡Ð°Ñ Ð¹Ð¾Ð³Ð¾ роботи."
msgid "OnDemandScans|Are you sure you want to delete this scan?"
msgstr ""
@@ -32472,6 +32552,12 @@ msgstr "УпорÑдкований ÑпиÑок"
msgid "Organizations"
msgstr "ОрганізаціÑ"
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32995,6 +33081,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33221,7 +33319,7 @@ msgid "Participants"
msgstr "УчаÑники"
msgid "Pass job variables"
-msgstr ""
+msgstr "Передати змінні завданнÑ"
msgid "Passed"
msgstr "УÑпішно пройдено"
@@ -33317,7 +33415,7 @@ msgid "Patch to apply"
msgstr "Патч Ð´Ð»Ñ Ð·Ð°ÑтоÑуваннÑ"
msgid "Patches"
-msgstr ""
+msgstr "Патчі"
msgid "Path"
msgstr "ШлÑÑ…"
@@ -33565,9 +33663,6 @@ msgstr "Розклади Конвеєрів"
msgid "Pipeline URL"
msgstr "URL Конвеєра"
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33635,7 +33730,7 @@ msgid "PipelineEditorFileTree|When you use the include keyword to add pipeline c
msgstr ""
msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
-msgstr "ПереглÑньте %{linkStart}прикладів та шаблонів CI/CD%{linkEnd}"
+msgstr "ПереглÑнути %{linkStart}приклади та шаблони CI/CD%{linkEnd}"
msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr "Закомітити файл до вашого репозиторію. ПіÑÐ»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ конвеєр запуÑтитьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾."
@@ -33769,6 +33864,15 @@ msgstr "Ðктивні"
msgid "PipelineSchedules|All"
msgstr "Ð’ÑÑ–"
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr "Ви впевнені, що хочете видалити цей розклад Ð´Ð»Ñ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ð°?"
@@ -33778,6 +33882,9 @@ msgstr "Може мати кориÑтувацькі змінні CI/CD."
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr "Створити новий розклад конвеєра"
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr "ЧаÑовий поÑÑ Cron"
@@ -33835,9 +33942,6 @@ msgstr "Виконує Ð´Ð»Ñ Ð¿ÐµÐ²Ð½Ð¾Ñ— гілки або тегу."
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr "УÑпішно заплановано конвеєр Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку. Перейдіть на Ñторінку %{linkStart}Конвеєрів%{linkEnd} Ð´Ð»Ñ Ð´ÐµÑ‚Ð°Ð»ÐµÐ¹. "
@@ -34024,9 +34128,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr "ОчиÑтити кеш раннер"
@@ -34115,7 +34216,7 @@ msgid "Pipelines|Need more information to set up your runner? %{linkStart}Check
msgstr ""
msgid "Pipelines|No triggers have been created yet. Add one using the form above."
-msgstr ""
+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 ""
@@ -34138,6 +34239,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr "Відкликати тригер"
@@ -34178,20 +34282,17 @@ msgid "Pipelines|There was an error fetching the pipelines. Try again in a few m
msgstr "Помилка при отриманні конвеєрів. Спробуйте знову через декілька хвилин, або звернітьÑÑ Ð´Ð¾ Ñлужби підтримки."
msgid "Pipelines|This GitLab CI configuration is invalid. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
+msgstr "Ð¦Ñ ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ GitLab CI недійÑна. %{linkStart}ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ%{linkEnd}"
msgid "Pipelines|This GitLab CI configuration is invalid:"
msgstr "Ð¦Ñ ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ GitLab CI недійÑна:"
msgid "Pipelines|This GitLab CI configuration is invalid: %{reason}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
+msgstr "Ð¦Ñ ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ GitLab CI недійÑна: %{reason}. %{linkStart}ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ%{linkEnd}"
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -34210,7 +34311,7 @@ msgstr "Цей проєкт в даний Ñ‡Ð°Ñ Ð½Ðµ налаштований Ð
msgid "Pipelines|Token"
msgstr "Токен"
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -34270,9 +34371,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr "помилка"
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr "недійÑний"
@@ -34339,6 +34446,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr "Конвеєр результату злиттÑ"
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr "Виконано"
@@ -34423,6 +34536,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr "Ð”Ð»Ñ Ð·Ð°Ð¿ÑƒÑку конвеєра запиту на злиттÑ, Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð² файлі конфігурації CI/CD %{linkStart}повинні бути налаштовані%{linkEnd} Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку в конвеєрах запиту на злиттÑ."
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr "Ðвтор тригера"
@@ -34549,9 +34665,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34702,8 +34815,8 @@ msgstr "Будь лаÑка, Ñпробуйте ще раз"
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
-msgstr "Будь лаÑка, введіть %{phrase_code} Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ закрийте це модальне вікно Ð´Ð»Ñ Ð²Ñ–Ð´Ð¼Ñ–Ð½Ð¸."
+msgid "Please type %{phrase_code} to proceed."
+msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
msgstr ""
@@ -35009,7 +35122,7 @@ msgid "Prevent outdated deployment jobs"
msgstr "Запобігти заÑтарілим завданнÑм розгортаннÑ"
msgid "Prevent project forking outside current group"
-msgstr ""
+msgstr "Запобігти Ñтворенню форку проєкту за межами поточної групи"
msgid "Prevent users from changing their profile name"
msgstr "Заборонити кориÑтувачам змінювати ім'Ñ Ñвого профілю"
@@ -35218,6 +35331,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -35257,6 +35373,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -35398,6 +35517,9 @@ msgstr "о"
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr "Ви збираєтеÑÑ Ð¾Ñтаточно видалити %{yourAccount}, а також вÑÑ– задачі, запити на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ñ‚Ð° групи, пов'Ñзані з вашим обліковим запиÑом. ПіÑÐ»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ %{deleteAccount}, його неможливо буде відновити."
+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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr "Ви збираєтеÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача %{currentUsernameBold} на %{newUsernameBold}. Профіль та проєкти будуть перенаправлÑтиÑÑ Ð½Ð° проÑÑ‚Ñ–Ñ€ імен %{newUsername}, але таке Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡Ð¸Ñ‚ÑŒÑÑ, коли проÑÑ‚Ñ–Ñ€ імен %{currentUsername} буде зареєÑтровано на іншого кориÑтувача або групу. Будь лаÑка, оновіть віддалені адреÑи в репозиторіÑÑ… Git Ñкомога швидше."
@@ -35914,9 +36036,6 @@ msgstr "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ проєкт:"
msgid "Project information"
msgstr "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ проєкт"
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr "УчаÑники проєкту"
@@ -36284,7 +36403,7 @@ msgid "ProjectSettings|Allow"
msgstr "Дозволити"
msgid "ProjectSettings|Allow anyone to pull from Package Registry"
-msgstr ""
+msgstr "Дозволити будь-кому отримувати дані з реєÑтру пакетів"
msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr ""
@@ -36296,7 +36415,7 @@ msgid "ProjectSettings|Analytics Dashboards"
msgstr ""
msgid "ProjectSettings|Anyone can pull packages with a package manager API."
-msgstr ""
+msgstr "Будь-хто може отримувати пакети за допомогою API менеджера пакетів."
msgid "ProjectSettings|Auto-close referenced issues on default branch"
msgstr "Ðвто-Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð·Ð°Ð»ÐµÐ¶Ð½Ð¸Ñ… задач у гілці за замовчуваннÑм"
@@ -36341,7 +36460,7 @@ msgid "ProjectSettings|Configure analytics features for this project"
msgstr "Ðалаштувати функції аналітики Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проєкту"
msgid "ProjectSettings|Configure your infrastructure."
-msgstr ""
+msgstr "Ðалаштуйте вашу інфраÑтруктуру."
msgid "ProjectSettings|Connect to your instance"
msgstr ""
@@ -36395,7 +36514,7 @@ msgid "ProjectSettings|Every project can have its own space to store its Docker
msgstr "Кожен проєкт може мати влаÑний проÑÑ‚Ñ–Ñ€ Ð´Ð»Ñ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ñвоїх образів Docker"
msgid "ProjectSettings|Every project can make deployments to environments either via CI/CD or API calls. Non-project members have read-only access."
-msgstr ""
+msgstr "Кожен проєкт може розгортати Ñередовища за допомогою CI/CD або викликів API. УчаÑники, Ñкі не Ñ” учаÑниками проєкту, мають доÑтуп лише Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ."
msgid "ProjectSettings|Everyone"
msgstr "Ð’ÑÑ–"
@@ -36454,18 +36573,6 @@ msgstr "Внутрішній"
msgid "ProjectSettings|Issues"
msgstr "Задачі"
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36518,7 +36625,7 @@ msgid "ProjectSettings|Model experiments"
msgstr ""
msgid "ProjectSettings|Monitor"
-msgstr ""
+msgstr "Моніторинг"
msgid "ProjectSettings|Monitor the health of your project and respond to incidents."
msgstr "ВідÑтежуйте Ñтан вашого проєкту та реагуйте на інциденти."
@@ -36593,7 +36700,7 @@ msgid "ProjectSettings|Requirements management system."
msgstr "СиÑтема ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð²Ð¸Ð¼Ð¾Ð³Ð°Ð¼Ð¸."
msgid "ProjectSettings|Roll out new features without redeploying with feature flags."
-msgstr ""
+msgstr "Впроваджуйте нові функції без повторного Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð·Ð° допомогою перемикачів функцій."
msgid "ProjectSettings|Search for topic"
msgstr "Пошук теми"
@@ -36649,9 +36756,6 @@ msgstr "Відправити зміни Ð´Ð»Ñ Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð² батьківÑÑ
msgid "ProjectSettings|Target project"
msgstr "Цільовий проєкт"
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36673,9 +36777,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36701,7 +36802,7 @@ msgid "ProjectSettings|Topics are publicly visible even on private projects. Do
msgstr "Теми Ñ” загальнодоÑтупними навіть у приватних проєктах. Ðе включайте конфіденційну інформацію в назви тем. %{linkStart}ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ%{linkEnd}."
msgid "ProjectSettings|Track machine learning model experiments and artifacts."
-msgstr ""
+msgstr "ВідÑтежуйте екÑперименти та артефакти моделі машинного навчаннÑ."
msgid "ProjectSettings|Transfer project"
msgstr "ПеренеÑти проєкт"
@@ -36712,10 +36813,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36971,7 +37069,7 @@ msgid "ProjectsNew|An error occurred while checking group path. Please refresh a
msgstr ""
msgid "ProjectsNew|Analyze your source code for known security vulnerabilities."
-msgstr ""
+msgstr "Ðналізуйте ваш вихідний код з відомих уразливоÑтей безпеки."
msgid "ProjectsNew|Connect your external repository to GitLab CI/CD."
msgstr "Підключіть Ñвій зовнішній репозиторій до GitLab CI/CD."
@@ -37001,7 +37099,7 @@ msgid "ProjectsNew|Description format"
msgstr "Формат опиÑу"
msgid "ProjectsNew|Enable Static Application Security Testing (SAST)"
-msgstr ""
+msgstr "Увімкнути Ñтатичне теÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÐµÐ·Ð¿ÐµÐºÐ¸ заÑтоÑунків (SAST)"
msgid "ProjectsNew|Group name"
msgstr ""
@@ -37064,7 +37162,7 @@ msgid "ProjectsNew|Visibility Level"
msgstr "Рівень видимоÑÑ‚Ñ–"
msgid "ProjectsNew|Want to organize several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
-msgstr "Бажаєте організувати кілька залежних проєктів в одному проÑторі імен? %{link_start}Створіть групу.%{link_end}"
+msgstr "Хочете організувати кілька залежних проєктів в одному проÑторі назв? %{link_start}Створити групу.%{link_end}"
msgid "ProjectsNew|You can always change your URL later"
msgstr ""
@@ -37198,6 +37296,9 @@ msgstr "ПеренеÑти мітку на рівень групи"
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr "Лише проєктні етапи можуть бути перенеÑені."
@@ -37213,6 +37314,9 @@ msgstr "Задачу перетворено на епік."
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -38001,9 +38105,6 @@ msgstr ""
msgid "Query"
msgstr "Запит"
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr "У черзі"
@@ -38076,6 +38177,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про %{changes_link_start}зміни%{link_end}, %{vision_link_start}баченнÑ%{link_end} та %{design_link_start}дизайн%{link_end}."
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr "Прочитайте їх документацію."
@@ -38260,7 +38364,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -38272,7 +38376,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -38287,18 +38391,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr "Ваш перший проєкт"
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38516,14 +38608,14 @@ msgstr ""
msgid "Remove access"
msgstr "Видалити доÑтуп"
-msgid "Remove all or specific assignee(s)"
-msgstr "Видалити уÑÑ–Ñ… або певного(них) виконацÑ(ів)"
+msgid "Remove all or specific assignees"
+msgstr ""
msgid "Remove all or specific label(s)"
msgstr "Видалити уÑÑ– або певні мітки(-ку)"
-msgid "Remove all or specific reviewer(s)"
-msgstr "Видалити уÑÑ–Ñ… або певного(них) оглÑдача(ів)"
+msgid "Remove all or specific reviewers"
+msgstr ""
msgid "Remove approvers"
msgstr "Видалити затверджуючих оÑіб"
@@ -38783,6 +38875,9 @@ msgstr "Подовжити підпиÑку"
msgid "Reopen"
msgstr "Відкрити знову"
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr "Повторно відкрити %{issueType}"
@@ -38807,6 +38902,9 @@ msgstr "Повторно відкрити %{quick_action_target}"
msgid "Reopened this %{quick_action_target}."
msgstr "Повторно відкрито %{quick_action_target}."
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38825,6 +38923,9 @@ msgstr "Замінити вÑÑ– мітки(-ку)"
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -39236,8 +39337,8 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
-msgstr "Розмір репозиторію (МБ)"
+msgid "Repository size limit (MiB)"
+msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ð° розмір репозиторію (МіБ)"
msgid "Repository storage"
msgstr "Сховище репозиторію"
@@ -39431,7 +39532,7 @@ msgid "Resolve"
msgstr "Вирішити"
msgid "Resolve all with new issue"
-msgstr ""
+msgstr "Вирішити вÑе новою задачею"
msgid "Resolve any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
msgstr ""
@@ -39621,9 +39722,6 @@ msgstr[1] "%d ОглÑдача"
msgstr[2] "%d ОглÑдачів"
msgstr[3] "%d ОглÑдачів"
-msgid "Reviewer(s)"
-msgstr "ОглÑдач(Ñ–)"
-
msgid "Reviewers"
msgstr "ОглÑдачі"
@@ -39669,12 +39767,21 @@ msgstr ""
msgid "Role"
msgstr "Роль"
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr "Відкотити"
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr "Ruby"
@@ -39835,6 +39942,9 @@ msgstr "Amazon Linux 2 Docker HA з ручним маÑштабуваннÑм Ñ–
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ. ДеÑкі раннери не були видалені."
@@ -39940,6 +40050,9 @@ msgstr "Створено %{timeAgo}"
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr "Панель керуваннÑ"
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] "Видалити %d раннер"
@@ -39947,6 +40060,9 @@ msgstr[1] "Видалити %d раннера"
msgstr[2] "Видалити %d раннерів"
msgstr[3] "Видалити %d раннерів"
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr "Видалити раннер"
@@ -40007,9 +40123,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr "Фільтр проєктів"
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr "Розпочати роботу з раннерами"
@@ -40119,7 +40232,7 @@ msgid "Runners|New instance runner"
msgstr "Ðовий інÑÑ‚Ð°Ð½Ñ Ñ€Ð°Ð½Ð½ÐµÑ€Ð°"
msgid "Runners|New project runner"
-msgstr ""
+msgstr "Ðовий раннер проєкту"
msgid "Runners|New project runners can be registered"
msgstr "Можна реєÑтрувати нових раннерів проєкту"
@@ -40185,6 +40298,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Runners|Platform"
msgstr "Платформа"
@@ -40192,7 +40312,7 @@ msgid "Runners|Project"
msgstr "Проєкт"
msgid "Runners|Project runners"
-msgstr ""
+msgstr "Раннери проєкту"
msgid "Runners|Project › CI/CD Settings › Runners"
msgstr ""
@@ -40417,7 +40537,7 @@ msgid "Runners|Stop the runner from accepting new jobs."
msgstr "Заборонити раннеру приймати нові завданнÑ."
msgid "Runners|Support for registration tokens is deprecated"
-msgstr ""
+msgstr "Підтримка Ð´Ð»Ñ Ñ€ÐµÑ”Ñтрації токенів заÑтаріла"
msgid "Runners|System ID"
msgstr "Ідентифікатор ÑиÑтеми"
@@ -40438,13 +40558,17 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr "Проєкт, група або інÑтанÑ, де зареєÑтровано раннер. ІнÑÑ‚Ð°Ð½Ñ Ñ€Ð°Ð½Ð½ÐµÑ€Ð¸ завжди належать адмініÑтратору."
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d 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[3] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
msgid "Runners|These runners are assigned to this project."
-msgstr ""
+msgstr "Ці раннери призначені Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проєкту."
msgid "Runners|This group currently has 1 stale runner."
msgid_plural "Runners|This group currently has %d stale runners."
@@ -40759,10 +40883,13 @@ msgstr "ЗбереженнÑ"
msgid "Saving project."
msgstr "Ð—Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ."
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
-msgstr "%{period} %{days} на %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
+msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40771,12 +40898,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40795,6 +40943,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr "Вибрати агента"
@@ -40810,6 +40961,9 @@ msgstr "Виберіть профіль Ñканера"
msgid "ScanExecutionPolicy|Select site profile"
msgstr "Вибрати профіль Ñайту"
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr "Профіль Ñайту"
@@ -40819,6 +40973,9 @@ msgstr "Теги"
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr "агент"
@@ -40831,6 +40988,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr "у проÑторі імен"
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40852,6 +41015,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40900,6 +41066,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -41364,7 +41533,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про Coverage-Check"
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -41388,14 +41557,11 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
msgid "SecurityConfiguration|Configuration history"
-msgstr ""
+msgstr "ІÑÑ‚Ð¾Ñ€Ñ–Ñ ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ—"
msgid "SecurityConfiguration|Configure %{feature}"
msgstr ""
@@ -41428,22 +41594,22 @@ msgid "SecurityConfiguration|Enable incubating Breach and Attack Simulation focu
msgstr ""
msgid "SecurityConfiguration|Enable security training to help your developers learn how to fix vulnerabilities. Developers can view security training from selected educational providers, relevant to the detected vulnerability."
-msgstr ""
+msgstr "Увімкніть Ð½Ð°Ð²Ñ‡Ð°Ð½Ð½Ñ Ð· безпеки, щоб допомогти вашим розробникам дізнатиÑÑ Ñк виправити вразливоÑÑ‚Ñ–. Розробники можуть переглÑдати Ð½Ð°Ð²Ñ‡Ð°Ð½Ð½Ñ Ð· безпеки від вибраних оÑвітніх провайдерів, що ÑтоÑуютьÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¾Ñ— вразливоÑÑ‚Ñ–."
msgid "SecurityConfiguration|Enabled"
msgstr ""
msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups"
-msgstr ""
+msgstr "СтатиÑтика вразливоÑтей виÑокого Ñ€Ñ–Ð²Ð½Ñ Ð² проєктах Ñ– групах"
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
-msgstr ""
+msgstr "Ðегайно розпочніть аналіз ризиків та Ñ—Ñ… уÑÑƒÐ½ÐµÐ½Ð½Ñ Ð·Ð° допомогою заÑобів захиÑту заÑтоÑунків. Почніть з SAST та ВиÑÐ²Ð»ÐµÐ½Ð½Ñ Ð¡ÐµÐºÑ€ÐµÑ‚Ñ–Ð², доÑтупних Ð´Ð»Ñ Ð²ÑÑ–Ñ… тарифних планів. Оновіть тарифний план до Ultimate, щоб отримати вÑÑ– функції, включаючи:"
msgid "SecurityConfiguration|Incubating feature"
msgstr ""
msgid "SecurityConfiguration|Learn more about vulnerability training"
-msgstr ""
+msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про Ð½Ð°Ð²Ñ‡Ð°Ð½Ð½Ñ Ð· питань вразливоÑтей"
msgid "SecurityConfiguration|Manage corpus"
msgstr ""
@@ -41455,10 +41621,10 @@ msgid "SecurityConfiguration|Manage profiles"
msgstr ""
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
-msgstr ""
+msgstr "Керувати профілÑми Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´ Ñ‡Ð°Ñ ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ DAST."
msgid "SecurityConfiguration|More scan types, including DAST, Dependency Scanning, Fuzzing"
-msgstr ""
+msgstr "Більше типів ÑкануваннÑ, зокрема DAST, ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð»ÐµÐ¶Ð½Ð¾Ñтей, Fuzzing"
msgid "SecurityConfiguration|Not enabled"
msgstr "Ðе увімкнено"
@@ -41473,10 +41639,7 @@ msgid "SecurityConfiguration|Quickly enable all continuous testing and complianc
msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
-msgstr ""
-
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
+msgstr "Метрики безпеки Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ñередовищ заÑтоÑунків"
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41488,7 +41651,7 @@ msgid "SecurityConfiguration|Security testing"
msgstr "ТеÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÐµÐ·Ð¿ÐµÐºÐ¸"
msgid "SecurityConfiguration|Security training"
-msgstr ""
+msgstr "ÐÐ°Ð²Ñ‡Ð°Ð½Ð½Ñ Ð· питань безпеки"
msgid "SecurityConfiguration|Simulate breach and attack scenarios against your running application by attempting to detect and exploit known vulnerabilities."
msgstr ""
@@ -41506,10 +41669,10 @@ msgid "SecurityConfiguration|Using custom settings. You won't receive automatic
msgstr ""
msgid "SecurityConfiguration|Vulnerability Management"
-msgstr ""
+msgstr "Ð£Ð¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð²Ñ€Ð°Ð·Ð»Ð¸Ð²Ð¾ÑÑ‚Ñми"
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
-msgstr ""
+msgstr "Деталі та ÑтатиÑтика вразливоÑтей у запиті на злиттÑ"
msgid "SecurityOrchestration| and "
msgstr ""
@@ -41592,6 +41755,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41715,6 +41881,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41757,7 +41926,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41902,6 +42071,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -42295,6 +42467,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -42475,8 +42650,8 @@ msgstr ""
msgid "Select assignee"
msgstr "Виберіть виконавцÑ"
-msgid "Select assignee(s)"
-msgstr "Вибрати виконавцÑ(ців)"
+msgid "Select assignees"
+msgstr ""
msgid "Select branch"
msgstr "Виберіть гілку"
@@ -42538,11 +42713,17 @@ msgstr "Вибрати проєкт Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ %{type}"
msgid "Select projects"
msgstr "Вибрати проєкти"
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr "Виберіть звіт"
-msgid "Select reviewer(s)"
-msgstr "Вибрати оглÑдача(ів)"
+msgid "Select reviewers"
+msgstr ""
msgid "Select severity (optional)"
msgstr ""
@@ -42688,11 +42869,14 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
msgid "Service Desk"
-msgstr "Service Desk"
+msgstr "Служба підтримки"
msgid "Service Desk allows people to create issues in your GitLab instance without their own user account. It provides a unique email address for end users to create issues in a project. Replies can be sent either through the GitLab interface or by email. End users only see threads through email."
msgstr ""
@@ -42718,6 +42902,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42727,6 +42914,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42736,6 +42929,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42763,6 +42959,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr "СервіÑний пінг вимкнено"
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr "Щоб переглÑнути аналітику на рівні інÑтанÑів, попроÑÑ–Ñ‚ÑŒ адмініÑтратора увімкнути %{docLinkStart}ÑервіÑний пінг%{docLinkEnd}."
@@ -43073,6 +43275,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -43157,7 +43368,7 @@ msgstr "Показати повний неформатований журнал"
msgid "Show details"
msgstr "Показати подробиці"
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -43166,9 +43377,6 @@ msgstr "Показати файловий менеджер"
msgid "Show file contents"
msgstr "Показати вміÑÑ‚ файлу"
-msgid "Show filters"
-msgstr "Показати фільтри"
-
msgid "Show full blame"
msgstr ""
@@ -43245,7 +43453,7 @@ msgid "ShowcaseSecurity|Enable Secret Detection"
msgstr "Увімкнути Ñекретне виÑвленнÑ"
msgid "ShowcaseSecurity|Enable Static Application Security Testing (SAST)"
-msgstr ""
+msgstr "Увімкнути Ñтатичне теÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÐµÐ·Ð¿ÐµÐºÐ¸ заÑтоÑунків (SAST)"
msgid "ShowcaseSecurity|Find out if your external libraries are safe. Run dependency scanning jobs that check for known vulnerabilities in your external libraries."
msgstr ""
@@ -43479,8 +43687,8 @@ msgstr "Розмір"
msgid "Size Limits"
msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ð¼Ñ–Ñ€Ñƒ"
-msgid "Size limit per repository (MB)"
-msgstr "МакÑимальний розмір Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ репозиторію (МБ)"
+msgid "Size limit per repository (MiB)"
+msgstr ""
msgid "Skip to main content"
msgstr ""
@@ -43504,7 +43712,7 @@ msgid "Slack logo"
msgstr ""
msgid "Slack notifications integration is deprecated"
-msgstr ""
+msgstr "Ð†Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ Slack Ñповіщень заÑтаріла"
msgid "Slack notifications will be brought into the GitLab for Slack app so you can manage both integrations from one place. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -43704,6 +43912,9 @@ msgstr "Ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ (напр. test.rb)"
msgid "Snippets|Files"
msgstr "Файли"
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -44274,6 +44485,9 @@ msgstr "Ð—Ð°Ð¿Ð¸Ñ Ð¿Ñ€Ð¾ Ñпам уÑпішно анульовано."
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr "Вказана URL-адреÑа не може бути викориÑтана: \"%{reason}\""
@@ -44412,9 +44626,6 @@ msgstr ""
msgid "Start merge train"
msgstr "Створити ланцюжок змін"
-msgid "Start merge train when pipeline succeeds"
-msgstr "Створити ланцюжок змін піÑÐ»Ñ ÑƒÑпішного Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ð°"
-
msgid "Start merge train..."
msgstr ""
@@ -44616,9 +44827,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr "Будьте в курÑÑ– продуктивноÑÑ‚Ñ– та Ñтану вашого Ñередовища шлÑхом Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Prometheus Ð´Ð»Ñ Ð¼Ð¾Ð½Ñ–Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ñƒ ваших розгортань."
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44667,7 +44875,7 @@ msgstr "Ðевідомо"
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr "Зберігайте файли, плануйте Ñвою роботу, Ñпівпрацюйте над кодом тощо."
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -45102,6 +45310,12 @@ msgstr "ПідÑумок / примітка"
msgid "Summary comment (optional)"
msgstr "Короткий коментар (необов'Ñзково)"
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr "Ðед"
@@ -45331,11 +45545,11 @@ msgstr "Перейти в гілку/тег"
msgid "Switch to GitLab Next"
msgstr "Перейти на GitLab Next"
-msgid "Switch to Markdown"
-msgstr "ПереключитиÑÑ Ð½Ð° Markdown"
+msgid "Switch to plain text editing"
+msgstr ""
-msgid "Switch to rich text"
-msgstr "ПереключитиÑÑ Ð½Ð° форматований текÑÑ‚"
+msgid "Switch to rich text editing"
+msgstr ""
msgid "Switch to the source to copy the file contents"
msgstr "Перейдіть до джерела, щоб Ñкопіювати вміÑÑ‚ файлу"
@@ -45598,7 +45812,7 @@ msgstr "захищений"
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45686,6 +45900,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr "Ðомер телефону"
@@ -45693,7 +45922,7 @@ msgid "Template"
msgstr "Шаблон"
msgid "Template to append to all Service Desk issues"
-msgstr "Шаблон Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð´Ð¾ вÑÑ–Ñ… задач Service Desk"
+msgstr "Шаблон Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð´Ð¾ вÑÑ–Ñ… задач Ñлужби підтримки"
msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
@@ -45862,9 +46091,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr "Команда Terraform init"
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr "Стани terraform"
@@ -46123,9 +46349,6 @@ msgstr "Трекер задач — це міÑце, де можна додатÐ
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr "Трекер задач — це міÑце, де можна додати речі, Ñкі потрібно покращити або розв’Ñзати в проєкті. Ви можете зареєÑтруватиÑÑ Ð°Ð±Ð¾ увійти, щоб Ñтворювати задачу в цьому проєкті."
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr "Ð†Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ Ñповіщень зі Slack заÑтаріла Ñ– буде видалена в наÑтупному випуÑку. Щоб продовжувати отримувати ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð·Ñ– Slack, викориÑтовуйте заÑтоÑунок GitLab Ð´Ð»Ñ Slack. %{learn_more_link_start}ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ%{link_end}."
@@ -46204,15 +46427,15 @@ msgstr "Поточна задача"
msgid "The current user is not authorized to access the job log."
msgstr ""
+msgid "The current user is not authorized to create the pipeline schedule"
+msgstr ""
+
msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
-msgstr "Джерело даних підключено, але даних Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð½ÐµÐ¼Ð°Ñ”. %{documentationLink}"
-
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
msgstr ""
@@ -46410,9 +46633,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr "МайÑтер ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÑпиÑку вже відкрито"
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr "МакÑимальний проміжок чаÑу, протÑгом Ñкого кориÑтувачі мають налаштувати двофакторну автентифікацію перед Ñ—Ñ— заÑтоÑуваннÑм."
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr "МакÑимальний розмір файлу — %{size}."
@@ -46428,9 +46657,6 @@ msgstr "МакÑимальний розмір файлу це %{size}."
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr "Конфлікти у цьому запитті на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð½Ðµ можуть бути вирішені через GitLab. Будь лаÑка, Ñпробуйте зробити це локально."
@@ -46447,13 +46673,13 @@ msgid "The name \"%{name}\" is already taken in this directory."
msgstr ""
msgid "The name of the CI/CD configuration file. A path relative to the root directory is optional (for example %{code_open}my/path/.myfile.yml%{code_close})."
-msgstr ""
+msgstr "Ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ конфігурації CI/CD. ШлÑÑ… до кореневої теки не Ñ” обов'Ñзковим. Ðаприклад, %{code_open}my/path/.myfile.yml%{code_close})."
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
msgstr ""
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 "КількіÑÑ‚ÑŒ змін, Ñкі будуть отримувати від GitLab при клонуванні репозиторію. Менші Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ð¾Ð¶ÑƒÑ‚ÑŒ приÑкорити Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ð°. Ð’Ñтановіть в %{code_open}0%{code_close} або порожнє, щоб отримати вÑÑ– гілки Ñ– теґи Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ завданнÑ"
msgid "The number of merge requests merged by month."
msgstr ""
@@ -46557,6 +46783,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr "ДоÑтуп до Ñніпета можливий без будь-Ñкої автентифікації."
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr "Цей Ñніпет Ñ” видим лише Ð´Ð»Ñ Ð¼ÐµÐ½Ðµ."
@@ -46785,6 +47014,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46995,6 +47227,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° з reCAPTCHA. Будь лаÑка, пройдіть reCAPTCHA знову."
@@ -47002,16 +47237,16 @@ msgid "These dates affect how your epics appear in the roadmap. Set a fixed date
msgstr ""
msgid "These examples show how to trigger this project's pipeline for a branch or tag."
-msgstr ""
+msgstr "У цих прикладах показано, Ñк запуÑтити конвеєр цього проєкту Ð´Ð»Ñ Ð³Ñ–Ð»ÐºÐ¸ або тегу."
msgid "These existing issues have a similar title. It might be better to comment there instead of creating another similar issue."
msgstr "Ці Ñ–Ñнуючі проблеми мають подібні заголовки. Можливо, краще додати коментар до однієї з них заміÑÑ‚ÑŒ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¾Ñ—."
msgid "These runners are shared across projects in this group."
-msgstr ""
+msgstr "Ці раннери Ñ” Ñпільними Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñ–Ð² у цій групі."
msgid "These variables are inherited from the parent group."
-msgstr ""
+msgstr "Ці змінні уÑпадковані від батьківÑької групи."
msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
@@ -47074,10 +47309,10 @@ msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose}
msgstr "Ð¦Ñ Ð´Ñ–Ñ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚ÑŒ %{codeOpen}%{project_path_with_namespace}%{codeClose} Ñ– вÑе, що міÑтитьÑÑ Ñƒ цьому проєкті. %{strongOpen}Зворотного шлÑху немає.%{strongClose}"
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
-msgstr ""
+msgstr "Ð¦Ñ Ð´Ñ–Ñ Ð²Ð¸Ð´Ð°Ð»ÑÑ” %{codeOpen}%{project_path_with_namespace}%{codeClose} у %{date} Ñ– вÑе, що міÑтить цей проєкт."
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 ""
+msgstr "Ð¦Ñ Ð´Ñ–Ñ Ð²Ð¸Ð´Ð°Ð»ÑÑ” %{codeOpen}%{project_path_with_namespace}%{codeClose} у %{date} Ñ– вÑе, що міÑтить цей проєкт. %{strongOpen}ШлÑху назад немає.%{strongClose}"
msgid "This action will %{strongOpen}permanently remove%{strongClose} %{codeOpen}%{group}%{codeClose} %{strongOpen}immediately%{strongClose}."
msgstr ""
@@ -47136,6 +47371,9 @@ 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 "Цей коміт Ñ” чаÑтиною запиту на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ %{link_to_merge_request}. Створені тут коментарі будуть в контекÑÑ‚Ñ– цього запитну на злиттÑ."
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr "Цей коміт було підпиÑано підпиÑом %{strong_open}перевіреним%{strong_close}, а електронну пошту учаÑника перевірено на приналежніÑÑ‚ÑŒ тому ж кориÑтувачеві."
@@ -47517,9 +47755,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr "Ð¦Ñ Ñторінка недоÑтупна, тому що ви не можете переглÑдати інформацію по кількох проєктах."
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr "Цей конвеєр викориÑтовує попередньо визначену конфігурацію CI / CD, увімкнену за допомогою %{b_open}Auto DevOps.%{b_close}"
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr "Цей конвеєр викориÑтовує попередньо визначену конфігурацію CI / CD, увімкнену за допомогою %{strongStart}Auto DevOps.%{strongEnd}"
@@ -47691,9 +47926,6 @@ 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 "Порогове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² байтах, за Ñкого відхилÑÑŽÑ‚ÑŒÑÑ Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Sidekiq. Ð’Ñтановіть Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ 0, Ñкщо ви не хочете обмежувати Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ 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 "Порогова кількіÑÑ‚ÑŒ змін (гілок або тегів) в одному надÑиланні, при перевищенні Ñкої ÑтворюєтьÑÑ Ð¿Ð¾Ð´Ñ–Ñ Ð¼Ð°Ñового надÑÐ¸Ð»Ð°Ð½Ð½Ñ (за замовчуваннÑм 3)."
-
msgid "Throughput"
msgstr ""
@@ -47973,6 +48205,9 @@ msgstr "щойно"
msgid "Timeago|right now"
msgstr "зараз"
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr "ÐŸÐ¾Ð´Ñ–Ñ Ð½Ð° чаÑовій шкалі додана уÑпішно."
@@ -48062,13 +48297,10 @@ msgstr "Заголовок:"
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr "До"
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -48137,6 +48369,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -48164,9 +48399,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr "Щоб перейти до GitLab Pages, на лівій бічній панелі виберіть %{pages_link}."
-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}."
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr "Ð”Ð»Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ SVN-репозиторію, переглÑньте %{svn_link}."
@@ -48196,7 +48428,7 @@ msgid "To only use CI/CD features for an external repository, choose %{strong_op
msgstr ""
msgid "To pass variables to the triggered pipeline, add %{code_start}variables[VARIABLE]=VALUE%{code_end} to the API request."
-msgstr ""
+msgstr "Щоб передати змінні до запущеного конвеєра, додайте %{code_start}variables[VARIABLE]=VALUE%{code_end} до API-запиту."
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr ""
@@ -48240,6 +48472,9 @@ msgstr "Щоб побачити, що змінилоÑÑ Ð°Ð±Ð¾ Ñтворіть
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr "Щоб налаштувати автентифікацію SAML Ð´Ð»Ñ Ð²Ð°ÑˆÐ¾Ñ— групи через провайдера ідентифікації такої Ñк Azure, Okta, Onelogin, Ping Identity або вашого влаÑного поÑтачальника SAML 2.0:"
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -48249,6 +48484,12 @@ 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 Enterprise Edition, завантажте файл %{codeOpen}.gitlab-license%{codeClose} або введіть ліцензійний ключ, Ñкий ви отримали від GitLab Inc."
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -48420,9 +48661,6 @@ msgstr "Перемикач бічної панелі"
msgid "Toggle backtrace"
msgstr "Увімкнути/вимкнути журнал оÑтанніх подій"
-msgid "Toggle collapse"
-msgstr "Згорнути/розгорнути"
-
msgid "Toggle comments for this file"
msgstr "Увімкнути або вимкнути коментарі Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ файлу"
@@ -48432,6 +48670,9 @@ msgstr "Перемкнути Ð¾Ð¿Ð¸Ñ ÐºÐ¾Ð¼Ñ–Ñ‚Ñ–Ð²"
msgid "Toggle commit list"
msgstr "Відкрити або закрити ÑпиÑок комітів"
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr "Увімкнути/вимкнути Ñмайлики-нагороди"
@@ -48469,7 +48710,7 @@ msgid "Token"
msgstr ""
msgid "Token Access"
-msgstr ""
+msgstr "ДоÑтуп за токеном"
msgid "Token name"
msgstr "Ðазва токену"
@@ -48480,12 +48721,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr "Ð’Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ€Ñ–Ð²Ð½Ñ–Ð² доÑтупу, Ñкі було надано токену."
-
-msgid "Tokens|Select scopes"
-msgstr "Вибрати облаÑÑ‚ÑŒ дії"
-
msgid "Tomorrow"
msgstr "Завтра"
@@ -48562,6 +48797,9 @@ msgstr "Теми"
msgid "Topics could not be merged!"
msgstr "Ðе вдалоÑÑ Ð¾Ð±'єднати теми!"
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr "Ð’Ñього"
@@ -48611,7 +48849,7 @@ msgid "Track time with quick actions"
msgstr "ВідÑтежуйте Ñ‡Ð°Ñ Ð·Ð° допомогою швидких дій"
msgid "Tracking"
-msgstr ""
+msgstr "ВідÑтеженнÑ"
msgid "Training mode"
msgstr "Режим тренуваннÑ"
@@ -48732,7 +48970,7 @@ msgid "Trigger"
msgstr "Тригер"
msgid "Trigger a pipeline for a branch or tag by generating a trigger token and using it with an API call. The token impersonates a user's project access and permissions."
-msgstr ""
+msgstr "ЗапуÑÑ‚Ñ–Ñ‚ÑŒ конвеєр Ð´Ð»Ñ Ð³Ñ–Ð»ÐºÐ¸ або тега, згенерувавши токен тригера Ñ– викориÑтавши його з викликом API. Токен імітує доÑтуп Ñ– дозволи кориÑтувача до проєкту."
msgid "Trigger cluster reindexing"
msgstr ""
@@ -48893,12 +49131,6 @@ msgstr ""
msgid "URL"
msgstr "URL"
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr "URL-адреÑа недійÑна"
-
msgid "URL is required"
msgstr "URL-адреÑа обов'Ñзкова"
@@ -48956,9 +49188,6 @@ msgstr "Ðе вдалоÑÑ Ð·Ñ–Ð±Ñ€Ð°Ñ‚Ð¸ інформацію про ЦП"
msgid "Unable to collect memory info"
msgstr "Ðе вдалоÑÑ Ð·Ñ–Ð±Ñ€Ð°Ñ‚Ð¸ інформацію про пам’ÑÑ‚ÑŒ"
-msgid "Unable to connect to Prometheus server"
-msgstr "Ðеможливо з’єднатиÑÑŒ з Prometheus Ñервером"
-
msgid "Unable to connect to server: %{error}"
msgstr "Ðе вдалоÑÑ Ð·Ð²â€™ÑзатиÑÑ Ñ–Ð· Ñервером: %{error}"
@@ -49142,9 +49371,6 @@ msgstr "Ðа жаль, ваше Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ—
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -49196,8 +49422,8 @@ msgstr ""
msgid "Unlock"
msgstr "Розблокувати"
-msgid "Unlock %{issuableType}"
-msgstr "Розблокувати %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
+msgstr ""
msgid "Unlock account"
msgstr ""
@@ -49217,6 +49443,9 @@ msgstr "Розблоковано"
msgid "Unlocked the discussion."
msgstr "ÐžÐ±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ð¾."
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr "Розблоковує обговореннÑ."
@@ -49226,9 +49455,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -49508,7 +49734,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr "Ðудіо зразки, відео, набори даних та графіки."
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -49556,6 +49782,9 @@ msgstr "Інтегрований у Gitlab реєÑÑ‚Ñ€ контейнерів D
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð³Ñ€ÑƒÐ¿Ð¸ &gt; Квоти викориÑтаннÑ"
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49595,16 +49824,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr "Ðртефакти конвеєра та артефакти завдань, Ñтворені за допомогою CI/CD."
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr "Конвеєри"
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49664,7 +49887,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49809,7 +50038,7 @@ msgid "Use %{code_start}::%{code_end} to create a %{link_start}scoped label set%
msgstr "ВикориÑтовуйте %{code_start}::%{code_end} Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ %{link_start}набору Ñелективних міток%{link_end} (напр. %{code_start}priority::1%{code_end})"
msgid "Use .gitlab-ci.yml"
-msgstr ""
+msgstr "ВикориÑтовувати .gitlab-ci.yml"
msgid "Use Secure Files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates."
msgstr "ВикориÑтовуйте безпечні файли Ð´Ð»Ñ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð², що викориÑтовуютьÑÑ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ð°Ð¼Ð¸, наприклад, Ñховища ключів Android або профілі Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ‡ÐµÐ½Ð½Ñ Apple Ñ– Ñертифікати підпиÑу."
@@ -49824,7 +50053,7 @@ msgid "Use banners and notifications to notify your users about scheduled mainte
msgstr "ВикориÑтовуйте банери та ÑповіщеннÑ, щоб повідомлÑти кориÑтувачів про заплановане технічне обÑлуговуваннÑ, нещодавні Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ð¾Ñ‰Ð¾."
msgid "Use cURL"
-msgstr ""
+msgstr "ВикориÑтовувати cURL"
msgid "Use custom color #FF0000"
msgstr "ВикориÑтовувати влаÑний колір #FF0000"
@@ -49890,7 +50119,7 @@ msgid "Use this token to validate received payloads."
msgstr "ВикориÑтовуйте цей токен Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ отриманого кориÑного навантаженнÑ."
msgid "Use webhook"
-msgstr ""
+msgstr "ВикориÑтовувати вебхук"
msgid "Use your global notification setting"
msgstr "ВикориÑтовуютьÑÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ñ– Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½ÑŒ"
@@ -49971,6 +50200,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr "КориÑтувач вже був деактивований"
@@ -50124,9 +50356,15 @@ msgstr "%{id} · Створено %{created} кориÑтувачем %{author}"
msgid "UserProfile|Activity"
msgstr "ÐктивніÑÑ‚ÑŒ"
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -50145,6 +50383,9 @@ msgstr "ВнеÑки в проєкти"
msgid "UserProfile|Copy user ID"
msgstr "Копіювати ID кориÑтувача"
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr "Редагувати профіль"
@@ -50226,6 +50467,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr "ID кориÑтувача: %{id}"
@@ -50422,7 +50666,7 @@ msgid "Value might contain a variable reference"
msgstr ""
msgid "Value must meet regular expression requirements to be masked."
-msgstr ""
+msgstr "Ð”Ð»Ñ Ð¼Ð°ÑÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ð°Ñ” відповідати вимогам регулÑрного виразу."
msgid "Value stream"
msgstr ""
@@ -50475,7 +50719,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50601,7 +50845,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50616,9 +50860,6 @@ msgstr "Перевірити конфігурацію SAML"
msgid "Verify code"
msgstr "Підтвердити код"
-msgid "Verify configuration"
-msgstr "Перевірити конфігурацію"
-
msgid "Version"
msgstr "ВерÑÑ–Ñ"
@@ -50700,13 +50941,6 @@ msgstr ""
msgid "View card matches"
msgstr "ПереглÑнути відповідноÑÑ‚Ñ– картці"
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] "ПереглÑнути графік"
-msgstr[1] "ПереглÑнути графіки"
-msgstr[2] "ПереглÑнути графіки"
-msgstr[3] "ПереглÑнути графіки"
-
msgid "View dependency details for your project"
msgstr "ПереглÑнути інформацію про залежноÑÑ‚Ñ– Ð´Ð»Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ проєкту"
@@ -50735,9 +50969,6 @@ msgstr "ПереглÑд файла @ "
msgid "View file @ %{commitSha}"
msgstr "ПереглÑнути файл @ %{commitSha}"
-msgid "View full dashboard"
-msgstr "ПереглÑнути повну панель керуваннÑ"
-
msgid "View group in admin area"
msgstr ""
@@ -50792,9 +51023,6 @@ msgstr "ПереглÑнути відкритий запит на злиттÑ"
msgid "View page @ "
msgstr "ПереглÑнути Ñторінку @ "
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr "ПереглÑнути проєкт в облаÑÑ‚Ñ– адмініÑтратора"
@@ -50814,6 +51042,9 @@ msgstr "ПереглÑд заміненого файлу @ "
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr "ПереглÑнути підÑумкові нотатки"
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50826,9 +51057,6 @@ msgstr "ПереглÑнути документацію"
msgid "View the latest successful deployment to this environment"
msgstr "ПереглÑнути оÑтаннє уÑпішне Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð½Ð° це Ñередовище"
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -51183,6 +51411,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -51237,6 +51468,9 @@ msgstr "Файл:"
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -51312,6 +51546,9 @@ msgstr "Рівень"
msgid "Vulnerability|Severity:"
msgstr "Рівень:"
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr "СтатуÑ"
@@ -51369,9 +51606,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr "ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° Ð·Ð»Ð¸Ñ‚Ñ‚Ñ (відкрите Ñ– призначене)"
-msgid "Waiting for performance data"
-msgstr "ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… про продуктивніÑÑ‚ÑŒ"
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr "Хочете побачити дані? Будь лаÑка, попроÑить у адмініÑтратора доÑтуп."
@@ -51411,9 +51645,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr "Ðе вдалоÑÑ Ð¿Ñ–Ð´ÐºÑŽÑ‡Ð¸Ñ‚Ð¸ÑÑ Ð´Ð¾ Ñервера Prometheus. Ðбо Ñервер більше не Ñ–Ñнує, або необхідно оновити деталі конфігурації."
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr "Ми виÑвили потенційний Ñпам у %{humanized_resource_name}. Будь лаÑка, введіть цей код Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ reCAPTCHA, щоб продовжити."
@@ -51432,9 +51663,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51822,6 +52050,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr "Що таке об'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ (squash) комітів?"
@@ -52143,6 +52374,9 @@ msgstr "СкаÑувати запит доÑтупу"
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -52240,6 +52474,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr "Створити %{workItemType}"
@@ -52264,9 +52501,6 @@ msgstr "Запланована дата завершеннÑ"
msgid "WorkItem|Existing task"
msgstr "ІÑнуюче підзавданнÑ"
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr "Стан здоров'Ñ"
@@ -52381,6 +52615,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr "Під Ñ‡Ð°Ñ Ñпроби Ñтворити дочірній елемент ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°. Будь лаÑка, Ñпробуйте ще раз."
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr "ЩоÑÑŒ пішло не так під Ñ‡Ð°Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ. Будь лаÑка, Ñпробуйте ще раз."
@@ -52459,6 +52699,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -52555,6 +52798,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52667,9 +52913,6 @@ msgstr "Ð’Ð°Ñ Ð±ÑƒÐ´Ðµ перенаправлено з GitLab"
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr "Ви підключені до Ñервера Prometheus, але в даний Ñ‡Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” даних Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ."
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52958,6 +53201,9 @@ msgstr "Ви не можете запиÑувати на вторинні інÑ
msgid "You cannot write to this read-only GitLab instance."
msgstr "Ви не можете запиÑувати на цей \"тільки Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ\" інÑÑ‚Ð°Ð½Ñ GitLab."
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -53401,6 +53647,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -53452,6 +53704,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr "Ваш запит на Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾Ñтупу до %{source_type} відкликано."
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -53512,8 +53770,8 @@ msgstr "Ваш коментар не може бути надіÑланий че
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr "Ðе вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати ваш коментар! Перевірте Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ мережі та повторіть Ñпробу."
-msgid "Your comment could not be updated! Please check your network connection and try again."
-msgstr "Ðе вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ ваш коментар! Перевірте Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ мережі та повторіть Ñпробу."
+msgid "Your comment could not be updated because %{reason}."
+msgstr ""
msgid "Your comment will be discarded."
msgstr ""
@@ -53676,12 +53934,15 @@ msgstr "Ваша група найвищого Ñ€Ñ–Ð²Ð½Ñ %{namespace_name} зн
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
-msgstr "Ваша група верхнього Ñ€Ñ–Ð²Ð½Ñ Ð¿ÐµÑ€ÐµÐ²Ð¸Ñ‰ÑƒÑ” ліміт кориÑтувачів Ñ– пам’ÑÑ‚Ñ–, Ñ– Ñ—Ñ— переведено в Ñтан лише Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ."
-
msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr "Ваша група верхнього Ñ€Ñ–Ð²Ð½Ñ Ð¿ÐµÑ€ÐµÐ²Ð¸Ñ‰ÑƒÑ” ліміт кориÑтувачів Ñ– Ñ—Ñ— переведено в Ñтан лише Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
msgstr ""
@@ -53979,7 +54240,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr "не можна змінити, оÑкільки учаÑник пов’Ñзаний зі Ñпеціальною роллю"
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -54118,7 +54379,7 @@ 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 ""
+msgstr "Проаналізуйте розгорнуту верÑÑ–ÑŽ вашого вебзаÑтоÑунку на наÑвніÑÑ‚ÑŒ відомих вразливоÑтей, доÑлідивши його ззовні. DAST працює, імітуючи зовнішні атаки на ваш заÑтоÑунок під Ñ‡Ð°Ñ Ð¹Ð¾Ð³Ð¾ роботи."
msgid "ciReport|Automatically apply the patch in a new branch"
msgstr "Ðвтоматично заÑтоÑувати патч у новій гілці"
@@ -54429,10 +54690,11 @@ msgid "closed %{timeago}"
msgstr "закрито %{timeago}"
msgid "closed issue"
-msgstr "закрита задача"
-
-msgid "collect usage information"
-msgstr "збирати інформацію про викориÑтаннÑ"
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "comment"
msgstr "коментар"
@@ -54663,18 +54925,6 @@ msgstr[3] "файлів"
msgid "finding is not found or is already attached to a vulnerability"
msgstr "знахідку втрачено або вже закріплено за вразливіÑÑ‚ÑŽ"
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr "Ð´Ð»Ñ %{link_to_merge_request} з %{link_to_merge_request_source_branch}"
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr "Ð´Ð»Ñ %{link_to_merge_request} з %{link_to_merge_request_source_branch} в %{link_to_merge_request_target_branch}"
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr "Ð´Ð»Ñ %{link_to_pipeline_ref}"
-
-msgid "for %{ref}"
-msgstr "Ð´Ð»Ñ %{ref}"
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54785,7 +55035,7 @@ msgstr "в"
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54794,6 +55044,9 @@ msgstr "в групі %{link_to_group}"
msgid "in project %{link_to_project}"
msgstr "в проєкті %{link_to_project}"
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] "завершений інÑтанÑ"
@@ -54986,9 +55239,6 @@ msgstr "вÑе одно завантажити"
msgid "loading"
msgstr "завантаженнÑ"
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr "заблоковано %{path_lock_user_name} %{created_at}"
@@ -55171,9 +55421,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr "Ланцюжок змін - це ÑпиÑок запитів на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð² черзі, Ñкі очікують на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð² цільову гілку. Зміни в кожному запиті на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð¾Ð±'єднуютьÑÑ Ð·Ñ– змінами в попередніх запитах на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ñ– теÑтуютьÑÑ Ð¿ÐµÑ€ÐµÐ´ злиттÑм."
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr "Стартував новий ланцюжок змін, Ñ– цей запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ñ” першим у черзі."
@@ -55299,9 +55546,6 @@ msgstr "Ð—Ð»Ð¸Ñ‚Ñ‚Ñ Ð¿Ñ€Ð¾Ð¹ÑˆÐ»Ð¾ невдало."
msgid "mrWidget|Merged by"
msgstr "Злито"
-msgid "mrWidget|More information"
-msgstr "Детальніше"
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr "Будь лаÑка, відновіть Ñ—Ñ— або викориÑтовуйте іншу %{type} гілку."
@@ -55365,17 +55609,17 @@ msgstr "ВідбулаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при автоматичному зл
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr "Ð”Ð»Ñ Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ запиту на злиттÑ, введіть ваш пароль. Цей проєкт вимагає Ð¿Ñ€Ð¾Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— Ð´Ð»Ñ Ð²ÑÑ–Ñ… затверджень."
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
-msgstr "Що таке ланцюжок змін?"
+msgid "mrWidget|Your merge request is almost ready!"
+msgstr ""
msgid "mrWidget|Your password"
msgstr "Ваш пароль"
@@ -55413,6 +55657,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr "повинна бути пізніша за дату початку"
@@ -55446,9 +55696,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -55528,7 +55775,11 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr "відкрита задачу"
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "or"
msgstr "або"
@@ -55870,6 +56121,9 @@ msgstr "назва тегу"
msgid "terraform states"
msgstr "Ñтани terraform"
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55927,9 +56181,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr "домени в unicode повинні викориÑтовувати ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ IDNA"
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr "оновлено"
@@ -56058,9 +56309,6 @@ msgstr "ваш інÑÑ‚Ð°Ð½Ñ GitLab"
msgid "your group (%{group_name})"
msgstr "ваша група (%{group_name})"
-msgid "your settings"
-msgstr "ваших налаштуваннÑÑ…"
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/ur_PK/gitlab.po b/locale/ur_PK/gitlab.po
index 2d514697a97..ce090b1fa69 100644
--- a/locale/ur_PK/gitlab.po
+++ b/locale/ur_PK/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ur-PK\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:46\n"
+"PO-Revision-Date: 2023-07-11 04:48\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/uz_UZ/gitlab.po b/locale/uz_UZ/gitlab.po
index b54605c5e0e..e388d7ff3f2 100644
--- a/locale/uz_UZ/gitlab.po
+++ b/locale/uz_UZ/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: uz\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:47\n"
+"PO-Revision-Date: 2023-07-11 04:50\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -99,6 +99,16 @@ msgid_plural "%d Approvals"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -174,6 +184,11 @@ msgid_plural "%d assigned issues"
msgstr[0] ""
msgstr[1] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -354,16 +369,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -658,9 +663,6 @@ msgid_plural "%{count} projects"
msgstr[0] ""
msgstr[1] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -703,6 +705,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -775,7 +780,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -799,6 +807,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1114,6 +1125,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1141,7 +1158,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1263,9 +1280,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1947,6 +1961,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2400,6 +2420,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2418,12 +2441,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2442,6 +2471,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2451,6 +2489,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2502,13 +2543,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2619,9 +2660,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2670,6 +2708,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2925,6 +2966,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2946,9 +2990,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3372,22 +3413,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3471,6 +3503,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3540,9 +3575,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3552,9 +3584,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3585,10 +3614,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3597,9 +3626,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3822,9 +3848,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3870,6 +3893,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3909,7 +3935,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4179,9 +4205,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4218,7 +4241,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4323,10 +4346,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4437,9 +4460,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4476,9 +4496,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4575,6 +4592,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4740,6 +4760,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4791,12 +4814,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4839,6 +4856,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4998,9 +5021,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -5117,9 +5137,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5206,7 +5223,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5272,12 +5289,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5287,7 +5313,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5326,6 +5352,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5338,6 +5376,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5356,6 +5397,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5380,6 +5427,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6167,9 +6217,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6255,6 +6302,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6309,7 +6359,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6368,9 +6418,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6510,16 +6557,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6531,19 +6584,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6552,6 +6620,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6579,10 +6650,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6594,6 +6662,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -7131,28 +7205,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7323,6 +7397,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7350,10 +7427,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7413,10 +7487,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7428,7 +7502,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7722,12 +7796,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7790,9 +7870,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7850,6 +7927,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8267,19 +8347,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8516,6 +8605,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -9010,10 +9102,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -9031,10 +9123,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -9058,7 +9150,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -9106,13 +9201,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -9154,9 +9249,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9262,7 +9354,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9276,23 +9368,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9332,7 +9424,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9473,10 +9565,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9503,7 +9595,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9551,6 +9643,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9578,16 +9673,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9602,6 +9697,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9629,6 +9727,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -10000,6 +10101,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -10057,6 +10161,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10650,9 +10757,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10737,9 +10841,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10800,9 +10901,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -11046,6 +11144,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -11091,6 +11192,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -11106,10 +11213,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11205,15 +11309,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11306,18 +11419,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11444,15 +11551,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11462,6 +11584,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11498,10 +11626,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11699,6 +11830,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11744,13 +11878,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11807,9 +11941,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11846,9 +11977,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -12011,15 +12139,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12407,9 +12529,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12533,6 +12652,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12662,9 +12814,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12830,6 +12979,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12884,9 +13036,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12929,6 +13078,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13214,6 +13366,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13358,9 +13513,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14582,6 +14734,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14847,6 +15005,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14963,6 +15124,12 @@ msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
msgstr[1] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -15005,9 +15172,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -15041,6 +15214,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -15059,6 +15235,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -15083,6 +15262,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -15092,6 +15274,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15404,9 +15589,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15559,12 +15741,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15574,9 +15750,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16325,7 +16498,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16370,15 +16543,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16664,6 +16837,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16769,6 +16945,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -17105,9 +17284,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -17168,9 +17344,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17198,16 +17371,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgstr ""
+
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17372,9 +17548,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17387,9 +17560,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17585,12 +17755,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17606,9 +17770,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18561,12 +18722,18 @@ msgstr[1] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18605,9 +18772,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18752,6 +18916,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18773,6 +18940,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18839,9 +19009,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -19144,6 +19311,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19375,9 +19545,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19387,6 +19554,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19569,6 +19739,9 @@ msgid_plural "Free groups are limited to %{free_user_limit} members and the rema
msgstr[0] ""
msgstr[1] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19629,6 +19802,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19686,6 +19862,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20302,9 +20481,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20785,6 +20961,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20824,6 +21003,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20842,6 +21024,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20854,6 +21039,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20890,6 +21078,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21319,9 +21510,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21613,6 +21801,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22286,12 +22477,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22406,11 +22591,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Hide comments"
msgstr ""
@@ -22557,12 +22737,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -23185,6 +23377,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23244,6 +23439,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -24066,6 +24264,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -24183,7 +24387,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24216,9 +24420,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25294,6 +25495,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25651,9 +25855,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25888,6 +26098,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25906,6 +26119,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -26071,6 +26287,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26233,6 +26452,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26296,9 +26521,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26516,6 +26738,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -27154,9 +27379,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27304,7 +27526,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27370,6 +27592,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27562,6 +27787,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27595,6 +27823,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27652,6 +27883,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27676,9 +27910,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27778,7 +28009,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27829,7 +28060,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27856,7 +28087,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27865,7 +28096,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27901,7 +28132,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27922,7 +28153,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27943,12 +28177,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27973,7 +28213,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -28006,7 +28246,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28351,6 +28591,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28369,6 +28612,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28486,9 +28732,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28516,9 +28759,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28543,6 +28783,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28609,6 +28852,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28705,9 +28960,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28762,215 +29014,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28980,24 +29062,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29384,6 +29454,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29420,6 +29493,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29480,9 +29556,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29660,6 +29733,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30408,12 +30487,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30552,9 +30625,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30597,6 +30667,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30740,9 +30813,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -31039,6 +31109,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -31144,18 +31217,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31330,6 +31409,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -32006,6 +32088,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32527,6 +32615,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -33097,9 +33197,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33301,6 +33398,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33310,6 +33416,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33367,9 +33476,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33556,9 +33662,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33670,6 +33773,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33721,9 +33827,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33742,7 +33845,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33802,9 +33905,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33871,6 +33980,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33955,6 +34070,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -34081,9 +34199,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34234,7 +34349,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34750,6 +34865,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34789,6 +34907,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34930,6 +35051,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35446,9 +35570,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35986,18 +36107,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -36181,9 +36290,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -36205,9 +36311,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36244,10 +36347,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36730,6 +36830,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36745,6 +36848,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37529,9 +37635,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37604,6 +37707,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37786,7 +37892,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37798,7 +37904,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37813,18 +37919,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -38040,13 +38134,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38307,6 +38401,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38331,6 +38428,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38349,6 +38449,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38748,7 +38851,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -39125,9 +39228,6 @@ msgid_plural "%d Reviewers"
msgstr[0] ""
msgstr[1] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -39173,12 +39273,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39331,6 +39440,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39436,11 +39548,17 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39501,9 +39619,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39677,6 +39792,11 @@ msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
msgstr[1] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39930,7 +40050,9 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d runners will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -40249,10 +40371,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40261,12 +40386,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40285,6 +40431,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40300,6 +40449,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40309,6 +40461,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40321,6 +40476,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40342,6 +40503,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40390,6 +40554,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40832,7 +40999,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40856,9 +41023,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40943,9 +41107,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -41060,6 +41221,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -41183,6 +41347,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -41225,7 +41392,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41368,6 +41535,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41761,6 +41931,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41941,7 +42114,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -42004,10 +42177,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -42154,6 +42333,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -42184,6 +42366,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -42193,6 +42378,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -42202,6 +42393,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -42229,6 +42423,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42537,6 +42737,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42621,7 +42830,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42630,9 +42839,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42941,7 +43147,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -43166,6 +43372,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43736,6 +43945,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43874,9 +44086,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -44078,9 +44287,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -44129,7 +44335,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44564,6 +44770,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44791,10 +45003,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -45058,7 +45270,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -45144,6 +45356,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45316,9 +45543,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45571,9 +45795,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45652,13 +45873,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45854,9 +46075,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45872,9 +46099,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -46001,6 +46225,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -46229,6 +46456,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46439,6 +46669,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46580,6 +46813,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46961,9 +47197,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -47135,9 +47368,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47417,6 +47647,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47502,13 +47735,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47577,6 +47807,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47604,9 +47837,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47678,6 +47908,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47687,6 +47920,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47858,9 +48097,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47870,6 +48106,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47918,12 +48157,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47998,6 +48231,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48327,12 +48563,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48390,9 +48620,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48576,9 +48803,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48630,7 +48854,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48651,6 +48875,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48660,9 +48887,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48942,7 +49166,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48990,6 +49214,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -49029,16 +49256,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -49098,7 +49319,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49403,6 +49630,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49556,9 +49786,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49577,6 +49813,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49658,6 +49897,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49907,7 +50149,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -50033,7 +50275,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -50048,9 +50290,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -50132,11 +50371,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -50163,9 +50397,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -50220,9 +50451,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -50240,6 +50468,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -50252,9 +50483,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50609,6 +50837,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50663,6 +50894,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50738,6 +50972,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50795,9 +51032,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50837,9 +51071,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50858,9 +51089,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -51248,6 +51476,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51563,6 +51794,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51658,6 +51892,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51682,9 +51919,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51799,6 +52033,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51877,6 +52117,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51973,6 +52216,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -52083,9 +52329,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52374,6 +52617,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52813,6 +53059,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52864,6 +53116,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52924,7 +53182,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -53084,10 +53342,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53381,7 +53642,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53815,10 +54076,9 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "comment"
msgstr ""
@@ -54041,18 +54301,6 @@ msgstr[1] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -54159,7 +54407,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -54168,6 +54416,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54354,9 +54605,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54535,9 +54783,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54659,9 +54904,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54725,16 +54967,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54773,6 +55015,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54806,9 +55054,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54888,7 +55133,9 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
+msgstr[1] ""
msgid "or"
msgstr ""
@@ -55216,6 +55463,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -55273,9 +55523,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55400,9 +55647,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/vi_VN/gitlab.po b/locale/vi_VN/gitlab.po
index 60008df19ee..3e005b71c37 100644
--- a/locale/vi_VN/gitlab.po
+++ b/locale/vi_VN/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: vi\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:46\n"
+"PO-Revision-Date: 2023-07-11 04:48\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -95,6 +95,14 @@ msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -155,6 +163,10 @@ msgid "%d assigned issue"
msgid_plural "%d assigned issues"
msgstr[0] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -299,14 +311,6 @@ msgid "%d more comment"
msgid_plural "%d more comments"
msgstr[0] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -562,9 +566,6 @@ msgid "%{count} project"
msgid_plural "%{count} projects"
msgstr[0] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -607,6 +608,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -679,7 +683,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -703,6 +710,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1009,6 +1019,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1036,7 +1052,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1148,9 +1164,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1805,6 +1818,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2258,6 +2277,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2276,12 +2298,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2300,6 +2328,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2309,6 +2346,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2360,13 +2400,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2477,9 +2517,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2528,6 +2565,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2783,6 +2823,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2804,9 +2847,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3230,22 +3270,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3329,6 +3360,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3398,9 +3432,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3410,9 +3441,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3443,10 +3471,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3455,9 +3483,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3680,9 +3705,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3728,6 +3750,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3767,7 +3792,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4037,9 +4062,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4076,7 +4098,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4181,10 +4203,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4295,9 +4317,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4334,9 +4353,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4433,6 +4449,9 @@ msgstr ""
msgid "All changes are committed"
msgstr ""
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4598,6 +4617,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4649,12 +4671,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4697,6 +4713,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4856,9 +4878,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -4974,9 +4993,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5062,7 +5078,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5128,12 +5144,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5143,7 +5168,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5182,6 +5207,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5194,6 +5231,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5212,6 +5252,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5236,6 +5282,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6012,9 +6061,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6095,6 +6141,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6149,7 +6198,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6207,9 +6256,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr ""
-msgid "Assignee(s)"
-msgstr ""
-
msgid "Assignees"
msgstr ""
@@ -6347,16 +6393,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6368,19 +6420,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Filter by audit event type"
+msgstr ""
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6389,6 +6456,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6416,10 +6486,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6431,6 +6498,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -6968,28 +7041,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7160,6 +7233,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7187,10 +7263,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7250,10 +7323,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7265,7 +7338,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7556,12 +7629,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7623,9 +7702,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7683,6 +7759,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8100,19 +8179,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8349,6 +8437,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -8842,10 +8933,10 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr ""
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr ""
msgid "Change branches"
@@ -8863,10 +8954,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -8890,7 +8981,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -8938,13 +9032,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -8986,9 +9080,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9094,7 +9185,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9107,22 +9198,22 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9162,7 +9253,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9303,10 +9394,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9333,7 +9424,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9381,6 +9472,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9408,16 +9502,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9432,6 +9526,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9459,6 +9556,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -9829,6 +9929,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -9886,6 +9989,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10478,9 +10584,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10565,9 +10668,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10628,9 +10728,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -10874,6 +10971,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -10919,6 +11019,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -10934,10 +11040,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11033,15 +11136,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11133,18 +11245,12 @@ msgstr ""
msgid "Commit message"
msgstr ""
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr ""
@@ -11271,15 +11377,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11289,6 +11410,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11325,10 +11452,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export full report as CSV"
+msgstr ""
+
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11526,6 +11656,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11571,13 +11704,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11634,9 +11767,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11673,9 +11803,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -11838,15 +11965,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12231,9 +12352,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12357,6 +12475,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12486,9 +12637,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12654,6 +12802,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12708,9 +12859,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12753,6 +12901,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr ""
@@ -13038,6 +13189,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13182,9 +13336,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14403,6 +14554,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14666,6 +14823,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14778,6 +14938,12 @@ msgid "Dependencies|%d vulnerability detected"
msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -14820,9 +14986,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -14856,6 +15028,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -14874,6 +15049,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -14898,6 +15076,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -14907,6 +15088,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15216,9 +15400,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15370,12 +15551,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15385,9 +15560,6 @@ msgstr ""
msgid "Description"
msgstr ""
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16131,7 +16303,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16176,15 +16348,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16470,6 +16642,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16575,6 +16750,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -16911,9 +17089,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -16974,9 +17149,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17004,16 +17176,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
+msgstr ""
+
+msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17178,9 +17353,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17193,9 +17365,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17391,12 +17560,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17412,9 +17575,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18365,12 +18525,18 @@ msgstr[0] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18408,9 +18574,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18555,6 +18718,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18576,6 +18742,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18642,9 +18811,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -18946,6 +19112,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19177,9 +19346,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19189,6 +19355,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19370,6 +19539,9 @@ msgid "Free groups are limited to %{free_user_limit} member and the remaining me
msgid_plural "Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group."
msgstr[0] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19430,6 +19602,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr ""
@@ -19487,6 +19662,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20101,9 +20279,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20584,6 +20759,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20623,6 +20801,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20641,6 +20822,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20653,6 +20837,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20689,6 +20876,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21118,9 +21308,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21412,6 +21599,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22083,12 +22273,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22203,10 +22387,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-
msgid "Hide comments"
msgstr ""
@@ -22352,12 +22532,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -22978,6 +23170,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23036,6 +23231,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -23858,6 +24056,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -23975,7 +24179,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24008,9 +24212,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25084,6 +25285,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25441,9 +25645,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25678,6 +25888,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25696,6 +25909,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -25861,6 +26077,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26023,6 +26242,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26086,9 +26311,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26304,6 +26526,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -26935,9 +27160,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27085,7 +27307,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27151,6 +27373,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27343,6 +27568,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27376,6 +27604,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -27433,6 +27664,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27457,9 +27691,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27559,7 +27790,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27610,7 +27841,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27637,7 +27868,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27646,7 +27877,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27682,7 +27913,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27703,7 +27934,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27724,12 +27958,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27754,7 +27994,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -27787,7 +28027,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28129,6 +28369,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28147,6 +28390,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28264,9 +28510,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28294,9 +28537,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28321,6 +28561,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28387,6 +28630,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28483,9 +28738,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28540,214 +28792,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28757,24 +28840,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29160,6 +29231,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29196,6 +29270,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29256,9 +29333,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29436,6 +29510,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30182,12 +30262,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30326,9 +30400,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr ""
@@ -30371,6 +30442,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30513,9 +30587,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -30808,6 +30879,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -30913,18 +30987,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31099,6 +31179,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -31773,6 +31856,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32293,6 +32382,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -32863,9 +32964,6 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33067,6 +33165,15 @@ msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33076,6 +33183,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33133,9 +33243,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33322,9 +33429,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33436,6 +33540,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33487,9 +33594,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33508,7 +33612,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33568,9 +33672,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33637,6 +33747,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33721,6 +33837,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -33847,9 +33966,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34000,7 +34116,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34516,6 +34632,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34555,6 +34674,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34696,6 +34818,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35212,9 +35337,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35752,18 +35874,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -35947,9 +36057,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -35971,9 +36078,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36010,10 +36114,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36496,6 +36597,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36511,6 +36615,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37293,9 +37400,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37368,6 +37472,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37549,7 +37656,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37561,7 +37668,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37576,18 +37683,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -37802,13 +37897,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38069,6 +38164,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38093,6 +38191,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38111,6 +38212,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38504,7 +38608,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -38877,9 +38981,6 @@ msgid "Reviewer"
msgid_plural "%d Reviewers"
msgstr[0] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -38925,12 +39026,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39079,6 +39189,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39184,10 +39297,16 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39248,9 +39367,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39423,6 +39539,10 @@ msgid "Runners|Permanently delete %d runner"
msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39676,7 +39796,8 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d 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] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -39994,10 +40115,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40006,12 +40130,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40030,6 +40175,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40045,6 +40193,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40054,6 +40205,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40066,6 +40220,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40087,6 +40247,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40135,6 +40298,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40566,7 +40732,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40590,9 +40756,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40677,9 +40840,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -40794,6 +40954,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -40917,6 +41080,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -40959,7 +41125,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41101,6 +41267,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41494,6 +41663,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41674,7 +41846,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -41737,10 +41909,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -41887,6 +42065,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -41917,6 +42098,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -41926,6 +42110,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -41935,6 +42125,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -41962,6 +42155,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42269,6 +42468,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42353,7 +42561,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42362,9 +42570,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42672,7 +42877,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -42897,6 +43102,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43467,6 +43675,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43605,9 +43816,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -43809,9 +44017,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -43860,7 +44065,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44295,6 +44500,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44521,10 +44732,10 @@ msgstr ""
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -44788,7 +44999,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -44873,6 +45084,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45043,9 +45269,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45295,9 +45518,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45376,13 +45596,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45576,9 +45796,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45594,9 +45820,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -45723,6 +45946,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -45951,6 +46177,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46161,6 +46390,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46302,6 +46534,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46683,9 +46918,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -46857,9 +47089,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47139,6 +47368,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47222,13 +47454,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47297,6 +47526,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47324,9 +47556,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47397,6 +47626,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47406,6 +47638,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47577,9 +47815,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47589,6 +47824,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47637,12 +47875,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47716,6 +47948,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48044,12 +48279,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48107,9 +48336,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48293,9 +48519,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48347,7 +48570,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48368,6 +48591,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48377,9 +48603,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48659,7 +48882,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48707,6 +48930,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -48746,16 +48972,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -48815,7 +49035,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49119,6 +49345,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49272,9 +49501,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr ""
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49293,6 +49528,9 @@ msgstr ""
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49374,6 +49612,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49623,7 +49864,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -49749,7 +49990,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -49764,9 +50005,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -49848,10 +50086,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -49877,9 +50111,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -49934,9 +50165,6 @@ msgstr ""
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -49953,6 +50181,9 @@ msgstr ""
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -49965,9 +50196,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50322,6 +50550,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50376,6 +50607,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50451,6 +50685,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50508,9 +50745,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
@@ -50550,9 +50784,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50571,9 +50802,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -50961,6 +51189,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51273,6 +51504,9 @@ msgstr ""
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51367,6 +51601,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51391,9 +51628,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51508,6 +51742,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51586,6 +51826,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51682,6 +51925,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -51791,9 +52037,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52082,6 +52325,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52519,6 +52765,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52570,6 +52822,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52630,7 +52888,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -52788,10 +53046,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53082,7 +53343,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53508,10 +53769,8 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
msgid "comment"
msgstr ""
@@ -53730,18 +53989,6 @@ msgstr[0] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -53846,7 +54093,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -53855,6 +54102,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54038,9 +54288,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54217,9 +54464,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54339,9 +54583,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54405,16 +54646,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54453,6 +54694,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54486,9 +54733,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54568,7 +54812,8 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
msgid "or"
msgstr ""
@@ -54889,6 +55134,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -54946,9 +55194,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55071,9 +55316,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/zh_CN/gitlab.po b/locale/zh_CN/gitlab.po
index ab6eb866c74..bb6cde26c93 100644
--- a/locale/zh_CN/gitlab.po
+++ b/locale/zh_CN/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: zh-CN\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:46\n"
+"PO-Revision-Date: 2023-07-11 04:48\n"
msgid " %{start} to %{end}"
msgstr "从%{start}到%{end}"
@@ -95,6 +95,14 @@ msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] "%d个核准"
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] "%d 个议题"
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] "%d 个åˆå¹¶è¯·æ±‚"
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] "%d 个模å—"
@@ -155,6 +163,10 @@ msgid "%d assigned issue"
msgid_plural "%d assigned issues"
msgstr[0] "%d 个已分é…的议题"
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] "%d å作者"
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] "%d 个已更改的文件"
@@ -299,14 +311,6 @@ msgid "%d more comment"
msgid_plural "%d more comments"
msgstr[0] "%d个更多评论"
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] "%d 个开放的议题"
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] "%d 个开放的åˆå¹¶è¯·æ±‚"
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] "%d 个软件包"
@@ -562,9 +566,6 @@ msgid "%{count} project"
msgid_plural "%{count} projects"
msgstr[0] "%{count} 个项目"
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr "%{count}个相关的%{pluralized_subject}: %{links}"
-
msgid "%{count} selected"
msgstr "已选择 %{count} 个"
@@ -599,7 +600,7 @@ msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
msgstr "%{docs_link_start}了解å¯è§æ€§çº§åˆ«ã€‚%{docs_link_end}"
msgid "%{docs_link_start}Setting up a verified domain%{docs_link_end} requires being linked to a project."
-msgstr ""
+msgstr "%{docs_link_start}设置已验è¯åŸŸå%{docs_link_end}需è¦å·²å…³è”到项目。"
msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
msgstr "%{docs_link_start}什么是大文件存储?%{docs_link_end}"
@@ -607,6 +608,9 @@ msgstr "%{docs_link_start}什么是大文件存储?%{docs_link_end}"
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr "%{docs_link_start}什么是åŒé‡èº«ä»½éªŒè¯ï¼Ÿ%{docs_link_end}"
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr "%{duration},已排队 %{queuedDuration} 秒"
+
msgid "%{duration}ms"
msgstr "%{duration}毫秒"
@@ -679,8 +683,11 @@ msgstr "%{human_readable_key} å°äºŽ %{min_value_length} 个字符"
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr "%{integrations_link_start}集æˆ%{link_end}使得将第三方应用程åºæˆä¸ºGitLab工作æµç¨‹çš„一部分。如果当å‰å¯ç”¨çš„集æˆä¸èƒ½æ»¡è¶³æ‚¨çš„需求,å¯ä»¥è€ƒè™‘使用 %{webhooks_link_start}webhook%{link_end}。"
-msgid "%{issuableDisplayName} %{lockStatus}."
-msgstr "%{issuableDisplayName} %{lockStatus}。"
+msgid "%{issuableDisplayName} locked."
+msgstr "%{issuableDisplayName} å·²é”定。"
+
+msgid "%{issuableDisplayName} unlocked."
+msgstr "%{issuableDisplayName} 已解é”。"
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} 将被删除ï¼æ‚¨ç¡®å®šå—?"
@@ -703,6 +710,9 @@ msgstr "%{italic_start}新增功能%{italic_end} 处于未激活状æ€ä¸”无法æ
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr "%{itemsCount}个议题,上é™ä¸º%{maxIssueCount}"
+msgid "%{jobName} job is being retried"
+msgstr "%{jobName} 作业正在é‡è¯•"
+
msgid "%{jobs} Jobs"
msgstr "%{jobs} 个作业"
@@ -909,7 +919,7 @@ msgid "%{project_name}"
msgstr "%{project_name}"
msgid "%{project_path} is a project that you can use to add a README to your GitLab profile. Create a public project and initialize the repository with a README to get started. %{help_link_start}Learn more%{help_link_end}."
-msgstr ""
+msgstr "%{project_path} 是一个项目,您å¯ä»¥ä½¿ç”¨è¯¥é¡¹ç›®å°†è‡ªè¿°æ–‡ä»¶æ·»åŠ åˆ°æ‚¨çš„é…置文件中,创建一个公开项目并使用 README åˆå§‹åŒ–仓库æ¥å¼€å§‹ä½¿ç”¨ã€‚%{help_link_start}了解更多%{help_link_end}。"
msgid "%{ref} cannot be added: %{error}"
msgstr "无法添加%{ref}:%{error}"
@@ -1009,6 +1019,12 @@ msgstr "%{spanStart}于行%{spanEnd} %{errorLine}%{errorColumn}"
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr "%{spanStart}在%{spanEnd} %{errorFn}"
+msgid "%{startDate} – %{dueDate}"
+msgstr "%{startDate} – %{dueDate}"
+
+msgid "%{startDate} – No due date"
+msgstr "%{startDate} – 无截止日期"
+
msgid "%{start} to %{end}"
msgstr "从%{start}到%{end}"
@@ -1022,13 +1038,13 @@ msgid "%{statusStart}Dismissed%{statusEnd} on pipeline %{pipelineLink}"
msgstr "在æµæ°´çº¿ %{pipelineLink} 上%{statusStart}已忽略%{statusEnd}"
msgid "%{statusStart}Dismissed%{statusEnd} on pipeline %{pipelineLink} at %{projectLink}"
-msgstr ""
+msgstr "在 %{projectLink} çš„æµæ°´çº¿ %{pipelineLink} 上%{statusStart}已忽略%{statusEnd}"
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason}"
-msgstr ""
+msgstr "%{statusStart}已忽略%{statusEnd}:%{dismissalReason}"
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} at %{projectLink}"
-msgstr ""
+msgstr "%{statusStart}已忽略%{statusEnd}:%{dismissalReason}(%{projectLink})"
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink}"
msgstr "%{statusStart}已忽略%{statusEnd}:%{dismissalReason}(æµæ°´çº¿ %{pipelineLink})"
@@ -1036,8 +1052,8 @@ msgstr "%{statusStart}已忽略%{statusEnd}:%{dismissalReason}(æµæ°´çº¿ %{p
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr "%{statusStart}已忽略%{statusEnd}:%{dismissalReason}(项目 %{projectLink} çš„æµæ°´çº¿ %{pipelineLink})"
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
-msgstr "%{strongOpen}警告:%{strongClose} SAML 群组链接会导致 GitLab 自动从群组中移除æˆå‘˜ã€‚"
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
+msgstr "%{strongOpen}警告:%{strongClose}SAML 群组关è”会导致系统自动更改æˆå‘˜è§’色或从群组中移除æˆå‘˜ã€‚"
msgid "%{strongStart}%{count}%{strongEnd} commit"
msgid_plural "%{strongStart}%{count}%{strongEnd} commits"
@@ -1148,9 +1164,6 @@ msgstr "%{type} åªæ”¯æŒ %{name} å称"
msgid "%{url} (optional)"
msgstr "%{url}(å¯é€‰ï¼‰"
-msgid "%{userName} (cannot merge)"
-msgstr "%{userName} (æ— æƒåˆå¹¶)"
-
msgid "%{userName}'s avatar"
msgstr "%{userName} 的头åƒ"
@@ -1245,7 +1258,7 @@ msgid "'projects' is not yet supported"
msgstr "å°šä¸æ”¯æŒ “projectsâ€"
msgid "'schemaVersion' '%{given_version}' is not supported, it must be '%{required_version}'"
-msgstr ""
+msgstr "ä¸æ”¯æŒ 'schemaVersion' '%{given_version}',它必须是 '%{required_version}'"
msgid "'starterProjects' is not yet supported"
msgstr "'starterProjects' æš‚ä¸æ”¯æŒ"
@@ -1805,6 +1818,12 @@ msgstr "有帮助"
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr "我ä¸çŸ¥é“我能帮上什么忙。 请给予更好的指示ï¼"
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr "å¯èƒ½ä¼šæä¾›ä¸ä»£è¡¨æˆ‘们观点的ä¸å½“回应。请勿输入个人数æ®ã€‚"
+
+msgid "AI|New chat"
+msgstr "新建èŠå¤©"
+
msgid "AI|Populate issue description"
msgstr "输入议题æè¿°"
@@ -2258,6 +2277,9 @@ msgstr "访问令牌"
msgid "AccessTokens|Access token limit reached"
msgstr "已达到访问令牌é™åˆ¶"
+msgid "AccessTokens|Add a %{type}"
+msgstr "添加 %{type}"
+
msgid "AccessTokens|Are you sure?"
msgstr "你确定å—?"
@@ -2276,12 +2298,18 @@ msgstr "å¤åˆ¶æŽ¥æ”¶ç”µå­é‚®ä»¶ä»¤ç‰Œ"
msgid "AccessTokens|Copy static object token"
msgstr "å¤åˆ¶é™æ€å¯¹è±¡ä»¤ç‰Œ"
+msgid "AccessTokens|Create %{type}"
+msgstr "创建 %{type}"
+
msgid "AccessTokens|Created"
msgstr "创建于"
msgid "AccessTokens|Feed token"
msgstr "Feed令牌"
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr "例如,使用令牌的应用程åºæˆ–令牌的用途。ä¸è¦æ供令牌å称的æ•æ„Ÿä¿¡æ¯ï¼Œå› ä¸ºå®ƒå°†å¯¹æ‰€æœ‰ %{resource_type} æˆå‘˜å¯è§ã€‚"
+
msgid "AccessTokens|Incoming email token"
msgstr "接收电å­é‚®ä»¶ä»¤ç‰Œ"
@@ -2300,6 +2328,15 @@ msgstr "将此令牌ä¿å¯†ã€‚任何拥有它的人都å¯ä»¥åƒæ‚¨ä¸€æ ·è¯»å–动
msgid "AccessTokens|Personal Access Tokens"
msgstr "个人访问令牌"
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr "范围设置授予令牌的æƒé™çº§åˆ«ã€‚"
+
+msgid "AccessTokens|Select a role"
+msgstr "选择角色"
+
+msgid "AccessTokens|Select scopes"
+msgstr "选择范围"
+
msgid "AccessTokens|Static object token"
msgstr "é™æ€å¯¹è±¡ä»¤ç‰Œ"
@@ -2309,6 +2346,9 @@ msgstr "上次使用令牌的时间"
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr "当您å¯ç”¨ä¸¤æ­¥è®¤è¯(2FA)时,它们将是唯一å¯æŽ¥å—的密ç ã€‚"
+msgid "AccessTokens|Token name"
+msgstr "令牌å称"
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr "您还å¯ä»¥ä½¿ç”¨ä¸ªäººè®¿é—®ä»¤ç‰Œé€šè¿‡HTTP进行Git验è¯ã€‚"
@@ -2360,14 +2400,14 @@ msgstr "通过验è¯æ‚¨çš„å¸æˆ·æ¥ä¿®å¤æ‚¨çš„æµæ°´çº¿"
msgid "AccountValidation|I'll bring my own runners"
msgstr "我è¦ä½¿ç”¨è‡ªå·±çš„ runner"
-msgid "AccountValidation|In order to use free units of compute 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 "为了在共享 runners 上使用å…费计算å•ä½ï¼Œæ‚¨éœ€è¦ä½¿ç”¨éªŒè¯é€‰é¡¹ä¹‹ä¸€éªŒè¯æ‚¨çš„账户。 如果您ä¸æ„¿æ„æ供验è¯ï¼Œæ‚¨å¯ä»¥é€šè¿‡è‡ªå·±çš„ runner æ¥è¿è¡Œæµæ°´çº¿å¹¶ä¸ºæ‚¨çš„项目ç¦ç”¨å…±äº« runner。"
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
+msgstr ""
msgid "AccountValidation|Learn more."
msgstr "了解更多。"
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
-msgstr "看起æ¥æ‚¨éœ€è¦éªŒè¯æ‚¨çš„账户,æ‰èƒ½ä½¿ç”¨å…费计算å•ä½"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
+msgstr ""
msgid "AccountValidation|Validate your account"
msgstr "验è¯æ‚¨çš„å¸æˆ·"
@@ -2477,9 +2517,6 @@ msgstr "添加 Wiki"
msgid "Add Zoom meeting"
msgstr "添加 Zoom 会议"
-msgid "Add a %{type}"
-msgstr "添加一个%{type}"
-
msgid "Add a GCP region"
msgstr "添加 GCP 区域"
@@ -2528,6 +2565,9 @@ msgstr "添加一个新议题"
msgid "Add a numbered list"
msgstr "添加编å·åˆ—表"
+msgid "Add a quick action"
+msgstr "添加快速æ“作"
+
msgid "Add a related epic"
msgstr "添加相关å²è¯—"
@@ -2783,6 +2823,9 @@ msgstr "此版本新增"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr "当å‰GitLab实例ç¦æ­¢æ·»åŠ æ–°åº”用程åºã€‚请è”系您的GitLab管ç†å‘˜ä»¥èŽ·å¾—相关æƒé™ã€‚"
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr "其他图表格å¼"
@@ -2804,9 +2847,6 @@ msgstr "è¦åœ¨ç™»å½•é¡µé¢ä¸Šæ˜¾ç¤ºçš„附加文本"
msgid "Additional units"
msgstr "更多å•ä½"
-msgid "Additional units of compute:"
-msgstr "é¢å¤–的计算å•ä½ï¼š"
-
msgid "Address"
msgstr "地å€"
@@ -3230,24 +3270,15 @@ msgstr "如果没有任何现有索引,系统会创建一个。"
msgid "AdminSettings|Import sources"
msgstr "导入æº"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
+msgstr "直到处ç†äº†æ‰€æœ‰æ–‡æ¡£ä¹‹å‰ï¼Œé€šè¿‡æŽ’队 Sidekiq 作业æ¥æå‡éžä»£ç ç´¢å¼•åžåé‡ã€‚"
+
msgid "AdminSettings|Inactive project deletion"
msgstr "删除ä¸æ´»è·ƒçš„项目"
msgid "AdminSettings|Instance runners expiration"
msgstr "实例 runners 过期"
-msgid "AdminSettings|Jitsu administrator email"
-msgstr "Jitsu管ç†å‘˜ç”µå­é‚®ä»¶"
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr "Jitsu管ç†å‘˜å¯†ç "
-
-msgid "AdminSettings|Jitsu host"
-msgstr "Jitsu主机"
-
-msgid "AdminSettings|Jitsu project ID"
-msgstr "Jitsu项目 ID"
-
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
msgstr "在最新æˆåŠŸçš„æµæ°´çº¿ä¸­ï¼Œä¿ç•™æ‰€æœ‰ä½œä¸šçš„最新产物"
@@ -3329,6 +3360,9 @@ msgstr "默认ä¿æŠ¤ CI/CD å˜é‡"
msgid "AdminSettings|Registration Features include:"
msgstr "注册功能包括:"
+msgid "AdminSettings|Requeue indexing workers"
+msgstr "é‡æ–°æŽ’队索引 workers"
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr "è¦æ±‚用户è¯æ˜Žè‡ªå®šä¹‰åŸŸå的所有æƒ"
@@ -3398,9 +3432,6 @@ msgstr "设置必须大于 0。"
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr "Pages é™æ€ç«™ç‚¹çš„大å°å’ŒåŸŸå设置。"
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr "Jitsu中的项目ID,此项目包å«æ‰€æœ‰åˆ†æžå®žä¾‹ã€‚"
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr "Cube 实例的 URL"
@@ -3410,9 +3441,6 @@ msgstr "用于 Snowplow é…置的产å“分æžé…置器实例的连接字符串ã€
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr "在所有项目中,自动评审应用和自动部署阶段使用的默认域å。"
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr "您的 Jitsu 实例主机"
-
msgid "AdminSettings|The host of your data collector instance."
msgstr "您的数æ®æ”¶é›†å™¨å®žä¾‹ä¸»æœº"
@@ -3443,11 +3471,11 @@ msgstr "当å‰æ´»åŠ¨æµæ°´çº¿ä¸­çš„作业总数"
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr "以 IMA 凭æ®ä½¿ç”¨ AWS çš„ OpenSearch æœåŠ¡"
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr "用于连接 Jitsu 到 Clickhouse 实例。"
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
+msgstr "用于集群和索引è¿ç§»ã€‚当索引暂åœæ—¶ï¼Œç³»ç»Ÿä»åœ¨è·Ÿè¸ªæ›´æ”¹ã€‚"
-msgid "AdminSettings|Used to generate short-lived API access tokens."
-msgstr "用于生æˆçŸ­æœŸçš„ API 访问令牌。"
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
+msgstr "用于将 Snowplow 连接到 Clickhouse 实例。"
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
msgstr "用于从 Cube 实例中获得仪表盘数æ®ã€‚"
@@ -3455,9 +3483,6 @@ msgstr "用于从 Cube 实例中获得仪表盘数æ®ã€‚"
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr "用户和群组在被添加到群组或项目之å‰å¿…须确认接å—邀请。"
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr "当暂åœæ—¶ï¼Œç³»ç»Ÿä»åœ¨è·Ÿè¸ªæ›´æ”¹ï¼Œå¯¹äºŽé›†ç¾¤/索引è¿ç§»æ˜¯æœ‰ç”¨çš„。"
-
msgid "AdminSettings|When to delete inactive projects"
msgstr "何时删除ä¸æ´»è·ƒçš„项目"
@@ -3680,9 +3705,6 @@ msgstr "有关您的GitLab实例使用情况的é‡è¦ä¿¡æ¯"
msgid "AdminUsers|Is using seat"
msgstr "正在使用许å¯å¸­ä½"
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr "由该用户创建的议题和åˆå¹¶è¯·æ±‚对其他用户ä¸å¯è§ã€‚"
-
msgid "AdminUsers|It's you!"
msgstr "自己ï¼"
@@ -3728,6 +3750,9 @@ msgstr "个人项目ã€ç¾¤ç»„和用户历å²å°†ä¿æŒä¸å˜"
msgid "AdminUsers|Private profile"
msgstr "个人资料"
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr "此用户的项目ã€è®®é¢˜ã€åˆå¹¶è¯·æ±‚和评论对其他用户éšè—。"
+
msgid "AdminUsers|Reactivating a user will:"
msgstr "é‡æ–°æ¿€æ´»ç”¨æˆ·å°†ä¼šï¼š"
@@ -3767,8 +3792,8 @@ msgstr "Skype"
msgid "AdminUsers|Sort by"
msgstr "排åºæ–¹å¼"
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
-msgstr "此命å空间中的作业æ¯æœˆå¯åœ¨å…±äº« runners 上使用的最大计算å•ä½æ•°ã€‚设置为 0 表示无é™åˆ¶ã€‚留空表示继承全局设置 %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr ""
msgid "AdminUsers|The user can't access git repositories."
msgstr "用户无法访问 git 仓库。"
@@ -4037,9 +4062,6 @@ msgstr "您正在使用过时的代ç æœç´¢æ˜ å°„。 为了æ高代ç æœç´¢è´
msgid "After a successful password update you will be redirected to login screen."
msgstr "密ç æ›´æ–°æˆåŠŸåŽï¼Œæ‚¨å°†è¢«é‡å®šå‘到登录页é¢ã€‚"
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr "密ç æ›´æ–°æˆåŠŸåŽï¼Œæ‚¨å°†è¢«é‡å®šå‘到登录页é¢ï¼Œæ‚¨å¯ä»¥ä½¿ç”¨æ–°å¯†ç é‡æ–°ç™»å½•ã€‚"
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr "删除åŽï¼Œåªèƒ½é€šè¿‡ API æ¢å¤æ´¾ç”Ÿå…³ç³»ã€‚该项目将无法å†æŽ¥æ”¶æˆ–å‘é€åˆå¹¶è¯·æ±‚到上游项目或其他分支。"
@@ -4076,7 +4098,7 @@ msgstr "活动订阅"
msgid "AlertManagement|Alert"
msgstr "警报"
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr "警报指派人:%{assignees}"
msgid "AlertManagement|Alert detail"
@@ -4181,11 +4203,11 @@ msgstr "显示警报时å‘生错误。请刷新页é¢å†è¯•ä¸€æ¬¡ã€‚"
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr "显示警报时å‘生错误。请确认您的终端é…置详细信æ¯ä»¥ç¡®ä¿è­¦æŠ¥å¯ä»¥æ­£å¸¸æ˜¾ç¤ºã€‚"
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
-msgstr "更新指派åå•æ—¶å‡ºçŽ°äº†é”™è¯¯ï¼Œè¯·é‡è¯•ã€‚"
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
+msgstr "更新指派人列表时出错,请é‡è¯•ã€‚"
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
-msgstr "更新警报指派人时出现了错误,请é‡è¯•ã€‚"
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
+msgstr "更新警报的指派人列表时出错,请é‡è¯•ã€‚"
msgid "AlertManagement|There was an error while updating the status of the alert."
msgstr "更新警报状æ€æ—¶å‡ºé”™ã€‚"
@@ -4295,9 +4317,6 @@ msgstr "继续编辑"
msgid "AlertSettings|Prometheus"
msgstr "Prometheus"
-msgid "AlertSettings|Prometheus API base URL"
-msgstr "Prometheus API基础URL"
-
msgid "AlertSettings|Reset Key"
msgstr "é‡ç½®é”®"
@@ -4334,9 +4353,6 @@ msgstr "表å•æœ‰æœªä¿å­˜çš„更改。您想如何继续?"
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr "è‹¥è¦åˆ›å»ºè‡ªå®šä¹‰æ˜ å°„,请以JSONæ ¼å¼ä»Žæ‚¨çš„监测工具输入示例有效载è·ï¼Œè¯·é€‰æ‹©â€œè§£æžè´Ÿè½½å­—段â€æŒ‰é’®ç»§ç»­ã€‚"
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr "URL ä¸èƒ½ä¸ºç©ºï¼Œå¿…须以 http: 或 https: 开头。"
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr "使用下é¢çš„ URL 和授æƒå¯†é’¥æ¥é…ç½® Prometheus 如何å‘GitLabå‘é€è­¦æŠ¥ã€‚ 查看 %{linkStart}GitLab 文档%{linkEnd} æ¥å­¦ä¹ å¦‚何é…置您的端点。"
@@ -4433,6 +4449,9 @@ msgstr "所有分支"
msgid "All changes are committed"
msgstr "所有更改å‡å·²æ交"
+msgid "All default branches"
+msgstr "所有默认分支"
+
msgid "All eligible users"
msgstr "所有符åˆæ¡ä»¶çš„用户"
@@ -4598,6 +4617,9 @@ msgstr "åŒæ—¶ä»Žå­ç»„和项目中删除直接用户æˆå‘˜èº«ä»½"
msgid "Also unassign this user from related issues and merge requests"
msgstr "åŒæ—¶ä»Žç›¸å…³çš„议题和åˆå¹¶è¯·æ±‚中å–消指派此用户"
+msgid "Alt text"
+msgstr "替代文本"
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr "用于帮助页é¢å’Œå¸®åŠ©ä¸‹æ‹‰åˆ—è¡¨çš„å¤‡ç”¨æ”¯æŒ URL。"
@@ -4649,12 +4671,6 @@ msgstr "å‘生错误"
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr "在报告测试结果时出现的错误,错误地表明在没有æ¼æ´žçš„情况下系统中存在æ¼æ´žã€‚"
-msgid "An error occurred adding a draft to the thread."
-msgstr "å‘主题添加è‰ç¨¿æ—¶å‡ºé”™ã€‚"
-
-msgid "An error occurred adding a new draft."
-msgstr "添加新è‰ç¨¿æ—¶å‡ºé”™ã€‚"
-
msgid "An error occurred creating the new branch."
msgstr "创建新分支时å‘生错误。"
@@ -4697,6 +4713,12 @@ msgstr "批准时å‘生错误。请å†è¯•ä¸€æ¬¡ã€‚"
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr "检查群组路径时出错,请刷新页é¢å¹¶é‡è¯•ã€‚"
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr "创建 %{issuableType} 时出错。请é‡è¯•ã€‚"
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr "创建议题时出错。请é‡è¯•ã€‚"
+
msgid "An error occurred while decoding the file."
msgstr "解ç æ–‡ä»¶æ—¶å‘生了错误。"
@@ -4856,9 +4878,6 @@ msgstr "加载项目时出错。"
msgid "An error occurred while loading the blob controls."
msgstr "加载 blob 控件时出错。"
-msgid "An error occurred while loading the data. Please try again."
-msgstr "加载数æ®æ—¶å‡ºé”™ã€‚请é‡è¯•ã€‚"
-
msgid "An error occurred while loading the file"
msgstr "加载文件时å‘生错误"
@@ -4974,9 +4993,6 @@ msgstr "æ›´æ–°é…置时出错。"
msgid "An error occurred while updating labels."
msgstr "更新标记时å‘生错误。"
-msgid "An error occurred while updating the comment"
-msgstr "更新评论时å‘生错误"
-
msgid "An error occurred while updating the configuration."
msgstr "æ›´æ–°é…置时出错。"
@@ -5062,8 +5078,8 @@ msgstr "å‘生未知错误。"
msgid "Analytics"
msgstr "分æž"
-msgid "Analytics|Add to Dashboard"
-msgstr "添加到仪表盘"
+msgid "Analytics|A visualization with that name already exists."
+msgstr "已存在使用该å称的å¯è§†åŒ–分æžã€‚"
msgid "Analytics|Add visualizations"
msgstr "添加å¯è§†åŒ–"
@@ -5093,7 +5109,7 @@ msgid "Analytics|Choose a chart type on the right"
msgstr "在å³ä¾§é€‰æ‹©ä¸€ç§å›¾è¡¨ç±»åž‹"
msgid "Analytics|Choose a measurement to start"
-msgstr "选择一ç§æµ‹é‡æ¥å¼€å§‹"
+msgstr "选择一ç§åº¦é‡æ¥å¼€å§‹"
msgid "Analytics|Code"
msgstr "代ç "
@@ -5128,12 +5144,21 @@ msgstr "æ•°æ®"
msgid "Analytics|Data Table"
msgstr "æ•°æ®è¡¨"
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr "日期和时间以 UTC 时区显示"
+
msgid "Analytics|Edit"
msgstr "编辑"
+msgid "Analytics|Enter a visualization name"
+msgstr "输入å¯è§†åŒ–分æžå称"
+
msgid "Analytics|Error while saving dashboard"
msgstr "ä¿å­˜ä»ªè¡¨ç›˜æ—¶å‡ºé”™"
+msgid "Analytics|Error while saving visualization."
+msgstr "ä¿å­˜å¯è§†åŒ–分æžæ—¶å‡ºé”™ã€‚"
+
msgid "Analytics|Host"
msgstr "主机"
@@ -5143,8 +5168,8 @@ msgstr "语言"
msgid "Analytics|Line Chart"
msgstr "折线图"
-msgid "Analytics|New Analytics Visualization Title"
-msgstr "新建å¯è§†åŒ–分æžæ ‡é¢˜"
+msgid "Analytics|New analytics visualization name"
+msgstr "新建å¯è§†åŒ–分æžå称"
msgid "Analytics|New dashboard"
msgstr "新建仪表盘"
@@ -5182,6 +5207,18 @@ msgstr "结果数æ®"
msgid "Analytics|Save"
msgstr "ä¿å­˜"
+msgid "Analytics|Save and add to Dashboard"
+msgstr "ä¿å­˜å¹¶æ·»åŠ åˆ°ä»ªè¡¨ç›˜"
+
+msgid "Analytics|Save new visualization"
+msgstr "ä¿å­˜æ–°çš„å¯è§†åŒ–分æž"
+
+msgid "Analytics|Select a measurement"
+msgstr "选择一ç§åº¦é‡"
+
+msgid "Analytics|Select a visualization type"
+msgstr "选择å¯è§†åŒ–分æžç±»åž‹"
+
msgid "Analytics|Single Statistic"
msgstr "å•ä¸€ç»Ÿè®¡"
@@ -5194,6 +5231,9 @@ msgstr "URL"
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr "更新仪表盘 %{dashboardId}"
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr "正在更新å¯è§†åŒ–åˆ†æž %{visualizationName}"
+
msgid "Analytics|Users"
msgstr "用户"
@@ -5212,6 +5252,12 @@ msgstr "å¯è§†åŒ–设计师"
msgid "Analytics|Visualization Type"
msgstr "å¯è§†åŒ–类型"
+msgid "Analytics|Visualization designer"
+msgstr "å¯è§†åŒ–分æžè®¾è®¡å¸ˆ"
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr "å¯è§†åŒ–分æžä¿å­˜æˆåŠŸ"
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr "分æžä¾èµ–项查找已知æ¼æ´ž."
@@ -5236,6 +5282,9 @@ msgstr "以åŠæ­¤æ³¨å†Œä»¤ç‰Œï¼š"
msgid "Anonymous"
msgstr "匿å"
+msgid "Anonymous user"
+msgstr "匿å用户"
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr "å¦ä¸€ä¸ªè®®é¢˜è·Ÿè¸ªå™¨å·²ç»åœ¨ä½¿ç”¨ä¸­ã€‚一次åªèƒ½å¯ç”¨ä¸€ä¸ªè®®é¢˜è·Ÿè¸ªæœåŠ¡"
@@ -5727,7 +5776,7 @@ msgid "Approvals|Auto approved"
msgstr "自动批准"
msgid "Approvals|It looks like there was a conflict between the rules for approving this Merge Request and the users who were eligible to approve it. As a result, the system has automatically approved it to keep things moving."
-msgstr ""
+msgstr "批准此åˆå¹¶è¯·æ±‚的规则与有资格批准的用户之间存在冲çªã€‚ 因此,系统已自动批准,使åŽé¢å¯ä»¥ç»§ç»­æ‰§è¡Œã€‚"
msgid "Approvals|Rule automatically approved"
msgstr "规则已自动批准"
@@ -5742,10 +5791,10 @@ msgid "Approvals|The number of people who need to approve this is more than thos
msgstr "需è¦æ‰¹å‡†çš„人数多于å…许批准的人数。需è¦é¡¹ç›®æ‰€æœ‰è€…æ›´æ–° %{securityPolicy}。"
msgid "Approvals|Verify the number of %{linkStart}eligible security approvers%{linkEnd} matches the required approvers for the security policy."
-msgstr ""
+msgstr "验è¯%{linkStart}符åˆæ¡ä»¶çš„安全批准人的数é‡%{linkEnd}与安全策略所需的批准人数é‡åŒ¹é…。"
msgid "Approvals|Verify your %{eligibleApproverLinkStart}eligible approvers%{eligibleApproverLinkEnd} and %{approvalSettingsLinkStart}approval settings%{approvalSettingsLinkEnd} agree with each other."
-msgstr ""
+msgstr "验è¯æ‚¨çš„%{eligibleApproverLinkStart}åˆèµ„格批准人%{eligibleApproverLinkEnd}å’Œ%{approvalSettingsLinkStart}批准设置%{approvalSettingsLinkEnd}彼此一致。"
msgid "Approvals|Verify your %{linkStart}approval settings%{linkEnd} do not conflict with this rule."
msgstr "验è¯æ‚¨çš„%{linkStart}批准设置%{linkEnd}与此规则ä¸å†²çªã€‚"
@@ -6012,9 +6061,6 @@ msgstr "您确认è¦åˆ é™¤GPG密钥么?删除此GPG密钥ä¸ä¼šå½±å“å·²ç»ç­¾
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr "您确定å—?该设备将从GitLab中注销,所有“记ä½æˆ‘â€çš„令牌å‡è¢«æ’¤é”€ã€‚"
-msgid "Arrange charts"
-msgstr "排列图表"
-
msgid "Artifact"
msgstr "产物"
@@ -6095,6 +6141,9 @@ msgstr "产物总大å°"
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr "我们希望您能够使用此页é¢è½»æ¾ç®¡ç†æ‚¨çš„ CI/CD 作业产物。我们正在努力改善这ç§ä½“验,若您对我们所åšçš„改进æ出任何å馈,我们将ä¸èƒœæ„Ÿæ¿€ã€‚"
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr "由于这是一个新创建的账户,因此è¦å¼€å§‹ä½¿ç”¨ï¼Œè¯·å•å‡»ä¸‹é¢çš„链接æ¥ç¡®è®¤æ‚¨çš„账户。"
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr "éšç€æˆ‘们继续为SAST添加更多的功能,我们éžå¸¸æ¬¢è¿Žæ‚¨é€šè¿‡%{linkStart}此议题%{linkEnd}为SASTé…置功能æä¾›å馈。"
@@ -6149,7 +6198,7 @@ msgstr "指派给自己"
msgid "Assign reviewer"
msgstr "指派审核者"
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr "指派审核者"
msgid "Assign severity"
@@ -6207,9 +6256,6 @@ msgstr "å—让人没有æƒé™"
msgid "Assignee lists not available with your current license"
msgstr "当å‰è®¸å¯è¯æ— æ³•ä½¿ç”¨æŒ‡æ´¾åˆ—表"
-msgid "Assignee(s)"
-msgstr "指派人"
-
msgid "Assignees"
msgstr "指派人"
@@ -6347,17 +6393,23 @@ msgstr "获å–外部审计事件æµæ—¶å‡ºé”™ã€‚请å†è¯•ä¸€æ¬¡ã€‚"
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr "创建外部审计事件æµç›®çš„地时出错。请å†è¯•ä¸€æ¬¡ã€‚"
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr "您确定è¦åˆ é™¤æ­¤ç›®çš„地å—?"
+
msgid "AuditStreams|Cancel editing"
msgstr "å–消编辑"
+msgid "AuditStreams|Client Email"
+msgstr "客户端电å­é‚®ä»¶"
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr "自定义 HTTP headers(å¯é€‰ï¼‰"
-msgid "AuditStreams|Defines which streaming events are captured"
-msgstr "定义æ•èŽ·å“ªäº›æµäº‹ä»¶"
+msgid "AuditStreams|Delete destination"
+msgstr "删除目的地"
-msgid "AuditStreams|Delete %{link}"
-msgstr "删除 %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
+msgstr "删除æµä¼ è¾“目的地 %{destination} å°†åœæ­¢æµä¼ è¾“审计事件"
msgid "AuditStreams|Destination URL"
msgstr "目的地 URL"
@@ -6368,20 +6420,35 @@ msgstr "æµç›®çš„地已应用过滤器。%{linkStart}什么是过滤器?%{link
msgid "AuditStreams|Destinations receive all audit event data"
msgstr "目的地接收所有审计事件数æ®"
-msgid "AuditStreams|Edit %{link}"
-msgstr "编辑 %{link}"
-
msgid "AuditStreams|Event filtering (optional)"
msgstr "事件过滤(å¯é€‰ï¼‰"
+msgid "AuditStreams|Filter by audit event type"
+msgstr "按审计事件类型过滤"
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr "Google Cloud 日志"
+
+msgid "AuditStreams|HTTP endpoint"
+msgstr "HTTP 端点"
+
msgid "AuditStreams|Header"
msgstr "Header"
+msgid "AuditStreams|Log ID"
+msgstr "日志 ID"
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr "已达到最多 %{number} 个 HTTP headers。"
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
-msgstr "没有å¯ç”¨çš„过滤器。%{linkStart}如何添加过滤器?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr "尚未创建 header。"
+
+msgid "AuditStreams|Private key"
+msgstr "ç§é’¥"
+
+msgid "AuditStreams|Project ID"
+msgstr "项目 ID"
msgid "AuditStreams|Remove custom header"
msgstr "移除自定义 header"
@@ -6389,6 +6456,9 @@ msgstr "移除自定义 header"
msgid "AuditStreams|Save external stream destination"
msgstr "添加外部事件æµç›®çš„地"
+msgid "AuditStreams|Select events"
+msgstr "选择事件"
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr "为审计事件设置事件æµ"
@@ -6416,11 +6486,8 @@ msgstr "值"
msgid "AuditStreams|Verification token"
msgstr "验è¯ä»¤ç‰Œ"
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr "%{link} æµçš„验è¯ä»¤ç‰Œ"
-
-msgid "AuditStreams|View verification token"
-msgstr "查看验è¯ä»¤ç‰Œ"
+msgid "AuditStreams|audit-events"
+msgstr "审计事件"
msgid "AuditStreams|ex: 1000"
msgstr "例如:1000"
@@ -6431,6 +6498,12 @@ msgstr "例如:limitation"
msgid "AuditStreams|filtered"
msgstr "已过滤"
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr "my-email@my-google-project.iam.gservice.account.com"
+
+msgid "AuditStreams|my-google-project"
+msgstr "my-google-project"
+
msgid "Aug"
msgstr "8月"
@@ -6968,29 +7041,29 @@ msgstr "计费"
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr "%{group_name} 正在使用 %{plan_name}"
-msgid "BillingPlans|10,000 units of compute per month"
-msgstr "æ¯æœˆ 10000 计算å•ä½"
+msgid "BillingPlans|10,000 compute minutes per month"
+msgstr ""
-msgid "BillingPlans|10000 units of compute"
-msgstr "10000 计算å•ä½"
+msgid "BillingPlans|10000 compute minutes"
+msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr "æ¯æœˆ 10GB 传输"
-msgid "BillingPlans|400 units of compute"
-msgstr "400 计算å•ä½"
+msgid "BillingPlans|400 compute minutes"
+msgstr ""
-msgid "BillingPlans|400 units of compute per month"
-msgstr "æ¯æœˆ 400 计算å•ä½"
+msgid "BillingPlans|400 compute minutes per month"
+msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr "æ¯ä¸ªå‘½å空间 5 个用户"
-msgid "BillingPlans|50,000 units of compute per month"
-msgstr "æ¯æœˆ 50000 计算å•ä½"
+msgid "BillingPlans|50,000 compute minutes per month"
+msgstr ""
-msgid "BillingPlans|50000 units of compute"
-msgstr "50000 计算å•ä½"
+msgid "BillingPlans|50000 compute minutes"
+msgstr ""
msgid "BillingPlans|5GB storage"
msgstr "5GB 存储空间"
@@ -7160,6 +7233,9 @@ msgstr "支æŒ"
msgid "BillingPlans|Talk to an expert today."
msgstr "今天与一å专家交谈。"
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr "然åŽ%{move_link_start}将您希望使用订阅的任何项目%{move_link_end}移至该群组。"
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr "使用与其父项目一致的计划"
@@ -7187,11 +7263,8 @@ msgstr "我们éšæ—¶ä¸ºæ‚¨æ供帮助。"
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr "虽然 GitLab å°†åœæ­¢ä½¿ç”¨ Bronze 方案,但您ä»ç„¶å¯ä»¥åœ¨ %{eoa_bronze_plan_end_date} 之å‰å†ç»­è®¢ä¸€æ¬¡ Bronze 订阅。 我们还æä¾›é™æ—¶å…è´¹å‡çº§åˆ°æˆ‘们的高级方案(最多 25 ä¸ªç”¨æˆ·ï¼‰ï¼ åœ¨æˆ‘ä»¬çš„ %{announcement_link} 中了解有关改å˜å’Œä¼˜æƒ çš„更多信æ¯ã€‚"
-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 "æ‚¨å°šæœªåˆ›å»ºä»»ä½•ç¾¤ç»„ã€‚æ‚¨éœ€è¦ %{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 "æ‚¨éœ€è¦ %{move_link_start}将此项目移至%{move_link_end} 您的其中一个群组。"
+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 your projects to it%{move_link_end}."
+msgstr "您尚未创建任何群组。您需è¦%{create_group_link_start}创建一个群组%{create_group_link_end} ,并%{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 "您的%{plan}试用将在%{strong_open}%{expiration_date}过期%{strong_close}。您å¯ä»¥é€šè¿‡ä»¥ä¸‹æ–¹å¼å‡çº§ä»¥ä¿ç•™å¯¹%{plan}功能的访问æƒé™ã€‚"
@@ -7250,11 +7323,11 @@ msgstr "正在使用的席ä½æ•° / 订阅的席ä½æ•°"
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr "Shared runners 无法å¯ç”¨ï¼Œç›´åˆ°æœ‰æ•ˆçš„信用å¡åœ¨æ¡£ã€‚"
-msgid "Billings|To use free units of compute 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 "è¦åœ¨å…±äº« Runners 上使用å…费计算å•ä½ï¼Œæ‚¨éœ€è¦ä½¿ç”¨ä¿¡ç”¨å¡éªŒè¯æ‚¨çš„å¸æˆ·ã€‚如果您ä¸æƒ³æ供,您å¯ä»¥é€šè¿‡ä¸ºæ‚¨çš„项目带æ¥è‡ªå·±çš„ Runner 并ç¦ç”¨å…±äº« Runners æ¥è¿è¡Œæµæ°´çº¿ã€‚这是å‡å°‘和阻止对 GitLab 基础设施的滥用所必需的。 %{strongStart}GitLab ä¸ä¼šå¯¹æ‚¨çš„å¡å·æ‰£è´¹ï¼Œå®ƒåªä¼šç”¨äºŽéªŒè¯æ‚¨çš„身份。%{strongEnd} %{linkStart}了解更多%{linkEnd}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
+msgstr ""
-msgid "Billings|To use free units of compute 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 "è¦åœ¨å…±äº« Runners 上使用å…费计算å•ä½ï¼Œæ‚¨éœ€è¦ä½¿ç”¨ä¿¡ç”¨å¡éªŒè¯æ‚¨çš„å¸æˆ·ã€‚这是å‡å°‘和阻止对 GitLab 基础设施的滥用所必需的。 %{strongStart}GitLab ä¸ä¼šå¯¹æ‚¨çš„å¡å·æ‰£è´¹ï¼Œå®ƒä»…用于验è¯ã€‚%{strongEnd}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
+msgstr ""
msgid "Billings|User validation required"
msgstr "需è¦ç”¨æˆ·éªŒè¯"
@@ -7265,8 +7338,8 @@ msgstr "验è¯å¸æˆ·"
msgid "Billings|Validate user account"
msgstr "验è¯ç”¨æˆ·å¸æˆ·"
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
-msgstr "您现在å¯ä»¥ä½¿ç”¨å…±äº« Runner çš„å…费计算å•ä½ã€‚"
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
+msgstr ""
msgid "Billings|Your account has been validated"
msgstr "您的å¸æˆ·å·²é€šè¿‡éªŒè¯"
@@ -7556,12 +7629,18 @@ msgstr "创建列表时å‘生错误。请å†è¯•ä¸€é。"
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr "创建列表时å‘生错误。请å†è¯•ä¸€é。"
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr "获å–看æ¿æ—¶å‡ºé”™ï¼Œè¯·é‡è¯•ã€‚"
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr "获å–å­ç¾¤ç»„æ—¶å‘生错误,请é‡è¯•ã€‚"
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr "获å–群组项目时å‘生错误。请é‡è¯•ã€‚"
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr "获å–群组时出错。请é‡è¯•ã€‚"
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr "获å–议题时å‘生错误。请é‡æ–°åŠ è½½é¡µé¢ã€‚"
@@ -7623,9 +7702,6 @@ msgstr "展开"
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr "无法获å–ç¦ç”¨çš„ %{issuableType}"
-msgid "Boards|List actions"
-msgstr "列出æ“作"
-
msgid "Boards|Move card"
msgstr "移动å¡ç‰‡"
@@ -7683,6 +7759,9 @@ msgstr "载入更多议题"
msgid "Board|Loading epics"
msgstr "正在加载å²è¯—"
+msgid "Bold (%{modifierKey}B)"
+msgstr "加粗(%{modifierKey}B)"
+
msgid "Bold text"
msgstr "加粗字体"
@@ -8100,21 +8179,30 @@ msgstr "路径å¯ä»¥åŒ…å«é€šé…符,例如 */welcome"
msgid "BroadcastMessages|Red"
msgstr "红色"
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr "ä»…å‘在群组/项目页é¢ä¸Šå…·æœ‰ç‰¹å®šè§’色的用户显示"
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr "在命令行界é¢ä¸­å°†å¹¿æ’­æ¶ˆæ¯æ˜¾ç¤ºä¸º Git 远端å“应"
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr "在所有页é¢ä¸Šå‘所有用户显示"
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr "在特定匹é…页é¢ä¸Šå‘所有用户显示"
+
msgid "BroadcastMessages|Starts at"
msgstr "开始于"
msgid "BroadcastMessages|Target Path"
msgstr "目标路径"
+msgid "BroadcastMessages|Target broadcast message"
+msgstr "目标广播消æ¯"
+
msgid "BroadcastMessages|Target roles"
msgstr "目标角色"
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
-msgstr "广播消æ¯ä»…å‘具有这些角色的项目和群组中的用户显示。"
-
msgid "BroadcastMessages|Theme"
msgstr "主题"
@@ -8349,6 +8437,9 @@ msgstr "按月"
msgid "By quarter"
msgstr "按季度"
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr "通过使用与ä¼ä¸šç”µå­é‚®ä»¶åœ°å€ç»‘定的主电å­é‚®ä»¶ï¼Œå³è¡¨ç¤ºæ‚¨æ‰¿è®¤è¯¥è´¦å·æ˜¯ä¼ä¸šç”¨æˆ·ã€‚"
+
msgid "By week"
msgstr "按周"
@@ -8842,10 +8933,10 @@ msgstr "更改失败率"
msgid "Change assignee"
msgstr "å˜æ›´æŒ‡æ´¾äºº"
-msgid "Change assignee(s)"
+msgid "Change assignees"
msgstr "更改指派人"
-msgid "Change assignee(s)."
+msgid "Change assignees."
msgstr "更改指派人。"
msgid "Change branches"
@@ -8863,11 +8954,11 @@ msgstr "更改里程碑"
msgid "Change path"
msgstr "更改路径"
-msgid "Change reviewer(s)"
-msgstr "å˜æ›´å®¡æ ¸è€…"
+msgid "Change reviewers"
+msgstr "更改审核者"
-msgid "Change reviewer(s)."
-msgstr "å˜æ›´å®¡æ ¸è€…。"
+msgid "Change reviewers."
+msgstr "更改审核者。"
msgid "Change role"
msgstr "更改角色"
@@ -8890,8 +8981,11 @@ msgstr "更改工作项类型"
msgid "Change your password"
msgstr "更改您的密ç "
-msgid "Change your password or recover your current one"
-msgstr "更改您的密ç æˆ–æ¢å¤å½“å‰å¯†ç "
+msgid "Change your password or recover your current one."
+msgstr "更改您的密ç æˆ–æ¢å¤å½“å‰å¯†ç ã€‚"
+
+msgid "Change your password."
+msgstr "更改您的密ç ã€‚"
msgid "ChangeReviewer|All reviewers were removed."
msgstr "已移除所有审核者"
@@ -8938,14 +9032,14 @@ msgstr "åˆå¹¶è¯·æ±‚已开å¯ï¼Œå˜æ›´å°†è¢«æ交到%{branchName}。"
msgid "Changed"
msgstr "已更改"
-msgid "Changed assignee(s)."
-msgstr "å·²å˜æ›´çš„指派人"
+msgid "Changed assignees."
+msgstr "已更改指派人。"
msgid "Changed merge method to %{merge_method}"
msgstr "åˆå¹¶æ–¹æ³•å·²æ›´æ”¹ä¸º %{merge_method}"
-msgid "Changed reviewer(s)."
-msgstr "å·²å˜æ›´å®¡æ ¸è€…。"
+msgid "Changed reviewers."
+msgstr "已更改审核者。"
msgid "Changed squash option to %{squash_option}"
msgstr "压缩选项已更改为 %{squash_option}"
@@ -8986,9 +9080,6 @@ msgstr "剩余字符"
msgid "Characters over limit"
msgstr "字符超过é™åˆ¶"
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr "无法显示图表,因为数æ®è¯·æ±‚已超时。 %{documentationLink}"
-
msgid "Chat"
msgstr "å³æ—¶é€šè®¯"
@@ -9094,8 +9185,8 @@ msgstr "æ¯ä½ç”¨æˆ·æ¯å¹´ $%{pricePerUserPerYear}"
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr "æ¯ 10 GB 存储包æ¯å¹´ %{selectedPlanPrice} 美元"
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
-msgstr "$%{selectedPlanPrice} æ¯åŒ… 1,000 计算å•å…ƒ"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
+msgstr ""
msgid "Checkout|%d compute pack"
msgid_plural "Checkout|%d compute packs"
@@ -9107,22 +9198,22 @@ msgstr "以%{lastFourDigits}结尾的%{cardType} "
msgid "Checkout|%{name}'s GitLab subscription"
msgstr "%{name}的GitLab订阅"
+msgid "Checkout|%{name}'s compute minutes"
+msgstr ""
+
msgid "Checkout|%{name}'s storage subscription"
msgstr "%{name}的存储订阅"
-msgid "Checkout|%{name}'s units of compute"
-msgstr "%{name} 的计算å•ä½"
-
msgid "Checkout|%{quantity} GB of storage"
msgstr "%{quantity} GB 存储"
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] "%{quantity} 个存储包"
-msgid "Checkout|%{quantity} units of compute"
-msgstr "%{quantity} 计算å•ä½"
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr "%{selectedPlanText}计划"
@@ -9162,8 +9253,8 @@ msgstr "城市"
msgid "Checkout|Compute pack"
msgstr "计算å•ä½åŒ…"
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
-msgstr "仅在您使用完订阅的æ¯æœˆé…é¢åŽï¼Œæ‰ä½¿ç”¨ CI 计算å•ä½åŒ…。é¢å¤–的计算å•ä½å°†é€æœˆæ»šåŠ¨ï¼Œæœ‰æ•ˆæœŸä¸ºä¸€å¹´ã€‚"
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
+msgstr ""
msgid "Checkout|Confirm purchase"
msgstr "确认购买"
@@ -9259,7 +9350,7 @@ msgid "Checkout|Payment method"
msgstr "付款方å¼"
msgid "Checkout|Pricing reflective of %{linkStart}limited-time offer%{linkEnd}."
-msgstr ""
+msgstr "%{linkStart}é™æ—¶ä¼˜æƒ %{linkEnd}的定价。"
msgid "Checkout|Purchase details"
msgstr "购买详情"
@@ -9303,12 +9394,12 @@ msgstr "税é¢"
msgid "Checkout|Total"
msgstr "总计"
+msgid "Checkout|Total compute minutes: %{quantity}"
+msgstr ""
+
msgid "Checkout|Total storage: %{quantity} GB"
msgstr "总存储é‡: %{quantity} GB"
-msgid "Checkout|Total units of compute: %{quantity}"
-msgstr "计算å•ä½æ€»æ•°ï¼š%{quantity}"
-
msgid "Checkout|Users"
msgstr "用户"
@@ -9333,8 +9424,8 @@ msgstr "存储订阅"
msgid "Checkout|company or team"
msgstr "å…¬å¸æˆ–团队"
-msgid "Checkout|units of compute"
-msgstr "计算å•ä½"
+msgid "Checkout|compute minutes"
+msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
msgstr "x %{quantity} %{units} æ¯åŒ…"
@@ -9381,6 +9472,9 @@ msgstr "选择类型..."
msgid "Choose file…"
msgstr "选择文件…"
+msgid "Choose protected branch"
+msgstr "选择å—ä¿æŠ¤çš„分支"
+
msgid "Choose the top-level group for your repository imports."
msgstr "选择仓库导入的顶级群组。"
@@ -9408,16 +9502,16 @@ msgstr "CI é…置已存在"
msgid "CiCatalog|About this project"
msgstr "关于此项目"
+msgid "CiCatalog|CI/CD Catalog"
+msgstr "CI/CD 目录"
+
msgid "CiCatalog|CI/CD Catalog resource"
msgstr "CI/CD 目录资æº"
-msgid "CiCatalog|CI/CD catalog"
-msgstr "CI/CD 目录"
-
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr "创建一个æµæ°´çº¿ç»„件仓库,并使æµæ°´çº¿é…置更快,更容易。"
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr "从 CI/CD 目录开始"
msgid "CiCatalog|Go to the project"
@@ -9432,6 +9526,9 @@ msgstr "将项目标记为 CI/CD 目录资æº"
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr "将项目标记为 CI/CD 目录资æºã€‚%{linkStart}什么是 CI/CD 目录?%{linkEnd}"
+msgid "CiCatalog|No release available"
+msgstr "æ— å¯ç”¨å‘布"
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr "第 %{currentPage} 页,共 %{totalPage} 页"
@@ -9459,6 +9556,9 @@ msgstr "此项目现在是 CI/CD 目录资æºã€‚"
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr "此项目将被标记为 CI/CD 目录资æºå¹¶åœ¨ CI/CD 目录中å¯è§ã€‚æ­¤æ“作ä¸å¯é€†ã€‚"
+msgid "CiCatalog|Unreleased"
+msgstr "未å‘布"
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr "我们想帮助您创建和管ç†æµæ°´çº¿ç»„件仓库,åŒæ—¶ä¹Ÿä½¿å…¶æ›´å®¹æ˜“é‡ç”¨æµæ°´çº¿é…置。"
@@ -9829,6 +9929,9 @@ msgstr "将此议题克隆到%{project},ä¸å«è¯„论。"
msgid "Close"
msgstr "关闭"
+msgid "Close %{issuableType}"
+msgstr "关闭 %{issuableType}"
+
msgid "Close %{issueType}"
msgstr "关闭%{issueType}"
@@ -9886,6 +9989,9 @@ msgstr "关闭此%{quick_action_target}."
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr "关闭此议题。标记为与 %{duplicate_reference} å…³è”并é‡å¤ã€‚"
+msgid "Closing %{issuableType}..."
+msgstr "正在关闭 %{issuableType}..."
+
msgid "Cloud Run"
msgstr "Cloud Run"
@@ -10478,9 +10584,6 @@ msgstr "Kubernetes集群集æˆçš„高级选项"
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr "å…许GitLab管ç†æ­¤é›†ç¾¤çš„命å空间和æœåŠ¡è´¦æˆ·ã€‚"
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr "å…许 GitLab 查询特定é…置的集群内建 Prometheus,以获å–指标。"
-
msgid "ClusterIntegration|Amazon EKS"
msgstr "Amazon EKS"
@@ -10565,9 +10668,6 @@ msgstr "你是å¦äº†è§£ï¼Ÿ"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr "Elastic Kubernetes Service(EKS)"
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr "å¯ç”¨ Prometheus 集æˆ"
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr "å¯ç”¨æˆ–ç¦ç”¨GitLab与Kubernetes群集的连接。"
@@ -10628,9 +10728,6 @@ msgstr "集æˆå·²ç¦ç”¨"
msgid "ClusterIntegration|Integration enabled"
msgstr "集æˆå·²å¯ç”¨"
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr "集æˆå…许您使用安装在集群中的应用程åºä½œä¸º GitLab 工作æµç¨‹çš„一部分。"
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr "正在创建Kubernetes集群..."
@@ -10874,6 +10971,9 @@ msgstr "将用户和群组指定为特定文件更改的核准人。"
msgid "CodeOwners|Code owners"
msgstr "CodeOwners|代ç æ‰€æœ‰è€…"
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr "代ç æ‰€æœ‰è€…是å¯ä»¥æ‰¹å‡†ç‰¹å®šæ–‡ä»¶æ›´æ”¹çš„用户和群组。"
+
msgid "CodeOwners|Hide all"
msgstr "全部éšè—"
@@ -10890,7 +10990,7 @@ msgid "CodeQuality|New code quality degradations on this line"
msgstr "此行新代ç è´¨é‡ä¸‹é™"
msgid "CodeSuggestionsAlert|Code faster and more efficiently with AI-powered code suggestions in VS Code. 13 languages are supported, including JavaScript, Python, Go, Java, and Kotlin. Enable Code Suggestions in your %{preference_link_start}user profile preferences%{link_end} or %{docs_link_start}see the documentation%{link_end} to learn more."
-msgstr ""
+msgstr "在 VS Code 中使用 AI 支æŒçš„代ç å»ºè®®åŠŸèƒ½å¯ä»¥æ›´å¿«ã€æ›´é«˜æ•ˆåœ°ç¼–ç ã€‚æ”¯æŒ 13 ç§è¯­è¨€ï¼ŒåŒ…括 JavaScriptã€Pythonã€Goã€Java å’Œ Kotlin。在您的%{preference_link_start}用户个人资料å好设置%{link_end}中å¯ç”¨ä»£ç å»ºè®®æˆ–%{docs_link_start}查看文档%{link_end}æ¥äº†è§£æ›´å¤šä¿¡æ¯ã€‚"
msgid "CodeSuggestionsAlert|Enable Code Suggestions"
msgstr "å¯ç”¨ä»£ç å»ºè®®"
@@ -10919,6 +11019,12 @@ msgstr "打开此实例的代ç å»ºè®®ã€‚通过开å¯æ­¤åŠŸèƒ½ï¼Œæ‚¨ï¼š"
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr "从 GitLab.com 获å–您的个人访问令牌代ç ã€‚查看 %{link_start}文档%{link_end} 获å–创建个人访问令牌的信æ¯ã€‚"
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr "我们使用第三方 AI æœåŠ¡æ¥æ”¹è¿›ä»£ç å»ºè®®ã€‚"
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr "%{link_start}什么是代ç å»ºè®®ï¼Ÿ%{link_end}"
@@ -10934,11 +11040,8 @@ msgstr "在 IDE 中编写代ç æ—¶èŽ·å–代ç å»ºè®®ã€‚%{link_start}了解更多
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr "此群组中的项目å¯ä»¥ä½¿ç”¨ä»£ç å»ºè®®"
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr "å— %{link_start}测试使用æ¡æ¬¾%{link_end} 约æŸ"
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
-msgstr "å— %{link_start}测试使用æ¡æ¬¾%{link_end} 约æŸã€‚"
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
+msgstr "éµå®ˆ %{terms_link_start}测试使用æ¡æ¬¾%{link_end}。代ç å»ºè®®å½“å‰ä½¿ç”¨ç¬¬ä¸‰æ–¹ AI æœåŠ¡ï¼Œé™¤éžè¿™äº›æœåŠ¡è¢«%{third_party_features_link_start}ç¦ç”¨%{link_end}。"
msgid "Cohorts|Inactive users"
msgstr "未激活用户"
@@ -11033,15 +11136,24 @@ msgstr "全局命令"
msgid "CommandPalette|Pages"
msgstr "Pages"
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
-msgstr "键入 %{commandHandle} 使用命令,键入 %{userHandle} 使用用户或通用æœç´¢..."
+msgid "CommandPalette|Project files"
+msgstr "项目文件"
-msgid "CommandPalette|Users"
-msgstr "用户"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
+msgstr ""
msgid "CommandPalette|command"
msgstr "命令"
+msgid "CommandPalette|go to project file"
+msgstr "å‰å¾€é¡¹ç›®æ–‡ä»¶"
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr "议题(输入至少 3 个字符)"
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr "项目(输入至少 3 个字符)"
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr "用户(输入至少 3 个字符)"
@@ -11133,18 +11245,12 @@ msgstr "æ交已删除"
msgid "Commit message"
msgstr "æ交信æ¯"
-msgid "Commit message (optional)"
-msgstr "æ交消æ¯(å¯é€‰)"
-
msgid "Commit message generated by AI"
msgstr "ç”± AI 生æˆçš„æ交消æ¯"
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr "æ交统计 %{ref} %{start_time} - %{end_time}"
-msgid "Commit to %{branchName} branch"
-msgstr "æ交到 %{branchName} 分支"
-
msgid "CommitBoxTitle|Commit"
msgstr "æ交"
@@ -11271,15 +11377,30 @@ msgstr "无需比较。"
msgid "CompareRevisions|Branches"
msgstr "分支"
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr "更改显示为%{boldStart}æº%{boldEnd}版本正在åˆå¹¶åˆ°%{boldStart}目标%{boldEnd}版本。%{linkStart}了解更多关于比较版本的信æ¯ã€‚%{linkEnd}"
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr "æºä»£ç æ交(%{commits_amount})"
+
msgid "CompareRevisions|Compare"
msgstr "比较"
+msgid "CompareRevisions|Compare revisions"
+msgstr "比较版本"
+
msgid "CompareRevisions|Create merge request"
msgstr "创建åˆå¹¶è¯·æ±‚"
msgid "CompareRevisions|Filter by Git revision"
msgstr "按Git版本筛选"
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr "包括自创建æºä»¥æ¥å¯¹ç›®æ ‡çš„更改"
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr "ä»…æ¥è‡ªæºçš„传入更改"
+
msgid "CompareRevisions|Select Git revision"
msgstr "选择 Git 版本"
@@ -11289,6 +11410,12 @@ msgstr "选择分支/标签"
msgid "CompareRevisions|Select target project"
msgstr "选择目标项目"
+msgid "CompareRevisions|Show changes"
+msgstr "显示更改"
+
+msgid "CompareRevisions|Swap"
+msgstr "交æ¢"
+
msgid "CompareRevisions|Swap revisions"
msgstr "交æ¢ç‰ˆæœ¬"
@@ -11325,12 +11452,15 @@ msgstr "已完æˆ"
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr "在 %{duration_seconds} 秒内完æˆï¼ˆ%{relative_time})"
-msgid "Compliance Report|Export as CSV"
-msgstr "导出为 CSV"
-
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
msgstr "将框架导出为 CSV。导出处ç†å®ŒæˆåŽï¼Œæ‚¨å°†æ”¶åˆ°ç”µå­é‚®ä»¶ã€‚"
+msgid "Compliance Report|Export full report as CSV"
+msgstr "导出完整报告为 CSV"
+
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
+msgstr "å°†åˆå¹¶è¯·æ±‚è¿è§„导出为 CSV。导出处ç†å®ŒæˆåŽï¼Œæ‚¨å°†æ”¶åˆ°ç”µå­é‚®ä»¶ã€‚"
+
msgid "Compliance Report|Frameworks"
msgstr "框架"
@@ -11526,6 +11656,9 @@ msgstr "少于 2 个核准人"
msgid "ComplianceReport|No projects found"
msgstr "未找到项目"
+msgid "ComplianceReport|No projects found that match filters"
+msgstr "没有找到匹é…过滤器的项目"
+
msgid "ComplianceReport|No violations found"
msgstr "未å‘现è¿è§„行为"
@@ -11560,10 +11693,10 @@ msgid "Component"
msgstr "组件"
msgid "Component name '%{component}' for command id '%{command}' must not start with '%{prefix}'"
-msgstr ""
+msgstr "命令 ID“%{command}â€çš„组件å称“%{component}â€ä¸å¾—以“%{prefix}â€å¼€å¤´"
msgid "Component name '%{component}' must not start with '%{prefix}'"
-msgstr ""
+msgstr "组件å称 “%{component}†ä¸èƒ½ä»¥ “%{prefix}†开头"
msgid "Component type '%s' is not yet supported"
msgstr "å°šä¸æ”¯æŒç»„件类型 “%sâ€"
@@ -11571,15 +11704,15 @@ msgstr "å°šä¸æ”¯æŒç»„件类型 “%sâ€"
msgid "Components must have a 'name'"
msgstr "组件必须有一个 \"name\""
+msgid "Compute minutes"
+msgstr ""
+
msgid "Compute quota"
msgstr "计算é…é¢"
msgid "Compute quota:"
msgstr "计算é…é¢ï¼š"
-msgid "Confidence"
-msgstr "置信度"
-
msgid "Confidential"
msgstr "ç§å¯†"
@@ -11634,9 +11767,6 @@ msgstr "é…ç½®Gitaly超时时间。"
msgid "Configure Integrations"
msgstr "é…置集æˆ"
-msgid "Configure Prometheus"
-msgstr "é…ç½®Promethes"
-
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 "使用 GitLab 托管模æ¿åœ¨â€œ.gitlab-ci.ymlâ€ä¸­é…ç½® SAST IaC。您å¯ä»¥[添加å˜é‡è¦†ç›–](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) æ¥è‡ªå®šä¹‰ SAST IaC 设置。"
@@ -11673,9 +11803,6 @@ msgstr "调整高级æƒé™ã€å¤§æ–‡ä»¶å­˜å‚¨ã€åŒé‡è®¤è¯å’Œå®¢æˆ·å…³ç³»è®¾ç½®
msgid "Configure custom rules for Jira issue key matching"
msgstr "为 Jira 议题密钥匹é…é…置自定义规则"
-msgid "Configure existing installation"
-msgstr "é…置现有安装"
-
msgid "Configure pipeline"
msgstr "é…ç½®æµæ°´çº¿"
@@ -11838,15 +11965,9 @@ msgstr "正在连接到远端环境..."
msgid "Connecting..."
msgstr "正在连接..."
-msgid "Connection failed"
-msgstr "连接失败"
-
msgid "Connection failure"
msgstr "连接失败"
-msgid "Connection timed out"
-msgstr "连接超时"
-
msgid "Consistency guarantee method"
msgstr "一致性ä¿éšœæ–¹æ³•"
@@ -12231,9 +12352,6 @@ msgstr "内容"
msgid "Content parsed with %{link}."
msgstr "%{link}解æžçš„内容。"
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr "对于%{quickActionsDocsLinkStart}快速æ“作%{quickActionsDocsLinkEnd},键入 %{keyboardStart}/%{keyboardEnd}。"
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr "您必须æä¾›renderMarkdown 函数或自定义åºåˆ—化程åº"
@@ -12357,6 +12475,39 @@ msgstr "æ•°æ®å¤ªå¤šï¼Œæ— æ³•è®¡ç®—。å°è¯•é™ä½Žæ´žå¯Ÿé…置文件中的 perio
msgid "ContributionAnalytics|Total Contributions"
msgstr "总贡献"
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr "已批准 %{resourceParentLink} 中的åˆå¹¶è¯·æ±‚ %{targetLink}。"
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr "已删除 %{resourceParentLink} 中的分支 %{refLink}。"
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr "已删除 %{resourceParentLink} 中的标签 %{refLink}。"
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr "已加入项目 %{resourceParentLink}。"
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr "留下项目 %{resourceParentLink}。"
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr "已在 %{resourceParentLink} 中推é€äº†ä¸€ä¸ªæ–°åˆ†æ”¯ %{refLink}。"
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr "已在 %{resourceParentLink} 中推é€äº†ä¸€ä¸ªæ–°æ ‡ç­¾ %{refLink}。"
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr "已推é€åˆ° %{resourceParentLink} 中的分支 %{refLink}。"
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr "已推é€åˆ° %{resourceParentLink} 中的标签 %{refLink}。"
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr "由于会员资格到期,已从 %{resourceParentLink} 中删除。"
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr "…和 %{count} 次更多的æ交。%{linkStart}比较%{linkEnd}。"
+
msgid "Contributions for %{calendar_date}"
msgstr "%{calendar_date}的贡献"
@@ -12376,7 +12527,7 @@ msgid "Control whether to display customer experience improvement content and th
msgstr "控制是å¦åœ¨ GitLab 中显示客户体验改进内容和第三方优惠。"
msgid "Converts work item to %{type}. Widgets not supported in new type are removed."
-msgstr ""
+msgstr "将工作项转æ¢ä¸º %{type}。新类型ä¸æ”¯æŒçš„å°éƒ¨ä»¶å·²è¢«åˆ é™¤ã€‚"
msgid "Cookie domain"
msgstr "Cookie域"
@@ -12486,9 +12637,6 @@ msgstr "å¤åˆ¶é“¾æŽ¥"
msgid "Copy link URL"
msgstr "å¤åˆ¶é“¾æŽ¥ URL"
-msgid "Copy link to chart"
-msgstr "å¤åˆ¶å›¾è¡¨çš„链接"
-
msgid "Copy merge request URL"
msgstr "å¤åˆ¶åˆå¹¶è¯·æ±‚ URL"
@@ -12654,6 +12802,9 @@ msgstr "无法删除触å‘器。"
msgid "Could not restore the group"
msgstr "无法还原群组"
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr "无法撤消访问令牌 %{access_token_name}。"
@@ -12708,9 +12859,6 @@ msgstr "创建%{environment}"
msgid "Create %{humanized_resource_name}"
msgstr "创建%{humanized_resource_name}"
-msgid "Create %{type}"
-msgstr "创建%{type}"
-
msgid "Create %{workspace} label"
msgstr "创建 %{workspace} 标记"
@@ -12753,6 +12901,9 @@ msgstr "创建一个新分支"
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr "当å‰æ— æ–‡ä»¶ã€‚请先创建一个新文件。然åŽæ‚¨å°†èƒ½å¤Ÿæ交您的更改。"
+msgid "Create a new fork"
+msgstr "创建新的派生项目"
+
msgid "Create a new issue"
msgstr "创建新议题"
@@ -13038,6 +13189,9 @@ msgstr "å‘行阶段结æŸ"
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr "最大长度%{maxLength}个字符"
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr "最å°é•¿åº¦ %{minLength} 个字符"
+
msgid "CreateValueStreamForm|Name is required"
msgstr "å称为必填项"
@@ -13182,9 +13336,6 @@ msgstr "正在创建"
msgid "Creating epic"
msgstr "创建å²è¯—中"
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr "正在使用PrometheusæœåŠ¡å™¨ä¸­çš„æ•°æ®åˆ›å»ºå›¾è¡¨ã€‚如果这需è¦å¾ˆé•¿æ—¶é—´ï¼Œè¯·ç¡®ä¿æ•°æ®å¯ç”¨ã€‚"
-
msgid "Creator"
msgstr "创建者"
@@ -13655,7 +13806,7 @@ msgid "DORA4Metrics|Closed issues"
msgstr "已关闭的议题"
msgid "DORA4Metrics|Critical Vulnerabilities over time"
-msgstr ""
+msgstr "éšæ—¶é—´æŽ¨ç§»çš„严é‡æ¼æ´ž"
msgid "DORA4Metrics|Cycle time"
msgstr "周期时间"
@@ -13694,7 +13845,7 @@ msgid "DORA4Metrics|Go to docs"
msgstr "转到文档"
msgid "DORA4Metrics|High Vulnerabilities over time"
-msgstr ""
+msgstr "éšæ—¶é—´æŽ¨ç§»çš„高级别æ¼æ´ž"
msgid "DORA4Metrics|Lead Time for Changes"
msgstr "å˜æ›´çš„å‰ç½®æ—¶é—´"
@@ -14403,6 +14554,12 @@ msgstr "解压归档大å°éªŒè¯å¤±è´¥ã€‚"
msgid "Decrease"
msgstr "å‡å°‘"
+msgid "Decrement suggestion line end"
+msgstr "å‡å°‘建议行结æŸ"
+
+msgid "Decrement suggestion line start"
+msgstr "å‡å°‘建议行开始"
+
msgid "Default - Never run"
msgstr "默认 - 从ä¸è¿è¡Œ"
@@ -14666,6 +14823,9 @@ msgstr "删除å˜é‡"
msgid "Delete video"
msgstr "删除视频"
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr "删除设计仓库失败。请é‡è¯•æˆ–与管ç†å‘˜è”系。"
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr "删除事件失败。请é‡è¯•æˆ–è”系管ç†å‘˜ã€‚"
@@ -14778,6 +14938,12 @@ msgid "Dependencies|%d vulnerability detected"
msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] "检测到%d个æ¼æ´ž"
+msgid "Dependencies|%{locationCount} locations"
+msgstr "%{locationCount} 个ä½ç½®"
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr "%{projectCount} 个项目"
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr "其余%{remainingLicensesCount}项"
@@ -14820,9 +14986,15 @@ msgstr "ä½ç½®å’Œä¾èµ–项路径"
msgid "Dependencies|Packager"
msgstr "包管ç†å·¥å…·"
+msgid "Dependencies|Projects"
+msgstr "项目"
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr "è½¯ä»¶ç‰©æ–™æ¸…å• (SBOM) 基于%{linkStart}最新æˆåŠŸ%{linkEnd}的扫æ"
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr "è½¯ä»¶ç‰©æ–™æ¸…å• (SBOM) 基于æ¯ä¸ªé¡¹ç›®æœ€æ–°æˆåŠŸçš„扫æ。"
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr "%{codeStartTag}dependency_scanning%{codeEndTag} 作业失败,无法生æˆåˆ—表。请确ä¿ä½œä¸šæ­£å¸¸è¿è¡Œå¹¶é‡å¯æµæ°´çº¿ã€‚"
@@ -14856,6 +15028,9 @@ msgstr "ä¸æ”¯æŒä¾èµ–链"
msgid "Dependency list"
msgstr "ä¾èµ–列表"
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr "è¦äº†è§£æœ‰å…³åœ¨ä¾èµ–代ç†ç¼“存中存储 Docker é•œåƒçš„其他方法,%{docLinkStart}请å‚阅文档%{docLinkEnd}。"
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr "缓存中的所有事项都已计划移除。"
@@ -14874,6 +15049,9 @@ msgstr "在设置中é…ç½®"
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr "åŒ…å« %{count} 个镜åƒå—(%{size})"
+msgid "DependencyProxy|Copy example"
+msgstr "å¤åˆ¶ç¤ºä¾‹"
+
msgid "DependencyProxy|Copy image path"
msgstr "å¤åˆ¶é•œåƒè·¯å¾„"
@@ -14898,6 +15076,9 @@ msgstr "å¯ç”¨ä¾èµ–代ç†å’Œæ¸…除缓存的设置。"
msgid "DependencyProxy|Image list"
msgstr "é•œåƒåˆ—表"
+msgid "DependencyProxy|Pull image by digest example"
+msgstr "通过 digest 示例拉å–é•œåƒ"
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr "计划删除"
@@ -14907,6 +15088,9 @@ msgstr "缓存中没有镜åƒ"
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr "è¦æŸ¥çœ‹é•œåƒå‰ç¼€å’Œç¼“存中的内容,请访问 %{linkStart}Dependency Proxy%{linkEnd}"
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr "è¦å°† Docker é•œåƒå­˜å‚¨åœ¨ Dependency Proxy 缓存中,请按 %{codeStart}.gitlab-ci.yml%{codeEnd} 文件中的标签拉å–é•œåƒã€‚在此示例中,镜åƒä¸º %{codeStart}alpine:latest%{codeEnd}"
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr "å¯ç”¨åŽï¼Œè¶…过 90 天的镜åƒå°†ä»Žç¼“存中删除。"
@@ -15216,9 +15400,6 @@ msgstr "维护者"
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr "设置批准规则如何应用于å—ä¿æŠ¤çŽ¯å¢ƒä¸­çš„部署。"
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr "当æµæ°´çº¿è¿è¡Œæ—¶ï¼Œå¦‚æžœå…许触å‘者批准,部署作业将在æµæ°´çº¿ä¸­è‡ªåŠ¨èŽ·å¾—批准。"
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr "当å‰æ‰¹å‡†ï¼š %{current}"
@@ -15370,12 +15551,6 @@ msgstr "æˆåŠŸ"
msgid "Deprecated API rate limits"
msgstr "已弃用的 API 速率é™åˆ¶"
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr "关于å¯èƒ½æ›¿æ¢çš„ä¿¡æ¯ï¼Œ%{epicStart}了解更多关于 Opstrace %{epicEnd}。"
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr "14.7 版本中弃用了指标功能。"
-
msgid "Deprioritize label"
msgstr "å–消优先标记"
@@ -15385,9 +15560,6 @@ msgstr "æ述更改的目的以åŠè¯„审人员应注æ„的事项。"
msgid "Description"
msgstr "æè¿°"
-msgid "Description (alt text)"
-msgstr "æ述(替代文本)"
-
msgid "Description (optional)"
msgstr "æè¿° (å¯é€‰)"
@@ -16131,8 +16303,8 @@ msgstr "æˆåŠŸéªŒè¯åŸŸå所有æƒ"
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr "为该群组中的项目é…置了以下域å。电å­é‚®ä»¶åœ°å€ä¸Žå·²éªŒè¯åŸŸå匹é…的用户无需确认其å¸æˆ·ã€‚"
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
-msgstr "è¦éªŒè¯æ‚¨çš„域å的所有æƒï¼Œè¯·åœ¨æ‚¨çš„ DNS é…置中,将上é¢çš„密钥添加到 TXT 记录。 %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
+msgstr "è¦éªŒè¯æ‚¨çš„域å的所有æƒï¼Œè¯·åœ¨ä¸ƒå¤©å†…,在您的 DNS é…置中,将上é¢çš„密钥添加到 TXT 记录。%{link_to_help}"
msgid "Don't have a group?"
msgstr "没有群组?"
@@ -16176,15 +16348,15 @@ msgstr "下载(%{fileSizeReadable})"
msgid "Download (%{size})"
msgstr "下载(%{size})"
-msgid "Download CSV"
-msgstr "下载CSV"
-
msgid "Download PDF"
msgstr "下载 PDF"
msgid "Download artifacts"
msgstr "下载产物"
+msgid "Download artifacts archive"
+msgstr "下载产物存档"
+
msgid "Download codes"
msgstr "下载代ç "
@@ -16470,6 +16642,9 @@ msgstr "编辑公共部署密钥"
msgid "Edit sidebar"
msgstr "编辑侧边æ "
+msgid "Edit single file"
+msgstr "编辑å•ä¸ªæ–‡ä»¶"
+
msgid "Edit table"
msgstr "编辑表"
@@ -16575,6 +16750,9 @@ msgstr "邮件无法å‘é€"
msgid "Email display name"
msgstr "电å­é‚®ä»¶æ˜¾ç¤ºå称"
+msgid "Email must be provided."
+msgstr "å¿…é¡»æ供电å­é‚®ä»¶ã€‚"
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr "电å­é‚®ä»¶æœªéªŒè¯ã€‚请在Salesforce中验è¯æ‚¨çš„电å­é‚®ä»¶ã€‚"
@@ -16911,9 +17089,6 @@ msgstr "对所有用户登录强制执行åŒé‡è®¤è¯ã€‚"
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr "通过将æœåŠ¡å¸æˆ·å¯†é’¥å­˜å‚¨åœ¨ secret 管ç†å™¨ä¸­æ¥å¢žå¼ºå®‰å…¨æ€§ - 了解更多关于 %{docLinkStart}使用 GitLab%{docLinkEnd} 进行 secret 管ç†çš„ä¿¡æ¯"
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr "ç¡®ä¿ä»ŽGitLabæœåŠ¡å™¨åˆ°PrometheusæœåŠ¡å™¨çš„连接"
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr "如需跟踪到群集的部署,请确ä¿æ‚¨çš„%{linkStart}环境包å«äºŽCIæµæ°´çº¿çš„部署阶段%{linkEnd}。"
@@ -16974,9 +17149,6 @@ msgstr "输入æ¥è‡ªåŒé‡èº«ä»½éªŒè¯åº”用程åºçš„验è¯ç ï¼Œå¦‚果您丢失
msgid "Enter the following to confirm:"
msgstr "输入以下内容以确认:"
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr "输入您的应用程åºçš„å称,我们会返回唯一的%{type}。"
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr "输入秒数或其它å¯è¯»çš„输入,如“1 å°æ—¶â€ã€‚此超时优先于为项目设置的较低超时。"
@@ -17004,17 +17176,20 @@ msgstr "输入批准密ç "
msgid "Enterprise"
msgstr "ä¼ä¸š"
+msgid "Enterprise User"
+msgstr "ä¼ä¸šç”¨æˆ·"
+
+msgid "Enterprise User Account on GitLab"
+msgstr "GitLab 上的ä¼ä¸šç”¨æˆ·è´¦å·"
+
msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr "无法更新用户详细信æ¯"
msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr "用户与该群组的ä¼ä¸šç”¨æˆ·å®šä¹‰ä¸åŒ¹é…"
-msgid "EnterpriseUsers|The user is already an enterprise user"
-msgstr "该用户已ç»æ˜¯ä¼ä¸šç”¨æˆ·"
-
-msgid "EnterpriseUsers|The user is not a member of the group"
-msgstr "该用户ä¸æ˜¯è¯¥ç¾¤ç»„çš„æˆå‘˜"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
+msgstr "该用户已ç»æ˜¯ç¾¤ç»„中的ä¼ä¸šç”¨æˆ·"
msgid "Environment"
msgstr "环境"
@@ -17086,7 +17261,7 @@ msgid "EnvironmentsDashboard|This dashboard displays 3 environments per project,
msgstr "此仪表盘显示æ¯ä¸ªé¡¹ç›®çš„ 3 个环境,并链接到æ“作仪表盘,当您从一个仪表盘添加或删除项目时,GitLab 会从å¦ä¸€ä¸ªä»ªè¡¨ç›˜æ·»åŠ æˆ–删除项目。 %{linkStart}更多信æ¯%{linkEnd}"
msgid "Environments|A freeze period is in effect from %{startTime} to %{endTime}. Deployments might fail during this time. For more information, see the %{docsLinkStart}deploy freeze documentation%{docsLinkEnd}."
-msgstr ""
+msgstr "冻结期间从 %{startTime} 到 %{endTime} 生效,在此期间部署å¯èƒ½ä¼šå¤±è´¥ã€‚ 详细信æ¯è¯·å‚阅 %{docsLinkStart}部署冻结文档%{docsLinkEnd}。"
msgid "Environments|An error occurred while canceling the auto stop, please try again"
msgstr "å–消自动终止时å‘生错误,请é‡è¯•"
@@ -17167,7 +17342,7 @@ msgid "Environments|Environments"
msgstr "环境"
msgid "Environments|Environments are places where code gets deployed, such as staging or production. You can create an environment in the UI or in your .gitlab-ci.yml file. You can also enable review apps, which assist with providing an environment to showcase product changes. %{linkStart}Learn more%{linkEnd} about environments."
-msgstr ""
+msgstr "环境是代ç éƒ¨ç½²çš„地方,例如测试或正å¼çŽ¯å¢ƒï¼Œæ‚¨å¯ä»¥åœ¨ç”¨æˆ·ç•Œé¢æˆ– .gitlab-ci.yml 文件中创建环境。您还å¯ä»¥å¯ç”¨ review apps,它å¯ä»¥æ供一个环境æ¥å±•ç¤ºäº§å“å˜æ›´ã€‚ %{linkStart}详细了解环境%{linkEnd}。"
msgid "Environments|Get started with environments"
msgstr "环境入门"
@@ -17178,9 +17353,6 @@ msgstr "GitLab 代ç†"
msgid "Environments|Job"
msgstr "作业"
-msgid "Environments|Learn about environments"
-msgstr "了解环境"
-
msgid "Environments|Learn more about stopping environments"
msgstr "了解更多关于如何终止环境的信æ¯"
@@ -17193,9 +17365,6 @@ msgstr "新建环境"
msgid "Environments|New environment"
msgstr "新建环境"
-msgid "Environments|No deployed environments"
-msgstr "没有已部署的环境"
-
msgid "Environments|No deployments yet"
msgstr "未部署"
@@ -17391,12 +17560,6 @@ msgstr "有效利用å²è¯—,您的产å“线管ç†ä¼šå˜å¾—æ›´è½»æ¾é«˜æ•ˆ"
msgid "Epics, issues, and merge requests"
msgstr "å²è¯—ã€è®®é¢˜å’Œåˆå¹¶è¯·æ±‚"
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr "%{startDate} – %{dueDate}"
-
-msgid "Epics|%{startDate} – No due date"
-msgstr "%{startDate} – 无截止日期"
-
msgid "Epics|Add a new epic"
msgstr "添加一个新的å²è¯—。"
@@ -17412,9 +17575,6 @@ msgstr "确定è¦ä»Ž%{bStart}%{parentEpicTitle}%{bEnd}删除%{bStart}%{targetIss
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr "留空以继承里程碑日期"
-msgid "Epics|No start date – %{dueDate}"
-msgstr "无开始日期 — %{dueDate}"
-
msgid "Epics|Remove epic"
msgstr "删除å²è¯—"
@@ -18365,12 +18525,18 @@ msgstr[0] "失败的作业"
msgid "Failed on"
msgstr "失败于"
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr "无法 %{action} 此工作项:%{reason}。"
+
msgid "Failed to add a Zoom meeting"
msgstr "无法添加Zoom会议"
msgid "Failed to add a resource link"
msgstr "添加资æºé“¾æŽ¥å¤±è´¥"
+msgid "Failed to add emoji. Please try again"
+msgstr "添加表情符å·å¤±è´¥ã€‚请é‡è¯•"
+
msgid "Failed to apply commands."
msgstr "应用命令失败。"
@@ -18408,9 +18574,6 @@ msgstr "无法克隆此议题,因为目标项目ä¸å­˜åœ¨ã€‚"
msgid "Failed to clone this issue: wrong parameters."
msgstr "无法克隆此议题:å‚数错误。"
-msgid "Failed to convert this work item: %{reason}."
-msgstr "无法转æ¢æ­¤å·¥ä½œé¡¹ï¼š%{reason}。"
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr "无法为此问题创建分支。请å†è¯•ä¸€æ¬¡ã€‚"
@@ -18555,6 +18718,9 @@ msgstr "无法删除Zoom会议"
msgid "Failed to remove a to-do item for the design."
msgstr "无法删除设计的待办事项。"
+msgid "Failed to remove emoji. Please try again"
+msgstr "删除表情符å·å¤±è´¥ã€‚请é‡è¯•"
+
msgid "Failed to remove mirror."
msgstr "删除镜åƒå¤±è´¥ã€‚"
@@ -18576,6 +18742,9 @@ msgstr "获å–页é¢å¤±è´¥"
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr "ä¿å­˜åˆå¹¶å†²çªè§£å†³åŠžæ³•å¤±è´¥ã€‚请é‡è¯•ï¼"
+msgid "Failed to save namespace commit email."
+msgstr "无法ä¿å­˜å‘½å空间æ交电å­é‚®ä»¶ã€‚"
+
msgid "Failed to save new settings"
msgstr "无法ä¿å­˜æ–°è®¾ç½®"
@@ -18642,9 +18811,6 @@ msgstr "图标将被删除。您确定å—?"
msgid "Feature Flags"
msgstr "功能标志"
-msgid "Feature deprecation"
-msgstr "功能已弃用"
-
msgid "Feature flag status"
msgstr "功能标志状æ€"
@@ -18946,6 +19112,9 @@ msgstr "具有较大更改的文件默认情况下是折å çš„。"
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr "æ交引用%{ref}路径%{path}中的文件,目录和å­æ¨¡å—"
+msgid "Fill in merge request template"
+msgstr "填写åˆå¹¶è¯·æ±‚模æ¿"
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr "填写以下字段,开å¯%{strong_open}对此组å¯ç”¨SAML身份验è¯%{strong_close},然åŽç‚¹å‡»%{strong_open}ä¿å­˜æ›´æ”¹%{strong_close}"
@@ -19177,9 +19346,6 @@ msgstr "为æ¯ä¸ªä½œä¸šï¼Œå…‹éš†ä»“库。"
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr "对于æ¯ä¸ªä½œä¸šï¼Œé‡æ–°ä½¿ç”¨é¡¹ç›®å·¥ä½œåŒºï¼Œå¦‚果工作区ä¸å­˜åœ¨ï¼Œè¯·ä½¿ç”¨ %{code_open}git clone%{code_close}。"
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr "例如,使用令牌的应用程åºæˆ–令牌的用途。ä¸è¦æ供令牌å称的æ•æ„Ÿä¿¡æ¯ï¼Œå› ä¸ºå®ƒå°†å¯¹æ‰€æœ‰ %{resource_type} æˆå‘˜å¯è§ã€‚"
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr "对于大于此é™åˆ¶çš„文件,仅索引文件å,文件内容既ä¸ç¼–入索引也ä¸å¯æœç´¢ã€‚"
@@ -19189,6 +19355,9 @@ msgstr "关于一般性工作"
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr "对于个人使用,请在您的个人电å­é‚®ä»¶åœ°å€ä¸‹åˆ›å»ºä¸€ä¸ªå•ç‹¬çš„è´¦å·ï¼Œä¸è¦ç»‘定到ä¼ä¸šç”µå­é‚®ä»¶åŸŸæˆ–组。"
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr "对于个人使用,请在您的个人电å­é‚®ä»¶åœ°å€ä¸‹åˆ›å»ºä¸€ä¸ªå•ç‹¬çš„è´¦å·ï¼Œä¸è¦ç»‘定到ä¼ä¸šç”µå­é‚®ä»¶åŸŸå。"
+
msgid "For investigating IT service disruptions or outages"
msgstr "用于调查 IT æœåŠ¡ä¸­æ–­æˆ–åœé¡¿"
@@ -19370,6 +19539,9 @@ msgid "Free groups are limited to %{free_user_limit} member and the remaining me
msgid_plural "Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group."
msgstr[0] "å…费群组é™åˆ¶ä¸º %{free_user_limit} åæˆå‘˜ï¼Œå…¶ä½™æˆå‘˜å°†èŽ·å¾—超é™çŠ¶æ€å¹¶æ— æ³•è®¿é—®è¯¥ç¾¤ç»„。"
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr "å…费顶级群组近期将é™åˆ¶ä¸ºæœ€å¤š %{free_users_limit} 个用户和 %{free_storage_limit} æ•°æ®"
+
msgid "Free trial will expire in %{days}"
msgstr "å…费试用将在 %{days} 天åŽåˆ°æœŸ"
@@ -19430,6 +19602,9 @@ msgstr "%{providerTitle}æºåœ°å€"
msgid "From issue creation until deploy to production"
msgstr "从创建议题到部署至生产环境"
+msgid "From line %{line1} to %{line2}"
+msgstr "从 %{line1} 行到 %{line2} 行"
+
msgid "From merge request merge until deploy to production"
msgstr "从åˆå¹¶è¯·æ±‚被åˆå¹¶åŽåˆ°éƒ¨ç½²è‡³ç”Ÿäº§çŽ¯å¢ƒ"
@@ -19487,6 +19662,9 @@ msgstr "生æˆæ–°çš„导出"
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr "为您需è¦è®¿é—®GitLab API的应用程åºç”Ÿæˆé¡¹ç›®è®¿é—®ä»¤ç‰Œã€‚"
+msgid "Generate root cause analysis"
+msgstr "生æˆæ ¹æœ¬åŽŸå› åˆ†æž"
+
msgid "Generate site and private keys at"
msgstr "生æˆç«™ç‚¹å’Œç§é’¥åœ¨"
@@ -20101,9 +20279,6 @@ msgstr "开始使用GitLab"
msgid "Get started with error tracking"
msgstr "开始使用错误跟踪"
-msgid "Get started with performance monitoring"
-msgstr "开始进行性能监控"
-
msgid "Get started!"
msgstr "开始å§ï¼"
@@ -20584,6 +20759,9 @@ msgstr "è¦ä½¿ç”¨é›†æˆï¼Œæ¯ä¸ªç”¨æˆ·è¿˜å¿…须在其 GitLab è´¦å·ä¸Šå¯ç”¨ Git
msgid "Gitpod|https://gitpod.example.com"
msgstr "https://gitpod.example.com"
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr "给予å馈"
@@ -20623,6 +20801,9 @@ msgstr "èšåˆåŠ è½½é”™è¯¯ã€‚"
msgid "GlobalSearch|Close"
msgstr "关闭"
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr "获å–èšåˆé”™è¯¯ã€‚"
+
msgid "GlobalSearch|Group"
msgstr "群组"
@@ -20641,6 +20822,9 @@ msgstr "我创建的议题"
msgid "GlobalSearch|Issues assigned to me"
msgstr "指派给我的议题"
+msgid "GlobalSearch|Label(s)"
+msgstr "标记"
+
msgid "GlobalSearch|Language"
msgstr "语言"
@@ -20653,6 +20837,9 @@ msgstr "分é…给我的åˆå¹¶è¯·æ±‚"
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr "我作为审核者的åˆå¹¶è¯·æ±‚"
+msgid "GlobalSearch|No labels found"
+msgstr "未找到标记"
+
msgid "GlobalSearch|Project"
msgstr "项目"
@@ -20689,6 +20876,9 @@ msgstr "æœç´¢ GitLab %{kbdOpen}/%{kbdClose}"
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr "æœç´¢é¡¹ç›®ã€è®®é¢˜ç­‰ã€‚"
+msgid "GlobalSearch|Search labels"
+msgstr "æœç´¢æ ‡è®°"
+
msgid "GlobalSearch|Search results are loading"
msgstr "æœç´¢ç»“果正在加载中"
@@ -21118,9 +21308,6 @@ msgstr "群组信æ¯"
msgid "Group information"
msgstr "群组信æ¯"
-msgid "Group is required when cluster_type is :group"
-msgstr "cluster_type为:group时群组为必需"
-
msgid "Group jobs by"
msgstr "分组作业按"
@@ -21412,6 +21599,9 @@ msgstr "SCIM 令牌"
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr "SAML令牌签åè¯ä¹¦çš„SHA1指纹。请从身份验è¯æ供商处获å–(也å¯ä»¥è¢«ç§°ä¸ºâ€œæ‹‡æŒ‡çº¹â€ï¼‰ã€‚"
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr "由于您的 SAML 会è¯å·²è¿‡æœŸï¼Œä¸€äº›åˆ†æ”¯æ— æ³•è®¿é—®ã€‚è¦è®¿é—®åˆ†æ”¯ï¼Œè¯·é€‰æ‹©è¦é‡æ–°éªŒè¯çš„群组路径。"
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr "æŸäº›å¾…办事项å¯èƒ½å·²éšè—,因为您的 SAML 会è¯å·²è¿‡æœŸã€‚选择群组路径é‡æ–°è®¤è¯ï¼ŒæŸ¥çœ‹éšè—的待办事项。"
@@ -22083,12 +22273,6 @@ msgstr "通知和其他 %{issueType} æ“作已移动到此èœå•ã€‚"
msgid "HeaderAction|Okay!"
msgstr "好的ï¼"
-msgid "HeaderAction|incident"
-msgstr "事件"
-
-msgid "HeaderAction|issue"
-msgstr "议题"
-
msgid "Headers"
msgstr "Headers"
@@ -22203,10 +22387,6 @@ msgstr "éšè—实时预览"
msgid "Hide archived projects"
msgstr "éšè—已归档的项目"
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] "éšè—图表"
-
msgid "Hide comments"
msgstr "éšè—评论"
@@ -22352,12 +22532,24 @@ msgstr "例行维护"
msgid "Housekeeping successfully started"
msgstr "已开始维护"
+msgid "How do I change my password in GitLab?"
+msgstr "如何更改我的密ç ï¼Ÿ"
+
+msgid "How do I clone a repository?"
+msgstr "如何克隆仓库?"
+
msgid "How do I configure Akismet?"
msgstr "如何é…ç½® Akismet ?"
msgid "How do I configure this integration?"
msgstr "如何é…置此集æˆï¼Ÿ"
+msgid "How do I create a template?"
+msgstr "如何创建模æ¿ï¼Ÿ"
+
+msgid "How do I fork a project?"
+msgstr "如何派生项目?"
+
msgid "How do I generate it?"
msgstr "我如何生æˆå®ƒï¼Ÿ"
@@ -22978,6 +23170,9 @@ msgstr "已拥有"
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr "é‡æ–°å¯¼å…¥å°†åˆ›å»ºä¸€ä¸ªæ–°é¡¹ç›®ã€‚它ä¸ä¸ŽçŽ°æœ‰é¡¹ç›®åŒæ­¥ã€‚"
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr "仓库超出å…许的大å°é™åˆ¶ã€‚"
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr "请求命å空间失败"
@@ -23036,6 +23231,9 @@ msgstr "在此 URL 上没有有效的 Git 仓库。如果您的 HTTP 仓库ä¸èƒ
msgid "Improve customer support with Service Desk"
msgstr "通过æœåŠ¡å°æ”¹å–„客户支æŒ"
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr "通过增加 Sidekiq è´Ÿè½½æ¥æ高索引性能。ä¸å…许大于当å‰åˆ†ç‰‡é™åˆ¶ï¼ˆ%{limit})的值。"
+
msgid "Improve quality with test cases"
msgstr "通过测试用例æ高质é‡"
@@ -23858,6 +24056,12 @@ msgstr "未完æˆ"
msgid "Increase"
msgstr "增加"
+msgid "Increment suggestion line end"
+msgstr "增加建议行结æŸ"
+
+msgid "Increment suggestion line start"
+msgstr "增加建议行开始"
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr "%{featureName} 正处于孵化阶段"
@@ -23975,8 +24179,8 @@ msgstr "å‘å‰æ’入列"
msgid "Insert comment template"
msgstr "æ’入评论模æ¿"
-msgid "Insert link"
-msgstr "æ’入链接"
+msgid "Insert link (%{modifierKey}K)"
+msgstr "æ’入链接(%{modifierKey}K)"
msgid "Insert or edit diagram"
msgstr "æ’入或编辑图表"
@@ -24008,9 +24212,6 @@ msgstr "此项目已在insights.yml文件中筛选掉(è§projects.onlyé…置以ä
msgid "Install GitLab Runner and ensure it's running."
msgstr "安装 GitLab Runner 并确ä¿å…¶æ­£åœ¨è¿è¡Œã€‚"
-msgid "Install on clusters"
-msgstr "在群集上安装"
-
msgid "Installation"
msgstr "安装"
@@ -24349,7 +24550,7 @@ msgid "Introducing Your DevOps Reports"
msgstr "介ç»æ‚¨çš„ DevOps 报告"
msgid "Invalid 'schemaVersion' '%s'"
-msgstr ""
+msgstr "无效的 “schemaVersion†“%sâ€"
msgid "Invalid Insights config file detected"
msgstr "检测到无效的 Insights é…置文件"
@@ -25084,6 +25285,9 @@ msgstr "ç›®å‰ä¼¼ä¹Žæ— å¯ç”¨æ•°æ®æ¥è¿›è¡Œä»£ç è¦†ç›–率计算"
msgid "It's you"
msgstr "你自己"
+msgid "Italic (%{modifierKey}I)"
+msgstr "斜体(%{modifierKey}I)"
+
msgid "Italic text"
msgstr "斜体文字"
@@ -25199,7 +25403,7 @@ msgid "Iterations|Error loading iteration cadences."
msgstr "加载迭代周期时出错。"
msgid "Iterations|Incomplete issues will be added to the next iteration at %{strongStart}midnight, %{timezone}%{strongEnd}."
-msgstr ""
+msgstr "未完æˆçš„议题将在 %{strongStart}åˆå¤œ%{strongEnd} %{timezone} 添加到下一次迭代。"
msgid "Iterations|Iteration cadences"
msgstr "迭代周期"
@@ -25441,9 +25645,15 @@ msgstr "登录到 GitLab 并关è”群组。"
msgid "JiraConnect|Sign in to link groups"
msgstr "登录并关è”群组。"
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr "Jira 用户ä¸æ˜¯ç«™ç‚¹ç®¡ç†å‘˜ã€‚检查 Jira 中的æƒé™ï¼Œç„¶åŽé‡è¯•ã€‚"
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr "欢迎使用 GitLab for Jira"
@@ -25678,6 +25888,9 @@ msgstr "作业 %{jobName}"
msgid "Job Failed #%{build_id}"
msgstr "作业 #%{build_id} 已失败 "
+msgid "Job ID"
+msgstr "作业 ID"
+
msgid "Job artifacts"
msgstr "作业产物"
@@ -25696,6 +25909,9 @@ msgstr "作业已阻塞。请检查Runner。"
msgid "Job logs and artifacts"
msgstr "作业日志和产物"
+msgid "Job name"
+msgstr "作业å:"
+
msgid "Job was retried"
msgstr "作业已é‡è¯•"
@@ -25802,7 +26018,7 @@ msgid "JobAssistant|delayed"
msgstr "延迟"
msgid "JobAssistant|manual"
-msgstr "手册"
+msgstr "手动"
msgid "JobAssistant|minute(s)"
msgstr "分钟数"
@@ -25811,10 +26027,10 @@ msgid "JobAssistant|never"
msgstr "从ä¸"
msgid "JobAssistant|on_failure"
-msgstr "on_failure"
+msgstr "之å‰å­˜åœ¨å¤±è´¥ä½œä¸šæ—¶\n"
msgid "JobAssistant|on_success"
-msgstr "on_success"
+msgstr "之å‰ä½œä¸šéƒ½æˆåŠŸæ—¶"
msgid "JobAssistant|second(s)"
msgstr "秒数"
@@ -25861,6 +26077,9 @@ msgstr "没有å¯æ˜¾ç¤ºçš„作业"
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr "对任务过滤åŽçš„æœç´¢åŠŸèƒ½ï¼Œå½“å‰ä¸æ”¯æŒæœç´¢åŽŸå§‹æ–‡æœ¬ã€‚请使用å¯ç”¨çš„æœç´¢ä»¤ç‰Œã€‚"
+msgid "Jobs|Root cause analysis"
+msgstr "根本原因分æž"
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr "获å–失败的任务时出错。"
@@ -26023,6 +26242,12 @@ msgstr "等待资æº"
msgid "Job|We could not find this element"
msgstr "找ä¸åˆ°æ­¤å…ƒç´ "
+msgid "Job|You do not have permission to read this job's log"
+msgstr "您没有æƒé™é˜…读此作业的日志"
+
+msgid "Job|You do not have permission to retry this job"
+msgstr "您没有æƒé™é‡è¯•æ­¤ä½œä¸š"
+
msgid "Job|allowed to fail"
msgstr "å…许失败"
@@ -26086,9 +26311,6 @@ msgstr "ä¿ç•™æœ€è¿‘æˆåŠŸä½œä¸šçš„产物"
msgid "Keep divergent refs"
msgstr "ä¿ç•™åˆ†å‰çš„refs"
-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 "ä¿æŒæ‰€æœ‰ SAST 分æžå™¨å·²å¯ç”¨ï¼Œä»¥ç¡®ä¿é¡¹ç›®åœ¨ä»¥åŽæ·»åŠ æ–°è¯­è¨€æ—¶ä¸ä¼šè¿‡æ—¶ã€‚确定应用哪些分æžå™¨æ˜¯ä¸€ä¸ªæ¶ˆè€—最少资æºå¹¶ä¸ºæµæ°´çº¿å¢žåŠ æœ€å°‘时间的过程。å¯ç”¨æ‰€æœ‰ SAST 分æžå™¨å¯ç¡®ä¿æœ€å¤§è¦†ç›–范围。"
-
msgid "Kerberos access denied"
msgstr "Kerberos访问被拒ç»"
@@ -26304,6 +26526,9 @@ msgstr "最近%{days}天"
msgid "Last 2 weeks"
msgstr "最近 2 周"
+msgid "Last 24 hours"
+msgstr "过去 24 å°æ—¶"
+
msgid "Last Accessed On"
msgstr "最åŽè®¿é—®äºŽ"
@@ -26935,9 +27160,6 @@ msgstr "å°† Sentry 连接到 GitLab 以å‘现和查看您的应用程åºç”Ÿæˆçš
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr "从项目的侧边æ é“¾æŽ¥å¤–部 wiki。 %{docs_link}"
-msgid "Link copied"
-msgstr "链接已å¤åˆ¶"
-
msgid "Link copied to clipboard."
msgstr "链接已å¤åˆ¶åˆ°å‰ªè´´æ¿ã€‚"
@@ -27085,8 +27307,8 @@ msgstr "加载更多"
msgid "Loading snippet"
msgstr "正在加载代ç ç‰‡æ®µ"
-msgid "Loading the GitLab IDE..."
-msgstr "加载GitLab IDE..."
+msgid "Loading the GitLab IDE"
+msgstr "正在加载 IDE"
msgid "Loading, please wait."
msgstr "正在加载,请ç¨å€™ã€‚"
@@ -27151,6 +27373,9 @@ msgstr "é”定的文件"
msgid "Locked the discussion."
msgstr "é”定讨论."
+msgid "Locking %{issuableDisplayName}"
+msgstr "é”定 %{issuableDisplayName}"
+
msgid "Locks the discussion."
msgstr "é”定讨论."
@@ -27343,6 +27568,9 @@ msgstr "管ç†é¡¹ç›®ã€‚"
msgid "Manage two-factor authentication"
msgstr "管ç†åŒé‡è®¤è¯"
+msgid "Manage usage"
+msgstr "管ç†ä½¿ç”¨æƒ…况"
+
msgid "Manage your project's triggers"
msgstr "管ç†æ‚¨çš„项目触å‘器"
@@ -27376,6 +27604,9 @@ msgstr "è¦æ‰‹åŠ¨é“¾æŽ¥æ­¤è®®é¢˜ï¼Œå°†å…¶æ·»åŠ åˆ°%{linkStart}原始æ¼æ´ž%{link
msgid "Map a FogBugz account ID to a GitLab user"
msgstr "å°†FogBugzå¸æˆ·ID映射为GitLab用户"
+msgid "Map data from"
+msgstr "映射数æ®æ¥è‡ª"
+
msgid "Mar"
msgstr "3月"
@@ -27433,6 +27664,9 @@ msgstr "添加斜体文本(%{modifierKey}I)"
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr "添加斜体文本(%{modifier_key}I)"
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr "添加删除线文本(%{modifierKey}%{shiftKey}X)"
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr "添加删除线文本 (%{modifierKey}⇧X)"
@@ -27457,9 +27691,6 @@ msgstr "å‡å°‘缩进行(%{modifier_key}[)"
msgid "MarkdownEditor|header"
msgstr "标题"
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr "æ”¯æŒ %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-
msgid "Marked"
msgstr "已标记"
@@ -27559,8 +27790,8 @@ msgstr "最大值"
msgid "Max authenticated Git LFS requests per period per user"
msgstr "æ¯ä¸ªç”¨æˆ·æ¯ä¸ªæ—¶æœŸçš„最大ç»è¿‡èº«ä»½éªŒè¯çš„ Git LFS 请求"
-msgid "Max file size is 200 KB."
-msgstr "最大文件大å°ä¸º200 KB。"
+msgid "Max file size is 200 KiB."
+msgstr "最大文件大å°ä¸º 200 KiB。"
msgid "Max role"
msgstr "最大角色"
@@ -27610,8 +27841,8 @@ msgstr "最大产物大å°ï¼ˆMB)"
msgid "Maximum attachment size"
msgstr "最大附件大å°"
-msgid "Maximum attachment size (MB)"
-msgstr "æœ€å¤§é™„ä»¶å¤§å° (MB)"
+msgid "Maximum attachment size (MiB)"
+msgstr "最大附件大å°ï¼ˆMiB)"
msgid "Maximum authenticated API requests per rate limit period per user"
msgstr "æ¯ä¸ªç”¨æˆ·æ¯ä¸ªé€ŸçŽ‡é™åˆ¶æœŸçš„æœ€å¤§å·²éªŒè¯ API 请求数"
@@ -27637,8 +27868,8 @@ msgstr "最大延迟 (分钟)"
msgid "Maximum diff patch size"
msgstr "最大差异补ä¸å¤§å°"
-msgid "Maximum diff patch size (Bytes)"
-msgstr "最大差异补ä¸å¤§å°ï¼ˆå­—节)"
+msgid "Maximum diff patch size (bytes)"
+msgstr "最大差异补ä¸å¤§å°ï¼ˆbytes)"
msgid "Maximum duration of a session."
msgstr "会è¯çš„最大有效期é™ã€‚"
@@ -27646,8 +27877,8 @@ msgstr "会è¯çš„最大有效期é™ã€‚"
msgid "Maximum export size"
msgstr "最大导出大å°"
-msgid "Maximum export size (MB)"
-msgstr "最大导出大å°ï¼ˆMB)"
+msgid "Maximum export size (MiB)"
+msgstr "最大导出大å°ï¼ˆMiB)"
msgid "Maximum field length"
msgstr "最大字段长度"
@@ -27682,8 +27913,8 @@ msgstr "æ¯åˆ†é’Ÿæœ€å¤§ç¾¤ç»„导入请求"
msgid "Maximum import size"
msgstr "最大导入大å°"
-msgid "Maximum import size (MB)"
-msgstr "æœ€å¤§å¯¼å…¥å¤§å° (MB)"
+msgid "Maximum import size (MiB)"
+msgstr "最大导入大å°ï¼ˆMiB)"
msgid "Maximum job artifact size"
msgstr "最大作业产物大å°"
@@ -27703,8 +27934,11 @@ msgstr "最大 npm 包文件大å°ï¼ˆä»¥å­—节为å•ä½ï¼‰"
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr "超过%{name}的最大数é‡(%{count})"
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
-msgstr "Webhook å’ŒæœåŠ¡è§¦å‘çš„å•æ¬¡æŽ¨é€ä¸­çš„最大更改数(分支或标签)(默认为 3)。"
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr "å•æ¬¡æŽ¨é€ä¸­çš„最大å˜æ›´æ•°ï¼ˆåˆ†æ”¯æˆ–标签),超过该数é‡å°†åˆ›å»ºæ‰¹é‡æŽ¨é€äº‹ä»¶ï¼ˆé»˜è®¤å€¼ä¸º `3`)。设置为 `0` ä¸ä¼šç¦ç”¨æŽ¨é€ã€‚"
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
+msgstr "ä¸ä¼šè§¦å‘ webhooks 和集æˆï¼ˆé»˜è®¤ä¸º `3`)的å•æ¬¡æŽ¨é€ä¸­çš„最大å˜æ›´æ•°ï¼ˆåˆ†æ”¯æˆ–标签)。设置为 `0` ä¸ä¼šç¦ç”¨ã€‚"
msgid "Maximum number of comments exceeded"
msgstr "超出最大评论数"
@@ -27724,12 +27958,18 @@ msgstr "ç»è¿‡èº«ä»½éªŒè¯çš„用户æ¯åˆ†é’Ÿçš„最大请求数"
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr "未ç»èº«ä»½éªŒè¯çš„ IP 地å€æ¯åˆ†é’Ÿçš„最大请求数"
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
-msgstr "æ¯ä¸ªåŽŸå§‹è·¯å¾„æ¯åˆ†é’Ÿçš„最大请求数(默认为 300)。设置为 0 以ç¦ç”¨èŠ‚æµã€‚"
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr "æ¯ä¸ªåŽŸå§‹è·¯å¾„æ¯åˆ†é’Ÿçš„最大请求数(默认为 300)。设置为 0 å¯ä»¥ç¦ç”¨ã€‚"
+
+msgid "Maximum number of stages per value stream exceeded"
+msgstr "超出æ¯ä¸ªä»·å€¼æµçš„最大阶段数"
msgid "Maximum number of unique IP addresses per user."
msgstr "æ¯ä¸ªç”¨æˆ·çš„最大唯一 IP 地å€æ•°ã€‚"
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr "超出æ¯ä¸ªå‘½å空间的最大价值æµæ•°é‡"
+
msgid "Maximum number of variables loaded (2000)"
msgstr "已加载最大å˜é‡æ•° (2000)"
@@ -27754,8 +27994,8 @@ msgstr "æ¯åˆ†é’Ÿæœ€å¤§é¡¹ç›®å¯¼å…¥è¯·æ±‚"
msgid "Maximum push size"
msgstr "最大推é€å¤§å°"
-msgid "Maximum push size (MB)"
-msgstr "最大推é€å¤§å° (MB)"
+msgid "Maximum push size (MiB)"
+msgstr "最大推é€å¤§å°ï¼ˆMiB)"
msgid "Maximum requests per 10 minutes per IP address"
msgstr "æ¯ä¸ª IP 地å€æ¯ 10 分钟的最大请求数"
@@ -27787,8 +28027,8 @@ msgstr "导入文件的最大大å°ã€‚"
msgid "Maximum size of individual attachments in comments."
msgstr "评论中å•ä¸ªé™„件的最大大å°ã€‚"
-msgid "Maximum size of pages (MB)"
-msgstr "最大页é¢å¤§å°ï¼ˆMB)"
+msgid "Maximum size of pages (MiB)"
+msgstr "最大 pages 大å°ï¼ˆMiB)"
msgid "Maximum snippet size"
msgstr "最大代ç ç‰‡æ®µå¤§å°"
@@ -28129,6 +28369,9 @@ msgstr "åˆå¹¶è¯·æ±‚分æž"
msgid "Merge request approvals"
msgstr "åˆå¹¶è¯·æ±‚批准"
+msgid "Merge request change summary"
+msgstr "åˆå¹¶è¯·æ±‚å˜æ›´æ‘˜è¦"
+
msgid "Merge request commits"
msgstr "åˆå¹¶è¯·æ±‚æ交"
@@ -28147,6 +28390,9 @@ msgstr "åˆå¹¶è¯·æ±‚报告"
msgid "Merge request status"
msgstr "åˆå¹¶è¯·æ±‚状æ€"
+msgid "Merge request summaries"
+msgstr "åˆå¹¶è¯·æ±‚摘è¦"
+
msgid "Merge request summary"
msgstr "åˆå¹¶è¯·æ±‚摘è¦"
@@ -28264,9 +28510,6 @@ msgstr "对%{selectStart}开始于%{selectEnd}到%{end}è¡Œå‘表评论"
msgid "MergeRequestDiffs|Select comment starting line"
msgstr "选择评论起始行"
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr "ä¿å­˜è¯„论è‰ç¨¿æ—¶å‘生错误。"
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr "无法自动执行此æ“作。它å¯èƒ½å·²ç»å®Œæˆï¼Œæˆ–者最近的æ交å¯èƒ½å·²ç»æ›´æ–°äº†å…¶ä¸­çš„一些内容。请在本地执行此æ“作。"
@@ -28294,9 +28537,6 @@ msgstr "åˆå¹¶è¯·æ±‚还原失败"
msgid "MergeRequests|Reference copied"
msgstr "å·²å¤åˆ¶å¼•ç”¨"
-msgid "MergeRequests|Saving the comment failed"
-msgstr "ä¿å­˜è¯„论失败"
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr "压缩失败:本地æ交,解决任何存在的冲çªï¼Œç„¶åŽæŽ¨é€åˆ†æ”¯ã€‚"
@@ -28321,6 +28561,9 @@ msgstr "查看文件 @ %{commitId}"
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr "查看已替æ¢æ–‡ä»¶ @ %{commitId}"
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr "您的评论无法æ交,原因为 %{reason}。"
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr "讨论%{commitLink}æ交"
@@ -28387,6 +28630,18 @@ msgstr "由 @%{username} 审核,但尚未批准"
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr "æœç´¢ï¼ˆä¾‹å¦‚ *.vue)(%{MODIFIER_KEY}P)"
+msgid "MergeRequest|Summaries are written by AI"
+msgstr "摘è¦ç”± AI 生æˆ"
+
+msgid "MergeRequest|Summary notes"
+msgstr "摘è¦æ³¨é‡Š"
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr "æ­¤æ述是使用 AI 为 %{revision} 版本生æˆçš„"
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr "æ­¤æ述是使用 AI 生æˆçš„"
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr "%{sourceTopic} 将被删除"
@@ -28483,9 +28738,6 @@ msgstr "更新您的指标图åƒæ—¶å‡ºçŽ°é—®é¢˜ã€‚"
msgid "MetricImages|There was an issue uploading your image."
msgstr "上传您的指标图åƒæ—¶å‡ºçŽ°é—®é¢˜ã€‚"
-msgid "Metrics"
-msgstr "指标"
-
msgid "Metrics - Grafana"
msgstr "指标 - Grafana"
@@ -28540,214 +28792,45 @@ msgstr "找ä¸åˆ°è¯·æ±‚路径的仪表æ¿"
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr "您无æƒæ·»åŠ æ˜Ÿæ ‡åˆ°æ­¤ä»ªè¡¨æ¿"
-msgid "Metrics|1. Define and preview panel"
-msgstr "1. 定义和预览é¢æ¿"
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr "2. å°†é¢æ¿YAML粘贴到仪表æ¿"
-
-msgid "Metrics|Add metric"
-msgstr "添加指标"
-
-msgid "Metrics|Add panel"
-msgstr "添加é¢æ¿"
-
-msgid "Metrics|Avg"
-msgstr "å¹³å‡"
-
-msgid "Metrics|Back to dashboard"
-msgstr "返回到仪表æ¿"
-
-msgid "Metrics|Cancel"
-msgstr "å–消"
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr "查看有关部署到环境的CI/CD文档"
-
-msgid "Metrics|Collapse panel"
-msgstr "收起é¢æ¿"
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr "收起é¢æ¿(Esc)"
-
-msgid "Metrics|Copy YAML"
-msgstr "å¤åˆ¶YAML"
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr "å¤åˆ¶å¹¶ç²˜è´´é¢æ¿YAML到您的仪表æ¿YAML文件。"
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr "创建自定义仪表æ¿%{fileName}"
-
msgid "Metrics|Create metric"
msgstr "创建指标"
-msgid "Metrics|Create new dashboard"
-msgstr "创建新仪表æ¿"
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr "创建仪表æ¿é…置文件"
-
-msgid "Metrics|Current"
-msgstr "当å‰"
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr "仪表æ¿æ–‡ä»¶å¯ä»¥åœ¨æ­¤é¡¹ç›®çš„根目录下%{codeStart}.gitlab/dashboards%{codeEnd}中找到。"
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr "在下é¢å®šä¹‰é¢æ¿YAML以预览é¢æ¿ã€‚"
-
msgid "Metrics|Delete metric"
msgstr "删除指标"
msgid "Metrics|Delete metric?"
msgstr "删除指标?"
-msgid "Metrics|Duplicate"
-msgstr "å¤åˆ¶"
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr "å¤åˆ¶å½“å‰ä»ªè¡¨æ¿"
-
-msgid "Metrics|Duplicate dashboard"
-msgstr "å¤åˆ¶ä»ªè¡¨æ¿"
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr "å¤åˆ¶æ­¤ä»ªè¡¨ç›˜ä»¥æ·»åŠ é¢æ¿æˆ–编辑仪表æ¿YAML。"
-
-msgid "Metrics|Duplicating..."
-msgstr "正在å¤åˆ¶..."
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr "编辑仪表æ¿YAML"
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] "编辑指标"
-
-msgid "Metrics|Expand panel"
-msgstr "展开é¢æ¿"
+msgstr "编辑指标"
msgid "Metrics|For grouping similar metrics"
msgstr "用于分组类似指标"
-msgid "Metrics|Invalid time range, please verify."
-msgstr "无效的时间范围,请验è¯ã€‚"
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr "Y 轴是标记(通常是å•ä½ï¼‰ï¼ŒX 轴总是代表时间。"
msgid "Metrics|Legend label (optional)"
msgstr "图例标记(å¯é€‰ï¼‰"
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr "链接包å«ä¸€ä¸ªæ— æ•ˆçš„时间窗å£ï¼Œè¯·éªŒè¯é“¾æŽ¥ä»¥æŸ¥çœ‹è¯·æ±‚的时间范围。"
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr "链接包å«æ— æ•ˆçš„图表信æ¯ï¼Œè¯·éªŒè¯é“¾æŽ¥ä»¥æŸ¥çœ‹å±•å¼€åŽçš„é¢æ¿ã€‚"
-
-msgid "Metrics|Manage chart links"
-msgstr "管ç†å›¾è¡¨é“¾æŽ¥"
-
-msgid "Metrics|Max"
-msgstr "最大值"
-
-msgid "Metrics|Metrics Settings"
-msgstr "指标设置"
-
-msgid "Metrics|Min"
-msgstr "最å°å€¼"
-
-msgid "Metrics|More actions"
-msgstr "更多æ“作"
-
msgid "Metrics|Must be a valid PromQL query."
msgstr "必须是有效的 PromQL 查询。"
msgid "Metrics|New metric"
msgstr "创建指标"
-msgid "Metrics|Open repository"
-msgstr "打开仓库"
-
-msgid "Metrics|Panel YAML"
-msgstr "é¢æ¿YAML"
-
-msgid "Metrics|Panel YAML copied"
-msgstr "é¢æ¿YAMLå·²å¤åˆ¶"
-
-msgid "Metrics|Preview panel"
-msgstr "预览é¢æ¿"
-
msgid "Metrics|PromQL query is valid"
msgstr "PromotQL 查询有效"
msgid "Metrics|Prometheus Query Documentation"
msgstr "Prometheus查询文档"
-msgid "Metrics|Refresh Prometheus data"
-msgstr "刷新Prometheusæ•°æ®"
-
-msgid "Metrics|Refresh dashboard"
-msgstr "刷新仪表æ¿"
-
-msgid "Metrics|Select a value"
-msgstr "选择一个值"
-
-msgid "Metrics|Set refresh rate"
-msgstr "设置刷新率"
-
-msgid "Metrics|Star dashboard"
-msgstr "星标仪表æ¿"
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr "创建仪表æ¿æ—¶å‡ºé”™ã€‚"
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr "创建仪表æ¿æ—¶å‘生错误。 %{error}"
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr "获å–标注时å‘生错误。请é‡è¯•ã€‚"
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr "获å–环境数æ®æ—¶å‡ºé”™ï¼Œè¯·é‡è¯•"
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr "获å–标注信æ¯æ—¶å‡ºé”™ã€‚"
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr "获å–仪表盘验è¯è­¦å‘Šä¿¡æ¯æ—¶å‡ºé”™ã€‚"
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr "获å–部署信æ¯æ—¶å‡ºé”™ã€‚"
-
-msgid "Metrics|There was an error getting environments information."
-msgstr "获å–环境信æ¯æ—¶å‡ºé”™ã€‚"
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr "获å–å˜é‡\"%{name}\"的选项时出错。"
-
msgid "Metrics|There was an error trying to validate your query"
msgstr "å°è¯•éªŒè¯æ‚¨çš„查询时出错"
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr "读å–指标时出错"
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr "读å–指标时出错。%{message}"
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr "è¦åˆ›å»ºæ–°çš„仪表æ¿ï¼Œè¯·å°†æ–°çš„YAML文件添加到该项目的根目录下%{codeStart}.gitlab /dashboards%{codeEnd}中。"
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr "æ¥è‡ªPrometheus终端节点的æ„外部署数æ®å“应"
-
msgid "Metrics|Unit label"
msgstr "å•ä½æ ‡è®°"
-msgid "Metrics|Unstar dashboard"
-msgstr "仪表盘å–消星标"
-
msgid "Metrics|Used as a title for the chart"
msgstr "用作图表的标题"
@@ -28757,24 +28840,12 @@ msgstr "用于查询返回å•ä¸ªç³»åˆ—时。如果返回多个系列,相应的
msgid "Metrics|Validating query"
msgstr "正在验è¯æŸ¥è¯¢"
-msgid "Metrics|Values"
-msgstr "值"
-
-msgid "Metrics|View documentation"
-msgstr "查看文档"
-
msgid "Metrics|Y-axis label"
msgstr "Y 轴标记"
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr "您å¯ä»¥å°†æ­¤ä»ªè¡¨æ¿çš„副本ä¿å­˜åˆ°ä»“库以便自定义。请选择一个文件å称和分支æ¥ä¿å­˜å®ƒã€‚"
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr "您å³å°†æ°¸ä¹…删除此指标且无法撤消。"
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr "您的仪表æ¿æž¶æž„无效。编辑仪表æ¿ä»¥ä¿®æ­£YAML架构。"
-
msgid "Metrics|e.g. HTTP requests"
msgstr "例如:HTTP 请求"
@@ -29160,6 +29231,9 @@ msgstr "模型候选项详情"
msgid "MlExperimentTracking|Model experiments"
msgstr "模型实验"
+msgid "MlExperimentTracking|Model registry"
+msgstr "模型库"
+
msgid "MlExperimentTracking|Name"
msgstr "å称"
@@ -29196,6 +29270,9 @@ msgstr "关闭"
msgid "Model experiments"
msgstr "模型实验"
+msgid "ModelRegistry|Model registry"
+msgstr "模型库"
+
msgid "Modified"
msgstr "已修改"
@@ -29256,9 +29333,6 @@ msgstr "更多信æ¯"
msgid "More information is available|here"
msgstr "这里"
-msgid "More information."
-msgstr "更多信æ¯ã€‚"
-
msgid "More options"
msgstr "更多选项"
@@ -29436,6 +29510,12 @@ msgstr "命å空间ID:"
msgid "Namespace Limits"
msgstr "命å空间é™åˆ¶"
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr "命å空间ä¸å­˜åœ¨æˆ–您没有æƒé™ã€‚"
+
+msgid "Namespace must be provided."
+msgstr "å¿…é¡»æ供命å空间。"
+
msgid "Namespace or group to import repository into does not exist."
msgstr "è¦å¯¼å…¥ä»£ç åº“的命å空间或群组ä¸å­˜åœ¨ã€‚"
@@ -29455,7 +29535,7 @@ msgid "NamespaceLimits|Add minimum free storage amount (in GiB) that will be use
msgstr "添加最å°å…费存储é‡ï¼ˆä»¥ GiB 为å•ä½ï¼‰ï¼Œè¯¥å­˜å‚¨é‡é€‚用于å…费命å空间的仪表盘é™åˆ¶ã€‚è¦å–消é™åˆ¶ï¼Œè¯·å°†å€¼è®¾ç½®ä¸º 0 并å•å‡»â€œæ›´æ–°é™åˆ¶â€æŒ‰é’®ã€‚"
msgid "NamespaceLimits|Add minimum free storage amount (in GiB) that will be used to show notifications for namespace on free plan. To remove the limit, set the value to 0 and click \"Update limit\" button."
-msgstr ""
+msgstr "添加最å°å…费存储é‡ï¼ˆä»¥ GiB 为å•ä½ï¼‰ï¼Œè¯¥å­˜å‚¨é‡ç”¨äºŽä¸ºå…费版的命å空间显示通知。è¦å–消é™åˆ¶ï¼Œè¯·å°†å€¼è®¾ç½®ä¸º 0 并å•å‡»â€œæ›´æ–°é™åˆ¶â€æŒ‰é’®ã€‚"
msgid "NamespaceLimits|Confirm deletion"
msgstr "确认删除"
@@ -29539,7 +29619,7 @@ msgid "NamespaceLimits|There was an error fetching the exclusion list, try refre
msgstr "获å–排除列表时出错,请å°è¯•åˆ·æ–°é¡µé¢ã€‚"
msgid "NamespaceLimits|These namespaces won't receive any notifications nor any degraded functionality while they remain on this list"
-msgstr ""
+msgstr "这些命å空间在ä¿ç•™åœ¨æ­¤åˆ—表中时,ä¸ä¼šæ”¶åˆ°ä»»ä½•é€šçŸ¥ï¼Œä¹Ÿä¸ä¼šå‘生功能é™çº§"
msgid "NamespaceLimits|This will change the dashboard limit for all free namespaces except the excluded namespaces, the limit can be removed later."
msgstr "此项将更改所有å…费命å空间的仪表盘é™åˆ¶ï¼Œä½†æŽ’除的命å空间除外,此é™åˆ¶ç¨åŽå¯ä»¥åˆ é™¤ã€‚"
@@ -29587,13 +29667,13 @@ msgid "NamespaceStorageSize|To remove the read-only state, reduce git repository
msgstr "è¦è§£é™¤åªè¯»çŠ¶æ€ï¼Œè¯·å‡å°‘ Git 仓库和 Git LFS 存储空间,或者%{purchase_more_link_start}购买更多存储空间%{link_end}。"
msgid "NamespaceStorageSize|To remove the read-only state, reduce git repository and git LFS storage, or contact a user with the %{group_member_link_start}owner role for this namespace%{link_end} and ask them to %{purchase_more_link_start}purchase more storage%{link_end}."
-msgstr ""
+msgstr "è¦è§£é™¤åªè¯»çŠ¶æ€ï¼Œè¯·å‡å°‘ Git 版本库和 Git LFS 储存空间,或者è”系具有该命å空间%{group_member_link_start}所有者角色%{link_end}的用户,并è¦æ±‚他们 %{purchase_more_link_start}购买更多储存空间%{link_end}。"
msgid "NamespaceStorageSize|You have consumed all available storage and you can't push or add large files to projects over the free tier limit (%{free_size_limit})."
msgstr "您已ç»æ¶ˆè€—了所有å¯ç”¨çš„存储空间,ä¸èƒ½æŽ¨é€æˆ–添加超过å…费版é™åˆ¶ï¼ˆ%{free_size_limit})的大型文件。"
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} for %{namespace_name}"
-msgstr ""
+msgstr "您已达到 %{namespace_name} çš„å…费存储空间é™åˆ¶ %{free_size_limit}"
msgid "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on %{readonly_project_count} project"
msgid_plural "NamespaceStorageSize|You have reached the free storage limit of %{free_size_limit} on %{readonly_project_count} projects"
@@ -29798,7 +29878,7 @@ msgid "Navigation|Secure"
msgstr "安全"
msgid "Navigation|Switch context"
-msgstr "切æ¢ä¸Šä¸‹æ–‡"
+msgstr "切æ¢åˆ°"
msgid "Navigation|There was an error fetching search results."
msgstr "获å–æœç´¢ç»“果时出错。"
@@ -30182,12 +30262,6 @@ msgstr "无需信用å¡ã€‚"
msgid "No data available"
msgstr "æ— å¯ç”¨æ•°æ®"
-msgid "No data found"
-msgstr "未找到数æ®"
-
-msgid "No data to display"
-msgstr "没有å¯æ˜¾ç¤ºçš„æ•°æ®"
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr "未检测到部署。使用环境æ¥æŽ§åˆ¶è½¯ä»¶çš„æŒç»­éƒ¨ç½²ã€‚ %{linkStart}了解有关部署作业的更多信æ¯ã€‚%{linkEnd}"
@@ -30326,9 +30400,6 @@ msgstr "未选择ref"
msgid "No regions configured"
msgstr "未é…置区域"
-msgid "No related merge requests found."
-msgstr "未找到相关的åˆå¹¶è¯·æ±‚。"
-
msgid "No repository"
msgstr "无仓库"
@@ -30371,6 +30442,9 @@ msgstr "没有此错误的堆栈跟踪"
msgid "No starrers matched your search"
msgstr "没有符åˆæ‚¨æœç´¢æ¡ä»¶çš„星标用户"
+msgid "No start date – %{dueDate}"
+msgstr "无开始日期 — %{dueDate}"
+
msgid "No suggestions found"
msgstr "未找到任何建议"
@@ -30513,9 +30587,6 @@ msgstr "注æ„:当å‰æ´¾ç”Ÿï¼ˆfork)将ä¿æŒå…¶å¯è§ç­‰çº§ã€‚"
msgid "NoteForm|Note"
msgstr "注æ„"
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr "æ”¯æŒ %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}。对于 %{quickActionsDocsLinkStart}快速æ“作%{quickActionsDocsLinkEnd},请输入 %{keyboardStart}/%{keyboardEnd}。"
-
msgid "Notes"
msgstr "备注"
@@ -30808,6 +30879,9 @@ msgstr "æ交作者"
msgid "Notify|Committed by"
msgstr "æ交者:"
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr "在 %{project}%{parent_groups_clause} 中找ä¸åˆ°ä»¥ä¸‹ %{column} 值:%{error_lines}"
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr "ä¸æƒ³æŽ¥æ”¶æ¥è‡ªç®¡ç†å‘˜çš„更新?"
@@ -30913,18 +30987,24 @@ msgstr "无法预览此类型文件"
msgid "Notify|No work items have been imported."
msgstr "未导入任何工作项。"
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
-msgstr "æµæ°´çº¿ #%{pipeline_id} 失败ï¼"
-
msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr "æµæ°´çº¿ %{pipeline_link} 的触å‘者为"
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
-msgstr "æµæ°´çº¿å·²ä¿®å¤ï¼Œ#%{pipeline_id} 已通过ï¼"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
+msgstr "æµæ°´çº¿ %{pipeline_name_or_id} 失败ï¼"
+
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr "æµæ°´çº¿ %{pipeline_name_or_id} 已通过ï¼"
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
+msgstr "æµæ°´çº¿å·²ä¿®å¤ï¼Œ%{pipeline_name_or_id} 已通过ï¼"
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr "请检查您的æœåŠ¡æ供商是å¦æ”¯æŒç”µå­é‚®ä»¶å­åœ°å€ï¼Œä»¥åŠæ‚¨æ˜¯å¦è®¾ç½®äº†æ­£ç¡®çš„电å­é‚®ä»¶è½¬å‘地å€ã€‚"
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr "请修å¤ä¸Šé¢çš„错误,然åŽé‡è¯• CSV 导入。"
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr "请修å¤æœ‰é”™è¯¯çš„行并å†æ¬¡å°è¯• CSV 导入。"
@@ -31099,6 +31179,9 @@ msgstr "副本数"
msgid "Number of shards"
msgstr "碎片数é‡"
+msgid "Number of shards for non-code indexing"
+msgstr "éžä»£ç ç´¢å¼•çš„分片数é‡"
+
msgid "OK"
msgstr "确定"
@@ -31773,6 +31856,12 @@ msgstr "有åºåˆ—表"
msgid "Organizations"
msgstr "组织"
+msgid "Organization|Organization navigation"
+msgstr "组织导航"
+
+msgid "Organization|Organization overview"
+msgstr "组织概览"
+
msgid "Orphaned member"
msgstr "孤儿æˆå‘˜"
@@ -32293,6 +32382,18 @@ msgstr "项目级别"
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr "如果软件包å称或版本符åˆæ­¤æ­£åˆ™è¡¨è¾¾å¼ï¼Œåˆ™å‘布软件包。"
+msgid "PackageRegistry|Published %{date}"
+msgstr "å‘布于 %{date}"
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr "ç”± %{author} å‘布于 %{date}"
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr "ç”± %{author} 于 %{date} å‘布到 %{projectName}"
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr "于 %{date} å‘布到 %{projectName}"
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr "于%{datetime}å‘布到%{project}软件包注册表"
@@ -32863,9 +32964,6 @@ msgstr "æµæ°´çº¿è®¡åˆ’"
msgid "Pipeline URL"
msgstr "æµæ°´çº¿ URL"
-msgid "Pipeline artifacts"
-msgstr "æµæ°´çº¿äº§ç‰©"
-
msgid "Pipeline creation rate limits"
msgstr "æµæ°´çº¿åˆ›å»ºé€ŸçŽ‡é™åˆ¶"
@@ -33067,6 +33165,15 @@ msgstr "å·²å¯ç”¨"
msgid "PipelineSchedules|All"
msgstr "所有"
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr "创建æµæ°´çº¿è®¡åˆ’时出错。"
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr "确定è¦åˆ é™¤æ­¤æµæ°´çº¿è®¡åˆ’å—?"
@@ -33076,6 +33183,9 @@ msgstr "å¯ä»¥æœ‰è‡ªå®šä¹‰çš„ CI/CD å˜é‡ã€‚"
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr "创建新的æµæ°´çº¿è®¡åˆ’"
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr "Cron 时区"
@@ -33133,9 +33243,6 @@ msgstr "针对特定分支或标签è¿è¡Œã€‚"
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr "使用与计划所有者相åŒçš„项目æƒé™è¿è¡Œã€‚"
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr "ä¿å­˜æµæ°´çº¿è®¡åˆ’"
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr "æµæ°´çº¿å·²å®‰æŽ’è¿è¡Œã€‚有关详细信æ¯ï¼Œè¯·è½¬åˆ° %{linkStart}æµæ°´çº¿é¡µé¢%{linkEnd}。 "
@@ -33322,9 +33429,6 @@ msgstr "CI/CD 目录"
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr "å­æµæ°´çº¿ï¼ˆ%{linkStart}父æµæ°´çº¿%{linkEnd})"
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr "å­æµæ°´çº¿ï¼ˆ%{link_start}父æµæ°´çº¿%{link_end})"
-
msgid "Pipelines|Clear runner caches"
msgstr "清除Runner缓存"
@@ -33436,6 +33540,9 @@ msgstr "准备好为您的项目设置 CI/CD å—?"
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr "å˜åŸºåˆ›å»ºä¸€ä¸ªæµæ°´çº¿ï¼Œè¯¥æµæ°´çº¿è¿è¡Œæºè‡ªæ´¾ç”Ÿé¡¹ç›®åˆå¹¶è¯·æ±‚的代ç ã€‚因此,存在潜在的安全éšæ‚£ï¼Œä¾‹å¦‚ CI å˜é‡çš„暴露。"
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr "é‡è¯• %{jobName} 作业"
+
msgid "Pipelines|Revoke trigger"
msgstr "撤销触å‘器"
@@ -33487,9 +33594,6 @@ msgstr "æ­¤ GitLab CI é…置无效:%{reason}。%{linkStart}了解更多%{linkE
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr "æ­¤GitLab CIé…置有效。"
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr "æ­¤æµæ°´çº¿ä¸ºå…·æœ‰çˆ¶æµæ°´çº¿çš„å­æµæ°´çº¿"
-
msgid "Pipelines|This pipeline is stuck"
msgstr "æµæ°´çº¿å¡ä½äº†"
@@ -33508,8 +33612,8 @@ msgstr "此项目当å‰æœªé…ç½®è¿è¡Œæµæ°´çº¿ã€‚"
msgid "Pipelines|Token"
msgstr "令牌"
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
-msgstr "用于æµæ°´çº¿çš„计算å•ä½æ€»é‡"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
+msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
msgstr "æµæ°´çº¿çš„作业总数"
@@ -33568,9 +33672,15 @@ msgstr "您将在此列表中看到最多 100 个作业。è¦æŸ¥çœ‹æ‰€æœ‰å¤±è´¥ç
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr "您的更改已æˆåŠŸæ交,现在é‡å®šå‘到新的åˆå¹¶è¯·æ±‚页é¢ã€‚"
+msgid "Pipelines|created"
+msgstr "已创建"
+
msgid "Pipelines|error"
msgstr "错误"
+msgid "Pipelines|finished"
+msgstr "已完æˆ"
+
msgid "Pipelines|invalid"
msgstr "无效"
@@ -33637,6 +33747,12 @@ msgstr "åˆå¹¶é˜Ÿåˆ—æµæ°´çº¿ä½œä¸šæ— æ³•é‡è¯•"
msgid "Pipeline|Merged result pipeline"
msgstr "åˆå¹¶ç»“æžœæµæ°´çº¿"
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr "已通过"
@@ -33721,6 +33837,9 @@ msgstr "æ­¤æµæ°´çº¿åœ¨æ­¤åˆå¹¶è¯·æ±‚çš„æºåˆ†æ”¯çš„内容上è¿è¡Œï¼Œè€Œä¸æ˜¯
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr "è¦è¿è¡Œåˆå¹¶è¯·æ±‚æµæ°´çº¿ï¼ŒCI/CD é…置文件中的作业%{linkStart}å¿…é¡»é…置为%{linkEnd}在åˆå¹¶è¯·æ±‚æµæ°´çº¿ä¸­è¿è¡Œã€‚"
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr "触å‘者"
@@ -33847,9 +33966,6 @@ msgstr "请确认您的电å­é‚®ä»¶åœ°å€"
msgid "Please contact an admin to create runners."
msgstr "请è”系管ç†å‘˜åˆ›å»º runners。"
-msgid "Please contact an admin to register runners."
-msgstr "请è”系管ç†å‘˜æ³¨å†ŒRunner。"
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr "如果您认为这是一个错误,请è”系您的GitLab 管ç†å‘˜ã€‚"
@@ -34000,8 +34116,8 @@ msgstr "请å†è¯•ä¸€æ¬¡"
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr "请å°è¯•åˆ·æ–°é¡µé¢ã€‚如果问题ä»ç„¶å­˜åœ¨ï¼Œè¯·è”系支æŒäººå‘˜ã€‚"
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
-msgstr "请输入%{phrase_code}以继续或关闭此对è¯æ¡†ä»¥å–消。"
+msgid "Please type %{phrase_code} to proceed."
+msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
msgstr "请使用此表å•ä¸¾æŠ¥åˆ›å»ºåžƒåœ¾è®®é¢˜ã€è¯„论或行为ä¸å½“的管ç†å‘˜ã€‚"
@@ -34516,6 +34632,9 @@ msgstr "éšæ—¶é—´å˜åŒ–的事件"
msgid "ProductAnalytics|Feature Usages"
msgstr "功能使用"
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr "有关更多信æ¯ï¼Œè¯·å‚阅%{linkStart}文档%{linkEnd}。"
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr "è¦è®©äº§å“分æžä»ªè¡¨ç›˜å¼€å§‹å‘您显示一些数æ®ï¼Œæ‚¨éœ€è¦å°†åˆ†æžè·Ÿè¸ªä»£ç æ·»åŠ åˆ°æ‚¨çš„项目中。"
@@ -34555,6 +34674,9 @@ msgstr "您想获得关于什么的洞察?"
msgid "ProductAnalytics|Page Views"
msgstr "Page 视图"
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr "产å“分æžå…¥é—¨"
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr "é‡å¤è®¿é—®çŽ‡"
@@ -34696,6 +34818,9 @@ msgstr "于"
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr "您å³å°†æ°¸ä¹…删除 %{yourAccount},以åŠä¸Žæ‚¨çš„å¸æˆ·å…³è”的所有议题,åˆå¹¶è¯·æ±‚和群组。一旦确认 %{deleteAccount},此æ“作便无法撤销和æ¢å¤ã€‚"
+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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr "您å³å°†æ°¸ä¹…删除 %{yourAccount},以åŠä¸Žæ‚¨çš„è´¦å·å…³è”的所有议题,åˆå¹¶è¯·æ±‚和群组。一旦确认 %{deleteAccount},此æ“作便无法撤销和æ¢å¤ã€‚您å¯èƒ½éœ€è¦ç­‰å¾… 7 天æ‰èƒ½ä½¿ç”¨ç›¸åŒçš„用户å或电å­é‚®ä»¶åˆ›å»ºæ–°è´¦å·ã€‚"
+
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 "您将更改用户å %{currentUsernameBold} 为 %{newUsernameBold}。é…置文件和项目将é‡å®šå‘到 %{newUsername} 命å空间,但是一旦 %{currentUsername} 命å空间被å¦ä¸€ä¸ªç”¨æˆ·æˆ–组注册,此é‡å®šå‘将过期。请尽快更新您的远端Git仓库。"
@@ -35212,9 +35337,6 @@ msgstr "项目信æ¯ï¼š"
msgid "Project information"
msgstr "项目信æ¯"
-msgid "Project is required when cluster_type is :project"
-msgstr "cluster_type为:project时项目为必需"
-
msgid "Project members"
msgstr "项目æˆå‘˜"
@@ -35752,18 +35874,6 @@ msgstr "内部"
msgid "ProjectSettings|Issues"
msgstr "议题"
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr "Jitsu 管ç†å‘˜ç”µå­é‚®ä»¶"
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr "Jitsu 管ç†å‘˜å¯†ç "
-
-msgid "ProjectSettings|Jitsu host"
-msgstr "Jitsu 主机"
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr "Jitsu 项目 ID"
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr "此仓库中的 LFS 对象å¯ç”¨äºŽæ´¾ç”Ÿä»“库。%{linkStart}我如何移除它们?%{linkEnd}"
@@ -35947,9 +36057,6 @@ msgstr "æ交è¦åˆå¹¶åˆ°ä¸Šæ¸¸çš„更改。"
msgid "ProjectSettings|Target project"
msgstr "目标项目"
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr "Jitsu 中的项目 ID,此项目包å«æ‰€æœ‰åˆ†æžå®žä¾‹ã€‚"
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr "Cube 实例的 URL"
@@ -35971,9 +36078,6 @@ msgstr "在此派生项目中创建的åˆå¹¶è¯·æ±‚的默认目标项目。"
msgid "ProjectSettings|The default template will be applied on save."
msgstr "ä¿å­˜æ—¶å°†åº”用默认模æ¿ã€‚"
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr "Jitsu 实例的 URL"
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr "您的数æ®æ”¶é›†å™¨å®žä¾‹ä¸»æœº"
@@ -36010,11 +36114,8 @@ msgstr "上游项目"
msgid "ProjectSettings|Used for every new merge request."
msgstr "用于æ¯ä¸ªæ–°çš„åˆå¹¶è¯·æ±‚。"
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr "用于连接 Jitsu 到 Clickhouse 实例。"
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
-msgstr "用于生æˆçŸ­æœŸçš„ API 访问令牌。"
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
+msgstr "用于将 Snowplow 连接到 Clickhouse 实例。"
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
msgstr "用于从 Cube 实例中获得仪表盘数æ®ã€‚"
@@ -36496,6 +36597,9 @@ msgstr "å‡çº§åˆ°ç¾¤ç»„标记"
msgid "Promote to objective"
msgstr "å‡çº§ä¸ºç›®æ ‡"
+msgid "Promote work item"
+msgstr "æå‡å·¥ä½œé¡¹"
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr "åªèƒ½å‡çº§é¡¹ç›®é‡Œç¨‹ç¢‘。"
@@ -36511,6 +36615,9 @@ msgstr "将议题å‡çº§ä¸ºå²è¯—."
msgid "Promotes issue to incident"
msgstr "将议题æå‡ä¸ºäº‹ä»¶"
+msgid "Promotes work item to %{type}."
+msgstr "将工作项æå‡ä¸º %{type}。"
+
msgid "Promotion is not supported."
msgstr "ä¸æ”¯æŒå‡çº§ã€‚"
@@ -37108,7 +37215,7 @@ msgid "PurchaseStep|An error occurred in the purchase step. If the problem persi
msgstr "购买步骤出错。如果问题ä»ç„¶å­˜åœ¨ï¼Œè¯·è”系支æŒäººå‘˜ã€‚"
msgid "Purchase|A full name in your profile is required to make a purchase. Check that the full name field in your %{userProfileLinkStart}user profile%{userProfileLinkEnd} has both a first and last name, then retry the purchase. If the problem persists, %{supportLinkStart}contact support%{supportLinkEnd}."
-msgstr ""
+msgstr "购买时必须在您的个人资料中填写全å。 请检查您的%{userProfileLinkStart}用户个人资料%{userProfileLinkEnd}中的全å字段是å¦åŒ…å«å§“å’Œå,然åŽé‡è¯•è´­ä¹°ã€‚如果问题ä»ç„¶å­˜åœ¨ï¼Œ%{supportLinkStart}è”系支æŒ%{supportLinkEnd}。"
msgid "Purchase|An error occurred with your purchase because your group is currently linked to an expired subscription. %{supportLinkStart}Open a support ticket%{supportLinkEnd}, and our support team will assist with a workaround."
msgstr "您的购买å‘生错误,因为您的群组目å‰å·²å…³è”到过期的订阅。%{supportLinkStart}创建工å•%{supportLinkEnd},我们的支æŒå›¢é˜Ÿå°†å助工作。"
@@ -37293,9 +37400,6 @@ msgstr "项目质é‡"
msgid "Query"
msgstr "查询"
-msgid "Query cannot be processed"
-msgstr "查询无法处ç†"
-
msgid "Queued"
msgstr "队列中"
@@ -37366,7 +37470,10 @@ msgid "Read more about GitLab at %{link_to_promo}."
msgstr "在%{link_to_promo}上阅读更多关于 GitLab çš„ä¿¡æ¯ã€‚"
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
-msgstr ""
+msgstr "阅读更多关于%{changes_link_start}å˜æ›´%{link_end}ã€%{vision_link_start}愿景%{link_end}å’Œ%{design_link_start}设计%{link_end}çš„ä¿¡æ¯ã€‚"
+
+msgid "Read the documentation before applying changes."
+msgstr "在应用更改之å‰é˜…读文档。"
msgid "Read their documentation."
msgstr "阅读他们的文档。"
@@ -37549,8 +37656,8 @@ msgstr "使用此功能"
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr "您确定è¦è·³è¿‡è¿™ä¸€æ­¥å—?"
-msgid "RegistrationVerification|Enable free units of compute"
-msgstr "å¯ç”¨å…费计算å•ä½"
+msgid "RegistrationVerification|Enable free compute minutes"
+msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
msgstr "GitLab ä¸ä¼šä»Žæ‚¨çš„å¡ä¸­æ‰£æ¬¾ï¼Œå®ƒåªä¼šç”¨äºŽéªŒè¯ã€‚"
@@ -37561,8 +37668,8 @@ msgstr "使用 GitLab 共享 runner çš„æµæ°´çº¿å°†å¤±è´¥ï¼Œç›´åˆ°æ‚¨éªŒè¯æ‚¨çš
msgid "RegistrationVerification|Skip this for now"
msgstr "暂时跳过"
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
-msgstr "为了防止 GitLab 垃圾邮件和滥用,我们è¦æ±‚您使用有效的付款方å¼ï¼ˆä¾‹å¦‚借记å¡æˆ–信用å¡ï¼‰éªŒè¯æ‚¨çš„身份。在此之å‰ï¼Œæ‚¨æ— æ³•ä½¿ç”¨å…费的计算å•ä½æ¥æž„建您的应用程åºã€‚"
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
+msgstr ""
msgid "RegistrationVerification|Validate account"
msgstr "验è¯å¸æˆ·"
@@ -37576,18 +37683,6 @@ msgstr "是的,我想跳过"
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr "您å¯ä»¥ç¨åŽéªŒè¯æ‚¨çš„å¸æˆ·ã€‚"
-msgid "Registration|Checkout"
-msgstr "支付"
-
-msgid "Registration|Your GitLab group"
-msgstr "您的GitLab群组"
-
-msgid "Registration|Your first project"
-msgstr "您的第一个项目"
-
-msgid "Registration|Your profile"
-msgstr "您的个人资料"
-
msgid "Registry entry enqueued to be resynced"
msgstr "仓库æ¡ç›®æŽ’队等待é‡æ–°åŒæ­¥"
@@ -37622,10 +37717,10 @@ msgid "Related issues"
msgstr "相关议题"
msgid "Related merge request %{link_to_merge_request} to merge %{link_to_merge_request_source_branch}"
-msgstr ""
+msgstr "相关åˆå¹¶è¯·æ±‚ %{link_to_merge_request} åˆå¹¶ %{link_to_merge_request_source_branch}"
msgid "Related merge request %{link_to_merge_request} to merge %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
+msgstr "相关åˆå¹¶è¯·æ±‚ %{link_to_merge_request} å°† %{link_to_merge_request_source_branch} åˆå¹¶åˆ° %{link_to_merge_request_target_branch}"
msgid "Related merge requests"
msgstr "相关åˆå¹¶è¯·æ±‚"
@@ -37802,13 +37897,13 @@ msgstr "删除 Zoom 会议。"
msgid "Remove access"
msgstr "移除访问æƒé™"
-msgid "Remove all or specific assignee(s)"
+msgid "Remove all or specific assignees"
msgstr "删除所有或特定指派人"
msgid "Remove all or specific label(s)"
msgstr "删除所有或特定标记"
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr "删除所有或特定的审核者"
msgid "Remove approvers"
@@ -38069,6 +38164,9 @@ msgstr "续订"
msgid "Reopen"
msgstr "é‡æ–°æ‰“å¼€"
+msgid "Reopen %{issuableType}"
+msgstr "é‡æ–°æ‰“å¼€ %{issuableType}"
+
msgid "Reopen %{issueType}"
msgstr "é‡æ–°å¼€å¯%{issueType}"
@@ -38093,6 +38191,9 @@ msgstr "é‡æ–°æ‰“å¼€%{quick_action_target}"
msgid "Reopened this %{quick_action_target}."
msgstr "é‡æ–°æ‰“å¼€%{quick_action_target}。"
+msgid "Reopening %{issuableType}..."
+msgstr "正在é‡æ–°æ‰“å¼€ %{issuableType}..."
+
msgid "Reopening..."
msgstr "正在é‡æ–°æ‰“å¼€..."
@@ -38111,6 +38212,9 @@ msgstr "替æ¢æ‰€æœ‰æ ‡è®°"
msgid "Replace audio"
msgstr "替æ¢éŸ³é¢‘"
+msgid "Replace current template with filled in placeholders"
+msgstr "用填充å ä½ç¬¦æ›¿æ¢å½“å‰æ¨¡æ¿"
+
msgid "Replace file"
msgstr "替æ¢æ–‡ä»¶"
@@ -38504,7 +38608,7 @@ msgstr "仓库必须包å«è‡³å°‘1个文件。"
msgid "Repository size is above the limit."
msgstr "仓库大å°è¶…过é™åˆ¶ã€‚"
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr "仓库大å°é™åˆ¶ï¼ˆMB)"
msgid "Repository storage"
@@ -38877,9 +38981,6 @@ msgid "Reviewer"
msgid_plural "%d Reviewers"
msgstr[0] "%dä½å®¡æ ¸è€…"
-msgid "Reviewer(s)"
-msgstr "审核者"
-
msgid "Reviewers"
msgstr "审核者"
@@ -38925,12 +39026,21 @@ msgstr "路径图视图"
msgid "Role"
msgstr "角色"
+msgid "Roles and Permissions"
+msgstr "角色和æƒé™"
+
msgid "Rollback"
msgstr "回滚"
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr "根本原因分æž"
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr "Ruby"
@@ -39079,6 +39189,9 @@ msgstr "具有手动缩放和å¯é€‰è°ƒåº¦åŠŸèƒ½çš„ Amazon Linux 2 Docker HA。No
msgid "Runners|An error has occurred fetching instructions"
msgstr "获å–指令时å‘生错误"
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr "创建 runner 时出错。请é‡è¯•ã€‚"
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr "删除时出错。一些 runner å¯èƒ½æ²¡æœ‰è¢«åˆ é™¤ã€‚"
@@ -39184,10 +39297,16 @@ msgstr "创建于 %{timeAgo}"
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr "由 %{avatar} 创建于 %{timeAgo}"
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] "删除 %d 个 runner"
+msgid "Runners|Delete %{count} runners?"
+msgstr "删除 %{count} 个 runner?"
+
msgid "Runners|Delete runner"
msgstr "删除 runner"
@@ -39248,9 +39367,6 @@ msgstr "èŽ·å– Runner å‘布版本数æ®"
msgid "Runners|Filter projects"
msgstr "过滤项目"
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr "按照%{linkStart}安装和注册说明%{linkEnd}设置 runner。"
-
msgid "Runners|Get started with runners"
msgstr "Runner 入门"
@@ -39423,6 +39539,10 @@ msgid "Runners|Permanently delete %d runner"
msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] "永久删除 %d 个 runner"
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] "永久删除 %d 个 runner"
+
msgid "Runners|Platform"
msgstr "å¹³å°"
@@ -39574,7 +39694,7 @@ msgid "Runners|Runners are either:"
msgstr "Runners 是:"
msgid "Runners|Runners are grouped when they have the same authentication token. This happens when you re-use a runner configuration in more than one runner manager. %{linkStart}How does this work?%{linkEnd}"
-msgstr ""
+msgstr "Runners 在具有相åŒçš„身份验è¯ä»¤ç‰Œæ—¶è¢«åˆ†ä¸ºä¸€ç»„。当您在多个 runner 管ç†å™¨ä¸­é‡å¤ä½¿ç”¨ runner é…置时,就会å‘生这ç§æƒ…况。%{linkStart}工作原ç†æ˜¯ä»€ä¹ˆï¼Ÿ%{linkEnd}"
msgid "Runners|Runners are the agents that run your CI/CD jobs."
msgstr "Runners 是è¿è¡Œ CI/CD 作业的代ç†ã€‚"
@@ -39676,7 +39796,8 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr "注册了 runner 的项目ã€ç¾¤ç»„或实例。实例 runners 始终归管ç†å‘˜æ‰€æœ‰ã€‚"
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 "Runner 将被永久删除,ä¸å†é€‚用于项目或群组。您确定è¦ç»§ç»­å—?"
+msgid_plural "Runners|%d 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] "%d 个 runner 将被永久删除,ä¸å†é€‚用于项目或群组。您确定è¦ç»§ç»­å—?"
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr "使用此é…置的æ¯ä¸ª runner 的唯一 ID。"
@@ -39994,11 +40115,14 @@ msgstr "ä¿å­˜ä¸­"
msgid "Saving project."
msgstr "正在ä¿å­˜é¡¹ç›®ã€‚"
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
-msgstr "%{period}%{days} 在 %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr "%{hostname} 的时区"
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
-msgstr ""
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
+msgstr "%{period} %{days} 于 %{time} %{timezoneLabel} %{timezone}"
+
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
+msgstr "%{scopes} %{branches} %{agents} %{namespaces} %{period} çš„ %{rules} æ“作"
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
msgstr ""
@@ -40006,17 +40130,38 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr "添加æ¡ä»¶"
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr "添加新的 CI å˜é‡"
+
msgid "ScanExecutionPolicy|Conditions"
msgstr "æ¡ä»¶"
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr "自定义的 CI å˜é‡ï¼š"
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr "自定义å˜é‡å°†è¦†ç›–项目 CI/CD 文件和设置中定义的å˜é‡"
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr "如果该字段为空,将自动选择 runner"
+msgid "ScanExecutionPolicy|Key"
+msgstr "密钥"
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr "Kubernetes 代ç†çš„时区"
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr "CI æ¡ä»¶çš„最大数é‡ä¸º 1"
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr "一次åªèƒ½æ·»åŠ ä¸€ä¸ªå˜é‡ã€‚"
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
-msgstr ""
+msgstr "在具有 %{tags} çš„ runner 上è¿è¡Œä¸€ä¸ª %{scan} 扫æ"
msgid "ScanExecutionPolicy|Run a %{scan} scan with %{dastProfiles} on runner that %{tags}"
-msgstr ""
+msgstr "在具有 %{tags} çš„ runner 上,è¿è¡Œä¸€ä¸ªå¸¦æœ‰ %{dastProfiles} çš„ %{scan} 扫æ"
msgid "ScanExecutionPolicy|Scanner profile"
msgstr "扫æ器é…置文件"
@@ -40030,6 +40175,9 @@ msgstr "计划:"
msgid "ScanExecutionPolicy|Select a scanner"
msgstr "选择扫æ器"
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr "选择一个å˜é‡"
+
msgid "ScanExecutionPolicy|Select agent"
msgstr "选择代ç†"
@@ -40045,6 +40193,9 @@ msgstr "选择扫æ器é…置文件"
msgid "ScanExecutionPolicy|Select site profile"
msgstr "选择站点é…置文件"
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr "选择时区"
+
msgid "ScanExecutionPolicy|Site profile"
msgstr "站点é…置文件"
@@ -40054,6 +40205,9 @@ msgstr "标签"
msgid "ScanExecutionPolicy|Triggers:"
msgstr "触å‘器:"
+msgid "ScanExecutionPolicy|Value"
+msgstr "值"
+
msgid "ScanExecutionPolicy|agent"
msgstr "代ç†"
@@ -40066,6 +40220,12 @@ msgstr "有特定标签"
msgid "ScanExecutionPolicy|in namespaces"
msgstr "在命å空间中"
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr "在 %{hostname} 上"
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr "在 Kubernetes ä»£ç† Pod 上"
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr "扫æ器é…置文件 %{scannerProfile} 和网站é…置文件 %{siteProfile}"
@@ -40087,6 +40247,9 @@ msgstr "选择æ¡ä»¶ç±»åž‹"
msgid "ScanResultPolicy|Clear all"
msgstr "清除所有"
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr "自定义的 CI å˜é‡"
+
msgid "ScanResultPolicy|Except"
msgstr "除外"
@@ -40135,11 +40298,14 @@ msgstr "严é‡çº§åˆ«ï¼š"
msgid "ScanResultPolicy|Status is:"
msgstr "状æ€ï¼š"
+msgid "ScanResultPolicy|Unknown"
+msgstr "未知"
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr "当 %{scanType} %{scanners} 在 %{branches} è¿è¡Œï¼Œå¹¶æ‰¾åˆ°ç¬¦åˆä»¥ä¸‹æ¡ä»¶çš„ %{vulnerabilitiesNumber} 个 %{boldDescription} 时:"
msgid "ScanResultPolicy|When %{scanType} in an open merge request targeting the %{branches} and the licenses match all of the following criteria:"
-msgstr ""
+msgstr "当针对 %{branches} 的开放åˆå¹¶è¯·æ±‚中的 %{scanType} 和许å¯è¯åŒ¹é…以下所有æ¡ä»¶æ—¶ï¼š"
msgid "ScanResultPolicy|When %{scanners} find scanner specified conditions in an open merge request targeting the %{branches} and match %{boldDescription} of the following criteria"
msgstr "当 %{scanners} 在 %{branches} 分支的开放åˆå¹¶è¯·æ±‚中,找到指定的扫æ器æ¡ä»¶å¹¶åŒ¹é…以下æ¡ä»¶çš„ %{boldDescription}"
@@ -40566,8 +40732,8 @@ msgstr "覆盖范围检查"
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr "了解更多关于覆盖范围检查的信æ¯"
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
-msgstr "测试覆盖率é™ä½Žï¼Œéœ€æ‰¹å‡†ã€‚%{linkStart}了解更多。%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
+msgstr "测试覆盖率é™ä½Žï¼Œéœ€è¦æ‰¹å‡†ã€‚%{linkStart}了解更多%{linkEnd}。"
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr "%{featureName} åˆå¹¶è¯·æ±‚创建çªå˜å¤±è´¥"
@@ -40590,9 +40756,6 @@ msgstr "ç ´å和攻击模拟(BAS)"
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr "ç ´å和攻击模拟是一个孵化功能,通过模拟对手活动æ¥æ‰©å±•çŽ°æœ‰çš„安全测试。"
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr "默认情况下,所有分æžå™¨éƒ½è¢«åº”用æ¥è¦†ç›–您项目的所有语言,并且åªåœ¨åˆå¹¶è¯·æ±‚中检测到该语言时æ‰è¿è¡Œã€‚"
-
msgid "SecurityConfiguration|Configuration guide"
msgstr "é…置指å—"
@@ -40677,9 +40840,6 @@ msgstr "%{linkStart}Auto DevOps%{linkEnd}快速å¯ç”¨æ‰€æœ‰æŒç»­æµ‹è¯•å’Œåˆè§„
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr "应用程åºçŽ¯å¢ƒçš„è¿è¡Œæ—¶å®‰å…¨æŒ‡æ ‡"
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr "SAST分æžå·¥å…·"
-
msgid "SecurityConfiguration|SAST configuration"
msgstr "SAST é…ç½®"
@@ -40794,6 +40954,9 @@ msgstr "è¦æ‰§è¡Œçš„扫æ:"
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr "确定è¦åˆ é™¤æ­¤ç­–ç•¥å—?此æ“作无法撤消。"
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr "分支类型与任何现有分支ä¸åŒ¹é…。"
+
msgid "SecurityOrchestration|Choose a project"
msgstr "选择项目"
@@ -40917,6 +41080,9 @@ msgstr "未定义规则 - 策略无法è¿è¡Œã€‚"
msgid "SecurityOrchestration|No tags available"
msgstr "没有å¯ç”¨çš„标签"
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr "在策略 yaml 中检测到ä¸å­˜åœ¨çš„ CI å˜é‡ã€‚因此,规则模å¼å·²è¢«ç¦ç”¨ã€‚è¦å¯ç”¨è§„则模å¼ï¼Œè¯·ä»Žç­–ç•¥ yaml 中删除那些ä¸å­˜åœ¨çš„ CI å˜é‡ã€‚"
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr "在策略 yaml 中检测到ä¸å­˜åœ¨çš„ DAST é…置文件。因此,规则模å¼å·²è¢«ç¦ç”¨ã€‚è¦å¯ç”¨è§„则模å¼ï¼Œè¯·ä»Žç­–ç•¥ yaml 中删除那些ä¸å­˜åœ¨çš„é…置文件。"
@@ -40959,8 +41125,8 @@ msgstr "策略类型"
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr "如果å‘生以下任何情况,则需è¦æ¥è‡ª %{approvers} çš„ %{approvals} %{plural} :"
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
-msgstr "所需批准数超过了åˆèµ„格的批准人数é‡"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
+msgstr "所需批准数超过了åˆèµ„格的批准人数é‡ã€‚"
msgid "SecurityOrchestration|Roles"
msgstr "角色"
@@ -41101,6 +41267,9 @@ 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}æ¼æ´žæŠ¥å‘Šçš„è¿è¥æ¼æ´žé€‰é¡¹å¡ä¸­%{linkEnd}查看所有代ç†çš„扫æ结果。"
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr "时区无效"
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr "è¦æ‰©å¤§æ‚¨çš„æœç´¢èŒƒå›´ï¼Œè¯·åœ¨ä¸Šé¢æ›´æ”¹è¿‡æ»¤è§„则或选择ä¸åŒçš„安全策略项目。"
@@ -41494,6 +41663,9 @@ msgstr "æ­¤æµæ°´çº¿çš„安全报告 %{helpPageLinkStart}已过期%{helpPageLinkE
msgid "SecurityReports|There was an error adding the comment."
msgstr "添加评论时出错。"
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr "为å‘现结果创建 Jira 议题时出错。请é‡è¯•ã€‚"
+
msgid "SecurityReports|There was an error creating the issue."
msgstr "创建议题时出错。"
@@ -41674,7 +41846,7 @@ msgstr "选择迭代"
msgid "Select assignee"
msgstr "选择指派人"
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr "选择指派人"
msgid "Select branch"
@@ -41737,10 +41909,16 @@ msgstr "选择è¦åˆ›å»º %{type} 的项目"
msgid "Select projects"
msgstr "选择项目"
+msgid "Select protected branch"
+msgstr "选择å—ä¿æŠ¤çš„分支"
+
+msgid "Select protected branches"
+msgstr "选择å—ä¿æŠ¤çš„分支"
+
msgid "Select report"
msgstr "选择报告"
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr "选择审核者"
msgid "Select severity (optional)"
@@ -41887,6 +42065,9 @@ msgstr "æœåŠ¡å¸æˆ·"
msgid "Service Account Key"
msgstr "æœåŠ¡å¸æˆ·å¯†é’¥"
+msgid "Service Accounts"
+msgstr "æœåŠ¡è´¦æˆ·"
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr "æœåŠ¡å¸æˆ·å¯†é’¥æŽˆæƒ GitLab 部署您的 Google Cloud 项目"
@@ -41917,6 +42098,9 @@ msgstr "用户没有æƒé™åœ¨æ­¤å‘½å空间中创建æœåŠ¡å¸æˆ·ã€‚"
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr "用户没有æƒé™åˆ›å»ºæœåŠ¡å¸æˆ·ã€‚"
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr "无法验è¯è‡ªå®šä¹‰ç”µå­é‚®ä»¶åœ°å€ã€‚"
@@ -41926,6 +42110,12 @@ msgstr "自定义电å­é‚®ä»¶åœ°å€å·²è¢«éªŒè¯ã€‚"
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr "自定义电å­é‚®ä»¶åœ°å€éªŒè¯å·²å¤„ç†ä½†å¤±è´¥ã€‚"
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr "å¯ç”¨æœåŠ¡å°"
@@ -41935,6 +42125,9 @@ msgstr "有关为您的实例设置æœåŠ¡å°çš„帮助,请è”系管ç†å‘˜ã€‚"
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr "从æœåŠ¡å°ç”µå­é‚®ä»¶åˆ›å»ºçš„议题将显示在此处,æ¯æ¡è¯„论都æˆä¸ºç”µå­é‚®ä»¶å¯¹è¯çš„一部分。"
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr "æœåŠ¡å°æœªå¯ç”¨"
@@ -41962,6 +42155,12 @@ msgstr "您的用户å¯ä»¥å‘以下地å€å‘é€ç”µå­é‚®ä»¶ï¼š"
msgid "ServicePing|Service ping is off"
msgstr "æœåŠ¡ping已关闭"
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr "您å¯ä»¥éšæ—¶åœ¨%{link_start}设置%{link_end}中更改。"
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr "为了帮助改进 GitLab,我们希望定期%{link_start}收集使用信æ¯%{link_end}。"
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr "è¦æŸ¥çœ‹å®žä¾‹çº§åˆ†æžï¼Œè¯·è®©ç®¡ç†å‘˜æ‰“å¼€%{docLinkStart}æœåŠ¡ ping%{docLinkEnd}。"
@@ -42269,6 +42468,15 @@ msgstr "é‡ç½®è®¡ç®—å•ä½ä½¿ç”¨é‡"
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr "当您é‡ç½®æ­¤å‘½å空间的计算å•ä½ä½¿ç”¨é‡æ—¶ï¼Œè®¡ç®—å•ä½ä½¿ç”¨é‡ä¼šæ›´æ”¹ä¸ºé›¶ã€‚"
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr "Git SSH æ“作速率é™åˆ¶"
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr "é™åˆ¶ç”¨æˆ·æ¯åˆ†é’Ÿæ¯ä¸ªä»“库å¯ä»¥æ‰§è¡Œçš„ Git æ“作数"
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr "æ¯åˆ†é’Ÿæœ€å¤§ Git æ“作数"
+
msgid "Shimo|Go to Shimo Workspace"
msgstr "转到石墨工作区"
@@ -42353,8 +42561,8 @@ msgstr "显示完整的原始日志"
msgid "Show details"
msgstr "显示详情"
-msgid "Show failed jobs"
-msgstr "显示失败的作业"
+msgid "Show failed jobs (%{count})"
+msgstr ""
msgid "Show file browser"
msgstr "显示文件æµè§ˆå™¨"
@@ -42362,9 +42570,6 @@ msgstr "显示文件æµè§ˆå™¨"
msgid "Show file contents"
msgstr "显示文件内容"
-msgid "Show filters"
-msgstr "显示过滤器"
-
msgid "Show full blame"
msgstr "显示完整的 blame"
@@ -42672,8 +42877,8 @@ msgstr "大å°"
msgid "Size Limits"
msgstr "大å°é™åˆ¶"
-msgid "Size limit per repository (MB)"
-msgstr "æ¯ä¸ªä»“库的大å°é™åˆ¶ (MB)"
+msgid "Size limit per repository (MiB)"
+msgstr "æ¯ä¸ªä»“库的大å°é™åˆ¶ï¼ˆMiB)"
msgid "Skip to main content"
msgstr "跳转到主è¦å†…容"
@@ -42897,6 +43102,9 @@ msgstr "文件å称(例如 test.rb)"
msgid "Snippets|Files"
msgstr "文件"
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr "代ç ç‰‡æ®µä»…é™ %{total} 个文件。"
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr "代ç ç‰‡æ®µä¸èƒ½åŒ…å«ç©ºæ–‡ä»¶ã€‚ç¡®ä¿æ‰€æœ‰æ–‡ä»¶éƒ½åŒ…å«å†…容,或删除。"
@@ -43467,6 +43675,9 @@ msgstr "垃圾信æ¯æ—¥å¿—å·²æˆåŠŸæ”¹ä¸ºæœ‰æ•ˆä¿¡æ¯æ交。"
msgid "Specific branches"
msgstr "特定分支"
+msgid "Specific protected branches"
+msgstr "特定å—ä¿æŠ¤çš„分支"
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr "无法使用指定的URL:“%{reason}â€"
@@ -43605,9 +43816,6 @@ msgstr "å¼€å¯å†…部主题"
msgid "Start merge train"
msgstr "å¯åŠ¨åˆå¹¶é˜Ÿåˆ—"
-msgid "Start merge train when pipeline succeeds"
-msgstr "æµæ°´çº¿æˆåŠŸæ—¶å¯åŠ¨åˆå¹¶é˜Ÿåˆ—"
-
msgid "Start merge train..."
msgstr "å¯åŠ¨åˆå¹¶é˜Ÿåˆ—..."
@@ -43809,9 +44017,6 @@ msgstr "é…置文档"
msgid "StatusPage|your status page frontend."
msgstr "状æ€é¡µé¢å‰ç«¯"
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr "通过é…ç½®Prometheusæ¥ç›‘控你的部署,了解环境的性能和å¥åº·åº¦çš„最新状æ€ã€‚"
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr "第 %{currentStep} 步,共 %{stepCount} 步"
@@ -43860,8 +44065,8 @@ msgstr "未知"
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr "存放您的文件ã€è§„划您的工作ã€å作编写代ç ç­‰ç­‰ã€‚"
-msgid "Strikethrough"
-msgstr "删除线"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
+msgstr "删除线(%{modifierKey}%{shiftKey}X)"
msgid "Strikethrough text"
msgstr "删除线文本"
@@ -44295,6 +44500,12 @@ msgstr "摘è¦/备注"
msgid "Summary comment (optional)"
msgstr "添加评审摘è¦ï¼ˆå¯é€‰ï¼‰"
+msgid "Summary generated by AI"
+msgstr "ç”± AI 生æˆçš„摘è¦"
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr "摘è¦å°†åœ¨ä¸‹æ¬¡æŽ¨é€åˆ°æ­¤åˆå¹¶è¯·æ±‚时生æˆï¼Œå¹¶å°†æ˜¾ç¤ºåœ¨æ­¤å¤„。"
+
msgid "Sun"
msgstr "星期日"
@@ -44521,11 +44732,11 @@ msgstr "切æ¢åˆ†æ”¯/标签"
msgid "Switch to GitLab Next"
msgstr "切æ¢åˆ°GitLab 预览版"
-msgid "Switch to Markdown"
-msgstr "切æ¢åˆ° Markdown"
+msgid "Switch to plain text editing"
+msgstr "切æ¢åˆ°çº¯æ–‡æœ¬ç¼–辑"
-msgid "Switch to rich text"
-msgstr "切æ¢åˆ°å¯Œæ–‡æœ¬"
+msgid "Switch to rich text editing"
+msgstr "切æ¢åˆ°å¯Œæ–‡æœ¬ç¼–辑"
msgid "Switch to the source to copy the file contents"
msgstr "切æ¢åˆ°æºæ¨¡å¼ä»¥å¤åˆ¶æ–‡ä»¶å†…容"
@@ -44788,8 +44999,8 @@ msgstr "å·²ä¿æŠ¤"
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr "查看文档,å‘现 GitLab 的所有功能。"
-msgid "TanukiBot|Ask GitLab Chat"
-msgstr "询问 GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
+msgstr "询问 GitLab Duo"
msgid "TanukiBot|Ask a question about GitLab"
msgstr "问一个关于 GitLab 的问题"
@@ -44873,6 +45084,21 @@ msgstr "在创建或更新åˆå¹¶è¯·æ±‚åŽè§¦å‘ TeamCity CI"
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr "æ¯æ¬¡æŽ¨é€åˆ°å­˜å‚¨åº“åŽè§¦å‘ TeamCity CI,分支删除除外"
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr "留空表示使用您当å‰çš„令牌。"
+
+msgid "TelegramIntegration|New token"
+msgstr "新建令牌"
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr "将有关项目事件的通知å‘é€åˆ° Telegram。"
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr "将有关项目事件的通知å‘é€åˆ° Telegram。%{docs_link}"
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr "唯一的身份验è¯ä»¤ç‰Œã€‚"
+
msgid "Telephone number"
msgstr "电è¯å·ç "
@@ -45043,9 +45269,6 @@ msgstr "报告资æºæ›´æ”¹: 添加%{addNum}项, 更改%{changeNum}项, 删除%{d
msgid "Terraform|Terraform init command"
msgstr "Terraform init 命令"
-msgid "Terraform|Terraform reports"
-msgstr "Terraform 报告"
-
msgid "Terraform|Terraform states"
msgstr "Terraform 状æ€"
@@ -45295,9 +45518,6 @@ msgstr "议题跟踪用于管ç†éœ€æ±‚改进或者解决的问题"
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr "议题跟踪用于管ç†éœ€æ±‚改进或者解决的问题。请注册或登录åŽä¸ºå½“å‰é¡¹ç›®åˆ›å»ºè®®é¢˜ã€‚"
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr "PrometheusæœåŠ¡å™¨ä»¥â€œé”™è¯¯è¯·æ±‚â€å“应。请检查您的查询是å¦æ­£ç¡®ï¼Œå¹¶ä¸”当å‰çš„Prometheus版本支æŒã€‚ %{documentationLink}"
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr "Slack 通知集æˆå·²å¼ƒç”¨ï¼Œå°†åœ¨æœªæ¥ç‰ˆæœ¬ä¸­åˆ é™¤ã€‚è¦ç»§ç»­æŽ¥æ”¶æ¥è‡ª Slack 的通知,请改用 GitLab for Slack 应用程åºã€‚ %{learn_more_link_start}了解更多%{link_end}。"
@@ -45376,15 +45596,15 @@ msgstr "当å‰è®®é¢˜"
msgid "The current user is not authorized to access the job log."
msgstr "当å‰ç”¨æˆ·æ— æƒè®¿é—®ä½œä¸šæ—¥å¿—。"
+msgid "The current user is not authorized to create the pipeline schedule"
+msgstr "当å‰ç”¨æˆ·æ— æƒåˆ›å»ºæµæ°´çº¿è®¡åˆ’"
+
msgid "The current user is not authorized to update the pipeline schedule"
msgstr "当å‰ç”¨æˆ·æ— æƒæ›´æ–°æµæ°´çº¿è®¡åˆ’"
msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr "æ­¤æµæ°´çº¿ä¸­çš„æ•°æ®å¤ªæ—§ï¼Œæ— æ³•å‘ˆçŽ°ä¸ºå›¾å½¢ã€‚请检查作业选项å¡ä»¥è®¿é—®åŽ†å²æ•°æ®ã€‚"
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
-msgstr "æ•°æ®æºå·²è¿žæŽ¥ï¼Œä½†æ²¡æœ‰å¯æ˜¾ç¤ºçš„æ•°æ®ã€‚ %{documentationLink}"
-
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
msgstr "å‘布准备就绪的日期。具有未æ¥æ—¥æœŸçš„版本被标记为%{linkStart}å³å°†åˆ°æ¥çš„å‘布%{linkEnd}。"
@@ -45576,9 +45796,15 @@ msgstr "您上传的许å¯è¯æ— æ•ˆã€‚如果问题ä»ç„¶å­˜åœ¨ï¼Œè¯·é€šè¿‡ %{lin
msgid "The list creation wizard is already open"
msgstr "列表创建å‘导已打开"
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr "因为加载 GeoJSON 文件时出错,无法显示映射。"
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr "强制用户必须设置åŒé‡èº«ä»½éªŒè¯ä¹‹å‰çš„最长时间。"
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr "å…许的最大文件大å°ä¸º %{size}。"
@@ -45594,9 +45820,6 @@ msgstr "最大文件大å°ä¸º %{size}。"
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr "å•ä¸ªworker接å—清ç†çš„最大标签数。如果标签数é‡è¶…过此é™åˆ¶ï¼Œåˆ™è¦åˆ é™¤çš„标签列表将被截断为该数é‡ã€‚è¦å–消此é™åˆ¶ï¼Œè¯·å°†å…¶è®¾ç½®ä¸º 0。"
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr "命å空间中的作业æ¯æœˆå¯ä»¥åœ¨å…±äº« runners 上使用的最大计算å•ä½æ•°ã€‚0 表示无é™åˆ¶ã€‚"
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr "GitLab无法解决此åˆå¹¶è¯·æ±‚çš„åˆå¹¶å†²çªã€‚请å°è¯•åœ¨æœ¬åœ°è§£å†³å®ƒä»¬ã€‚"
@@ -45723,6 +45946,9 @@ msgstr "选中的图åƒè¿‡å¤§ã€‚"
msgid "The snippet can be accessed without any authentication."
msgstr "无需任何身份验è¯å³å¯è®¿é—®è¯¥ä»£ç ç‰‡æ®µã€‚"
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr "无需任何身份验è¯å³å¯è®¿é—®è¯¥ä»£ç ç‰‡æ®µã€‚è¦åµŒå…¥ä»£ç ç‰‡æ®µï¼Œé¡¹ç›®å¿…须是公开的。"
+
msgid "The snippet is visible only to me."
msgstr "该代ç ç‰‡æ®µä»…对我å¯è§ã€‚"
@@ -45951,6 +46177,9 @@ msgstr "获å–表情符å·æ—¶å‡ºçŽ°é—®é¢˜ã€‚"
msgid "There was a problem fetching epics."
msgstr "获å–å²è¯—时出现问题。"
+msgid "There was a problem fetching failed jobs"
+msgstr "获å–失败的作业时出错。"
+
msgid "There was a problem fetching groups."
msgstr "获å–群组时出现问题。"
@@ -46161,6 +46390,9 @@ msgstr "获å–值æµåˆ†æžæ•°æ®æ—¶å‡ºé”™ã€‚"
msgid "There was an error while fetching value stream analytics duration data."
msgstr "获å–价值æµåˆ†æžæŒç»­æ—¶é—´æ—¶å‡ºé”™ã€‚"
+msgid "There was an error while retrying this job"
+msgstr "é‡è¯•æ­¤ä½œä¸šæ—¶å‡ºé”™"
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr "reCAPTCHA 验è¯é”™è¯¯ã€‚请å†æ¬¡éªŒè¯ reCAPTCHA。"
@@ -46302,6 +46534,9 @@ msgstr "此评论由 AI 生æˆ"
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 "æ­¤æ交是åˆå¹¶è¯·æ±‚ %{link_to_merge_request} 的一部分。此处创建的评论将在该åˆå¹¶è¯·æ±‚的上下文中创建。"
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr "æ­¤æ交是在 UI 中创建的,并使用ç»éªŒè¯çš„ç­¾å进行签署。"
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr "æ­¤æ交使用%{strong_open}已验è¯çš„%{strong_close}ç­¾å进行签署,并且已验è¯æ交者的电å­é‚®ä»¶å±žäºŽåŒä¸€ç”¨æˆ·ã€‚"
@@ -46683,9 +46918,6 @@ msgstr "此页é¢æ‰˜ç®¡åœ¨ GitLab Pages上,但其包å«ç”±ä½¿ç”¨è€…编写的å†
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr "此页é¢ä¸å¯ç”¨ï¼Œæ‚¨æ— æƒè·¨é¡¹ç›®é˜…读相关信æ¯ã€‚"
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr "æ­¤æµæ°´çº¿ä½¿ç”¨äº†åŒ…å«%{b_open}Auto DevOps%{b_close}的预先定义CI/CDé…置。"
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr "æ­¤æµæ°´çº¿ä½¿ç”¨äº† %{strongStart}Auto DevOps 预先定义的并已å¯ç”¨çš„ CI/CD é…置。%{strongEnd}"
@@ -46857,9 +47089,6 @@ msgstr "压缩 Sidekiq 作业å‚数的阈值(以字节为å•ä½ï¼‰ã€‚"
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr "æ‹’ç» Sidekiq 作业的阈值(以字节为å•ä½ï¼‰ã€‚如果您ä¸æƒ³é™åˆ¶ Sidekiq 作业,请将其设置为 0。"
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr "å•ä¸ªæŽ¨é€ä¸­æ›´æ”¹ï¼ˆåˆ†æ”¯æˆ–标签)的阈值数é‡ï¼Œé«˜äºŽè¯¥é˜ˆå€¼ä¼šåˆ›å»ºæ‰¹é‡æŽ¨é€äº‹ä»¶ï¼ˆé»˜è®¤å€¼ä¸º 3)。"
-
msgid "Throughput"
msgstr "åžåé‡"
@@ -47139,6 +47368,9 @@ msgstr "刚刚"
msgid "Timeago|right now"
msgstr "刚刚"
+msgid "Timeline"
+msgstr "时间线"
+
msgid "Timeline event added successfully."
msgstr "时间线事件添加æˆåŠŸã€‚"
@@ -47222,14 +47454,11 @@ msgstr "标题:"
msgid "Titles"
msgstr "标题"
-msgid "Titles and Descriptions"
-msgstr "标题和æè¿°"
-
msgid "To"
msgstr "至"
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
-msgstr "è¦%{link_to_help}到您的域å,请将上述密钥添加到DNSé…置中的TXT记录。"
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
+msgstr "对于您的域åçš„ %{link_to_help} ,请在 7 天内将上述密钥添加到您的 DNS é…置中的 TXT 记录中。"
msgid "To Do"
msgstr "待处ç†"
@@ -47297,6 +47526,9 @@ msgstr "ä¸ºç¡®ä¿ %{project_link} 未计划删除,请检查是å¦å·²è®°å½•æ´»å
msgid "To ensure %{project_name} is unscheduled for deletion, check that activity has been logged by GitLab. For example:"
msgstr "ä¸ºç¡®ä¿ %{project_name} 未计划删除,请检查是å¦å·²è®°å½•æ´»åŠ¨ã€‚例如:"
+msgid "To ensure no loss of access to personal content, only use this account for matters related to %{group_name}."
+msgstr "为确ä¿ä¸ä¼šä¸¢å¤±å¯¹ä¸ªäººå†…容的访问æƒé™ï¼Œè¯·ä»…使用此账户处ç†ä¸Ž %{group_name} 相关的事务。"
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr "为ä¿è¯ä¸ªäººå†…容ä¸ä¸¢å¤±ï¼Œæœ¬è´¦å·ä»…用于与 %{group_name}相关的事项。"
@@ -47324,15 +47556,12 @@ msgstr "首先,请使用以下链接确认您的å¸æˆ·ã€‚"
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr "è¦è½¬åˆ° GitLab Pages,请在左侧边æ ä¸­é€‰æ‹© %{pages_link}。"
-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}更改设置。"
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr "è¦å¯¼å…¥SVN仓库,请查看 %{svn_link}。"
msgid "To invite more users, you can reduce the number of users in your top-level group to %{free_limit} user or less. You can also upgrade to a paid tier which do not have user limits. If you need additional time, you can start a free 30-day trial which includes unlimited users."
msgid_plural "To invite more users, you can reduce the number of users in your top-level group to %{free_limit} users or less. You can also upgrade to a paid tier which do not have user limits. If you need additional time, you can start a free 30-day trial which includes unlimited users."
-msgstr[0] ""
+msgstr[0] "è¦é‚€è¯·æ›´å¤šç”¨æˆ·ï¼Œæ‚¨å¯ä»¥å°†é¡¶çº§ç¾¤ç»„中的用户数é‡å‡å°‘到 %{free_limit} 个或更少。您还å¯ä»¥å‡çº§åˆ°æ²¡æœ‰ç”¨æˆ·é™åˆ¶çš„付费等级。如果您需è¦æ›´å¤šæ—¶é—´ï¼Œæ‚¨å¯ä»¥å¼€å§‹ 30 天的å…费试用,无用户数é™åˆ¶ã€‚"
msgid "To keep this project going, create a new issue"
msgstr "为了ä¿æŒè¿™ä¸ªé¡¹ç›®çš„进行,请创建一个新的议题"
@@ -47397,6 +47626,9 @@ msgstr "è¦æŸ¥çœ‹æ›´æ”¹çš„内容或创建åˆå¹¶è¯·æ±‚,请选择分支或标签
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr "通过Azure,Okta,Onelogin,Ping Identity或自定义SAML 2.0等身份验è¯ç¨‹åºä¸ºæ‚¨çš„群组设置SAML身份验è¯ï¼š"
+msgid "To set up this feature, contact your administrator."
+msgstr "è¦è®¾ç½®æ­¤åŠŸèƒ½ï¼Œè¯·è”系您的管ç†å‘˜ã€‚"
+
msgid "To set up this integration:"
msgstr "è¦å»ºç«‹æ­¤é›†æˆï¼š"
@@ -47406,6 +47638,12 @@ 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 "è¦å¼€å§‹ä½¿ç”¨ä¼ä¸šç‰ˆï¼Œè¯·ä¸Šä¼  %{codeOpen}.gitlab-license%{codeClose} 文件或输入您从 GitLab Inc. 收到的许å¯è¯å¯†é’¥"
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr "è¦åœ¨åˆå¹¶è¯·æ±‚中æ交您的更改,请创建一个新的派生项目。"
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr "è¦åœ¨åˆå¹¶è¯·æ±‚中æ交更改,请切æ¢åˆ°è¿™äº›æ´¾ç”Ÿé¡¹ç›®ä¹‹ä¸€æˆ–创建一个新派生项目。"
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr "è‹¥è¦é€€è®¢æ­¤é—®é¢˜ï¼Œè¯·å°†ä»¥ä¸‹é“¾æŽ¥ç²˜è´´åˆ°æ‚¨çš„æµè§ˆå™¨ï¼š"
@@ -47577,9 +47815,6 @@ msgstr "切æ¢ä¾§è¾¹æ "
msgid "Toggle backtrace"
msgstr "切æ¢è°ƒç”¨æ ˆå›žæº¯(backtrace)"
-msgid "Toggle collapse"
-msgstr "切æ¢æŠ˜å "
-
msgid "Toggle comments for this file"
msgstr "切æ¢æ­¤æ–‡ä»¶çš„评论"
@@ -47589,6 +47824,9 @@ msgstr "开关æ交æè¿°"
msgid "Toggle commit list"
msgstr "展开或éšè—æ交列表"
+msgid "Toggle details"
+msgstr "切æ¢è¯¦ç»†ä¿¡æ¯"
+
msgid "Toggle emoji award"
msgstr "切æ¢è¡¨æƒ…符å·èµžèµ"
@@ -47637,12 +47875,6 @@ msgstr "令牌有效直至被撤销"
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr "此个人访问令牌已在被检测到时自动撤销。在将此æ¼æ´žæ ‡è®°ä¸ºå·²è§£å†³ä¹‹å‰è€ƒè™‘调查和轮æ¢ã€‚"
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr "范围设置授予令牌的æƒé™çº§åˆ«ã€‚"
-
-msgid "Tokens|Select scopes"
-msgstr "选择范围"
-
msgid "Tomorrow"
msgstr "明日"
@@ -47716,6 +47948,9 @@ msgstr "主题"
msgid "Topics could not be merged!"
msgstr "主题无法åˆå¹¶ï¼"
+msgid "Topics|Subscribe to the new projects feed"
+msgstr "订阅新的项目 feed"
+
msgid "Total"
msgstr "全部"
@@ -48044,12 +48279,6 @@ msgstr "输入è¦æœç´¢çš„内容"
msgid "URL"
msgstr "URL"
-msgid "URL cannot be blank"
-msgstr "URLä¸èƒ½ä¸ºç©º"
-
-msgid "URL is invalid"
-msgstr "URL无效"
-
msgid "URL is required"
msgstr "URL是必需的"
@@ -48107,9 +48336,6 @@ msgstr "无法收集CPUä¿¡æ¯"
msgid "Unable to collect memory info"
msgstr "无法收集内存信æ¯"
-msgid "Unable to connect to Prometheus server"
-msgstr "无法连接到PrometheusæœåŠ¡å™¨"
-
msgid "Unable to connect to server: %{error}"
msgstr "无法连接到æœåŠ¡å™¨: %{error}"
@@ -48293,9 +48519,6 @@ msgstr "很é—憾,您å‘é€ç»™GitLab的电å­é‚®ä»¶æ— æ³•å¤„ç†ã€‚"
msgid "Unhappy?"
msgstr "ä¸å–œæ¬¢ï¼Ÿ"
-msgid "Units of compute"
-msgstr "计算å•ä½"
-
msgid "Units|d"
msgstr "天"
@@ -48347,8 +48570,8 @@ msgstr "å–消关è”"
msgid "Unlock"
msgstr "解é”"
-msgid "Unlock %{issuableType}"
-msgstr "è§£é” %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
+msgstr "è§£é” %{issuableDisplayName}"
msgid "Unlock account"
msgstr "解é”账户"
@@ -48368,6 +48591,9 @@ msgstr "未é”定"
msgid "Unlocked the discussion."
msgstr "解é”讨论。"
+msgid "Unlocking %{issuableDisplayName}"
+msgstr "æ­£åœ¨è§£é” %{issuableDisplayName}"
+
msgid "Unlocks the discussion."
msgstr "解é”讨论。"
@@ -48377,9 +48603,6 @@ msgstr "无法访问"
msgid "Unrecognized approval status."
msgstr "未识别的批准状æ€ã€‚"
-msgid "Unrecognized cluster type"
-msgstr "无法识别的集群类型"
-
msgid "Unresolve"
msgstr "置为未解决"
@@ -48659,8 +48882,8 @@ msgstr "%{storage_limit_link_start}命å空间存储é™åˆ¶%{link_end}将很快å
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr "音频样本ã€è§†é¢‘ã€æ•°æ®é›†å’Œå›¾å½¢ã€‚"
-msgid "UsageQuota|Buy additional units of compute"
-msgstr "è´­ä¹°é¢å¤–的计算å•ä½"
+msgid "UsageQuota|Buy additional compute minutes"
+msgstr ""
msgid "UsageQuota|Buy storage"
msgstr "购买存储"
@@ -48707,6 +48930,9 @@ msgstr "存储 Docker é•œåƒçš„ Gitlab-integrated Docker Container Registry。%{
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr "群组设置 &gt; 使用é‡é…é¢"
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr "包å«åœ¨ %{planName} 订阅中"
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr "包括产物ã€ä»£ç åº“ã€wiki 和其它事项。"
@@ -48746,17 +48972,11 @@ msgstr "待定æˆå‘˜"
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr "用 CI/CD 创建的æµæ°´çº¿åˆ¶å“和作业制å“。"
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr "ç”± CI/CD 创建的æµæ°´çº¿äº§ç‰©ã€‚"
-
msgid "UsageQuota|Pipelines"
msgstr "æµæ°´çº¿"
-msgid "UsageQuota|Purchased storage"
-msgstr "购买的存储"
-
-msgid "UsageQuota|Purchased storage used"
-msgstr "已使用的购买的存储"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
+msgstr "%{planName} 订阅中包å«é¡¹ç›®å­˜å‚¨"
msgid "UsageQuota|Recalculate repository usage"
msgstr "é‡æ–°è®¡ç®—仓库使用情况"
@@ -48815,8 +49035,14 @@ msgstr "下表显示 %{usageSince} 以æ¥çš„使用情况"
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr "这个命å空间没有在当å‰é˜¶æ®µä½¿ç”¨å…±äº« runner 的项目"
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
-msgstr "此表çœç•¥äº†ä½¿ç”¨ 0 计算å•ä½æˆ– 0 共享 runner 时长的项目"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr "购买的总存储"
+
+msgid "UsageQuota|Total storage"
+msgstr "总存储"
msgid "UsageQuota|Transfer"
msgstr "传输"
@@ -49119,6 +49345,9 @@ msgstr "用户没有待处ç†è¯·æ±‚"
msgid "User does not have permission to create a Security Policy project."
msgstr "用户无æƒåˆ›å»ºå®‰å…¨ç­–略项目。"
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr "用户ä¸å­˜åœ¨æˆ–者您无æƒæ›´æ”¹å‘½å空间æ交电å­é‚®ä»¶ã€‚"
+
msgid "User has already been deactivated"
msgstr "用户已被åœç”¨ã€‚"
@@ -49272,9 +49501,15 @@ msgstr "%{id} · 由 %{author} 创建于 %{created}"
msgid "UserProfile|Activity"
msgstr "活动"
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr "加载活动时出错。请刷新页é¢å†è¯•ä¸€æ¬¡ã€‚"
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr "加载关注者时出错。请刷新页é¢é‡è¯•ã€‚"
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr "加载以下内容时出错。请刷新页é¢å†è¯•ä¸€æ¬¡ã€‚"
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr "加载个人项目时出错。请刷新页é¢é‡è¯•ã€‚"
@@ -49293,6 +49528,9 @@ msgstr "å‚与贡献的项目"
msgid "UserProfile|Copy user ID"
msgstr "å¤åˆ¶ç”¨æˆ· ID"
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr "å¤åˆ¶ç”¨æˆ· ID:%{id}"
+
msgid "UserProfile|Edit profile"
msgstr "编辑个人资料"
@@ -49374,6 +49612,9 @@ msgstr "此用户没有关注其他用户。"
msgid "UserProfile|Unconfirmed user"
msgstr "未确认的用户"
+msgid "UserProfile|User ID copied to clipboard"
+msgstr "å·²å¤åˆ¶ç”¨æˆ· ID 到剪贴æ¿"
+
msgid "UserProfile|User ID: %{id}"
msgstr "用户 ID:%{id}"
@@ -49623,8 +49864,8 @@ msgstr "转到文档"
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr "一段时间内å‘现的高风险级别æ¼æ´žã€‚"
-msgid "ValueStreamAnalytics|Key metrics"
-msgstr "关键指标"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
+msgstr "生命周期指标"
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
msgstr "在给定时间段内,事件在生产环境中开放的中ä½æ—¶é—´ã€‚"
@@ -49749,8 +49990,8 @@ msgstr "在此之å‰ï¼Œå…±äº« runner ä¸å¯ç”¨ã€‚%{validateLinkStart}验è¯æ‚¨çš
msgid "VerificationReminder|Your account has been validated"
msgstr "您的å¸æˆ·å·²é€šè¿‡éªŒè¯ã€‚"
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
-msgstr "您现在å¯ä»¥åˆ©ç”¨å…±äº« runner çš„å…费计算å•ä½ã€‚"
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
+msgstr ""
msgid "Verified"
msgstr "已验è¯"
@@ -49764,9 +50005,6 @@ msgstr "验è¯SAMLé…ç½®"
msgid "Verify code"
msgstr "验è¯ç "
-msgid "Verify configuration"
-msgstr "验è¯é…ç½®"
-
msgid "Version"
msgstr "版本"
@@ -49848,10 +50086,6 @@ msgstr "查看此å˜æ›´å‰çš„blame模å¼"
msgid "View card matches"
msgstr "查看å¡ç‰‡åŒ¹é…"
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] "查看图表"
-
msgid "View dependency details for your project"
msgstr "查看您项目的ä¾èµ–详细信æ¯"
@@ -49877,9 +50111,6 @@ msgstr "æµè§ˆæ–‡ä»¶ @ "
msgid "View file @ %{commitSha}"
msgstr "查看文件@%{commitSha}"
-msgid "View full dashboard"
-msgstr "查看完整仪表æ¿"
-
msgid "View group in admin area"
msgstr "在管ç†ä¸­å¿ƒæŸ¥çœ‹ç¾¤ç»„"
@@ -49934,9 +50165,6 @@ msgstr "查看待处ç†çš„åˆå¹¶è¯·æ±‚"
msgid "View page @ "
msgstr "查看页é¢@ "
-msgid "View performance dashboard."
-msgstr "查看性能仪表æ¿ã€‚"
-
msgid "View project in admin area"
msgstr "在管ç†ä¸­å¿ƒæŸ¥çœ‹é¡¹ç›®"
@@ -49953,6 +50181,9 @@ msgstr "查看替æ¢æ–‡ä»¶ @ "
msgid "View seat usage"
msgstr "查看席ä½ä½¿ç”¨æƒ…况"
+msgid "View summary notes"
+msgstr "查看摘è¦æ³¨é‡Š"
+
msgid "View supported languages and frameworks"
msgstr "查看支æŒçš„语言和框架"
@@ -49965,9 +50196,6 @@ msgstr "查看文档"
msgid "View the latest successful deployment to this environment"
msgstr "查看此环境最新æˆåŠŸéƒ¨ç½²"
-msgid "View the performance dashboard at"
-msgstr "查看性能仪表æ¿äºŽ"
-
msgid "View usage details"
msgstr "查看使用详情"
@@ -50322,6 +50550,9 @@ msgstr "代ç è¯„审"
msgid "Vulnerability|Comments"
msgstr "注释"
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr "崩溃地å€"
@@ -50376,6 +50607,9 @@ msgstr "文件:"
msgid "Vulnerability|GitLab Security Report"
msgstr "GitLab 安全报告"
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr "标识"
@@ -50451,6 +50685,9 @@ msgstr "严é‡çº§åˆ«"
msgid "Vulnerability|Severity:"
msgstr "严é‡æ€§ï¼š"
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr "状æ€"
@@ -50508,9 +50745,6 @@ msgstr "等待批准"
msgid "Waiting for merge (open and assigned)"
msgstr "等待åˆå¹¶(å¼€å¯ä¸­å’Œå·²åˆ†é…)"
-msgid "Waiting for performance data"
-msgstr "等待性能数æ®"
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr "æƒé™ä¸è¶³ã€‚如需查看相关数æ®ï¼Œè¯·å‘管ç†å‘˜ç”³è¯·æƒé™ã€‚"
@@ -50550,9 +50784,6 @@ msgstr "我们在群组%{group}中找ä¸åˆ°ä¸Ž%{scope}相匹é…çš„%{term}"
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr "我们在项目%{project}中找ä¸åˆ°ä¸Ž%{scope}相匹é…çš„%{term}"
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr "无法连接PrometheusæœåŠ¡å™¨ã€‚æœåŠ¡å™¨ä¸å†å­˜åœ¨ï¼Œæˆ–者é…置信æ¯éœ€è¦æ›´æ–°ã€‚"
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr "我们在%{humanized_resource_name}检测到潜在滥用行为。请输入此reCAPTCHA验è¯ç å¹¶ç»§ç»­ã€‚"
@@ -50571,9 +50802,6 @@ msgstr "我们邀请您加入 %{featureLinkStart}请求功能%{featureLinkEnd}ï¼
msgid "We recommend a work email address."
msgstr "我们推è工作电å­é‚®ä»¶åœ°å€ã€‚"
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr "我们建议å¯ç”¨æ‰€æœ‰ SAST 分æžå™¨"
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr "我们建议您购买更多的æµæ°´çº¿æ—¶é—´ï¼Œä»¥é¿å…任何æœåŠ¡ä¸­æ–­ã€‚"
@@ -50961,6 +51189,9 @@ msgstr "这里列出了什么?"
msgid "What is repository mirroring?"
msgstr "什么是仓库镜åƒï¼Ÿ"
+msgid "What is root cause analysis?"
+msgstr "什么是根本原因分æžï¼Ÿ"
+
msgid "What is squashing?"
msgstr "什么是压缩?"
@@ -51273,6 +51504,9 @@ msgstr "å–消æƒé™ç”³è¯·"
msgid "Won't fix / Accept risk"
msgstr "ä¸ä¿®å¤/接å—风险"
+msgid "Work Item promoted successfully."
+msgstr "工作项æˆåŠŸå‡çº§ã€‚"
+
msgid "Work Item type with id %{id} was not found"
msgstr "未找到 ID 为 %{id} 的工作项类型"
@@ -51367,6 +51601,9 @@ msgstr "转æ¢ä¸ºä»»åŠ¡"
msgid "WorkItem|Converted to task"
msgstr "已转æ¢ä¸ºä»»åŠ¡"
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr "å¤åˆ¶ %{workItemType} 电å­é‚®ä»¶åœ°å€"
+
msgid "WorkItem|Create %{workItemType}"
msgstr "创建 %{workItemType}"
@@ -51391,9 +51628,6 @@ msgstr "截止日期"
msgid "WorkItem|Existing task"
msgstr "现有任务"
-msgid "WorkItem|Failed to award emoji"
-msgstr "使用表情失败"
-
msgid "WorkItem|Health status"
msgstr "å¥åº·çŠ¶å†µ"
@@ -51508,6 +51742,12 @@ msgstr "å°è¯•æ·»åŠ å­é¡¹æ—¶å‡ºé”™ã€‚请é‡è¯•ã€‚"
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr "å°è¯•åˆ›å»ºå­é¡¹æ—¶å‡ºé”™ï¼Œè¯·å†è¯•ä¸€æ¬¡ã€‚"
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr "å¤åˆ¶ %{workItemType} 电å­é‚®ä»¶åœ°å€æ—¶å‡ºé”™ã€‚请å†è¯•ä¸€æ¬¡ã€‚"
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr "å¤åˆ¶ %{workItemType} 引用时出错。请å†è¯•ä¸€æ¬¡ã€‚"
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr "获å–里程碑时出错。请å†è¯•ä¸€æ¬¡ã€‚"
@@ -51586,6 +51826,9 @@ msgstr "工作区是建立您代ç çš„虚拟沙盒环境。 您å¯ä»¥å…¬å¼€é¡¹ç›
msgid "Workspaces|Cancel"
msgstr "å–消"
+msgid "Workspaces|Could not load workspaces"
+msgstr "无法加载工作区"
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr "无法检索此项目的集群代ç†"
@@ -51682,6 +51925,9 @@ msgstr "您åªèƒ½ä¸ºå…¬å¼€é¡¹ç›®åˆ›å»ºå·¥ä½œåŒºã€‚"
msgid "Workspaces|You can't create a workspace for this project"
msgstr "您无法为此项目创建工作区"
+msgid "Workspaces|Your workspaces"
+msgstr "您的工作区"
+
msgid "Would you like to create a new branch?"
msgstr "您è¦åˆ›å»ºä¸€ä¸ªæ–°åˆ†æ”¯å—?"
@@ -51791,9 +52037,6 @@ msgstr "您正被é‡å®šå‘离开 GitLab"
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr "如果超过此数字,将为您计费。%{qsrOverageLinkStart}计费如何è¿ä½œï¼Ÿ%{qsrOverageLinkEnd}"
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr "您已连接到PrometheusæœåŠ¡å™¨ï¼Œä½†å½“å‰æ²¡æœ‰æ•°æ®å¯æ˜¾ç¤ºã€‚"
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr "您当å‰å¤„于离线状æ€ï¼Œæˆ–者 GitLab 实例ä¸å¯è®¿é—®ã€‚"
@@ -52082,6 +52325,9 @@ msgstr "您ä¸èƒ½å†™å…¥åªè¯»çš„æ¬¡è¦ GitLab Geo 实例。请改用%{link_to_pr
msgid "You cannot write to this read-only GitLab instance."
msgstr "您ä¸èƒ½å†™å…¥è¿™ä¸ªåªè¯»çš„ GitLab 实例。"
+msgid "You can’t edit files directly in this project."
+msgstr "您ä¸èƒ½ç›´æŽ¥ç¼–辑此项目中的文件。"
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr "您ä¸èƒ½åœ¨è¿™ä¸ªé¡¹ç›®ä¸­ç›´æŽ¥ç¼–辑文件,请派生(Fork)这个项目并æ交包å«æ‚¨çš„更改的åˆå¹¶è¯·æ±‚。"
@@ -52475,7 +52721,7 @@ msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change
msgstr "您的 %{spammable_entity_type} 已被识别为垃圾邮件。请更改内容或解决 reCAPTCHA æ¥ç»§ç»­ã€‚"
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content to proceed."
-msgstr ""
+msgstr "您的 %{spammable_entity_type} 已被识别为垃圾内容。请更改内容方å¯ç»§ç»­ã€‚"
msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr "您为%{strong}%{namespace_name}%{strong_close}的%{strong}%{plan_name}%{strong_close}订阅将于%{strong}%{expires_on}%{strong_close}到期。"
@@ -52519,6 +52765,12 @@ msgstr "您的旗舰版å…费试用期为 30 天。在此之åŽï¼Œæ‚¨å¯ä»¥ä¿ç•
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 "由于大é‡ä¸æˆåŠŸçš„登录å°è¯•ï¼Œæ‚¨çš„ GitLab å¸æˆ·å·²è¢«é”定。您的å¸æˆ·å°†åœ¨ %{duration} 自动解é”,或者您å¯ä»¥å•å‡»ä¸‹é¢çš„链接立å³è§£é”。"
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr "您的账å·çŽ°åœ¨æ˜¯ %{source_link}:"
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr "您的账å·çŽ°åœ¨æ˜¯ä¼ä¸šç”¨æˆ·ï¼ˆ%{source_link}):"
+
msgid "Your GitLab account request has been approved!"
msgstr "您的GitLabå¸æˆ·åˆ›å»ºè¯·æ±‚已被批准ï¼"
@@ -52570,6 +52822,12 @@ msgstr "您的WebAuthn设备已注册ï¼"
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr "您对 %{source_type} 访问请求已被撤消。"
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr "您的账å·å·²è¢«ç¦ç”¨ã€‚请è”ç³» %{support} 寻求帮助。"
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr "您的账å·å·²è¢«ç¦ç”¨ã€‚请è”系您的管ç†å‘˜å¯»æ±‚帮助。"
+
msgid "Your account has been deactivated"
msgstr "您的å¸æˆ·å·²è¢«åœç”¨"
@@ -52630,8 +52888,8 @@ msgstr "您的评论无法æ交,原因为 %{reason}。"
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr "您的评论无法æ交ï¼è¯·æ£€æŸ¥æ‚¨çš„网络连接,然åŽé‡è¯•ã€‚"
-msgid "Your comment could not be updated! Please check your network connection and try again."
-msgstr "您的评论无法更新ï¼è¯·æ£€æŸ¥æ‚¨çš„网络连接,然åŽé‡è¯•ã€‚"
+msgid "Your comment could not be updated because %{reason}."
+msgstr "您的评论无法更新,原因为 %{reason}。"
msgid "Your comment will be discarded."
msgstr "您的评论将被丢弃。"
@@ -52788,12 +53046,15 @@ msgstr "您的顶级群组 %{namespace_name} 已超过 %{free_limit} 个用户çš
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr "您的顶级群组 %{namespace_name} 将很快进入åªè¯»çŠ¶æ€"
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
-msgstr "您的顶级群组超出了用户和存储é™åˆ¶ï¼Œå·²è¢«ç½®äºŽåªè¯»çŠ¶æ€ã€‚"
-
msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr "您的顶级群组已超过了用户é™åˆ¶ï¼Œå·²è¢«ç½®äºŽåªè¯»çŠ¶æ€ã€‚"
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
msgstr "您的更新失败。通过拖放到现有设计的方å¼ï¼Œæ‚¨æ¯æ¬¡åªèƒ½ä¸Šä¼ ä¸€ä¸ªè®¾è®¡ã€‚"
@@ -53082,8 +53343,8 @@ msgstr "如果å¯ç”¨å…±äº«Runner,则无法更改"
msgid "cannot be changed since member is associated with a custom role"
msgstr "无法更改,因为æˆå‘˜ä¸Žè‡ªå®šä¹‰è§’色关è”"
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
-msgstr "ä¸èƒ½æ›´æ”¹ä¸º %{new_type},因为父类型为 %{parent_type}。"
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
+msgstr "å…³è”到父 %{parent_type} æ—¶ä¸èƒ½æ›´æ”¹ä¸º %{new_type}。"
msgid "cannot be changed to %{new_type} with these child item types."
msgstr "因为å­é¡¹çš„类型,ä¸èƒ½æ›´æ”¹ä¸º %{new_type}。"
@@ -53508,10 +53769,8 @@ msgid "closed %{timeago}"
msgstr "已关闭于 %{timeago}"
msgid "closed issue"
-msgstr "已关闭议题"
-
-msgid "collect usage information"
-msgstr "收集使用信æ¯"
+msgid_plural "closed issues"
+msgstr[0] "已关闭的议题"
msgid "comment"
msgstr "评论"
@@ -53730,18 +53989,6 @@ msgstr[0] "文件"
msgid "finding is not found or is already attached to a vulnerability"
msgstr "结果无法找到或已与æ¼æ´žå…³è”。"
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr "使用%{link_to_merge_request}于%{link_to_merge_request_source_branch}"
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr "使用%{link_to_merge_request}ç”±%{link_to_merge_request_source_branch}åˆå¹¶åˆ°%{link_to_merge_request_target_branch}"
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr "于%{link_to_pipeline_ref}"
-
-msgid "for %{ref}"
-msgstr "于%{ref}"
-
msgid "for Workspace is required to be public"
msgstr "对于è¦æ±‚公开的工作区"
@@ -53846,8 +54093,8 @@ msgstr "于"
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr "还有 %{duration},已排队 %{queued_duration}"
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
-msgstr "还有 %{duration},使用 %{compute_credits} 计算点数,已排队 %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
+msgstr ""
msgid "in group %{link_to_group}"
msgstr "在 %{link_to_group} 群组"
@@ -53855,6 +54102,9 @@ msgstr "在 %{link_to_group} 群组"
msgid "in project %{link_to_project}"
msgstr "在 %{link_to_project} 项目"
+msgid "incident"
+msgstr "事件"
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] "实例已完æˆ"
@@ -54038,9 +54288,6 @@ msgstr "ä»ç„¶åŠ è½½"
msgid "loading"
msgstr "加载中"
-msgid "locked"
-msgstr "å·²é”定"
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr "被 %{path_lock_user_name} 在 %{created_at} é”定"
@@ -54217,9 +54464,6 @@ msgstr "%{rules} 个无效规则已被自动批准"
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr "%{rules} 个无效规则已被自动批准"
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr "åˆå¹¶é˜Ÿåˆ—是等待åˆå¹¶åˆ°ç›®æ ‡åˆ†æ”¯çš„åˆå¹¶è¯·æ±‚列表。æ¯ä¸ªåˆå¹¶è¯·æ±‚中的å˜åŠ¨ä¸Žå…ˆå‰åˆå¹¶è¯·æ±‚中的å˜åŠ¨ç›¸ç»“åˆï¼Œç„¶åŽåœ¨åˆå¹¶å‰è¿›è¡Œæµ‹è¯•ã€‚"
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr "æ–°åˆå¹¶åˆ—车已ç»å¯åŠ¨ï¼Œæ­¤åˆå¹¶è¯·æ±‚ä½äºŽåˆå¹¶é˜Ÿåˆ—中的第一ä½ã€‚"
@@ -54339,9 +54583,6 @@ msgstr "åˆå¹¶å¤±è´¥ã€‚"
msgid "mrWidget|Merged by"
msgstr "åˆå¹¶è€…:"
-msgid "mrWidget|More information"
-msgstr "更多信æ¯"
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr "请还原它或使用ä¸åŒçš„ %{type} 分支。"
@@ -54405,17 +54646,17 @@ msgstr "该åˆå¹¶è¯·æ±‚未能自动åˆå¹¶"
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr "è¦æ‰¹å‡†æ­¤åˆå¹¶è¯·æ±‚,请输入您的密ç ã€‚此项目需è¦æ‰€æœ‰æ‰¹å‡†æ‰èƒ½è®¤è¯ã€‚"
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
-msgstr "è¦æ›´æ”¹æ­¤é»˜è®¤æ¶ˆæ¯ï¼Œè¯·ç¼–辑压缩和åˆå¹¶æ交消æ¯çš„模æ¿ã€‚%{linkStart}了解更多信æ¯ã€‚%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
+msgstr "è¦æ›´æ”¹æ­¤é»˜è®¤æ¶ˆæ¯ï¼Œè¯·ç¼–辑压缩和åˆå¹¶æ交消æ¯çš„模æ¿ã€‚%{linkStart}了解更多信æ¯%{linkEnd}。"
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
-msgstr "è¦æ›´æ”¹æ­¤é»˜è®¤æ¶ˆæ¯ï¼Œè¯·ç¼–辑åˆå¹¶æ交消æ¯çš„模æ¿ã€‚ %{linkStart}了解更多信æ¯ã€‚%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
+msgstr "è¦æ›´æ”¹æ­¤é»˜è®¤æ¶ˆæ¯ï¼Œè¯·ç¼–辑åˆå¹¶æ交消æ¯çš„模æ¿ã€‚%{linkStart}了解更多信æ¯%{linkEnd}。"
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
-msgstr "è¦æ›´æ”¹æ­¤é»˜è®¤æ¶ˆæ¯ï¼Œè¯·ç¼–辑压缩æ交消æ¯çš„模æ¿ã€‚ %{linkStart}了解更多信æ¯ã€‚%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
+msgstr "è¦æ›´æ”¹æ­¤é»˜è®¤æ¶ˆæ¯ï¼Œè¯·ç¼–辑压缩æ交消æ¯çš„模æ¿ã€‚ %{linkStart}了解更多信æ¯%{linkEnd}。"
-msgid "mrWidget|What is a merge train?"
-msgstr "什么是åˆå¹¶é˜Ÿåˆ—?"
+msgid "mrWidget|Your merge request is almost ready!"
+msgstr "您的åˆå¹¶è¯·æ±‚å³å°†å‡†å¤‡å°±ç»ªï¼"
msgid "mrWidget|Your password"
msgstr "您的密ç "
@@ -54453,6 +54694,12 @@ msgstr "必须与群组或项目相关è”"
msgid "must be at least 1 day"
msgstr "必须至少为 1 天"
+msgid "must be before %{expiry_date}"
+msgstr "必须在 %{expiry_date} 之å‰"
+
+msgid "must be false when email confirmation setting is off"
+msgstr "当电å­é‚®ä»¶ç¡®è®¤è®¾ç½®å…³é—­æ—¶å¿…须为 false"
+
msgid "must be greater than start date"
msgstr "必须大于开始日期"
@@ -54486,9 +54733,6 @@ msgstr "必须属于工作项所在的åŒä¸€é¡¹ç›®ã€‚"
msgid "must contain only a discord user ID."
msgstr "å¿…é¡»åªèƒ½åŒ…å«ä¸€ä¸ª Discord 用户 ID"
-msgid "must expire in 365 days"
-msgstr "必须在 365 天åŽè¿‡æœŸ"
-
msgid "must have a repository"
msgstr "必须有一个仓库"
@@ -54568,7 +54812,8 @@ msgid "only supports valid HTTP(S) URLs"
msgstr "仅支æŒæœ‰æ•ˆçš„ HTTP(S) URL"
msgid "open issue"
-msgstr "å¼€å¯çš„议题"
+msgid_plural "open issues"
+msgstr[0] "开放的议题"
msgid "or"
msgstr "或"
@@ -54889,6 +55134,9 @@ msgstr "标签å称"
msgid "terraform states"
msgstr "terraform 状æ€"
+msgid "test case"
+msgstr "测试用例"
+
msgid "the correct format."
msgstr "正确的格å¼ã€‚"
@@ -54946,9 +55194,6 @@ msgstr "缺少类型å‚数并且是必需的"
msgid "unicode domains should use IDNA encoding"
msgstr "unicode域å应使用IDNAç¼–ç "
-msgid "unlocked"
-msgstr "未é”定"
-
msgid "updated"
msgstr "更新于"
@@ -55042,7 +55287,7 @@ msgid "vulnerability|dismissed"
msgstr "已忽略"
msgid "was set to auto-merge by"
-msgstr ""
+msgstr "已设置为自动åˆå¹¶ï¼Œè®¾ç½®è€…为"
msgid "weekly"
msgstr "æ¯å‘¨"
@@ -55071,9 +55316,6 @@ msgstr "您的 GitLab 实例"
msgid "your group (%{group_name})"
msgstr "您的群组(%{group_name})"
-msgid "your settings"
-msgstr "您的设置"
-
msgid "yyyy-mm-dd"
msgstr "yyyy-mm-dd"
diff --git a/locale/zh_HK/gitlab.po b/locale/zh_HK/gitlab.po
index 0405c3c84b1..dad8ca58cee 100644
--- a/locale/zh_HK/gitlab.po
+++ b/locale/zh_HK/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: zh-HK\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:47\n"
+"PO-Revision-Date: 2023-07-11 04:50\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -95,6 +95,14 @@ msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] ""
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] ""
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] ""
@@ -155,6 +163,10 @@ msgid "%d assigned issue"
msgid_plural "%d assigned issues"
msgstr[0] ""
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] ""
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] ""
@@ -299,14 +311,6 @@ msgid "%d more comment"
msgid_plural "%d more comments"
msgstr[0] ""
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] ""
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] ""
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
@@ -562,9 +566,6 @@ msgid "%{count} project"
msgid_plural "%{count} projects"
msgstr[0] ""
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
-
msgid "%{count} selected"
msgstr ""
@@ -607,6 +608,9 @@ msgstr ""
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr ""
+
msgid "%{duration}ms"
msgstr ""
@@ -679,7 +683,10 @@ msgstr ""
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
-msgid "%{issuableDisplayName} %{lockStatus}."
+msgid "%{issuableDisplayName} locked."
+msgstr ""
+
+msgid "%{issuableDisplayName} unlocked."
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
@@ -703,6 +710,9 @@ msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{jobName} job is being retried"
+msgstr ""
+
msgid "%{jobs} Jobs"
msgstr ""
@@ -1009,6 +1019,12 @@ msgstr ""
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
+msgid "%{startDate} – %{dueDate}"
+msgstr ""
+
+msgid "%{startDate} – No due date"
+msgstr ""
+
msgid "%{start} to %{end}"
msgstr ""
@@ -1036,7 +1052,7 @@ msgstr ""
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
msgstr ""
msgid "%{strongStart}%{count}%{strongEnd} commit"
@@ -1148,9 +1164,6 @@ msgstr ""
msgid "%{url} (optional)"
msgstr ""
-msgid "%{userName} (cannot merge)"
-msgstr ""
-
msgid "%{userName}'s avatar"
msgstr ""
@@ -1805,6 +1818,12 @@ msgstr ""
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr ""
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr ""
+
+msgid "AI|New chat"
+msgstr ""
+
msgid "AI|Populate issue description"
msgstr ""
@@ -2258,6 +2277,9 @@ msgstr ""
msgid "AccessTokens|Access token limit reached"
msgstr ""
+msgid "AccessTokens|Add a %{type}"
+msgstr ""
+
msgid "AccessTokens|Are you sure?"
msgstr ""
@@ -2276,12 +2298,18 @@ msgstr ""
msgid "AccessTokens|Copy static object token"
msgstr ""
+msgid "AccessTokens|Create %{type}"
+msgstr ""
+
msgid "AccessTokens|Created"
msgstr ""
msgid "AccessTokens|Feed token"
msgstr ""
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr ""
+
msgid "AccessTokens|Incoming email token"
msgstr ""
@@ -2300,6 +2328,15 @@ msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr ""
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "AccessTokens|Select a role"
+msgstr ""
+
+msgid "AccessTokens|Select scopes"
+msgstr ""
+
msgid "AccessTokens|Static object token"
msgstr ""
@@ -2309,6 +2346,9 @@ msgstr ""
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr ""
+msgid "AccessTokens|Token name"
+msgstr ""
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -2360,13 +2400,13 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|In order to use free units of compute 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."
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
msgstr ""
msgid "AccountValidation|Learn more."
msgstr ""
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
msgstr ""
msgid "AccountValidation|Validate your account"
@@ -2477,9 +2517,6 @@ msgstr ""
msgid "Add Zoom meeting"
msgstr ""
-msgid "Add a %{type}"
-msgstr ""
-
msgid "Add a GCP region"
msgstr ""
@@ -2528,6 +2565,9 @@ msgstr ""
msgid "Add a numbered list"
msgstr ""
+msgid "Add a quick action"
+msgstr ""
+
msgid "Add a related epic"
msgstr ""
@@ -2783,6 +2823,9 @@ msgstr ""
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr ""
+msgid "Additional compute minutes:"
+msgstr ""
+
msgid "Additional diagram formats"
msgstr ""
@@ -2804,9 +2847,6 @@ msgstr ""
msgid "Additional units"
msgstr ""
-msgid "Additional units of compute:"
-msgstr ""
-
msgid "Address"
msgstr ""
@@ -3230,22 +3270,13 @@ msgstr ""
msgid "AdminSettings|Import sources"
msgstr ""
-msgid "AdminSettings|Inactive project deletion"
-msgstr ""
-
-msgid "AdminSettings|Instance runners expiration"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
msgstr ""
-msgid "AdminSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "AdminSettings|Jitsu host"
+msgid "AdminSettings|Inactive project deletion"
msgstr ""
-msgid "AdminSettings|Jitsu project ID"
+msgid "AdminSettings|Instance runners expiration"
msgstr ""
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
@@ -3329,6 +3360,9 @@ msgstr ""
msgid "AdminSettings|Registration Features include:"
msgstr ""
+msgid "AdminSettings|Requeue indexing workers"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
@@ -3398,9 +3432,6 @@ msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr ""
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr ""
@@ -3410,9 +3441,6 @@ msgstr ""
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "AdminSettings|The host of your data collector instance."
msgstr ""
@@ -3443,10 +3471,10 @@ msgstr ""
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr ""
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
msgstr ""
-msgid "AdminSettings|Used to generate short-lived API access tokens."
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
@@ -3455,9 +3483,6 @@ msgstr ""
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr ""
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "AdminSettings|When to delete inactive projects"
msgstr ""
@@ -3680,9 +3705,6 @@ msgstr ""
msgid "AdminUsers|Is using seat"
msgstr ""
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr ""
-
msgid "AdminUsers|It's you!"
msgstr ""
@@ -3728,6 +3750,9 @@ msgstr ""
msgid "AdminUsers|Private profile"
msgstr ""
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr ""
+
msgid "AdminUsers|Reactivating a user will:"
msgstr ""
@@ -3767,7 +3792,7 @@ msgstr ""
msgid "AdminUsers|Sort by"
msgstr ""
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
msgstr ""
msgid "AdminUsers|The user can't access git repositories."
@@ -4037,9 +4062,6 @@ msgstr ""
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr ""
@@ -4076,7 +4098,7 @@ msgstr ""
msgid "AlertManagement|Alert"
msgstr ""
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
@@ -4181,10 +4203,10 @@ msgstr ""
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
msgstr ""
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
msgstr ""
msgid "AlertManagement|There was an error while updating the status of the alert."
@@ -4295,9 +4317,6 @@ msgstr ""
msgid "AlertSettings|Prometheus"
msgstr ""
-msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
-
msgid "AlertSettings|Reset Key"
msgstr ""
@@ -4334,9 +4353,6 @@ msgstr ""
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr ""
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -4433,6 +4449,9 @@ msgstr ""
msgid "All changes are committed"
msgstr "所有改變都已經æ交"
+msgid "All default branches"
+msgstr ""
+
msgid "All eligible users"
msgstr ""
@@ -4598,6 +4617,9 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
+msgid "Alt text"
+msgstr ""
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -4649,12 +4671,6 @@ msgstr ""
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
-msgid "An error occurred adding a draft to the thread."
-msgstr ""
-
-msgid "An error occurred adding a new draft."
-msgstr ""
-
msgid "An error occurred creating the new branch."
msgstr ""
@@ -4697,6 +4713,12 @@ msgstr ""
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr ""
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr ""
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr ""
+
msgid "An error occurred while decoding the file."
msgstr ""
@@ -4856,9 +4878,6 @@ msgstr ""
msgid "An error occurred while loading the blob controls."
msgstr ""
-msgid "An error occurred while loading the data. Please try again."
-msgstr ""
-
msgid "An error occurred while loading the file"
msgstr ""
@@ -4974,9 +4993,6 @@ msgstr ""
msgid "An error occurred while updating labels."
msgstr ""
-msgid "An error occurred while updating the comment"
-msgstr ""
-
msgid "An error occurred while updating the configuration."
msgstr ""
@@ -5062,7 +5078,7 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analytics|Add to Dashboard"
+msgid "Analytics|A visualization with that name already exists."
msgstr ""
msgid "Analytics|Add visualizations"
@@ -5128,12 +5144,21 @@ msgstr ""
msgid "Analytics|Data Table"
msgstr ""
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr ""
+
msgid "Analytics|Edit"
msgstr ""
+msgid "Analytics|Enter a visualization name"
+msgstr ""
+
msgid "Analytics|Error while saving dashboard"
msgstr ""
+msgid "Analytics|Error while saving visualization."
+msgstr ""
+
msgid "Analytics|Host"
msgstr ""
@@ -5143,7 +5168,7 @@ msgstr ""
msgid "Analytics|Line Chart"
msgstr ""
-msgid "Analytics|New Analytics Visualization Title"
+msgid "Analytics|New analytics visualization name"
msgstr ""
msgid "Analytics|New dashboard"
@@ -5182,6 +5207,18 @@ msgstr ""
msgid "Analytics|Save"
msgstr ""
+msgid "Analytics|Save and add to Dashboard"
+msgstr ""
+
+msgid "Analytics|Save new visualization"
+msgstr ""
+
+msgid "Analytics|Select a measurement"
+msgstr ""
+
+msgid "Analytics|Select a visualization type"
+msgstr ""
+
msgid "Analytics|Single Statistic"
msgstr ""
@@ -5194,6 +5231,9 @@ msgstr ""
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr ""
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr ""
+
msgid "Analytics|Users"
msgstr ""
@@ -5212,6 +5252,12 @@ msgstr ""
msgid "Analytics|Visualization Type"
msgstr ""
+msgid "Analytics|Visualization designer"
+msgstr ""
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr ""
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -5236,6 +5282,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anonymous user"
+msgstr ""
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr ""
@@ -6012,9 +6061,6 @@ msgstr ""
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr ""
-msgid "Arrange charts"
-msgstr ""
-
msgid "Artifact"
msgstr ""
@@ -6095,6 +6141,9 @@ msgstr ""
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr ""
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr ""
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr ""
@@ -6149,7 +6198,7 @@ msgstr ""
msgid "Assign reviewer"
msgstr ""
-msgid "Assign reviewer(s)"
+msgid "Assign reviewers"
msgstr ""
msgid "Assign severity"
@@ -6207,9 +6256,6 @@ msgstr ""
msgid "Assignee lists not available with your current license"
msgstr "您目å‰çš„許å¯è­‰ä¸æ”¯æ´æŒ‡æ´¾äººåå–®"
-msgid "Assignee(s)"
-msgstr "指派人"
-
msgid "Assignees"
msgstr ""
@@ -6347,16 +6393,22 @@ msgstr ""
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr ""
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr ""
+
msgid "AuditStreams|Cancel editing"
msgstr ""
+msgid "AuditStreams|Client Email"
+msgstr ""
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr ""
-msgid "AuditStreams|Defines which streaming events are captured"
+msgid "AuditStreams|Delete destination"
msgstr ""
-msgid "AuditStreams|Delete %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
msgstr ""
msgid "AuditStreams|Destination URL"
@@ -6368,19 +6420,34 @@ msgstr ""
msgid "AuditStreams|Destinations receive all audit event data"
msgstr ""
-msgid "AuditStreams|Edit %{link}"
+msgid "AuditStreams|Event filtering (optional)"
+msgstr ""
+
+msgid "AuditStreams|Filter by audit event type"
msgstr ""
-msgid "AuditStreams|Event filtering (optional)"
+msgid "AuditStreams|Google Cloud Logging"
+msgstr ""
+
+msgid "AuditStreams|HTTP endpoint"
msgstr ""
msgid "AuditStreams|Header"
msgstr ""
+msgid "AuditStreams|Log ID"
+msgstr ""
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr ""
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr ""
+
+msgid "AuditStreams|Private key"
+msgstr ""
+
+msgid "AuditStreams|Project ID"
msgstr ""
msgid "AuditStreams|Remove custom header"
@@ -6389,6 +6456,9 @@ msgstr ""
msgid "AuditStreams|Save external stream destination"
msgstr ""
+msgid "AuditStreams|Select events"
+msgstr ""
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr ""
@@ -6416,10 +6486,7 @@ msgstr ""
msgid "AuditStreams|Verification token"
msgstr ""
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr ""
-
-msgid "AuditStreams|View verification token"
+msgid "AuditStreams|audit-events"
msgstr ""
msgid "AuditStreams|ex: 1000"
@@ -6431,6 +6498,12 @@ msgstr ""
msgid "AuditStreams|filtered"
msgstr ""
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr ""
+
+msgid "AuditStreams|my-google-project"
+msgstr ""
+
msgid "Aug"
msgstr "八月"
@@ -6968,28 +7041,28 @@ msgstr ""
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr ""
-msgid "BillingPlans|10,000 units of compute per month"
+msgid "BillingPlans|10,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|10000 units of compute"
+msgid "BillingPlans|10000 compute minutes"
msgstr ""
msgid "BillingPlans|10GB transfer per month"
msgstr ""
-msgid "BillingPlans|400 units of compute"
+msgid "BillingPlans|400 compute minutes"
msgstr ""
-msgid "BillingPlans|400 units of compute per month"
+msgid "BillingPlans|400 compute minutes per month"
msgstr ""
msgid "BillingPlans|5 users per namespace"
msgstr ""
-msgid "BillingPlans|50,000 units of compute per month"
+msgid "BillingPlans|50,000 compute minutes per month"
msgstr ""
-msgid "BillingPlans|50000 units of compute"
+msgid "BillingPlans|50000 compute minutes"
msgstr ""
msgid "BillingPlans|5GB storage"
@@ -7160,6 +7233,9 @@ msgstr ""
msgid "BillingPlans|Talk to an expert today."
msgstr ""
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr ""
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
@@ -7187,10 +7263,7 @@ msgstr ""
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr ""
-msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_link_start}create one%{create_group_link_end} and %{move_link_start}move this project to it%{move_link_end}."
-msgstr ""
-
-msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
+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 your projects to it%{move_link_end}."
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
@@ -7250,10 +7323,10 @@ msgstr ""
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr ""
-msgid "Billings|To use free units of compute 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}."
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "Billings|To use free units of compute 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}"
+msgid "Billings|To use free compute minutes on shared runners, you'll need to validate your account with a credit card. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge your card, it will only be used for validation.%{strongEnd}"
msgstr ""
msgid "Billings|User validation required"
@@ -7265,7 +7338,7 @@ msgstr ""
msgid "Billings|Validate user account"
msgstr ""
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Billings|Your account has been validated"
@@ -7556,12 +7629,18 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr ""
@@ -7623,9 +7702,6 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
-msgid "Boards|List actions"
-msgstr ""
-
msgid "Boards|Move card"
msgstr ""
@@ -7683,6 +7759,9 @@ msgstr ""
msgid "Board|Loading epics"
msgstr ""
+msgid "Bold (%{modifierKey}B)"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -8100,19 +8179,28 @@ msgstr ""
msgid "BroadcastMessages|Red"
msgstr ""
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr ""
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr ""
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr ""
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr ""
+
msgid "BroadcastMessages|Starts at"
msgstr ""
msgid "BroadcastMessages|Target Path"
msgstr ""
-msgid "BroadcastMessages|Target roles"
+msgid "BroadcastMessages|Target broadcast message"
msgstr ""
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
+msgid "BroadcastMessages|Target roles"
msgstr ""
msgid "BroadcastMessages|Theme"
@@ -8349,6 +8437,9 @@ msgstr ""
msgid "By quarter"
msgstr ""
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr ""
+
msgid "By week"
msgstr ""
@@ -8842,11 +8933,11 @@ msgstr ""
msgid "Change assignee"
msgstr ""
-msgid "Change assignee(s)"
-msgstr "更改指派人"
+msgid "Change assignees"
+msgstr ""
-msgid "Change assignee(s)."
-msgstr "更改指派人。"
+msgid "Change assignees."
+msgstr ""
msgid "Change branches"
msgstr ""
@@ -8863,10 +8954,10 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change reviewer(s)"
+msgid "Change reviewers"
msgstr ""
-msgid "Change reviewer(s)."
+msgid "Change reviewers."
msgstr ""
msgid "Change role"
@@ -8890,7 +8981,10 @@ msgstr ""
msgid "Change your password"
msgstr ""
-msgid "Change your password or recover your current one"
+msgid "Change your password or recover your current one."
+msgstr ""
+
+msgid "Change your password."
msgstr ""
msgid "ChangeReviewer|All reviewers were removed."
@@ -8938,13 +9032,13 @@ msgstr ""
msgid "Changed"
msgstr ""
-msgid "Changed assignee(s)."
+msgid "Changed assignees."
msgstr ""
msgid "Changed merge method to %{merge_method}"
msgstr ""
-msgid "Changed reviewer(s)."
+msgid "Changed reviewers."
msgstr ""
msgid "Changed squash option to %{squash_option}"
@@ -8986,9 +9080,6 @@ msgstr ""
msgid "Characters over limit"
msgstr ""
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
-
msgid "Chat"
msgstr ""
@@ -9094,7 +9185,7 @@ msgstr ""
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
msgstr ""
msgid "Checkout|%d compute pack"
@@ -9107,22 +9198,22 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{name}'s storage subscription"
+msgid "Checkout|%{name}'s compute minutes"
msgstr ""
-msgid "Checkout|%{name}'s units of compute"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
msgid "Checkout|%{quantity} GB of storage"
msgstr ""
+msgid "Checkout|%{quantity} compute minutes"
+msgstr ""
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
-msgid "Checkout|%{quantity} units of compute"
-msgstr ""
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
@@ -9162,7 +9253,7 @@ msgstr ""
msgid "Checkout|Compute pack"
msgstr ""
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Confirm purchase"
@@ -9303,10 +9394,10 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
-msgid "Checkout|Total storage: %{quantity} GB"
+msgid "Checkout|Total compute minutes: %{quantity}"
msgstr ""
-msgid "Checkout|Total units of compute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -9333,7 +9424,7 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|units of compute"
+msgid "Checkout|compute minutes"
msgstr ""
msgid "Checkout|x %{quantity} %{units} per pack"
@@ -9381,6 +9472,9 @@ msgstr ""
msgid "Choose file…"
msgstr ""
+msgid "Choose protected branch"
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -9408,16 +9502,16 @@ msgstr ""
msgid "CiCatalog|About this project"
msgstr ""
-msgid "CiCatalog|CI/CD Catalog resource"
+msgid "CiCatalog|CI/CD Catalog"
msgstr ""
-msgid "CiCatalog|CI/CD catalog"
+msgid "CiCatalog|CI/CD Catalog resource"
msgstr ""
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr ""
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr ""
msgid "CiCatalog|Go to the project"
@@ -9432,6 +9526,9 @@ msgstr ""
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr ""
+msgid "CiCatalog|No release available"
+msgstr ""
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr ""
@@ -9459,6 +9556,9 @@ msgstr ""
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr ""
+msgid "CiCatalog|Unreleased"
+msgstr ""
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
@@ -9829,6 +9929,9 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Close %{issuableType}"
+msgstr ""
+
msgid "Close %{issueType}"
msgstr ""
@@ -9886,6 +9989,9 @@ msgstr ""
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr ""
+msgid "Closing %{issuableType}..."
+msgstr ""
+
msgid "Cloud Run"
msgstr ""
@@ -10478,9 +10584,6 @@ msgstr ""
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -10565,9 +10668,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr ""
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr ""
@@ -10628,9 +10728,6 @@ msgstr ""
msgid "ClusterIntegration|Integration enabled"
msgstr ""
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -10874,6 +10971,9 @@ msgstr ""
msgid "CodeOwners|Code owners"
msgstr ""
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr ""
+
msgid "CodeOwners|Hide all"
msgstr ""
@@ -10919,6 +11019,12 @@ msgstr ""
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr ""
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr ""
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr ""
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr ""
@@ -10934,10 +11040,7 @@ msgstr ""
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr ""
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr ""
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
msgstr ""
msgid "Cohorts|Inactive users"
@@ -11033,15 +11136,24 @@ msgstr ""
msgid "CommandPalette|Pages"
msgstr ""
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
+msgid "CommandPalette|Project files"
msgstr ""
-msgid "CommandPalette|Users"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
msgstr ""
msgid "CommandPalette|command"
msgstr ""
+msgid "CommandPalette|go to project file"
+msgstr ""
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr ""
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr ""
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr ""
@@ -11133,18 +11245,12 @@ msgstr ""
msgid "Commit message"
msgstr "æ交信æ¯"
-msgid "Commit message (optional)"
-msgstr ""
-
msgid "Commit message generated by AI"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr ""
-msgid "Commit to %{branchName} branch"
-msgstr ""
-
msgid "CommitBoxTitle|Commit"
msgstr "æ交"
@@ -11271,15 +11377,30 @@ msgstr ""
msgid "CompareRevisions|Branches"
msgstr ""
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr ""
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr ""
+
msgid "CompareRevisions|Compare"
msgstr ""
+msgid "CompareRevisions|Compare revisions"
+msgstr ""
+
msgid "CompareRevisions|Create merge request"
msgstr ""
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr ""
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr ""
+
msgid "CompareRevisions|Select Git revision"
msgstr ""
@@ -11289,6 +11410,12 @@ msgstr ""
msgid "CompareRevisions|Select target project"
msgstr ""
+msgid "CompareRevisions|Show changes"
+msgstr ""
+
+msgid "CompareRevisions|Swap"
+msgstr ""
+
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -11325,10 +11452,13 @@ msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr ""
-msgid "Compliance Report|Export as CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr ""
+
+msgid "Compliance Report|Export full report as CSV"
msgstr ""
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
msgstr ""
msgid "Compliance Report|Frameworks"
@@ -11526,6 +11656,9 @@ msgstr ""
msgid "ComplianceReport|No projects found"
msgstr ""
+msgid "ComplianceReport|No projects found that match filters"
+msgstr ""
+
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -11571,13 +11704,13 @@ msgstr ""
msgid "Components must have a 'name'"
msgstr ""
-msgid "Compute quota"
+msgid "Compute minutes"
msgstr ""
-msgid "Compute quota:"
+msgid "Compute quota"
msgstr ""
-msgid "Confidence"
+msgid "Compute quota:"
msgstr ""
msgid "Confidential"
@@ -11634,9 +11767,6 @@ msgstr ""
msgid "Configure Integrations"
msgstr ""
-msgid "Configure Prometheus"
-msgstr ""
-
msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST IaC settings."
msgstr ""
@@ -11673,9 +11803,6 @@ msgstr ""
msgid "Configure custom rules for Jira issue key matching"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
msgid "Configure pipeline"
msgstr ""
@@ -11838,15 +11965,9 @@ msgstr ""
msgid "Connecting..."
msgstr ""
-msgid "Connection failed"
-msgstr ""
-
msgid "Connection failure"
msgstr ""
-msgid "Connection timed out"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -12231,9 +12352,6 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -12357,6 +12475,39 @@ msgstr ""
msgid "ContributionAnalytics|Total Contributions"
msgstr ""
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr ""
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr ""
+
msgid "Contributions for %{calendar_date}"
msgstr ""
@@ -12486,9 +12637,6 @@ msgstr ""
msgid "Copy link URL"
msgstr ""
-msgid "Copy link to chart"
-msgstr ""
-
msgid "Copy merge request URL"
msgstr ""
@@ -12654,6 +12802,9 @@ msgstr ""
msgid "Could not restore the group"
msgstr ""
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr ""
+
msgid "Could not revoke access token %{access_token_name}."
msgstr ""
@@ -12708,9 +12859,6 @@ msgstr ""
msgid "Create %{humanized_resource_name}"
msgstr ""
-msgid "Create %{type}"
-msgstr ""
-
msgid "Create %{workspace} label"
msgstr ""
@@ -12753,6 +12901,9 @@ msgstr ""
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr ""
+msgid "Create a new fork"
+msgstr ""
+
msgid "Create a new issue"
msgstr "建立新議題"
@@ -13038,6 +13189,9 @@ msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr ""
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr ""
+
msgid "CreateValueStreamForm|Name is required"
msgstr ""
@@ -13182,9 +13336,6 @@ msgstr ""
msgid "Creating epic"
msgstr ""
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr ""
-
msgid "Creator"
msgstr ""
@@ -14403,6 +14554,12 @@ msgstr ""
msgid "Decrease"
msgstr ""
+msgid "Decrement suggestion line end"
+msgstr ""
+
+msgid "Decrement suggestion line start"
+msgstr ""
+
msgid "Default - Never run"
msgstr ""
@@ -14666,6 +14823,9 @@ msgstr ""
msgid "Delete video"
msgstr ""
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -14778,6 +14938,12 @@ msgid "Dependencies|%d vulnerability detected"
msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] ""
+msgid "Dependencies|%{locationCount} locations"
+msgstr ""
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr ""
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr ""
@@ -14820,9 +14986,15 @@ msgstr ""
msgid "Dependencies|Packager"
msgstr ""
+msgid "Dependencies|Projects"
+msgstr ""
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr ""
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr ""
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr ""
@@ -14856,6 +15028,9 @@ msgstr ""
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr ""
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
@@ -14874,6 +15049,9 @@ msgstr ""
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr ""
+msgid "DependencyProxy|Copy example"
+msgstr ""
+
msgid "DependencyProxy|Copy image path"
msgstr ""
@@ -14898,6 +15076,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Pull image by digest example"
+msgstr ""
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
@@ -14907,6 +15088,9 @@ msgstr ""
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr ""
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr ""
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr ""
@@ -15216,9 +15400,6 @@ msgstr ""
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr ""
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr ""
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr ""
@@ -15370,12 +15551,6 @@ msgstr ""
msgid "Deprecated API rate limits"
msgstr ""
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr ""
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -15385,9 +15560,6 @@ msgstr ""
msgid "Description"
msgstr "æè¿°"
-msgid "Description (alt text)"
-msgstr ""
-
msgid "Description (optional)"
msgstr ""
@@ -16131,7 +16303,7 @@ msgstr ""
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr ""
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
msgstr ""
msgid "Don't have a group?"
@@ -16176,15 +16348,15 @@ msgstr ""
msgid "Download (%{size})"
msgstr ""
-msgid "Download CSV"
-msgstr ""
-
msgid "Download PDF"
msgstr ""
msgid "Download artifacts"
msgstr ""
+msgid "Download artifacts archive"
+msgstr ""
+
msgid "Download codes"
msgstr ""
@@ -16470,6 +16642,9 @@ msgstr ""
msgid "Edit sidebar"
msgstr ""
+msgid "Edit single file"
+msgstr ""
+
msgid "Edit table"
msgstr ""
@@ -16575,6 +16750,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email must be provided."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -16911,9 +17089,6 @@ msgstr ""
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr ""
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr ""
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
@@ -16974,9 +17149,6 @@ msgstr ""
msgid "Enter the following to confirm:"
msgstr ""
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -17004,16 +17176,19 @@ msgstr ""
msgid "Enterprise"
msgstr ""
-msgid "EnterpriseUsers|The user detail cannot be updated"
+msgid "Enterprise User"
msgstr ""
-msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
+msgid "Enterprise User Account on GitLab"
msgstr ""
-msgid "EnterpriseUsers|The user is already an enterprise user"
+msgid "EnterpriseUsers|The user detail cannot be updated"
+msgstr ""
+
+msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr ""
-msgid "EnterpriseUsers|The user is not a member of the group"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
msgstr ""
msgid "Environment"
@@ -17178,9 +17353,6 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
-msgid "Environments|Learn about environments"
-msgstr ""
-
msgid "Environments|Learn more about stopping environments"
msgstr ""
@@ -17193,9 +17365,6 @@ msgstr ""
msgid "Environments|New environment"
msgstr ""
-msgid "Environments|No deployed environments"
-msgstr ""
-
msgid "Environments|No deployments yet"
msgstr ""
@@ -17391,12 +17560,6 @@ msgstr ""
msgid "Epics, issues, and merge requests"
msgstr ""
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
-
-msgid "Epics|%{startDate} – No due date"
-msgstr ""
-
msgid "Epics|Add a new epic"
msgstr ""
@@ -17412,9 +17575,6 @@ msgstr ""
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
-msgid "Epics|No start date – %{dueDate}"
-msgstr ""
-
msgid "Epics|Remove epic"
msgstr ""
@@ -18365,12 +18525,18 @@ msgstr[0] ""
msgid "Failed on"
msgstr ""
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr ""
+
msgid "Failed to add a Zoom meeting"
msgstr ""
msgid "Failed to add a resource link"
msgstr ""
+msgid "Failed to add emoji. Please try again"
+msgstr ""
+
msgid "Failed to apply commands."
msgstr ""
@@ -18408,9 +18574,6 @@ msgstr ""
msgid "Failed to clone this issue: wrong parameters."
msgstr ""
-msgid "Failed to convert this work item: %{reason}."
-msgstr ""
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr ""
@@ -18555,6 +18718,9 @@ msgstr ""
msgid "Failed to remove a to-do item for the design."
msgstr ""
+msgid "Failed to remove emoji. Please try again"
+msgstr ""
+
msgid "Failed to remove mirror."
msgstr ""
@@ -18576,6 +18742,9 @@ msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr ""
+msgid "Failed to save namespace commit email."
+msgstr ""
+
msgid "Failed to save new settings"
msgstr ""
@@ -18642,9 +18811,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation"
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -18946,6 +19112,9 @@ msgstr ""
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
+msgid "Fill in merge request template"
+msgstr ""
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr ""
@@ -19177,9 +19346,6 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr ""
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr ""
@@ -19189,6 +19355,9 @@ msgstr ""
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr ""
+
msgid "For investigating IT service disruptions or outages"
msgstr ""
@@ -19370,6 +19539,9 @@ msgid "Free groups are limited to %{free_user_limit} member and the remaining me
msgid_plural "Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group."
msgstr[0] ""
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr ""
+
msgid "Free trial will expire in %{days}"
msgstr ""
@@ -19430,6 +19602,9 @@ msgstr ""
msgid "From issue creation until deploy to production"
msgstr "從創建議題到部署到生產環境"
+msgid "From line %{line1} to %{line2}"
+msgstr ""
+
msgid "From merge request merge until deploy to production"
msgstr "從åˆä½µè«‹æ±‚çš„åˆä½µåˆ°éƒ¨ç½²è‡³ç”Ÿç”¢ç’°å¢ƒ"
@@ -19487,6 +19662,9 @@ msgstr ""
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
+msgid "Generate root cause analysis"
+msgstr ""
+
msgid "Generate site and private keys at"
msgstr ""
@@ -20101,9 +20279,6 @@ msgstr ""
msgid "Get started with error tracking"
msgstr ""
-msgid "Get started with performance monitoring"
-msgstr ""
-
msgid "Get started!"
msgstr ""
@@ -20584,6 +20759,9 @@ msgstr ""
msgid "Gitpod|https://gitpod.example.com"
msgstr ""
+msgid "Give feedback"
+msgstr ""
+
msgid "Give us some feedback"
msgstr ""
@@ -20623,6 +20801,9 @@ msgstr ""
msgid "GlobalSearch|Close"
msgstr ""
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr ""
+
msgid "GlobalSearch|Group"
msgstr ""
@@ -20641,6 +20822,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Label(s)"
+msgstr ""
+
msgid "GlobalSearch|Language"
msgstr ""
@@ -20653,6 +20837,9 @@ msgstr ""
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr ""
+msgid "GlobalSearch|No labels found"
+msgstr ""
+
msgid "GlobalSearch|Project"
msgstr ""
@@ -20689,6 +20876,9 @@ msgstr ""
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
+msgid "GlobalSearch|Search labels"
+msgstr ""
+
msgid "GlobalSearch|Search results are loading"
msgstr ""
@@ -21118,9 +21308,6 @@ msgstr ""
msgid "Group information"
msgstr ""
-msgid "Group is required when cluster_type is :group"
-msgstr ""
-
msgid "Group jobs by"
msgstr ""
@@ -21412,6 +21599,9 @@ msgstr ""
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr ""
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr ""
@@ -22083,12 +22273,6 @@ msgstr ""
msgid "HeaderAction|Okay!"
msgstr ""
-msgid "HeaderAction|incident"
-msgstr ""
-
-msgid "HeaderAction|issue"
-msgstr ""
-
msgid "Headers"
msgstr ""
@@ -22203,10 +22387,6 @@ msgstr ""
msgid "Hide archived projects"
msgstr ""
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] ""
-
msgid "Hide comments"
msgstr ""
@@ -22352,12 +22532,24 @@ msgstr ""
msgid "Housekeeping successfully started"
msgstr "已開始維護"
+msgid "How do I change my password in GitLab?"
+msgstr ""
+
+msgid "How do I clone a repository?"
+msgstr ""
+
msgid "How do I configure Akismet?"
msgstr ""
msgid "How do I configure this integration?"
msgstr ""
+msgid "How do I create a template?"
+msgstr ""
+
+msgid "How do I fork a project?"
+msgstr ""
+
msgid "How do I generate it?"
msgstr ""
@@ -22978,6 +23170,9 @@ msgstr ""
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr ""
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr ""
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -23036,6 +23231,9 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr ""
+
msgid "Improve quality with test cases"
msgstr ""
@@ -23858,6 +24056,12 @@ msgstr ""
msgid "Increase"
msgstr ""
+msgid "Increment suggestion line end"
+msgstr ""
+
+msgid "Increment suggestion line start"
+msgstr ""
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr ""
@@ -23975,7 +24179,7 @@ msgstr ""
msgid "Insert comment template"
msgstr ""
-msgid "Insert link"
+msgid "Insert link (%{modifierKey}K)"
msgstr ""
msgid "Insert or edit diagram"
@@ -24008,9 +24212,6 @@ msgstr ""
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
-msgid "Install on clusters"
-msgstr ""
-
msgid "Installation"
msgstr ""
@@ -25084,6 +25285,9 @@ msgstr ""
msgid "It's you"
msgstr ""
+msgid "Italic (%{modifierKey}I)"
+msgstr ""
+
msgid "Italic text"
msgstr ""
@@ -25441,9 +25645,15 @@ msgstr ""
msgid "JiraConnect|Sign in to link groups"
msgstr ""
+msgid "JiraConnect|Tell us what you think!"
+msgstr ""
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr ""
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr ""
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr ""
@@ -25678,6 +25888,9 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
+msgid "Job ID"
+msgstr ""
+
msgid "Job artifacts"
msgstr ""
@@ -25696,6 +25909,9 @@ msgstr ""
msgid "Job logs and artifacts"
msgstr ""
+msgid "Job name"
+msgstr ""
+
msgid "Job was retried"
msgstr ""
@@ -25861,6 +26077,9 @@ msgstr ""
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr ""
+msgid "Jobs|Root cause analysis"
+msgstr ""
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr ""
@@ -26023,6 +26242,12 @@ msgstr ""
msgid "Job|We could not find this element"
msgstr ""
+msgid "Job|You do not have permission to read this job's log"
+msgstr ""
+
+msgid "Job|You do not have permission to retry this job"
+msgstr ""
+
msgid "Job|allowed to fail"
msgstr ""
@@ -26086,9 +26311,6 @@ msgstr ""
msgid "Keep divergent refs"
msgstr ""
-msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
-msgstr ""
-
msgid "Kerberos access denied"
msgstr ""
@@ -26304,6 +26526,9 @@ msgstr ""
msgid "Last 2 weeks"
msgstr ""
+msgid "Last 24 hours"
+msgstr ""
+
msgid "Last Accessed On"
msgstr ""
@@ -26935,9 +27160,6 @@ msgstr ""
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
-msgid "Link copied"
-msgstr ""
-
msgid "Link copied to clipboard."
msgstr ""
@@ -27085,7 +27307,7 @@ msgstr ""
msgid "Loading snippet"
msgstr ""
-msgid "Loading the GitLab IDE..."
+msgid "Loading the GitLab IDE"
msgstr ""
msgid "Loading, please wait."
@@ -27151,6 +27373,9 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
+msgid "Locking %{issuableDisplayName}"
+msgstr ""
+
msgid "Locks the discussion."
msgstr ""
@@ -27343,6 +27568,9 @@ msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
+msgid "Manage usage"
+msgstr ""
+
msgid "Manage your project's triggers"
msgstr ""
@@ -27376,6 +27604,9 @@ msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
msgstr ""
+msgid "Map data from"
+msgstr ""
+
msgid "Mar"
msgstr "三月"
@@ -27433,6 +27664,9 @@ msgstr ""
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr ""
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr ""
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr ""
@@ -27457,9 +27691,6 @@ msgstr ""
msgid "MarkdownEditor|header"
msgstr ""
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr ""
-
msgid "Marked"
msgstr ""
@@ -27559,7 +27790,7 @@ msgstr ""
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max file size is 200 KB."
+msgid "Max file size is 200 KiB."
msgstr ""
msgid "Max role"
@@ -27610,7 +27841,7 @@ msgstr ""
msgid "Maximum attachment size"
msgstr ""
-msgid "Maximum attachment size (MB)"
+msgid "Maximum attachment size (MiB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
@@ -27637,7 +27868,7 @@ msgstr ""
msgid "Maximum diff patch size"
msgstr ""
-msgid "Maximum diff patch size (Bytes)"
+msgid "Maximum diff patch size (bytes)"
msgstr ""
msgid "Maximum duration of a session."
@@ -27646,7 +27877,7 @@ msgstr ""
msgid "Maximum export size"
msgstr ""
-msgid "Maximum export size (MB)"
+msgid "Maximum export size (MiB)"
msgstr ""
msgid "Maximum field length"
@@ -27682,7 +27913,7 @@ msgstr ""
msgid "Maximum import size"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum import size (MiB)"
msgstr ""
msgid "Maximum job artifact size"
@@ -27703,7 +27934,10 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr ""
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
msgstr ""
msgid "Maximum number of comments exceeded"
@@ -27724,12 +27958,18 @@ msgstr ""
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr ""
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr ""
+
+msgid "Maximum number of stages per value stream exceeded"
msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr ""
+
msgid "Maximum number of variables loaded (2000)"
msgstr ""
@@ -27754,7 +27994,7 @@ msgstr ""
msgid "Maximum push size"
msgstr ""
-msgid "Maximum push size (MB)"
+msgid "Maximum push size (MiB)"
msgstr ""
msgid "Maximum requests per 10 minutes per IP address"
@@ -27787,7 +28027,7 @@ msgstr ""
msgid "Maximum size of individual attachments in comments."
msgstr ""
-msgid "Maximum size of pages (MB)"
+msgid "Maximum size of pages (MiB)"
msgstr ""
msgid "Maximum snippet size"
@@ -28129,6 +28369,9 @@ msgstr ""
msgid "Merge request approvals"
msgstr ""
+msgid "Merge request change summary"
+msgstr ""
+
msgid "Merge request commits"
msgstr ""
@@ -28147,6 +28390,9 @@ msgstr ""
msgid "Merge request status"
msgstr ""
+msgid "Merge request summaries"
+msgstr ""
+
msgid "Merge request summary"
msgstr ""
@@ -28264,9 +28510,6 @@ msgstr ""
msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr ""
@@ -28294,9 +28537,6 @@ msgstr ""
msgid "MergeRequests|Reference copied"
msgstr ""
-msgid "MergeRequests|Saving the comment failed"
-msgstr ""
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -28321,6 +28561,9 @@ msgstr ""
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr "檢視å–代檔案@ %{commitId}"
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr ""
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr ""
@@ -28387,6 +28630,18 @@ msgstr ""
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr ""
+msgid "MergeRequest|Summaries are written by AI"
+msgstr ""
+
+msgid "MergeRequest|Summary notes"
+msgstr ""
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr ""
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr ""
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr ""
@@ -28483,9 +28738,6 @@ msgstr ""
msgid "MetricImages|There was an issue uploading your image."
msgstr ""
-msgid "Metrics"
-msgstr ""
-
msgid "Metrics - Grafana"
msgstr ""
@@ -28540,214 +28792,45 @@ msgstr ""
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
-msgid "Metrics|1. Define and preview panel"
-msgstr ""
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
-
-msgid "Metrics|Add metric"
-msgstr ""
-
-msgid "Metrics|Add panel"
-msgstr ""
-
-msgid "Metrics|Avg"
-msgstr ""
-
-msgid "Metrics|Back to dashboard"
-msgstr ""
-
-msgid "Metrics|Cancel"
-msgstr ""
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr ""
-
-msgid "Metrics|Collapse panel"
-msgstr ""
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
-
-msgid "Metrics|Copy YAML"
-msgstr ""
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
-msgid "Metrics|Create new dashboard"
-msgstr ""
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr ""
-
-msgid "Metrics|Current"
-msgstr ""
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
-
msgid "Metrics|Delete metric"
msgstr ""
msgid "Metrics|Delete metric?"
msgstr ""
-msgid "Metrics|Duplicate"
-msgstr ""
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate dashboard"
-msgstr ""
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
-
-msgid "Metrics|Duplicating..."
-msgstr ""
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr ""
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-
-msgid "Metrics|Expand panel"
msgstr ""
msgid "Metrics|For grouping similar metrics"
msgstr ""
-msgid "Metrics|Invalid time range, please verify."
-msgstr ""
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr ""
msgid "Metrics|Legend label (optional)"
msgstr ""
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr ""
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
-
-msgid "Metrics|Manage chart links"
-msgstr ""
-
-msgid "Metrics|Max"
-msgstr ""
-
-msgid "Metrics|Metrics Settings"
-msgstr ""
-
-msgid "Metrics|Min"
-msgstr ""
-
-msgid "Metrics|More actions"
-msgstr ""
-
msgid "Metrics|Must be a valid PromQL query."
msgstr ""
msgid "Metrics|New metric"
msgstr ""
-msgid "Metrics|Open repository"
-msgstr ""
-
-msgid "Metrics|Panel YAML"
-msgstr ""
-
-msgid "Metrics|Panel YAML copied"
-msgstr ""
-
-msgid "Metrics|Preview panel"
-msgstr ""
-
msgid "Metrics|PromQL query is valid"
msgstr ""
msgid "Metrics|Prometheus Query Documentation"
msgstr ""
-msgid "Metrics|Refresh Prometheus data"
-msgstr ""
-
-msgid "Metrics|Refresh dashboard"
-msgstr ""
-
-msgid "Metrics|Select a value"
-msgstr ""
-
-msgid "Metrics|Set refresh rate"
-msgstr ""
-
-msgid "Metrics|Star dashboard"
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr ""
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr ""
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr ""
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr ""
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr ""
-
-msgid "Metrics|There was an error getting environments information."
-msgstr ""
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr ""
-
msgid "Metrics|There was an error trying to validate your query"
msgstr ""
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr ""
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr ""
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
-
msgid "Metrics|Unit label"
msgstr ""
-msgid "Metrics|Unstar dashboard"
-msgstr ""
-
msgid "Metrics|Used as a title for the chart"
msgstr ""
@@ -28757,24 +28840,12 @@ msgstr ""
msgid "Metrics|Validating query"
msgstr ""
-msgid "Metrics|Values"
-msgstr ""
-
-msgid "Metrics|View documentation"
-msgstr ""
-
msgid "Metrics|Y-axis label"
msgstr ""
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr ""
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr ""
-
msgid "Metrics|e.g. HTTP requests"
msgstr ""
@@ -29160,6 +29231,9 @@ msgstr ""
msgid "MlExperimentTracking|Model experiments"
msgstr ""
+msgid "MlExperimentTracking|Model registry"
+msgstr ""
+
msgid "MlExperimentTracking|Name"
msgstr ""
@@ -29196,6 +29270,9 @@ msgstr ""
msgid "Model experiments"
msgstr ""
+msgid "ModelRegistry|Model registry"
+msgstr ""
+
msgid "Modified"
msgstr ""
@@ -29256,9 +29333,6 @@ msgstr ""
msgid "More information is available|here"
msgstr ""
-msgid "More information."
-msgstr ""
-
msgid "More options"
msgstr ""
@@ -29436,6 +29510,12 @@ msgstr ""
msgid "Namespace Limits"
msgstr ""
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr ""
+
+msgid "Namespace must be provided."
+msgstr ""
+
msgid "Namespace or group to import repository into does not exist."
msgstr ""
@@ -30182,12 +30262,6 @@ msgstr ""
msgid "No data available"
msgstr ""
-msgid "No data found"
-msgstr ""
-
-msgid "No data to display"
-msgstr ""
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr ""
@@ -30326,9 +30400,6 @@ msgstr ""
msgid "No regions configured"
msgstr ""
-msgid "No related merge requests found."
-msgstr ""
-
msgid "No repository"
msgstr "沒有存儲庫"
@@ -30371,6 +30442,9 @@ msgstr ""
msgid "No starrers matched your search"
msgstr ""
+msgid "No start date – %{dueDate}"
+msgstr ""
+
msgid "No suggestions found"
msgstr ""
@@ -30513,9 +30587,6 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr ""
-
msgid "Notes"
msgstr ""
@@ -30808,6 +30879,9 @@ msgstr ""
msgid "Notify|Committed by"
msgstr ""
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr ""
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr ""
@@ -30913,18 +30987,24 @@ msgstr ""
msgid "Notify|No work items have been imported."
msgstr ""
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
+msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr ""
-msgid "Notify|Pipeline %{pipeline_link} triggered by"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
msgstr ""
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr ""
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
msgstr ""
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr ""
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr ""
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr ""
@@ -31099,6 +31179,9 @@ msgstr ""
msgid "Number of shards"
msgstr ""
+msgid "Number of shards for non-code indexing"
+msgstr ""
+
msgid "OK"
msgstr ""
@@ -31773,6 +31856,12 @@ msgstr ""
msgid "Organizations"
msgstr ""
+msgid "Organization|Organization navigation"
+msgstr ""
+
+msgid "Organization|Organization overview"
+msgstr ""
+
msgid "Orphaned member"
msgstr ""
@@ -32293,6 +32382,18 @@ msgstr ""
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
+msgid "PackageRegistry|Published %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr ""
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -32863,9 +32964,6 @@ msgstr "æµæ°´ç·šè¨ˆåŠƒ"
msgid "Pipeline URL"
msgstr ""
-msgid "Pipeline artifacts"
-msgstr ""
-
msgid "Pipeline creation rate limits"
msgstr ""
@@ -33067,6 +33165,15 @@ msgstr "已啟用"
msgid "PipelineSchedules|All"
msgstr "所有"
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr ""
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr ""
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr ""
@@ -33076,6 +33183,9 @@ msgstr ""
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr ""
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr ""
+
msgid "PipelineSchedules|Cron timezone"
msgstr ""
@@ -33133,9 +33243,6 @@ msgstr ""
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr ""
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr ""
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr ""
@@ -33322,9 +33429,6 @@ msgstr ""
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr ""
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr ""
-
msgid "Pipelines|Clear runner caches"
msgstr ""
@@ -33436,6 +33540,9 @@ msgstr ""
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr ""
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr ""
+
msgid "Pipelines|Revoke trigger"
msgstr ""
@@ -33487,9 +33594,6 @@ msgstr ""
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
-
msgid "Pipelines|This pipeline is stuck"
msgstr ""
@@ -33508,7 +33612,7 @@ msgstr ""
msgid "Pipelines|Token"
msgstr ""
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
msgstr ""
msgid "Pipelines|Total number of jobs for the pipeline"
@@ -33568,9 +33672,15 @@ msgstr ""
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr ""
+msgid "Pipelines|created"
+msgstr ""
+
msgid "Pipelines|error"
msgstr ""
+msgid "Pipelines|finished"
+msgstr ""
+
msgid "Pipelines|invalid"
msgstr ""
@@ -33637,6 +33747,12 @@ msgstr ""
msgid "Pipeline|Merged result pipeline"
msgstr ""
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr ""
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr ""
+
msgid "Pipeline|Passed"
msgstr ""
@@ -33721,6 +33837,9 @@ msgstr ""
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr ""
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr ""
+
msgid "Pipeline|Trigger author"
msgstr ""
@@ -33847,9 +33966,6 @@ msgstr ""
msgid "Please contact an admin to create runners."
msgstr ""
-msgid "Please contact an admin to register runners."
-msgstr ""
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -34000,7 +34116,7 @@ msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr ""
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
+msgid "Please type %{phrase_code} to proceed."
msgstr ""
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
@@ -34516,6 +34632,9 @@ msgstr ""
msgid "ProductAnalytics|Feature Usages"
msgstr ""
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr ""
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr ""
@@ -34555,6 +34674,9 @@ msgstr ""
msgid "ProductAnalytics|Page Views"
msgstr ""
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr ""
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr ""
@@ -34696,6 +34818,9 @@ msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr ""
+msgid "Profiles| You are 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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr ""
+
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -35212,9 +35337,6 @@ msgstr ""
msgid "Project information"
msgstr ""
-msgid "Project is required when cluster_type is :project"
-msgstr ""
-
msgid "Project members"
msgstr ""
@@ -35752,18 +35874,6 @@ msgstr ""
msgid "ProjectSettings|Issues"
msgstr ""
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu host"
-msgstr ""
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr ""
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
@@ -35947,9 +36057,6 @@ msgstr ""
msgid "ProjectSettings|Target project"
msgstr ""
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr ""
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr ""
@@ -35971,9 +36078,6 @@ msgstr ""
msgid "ProjectSettings|The default template will be applied on save."
msgstr ""
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr ""
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr ""
@@ -36010,10 +36114,7 @@ msgstr ""
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr ""
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
msgstr ""
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
@@ -36496,6 +36597,9 @@ msgstr ""
msgid "Promote to objective"
msgstr ""
+msgid "Promote work item"
+msgstr ""
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr ""
@@ -36511,6 +36615,9 @@ msgstr ""
msgid "Promotes issue to incident"
msgstr ""
+msgid "Promotes work item to %{type}."
+msgstr ""
+
msgid "Promotion is not supported."
msgstr ""
@@ -37293,9 +37400,6 @@ msgstr ""
msgid "Query"
msgstr ""
-msgid "Query cannot be processed"
-msgstr ""
-
msgid "Queued"
msgstr ""
@@ -37368,6 +37472,9 @@ msgstr ""
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr ""
+msgid "Read the documentation before applying changes."
+msgstr ""
+
msgid "Read their documentation."
msgstr ""
@@ -37549,7 +37656,7 @@ msgstr ""
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr ""
-msgid "RegistrationVerification|Enable free units of compute"
+msgid "RegistrationVerification|Enable free compute minutes"
msgstr ""
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
@@ -37561,7 +37668,7 @@ msgstr ""
msgid "RegistrationVerification|Skip this for now"
msgstr ""
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
msgstr ""
msgid "RegistrationVerification|Validate account"
@@ -37576,18 +37683,6 @@ msgstr ""
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr ""
-msgid "Registration|Checkout"
-msgstr ""
-
-msgid "Registration|Your GitLab group"
-msgstr ""
-
-msgid "Registration|Your first project"
-msgstr ""
-
-msgid "Registration|Your profile"
-msgstr ""
-
msgid "Registry entry enqueued to be resynced"
msgstr ""
@@ -37802,13 +37897,13 @@ msgstr ""
msgid "Remove access"
msgstr ""
-msgid "Remove all or specific assignee(s)"
-msgstr "移除全部或特定指派人"
+msgid "Remove all or specific assignees"
+msgstr ""
msgid "Remove all or specific label(s)"
msgstr ""
-msgid "Remove all or specific reviewer(s)"
+msgid "Remove all or specific reviewers"
msgstr ""
msgid "Remove approvers"
@@ -38069,6 +38164,9 @@ msgstr ""
msgid "Reopen"
msgstr ""
+msgid "Reopen %{issuableType}"
+msgstr ""
+
msgid "Reopen %{issueType}"
msgstr ""
@@ -38093,6 +38191,9 @@ msgstr ""
msgid "Reopened this %{quick_action_target}."
msgstr ""
+msgid "Reopening %{issuableType}..."
+msgstr ""
+
msgid "Reopening..."
msgstr ""
@@ -38111,6 +38212,9 @@ msgstr ""
msgid "Replace audio"
msgstr ""
+msgid "Replace current template with filled in placeholders"
+msgstr ""
+
msgid "Replace file"
msgstr ""
@@ -38504,7 +38608,7 @@ msgstr ""
msgid "Repository size is above the limit."
msgstr ""
-msgid "Repository size limit (MB)"
+msgid "Repository size limit (MiB)"
msgstr ""
msgid "Repository storage"
@@ -38877,9 +38981,6 @@ msgid "Reviewer"
msgid_plural "%d Reviewers"
msgstr[0] ""
-msgid "Reviewer(s)"
-msgstr ""
-
msgid "Reviewers"
msgstr ""
@@ -38925,12 +39026,21 @@ msgstr ""
msgid "Role"
msgstr ""
+msgid "Roles and Permissions"
+msgstr ""
+
msgid "Rollback"
msgstr ""
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr ""
+msgid "Root cause analysis"
+msgstr ""
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr ""
+
msgid "Ruby"
msgstr ""
@@ -39079,6 +39189,9 @@ msgstr ""
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr ""
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr ""
@@ -39184,10 +39297,16 @@ msgstr ""
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr ""
+msgid "Runners|Dashboard"
+msgstr ""
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] ""
+msgid "Runners|Delete %{count} runners?"
+msgstr ""
+
msgid "Runners|Delete runner"
msgstr ""
@@ -39248,9 +39367,6 @@ msgstr ""
msgid "Runners|Filter projects"
msgstr ""
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr ""
-
msgid "Runners|Get started with runners"
msgstr ""
@@ -39423,6 +39539,10 @@ msgid "Runners|Permanently delete %d runner"
msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] ""
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] ""
+
msgid "Runners|Platform"
msgstr ""
@@ -39676,7 +39796,8 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr ""
msgid "Runners|The runner will be permanently deleted and no longer available for projects or groups in the instance. Are you sure you want to continue?"
-msgstr ""
+msgid_plural "Runners|%d 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] ""
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr ""
@@ -39994,10 +40115,13 @@ msgstr ""
msgid "Saving project."
msgstr ""
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
msgstr ""
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
msgstr ""
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
@@ -40006,12 +40130,33 @@ msgstr ""
msgid "ScanExecutionPolicy|Add condition"
msgstr ""
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Conditions"
msgstr ""
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr ""
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr ""
+msgid "ScanExecutionPolicy|Key"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr ""
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr ""
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr ""
@@ -40030,6 +40175,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select a scanner"
msgstr ""
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr ""
+
msgid "ScanExecutionPolicy|Select agent"
msgstr ""
@@ -40045,6 +40193,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Select site profile"
msgstr ""
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr ""
+
msgid "ScanExecutionPolicy|Site profile"
msgstr ""
@@ -40054,6 +40205,9 @@ msgstr ""
msgid "ScanExecutionPolicy|Triggers:"
msgstr ""
+msgid "ScanExecutionPolicy|Value"
+msgstr ""
+
msgid "ScanExecutionPolicy|agent"
msgstr ""
@@ -40066,6 +40220,12 @@ msgstr ""
msgid "ScanExecutionPolicy|in namespaces"
msgstr ""
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr ""
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr ""
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr ""
@@ -40087,6 +40247,9 @@ msgstr ""
msgid "ScanResultPolicy|Clear all"
msgstr ""
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr ""
+
msgid "ScanResultPolicy|Except"
msgstr ""
@@ -40135,6 +40298,9 @@ msgstr ""
msgid "ScanResultPolicy|Status is:"
msgstr ""
+msgid "ScanResultPolicy|Unknown"
+msgstr ""
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr ""
@@ -40566,7 +40732,7 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
@@ -40590,9 +40756,6 @@ msgstr ""
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr ""
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr ""
-
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -40677,9 +40840,6 @@ msgstr ""
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr ""
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
-
msgid "SecurityConfiguration|SAST configuration"
msgstr ""
@@ -40794,6 +40954,9 @@ msgstr ""
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr ""
+
msgid "SecurityOrchestration|Choose a project"
msgstr ""
@@ -40917,6 +41080,9 @@ msgstr ""
msgid "SecurityOrchestration|No tags available"
msgstr ""
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr ""
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr ""
@@ -40959,7 +41125,7 @@ msgstr ""
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr ""
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
msgstr ""
msgid "SecurityOrchestration|Roles"
@@ -41101,6 +41267,9 @@ msgstr ""
msgid "SecurityOrchestration|This view only shows scan results for the agent %{agent}. You can view scan results for all agents in the %{linkStart}Operational Vulnerabilities tab of the vulnerability report%{linkEnd}."
msgstr ""
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr ""
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr ""
@@ -41494,6 +41663,9 @@ msgstr ""
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr ""
+
msgid "SecurityReports|There was an error creating the issue."
msgstr ""
@@ -41674,7 +41846,7 @@ msgstr ""
msgid "Select assignee"
msgstr ""
-msgid "Select assignee(s)"
+msgid "Select assignees"
msgstr ""
msgid "Select branch"
@@ -41737,10 +41909,16 @@ msgstr ""
msgid "Select projects"
msgstr ""
+msgid "Select protected branch"
+msgstr ""
+
+msgid "Select protected branches"
+msgstr ""
+
msgid "Select report"
msgstr ""
-msgid "Select reviewer(s)"
+msgid "Select reviewers"
msgstr ""
msgid "Select severity (optional)"
@@ -41887,6 +42065,9 @@ msgstr ""
msgid "Service Account Key"
msgstr ""
+msgid "Service Accounts"
+msgstr ""
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr ""
@@ -41917,6 +42098,9 @@ msgstr ""
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr ""
+msgid "ServiceDesk|Cannot create custom email"
+msgstr ""
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr ""
@@ -41926,6 +42110,12 @@ msgstr ""
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr ""
+msgid "ServiceDesk|Custom email already exists"
+msgstr ""
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -41935,6 +42125,9 @@ msgstr ""
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr ""
+msgid "ServiceDesk|Parameters missing"
+msgstr ""
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr ""
@@ -41962,6 +42155,12 @@ msgstr ""
msgid "ServicePing|Service ping is off"
msgstr ""
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr ""
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr ""
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr ""
@@ -42269,6 +42468,15 @@ msgstr ""
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr ""
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr ""
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr ""
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr ""
+
msgid "Shimo|Go to Shimo Workspace"
msgstr ""
@@ -42353,7 +42561,7 @@ msgstr ""
msgid "Show details"
msgstr ""
-msgid "Show failed jobs"
+msgid "Show failed jobs (%{count})"
msgstr ""
msgid "Show file browser"
@@ -42362,9 +42570,6 @@ msgstr ""
msgid "Show file contents"
msgstr ""
-msgid "Show filters"
-msgstr ""
-
msgid "Show full blame"
msgstr ""
@@ -42672,7 +42877,7 @@ msgstr ""
msgid "Size Limits"
msgstr ""
-msgid "Size limit per repository (MB)"
+msgid "Size limit per repository (MiB)"
msgstr ""
msgid "Skip to main content"
@@ -42897,6 +43102,9 @@ msgstr ""
msgid "Snippets|Files"
msgstr ""
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr ""
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr ""
@@ -43467,6 +43675,9 @@ msgstr ""
msgid "Specific branches"
msgstr ""
+msgid "Specific protected branches"
+msgstr ""
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
@@ -43605,9 +43816,6 @@ msgstr ""
msgid "Start merge train"
msgstr ""
-msgid "Start merge train when pipeline succeeds"
-msgstr ""
-
msgid "Start merge train..."
msgstr ""
@@ -43809,9 +44017,6 @@ msgstr ""
msgid "StatusPage|your status page frontend."
msgstr ""
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr ""
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr ""
@@ -43860,7 +44065,7 @@ msgstr ""
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr ""
-msgid "Strikethrough"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
msgstr ""
msgid "Strikethrough text"
@@ -44295,6 +44500,12 @@ msgstr ""
msgid "Summary comment (optional)"
msgstr ""
+msgid "Summary generated by AI"
+msgstr ""
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr ""
+
msgid "Sun"
msgstr ""
@@ -44521,10 +44732,10 @@ msgstr "切æ›åˆ†æ”¯/標籤"
msgid "Switch to GitLab Next"
msgstr ""
-msgid "Switch to Markdown"
+msgid "Switch to plain text editing"
msgstr ""
-msgid "Switch to rich text"
+msgid "Switch to rich text editing"
msgstr ""
msgid "Switch to the source to copy the file contents"
@@ -44788,7 +44999,7 @@ msgstr ""
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr ""
-msgid "TanukiBot|Ask GitLab Chat"
+msgid "TanukiBot|Ask GitLab Duo"
msgstr ""
msgid "TanukiBot|Ask a question about GitLab"
@@ -44873,6 +45084,21 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr ""
+
+msgid "TelegramIntegration|New token"
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr ""
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr ""
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -45043,9 +45269,6 @@ msgstr ""
msgid "Terraform|Terraform init command"
msgstr ""
-msgid "Terraform|Terraform reports"
-msgstr ""
-
msgid "Terraform|Terraform states"
msgstr ""
@@ -45295,9 +45518,6 @@ msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr ""
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr ""
@@ -45376,13 +45596,13 @@ msgstr ""
msgid "The current user is not authorized to access the job log."
msgstr ""
-msgid "The current user is not authorized to update the pipeline schedule"
+msgid "The current user is not authorized to create the pipeline schedule"
msgstr ""
-msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
+msgid "The current user is not authorized to update the pipeline schedule"
msgstr ""
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
+msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
@@ -45576,9 +45796,15 @@ msgstr ""
msgid "The list creation wizard is already open"
msgstr ""
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr ""
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr ""
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -45594,9 +45820,6 @@ msgstr ""
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr ""
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr ""
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr ""
@@ -45723,6 +45946,9 @@ msgstr ""
msgid "The snippet can be accessed without any authentication."
msgstr ""
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr ""
+
msgid "The snippet is visible only to me."
msgstr ""
@@ -45951,6 +46177,9 @@ msgstr ""
msgid "There was a problem fetching epics."
msgstr ""
+msgid "There was a problem fetching failed jobs"
+msgstr ""
+
msgid "There was a problem fetching groups."
msgstr ""
@@ -46161,6 +46390,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while retrying this job"
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -46302,6 +46534,9 @@ msgstr ""
msgid "This commit is part of merge request %{link_to_merge_request}. Comments created here will be created in the context of that merge request."
msgstr ""
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr ""
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr ""
@@ -46683,9 +46918,6 @@ msgstr ""
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr ""
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr ""
@@ -46857,9 +47089,6 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr ""
-
msgid "Throughput"
msgstr ""
@@ -47139,6 +47368,9 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
+msgid "Timeline"
+msgstr ""
+
msgid "Timeline event added successfully."
msgstr ""
@@ -47222,13 +47454,10 @@ msgstr ""
msgid "Titles"
msgstr ""
-msgid "Titles and Descriptions"
-msgstr ""
-
msgid "To"
msgstr ""
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
msgstr ""
msgid "To Do"
@@ -47297,6 +47526,9 @@ 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 access to personal content, only use this account for matters related to %{group_name}."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -47324,9 +47556,6 @@ msgstr ""
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr ""
-msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
@@ -47397,6 +47626,9 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
+msgid "To set up this feature, contact your administrator."
+msgstr ""
+
msgid "To set up this integration:"
msgstr ""
@@ -47406,6 +47638,12 @@ msgstr ""
msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr ""
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -47577,9 +47815,6 @@ msgstr ""
msgid "Toggle backtrace"
msgstr ""
-msgid "Toggle collapse"
-msgstr ""
-
msgid "Toggle comments for this file"
msgstr ""
@@ -47589,6 +47824,9 @@ msgstr ""
msgid "Toggle commit list"
msgstr ""
+msgid "Toggle details"
+msgstr ""
+
msgid "Toggle emoji award"
msgstr ""
@@ -47637,12 +47875,6 @@ msgstr ""
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr ""
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr ""
-
-msgid "Tokens|Select scopes"
-msgstr ""
-
msgid "Tomorrow"
msgstr ""
@@ -47716,6 +47948,9 @@ msgstr ""
msgid "Topics could not be merged!"
msgstr ""
+msgid "Topics|Subscribe to the new projects feed"
+msgstr ""
+
msgid "Total"
msgstr ""
@@ -48044,12 +48279,6 @@ msgstr ""
msgid "URL"
msgstr ""
-msgid "URL cannot be blank"
-msgstr ""
-
-msgid "URL is invalid"
-msgstr ""
-
msgid "URL is required"
msgstr ""
@@ -48107,9 +48336,6 @@ msgstr ""
msgid "Unable to collect memory info"
msgstr ""
-msgid "Unable to connect to Prometheus server"
-msgstr ""
-
msgid "Unable to connect to server: %{error}"
msgstr ""
@@ -48293,9 +48519,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Units of compute"
-msgstr ""
-
msgid "Units|d"
msgstr ""
@@ -48347,7 +48570,7 @@ msgstr ""
msgid "Unlock"
msgstr ""
-msgid "Unlock %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
msgstr ""
msgid "Unlock account"
@@ -48368,6 +48591,9 @@ msgstr ""
msgid "Unlocked the discussion."
msgstr ""
+msgid "Unlocking %{issuableDisplayName}"
+msgstr ""
+
msgid "Unlocks the discussion."
msgstr ""
@@ -48377,9 +48603,6 @@ msgstr ""
msgid "Unrecognized approval status."
msgstr ""
-msgid "Unrecognized cluster type"
-msgstr ""
-
msgid "Unresolve"
msgstr ""
@@ -48659,7 +48882,7 @@ msgstr ""
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
-msgid "UsageQuota|Buy additional units of compute"
+msgid "UsageQuota|Buy additional compute minutes"
msgstr ""
msgid "UsageQuota|Buy storage"
@@ -48707,6 +48930,9 @@ msgstr ""
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr ""
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr ""
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr ""
@@ -48746,16 +48972,10 @@ msgstr ""
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr ""
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr ""
-
msgid "UsageQuota|Pipelines"
msgstr ""
-msgid "UsageQuota|Purchased storage"
-msgstr ""
-
-msgid "UsageQuota|Purchased storage used"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
msgstr ""
msgid "UsageQuota|Recalculate repository usage"
@@ -48815,7 +49035,13 @@ msgstr ""
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr ""
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr ""
+
+msgid "UsageQuota|Total purchased storage"
+msgstr ""
+
+msgid "UsageQuota|Total storage"
msgstr ""
msgid "UsageQuota|Transfer"
@@ -49119,6 +49345,9 @@ msgstr ""
msgid "User does not have permission to create a Security Policy project."
msgstr ""
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr ""
+
msgid "User has already been deactivated"
msgstr ""
@@ -49272,9 +49501,15 @@ msgstr ""
msgid "UserProfile|Activity"
msgstr "活動"
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr ""
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr ""
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr ""
@@ -49293,6 +49528,9 @@ msgstr "è²¢ç»çš„專案"
msgid "UserProfile|Copy user ID"
msgstr ""
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr ""
+
msgid "UserProfile|Edit profile"
msgstr ""
@@ -49374,6 +49612,9 @@ msgstr ""
msgid "UserProfile|Unconfirmed user"
msgstr ""
+msgid "UserProfile|User ID copied to clipboard"
+msgstr ""
+
msgid "UserProfile|User ID: %{id}"
msgstr ""
@@ -49623,7 +49864,7 @@ msgstr ""
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr ""
-msgid "ValueStreamAnalytics|Key metrics"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
msgstr ""
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
@@ -49749,7 +49990,7 @@ msgstr ""
msgid "VerificationReminder|Your account has been validated"
msgstr ""
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
msgstr ""
msgid "Verified"
@@ -49764,9 +50005,6 @@ msgstr ""
msgid "Verify code"
msgstr ""
-msgid "Verify configuration"
-msgstr ""
-
msgid "Version"
msgstr ""
@@ -49848,10 +50086,6 @@ msgstr ""
msgid "View card matches"
msgstr ""
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] ""
-
msgid "View dependency details for your project"
msgstr ""
@@ -49877,9 +50111,6 @@ msgstr ""
msgid "View file @ %{commitSha}"
msgstr ""
-msgid "View full dashboard"
-msgstr ""
-
msgid "View group in admin area"
msgstr ""
@@ -49934,9 +50165,6 @@ msgstr "查看開啟的åˆä¸¦è«‹æ±‚"
msgid "View page @ "
msgstr ""
-msgid "View performance dashboard."
-msgstr ""
-
msgid "View project in admin area"
msgstr ""
@@ -49953,6 +50181,9 @@ msgstr "檢視已å–代檔案 @ "
msgid "View seat usage"
msgstr ""
+msgid "View summary notes"
+msgstr ""
+
msgid "View supported languages and frameworks"
msgstr ""
@@ -49965,9 +50196,6 @@ msgstr ""
msgid "View the latest successful deployment to this environment"
msgstr ""
-msgid "View the performance dashboard at"
-msgstr ""
-
msgid "View usage details"
msgstr ""
@@ -50322,6 +50550,9 @@ msgstr ""
msgid "Vulnerability|Comments"
msgstr ""
+msgid "Vulnerability|Could not load prompt."
+msgstr ""
+
msgid "Vulnerability|Crash address"
msgstr ""
@@ -50376,6 +50607,9 @@ msgstr ""
msgid "Vulnerability|GitLab Security Report"
msgstr ""
+msgid "Vulnerability|Hide prompt"
+msgstr ""
+
msgid "Vulnerability|Identifier"
msgstr ""
@@ -50451,6 +50685,9 @@ msgstr ""
msgid "Vulnerability|Severity:"
msgstr ""
+msgid "Vulnerability|Show prompt"
+msgstr ""
+
msgid "Vulnerability|Status"
msgstr ""
@@ -50508,9 +50745,6 @@ msgstr ""
msgid "Waiting for merge (open and assigned)"
msgstr ""
-msgid "Waiting for performance data"
-msgstr ""
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr "權é™ä¸è¶³ã€‚如需查看相關數據,請å‘管ç†å“¡ç”³è«‹æ¬Šé™ã€‚"
@@ -50550,9 +50784,6 @@ msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr ""
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr ""
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr ""
@@ -50571,9 +50802,6 @@ msgstr ""
msgid "We recommend a work email address."
msgstr ""
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr ""
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
@@ -50961,6 +51189,9 @@ msgstr ""
msgid "What is repository mirroring?"
msgstr ""
+msgid "What is root cause analysis?"
+msgstr ""
+
msgid "What is squashing?"
msgstr ""
@@ -51273,6 +51504,9 @@ msgstr "å–消權é™ç”³è¯·"
msgid "Won't fix / Accept risk"
msgstr ""
+msgid "Work Item promoted successfully."
+msgstr ""
+
msgid "Work Item type with id %{id} was not found"
msgstr ""
@@ -51367,6 +51601,9 @@ msgstr ""
msgid "WorkItem|Converted to task"
msgstr ""
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr ""
+
msgid "WorkItem|Create %{workItemType}"
msgstr ""
@@ -51391,9 +51628,6 @@ msgstr ""
msgid "WorkItem|Existing task"
msgstr ""
-msgid "WorkItem|Failed to award emoji"
-msgstr ""
-
msgid "WorkItem|Health status"
msgstr ""
@@ -51508,6 +51742,12 @@ msgstr ""
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr ""
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr ""
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr ""
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr ""
@@ -51586,6 +51826,9 @@ msgstr ""
msgid "Workspaces|Cancel"
msgstr ""
+msgid "Workspaces|Could not load workspaces"
+msgstr ""
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr ""
@@ -51682,6 +51925,9 @@ msgstr ""
msgid "Workspaces|You can't create a workspace for this project"
msgstr ""
+msgid "Workspaces|Your workspaces"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -51791,9 +52037,6 @@ msgstr ""
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr ""
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr ""
@@ -52082,6 +52325,9 @@ msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
+msgid "You can’t edit files directly in this project."
+msgstr ""
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -52519,6 +52765,12 @@ msgstr ""
msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr ""
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr ""
+
msgid "Your GitLab account request has been approved!"
msgstr ""
@@ -52570,6 +52822,12 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr ""
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr ""
+
msgid "Your account has been deactivated"
msgstr ""
@@ -52630,7 +52888,7 @@ msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr ""
-msgid "Your comment could not be updated! Please check your network connection and try again."
+msgid "Your comment could not be updated because %{reason}."
msgstr ""
msgid "Your comment will be discarded."
@@ -52788,10 +53046,13 @@ msgstr ""
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr ""
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
+msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr ""
-msgid "Your top-level group is over the user limit and has been placed in a read-only state."
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr ""
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
msgstr ""
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
@@ -53082,7 +53343,7 @@ msgstr ""
msgid "cannot be changed since member is associated with a custom role"
msgstr ""
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
msgstr ""
msgid "cannot be changed to %{new_type} with these child item types."
@@ -53508,10 +53769,8 @@ msgid "closed %{timeago}"
msgstr ""
msgid "closed issue"
-msgstr ""
-
-msgid "collect usage information"
-msgstr ""
+msgid_plural "closed issues"
+msgstr[0] ""
msgid "comment"
msgstr ""
@@ -53730,18 +53989,6 @@ msgstr[0] ""
msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr ""
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr ""
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr ""
-
-msgid "for %{ref}"
-msgstr ""
-
msgid "for Workspace is required to be public"
msgstr ""
@@ -53846,7 +54093,7 @@ msgstr ""
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr ""
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
msgstr ""
msgid "in group %{link_to_group}"
@@ -53855,6 +54102,9 @@ msgstr ""
msgid "in project %{link_to_project}"
msgstr ""
+msgid "incident"
+msgstr ""
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] ""
@@ -54038,9 +54288,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -54217,9 +54464,6 @@ msgstr ""
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr ""
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr ""
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -54339,9 +54583,6 @@ msgstr ""
msgid "mrWidget|Merged by"
msgstr ""
-msgid "mrWidget|More information"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -54405,16 +54646,16 @@ msgstr ""
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "mrWidget|What is a merge train?"
+msgid "mrWidget|Your merge request is almost ready!"
msgstr ""
msgid "mrWidget|Your password"
@@ -54453,6 +54694,12 @@ msgstr ""
msgid "must be at least 1 day"
msgstr ""
+msgid "must be before %{expiry_date}"
+msgstr ""
+
+msgid "must be false when email confirmation setting is off"
+msgstr ""
+
msgid "must be greater than start date"
msgstr ""
@@ -54486,9 +54733,6 @@ msgstr ""
msgid "must contain only a discord user ID."
msgstr ""
-msgid "must expire in 365 days"
-msgstr ""
-
msgid "must have a repository"
msgstr ""
@@ -54568,7 +54812,8 @@ msgid "only supports valid HTTP(S) URLs"
msgstr ""
msgid "open issue"
-msgstr ""
+msgid_plural "open issues"
+msgstr[0] ""
msgid "or"
msgstr ""
@@ -54889,6 +55134,9 @@ msgstr ""
msgid "terraform states"
msgstr ""
+msgid "test case"
+msgstr ""
+
msgid "the correct format."
msgstr ""
@@ -54946,9 +55194,6 @@ msgstr ""
msgid "unicode domains should use IDNA encoding"
msgstr ""
-msgid "unlocked"
-msgstr ""
-
msgid "updated"
msgstr ""
@@ -55071,9 +55316,6 @@ msgstr ""
msgid "your group (%{group_name})"
msgstr ""
-msgid "your settings"
-msgstr ""
-
msgid "yyyy-mm-dd"
msgstr ""
diff --git a/locale/zh_TW/gitlab.po b/locale/zh_TW/gitlab.po
index f27757288f8..45ede008c5a 100644
--- a/locale/zh_TW/gitlab.po
+++ b/locale/zh_TW/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: zh-TW\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 16\n"
-"PO-Revision-Date: 2023-06-13 04:46\n"
+"PO-Revision-Date: 2023-07-11 04:48\n"
msgid " %{start} to %{end}"
msgstr " %{start} 到 %{end}"
@@ -95,6 +95,14 @@ msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] "%d ä½æ ¸å‡†è€…"
+msgid "%d Issue"
+msgid_plural "%d Issues"
+msgstr[0] "%d 個議題"
+
+msgid "%d Merge Request"
+msgid_plural "%d Merge Requests"
+msgstr[0] "%d 個åˆä½µè«‹æ±‚"
+
msgid "%d Module"
msgid_plural "%d Modules"
msgstr[0] "%d個模組"
@@ -155,6 +163,10 @@ msgid "%d assigned issue"
msgid_plural "%d assigned issues"
msgstr[0] "%d 個已指派的議題"
+msgid "%d author"
+msgid_plural "%d authors"
+msgstr[0] "%d ä½ä½œè€…"
+
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] "%d 個已變更檔案"
@@ -299,14 +311,6 @@ msgid "%d more comment"
msgid_plural "%d more comments"
msgstr[0] "還有 %d 則留言"
-msgid "%d opened Issue"
-msgid_plural "%d opened Issues"
-msgstr[0] "已開啟 %d 個議題單"
-
-msgid "%d opened Merge Request"
-msgid_plural "%d opened Merge Requests"
-msgstr[0] "已開啟 %d 個åˆä½µè«‹æ±‚"
-
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] "%d 個軟體包"
@@ -562,9 +566,6 @@ msgid "%{count} project"
msgid_plural "%{count} projects"
msgstr[0] "%{count} 個專案"
-msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr "%{count} 個相關的 %{pluralized_subject}:%{links}"
-
msgid "%{count} selected"
msgstr "å·²é¸å– %{count} 個"
@@ -607,6 +608,9 @@ msgstr "%{docs_link_start}甚麼是大型檔案儲存空間?%{docs_link_end}"
msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr "%{docs_link_start}什麼是兩步驟驗證?%{docs_link_end}"
+msgid "%{duration}, queued for %{queuedDuration} seconds"
+msgstr "%{duration},排隊等候了 %{queuedDuration} 秒"
+
msgid "%{duration}ms"
msgstr "%{duration} 毫秒"
@@ -679,8 +683,11 @@ msgstr "%{human_readable_key} 少於 %{min_value_length} 個字元"
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr "%{integrations_link_start}æ•´åˆ%{link_end}能讓你將第三方應用程å¼æˆç‚º GitLab工作æµç¨‹çš„一部分。若當å‰å¯ç”¨çš„æ•´åˆç„¡æ³•æ»¿è¶³ä½ çš„需求,å¯ä»¥è€ƒæ…®ä½¿ç”¨ %{webhooks_link_start}webhook%{link_end}。"
-msgid "%{issuableDisplayName} %{lockStatus}."
-msgstr "%{issuableDisplayName} %{lockStatus}。"
+msgid "%{issuableDisplayName} locked."
+msgstr "%{issuableDisplayName} 已鎖定。"
+
+msgid "%{issuableDisplayName} unlocked."
+msgstr "%{issuableDisplayName} 已解鎖。"
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} 將被刪除ï¼æ‚¨ç¢ºå®šå—Žï¼Ÿ"
@@ -703,6 +710,9 @@ msgstr "%{italic_start}新增功能%{italic_end} 處於éžæ´»å‹•ç‹€æ…‹ï¼Œç„¡æ³•æ
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr "%{itemsCount} 個議題,上é™ç‚º %{maxIssueCount} 個"
+msgid "%{jobName} job is being retried"
+msgstr "正在é‡è©¦ %{jobName} 作業"
+
msgid "%{jobs} Jobs"
msgstr "%{jobs} 個任務"
@@ -1009,6 +1019,12 @@ msgstr "%{spanStart}在行號%{spanEnd} %{errorLine}%{errorColumn}"
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr "%{spanStart}æ–¼%{spanEnd} %{errorFn}"
+msgid "%{startDate} – %{dueDate}"
+msgstr "%{startDate} – %{dueDate}"
+
+msgid "%{startDate} – No due date"
+msgstr "%{startDate} – 無截止日期"
+
msgid "%{start} to %{end}"
msgstr "%{start} 到 %{end}"
@@ -1036,8 +1052,8 @@ msgstr "%{statusStart}已解除%{statusEnd}:%{dismissalReason} 在%{pipelineLi
msgid "%{statusStart}Dismissed%{statusEnd}: %{dismissalReason} on pipeline %{pipelineLink} at %{projectLink}"
msgstr "%{statusStart}已解除%{statusEnd}:%{dismissalReason} 在%{projectLink}çš„ %{pipelineLink} æµæ°´ç·šä¸Š"
-msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
-msgstr "%{strongOpen}警告:%{strongClose} SAML 群組連çµæœƒä½¿ GitLab 自動從群組中移除æˆå“¡ã€‚"
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically change member roles or remove members from groups."
+msgstr "%{strongOpen}警告:%{strongClose} SAML 群組éˆçµå¯èƒ½æœƒå°Žè‡´ GitLab 自動變更æˆå“¡è§’色或從群組中刪除æˆå“¡ã€‚"
msgid "%{strongStart}%{count}%{strongEnd} commit"
msgid_plural "%{strongStart}%{count}%{strongEnd} commits"
@@ -1148,9 +1164,6 @@ msgstr "%{type} åªæ”¯æŒ %{name} åå­—"
msgid "%{url} (optional)"
msgstr "%{url} (é¸å¡«)"
-msgid "%{userName} (cannot merge)"
-msgstr "%{userName} (無法åˆä½µ)"
-
msgid "%{userName}'s avatar"
msgstr "%{userName} 的大頭貼"
@@ -1805,6 +1818,12 @@ msgstr "有幫助"
msgid "AI|I don't see how I can help. Please give better instructions!"
msgstr "我ä¸çŸ¥é“我能幫上什麼忙。請給我更好的指令ï¼"
+msgid "AI|May provide inappropriate responses not representative of GitLab's views. Do not input personal data."
+msgstr "AI生æˆçš„回答å¯èƒ½ä¸ä¸€å®šä»£è¡¨GitLab的觀點,有時å¯èƒ½æœƒæä¾›ä¸é©ç•¶çš„回應。在與AI模型互動時,請勿輸入個人æ•æ„Ÿä¿¡æ¯ã€‚"
+
+msgid "AI|New chat"
+msgstr "æ–°çš„èŠå¤©å®¤"
+
msgid "AI|Populate issue description"
msgstr "填寫議題æè¿°"
@@ -2258,6 +2277,9 @@ msgstr "å­˜å–令牌"
msgid "AccessTokens|Access token limit reached"
msgstr "å·²é”到存å–令牌 é™åˆ¶"
+msgid "AccessTokens|Add a %{type}"
+msgstr "新增一個 %{type}"
+
msgid "AccessTokens|Are you sure?"
msgstr "你確定嗎?"
@@ -2276,12 +2298,18 @@ msgstr "複製傳入的電å­éƒµä»¶å­˜å–令牌"
msgid "AccessTokens|Copy static object token"
msgstr "複製éœæ…‹ç‰©ä»¶ä»¤ç‰Œ"
+msgid "AccessTokens|Create %{type}"
+msgstr "建立 %{type}"
+
msgid "AccessTokens|Created"
msgstr "已建立"
msgid "AccessTokens|Feed token"
msgstr "Feed 令牌"
+msgid "AccessTokens|For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
+msgstr "例如,應用程å¼ä½¿ç”¨è©²ä»¤ç‰Œçš„目的或該令牌的用途。請勿在令牌的å稱中æä¾›æ•æ„Ÿä¿¡æ¯ï¼Œå› ç‚ºæ‰€æœ‰ %{resource_type} æˆå“¡éƒ½å¯ä»¥çœ‹è¦‹ã€‚"
+
msgid "AccessTokens|Incoming email token"
msgstr "傳入電å­éƒµä»¶ä»¤ç‰Œ"
@@ -2300,6 +2328,15 @@ msgstr "ä¿å¯†æ­¤ä»¤ç‰Œï¼Œå¦å‰‡ä»–人å¯ä»¥æ“有您查閱活動ã€ç™¼å¸ƒ RSS é
msgid "AccessTokens|Personal Access Tokens"
msgstr "個人存å–令牌"
+msgid "AccessTokens|Scopes set the permission levels granted to the token."
+msgstr "範åœï¼ˆScopes)設定了授予該令牌的權é™ç´šåˆ¥ã€‚"
+
+msgid "AccessTokens|Select a role"
+msgstr "é¸å–角色"
+
+msgid "AccessTokens|Select scopes"
+msgstr "é¸å–範åœ"
+
msgid "AccessTokens|Static object token"
msgstr "éœæ…‹ç‰©ä»¶ä»¤ç‰Œ"
@@ -2309,6 +2346,9 @@ msgstr "上次使用令牌的時間"
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr "當您啟用兩步驟èªè­‰ (2FA) 時,它們將是唯一能接å—的密碼。"
+msgid "AccessTokens|Token name"
+msgstr "令牌å稱"
+
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr "您還å¯ä»¥ä½¿ç”¨å€‹äººå­˜å–令牌é€éŽ HTTP 進行 Git 驗證。"
@@ -2360,14 +2400,14 @@ msgstr "通éŽé©—證您的帳號來修復您的æµæ°´ç·š"
msgid "AccountValidation|I'll bring my own runners"
msgstr "我è¦ä½¿ç”¨è‡ªå·±çš„執行器"
-msgid "AccountValidation|In order to use free units of compute on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
-msgstr "為了在共享執行器上使用å…費的計算單ä½ï¼Œæ‚¨éœ€è¦ä½¿ç”¨æˆ‘們的驗證é¸é …之一驗證您的帳號。如果您ä¸æƒ³é€™æ¨£åšï¼Œæ‚¨å¯ä»¥ä½¿ç”¨è‡ªå·±çš„執行器é‹è¡Œæµæ°´ç·šï¼Œä¸¦åœ¨æ‚¨çš„專案中ç¦ç”¨å…±äº«åŸ·è¡Œå™¨ã€‚"
+msgid "AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project."
+msgstr "為了使用共享執行器上的å…費計算分é˜æ•¸ï¼Œæ‚¨éœ€è¦ä½¿ç”¨æˆ‘們的驗證é¸é …之一來驗證您的帳號。如果您ä¸æƒ³é€™æ¨£åšï¼Œæ‚¨å¯ä»¥ä½¿ç”¨è‡ªå·±çš„執行器é‹è¡Œæµç¨‹ä¸¦åœç”¨æ‚¨å°ˆæ¡ˆçš„共享執行器。"
msgid "AccountValidation|Learn more."
msgstr "了解更多。"
-msgid "AccountValidation|Looks like you'll need to validate your account to use free units of compute"
-msgstr "看起來您需è¦é©—證您的帳號æ‰èƒ½ä½¿ç”¨å…費的計算單ä½"
+msgid "AccountValidation|Looks like you'll need to validate your account to use free compute minutes"
+msgstr "您似乎需è¦é©—證您的帳號æ‰èƒ½ä½¿ç”¨å…費計算的時間"
msgid "AccountValidation|Validate your account"
msgstr "驗證您的帳號"
@@ -2477,9 +2517,6 @@ msgstr "新增 Wiki"
msgid "Add Zoom meeting"
msgstr "加入 Zoom 會議"
-msgid "Add a %{type}"
-msgstr "新增一個 %{type}"
-
msgid "Add a GCP region"
msgstr "新增 GCP å€åŸŸ"
@@ -2528,6 +2565,9 @@ msgstr "建立議題"
msgid "Add a numbered list"
msgstr "加入編號列表"
+msgid "Add a quick action"
+msgstr "新增快速動作"
+
msgid "Add a related epic"
msgstr "新增相關å²è©© (epic) "
@@ -2783,6 +2823,9 @@ msgstr "此版本新增"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
msgstr "ç›®å‰çš„ GitLab 執行個體ä¸å…許加入新應用程å¼ã€‚è«‹è¯çµ¡æ‚¨çš„ GitLab 管ç†å“¡ä»¥ç²å¾—相關權é™ã€‚"
+msgid "Additional compute minutes:"
+msgstr "é¡å¤–的計算分é˜æ•¸ï¼š"
+
msgid "Additional diagram formats"
msgstr "其他圖表格å¼"
@@ -2804,9 +2847,6 @@ msgstr "在登入é é¢é¡¯ç¤ºçš„é¡å¤–文字"
msgid "Additional units"
msgstr "附加單ä½"
-msgid "Additional units of compute:"
-msgstr "é¡å¤–的計算單ä½ï¼š"
-
msgid "Address"
msgstr "地å€"
@@ -3230,24 +3270,15 @@ msgstr "如果沒有任何ç¾æœ‰ç´¢å¼•ï¼ŒGitLab 會建立一個。"
msgid "AdminSettings|Import sources"
msgstr "匯入來æº"
+msgid "AdminSettings|Improve non-code indexing throughput by enqueuing Sidekiq jobs until all documents are processed."
+msgstr "通éŽå°‡ Sidekiq 作業加入佇列,直到處ç†å®Œæ‰€æœ‰æ–‡ä»¶ï¼Œä»¥æ高éžç¨‹å¼ç¢¼ç´¢å¼•çš„åžåé‡ã€‚"
+
msgid "AdminSettings|Inactive project deletion"
msgstr "ä¸æ´»èºå°ˆæ¡ˆç§»é™¤"
msgid "AdminSettings|Instance runners expiration"
msgstr "æœå‹™åŸ·è¡Œå€‹é«”執行器éŽæœŸ"
-msgid "AdminSettings|Jitsu administrator email"
-msgstr "Jitsu 管ç†è€…é›»å­éƒµä»¶"
-
-msgid "AdminSettings|Jitsu administrator password"
-msgstr "Jitsu 管ç†è€…密碼"
-
-msgid "AdminSettings|Jitsu host"
-msgstr "Jitsu 主機"
-
-msgid "AdminSettings|Jitsu project ID"
-msgstr "Jitsu 專案 ID"
-
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
msgstr "ä¿ç•™æœ€æ–°ä¸”æˆåŠŸçš„æµæ°´ç·šä¸­æ‰€æœ‰ä»»å‹™çš„最新產物"
@@ -3329,6 +3360,9 @@ msgstr "é è¨­ä¿è­· CI / CD 變數"
msgid "AdminSettings|Registration Features include:"
msgstr "註冊功能包括:"
+msgid "AdminSettings|Requeue indexing workers"
+msgstr "é‡æ–°ä½‡åˆ—索引工作執行者"
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr "è¦æ±‚使用者證明æ“有自訂網域的所有權"
@@ -3398,9 +3432,6 @@ msgstr "設定值必須大於 0。"
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr "éœæ…‹é é¢ç¶²ç«™çš„容é‡åŠç¶²åŸŸè¨­å®šã€‚"
-msgid "AdminSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr "Jitsu 中專案的 ID,該專案包å«æ‰€æœ‰åˆ†æžåŸ·è¡Œå€‹é«”。"
-
msgid "AdminSettings|The URL of your Cube instance."
msgstr "您 Cube 執行個體的網å€ã€‚"
@@ -3410,9 +3441,6 @@ msgstr "產å“分æžçµ„態器的連線字串,用於 Snowplow 組態。"
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr "用於所有專案的自動審閱應用程å¼å’Œè‡ªå‹•éƒ¨ç½²éšŽæ®µçš„é è¨­ç¶²åŸŸã€‚"
-msgid "AdminSettings|The host of your Jitsu instance."
-msgstr "您 Jitsu 執行個體的主機。"
-
msgid "AdminSettings|The host of your data collector instance."
msgstr "資料收集器執行個體主機。"
@@ -3443,11 +3471,11 @@ msgstr "ç›®å‰æ´»å‹•ä¸­çš„æµæ°´ç®¡ç·šä½œæ¥­ç¸½æ•¸"
msgid "AdminSettings|Use AWS OpenSearch Service with IAM credentials"
msgstr "使用帶有 IAM 憑證的 AWS OpenSearch æœå‹™"
-msgid "AdminSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr "用於將 Jitsu 連接到 Clickhouse 執行個體。"
+msgid "AdminSettings|Use for cluster and index migrations. When indexing is paused, GitLab still tracks changes."
+msgstr "用於å¢é›†å’Œç´¢å¼•é·ç§»ï¼Œç•¶ç´¢å¼•æš«åœæ™‚,GitLab ä»ç„¶æœƒè¿½è¸ªè®Šæ›´ã€‚"
-msgid "AdminSettings|Used to generate short-lived API access tokens."
-msgstr "用於生æˆçŸ­æœŸçš„ API å­˜å–令牌。"
+msgid "AdminSettings|Used to connect Snowplow to the Clickhouse instance."
+msgstr "用於將Snowplow連接到Clickhouse執行個體。"
msgid "AdminSettings|Used to retrieve dashboard data from the Cube instance."
msgstr "用於從 Cube 執行個體中å–得儀表æ¿è³‡æ–™ã€‚"
@@ -3455,9 +3483,6 @@ msgstr "用於從 Cube 執行個體中å–得儀表æ¿è³‡æ–™ã€‚"
msgid "AdminSettings|Users and groups must accept the invitation before they're added to a group or project."
msgstr "使用者和群組在被加入到群組或專案之å‰å¿…須接å—邀請。"
-msgid "AdminSettings|When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr "æš«åœæ™‚,Gitlab ä»ç„¶æœƒè¿½è¹¤è®Šæ›´ã€‚這有助於 å¢é›†/索引 çš„å‡ç´šã€‚"
-
msgid "AdminSettings|When to delete inactive projects"
msgstr "何時刪除ä¸æ´»èºå°ˆæ¡ˆ"
@@ -3680,9 +3705,6 @@ msgstr "有關您GitLab執行個體使用情æ³çš„é‡è¦ä¿¡æ¯"
msgid "AdminUsers|Is using seat"
msgstr "管ç†ä½¿ç”¨è€…正在使用"
-msgid "AdminUsers|Issues and merge requests authored by this user are hidden from other users."
-msgstr "此使用者建立的議題與åˆä½µè«‹æ±‚å°å…¶ä»–使用者來說是隱è—的。"
-
msgid "AdminUsers|It's you!"
msgstr "這就是你ï¼"
@@ -3728,6 +3750,9 @@ msgstr "個人專案ã€ç¾¤çµ„和使用者歷å²è¨˜éŒ„將維æŒä¸è®Š"
msgid "AdminUsers|Private profile"
msgstr "ç§æœ‰å€‹äººè³‡æ–™"
+msgid "AdminUsers|Projects, issues, merge requests, and comments of this user are hidden from other users."
+msgstr "此使用者的專案ã€å•é¡Œã€åˆä½µè«‹æ±‚和評論已å°å…¶ä»–使用者隱è—。"
+
msgid "AdminUsers|Reactivating a user will:"
msgstr "å–消å‡çµä½¿ç”¨è€…將會:"
@@ -3767,8 +3792,8 @@ msgstr "Skype"
msgid "AdminUsers|Sort by"
msgstr "排åºæ–¹å¼"
-msgid "AdminUsers|The maximum units of compute that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
-msgstr "此命å空間中的作業æ¯æœˆå¯åœ¨å…±äº«åŸ·è¡Œå™¨ä¸Šä½¿ç”¨çš„最大計算單ä½ï¼Œè¨­ç‚º 0 則無é™åˆ¶ï¼Œç•™ç©ºå‰‡ç¹¼æ‰¿å…¨å±€è¨­å®š %{minutes}"
+msgid "AdminUsers|The maximum compute minutes that jobs in this namespace can use on shared runners each month. Set 0 for unlimited. Set empty to inherit the global setting of %{minutes}"
+msgstr "該命å空間中的作業在æ¯å€‹æœˆå…§å¯ä»¥ä½¿ç”¨çš„共享執行器最大計算分é˜æ•¸ï¼Œå°‡å…¶è¨­ç½®ç‚º0表示無é™åˆ¶ï¼Œè‹¥å°‡å…¶è¨­ç½®ç‚ºç©ºï¼Œå‰‡ç¹¼æ‰¿ %{minutes} 的全局設置。"
msgid "AdminUsers|The user can't access git repositories."
msgstr "ä½¿ç”¨è€…ç„¡æ³•å­˜å– git 版本庫。"
@@ -4037,9 +4062,6 @@ msgstr "您正在使用éŽæœŸçš„代碼查詢映射。為了æ高代碼查詢質
msgid "After a successful password update you will be redirected to login screen."
msgstr "密碼更新æˆåŠŸå¾Œï¼Œæ‚¨å°‡è¢«é‡æ–°å°Žå‘至登入é é¢ã€‚"
-msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr "密碼更新æˆåŠŸå¾Œï¼Œæ‚¨å°‡è¢«é‡æ–°å°Žå‘到登入é é¢ï¼Œæ‚¨å¯ä»¥ç”¨æ–°å¯†ç¢¼é‡æ–°ç™»å…¥ã€‚"
-
msgid "After it is removed, the fork relationship can only be restored by using the API. This project will no longer be able to receive or send merge requests to the upstream project or other forks."
msgstr "移除後,åªèƒ½é€šéŽAPIæ¢å¾©åˆ†å‰(fork)關係。該專案將無法å†æŽ¥æ”¶æˆ–發é€åˆä½µè«‹æ±‚到上游專案或其他分å‰(fork)。"
@@ -4076,8 +4098,8 @@ msgstr "活動訂閱"
msgid "AlertManagement|Alert"
msgstr "警報"
-msgid "AlertManagement|Alert assignee(s): %{assignees}"
-msgstr "警示處ç†è€…: %{assignees}"
+msgid "AlertManagement|Alert assignees: %{assignees}"
+msgstr "警報管ç†è­¦å ±æŒ‡æ´¾ï¼š %{assignees}"
msgid "AlertManagement|Alert detail"
msgstr "警報詳細資訊"
@@ -4181,11 +4203,11 @@ msgstr "顯示警報時出ç¾éŒ¯èª¤ã€‚è«‹é‡æ–°æ•´ç†é é¢ä»¥é‡è©¦ã€‚"
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr "顯示警報時出錯。確èªçµ‚端點(endpoint)çš„é…置詳細資訊,以確ä¿å‡ºç¾è­¦å ±ã€‚"
-msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
-msgstr "在更新處ç†äººå“¡åˆ—表時出ç¾éŒ¯èª¤ï¼Œè«‹å†è©¦ä¸€é。"
+msgid "AlertManagement|There was an error while updating the assignees list. Please try again."
+msgstr "更新指派人員清單時發生錯誤,請ç¨å¾Œå†è©¦ä¸€æ¬¡ã€‚"
-msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
-msgstr "在更新警示的處ç†äººå“¡æ™‚出ç¾éŒ¯èª¤ï¼Œè«‹å†è©¦ä¸€é。"
+msgid "AlertManagement|There was an error while updating the assignees of the alert. Please try again."
+msgstr "警報管ç†æ›´æ–°è­¦å ±æŒ‡æ´¾æ™‚出錯。請å†è©¦ä¸€æ¬¡ã€‚"
msgid "AlertManagement|There was an error while updating the status of the alert."
msgstr "在更新警示狀態時出ç¾éŒ¯èª¤ã€‚"
@@ -4295,9 +4317,6 @@ msgstr "繼續編輯"
msgid "AlertSettings|Prometheus"
msgstr "Prometheus"
-msgid "AlertSettings|Prometheus API base URL"
-msgstr "Prometheus API 基本 URL"
-
msgid "AlertSettings|Reset Key"
msgstr "é‡ç½®é‡‘é‘°"
@@ -4334,9 +4353,6 @@ msgstr "表格尚有未儲存的變更。您想如何繼續?"
msgid "AlertSettings|To create a custom mapping, enter an example payload from your monitoring tool, in JSON format. Select the \"Parse payload fields\" button to continue."
msgstr "如è¦å»ºç«‹è‡ªè¨‚å°æ‡‰ï¼Œè«‹æ–¼æ‚¨çš„監視工具中輸入 JSON æ ¼å¼çš„è£è¼‰ç¯„例。點é¸ã€Œè§£æžè£è¼‰æ¬„ä½ã€æŒ‰éˆ•ä»¥ç¹¼çºŒã€‚"
-msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr " URL ä¸å¯ç•™ç©ºï¼Œå¿…須以 http: 或 https 開頭。"
-
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr "使用以下的 URL 和授權金鑰來設定 Prometheus 發é€è­¦ç¤ºåˆ° GitLab çš„æ–¹å¼ã€‚查看 %{linkStart}GitLab 文件%{linkEnd}學習如何設定您的端點。"
@@ -4433,6 +4449,9 @@ msgstr "全部分支"
msgid "All changes are committed"
msgstr "所有變更å‡å·²æ交"
+msgid "All default branches"
+msgstr "所有é è¨­åˆ†æ”¯"
+
msgid "All eligible users"
msgstr "所有符åˆæ¢ä»¶ä½¿ç”¨è€…"
@@ -4598,6 +4617,9 @@ msgstr "一併從å­ç¾¤çµ„和專案中刪除使用者æˆå“¡è³‡æ ¼"
msgid "Also unassign this user from related issues and merge requests"
msgstr "åŒæ™‚從相關議題和åˆä½µè«‹æ±‚中å–消指派此使用者"
+msgid "Alt text"
+msgstr "替代文字"
+
msgid "Alternate support URL for Help page and Help dropdown."
msgstr "說明é é¢å’Œèªªæ˜Žä¸‹æ‹‰é¸å–®çš„備用支æ´ç¶²å€."
@@ -4649,12 +4671,6 @@ msgstr "發生錯誤"
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr "報告錯誤,測試çµæžœéŒ¯èª¤åœ°æŒ‡ç¤ºç³»çµ±ä¸­å­˜åœ¨æ¼æ´žï¼Œè€Œæ¼æ´žä¸å­˜åœ¨ã€‚"
-msgid "An error occurred adding a draft to the thread."
-msgstr "å‘話題加入è‰ç¨¿æ™‚發生錯誤。"
-
-msgid "An error occurred adding a new draft."
-msgstr "加入新è‰ç¨¿æ™‚發生錯誤。"
-
msgid "An error occurred creating the new branch."
msgstr "建立新分支時發生錯誤。"
@@ -4697,6 +4713,12 @@ msgstr "核准時發生錯誤,請é‡è©¦ã€‚"
msgid "An error occurred while checking group path. Please refresh and try again."
msgstr "檢查群組路徑時發生錯誤,請é‡æ–°æ•´ç†ä¸¦å†è©¦ä¸€æ¬¡ã€‚"
+msgid "An error occurred while creating the %{issuableType}. Please try again."
+msgstr "在建立 %{issuableType} 時發生錯誤,請å†è©¦ä¸€æ¬¡ã€‚"
+
+msgid "An error occurred while creating the issue. Please try again."
+msgstr "在建立議題時發生錯誤,請å†è©¦ä¸€æ¬¡ã€‚"
+
msgid "An error occurred while decoding the file."
msgstr "譯解檔案時發生錯誤。"
@@ -4856,9 +4878,6 @@ msgstr "載入專案時發生錯誤。"
msgid "An error occurred while loading the blob controls."
msgstr "加載 blob 控制軟體包時發生錯誤。"
-msgid "An error occurred while loading the data. Please try again."
-msgstr "載入資料時發生錯誤。請é‡è©¦ã€‚"
-
msgid "An error occurred while loading the file"
msgstr "載入檔案時發生錯誤"
@@ -4974,9 +4993,6 @@ msgstr "æ›´æ–°é…置時發生錯誤。"
msgid "An error occurred while updating labels."
msgstr "更新標記時發生錯誤。"
-msgid "An error occurred while updating the comment"
-msgstr "更新留言時發生錯誤"
-
msgid "An error occurred while updating the configuration."
msgstr "æ›´æ–°é…置時發生錯誤。"
@@ -5062,8 +5078,8 @@ msgstr "發生未知的錯誤"
msgid "Analytics"
msgstr "分æž"
-msgid "Analytics|Add to Dashboard"
-msgstr "加入到儀表æ¿"
+msgid "Analytics|A visualization with that name already exists."
+msgstr "分æžå…·æœ‰è©²å稱的å¯è¦–化已存在。"
msgid "Analytics|Add visualizations"
msgstr "增加視覺化"
@@ -5128,12 +5144,21 @@ msgstr "資料"
msgid "Analytics|Data Table"
msgstr "資料表格"
+msgid "Analytics|Dates and times are displayed in the UTC timezone"
+msgstr "分æžæ—¥æœŸå’Œæ™‚間以 UTC 時å€é¡¯ç¤º"
+
msgid "Analytics|Edit"
msgstr "編輯"
+msgid "Analytics|Enter a visualization name"
+msgstr "分æžè¼¸å…¥å¯è¦–化å稱"
+
msgid "Analytics|Error while saving dashboard"
msgstr "儲存儀表æ¿æ™‚發生錯誤ï¼"
+msgid "Analytics|Error while saving visualization."
+msgstr "分æžä¿å­˜å¯è¦–化時出錯。"
+
msgid "Analytics|Host"
msgstr "主機"
@@ -5143,8 +5168,8 @@ msgstr "語言"
msgid "Analytics|Line Chart"
msgstr "折線圖"
-msgid "Analytics|New Analytics Visualization Title"
-msgstr "新的視覺化分æžæ¨™é¡Œ"
+msgid "Analytics|New analytics visualization name"
+msgstr "分æžæ–°åˆ†æžå¯è¦–化å稱"
msgid "Analytics|New dashboard"
msgstr "新的儀表æ¿"
@@ -5182,6 +5207,18 @@ msgstr "çµæžœè³‡æ–™"
msgid "Analytics|Save"
msgstr "儲存"
+msgid "Analytics|Save and add to Dashboard"
+msgstr "分æžä¿å­˜ä¸¦å¢žåŠ åˆ°å„€è¡¨æ¿"
+
+msgid "Analytics|Save new visualization"
+msgstr "分æžä¿å­˜æ–°çš„å¯è¦–化"
+
+msgid "Analytics|Select a measurement"
+msgstr "分æžé¸æ“‡æ¸¬é‡"
+
+msgid "Analytics|Select a visualization type"
+msgstr "分æžé¸æ“‡å¯è¦–化類型"
+
msgid "Analytics|Single Statistic"
msgstr "單一統計"
@@ -5194,6 +5231,9 @@ msgstr "URL"
msgid "Analytics|Updating dashboard %{dashboardId}"
msgstr "æ›´æ–°å„€è¡¨æ¿ %{dashboardId}"
+msgid "Analytics|Updating visualization %{visualizationName}"
+msgstr "分æžæ›´æ–°å¯è¦–化 %{visualizationName}"
+
msgid "Analytics|Users"
msgstr "使用者"
@@ -5212,6 +5252,12 @@ msgstr "視覺化設計師"
msgid "Analytics|Visualization Type"
msgstr "視覺化類型"
+msgid "Analytics|Visualization designer"
+msgstr "視覺化設計師"
+
+msgid "Analytics|Visualization was saved successfully"
+msgstr "分æžå¯è¦–化已æˆåŠŸä¿å­˜"
+
msgid "Analyze your dependencies for known vulnerabilities."
msgstr "分æžå·²çŸ¥æ¼æ´žçš„ä¾è³´é—œä¿‚"
@@ -5236,6 +5282,9 @@ msgstr "以åŠè©²è¨»å†Šæ†‘證:"
msgid "Anonymous"
msgstr "匿å"
+msgid "Anonymous user"
+msgstr "匿å使用者"
+
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr "å¦ä¸€å€‹è­°é¡Œè¿½è¹¤å™¨å·²ç¶“在使用中。一次åªèƒ½å•Ÿç”¨ä¸€å€‹è­°é¡Œè¿½è¹¤æœå‹™"
@@ -6012,9 +6061,6 @@ msgstr "您確èªè¦åˆªé™¤GPG金鑰嗎?刪除此GPG金鑰ä¸æœƒå½±éŸ¿å·²ç¶“ç°½
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
msgstr "你確定嗎?該設備將從 GitLab 註銷,並且所有記ä½æˆ‘的憑證都將被撤銷。"
-msgid "Arrange charts"
-msgstr "排列圖表"
-
msgid "Artifact"
msgstr "產物"
@@ -6095,6 +6141,9 @@ msgstr "總產物大å°"
msgid "Artifacts|We want you to be able to use this page to easily manage your CI/CD job artifacts. We are working to improve this experience and would appreciate any feedback you have about the improvements we are making."
msgstr "我們希望您能使用此é é¢è¼•é¬†ç®¡ç†æ‚¨çš„ CI/CD 作業產物。我們正在努力改善相關體驗,若您å°æˆ‘們所作的改進æ出任何回饋,我們會éžå¸¸æ„Ÿæ¿€ã€‚"
+msgid "As this is a newly created account, to get started, click the link below to confirm your account."
+msgstr "由於這是一個新建的帳號,請點擊下é¢çš„éˆçµä»¥ç¢ºèªæ‚¨çš„帳號並開始使用。"
+
msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}."
msgstr "隨著我們繼續為 SAST å»ºç«‹æ›´å¤šåŠŸèƒ½ï¼Œæˆ‘å€‘å¸Œæœ›æ‚¨å° %{linkStart} 本期 %{linkEnd} 中的 SAST é…置功能æä¾›å饋。"
@@ -6149,8 +6198,8 @@ msgstr "指派給自己"
msgid "Assign reviewer"
msgstr "指派審核者"
-msgid "Assign reviewer(s)"
-msgstr "指派審核者"
+msgid "Assign reviewers"
+msgstr "指派審閱人員"
msgid "Assign severity"
msgstr "指定嚴é‡åº¦"
@@ -6207,9 +6256,6 @@ msgstr "被指派人沒有權é™"
msgid "Assignee lists not available with your current license"
msgstr "被指派人åå–®ä¸æ”¯æ´æ‚¨ç›®å‰çš„授權"
-msgid "Assignee(s)"
-msgstr "å—指派者(s)"
-
msgid "Assignees"
msgstr "å—指派者(s)"
@@ -6347,17 +6393,23 @@ msgstr "ç²å–外部審計事件æµç¨‹æ™‚發生錯誤,請å†è©¦ä¸€æ¬¡ã€‚"
msgid "AuditStreams|An error occurred when updating external audit event stream destination. Please try it again."
msgstr "更新外部審計事件æµç›®æ¨™æ™‚發生錯誤。請å†è©¦ä¸€æ¬¡ã€‚"
+msgid "AuditStreams|Are you sure about deleting this destination?"
+msgstr "您確定è¦åˆªé™¤æ­¤ç›®æ¨™å—Žï¼Ÿ"
+
msgid "AuditStreams|Cancel editing"
msgstr "å–消編輯"
+msgid "AuditStreams|Client Email"
+msgstr "客戶端電å­éƒµä»¶"
+
msgid "AuditStreams|Custom HTTP headers (optional)"
msgstr "自訂 HTTP 標頭(é¸å¡«ï¼‰"
-msgid "AuditStreams|Defines which streaming events are captured"
-msgstr "定義è¦æˆªå–哪些串æµäº‹ä»¶"
+msgid "AuditStreams|Delete destination"
+msgstr "刪除目標"
-msgid "AuditStreams|Delete %{link}"
-msgstr "刪除 %{link}"
+msgid "AuditStreams|Deleting the streaming destination %{destination} will stop audit events being streamed"
+msgstr "刪除串æµç›®æ¨™ %{destination} å°‡åœæ­¢ä¸²æµå¯©æ ¸äº‹ä»¶"
msgid "AuditStreams|Destination URL"
msgstr "目的地 URL"
@@ -6368,20 +6420,35 @@ msgstr "目的地套用了éŽæ¿¾å™¨ï¼Œ%{linkStart}什麼是éŽæ¿¾å™¨ï¼Ÿ%{linkEnd
msgid "AuditStreams|Destinations receive all audit event data"
msgstr "目的地接收所有審計事件數據"
-msgid "AuditStreams|Edit %{link}"
-msgstr "編輯 %{link}"
-
msgid "AuditStreams|Event filtering (optional)"
msgstr "事件éŽæ¿¾ (å¯é¸)"
+msgid "AuditStreams|Filter by audit event type"
+msgstr "按審計事件類型éŽæ¿¾"
+
+msgid "AuditStreams|Google Cloud Logging"
+msgstr "Google 雲日誌\n"
+
+msgid "AuditStreams|HTTP endpoint"
+msgstr "HTTP 端點"
+
msgid "AuditStreams|Header"
msgstr "標題"
+msgid "AuditStreams|Log ID"
+msgstr "日誌 ID"
+
msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached."
msgstr "å·²é”到最大 %{number} 個 HTTP 標題。"
-msgid "AuditStreams|No filters available. %{linkStart}How do I add a filter?%{linkEnd}"
-msgstr "沒有å¯ç”¨çš„éŽæ¿¾å™¨ï¼Œ%{linkStart}如何增加éŽæ¿¾å™¨ï¼Ÿ%{linkEnd}"
+msgid "AuditStreams|No header created yet."
+msgstr "還沒有建立標題。"
+
+msgid "AuditStreams|Private key"
+msgstr "ç§é‘°"
+
+msgid "AuditStreams|Project ID"
+msgstr "專案 ID"
msgid "AuditStreams|Remove custom header"
msgstr "移除自訂標頭"
@@ -6389,6 +6456,9 @@ msgstr "移除自訂標頭"
msgid "AuditStreams|Save external stream destination"
msgstr "儲存外部æµç›®çš„地"
+msgid "AuditStreams|Select events"
+msgstr "é¸å–事件"
+
msgid "AuditStreams|Setup streaming for audit events"
msgstr "為審計事件設置事件æµç¨‹"
@@ -6416,11 +6486,8 @@ msgstr "價值"
msgid "AuditStreams|Verification token"
msgstr "驗證令牌"
-msgid "AuditStreams|Verification token for the %{link} stream"
-msgstr "%{link}串æµçš„驗證令牌"
-
-msgid "AuditStreams|View verification token"
-msgstr "查看驗證令牌"
+msgid "AuditStreams|audit-events"
+msgstr "審核事件"
msgid "AuditStreams|ex: 1000"
msgstr "例如:1000"
@@ -6431,6 +6498,12 @@ msgstr "例如:é™åˆ¶"
msgid "AuditStreams|filtered"
msgstr "éŽæ¿¾"
+msgid "AuditStreams|my-email@my-google-project.iam.gservice.account.com"
+msgstr "my-email@my-google-project.iam.gservice.account.com"
+
+msgid "AuditStreams|my-google-project"
+msgstr "my-google-project"
+
msgid "Aug"
msgstr "8月"
@@ -6968,29 +7041,29 @@ msgstr "計費"
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}"
msgstr "%{group_name} ç›®å‰æ­£åœ¨ä½¿ç”¨ %{plan_name}"
-msgid "BillingPlans|10,000 units of compute per month"
-msgstr "æ¯æœˆ 10,000 個計算單ä½"
+msgid "BillingPlans|10,000 compute minutes per month"
+msgstr "æ¯æœˆ 10,000 分é˜è¨ˆç®—時間"
-msgid "BillingPlans|10000 units of compute"
-msgstr "10000 個計算單ä½"
+msgid "BillingPlans|10000 compute minutes"
+msgstr "10000 計算分é˜"
msgid "BillingPlans|10GB transfer per month"
msgstr "æ¯æœˆ 10GB 傳輸"
-msgid "BillingPlans|400 units of compute"
-msgstr "400 個計算單ä½"
+msgid "BillingPlans|400 compute minutes"
+msgstr "400 計算分é˜"
-msgid "BillingPlans|400 units of compute per month"
-msgstr "æ¯æœˆ 400 個計算單ä½"
+msgid "BillingPlans|400 compute minutes per month"
+msgstr "æ¯æœˆ 400 分é˜è¨ˆç®—時間"
msgid "BillingPlans|5 users per namespace"
msgstr "æ¯å€‹å‘½å空間 5 個使用者"
-msgid "BillingPlans|50,000 units of compute per month"
-msgstr "æ¯æœˆ 50,000 個計算單ä½"
+msgid "BillingPlans|50,000 compute minutes per month"
+msgstr "æ¯æœˆ 50,000 分é˜è¨ˆç®—時間"
-msgid "BillingPlans|50000 units of compute"
-msgstr "50000 個計算單ä½"
+msgid "BillingPlans|50000 compute minutes"
+msgstr "50000 計算分é˜"
msgid "BillingPlans|5GB storage"
msgstr "5GB 存儲空間"
@@ -7160,6 +7233,9 @@ msgstr "支æ´"
msgid "BillingPlans|Talk to an expert today."
msgstr "今天與專案交談。"
+msgid "BillingPlans|Then %{move_link_start}move any projects%{move_link_end} you wish to use with your subscription to that group."
+msgstr "然後,請將您希望與訂閱一起使用的專案%{move_link_start}移動到該群組%{move_link_end}。"
+
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr "使用與其父項目一致的計劃"
@@ -7187,11 +7263,8 @@ msgstr "我們在這裡為您æä¾›å”助"
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
msgstr "雖然 GitLab 將終止使用銅級方案,但您ä»ç„¶å¯ä»¥åœ¨ %{eoa_bronze_plan_end_date} 之å‰å†çºŒè¨‚一次銅級訂閱。我們還æä¾›é™æ™‚å…è²»å‡ç´šåˆ°æˆ‘們的專業方案(最多 25 個使用者)ï¼åœ¨æˆ‘們的 %{announcement_link} 中了解相關變動和優惠的更多訊æ¯ã€‚"
-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 "您還沒加入任何群組。您必須%{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 "您必須%{move_link_start}移動這個專案%{move_link_end}到您其中一個群組。"
+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 your projects to it%{move_link_end}."
+msgstr "您目å‰æ²’有任何群組。您需è¦%{create_group_link_start}建立一個群組%{create_group_link_end},並%{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} 項功能的訪å•æ¬Šé™ã€‚"
@@ -7250,11 +7323,11 @@ msgstr "使用中席次 / 訂閱席次"
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
msgstr "在有效的信用å¡å­˜æª”之å‰ï¼Œç„¡æ³•å•Ÿç”¨å…±ç”¨åŸ·è¡Œå™¨ã€‚"
-msgid "Billings|To use free units of compute 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 "è¦åœ¨å…±äº«çš„執行器上使用å…費的計算單ä½ï¼Œæ‚¨éœ€è¦ä½¿ç”¨ä¿¡ç”¨å¡é©—證您的帳號。如果您ä¸æƒ³æ供信用å¡ä¿¡æ¯ï¼Œæ‚¨å¯ä»¥é‹è¡Œè‡ªå·²çš„執行器並在您的專案中ç¦ç”¨å…±äº«çš„åŸ·è¡Œå™¨ã€‚é€™æ˜¯ç‚ºäº†é˜²æ­¢å’Œæ¸›å°‘å° GitLab 基礎設施的濫用。 %{strongStart}GitLab ä¸æœƒå‘您的信用å¡æ”¶è²»ï¼Œå®ƒåªç”¨æ–¼é©—證您的帳號。%{strongEnd} %{linkStart}了解更多%{linkEnd}。"
+msgid "Billings|To use free compute 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 "為了使用共享執行器上的å…費計算分é˜æ•¸ï¼Œæ‚¨éœ€è¦ä½¿ç”¨ä¿¡ç”¨å¡é©—證您的帳號。如果您ä¸é¡˜æ„æ供信用å¡ï¼Œæ‚¨å¯ä»¥ä½¿ç”¨è‡ªå·±çš„執行器並ç¦ç”¨å°ˆæ¡ˆå…±äº«åŸ·è¡Œå™¨ä¾†é‹è¡Œæµæ°´ç·šã€‚這是為了防止和減少å°GitLab基礎設施的濫用。%{strongStart}GitLabä¸æœƒå‘您的信用å¡æ”¶è²»ï¼Œå®ƒåªæœƒç”¨æ–¼é©—證。%{strongEnd} %{linkStart}了解更多%{linkEnd}。"
-msgid "Billings|To use free units of compute 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 "è¦åœ¨å…±äº«çš„執行器上使用å…費的計算單ä½ï¼Œæ‚¨éœ€è¦ä½¿ç”¨ä¿¡ç”¨å¡é©—è­‰æ‚¨çš„å¸³è™Ÿã€‚é€™æ˜¯ç‚ºäº†é˜²æ­¢å’Œæ¸›å°‘å° GitLab 基礎設施的濫用。 %{strongStart}GitLab ä¸æœƒå‘您的信用å¡æ”¶è²»ï¼Œå®ƒåªç”¨æ–¼é©—證您的帳號。%{strongEnd}"
+msgid "Billings|To use free compute 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 "為了使用共享執行器上的å…費計算分é˜æ•¸ï¼Œæ‚¨éœ€è¦ä½¿ç”¨ä¿¡ç”¨å¡é©—證您的帳號。這是為了防止和減少GitLab基礎設施的濫用。%{strongStart}GitLabä¸æœƒæ”¶å–您的信用å¡è²»ç”¨ï¼Œå®ƒåªæœƒç”¨æ–¼é©—證。%{strongEnd}"
msgid "Billings|User validation required"
msgstr "需è¦ä½¿ç”¨è€…é©—è­‰"
@@ -7265,8 +7338,8 @@ msgstr "驗證帳號"
msgid "Billings|Validate user account"
msgstr "驗證使用者帳號"
-msgid "Billings|You'll now be able to take advantage of free units of compute on shared runners."
-msgstr "您ç¾åœ¨å¯ä»¥ä½¿ç”¨å…±äº«åŸ·è¡Œå™¨ä¸Šçš„å…費計算單元。"
+msgid "Billings|You'll now be able to take advantage of free compute minutes on shared runners."
+msgstr "您ç¾åœ¨å¯ä»¥ä½¿ç”¨å…±äº«åŸ·è¡Œå™¨çš„å…費計算時間。"
msgid "Billings|Your account has been validated"
msgstr "您的帳號已經驗證"
@@ -7556,12 +7629,18 @@ msgstr "建立議題時發生錯誤。請é‡è©¦ã€‚"
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr "建立清單時發生錯誤。請é‡è©¦ã€‚"
+msgid "Boards|An error occurred while fetching board. Please try again."
+msgstr "讀å–看æ¿æ™‚發生錯誤,請é‡è©¦ã€‚"
+
msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr "抓å–å­ç¾¤çµ„時發生錯誤。請é‡è©¦ã€‚"
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr "抓å–群組專案時發生錯誤。請é‡è©¦ã€‚"
+msgid "Boards|An error occurred while fetching groups. Please try again."
+msgstr "æ“·å–群組時發生錯誤。請é‡è©¦ã€‚"
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr "抓å–議題時發生錯誤。請é‡æ–°è¼‰å…¥é é¢ã€‚"
@@ -7623,9 +7702,6 @@ msgstr "展開"
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr "無法抓å–ç¦ç”¨çš„ %{issuableType}"
-msgid "Boards|List actions"
-msgstr "動作清單"
-
msgid "Boards|Move card"
msgstr "移動å¡ç‰‡"
@@ -7683,6 +7759,9 @@ msgstr "載入更多議題"
msgid "Board|Loading epics"
msgstr "正在加載å²è©© (epics) "
+msgid "Bold (%{modifierKey}B)"
+msgstr "ç²—é«” (%{modifierKey})"
+
msgid "Bold text"
msgstr "粗體字"
@@ -8100,21 +8179,30 @@ msgstr "路徑å¯ä»¥åŒ…å«è¬ç”¨å­—元,如 */welcome"
msgid "BroadcastMessages|Red"
msgstr "紅色"
+msgid "BroadcastMessages|Show only to users who have specific roles on groups/project pages"
+msgstr "僅在群組/專案é é¢ä¸Šå…·æœ‰ç‰¹å®šè§’色的使用者顯示"
+
msgid "BroadcastMessages|Show the broadcast message in a command-line interface as a Git remote response"
msgstr "將廣播訊æ¯é¡¯ç¤ºåœ¨å‘½ä»¤åˆ—介é¢ä¸­ï¼Œä½œç‚º Git é ç«¯å›žæ‡‰"
+msgid "BroadcastMessages|Show to all users on all pages"
+msgstr "在所有é é¢ä¸Šå°æ‰€æœ‰ä½¿ç”¨è€…顯示"
+
+msgid "BroadcastMessages|Show to all users on specific matching pages"
+msgstr "在特定符åˆçš„é é¢ä¸Šé¡¯ç¤ºçµ¦æ‰€æœ‰ä½¿ç”¨è€…"
+
msgid "BroadcastMessages|Starts at"
msgstr "開始於"
msgid "BroadcastMessages|Target Path"
msgstr "目標路徑"
+msgid "BroadcastMessages|Target broadcast message"
+msgstr "目標廣播訊æ¯"
+
msgid "BroadcastMessages|Target roles"
msgstr "目標角色"
-msgid "BroadcastMessages|The broadcast message displays only to users in projects and groups who have these roles."
-msgstr "廣播訊æ¯åƒ…顯示在專案和群組中具有這些角色的使用者。"
-
msgid "BroadcastMessages|Theme"
msgstr "主題"
@@ -8349,6 +8437,9 @@ msgstr "按月"
msgid "By quarter"
msgstr "按季度"
+msgid "By using a primary email tied to an Enterprise email address, you acknowledge that this account is an Enterprise User."
+msgstr "使用與ä¼æ¥­é›»å­éƒµä»¶åœ°å€ç›¸é—œè¯çš„主è¦é›»å­éƒµä»¶ï¼Œå³è¡¨ç¤ºè©²å¸³è™Ÿç‚ºä¼æ¥­ä½¿ç”¨è€…。"
+
msgid "By week"
msgstr "按週"
@@ -8842,11 +8933,11 @@ msgstr "變更失敗率"
msgid "Change assignee"
msgstr "變更指派人"
-msgid "Change assignee(s)"
-msgstr "變更指派人"
+msgid "Change assignees"
+msgstr "變更指派"
-msgid "Change assignee(s)."
-msgstr "變更指派人。"
+msgid "Change assignees."
+msgstr "變更指派。"
msgid "Change branches"
msgstr "變更分支"
@@ -8863,12 +8954,12 @@ msgstr "變更里程碑"
msgid "Change path"
msgstr "變更路徑"
-msgid "Change reviewer(s)"
-msgstr "變更審者"
-
-msgid "Change reviewer(s)."
+msgid "Change reviewers"
msgstr "變更審閱者"
+msgid "Change reviewers."
+msgstr "變更審閱者。"
+
msgid "Change role"
msgstr "變更角色"
@@ -8890,8 +8981,11 @@ msgstr "更改工作項類型"
msgid "Change your password"
msgstr "變更您的密碼"
-msgid "Change your password or recover your current one"
-msgstr "變更您的密碼或復原目å‰å¯†ç¢¼"
+msgid "Change your password or recover your current one."
+msgstr "更改您的密碼或æ¢å¾©ç•¶å‰å¯†ç¢¼ã€‚"
+
+msgid "Change your password."
+msgstr "變更您的密碼。"
msgid "ChangeReviewer|All reviewers were removed."
msgstr "已移除所有審閱者。"
@@ -8938,14 +9032,14 @@ msgstr "åˆä½µè«‹æ±‚已開啟,變更將被æ交到%{branchName}。"
msgid "Changed"
msgstr "已更改"
-msgid "Changed assignee(s)."
-msgstr "已變更的指派人"
+msgid "Changed assignees."
+msgstr "變更被指派者。"
msgid "Changed merge method to %{merge_method}"
msgstr "已變更åˆä½µæ–¹æ³•ç‚º %{merge_method}"
-msgid "Changed reviewer(s)."
-msgstr "已變更審閱者。"
+msgid "Changed reviewers."
+msgstr "變更審閱者。"
msgid "Changed squash option to %{squash_option}"
msgstr "已變更壓縮 (Squash) é¸é …為 %{squash_option}"
@@ -8986,9 +9080,6 @@ msgstr "剩餘字元"
msgid "Characters over limit"
msgstr "字數超éŽé™åˆ¶"
-msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr "無法顯示圖表,因為資料請求已超時。%{documentationLink}"
-
msgid "Chat"
msgstr "å³æ™‚通訊"
@@ -9094,8 +9185,8 @@ msgstr "æ¯ä½ä½¿ç”¨è€…æ¯å¹´éœ€è¦ $%{pricePerUserPerYear} 美元"
msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage pack per year"
msgstr "æ¯10 GB儲存空間æ¯å¹´ %{selectedPlanPrice} 美元"
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 units of compute"
-msgstr "æ¯åŒ…1,000個計算單ä½çš„價格為 $%{selectedPlanPrice}"
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 compute minutes"
+msgstr "æ¯åŒ…1,000分é˜è¨ˆç®—時間的價格為$%{selectedPlanPrice}"
msgid "Checkout|%d compute pack"
msgid_plural "Checkout|%d compute packs"
@@ -9107,22 +9198,22 @@ msgstr "以%{lastFourDigits}çµå°¾çš„%{cardType} "
msgid "Checkout|%{name}'s GitLab subscription"
msgstr "%{name} 的 GitLab 訂閱"
+msgid "Checkout|%{name}'s compute minutes"
+msgstr "%{name} 的計算分é˜æ•¸"
+
msgid "Checkout|%{name}'s storage subscription"
msgstr "%{name}訂閱的儲存空間"
-msgid "Checkout|%{name}'s units of compute"
-msgstr "%{name} 的計算單ä½"
-
msgid "Checkout|%{quantity} GB of storage"
msgstr "%{quantity} GB 的儲存空間"
+msgid "Checkout|%{quantity} compute minutes"
+msgstr "%{quantity} 計算分é˜"
+
msgid "Checkout|%{quantity} storage pack"
msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] "%{quantity} 個儲存空間包"
-msgid "Checkout|%{quantity} units of compute"
-msgstr "%{quantity} 計算單元"
-
msgid "Checkout|%{selectedPlanText} plan"
msgstr "%{selectedPlanText} 計劃"
@@ -9162,8 +9253,8 @@ msgstr "城市"
msgid "Checkout|Compute pack"
msgstr "計算包"
-msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional units of compute will roll over month to month and are valid for one year."
-msgstr "計算包僅在您使用完您訂閱的æ¯æœˆé¡åº¦å¾Œä½¿ç”¨ï¼Œé¡å¤–的計算單ä½å°‡æŒçºŒç´¯ç©ä¸¦åœ¨ä¸€å¹´å…§æœ‰æ•ˆã€‚"
+msgid "Checkout|Compute packs are only used after you've used your subscription's monthly quota. The additional compute minutes will roll over month to month and are valid for one year."
+msgstr "僅在您使用完訂閱æ¯æœˆé…é¡å¾Œæ‰æœƒä½¿ç”¨è¨ˆç®—包,é¡å¤–的計算分é˜æ•¸å°‡æœƒç´¯ç©è‡³ä¸‹å€‹æœˆï¼Œä¸¦ä¸”有效期為一年。"
msgid "Checkout|Confirm purchase"
msgstr "確èªè³¼è²·"
@@ -9303,12 +9394,12 @@ msgstr "稅é¡"
msgid "Checkout|Total"
msgstr "總計"
+msgid "Checkout|Total compute minutes: %{quantity}"
+msgstr "總計算分é˜æ•¸ï¼š %{quantity}"
+
msgid "Checkout|Total storage: %{quantity} GB"
msgstr "總儲存空間: %{quantity} GB"
-msgid "Checkout|Total units of compute: %{quantity}"
-msgstr "總計算單ä½ï¼š %{quantity}"
-
msgid "Checkout|Users"
msgstr "使用者"
@@ -9333,8 +9424,8 @@ msgstr "訂閱儲存空間"
msgid "Checkout|company or team"
msgstr "å…¬å¸æˆ–團隊"
-msgid "Checkout|units of compute"
-msgstr "計算單ä½"
+msgid "Checkout|compute minutes"
+msgstr "計算分é˜æ•¸"
msgid "Checkout|x %{quantity} %{units} per pack"
msgstr "x %{quantity} %{units} æ¯åŒ…"
@@ -9381,6 +9472,9 @@ msgstr "é¸æ“‡é¡žåž‹..."
msgid "Choose file…"
msgstr "é¸æ“‡æ–‡ä»¶â€¦"
+msgid "Choose protected branch"
+msgstr "é¸å–å—ä¿è­·çš„分支"
+
msgid "Choose the top-level group for your repository imports."
msgstr "é¸æ“‡ç‰ˆæœ¬åº«åŒ¯å…¥çš„最上層群組。"
@@ -9408,16 +9502,16 @@ msgstr "Ci é…置已經存在"
msgid "CiCatalog|About this project"
msgstr "關於這個專案"
+msgid "CiCatalog|CI/CD Catalog"
+msgstr "CI/CD 目錄"
+
msgid "CiCatalog|CI/CD Catalog resource"
msgstr "CD 目錄資æº"
-msgid "CiCatalog|CI/CD catalog"
-msgstr "CI/CD 目錄"
-
msgid "CiCatalog|Create a pipeline component repository and make reusing pipeline configurations faster and easier."
msgstr "建立æµæ°´ç·šå…ƒä»¶ç‰ˆæœ¬åº«ï¼Œä½¿é‡è¤‡ä½¿ç”¨æµæ°´ç·šé…置更快更簡單。"
-msgid "CiCatalog|Get started with the CI/CD catalog"
+msgid "CiCatalog|Get started with the CI/CD Catalog"
msgstr "開始使用 CI/CD 目錄"
msgid "CiCatalog|Go to the project"
@@ -9432,6 +9526,9 @@ msgstr "將專案標示為 CI/CD 目錄資æº"
msgid "CiCatalog|Mark project as a CI/CD Catalog resource. %{linkStart}What is the CI/CD Catalog?%{linkEnd}"
msgstr "將專案標示為 CI/CD 目錄資æºï¼Œ%{linkStart}什麼是 CI/CD 目錄?%{linkEnd}"
+msgid "CiCatalog|No release available"
+msgstr "沒有å¯ç”¨çš„發布版本"
+
msgid "CiCatalog|Page %{currentPage} of %{totalPage}"
msgstr "第 %{currentPage} é ï¼Œå…± %{totalPage} é ã€‚"
@@ -9459,6 +9556,9 @@ msgstr "該專案ç¾åœ¨æ˜¯ CI/CD 目錄資æºã€‚"
msgid "CiCatalog|This project will be marked as a CI/CD Catalog resource and will be visible in the CI/CD Catalog. This action is not reversible."
msgstr "這個專案將被標示為 CI/CD 目錄資æºï¼Œä¸¦ä¸”會在 CI/CD 目錄中å¯è¦‹ï¼Œé€™å€‹æ“作是ä¸å¯é€†çš„。"
+msgid "CiCatalog|Unreleased"
+msgstr "未發布"
+
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr "我們希望å”助您建立與管ç†æµæ°´ç·šå…ƒä»¶ç‰ˆæœ¬åº«ï¼ŒåŒæ™‚é‚„å¯ä»¥æ›´è¼•é¬†åœ°é‡ç”¨æµæ°´ç·šé…置,讓我們知é“我們的表ç¾å¦‚何ï¼"
@@ -9829,6 +9929,9 @@ msgstr "將此議題(issue)複製到 %{project},ä¸å«è©•è«–/留言。"
msgid "Close"
msgstr "關閉"
+msgid "Close %{issuableType}"
+msgstr "關閉%{issuableType}"
+
msgid "Close %{issueType}"
msgstr "關閉%{issueType}"
@@ -9886,6 +9989,9 @@ msgstr "關閉此%{quick_action_target}."
msgid "Closes this issue. Marks as related to, and a duplicate of, %{duplicate_reference}."
msgstr "關閉此議題。標記為與 %{duplicate_reference} 相關並é‡è¤‡ã€‚"
+msgid "Closing %{issuableType}..."
+msgstr "關閉 %{issuableType}..."
+
msgid "Cloud Run"
msgstr "雲端執行"
@@ -10478,9 +10584,6 @@ msgstr "Kuberneteså¢é›†é›†æˆçš„進階é¸é …"
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr "å…許GitLab管ç†æ­¤å¢é›†çš„命å空間和æœå‹™è³¬æˆ¶ã€‚"
-msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
-msgstr "å…許 GitLab 查詢特定é…置的å¢é›†å…§å»º Prometheus,以ç²å–指標。"
-
msgid "ClusterIntegration|Amazon EKS"
msgstr "Amazon EKS"
@@ -10565,9 +10668,6 @@ msgstr "你是å¦çž­è§£ï¼Ÿ"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr "Elastic Kubernetes Service(EKS)"
-msgid "ClusterIntegration|Enable Prometheus integration"
-msgstr "å¢é›†æ•´åˆ|啟用 Prometheus æ•´åˆ"
-
msgid "ClusterIntegration|Enable or disable GitLab's connection to your Kubernetes cluster."
msgstr "啟用或åœç”¨GitLab與Kuberneteså¢é›†çš„連接。"
@@ -10628,9 +10728,6 @@ msgstr "å·²ç¦ç”¨æ•´åˆ"
msgid "ClusterIntegration|Integration enabled"
msgstr "å¢é›†æ•´åˆ|已啟用整åˆ"
-msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr "æ•´åˆå…許您使用安è£åœ¨å¢é›†ä¸­çš„應用程åºä½œç‚º GitLab 工作æµç¨‹çš„一部分。"
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr "正在建立Kuberneteså¢é›†..."
@@ -10874,6 +10971,9 @@ msgstr "將使用者和群組指定為特定文件更改的核准者。"
msgid "CodeOwners|Code owners"
msgstr "程å¼ç¢¼æ“有者"
+msgid "CodeOwners|Code owners are users and groups that can approve specific file changes."
+msgstr "程å¼ç¢¼æ‰€æœ‰è€…是å¯ä»¥æ ¸å‡†ç‰¹å®šæ–‡ä»¶æ›´æ”¹çš„使用者和群組。"
+
msgid "CodeOwners|Hide all"
msgstr "éš±è—全部"
@@ -10919,6 +11019,12 @@ msgstr "開啟此執行個體的程å¼ç¢¼å»ºè­°ï¼Œé€šéŽå•Ÿç”¨æ­¤åŠŸèƒ½ï¼Œæ‚¨ï¼š
msgid "CodeSuggestionsSM|Your personal access token from GitLab.com. See the %{link_start}documentation%{link_end} for information on creating a personal access token."
msgstr "您來自 GitLab.com 的個人存å–令牌。有關建立個人存å–令牌的訊æ¯ï¼Œè«‹åƒé–± %{link_start}文件%{link_end}。"
+msgid "CodeSuggestionsThirdPartyAlert|%{code_suggestions_link_start}Code Suggestions%{link_end} now uses third-party AI services to provide higher quality suggestions. You can %{third_party_link_start}disable third-party services%{link_end} for your group, or disable Code Suggestions entirely in %{profile_settings_link_start}your user profile%{link_end}."
+msgstr "%{code_suggestions_link_start}Code Suggestions(程å¼ç¢¼å»ºè­°ï¼‰%{link_end} ç¾åœ¨ä½¿ç”¨ç¬¬ä¸‰æ–¹ AI æœå‹™æ供更高å“質的建議。您å¯ä»¥åœ¨æ‚¨çš„群組中 %{third_party_link_start}ç¦ç”¨ç¬¬ä¸‰æ–¹æœå‹™%{link_end},或在 %{profile_settings_link_start}您的使用者設定檔%{link_end} 中完全åœç”¨ Code Suggestions。"
+
+msgid "CodeSuggestionsThirdPartyAlert|We use third-party AI services to improve Code Suggestions."
+msgstr "我們使用第三方 AI æœå‹™ä¾†æ”¹é€²ç¨‹å¼ç¢¼å»ºè­°åŠŸèƒ½ã€‚"
+
msgid "CodeSuggestions|%{link_start}What are code suggestions?%{link_end}"
msgstr "%{link_start}什麼是程å¼ç¢¼å»ºè­°ï¼Ÿ%{link_end}"
@@ -10934,11 +11040,8 @@ msgstr "在您的整åˆé–‹ç™¼ç’°å¢ƒï¼ˆIDE)中編寫程å¼ç¢¼æ™‚,å¯ä»¥ç²å¾—
msgid "CodeSuggestions|Projects in this group can use Code Suggestions"
msgstr "該群組中的專案å¯ä»¥ä½¿ç”¨ç¨‹å¼ç¢¼å»ºè­°"
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}"
-msgstr "å—%{link_start}測試使用æ¢æ¬¾%{link_end}çš„ç´„æŸ"
-
-msgid "CodeSuggestions|Subject to the %{link_start}Testing Terms of Use%{link_end}."
-msgstr "å—%{link_start}測試使用æ¢æ¬¾%{link_end}ç´„æŸã€‚"
+msgid "CodeSuggestions|Subject to the %{terms_link_start}Testing Terms of Use%{link_end}. Code Suggestions currently uses third-party AI services unless those are %{third_party_features_link_start}disabled%{link_end}."
+msgstr "å— %{terms_link_start}測試使用æ¢æ¬¾%{link_end} çš„ç´„æŸã€‚é™¤éž %{third_party_features_link_start} 被åœç”¨%{link_end},å¦å‰‡ç¨‹å¼ç¢¼å»ºè­°ç›®å‰ä½¿ç”¨ç¬¬ä¸‰æ–¹ AI æœå‹™ã€‚"
msgid "Cohorts|Inactive users"
msgstr "未啟用的使用者"
@@ -11033,15 +11136,24 @@ msgstr "全域指令"
msgid "CommandPalette|Pages"
msgstr "é é¢"
-msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user or perform generic search..."
-msgstr "請輸入 %{commandHandle} 以執行指令,%{userHandle} 以指定使用者,或進行一般æœå°‹..."
+msgid "CommandPalette|Project files"
+msgstr "專案檔案"
-msgid "CommandPalette|Users"
-msgstr "使用者"
+msgid "CommandPalette|Type %{commandHandle} for command, %{userHandle} for user, %{projectHandle} for project, %{pathHandle} for project file, or perform generic search..."
+msgstr "輸入 %{commandHandle} 用於指令,輸入 %{userHandle} 用於使用者,輸入 %{projectHandle} 用於專案,輸入 %{pathHandle} 用於專案檔案,或進行一般æœå°‹..."
msgid "CommandPalette|command"
msgstr "指令 (Command)"
+msgid "CommandPalette|go to project file"
+msgstr "å‰å¾€å°ˆæ¡ˆæª”案"
+
+msgid "CommandPalette|issue (enter at least 3 chars)"
+msgstr "命令Paletteå•é¡Œï¼ˆè‡³å°‘輸入 3 個字符)"
+
+msgid "CommandPalette|project (enter at least 3 chars)"
+msgstr "命令Palette專案(至少輸入 3 個字符)"
+
msgid "CommandPalette|user (enter at least 3 chars)"
msgstr "使用者(至少輸入 3 個字元)"
@@ -11133,18 +11245,12 @@ msgstr "æ交已刪除"
msgid "Commit message"
msgstr "æ交訊æ¯"
-msgid "Commit message (optional)"
-msgstr "æ交訊æ¯ï¼ˆé¸å¡«ï¼‰"
-
msgid "Commit message generated by AI"
msgstr "AI 生æˆçš„æ交訊æ¯"
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
msgstr "æ交統計 %{ref} %{start_time} - %{end_time}"
-msgid "Commit to %{branchName} branch"
-msgstr "æ交到 %{branchName} 分支"
-
msgid "CommitBoxTitle|Commit"
msgstr "æ交"
@@ -11271,15 +11377,30 @@ msgstr "沒有å¯ä»¥æ¯”較的。"
msgid "CompareRevisions|Branches"
msgstr "比較修訂|分支"
+msgid "CompareRevisions|Changes are shown as if the %{boldStart}source%{boldEnd} revision was being merged into the %{boldStart}target%{boldEnd} revision. %{linkStart}Learn more about comparing revisions.%{linkEnd}"
+msgstr "比較修訂版變更顯示為 %{boldStart}æº%{boldEnd} 修訂版已åˆä½µåˆ° %{boldStart}目標%{boldEnd} 修訂版。 %{linkStart}了解有關比較修訂版本的更多信æ¯ã€‚%{linkEnd}"
+
+msgid "CompareRevisions|Commits on Source (%{commits_amount})"
+msgstr "比較修訂版æäº¤æº (%{commits_amount})"
+
msgid "CompareRevisions|Compare"
msgstr "比較修訂|比較"
+msgid "CompareRevisions|Compare revisions"
+msgstr "比較修訂版本"
+
msgid "CompareRevisions|Create merge request"
msgstr "比較修訂|建立åˆä½µè«‹æ±‚"
msgid "CompareRevisions|Filter by Git revision"
msgstr "比較修訂|ä¾ç…§ Git 版本進行篩é¸"
+msgid "CompareRevisions|Include changes to target since source was created"
+msgstr "包括自從來æºå»ºç«‹ä»¥ä¾†çš„目標變更"
+
+msgid "CompareRevisions|Only incoming changes from source"
+msgstr "åªæŽ¥å—來自來æºçš„變更"
+
msgid "CompareRevisions|Select Git revision"
msgstr "比較修訂|é¸æ“‡ Git 版本"
@@ -11289,6 +11410,12 @@ msgstr "比較修訂|é¸æ“‡åˆ†æ”¯/標籤"
msgid "CompareRevisions|Select target project"
msgstr "比較修訂|é¸æ“‡ç›®æ¨™å°ˆæ¡ˆ"
+msgid "CompareRevisions|Show changes"
+msgstr "顯示變更"
+
+msgid "CompareRevisions|Swap"
+msgstr "交æ›"
+
msgid "CompareRevisions|Swap revisions"
msgstr "比較修訂|交æ›ç‰ˆæœ¬"
@@ -11325,11 +11452,14 @@ msgstr "已完æˆ"
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
msgstr "在 %{duration_seconds} 秒內完æˆï¼ˆ%{relative_time})"
-msgid "Compliance Report|Export as CSV"
-msgstr "匯出為 CSV"
+msgid "Compliance Report|Export frameworks as CSV. You will be emailed after the export is processed."
+msgstr "將框架導出為 CSV。導出處ç†å®Œæˆå¾Œï¼Œæ‚¨å°‡æ”¶åˆ°é›»å­éƒµä»¶ã€‚"
+
+msgid "Compliance Report|Export full report as CSV"
+msgstr "將完整報告導出為 CSV"
-msgid "Compliance Report|Export frameworks as CSV. You will be emailed after export is processed."
-msgstr "將框架匯出為 CSV,匯出處ç†å®Œæˆå¾Œï¼Œæ‚¨å°‡æ”¶åˆ°é›»å­éƒµä»¶ã€‚"
+msgid "Compliance Report|Export merge request violations as CSV. You will be emailed after the export is processed."
+msgstr "å°‡åˆä½µè«‹æ±‚é•è¦å°Žå‡ºç‚º CSV。導出處ç†å®Œæˆå¾Œï¼Œæ‚¨å°‡æ”¶åˆ°é›»å­éƒµä»¶ã€‚"
msgid "Compliance Report|Frameworks"
msgstr "框架"
@@ -11526,6 +11656,9 @@ msgstr "少於 2 個核准人"
msgid "ComplianceReport|No projects found"
msgstr "未找到專案"
+msgid "ComplianceReport|No projects found that match filters"
+msgstr "找ä¸åˆ°ç¬¦åˆç¯©é¸æ¢ä»¶çš„專案"
+
msgid "ComplianceReport|No violations found"
msgstr "未發ç¾é•è¦è¡Œç‚º"
@@ -11571,15 +11704,15 @@ msgstr "å°šæœªæ”¯æ´ â€œ%s†元件類型"
msgid "Components must have a 'name'"
msgstr "元件必須有一個“å稱â€"
+msgid "Compute minutes"
+msgstr "計算分é˜æ•¸"
+
msgid "Compute quota"
msgstr "計算é¡åº¦"
msgid "Compute quota:"
msgstr "計算é¡åº¦ï¼š"
-msgid "Confidence"
-msgstr "å¯ä¿¡åº¦"
-
msgid "Confidential"
msgstr "機密"
@@ -11634,9 +11767,6 @@ msgstr "設定 Gitaly 逾時時間。"
msgid "Configure Integrations"
msgstr "æ•´åˆè¨­å®š"
-msgid "Configure Prometheus"
-msgstr "設定 Promethes"
-
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 "使用 GitLab 所管ç†çš„範本在「.gitlab-ci.ymlã€ä¸­é…ç½® SAST IaC。您å¯ä»¥[添加變é‡è¦†å¯«](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) 來自定義 SAST IaC 設置。"
@@ -11673,9 +11803,6 @@ msgstr "設定進階權é™ã€å¤§æ–‡ä»¶å­˜å„²ã€é›™å› å­èªè­‰å’Œå®¢æˆ¶é—œä¿‚設
msgid "Configure custom rules for Jira issue key matching"
msgstr "為 Jira è­°é¡ŒéµåŒ¹é…設定自定義è¦å‰‡"
-msgid "Configure existing installation"
-msgstr "設定ç¾æœ‰å®‰è£"
-
msgid "Configure pipeline"
msgstr "æµæ°´ç·šè¨­å®š"
@@ -11838,15 +11965,9 @@ msgstr "正在連線到é ç«¯ç’°å¢ƒ..."
msgid "Connecting..."
msgstr "正在連線..."
-msgid "Connection failed"
-msgstr "連線失敗"
-
msgid "Connection failure"
msgstr "連線失敗"
-msgid "Connection timed out"
-msgstr "連線逾時"
-
msgid "Consistency guarantee method"
msgstr "一致性ä¿éšœæ–¹æ³•"
@@ -12231,9 +12352,6 @@ msgstr "內容"
msgid "Content parsed with %{link}."
msgstr "%{link}解æžçš„內容。"
-msgid "ContentEditor|For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr "é‡å° %{quickActionsDocsLinkStart}快速æ“作 %{quickActionsDocsLinkEnd},請輸入 %{keyboardStart}/%{keyboardEnd}。"
-
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr "您必須æä¾› renderMarkdown 函數或自定義åºåˆ—化程åº"
@@ -12357,6 +12475,39 @@ msgstr "è¦è¨ˆç®—的資料太多。請嘗試é™ä½Žåœ¨æ´žå¯Ÿå ±å‘Šè¨­å®šæª”中的
msgid "ContributionAnalytics|Total Contributions"
msgstr "總體貢ç»"
+msgid "ContributionEvent|Approved merge request %{targetLink} in %{resourceParentLink}."
+msgstr "已核准 %{resourceParentLink} 中的 %{targetLink} åˆä½µè«‹æ±‚。"
+
+msgid "ContributionEvent|Deleted branch %{refLink} in %{resourceParentLink}."
+msgstr "刪除了 %{resourceParentLink} 中的 %{refLink} 分支。"
+
+msgid "ContributionEvent|Deleted tag %{refLink} in %{resourceParentLink}."
+msgstr "已刪除 %{resourceParentLink} 中的 %{refLink} 標籤。"
+
+msgid "ContributionEvent|Joined project %{resourceParentLink}."
+msgstr "已加入專案 %{resourceParentLink}。"
+
+msgid "ContributionEvent|Left project %{resourceParentLink}."
+msgstr "已離開專案 %{resourceParentLink}。"
+
+msgid "ContributionEvent|Pushed a new branch %{refLink} in %{resourceParentLink}."
+msgstr "在 %{resourceParentLink} 中推é€äº†ä¸€å€‹æ–°çš„ %{refLink} 分支。"
+
+msgid "ContributionEvent|Pushed a new tag %{refLink} in %{resourceParentLink}."
+msgstr "在 %{resourceParentLink} 中推é€äº†ä¸€å€‹æ–°çš„ %{refLink} 標籤 。"
+
+msgid "ContributionEvent|Pushed to branch %{refLink} in %{resourceParentLink}."
+msgstr "在 %{resourceParentLink} 中推é€äº†ä¸€å€‹æ–°çš„ %{refLink} 分支。"
+
+msgid "ContributionEvent|Pushed to tag %{refLink} in %{resourceParentLink}."
+msgstr "在 %{resourceParentLink} 中推é€äº†ä¸€å€‹æ–°çš„ %{refLink} 標籤 。"
+
+msgid "ContributionEvent|Removed due to membership expiration from %{resourceParentLink}."
+msgstr "因為æˆå“¡è³‡æ ¼éŽæœŸè€Œè¢«å¾ž %{resourceParentLink} 移除。"
+
+msgid "ContributionEvent|…and %{count} more commits. %{linkStart}Compare%{linkEnd}."
+msgstr "…和%{count}更多æ交,%{linkStart}比較%{linkEnd}。"
+
msgid "Contributions for %{calendar_date}"
msgstr "%{calendar_date}çš„è²¢ç»"
@@ -12486,9 +12637,6 @@ msgstr "複製連çµ"
msgid "Copy link URL"
msgstr "複製éˆçµ URL"
-msgid "Copy link to chart"
-msgstr "å°‡éˆçµè¤‡è£½åˆ°åœ–表"
-
msgid "Copy merge request URL"
msgstr "複製åˆä½µè«‹æ±‚ URL"
@@ -12654,6 +12802,9 @@ msgstr "無法刪除觸發器。"
msgid "Could not restore the group"
msgstr "無法還原群組"
+msgid "Could not retrieve the list of protected branches. Use the YAML editor mode, or refresh this page later. To view the list of protected branches, go to %{boldStart}Settings - Branches%{boldEnd} and expand %{boldStart}Protected branches%{boldEnd}."
+msgstr "無法擷å–å—ä¿è­·åˆ†æ”¯çš„清單,請使用YAML編輯器模å¼ï¼Œæˆ–ç¨å¾Œé‡æ–°æ•´ç†æ­¤é é¢ã€‚è‹¥è¦æŸ¥çœ‹å—ä¿è­·åˆ†æ”¯çš„清單,請å‰å¾€%{boldStart}設定 - 分支%{boldEnd},並展開%{boldStart}å—ä¿è­·åˆ†æ”¯%{boldEnd}。"
+
msgid "Could not revoke access token %{access_token_name}."
msgstr "無法撤消訪å•ä»¤ç‰Œ %{access_token_name}。"
@@ -12708,9 +12859,6 @@ msgstr "建立 %{environment}"
msgid "Create %{humanized_resource_name}"
msgstr "建立 %{humanized_resource_name}"
-msgid "Create %{type}"
-msgstr "建立 %{type}"
-
msgid "Create %{workspace} label"
msgstr "建立 %{workspace} 標籤"
@@ -12753,6 +12901,9 @@ msgstr "建立一個新分支"
msgid "Create a new file as there are no files yet. Afterwards, you'll be able to commit your changes."
msgstr "ç›®å‰å°šç„¡æ–‡ä»¶ï¼Œè«‹å…ˆå»ºç«‹ä¸€å€‹æ–°æ–‡ä»¶ï¼Œç„¶å¾Œæ‚¨å°‡èƒ½å¤ æ交您的變更。"
+msgid "Create a new fork"
+msgstr "å»ºç«‹ä¸€å€‹æ–°çš„åˆ†å‰ (fork)"
+
msgid "Create a new issue"
msgstr "建立新議題"
@@ -13038,6 +13189,9 @@ msgstr "è­°é¡Œ(issue)階段çµæŸ"
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
msgstr "最大長度 %{maxLength} 個字元"
+msgid "CreateValueStreamForm|Minimum length %{minLength} characters"
+msgstr "建立價值æµè¡¨å–®æœ€å°é•·åº¦ %{minLength} 字符"
+
msgid "CreateValueStreamForm|Name is required"
msgstr "å稱為必填"
@@ -13182,9 +13336,6 @@ msgstr "建立"
msgid "Creating epic"
msgstr "正在建​立å²è©© (epic)"
-msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
-msgstr "正在使用Prometheus伺æœå™¨ä¸­çš„資料建立圖表。如果這需è¦å¾ˆé•·æ™‚間,請確ä¿è³‡æ–™å¯ç”¨ã€‚"
-
msgid "Creator"
msgstr "建立者"
@@ -14403,6 +14554,12 @@ msgstr "解壓縮檔案大å°é©—證失敗。"
msgid "Decrease"
msgstr "減少"
+msgid "Decrement suggestion line end"
+msgstr "減少建議行çµæŸ"
+
+msgid "Decrement suggestion line start"
+msgstr "減少建議行開始"
+
msgid "Default - Never run"
msgstr "é è¨­ - ä¸åŸ·è¡Œ"
@@ -14666,6 +14823,9 @@ msgstr "刪除變數"
msgid "Delete video"
msgstr "刪除影åƒ"
+msgid "DeleteProject|Failed to remove design repository. Please try again or contact administrator."
+msgstr "無法刪除設計存儲庫。請é‡è©¦æˆ–è¯ç¹«ç®¡ç†å“¡ã€‚"
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr "移除事件失敗。請é‡è©¦æˆ–è¯ç¹«ç®¡ç†å“¡ã€‚"
@@ -14778,6 +14938,12 @@ msgid "Dependencies|%d vulnerability detected"
msgid_plural "Dependencies|%d vulnerabilities detected"
msgstr[0] "åµæ¸¬åˆ° %d 個æ¼æ´ž"
+msgid "Dependencies|%{locationCount} locations"
+msgstr "%{locationCount} ä½ç½®"
+
+msgid "Dependencies|%{projectCount} projects"
+msgstr "%{projectCount} 專案"
+
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr "其餘%{remainingLicensesCount}項"
@@ -14820,9 +14986,15 @@ msgstr "ä½ç½®å’Œä¾è³´è·¯å¾‘"
msgid "Dependencies|Packager"
msgstr "å°è£å·¥å…·"
+msgid "Dependencies|Projects"
+msgstr "專案"
+
msgid "Dependencies|Software Bill of Materials (SBOM) based on the %{linkStart}latest successful%{linkEnd} scan"
msgstr "基於%{linkStart}最新æˆåŠŸ%{linkEnd}掃æ的軟體物料清單 (SBOM)"
+msgid "Dependencies|Software Bill of Materials (SBOM) based on the latest successful scan of each project."
+msgstr "基於æ¯å€‹å°ˆæ¡ˆæœ€æ–°æˆåŠŸæŽƒæ的軟體物料清單(SBOM)。"
+
msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again."
msgstr "%{codeStartTag}dependency_scanning%{codeEndTag} 作業失敗,無法生æˆåˆ—表。請確ä¿ä½œæ¥­æ­£å¸¸åŸ·è¡Œä¸¦é‡å•Ÿæµæ°´ç·šã€‚"
@@ -14856,6 +15028,9 @@ msgstr "ä¸æ”¯æ´ä¾è³´éˆ"
msgid "Dependency list"
msgstr "ä¾è³´é …列表"
+msgid "DependencyProxy|%{docLinkStart}See the documentation%{docLinkEnd} for other ways to store Docker images in Dependency Proxy cache."
+msgstr "%{docLinkStart}有關將docker映åƒå„²å­˜åœ¨ä¾è³´é …代ç†ç·©å­˜ä¸­çš„其他方法,請åƒè¦‹æ–‡æª”%{docLinkEnd}。"
+
msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr "所有快å–緩存中的項目將被列入刪除排程"
@@ -14874,6 +15049,9 @@ msgstr "在設定中é…ç½®"
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
msgstr "åŒ…å« %{count} 個映åƒå¡Šï¼ˆ%{size})"
+msgid "DependencyProxy|Copy example"
+msgstr "複製範例"
+
msgid "DependencyProxy|Copy image path"
msgstr "複製映åƒè·¯å¾‘"
@@ -14898,6 +15076,9 @@ msgstr "啟用ä¾è³´ä»£ç†å’Œè¨­å®šæ¸…除快å–。"
msgid "DependencyProxy|Image list"
msgstr "映åƒæª”清單"
+msgid "DependencyProxy|Pull image by digest example"
+msgstr "é€éŽæ‘˜è¦ç¯„例拉å–映åƒ"
+
msgid "DependencyProxy|Scheduled for deletion"
msgstr "é å®šåˆªé™¤"
@@ -14907,6 +15088,9 @@ msgstr "å¿«å–中沒有映åƒæª”"
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
msgstr "欲查看映åƒæª”å‰ç¶´å’Œå¿«å–中的內容,請å‰å¾€ %{linkStart} ä¾è³´æ€§ä»£ç†ä¼ºæœå™¨ %{linkEnd}"
+msgid "DependencyProxy|To store docker images in Dependency Proxy cache, pull an image by tag in your %{codeStart}.gitlab-ci.yml%{codeEnd} file. In this example, the image is %{codeStart}alpine:latest%{codeEnd}"
+msgstr "è¦å°‡ docker 映åƒå„²å­˜åœ¨ä¾è³´ä»£ç†ç·©å­˜ä¸­ï¼Œè«‹æŒ‰ %{codeStart}.gitlab-ci.yml%{codeEnd} 文件中的標籤拉å–映åƒã€‚在此示例中,映åƒç‚º %{codeStart}alpine:latest%{codeEnd}"
+
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
msgstr "å•Ÿç”¨å¾Œï¼Œè¶…éŽ 90 天的映åƒæª”將從快å–中移除。"
@@ -15216,9 +15400,6 @@ msgstr "維é‹äººå“¡"
msgid "DeploymentApprovals|Set how approval rules are applied to deployments in protected environments."
msgstr "設定核准è¦å‰‡å¦‚何套用於å—ä¿è­·ç’°å¢ƒä¸­çš„部署。"
-msgid "DeploymentApprovals|When a pipeline runs, deployment jobs will automatically be approved in the pipeline if the triggerer is allowed to approve."
-msgstr "當æµæ°´ç·šåŸ·è¡Œæ™‚,若å…許觸發者核准,部署作業將在æµæ°´ç·šä¸­è‡ªå‹•å–得核准。"
-
msgid "DeploymentApproval| Current approvals: %{current}"
msgstr "ç›®å‰æ ¸å‡†ï¼š%{current}"
@@ -15370,12 +15551,6 @@ msgstr "æˆåŠŸ"
msgid "Deprecated API rate limits"
msgstr "已棄用的 API 速率é™åˆ¶"
-msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
-msgstr "關於å¯èƒ½æ›¿æ›çš„訊æ¯ï¼Œ%{epicStart}瞭解更多關於 Opstrace %{epicEnd}。"
-
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
-msgstr "指標功能在 GitLab 14.7 中已棄用。"
-
msgid "Deprioritize label"
msgstr "å–消優先標記"
@@ -15385,9 +15560,6 @@ msgstr "æ述變更的目的以åŠè©•å¯©äººå“¡æ‡‰æ³¨æ„的事項。"
msgid "Description"
msgstr "æè¿°"
-msgid "Description (alt text)"
-msgstr "æè¿° (替代文字)"
-
msgid "Description (optional)"
msgstr "æ述(å¯é¸ï¼‰"
@@ -16131,8 +16303,8 @@ msgstr "æˆåŠŸé©—證網域所有權"
msgid "DomainVerification|The following domains are configured for projects in this group. Users with email addresses that match a verified domain do not need to confirm their account."
msgstr "已為該群組中的專案設定以下網域,電å­éƒµä»¶åœ°å€ç¬¦åˆå·²é©—證網域的使用者無需確èªå…¶å¸³è™Ÿã€‚"
-msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration. %{link_to_help}"
-msgstr "為了驗證您å°æ–¼ç¶²åŸŸå的所有權,請將上述金鑰新增為您 DNS 設定中的 TXT 記錄。%{link_to_help}"
+msgid "DomainVerification|To verify ownership of your domain, add the above key to a TXT record within your DNS configuration within seven days. %{link_to_help}"
+msgstr "為了驗證您的網域å稱所有權,請在七天內將上述金鑰添加到您DNSé…置的TXT記錄中。%{link_to_help}"
msgid "Don't have a group?"
msgstr "沒有群組?"
@@ -16176,15 +16348,15 @@ msgstr "下載(%{fileSizeReadable})"
msgid "Download (%{size})"
msgstr "下載(%{size})"
-msgid "Download CSV"
-msgstr "下載CSV"
-
msgid "Download PDF"
msgstr "下載 PDF"
msgid "Download artifacts"
msgstr "下載產物"
+msgid "Download artifacts archive"
+msgstr "下載產物存檔"
+
msgid "Download codes"
msgstr "下載程å¼ç¢¼"
@@ -16470,6 +16642,9 @@ msgstr "編輯公共部署金鑰"
msgid "Edit sidebar"
msgstr "編輯å´é‚Šæ¬„"
+msgid "Edit single file"
+msgstr "編輯單一檔案"
+
msgid "Edit table"
msgstr "編輯表"
@@ -16575,6 +16750,9 @@ msgstr "無法發é€é›»å­éƒµä»¶"
msgid "Email display name"
msgstr "é›»å­éƒµä»¶é¡¯ç¤ºå稱"
+msgid "Email must be provided."
+msgstr "å¿…é ˆæ供電å­éƒµä»¶ã€‚"
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr "é›»å­éƒµä»¶æœªé©—證。請在Salesforce中驗證您的電å­éƒµä»¶ã€‚"
@@ -16911,9 +17089,6 @@ msgstr "å°æ‰€æœ‰ä½¿ç”¨è€…登入強制執行雙因å­èªè­‰ã€‚"
msgid "Enhance security by storing service account keys in secret managers - learn more about %{docLinkStart}secret management with GitLab%{docLinkEnd}"
msgstr "通éŽå°‡æœå‹™å¸³è™Ÿé‡‘鑰存儲在 secret 管ç†å™¨ä¸­ä¾†å¢žå¼·å®‰å…¨æ€§ - 瞭解更多關於 %{docLinkStart}使用 GitLab%{docLinkEnd} 進行 secret 管ç†çš„訊æ¯"
-msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
-msgstr "確ä¿å¾žGitLabæœå‹™å™¨åˆ°Prometheusæœå‹™å™¨çš„連接"
-
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr "如需追蹤到å¢é›†çš„部署,請確ä¿æ‚¨çš„%{linkStart}環境包å«æ–¼CIæµæ°´ç·šçš„部署階段%{linkEnd}。"
@@ -16974,9 +17149,6 @@ msgstr "輸入來自雙因å­èº«ä»½é©—證器應用程å¼çš„驗證碼,如果您
msgid "Enter the following to confirm:"
msgstr "輸入以下內容進行確èªï¼š"
-msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr "輸入您的應用程å¼çš„å稱,我們將回傳一個唯一的 %{type}。"
-
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr "輸入秒數或其他人類å¯è®€çš„輸入,例如\"1 å°æ™‚\"。此逾時優先於為專案所設定的較低逾時。"
@@ -17004,17 +17176,20 @@ msgstr "輸入核准密碼"
msgid "Enterprise"
msgstr "ä¼æ¥­"
+msgid "Enterprise User"
+msgstr "ä¼æ¥­ä½¿ç”¨è€…"
+
+msgid "Enterprise User Account on GitLab"
+msgstr "GitLab 上的ä¼æ¥­ä½¿ç”¨è€…帳號"
+
msgid "EnterpriseUsers|The user detail cannot be updated"
msgstr "無法更新使用者詳細資訊"
msgid "EnterpriseUsers|The user does not match the \"Enterprise User\" definition for the group"
msgstr "使用者與群組的「ä¼æ¥­ä½¿ç”¨è€…ã€å®šç¾©ä¸ç›¸ç¬¦"
-msgid "EnterpriseUsers|The user is already an enterprise user"
-msgstr "使用者已是ä¼æ¥­ä½¿ç”¨è€…"
-
-msgid "EnterpriseUsers|The user is not a member of the group"
-msgstr "該使用者ä¸æ˜¯è©²ç¾¤çµ„çš„æˆå“¡"
+msgid "EnterpriseUsers|The user is already an enterprise user of the group"
+msgstr "該使用者已經是群組的ä¼æ¥­ä½¿ç”¨è€…"
msgid "Environment"
msgstr "環境"
@@ -17178,9 +17353,6 @@ msgstr "GitLab 代ç†"
msgid "Environments|Job"
msgstr "作業"
-msgid "Environments|Learn about environments"
-msgstr "了解環境"
-
msgid "Environments|Learn more about stopping environments"
msgstr "了解更多關於如何終止環境的訊æ¯"
@@ -17193,9 +17365,6 @@ msgstr "新建環境"
msgid "Environments|New environment"
msgstr "建立環境"
-msgid "Environments|No deployed environments"
-msgstr "沒有已部署的環境"
-
msgid "Environments|No deployments yet"
msgstr "未部署"
@@ -17391,12 +17560,6 @@ msgstr "有效利用å²è©© (epics) ,您的產å“線管ç†æœƒè®Šå¾—更輕鬆高
msgid "Epics, issues, and merge requests"
msgstr "å²è©© (Epics)ã€è­°é¡Œå’Œåˆä½µè«‹æ±‚"
-msgid "Epics|%{startDate} – %{dueDate}"
-msgstr "%{startDate} – %{dueDate}"
-
-msgid "Epics|%{startDate} – No due date"
-msgstr "%{startDate} – 無截止日期"
-
msgid "Epics|Add a new epic"
msgstr "加入一個新的å²è©© (epic) 。"
@@ -17412,9 +17575,6 @@ msgstr "確定è¦å¾ž%{bStart}%{parentEpicTitle}%{bEnd}刪除%{bStart}%{targetIss
msgid "Epics|Leave empty to inherit from milestone dates"
msgstr "留空以繼承里程碑日期"
-msgid "Epics|No start date – %{dueDate}"
-msgstr "無開始日期 — %{dueDate}"
-
msgid "Epics|Remove epic"
msgstr "刪除å²è©© (epic) "
@@ -18365,12 +18525,18 @@ msgstr[0] "失敗的作業"
msgid "Failed on"
msgstr "失敗於"
+msgid "Failed to %{action} this work item: %{reason}."
+msgstr "無法 %{action} 此工作項目: %{reason}。"
+
msgid "Failed to add a Zoom meeting"
msgstr "無法加入Zoom會議"
msgid "Failed to add a resource link"
msgstr "加入資æºéˆçµå¤±æ•—"
+msgid "Failed to add emoji. Please try again"
+msgstr "添加 emoji 表情符號失敗,請å†è©¦ä¸€æ¬¡"
+
msgid "Failed to apply commands."
msgstr "應用指令失敗。"
@@ -18408,9 +18574,6 @@ msgstr "無法複製此議題,因為目標專案ä¸å­˜åœ¨ã€‚"
msgid "Failed to clone this issue: wrong parameters."
msgstr "無法複製此議題:åƒæ•¸éŒ¯èª¤ã€‚"
-msgid "Failed to convert this work item: %{reason}."
-msgstr "未能轉æ›è©²å·¥ä½œé …: %{reason}。"
-
msgid "Failed to create a branch for this issue. Please try again."
msgstr "無法為此å•é¡Œå»ºç«‹åˆ†æ”¯ã€‚è«‹å†è©¦ä¸€æ¬¡ã€‚"
@@ -18555,6 +18718,9 @@ msgstr "無法刪除Zoom會議"
msgid "Failed to remove a to-do item for the design."
msgstr "無法移除設計的待辦事項。"
+msgid "Failed to remove emoji. Please try again"
+msgstr "刪除 emoji 表情符號失敗,請å†è©¦ä¸€æ¬¡"
+
msgid "Failed to remove mirror."
msgstr "移除é¡åƒå¤±æ•—。"
@@ -18576,6 +18742,9 @@ msgstr "å–å¾—é é¢å¤±æ•—"
msgid "Failed to save merge conflicts resolutions. Please try again!"
msgstr "儲存åˆä½µè¡çªè§£æ±ºè¾¦æ³•å¤±æ•—。請é‡è©¦ï¼"
+msgid "Failed to save namespace commit email."
+msgstr "無法儲存命å空間æ交的電å­éƒµä»¶ã€‚"
+
msgid "Failed to save new settings"
msgstr "無法儲存新設定"
@@ -18642,9 +18811,6 @@ msgstr "圖標將被移除。您確定嗎?"
msgid "Feature Flags"
msgstr "特性標籤"
-msgid "Feature deprecation"
-msgstr "功能æè¿°"
-
msgid "Feature flag status"
msgstr "特性標籤狀態"
@@ -18946,6 +19112,9 @@ msgstr "具有較大更改的文件é è¨­æƒ…æ³ä¸‹æ˜¯æŠ˜ç–Šçš„。"
msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr "æ交引用%{ref}路徑%{path}中的文件,目錄和å­æ¨¡çµ„"
+msgid "Fill in merge request template"
+msgstr "填寫åˆä½µè«‹æ±‚模æ¿"
+
msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authentication for this group%{strong_close}, and press %{strong_open}Save changes%{strong_close}"
msgstr "填寫以下字段,開啟%{strong_open}å°æ­¤ç¾¤çµ„啟用SAML身份驗證%{strong_close},然後點擊%{strong_open}ä¿å­˜æ›´æ”¹%{strong_close}"
@@ -19177,9 +19346,6 @@ msgstr "é‡å°æ¯ä¸€å€‹ä½œæ¥­å…‹éš† (Clone) 版本庫。"
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr "é‡å°æ¯å€‹ä½œæ¥­ï¼Œé‡è¤‡ä½¿ç”¨å°ˆæ¡ˆå·¥ä½œç©ºé–“。如果工作空間ä¸å­˜åœ¨ï¼Œè«‹ä½¿ç”¨ %{code_open} git clone %{code_close}。"
-msgid "For example, the application using the token or the purpose of the token. Do not give sensitive information for the name of the token, as it will be visible to all %{resource_type} members."
-msgstr "例如,使用令牌的應用程å¼æˆ–令牌的用途。ä¸è¦æ供令牌å稱的æ•æ„Ÿè¨Šæ¯ï¼Œå› ç‚ºå®ƒå°‡å°æ‰€æœ‰ %{resource_type} æˆå“¡å¯è¦‹ã€‚"
-
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
msgstr "å°æ–¼å¤§æ–¼æ­¤é™åˆ¶çš„檔案,僅索引檔案å稱。檔案內容沒有索引也ä¸å¯æœå°‹ã€‚"
@@ -19189,6 +19355,9 @@ msgstr "關於一般性工作"
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr "è‹¥è¦å€‹äººä½¿ç”¨ï¼Œè«‹åœ¨æ‚¨çš„個人電å­éƒµä»¶åœ°å€ä¸‹å»ºç«‹ä¸€å€‹å–®ç¨çš„帳號,ä¸è¦ç¶å®šåˆ°ä¼æ¥­é›»å­éƒµä»¶åŸŸæˆ–群組。"
+msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain."
+msgstr "è‹¥è¦å€‹äººä½¿ç”¨ï¼Œè«‹åœ¨æ‚¨çš„個人電å­éƒµä»¶åœ°å€ä¸‹å‰µå»ºä¸€å€‹å–®ç¨çš„帳號,ä¸è¦ç¶å®šåˆ°ä¼æ¥­é›»å­éƒµä»¶åŸŸæˆ–群組。"
+
msgid "For investigating IT service disruptions or outages"
msgstr "用於調查 IT æœå‹™ä¸­æ–·æˆ–åœæ©Ÿ"
@@ -19370,6 +19539,9 @@ msgid "Free groups are limited to %{free_user_limit} member and the remaining me
msgid_plural "Free groups are limited to %{free_user_limit} members and the remaining members will get a status of over-limit and lose access to the group."
msgstr[0] "å…費群組é™åˆ¶ç‚º %{free_user_limit} ä½æˆå“¡ï¼Œå…¶é¤˜æˆå“¡å°‡è®Šç‚ºè¶…é™ç‹€æ…‹ä¸¦å¤±åŽ»å°è©²ç¾¤çµ„çš„å­˜å–權é™ã€‚"
+msgid "Free top-level groups will soon be limited to %{free_users_limit} users and %{free_storage_limit} of data"
+msgstr "å…費的最上層群組將很快會被é™åˆ¶ç‚º%{free_users_limit}個使用者和%{free_storage_limit}的資料。"
+
msgid "Free trial will expire in %{days}"
msgstr "å…費試用期將在 %{days} 天後到期"
@@ -19430,6 +19602,9 @@ msgstr "%{providerTitle}來æºåœ°å€"
msgid "From issue creation until deploy to production"
msgstr "從建立議題到部署至正å¼ç’°å¢ƒ"
+msgid "From line %{line1} to %{line2}"
+msgstr "從 %{line1} 行到 %{line2}"
+
msgid "From merge request merge until deploy to production"
msgstr "從åˆä½µè«‹æ±‚被åˆä½µå¾Œåˆ°éƒ¨ç½²è‡³æ­£å¼ç’°å¢ƒ"
@@ -19487,6 +19662,9 @@ msgstr "生æˆæ–°çš„匯出"
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr "為您需è¦å­˜å–GitLab API的應用程å¼ç”Ÿæˆå°ˆæ¡ˆå­˜å–令牌。"
+msgid "Generate root cause analysis"
+msgstr "生æˆæ ¹æœ¬åŽŸå› åˆ†æž"
+
msgid "Generate site and private keys at"
msgstr "生æˆç«™é»žå’Œç§é‘°åœ¨"
@@ -20101,9 +20279,6 @@ msgstr "開始使用 GitLab"
msgid "Get started with error tracking"
msgstr "開始使用錯誤追蹤"
-msgid "Get started with performance monitoring"
-msgstr "開始進行效能監控"
-
msgid "Get started!"
msgstr "開始å§ï¼"
@@ -20584,6 +20759,9 @@ msgstr "è¦ä½¿ç”¨æ•´åˆï¼Œæ¯å€‹ä½¿ç”¨è€…還必須在其 GitLab 賬號上啟用
msgid "Gitpod|https://gitpod.example.com"
msgstr "https://gitpod.example.com"
+msgid "Give feedback"
+msgstr "æ供回饋"
+
msgid "Give us some feedback"
msgstr "給我們一些回饋"
@@ -20623,6 +20801,9 @@ msgstr "èšåˆè¼‰å…¥éŒ¯èª¤ã€‚"
msgid "GlobalSearch|Close"
msgstr "關閉"
+msgid "GlobalSearch|Fetching aggregations error."
+msgstr "GlobalSearchæ“·å–èšåˆéŒ¯èª¤ã€‚"
+
msgid "GlobalSearch|Group"
msgstr "群組"
@@ -20641,6 +20822,9 @@ msgstr "我建立的議題"
msgid "GlobalSearch|Issues assigned to me"
msgstr "已分派給我的議題"
+msgid "GlobalSearch|Label(s)"
+msgstr "標記 (Label)"
+
msgid "GlobalSearch|Language"
msgstr "語言"
@@ -20653,6 +20837,9 @@ msgstr "已分派給我的åˆä½µè«‹æ±‚"
msgid "GlobalSearch|Merge requests that I'm a reviewer"
msgstr "我作為審核者的åˆä½µè«‹æ±‚"
+msgid "GlobalSearch|No labels found"
+msgstr "未找到標記 (labels)"
+
msgid "GlobalSearch|Project"
msgstr "專案"
@@ -20689,6 +20876,9 @@ msgstr "æœå°‹ GitLab %{kbdOpen}/%{kbdClose}"
msgid "GlobalSearch|Search for projects, issues, etc."
msgstr "æœå°‹å°ˆæ¡ˆã€è­°é¡Œç­‰ã€‚"
+msgid "GlobalSearch|Search labels"
+msgstr "查尋標記"
+
msgid "GlobalSearch|Search results are loading"
msgstr "æœå°‹çµæžœæ­£åœ¨è¼‰å…¥ä¸­"
@@ -21118,9 +21308,6 @@ msgstr "群組訊æ¯"
msgid "Group information"
msgstr "群組資訊"
-msgid "Group is required when cluster_type is :group"
-msgstr "cluster_type為:group時群組為必需"
-
msgid "Group jobs by"
msgstr "群組作業ä¾"
@@ -21412,6 +21599,9 @@ msgstr "SCIM 令牌"
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr "SAML令牌簽å憑證的SHA1指紋。請從身份驗證æ供商處抓å–(也å¯ä»¥è¢«ç¨±ç‚ºã€Œæ‹‡æŒ‡ç´‹ã€ï¼‰ã€‚"
+msgid "GroupSAML|Some branches are inaccessible because your SAML session has expired. To access the branches, select the group’s path to reauthenticate."
+msgstr "由於您的 SAML 會話已éŽæœŸï¼Œå› æ­¤ä¸€äº›åˆ†æ”¯ç„¡æ³•è¨ªå•ã€‚è¦è¨ªå•é€™äº›åˆ†æ”¯ï¼Œè«‹é¸æ“‡ç¾¤çµ„的路徑以é‡æ–°é©—證。"
+
msgid "GroupSAML|Some to-do items may be hidden because your SAML session has expired. Select the group’s path to reauthenticate and view the hidden to-do items."
msgstr "因為您的 SAML 會話已éŽæœŸï¼ŒæŸäº›å¾…辦事項å¯èƒ½å·²è¢«éš±è—。é¸æ“‡ç¾¤çµ„的路徑é‡æ–°èªè­‰ï¼Œä¸¦æŸ¥çœ‹éš±è—的待辦事項。"
@@ -22083,12 +22273,6 @@ msgstr "通知和其他 %{issueType} 動作已移至此é¸å–®ã€‚"
msgid "HeaderAction|Okay!"
msgstr "OKï¼"
-msgid "HeaderAction|incident"
-msgstr "事件"
-
-msgid "HeaderAction|issue"
-msgstr "議題"
-
msgid "Headers"
msgstr "標頭"
@@ -22203,10 +22387,6 @@ msgstr "éš±è—å³æ™‚é è¦½"
msgid "Hide archived projects"
msgstr "éš±è—已歸檔的項目"
-msgid "Hide chart"
-msgid_plural "Hide charts"
-msgstr[0] "éš±è—圖表"
-
msgid "Hide comments"
msgstr "éš±è—留言"
@@ -22352,12 +22532,24 @@ msgstr "例行維護"
msgid "Housekeeping successfully started"
msgstr "已開始維護"
+msgid "How do I change my password in GitLab?"
+msgstr "如何在 GitLab 中更改密碼?"
+
+msgid "How do I clone a repository?"
+msgstr "如何克隆 (clone) 版本庫?"
+
msgid "How do I configure Akismet?"
msgstr "如何é…ç½® Akismet ?"
msgid "How do I configure this integration?"
msgstr "如何設定此整åˆï¼Ÿ"
+msgid "How do I create a template?"
+msgstr "如何建立一個模æ¿ï¼Ÿ"
+
+msgid "How do I fork a project?"
+msgstr "å¦‚ä½•åˆ†å‰ (fork) 一個專案?"
+
msgid "How do I generate it?"
msgstr "我如何生æˆå®ƒï¼Ÿ"
@@ -22978,6 +23170,9 @@ msgstr "å·²æ“有"
msgid "ImportProjects|Re-import creates a new project. It does not sync with the existing project."
msgstr "é‡æ–°åŒ¯å…¥å»ºç«‹ä¸€å€‹æ–°å°ˆæ¡ˆï¼Œå®ƒä¸èˆ‡ç¾å­˜å°ˆæ¡ˆåŒæ­¥ã€‚"
+msgid "ImportProjects|Repository above permitted size limit."
+msgstr "版本庫超出å…許的大å°é™åˆ¶ã€‚"
+
msgid "ImportProjects|Requesting namespaces failed"
msgstr "請求命å空間失敗"
@@ -23036,6 +23231,9 @@ msgstr "在此 URL 上沒有有效的 Git 倉庫。如果您的 HTTP 倉庫ä¸èƒ
msgid "Improve customer support with Service Desk"
msgstr "通éŽæœå‹™å°æ”¹å–„客戶支æ´"
+msgid "Improve indexing performance by increasing Sidekiq load. Values greater than the current shard limit (%{limit}) are not allowed."
+msgstr "通éŽå¢žåŠ  Sidekiq 負載來æ高索引性能,ä¸å…許大於當å‰åˆ†ç‰‡é™åˆ¶ (%{limit}) 的值。"
+
msgid "Improve quality with test cases"
msgstr "通éŽæ¸¬è©¦æ¡ˆä¾‹æ高質é‡"
@@ -23858,6 +24056,12 @@ msgstr "未完æˆ"
msgid "Increase"
msgstr "增加"
+msgid "Increment suggestion line end"
+msgstr "增加建議行çµæŸ"
+
+msgid "Increment suggestion line start"
+msgstr "增加建議行開始"
+
msgid "Incubation|%{featureName} is in incubating phase"
msgstr "%{featureName} 處於孵化階段"
@@ -23975,8 +24179,8 @@ msgstr "å‘å‰æ’入列"
msgid "Insert comment template"
msgstr "æ’入評論範本"
-msgid "Insert link"
-msgstr "æ’å…¥éˆæŽ¥"
+msgid "Insert link (%{modifierKey}K)"
+msgstr "æ’å…¥éˆçµ (%{modifierKey}K)"
msgid "Insert or edit diagram"
msgstr "æ’入或編輯圖表"
@@ -24008,9 +24212,6 @@ msgstr "此專案已在insights.yml文件中éŽæ¿¾æŽ‰(見projects.onlyé…置以ç
msgid "Install GitLab Runner and ensure it's running."
msgstr "å®‰è£ GitLab 執行器並確ä¿å®ƒæ­£åœ¨é‹è¡Œã€‚"
-msgid "Install on clusters"
-msgstr "在å¢é›†ä¸Šå®‰è£"
-
msgid "Installation"
msgstr "安è£"
@@ -25084,6 +25285,9 @@ msgstr "ç›®å‰ä¼¼ä¹Žç„¡å¯ç”¨è³‡æ–™ä¾†é€²è¡Œç¨‹å¼ç¢¼è¦†è“‹çŽ‡è¨ˆç®—"
msgid "It's you"
msgstr "你自己"
+msgid "Italic (%{modifierKey}I)"
+msgstr "斜體 (%{modifierKey}I)"
+
msgid "Italic text"
msgstr "斜體文字"
@@ -25441,9 +25645,15 @@ msgstr "登入 GitLab 以éˆçµç¾¤çµ„。"
msgid "JiraConnect|Sign in to link groups"
msgstr "登入以éˆçµç¾¤çµ„"
+msgid "JiraConnect|Tell us what you think!"
+msgstr "告訴我們您的想法ï¼"
+
msgid "JiraConnect|The Jira user is not a site administrator. Check the permissions in Jira and try again."
msgstr "Jira 使用者éžç«™é»žç®¡ç†å“¡ï¼Œè«‹æª¢æŸ¥ Jira 中的權é™ä¸¦é‡è©¦ã€‚"
+msgid "JiraConnect|We would love to learn more about your experience with the GitLab for Jira Cloud App."
+msgstr "我們很想詳細了解您使用 GitLab for Jira Cloud 應用程å¼çš„體驗。"
+
msgid "JiraConnect|Welcome to GitLab for Jira"
msgstr "歡迎使用 GitLab for Jira"
@@ -25678,6 +25888,9 @@ msgstr "作業 %{jobName}"
msgid "Job Failed #%{build_id}"
msgstr "#%{build_id} 作業失敗 "
+msgid "Job ID"
+msgstr "作業编號"
+
msgid "Job artifacts"
msgstr "作業產物"
@@ -25696,6 +25909,9 @@ msgstr "作業已阻塞。請檢查Runner。"
msgid "Job logs and artifacts"
msgstr "作業日誌和產物"
+msgid "Job name"
+msgstr "作業å稱"
+
msgid "Job was retried"
msgstr "作業已é‡è©¦"
@@ -25861,6 +26077,9 @@ msgstr "沒有å¯é¡¯ç¤ºçš„作業"
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
msgstr "å°ä»»å‹™éŽæ¿¾å¾Œçš„æœå°‹åŠŸèƒ½ï¼Œç•¶å‰ä¸æ”¯æ´æœå°‹åŽŸå§‹æ–‡æœ¬ã€‚請使用å¯ç”¨çš„æœå°‹ä»¤ç‰Œã€‚"
+msgid "Jobs|Root cause analysis"
+msgstr "根本原因分æž"
+
msgid "Jobs|There was a problem fetching the failed jobs."
msgstr "讀å–失敗的作業時出ç¾å•é¡Œã€‚"
@@ -26023,6 +26242,12 @@ msgstr "等待資æº"
msgid "Job|We could not find this element"
msgstr "找ä¸åˆ°è©²å…ƒä»¶"
+msgid "Job|You do not have permission to read this job's log"
+msgstr "您無權讀å–該作業的日誌"
+
+msgid "Job|You do not have permission to retry this job"
+msgstr "您無權é‡è©¦æ­¤ä½œæ¥­"
+
msgid "Job|allowed to fail"
msgstr "å…許失敗"
@@ -26086,9 +26311,6 @@ msgstr "ä¿ç•™æœ€è¿‘æˆåŠŸä½œæ¥­çš„產物"
msgid "Keep divergent refs"
msgstr "ä¿ç•™åˆ†å‰çš„refs"
-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 "ä¿æŒæ‰€æœ‰ SAST 分æžå™¨å·²å•Ÿç”¨ï¼Œä»¥ç¢ºä¿å°ˆæ¡ˆåœ¨ä»¥å¾ŒåŠ å…¥æ–°èªžè¨€æ™‚ä¸æœƒéŽæ™‚。確定應用哪些分æžå™¨æ˜¯ä¸€å€‹æ¶ˆè€—最少資æºä¸¦ç‚ºæµæ°´ç·šå¢žåŠ æœ€å°‘時間的éŽç¨‹ã€‚啟用所有 SAST 分æžå™¨å¯ç¢ºä¿æœ€å¤§è¦†è“‹ç¯„åœã€‚"
-
msgid "Kerberos access denied"
msgstr "Kerberoså­˜å–被拒絕"
@@ -26304,6 +26526,9 @@ msgstr "最近%{days}天"
msgid "Last 2 weeks"
msgstr "最近2週"
+msgid "Last 24 hours"
+msgstr "éŽåŽ» 24 å°æ™‚"
+
msgid "Last Accessed On"
msgstr "最後存å–æ–¼"
@@ -26935,9 +27160,6 @@ msgstr "å°‡ Sentry 連çµåˆ° GitLab 以發ç¾å’ŒæŸ¥çœ‹æ‚¨çš„應用程å¼ç”Ÿæˆçš
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr "從專案的å´é‚Šæ¬„連çµå¤–部 wiki。 %{docs_link}"
-msgid "Link copied"
-msgstr "連çµå·²è¤‡è£½"
-
msgid "Link copied to clipboard."
msgstr "連çµå·²è¤‡è£½åˆ°å‰ªè²¼ç°¿ã€‚"
@@ -27085,8 +27307,8 @@ msgstr "載入更多"
msgid "Loading snippet"
msgstr "正在載入程å¼ç¢¼ç‰‡æ®µ"
-msgid "Loading the GitLab IDE..."
-msgstr "載入GitLab IDE..."
+msgid "Loading the GitLab IDE"
+msgstr "載入GitLab IDE"
msgid "Loading, please wait."
msgstr "載入中,請ç¨å¾…"
@@ -27151,6 +27373,9 @@ msgstr "已鎖定的文件"
msgid "Locked the discussion."
msgstr "鎖定討論."
+msgid "Locking %{issuableDisplayName}"
+msgstr "鎖定 %{issuableDisplayName}"
+
msgid "Locks the discussion."
msgstr "鎖定討論."
@@ -27343,6 +27568,9 @@ msgstr "管ç†å°ˆæ¡ˆã€‚"
msgid "Manage two-factor authentication"
msgstr "管ç†é›™å› å­é©—è­‰"
+msgid "Manage usage"
+msgstr "管ç†ä½¿ç”¨é‡"
+
msgid "Manage your project's triggers"
msgstr "管ç†æ‚¨çš„專案觸發器"
@@ -27376,6 +27604,9 @@ msgstr "è¦æ‰‹å‹•é€£çµæ­¤è­°é¡Œï¼Œå°‡å…¶åŠ å…¥åˆ°%{linkStart}原始æ¼æ´ž%{link
msgid "Map a FogBugz account ID to a GitLab user"
msgstr "å°‡ FogBugz 帳號 ID å°æ‡‰ç‚º GitLab 使用者"
+msgid "Map data from"
+msgstr "地圖資料來æº"
+
msgid "Mar"
msgstr "3月"
@@ -27433,6 +27664,9 @@ msgstr "加入斜體文本(%{modifierKey}I)"
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
msgstr "加入斜體文本(%{modifier_key}I)"
+msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}%{shiftKey}X)"
+msgstr "增加删除線文字(%{modifierKey}%{shiftKey}X)"
+
msgid "MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)"
msgstr "加入刪除線文本 (%{modifierKey}⇧X)"
@@ -27457,9 +27691,6 @@ msgstr "凸排 (%{modifier_key}[)"
msgid "MarkdownEditor|header"
msgstr "標題"
-msgid "MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-msgstr "支æ´%{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}"
-
msgid "Marked"
msgstr "已標記"
@@ -27559,8 +27790,8 @@ msgstr "最大值"
msgid "Max authenticated Git LFS requests per period per user"
msgstr "æ¯å€‹ä½¿ç”¨è€…在æ¯å€‹æ™‚期的最大身份驗證 Git LFS 請求"
-msgid "Max file size is 200 KB."
-msgstr "檔案大å°ä¸Šé™ç‚º200 KB。"
+msgid "Max file size is 200 KiB."
+msgstr "最大檔案大å°ç‚º 200 KiB。"
msgid "Max role"
msgstr "最高權é™è§’色"
@@ -27610,8 +27841,8 @@ msgstr "最大產物大å°ï¼ˆMB)"
msgid "Maximum attachment size"
msgstr "最大附件大å°"
-msgid "Maximum attachment size (MB)"
-msgstr "æœ€å¤§é™„ä»¶å¤§å° (MB)"
+msgid "Maximum attachment size (MiB)"
+msgstr "æœ€å¤§é™„ä»¶å¤§å° (MiB)"
msgid "Maximum authenticated API requests per rate limit period per user"
msgstr "æ¯å€‹ä½¿ç”¨è€…æ¯å€‹é€ŸçŽ‡é™åˆ¶æœŸçš„最大已驗證 API 請求數"
@@ -27637,8 +27868,8 @@ msgstr "æœ€å¤§å»¶é² (分é˜)"
msgid "Maximum diff patch size"
msgstr "最大差異補ä¸å¤§å°"
-msgid "Maximum diff patch size (Bytes)"
-msgstr "最大差異補ä¸å¤§å°ï¼ˆå­—節)"
+msgid "Maximum diff patch size (bytes)"
+msgstr "最大差異修補程å¼å¤§å°ï¼ˆbytes)"
msgid "Maximum duration of a session."
msgstr "會話的最大有效期é™ã€‚"
@@ -27646,8 +27877,8 @@ msgstr "會話的最大有效期é™ã€‚"
msgid "Maximum export size"
msgstr "最大匯出大å°"
-msgid "Maximum export size (MB)"
-msgstr "æœ€å¤§åŒ¯å‡ºå¤§å° (MB)"
+msgid "Maximum export size (MiB)"
+msgstr "æœ€å¤§åŒ¯å‡ºå¤§å° (MiB)"
msgid "Maximum field length"
msgstr "最大字段長度"
@@ -27682,8 +27913,8 @@ msgstr "æ¯åˆ†é˜æœ€å¤§ç¾¤çµ„匯入請求"
msgid "Maximum import size"
msgstr "最大匯入大å°"
-msgid "Maximum import size (MB)"
-msgstr "æœ€å¤§åŒ¯å…¥å¤§å° (MB)"
+msgid "Maximum import size (MiB)"
+msgstr "æœ€å¤§åŒ¯å…¥å¤§å° (MiB)"
msgid "Maximum job artifact size"
msgstr "最大作業產物大å°"
@@ -27703,8 +27934,11 @@ msgstr "最大 npm 軟體包檔案大å°ï¼ˆä»¥å­—節為單ä½ï¼‰"
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr "超éŽ%{name}的最大數é‡(%{count})"
-msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
-msgstr "單次推é€ä¸­è§¸ç™¼ webhook å’Œæœå‹™çš„最大更改數(分支或標籤)(é è¨­ç‚º 3)。"
+msgid "Maximum number of changes (branches or tags) in a single push above which a bulk push event is created (default is `3`). Setting to `0` does not disable throttling."
+msgstr "在單次推é€ä¸­çš„最大變更次數(分支或標籤),超éŽè©²æ•¸é‡å°‡å»ºç«‹æ‰¹é‡æŽ¨é€äº‹ä»¶ï¼ˆé»˜èªå€¼ç‚ºâ€œ3â€ï¼‰ã€‚設置為“0â€ä¸æœƒç¦ç”¨ç¯€æµã€‚"
+
+msgid "Maximum number of changes (branches or tags) in a single push above which webhooks and integrations are not triggered (default is `3`). Setting to `0` does not disable throttling."
+msgstr "單次推é€ä¸­çš„更改數é‡è¶…éŽæ­¤é–¾å€¼æ™‚,將ä¸æœƒè§¸ç™¼ Webhook å’Œæ•´åˆ (é è¨­ç‚º `3`)。將其設置為 `0` ä¸æœƒç¦ç”¨ç¯€æµé™åˆ¶ã€‚"
msgid "Maximum number of comments exceeded"
msgstr "超出最大留言數"
@@ -27724,12 +27958,18 @@ msgstr "經éŽèº«ä»½é©—證的使用者æ¯åˆ†é˜çš„最大請求數"
msgid "Maximum number of requests per minute for an unauthenticated IP address"
msgstr "未經身份驗證的 IP 地å€æ¯åˆ†é˜çš„最大請求數"
-msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
-msgstr "æ¯å€‹åŽŸå§‹è·¯å¾‘æ¯åˆ†é˜çš„最大請求數(é è¨­ç‚º 300)。設定為 0 以ç¦ç”¨ç¯€æµã€‚"
+msgid "Maximum number of requests per minute for each raw path (default is `300`). Set to `0` to disable throttling."
+msgstr "æ¯å€‹åŽŸå§‹è·¯å¾‘çš„æ¯åˆ†é˜æœ€å¤§è«‹æ±‚æ•¸é‡ (é è¨­ç‚º `300`),將其設置為 `0` å¯åœç”¨ç¯€æµé™åˆ¶ã€‚"
+
+msgid "Maximum number of stages per value stream exceeded"
+msgstr "超出æ¯å€‹åƒ¹å€¼æµçš„最大暫存數"
msgid "Maximum number of unique IP addresses per user."
msgstr "æ¯å€‹ä½¿ç”¨è€…的最大唯一 IP 地å€æ•¸ã€‚"
+msgid "Maximum number of value streams per namespace exceeded"
+msgstr "超出æ¯å€‹å‘½å空間的最大價值æµæ•¸é‡"
+
msgid "Maximum number of variables loaded (2000)"
msgstr "è¼‰å…¥çš„æœ€å¤§è®Šæ•¸æ•¸é‡ (2000)"
@@ -27754,8 +27994,8 @@ msgstr "æ¯åˆ†é˜æœ€å¤§å°ˆæ¡ˆåŒ¯å…¥è«‹æ±‚"
msgid "Maximum push size"
msgstr "最大推é€å¤§å°"
-msgid "Maximum push size (MB)"
-msgstr "最大推é€å¤§å° (MB)"
+msgid "Maximum push size (MiB)"
+msgstr "最大推é€å¤§å° (MiB)"
msgid "Maximum requests per 10 minutes per IP address"
msgstr "æ¯å€‹ IP 地å€æ¯ 10 分é˜çš„最大請求數"
@@ -27787,8 +28027,8 @@ msgstr "匯入文件的最大大å°ã€‚"
msgid "Maximum size of individual attachments in comments."
msgstr "留言中單個附件的最大大å°ã€‚"
-msgid "Maximum size of pages (MB)"
-msgstr "最大é é¢å¤§å°ï¼ˆMB)"
+msgid "Maximum size of pages (MiB)"
+msgstr "é é¢çš„æœ€å¤§å¤§å° (MiB)"
msgid "Maximum snippet size"
msgstr "最大代碼片段大å°"
@@ -28129,6 +28369,9 @@ msgstr "åˆä½µè«‹æ±‚分æž"
msgid "Merge request approvals"
msgstr "批准åˆä½µè«‹æ±‚"
+msgid "Merge request change summary"
+msgstr "åˆä½µè«‹æ±‚變更摘è¦"
+
msgid "Merge request commits"
msgstr "åˆä½µè«‹æ±‚æ交"
@@ -28147,6 +28390,9 @@ msgstr "åˆä½µè«‹æ±‚報告"
msgid "Merge request status"
msgstr "åˆä½µè«‹æ±‚狀態"
+msgid "Merge request summaries"
+msgstr "åˆä½µè«‹æ±‚摘è¦"
+
msgid "Merge request summary"
msgstr "åˆä½µè«‹æ±‚摘è¦"
@@ -28264,9 +28510,6 @@ msgstr "å°%{selectStart}開始於%{selectEnd}到%{end}行發表評論"
msgid "MergeRequestDiffs|Select comment starting line"
msgstr "é¸æ“‡è©•è«–起始行"
-msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr "儲存留言è‰ç¨¿æ™‚發生錯誤。"
-
msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally."
msgstr "無法自動執行該æ“作,它å¯èƒ½å·²ç¶“完æˆï¼Œæˆ–者最近的æ交å¯èƒ½å·²ç¶“更新了其中的一些內容,請在本地執行此æ“作。"
@@ -28294,9 +28537,6 @@ msgstr "åˆä½µè«‹æ±‚還原失敗"
msgid "MergeRequests|Reference copied"
msgstr "已復制åƒç…§"
-msgid "MergeRequests|Saving the comment failed"
-msgstr "儲存留言失敗"
-
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr "壓縮 (Squash) 失敗:壓縮本地æ交,解決任何存在的è¡çªï¼Œç„¶å¾ŒæŽ¨é€åˆ†æ”¯ã€‚"
@@ -28321,6 +28561,9 @@ msgstr "查看文件 @ %{commitId}"
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr "查看已å–代文件 @ %{commitId}"
+msgid "MergeRequests|Your comment could not be submitted because %{reason}."
+msgstr "您的評論因為 %{reason} 而無法æ交。"
+
msgid "MergeRequests|commented on commit %{commitLink}"
msgstr "討論%{commitLink}æ交"
@@ -28387,6 +28630,18 @@ msgstr "由 @%{username} 審查,但尚未核准"
msgid "MergeRequest|Search (e.g. *.vue) (%{MODIFIER_KEY}P)"
msgstr "æœå°‹ï¼ˆä¾‹å¦‚ *.vue)(%{MODIFIER_KEY}P)"
+msgid "MergeRequest|Summaries are written by AI"
+msgstr "摘è¦ç”± AI 撰寫"
+
+msgid "MergeRequest|Summary notes"
+msgstr "摘è¦è¨»é‡‹"
+
+msgid "MergeRequest|This description was generated for revision %{revision} using AI"
+msgstr "æ­¤æ述是使用AI生æˆçš„,用於%{revision}修訂版本"
+
+msgid "MergeRequest|This description was generated using AI"
+msgstr "æ­¤æ述是使用 AI 生æˆçš„"
+
msgid "MergeTopics|%{sourceTopic} will be removed"
msgstr "%{sourceTopic} 將被移除"
@@ -28483,9 +28738,6 @@ msgstr "更新圖åƒæ™‚出ç¾å•é¡Œã€‚"
msgid "MetricImages|There was an issue uploading your image."
msgstr "上傳圖åƒæ™‚出ç¾å•é¡Œã€‚"
-msgid "Metrics"
-msgstr "指標"
-
msgid "Metrics - Grafana"
msgstr "指標 - Grafana"
@@ -28540,214 +28792,45 @@ msgstr "找ä¸åˆ°è¦æ±‚路徑的儀表æ¿"
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr "您無權å‘此儀表æ¿åŠ å…¥æ˜Ÿè™Ÿ"
-msgid "Metrics|1. Define and preview panel"
-msgstr "1. 定義和é è¦½é¢æ¿"
-
-msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr "2. å°‡é¢æ¿YAML貼上到儀表æ¿"
-
-msgid "Metrics|Add metric"
-msgstr "加入指標"
-
-msgid "Metrics|Add panel"
-msgstr "加入é¢æ¿"
-
-msgid "Metrics|Avg"
-msgstr "å¹³å‡"
-
-msgid "Metrics|Back to dashboard"
-msgstr "返回到儀表æ¿"
-
-msgid "Metrics|Cancel"
-msgstr "å–消"
-
-msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
-msgstr "查看有關部署到環境的CI/CD文件"
-
-msgid "Metrics|Collapse panel"
-msgstr "收起é¢æ¿"
-
-msgid "Metrics|Collapse panel (Esc)"
-msgstr "收起é¢æ¿(Esc)"
-
-msgid "Metrics|Copy YAML"
-msgstr "複製YAML"
-
-msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr "複製並貼上é¢æ¿YAML到您的儀表æ¿YAML文件。"
-
-msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr "å»ºç«‹è‡ªè¨‚å„€è¡¨æ¿ %{fileName}"
-
msgid "Metrics|Create metric"
msgstr "建立指標"
-msgid "Metrics|Create new dashboard"
-msgstr "建立新儀表æ¿"
-
-msgid "Metrics|Create your dashboard configuration file"
-msgstr "建立儀表æ¿é…置文件"
-
-msgid "Metrics|Current"
-msgstr "當å‰"
-
-msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr "儀表æ¿æ–‡ä»¶å¯ä»¥åœ¨æ­¤å°ˆæ¡ˆçš„根目錄下%{codeStart}.gitlab/dashboards%{codeEnd}中找到。"
-
-msgid "Metrics|Define panel YAML below to preview panel."
-msgstr "在下é¢å®šç¾©é¢æ¿YAML以é è¦½é¢æ¿ã€‚"
-
msgid "Metrics|Delete metric"
msgstr "刪除指標"
msgid "Metrics|Delete metric?"
msgstr "刪除指標?"
-msgid "Metrics|Duplicate"
-msgstr "複製"
-
-msgid "Metrics|Duplicate current dashboard"
-msgstr "複製當å‰å„€è¡¨æ¿"
-
-msgid "Metrics|Duplicate dashboard"
-msgstr "複製儀表æ¿"
-
-msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr "複製此儀表æ¿ä»¥åŠ å…¥é¢æ¿æˆ–編輯儀表æ¿YAML。"
-
-msgid "Metrics|Duplicating..."
-msgstr "正在複製..."
-
-msgid "Metrics|Edit dashboard YAML"
-msgstr "編輯儀表æ¿YAML"
-
msgid "Metrics|Edit metric"
-msgid_plural "Metrics|Edit metrics"
-msgstr[0] "編輯指標"
-
-msgid "Metrics|Expand panel"
-msgstr "展開é¢æ¿"
+msgstr "編輯指標"
msgid "Metrics|For grouping similar metrics"
msgstr "用於分組類似指標"
-msgid "Metrics|Invalid time range, please verify."
-msgstr "無效的時間範åœï¼Œè«‹é©—證。"
-
msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time."
msgstr "Y軸是標籤(通常是單ä½)。X軸總是代表時間。"
msgid "Metrics|Legend label (optional)"
msgstr "圖例標籤(å¯é¸ï¼‰"
-msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
-msgstr "連çµåŒ…å«ç„¡æ•ˆçš„時間視窗 (time window),請驗證連çµä»¥æª¢è¦–請求的時間範åœã€‚"
-
-msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr "連çµåŒ…å«ç„¡æ•ˆçš„圖表訊æ¯ï¼Œè«‹é©—證連çµä»¥æŸ¥çœ‹å±•é–‹å¾Œçš„é¢æ¿ã€‚"
-
-msgid "Metrics|Manage chart links"
-msgstr "管ç†åœ–表連çµ"
-
-msgid "Metrics|Max"
-msgstr "最大值"
-
-msgid "Metrics|Metrics Settings"
-msgstr "指標設定"
-
-msgid "Metrics|Min"
-msgstr "最å°å€¼"
-
-msgid "Metrics|More actions"
-msgstr "更多動作"
-
msgid "Metrics|Must be a valid PromQL query."
msgstr "必須是有效的 PromQL 查詢。"
msgid "Metrics|New metric"
msgstr "建立指標"
-msgid "Metrics|Open repository"
-msgstr "開啟版本庫"
-
-msgid "Metrics|Panel YAML"
-msgstr "é¢æ¿YAML"
-
-msgid "Metrics|Panel YAML copied"
-msgstr "é¢æ¿YAML已複製"
-
-msgid "Metrics|Preview panel"
-msgstr "é è¦½é¢æ¿"
-
msgid "Metrics|PromQL query is valid"
msgstr "PromotQL 查詢有效"
msgid "Metrics|Prometheus Query Documentation"
msgstr "Prometheus查詢文件"
-msgid "Metrics|Refresh Prometheus data"
-msgstr "é‡æ–°æ•´ç†Prometheus資料"
-
-msgid "Metrics|Refresh dashboard"
-msgstr "é‡æ–°æ•´ç†å„€è¡¨æ¿"
-
-msgid "Metrics|Select a value"
-msgstr "é¸æ“‡ä¸€å€‹å€¼"
-
-msgid "Metrics|Set refresh rate"
-msgstr "設定刷新率"
-
-msgid "Metrics|Star dashboard"
-msgstr "星號儀表æ¿"
-
-msgid "Metrics|There was an error creating the dashboard."
-msgstr "建立儀表æ¿æ™‚發生錯誤。"
-
-msgid "Metrics|There was an error creating the dashboard. %{error}"
-msgstr "建立儀表æ¿æ™‚發生錯誤。 %{error}"
-
-msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr "å–得註解時發生錯誤。請é‡è©¦ã€‚"
-
-msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr "å–得環境資料時發生錯誤,請é‡è©¦"
-
-msgid "Metrics|There was an error getting annotations information."
-msgstr "å–得註解資訊時發生錯誤。"
-
-msgid "Metrics|There was an error getting dashboard validation warnings information."
-msgstr "å–得儀表æ¿é©—證警告資訊時發生錯誤。"
-
-msgid "Metrics|There was an error getting deployment information."
-msgstr "å–得部署訊æ¯æ™‚發生錯誤。"
-
-msgid "Metrics|There was an error getting environments information."
-msgstr "å–得環境訊æ¯æ™‚發生錯誤。"
-
-msgid "Metrics|There was an error getting options for variable \"%{name}\"."
-msgstr "å–得變數\"%{name}\"çš„é¸é …時發生錯誤。"
-
msgid "Metrics|There was an error trying to validate your query"
msgstr "嘗試驗證您的查詢時發生錯誤"
-msgid "Metrics|There was an error while retrieving metrics"
-msgstr "檢索度é‡æ¨™æº–時出錯"
-
-msgid "Metrics|There was an error while retrieving metrics. %{message}"
-msgstr "讀å–指標時發生錯誤。%{message}"
-
-msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr "è¦å»ºç«‹æ–°çš„儀表æ¿ï¼Œè«‹å°‡æ–°çš„YAML文件加入到該專案的根目錄下%{codeStart}.gitlab /dashboards%{codeEnd}中。"
-
-msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr "來自Prometheus終端節點的æ„外部署資料響應"
-
msgid "Metrics|Unit label"
msgstr "å–®ä½æ¨™ç±¤"
-msgid "Metrics|Unstar dashboard"
-msgstr "å–消儀表æ¿æ˜Ÿè™Ÿ"
-
msgid "Metrics|Used as a title for the chart"
msgstr "作為圖表的標題"
@@ -28757,24 +28840,12 @@ msgstr "用於查詢返回單個系列時。如果返回多個系列,相應的
msgid "Metrics|Validating query"
msgstr "正在驗證查詢"
-msgid "Metrics|Values"
-msgstr "值"
-
-msgid "Metrics|View documentation"
-msgstr "查看文件"
-
msgid "Metrics|Y-axis label"
msgstr "Y軸標記"
-msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr "您能夠儲存儀表æ¿çš„副本到版本庫以供自訂。請é¸æ“‡æª”案å稱åŠåˆ†æ”¯ä»¥å„²å­˜ã€‚"
-
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
msgstr "您å³å°‡æ°¸ä¹…刪除此指標且無法復原。"
-msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
-msgstr "您的儀表æ¿æ¦‚è¦ç„¡æ•ˆã€‚編輯儀表æ¿ä»¥ä¿®æ­£YAML概è¦ã€‚"
-
msgid "Metrics|e.g. HTTP requests"
msgstr "例如:HTTP 請求"
@@ -29160,6 +29231,9 @@ msgstr "候é¸æ¨¡åž‹è©³ç´°è³‡è¨Š"
msgid "MlExperimentTracking|Model experiments"
msgstr "模型實驗"
+msgid "MlExperimentTracking|Model registry"
+msgstr "模型庫"
+
msgid "MlExperimentTracking|Name"
msgstr "å稱"
@@ -29196,6 +29270,9 @@ msgstr "關閉"
msgid "Model experiments"
msgstr "模型實驗"
+msgid "ModelRegistry|Model registry"
+msgstr "模型庫"
+
msgid "Modified"
msgstr "已修改"
@@ -29256,9 +29333,6 @@ msgstr "更多訊æ¯"
msgid "More information is available|here"
msgstr "這裡"
-msgid "More information."
-msgstr "更多訊æ¯ã€‚"
-
msgid "More options"
msgstr "更多é¸é …"
@@ -29436,6 +29510,12 @@ msgstr "命å空間ID:"
msgid "Namespace Limits"
msgstr "命å空間é™åˆ¶"
+msgid "Namespace doesn't exist or you don't have permission."
+msgstr "命å空間ä¸å­˜åœ¨æˆ–您沒有權é™ã€‚"
+
+msgid "Namespace must be provided."
+msgstr "å¿…é ˆæ供命å空間。"
+
msgid "Namespace or group to import repository into does not exist."
msgstr "è¦åŒ¯å…¥ç‰ˆæœ¬åº«åˆ°å…¶ä¸­çš„命å空間或群組ä¸å­˜åœ¨ã€‚"
@@ -30182,12 +30262,6 @@ msgstr "無需信用å¡ã€‚"
msgid "No data available"
msgstr "沒有å¯ç”¨çš„資料"
-msgid "No data found"
-msgstr "未找到資料"
-
-msgid "No data to display"
-msgstr "沒有å¯é¡¯ç¤ºçš„資料"
-
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
msgstr "未檢測到部署。使用環境來控制軟體的æŒçºŒéƒ¨ç½²ã€‚ %{linkStart}了解有關部署作業的更多訊æ¯ã€‚%{linkEnd}"
@@ -30326,9 +30400,6 @@ msgstr "未é¸æ“‡ref"
msgid "No regions configured"
msgstr "未é…ç½®å€åŸŸ"
-msgid "No related merge requests found."
-msgstr "未找到相關的åˆä½µè«‹æ±‚。"
-
msgid "No repository"
msgstr "無版本庫"
@@ -30371,6 +30442,9 @@ msgstr "沒有此錯誤的堆棧追蹤"
msgid "No starrers matched your search"
msgstr "沒有符åˆæ‚¨æœå°‹æ¢ä»¶çš„收è—使用者"
+msgid "No start date – %{dueDate}"
+msgstr "無開始日期 – %{dueDate}"
+
msgid "No suggestions found"
msgstr "未找到任何建議"
@@ -30513,9 +30587,6 @@ msgstr "注æ„:當å‰çš„分å‰ï¼ˆFork)將ä¿æŒå…¶å¯è¦‹ç­‰ç´šã€‚"
msgid "NoteForm|Note"
msgstr "備註"
-msgid "NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}."
-msgstr "æ”¯æ´ %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}。é‡å° %{quickActionsDocsLinkStart}快速æ“作%{quickActionsDocsLinkEnd},輸入 %{keyboardStart}/%{keyboardEnd}。"
-
msgid "Notes"
msgstr "備註"
@@ -30808,6 +30879,9 @@ msgstr "æ交作者"
msgid "Notify|Committed by"
msgstr "æ交者"
+msgid "Notify|Could not find the following %{column} values in %{project}%{parent_groups_clause}: %{error_lines}"
+msgstr "在 %{project}%{parent_groups_clause}: %{error_lines}中找ä¸åˆ°ä»¥ä¸‹ %{column} 值"
+
msgid "Notify|Don't want to receive updates from GitLab administrators?"
msgstr "ä¸æƒ³æŽ¥æ”¶ä¾†è‡ª GitLab 管ç†å“¡çš„更新?"
@@ -30913,18 +30987,24 @@ msgstr "該文件類型無法é è¦½"
msgid "Notify|No work items have been imported."
msgstr "通知|尚未導入任何工作項。"
-msgid "Notify|Pipeline #%{pipeline_id} has failed!"
-msgstr "#%{pipeline_id} æµæ°´ç·šå¤±æ•—ï¼"
-
msgid "Notify|Pipeline %{pipeline_link} triggered by"
msgstr "æµæ°´ç·š %{pipeline_link} 的觸發者為"
-msgid "Notify|Pipeline has been fixed and #%{pipeline_id} has passed!"
-msgstr "æµæ°´ç·šå·²ä¿®å¾©ï¼Œ#%{pipeline_id} 已通éŽï¼"
+msgid "Notify|Pipeline %{pipeline_name_or_id} has failed!"
+msgstr "æµæ°´ç·š %{pipeline_name_or_id} 失敗了ï¼"
+
+msgid "Notify|Pipeline %{pipeline_name_or_id} has passed!"
+msgstr "æµæ°´ç·š %{pipeline_name_or_id} 已通éŽï¼"
+
+msgid "Notify|Pipeline has been fixed and %{pipeline_name_or_id} has passed!"
+msgstr "æµæ°´ç·šå·²ä¿®å¾©ï¼Œ %{pipeline_name_or_id} 已通éŽï¼"
msgid "Notify|Please check that your service provider supports email subaddressing and that you have set up email forwarding correctly."
msgstr "請檢查您的æœå‹™ä¾›æ‡‰å•†æ˜¯å¦æ”¯æ´é›»å­éƒµä»¶å­ä½å€ä»¥åŠæ‚¨æ˜¯å¦å·²æ­£ç¢ºè¨­ç½®é›»å­éƒµä»¶è½‰ç™¼ã€‚"
+msgid "Notify|Please fix the errors above and try the CSV import again."
+msgstr "請修正上述的錯誤,然後å†æ¬¡å˜—試CSV的匯入。"
+
msgid "Notify|Please fix the lines with errors and try the CSV import again."
msgstr "請修復有錯誤的行,然後å†æ¬¡å˜—試匯入 CSV 。"
@@ -31099,6 +31179,9 @@ msgstr "副本數"
msgid "Number of shards"
msgstr "碎片數é‡"
+msgid "Number of shards for non-code indexing"
+msgstr "éžç¨‹å¼ç¢¼ç´¢å¼•çš„分片數é‡"
+
msgid "OK"
msgstr "確定"
@@ -31773,6 +31856,12 @@ msgstr "項目清單"
msgid "Organizations"
msgstr "組織"
+msgid "Organization|Organization navigation"
+msgstr "組織組織導航"
+
+msgid "Organization|Organization overview"
+msgstr "組織總覽"
+
msgid "Orphaned member"
msgstr "孤兒æˆå“¡"
@@ -32293,6 +32382,18 @@ msgstr "專案級別"
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr "如果軟體包å稱或版本符åˆæ­¤æ­£å‰‡è¡¨é”å¼ï¼Œå‰‡ç™¼å¸ƒè»Ÿé«”包。"
+msgid "PackageRegistry|Published %{date}"
+msgstr "註冊表已發布 %{date}"
+
+msgid "PackageRegistry|Published by %{author}, %{date}"
+msgstr "由%{author}發布於%{date}"
+
+msgid "PackageRegistry|Published to %{projectName} by %{author}, %{date}"
+msgstr "由%{author}於%{date}發布至%{projectName}"
+
+msgid "PackageRegistry|Published to %{projectName}, %{date}"
+msgstr "於%{date}發布至%{projectName}"
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr "於%{datetime}發布到%{project}軟體包註冊表"
@@ -32863,9 +32964,6 @@ msgstr "æµæ°´ç·šæŽ’程"
msgid "Pipeline URL"
msgstr "æµæ°´ç·š URL"
-msgid "Pipeline artifacts"
-msgstr "æµæ°´ç·šç”¢ç‰©"
-
msgid "Pipeline creation rate limits"
msgstr "æµæ°´ç·šå»ºç«‹é€ŸçŽ‡é™åˆ¶"
@@ -33067,6 +33165,15 @@ msgstr "已啟用"
msgid "PipelineSchedules|All"
msgstr "全部"
+msgid "PipelineSchedules|An error occurred while creating the pipeline schedule."
+msgstr "建立æµæ°´ç·šæŽ’程時發生錯誤。"
+
+msgid "PipelineSchedules|An error occurred while trying to fetch the pipeline schedule."
+msgstr "嘗試讀å–æµæ°´ç·šæŽ’程時發生錯誤。"
+
+msgid "PipelineSchedules|An error occurred while updating the pipeline schedule."
+msgstr "æ›´æ–°æµæ°´ç·šæŽ’程時發生錯誤。"
+
msgid "PipelineSchedules|Are you sure you want to delete this pipeline schedule?"
msgstr "確定è¦åˆªé™¤æ­¤æµæ°´ç·šæŽ’程嗎?"
@@ -33076,6 +33183,9 @@ msgstr "å¯ä»¥æœ‰è‡ªè¨‚çš„ CI/CD 變數。"
msgid "PipelineSchedules|Create a new pipeline schedule"
msgstr "建立新的æµæ°´ç·šæŽ’程"
+msgid "PipelineSchedules|Create pipeline schedule"
+msgstr "建立æµæ°´ç·šæŽ’程"
+
msgid "PipelineSchedules|Cron timezone"
msgstr "Cron 時å€"
@@ -33133,9 +33243,6 @@ msgstr "é‡å°ç‰¹å®šåˆ†æ”¯æˆ–標籤執行。"
msgid "PipelineSchedules|Runs with the same project permissions as the schedule owner."
msgstr "使用與排程æ“有者相關的專案權é™åŸ·è¡Œã€‚"
-msgid "PipelineSchedules|Save pipeline schedule"
-msgstr "儲存æµæ°´ç·šæŽ’程"
-
msgid "PipelineSchedules|Successfully scheduled a pipeline to run. Go to the %{linkStart}Pipelines page%{linkEnd} for details. "
msgstr "æµæ°´ç·šå·²å®‰æŽ’執行。請檢視%{linkStart}æµæ°´ç·šé é¢%{linkEnd}ä»¥äº†è§£è©³ç´°è¨Šæ¯ ã€‚"
@@ -33322,9 +33429,6 @@ msgstr "CI/CD目錄"
msgid "Pipelines|Child pipeline (%{linkStart}parent%{linkEnd})"
msgstr "å­æµæ°´ç·š(%{linkStart}父%{linkEnd})"
-msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
-msgstr "å­æµæ°´ç·šï¼ˆ%{link_start}父æµæ°´ç·š%{link_end})"
-
msgid "Pipelines|Clear runner caches"
msgstr "清除Runner緩存"
@@ -33436,6 +33540,9 @@ msgstr "準備好為您的專案設定 CI/CD 嗎?"
msgid "Pipelines|Rebasing creates a pipeline that runs code originating from a forked project merge request. Consequently there are potential security implications, such as the exposure of CI variables."
msgstr "變基 (Rebasing) 會建立一個æµæ°´ç·šï¼ŒåŸ·è¡Œä¾†è‡ªåˆ†æ”¯åˆä½µè«‹æ±‚的程å¼ç¢¼ã€‚因此,存在潛在的安全風險,例如CI變é‡çš„公開。"
+msgid "Pipelines|Retry %{jobName} Job"
+msgstr "é‡è©¦ %{jobName} 作業"
+
msgid "Pipelines|Revoke trigger"
msgstr "撤銷觸發器"
@@ -33487,9 +33594,6 @@ msgstr "該GitLab CIé…置無效:%{reason},%{linkStart}了解更多%{linkEnd
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr "此GitLab CI設定有效。"
-msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr "æ­¤æµæ°´ç·šç‚ºå…·æœ‰çˆ¶æµæ°´ç·šçš„å­æµæ°´ç·š"
-
msgid "Pipelines|This pipeline is stuck"
msgstr "該æµæ°´ç·šå·²åœæ»¯"
@@ -33508,8 +33612,8 @@ msgstr "此專案目å‰æœªè¨­å®šåŸ·è¡Œæµæ°´ç·šã€‚"
msgid "Pipelines|Token"
msgstr "令牌"
-msgid "Pipelines|Total amount of compute credits used for the pipeline"
-msgstr "æµæ°´ç·šä½¿ç”¨çš„總計算點數"
+msgid "Pipelines|Total amount of compute minutes used for the pipeline"
+msgstr "æµæ°´ç·šä½¿ç”¨çš„總計算分é˜æ•¸"
msgid "Pipelines|Total number of jobs for the pipeline"
msgstr "æµæ°´ç·šä¸­çš„作業總數"
@@ -33568,9 +33672,15 @@ msgstr "在該列表中,您最多å¯ä»¥çœ‹åˆ°100個作業。若è¦æŸ¥çœ‹æ‰€æœ‰
msgid "Pipelines|Your changes have been successfully committed. Now redirecting to the new merge request page."
msgstr "您的更改已æˆåŠŸæ交,ç¾åœ¨é‡å®šå‘到新的åˆä½µè«‹æ±‚é é¢ã€‚"
+msgid "Pipelines|created"
+msgstr "已建立"
+
msgid "Pipelines|error"
msgstr "錯誤"
+msgid "Pipelines|finished"
+msgstr "已完æˆ"
+
msgid "Pipelines|invalid"
msgstr "無效"
@@ -33637,6 +33747,12 @@ msgstr "åˆä½µä½‡åˆ—æµæ°´ç·šä½œæ¥­ç„¡æ³•é‡è©¦"
msgid "Pipeline|Merged result pipeline"
msgstr "åˆä½µçµæžœæµæ°´ç·š"
+msgid "Pipeline|No failed jobs in this pipeline 🎉"
+msgstr "該æµæ°´ç·šä¸­æ²’有失敗的作業 🎉"
+
+msgid "Pipeline|Only the first 100 jobs per stage are displayed"
+msgstr "僅顯示æ¯å€‹éšŽæ®µçš„å‰ 100 項作業"
+
msgid "Pipeline|Passed"
msgstr "通éŽ"
@@ -33721,6 +33837,9 @@ msgstr "æ­¤æµæ°´ç·šåœ¨æ­¤åˆä½µè«‹æ±‚的來æºåˆ†æ”¯çš„內容上執行,而ä¸
msgid "Pipeline|To run a merge request pipeline, the jobs in the CI/CD configuration file %{linkStart}must be configured%{linkEnd} to run in merge request pipelines."
msgstr "è¦åŸ·è¡Œåˆä½µè«‹æ±‚æµæ°´ç·šï¼Œå¿…須將 CI/CD 作業中的設定文件 %{linkStart} 設定為%{linkEnd} 在åˆä½µè«‹æ±‚æµæ°´ç·šä¸­åŸ·è¡Œã€‚"
+msgid "Pipeline|To see the remaining jobs, go to the %{boldStart}Jobs%{boldEnd} tab."
+msgstr "è¦æŸ¥çœ‹å‰©é¤˜ä½œæ¥­ï¼Œè«‹ç§»è‡³ %{boldStart}Jobs%{boldEnd} é ç°½ã€‚"
+
msgid "Pipeline|Trigger author"
msgstr "觸發者"
@@ -33847,9 +33966,6 @@ msgstr "請確èªæ‚¨çš„é›»å­éƒµä»¶åœ°å€"
msgid "Please contact an admin to create runners."
msgstr "è«‹è¯ç¹«ç®¡ç†å“¡å»ºç«‹åŸ·è¡Œå™¨ã€‚"
-msgid "Please contact an admin to register runners."
-msgstr "è«‹è¯çµ¡ç®¡ç†å“¡ä»¥è¨»å†ŠåŸ·è¡Œå™¨ã€‚"
-
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr "如果您èªç‚ºé€™æ˜¯ä¸€å€‹éŒ¯èª¤ï¼Œè«‹è¯çµ¡æ‚¨çš„ GitLab 管ç†å“¡ã€‚"
@@ -34000,8 +34116,8 @@ msgstr "è«‹å†è©¦ä¸€æ¬¡"
msgid "Please try and refresh the page. If the problem persists please contact support."
msgstr "請嘗試é‡æ–°æ•´ç†é é¢ã€‚如果å•é¡Œä»ç„¶å­˜åœ¨ï¼Œè«‹è¯çµ¡æ”¯æ´äººå“¡ã€‚"
-msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
-msgstr "請輸入%{phrase_code}以繼續或關閉此å°è©±æ¡†ä»¥å–消。"
+msgid "Please type %{phrase_code} to proceed."
+msgstr "請輸入 %{phrase_code} 繼續。"
msgid "Please use this form to report to the administrator users who create spam issues, comments or behave inappropriately."
msgstr "請使用該表單å‘å¯ä»¥å»ºç«‹åžƒåœ¾è¨Šæ¯è­°é¡Œã€ç•™è¨€è©•è«–或ä¸ç•¶è¡Œç‚ºçš„系統管ç†ä½¿ç”¨è€…回報。"
@@ -34516,6 +34632,9 @@ msgstr "隨時間變化的事件"
msgid "ProductAnalytics|Feature Usages"
msgstr "功能使用狀æ³"
+msgid "ProductAnalytics|For more information, see the %{linkStart}docs%{linkEnd}."
+msgstr "更多資訊請åƒé–± %{linkStart}文件%{linkEnd}。"
+
msgid "ProductAnalytics|For the product analytics dashboard to start showing you some data, you need to add the analytics tracking code to your project."
msgstr "è¦è®“產å“分æžå„€è¡¨æ¿é–‹å§‹é¡¯ç¤ºä¸€äº›è³‡æ–™ï¼Œæ‚¨éœ€è¦å°‡åˆ†æžè·Ÿè¸ªç¨‹å¼ç¢¼åŠ å…¥åˆ°å°ˆæ¡ˆä¸­ã€‚"
@@ -34555,6 +34674,9 @@ msgstr "您想å–得關於什麼的洞察報告?"
msgid "ProductAnalytics|Page Views"
msgstr "é é¢ç€è¦½é‡"
+msgid "ProductAnalytics|Product analytics onboarding"
+msgstr "產å“分æžå…¥é–€"
+
msgid "ProductAnalytics|Repeat Visit Percentage"
msgstr "é‡è¤‡è¨ªå•çŽ‡"
@@ -34696,6 +34818,9 @@ msgstr "æ–¼"
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
msgstr "您å³å°‡æ°¸ä¹…刪除 %{yourAccount},以åŠèˆ‡æ‚¨çš„帳號關è¯çš„所有議題,åˆä½µè«‹æ±‚å’Œç¾¤çµ„ã€‚ä¸€æ—¦ç¢ºèª %{deleteAccount},此æ“作便無法撤銷和æ¢å¾©ã€‚"
+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. You might have to wait seven days before creating a new account with the same username or email."
+msgstr "您å³å°‡æ°¸ä¹…刪除 %{yourAccount} 以åŠéˆçµåˆ°æ‚¨å¸³è™Ÿçš„所有議題ã€åˆä½µè«‹æ±‚å’Œç¾¤çµ„ï¼Œä¸€æ—¦ç¢ºèª %{deleteAccount},就無法撤消或æ¢å¾©ã€‚您å¯èƒ½éœ€è¦ç­‰å¾… 7 天æ‰èƒ½ä½¿ç”¨ç›¸åŒçš„使用者å稱或電å­éƒµä»¶å‰µå»ºæ–°å¸³è™Ÿã€‚"
+
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 "您將變更使用者å稱 %{currentUsernameBold} 為 %{newUsernameBold}。設定檔案和專案將é‡å®šä½åˆ° %{newUsername} 命å空間,但是一旦 %{currentUsername} 命å空間被å¦ä¸€å€‹ä½¿ç”¨è€…或組註冊,此é‡å®šå‘å°‡éŽæœŸã€‚請儘快更新您的é ç«¯Git版本庫。"
@@ -35212,9 +35337,6 @@ msgstr "專案資訊:"
msgid "Project information"
msgstr "專案資訊"
-msgid "Project is required when cluster_type is :project"
-msgstr "cluster_type為 :project 時專案為必需"
-
msgid "Project members"
msgstr "專案æˆå“¡"
@@ -35752,18 +35874,6 @@ msgstr "內部"
msgid "ProjectSettings|Issues"
msgstr "議題"
-msgid "ProjectSettings|Jitsu administrator email"
-msgstr "Jitsu 管ç†è€…é›»å­éƒµä»¶"
-
-msgid "ProjectSettings|Jitsu administrator password"
-msgstr "Jitsu 管ç†è€…密碼"
-
-msgid "ProjectSettings|Jitsu host"
-msgstr "Jitsu 主機"
-
-msgid "ProjectSettings|Jitsu project ID"
-msgstr "Jitsu 專案 ID"
-
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr "此倉庫中的 LFS å°è±¡å¯ä¾›åˆ†å‰ã€‚ %{linkStart}我如何移除它們?%{linkEnd}"
@@ -35947,9 +36057,6 @@ msgstr "æ交è¦åˆä½µåˆ°ä¸Šæ¸¸çš„更改。"
msgid "ProjectSettings|Target project"
msgstr "目標專案"
-msgid "ProjectSettings|The ID of the project in Jitsu. The project contains all analytics instances."
-msgstr "Jitsu 中專案的 ID,該專案包å«æ‰€æœ‰åˆ†æžåŸ·è¡Œå€‹é«”。"
-
msgid "ProjectSettings|The URL of your Cube instance."
msgstr "您 Cube 執行個體的網å€ã€‚"
@@ -35971,9 +36078,6 @@ msgstr "在此分å‰å°ˆæ¡ˆä¸­å»ºç«‹çš„åˆä½µè«‹æ±‚çš„é è¨­ç›®æ¨™å°ˆæ¡ˆã€‚"
msgid "ProjectSettings|The default template will be applied on save."
msgstr "ä¿å­˜æ™‚將套用é è¨­ç¯„本。"
-msgid "ProjectSettings|The host of your Jitsu instance."
-msgstr "您 Jitsu 執行個體的主機。"
-
msgid "ProjectSettings|The host of your data collector instance."
msgstr "您資料收集器執行個體主機。"
@@ -36010,11 +36114,8 @@ msgstr "上游專案"
msgid "ProjectSettings|Used for every new merge request."
msgstr "用於æ¯å€‹æ–°çš„åˆä½µè«‹æ±‚。"
-msgid "ProjectSettings|Used to connect Jitsu to the Clickhouse instance."
-msgstr "用於將 Jitsu 連接到 Clickhouse 執行個體。"
-
-msgid "ProjectSettings|Used to generate short-lived API access tokens."
-msgstr "用於生æˆçŸ­æœŸçš„ API å­˜å–令牌。"
+msgid "ProjectSettings|Used to connect Snowplow to the Clickhouse instance."
+msgstr "用於將 Snowplow 連接到 Clickhouse 執行個體。"
msgid "ProjectSettings|Used to retrieve dashboard data from the Cube instance."
msgstr "用於從 Cube 執行個體中å–得儀表æ¿è³‡æ–™ã€‚"
@@ -36496,6 +36597,9 @@ msgstr "å‡ç´šåˆ°ç¾¤çµ„標記"
msgid "Promote to objective"
msgstr "æå‡ç‚ºç›®æ¨™"
+msgid "Promote work item"
+msgstr "æå‡å·¥ä½œé …ç›®"
+
msgid "PromoteMilestone|Only project milestones can be promoted."
msgstr "åªèƒ½å‡ç´šå°ˆæ¡ˆé‡Œç¨‹ç¢‘。"
@@ -36511,6 +36615,9 @@ msgstr "將議題å‡ç´šç‚ºå²è©© (epic) 。"
msgid "Promotes issue to incident"
msgstr "將議題æå‡ç‚ºäº‹ä»¶"
+msgid "Promotes work item to %{type}."
+msgstr "將工作項æå‡ç‚º %{type}。"
+
msgid "Promotion is not supported."
msgstr "ä¸æ”¯æ´æå‡ã€‚"
@@ -37293,9 +37400,6 @@ msgstr "專案質é‡"
msgid "Query"
msgstr "查詢"
-msgid "Query cannot be processed"
-msgstr "無法處ç†æŸ¥è©¢"
-
msgid "Queued"
msgstr "已佇列"
@@ -37368,6 +37472,9 @@ msgstr "在%{link_to_promo}上閱讀更多關於 GitLab 的訊æ¯ã€‚"
msgid "Read more about the %{changes_link_start}changes%{link_end}, the %{vision_link_start}vision%{link_end}, and the %{design_link_start}design%{link_end}."
msgstr "閱讀更多有關於 %{changes_link_start} 變更 %{link_end}ã€%{vision_link_start} 願景 %{link_end} å’Œ %{design_link_start} 設計 %{link_end} 的相關資訊。"
+msgid "Read the documentation before applying changes."
+msgstr "在套用變更之å‰ï¼Œè«‹é–±è®€æ–‡æª”。"
+
msgid "Read their documentation."
msgstr "閱讀他們的文件。"
@@ -37549,8 +37656,8 @@ msgstr "使用此功能"
msgid "RegistrationVerification|Are you sure you want to skip this step?"
msgstr "您確定è¦è·³éŽé€™ä¸€æ­¥å—Žï¼Ÿ"
-msgid "RegistrationVerification|Enable free units of compute"
-msgstr "啟用å…費計算單元"
+msgid "RegistrationVerification|Enable free compute minutes"
+msgstr "啟用å…費計算分é˜æ•¸"
msgid "RegistrationVerification|GitLab will not charge your card, it will only be used for validation."
msgstr "GitLab ä¸æœƒå¾žæ‚¨çš„å¡ä¸­æ‰£æ¬¾ï¼Œå®ƒåªæœƒç”¨æ–¼é©—證。"
@@ -37561,8 +37668,8 @@ msgstr "請先驗證您的帳號,å¦å‰‡ç„¡æ³•ä½¿ç”¨å…±äº« GitLab 執行器的æ
msgid "RegistrationVerification|Skip this for now"
msgstr "暫時跳éŽ"
-msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free units of compute to build your application."
-msgstr "ç‚ºäº†ç¢ºä¿ GitLab 無垃圾郵件和濫用,我們è¦æ±‚您使用有效的付款方å¼ï¼ˆä¾‹å¦‚扣帳å¡æˆ–信用å¡ï¼‰é€²è¡Œèº«ä»½é©—證。在完æˆé©—證之å‰ï¼Œæ‚¨ç„¡æ³•ä½¿ç”¨å…費的計算單ä½æ§‹å»ºæ‡‰ç”¨ç¨‹å¼ã€‚"
+msgid "RegistrationVerification|To keep GitLab spam and abuse free we ask that you verify your identity with a valid payment method, such as a debit or credit card. Until then, you can't use free compute minutes to build your application."
+msgstr "為了ä¿æŒGitLabå…å—垃圾郵件和濫用å¨è„…,我們è¦æ±‚您使用有效的付款方å¼ï¼ˆä¾‹å¦‚借記å¡æˆ–信用å¡ï¼‰ä¾†é©—證您的身份。在那之å‰ï¼Œæ‚¨ç„¡æ³•ä½¿ç”¨å…費計算分é˜ä¾†å»ºç«‹æ‚¨çš„應用程å¼ã€‚"
msgid "RegistrationVerification|Validate account"
msgstr "驗證帳號"
@@ -37576,18 +37683,6 @@ msgstr "是的,我想跳éŽ"
msgid "RegistrationVerification|You can alway verify your account at a later time."
msgstr "您å¯ä»¥ç¨å¾Œé©—證您的帳號。"
-msgid "Registration|Checkout"
-msgstr "支付"
-
-msgid "Registration|Your GitLab group"
-msgstr "您的GitLab群組"
-
-msgid "Registration|Your first project"
-msgstr "您的第一個專案"
-
-msgid "Registration|Your profile"
-msgstr "您的個人資料"
-
msgid "Registry entry enqueued to be resynced"
msgstr "註冊表æ¢ç›®å·²æŽ’入佇列等待é‡æ–°åŒæ­¥"
@@ -37802,14 +37897,14 @@ msgstr "移除Zoom會議"
msgid "Remove access"
msgstr "移除存å–權é™"
-msgid "Remove all or specific assignee(s)"
-msgstr "移除所有或特定指派人"
+msgid "Remove all or specific assignees"
+msgstr "移除所有或特定被指派者"
msgid "Remove all or specific label(s)"
msgstr "移除全部或特定標記"
-msgid "Remove all or specific reviewer(s)"
-msgstr "移除全部或特定的審核者"
+msgid "Remove all or specific reviewers"
+msgstr "移除全部或特定審核者"
msgid "Remove approvers"
msgstr "程除核准者"
@@ -38069,6 +38164,9 @@ msgstr "續訂"
msgid "Reopen"
msgstr "é‡æ–°é–‹å•Ÿ"
+msgid "Reopen %{issuableType}"
+msgstr "é‡æ–°é–‹å•Ÿ %{issuableType}"
+
msgid "Reopen %{issueType}"
msgstr "é‡æ–°é–‹å•Ÿ%{issueType}"
@@ -38093,6 +38191,9 @@ msgstr "é‡æ–°é–‹å•Ÿ%{quick_action_target}"
msgid "Reopened this %{quick_action_target}."
msgstr "é‡æ–°é–‹å•Ÿ%{quick_action_target}。"
+msgid "Reopening %{issuableType}..."
+msgstr "正在é‡æ–°é–‹å•Ÿ %{issuableType}..."
+
msgid "Reopening..."
msgstr "é‡æ–°é–‹å•Ÿ..."
@@ -38111,6 +38212,9 @@ msgstr "å–代所有標記"
msgid "Replace audio"
msgstr "å–代音頻"
+msgid "Replace current template with filled in placeholders"
+msgstr "用填充的佔ä½ç¬¦æ›¿æ›ç•¶å‰çš„模æ¿"
+
msgid "Replace file"
msgstr "å–代文件"
@@ -38504,8 +38608,8 @@ msgstr "版本庫必須包å«è‡³å°‘1個文件。"
msgid "Repository size is above the limit."
msgstr "版本庫大å°è¶…éŽé™åˆ¶ã€‚"
-msgid "Repository size limit (MB)"
-msgstr "版本庫大å°é™åˆ¶ï¼ˆMB)"
+msgid "Repository size limit (MiB)"
+msgstr "存儲庫大å°é™åˆ¶ (MiB)"
msgid "Repository storage"
msgstr "版本庫儲存"
@@ -38877,9 +38981,6 @@ msgid "Reviewer"
msgid_plural "%d Reviewers"
msgstr[0] "%dä½å¯©é–±è€…"
-msgid "Reviewer(s)"
-msgstr "審閱者"
-
msgid "Reviewers"
msgstr "審閱者"
@@ -38925,12 +39026,21 @@ msgstr "路線視圖"
msgid "Role"
msgstr "角色"
+msgid "Roles and Permissions"
+msgstr "角色與權é™"
+
msgid "Rollback"
msgstr "還原"
msgid "Rollout of free user limits within GitLab.com. Do not edit these values unless approval has been given via %{link_start}this issue%{link_end}."
msgstr "在 GitLab.com 內推出å…費使用者é™åˆ¶ã€‚除éžå·²ç¶“é€éŽ%{link_start}æ­¤å•é¡Œ%{link_end}å–得批准,å¦å‰‡è«‹å‹¿ç·¨è¼¯é€™äº›å€¼ã€‚"
+msgid "Root cause analysis"
+msgstr "根本原因分æž"
+
+msgid "Root cause analysis is a feature that analyzes your logs to determine why a job may have failed and the potential ways to fix it. To generate this analysis, we may share information in your job logs with %{linkStart}Third-Party AI providers%{linkEnd}. Before initiating this analysis, please do not include in your logs any information that could impact the security or privacy of your account."
+msgstr "根本原因分æžæ˜¯ä¸€é …功能,å¯åˆ†æžæ‚¨çš„日誌以確定作業å¯èƒ½å¤±æ•—的原因和解決該å•é¡Œçš„潛在方法。為了生æˆæ­¤åˆ†æžï¼Œæˆ‘們å¯èƒ½æœƒèˆ‡ %{linkStart}第三方 AI æ供商%{linkEnd} 共享您工作日誌中的訊æ¯ã€‚在開始此分æžä¹‹å‰ï¼Œè«‹ä¸è¦åœ¨æ‚¨çš„日誌中包å«ä»»ä½•å¯èƒ½å½±éŸ¿æ‚¨å¸³è™Ÿçš„安全或隱ç§çš„訊æ¯ã€‚"
+
msgid "Ruby"
msgstr "Ruby"
@@ -39079,6 +39189,9 @@ msgstr "Amazon Linux 2 Docker HA 具有手動縮放和å¯é¸çš„排程。Non-spot
msgid "Runners|An error has occurred fetching instructions"
msgstr "å–得指令時發生錯誤"
+msgid "Runners|An error occurred while creating the runner. Please try again."
+msgstr "執行器建立執行器時發生錯誤。請å†è©¦ä¸€æ¬¡ã€‚"
+
msgid "Runners|An error occurred while deleting. Some runners may not have been deleted."
msgstr "刪除éŽç¨‹ç™¼ç”ŸéŒ¯èª¤ã€‚一些執行器å¯èƒ½æ²’有被刪除。"
@@ -39184,10 +39297,16 @@ msgstr "%{timeAgo} 已建立 "
msgid "Runners|Created %{timeAgo} by %{avatar}"
msgstr "由 %{avatar} 建立於 %{timeAgo}"
+msgid "Runners|Dashboard"
+msgstr "儀表æ¿"
+
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
msgstr[0] "刪除 %d 個 執行器(runner)"
+msgid "Runners|Delete %{count} runners?"
+msgstr "刪除 %{count} 執行器?"
+
msgid "Runners|Delete runner"
msgstr "刪除執行器"
@@ -39248,9 +39367,6 @@ msgstr "從GitLab.comå–å¾—GitLab Runner的發布版本資料"
msgid "Runners|Filter projects"
msgstr "éŽæ¿¾å°ˆæ¡ˆ"
-msgid "Runners|Follow the %{linkStart}installation and registration instructions%{linkEnd} to set up a runner."
-msgstr "請按照%{linkStart}安è£å’Œè¨»å†ŠæŒ‡å—%{linkEnd}來設定執行器。"
-
msgid "Runners|Get started with runners"
msgstr "執行器入門"
@@ -39423,6 +39539,10 @@ msgid "Runners|Permanently delete %d runner"
msgid_plural "Runners|Permanently delete %d runners"
msgstr[0] "永久刪除 %d 個 runner"
+msgid "Runners|Permanently delete runner"
+msgid_plural "Runners|Permanently delete %d runners"
+msgstr[0] "永久刪除 %d 個執行器"
+
msgid "Runners|Platform"
msgstr "å¹³å°"
@@ -39676,7 +39796,8 @@ msgid "Runners|The project, group or instance where the runner was registered. I
msgstr "執行器(runner)所註冊的專案ã€ç¾¤çµ„或執行個體。執行個體執行器(runner)始終歸管ç†å“¡æ‰€æœ‰ã€‚"
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 "執行器(runner)將被永久刪除,ä¸èƒ½å¤ å†ç”¨æ–¼åŸ·è¡Œå€‹é«”中的專案或群組。您確定è¦ç¹¼çºŒå—Žï¼Ÿ"
+msgid_plural "Runners|%d 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] "確定è¦ç¹¼çºŒå—Žï¼Ÿ%d個執行器將被永久刪除並ä¸å†å¯ç”¨æ–¼åŸ·è¡Œå€‹é«”中的專案或群組。"
msgid "Runners|The unique ID for each runner that uses this configuration."
msgstr "æ¯å€‹ä½¿ç”¨æ­¤é…置的執行器 (Runner) 都有唯一的 ID。"
@@ -39994,11 +40115,14 @@ msgstr "儲存中"
msgid "Saving project."
msgstr "正在儲存專案。"
-msgid "ScanExecutionPolicy|%{period} %{days} at %{time}"
-msgstr "%{period} %{days} æ–¼ %{time}"
+msgid "ScanExecutionPolicy|%{hostname}'s timezone"
+msgstr "%{hostname}的時å€"
-msgid "ScanExecutionPolicy|%{rules} %{period} for %{scopes} %{branches} %{agents} %{namespaces}"
-msgstr "%{rules} %{period} é©ç”¨æ–¼ %{scopes} %{branches} %{agents} %{namespaces}"
+msgid "ScanExecutionPolicy|%{period} %{days} at %{time} %{timezoneLabel} %{timezone}"
+msgstr "%{period} %{days} 在 %{time} %{timezoneLabel} %{timezone}"
+
+msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{namespaces} %{period}"
+msgstr " %{scopes} %{branches} %{agents} %{namespaces} %{period} 的 %{rules} 動作"
msgid "ScanExecutionPolicy|%{rules} every time a pipeline runs for %{scopes} %{branches} %{agents} %{namespaces}"
msgstr "æ¯æ¬¡æµæ°´ç·šé‹è¡Œ %{scopes} %{branches} %{agents} %{namespaces} 時為 %{rules}"
@@ -40006,12 +40130,33 @@ msgstr "æ¯æ¬¡æµæ°´ç·šé‹è¡Œ %{scopes} %{branches} %{agents} %{namespaces} 時ç
msgid "ScanExecutionPolicy|Add condition"
msgstr "增加æ¢ä»¶"
+msgid "ScanExecutionPolicy|Add new CI variable"
+msgstr "增加新的 CI 變數"
+
msgid "ScanExecutionPolicy|Conditions"
msgstr "æ¢ä»¶"
+msgid "ScanExecutionPolicy|Customized CI variables:"
+msgstr "自定義 CI 變數:"
+
+msgid "ScanExecutionPolicy|Customized variables will overwrite ones defined in the project CI/CD file and settings"
+msgstr "自定義變數將覆蓋專案 CI/CD 文件和設置中定義的變數"
+
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
msgstr "如果該欄ä½ç‚ºç©ºï¼ŒåŸ·è¡Œå™¨ (runner) 將被自動é¸å–"
+msgid "ScanExecutionPolicy|Key"
+msgstr "密鑰"
+
+msgid "ScanExecutionPolicy|Kubernetes agent's timezone"
+msgstr "Kubernetes agent 的時å€"
+
+msgid "ScanExecutionPolicy|Maximum number of CI-criteria is one"
+msgstr "CI æ¢ä»¶çš„最大數é‡ç‚º 1"
+
+msgid "ScanExecutionPolicy|Only one variable can be added at a time."
+msgstr "一次åªèƒ½åŠ å…¥ä¸€å€‹è®Šæ•¸ã€‚"
+
msgid "ScanExecutionPolicy|Run a %{scan} scan on runner that %{tags}"
msgstr "在標籤為 %{tags} 的執行器上執行 %{scan} 掃æ "
@@ -40030,6 +40175,9 @@ msgstr "排程:"
msgid "ScanExecutionPolicy|Select a scanner"
msgstr "é¸æ“‡ä¸€å€‹æŽƒæ器"
+msgid "ScanExecutionPolicy|Select a variable"
+msgstr "é¸æ“‡ä¸€å€‹è®Šæ•¸"
+
msgid "ScanExecutionPolicy|Select agent"
msgstr "é¸æ“‡ä»£ç†"
@@ -40045,6 +40193,9 @@ msgstr "é¸æ“‡æŽƒæ器é…ç½®"
msgid "ScanExecutionPolicy|Select site profile"
msgstr "é¸æ“‡ç«™é»žé…ç½®"
+msgid "ScanExecutionPolicy|Select timezone"
+msgstr "é¸æ“‡æ™‚å€"
+
msgid "ScanExecutionPolicy|Site profile"
msgstr "站點é…ç½®"
@@ -40054,6 +40205,9 @@ msgstr "標籤"
msgid "ScanExecutionPolicy|Triggers:"
msgstr "觸發器:"
+msgid "ScanExecutionPolicy|Value"
+msgstr "值"
+
msgid "ScanExecutionPolicy|agent"
msgstr "代ç†"
@@ -40066,6 +40220,12 @@ msgstr "有特定的標記"
msgid "ScanExecutionPolicy|in namespaces"
msgstr "在命å空間中"
+msgid "ScanExecutionPolicy|on %{hostname}"
+msgstr "在 %{hostname} 上"
+
+msgid "ScanExecutionPolicy|on the Kubernetes agent pod"
+msgstr "在 Kubernetes agent pod 上"
+
msgid "ScanExecutionPolicy|scanner profile %{scannerProfile} and site profile %{siteProfile}"
msgstr "掃æ器設定檔%{scannerProfile}和站點設定檔%{siteProfile}"
@@ -40087,6 +40247,9 @@ msgstr "é¸æ“‡æ¢ä»¶é¡žåž‹"
msgid "ScanResultPolicy|Clear all"
msgstr "清除全部"
+msgid "ScanResultPolicy|Customized CI Variables"
+msgstr "自定義 CI 變數"
+
msgid "ScanResultPolicy|Except"
msgstr "除外"
@@ -40135,6 +40298,9 @@ msgstr "åš´é‡æ€§ç‚ºï¼š"
msgid "ScanResultPolicy|Status is:"
msgstr "狀態為:"
+msgid "ScanResultPolicy|Unknown"
+msgstr "未知"
+
msgid "ScanResultPolicy|When %{scanType} %{scanners} runs against the %{branches} and find(s) %{vulnerabilitiesNumber} %{boldDescription} of the following criteria:"
msgstr "當 %{scanType} %{scanners} 在 %{branches} 上é‹è¡Œä¸¦æ‰¾åˆ°ä»¥ä¸‹æ¨™æº–çš„ %{vulnerabilitiesNumber} 個 %{boldDescription} 時:"
@@ -40566,8 +40732,8 @@ msgstr "覆蓋率檢查"
msgid "SecurityApprovals|Learn more about Coverage-Check"
msgstr "了解更多關於覆蓋率檢查的訊æ¯"
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
-msgstr "測試覆蓋率é™ä½Žï¼Œéœ€æ ¸å‡†ã€‚%{linkStart}了解更多。%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more%{linkEnd}."
+msgstr "需è¦æ ¸å‡†æ‰èƒ½æ¸›å°‘測試覆蓋率, %{linkStart}了解更多%{linkEnd}。"
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr "%{featureName} åˆä½µè«‹æ±‚建立變異失敗"
@@ -40590,9 +40756,6 @@ msgstr "破壞和攻擊模擬 (BAS)"
msgid "SecurityConfiguration|Breach and Attack Simulation is an incubating feature extending existing security testing by simulating adversary activity."
msgstr "Breach and Attack Simulation 是一項孵化功能,通éŽæ¨¡æ“¬å°æ‰‹æ´»å‹•æ“´å±•ç¾æœ‰å®‰å…¨æ¸¬è©¦ã€‚"
-msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request."
-msgstr "é è¨­æƒ…æ³ä¸‹ï¼Œæ‰€æœ‰åˆ†æžå™¨éƒ½è¢«å¥—用來覆蓋您專案的所有語言,並且åªåœ¨åˆä½µè«‹æ±‚中檢測到該語言時æ‰åŸ·è¡Œã€‚"
-
msgid "SecurityConfiguration|Configuration guide"
msgstr "設定指引"
@@ -40677,9 +40840,6 @@ msgstr "%{linkStart}Auto DevOps%{linkEnd}快速啟用所有æŒçºŒæ¸¬è©¦å’Œåˆè¦
msgid "SecurityConfiguration|Runtime security metrics for application environments"
msgstr "應用程å¼ç’°å¢ƒçš„執行時安全指標"
-msgid "SecurityConfiguration|SAST Analyzers"
-msgstr "SAST分æžå·¥å…·"
-
msgid "SecurityConfiguration|SAST configuration"
msgstr "SASTé…ç½®"
@@ -40794,6 +40954,9 @@ msgstr "è¦åŸ·è¡Œçš„掃æ"
msgid "SecurityOrchestration|Are you sure you want to delete this policy? This action cannot be undone."
msgstr "您確定è¦åˆªé™¤æ­¤æ”¿ç­–嗎? æ­¤æ“作無法撤消。"
+msgid "SecurityOrchestration|Branch types don't match any existing branches."
+msgstr "資安å”調分支類型與任何ç¾æœ‰åˆ†æ”¯éƒ½ä¸åŒ¹é…。"
+
msgid "SecurityOrchestration|Choose a project"
msgstr "é¸æ“‡å°ˆæ¡ˆ"
@@ -40917,6 +41080,9 @@ msgstr "未定義è¦å‰‡ - 政策無法執行。"
msgid "SecurityOrchestration|No tags available"
msgstr "沒有å¯ç”¨çš„標記"
+msgid "SecurityOrchestration|Non-existing CI variables have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing CI variables from the policy yaml."
+msgstr "ç­–ç•¥YAML中已經檢測到了ä¸å­˜åœ¨çš„CI變數,因此,è¦å‰‡æ¨¡å¼å·²è¢«ç¦ç”¨ã€‚è¦å•Ÿç”¨è¦å‰‡æ¨¡å¼ï¼Œè«‹å¾žç­–ç•¥YAML中刪除那些ä¸å­˜åœ¨çš„CI變數。"
+
msgid "SecurityOrchestration|Non-existing DAST profiles have been detected in the policy yaml. As a result, rule mode has been disabled. To enable rule mode, remove those non-existing profiles from the policy yaml."
msgstr "在策略 yaml 中檢測到ä¸å­˜åœ¨çš„ DAST é…置文件。因此,è¦å‰‡æ¨¡å¼å·²è¢«ç¦ç”¨ï¼Œè¦å•Ÿç”¨è¦å‰‡æ¨¡å¼ï¼Œè«‹å¾žç­–ç•¥ yaml 中刪除那些ä¸å­˜åœ¨çš„設定文件。"
@@ -40959,8 +41125,8 @@ msgstr "政策類型"
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr "如果發生以下任何情æ³ï¼Œå‰‡éœ€è¦ä¾†è‡ª %{approvers} çš„ %{approvals} %{plural}:"
-msgid "SecurityOrchestration|Required approvals exceed eligible approvers"
-msgstr "所需的核准人數超éŽå¯æ ¸å‡†çš„人數"
+msgid "SecurityOrchestration|Required approvals exceed eligible approvers."
+msgstr "核准"
msgid "SecurityOrchestration|Roles"
msgstr "角色"
@@ -41101,6 +41267,9 @@ 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}æ¼æ´žå ±å‘Šçš„é‹ç‡Ÿæ¼æ´žé¸é …中%{linkEnd}查看所有代ç†çš„掃æçµæžœã€‚"
+msgid "SecurityOrchestration|Timezone is invalid"
+msgstr "時å€ç„¡æ•ˆ"
+
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr "è¦æ“´å¤§æ‚¨çš„æœå°‹ç¯„åœï¼Œè«‹åœ¨ä¸Šé¢æ›´æ”¹éŽæ¿¾è¦å‰‡æˆ–é¸æ“‡ä¸åŒçš„安全政策專案。"
@@ -41494,6 +41663,9 @@ msgstr "æ­¤æµæ°´ç·šçš„安全報告 %{helpPageLinkStart}å·²éŽæœŸ%{helpPageLinkE
msgid "SecurityReports|There was an error adding the comment."
msgstr "加入留言時發生錯誤。"
+msgid "SecurityReports|There was an error creating a Jira issue for the finding. Please try again."
+msgstr "在建立Jira議題時發生錯誤,請å†è©¦ä¸€æ¬¡ã€‚"
+
msgid "SecurityReports|There was an error creating the issue."
msgstr "建立議題時發生錯誤。"
@@ -41674,8 +41846,8 @@ msgstr "é¸æ“‡ä¸€å€‹è¿­ä»£"
msgid "Select assignee"
msgstr "é¸æ“‡æŒ‡æ´¾äºº"
-msgid "Select assignee(s)"
-msgstr "é¸æ“‡æŒ‡æ´¾äºº(s)"
+msgid "Select assignees"
+msgstr "é¸æ“‡å—指派者"
msgid "Select branch"
msgstr "é¸æ“‡åˆ†æ”¯"
@@ -41737,11 +41909,17 @@ msgstr "é¸æ“‡è¦å»ºç«‹ %{type} 的專案"
msgid "Select projects"
msgstr "é¸æ“‡å°ˆæ¡ˆ(s)"
+msgid "Select protected branch"
+msgstr "é¸æ“‡å—ä¿è­·çš„分支"
+
+msgid "Select protected branches"
+msgstr "é¸æ“‡å—ä¿è­·çš„分支"
+
msgid "Select report"
msgstr "é¸æ“‡å ±å‘Š"
-msgid "Select reviewer(s)"
-msgstr "é¸æ“‡å¯©æ ¸è€…(s)"
+msgid "Select reviewers"
+msgstr "é¸æ“‡å¯©æ ¸è€…"
msgid "Select severity (optional)"
msgstr "é¸æ“‡åš´é‡ç¨‹åº¦ (é¸å¡«)"
@@ -41887,6 +42065,9 @@ msgstr "æœå‹™å¸³è™Ÿ"
msgid "Service Account Key"
msgstr "æœå‹™å¸³è™Ÿé‡‘é‘°"
+msgid "Service Accounts"
+msgstr "æœå‹™å¸³è™Ÿ"
+
msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud project"
msgstr "æœå‹™å¸³è™Ÿé‡‘鑰授權 GitLab 部署您的 Google Cloud 專案"
@@ -41917,6 +42098,9 @@ msgstr "使用者沒有權é™åœ¨æ­¤å‘½å空間中建立æœå‹™å¸³è™Ÿã€‚"
msgid "ServiceAccount|User does not have permission to create a service account."
msgstr "使用者沒有權é™å»ºç«‹æœå‹™å¸³è™Ÿã€‚"
+msgid "ServiceDesk|Cannot create custom email"
+msgstr "無法建立自定義電å­éƒµä»¶"
+
msgid "ServiceDesk|Custom email address could not be verified."
msgstr "無法驗證自訂電å­éƒµä»¶åœ°å€ã€‚"
@@ -41926,6 +42110,12 @@ msgstr "自定義電å­éƒµä»¶åœ°å€å·²ç¶“éŽé©—證。"
msgid "ServiceDesk|Custom email address verification has already been processed and failed."
msgstr "自定義電å­éƒµä»¶åœ°å€é©—證已處ç†ä½†å¤±æ•—。"
+msgid "ServiceDesk|Custom email already exists"
+msgstr "自定義電å­éƒµä»¶å·²ç¶“存在"
+
+msgid "ServiceDesk|Custom email does not exist"
+msgstr "自定義電å­éƒµä»¶ä¸å­˜åœ¨"
+
msgid "ServiceDesk|Enable Service Desk"
msgstr "啟用æœå‹™å°"
@@ -41935,6 +42125,9 @@ msgstr "有關為您的執行個體設定æœå‹™å°çš„幫助,請è¯çµ¡ç®¡ç†å“¡
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
msgstr "從æœå‹™å°é›»å­éƒµä»¶å»ºç«‹çš„議題將顯示在此處,æ¯æ¢ç•™è¨€éƒ½æˆç‚ºé›»å­éƒµä»¶å°è©±çš„一部分。"
+msgid "ServiceDesk|Parameters missing"
+msgstr "缺少åƒæ•¸"
+
msgid "ServiceDesk|Service Desk is not enabled"
msgstr "æœå‹™å°æœªå•Ÿç”¨"
@@ -41962,6 +42155,12 @@ msgstr "您的使用者å¯ä»¥å‘以下地å€ç™¼é€é›»å­éƒµä»¶ï¼š"
msgid "ServicePing|Service ping is off"
msgstr "Service Ping 已關閉"
+msgid "ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}."
+msgstr "這å¯ä»¥éš¨æ™‚在%{link_start}您的設置%{link_end}中更改。"
+
+msgid "ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}."
+msgstr "為了幫助改進 GitLab,我們希望定期%{link_start}收集使用信æ¯%{link_end}。"
+
msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
msgstr "è¦æŸ¥çœ‹åŸ·è¡Œå€‹é«”級分æžï¼Œè«‹è®“管ç†å“¡æ‰“é–‹%{docLinkStart}Service Ping%{docLinkEnd}。"
@@ -42269,6 +42468,15 @@ msgstr "é‡ç½®è¨ˆç®—使用é‡"
msgid "SharedRunnersMinutesSettings|When you reset the compute usage for this namespace, the compute usage changes to zero."
msgstr "當您é‡ç½®æ­¤å‘½å空間的計算使用é‡æ™‚,計算使用é‡å°‡è®Šç‚ºé›¶ã€‚"
+msgid "ShellOperations|Git SSH operations rate limit"
+msgstr "Git SSH æ“作速率é™åˆ¶"
+
+msgid "ShellOperations|Limit the number of Git operations a user can perform per minute, per repository."
+msgstr "é™åˆ¶æ¯å€‹ä½¿ç”¨è€…在æ¯å€‹å„²å­˜åº«ä¸­æ¯åˆ†é˜å¯ä»¥åŸ·è¡Œçš„ Git æ“作數é‡ã€‚"
+
+msgid "ShellOperations|Maximum number of Git operations per minute"
+msgstr "æ¯åˆ†é˜æœ€å¤§ Git æ“作數"
+
msgid "Shimo|Go to Shimo Workspace"
msgstr "å‰å¾€ Shimo 工作å€"
@@ -42353,8 +42561,8 @@ msgstr "顯示完整的原始日誌"
msgid "Show details"
msgstr "顯示詳情"
-msgid "Show failed jobs"
-msgstr "顯示失敗的作業"
+msgid "Show failed jobs (%{count})"
+msgstr "顯示失敗的作業 (%{count})"
msgid "Show file browser"
msgstr "顯示文件ç€è¦½å™¨"
@@ -42362,9 +42570,6 @@ msgstr "顯示文件ç€è¦½å™¨"
msgid "Show file contents"
msgstr "顯示文件內容"
-msgid "Show filters"
-msgstr "顯示éŽæ¿¾å™¨"
-
msgid "Show full blame"
msgstr "顯示完整的歸責 (blame)"
@@ -42672,8 +42877,8 @@ msgstr "大å°"
msgid "Size Limits"
msgstr "大å°é™åˆ¶"
-msgid "Size limit per repository (MB)"
-msgstr "æ¯å€‹ç‰ˆæœ¬åº«çš„大å°é™åˆ¶ (MB)"
+msgid "Size limit per repository (MiB)"
+msgstr "æ¯å€‹å­˜å„²åº«çš„大å°é™åˆ¶ (MiB)"
msgid "Skip to main content"
msgstr "跳到主è¦å…§å®¹"
@@ -42897,6 +43102,9 @@ msgstr "檔案å稱(例如 test.rb)"
msgid "Snippets|Files"
msgstr "文件"
+msgid "Snippets|Snippets are limited to %{total} files."
+msgstr "片段被é™åˆ¶ç‚º %{total} 個文件。"
+
msgid "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them."
msgstr "片段ä¸èƒ½åŒ…å«ç©ºæ–‡ä»¶ã€‚確ä¿æ‰€æœ‰æ–‡ä»¶éƒ½æœ‰å…§å®¹ï¼Œæˆ–者刪除它們。"
@@ -43467,6 +43675,9 @@ msgstr "垃圾訊æ¯æ—¥èªŒå·²æˆåŠŸæ”¹ç‚ºæœ‰æ•ˆè¨Šæ¯æ交。"
msgid "Specific branches"
msgstr "特定分支"
+msgid "Specific protected branches"
+msgstr "ä¿è­·ç‰¹å®šçš„分支"
+
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr "無法使用指定的URL:「%{reason}ã€"
@@ -43605,9 +43816,6 @@ msgstr "開始內部線程"
msgid "Start merge train"
msgstr "å•Ÿå‹•åˆä½µä½‡åˆ—"
-msgid "Start merge train when pipeline succeeds"
-msgstr "æµæ°´ç·šæˆåŠŸæ™‚å•Ÿå‹•åˆä½µä½‡åˆ—"
-
msgid "Start merge train..."
msgstr "å•Ÿå‹•åˆä½µä½‡åˆ—..."
@@ -43809,9 +44017,6 @@ msgstr "設定文件"
msgid "StatusPage|your status page frontend."
msgstr "您的狀態é é¢å‰ç«¯"
-msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
-msgstr "通éŽè¨­å®šPrometheus來監控您的部署,了解環境的效能和å¥åº·åº¦çš„最新狀態。"
-
msgid "Step %{currentStep} of %{stepCount}"
msgstr "第 %{currentStep} 步,共 %{stepCount} 步"
@@ -43860,8 +44065,8 @@ msgstr "未知"
msgid "Store your files, plan your work, collaborate on code, and more."
msgstr "儲存您的文件ã€è¦åŠƒæ‚¨çš„工作ã€ç¨‹å¼ç¢¼å”作等等。"
-msgid "Strikethrough"
-msgstr "刪除線"
+msgid "Strikethrough (%{modifierKey}%{shiftKey}X)"
+msgstr "刪除線 (%{modifierKey}%{shiftKey}X)"
msgid "Strikethrough text"
msgstr "刪除線文字"
@@ -44295,6 +44500,12 @@ msgstr "摘è¦/註釋"
msgid "Summary comment (optional)"
msgstr "摘è¦è©•è«–(å¯é¸ï¼‰"
+msgid "Summary generated by AI"
+msgstr "ç”± AI 產生的摘è¦"
+
+msgid "Summary will be generated with the next push to this merge request and will appear here."
+msgstr "摘è¦å°‡åœ¨ä¸‹ä¸€æ¬¡æŽ¨é€åˆ°æ­¤åˆä½µè«‹æ±‚時產生,並顯示在這裡。"
+
msgid "Sun"
msgstr "星期日"
@@ -44521,11 +44732,11 @@ msgstr "切æ›åˆ†æ”¯/標籤"
msgid "Switch to GitLab Next"
msgstr "切æ›åˆ°GitLab é è¦½ç‰ˆ"
-msgid "Switch to Markdown"
-msgstr "切æ›åˆ° Markdown"
+msgid "Switch to plain text editing"
+msgstr "切æ›åˆ°ç´”文字編輯"
-msgid "Switch to rich text"
-msgstr "切æ›åˆ°å¯Œæ–‡æœ¬"
+msgid "Switch to rich text editing"
+msgstr "切æ›åˆ°å¯Œæ–‡æœ¬ç·¨è¼¯"
msgid "Switch to the source to copy the file contents"
msgstr "切æ›åˆ°ä¾†æºä»¥è¤‡è£½æ–‡ä»¶å…§å®¹"
@@ -44788,8 +44999,8 @@ msgstr "å·²ä¿è­·"
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
msgstr "查看文件以了解 GitLab 的所有功能。"
-msgid "TanukiBot|Ask GitLab Chat"
-msgstr "è©¢å• GitLab å³æ™‚åŒè¨Š"
+msgid "TanukiBot|Ask GitLab Duo"
+msgstr "è©¢å• GitLab Duo"
msgid "TanukiBot|Ask a question about GitLab"
msgstr "å•ä¸€å€‹é—œæ–¼GitLabçš„å•é¡Œ"
@@ -44873,6 +45084,21 @@ msgstr "在建立或更新åˆä½µè«‹æ±‚後觸發 TeamCity CI"
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr "æ¯æ¬¡æŽ¨é€åˆ°ç‰ˆæœ¬åº«å¾Œè§¸ç™¼ TeamCity CI,分支刪除除外"
+msgid "TelegramIntegration|Leave blank to use your current token."
+msgstr "Telegramæ•´åˆç•™ç©ºç™½ä½¿ç”¨æ‚¨ç•¶å‰çš„令牌。"
+
+msgid "TelegramIntegration|New token"
+msgstr "新令牌"
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram."
+msgstr "將專案事件的通知發é€åˆ° Telegram。"
+
+msgid "TelegramIntegration|Send notifications about project events to Telegram. %{docs_link}"
+msgstr "將專案事件的通知發é€åˆ° Telegram。%{docs_link}"
+
+msgid "TelegramIntegration|Unique authentication token."
+msgstr "唯一身份驗證令牌。"
+
msgid "Telephone number"
msgstr "電話號碼"
@@ -45043,9 +45269,6 @@ msgstr "報告的資æºè®Šæ›´: 加入%{addNum}é …, 更改%{changeNum}é …, 刪除
msgid "Terraform|Terraform init command"
msgstr "Terraform init 指令"
-msgid "Terraform|Terraform reports"
-msgstr "Terraform 報告"
-
msgid "Terraform|Terraform states"
msgstr "Terraform 狀態"
@@ -45295,9 +45518,6 @@ msgstr "議題追蹤用於管ç†éœ€æ±‚改進或者解決的å•é¡Œ"
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr "議題追蹤用於管ç†éœ€æ±‚改進或者解決的å•é¡Œã€‚請註冊或登入後為當å‰å°ˆæ¡ˆå»ºç«‹è­°é¡Œã€‚"
-msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
-msgstr "Prometheus伺æœå™¨ä»¥ã€ŒéŒ¯èª¤è«‹æ±‚ã€å›žæ‡‰ã€‚請檢查您的查詢是å¦æ­£ç¢ºï¼Œä¸¦ä¸”支æ´ç•¶å‰çš„Prometheus版本。%{documentationLink}"
-
msgid "The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}."
msgstr "Slack 通知整åˆå·²è¢«æ£„用,將在未來版本中移除。è¦ç¹¼çºŒæŽ¥æ”¶ä¾†è‡ª Slack 的通知,請改用 GitLab for Slack 應用程å¼ã€‚ %{learn_more_link_start}了解更多%{link_end}。"
@@ -45376,15 +45596,15 @@ msgstr "ç›®å‰è­°é¡Œ"
msgid "The current user is not authorized to access the job log."
msgstr "當å‰ä½¿ç”¨è€…無權存å–作業日誌。"
+msgid "The current user is not authorized to create the pipeline schedule"
+msgstr "ç›®å‰ä½¿ç”¨è€…沒有權é™ä¾†å»ºç«‹æµæ°´ç·šæŽ’程"
+
msgid "The current user is not authorized to update the pipeline schedule"
msgstr "當å‰çš„使用者未被授與更新管é“排程的權é™"
msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr "æ­¤æµæ°´ç·šä¸­çš„資料太舊,無法呈ç¾ç‚ºåœ–形。請檢查作業é¸é …é ä»¥å­˜å–æ­·å²è³‡æ–™ã€‚"
-msgid "The data source is connected, but there is no data to display. %{documentationLink}"
-msgstr "資料æºå·²é€£æŽ¥ï¼Œä½†æ²’有å¯é¡¯ç¤ºçš„資料。%{documentationLink}"
-
msgid "The date when the release is ready. A release with a date in the future is labeled as an %{linkStart}Upcoming Release%{linkEnd}."
msgstr "發布版本準備就緒的日期,具有未來日期的版本被標記為 %{linkStart}å³å°‡ç™¼å¸ƒçš„版本%{linkEnd}。"
@@ -45576,9 +45796,15 @@ msgstr "您上傳的授權許å¯ç„¡æ•ˆã€‚如果å•é¡Œä»ç„¶å­˜åœ¨ï¼Œè«‹é€šéŽ %{
msgid "The list creation wizard is already open"
msgstr "列表建立精éˆå·²æ‰“é–‹"
+msgid "The map can not be displayed because there was an error loading the GeoJSON file."
+msgstr "無法顯示地圖,因為載入 GeoJSON 檔案時發生錯誤。"
+
msgid "The maximum amount of time users have to set up two-factor authentication before it's enforced."
msgstr "使用者在強制執行之å‰å¿…須設定雙因å­é©—證的最長時間。"
+msgid "The maximum compute minutes that jobs in a namespace can use on shared runners each month. 0 for unlimited."
+msgstr "命å空間中的作業æ¯æœˆå¯åœ¨å…±äº«åŸ·è¡Œå™¨ä¸Šä½¿ç”¨çš„最大計算分é˜æ•¸ï¼Œ0 表示無é™åˆ¶ã€‚"
+
msgid "The maximum file size allowed is %{size}."
msgstr "å…許的最大檔案大å°ç‚º %{size}。"
@@ -45594,9 +45820,6 @@ msgstr "最大文件大å°ç‚º %{size}。"
msgid "The maximum number of tags that a single worker accepts for cleanup. If the number of tags goes above this limit, the list of tags to delete is truncated to this number. To remove this limit, set it to 0."
msgstr "單個worker接å—清ç†çš„最大標籤數。如果標籤數é‡è¶…éŽæ­¤é™åˆ¶ï¼Œå‰‡è¦åˆªé™¤çš„標籤列表將被截斷為該數é‡ã€‚è¦å–消此é™åˆ¶ï¼Œè«‹å°‡å…¶è¨­å®šç‚º 0。"
-msgid "The maximum units of compute that jobs in a namespace can use on shared runners each month. 0 for unlimited."
-msgstr "命å空間中的作業æ¯æœˆå¯ä»¥åœ¨å…±ç”¨çš„執行器上使用的最大計算單元,0 表示無é™åˆ¶ã€‚"
-
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
msgstr "GitLab無法解決此åˆä½µè«‹æ±‚çš„åˆä½µè¡çªã€‚請嘗試在本機解決它們。"
@@ -45723,6 +45946,9 @@ msgstr "é¸å®šçš„圖åƒå¤ªå¤§ã€‚"
msgid "The snippet can be accessed without any authentication."
msgstr "無需任何身份驗證å³å¯å­˜å–該程å¼ç¢¼ç‰‡æ®µã€‚"
+msgid "The snippet can be accessed without any authentication. To embed snippets, a project must be public."
+msgstr "無需任何身份驗證å³å¯å­˜å–該程å¼ç‰‡æ®µï¼Œè¦åµŒå…¥ç¨‹å¼ç¢¼ç‰‡æ®µï¼Œå°ˆæ¡ˆå¿…須是公開的。"
+
msgid "The snippet is visible only to me."
msgstr "該程å¼ç¢¼ç‰‡æ®µåƒ…å°æˆ‘å¯è¦‹ã€‚"
@@ -45951,6 +46177,9 @@ msgstr "å–得表情符號時出ç¾å•é¡Œã€‚"
msgid "There was a problem fetching epics."
msgstr "å–å¾—å²è©© (epics) 時出ç¾å•é¡Œã€‚"
+msgid "There was a problem fetching failed jobs"
+msgstr "無法ç²å–已失敗的作業"
+
msgid "There was a problem fetching groups."
msgstr "å–得群組時出ç¾å•é¡Œã€‚"
@@ -46161,6 +46390,9 @@ msgstr "å–得價值æµåˆ†æžè³‡æ–™æ™‚發生錯誤。"
msgid "There was an error while fetching value stream analytics duration data."
msgstr "å–得價值æµåˆ†æžæŒçºŒæ™‚間時發生錯誤。"
+msgid "There was an error while retrying this job"
+msgstr "é‡è©¦æ­¤ä½œæ¥­æ™‚發生錯誤"
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr "reCAPTCHA 驗證錯誤。請å†æ¬¡é©—è­‰ reCAPTCHA。"
@@ -46302,6 +46534,9 @@ msgstr "這個評論是由 AI 生æˆçš„"
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 "æ­¤æ交是åˆä½µè«‹æ±‚ %{link_to_merge_request} 的一部分。此處建立的留言將在該åˆä½µè«‹æ±‚的上下文中建立。"
+msgid "This commit was created in the GitLab UI, and signed with a GitLab-verified signature."
+msgstr "æ­¤æ交是在 GitLab UI 中建立的,並使用經 GitLab 驗證的簽å進行簽å。"
+
msgid "This commit was signed with a %{strong_open}verified%{strong_close} signature and the committer email is verified to belong to the same user."
msgstr "æ­¤æ交使用%{strong_open}已驗證的%{strong_close}ç°½å進行簽署,並且已驗證æ交者的電å­éƒµä»¶å±¬æ–¼åŒä¸€ä½¿ç”¨è€…。"
@@ -46561,7 +46796,7 @@ msgid "This job has been skipped"
msgstr "該作業已被跳éŽ"
msgid "This job has not been triggered yet"
-msgstr "該業還未被觸發"
+msgstr "該作業還未被觸發"
msgid "This job has not started yet"
msgstr "該業尚未開始"
@@ -46683,9 +46918,6 @@ msgstr "æ­¤é é¢å­˜æ”¾æ–¼ GitLab Pages,但內å«ä½¿ç”¨è€…撰寫的內容,ä¸
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr "該é é¢ä¸å¯ç”¨ï¼Œæ‚¨ç„¡æ¬Šè·¨å°ˆæ¡ˆé–±è®€ç›¸é—œè¨Šæ¯ã€‚"
-msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{b_open}Auto DevOps.%{b_close}"
-msgstr "該æµæ°´ç·šä½¿ç”¨äº†åŒ…å«%{b_open}Auto DevOps%{b_close}çš„é å…ˆå®šç¾©çš„CI/CD設定。"
-
msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{strongStart}Auto DevOps.%{strongEnd}"
msgstr "該æµæ°´ç·šä½¿ç”¨äº† %{strongStart}Auto DevOps%{strongEnd}é å…ˆå®šç¾©ä¸¦å·²å•Ÿç”¨çš„CI/CD設定。"
@@ -46857,9 +47089,6 @@ msgstr "壓縮 Sidekiq 作業åƒæ•¸çš„閾值(以ä½å…ƒçµ„為單ä½ï¼‰ã€‚"
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr "拒絕 Sidekiq 作業的閾值(以ä½å…ƒçµ„為單ä½ï¼‰ã€‚如果您ä¸æƒ³é™åˆ¶ Sidekiq 作業,請將其設定為 0。"
-msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
-msgstr "單次推é€ä¸­æ›´æ”¹ï¼ˆåˆ†æ”¯æˆ–標籤)的閾值數é‡ï¼Œé«˜æ–¼è©²é–¾å€¼æœƒå»ºç«‹æ‰¹æ¬¡æŽ¨é€äº‹ä»¶ï¼ˆé è¨­å€¼ç‚º 3)。"
-
msgid "Throughput"
msgstr "åžåé‡"
@@ -47139,6 +47368,9 @@ msgstr "ç¾åœ¨"
msgid "Timeago|right now"
msgstr "ç«‹å³"
+msgid "Timeline"
+msgstr "時間軸"
+
msgid "Timeline event added successfully."
msgstr "å·²æˆåŠŸåŠ å…¥æ™‚間線事件。"
@@ -47222,14 +47454,11 @@ msgstr "標題:"
msgid "Titles"
msgstr "標題"
-msgid "Titles and Descriptions"
-msgstr "標題和æè¿°"
-
msgid "To"
msgstr "到"
-msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration."
-msgstr "è¦%{link_to_help}到您的網域,請將上述金鑰加入到DNS設定中的TXT記錄。"
+msgid "To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days."
+msgstr "è¦%{link_to_help}到您的網域,請在7天內將上述金鑰加入到DNSé…置中的TXT記錄。"
msgid "To Do"
msgstr "待處ç†"
@@ -47297,6 +47526,9 @@ msgstr "ç‚ºç¢ºä¿ %{project_link} 被未計劃的刪除,請檢查 GitLab 是å
msgid "To ensure %{project_name} is unscheduled for deletion, check that activity has been logged by GitLab. For example:"
msgstr "è¦ç¢ºä¿ %{project_name} 被未計劃的刪除,請檢查 GitLab 是å¦å·²è¨˜éŒ„活動。例如:"
+msgid "To ensure no loss of access to personal content, only use this account for matters related to %{group_name}."
+msgstr "為確ä¿ä¸æœƒç§»å¤±å°å€‹äººå…§å®¹çš„å­˜å–權é™ï¼Œè«‹åªä½¿ç”¨è©²å¸³è™Ÿè™•ç†èˆ‡ %{group_name} 相關的事務。"
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr "為ä¿è­‰å€‹äººå…§å®¹ä¸éºå¤±ï¼Œæœ¬å¸³è™Ÿåƒ…用於與 %{group_name}相關的事項。"
@@ -47324,9 +47556,6 @@ msgstr "首先,請使用以下連çµç¢ºèªæ‚¨çš„帳號。"
msgid "To go to GitLab Pages, on the left sidebar, select %{pages_link}."
msgstr "è¦é€²å…¥GitLab Pages,在左å´çš„å´é‚Šæ¬„中,é¸æ“‡ %{pages_link}。"
-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}更改設定。"
-
msgid "To import an SVN repository, check out %{svn_link}."
msgstr "è¦åŒ¯å…¥SVN版本庫,請查看 %{svn_link}。"
@@ -47374,7 +47603,7 @@ msgid "To remove the %{link_start}read-only%{link_end} state and regain write ac
msgstr "è¦ç§»é™¤ %{link_start}read-only%{link_end} 狀態並é‡æ–°å–得寫入權é™ï¼Œè«‹è¦æ±‚您的頂級群組æ“有者將您頂級群組中的使用者數é‡æ¸›å°‘到 %{free_limit} 使用者或更少,或者å‡ç´šåˆ°æ²’有使用者é™åˆ¶çš„付費級別。"
msgid "To remove the %{link_start}read-only%{link_end} state and regain write access, you can reduce the number of users in your top-level group to %{free_limit} users or less. You can also upgrade to a paid tier, which do not have user limits. If you need additional time, you can start a free 30-day trial which includes unlimited users. To minimize the impact to operations, for a limited time, GitLab is offering a %{promotion_link_start}one-time 70 percent discount%{link_end} off the list price at time of purchase for a new, one year subscription of GitLab Premium SaaS to %{offer_availability_link_start}qualifying top-level groups%{link_end}. The offer is valid until %{offer_date}."
-msgstr ""
+msgstr "è¦è§£é™¤%{link_start}唯讀%{link_end}狀態並æ¢å¾©å¯«å…¥æ¬Šé™ï¼Œæ‚¨å¯ä»¥å°‡æœ€ä¸Šå±¤ç¾¤çµ„中的使用者數é‡æ¸›å°‘至 %{free_limit} 個或更少,您也å¯ä»¥å‡ç´šåˆ°ä»˜è²»æ–¹æ¡ˆï¼Œé€™äº›æ–¹æ¡ˆä¸æœƒæœ‰ä½¿ç”¨è€…é™åˆ¶ã€‚如果您需è¦é¡å¤–的時間,您å¯ä»¥é–‹å§‹äº«å—å…費的 30 天試用期,其中包括無é™åˆ¶çš„使用者數é‡ã€‚為了é™ä½Žå°ç‡Ÿé‹çš„影響,在有é™çš„時間內,GitLab æä¾›%{promotion_link_start}一次性 70%% 折扣%{link_end},å¯ç”¨æ–¼æ–°è³¼è²· GitLab Premium SaaS 一年的訂閱方案,é©ç”¨æ–¼%{offer_availability_link_start}符åˆè³‡æ ¼çš„最上層群組%{link_end},此優惠有效期至 %{offer_date}。"
msgid "To resolve this, try to:"
msgstr "è¦è§£æ±ºæ­¤å•é¡Œï¼Œè«‹å˜—試:"
@@ -47397,6 +47626,9 @@ msgstr "è¦æŸ¥çœ‹æ›´æ”¹çš„內容或建立åˆä½µè«‹æ±‚,請é¸æ“‡åˆ†æ”¯æˆ–標籤
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr "é€éŽAzure,Okta,Onelogin,Ping Identity或自訂SAML 2.0等身份驗證程å¼ç‚ºæ‚¨çš„群組設定SAML身份驗證:"
+msgid "To set up this feature, contact your administrator."
+msgstr "è¦è¨­ç½®æ­¤åŠŸèƒ½ï¼Œè«‹è¯ç¹«æ‚¨çš„管ç†å“¡ã€‚"
+
msgid "To set up this integration:"
msgstr "設定該整åˆï¼š"
@@ -47406,6 +47638,12 @@ 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 "è¦é–‹å§‹ä½¿ç”¨ä¼æ¥­ç‰ˆï¼Œè«‹ä¸Šå‚³ %{codeOpen}.gitlab-license%{codeClose} 文件或輸入您從 GitLab Inc. 收到的授權許å¯é‡‘é‘°"
+msgid "To submit your changes in a merge request, create a new fork."
+msgstr "在åˆä½µè«‹æ±‚中æ交您的變更,請建立一個新的分支。"
+
+msgid "To submit your changes in a merge request, switch to one of these forks or create a new fork."
+msgstr "在åˆä½µè«‹æ±‚中æ交您的變更,請切æ›åˆ°é€™äº›åˆ†å‰ä¹‹ä¸€æˆ–建立一個新分å‰ã€‚"
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr "è‹¥è¦å–消訂閱此議題,請將以下連çµè²¼ä¸Šåˆ°æ‚¨çš„ç€è¦½å™¨ï¼š"
@@ -47577,9 +47815,6 @@ msgstr "切æ›å´é‚Šæ¬„"
msgid "Toggle backtrace"
msgstr "切æ›å‘¼å«å †ç–Šå›žæº¯(backtrace)"
-msgid "Toggle collapse"
-msgstr "切æ›æ‘ºç–Š"
-
msgid "Toggle comments for this file"
msgstr "切æ›æ­¤æ–‡ä»¶çš„留言"
@@ -47589,6 +47824,9 @@ msgstr "é–‹é—œæ交æè¿°"
msgid "Toggle commit list"
msgstr "é–‹é—œæ交列表"
+msgid "Toggle details"
+msgstr "切æ›è©³ç´°ä¿¡æ¯"
+
msgid "Toggle emoji award"
msgstr "切æ›è¡¨æƒ…符號讚賞"
@@ -47637,12 +47875,6 @@ msgstr "令牌在撤銷å‰æœ‰æ•ˆ"
msgid "TokenRevocation|This Personal Access Token has been automatically revoked on detection. Consider investigating and rotating before marking this vulnerability as resolved."
msgstr "此個人存å–令牌已在被åµæ¸¬åˆ°æ™‚自動撤銷。在將此æ¼æ´žæ¨™è¨˜ç‚ºå·²è§£æ±ºå‰è€ƒæ…®èª¿æŸ¥èˆ‡è¼ªæ›¿ã€‚"
-msgid "Tokens|Scopes set the permission levels granted to the token."
-msgstr "設定授予令牌的權é™ç´šåˆ¥ç¯„åœã€‚"
-
-msgid "Tokens|Select scopes"
-msgstr "é¸æ“‡ç¯„åœ"
-
msgid "Tomorrow"
msgstr "明日"
@@ -47716,6 +47948,9 @@ msgstr "主題"
msgid "Topics could not be merged!"
msgstr "主題無法被åˆä½µï¼"
+msgid "Topics|Subscribe to the new projects feed"
+msgstr "訂閱新專案的 feed"
+
msgid "Total"
msgstr "全部"
@@ -48044,12 +48279,6 @@ msgstr "輸入查詢"
msgid "URL"
msgstr "URL"
-msgid "URL cannot be blank"
-msgstr "URLä¸èƒ½ç‚ºç©º"
-
-msgid "URL is invalid"
-msgstr "URL無效"
-
msgid "URL is required"
msgstr "URL為必需"
@@ -48107,9 +48336,6 @@ msgstr "無法收集CPU訊æ¯"
msgid "Unable to collect memory info"
msgstr "無法收集記憶體訊æ¯"
-msgid "Unable to connect to Prometheus server"
-msgstr "無法連接到Prometheus伺æœå™¨"
-
msgid "Unable to connect to server: %{error}"
msgstr "無法連線到伺æœå™¨: %{error}"
@@ -48293,9 +48519,6 @@ msgstr "很éºæ†¾ï¼Œæ‚¨ç™¼é€çµ¦GitLabçš„é›»å­éƒµä»¶ç„¡æ³•è™•ç†ã€‚"
msgid "Unhappy?"
msgstr "ä¸æ»¿æ„?"
-msgid "Units of compute"
-msgstr "計算單ä½"
-
msgid "Units|d"
msgstr "天"
@@ -48347,8 +48570,8 @@ msgstr "å–消關è¯"
msgid "Unlock"
msgstr "解鎖"
-msgid "Unlock %{issuableType}"
-msgstr "解鎖 %{issuableType}"
+msgid "Unlock %{issuableDisplayName}"
+msgstr "解鎖 %{issuableDisplayName}"
msgid "Unlock account"
msgstr "解鎖帳號"
@@ -48368,6 +48591,9 @@ msgstr "未鎖定"
msgid "Unlocked the discussion."
msgstr "解鎖討論。"
+msgid "Unlocking %{issuableDisplayName}"
+msgstr "解鎖 %{issuableDisplayName}"
+
msgid "Unlocks the discussion."
msgstr "解鎖討論。"
@@ -48377,9 +48603,6 @@ msgstr "無法存å–"
msgid "Unrecognized approval status."
msgstr "未識別的核准狀態。"
-msgid "Unrecognized cluster type"
-msgstr "無法識別的å¢é›†é¡žåž‹"
-
msgid "Unresolve"
msgstr "未解決"
@@ -48659,8 +48882,8 @@ msgstr "%{storage_limit_link_start}命å空間儲存é™åˆ¶%{link_end} 將很快
msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr "音頻樣本ã€è¦–é »ã€è³‡æ–™é›†å’Œåœ–形。"
-msgid "UsageQuota|Buy additional units of compute"
-msgstr "購買é¡å¤–的計算單ä½"
+msgid "UsageQuota|Buy additional compute minutes"
+msgstr "購買é¡å¤–的計算分é˜æ•¸"
msgid "UsageQuota|Buy storage"
msgstr "購買儲存"
@@ -48707,6 +48930,9 @@ msgstr "Gitlab æ•´åˆçš„ Docker 容器註冊表,用於儲存 Docker 映åƒæª”ã
msgid "UsageQuota|Group settings &gt; Usage quotas"
msgstr "群組設定 &gt; 使用é¡åº¦"
+msgid "UsageQuota|Included in %{planName} subscription"
+msgstr "包å«åœ¨ %{planName} 訂閱中"
+
msgid "UsageQuota|Includes artifacts, repositories, wiki, and other items."
msgstr "包括產出物ã€ç‰ˆæœ¬åº«ã€wiki與其他項目。"
@@ -48746,17 +48972,11 @@ msgstr "待定æˆå“¡"
msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
msgstr "用 CI/CD 建立的æµæ°´ç·šç”¢ç‰©å’Œä½œæ¥­ç”¢ç‰©ã€‚"
-msgid "UsageQuota|Pipeline artifacts created by CI/CD."
-msgstr "ç”± CI/CD 創建的æµæ°´ç·šç”¢ç‰©ã€‚"
-
msgid "UsageQuota|Pipelines"
msgstr "æµæ°´ç·š"
-msgid "UsageQuota|Purchased storage"
-msgstr "已購買的儲存空間"
-
-msgid "UsageQuota|Purchased storage used"
-msgstr "已使用的購買儲存"
+msgid "UsageQuota|Project storage included in %{planName} subscription"
+msgstr " %{planName} 訂閱中包å«å°ˆæ¡ˆå„²å­˜"
msgid "UsageQuota|Recalculate repository usage"
msgstr "é‡æ–°è¨ˆç®—版本庫使用情æ³"
@@ -48815,8 +49035,14 @@ msgstr "下方表格顯示自 %{usageSince} 以來的使用情æ³"
msgid "UsageQuota|This namespace has no projects which used shared runners in the current period"
msgstr "此命å空間目å‰æ²’有使用共享執行器的專案"
-msgid "UsageQuota|This table omits projects that used 0 units of compute or 0 shared runners duration"
-msgstr "這個表格çœç•¥äº†ä½¿ç”¨äº† 0 å–®ä½è¨ˆç®—或 0 共享執行器é‹è¡Œæ™‚間的專案"
+msgid "UsageQuota|This table omits projects that used 0 compute minutes or 0 shared runners duration"
+msgstr "該表格çœç•¥äº†ä½¿ç”¨ 0 個計算分é˜æˆ– 0 個共享執行器æŒçºŒæ™‚間的專案"
+
+msgid "UsageQuota|Total purchased storage"
+msgstr "使用é…é¡è³¼è²·ç¸½å­˜å„²é‡"
+
+msgid "UsageQuota|Total storage"
+msgstr "使用é…é¡ç¸½å­˜å„²"
msgid "UsageQuota|Transfer"
msgstr "傳輸"
@@ -49119,6 +49345,9 @@ msgstr "使用者沒有待處ç†è«‹æ±‚"
msgid "User does not have permission to create a Security Policy project."
msgstr "使用者無權建立安全策略專案。"
+msgid "User doesn't exist or you don't have permission to change namespace commit emails."
+msgstr "用戶ä¸å­˜åœ¨æˆ–您無權變更命å空間æ交電å­éƒµä»¶ã€‚"
+
msgid "User has already been deactivated"
msgstr "使用者已被åœç”¨"
@@ -49272,9 +49501,15 @@ msgstr "%{id} · %{created} 由 %{author} 建立"
msgid "UserProfile|Activity"
msgstr "活動"
+msgid "UserProfile|An error occurred loading the activity. Please refresh the page to try again."
+msgstr "載入活動時發生錯誤,請刷新é é¢é‡è©¦ã€‚"
+
msgid "UserProfile|An error occurred loading the followers. Please refresh the page to try again."
msgstr "載入關注者時發生錯誤。請é‡æ–°æ•´ç†é é¢ä»¥é‡è©¦ã€‚"
+msgid "UserProfile|An error occurred loading the following. Please refresh the page to try again."
+msgstr "載入追蹤者時發生錯誤。請é‡æ–°æ•´ç†é é¢ä¸¦å†è©¦ä¸€æ¬¡ã€‚"
+
msgid "UserProfile|An error occurred loading the personal projects. Please refresh the page to try again."
msgstr "載入個人專案時發生錯誤,請é‡æ–°æ•´ç†é é¢ä»¥é‡è©¦ã€‚"
@@ -49293,6 +49528,9 @@ msgstr "åƒèˆ‡è²¢ç»çš„專案"
msgid "UserProfile|Copy user ID"
msgstr "複製使用者ID"
+msgid "UserProfile|Copy user ID: %{id}"
+msgstr "複製使用者 ID:%{id}"
+
msgid "UserProfile|Edit profile"
msgstr "編輯個人資料"
@@ -49374,6 +49612,9 @@ msgstr "此使用者沒有關注其他使用者。"
msgid "UserProfile|Unconfirmed user"
msgstr "未確èªçš„使用者"
+msgid "UserProfile|User ID copied to clipboard"
+msgstr "已複製使用者 ID 到剪貼簿"
+
msgid "UserProfile|User ID: %{id}"
msgstr "使用者 ID:%{id}"
@@ -49623,8 +49864,8 @@ msgstr "å‰å¾€æ–‡ä»¶"
msgid "ValueStreamAnalytics|High vulnerabilities over time."
msgstr "隨著時間推移的高風險æ¼æ´žã€‚"
-msgid "ValueStreamAnalytics|Key metrics"
-msgstr "é—œéµæŒ‡æ¨™"
+msgid "ValueStreamAnalytics|Lifecycle metrics"
+msgstr "生命週期指標"
msgid "ValueStreamAnalytics|Median time an incident was open on a production environment in the given time period."
msgstr "在給定時間內,於正å¼ç’°å¢ƒä¸­æ‰€é–‹å•Ÿçš„事故中ä½æ•¸æ™‚間。"
@@ -49749,8 +49990,8 @@ msgstr "VerificationReminder|在此之å‰ï¼Œå…±ç”¨åŸ·è¡Œå™¨å°‡ä¸å¯ä½¿ç”¨ã€‚ %{
msgid "VerificationReminder|Your account has been validated"
msgstr "您的帳號已通éŽé©—證。"
-msgid "VerificationReminder|You’ll now be able to take advantage of free units of compute on shared runners."
-msgstr "您ç¾åœ¨å¯ä»¥ä½¿ç”¨å…±äº«åŸ·è¡Œå™¨ä¸Šçš„å…費計算單ä½äº†ã€‚"
+msgid "VerificationReminder|You’ll now be able to take advantage of free compute minutes on shared runners."
+msgstr "ç¾åœ¨æ‚¨å¯ä»¥å…費使用共享執行器的計算時間。"
msgid "Verified"
msgstr "已驗證"
@@ -49764,9 +50005,6 @@ msgstr "驗證SAML設定"
msgid "Verify code"
msgstr "驗證碼"
-msgid "Verify configuration"
-msgstr "驗證設定"
-
msgid "Version"
msgstr "版本"
@@ -49848,10 +50086,6 @@ msgstr "在該變更之å‰æª¢è¦–責任歸屬(blame)"
msgid "View card matches"
msgstr "查看符åˆçš„å¡ç‰‡"
-msgid "View chart"
-msgid_plural "View charts"
-msgstr[0] "查看圖表"
-
msgid "View dependency details for your project"
msgstr "查看您專案的ä¾è³´è©³ç´°è¨Šæ¯"
@@ -49877,9 +50111,6 @@ msgstr "ç€è¦½æ–‡ä»¶ @ "
msgid "View file @ %{commitSha}"
msgstr "查看文件@%{commitSha}"
-msgid "View full dashboard"
-msgstr "查看完整儀表æ¿"
-
msgid "View group in admin area"
msgstr "在管ç†å€æŸ¥çœ‹ç¾¤çµ„"
@@ -49934,9 +50165,6 @@ msgstr "查看待處ç†çš„åˆä½µè«‹æ±‚"
msgid "View page @ "
msgstr "查看é é¢ @ "
-msgid "View performance dashboard."
-msgstr "查看性能儀表æ¿ã€‚"
-
msgid "View project in admin area"
msgstr "在管ç†å€æŸ¥çœ‹å°ˆæ¡ˆ"
@@ -49953,6 +50181,9 @@ msgstr "查看å–代文件 @ "
msgid "View seat usage"
msgstr "查看席次使用情æ³"
+msgid "View summary notes"
+msgstr "查看摘è¦è¨»é‡‹"
+
msgid "View supported languages and frameworks"
msgstr "查看支æ´çš„語言和框架"
@@ -49965,9 +50196,6 @@ msgstr "查看文件"
msgid "View the latest successful deployment to this environment"
msgstr "檢視此環境中最新一次的æˆåŠŸéƒ¨ç½²"
-msgid "View the performance dashboard at"
-msgstr "查看性能儀表æ¿æ–¼"
-
msgid "View usage details"
msgstr "查看使用詳情"
@@ -50322,6 +50550,9 @@ msgstr "程å¼ç¢¼å¯©é–±"
msgid "Vulnerability|Comments"
msgstr "註釋"
+msgid "Vulnerability|Could not load prompt."
+msgstr "無法載入æ示。"
+
msgid "Vulnerability|Crash address"
msgstr "當機(Crash)地å€"
@@ -50376,6 +50607,9 @@ msgstr "檔案:"
msgid "Vulnerability|GitLab Security Report"
msgstr "GitLab 安全報告"
+msgid "Vulnerability|Hide prompt"
+msgstr "éš±è—æ示"
+
msgid "Vulnerability|Identifier"
msgstr "標識"
@@ -50451,6 +50685,9 @@ msgstr "åš´é‡ç´šåˆ¥"
msgid "Vulnerability|Severity:"
msgstr "åš´é‡æ€§ï¼š"
+msgid "Vulnerability|Show prompt"
+msgstr "顯示æ示"
+
msgid "Vulnerability|Status"
msgstr "狀態"
@@ -50508,9 +50745,6 @@ msgstr "等待核准"
msgid "Waiting for merge (open and assigned)"
msgstr "等待åˆä½µ(開啟和已指派)"
-msgid "Waiting for performance data"
-msgstr "等待效能資料"
-
msgid "Want to see the data? Please ask an administrator for access."
msgstr "權é™ä¸è¶³ã€‚如需查看相關資料,請å‘管ç†å“¡ç”³è«‹æ¬Šé™ã€‚"
@@ -50550,9 +50784,6 @@ msgstr "我們在群組%{group}中找ä¸åˆ°èˆ‡%{scope}相符åˆçš„%{term}"
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
msgstr "我們在專案%{project}中找ä¸åˆ°èˆ‡%{scope}相符åˆçš„%{term}"
-msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
-msgstr "無法連接Prometheus伺æœå™¨ã€‚伺æœå™¨ä¸å†å­˜åœ¨ï¼Œæˆ–者設定訊æ¯éœ€è¦æ›´æ–°ã€‚"
-
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
msgstr "我們在%{humanized_resource_name}檢測到潛在濫用行為。請輸入此reCAPTCHA驗證碼並繼續。"
@@ -50571,9 +50802,6 @@ msgstr "我們邀請您加入 %{featureLinkStart}請求功能%{featureLinkEnd}ï¼
msgid "We recommend a work email address."
msgstr "我們推薦一個工作電å­éƒµä»¶åœ°å€ã€‚"
-msgid "We recommend leaving all SAST analyzers enabled"
-msgstr "我們建議啟用所有 SAST 分æžå™¨"
-
msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr "我們建議您購買更多的æµæ°´ç·šæ™‚間,以é¿å…任何æœå‹™ä¸­æ–·ã€‚"
@@ -50961,6 +51189,9 @@ msgstr "這裡列出了什麼?"
msgid "What is repository mirroring?"
msgstr "什麼是版本庫é¡åƒï¼Ÿ"
+msgid "What is root cause analysis?"
+msgstr "什麼是根本原因分æžï¼Ÿ"
+
msgid "What is squashing?"
msgstr "什麼是壓縮 (Squashing)?"
@@ -51273,6 +51504,9 @@ msgstr "å–消權é™ç”³è«‹"
msgid "Won't fix / Accept risk"
msgstr "ä¸ä¿®å¾©/接å—風險"
+msgid "Work Item promoted successfully."
+msgstr "工作項已æˆåŠŸæå‡ã€‚"
+
msgid "Work Item type with id %{id} was not found"
msgstr "未找到 ID 為 %{id} 的工作項目類型"
@@ -51367,6 +51601,9 @@ msgstr "轉æ›ç‚ºä»»å‹™"
msgid "WorkItem|Converted to task"
msgstr "已轉æ›ç‚ºä»»å‹™"
+msgid "WorkItem|Copy %{workItemType} email address"
+msgstr "複製 %{workItemType} é›»å­éƒµä»¶"
+
msgid "WorkItem|Create %{workItemType}"
msgstr "建立 %{workItemType}"
@@ -51391,9 +51628,6 @@ msgstr "截止日期"
msgid "WorkItem|Existing task"
msgstr "ç¾æœ‰ä»»å‹™"
-msgid "WorkItem|Failed to award emoji"
-msgstr "未能給予表情符號"
-
msgid "WorkItem|Health status"
msgstr "å¥åº·ç‹€æ…‹"
@@ -51508,6 +51742,12 @@ msgstr "嘗試加入å­é …時發生錯誤,請é‡è©¦ã€‚"
msgid "WorkItem|Something went wrong when trying to create a child. Please try again."
msgstr "嘗試建立å­é …時發生錯誤,請å†è©¦ä¸€æ¬¡ã€‚"
+msgid "WorkItem|Something went wrong while copying the %{workItemType} email address. Please try again."
+msgstr "複製 %{workItemType} é›»å­éƒµä»¶åœ°å€æ™‚發生錯誤,請å†è©¦ä¸€æ¬¡ã€‚"
+
+msgid "WorkItem|Something went wrong while copying the %{workItemType} reference. Please try again."
+msgstr "複製 %{workItemType} åƒç…§æ™‚發生錯誤,請å†è©¦ä¸€æ¬¡ã€‚"
+
msgid "WorkItem|Something went wrong while fetching milestones. Please try again."
msgstr "讀å–里程碑時發生錯誤,請å†è©¦ä¸€æ¬¡ã€‚"
@@ -51586,6 +51826,9 @@ msgstr "工作å€æ˜¯ GitLab 中程å¼ç¢¼çš„虛擬沙箱環境,您å¯ä»¥ç‚ºå…¬é
msgid "Workspaces|Cancel"
msgstr "å–消"
+msgid "Workspaces|Could not load workspaces"
+msgstr "無法載入工作å€"
+
msgid "Workspaces|Could not retrieve cluster agents for this project"
msgstr "無法檢索此專案的å¢é›†ä»£ç†"
@@ -51682,6 +51925,9 @@ msgstr "您åªèƒ½ç‚ºå…¬é–‹å°ˆæ¡ˆå»ºç«‹å·¥ä½œå€ã€‚"
msgid "Workspaces|You can't create a workspace for this project"
msgstr "您無法為此專案建立工作å€"
+msgid "Workspaces|Your workspaces"
+msgstr "您的工作空間"
+
msgid "Would you like to create a new branch?"
msgstr "您è¦å»ºç«‹ä¸€å€‹æ–°åˆ†æ”¯å—Žï¼Ÿ"
@@ -51791,9 +52037,6 @@ msgstr "您將離開 GitLab,é‡æ–°å°Žå‘至其他é é¢"
msgid "You are billed if you exceed this number. %{qsrOverageLinkStart}How does billing work?%{qsrOverageLinkEnd}"
msgstr "如果超éŽæ­¤æ•¸å­—,將為您計費。%{qsrOverageLinkStart}計費如何é‹ä½œï¼Ÿ%{qsrOverageLinkEnd}"
-msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr "您已連接到Prometheus伺æœå™¨ï¼Œä½†ç›®å‰æ²’有資料å¯é¡¯ç¤ºã€‚"
-
msgid "You are currently offline, or the GitLab instance is not reachable."
msgstr "您當å‰è™•æ–¼é›¢ç·šç‹€æ…‹ï¼Œæˆ–者 GitLab 執行個體無法訪å•ã€‚"
@@ -52082,6 +52325,9 @@ msgstr "您ä¸èƒ½å¯«å…¥å”¯è®€çš„æ¬¡è¦ GitLab Geo 實體。請改用%{link_to_pr
msgid "You cannot write to this read-only GitLab instance."
msgstr "您ä¸èƒ½å¯«å…¥é€™å€‹å”¯è®€çš„ GitLab 實體。"
+msgid "You can’t edit files directly in this project."
+msgstr "您無法直接在此專案中編輯文件。"
+
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr "您ä¸èƒ½åœ¨é€™å€‹å°ˆæ¡ˆä¸­ç›´æŽ¥ç·¨è¼¯æ–‡ä»¶ï¼Œè«‹åˆ†å‰ï¼ˆFork)這個專案並æ交包å«æ‚¨çš„更改的åˆä½µè«‹æ±‚。"
@@ -52519,6 +52765,12 @@ msgstr "您的 GitLab Ultimate å…費試用期為 30 天,試用期çµæŸå¾Œï¼Œ
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 "由於大é‡ä¸æˆåŠŸçš„嘗試登入,您的 GitLab 帳號已被鎖定。您的帳號將在 %{duration} 自動解鎖,或者您å¯ä»¥å–®æ“Šä¸‹é¢çš„連çµç«‹å³è§£éŽ–。"
+msgid "Your GitLab account is now an %{source_link}:"
+msgstr "您的 GitLab 帳戶ç¾åœ¨æ˜¯ %{source_link}:"
+
+msgid "Your GitLab account is now an Enterprise User (%{source_link}):"
+msgstr "您的 GitLab 帳戶ç¾åœ¨æ˜¯ä¼æ¥­ç”¨æˆ¶ (%{source_link}):"
+
msgid "Your GitLab account request has been approved!"
msgstr "您的GitLab帳號建立請求已被核准ï¼"
@@ -52570,6 +52822,12 @@ msgstr "您的WebAuthn設備已註冊ï¼"
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr "æ‚¨å° %{source_type} å­˜å–請求已被撤消。"
+msgid "Your account has been blocked. Contact %{support} for assistance."
+msgstr "您的帳號已被å‡çµï¼Œè«‹è¯ç¹« %{support} å–得幫助。"
+
+msgid "Your account has been blocked. Contact your GitLab administrator for assistance."
+msgstr "您的帳號已被å‡çµã€‚è«‹è¯ç¹«æ‚¨çš„ GitLab 管ç†å“¡å–得幫助。"
+
msgid "Your account has been deactivated"
msgstr "您的帳號已被åœç”¨"
@@ -52630,8 +52888,8 @@ msgstr "由於%{reason},無法æ交您的評論。"
msgid "Your comment could not be submitted! Please check your network connection and try again."
msgstr "您的留言無法æ交ï¼è«‹æª¢æŸ¥æ‚¨çš„網路連接,然後é‡è©¦ã€‚"
-msgid "Your comment could not be updated! Please check your network connection and try again."
-msgstr "您的留言無法更新ï¼è«‹æª¢æŸ¥æ‚¨çš„網路連接,然後é‡è©¦ã€‚"
+msgid "Your comment could not be updated because %{reason}."
+msgstr "無法更新您的評論,因為 %{reason}。"
msgid "Your comment will be discarded."
msgstr "您的留言將被丟棄。"
@@ -52788,12 +53046,15 @@ msgstr "您的最上層群組 %{namespace_name} è¶…éŽ %{free_limit} 個使用è€
msgid "Your top-level group %{namespace_name} will move to a read-only state soon"
msgstr "您的最高層級群組 %{namespace_name} 將很快變為唯讀狀態。"
-msgid "Your top-level group is over the user and storage limits and has been placed in a read-only state."
-msgstr "您的最上層群組超出了使用者和儲存é™åˆ¶ï¼Œå·²è¢«ç½®æ–¼å”¯è®€ç‹€æ…‹ã€‚"
-
msgid "Your top-level group is over the user limit and has been placed in a read-only state."
msgstr "您的最上層群組超éŽä½¿ç”¨è€…é™åˆ¶ï¼Œå·²è¢«ç½®æ–¼å”¯è®€ç‹€æ…‹ã€‚"
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To ensure that your group does not become read-only, you should contact a user with the Owner role for this group to upgrade to a paid tier, or manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr "您的最上層級群組 %{group_name} æœ‰è¶…éŽ %{free_users_limit} å€‹ä½¿ç”¨è€…ä¸¦ä¸”ä½¿ç”¨äº†è¶…éŽ %{free_storage_limit} 的資料。在å°å…費最上層級群組套用使用é™åˆ¶å¾Œï¼Œæ­¤ç¾¤çµ„中的專案將處於 %{read_only_link_start}唯讀狀態%{link_end}。為確ä¿æ‚¨çš„群組ä¸æœƒè®Šæˆå”¯è®€ï¼Œæ‚¨æ‡‰è©²è¯ç¹«å…·æœ‰è©²ç¾¤çµ„çš„ Owner 角色的使用者å‡ç´šåˆ°ä»˜è²»å±¤ç´šï¼Œæˆ–管ç†æ‚¨çš„使用é‡ã€‚有關å³å°‡åˆ°ä¾†çš„使用é™åˆ¶æ›´å¤šè³‡è¨Šï¼Œè«‹åƒé–±æˆ‘們的 %{faq_link_start}常見å•é¡Œ%{link_end}。"
+
+msgid "Your top-level group, %{group_name}, has more than %{free_users_limit} users and uses more than %{free_storage_limit} of data. After usage limits are applied to Free top-level groups, projects in this group will be in a %{read_only_link_start}read-only state%{link_end}. To get more seats and additional storage, upgrade to a paid tier. You can also manage your usage. For more information about the upcoming usage limits, see our %{faq_link_start}FAQ%{link_end}"
+msgstr "您的最上層群組 %{group_name} æ“æœ‰è¶…éŽ %{free_users_limit} å€‹ä½¿ç”¨è€…ï¼Œä¸¦ä¸”ä½¿ç”¨äº†è¶…éŽ %{free_storage_limit} 的資料。在å°å…費最上層群組套用使用é™åˆ¶ä¹‹å¾Œï¼Œæ­¤ç¾¤çµ„中的專案將處於 %{read_only_link_start}唯讀狀態%{link_end}。è¦ç²å¾—更多使用者和é¡å¤–的儲存空間,請å‡ç´šåˆ°ä»˜è²»å±¤ç´šã€‚您也å¯ä»¥ç®¡ç†æ‚¨çš„使用é‡ã€‚有關å³å°‡åˆ°ä¾†çš„使用é™åˆ¶æ›´å¤šè³‡è¨Šï¼Œè«‹åƒé–±æˆ‘們的 %{faq_link_start}常見å•é¡Œ%{link_end}。"
+
msgid "Your update failed. You can only upload one design when dropping onto an existing design."
msgstr "您的更新失败,é€éŽæ‹–放到ç¾æœ‰è¨­è¨ˆçš„æ–¹å¼ï¼Œæ‚¨æ¯æ¬¡åªèƒ½ä¸Šå‚³ä¸€å€‹è¨­è¨ˆã€‚"
@@ -53082,8 +53343,8 @@ msgstr "如果啟用共用執行器(runners),則無法更改"
msgid "cannot be changed since member is associated with a custom role"
msgstr "æˆå“¡èˆ‡è‡ªå®šç¾©è§’色相關è¯å³ç„¡æ³•è¢«æ›´æ”¹"
-msgid "cannot be changed to %{new_type} with %{parent_type} as parent type."
-msgstr "ä¸èƒ½æŠŠçˆ¶é¡žåž‹ç‚º %{parent_type} æ›´æ”¹æˆ %{new_type}。"
+msgid "cannot be changed to %{new_type} when linked to a parent %{parent_type}."
+msgstr "連接到父項 %{parent_type}時ä¸èƒ½è®Šæ›´ç‚º %{new_type}。"
msgid "cannot be changed to %{new_type} with these child item types."
msgstr "這些å­é …目類型ä¸èƒ½æ›´æ”¹ç‚º %{new_type}。"
@@ -53508,10 +53769,8 @@ msgid "closed %{timeago}"
msgstr "於 %{timeago} 關閉"
msgid "closed issue"
-msgstr "已關閉議題"
-
-msgid "collect usage information"
-msgstr "收集使用訊æ¯"
+msgid_plural "closed issues"
+msgstr[0] "已關閉的議題"
msgid "comment"
msgstr "留言"
@@ -53730,18 +53989,6 @@ msgstr[0] "文件"
msgid "finding is not found or is already attached to a vulnerability"
msgstr "çµæžœç„¡æ³•æ‰¾åˆ°æˆ–已與æ¼æ´žé—œè¯ã€‚"
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
-msgstr "使用%{link_to_merge_request}於%{link_to_merge_request_source_branch}"
-
-msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}"
-msgstr "使用%{link_to_merge_request}ç”±%{link_to_merge_request_source_branch}åˆä½µåˆ°%{link_to_merge_request_target_branch}"
-
-msgid "for %{link_to_pipeline_ref}"
-msgstr "æ–¼%{link_to_pipeline_ref}"
-
-msgid "for %{ref}"
-msgstr "æ–¼%{ref}"
-
msgid "for Workspace is required to be public"
msgstr "工作å€å¿…須設置為公開"
@@ -53846,8 +54093,8 @@ msgstr "æ–¼"
msgid "in %{duration} and was queued for %{queued_duration}"
msgstr "在 %{duration} 排隊等候 %{queued_duration}。"
-msgid "in %{duration}, using %{compute_credits} compute credits, and was queued for %{queued_duration}"
-msgstr "在 %{duration} 內,使用 %{compute_credits} 計算ç©åˆ†ï¼Œä¸¦æŽ’隊等候 %{queued_duration}"
+msgid "in %{duration}, using %{compute_minutes} compute minutes, and was queued for %{queued_duration}"
+msgstr "在 %{duration} 內,使用了 %{compute_minutes} 分é˜çš„計算時間,並且排隊等候 %{queued_duration} "
msgid "in group %{link_to_group}"
msgstr "在 %{link_to_group} 群組"
@@ -53855,6 +54102,9 @@ msgstr "在 %{link_to_group} 群組"
msgid "in project %{link_to_project}"
msgstr "在 %{link_to_project} 專案"
+msgid "incident"
+msgstr "事故"
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] "實體已完æˆ"
@@ -54038,9 +54288,6 @@ msgstr "ä»ç„¶è¼‰å…¥"
msgid "loading"
msgstr "載入中"
-msgid "locked"
-msgstr "鎖定"
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr "被 %{path_lock_user_name} 在 %{created_at} 鎖定"
@@ -54217,9 +54464,6 @@ msgstr "%{rules} 無效è¦å‰‡å·²è¢«è‡ªå‹•æ ¸å‡†"
msgid "mrWidget|%{rules} invalid rules have been approved automatically"
msgstr "%{rules} 無效è¦å‰‡å·²è¢«è‡ªå‹•æ ¸å‡†"
-msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
-msgstr "åˆä½µä½‡åˆ—是等待åˆä½µåˆ°ç›®æ¨™åˆ†æ”¯çš„åˆä½µè«‹æ±‚列表。æ¯å€‹åˆä½µè«‹æ±‚中的變動與先å‰åˆä½µè«‹æ±‚中的變動相çµåˆï¼Œç„¶å¾Œåœ¨åˆä½µå‰é€²è¡Œæ¸¬è©¦ã€‚"
-
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr "æ–°åˆä½µä½‡åˆ—已經啟動,此åˆä½µè«‹æ±‚ä½æ–¼åˆä½µä½‡åˆ—中的第一ä½ã€‚"
@@ -54339,9 +54583,6 @@ msgstr "åˆä½µå¤±æ•—。"
msgid "mrWidget|Merged by"
msgstr "åˆä½µè€…:"
-msgid "mrWidget|More information"
-msgstr "更多訊æ¯"
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr "請還原它或使用ä¸åŒçš„ %{type} 分支。"
@@ -54405,17 +54646,17 @@ msgstr "該åˆä½µè«‹æ±‚未能自動åˆä½µ"
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr "è¦æ ¸å‡†æ­¤åˆä½µè«‹æ±‚,請輸入您的密碼。此專案需è¦æ‰€æœ‰æ ¸å‡†æ‰èƒ½èªè­‰ã€‚"
-msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
-msgstr "è¦æ›´æ”¹æ­¤é è¨­è¨Šæ¯ï¼Œè«‹ç·¨è¼¯åˆä½µèˆ‡å£“縮 (Squash) æ交訊æ¯çš„範本。%{linkStart}了解更多訊æ¯ã€‚%{linkEnd}"
+msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more%{linkEnd}."
+msgstr "è¦è®Šæ›´é è¨­è¨Šæ¯ï¼Œè«‹ç·¨è¼¯åˆä½µèˆ‡å£“縮éžäº¤è¨Šæ¯çš„範本。%{linkStart}å–得更多資訊%{linkEnd}。"
-msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
-msgstr "è¦æ›´æ”¹æ­¤é è¨­è¨Šæ¯ï¼Œè«‹ç·¨è¼¯åˆä½µæ交訊æ¯çš„範本。 %{linkStart}了解更多訊æ¯ã€‚%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more%{linkEnd}."
+msgstr "è¦è®Šæ›´é è¨­è¨Šæ¯ï¼Œè«‹ç·¨è¼¯åˆä½µéžäº¤è¨Šæ¯çš„範本。%{linkStart}å–得更多資訊%{linkEnd}。"
-msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
-msgstr "è¦æ›´æ”¹æ­¤é è¨­è¨Šæ¯ï¼Œè«‹ç·¨è¼¯å£“縮 (Squash) æ交訊æ¯çš„範本。 %{linkStart}了解更多訊æ¯ã€‚%{linkEnd}"
+msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more%{linkEnd}."
+msgstr "è¦è®Šæ›´é è¨­è¨Šæ¯ï¼Œè«‹ç·¨è¼¯å£“縮éžäº¤è¨Šæ¯çš„範本。%{linkStart}å–得更多資訊%{linkEnd}。"
-msgid "mrWidget|What is a merge train?"
-msgstr "什麼是åˆä½µä½‡åˆ—?"
+msgid "mrWidget|Your merge request is almost ready!"
+msgstr "您的åˆä½µè«‹æ±‚å³å°‡å®Œæˆï¼"
msgid "mrWidget|Your password"
msgstr "您的密碼"
@@ -54453,6 +54694,12 @@ msgstr "必須與群組或專案相關è¯"
msgid "must be at least 1 day"
msgstr "必須至少為 1 天"
+msgid "must be before %{expiry_date}"
+msgstr "必須在 %{expiry_date}之å‰"
+
+msgid "must be false when email confirmation setting is off"
+msgstr "當電å­éƒµä»¶ç¢ºèªè¨­ç½®é—œé–‰æ™‚,必須為 false"
+
msgid "must be greater than start date"
msgstr "必須大於開始日期"
@@ -54486,9 +54733,6 @@ msgstr "必須屬於該工作項目的åŒä¸€å°ˆæ¡ˆã€‚"
msgid "must contain only a discord user ID."
msgstr "必須僅包å«ä¸€å€‹ Discord 使用者 ID。"
-msgid "must expire in 365 days"
-msgstr "必須在 365 天後到期"
-
msgid "must have a repository"
msgstr "必須有一個版本庫"
@@ -54568,7 +54812,8 @@ msgid "only supports valid HTTP(S) URLs"
msgstr "僅支æ´æœ‰æ•ˆçš„ HTTP(S) URL"
msgid "open issue"
-msgstr "開啟議題"
+msgid_plural "open issues"
+msgstr[0] "開啟的議題"
msgid "or"
msgstr "或"
@@ -54889,6 +55134,9 @@ msgstr "標籤å稱"
msgid "terraform states"
msgstr "terraform 狀態"
+msgid "test case"
+msgstr "測試案例"
+
msgid "the correct format."
msgstr "正確的格å¼ã€‚"
@@ -54946,9 +55194,6 @@ msgstr "缺少類型åƒæ•¸ä¸¦ä¸”是必需的"
msgid "unicode domains should use IDNA encoding"
msgstr "Unicode 網域應使用 IDNA 編碼"
-msgid "unlocked"
-msgstr "解鎖"
-
msgid "updated"
msgstr "已更新"
@@ -55071,9 +55316,6 @@ msgstr "您的 GitLab 執行個體"
msgid "your group (%{group_name})"
msgstr "您的群組(%{group_name})"
-msgid "your settings"
-msgstr "你的設定"
-
msgid "yyyy-mm-dd"
msgstr "yyyy-mm-dd"
diff --git a/metrics_server/dependencies.rb b/metrics_server/dependencies.rb
index 233511eb505..c96fecd7cb7 100644
--- a/metrics_server/dependencies.rb
+++ b/metrics_server/dependencies.rb
@@ -11,11 +11,11 @@ require 'active_support/core_ext/numeric/bytes'
require 'prometheus/client'
require 'rack'
+require 'gitlab/utils/all'
+
require_relative 'settings_overrides'
require_relative '../lib/gitlab/daemon'
-require_relative '../lib/gitlab/utils'
-require_relative '../lib/gitlab/utils/strong_memoize'
require_relative '../lib/prometheus/cleanup_multiproc_dir_service'
require_relative '../lib/gitlab/metrics/prometheus'
require_relative '../lib/gitlab/metrics'
diff --git a/metrics_server/metrics_server.rb b/metrics_server/metrics_server.rb
index 530f3a000a9..7d4968f930c 100644
--- a/metrics_server/metrics_server.rb
+++ b/metrics_server/metrics_server.rb
@@ -7,10 +7,6 @@ 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
@@ -28,45 +24,10 @@ class MetricsServer # rubocop:disable Gitlab/NamespacedClass
end
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?
-
- settings = settings_value(target)
- path = options[:path]&.then { |p| Pathname.new(p) } || Pathname.new('')
- cmd = path.join('gitlab-metrics-exporter').to_path
- env = {
- 'GOGC' => '10', # Set Go GC heap goal to 10% to curb memory growth.
- 'GME_MMAP_METRICS_DIR' => metrics_dir.to_s,
- 'GME_PROBES' => 'self,mmap,mmap_stats',
- '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(target)}.log")
- env['GME_LOG_LEVEL'] = 'info'
- else
- env['GME_LOG_LEVEL'] = 'quiet'
- end
-
- if settings['tls_enabled']
- env['GME_CERT_FILE'] = settings['tls_cert_path']
- env['GME_CERT_KEY'] = settings['tls_key_path']
- end
-
- Process.spawn(env, cmd, err: $stderr, out: $stdout, pgroup: true).tap do |pid|
- Process.detach(pid)
- end
+ self.fork('sidekiq', **options)
end
- def spawn_ruby_server(target, metrics_dir:, wipe_metrics_dir: false, **options)
+ def spawn(target, metrics_dir:, wipe_metrics_dir: false)
ensure_valid_target!(target)
cmd = "#{Rails.root}/bin/metrics-server"
@@ -126,10 +87,6 @@ class MetricsServer # rubocop:disable Gitlab/NamespacedClass
end
end
- 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
diff --git a/package.json b/package.json
index e679bed69c5..7677d108133 100644
--- a/package.json
+++ b/package.json
@@ -17,6 +17,7 @@
"jest:ci:predictive": "jest --config jest.config.js --ci --coverage --findRelatedTests $(cat $RSPEC_CHANGED_FILES_PATH) $(cat $RSPEC_MATCHING_JS_FILES_PATH) --passWithNoTests --testSequencer ./scripts/frontend/parallel_ci_sequencer.js",
"jest:contract": "PACT_DO_NOT_TRACK=true jest --config jest.config.contract.js --runInBand",
"jest:integration": "jest --config jest.config.integration.js",
+ "jest:quarantine": "grep -r 'quarantine:' spec/frontend ee/spec/frontend",
"lint:eslint": "node scripts/frontend/eslint.js",
"lint:eslint:fix": "node scripts/frontend/eslint.js --fix",
"lint:eslint:all": "node scripts/frontend/eslint.js .",
@@ -55,15 +56,15 @@
"@gitlab/at.js": "1.5.7",
"@gitlab/cluster-client": "^1.2.0",
"@gitlab/favicon-overlay": "2.0.0",
- "@gitlab/fonts": "^1.2.0",
- "@gitlab/svgs": "3.53.0",
- "@gitlab/ui": "64.10.1",
+ "@gitlab/fonts": "^1.3.0",
+ "@gitlab/svgs": "3.55.0",
+ "@gitlab/ui": "64.20.1",
"@gitlab/visual-review-tools": "1.7.3",
- "@gitlab/web-ide": "0.0.1-dev-20230614124516",
+ "@gitlab/web-ide": "0.0.1-dev-20230713160749",
"@mattiasbuelens/web-streams-adapter": "^0.1.0",
"@popperjs/core": "^2.11.2",
- "@rails/actioncable": "6.1.4-7",
- "@rails/ujs": "6.1.4-7",
+ "@rails/actioncable": "7.0.6",
+ "@rails/ujs": "7.0.6",
"@snowplow/browser-plugin-client-hints": "^3.9.0",
"@snowplow/browser-plugin-form-tracking": "^3.9.0",
"@snowplow/browser-plugin-ga-cookies": "^3.9.0",
@@ -178,7 +179,7 @@
"popper.js": "^1.16.1",
"portal-vue": "^2.1.7",
"postcss": "8.4.14",
- "prosemirror-markdown": "1.11.0",
+ "prosemirror-markdown": "1.11.1",
"raphael": "^2.2.7",
"raw-loader": "^4.0.2",
"rehype-raw": "^6.1.1",
@@ -230,7 +231,7 @@
"devDependencies": {
"@gitlab/eslint-plugin": "19.0.0",
"@gitlab/stylelint-config": "4.1.0",
- "@graphql-eslint/eslint-plugin": "3.19.1",
+ "@graphql-eslint/eslint-plugin": "3.20.0",
"@testing-library/dom": "^7.16.2",
"@types/jest": "^28.1.3",
"@vue/compat": "^3.2.47",
@@ -247,7 +248,7 @@
"cheerio": "^1.0.0-rc.9",
"commander": "^2.20.3",
"custom-jquery-matchers": "^2.1.0",
- "eslint": "8.41.0",
+ "eslint": "8.44.0",
"eslint-import-resolver-jest": "3.0.2",
"eslint-import-resolver-webpack": "0.13.2",
"eslint-plugin-import": "^2.27.5",
@@ -267,7 +268,8 @@
"jest-jasmine2": "^28.1.3",
"jest-junit": "^12.3.0",
"jest-util": "^28.1.3",
- "markdownlint-cli": "0.32.2",
+ "markdownlint-cli": "0.35.0",
+ "markdownlint-rule-helpers": "^0.20.0",
"miragejs": "^0.1.40",
"mock-apollo-client": "1.2.0",
"nodemon": "^2.0.19",
diff --git a/patches/@rails+ujs+6.1.4-7.patch b/patches/@rails+ujs+6.1.4-7.patch
deleted file mode 100644
index 35669852e9f..00000000000
--- a/patches/@rails+ujs+6.1.4-7.patch
+++ /dev/null
@@ -1,16 +0,0 @@
-diff --git a/node_modules/@rails/ujs/lib/assets/compiled/rails-ujs.js b/node_modules/@rails/ujs/lib/assets/compiled/rails-ujs.js
-index 2176247..1a83d48 100644
---- a/node_modules/@rails/ujs/lib/assets/compiled/rails-ujs.js
-+++ b/node_modules/@rails/ujs/lib/assets/compiled/rails-ujs.js
-@@ -265,11 +265,6 @@ Released under the MIT license
- try {
- response = JSON.parse(response);
- } catch (error) {}
-- } else if (type.match(/\b(?:java|ecma)script\b/)) {
-- script = document.createElement('script');
-- script.setAttribute('nonce', cspNonce());
-- script.text = response;
-- document.head.appendChild(script).parentNode.removeChild(script);
- } else if (type.match(/\b(xml|html|svg)\b/)) {
- parser = new DOMParser();
- type = type.replace(/;.+/, '');
diff --git a/patches/@rails+ujs+7.0.6.patch b/patches/@rails+ujs+7.0.6.patch
new file mode 100644
index 00000000000..65a4eb029b8
--- /dev/null
+++ b/patches/@rails+ujs+7.0.6.patch
@@ -0,0 +1,16 @@
+diff --git a/node_modules/@rails/ujs/lib/assets/compiled/rails-ujs.js b/node_modules/@rails/ujs/lib/assets/compiled/rails-ujs.js
+index d428163..010eaa5 100644
+--- a/node_modules/@rails/ujs/lib/assets/compiled/rails-ujs.js
++++ b/node_modules/@rails/ujs/lib/assets/compiled/rails-ujs.js
+@@ -281,11 +281,6 @@ Released under the MIT license
+ try {
+ response = JSON.parse(response);
+ } catch (error) {}
+- } else if (type.match(/\b(?:java|ecma)script\b/)) {
+- script = document.createElement('script');
+- script.setAttribute('nonce', cspNonce());
+- script.text = response;
+- document.head.appendChild(script).parentNode.removeChild(script);
+ } else if (type.match(/\b(xml|html|svg)\b/)) {
+ parser = new DOMParser();
+ type = type.replace(/;.+/, '');
diff --git a/qa/Dockerfile b/qa/Dockerfile
index bd9cd166701..213ec3450cb 100644
--- a/qa/Dockerfile
+++ b/qa/Dockerfile
@@ -40,6 +40,8 @@ WORKDIR /home/gitlab/qa
# Install qa dependencies or fetch from cache if unchanged
#
COPY ./qa/Gemfile* /home/gitlab/qa/
+COPY ./vendor/gems/ /home/gitlab/vendor/gems/
+COPY ./gems/ /home/gitlab/gems/
RUN bundle config set --local without development \
&& bundle install --retry=3
@@ -47,7 +49,6 @@ COPY ./config/initializers/0_inject_enterprise_edition_module.rb /home/gitlab/co
COPY ./config/feature_flags /home/gitlab/config/feature_flags
COPY ./config/bundler_setup.rb /home/gitlab/config/
COPY ./lib/gitlab_edition.rb /home/gitlab/lib/
-COPY ./lib/gitlab/utils.rb /home/gitlab/lib/gitlab/
COPY ./INSTALLATION_TYPE ./VERSION /home/gitlab/
COPY ./qa /home/gitlab/qa
diff --git a/qa/Gemfile b/qa/Gemfile
index a06914ca7de..e9616f29731 100644
--- a/qa/Gemfile
+++ b/qa/Gemfile
@@ -2,9 +2,10 @@
source 'https://rubygems.org'
-gem 'gitlab-qa', '~> 11', '>= 11.2.0', require: 'gitlab/qa'
-gem 'gitlab_quality-test_tooling', '~> 0.8.1', require: false
-gem 'activesupport', '~> 6.1.7.2' # This should stay in sync with the root's Gemfile
+gem 'gitlab-qa', '~> 12', '>= 12.1.0', require: 'gitlab/qa'
+gem 'gitlab_quality-test_tooling', '~> 0.8.3', require: false
+gem 'gitlab-utils', path: '../gems/gitlab-utils'
+gem 'activesupport', '~> 7.0.5.1' # This should stay in sync with the root's Gemfile
gem 'allure-rspec', '~> 2.20.0'
gem 'capybara', '~> 3.39.2'
gem 'capybara-screenshot', '~> 1.0.26'
@@ -39,7 +40,7 @@ gem 'chemlab', '~> 0.10'
gem 'chemlab-library-www-gitlab-com', '~> 0.1', '>= 0.1.1'
# dependencies for jenkins client
-gem 'nokogiri', '~> 1.15', '>= 1.15.2'
+gem 'nokogiri', '~> 1.15', '>= 1.15.3'
gem 'deprecation_toolkit', '~> 2.0.3', require: false
diff --git a/qa/Gemfile.lock b/qa/Gemfile.lock
index e4e89e7e2e1..521f101ee4d 100644
--- a/qa/Gemfile.lock
+++ b/qa/Gemfile.lock
@@ -1,12 +1,27 @@
+PATH
+ remote: ../gems/gitlab-utils
+ specs:
+ gitlab-utils (0.1.0)
+ actionview (>= 6.1.7.2)
+ activesupport (>= 6.1.7.2)
+ addressable (~> 2.8)
+ nokogiri (~> 1.15.2)
+ rake (~> 13.0)
+
GEM
remote: https://rubygems.org/
specs:
- activesupport (6.1.7.2)
+ actionview (7.0.5.1)
+ activesupport (= 7.0.5.1)
+ builder (~> 3.1)
+ erubi (~> 1.4)
+ rails-dom-testing (~> 2.0)
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
+ activesupport (7.0.5.1)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 1.6, < 2)
minitest (>= 5.1)
tzinfo (~> 2.0)
- zeitwerk (~> 2.3)
addressable (2.8.1)
public_suffix (>= 2.0.2, < 6.0)
airborne (0.3.7)
@@ -55,6 +70,7 @@ GEM
confiner (0.4.0)
gitlab (>= 4.17)
zeitwerk (>= 2.5, < 3)
+ crass (1.0.6)
debug_inspector (1.1.0)
declarative (0.0.20)
deprecation_toolkit (2.0.3)
@@ -62,6 +78,7 @@ GEM
diff-lcs (1.3)
domain_name (0.5.20190701)
unf (>= 0.0.5, < 1.0.0)
+ erubi (1.12.0)
excon (0.92.4)
faker (3.2.0)
i18n (>= 1.8.11, < 2)
@@ -102,8 +119,8 @@ GEM
gitlab (4.19.0)
httparty (~> 0.20)
terminal-table (>= 1.5.1)
- gitlab-qa (11.2.0)
- activesupport (~> 6.1)
+ gitlab-qa (12.1.0)
+ activesupport (>= 6.1, < 7.1)
gitlab (~> 4.19)
http (~> 5.0)
nokogiri (~> 1.10)
@@ -111,7 +128,7 @@ GEM
rainbow (>= 3, < 4)
table_print (= 1.5.7)
zeitwerk (>= 2, < 3)
- gitlab_quality-test_tooling (0.8.1)
+ gitlab_quality-test_tooling (0.8.3)
activesupport (>= 6.1, < 7.1)
gitlab (~> 4.19)
http (~> 5.0)
@@ -176,6 +193,9 @@ GEM
llhttp-ffi (0.4.0)
ffi-compiler (~> 1.0)
rake (~> 13.0)
+ loofah (2.21.3)
+ crass (~> 1.0.2)
+ nokogiri (>= 1.12.0)
macaddr (1.7.2)
systemu (~> 2.6.5)
matrix (0.4.2)
@@ -186,11 +206,11 @@ GEM
mime-types-data (3.2023.0218.1)
mini_mime (1.1.0)
mini_portile2 (2.8.2)
- minitest (5.18.0)
+ minitest (5.18.1)
multi_json (1.15.0)
multi_xml (0.6.0)
netrc (0.11.0)
- nokogiri (1.15.2)
+ nokogiri (1.15.3)
mini_portile2 (~> 2.8.2)
racc (~> 1.4)
octokit (6.1.1)
@@ -214,10 +234,15 @@ GEM
byebug (~> 11.0)
pry (>= 0.13, < 0.15)
public_suffix (5.0.1)
- racc (1.6.2)
+ racc (1.7.1)
rack (2.2.3.1)
rack-test (1.1.0)
rack (>= 1.0, < 3)
+ rails-dom-testing (2.0.3)
+ activesupport (>= 4.2.0)
+ nokogiri (>= 1.6)
+ rails-html-sanitizer (1.5.0)
+ loofah (~> 2.19, >= 2.19.1)
rainbow (3.1.1)
rake (13.0.6)
regexp_parser (2.1.1)
@@ -310,7 +335,7 @@ PLATFORMS
ruby
DEPENDENCIES
- activesupport (~> 6.1.7.2)
+ activesupport (~> 7.0.5.1)
airborne (~> 0.3.7)
allure-rspec (~> 2.20.0)
capybara (~> 3.39.2)
@@ -323,11 +348,12 @@ DEPENDENCIES
faraday-retry (~> 2.2)
fog-core (= 2.1.0)
fog-google (~> 1.19)
- gitlab-qa (~> 11, >= 11.2.0)
- gitlab_quality-test_tooling (~> 0.8.1)
+ gitlab-qa (~> 12, >= 12.1.0)
+ gitlab-utils!
+ gitlab_quality-test_tooling (~> 0.8.3)
influxdb-client (~> 2.9)
knapsack (~> 4.0)
- nokogiri (~> 1.15, >= 1.15.2)
+ nokogiri (~> 1.15, >= 1.15.3)
octokit (~> 6.1.1)
parallel (~> 1.23)
parallel_tests (~> 4.2, >= 4.2.1)
@@ -348,4 +374,4 @@ DEPENDENCIES
zeitwerk (~> 2.6, >= 2.6.8)
BUNDLED WITH
- 2.4.14
+ 2.4.15
diff --git a/qa/gdk/Dockerfile.gdk b/qa/gdk/Dockerfile.gdk
index cf9cea69056..51e058a7088 100644
--- a/qa/gdk/Dockerfile.gdk
+++ b/qa/gdk/Dockerfile.gdk
@@ -88,17 +88,11 @@ RUN set -eux; \
rm -rf ${GEM_HOME}/cache \
&& go clean -cache
-# Build metrics-exporter
-#
-COPY --chown=gdk:gdk GITLAB_METRICS_EXPORTER_VERSION ./gitlab/
-RUN set -eux; \
- make gitlab-metrics-exporter-setup; \
- go clean -cache
-
# Install gitlab gem dependencies
#
COPY --chown=gdk:gdk Gemfile Gemfile.lock ./gitlab/
-COPY --chown=gdk:gdk vendor/gems ./gitlab/vendor/gems
+COPY --chown=gdk:gdk vendor/gems/ ./gitlab/vendor/gems/
+COPY --chown=gdk:gdk gems/ ./gitlab/gems/
RUN make .gitlab-bundle && rm -rf ${GEM_HOME}/cache
# Install gitlab npm dependencies
diff --git a/qa/qa.rb b/qa/qa.rb
index f6fba30c079..0e3d343b861 100644
--- a/qa/qa.rb
+++ b/qa/qa.rb
@@ -2,8 +2,9 @@
Encoding.default_external = 'UTF-8'
+require 'gitlab/utils/all'
+
require_relative '../lib/gitlab_edition'
-require_relative '../lib/gitlab/utils'
require_relative '../config/initializers/0_inject_enterprise_edition_module'
require_relative 'lib/gitlab'
diff --git a/qa/qa/fixtures/package_managers/maven/gradle/build.gradle.erb b/qa/qa/fixtures/package_managers/maven/gradle/build.gradle.erb
new file mode 100644
index 00000000000..77e5398bf13
--- /dev/null
+++ b/qa/qa/fixtures/package_managers/maven/gradle/build.gradle.erb
@@ -0,0 +1,51 @@
+plugins {
+ id 'java'
+ id 'maven-publish'
+ id 'application'
+}
+
+repositories {
+ maven {
+ url "<%= gitlab_address_with_port %>/api/v4/projects/<%= project.id %>/packages/maven"
+ name "GitLab"
+ credentials(HttpHeaderCredentials) {
+ name = '<%= maven_header_name %>'
+ value = project.property('Token')
+ }
+ authentication {
+ header(HttpHeaderAuthentication)
+ }
+ }
+}
+
+dependencies {
+ implementation group: '<%= group_id %>', name: '<%= artifact_id %>', version: '<%= package_version %>'
+ testImplementation 'junit:junit:4.12'
+}
+
+publishing {
+ publications {
+ mavenJava(MavenPublication) {
+ groupId '<%= group_id %>'
+ artifactId '<%= artifact_id %>'
+ version '<%= package_version %>'
+ from components.java
+ }
+ }
+ repositories {
+ maven {
+ url "<%= gitlab_address_with_port %>/api/v4/projects/<%= project.id %>/packages/maven"
+ credentials(HttpHeaderCredentials) {
+ name = '<%= maven_header_name %>'
+ value = project.property('Token')
+ }
+ authentication {
+ header(HttpHeaderAuthentication)
+ }
+ }
+ }
+}
+
+application {
+ mainClassName = 'gradle_maven_app.App'
+}
diff --git a/qa/qa/fixtures/package_managers/maven/gradle/build_install.gradle.erb b/qa/qa/fixtures/package_managers/maven/gradle/build_install.gradle.erb
deleted file mode 100644
index 31543d30e88..00000000000
--- a/qa/qa/fixtures/package_managers/maven/gradle/build_install.gradle.erb
+++ /dev/null
@@ -1,27 +0,0 @@
-plugins {
- id 'java'
- id 'application'
-}
-
-repositories {
- maven {
- url "<%= gitlab_address_with_port %>/api/v4/projects/<%= package_project.id %>/packages/maven"
- name "GitLab"
- credentials(HttpHeaderCredentials) {
- name = '<%= maven_header_name %>'
- value = <%= token %>
- }
- authentication {
- header(HttpHeaderAuthentication)
- }
- }
-}
-
-dependencies {
- implementation group: '<%= group_id %>', name: '<%= artifact_id %>', version: '<%= package_version %>'
- testImplementation 'junit:junit:4.12'
-}
-
-application {
- mainClassName = 'gradle_maven_app.App'
-} \ No newline at end of file
diff --git a/qa/qa/fixtures/package_managers/maven/gradle/build_upload.gradle.erb b/qa/qa/fixtures/package_managers/maven/gradle/build_upload.gradle.erb
deleted file mode 100644
index c14e63e11df..00000000000
--- a/qa/qa/fixtures/package_managers/maven/gradle/build_upload.gradle.erb
+++ /dev/null
@@ -1,27 +0,0 @@
-plugins {
- id 'java'
- id 'maven-publish'
-}
-
-publishing {
- publications {
- library(MavenPublication) {
- groupId '<%= group_id %>'
- artifactId '<%= artifact_id %>'
- version '<%= package_version %>'
- from components.java
- }
- }
- repositories {
- maven {
- url "<%= gitlab_address_with_port %>/api/v4/projects/<%= package_project.id %>/packages/maven"
- credentials(HttpHeaderCredentials) {
- name = "Private-Token"
- value = "<%= personal_access_token %>"
- }
- authentication {
- header(HttpHeaderAuthentication)
- }
- }
- }
-} \ No newline at end of file
diff --git a/qa/qa/fixtures/package_managers/maven/gradle/gradle_install_package.yaml.erb b/qa/qa/fixtures/package_managers/maven/gradle/gradle_install_package.yaml.erb
deleted file mode 100644
index 49873f124cc..00000000000
--- a/qa/qa/fixtures/package_managers/maven/gradle/gradle_install_package.yaml.erb
+++ /dev/null
@@ -1,8 +0,0 @@
- build:
- image: gradle:6.5-jdk11
- script:
- - 'gradle build'
- only:
- - "<%= client_project.default_branch %>"
- tags:
- - "runner-for-<%= client_project.group.name %>" \ No newline at end of file
diff --git a/qa/qa/fixtures/package_managers/maven/gradle/gradle_upload_install_package.yaml.erb b/qa/qa/fixtures/package_managers/maven/gradle/gradle_upload_install_package.yaml.erb
new file mode 100644
index 00000000000..35f4dba6130
--- /dev/null
+++ b/qa/qa/fixtures/package_managers/maven/gradle/gradle_upload_install_package.yaml.erb
@@ -0,0 +1,23 @@
+stages:
+ - publish
+ - install
+
+publish:
+ stage: publish
+ image: gradle:6.5-jdk11
+ script:
+ - 'gradle -PToken=<%= token %> publish'
+ only:
+ - "<%= project.default_branch %>"
+ tags:
+ - "runner-for-<%= project.name %>"
+
+install:
+ stage: install
+ image: gradle:6.5-jdk11
+ script:
+ - 'gradle -PToken=<%= token %> build'
+ only:
+ - "<%= project.default_branch %>"
+ tags:
+ - "runner-for-<%= project.name %>"
diff --git a/qa/qa/fixtures/package_managers/maven/gradle/gradle_upload_package.yaml.erb b/qa/qa/fixtures/package_managers/maven/gradle/gradle_upload_package.yaml.erb
deleted file mode 100644
index 3f3c7dce03c..00000000000
--- a/qa/qa/fixtures/package_managers/maven/gradle/gradle_upload_package.yaml.erb
+++ /dev/null
@@ -1,8 +0,0 @@
-deploy:
- image: gradle:6.5-jdk11
- script:
- - 'gradle publish'
- only:
- - "<%= package_project.default_branch %>"
- tags:
- - "runner-for-<%= package_project.group.name %>" \ No newline at end of file
diff --git a/qa/qa/fixtures/package_managers/maven/group/consumer/request_forwarding/gitlab_ci.yaml.erb b/qa/qa/fixtures/package_managers/maven/group/consumer/request_forwarding/gitlab_ci.yaml.erb
deleted file mode 100644
index 394c6689eef..00000000000
--- a/qa/qa/fixtures/package_managers/maven/group/consumer/request_forwarding/gitlab_ci.yaml.erb
+++ /dev/null
@@ -1,8 +0,0 @@
-install:
- image: maven:3.6-jdk-11
- script:
- - "mvn install -U -s settings.xml"
- only:
- - "<%= imported_project.default_branch %>"
- tags:
- - "runner-for-<%= imported_project.group.name %>" \ No newline at end of file
diff --git a/qa/qa/fixtures/package_managers/maven/group/consumer/request_forwarding/settings.xml.erb b/qa/qa/fixtures/package_managers/maven/group/consumer/request_forwarding/settings.xml.erb
deleted file mode 100644
index 4bcd63b3c6d..00000000000
--- a/qa/qa/fixtures/package_managers/maven/group/consumer/request_forwarding/settings.xml.erb
+++ /dev/null
@@ -1,23 +0,0 @@
-<settings>
- <servers>
- <server>
- <id>central-proxy</id>
- <configuration>
- <httpHeaders>
- <property>
- <name>Private-Token</name>
- <value><%= personal_access_token %></value>
- </property>
- </httpHeaders>
- </configuration>
- </server>
- </servers>
- <mirrors>
- <mirror>
- <id>central-proxy</id>
- <name>GitLab proxy of central repo</name>
- <url><%= gitlab_address_with_port %>/api/v4/groups/<%= imported_project.group.id %>/-/packages/maven</url>
- <mirrorOf>central</mirrorOf>
- </mirror>
- </mirrors>
-</settings> \ No newline at end of file
diff --git a/qa/qa/fixtures/package_managers/maven/project/request_forwarding/gitlab_ci.yaml.erb b/qa/qa/fixtures/package_managers/maven/project/request_forwarding/gitlab_ci.yaml.erb
deleted file mode 100644
index a41bdc4d650..00000000000
--- a/qa/qa/fixtures/package_managers/maven/project/request_forwarding/gitlab_ci.yaml.erb
+++ /dev/null
@@ -1,8 +0,0 @@
-install:
- image: maven:3.6-jdk-11
- script:
- - 'mvn install -U -s settings.xml'
- only:
- - "<%= imported_project.default_branch %>"
- tags:
- - "runner-for-<%= imported_project.name %>" \ No newline at end of file
diff --git a/qa/qa/fixtures/package_managers/maven/project/request_forwarding/settings.xml.erb b/qa/qa/fixtures/package_managers/maven/project/request_forwarding/settings.xml.erb
deleted file mode 100644
index caf1fc9b761..00000000000
--- a/qa/qa/fixtures/package_managers/maven/project/request_forwarding/settings.xml.erb
+++ /dev/null
@@ -1,23 +0,0 @@
-<settings>
- <servers>
- <server>
- <id>central-proxy</id>
- <configuration>
- <httpHeaders>
- <property>
- <name>Private-Token</name>
- <value><%= personal_access_token %></value>
- </property>
- </httpHeaders>
- </configuration>
- </server>
- </servers>
- <mirrors>
- <mirror>
- <id>central-proxy</id>
- <name>GitLab proxy of central repo</name>
- <url><%= gitlab_address_with_port %>/api/v4/projects/<%= imported_project.id %>/packages/maven</url>
- <mirrorOf>central</mirrorOf>
- </mirror>
- </mirrors>
-</settings>
diff --git a/qa/qa/fixtures/package_managers/pypi/pypi_upload_install_package.yaml.erb b/qa/qa/fixtures/package_managers/pypi/pypi_upload_install_package.yaml.erb
index 87c01fb5477..3cd1b1e630f 100644
--- a/qa/qa/fixtures/package_managers/pypi/pypi_upload_install_package.yaml.erb
+++ b/qa/qa/fixtures/package_managers/pypi/pypi_upload_install_package.yaml.erb
@@ -14,6 +14,6 @@ run:
install:
stage: install
script:
- - "pip install <%= package.name %> --no-deps --index-url <%= uri.scheme %>://<%= personal_access_token %>:<%= personal_access_token %>@<%= gitlab_host_with_port %>/api/v4/projects/${CI_PROJECT_ID}/packages/pypi/simple --trusted-host <%= gitlab_host_with_port %>"
+ - "pip install <%= package.name %> --no-deps --index-url <%= uri.scheme %>://${PERSONAL_ACCESS_TOKEN}:${PERSONAL_ACCESS_TOKEN}@<%= gitlab_host_with_port %>/api/v4/projects/${CI_PROJECT_ID}/packages/pypi/simple --trusted-host <%= gitlab_host_with_port %>"
tags:
- runner-for-<%= project.name %>
diff --git a/qa/qa/flow/alert_settings.rb b/qa/qa/flow/alert_settings.rb
index f5ee4f94065..7bda1585b39 100644
--- a/qa/qa/flow/alert_settings.rb
+++ b/qa/qa/flow/alert_settings.rb
@@ -27,7 +27,6 @@ module QA
alert.add_new_integration
alert.select_prometheus
alert.activate_integration
- alert.fill_in_prometheus_url
alert.save_and_create_alert
end
end
diff --git a/qa/qa/git/repository.rb b/qa/qa/git/repository.rb
index 35c5262e767..0e8a1c68bc5 100644
--- a/qa/qa/git/repository.rb
+++ b/qa/qa/git/repository.rb
@@ -144,7 +144,7 @@ module QA
end
def init_repository
- run_git("git init")
+ run_git("git init --initial-branch=#{default_branch}")
end
def pull(repository = nil, branch = nil)
diff --git a/qa/qa/page/base.rb b/qa/qa/page/base.rb
index 6c01fa9f344..92b4fd39759 100644
--- a/qa/qa/page/base.rb
+++ b/qa/qa/page/base.rb
@@ -4,6 +4,11 @@ require 'capybara/dsl'
module QA
module Page
+ # Page base class
+ #
+ # @!method self.perform
+ # Perform action on the page
+ # @yieldparam [self] instance of page object
class Base
# Generic matcher for common css selectors like:
# - class name '.someclass'
@@ -518,6 +523,12 @@ module QA
"Could not find the expected element as #{element_when_flag_enabled} or #{element_when_flag_disabled}." \
"The relevant feature flag is #{feature_flag}"
end
+
+ def wait_for_gitlab_to_respond
+ wait_until(sleep_interval: 5, message: '502 - GitLab is taking too much time to respond') do
+ Capybara.page.has_no_text?('GitLab is taking too much time to respond')
+ end
+ end
end
end
end
diff --git a/qa/qa/page/component/confirm_modal.rb b/qa/qa/page/component/confirm_modal.rb
index 4d1cf30c392..f72ca4f068e 100644
--- a/qa/qa/page/component/confirm_modal.rb
+++ b/qa/qa/page/component/confirm_modal.rb
@@ -11,6 +11,7 @@ module QA
base.view 'app/assets/javascripts/lib/utils/confirm_via_gl_modal/confirm_modal.vue' do
element :confirm_ok_button
+ element :confirmation_modal
end
base.view 'app/assets/javascripts/vue_shared/components/confirm_danger/confirm_danger_modal.vue' do
@@ -37,6 +38,20 @@ module QA
def click_confirmation_ok_button
click_element(:confirm_ok_button)
end
+
+ # Click the confirmation button if the confirmation modal is present
+ # Can be used when the modal may not always appear in a test. For example, if the modal is behind a feature flag
+ #
+ # @return [void]
+ def click_confirmation_ok_button_if_present
+ # In the case of changing access levels[1], the modal appears while there's a request in process, so we need
+ # to skip the loading check otherwise it will time out.
+ #
+ # [1]: https://gitlab.com/gitlab-org/gitlab/-/blob/4a99af809b86047ce3c8985e6582748bbd23fc84/qa/qa/page/component/members/members_table.rb#L54
+ return unless has_element?(:confirmation_modal, skip_finished_loading_check: true)
+
+ click_element(:confirm_ok_button, skip_finished_loading_check: true)
+ end
end
end
end
diff --git a/qa/qa/page/component/design_management.rb b/qa/qa/page/component/design_management.rb
index 71c24b6cac8..4caa5169c5f 100644
--- a/qa/qa/page/component/design_management.rb
+++ b/qa/qa/page/component/design_management.rb
@@ -78,7 +78,7 @@ module QA
end
def update_design(filename)
- filepath = ::File.join(Runtime::Path.fixtures_path, 'designs', 'update', filename)
+ filepath = Runtime::Path.fixture('designs', 'update', filename)
add_design(filepath)
end
diff --git a/qa/qa/page/component/dropdown.rb b/qa/qa/page/component/dropdown.rb
index 767cd40daa2..5f60a789900 100644
--- a/qa/qa/page/component/dropdown.rb
+++ b/qa/qa/page/component/dropdown.rb
@@ -33,12 +33,13 @@ module QA
def clear_current_selection_if_present
expand_select_list unless dropdown_open?
+ Support::WaitForRequests.wait_for_requests
- if has_css?('button[data-testid="listbox-reset-button"]')
+ if has_css?('button[data-testid="listbox-reset-button"]', wait: 0)
find('button[data-testid="listbox-reset-button"]').click
- elsif dropdown_open?
- expand_select_list
end
+
+ expand_select_list if dropdown_open?
end
def search_item(item_text)
diff --git a/qa/qa/page/component/issuable/sidebar.rb b/qa/qa/page/component/issuable/sidebar.rb
index 06a3c6a8845..15155fd9f44 100644
--- a/qa/qa/page/component/issuable/sidebar.rb
+++ b/qa/qa/page/component/issuable/sidebar.rb
@@ -31,7 +31,7 @@ module QA
end
base.view 'app/assets/javascripts/sidebar/components/labels/labels_select_widget/dropdown_contents.vue' do
- element :labels_dropdown_content
+ element :labels_select_dropdown_contents
end
base.view 'app/assets/javascripts/sidebar/components/labels/labels_select_widget/dropdown_value.vue' do
@@ -137,7 +137,7 @@ module QA
click_element(:edit_button)
labels.each do |label|
- within_element(:labels_dropdown_content) do
+ within_element(:labels_select_dropdown_contents) do
fill_element(:dropdown_input_field, label)
click_button(text: label)
end
diff --git a/qa/qa/page/component/members/invite_members_modal.rb b/qa/qa/page/component/members/invite_members_modal.rb
index 0220bb1e4fc..ae51213b3e2 100644
--- a/qa/qa/page/component/members/invite_members_modal.rb
+++ b/qa/qa/page/component/members/invite_members_modal.rb
@@ -6,6 +6,7 @@ module QA
module Members
module InviteMembersModal
extend QA::Page::PageConcern
+ include QA::Page::Component::Dropdown
def self.included(base)
super
@@ -16,11 +17,6 @@ module QA
element :invite_members_modal_content
end
- base.view 'app/assets/javascripts/invite_members/components/group_select.vue' do
- element :group_select_dropdown_search_field
- element :group_select_dropdown_item
- end
-
base.view 'app/assets/javascripts/invite_members/components/members_token_select.vue' do
element :members_token_select_input
end
@@ -61,11 +57,9 @@ module QA
within_element(:invite_members_modal_content) do
click_button 'Select a group'
- Support::Waiter.wait_until { has_element?(:group_select_dropdown_item) }
-
- fill_element :group_select_dropdown_search_field, group_name
Support::WaitForRequests.wait_for_requests
- click_button group_name
+
+ search_and_select(group_name)
set_access_level(access_level)
end
diff --git a/qa/qa/page/component/members/members_table.rb b/qa/qa/page/component/members/members_table.rb
index 46010a0f9ab..15b0f230341 100644
--- a/qa/qa/page/component/members/members_table.rb
+++ b/qa/qa/page/component/members/members_table.rb
@@ -14,6 +14,7 @@ module QA
include MembersFilter
include RemoveMemberModal
include RemoveGroupModal
+ include ConfirmModal
end
base.view 'app/assets/javascripts/members/components/table/members_table.vue' do
@@ -53,6 +54,8 @@ module QA
click_element :access_level_dropdown
click_element :access_level_link, text: access_level
end
+
+ click_confirmation_ok_button_if_present
end
def remove_member(username)
diff --git a/qa/qa/page/component/note.rb b/qa/qa/page/component/note.rb
index 84cc481945f..638c46f228f 100644
--- a/qa/qa/page/component/note.rb
+++ b/qa/qa/page/component/note.rb
@@ -73,11 +73,13 @@ module QA
end
def collapse_replies
+ close_rich_text_promo_popover_if_present
click_element :collapse_replies_button
end
# Attachment option should be an absolute path
def comment(text, attachment: nil, filter: :all_activities)
+ close_rich_text_promo_popover_if_present
method("select_#{filter}_filter").call
fill_element :comment_field, "#{text}\n"
@@ -148,7 +150,8 @@ module QA
def start_discussion(text)
fill_element :comment_field, text
- within_element(:comment_button) { click_button(class: 'dropdown-toggle-split') }
+ close_rich_text_promo_popover_if_present
+ within_element(:comment_button) { click_button(class: 'gl-new-dropdown-toggle') }
click_element :discussion_menu_item
click_element :comment_button
diff --git a/qa/qa/page/component/rich_text_popover.rb b/qa/qa/page/component/rich_text_popover.rb
new file mode 100644
index 00000000000..6a187dcedc5
--- /dev/null
+++ b/qa/qa/page/component/rich_text_popover.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+module QA
+ module Page
+ module Component
+ module RichTextPopover
+ extend QA::Page::PageConcern
+
+ def self.included(base)
+ super
+
+ base.view 'app/assets/javascripts/vue_shared/components/markdown/editor_mode_switcher.vue' do
+ element :rich_text_promo_popover
+ end
+
+ base.view 'app/views/shared/_broadcast_message.html.haml' do
+ element :close_button
+ end
+ end
+
+ def close_rich_text_promo_popover_if_present
+ return unless has_element?(:rich_text_promo_popover, wait: 0)
+
+ within_element(:rich_text_promo_popover) do
+ click_element(:close_button)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/page/file/form.rb b/qa/qa/page/file/form.rb
index d0113d66dec..06b75f42e4d 100644
--- a/qa/qa/page/file/form.rb
+++ b/qa/qa/page/file/form.rb
@@ -46,7 +46,7 @@ module QA
when 'LICENSE'
click_element :license_dropdown
else
- raise %Q(Unsupported template_type "#{template_type}". Please confirm that it is a valid option.)
+ raise %(Unsupported template_type "#{template_type}". Please confirm that it is a valid option.)
end
filter_and_select template
end
diff --git a/qa/qa/page/group/bulk_import.rb b/qa/qa/page/group/bulk_import.rb
index 90bc7a66dcc..f57b76b11a9 100644
--- a/qa/qa/page/group/bulk_import.rb
+++ b/qa/qa/page/group/bulk_import.rb
@@ -8,6 +8,7 @@ module QA
element :import_table
element :import_item
element :import_status_indicator
+ element :filter_groups
end
view "app/assets/javascripts/import_entities/import_groups/components/import_target_cell.vue" do
@@ -22,6 +23,12 @@ module QA
element :import_group_button
end
+ def filter_group(source_group_name)
+ find('input[data-testid="filter-groups"]').set(source_group_name).send_keys(:return)
+
+ finished_loading?
+ end
+
# Import source group in to target group
#
# @param [String] source_group_name
@@ -30,6 +37,8 @@ module QA
def import_group(source_group_name, target_group_name)
finished_loading?
+ filter_group(source_group_name)
+
within_element(:import_item, source_group: source_group_name) do
click_element(:target_namespace_selector_dropdown)
click_element(:target_group_dropdown_item, group_name: target_group_name)
diff --git a/qa/qa/page/group/sub_menus/common.rb b/qa/qa/page/group/sub_menus/common.rb
index 3cbca3db359..6369306da3f 100644
--- a/qa/qa/page/group/sub_menus/common.rb
+++ b/qa/qa/page/group/sub_menus/common.rb
@@ -13,7 +13,7 @@ module QA
base.class_eval do
view 'app/views/shared/nav/_sidebar.html.haml' do
- element :group_sidebar, 'qa_selector: sidebar_qa_selector(sidebar.container)' # rubocop:disable QA/ElementWithPattern
+ element :group_sidebar, 'testid: sidebar_qa_selector(sidebar.container)' # rubocop:disable QA/ElementWithPattern
end
end
end
diff --git a/qa/qa/page/issuable/new.rb b/qa/qa/page/issuable/new.rb
index b74dc705888..0a8be750752 100644
--- a/qa/qa/page/issuable/new.rb
+++ b/qa/qa/page/issuable/new.rb
@@ -4,6 +4,8 @@ module QA
module Page
module Issuable
class New < Page::Base
+ include Page::Component::RichTextPopover
+
view 'app/views/shared/issuable/form/_title.html.haml' do
element :issuable_form_title_field
end
@@ -20,6 +22,10 @@ module QA
element :issuable_label_dropdown
end
+ view 'app/assets/javascripts/sidebar/components/labels/labels_select_widget/dropdown_contents.vue' do
+ element :labels_select_dropdown_contents
+ end
+
view 'app/views/shared/issuable/form/_metadata_issuable_assignee.html.haml' do
element :assign_to_me_link
end
@@ -44,6 +50,7 @@ module QA
end
def choose_template(template_name)
+ close_rich_text_promo_popover_if_present
click_element :template_dropdown
within_element(:template_dropdown) do
click_on template_name
@@ -53,7 +60,7 @@ module QA
def select_label(label)
click_element :issuable_label_dropdown
- click_link label.title
+ click_on(label.title, match: :prefer_exact)
click_element :issuable_label_dropdown # So that the dropdown goes away(click away action)
end
diff --git a/qa/qa/page/main/login.rb b/qa/qa/page/main/login.rb
index 3a836210dea..8812c792554 100644
--- a/qa/qa/page/main/login.rb
+++ b/qa/qa/page/main/login.rb
@@ -43,6 +43,7 @@ module QA
element :github_login_button
element :oidc_login_button
element :gitlab_oauth_login_button
+ element :facebook_login_button
end
view 'app/views/layouts/devise.html.haml' do
@@ -102,6 +103,12 @@ module QA
click_element :sign_in_button
end
+ if Runtime::Env.super_sidebar_enabled?
+ Page::Main::Menu.perform(&:enable_new_navigation)
+ else
+ Page::Main::Menu.perform(&:disable_new_navigation)
+ end
+
Page::Main::Menu.perform(&:signed_in?)
end
@@ -128,8 +135,8 @@ module QA
'/users/sign_in'
end
- def has_sign_in_tab?
- has_element?(:sign_in_tab)
+ def has_sign_in_tab?(wait: Capybara.default_max_wait_time)
+ has_element?(:sign_in_tab, wait: wait)
end
def has_ldap_tab?
@@ -186,6 +193,11 @@ module QA
click_element :github_login_button
end
+ def sign_in_with_facebook
+ set_initial_password_if_present
+ click_element :facebook_login_button
+ end
+
def sign_in_with_saml
set_initial_password_if_present
click_element :saml_login_button
@@ -203,7 +215,6 @@ module QA
def sign_out_and_sign_in_as(user:)
Menu.perform(&:sign_out_if_signed_in)
- has_sign_in_tab?
sign_in_using_credentials(user: user)
end
@@ -225,7 +236,7 @@ module QA
def sign_in_using_gitlab_credentials(user:, skip_page_validation: false)
wait_if_retry_later
- switch_to_sign_in_tab if has_sign_in_tab?
+ switch_to_sign_in_tab if has_sign_in_tab?(wait: 0)
switch_to_standard_tab if has_standard_tab?
fill_in_credential(user)
@@ -258,7 +269,11 @@ module QA
wait_for_gitlab_to_respond
- Page::Main::Menu.perform(&:enable_new_navigation) if Runtime::Env.super_sidebar_enabled?
+ if Runtime::Env.super_sidebar_enabled?
+ Page::Main::Menu.perform(&:enable_new_navigation)
+ else
+ Page::Main::Menu.perform(&:disable_new_navigation)
+ end
wait_for_gitlab_to_respond
diff --git a/qa/qa/page/main/menu.rb b/qa/qa/page/main/menu.rb
index 7e0337035e3..29c4360f814 100644
--- a/qa/qa/page/main/menu.rb
+++ b/qa/qa/page/main/menu.rb
@@ -20,7 +20,7 @@ module QA
end
view 'app/assets/javascripts/super_sidebar/components/user_menu.vue' do
- element :user_menu, required: !Runtime::Env.phone_layout?
+ element :user_dropdown, required: !Runtime::Env.phone_layout?
element :user_avatar_content, required: !Runtime::Env.phone_layout?
element :sign_out_link
element :edit_profile_link
@@ -31,8 +31,11 @@ module QA
end
view 'app/assets/javascripts/super_sidebar/components/user_bar.vue' do
- element :global_search_button
- element :stop_impersonation_link
+ element :super_sidebar_search_button
+ element :stop_impersonation_btn
+ element :issues_shortcut_button, required: !Runtime::Env.phone_layout?
+ element :merge_requests_shortcut_button, required: !Runtime::Env.phone_layout?
+ element :todos_shortcut_button, required: !Runtime::Env.phone_layout?
end
view 'app/assets/javascripts/super_sidebar/components/global_search/components/global_search.vue' do
@@ -43,8 +46,8 @@ module QA
element :navbar, required: true
element :canary_badge_link
element :user_avatar_content, required: !Runtime::Env.phone_layout?
- element :user_menu, required: !Runtime::Env.phone_layout?
- element :stop_impersonation_link
+ element :user_dropdown, required: !Runtime::Env.phone_layout?
+ element :stop_impersonation_btn
element :issues_shortcut_button, required: !Runtime::Env.phone_layout?
element :merge_requests_shortcut_button, required: !Runtime::Env.phone_layout?
element :todos_shortcut_button, required: !Runtime::Env.phone_layout?
@@ -62,7 +65,7 @@ module QA
end
view 'app/assets/javascripts/nav/components/top_nav_dropdown_menu.vue' do
- element :menu_subview_container
+ element :menu_subview
end
view 'lib/gitlab/nav/top_nav_menu_item.rb' do
@@ -240,7 +243,7 @@ module QA
end
def search_for(term)
- click_element(Runtime::Env.super_sidebar_enabled? ? :global_search_button : :search_box)
+ click_element(Runtime::Env.super_sidebar_enabled? ? :super_sidebar_search_button : :search_box)
fill_element(:global_search_input, "#{term}\n")
end
@@ -262,7 +265,7 @@ module QA
end
def click_stop_impersonation_link
- click_element(:stop_impersonation_link)
+ click_element(:stop_impersonation_btn)
end
# To verify whether the user has been directed to a canary web node
@@ -278,11 +281,23 @@ module QA
def enable_new_navigation
Runtime::Logger.info("Enabling super sidebar!")
return Runtime::Logger.info("User is not signed in, skipping") unless has_element?(:navbar, wait: 2)
+
return Runtime::Logger.info("Super sidebar is already enabled") if has_css?('[data-testid="super-sidebar"]')
within_user_menu { click_element(:new_navigation_toggle) }
end
+ def disable_new_navigation
+ Runtime::Logger.info("Disabling super sidebar!")
+ return Runtime::Logger.info("User is not signed in, skipping") unless has_element?(:navbar, wait: 2)
+
+ unless has_css?('[data-testid="super-sidebar"]')
+ return Runtime::Logger.info("Super sidebar is already disabled")
+ end
+
+ within_user_menu { click_element(:new_navigation_toggle) }
+ end
+
private
def within_top_menu(&block)
@@ -293,20 +308,20 @@ module QA
within_top_menu do
click_element :user_avatar_content unless has_element?(:user_profile_link, wait: 1)
- within_element(:user_menu, &block)
+ within_element(:user_dropdown, &block)
end
end
def within_groups_menu(&block)
go_to_menu_dropdown_option(:groups_dropdown)
- within_element(:menu_subview_container, &block)
+ within_element(:menu_subview, &block)
end
def within_projects_menu(&block)
go_to_menu_dropdown_option(:projects_dropdown)
- within_element(:menu_subview_container, &block)
+ within_element(:menu_subview, &block)
end
def click_admin_area
diff --git a/qa/qa/page/merge_request/show.rb b/qa/qa/page/merge_request/show.rb
index e0ec5d50bc5..71c2aa2d0b3 100644
--- a/qa/qa/page/merge_request/show.rb
+++ b/qa/qa/page/merge_request/show.rb
@@ -6,6 +6,7 @@ module QA
class Show < Page::Base
include Page::Component::Note
include Page::Component::Issuable::Sidebar
+ include Page::Component::RichTextPopover
view 'app/assets/javascripts/batch_comments/components/preview_dropdown.vue' do
element :review_preview_dropdown
@@ -285,6 +286,7 @@ module QA
end
def merge!
+ close_rich_text_promo_popover_if_present
try_to_merge!
finished_loading?
@@ -331,13 +333,15 @@ module QA
#
# @param [Boolean] transient_test true if the current test is a transient test (default: false)
def wait_until_ready_to_merge(transient_test: false)
- wait_until do
- has_element?(:merge_button)
+ wait_until(message: "Waiting for ready to merge", sleep_interval: 1) do
+ # changes in mr are rendered async, because of that mr can sometimes show no changes and there will be no
+ # merge button, in such case we must retry loop otherwise find_element will raise ElementNotFound error
+ next false unless has_element?(:merge_button, wait: 1)
break true unless find_element(:merge_button).disabled?
# If the widget shows "Merge blocked: new changes were just added" we can refresh the page and check again
- next false if has_element?(:head_mismatch_content)
+ next false if has_element?(:head_mismatch_content, wait: 1)
# Stop waiting if we're in a transient test. By this point we're in an unexpected state and should let the
# test fail so we can investigate. If we're not in a transient test we keep trying until we reach timeout.
@@ -364,6 +368,7 @@ module QA
end
def merge_immediately!
+ close_rich_text_promo_popover_if_present
retry_until(reload: true, sleep_interval: 1, max_attempts: 12) do
if has_element?(:merge_moment_dropdown)
click_element(:merge_moment_dropdown, skip_finished_loading_check: true)
@@ -377,6 +382,7 @@ module QA
end
def try_to_merge!
+ close_rich_text_promo_popover_if_present
# Revisit after merge page re-architect is done https://gitlab.com/gitlab-org/gitlab/-/issues/300042
# To remove page refresh logic if possible
wait_until_ready_to_merge
diff --git a/qa/qa/page/project/branches/show.rb b/qa/qa/page/project/branches/show.rb
index af328f876f7..bbe0f91abf6 100644
--- a/qa/qa/page/project/branches/show.rb
+++ b/qa/qa/page/project/branches/show.rb
@@ -14,7 +14,6 @@ module QA
end
view 'app/views/projects/branches/_branch.html.haml' do
- element :badge_content
element :branch_container
element :branch_link
end
@@ -23,13 +22,6 @@ module QA
element :all_branches_container
end
- view 'app/assets/javascripts/branches/components/delete_merged_branches.vue' do
- element :delete_merged_branches_dropdown_button
- element :delete_merged_branches_button
- element :delete_merged_branches_input
- element :delete_merged_branches_confirmation_button
- end
-
def delete_branch(branch_name)
within_element(:branch_container, name: branch_name) do
click_element(:delete_branch_button)
@@ -47,20 +39,6 @@ module QA
end
end
end
-
- def has_branch_with_badge?(branch_name, badge)
- within_element(:branch_container, name: branch_name) do
- has_element?(:badge_content, text: badge)
- end
- end
-
- def delete_merged_branches(branches_length)
- click_element(:delete_merged_branches_dropdown_button)
- click_element(:delete_merged_branches_button)
- fill_element(:delete_merged_branches_input, branches_length)
- click_element(:delete_merged_branches_confirmation_button)
- finished_loading?
- end
end
end
end
diff --git a/qa/qa/page/project/issue/show.rb b/qa/qa/page/project/issue/show.rb
index c2f334c930a..c95375dbbb9 100644
--- a/qa/qa/page/project/issue/show.rb
+++ b/qa/qa/page/project/issue/show.rb
@@ -9,6 +9,7 @@ module QA
include Page::Component::DesignManagement
include Page::Component::Issuable::Sidebar
include Page::Component::Issuable::Common
+ include Page::Component::RichTextPopover
# We need to check phone_layout? instead of mobile_layout? here
# since tablets have the regular top navigation bar
prepend Mobile::Page::Project::Issue::Show if Runtime::Env.phone_layout?
diff --git a/qa/qa/page/project/pipeline/show.rb b/qa/qa/page/project/pipeline/show.rb
index 41c61aaecc8..c955b4d933d 100644
--- a/qa/qa/page/project/pipeline/show.rb
+++ b/qa/qa/page/project/pipeline/show.rb
@@ -7,19 +7,8 @@ module QA
class Show < QA::Page::Base
include Component::CiBadgeLink
- # TODO: remove element with FF pipeline_details_header_vue removal
- view 'app/assets/javascripts/vue_shared/components/header_ci_component.vue' do
- element :pipeline_header
- end
-
- # TODO: make this a requirement at page render - `required: true`
- # together with FF pipeline_details_header_vue removal
view 'app/assets/javascripts/pipelines/components/pipeline_details_header.vue' do
- element :pipeline_details_header
- end
-
- view 'app/views/projects/pipelines/_info.html.haml' do
- element :merge_request_badge_tag
+ element :pipeline_details_header, required: true
end
view 'app/assets/javascripts/pipelines/components/graph/graph_component.vue' do
@@ -63,20 +52,11 @@ module QA
end
def running?(wait: 0)
- # TODO: remove condition check together with FF pipeline_details_header_vue removal
- # issue: https://gitlab.com/gitlab-org/gitlab/-/issues/411442
-
- element = has_element?(:pipeline_details_header) ? :pipeline_details_header : :pipeline_header
-
- within_element(element) do
+ within_element(:pipeline_details_header) do
page.has_content?('running', wait: wait)
end
end
- def has_merge_request_badge_tag?
- has_element?(:merge_request_badge_tag)
- end
-
def has_build?(name, status: :success, wait: nil)
if status
within_element(:job_item_container, text: name) do
diff --git a/qa/qa/page/project/settings/alerts.rb b/qa/qa/page/project/settings/alerts.rb
index 3ff4ef20bde..2646e271bd2 100644
--- a/qa/qa/page/project/settings/alerts.rb
+++ b/qa/qa/page/project/settings/alerts.rb
@@ -25,7 +25,6 @@ module QA
element :save_and_create_alert_button
element :test_payload_field
element :send_test_alert_button
- element :prometheus_url_field
end
def go_to_alert_settings
@@ -73,19 +72,12 @@ module QA
def select_prometheus
click_element(:integration_type_dropdown)
find("option[value='PROMETHEUS']").click
-
- # Click outside of the list to close it
- click_element(:prometheus_url_field)
end
def enter_integration_name(name)
fill_element(:integration_name_field, name)
end
- def fill_in_prometheus_url(url = Runtime::Scenario.gitlab_address)
- fill_element(:prometheus_url_field, url)
- end
-
def activate_integration
within_element(:active_toggle_container) do
find('.gl-toggle').click
diff --git a/qa/qa/page/project/snippet/new.rb b/qa/qa/page/project/snippet/new.rb
index 47200ba5fda..4a13e597e15 100644
--- a/qa/qa/page/project/snippet/new.rb
+++ b/qa/qa/page/project/snippet/new.rb
@@ -20,7 +20,7 @@ module QA
# webdriver to miss the hit so we wait for the svg to load before
# clicking the button.
within_element(:svg_content) do
- has_element?(:js_lazy_loaded)
+ has_element?(:js_lazy_loaded_content)
end
click_element(:create_first_snippet_link)
end
diff --git a/qa/qa/page/project/web_ide/edit.rb b/qa/qa/page/project/web_ide/edit.rb
index 8432edff046..19802f846d8 100644
--- a/qa/qa/page/project/web_ide/edit.rb
+++ b/qa/qa/page/project/web_ide/edit.rb
@@ -178,7 +178,7 @@ module QA
within_element(:template_list_content) do
click_on file_name
rescue Capybara::ElementNotFound
- raise ElementNotFound, %Q(Couldn't find file template named "#{file_name}". Please confirm that it is a valid option.)
+ raise ElementNotFound, %(Couldn't find file template named "#{file_name}". Please confirm that it is a valid option.)
end
# Wait for the modal to fade out too
@@ -192,7 +192,7 @@ module QA
begin
click_on template
rescue Capybara::ElementNotFound
- raise ElementNotFound, %Q(Couldn't find template "#{template}" for #{file_name}. Please confirm that it exists in the list of templates.)
+ raise ElementNotFound, %(Couldn't find template "#{template}" for #{file_name}. Please confirm that it exists in the list of templates.)
end
end
end
diff --git a/qa/qa/page/user/show.rb b/qa/qa/page/user/show.rb
index f14ddea3e8b..1cfaca2fc57 100644
--- a/qa/qa/page/user/show.rb
+++ b/qa/qa/page/user/show.rb
@@ -5,10 +5,13 @@ module QA
module User
class Show < Page::Base
view 'app/views/users/show.html.haml' do
- element :follow_user_link
element :following_tab
end
+ view 'app/views/users/_follow_user.html.haml' do
+ element :follow_user_link
+ end
+
view 'app/views/shared/users/_user.html.haml' do
element :user_link
end
diff --git a/qa/qa/resource/base.rb b/qa/qa/resource/base.rb
index e12a8f97d95..459670add36 100644
--- a/qa/qa/resource/base.rb
+++ b/qa/qa/resource/base.rb
@@ -17,7 +17,8 @@ module QA
class << self
# Initialize new instance of class without fabrication
#
- # @param [Proc] prepare_block
+ # @yieldparam [self] instance of page object
+ # @return [self]
def init(&prepare_block)
new.tap(&prepare_block)
end
diff --git a/qa/qa/resource/design.rb b/qa/qa/resource/design.rb
index 127e7ae61e3..68d8e43ad3d 100644
--- a/qa/qa/resource/design.rb
+++ b/qa/qa/resource/design.rb
@@ -111,7 +111,7 @@ module QA
private
def filepath
- ::File.join(Runtime::Path.fixtures_path, 'designs', filename)
+ Runtime::Path.fixture('designs', filename)
end
end
end
diff --git a/qa/qa/resource/events/project.rb b/qa/qa/resource/events/project.rb
index c1bd921c3cf..693fdd6168f 100644
--- a/qa/qa/resource/events/project.rb
+++ b/qa/qa/resource/events/project.rb
@@ -7,21 +7,21 @@ module QA
include Events::Base
def push_events(commit_message)
- QA::Runtime::Logger.info(%Q[#{self.class.name} - wait for and fetch push events"])
+ QA::Runtime::Logger.info(%[#{self.class.name} - wait for and fetch push events"])
fetch_events do
events(action: 'pushed').select { |event| event.dig(:push_data, :commit_title) == commit_message }
end
end
def wait_for_merge(title)
- QA::Runtime::Logger.info(%Q[#{self.class.name} - wait_for_merge with title "#{title}"])
+ QA::Runtime::Logger.info(%[#{self.class.name} - wait_for_merge with title "#{title}"])
wait_for_event do
events(action: 'accepted', target_type: 'merge_request').any? { |event| event[:target_title] == title }
end
end
def wait_for_push(commit_message)
- QA::Runtime::Logger.info(%Q[#{self.class.name} - wait_for_push with commit message "#{commit_message}"])
+ QA::Runtime::Logger.info(%[#{self.class.name} - wait_for_push with commit message "#{commit_message}"])
wait_for_event do
events(action: 'pushed').any? { |event| event.dig(:push_data, :commit_title) == commit_message }
end
@@ -32,7 +32,7 @@ module QA
end
def wait_for_push_new_branch(branch_name = self.default_branch)
- QA::Runtime::Logger.info(%Q[#{self.class.name} - wait_for_push_new_branch with branch_name "#{branch_name}"])
+ QA::Runtime::Logger.info(%[#{self.class.name} - wait_for_push_new_branch with branch_name "#{branch_name}"])
wait_for_event do
events(action: 'pushed').any? { |event| event.dig(:push_data, :ref) == branch_name }
end
diff --git a/qa/qa/resource/import_project.rb b/qa/qa/resource/import_project.rb
index a490905cbd6..1709a9eb989 100644
--- a/qa/qa/resource/import_project.rb
+++ b/qa/qa/resource/import_project.rb
@@ -7,7 +7,7 @@ module QA
def initialize
@name = "ImportedProject-#{SecureRandom.hex(8)}"
- @file_path = ::File.join(Runtime::Path.fixtures_path, 'export.tar.gz')
+ @file_path = Runtime::Path.fixture('export.tar.gz')
end
def fabricate!
diff --git a/qa/qa/resource/issuable.rb b/qa/qa/resource/issuable.rb
index 5aee27b46d4..508f412711a 100644
--- a/qa/qa/resource/issuable.rb
+++ b/qa/qa/resource/issuable.rb
@@ -5,7 +5,7 @@ module QA
class Issuable < Base
using Rainbow
- # Commentes (notes) path
+ # Comments (notes) path
#
# @return [String]
def api_comments_path
diff --git a/qa/qa/resource/issue.rb b/qa/qa/resource/issue.rb
index a5d5795b0de..a39e04c61a3 100644
--- a/qa/qa/resource/issue.rb
+++ b/qa/qa/resource/issue.rb
@@ -69,6 +69,13 @@ module QA
"#{api_get_path}/related_merge_requests"
end
+ # Close issue
+ #
+ # @return [void]
+ def close
+ api_put_to(api_put_path, state_event: "close")
+ end
+
def set_issue_assignees(assignee_ids:)
put_body = { assignee_ids: assignee_ids }
response = put Runtime::API::Request.new(api_client, api_put_path).url, put_body
diff --git a/qa/qa/resource/merge_request.rb b/qa/qa/resource/merge_request.rb
index 0d1a0bb2cd4..93e8c4f3be6 100644
--- a/qa/qa/resource/merge_request.rb
+++ b/qa/qa/resource/merge_request.rb
@@ -45,7 +45,7 @@ module QA
resource.project = project
resource.api_client = api_client
resource.commit_message = 'This is a test commit'
- resource.add_files([{ 'file_path': "file-#{SecureRandom.hex(8)}.txt", 'content': 'MR init' }])
+ resource.add_files([{ file_path: "file-#{SecureRandom.hex(8)}.txt", content: 'MR init' }])
resource.branch = target_branch
resource.start_branch = project.default_branch if target_branch != project.default_branch
@@ -60,7 +60,7 @@ module QA
resource.branch = source_branch
resource.start_branch = target_branch
- files = [{ 'file_path': file_name, 'content': file_content }]
+ files = [{ file_path: file_name, content: file_content }]
update_existing_file ? resource.update_files(files) : resource.add_files(files)
end
end
@@ -139,7 +139,8 @@ module QA
source_branch: source_branch,
target_branch: target_branch,
title: title,
- reviewer_ids: reviewer_ids
+ reviewer_ids: reviewer_ids,
+ labels: labels.join(",")
}
end
diff --git a/qa/qa/resource/personal_access_token_cache.rb b/qa/qa/resource/personal_access_token_cache.rb
index 0874618201a..078df8e6779 100644
--- a/qa/qa/resource/personal_access_token_cache.rb
+++ b/qa/qa/resource/personal_access_token_cache.rb
@@ -9,9 +9,9 @@ module QA
token = @personal_access_tokens[username]
log_message = if token
- %Q[Retrieved cached token for username: #{username}, last six chars of token:#{token[-6..]}]
+ %[Retrieved cached token for username: #{username}, last six chars of token:#{token[-6..]}]
else
- %Q[No cached token found for username: #{username}]
+ %[No cached token found for username: #{username}]
end
QA::Runtime::Logger.info(log_message)
@@ -20,7 +20,7 @@ module QA
end
def self.set_token_for_username(username, token)
- QA::Runtime::Logger.info(%Q[Caching token for username: #{username}, last six chars of token:#{token[-6..]}])
+ QA::Runtime::Logger.info(%[Caching token for username: #{username}, last six chars of token:#{token[-6..]}])
@personal_access_tokens[username] = token
end
end
diff --git a/qa/qa/resource/project_imported_from_github.rb b/qa/qa/resource/project_imported_from_github.rb
index ed8074b1440..855e1edf3ef 100644
--- a/qa/qa/resource/project_imported_from_github.rb
+++ b/qa/qa/resource/project_imported_from_github.rb
@@ -3,7 +3,11 @@
module QA
module Resource
class ProjectImportedFromGithub < Resource::Project
- attr_accessor :issue_events_import, :full_notes_import, :attachments_import, :allow_partial_import
+ attr_accessor :issue_events_import,
+ :full_notes_import,
+ :attachments_import,
+ :allow_partial_import,
+ :additional_access_tokens
attribute :github_repo_id do
github_client.repository(github_repository_path).id
@@ -58,13 +62,14 @@ module QA
new_name: name,
target_namespace: @personal_namespace || group.full_path,
personal_access_token: github_personal_access_token,
+ additional_access_tokens: additional_access_tokens,
ci_cd_only: false,
optional_stages: {
single_endpoint_issue_events_import: issue_events_import,
single_endpoint_notes_import: full_notes_import,
attachments_import: attachments_import
}
- }
+ }.compact
end
def transform_api_resource(api_resource)
diff --git a/qa/qa/resource/repository/branch.rb b/qa/qa/resource/repository/branch.rb
new file mode 100644
index 00000000000..9e6132b8387
--- /dev/null
+++ b/qa/qa/resource/repository/branch.rb
@@ -0,0 +1,52 @@
+# frozen_string_literal: true
+
+module QA
+ module Resource
+ module Repository
+ class Branch < Base
+ attr_accessor :name, :ref
+
+ attribute :project do
+ Project.fabricate_via_api! do |resource|
+ resource.name = 'branch-project'
+ resource.initialize_with_readme = true
+ end
+ end
+
+ def initialize
+ @name = 'test'
+ @ref = Runtime::Env.default_branch
+ end
+
+ def fabricate!
+ raise NotImplementedError
+ end
+
+ def fabricate_via_api!
+ resource_web_url(api_get)
+ rescue ResourceNotFoundError
+ super
+ end
+
+ def api_get_path
+ "/projects/#{project.id}/repository/branches/#{name}"
+ end
+
+ def api_delete_path
+ api_get_path
+ end
+
+ def api_post_path
+ "/projects/#{project.id}/repository/branches"
+ end
+
+ def api_post_body
+ {
+ branch: name,
+ ref: ref
+ }
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/runtime/application_settings.rb b/qa/qa/runtime/application_settings.rb
index 4cbce0972b6..0c88716a01c 100644
--- a/qa/qa/runtime/application_settings.rb
+++ b/qa/qa/runtime/application_settings.rb
@@ -26,6 +26,15 @@ module QA
raise("Couldn't set application settings #{application_settings.inspect}, code: '#{r.code}', body: #{body}")
end
+ # Get a single application setting
+ #
+ # @param setting [Symbol] the name of the setting to get
+ # @param api_client [Runtime::API::Client] the API client representing the admin user who will get the setting
+ # @return [String]
+ def get_application_setting(setting, api_client: admin_api_client)
+ get_application_settings(api_client: api_client).fetch(setting)
+ end
+
def get_application_settings(api_client: admin_api_client)
parse_body(get(Runtime::API::Request.new(api_client, APPLICATION_SETTINGS_PATH).url))
end
diff --git a/qa/qa/runtime/env.rb b/qa/qa/runtime/env.rb
index 54f9db65afb..517cb00df41 100644
--- a/qa/qa/runtime/env.rb
+++ b/qa/qa/runtime/env.rb
@@ -253,6 +253,10 @@ module QA
enabled?(ENV['USE_SELENOID'], default: false)
end
+ def save_all_videos?
+ enabled?(ENV['QA_SAVE_ALL_VIDEOS'], default: false)
+ end
+
def require_video_variables!
docs_link = 'https://gitlab.com/gitlab-org/gitlab-qa/-/blob/master/docs/running_against_remote_grid.md#testing-with-selenoid'
use_selenoid? || (raise ArgumentError, "USE_SELENOID is required! See docs: #{docs_link}")
@@ -282,6 +286,14 @@ module QA
ENV['QA_GITHUB_PASSWORD']
end
+ def facebook_username
+ ENV['QA_FACEBOOK_USERNAME']
+ end
+
+ def facebook_password
+ ENV['QA_FACEBOOK_PASSWORD']
+ end
+
def forker?
!!(forker_username && forker_password)
end
@@ -444,6 +456,10 @@ module QA
ENV['QA_GITHUB_ACCESS_TOKEN'].to_s.strip
end
+ def github_additional_access_tokens
+ ENV['QA_ADDITIONAL_GITHUB_ACCESS_TOKENS']
+ end
+
def require_github_access_token!
return unless github_access_token.empty?
@@ -558,6 +574,10 @@ module QA
ENV.fetch('QA_CONTAINER_REGISTRY_HOST', 'registry.gitlab.com')
end
+ def runner_container_image
+ ENV.fetch('QA_RUNNER_CONTAINER_IMAGE', 'gitlab-runner:alpine')
+ end
+
# ENV variables for authenticating against a private container registry
# These need to be set if using the
# Service::DockerRun::Mixins::ThirdPartyDocker module
@@ -622,6 +642,10 @@ module QA
ENV['QA_1P_GITHUB_UUID']
end
+ def gdk_url
+ ENV['GDK_URL']
+ end
+
private
def remote_grid_credentials
diff --git a/qa/qa/runtime/fixtures.rb b/qa/qa/runtime/fixtures.rb
index 201cf7f0fcb..4319f142bba 100644
--- a/qa/qa/runtime/fixtures.rb
+++ b/qa/qa/runtime/fixtures.rb
@@ -35,7 +35,7 @@ module QA
end
def read_fixture(fixture_path, file_name)
- File.read(File.join(Runtime::Path.fixtures_path, fixture_path, file_name))
+ File.read(Runtime::Path.fixture(fixture_path, file_name))
end
private
diff --git a/qa/qa/runtime/gpg.rb b/qa/qa/runtime/gpg.rb
index 3314b14cd68..fb2a63ba2e3 100644
--- a/qa/qa/runtime/gpg.rb
+++ b/qa/qa/runtime/gpg.rb
@@ -14,7 +14,7 @@ module QA
def key
return @key if defined?(@key)
- shell("gpg --import #{File.join(Path.fixtures_path, 'gpg', 'admin.asc')}")
+ shell("gpg --import #{Path.fixture('gpg', 'admin.asc')}")
@key = shell("gpg --armor --export #{key_id}")
end
end
diff --git a/qa/qa/runtime/path.rb b/qa/qa/runtime/path.rb
index fd451f2df19..ae1b26ca84a 100644
--- a/qa/qa/runtime/path.rb
+++ b/qa/qa/runtime/path.rb
@@ -3,14 +3,18 @@
module QA
module Runtime
module Path
- extend self
+ class << self
+ def qa_root
+ ::File.expand_path('../../', __dir__)
+ end
- def qa_root
- ::File.expand_path('../../', __dir__)
- end
+ def fixtures_path
+ ::File.expand_path('../fixtures', __dir__)
+ end
- def fixtures_path
- ::File.expand_path('../fixtures', __dir__)
+ def fixture(*args)
+ ::File.join(fixtures_path, *args)
+ end
end
end
end
diff --git a/qa/qa/scenario/test/instance/airgapped.rb b/qa/qa/scenario/test/instance/airgapped.rb
index 556741ec040..1d4d57b342e 100644
--- a/qa/qa/scenario/test/instance/airgapped.rb
+++ b/qa/qa/scenario/test/instance/airgapped.rb
@@ -8,7 +8,7 @@ module QA
include Bootable
include SharedAttributes
def perform(address, *rspec_options)
- Runtime::Scenario.define(:runner_network, 'airgapped')
+ Runtime::Scenario.define(:network, 'airgapped')
super
end
diff --git a/qa/qa/scenario/test/instance/blocking.rb b/qa/qa/scenario/test/instance/blocking.rb
new file mode 100644
index 00000000000..26bd71e04e8
--- /dev/null
+++ b/qa/qa/scenario/test/instance/blocking.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+module QA
+ module Scenario
+ module Test
+ module Instance
+ class Blocking < All
+ tags :reliable,
+ *Specs::Runner::DEFAULT_SKIPPED_TAGS.map { |tag| :"~#{tag}" }
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/scenario/test/instance/non_blocking.rb b/qa/qa/scenario/test/instance/non_blocking.rb
new file mode 100644
index 00000000000..602fa60b646
--- /dev/null
+++ b/qa/qa/scenario/test/instance/non_blocking.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module QA
+ module Scenario
+ module Test
+ module Instance
+ class NonBlocking < All
+ tags :"~reliable",
+ :"~smoke",
+ *Specs::Runner::DEFAULT_SKIPPED_TAGS.map { |tag| :"~#{tag}" }
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/scenario/test/integration/oauth.rb b/qa/qa/scenario/test/integration/oauth.rb
new file mode 100644
index 00000000000..912156fbc29
--- /dev/null
+++ b/qa/qa/scenario/test/integration/oauth.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+module QA
+ module Scenario
+ module Test
+ module Integration
+ class OAuth < Test::Instance::All
+ tags :oauth
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/service/docker_run/base.rb b/qa/qa/service/docker_run/base.rb
index 1a25aeb4c19..d6b50db7fa9 100644
--- a/qa/qa/service/docker_run/base.rb
+++ b/qa/qa/service/docker_run/base.rb
@@ -1,5 +1,7 @@
# frozen_string_literal: true
+require 'socket'
+
module QA
module Service
module DockerRun
@@ -11,8 +13,7 @@ module QA
end
def initialize
- @network = Runtime::Scenario.attributes[:network] || 'test'
- @runner_network = Runtime::Scenario.attributes[:runner_network] || @network
+ @network = gdk_network || Runtime::Scenario.attributes[:network] || 'test'
end
# Authenticate against a container registry
@@ -42,10 +43,6 @@ module QA
network_exists?(@network) ? @network : 'bridge'
end
- def runner_network
- network_exists?(@runner_network) ? @runner_network : network
- end
-
def inspect_network(name)
shell("docker network inspect #{name}", fail_on_exception: false, return_exit_status: true)
end
@@ -90,6 +87,33 @@ module QA
def health
shell("docker inspect --format='{{json .State.Health.Status}}' #{@name}").delete('"')
end
+
+ # The network to use when testing against GDK in docker
+ #
+ # @return [String]
+ def gdk_network
+ return unless Runtime::Env.gdk_url
+
+ 'host'
+ end
+
+ # The IP address of the docker host when testing against GDK in docker
+ #
+ # @return [String]
+ def gdk_host_ip
+ return unless Runtime::Env.gdk_url
+
+ Addrinfo.tcp(URI(Runtime::Env.gdk_url).host, nil).ip_address
+ end
+
+ # Returns the IP address of the docker host
+ #
+ # @return [String]
+ def host_ip
+ docker_host = shell("docker context inspect --format='{{json .Endpoints.docker.Host}}'").delete('"')
+ ip = Addrinfo.tcp(URI(docker_host).host, nil).ip_address
+ ip == '0.0.0.0' ? '127.0.0.1' : ip
+ end
end
end
end
diff --git a/qa/qa/service/docker_run/gitlab_runner.rb b/qa/qa/service/docker_run/gitlab_runner.rb
index 078a3048cad..b0bb999e5d6 100644
--- a/qa/qa/service/docker_run/gitlab_runner.rb
+++ b/qa/qa/service/docker_run/gitlab_runner.rb
@@ -16,7 +16,7 @@ module QA
MSG
def initialize(name)
- @image = "#{QA::Runtime::Env.container_registry_host}/gitlab-org/gitlab-runner:alpine"
+ @image = "#{QA::Runtime::Env.container_registry_host}/gitlab-org/#{QA::Runtime::Env.runner_container_image}"
@name = name || "qa-runner-#{SecureRandom.hex(4)}"
@run_untagged = true
@executor = :shell
@@ -40,9 +40,10 @@ module QA
raise("Missing runner token value!") unless token
cmd = <<~CMD.tr("\n", ' ')
- docker run -d --rm --network #{runner_network} --name #{@name}
+ docker run -d --rm --network #{network} --name #{@name}
#{'-v /var/run/docker.sock:/var/run/docker.sock' if @executor == :docker}
--privileged
+ #{"--add-host gdk.test:#{gdk_host_ip}" if gdk_network}
#{@image} #{add_gitlab_tls_cert if @address.include? 'https'}
&& docker exec --detach #{@name} sh -c "#{register_command}"
CMD
@@ -51,7 +52,7 @@ module QA
wait_until_running_and_configured
# Prove airgappedness
- shell("docker exec #{@name} sh -c '#{prove_airgap}'") if runner_network == 'airgapped'
+ shell("docker exec #{@name} sh -c '#{prove_airgap}'") if network == 'airgapped'
end
def tags=(tags)
diff --git a/qa/qa/service/docker_run/ldap.rb b/qa/qa/service/docker_run/ldap.rb
index a6982bddf28..ea0f774b8d9 100644
--- a/qa/qa/service/docker_run/ldap.rb
+++ b/qa/qa/service/docker_run/ldap.rb
@@ -28,7 +28,7 @@ module QA
if volume_exists?(volume_name)
volume_name
else
- ::File.join(Runtime::Path.fixtures_path, 'ldap', volume_name)
+ Runtime::Path.fixture('ldap', volume_name)
end
end
diff --git a/qa/qa/service/docker_run/smocker.rb b/qa/qa/service/docker_run/smocker.rb
index b48f8aa84e3..59f32e29b44 100644
--- a/qa/qa/service/docker_run/smocker.rb
+++ b/qa/qa/service/docker_run/smocker.rb
@@ -38,10 +38,14 @@ module QA
@api = nil
end
+ def self.logs
+ @container&.logs
+ end
+
attr_reader :public_port, :admin_port
def host_name
- return '127.0.0.1' unless QA::Runtime::Env.running_in_ci? || QA::Runtime::Env.qa_hostname
+ return host_ip unless QA::Runtime::Env.running_in_ci? || QA::Runtime::Env.qa_hostname
"#{@name}.#{@network_cache}"
end
diff --git a/qa/qa/service/docker_run/video.rb b/qa/qa/service/docker_run/video.rb
index c75280b1282..601e342b6ba 100644
--- a/qa/qa/service/docker_run/video.rb
+++ b/qa/qa/service/docker_run/video.rb
@@ -29,6 +29,7 @@ module QA
if @recorder_container_name.present? && @browser_container_hostname
configure_rspec
+ configure_rspec_allure if QA::Runtime::Env.generate_allure_report?
QA::Runtime::Logger.info("Test failure video recording setup complete!")
else
@@ -69,17 +70,60 @@ module QA
QA::Runtime::Logger.warn("Video deletion error: #{e}")
end
+ def record?(example)
+ example.metadata[:file_path].include?("/browser_ui/")
+ end
+
+ def save?(example)
+ example.exception || QA::Runtime::Env.save_all_videos?
+ end
+
+ def retrieve_video(example)
+ return unless record?(example) && example.exception
+
+ # We need to wait until the video is finished processing by checking the size
+ QA::Support::Waiter.wait_until(max_duration: 30, sleep_interval: 1) do
+ size =
+ shell("docker exec #{@recorder_container_name} sh -c 'stat -c %s /data/#{@current_recording_name}.mp4'")
+ size.to_i > 1024
+ end
+
+ shell("docker cp #{@recorder_container_name}:/data/#{@current_recording_name}.mp4 tmp/")
+
+ "#{shell('pwd')}/tmp/#{@current_recording_name}.mp4"
+ rescue StandardError => e
+ QA::Runtime::Logger.warn("Video retrieval error: #{e}")
+ end
+
private
def configure_rspec
RSpec.configure do |config|
config.prepend_before do |example|
- QA::Service::DockerRun::Video.start_recording(example)
+ QA::Service::DockerRun::Video.start_recording(example) if QA::Service::DockerRun::Video.record?(example)
+ end
+
+ config.prepend_after do |example|
+ if QA::Service::DockerRun::Video.record?(example)
+ QA::Service::DockerRun::Video.stop_recording
+ QA::Service::DockerRun::Video.delete_video unless QA::Service::DockerRun::Video.save?(example)
+ end
end
+ end
+ end
+ def configure_rspec_allure
+ RSpec.configure do |config|
config.append_after do |example|
- QA::Service::DockerRun::Video.stop_recording
- QA::Service::DockerRun::Video.delete_video unless example.exception
+ video_path = QA::Service::DockerRun::Video.retrieve_video(example)
+ if video_path
+ Allure.add_attachment(
+ name: 'video',
+ source: File.open(video_path),
+ type: 'video/mp4',
+ test_case: true
+ )
+ end
end
end
end
diff --git a/qa/qa/service/praefect_manager.rb b/qa/qa/service/praefect_manager.rb
index 684b18a97a7..56627e51b76 100644
--- a/qa/qa/service/praefect_manager.rb
+++ b/qa/qa/service/praefect_manager.rb
@@ -198,56 +198,6 @@ module QA
destination_storage[:type] == :praefect ? verify_storage_move_to_praefect(repo_path, destination_storage[:name]) : verify_storage_move_to_gitaly(repo_path, destination_storage[:name])
end
- def praefect_dataloss_information(project_id)
- dataloss_info = []
- cmd = "docker exec #{@praefect} praefect -config /var/opt/gitlab/praefect/config.toml dataloss --partially-unavailable=true"
- shell(cmd) { |line| dataloss_info << line.strip }
-
- # Expected will have a record for each repository in the storage, in the following format
- # @hashed/bc/52/bc52dd634277c4a34a2d6210994a9a5e2ab6d33bb4a3a8963410e00ca6c15a02.git:
- # Primary: gitaly1
- # In-Sync Storages:
- # gitaly1, assigned host
- # gitaly3, assigned host
- # Outdated Storages:
- # gitaly2 is behind by 1 change or less, assigned host
- #
- # Alternatively, if all repositories are in sync, a concise message is returned
- # Virtual storage: default
- # All repositories are fully available on all assigned storages!
-
- # extract the relevant project under test info if it is identified
- start_index = dataloss_info.index { |line| line.include?("#{Digest::SHA256.hexdigest(project_id.to_s)}.git") }
- unless start_index.nil?
- dataloss_info = dataloss_info[start_index, 7]
- end
-
- dataloss_info&.each { |info| QA::Runtime::Logger.debug(info) }
- dataloss_info
- end
-
- def wait_for_project_synced_across_all_storages(project_id)
- Support::Retrier.retry_until(max_duration: 60) do
- praefect_dataloss_information(project_id).include?('All repositories are fully available on all assigned storages!')
- end
- end
-
- def accept_dataloss_for_project(project_id, authoritative_storage)
- repository_hash = "#{Digest::SHA256.hexdigest(project_id.to_s)}"
- repository = "@hashed/#{repository_hash[0, 2]}/#{repository_hash[2, 2]}/#{repository_hash}.git"
-
- cmd = %{
- docker exec #{@praefect} \
- praefect \
- -config /var/opt/gitlab/praefect/config.toml \
- accept-dataloss \
- --virtual-storage=default \
- --repository=#{repository} \
- --authoritative-storage=#{authoritative_storage}
- }
- shell(cmd)
- end
-
def wait_for_health_check_all_nodes
gitaly_nodes.each { |node| wait_for_gitaly_health_check(node) }
end
@@ -310,27 +260,6 @@ module QA
Support::Waiter.wait_until(sleep_interval: 1) { replication_queue_incomplete_count == 0 && replicated?(project_id) }
end
- def wait_for_replication_to_node(project_id, node)
- Support::Waiter.wait_until(sleep_interval: 1) do
- result = []
- shell sql_to_docker_exec_cmd(%{
- select * from replication_queue
- where state = 'ready'
- and job ->> 'change' = 'update'
- and job ->> 'target_node_storage' = '#{node}'
- and job ->> 'relative_path' = '#{Digest::SHA256.hexdigest(project_id.to_s)}.git';
- }) do |line|
- result << line.strip
- QA::Runtime::Logger.debug(line.strip)
- end
- # The result should look like this when all items are replicated
- # id | state | created_at | updated_at | attempt | lock_id | job | meta
- # ----+-------+------------+------------+---------+---------+-----+------
- # (0 rows)
- result[2] == '(0 rows)'
- end
- end
-
def replication_pending?
result = []
shell sql_to_docker_exec_cmd(
@@ -357,58 +286,6 @@ module QA
result.size >= 5
end
- def list_untracked_repositories
- untracked_repositories = []
- shell "docker exec #{@praefect} bash -c 'gitlab-ctl praefect list-untracked-repositories'" do |line|
- # Results look like this
- # The following repositories were found on disk, but missing from the tracking database:
- # {"relative_path":"@hashed/aa/bb.git","storage":"gitaly1","virtual_storage":"default"}
- # {"relative_path":"@hashed/bb/cc.git","storage":"gitaly3","virtual_storage":"default"}
-
- QA::Runtime::Logger.debug(line.chomp)
- untracked_repositories.append(JSON.parse(line))
- rescue JSON::ParserError
- # Ignore lines that can't be parsed as JSON
- end
-
- QA::Runtime::Logger.debug("list_untracked_repositories --- #{untracked_repositories}")
- untracked_repositories
- end
-
- def track_repository_in_praefect(relative_path, storage, virtual_storage)
- cmd = "gitlab-ctl praefect track-repository --repository-relative-path #{relative_path} --authoritative-storage #{storage} --virtual-storage-name #{virtual_storage}"
- shell "docker exec #{@praefect} bash -c '#{cmd}'"
- end
-
- def remove_tracked_praefect_repository(relative_path, virtual_storage)
- cmd = "gitlab-ctl praefect remove-repository --repository-relative-path #{relative_path} --virtual-storage-name #{virtual_storage} --apply"
- shell "docker exec #{@praefect} bash -c '#{cmd}'"
- end
-
- # set_replication_factor assigns or unassigns random storage nodes as necessary to reach the desired replication factor for a repository
- def set_replication_factor(relative_path, virtual_storage, factor)
- cmd = "/opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml set-replication-factor -repository #{relative_path} -virtual-storage #{virtual_storage} -replication-factor #{factor}"
- shell "docker exec #{@praefect} bash -c '#{cmd}'"
- end
-
- # get_replication_storages retrieves a list of currently assigned storages for a repository
- def get_replication_storages(relative_path, virtual_storage)
- storage_repositories = []
- query = "SELECT storage FROM repository_assignments WHERE relative_path='#{relative_path}' AND virtual_storage='#{virtual_storage}';"
- shell(sql_to_docker_exec_cmd(query)) { |line| storage_repositories << line.strip }
- # Returned data from query will be in format
- # storage
- # --------
- # gitaly1
- # gitaly3
- # gitaly2
- # (3 rows)
- #
-
- # remove 2 header rows and last 2 rows from query response (including blank line)
- storage_repositories[2..-3]
- end
-
def modify_repo_access_time(node, repo_path, update_time)
repo = "/var/opt/gitlab/git-data/repositories/#{repo_path}"
shell(%{
@@ -416,65 +293,6 @@ module QA
})
end
- def add_repo_to_disk(node, repo_path)
- cmd = "GIT_DIR=. git init --initial-branch=main /var/opt/gitlab/git-data/repositories/#{repo_path}"
- shell "docker exec --user git #{node} bash -c '#{cmd}'"
- modify_repo_access_time(node, repo_path, "24 hours ago")
- end
-
- def remove_repo_from_disk(repo_path)
- cmd = "rm -rf /var/opt/gitlab/git-data/repositories/#{repo_path}"
- shell "docker exec #{@primary_node} bash -c '#{cmd}'"
- shell "docker exec #{@secondary_node} bash -c '#{cmd}'"
- shell "docker exec #{@tertiary_node} bash -c '#{cmd}'"
- end
-
- def remove_repository_from_praefect_database(relative_path)
- shell sql_to_docker_exec_cmd("delete from repositories where relative_path = '#{relative_path}';")
- shell sql_to_docker_exec_cmd("delete from storage_repositories where relative_path = '#{relative_path}';")
- end
-
- def praefect_database_tracks_repo?(relative_path)
- storage_repositories = []
- shell sql_to_docker_exec_cmd("SELECT count(*) FROM storage_repositories where relative_path='#{relative_path}';") do |line|
- storage_repositories << line
- end
- QA::Runtime::Logger.debug("storage_repositories count is ---#{storage_repositories}")
-
- repositories = []
- shell sql_to_docker_exec_cmd("SELECT count(*) FROM repositories where relative_path='#{relative_path}';") do |line|
- repositories << line
- end
- QA::Runtime::Logger.debug("repositories count is ---#{repositories}")
-
- (storage_repositories[2].to_i >= 1) && (repositories[2].to_i >= 1)
- end
-
- def repository_replicated_to_disk?(node, relative_path)
- Support::Waiter.wait_until(max_duration: 300, sleep_interval: 1, raise_on_failure: false) do
- result = []
- shell sql_to_docker_exec_cmd("SELECT count(*) FROM storage_repositories where relative_path='#{relative_path}';") do |line|
- result << line
- end
- QA::Runtime::Logger.debug("result is ---#{result}")
- result[2].to_i == 3
- end
-
- repository_exists_on_node_disk?(node, relative_path)
- end
-
- def repository_exists_on_node_disk?(node, relative_path)
- # If the dir does not exist it has a non zero exit code leading to a error being raised
- # Instead we echo a test line if the dir does not exist, which has a zero exit code, with no output
- bash_command = "test -d /var/opt/gitlab/git-data/repositories/#{relative_path} || echo -n 'DIR_DOES_NOT_EXIST'"
- result = []
- shell "docker exec #{node} bash -c '#{bash_command}'" do |line|
- result << line
- end
- QA::Runtime::Logger.debug("result is ---#{result}")
- result.exclude?("DIR_DOES_NOT_EXIST")
- end
-
private
def dataloss_command
diff --git a/qa/qa/specs/features/api/12_systems/gitaly/praefect_dataloss_spec.rb b/qa/qa/specs/features/api/12_systems/gitaly/praefect_dataloss_spec.rb
deleted file mode 100644
index 7b9164c1fc9..00000000000
--- a/qa/qa/specs/features/api/12_systems/gitaly/praefect_dataloss_spec.rb
+++ /dev/null
@@ -1,114 +0,0 @@
-# frozen_string_literal: true
-
-module QA
- RSpec.describe 'Systems' do
- describe 'Praefect dataloss commands', :orchestrated, :gitaly_cluster, product_group: :gitaly do
- let(:praefect_manager) { Service::PraefectManager.new }
-
- let(:project) do
- Resource::Project.fabricate! do |project|
- project.name = 'gitaly_cluster-dataloss-project'
- project.initialize_with_readme = true
- end
- end
-
- before do
- praefect_manager.start_all_nodes
- end
-
- it 'confirms that changes are synced across all storages',
- testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/352691' do
- expect { praefect_manager.praefect_dataloss_information(project.id) }
- .to(eventually_include('All repositories are fully available on all assigned storages!')
- .within(max_duration: 60))
- end
-
- it 'identifies how many changes are not in sync across storages',
- testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/352692' do
- # Ensure our test repository is replicated and in a consistent state prior to test
- praefect_manager.wait_for_project_synced_across_all_storages(project.id)
-
- # testing for gitaly2 'out of sync'
- praefect_manager.stop_node(praefect_manager.secondary_node)
-
- number_of_changes = 3
- 1.upto(number_of_changes) do |i|
- Resource::Repository::Commit.fabricate_via_api! do |commit|
- commit.project = project
- commit.branch = "newbranch-#{SecureRandom.hex(8)}"
- commit.start_branch = project.default_branch
- commit.commit_message = 'Add new file'
- commit.add_files(
- [{
- file_path: "new_file-#{SecureRandom.hex(8)}.txt", content: 'new file'
- }]
- )
- end
- end
-
- # testing for gitaly3 'in sync' but marked unhealthy
- praefect_manager.stop_node(praefect_manager.tertiary_node)
-
- project_data_loss = praefect_manager.praefect_dataloss_information(project.id)
- aggregate_failures "validate dataloss identified" do
- expect(project_data_loss).to include('gitaly1, assigned host')
- expect(project_data_loss)
- .to include("gitaly2 is behind by #{number_of_changes} changes or less, assigned host, unhealthy")
- expect(project_data_loss).to include('gitaly3, assigned host, unhealthy')
- end
- end
-
- it 'allows admin resolve scenario where data cannot be recovered',
- testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/352708' do
- # Ensure everything is in sync before begining test
- praefect_manager.wait_for_project_synced_across_all_storages(project.id)
-
- Resource::Repository::Commit.fabricate_via_api! do |commit|
- commit.project = project
- commit.commit_message = 'accept-dataloss-1'
- commit.add_files(
- [{
- file_path: "new_file-#{SecureRandom.hex(8)}.txt", content: 'Add a commit to gitaly1,gitaly2,gitaly3'
- }]
- )
- end
-
- praefect_manager.wait_for_replication_to_node(project.id, praefect_manager.primary_node)
- praefect_manager.stop_node(praefect_manager.primary_node)
- Resource::Repository::Commit.fabricate_via_api! do |commit|
- commit.project = project
- commit.commit_message = 'accept-dataloss-2'
- commit.add_files(
- [{
- file_path: "new_file-#{SecureRandom.hex(8)}.txt", content: 'Add a commit to gitaly2,gitaly3'
- }]
- )
- end
-
- praefect_manager.wait_for_replication_to_node(project.id, praefect_manager.secondary_node)
- praefect_manager.stop_node(praefect_manager.secondary_node)
- Resource::Repository::Commit.fabricate_via_api! do |commit|
- commit.project = project
- commit.commit_message = 'accept-dataloss-3'
- commit.add_files([
- { file_path: "new_file-#{SecureRandom.hex(8)}.txt", content: 'Add a commit to gitaly3' }
- ])
- end
-
- # Confirms that they want to accept dataloss, using gitaly2 as authoritative storage to use as a base
- praefect_manager.accept_dataloss_for_project(project.id, praefect_manager.secondary_node)
-
- # Restart nodes, and allow replication to apply dataloss changes
- praefect_manager.start_all_nodes
- praefect_manager.wait_for_project_synced_across_all_storages(project.id)
-
- # Validate that gitaly2 was accepted as the authorative storage
- aggregate_failures "validate correct set of commits available" do
- expect(project.commits.map { |commit| commit[:message].chomp }).to include('accept-dataloss-1')
- expect(project.commits.map { |commit| commit[:message].chomp }).to include('accept-dataloss-2')
- expect(project.commits.map { |commit| commit[:message].chomp }).not_to include('accept-dataloss-3')
- end
- end
- end
- end
-end
diff --git a/qa/qa/specs/features/api/12_systems/gitaly/praefect_repo_sync_spec.rb b/qa/qa/specs/features/api/12_systems/gitaly/praefect_repo_sync_spec.rb
deleted file mode 100644
index 4f916300ee3..00000000000
--- a/qa/qa/specs/features/api/12_systems/gitaly/praefect_repo_sync_spec.rb
+++ /dev/null
@@ -1,96 +0,0 @@
-# frozen_string_literal: true
-
-module QA
- RSpec.describe 'Systems' do
- describe 'Praefect repository commands', :orchestrated, :gitaly_cluster, product_group: :gitaly do
- let(:praefect_manager) { Service::PraefectManager.new }
-
- let(:repo1) do
- { "relative_path" => "@hashed/repo1.git", "storage" => "gitaly1", "virtual_storage" => "default" }
- end
-
- let(:repo2) do
- { "relative_path" => "@hashed/path/to/repo2.git", "storage" => "gitaly3", "virtual_storage" => "default" }
- end
-
- before do
- praefect_manager.start_all_nodes
- praefect_manager.add_repo_to_disk(praefect_manager.primary_node, repo1["relative_path"])
- praefect_manager.add_repo_to_disk(praefect_manager.tertiary_node, repo2["relative_path"])
- end
-
- after do
- praefect_manager.remove_repo_from_disk(repo1["relative_path"])
- praefect_manager.remove_repo_from_disk(repo2["relative_path"])
- praefect_manager.remove_repository_from_praefect_database(repo1["relative_path"])
- praefect_manager.remove_repository_from_praefect_database(repo2["relative_path"])
- end
-
- it 'allows admin to manage difference between praefect database and disk state',
- testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347606' do
- # Some repos are on disk that praefect is not aware of
- untracked_repositories = praefect_manager.list_untracked_repositories
- expect(untracked_repositories).to include(repo1)
- expect(untracked_repositories).to include(repo2)
-
- # admin manually adds the first repo to the praefect database
- praefect_manager
- .track_repository_in_praefect(repo1["relative_path"], repo1["storage"], repo1["virtual_storage"])
- untracked_repositories = praefect_manager.list_untracked_repositories
- expect(untracked_repositories).not_to include(repo1)
- expect(untracked_repositories).to include(repo2)
- expect(praefect_manager.repository_exists_on_node_disk?(praefect_manager.primary_node, repo1["relative_path"]))
- .to be true
- expect(praefect_manager.praefect_database_tracks_repo?(repo1["relative_path"])).to be true
-
- # admin manually adds the second repo to the praefect database
- praefect_manager
- .track_repository_in_praefect(repo2["relative_path"], repo2["storage"], repo2["virtual_storage"])
- untracked_repositories = praefect_manager.list_untracked_repositories
- expect(untracked_repositories).not_to include(repo2)
- expect(praefect_manager.repository_exists_on_node_disk?(praefect_manager.tertiary_node, repo2["relative_path"]))
- .to be true
- expect(praefect_manager.praefect_database_tracks_repo?(repo2["relative_path"])).to be true
-
- # admin ensures replication to other nodes occurs
- expect(praefect_manager.repository_replicated_to_disk?(praefect_manager.secondary_node, repo1["relative_path"]))
- .to be true
- expect(praefect_manager.repository_replicated_to_disk?(praefect_manager.tertiary_node, repo1["relative_path"]))
- .to be true
- expect(praefect_manager.repository_replicated_to_disk?(praefect_manager.primary_node, repo2["relative_path"]))
- .to be true
- expect(praefect_manager.repository_replicated_to_disk?(praefect_manager.secondary_node, repo2["relative_path"]))
- .to be true
-
- # admin chooses to remove the first repo completely from praefect and disk
- praefect_manager.remove_tracked_praefect_repository(repo1["relative_path"], repo1["virtual_storage"])
- expect(praefect_manager.repository_exists_on_node_disk?(praefect_manager.primary_node, repo1["relative_path"]))
- .to be false
- expect(praefect_manager.repository_exists_on_node_disk?(praefect_manager
- .secondary_node, repo1["relative_path"])).to be false
- expect(praefect_manager.repository_exists_on_node_disk?(praefect_manager.tertiary_node, repo1["relative_path"]))
- .to be false
- expect(praefect_manager.praefect_database_tracks_repo?(repo1["relative_path"])).to be false
-
- untracked_repositories = praefect_manager.list_untracked_repositories
- expect(untracked_repositories).not_to include(repo1)
- end
-
- it 'allows admin to control the number of replicas of data',
- testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347566' do
- praefect_manager
- .track_repository_in_praefect(repo1['relative_path'], repo1['storage'], repo1['virtual_storage'])
-
- praefect_manager.set_replication_factor(repo1['relative_path'], repo1['virtual_storage'], 2)
- replication_storages = praefect_manager
- .get_replication_storages(repo1['relative_path'], repo1['virtual_storage'])
- expect(replication_storages).to have_attributes(size: 2)
-
- praefect_manager.set_replication_factor(repo1['relative_path'], repo1['virtual_storage'], 3)
- replication_storages = praefect_manager
- .get_replication_storages(repo1['relative_path'], repo1['virtual_storage'])
- expect(replication_storages).to eq(%w[gitaly1 gitaly2 gitaly3])
- end
- end
- end
-end
diff --git a/qa/qa/specs/features/api/1_manage/import/import_large_github_repo_spec.rb b/qa/qa/specs/features/api/1_manage/import/import_large_github_repo_spec.rb
index b81cb70eb18..e9a9f838436 100644
--- a/qa/qa/specs/features/api/1_manage/import/import_large_github_repo_spec.rb
+++ b/qa/qa/specs/features/api/1_manage/import/import_large_github_repo_spec.rb
@@ -196,6 +196,7 @@ module QA
project.add_name_uuid = false
project.name = 'imported-project'
project.github_personal_access_token = Runtime::Env.github_access_token
+ project.additional_access_tokens = Runtime::Env.github_additional_access_tokens
project.github_repository_path = github_repo
project.personal_namespace = user.username
project.api_client = Runtime::API::Client.new(user: user)
@@ -204,6 +205,10 @@ module QA
end
end
+ before do
+ QA::Support::Helpers::ImportSource.enable('github')
+ end
+
after do |example|
next unless defined?(@import_time)
diff --git a/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_large_project_spec.rb b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_large_project_spec.rb
index ac8399b391d..99f8fb5107e 100644
--- a/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_large_project_spec.rb
+++ b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_large_project_spec.rb
@@ -65,6 +65,10 @@ module QA
let(:mrs) { fetch_mrs(imported_project, api_client) }
let(:issues) { fetch_issues(imported_project, api_client) }
+ before do
+ QA::Support::Helpers::ImportSource.enable(%w[gitlab_project])
+ end
+
# rubocop:disable RSpec/InstanceVariable
after do |example|
next unless defined?(@import_time)
diff --git a/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_mr_spec.rb b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_mr_spec.rb
index 7d785630a57..307d0493b2a 100644
--- a/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_mr_spec.rb
+++ b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_mr_spec.rb
@@ -70,7 +70,11 @@ module QA
context 'with merge request' do
it(
'successfully imports merge request',
- testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348478'
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348478',
+ quarantine: {
+ type: :bug,
+ issue: "https://gitlab.com/gitlab-org/gitlab/-/issues/414859"
+ }
) do
expect_project_import_finished_successfully
expect(imported_mrs.count).to eq(1)
diff --git a/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_project_spec.rb b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_project_spec.rb
index 0c94d6e64d5..7cbccf9be44 100644
--- a/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_project_spec.rb
+++ b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_project_spec.rb
@@ -24,7 +24,7 @@ module QA
group.api_client = admin_api_client
group.sandbox = source_sandbox
group.path = "source-group-for-import-#{SecureRandom.hex(4)}"
- group.avatar = File.new(File.join(Runtime::Path.fixtures_path, 'designs', 'tanuki.jpg'), 'r')
+ group.avatar = File.new(Runtime::Path.fixture('designs', 'tanuki.jpg'), 'r')
end
end
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
index 2443887c3d4..fcf15b66c11 100644
--- 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
@@ -34,10 +34,10 @@ module QA
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
- }),
+ 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,
diff --git a/qa/qa/specs/features/api/1_manage/rate_limits_spec.rb b/qa/qa/specs/features/api/1_manage/rate_limits_spec.rb
index 86fc154c1cf..d3b702a658c 100644
--- a/qa/qa/specs/features/api/1_manage/rate_limits_spec.rb
+++ b/qa/qa/specs/features/api/1_manage/rate_limits_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Manage', :requires_admin, :skip_live_env, except: { job: 'review-qa-*' } do
+ RSpec.describe 'Manage', :requires_admin, :skip_live_env, except: { job: %w[review-qa-* gdk-qa-*] } do
describe 'rate limits', :reliable, product_group: :import_and_integrate do
let(:rate_limited_user) { Resource::User.fabricate_via_api! }
let(:api_client) { Runtime::API::Client.new(:gitlab, user: rate_limited_user) }
diff --git a/qa/qa/specs/features/api/3_create/repository/add_list_delete_branches_spec.rb b/qa/qa/specs/features/api/3_create/repository/add_list_delete_branches_spec.rb
new file mode 100644
index 00000000000..f69a8a4dfa5
--- /dev/null
+++ b/qa/qa/specs/features/api/3_create/repository/add_list_delete_branches_spec.rb
@@ -0,0 +1,77 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.describe 'Create' do
+ let(:project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.name = 'project-qa-test'
+ project.description = 'project for qa test'
+ end
+ end
+
+ describe 'Create, Retrieve and Delete branches via API', :requires_admin, product_group: :source_code do
+ created_branch = 'create-branch'
+ deleted_branch = 'delete-branch'
+ filename = 'file.txt'
+ default_branch_commit_message = "Add #{filename}"
+
+ before do
+ Git::Repository.perform do |repository|
+ repository.uri = project.repository_http_location.uri
+ repository.use_default_credentials
+ repository.try_add_credentials_to_netrc
+
+ repository.act do
+ init_repository
+ configure_identity('GitLab QA', 'root@gitlab.com')
+
+ commit_file(filename, 'Test file content', default_branch_commit_message)
+ push_changes
+
+ checkout(deleted_branch, new_branch: true)
+ push_changes(deleted_branch)
+ end
+ end
+ project.wait_for_push default_branch_commit_message
+ end
+
+ it(
+ 'creates, retrieves and deletes branches',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347740'
+ ) do
+ # Create branch
+ Resource::Repository::Branch.fabricate_via_api! do |branch|
+ branch.name = created_branch
+ branch.project = project
+ end
+
+ # Retrieve branch
+ delete_branch = Resource::Repository::Branch.fabricate_via_api! do |branch|
+ branch.name = deleted_branch
+ branch.project = project
+ end
+
+ # Delete branch
+ delete_branch.remove_via_api!
+
+ # Clone repository, verify branches and commits
+ Git::Repository.perform do |repository|
+ repository.uri = project.repository_http_location.uri
+ repository.use_default_credentials
+ repository.try_add_credentials_to_netrc
+
+ repository.clone
+
+ branches = repository.remote_branches
+ expect(branches).to include(created_branch)
+ expect(branches).not_to include(deleted_branch)
+
+ expect(repository.commits.first).to include(default_branch_commit_message)
+
+ repository.checkout(created_branch)
+ expect(repository.commits.first).to include(default_branch_commit_message)
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/features/api/5_package/container_registry/saas/container_registry_spec.rb b/qa/qa/specs/features/api/5_package/container_registry/saas/container_registry_spec.rb
index d5073863dff..23d8585d07a 100644
--- a/qa/qa/specs/features/api/5_package/container_registry/saas/container_registry_spec.rb
+++ b/qa/qa/specs/features/api/5_package/container_registry/saas/container_registry_spec.rb
@@ -19,17 +19,17 @@ module QA
end
end
- let!(:project_access_token) do
- QA::Resource::ProjectAccessToken.fabricate_via_api! do |pat|
- pat.project = project
+ let!(:runner) do
+ Resource::ProjectRunner.fabricate! do |runner|
+ runner.project = project
+ runner.name = "runner-for-#{project.name}"
+ runner.tags = ["runner-for-#{project.name}"]
end
end
- let(:registry) do
- Resource::RegistryRepository.init do |repository|
- repository.name = project.path_with_namespace
- repository.project = project
- repository.tag_name = 'master'
+ let!(:project_access_token) do
+ QA::Resource::ProjectAccessToken.fabricate_via_api! do |pat|
+ pat.project = project
end
end
@@ -61,6 +61,8 @@ module QA
- docker build -t $IMAGE_TAG .
- docker push $IMAGE_TAG
- docker pull $IMAGE_TAG
+ tags:
+ - "runner-for-#{project.name}"
test:
image: dwdraju/alpine-curl-jq:latest
@@ -74,9 +76,15 @@ module QA
- if [ $status_code -ne 200 ]; then exit 1; fi;
- 'status_code=$(curl --head --output /dev/null --write-out "%{http_code}\n" --header "PRIVATE-TOKEN: #{masked_token}" "https://${CI_SERVER_HOST}/api/v4/projects/#{project.id}/registry/repositories/$id/tags/master")'
- if [ $status_code -ne 404 ]; then exit 1; fi;
+ tags:
+ - "runner-for-#{project.name}"
YAML
end
+ after do
+ runner.remove_via_api!
+ end
+
it 'pushes, pulls image to the registry and deletes tag',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348001' do
Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2, message: "Commit push") do
diff --git a/qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb
index 54fb2aca990..84664cb8b94 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb
@@ -46,7 +46,7 @@ module QA
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347931',
quarantine: {
type: :bug,
- only: { condition: -> { QA::Runtime::Env.super_sidebar_enabled? } },
+ only: { condition: -> { !QA::Runtime::Env.super_sidebar_enabled? } },
issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/409336'
}
) do
diff --git a/qa/qa/specs/features/browser_ui/1_manage/login/oauth_login_with_facebook_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/login/oauth_login_with_facebook_spec.rb
new file mode 100644
index 00000000000..ee4c3b167db
--- /dev/null
+++ b/qa/qa/specs/features/browser_ui/1_manage/login/oauth_login_with_facebook_spec.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.describe 'Manage', :orchestrated, :oauth, product_group: :authentication_and_authorization do
+ describe 'OAuth' do
+ it 'logs in with Facebook credentials',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/417115' do
+ Runtime::Browser.visit(:gitlab, Page::Main::Login)
+
+ Page::Main::Login.perform(&:sign_in_with_facebook)
+
+ Vendor::Facebook::Page::Login.perform(&:login)
+
+ expect(page).to have_content('Welcome to GitLab')
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/features/browser_ui/2_plan/design_management/add_design_content_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/design_management/add_design_content_spec.rb
index 130006fe424..63d30da9ec3 100644
--- a/qa/qa/specs/features/browser_ui/2_plan/design_management/add_design_content_spec.rb
+++ b/qa/qa/specs/features/browser_ui/2_plan/design_management/add_design_content_spec.rb
@@ -5,7 +5,7 @@ module QA
describe 'Design Management' do
let(:issue) { Resource::Issue.fabricate_via_api! }
let(:design_filename) { 'banana_sample.gif' }
- let(:design) { File.join(Runtime::Path.fixtures_path, 'designs', design_filename) }
+ let(:design) { Runtime::Path.fixture('designs', design_filename) }
let(:annotation) { "This design is great!" }
before do
diff --git a/qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb
index 4e9d74a5117..1a53fda4cdb 100644
--- a/qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb
+++ b/qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb
@@ -38,7 +38,7 @@ module QA
def mailhog_json
Support::Retrier.retry_until(sleep_interval: 1) do
- Runtime::Logger.debug(%Q[retrieving "#{QA::Runtime::MailHog.api_messages_url}"])
+ Runtime::Logger.debug(%[retrieving "#{QA::Runtime::MailHog.api_messages_url}"])
mailhog_response = get QA::Runtime::MailHog.api_messages_url
@@ -47,8 +47,8 @@ module QA
subjects = mailhog_data.dig('items')
.map { |item| mailhog_item_subject(item) }
- Runtime::Logger.debug(%Q[Total number of emails: #{total}])
- Runtime::Logger.debug(%Q[Subjects:\n#{subjects.join("\n")}])
+ Runtime::Logger.debug(%[Total number of emails: #{total}])
+ Runtime::Logger.debug(%[Subjects:\n#{subjects.join("\n")}])
# Expect at least two invitation messages: group and project
mailhog_data if mailhog_project_message_count(subjects) >= 1
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 821f885c4c8..33cd3879298 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
@@ -59,9 +59,7 @@ module QA
context 'when using attachments in comments', :object_storage do
let(:png_file_name) { 'testfile.png' }
- let(:file_to_attach) do
- File.join(Runtime::Path.fixtures_path, 'designs', png_file_name)
- end
+ let(:file_to_attach) { Runtime::Path.fixture('designs', png_file_name) }
before do
Resource::Issue.fabricate_via_api_unless_fips! { |issue| issue.project = project }.visit!
diff --git a/qa/qa/specs/features/browser_ui/2_plan/milestone/create_group_milestone_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/milestone/create_group_milestone_spec.rb
index 5febb6579df..ce6e9c6a1fb 100644
--- a/qa/qa/specs/features/browser_ui/2_plan/milestone/create_group_milestone_spec.rb
+++ b/qa/qa/specs/features/browser_ui/2_plan/milestone/create_group_milestone_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Plan', :reliable, product_group: :project_management do
+ RSpec.describe 'Plan', :reliable, :db_migrate, product_group: :project_management do
describe 'Group milestone' do
include Support::Dates
diff --git a/qa/qa/specs/features/browser_ui/2_plan/pages/new_static_page_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/pages/new_static_page_spec.rb
index 7368ca34683..919b4b2c46e 100644
--- a/qa/qa/specs/features/browser_ui/2_plan/pages/new_static_page_spec.rb
+++ b/qa/qa/specs/features/browser_ui/2_plan/pages/new_static_page_spec.rb
@@ -30,9 +30,6 @@ module QA
end
before do
- # Pages Menu Experiment currently progress https://gitlab.com/gitlab-org/gitlab/-/merge_requests/98044
- # Update spec along with Feature Flag Removal.
- Runtime::Feature.disable(:show_pages_in_deployments_menu)
Flow::Login.sign_in
Resource::ProjectRunner.fabricate_via_api! do |runner|
runner.project = project
@@ -41,10 +38,6 @@ module QA
pipeline.visit!
end
- after do
- Runtime::Feature.enable(:show_pages_in_deployments_menu)
- end
-
it 'creates a Pages website',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347669' do
Page::Project::Pipeline::Show.perform do |show|
@@ -57,7 +50,7 @@ module QA
end
Page::Project::Menu.perform(&:go_to_pages_settings)
- Page::Project::Settings::Pages.perform(&:go_to_access_page)
+ Page::Project::Deployments::Pages.perform(&:go_to_access_page)
Support::Waiter.wait_until(
sleep_interval: 2,
diff --git a/qa/qa/specs/features/browser_ui/2_plan/project_wiki/project_based_file_upload_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/project_wiki/project_based_file_upload_spec.rb
index a044bfa2054..bb411efc029 100644
--- a/qa/qa/specs/features/browser_ui/2_plan/project_wiki/project_based_file_upload_spec.rb
+++ b/qa/qa/specs/features/browser_ui/2_plan/project_wiki/project_based_file_upload_spec.rb
@@ -31,7 +31,7 @@ module QA
edit.set_title(page_title)
edit.use_new_editor
edit.add_heading('Heading 1', heading_text)
- edit.upload_image(File.join(Runtime::Path.fixtures_path, 'designs', image_file_name))
+ edit.upload_image(Runtime::Path.fixture('designs', image_file_name))
end
Page::Project::Wiki::Edit.perform(&:click_submit)
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 1e08fc49066..fcce6bb291c 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
@@ -46,7 +46,7 @@ module QA
label = Resource::ProjectLabel.fabricate_via_api! do |label|
label.project = project
- label.title = 'label'
+ label.title = 'foo::label'
end
Resource::MergeRequest.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 7b89b021d89..297f91be0bb 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
@@ -15,7 +15,7 @@ module QA
merge_request.title = 'Needs some suggestions'
merge_request.description = '... so please add them.'
merge_request.file_content = File.read(
- File.join(Runtime::Path.fixtures_path, 'metrics_dashboards', 'templating.yml')
+ Runtime::Path.fixture('metrics_dashboards', 'templating.yml')
)
end
end
diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/suggestions/custom_commit_suggestion_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/suggestions/custom_commit_suggestion_spec.rb
index 499d4c00384..ce32f4aadca 100644
--- a/qa/qa/specs/features/browser_ui/3_create/merge_request/suggestions/custom_commit_suggestion_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/suggestions/custom_commit_suggestion_spec.rb
@@ -17,7 +17,7 @@ module QA
merge_request.title = 'Needs some suggestions'
merge_request.description = '... so please add them.'
merge_request.file_content = File.read(
- File.join(Runtime::Path.fixtures_path, 'metrics_dashboards', 'templating.yml')
+ Runtime::Path.fixture('metrics_dashboards', 'templating.yml')
)
end
end
diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/add_list_delete_branches_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/add_list_delete_branches_spec.rb
deleted file mode 100644
index 631b4ae099d..00000000000
--- a/qa/qa/specs/features/browser_ui/3_create/repository/add_list_delete_branches_spec.rb
+++ /dev/null
@@ -1,99 +0,0 @@
-# frozen_string_literal: true
-
-module QA
- RSpec.describe 'Create' do
- describe 'Create, list, and delete branches via web', :requires_admin, product_group: :source_code do
- master_branch = nil
- second_branch = 'second-branch'
- third_branch = 'third-branch'
- file_1_master = 'file.txt'
- file_2_master = 'other-file.txt'
- file_second_branch = 'file-2.txt'
- file_third_branch = 'file-3.txt'
- first_commit_message_of_master_branch = "Add #{file_1_master}"
- second_commit_message_of_master_branch = "Add #{file_2_master}"
- commit_message_of_second_branch = "Add #{file_second_branch}"
- commit_message_of_third_branch = "Add #{file_third_branch}"
-
- before do
- Flow::Login.sign_in
-
- project = Resource::Project.fabricate_via_api! do |proj|
- proj.name = 'project-qa-test'
- proj.description = 'project for qa test'
- proj.initialize_with_readme = true
- end
-
- master_branch = project.default_branch
-
- Git::Repository.perform do |repository|
- repository.uri = project.repository_http_location.uri
- repository.use_default_credentials
- repository.try_add_credentials_to_netrc
- repository.default_branch = master_branch
-
- repository.act do
- clone
- configure_identity('GitLab QA', 'root@gitlab.com')
- commit_file(file_1_master, 'Test file content', first_commit_message_of_master_branch)
- push_changes
- checkout(second_branch, new_branch: true)
- commit_file(file_second_branch, 'File 2 content', commit_message_of_second_branch)
- push_changes(second_branch)
- checkout(master_branch)
- # This second commit on master is needed for the master branch to be ahead
- # of the second branch, and when the second branch is merged to master it will
- # show the 'merged' badge on it.
- # Refer to the below issue note:
- # https://gitlab.com/gitlab-org/gitlab-foss/issues/55524#note_126100848
- commit_file(file_2_master, 'Other test file content', second_commit_message_of_master_branch)
- push_changes
- merge(second_branch)
- push_changes
- checkout(third_branch, new_branch: true)
- commit_file(file_third_branch, 'File 3 content', commit_message_of_third_branch)
- push_changes(third_branch)
- end
- end
- project.wait_for_push commit_message_of_third_branch
- project.visit!
- end
-
- it(
- 'lists branches correctly after CRUD operations',
- testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347740',
- quarantine: {
- issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/414026',
- type: :stale
- }
- ) do
- Page::Project::Menu.perform(&:go_to_repository_branches)
-
- expect(page).to have_content(master_branch)
- expect(page).to have_content(second_branch)
- expect(page).to have_content(third_branch)
- expect(page).to have_content("Merge branch 'second-branch'")
- expect(page).to have_content(commit_message_of_second_branch)
- expect(page).to have_content(commit_message_of_third_branch)
-
- Page::Project::Branches::Show.perform do |branches_page|
- expect(branches_page).to have_branch_with_badge(second_branch, 'merged')
-
- branches_page.delete_branch(third_branch)
-
- expect(branches_page).to have_no_branch(third_branch)
-
- branches_page.delete_merged_branches('delete')
-
- expect(branches_page).to have_content(
- 'Merged branches are being deleted. This can take some time depending on the number of branches. Please refresh the page to see changes.'
- )
-
- branches_page.refresh
-
- expect(branches_page).to have_no_branch(second_branch, reload: true)
- end
- end
- end
- end
-end
diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/add_new_branch_rule_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/add_new_branch_rule_spec.rb
index 82074919ad4..1d9dccbddf6 100644
--- a/qa/qa/specs/features/browser_ui/3_create/repository/add_new_branch_rule_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/repository/add_new_branch_rule_spec.rb
@@ -2,11 +2,7 @@
module QA
RSpec.describe 'Create' do
- describe 'Branch Rules Overview', product_group: :source_code,
- quarantine: {
- issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/403583',
- type: :flaky
- } do
+ describe 'Branch Rules Overview', product_group: :source_code do
let(:branch_name) { 'new-branch' }
let(:allowed_to_push_role) { Resource::ProtectedBranch::Roles::NO_ONE }
let(:allowed_to_merge_role) { Resource::ProtectedBranch::Roles::MAINTAINERS }
diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/license_detection_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/license_detection_spec.rb
index 86a9f2c46fb..f00ef65fab4 100644
--- a/qa/qa/specs/features/browser_ui/3_create/repository/license_detection_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/repository/license_detection_spec.rb
@@ -11,7 +11,7 @@ module QA
shared_examples 'project license detection' do
it 'displays the name of the license on the repository' do
- license_path = File.join(Runtime::Path.fixtures_path, 'software_licenses', license_file_name)
+ license_path = Runtime::Path.fixture('software_licenses', license_file_name)
Resource::Repository::Commit.fabricate_via_api! do |commit|
commit.project = project
commit.add_files([{ file_path: 'LICENSE', content: File.read(license_path) }])
diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide_old/server_hooks_custom_error_message_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide_old/server_hooks_custom_error_message_spec.rb
index 99be95492e6..05925505610 100644
--- a/qa/qa/specs/features/browser_ui/3_create/web_ide_old/server_hooks_custom_error_message_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide_old/server_hooks_custom_error_message_spec.rb
@@ -8,7 +8,7 @@ module QA
end
describe 'Git Server Hooks' do
- let(:file_path) { File.join(Runtime::Path.fixtures_path, 'web_ide', 'README.md') }
+ let(:file_path) { Runtime::Path.fixture('web_ide', 'README.md') }
let(:project) do
Resource::Project.fabricate_via_api! do |project|
diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide_old/upload_new_file_in_web_ide_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide_old/upload_new_file_in_web_ide_spec.rb
index f15f5b3a1d9..c557f2fa8a6 100644
--- a/qa/qa/specs/features/browser_ui/3_create/web_ide_old/upload_new_file_in_web_ide_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide_old/upload_new_file_in_web_ide_spec.rb
@@ -8,8 +8,7 @@ module QA
end
describe 'Upload a file in Web IDE' do
- let(:file_path) { File.join(Runtime::Path.fixtures_path, 'web_ide', file_name) }
-
+ let(:file_path) { Runtime::Path.fixture('web_ide', file_name) }
let(:project) do
Resource::Project.fabricate_via_api! do |project|
project.name = 'upload-file-project'
diff --git a/qa/qa/specs/features/browser_ui/4_verify/ci_job_artifacts/unlocking_job_artifacts_across_pipelines_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/ci_job_artifacts/unlocking_job_artifacts_across_pipelines_spec.rb
index f1a433984d8..41ce868f0d6 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/ci_job_artifacts/unlocking_job_artifacts_across_pipelines_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/ci_job_artifacts/unlocking_job_artifacts_across_pipelines_spec.rb
@@ -24,6 +24,10 @@ module QA
project.visit!
end
+ after do
+ runner.remove_via_api!
+ end
+
context 'when latest pipeline is successful' do
before do
add_ci_file(job_name: 'job_1', script: 'echo test')
@@ -127,32 +131,41 @@ module QA
def add_ci_file(job_name:, script:)
ci_file = ci_file_with_job_artifact(job_name, script)
+ original_pipeline_count = pipeline_count
Resource::Repository::Commit.fabricate_via_api! do |commit|
commit.project = project
commit.commit_message = "Set job #{job_name} script #{script}"
commit.add_files([ci_file])
end
+
+ wait_for_new_pipeline(original_pipeline_count)
end
def update_ci_file(job_name:, script:)
ci_file = ci_file_with_job_artifact(job_name, script)
+ original_pipeline_count = pipeline_count
Resource::Repository::Commit.fabricate_via_api! do |commit|
commit.project = project
commit.commit_message = "Set job #{job_name} script #{script}"
commit.update_files([ci_file])
end
+
+ wait_for_new_pipeline(original_pipeline_count)
end
def update_ci_with_manual_job(job_name:, script:)
ci_file = ci_file_with_manual_job(job_name, script)
+ original_pipeline_count = pipeline_count
Resource::Repository::Commit.fabricate_via_api! do |commit|
commit.project = project
commit.commit_message = "Set job #{job_name} script #{script}"
commit.update_files([ci_file])
end
+
+ wait_for_new_pipeline(original_pipeline_count)
end
def ci_file_with_job_artifact(job_name, script)
@@ -199,6 +212,15 @@ module QA
job.id = project.job_by_name(job_name)[:id]
end
end
+
+ def pipeline_count
+ project.pipelines.length
+ end
+
+ def wait_for_new_pipeline(original_pipeline_count)
+ QA::Runtime::Logger.info('Waiting for new pipeline to be created')
+ Support::Waiter.wait_until { pipeline_count > original_pipeline_count }
+ end
end
end
end
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_tabs_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_tabs_spec.rb
deleted file mode 100644
index a9f46e394f7..00000000000
--- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_tabs_spec.rb
+++ /dev/null
@@ -1,118 +0,0 @@
-# frozen_string_literal: true
-
-module QA
- RSpec.describe 'Verify' do
- describe 'Pipeline editor', :reliable, product_group: :pipeline_authoring do
- let(:project) do
- Resource::Project.fabricate_via_api! do |project|
- project.name = 'pipeline-editor-project'
- end
- end
-
- let!(:commit) do
- Resource::Repository::Commit.fabricate_via_api! do |commit|
- commit.project = project
- commit.commit_message = 'Add .gitlab-ci.yml'
- commit.add_files(
- [
- {
- file_path: '.gitlab-ci.yml',
- content: <<~YAML
- stages:
- - stage1
- - stage2
-
- job1:
- stage: stage1
- script: echo 'Done.'
-
- job2:
- stage: stage2
- script: echo 'Done.'
- YAML
- }
- ]
- )
- end
- end
-
- let(:invalid_content) do
- <<~YAML
-
- job3:
- stage: stage_foo
- script: echo 'Done.'
- YAML
- end
-
- before do
- # Make sure a pipeline is created before visiting pipeline editor page.
- # Otherwise, test might timeout before the page finishing fetching pipeline status.
- Support::Waiter.wait_until { project.pipelines.present? }
-
- Flow::Login.sign_in
- project.visit!
- Page::Project::Menu.perform(&:go_to_pipeline_editor)
- end
-
- context 'when CI has valid syntax' do
- it(
- 'shows valid validations',
- testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/368332'
- ) do
- Page::Project::PipelineEditor::Show.perform do |show|
- aggregate_failures do
- expect(show.ci_syntax_validate_message).to have_content('Pipeline syntax is correct')
-
- show.go_to_visualize_tab
- { stage1: 'job1', stage2: 'job2' }.each_pair do |stage, job|
- expect(show).to have_stage(stage), "Pipeline graph does not have stage #{stage}."
- expect(show).to have_job(job), "Pipeline graph does not have job #{job}."
- end
-
- show.go_to_validate_tab
- show.simulate_pipeline
- expect(show.tab_alert_title).to have_content('Simulation completed successfully')
-
- show.go_to_full_configuration_tab
- expect(show).to have_source_editor
- end
- end
- end
- end
-
- context 'when CI has invalid syntax' do
- it(
- 'shows invalid validations',
- testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/368333'
- ) do
- invalid_msg = 'syntax is invalid'
-
- Page::Project::PipelineEditor::Show.perform do |show|
- show.write_to_editor(invalid_content)
-
- aggregate_failures do
- show.go_to_visualize_tab
- expect(show.tab_alert_message).to have_content(invalid_msg)
-
- show.go_to_validate_tab
- show.simulate_pipeline
- expect(show.tab_alert_title).to have_content('Pipeline simulation completed with errors')
-
- expect(show.ci_syntax_validate_message).to have_content('CI configuration is invalid')
-
- show.go_to_full_configuration_tab
-
- # TODO: remove page reload when
- # https://gitlab.com/gitlab-org/gitlab/-/issues/378536 is resolved
- expect { show.has_source_editor? }
- .to eventually_be_truthy.within(max_attempts: 2, reload_page: show, sleep_interval: 1)
-
- expect(show.ci_syntax_validate_message).to have_content('CI configuration is invalid')
- end
- end
- end
- end
- end
- end
-end
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_with_image_pull_policy_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_with_image_pull_policy_spec.rb
index c693a57605e..1abe1df5964 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_with_image_pull_policy_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_with_image_pull_policy_spec.rb
@@ -112,7 +112,7 @@ module QA
QA::Service::Shellout.shell("docker cp #{runner_name}:/etc/gitlab-runner/config.toml #{tempdir.path}")
File.open(tempdir.path, 'a') do |f|
- f << %Q[ allowed_pull_policies = #{allowed_policies}\n]
+ f << %[ allowed_pull_policies = #{allowed_policies}\n]
end
QA::Service::Shellout.shell("docker cp #{tempdir.path} #{runner_name}:/etc/gitlab-runner/config.toml")
diff --git a/qa/qa/specs/features/browser_ui/5_package/infrastructure_registry/terraform_module_registry_spec.rb b/qa/qa/specs/features/browser_ui/5_package/infrastructure_registry/terraform_module_registry_spec.rb
index 312c5a13a61..8dc9fb6db36 100644
--- a/qa/qa/specs/features/browser_ui/5_package/infrastructure_registry/terraform_module_registry_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/infrastructure_registry/terraform_module_registry_spec.rb
@@ -1,8 +1,13 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Package', product_group: :package_registry do
- describe 'Terraform Module Registry' do
+ RSpec.describe 'Package', :requires_admin, product_group: :package_registry do
+ describe 'Terraform Module Registry',
+ quarantine: {
+ only: { job: 'airgapped' },
+ issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/417407',
+ type: :investigating
+ } do
include Runtime::Fixtures
let(:group) { Resource::Group.fabricate_via_api! }
@@ -25,6 +30,7 @@ module QA
end
before do
+ # Remove 'requires_admin' if below method is removed
QA::Support::Helpers::ImportSource.enable('git')
Flow::Login.sign_in
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/conan_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/conan_repository_spec.rb
index 4179b65d930..83662e04fab 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/conan_repository_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/conan_repository_spec.rb
@@ -1,9 +1,9 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Package', :object_storage, except: { job: 'relative-url' }, product_group: :package_registry, quarantine: {
- only: { job: 'object_storage' },
- issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/335981',
+ RSpec.describe 'Package', :object_storage, product_group: :package_registry, quarantine: {
+ only: { job: %w[object_storage relative_url airgapped], condition: -> { QA::Support::FIPS.enabled? } },
+ issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/417584',
type: :bug
} do
describe 'Conan Repository' do
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/helm_registry_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/helm_registry_spec.rb
index 19d0a4a816f..7bfda7f5956 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/helm_registry_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/helm_registry_spec.rb
@@ -1,8 +1,13 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Package', :object_storage, except: { job: 'relative-url' }, product_group: :package_registry do
- describe 'Helm Registry' do
+ RSpec.describe 'Package', :object_storage, product_group: :package_registry do
+ describe 'Helm Registry',
+ quarantine: {
+ only: { job: %w[relative_url airgapped] },
+ issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/417590',
+ type: :investigating
+ } do
using RSpec::Parameterized::TableSyntax
include Runtime::Fixtures
include Support::Helpers::MaskToken
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 3553e67eb2c..ce6c54b6ed8 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,8 +1,13 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Package', :object_storage, except: { job: 'relative-url' }, product_group: :package_registry do
- describe 'Maven group level endpoint' do
+ RSpec.describe 'Package', :object_storage, product_group: :package_registry do
+ describe 'Maven group level endpoint',
+ quarantine: {
+ only: { job: %w[relative_url airgapped] },
+ issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/417600',
+ type: :investigating
+ } do
include Runtime::Fixtures
include Support::Helpers::MaskToken
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 91d8f0dc181..35f80f8d447 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,12 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Package', :object_storage, except: { job: 'relative-url' } do
+ RSpec.describe 'Package', :object_storage,
+ quarantine: {
+ only: { job: %w[relative_url airgapped] },
+ issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/417600',
+ type: :investigating
+ } do
describe 'Maven project level endpoint', product_group: :package_registry do
include Runtime::Fixtures
include Support::Helpers::MaskToken
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/maven_gradle_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/maven_gradle_repository_spec.rb
index 032c77b2519..f24466ed003 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/maven_gradle_repository_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/maven_gradle_repository_spec.rb
@@ -1,11 +1,16 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Package', :object_storage, except: { job: 'relative-url' }, product_group: :package_registry do
+ RSpec.describe 'Package', :object_storage,
+ quarantine: {
+ only: { job: 'relative_url', condition: -> { QA::Support::FIPS.enabled? } },
+ issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/417600',
+ type: :investigating
+ }, product_group: :package_registry do
describe 'Maven Repository with Gradle' do
using RSpec::Parameterized::TableSyntax
include Runtime::Fixtures
- include_context 'packages registry qa scenario'
+ include Support::Helpers::MaskToken
let(:group_id) { 'com.gitlab.qa' }
let(:artifact_id) { "maven_gradle-#{SecureRandom.hex(8)}" }
@@ -13,6 +18,52 @@ module QA
let(:package_version) { '1.3.7' }
let(:package_type) { 'maven_gradle' }
+ let(:project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.name = "#{package_type}_project"
+ project.initialize_with_readme = true
+ project.visibility = :private
+ end
+ end
+
+ let(:runner) do
+ Resource::ProjectRunner.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(:gitlab_address_with_port) do
+ uri = URI.parse(Runtime::Scenario.gitlab_address)
+ "#{uri.scheme}://#{uri.host}:#{uri.port}"
+ end
+
+ let(:project_deploy_token) do
+ Resource::ProjectDeployToken.fabricate_via_api! do |deploy_token|
+ deploy_token.name = 'package-deploy-token'
+ deploy_token.project = project
+ deploy_token.scopes = %w[
+ read_repository
+ read_package_registry
+ write_package_registry
+ ]
+ end
+ end
+
+ let(:project_inbound_job_token_disabled) do
+ Resource::CICDSettings.fabricate_via_api! do |settings|
+ settings.project_path = project.full_path
+ settings.inbound_job_token_scope_enabled = false
+ end
+ end
+
+ before do
+ Flow::Login.sign_in_unless_signed_in
+ runner
+ end
+
where(:case_name, :authentication_token_type, :maven_header_name, :testcase) do
'using personal access token' | :personal_access_token | 'Private-Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347601'
'using ci job token' | :ci_job_token | 'Job-Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347603'
@@ -23,38 +74,47 @@ module QA
let(:token) do
case authentication_token_type
when :personal_access_token
- "\"#{personal_access_token}\""
+ use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: Runtime::Env.personal_access_token, project: project)
when :ci_job_token
- package_project_inbound_job_token_disabled
- client_project_inbound_job_token_disabled
- 'System.getenv("CI_JOB_TOKEN")'
+ project_inbound_job_token_disabled
+ '${CI_JOB_TOKEN}'
when :project_deploy_token
- "\"#{project_deploy_token.token}\""
+ use_ci_variable(name: 'PROJECT_DEPLOY_TOKEN', value: project_deploy_token.token, project: project)
end
end
it 'pushes and pulls a maven package via gradle', testcase: params[:testcase] do
Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do
Resource::Repository::Commit.fabricate_via_api! do |commit|
- gradle_upload_yaml = ERB.new(read_fixture('package_managers/maven/gradle', 'gradle_upload_package.yaml.erb')).result(binding)
- build_upload_gradle = ERB.new(read_fixture('package_managers/maven/gradle', 'build_upload.gradle.erb')).result(binding)
+ gradle_publish_install_yaml = ERB.new(read_fixture('package_managers/maven/gradle', 'gradle_upload_install_package.yaml.erb')).result(binding)
+ build_gradle = ERB.new(read_fixture('package_managers/maven/gradle', 'build.gradle.erb')).result(binding)
- commit.project = package_project
+ commit.project = project
commit.commit_message = 'Add .gitlab-ci.yml'
commit.add_files(
[
- { file_path: '.gitlab-ci.yml', content: gradle_upload_yaml },
- { file_path: 'build.gradle', content: build_upload_gradle }
+ { file_path: '.gitlab-ci.yml', content: gradle_publish_install_yaml },
+ { file_path: 'build.gradle', content: build_gradle }
])
end
end
- package_project.visit!
+ project.visit!
Flow::Pipeline.visit_latest_pipeline
Page::Project::Pipeline::Show.perform do |pipeline|
- pipeline.click_job('deploy')
+ pipeline.click_job('publish')
+ end
+
+ Page::Project::Job::Show.perform do |job|
+ expect(job).to be_successful(timeout: 800)
+
+ job.click_element(:pipeline_path)
+ end
+
+ Page::Project::Pipeline::Show.perform do |pipeline|
+ pipeline.click_job('install')
end
Page::Project::Job::Show.perform do |job|
@@ -72,33 +132,6 @@ module QA
Page::Project::Packages::Show.perform do |show|
expect(show).to have_package_info(package_name, package_version)
end
-
- Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do
- Resource::Repository::Commit.fabricate_via_api! do |commit|
- gradle_install_yaml = ERB.new(read_fixture('package_managers/maven/gradle', 'gradle_install_package.yaml.erb')).result(binding)
- build_install_gradle = ERB.new(read_fixture('package_managers/maven/gradle', 'build_install.gradle.erb')).result(binding)
-
- commit.project = client_project
- commit.commit_message = 'Add files'
- commit.add_files(
- [
- { file_path: '.gitlab-ci.yml', content: gradle_install_yaml },
- { file_path: 'build.gradle', content: build_install_gradle }
- ])
- end
- end
-
- client_project.visit!
-
- Flow::Pipeline.visit_latest_pipeline
-
- Page::Project::Pipeline::Show.perform do |pipeline|
- pipeline.click_job('build')
- end
-
- Page::Project::Job::Show.perform do |job|
- expect(job).to be_successful(timeout: 800)
- end
end
end
end
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb
index 63549113517..7e2885d3724 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb
@@ -1,8 +1,13 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Package', :object_storage, except: { job: 'relative-url' }, product_group: :package_registry do
- describe 'PyPI Repository' do
+ RSpec.describe 'Package', :object_storage, product_group: :package_registry do
+ describe 'PyPI Repository',
+ quarantine: {
+ only: { job: %w[relative_url airgapped] },
+ issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/417592',
+ type: :investigating
+ } do
include Runtime::Fixtures
include Support::Helpers::MaskToken
@@ -30,7 +35,11 @@ module QA
end
let(:uri) { URI.parse(Runtime::Scenario.gitlab_address) }
- let(:personal_access_token) { use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: Runtime::Env.personal_access_token, project: project) }
+
+ let!(:personal_access_token) do
+ use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: Runtime::Env.personal_access_token, project: project)
+ end
+
let(:gitlab_address_with_port) { "#{uri.scheme}://#{uri.host}:#{uri.port}" }
let(:gitlab_host_with_port) do
# Don't specify port if it is a standard one
diff --git a/qa/qa/specs/features/shared_contexts/import/github_import_shared_context.rb b/qa/qa/specs/features/shared_contexts/import/github_import_shared_context.rb
index 5ae90d20351..55ed9abb0da 100644
--- a/qa/qa/specs/features/shared_contexts/import/github_import_shared_context.rb
+++ b/qa/qa/specs/features/shared_contexts/import/github_import_shared_context.rb
@@ -48,7 +48,7 @@ module QA
)
end
- let(:mocks_path) { File.join(Runtime::Path.fixtures_path, "mocks", "import") }
+ let(:mocks_path) { Runtime::Path.fixture("mocks", "import") }
before do
set_mocks
diff --git a/qa/qa/specs/features/shared_contexts/import/gitlab_group_migration_common.rb b/qa/qa/specs/features/shared_contexts/import/gitlab_group_migration_common.rb
index bfd0825cf91..e702da4ad5b 100644
--- a/qa/qa/specs/features/shared_contexts/import/gitlab_group_migration_common.rb
+++ b/qa/qa/specs/features/shared_contexts/import/gitlab_group_migration_common.rb
@@ -32,7 +32,7 @@ module QA
Resource::Sandbox.fabricate_via_api! do |group|
group.api_client = source_admin_api_client
group.path = "source-group-for-import-#{SecureRandom.hex(4)}"
- group.avatar = File.new(File.join(Runtime::Path.fixtures_path, 'designs', 'tanuki.jpg'), "r")
+ group.avatar = File.new(Runtime::Path.fixture('designs', 'tanuki.jpg'), "r")
end
end
diff --git a/qa/qa/support/formatters/allure_metadata_formatter.rb b/qa/qa/support/formatters/allure_metadata_formatter.rb
index eac74a3b961..3f7ec9f62b9 100644
--- a/qa/qa/support/formatters/allure_metadata_formatter.rb
+++ b/qa/qa/support/formatters/allure_metadata_formatter.rb
@@ -98,7 +98,6 @@ module QA
return unless flaky_specs.key?(example.metadata[:testcase]) && example.execution_result.status != :pending
example.set_flaky
- example.parameter("pass_rate", "#{flaky_specs[example.metadata[:testcase]].round(0)}%")
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}")
diff --git a/qa/qa/support/formatters/test_metrics_formatter.rb b/qa/qa/support/formatters/test_metrics_formatter.rb
index 6e6cdc35af5..cdc0e83dc02 100644
--- a/qa/qa/support/formatters/test_metrics_formatter.rb
+++ b/qa/qa/support/formatters/test_metrics_formatter.rb
@@ -35,7 +35,7 @@ module QA
# @param [Array<RSpec::Core::Example>] examples
# @return [Array<Hash>]
def execution_data(examples = nil)
- @execution_metrics ||= examples.map { |example| test_stats(example) }.compact
+ @execution_metrics ||= examples.filter_map { |example| test_stats(example) }
end
alias_method :parse_execution_data, :execution_data
@@ -171,11 +171,7 @@ module QA
#
# @return [Time]
def time
- @time ||= begin
- return Time.now unless env('CI_PIPELINE_CREATED_AT')
-
- env('CI_PIPELINE_CREATED_AT').to_time
- end
+ @time ||= env('CI_PIPELINE_CREATED_AT')&.to_time || Time.now
end
# Is a merge request execution
diff --git a/qa/qa/support/helpers/mask_token.rb b/qa/qa/support/helpers/mask_token.rb
index 3aea77779ad..928d24ec404 100644
--- a/qa/qa/support/helpers/mask_token.rb
+++ b/qa/qa/support/helpers/mask_token.rb
@@ -9,6 +9,7 @@ module QA
ci_variable.project = project
ci_variable.key = name
ci_variable.value = value
+ ci_variable.masked = true
end
"${#{name}}"
end
@@ -18,6 +19,7 @@ module QA
ci_variable.group = group
ci_variable.key = name
ci_variable.value = value
+ ci_variable.masked = true
end
"${#{name}}"
end
diff --git a/qa/qa/support/influxdb_tools.rb b/qa/qa/support/influxdb_tools.rb
index efdbe1cd129..e8f73540733 100644
--- a/qa/qa/support/influxdb_tools.rb
+++ b/qa/qa/support/influxdb_tools.rb
@@ -48,20 +48,21 @@ module QA
#
# @return [String, nil]
def run_type
- @run_type ||= begin
- return env('QA_RUN_TYPE') if env('QA_RUN_TYPE')
- return unless LIVE_ENVS.include?(ci_project_name)
+ @run_type ||= if env('QA_RUN_TYPE')
+ env('QA_RUN_TYPE')
+ elsif LIVE_ENVS.exclude?(ci_project_name)
+ nil
+ else
+ test_subset = if env('NO_ADMIN') == 'true'
+ 'sanity-no-admin'
+ elsif env('SMOKE_ONLY') == 'true'
+ 'sanity'
+ else
+ 'full'
+ end
- test_subset = if env('NO_ADMIN') == 'true'
- 'sanity-no-admin'
- elsif env('SMOKE_ONLY') == 'true'
- 'sanity'
- else
- 'full'
- end
-
- "#{ci_project_name}-#{test_subset}"
- end
+ "#{ci_project_name}-#{test_subset}"
+ end
end
# Merge request iid
diff --git a/qa/qa/support/matchers/have_matcher.rb b/qa/qa/support/matchers/have_matcher.rb
index a9b365f7e81..c77b585ada8 100644
--- a/qa/qa/support/matchers/have_matcher.rb
+++ b/qa/qa/support/matchers/have_matcher.rb
@@ -8,6 +8,7 @@ module QA
auto_devops_container
element
file_content
+ file_name
assignee
child_pipeline
linked_pipeline
diff --git a/qa/qa/support/parallel_pipeline_jobs.rb b/qa/qa/support/parallel_pipeline_jobs.rb
index a551bf9978b..7984412685d 100644
--- a/qa/qa/support/parallel_pipeline_jobs.rb
+++ b/qa/qa/support/parallel_pipeline_jobs.rb
@@ -7,7 +7,7 @@ module QA
class ParallelPipelineJobs
include API
- PARALLEL_JOB_NAME_PATTERN = %r{^\S+ \d+/\d+$}.freeze
+ PARALLEL_JOB_NAME_PATTERN = %r{^\S+ \d+/\d+$}
def initialize(stage_name:, project_id:, pipeline_id:, access_token:)
@stage_name = stage_name
diff --git a/qa/qa/support/wait_for_requests.rb b/qa/qa/support/wait_for_requests.rb
index ef7875eb838..2856602629a 100644
--- a/qa/qa/support/wait_for_requests.rb
+++ b/qa/qa/support/wait_for_requests.rb
@@ -39,12 +39,6 @@ module QA
Capybara.page.has_no_css?('.gl-spinner', wait: wait)
end
end
-
- def wait_for_gitlab_to_respond
- Waiter.wait_until(sleep_interval: 5, message: '502 - GitLab is taking too much time to respond') do
- Capybara.page.has_no_text?('GitLab is taking too much time to respond')
- end
- end
end
end
end
diff --git a/qa/qa/tools/ci/qa_changes.rb b/qa/qa/tools/ci/qa_changes.rb
index 1ab93b6dfbf..1e3ef9e4816 100644
--- a/qa/qa/tools/ci/qa_changes.rb
+++ b/qa/qa/tools/ci/qa_changes.rb
@@ -9,8 +9,8 @@ module QA
class QaChanges
include Helpers
- QA_PATTERN = %r{^qa/}.freeze
- SPEC_PATTERN = %r{^qa/qa/specs/features/\S+_spec\.rb}.freeze
+ QA_PATTERN = %r{^qa/}
+ SPEC_PATTERN = %r{^qa/qa/specs/features/\S+_spec\.rb}
DEPENDENCY_PATTERN = Regexp.union(
/_VERSION/,
/Gemfile\.lock/,
diff --git a/qa/qa/tools/test_resources_handler.rb b/qa/qa/tools/test_resources_handler.rb
index fd76cc3d1a8..5a56f4a62c7 100644
--- a/qa/qa/tools/test_resources_handler.rb
+++ b/qa/qa/tools/test_resources_handler.rb
@@ -38,6 +38,7 @@ module QA
QA::EE::Resource::VulnerabilityItem
QA::EE::Resource::ScanResultPolicyProject
QA::EE::Resource::ScanResultPolicyCommit
+ QA::EE::Resource::InstanceAuditEventExternalDestination
].freeze
PROJECT = 'gitlab-qa-resources'
diff --git a/qa/qa/vendor/facebook/page/login.rb b/qa/qa/vendor/facebook/page/login.rb
new file mode 100644
index 00000000000..99e79d2e5a4
--- /dev/null
+++ b/qa/qa/vendor/facebook/page/login.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+module QA
+ module Vendor
+ module Facebook
+ module Page
+ class Login < Vendor::Page::Base
+ def login
+ fill_in 'email', with: QA::Runtime::Env.facebook_username
+ fill_in 'pass', with: QA::Runtime::Env.facebook_password
+ find('#loginbutton').click
+
+ confirm_oauth_access
+ end
+
+ def confirm_oauth_access
+ first('span', text: 'Continue as').click if has_css?('span', text: 'Continue as')
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/vendor/github/page/base.rb b/qa/qa/vendor/github/page/base.rb
deleted file mode 100644
index 3b96180afe9..00000000000
--- a/qa/qa/vendor/github/page/base.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-module QA
- module Vendor
- module Github
- module Page
- class Base
- include Capybara::DSL
- include Scenario::Actable
- end
- end
- end
- end
-end
diff --git a/qa/qa/vendor/github/page/login.rb b/qa/qa/vendor/github/page/login.rb
index 17a7471e251..ce71fc5f11e 100644
--- a/qa/qa/vendor/github/page/login.rb
+++ b/qa/qa/vendor/github/page/login.rb
@@ -1,13 +1,10 @@
# frozen_string_literal: true
-require 'capybara/dsl'
-require 'benchmark'
-
module QA
module Vendor
module Github
module Page
- class Login < Page::Base
+ class Login < Vendor::Page::Base
def login
fill_in 'login', with: QA::Runtime::Env.github_username
fill_in 'password', with: QA::Runtime::Env.github_password
@@ -24,11 +21,17 @@ module QA
end
authorize_app
+
+ confirm_account_recovery_settings
end
def authorize_app
click_on 'Authorize' if has_button?('Authorize')
end
+
+ def confirm_account_recovery_settings
+ click_on 'Confirm' if has_button?('Confirm')
+ end
end
end
end
diff --git a/qa/qa/vendor/page/base.rb b/qa/qa/vendor/page/base.rb
new file mode 100644
index 00000000000..1cfba6bfdda
--- /dev/null
+++ b/qa/qa/vendor/page/base.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+require 'capybara/dsl'
+
+module QA
+ module Vendor
+ module Page
+ class Base
+ include Capybara::DSL
+ include Scenario::Actable
+ end
+ end
+ end
+end
diff --git a/qa/qa/vendor/saml_idp/page/base.rb b/qa/qa/vendor/saml_idp/page/base.rb
deleted file mode 100644
index 39413a64d5a..00000000000
--- a/qa/qa/vendor/saml_idp/page/base.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-module QA
- module Vendor
- module SamlIdp
- module Page
- class Base
- include Capybara::DSL
- include Scenario::Actable
- end
- end
- end
- end
-end
diff --git a/qa/qa/vendor/saml_idp/page/login.rb b/qa/qa/vendor/saml_idp/page/login.rb
index dc6925109f7..9b4fbe15366 100644
--- a/qa/qa/vendor/saml_idp/page/login.rb
+++ b/qa/qa/vendor/saml_idp/page/login.rb
@@ -1,18 +1,22 @@
# frozen_string_literal: true
-require 'capybara/dsl'
-
module QA
module Vendor
module SamlIdp
module Page
- class Login < Page::Base
+ class Login < Vendor::Page::Base
def login(username, password)
QA::Runtime::Logger.debug("Logging into SAMLIdp with username: #{username} and password:#{password}")
fill_in 'username', with: username
fill_in 'password', with: password
click_on 'Login'
+
+ if Runtime::Env.super_sidebar_enabled?
+ QA::Page::Main::Menu.perform(&:enable_new_navigation)
+ else
+ QA::Page::Main::Menu.perform(&:disable_new_navigation)
+ end
end
def login_if_required(username, password)
diff --git a/qa/qa/vendor/smocker/smocker_api.rb b/qa/qa/vendor/smocker/smocker_api.rb
index 0434b5dcea4..4bad41f98bd 100644
--- a/qa/qa/vendor/smocker/smocker_api.rb
+++ b/qa/qa/vendor/smocker/smocker_api.rb
@@ -44,7 +44,7 @@ module QA
#
# @param wait [Integer] wait duration for smocker readiness
def wait_for_ready(wait: 10)
- Support::Waiter.wait_until(max_duration: wait, reload_page: false, raise_on_failure: true) do
+ Support::Waiter.wait_until(max_duration: wait, sleep_interval: 1, log: false) do
ready?
end
end
diff --git a/qa/spec/runtime/feature_spec.rb b/qa/spec/runtime/feature_spec.rb
index 72ba915d99b..351856de1bd 100644
--- a/qa/spec/runtime/feature_spec.rb
+++ b/qa/spec/runtime/feature_spec.rb
@@ -59,7 +59,7 @@ RSpec.describe QA::Runtime::Feature do
.and_return(request)
expect(described_class)
.to receive(:get)
- .and_return(Struct.new(:code, :body).new(200, %Q([{ "name": "a_flag", "state": "conditional", "gates": #{gates} }])))
+ .and_return(Struct.new(:code, :body).new(200, %([{ "name": "a_flag", "state": "conditional", "gates": #{gates} }])))
expect(described_class.enabled?(feature_flag, scope => actor)).to be true
end
diff --git a/qa/spec/service/docker_run/video_spec.rb b/qa/spec/service/docker_run/video_spec.rb
index 81be5ccffae..d8d7f680629 100644
--- a/qa/spec/service/docker_run/video_spec.rb
+++ b/qa/spec/service/docker_run/video_spec.rb
@@ -4,7 +4,7 @@ module QA
RSpec.describe Service::DockerRun::Video do
include QA::Support::Helpers::StubEnv
- let(:rspec_config) { instance_double('RSpec::Core::Configuration', append_after: nil, prepend_before: nil) }
+ let(:rspec_config) { instance_double('RSpec::Core::Configuration', prepend_before: nil, prepend_after: nil) }
let(:video_recorder_image) { 'presidenten/selenoid-manual-video-recorder' }
let(:video_recorder_version) { 'latest' }
let(:selenoid_browser_image) { 'selenoid/chrome' }
@@ -12,6 +12,7 @@ module QA
let(:remote_grid) { 'selenoid:4444' }
let(:record_video) { 'true' }
let(:use_selenoid) { 'true' }
+ let(:allure_report) { 'false' }
let(:docs_link) do
'https://gitlab.com/gitlab-org/gitlab-qa/-/blob/master/docs/running_against_remote_grid.md#testing-with-selenoid'
end
@@ -55,6 +56,7 @@ module QA
stub_env('QA_REMOTE_GRID', remote_grid)
stub_env('USE_SELENOID', use_selenoid)
stub_env('QA_RECORD_VIDEO', record_video)
+ stub_env('QA_GENERATE_ALLURE_REPORT', allure_report)
allow(RSpec).to receive(:configure).and_yield(rspec_config)
allow(described_class).to receive(:get_container_name)
@@ -173,7 +175,29 @@ module QA
.with(/Test failure video recording setup complete!/)
expect(RSpec).to have_received(:configure)
expect(rspec_config).to have_received(:prepend_before)
- expect(rspec_config).to have_received(:append_after)
+ expect(rspec_config).to have_received(:prepend_after)
+ end
+ end
+
+ context 'with generate_allure_report' do
+ let(:rspec_config) do
+ instance_double('RSpec::Core::Configuration',
+ prepend_before: nil,
+ prepend_after: nil,
+ append_after: nil)
+ end
+
+ let(:allure_report) { 'true' }
+
+ it 'performs configuration with allure report' do
+ aggregate_failures do
+ expect(QA::Runtime::Logger).to have_received(:info)
+ .with(/Test failure video recording setup complete!/)
+ expect(RSpec).to have_received(:configure).twice
+ expect(rspec_config).to have_received(:prepend_before)
+ expect(rspec_config).to have_received(:prepend_after)
+ expect(rspec_config).to have_received(:append_after)
+ end
end
end
end
diff --git a/qa/spec/support/formatters/allure_metadata_formatter_spec.rb b/qa/spec/support/formatters/allure_metadata_formatter_spec.rb
index ab3b753c3b0..b80c3f125e9 100644
--- a/qa/spec/support/formatters/allure_metadata_formatter_spec.rb
+++ b/qa/spec/support/formatters/allure_metadata_formatter_spec.rb
@@ -75,16 +75,6 @@ describe QA::Support::Formatters::AllureMetadataFormatter do
allow(InfluxDB2::Client).to receive(:new) { influx_client }
end
- context 'with non skipped spec' do
- it 'adds flaky test data' do
- formatter.start(nil)
- formatter.example_finished(rspec_example_notification)
-
- expect(rspec_example).to have_received(:set_flaky)
- expect(rspec_example).to have_received(:parameter).with('pass_rate', '50%')
- end
- end
-
context 'with skipped spec' do
let(:status) { :pending }
diff --git a/rubocop/cop/active_record_association_reload.rb b/rubocop/cop/active_record_association_reload.rb
index 9a1e9674904..758d5de348c 100644
--- a/rubocop/cop/active_record_association_reload.rb
+++ b/rubocop/cop/active_record_association_reload.rb
@@ -2,7 +2,7 @@
module RuboCop
module Cop
- # Cop that blacklists the use of `reload`.
+ # Cop that denylists the use of `reload`.
class ActiveRecordAssociationReload < RuboCop::Cop::Base
MSG = 'Use reset instead of reload. ' \
'For more details check the https://gitlab.com/gitlab-org/gitlab-foss/issues/60218.'
diff --git a/rubocop/cop/avoid_becomes.rb b/rubocop/cop/avoid_becomes.rb
index 20df394c32c..9ef623e6360 100644
--- a/rubocop/cop/avoid_becomes.rb
+++ b/rubocop/cop/avoid_becomes.rb
@@ -2,7 +2,7 @@
module RuboCop
module Cop
- # Cop that blacklists the use of ".becomes(SomeConstant)".
+ # Cop that denylists the use of ".becomes(SomeConstant)".
#
# The use of becomes() will result in a new object being created, throwing
# away any eager loaded assocations. This in turn can cause N+1 query
diff --git a/rubocop/cop/avoid_keyword_arguments_in_sidekiq_workers.rb b/rubocop/cop/avoid_keyword_arguments_in_sidekiq_workers.rb
index ea7cdd5bf9d..78e405cf0cc 100644
--- a/rubocop/cop/avoid_keyword_arguments_in_sidekiq_workers.rb
+++ b/rubocop/cop/avoid_keyword_arguments_in_sidekiq_workers.rb
@@ -2,7 +2,7 @@
module RuboCop
module Cop
- # Cop that blacklists keyword arguments usage in Sidekiq workers
+ # Cop that denylists keyword arguments usage in Sidekiq workers
class AvoidKeywordArgumentsInSidekiqWorkers < RuboCop::Cop::Base
MSG = "Do not use keyword arguments in Sidekiq workers. " \
"For details, check https://github.com/mperham/sidekiq/issues/2372"
diff --git a/rubocop/cop/avoid_return_from_blocks.rb b/rubocop/cop/avoid_return_from_blocks.rb
index c6a7a87c548..bc10410af1d 100644
--- a/rubocop/cop/avoid_return_from_blocks.rb
+++ b/rubocop/cop/avoid_return_from_blocks.rb
@@ -23,7 +23,7 @@ module RuboCop
class AvoidReturnFromBlocks < RuboCop::Cop::Base
MSG = 'Do not return from a block, use next or break instead.'
DEF_METHODS = %i[define_method lambda].freeze
- WHITELISTED_METHODS = %i[each each_filename times loop].freeze
+ ALLOWLISTED_METHODS = %i[each each_filename times loop].freeze
def on_block(node)
block_body = node.body
@@ -32,7 +32,7 @@ module RuboCop
return unless top_block?(node)
block_body.each_node(:return) do |return_node|
- next if parent_blocks(node, return_node).all? { |block_node| whitelisted?(block_node) }
+ next if parent_blocks(node, return_node).all? { |block_node| allowlisted?(block_node) }
add_offense(return_node)
end
@@ -69,8 +69,8 @@ module RuboCop
(node.type == :block && DEF_METHODS.include?(node.method_name))
end
- def whitelisted?(block_node)
- WHITELISTED_METHODS.include?(block_node.method_name)
+ def allowlisted?(block_node)
+ ALLOWLISTED_METHODS.include?(block_node.method_name)
end
end
end
diff --git a/rubocop/cop/background_migration/avoid_silent_rescue_exceptions.rb b/rubocop/cop/background_migration/avoid_silent_rescue_exceptions.rb
new file mode 100644
index 00000000000..0bd5c587205
--- /dev/null
+++ b/rubocop/cop/background_migration/avoid_silent_rescue_exceptions.rb
@@ -0,0 +1,84 @@
+# frozen_string_literal: true
+
+module RuboCop
+ module Cop
+ module BackgroundMigration
+ # Checks for rescuing errors inside Batched Background Migration Job Classes.
+ #
+ # @example
+ #
+ # # bad
+ # def perform
+ # do_something
+ # rescue StandardError => error
+ # logger.error(error.message)
+ # end
+ #
+ # # bad
+ # def perform
+ # do_something
+ # rescue JSON::ParserError, ActiveRecord::StatementTimeout => error
+ # logger.error(error.message)
+ # end
+ #
+ # # good
+ # def perform
+ # do_something
+ # rescue StandardError => error
+ # logger.error(error.message)
+ #
+ # raise
+ # end
+ #
+ # # good
+ # def perform
+ # do_something
+ # rescue JSON::ParserError, ActiveRecord::StatementTimeout => error
+ # logger.error(error.message)
+ #
+ # raise MyCustomException
+ # end
+ class AvoidSilentRescueExceptions < RuboCop::Cop::Base
+ MSG = 'Avoid rescuing exceptions inside job classes. See ' \
+ 'https://docs.gitlab.com/ee/development/database/batched_background_migrations.html#best-practices'
+
+ def_node_matcher :batched_migration_job_class?, <<~PATTERN
+ (class
+ const
+ (const {nil? cbase const} :BatchedMigrationJob)
+ ...
+ )
+ PATTERN
+
+ # Matches rescued exceptions that were not re-raised
+ #
+ # @example
+ # rescue => error
+ # rescue Exception => error
+ # rescue JSON::ParserError => e
+ # rescue ActiveRecord::StatementTimeout => error
+ # rescue ActiveRecord::StatementTimeout, ActiveRecord::QueryCanceled => error
+ def_node_matcher :rescue_timeout_error, <<~PATTERN
+ (resbody $_ _ (... !(send nil? :raise ...)))
+ PATTERN
+
+ def on_class(node)
+ @batched_migration_job_class ||= batched_migration_job_class?(node)
+ end
+
+ def on_resbody(node)
+ return unless batched_migration_job_class
+
+ rescue_timeout_error(node) do |error|
+ range = error ? node.loc.keyword.join(error.loc.expression) : node.loc.keyword
+ add_offense(range)
+ end
+ end
+
+ private
+
+ attr_reader :batched_migration_job_class
+ end
+ end
+ end
+end
diff --git a/rubocop/cop/background_migration/feature_category.rb b/rubocop/cop/background_migration/feature_category.rb
index c6611a65e49..f6b68e03736 100644
--- a/rubocop/cop/background_migration/feature_category.rb
+++ b/rubocop/cop/background_migration/feature_category.rb
@@ -10,7 +10,7 @@ module RuboCop
class FeatureCategory < RuboCop::Cop::Base
include MigrationHelpers
- FEATURE_CATEGORIES_FILE_PATH = "config/feature_categories.yml"
+ FEATURE_CATEGORIES_FILE_PATH = File.expand_path("../../../config/feature_categories.yml", __dir__)
MSG = "'feature_category' should be defined to better assign the ownership for batched migration jobs. " \
"For more details refer: " \
diff --git a/rubocop/cop/default_scope.rb b/rubocop/cop/default_scope.rb
index 930a69be881..1656c0b1569 100644
--- a/rubocop/cop/default_scope.rb
+++ b/rubocop/cop/default_scope.rb
@@ -2,7 +2,7 @@
module RuboCop
module Cop
- # Cop that blacklists the use of `default_scope`.
+ # Cop that denylists the use of `default_scope`.
class DefaultScope < RuboCop::Cop::Base
MSG = <<~EOF
Do not use `default_scope`, as it does not follow the principle of
diff --git a/rubocop/cop/destroy_all.rb b/rubocop/cop/destroy_all.rb
index 78e5d0f25f3..55c0bc93d43 100644
--- a/rubocop/cop/destroy_all.rb
+++ b/rubocop/cop/destroy_all.rb
@@ -2,7 +2,7 @@
module RuboCop
module Cop
- # Cop that blacklists the use of `destroy_all`.
+ # Cop that denylists the use of `destroy_all`.
class DestroyAll < RuboCop::Cop::Base
MSG = 'Use `delete_all` instead of `destroy_all`. ' \
'`destroy_all` will load the rows into memory, then execute a ' \
diff --git a/rubocop/cop/gitlab/doc_url.rb b/rubocop/cop/gitlab/doc_url.rb
index cbfbdf7eb57..41a1c2f8b36 100644
--- a/rubocop/cop/gitlab/doc_url.rb
+++ b/rubocop/cop/gitlab/doc_url.rb
@@ -21,7 +21,7 @@ module RuboCop
MSG = 'Use `#help_page_url` instead of directly including link. ' \
'See https://docs.gitlab.com/ee/development/documentation/#linking-to-help-in-ruby.'
- DOCS_URL_REGEXP = %r{https://docs.gitlab.com/ee/[\w#%./-]+}.freeze
+ DOCS_URL_REGEXP = %r{https://docs.gitlab.com/ee/[\w#%./-]+}
def on_str(node)
match = DOCS_URL_REGEXP.match(node.source)
diff --git a/rubocop/cop/gitlab/finder_with_find_by.rb b/rubocop/cop/gitlab/finder_with_find_by.rb
index ac454398f9c..e6d190e4476 100644
--- a/rubocop/cop/gitlab/finder_with_find_by.rb
+++ b/rubocop/cop/gitlab/finder_with_find_by.rb
@@ -6,7 +6,7 @@ module RuboCop
class FinderWithFindBy < RuboCop::Cop::Base
extend RuboCop::Cop::AutoCorrector
- FIND_PATTERN = /\Afind(_by!?)?\z/.freeze
+ FIND_PATTERN = /\Afind(_by!?)?\z/
ALLOWED_MODULES = ['FinderMethods'].freeze
def message(used_method)
diff --git a/rubocop/cop/gitlab/strong_memoize_attr.rb b/rubocop/cop/gitlab/strong_memoize_attr.rb
index 0b3de9d7863..0de581f8ccd 100644
--- a/rubocop/cop/gitlab/strong_memoize_attr.rb
+++ b/rubocop/cop/gitlab/strong_memoize_attr.rb
@@ -34,11 +34,13 @@ module RuboCop
class StrongMemoizeAttr < RuboCop::Cop::Base
extend RuboCop::Cop::AutoCorrector
- MSG = 'Use `strong_memoize_attr`, instead of using `strong_memoize` directly.'
+ STRONG_MEMOIZE_MSG = 'Use `strong_memoize_attr`, instead of using `strong_memoize` directly.'
+ STRONG_MEMOIZE_WITH_MSG =
+ 'Use `strong_memoize_attr`, instead of using `strong_memoize_with` without parameters.'
def_node_matcher :strong_memoize?, <<~PATTERN
(block
- $(send nil? :strong_memoize
+ $(send nil? {:strong_memoize | :strong_memoize_with}
(sym _)
)
(args)
@@ -58,7 +60,14 @@ module RuboCop
corrector = autocorrect_pure_definitions(node.parent, body) if node.parent.def_type?
- add_offense(send_node, &corrector)
+ message = case send_node.method_name
+ when :strong_memoize
+ STRONG_MEMOIZE_MSG
+ when :strong_memoize_with
+ STRONG_MEMOIZE_WITH_MSG
+ end
+
+ add_offense(send_node, message: message, &corrector)
end
private
diff --git a/rubocop/cop/graphql/gid_expected_type.rb b/rubocop/cop/graphql/gid_expected_type.rb
deleted file mode 100644
index 7e802e6d2db..00000000000
--- a/rubocop/cop/graphql/gid_expected_type.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-module RuboCop
- module Cop
- module Graphql
- class GIDExpectedType < RuboCop::Cop::Base
- MSG = 'Add an expected_type parameter to #object_from_id calls if possible.'
-
- def_node_search :id_from_object?, <<~PATTERN
- (send ... :object_from_id (...))
- PATTERN
-
- def on_send(node)
- return unless id_from_object?(node)
-
- add_offense(node)
- end
- end
- end
- end
-end
diff --git a/rubocop/cop/graphql/id_type.rb b/rubocop/cop/graphql/id_type.rb
index c9d9b4ea6eb..53d79751fa8 100644
--- a/rubocop/cop/graphql/id_type.rb
+++ b/rubocop/cop/graphql/id_type.rb
@@ -6,7 +6,7 @@ module RuboCop
class IDType < RuboCop::Cop::Base
MSG = 'Do not use GraphQL::Types::ID, use a specific GlobalIDType instead'
- WHITELISTED_ARGUMENTS = %i[iid full_path project_path group_path target_project_path namespace_path].freeze
+ ALLOWLISTED_ARGUMENTS = %i[iid full_path project_path group_path target_project_path namespace_path].freeze
def_node_search :graphql_id_type?, <<~PATTERN
(send nil? :argument (_ #does_not_match?) (const (const (const nil? :GraphQL) :Types) :ID) ...)
@@ -21,7 +21,7 @@ module RuboCop
private
def does_not_match?(arg)
- !WHITELISTED_ARGUMENTS.include?(arg) # rubocop:disable Rails/NegateInclude
+ !ALLOWLISTED_ARGUMENTS.include?(arg) # rubocop:disable Rails/NegateInclude
end
end
end
diff --git a/rubocop/cop/group_public_or_visible_to_user.rb b/rubocop/cop/group_public_or_visible_to_user.rb
index d3aa230680b..2038bd6f4f6 100644
--- a/rubocop/cop/group_public_or_visible_to_user.rb
+++ b/rubocop/cop/group_public_or_visible_to_user.rb
@@ -2,7 +2,7 @@
#
module RuboCop
module Cop
- # Cop that blacklists the usage of Group.public_or_visible_to_user
+ # Cop that denylists the usage of Group.public_or_visible_to_user
class GroupPublicOrVisibleToUser < RuboCop::Cop::Base
MSG = '`Group.public_or_visible_to_user` should be used with extreme care. ' \
'Please ensure that you are not using it on its own and that the amount ' \
diff --git a/rubocop/cop/ignored_columns.rb b/rubocop/cop/ignored_columns.rb
index 8b17447c46b..86ab8df6927 100644
--- a/rubocop/cop/ignored_columns.rb
+++ b/rubocop/cop/ignored_columns.rb
@@ -19,8 +19,8 @@ module RuboCop
# ignore_column :full_name, remove_after: '2023-05-22', remove_with: '16.0'
# end
class IgnoredColumns < RuboCop::Cop::Base
- USE_CONCERN_ADD_MSG = 'Use `IgnoredColumns` concern instead of adding to `self.ignored_columns`.'
- USE_CONCERN_SET_MSG = 'Use `IgnoredColumns` concern instead of setting `self.ignored_columns`.'
+ USE_CONCERN_ADD_MSG = 'Use `IgnorableColumns` concern instead of adding to `self.ignored_columns`.'
+ USE_CONCERN_SET_MSG = 'Use `IgnorableColumns` concern instead of setting `self.ignored_columns`.'
WRONG_MODEL_MSG = <<~MSG
If the model exists in CE and EE, the column has to be ignored
in the CE model. If the model only exists in EE, then it has to be added there.
diff --git a/rubocop/cop/inject_enterprise_edition_module.rb b/rubocop/cop/inject_enterprise_edition_module.rb
index 7e3c44cc5fd..24b679e092d 100644
--- a/rubocop/cop/inject_enterprise_edition_module.rb
+++ b/rubocop/cop/inject_enterprise_edition_module.rb
@@ -2,7 +2,7 @@
module RuboCop
module Cop
- # Cop that blacklists the injecting of extension specific modules before any lines which are not already injecting another module.
+ # Cop that denylists the injecting of extension specific modules before any lines which are not already injecting another module.
# It allows multiple module injections as long as they're all at the end.
class InjectEnterpriseEditionModule < RuboCop::Cop::Base
extend RuboCop::Cop::AutoCorrector
@@ -20,7 +20,7 @@ module RuboCop
DISALLOW_METHODS = Set.new(%i[include extend prepend]).freeze
- COMMENT_OR_EMPTY_LINE = /^\s*(#.*|$)/.freeze
+ COMMENT_OR_EMPTY_LINE = /^\s*(#.*|$)/
CHECK_LINE_METHODS_REGEXP = Regexp.union((CHECK_LINE_METHODS + DISALLOW_METHODS).map(&:to_s) + [COMMENT_OR_EMPTY_LINE]).freeze
@@ -80,7 +80,7 @@ module RuboCop
# Automatically correcting these offenses is not always possible, as
# sometimes code needs to be refactored to make this work. As such, we
- # only allow developers to easily blacklist existing offenses.
+ # only allow developers to easily denylist existing offenses.
def corrector(node)
lambda do |corrector|
corrector.insert_after(
diff --git a/rubocop/cop/migration/add_columns_to_wide_tables.rb b/rubocop/cop/migration/add_columns_to_wide_tables.rb
index 98dd605faef..ba53177b5d5 100644
--- a/rubocop/cop/migration/add_columns_to_wide_tables.rb
+++ b/rubocop/cop/migration/add_columns_to_wide_tables.rb
@@ -12,7 +12,7 @@ module RuboCop
MSG = '`%s` is a wide table with several columns, adding more should be avoided unless absolutely necessary.' \
' Consider storing the column in a different table or creating a new one.'
- BLACKLISTED_METHODS = %i[
+ DENYLISTED_METHODS = %i[
add_column
add_reference
add_timestamps_with_timezone
@@ -33,7 +33,7 @@ module RuboCop
def offense?(method_name, table_name)
wide_table?(table_name) &&
- BLACKLISTED_METHODS.include?(method_name)
+ DENYLISTED_METHODS.include?(method_name)
end
def wide_table?(table_name)
diff --git a/rubocop/cop/migration/avoid_finalize_background_migration.rb b/rubocop/cop/migration/avoid_finalize_background_migration.rb
new file mode 100644
index 00000000000..42e6e72a330
--- /dev/null
+++ b/rubocop/cop/migration/avoid_finalize_background_migration.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+require_relative '../../migration_helpers'
+
+module RuboCop
+ module Cop
+ module Migration
+ class AvoidFinalizeBackgroundMigration < RuboCop::Cop::Base
+ include MigrationHelpers
+
+ RESTRICT_ON_SEND = [:finalize_background_migration].freeze
+
+ MSG = 'Prefer `ensure_batched_background_migration_is_finished` over ' \
+ '`finalize_background_migration` in Batched Background Migrations. ' \
+ 'See https://docs.gitlab.com/ee/development/database/batched_background_migrations.html'
+
+ def on_send(node)
+ add_offense(node)
+ end
+ end
+ end
+ end
+end
diff --git a/rubocop/cop/project_path_helper.rb b/rubocop/cop/project_path_helper.rb
index 104a352949f..fdf452ccbae 100644
--- a/rubocop/cop/project_path_helper.rb
+++ b/rubocop/cop/project_path_helper.rb
@@ -9,10 +9,10 @@ module RuboCop
'`foo_project_bar_path(project, bar)` instead of ' \
'`foo_namespace_project_bar_path(project.namespace, project, bar)`.'
- METHOD_NAME_PATTERN = /\A([a-z_]+_)?namespace_project(?:_[a-z_]+)?_(?:url|path)\z/.freeze
+ METHOD_NAME_PATTERN = /\A([a-z_]+_)?namespace_project(?:_[a-z_]+)?_(?:url|path)\z/
def on_send(node)
- return unless method_name(node).to_s =~ METHOD_NAME_PATTERN
+ return unless METHOD_NAME_PATTERN.match?(method_name(node).to_s)
namespace_expr, project_expr = arguments(node)
return unless namespace_expr && project_expr
diff --git a/rubocop/cop/qa/selector_usage.rb b/rubocop/cop/qa/selector_usage.rb
index d615bd2926c..331c2c8a18b 100644
--- a/rubocop/cop/qa/selector_usage.rb
+++ b/rubocop/cop/qa/selector_usage.rb
@@ -20,14 +20,14 @@ module RuboCop
include QAHelpers
include CodeReuseHelpers
- SELECTORS = /\.qa-\w+|data-qa-\w+/.freeze
+ SELECTORS = /\.qa-\w+|data-qa-\w+/
MESSAGE = %(Do not use `%s` as this is reserved for the end-to-end specs. Use a different selector or a data-testid instead.)
def on_str(node)
return if in_qa_file?(node)
return unless in_spec?(node)
- add_offense(node, message: MESSAGE % node.value) if SELECTORS =~ node.value
+ add_offense(node, message: MESSAGE % node.value) if SELECTORS.match?(node.value)
rescue StandardError
# catch all errors and ignore them.
# without this catch-all rescue, rubocop will fail
diff --git a/rubocop/cop/rake/require.rb b/rubocop/cop/rake/require.rb
index e3e1696943d..eff0d45fe19 100644
--- a/rubocop/cop/rake/require.rb
+++ b/rubocop/cop/rake/require.rb
@@ -59,6 +59,8 @@ module RuboCop
PATTERN
def on_send(node)
+ return unless in_rake_file?(node)
+
method, file = require_method(node)
return unless method
@@ -70,6 +72,14 @@ module RuboCop
private
+ def in_rake_file?(node)
+ File.extname(filepath(node)) == '.rake'
+ end
+
+ def filepath(node)
+ node.location.expression.source_buffer.name
+ end
+
# Allow `require "foo/rake_task"`
def requires_task?(file)
file.source.include?('task')
diff --git a/rubocop/cop/rspec/before_all_role_assignment.rb b/rubocop/cop/rspec/before_all_role_assignment.rb
new file mode 100644
index 00000000000..fc7fdf4208a
--- /dev/null
+++ b/rubocop/cop/rspec/before_all_role_assignment.rb
@@ -0,0 +1,77 @@
+# frozen_string_literal: true
+
+require 'rubocop-rspec'
+
+module Rubocop
+ module Cop
+ module RSpec
+ # Checks for let_it_be with before instead of before_all when using `add_*` methods
+ #
+ # @example
+ #
+ # # bad
+ # let_it_be(:project) { create(:project) }
+ # let_it_be(:guest) { create(:user) }
+ #
+ # before do
+ # project.add_guest(guest)
+ # end
+ #
+ # # good
+ # let_it_be(:project) { create(:project) }
+ # let_it_be(:guest) { create(:user) }
+ #
+ # before_all do
+ # project.add_guest(guest)
+ # end
+ class BeforeAllRoleAssignment < RuboCop::Cop::RSpec::Base
+ MSG = "Use `before_all` when used with `%{let_it_be}`."
+
+ ROLE_METHODS = %i[add_guest add_reporter add_developer add_maintainer add_owner add_role].to_set.freeze
+
+ RESTRICT_ON_SEND = ROLE_METHODS
+
+ # @!method matching_let_it_be(node)
+ def_node_matcher :matching_let_it_be, <<~PATTERN
+ (block (send nil? $/^let_it_be/ (sym %name)) ...)
+ PATTERN
+
+ # @!method before_block?(node)
+ def_node_matcher :before_block?, <<~PATTERN
+ (block (send nil? :before ...) ...)
+ PATTERN
+
+ def_node_matcher :object_calling_add_role_method, <<~PATTERN
+ (send (send nil? $_) %ROLE_METHODS ...)
+ PATTERN
+
+ def on_send(node)
+ object_calling_add_role = object_calling_add_role_method(node)
+ return unless object_calling_add_role
+
+ before_block = before_block_ancestor(node)
+ return unless before_block
+
+ each_block_node_in_ancestor(node) do |child_node|
+ matching_let_it_be(child_node, name: object_calling_add_role) do |let_it_be|
+ message = format(MSG, let_it_be: let_it_be)
+ add_offense(node, message: message)
+ end
+ end
+ end
+
+ private
+
+ def before_block_ancestor(node)
+ node.each_ancestor(:block).find { |block_node| before_block?(block_node) }
+ end
+
+ def each_block_node_in_ancestor(node, &block)
+ node.each_ancestor do |parent_node|
+ parent_node.each_child_node(:block, &block)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/rubocop/cop/rspec/factory_bot/strategy_in_callback.rb b/rubocop/cop/rspec/factory_bot/strategy_in_callback.rb
index 3153d54887e..534a145b13a 100644
--- a/rubocop/cop/rspec/factory_bot/strategy_in_callback.rb
+++ b/rubocop/cop/rspec/factory_bot/strategy_in_callback.rb
@@ -7,7 +7,7 @@ module RuboCop
module RSpec
module FactoryBot
class StrategyInCallback < RuboCop::Cop::Base
- include RuboCop::RSpec::FactoryBot::Language
+ include RuboCop::FactoryBot::Language
MSG = 'Prefer inline `association` over `%{type}`. ' \
'See https://docs.gitlab.com/ee/development/testing_guide/best_practices.html#factories'
diff --git a/rubocop/cop/search/avoid_checking_finished_on_deprecated_migrations.rb b/rubocop/cop/search/avoid_checking_finished_on_deprecated_migrations.rb
new file mode 100644
index 00000000000..0a6813d4bba
--- /dev/null
+++ b/rubocop/cop/search/avoid_checking_finished_on_deprecated_migrations.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+module RuboCop
+ module Cop
+ module Search
+ # Cop that prevents checking migration_has_finished? on deprecated migrations
+ #
+ # @example
+ #
+ # # bad
+ # def disable_project_joins_for_blob?
+ # Elastic::DataMigrationService
+ # .migration_has_finished?(:backfill_project_permissions_in_blobs_using_permutations)
+ # end
+ #
+ # # good
+ # def disable_project_joins_for_blob?
+ # Elastic::DataMigrationService.migration_has_finished?(:backfill_project_permissions_in_blobs)
+ # end
+
+ class AvoidCheckingFinishedOnDeprecatedMigrations < RuboCop::Cop::Base
+ MSG = 'Migration is deprecated and can not be used with `migration_has_finished?`.'
+
+ def_node_matcher :deprecated_migration?, <<~PATTERN
+ (send
+ (const (const {nil? cbase} :Elastic) :DataMigrationService) :migration_has_finished?
+ (sym :backfill_project_permissions_in_blobs_using_permutations))
+ PATTERN
+
+ RESTRICT_ON_SEND = %i[migration_has_finished?].freeze
+
+ def on_send(node)
+ add_offense(node) if deprecated_migration?(node)
+ end
+ end
+ end
+ end
+end
diff --git a/rubocop/cop/usage_data/distinct_count_by_large_foreign_key.rb b/rubocop/cop/usage_data/distinct_count_by_large_foreign_key.rb
index a083318288b..19f6e393e1f 100644
--- a/rubocop/cop/usage_data/distinct_count_by_large_foreign_key.rb
+++ b/rubocop/cop/usage_data/distinct_count_by_large_foreign_key.rb
@@ -1,5 +1,7 @@
# frozen_string_literal: true
+require_relative '../../usage_data_helpers'
+
module RuboCop
module Cop
module UsageData
@@ -13,6 +15,8 @@ module RuboCop
# distinct_count(Ci::Build, :commit_id)
#
class DistinctCountByLargeForeignKey < RuboCop::Cop::Base
+ include UsageDataHelpers
+
MSG = 'Avoid doing `%s` on foreign keys for large tables having above 100 million rows.'
def_node_matcher :distinct_count?, <<-PATTERN
@@ -20,6 +24,8 @@ module RuboCop
PATTERN
def on_send(node)
+ return unless in_usage_data_file?(node)
+
distinct_count?(node) do |method_name, method_arguments|
next unless method_arguments && method_arguments.length >= 2
next if batch_set_to_false?(method_arguments[2])
diff --git a/rubocop/cop/usage_data/histogram_with_large_table.rb b/rubocop/cop/usage_data/histogram_with_large_table.rb
index 35ec568792c..0ff3b0b3c81 100644
--- a/rubocop/cop/usage_data/histogram_with_large_table.rb
+++ b/rubocop/cop/usage_data/histogram_with_large_table.rb
@@ -1,5 +1,7 @@
# frozen_string_literal: true
+require_relative '../../usage_data_helpers'
+
module RuboCop
module Cop
module UsageData
@@ -12,6 +14,8 @@ module RuboCop
# histogram(Issue, buckets: 1..100)
# histogram(User.active, buckets: 1..100)
class HistogramWithLargeTable < RuboCop::Cop::Base
+ include UsageDataHelpers
+
MSG = 'Avoid histogram method on %{model_name}'
# Match one level const as Issue, Gitlab
@@ -31,6 +35,8 @@ module RuboCop
PATTERN
def on_send(node)
+ return unless in_usage_data_file?(node)
+
one_level_matches = one_level_node(node)
two_level_matches = two_level_node(node)
diff --git a/rubocop/cop/usage_data/instrumentation_superclass.rb b/rubocop/cop/usage_data/instrumentation_superclass.rb
index 601f2340582..80eed19dafa 100644
--- a/rubocop/cop/usage_data/instrumentation_superclass.rb
+++ b/rubocop/cop/usage_data/instrumentation_superclass.rb
@@ -1,5 +1,7 @@
# frozen_string_literal: true
+require_relative '../../usage_data_helpers'
+
module RuboCop
module Cop
module UsageData
@@ -17,6 +19,8 @@ module RuboCop
# # ...
# end
class InstrumentationSuperclass < RuboCop::Cop::Base
+ include UsageDataHelpers
+
MSG = "Instrumentation classes should subclass one of the following: %{allowed_classes}."
BASE_PATTERN = "(const nil? !#allowed_class?)"
@@ -32,12 +36,16 @@ module RuboCop
PATTERN
def on_class(node)
+ return unless in_instrumentation_file?(node)
+
class_definition(node) do
register_offense(node.children[1])
end
end
def on_send(node)
+ return unless in_instrumentation_file?(node)
+
class_new_definition(node) do
register_offense(node.children.last)
end
diff --git a/rubocop/cop/usage_data/large_table.rb b/rubocop/cop/usage_data/large_table.rb
index 7d50eebaa83..414c89209ed 100644
--- a/rubocop/cop/usage_data/large_table.rb
+++ b/rubocop/cop/usage_data/large_table.rb
@@ -1,9 +1,13 @@
# frozen_string_literal: true
+require_relative '../../usage_data_helpers'
+
module RuboCop
module Cop
module UsageData
class LargeTable < RuboCop::Cop::Base
+ include UsageDataHelpers
+
# This cop checks that batch count and distinct_count are used in usage_data.rb files in metrics based on ActiveRecord models.
#
# @example
@@ -38,6 +42,8 @@ module RuboCop
PATTERN
def on_send(node)
+ return unless in_usage_data_file?(node)
+
one_level_matches = one_level_node(node)
two_level_matches = two_level_node(node)
diff --git a/rubocop/cop_todo.rb b/rubocop/cop_todo.rb
index 943f3375461..cd1c6669ae2 100644
--- a/rubocop/cop_todo.rb
+++ b/rubocop/cop_todo.rb
@@ -22,6 +22,10 @@ module RuboCop
@offense_count += offense_count
end
+ def add_files(files)
+ @files.merge(files)
+ end
+
def autocorrectable?
@cop_class&.support_autocorrect?
end
diff --git a/rubocop/formatter/todo_formatter.rb b/rubocop/formatter/todo_formatter.rb
index 5e49e2dc082..9e20a95ba85 100644
--- a/rubocop/formatter/todo_formatter.rb
+++ b/rubocop/formatter/todo_formatter.rb
@@ -18,6 +18,14 @@ module RuboCop
class TodoFormatter < BaseFormatter
DEFAULT_BASE_DIRECTORY = File.expand_path('../../.rubocop_todo', __dir__)
+ # Make sure that HAML exclusions are retained.
+ # This allows enabling cop rules in haml-lint and only exclude HAML files
+ # with offenses.
+ #
+ # See https://gitlab.com/gitlab-org/gitlab/-/issues/415330#caveats
+ # on why the entry must end with `.haml.rb`.
+ RETAIN_EXCLUSIONS = %r{\.haml\.rb$}
+
class << self
attr_accessor :base_directory
end
@@ -31,7 +39,7 @@ module RuboCop
@config_inspect_todo_dir = load_config_inspect_todo_dir
@config_old_todo_yml = load_config_old_todo_yml
check_multiple_configurations!
- create_empty_todos(@config_inspect_todo_dir)
+ create_todos_retaining_exclusions(@config_inspect_todo_dir)
super
end
@@ -81,11 +89,10 @@ module RuboCop
raise "Multiple configurations found for cops:\n#{list}\n"
end
- # For each inspected cop TODO config create a TODO object to make sure
- # the cop TODO config will be written even without any offenses.
- def create_empty_todos(inspected_cop_config)
- inspected_cop_config.each_key do |cop_name|
- @todos[cop_name]
+ def create_todos_retaining_exclusions(inspected_cop_config)
+ inspected_cop_config.each do |cop_name, config|
+ todo = @todos[cop_name]
+ todo.add_files(config.fetch('Exclude', []).grep(RETAIN_EXCLUSIONS))
end
end
diff --git a/rubocop/rubocop-code_reuse.yml b/rubocop/rubocop-code_reuse.yml
index c1babff4b12..f96de5caf99 100644
--- a/rubocop/rubocop-code_reuse.yml
+++ b/rubocop/rubocop-code_reuse.yml
@@ -42,3 +42,4 @@ CodeReuse/ActiveRecord:
- ee/lib/tasks/**/*.rake
- ee/lib/ee/gitlab/background_migration/**/*.rb
- ee/lib/gitlab/llm/open_ai/response_modifiers/tanuki_bot.rb
+ - ee/lib/gitlab/usage/metrics/instrumentations/**/*.rb
diff --git a/rubocop/rubocop-usage-data.yml b/rubocop/rubocop-usage-data.yml
index 129dbc75acf..5ec383010f5 100644
--- a/rubocop/rubocop-usage-data.yml
+++ b/rubocop/rubocop-usage-data.yml
@@ -1,8 +1,5 @@
UsageData/LargeTable:
Enabled: true
- Include:
- - 'lib/gitlab/usage_data.rb'
- - 'ee/lib/ee/gitlab/usage_data.rb'
NonRelatedClasses:
- :ActionMailer::Base
- :Date
@@ -41,9 +38,6 @@ UsageData/LargeTable:
- :maximum
UsageData/HistogramWithLargeTable:
Enabled: true
- Include:
- - 'lib/gitlab/usage_data.rb'
- - 'ee/lib/ee/gitlab/usage_data.rb'
HighTrafficModels: &high_traffic_models # models for all high traffic tables in Migration/UpdateLargeTable
- 'AuditEvent'
- 'CommitStatus'
@@ -98,9 +92,6 @@ UsageData/HistogramWithLargeTable:
- 'WebHookLog'
UsageData/DistinctCountByLargeForeignKey:
Enabled: true
- Include:
- - 'lib/gitlab/usage_data.rb'
- - 'ee/lib/ee/gitlab/usage_data.rb'
AllowedForeignKeys:
- 'agent_id'
- 'author_id'
@@ -116,8 +107,6 @@ UsageData/DistinctCountByLargeForeignKey:
- 'requirement_id'
UsageData/InstrumentationSuperclass:
Enabled: true
- Include:
- - 'lib/gitlab/usage/metrics/instrumentations/**/*.rb'
AllowedClasses:
- :DatabaseMetric
- :GenericMetric
@@ -125,3 +114,4 @@ UsageData/InstrumentationSuperclass:
- :RedisMetric
- :NumbersMetric
- :AggregatedMetric
+ - :PrometheusMetric
diff --git a/rubocop/usage_data_helpers.rb b/rubocop/usage_data_helpers.rb
new file mode 100644
index 00000000000..a6252594778
--- /dev/null
+++ b/rubocop/usage_data_helpers.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module RuboCop
+ module UsageDataHelpers
+ def in_usage_data_file?(node)
+ filepath(node).end_with?('gitlab/usage_data.rb')
+ end
+
+ def in_instrumentation_file?(node)
+ filepath(node).start_with?('lib/gitlab/usage/metrics/instrumentations') && File.extname(filepath(node)) == '.rb'
+ end
+
+ private
+
+ def filepath(node)
+ node.location.expression.source_buffer.name
+ end
+ end
+end
diff --git a/scripts/allowed_warnings.txt b/scripts/allowed_warnings.txt
index cc7d14c1d3c..cb684166348 100644
--- a/scripts/allowed_warnings.txt
+++ b/scripts/allowed_warnings.txt
@@ -27,3 +27,11 @@ ruby\/2\.7\.0\/net\/protocol\.rb:66: warning: previous definition of ProtocRetry
# fine in both Ruby 2 and Ruby 3, it's unlikely it'll change again.
# This can be removed when support for Ruby 2 is dropped.
warning: Pattern matching is experimental, and the behavior may change in future versions of Ruby!
+
+# As of Ruby 3.1, one-line typesafe/destructuring pattern matching via "rightward assignment" has
+# been included for multiple years with no significant negative feedback or indications of removal.
+# In the event that it is removed in a future Ruby release, the changes required to fix it are
+# isolated and minor, and will have no fundamental effect on the logic. See the section
+# "Rightward assignment pattern matching and destructuring with types" in
+# ee/lib/remote_development/README.md for more information and context.
+warning: One-line pattern matching is experimental, and the behavior may change in future versions of Ruby!
diff --git a/scripts/build_assets_image b/scripts/build_assets_image
index 00f21e5dede..b799947f73d 100755
--- a/scripts/build_assets_image
+++ b/scripts/build_assets_image
@@ -33,6 +33,11 @@ if ([ "${CI_PROJECT_NAME}" = "gitlab" ] && [ "${FOSS_ONLY}" != "1" ]) || ([ "${C
ASSETS_IMAGE_NAME="gitlab-assets-ee"
fi
+# Generate this image for https://jihulab.com/gitlab-cn/gitlab and https://gitlab.com/gitlab-jh/jh-team/gitlab
+if ([ "${CI_PROJECT_NAMESPACE}" = "gitlab-cn" ] || [ "${CI_PROJECT_NAMESPACE}" = "gitlab-jh" ]); then
+ ASSETS_IMAGE_NAME="gitlab-assets-jh"
+fi
+
ASSETS_IMAGE_PATH="${CI_REGISTRY}/${CI_PROJECT_PATH}/${ASSETS_IMAGE_NAME}"
# Used in MR pipelines
diff --git a/scripts/flaky_examples/prune-old-flaky-examples b/scripts/flaky_examples/prune-old-flaky-examples
index a5b50a7e8ea..fc31f0f6996 100755
--- a/scripts/flaky_examples/prune-old-flaky-examples
+++ b/scripts/flaky_examples/prune-old-flaky-examples
@@ -1,15 +1,17 @@
#!/usr/bin/env ruby
# frozen_string_literal: true
-# tooling/rspec_flaky/flaky_examples_collection.rb is requiring
-# `active_support/hash_with_indifferent_access`, and we install the `activesupport`
-# gem manually on the CI
-require 'rubygems'
-require_relative '../../tooling/rspec_flaky/report'
+require 'bundler/inline'
+
+gemfile do
+ source 'https://rubygems.org'
+
+ gem 'rspec_flaky', path: 'gems/rspec_flaky'
+end
report_file = ARGV.shift
unless report_file
- puts 'usage: prune-old-flaky-specs <report-file> <new-report-file>'
+ puts "usage: #{__FILE__} <report-file> <new-report-file>"
exit 1
end
@@ -20,5 +22,6 @@ puts "Current report has #{report.size} entries."
new_report = report.prune_outdated
-puts "New report has #{new_report.size} entries: #{report.size - new_report.size} entries older than #{RspecFlaky::Report::OUTDATED_DAYS_THRESHOLD} days were removed."
+puts "New report has #{new_report.size} entries: #{report.size - new_report.size} entries older than " \
+ "#{RspecFlaky::Report::OUTDATED_DAYS_THRESHOLD} days were removed."
puts "Saved #{new_report_file}." if new_report.write(new_report_file)
diff --git a/scripts/frontend/po_to_json.js b/scripts/frontend/po_to_json.js
index fba68a61814..015a74135a2 100755
--- a/scripts/frontend/po_to_json.js
+++ b/scripts/frontend/po_to_json.js
@@ -73,18 +73,6 @@ function convertPoToJed(data, locale) {
* due to potential unnecessary double escaping.
* But for now it is here to ensure that the old and new output
* are equivalent.
- * @param str
- * @returns {string}
- */
- function escapeMsgid(str) {
- return `${str}`.replace(/([\\"])/g, '\\$1');
- }
-
- /**
- * TODO: This replacer might be unnecessary _or_ even cause bugs.
- * due to potential unnecessary double escaping.
- * But for now it is here to ensure that the old and new output
- * are equivalent.
*
* NOTE: The replacements of `\n` and `\t` need to be iterated on,
* because: In the cases where we see those chars, they:
@@ -119,7 +107,7 @@ function convertPoToJed(data, locale) {
}
*/
- acc[escapeMsgid(msgid)] = msgstr.map(escapeMsgstr);
+ acc[msgid] = msgstr.map(escapeMsgstr);
return acc;
}, {});
diff --git a/scripts/gitaly-test-build b/scripts/gitaly-test-build
index 6901593009a..cfa089b327e 100755
--- a/scripts/gitaly-test-build
+++ b/scripts/gitaly-test-build
@@ -1,6 +1,7 @@
#!/usr/bin/env ruby
# frozen_string_literal: true
+require_relative '../config/bundler_setup'
require 'fileutils'
require_relative '../spec/support/helpers/gitaly_setup'
diff --git a/scripts/gitaly-test-spawn b/scripts/gitaly-test-spawn
index 475c7715bdd..9285b561ae0 100755
--- a/scripts/gitaly-test-spawn
+++ b/scripts/gitaly-test-spawn
@@ -3,6 +3,7 @@
# This script is used both in CI and in local development 'rspec' runs.
+require_relative '../config/bundler_setup'
require_relative '../spec/support/helpers/gitaly_setup'
class GitalyTestSpawn
diff --git a/scripts/gitlab_component_helpers.sh b/scripts/gitlab_component_helpers.sh
index d7e5519f057..98688d38643 100644
--- a/scripts/gitlab_component_helpers.sh
+++ b/scripts/gitlab_component_helpers.sh
@@ -50,6 +50,10 @@ if [[ "${FOSS_ONLY:-no}" = "1" ]] || [[ "${CI_PROJECT_NAME}" = "gitlab-foss" ]];
export GITLAB_EDITION="foss"
fi
+if [[ "${CI_SERVER_HOST}" = "jihulab.com" ]]; then
+ export GITLAB_EDITION="jh"
+fi
+
export GITLAB_ASSETS_HASH="${GITLAB_ASSETS_HASH:-"NO_HASH"}"
export GITLAB_ASSETS_PACKAGE="assets-${NODE_ENV}-${GITLAB_EDITION}-${GITLAB_ASSETS_HASH}-${GITLAB_ASSETS_PACKAGE_VERSION}.tar.gz"
export GITLAB_ASSETS_PACKAGE_URL="${API_PACKAGES_BASE_URL}/assets/${NODE_ENV}-${GITLAB_EDITION}-${GITLAB_ASSETS_HASH}/${GITLAB_ASSETS_PACKAGE}"
diff --git a/scripts/lint-docs-blueprints.rb b/scripts/lint-docs-blueprints.rb
index d0a0a6a05de..f3c60a45fda 100755
--- a/scripts/lint-docs-blueprints.rb
+++ b/scripts/lint-docs-blueprints.rb
@@ -4,7 +4,7 @@
# Taken from Jekyll
# https://github.com/jekyll/jekyll/blob/3.5-stable/lib/jekyll/document.rb#L13
-YAML_FRONT_MATTER_REGEXP = /\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)/m.freeze
+YAML_FRONT_MATTER_REGEXP = /\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)/m
READ_LIMIT_BYTES = 1024
require 'yaml'
diff --git a/scripts/lint-vendored-gems.sh b/scripts/lint-vendored-gems.sh
deleted file mode 100755
index ac8b837bbd1..00000000000
--- a/scripts/lint-vendored-gems.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-# Rubocop doesn't have a good way to run excluded files without a separate invocation:
-# https://github.com/rubocop/rubocop/issues/6323
-find vendor/gems -name \*.gemspec | xargs bundle exec rubocop --only Gemspec/AvoidExecutingGit
diff --git a/scripts/merge-simplecov b/scripts/merge-simplecov
index 24be731549b..7db12839382 100755
--- a/scripts/merge-simplecov
+++ b/scripts/merge-simplecov
@@ -1,6 +1,7 @@
#!/usr/bin/env ruby
# frozen_string_literal: true
+require_relative '../config/bundler_setup'
require_relative '../spec/simplecov_env'
SimpleCovEnv.configure_profile
SimpleCovEnv.configure_formatter
diff --git a/scripts/prepare_build.sh b/scripts/prepare_build.sh
index 536da48f07f..36fe4a010a0 100644
--- a/scripts/prepare_build.sh
+++ b/scripts/prepare_build.sh
@@ -10,43 +10,6 @@ fi
cp config/gitlab.yml.example config/gitlab.yml
sed -i 's/bin_path: \/usr\/bin\/git/bin_path: \/usr\/local\/bin\/git/' config/gitlab.yml
-if [ "$DECOMPOSED_DB" == "true" ]; then
- echo "Using decomposed database config (config/database.yml.decomposed-postgresql)"
- cp config/database.yml.decomposed-postgresql config/database.yml
-else
- echo "Using decomposed database config (config/database.yml.postgresql)"
- cp config/database.yml.postgresql config/database.yml
-
- if [ "$CI_CONNECTION_DB" != "true" ]; then
- echo "Disabling ci connection in config/database.yml"
- sed -i "/ci:$/, /geo:$/ {s|^|#|;s|# geo:| geo:|;}" config/database.yml
- fi
-fi
-
-# Set up Geo database if the job name matches `rspec-ee` or `geo`.
-# Since Geo is an EE feature, we shouldn't set it up for non-EE tests.
-if [[ "${CI_JOB_NAME}" =~ "rspec-ee" ]] || [[ "${CI_JOB_NAME}" =~ "geo" ]]; then
- echoinfo "Geo DB will be set up."
-else
- echoinfo "Geo DB won't be set up."
- sed -i '/geo:/,/^$/d' config/database.yml
-fi
-
-# Set up Embedding database if the job name matches `rspec-ee`
-# Since Embedding is an EE feature, we shouldn't set it up for non-EE tests.
-if [[ "${CI_JOB_NAME}" =~ "rspec-ee" ]]; then
- echoinfo "Embedding DB will be set up."
-else
- echoinfo "Embedding DB won't be set up."
- sed -i '/embedding:/,/^$/d' config/database.yml
-fi
-
-# Set user to a non-superuser to ensure we test permissions
-sed -i 's/username: root/username: gitlab/g' config/database.yml
-
-sed -i 's/localhost/postgres/g' config/database.yml
-sed -i 's/username: git/username: postgres/g' config/database.yml
-
cp config/cable.yml.example config/cable.yml
sed -i 's|url:.*$|url: redis://redis:6379|g' config/cable.yml
@@ -60,6 +23,8 @@ if [[ "$USE_REDIS_CLUSTER" != "false" ]] && [[ "$SETUP_DB" != "false" ]]; then
sed -i 's|- .*$|- redis://rediscluster:7001|g' config/redis.yml
fi
+setup_database_yml
+
if [ "$SETUP_DB" != "false" ]; then
setup_db
elif getent hosts postgres; then
diff --git a/scripts/qa/testcases-check b/scripts/qa/testcases-check
index 26098678f7c..2bc1ea2c5c7 100755
--- a/scripts/qa/testcases-check
+++ b/scripts/qa/testcases-check
@@ -3,7 +3,7 @@
require 'json'
-TESTCASE_FORMAT = %r{https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/\d+}.freeze
+TESTCASE_FORMAT = %r{https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/\d+}
testcases = []
missing_testcases = []
diff --git a/scripts/remote_development/run-smoke-test-suite.sh b/scripts/remote_development/run-smoke-test-suite.sh
index 5c1c5532a05..52e7546d47d 100755
--- a/scripts/remote_development/run-smoke-test-suite.sh
+++ b/scripts/remote_development/run-smoke-test-suite.sh
@@ -31,20 +31,27 @@ printf "${Color_Off}"
printf "${BBlue}Running Remote Development backend specs${Color_Off}\n\n"
-# NOTE: For some reason this test started causing the following spec file in the list to blow up with
-# "Failed to write to log, write log/workhorse-test.log: file already closed". Just removing
-# it for now.
-# ee/spec/graphql/api/workspace_spec.rb
-
bin/spring rspec -r spec_helper \
ee/spec/features/remote_development/workspaces_spec.rb \
ee/spec/finders/remote_development/workspaces_finder_spec.rb \
+ee/spec/graphql/api/workspace_spec.rb \
ee/spec/graphql/types/query_type_spec.rb \
ee/spec/graphql/types/remote_development/workspace_type_spec.rb \
ee/spec/graphql/types/subscription_type_spec.rb \
-ee/spec/lib/remote_development/workspaces/create/create_processor_spec.rb \
-ee/spec/lib/remote_development/workspaces/create/devfile_processor_spec.rb \
-ee/spec/lib/remote_development/workspaces/create/devfile_validator_spec.rb \
+ee/spec/lib/remote_development/agent_config/main_integration_spec.rb \
+ee/spec/lib/remote_development/unmatched_result_error_spec.rb \
+ee/spec/lib/remote_development/workspaces/create/authorizer_spec.rb \
+ee/spec/lib/remote_development/workspaces/create/creator_spec.rb \
+ee/spec/lib/remote_development/workspaces/create/devfile_fetcher_spec.rb \
+ee/spec/lib/remote_development/workspaces/create/devfile_flattener_spec.rb \
+ee/spec/lib/remote_development/workspaces/create/editor_component_injector_spec.rb \
+ee/spec/lib/remote_development/workspaces/create/main_integration_spec.rb \
+ee/spec/lib/remote_development/workspaces/create/main_spec.rb \
+ee/spec/lib/remote_development/workspaces/create/post_flatten_devfile_validator_spec.rb \
+ee/spec/lib/remote_development/workspaces/create/pre_flatten_devfile_validator_spec.rb \
+ee/spec/lib/remote_development/workspaces/create/project_cloner_component_injector_spec.rb \
+ee/spec/lib/remote_development/workspaces/create/volume_component_injector_spec.rb \
+ee/spec/lib/remote_development/workspaces/create/volume_definer_spec.rb \
ee/spec/lib/remote_development/workspaces/reconcile/actual_state_calculator_spec.rb \
ee/spec/lib/remote_development/workspaces/reconcile/agent_info_parser_spec.rb \
ee/spec/lib/remote_development/workspaces/reconcile/agent_info_spec.rb \
@@ -53,19 +60,24 @@ ee/spec/lib/remote_development/workspaces/reconcile/params_parser_spec.rb \
ee/spec/lib/remote_development/workspaces/reconcile/reconcile_processor_scenarios_spec.rb \
ee/spec/lib/remote_development/workspaces/reconcile/reconcile_processor_spec.rb \
ee/spec/lib/remote_development/workspaces/states_spec.rb \
-ee/spec/lib/remote_development/workspaces/update/update_processor_spec.rb \
+ee/spec/lib/remote_development/workspaces/update/authorizer_spec.rb \
+ee/spec/lib/remote_development/workspaces/update/main_integration_spec.rb \
+ee/spec/lib/remote_development/workspaces/update/main_spec.rb \
+ee/spec/lib/remote_development/workspaces/update/updater_spec.rb \
ee/spec/models/remote_development/remote_development_agent_config_spec.rb \
ee/spec/models/remote_development/workspace_spec.rb \
ee/spec/requests/api/graphql/mutations/remote_development/workspaces/create_spec.rb \
ee/spec/requests/api/graphql/mutations/remote_development/workspaces/update_spec.rb \
ee/spec/requests/api/graphql/remote_development/current_user_workspaces_spec.rb \
-ee/spec/requests/api/graphql/remote_development/workspaces_by_ids_spec.rb \
ee/spec/requests/api/graphql/remote_development/workspace_by_id_spec.rb \
+ee/spec/requests/api/graphql/remote_development/workspaces_by_ids_spec.rb \
ee/spec/requests/api/internal/kubernetes_spec.rb \
ee/spec/services/remote_development/agent_config/update_service_spec.rb \
ee/spec/services/remote_development/workspaces/create_service_spec.rb \
ee/spec/services/remote_development/workspaces/reconcile_service_spec.rb \
ee/spec/services/remote_development/workspaces/update_service_spec.rb \
spec/graphql/types/subscription_type_spec.rb \
+spec/lib/result_spec.rb \
+spec/support_specs/matchers/result_matchers_spec.rb
printf "\n✅✅✅ ${BGreen}All Remote Development specs passed successfully!${Color_Off} ✅✅✅\n"
diff --git a/scripts/review_apps/review-apps.sh b/scripts/review_apps/review-apps.sh
index 660257b042a..af6c2ec5383 100755
--- a/scripts/review_apps/review-apps.sh
+++ b/scripts/review_apps/review-apps.sh
@@ -229,11 +229,11 @@ function download_chart() {
else
echoinfo "Downloading the GitLab chart..." true
- curl --location -o gitlab.tar.bz2 "https://gitlab.com/gitlab-org/charts/gitlab/-/archive/${GITLAB_HELM_CHART_REF}/gitlab-${GITLAB_HELM_CHART_REF}.tar.bz2"
+ curl --location -o gitlab.tar.bz2 "${GITLAB_HELM_CHART_PROJECT_URL}/-/archive/${GITLAB_HELM_CHART_REF}/gitlab-${GITLAB_HELM_CHART_REF}.tar.bz2"
tar -xjf gitlab.tar.bz2
echoinfo "Adding the gitlab repo to Helm..."
- helm repo add gitlab https://charts.gitlab.io
+ helm repo add gitlab "${GITLAB_HELM_REPO_URL}"
echoinfo "Building the gitlab chart's dependencies..."
helm dependency build "gitlab-${GITLAB_HELM_CHART_REF}"
@@ -261,19 +261,20 @@ function deploy() {
local namespace="${CI_ENVIRONMENT_SLUG}"
local release="${CI_ENVIRONMENT_SLUG}"
local base_config_file_ref="${CI_DEFAULT_BRANCH}"
+
if [[ "$(base_config_changed)" == "true" ]]; then base_config_file_ref="${CI_COMMIT_SHA}"; fi
- local base_config_file="https://gitlab.com/gitlab-org/gitlab/raw/${base_config_file_ref}/scripts/review_apps/base-config.yaml"
+ local base_config_file="${GITLAB_REPO_URL}/raw/${base_config_file_ref}/scripts/review_apps/base-config.yaml"
echoinfo "Deploying ${release} to ${CI_ENVIRONMENT_URL} ..." true
- IMAGE_REPOSITORY="registry.gitlab.com/gitlab-org/build/cng-mirror"
- gitlab_toolbox_image_repository="${IMAGE_REPOSITORY}/gitlab-toolbox-ee"
- gitlab_sidekiq_image_repository="${IMAGE_REPOSITORY}/gitlab-sidekiq-ee"
- gitlab_webservice_image_repository="${IMAGE_REPOSITORY}/gitlab-webservice-ee"
+ IMAGE_REPOSITORY="${GITLAB_IMAGE_REPOSITORY}"
+ gitlab_toolbox_image_repository="${IMAGE_REPOSITORY}/gitlab-toolbox-${GITLAB_IMAGE_SUFFIX}"
+ gitlab_sidekiq_image_repository="${IMAGE_REPOSITORY}/gitlab-sidekiq-${GITLAB_IMAGE_SUFFIX}"
+ gitlab_webservice_image_repository="${IMAGE_REPOSITORY}/gitlab-webservice-${GITLAB_IMAGE_SUFFIX}"
gitlab_gitaly_image_repository="${IMAGE_REPOSITORY}/gitaly"
gitaly_image_tag=$(parse_gitaly_image_tag)
gitlab_shell_image_repository="${IMAGE_REPOSITORY}/gitlab-shell"
- gitlab_workhorse_image_repository="${IMAGE_REPOSITORY}/gitlab-workhorse-ee"
+ gitlab_workhorse_image_repository="${IMAGE_REPOSITORY}/gitlab-workhorse-${GITLAB_IMAGE_SUFFIX}"
sentry_enabled="false"
if [ -n "${REVIEW_APPS_SENTRY_DSN}" ]; then
@@ -394,7 +395,9 @@ function verify_deploy() {
mkdir -p curl-logs/
- for i in {1..60}; do # try for 5 minutes
+ # By default, try for 5 minutes, with 5 of sleep between attempts
+ local max_try_times=$((${GITLAB_VERIFY_DEPLOY_TIMEOUT_MINUTES:-5} * 60 / 5))
+ for i in {1..$max_try_times}; do
local now=$(date '+%H:%M:%S')
echo "[${now}] Verifying deployment at ${CI_ENVIRONMENT_URL}/users/sign_in"
log_name="curl-logs/${now}.log"
diff --git a/scripts/rspec_helpers.sh b/scripts/rspec_helpers.sh
index 8be98cb6346..fd478cbd3ae 100644
--- a/scripts/rspec_helpers.sh
+++ b/scripts/rspec_helpers.sh
@@ -20,19 +20,19 @@ function retrieve_tests_metadata() {
}
function update_tests_metadata() {
- local rspec_flaky_folder_path="$(dirname "${FLAKY_RSPEC_SUITE_REPORT_PATH}")/"
- local knapsack_folder_path="$(dirname "${KNAPSACK_RSPEC_SUITE_REPORT_PATH}")/"
+ local rspec_flaky_folder_path="$(dirname "${FLAKY_RSPEC_SUITE_REPORT_PATH:-unknown_folder}")/"
+ local knapsack_folder_path="$(dirname "${KNAPSACK_RSPEC_SUITE_REPORT_PATH:-unknown_folder}")/"
- echo "{}" > "${KNAPSACK_RSPEC_SUITE_REPORT_PATH}"
+ echo "{}" > "${KNAPSACK_RSPEC_SUITE_REPORT_PATH:-unknown_file}"
- scripts/merge-reports "${KNAPSACK_RSPEC_SUITE_REPORT_PATH}" ${knapsack_folder_path}rspec*.json
+ scripts/merge-reports "${KNAPSACK_RSPEC_SUITE_REPORT_PATH:-unknown_file}" ${knapsack_folder_path:-unknown_folder}rspec*.json
export FLAKY_RSPEC_GENERATE_REPORT="true"
- scripts/merge-reports "${FLAKY_RSPEC_SUITE_REPORT_PATH}" ${rspec_flaky_folder_path}all_*.json
+ scripts/merge-reports "${FLAKY_RSPEC_SUITE_REPORT_PATH:-unknown_file}" ${rspec_flaky_folder_path:-unknown_folder}all_*.json
# Prune flaky tests that weren't flaky in the last 7 days, *after* updating the flaky tests detected
# in this pipeline, so that first_flaky_at for tests that are still flaky is maintained.
- scripts/flaky_examples/prune-old-flaky-examples "${FLAKY_RSPEC_SUITE_REPORT_PATH}"
+ scripts/flaky_examples/prune-old-flaky-examples "${FLAKY_RSPEC_SUITE_REPORT_PATH:-unknown_file}"
if [[ "$CI_PIPELINE_SOURCE" == "schedule" ]]; then
if [[ -n "$RSPEC_PROFILING_PGSSLKEY" ]]; then
@@ -70,10 +70,10 @@ function update_tests_mapping() {
return 0
fi
- scripts/generate-test-mapping "${RSPEC_TESTS_MAPPING_PATH}" crystalball/rspec*.yml
- scripts/pack-test-mapping "${RSPEC_TESTS_MAPPING_PATH}" "${RSPEC_PACKED_TESTS_MAPPING_PATH}"
- gzip "${RSPEC_PACKED_TESTS_MAPPING_PATH}"
- rm -f crystalball/rspec*.yml "${RSPEC_PACKED_TESTS_MAPPING_PATH}"
+ scripts/generate-test-mapping "${RSPEC_TESTS_MAPPING_PATH:-unknown_file}" crystalball/rspec*.yml
+ scripts/pack-test-mapping "${RSPEC_TESTS_MAPPING_PATH:-unknown_file}" "${RSPEC_PACKED_TESTS_MAPPING_PATH:-unknown_file}"
+ gzip "${RSPEC_PACKED_TESTS_MAPPING_PATH:-unknown_file}"
+ rm -f crystalball/rspec*.yml "${RSPEC_PACKED_TESTS_MAPPING_PATH:-unknown_file}"
}
function crystalball_rspec_data_exists() {
@@ -123,7 +123,46 @@ function rspec_simple_job_with_retry () {
function rspec_db_library_code() {
local db_files="spec/lib/gitlab/database/"
- rspec_simple_job_with_retry "-- ${db_files}"
+ rspec_simple_job_with_retry "--tag ~click_house -- ${db_files}"
+}
+
+# Below is the list of options (https://linuxcommand.org/lc3_man_pages/seth.html)
+#
+# allexport same as -a
+# braceexpand same as -B
+# emacs use an emacs-style line editing interface
+# errexit same as -e
+# errtrace same as -E
+# functrace same as -T
+# hashall same as -h
+# histexpand same as -H
+# history enable command history
+# ignoreeof the shell will not exit upon reading EOF
+# interactive-comments
+# allow comments to appear in interactive commands
+# keyword same as -k
+# monitor same as -m
+# noclobber same as -C
+# noexec same as -n
+# noglob same as -f
+# nolog currently accepted but ignored
+# notify same as -b
+# nounset same as -u
+# onecmd same as -t
+# physical same as -P
+# pipefail the return value of a pipeline is the status of
+# the last command to exit with a non-zero status,
+# or zero if no command exited with a non-zero status
+# posix change the behavior of bash where the default
+# operation differs from the Posix standard to
+# match the standard
+# privileged same as -p
+# verbose same as -v
+# vi use a vi-style line editing interface
+# xtrace same as -x
+function debug_shell_options() {
+ echoinfo "Shell set options (set -o) enabled:"
+ echoinfo "$(set -o | grep 'on$')"
}
function debug_rspec_variables() {
@@ -151,21 +190,34 @@ function debug_rspec_variables() {
function handle_retry_rspec_in_new_process() {
local rspec_run_status="${1}"
+ if [[ $rspec_run_status -eq 3 ]]; then
+ echoerr "Not retrying failing examples since we failed early on purpose!"
+ exit 1
+ fi
+
if [[ $rspec_run_status -eq 2 ]]; then
echoerr "Not retrying failing examples since there were errors happening outside of the RSpec examples!"
- elif [[ $rspec_run_status -eq 1 ]]; then
- # Experiment to retry failed examples in a new RSpec process: https://gitlab.com/gitlab-org/quality/team-tasks/-/issues/1148
- if [[ "${RETRY_FAILED_TESTS_IN_NEW_PROCESS}" == "true" ]]; then
- retry_failed_rspec_examples
- rspec_run_status=$?
- else
- echoerr "Not retrying failing examples since \$RETRY_FAILED_TESTS_IN_NEW_PROCESS != 'true'!"
+ exit 1
+ fi
+
+ if [[ $rspec_run_status -eq 1 ]]; then
+ if is_rspec_last_run_results_file_missing; then
+ exit 1
fi
+
+ local failed_examples_count=$(grep -c " failed" "${RSPEC_LAST_RUN_RESULTS_FILE}")
+ if [[ "${failed_examples_count}" -eq "${RSPEC_FAIL_FAST_THRESHOLD}" ]]; then
+ echoerr "Not retrying failing examples since we reached the maximum number of allowed test failures!"
+ exit 1
+ fi
+
+ retry_failed_rspec_examples
+ rspec_run_status=$?
else
echosuccess "No examples to retry, congrats!"
fi
- exit $rspec_run_status
+ exit "${rspec_run_status}"
}
function rspec_paralellized_job() {
@@ -222,6 +274,7 @@ function rspec_paralellized_job() {
fi
debug_rspec_variables
+ debug_shell_options
if [[ -n "${rspec_tests_mapping_enabled}" ]]; then
tooling/bin/parallel_rspec --rspec_args "$(rspec_args "${rspec_opts}")" --filter "${RSPEC_TESTS_FILTER_FILE}" || rspec_run_status=$?
@@ -237,9 +290,12 @@ function rspec_paralellized_job() {
function retry_failed_rspec_examples() {
local rspec_run_status=0
- # Sometimes the file isn't created or is empty. In that case we exit(1) ourselves, otherwise, RSpec would
- # not run any examples an exit successfully, actually hiding failed tests!
- if [[ ! -f "${RSPEC_LAST_RUN_RESULTS_FILE}" ]] || [[ ! -s "${RSPEC_LAST_RUN_RESULTS_FILE}" ]]; then
+ if [[ "${RETRY_FAILED_TESTS_IN_NEW_PROCESS}" != "true" ]]; then
+ echoerr "Not retrying failing examples since \$RETRY_FAILED_TESTS_IN_NEW_PROCESS != 'true'!"
+ exit 1
+ fi
+
+ if is_rspec_last_run_results_file_missing; then
exit 1
fi
@@ -315,7 +371,7 @@ function rspec_rerun_previous_failed_tests() {
local test_file_count_threshold=${RSPEC_PREVIOUS_FAILED_TEST_FILE_COUNT_THRESHOLD:-10}
local matching_tests_file=${1}
local rspec_opts=${2}
- local test_files="$(cat "${matching_tests_file}")"
+ local test_files="$(select_existing_files < "${matching_tests_file}")"
local test_file_count=$(wc -w "${matching_tests_file}" | awk {'print $1'})
if [[ "${test_file_count}" -gt "${test_file_count_threshold}" ]]; then
@@ -395,14 +451,14 @@ function cleanup_individual_job_reports() {
local rspec_flaky_folder_path="$(dirname "${FLAKY_RSPEC_SUITE_REPORT_PATH}")/"
local knapsack_folder_path="$(dirname "${KNAPSACK_RSPEC_SUITE_REPORT_PATH}")/"
- rm -rf ${knapsack_folder_path}rspec*.json \
- ${rspec_flaky_folder_path}all_*.json \
- ${rspec_flaky_folder_path}new_*.json \
- ${rspec_flaky_folder_path}skipped_flaky_tests_*_report.txt \
- ${rspec_flaky_folder_path}retried_tests_*_report.txt \
- ${RSPEC_LAST_RUN_RESULTS_FILE} \
- ${RSPEC_PROFILING_FOLDER_PATH}/**/*
- rmdir ${RSPEC_PROFILING_FOLDER_PATH} || true
+ rm -rf ${knapsack_folder_path:-unknown_folder}rspec*.json \
+ ${rspec_flaky_folder_path:-unknown_folder}all_*.json \
+ ${rspec_flaky_folder_path:-unknown_folder}new_*.json \
+ ${rspec_flaky_folder_path:-unknown_folder}skipped_flaky_tests_*_report.txt \
+ ${rspec_flaky_folder_path:-unknown_folder}retried_tests_*_report.txt \
+ ${RSPEC_LAST_RUN_RESULTS_FILE:-unknown_folder} \
+ ${RSPEC_PROFILING_FOLDER_PATH:-unknown_folder}/**/*
+ rmdir ${RSPEC_PROFILING_FOLDER_PAT:-unknown_folder} || true
}
function generate_flaky_tests_reports() {
@@ -417,3 +473,13 @@ function generate_flaky_tests_reports() {
cleanup_individual_job_reports
}
+
+function is_rspec_last_run_results_file_missing() {
+ # Sometimes the file isn't created or is empty.
+ if [[ ! -f "${RSPEC_LAST_RUN_RESULTS_FILE}" ]] || [[ ! -s "${RSPEC_LAST_RUN_RESULTS_FILE}" ]]; then
+ echoerr "The file set inside RSPEC_LAST_RUN_RESULTS_FILE ENV variable does not exist or is empty. As a result, we won't retry failed specs."
+ return 0
+ else
+ return 1
+ fi
+}
diff --git a/scripts/setup-test-env b/scripts/setup-test-env
index ae00b569ce3..1c39483bb7a 100755
--- a/scripts/setup-test-env
+++ b/scripts/setup-test-env
@@ -25,8 +25,8 @@ require_relative '../lib/system_check/helpers'
require 'omniauth'
require 'omniauth-github'
require 'etc'
+require 'gitlab/utils/all'
require_relative '../lib/gitlab/access'
-require_relative '../lib/gitlab/utils'
unless defined?(License)
# This is needed to allow use of `Gitlab::ImportSources.values` in `1_settings.rb`.
diff --git a/scripts/static-analysis b/scripts/static-analysis
index 0d03dd42c73..41583166e04 100755
--- a/scripts/static-analysis
+++ b/scripts/static-analysis
@@ -51,8 +51,7 @@ class StaticAnalysis
Task.new(%w[yarn run block-dependencies], 1),
Task.new(%w[yarn run check-dependencies], 1),
Task.new(%w[scripts/lint-rugged], 1),
- Task.new(%w[scripts/gemfile_lock_changed.sh], 1),
- Task.new(%w[scripts/lint-vendored-gems.sh], 1)
+ Task.new(%w[scripts/gemfile_lock_changed.sh], 1)
].compact.freeze
def run_tasks!(options = {})
diff --git a/scripts/utils.sh b/scripts/utils.sh
index edfcf0f2dac..800b81f1dea 100644
--- a/scripts/utils.sh
+++ b/scripts/utils.sh
@@ -127,6 +127,50 @@ function assets_compile_script() {
section_end "assets-compile"
}
+function setup_database_yml() {
+ if [ "$DECOMPOSED_DB" == "true" ]; then
+ if [ "$CLUSTERWIDE_DB" == "true" ]; then
+ echo "Using decomposed database config, containing clusterwide connection (config/database.yml.decomposed-clusterwide-postgresql)"
+ cp config/database.yml.decomposed-clusterwide-postgresql config/database.yml
+ else
+ echo "Using decomposed database config (config/database.yml.decomposed-postgresql)"
+ cp config/database.yml.decomposed-postgresql config/database.yml
+ fi
+ else
+ echo "Using two connections, single database config (config/database.yml.postgresql)"
+ cp config/database.yml.postgresql config/database.yml
+
+ if [ "$CI_CONNECTION_DB" != "true" ]; then
+ echo "Disabling ci connection in config/database.yml"
+ sed -i "/ci:$/, /geo:$/ {s|^|#|;s|# geo:| geo:|;}" config/database.yml
+ fi
+ fi
+
+ # Set up Geo database if the job name matches `rspec-ee` or `geo`.
+ # Since Geo is an EE feature, we shouldn't set it up for non-EE tests.
+ if [[ "${CI_JOB_NAME}" =~ "rspec-ee" ]] || [[ "${CI_JOB_NAME}" =~ "geo" ]]; then
+ echoinfo "Geo DB will be set up."
+ else
+ echoinfo "Geo DB won't be set up."
+ sed -i '/geo:/,/^$/d' config/database.yml
+ fi
+
+ # Set up Embedding database if the job name matches `rspec-ee`
+ # Since Embedding is an EE feature, we shouldn't set it up for non-EE tests.
+ if [[ "${CI_JOB_NAME}" =~ "rspec-ee" ]]; then
+ echoinfo "Embedding DB will be set up."
+ else
+ echoinfo "Embedding DB won't be set up."
+ sed -i '/embedding:/,/^$/d' config/database.yml
+ fi
+
+ # Set user to a non-superuser to ensure we test permissions
+ sed -i 's/username: root/username: gitlab/g' config/database.yml
+
+ sed -i 's/localhost/postgres/g' config/database.yml
+ sed -i 's/username: git/username: postgres/g' config/database.yml
+}
+
function setup_db_user_only() {
source scripts/create_postgres_user.sh
}
@@ -162,6 +206,10 @@ function install_junit_merge_gem() {
run_timed_command "gem install junit_merge --no-document --version 0.1.2"
}
+function select_existing_files() {
+ ruby -e 'print $stdin.read.split(" ").select { |f| File.exist?(f) }.join(" ")'
+}
+
function fail_on_warnings() {
local cmd="$*"
local warning_file
diff --git a/scripts/validate_migration_timestamps b/scripts/validate_migration_timestamps
index d3722e7a4af..affcd2ad0a2 100755
--- a/scripts/validate_migration_timestamps
+++ b/scripts/validate_migration_timestamps
@@ -6,7 +6,7 @@ require 'time'
MIGRATION_DIRS = %w[db/migrate db/post_migrate].freeze
VERSION_DIGITS = 14
-MIGRATION_TIMESTAMP_REGEX = /\A(?<version>\d{#{VERSION_DIGITS}})_/.freeze
+MIGRATION_TIMESTAMP_REGEX = /\A(?<version>\d{#{VERSION_DIGITS}})_/
maximum_timestamp = Time.now.utc.strftime('%Y%m%d%H%M%S').to_i
diff --git a/shared/ci_secure_files/.gitkeep b/shared/ci_secure_files/.gitkeep
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/shared/ci_secure_files/.gitkeep
diff --git a/sidekiq_cluster/cli.rb b/sidekiq_cluster/cli.rb
index 22cddead3e4..fc065d799d4 100644
--- a/sidekiq_cluster/cli.rb
+++ b/sidekiq_cluster/cli.rb
@@ -5,11 +5,11 @@ require_relative '../config/bundler_setup'
require 'optparse'
require 'logger'
require 'time'
+require 'gitlab/utils/all'
# In environments where code is preloaded and cached such as `spring`,
# we may run into "already initialized" warnings, hence the check.
-require_relative '../lib/gitlab' unless Object.const_defined?(:Gitlab)
-require_relative '../lib/gitlab/utils'
+require_relative '../lib/gitlab'
require_relative '../lib/gitlab/sidekiq_config/cli_methods'
require_relative '../lib/gitlab/sidekiq_config/worker_matcher'
require_relative '../lib/gitlab/sidekiq_logging/json_formatter'
diff --git a/spec/commands/metrics_server/metrics_server_spec.rb b/spec/commands/metrics_server/metrics_server_spec.rb
index 88a28b02903..ee07602016f 100644
--- a/spec/commands/metrics_server/metrics_server_spec.rb
+++ b/spec/commands/metrics_server/metrics_server_spec.rb
@@ -30,18 +30,6 @@ RSpec.describe 'GitLab metrics server', :aggregate_failures do
}
end
- 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!
@@ -59,24 +47,18 @@ RSpec.describe 'GitLab metrics server', :aggregate_failures do
end
end
- shared_examples 'spawns a server' do |target, use_golang_server|
- context "targeting #{target} when using Golang server is #{use_golang_server}" do
+ shared_examples 'spawns a server' do |target|
+ context "targeting #{target}" do
let(:metrics_dir) { Dir.mktmpdir }
subject(:start_server!) do
- @pid = MetricsServer.spawn(target, metrics_dir: metrics_dir, path: @exporter_path.join('bin'))
+ @pid = MetricsServer.spawn(target, metrics_dir: metrics_dir)
end
before do
- if use_golang_server
- stub_env('GITLAB_GOLANG_METRICS_SERVER', '1')
- allow(Settings).to receive(:monitoring).and_return(
- GitlabSettings::Options.build(config.dig('test', 'monitoring')))
- else
- config_file.write(YAML.dump(config))
- config_file.close
- stub_env('GITLAB_CONFIG', config_file.path)
- end
+ config_file.write(YAML.dump(config))
+ config_file.close
+ stub_env('GITLAB_CONFIG', config_file.path)
# We need to send a request to localhost
WebMock.allow_net_connect!
end
@@ -111,8 +93,6 @@ RSpec.describe 'GitLab metrics server', :aggregate_failures do
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
+ it_behaves_like 'spawns a server', 'puma'
+ it_behaves_like 'spawns a server', 'sidekiq'
end
diff --git a/spec/commands/sidekiq_cluster/cli_spec.rb b/spec/commands/sidekiq_cluster/cli_spec.rb
index 085be1ceac2..a63e7158c2a 100644
--- a/spec/commands/sidekiq_cluster/cli_spec.rb
+++ b/spec/commands/sidekiq_cluster/cli_spec.rb
@@ -247,13 +247,13 @@ RSpec.describe Gitlab::SidekiqCluster::CLI, feature_category: :gitlab_cli, stub_
expected_workers =
if Gitlab.ee?
[
- %w[cronjob:clusters_integrations_check_prometheus_health incident_management_close_incident status_page_publish] + described_class::DEFAULT_QUEUES,
+ %w[incident_management_close_incident status_page_publish] + described_class::DEFAULT_QUEUES,
%w[bulk_imports_pipeline bulk_imports_relation_export project_export projects_import_export_parallel_project_export projects_import_export_relation_export repository_import project_template_export] +
described_class::DEFAULT_QUEUES
]
else
[
- %w[cronjob:clusters_integrations_check_prometheus_health incident_management_close_incident] + described_class::DEFAULT_QUEUES,
+ %w[incident_management_close_incident] + described_class::DEFAULT_QUEUES,
%w[bulk_imports_pipeline bulk_imports_relation_export project_export projects_import_export_parallel_project_export projects_import_export_relation_export repository_import] +
described_class::DEFAULT_QUEUES
]
diff --git a/spec/components/pajamas/empty_state_component_spec.rb b/spec/components/pajamas/empty_state_component_spec.rb
new file mode 100644
index 00000000000..5aa3f2143c3
--- /dev/null
+++ b/spec/components/pajamas/empty_state_component_spec.rb
@@ -0,0 +1,101 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+
+RSpec.describe Pajamas::EmptyStateComponent, type: :component, feature_category: :design_system do
+ let(:title) { 'Empty state title' }
+ let(:primary_button_link) { '#learn-more-primary' }
+ let(:primary_button_text) { 'Learn more' }
+ let(:secondary_button_link) { '#learn-more-secondary' }
+ let(:secondary_button_text) { 'Another action' }
+ let(:description) { 'Empty state description' }
+ let(:svg_path) { 'illustrations/empty-state/empty-projects-deleted-md.svg' }
+ let(:compact) { false }
+ let(:empty_state_options) { { id: 'empty-state-rails-component' } }
+
+ before do
+ render_inline described_class.new(
+ title: title,
+ svg_path: svg_path,
+ empty_state_options: empty_state_options,
+ primary_button_link: primary_button_link,
+ primary_button_text: primary_button_text,
+ secondary_button_link: secondary_button_link,
+ secondary_button_text: secondary_button_text,
+ compact: compact) do |c|
+ c.with_description { description } if description
+ end
+ end
+
+ describe 'default' do
+ it 'renders the primary action' do
+ expect(page).to have_link(primary_button_text, href: primary_button_link)
+ end
+
+ it 'renders the secondary action' do
+ expect(page).to have_link(secondary_button_text, href: secondary_button_link)
+ end
+
+ it 'renders image as illustration' do
+ img = page.find('img')
+
+ expect(img['src']).to eq(ActionController::Base.helpers.image_path(svg_path))
+ end
+
+ it 'renders title' do
+ h1 = page.find('h1')
+
+ expect(h1).to have_text(title)
+ end
+
+ it 'renders description' do
+ expect(find_description).to have_text(description)
+ end
+
+ it 'renders section with flex direction column' do
+ expect(find_section[:id]).to eq(empty_state_options[:id])
+ expect(find_section[:class]).to eq("gl-display-flex empty-state gl-text-center gl-flex-direction-column")
+ end
+ end
+
+ describe 'when compact' do
+ let(:compact) { true }
+
+ it 'renders section with flex direction row' do
+ expect(find_section[:class]).to eq("gl-display-flex empty-state gl-flex-direction-row gl-align-items-center")
+ end
+ end
+
+ describe 'when svg_path is empty' do
+ let(:svg_path) { '' }
+
+ it 'does not render image' do
+ expect(page).not_to have_selector('img')
+ end
+ end
+
+ describe 'when description is empty' do
+ let(:description) { nil }
+
+ it 'does not render a description' do
+ expect(find_description).to be_nil
+ end
+ end
+
+ describe 'with no buttons' do
+ let(:primary_button_text) { nil }
+ let(:secondary_button_text) { nil }
+
+ it 'does not render any buttons' do
+ expect(page).not_to have_selector('a')
+ end
+ end
+
+ def find_section
+ page.find('section')
+ end
+
+ def find_description
+ page.first('[data-testid="empty-state-description"]', minimum: 0)
+ end
+end
diff --git a/spec/components/previews/pajamas/empty_state_component_preview.rb b/spec/components/previews/pajamas/empty_state_component_preview.rb
new file mode 100644
index 00000000000..bad00571026
--- /dev/null
+++ b/spec/components/previews/pajamas/empty_state_component_preview.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+module Pajamas
+ class EmptyStateComponentPreview < ViewComponent::Preview
+ # @param title text
+ # @param description textarea
+ # @param compact toggle
+ # @param svg_path text
+ # @param primary_button_text text
+ # @param primary_button_link text
+ # @param secondary_button_text text
+ # @param secondary_button_link text
+ def default(
+ title: "This state is empty",
+ description: "The title and message should be clear, concise, and explain why the user is seeing this screen.
+ The actions should help the user on what to do to get the real feature.",
+ compact: false,
+ svg_path: "illustrations/empty-state/empty-projects-deleted-md.svg",
+ primary_button_text: "Do primary action",
+ primary_button_link: "#learn-more-primary",
+ secondary_button_text: "Do secondary action",
+ secondary_button_link: "#learn-more-secondary")
+ render(Pajamas::EmptyStateComponent.new(
+ title: title,
+ svg_path: svg_path,
+ primary_button_text: primary_button_text,
+ primary_button_link: primary_button_link,
+ secondary_button_text: secondary_button_text,
+ secondary_button_link: secondary_button_link,
+ compact: compact
+ )) do |c|
+ c.with_description { description } if description
+ end
+ end
+ end
+end
diff --git a/spec/config/settings_spec.rb b/spec/config/settings_spec.rb
index 55e675d5107..4639e533922 100644
--- a/spec/config/settings_spec.rb
+++ b/spec/config/settings_spec.rb
@@ -170,12 +170,12 @@ RSpec.describe Settings, feature_category: :system_access do
it 'defaults to using the encrypted_settings_key_base for the key' do
expect(Gitlab::EncryptedConfiguration).to receive(:new).with(hash_including(base_key: Gitlab::Application.secrets.encrypted_settings_key_base))
- Settings.encrypted('tmp/tests/test.enc')
+ described_class.encrypted('tmp/tests/test.enc')
end
it 'returns empty encrypted config when a key has not been set' do
allow(Gitlab::Application.secrets).to receive(:encrypted_settings_key_base).and_return(nil)
- expect(Settings.encrypted('tmp/tests/test.enc').read).to be_empty
+ expect(described_class.encrypted('tmp/tests/test.enc').read).to be_empty
end
end
diff --git a/spec/contracts/provider/spec_helper.rb b/spec/contracts/provider/spec_helper.rb
index 44e4d29c18e..f1ceca16b4b 100644
--- a/spec/contracts/provider/spec_helper.rb
+++ b/spec/contracts/provider/spec_helper.rb
@@ -2,10 +2,10 @@
require 'spec_helper'
require 'zeitwerk'
+require 'gitlab/rspec/all'
require_relative 'helpers/users_helper'
require_relative('../../../ee/spec/contracts/provider/spec_helper') if Gitlab.ee?
require Rails.root.join("spec/support/helpers/rails_helpers.rb")
-require Rails.root.join("spec/support/helpers/stub_env.rb")
# Opt out of telemetry collection. We can't allow all engineers, and users who install GitLab from source, to be
# automatically enrolled in sending data on their usage without their knowledge.
diff --git a/spec/controllers/admin/application_settings_controller_spec.rb b/spec/controllers/admin/application_settings_controller_spec.rb
index 537424093fb..60343c822af 100644
--- a/spec/controllers/admin/application_settings_controller_spec.rb
+++ b/spec/controllers/admin/application_settings_controller_spec.rb
@@ -487,6 +487,43 @@ RSpec.describe Admin::ApplicationSettingsController, :do_not_mock_admin_mode_set
end
end
+ describe 'GET #slack_app_manifest_download', feature_category: :integrations do
+ before do
+ sign_in(admin)
+ end
+
+ subject { get :slack_app_manifest_download }
+
+ it 'downloads the GitLab for Slack app manifest' do
+ allow(Slack::Manifest).to receive(:to_h).and_return({ foo: 'bar' })
+
+ subject
+
+ expect(response.body).to eq('{"foo":"bar"}')
+ expect(response.headers['Content-Disposition']).to eq(
+ 'attachment; filename="slack_manifest.json"; filename*=UTF-8\'\'slack_manifest.json'
+ )
+ end
+ end
+
+ describe 'GET #slack_app_manifest_share', feature_category: :integrations do
+ before do
+ sign_in(admin)
+ end
+
+ subject { get :slack_app_manifest_share }
+
+ it 'redirects the user to the Slack Manifest share URL' do
+ allow(Slack::Manifest).to receive(:to_h).and_return({ foo: 'bar' })
+
+ subject
+
+ expect(response).to redirect_to(
+ "https://api.slack.com/apps?new_app=1&manifest_json=%7B%22foo%22%3A%22bar%22%7D"
+ )
+ end
+ end
+
describe 'GET #service_usage_data', feature_category: :service_ping do
before do
stub_usage_data_connections
diff --git a/spec/controllers/admin/runners_controller_spec.rb b/spec/controllers/admin/runners_controller_spec.rb
index b1a2d90589a..6fa8d2c61c1 100644
--- a/spec/controllers/admin/runners_controller_spec.rb
+++ b/spec/controllers/admin/runners_controller_spec.rb
@@ -41,18 +41,6 @@ RSpec.describe Admin::RunnersController, feature_category: :runner_fleet do
expect(response).to have_gitlab_http_status(:ok)
expect(response).to render_template(:new)
end
-
- context 'when create_runner_workflow_for_admin is disabled' do
- before do
- stub_feature_flags(create_runner_workflow_for_admin: false)
- end
-
- it 'returns :not_found' do
- get :new
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
end
describe '#register' do
@@ -78,20 +66,6 @@ RSpec.describe Admin::RunnersController, feature_category: :runner_fleet do
expect(response).to have_gitlab_http_status(:not_found)
end
end
-
- context 'when create_runner_workflow_for_admin is disabled' do
- let_it_be(:new_runner) { create(:ci_runner, registration_type: :authenticated_user) }
-
- before do
- stub_feature_flags(create_runner_workflow_for_admin: false)
- end
-
- it 'returns :not_found' do
- register
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
end
describe '#edit' do
diff --git a/spec/controllers/application_controller_spec.rb b/spec/controllers/application_controller_spec.rb
index 58125f3a831..0beaae7a2d7 100644
--- a/spec/controllers/application_controller_spec.rb
+++ b/spec/controllers/application_controller_spec.rb
@@ -567,20 +567,6 @@ RSpec.describe ApplicationController, feature_category: :shared do
expect(controller.last_payload[:response_bytes]).to eq('authenticated'.bytesize)
end
-
- context 'with log_response_length disabled' do
- before do
- stub_feature_flags(log_response_length: false)
- end
-
- it 'logs response length' do
- sign_in user
-
- get :index
-
- expect(controller.last_payload).not_to include(:response_bytes)
- end
- end
end
describe '#access_denied' do
diff --git a/spec/controllers/concerns/issuable_collections_spec.rb b/spec/controllers/concerns/issuable_collections_spec.rb
index 6fa273bf3d7..9eb0f36cb37 100644
--- a/spec/controllers/concerns/issuable_collections_spec.rb
+++ b/spec/controllers/concerns/issuable_collections_spec.rb
@@ -92,7 +92,7 @@ RSpec.describe IssuableCollections do
}
end
- it 'only allows whitelisted params' do
+ it 'only allows allowlisted params' do
is_expected.to include({
'assignee_id' => '1',
'assignee_username' => 'user1',
@@ -123,7 +123,7 @@ RSpec.describe IssuableCollections do
}
end
- it 'only allows whitelisted params' do
+ it 'only allows allowlisted params' do
is_expected.to include({
'label_name' => %w[label1 label2],
'assignee_username' => %w[user1 user2]
diff --git a/spec/controllers/concerns/kas_cookie_spec.rb b/spec/controllers/concerns/kas_cookie_spec.rb
index 7ab48f12d83..c9490508690 100644
--- a/spec/controllers/concerns/kas_cookie_spec.rb
+++ b/spec/controllers/concerns/kas_cookie_spec.rb
@@ -42,14 +42,6 @@ RSpec.describe KasCookie, feature_category: :deployment_management do
expect(kas_cookie).to eq('foobar')
expect(::Gitlab::Kas::UserAccess).to have_received(:cookie_data)
end
-
- context 'when feature flag is disabled' do
- before do
- stub_feature_flags(kas_user_access: false)
- end
-
- it { is_expected.to be_blank }
- end
end
end
@@ -88,60 +80,42 @@ RSpec.describe KasCookie, feature_category: :deployment_management do
request.env['action_dispatch.content_security_policy'].directives['connect-src']
end
- context "when feature flag is disabled" do
+ context 'when KAS is on same domain as rails' do
let_it_be(:kas_tunnel_url) { 'ws://gitlab.example.com/-/k8s-proxy/' }
- before do
- stub_feature_flags(kas_user_access: false)
- end
-
- it 'does not add KAS url to connect-src directives' do
+ it 'does not add KAS url to CSP connect-src directive' do
expect(kas_csp_connect_src).not_to include(::Gitlab::Kas.tunnel_url)
end
end
- context 'when feature flag is enabled' do
- before do
- stub_feature_flags(kas_user_access: true)
+ context 'when KAS is on subdomain' do
+ let_it_be(:kas_tunnel_url) { 'ws://kas.gitlab.example.com/k8s-proxy/' }
+
+ it 'adds KAS url to CSP connect-src directive' do
+ expect(kas_csp_connect_src).to include(::Gitlab::Kas.tunnel_url)
end
- context 'when KAS is on same domain as rails' do
- let_it_be(:kas_tunnel_url) { 'ws://gitlab.example.com/-/k8s-proxy/' }
+ context 'when content_security_policy is disabled' do
+ let(:content_security_policy_enabled) { false }
it 'does not add KAS url to CSP connect-src directive' do
expect(kas_csp_connect_src).not_to include(::Gitlab::Kas.tunnel_url)
end
end
+ end
- context 'when KAS is on subdomain' do
- let_it_be(:kas_tunnel_url) { 'ws://kas.gitlab.example.com/k8s-proxy/' }
-
- it 'adds KAS url to CSP connect-src directive' do
- expect(kas_csp_connect_src).to include(::Gitlab::Kas.tunnel_url)
- end
-
- context 'when content_security_policy is disabled' do
- let(:content_security_policy_enabled) { false }
+ context 'when KAS tunnel url is configured without trailing slash' do
+ let_it_be(:kas_tunnel_url) { 'ws://kas.gitlab.example.com/k8s-proxy' }
- it 'does not add KAS url to CSP connect-src directive' do
- expect(kas_csp_connect_src).not_to include(::Gitlab::Kas.tunnel_url)
- end
- end
+ it 'adds KAS url to CSP connect-src directive with trailing slash' do
+ expect(kas_csp_connect_src).to include("#{::Gitlab::Kas.tunnel_url}/")
end
- context 'when KAS tunnel url is configured without trailing slash' do
- let_it_be(:kas_tunnel_url) { 'ws://kas.gitlab.example.com/k8s-proxy' }
+ context 'when content_security_policy is disabled' do
+ let(:content_security_policy_enabled) { false }
- it 'adds KAS url to CSP connect-src directive with trailing slash' do
- expect(kas_csp_connect_src).to include("#{::Gitlab::Kas.tunnel_url}/")
- end
-
- context 'when content_security_policy is disabled' do
- let(:content_security_policy_enabled) { false }
-
- it 'does not add KAS url to CSP connect-src directive' do
- expect(kas_csp_connect_src).not_to include("#{::Gitlab::Kas.tunnel_url}/")
- end
+ it 'does not add KAS url to CSP connect-src directive' do
+ expect(kas_csp_connect_src).not_to include("#{::Gitlab::Kas.tunnel_url}/")
end
end
end
diff --git a/spec/controllers/concerns/metrics_dashboard_spec.rb b/spec/controllers/concerns/metrics_dashboard_spec.rb
deleted file mode 100644
index 4a9c7c493a7..00000000000
--- a/spec/controllers/concerns/metrics_dashboard_spec.rb
+++ /dev/null
@@ -1,195 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe MetricsDashboard, feature_category: :metrics do
- include MetricsDashboardHelpers
-
- describe 'GET #metrics_dashboard' do
- let_it_be(:user) { create(:user) }
- let_it_be(:project) { project_with_dashboard('.gitlab/dashboards/test.yml') }
- let_it_be(:environment) { create(:environment, project: project) }
-
- before do
- stub_feature_flags(remove_monitor_metrics: false)
- sign_in(user)
- project.add_maintainer(user)
- end
-
- controller(::ApplicationController) do
- include MetricsDashboard
- end
-
- let(:json_response) do
- routes.draw { get "metrics_dashboard" => "anonymous#metrics_dashboard" }
- response = get :metrics_dashboard, format: :json
-
- response.parsed_body
- end
-
- context 'when no parameters are provided' do
- it 'returns an error json_response' do
- expect(json_response['status']).to eq('error')
- end
- end
-
- context 'when params are provided' do
- let(:params) { { environment: environment } }
-
- before do
- allow(controller).to receive(:project).and_return(project)
- allow(controller)
- .to receive(:metrics_dashboard_params)
- .and_return(params)
- end
-
- it 'returns the specified dashboard' do
- expect(json_response['dashboard']['dashboard']).to eq('Environment metrics')
- expect(json_response).not_to have_key('all_dashboards')
- expect(json_response).to have_key('metrics_data')
- end
-
- context 'when the params are in an alternate format' do
- let(:params) { ActionController::Parameters.new({ environment: environment }).permit! }
-
- it 'returns the specified dashboard' do
- expect(json_response['dashboard']['dashboard']).to eq('Environment metrics')
- expect(json_response).not_to have_key('all_dashboards')
- expect(json_response).to have_key('metrics_data')
- end
- end
-
- context 'when environment for dashboard is available' do
- let(:params) { { environment: environment } }
-
- before do
- allow(controller).to receive(:project).and_return(project)
- allow(controller).to receive(:environment).and_return(environment)
- allow(controller)
- .to receive(:metrics_dashboard_params)
- .and_return(params)
- end
-
- it 'returns the specified dashboard' do
- expect(json_response['dashboard']['dashboard']).to eq('Environment metrics')
- expect(json_response).not_to have_key('all_dashboards')
- expect(json_response).to have_key('metrics_data')
- end
- end
-
- context 'when dashboard path includes encoded characters' do
- let(:params) { { dashboard_path: 'dashboard%26copy.yml' } }
-
- before do
- allow(controller)
- .to receive(:metrics_dashboard_params)
- .and_return(params)
- end
-
- it 'decodes dashboard path' do
- expect(::Gitlab::Metrics::Dashboard::Finder).to receive(:find).with(anything, anything, hash_including(dashboard_path: 'dashboard&copy.yml'))
-
- json_response
- end
- end
-
- context 'when parameters are provided and the list of all dashboards is required' do
- before do
- allow(controller).to receive(:include_all_dashboards?).and_return(true)
- end
-
- it 'returns a dashboard in addition to the list of dashboards' do
- expect(json_response['dashboard']['dashboard']).to eq('Environment metrics')
- expect(json_response).to have_key('all_dashboards')
- end
-
- context 'in all_dashboard list' do
- let(:system_dashboard) { json_response['all_dashboards'].find { |dashboard| dashboard["system_dashboard"] == true } }
-
- let(:project_dashboard) do
- json_response['all_dashboards'].find do |dashboard|
- dashboard['path'] == '.gitlab/dashboards/test.yml'
- end
- end
-
- it 'includes project_blob_path only for project dashboards' do
- expect(system_dashboard['project_blob_path']).to be_nil
- expect(project_dashboard['project_blob_path']).to eq("/#{project.namespace.path}/#{project.path}/-/blob/master/.gitlab/dashboards/test.yml")
- end
-
- it 'allows editing only for project dashboards' do
- expect(system_dashboard['can_edit']).to be(false)
- expect(project_dashboard['can_edit']).to be(true)
- end
-
- it 'includes out_of_the_box_dashboard key' do
- expect(system_dashboard['out_of_the_box_dashboard']).to be(true)
- expect(project_dashboard['out_of_the_box_dashboard']).to be(false)
- end
-
- describe 'project permissions' do
- using RSpec::Parameterized::TableSyntax
-
- where(:can_collaborate, :system_can_edit, :project_can_edit) do
- false | false | false
- true | false | true
- end
-
- with_them do
- before do
- allow(controller).to receive(:can_collaborate_with_project?).and_return(can_collaborate)
- end
-
- it "sets can_edit appropriately" do
- expect(system_dashboard["can_edit"]).to eq(system_can_edit)
- expect(project_dashboard["can_edit"]).to eq(project_can_edit)
- end
- end
- end
-
- context 'starred dashboards' do
- let_it_be(:dashboard_yml) { fixture_file('lib/gitlab/metrics/dashboard/sample_dashboard.yml') }
- let_it_be(:dashboards) do
- {
- '.gitlab/dashboards/test.yml' => dashboard_yml,
- '.gitlab/dashboards/anomaly.yml' => dashboard_yml,
- '.gitlab/dashboards/errors.yml' => dashboard_yml
- }
- end
-
- let_it_be(:project) { create(:project, :custom_repo, files: dashboards) }
-
- before do
- create(:metrics_users_starred_dashboard, user: user, project: project, dashboard_path: '.gitlab/dashboards/errors.yml')
- create(:metrics_users_starred_dashboard, user: user, project: project, dashboard_path: '.gitlab/dashboards/test.yml')
- end
-
- it 'adds starred dashboard information and sorts the list' do
- all_dashboards = json_response['all_dashboards'].map { |dashboard| dashboard.slice('display_name', 'starred', 'user_starred_path') }
- expected_response = [
- { "display_name" => "anomaly.yml", "starred" => false, 'user_starred_path' => api_v4_projects_metrics_user_starred_dashboards_path(id: project.id, params: { dashboard_path: '.gitlab/dashboards/anomaly.yml' }) },
- { "display_name" => "errors.yml", "starred" => true, 'user_starred_path' => api_v4_projects_metrics_user_starred_dashboards_path(id: project.id, params: { dashboard_path: '.gitlab/dashboards/errors.yml' }) },
- { "display_name" => "K8s pod health", "starred" => false, 'user_starred_path' => api_v4_projects_metrics_user_starred_dashboards_path(id: project.id, params: { dashboard_path: 'config/prometheus/pod_metrics.yml' }) },
- { "display_name" => "Overview", "starred" => false, 'user_starred_path' => api_v4_projects_metrics_user_starred_dashboards_path(id: project.id, params: { dashboard_path: 'config/prometheus/common_metrics.yml' }) },
- { "display_name" => "test.yml", "starred" => true, 'user_starred_path' => api_v4_projects_metrics_user_starred_dashboards_path(id: project.id, params: { dashboard_path: '.gitlab/dashboards/test.yml' }) }
- ]
-
- expect(all_dashboards).to eq(expected_response)
- end
- end
- end
- end
- end
-
- context 'when metrics dashboard feature is unavailable' do
- it 'returns 404 not found' do
- stub_feature_flags(remove_monitor_metrics: true)
-
- routes.draw { get "metrics_dashboard" => "anonymous#metrics_dashboard" }
- response = get :metrics_dashboard, format: :json
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
- end
-end
diff --git a/spec/controllers/concerns/onboarding/status_spec.rb b/spec/controllers/concerns/onboarding/status_spec.rb
new file mode 100644
index 00000000000..3f6e597a235
--- /dev/null
+++ b/spec/controllers/concerns/onboarding/status_spec.rb
@@ -0,0 +1,106 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Onboarding::Status, feature_category: :onboarding do
+ let_it_be(:member) { create(:group_member) }
+ let_it_be(:user) { member.user }
+ let_it_be(:tasks_to_be_done) { %w[ci code] }
+ let_it_be(:source) { member.group }
+
+ describe '#continue_full_onboarding?' do
+ subject { described_class.new(nil).continue_full_onboarding? }
+
+ it { is_expected.to eq(false) }
+ end
+
+ describe '#single_invite?' do
+ subject { described_class.new(user).single_invite? }
+
+ context 'when there is only one member for the user' do
+ context 'when the member source exists' do
+ it { is_expected.to eq(true) }
+ end
+ end
+
+ context 'when there is more than one member for the user' do
+ before do
+ create(:group_member, user: user)
+ end
+
+ it { is_expected.to eq(false) }
+ end
+
+ context 'when there are no members for the user' do
+ let(:user) { build_stubbed(:user) }
+
+ it { is_expected.to eq(false) }
+ end
+ end
+
+ describe '#last_invited_member' do
+ subject { described_class.new(user).last_invited_member }
+
+ it { is_expected.to eq(member) }
+
+ context 'when another member exists and is most recent' do
+ let!(:last_member) { create(:group_member, user: user) }
+
+ it { is_expected.to eq(last_member) }
+ end
+
+ context 'when there are no members' do
+ let_it_be(:user) { build_stubbed(:user) }
+
+ it { is_expected.to be_nil }
+ end
+ end
+
+ describe '#last_invited_member_source' do
+ subject { described_class.new(user).last_invited_member_source }
+
+ context 'when a member exists' do
+ it { is_expected.to eq(source) }
+ end
+
+ context 'when no members exist' do
+ let_it_be(:user) { build_stubbed(:user) }
+
+ it { is_expected.to be_nil }
+ end
+
+ context 'when another member exists and is most recent' do
+ let!(:last_member_source) { create(:group_member, user: user).group }
+
+ it { is_expected.to eq(last_member_source) }
+ end
+ end
+
+ describe '#invite_with_tasks_to_be_done?' do
+ subject { described_class.new(user).invite_with_tasks_to_be_done? }
+
+ context 'when there are tasks_to_be_done with one member' do
+ let_it_be(:member) { create(:group_member, user: user, tasks_to_be_done: tasks_to_be_done) }
+
+ it { is_expected.to eq(true) }
+ end
+
+ context 'when there are multiple members and the tasks_to_be_done is on only one of them' do
+ before do
+ create(:group_member, user: user, tasks_to_be_done: tasks_to_be_done)
+ end
+
+ it { is_expected.to eq(true) }
+ end
+
+ context 'when there are no tasks_to_be_done' do
+ it { is_expected.to eq(false) }
+ end
+
+ context 'when there are no members' do
+ let_it_be(:user) { build_stubbed(:user) }
+
+ it { is_expected.to eq(false) }
+ end
+ end
+end
diff --git a/spec/controllers/dashboard_controller_spec.rb b/spec/controllers/dashboard_controller_spec.rb
index 304e08f40bd..52f6f08e17a 100644
--- a/spec/controllers/dashboard_controller_spec.rb
+++ b/spec/controllers/dashboard_controller_spec.rb
@@ -16,22 +16,7 @@ RSpec.describe DashboardController, feature_category: :code_review_workflow do
end
describe 'GET issues' do
- 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, :issues
- 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, :issues
- end
-
+ it_behaves_like 'issuables list meta-data', :issue, :issues
it_behaves_like 'issuables requiring filter', :issues
it 'includes tasks in issue list' do
diff --git a/spec/controllers/explore/projects_controller_spec.rb b/spec/controllers/explore/projects_controller_spec.rb
index e73e115b77d..68ae1ca218b 100644
--- a/spec/controllers/explore/projects_controller_spec.rb
+++ b/spec/controllers/explore/projects_controller_spec.rb
@@ -122,6 +122,59 @@ RSpec.describe Explore::ProjectsController, feature_category: :groups_and_projec
end
end
end
+
+ describe 'GET #topic.atom' do
+ context 'when topic does not exist' do
+ it 'renders a 404 error' do
+ get :topic, format: :atom, params: { topic_name: 'topic1' }
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ context 'when topic exists' do
+ let(:topic) { create(:topic, name: 'topic1') }
+ let_it_be(:older_project) { create(:project, :public, updated_at: 1.day.ago) }
+ let_it_be(:newer_project) { create(:project, :public, updated_at: 2.days.ago) }
+
+ before do
+ create(:project_topic, project: older_project, topic: topic)
+ create(:project_topic, project: newer_project, topic: topic)
+ end
+
+ it 'renders the template' do
+ get :topic, format: :atom, params: { topic_name: 'topic1' }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to render_template('topic', layout: :xml)
+ end
+
+ it 'sorts repos by descending creation date' do
+ get :topic, format: :atom, params: { topic_name: 'topic1' }
+
+ expect(assigns(:projects)).to match_array [newer_project, older_project]
+ end
+
+ it 'finds topic by case insensitive name' do
+ get :topic, format: :atom, params: { topic_name: 'TOPIC1' }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to render_template('topic', layout: :xml)
+ end
+
+ describe 'when topic contains more than 20 projects' do
+ before do
+ create_list(:project, 22, :public, topics: [topic])
+ end
+
+ it 'does not assigns more than 20 projects' do
+ get :topic, format: :atom, params: { topic_name: 'topic1' }
+
+ expect(assigns(:projects).count).to be(20)
+ end
+ end
+ end
+ end
end
shared_examples "blocks high page numbers" do
diff --git a/spec/controllers/graphql_controller_spec.rb b/spec/controllers/graphql_controller_spec.rb
index b4a7e41ccd2..be47b32ec4f 100644
--- a/spec/controllers/graphql_controller_spec.rb
+++ b/spec/controllers/graphql_controller_spec.rb
@@ -431,6 +431,13 @@ RSpec.describe GraphqlController, feature_category: :integrations do
context 'when querying an IntrospectionQuery', :use_clean_rails_memory_store_caching do
let_it_be(:query) { File.read(Rails.root.join('spec/fixtures/api/graphql/introspection.graphql')) }
+ it 'caches IntrospectionQuery even when operationName is not given' do
+ expect(GitlabSchema).to receive(:execute).exactly(:once)
+
+ post :execute, params: { query: query }
+ post :execute, params: { query: query }
+ end
+
it 'caches the IntrospectionQuery' do
expect(GitlabSchema).to receive(:execute).exactly(:once)
@@ -461,35 +468,9 @@ RSpec.describe GraphqlController, feature_category: :integrations do
post :execute, params: { query: query, operationName: 'IntrospectionQuery' }
end
- it 'logs that it will try to hit the cache' do
- expect(Gitlab::AppLogger).to receive(:info).with(message: "IntrospectionQueryCache hit")
- expect(Gitlab::AppLogger).to receive(:info).with(
- message: "IntrospectionQueryCache",
- can_use_introspection_query_cache: "true",
- query: query.to_s,
- variables: "{}",
- introspection_query_cache_key: "[\"introspection-query-cache\", \"#{Gitlab.revision}\", false]"
- )
-
- post :execute, params: { query: query, operationName: 'IntrospectionQuery' }
- end
-
context 'when there is an unknown introspection query' do
let(:query) { File.read(Rails.root.join('spec/fixtures/api/graphql/fake_introspection.graphql')) }
- it 'logs that it did not try to hit the cache' do
- expect(Gitlab::AppLogger).to receive(:info).with(message: "IntrospectionQueryCache miss")
- expect(Gitlab::AppLogger).to receive(:info).with(
- message: "IntrospectionQueryCache",
- can_use_introspection_query_cache: "false",
- query: query.to_s,
- variables: "{}",
- introspection_query_cache_key: "[\"introspection-query-cache\", \"#{Gitlab.revision}\", false]"
- )
-
- post :execute, params: { query: query, operationName: 'IntrospectionQuery' }
- end
-
it 'does not cache an unknown introspection query' do
expect(GitlabSchema).to receive(:execute).exactly(:twice)
diff --git a/spec/controllers/groups/children_controller_spec.rb b/spec/controllers/groups/children_controller_spec.rb
index ee8b2dce298..82dd8c18cfd 100644
--- a/spec/controllers/groups/children_controller_spec.rb
+++ b/spec/controllers/groups/children_controller_spec.rb
@@ -222,13 +222,13 @@ RSpec.describe Groups::ChildrenController, feature_category: :groups_and_project
control = ActiveRecord::QueryRecorder.new { get_list }
_new_project = create(:project, :public, namespace: group)
- expect { get_list }.not_to exceed_query_limit(control).with_threshold(expected_queries_per_project)
+ expect { get_list }.not_to exceed_query_limit(control).with_threshold(expected_queries_per_project + 1)
end
context 'when rendering hierarchies' do
# When loading hierarchies we load the all the ancestors for matched projects
- # in 2 separate queries
- let(:extra_queries_for_hierarchies) { 2 }
+ # in 3 separate queries
+ let(:extra_queries_for_hierarchies) { 3 }
def get_filtered_list
get :index, params: { group_id: group.to_param, filter: 'filter' }, format: :json
diff --git a/spec/controllers/groups/group_members_controller_spec.rb b/spec/controllers/groups/group_members_controller_spec.rb
index fe4b80e12fe..feebdd972aa 100644
--- a/spec/controllers/groups/group_members_controller_spec.rb
+++ b/spec/controllers/groups/group_members_controller_spec.rb
@@ -234,7 +234,7 @@ RSpec.describe Groups::GroupMembersController do
it 'returns correct json response' do
expect(json_response).to eq({
"expires_soon" => false,
- "expires_at_formatted" => expiry_date.to_time.in_time_zone.to_s(:medium)
+ "expires_at_formatted" => expiry_date.to_time.in_time_zone.to_fs(:medium)
})
end
end
diff --git a/spec/controllers/groups/runners_controller_spec.rb b/spec/controllers/groups/runners_controller_spec.rb
index 9ae5cb6f87c..37242bce6bf 100644
--- a/spec/controllers/groups/runners_controller_spec.rb
+++ b/spec/controllers/groups/runners_controller_spec.rb
@@ -65,52 +65,28 @@ RSpec.describe Groups::RunnersController, feature_category: :runner_fleet do
end
describe '#new' do
- context 'when create_runner_workflow_for_namespace is enabled' do
+ context 'when user is owner' do
before do
- stub_feature_flags(create_runner_workflow_for_namespace: [group])
- end
-
- context 'when user is owner' do
- before do
- group.add_owner(user)
- end
-
- it 'renders new with 200 status code' do
- get :new, params: { group_id: group }
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(response).to render_template(:new)
- end
+ group.add_owner(user)
end
- context 'when user is not owner' do
- before do
- group.add_maintainer(user)
- end
-
- it 'renders a 404' do
- get :new, params: { group_id: group }
+ it 'renders new with 200 status code' do
+ get :new, params: { group_id: group }
- expect(response).to have_gitlab_http_status(:not_found)
- end
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to render_template(:new)
end
end
- context 'when create_runner_workflow_for_namespace is disabled' do
+ context 'when user is not owner' do
before do
- stub_feature_flags(create_runner_workflow_for_namespace: false)
+ group.add_maintainer(user)
end
- context 'when user is owner' do
- before do
- group.add_owner(user)
- end
-
- it 'renders a 404' do
- get :new, params: { group_id: group }
+ it 'renders a 404' do
+ get :new, params: { group_id: group }
- expect(response).to have_gitlab_http_status(:not_found)
- end
+ expect(response).to have_gitlab_http_status(:not_found)
end
end
end
@@ -118,66 +94,40 @@ RSpec.describe Groups::RunnersController, feature_category: :runner_fleet do
describe '#register' do
subject(:register) { get :register, params: { group_id: group, id: new_runner } }
- context 'when create_runner_workflow_for_namespace is enabled' do
+ context 'when user is owner' do
before do
- stub_feature_flags(create_runner_workflow_for_namespace: [group])
+ group.add_owner(user)
end
- context 'when user is owner' do
- before do
- group.add_owner(user)
- end
-
- context 'when runner can be registered after creation' do
- let_it_be(:new_runner) { create(:ci_runner, :group, groups: [group], registration_type: :authenticated_user) }
+ context 'when runner can be registered after creation' do
+ let_it_be(:new_runner) { create(:ci_runner, :group, groups: [group], registration_type: :authenticated_user) }
- it 'renders a :register template' do
- register
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(response).to render_template(:register)
- end
- end
-
- context 'when runner cannot be registered after creation' do
- let_it_be(:new_runner) { runner }
-
- it 'returns :not_found' do
- register
+ it 'renders a :register template' do
+ register
- expect(response).to have_gitlab_http_status(:not_found)
- end
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to render_template(:register)
end
end
- context 'when user is not owner' do
- before do
- group.add_maintainer(user)
- end
-
- context 'when runner can be registered after creation' do
- let_it_be(:new_runner) { create(:ci_runner, :group, groups: [group], registration_type: :authenticated_user) }
+ context 'when runner cannot be registered after creation' do
+ let_it_be(:new_runner) { runner }
- it 'returns :not_found' do
- register
+ it 'returns :not_found' do
+ register
- expect(response).to have_gitlab_http_status(:not_found)
- end
+ expect(response).to have_gitlab_http_status(:not_found)
end
end
end
- context 'when create_runner_workflow_for_namespace is disabled' do
- let_it_be(:new_runner) { create(:ci_runner, :group, groups: [group], registration_type: :authenticated_user) }
-
+ context 'when user is not owner' do
before do
- stub_feature_flags(create_runner_workflow_for_namespace: false)
+ group.add_maintainer(user)
end
- context 'when user is owner' do
- before do
- group.add_owner(user)
- end
+ context 'when runner can be registered after creation' do
+ let_it_be(:new_runner) { create(:ci_runner, :group, groups: [group], registration_type: :authenticated_user) }
it 'returns :not_found' do
register
diff --git a/spec/controllers/groups/uploads_controller_spec.rb b/spec/controllers/groups/uploads_controller_spec.rb
index 6649e8f057c..7795fff5541 100644
--- a/spec/controllers/groups/uploads_controller_spec.rb
+++ b/spec/controllers/groups/uploads_controller_spec.rb
@@ -76,31 +76,17 @@ RSpec.describe Groups::UploadsController do
context 'when uploader class does not match the upload' do
let(:uploader_class) { FileUploader }
- it 'responds with status 200 but logs a deprecation message' do
- expect(Gitlab::AppJsonLogger).to receive(:info).with(
- message: 'Deprecated usage of build_uploader_from_params',
- uploader_class: uploader_class.name,
- path: filename,
- exists: true
- )
-
+ it 'responds with status 404' do
show_upload
- expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to have_gitlab_http_status(:not_found)
end
end
context 'when filename does not match' do
let(:invalid_filename) { 'invalid_filename.jpg' }
- it 'responds with status 404 and logs a deprecation message' do
- expect(Gitlab::AppJsonLogger).to receive(:info).with(
- message: 'Deprecated usage of build_uploader_from_params',
- uploader_class: uploader_class.name,
- path: invalid_filename,
- exists: false
- )
-
+ it 'responds with status 404' do
get :show, params: params.merge(secret: secret, filename: invalid_filename)
expect(response).to have_gitlab_http_status(:not_found)
diff --git a/spec/controllers/import/fogbugz_controller_spec.rb b/spec/controllers/import/fogbugz_controller_spec.rb
index 3b099ba2613..273dfd6a9c7 100644
--- a/spec/controllers/import/fogbugz_controller_spec.rb
+++ b/spec/controllers/import/fogbugz_controller_spec.rb
@@ -17,7 +17,7 @@ RSpec.describe Import::FogbugzController, feature_category: :importers do
end
describe 'POST #callback' do
- let(:xml_response) { %Q(<?xml version=\"1.0\" encoding=\"UTF-8\"?><response><token><![CDATA[#{token}]]></token></response>) }
+ let(:xml_response) { %(<?xml version=\"1.0\" encoding=\"UTF-8\"?><response><token><![CDATA[#{token}]]></token></response>) }
before do
stub_request(:post, "https://example.com/api.asp").to_return(status: 200, body: xml_response, headers: {})
diff --git a/spec/controllers/oauth/authorizations_controller_spec.rb b/spec/controllers/oauth/authorizations_controller_spec.rb
index 3476c7b8465..4772c3f3487 100644
--- a/spec/controllers/oauth/authorizations_controller_spec.rb
+++ b/spec/controllers/oauth/authorizations_controller_spec.rb
@@ -298,4 +298,15 @@ RSpec.describe Oauth::AuthorizationsController do
it 'includes Two-factor enforcement concern' do
expect(described_class.included_modules.include?(EnforcesTwoFactorAuthentication)).to eq(true)
end
+
+ describe 'Gon variables' do
+ it 'adds Gon variables' do
+ expect(controller).to receive(:add_gon_variables)
+ get :new, params: params
+ end
+
+ it 'includes GonHelper module' do
+ expect(controller).to be_a(Gitlab::GonHelper)
+ end
+ end
end
diff --git a/spec/controllers/projects/alert_management_controller_spec.rb b/spec/controllers/projects/alert_management_controller_spec.rb
deleted file mode 100644
index d80147b5c59..00000000000
--- a/spec/controllers/projects/alert_management_controller_spec.rb
+++ /dev/null
@@ -1,59 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Projects::AlertManagementController do
- let_it_be(:project) { create(:project) }
- let_it_be(:role) { :developer }
- let_it_be(:user) { create(:user) }
- let_it_be(:id) { 1 }
-
- before do
- project.add_role(user, role)
- sign_in(user)
- end
-
- describe 'GET #index' do
- it 'shows the page' do
- get :index, params: { namespace_id: project.namespace, project_id: project }
-
- expect(response).to have_gitlab_http_status(:ok)
- end
-
- context 'when user is unauthorized' do
- let(:role) { :reporter }
-
- it 'shows 404' do
- get :index, params: { namespace_id: project.namespace, project_id: project }
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
- end
-
- describe 'GET #details' do
- it 'shows the page' do
- get :details, params: { namespace_id: project.namespace, project_id: project, id: id }
-
- expect(response).to have_gitlab_http_status(:ok)
- end
-
- context 'when user is unauthorized' do
- let(:role) { :reporter }
-
- it 'shows 404' do
- get :details, params: { namespace_id: project.namespace, project_id: project, id: id }
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
- end
-
- describe 'set_alert_id' do
- it 'sets alert id from the route' do
- get :details, params: { namespace_id: project.namespace, project_id: project, id: id }
-
- expect(assigns(:alert_id)).to eq(id.to_s)
- end
- end
-end
diff --git a/spec/controllers/projects/artifacts_controller_spec.rb b/spec/controllers/projects/artifacts_controller_spec.rb
index c7b74b5cf68..44615506e5d 100644
--- a/spec/controllers/projects/artifacts_controller_spec.rb
+++ b/spec/controllers/projects/artifacts_controller_spec.rb
@@ -104,7 +104,7 @@ RSpec.describe Projects::ArtifactsController, feature_category: :build_artifacts
download_artifact
- expect(response.headers['Content-Disposition']).to eq(%Q(attachment; filename="#{filename}"; filename*=UTF-8''#{filename}))
+ expect(response.headers['Content-Disposition']).to eq(%(attachment; filename="#{filename}"; filename*=UTF-8''#{filename}))
end
end
@@ -135,7 +135,7 @@ RSpec.describe Projects::ArtifactsController, feature_category: :build_artifacts
download_artifact(file_type: 'archive')
expect(response).to have_gitlab_http_status(:ok)
- expect(response.headers['Content-Disposition']).to eq(%Q(attachment; filename="#{filename}"; filename*=UTF-8''#{filename}))
+ expect(response.headers['Content-Disposition']).to eq(%(attachment; filename="#{filename}"; filename*=UTF-8''#{filename}))
end
end
end
@@ -168,7 +168,7 @@ RSpec.describe Projects::ArtifactsController, feature_category: :build_artifacts
download_artifact(file_type: file_type)
- expect(response.headers['Content-Disposition']).to eq(%Q(attachment; filename="#{filename}"; filename*=UTF-8''#{filename}))
+ expect(response.headers['Content-Disposition']).to eq(%(attachment; filename="#{filename}"; filename*=UTF-8''#{filename}))
end
end
@@ -264,7 +264,7 @@ RSpec.describe Projects::ArtifactsController, feature_category: :build_artifacts
expect(response).to have_gitlab_http_status(:ok)
expect(response.headers['Content-Disposition'])
- .to eq(%Q(attachment; filename="#{filename}"; filename*=UTF-8''#{filename}))
+ .to eq(%(attachment; filename="#{filename}"; filename*=UTF-8''#{filename}))
end
end
end
diff --git a/spec/controllers/projects/autocomplete_sources_controller_spec.rb b/spec/controllers/projects/autocomplete_sources_controller_spec.rb
index 70178083e71..d0bfbeae78f 100644
--- a/spec/controllers/projects/autocomplete_sources_controller_spec.rb
+++ b/spec/controllers/projects/autocomplete_sources_controller_spec.rb
@@ -131,6 +131,10 @@ RSpec.describe Projects::AutocompleteSourcesController do
end
shared_examples 'all members are returned' do
+ before do
+ stub_feature_flags(disable_all_mention: false)
+ end
+
it 'returns an array of member object' do
get :members, format: :json, params: { namespace_id: group.path, project_id: public_project.path, type: issuable_type }
@@ -155,6 +159,19 @@ RSpec.describe Projects::AutocompleteSourcesController do
name: invited_private_member.name,
avatar_url: invited_private_member.avatar_url)
end
+
+ context 'when `disable_all_mention` FF is enabled' do
+ before do
+ stub_feature_flags(disable_all_mention: true)
+ end
+
+ it 'does not return the all mention user' do
+ get :members, format: :json, params: { namespace_id: group.path, project_id: public_project.path, type: issuable_type }
+
+ expect(json_response).not_to include(a_hash_including(
+ { username: 'all', name: 'All Project and Group Members' }))
+ end
+ end
end
context 'with issue' do
@@ -180,6 +197,10 @@ RSpec.describe Projects::AutocompleteSourcesController do
end
shared_examples 'only public members are returned for public project' do
+ before do
+ stub_feature_flags(disable_all_mention: false)
+ end
+
it 'only returns public members' do
get :members, format: :json, params: { namespace_id: group.path, project_id: public_project.path, type: issuable_type }
@@ -193,6 +214,19 @@ RSpec.describe Projects::AutocompleteSourcesController do
name: user.name,
avatar_url: user.avatar_url)
end
+
+ context 'when `disable_all_mention` FF is enabled' do
+ before do
+ stub_feature_flags(disable_all_mention: true)
+ end
+
+ it 'does not return the all mention user' do
+ get :members, format: :json, params: { namespace_id: group.path, project_id: public_project.path, type: issuable_type }
+
+ expect(json_response).not_to include(a_hash_including(
+ { username: 'all', name: 'All Project and Group Members' }))
+ end
+ end
end
context 'with issue' do
diff --git a/spec/controllers/projects/blob_controller_spec.rb b/spec/controllers/projects/blob_controller_spec.rb
index b07cb7a228d..49c1935c4a3 100644
--- a/spec/controllers/projects/blob_controller_spec.rb
+++ b/spec/controllers/projects/blob_controller_spec.rb
@@ -5,15 +5,21 @@ require 'spec_helper'
RSpec.describe Projects::BlobController, feature_category: :source_code_management do
include ProjectForksHelper
- let(:project) { create(:project, :public, :repository, previous_default_branch: previous_default_branch) }
- let(:previous_default_branch) { nil }
+ let_it_be(:project) { create(:project, :public, :repository) }
describe "GET show" do
- let(:params) { { namespace_id: project.namespace, project_id: project, id: id } }
+ let(:params) { { namespace_id: project.namespace, project_id: project, id: id, ref_type: ref_type } }
+ let(:ref_type) { nil }
let(:request) do
get(:show, params: params)
end
+ let(:redirect_with_ref_type) { true }
+
+ before do
+ stub_feature_flags(redirect_with_ref_type: redirect_with_ref_type)
+ end
+
render_views
context 'with file path' do
@@ -24,25 +30,43 @@ RSpec.describe Projects::BlobController, feature_category: :source_code_manageme
request
end
+ after do
+ project.repository.rm_tag(project.creator, 'ambiguous_ref')
+ project.repository.rm_branch(project.creator, 'ambiguous_ref')
+ end
+
context 'when the ref is ambiguous' do
let(:ref) { 'ambiguous_ref' }
let(:path) { 'README.md' }
let(:id) { "#{ref}/#{path}" }
- let(:params) { { namespace_id: project.namespace, project_id: project, id: id, ref_type: ref_type } }
- context 'and explicitly requesting a branch' do
- let(:ref_type) { 'heads' }
+ context 'and the redirect_with_ref_type flag is disabled' do
+ let(:redirect_with_ref_type) { false }
+
+ context 'and explicitly requesting a branch' do
+ let(:ref_type) { 'heads' }
+
+ it 'redirects to blob#show with sha for the branch' do
+ expect(response).to redirect_to(project_blob_path(project, "#{RepoHelpers.another_sample_commit.id}/#{path}"))
+ end
+ end
+
+ context 'and explicitly requesting a tag' do
+ let(:ref_type) { 'tags' }
- it 'redirects to blob#show with sha for the branch' do
- expect(response).to redirect_to(project_blob_path(project, "#{RepoHelpers.another_sample_commit.id}/#{path}"))
+ it 'responds with success' do
+ expect(response).to be_ok
+ end
end
end
- context 'and explicitly requesting a tag' do
- let(:ref_type) { 'tags' }
+ context 'and the redirect_with_ref_type flag is enabled' do
+ context 'when the ref_type is nil' do
+ let(:ref_type) { nil }
- it 'responds with success' do
- expect(response).to be_ok
+ it 'redirects to the tag' do
+ expect(response).to redirect_to(project_blob_path(project, id, ref_type: 'tags'))
+ end
end
end
end
@@ -68,18 +92,20 @@ RSpec.describe Projects::BlobController, feature_category: :source_code_manageme
it { is_expected.to respond_with(:not_found) }
end
- context "renamed default branch, valid file" do
- let(:id) { 'old-default-branch/README.md' }
- let(:previous_default_branch) { 'old-default-branch' }
+ context 'when default branch was renamed' do
+ let_it_be_with_reload(:project) { create(:project, :public, :repository, previous_default_branch: 'old-default-branch') }
- it { is_expected.to redirect_to("/#{project.full_path}/-/blob/#{project.default_branch}/README.md") }
- end
+ context "renamed default branch, valid file" do
+ let(:id) { 'old-default-branch/README.md' }
+
+ it { is_expected.to redirect_to("/#{project.full_path}/-/blob/#{project.default_branch}/README.md") }
+ end
- context "renamed default branch, invalid file" do
- let(:id) { 'old-default-branch/invalid-path.rb' }
- let(:previous_default_branch) { 'old-default-branch' }
+ context "renamed default branch, invalid file" do
+ let(:id) { 'old-default-branch/invalid-path.rb' }
- it { is_expected.to redirect_to("/#{project.full_path}/-/blob/#{project.default_branch}/invalid-path.rb") }
+ it { is_expected.to redirect_to("/#{project.full_path}/-/blob/#{project.default_branch}/invalid-path.rb") }
+ end
end
context "binary file" do
@@ -100,7 +126,7 @@ RSpec.describe Projects::BlobController, feature_category: :source_code_manageme
let(:id) { 'master/README.md' }
before do
- get :show, params: { namespace_id: project.namespace, project_id: project, id: id }, format: :json
+ get :show, params: params, format: :json
end
it do
@@ -114,7 +140,7 @@ RSpec.describe Projects::BlobController, feature_category: :source_code_manageme
let(:id) { 'master/README.md' }
before do
- get :show, params: { namespace_id: project.namespace, project_id: project, id: id, viewer: 'none' }, format: :json
+ get :show, params: { namespace_id: project.namespace, project_id: project, id: id, ref_type: 'heads', viewer: 'none' }, format: :json
end
it do
@@ -127,7 +153,7 @@ RSpec.describe Projects::BlobController, feature_category: :source_code_manageme
context 'with tree path' do
before do
- get :show, params: { namespace_id: project.namespace, project_id: project, id: id }
+ get :show, params: params
controller.instance_variable_set(:@blob, nil)
end
@@ -414,6 +440,10 @@ RSpec.describe Projects::BlobController, feature_category: :source_code_manageme
let(:after_delete_path) { project_tree_path(project, 'master/files') }
it 'redirects to the sub directory' do
+ expect_next_instance_of(Files::DeleteService) do |instance|
+ expect(instance).to receive(:execute).and_return({ status: :success })
+ end
+
delete :destroy, params: default_params
expect(response).to redirect_to(after_delete_path)
diff --git a/spec/controllers/projects/clusters_controller_spec.rb b/spec/controllers/projects/clusters_controller_spec.rb
index bface886674..15b7ddd85ea 100644
--- a/spec/controllers/projects/clusters_controller_spec.rb
+++ b/spec/controllers/projects/clusters_controller_spec.rb
@@ -113,18 +113,6 @@ RSpec.describe Projects::ClustersController, feature_category: :deployment_manag
end
end
- it_behaves_like 'GET #metrics_dashboard for dashboard', 'Cluster health' do
- let(:cluster) { create(:cluster, :provided_by_gcp, projects: [project]) }
-
- let(:metrics_dashboard_req_params) do
- {
- id: cluster.id,
- namespace_id: project.namespace.full_path,
- project_id: project.path
- }
- end
- end
-
describe 'POST create for existing cluster' do
let(:params) do
{
diff --git a/spec/controllers/projects/design_management/designs/raw_images_controller_spec.rb b/spec/controllers/projects/design_management/designs/raw_images_controller_spec.rb
index a7f3212a6f9..eaef455837f 100644
--- a/spec/controllers/projects/design_management/designs/raw_images_controller_spec.rb
+++ b/spec/controllers/projects/design_management/designs/raw_images_controller_spec.rb
@@ -129,7 +129,7 @@ RSpec.describe Projects::DesignManagement::Designs::RawImagesController do
it 'serves files with `Content-Disposition: attachment`' do
subject
- expect(response.header['Content-Disposition']).to eq(%Q(attachment; filename=\"#{filename}\"; filename*=UTF-8''#{filename}))
+ expect(response.header['Content-Disposition']).to eq(%(attachment; filename=\"#{filename}\"; filename*=UTF-8''#{filename}))
end
it 'sets appropriate caching headers' do
diff --git a/spec/controllers/projects/design_management/designs/resized_image_controller_spec.rb b/spec/controllers/projects/design_management/designs/resized_image_controller_spec.rb
index 1bb5112681c..b4667b4568f 100644
--- a/spec/controllers/projects/design_management/designs/resized_image_controller_spec.rb
+++ b/spec/controllers/projects/design_management/designs/resized_image_controller_spec.rb
@@ -51,7 +51,7 @@ RSpec.describe Projects::DesignManagement::Designs::ResizedImageController, feat
it 'sets Content-Disposition as attachment' do
filename = design.filename
- expect(response.header['Content-Disposition']).to eq(%Q(attachment; filename=\"#{filename}\"; filename*=UTF-8''#{filename}))
+ expect(response.header['Content-Disposition']).to eq(%(attachment; filename=\"#{filename}\"; filename*=UTF-8''#{filename}))
end
it 'serves files with Workhorse' do
@@ -59,7 +59,7 @@ RSpec.describe Projects::DesignManagement::Designs::ResizedImageController, feat
end
it 'sets appropriate caching headers' do
- expect(response.header['Cache-Control']).to eq('private')
+ expect(response.header['Cache-Control']).to eq('max-age=0, private, must-revalidate')
expect(response.header['ETag']).to be_present
end
end
diff --git a/spec/controllers/projects/grafana_api_controller_spec.rb b/spec/controllers/projects/grafana_api_controller_spec.rb
deleted file mode 100644
index 9bc4a83030e..00000000000
--- a/spec/controllers/projects/grafana_api_controller_spec.rb
+++ /dev/null
@@ -1,268 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Projects::GrafanaApiController, feature_category: :metrics do
- let_it_be(:project) { create(:project, :public) }
- let_it_be(:reporter) { create(:user) }
- let_it_be(:guest) { create(:user) }
- let(:anonymous) { nil }
- let(:user) { reporter }
-
- before_all do
- project.add_reporter(reporter)
- project.add_guest(guest)
- end
-
- before do
- stub_feature_flags(remove_monitor_metrics: false)
- sign_in(user) if user
- end
-
- describe 'GET #proxy' do
- let(:proxy_service) { instance_double(Grafana::ProxyService) }
- let(:params) do
- {
- namespace_id: project.namespace.full_path,
- project_id: project.path,
- proxy_path: 'api/v1/query_range',
- datasource_id: '1',
- query: 'rate(relevant_metric)',
- start_time: '1570441248',
- end_time: '1570444848',
- step: '900'
- }
- end
-
- before do
- allow(Grafana::ProxyService).to receive(:new).and_return(proxy_service)
- allow(proxy_service).to receive(:execute).and_return(service_result)
- end
-
- shared_examples_for 'error response' do |http_status|
- it "returns #{http_status}" do
- get :proxy, params: params
-
- expect(response).to have_gitlab_http_status(http_status)
- expect(json_response['status']).to eq('error')
- expect(json_response['message']).to eq('error message')
- end
- end
-
- shared_examples_for 'accessible' do
- let(:service_result) { nil }
-
- it 'returns non erroneous response' do
- get :proxy, params: params
-
- # We don't care about the specific code as long it's not an error.
- expect(response).to have_gitlab_http_status(:no_content)
- end
- end
-
- shared_examples_for 'not accessible' do
- let(:service_result) { nil }
-
- it 'returns 404 Not found' do
- get :proxy, params: params
-
- expect(response).to have_gitlab_http_status(:not_found)
- expect(Grafana::ProxyService).not_to have_received(:new)
- end
- end
-
- shared_examples_for 'login required' do
- let(:service_result) { nil }
-
- it 'redirects to login page' do
- get :proxy, params: params
-
- expect(response).to redirect_to(new_user_session_path)
- expect(Grafana::ProxyService).not_to have_received(:new)
- end
- end
-
- context 'with a successful result' do
- let(:service_result) { { status: :success, body: '{}' } }
-
- it 'returns a grafana datasource response' do
- get :proxy, params: params
-
- expect(Grafana::ProxyService).to have_received(:new).with(
- project, '1', 'api/v1/query_range',
- {
- 'query' => params[:query],
- 'start' => params[:start_time],
- 'end' => params[:end_time],
- 'step' => params[:step]
- }
- )
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response).to eq({})
- end
- end
-
- context 'when the request is still unavailable' do
- let(:service_result) { nil }
-
- it 'returns 204 no content' do
- get :proxy, params: params
-
- expect(response).to have_gitlab_http_status(:no_content)
- expect(json_response['status']).to eq('processing')
- expect(json_response['message']).to eq('Not ready yet. Try again later.')
- end
- end
-
- context 'when an error has occurred' do
- context 'with an error accessing grafana' do
- let(:service_result) do
- {
- http_status: :service_unavailable,
- status: :error,
- message: 'error message'
- }
- end
-
- it_behaves_like 'error response', :service_unavailable
- end
-
- context 'with a processing error' do
- let(:service_result) do
- {
- status: :error,
- message: 'error message'
- }
- end
-
- it_behaves_like 'error response', :bad_request
- end
- end
-
- context 'as guest' do
- let(:user) { guest }
-
- it_behaves_like 'not accessible'
- end
-
- context 'as anonymous' do
- let(:user) { anonymous }
-
- it_behaves_like 'not accessible'
- end
-
- context 'on a private project' do
- let_it_be(:project) { create(:project, :private) }
-
- before_all do
- project.add_guest(guest)
- end
-
- context 'as anonymous' do
- let(:user) { anonymous }
-
- it_behaves_like 'login required'
- end
-
- context 'as guest' do
- let(:user) { guest }
-
- it_behaves_like 'accessible'
- end
- end
-
- context 'when metrics dashboard feature is unavailable' do
- before do
- stub_feature_flags(remove_monitor_metrics: true)
- end
-
- it_behaves_like 'not accessible'
- end
- end
-
- describe 'GET #metrics_dashboard' do
- let(:service_result) { { status: :success, dashboard: '{}' } }
- let(:params) do
- {
- format: :json,
- embedded: true,
- grafana_url: 'https://grafana.example.com',
- namespace_id: project.namespace.full_path,
- project_id: project.path
- }
- end
-
- before do
- allow(Gitlab::Metrics::Dashboard::Finder)
- .to receive(:find)
- .and_return(service_result)
- end
-
- context 'when the result is still processing' do
- let(:service_result) { nil }
-
- it 'returns 204 no content' do
- get :metrics_dashboard, params: params
-
- expect(response).to have_gitlab_http_status(:no_content)
- end
- end
-
- context 'when the result was successful' do
- it 'returns the dashboard response' do
- get :metrics_dashboard, params: params
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response).to include({
- 'dashboard' => '{}',
- 'status' => 'success'
- })
- expect(json_response).to include('metrics_data')
- end
- end
-
- context 'when an error has occurred' do
- shared_examples_for 'error response' do |http_status|
- it "returns #{http_status}" do
- get :metrics_dashboard, params: params
-
- expect(response).to have_gitlab_http_status(http_status)
- expect(json_response['status']).to eq('error')
- expect(json_response['message']).to eq('error message')
- end
- end
-
- context 'with an error accessing grafana' do
- let(:service_result) do
- {
- http_status: :service_unavailable,
- status: :error,
- message: 'error message'
- }
- end
-
- it_behaves_like 'error response', :service_unavailable
- end
-
- context 'with a processing error' do
- let(:service_result) { { status: :error, message: 'error message' } }
-
- it_behaves_like 'error response', :bad_request
- end
-
- context 'when metrics dashboard feature is unavailable' do
- before do
- stub_feature_flags(remove_monitor_metrics: true)
- end
-
- it 'returns 404 Not found' do
- get :metrics_dashboard, params: params
-
- expect(response).to have_gitlab_http_status(:not_found)
- expect(response.body).to be_empty
- end
- end
- end
- end
-end
diff --git a/spec/controllers/projects/incidents_controller_spec.rb b/spec/controllers/projects/incidents_controller_spec.rb
deleted file mode 100644
index 460821634b0..00000000000
--- a/spec/controllers/projects/incidents_controller_spec.rb
+++ /dev/null
@@ -1,122 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Projects::IncidentsController do
- let_it_be_with_refind(:project) { create(:project) }
- let_it_be(:developer) { create(:user) }
- let_it_be(:guest) { create(:user) }
- let_it_be(:anonymous) { nil }
-
- before_all do
- project.add_guest(guest)
- project.add_developer(developer)
- end
-
- before do
- sign_in(user) if user
- end
-
- subject { make_request }
-
- shared_examples 'not found' do
- include_examples 'returning response status', :not_found
- end
-
- shared_examples 'login required' do
- it 'redirects to the login page' do
- subject
-
- expect(response).to redirect_to(new_user_session_path)
- end
- end
-
- describe 'GET #index' do
- def make_request
- get :index, params: project_params
- end
-
- let(:user) { developer }
-
- it 'shows the page' do
- subject
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(response).to render_template(:index)
- end
-
- context 'when user is unauthorized' do
- let(:user) { anonymous }
-
- it_behaves_like 'login required'
- end
-
- context 'when user is a guest' do
- let(:user) { guest }
-
- it 'shows the page' do
- subject
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(response).to render_template(:index)
- end
- end
- end
-
- describe 'GET #show' do
- def make_request
- get :show, params: project_params(id: resource)
- end
-
- let_it_be(:resource) { create(:incident, project: project) }
-
- let(:user) { developer }
-
- it 'renders incident page' do
- subject
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(response).to render_template(:show)
-
- expect(assigns(:incident)).to be_present
- expect(assigns(:incident).author.association(:status)).to be_loaded
- expect(assigns(:issue)).to be_present
- expect(assigns(:noteable)).to eq(assigns(:incident))
- end
-
- context 'with non existing id' do
- let(:resource) { non_existing_record_id }
-
- it_behaves_like 'not found'
- end
-
- context 'for issue' do
- let_it_be(:resource) { create(:issue, project: project) }
-
- it_behaves_like 'not found'
- end
-
- context 'when user is a guest' do
- let(:user) { guest }
-
- it 'shows the page' do
- subject
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(response).to render_template(:show)
- end
- end
-
- context 'when unauthorized' do
- let(:user) { anonymous }
-
- it_behaves_like 'login required'
- end
- end
-
- private
-
- def project_params(opts = {})
- opts.reverse_merge(namespace_id: project.namespace, project_id: project)
- end
-end
diff --git a/spec/controllers/projects/issues_controller_spec.rb b/spec/controllers/projects/issues_controller_spec.rb
index 5e9135c00e3..f9ce77a44ba 100644
--- a/spec/controllers/projects/issues_controller_spec.rb
+++ b/spec/controllers/projects/issues_controller_spec.rb
@@ -1809,7 +1809,7 @@ RSpec.describe Projects::IssuesController, :request_store, feature_category: :te
create(:user_status, user: second_discussion.author)
expect { get :discussions, params: { namespace_id: project.namespace, project_id: project, id: issue.iid } }
- .not_to exceed_query_limit(control)
+ .not_to exceed_query_limit(control).with_threshold(9)
end
context 'when user is setting notes filters' do
diff --git a/spec/controllers/projects/merge_requests/drafts_controller_spec.rb b/spec/controllers/projects/merge_requests/drafts_controller_spec.rb
index c3a5255b584..68fbeb00b67 100644
--- a/spec/controllers/projects/merge_requests/drafts_controller_spec.rb
+++ b/spec/controllers/projects/merge_requests/drafts_controller_spec.rb
@@ -54,7 +54,7 @@ RSpec.describe Projects::MergeRequests::DraftsController, feature_category: :cod
end
it 'does not allow draft note creation' do
- expect { create_draft_note }.to change { DraftNote.count }.by(0)
+ expect { create_draft_note }.not_to change { DraftNote.count }
expect(response).to have_gitlab_http_status(:not_found)
end
end
@@ -172,6 +172,33 @@ RSpec.describe Projects::MergeRequests::DraftsController, feature_category: :cod
end
end
end
+
+ context 'when the draft note is invalid' do
+ let_it_be(:draft_note) { DraftNote.new }
+
+ before do
+ errors = ActiveModel::Errors.new(draft_note)
+ errors.add(:base, 'Error 1')
+ errors.add(:base, 'Error 2')
+
+ allow(draft_note).to receive(:errors).and_return(errors)
+
+ allow_next_instance_of(DraftNotes::CreateService) do |service|
+ allow(service).to receive(:execute).and_return(draft_note)
+ end
+ end
+
+ it 'does not allow draft note creation' do
+ expect { create_draft_note }.not_to change { DraftNote.count }
+ end
+
+ it "returns status 422", :aggregate_failures do
+ create_draft_note
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ expect(response.body).to eq('{"errors":"Error 1 and Error 2"}')
+ end
+ end
end
describe 'PUT #update' do
@@ -212,6 +239,30 @@ RSpec.describe Projects::MergeRequests::DraftsController, feature_category: :cod
expect(draft.note).to eq('This is an updated unpublished comment')
expect(json_response['note_html']).not_to be_empty
end
+
+ context 'when the draft note is invalid' do
+ before do
+ errors = ActiveModel::Errors.new(draft)
+ errors.add(:base, 'Error 1')
+ errors.add(:base, 'Error 2')
+
+ allow_next_found_instance_of(DraftNote) do |instance|
+ allow(instance).to receive(:update).and_return(false)
+ allow(instance).to receive(:errors).and_return(errors)
+ end
+ end
+
+ it 'does not update the draft' do
+ expect { update_draft_note }.not_to change { draft.reload.note }
+ end
+
+ it 'returns status 422', :aggregate_failures do
+ update_draft_note
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ expect(response.body).to eq('{"errors":"Error 1 and Error 2"}')
+ end
+ end
end
describe 'POST #publish' do
diff --git a/spec/controllers/projects/notes_controller_spec.rb b/spec/controllers/projects/notes_controller_spec.rb
index 4a5283f1127..940f6fed906 100644
--- a/spec/controllers/projects/notes_controller_spec.rb
+++ b/spec/controllers/projects/notes_controller_spec.rb
@@ -39,6 +39,12 @@ RSpec.describe Projects::NotesController, type: :controller, feature_category: :
specify { expect(get(:index, params: request_params)).to have_request_urgency(:medium) }
+ it 'sets the correct feature category' do
+ get :index, params: request_params
+
+ expect(::Gitlab::ApplicationContext.current_context_attribute(:feature_category)).to eq('team_planning')
+ end
+
it 'passes last_fetched_at from headers to NotesFinder and MergeIntoNotesService' do
last_fetched_at = Time.zone.at(3.hours.ago.to_i) # remove nanoseconds
@@ -149,6 +155,12 @@ RSpec.describe Projects::NotesController, type: :controller, feature_category: :
expect(note_json[:discussion_line_code]).to be_nil
end
+ it 'sets the correct feature category' do
+ get :index, params: params
+
+ expect(::Gitlab::ApplicationContext.current_context_attribute(:feature_category)).to eq('source_code_management')
+ end
+
context 'when user cannot read commit' do
before do
allow(Ability).to receive(:allowed?).and_call_original
@@ -164,7 +176,29 @@ RSpec.describe Projects::NotesController, type: :controller, feature_category: :
end
end
- context 'for a regular note' do
+ context 'for a snippet note' do
+ let(:project_snippet) { create(:project_snippet, project: project) }
+ let!(:note) { create(:note_on_project_snippet, project: project, noteable: project_snippet) }
+
+ let(:params) { request_params.merge(target_type: 'project_snippet', target_id: project_snippet.id, html: true) }
+
+ it 'responds with the expected attributes' do
+ get :index, params: params
+
+ expect(note_json[:id]).to eq(note.id)
+ expect(note_json[:discussion_html]).to be_nil
+ expect(note_json[:diff_discussion_html]).to be_nil
+ expect(note_json[:discussion_line_code]).to be_nil
+ end
+
+ it 'sets the correct feature category' do
+ get :index, params: params
+
+ expect(::Gitlab::ApplicationContext.current_context_attribute(:feature_category)).to eq('source_code_management')
+ end
+ end
+
+ context 'for a merge request note' do
let!(:note) { create(:note_on_merge_request, project: project) }
let(:params) { request_params.merge(target_type: 'merge_request', target_id: note.noteable_id, html: true) }
@@ -178,6 +212,12 @@ RSpec.describe Projects::NotesController, type: :controller, feature_category: :
expect(note_json[:diff_discussion_html]).to be_nil
expect(note_json[:discussion_line_code]).to be_nil
end
+
+ it 'sets the correct feature category' do
+ get :index, params: params
+
+ expect(::Gitlab::ApplicationContext.current_context_attribute(:feature_category)).to eq('code_review_workflow')
+ end
end
context 'with cross-reference system note', :request_store do
@@ -253,6 +293,68 @@ RSpec.describe Projects::NotesController, type: :controller, feature_category: :
create!
end
+ it 'sets the correct feature category' do
+ create!
+
+ expect(::Gitlab::ApplicationContext.current_context_attribute(:feature_category)).to eq('code_review_workflow')
+ end
+
+ context 'on an issue' do
+ let(:request_params) do
+ {
+ note: { note: note_text, noteable_id: issue.id, noteable_type: 'Issue' },
+ namespace_id: project.namespace,
+ project_id: project,
+ target_type: 'issue',
+ target_id: issue.id
+ }
+ end
+
+ it 'sets the correct feature category' do
+ create!
+
+ expect(::Gitlab::ApplicationContext.current_context_attribute(:feature_category)).to eq('team_planning')
+ end
+ end
+
+ context 'on a commit' do
+ let(:commit_id) { RepoHelpers.sample_commit.id }
+ let(:request_params) do
+ {
+ note: { note: note_text, commit_id: commit_id, noteable_type: 'Commit' },
+ namespace_id: project.namespace,
+ project_id: project,
+ target_type: 'commit',
+ target_id: commit_id
+ }
+ end
+
+ it 'sets the correct feature category' do
+ create!
+
+ expect(::Gitlab::ApplicationContext.current_context_attribute(:feature_category)).to eq('source_code_management')
+ end
+ end
+
+ context 'on a project snippet' do
+ let(:project_snippet) { create(:project_snippet, project: project) }
+ let(:request_params) do
+ {
+ note: { note: note_text, noteable_id: project_snippet.id, noteable_type: 'ProjectSnippet' },
+ namespace_id: project.namespace,
+ project_id: project,
+ target_type: 'project_snippet',
+ target_id: project_snippet.id
+ }
+ end
+
+ it 'sets the correct feature category' do
+ create!
+
+ expect(::Gitlab::ApplicationContext.current_context_attribute(:feature_category)).to eq('source_code_management')
+ end
+ end
+
context 'the project is publically available' do
context 'for HTML' do
it "returns status 302" do
diff --git a/spec/controllers/projects/pipeline_schedules_controller_spec.rb b/spec/controllers/projects/pipeline_schedules_controller_spec.rb
index 6d810fdcd51..486062fe52b 100644
--- a/spec/controllers/projects/pipeline_schedules_controller_spec.rb
+++ b/spec/controllers/projects/pipeline_schedules_controller_spec.rb
@@ -106,7 +106,8 @@ RSpec.describe Projects::PipelineSchedulesController, feature_category: :continu
end
end
- describe 'POST #create' do
+ # Move this from `shared_context` to `describe` when `ci_refactoring_pipeline_schedule_create_service` is removed.
+ shared_context 'POST #create' do # rubocop:disable RSpec/ContextWording
describe 'functionality' do
before do
project.add_developer(user)
@@ -184,6 +185,16 @@ RSpec.describe Projects::PipelineSchedulesController, feature_category: :continu
end
end
+ it_behaves_like 'POST #create'
+
+ context 'when the FF ci_refactoring_pipeline_schedule_create_service is disabled' do
+ before do
+ stub_feature_flags(ci_refactoring_pipeline_schedule_create_service: false)
+ end
+
+ it_behaves_like 'POST #create'
+ end
+
describe 'PUT #update' do
describe 'functionality' do
let!(:pipeline_schedule) { create(:ci_pipeline_schedule, project: project, owner: user) }
diff --git a/spec/controllers/projects/pipelines_controller_spec.rb b/spec/controllers/projects/pipelines_controller_spec.rb
index 8c5f8fc6259..a5542a2b825 100644
--- a/spec/controllers/projects/pipelines_controller_spec.rb
+++ b/spec/controllers/projects/pipelines_controller_spec.rb
@@ -328,7 +328,7 @@ RSpec.describe Projects::PipelinesController, feature_category: :continuous_inte
expect do
get_pipeline_html
expect(response).to have_gitlab_http_status(:ok)
- end.not_to exceed_all_query_limit(control)
+ end.not_to exceed_all_query_limit(control).with_threshold(3)
end
end
diff --git a/spec/controllers/projects/project_members_controller_spec.rb b/spec/controllers/projects/project_members_controller_spec.rb
index ad49529b426..9657cf33afd 100644
--- a/spec/controllers/projects/project_members_controller_spec.rb
+++ b/spec/controllers/projects/project_members_controller_spec.rb
@@ -320,7 +320,7 @@ RSpec.describe Projects::ProjectMembersController do
it 'returns correct json response' do
expect(json_response).to eq({
"expires_soon" => false,
- "expires_at_formatted" => expiry_date.to_time.in_time_zone.to_s(:medium)
+ "expires_at_formatted" => expiry_date.to_time.in_time_zone.to_fs(:medium)
})
end
end
diff --git a/spec/controllers/projects/runners_controller_spec.rb b/spec/controllers/projects/runners_controller_spec.rb
index e0e4d0f7bc5..d6816bd49af 100644
--- a/spec/controllers/projects/runners_controller_spec.rb
+++ b/spec/controllers/projects/runners_controller_spec.rb
@@ -28,52 +28,28 @@ RSpec.describe Projects::RunnersController, feature_category: :runner_fleet do
}
end
- context 'when create_runner_workflow_for_namespace is enabled' do
+ context 'when user is maintainer' do
before do
- stub_feature_flags(create_runner_workflow_for_namespace: [project.namespace])
+ project.add_maintainer(user)
end
- context 'when user is maintainer' do
- before do
- project.add_maintainer(user)
- end
-
- it 'renders new with 200 status code' do
- get :new, params: params
+ it 'renders new with 200 status code' do
+ get :new, params: params
- expect(response).to have_gitlab_http_status(:ok)
- expect(response).to render_template(:new)
- end
- end
-
- context 'when user is not maintainer' do
- before do
- project.add_developer(user)
- end
-
- it 'renders a 404' do
- get :new, params: params
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to render_template(:new)
end
end
- context 'when create_runner_workflow_for_namespace is disabled' do
+ context 'when user is not maintainer' do
before do
- stub_feature_flags(create_runner_workflow_for_namespace: false)
+ project.add_developer(user)
end
- context 'when user is maintainer' do
- before do
- project.add_maintainer(user)
- end
+ it 'renders a 404' do
+ get :new, params: params
- it 'renders a 404' do
- get :new, params: params
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
+ expect(response).to have_gitlab_http_status(:not_found)
end
end
end
@@ -81,66 +57,40 @@ RSpec.describe Projects::RunnersController, feature_category: :runner_fleet do
describe '#register' do
subject(:register) { get :register, params: { namespace_id: project.namespace, project_id: project, id: new_runner } }
- context 'when create_runner_workflow_for_namespace is enabled' do
+ context 'when user is maintainer' do
before do
- stub_feature_flags(create_runner_workflow_for_namespace: [project.namespace])
+ project.add_maintainer(user)
end
- context 'when user is maintainer' do
- before do
- project.add_maintainer(user)
- end
-
- context 'when runner can be registered after creation' do
- let_it_be(:new_runner) { create(:ci_runner, :project, projects: [project], registration_type: :authenticated_user) }
-
- it 'renders a :register template' do
- register
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(response).to render_template(:register)
- end
- end
-
- context 'when runner cannot be registered after creation' do
- let_it_be(:new_runner) { runner }
+ context 'when runner can be registered after creation' do
+ let_it_be(:new_runner) { create(:ci_runner, :project, projects: [project], registration_type: :authenticated_user) }
- it 'returns :not_found' do
- register
+ it 'renders a :register template' do
+ register
- expect(response).to have_gitlab_http_status(:not_found)
- end
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to render_template(:register)
end
end
- context 'when user is not maintainer' do
- before do
- project.add_developer(user)
- end
-
- context 'when runner can be registered after creation' do
- let_it_be(:new_runner) { create(:ci_runner, :project, projects: [project], registration_type: :authenticated_user) }
+ context 'when runner cannot be registered after creation' do
+ let_it_be(:new_runner) { runner }
- it 'returns :not_found' do
- register
+ it 'returns :not_found' do
+ register
- expect(response).to have_gitlab_http_status(:not_found)
- end
+ expect(response).to have_gitlab_http_status(:not_found)
end
end
end
- context 'when create_runner_workflow_for_namespace is disabled' do
- let_it_be(:new_runner) { create(:ci_runner, :project, projects: [project], registration_type: :authenticated_user) }
-
+ context 'when user is not maintainer' do
before do
- stub_feature_flags(create_runner_workflow_for_namespace: false)
+ project.add_developer(user)
end
- context 'when user is maintainer' do
- before do
- project.add_maintainer(user)
- end
+ context 'when runner can be registered after creation' do
+ let_it_be(:new_runner) { create(:ci_runner, :project, projects: [project], registration_type: :authenticated_user) }
it 'returns :not_found' do
register
diff --git a/spec/controllers/projects/service_desk_controller_spec.rb b/spec/controllers/projects/service_desk_controller_spec.rb
deleted file mode 100644
index 6b914ac8f19..00000000000
--- a/spec/controllers/projects/service_desk_controller_spec.rb
+++ /dev/null
@@ -1,112 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Projects::ServiceDeskController do
- let_it_be(:project) do
- create(:project, :private, :custom_repo,
- service_desk_enabled: true,
- files: { '.gitlab/issue_templates/service_desk.md' => 'template' })
- end
-
- let_it_be(:user) { create(:user) }
-
- before do
- allow(Gitlab::Email::IncomingEmail).to receive(:enabled?) { true }
- allow(Gitlab::Email::IncomingEmail).to receive(:supports_wildcard?) { true }
-
- project.add_maintainer(user)
- sign_in(user)
- end
-
- describe 'GET service desk properties' do
- it 'returns service_desk JSON data' do
- get :show, params: { namespace_id: project.namespace.to_param, project_id: project }, format: :json
-
- expect(json_response["service_desk_address"]).to match(/\A[^@]+@[^@]+\z/)
- expect(json_response["service_desk_enabled"]).to be_truthy
- expect(response).to have_gitlab_http_status(:ok)
- end
-
- context 'when user is not project maintainer' do
- let(:guest) { create(:user) }
-
- it 'renders 404' do
- project.add_guest(guest)
- sign_in(guest)
-
- get :show, params: { namespace_id: project.namespace.to_param, project_id: project }, format: :json
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
- context 'when issue template is present' do
- it 'returns template_file_missing as false' do
- create(:service_desk_setting, project: project, issue_template_key: 'service_desk')
-
- get :show, params: { namespace_id: project.namespace.to_param, project_id: project }, format: :json
-
- response_hash = Gitlab::Json.parse(response.body)
- expect(response_hash['template_file_missing']).to eq(false)
- end
- end
-
- context 'when issue template file becomes outdated' do
- it 'returns template_file_missing as true' do
- service = ServiceDeskSetting.new(project_id: project.id, issue_template_key: 'deleted')
- service.save!(validate: false)
-
- get :show, params: { namespace_id: project.namespace.to_param, project_id: project }, format: :json
-
- expect(json_response['template_file_missing']).to eq(true)
- end
- end
- end
-
- describe 'PUT service desk properties' do
- it 'toggles services desk incoming email' do
- project.update!(service_desk_enabled: false)
-
- put :update, params: { namespace_id: project.namespace.to_param,
- project_id: project,
- service_desk_enabled: true }, format: :json
-
- expect(json_response["service_desk_address"]).to be_present
- expect(json_response["service_desk_enabled"]).to be_truthy
- expect(response).to have_gitlab_http_status(:ok)
- end
-
- it 'sets issue_template_key' do
- put :update, params: { namespace_id: project.namespace.to_param,
- project_id: project,
- issue_template_key: 'service_desk' }, format: :json
-
- settings = project.service_desk_setting
- expect(settings).to be_present
- expect(settings.issue_template_key).to eq('service_desk')
- expect(json_response['template_file_missing']).to eq(false)
- expect(json_response['issue_template_key']).to eq('service_desk')
- end
-
- it 'returns an error when update of service desk settings fails' do
- put :update, params: { namespace_id: project.namespace.to_param,
- project_id: project,
- issue_template_key: 'invalid key' }, format: :json
-
- expect(response).to have_gitlab_http_status(:unprocessable_entity)
- expect(json_response['message']).to eq('Issue template key is empty or does not exist')
- end
-
- context 'when user cannot admin the project' do
- let(:other_user) { create(:user) }
-
- it 'renders 404' do
- sign_in(other_user)
- put :update, params: { namespace_id: project.namespace.to_param, project_id: project, service_desk_enabled: true }, format: :json
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
- end
-end
diff --git a/spec/controllers/projects/settings/ci_cd_controller_spec.rb b/spec/controllers/projects/settings/ci_cd_controller_spec.rb
index 1c332eadc42..a1dbd27f49a 100644
--- a/spec/controllers/projects/settings/ci_cd_controller_spec.rb
+++ b/spec/controllers/projects/settings/ci_cd_controller_spec.rb
@@ -65,9 +65,8 @@ RSpec.describe Projects::Settings::CiCdController, feature_category: :continuous
end
context 'with group runners' do
- let_it_be(:group) { create :group }
- let_it_be(:project) { create :project, group: group }
- let_it_be(:group_runner) { create(:ci_runner, :group, groups: [group]) }
+ let(:project) { other_project }
+ let!(:group_runner) { create(:ci_runner, :group, groups: [group]) }
it 'sets group runners' do
subject
diff --git a/spec/controllers/projects/tree_controller_spec.rb b/spec/controllers/projects/tree_controller_spec.rb
index 61998d516e8..ffec670e97d 100644
--- a/spec/controllers/projects/tree_controller_spec.rb
+++ b/spec/controllers/projects/tree_controller_spec.rb
@@ -3,9 +3,9 @@
require 'spec_helper'
RSpec.describe Projects::TreeController, feature_category: :source_code_management do
- let(:project) { create(:project, :repository, previous_default_branch: previous_default_branch) }
- let(:previous_default_branch) { nil }
+ let_it_be(:project) { create(:project, :repository) }
let(:user) { create(:user) }
+ let(:redirect_with_ref_type) { true }
before do
sign_in(user)
@@ -17,10 +17,14 @@ RSpec.describe Projects::TreeController, feature_category: :source_code_manageme
describe "GET show" do
let(:params) do
{
- namespace_id: project.namespace.to_param, project_id: project, id: id
+ namespace_id: project.namespace.to_param, project_id: project, id: id, ref_type: ref_type
}
end
+ let(:request) { get :show, params: params }
+
+ let(:ref_type) { nil }
+
# Make sure any errors accessing the tree in our views bubble up to this spec
render_views
@@ -28,26 +32,79 @@ RSpec.describe Projects::TreeController, feature_category: :source_code_manageme
expect(::Gitlab::GitalyClient).to receive(:allow_ref_name_caching).and_call_original
project.repository.add_tag(project.creator, 'ambiguous_ref', RepoHelpers.sample_commit.id)
project.repository.add_branch(project.creator, 'ambiguous_ref', RepoHelpers.another_sample_commit.id)
- get :show, params: params
+
+ stub_feature_flags(redirect_with_ref_type: redirect_with_ref_type)
+ end
+
+ after do
+ project.repository.rm_tag(project.creator, 'ambiguous_ref')
+ project.repository.rm_branch(project.creator, 'ambiguous_ref')
end
- context 'when the ref is ambiguous' do
- let(:id) { 'ambiguous_ref' }
- let(:params) { { namespace_id: project.namespace, project_id: project, id: id, ref_type: ref_type } }
+ context 'when the redirect_with_ref_type flag is disabled' do
+ let(:redirect_with_ref_type) { false }
- context 'and explicitly requesting a branch' do
- let(:ref_type) { 'heads' }
+ context 'when there is a ref and tag with the same name' do
+ let(:id) { 'ambiguous_ref' }
+ let(:params) { { namespace_id: project.namespace, project_id: project, id: id, ref_type: ref_type } }
- it 'redirects to blob#show with sha for the branch' do
- expect(response).to redirect_to(project_tree_path(project, RepoHelpers.another_sample_commit.id))
+ context 'and explicitly requesting a branch' do
+ let(:ref_type) { 'heads' }
+
+ it 'redirects to blob#show with sha for the branch' do
+ request
+ expect(response).to redirect_to(project_tree_path(project, RepoHelpers.another_sample_commit.id))
+ end
+ end
+
+ context 'and explicitly requesting a tag' do
+ let(:ref_type) { 'tags' }
+
+ it 'responds with success' do
+ request
+ expect(response).to be_ok
+ end
end
end
+ end
- context 'and explicitly requesting a tag' do
- let(:ref_type) { 'tags' }
+ describe 'delegating to ExtractsRef::RequestedRef' do
+ context 'when there is a ref and tag with the same name' do
+ let(:id) { 'ambiguous_ref' }
+ let(:params) { { namespace_id: project.namespace, project_id: project, id: id, ref_type: ref_type } }
- it 'responds with success' do
- expect(response).to be_ok
+ let(:requested_ref_double) { ExtractsRef::RequestedRef.new(project.repository, ref_type: ref_type, ref: id) }
+
+ before do
+ allow(ExtractsRef::RequestedRef).to receive(:new).with(kind_of(Repository), ref_type: ref_type, ref: id).and_return(requested_ref_double)
+ end
+
+ context 'and not specifying a ref_type' do
+ it 'finds the tags and redirects' do
+ expect(requested_ref_double).to receive(:find).and_call_original
+ request
+ expect(subject).to redirect_to("/#{project.full_path}/-/tree/#{id}/?ref_type=tags")
+ end
+ end
+
+ context 'and explicitly requesting a branch' do
+ let(:ref_type) { 'heads' }
+
+ it 'finds the branch' do
+ expect(requested_ref_double).not_to receive(:find)
+ request
+ expect(response).to be_ok
+ end
+ end
+
+ context 'and explicitly requesting a tag' do
+ let(:ref_type) { 'tags' }
+
+ it 'finds the tag' do
+ expect(requested_ref_double).not_to receive(:find)
+ request
+ expect(response).to be_ok
+ end
end
end
end
@@ -55,19 +112,26 @@ RSpec.describe Projects::TreeController, feature_category: :source_code_manageme
context "valid branch, no path" do
let(:id) { 'master' }
- it { is_expected.to respond_with(:success) }
+ it 'responds with success' do
+ request
+ expect(response).to be_ok
+ end
end
context "valid branch, valid path" do
let(:id) { 'master/encoding/' }
- it { is_expected.to respond_with(:success) }
+ it 'responds with success' do
+ request
+ expect(response).to be_ok
+ end
end
context "valid branch, invalid path" do
let(:id) { 'master/invalid-path/' }
it 'redirects' do
+ request
expect(subject)
.to redirect_to("/#{project.full_path}/-/tree/master")
end
@@ -76,54 +140,91 @@ RSpec.describe Projects::TreeController, feature_category: :source_code_manageme
context "invalid branch, valid path" do
let(:id) { 'invalid-branch/encoding/' }
- it { is_expected.to respond_with(:not_found) }
+ it 'responds with not_found' do
+ request
+ expect(subject).to respond_with(:not_found)
+ end
end
- context "renamed default branch, valid file" do
- let(:id) { 'old-default-branch/encoding/' }
- let(:previous_default_branch) { 'old-default-branch' }
+ context 'when default branch was renamed' do
+ let_it_be_with_reload(:project) { create(:project, :repository, previous_default_branch: 'old-default-branch') }
- it { is_expected.to redirect_to("/#{project.full_path}/-/tree/#{project.default_branch}/encoding/") }
- end
+ context "and the file is valid" do
+ let(:id) { 'old-default-branch/encoding/' }
+
+ it 'redirects' do
+ request
+ expect(subject).to redirect_to("/#{project.full_path}/-/tree/#{project.default_branch}/encoding/")
+ end
+ end
- context "renamed default branch, invalid file" do
- let(:id) { 'old-default-branch/invalid-path/' }
- let(:previous_default_branch) { 'old-default-branch' }
+ context "and the file is invalid" do
+ let(:id) { 'old-default-branch/invalid-path/' }
- it { is_expected.to redirect_to("/#{project.full_path}/-/tree/#{project.default_branch}/invalid-path/") }
+ it 'redirects' do
+ request
+ expect(subject).to redirect_to("/#{project.full_path}/-/tree/#{project.default_branch}/invalid-path/")
+ end
+ end
end
context "valid empty branch, invalid path" do
let(:id) { 'empty-branch/invalid-path/' }
it 'redirects' do
- expect(subject)
- .to redirect_to("/#{project.full_path}/-/tree/empty-branch")
+ request
+ expect(subject).to redirect_to("/#{project.full_path}/-/tree/empty-branch")
end
end
context "valid empty branch" do
let(:id) { 'empty-branch' }
- it { is_expected.to respond_with(:success) }
+ it 'responds with success' do
+ request
+ expect(response).to be_ok
+ end
end
context "invalid SHA commit ID" do
let(:id) { 'ff39438/.gitignore' }
- it { is_expected.to respond_with(:not_found) }
+ it 'responds with not_found' do
+ request
+ expect(subject).to respond_with(:not_found)
+ end
end
context "valid SHA commit ID" do
let(:id) { '6d39438' }
- it { is_expected.to respond_with(:success) }
+ it 'responds with success' do
+ request
+ expect(response).to be_ok
+ end
+
+ context 'and there is a tag with the same name' do
+ before do
+ project.repository.add_tag(project.creator, id, RepoHelpers.sample_commit.id)
+ end
+
+ it 'responds with success' do
+ request
+
+ # This uses the tag
+ # TODO: Should we redirect in this case?
+ expect(response).to be_ok
+ end
+ end
end
context "valid SHA commit ID with path" do
let(:id) { '6d39438/.gitignore' }
- it { expect(response).to have_gitlab_http_status(:found) }
+ it 'responds with found' do
+ request
+ expect(response).to have_gitlab_http_status(:found)
+ end
end
end
@@ -149,7 +250,7 @@ RSpec.describe Projects::TreeController, feature_category: :source_code_manageme
before do
get :show, params: {
- namespace_id: project.namespace.to_param, project_id: project, id: id
+ namespace_id: project.namespace.to_param, project_id: project, id: id, ref_type: 'heads'
}
end
@@ -157,7 +258,7 @@ RSpec.describe Projects::TreeController, feature_category: :source_code_manageme
let(:id) { 'master/README.md' }
it 'redirects' do
- redirect_url = "/#{project.full_path}/-/blob/master/README.md"
+ redirect_url = "/#{project.full_path}/-/blob/master/README.md?ref_type=heads"
expect(subject).to redirect_to(redirect_url)
end
end
diff --git a/spec/controllers/projects_controller_spec.rb b/spec/controllers/projects_controller_spec.rb
index 6adddccfda7..46913cfa649 100644
--- a/spec/controllers/projects_controller_spec.rb
+++ b/spec/controllers/projects_controller_spec.rb
@@ -164,107 +164,113 @@ RSpec.describe ProjectsController, feature_category: :groups_and_projects do
end
end
- context 'when there is a tag with the same name as the default branch' do
- let_it_be(:tagged_project) { create(:project, :public, :custom_repo, files: ['somefile']) }
- let(:tree_with_default_branch) do
- branch = tagged_project.repository.find_branch(tagged_project.default_branch)
- project_tree_path(tagged_project, branch.target)
- end
-
+ context 'when redirect_with_ref_type is disabled' do
before do
- tagged_project.repository.create_file(
- tagged_project.creator,
- 'file_for_tag',
- 'content for file',
- message: "Automatically created file",
- branch_name: 'branch-to-tag'
- )
-
- tagged_project.repository.add_tag(
- tagged_project.creator,
- tagged_project.default_branch, # tag name
- 'branch-to-tag' # target
- )
- end
-
- it 'redirects to tree view for the default branch' do
- get :show, params: { namespace_id: tagged_project.namespace, id: tagged_project }
- expect(response).to redirect_to(tree_with_default_branch)
- end
- end
-
- context 'when the default branch name is ambiguous' do
- let_it_be(:project_with_default_branch) do
- create(:project, :public, :custom_repo, files: ['somefile'])
+ stub_feature_flags(redirect_with_ref_type: false)
end
- shared_examples 'ambiguous ref redirects' do
- let(:project) { project_with_default_branch }
- let(:branch_ref) { "refs/heads/#{ref}" }
- let(:repo) { project.repository }
+ context 'when there is a tag with the same name as the default branch' do
+ let_it_be(:tagged_project) { create(:project, :public, :custom_repo, files: ['somefile']) }
+ let(:tree_with_default_branch) do
+ branch = tagged_project.repository.find_branch(tagged_project.default_branch)
+ project_tree_path(tagged_project, branch.target)
+ end
before do
- repo.create_branch(branch_ref, 'master')
- repo.change_head(ref)
+ tagged_project.repository.create_file(
+ tagged_project.creator,
+ 'file_for_tag',
+ 'content for file',
+ message: "Automatically created file",
+ branch_name: 'branch-to-tag'
+ )
+
+ tagged_project.repository.add_tag(
+ tagged_project.creator,
+ tagged_project.default_branch, # tag name
+ 'branch-to-tag' # target
+ )
end
- after do
- repo.change_head('master')
- repo.delete_branch(branch_ref)
+ it 'redirects to tree view for the default branch' do
+ get :show, params: { namespace_id: tagged_project.namespace, id: tagged_project }
+ expect(response).to redirect_to(tree_with_default_branch)
end
+ end
- subject do
- get(
- :show,
- params: {
- namespace_id: project.namespace,
- id: project
- }
- )
+ context 'when the default branch name is ambiguous' do
+ let_it_be(:project_with_default_branch) do
+ create(:project, :public, :custom_repo, files: ['somefile'])
end
- context 'when there is no conflicting ref' do
- let(:other_ref) { 'non-existent-ref' }
+ shared_examples 'ambiguous ref redirects' do
+ let(:project) { project_with_default_branch }
+ let(:branch_ref) { "refs/heads/#{ref}" }
+ let(:repo) { project.repository }
- it { is_expected.to have_gitlab_http_status(:ok) }
- end
+ before do
+ repo.create_branch(branch_ref, 'master')
+ repo.change_head(ref)
+ end
+
+ after do
+ repo.change_head('master')
+ repo.delete_branch(branch_ref)
+ end
- context 'and that other ref exists' do
- let(:other_ref) { 'master' }
+ subject do
+ get(
+ :show,
+ params: {
+ namespace_id: project.namespace,
+ id: project
+ }
+ )
+ end
+
+ context 'when there is no conflicting ref' do
+ let(:other_ref) { 'non-existent-ref' }
- let(:project_default_root_tree_path) do
- sha = repo.find_branch(project.default_branch).target
- project_tree_path(project, sha)
+ it { is_expected.to have_gitlab_http_status(:ok) }
end
- it 'redirects to tree view for the default branch' do
- is_expected.to redirect_to(project_default_root_tree_path)
+ context 'and that other ref exists' do
+ let(:other_ref) { 'master' }
+
+ let(:project_default_root_tree_path) do
+ sha = repo.find_branch(project.default_branch).target
+ project_tree_path(project, sha)
+ end
+
+ it 'redirects to tree view for the default branch' do
+ is_expected.to redirect_to(project_default_root_tree_path)
+ end
end
end
- end
- context 'when ref starts with ref/heads/' do
- let(:ref) { "refs/heads/#{other_ref}" }
+ context 'when ref starts with ref/heads/' do
+ let(:ref) { "refs/heads/#{other_ref}" }
- include_examples 'ambiguous ref redirects'
- end
+ include_examples 'ambiguous ref redirects'
+ end
- context 'when ref starts with ref/tags/' do
- let(:ref) { "refs/tags/#{other_ref}" }
+ context 'when ref starts with ref/tags/' do
+ let(:ref) { "refs/tags/#{other_ref}" }
- include_examples 'ambiguous ref redirects'
- end
+ include_examples 'ambiguous ref redirects'
+ end
- context 'when ref starts with heads/' do
- let(:ref) { "heads/#{other_ref}" }
+ context 'when ref starts with heads/' do
+ let(:ref) { "heads/#{other_ref}" }
- include_examples 'ambiguous ref redirects'
- end
+ include_examples 'ambiguous ref redirects'
+ end
- context 'when ref starts with tags/' do
- let(:ref) { "tags/#{other_ref}" }
+ context 'when ref starts with tags/' do
+ let(:ref) { "tags/#{other_ref}" }
- include_examples 'ambiguous ref redirects'
+ include_examples 'ambiguous ref redirects'
+ end
end
end
end
diff --git a/spec/controllers/registrations/welcome_controller_spec.rb b/spec/controllers/registrations/welcome_controller_spec.rb
index 4118754144c..5a3feefc1ba 100644
--- a/spec/controllers/registrations/welcome_controller_spec.rb
+++ b/spec/controllers/registrations/welcome_controller_spec.rb
@@ -117,7 +117,7 @@ RSpec.describe Registrations::WelcomeController, feature_category: :system_acces
end
context 'when the new user already has more than 1 accepted group membership' do
- it 'redirects to the most recent membership group activty page' do
+ it 'redirects to the most recent membership group activity page' do
member2 = create(:group_member, user: user)
expect(subject).to redirect_to(activity_group_path(member2.source))
diff --git a/spec/controllers/repositories/git_http_controller_spec.rb b/spec/controllers/repositories/git_http_controller_spec.rb
index 276bd9b65b9..88af7d1fe45 100644
--- a/spec/controllers/repositories/git_http_controller_spec.rb
+++ b/spec/controllers/repositories/git_http_controller_spec.rb
@@ -79,7 +79,7 @@ RSpec.describe Repositories::GitHttpController, feature_category: :source_code_m
end
context 'when repository container is a project' do
- it_behaves_like Repositories::GitHttpController do
+ it_behaves_like described_class do
let(:container) { project }
let(:user) { project.first_owner }
let(:access_checker_class) { Gitlab::GitAccess }
@@ -133,7 +133,7 @@ RSpec.describe Repositories::GitHttpController, feature_category: :source_code_m
end
context 'when the user is a deploy token' do
- it_behaves_like Repositories::GitHttpController do
+ it_behaves_like described_class do
let(:container) { project }
let(:user) { create(:deploy_token, :project, projects: [project]) }
let(:access_checker_class) { Gitlab::GitAccess }
@@ -144,7 +144,7 @@ RSpec.describe Repositories::GitHttpController, feature_category: :source_code_m
end
context 'when repository container is a project wiki' do
- it_behaves_like Repositories::GitHttpController do
+ it_behaves_like described_class do
let(:container) { create(:project_wiki, :empty_repo, project: project) }
let(:user) { project.first_owner }
let(:access_checker_class) { Gitlab::GitAccessWiki }
@@ -155,7 +155,7 @@ RSpec.describe Repositories::GitHttpController, feature_category: :source_code_m
end
context 'when repository container is a personal snippet' do
- it_behaves_like Repositories::GitHttpController do
+ it_behaves_like described_class do
let(:container) { personal_snippet }
let(:user) { personal_snippet.author }
let(:access_checker_class) { Gitlab::GitAccessSnippet }
@@ -167,7 +167,7 @@ RSpec.describe Repositories::GitHttpController, feature_category: :source_code_m
end
context 'when repository container is a project snippet' do
- it_behaves_like Repositories::GitHttpController do
+ it_behaves_like described_class do
let(:container) { project_snippet }
let(:user) { project_snippet.author }
let(:access_checker_class) { Gitlab::GitAccessSnippet }
diff --git a/spec/db/schema_spec.rb b/spec/db/schema_spec.rb
index 4ec6d3ad4f5..c22292cb82c 100644
--- a/spec/db/schema_spec.rb
+++ b/spec/db/schema_spec.rb
@@ -124,7 +124,7 @@ RSpec.describe 'Database schema', feature_category: :database do
}.with_indifferent_access.freeze
context 'for table' do
- Gitlab::Database::EachDatabase.each_database_connection do |connection, _|
+ Gitlab::Database::EachDatabase.each_connection do |connection, _|
schemas_for_connection = Gitlab::Database.gitlab_schemas_for_connection(connection)
(connection.tables - TABLE_PARTITIONS).sort.each do |table|
table_schema = Gitlab::Database::GitlabSchema.table_schema(table)
@@ -244,6 +244,7 @@ RSpec.describe 'Database schema', feature_category: :database do
"GeoNodeStatus" => %w[status],
"Operations::FeatureFlagScope" => %w[strategies],
"Operations::FeatureFlags::Strategy" => %w[parameters],
+ "Organizations::OrganizationSetting" => %w[settings], # Custom validations
"Packages::Composer::Metadatum" => %w[composer_json],
"RawUsageData" => %w[payload], # Usage data payload changes often, we cannot use one schema
"Releases::Evidence" => %w[summary],
@@ -299,7 +300,7 @@ RSpec.describe 'Database schema', feature_category: :database do
context 'primary keys' do
it 'expects every table to have a primary key defined' do
- Gitlab::Database::EachDatabase.each_database_connection do |connection, _|
+ Gitlab::Database::EachDatabase.each_connection do |connection, _|
schemas_for_connection = Gitlab::Database.gitlab_schemas_for_connection(connection)
problematic_tables = connection.tables.select do |table|
diff --git a/spec/deprecation_warnings.rb b/spec/deprecation_warnings.rb
index 45fed5fecca..abdd13ee8e7 100644
--- a/spec/deprecation_warnings.rb
+++ b/spec/deprecation_warnings.rb
@@ -1,6 +1,6 @@
# frozen_string_literal: true
-require_relative '../lib/gitlab/utils'
+require 'gitlab/utils/all'
return if Gitlab::Utils.to_boolean(ENV['SILENCE_DEPRECATIONS'], default: false)
# Enable deprecation warnings by default and make them more visible
diff --git a/spec/experiments/application_experiment_spec.rb b/spec/experiments/application_experiment_spec.rb
index ef8f8cbce3b..461a6390a33 100644
--- a/spec/experiments/application_experiment_spec.rb
+++ b/spec/experiments/application_experiment_spec.rb
@@ -36,7 +36,7 @@ RSpec.describe ApplicationExperiment, :experiment, feature_category: :experiment
# _published_experiments.html.haml partial.
application_experiment.publish
- expect(ApplicationExperiment.published_experiments['namespaced/stub']).to include(
+ expect(described_class.published_experiments['namespaced/stub']).to include(
experiment: 'namespaced/stub',
excluded: false,
key: anything,
diff --git a/spec/experiments/concerns/project_commit_count_spec.rb b/spec/experiments/concerns/project_commit_count_spec.rb
deleted file mode 100644
index f5969ad6241..00000000000
--- a/spec/experiments/concerns/project_commit_count_spec.rb
+++ /dev/null
@@ -1,41 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe ProjectCommitCount do
- let(:klass) { Class.include(ProjectCommitCount) }
- let(:instance) { klass.new }
-
- describe '#commit_count_for' do
- subject { instance.commit_count_for(project, default_count: 42, caller_info: :identifiable) }
-
- let(:project) { create(:project, :repository) }
-
- context 'when a root_ref exists' do
- it 'returns commit count from GitlayClient' 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_return(double(count: 4))
-
- expect(subject).to eq(4)
- end
- end
-
- context 'when a root_ref does not exist' do
- let(:project) { create(:project, :empty_repo) }
-
- it 'returns the default_count' do
- expect(subject).to eq(42)
- end
- end
-
- it "handles exceptions by logging them with exception_details and returns the default_count" 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(subject).to eq(42)
- end
- end
-end
diff --git a/spec/experiments/force_company_trial_experiment_spec.rb b/spec/experiments/force_company_trial_experiment_spec.rb
deleted file mode 100644
index 42a3245771a..00000000000
--- a/spec/experiments/force_company_trial_experiment_spec.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe ForceCompanyTrialExperiment, :experiment do
- subject { described_class.new(current_user: user) }
-
- let(:user) { create(:user, setup_for_company: setup_for_company) }
- let(:setup_for_company) { true }
-
- context 'when a user is setup_for_company' do
- it 'is not excluded' do
- expect(subject).not_to exclude(user: user)
- end
- end
-
- context 'when a user is not setup_for_company' do
- let(:setup_for_company) { nil }
-
- it 'is excluded' do
- expect(subject).to exclude(user: user)
- end
- end
-end
diff --git a/spec/factories/ai/service_access_tokens.rb b/spec/factories/ai/service_access_tokens.rb
new file mode 100644
index 00000000000..61abf4e1144
--- /dev/null
+++ b/spec/factories/ai/service_access_tokens.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :service_access_token, class: 'Ai::ServiceAccessToken' do
+ token { SecureRandom.alphanumeric(10) }
+ expires_at { Time.current + 1.day }
+ category { :code_suggestions }
+
+ trait :active do
+ expires_at { Time.current + 1.day }
+ end
+
+ trait :expired do
+ expires_at { Time.current - 1.day }
+ end
+
+ trait :code_suggestions do
+ category { :code_suggestions }
+ end
+ end
+end
diff --git a/spec/factories/alert_management/http_integrations.rb b/spec/factories/alert_management/http_integrations.rb
index 43cf8b3c6db..1a46215de47 100644
--- a/spec/factories/alert_management/http_integrations.rb
+++ b/spec/factories/alert_management/http_integrations.rb
@@ -19,12 +19,12 @@ FactoryBot.define do
endpoint_identifier { 'legacy' }
end
- trait :prometheus do
- type_identifier { :prometheus }
- end
-
initialize_with { new(**attributes) }
- factory :alert_management_prometheus_integration, traits: [:prometheus]
+ factory :alert_management_prometheus_integration, traits: [:prometheus] do
+ trait :legacy do
+ endpoint_identifier { 'legacy-prometheus' }
+ end
+ end
end
end
diff --git a/spec/factories/audit_events.rb b/spec/factories/audit_events.rb
index 10f60591922..ceb7516441f 100644
--- a/spec/factories/audit_events.rb
+++ b/spec/factories/audit_events.rb
@@ -88,6 +88,29 @@ FactoryBot.define do
end
end
+ trait :instance_event do
+ transient { instance_scope { Gitlab::Audit::InstanceScope.new } }
+
+ entity_type { Gitlab::Audit::InstanceScope.name }
+ entity_id { instance_scope.id }
+ entity_path { instance_scope.full_path }
+ target_details { instance_scope.name }
+ ip_address { IPAddr.new '127.0.0.1' }
+ details do
+ {
+ change: 'project_creation_level',
+ from: nil,
+ to: 'Developers + Maintainers',
+ author_name: user.name,
+ target_id: instance_scope.id,
+ target_type: Gitlab::Audit::InstanceScope.name,
+ target_details: instance_scope.name,
+ ip_address: '127.0.0.1',
+ entity_path: instance_scope.full_path
+ }
+ end
+ end
+
factory :project_audit_event, traits: [:project_event]
factory :group_audit_event, traits: [:group_event]
end
diff --git a/spec/factories/boards.rb b/spec/factories/boards.rb
index 9ea8f3ad06f..92eb67c02b4 100644
--- a/spec/factories/boards.rb
+++ b/spec/factories/boards.rb
@@ -28,6 +28,7 @@ FactoryBot.define do
end
after(:create) do |board|
+ board.lists.create!(list_type: :backlog)
board.lists.create!(list_type: :closed)
end
end
diff --git a/spec/factories/bulk_import/trackers.rb b/spec/factories/bulk_import/trackers.rb
index 3e69ab26801..3d5d88954ed 100644
--- a/spec/factories/bulk_import/trackers.rb
+++ b/spec/factories/bulk_import/trackers.rb
@@ -24,5 +24,13 @@ FactoryBot.define do
trait :skipped do
status { -2 }
end
+
+ trait :batched do
+ batched { true }
+ end
+
+ trait :stale do
+ created_at { 1.day.ago }
+ end
end
end
diff --git a/spec/factories/ci/external_pull_requests.rb b/spec/factories/ci/external_pull_requests.rb
new file mode 100644
index 00000000000..9a16e400101
--- /dev/null
+++ b/spec/factories/ci/external_pull_requests.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :external_pull_request, class: 'Ci::ExternalPullRequest' do
+ sequence(:pull_request_iid)
+ project
+ source_branch { 'feature' }
+ source_repository { 'the-repository' }
+ source_sha { '97de212e80737a608d939f648d959671fb0a0142' }
+ target_branch { 'master' }
+ target_repository { 'the-repository' }
+ target_sha { 'a09386439ca39abe575675ffd4b89ae824fec22f' }
+ status { :open }
+
+ trait(:closed) { status { 'closed' } }
+ end
+end
diff --git a/spec/factories/ci/pipelines.rb b/spec/factories/ci/pipelines.rb
index 2b6bddd2f6d..ef65cb3ec33 100644
--- a/spec/factories/ci/pipelines.rb
+++ b/spec/factories/ci/pipelines.rb
@@ -95,6 +95,10 @@ FactoryBot.define do
status { :failed }
end
+ trait :skipped do
+ status { :skipped }
+ end
+
trait :unlocked do
locked { Ci::Pipeline.lockeds[:unlocked] }
end
diff --git a/spec/factories/events.rb b/spec/factories/events.rb
index 0f564afe822..2a09c385d66 100644
--- a/spec/factories/events.rb
+++ b/spec/factories/events.rb
@@ -55,7 +55,7 @@ FactoryBot.define do
end
trait :for_issue do
- target { association(:issue, issue_type: :issue) }
+ target { association(:issue) }
target_type { 'Issue' }
end
diff --git a/spec/factories/external_pull_requests.rb b/spec/factories/external_pull_requests.rb
deleted file mode 100644
index 470814f4360..00000000000
--- a/spec/factories/external_pull_requests.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-FactoryBot.define do
- factory :external_pull_request do
- sequence(:pull_request_iid)
- project
- source_branch { 'feature' }
- source_repository { 'the-repository' }
- source_sha { '97de212e80737a608d939f648d959671fb0a0142' }
- target_branch { 'master' }
- target_repository { 'the-repository' }
- target_sha { 'a09386439ca39abe575675ffd4b89ae824fec22f' }
- status { :open }
-
- trait(:closed) { status { 'closed' } }
- end
-end
diff --git a/spec/factories/integrations.rb b/spec/factories/integrations.rb
index a927f0fb501..a89edc19cc7 100644
--- a/spec/factories/integrations.rb
+++ b/spec/factories/integrations.rb
@@ -90,10 +90,19 @@ FactoryBot.define do
end
end
+ factory :bamboo_integration, class: 'Integrations::Bamboo' do
+ project
+ active { true }
+ bamboo_url { 'https://bamboo.example.com' }
+ build_key { 'foo' }
+ username { 'mic' }
+ password { 'password' }
+ end
+
factory :drone_ci_integration, class: 'Integrations::DroneCi' do
project
active { true }
- drone_url { 'https://bamboo.example.com' }
+ drone_url { 'https://drone.example.com' }
token { 'test' }
end
@@ -127,6 +136,8 @@ FactoryBot.define do
jira_auth_type: evaluator.jira_auth_type,
jira_issue_transition_automatic: evaluator.jira_issue_transition_automatic,
jira_issue_transition_id: evaluator.jira_issue_transition_id,
+ jira_issue_prefix: evaluator.jira_issue_prefix,
+ jira_issue_regex: evaluator.jira_issue_regex,
username: evaluator.username, password: evaluator.password, issues_enabled: evaluator.issues_enabled,
project_key: evaluator.project_key, vulnerabilities_enabled: evaluator.vulnerabilities_enabled,
vulnerabilities_issuetype: evaluator.vulnerabilities_issuetype, deployment_type: evaluator.deployment_type
diff --git a/spec/factories/issues.rb b/spec/factories/issues.rb
index 67824a10288..062e5294e4f 100644
--- a/spec/factories/issues.rb
+++ b/spec/factories/issues.rb
@@ -8,7 +8,6 @@ FactoryBot.define do
author { project.creator }
updated_by { author }
relative_position { RelativePositioning::START_POSITION }
- issue_type { :issue }
association :work_item_type, :default
trait :confidential do
@@ -66,38 +65,35 @@ FactoryBot.define do
end
end
+ trait :issue do
+ association :work_item_type, :default, :issue
+ end
+
trait :requirement do
- issue_type { :requirement }
association :work_item_type, :default, :requirement
end
trait :task do
- issue_type { :task }
association :work_item_type, :default, :task
end
trait :objective do
- issue_type { :objective }
association :work_item_type, :default, :objective
end
trait :key_result do
- issue_type { :key_result }
association :work_item_type, :default, :key_result
end
trait :incident do
- issue_type { :incident }
association :work_item_type, :default, :incident
end
trait :test_case do
- issue_type { :test_case }
association :work_item_type, :default, :test_case
end
factory :incident do
- issue_type { :incident }
association :work_item_type, :default, :incident
# An escalation status record is created for all incidents
diff --git a/spec/factories/ml/model_versions.rb b/spec/factories/ml/model_versions.rb
new file mode 100644
index 00000000000..5ae0446b78d
--- /dev/null
+++ b/spec/factories/ml/model_versions.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :ml_model_versions, class: '::Ml::ModelVersion' do
+ sequence(:version) { |n| "version#{n}" }
+
+ model { association :ml_models }
+ project { model.project }
+
+ trait :with_package do
+ package do
+ association :ml_model_package, name: model.name, version: version, project_id: project.id
+ end
+ end
+ end
+end
diff --git a/spec/factories/ml/models.rb b/spec/factories/ml/models.rb
new file mode 100644
index 00000000000..2d1b29289a5
--- /dev/null
+++ b/spec/factories/ml/models.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :ml_models, class: '::Ml::Model' do
+ sequence(:name) { |n| "model#{n}" }
+
+ project
+ default_experiment { association :ml_experiments, project_id: project.id, name: name }
+ end
+end
diff --git a/spec/factories/organizations/organization_settings.rb b/spec/factories/organizations/organization_settings.rb
new file mode 100644
index 00000000000..ad4715ee653
--- /dev/null
+++ b/spec/factories/organizations/organization_settings.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :organization_setting, class: 'Organizations::OrganizationSetting' do
+ organization { association(:organization) }
+ end
+end
diff --git a/spec/factories/organizations/organization_users.rb b/spec/factories/organizations/organization_users.rb
new file mode 100644
index 00000000000..761f260ccb3
--- /dev/null
+++ b/spec/factories/organizations/organization_users.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :organization_user, class: 'Organizations::OrganizationUser' do
+ user
+ organization
+ end
+end
diff --git a/spec/factories/packages/packages.rb b/spec/factories/packages/packages.rb
index 75f540fabbe..132152bf028 100644
--- a/spec/factories/packages/packages.rb
+++ b/spec/factories/packages/packages.rb
@@ -303,7 +303,7 @@ FactoryBot.define do
factory :ml_model_package do
sequence(:name) { |n| "mlmodel-package-#{n}" }
- version { '1.0.0' }
+ sequence(:version) { |n| "v1.0.#{n}" }
package_type { :ml_model }
end
end
diff --git a/spec/factories/project_authorizations.rb b/spec/factories/project_authorizations.rb
index ffdf5576f84..1726da55c99 100644
--- a/spec/factories/project_authorizations.rb
+++ b/spec/factories/project_authorizations.rb
@@ -6,4 +6,8 @@ FactoryBot.define do
project
access_level { Gitlab::Access::REPORTER }
end
+
+ trait :owner do
+ access_level { Gitlab::Access::OWNER }
+ end
end
diff --git a/spec/factories/project_hooks.rb b/spec/factories/project_hooks.rb
index 3e70b897df6..34797bd933e 100644
--- a/spec/factories/project_hooks.rb
+++ b/spec/factories/project_hooks.rb
@@ -28,6 +28,7 @@ FactoryBot.define do
deployment_events { true }
feature_flag_events { true }
releases_events { true }
+ emoji_events { true }
end
trait :with_push_branch_filter do
diff --git a/spec/factories/work_items.rb b/spec/factories/work_items.rb
index 10764457d84..1e47dc0e348 100644
--- a/spec/factories/work_items.rb
+++ b/spec/factories/work_items.rb
@@ -7,7 +7,6 @@ FactoryBot.define do
author { project.creator }
updated_by { author }
relative_position { RelativePositioning::START_POSITION }
- issue_type { :issue }
association :work_item_type, :default
trait :confidential do
@@ -27,23 +26,23 @@ FactoryBot.define do
closed_at { Time.now }
end
+ trait :issue do
+ association :work_item_type, :default, :issue
+ end
+
trait :task do
- issue_type { :task }
association :work_item_type, :default, :task
end
trait :incident do
- issue_type { :incident }
association :work_item_type, :default, :incident
end
trait :requirement do
- issue_type { :requirement }
association :work_item_type, :default, :requirement
end
trait :test_case do
- issue_type { :test_case }
association :work_item_type, :default, :test_case
end
@@ -52,12 +51,10 @@ FactoryBot.define do
end
trait :objective do
- issue_type { :objective }
association :work_item_type, :default, :objective
end
trait :key_result do
- issue_type { :key_result }
association :work_item_type, :default, :key_result
end
diff --git a/spec/factories/work_items/work_item_types.rb b/spec/factories/work_items/work_item_types.rb
index d36cb6260c6..899d4297fec 100644
--- a/spec/factories/work_items/work_item_types.rb
+++ b/spec/factories/work_items/work_item_types.rb
@@ -23,6 +23,11 @@ FactoryBot.define do
namespace { nil }
end
+ trait :issue do
+ base_type { WorkItems::Type.base_types[:issue] }
+ icon_name { 'issue-type-issue' }
+ end
+
trait :incident do
base_type { WorkItems::Type.base_types[:incident] }
icon_name { 'issue-type-incident' }
diff --git a/spec/fast_spec_helper.rb b/spec/fast_spec_helper.rb
index fcf0c43243f..47a90efab1e 100644
--- a/spec/fast_spec_helper.rb
+++ b/spec/fast_spec_helper.rb
@@ -18,12 +18,12 @@ RSpec.configure(&:disable_monkey_patching!)
require 'active_support/all'
require 'pry'
+require 'gitlab/utils/all'
require_relative 'rails_autoload'
require_relative '../config/settings'
require_relative 'support/rspec'
-require_relative '../lib/gitlab/utils'
-require_relative '../lib/gitlab/utils/strong_memoize'
+require_relative '../lib/gitlab'
require_relative 'simplecov_env'
SimpleCovEnv.start!
diff --git a/spec/features/abuse_report_spec.rb b/spec/features/abuse_report_spec.rb
index 82b7379b67c..ae3859280b1 100644
--- a/spec/features/abuse_report_spec.rb
+++ b/spec/features/abuse_report_spec.rb
@@ -13,6 +13,7 @@ RSpec.describe 'Abuse reports', :js, feature_category: :insider_threat do
before do
sign_in(reporter1)
stub_feature_flags(moved_mr_sidebar: false)
+ stub_feature_flags(user_profile_overflow_menu_vue: false)
end
describe 'report abuse to administrator' do
@@ -122,6 +123,10 @@ RSpec.describe 'Abuse reports', :js, feature_category: :insider_threat do
end
end
+ # TODO: implement tests before the FF "user_profile_overflow_menu_vue" is turned on
+ # See: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/122971
+ # Related Issue: https://gitlab.com/gitlab-org/gitlab/-/issues/416983
+
private
def fill_and_submit_abuse_category_form(category = "They're posting spam.")
diff --git a/spec/features/admin/admin_hooks_spec.rb b/spec/features/admin/admin_hooks_spec.rb
index ee8f94d6658..b4f64cbfa7b 100644
--- a/spec/features/admin/admin_hooks_spec.rb
+++ b/spec/features/admin/admin_hooks_spec.rb
@@ -46,10 +46,12 @@ RSpec.describe 'Admin::Hooks', feature_category: :webhooks do
it 'adds new hook' do
visit admin_hooks_path
+
+ click_button 'Add new webhook'
fill_in 'hook_url', with: url
check 'Enable SSL verification'
- expect { click_button 'Add system hook' }.to change(SystemHook, :count).by(1)
+ expect { click_button 'Add webhook' }.to change(SystemHook, :count).by(1)
expect(page).to have_content 'SSL Verification: enabled'
expect(page).to have_current_path(admin_hooks_path, ignore_query: true)
expect(page).to have_content(url)
@@ -119,11 +121,12 @@ RSpec.describe 'Admin::Hooks', feature_category: :webhooks do
it 'adds new hook' do
visit admin_hooks_path
+ click_button 'Add new webhook'
fill_in 'hook_url', with: url
uncheck 'Repository update events'
check 'Merge request events'
- expect { click_button 'Add system hook' }.to change(SystemHook, :count).by(1)
+ expect { click_button 'Add webhook' }.to change(SystemHook, :count).by(1)
expect(page).to have_current_path(admin_hooks_path, ignore_query: true)
expect(page).to have_content(url)
end
diff --git a/spec/features/admin/admin_mode/login_spec.rb b/spec/features/admin/admin_mode/login_spec.rb
index c0c8b12342a..72c7083f459 100644
--- a/spec/features/admin/admin_mode/login_spec.rb
+++ b/spec/features/admin/admin_mode/login_spec.rb
@@ -139,8 +139,10 @@ RSpec.describe 'Admin Mode Login', feature_category: :system_access do
context 'when authn_context is worth two factors' do
let(:mock_saml_response) do
File.read('spec/fixtures/authentication/saml_response.xml')
- .gsub('urn:oasis:names:tc:SAML:2.0:ac:classes:Password',
- 'urn:oasis:names:tc:SAML:2.0:ac:classes:SecondFactorOTPSMS')
+ .gsub(
+ 'urn:oasis:names:tc:SAML:2.0:ac:classes:Password',
+ 'urn:oasis:names:tc:SAML:2.0:ac:classes:SecondFactorOTPSMS'
+ )
end
it 'signs user in without prompting for second factor' do
diff --git a/spec/features/admin/admin_runners_spec.rb b/spec/features/admin/admin_runners_spec.rb
index b81703f728b..7fb2202ca1d 100644
--- a/spec/features/admin/admin_runners_spec.rb
+++ b/spec/features/admin/admin_runners_spec.rb
@@ -32,30 +32,13 @@ RSpec.describe "Admin Runners", feature_category: :runner_fleet do
end
describe "runners registration" do
- context 'when create_runner_workflow_for_namespace is enabled' do
- before do
- stub_feature_flags(create_runner_workflow_for_admin: true)
-
- visit admin_runners_path
- end
-
- it_behaves_like "shows and resets runner registration token" do
- let(:dropdown_text) { s_('Runners|Register an instance runner') }
- let(:registration_token) { Gitlab::CurrentSettings.runners_registration_token }
- end
+ before do
+ visit admin_runners_path
end
- context 'when create_runner_workflow_for_namespace is disabled' do
- before do
- stub_feature_flags(create_runner_workflow_for_admin: false)
-
- visit admin_runners_path
- end
-
- it_behaves_like "shows and resets runner registration token" do
- let(:dropdown_text) { s_('Runners|Register an instance runner') }
- let(:registration_token) { Gitlab::CurrentSettings.runners_registration_token }
- end
+ it_behaves_like "shows and resets runner registration token" do
+ let(:dropdown_text) { s_('Runners|Register an instance runner') }
+ let(:registration_token) { Gitlab::CurrentSettings.runners_registration_token }
end
end
diff --git a/spec/features/admin/admin_settings_spec.rb b/spec/features/admin/admin_settings_spec.rb
index 3e08d2277c1..b78d6777a1a 100644
--- a/spec/features/admin/admin_settings_spec.rb
+++ b/spec/features/admin/admin_settings_spec.rb
@@ -8,11 +8,9 @@ RSpec.describe 'Admin updates settings', feature_category: :shared do
include UsageDataHelpers
let_it_be(:admin) { create(:admin) }
- let(:dot_com?) { false }
context 'application setting :admin_mode is enabled', :request_store do
before do
- allow(Gitlab).to receive(:com?).and_return(dot_com?)
stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'false')
sign_in(admin)
gitlab_enable_admin_mode_sign_in(admin)
@@ -147,9 +145,7 @@ RSpec.describe 'Admin updates settings', feature_category: :shared do
end
context 'Dormant users', feature_category: :user_management do
- context 'when Gitlab.com' do
- let(:dot_com?) { true }
-
+ context 'when Gitlab.com', :saas do
it 'does not expose the setting section' do
# NOTE: not_to have_content may have false positives for content
# that might not load instantly, so before checking that
@@ -163,8 +159,6 @@ RSpec.describe 'Admin updates settings', feature_category: :shared do
end
context 'when not Gitlab.com' do
- let(:dot_com?) { false }
-
it 'exposes the setting section' do
expect(page).to have_content('Dormant users')
expect(page).to have_field('Deactivate dormant users after a period of inactivity')
@@ -366,9 +360,32 @@ RSpec.describe 'Admin updates settings', feature_category: :shared do
end
context 'GitLab for Slack app settings', feature_category: :integrations do
+ let(:create_heading) { 'Create your GitLab for Slack app' }
+ let(:configure_heading) { 'Configure the app settings' }
+ let(:update_heading) { 'Update your Slack app' }
+
+ it 'has all sections' do
+ page.within('.as-slack') do
+ expect(page).to have_content(create_heading)
+ expect(page).to have_content(configure_heading)
+ expect(page).to have_content(update_heading)
+ end
+ end
+
+ context 'when GitLab.com', :saas do
+ it 'only has the configure section' do
+ page.within('.as-slack') do
+ expect(page).to have_content(configure_heading)
+
+ expect(page).not_to have_content(create_heading)
+ expect(page).not_to have_content(update_heading)
+ end
+ end
+ end
+
it 'changes the settings' do
page.within('.as-slack') do
- check 'Enable Slack application'
+ check 'Enable GitLab for Slack app'
fill_in 'Client ID', with: 'slack_app_id'
fill_in 'Client secret', with: 'slack_app_secret'
fill_in 'Signing secret', with: 'slack_app_signing_secret'
@@ -775,6 +792,18 @@ RSpec.describe 'Admin updates settings', feature_category: :shared do
expect(current_settings.users_get_by_id_limit_allowlist).to eq(%w[someone someone_else])
end
+ it 'changes gitlab shell operation limits settings' do
+ visit network_admin_application_settings_path
+
+ page.within('[data-testid="gitlab-shell-operation-limits"]') do
+ fill_in 'Maximum number of Git operations per minute', with: 100
+ click_button 'Save changes'
+ end
+
+ expect(page).to have_content "Application settings saved successfully"
+ expect(current_settings.gitlab_shell_operation_limit).to eq(100)
+ end
+
it 'changes Projects API rate limits settings' do
visit network_admin_application_settings_path
diff --git a/spec/features/admin/integrations/user_activates_mattermost_slash_command_spec.rb b/spec/features/admin/integrations/user_activates_mattermost_slash_command_spec.rb
index d0ca5d76cc7..881ccec017b 100644
--- a/spec/features/admin/integrations/user_activates_mattermost_slash_command_spec.rb
+++ b/spec/features/admin/integrations/user_activates_mattermost_slash_command_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'User activates the instance-level Mattermost Slash Command integration', :js,
-feature_category: :integrations do
+ feature_category: :integrations do
include_context 'instance integration activation'
before do
diff --git a/spec/features/admin/users/user_spec.rb b/spec/features/admin/users/user_spec.rb
index f8f1fdaabb4..a95fd133133 100644
--- a/spec/features/admin/users/user_spec.rb
+++ b/spec/features/admin/users/user_spec.rb
@@ -260,7 +260,7 @@ RSpec.describe 'Admin::Users::User', feature_category: :user_management do
it 'logs in as the user when impersonate is clicked' do
subject
- find('[data-testid="user-menu"]').click
+ find('[data-testid="user-dropdown"]').click
expect(page.find(:css, '[data-testid="user-profile-link"]')['data-user']).to eql(another_user.username)
end
@@ -317,7 +317,7 @@ RSpec.describe 'Admin::Users::User', feature_category: :user_management do
it 'logs out of impersonated user back to original user' do
subject
- find('[data-testid="user-menu"]').click
+ find('[data-testid="user-dropdown"]').click
expect(page.find(:css, '[data-testid="user-profile-link"]')['data-user']).to eq(current_user.username)
end
diff --git a/spec/features/atom/issues_spec.rb b/spec/features/atom/issues_spec.rb
index 89db70c6680..bd5903efe10 100644
--- a/spec/features/atom/issues_spec.rb
+++ b/spec/features/atom/issues_spec.rb
@@ -49,8 +49,11 @@ RSpec.describe 'Issues Feed', feature_category: :devops_reports do
before do
personal_access_token = create(:personal_access_token, user: user)
- visit project_issues_path(project, :atom,
- private_token: personal_access_token.token)
+ visit project_issues_path(
+ project,
+ :atom,
+ private_token: personal_access_token.token
+ )
end
it_behaves_like 'an authenticated issuable atom feed'
@@ -59,8 +62,11 @@ RSpec.describe 'Issues Feed', feature_category: :devops_reports do
context 'when authenticated via feed token' do
before do
- visit project_issues_path(project, :atom,
- feed_token: user.feed_token)
+ visit project_issues_path(
+ project,
+ :atom,
+ feed_token: user.feed_token
+ )
end
it_behaves_like 'an authenticated issuable atom feed'
diff --git a/spec/features/atom/merge_requests_spec.rb b/spec/features/atom/merge_requests_spec.rb
index b9e1c7042b2..0238380da90 100644
--- a/spec/features/atom/merge_requests_spec.rb
+++ b/spec/features/atom/merge_requests_spec.rb
@@ -46,8 +46,11 @@ RSpec.describe 'Merge Requests Feed', feature_category: :devops_reports do
before do
personal_access_token = create(:personal_access_token, user: user)
- visit project_merge_requests_path(project, :atom,
- private_token: personal_access_token.token)
+ visit project_merge_requests_path(
+ project,
+ :atom,
+ private_token: personal_access_token.token
+ )
end
it_behaves_like 'an authenticated issuable atom feed'
@@ -56,8 +59,11 @@ RSpec.describe 'Merge Requests Feed', feature_category: :devops_reports do
context 'when authenticated via feed token' do
before do
- visit project_merge_requests_path(project, :atom,
- feed_token: user.feed_token)
+ visit project_merge_requests_path(
+ project,
+ :atom,
+ feed_token: user.feed_token
+ )
end
it_behaves_like 'an authenticated issuable atom feed'
diff --git a/spec/features/atom/topics_spec.rb b/spec/features/atom/topics_spec.rb
new file mode 100644
index 00000000000..078c5b55eeb
--- /dev/null
+++ b/spec/features/atom/topics_spec.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe "Topic Feed", feature_category: :groups_and_projects do
+ let_it_be(:topic) { create(:topic, name: 'test-topic', title: 'Test topic') }
+ let_it_be(:empty_topic) { create(:topic, name: 'test-empty-topic', title: 'Test empty topic') }
+ let_it_be(:project1) { create(:project, :public, topic_list: topic.name) }
+ let_it_be(:project2) { create(:project, :public, topic_list: topic.name) }
+
+ context 'when topic does not exist' do
+ let(:path) { topic_explore_projects_path(topic_name: 'non-existing', format: 'atom') }
+
+ it 'renders 404' do
+ visit path
+
+ expect(status_code).to eq(404)
+ end
+ end
+
+ context 'when topic exists' do
+ before do
+ visit topic_explore_projects_path(topic_name: topic.name, format: 'atom')
+ end
+
+ it "renders topic atom feed" do
+ expect(body).to have_selector('feed title')
+ end
+
+ it "has project entries" do
+ expect(body).to have_content(project1.name)
+ expect(body).to have_content(project2.name)
+ end
+ end
+
+ context 'when topic is empty' do
+ before do
+ visit topic_explore_projects_path(topic_name: empty_topic.name, format: 'atom')
+ end
+
+ it "renders topic atom feed" do
+ expect(body).to have_selector('feed title')
+ end
+
+ it "has no project entry" do
+ expect(body).to have_no_selector('entry')
+ end
+ end
+end
diff --git a/spec/features/atom/users_spec.rb b/spec/features/atom/users_spec.rb
index b743f900ae7..f801f93686c 100644
--- a/spec/features/atom/users_spec.rb
+++ b/spec/features/atom/users_spec.rb
@@ -25,27 +25,33 @@ RSpec.describe "User Feed", feature_category: :devops_reports do
context 'feed content' do
let(:project) { create(:project, :repository) }
let(:issue) do
- create(:issue,
- project: project,
- author: user,
- description: "Houston, we have a bug!\n\n***\n\nI guess.")
+ create(
+ :issue,
+ project: project,
+ author: user,
+ description: "Houston, we have a bug!\n\n***\n\nI guess."
+ )
end
let(:note) do
- create(:note,
- noteable: issue,
- author: user,
- note: 'Bug confirmed :+1:',
- project: project)
+ create(
+ :note,
+ noteable: issue,
+ author: user,
+ note: 'Bug confirmed :+1:',
+ project: project
+ )
end
let(:merge_request) do
- create(:merge_request,
- title: 'Fix bug',
- author: user,
- source_project: project,
- target_project: project,
- description: "Here is the fix: ![an image](image.png)")
+ create(
+ :merge_request,
+ title: 'Fix bug',
+ author: user,
+ source_project: project,
+ target_project: project,
+ description: "Here is the fix: ![an image](image.png)"
+ )
end
let(:push_event) { create(:push_event, project: project, author: user) }
diff --git a/spec/features/boards/boards_spec.rb b/spec/features/boards/boards_spec.rb
index 1ea6e079104..85e54c0f451 100644
--- a/spec/features/boards/boards_spec.rb
+++ b/spec/features/boards/boards_spec.rb
@@ -74,7 +74,6 @@ RSpec.describe 'Project issue boards', :js, feature_category: :team_planning do
let_it_be(:a_plus, reload: true) { create(:label, project: project, name: 'A+') }
let_it_be(:list1, reload: true) { create(:list, board: board, label: planning, position: 0) }
let_it_be(:list2, reload: true) { create(:list, board: board, label: development, position: 1) }
- let_it_be(:backlog_list, reload: true) { create(:backlog_list, board: board) }
let_it_be(:confidential_issue, reload: true) { create(:labeled_issue, :confidential, project: project, author: user, labels: [planning], relative_position: 9) }
let_it_be(:issue1, reload: true) { create(:labeled_issue, project: project, title: 'aaa', description: '111', assignees: [user], labels: [planning], relative_position: 8) }
@@ -591,8 +590,6 @@ RSpec.describe 'Project issue boards', :js, feature_category: :team_planning do
def remove_list
page.within(find('.board:nth-child(2)')) do
- dropdown = first("[data-testid='header-list-actions']")
- dropdown.click
click_button('Edit list settings')
end
diff --git a/spec/features/boards/issue_ordering_spec.rb b/spec/features/boards/issue_ordering_spec.rb
index b6196fa6a1d..35e387c9d8a 100644
--- a/spec/features/boards/issue_ordering_spec.rb
+++ b/spec/features/boards/issue_ordering_spec.rb
@@ -220,12 +220,14 @@ RSpec.describe 'Issue Boards', :js, feature_category: :team_planning do
end
def drag(selector: '.board-list', list_from_index: 1, from_index: 0, to_index: 0, list_to_index: 1, duration: 1000)
- drag_to(selector: selector,
- scrollable: '#board-app',
- list_from_index: list_from_index,
- from_index: from_index,
- to_index: to_index,
- list_to_index: list_to_index,
- duration: duration)
+ drag_to(
+ selector: selector,
+ scrollable: '#board-app',
+ list_from_index: list_from_index,
+ from_index: from_index,
+ to_index: to_index,
+ list_to_index: list_to_index,
+ duration: duration
+ )
end
end
diff --git a/spec/features/boards/multi_select_spec.rb b/spec/features/boards/multi_select_spec.rb
index 7afe34be3d8..03b1643d7c4 100644
--- a/spec/features/boards/multi_select_spec.rb
+++ b/spec/features/boards/multi_select_spec.rb
@@ -11,13 +11,15 @@ RSpec.describe 'Multi Select Issue', :js, feature_category: :team_planning do
let(:user) { create(:user) }
def drag(selector: '.board-list', list_from_index: 1, from_index: 0, to_index: 0, list_to_index: 1, duration: 1000)
- drag_to(selector: selector,
- scrollable: '#board-app',
- list_from_index: list_from_index,
- from_index: from_index,
- to_index: to_index,
- list_to_index: list_to_index,
- duration: duration)
+ drag_to(
+ selector: selector,
+ scrollable: '#board-app',
+ list_from_index: list_from_index,
+ from_index: from_index,
+ to_index: to_index,
+ list_to_index: list_to_index,
+ duration: duration
+ )
end
def wait_for_board_cards(board_number, expected_cards)
diff --git a/spec/features/boards/new_issue_spec.rb b/spec/features/boards/new_issue_spec.rb
index 1fcea45c7ae..682ccca38bd 100644
--- a/spec/features/boards/new_issue_spec.rb
+++ b/spec/features/boards/new_issue_spec.rb
@@ -5,7 +5,6 @@ require 'spec_helper'
RSpec.describe 'Issue Boards new issue', :js, feature_category: :team_planning do
let_it_be(:project) { create(:project, :public) }
let_it_be(:board) { create(:board, project: project) }
- let_it_be(:backlog_list) { create(:backlog_list, board: board) }
let_it_be(:label) { create(:label, project: project, name: 'Label 1') }
let_it_be(:list) { create(:list, board: board, label: label, position: 0) }
let_it_be(:user) { create(:user) }
@@ -32,22 +31,17 @@ RSpec.describe 'Issue Boards new issue', :js, feature_category: :team_planning d
end
it 'displays new issue button' do
- dropdown = first("[data-testid='header-list-actions']")
- dropdown.click
expect(first('.board')).to have_button('Create new issue', count: 1)
end
it 'does not display new issue button in closed list' do
page.within('.board:nth-child(3)') do
- expect(page).not_to have_selector("[data-testid='header-list-actions']")
expect(page).not_to have_button('Create new issue')
end
end
it 'shows form when clicking button' do
page.within(first('.board')) do
- dropdown = first("[data-testid='header-list-actions']")
- dropdown.click
click_button 'Create new issue'
expect(page).to have_selector('.board-new-issue-form')
@@ -56,8 +50,6 @@ RSpec.describe 'Issue Boards new issue', :js, feature_category: :team_planning d
it 'hides form when clicking cancel' do
page.within(first('.board')) do
- dropdown = first("[data-testid='header-list-actions']")
- dropdown.click
click_button 'Create new issue'
expect(page).to have_selector('.board-new-issue-form')
@@ -70,8 +62,6 @@ RSpec.describe 'Issue Boards new issue', :js, feature_category: :team_planning d
it 'creates new issue, places it on top of the list, and opens sidebar' do
page.within(first('.board')) do
- dropdown = first("[data-testid='header-list-actions']")
- dropdown.click
click_button 'Create new issue'
end
@@ -100,8 +90,6 @@ RSpec.describe 'Issue Boards new issue', :js, feature_category: :team_planning d
it 'successfuly loads labels to be added to newly created issue' do
page.within(first('.board')) do
- dropdown = first("[data-testid='header-list-actions']")
- dropdown.click
click_button 'Create new issue'
end
@@ -132,8 +120,6 @@ RSpec.describe 'Issue Boards new issue', :js, feature_category: :team_planning d
wait_for_all_requests
page.within('.board:nth-child(2)') do
- dropdown = first("[data-testid='header-list-actions']")
- dropdown.click
click_button('Create new issue')
page.within(first('.board-new-issue-form')) do
@@ -157,13 +143,11 @@ RSpec.describe 'Issue Boards new issue', :js, feature_category: :team_planning d
end
it 'does not display new issue button in open list' do
- expect(page).not_to have_selector("[data-testid='header-list-actions']")
expect(first('.board')).not_to have_button('Create new issue')
end
it 'does not display new issue button in label list' do
page.within('.board:nth-child(2)') do
- expect(page).not_to have_selector("[data-testid='header-list-actions']")
expect(page).not_to have_button('Create new issue')
end
end
@@ -188,23 +172,18 @@ RSpec.describe 'Issue Boards new issue', :js, feature_category: :team_planning d
context 'when backlog does not exist' do
it 'does not display new issue button in label list' do
page.within('.board.is-draggable') do
- expect(page).not_to have_selector("[data-testid='header-list-actions']")
expect(page).not_to have_button('Create new issue')
end
end
end
context 'when backlog list already exists' do
- let_it_be(:backlog_list) { create(:backlog_list, board: group_board) }
-
it 'does not display new issue button in open list' do
- expect(page).not_to have_selector("[data-testid='header-list-actions']")
expect(first('.board')).not_to have_button('Create new issue')
end
it 'does not display new issue button in label list' do
page.within('.board.is-draggable') do
- expect(page).not_to have_selector("[data-testid='header-list-actions']")
expect(page).not_to have_button('Create new issue')
end
end
@@ -222,20 +201,18 @@ RSpec.describe 'Issue Boards new issue', :js, feature_category: :team_planning d
end
context 'when backlog does not exist' do
+ before do
+ group_board.lists.backlog.delete_all
+ end
+
it 'display new issue button in label list' do
- dropdown = first("[data-testid='header-list-actions']")
- dropdown.click
expect(board_list_header).to have_button('Create new issue')
end
end
context 'project select dropdown' do
- let_it_be(:backlog_list) { create(:backlog_list, board: group_board) }
-
before do
page.within(board_list_header) do
- dropdown = first("[data-testid='header-list-actions']")
- dropdown.click
click_button 'Create new issue'
end
diff --git a/spec/features/boards/sidebar_assignee_spec.rb b/spec/features/boards/sidebar_assignee_spec.rb
index a912ea28ddc..899ab5863e1 100644
--- a/spec/features/boards/sidebar_assignee_spec.rb
+++ b/spec/features/boards/sidebar_assignee_spec.rb
@@ -2,8 +2,9 @@
require 'spec_helper'
-RSpec.describe 'Project issue boards sidebar assignee', :js, quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/332078',
- feature_category: :team_planning do
+RSpec.describe 'Project issue boards sidebar assignee', :js,
+ quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/332078',
+ feature_category: :team_planning do
include BoardHelpers
let_it_be(:user) { create(:user) }
diff --git a/spec/features/boards/sidebar_labels_in_namespaces_spec.rb b/spec/features/boards/sidebar_labels_in_namespaces_spec.rb
index 39485fe21a9..ffed4a0854f 100644
--- a/spec/features/boards/sidebar_labels_in_namespaces_spec.rb
+++ b/spec/features/boards/sidebar_labels_in_namespaces_spec.rb
@@ -12,7 +12,6 @@ RSpec.describe 'Issue boards sidebar labels select', :js, feature_category: :tea
context 'group boards' do
context 'in the top-level group board' do
let_it_be(:group_board) { create(:board, group: group) }
- let_it_be(:board_list) { create(:backlog_list, board: group_board) }
before do
stub_feature_flags(apollo_boards: false)
diff --git a/spec/features/boards/sidebar_spec.rb b/spec/features/boards/sidebar_spec.rb
index 358da1e1279..4807b691e4f 100644
--- a/spec/features/boards/sidebar_spec.rb
+++ b/spec/features/boards/sidebar_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Project issue boards sidebar', :js, feature_category: :team_planning do
+RSpec.describe 'Project issue boards sidebar', :js, feature_category: :team_planning, quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/416414' do
include BoardHelpers
let_it_be(:user) { create(:user) }
diff --git a/spec/features/boards/user_adds_lists_to_board_spec.rb b/spec/features/boards/user_adds_lists_to_board_spec.rb
index a936e14168c..cc2afca7657 100644
--- a/spec/features/boards/user_adds_lists_to_board_spec.rb
+++ b/spec/features/boards/user_adds_lists_to_board_spec.rb
@@ -13,8 +13,6 @@ RSpec.describe 'User adds lists', :js, feature_category: :team_planning do
let_it_be(:group_label) { create(:group_label, group: group) }
let_it_be(:project_label) { create(:label, project: project) }
- let_it_be(:group_backlog_list) { create(:backlog_list, board: group_board) }
- let_it_be(:project_backlog_list) { create(:backlog_list, board: project_board) }
let_it_be(:backlog) { create(:group_label, group: group, name: 'Backlog') }
let_it_be(:closed) { create(:group_label, group: group, name: 'Closed') }
diff --git a/spec/features/boards/user_visits_board_spec.rb b/spec/features/boards/user_visits_board_spec.rb
index 44c691435df..5867ec17070 100644
--- a/spec/features/boards/user_visits_board_spec.rb
+++ b/spec/features/boards/user_visits_board_spec.rb
@@ -62,7 +62,6 @@ RSpec.describe 'User visits issue boards', :js, feature_category: :team_planning
context "project boards" do
stub_feature_flags(apollo_boards: false)
let_it_be(:board) { create_default(:board, project: project) }
- let_it_be(:backlog_list) { create_default(:backlog_list, board: board) }
let(:board_path) { project_boards_path(project, params) }
@@ -72,7 +71,6 @@ RSpec.describe 'User visits issue boards', :js, feature_category: :team_planning
context "group boards" do
stub_feature_flags(apollo_boards: false)
let_it_be(:board) { create_default(:board, group: group) }
- let_it_be(:backlog_list) { create_default(:backlog_list, board: board) }
let(:board_path) { group_boards_path(group, params) }
diff --git a/spec/features/clusters/create_agent_spec.rb b/spec/features/clusters/create_agent_spec.rb
index 93a49151978..d90c43f452c 100644
--- a/spec/features/clusters/create_agent_spec.rb
+++ b/spec/features/clusters/create_agent_spec.rb
@@ -27,7 +27,8 @@ RSpec.describe 'Cluster agent registration', :js, feature_category: :deployment_
end
it 'allows the user to select an agent to install, and displays the resulting agent token' do
- click_button('Connect a cluster')
+ find('[data-testid="clusters-default-action-button"]').click
+
expect(page).to have_content('Register')
click_button('Select an agent or enter a name to create new')
diff --git a/spec/features/commits_spec.rb b/spec/features/commits_spec.rb
index fd09a7f7343..b72e08b854e 100644
--- a/spec/features/commits_spec.rb
+++ b/spec/features/commits_spec.rb
@@ -8,20 +8,21 @@ RSpec.describe 'Commits', feature_category: :source_code_management do
describe 'CI' do
before do
- stub_feature_flags(pipeline_details_header_vue: false)
sign_in(user)
stub_ci_pipeline_to_return_yaml_file
end
let(:creator) { create(:user, developer_projects: [project]) }
let!(:pipeline) do
- create(:ci_pipeline,
- project: project,
- user: creator,
- ref: project.default_branch,
- sha: project.commit.sha,
- status: :success,
- created_at: 5.months.ago)
+ create(
+ :ci_pipeline,
+ project: project,
+ user: creator,
+ ref: project.default_branch,
+ sha: project.commit.sha,
+ status: :success,
+ created_at: 5.months.ago
+ )
end
context 'commit status is Generic Commit Status' do
@@ -39,7 +40,11 @@ RSpec.describe 'Commits', feature_category: :source_code_management do
wait_for_requests
end
- it { expect(page).to have_content pipeline.sha[0..7] }
+ it 'contains commit short id' do
+ page.within('[data-testid="pipeline-details-header"]') do
+ expect(page).to have_content pipeline.sha[0..7]
+ end
+ end
it 'contains generic commit status build' do
page.within('[data-testid="jobs-tab-table"]') do
@@ -61,11 +66,13 @@ RSpec.describe 'Commits', feature_category: :source_code_management do
describe 'Project commits' do
let!(:pipeline_from_other_branch) do
- create(:ci_pipeline,
- project: project,
- ref: 'fix',
- sha: project.commit.sha,
- status: :failed)
+ create(
+ :ci_pipeline,
+ project: project,
+ ref: 'fix',
+ sha: project.commit.sha,
+ status: :failed
+ )
end
before do
@@ -88,7 +95,6 @@ RSpec.describe 'Commits', feature_category: :source_code_management do
it 'shows pipeline data' do
expect(page).to have_content pipeline.sha[0..7]
- expect(page).to have_content pipeline.git_commit_message.gsub!(/\s+/, ' ')
expect(page).to have_content pipeline.user.name
end
end
@@ -116,7 +122,7 @@ RSpec.describe 'Commits', feature_category: :source_code_management do
describe 'Cancel build' do
it 'cancels build', :js, :sidekiq_might_not_need_inline do
visit pipeline_path(pipeline)
- find('[data-testid="cancelPipeline"]').click
+ find('[data-testid="cancel-pipeline"]').click
expect(page).to have_content 'canceled'
end
end
@@ -132,7 +138,6 @@ RSpec.describe 'Commits', feature_category: :source_code_management do
it 'renders header' do
expect(page).to have_content pipeline.sha[0..7]
- expect(page).to have_content pipeline.git_commit_message.gsub!(/\s+/, ' ')
expect(page).to have_content pipeline.user.name
expect(page).not_to have_link('Cancel pipeline')
expect(page).not_to have_link('Retry')
diff --git a/spec/features/dashboard/activity_spec.rb b/spec/features/dashboard/activity_spec.rb
index 2345e4be722..60621f57bde 100644
--- a/spec/features/dashboard/activity_spec.rb
+++ b/spec/features/dashboard/activity_spec.rb
@@ -59,12 +59,14 @@ RSpec.describe 'Dashboard > Activity', feature_category: :user_profile do
let!(:push_event) do
event = create(:push_event, project: project, author: user)
- create(:push_event_payload,
- event: event,
- action: :created,
- commit_to: '0220c11b9a3e6c69dc8fd35321254ca9a7b98f7e',
- ref: 'new_design',
- commit_count: 1)
+ create(
+ :push_event_payload,
+ event: event,
+ action: :created,
+ commit_to: '0220c11b9a3e6c69dc8fd35321254ca9a7b98f7e',
+ ref: 'new_design',
+ commit_count: 1
+ )
event
end
diff --git a/spec/features/dashboard/datetime_on_tooltips_spec.rb b/spec/features/dashboard/datetime_on_tooltips_spec.rb
index c6e78c8b57c..e84a3c8cc66 100644
--- a/spec/features/dashboard/datetime_on_tooltips_spec.rb
+++ b/spec/features/dashboard/datetime_on_tooltips_spec.rb
@@ -18,8 +18,13 @@ RSpec.describe 'Tooltips on .timeago dates', :js, feature_category: :user_profil
context 'on the activity tab' do
before do
- Event.create!(project: project, author_id: user.id, action: :joined,
- updated_at: created_date, created_at: created_date)
+ Event.create!(
+ project: project,
+ author_id: user.id,
+ action: :joined,
+ updated_at: created_date,
+ created_at: created_date
+ )
sign_in user
visit user_activity_path(user)
diff --git a/spec/features/dashboard/issues_filter_spec.rb b/spec/features/dashboard/issues_filter_spec.rb
index 964ac2f714d..ab3aa29a3aa 100644
--- a/spec/features/dashboard/issues_filter_spec.rb
+++ b/spec/features/dashboard/issues_filter_spec.rb
@@ -61,10 +61,15 @@ RSpec.describe 'Dashboard Issues filtering', :js, feature_category: :team_planni
auto_discovery_link = find('link[type="application/atom+xml"]', visible: false)
auto_discovery_params = CGI.parse(URI.parse(auto_discovery_link[:href]).query)
- expect(params).to include('feed_token' => [user.feed_token])
+ feed_token_param = params['feed_token']
+ expect(feed_token_param).to match([Gitlab::Auth::AuthFinders::PATH_DEPENDENT_FEED_TOKEN_REGEX])
+ expect(feed_token_param.first).to end_with(user.id.to_s)
expect(params).to include('milestone_title' => [''])
expect(params).to include('assignee_username' => [user.username.to_s])
- expect(auto_discovery_params).to include('feed_token' => [user.feed_token])
+
+ feed_token_param = auto_discovery_params['feed_token']
+ expect(feed_token_param).to match([Gitlab::Auth::AuthFinders::PATH_DEPENDENT_FEED_TOKEN_REGEX])
+ expect(feed_token_param.first).to end_with(user.id.to_s)
expect(auto_discovery_params).to include('milestone_title' => [''])
expect(auto_discovery_params).to include('assignee_username' => [user.username.to_s])
end
diff --git a/spec/features/dashboard/merge_requests_spec.rb b/spec/features/dashboard/merge_requests_spec.rb
index d53f5affe64..624f3530f81 100644
--- a/spec/features/dashboard/merge_requests_spec.rb
+++ b/spec/features/dashboard/merge_requests_spec.rb
@@ -79,39 +79,52 @@ RSpec.describe 'Dashboard Merge Requests', feature_category: :code_review_workfl
end
let!(:assigned_merge_request_from_fork) do
- create(:merge_request,
- source_branch: 'markdown', assignees: [current_user],
- target_project: public_project, source_project: forked_project,
- author: author_user)
+ create(
+ :merge_request,
+ source_branch: 'markdown',
+ assignees: [current_user],
+ target_project: public_project,
+ source_project: forked_project,
+ author: author_user
+ )
end
let!(:authored_merge_request) do
- create(:merge_request,
- source_branch: 'markdown',
- source_project: project,
- author: current_user)
+ create(
+ :merge_request,
+ source_branch: 'markdown',
+ source_project: project,
+ author: current_user
+ )
end
let!(:authored_merge_request_from_fork) do
- create(:merge_request,
- source_branch: 'feature_conflict',
- author: current_user,
- target_project: public_project, source_project: forked_project)
+ create(
+ :merge_request,
+ source_branch: 'feature_conflict',
+ author: current_user,
+ target_project: public_project,
+ source_project: forked_project
+ )
end
let!(:labeled_merge_request) do
- create(:labeled_merge_request,
- source_branch: 'labeled',
- labels: [label],
- author: current_user,
- source_project: project)
+ create(
+ :labeled_merge_request,
+ source_branch: 'labeled',
+ labels: [label],
+ author: current_user,
+ source_project: project
+ )
end
let!(:other_merge_request) do
- create(:merge_request,
- source_branch: 'fix',
- source_project: project,
- author: author_user)
+ create(
+ :merge_request,
+ source_branch: 'fix',
+ source_project: project,
+ author: author_user
+ )
end
before do
diff --git a/spec/features/dashboard/todos/todos_sorting_spec.rb b/spec/features/dashboard/todos/todos_sorting_spec.rb
index e449f71878b..e1460e345fc 100644
--- a/spec/features/dashboard/todos/todos_sorting_spec.rb
+++ b/spec/features/dashboard/todos/todos_sorting_spec.rb
@@ -27,8 +27,9 @@ RSpec.describe 'Dashboard > User sorts todos', feature_category: :team_planning
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)
+ 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
diff --git a/spec/features/dashboard/todos/todos_spec.rb b/spec/features/dashboard/todos/todos_spec.rb
index d0003b69415..9d59126df8d 100644
--- a/spec/features/dashboard/todos/todos_spec.rb
+++ b/spec/features/dashboard/todos/todos_spec.rb
@@ -443,12 +443,15 @@ RSpec.describe 'Dashboard Todos', feature_category: :team_planning do
let_it_be(:target) { create(:design, issue: issue, project: project) }
let_it_be(:note) { create(:note, project: project, note: 'I am note, hear me roar') }
let_it_be(:todo) do
- create(:todo, :mentioned,
- user: user,
- project: project,
- target: target,
- author: author,
- note: note)
+ create(
+ :todo,
+ :mentioned,
+ user: user,
+ project: project,
+ target: target,
+ author: author,
+ note: note
+ )
end
before do
@@ -467,10 +470,12 @@ RSpec.describe 'Dashboard Todos', feature_category: :team_planning do
context 'User requested access' do
shared_examples 'has todo present with access request content' do
specify do
- create(:todo, :member_access_requested,
- user: user,
- target: target,
- author: author
+ create(
+ :todo,
+ :member_access_requested,
+ user: user,
+ target: target,
+ author: author
)
target.add_owner(user)
diff --git a/spec/features/discussion_comments/issue_spec.rb b/spec/features/discussion_comments/issue_spec.rb
index 90be3f0760d..b270a4c7600 100644
--- a/spec/features/discussion_comments/issue_spec.rb
+++ b/spec/features/discussion_comments/issue_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'Thread Comments Issue', :js, feature_category: :source_code_management do
+ include ContentEditorHelpers
+
let(:user) { create(:user) }
let(:project) { create(:project) }
let(:issue) { create(:issue, project: project) }
@@ -12,6 +14,7 @@ RSpec.describe 'Thread Comments Issue', :js, feature_category: :source_code_mana
sign_in(user)
visit project_issue_path(project, issue)
+ close_rich_text_promo_popover_if_present
end
it_behaves_like 'thread comments for issue, epic and merge request', 'issue'
diff --git a/spec/features/error_tracking/user_filters_errors_by_status_spec.rb b/spec/features/error_tracking/user_filters_errors_by_status_spec.rb
index 168c4f330ca..5efcb5f8b8e 100644
--- a/spec/features/error_tracking/user_filters_errors_by_status_spec.rb
+++ b/spec/features/error_tracking/user_filters_errors_by_status_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'When a user filters Sentry errors by status', :js, :use_clean_rails_memory_store_caching, :sidekiq_inline,
-feature_category: :error_tracking do
+ feature_category: :error_tracking do
include_context 'sentry error tracking context feature'
let_it_be(:issues_response_body) { fixture_file('sentry/issues_sample_response.json') }
diff --git a/spec/features/error_tracking/user_searches_sentry_errors_spec.rb b/spec/features/error_tracking/user_searches_sentry_errors_spec.rb
index 6026b42f7de..d4c537f1939 100644
--- a/spec/features/error_tracking/user_searches_sentry_errors_spec.rb
+++ b/spec/features/error_tracking/user_searches_sentry_errors_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'When a user searches for Sentry errors', :js, :use_clean_rails_memory_store_caching, :sidekiq_inline,
-feature_category: :error_tracking do
+ feature_category: :error_tracking do
include_context 'sentry error tracking context feature'
let_it_be(:issues_response_body) { fixture_file('sentry/issues_sample_response.json') }
diff --git a/spec/features/error_tracking/user_sees_error_details_spec.rb b/spec/features/error_tracking/user_sees_error_details_spec.rb
index d7676d90d21..8fcf5df41c7 100644
--- a/spec/features/error_tracking/user_sees_error_details_spec.rb
+++ b/spec/features/error_tracking/user_sees_error_details_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'View error details page', :js, :use_clean_rails_memory_store_caching, :sidekiq_inline,
-feature_category: :error_tracking do
+ feature_category: :error_tracking do
include_context 'sentry error tracking context feature'
context 'with current user as project owner' do
diff --git a/spec/features/error_tracking/user_sees_error_index_spec.rb b/spec/features/error_tracking/user_sees_error_index_spec.rb
index f83c8ffe439..e86e89ad058 100644
--- a/spec/features/error_tracking/user_sees_error_index_spec.rb
+++ b/spec/features/error_tracking/user_sees_error_index_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'View error index page', :js, :use_clean_rails_memory_store_caching, :sidekiq_inline,
-feature_category: :error_tracking do
+ feature_category: :error_tracking do
include_context 'sentry error tracking context feature'
let_it_be(:issues_response_body) { fixture_file('sentry/issues_sample_response.json') }
diff --git a/spec/features/file_uploads/multipart_invalid_uploads_spec.rb b/spec/features/file_uploads/multipart_invalid_uploads_spec.rb
index c4c5eb6b74b..aeb8fd11170 100644
--- a/spec/features/file_uploads/multipart_invalid_uploads_spec.rb
+++ b/spec/features/file_uploads/multipart_invalid_uploads_spec.rb
@@ -44,7 +44,7 @@ RSpec.describe 'Invalid uploads that must be rejected', :api, :js, feature_categ
# These keys are rejected directly by rack itself.
# The request will not be received by multipart.rb (can't use the 'handling file uploads' shared example)
- it_behaves_like 'rejecting invalid keys', key_name: 'x' * 11000, message: 'Puma caught this error: exceeded available parameter key space (Rack::QueryParser::ParamsTooDeepError)'
+ it_behaves_like 'rejecting invalid keys', key_name: 'x' * 11000, status: 400, message: 'Bad Request'
it_behaves_like 'rejecting invalid keys', key_name: 'package[]test', status: 400, message: 'Bad Request'
it_behaves_like 'handling file uploads', 'by rejecting uploads with an invalid key'
diff --git a/spec/features/groups/board_spec.rb b/spec/features/groups/board_spec.rb
index 25f7d4d968c..c2d6b80b4c0 100644
--- a/spec/features/groups/board_spec.rb
+++ b/spec/features/groups/board_spec.rb
@@ -25,8 +25,6 @@ RSpec.describe 'Group Boards', feature_category: :team_planning do
it 'adds an issue to the backlog' do
page.within(find('.board', match: :first)) do
- dropdown = first("[data-testid='header-list-actions']")
- dropdown.click
issue_title = 'Create new issue'
click_button issue_title
@@ -52,7 +50,6 @@ RSpec.describe 'Group Boards', feature_category: :team_planning do
context "when user is a Reporter in one of the group's projects", :js do
let_it_be(:board) { create(:board, group: group) }
- let_it_be(:backlog_list) { create(:backlog_list, board: board) }
let_it_be(:group_label1) { create(:group_label, title: "bug", group: group) }
let_it_be(:group_label2) { create(:group_label, title: "dev", group: group) }
let_it_be(:list1) { create(:list, board: board, label: group_label1, position: 0) }
diff --git a/spec/features/groups/group_runners_spec.rb b/spec/features/groups/group_runners_spec.rb
index 514110d78ae..e9d2d185e8a 100644
--- a/spec/features/groups/group_runners_spec.rb
+++ b/spec/features/groups/group_runners_spec.rb
@@ -16,21 +16,6 @@ RSpec.describe "Group Runners", feature_category: :runner_fleet do
end
describe "Group runners page", :js do
- describe "legacy runners registration" do
- let_it_be(:group_registration_token) { group.runners_token }
-
- before do
- stub_feature_flags(create_runner_workflow_for_namespace: false)
-
- visit group_runners_path(group)
- end
-
- it_behaves_like "shows and resets runner registration token" do
- let(:dropdown_text) { 'Register a group runner' }
- let(:registration_token) { group_registration_token }
- end
- end
-
context "with no runners" do
before do
visit group_runners_path(group)
diff --git a/spec/features/groups/milestone_spec.rb b/spec/features/groups/milestone_spec.rb
index 0a697eaa798..d870471d646 100644
--- a/spec/features/groups/milestone_spec.rb
+++ b/spec/features/groups/milestone_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'Group milestones', feature_category: :groups_and_projects do
+ include ContentEditorHelpers
+
let_it_be(:group) { create(:group) }
let_it_be(:project) { create(:project_empty_repo, group: group) }
let_it_be(:user) { create(:group_member, :maintainer, user: create(:user), group: group).user }
@@ -18,6 +20,7 @@ RSpec.describe 'Group milestones', feature_category: :groups_and_projects do
context 'create a milestone', :js do
before do
visit new_group_milestone_path(group)
+ close_rich_text_promo_popover_if_present
end
it 'renders description preview' do
@@ -27,7 +30,7 @@ RSpec.describe 'Group milestones', feature_category: :groups_and_projects do
click_button("Preview")
- preview = find('.js-md-preview')
+ preview = find('.js-vue-md-preview')
expect(preview).to have_content('Nothing to preview.')
@@ -66,6 +69,7 @@ RSpec.describe 'Group milestones', feature_category: :groups_and_projects do
context 'when no milestones' do
it 'renders no milestones text' do
visit group_milestones_path(group)
+ close_rich_text_promo_popover_if_present
expect(page).to have_content('Use milestones to track issues and merge requests')
end
end
@@ -95,6 +99,7 @@ RSpec.describe 'Group milestones', feature_category: :groups_and_projects do
before do
visit group_milestones_path(group)
+ close_rich_text_promo_popover_if_present
end
it 'counts milestones correctly' do
@@ -170,6 +175,7 @@ RSpec.describe 'Group milestones', feature_category: :groups_and_projects do
before do
visit group_milestone_path(group, milestone)
+ close_rich_text_promo_popover_if_present
end
it 'renders the issues tab' do
diff --git a/spec/features/groups/milestones/gfm_autocomplete_spec.rb b/spec/features/groups/milestones/gfm_autocomplete_spec.rb
index 8df097dde88..9245323d1f7 100644
--- a/spec/features/groups/milestones/gfm_autocomplete_spec.rb
+++ b/spec/features/groups/milestones/gfm_autocomplete_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'GFM autocomplete', :js, feature_category: :team_planning do
+ include Features::AutocompleteHelpers
+
let_it_be(:user) { create(:user, name: '💃speciąl someone💃', username: 'someone.special') }
let_it_be(:group) { create(:group, name: 'Ancestor') }
let_it_be(:project) { create(:project, :repository, group: group) }
@@ -69,10 +71,6 @@ RSpec.describe 'GFM autocomplete', :js, feature_category: :team_planning do
private
- def find_autocomplete_menu
- find('.atwho-view ul', visible: true)
- end
-
def expect_autocomplete_entry(entry)
page.within('.atwho-container') do
expect(page).to have_content(entry)
diff --git a/spec/features/groups/packages_spec.rb b/spec/features/groups/packages_spec.rb
index b7f9cd3e93a..ec8215928e4 100644
--- a/spec/features/groups/packages_spec.rb
+++ b/spec/features/groups/packages_spec.rb
@@ -52,7 +52,7 @@ RSpec.describe 'Group Packages', feature_category: :package_registry do
it_behaves_like 'package details link'
it 'allows you to navigate to the project page' do
- find('[data-testid="root-link"]', text: project.path).click
+ find('[data-testid="root-link"]', text: project.name).click
expect(page).to have_current_path(project_path(project))
expect(page).to have_content(project.name)
diff --git a/spec/features/groups/participants_autocomplete_spec.rb b/spec/features/groups/participants_autocomplete_spec.rb
new file mode 100644
index 00000000000..a94f95c3ced
--- /dev/null
+++ b/spec/features/groups/participants_autocomplete_spec.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Group member autocomplete', :js, feature_category: :groups_and_projects do
+ include Features::AutocompleteHelpers
+
+ let_it_be(:group) { create(:group) }
+ let_it_be(:user) { create(:user) }
+
+ before_all do
+ group.add_developer user
+ end
+
+ before do
+ sign_in(user)
+ end
+
+ context 'when editing description of a group milestone' do
+ let_it_be(:noteable) { create(:milestone, group: group) }
+
+ it 'suggests group members' do
+ visit edit_group_milestone_path(group, noteable)
+
+ fill_in 'Description', with: '@'
+
+ expect(find_autocomplete_menu).to have_text(user.username)
+ end
+
+ context 'for a member of a private group invited to the group' do
+ let_it_be(:private_group) { create(:group, :private) }
+ let_it_be(:private_group_member) { create(:user, username: 'private-a') }
+
+ before_all do
+ private_group.add_developer private_group_member
+
+ create(:group_group_link, shared_group: group, shared_with_group: private_group)
+ end
+
+ it 'suggests member of private group as well' do
+ visit edit_group_milestone_path(group, noteable)
+
+ fill_in 'Description', with: '@'
+
+ expect(find_autocomplete_menu).to have_text(private_group_member.username)
+ expect(find_autocomplete_menu).to have_text(user.username)
+ end
+ end
+ end
+end
diff --git a/spec/features/groups/settings/access_tokens_spec.rb b/spec/features/groups/settings/access_tokens_spec.rb
index cb92f9abdf5..c7e81803694 100644
--- a/spec/features/groups/settings/access_tokens_spec.rb
+++ b/spec/features/groups/settings/access_tokens_spec.rb
@@ -36,7 +36,7 @@ RSpec.describe 'Group > Settings > Access Tokens', :js, feature_category: :syste
it_behaves_like 'resource access tokens creation', 'group'
context 'when token creation is not allowed' do
- it_behaves_like 'resource access tokens creation disallowed', 'Group access token creation is disabled in this group. You can still use and manage existing tokens.'
+ it_behaves_like 'resource access tokens creation disallowed', 'Group access token creation is disabled in this group.'
end
end
diff --git a/spec/features/groups_spec.rb b/spec/features/groups_spec.rb
index de4b9964b98..67133b1856f 100644
--- a/spec/features/groups_spec.rb
+++ b/spec/features/groups_spec.rb
@@ -461,9 +461,11 @@ RSpec.describe 'Group', feature_category: :groups_and_projects do
describe 'new subgroup / project button' do
let_it_be(:group, reload: true) do
- create(:group,
- project_creation_level: Gitlab::Access::NO_ONE_PROJECT_ACCESS,
- subgroup_creation_level: Gitlab::Access::OWNER_SUBGROUP_ACCESS)
+ create(
+ :group,
+ project_creation_level: Gitlab::Access::NO_ONE_PROJECT_ACCESS,
+ subgroup_creation_level: Gitlab::Access::OWNER_SUBGROUP_ACCESS
+ )
end
before do
diff --git a/spec/features/help_pages_spec.rb b/spec/features/help_pages_spec.rb
index 905c5e25f6e..627326dde18 100644
--- a/spec/features/help_pages_spec.rb
+++ b/spec/features/help_pages_spec.rb
@@ -47,9 +47,11 @@ RSpec.describe 'Help Pages', feature_category: :shared do
describe 'when help page is customized' do
before do
- stub_application_setting(help_page_hide_commercial_content: true,
- help_page_text: 'My Custom Text',
- help_page_support_url: 'http://example.com/help')
+ stub_application_setting(
+ help_page_hide_commercial_content: true,
+ help_page_text: 'My Custom Text',
+ help_page_support_url: 'http://example.com/help'
+ )
sign_in(create(:user))
visit help_path
diff --git a/spec/features/ics/dashboard_issues_spec.rb b/spec/features/ics/dashboard_issues_spec.rb
index 7115bd7dff7..00318f83105 100644
--- a/spec/features/ics/dashboard_issues_spec.rb
+++ b/spec/features/ics/dashboard_issues_spec.rb
@@ -29,9 +29,11 @@ RSpec.describe 'Dashboard Issues Calendar Feed', feature_category: :team_plannin
context 'with no referer' do
it 'renders calendar feed' do
sign_in user
- visit issues_dashboard_path(:ics,
- due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
- sort: 'closest_future_date')
+ visit issues_dashboard_path(
+ :ics,
+ due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
+ sort: 'closest_future_date'
+ )
expect(response_headers['Content-Type']).to have_content('text/calendar')
expect(body).to have_text('BEGIN:VCALENDAR')
@@ -42,9 +44,11 @@ RSpec.describe 'Dashboard Issues Calendar Feed', feature_category: :team_plannin
it 'renders calendar feed as text/plain' do
sign_in user
page.driver.header('Referer', issues_dashboard_url(host: Settings.gitlab.base_url))
- visit issues_dashboard_path(:ics,
- due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
- sort: 'closest_future_date')
+ visit issues_dashboard_path(
+ :ics,
+ due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
+ sort: 'closest_future_date'
+ )
expect(response_headers['Content-Type']).to have_content('text/plain')
expect(body).to have_text('BEGIN:VCALENDAR')
@@ -54,10 +58,12 @@ RSpec.describe 'Dashboard Issues Calendar Feed', feature_category: :team_plannin
context 'when filtered by milestone' do
it 'renders calendar feed' do
sign_in user
- visit issues_dashboard_path(:ics,
- due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
- sort: 'closest_future_date',
- milestone_title: milestone.title)
+ visit issues_dashboard_path(
+ :ics,
+ due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
+ sort: 'closest_future_date',
+ milestone_title: milestone.title
+ )
expect(response_headers['Content-Type']).to have_content('text/calendar')
expect(body).to have_text('BEGIN:VCALENDAR')
@@ -69,10 +75,12 @@ RSpec.describe 'Dashboard Issues Calendar Feed', feature_category: :team_plannin
it 'renders calendar feed' do
personal_access_token = create(:personal_access_token, user: user)
- visit issues_dashboard_path(:ics,
- due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
- sort: 'closest_future_date',
- private_token: personal_access_token.token)
+ visit issues_dashboard_path(
+ :ics,
+ due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
+ sort: 'closest_future_date',
+ private_token: personal_access_token.token
+ )
expect(response_headers['Content-Type']).to have_content('text/calendar')
expect(body).to have_text('BEGIN:VCALENDAR')
@@ -81,10 +89,12 @@ RSpec.describe 'Dashboard Issues Calendar Feed', feature_category: :team_plannin
context 'when authenticated via feed token' do
it 'renders calendar feed' do
- visit issues_dashboard_path(:ics,
- due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
- sort: 'closest_future_date',
- feed_token: user.feed_token)
+ visit issues_dashboard_path(
+ :ics,
+ due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
+ sort: 'closest_future_date',
+ feed_token: user.feed_token
+ )
expect(response_headers['Content-Type']).to have_content('text/calendar')
expect(body).to have_text('BEGIN:VCALENDAR')
@@ -93,15 +103,24 @@ RSpec.describe 'Dashboard Issues Calendar Feed', feature_category: :team_plannin
context 'issue with due date' do
let!(:issue) do
- create(:issue, author: user, assignees: [assignee], project: project, title: 'test title',
- description: 'test desc', due_date: Date.tomorrow)
+ create(
+ :issue,
+ author: user,
+ assignees: [assignee],
+ project: project,
+ title: 'test title',
+ description: 'test desc',
+ due_date: Date.tomorrow
+ )
end
it 'renders issue fields' do
- visit issues_dashboard_path(:ics,
- due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
- sort: 'closest_future_date',
- feed_token: user.feed_token)
+ visit issues_dashboard_path(
+ :ics,
+ due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
+ sort: 'closest_future_date',
+ feed_token: user.feed_token
+ )
expect(body).to have_text("SUMMARY:test title (in #{project.full_path})")
# line length for ics is 75 chars
diff --git a/spec/features/ics/group_issues_spec.rb b/spec/features/ics/group_issues_spec.rb
index 164f5df7cc5..ce9f5638a00 100644
--- a/spec/features/ics/group_issues_spec.rb
+++ b/spec/features/ics/group_issues_spec.rb
@@ -71,8 +71,15 @@ RSpec.describe 'Group Issues Calendar Feed', feature_category: :groups_and_proje
context 'issue with due date' do
let!(:issue) do
- create(:issue, author: user, assignees: [assignee], project: project, title: 'test title',
- description: 'test desc', due_date: Date.tomorrow)
+ create(
+ :issue,
+ author: user,
+ assignees: [assignee],
+ project: project,
+ title: 'test title',
+ description: 'test desc',
+ due_date: Date.tomorrow
+ )
end
it 'renders issue fields' do
diff --git a/spec/features/ics/project_issues_spec.rb b/spec/features/ics/project_issues_spec.rb
index daad6f1df2f..c26147e0310 100644
--- a/spec/features/ics/project_issues_spec.rb
+++ b/spec/features/ics/project_issues_spec.rb
@@ -70,8 +70,15 @@ RSpec.describe 'Project Issues Calendar Feed', feature_category: :groups_and_pro
context 'issue with due date' do
let!(:issue) do
- create(:issue, author: user, assignees: [assignee], project: project, title: 'test title',
- description: 'test desc', due_date: Date.tomorrow)
+ create(
+ :issue,
+ author: user,
+ assignees: [assignee],
+ project: project,
+ title: 'test title',
+ description: 'test desc',
+ due_date: Date.tomorrow
+ )
end
it 'renders issue fields' do
diff --git a/spec/features/incidents/incident_timeline_events_spec.rb b/spec/features/incidents/incident_timeline_events_spec.rb
index 4d51ed652c9..bd3658ab60f 100644
--- a/spec/features/incidents/incident_timeline_events_spec.rb
+++ b/spec/features/incidents/incident_timeline_events_spec.rb
@@ -86,14 +86,14 @@ RSpec.describe 'Incident timeline events', :js, feature_category: :incident_mana
def trigger_dropdown_action(text)
click_button _('More actions')
- page.within '.gl-dropdown-contents' do
- page.find('.gl-dropdown-item', text: text).click
+ page.within '[data-testid="disclosure-content"]' do
+ page.find('[data-testid="disclosure-dropdown-item"]', text: text).click
end
end
end
it_behaves_like 'for each incident details route',
- 'add, edit, and delete timeline events',
- tab_text: s_('Incident|Timeline'),
- tab: 'timeline'
+ 'add, edit, and delete timeline events',
+ tab_text: s_('Incident|Timeline'),
+ tab: 'timeline'
end
diff --git a/spec/features/incidents/user_views_incident_spec.rb b/spec/features/incidents/user_views_incident_spec.rb
index 8739c99bdd0..bbf579b09a8 100644
--- a/spec/features/incidents/user_views_incident_spec.rb
+++ b/spec/features/incidents/user_views_incident_spec.rb
@@ -31,10 +31,12 @@ RSpec.describe "User views incident", feature_category: :incident_management do
describe 'user actions' do
it 'shows the merge request and incident actions', :js, :aggregate_failures do
- expected_href = new_project_issue_path(project,
- issuable_template: 'incident',
- issue: { issue_type: 'incident' },
- add_related_issue: incident.iid)
+ expected_href = new_project_issue_path(
+ project,
+ issuable_template: 'incident',
+ issue: { issue_type: 'incident' },
+ add_related_issue: incident.iid
+ )
click_button 'Incident actions'
diff --git a/spec/features/invites_spec.rb b/spec/features/invites_spec.rb
index a1e75a94326..03ec72980e5 100644
--- a/spec/features/invites_spec.rb
+++ b/spec/features/invites_spec.rb
@@ -232,7 +232,8 @@ RSpec.describe 'Group or Project invitations', :aggregate_failures, feature_cate
end
context 'when the user signs up for an account with the invitation email address' do
- it 'redirects to the most recent membership activity page with all invitations automatically accepted' do
+ it 'redirects to the most recent membership activity page with all invitations automatically accepted',
+ quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/417092' do
fill_in_sign_up_form(new_user)
fill_in_welcome_form
diff --git a/spec/features/issuables/issuable_list_spec.rb b/spec/features/issuables/issuable_list_spec.rb
index c979aff2147..7bf9620f282 100644
--- a/spec/features/issuables/issuable_list_spec.rb
+++ b/spec/features/issuables/issuable_list_spec.rb
@@ -99,9 +99,7 @@ RSpec.describe 'issuable list', :js, feature_category: :team_planning do
if issuable_type == :issue
issue = Issue.reorder(:iid).first
- merge_request = create(:merge_request,
- source_project: project,
- source_branch: generate(:branch))
+ merge_request = create(:merge_request, source_project: project, source_branch: generate(:branch))
create(:merge_requests_closing_issues, issue: issue, merge_request: merge_request)
end
diff --git a/spec/features/issuables/markdown_references/jira_spec.rb b/spec/features/issuables/markdown_references/jira_spec.rb
index 887bc7d0c87..e072231c6e9 100644
--- a/spec/features/issuables/markdown_references/jira_spec.rb
+++ b/spec/features/issuables/markdown_references/jira_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe "Jira", :js, feature_category: :team_planning do
+ include ContentEditorHelpers
+
let(:user) { create(:user) }
let(:actual_project) { create(:project, :public, :repository) }
let(:merge_request) { create(:merge_request, target_project: actual_project, source_project: actual_project) }
@@ -24,6 +26,7 @@ RSpec.describe "Jira", :js, feature_category: :team_planning do
sign_in(user)
visit(merge_request_path(merge_request))
+ close_rich_text_promo_popover_if_present
build_note
end
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 7f6a044a575..d35f037247d 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
@@ -12,9 +12,9 @@ RSpec.describe 'Resolving all open threads in a merge request from an issue', :j
url = new_project_issue_path(project, merge_request_to_resolve_discussions_of: merge_request.iid)
if title.empty?
- %Q{a[href="#{url}"]}
+ %{a[href="#{url}"]}
else
- %Q{a[title="#{title}"][href="#{url}"]}
+ %{a[title="#{title}"][href="#{url}"]}
end
end
@@ -30,7 +30,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
- find('.discussions-counter .dropdown-toggle').click
+ find('.discussions-counter .gl-new-dropdown-toggle').click
within('.discussions-counter') do
expect(page).to have_link(_("Resolve all with new issue"), href: new_project_issue_path(project, merge_request_to_resolve_discussions_of: merge_request.iid))
@@ -49,7 +49,7 @@ RSpec.describe 'Resolving all open threads in a merge request from an issue', :j
context 'creating an issue for threads' do
before do
- find('.discussions-counter .dropdown-toggle').click
+ find('.discussions-counter .gl-new-dropdown-toggle').click
find(resolve_all_discussions_link_selector).click
end
@@ -65,7 +65,7 @@ RSpec.describe 'Resolving all open threads in a merge request from an issue', :j
before do
project.project_feature.update_attribute(:issues_access_level, ProjectFeature::DISABLED)
visit project_merge_request_path(project, merge_request)
- find('.discussions-counter .dropdown-toggle').click
+ find('.discussions-counter .gl-new-dropdown-toggle').click
end
it 'does not show a link to create a new issue' do
diff --git a/spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb b/spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb
index 3a32bd34af8..73a920421a3 100644
--- a/spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb
+++ b/spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb
@@ -74,8 +74,11 @@ RSpec.describe 'Resolve an open thread in a merge request by creating an issue',
before do
project.add_reporter(user)
sign_in user
- visit new_project_issue_path(project, merge_request_to_resolve_discussions_of: merge_request.iid,
- discussion_to_resolve: discussion.id)
+ visit new_project_issue_path(
+ project,
+ merge_request_to_resolve_discussions_of: merge_request.iid,
+ discussion_to_resolve: discussion.id
+ )
end
it 'shows a notice to ask someone else to resolve the threads' do
diff --git a/spec/features/issues/filtered_search/filter_issues_spec.rb b/spec/features/issues/filtered_search/filter_issues_spec.rb
index a65befc3115..b9562f12ef2 100644
--- a/spec/features/issues/filtered_search/filter_issues_spec.rb
+++ b/spec/features/issues/filtered_search/filter_issues_spec.rb
@@ -455,19 +455,6 @@ RSpec.describe 'Filter issues', :js, feature_category: :team_planning do
expect(page).to have_content(issue.title)
end
- it 'filters issues by searched text containing special characters' do
- stub_feature_flags(issues_full_text_search: false)
-
- issue = create(:issue, project: project, author: user, title: "issue with !@\#{$%^&*()-+")
-
- search = '!@#{$%^&*()-+'
- submit_search_term(search)
-
- expect_issues_list_count(1)
- expect_search_term(search)
- expect(page).to have_content(issue.title)
- end
-
it 'does not show any issues' do
search = 'testing'
submit_search_term(search)
diff --git a/spec/features/issues/form_spec.rb b/spec/features/issues/form_spec.rb
index 9702e43a559..5f7a4f26a98 100644
--- a/spec/features/issues/form_spec.rb
+++ b/spec/features/issues/form_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe 'New/edit issue', :js, feature_category: :team_planning do
include ActionView::Helpers::JavaScriptHelper
include ListboxHelpers
+ include ContentEditorHelpers
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { create(:user) }
@@ -36,6 +37,7 @@ RSpec.describe 'New/edit issue', :js, feature_category: :team_planning do
describe 'new issue' do
before do
visit new_project_issue_path(project)
+ close_rich_text_promo_popover_if_present
end
describe 'shorten users API pagination limit' do
@@ -745,7 +747,7 @@ RSpec.describe 'New/edit issue', :js, feature_category: :team_planning do
context 'with the visible_label_selection_on_metadata feature flag enabled', :js do
let(:visible_label_selection_on_metadata) { true }
- it 'creates project label from dropdown' do
+ it 'creates project label from dropdown', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/416585' do
find('[data-testid="labels-select-dropdown-contents"] button').click
wait_for_all_requests
diff --git a/spec/features/issues/gfm_autocomplete_spec.rb b/spec/features/issues/gfm_autocomplete_spec.rb
index 665c7307231..47e9575da54 100644
--- a/spec/features/issues/gfm_autocomplete_spec.rb
+++ b/spec/features/issues/gfm_autocomplete_spec.rb
@@ -4,6 +4,8 @@ require 'spec_helper'
RSpec.describe 'GFM autocomplete', :js, feature_category: :team_planning do
include CookieHelper
+ include Features::AutocompleteHelpers
+ include ContentEditorHelpers
let_it_be(:user) { create(:user, name: '💃speciąl someone💃', username: 'someone.special') }
let_it_be(:user2) { create(:user, name: 'Marge Simpson', username: 'msimpson') }
@@ -31,6 +33,7 @@ RSpec.describe 'GFM autocomplete', :js, feature_category: :team_planning do
before do
sign_in(user)
visit new_project_issue_path(project)
+ close_rich_text_promo_popover_if_present
wait_for_requests
end
@@ -49,6 +52,7 @@ RSpec.describe 'GFM autocomplete', :js, feature_category: :team_planning do
sign_in(user)
set_cookie('new-actions-popover-viewed', 'true')
visit project_issue_path(project, issue_to_edit)
+ close_rich_text_promo_popover_if_present
wait_for_requests
end
@@ -84,6 +88,7 @@ RSpec.describe 'GFM autocomplete', :js, feature_category: :team_planning do
before do
sign_in(user)
visit project_issue_path(project, issue)
+ close_rich_text_promo_popover_if_present
wait_for_requests
end
@@ -453,12 +458,4 @@ RSpec.describe 'GFM autocomplete', :js, feature_category: :team_planning do
wait_for_requests
end
-
- def find_autocomplete_menu
- find('.atwho-view ul', visible: true)
- end
-
- def find_highlighted_autocomplete_item
- find('.atwho-view li.cur', visible: true)
- end
end
diff --git a/spec/features/issues/markdown_toolbar_spec.rb b/spec/features/issues/markdown_toolbar_spec.rb
index 5cabaf16960..b7a0949edce 100644
--- a/spec/features/issues/markdown_toolbar_spec.rb
+++ b/spec/features/issues/markdown_toolbar_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'Issue markdown toolbar', :js, feature_category: :team_planning do
+ include ContentEditorHelpers
+
let_it_be(:project) { create(:project, :public) }
let_it_be(:issue) { create(:issue, project: project) }
let_it_be(:user) { create(:user) }
@@ -11,6 +13,7 @@ RSpec.describe 'Issue markdown toolbar', :js, feature_category: :team_planning d
sign_in(user)
visit project_issue_path(project, issue)
+ close_rich_text_promo_popover_if_present
end
it "doesn't include first new line when adding bold" do
@@ -32,4 +35,17 @@ RSpec.describe 'Issue markdown toolbar', :js, feature_category: :team_planning d
expect(find_field('Comment').value).to eq("test\n_underline_\n")
end
+
+ it "makes sure bold works fine after preview" do
+ fill_in 'Comment', with: "test"
+
+ click_button 'Preview'
+ click_button 'Continue editing'
+
+ page.evaluate_script('document.getElementById("note-body").setSelectionRange(0, 4)')
+
+ click_button 'Add bold text'
+
+ expect(find_field('Comment').value).to eq("**test**")
+ end
end
diff --git a/spec/features/issues/note_polling_spec.rb b/spec/features/issues/note_polling_spec.rb
index dae71481352..23f9347d726 100644
--- a/spec/features/issues/note_polling_spec.rb
+++ b/spec/features/issues/note_polling_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe 'Issue notes polling', :js, feature_category: :team_planning do
include NoteInteractionHelpers
+ include ContentEditorHelpers
let(:project) { create(:project, :public) }
let(:issue) { create(:issue, project: project) }
@@ -11,6 +12,7 @@ RSpec.describe 'Issue notes polling', :js, feature_category: :team_planning do
describe 'creates' do
before do
visit project_issue_path(project, issue)
+ close_rich_text_promo_popover_if_present
end
it 'displays the new comment' do
@@ -31,6 +33,7 @@ RSpec.describe 'Issue notes polling', :js, feature_category: :team_planning do
before do
sign_in(user)
visit project_issue_path(project, issue)
+ close_rich_text_promo_popover_if_present
end
it 'displays the updated content' do
@@ -59,7 +62,10 @@ RSpec.describe 'Issue notes polling', :js, feature_category: :team_planning do
update_note(existing_note, updated_text)
+ expect(page).to have_selector(".alert")
+
find("#note_#{existing_note.id} .note-edit-cancel").click
+ click_button('Cancel editing')
expect(page).to have_selector("#note_#{existing_note.id}", text: updated_text)
end
diff --git a/spec/features/issues/notes_on_issues_spec.rb b/spec/features/issues/notes_on_issues_spec.rb
index 8d6262efa53..62855c7467f 100644
--- a/spec/features/issues/notes_on_issues_spec.rb
+++ b/spec/features/issues/notes_on_issues_spec.rb
@@ -3,9 +3,12 @@
require 'spec_helper'
RSpec.describe 'Create notes on issues', :js, feature_category: :team_planning do
+ include ContentEditorHelpers
+
let(:user) { create(:user) }
def submit_comment(text)
+ close_rich_text_promo_popover_if_present
fill_in 'note[note]', with: text
click_button 'Comment'
wait_for_requests
diff --git a/spec/features/issues/related_issues_spec.rb b/spec/features/issues/related_issues_spec.rb
index f460b4b1c7f..5102eeb2511 100644
--- a/spec/features/issues/related_issues_spec.rb
+++ b/spec/features/issues/related_issues_spec.rb
@@ -22,6 +22,10 @@ RSpec.describe 'Related issues', :js, feature_category: :team_planning do
let_it_be(:private_issue) { create(:issue, project: private_project) }
let_it_be(:public_issue) { create(:issue, project: public_project) }
+ before do
+ stub_feature_flags(move_close_into_dropdown: false)
+ end
+
context 'widget visibility' do
context 'when not logged in' do
it 'does not show widget when internal project' do
diff --git a/spec/features/issues/service_desk_spec.rb b/spec/features/issues/service_desk_spec.rb
index 0cadeb62fa2..923967c52c0 100644
--- a/spec/features/issues/service_desk_spec.rb
+++ b/spec/features/issues/service_desk_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Service Desk Issue Tracker', :js, feature_category: :team_planning do
+RSpec.describe 'Service Desk Issue Tracker', :js, feature_category: :service_desk do
let(:project) { create(:project, :private, service_desk_enabled: true) }
let_it_be(:user) { create(:user) }
@@ -15,6 +15,7 @@ RSpec.describe 'Service Desk Issue Tracker', :js, feature_category: :team_planni
project.add_maintainer(user)
sign_in(user)
+ stub_feature_flags(service_desk_vue_list: false)
end
describe 'navigation to service desk' do
@@ -176,5 +177,69 @@ RSpec.describe 'Service Desk Issue Tracker', :js, feature_category: :team_planni
end
end
end
+
+ context 'when service_desk_vue_list feature flag is enabled' do
+ before do
+ stub_feature_flags(service_desk_vue_list: true)
+ stub_feature_flags(frontend_caching: true)
+ end
+
+ context 'when there are issues' do
+ let_it_be(:project) { create(:project, :private, service_desk_enabled: true) }
+ let_it_be(:other_user) { create(:user) }
+ let_it_be(:service_desk_issue) { create(:issue, project: project, title: 'Help from email', author: support_bot, service_desk_reply_to: 'service.desk@example.com') }
+ let_it_be(:other_user_issue) { create(:issue, project: project, author: other_user) }
+
+ describe 'service desk info content' do
+ before do
+ visit service_desk_project_issues_path(project)
+ end
+
+ it 'displays the small info box, documentation, a button to configure service desk, and the address' do
+ aggregate_failures do
+ expect(page).to have_link('Learn more', href: help_page_path('user/project/service_desk'))
+ expect(page).not_to have_link('Enable Service Desk')
+ expect(page).to have_content(project.service_desk_address)
+ end
+ end
+ end
+
+ describe 'issues list' do
+ before do
+ visit service_desk_project_issues_path(project)
+ end
+
+ it 'only displays issues created by support bot' do
+ expect(page).to have_selector('.issues-list .issue', count: 1)
+ expect(page).to have_text('Help from email')
+ expect(page).not_to have_text('Unrelated issue')
+ end
+
+ it 'shows service_desk_reply_to in issues list' do
+ expect(page).to have_text('by GitLab Support Bot')
+ end
+ end
+ end
+ end
+
+ context 'for feature flags' do
+ let(:service_desk_issue) { create(:issue, project: project, author: support_bot, service_desk_reply_to: 'service.desk@example.com') }
+
+ before do
+ visit project_issue_path(project, service_desk_issue)
+ end
+
+ it 'pushes the service_desk_ticket feature flag to frontend when available' do
+ stub_feature_flags(service_desk_ticket: true)
+
+ expect(page).to have_pushed_frontend_feature_flags(serviceDeskTicket: true)
+ end
+
+ it 'does not push the service_desk_ticket feature flag to frontend when not available' do
+ stub_feature_flags(service_desk_ticket: false)
+
+ expect(page).not_to have_pushed_frontend_feature_flags(serviceDeskTicket: false)
+ end
+ end
end
end
diff --git a/spec/features/issues/user_comments_on_issue_spec.rb b/spec/features/issues/user_comments_on_issue_spec.rb
index 3ace560fb40..f18992325d8 100644
--- a/spec/features/issues/user_comments_on_issue_spec.rb
+++ b/spec/features/issues/user_comments_on_issue_spec.rb
@@ -3,7 +3,9 @@
require "spec_helper"
RSpec.describe "User comments on issue", :js, feature_category: :team_planning do
+ include Features::AutocompleteHelpers
include Features::NotesHelpers
+ include ContentEditorHelpers
let_it_be(:project) { create(:project, :public) }
let_it_be(:issue) { create(:issue, project: project) }
@@ -14,6 +16,7 @@ RSpec.describe "User comments on issue", :js, feature_category: :team_planning d
sign_in(user)
visit(project_issue_path(project, issue))
+ close_rich_text_promo_popover_if_present
end
context "when adding comments" do
@@ -92,10 +95,4 @@ RSpec.describe "User comments on issue", :js, feature_category: :team_planning d
end
end
end
-
- private
-
- def find_highlighted_autocomplete_item
- find('.atwho-view li.cur', visible: true)
- end
end
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 1050bc2456f..ecb899a7ca2 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
@@ -137,13 +137,25 @@ RSpec.describe 'User creates branch and merge request on issue page', :js, featu
context "when there is a referenced merge request" do
let!(:note) do
- create(:note, :on_issue, :system, project: project, noteable: issue,
- note: "mentioned in #{referenced_mr.to_reference}")
+ create(
+ :note,
+ :on_issue,
+ :system,
+ project: project,
+ noteable: issue,
+ note: "mentioned in #{referenced_mr.to_reference}"
+ )
end
let(:referenced_mr) do
- create(:merge_request, :simple, source_project: project, target_project: project,
- description: "Fixes #{issue.to_reference}", author: user)
+ create(
+ :merge_request,
+ :simple,
+ source_project: project,
+ target_project: project,
+ description: "Fixes #{issue.to_reference}",
+ author: user
+ )
end
before do
diff --git a/spec/features/issues/user_creates_issue_spec.rb b/spec/features/issues/user_creates_issue_spec.rb
index d4148717f0a..76b07d903bc 100644
--- a/spec/features/issues/user_creates_issue_spec.rb
+++ b/spec/features/issues/user_creates_issue_spec.rb
@@ -4,6 +4,7 @@ require "spec_helper"
RSpec.describe "User creates issue", feature_category: :team_planning do
include DropzoneHelper
+ include ContentEditorHelpers
let_it_be(:project) { create(:project_empty_repo, :public) }
let_it_be(:user) { create(:user) }
@@ -41,6 +42,7 @@ RSpec.describe "User creates issue", feature_category: :team_planning do
sign_in(user)
visit(new_project_issue_path(project))
+ close_rich_text_promo_popover_if_present
end
context 'available metadata' do
@@ -159,7 +161,7 @@ RSpec.describe "User creates issue", feature_category: :team_planning do
click_button 'Create issue'
page.within '.issuable-sidebar' do
- expect(page).to have_content date.to_s(:medium)
+ expect(page).to have_content date.to_fs(:medium)
end
end
end
diff --git a/spec/features/issues/user_edits_issue_spec.rb b/spec/features/issues/user_edits_issue_spec.rb
index bc20660d2a0..0938f9c7d12 100644
--- a/spec/features/issues/user_edits_issue_spec.rb
+++ b/spec/features/issues/user_edits_issue_spec.rb
@@ -4,6 +4,7 @@ require "spec_helper"
RSpec.describe "Issues > User edits issue", :js, feature_category: :team_planning do
include CookieHelper
+ include ContentEditorHelpers
let_it_be(:project) { create(:project_empty_repo, :public) }
let_it_be(:project_with_milestones) { create(:project_empty_repo, :public) }
@@ -27,6 +28,7 @@ RSpec.describe "Issues > User edits issue", :js, feature_category: :team_plannin
before do
stub_licensed_features(multiple_issue_assignees: false)
visit edit_project_issue_path(project, issue)
+ close_rich_text_promo_popover_if_present
end
it_behaves_like 'edits content using the content editor'
@@ -82,7 +84,7 @@ RSpec.describe "Issues > User edits issue", :js, feature_category: :team_plannin
click_button _('Save changes')
page.within '.issuable-sidebar' do
- expect(page).to have_content date.to_s(:medium)
+ expect(page).to have_content date.to_fs(:medium)
end
end
@@ -125,7 +127,7 @@ RSpec.describe "Issues > User edits issue", :js, feature_category: :team_plannin
expect(issuable_form).to have_selector(markdown_field_focused_selector)
page.within issuable_form do
- click_button("Switch to rich text")
+ click_button("Switch to rich text editing")
end
expect(issuable_form).not_to have_selector(content_editor_focused_selector)
@@ -137,7 +139,7 @@ RSpec.describe "Issues > User edits issue", :js, feature_category: :team_plannin
expect(issuable_form).to have_selector(content_editor_focused_selector)
page.within issuable_form do
- click_button("Switch to Markdown")
+ click_button("Switch to plain text editing")
end
expect(issuable_form).not_to have_selector(markdown_field_focused_selector)
diff --git a/spec/features/issues/user_filters_issues_spec.rb b/spec/features/issues/user_filters_issues_spec.rb
index 9f69e94b86c..593b43698a2 100644
--- a/spec/features/issues/user_filters_issues_spec.rb
+++ b/spec/features/issues/user_filters_issues_spec.rb
@@ -8,11 +8,13 @@ RSpec.describe 'User filters issues', :js, feature_category: :team_planning do
before do
%w[foobar barbaz].each do |title|
- create(:issue,
- author: user,
- assignees: [user],
- project: project,
- title: title)
+ create(
+ :issue,
+ author: user,
+ assignees: [user],
+ project: project,
+ title: title
+ )
end
@issue = Issue.find_by(title: 'foobar')
diff --git a/spec/features/issues/user_interacts_with_awards_spec.rb b/spec/features/issues/user_interacts_with_awards_spec.rb
index 539e429534e..e1099ba242e 100644
--- a/spec/features/issues/user_interacts_with_awards_spec.rb
+++ b/spec/features/issues/user_interacts_with_awards_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe 'User interacts with awards', feature_category: :team_planning do
include MobileHelpers
+ include ContentEditorHelpers
let(:user) { create(:user) }
@@ -16,6 +17,7 @@ RSpec.describe 'User interacts with awards', feature_category: :team_planning do
sign_in(user)
visit(project_issue_path(project, issue))
+ close_rich_text_promo_popover_if_present
end
it 'toggles the thumbsup award emoji', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/27959' do
diff --git a/spec/features/issues/user_sees_sidebar_updates_in_realtime_spec.rb b/spec/features/issues/user_sees_sidebar_updates_in_realtime_spec.rb
index 91b18454af5..ef448c06a3f 100644
--- a/spec/features/issues/user_sees_sidebar_updates_in_realtime_spec.rb
+++ b/spec/features/issues/user_sees_sidebar_updates_in_realtime_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'Issues > Real-time sidebar', :js, :with_license, feature_category: :team_planning do
+ include ContentEditorHelpers
+
let_it_be(:project) { create(:project, :public) }
let_it_be(:issue) { create(:issue, project: project) }
let_it_be(:user) { create(:user) }
@@ -20,6 +22,7 @@ RSpec.describe 'Issues > Real-time sidebar', :js, :with_license, feature_categor
using_session :other_session do
visit project_issue_path(project, issue)
+ close_rich_text_promo_popover_if_present
expect(page.find('.assignee')).to have_content 'None'
end
@@ -43,6 +46,7 @@ RSpec.describe 'Issues > Real-time sidebar', :js, :with_license, feature_categor
using_session :other_session do
visit project_issue_path(project, issue)
wait_for_requests
+ close_rich_text_promo_popover_if_present
expect(labels_value).to have_content('None')
end
@@ -50,6 +54,7 @@ RSpec.describe 'Issues > Real-time sidebar', :js, :with_license, feature_categor
visit project_issue_path(project, issue)
wait_for_requests
+ close_rich_text_promo_popover_if_present
expect(labels_value).to have_content('None')
page.within(labels_widget) do
diff --git a/spec/features/issues/user_uses_quick_actions_spec.rb b/spec/features/issues/user_uses_quick_actions_spec.rb
index e85a521e242..dc149ccc698 100644
--- a/spec/features/issues/user_uses_quick_actions_spec.rb
+++ b/spec/features/issues/user_uses_quick_actions_spec.rb
@@ -9,6 +9,7 @@ require 'spec_helper'
# for each existing quick action unless they test something not tested by existing tests.
RSpec.describe 'Issues > User uses quick actions', :js, feature_category: :team_planning do
include Features::NotesHelpers
+ include ContentEditorHelpers
context "issuable common quick actions" do
let(:new_url_opts) { {} }
@@ -34,6 +35,7 @@ RSpec.describe 'Issues > User uses quick actions', :js, feature_category: :team_
sign_in(user)
visit project_issue_path(project, issue)
wait_for_all_requests
+ close_rich_text_promo_popover_if_present
end
after do
diff --git a/spec/features/labels_hierarchy_spec.rb b/spec/features/labels_hierarchy_spec.rb
index e8f40a1ceab..eb79d6e64f3 100644
--- a/spec/features/labels_hierarchy_spec.rb
+++ b/spec/features/labels_hierarchy_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe 'Labels Hierarchy', :js, feature_category: :team_planning do
include FilteredSearchHelpers
+ include ContentEditorHelpers
let!(:user) { create(:user) }
let!(:grandparent) { create(:group) }
@@ -165,6 +166,7 @@ RSpec.describe 'Labels Hierarchy', :js, feature_category: :team_planning do
context 'when creating new issuable' do
before do
visit new_project_issue_path(project_1)
+ close_rich_text_promo_popover_if_present
end
it 'is able to assign ancestor group labels' do
@@ -202,6 +204,7 @@ RSpec.describe 'Labels Hierarchy', :js, feature_category: :team_planning do
context 'when creating new issuable' do
before do
visit new_project_issue_path(project_1)
+ close_rich_text_promo_popover_if_present
end
it 'is able to assign ancestor group labels' do
@@ -233,6 +236,7 @@ RSpec.describe 'Labels Hierarchy', :js, feature_category: :team_planning do
project_1.add_developer(user)
visit project_issue_path(project_1, issue)
+ close_rich_text_promo_popover_if_present
end
it_behaves_like 'assigning labels from sidebar'
diff --git a/spec/features/markdown/keyboard_shortcuts_spec.rb b/spec/features/markdown/keyboard_shortcuts_spec.rb
index cfb8e61689f..6f128e16041 100644
--- a/spec/features/markdown/keyboard_shortcuts_spec.rb
+++ b/spec/features/markdown/keyboard_shortcuts_spec.rb
@@ -102,15 +102,16 @@ RSpec.describe 'Markdown keyboard shortcuts', :js, feature_category: :team_plann
it_behaves_like 'keyboard shortcuts'
it_behaves_like 'no side effects'
- end
- context 'Haml markdown editor' do
- let(:path_to_visit) { new_project_issue_path(project) }
- let(:markdown_field) { find_field('Description') }
- let(:non_markdown_field) { find_field('Title') }
+ context 'if preview is toggled before shortcuts' do
+ before do
+ click_button "Preview"
+ click_button "Continue editing"
+ end
- it_behaves_like 'keyboard shortcuts'
- it_behaves_like 'no side effects'
+ it_behaves_like 'keyboard shortcuts'
+ it_behaves_like 'no side effects'
+ end
end
def type_and_select(text)
diff --git a/spec/features/merge_request/maintainer_edits_fork_spec.rb b/spec/features/merge_request/maintainer_edits_fork_spec.rb
index c9aa22e396b..7603696c60c 100644
--- a/spec/features/merge_request/maintainer_edits_fork_spec.rb
+++ b/spec/features/merge_request/maintainer_edits_fork_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'a maintainer edits files on a source-branch of an MR from a fork', :js, :sidekiq_might_not_need_inline,
-feature_category: :code_review_workflow do
+ feature_category: :code_review_workflow do
include Features::SourceEditorSpecHelpers
include ProjectForksHelper
let(:user) { create(:user, username: 'the-maintainer') }
@@ -12,13 +12,15 @@ feature_category: :code_review_workflow do
let(:source_project) { fork_project(target_project, author, repository: true) }
let(:merge_request) do
- create(:merge_request,
- source_project: source_project,
- target_project: target_project,
- source_branch: 'fix',
- target_branch: 'master',
- author: author,
- allow_collaboration: true)
+ create(
+ :merge_request,
+ source_project: source_project,
+ target_project: target_project,
+ source_branch: 'fix',
+ target_branch: 'master',
+ author: author,
+ allow_collaboration: true
+ )
end
before do
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 e3989a8a192..38291573256 100644
--- a/spec/features/merge_request/user_accepts_merge_request_spec.rb
+++ b/spec/features/merge_request/user_accepts_merge_request_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'User accepts a merge request', :js, :sidekiq_might_not_need_inline, feature_category: :code_review_workflow do
+ include ContentEditorHelpers
+
let(:merge_request) { create(:merge_request, :simple, source_project: project) }
let(:project) { create(:project, :public, :repository) }
let(:user) { create(:user) }
@@ -15,6 +17,7 @@ RSpec.describe 'User accepts a merge request', :js, :sidekiq_might_not_need_inli
context 'presents merged merge request content' do
it 'when merge method is set to merge commit' do
visit(merge_request_path(merge_request))
+ close_rich_text_promo_popover_if_present
click_merge_button
@@ -30,6 +33,7 @@ RSpec.describe 'User accepts a merge request', :js, :sidekiq_might_not_need_inli
merge_request = create(:merge_request, :rebased, source_project: project)
visit(merge_request_path(merge_request))
+ close_rich_text_promo_popover_if_present
click_merge_button
@@ -40,6 +44,7 @@ RSpec.describe 'User accepts a merge request', :js, :sidekiq_might_not_need_inli
merge_request = create(:merge_request, :rebased, source_project: project, squash: true)
visit(merge_request_path(merge_request))
+ close_rich_text_promo_popover_if_present
click_merge_button
@@ -51,6 +56,7 @@ RSpec.describe 'User accepts a merge request', :js, :sidekiq_might_not_need_inli
context 'with removing the source branch' do
before do
visit(merge_request_path(merge_request))
+ close_rich_text_promo_popover_if_present
end
it 'accepts a merge request' do
@@ -69,6 +75,7 @@ RSpec.describe 'User accepts a merge request', :js, :sidekiq_might_not_need_inli
context 'without removing the source branch' do
before do
visit(merge_request_path(merge_request))
+ close_rich_text_promo_popover_if_present
end
it 'accepts a merge request' do
@@ -86,6 +93,7 @@ RSpec.describe 'User accepts a merge request', :js, :sidekiq_might_not_need_inli
context 'when a URL has an anchor' do
before do
visit(merge_request_path(merge_request, anchor: 'note_123'))
+ close_rich_text_promo_popover_if_present
end
it 'accepts a merge request' do
@@ -106,6 +114,7 @@ RSpec.describe 'User accepts a merge request', :js, :sidekiq_might_not_need_inli
merge_request.mark_as_mergeable
visit(merge_request_path(merge_request))
+ close_rich_text_promo_popover_if_present
end
it 'accepts a merge request' do
diff --git a/spec/features/merge_request/user_allows_commits_from_memebers_who_can_merge_spec.rb b/spec/features/merge_request/user_allows_commits_from_memebers_who_can_merge_spec.rb
index 0ff773ef02d..149b2e2bb0f 100644
--- a/spec/features/merge_request/user_allows_commits_from_memebers_who_can_merge_spec.rb
+++ b/spec/features/merge_request/user_allows_commits_from_memebers_who_can_merge_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'create a merge request, allowing commits from members who can merge to the target branch', :js,
-feature_category: :code_review_workflow do
+ feature_category: :code_review_workflow do
include ProjectForksHelper
let(:user) { create(:user) }
let(:target_project) { create(:project, :public, :repository) }
@@ -67,10 +67,12 @@ feature_category: :code_review_workflow do
context 'when a member who can merge tries to edit the option' do
let(:member) { create(:user) }
let(:merge_request) do
- create(:merge_request,
- source_project: source_project,
- target_project: target_project,
- source_branch: 'fixes')
+ create(
+ :merge_request,
+ source_project: source_project,
+ target_project: target_project,
+ source_branch: 'fixes'
+ )
end
before do
diff --git a/spec/features/merge_request/user_closes_reopens_merge_request_state_spec.rb b/spec/features/merge_request/user_closes_reopens_merge_request_state_spec.rb
index 537702df12d..446f6a470de 100644
--- a/spec/features/merge_request/user_closes_reopens_merge_request_state_spec.rb
+++ b/spec/features/merge_request/user_closes_reopens_merge_request_state_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'User closes/reopens a merge request', :js, quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/297500',
- feature_category: :code_review_workflow do
+ feature_category: :code_review_workflow do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { create(:user) }
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 35e2fa2f89c..215fe1f7521 100644
--- a/spec/features/merge_request/user_comments_on_diff_spec.rb
+++ b/spec/features/merge_request/user_comments_on_diff_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe 'User comments on a diff', :js, feature_category: :code_review_workflow do
include MergeRequestDiffHelpers
include RepoHelpers
+ include ContentEditorHelpers
let(:project) { create(:project, :repository) }
let(:merge_request) do
@@ -128,6 +129,30 @@ RSpec.describe 'User comments on a diff', :js, feature_category: :code_review_wo
context 'when adding comments' do
include_examples 'comment on merge request file'
+
+ context 'when adding a diff suggestion in rich text editor' do
+ it 'works on the Overview tab' do
+ click_diff_line(find_by_scrolling("[id='#{sample_commit.line_code}']"))
+
+ page.within('.js-discussion-note-form') do
+ fill_in(:note_note, with: "```suggestion:-0+0\nchanged line\n```")
+ find('.js-comment-button').click
+ end
+
+ visit(merge_request_path(merge_request))
+ close_rich_text_promo_popover_if_present
+
+ page.within('.notes .discussion') do
+ find('.js-vue-discussion-reply').click
+ click_button "Switch to rich text editing"
+ click_button "Insert suggestion"
+ end
+
+ within '[data-testid="content-editor"]' do
+ expect(page).to have_content('Suggested change From line')
+ end
+ end
+ end
end
context 'when adding multiline comments' do
diff --git a/spec/features/merge_request/user_creates_merge_request_spec.rb b/spec/features/merge_request/user_creates_merge_request_spec.rb
index 97b423f2cc2..eab5cee976e 100644
--- a/spec/features/merge_request/user_creates_merge_request_spec.rb
+++ b/spec/features/merge_request/user_creates_merge_request_spec.rb
@@ -110,11 +110,13 @@ RSpec.describe 'User creates a merge request', :js, feature_category: :code_revi
context 'when project is public and merge requests are private' do
let_it_be(:project) do
- create(:project,
- :public,
- :repository,
- group: group,
- merge_requests_access_level: ProjectFeature::DISABLED)
+ create(
+ :project,
+ :public,
+ :repository,
+ group: group,
+ merge_requests_access_level: ProjectFeature::DISABLED
+ )
end
context 'and user is a guest' do
diff --git a/spec/features/merge_request/user_edits_assignees_sidebar_spec.rb b/spec/features/merge_request/user_edits_assignees_sidebar_spec.rb
index fa713bdbc5d..2fcbb4e70c3 100644
--- a/spec/features/merge_request/user_edits_assignees_sidebar_spec.rb
+++ b/spec/features/merge_request/user_edits_assignees_sidebar_spec.rb
@@ -32,6 +32,7 @@ RSpec.describe 'Merge request > User edits assignees sidebar', :js, feature_cate
end
let(:sidebar_assignee_tooltip) { sidebar_assignee_avatar_link['title'] || '' }
+ let(:sidebar_assignee_merge_ability) { sidebar_assignee_avatar_link['data-cannot-merge'] || '' }
context 'when GraphQL assignees widget feature flag is disabled' do
let(:sidebar_assignee_dropdown_item) do
@@ -57,13 +58,13 @@ RSpec.describe 'Merge request > User edits assignees sidebar', :js, feature_cate
wait_for_requests
end
- shared_examples 'when assigned' do |expected_tooltip: ''|
+ shared_examples 'when assigned' do |expected_tooltip: '', expected_cannot_merge: ''|
it 'shows assignee name' do
expect(sidebar_assignee_block).to have_text(assignee.name)
end
- it "shows assignee tooltip '#{expected_tooltip}'" do
- expect(sidebar_assignee_tooltip).to eql(expected_tooltip)
+ it "sets data-cannot-merge to '#{expected_cannot_merge}'" do
+ expect(sidebar_assignee_merge_ability).to eql(expected_cannot_merge)
end
context 'when edit is clicked' do
@@ -88,7 +89,7 @@ RSpec.describe 'Merge request > User edits assignees sidebar', :js, feature_cate
context 'when assigned to developer' do
let(:assignee) { project_developers.last }
- it_behaves_like 'when assigned', expected_tooltip: 'Cannot merge'
+ it_behaves_like 'when assigned', expected_tooltip: 'Cannot merge', expected_cannot_merge: 'true'
end
end
@@ -140,13 +141,13 @@ RSpec.describe 'Merge request > User edits assignees sidebar', :js, feature_cate
wait_for_requests
end
- shared_examples 'when assigned' do |expected_tooltip: ''|
+ shared_examples 'when assigned' do |expected_tooltip: '', expected_cannot_merge: ''|
it 'shows assignee name' do
expect(sidebar_assignee_block).to have_text(assignee.name)
end
- it "shows assignee tooltip '#{expected_tooltip}'" do
- expect(sidebar_assignee_tooltip).to eql(expected_tooltip)
+ it "sets data-cannot-merge to '#{expected_cannot_merge}'" do
+ expect(sidebar_assignee_merge_ability).to eql(expected_cannot_merge)
end
context 'when edit is clicked' do
@@ -169,7 +170,7 @@ RSpec.describe 'Merge request > User edits assignees sidebar', :js, feature_cate
context 'when assigned to developer' do
let(:assignee) { project_developers.last }
- it_behaves_like 'when assigned', expected_tooltip: 'Cannot merge'
+ it_behaves_like 'when assigned', expected_tooltip: 'Cannot merge', expected_cannot_merge: 'true'
end
end
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 584a17ae33d..b1cff72c374 100644
--- a/spec/features/merge_request/user_edits_merge_request_spec.rb
+++ b/spec/features/merge_request/user_edits_merge_request_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'User edits a merge request', :js, feature_category: :code_review_workflow do
+ include ContentEditorHelpers
+
let(:project) { create(:project, :repository) }
let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
let(:user) { create(:user) }
@@ -85,6 +87,8 @@ RSpec.describe 'User edits a merge request', :js, feature_category: :code_review
describe 'changing target branch' do
it 'allows user to change target branch' do
+ close_rich_text_promo_popover_if_present
+
expect(page).to have_content('From master into feature')
first('.js-target-branch').click
diff --git a/spec/features/merge_request/user_edits_mr_spec.rb b/spec/features/merge_request/user_edits_mr_spec.rb
index 76588832ee1..ab7183775b9 100644
--- a/spec/features/merge_request/user_edits_mr_spec.rb
+++ b/spec/features/merge_request/user_edits_mr_spec.rb
@@ -184,7 +184,11 @@ RSpec.describe 'Merge request > User edits MR', feature_category: :code_review_w
it 'allows to unselect "Remove source branch"', :js do
expect(merge_request.merge_params['force_remove_source_branch']).to be_truthy
- visit edit_project_merge_request_path(target_project, merge_request)
+ begin
+ visit edit_project_merge_request_path(target_project, merge_request)
+ rescue Selenium::WebDriver::Error::UnexpectedAlertOpenError
+ end
+
uncheck 'Delete source branch when merge request is accepted'
click_button 'Save changes'
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 a013666a496..a96ec1f68aa 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
@@ -64,7 +64,7 @@ RSpec.describe 'Batch diffs', :js, feature_category: :code_review_workflow do
context 'which is in at least page 2 of the batched pages of diffs' do
it 'scrolls to the correct discussion',
- quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/293814' } do
+ quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/293814' } do
page.within get_first_diff do
click_link('just now')
end
diff --git a/spec/features/merge_request/user_merges_immediately_spec.rb b/spec/features/merge_request/user_merges_immediately_spec.rb
index d47968ebc6b..5fe9947d0df 100644
--- a/spec/features/merge_request/user_merges_immediately_spec.rb
+++ b/spec/features/merge_request/user_merges_immediately_spec.rb
@@ -3,20 +3,28 @@
require 'spec_helper'
RSpec.describe 'Merge requests > User merges immediately', :js, feature_category: :code_review_workflow do
+ include ContentEditorHelpers
+
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
let!(:merge_request) do
- create(:merge_request_with_diffs, source_project: project,
- author: user,
- title: 'Bug NS-04',
- head_pipeline: pipeline,
- source_branch: pipeline.ref)
+ create(
+ :merge_request_with_diffs,
+ source_project: project,
+ author: user,
+ title: 'Bug NS-04',
+ head_pipeline: pipeline,
+ source_branch: pipeline.ref
+ )
end
let(:pipeline) do
- create(:ci_pipeline, project: project,
- ref: 'master',
- sha: project.repository.commit('master').id)
+ create(
+ :ci_pipeline,
+ project: project,
+ ref: 'master',
+ sha: project.repository.commit('master').id
+ )
end
context 'when there is active pipeline for merge request' do
@@ -25,6 +33,7 @@ RSpec.describe 'Merge requests > User merges immediately', :js, feature_category
project.add_maintainer(user)
sign_in(user)
visit project_merge_request_path(project, merge_request)
+ close_rich_text_promo_popover_if_present
end
it 'enables merge immediately' do
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 6ffb33603d5..402405e1fb6 100644
--- a/spec/features/merge_request/user_merges_merge_request_spec.rb
+++ b/spec/features/merge_request/user_merges_merge_request_spec.rb
@@ -3,6 +3,8 @@
require "spec_helper"
RSpec.describe "User merges a merge request", :js, feature_category: :code_review_workflow do
+ include ContentEditorHelpers
+
let(:user) { project.first_owner }
before do
@@ -29,6 +31,7 @@ RSpec.describe "User merges a merge request", :js, feature_category: :code_revie
create(:merge_request, source_project: project, source_branch: 'branch-1')
visit(merge_request_path(merge_request))
+ close_rich_text_promo_popover_if_present
expect(page).to have_css('.js-merge-counter', text: '2')
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 19b5ad0fa84..62404077cea 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
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'Merge request > User merges only if pipeline succeeds', :js, feature_category: :code_review_workflow do
+ include ContentEditorHelpers
+
let(:merge_request) { create(:merge_request_with_diffs) }
let(:project) { merge_request.target_project }
@@ -13,22 +15,6 @@ RSpec.describe 'Merge request > User merges only if pipeline succeeds', :js, fea
context 'project does not have CI enabled' do
it 'allows MR to be merged' do
- stub_feature_flags(auto_merge_labels_mr_widget: false)
-
- visit project_merge_request_path(project, merge_request)
-
- wait_for_requests
-
- page.within('.mr-state-widget') do
- expect(page).to have_button 'Merge'
- end
- end
- end
-
- context 'project does not have CI enabled and auto_merge_labels_mr_widget on' do
- it 'allows MR to be merged' do
- stub_feature_flags(auto_merge_labels_mr_widget: true)
-
visit project_merge_request_path(project, merge_request)
wait_for_requests
@@ -41,89 +27,19 @@ RSpec.describe 'Merge request > User merges only if pipeline succeeds', :js, fea
context 'when project has CI enabled' do
let!(:pipeline) do
- create(:ci_empty_pipeline,
- project: project,
- sha: merge_request.diff_head_sha,
- ref: merge_request.source_branch,
- status: status, head_pipeline_of: merge_request)
+ create(
+ :ci_empty_pipeline,
+ project: project,
+ sha: merge_request.diff_head_sha,
+ ref: merge_request.source_branch,
+ status: status,
+ head_pipeline_of: merge_request
+ )
end
context 'when merge requests can only be merged if the pipeline succeeds' do
before do
project.update_attribute(:only_allow_merge_if_pipeline_succeeds, true)
-
- stub_feature_flags(auto_merge_labels_mr_widget: false)
- end
-
- context 'when CI is running' do
- let(:status) { :running }
-
- it 'does not allow to merge immediately' do
- visit project_merge_request_path(project, merge_request)
-
- wait_for_requests
-
- expect(page).to have_button 'Merge when pipeline succeeds'
- expect(page).not_to have_button '.js-merge-moment'
- end
- end
-
- context 'when CI failed' do
- let(:status) { :failed }
-
- it 'does not allow MR to be merged' do
- visit project_merge_request_path(project, merge_request)
-
- wait_for_requests
-
- expect(page).not_to have_button('Merge', exact: true)
- expect(page).to have_content('Merge blocked: pipeline must succeed. Push a commit that fixes the failure or learn about other solutions.')
- end
- end
-
- context 'when CI canceled' do
- let(:status) { :canceled }
-
- it 'does not allow MR to be merged' do
- visit project_merge_request_path(project, merge_request)
-
- wait_for_requests
-
- expect(page).not_to have_button('Merge', exact: true)
- expect(page).to have_content('Merge blocked: pipeline must succeed. Push a commit that fixes the failure or learn about other solutions.')
- end
- end
-
- context 'when CI succeeded' do
- let(:status) { :success }
-
- it 'allows MR to be merged' do
- visit project_merge_request_path(project, merge_request)
-
- wait_for_requests
-
- expect(page).to have_button('Merge', exact: true)
- end
- end
-
- context 'when CI skipped' do
- let(:status) { :skipped }
-
- it 'does not allow MR to be merged' do
- visit project_merge_request_path(project, merge_request)
-
- wait_for_requests
-
- expect(page).not_to have_button('Merge', exact: true)
- end
- end
- end
-
- context 'when merge requests can only be merged if the pipeline succeeds with auto_merge_labels_mr_widget on' do
- before do
- project.update_attribute(:only_allow_merge_if_pipeline_succeeds, true)
-
- stub_feature_flags(auto_merge_labels_mr_widget: true)
end
context 'when CI is running' do
@@ -193,58 +109,6 @@ RSpec.describe 'Merge request > User merges only if pipeline succeeds', :js, fea
context 'when merge requests can be merged when the build failed' do
before do
project.update_attribute(:only_allow_merge_if_pipeline_succeeds, false)
-
- stub_feature_flags(auto_merge_labels_mr_widget: false)
- end
-
- context 'when CI is running' do
- let(:status) { :running }
-
- it 'allows MR to be merged immediately' do
- visit project_merge_request_path(project, merge_request)
-
- wait_for_requests
-
- expect(page).to have_button 'Merge when pipeline succeeds'
-
- page.find('.js-merge-moment').click
- expect(page).to have_content 'Merge immediately'
- end
- end
-
- context 'when CI failed' do
- let(:status) { :failed }
-
- it 'allows MR to be merged' do
- visit project_merge_request_path(project, merge_request)
-
- wait_for_requests
- page.within('.mr-state-widget') do
- expect(page).to have_button 'Merge'
- end
- end
- end
-
- context 'when CI succeeded' do
- let(:status) { :success }
-
- it 'allows MR to be merged' do
- visit project_merge_request_path(project, merge_request)
-
- wait_for_requests
-
- page.within('.mr-state-widget') do
- expect(page).to have_button 'Merge'
- end
- end
- end
- end
-
- context 'when merge requests can be merged when the build failed with auto_merge_labels_mr_widget on' do
- before do
- project.update_attribute(:only_allow_merge_if_pipeline_succeeds, false)
-
- stub_feature_flags(auto_merge_labels_mr_widget: true)
end
context 'when CI is running' do
@@ -252,6 +116,7 @@ RSpec.describe 'Merge request > User merges only if pipeline succeeds', :js, fea
it 'allows MR to be merged immediately' do
visit project_merge_request_path(project, merge_request)
+ close_rich_text_promo_popover_if_present
wait_for_requests
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 e42e4735ee2..ebec8a6d2ea 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
@@ -6,17 +6,23 @@ RSpec.describe 'Merge request > User merges when pipeline succeeds', :js, featur
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
let(:merge_request) do
- create(:merge_request_with_diffs, source_project: project,
- author: user,
- title: 'Bug NS-04',
- merge_params: { force_remove_source_branch: '1' })
+ create(
+ :merge_request_with_diffs,
+ source_project: project,
+ author: user,
+ title: 'Bug NS-04',
+ merge_params: { force_remove_source_branch: '1' }
+ )
end
let(:pipeline) do
- create(:ci_pipeline, project: project,
- sha: merge_request.diff_head_sha,
- ref: merge_request.source_branch,
- head_pipeline_of: merge_request)
+ create(
+ :ci_pipeline,
+ project: project,
+ sha: merge_request.diff_head_sha,
+ ref: merge_request.source_branch,
+ head_pipeline_of: merge_request
+ )
end
before do
@@ -26,83 +32,6 @@ RSpec.describe 'Merge request > User merges when pipeline succeeds', :js, featur
context 'when there is active pipeline for merge request' do
before do
create(:ci_build, pipeline: pipeline)
- stub_feature_flags(auto_merge_labels_mr_widget: false)
-
- sign_in(user)
- visit project_merge_request_path(project, merge_request)
- end
-
- describe 'enabling Merge when pipeline succeeds' do
- shared_examples 'Merge when pipeline succeeds activator' do
- it 'activates the Merge when pipeline succeeds feature', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/410105' 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 "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
- end
- end
-
- context "when enabled immediately" do
- it_behaves_like 'Merge when pipeline succeeds activator'
- end
-
- context 'when enabled after pipeline status changed', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/258667' do
- before do
- pipeline.run!
-
- # We depend on merge request widget being reloaded
- # so we have to wait for asynchronous call to reload it
- # and have_content expectation handles that.
- #
- expect(page).to have_content "Pipeline ##{pipeline.id} running"
- end
-
- it_behaves_like 'Merge when pipeline succeeds activator'
- end
-
- 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
-
- expect(page).to have_content 'Merge when pipeline succeeds'
- end
-
- it_behaves_like 'Merge when pipeline succeeds activator'
- end
-
- context 'when it was enabled and then canceled' do
- let(:merge_request) do
- create(:merge_request_with_diffs,
- :merge_when_pipeline_succeeds,
- source_project: project,
- title: 'Bug NS-04',
- author: user,
- merge_user: user)
- end
-
- before do
- merge_request.merge_params['force_remove_source_branch'] = '0'
- merge_request.save!
- click_button "Cancel auto-merge"
- end
-
- it_behaves_like 'Merge when pipeline succeeds activator'
- end
- end
- end
-
- context 'when there is active pipeline for merge request with auto_merge_labels_mr_widget on' do
- before do
- create(:ci_build, pipeline: pipeline)
stub_feature_flags(auto_merge_labels_mr_widget: true)
sign_in(user)
@@ -144,12 +73,14 @@ RSpec.describe 'Merge request > User merges when pipeline succeeds', :js, featur
context 'when it was enabled and then canceled' do
let(:merge_request) do
- create(:merge_request_with_diffs,
- :merge_when_pipeline_succeeds,
- source_project: project,
- title: 'Bug NS-04',
- author: user,
- merge_user: user)
+ create(
+ :merge_request_with_diffs,
+ :merge_when_pipeline_succeeds,
+ source_project: project,
+ title: 'Bug NS-04',
+ author: user,
+ merge_user: user
+ )
end
before do
@@ -165,91 +96,15 @@ RSpec.describe 'Merge request > User merges when pipeline succeeds', :js, featur
context 'when merge when pipeline succeeds is enabled' do
let(:merge_request) do
- create(:merge_request_with_diffs, :simple, :merge_when_pipeline_succeeds,
+ create(
+ :merge_request_with_diffs,
+ :simple,
+ :merge_when_pipeline_succeeds,
source_project: project,
author: user,
merge_user: user,
- title: 'MepMep')
- end
-
- let!(:build) do
- create(:ci_build, pipeline: pipeline)
- end
-
- before do
- stub_feature_flags(auto_merge_labels_mr_widget: false)
- sign_in user
- visit project_merge_request_path(project, merge_request)
- end
-
- it 'allows to cancel the automatic merge', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/412416' do
- click_button "Cancel auto-merge"
-
- expect(page).to have_button "Merge when pipeline succeeds"
-
- refresh
-
- expect(page).to have_content "canceled the automatic merge"
- end
-
- context 'when pipeline succeeds' do
- before do
- build.success
- refresh
- end
-
- it 'merges merge request', :sidekiq_might_not_need_inline do
- expect(page).to have_content 'Changes merged'
- expect(merge_request.reload).to be_merged
- end
- end
-
- context 'view merge request with MWPS enabled but automatically merge fails' do
- before do
- merge_request.update!(
- merge_user: merge_request.author,
- merge_error: 'Something went wrong'
- )
- refresh
- end
-
- it 'shows information about the merge error' do
- # Wait for the `ci_status` and `merge_check` requests
- wait_for_requests
-
- page.within('.mr-state-widget') do
- expect(page).to have_content('Something went wrong. Try again.')
- end
- end
- end
-
- context 'view merge request with MWPS enabled but automatically merge fails' do
- before do
- merge_request.update!(
- merge_user: merge_request.author,
- merge_error: 'Something went wrong.'
- )
- refresh
- end
-
- it 'shows information about the merge error' do
- # Wait for the `ci_status` and `merge_check` requests
- wait_for_requests
-
- page.within('.mr-state-widget') do
- expect(page).to have_content('Something went wrong. Try again.')
- end
- end
- end
- end
-
- context 'when merge when pipeline succeeds is enabled and auto_merge_labels_mr_widget on' do
- let(:merge_request) do
- create(:merge_request_with_diffs, :simple, :merge_when_pipeline_succeeds,
- source_project: project,
- author: user,
- merge_user: user,
- title: 'MepMep')
+ title: 'MepMep'
+ )
end
let!(:build) do
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
index 601310cbacf..63f03ae64e0 100644
--- a/spec/features/merge_request/user_opens_checkout_branch_modal_spec.rb
+++ b/spec/features/merge_request/user_opens_checkout_branch_modal_spec.rb
@@ -20,13 +20,15 @@ RSpec.describe 'Merge request > User opens checkout branch modal', :js, feature_
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)
+ 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
diff --git a/spec/features/merge_request/user_posts_notes_spec.rb b/spec/features/merge_request/user_posts_notes_spec.rb
index a749821b083..0278d2af08f 100644
--- a/spec/features/merge_request/user_posts_notes_spec.rb
+++ b/spec/features/merge_request/user_posts_notes_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe 'Merge request > User posts notes', :js, feature_category: :code_review_workflow do
include NoteInteractionHelpers
+ include ContentEditorHelpers
let_it_be(:project) { create(:project, :repository) }
@@ -13,8 +14,7 @@ RSpec.describe 'Merge request > User posts notes', :js, feature_category: :code_
end
let!(:note) do
- create(:note_on_merge_request, :with_attachment, noteable: merge_request,
- project: project)
+ create(:note_on_merge_request, :with_attachment, noteable: merge_request, project: project)
end
before do
@@ -22,6 +22,7 @@ RSpec.describe 'Merge request > User posts notes', :js, feature_category: :code_
sign_in(user)
visit project_merge_request_path(project, merge_request)
+ close_rich_text_promo_popover_if_present
end
subject { page }
@@ -47,8 +48,8 @@ RSpec.describe 'Merge request > User posts notes', :js, feature_category: :code_
it 'has enable submit button, preview button and saves content to local storage' do
page.within('.js-main-target-form') do
page.within('[data-testid="comment-button"]') do
- expect(page).to have_css('.split-content-button')
- expect(page).not_to have_css('.split-content-button[disabled]')
+ expect(page).to have_css('.gl-button')
+ expect(page).not_to have_css('.disabled')
end
expect(page).to have_css('.js-md-preview-button', visible: true)
end
@@ -131,16 +132,16 @@ RSpec.describe 'Merge request > User posts notes', :js, feature_category: :code_
describe 'when previewing a note' do
it 'shows the toolbar buttons when editing a note' do
- page.within('.js-main-target-form') do
- expect(page).to have_css('.md-header-toolbar')
+ page.within('.js-main-target-form .md-header-toolbar') do
+ expect(page).to have_css('button', count: 16)
end
end
it 'hides the toolbar buttons when previewing a note' do
wait_for_requests
click_button("Preview")
- page.within('.js-main-target-form') do
- expect(page).not_to have_css('.md-header-toolbar')
+ page.within('.js-main-target-form .md-header-toolbar') do
+ expect(page).to have_css('button', count: 1)
end
end
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 5da9f4a1f19..e8ffca43aa2 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
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'Merge request > User resolves diff notes and threads', :js, feature_category: :code_review_workflow do
+ include ContentEditorHelpers
+
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
let(:guest) { create(:user) }
@@ -10,9 +12,7 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js, feat
let!(:note) { create(:diff_note_on_merge_request, project: project, noteable: merge_request, note: "| Markdown | Table |\n|-------|---------|\n| first | second |") }
let(:path) { "files/ruby/popen.rb" }
let(:position) do
- build(:text_diff_position,
- file: path, old_line: nil, new_line: 9,
- diff_refs: merge_request.diff_refs)
+ build(:text_diff_position, file: path, old_line: nil, new_line: 9, diff_refs: merge_request.diff_refs)
end
before do
@@ -543,5 +543,7 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js, feat
# Wait for MR widget to load
wait_for_requests
+
+ close_rich_text_promo_popover_if_present
end
end
diff --git a/spec/features/merge_request/user_resolves_outdated_diff_discussions_spec.rb b/spec/features/merge_request/user_resolves_outdated_diff_discussions_spec.rb
index 5c41ac79552..cb57f1fd549 100644
--- a/spec/features/merge_request/user_resolves_outdated_diff_discussions_spec.rb
+++ b/spec/features/merge_request/user_resolves_outdated_diff_discussions_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'Merge request > User resolves outdated diff discussions',
- :js, feature_category: :code_review_workflow do
+ :js, feature_category: :code_review_workflow do
let(:project) { create(:project, :repository, :public) }
let(:merge_request) do
@@ -30,17 +30,21 @@ RSpec.describe 'Merge request > User resolves outdated diff discussions',
end
let!(:outdated_discussion) do
- create(:diff_note_on_merge_request,
- project: project,
- noteable: merge_request,
- position: outdated_position).to_discussion
+ create(
+ :diff_note_on_merge_request,
+ project: project,
+ noteable: merge_request,
+ position: outdated_position
+ ).to_discussion
end
let!(:current_discussion) do
- create(:diff_note_on_merge_request,
- noteable: merge_request,
- project: project,
- position: current_position).to_discussion
+ create(
+ :diff_note_on_merge_request,
+ noteable: merge_request,
+ project: project,
+ position: current_position
+ ).to_discussion
end
before do
diff --git a/spec/features/merge_request/user_resolves_wip_mr_spec.rb b/spec/features/merge_request/user_resolves_wip_mr_spec.rb
index 01cc6bd5167..15a7755429b 100644
--- a/spec/features/merge_request/user_resolves_wip_mr_spec.rb
+++ b/spec/features/merge_request/user_resolves_wip_mr_spec.rb
@@ -6,17 +6,23 @@ RSpec.describe 'Merge request > User resolves Draft', :js, feature_category: :co
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
let(:merge_request) do
- create(:merge_request_with_diffs, source_project: project,
- author: user,
- title: 'Draft: Bug NS-04',
- merge_params: { force_remove_source_branch: '1' })
+ create(
+ :merge_request_with_diffs,
+ source_project: project,
+ author: user,
+ title: 'Draft: Bug NS-04',
+ merge_params: { force_remove_source_branch: '1' }
+ )
end
let(:pipeline) do
- create(:ci_pipeline, project: project,
- sha: merge_request.diff_head_sha,
- ref: merge_request.source_branch,
- head_pipeline_of: merge_request)
+ create(
+ :ci_pipeline,
+ project: project,
+ sha: merge_request.diff_head_sha,
+ ref: merge_request.source_branch,
+ head_pipeline_of: merge_request
+ )
end
before do
diff --git a/spec/features/merge_request/user_reverts_merge_request_spec.rb b/spec/features/merge_request/user_reverts_merge_request_spec.rb
index 8c782056aa4..68adc4d47b6 100644
--- a/spec/features/merge_request/user_reverts_merge_request_spec.rb
+++ b/spec/features/merge_request/user_reverts_merge_request_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'User reverts a merge request', :js, feature_category: :code_review_workflow do
+ include ContentEditorHelpers
+
let(:merge_request) { create(:merge_request, :simple, source_project: project) }
let(:project) { create(:project, :public, :repository) }
let(:user) { create(:user) }
@@ -13,6 +15,7 @@ RSpec.describe 'User reverts a merge request', :js, feature_category: :code_revi
sign_in(user)
visit(merge_request_path(merge_request))
+ close_rich_text_promo_popover_if_present
page.within('.mr-state-widget') do
click_button 'Merge'
diff --git a/spec/features/merge_request/user_sees_deployment_widget_spec.rb b/spec/features/merge_request/user_sees_deployment_widget_spec.rb
index 6dcebad300c..d237faba663 100644
--- a/spec/features/merge_request/user_sees_deployment_widget_spec.rb
+++ b/spec/features/merge_request/user_sees_deployment_widget_spec.rb
@@ -39,7 +39,7 @@ RSpec.describe 'Merge request > User sees deployment widget', :js, feature_categ
wait_for_requests
assert_env_widget("Deployed to", environment.name)
- expect(find('.js-deploy-time')['title']).to eq(deployment.created_at.to_time.in_time_zone.to_s(:medium))
+ expect(find('.js-deploy-time')['title']).to eq(deployment.created_at.to_time.in_time_zone.to_fs(:medium))
end
context 'when a user created a new merge request with the same SHA' do
@@ -115,8 +115,7 @@ RSpec.describe 'Merge request > User sees deployment widget', :js, feature_categ
context 'with stop action' do
let(:manual) do
- create(:ci_build, :manual, pipeline: pipeline,
- name: 'close_app', environment: environment.name)
+ create(:ci_build, :manual, pipeline: pipeline, name: 'close_app', environment: environment.name)
end
before do
@@ -146,8 +145,7 @@ RSpec.describe 'Merge request > User sees deployment widget', :js, feature_categ
context 'with stop action with the review_apps_redeploy_mr_widget feature flag turned on' do
let(:manual) do
- create(:ci_build, :manual, pipeline: pipeline,
- name: 'close_app', environment: environment.name)
+ create(:ci_build, :manual, pipeline: pipeline, name: 'close_app', environment: environment.name)
end
before do
diff --git a/spec/features/merge_request/user_sees_diff_spec.rb b/spec/features/merge_request/user_sees_diff_spec.rb
index 3fb3ef12fcc..57f378a86b6 100644
--- a/spec/features/merge_request/user_sees_diff_spec.rb
+++ b/spec/features/merge_request/user_sees_diff_spec.rb
@@ -77,8 +77,9 @@ RSpec.describe 'Merge request > User sees diff', :js, feature_category: :code_re
sign_in(author_user)
visit diffs_project_merge_request_path(project, merge_request)
- # Throws `Capybara::Poltergeist::InvalidSelector` if we try to use `#hash` syntax
- expect(page).to have_selector(".js-edit-blob", visible: false)
+ first(".js-diff-more-actions").click
+
+ expect(page).to have_selector(".js-edit-blob")
end
end
diff --git a/spec/features/merge_request/user_sees_discussions_navigation_spec.rb b/spec/features/merge_request/user_sees_discussions_navigation_spec.rb
index 338e4329190..4cce40972e9 100644
--- a/spec/features/merge_request/user_sees_discussions_navigation_spec.rb
+++ b/spec/features/merge_request/user_sees_discussions_navigation_spec.rb
@@ -13,27 +13,30 @@ RSpec.describe 'Merge request > User sees discussions navigation', :js, feature_
describe 'Code discussions' do
let!(:position) do
- build(:text_diff_position, :added,
- file: "files/images/wm.svg",
- new_line: 1,
- diff_refs: merge_request.diff_refs
+ build(
+ :text_diff_position, :added,
+ file: "files/images/wm.svg",
+ new_line: 1,
+ diff_refs: merge_request.diff_refs
)
end
let!(:first_discussion) do
- create(:diff_note_on_merge_request,
- noteable: merge_request,
- project: project,
- position: position
- ).to_discussion
+ create(
+ :diff_note_on_merge_request,
+ noteable: merge_request,
+ project: project,
+ position: position
+ ).to_discussion
end
let!(:second_discussion) do
- create(:diff_note_on_merge_request,
- noteable: merge_request,
- project: project,
- position: position
- ).to_discussion
+ create(
+ :diff_note_on_merge_request,
+ noteable: merge_request,
+ project: project,
+ position: position
+ ).to_discussion
end
let(:first_discussion_selector) { ".discussion[data-discussion-id='#{first_discussion.id}']" }
@@ -74,11 +77,12 @@ RSpec.describe 'Merge request > User sees discussions navigation', :js, feature_
context 'with resolved threads' do
let!(:resolved_discussion) do
- create(:diff_note_on_merge_request,
- noteable: merge_request,
- project: project,
- position: position
- ).to_discussion
+ create(
+ :diff_note_on_merge_request,
+ noteable: merge_request,
+ project: project,
+ position: position
+ ).to_discussion
end
let(:resolved_discussion_selector) { ".discussion[data-discussion-id='#{resolved_discussion.id}']" }
@@ -92,7 +96,7 @@ RSpec.describe 'Merge request > User sees discussions navigation', :js, feature_
end
it 'excludes resolved threads during navigation',
- quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/383687' do
+ quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/383687' do
goto_next_thread
goto_next_thread
goto_next_thread
diff --git a/spec/features/merge_request/user_sees_discussions_spec.rb b/spec/features/merge_request/user_sees_discussions_spec.rb
index 3ca5ac23ddb..3482d468bc1 100644
--- a/spec/features/merge_request/user_sees_discussions_spec.rb
+++ b/spec/features/merge_request/user_sees_discussions_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'Merge request > User sees threads', :js, feature_category: :code_review_workflow do
+ include ContentEditorHelpers
+
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
let(:merge_request) { create(:merge_request, source_project: project) }
@@ -29,6 +31,7 @@ RSpec.describe 'Merge request > User sees threads', :js, feature_category: :code
before do
visit project_merge_request_path(project, merge_request)
+ close_rich_text_promo_popover_if_present
end
context 'active threads' do
@@ -71,6 +74,7 @@ RSpec.describe 'Merge request > User sees threads', :js, feature_category: :code
before do
visit project_merge_request_path(project, merge_request)
+ close_rich_text_promo_popover_if_present
end
# TODO: https://gitlab.com/gitlab-org/gitlab-foss/issues/48034
diff --git a/spec/features/merge_request/user_sees_merge_button_depending_on_unresolved_discussions_spec.rb b/spec/features/merge_request/user_sees_merge_button_depending_on_unresolved_discussions_spec.rb
index 476be5ab599..9955c13b769 100644
--- a/spec/features/merge_request/user_sees_merge_button_depending_on_unresolved_discussions_spec.rb
+++ b/spec/features/merge_request/user_sees_merge_button_depending_on_unresolved_discussions_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'Merge request > User sees merge button depending on unresolved threads', :js,
-feature_category: :code_review_workflow do
+ feature_category: :code_review_workflow do
let(:project) { create(:project, :repository) }
let(:user) { project.creator }
let!(:merge_request) { create(:merge_request_with_diff_notes, source_project: project, author: user) }
diff --git a/spec/features/merge_request/user_sees_merge_request_pipelines_spec.rb b/spec/features/merge_request/user_sees_merge_request_pipelines_spec.rb
index ca12e0e2b65..8c4dbf5ebfd 100644
--- a/spec/features/merge_request/user_sees_merge_request_pipelines_spec.rb
+++ b/spec/features/merge_request/user_sees_merge_request_pipelines_spec.rb
@@ -36,11 +36,13 @@ RSpec.describe 'Merge request > User sees pipelines triggered by merge request',
context 'when a user created a merge request in the parent project' do
let!(:merge_request) do
- create(:merge_request,
- source_project: project,
- target_project: project,
- source_branch: 'feature',
- target_branch: 'master')
+ create(
+ :merge_request,
+ source_project: project,
+ target_project: project,
+ source_branch: 'feature',
+ target_branch: 'master'
+ )
end
let!(:push_pipeline) do
@@ -56,8 +58,6 @@ RSpec.describe 'Merge request > User sees pipelines triggered by merge request',
end
before do
- stub_feature_flags(auto_merge_labels_mr_widget: false)
-
visit project_merge_request_path(project, merge_request)
page.within('.merge-request-tabs') do
@@ -144,53 +144,8 @@ RSpec.describe 'Merge request > User sees pipelines triggered by merge request',
end
end
- context 'when a user merges a merge request in the parent project', :sidekiq_might_not_need_inline do
- before do
- click_link 'Overview'
- click_button 'Merge when pipeline succeeds'
-
- wait_for_requests
- end
-
- context 'when detached merge request pipeline is pending' do
- it 'waits the head pipeline' do
- expect(page).to have_content('to be merged automatically when the pipeline succeeds')
- expect(page).to have_button('Cancel auto-merge')
- end
- end
-
- context 'when detached merge request pipeline succeeds' do
- before do
- detached_merge_request_pipeline.reload.succeed!
-
- wait_for_requests
- end
-
- it 'merges the merge request' do
- expect(page).to have_content('Merged by')
- expect(page).to have_button('Revert')
- end
- end
-
- context 'when branch pipeline succeeds' do
- before do
- click_link 'Overview'
- push_pipeline.reload.succeed!
-
- wait_for_requests
- end
-
- it 'waits the head pipeline' do
- expect(page).to have_content('to be merged automatically when the pipeline succeeds')
- expect(page).to have_button('Cancel auto-merge')
- end
- end
- end
-
- context 'when a user created a merge request in the parent project with auto_merge_labels_mr_widget on' do
+ context 'when a user created a merge request in the parent project' do
before do
- stub_feature_flags(auto_merge_labels_mr_widget: true)
-
visit project_merge_request_path(project, merge_request)
page.within('.merge-request-tabs') do
@@ -263,11 +218,13 @@ RSpec.describe 'Merge request > User sees pipelines triggered by merge request',
context 'when a user created a merge request from a forked project to the parent project', :sidekiq_might_not_need_inline do
let(:merge_request) do
- create(:merge_request,
- source_project: forked_project,
- target_project: project,
- source_branch: 'feature',
- target_branch: 'master')
+ create(
+ :merge_request,
+ source_project: forked_project,
+ target_project: project,
+ source_branch: 'feature',
+ target_branch: 'master'
+ )
end
let!(:push_pipeline) do
@@ -390,8 +347,15 @@ RSpec.describe 'Merge request > User sees pipelines triggered by merge request',
context 'when the latest pipeline is running in the parent project' do
before do
- Ci::CreatePipelineService.new(project, user, ref: 'feature')
- .execute(:merge_request_event, merge_request: merge_request)
+ create(:ci_pipeline,
+ source: :merge_request_event,
+ project: project,
+ ref: 'feature',
+ sha: merge_request.diff_head_sha,
+ user: user,
+ merge_request: merge_request,
+ status: :running)
+ merge_request.update_head_pipeline
end
context 'when the previous pipeline failed in the fork project' do
@@ -404,10 +368,10 @@ RSpec.describe 'Merge request > User sees pipelines triggered by merge request',
project.update!(only_allow_merge_if_pipeline_succeeds: true)
end
- it 'shows MWPS button' do
+ it 'shows Set to auto-merge button' do
visit project_merge_request_path(project, merge_request)
- expect(page).to have_button('Merge when pipeline succeeds')
+ expect(page).to have_button('Set to auto-merge')
end
end
end
@@ -417,7 +381,7 @@ RSpec.describe 'Merge request > User sees pipelines triggered by merge request',
before do
click_link("Overview")
- click_button 'Merge when pipeline succeeds'
+ click_button 'Set to auto-merge'
wait_for_requests
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 cb56e79fcc0..3cac24838a3 100644
--- a/spec/features/merge_request/user_sees_merge_widget_spec.rb
+++ b/spec/features/merge_request/user_sees_merge_widget_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js, feature_category:
include ProjectForksHelper
include TestReportsHelper
include ReactiveCachingHelpers
+ include ContentEditorHelpers
let(:project) { create(:project, :repository) }
let(:project_only_mwps) { create(:project, :repository, only_allow_merge_if_pipeline_succeeds: true) }
@@ -57,6 +58,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js, feature_category:
merge_request.update!(head_pipeline: pipeline)
deployment.update!(status: :success)
visit project_merge_request_path(project, merge_request)
+ close_rich_text_promo_popover_if_present
end
it 'shows environments link' do
@@ -118,15 +120,19 @@ RSpec.describe 'Merge request > User sees merge widget', :js, feature_category:
context 'view merge request with failed GitLab CI pipelines' do
before do
commit_status = create(:commit_status, project: project, status: 'failed')
- pipeline = create(:ci_pipeline, project: project,
- sha: merge_request.diff_head_sha,
- ref: merge_request.source_branch,
- status: 'failed',
- statuses: [commit_status],
- head_pipeline_of: merge_request)
+ pipeline = create(
+ :ci_pipeline,
+ project: project,
+ sha: merge_request.diff_head_sha,
+ ref: merge_request.source_branch,
+ status: 'failed',
+ statuses: [commit_status],
+ head_pipeline_of: merge_request
+ )
create(:ci_build, :pending, pipeline: pipeline)
visit project_merge_request_path(project, merge_request)
+ close_rich_text_promo_popover_if_present
end
it 'has merge button that shows modal when pipeline does not succeeded' do
@@ -278,12 +284,15 @@ RSpec.describe 'Merge request > User sees merge widget', :js, feature_category:
context 'view merge request with MWBS button' do
before do
commit_status = create(:commit_status, project: project, status: 'pending')
- pipeline = create(:ci_pipeline, project: project,
- sha: merge_request.diff_head_sha,
- ref: merge_request.source_branch,
- status: 'pending',
- statuses: [commit_status],
- head_pipeline_of: merge_request)
+ pipeline = create(
+ :ci_pipeline,
+ project: project,
+ sha: merge_request.diff_head_sha,
+ ref: merge_request.source_branch,
+ status: 'pending',
+ statuses: [commit_status],
+ head_pipeline_of: merge_request
+ )
create(:ci_build, :pending, pipeline: pipeline)
visit project_merge_request_path(project, merge_request)
@@ -298,9 +307,12 @@ RSpec.describe 'Merge request > User sees merge widget', :js, feature_category:
context 'view merge request where there is no pipeline yet' do
before do
- pipeline = create(:ci_pipeline, project: project,
- sha: merge_request.diff_head_sha,
- ref: merge_request.source_branch)
+ pipeline = create(
+ :ci_pipeline,
+ project: project,
+ sha: merge_request.diff_head_sha,
+ ref: merge_request.source_branch
+ )
create(:ci_build, pipeline: pipeline)
visit project_merge_request_path(project, merge_request)
@@ -394,6 +406,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js, feature_category:
before do
allow_any_instance_of(Repository).to receive(:merge).and_return(false)
visit project_merge_request_path(project, merge_request)
+ close_rich_text_promo_popover_if_present
end
it 'updates the MR widget', :sidekiq_might_not_need_inline do
@@ -415,6 +428,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js, feature_category:
sign_in(user2)
merge_request.update!(source_project: forked_project)
visit project_merge_request_path(project, merge_request)
+ close_rich_text_promo_popover_if_present
end
it 'user can merge into the target project', :sidekiq_inline do
@@ -452,6 +466,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js, feature_category:
allow_any_instance_of(MergeRequest).to receive(:merge_ongoing?).and_return(true)
visit project_merge_request_path(project, merge_request)
+ close_rich_text_promo_popover_if_present
wait_for_requests
@@ -510,11 +525,13 @@ RSpec.describe 'Merge request > User sees merge widget', :js, feature_category:
context 'when merge request has test reports' do
let!(:head_pipeline) do
- create(:ci_pipeline,
- :success,
- project: project,
- ref: merge_request.source_branch,
- sha: merge_request.diff_head_sha)
+ create(
+ :ci_pipeline,
+ :success,
+ project: project,
+ ref: merge_request.source_branch,
+ sha: merge_request.diff_head_sha
+ )
end
let!(:build) { create(:ci_build, :success, pipeline: head_pipeline, project: project) }
diff --git a/spec/features/merge_request/user_sees_mr_from_deleted_forked_project_spec.rb b/spec/features/merge_request/user_sees_mr_from_deleted_forked_project_spec.rb
index fac0a84f155..7b8ac50f1ae 100644
--- a/spec/features/merge_request/user_sees_mr_from_deleted_forked_project_spec.rb
+++ b/spec/features/merge_request/user_sees_mr_from_deleted_forked_project_spec.rb
@@ -3,16 +3,19 @@
require 'spec_helper'
RSpec.describe 'Merge request > User sees MR from deleted forked project',
- :js, feature_category: :code_review_workflow do
+ :js, feature_category: :code_review_workflow do
include ProjectForksHelper
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
let(:forked_project) { fork_project(project, nil, repository: true) }
let!(:merge_request) do
- create(:merge_request_with_diffs, source_project: forked_project,
- target_project: project,
- description: 'Test merge request')
+ create(
+ :merge_request_with_diffs,
+ source_project: forked_project,
+ target_project: project,
+ description: 'Test merge request'
+ )
end
before do
diff --git a/spec/features/merge_request/user_sees_mr_with_deleted_source_branch_spec.rb b/spec/features/merge_request/user_sees_mr_with_deleted_source_branch_spec.rb
index 9b46cf37648..29a76768774 100644
--- a/spec/features/merge_request/user_sees_mr_with_deleted_source_branch_spec.rb
+++ b/spec/features/merge_request/user_sees_mr_with_deleted_source_branch_spec.rb
@@ -6,7 +6,7 @@ require 'spec_helper'
# message to be shown by JavaScript when the source branch was deleted.
# Please do not remove ":js".
RSpec.describe 'Merge request > User sees MR with deleted source branch',
- :js, feature_category: :code_review_workflow do
+ :js, feature_category: :code_review_workflow do
let(:project) { create(:project, :public, :repository) }
let(:merge_request) { create(:merge_request, source_project: project) }
let(:user) { project.creator }
diff --git a/spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb b/spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb
index ac195dd9873..ad7ed1ceada 100644
--- a/spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb
+++ b/spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb
@@ -4,25 +4,33 @@ require 'spec_helper'
RSpec.describe 'Merge request > User sees notes from forked project', :js, feature_category: :code_review_workflow do
include ProjectForksHelper
+ include ContentEditorHelpers
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
let(:forked_project) { fork_project(project, nil, repository: true) }
let!(:merge_request) do
- create(:merge_request_with_diffs, source_project: forked_project,
- target_project: project,
- description: 'Test merge request')
+ create(
+ :merge_request_with_diffs,
+ source_project: forked_project,
+ target_project: project,
+ description: 'Test merge request'
+ )
end
before do
- create(:note_on_commit, note: 'A commit comment',
- project: forked_project,
- commit_id: merge_request.commit_shas.first)
+ create(
+ :note_on_commit,
+ note: 'A commit comment',
+ project: forked_project,
+ commit_id: merge_request.commit_shas.first
+ )
sign_in(user)
end
it 'user can reply to the comment', :sidekiq_might_not_need_inline do
visit project_merge_request_path(project, merge_request)
+ close_rich_text_promo_popover_if_present
expect(page).to have_content('A commit comment')
diff --git a/spec/features/merge_request/user_sees_pipelines_from_forked_project_spec.rb b/spec/features/merge_request/user_sees_pipelines_from_forked_project_spec.rb
index 0816b14f9a5..5801e8a1a11 100644
--- a/spec/features/merge_request/user_sees_pipelines_from_forked_project_spec.rb
+++ b/spec/features/merge_request/user_sees_pipelines_from_forked_project_spec.rb
@@ -3,23 +3,28 @@
require 'spec_helper'
RSpec.describe 'Merge request > User sees pipelines from forked project', :js,
-feature_category: :continuous_integration do
+ feature_category: :continuous_integration do
include ProjectForksHelper
let(:target_project) { create(:project, :public, :repository) }
let(:user) { target_project.creator }
let(:forked_project) { fork_project(target_project, nil, repository: true) }
let!(:merge_request) do
- create(:merge_request_with_diffs, source_project: forked_project,
- target_project: target_project,
- description: 'Test merge request')
+ create(
+ :merge_request_with_diffs,
+ source_project: forked_project,
+ target_project: target_project,
+ description: 'Test merge request'
+ )
end
let(:pipeline) do
- create(:ci_pipeline,
- project: forked_project,
- sha: merge_request.diff_head_sha,
- ref: merge_request.source_branch)
+ create(
+ :ci_pipeline,
+ project: forked_project,
+ sha: merge_request.diff_head_sha,
+ ref: merge_request.source_branch
+ )
end
before do
diff --git a/spec/features/merge_request/user_sees_pipelines_spec.rb b/spec/features/merge_request/user_sees_pipelines_spec.rb
index faa46ff4df1..5ce919fe2e6 100644
--- a/spec/features/merge_request/user_sees_pipelines_spec.rb
+++ b/spec/features/merge_request/user_sees_pipelines_spec.rb
@@ -15,11 +15,13 @@ RSpec.describe 'Merge request > User sees pipelines', :js, feature_category: :co
context 'with pipelines' do
let!(:pipeline) do
- create(:ci_pipeline,
- :success,
- project: merge_request.source_project,
- ref: merge_request.source_branch,
- sha: merge_request.diff_head_sha)
+ create(
+ :ci_pipeline,
+ :success,
+ project: merge_request.source_project,
+ ref: merge_request.source_branch,
+ sha: merge_request.diff_head_sha
+ )
end
let!(:manual_job) { create(:ci_build, :manual, name: 'job1', stage: 'deploy', pipeline: pipeline) }
@@ -116,9 +118,14 @@ RSpec.describe 'Merge request > User sees pipelines', :js, feature_category: :co
let_it_be(:reporter_in_parent_and_developer_in_fork) { create(:user) }
let(:merge_request) do
- create(:merge_request, :with_detached_merge_request_pipeline,
- source_project: forked_project, source_branch: 'feature',
- target_project: parent_project, target_branch: 'master')
+ create(
+ :merge_request,
+ :with_detached_merge_request_pipeline,
+ source_project: forked_project,
+ source_branch: 'feature',
+ target_project: parent_project,
+ target_branch: 'master'
+ )
end
let(:config) do
@@ -193,7 +200,7 @@ RSpec.describe 'Merge request > User sees pipelines', :js, feature_category: :co
def create_merge_request_pipeline
page.within('.merge-request-tabs') { click_link('Pipelines') }
- click_button('Run pipeline')
+ click_on('Run pipeline')
end
def check_pipeline(expected_project:)
diff --git a/spec/features/merge_request/user_sees_versions_spec.rb b/spec/features/merge_request/user_sees_versions_spec.rb
index 91f8fd13681..715cc2f73be 100644
--- a/spec/features/merge_request/user_sees_versions_spec.rb
+++ b/spec/features/merge_request/user_sees_versions_spec.rb
@@ -57,9 +57,9 @@ RSpec.describe 'Merge request > User sees versions', :js, feature_category: :cod
end
it_behaves_like 'allows commenting',
- file_name: '.gitmodules',
- line_text: '[submodule "six"]',
- comment: 'Typo, please fix.'
+ file_name: '.gitmodules',
+ line_text: '[submodule "six"]',
+ comment: 'Typo, please fix.'
end
describe 'switch between versions' do
@@ -105,9 +105,9 @@ RSpec.describe 'Merge request > User sees versions', :js, feature_category: :cod
end
it_behaves_like 'allows commenting',
- file_name: '.gitmodules',
- line_text: 'path = six',
- comment: 'Typo, please fix.'
+ file_name: '.gitmodules',
+ line_text: 'path = six',
+ comment: 'Typo, please fix.'
end
describe 'compare with older version' do
@@ -172,9 +172,9 @@ RSpec.describe 'Merge request > User sees versions', :js, feature_category: :cod
end
it_behaves_like 'allows commenting',
- file_name: '.gitmodules',
- line_text: '[submodule "gitlab-shell"]',
- comment: 'Typo, please fix.'
+ file_name: '.gitmodules',
+ line_text: '[submodule "gitlab-shell"]',
+ comment: 'Typo, please fix.'
end
describe 'compare with same version' do
@@ -239,8 +239,8 @@ RSpec.describe 'Merge request > User sees versions', :js, feature_category: :cod
end
it_behaves_like 'allows commenting',
- file_name: 'files/ruby/popen.rb',
- line_text: 'RuntimeError',
- comment: 'Typo, please fix.'
+ file_name: 'files/ruby/popen.rb',
+ line_text: 'RuntimeError',
+ comment: 'Typo, please fix.'
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 dae28cbb05c..e3be99254dc 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
@@ -144,9 +144,7 @@ RSpec.describe 'Merge request > User selects branches for new MR', :js, feature_
context 'when a new merge request has a pipeline' do
let!(:pipeline) do
- create(:ci_pipeline, sha: project.commit('fix').id,
- ref: 'fix',
- project: project)
+ create(:ci_pipeline, sha: project.commit('fix').id, ref: 'fix', project: project)
end
it 'shows pipelines for a new merge request' do
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 63faf830f7e..200f310d929 100644
--- a/spec/features/merge_request/user_squashes_merge_request_spec.rb
+++ b/spec/features/merge_request/user_squashes_merge_request_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'User squashes a merge request', :js, feature_category: :code_review_workflow do
+ include ContentEditorHelpers
+
let(:user) { create(:user) }
let(:project) { create(:project, :repository) }
let(:source_branch) { 'csv' }
@@ -12,19 +14,25 @@ RSpec.describe 'User squashes a merge request', :js, feature_category: :code_rev
shared_examples 'squash' do
it 'squashes the commits into a single commit, and adds a merge commit', :sidekiq_might_not_need_inline do
+ close_rich_text_promo_popover_if_present
+
expect(page).to have_content('Merged')
latest_master_commits = project.repository.commits_between(original_head.sha, 'master').map(&:raw)
- squash_commit = an_object_having_attributes(sha: a_string_matching(/\h{40}/),
- message: a_string_starting_with(project.merge_requests.first.default_squash_commit_message),
- author_name: user.name,
- committer_name: user.name)
+ squash_commit = an_object_having_attributes(
+ sha: a_string_matching(/\h{40}/),
+ message: a_string_starting_with(project.merge_requests.first.default_squash_commit_message),
+ author_name: user.name,
+ committer_name: user.name
+ )
- merge_commit = an_object_having_attributes(sha: a_string_matching(/\h{40}/),
- message: a_string_starting_with("Merge branch '#{source_branch}' into 'master'"),
- author_name: user.name,
- committer_name: user.name)
+ merge_commit = an_object_having_attributes(
+ sha: a_string_matching(/\h{40}/),
+ message: a_string_starting_with("Merge branch '#{source_branch}' into 'master'"),
+ author_name: user.name,
+ committer_name: user.name
+ )
expect(project.repository).not_to be_merged_to_root_ref(source_branch)
expect(latest_master_commits).to match([squash_commit, merge_commit])
@@ -33,12 +41,16 @@ RSpec.describe 'User squashes a merge request', :js, feature_category: :code_rev
shared_examples 'no squash' do
it 'accepts the merge request without squashing', :sidekiq_might_not_need_inline do
+ close_rich_text_promo_popover_if_present
+
expect(page).to have_content('Merged')
expect(project.repository).to be_merged_to_root_ref(source_branch)
end
end
def accept_mr
+ close_rich_text_promo_popover_if_present
+
expect(page).to have_button('Merge')
uncheck 'Delete source branch' unless protected_source_branch
diff --git a/spec/features/merge_request/user_suggests_changes_on_diff_spec.rb b/spec/features/merge_request/user_suggests_changes_on_diff_spec.rb
index efd88df0f97..1a814aeb89d 100644
--- a/spec/features/merge_request/user_suggests_changes_on_diff_spec.rb
+++ b/spec/features/merge_request/user_suggests_changes_on_diff_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe 'User comments on a diff', :js, feature_category: :code_review_workflow do
include MergeRequestDiffHelpers
include RepoHelpers
+ include ContentEditorHelpers
def expect_suggestion_has_content(element, expected_changing_content, expected_suggested_content)
changing_content = element.all(:css, '.line_holder.old').map { |el| el.text(normalize_ws: true) }
@@ -35,6 +36,7 @@ RSpec.describe 'User comments on a diff', :js, feature_category: :code_review_wo
context 'single suggestion note' do
it 'hides suggestion popover' do
click_diff_line(find_by_scrolling("[id='#{sample_compare.changes[1][:line_code]}']"))
+ close_rich_text_promo_popover_if_present
expect(page).to have_selector('.diff-suggest-popover')
@@ -303,13 +305,17 @@ RSpec.describe 'User comments on a diff', :js, feature_category: :code_review_wo
"5 # heh"
]
- expect_suggestion_has_content(suggestion_1,
- suggestion_1_expected_changing_content,
- suggestion_1_expected_suggested_content)
-
- expect_suggestion_has_content(suggestion_2,
- suggestion_2_expected_changing_content,
- suggestion_2_expected_suggested_content)
+ expect_suggestion_has_content(
+ suggestion_1,
+ suggestion_1_expected_changing_content,
+ suggestion_1_expected_suggested_content
+ )
+
+ expect_suggestion_has_content(
+ suggestion_2,
+ suggestion_2_expected_changing_content,
+ suggestion_2_expected_suggested_content
+ )
end
end
end
diff --git a/spec/features/merge_request/user_tries_to_access_private_project_info_through_new_mr_spec.rb b/spec/features/merge_request/user_tries_to_access_private_project_info_through_new_mr_spec.rb
index 5770f5ab94d..1232e19d22b 100644
--- a/spec/features/merge_request/user_tries_to_access_private_project_info_through_new_mr_spec.rb
+++ b/spec/features/merge_request/user_tries_to_access_private_project_info_through_new_mr_spec.rb
@@ -3,19 +3,27 @@
require 'spec_helper'
RSpec.describe 'Merge Request > User tries to access private project information through the new mr page',
-feature_category: :code_review_workflow do
+ feature_category: :code_review_workflow do
let(:current_user) { create(:user) }
let(:private_project) do
- create(:project, :public, :repository,
- path: 'nothing-to-see-here',
- name: 'nothing to see here',
- repository_access_level: ProjectFeature::PRIVATE)
+ create(
+ :project,
+ :public,
+ :repository,
+ path: 'nothing-to-see-here',
+ name: 'nothing to see here',
+ repository_access_level: ProjectFeature::PRIVATE
+ )
end
let(:owned_project) do
- create(:project, :public, :repository,
- namespace: current_user.namespace,
- creator: current_user)
+ create(
+ :project,
+ :public,
+ :repository,
+ namespace: current_user.namespace,
+ creator: current_user
+ )
end
context 'when the user enters the querystring info for the other project' do
diff --git a/spec/features/merge_request/user_uses_quick_actions_spec.rb b/spec/features/merge_request/user_uses_quick_actions_spec.rb
index 1ec86948065..1c63f5b56b0 100644
--- a/spec/features/merge_request/user_uses_quick_actions_spec.rb
+++ b/spec/features/merge_request/user_uses_quick_actions_spec.rb
@@ -8,7 +8,7 @@ require 'spec_helper'
# Because this kind of spec takes more time to run there is no need to add new ones
# for each existing quick action unless they test something not tested by existing tests.
RSpec.describe 'Merge request > User uses quick actions', :js, :use_clean_rails_redis_caching,
-feature_category: :code_review_workflow do
+ feature_category: :code_review_workflow do
include Features::NotesHelpers
let(:project) { create(:project, :public, :repository) }
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 1a9d40ae926..cd0ea639d4d 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
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'User views an open merge request', feature_category: :code_review_workflow do
+ include ContentEditorHelpers
+
let(:merge_request) do
create(:merge_request, source_project: project, target_project: project, description: '# Description header')
end
@@ -53,6 +55,7 @@ RSpec.describe 'User views an open merge request', feature_category: :code_revie
sign_in(user)
visit(edit_project_merge_request_path(project, merge_request))
+ close_rich_text_promo_popover_if_present
end
it 'renders empty description preview' do
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 371c40b40a5..f594e39b2b7 100644
--- a/spec/features/merge_requests/user_lists_merge_requests_spec.rb
+++ b/spec/features/merge_requests/user_lists_merge_requests_spec.rb
@@ -14,44 +14,52 @@ RSpec.describe 'Merge requests > User lists merge requests', feature_category: :
let(:user5) { create(:user) }
before do
- @fix = create(:merge_request,
- title: 'fix',
- source_project: project,
- source_branch: 'fix',
- assignees: [user],
- reviewers: [user, user2, user3, user4, user5],
- milestone: create(:milestone, project: project, due_date: '2013-12-11'),
- created_at: 1.minute.ago,
- updated_at: 1.minute.ago)
+ @fix = create(
+ :merge_request,
+ title: 'fix',
+ source_project: project,
+ source_branch: 'fix',
+ assignees: [user],
+ reviewers: [user, user2, user3, user4, user5],
+ milestone: create(:milestone, project: project, due_date: '2013-12-11'),
+ created_at: 1.minute.ago,
+ updated_at: 1.minute.ago
+ )
@fix.metrics.update!(merged_at: 10.seconds.ago, latest_closed_at: 20.seconds.ago)
- @markdown = create(:merge_request,
- title: 'markdown',
- source_project: project,
- source_branch: 'markdown',
- assignees: [user],
- reviewers: [user, user2, user3, user4],
- milestone: create(:milestone, project: project, due_date: '2013-12-12'),
- created_at: 2.minutes.ago,
- updated_at: 2.minutes.ago,
- state: 'merged')
+ @markdown = create(
+ :merge_request,
+ title: 'markdown',
+ source_project: project,
+ source_branch: 'markdown',
+ assignees: [user],
+ reviewers: [user, user2, user3, user4],
+ milestone: create(:milestone, project: project, due_date: '2013-12-12'),
+ created_at: 2.minutes.ago,
+ updated_at: 2.minutes.ago,
+ state: 'merged'
+ )
@markdown.metrics.update!(merged_at: 10.minutes.ago, latest_closed_at: 10.seconds.ago)
- @merge_test = create(:merge_request,
- title: 'merge-test',
- source_project: project,
- source_branch: 'merge-test',
- created_at: 3.minutes.ago,
- updated_at: 10.seconds.ago)
+ @merge_test = create(
+ :merge_request,
+ title: 'merge-test',
+ source_project: project,
+ source_branch: 'merge-test',
+ created_at: 3.minutes.ago,
+ updated_at: 10.seconds.ago
+ )
@merge_test.metrics.update!(merged_at: 10.seconds.ago, latest_closed_at: 10.seconds.ago)
- @feature = create(:merge_request,
- title: 'feature',
- source_project: project,
- source_branch: 'feautre',
- created_at: 2.minutes.ago,
- updated_at: 1.minute.ago,
- state: 'merged')
+ @feature = create(
+ :merge_request,
+ title: 'feature',
+ source_project: project,
+ source_branch: 'feautre',
+ created_at: 2.minutes.ago,
+ updated_at: 1.minute.ago,
+ state: 'merged'
+ )
@feature.metrics.update!(merged_at: 10.seconds.ago, latest_closed_at: 10.minutes.ago)
end
@@ -134,8 +142,7 @@ RSpec.describe 'Merge requests > User lists merge requests', feature_category: :
label = create(:label, project: project)
create(:label_link, label: label, target: @fix)
- visit_merge_requests(project, label_name: [label.name],
- sort: sort_value_milestone)
+ visit_merge_requests(project, label_name: [label.name], sort: sort_value_milestone)
expect(first_merge_request).to include('fix')
expect(count_merge_requests).to eq(1)
@@ -160,8 +167,7 @@ RSpec.describe 'Merge requests > User lists merge requests', feature_category: :
end
it 'sorts by milestone due date' do
- visit_merge_requests(project, label_name: [label.name, label2.name],
- sort: sort_value_milestone)
+ visit_merge_requests(project, label_name: [label.name, label2.name], sort: sort_value_milestone)
expect(first_merge_request).to include('fix')
expect(count_merge_requests).to eq(1)
@@ -169,9 +175,12 @@ RSpec.describe 'Merge requests > User lists merge requests', feature_category: :
context 'filter on assignee and' 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_milestone)
+ visit_merge_requests(
+ project,
+ label_name: [label.name, label2.name],
+ assignee_id: user.id,
+ 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_views_open_merge_requests_spec.rb b/spec/features/merge_requests/user_views_open_merge_requests_spec.rb
index 1a2024a5511..0021f701290 100644
--- a/spec/features/merge_requests/user_views_open_merge_requests_spec.rb
+++ b/spec/features/merge_requests/user_views_open_merge_requests_spec.rb
@@ -57,10 +57,12 @@ RSpec.describe 'User views open merge requests', feature_category: :code_review_
let!(:build) { create :ci_build, pipeline: pipeline }
let(:merge_request) do
- create(:merge_request_with_diffs,
- source_project: project,
- target_project: project,
- source_branch: 'merge-test')
+ create(
+ :merge_request_with_diffs,
+ source_project: project,
+ target_project: project,
+ source_branch: 'merge-test'
+ )
end
let(:pipeline) do
diff --git a/spec/features/nav/top_nav_spec.rb b/spec/features/nav/top_nav_spec.rb
index 74022a4a976..ccbf4646273 100644
--- a/spec/features/nav/top_nav_spec.rb
+++ b/spec/features/nav/top_nav_spec.rb
@@ -44,7 +44,7 @@ RSpec.describe 'top nav responsive', :js, feature_category: :navigation do
end
def invite_members_from_menu
- find('[data-testid="new-dropdown"]').click
+ find('[data-testid="new-menu-toggle"]').click
click_link('Invite members')
end
diff --git a/spec/features/participants_autocomplete_spec.rb b/spec/features/participants_autocomplete_spec.rb
index 084bf609a0d..d8501116134 100644
--- a/spec/features/participants_autocomplete_spec.rb
+++ b/spec/features/participants_autocomplete_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'Member autocomplete', :js, feature_category: :groups_and_projects do
+ include Features::AutocompleteHelpers
+
let_it_be(:project) { create(:project, :public, :repository) }
let_it_be(:user) { create(:user) }
let_it_be(:author) { create(:user) }
@@ -85,10 +87,4 @@ RSpec.describe 'Member autocomplete', :js, feature_category: :groups_and_project
include_examples "open suggestions when typing @", 'commit'
end
-
- private
-
- def find_autocomplete_menu
- find('.atwho-view ul', visible: true)
- end
end
diff --git a/spec/features/profiles/user_visits_profile_spec.rb b/spec/features/profiles/user_visits_profile_spec.rb
index 578025e1494..14fc6ed33b3 100644
--- a/spec/features/profiles/user_visits_profile_spec.rb
+++ b/spec/features/profiles/user_visits_profile_spec.rb
@@ -49,43 +49,127 @@ RSpec.describe 'User visits their profile', feature_category: :user_profile do
expect(page).not_to have_selector('.file-content')
end
- context 'when user has groups' do
- let(:group) do
- create :group do |group|
- group.add_owner(user)
+ context 'for tabs' do
+ shared_examples_for 'shows expected content' do
+ it 'shows expected content', :js do
+ visit(user_path(user))
+
+ page.within ".cover-block" do
+ expect(page).to have_content user.name
+ expect(page).to have_content user.username
+ end
+
+ page.within ".content" do
+ click_link link
+ end
+
+ page.within div do
+ expect(page).to have_content expected_content
+ end
end
end
- let!(:project) do
- create(:project, :repository, namespace: group) do |project|
- create(:closed_issue_event, project: project)
- project.add_maintainer(user)
+ context 'for Groups' do
+ let_it_be(:group) do
+ create :group do |group|
+ group.add_owner(user)
+ end
+ end
+
+ let_it_be(:project) do
+ create(:project, :repository, namespace: group) do |project|
+ create(:closed_issue_event, project: project)
+ project.add_maintainer(user)
+ end
+ end
+
+ it_behaves_like 'shows expected content' do
+ let(:link) { 'Groups' }
+ let(:div) { '#groups' }
+ let(:expected_content) { group.name }
+ end
+ end
+
+ context 'for Contributed projects' do
+ let_it_be(:project) do
+ create(:project) do |project|
+ project.add_maintainer(user)
+ end
+ end
+
+ before do
+ push_event = create(:push_event, project: project, author: user)
+ create(:push_event_payload, event: push_event)
+ end
+
+ it_behaves_like 'shows expected content' do
+ let(:link) { 'Contributed projects' }
+ let(:div) { '#contributed' }
+ let(:expected_content) { project.name }
+ end
+ end
+
+ context 'for personal projects' do
+ let_it_be(:project) do
+ create(:project, namespace: user.namespace)
+ end
+
+ it_behaves_like 'shows expected content' do
+ let(:link) { 'Personal projects' }
+ let(:div) { '#projects' }
+ let(:expected_content) { project.name }
end
end
- def click_on_profile_picture
- find(:css, '.header-user-dropdown-toggle').click
+ context 'for starred projects' do
+ let_it_be(:project) { create(:project, :public) }
- page.within ".header-user" do
- click_link user.username
+ before do
+ user.toggle_star(project)
+ end
+
+ it_behaves_like 'shows expected content' do
+ let(:link) { 'Starred projects' }
+ let(:div) { '#starred' }
+ let(:expected_content) { project.name }
end
end
- it 'shows user groups', :js do
- visit(profile_path)
- click_on_profile_picture
+ context 'for snippets' do
+ let_it_be(:snippet) { create(:snippet, :public, author: user) }
- page.within ".cover-block" do
- expect(page).to have_content user.name
- expect(page).to have_content user.username
+ it_behaves_like 'shows expected content' do
+ let(:link) { 'Snippets' }
+ let(:div) { '#snippets' }
+ let(:expected_content) { snippet.title }
end
+ end
+
+ context 'for followers' do
+ let_it_be(:fan) { create(:user) }
+
+ before do
+ fan.follow(user)
+ end
+
+ it_behaves_like 'shows expected content' do
+ let(:link) { 'Followers' }
+ let(:div) { '#followers' }
+ let(:expected_content) { fan.name }
+ end
+ end
+
+ context 'for following' do
+ let_it_be(:star) { create(:user) }
- page.within ".content" do
- click_link "Groups"
+ before do
+ user.follow(star)
end
- page.within "#groups" do
- expect(page).to have_content group.name
+ it_behaves_like 'shows expected content' do
+ let(:link) { 'Following' }
+ let(:div) { '#following' }
+ let(:expected_content) { star.name }
end
end
end
diff --git a/spec/features/projects/activity/user_sees_activity_spec.rb b/spec/features/projects/activity/user_sees_activity_spec.rb
index 5335b9d0e95..7940ded41a9 100644
--- a/spec/features/projects/activity/user_sees_activity_spec.rb
+++ b/spec/features/projects/activity/user_sees_activity_spec.rb
@@ -10,12 +10,14 @@ RSpec.describe 'Projects > Activity > User sees activity', feature_category: :gr
before do
create(:event, :created, project: project, target: issue, author: user)
event = create(:push_event, project: project, author: user)
- create(:push_event_payload,
- event: event,
- action: :created,
- commit_to: '6d394385cf567f80a8fd85055db1ab4c5295806f',
- ref: 'fix',
- commit_count: 1)
+ create(
+ :push_event_payload,
+ event: event,
+ action: :created,
+ commit_to: '6d394385cf567f80a8fd85055db1ab4c5295806f',
+ ref: 'fix',
+ commit_count: 1
+ )
end
it 'shows the last push in the activity page', :js do
diff --git a/spec/features/projects/artifacts/user_downloads_artifacts_spec.rb b/spec/features/projects/artifacts/user_downloads_artifacts_spec.rb
index 48dcb95e09b..eaf57c566e8 100644
--- a/spec/features/projects/artifacts/user_downloads_artifacts_spec.rb
+++ b/spec/features/projects/artifacts/user_downloads_artifacts_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe "User downloads artifacts", feature_category: :build_artifacts do
shared_examples "downloading" do
it "downloads the zip" do
- expect(page.response_headers['Content-Disposition']).to eq(%Q{attachment; filename="#{job.artifacts_file.filename}"; filename*=UTF-8''#{job.artifacts_file.filename}})
+ expect(page.response_headers['Content-Disposition']).to eq(%{attachment; filename="#{job.artifacts_file.filename}"; filename*=UTF-8''#{job.artifacts_file.filename}})
expect(page.response_headers['Content-Transfer-Encoding']).to eq("binary")
expect(page.response_headers['Content-Type']).to eq("application/zip")
expect(page.source.b).to eq(job.artifacts_file.file.read.b)
diff --git a/spec/features/projects/badges/coverage_spec.rb b/spec/features/projects/badges/coverage_spec.rb
index 3c8b17607ca..c4f20ff74b2 100644
--- a/spec/features/projects/badges/coverage_spec.rb
+++ b/spec/features/projects/badges/coverage_spec.rb
@@ -190,14 +190,21 @@ RSpec.describe 'test coverage badge', feature_category: :code_testing do
end
def show_test_coverage_badge(job: nil, min_good: nil, min_acceptable: nil, min_medium: nil)
- visit coverage_project_badges_path(project, ref: :master, job: job, min_good: min_good,
- min_acceptable: min_acceptable, min_medium: min_medium, format: :svg)
+ visit coverage_project_badges_path(
+ project,
+ ref: :master,
+ job: job,
+ min_good: min_good,
+ min_acceptable: min_acceptable,
+ min_medium: min_medium,
+ format: :svg
+ )
end
def expect_coverage_badge(coverage)
svg = Nokogiri::XML.parse(page.body)
expect(page.response_headers['Content-Type']).to include('image/svg+xml')
- expect(svg.at(%Q{text:contains("#{coverage}")})).to be_truthy
+ expect(svg.at(%{text:contains("#{coverage}")})).to be_truthy
end
def expect_coverage_badge_color(color)
diff --git a/spec/features/projects/badges/pipeline_badge_spec.rb b/spec/features/projects/badges/pipeline_badge_spec.rb
index c0f5d0ffead..94772c9fc1e 100644
--- a/spec/features/projects/badges/pipeline_badge_spec.rb
+++ b/spec/features/projects/badges/pipeline_badge_spec.rb
@@ -75,7 +75,7 @@ RSpec.describe 'Pipeline Badge', feature_category: :continuous_integration do
def expect_badge(status)
svg = Nokogiri::XML.parse(page.body)
expect(page.response_headers['Content-Type']).to include('image/svg+xml')
- expect(svg.at(%Q{text:contains("#{status}")})).to be_truthy
+ expect(svg.at(%{text:contains("#{status}")})).to be_truthy
end
end
end
diff --git a/spec/features/projects/blobs/blame_spec.rb b/spec/features/projects/blobs/blame_spec.rb
index 798cd401dac..dfda200cded 100644
--- a/spec/features/projects/blobs/blame_spec.rb
+++ b/spec/features/projects/blobs/blame_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'File blame', :js, feature_category: :groups_and_projects do
+RSpec.describe 'File blame', :js, feature_category: :source_code_management do
include TreeHelper
let_it_be(:project) { create(:project, :public, :repository) }
diff --git a/spec/features/projects/blobs/blob_show_spec.rb b/spec/features/projects/blobs/blob_show_spec.rb
index 62cd9fd9a56..30a81ccc071 100644
--- a/spec/features/projects/blobs/blob_show_spec.rb
+++ b/spec/features/projects/blobs/blob_show_spec.rb
@@ -943,7 +943,7 @@ RSpec.describe 'File blob', :js, feature_category: :groups_and_projects do
page.within('.commit-actions') do
expect(page).to have_css('.ci-status-icon')
expect(page).to have_css('.ci-status-icon-running')
- expect(page).to have_css('.js-ci-status-icon-running')
+ expect(page).to have_selector('[data-testid="status_running-icon"]')
end
end
end
diff --git a/spec/features/projects/branches/download_buttons_spec.rb b/spec/features/projects/branches/download_buttons_spec.rb
index 2092af537e8..a888b5b977d 100644
--- a/spec/features/projects/branches/download_buttons_spec.rb
+++ b/spec/features/projects/branches/download_buttons_spec.rb
@@ -9,18 +9,24 @@ RSpec.describe 'Download buttons in branches page', feature_category: :groups_an
let(:project) { create(:project, :repository) }
let(:pipeline) do
- create(:ci_pipeline,
- project: project,
- sha: project.commit('binary-encoding').sha,
- ref: 'binary-encoding', # make sure the branch is in the 1st page!
- status: status)
+ create(
+ :ci_pipeline,
+ project: project,
+ sha: project.commit('binary-encoding').sha,
+ ref: 'binary-encoding', # make sure the branch is in the 1st page!
+ status: status
+ )
end
let!(:build) do
- create(:ci_build, :success, :artifacts,
- pipeline: pipeline,
- status: pipeline.status,
- name: 'build')
+ create(
+ :ci_build,
+ :success,
+ :artifacts,
+ pipeline: pipeline,
+ status: pipeline.status,
+ name: 'build'
+ )
end
before do
diff --git a/spec/features/projects/branches_spec.rb b/spec/features/projects/branches_spec.rb
index 6a13d5637af..50df7bb7ca5 100644
--- a/spec/features/projects/branches_spec.rb
+++ b/spec/features/projects/branches_spec.rb
@@ -95,15 +95,22 @@ RSpec.describe 'Branches', feature_category: :groups_and_projects do
it 'shows only default_per_page active branches sorted by last updated' do
visit project_branches_filtered_path(project, state: 'active')
- expect(page).to have_content(sorted_branches(repository, count: Kaminari.config.default_per_page,
- sort_by: :updated_desc, state: 'active'))
+ expect(page).to have_content(sorted_branches(
+ repository,
+ count: Kaminari.config.default_per_page,
+ sort_by: :updated_desc,
+ state: 'active'
+ ))
end
it 'shows only default_per_page branches sorted by last updated on All branches' do
visit project_branches_filtered_path(project, state: 'all')
- expect(page).to have_content(sorted_branches(repository, count: Kaminari.config.default_per_page,
- sort_by: :updated_desc))
+ expect(page).to have_content(sorted_branches(
+ repository,
+ count: Kaminari.config.default_per_page,
+ sort_by: :updated_desc
+ ))
end
end
end
@@ -161,11 +168,15 @@ RSpec.describe 'Branches', feature_category: :groups_and_projects do
end
it 'avoids a N+1 query in branches index' do
+ new_branches_count = 20
+ sql_queries_count_threshold = 10
+
control_count = ActiveRecord::QueryRecorder.new { visit project_branches_path(project) }.count
- %w[one two three four five].each { |ref| repository.add_branch(user, ref, 'master') }
+ (1..new_branches_count).each { |number| repository.add_branch(user, "new-branch-#{number}", 'master') }
- expect { visit project_branches_filtered_path(project, state: 'all') }.not_to exceed_query_limit(control_count)
+ expect { visit project_branches_filtered_path(project, state: 'all') }
+ .not_to exceed_query_limit(control_count).with_threshold(sql_queries_count_threshold)
end
end
diff --git a/spec/features/projects/ci/editor_spec.rb b/spec/features/projects/ci/editor_spec.rb
index 9851194bd3c..43da57c16d1 100644
--- a/spec/features/projects/ci/editor_spec.rb
+++ b/spec/features/projects/ci/editor_spec.rb
@@ -10,18 +10,144 @@ RSpec.describe 'Pipeline Editor', :js, feature_category: :pipeline_composition d
let(:default_branch) { 'main' }
let(:other_branch) { 'test' }
+ let(:branch_with_invalid_ci) { 'despair' }
+
+ let(:default_content) { 'Default' }
+
+ let(:valid_content) do
+ <<~YAML
+ ---
+ stages:
+ - Build
+ - Test
+ job_a:
+ script: echo hello
+ stage: Build
+ job_b:
+ script: echo hello from job b
+ stage: Test
+ YAML
+ end
+
+ let(:invalid_content) do
+ <<~YAML
+
+ job3:
+ stage: stage_foo
+ script: echo 'Done.'
+ YAML
+ end
before do
sign_in(user)
project.add_developer(user)
- project.repository.create_file(user, project.ci_config_path_or_default, 'Default Content', message: 'Create CI file for main', branch_name: default_branch)
- project.repository.create_file(user, project.ci_config_path_or_default, 'Other Content', message: 'Create CI file for test', branch_name: other_branch)
+ project.repository.create_file(user, project.ci_config_path_or_default, default_content, message: 'Create CI file for main', branch_name: default_branch)
+ project.repository.create_file(user, project.ci_config_path_or_default, valid_content, message: 'Create CI file for test', branch_name: other_branch)
+ project.repository.create_file(user, project.ci_config_path_or_default, invalid_content, message: 'Create CI file for test', branch_name: branch_with_invalid_ci)
visit project_ci_pipeline_editor_path(project)
wait_for_requests
end
+ describe 'Default tabs' do
+ it 'renders the edit tab as the default' do
+ expect(page).to have_selector('[data-testid="editor-tab"]')
+ end
+
+ it 'renders the visualize, validate and full configuration tabs', :aggregate_failures do
+ expect(page).to have_selector('[data-testid="visualization-tab"]', visible: :hidden)
+ expect(page).to have_selector('[data-testid="validate-tab"]', visible: :hidden)
+ expect(page).to have_selector('[data-testid="merged-tab"]', visible: :hidden)
+ end
+ end
+
+ describe 'When CI yml has valid syntax' do
+ before do
+ visit project_ci_pipeline_editor_path(project, branch_name: other_branch)
+ wait_for_requests
+ end
+
+ it 'shows "Pipeline syntax is correct" in the lint widget' do
+ page.within('[data-testid="validation-segment"]') do
+ expect(page).to have_content("Pipeline syntax is correct")
+ end
+ end
+
+ it 'shows the graph in the visualization tab' do
+ click_link "Visualize"
+
+ page.within('[data-testid="graph-container"') do
+ expect(page).to have_content("job_a")
+ end
+ end
+
+ it 'can simulate pipeline in the validate tab' do
+ click_link "Validate"
+
+ click_button "Validate pipeline"
+ wait_for_requests
+
+ expect(page).to have_content("Simulation completed successfully")
+ end
+
+ it 'renders the merged yaml in the full configuration tab' do
+ click_link "Full configuration"
+
+ page.within('[data-testid="merged-tab"') do
+ expect(page).to have_content("job_a")
+ end
+ end
+ end
+
+ describe 'When CI yml has invalid syntax' do
+ before do
+ visit project_ci_pipeline_editor_path(project, branch_name: branch_with_invalid_ci)
+ wait_for_requests
+ end
+
+ it 'shows "Syntax is invalid" in the lint widget' do
+ page.within('[data-testid="validation-segment"]') do
+ expect(page).to have_content("This GitLab CI configuration is invalid")
+ end
+ end
+
+ it 'does not render the graph in the visualization tab and shows error' do
+ click_link "Visualize"
+
+ expect(page).not_to have_selector('[data-testid="graph-container"')
+ expect(page).to have_content("Your CI/CD configuration syntax is invalid. Select the Validate tab for more details.")
+ end
+
+ it 'gets a simulation error in the validate tab' do
+ click_link "Validate"
+
+ click_button "Validate pipeline"
+ wait_for_requests
+
+ expect(page).to have_content("Pipeline simulation completed with errors")
+ end
+
+ it 'renders merged yaml config' do
+ click_link "Full configuration"
+
+ page.within('[data-testid="merged-tab"') do
+ expect(page).to have_content("job3")
+ end
+ end
+ end
+
+ describe 'with unparsable yaml' do
+ it 'renders an error in the merged yaml tab' do
+ click_link "Full configuration"
+
+ page.within('[data-testid="merged-tab"') do
+ expect(page).not_to have_content("job_a")
+ expect(page).to have_content("Could not load full configuration content")
+ end
+ end
+ end
+
shared_examples 'default branch switcher behavior' do
def switch_to_branch(branch)
find('[data-testid="branch-selector"]').click
@@ -109,7 +235,7 @@ RSpec.describe 'Pipeline Editor', :js, feature_category: :pipeline_composition d
expect(page).to have_content('Pipeline Editor')
page.within('#source-editor-') do
- expect(page).to have_content('Default Content123')
+ expect(page).to have_content("#{default_content}123")
end
end
@@ -166,8 +292,8 @@ RSpec.describe 'Pipeline Editor', :js, feature_category: :pipeline_composition d
end
page.within('#source-editor-') do
- expect(page).to have_content('Default Content')
- expect(page).not_to have_content('Default Content123')
+ expect(page).to have_content(default_content)
+ expect(page).not_to have_content("#{default_content}123")
end
end
@@ -188,7 +314,7 @@ RSpec.describe 'Pipeline Editor', :js, feature_category: :pipeline_composition d
end
page.within('#source-editor-') do
- expect(page).to have_content('Default Content123')
+ expect(page).to have_content("#{default_content}123")
end
end
end
diff --git a/spec/features/projects/clusters/gcp_spec.rb b/spec/features/projects/clusters/gcp_spec.rb
index f9195904ea3..eadcc0e62c4 100644
--- a/spec/features/projects/clusters/gcp_spec.rb
+++ b/spec/features/projects/clusters/gcp_spec.rb
@@ -54,7 +54,7 @@ RSpec.describe 'Gcp Cluster', :js, feature_category: :deployment_management do
before do
visit project_clusters_path(project)
- click_button(class: 'dropdown-toggle-split')
+ click_button(class: 'gl-new-dropdown-toggle')
click_link 'Connect a cluster (certificate - deprecated)'
end
diff --git a/spec/features/projects/clusters/user_spec.rb b/spec/features/projects/clusters/user_spec.rb
index eb2601bb85f..6da8eea687e 100644
--- a/spec/features/projects/clusters/user_spec.rb
+++ b/spec/features/projects/clusters/user_spec.rb
@@ -25,7 +25,7 @@ RSpec.describe 'User Cluster', :js, feature_category: :deployment_management do
before do
visit project_clusters_path(project)
- click_button(class: 'dropdown-toggle-split')
+ click_button(class: 'gl-new-dropdown-toggle')
click_link 'Connect a cluster (certificate - deprecated)'
end
diff --git a/spec/features/projects/clusters_spec.rb b/spec/features/projects/clusters_spec.rb
index e2737d62749..d40f929d0b2 100644
--- a/spec/features/projects/clusters_spec.rb
+++ b/spec/features/projects/clusters_spec.rb
@@ -125,12 +125,12 @@ RSpec.describe 'Clusters', :js, feature_category: :groups_and_projects do
def visit_create_cluster_page
visit project_clusters_path(project)
- click_button(class: 'dropdown-toggle-split')
+ click_button(class: 'gl-new-dropdown-toggle')
click_link 'Create a cluster'
end
def visit_connect_cluster_page
- click_button(class: 'dropdown-toggle-split')
+ click_button(class: 'gl-new-dropdown-toggle')
click_link 'Connect a cluster (certificate - deprecated)'
end
end
diff --git a/spec/features/projects/commit/builds_spec.rb b/spec/features/projects/commit/builds_spec.rb
index dfd58a99953..54a189692ce 100644
--- a/spec/features/projects/commit/builds_spec.rb
+++ b/spec/features/projects/commit/builds_spec.rb
@@ -6,9 +6,7 @@ RSpec.describe 'project commit pipelines', :js, feature_category: :continuous_in
let(:project) { create(:project, :repository) }
before do
- create(:ci_pipeline, project: project,
- sha: project.commit.sha,
- ref: 'master')
+ create(:ci_pipeline, project: project, sha: project.commit.sha, ref: 'master')
user = create(:user)
project.add_maintainer(user)
diff --git a/spec/features/projects/commit/mini_pipeline_graph_spec.rb b/spec/features/projects/commit/mini_pipeline_graph_spec.rb
index 3611efd1477..d2104799e79 100644
--- a/spec/features/projects/commit/mini_pipeline_graph_spec.rb
+++ b/spec/features/projects/commit/mini_pipeline_graph_spec.rb
@@ -7,11 +7,13 @@ RSpec.describe 'Mini Pipeline Graph in Commit View', :js, feature_category: :sou
context 'when commit has pipelines' do
let(:pipeline) do
- create(:ci_pipeline,
- status: :running,
- project: project,
- ref: project.default_branch,
- sha: project.commit.sha)
+ create(
+ :ci_pipeline,
+ status: :running,
+ project: project,
+ ref: project.default_branch,
+ sha: project.commit.sha
+ )
end
let(:build) { create(:ci_build, pipeline: pipeline, status: :running) }
diff --git a/spec/features/projects/commits/user_browses_commits_spec.rb b/spec/features/projects/commits/user_browses_commits_spec.rb
index 791f626b8d9..3513e249b63 100644
--- a/spec/features/projects/commits/user_browses_commits_spec.rb
+++ b/spec/features/projects/commits/user_browses_commits_spec.rb
@@ -175,9 +175,13 @@ RSpec.describe 'User browses commits', feature_category: :source_code_management
let(:confidential_issue) { create(:issue, confidential: true, title: 'Secret issue!', project: project) }
before do
- project.repository.create_file(user, 'dummy-file', 'dummy content',
- branch_name: 'feature',
- message: "Linking #{confidential_issue.to_reference}")
+ project.repository.create_file(
+ user,
+ 'dummy-file',
+ 'dummy content',
+ branch_name: 'feature',
+ message: "Linking #{confidential_issue.to_reference}"
+ )
end
context 'when the user cannot see confidential issues but was cached with a link', :use_clean_rails_memory_store_fragment_caching do
diff --git a/spec/features/projects/compare_spec.rb b/spec/features/projects/compare_spec.rb
index beb5fa7822b..eff538513c1 100644
--- a/spec/features/projects/compare_spec.rb
+++ b/spec/features/projects/compare_spec.rb
@@ -24,7 +24,7 @@ RSpec.describe "Compare", :js, feature_category: :groups_and_projects do
click_button 'Compare'
- expect(page).to have_content 'Commits'
+ expect(page).to have_content 'Commits on Source'
expect(page).to have_link 'Create merge request'
end
end
@@ -53,7 +53,7 @@ RSpec.describe "Compare", :js, feature_category: :groups_and_projects do
select_using_dropdown('to', RepoHelpers.sample_commit.id, commit: true)
click_button 'Compare'
- expect(page).to have_content 'Commits (1)'
+ expect(page).to have_content 'Commits on Source (1)'
expect(page).to have_content "Showing 2 changed files"
diff = first('.js-unfold')
@@ -85,7 +85,7 @@ RSpec.describe "Compare", :js, feature_category: :groups_and_projects do
click_button 'Compare'
- expect(page).to have_content 'Commits (1)'
+ expect(page).to have_content 'Commits on Source (1)'
expect(page).to have_content 'Showing 1 changed file with 5 additions and 0 deletions'
expect(page).to have_link 'View open merge request', href: project_merge_request_path(project, merge_request)
expect(page).not_to have_link 'Create merge request'
@@ -136,14 +136,14 @@ RSpec.describe "Compare", :js, feature_category: :groups_and_projects do
visit project_compare_index_path(project, from: "feature", to: "master")
click_button('Compare')
- expect(page).to have_content 'Commits (29)'
+ expect(page).to have_content 'Commits on Source (29)'
# go to the second page
within(".files .gl-pagination") do
click_on("2")
end
- expect(page).not_to have_content 'Commits (29)'
+ expect(page).not_to have_content 'Commits on Source (29)'
end
end
end
@@ -159,7 +159,7 @@ RSpec.describe "Compare", :js, feature_category: :groups_and_projects do
expect(find(".js-compare-to-dropdown .gl-dropdown-button-text")).to have_content("v1.1.0")
click_button "Compare"
- expect(page).to have_content "Commits"
+ expect(page).to have_content "Commits on Source"
end
end
diff --git a/spec/features/projects/environments/environment_spec.rb b/spec/features/projects/environments/environment_spec.rb
index 0f903901984..11ea72b87a2 100644
--- a/spec/features/projects/environments/environment_spec.rb
+++ b/spec/features/projects/environments/environment_spec.rb
@@ -300,14 +300,12 @@ RSpec.describe 'Environment', feature_category: :groups_and_projects do
context 'with manual action' do
let(:action) do
- create(:ci_build, :manual, pipeline: pipeline,
- name: 'deploy to production', environment: environment.name)
+ create(:ci_build, :manual, pipeline: pipeline, name: 'deploy to production', environment: environment.name)
end
context 'when user has ability to trigger deployment' do
let(:permissions) do
- create(:protected_branch, :developers_can_merge,
- name: action.ref, project: project)
+ create(:protected_branch, :developers_can_merge, name: action.ref, project: project)
end
it 'does show a play button' do
@@ -331,8 +329,7 @@ RSpec.describe 'Environment', feature_category: :groups_and_projects do
context 'when user has no ability to trigger a deployment' do
let(:permissions) do
- create(:protected_branch, :no_one_can_merge,
- name: action.ref, project: project)
+ create(:protected_branch, :no_one_can_merge, name: action.ref, project: project)
end
it 'does not show a play button' do
@@ -391,10 +388,7 @@ RSpec.describe 'Environment', feature_category: :groups_and_projects do
end
let(:deployment) do
- create(:deployment, :success,
- environment: environment,
- deployable: build,
- on_stop: 'close_app')
+ create(:deployment, :success, environment: environment, deployable: build, on_stop: 'close_app')
end
context 'when user has ability to stop environment' do
@@ -411,8 +405,7 @@ RSpec.describe 'Environment', feature_category: :groups_and_projects do
context 'when user has no ability to stop environment' do
let(:permissions) do
- create(:protected_branch, :no_one_can_merge,
- name: action.ref, project: project)
+ create(:protected_branch, :no_one_can_merge, name: action.ref, project: project)
end
it 'does not allow to stop environment', :js do
@@ -445,9 +438,7 @@ RSpec.describe 'Environment', feature_category: :groups_and_projects do
describe 'environment folders', :js do
context 'when folder name contains special charaters' do
before do
- create(:environment, project: project,
- name: 'staging-1.0/review',
- state: :available)
+ create(:environment, project: project, name: 'staging-1.0/review', state: :available)
end
it 'renders a correct environment folder' do
@@ -465,8 +456,7 @@ RSpec.describe 'Environment', feature_category: :groups_and_projects do
let(:project) { create(:project, :repository) }
let!(:environment) do
- create(:environment, :with_review_app, project: project,
- ref: 'feature')
+ create(:environment, :with_review_app, project: project, ref: 'feature')
end
it 'user visits environment page', :js do
diff --git a/spec/features/projects/environments/environments_spec.rb b/spec/features/projects/environments/environments_spec.rb
index 2490b1fde8e..3a2c7f0ac7b 100644
--- a/spec/features/projects/environments/environments_spec.rb
+++ b/spec/features/projects/environments/environments_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Environments page', :js, feature_category: :groups_and_projects do
+RSpec.describe 'Environments page', :js, feature_category: :continuous_delivery do
include Spec::Support::Helpers::ModalHelpers
let(:project) { create(:project) }
@@ -159,9 +159,7 @@ RSpec.describe 'Environments page', :js, feature_category: :groups_and_projects
let(:project) { create(:project, :repository) }
let!(:deployment) do
- create(:deployment, :success,
- environment: environment,
- sha: project.commit.id)
+ create(:deployment, :success, environment: environment, sha: project.commit.id)
end
it 'shows deployment SHA and internal ID' do
@@ -182,10 +180,7 @@ RSpec.describe 'Environments page', :js, feature_category: :groups_and_projects
end
let!(:deployment) do
- create(:deployment, :success,
- environment: environment,
- deployable: build,
- sha: project.commit.id)
+ create(:deployment, :success, environment: environment, deployable: build, sha: project.commit.id)
end
before do
@@ -241,10 +236,7 @@ RSpec.describe 'Environments page', :js, feature_category: :groups_and_projects
end
let(:deployment) do
- create(:deployment, :success,
- environment: environment,
- deployable: build,
- on_stop: 'close_app')
+ create(:deployment, :success, environment: environment, deployable: build, on_stop: 'close_app')
end
it 'shows a stop button and dialog' do
@@ -296,18 +288,11 @@ RSpec.describe 'Environments page', :js, feature_category: :groups_and_projects
let!(:build) { create(:ci_build, pipeline: pipeline) }
let!(:delayed_job) do
- create(:ci_build, :scheduled,
- pipeline: pipeline,
- name: 'delayed job',
- stage: 'test')
+ create(:ci_build, :scheduled, pipeline: pipeline, name: 'delayed job', stage: 'test')
end
let!(:deployment) do
- create(:deployment,
- :success,
- environment: environment,
- deployable: build,
- sha: project.commit.id)
+ create(:deployment, :success, environment: environment, deployable: build, sha: project.commit.id)
end
before do
@@ -327,10 +312,7 @@ RSpec.describe 'Environments page', :js, feature_category: :groups_and_projects
context 'when delayed job is expired already' do
let!(:delayed_job) do
- create(:ci_build, :expired_scheduled,
- pipeline: pipeline,
- name: 'delayed job',
- stage: 'test')
+ create(:ci_build, :expired_scheduled, pipeline: pipeline, name: 'delayed job', stage: 'test')
end
it "shows 00:00:00 as the remaining time" do
@@ -365,9 +347,7 @@ RSpec.describe 'Environments page', :js, feature_category: :groups_and_projects
let(:project) { create(:project, :repository) }
let!(:deployment) do
- create(:deployment, :failed,
- environment: environment,
- sha: project.commit.id)
+ create(:deployment, :failed, environment: environment, sha: project.commit.id)
end
it 'does not show deployments', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/409990' do
@@ -382,9 +362,7 @@ RSpec.describe 'Environments page', :js, feature_category: :groups_and_projects
let_it_be(:project) { create(:project, :repository) }
let!(:deployment) do
- create(:deployment, :running,
- environment: environment,
- sha: project.commit.id)
+ create(:deployment, :running, environment: environment, sha: project.commit.id)
end
it "renders the upcoming deployment", :aggregate_failures do
@@ -443,14 +421,8 @@ RSpec.describe 'Environments page', :js, feature_category: :groups_and_projects
describe 'environments folders' do
describe 'available environments' do
before do
- create(:environment, :will_auto_stop,
- project: project,
- name: 'staging/review-1',
- state: :available)
- create(:environment, :will_auto_stop,
- project: project,
- name: 'staging/review-2',
- state: :available)
+ create(:environment, :will_auto_stop, project: project, name: 'staging/review-1', state: :available)
+ create(:environment, :will_auto_stop, project: project, name: 'staging/review-2', state: :available)
end
it 'users unfurls an environment folder' do
@@ -470,14 +442,8 @@ RSpec.describe 'Environments page', :js, feature_category: :groups_and_projects
describe 'stopped environments' do
before do
- create(:environment, :will_auto_stop,
- project: project,
- name: 'staging/review-1',
- state: :stopped)
- create(:environment, :will_auto_stop,
- project: project,
- name: 'staging/review-2',
- state: :stopped)
+ create(:environment, :will_auto_stop, project: project, name: 'staging/review-1', state: :stopped)
+ create(:environment, :will_auto_stop, project: project, name: 'staging/review-2', state: :stopped)
end
it 'users unfurls an environment folder' do
@@ -497,12 +463,8 @@ RSpec.describe 'Environments page', :js, feature_category: :groups_and_projects
describe 'environments folders view' do
before do
- create(:environment, project: project,
- name: 'staging.review/review-1',
- state: :available)
- create(:environment, project: project,
- name: 'staging.review/review-2',
- state: :available)
+ create(:environment, project: project, name: 'staging.review/review-1', state: :available)
+ create(:environment, project: project, name: 'staging.review/review-2', state: :available)
end
it 'user opens folder view' do
diff --git a/spec/features/projects/feature_flags/user_deletes_feature_flag_spec.rb b/spec/features/projects/feature_flags/user_deletes_feature_flag_spec.rb
index 852d7bca96a..2c8d7275fbf 100644
--- a/spec/features/projects/feature_flags/user_deletes_feature_flag_spec.rb
+++ b/spec/features/projects/feature_flags/user_deletes_feature_flag_spec.rb
@@ -9,8 +9,7 @@ RSpec.describe 'User deletes feature flag', :js, feature_category: :feature_flag
let(:project) { create(:project, namespace: user.namespace) }
let!(:feature_flag) do
- create_flag(project, 'ci_live_trace', false,
- description: 'For live trace feature')
+ create_flag(project, 'ci_live_trace', false, description: 'For live trace feature')
end
before do
diff --git a/spec/features/projects/files/download_buttons_spec.rb b/spec/features/projects/files/download_buttons_spec.rb
index 9b3d19cfea3..81bd0523c70 100644
--- a/spec/features/projects/files/download_buttons_spec.rb
+++ b/spec/features/projects/files/download_buttons_spec.rb
@@ -7,18 +7,11 @@ RSpec.describe 'Projects > Files > Download buttons in files tree', feature_cate
let(:user) { project.creator }
let(:pipeline) do
- create(:ci_pipeline,
- project: project,
- sha: project.commit.sha,
- ref: project.default_branch,
- status: 'success')
+ create(:ci_pipeline, project: project, sha: project.commit.sha, ref: project.default_branch, status: 'success')
end
let!(:build) do
- create(:ci_build, :success, :artifacts,
- pipeline: pipeline,
- status: pipeline.status,
- name: 'build')
+ create(:ci_build, :success, :artifacts, pipeline: pipeline, status: pipeline.status, name: 'build')
end
before do
diff --git a/spec/features/projects/files/editing_a_file_spec.rb b/spec/features/projects/files/editing_a_file_spec.rb
index b4edd5c2729..6efe1eb1ad1 100644
--- a/spec/features/projects/files/editing_a_file_spec.rb
+++ b/spec/features/projects/files/editing_a_file_spec.rb
@@ -13,16 +13,14 @@ RSpec.describe 'Projects > Files > User wants to edit a file', feature_category:
commit_message: "Committing First Update",
file_path: ".gitignore",
file_content: "First Update",
- last_commit_sha: Gitlab::Git::Commit.last_for_path(project.repository, project.default_branch,
- ".gitignore").sha
+ last_commit_sha: Gitlab::Git::Commit.last_for_path(project.repository, project.default_branch, ".gitignore").sha
}
end
context 'when the user has write access' do
before do
sign_in user
- visit project_edit_blob_path(project,
- File.join(project.default_branch, '.gitignore'))
+ visit project_edit_blob_path(project, File.join(project.default_branch, '.gitignore'))
end
it 'file has been updated since the user opened the edit page' do
@@ -43,8 +41,7 @@ RSpec.describe 'Projects > Files > User wants to edit a file', feature_category:
before do
forked_project
sign_in user
- visit project_edit_blob_path(project,
- File.join(project.default_branch, '.gitignore'))
+ visit project_edit_blob_path(project, File.join(project.default_branch, '.gitignore'))
end
context 'and the forked project is ahead of the upstream project' do
diff --git a/spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb b/spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb
index bfe1fd073c5..c8543764d15 100644
--- a/spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb
+++ b/spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'Projects > Files > Project owner sees a link to create a license file in empty project', :js,
-feature_category: :groups_and_projects do
+ feature_category: :groups_and_projects do
include Features::WebIdeSpecHelpers
let(:project) { create(:project_empty_repo) }
diff --git a/spec/features/projects/files/user_browses_a_tree_with_a_folder_containing_only_a_folder_spec.rb b/spec/features/projects/files/user_browses_a_tree_with_a_folder_containing_only_a_folder_spec.rb
index 645bfeb14e3..37b718061c6 100644
--- a/spec/features/projects/files/user_browses_a_tree_with_a_folder_containing_only_a_folder_spec.rb
+++ b/spec/features/projects/files/user_browses_a_tree_with_a_folder_containing_only_a_folder_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
# This is a regression test for https://gitlab.com/gitlab-org/gitlab-foss/issues/37569
RSpec.describe 'Projects > Files > User browses a tree with a folder containing only a folder', :js,
-feature_category: :groups_and_projects do
+ feature_category: :groups_and_projects do
let(:project) { create(:project, :empty_repo) }
let(:user) { project.first_owner }
diff --git a/spec/features/projects/files/user_browses_files_spec.rb b/spec/features/projects/files/user_browses_files_spec.rb
index bb14b9c4e31..3b30a620257 100644
--- a/spec/features/projects/files/user_browses_files_spec.rb
+++ b/spec/features/projects/files/user_browses_files_spec.rb
@@ -134,7 +134,7 @@ RSpec.describe "User browses files", :js, feature_category: :groups_and_projects
click_link("Rake tasks")
expect(page).to have_current_path(project_tree_path(project, "markdown/doc/raketasks"), ignore_query: true)
- expect(page).to have_content("backup_restore.md").and have_content("maintenance.md")
+ expect(page).to have_content("maintenance.md")
click_link("maintenance.md")
diff --git a/spec/features/projects/files/user_creates_directory_spec.rb b/spec/features/projects/files/user_creates_directory_spec.rb
index 070b6dbec7d..d824b3b1759 100644
--- a/spec/features/projects/files/user_creates_directory_spec.rb
+++ b/spec/features/projects/files/user_creates_directory_spec.rb
@@ -24,7 +24,7 @@ RSpec.describe 'Projects > Files > User creates a directory', :js, feature_categ
context 'with default target branch' do
before do
first('.add-to-tree').click
- click_link('New directory')
+ click_button('New directory')
end
it 'creates the directory in the default branch' do
@@ -55,7 +55,7 @@ RSpec.describe 'Projects > Files > User creates a directory', :js, feature_categ
end
first('.add-to-tree').click
- click_link('New directory')
+ click_button('New directory')
fill_in(:dir_name, with: 'new_directory')
click_button('Create directory')
@@ -68,7 +68,7 @@ RSpec.describe 'Projects > Files > User creates a directory', :js, feature_categ
context 'with a new target branch' do
before do
first('.add-to-tree').click
- click_link('New directory')
+ click_button('New directory')
fill_in(:dir_name, with: 'new_directory')
fill_in(:branch_name, with: 'new-feature')
click_button('Create directory')
@@ -99,7 +99,7 @@ RSpec.describe 'Projects > Files > User creates a directory', :js, feature_categ
find('.add-to-tree').click
wait_for_requests
- click_link('New directory')
+ click_button('New directory')
fill_in(:dir_name, with: 'new_directory')
fill_in(:commit_message, with: 'New commit message', visible: true)
click_button('Create directory')
diff --git a/spec/features/projects/import_export/export_file_spec.rb b/spec/features/projects/import_export/export_file_spec.rb
index 3c39d8745a4..ad2fccc14bf 100644
--- a/spec/features/projects/import_export/export_file_spec.rb
+++ b/spec/features/projects/import_export/export_file_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
# Integration test that exports a file using the Import/Export feature
# It looks up for any sensitive word inside the JSON, so if a sensitive word is found
# we'll have to either include it adding the model that includes it to the +safe_list+
-# or make sure the attribute is blacklisted in the +import_export.yml+ configuration
+# or make sure the attribute is denylisted in the +import_export.yml+ configuration
RSpec.describe 'Import/Export - project export integration test', :js, feature_category: :importers do
include ExportFileHelper
diff --git a/spec/features/projects/integrations/user_activates_prometheus_spec.rb b/spec/features/projects/integrations/user_activates_prometheus_spec.rb
index a47000672ca..db71256b294 100644
--- a/spec/features/projects/integrations/user_activates_prometheus_spec.rb
+++ b/spec/features/projects/integrations/user_activates_prometheus_spec.rb
@@ -13,7 +13,6 @@ RSpec.describe 'User activates Prometheus', feature_category: :integrations 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')
diff --git a/spec/features/projects/issuable_templates_spec.rb b/spec/features/projects/issuable_templates_spec.rb
index 72695680809..4221fa26e00 100644
--- a/spec/features/projects/issuable_templates_spec.rb
+++ b/spec/features/projects/issuable_templates_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe 'issuable templates', :js, feature_category: :groups_and_projects do
include ProjectForksHelper
include CookieHelper
+ include ContentEditorHelpers
let(:user) { create(:user) }
let(:project) { create(:project, :public, :repository) }
@@ -18,7 +19,7 @@ RSpec.describe 'issuable templates', :js, feature_category: :groups_and_projects
context 'user creates an issue using templates' do
let(:template_content) { 'this is a test "bug" template' }
- let(:longtemplate_content) { %Q(this\n\n\n\n\nis\n\n\n\n\na\n\n\n\n\nbug\n\n\n\n\ntemplate) }
+ let(:longtemplate_content) { %(this\n\n\n\n\nis\n\n\n\n\na\n\n\n\n\nbug\n\n\n\n\ntemplate) }
let(:issue) { create(:issue, author: user, assignees: [user], project: project) }
let(:description_addition) { ' appending to description' }
@@ -36,6 +37,7 @@ RSpec.describe 'issuable templates', :js, feature_category: :groups_and_projects
message: 'added issue template',
branch_name: 'master')
visit project_issue_path project, issue
+ close_rich_text_promo_popover_if_present
page.find('.js-issuable-edit').click
fill_in :'issuable-title', with: 'test issue title'
end
@@ -79,6 +81,7 @@ RSpec.describe 'issuable templates', :js, feature_category: :groups_and_projects
message: 'added issue template',
branch_name: 'master')
visit project_issue_path project, issue
+ close_rich_text_promo_popover_if_present
page.find('.js-issuable-edit').click
fill_in :'issuable-title', with: 'test issue title'
fill_in :'issue-description', with: prior_description
@@ -108,6 +111,7 @@ RSpec.describe 'issuable templates', :js, feature_category: :groups_and_projects
it 'does not overwrite autosaved description' do
visit new_project_issue_path project
wait_for_requests
+ close_rich_text_promo_popover_if_present
assert_template # default template is loaded the first time
@@ -141,6 +145,7 @@ RSpec.describe 'issuable templates', :js, feature_category: :groups_and_projects
message: 'added merge request bug template',
branch_name: 'master')
visit edit_project_merge_request_path project, merge_request
+ close_rich_text_promo_popover_if_present
fill_in :'merge_request[title]', with: 'test merge request title'
end
@@ -200,6 +205,7 @@ RSpec.describe 'issuable templates', :js, feature_category: :groups_and_projects
message: 'added merge request template',
branch_name: 'master')
visit edit_project_merge_request_path project, merge_request
+ close_rich_text_promo_popover_if_present
fill_in :'merge_request[title]', with: 'test merge request title'
end
diff --git a/spec/features/projects/issues/design_management/user_views_design_spec.rb b/spec/features/projects/issues/design_management/user_views_design_spec.rb
index 268c209cba1..bd9d1092e17 100644
--- a/spec/features/projects/issues/design_management/user_views_design_spec.rb
+++ b/spec/features/projects/issues/design_management/user_views_design_spec.rb
@@ -5,16 +5,67 @@ require 'spec_helper'
RSpec.describe 'User views issue designs', :js, feature_category: :design_management do
include DesignManagementTestHelpers
+ let_it_be(:user) { create(:user) }
+ let_it_be(:guest_user) { create(:user) }
let_it_be(:project) { create(:project_empty_repo, :public) }
let_it_be(:issue) { create(:issue, project: project) }
let_it_be(:design) { create(:design, :with_file, issue: issue) }
+ let_it_be(:note) { create(:diff_note_on_design, noteable: design, author: user) }
+
+ def add_diff_note_emoji(diff_note, emoji_name)
+ page.within(first(".image-notes li#note_#{diff_note.id}.design-note")) do
+ page.find('[data-testid="note-emoji-button"] .note-emoji-button').click
+
+ page.within('ul.dropdown-menu') do
+ page.find('input[type="search"]').set(emoji_name)
+ page.find('button[data-testid="emoji-button"]:first-child').click
+ end
+ end
+ end
+
+ def remove_diff_note_emoji(diff_note, emoji_name)
+ page.within(first(".image-notes li#note_#{diff_note.id}.design-note")) do
+ page.find(".awards button[data-emoji-name='#{emoji_name}']").click
+ end
+ end
+
+ before_all do
+ project.add_maintainer(user)
+ project.add_guest(guest_user)
+ end
before do
enable_design_management
+ sign_in(user)
+
visit project_issue_path(project, issue)
end
+ shared_examples 'design discussion emoji awards' do
+ it 'allows user to add emoji reaction to a comment' do
+ click_link design.filename
+
+ add_diff_note_emoji(note, 'thumbsup')
+
+ expect(page.find("li#note_#{note.id} .awards")).to have_selector('button[title="You reacted with :thumbsup:"]')
+ end
+
+ it 'allows user to remove emoji reaction from a comment' do
+ click_link design.filename
+
+ add_diff_note_emoji(note, 'thumbsup')
+
+ # Wait for emoji to be added
+ wait_for_requests
+
+ remove_diff_note_emoji(note, 'thumbsup')
+
+ # Only award emoji that was present has been removed
+ expect(page.find("li#note_#{note.id}")).not_to have_selector('.awards')
+ end
+ end
+
it 'opens design detail' do
click_link design.filename
@@ -25,6 +76,26 @@ RSpec.describe 'User views issue designs', :js, feature_category: :design_manage
expect(page).to have_selector('.js-design-image')
end
+ it 'shows a comment within design' do
+ click_link design.filename
+
+ expect(page.find('.image-notes .design-note .note-text')).to have_content(note.note)
+ end
+
+ it_behaves_like 'design discussion emoji awards'
+
+ context 'when user is guest' do
+ before do
+ enable_design_management
+
+ sign_in(guest_user)
+
+ visit project_issue_path(project, issue)
+ end
+
+ it_behaves_like 'design discussion emoji awards'
+ end
+
context 'when svg file is loaded in design detail' do
let_it_be(:file) { Rails.root.join('spec/fixtures/svg_without_attr.svg') }
let_it_be(:design) { create(:design, :with_file, filename: 'svg_without_attr.svg', file: file, issue: issue) }
diff --git a/spec/features/projects/issues/viewing_issues_with_external_authorization_enabled_spec.rb b/spec/features/projects/issues/viewing_issues_with_external_authorization_enabled_spec.rb
index 3d40bae8544..bf1b2f7e5cd 100644
--- a/spec/features/projects/issues/viewing_issues_with_external_authorization_enabled_spec.rb
+++ b/spec/features/projects/issues/viewing_issues_with_external_authorization_enabled_spec.rb
@@ -8,26 +8,19 @@ RSpec.describe 'viewing an issue with cross project references' do
let(:user) { create(:user) }
let(:other_project) do
- create(:project, :public,
- external_authorization_classification_label: 'other_label')
+ create(:project, :public, external_authorization_classification_label: 'other_label')
end
let(:other_issue) do
- create(:issue, :closed,
- title: 'I am in another project',
- project: other_project)
+ create(:issue, :closed, title: 'I am in another project', project: other_project)
end
let(:other_confidential_issue) do
- create(:issue, :confidential, :closed,
- title: 'I am in another project and confidential',
- project: other_project)
+ create(:issue, :confidential, :closed, title: 'I am in another project and confidential', project: other_project)
end
let(:other_merge_request) do
- create(:merge_request, :closed,
- title: 'I am a merge request in another project',
- source_project: other_project)
+ create(:merge_request, :closed, title: 'I am a merge request in another project', source_project: other_project)
end
let(:description_referencing_other_issue) do
@@ -39,15 +32,11 @@ RSpec.describe 'viewing an issue with cross project references' do
let(:project) { create(:project) }
let(:issue) do
- create(:issue,
- project: project,
- description: description_referencing_other_issue)
+ create(:issue, project: project, description: description_referencing_other_issue)
end
let(:confidential_issue) do
- create(:issue, :confidential, :closed,
- title: "I am in the same project and confidential",
- project: project)
+ create(:issue, :confidential, :closed, title: "I am in the same project and confidential", project: project)
end
before do
diff --git a/spec/features/projects/jobs/user_browses_jobs_spec.rb b/spec/features/projects/jobs/user_browses_jobs_spec.rb
index aeba53c22b6..77f95827d88 100644
--- a/spec/features/projects/jobs/user_browses_jobs_spec.rb
+++ b/spec/features/projects/jobs/user_browses_jobs_spec.rb
@@ -79,8 +79,7 @@ RSpec.describe 'User browses jobs', feature_category: :groups_and_projects do
context 'when a job can be retried' do
let!(:job) do
- create(:ci_build, pipeline: pipeline,
- stage: 'test')
+ create(:ci_build, pipeline: pipeline, stage: 'test')
end
before do
@@ -148,10 +147,7 @@ RSpec.describe 'User browses jobs', feature_category: :groups_and_projects do
context 'with downloadable artifacts' do
let!(:with_artifacts) do
- build = create(:ci_build, :success,
- pipeline: pipeline,
- name: 'rspec tests',
- stage: 'test')
+ build = create(:ci_build, :success, pipeline: pipeline, name: 'rspec tests', stage: 'test')
create(:ci_job_artifact, :archive, job: build)
end
@@ -167,10 +163,7 @@ RSpec.describe 'User browses jobs', feature_category: :groups_and_projects do
context 'with artifacts expired' do
let!(:with_artifacts_expired) do
- create(:ci_build, :expired, :success,
- pipeline: pipeline,
- name: 'rspec',
- stage: 'test')
+ create(:ci_build, :expired, :success, pipeline: pipeline, name: 'rspec', stage: 'test')
end
before do
@@ -188,8 +181,7 @@ RSpec.describe 'User browses jobs', feature_category: :groups_and_projects do
context 'column links' do
let!(:job) do
- create(:ci_build, pipeline: pipeline,
- stage: 'test')
+ create(:ci_build, pipeline: pipeline, stage: 'test')
end
before do
diff --git a/spec/features/projects/jobs_spec.rb b/spec/features/projects/jobs_spec.rb
index fcd07d33535..c203e644280 100644
--- a/spec/features/projects/jobs_spec.rb
+++ b/spec/features/projects/jobs_spec.rb
@@ -306,7 +306,7 @@ RSpec.describe 'Jobs', :clean_gitlab_redis_shared_state, feature_category: :grou
artifact_request = requests.find { |req| req.url.include?('artifacts/download') }
- expect(artifact_request.response_headers['Content-Disposition']).to eq(%Q{attachment; filename="#{job.artifacts_file.filename}"; filename*=UTF-8''#{job.artifacts_file.filename}})
+ expect(artifact_request.response_headers['Content-Disposition']).to eq(%{attachment; filename="#{job.artifacts_file.filename}"; filename*=UTF-8''#{job.artifacts_file.filename}})
expect(artifact_request.response_headers['Content-Transfer-Encoding']).to eq("binary")
expect(artifact_request.response_headers['Content-Type']).to eq("image/gif")
expect(artifact_request.body).to eq(job.artifacts_file.file.read.b)
diff --git a/spec/features/projects/members/group_member_cannot_request_access_to_his_group_project_spec.rb b/spec/features/projects/members/group_member_cannot_request_access_to_his_group_project_spec.rb
index 6656ca3ef18..2780326cd35 100644
--- a/spec/features/projects/members/group_member_cannot_request_access_to_his_group_project_spec.rb
+++ b/spec/features/projects/members/group_member_cannot_request_access_to_his_group_project_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'Projects > Members > Group member cannot request access to their group project',
-feature_category: :groups_and_projects do
+ feature_category: :groups_and_projects do
let(:user) { create(:user) }
let(:group) { create(:group) }
let(:project) { create(:project, namespace: group) }
diff --git a/spec/features/projects/members/group_requester_cannot_request_access_to_project_spec.rb b/spec/features/projects/members/group_requester_cannot_request_access_to_project_spec.rb
index 9db34cee5d6..47cd0d612b5 100644
--- a/spec/features/projects/members/group_requester_cannot_request_access_to_project_spec.rb
+++ b/spec/features/projects/members/group_requester_cannot_request_access_to_project_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'Projects > Members > Group requester cannot request access to project', :js,
-feature_category: :groups_and_projects do
+ feature_category: :groups_and_projects do
let(:user) { create(:user) }
let(:owner) { create(:user) }
let(:group) { create(:group, :public) }
diff --git a/spec/features/projects/members/user_requests_access_spec.rb b/spec/features/projects/members/user_requests_access_spec.rb
index 6f76424e377..9af36b4b2a9 100644
--- a/spec/features/projects/members/user_requests_access_spec.rb
+++ b/spec/features/projects/members/user_requests_access_spec.rb
@@ -38,9 +38,11 @@ RSpec.describe 'Projects > Members > User requests access', :js, feature_categor
context 'code access is restricted' do
it 'user can request access' do
- project.project_feature.update!(repository_access_level: ProjectFeature::PRIVATE,
- builds_access_level: ProjectFeature::PRIVATE,
- merge_requests_access_level: ProjectFeature::PRIVATE)
+ project.project_feature.update!(
+ repository_access_level: ProjectFeature::PRIVATE,
+ builds_access_level: ProjectFeature::PRIVATE,
+ merge_requests_access_level: ProjectFeature::PRIVATE
+ )
visit project_path(project)
expect(page).to have_content 'Request Access'
diff --git a/spec/features/projects/milestones/gfm_autocomplete_spec.rb b/spec/features/projects/milestones/gfm_autocomplete_spec.rb
index d4ce10b5cb5..0705cdd0d9e 100644
--- a/spec/features/projects/milestones/gfm_autocomplete_spec.rb
+++ b/spec/features/projects/milestones/gfm_autocomplete_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'GFM autocomplete', :js, feature_category: :team_planning do
+ include Features::AutocompleteHelpers
+
let_it_be(:user) { create(:user, name: '💃speciąl someone💃', username: 'someone.special') }
let_it_be(:group) { create(:group, name: 'Ancestor') }
let_it_be(:project) { create(:project, :repository, group: group) }
@@ -68,10 +70,6 @@ RSpec.describe 'GFM autocomplete', :js, feature_category: :team_planning do
private
- def find_autocomplete_menu
- find('.atwho-view ul', visible: true)
- end
-
def expect_autocomplete_entry(entry)
page.within('.atwho-container') do
expect(page).to have_content(entry)
diff --git a/spec/features/projects/navbar_spec.rb b/spec/features/projects/navbar_spec.rb
index 97dfeb6fd06..b6645e9b710 100644
--- a/spec/features/projects/navbar_spec.rb
+++ b/spec/features/projects/navbar_spec.rb
@@ -15,8 +15,6 @@ RSpec.describe 'Project navbar', :with_license, feature_category: :groups_and_pr
before do
sign_in(user)
- stub_feature_flags(show_pages_in_deployments_menu: false)
-
stub_config(registry: { enabled: false })
stub_feature_flags(harbor_registry_integration: false)
stub_feature_flags(ml_experiment_tracking: false)
@@ -53,8 +51,8 @@ RSpec.describe 'Project navbar', :with_license, feature_category: :groups_and_pr
stub_config(pages: { enabled: true })
insert_after_sub_nav_item(
- _('Packages and registries'),
- within: _('Settings'),
+ _('Releases'),
+ within: _('Deployments'),
new_sub_nav_item_name: _('Pages')
)
diff --git a/spec/features/projects/pages/user_adds_domain_spec.rb b/spec/features/projects/pages/user_adds_domain_spec.rb
index 708210e669c..ae459197b38 100644
--- a/spec/features/projects/pages/user_adds_domain_spec.rb
+++ b/spec/features/projects/pages/user_adds_domain_spec.rb
@@ -178,7 +178,7 @@ RSpec.describe 'User adds pages domain', :js, feature_category: :pages do
visit project_pages_path(project)
within('#content-body') { click_link 'Edit' }
- expect(page).to have_field :domain_dns, with: "#{domain.domain} ALIAS #{domain.project.pages_subdomain}.#{Settings.pages.host}."
+ expect(page).to have_field :domain_dns, with: "#{domain.domain} ALIAS namespace1.example.com."
end
end
end
diff --git a/spec/features/projects/pages/user_edits_settings_spec.rb b/spec/features/projects/pages/user_edits_settings_spec.rb
index 8c713b6f73a..eec9f2befb6 100644
--- a/spec/features/projects/pages/user_edits_settings_spec.rb
+++ b/spec/features/projects/pages/user_edits_settings_spec.rb
@@ -10,8 +10,6 @@ RSpec.describe 'Pages edits pages settings', :js, feature_category: :pages do
before do
allow(Gitlab.config.pages).to receive(:enabled).and_return(true)
- stub_feature_flags(show_pages_in_deployments_menu: false)
-
project.add_maintainer(user)
sign_in(user)
@@ -82,25 +80,39 @@ RSpec.describe 'Pages edits pages settings', :js, feature_category: :pages do
end
end
- describe 'project settings page' do
- it 'renders "Pages" tab' do
- visit edit_project_path(project)
+ describe 'menu entry' do
+ describe 'on the pages page' do
+ it 'renders "Pages" tab' do
+ visit project_pages_path(project)
- page.within '.nav-sidebar' do
- expect(page).to have_link('Pages')
+ page.within '.nav-sidebar' do
+ expect(page).to have_link('Pages')
+ end
end
end
- context 'when pages are disabled' do
- before do
- allow(Gitlab.config.pages).to receive(:enabled).and_return(false)
+ describe 'in another menu entry under deployments' do
+ context 'when pages are enabled' do
+ it 'renders "Pages" tab' do
+ visit project_environments_path(project)
+
+ page.within '.nav-sidebar' do
+ expect(page).to have_link('Pages')
+ end
+ end
end
- it 'does not render "Pages" tab' do
- visit edit_project_path(project)
+ context 'when pages are disabled' do
+ before do
+ allow(Gitlab.config.pages).to receive(:enabled).and_return(false)
+ end
- page.within '.nav-sidebar' do
- expect(page).not_to have_link('Pages')
+ it 'does not render "Pages" tab' do
+ visit project_environments_path(project)
+
+ page.within '.nav-sidebar' do
+ expect(page).not_to have_link('Pages')
+ end
end
end
end
diff --git a/spec/features/projects/pipelines/pipeline_spec.rb b/spec/features/projects/pipelines/pipeline_spec.rb
index abc9e3d30fc..bb49fb734d7 100644
--- a/spec/features/projects/pipelines/pipeline_spec.rb
+++ b/spec/features/projects/pipelines/pipeline_spec.rb
@@ -13,7 +13,6 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
let(:role) { :developer }
before do
- stub_feature_flags(pipeline_details_header_vue: false)
sign_in(user)
project.add_role(user, role)
end
@@ -22,42 +21,39 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
let!(:external_stage) { create(:ci_stage, name: 'external', pipeline: pipeline) }
let!(:build_passed) do
- create(:ci_build, :success,
- pipeline: pipeline, stage: 'build', stage_idx: 0, name: 'build')
+ 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')
+ 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')
+ 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')
+ 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')
+ 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')
+ 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',
- ci_stage: external_stage,
- ref: 'master',
- target_url: 'http://gitlab.com/status')
+ create(
+ :generic_commit_status,
+ status: 'success',
+ pipeline: pipeline,
+ name: 'jenkins',
+ ci_stage: external_stage,
+ ref: 'master',
+ target_url: 'http://gitlab.com/status'
+ )
end
end
@@ -93,9 +89,9 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
it 'shows the pipeline information' do
visit_pipeline
- within '.pipeline-info' do
- expect(page).to have_content("#{pipeline.statuses.count} jobs " \
- "for #{pipeline.ref}")
+ within '[data-testid="pipeline-details-header"]' do
+ expect(page).to have_content("For #{pipeline.ref}")
+ expect(page).to have_content("#{pipeline.statuses.count} Jobs")
expect(page).to have_link(pipeline.ref,
href: project_commits_path(pipeline.project, pipeline.ref))
end
@@ -104,135 +100,63 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
it 'displays pipeline name instead of commit title' do
visit_pipeline
- within 'h3' do
+ within '[data-testid="pipeline-details-header"]' do
expect(page).to have_content(pipeline.name)
+ expect(page).to have_content(project.commit.short_id)
+ expect(page).not_to have_selector('[data-testid="pipeline-commit-title"]')
end
+ end
- within '.well-segment[data-testid="commit-row"]' do
- expect(page).to have_content(project.commit.title)
- expect(page).to have_content(project.commit.short_id)
+ context 'without pipeline name' do
+ let(:pipeline) do
+ create(:ci_pipeline, project: project, ref: 'master', sha: project.commit.id, user: user)
+ end
+
+ it 'displays commit title' do
+ visit_pipeline
+
+ within '[data-testid="pipeline-details-header"]' do
+ expect(page).to have_content(project.commit.title)
+ expect(page).not_to have_selector('[data-testid="pipeline-name"]')
+ end
end
end
describe 'pipeline stats text' do
let(:finished_pipeline) do
- create(:ci_pipeline, :success, project: project,
- ref: 'master', sha: project.commit.id, user: user)
+ create(:ci_pipeline, :success, project: project, ref: 'master', sha: project.commit.id, user: user)
end
before do
- finished_pipeline.update!(started_at: "2023-01-01 01:01:05", created_at: "2023-01-01 01:01:01",
- finished_at: "2023-01-01 01:01:10", duration: 9)
+ finished_pipeline.update!(
+ started_at: "2023-01-01 01:01:05",
+ created_at: "2023-01-01 01:01:01",
+ finished_at: "2023-01-01 01:01:10",
+ duration: 9
+ )
end
context 'pipeline has finished' do
- it 'shows pipeline stats with flag on' do
+ it 'shows time ago' do
visit project_pipeline_path(project, finished_pipeline)
- within '.pipeline-info' do
- expect(page).to have_content("in #{finished_pipeline.duration} seconds")
- expect(page).to have_content("and was queued for #{finished_pipeline.queued_duration} seconds")
+ within '[data-testid="pipeline-details-header"]' do
+ expect(page).to have_selector('[data-testid="pipeline-finished-time-ago"]')
end
end
end
context 'pipeline has not finished' do
- it 'does not show pipeline stats' do
- visit_pipeline
-
- within '.pipeline-info' do
- expect(page).not_to have_selector('[data-testid="pipeline-stats-text"]')
- end
- end
- 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
+ it 'does not show time ago' 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
+ within '[data-testid="pipeline-details-header"]' do
+ expect(page).not_to have_selector('[data-testid="pipeline-finished-time-ago"]')
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
context 'when pipeline has running builds' do
before do
@@ -241,7 +165,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects 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('[data-testid="status_running-icon"]')
expect(page).to have_selector('.js-icon-cancel')
expect(page).to have_content('deploy')
end
@@ -263,7 +187,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects 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('[data-testid="status_preparing-icon"]')
expect(page).to have_selector('.js-icon-cancel')
expect(page).to have_content('prepare')
end
@@ -285,7 +209,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects 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_selector('[data-testid="status_success-icon"]')
expect(page).to have_content('build')
end
@@ -299,8 +223,8 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
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')
+ within('[data-testid="pipeline-details-header"]') do
+ expect(page).to have_selector('[data-testid="ci-badge-running"]')
end
end
end
@@ -314,7 +238,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
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_selector('[data-testid="status_scheduled-icon"]')
expect(page).to have_content('delayed-job')
end
@@ -339,7 +263,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects 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_selector('[data-testid="status_failed-icon"]')
expect(page).to have_content('test')
end
@@ -353,8 +277,8 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
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')
+ within('[data-testid="pipeline-details-header"]') do
+ expect(page).to have_selector('[data-testid="ci-badge-running"]')
end
end
@@ -373,7 +297,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects 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_selector('[data-testid="status_manual-icon"]')
expect(page).to have_content('manual')
end
@@ -387,8 +311,8 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
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')
+ within('[data-testid="pipeline-details-header"]') do
+ expect(page).to have_selector('[data-testid="ci-badge-running"]')
end
end
end
@@ -399,7 +323,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
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_selector('[data-testid="status_success-icon"]')
expect(page).to have_content('jenkins')
expect(page).to have_link('jenkins', href: 'http://gitlab.com/status')
end
@@ -408,13 +332,15 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
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)
+ 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) }
@@ -601,7 +527,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
context 'when retrying' do
before do
- find('[data-testid="retryPipeline"]').click
+ find('[data-testid="retry-pipeline"]').click
wait_for_requests
end
@@ -610,8 +536,8 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
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')
+ within('[data-testid="pipeline-details-header"]') do
+ expect(page).to have_selector('[data-testid="ci-badge-running"]')
end
end
end
@@ -661,10 +587,13 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
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)
+ create(
+ :ci_empty_pipeline,
+ project: project,
+ ref: 'non-existent',
+ sha: project.commit.id,
+ user: user
+ )
end
before do
@@ -677,7 +606,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
end
it 'does not render render raw HTML to the pipeline ref' do
- page.within '.pipeline-info' do
+ page.within '[data-testid="pipeline-details-header"]' do
expect(page).not_to have_content('<span class="ref-name"')
end
end
@@ -688,10 +617,12 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
let(:target_project) { project }
let(:merge_request) do
- create(:merge_request,
+ create(
+ :merge_request,
:with_detached_merge_request_pipeline,
source_project: source_project,
- target_project: target_project)
+ target_project: target_project
+ )
end
let(:pipeline) do
@@ -701,10 +632,10 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
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}")
+ within '[data-testid="pipeline-details-header"]' do
+ expect(page).to have_content("#{pipeline.statuses.count} Jobs")
+ expect(page).to have_content("Related merge request !#{merge_request.iid} " \
+ "to merge #{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,
@@ -720,7 +651,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
it 'does not link to the source branch commit path' do
visit_pipeline
- within '.pipeline-info' do
+ within '[data-testid="pipeline-details-header"]' do
expect(page).not_to have_link(merge_request.source_branch)
expect(page).to have_content(merge_request.source_branch)
end
@@ -735,10 +666,10 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
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}")
+ within '[data-testid="pipeline-details-header"]' do
+ expect(page).to have_content("#{pipeline.statuses.count} Jobs")
+ expect(page).to have_content("Related merge request !#{merge_request.iid} " \
+ "to merge #{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,
@@ -772,10 +703,10 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
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} " \
+ within '[data-testid="pipeline-details-header"]' do
+ expect(page).to have_content("#{pipeline.statuses.count} Jobs")
+ expect(page).to have_content("Related merge request !#{merge_request.iid} " \
+ "to merge #{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))
@@ -794,7 +725,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
it 'does not link to the target branch commit path' do
visit_pipeline
- within '.pipeline-info' do
+ within '[data-testid="pipeline-details-header"]' do
expect(page).not_to have_link(merge_request.target_branch)
expect(page).to have_content(merge_request.target_branch)
end
@@ -809,10 +740,10 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
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} " \
+ within '[data-testid="pipeline-details-header"]' do
+ expect(page).to have_content("#{pipeline.statuses.count} Jobs")
+ expect(page).to have_content("Related merge request !#{merge_request.iid} " \
+ "to merge #{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))
@@ -864,17 +795,23 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
let(:downstream) { create(:project, :repository) }
let(:pipeline) do
- create(:ci_pipeline, project: project,
- ref: 'master',
- sha: project.commit.id,
- user: user)
+ 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)
+ create(
+ :ci_bridge,
+ pipeline: pipeline,
+ name: 'cross-build',
+ user: user,
+ downstream: downstream
+ )
end
describe 'GET /:project/-/pipelines/:id' do
@@ -942,13 +879,20 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
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)
+ 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)
+ 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
@@ -957,7 +901,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
it 'shows deploy job as created' do
subject
- within('.js-pipeline-header-container') do
+ within('[data-testid="pipeline-details-header"]') do
expect(page).to have_content('pending')
end
@@ -982,7 +926,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
it 'shows deploy job as pending' do
subject
- within('.js-pipeline-header-container') do
+ within('[data-testid="pipeline-details-header"]') do
expect(page).to have_content('running')
end
@@ -1011,7 +955,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
it 'shows deploy job as waiting for resource' do
subject
- within('.js-pipeline-header-container') do
+ within('[data-testid="pipeline-details-header"]') do
expect(page).to have_content('waiting')
end
@@ -1031,7 +975,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
it 'shows deploy job as pending' do
subject
- within('.js-pipeline-header-container') do
+ within('[data-testid="pipeline-details-header"]') do
expect(page).to have_content('running')
end
@@ -1059,7 +1003,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
it 'shows deploy job as waiting for resource' do
subject
- within('.js-pipeline-header-container') do
+ within('[data-testid="pipeline-details-header"]') do
expect(page).to have_content('waiting')
end
@@ -1207,8 +1151,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
context 'when user does have permission to retry build' do
before do
- create(:protected_branch, :developers_can_merge,
- name: pipeline.ref, project: project)
+ create(:protected_branch, :developers_can_merge, name: pipeline.ref, project: project)
end
it 'shows retry button for failed build' do
@@ -1315,11 +1258,13 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
include_context 'pipeline builds'
let(:pipeline) do
- create(:ci_pipeline,
- project: project,
- ref: 'master',
- sha: project.commit.id,
- user: user)
+ create(
+ :ci_pipeline,
+ project: project,
+ ref: 'master',
+ sha: project.commit.id,
+ user: user
+ )
end
before do
@@ -1327,7 +1272,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
end
it 'contains badge that indicates it is the latest build' do
- page.within(all('.well-segment')[1]) do
+ page.within('[data-testid="pipeline-details-header"]') do
expect(page).to have_content 'latest'
end
end
@@ -1335,12 +1280,14 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
context 'when pipeline has configuration errors' do
let(:pipeline) do
- create(:ci_pipeline,
- :invalid,
- project: project,
- ref: 'master',
- sha: project.commit.id,
- user: user)
+ create(
+ :ci_pipeline,
+ :invalid,
+ project: project,
+ ref: 'master',
+ sha: project.commit.id,
+ user: user
+ )
end
before do
@@ -1348,7 +1295,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
end
it 'contains badge that indicates errors' do
- page.within(all('.well-segment')[1]) do
+ page.within('[data-testid="pipeline-details-header"]') do
expect(page).to have_content 'yaml invalid'
end
end
@@ -1356,9 +1303,9 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
it 'contains badge with tooltip which contains error' do
expect(pipeline).to have_yaml_errors
- page.within(all('.well-segment')[1]) do
+ page.within('[data-testid="pipeline-details-header"]') do
expect(page).to have_selector(
- %Q{span[title="#{pipeline.yaml_errors}"]})
+ %{span[title="#{pipeline.yaml_errors}"]})
end
end
@@ -1369,26 +1316,16 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
it 'contains badge with tooltip which contains failure reason' do
expect(pipeline.failure_reason?).to eq true
- page.within(all('.well-segment')[1]) do
+ page.within('[data-testid="pipeline-details-header"]') do
expect(page).to have_selector(
- %Q{span[title="#{pipeline.present.failure_reason}"]})
+ %{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)
+ create(:ci_pipeline, project: project, status: :created, user: user)
end
before do
@@ -1397,7 +1334,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
end
it 'contains badge that indicates being stuck' do
- page.within(all('.well-segment')[1]) do
+ page.within('[data-testid="pipeline-details-header"]') do
expect(page).to have_content 'stuck'
end
end
@@ -1408,12 +1345,14 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
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)
+ create(
+ :ci_pipeline,
+ :auto_devops_source,
+ project: project,
+ ref: 'master',
+ sha: project.commit.id,
+ user: user
+ )
end
before do
@@ -1421,7 +1360,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
end
it 'contains badge that indicates using auto devops' do
- page.within(all('.well-segment')[1]) do
+ page.within('[data-testid="pipeline-details-header"]') do
expect(page).to have_content 'Auto DevOps'
end
end
@@ -1431,21 +1370,25 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects 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)
+ 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')
+ create(
+ :merge_request,
+ source_project: project,
+ source_branch: 'feature',
+ target_project: project,
+ target_branch: 'master'
+ )
end
before do
@@ -1453,7 +1396,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :groups_and_projects do
end
it 'contains badge that indicates detached merge request pipeline' do
- page.within(all('.well-segment')[1]) do
+ page.within('[data-testid="pipeline-details-header"]') do
expect(page).to have_content 'merge request'
end
end
diff --git a/spec/features/projects/pipelines/pipelines_spec.rb b/spec/features/projects/pipelines/pipelines_spec.rb
index 441f39e6999..25eddf64f99 100644
--- a/spec/features/projects/pipelines/pipelines_spec.rb
+++ b/spec/features/projects/pipelines/pipelines_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Pipelines', :js, feature_category: :groups_and_projects do
+RSpec.describe 'Pipelines', :js, feature_category: :continuous_integration do
include ListboxHelpers
include ProjectForksHelper
include Spec::Support::Helpers::ModalHelpers
@@ -10,10 +10,6 @@ RSpec.describe 'Pipelines', :js, feature_category: :groups_and_projects do
let(:project) { create(:project) }
let(:expected_detached_mr_tag) { 'merge request' }
- before do
- stub_feature_flags(pipeline_details_header_vue: false)
- end
-
context 'when user is logged in' do
let(:user) { create(:user) }
@@ -109,8 +105,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :groups_and_projects do
context 'when pipeline is cancelable' do
let!(:build) do
- create(:ci_build, pipeline: pipeline,
- stage: 'test')
+ create(:ci_build, pipeline: pipeline, stage: 'test')
end
before do
@@ -139,8 +134,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :groups_and_projects do
context 'when pipeline is retryable', :sidekiq_might_not_need_inline do
let!(:build) do
- create(:ci_build, pipeline: pipeline,
- stage: 'test')
+ create(:ci_build, pipeline: pipeline, stage: 'test')
end
before do
@@ -168,10 +162,12 @@ RSpec.describe 'Pipelines', :js, feature_category: :groups_and_projects do
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)
+ create(
+ :merge_request,
+ :with_detached_merge_request_pipeline,
+ source_project: source_project,
+ target_project: target_project
+ )
end
let!(:pipeline) { merge_request.all_pipelines.first }
@@ -187,8 +183,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :groups_and_projects 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).to have_link(merge_request.iid, href: project_merge_request_path(project, merge_request))
expect(page).not_to have_link(pipeline.ref)
end
@@ -206,11 +201,13 @@ RSpec.describe 'Pipelines', :js, feature_category: :groups_and_projects do
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)
+ 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 }
@@ -226,8 +223,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :groups_and_projects 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).to have_link(merge_request.iid, href: project_merge_request_path(project, merge_request))
expect(page).not_to have_link(pipeline.ref)
end
@@ -259,7 +255,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :groups_and_projects do
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}"]})
+ %{span[title="#{pipeline.yaml_errors}"]})
end
it 'contains badge that indicates failure reason' do
@@ -269,7 +265,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :groups_and_projects do
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}"]})
+ %{span[title="#{pipeline.present.failure_reason}"]})
end
end
@@ -524,9 +520,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :groups_and_projects do
context 'mini pipeline graph' do
let!(:build) do
- create(:ci_build, :pending, pipeline: pipeline,
- stage: 'build',
- name: 'build')
+ create(:ci_build, :pending, pipeline: pipeline, stage: 'build', name: 'build')
end
dropdown_selector = '[data-testid="mini-pipeline-graph-dropdown"]'
@@ -558,9 +552,7 @@ RSpec.describe 'Pipelines', :js, feature_category: :groups_and_projects do
context 'for a failed pipeline' do
let!(:build) do
- create(:ci_build, :failed, pipeline: pipeline,
- stage: 'build',
- name: 'build')
+ create(:ci_build, :failed, pipeline: pipeline, stage: 'build', name: 'build')
end
it 'displays the failure reason' do
@@ -628,10 +620,12 @@ RSpec.describe 'Pipelines', :js, feature_category: :groups_and_projects do
let(:project) { create(:project, :repository) }
let(:pipeline) do
- create(:ci_empty_pipeline,
- project: project,
- sha: project.commit.id,
- user: user)
+ create(
+ :ci_empty_pipeline,
+ project: project,
+ sha: project.commit.id,
+ user: user
+ )
end
let(:external_stage) { create(:ci_stage, name: 'external', pipeline: pipeline) }
@@ -656,7 +650,6 @@ RSpec.describe 'Pipelines', :js, feature_category: :groups_and_projects do
# 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
diff --git a/spec/features/projects/releases/user_views_release_spec.rb b/spec/features/projects/releases/user_views_release_spec.rb
index efa0ebd761d..282b8958814 100644
--- a/spec/features/projects/releases/user_views_release_spec.rb
+++ b/spec/features/projects/releases/user_views_release_spec.rb
@@ -7,10 +7,12 @@ RSpec.describe 'User views Release', :js, feature_category: :continuous_delivery
let(:user) { create(:user) }
let(:release) do
- create(:release,
- project: project,
- name: 'The first release',
- description: '**Lorem** _ipsum_ dolor sit [amet](https://example.com)')
+ create(
+ :release,
+ project: project,
+ name: 'The first release',
+ description: '**Lorem** _ipsum_ dolor sit [amet](https://example.com)'
+ )
end
before do
diff --git a/spec/features/projects/settings/access_tokens_spec.rb b/spec/features/projects/settings/access_tokens_spec.rb
index a38c10c6bab..210815f341c 100644
--- a/spec/features/projects/settings/access_tokens_spec.rb
+++ b/spec/features/projects/settings/access_tokens_spec.rb
@@ -69,7 +69,7 @@ RSpec.describe 'Project > Settings > Access Tokens', :js, feature_category: :use
end
context 'when token creation is not allowed' do
- it_behaves_like 'resource access tokens creation disallowed', 'Project access token creation is disabled in this group. You can still use and manage existing tokens.'
+ it_behaves_like 'resource access tokens creation disallowed', 'Project access token creation is disabled in this group.'
context 'with a project in a personal namespace' do
let(:personal_project) { create(:project) }
diff --git a/spec/features/projects/settings/external_authorization_service_settings_spec.rb b/spec/features/projects/settings/external_authorization_service_settings_spec.rb
index 4a56e6c8bbf..4214e6fc767 100644
--- a/spec/features/projects/settings/external_authorization_service_settings_spec.rb
+++ b/spec/features/projects/settings/external_authorization_service_settings_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'Projects > Settings > External Authorization Classification Label setting',
-feature_category: :groups_and_projects do
+ feature_category: :groups_and_projects do
let(:user) { create(:user) }
let(:project) { create(:project_empty_repo) }
diff --git a/spec/features/projects/settings/monitor_settings_spec.rb b/spec/features/projects/settings/monitor_settings_spec.rb
index c5a5826a778..b46451f4255 100644
--- a/spec/features/projects/settings/monitor_settings_spec.rb
+++ b/spec/features/projects/settings/monitor_settings_spec.rb
@@ -18,8 +18,11 @@ RSpec.describe 'Projects > Settings > For a forked project', :js, feature_catego
visit project_path(project)
wait_for_requests
- expect(page).to have_selector('.sidebar-sub-level-items a[aria-label="Error Tracking"]',
- text: 'Error Tracking', visible: :hidden)
+ expect(page).to have_selector(
+ '.sidebar-sub-level-items a[aria-label="Error Tracking"]',
+ text: 'Error Tracking',
+ visible: :hidden
+ )
end
end
diff --git a/spec/features/projects/settings/registry_settings_cleanup_tags_spec.rb b/spec/features/projects/settings/registry_settings_cleanup_tags_spec.rb
index 50693dda685..1ab88ec0fff 100644
--- a/spec/features/projects/settings/registry_settings_cleanup_tags_spec.rb
+++ b/spec/features/projects/settings/registry_settings_cleanup_tags_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'Project > Settings > Packages and registries > Container registry tag expiration policy',
-feature_category: :groups_and_projects do
+ feature_category: :groups_and_projects do
let_it_be(:user) { create(:user) }
let_it_be(:project, reload: true) { create(:project, namespace: user.namespace) }
diff --git a/spec/features/projects/settings/registry_settings_spec.rb b/spec/features/projects/settings/registry_settings_spec.rb
index b8016a5d2df..9df82e447aa 100644
--- a/spec/features/projects/settings/registry_settings_spec.rb
+++ b/spec/features/projects/settings/registry_settings_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'Project > Settings > Packages and registries > Container registry tag expiration policy',
-feature_category: :groups_and_projects do
+ feature_category: :groups_and_projects do
let_it_be(:user) { create(:user) }
let_it_be(:project, reload: true) { create(:project, namespace: user.namespace) }
diff --git a/spec/features/projects/settings/repository_settings_spec.rb b/spec/features/projects/settings/repository_settings_spec.rb
index 2439e624dd6..d53aefe5a4e 100644
--- a/spec/features/projects/settings/repository_settings_spec.rb
+++ b/spec/features/projects/settings/repository_settings_spec.rb
@@ -10,7 +10,6 @@ RSpec.describe 'Projects > Settings > Repository settings', feature_category: :g
let(:role) { :developer }
before do
- stub_feature_flags(mirror_only_branches_match_regex: false)
project.add_role(user, role)
sign_in(user)
end
diff --git a/spec/features/projects/settings/service_desk_setting_spec.rb b/spec/features/projects/settings/service_desk_setting_spec.rb
index c18da56f3ee..d068cb219f1 100644
--- a/spec/features/projects/settings/service_desk_setting_spec.rb
+++ b/spec/features/projects/settings/service_desk_setting_spec.rb
@@ -2,18 +2,20 @@
require 'spec_helper'
-RSpec.describe 'Service Desk Setting', :js, :clean_gitlab_redis_cache, feature_category: :groups_and_projects do
- let(:project) { create(:project_empty_repo, :private, service_desk_enabled: false) }
+RSpec.describe 'Service Desk Setting', :js, :clean_gitlab_redis_cache, feature_category: :service_desk do
+ let_it_be_with_reload(:project) { create(:project_empty_repo, :private, service_desk_enabled: false) }
let(:presenter) { project.present(current_user: user) }
- let(:user) { create(:user) }
+ let_it_be_with_reload(:user) { create(:user) }
before do
project.add_maintainer(user)
sign_in(user)
- allow_any_instance_of(Project).to receive(:present).with(current_user: user).and_return(presenter)
- allow(::Gitlab::Email::IncomingEmail).to receive(:enabled?) { true }
- allow(::Gitlab::Email::IncomingEmail).to receive(:supports_wildcard?) { true }
+ allow_next_instance_of(Project) do |project|
+ allow(project).to receive(:present).with(current_user: user).and_return(presenter)
+ end
+ allow(::Gitlab::Email::IncomingEmail).to receive(:enabled?).and_return(true)
+ allow(::Gitlab::Email::IncomingEmail).to receive(:supports_wildcard?).and_return(true)
end
it 'shows activation checkbox' do
@@ -43,8 +45,8 @@ RSpec.describe 'Service Desk Setting', :js, :clean_gitlab_redis_cache, feature_c
context 'when service_desk_email is enabled' do
before do
- allow(::Gitlab::Email::ServiceDeskEmail).to receive(:enabled?) { true }
- allow(::Gitlab::Email::ServiceDeskEmail).to receive(:address_for_key) { 'address-suffix@example.com' }
+ allow(::Gitlab::Email::ServiceDeskEmail).to receive(:enabled?).and_return(true)
+ allow(::Gitlab::Email::ServiceDeskEmail).to receive(:address_for_key).and_return('address-suffix@example.com')
visit edit_project_path(project)
end
@@ -66,7 +68,7 @@ RSpec.describe 'Service Desk Setting', :js, :clean_gitlab_redis_cache, feature_c
expect(find('[data-testid="incoming-email"]').value).to eq('address-suffix@example.com')
end
- context 'issue description templates' do
+ describe 'issue description templates' do
let_it_be(:issuable_project_template_files) do
{
'.gitlab/issue_templates/project-issue-bar.md' => 'Project Issue Template Bar',
@@ -82,8 +84,13 @@ RSpec.describe 'Service Desk Setting', :js, :clean_gitlab_redis_cache, feature_c
end
let_it_be_with_reload(:group) { create(:group) }
- let_it_be_with_reload(:project) { create(:project, :custom_repo, group: group, files: issuable_project_template_files) }
- let_it_be(:group_template_repo) { create(:project, :custom_repo, group: group, files: issuable_group_template_files) }
+ let_it_be_with_reload(:project) do
+ create(:project, :custom_repo, group: group, files: issuable_project_template_files)
+ end
+
+ let_it_be(:group_template_repo) do
+ create(:project, :custom_repo, group: group, files: issuable_group_template_files)
+ end
before do
stub_licensed_features(custom_file_templates_for_namespace: false, custom_file_templates: false)
@@ -94,4 +101,10 @@ RSpec.describe 'Service Desk Setting', :js, :clean_gitlab_redis_cache, feature_c
it_behaves_like 'issue description templates from current project only'
end
end
+
+ it 'pushes service_desk_custom_email feature flag to frontend' do
+ visit edit_project_path(project)
+
+ expect(page).to have_pushed_frontend_feature_flags(serviceDeskCustomEmail: true)
+ end
end
diff --git a/spec/features/projects/settings/user_searches_in_settings_spec.rb b/spec/features/projects/settings/user_searches_in_settings_spec.rb
index f0ef4a285ad..978b678c334 100644
--- a/spec/features/projects/settings/user_searches_in_settings_spec.rb
+++ b/spec/features/projects/settings/user_searches_in_settings_spec.rb
@@ -26,14 +26,6 @@ RSpec.describe 'User searches project settings', :js, feature_category: :groups_
it_behaves_like 'can highlight results', 'third-party applications'
end
- context 'in Webhooks page' do
- before do
- visit project_hooks_path(project)
- end
-
- it_behaves_like 'can highlight results', 'Secret token'
- end
-
context 'in Access Tokens page' do
before do
visit project_settings_access_tokens_path(project)
@@ -65,15 +57,4 @@ RSpec.describe 'User searches project settings', :js, feature_category: :groups_
it_behaves_like 'can search settings', 'Alerts', 'Error tracking'
end
-
- context 'in Pages page' do
- before do
- stub_feature_flags(show_pages_in_deployments_menu: false)
- allow(Gitlab.config.pages).to receive(:enabled).and_return(true)
-
- visit project_pages_path(project)
- end
-
- it_behaves_like 'can highlight results', 'static website'
- end
end
diff --git a/spec/features/projects/settings/webhooks_settings_spec.rb b/spec/features/projects/settings/webhooks_settings_spec.rb
index 5d345c63d60..af7c790c692 100644
--- a/spec/features/projects/settings/webhooks_settings_spec.rb
+++ b/spec/features/projects/settings/webhooks_settings_spec.rb
@@ -31,7 +31,6 @@ RSpec.describe 'Projects > Settings > Webhook Settings', feature_category: :grou
it 'show list of webhooks' do
hook
-
visit webhooks_path
expect(page.status_code).to eq(200)
@@ -46,11 +45,13 @@ RSpec.describe 'Projects > Settings > Webhook Settings', feature_category: :grou
expect(page).to have_content('Pipeline events')
expect(page).to have_content('Wiki page events')
expect(page).to have_content('Releases events')
+ expect(page).to have_content('Emoji events')
end
it 'create webhook', :js do
visit webhooks_path
+ click_button 'Add new webhook'
fill_in 'URL', with: url
check 'Tag push events'
check 'Enable SSL verification'
@@ -59,10 +60,10 @@ RSpec.describe 'Projects > Settings > Webhook Settings', feature_category: :grou
click_button 'Add webhook'
expect(page).to have_content(url)
+ expect(page).to have_content('Webhook was created')
expect(page).to have_content('SSL Verification: enabled')
expect(page).to have_content('Tag push events')
expect(page).to have_content('Job events')
- expect(page).to have_content('Push events')
end
it 'edit existing webhook', :js do
diff --git a/spec/features/projects/show/download_buttons_spec.rb b/spec/features/projects/show/download_buttons_spec.rb
index a4df6a56e02..8e27b4b2ede 100644
--- a/spec/features/projects/show/download_buttons_spec.rb
+++ b/spec/features/projects/show/download_buttons_spec.rb
@@ -9,18 +9,24 @@ RSpec.describe 'Projects > Show > Download buttons', feature_category: :groups_a
let(:project) { create(:project, :repository) }
let(:pipeline) do
- create(:ci_pipeline,
- project: project,
- sha: project.commit.sha,
- ref: project.default_branch,
- status: status)
+ create(
+ :ci_pipeline,
+ project: project,
+ sha: project.commit.sha,
+ ref: project.default_branch,
+ status: status
+ )
end
let!(:build) do
- create(:ci_build, :success, :artifacts,
- pipeline: pipeline,
- status: pipeline.status,
- name: 'build')
+ create(
+ :ci_build,
+ :success,
+ :artifacts,
+ pipeline: pipeline,
+ status: pipeline.status,
+ name: 'build'
+ )
end
before do
diff --git a/spec/features/projects/show/user_interacts_with_auto_devops_banner_spec.rb b/spec/features/projects/show/user_interacts_with_auto_devops_banner_spec.rb
index 997a804e6ac..98714da34f2 100644
--- a/spec/features/projects/show/user_interacts_with_auto_devops_banner_spec.rb
+++ b/spec/features/projects/show/user_interacts_with_auto_devops_banner_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'Project > Show > User interacts with auto devops implicitly enabled banner',
-feature_category: :groups_and_projects do
+ feature_category: :groups_and_projects do
let(:project) { create(:project, :repository) }
let(:user) { create(:user) }
diff --git a/spec/features/projects/show/user_sees_collaboration_links_spec.rb b/spec/features/projects/show/user_sees_collaboration_links_spec.rb
index 29fb20841fd..ee017336acc 100644
--- a/spec/features/projects/show/user_sees_collaboration_links_spec.rb
+++ b/spec/features/projects/show/user_sees_collaboration_links_spec.rb
@@ -43,8 +43,8 @@ RSpec.describe 'Projects > Show > Collaboration links', :js, feature_category: :
aggregate_failures 'dropdown links above the repo tree' do
expect(page).to have_link('New file')
- expect(page).to have_link('Upload file')
- expect(page).to have_link('New directory')
+ expect(page).to have_button('Upload file')
+ expect(page).to have_button('New directory')
expect(page).to have_link('New branch')
expect(page).to have_link('New tag')
end
diff --git a/spec/features/projects/tags/download_buttons_spec.rb b/spec/features/projects/tags/download_buttons_spec.rb
index 570721fc951..275d364f267 100644
--- a/spec/features/projects/tags/download_buttons_spec.rb
+++ b/spec/features/projects/tags/download_buttons_spec.rb
@@ -10,18 +10,22 @@ RSpec.describe 'Download buttons in tags page', feature_category: :source_code_m
let(:project) { create(:project, :repository) }
let(:pipeline) do
- create(:ci_pipeline,
- project: project,
- sha: project.commit(tag).sha,
- ref: tag,
- status: status)
+ create(
+ :ci_pipeline,
+ project: project,
+ sha: project.commit(tag).sha,
+ ref: tag,
+ status: status
+ )
end
let!(:build) do
- create(:ci_build, :success, :artifacts,
- pipeline: pipeline,
- status: pipeline.status,
- name: 'build')
+ create(
+ :ci_build, :success, :artifacts,
+ pipeline: pipeline,
+ status: pipeline.status,
+ name: 'build'
+ )
end
before do
diff --git a/spec/features/projects/user_sees_user_popover_spec.rb b/spec/features/projects/user_sees_user_popover_spec.rb
index 523f1366a14..be7d3daa24f 100644
--- a/spec/features/projects/user_sees_user_popover_spec.rb
+++ b/spec/features/projects/user_sees_user_popover_spec.rb
@@ -27,7 +27,7 @@ RSpec.describe 'User sees user popover', :js, feature_category: :groups_and_proj
end
it 'displays user popover' do
- find('.js-user-link').hover
+ find('.detail-page-description .js-user-link').hover
expect(page).to have_css(popover_selector, visible: true)
diff --git a/spec/features/projects/wiki/user_views_wiki_in_project_page_spec.rb b/spec/features/projects/wiki/user_views_wiki_in_project_page_spec.rb
index 79744633d0c..9a772ff8e44 100644
--- a/spec/features/projects/wiki/user_views_wiki_in_project_page_spec.rb
+++ b/spec/features/projects/wiki/user_views_wiki_in_project_page_spec.rb
@@ -9,11 +9,13 @@ RSpec.describe 'Projects > Wiki > User views wiki in project page', feature_cate
context 'when repository is disabled for project' do
let(:project) do
- create(:project,
- :wiki_repo,
- :repository_disabled,
- :merge_requests_disabled,
- :builds_disabled)
+ create(
+ :project,
+ :wiki_repo,
+ :repository_disabled,
+ :merge_requests_disabled,
+ :builds_disabled
+ )
end
context 'when wiki homepage contains a link' do
@@ -37,8 +39,13 @@ RSpec.describe 'Projects > Wiki > User views wiki in project page', feature_cate
context 'when using asciidoc' do
before do
- create(:wiki_page, wiki: project.wiki, title: 'home', content: 'link:other-page[some link]',
- format: :asciidoc)
+ create(
+ :wiki_page,
+ wiki: project.wiki,
+ title: 'home',
+ content: 'link:other-page[some link]',
+ format: :asciidoc
+ )
end
it_behaves_like 'wiki homepage contains a link'
diff --git a/spec/features/runners_spec.rb b/spec/features/runners_spec.rb
index 4df9109875e..3c63ec82778 100644
--- a/spec/features/runners_spec.rb
+++ b/spec/features/runners_spec.rb
@@ -14,17 +14,11 @@ RSpec.describe 'Runners', feature_category: :runner_fleet do
stub_feature_flags(project_runners_vue_ui: false)
end
- context 'when user views runners page' do
- let_it_be(:project) { create(:project) }
-
- before do
- project.add_maintainer(user)
- end
+ context 'with user as project maintainer' do
+ let_it_be(:project) { create(:project).tap { |project| project.add_maintainer(user) } }
- context 'when create_runner_workflow_for_namespace is enabled', :js do
+ context 'when user views runners page', :js do
before do
- stub_feature_flags(create_runner_workflow_for_namespace: [project.namespace])
-
visit project_runners_path(project)
end
@@ -38,58 +32,18 @@ RSpec.describe 'Runners', feature_category: :runner_fleet do
end
end
- context 'when user views new runner page' do
- context 'when create_runner_workflow_for_namespace is enabled', :js do
- before do
- stub_feature_flags(create_runner_workflow_for_namespace: [project.namespace])
-
- visit new_project_runner_path(project)
- end
-
- it_behaves_like 'creates runner and shows register page' do
- let(:register_path_pattern) { register_project_runner_path(project, '.*') }
- end
-
- it 'shows the locked field' do
- expect(page).to have_selector('input[type="checkbox"][name="locked"]')
- expect(page).to have_content(_('Lock to current projects'))
- end
- end
- end
-
- context 'when create_runner_workflow_for_namespace is disabled' do
+ context 'when user views new runner page', :js do
before do
- stub_feature_flags(create_runner_workflow_for_namespace: false)
+ visit new_project_runner_path(project)
end
- it 'user can see a link with instructions on how to install GitLab Runner' do
- visit project_runners_path(project)
-
- expect(page).to have_link('Install GitLab Runner and ensure it\'s running.', href: "https://docs.gitlab.com/runner/install/")
+ it_behaves_like 'creates runner and shows register page' do
+ let(:register_path_pattern) { register_project_runner_path(project, '.*') }
end
- describe 'runners registration token' do
- let!(:token) { project.runners_token }
-
- before do
- visit project_runners_path(project)
- end
-
- it 'has a registration token' do
- expect(page.find('#registration_token')).to have_content(token)
- end
-
- describe 'reload registration token' do
- let(:page_token) { find('#registration_token').text }
-
- before do
- click_link 'Reset registration token'
- end
-
- it 'changes registration token' do
- expect(page_token).not_to eq token
- end
- end
+ it 'shows the locked field' do
+ expect(page).to have_selector('input[type="checkbox"][name="locked"]')
+ expect(page).to have_content(_('Lock to current projects'))
end
end
end
diff --git a/spec/features/search/user_searches_for_milestones_spec.rb b/spec/features/search/user_searches_for_milestones_spec.rb
index 238e59be940..7ca7958f61b 100644
--- a/spec/features/search/user_searches_for_milestones_spec.rb
+++ b/spec/features/search/user_searches_for_milestones_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'User searches for milestones', :js, :clean_gitlab_redis_rate_limiting,
-feature_category: :global_search do
+ feature_category: :global_search do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, namespace: user.namespace) }
let_it_be(:milestone1) { create(:milestone, title: 'Foo', project: project) }
diff --git a/spec/features/search/user_searches_for_wiki_pages_spec.rb b/spec/features/search/user_searches_for_wiki_pages_spec.rb
index 1d8bdc58ce6..65f262075f9 100644
--- a/spec/features/search/user_searches_for_wiki_pages_spec.rb
+++ b/spec/features/search/user_searches_for_wiki_pages_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'User searches for wiki pages', :js, :clean_gitlab_redis_rate_limiting,
-feature_category: :global_search do
+ feature_category: :global_search do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, :repository, :wiki_repo, namespace: user.namespace) }
let_it_be(:wiki_page) do
diff --git a/spec/features/search/user_uses_search_filters_spec.rb b/spec/features/search/user_uses_search_filters_spec.rb
index 2e3aaab563d..5e553cb0869 100644
--- a/spec/features/search/user_uses_search_filters_spec.rb
+++ b/spec/features/search/user_uses_search_filters_spec.rb
@@ -50,7 +50,9 @@ RSpec.describe 'User uses search filters', :js, feature_category: :global_search
wait_for_requests
- expect(page).to have_current_path(search_path(search: "test"))
+ expect(page).to have_current_path(search_path, ignore_query: true) do |uri|
+ uri.normalized_query(:sorted) == "scope=blobs&search=test"
+ end
end
end
end
@@ -83,7 +85,9 @@ RSpec.describe 'User uses search filters', :js, feature_category: :global_search
find('[data-testid="project-filter"] [data-testid="clear-icon"]').click
wait_for_requests
- expect(page).to have_current_path(search_path(search: "test"))
+ expect(page).to have_current_path(search_path, ignore_query: true) do |uri|
+ uri.normalized_query(:sorted) == "scope=blobs&search=test"
+ end
end
end
end
diff --git a/spec/features/snippets/search_snippets_spec.rb b/spec/features/snippets/search_snippets_spec.rb
index 98842f54015..afb53c563de 100644
--- a/spec/features/snippets/search_snippets_spec.rb
+++ b/spec/features/snippets/search_snippets_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Search Snippets', :js, feature_category: :source_code_management do
+RSpec.describe 'Search Snippets', :js, feature_category: :global_search do
it 'user searches for snippets by title' do
public_snippet = create(:personal_snippet, :public, title: 'Beginning and Middle')
private_snippet = create(:personal_snippet, :private, title: 'Middle and End')
@@ -11,7 +11,7 @@ RSpec.describe 'Search Snippets', :js, feature_category: :source_code_management
visit dashboard_snippets_path
submit_search('Middle')
- select_search_scope('Titles and Descriptions')
+ select_search_scope(_("Snippets"))
expect(page).to have_link(public_snippet.title)
expect(page).to have_link(private_snippet.title)
diff --git a/spec/features/snippets/spam_snippets_spec.rb b/spec/features/snippets/spam_snippets_spec.rb
index 0e3f96906de..c2ac33a3b8f 100644
--- a/spec/features/snippets/spam_snippets_spec.rb
+++ b/spec/features/snippets/spam_snippets_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'snippet editor with spam', skip: "Will be handled in https://gitlab.com/gitlab-org/gitlab/-/issues/217722",
- feature_category: :source_code_management do
+ feature_category: :source_code_management do
include_context 'includes Spam constants'
let_it_be(:user) { create(:user) }
diff --git a/spec/features/snippets/user_creates_snippet_spec.rb b/spec/features/snippets/user_creates_snippet_spec.rb
index f4b6b552d46..090d854081a 100644
--- a/spec/features/snippets/user_creates_snippet_spec.rb
+++ b/spec/features/snippets/user_creates_snippet_spec.rb
@@ -81,8 +81,10 @@ RSpec.describe 'User creates snippet', :js, feature_category: :source_code_manag
context 'when snippets default visibility level is restricted' do
before do
- stub_application_setting(restricted_visibility_levels: [Gitlab::VisibilityLevel::PRIVATE],
- default_snippet_visibility: Gitlab::VisibilityLevel::PRIVATE)
+ stub_application_setting(
+ restricted_visibility_levels: [Gitlab::VisibilityLevel::PRIVATE],
+ default_snippet_visibility: Gitlab::VisibilityLevel::PRIVATE
+ )
end
it 'creates a snippet using the lowest available visibility level as default' do
diff --git a/spec/features/task_lists_spec.rb b/spec/features/task_lists_spec.rb
index 8a9d2ff42d9..beadeab1736 100644
--- a/spec/features/task_lists_spec.rb
+++ b/spec/features/task_lists_spec.rb
@@ -137,8 +137,7 @@ RSpec.describe 'Task Lists', :js, feature_category: :team_planning do
describe 'multiple tasks' do
let!(:note) do
- create(:note, note: markdown, noteable: issue,
- project: project, author: user)
+ create(:note, note: markdown, noteable: issue, project: project, author: user)
end
it 'renders for note body' do
@@ -171,8 +170,7 @@ RSpec.describe 'Task Lists', :js, feature_category: :team_planning do
describe 'single incomplete task' do
let!(:note) do
- create(:note, note: single_incomplete_markdown, noteable: issue,
- project: project, author: user)
+ create(:note, note: single_incomplete_markdown, noteable: issue, project: project, author: user)
end
it 'renders for note body' do
@@ -186,8 +184,7 @@ RSpec.describe 'Task Lists', :js, feature_category: :team_planning do
describe 'single complete task' do
let!(:note) do
- create(:note, note: single_complete_markdown, noteable: issue,
- project: project, author: user)
+ create(:note, note: single_complete_markdown, noteable: issue, project: project, author: user)
end
it 'renders for note body' do
diff --git a/spec/features/uploads/user_uploads_avatar_to_group_spec.rb b/spec/features/uploads/user_uploads_avatar_to_group_spec.rb
index 02e98905662..2872446ed6b 100644
--- a/spec/features/uploads/user_uploads_avatar_to_group_spec.rb
+++ b/spec/features/uploads/user_uploads_avatar_to_group_spec.rb
@@ -22,7 +22,7 @@ RSpec.describe 'User uploads avatar to group', feature_category: :user_profile d
visit group_path(group)
- expect(page).to have_selector(%Q(img[data-src$="/uploads/-/system/group/avatar/#{group.id}/dk.png"]))
+ expect(page).to have_selector(%(img[data-src$="/uploads/-/system/group/avatar/#{group.id}/dk.png"]))
# Cheating here to verify something that isn't user-facing, but is important
expect(group.reload.avatar.file).to exist
diff --git a/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb b/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb
index 03b072ea417..cc296259b80 100644
--- a/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb
+++ b/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb
@@ -18,7 +18,7 @@ RSpec.describe 'User uploads avatar to profile', feature_category: :user_profile
visit user_path(user)
- expect(page).to have_selector(%Q(img[src$="/uploads/-/system/user/avatar/#{user.id}/dk.png?width=96"]))
+ expect(page).to have_selector(%(img[src$="/uploads/-/system/user/avatar/#{user.id}/dk.png?width=96"]))
# Cheating here to verify something that isn't user-facing, but is important
expect(user.reload.avatar.file).to exist
diff --git a/spec/features/user_sees_revert_modal_spec.rb b/spec/features/user_sees_revert_modal_spec.rb
index aca32d26bdb..9ee3fe846a6 100644
--- a/spec/features/user_sees_revert_modal_spec.rb
+++ b/spec/features/user_sees_revert_modal_spec.rb
@@ -3,7 +3,9 @@
require 'spec_helper'
RSpec.describe 'Merge request > User sees revert modal', :js, :sidekiq_might_not_need_inline,
-feature_category: :code_review_workflow do
+ feature_category: :code_review_workflow do
+ include ContentEditorHelpers
+
let(:project) { create(:project, :public, :repository) }
let(:user) { project.creator }
let(:merge_request) { create(:merge_request, source_project: project) }
@@ -22,6 +24,8 @@ feature_category: :code_review_workflow do
stub_feature_flags(unbatch_graphql_queries: false)
sign_in(user)
visit(project_merge_request_path(project, merge_request))
+ close_rich_text_promo_popover_if_present
+
page.within('.mr-state-widget') do
click_button 'Merge'
end
@@ -36,6 +40,7 @@ feature_category: :code_review_workflow do
context 'with page reload validates js correctly loaded' do
before do
visit(merge_request_path(merge_request))
+ close_rich_text_promo_popover_if_present
end
it_behaves_like 'showing the revert modal'
diff --git a/spec/features/users/email_verification_on_login_spec.rb b/spec/features/users/email_verification_on_login_spec.rb
index 481ff52b800..1854e812b73 100644
--- a/spec/features/users/email_verification_on_login_spec.rb
+++ b/spec/features/users/email_verification_on_login_spec.rb
@@ -358,10 +358,12 @@ RSpec.describe 'Email Verification On Login', :clean_gitlab_redis_rate_limiting,
def expect_log_message(event = nil, times = 1, reason: '', message: nil)
expect(Gitlab::AppLogger).to have_received(:info)
.exactly(times).times
- .with(message || hash_including(message: 'Email Verification',
- event: event,
- username: user.username,
- ip: '127.0.0.1',
- reason: reason))
+ .with(message || hash_including(
+ message: 'Email Verification',
+ event: event,
+ username: user.username,
+ ip: '127.0.0.1',
+ reason: reason
+ ))
end
end
diff --git a/spec/features/users/login_spec.rb b/spec/features/users/login_spec.rb
index 5529f0fa49e..047590fb3aa 100644
--- a/spec/features/users/login_spec.rb
+++ b/spec/features/users/login_spec.rb
@@ -390,8 +390,12 @@ RSpec.describe 'Login', :clean_gitlab_redis_sessions, feature_category: :system_
end
before do
- stub_omniauth_saml_config(enabled: true, auto_link_saml_user: true, allow_single_sign_on: ['saml'],
- providers: [mock_saml_config_with_upstream_two_factor_authn_contexts])
+ stub_omniauth_saml_config(
+ enabled: true,
+ auto_link_saml_user: true,
+ allow_single_sign_on: ['saml'],
+ providers: [mock_saml_config_with_upstream_two_factor_authn_contexts]
+ )
end
it 'displays the remember me checkbox' do
@@ -415,8 +419,10 @@ RSpec.describe 'Login', :clean_gitlab_redis_sessions, feature_category: :system_
context 'when authn_context is worth two factors' do
let(:mock_saml_response) do
File.read('spec/fixtures/authentication/saml_response.xml')
- .gsub('urn:oasis:names:tc:SAML:2.0:ac:classes:Password',
- 'urn:oasis:names:tc:SAML:2.0:ac:classes:SecondFactorOTPSMS')
+ .gsub(
+ 'urn:oasis:names:tc:SAML:2.0:ac:classes:Password',
+ 'urn:oasis:names:tc:SAML:2.0:ac:classes:SecondFactorOTPSMS'
+ )
end
it 'signs user in without prompting for second factor' do
@@ -991,8 +997,7 @@ RSpec.describe 'Login', :clean_gitlab_redis_sessions, feature_category: :system_
context 'when the user already enabled 2FA' do
before do
- user.update!(otp_required_for_login: true,
- otp_secret: User.generate_otp_secret(32))
+ user.update!(otp_required_for_login: true, otp_secret: User.generate_otp_secret(32))
end
it 'asks the user to accept the terms' do
diff --git a/spec/features/users/overview_spec.rb b/spec/features/users/overview_spec.rb
index ff903358931..fdd0c38a718 100644
--- a/spec/features/users/overview_spec.rb
+++ b/spec/features/users/overview_spec.rb
@@ -9,12 +9,14 @@ RSpec.describe 'Overview tab on a user profile', :js, feature_category: :user_pr
def push_code_contribution
event = create(:push_event, project: contributed_project, author: user)
- create(:push_event_payload,
- event: event,
- commit_from: '11f9ac0a48b62cef25eedede4c1819964f08d5ce',
- commit_to: '1cf19a015df3523caf0a1f9d40c98a267d6a2fc2',
- commit_count: 3,
- ref: 'master')
+ create(
+ :push_event_payload,
+ event: event,
+ commit_from: '11f9ac0a48b62cef25eedede4c1819964f08d5ce',
+ commit_to: '1cf19a015df3523caf0a1f9d40c98a267d6a2fc2',
+ commit_count: 3,
+ ref: 'master'
+ )
end
before do
diff --git a/spec/features/users/rss_spec.rb b/spec/features/users/rss_spec.rb
index bc37c9941ce..39b6d049e43 100644
--- a/spec/features/users/rss_spec.rb
+++ b/spec/features/users/rss_spec.rb
@@ -6,6 +6,10 @@ RSpec.describe 'User RSS', feature_category: :user_profile do
let(:user) { create(:user) }
let(:path) { user_path(create(:user)) }
+ before do
+ stub_feature_flags(user_profile_overflow_menu_vue: false)
+ end
+
context 'when signed in' do
before do
sign_in(user)
@@ -22,4 +26,8 @@ RSpec.describe 'User RSS', feature_category: :user_profile do
it_behaves_like "it has an RSS button without a feed token"
end
+
+ # TODO: implement tests before the FF "user_profile_overflow_menu_vue" is turned on
+ # See: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/122971
+ # Related Issue: https://gitlab.com/gitlab-org/gitlab/-/issues/416974
end
diff --git a/spec/features/users/show_spec.rb b/spec/features/users/show_spec.rb
index 9c4a1b36ecc..f8653b22377 100644
--- a/spec/features/users/show_spec.rb
+++ b/spec/features/users/show_spec.rb
@@ -9,10 +9,32 @@ RSpec.describe 'User page', feature_category: :user_profile do
subject(:visit_profile) { visit(user_path(user)) }
- it 'shows user id' do
- subject
+ context 'with "user_profile_overflow_menu_vue" feature flag enabled', :js do
+ it 'does not show the user id in the profile info' do
+ subject
+
+ expect(page).not_to have_content("User ID: #{user.id}")
+ end
+
+ it 'shows copy user id action in the dropdown' do
+ subject
+
+ find('[data-testid="base-dropdown-toggle"').click
+
+ expect(page).to have_content("Copy user ID: #{user.id}")
+ end
+ end
+
+ context 'with "user_profile_overflow_menu_vue" feature flag disabled', :js do
+ before do
+ stub_feature_flags(user_profile_overflow_menu_vue: false)
+ end
+
+ it 'shows user id' do
+ subject
- expect(page).to have_content("User ID: #{user.id}")
+ expect(page).to have_content("User ID: #{user.id}")
+ end
end
it 'shows name on breadcrumbs' do
diff --git a/spec/features/users/terms_spec.rb b/spec/features/users/terms_spec.rb
index 5c61843e558..cf62ccaf999 100644
--- a/spec/features/users/terms_spec.rb
+++ b/spec/features/users/terms_spec.rb
@@ -41,6 +41,21 @@ RSpec.describe 'Users > Terms', :js, feature_category: :user_profile do
end
end
+ context 'when user is a service account' do
+ let(:service_account) { create(:user, :service_account) }
+
+ before do
+ enforce_terms
+ end
+
+ it 'auto accepts the terms' do
+ visit terms_path
+
+ expect(page).not_to have_content('Accept terms')
+ expect(service_account.terms_accepted?).to be(true)
+ end
+ end
+
context 'when signed in' do
let(:user) { create(:user) }
diff --git a/spec/finders/award_emojis_finder_spec.rb b/spec/finders/award_emojis_finder_spec.rb
index 7a75ad716d0..5c016d9e177 100644
--- a/spec/finders/award_emojis_finder_spec.rb
+++ b/spec/finders/award_emojis_finder_spec.rb
@@ -12,6 +12,10 @@ RSpec.describe AwardEmojisFinder do
let_it_be(:issue_2_thumbsup) { create(:award_emoji, name: 'thumbsup', awardable: issue_2) }
let_it_be(:issue_2_thumbsdown) { create(:award_emoji, name: 'thumbsdown', awardable: issue_2) }
+ before do
+ stub_feature_flags(custom_emoji: false)
+ end
+
describe 'param validation' do
it 'raises an error if `name` is invalid' do
expect { described_class.new(issue_1, { name: 'invalid' }).execute }.to raise_error(
diff --git a/spec/finders/ci/group_variables_finder_spec.rb b/spec/finders/ci/group_variables_finder_spec.rb
new file mode 100644
index 00000000000..9c5d83d7262
--- /dev/null
+++ b/spec/finders/ci/group_variables_finder_spec.rb
@@ -0,0 +1,73 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Ci::GroupVariablesFinder, feature_category: :secrets_management do
+ subject(:finder) { described_class.new(project, sort_key).execute }
+
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:subgroup) { create(:group, parent: group) }
+ let_it_be(:project_with_subgroup) { create(:project, group: subgroup) }
+ let_it_be(:project_without_group) { create(:project) }
+ let_it_be(:variable1) { create(:ci_group_variable, group: group, key: 'GROUP_VAR_A', created_at: 1.day.ago) }
+ let_it_be(:variable2) { create(:ci_group_variable, group: subgroup, key: 'SUBGROUP_VAR_B') }
+
+ let_it_be(:inherited_ci_variables) do
+ [variable1, variable2]
+ end
+
+ let(:sort_key) { nil }
+
+ context 'when project does not have a group' do
+ let_it_be(:project) { project_without_group }
+
+ it 'returns an empty array' do
+ expect(finder.to_a).to match_array([])
+ end
+ end
+
+ context 'when project belongs to a group' do
+ let_it_be(:project) { project_with_subgroup }
+
+ it 'returns variable from parent group and ancestors' do
+ expect(finder.to_a).to match_array([variable1, variable2])
+ end
+ end
+
+ describe 'sorting behaviour' do
+ let_it_be(:project) { project_with_subgroup }
+
+ context 'with sort by created_at descending' do
+ let(:sort_key) { :created_desc }
+
+ it 'returns variables ordered by created_at in descending order' do
+ expect(finder.to_a).to eq([variable2, variable1])
+ end
+ end
+
+ context 'with sort by created_at ascending' do
+ let(:sort_key) { :created_asc }
+
+ it 'returns variables ordered by created_at in ascending order' do
+ expect(finder.to_a).to eq([variable1, variable2])
+ end
+ end
+
+ context 'with sort by key descending' do
+ let(:sort_key) { :key_desc }
+
+ it 'returns variables ordered by key in descending order' do
+ expect(finder.to_a).to eq([variable2, variable1])
+ end
+ end
+
+ context 'with sort by key ascending' do
+ let(:sort_key) { :key_asc }
+
+ it 'returns variables ordered by key in ascending order' do
+ expect(finder.to_a).to eq([variable1, variable2])
+ end
+ end
+ end
+end
diff --git a/spec/finders/ci/runners_finder_spec.rb b/spec/finders/ci/runners_finder_spec.rb
index 77260bb4c5c..e57ad5bc76d 100644
--- a/spec/finders/ci/runners_finder_spec.rb
+++ b/spec/finders/ci/runners_finder_spec.rb
@@ -302,7 +302,7 @@ RSpec.describe Ci::RunnersFinder, feature_category: :runner_fleet do
end
describe '#execute' do
- subject { described_class.new(current_user: user, params: params).execute }
+ subject(:execute) { described_class.new(current_user: user, params: params).execute }
shared_examples 'membership equal to :descendants' do
it 'returns all descendant runners' do
@@ -321,7 +321,7 @@ RSpec.describe Ci::RunnersFinder, feature_category: :runner_fleet do
context 'with :group as target group' do
let(:target_group) { group }
- context 'passing no params' do
+ context 'passing no membership params' do
it_behaves_like 'membership equal to :descendants'
end
diff --git a/spec/finders/clusters/agent_tokens_finder_spec.rb b/spec/finders/clusters/agent_tokens_finder_spec.rb
index 1f5bfd58e85..16fdbc1b669 100644
--- a/spec/finders/clusters/agent_tokens_finder_spec.rb
+++ b/spec/finders/clusters/agent_tokens_finder_spec.rb
@@ -47,10 +47,7 @@ RSpec.describe Clusters::AgentTokensFinder do
context 'when filtering by an unrecognised status' do
subject(:execute) { described_class.new(agent, user, status: 'dummy').execute }
- it 'raises an error' do
- # 'dummy' is not a valid status as defined in the AgentToken status enum
- expect { execute.count }.to raise_error(ActiveRecord::StatementInvalid)
- end
+ it { is_expected.to be_empty }
end
context 'when user does not have permission' do
diff --git a/spec/finders/deployments_finder_spec.rb b/spec/finders/deployments_finder_spec.rb
index 517fa0e2c7a..65003ea97ef 100644
--- a/spec/finders/deployments_finder_spec.rb
+++ b/spec/finders/deployments_finder_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe DeploymentsFinder do
+RSpec.describe DeploymentsFinder, feature_category: :deployment_management do
subject { described_class.new(params).execute }
describe "validation" do
@@ -166,8 +166,8 @@ RSpec.describe DeploymentsFinder do
'id' | 'desc' | [:deployment_3, :deployment_2, :deployment_1]
'iid' | 'asc' | [:deployment_1, :deployment_2, :deployment_3]
'iid' | 'desc' | [:deployment_3, :deployment_2, :deployment_1]
- 'ref' | 'asc' | [:deployment_2, :deployment_1, :deployment_3]
- 'ref' | 'desc' | [:deployment_3, :deployment_1, :deployment_2]
+ 'ref' | 'asc' | [:deployment_1, :deployment_2, :deployment_3] # ref acts like id because of remove_deployments_api_ref_sort feature flag
+ 'ref' | 'desc' | [:deployment_3, :deployment_2, :deployment_1] # ref acts like id because of remove_deployments_api_ref_sort feature flag
'updated_at' | 'asc' | [:deployment_2, :deployment_3, :deployment_1]
'updated_at' | 'desc' | [:deployment_1, :deployment_3, :deployment_2]
'finished_at' | 'asc' | described_class::InefficientQueryError
@@ -185,6 +185,39 @@ RSpec.describe DeploymentsFinder do
end
end
end
+
+ context 'when remove_deployments_api_ref_sort is disabled' do
+ before do
+ stub_feature_flags(remove_deployments_api_ref_sort: false)
+ end
+
+ where(:order_by, :sort, :ordered_deployments) do
+ 'created_at' | 'asc' | [:deployment_1, :deployment_2, :deployment_3]
+ 'created_at' | 'desc' | [:deployment_3, :deployment_2, :deployment_1]
+ 'id' | 'asc' | [:deployment_1, :deployment_2, :deployment_3]
+ 'id' | 'desc' | [:deployment_3, :deployment_2, :deployment_1]
+ 'iid' | 'asc' | [:deployment_1, :deployment_2, :deployment_3]
+ 'iid' | 'desc' | [:deployment_3, :deployment_2, :deployment_1]
+ 'ref' | 'asc' | [:deployment_2, :deployment_1, :deployment_3] # ref sorts when remove_deployments_api_ref_sort feature flag is disabled
+ 'ref' | 'desc' | [:deployment_3, :deployment_1, :deployment_2] # ref sorts when remove_deployments_api_ref_sort feature flag is disabled
+ 'updated_at' | 'asc' | [:deployment_2, :deployment_3, :deployment_1]
+ 'updated_at' | 'desc' | [:deployment_1, :deployment_3, :deployment_2]
+ 'finished_at' | 'asc' | described_class::InefficientQueryError
+ 'finished_at' | 'desc' | described_class::InefficientQueryError
+ 'invalid' | 'asc' | [:deployment_1, :deployment_2, :deployment_3]
+ 'iid' | 'err' | [:deployment_1, :deployment_2, :deployment_3]
+ end
+
+ with_them do
+ it 'returns the deployments ordered' do
+ if ordered_deployments == described_class::InefficientQueryError
+ expect { subject }.to raise_error(described_class::InefficientQueryError)
+ else
+ expect(subject).to eq(ordered_deployments.map { |name| public_send(name) })
+ end
+ end
+ end
+ end
end
describe 'transform `created_at` sorting to `id` sorting' do
diff --git a/spec/finders/group_descendants_finder_spec.rb b/spec/finders/group_descendants_finder_spec.rb
index 9d528355f54..14cbb6a427c 100644
--- a/spec/finders/group_descendants_finder_spec.rb
+++ b/spec/finders/group_descendants_finder_spec.rb
@@ -276,14 +276,6 @@ RSpec.describe GroupDescendantsFinder do
end
it_behaves_like 'filter examples'
-
- context 'when feature flag :linear_group_descendants_finder_upto is disabled' do
- before do
- stub_feature_flags(linear_group_descendants_finder_upto: false)
- end
-
- it_behaves_like 'filter examples'
- end
end
end
end
diff --git a/spec/finders/group_projects_finder_spec.rb b/spec/finders/group_projects_finder_spec.rb
index 4189be94cc1..87e579dbeec 100644
--- a/spec/finders/group_projects_finder_spec.rb
+++ b/spec/finders/group_projects_finder_spec.rb
@@ -87,6 +87,16 @@ RSpec.describe GroupProjectsFinder do
end
end
+ context "owned" do
+ before do
+ root_group.add_owner(current_user)
+ end
+
+ let(:params) { { owned: true } }
+
+ it { is_expected.to match_array([private_project, public_project]) }
+ end
+
context "all" do
context 'with subgroups projects' do
before do
diff --git a/spec/finders/packages/ml_model/package_finder_spec.rb b/spec/finders/packages/ml_model/package_finder_spec.rb
new file mode 100644
index 00000000000..535360d13c5
--- /dev/null
+++ b/spec/finders/packages/ml_model/package_finder_spec.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ::Packages::MlModel::PackageFinder, feature_category: :mlops do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:package) { create(:ml_model_package, project: project) }
+
+ let(:package_name) { package.name }
+ let(:package_version) { package.version }
+
+ describe '#execute!' do
+ subject(:find_package) { described_class.new(project).execute!(package_name, package_version) }
+
+ it 'finds package by name and version' do
+ expect(find_package).to eq(package)
+ end
+
+ it 'ignores packages with same name but different version' do
+ create(:ml_model_package, project: project, name: package.name, version: '3.1.4')
+
+ expect(find_package).to eq(package)
+ end
+
+ context 'when package name+version does not exist' do
+ let(:package_name) { 'a_package_that_does_not_exist' }
+
+ it 'raises ActiveRecord::RecordNotFound' do
+ expect { find_package }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+ end
+
+ context 'when package exists but is marked for destruction' do
+ let_it_be(:invalid_package) do
+ create(:ml_model_package, project: project, status: :pending_destruction)
+ end
+
+ let(:package_name) { invalid_package.name }
+ let(:package_version) { invalid_package.version }
+
+ it 'raises ActiveRecord::RecordNotFound' do
+ expect { find_package }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+ end
+
+ context 'when package name+version does not exist but it is not ml_model' do
+ let_it_be(:another_package) { create(:generic_package, project: project) }
+
+ let(:package_name) { another_package.name }
+ let(:package_version) { another_package.version }
+
+ it 'raises ActiveRecord::RecordNotFound' do
+ expect { find_package }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+ end
+ end
+end
diff --git a/spec/finders/packages/npm/package_finder_spec.rb b/spec/finders/packages/npm/package_finder_spec.rb
index e11b33f71e9..45cc2a07027 100644
--- a/spec/finders/packages/npm/package_finder_spec.rb
+++ b/spec/finders/packages/npm/package_finder_spec.rb
@@ -7,7 +7,6 @@ RSpec.describe ::Packages::Npm::PackageFinder do
let(:project) { package.project }
let(:package_name) { package.name }
- let(:last_of_each_version) { true }
shared_examples 'accepting a namespace for' do |example_name|
before do
@@ -59,35 +58,11 @@ RSpec.describe ::Packages::Npm::PackageFinder do
end
end
- shared_examples 'handling last_of_each_version' do
- include_context 'last_of_each_version setup context'
-
- context 'disabled' do
- let(:last_of_each_version) { false }
-
- it { is_expected.to contain_exactly(package1, package2) }
- end
-
- context 'enabled' do
- it { is_expected.to contain_exactly(package2) }
- end
-
- context 'with npm_allow_packages_in_multiple_projects disabled' do
- before do
- stub_feature_flags(npm_allow_packages_in_multiple_projects: false)
- end
-
- it { is_expected.to contain_exactly(package2) }
- end
- end
-
context 'with a project' do
- let(:finder) { described_class.new(package_name, project: project, last_of_each_version: last_of_each_version) }
+ let(:finder) { described_class.new(package_name, project: project) }
it_behaves_like 'finding packages by name'
- it_behaves_like 'handling last_of_each_version'
-
context 'set to nil' do
let(:project) { nil }
@@ -96,12 +71,10 @@ RSpec.describe ::Packages::Npm::PackageFinder do
end
context 'with a namespace' do
- let(:finder) { described_class.new(package_name, namespace: namespace, last_of_each_version: last_of_each_version) }
+ let(:finder) { described_class.new(package_name, namespace: namespace) }
it_behaves_like 'accepting a namespace for', 'finding packages by name'
- it_behaves_like 'accepting a namespace for', 'handling last_of_each_version'
-
context 'set to nil' do
let_it_be(:namespace) { nil }
@@ -125,28 +98,16 @@ RSpec.describe ::Packages::Npm::PackageFinder do
end
end
- shared_examples 'handling last_of_each_version' do
- include_context 'last_of_each_version setup context'
-
- context 'enabled' do
- it { is_expected.to eq(package2) }
- end
- end
-
context 'with a project' do
- let(:finder) { described_class.new(package_name, project: project, last_of_each_version: last_of_each_version) }
+ let(:finder) { described_class.new(package_name, project: project) }
it_behaves_like 'finding packages by version'
-
- it_behaves_like 'handling last_of_each_version'
end
context 'with a namespace' do
- let(:finder) { described_class.new(package_name, namespace: namespace, last_of_each_version: last_of_each_version) }
+ let(:finder) { described_class.new(package_name, namespace: namespace) }
it_behaves_like 'accepting a namespace for', 'finding packages by version'
-
- it_behaves_like 'accepting a namespace for', 'handling last_of_each_version'
end
end
@@ -157,26 +118,10 @@ RSpec.describe ::Packages::Npm::PackageFinder do
it { is_expected.to eq(package) }
end
- shared_examples 'handling last_of_each_version' do
- include_context 'last_of_each_version setup context'
-
- context 'disabled' do
- let(:last_of_each_version) { false }
-
- it { is_expected.to eq(package2) }
- end
-
- context 'enabled' do
- it { is_expected.to eq(package2) }
- end
- end
-
context 'with a project' do
- let(:finder) { described_class.new(package_name, project: project, last_of_each_version: last_of_each_version) }
+ let(:finder) { described_class.new(package_name, project: project) }
it_behaves_like 'finding package by last'
-
- it_behaves_like 'handling last_of_each_version'
end
context 'with a namespace' do
@@ -184,8 +129,6 @@ RSpec.describe ::Packages::Npm::PackageFinder do
it_behaves_like 'accepting a namespace for', 'finding package by last'
- it_behaves_like 'accepting a namespace for', 'handling last_of_each_version'
-
context 'with duplicate packages' do
let_it_be(:namespace) { create(:group) }
let_it_be(:subgroup1) { create(:group, parent: namespace) }
diff --git a/spec/finders/projects/ml/model_finder_spec.rb b/spec/finders/projects/ml/model_finder_spec.rb
new file mode 100644
index 00000000000..386d690a8d2
--- /dev/null
+++ b/spec/finders/projects/ml/model_finder_spec.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::Ml::ModelFinder, feature_category: :mlops do
+ let_it_be(:model1_a) { create(:ml_model_package) }
+ let_it_be(:project) { model1_a.project }
+ let_it_be(:model1_b) do
+ create(:ml_model_package, name: model1_a.name, project: project)
+ end
+
+ let_it_be(:model2) do
+ create(:ml_model_package, status: :pending_destruction, project: project)
+ end
+
+ let_it_be(:model3) { create(:ml_model_package) }
+ let_it_be(:model4) { create(:generic_package, project: project) }
+
+ subject { described_class.new(project).execute.to_a }
+
+ it 'returns the most recent version of a model' do
+ is_expected.to include(model1_b)
+ end
+
+ it 'does not return older versions of a model' do
+ is_expected.not_to include(model1_a)
+ end
+
+ it 'does not return models pending destruction' do
+ is_expected.not_to include(model2)
+ end
+
+ it 'does not return models belonging to a different project' do
+ is_expected.not_to include(model3)
+ end
+
+ it 'does not return packages that are not ml_model' do
+ is_expected.not_to include(model4)
+ end
+end
diff --git a/spec/finders/projects_finder_spec.rb b/spec/finders/projects_finder_spec.rb
index 3d108951c64..a795df4dec6 100644
--- a/spec/finders/projects_finder_spec.rb
+++ b/spec/finders/projects_finder_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe ProjectsFinder do
+RSpec.describe ProjectsFinder, feature_category: :groups_and_projects do
include AdminModeHelper
describe '#execute' do
@@ -25,6 +25,12 @@ RSpec.describe ProjectsFinder do
create(:project, :private, name: 'D', path: 'D')
end
+ let_it_be(:banned_user_project) do
+ create(:project, :public, name: 'Project created by a banned user', creator: create(:user, :banned)).tap do |p|
+ create(:project_authorization, :owner, user: p.creator, project: p)
+ end
+ end
+
let(:params) { {} }
let(:current_user) { user }
let(:project_ids_relation) { nil }
@@ -488,16 +494,32 @@ RSpec.describe ProjectsFinder do
describe 'with admin user' do
let(:user) { create(:admin) }
- context 'admin mode enabled' do
+ context 'with admin mode enabled' do
before do
enable_admin_mode!(current_user)
end
- it { is_expected.to match_array([public_project, internal_project, private_project, shared_project]) }
+ it do
+ is_expected.to match_array([
+ public_project,
+ internal_project,
+ private_project,
+ shared_project,
+ banned_user_project
+ ])
+ end
end
- context 'admin mode disabled' do
+ context 'with admin mode disabled' do
it { is_expected.to match_array([public_project, internal_project]) }
+
+ context 'when hide_projects_of_banned_users FF is disabled' do
+ before do
+ stub_feature_flags(hide_projects_of_banned_users: false)
+ end
+
+ it { is_expected.to match_array([public_project, internal_project, banned_user_project]) }
+ end
end
end
end
diff --git a/spec/finders/users_finder_spec.rb b/spec/finders/users_finder_spec.rb
index e0a9237a79b..c931de92d1c 100644
--- a/spec/finders/users_finder_spec.rb
+++ b/spec/finders/users_finder_spec.rb
@@ -70,19 +70,6 @@ RSpec.describe UsersFinder do
expect(users).to be_empty
end
-
- context 'when autocomplete_users_use_search_service feature flag is disabled' do
- before do
- stub_feature_flags(autocomplete_users_use_search_service: false)
- end
-
- it 'does not pass use_minimum_char_limit from params' do
- search_term = normal_user.username[..1]
- expect(User).to receive(:search).with(search_term, with_private_emails: anything).once.and_call_original
-
- described_class.new(user, { search: search_term, use_minimum_char_limit: false }).execute
- end
- end
end
it 'filters by external users' do
diff --git a/spec/fixtures/api/schemas/public_api/v4/project_hook.json b/spec/fixtures/api/schemas/public_api/v4/project_hook.json
index 6070f3a55f9..b89f5af8078 100644
--- a/spec/fixtures/api/schemas/public_api/v4/project_hook.json
+++ b/spec/fixtures/api/schemas/public_api/v4/project_hook.json
@@ -22,38 +22,106 @@
"releases_events",
"alert_status",
"disabled_until",
- "url_variables"
+ "url_variables",
+ "emoji_events"
],
"properties": {
- "id": { "type": "integer" },
- "project_id": { "type": "integer" },
- "url": { "type": "string" },
- "created_at": { "type": "string", "format": "date-time" },
- "push_events": { "type": "boolean" },
- "push_events_branch_filter": { "type": ["string", "null"] },
- "tag_push_events": { "type": "boolean" },
- "merge_requests_events": { "type": "boolean" },
- "repository_update_events": { "type": "boolean" },
- "enable_ssl_verification": { "type": "boolean" },
- "issues_events": { "type": "boolean" },
- "confidential_issues_events": { "type": ["boolean", "null"] },
- "note_events": { "type": "boolean" },
- "confidential_note_events": { "type": ["boolean", "null"] },
- "pipeline_events": { "type": "boolean" },
- "wiki_page_events": { "type": "boolean" },
- "job_events": { "type": "boolean" },
- "deployment_events": { "type": "boolean" },
- "releases_events": { "type": "boolean" },
- "alert_status": { "type": "string", "enum": ["executable","disabled","temporarily_disabled"] },
- "disabled_until": { "type": ["string", "null"] },
+ "id": {
+ "type": "integer"
+ },
+ "project_id": {
+ "type": "integer"
+ },
+ "url": {
+ "type": "string"
+ },
+ "created_at": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "push_events": {
+ "type": "boolean"
+ },
+ "push_events_branch_filter": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "tag_push_events": {
+ "type": "boolean"
+ },
+ "merge_requests_events": {
+ "type": "boolean"
+ },
+ "repository_update_events": {
+ "type": "boolean"
+ },
+ "enable_ssl_verification": {
+ "type": "boolean"
+ },
+ "issues_events": {
+ "type": "boolean"
+ },
+ "confidential_issues_events": {
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "note_events": {
+ "type": "boolean"
+ },
+ "confidential_note_events": {
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "pipeline_events": {
+ "type": "boolean"
+ },
+ "wiki_page_events": {
+ "type": "boolean"
+ },
+ "job_events": {
+ "type": "boolean"
+ },
+ "deployment_events": {
+ "type": "boolean"
+ },
+ "releases_events": {
+ "type": "boolean"
+ },
+ "emoji_events": {
+ "type": "boolean"
+ },
+ "alert_status": {
+ "type": "string",
+ "enum": [
+ "executable",
+ "disabled",
+ "temporarily_disabled"
+ ]
+ },
+ "disabled_until": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
"url_variables": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": false,
- "required": ["key"],
+ "required": [
+ "key"
+ ],
"properties": {
- "key": { "type": "string" }
+ "key": {
+ "type": "string"
+ }
}
}
}
diff --git a/spec/fixtures/api/schemas/public_api/v4/wiki_blobs.json b/spec/fixtures/api/schemas/public_api/v4/wiki_blobs.json
new file mode 100644
index 00000000000..26379c56a46
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/wiki_blobs.json
@@ -0,0 +1,57 @@
+{
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "basename": {
+ "type": "string"
+ },
+ "data": {
+ "type": "string"
+ },
+ "path": {
+ "type": [
+ "string"
+ ]
+ },
+ "filename": {
+ "type": [
+ "string"
+ ]
+ },
+ "id": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "project_id": {
+ "type": [
+ "integer",
+ "null"
+ ]
+ },
+ "group_id": {
+ "type": [
+ "integer",
+ "null"
+ ]
+ },
+ "ref": {
+ "type": "string"
+ },
+ "startline": {
+ "type": "integer"
+ }
+ },
+ "required": [
+ "basename",
+ "data",
+ "path",
+ "filename",
+ "ref",
+ "startline"
+ ],
+ "additionalProperties": false
+ }
+}
diff --git a/spec/fixtures/api/schemas/slack/manifest.json b/spec/fixtures/api/schemas/slack/manifest.json
new file mode 100644
index 00000000000..3be7feec27b
--- /dev/null
+++ b/spec/fixtures/api/schemas/slack/manifest.json
@@ -0,0 +1,1250 @@
+{
+ "type": "object",
+ "title": "App Manifest",
+ "required": [
+ "display_information"
+ ],
+ "properties": {
+ "$schema": {
+ "type": "string",
+ "format": "uri"
+ },
+ "_metadata": {
+ "$ref": "#/definitions/app-manifests.metadata"
+ },
+ "app_directory": {
+ "$ref": "#/definitions/app-manifests.v1.app_directory.schema"
+ },
+ "display_information": {
+ "$ref": "#/definitions/app-manifests.v1.display_information.schema"
+ },
+ "features": {
+ "$ref": "#/definitions/app-manifests.v1.features.schema"
+ },
+ "oauth_config": {
+ "$ref": "#/definitions/app-manifests.v1.oauth_config.schema"
+ },
+ "settings": {
+ "$ref": "#/definitions/app-manifests.v1.settings.schema"
+ },
+ "functions": {
+ "$ref": "#/definitions/app-manifests.v2.hermes.functions"
+ },
+ "workflows": {
+ "$ref": "#/definitions/app-manifests.v2.hermes.workflows"
+ },
+ "datastores": {
+ "$ref": "#/definitions/app-manifests.v1.hermes.datastores"
+ },
+ "outgoing_domains": {
+ "$ref": "#/definitions/app-manifests.v1.hermes.outgoing_domains"
+ },
+ "types": {
+ "$ref": "#/definitions/app-manifests.v1.hermes.types"
+ },
+ "external_auth_providers": {
+ "$ref": "#/definitions/app-manifests.v2.hermes.third_party_auth.providers"
+ }
+ },
+ "description": "Describes core app information and functionality.",
+ "definitions": {
+ "app-manifests.metadata": {
+ "type": "object",
+ "properties": {
+ "schema_version": {
+ "type": "integer"
+ },
+ "min_version": {
+ "type": "integer"
+ },
+ "major_version": {
+ "type": "integer",
+ "description": "An integer that specifies the major version of the manifest schema to target."
+ },
+ "minor_version": {
+ "type": "integer",
+ "description": "An integer that specifies the minor version of the manifest schema to target."
+ }
+ },
+ "description": "A group of settings that describe the manifest",
+ "additionalProperties": false
+ },
+ "app-manifests.v1.app_directory.schema": {
+ "type": "object",
+ "required": [
+ "installation_landing_page",
+ "privacy_policy_url",
+ "support_url",
+ "support_email",
+ "supported_languages",
+ "pricing"
+ ],
+ "properties": {
+ "app_directory_categories": {
+ "type": "array",
+ "maxItems": 3,
+ "items": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 255
+ }
+ },
+ "use_direct_install": {
+ "type": "boolean"
+ },
+ "direct_install_url": {
+ "type": "string",
+ "pattern": "^https?:\\/\\/",
+ "maxLength": 255
+ },
+ "installation_landing_page": {
+ "type": "string",
+ "pattern": "^https?:\\/\\/",
+ "maxLength": 255
+ },
+ "privacy_policy_url": {
+ "type": "string",
+ "pattern": "^https?:\\/\\/",
+ "maxLength": 500
+ },
+ "support_url": {
+ "type": "string",
+ "pattern": "^https?:\\/\\/",
+ "maxLength": 350
+ },
+ "support_email": {
+ "type": "string",
+ "pattern": "^[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])?)*$",
+ "maxLength": 100,
+ "_note": "Regex follows HTML5 spec for an email address, not RFC 5322"
+ },
+ "supported_languages": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 50,
+ "items": {
+ "type": "string",
+ "maxLength": 50
+ }
+ },
+ "pricing": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 30
+ }
+ },
+ "description": "Information displayed in the App Directory.",
+ "additionalProperties": false
+ },
+ "app-manifests.v1.display_information.schema": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 35,
+ "description": "A string of the name of the app. Maximum length is 35 characters."
+ },
+ "description": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 140,
+ "description": "A string with a short description of the app for display to users. Maximum length is 140 characters."
+ },
+ "background_color": {
+ "type": "string",
+ "regex": "^#[0-9a-fA-F]{3}([0-9a-fA-F]{3})?$",
+ "minLength": 4,
+ "maxLength": 7,
+ "description": "A string containing a hex color value (including the hex sign) that specifies the background color used on hovercards that display information about your app. Can be 3-digit (#000) or 6-digit (#000000) hex values. Once an app has set a background color value, it cannot be removed, only updated."
+ },
+ "long_description": {
+ "type": "string",
+ "minLength": 175,
+ "maxLength": 4000,
+ "description": "A string with a longer version of the description of the app. Maximum length is 4000 characters."
+ }
+ },
+ "description": "A group of settings that describe parts of an app's appearance within Slack. If you're distributing the app via the App Directory, read our listing guidelines to pick the best values for these settings",
+ "additionalProperties": false
+ },
+ "app-manifests.v1.features.app_home": {
+ "type": "object",
+ "properties": {
+ "home_tab_enabled": {
+ "type": "boolean",
+ "description": "A boolean that specifies whether or not the Home tab is enabled."
+ },
+ "messages_tab_enabled": {
+ "type": "boolean",
+ "description": "A boolean that specifies whether or not the Messages tab in your App Home is enabled."
+ },
+ "messages_tab_read_only_enabled": {
+ "type": "boolean",
+ "description": "A boolean that specifies whether or not the users can send messages to your app in the Messages tab of your App Home."
+ }
+ },
+ "description": "A group of settings corresponding to the Features section of the app config pages.",
+ "additionalProperties": false
+ },
+ "app-manifests.v1.features.bot_user": {
+ "type": "object",
+ "required": [
+ "display_name"
+ ],
+ "properties": {
+ "display_name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 80,
+ "description": "A string containing the display name of the bot user. Maximum length is 80 characters."
+ },
+ "always_online": {
+ "type": "boolean",
+ "description": "A boolean that specifies whether or not the bot user will always appear to be online."
+ }
+ },
+ "description": "A subgroup of settings that describe bot user configuration.",
+ "additionalProperties": false
+ },
+ "slack-functions.parameter": {
+ "type": "object",
+ "required": [
+ "type",
+ "name"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "title": "Slack function parameter type",
+ "enum": [
+ "integer",
+ "number",
+ "boolean",
+ "string",
+ "object",
+ "array",
+ "slack#/types/user_context",
+ "slack#/types/user_permission",
+ "slack#/types/user_id",
+ "slack#/types/channel_id",
+ "slack#/types/usergroup_id",
+ "slack#/types/timestamp",
+ "slack#/types/blocks",
+ "slack#/types/credential/oauth2",
+ "slack#/types/date",
+ "slack#/types/interactivity",
+ "slack#/types/rich_text",
+ "slack#/types/form_input",
+ "slack#/types/form_input_object",
+ "slack#/types/message_ts",
+ "slack#/types/message_context"
+ ]
+ },
+ "name": {
+ "type": "string"
+ },
+ "title": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ },
+ "is_required": {
+ "type": "boolean"
+ }
+ },
+ "additionalProperties": true
+ },
+ "app-manifests.v1.features.functions": {
+ "type": "array",
+ "minItems": 0,
+ "maxItems": 50,
+ "items": {
+ "type": "object",
+ "required": [
+ "callback_id",
+ "title",
+ "description",
+ "input_parameters",
+ "output_parameters"
+ ],
+ "properties": {
+ "title": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ },
+ "callback_id": {
+ "type": "string"
+ },
+ "input_parameters": {
+ "type": "array",
+ "minItems": 0,
+ "maxItems": 20,
+ "items": {
+ "$ref": "#/definitions/slack-functions.parameter"
+ }
+ },
+ "output_parameters": {
+ "type": "array",
+ "minItems": 0,
+ "maxItems": 20,
+ "items": {
+ "$ref": "#/definitions/slack-functions.parameter"
+ }
+ }
+ },
+ "additionalProperties": false
+ },
+ "description": "Make functionality of your app reusable."
+ },
+ "app-manifests.v1.features.shortcuts": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 10,
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "type",
+ "callback_id",
+ "description"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 24,
+ "description": "A string containing the name of the shortcut."
+ },
+ "type": {
+ "type": "string",
+ "enum": [
+ "message",
+ "global"
+ ],
+ "description": "A string containing one of message or global. This specifies which type of shortcut is being described."
+ },
+ "callback_id": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 255,
+ "description": "A string containing the callback_id of this shortcut. Maximum length is 255 characters."
+ },
+ "description": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 150,
+ "description": "A string containing a short description of this shortcut. Maximum length is 150 characters."
+ }
+ },
+ "additionalProperties": false
+ },
+ "description": "An array of settings groups that describe shortcuts configuration. A maximum of 5 shortcuts can be included in this array."
+ },
+ "app-manifests.v1.features.slash_commands": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 50,
+ "items": {
+ "type": "object",
+ "required": [
+ "command",
+ "description"
+ ],
+ "properties": {
+ "command": {
+ "type": "string",
+ "pattern": "^\\/",
+ "minLength": 2,
+ "maxLength": 32,
+ "description": "A string containing the actual slash command. Maximum length is 32 characters, and should include the leading / character."
+ },
+ "url": {
+ "type": "string",
+ "pattern": "^https?:\\/\\/",
+ "maxLength": 3000,
+ "description": "A string containing the full https URL that acts as the slash command's request URL"
+ },
+ "description": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 2000,
+ "description": "A string containing a description of the slash command that will be displayed to users. Maximum length is 2000 characters."
+ },
+ "usage_hint": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 1000,
+ "description": "A string a short usage hint about the slash command for users. Maximum length is 1000 characters."
+ },
+ "should_escape": {
+ "type": "boolean",
+ "description": "A boolean that specifies whether or not channels, users, and links typed with the slash command should be escaped.",
+ "default": false
+ }
+ },
+ "additionalProperties": false
+ },
+ "description": "An array of settings groups that describe slash commands configuration. A maximum of 5 slash commands can be included in this array."
+ },
+ "app-manifests.v1.features.workflow_steps": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 10,
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "callback_id"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 50,
+ "description": "A string containing the name of the workflow step. Maximum length of 50 characters."
+ },
+ "callback_id": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 50,
+ "description": "A string containing the callback_id of the workflow step. Maximum length of 50 characters."
+ }
+ },
+ "additionalProperties": false
+ },
+ "description": "An array of settings groups that describe workflow steps configuration. A maximum of 10 workflow steps can be included in this array."
+ },
+ "app-manifests.v1.features.unfurl_domains": {
+ "uniqueItems": true,
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 5,
+ "items": {
+ "type": "string",
+ "pattern": "^(?![\\.\\-])([-a-z0-9\\.])+([a-z0-9])$",
+ "maxLength": 255
+ },
+ "description": "An array of strings containing valid unfurl domains to register. A maximum of 5 unfurl domains can be included in this array. Please consult the unfurl docs for a list of domain requirements."
+ },
+ "app-manifests.v1.features.schema": {
+ "type": "object",
+ "properties": {
+ "app_home": {
+ "$ref": "#/definitions/app-manifests.v1.features.app_home"
+ },
+ "bot_user": {
+ "$ref": "#/definitions/app-manifests.v1.features.bot_user"
+ },
+ "functions": {
+ "$ref": "#/definitions/app-manifests.v1.features.functions"
+ },
+ "shortcuts": {
+ "$ref": "#/definitions/app-manifests.v1.features.shortcuts"
+ },
+ "slash_commands": {
+ "$ref": "#/definitions/app-manifests.v1.features.slash_commands"
+ },
+ "workflow_steps": {
+ "$ref": "#/definitions/app-manifests.v1.features.workflow_steps"
+ },
+ "unfurl_domains": {
+ "$ref": "#/definitions/app-manifests.v1.features.unfurl_domains"
+ }
+ },
+ "description": "A group of settings corresponding to the Features section of the app config pages.",
+ "additionalProperties": false
+ },
+ "app-manifests.v1.oauth_config.redirect_urls": {
+ "uniqueItems": true,
+ "type": "array",
+ "maxItems": 1000,
+ "items": {
+ "type": "string",
+ "maxLength": 2500,
+ "_note": "Not including a regex bc currently we accept anything like '://asdf'"
+ },
+ "description": "An array of strings containing OAuth redirect URLs. A maximum of 1000 redirect URLs can be included in this array."
+ },
+ "app-manifests.v1.oauth_config.scopes": {
+ "type": "object",
+ "properties": {
+ "user": {
+ "type": "array",
+ "maxItems": 255,
+ "items": {
+ "type": "string",
+ "maxLength": 50
+ },
+ "description": "An array of strings containing user scopes to request upon app installation. A maximum of 255 scopes can included in this array."
+ },
+ "bot": {
+ "type": "array",
+ "maxItems": 255,
+ "items": {
+ "type": "string",
+ "maxLength": 50
+ },
+ "description": "An array of strings containing bot scopes to request upon app installation. A maximum of 255 scopes can included in this array."
+ }
+ },
+ "description": "A subgroup of settings that describe permission scopes configuration.",
+ "additionalProperties": false
+ },
+ "app-manifests.v1.oauth_config.schema": {
+ "type": "object",
+ "properties": {
+ "redirect_urls": {
+ "$ref": "#/definitions/app-manifests.v1.oauth_config.redirect_urls"
+ },
+ "scopes": {
+ "$ref": "#/definitions/app-manifests.v1.oauth_config.scopes"
+ },
+ "token_management_enabled": {
+ "type": "boolean"
+ }
+ },
+ "description": "A group of settings describing OAuth configuration for the app.",
+ "additionalProperties": false
+ },
+ "app-manifests.v1.settings.allowed_ip_address_ranges": {
+ "uniqueItems": true,
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 50,
+ "items": {
+ "type": "string",
+ "pattern": "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/(3[0-2]|[1-2][0-9]|[0-9]))?$"
+ },
+ "description": "An array of strings that contain IP addresses that conform to the Allowed IP Ranges feature"
+ },
+ "app-manifests.v1.settings.event_subscriptions": {
+ "type": "object",
+ "properties": {
+ "request_url": {
+ "type": "string",
+ "pattern": "^https?:\\/\\/",
+ "maxLength": 3500,
+ "description": "A string containing the full https URL that acts as the Events API request URL. If set, you'll need to manually verify the Request URL in the App Manifest section of App Management."
+ },
+ "user_events": {
+ "uniqueItems": true,
+ "type": "array",
+ "maxItems": 100,
+ "items": {
+ "type": "string",
+ "maxLength": 50
+ },
+ "description": "An array of strings matching the event types you want to the app to subscribe to on behalf of authorized users. A maximum of 100 event types can be used."
+ },
+ "bot_events": {
+ "uniqueItems": true,
+ "type": "array",
+ "maxItems": 100,
+ "items": {
+ "type": "string",
+ "maxLength": 50
+ },
+ "description": "An array of strings matching the event types you want to the app to subscribe to. A maximum of 100 event types can be used."
+ },
+ "metadata_subscriptions": {
+ "uniqueItems": true,
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 20,
+ "items": {
+ "type": "object",
+ "required": [
+ "app_id",
+ "event_type"
+ ],
+ "properties": {
+ "app_id": {
+ "type": "string"
+ },
+ "event_type": {
+ "type": "string",
+ "maxLength": 50
+ }
+ },
+ "additionalProperties": false
+ }
+ }
+ },
+ "description": "A subgroup of settings that describe Events API configuration for the app.",
+ "additionalProperties": false
+ },
+ "app-manifests.v1.settings.incoming_webhooks": {
+ "type": "object",
+ "properties": {
+ "incoming_webhooks_enabled": {
+ "type": "boolean"
+ }
+ },
+ "description": "Incoming Webhooks settings",
+ "additionalProperties": false
+ },
+ "app-manifests.v1.settings.interactivity": {
+ "type": "object",
+ "required": [
+ "is_enabled"
+ ],
+ "properties": {
+ "is_enabled": {
+ "type": "boolean",
+ "description": "A boolean that specifies whether or not interactivity features are enabled."
+ },
+ "request_url": {
+ "type": "string",
+ "pattern": "^https?:\\/\\/",
+ "maxLength": 3500,
+ "description": "A string containing the full https URL that acts as the interactive Request URL."
+ },
+ "message_menu_options_url": {
+ "type": "string",
+ "pattern": "^https?:\\/\\/",
+ "maxLength": 3500,
+ "description": "A string containing the full https URL that acts as the interactive Options Load URL."
+ }
+ },
+ "description": "A subgroup of settings that describe interactivity configuration for the app.",
+ "additionalProperties": false
+ },
+ "app-manifests.v1.settings.siws_links": {
+ "type": "object",
+ "properties": {
+ "initiate_uri": {
+ "type": "string",
+ "pattern": "^https:\\/\\/",
+ "maxLength": 3500
+ }
+ },
+ "additionalProperties": false
+ },
+ "app-manifests.v1.settings.schema": {
+ "type": "object",
+ "properties": {
+ "allowed_ip_address_ranges": {
+ "$ref": "#/definitions/app-manifests.v1.settings.allowed_ip_address_ranges"
+ },
+ "event_subscriptions": {
+ "$ref": "#/definitions/app-manifests.v1.settings.event_subscriptions"
+ },
+ "incoming_webhooks": {
+ "$ref": "#/definitions/app-manifests.v1.settings.incoming_webhooks"
+ },
+ "interactivity": {
+ "$ref": "#/definitions/app-manifests.v1.settings.interactivity"
+ },
+ "org_deploy_enabled": {
+ "type": "boolean",
+ "description": "A boolean that specifies whether or not org-wide deploy is enabled."
+ },
+ "socket_mode_enabled": {
+ "type": "boolean",
+ "description": "A boolean that specifies whether or not Socket Mode is enabled."
+ },
+ "is_hosted": {
+ "type": "boolean"
+ },
+ "token_rotation_enabled": {
+ "type": "boolean"
+ },
+ "siws_links": {
+ "$ref": "#/definitions/app-manifests.v1.settings.siws_links"
+ },
+ "hermes_app_type": {
+ "type": "string"
+ },
+ "function_runtime": {
+ "type": "string"
+ }
+ },
+ "description": "A group of settings corresponding to the Settings section of the app config pages.",
+ "additionalProperties": false
+ },
+ "app-manifests.v1.hermes.types.type": {
+ "type": "object",
+ "required": [
+ "type"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "title": "Slack primitive type",
+ "enum": [
+ "integer",
+ "number",
+ "boolean",
+ "string",
+ "object",
+ "array",
+ "slack#/types/user_context",
+ "slack#/types/user_permission",
+ "slack#/types/user_id",
+ "slack#/types/channel_id",
+ "slack#/types/usergroup_id",
+ "slack#/types/timestamp",
+ "slack#/types/blocks",
+ "slack#/types/credential/oauth2",
+ "slack#/types/date",
+ "slack#/types/interactivity",
+ "slack#/types/rich_text",
+ "slack#/types/form_input",
+ "slack#/types/form_input_object",
+ "slack#/types/message_ts",
+ "slack#/types/message_context"
+ ]
+ },
+ "title": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ },
+ "is_required": {
+ "type": "boolean"
+ },
+ "is_hidden": {
+ "type": "boolean"
+ },
+ "hint": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": true
+ },
+ "app-manifests.v1.hermes.types": {
+ "type": "object",
+ "patternProperties": {
+ ".*": {
+ "$ref": "#/definitions/app-manifests.v1.hermes.types.type"
+ }
+ },
+ "minProperties": 0,
+ "maxProperties": 50,
+ "description": "Declare the types the app provides",
+ "default": {
+ "your_type_name": {
+ "type": "string"
+ }
+ }
+ },
+ "app-manifests.v2.hermes.functions": {
+ "type": "object",
+ "patternProperties": {
+ ".*": {
+ "type": "object",
+ "required": [
+ "title",
+ "description",
+ "input_parameters",
+ "output_parameters"
+ ],
+ "properties": {
+ "title": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ },
+ "input_parameters": {
+ "type": "object",
+ "required": [
+ "properties"
+ ],
+ "properties": {
+ "properties": {
+ "$ref": "#/definitions/app-manifests.v1.hermes.types"
+ },
+ "required": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "output_parameters": {
+ "type": "object",
+ "required": [
+ "properties"
+ ],
+ "properties": {
+ "properties": {
+ "$ref": "#/definitions/app-manifests.v1.hermes.types"
+ },
+ "required": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "additionalProperties": false
+ }
+ },
+ "minProperties": 0,
+ "maxProperties": 50,
+ "description": "Make functionality of your app reusable.",
+ "default": {
+ "your_callback_id": {
+ "title": "Your Function Title",
+ "description": "Your Function Description",
+ "input_parameters": {
+ },
+ "output_parameters": {
+ }
+ }
+ }
+ },
+ "app-manifests.v2.hermes.step": {
+ "type": "object",
+ "required": [
+ "id",
+ "function_id",
+ "inputs"
+ ],
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "function_id": {
+ "type": "string"
+ },
+ "inputs": {
+ "type": "object",
+ "patternProperties": {
+ "^.+$": {
+ "type": [
+ "string",
+ "object",
+ "array",
+ "number",
+ "boolean"
+ ]
+ }
+ },
+ "default": {
+ "your_input": "string"
+ },
+ "additionalProperties": false
+ },
+ "type": {
+ "type": "string",
+ "enum": [
+ "function",
+ "switch",
+ "conditional"
+ ]
+ }
+ },
+ "description": "Declare a workflow step",
+ "additionalProperties": false
+ },
+ "slack-functions.value-template": {
+ "type": "object",
+ "required": [
+ "value"
+ ],
+ "properties": {
+ "value": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "string"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "object"
+ },
+ {
+ "type": "array"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "initial_value": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "string"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "object"
+ },
+ {
+ "type": "array"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "locked": {
+ "type": "boolean",
+ "default": false
+ },
+ "hidden": {
+ "type": "boolean",
+ "default": false
+ }
+ },
+ "description": "An object describing how to render a value at runtime",
+ "additionalProperties": false
+ },
+ "slack-functions.parameter-value-templates": {
+ "type": "object",
+ "patternProperties": {
+ "^.+$": {
+ "$ref": "#/definitions/slack-functions.value-template"
+ }
+ },
+ "description": "A mapping of parameter names to template objects",
+ "default": {
+ "your_input": {
+ "value": {
+ "type": "integer"
+ }
+ }
+ },
+ "additionalProperties": false
+ },
+ "app-manifests.v2.hermes.workflows": {
+ "type": "object",
+ "patternProperties": {
+ ".*": {
+ "type": "object",
+ "required": [
+ "title",
+ "description",
+ "steps"
+ ],
+ "properties": {
+ "title": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ },
+ "input_parameters": {
+ "type": "object",
+ "required": [
+ "properties"
+ ],
+ "properties": {
+ "properties": {
+ "$ref": "#/definitions/app-manifests.v1.hermes.types"
+ },
+ "required": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "steps": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/app-manifests.v2.hermes.step"
+ }
+ },
+ "suggested_triggers": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "type",
+ "inputs"
+ ],
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string"
+ },
+ "inputs": {
+ "$ref": "#/definitions/slack-functions.parameter-value-templates"
+ }
+ },
+ "additionalProperties": false
+ }
+ }
+ },
+ "additionalProperties": false
+ }
+ },
+ "minProperties": 0,
+ "maxProperties": 50,
+ "description": "Declare the workflow functions the app provides.",
+ "default": {
+ "your_workflow_id": {
+ "title": "Your Workflow Title",
+ "description": "Your Workflow Description",
+ "steps": [
+
+ ]
+ }
+ }
+ },
+ "app-manifests.v1.hermes.datastores": {
+ "type": "object",
+ "patternProperties": {
+ "^.+$": {
+ "type": "object",
+ "required": [
+ "primary_key",
+ "attributes"
+ ],
+ "properties": {
+ "primary_key": {
+ "type": "string",
+ "minLength": 1
+ },
+ "attributes": {
+ "type": "object",
+ "patternProperties": {
+ "^.+$": {
+ "type": "object",
+ "required": [
+ "type"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "minLength": 1
+ },
+ "items": {
+ "type": "object",
+ "required": [
+ "type"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "minLength": 1
+ }
+ }
+ },
+ "properties": {
+ "type": "object"
+ }
+ }
+ }
+ },
+ "minProperties": 0,
+ "maxProperties": 100,
+ "default": {
+ "your_attribute_id": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ }
+ },
+ "additionalProperties": false
+ }
+ },
+ "minProperties": 0,
+ "maxProperties": 10,
+ "description": "Declares the datastores used by the app.",
+ "default": {
+ "your_datastore_id": {
+ "primary_key": "Your Primary Key",
+ "attributes": {
+ "your_attribute_id": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "additionalProperties": false
+ },
+ "app-manifests.v1.hermes.outgoing_domains": {
+ "uniqueItems": true,
+ "type": "array",
+ "minItems": 0,
+ "maxItems": 10,
+ "items": {
+ "type": "string",
+ "pattern": "^(?![\\.\\-])([-a-z0-9\\.])+([a-z0-9])$",
+ "maxLength": 50
+ },
+ "description": "Allowed Egress Domains for the Hosted App"
+ },
+ "app-manifests.v2.hermes.third_party_auth.providers.oauth2": {
+ "type": "object",
+ "patternProperties": {
+ ".*": {
+ "type": "object",
+ "required": [
+ "provider_type",
+ "options"
+ ],
+ "properties": {
+ "provider_type": {
+ "type": "string",
+ "enum": [
+ "CUSTOM",
+ "SLACK_PROVIDED"
+ ]
+ },
+ "options": {
+ "anyOf": [
+ {
+ "type": "object",
+ "required": [
+ "client_id",
+ "scope"
+ ],
+ "properties": {
+ "client_id": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 1024
+ },
+ "scope": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "minItems": 0
+ }
+ }
+ },
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "required": [
+ "client_id",
+ "provider_name",
+ "authorization_url",
+ "token_url",
+ "scope",
+ "identity_config"
+ ],
+ "properties": {
+ "client_id": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 1024
+ },
+ "provider_name": {
+ "type": "string",
+ "minLength": 2,
+ "maxLength": 255
+ },
+ "authorization_url": {
+ "type": "string",
+ "pattern": "^https:\\/\\/",
+ "minLength": 5,
+ "maxLength": 255
+ },
+ "token_url": {
+ "type": "string",
+ "pattern": "^https:\\/\\/",
+ "minLength": 5,
+ "maxLength": 255
+ },
+ "scope": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "pattern": "^(\\x21|[\\x23-\\x5B]|[\\x5D-\\x7E]){1,}$",
+ "minItems": 0
+ }
+ },
+ "authorization_url_extras": {
+ "type": "object"
+ },
+ "identity_config": {
+ "type": "object",
+ "required": [
+ "url",
+ "account_identifier"
+ ],
+ "properties": {
+ "url": {
+ "type": "string",
+ "pattern": "^https:\\/\\/",
+ "minLength": 5,
+ "maxLength": 255
+ },
+ "account_identifier": {
+ "type": "string",
+ "pattern": "^\\$\\.(.)+",
+ "minLength": 1,
+ "maxLength": 255
+ },
+ "headers": {
+ "type": "object"
+ }
+ },
+ "additionalProperties": false
+ }
+ },
+ "additionalProperties": false
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ }
+ },
+ "description": "Declares the oauth configurations used by the app.",
+ "default": {
+ "your_oauth2_id": {
+ "provider_type": "CUSTOM",
+ "options": {
+ "client_id": "Your Client ID",
+ "scope": [
+
+ ]
+ }
+ }
+ }
+ },
+ "app-manifests.v2.hermes.third_party_auth.providers": {
+ "type": "object",
+ "properties": {
+ "oauth2": {
+ "$ref": "#/definitions/app-manifests.v2.hermes.third_party_auth.providers.oauth2"
+ }
+ },
+ "description": "Declares the oauth configurations used by the app.",
+ "additionalProperties": false
+ }
+ },
+ "additionalProperties": false,
+ "$schema": "http://json-schema.org/draft-07/schema#"
+}
diff --git a/spec/fixtures/csv_missing_milestones.csv b/spec/fixtures/csv_missing_milestones.csv
new file mode 100644
index 00000000000..ec2b20df018
--- /dev/null
+++ b/spec/fixtures/csv_missing_milestones.csv
@@ -0,0 +1,5 @@
+title,description,milestone
+"Issue with missing milestone","",15.10,
+"Issue without milestone","",,
+"Issue with milestone","",10.1,
+"Issue with duplicate milestone","",15.10,
diff --git a/spec/fixtures/grafana/expected_grafana_embed.json b/spec/fixtures/grafana/expected_grafana_embed.json
index 72fb5477b9e..0cee0385886 100644
--- a/spec/fixtures/grafana/expected_grafana_embed.json
+++ b/spec/fixtures/grafana/expected_grafana_embed.json
@@ -10,14 +10,12 @@
{
"id": "In_0",
"query_range": "sum( rate(redis_net_input_bytes_total{instance=~\"localhost:9121\"}[1m]))",
- "label": "In",
- "prometheus_endpoint_path": "/foo/bar/-/grafana/proxy/1/api/v1/query_range?query=sum%28++rate%28redis_net_input_bytes_total%7Binstance%3D~%22localhost%3A9121%22%7D%5B1m%5D%29%29"
+ "label": "In"
},
{
"id": "Out_1",
"query_range": "sum( rate(redis_net_output_bytes_total{instance=~\"localhost:9121\"}[1m]))",
- "label": "Out",
- "prometheus_endpoint_path": "/foo/bar/-/grafana/proxy/1/api/v1/query_range?query=sum%28++rate%28redis_net_output_bytes_total%7Binstance%3D~%22localhost%3A9121%22%7D%5B1m%5D%29%29"
+ "label": "Out"
}
]
}
diff --git a/spec/fixtures/lib/gitlab/import_export/complex/tree/project/issues.ndjson b/spec/fixtures/lib/gitlab/import_export/complex/tree/project/issues.ndjson
index 3955107865d..8b6dfaf72d7 100644
--- a/spec/fixtures/lib/gitlab/import_export/complex/tree/project/issues.ndjson
+++ b/spec/fixtures/lib/gitlab/import_export/complex/tree/project/issues.ndjson
@@ -3,8 +3,8 @@
{"id":38,"title":"Quasi adipisci non cupiditate dolorem quo qui earum sed.","author_id":6,"project_id":5,"created_at":"2016-06-14T15:02:08.154Z","updated_at":"2016-06-14T15:02:48.614Z","position":0,"branch_name":null,"description":"Ea recusandae neque autem tempora.","state":"closed","iid":8,"updated_by_id":null,"confidential":false,"due_date":null,"moved_to_id":null,"label_links":[{"id":99,"label_id":2,"target_id":38,"target_type":"Issue","created_at":"2016-07-22T08:57:02.840Z","updated_at":"2016-07-22T08:57:02.840Z","label":{"id":2,"title":"test2","color":"#428bca","project_id":8,"created_at":"2016-07-22T08:55:44.161Z","updated_at":"2016-07-22T08:55:44.161Z","template":false,"description":"","type":"ProjectLabel"}}],"notes":[{"id":367,"note":"Accusantium fugiat et eaque quisquam esse corporis.","noteable_type":"Issue","author_id":26,"created_at":"2016-06-14T15:02:48.235Z","updated_at":"2016-06-14T15:02:48.235Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":38,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 4"},"events":[]},{"id":368,"note":"Ea labore eum nam qui laboriosam.","noteable_type":"Issue","author_id":25,"created_at":"2016-06-14T15:02:48.261Z","updated_at":"2016-06-14T15:02:48.261Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":38,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 3"},"events":[]},{"id":369,"note":"Accusantium quis sed molestiae et.","noteable_type":"Issue","author_id":22,"created_at":"2016-06-14T15:02:48.294Z","updated_at":"2016-06-14T15:02:48.294Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":38,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 0"},"events":[]},{"id":370,"note":"Corporis numquam a voluptatem pariatur asperiores dolorem delectus autem.","noteable_type":"Issue","author_id":20,"created_at":"2016-06-14T15:02:48.523Z","updated_at":"2016-06-14T15:02:48.523Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":38,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ottis Schuster II"},"events":[]},{"id":371,"note":"Ea accusantium maxime voluptas rerum.","noteable_type":"Issue","author_id":16,"created_at":"2016-06-14T15:02:48.546Z","updated_at":"2016-06-14T15:02:48.546Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":38,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Rhett Emmerich IV"},"events":[]},{"id":372,"note":"Pariatur iusto et et excepturi similique ipsam eum.","noteable_type":"Issue","author_id":15,"created_at":"2016-06-14T15:02:48.569Z","updated_at":"2016-06-14T15:02:48.569Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":38,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Burdette Bernier"},"events":[]},{"id":373,"note":"Aliquam et culpa officia iste eius.","noteable_type":"Issue","author_id":6,"created_at":"2016-06-14T15:02:48.591Z","updated_at":"2016-06-14T15:02:48.591Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":38,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ari Wintheiser"},"events":[]},{"id":374,"note":"Ab id velit id unde laborum.","noteable_type":"Issue","author_id":1,"created_at":"2016-06-14T15:02:48.613Z","updated_at":"2016-06-14T15:02:48.613Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":38,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"},"events":[]}]}
{"id":37,"title":"Cupiditate quo aut ducimus minima molestiae vero numquam possimus.","author_id":20,"project_id":5,"created_at":"2016-06-14T15:02:08.051Z","updated_at":"2016-06-14T15:02:48.854Z","position":0,"branch_name":null,"description":"Maiores architecto quos in dolorem.","state":"opened","iid":7,"updated_by_id":null,"confidential":false,"due_date":null,"moved_to_id":null,"notes":[{"id":375,"note":"Quasi fugit qui sed eligendi aut quia.","noteable_type":"Issue","author_id":26,"created_at":"2016-06-14T15:02:48.647Z","updated_at":"2016-06-14T15:02:48.647Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":37,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 4"},"events":[]},{"id":376,"note":"Esse nesciunt voluptatem ex vero est consequatur.","noteable_type":"Issue","author_id":25,"created_at":"2016-06-14T15:02:48.674Z","updated_at":"2016-06-14T15:02:48.674Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":37,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 3"},"events":[]},{"id":377,"note":"Similique qui quas non aut et velit sequi in.","noteable_type":"Issue","author_id":22,"created_at":"2016-06-14T15:02:48.696Z","updated_at":"2016-06-14T15:02:48.696Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":37,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 0"},"events":[]},{"id":378,"note":"Eveniet ut cupiditate repellendus numquam in esse eius.","noteable_type":"Issue","author_id":20,"created_at":"2016-06-14T15:02:48.720Z","updated_at":"2016-06-14T15:02:48.720Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":37,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ottis Schuster II"},"events":[]},{"id":379,"note":"Velit est dolorem adipisci rerum sed iure.","noteable_type":"Issue","author_id":16,"created_at":"2016-06-14T15:02:48.755Z","updated_at":"2016-06-14T15:02:48.755Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":37,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Rhett Emmerich IV"},"events":[]},{"id":380,"note":"Voluptatem ullam ab ut illo ut quo.","noteable_type":"Issue","author_id":15,"created_at":"2016-06-14T15:02:48.793Z","updated_at":"2016-06-14T15:02:48.793Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":37,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Burdette Bernier"},"events":[]},{"id":381,"note":"Voluptatem impedit beatae quasi ipsa earum consectetur.","noteable_type":"Issue","author_id":6,"created_at":"2016-06-14T15:02:48.823Z","updated_at":"2016-06-14T15:02:48.823Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":37,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ari Wintheiser"},"events":[]},{"id":382,"note":"Nihil officiis eaque incidunt sunt voluptatum excepturi.","noteable_type":"Issue","author_id":1,"created_at":"2016-06-14T15:02:48.852Z","updated_at":"2016-06-14T15:02:48.852Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":37,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"},"events":[]}]}
{"id":36,"title":"Necessitatibus dolor est enim quia rem suscipit quidem voluptas ullam.","author_id":16,"project_id":5,"created_at":"2016-06-14T15:02:07.958Z","updated_at":"2016-06-14T15:02:49.044Z","position":0,"branch_name":null,"description":"Ut aut ut et tenetur velit aut id modi.","state":"opened","iid":6,"updated_by_id":null,"confidential":false,"due_date":null,"moved_to_id":null,"notes":[{"id":383,"note":"Excepturi deleniti sunt rerum nesciunt vero fugiat possimus.","noteable_type":"Issue","author_id":26,"created_at":"2016-06-14T15:02:48.885Z","updated_at":"2016-06-14T15:02:48.885Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":36,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 4"},"events":[]},{"id":384,"note":"Et est nemo sed nam sed.","noteable_type":"Issue","author_id":25,"created_at":"2016-06-14T15:02:48.910Z","updated_at":"2016-06-14T15:02:48.910Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":36,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 3"},"events":[]},{"id":385,"note":"Animi mollitia nulla facere amet aut quaerat.","noteable_type":"Issue","author_id":22,"created_at":"2016-06-14T15:02:48.934Z","updated_at":"2016-06-14T15:02:48.934Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":36,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 0"},"events":[]},{"id":386,"note":"Excepturi id voluptas ut odio officiis omnis.","noteable_type":"Issue","author_id":20,"created_at":"2016-06-14T15:02:48.955Z","updated_at":"2016-06-14T15:02:48.955Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":36,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ottis Schuster II"},"events":[]},{"id":387,"note":"Molestiae labore officiis magni et eligendi quasi maxime.","noteable_type":"Issue","author_id":16,"created_at":"2016-06-14T15:02:48.978Z","updated_at":"2016-06-14T15:02:48.978Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":36,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Rhett Emmerich IV"},"events":[]},{"id":388,"note":"Officia tenetur praesentium rem nam non.","noteable_type":"Issue","author_id":15,"created_at":"2016-06-14T15:02:49.001Z","updated_at":"2016-06-14T15:02:49.001Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":36,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Burdette Bernier"},"events":[]},{"id":389,"note":"Et et et molestiae reprehenderit.","noteable_type":"Issue","author_id":6,"created_at":"2016-06-14T15:02:49.022Z","updated_at":"2016-06-14T15:02:49.022Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":36,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ari Wintheiser"},"events":[]},{"id":390,"note":"Aperiam in consequatur est sunt cum quia.","noteable_type":"Issue","author_id":1,"created_at":"2016-06-14T15:02:49.043Z","updated_at":"2016-06-14T15:02:49.043Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":36,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"},"events":[]}]}
-{"id":35,"title":"Repellat praesentium deserunt maxime incidunt harum porro qui.","author_id":20,"project_id":5,"created_at":"2016-06-14T15:02:07.832Z","updated_at":"2016-06-14T15:02:49.226Z","position":0,"branch_name":null,"description":"Dicta nisi nihil non ipsa velit.","state":"closed","iid":5,"updated_by_id":null,"confidential":false,"due_date":null,"moved_to_id":null,"notes":[{"id":391,"note":"Qui magnam et assumenda quod id dicta necessitatibus.","noteable_type":"Issue","author_id":26,"created_at":"2016-06-14T15:02:49.075Z","updated_at":"2016-06-14T15:02:49.075Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":35,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 4"},"events":[]},{"id":392,"note":"Consectetur deserunt possimus dolor est odio.","noteable_type":"Issue","author_id":25,"created_at":"2016-06-14T15:02:49.095Z","updated_at":"2016-06-14T15:02:49.095Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":35,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 3"},"events":[]},{"id":393,"note":"Labore nisi quo cumque voluptas consequatur aut qui.","noteable_type":"Issue","author_id":22,"created_at":"2016-06-14T15:02:49.117Z","updated_at":"2016-06-14T15:02:49.117Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":35,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 0"},"events":[]},{"id":394,"note":"Et totam facilis voluptas et enim.","noteable_type":"Issue","author_id":20,"created_at":"2016-06-14T15:02:49.138Z","updated_at":"2016-06-14T15:02:49.138Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":35,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ottis Schuster II"},"events":[]},{"id":395,"note":"Ratione sint pariatur sed omnis eligendi quo libero exercitationem.","noteable_type":"Issue","author_id":16,"created_at":"2016-06-14T15:02:49.160Z","updated_at":"2016-06-14T15:02:49.160Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":35,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Rhett Emmerich IV"},"events":[]},{"id":396,"note":"Iure hic autem id voluptatem.","noteable_type":"Issue","author_id":15,"created_at":"2016-06-14T15:02:49.182Z","updated_at":"2016-06-14T15:02:49.182Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":35,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Burdette Bernier"},"events":[]},{"id":397,"note":"Excepturi eum laboriosam delectus repellendus odio nisi et voluptatem.","noteable_type":"Issue","author_id":6,"created_at":"2016-06-14T15:02:49.205Z","updated_at":"2016-06-14T15:02:49.205Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":35,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ari Wintheiser"},"events":[]},{"id":398,"note":"Ut quis ex soluta consequatur et blanditiis.","noteable_type":"Issue","author_id":1,"created_at":"2016-06-14T15:02:49.225Z","updated_at":"2016-06-14T15:02:49.225Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":35,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"},"events":[]}]}
+{"id":35,"title":"task by both attributes","work_item_type":{"base_type":"task"},"issue_type":"incident","author_id":20,"project_id":5,"created_at":"2016-06-14T15:02:07.832Z","updated_at":"2016-06-14T15:02:49.226Z","position":0,"branch_name":null,"description":"Dicta nisi nihil non ipsa velit.","state":"closed","iid":5,"updated_by_id":null,"confidential":false,"due_date":null,"moved_to_id":null,"notes":[{"id":391,"note":"Qui magnam et assumenda quod id dicta necessitatibus.","noteable_type":"Issue","author_id":26,"created_at":"2016-06-14T15:02:49.075Z","updated_at":"2016-06-14T15:02:49.075Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":35,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 4"},"events":[]},{"id":392,"note":"Consectetur deserunt possimus dolor est odio.","noteable_type":"Issue","author_id":25,"created_at":"2016-06-14T15:02:49.095Z","updated_at":"2016-06-14T15:02:49.095Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":35,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 3"},"events":[]},{"id":393,"note":"Labore nisi quo cumque voluptas consequatur aut qui.","noteable_type":"Issue","author_id":22,"created_at":"2016-06-14T15:02:49.117Z","updated_at":"2016-06-14T15:02:49.117Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":35,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 0"},"events":[]},{"id":394,"note":"Et totam facilis voluptas et enim.","noteable_type":"Issue","author_id":20,"created_at":"2016-06-14T15:02:49.138Z","updated_at":"2016-06-14T15:02:49.138Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":35,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ottis Schuster II"},"events":[]},{"id":395,"note":"Ratione sint pariatur sed omnis eligendi quo libero exercitationem.","noteable_type":"Issue","author_id":16,"created_at":"2016-06-14T15:02:49.160Z","updated_at":"2016-06-14T15:02:49.160Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":35,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Rhett Emmerich IV"},"events":[]},{"id":396,"note":"Iure hic autem id voluptatem.","noteable_type":"Issue","author_id":15,"created_at":"2016-06-14T15:02:49.182Z","updated_at":"2016-06-14T15:02:49.182Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":35,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Burdette Bernier"},"events":[]},{"id":397,"note":"Excepturi eum laboriosam delectus repellendus odio nisi et voluptatem.","noteable_type":"Issue","author_id":6,"created_at":"2016-06-14T15:02:49.205Z","updated_at":"2016-06-14T15:02:49.205Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":35,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ari Wintheiser"},"events":[]},{"id":398,"note":"Ut quis ex soluta consequatur et blanditiis.","noteable_type":"Issue","author_id":1,"created_at":"2016-06-14T15:02:49.225Z","updated_at":"2016-06-14T15:02:49.225Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":35,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"},"events":[]}]}
{"id":34,"title":"Ullam expedita deserunt libero consequatur quia dolor harum perferendis facere quidem.","author_id":1,"project_id":5,"created_at":"2016-06-14T15:02:07.717Z","updated_at":"2016-06-14T15:02:49.416Z","position":0,"branch_name":null,"description":"Ut et explicabo vel voluptatem consequuntur ut sed.","state":"closed","iid":4,"updated_by_id":null,"confidential":false,"due_date":null,"moved_to_id":null,"notes":[{"id":399,"note":"Dolor iste tempora tenetur non vitae maiores voluptatibus.","noteable_type":"Issue","author_id":26,"created_at":"2016-06-14T15:02:49.256Z","updated_at":"2016-06-14T15:02:49.256Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":34,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 4"},"events":[]},{"id":400,"note":"Aut sit quidem qui adipisci maxime excepturi iusto.","noteable_type":"Issue","author_id":25,"created_at":"2016-06-14T15:02:49.284Z","updated_at":"2016-06-14T15:02:49.284Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":34,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 3"},"events":[]},{"id":401,"note":"Et a necessitatibus autem quidem animi sunt voluptatum rerum.","noteable_type":"Issue","author_id":22,"created_at":"2016-06-14T15:02:49.305Z","updated_at":"2016-06-14T15:02:49.305Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":34,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 0"},"events":[]},{"id":402,"note":"Esse laboriosam quo voluptatem quis molestiae.","noteable_type":"Issue","author_id":20,"created_at":"2016-06-14T15:02:49.328Z","updated_at":"2016-06-14T15:02:49.328Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":34,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ottis Schuster II"},"events":[]},{"id":403,"note":"Nemo magnam distinctio est ut voluptate ea.","noteable_type":"Issue","author_id":16,"created_at":"2016-06-14T15:02:49.350Z","updated_at":"2016-06-14T15:02:49.350Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":34,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Rhett Emmerich IV"},"events":[]},{"id":404,"note":"Omnis sed rerum neque rerum quae quam nulla officiis.","noteable_type":"Issue","author_id":15,"created_at":"2016-06-14T15:02:49.372Z","updated_at":"2016-06-14T15:02:49.372Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":34,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Burdette Bernier"},"events":[]},{"id":405,"note":"Quo soluta dolorem vitae ad consequatur qui aut dicta.","noteable_type":"Issue","author_id":6,"created_at":"2016-06-14T15:02:49.394Z","updated_at":"2016-06-14T15:02:49.394Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":34,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ari Wintheiser"},"events":[]},{"id":406,"note":"Magni minus est aut aut totam ut.","noteable_type":"Issue","author_id":1,"created_at":"2016-06-14T15:02:49.414Z","updated_at":"2016-06-14T15:02:49.414Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":34,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"},"events":[]}]}
-{"id":33,"title":"Numquam accusamus eos iste exercitationem magni non inventore.","author_id":26,"project_id":5,"created_at":"2016-06-14T15:02:07.611Z","updated_at":"2016-06-14T15:02:49.661Z","position":0,"branch_name":null,"description":"Non asperiores velit accusantium voluptate.","state":"closed","iid":3,"updated_by_id":null,"confidential":false,"due_date":null,"moved_to_id":null,"notes":[{"id":407,"note":"Quod ea et possimus architecto.","noteable_type":"Issue","author_id":26,"created_at":"2016-06-14T15:02:49.450Z","updated_at":"2016-06-14T15:02:49.450Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":33,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 4"},"events":[]},{"id":408,"note":"Reiciendis est et unde perferendis dicta ut praesentium quasi.","noteable_type":"Issue","author_id":25,"created_at":"2016-06-14T15:02:49.503Z","updated_at":"2016-06-14T15:02:49.503Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":33,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 3"},"events":[]},{"id":409,"note":"Magni quia odio blanditiis pariatur voluptas.","noteable_type":"Issue","author_id":22,"created_at":"2016-06-14T15:02:49.527Z","updated_at":"2016-06-14T15:02:49.527Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":33,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 0"},"events":[]},{"id":410,"note":"Enim quam ut et et et.","noteable_type":"Issue","author_id":20,"created_at":"2016-06-14T15:02:49.551Z","updated_at":"2016-06-14T15:02:49.551Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":33,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ottis Schuster II"},"events":[]},{"id":411,"note":"Fugit voluptatem ratione maxime expedita.","noteable_type":"Issue","author_id":16,"created_at":"2016-06-14T15:02:49.578Z","updated_at":"2016-06-14T15:02:49.578Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":33,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Rhett Emmerich IV"},"events":[]},{"id":412,"note":"Voluptatem enim aut ipsa et et ducimus.","noteable_type":"Issue","author_id":15,"created_at":"2016-06-14T15:02:49.604Z","updated_at":"2016-06-14T15:02:49.604Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":33,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Burdette Bernier"},"events":[]},{"id":413,"note":"Quia repellat fugiat consectetur quidem.","noteable_type":"Issue","author_id":6,"created_at":"2016-06-14T15:02:49.631Z","updated_at":"2016-06-14T15:02:49.631Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":33,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ari Wintheiser"},"events":[]},{"id":414,"note":"Corporis ipsum et ea necessitatibus quod assumenda repudiandae quam.","noteable_type":"Issue","author_id":1,"created_at":"2016-06-14T15:02:49.659Z","updated_at":"2016-06-14T15:02:49.659Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":33,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"},"events":[]}]}
-{"id":32,"title":"Necessitatibus magnam qui at velit consequatur perspiciatis.","author_id":15,"project_id":5,"created_at":"2016-06-14T15:02:07.431Z","updated_at":"2016-06-14T15:02:49.884Z","position":0,"branch_name":null,"description":"Molestiae corporis magnam et fugit aliquid nulla quia.","state":"closed","iid":2,"updated_by_id":null,"confidential":false,"due_date":null,"moved_to_id":null,"notes":[{"id":415,"note":"Nemo consequatur sed blanditiis qui id iure dolores.","noteable_type":"Issue","author_id":26,"created_at":"2016-06-14T15:02:49.694Z","updated_at":"2016-06-14T15:02:49.694Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":32,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 4"},"events":[]},{"id":416,"note":"Voluptas ab accusantium dicta in.","noteable_type":"Issue","author_id":25,"created_at":"2016-06-14T15:02:49.718Z","updated_at":"2016-06-14T15:02:49.718Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":32,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 3"},"events":[]},{"id":417,"note":"Esse odit qui a et eum ducimus.","noteable_type":"Issue","author_id":22,"created_at":"2016-06-14T15:02:49.741Z","updated_at":"2016-06-14T15:02:49.741Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":32,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 0"},"events":[]},{"id":418,"note":"Sequi dolor doloribus ratione placeat repellendus.","noteable_type":"Issue","author_id":20,"created_at":"2016-06-14T15:02:49.767Z","updated_at":"2016-06-14T15:02:49.767Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":32,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ottis Schuster II"},"events":[]},{"id":419,"note":"Quae aspernatur rem est similique.","noteable_type":"Issue","author_id":16,"created_at":"2016-06-14T15:02:49.796Z","updated_at":"2016-06-14T15:02:49.796Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":32,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Rhett Emmerich IV"},"events":[]},{"id":420,"note":"Voluptate omnis et id rerum non nesciunt laudantium assumenda.","noteable_type":"Issue","author_id":15,"created_at":"2016-06-14T15:02:49.825Z","updated_at":"2016-06-14T15:02:49.825Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":32,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Burdette Bernier"},"events":[]},{"id":421,"note":"Quia enim ab et eligendi.","noteable_type":"Issue","author_id":6,"created_at":"2016-06-14T15:02:49.853Z","updated_at":"2016-06-14T15:02:49.853Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":32,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ari Wintheiser"},"events":[]},{"id":422,"note":"In fugiat rerum voluptas quas officia.","noteable_type":"Issue","author_id":1,"created_at":"2016-06-14T15:02:49.881Z","updated_at":"2016-06-14T15:02:49.881Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":32,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"},"events":[]}]}
+{"id":33,"title":"task by issue_type","issue_type":"task","author_id":26,"project_id":5,"created_at":"2016-06-14T15:02:07.611Z","updated_at":"2016-06-14T15:02:49.661Z","position":0,"branch_name":null,"description":"Non asperiores velit accusantium voluptate.","state":"closed","iid":3,"updated_by_id":null,"confidential":false,"due_date":null,"moved_to_id":null,"notes":[{"id":407,"note":"Quod ea et possimus architecto.","noteable_type":"Issue","author_id":26,"created_at":"2016-06-14T15:02:49.450Z","updated_at":"2016-06-14T15:02:49.450Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":33,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 4"},"events":[]},{"id":408,"note":"Reiciendis est et unde perferendis dicta ut praesentium quasi.","noteable_type":"Issue","author_id":25,"created_at":"2016-06-14T15:02:49.503Z","updated_at":"2016-06-14T15:02:49.503Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":33,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 3"},"events":[]},{"id":409,"note":"Magni quia odio blanditiis pariatur voluptas.","noteable_type":"Issue","author_id":22,"created_at":"2016-06-14T15:02:49.527Z","updated_at":"2016-06-14T15:02:49.527Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":33,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 0"},"events":[]},{"id":410,"note":"Enim quam ut et et et.","noteable_type":"Issue","author_id":20,"created_at":"2016-06-14T15:02:49.551Z","updated_at":"2016-06-14T15:02:49.551Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":33,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ottis Schuster II"},"events":[]},{"id":411,"note":"Fugit voluptatem ratione maxime expedita.","noteable_type":"Issue","author_id":16,"created_at":"2016-06-14T15:02:49.578Z","updated_at":"2016-06-14T15:02:49.578Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":33,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Rhett Emmerich IV"},"events":[]},{"id":412,"note":"Voluptatem enim aut ipsa et et ducimus.","noteable_type":"Issue","author_id":15,"created_at":"2016-06-14T15:02:49.604Z","updated_at":"2016-06-14T15:02:49.604Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":33,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Burdette Bernier"},"events":[]},{"id":413,"note":"Quia repellat fugiat consectetur quidem.","noteable_type":"Issue","author_id":6,"created_at":"2016-06-14T15:02:49.631Z","updated_at":"2016-06-14T15:02:49.631Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":33,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ari Wintheiser"},"events":[]},{"id":414,"note":"Corporis ipsum et ea necessitatibus quod assumenda repudiandae quam.","noteable_type":"Issue","author_id":1,"created_at":"2016-06-14T15:02:49.659Z","updated_at":"2016-06-14T15:02:49.659Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":33,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"},"events":[]}]}
+{"id":32,"title":"incident by work_item_type","work_item_type":{"base_type":"incident"},"author_id":15,"project_id":5,"created_at":"2016-06-14T15:02:07.431Z","updated_at":"2016-06-14T15:02:49.884Z","position":0,"branch_name":null,"description":"Molestiae corporis magnam et fugit aliquid nulla quia.","state":"closed","iid":2,"updated_by_id":null,"confidential":false,"due_date":null,"moved_to_id":null,"notes":[{"id":415,"note":"Nemo consequatur sed blanditiis qui id iure dolores.","noteable_type":"Issue","author_id":26,"created_at":"2016-06-14T15:02:49.694Z","updated_at":"2016-06-14T15:02:49.694Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":32,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 4"},"events":[]},{"id":416,"note":"Voluptas ab accusantium dicta in.","noteable_type":"Issue","author_id":25,"created_at":"2016-06-14T15:02:49.718Z","updated_at":"2016-06-14T15:02:49.718Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":32,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 3"},"events":[]},{"id":417,"note":"Esse odit qui a et eum ducimus.","noteable_type":"Issue","author_id":22,"created_at":"2016-06-14T15:02:49.741Z","updated_at":"2016-06-14T15:02:49.741Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":32,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 0"},"events":[]},{"id":418,"note":"Sequi dolor doloribus ratione placeat repellendus.","noteable_type":"Issue","author_id":20,"created_at":"2016-06-14T15:02:49.767Z","updated_at":"2016-06-14T15:02:49.767Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":32,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ottis Schuster II"},"events":[]},{"id":419,"note":"Quae aspernatur rem est similique.","noteable_type":"Issue","author_id":16,"created_at":"2016-06-14T15:02:49.796Z","updated_at":"2016-06-14T15:02:49.796Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":32,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Rhett Emmerich IV"},"events":[]},{"id":420,"note":"Voluptate omnis et id rerum non nesciunt laudantium assumenda.","noteable_type":"Issue","author_id":15,"created_at":"2016-06-14T15:02:49.825Z","updated_at":"2016-06-14T15:02:49.825Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":32,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Burdette Bernier"},"events":[]},{"id":421,"note":"Quia enim ab et eligendi.","noteable_type":"Issue","author_id":6,"created_at":"2016-06-14T15:02:49.853Z","updated_at":"2016-06-14T15:02:49.853Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":32,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ari Wintheiser"},"events":[]},{"id":422,"note":"In fugiat rerum voluptas quas officia.","noteable_type":"Issue","author_id":1,"created_at":"2016-06-14T15:02:49.881Z","updated_at":"2016-06-14T15:02:49.881Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":32,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"},"events":[]}]}
{"id":31,"title":"issue_with_timelogs","author_id":16,"project_id":5,"created_at":"2016-06-14T15:02:07.280Z","updated_at":"2016-06-14T15:02:50.134Z","position":0,"branch_name":null,"description":"Quod ad architecto qui est sed quia.","state":"closed","iid":1,"updated_by_id":null,"confidential":false,"due_date":null,"moved_to_id":null,"timelogs":[{"id":1,"time_spent":72000,"user_id":1,"created_at":"2019-12-27T09:15:22.302Z","updated_at":"2019-12-27T09:15:22.302Z","spent_at":"2019-12-27T00:00:00.000Z"}],"notes":[{"id":423,"note":"A mollitia qui iste consequatur eaque iure omnis sunt.","noteable_type":"Issue","author_id":26,"created_at":"2016-06-14T15:02:49.933Z","updated_at":"2016-06-14T15:02:49.933Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":31,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 4"},"events":[]},{"id":424,"note":"Eveniet est et blanditiis sequi alias.","noteable_type":"Issue","author_id":25,"created_at":"2016-06-14T15:02:49.965Z","updated_at":"2016-06-14T15:02:49.965Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":31,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 3"},"events":[]},{"id":425,"note":"Commodi tempore voluptas doloremque est.","noteable_type":"Issue","author_id":22,"created_at":"2016-06-14T15:02:49.996Z","updated_at":"2016-06-14T15:02:49.996Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":31,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 0"},"events":[]},{"id":426,"note":"Quo libero impedit odio debitis rerum aspernatur.","noteable_type":"Issue","author_id":20,"created_at":"2016-06-14T15:02:50.024Z","updated_at":"2016-06-14T15:02:50.024Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":31,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ottis Schuster II"},"events":[]},{"id":427,"note":"Dolorem voluptatem qui labore deserunt.","noteable_type":"Issue","author_id":16,"created_at":"2016-06-14T15:02:50.049Z","updated_at":"2016-06-14T15:02:50.049Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":31,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Rhett Emmerich IV"},"events":[]},{"id":428,"note":"Est blanditiis laboriosam enim ipsam.","noteable_type":"Issue","author_id":15,"created_at":"2016-06-14T15:02:50.077Z","updated_at":"2016-06-14T15:02:50.077Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":31,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Burdette Bernier"},"events":[]},{"id":429,"note":"Et in voluptatem animi dolorem eos.","noteable_type":"Issue","author_id":6,"created_at":"2016-06-14T15:02:50.107Z","updated_at":"2016-06-14T15:02:50.107Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":31,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ari Wintheiser"},"events":[]},{"id":430,"note":"Unde culpa voluptate qui sint quos.","noteable_type":"Issue","author_id":1,"created_at":"2016-06-14T15:02:50.132Z","updated_at":"2016-06-14T15:02:50.132Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":31,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"},"events":[]}]}
diff --git a/spec/fixtures/lib/gitlab/metrics/dashboard/schemas/metrics.json b/spec/fixtures/lib/gitlab/metrics/dashboard/schemas/metrics.json
index 8ee207b7ebf..79132c0d039 100644
--- a/spec/fixtures/lib/gitlab/metrics/dashboard/schemas/metrics.json
+++ b/spec/fixtures/lib/gitlab/metrics/dashboard/schemas/metrics.json
@@ -2,23 +2,57 @@
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"required": [
- "label",
- "prometheus_endpoint_path"
+ "label"
],
"oneOf": [
- { "required": ["query"] },
- { "required": ["query_range"] }
+ {
+ "required": [
+ "query"
+ ]
+ },
+ {
+ "required": [
+ "query_range"
+ ]
+ }
],
"properties": {
- "id": { "type": "string" },
- "query_range": { "type": ["string", "number"] },
- "query": { "type": ["string", "number"] },
- "unit": { "type": "string" },
- "label": { "type": "string" },
- "track": { "type": "string" },
- "prometheus_endpoint_path": { "type": "string" },
- "metric_id": { "type": "number" },
- "edit_path": { "type": ["string", "null"] }
+ "id": {
+ "type": "string"
+ },
+ "query_range": {
+ "type": [
+ "string",
+ "number"
+ ]
+ },
+ "query": {
+ "type": [
+ "string",
+ "number"
+ ]
+ },
+ "unit": {
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "track": {
+ "type": "string"
+ },
+ "prometheus_endpoint_path": {
+ "type": "string"
+ },
+ "metric_id": {
+ "type": "number"
+ },
+ "edit_path": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
},
"additionalProperties": false
}
diff --git a/spec/frontend/__helpers__/set_vue_error_handler.js b/spec/frontend/__helpers__/set_vue_error_handler.js
new file mode 100644
index 00000000000..d254630d1e4
--- /dev/null
+++ b/spec/frontend/__helpers__/set_vue_error_handler.js
@@ -0,0 +1,30 @@
+import Vue from 'vue';
+
+const modifiedInstances = [];
+
+export function setVueErrorHandler({ instance, handler }) {
+ if (Vue.version.startsWith('2')) {
+ // only global handlers are supported
+ const { config } = Vue;
+ config.errorHandler = handler;
+ return;
+ }
+
+ // eslint-disable-next-line no-param-reassign
+ instance.$.appContext.config.errorHandler = handler;
+ modifiedInstances.push(instance);
+}
+
+export function resetVueErrorHandler() {
+ if (Vue.version.startsWith('2')) {
+ const { config } = Vue;
+ config.errorHandler = null;
+ return;
+ }
+
+ modifiedInstances.forEach((instance) => {
+ // eslint-disable-next-line no-param-reassign
+ instance.$.appContext.config.errorHandler = null;
+ });
+ modifiedInstances.length = 0;
+}
diff --git a/spec/frontend/access_tokens/components/tokens_app_spec.js b/spec/frontend/access_tokens/components/tokens_app_spec.js
index 6e7dee6a2cc..59cc8e25414 100644
--- a/spec/frontend/access_tokens/components/tokens_app_spec.js
+++ b/spec/frontend/access_tokens/components/tokens_app_spec.js
@@ -43,8 +43,8 @@ describe('TokensApp', () => {
}) => {
const container = extendedWrapper(wrapper.findByTestId(testId));
- expect(container.findByText(expectedLabel, { selector: 'h4' }).exists()).toBe(true);
- expect(container.findByText(expectedDescription).exists()).toBe(true);
+ expect(container.findByText(expectedLabel).exists()).toBe(true);
+ expect(container.findByText(expectedDescription, { exact: false }).exists()).toBe(true);
expect(container.findByText(expectedInputDescription, { exact: false }).exists()).toBe(true);
expect(container.findByText('reset this token').attributes()).toMatchObject({
'data-confirm': expectedResetConfirmMessage,
diff --git a/spec/frontend/actioncable_connection_monitor_spec.js b/spec/frontend/actioncable_connection_monitor_spec.js
deleted file mode 100644
index c68eb53acde..00000000000
--- a/spec/frontend/actioncable_connection_monitor_spec.js
+++ /dev/null
@@ -1,79 +0,0 @@
-import ConnectionMonitor from '~/actioncable_connection_monitor';
-
-describe('ConnectionMonitor', () => {
- let monitor;
-
- beforeEach(() => {
- monitor = new ConnectionMonitor({});
- });
-
- describe('#getPollInterval', () => {
- beforeEach(() => {
- Math.originalRandom = Math.random;
- });
- afterEach(() => {
- Math.random = Math.originalRandom;
- });
-
- const { staleThreshold, reconnectionBackoffRate } = ConnectionMonitor;
- const backoffFactor = 1 + reconnectionBackoffRate;
- const ms = 1000;
-
- it('uses exponential backoff', () => {
- Math.random = () => 0;
-
- monitor.reconnectAttempts = 0;
- expect(monitor.getPollInterval()).toEqual(staleThreshold * ms);
-
- monitor.reconnectAttempts = 1;
- expect(monitor.getPollInterval()).toEqual(staleThreshold * backoffFactor * ms);
-
- monitor.reconnectAttempts = 2;
- expect(monitor.getPollInterval()).toEqual(
- staleThreshold * backoffFactor * backoffFactor * ms,
- );
- });
-
- it('caps exponential backoff after some number of reconnection attempts', () => {
- Math.random = () => 0;
- monitor.reconnectAttempts = 42;
- const cappedPollInterval = monitor.getPollInterval();
-
- monitor.reconnectAttempts = 9001;
- expect(monitor.getPollInterval()).toEqual(cappedPollInterval);
- });
-
- it('uses 100% jitter when 0 reconnection attempts', () => {
- Math.random = () => 0;
- expect(monitor.getPollInterval()).toEqual(staleThreshold * ms);
-
- Math.random = () => 0.5;
- expect(monitor.getPollInterval()).toEqual(staleThreshold * 1.5 * ms);
- });
-
- it('uses reconnectionBackoffRate for jitter when >0 reconnection attempts', () => {
- monitor.reconnectAttempts = 1;
-
- Math.random = () => 0.25;
- expect(monitor.getPollInterval()).toEqual(
- staleThreshold * backoffFactor * (1 + reconnectionBackoffRate * 0.25) * ms,
- );
-
- Math.random = () => 0.5;
- expect(monitor.getPollInterval()).toEqual(
- staleThreshold * backoffFactor * (1 + reconnectionBackoffRate * 0.5) * ms,
- );
- });
-
- it('applies jitter after capped exponential backoff', () => {
- monitor.reconnectAttempts = 9001;
-
- Math.random = () => 0;
- const withoutJitter = monitor.getPollInterval();
- Math.random = () => 0.5;
- const withJitter = monitor.getPollInterval();
-
- expect(withJitter).toBeGreaterThan(withoutJitter);
- });
- });
-});
diff --git a/spec/frontend/add_context_commits_modal/components/add_context_commits_modal_spec.js b/spec/frontend/add_context_commits_modal/components/add_context_commits_modal_spec.js
index 27fe010c354..fa051f7a43a 100644
--- a/spec/frontend/add_context_commits_modal/components/add_context_commits_modal_spec.js
+++ b/spec/frontend/add_context_commits_modal/components/add_context_commits_modal_spec.js
@@ -45,14 +45,13 @@ describe('AddContextCommitsModal', () => {
...props,
},
});
- return wrapper;
};
const findModal = () => wrapper.findComponent(GlModal);
const findSearch = () => wrapper.findComponent(GlFilteredSearch);
beforeEach(() => {
- wrapper = createWrapper();
+ createWrapper();
});
it('renders modal with 2 tabs', () => {
@@ -98,7 +97,7 @@ describe('AddContextCommitsModal', () => {
});
it('enabled ok button when atleast one row is selected', async () => {
- wrapper.vm.$store.state.selectedCommits = [{ ...commit, isSelected: true }];
+ store.state.selectedCommits = [{ ...commit, isSelected: true }];
await nextTick();
expect(findModal().attributes('ok-disabled')).toBe(undefined);
});
@@ -106,14 +105,14 @@ describe('AddContextCommitsModal', () => {
describe('when in second tab, renders a modal with', () => {
beforeEach(() => {
- wrapper.vm.$store.state.tabIndex = 1;
+ store.state.tabIndex = 1;
});
it('a disabled ok button when no row is selected', () => {
expect(findModal().attributes('ok-disabled')).toBe('true');
});
it('an enabled ok button when atleast one row is selected', async () => {
- wrapper.vm.$store.state.selectedCommits = [{ ...commit, isSelected: true }];
+ store.state.selectedCommits = [{ ...commit, isSelected: true }];
await nextTick();
expect(findModal().attributes('ok-disabled')).toBe(undefined);
});
@@ -126,7 +125,7 @@ describe('AddContextCommitsModal', () => {
describe('has an ok button when clicked calls action', () => {
it('"createContextCommits" when only new commits to be added', async () => {
- wrapper.vm.$store.state.selectedCommits = [{ ...commit, isSelected: true }];
+ store.state.selectedCommits = [{ ...commit, isSelected: true }];
findModal().vm.$emit('ok');
await nextTick();
expect(createContextCommits).toHaveBeenCalledWith(expect.anything(), {
@@ -135,14 +134,14 @@ describe('AddContextCommitsModal', () => {
});
});
it('"removeContextCommits" when only added commits are to be removed', async () => {
- wrapper.vm.$store.state.toRemoveCommits = [commit.short_id];
+ store.state.toRemoveCommits = [commit.short_id];
findModal().vm.$emit('ok');
await nextTick();
expect(removeContextCommits).toHaveBeenCalledWith(expect.anything(), true);
});
it('"createContextCommits" and "removeContextCommits" when new commits are to be added and old commits are to be removed', async () => {
- wrapper.vm.$store.state.selectedCommits = [{ ...commit, isSelected: true }];
- wrapper.vm.$store.state.toRemoveCommits = [commit.short_id];
+ store.state.selectedCommits = [{ ...commit, isSelected: true }];
+ store.state.toRemoveCommits = [commit.short_id];
findModal().vm.$emit('ok');
await nextTick();
expect(createContextCommits).toHaveBeenCalledWith(expect.anything(), {
diff --git a/spec/frontend/admin/abuse_reports/components/abuse_category_spec.js b/spec/frontend/admin/abuse_reports/components/abuse_category_spec.js
new file mode 100644
index 00000000000..456df3b1857
--- /dev/null
+++ b/spec/frontend/admin/abuse_reports/components/abuse_category_spec.js
@@ -0,0 +1,43 @@
+import { GlLabel } from '@gitlab/ui';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import AbuseCategory from '~/admin/abuse_reports/components/abuse_category.vue';
+import { ABUSE_CATEGORIES } from '~/admin/abuse_reports/constants';
+import { mockAbuseReports } from '../mock_data';
+
+describe('AbuseCategory', () => {
+ let wrapper;
+
+ const mockAbuseReport = mockAbuseReports[0];
+ const category = ABUSE_CATEGORIES[mockAbuseReport.category];
+
+ const findLabel = () => wrapper.findComponent(GlLabel);
+
+ const createComponent = (props = {}) => {
+ wrapper = shallowMountExtended(AbuseCategory, {
+ propsData: {
+ category: mockAbuseReport.category,
+ ...props,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders a label', () => {
+ expect(findLabel().exists()).toBe(true);
+ });
+
+ it('renders the label with the right background color for the category', () => {
+ expect(findLabel().props()).toMatchObject({
+ backgroundColor: category.backgroundColor,
+ title: category.title,
+ target: null,
+ });
+ });
+
+ it('renders the label with the right text color for the category', () => {
+ expect(findLabel().attributes('class')).toBe(`gl-text-${category.color}`);
+ });
+});
diff --git a/spec/frontend/admin/abuse_reports/components/abuse_report_row_spec.js b/spec/frontend/admin/abuse_reports/components/abuse_report_row_spec.js
index f3cced81478..03bf510f3ad 100644
--- a/spec/frontend/admin/abuse_reports/components/abuse_report_row_spec.js
+++ b/spec/frontend/admin/abuse_reports/components/abuse_report_row_spec.js
@@ -1,6 +1,7 @@
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import setWindowLocation from 'helpers/set_window_location_helper';
import AbuseReportRow from '~/admin/abuse_reports/components/abuse_report_row.vue';
+import AbuseCategory from '~/admin/abuse_reports/components/abuse_category.vue';
import ListItem from '~/vue_shared/components/registry/list_item.vue';
import { getTimeago } from '~/lib/utils/datetime_utility';
import { SORT_UPDATED_AT } from '~/admin/abuse_reports/constants';
@@ -11,7 +12,8 @@ describe('AbuseReportRow', () => {
const mockAbuseReport = mockAbuseReports[0];
const findListItem = () => wrapper.findComponent(ListItem);
- const findTitle = () => wrapper.findByTestId('title');
+ const findAbuseCategory = () => wrapper.findComponent(AbuseCategory);
+ const findAbuseReportTitle = () => wrapper.findByTestId('abuse-report-title');
const findDisplayedDate = () => wrapper.findByTestId('abuse-report-date');
const createComponent = (props = {}) => {
@@ -35,13 +37,13 @@ describe('AbuseReportRow', () => {
const { reporter, reportedUser, category, reportPath } = mockAbuseReport;
it('displays correctly formatted title', () => {
- expect(findTitle().text()).toMatchInterpolatedText(
+ expect(findAbuseReportTitle().text()).toMatchInterpolatedText(
`${reportedUser.name} reported for ${category} by ${reporter.name}`,
);
});
it('links to the details page', () => {
- expect(findTitle().attributes('href')).toEqual(reportPath);
+ expect(findAbuseReportTitle().attributes('href')).toEqual(reportPath);
});
describe('when the reportedUser is missing', () => {
@@ -50,7 +52,7 @@ describe('AbuseReportRow', () => {
});
it('displays correctly formatted title', () => {
- expect(findTitle().text()).toMatchInterpolatedText(
+ expect(findAbuseReportTitle().text()).toMatchInterpolatedText(
`Deleted user reported for ${category} by ${reporter.name}`,
);
});
@@ -62,7 +64,7 @@ describe('AbuseReportRow', () => {
});
it('displays correctly formatted title', () => {
- expect(findTitle().text()).toMatchInterpolatedText(
+ expect(findAbuseReportTitle().text()).toMatchInterpolatedText(
`${reportedUser.name} reported for ${category} by Deleted user`,
);
});
@@ -88,4 +90,8 @@ describe('AbuseReportRow', () => {
});
});
});
+
+ it('renders abuse category', () => {
+ expect(findAbuseCategory().exists()).toBe(true);
+ });
});
diff --git a/spec/frontend/admin/applications/components/delete_application_spec.js b/spec/frontend/admin/applications/components/delete_application_spec.js
index 315c38a2bbc..e0282b8c149 100644
--- a/spec/frontend/admin/applications/components/delete_application_spec.js
+++ b/spec/frontend/admin/applications/components/delete_application_spec.js
@@ -1,6 +1,7 @@
import { GlModal, GlSprintf } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
+import { stubComponent } from 'helpers/stub_component';
import DeleteApplication from '~/admin/applications/components/delete_application.vue';
const path = 'application/path/1';
@@ -14,6 +15,11 @@ describe('DeleteApplication', () => {
const createComponent = () => {
wrapper = shallowMount(DeleteApplication, {
stubs: {
+ GlModal: stubComponent(GlModal, {
+ methods: {
+ show: jest.fn(),
+ },
+ }),
GlSprintf,
},
});
@@ -36,7 +42,6 @@ describe('DeleteApplication', () => {
describe('the modal component', () => {
beforeEach(() => {
- wrapper.vm.$refs.deleteModal.show = jest.fn();
document.querySelector('.js-application-delete-button').click();
});
diff --git a/spec/frontend/admin/broadcast_messages/components/message_form_spec.js b/spec/frontend/admin/broadcast_messages/components/message_form_spec.js
index dca77e67cac..b937a58a742 100644
--- a/spec/frontend/admin/broadcast_messages/components/message_form_spec.js
+++ b/spec/frontend/admin/broadcast_messages/components/message_form_spec.js
@@ -5,7 +5,12 @@ import { createAlert } from '~/alert';
import axios from '~/lib/utils/axios_utils';
import { HTTP_STATUS_BAD_REQUEST } from '~/lib/utils/http_status';
import MessageForm from '~/admin/broadcast_messages/components/message_form.vue';
-import { TYPE_BANNER, TYPE_NOTIFICATION, THEMES } from '~/admin/broadcast_messages/constants';
+import {
+ TYPE_BANNER,
+ TYPE_NOTIFICATION,
+ THEMES,
+ TARGET_OPTIONS,
+} from '~/admin/broadcast_messages/constants';
import waitForPromises from 'helpers/wait_for_promises';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import { MOCK_TARGET_ACCESS_LEVELS } from '../mock_data';
@@ -37,6 +42,8 @@ describe('MessageForm', () => {
const findCancelButton = () => wrapper.findComponent('[data-testid=cancel-button]');
const findForm = () => wrapper.findComponent(GlForm);
const findShowInCli = () => wrapper.findComponent('[data-testid=show-in-cli-checkbox]');
+ const findTargetSelect = () => wrapper.findComponent('[data-testid=target-select]');
+ const findTargetPath = () => wrapper.findComponent('[data-testid=target-path-input]');
function createComponent({ broadcastMessage = {} } = {}) {
wrapper = mount(MessageForm, {
@@ -112,10 +119,38 @@ describe('MessageForm', () => {
});
});
- describe('target roles checkboxes', () => {
- it('renders target roles', () => {
+ describe('target select', () => {
+ it('renders the first option and hide target path and target roles when creating message', () => {
createComponent();
- expect(findTargetRoles().exists()).toBe(true);
+ expect(findTargetSelect().element.value).toBe(TARGET_OPTIONS[0].value);
+ expect(findTargetRoles().isVisible()).toBe(false);
+ expect(findTargetPath().isVisible()).toBe(false);
+ });
+
+ it('triggers displaying target path and target roles when selecting different options', async () => {
+ createComponent();
+ const options = findTargetSelect().findAll('option');
+ await options.at(1).setSelected();
+ expect(findTargetPath().isVisible()).toBe(true);
+ expect(findTargetRoles().isVisible()).toBe(false);
+
+ await options.at(2).setSelected();
+ expect(findTargetPath().isVisible()).toBe(true);
+ expect(findTargetRoles().isVisible()).toBe(true);
+ });
+
+ it('renders the second option and hide target roles when editing message with path specified', () => {
+ createComponent({ broadcastMessage: { targetPath: '/welcome' } });
+ expect(findTargetSelect().element.value).toBe(TARGET_OPTIONS[1].value);
+ expect(findTargetRoles().isVisible()).toBe(false);
+ expect(findTargetPath().isVisible()).toBe(true);
+ });
+
+ it('renders the third option when editing message with path and roles specified', () => {
+ createComponent({ broadcastMessage: { targetPath: '/welcome', targetAccessLevels: [20] } });
+ expect(findTargetSelect().element.value).toBe(TARGET_OPTIONS[2].value);
+ expect(findTargetRoles().isVisible()).toBe(true);
+ expect(findTargetPath().isVisible()).toBe(true);
});
});
diff --git a/spec/frontend/admin/topics/components/remove_avatar_spec.js b/spec/frontend/admin/topics/components/remove_avatar_spec.js
index c069203d046..705066c3ef0 100644
--- a/spec/frontend/admin/topics/components/remove_avatar_spec.js
+++ b/spec/frontend/admin/topics/components/remove_avatar_spec.js
@@ -73,7 +73,7 @@ describe('RemoveAvatar', () => {
let formSubmitSpy;
beforeEach(() => {
- formSubmitSpy = jest.spyOn(wrapper.vm.$refs.deleteForm, 'submit');
+ formSubmitSpy = jest.spyOn(findForm().element, 'submit');
findModal().vm.$emit('primary');
});
diff --git a/spec/frontend/admin/topics/components/topic_select_spec.js b/spec/frontend/admin/topics/components/topic_select_spec.js
index 113a0e3d404..5b7e6365606 100644
--- a/spec/frontend/admin/topics/components/topic_select_spec.js
+++ b/spec/frontend/admin/topics/components/topic_select_spec.js
@@ -58,10 +58,6 @@ describe('TopicSelect', () => {
});
}
- afterEach(() => {
- jest.clearAllMocks();
- });
-
it('mounts', () => {
createComponent();
diff --git a/spec/frontend/alert_management/components/alert_management_table_spec.js b/spec/frontend/alert_management/components/alert_management_table_spec.js
index afd88e1a6ac..9980843defb 100644
--- a/spec/frontend/alert_management/components/alert_management_table_spec.js
+++ b/spec/frontend/alert_management/components/alert_management_table_spec.js
@@ -186,7 +186,7 @@ describe('AlertManagementTable', () => {
expect(findSeverityFields().at(0).text()).toBe('Critical');
});
- it('renders Unassigned when no assignee(s) present', () => {
+ it('renders Unassigned when no assignees present', () => {
mountComponent({
data: { alerts: { list: mockAlerts }, alertsCount, errored: false },
loading: false,
diff --git a/spec/frontend/alerts_settings/components/alerts_settings_form_spec.js b/spec/frontend/alerts_settings/components/alerts_settings_form_spec.js
index 4a0c7f65493..e6b38a1e824 100644
--- a/spec/frontend/alerts_settings/components/alerts_settings_form_spec.js
+++ b/spec/frontend/alerts_settings/components/alerts_settings_form_spec.js
@@ -68,8 +68,11 @@ describe('AlertsSettingsForm', () => {
await options.at(index).setSelected();
};
- const enableIntegration = (index, value) => {
- findFormFields().at(index).setValue(value);
+ const enableIntegration = (index, value = '') => {
+ if (value !== '') {
+ findFormFields().at(index).setValue(value);
+ }
+
findFormToggle().vm.$emit('change', true);
};
@@ -100,7 +103,8 @@ describe('AlertsSettingsForm', () => {
it('hides the name input when the selected value is prometheus', async () => {
createComponent();
await selectOptionAtIndex(2);
- expect(findFormFields().at(0).attributes('id')).not.toBe('name-integration');
+
+ expect(findFormFields()).toHaveLength(0);
});
it('verify pricing link url', () => {
@@ -203,8 +207,8 @@ describe('AlertsSettingsForm', () => {
it('create', async () => {
createComponent();
await selectOptionAtIndex(2);
- const apiUrl = 'https://test.com';
- enableIntegration(0, apiUrl);
+ enableIntegration(0);
+
const submitBtn = findSubmitButton();
expect(submitBtn.exists()).toBe(true);
expect(submitBtn.text()).toBe('Save integration');
@@ -213,14 +217,14 @@ describe('AlertsSettingsForm', () => {
expect(wrapper.emitted('create-new-integration')[0][0]).toMatchObject({
type: typeSet.prometheus,
- variables: { apiUrl, active: true },
+ variables: { active: true },
});
});
it('update', () => {
createComponent({
data: {
- integrationForm: { id: '1', apiUrl: 'https://test-pre.com', type: typeSet.prometheus },
+ integrationForm: { id: '1', type: typeSet.prometheus },
currentIntegration: { id: '1' },
},
props: {
@@ -228,8 +232,7 @@ describe('AlertsSettingsForm', () => {
},
});
- const apiUrl = 'https://test-post.com';
- enableIntegration(0, apiUrl);
+ enableIntegration(0);
const submitBtn = findSubmitButton();
expect(submitBtn.exists()).toBe(true);
@@ -239,7 +242,7 @@ describe('AlertsSettingsForm', () => {
expect(wrapper.emitted('update-integration')[0][0]).toMatchObject({
type: typeSet.prometheus,
- variables: { apiUrl, active: true },
+ variables: { active: true },
});
});
});
@@ -442,16 +445,8 @@ describe('AlertsSettingsForm', () => {
expect(findSubmitButton().attributes('disabled')).toBe(undefined);
});
- it('should not be able to submit when Prometheus integration form is invalid', async () => {
- await selectOptionAtIndex(2);
- await findFormFields().at(0).vm.$emit('input', '');
-
- expect(findSubmitButton().attributes('disabled')).toBeDefined();
- });
-
it('should be able to submit when Prometheus integration form is valid', async () => {
await selectOptionAtIndex(2);
- await findFormFields().at(0).vm.$emit('input', 'http://valid.url');
expect(findSubmitButton().attributes('disabled')).toBe(undefined);
});
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 4e0b546b3d2..802da47d6cd 100644
--- a/spec/frontend/analytics/shared/components/projects_dropdown_filter_spec.js
+++ b/spec/frontend/analytics/shared/components/projects_dropdown_filter_spec.js
@@ -57,7 +57,6 @@ describe('ProjectsDropdownFilter component', () => {
});
};
- const findClearAllButton = () => wrapper.findByTestId('listbox-reset-button');
const findSelectedProjectsLabel = () => wrapper.findComponent(GlTruncate);
const findDropdown = () => wrapper.findComponent(GlCollapsibleListbox);
@@ -143,10 +142,6 @@ describe('ProjectsDropdownFilter component', () => {
expect(findSelectedProjectsLabel().text()).toBe('Select projects');
});
-
- it('does not render the clear all button', () => {
- expect(findClearAllButton().exists()).toBe(false);
- });
});
describe('with a selected project', () => {
@@ -169,12 +164,6 @@ describe('ProjectsDropdownFilter component', () => {
expect(findSelectedProjectsLabel().text()).toBe(projects[0].name);
});
- it('renders the clear all button', async () => {
- await selectDropdownItemAtIndex([0], false);
-
- expect(findClearAllButton().exists()).toBe(true);
- });
-
it('clears all selected items when the clear all button is clicked', async () => {
createComponent({
mountFn: mountExtended,
@@ -186,7 +175,7 @@ describe('ProjectsDropdownFilter component', () => {
expect(findSelectedProjectsLabel().text()).toBe('2 projects selected');
- await findClearAllButton().vm.$emit('click');
+ await findDropdown().vm.$emit('reset');
expect(findSelectedProjectsLabel().text()).toBe('Select projects');
});
diff --git a/spec/frontend/analytics/usage_trends/components/users_chart_spec.js b/spec/frontend/analytics/usage_trends/components/users_chart_spec.js
index 20836d7cc70..8638d82ae3c 100644
--- a/spec/frontend/analytics/usage_trends/components/users_chart_spec.js
+++ b/spec/frontend/analytics/usage_trends/components/users_chart_spec.js
@@ -22,23 +22,19 @@ describe('UsersChart', () => {
let queryHandler;
const createComponent = ({
- loadingError = false,
- loading = false,
users = [],
additionalData = [],
+ handler = mockQueryResponse({ key: 'users', data: users, additionalData }),
} = {}) => {
- queryHandler = mockQueryResponse({ key: 'users', data: users, loading, additionalData });
+ queryHandler = handler;
- return shallowMount(UsersChart, {
+ wrapper = shallowMount(UsersChart, {
+ apolloProvider: createMockApollo([[usersQuery, queryHandler]]),
props: {
startDate: new Date(2020, 9, 26),
endDate: new Date(2020, 10, 1),
totalDataPoints: mockCountsData2.length,
},
- apolloProvider: createMockApollo([[usersQuery, queryHandler]]),
- data() {
- return { loadingError };
- },
});
};
@@ -48,7 +44,7 @@ describe('UsersChart', () => {
describe('while loading', () => {
beforeEach(() => {
- wrapper = createComponent({ loading: true });
+ createComponent({ loading: true });
});
it('displays the skeleton loader', () => {
@@ -62,7 +58,7 @@ describe('UsersChart', () => {
describe('without data', () => {
beforeEach(async () => {
- wrapper = createComponent({ users: [] });
+ createComponent({ users: [] });
await nextTick();
});
@@ -81,7 +77,7 @@ describe('UsersChart', () => {
describe('with data', () => {
beforeEach(async () => {
- wrapper = createComponent({ users: mockCountsData2 });
+ createComponent({ users: mockCountsData2 });
await waitForPromises();
});
@@ -102,11 +98,17 @@ describe('UsersChart', () => {
describe('with errors', () => {
beforeEach(async () => {
- wrapper = createComponent({ loadingError: true });
+ createComponent();
await nextTick();
});
- it('renders an error message', () => {
+ it('renders an error message', async () => {
+ createComponent({
+ handler: jest.fn().mockRejectedValue({}),
+ });
+
+ await waitForPromises();
+
expect(findAlert().text()).toBe(
'Could not load the user chart. Please refresh the page to try again.',
);
@@ -124,42 +126,37 @@ describe('UsersChart', () => {
describe('when fetching more data', () => {
describe('when the fetchMore query returns data', () => {
beforeEach(async () => {
- wrapper = createComponent({
+ createComponent({
users: mockCountsData2,
additionalData: mockCountsData1,
});
- jest.spyOn(wrapper.vm.$apollo.queries.users, 'fetchMore');
await nextTick();
});
it('requests data twice', () => {
expect(queryHandler).toHaveBeenCalledTimes(2);
});
-
- it('calls fetchMore', () => {
- expect(wrapper.vm.$apollo.queries.users.fetchMore).toHaveBeenCalledTimes(1);
- });
});
describe('when the fetchMore query throws an error', () => {
beforeEach(async () => {
- wrapper = createComponent({
+ createComponent({
users: mockCountsData2,
additionalData: mockCountsData1,
});
- jest
- .spyOn(wrapper.vm.$apollo.queries.users, 'fetchMore')
- .mockImplementation(jest.fn().mockRejectedValue());
await waitForPromises();
});
it('calls fetchMore', () => {
- expect(wrapper.vm.$apollo.queries.users.fetchMore).toHaveBeenCalledTimes(1);
+ expect(queryHandler).toHaveBeenCalledTimes(2);
});
- it('renders an error message', () => {
+ it('renders an error message', async () => {
+ createComponent({ handler: jest.fn().mockRejectedValue({}) });
+ await waitForPromises();
+
expect(findAlert().text()).toBe(
'Could not load the user chart. Please refresh the page to try again.',
);
diff --git a/spec/frontend/api/user_api_spec.js b/spec/frontend/api/user_api_spec.js
index b2ecfeb8394..a6e08e1cf4b 100644
--- a/spec/frontend/api/user_api_spec.js
+++ b/spec/frontend/api/user_api_spec.js
@@ -2,6 +2,7 @@ import MockAdapter from 'axios-mock-adapter';
import projects from 'test_fixtures/api/users/projects/get.json';
import followers from 'test_fixtures/api/users/followers/get.json';
+import following from 'test_fixtures/api/users/following/get.json';
import {
followUser,
unfollowUser,
@@ -9,6 +10,7 @@ import {
updateUserStatus,
getUserProjects,
getUserFollowers,
+ getUserFollowing,
} from '~/api/user_api';
import axios from '~/lib/utils/axios_utils';
import { HTTP_STATUS_OK } from '~/lib/utils/http_status';
@@ -131,4 +133,23 @@ describe('~/api/user_api', () => {
expect(axiosMock.history.get[0].params).toEqual({ ...params, per_page: DEFAULT_PER_PAGE });
});
});
+
+ describe('getUserFollowing', () => {
+ it('calls correct URL and returns expected response', async () => {
+ const MOCK_USER_ID = 1;
+ const MOCK_PAGE = 2;
+
+ const expectedUrl = `/api/v4/users/${MOCK_USER_ID}/following`;
+ const expectedResponse = { data: following };
+ const params = { page: MOCK_PAGE };
+
+ axiosMock.onGet(expectedUrl).replyOnce(HTTP_STATUS_OK, expectedResponse);
+
+ await expect(getUserFollowing(MOCK_USER_ID, params)).resolves.toEqual(
+ expect.objectContaining({ data: expectedResponse }),
+ );
+ expect(axiosMock.history.get[0].url).toBe(expectedUrl);
+ expect(axiosMock.history.get[0].params).toEqual({ ...params, per_page: DEFAULT_PER_PAGE });
+ });
+ });
});
diff --git a/spec/frontend/batch_comments/components/draft_note_spec.js b/spec/frontend/batch_comments/components/draft_note_spec.js
index 159e36c1364..b6042b4aa81 100644
--- a/spec/frontend/batch_comments/components/draft_note_spec.js
+++ b/spec/frontend/batch_comments/components/draft_note_spec.js
@@ -41,9 +41,11 @@ describe('Batch comments draft note component', () => {
},
});
- jest.spyOn(wrapper.vm.$store, 'dispatch').mockImplementation();
+ jest.spyOn(store, 'dispatch').mockImplementation();
};
+ const findNoteableNote = () => wrapper.findComponent(NoteableNote);
+
beforeEach(() => {
store = createStore();
draft = createDraft();
@@ -53,32 +55,28 @@ describe('Batch comments draft note component', () => {
createComponent();
expect(wrapper.findComponent(GlBadge).exists()).toBe(true);
- const note = wrapper.findComponent(NoteableNote);
-
- expect(note.exists()).toBe(true);
- expect(note.props().note).toEqual(draft);
+ expect(findNoteableNote().exists()).toBe(true);
+ expect(findNoteableNote().props('note')).toEqual(draft);
});
describe('update', () => {
it('dispatches updateDraft', async () => {
createComponent();
- const note = wrapper.findComponent(NoteableNote);
-
- note.vm.$emit('handleEdit');
+ findNoteableNote().vm.$emit('handleEdit');
await nextTick();
const formData = {
note: draft,
noteText: 'a',
resolveDiscussion: false,
+ callback: jest.fn(),
+ parentElement: wrapper.vm.$el,
+ errorCallback: jest.fn(),
};
- note.vm.$emit('handleUpdateNote', formData);
+ findNoteableNote().vm.$emit('handleUpdateNote', formData);
- expect(wrapper.vm.$store.dispatch).toHaveBeenCalledWith(
- 'batchComments/updateDraft',
- formData,
- );
+ expect(store.dispatch).toHaveBeenCalledWith('batchComments/updateDraft', formData);
});
});
@@ -87,18 +85,15 @@ describe('Batch comments draft note component', () => {
createComponent();
jest.spyOn(window, 'confirm').mockImplementation(() => true);
- const note = wrapper.findComponent(NoteableNote);
-
- note.vm.$emit('handleDeleteNote', draft);
+ findNoteableNote().vm.$emit('handleDeleteNote', draft);
- expect(wrapper.vm.$store.dispatch).toHaveBeenCalledWith('batchComments/deleteDraft', draft);
+ expect(store.dispatch).toHaveBeenCalledWith('batchComments/deleteDraft', draft);
});
});
describe('quick actions', () => {
it('renders referenced commands', async () => {
- createComponent();
- wrapper.setProps({
+ createComponent({
draft: {
...draft,
references: {
@@ -116,22 +111,27 @@ describe('Batch comments draft note component', () => {
});
describe('multiline comments', () => {
- describe.each`
- desc | props | event | expectedCalls
- ${'with `draft.position`'} | ${draftWithLineRange} | ${'mouseenter'} | ${[['setSelectedCommentPositionHover', LINE_RANGE]]}
- ${'with `draft.position`'} | ${draftWithLineRange} | ${'mouseleave'} | ${[['setSelectedCommentPositionHover']]}
- ${'without `draft.position`'} | ${{}} | ${'mouseenter'} | ${[]}
- ${'without `draft.position`'} | ${{}} | ${'mouseleave'} | ${[]}
- `('$desc', ({ props, event, expectedCalls }) => {
- beforeEach(() => {
- createComponent({ draft: { ...draft, ...props } });
- jest.spyOn(store, 'dispatch');
- });
+ it(`calls store with draft.position with mouseenter`, () => {
+ createComponent({ draft: { ...draft, ...draftWithLineRange } });
+ findNoteableNote().trigger('mouseenter');
- it(`calls store ${expectedCalls.length} times on ${event}`, () => {
- wrapper.element.dispatchEvent(new MouseEvent(event, { bubbles: true }));
- expect(store.dispatch.mock.calls).toEqual(expectedCalls);
- });
+ expect(store.dispatch).toHaveBeenCalledWith('setSelectedCommentPositionHover', LINE_RANGE);
+ });
+
+ it(`calls store with draft.position and mouseleave`, () => {
+ createComponent({ draft: { ...draft, ...draftWithLineRange } });
+ findNoteableNote().trigger('mouseleave');
+
+ expect(store.dispatch).toHaveBeenCalledWith('setSelectedCommentPositionHover');
+ });
+
+ it(`does not call store without draft position`, () => {
+ createComponent({ draft });
+
+ findNoteableNote().trigger('mouseenter');
+ findNoteableNote().trigger('mouseleave');
+
+ expect(store.dispatch).not.toHaveBeenCalled();
});
});
});
diff --git a/spec/frontend/batch_comments/components/submit_dropdown_spec.js b/spec/frontend/batch_comments/components/submit_dropdown_spec.js
index 5c33df882bf..7e2ff7f786f 100644
--- a/spec/frontend/batch_comments/components/submit_dropdown_spec.js
+++ b/spec/frontend/batch_comments/components/submit_dropdown_spec.js
@@ -3,6 +3,7 @@ import Vue from 'vue';
import Vuex from 'vuex';
import { mountExtended } from 'helpers/vue_test_utils_helper';
import SubmitDropdown from '~/batch_comments/components/submit_dropdown.vue';
+import { mockTracking } from 'helpers/tracking_helper';
jest.mock('~/autosave');
@@ -10,9 +11,11 @@ Vue.use(Vuex);
let wrapper;
let publishReview;
+let trackingSpy;
function factory({ canApprove = true, shouldAnimateReviewButton = false } = {}) {
publishReview = jest.fn();
+ trackingSpy = mockTracking(undefined, null, jest.spyOn);
const store = new Vuex.Store({
getters: {
@@ -69,6 +72,20 @@ describe('Batch comments submit dropdown', () => {
});
});
+ it('tracks submit action', () => {
+ factory();
+
+ findCommentTextarea().setValue('Hello world');
+
+ findForm().vm.$emit('submit', { preventDefault: jest.fn() });
+
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'editor_type_used', {
+ context: 'MergeRequest_review',
+ editorType: 'editor_type_plain_text_editor',
+ label: 'editor_tracking',
+ });
+ });
+
it('switches to the overview tab after submit', async () => {
window.mrTabs = { tabShown: jest.fn() };
diff --git a/spec/frontend/batch_comments/stores/modules/batch_comments/actions_spec.js b/spec/frontend/batch_comments/stores/modules/batch_comments/actions_spec.js
index 521bbf06b02..824b2a296c6 100644
--- a/spec/frontend/batch_comments/stores/modules/batch_comments/actions_spec.js
+++ b/spec/frontend/batch_comments/stores/modules/batch_comments/actions_spec.js
@@ -1,10 +1,15 @@
import MockAdapter from 'axios-mock-adapter';
import { TEST_HOST } from 'helpers/test_constants';
import testAction from 'helpers/vuex_action_helper';
+import { sprintf } from '~/locale';
+import { createAlert } from '~/alert';
import service from '~/batch_comments/services/drafts_service';
import * as actions from '~/batch_comments/stores/modules/batch_comments/actions';
import axios from '~/lib/utils/axios_utils';
import { HTTP_STATUS_INTERNAL_SERVER_ERROR, HTTP_STATUS_OK } from '~/lib/utils/http_status';
+import { UPDATE_COMMENT_FORM } from '~/notes/i18n';
+
+jest.mock('~/alert');
describe('Batch comments store actions', () => {
let res = {};
@@ -44,15 +49,15 @@ describe('Batch comments store actions', () => {
});
it('does not commit ADD_NEW_DRAFT if errors returned', () => {
+ const commit = jest.fn();
+
mock.onAny().reply(HTTP_STATUS_INTERNAL_SERVER_ERROR);
- return testAction(
- actions.addDraftToDiscussion,
- { endpoint: TEST_HOST, data: 'test' },
- null,
- [],
- [],
- );
+ return actions
+ .addDraftToDiscussion({ commit }, { endpoint: TEST_HOST, data: 'test' })
+ .catch(() => {
+ expect(commit).not.toHaveBeenCalledWith('ADD_NEW_DRAFT', expect.anything());
+ });
});
});
@@ -84,15 +89,13 @@ describe('Batch comments store actions', () => {
});
it('does not commit ADD_NEW_DRAFT if errors returned', () => {
+ const commit = jest.fn();
+
mock.onAny().reply(HTTP_STATUS_INTERNAL_SERVER_ERROR);
- return testAction(
- actions.createNewDraft,
- { endpoint: TEST_HOST, data: 'test' },
- null,
- [],
- [],
- );
+ return actions.createNewDraft({ commit }, { endpoint: TEST_HOST, data: 'test' }).catch(() => {
+ expect(commit).not.toHaveBeenCalledWith('ADD_NEW_DRAFT', expect.anything());
+ });
});
});
@@ -239,8 +242,6 @@ describe('Batch comments store actions', () => {
params = { note: { id: 1 }, noteText: 'test' };
});
- afterEach(() => jest.clearAllMocks());
-
it('commits RECEIVE_DRAFT_UPDATE_SUCCESS with returned data', () => {
return actions.updateDraft(context, { ...params, callback() {} }).then(() => {
expect(commit).toHaveBeenCalledWith('RECEIVE_DRAFT_UPDATE_SUCCESS', { id: 1 });
@@ -267,6 +268,28 @@ describe('Batch comments store actions', () => {
expect(service.update.mock.calls[0][1].position).toBe(expectation);
});
});
+
+ describe('when updating a draft returns an error', () => {
+ const errorCallback = jest.fn();
+ const flashContainer = null;
+ const error = 'server error';
+
+ beforeEach(async () => {
+ service.update.mockRejectedValue({ response: { data: { errors: error } } });
+ await actions.updateDraft(context, { ...params, flashContainer, errorCallback });
+ });
+
+ it('renders an error message', () => {
+ expect(createAlert).toHaveBeenCalledWith({
+ message: sprintf(UPDATE_COMMENT_FORM.error, { reason: error }),
+ parent: flashContainer,
+ });
+ });
+
+ it('calls errorCallback', () => {
+ expect(errorCallback).toHaveBeenCalledTimes(1);
+ });
+ });
});
describe('expandAllDiscussions', () => {
diff --git a/spec/frontend/behaviors/gl_emoji_spec.js b/spec/frontend/behaviors/gl_emoji_spec.js
index 995e4219ae3..c7f4fce0e4c 100644
--- a/spec/frontend/behaviors/gl_emoji_spec.js
+++ b/spec/frontend/behaviors/gl_emoji_spec.js
@@ -1,11 +1,18 @@
import { initEmojiMock, clearEmojiMock } from 'helpers/emoji';
import waitForPromises from 'helpers/wait_for_promises';
+import { createMockClient } from 'helpers/mock_apollo_helper';
import installGlEmojiElement from '~/behaviors/gl_emoji';
import { EMOJI_VERSION } from '~/emoji';
+import customEmojiQuery from '~/emoji/queries/custom_emoji.query.graphql';
import * as EmojiUnicodeSupport from '~/emoji/support';
+let mockClient;
+
jest.mock('~/emoji/support');
+jest.mock('~/lib/graphql', () => {
+ return () => mockClient;
+});
describe('gl_emoji', () => {
const emojiData = {
@@ -36,101 +43,144 @@ describe('gl_emoji', () => {
return div.firstElementChild;
}
- beforeEach(async () => {
- await initEmojiMock(emojiData);
- });
-
afterEach(() => {
clearEmojiMock();
document.body.innerHTML = '';
});
- describe.each([
- [
- 'bomb emoji just with name attribute',
- '<gl-emoji data-name="bomb"></gl-emoji>',
- '<gl-emoji data-name="bomb" data-unicode-version="6.0" title="bomb">💣</gl-emoji>',
- `<gl-emoji data-name="bomb" data-unicode-version="6.0" title="bomb"><img class="emoji" title=":bomb:" alt=":bomb:" src="/-/emojis/${EMOJI_VERSION}/bomb.png" width="16" height="16" align="absmiddle"></gl-emoji>`,
- ],
- [
- 'bomb emoji with name attribute and unicode version',
- '<gl-emoji data-name="bomb" data-unicode-version="6.0">💣</gl-emoji>',
- '<gl-emoji data-name="bomb" data-unicode-version="6.0">💣</gl-emoji>',
- `<gl-emoji data-name="bomb" data-unicode-version="6.0"><img class="emoji" title=":bomb:" alt=":bomb:" src="/-/emojis/${EMOJI_VERSION}/bomb.png" width="16" height="16" align="absmiddle"></gl-emoji>`,
- ],
- [
- 'bomb emoji with sprite fallback',
- '<gl-emoji data-fallback-sprite-class="emoji-bomb" data-name="bomb"></gl-emoji>',
- '<gl-emoji data-fallback-sprite-class="emoji-bomb" data-name="bomb" data-unicode-version="6.0" title="bomb">💣</gl-emoji>',
- '<gl-emoji data-fallback-sprite-class="emoji-bomb" data-name="bomb" data-unicode-version="6.0" title="bomb" class="emoji-icon emoji-bomb">💣</gl-emoji>',
- ],
- [
- 'bomb emoji with image fallback',
- '<gl-emoji data-fallback-src="/bomb.png" data-name="bomb"></gl-emoji>',
- '<gl-emoji data-fallback-src="/bomb.png" data-name="bomb" data-unicode-version="6.0" title="bomb">💣</gl-emoji>',
- '<gl-emoji data-fallback-src="/bomb.png" data-name="bomb" data-unicode-version="6.0" title="bomb"><img class="emoji" title=":bomb:" alt=":bomb:" src="/bomb.png" width="16" height="16" align="absmiddle"></gl-emoji>',
- ],
- [
- 'invalid emoji',
- '<gl-emoji data-name="invalid_emoji"></gl-emoji>',
- '<gl-emoji data-name="grey_question" data-unicode-version="6.0" title="white question mark ornament">â”</gl-emoji>',
- `<gl-emoji data-name="grey_question" data-unicode-version="6.0" title="white question mark ornament"><img class="emoji" title=":grey_question:" alt=":grey_question:" src="/-/emojis/${EMOJI_VERSION}/grey_question.png" width="16" height="16" align="absmiddle"></gl-emoji>`,
- ],
- [
- 'custom emoji with image fallback',
- '<gl-emoji data-fallback-src="https://cultofthepartyparrot.com/parrots/hd/parrot.gif" data-name="party-parrot" data-unicode-version="custom"></gl-emoji>',
- '<gl-emoji data-fallback-src="https://cultofthepartyparrot.com/parrots/hd/parrot.gif" data-name="party-parrot" data-unicode-version="custom"><img class="emoji" title=":party-parrot:" alt=":party-parrot:" src="https://cultofthepartyparrot.com/parrots/hd/parrot.gif" width="16" height="16" align="absmiddle"></gl-emoji>',
- '<gl-emoji data-fallback-src="https://cultofthepartyparrot.com/parrots/hd/parrot.gif" data-name="party-parrot" data-unicode-version="custom"><img class="emoji" title=":party-parrot:" alt=":party-parrot:" src="https://cultofthepartyparrot.com/parrots/hd/parrot.gif" width="16" height="16" align="absmiddle"></gl-emoji>',
- ],
- ])('%s', (name, markup, withEmojiSupport, withoutEmojiSupport) => {
- it(`renders correctly with emoji support`, async () => {
- jest.spyOn(EmojiUnicodeSupport, 'default').mockReturnValue(true);
- const glEmojiElement = markupToDomElement(markup);
+ describe('standard emoji', () => {
+ beforeEach(async () => {
+ await initEmojiMock(emojiData);
+ });
+
+ describe.each([
+ [
+ 'bomb emoji just with name attribute',
+ '<gl-emoji data-name="bomb"></gl-emoji>',
+ '<gl-emoji data-name="bomb" data-unicode-version="6.0" title="bomb">💣</gl-emoji>',
+ `<gl-emoji data-name="bomb" data-unicode-version="6.0" title="bomb"><img class="emoji" title=":bomb:" alt=":bomb:" src="/-/emojis/${EMOJI_VERSION}/bomb.png" align="absmiddle"></gl-emoji>`,
+ ],
+ [
+ 'bomb emoji with name attribute and unicode version',
+ '<gl-emoji data-name="bomb" data-unicode-version="6.0">💣</gl-emoji>',
+ '<gl-emoji data-name="bomb" data-unicode-version="6.0">💣</gl-emoji>',
+ `<gl-emoji data-name="bomb" data-unicode-version="6.0"><img class="emoji" title=":bomb:" alt=":bomb:" src="/-/emojis/${EMOJI_VERSION}/bomb.png" align="absmiddle"></gl-emoji>`,
+ ],
+ [
+ 'bomb emoji with sprite fallback',
+ '<gl-emoji data-fallback-sprite-class="emoji-bomb" data-name="bomb"></gl-emoji>',
+ '<gl-emoji data-fallback-sprite-class="emoji-bomb" data-name="bomb" data-unicode-version="6.0" title="bomb">💣</gl-emoji>',
+ '<gl-emoji data-fallback-sprite-class="emoji-bomb" data-name="bomb" data-unicode-version="6.0" title="bomb" class="emoji-icon emoji-bomb">💣</gl-emoji>',
+ ],
+ [
+ 'bomb emoji with image fallback',
+ '<gl-emoji data-fallback-src="/bomb.png" data-name="bomb"></gl-emoji>',
+ '<gl-emoji data-fallback-src="/bomb.png" data-name="bomb" data-unicode-version="6.0" title="bomb">💣</gl-emoji>',
+ '<gl-emoji data-fallback-src="/bomb.png" data-name="bomb" data-unicode-version="6.0" title="bomb"><img class="emoji" title=":bomb:" alt=":bomb:" src="/bomb.png" align="absmiddle"></gl-emoji>',
+ ],
+ [
+ 'invalid emoji',
+ '<gl-emoji data-name="invalid_emoji"></gl-emoji>',
+ '<gl-emoji data-name="grey_question" data-unicode-version="6.0" title="white question mark ornament">â”</gl-emoji>',
+ `<gl-emoji data-name="grey_question" data-unicode-version="6.0" title="white question mark ornament"><img class="emoji" title=":grey_question:" alt=":grey_question:" src="/-/emojis/${EMOJI_VERSION}/grey_question.png" align="absmiddle"></gl-emoji>`,
+ ],
+ [
+ 'custom emoji with image fallback',
+ '<gl-emoji data-fallback-src="https://cultofthepartyparrot.com/parrots/hd/parrot.gif" data-name="party-parrot" data-unicode-version="custom"></gl-emoji>',
+ '<gl-emoji data-fallback-src="https://cultofthepartyparrot.com/parrots/hd/parrot.gif" data-name="party-parrot" data-unicode-version="custom"><img class="emoji" title=":party-parrot:" alt=":party-parrot:" src="https://cultofthepartyparrot.com/parrots/hd/parrot.gif" align="absmiddle"></gl-emoji>',
+ '<gl-emoji data-fallback-src="https://cultofthepartyparrot.com/parrots/hd/parrot.gif" data-name="party-parrot" data-unicode-version="custom"><img class="emoji" title=":party-parrot:" alt=":party-parrot:" src="https://cultofthepartyparrot.com/parrots/hd/parrot.gif" align="absmiddle"></gl-emoji>',
+ ],
+ ])('%s', (name, markup, withEmojiSupport, withoutEmojiSupport) => {
+ it(`renders correctly with emoji support`, async () => {
+ jest.spyOn(EmojiUnicodeSupport, 'default').mockReturnValue(true);
+ const glEmojiElement = markupToDomElement(markup);
+
+ await waitForPromises();
+
+ expect(glEmojiElement.outerHTML).toBe(withEmojiSupport);
+ });
+
+ it(`renders correctly without emoji support`, async () => {
+ jest.spyOn(EmojiUnicodeSupport, 'default').mockReturnValue(false);
+ const glEmojiElement = markupToDomElement(markup);
+
+ await waitForPromises();
+
+ expect(glEmojiElement.outerHTML).toBe(withoutEmojiSupport);
+ });
+ });
+
+ it('escapes gl-emoji name', async () => {
+ const glEmojiElement = markupToDomElement(
+ "<gl-emoji data-name='&#34;x=&#34y&#34 onload=&#34;alert(document.location.href)&#34;' data-unicode-version='x'>abc</gl-emoji>",
+ );
await waitForPromises();
- expect(glEmojiElement.outerHTML).toBe(withEmojiSupport);
+ expect(glEmojiElement.outerHTML).toBe(
+ '<gl-emoji data-name="&quot;x=&quot;y&quot; onload=&quot;alert(document.location.href)&quot;" data-unicode-version="x"><img class="emoji" title=":&quot;x=&quot;y&quot; onload=&quot;alert(document.location.href)&quot;:" alt=":&quot;x=&quot;y&quot; onload=&quot;alert(document.location.href)&quot;:" src="/-/emojis/2/grey_question.png" align="absmiddle"></gl-emoji>',
+ );
});
- it(`renders correctly without emoji support`, async () => {
+ it('Adds sprite CSS if emojis are not supported', async () => {
+ const testPath = '/test-path.css';
jest.spyOn(EmojiUnicodeSupport, 'default').mockReturnValue(false);
- const glEmojiElement = markupToDomElement(markup);
+ window.gon.emoji_sprites_css_path = testPath;
+ expect(document.head.querySelector(`link[href="${testPath}"]`)).toBe(null);
+ expect(window.gon.emoji_sprites_css_added).toBe(undefined);
+
+ markupToDomElement(
+ '<gl-emoji data-fallback-sprite-class="emoji-bomb" data-name="bomb"></gl-emoji>',
+ );
await waitForPromises();
- expect(glEmojiElement.outerHTML).toBe(withoutEmojiSupport);
+ expect(document.head.querySelector(`link[href="${testPath}"]`).outerHTML).toBe(
+ '<link rel="stylesheet" href="/test-path.css">',
+ );
+ expect(window.gon.emoji_sprites_css_added).toBe(true);
});
});
- it('escapes gl-emoji name', async () => {
- const glEmojiElement = markupToDomElement(
- "<gl-emoji data-name='&#34;x=&#34y&#34 onload=&#34;alert(document.location.href)&#34;' data-unicode-version='x'>abc</gl-emoji>",
- );
-
- await waitForPromises();
+ describe('custom emoji', () => {
+ beforeEach(async () => {
+ mockClient = createMockClient([
+ [
+ customEmojiQuery,
+ jest.fn().mockResolvedValue({
+ data: {
+ group: {
+ id: 1,
+ customEmoji: {
+ nodes: [{ id: 1, name: 'parrot', url: 'parrot.gif' }],
+ },
+ },
+ },
+ }),
+ ],
+ ]);
+
+ window.gon = { features: { customEmoji: true } };
+ document.body.dataset.groupFullPath = 'test-group';
+
+ await initEmojiMock(emojiData);
+ });
- expect(glEmojiElement.outerHTML).toBe(
- '<gl-emoji data-name="&quot;x=&quot;y&quot; onload=&quot;alert(document.location.href)&quot;" data-unicode-version="x"><img class="emoji" title=":&quot;x=&quot;y&quot; onload=&quot;alert(document.location.href)&quot;:" alt=":&quot;x=&quot;y&quot; onload=&quot;alert(document.location.href)&quot;:" src="/-/emojis/2/grey_question.png" width="16" height="16" align="absmiddle"></gl-emoji>',
- );
- });
+ afterEach(() => {
+ window.gon = {};
+ delete document.body.dataset.groupFullPath;
+ });
- it('Adds sprite CSS if emojis are not supported', async () => {
- const testPath = '/test-path.css';
- jest.spyOn(EmojiUnicodeSupport, 'default').mockReturnValue(false);
- window.gon.emoji_sprites_css_path = testPath;
+ it('renders custom emoji', async () => {
+ const glEmojiElement = markupToDomElement('<gl-emoji data-name="parrot"></gl-emoji>');
- expect(document.head.querySelector(`link[href="${testPath}"]`)).toBe(null);
- expect(window.gon.emoji_sprites_css_added).toBe(undefined);
+ await waitForPromises();
- markupToDomElement(
- '<gl-emoji data-fallback-sprite-class="emoji-bomb" data-name="bomb"></gl-emoji>',
- );
- await waitForPromises();
+ const img = glEmojiElement.querySelector('img');
- expect(document.head.querySelector(`link[href="${testPath}"]`).outerHTML).toBe(
- '<link rel="stylesheet" href="/test-path.css">',
- );
- expect(window.gon.emoji_sprites_css_added).toBe(true);
+ expect(glEmojiElement.dataset.unicodeVersion).toBe('custom');
+ expect(img.getAttribute('src')).toBe('parrot.gif');
+ });
});
});
diff --git a/spec/frontend/behaviors/markdown/render_gfm_spec.js b/spec/frontend/behaviors/markdown/render_gfm_spec.js
index 220ad874b47..0bbb92282e5 100644
--- a/spec/frontend/behaviors/markdown/render_gfm_spec.js
+++ b/spec/frontend/behaviors/markdown/render_gfm_spec.js
@@ -1,7 +1,4 @@
import { renderGFM } from '~/behaviors/markdown/render_gfm';
-import renderMetrics from '~/behaviors/markdown/render_metrics';
-
-jest.mock('~/behaviors/markdown/render_metrics');
describe('renderGFM', () => {
it('handles a missing element', () => {
@@ -9,27 +6,4 @@ describe('renderGFM', () => {
renderGFM();
}).not.toThrow();
});
-
- describe('remove_monitor_metrics flag', () => {
- let metricsElement;
-
- beforeEach(() => {
- window.gon = { features: { removeMonitorMetrics: true } };
- metricsElement = document.createElement('div');
- metricsElement.setAttribute('class', '.js-render-metrics');
- });
-
- it('renders metrics when the flag is disabled', () => {
- window.gon.features = { features: { removeMonitorMetrics: false } };
- renderGFM(metricsElement);
-
- expect(renderMetrics).toHaveBeenCalled();
- });
-
- it('does not render metrics when the flag is enabled', () => {
- renderGFM(metricsElement);
-
- expect(renderMetrics).not.toHaveBeenCalled();
- });
- });
});
diff --git a/spec/frontend/behaviors/markdown/render_metrics_spec.js b/spec/frontend/behaviors/markdown/render_metrics_spec.js
deleted file mode 100644
index ab81ed6b8f0..00000000000
--- a/spec/frontend/behaviors/markdown/render_metrics_spec.js
+++ /dev/null
@@ -1,49 +0,0 @@
-import { TEST_HOST } from 'helpers/test_constants';
-import renderMetrics from '~/behaviors/markdown/render_metrics';
-
-const mockEmbedGroup = jest.fn();
-
-jest.mock('vue', () => ({ extend: () => mockEmbedGroup }));
-jest.mock('~/monitoring/components/embeds/embed_group.vue', () => jest.fn());
-jest.mock('~/monitoring/stores/embed_group/', () => ({ createStore: jest.fn() }));
-
-const getElements = () => Array.from(document.getElementsByClassName('js-render-metrics'));
-
-describe('Render metrics for Gitlab Flavoured Markdown', () => {
- it('does nothing when no elements are found', () => {
- return renderMetrics([]).then(() => {
- expect(mockEmbedGroup).not.toHaveBeenCalled();
- });
- });
-
- it('renders a vue component when elements are found', () => {
- document.body.innerHTML = `<div class="js-render-metrics" data-dashboard-url="${TEST_HOST}"></div>`;
-
- return renderMetrics(getElements()).then(() => {
- expect(mockEmbedGroup).toHaveBeenCalledTimes(1);
- expect(mockEmbedGroup).toHaveBeenCalledWith(
- expect.objectContaining({ propsData: { urls: [`${TEST_HOST}`] } }),
- );
- });
- });
-
- it('takes sibling metrics and groups them under a shared parent', () => {
- document.body.innerHTML = `
- <p><span>Hello</span></p>
- <div class="js-render-metrics" data-dashboard-url="${TEST_HOST}/1"></div>
- <div class="js-render-metrics" data-dashboard-url="${TEST_HOST}/2"></div>
- <p><span>Hello</span></p>
- <div class="js-render-metrics" data-dashboard-url="${TEST_HOST}/3"></div>
- `;
-
- return renderMetrics(getElements()).then(() => {
- expect(mockEmbedGroup).toHaveBeenCalledTimes(2);
- expect(mockEmbedGroup).toHaveBeenCalledWith(
- expect.objectContaining({ propsData: { urls: [`${TEST_HOST}/1`, `${TEST_HOST}/2`] } }),
- );
- expect(mockEmbedGroup).toHaveBeenCalledWith(
- expect.objectContaining({ propsData: { urls: [`${TEST_HOST}/3`] } }),
- );
- });
- });
-});
diff --git a/spec/frontend/blob/line_highlighter_spec.js b/spec/frontend/blob/line_highlighter_spec.js
index b2e1a29b84f..de39a8f688a 100644
--- a/spec/frontend/blob/line_highlighter_spec.js
+++ b/spec/frontend/blob/line_highlighter_spec.js
@@ -1,5 +1,4 @@
/* eslint-disable no-return-assign, no-new, no-underscore-dangle */
-import $ from 'jquery';
import htmlStaticLineHighlighter from 'test_fixtures_static/line_highlighter.html';
import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import LineHighlighter from '~/blob/line_highlighter';
@@ -9,11 +8,15 @@ describe('LineHighlighter', () => {
const testContext = {};
const clickLine = (number, eventData = {}) => {
- if ($.isEmptyObject(eventData)) {
- return $(`#L${number}`).click();
+ if (Object.keys(eventData).length === 0) {
+ return document.querySelector(`#L${number}`).click();
}
- const e = $.Event('click', eventData);
- return $(`#L${number}`).trigger(e);
+ const e = new MouseEvent('click', {
+ bubbles: true,
+ cancelable: true,
+ ...eventData,
+ });
+ return document.querySelector(`#L${number}`).dispatchEvent(e);
};
beforeEach(() => {
@@ -35,32 +38,30 @@ describe('LineHighlighter', () => {
it('highlights one line given in the URL hash', () => {
new LineHighlighter({ hash: '#L13' });
- expect($('#LC13')).toHaveClass(testContext.css);
+ expect(document.querySelector('#LC13').classList).toContain(testContext.css);
});
it('highlights one line given in the URL hash with given CSS class name', () => {
const hiliter = new LineHighlighter({ hash: '#L13', highlightLineClass: 'hilite' });
expect(hiliter.highlightLineClass).toBe('hilite');
- expect($('#LC13')).toHaveClass('hilite');
- expect($('#LC13')).not.toHaveClass('hll');
+ expect(document.querySelector('#LC13').classList).toContain('hilite');
+ expect(document.querySelector('#LC13').classList).not.toContain('hll');
});
it('highlights a range of lines given in the URL hash', () => {
new LineHighlighter({ hash: '#L5-25' });
- expect($(`.${testContext.css}`).length).toBe(21);
for (let line = 5; line <= 25; line += 1) {
- expect($(`#LC${line}`)).toHaveClass(testContext.css);
+ expect(document.querySelector(`#LC${line}`).classList).toContain(testContext.css);
}
});
it('highlights a range of lines given in the URL hash using GitHub format', () => {
new LineHighlighter({ hash: '#L5-L25' });
- expect($(`.${testContext.css}`).length).toBe(21);
for (let line = 5; line <= 25; line += 1) {
- expect($(`#LC${line}`)).toHaveClass(testContext.css);
+ expect(document.querySelector(`#LC${line}`).classList).toContain(testContext.css);
}
});
@@ -74,11 +75,13 @@ describe('LineHighlighter', () => {
it('discards click events', () => {
const clickSpy = jest.fn();
- $('a[data-line-number]').click(clickSpy);
+ document.querySelectorAll('a[data-line-number]').forEach((el) => {
+ el.addEventListener('click', clickSpy);
+ });
clickLine(13);
- expect(clickSpy.mock.calls[0][0].isDefaultPrevented()).toEqual(true);
+ expect(clickSpy.mock.calls[0][0].defaultPrevented).toEqual(true);
});
it('handles garbage input from the hash', () => {
@@ -101,27 +104,19 @@ describe('LineHighlighter', () => {
});
describe('clickHandler', () => {
- it('handles clicking on a child icon element', () => {
- const spy = jest.spyOn(testContext.class, 'setHash');
- $('#L13 [data-testid="link-icon"]').mousedown().click();
-
- expect(spy).toHaveBeenCalledWith(13);
- expect($('#LC13')).toHaveClass(testContext.css);
- });
-
describe('without shiftKey', () => {
it('highlights one line when clicked', () => {
clickLine(13);
- expect($('#LC13')).toHaveClass(testContext.css);
+ expect(document.querySelector('#LC13').classList).toContain(testContext.css);
});
it('unhighlights previously highlighted lines', () => {
clickLine(13);
clickLine(20);
- expect($('#LC13')).not.toHaveClass(testContext.css);
- expect($('#LC20')).toHaveClass(testContext.css);
+ expect(document.querySelector('#LC13').classList).not.toContain(testContext.css);
+ expect(document.querySelector('#LC20').classList).toContain(testContext.css);
});
it('sets the hash', () => {
@@ -138,6 +133,8 @@ describe('LineHighlighter', () => {
clickLine(13);
clickLine(20, {
shiftKey: true,
+ bubbles: true,
+ cancelable: true,
});
expect(spy).toHaveBeenCalledWith(13);
@@ -150,8 +147,8 @@ describe('LineHighlighter', () => {
shiftKey: true,
});
- expect($('#LC13')).toHaveClass(testContext.css);
- expect($(`.${testContext.css}`).length).toBe(1);
+ expect(document.querySelector('#LC13').classList).toContain(testContext.css);
+ expect(document.querySelectorAll(`.${testContext.css}`).length).toBe(1);
});
it('sets the hash', () => {
@@ -171,9 +168,9 @@ describe('LineHighlighter', () => {
shiftKey: true,
});
- expect($(`.${testContext.css}`).length).toBe(6);
+ expect(document.querySelectorAll(`.${testContext.css}`).length).toBe(6);
for (let line = 15; line <= 20; line += 1) {
- expect($(`#LC${line}`)).toHaveClass(testContext.css);
+ expect(document.querySelector(`#LC${line}`).classList).toContain(testContext.css);
}
});
@@ -183,9 +180,9 @@ describe('LineHighlighter', () => {
shiftKey: true,
});
- expect($(`.${testContext.css}`).length).toBe(6);
+ expect(document.querySelectorAll(`.${testContext.css}`).length).toBe(6);
for (let line = 5; line <= 10; line += 1) {
- expect($(`#LC${line}`)).toHaveClass(testContext.css);
+ expect(document.querySelector(`#LC${line}`).classList).toContain(testContext.css);
}
});
});
@@ -205,9 +202,9 @@ describe('LineHighlighter', () => {
shiftKey: true,
});
- expect($(`.${testContext.css}`).length).toBe(6);
+ expect(document.querySelectorAll(`.${testContext.css}`).length).toBe(6);
for (let line = 5; line <= 10; line += 1) {
- expect($(`#LC${line}`)).toHaveClass(testContext.css);
+ expect(document.querySelector(`#LC${line}`).classList).toContain(testContext.css);
}
});
@@ -216,9 +213,9 @@ describe('LineHighlighter', () => {
shiftKey: true,
});
- expect($(`.${testContext.css}`).length).toBe(6);
+ expect(document.querySelectorAll(`.${testContext.css}`).length).toBe(6);
for (let line = 10; line <= 15; line += 1) {
- expect($(`#LC${line}`)).toHaveClass(testContext.css);
+ expect(document.querySelector(`#LC${line}`).classList).toContain(testContext.css);
}
});
});
@@ -251,13 +248,13 @@ describe('LineHighlighter', () => {
it('highlights the specified line', () => {
testContext.subject(13);
- expect($('#LC13')).toHaveClass(testContext.css);
+ expect(document.querySelector('#LC13').classList).toContain(testContext.css);
});
it('accepts a String-based number', () => {
testContext.subject('13');
- expect($('#LC13')).toHaveClass(testContext.css);
+ expect(document.querySelector('#LC13').classList).toContain(testContext.css);
});
});
diff --git a/spec/frontend/blob_edit/edit_blob_spec.js b/spec/frontend/blob_edit/edit_blob_spec.js
index 9ab20fc2cd7..1bdc54723ce 100644
--- a/spec/frontend/blob_edit/edit_blob_spec.js
+++ b/spec/frontend/blob_edit/edit_blob_spec.js
@@ -61,7 +61,6 @@ describe('Blob Editing', () => {
});
afterEach(() => {
mock.restore();
- jest.clearAllMocks();
unuseMock.mockClear();
useMock.mockClear();
resetHTMLFixture();
diff --git a/spec/frontend/boards/board_card_inner_spec.js b/spec/frontend/boards/board_card_inner_spec.js
index a925f752f5e..36556ba00af 100644
--- a/spec/frontend/boards/board_card_inner_spec.js
+++ b/spec/frontend/boards/board_card_inner_spec.js
@@ -92,6 +92,7 @@ describe('Board card component', () => {
isEpicBoard,
issuableType: TYPE_ISSUE,
isGroupBoard,
+ isApolloBoard: false,
},
});
};
@@ -111,7 +112,6 @@ describe('Board card component', () => {
afterEach(() => {
store = null;
- jest.clearAllMocks();
});
it('renders issue title', () => {
diff --git a/spec/frontend/boards/components/board_app_spec.js b/spec/frontend/boards/components/board_app_spec.js
index 3d6e4c18f51..e7624437ac5 100644
--- a/spec/frontend/boards/components/board_app_spec.js
+++ b/spec/frontend/boards/components/board_app_spec.js
@@ -4,7 +4,9 @@ import VueApollo from 'vue-apollo';
import Vuex from 'vuex';
import createMockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
import BoardApp from '~/boards/components/board_app.vue';
+import eventHub from '~/boards/eventhub';
import activeBoardItemQuery from 'ee_else_ce/boards/graphql/client/active_board_item.query.graphql';
import boardListsQuery from 'ee_else_ce/boards/graphql/board_lists.query.graphql';
import { rawIssue, boardListsQueryResponse } from '../mock_data';
@@ -93,5 +95,14 @@ describe('BoardApp', () => {
expect(wrapper.classes()).not.toContain('is-compact');
});
+
+ it('refetches lists when updateBoard event is received', async () => {
+ jest.spyOn(eventHub, '$on').mockImplementation(() => {});
+
+ createComponent({ isApolloBoard: true });
+ await waitForPromises();
+
+ expect(eventHub.$on).toHaveBeenCalledWith('updateBoard', wrapper.vm.refetchLists);
+ });
});
});
diff --git a/spec/frontend/boards/components/board_content_spec.js b/spec/frontend/boards/components/board_content_spec.js
index 9260718a94b..0a2a78479fb 100644
--- a/spec/frontend/boards/components/board_content_spec.js
+++ b/spec/frontend/boards/components/board_content_spec.js
@@ -4,7 +4,7 @@ import VueApollo from 'vue-apollo';
import Vue from 'vue';
import Draggable from 'vuedraggable';
import Vuex from 'vuex';
-import eventHub from '~/boards/eventhub';
+
import createMockApollo from 'helpers/mock_apollo_helper';
import { stubComponent } from 'helpers/stub_component';
import waitForPromises from 'helpers/wait_for_promises';
@@ -182,15 +182,6 @@ describe('BoardContent', () => {
expect(wrapper.findComponent(BoardContentSidebar).exists()).toBe(true);
});
- it('refetches lists when updateBoard event is received', async () => {
- jest.spyOn(eventHub, '$on').mockImplementation(() => {});
-
- createComponent({ isApolloBoard: true });
- await waitForPromises();
-
- expect(eventHub.$on).toHaveBeenCalledWith('updateBoard', wrapper.vm.refetchLists);
- });
-
it('reorders lists', async () => {
const movableListsOrder = [mockLists[0].id, mockLists[1].id];
diff --git a/spec/frontend/boards/components/board_list_header_spec.js b/spec/frontend/boards/components/board_list_header_spec.js
index ad2674f9d3b..0c9e1b4646e 100644
--- a/spec/frontend/boards/components/board_list_header_spec.js
+++ b/spec/frontend/boards/components/board_list_header_spec.js
@@ -1,4 +1,4 @@
-import { GlDisclosureDropdown, GlDisclosureDropdownItem } from '@gitlab/ui';
+import { GlButtonGroup } from '@gitlab/ui';
import Vue, { nextTick } from 'vue';
import VueApollo from 'vue-apollo';
import Vuex from 'vuex';
@@ -93,18 +93,17 @@ describe('Board List Header Component', () => {
...injectedProps,
},
stubs: {
- GlDisclosureDropdown,
- GlDisclosureDropdownItem,
+ GlButtonGroup,
},
});
};
- const findDropdown = () => wrapper.findComponent(GlDisclosureDropdown);
+ const findButtonGroup = () => wrapper.findComponent(GlButtonGroup);
const isCollapsed = () => wrapper.vm.list.collapsed;
const findTitle = () => wrapper.find('.board-title');
const findCaret = () => wrapper.findByTestId('board-title-caret');
- const findNewIssueButton = () => wrapper.findByTestId('newIssueBtn');
- const findSettingsButton = () => wrapper.findByTestId('settingsBtn');
+ const findNewIssueButton = () => wrapper.findByTestId('new-issue-btn');
+ const findSettingsButton = () => wrapper.findByTestId('settings-btn');
const findBoardListHeader = () => wrapper.findByTestId('board-list-header');
it('renders border when label color is present', () => {
@@ -131,13 +130,13 @@ describe('Board List Header Component', () => {
it.each(hasNoAddButton)('does not render dropdown when List Type is `%s`', (listType) => {
createComponent({ listType });
- expect(findDropdown().exists()).toBe(false);
+ expect(findButtonGroup().exists()).toBe(false);
});
it.each(hasAddButton)('does render when List Type is `%s`', (listType) => {
createComponent({ listType });
- expect(findDropdown().exists()).toBe(true);
+ expect(findButtonGroup().exists()).toBe(true);
expect(findNewIssueButton().exists()).toBe(true);
});
@@ -146,7 +145,7 @@ describe('Board List Header Component', () => {
currentUserId: null,
});
- expect(findDropdown().exists()).toBe(false);
+ expect(findButtonGroup().exists()).toBe(false);
});
});
@@ -156,20 +155,20 @@ describe('Board List Header Component', () => {
it.each(hasSettings)('does render for List Type `%s`', (listType) => {
createComponent({ listType });
- expect(findDropdown().exists()).toBe(true);
+ expect(findButtonGroup().exists()).toBe(true);
expect(findSettingsButton().exists()).toBe(true);
});
it('does not render dropdown when ListType `closed`', () => {
createComponent({ listType: ListType.closed });
- expect(findDropdown().exists()).toBe(false);
+ expect(findButtonGroup().exists()).toBe(false);
});
it('renders dropdown but not the Settings button when ListType `backlog`', () => {
createComponent({ listType: ListType.backlog });
- expect(findDropdown().exists()).toBe(true);
+ expect(findButtonGroup().exists()).toBe(true);
expect(findSettingsButton().exists()).toBe(false);
});
});
diff --git a/spec/frontend/boards/components/board_new_issue_spec.js b/spec/frontend/boards/components/board_new_issue_spec.js
index 651d1daee52..a1088f1e8f7 100644
--- a/spec/frontend/boards/components/board_new_issue_spec.js
+++ b/spec/frontend/boards/components/board_new_issue_spec.js
@@ -1,25 +1,49 @@
import { shallowMount } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
import Vuex from 'vuex';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
import BoardNewIssue from '~/boards/components/board_new_issue.vue';
import BoardNewItem from '~/boards/components/board_new_item.vue';
import ProjectSelect from '~/boards/components/project_select.vue';
import eventHub from '~/boards/eventhub';
-
-import { mockList, mockGroupProjects, mockIssue, mockIssue2 } from '../mock_data';
+import groupBoardQuery from '~/boards/graphql/group_board.query.graphql';
+import projectBoardQuery from '~/boards/graphql/project_board.query.graphql';
+import { WORKSPACE_GROUP, WORKSPACE_PROJECT } from '~/issues/constants';
+
+import {
+ mockList,
+ mockGroupProjects,
+ mockIssue,
+ mockIssue2,
+ mockProjectBoardResponse,
+ mockGroupBoardResponse,
+} from '../mock_data';
Vue.use(Vuex);
+Vue.use(VueApollo);
const addListNewIssuesSpy = jest.fn().mockResolvedValue();
const mockActions = { addListNewIssue: addListNewIssuesSpy };
+const projectBoardQueryHandlerSuccess = jest.fn().mockResolvedValue(mockProjectBoardResponse);
+const groupBoardQueryHandlerSuccess = jest.fn().mockResolvedValue(mockGroupBoardResponse);
+
+const mockApollo = createMockApollo([
+ [projectBoardQuery, projectBoardQueryHandlerSuccess],
+ [groupBoardQuery, groupBoardQueryHandlerSuccess],
+]);
+
const createComponent = ({
- state = { selectedProject: mockGroupProjects[0] },
+ state = {},
actions = mockActions,
getters = { getBoardItemsByList: () => () => [] },
isGroupBoard = true,
+ data = { selectedProject: mockGroupProjects[0] },
+ provide = {},
} = {}) =>
shallowMount(BoardNewIssue, {
+ apolloProvider: mockApollo,
store: new Vuex.Store({
state,
actions,
@@ -27,13 +51,19 @@ const createComponent = ({
}),
propsData: {
list: mockList,
+ boardId: 'gid://gitlab/Board/1',
},
+ data: () => data,
provide: {
groupId: 1,
fullPath: mockGroupProjects[0].fullPath,
weightFeatureAvailable: false,
boardWeight: null,
isGroupBoard,
+ boardType: 'group',
+ isEpicBoard: false,
+ isApolloBoard: false,
+ ...provide,
},
stubs: {
BoardNewItem,
@@ -137,4 +167,33 @@ describe('Issue boards new issue form', () => {
expect(projectSelect.exists()).toBe(false);
});
});
+
+ describe('Apollo boards', () => {
+ it.each`
+ boardType | queryHandler | notCalledHandler
+ ${WORKSPACE_GROUP} | ${groupBoardQueryHandlerSuccess} | ${projectBoardQueryHandlerSuccess}
+ ${WORKSPACE_PROJECT} | ${projectBoardQueryHandlerSuccess} | ${groupBoardQueryHandlerSuccess}
+ `(
+ 'fetches $boardType board and emits addNewIssue event',
+ async ({ boardType, queryHandler, notCalledHandler }) => {
+ wrapper = createComponent({
+ provide: {
+ boardType,
+ isProjectBoard: boardType === WORKSPACE_PROJECT,
+ isGroupBoard: boardType === WORKSPACE_GROUP,
+ isApolloBoard: true,
+ },
+ });
+
+ await nextTick();
+ findBoardNewItem().vm.$emit('form-submit', { title: 'Foo' });
+
+ await nextTick();
+
+ expect(queryHandler).toHaveBeenCalled();
+ expect(notCalledHandler).not.toHaveBeenCalled();
+ expect(wrapper.emitted('addNewIssue')[0][0]).toMatchObject({ title: 'Foo' });
+ },
+ );
+ });
});
diff --git a/spec/frontend/boards/components/board_settings_sidebar_spec.js b/spec/frontend/boards/components/board_settings_sidebar_spec.js
index b1e14be8ceb..affe1260c66 100644
--- a/spec/frontend/boards/components/board_settings_sidebar_spec.js
+++ b/spec/frontend/boards/components/board_settings_sidebar_spec.js
@@ -90,10 +90,6 @@ describe('BoardSettingsSidebar', () => {
const findModal = () => wrapper.findComponent(GlModal);
const findRemoveButton = () => wrapper.findComponent(GlButton);
- afterEach(() => {
- jest.restoreAllMocks();
- });
-
it('finds a MountingPortal component', () => {
createComponent();
diff --git a/spec/frontend/boards/mock_data.js b/spec/frontend/boards/mock_data.js
index 447aacd9cea..8235c3e4194 100644
--- a/spec/frontend/boards/mock_data.js
+++ b/spec/frontend/boards/mock_data.js
@@ -836,6 +836,7 @@ export const mockTokens = (fetchLabels, fetchUsers, fetchMilestones, isSignedIn)
type: TOKEN_TYPE_ASSIGNEE,
operators: OPERATORS_IS_NOT,
token: UserToken,
+ dataType: 'user',
unique: true,
fetchUsers,
preloadedUsers: [],
@@ -847,6 +848,7 @@ export const mockTokens = (fetchLabels, fetchUsers, fetchMilestones, isSignedIn)
operators: OPERATORS_IS_NOT,
symbol: '@',
token: UserToken,
+ dataType: 'user',
unique: true,
fetchUsers,
preloadedUsers: [],
@@ -1040,4 +1042,43 @@ export const destroyBoardListMutationResponse = {
},
};
+export const mockProjects = [
+ {
+ id: 'gid://gitlab/Project/1',
+ name: 'Gitlab Shell',
+ nameWithNamespace: 'Gitlab Org / Gitlab Shell',
+ fullPath: 'gitlab-org/gitlab-shell',
+ archived: false,
+ __typename: 'Project',
+ },
+ {
+ id: 'gid://gitlab/Project/2',
+ name: 'Gitlab Test',
+ nameWithNamespace: 'Gitlab Org / Gitlab Test',
+ fullPath: 'gitlab-org/gitlab-test',
+ archived: true,
+ __typename: 'Project',
+ },
+];
+
+export const mockGroupProjectsResponse = (projects = mockProjects) => ({
+ data: {
+ group: {
+ id: 'gid://gitlab/Group/1',
+ projects: {
+ nodes: projects,
+ pageInfo: {
+ hasNextPage: true,
+ hasPreviousPage: false,
+ startCursor: 'abc',
+ endCursor: 'bcd',
+ __typename: 'PageInfo',
+ },
+ __typename: 'ProjectConnection',
+ },
+ __typename: 'Group',
+ },
+ },
+});
+
export const DEFAULT_COLOR = '#1068bf';
diff --git a/spec/frontend/boards/project_select_spec.js b/spec/frontend/boards/project_select_spec.js
index b4308b38947..f1daccfadda 100644
--- a/spec/frontend/boards/project_select_spec.js
+++ b/spec/frontend/boards/project_select_spec.js
@@ -1,17 +1,19 @@
import { GlCollapsibleListbox, GlListboxItem, GlLoadingIcon } from '@gitlab/ui';
-import { mount } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
-import Vuex from 'vuex';
+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 groupProjectsQuery from '~/boards/graphql/group_projects.query.graphql';
import ProjectSelect from '~/boards/components/project_select.vue';
-import defaultState from '~/boards/stores/state';
-import { mockActiveGroupProjects, mockList } from './mock_data';
+import { mockList, mockGroupProjectsResponse, mockProjects } from './mock_data';
-const mockProjectsList1 = mockActiveGroupProjects.slice(0, 1);
+Vue.use(VueApollo);
describe('ProjectSelect component', () => {
let wrapper;
- let store;
+ let mockApollo;
const findLabel = () => wrapper.find("[data-testid='header-label']");
const findGlCollapsibleListBox = () => wrapper.findComponent(GlCollapsibleListbox);
@@ -26,77 +28,54 @@ describe('ProjectSelect component', () => {
const findInMenuLoadingIcon = () => wrapper.find("[data-testid='listbox-search-loader']");
const findEmptySearchMessage = () => wrapper.find("[data-testid='listbox-no-results-text']");
- const createStore = ({ state, activeGroupProjects }) => {
- Vue.use(Vuex);
-
- store = new Vuex.Store({
- state: {
- defaultState,
- groupProjectsFlags: {
- isLoading: false,
- pageInfo: {
- hasNextPage: false,
- },
- },
- ...state,
- },
- actions: {
- fetchGroupProjects: jest.fn(),
- setSelectedProject: jest.fn(),
- },
- getters: {
- activeGroupProjects: () => activeGroupProjects,
- },
- });
- };
-
- const createWrapper = ({ state = {}, activeGroupProjects = [] } = {}) => {
- createStore({
- state,
- activeGroupProjects,
- });
+ const projectsQueryHandler = jest.fn().mockResolvedValue(mockGroupProjectsResponse());
+ const emptyProjectsQueryHandler = jest.fn().mockResolvedValue(mockGroupProjectsResponse([]));
- wrapper = mount(ProjectSelect, {
+ const createWrapper = ({ queryHandler = projectsQueryHandler, selectedProject = {} } = {}) => {
+ mockApollo = createMockApollo([[groupProjectsQuery, queryHandler]]);
+ wrapper = mountExtended(ProjectSelect, {
+ apolloProvider: mockApollo,
propsData: {
list: mockList,
+ selectedProject,
},
- store,
provide: {
groupId: 1,
+ fullPath: 'gitlab-org',
},
attachTo: document.body,
});
};
- it('displays a header title', () => {
- createWrapper();
-
- expect(findLabel().text()).toBe('Projects');
- });
-
- it('renders a default dropdown text', () => {
- createWrapper();
-
- expect(findGlCollapsibleListBox().exists()).toBe(true);
- expect(findGlCollapsibleListBox().text()).toContain('Select a project');
- });
-
describe('when mounted', () => {
- it('displays a loading icon while projects are being fetched', async () => {
+ beforeEach(() => {
createWrapper();
+ });
+ it('displays a loading icon while projects are being fetched', async () => {
expect(findGlDropdownLoadingIcon().exists()).toBe(true);
- await nextTick();
+ await waitForPromises();
expect(findGlDropdownLoadingIcon().exists()).toBe(false);
+ expect(projectsQueryHandler).toHaveBeenCalled();
+ });
+
+ it('displays a header title', () => {
+ expect(findLabel().text()).toBe('Projects');
+ });
+
+ it('renders a default dropdown text', () => {
+ expect(findGlCollapsibleListBox().exists()).toBe(true);
+ expect(findGlCollapsibleListBox().text()).toContain('Select a project');
});
});
describe('when dropdown menu is open', () => {
describe('by default', () => {
- beforeEach(() => {
- createWrapper({ activeGroupProjects: mockActiveGroupProjects });
+ beforeEach(async () => {
+ createWrapper();
+ await waitForPromises();
});
it('shows GlListboxSearchInput with placeholder text', () => {
@@ -106,7 +85,7 @@ describe('ProjectSelect component', () => {
it("displays the fetched project's name", () => {
expect(findFirstGlDropdownItem().exists()).toBe(true);
- expect(findFirstGlDropdownItem().text()).toContain(mockProjectsList1[0].name);
+ expect(findFirstGlDropdownItem().text()).toContain(mockProjects[0].name);
});
it("doesn't render loading icon in the menu", () => {
@@ -119,33 +98,31 @@ describe('ProjectSelect component', () => {
});
describe('when no projects are being returned', () => {
- it('renders empty search result message', () => {
- createWrapper();
+ it('renders empty search result message', async () => {
+ createWrapper({ queryHandler: emptyProjectsQueryHandler });
+ await waitForPromises();
expect(findEmptySearchMessage().exists()).toBe(true);
});
});
describe('when a project is selected', () => {
- beforeEach(() => {
- createWrapper({ activeGroupProjects: mockProjectsList1 });
-
- findFirstGlDropdownItem().find('li').trigger('click');
+ beforeEach(async () => {
+ createWrapper({ selectedProject: mockProjects[0] });
+ await waitForPromises();
});
it('renders the name of the selected project', () => {
expect(findGlCollapsibleListBox().find('.gl-new-dropdown-button-text').text()).toBe(
- mockProjectsList1[0].name,
+ mockProjects[0].name,
);
});
});
describe('when projects are loading', () => {
- beforeEach(() => {
- createWrapper({ state: { groupProjectsFlags: { isLoading: true } } });
- });
-
- it('displays and hides gl-loading-icon while and after fetching data', () => {
+ it('displays and hides gl-loading-icon while and after fetching data', async () => {
+ createWrapper();
+ await nextTick();
expect(findInMenuLoadingIcon().isVisible()).toBe(true);
});
});
diff --git a/spec/frontend/boards/stores/actions_spec.js b/spec/frontend/boards/stores/actions_spec.js
index f3800ce8324..a2961fb1302 100644
--- a/spec/frontend/boards/stores/actions_spec.js
+++ b/spec/frontend/boards/stores/actions_spec.js
@@ -1541,8 +1541,8 @@ describe('addListNewIssue', () => {
it('should add board scope to the issue being created', async () => {
jest.spyOn(gqlClient, 'mutate').mockResolvedValue({
data: {
- createIssue: {
- issue: mockIssue,
+ createIssuable: {
+ issuable: mockIssue,
errors: [],
},
},
@@ -1600,8 +1600,8 @@ describe('addListNewIssue', () => {
it('dispatches a correct set of mutations', () => {
jest.spyOn(gqlClient, 'mutate').mockResolvedValue({
data: {
- createIssue: {
- issue: mockIssue,
+ createIssuable: {
+ issuable: mockIssue,
errors: [],
},
},
diff --git a/spec/frontend/branches/components/__snapshots__/delete_merged_branches_spec.js.snap b/spec/frontend/branches/components/__snapshots__/delete_merged_branches_spec.js.snap
index 9db6a523dec..4da56a865d5 100644
--- a/spec/frontend/branches/components/__snapshots__/delete_merged_branches_spec.js.snap
+++ b/spec/frontend/branches/components/__snapshots__/delete_merged_branches_spec.js.snap
@@ -5,7 +5,6 @@ exports[`Delete merged branches component Delete merged branches confirmation mo
<gl-base-dropdown-stub
category="tertiary"
class="gl-disclosure-dropdown gl-display-none gl-md-display-block!"
- data-qa-selector="delete_merged_branches_dropdown_button"
icon="ellipsis_v"
nocaret="true"
offset="[object Object]"
@@ -34,7 +33,7 @@ exports[`Delete merged branches component Delete merged branches confirmation mo
<b-button-stub
class="gl-display-block gl-md-display-none! gl-button btn-danger-secondary"
- data-qa-selector="delete_merged_branches_button"
+ data-testid="delete-merged-branches-button"
size="md"
tag="button"
type="button"
@@ -100,7 +99,6 @@ exports[`Delete merged branches component Delete merged branches confirmation mo
aria-labelledby="input-label"
autocomplete="off"
class="gl-form-input gl-mt-2 gl-form-input-sm"
- data-qa-selector="delete_merged_branches_input"
debounce="0"
formatter="[Function]"
type="text"
@@ -146,7 +144,6 @@ exports[`Delete merged branches component Delete merged branches confirmation mo
<b-button-stub
class="gl-button"
- data-qa-selector="delete_merged_branches_confirmation_button"
data-testid="delete-merged-branches-confirmation-button"
disabled="true"
size="md"
diff --git a/spec/frontend/branches/components/delete_merged_branches_spec.js b/spec/frontend/branches/components/delete_merged_branches_spec.js
index 3e47e76622d..3319ed13004 100644
--- a/spec/frontend/branches/components/delete_merged_branches_spec.js
+++ b/spec/frontend/branches/components/delete_merged_branches_spec.js
@@ -37,7 +37,7 @@ const createComponent = (mountFn = shallowMountExtended, stubs = {}) => {
};
const findDeleteButton = () =>
- wrapper.findComponent('[data-qa-selector="delete_merged_branches_button"]');
+ wrapper.findComponent('[data-testid="delete-merged-branches-button"]');
const findModal = () => wrapper.findComponent(GlModal);
const findConfirmationButton = () =>
wrapper.findByTestId('delete-merged-branches-confirmation-button');
diff --git a/spec/frontend/ci/ci_variable_list/components/ci_environments_dropdown_spec.js b/spec/frontend/ci/ci_variable_list/components/ci_environments_dropdown_spec.js
index 1937e3b34b7..64227872af3 100644
--- a/spec/frontend/ci/ci_variable_list/components/ci_environments_dropdown_spec.js
+++ b/spec/frontend/ci/ci_variable_list/components/ci_environments_dropdown_spec.js
@@ -1,4 +1,10 @@
-import { GlListboxItem, GlCollapsibleListbox, GlDropdownItem, GlIcon } from '@gitlab/ui';
+import {
+ GlListboxItem,
+ GlCollapsibleListbox,
+ GlDropdownDivider,
+ GlDropdownItem,
+ GlIcon,
+} from '@gitlab/ui';
import { mountExtended } from 'helpers/vue_test_utils_helper';
import { allEnvironments, ENVIRONMENT_QUERY_LIMIT } from '~/ci/ci_variable_list/constants';
import CiEnvironmentsDropdown from '~/ci/ci_variable_list/components/ci_environments_dropdown.vue';
@@ -10,6 +16,7 @@ describe('Ci environments dropdown', () => {
const defaultProps = {
areEnvironmentsLoading: false,
environments: envs,
+ hasEnvScopeQuery: false,
selectedEnvironmentScope: '',
};
@@ -19,19 +26,15 @@ describe('Ci environments dropdown', () => {
const findListbox = () => wrapper.findComponent(GlCollapsibleListbox);
const findListboxText = () => findListbox().props('toggleText');
const findCreateWildcardButton = () => wrapper.findComponent(GlDropdownItem);
+ const findDropdownDivider = () => wrapper.findComponent(GlDropdownDivider);
const findMaxEnvNote = () => wrapper.findByTestId('max-envs-notice');
- const createComponent = ({ props = {}, searchTerm = '', enableFeatureFlag = false } = {}) => {
+ const createComponent = ({ props = {}, searchTerm = '' } = {}) => {
wrapper = mountExtended(CiEnvironmentsDropdown, {
propsData: {
...defaultProps,
...props,
},
- provide: {
- glFeatures: {
- ciLimitEnvironmentScope: enableFeatureFlag,
- },
- },
});
findListbox().vm.$emit('search', searchTerm);
@@ -42,6 +45,10 @@ describe('Ci environments dropdown', () => {
createComponent({ searchTerm: 'stable' });
});
+ it('renders dropdown divider', () => {
+ expect(findDropdownDivider().exists()).toBe(true);
+ });
+
it('renders create button with search term if environments do not contain search term', () => {
const button = findCreateWildcardButton();
expect(button.exists()).toBe(true);
@@ -51,14 +58,14 @@ describe('Ci environments dropdown', () => {
describe('Search term is empty', () => {
describe.each`
- featureFlag | flagStatus | defaultEnvStatus | firstItemValue | envIndices
- ${true} | ${'enabled'} | ${'prepends'} | ${'*'} | ${[1, 2, 3]}
- ${false} | ${'disabled'} | ${'does not prepend'} | ${envs[0]} | ${[0, 1, 2]}
+ hasEnvScopeQuery | status | defaultEnvStatus | firstItemValue | envIndices
+ ${true} | ${'exists'} | ${'prepends'} | ${'*'} | ${[1, 2, 3]}
+ ${false} | ${'does not exist'} | ${'does not prepend'} | ${envs[0]} | ${[0, 1, 2]}
`(
- 'when ciLimitEnvironmentScope feature flag is $flagStatus',
- ({ featureFlag, defaultEnvStatus, firstItemValue, envIndices }) => {
+ 'when query for fetching environment scope $status',
+ ({ defaultEnvStatus, firstItemValue, hasEnvScopeQuery, envIndices }) => {
beforeEach(() => {
- createComponent({ props: { environments: envs }, enableFeatureFlag: featureFlag });
+ createComponent({ props: { environments: envs, hasEnvScopeQuery } });
});
it(`${defaultEnvStatus} * in listbox`, () => {
@@ -91,7 +98,7 @@ describe('Ci environments dropdown', () => {
});
});
- describe('When ciLimitEnvironmentScope feature flag is disabled', () => {
+ describe('when environments are not fetched via graphql', () => {
const currentEnv = envs[2];
beforeEach(() => {
@@ -118,11 +125,15 @@ describe('Ci environments dropdown', () => {
});
});
- describe('When ciLimitEnvironmentScope feature flag is enabled', () => {
+ describe('when fetching environments via graphql', () => {
const currentEnv = envs[2];
beforeEach(() => {
- createComponent({ enableFeatureFlag: true });
+ createComponent({ props: { hasEnvScopeQuery: true } });
+ });
+
+ it('renders dropdown divider', () => {
+ expect(findDropdownDivider().exists()).toBe(true);
});
it('renders environments passed down to it', async () => {
@@ -131,6 +142,22 @@ describe('Ci environments dropdown', () => {
expect(findAllListboxItems()).toHaveLength(envs.length);
});
+ it('renders dropdown loading icon while fetch query is loading', () => {
+ createComponent({ props: { areEnvironmentsLoading: true, hasEnvScopeQuery: true } });
+
+ expect(findListbox().props('loading')).toBe(true);
+ expect(findListbox().props('searching')).toBe(false);
+ expect(findDropdownDivider().exists()).toBe(false);
+ });
+
+ it('renders search loading icon while search query is loading and dropdown is open', async () => {
+ createComponent({ props: { areEnvironmentsLoading: true, hasEnvScopeQuery: true } });
+ await findListbox().vm.$emit('shown');
+
+ expect(findListbox().props('loading')).toBe(false);
+ expect(findListbox().props('searching')).toBe(true);
+ });
+
it('emits event when searching', async () => {
expect(wrapper.emitted('search-environment-scope')).toHaveLength(1);
@@ -140,12 +167,6 @@ describe('Ci environments dropdown', () => {
expect(wrapper.emitted('search-environment-scope')[1]).toEqual([currentEnv]);
});
- it('renders loading icon while search query is loading', () => {
- createComponent({ enableFeatureFlag: true, props: { areEnvironmentsLoading: true } });
-
- expect(findListbox().props('searching')).toBe(true);
- });
-
it('displays note about max environments shown', () => {
expect(findMaxEnvNote().exists()).toBe(true);
expect(findMaxEnvNote().text()).toContain(String(ENVIRONMENT_QUERY_LIMIT));
diff --git a/spec/frontend/ci/ci_variable_list/components/ci_group_variables_spec.js b/spec/frontend/ci/ci_variable_list/components/ci_group_variables_spec.js
index 7436210fe70..b364f098a3a 100644
--- a/spec/frontend/ci/ci_variable_list/components/ci_group_variables_spec.js
+++ b/spec/frontend/ci/ci_variable_list/components/ci_group_variables_spec.js
@@ -9,15 +9,13 @@ import {
DELETE_MUTATION_ACTION,
UPDATE_MUTATION_ACTION,
} from '~/ci/ci_variable_list/constants';
+import getGroupEnvironments from '~/ci/ci_variable_list/graphql/queries/group_environments.query.graphql';
import getGroupVariables from '~/ci/ci_variable_list/graphql/queries/group_variables.query.graphql';
import addGroupVariable from '~/ci/ci_variable_list/graphql/mutations/group_add_variable.mutation.graphql';
import deleteGroupVariable from '~/ci/ci_variable_list/graphql/mutations/group_delete_variable.mutation.graphql';
import updateGroupVariable from '~/ci/ci_variable_list/graphql/mutations/group_update_variable.mutation.graphql';
const mockProvide = {
- glFeatures: {
- groupScopedCiVariables: false,
- },
groupPath: '/group',
groupId: 12,
};
@@ -27,9 +25,16 @@ describe('Ci Group Variable wrapper', () => {
const findCiShared = () => wrapper.findComponent(ciVariableShared);
- const createComponent = ({ provide = {} } = {}) => {
+ const createComponent = ({ featureFlags } = {}) => {
wrapper = shallowMount(ciGroupVariables, {
- provide: { ...mockProvide, ...provide },
+ provide: {
+ ...mockProvide,
+ glFeatures: {
+ ciGroupEnvScopeGraphql: false,
+ groupScopedCiVariables: false,
+ ...featureFlags,
+ },
+ },
});
};
@@ -62,10 +67,10 @@ describe('Ci Group Variable wrapper', () => {
});
});
- describe('feature flag', () => {
+ describe('groupScopedCiVariables feature flag', () => {
describe('When enabled', () => {
beforeEach(() => {
- createComponent({ provide: { glFeatures: { groupScopedCiVariables: true } } });
+ createComponent({ featureFlags: { groupScopedCiVariables: true } });
});
it('Passes down `true` to variable shared component', () => {
@@ -75,7 +80,7 @@ describe('Ci Group Variable wrapper', () => {
describe('When disabled', () => {
beforeEach(() => {
- createComponent({ provide: { glFeatures: { groupScopedCiVariables: false } } });
+ createComponent();
});
it('Passes down `false` to variable shared component', () => {
@@ -83,4 +88,26 @@ describe('Ci Group Variable wrapper', () => {
});
});
});
+
+ describe('ciGroupEnvScopeGraphql feature flag', () => {
+ describe('When enabled', () => {
+ beforeEach(() => {
+ createComponent({ featureFlags: { ciGroupEnvScopeGraphql: true } });
+ });
+
+ it('Passes down environments query to variable shared component', () => {
+ expect(findCiShared().props('queryData').environments.query).toBe(getGroupEnvironments);
+ });
+ });
+
+ describe('When disabled', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('Does not pass down environments query to variable shared component', () => {
+ expect(findCiShared().props('queryData').environments).toBe(undefined);
+ });
+ });
+ });
});
diff --git a/spec/frontend/ci/ci_variable_list/components/ci_variable_modal_spec.js b/spec/frontend/ci/ci_variable_list/components/ci_variable_modal_spec.js
index e9484cfce57..d843646df16 100644
--- a/spec/frontend/ci/ci_variable_list/components/ci_variable_modal_spec.js
+++ b/spec/frontend/ci/ci_variable_list/components/ci_variable_modal_spec.js
@@ -48,6 +48,7 @@ describe('Ci variable modal', () => {
areScopedVariablesAvailable: true,
environments: [],
hideEnvironmentScope: false,
+ hasEnvScopeQuery: false,
mode: ADD_VARIABLE_ACTION,
selectedVariable: {},
variables: [],
@@ -349,14 +350,14 @@ describe('Ci variable modal', () => {
expect(link.attributes('href')).toBe(defaultProvide.environmentScopeLink);
});
- describe('when feature flag is enabled', () => {
+ describe('when query for envioronment scope exists', () => {
beforeEach(() => {
createComponent({
props: {
environments: mockEnvs,
+ hasEnvScopeQuery: true,
variables: mockVariablesWithUniqueScopes(projectString),
},
- provide: { glFeatures: { ciLimitEnvironmentScope: true } },
});
});
diff --git a/spec/frontend/ci/ci_variable_list/components/ci_variable_settings_spec.js b/spec/frontend/ci/ci_variable_list/components/ci_variable_settings_spec.js
index 12ca9a78369..d72cfc5fc14 100644
--- a/spec/frontend/ci/ci_variable_list/components/ci_variable_settings_spec.js
+++ b/spec/frontend/ci/ci_variable_list/components/ci_variable_settings_spec.js
@@ -21,6 +21,7 @@ describe('Ci variable table', () => {
environments: mapEnvironmentNames(mockEnvs),
hideEnvironmentScope: false,
isLoading: false,
+ hasEnvScopeQuery: false,
maxVariableLimit: 5,
pageInfo: { after: '' },
variables: mockVariablesWithScopes(projectString),
@@ -60,6 +61,7 @@ describe('Ci variable table', () => {
areEnvironmentsLoading: defaultProps.areEnvironmentsLoading,
areScopedVariablesAvailable: defaultProps.areScopedVariablesAvailable,
environments: defaultProps.environments,
+ hasEnvScopeQuery: defaultProps.hasEnvScopeQuery,
hideEnvironmentScope: defaultProps.hideEnvironmentScope,
variables: defaultProps.variables,
mode: ADD_VARIABLE_ACTION,
diff --git a/spec/frontend/ci/ci_variable_list/components/ci_variable_shared_spec.js b/spec/frontend/ci/ci_variable_list/components/ci_variable_shared_spec.js
index f7b90c3da30..6fa1915f3c1 100644
--- a/spec/frontend/ci/ci_variable_list/components/ci_variable_shared_spec.js
+++ b/spec/frontend/ci/ci_variable_list/components/ci_variable_shared_spec.js
@@ -52,6 +52,7 @@ const mockProvide = {
const defaultProps = {
areScopedVariablesAvailable: true,
+ hasEnvScopeQuery: false,
pageInfo: {},
hideEnvironmentScope: false,
refetchAfterMutation: false,
@@ -219,16 +220,12 @@ describe('Ci Variable Shared Component', () => {
expect(mockEnvironments).toHaveBeenCalled();
});
- describe('when Limit Environment Scope FF is enabled', () => {
+ // applies only to project-level CI variables
+ describe('when environment scope is limited', () => {
beforeEach(async () => {
await createComponentWithApollo({
props: { ...createProjectProps() },
- provide: {
- glFeatures: {
- ciLimitEnvironmentScope: true,
- ciVariablesPages: isVariablePagesEnabled,
- },
- },
+ provide: pagesFeatureFlagProvide,
});
});
@@ -251,26 +248,11 @@ describe('Ci Variable Shared Component', () => {
expect.objectContaining({ search: 'staging' }),
);
});
- });
-
- describe('when Limit Environment Scope FF is disabled', () => {
- beforeEach(async () => {
- await createComponentWithApollo({
- props: { ...createProjectProps() },
- provide: pagesFeatureFlagProvide,
- });
- });
- it('initial query is called with the correct variables', () => {
- expect(mockEnvironments).toHaveBeenCalledWith({ fullPath: '/namespace/project/' });
- });
+ it('does not show loading icon in table while searching for environments', () => {
+ findCiSettings().vm.$emit('search-environment-scope', 'staging');
- it(`does not refetch environments when search term is present`, async () => {
- expect(mockEnvironments).toHaveBeenCalledTimes(1);
-
- await findCiSettings().vm.$emit('search-environment-scope', 'staging');
-
- expect(mockEnvironments).toHaveBeenCalledTimes(1);
+ expect(findLoadingIcon().exists()).toBe(false);
});
});
});
@@ -532,6 +514,7 @@ describe('Ci Variable Shared Component', () => {
areEnvironmentsLoading: false,
areScopedVariablesAvailable: wrapper.props().areScopedVariablesAvailable,
hideEnvironmentScope: defaultProps.hideEnvironmentScope,
+ hasEnvScopeQuery: props.hasEnvScopeQuery,
pageInfo: defaultProps.pageInfo,
isLoading: false,
maxVariableLimit,
diff --git a/spec/frontend/ci/ci_variable_list/mocks.js b/spec/frontend/ci/ci_variable_list/mocks.js
index 9c9c99ad5ea..41dfc0ebfda 100644
--- a/spec/frontend/ci/ci_variable_list/mocks.js
+++ b/spec/frontend/ci/ci_variable_list/mocks.js
@@ -189,6 +189,7 @@ export const createProjectProps = () => {
componentName: 'ProjectVariable',
entity: 'project',
fullPath: '/namespace/project/',
+ hasEnvScopeQuery: true,
id: 'gid://gitlab/Project/20',
mutationData: {
[ADD_MUTATION_ACTION]: addProjectVariable,
@@ -213,6 +214,7 @@ export const createGroupProps = () => {
componentName: 'GroupVariable',
entity: 'group',
fullPath: '/my-group',
+ hasEnvScopeQuery: false,
id: 'gid://gitlab/Group/20',
mutationData: {
[ADD_MUTATION_ACTION]: addGroupVariable,
@@ -231,6 +233,7 @@ export const createGroupProps = () => {
export const createInstanceProps = () => {
return {
componentName: 'InstanceVariable',
+ hasEnvScopeQuery: false,
entity: '',
mutationData: {
[ADD_MUTATION_ACTION]: addAdminVariable,
diff --git a/spec/frontend/ci/pipeline_editor/components/commit/commit_section_spec.js b/spec/frontend/ci/pipeline_editor/components/commit/commit_section_spec.js
index 8834231aaef..7a9b4ffdce8 100644
--- a/spec/frontend/ci/pipeline_editor/components/commit/commit_section_spec.js
+++ b/spec/frontend/ci/pipeline_editor/components/commit/commit_section_spec.js
@@ -17,7 +17,8 @@ import {
import { resolvers } from '~/ci/pipeline_editor/graphql/resolvers';
import commitCreate from '~/ci/pipeline_editor/graphql/mutations/commit_ci_file.mutation.graphql';
import getCurrentBranch from '~/ci/pipeline_editor/graphql/queries/client/current_branch.query.graphql';
-import updatePipelineEtag from '~/ci/pipeline_editor/graphql/mutations/client/update_pipeline_etag.mutation.graphql';
+import getPipelineEtag from '~/ci/pipeline_editor/graphql/queries/client/pipeline_etag.query.graphql';
+
import {
mockCiConfigPath,
mockCiYml,
@@ -253,18 +254,20 @@ describe('Pipeline Editor | Commit section', () => {
describe('when the commit returns a different etag path', () => {
beforeEach(async () => {
createComponentWithApollo();
- jest.spyOn(wrapper.vm.$apollo, 'mutate');
+ jest.spyOn(mockApollo.clients.defaultClient.cache, 'writeQuery');
+
mockMutateCommitData.mockResolvedValue(mockCommitCreateResponseNewEtag);
await submitCommit();
});
- it('calls the client mutation to update the etag', () => {
- // 1:Commit submission, 2:etag update, 3:currentBranch update, 4:lastCommit update
- expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledTimes(4);
- expect(wrapper.vm.$apollo.mutate).toHaveBeenNthCalledWith(2, {
- mutation: updatePipelineEtag,
- variables: {
- pipelineEtag: mockCommitCreateResponseNewEtag.data.commitCreate.commitPipelinePath,
+ it('calls the client mutation to update the etag in the cache', () => {
+ expect(mockApollo.clients.defaultClient.cache.writeQuery).toHaveBeenCalledWith({
+ query: getPipelineEtag,
+ data: {
+ etags: {
+ __typename: 'EtagValues',
+ pipeline: mockCommitCreateResponseNewEtag.data.commitCreate.commitPipelinePath,
+ },
},
});
});
diff --git a/spec/frontend/ci/pipeline_editor/components/job_assistant_drawer/accordion_items/rules_item_spec.js b/spec/frontend/ci/pipeline_editor/components/job_assistant_drawer/accordion_items/rules_item_spec.js
index edaa96a197a..d40499fae87 100644
--- a/spec/frontend/ci/pipeline_editor/components/job_assistant_drawer/accordion_items/rules_item_spec.js
+++ b/spec/frontend/ci/pipeline_editor/components/job_assistant_drawer/accordion_items/rules_item_spec.js
@@ -49,32 +49,36 @@ describe('Rules item', () => {
findRulesWhenSelect().vm.$emit('input', dummyRulesWhen);
- expect(wrapper.emitted('update-job')).toHaveLength(1);
+ expect(wrapper.emitted('update-job')).toHaveLength(2);
expect(wrapper.emitted('update-job')[0]).toEqual([
'rules[0].when',
JOB_RULES_WHEN.delayed.value,
]);
+ expect(wrapper.emitted('update-job')[1]).toEqual([
+ 'rules[0].start_in',
+ `1 ${JOB_RULES_START_IN.second.value}`,
+ ]);
findRulesStartInNumberInput().vm.$emit('input', dummyRulesStartInNumber);
- expect(wrapper.emitted('update-job')).toHaveLength(2);
- expect(wrapper.emitted('update-job')[1]).toEqual([
+ expect(wrapper.emitted('update-job')).toHaveLength(3);
+ expect(wrapper.emitted('update-job')[2]).toEqual([
'rules[0].start_in',
`2 ${JOB_RULES_START_IN.second.value}s`,
]);
findRulesStartInUnitSelect().vm.$emit('input', dummyRulesStartInUnit);
- expect(wrapper.emitted('update-job')).toHaveLength(3);
- expect(wrapper.emitted('update-job')[2]).toEqual([
+ expect(wrapper.emitted('update-job')).toHaveLength(4);
+ expect(wrapper.emitted('update-job')[3]).toEqual([
'rules[0].start_in',
`2 ${dummyRulesStartInUnit}s`,
]);
findRulesAllowFailureCheckBox().vm.$emit('input', dummyRulesAllowFailure);
- expect(wrapper.emitted('update-job')).toHaveLength(4);
- expect(wrapper.emitted('update-job')[3]).toEqual([
+ expect(wrapper.emitted('update-job')).toHaveLength(5);
+ expect(wrapper.emitted('update-job')[4]).toEqual([
'rules[0].allow_failure',
dummyRulesAllowFailure,
]);
diff --git a/spec/frontend/ci/pipeline_schedules/components/pipeline_schedules_form_spec.js b/spec/frontend/ci/pipeline_schedules/components/pipeline_schedules_form_spec.js
index 639c2dbef4c..bb48d4dc38d 100644
--- a/spec/frontend/ci/pipeline_schedules/components/pipeline_schedules_form_spec.js
+++ b/spec/frontend/ci/pipeline_schedules/components/pipeline_schedules_form_spec.js
@@ -1,14 +1,47 @@
import MockAdapter from 'axios-mock-adapter';
-import { GlForm } from '@gitlab/ui';
-import { nextTick } from 'vue';
+import { GlForm, GlLoadingIcon } from '@gitlab/ui';
+import Vue, { nextTick } from 'vue';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
import { shallowMountExtended, mountExtended } from 'helpers/vue_test_utils_helper';
+import waitForPromises from 'helpers/wait_for_promises';
import axios from '~/lib/utils/axios_utils';
+import { visitUrl } from '~/lib/utils/url_utility';
+import { createAlert } from '~/alert';
import PipelineSchedulesForm from '~/ci/pipeline_schedules/components/pipeline_schedules_form.vue';
import RefSelector from '~/ref/components/ref_selector.vue';
import { REF_TYPE_BRANCHES, REF_TYPE_TAGS } from '~/ref/constants';
import TimezoneDropdown from '~/vue_shared/components/timezone_dropdown/timezone_dropdown.vue';
import IntervalPatternInput from '~/pages/projects/pipeline_schedules/shared/components/interval_pattern_input.vue';
+import createPipelineScheduleMutation from '~/ci/pipeline_schedules/graphql/mutations/create_pipeline_schedule.mutation.graphql';
+import updatePipelineScheduleMutation from '~/ci/pipeline_schedules/graphql/mutations/update_pipeline_schedule.mutation.graphql';
+import getPipelineSchedulesQuery from '~/ci/pipeline_schedules/graphql/queries/get_pipeline_schedules.query.graphql';
import { timezoneDataFixture } from '../../../vue_shared/components/timezone_dropdown/helpers';
+import {
+ createScheduleMutationResponse,
+ updateScheduleMutationResponse,
+ mockSinglePipelineScheduleNode,
+} from '../mock_data';
+
+Vue.use(VueApollo);
+
+jest.mock('~/alert');
+jest.mock('~/lib/utils/url_utility', () => ({
+ visitUrl: jest.fn(),
+ joinPaths: jest.fn().mockReturnValue(''),
+ queryToObject: jest.fn().mockReturnValue({ id: '1' }),
+}));
+
+const {
+ data: {
+ project: {
+ pipelineSchedules: { nodes },
+ },
+ },
+} = mockSinglePipelineScheduleNode;
+
+const schedule = nodes[0];
+const variables = schedule.variables.nodes;
describe('Pipeline schedules form', () => {
let wrapper;
@@ -17,22 +50,36 @@ describe('Pipeline schedules form', () => {
const cron = '';
const dailyLimit = '';
- const createComponent = (mountFn = shallowMountExtended, stubs = {}) => {
+ const querySuccessHandler = jest.fn().mockResolvedValue(mockSinglePipelineScheduleNode);
+ const queryFailedHandler = jest.fn().mockRejectedValue(new Error('GraphQL error'));
+
+ const createMutationHandlerSuccess = jest.fn().mockResolvedValue(createScheduleMutationResponse);
+ const createMutationHandlerFailed = jest.fn().mockRejectedValue(new Error('GraphQL error'));
+ const updateMutationHandlerSuccess = jest.fn().mockResolvedValue(updateScheduleMutationResponse);
+ const updateMutationHandlerFailed = jest.fn().mockRejectedValue(new Error('GraphQL error'));
+
+ const createMockApolloProvider = (
+ requestHandlers = [[createPipelineScheduleMutation, createMutationHandlerSuccess]],
+ ) => {
+ return createMockApollo(requestHandlers);
+ };
+
+ const createComponent = (mountFn = shallowMountExtended, editing = false, requestHandlers) => {
wrapper = mountFn(PipelineSchedulesForm, {
propsData: {
timezoneData: timezoneDataFixture,
refParam: 'master',
+ editing,
},
provide: {
fullPath: 'gitlab-org/gitlab',
projectId,
defaultBranch,
- cron,
- cronTimezone: '',
dailyLimit,
settingsLink: '',
+ schedulesPath: '/root/ci-project/-/pipeline_schedules',
},
- stubs,
+ apolloProvider: createMockApolloProvider(requestHandlers),
});
};
@@ -43,17 +90,24 @@ describe('Pipeline schedules form', () => {
const findRefSelector = () => wrapper.findComponent(RefSelector);
const findSubmitButton = () => wrapper.findByTestId('schedule-submit-button');
const findCancelButton = () => wrapper.findByTestId('schedule-cancel-button');
+ const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
// Variables
const findVariableRows = () => wrapper.findAllByTestId('ci-variable-row');
const findKeyInputs = () => wrapper.findAllByTestId('pipeline-form-ci-variable-key');
const findValueInputs = () => wrapper.findAllByTestId('pipeline-form-ci-variable-value');
const findRemoveIcons = () => wrapper.findAllByTestId('remove-ci-variable-row');
- beforeEach(() => {
- createComponent();
- });
+ const addVariableToForm = () => {
+ const input = findKeyInputs().at(0);
+ input.element.value = 'test_var_2';
+ input.trigger('change');
+ };
describe('Form elements', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
it('displays form', () => {
expect(findForm().exists()).toBe(true);
});
@@ -102,19 +156,16 @@ describe('Pipeline schedules form', () => {
it('displays the submit and cancel buttons', () => {
expect(findSubmitButton().exists()).toBe(true);
expect(findCancelButton().exists()).toBe(true);
+ expect(findCancelButton().attributes('href')).toBe('/root/ci-project/-/pipeline_schedules');
});
});
describe('CI variables', () => {
let mock;
- const addVariableToForm = () => {
- const input = findKeyInputs().at(0);
- input.element.value = 'test_var_2';
- input.trigger('change');
- };
-
beforeEach(() => {
+ // mock is needed when we fully mount
+ // downstream components request needs to be mocked
mock = new MockAdapter(axios);
createComponent(mountExtended);
});
@@ -157,4 +208,229 @@ describe('Pipeline schedules form', () => {
expect(findVariableRows()).toHaveLength(1);
});
});
+
+ describe('Button text', () => {
+ it.each`
+ editing | expectedText
+ ${true} | ${'Edit pipeline schedule'}
+ ${false} | ${'Create pipeline schedule'}
+ `(
+ 'button text is $expectedText when editing is $editing',
+ async ({ editing, expectedText }) => {
+ createComponent(shallowMountExtended, editing, [
+ [getPipelineSchedulesQuery, querySuccessHandler],
+ ]);
+
+ await waitForPromises();
+
+ expect(findSubmitButton().text()).toBe(expectedText);
+ },
+ );
+ });
+
+ describe('Schedule creation', () => {
+ it('when creating a schedule the query is not called', () => {
+ createComponent();
+
+ expect(querySuccessHandler).not.toHaveBeenCalled();
+ });
+
+ it('does not show loading state when creating new schedule', () => {
+ createComponent();
+
+ expect(findLoadingIcon().exists()).toBe(false);
+ });
+
+ describe('schedule creation success', () => {
+ let mock;
+
+ beforeEach(() => {
+ // mock is needed when we fully mount
+ // downstream components request needs to be mocked
+ mock = new MockAdapter(axios);
+ createComponent(mountExtended);
+ });
+
+ afterEach(() => {
+ mock.restore();
+ });
+
+ it('creates pipeline schedule', async () => {
+ findDescription().element.value = 'My schedule';
+ findDescription().trigger('change');
+
+ findTimezoneDropdown().vm.$emit('input', {
+ formattedTimezone: '[UTC-4] Eastern Time (US & Canada)',
+ identifier: 'America/New_York',
+ });
+
+ findIntervalComponent().vm.$emit('cronValue', '0 16 * * *');
+
+ addVariableToForm();
+
+ findSubmitButton().vm.$emit('click');
+
+ await waitForPromises();
+
+ expect(createMutationHandlerSuccess).toHaveBeenCalledWith({
+ input: {
+ active: true,
+ cron: '0 16 * * *',
+ cronTimezone: 'America/New_York',
+ description: 'My schedule',
+ projectPath: 'gitlab-org/gitlab',
+ ref: 'main',
+ variables: [
+ {
+ key: 'test_var_2',
+ value: '',
+ variableType: 'ENV_VAR',
+ },
+ ],
+ },
+ });
+ expect(visitUrl).toHaveBeenCalledWith('/root/ci-project/-/pipeline_schedules');
+ expect(createAlert).not.toHaveBeenCalled();
+ });
+ });
+
+ describe('schedule creation failure', () => {
+ beforeEach(() => {
+ createComponent(shallowMountExtended, false, [
+ [createPipelineScheduleMutation, createMutationHandlerFailed],
+ ]);
+ });
+
+ it('shows error for failed pipeline schedule creation', async () => {
+ findSubmitButton().vm.$emit('click');
+
+ await waitForPromises();
+
+ expect(createAlert).toHaveBeenCalledWith({
+ message: 'An error occurred while creating the pipeline schedule.',
+ });
+ });
+ });
+ });
+
+ describe('Schedule editing', () => {
+ let mock;
+
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+ });
+
+ afterEach(() => {
+ mock.restore();
+ });
+
+ it('shows loading state when editing', async () => {
+ createComponent(shallowMountExtended, true, [
+ [getPipelineSchedulesQuery, querySuccessHandler],
+ ]);
+
+ expect(findLoadingIcon().exists()).toBe(true);
+
+ await waitForPromises();
+
+ expect(findLoadingIcon().exists()).toBe(false);
+ });
+
+ describe('schedule fetch success', () => {
+ it('fetches schedule and sets form data correctly', async () => {
+ createComponent(mountExtended, true, [[getPipelineSchedulesQuery, querySuccessHandler]]);
+
+ expect(querySuccessHandler).toHaveBeenCalled();
+
+ await waitForPromises();
+
+ expect(findDescription().element.value).toBe(schedule.description);
+ expect(findIntervalComponent().props('initialCronInterval')).toBe(schedule.cron);
+ expect(findTimezoneDropdown().props('value')).toBe(schedule.cronTimezone);
+ expect(findRefSelector().props('value')).toBe(schedule.ref);
+ expect(findVariableRows()).toHaveLength(3);
+ expect(findKeyInputs().at(0).element.value).toBe(variables[0].key);
+ expect(findKeyInputs().at(1).element.value).toBe(variables[1].key);
+ expect(findValueInputs().at(0).element.value).toBe(variables[0].value);
+ expect(findValueInputs().at(1).element.value).toBe(variables[1].value);
+ });
+ });
+
+ it('schedule fetch failure', async () => {
+ createComponent(shallowMountExtended, true, [
+ [getPipelineSchedulesQuery, queryFailedHandler],
+ ]);
+
+ await waitForPromises();
+
+ expect(createAlert).toHaveBeenCalledWith({
+ message: 'An error occurred while trying to fetch the pipeline schedule.',
+ });
+ });
+
+ it('edit schedule success', async () => {
+ createComponent(mountExtended, true, [
+ [getPipelineSchedulesQuery, querySuccessHandler],
+ [updatePipelineScheduleMutation, updateMutationHandlerSuccess],
+ ]);
+
+ await waitForPromises();
+
+ findDescription().element.value = 'Updated schedule';
+ findDescription().trigger('change');
+
+ findIntervalComponent().vm.$emit('cronValue', '0 22 16 * *');
+
+ // Ensures variable is sent with destroy property set true
+ findRemoveIcons().at(0).vm.$emit('click');
+
+ findSubmitButton().vm.$emit('click');
+
+ await waitForPromises();
+
+ expect(updateMutationHandlerSuccess).toHaveBeenCalledWith({
+ input: {
+ active: schedule.active,
+ cron: '0 22 16 * *',
+ cronTimezone: schedule.cronTimezone,
+ id: schedule.id,
+ ref: schedule.ref,
+ description: 'Updated schedule',
+ variables: [
+ {
+ destroy: true,
+ id: variables[0].id,
+ key: variables[0].key,
+ value: variables[0].value,
+ variableType: variables[0].variableType,
+ },
+ {
+ destroy: false,
+ id: variables[1].id,
+ key: variables[1].key,
+ value: variables[1].value,
+ variableType: variables[1].variableType,
+ },
+ ],
+ },
+ });
+ });
+
+ it('edit schedule failure', async () => {
+ createComponent(shallowMountExtended, true, [
+ [getPipelineSchedulesQuery, querySuccessHandler],
+ [updatePipelineScheduleMutation, updateMutationHandlerFailed],
+ ]);
+
+ await waitForPromises();
+
+ findSubmitButton().vm.$emit('click');
+
+ await waitForPromises();
+
+ expect(createAlert).toHaveBeenCalledWith({
+ message: 'An error occurred while updating the pipeline schedule.',
+ });
+ });
+ });
});
diff --git a/spec/frontend/ci/pipeline_schedules/components/pipeline_schedules_spec.js b/spec/frontend/ci/pipeline_schedules/components/pipeline_schedules_spec.js
index 50008cedd9c..01a19711264 100644
--- a/spec/frontend/ci/pipeline_schedules/components/pipeline_schedules_spec.js
+++ b/spec/frontend/ci/pipeline_schedules/components/pipeline_schedules_spec.js
@@ -57,6 +57,7 @@ describe('Pipeline schedules app', () => {
wrapper = mountExtended(PipelineSchedules, {
provide: {
fullPath: 'gitlab-org/gitlab',
+ newSchedulePath: '/root/ci-project/-/pipeline_schedules/new',
},
mocks: {
$toast,
@@ -101,6 +102,10 @@ describe('Pipeline schedules app', () => {
expect(findLoadingIcon().exists()).toBe(false);
});
+
+ it('new schedule button links to new schedule path', () => {
+ expect(findNewButton().attributes('href')).toBe('/root/ci-project/-/pipeline_schedules/new');
+ });
});
describe('fetching pipeline schedules', () => {
@@ -146,15 +151,13 @@ describe('Pipeline schedules app', () => {
[deletePipelineScheduleMutation, deleteMutationHandlerSuccess],
]);
- jest.spyOn(wrapper.vm.$apollo.queries.schedules, 'refetch');
-
await waitForPromises();
const scheduleId = mockPipelineScheduleNodes[0].id;
findTable().vm.$emit('showDeleteModal', scheduleId);
- expect(wrapper.vm.$apollo.queries.schedules.refetch).not.toHaveBeenCalled();
+ expect(successHandler).toHaveBeenCalledTimes(1);
findDeleteModal().vm.$emit('deleteSchedule');
@@ -163,7 +166,7 @@ describe('Pipeline schedules app', () => {
expect(deleteMutationHandlerSuccess).toHaveBeenCalledWith({
id: scheduleId,
});
- expect(wrapper.vm.$apollo.queries.schedules.refetch).toHaveBeenCalled();
+ expect(successHandler).toHaveBeenCalledTimes(2);
expect($toast.show).toHaveBeenCalledWith('Pipeline schedule successfully deleted.');
});
@@ -252,15 +255,13 @@ describe('Pipeline schedules app', () => {
[takeOwnershipMutation, takeOwnershipMutationHandlerSuccess],
]);
- jest.spyOn(wrapper.vm.$apollo.queries.schedules, 'refetch');
-
await waitForPromises();
const scheduleId = mockPipelineScheduleNodes[1].id;
findTable().vm.$emit('showTakeOwnershipModal', scheduleId);
- expect(wrapper.vm.$apollo.queries.schedules.refetch).not.toHaveBeenCalled();
+ expect(successHandler).toHaveBeenCalledTimes(1);
findTakeOwnershipModal().vm.$emit('takeOwnership');
@@ -269,7 +270,7 @@ describe('Pipeline schedules app', () => {
expect(takeOwnershipMutationHandlerSuccess).toHaveBeenCalledWith({
id: scheduleId,
});
- expect(wrapper.vm.$apollo.queries.schedules.refetch).toHaveBeenCalled();
+ expect(successHandler).toHaveBeenCalledTimes(2);
expect($toast.show).toHaveBeenCalledWith('Successfully taken ownership from Admin.');
});
@@ -297,7 +298,7 @@ describe('Pipeline schedules app', () => {
describe('pipeline schedule tabs', () => {
beforeEach(async () => {
- createComponent();
+ createComponent([[getPipelineSchedulesQuery, successHandler]]);
await waitForPromises();
});
@@ -315,13 +316,23 @@ describe('Pipeline schedules app', () => {
});
it('should refetch the schedules query on a tab click', async () => {
- jest.spyOn(wrapper.vm.$apollo.queries.schedules, 'refetch').mockImplementation(jest.fn());
-
- expect(wrapper.vm.$apollo.queries.schedules.refetch).toHaveBeenCalledTimes(0);
+ expect(successHandler).toHaveBeenCalledTimes(1);
await findAllTab().trigger('click');
- expect(wrapper.vm.$apollo.queries.schedules.refetch).toHaveBeenCalledTimes(1);
+ expect(successHandler).toHaveBeenCalledTimes(3);
+ });
+
+ it('all tab click should not send scope value with query', async () => {
+ findAllTab().trigger('click');
+
+ await nextTick();
+
+ expect(successHandler).toHaveBeenCalledWith({
+ ids: null,
+ projectPath: 'gitlab-org/gitlab',
+ status: null,
+ });
});
});
diff --git a/spec/frontend/ci/pipeline_schedules/components/table/cells/pipeline_schedule_actions_spec.js b/spec/frontend/ci/pipeline_schedules/components/table/cells/pipeline_schedule_actions_spec.js
index be0052fc7cf..5eca355fcf4 100644
--- a/spec/frontend/ci/pipeline_schedules/components/table/cells/pipeline_schedule_actions_spec.js
+++ b/spec/frontend/ci/pipeline_schedules/components/table/cells/pipeline_schedule_actions_spec.js
@@ -1,6 +1,7 @@
import { GlButton } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import PipelineScheduleActions from '~/ci/pipeline_schedules/components/table/cells/pipeline_schedule_actions.vue';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import {
mockPipelineScheduleNodes,
mockPipelineScheduleCurrentUser,
@@ -28,6 +29,7 @@ describe('Pipeline schedule actions', () => {
const findDeleteBtn = () => wrapper.findByTestId('delete-pipeline-schedule-btn');
const findTakeOwnershipBtn = () => wrapper.findByTestId('take-ownership-pipeline-schedule-btn');
const findPlayScheduleBtn = () => wrapper.findByTestId('play-pipeline-schedule-btn');
+ const findEditScheduleBtn = () => wrapper.findByTestId('edit-pipeline-schedule-btn');
it('displays buttons when user is the owner of schedule and has adminPipelineSchedule permissions', () => {
createComponent();
@@ -76,4 +78,15 @@ describe('Pipeline schedule actions', () => {
playPipelineSchedule: [[mockPipelineScheduleNodes[0].id]],
});
});
+
+ it('edit button links to edit schedule path', () => {
+ createComponent();
+
+ const { schedule } = defaultProps;
+ const id = getIdFromGraphQLId(schedule.id);
+
+ const expectedPath = `${schedule.editPath}?id=${id}`;
+
+ expect(findEditScheduleBtn().attributes('href')).toBe(expectedPath);
+ });
});
diff --git a/spec/frontend/ci/pipeline_schedules/mock_data.js b/spec/frontend/ci/pipeline_schedules/mock_data.js
index 1485f6beea4..0a4f233f199 100644
--- a/spec/frontend/ci/pipeline_schedules/mock_data.js
+++ b/spec/frontend/ci/pipeline_schedules/mock_data.js
@@ -2,6 +2,7 @@
import mockGetPipelineSchedulesGraphQLResponse from 'test_fixtures/graphql/pipeline_schedules/get_pipeline_schedules.query.graphql.json';
import mockGetPipelineSchedulesAsGuestGraphQLResponse from 'test_fixtures/graphql/pipeline_schedules/get_pipeline_schedules.query.graphql.as_guest.json';
import mockGetPipelineSchedulesTakeOwnershipGraphQLResponse from 'test_fixtures/graphql/pipeline_schedules/get_pipeline_schedules.query.graphql.take_ownership.json';
+import mockGetSinglePipelineScheduleGraphQLResponse from 'test_fixtures/graphql/pipeline_schedules/get_pipeline_schedules.query.graphql.single.json';
const {
data: {
@@ -30,15 +31,22 @@ const {
export const mockPipelineScheduleNodes = nodes;
export const mockPipelineScheduleCurrentUser = currentUser;
-
export const mockPipelineScheduleAsGuestNodes = guestNodes;
-
export const mockTakeOwnershipNodes = takeOwnershipNodes;
+export const mockSinglePipelineScheduleNode = mockGetSinglePipelineScheduleGraphQLResponse;
+
export const emptyPipelineSchedulesResponse = {
data: {
+ currentUser: {
+ id: 'gid://gitlab/User/1',
+ username: 'root',
+ },
project: {
id: 'gid://gitlab/Project/1',
- pipelineSchedules: { nodes: [], count: 0 },
+ pipelineSchedules: {
+ count: 0,
+ nodes: [],
+ },
},
},
};
@@ -79,4 +87,24 @@ export const takeOwnershipMutationResponse = {
},
};
+export const createScheduleMutationResponse = {
+ data: {
+ pipelineScheduleCreate: {
+ clientMutationId: null,
+ errors: [],
+ __typename: 'PipelineScheduleCreatePayload',
+ },
+ },
+};
+
+export const updateScheduleMutationResponse = {
+ data: {
+ pipelineScheduleUpdate: {
+ clientMutationId: null,
+ errors: [],
+ __typename: 'PipelineScheduleUpdatePayload',
+ },
+ },
+};
+
export { mockGetPipelineSchedulesGraphQLResponse };
diff --git a/spec/frontend/ci/reports/components/__snapshots__/grouped_issues_list_spec.js.snap b/spec/frontend/ci/reports/components/__snapshots__/grouped_issues_list_spec.js.snap
deleted file mode 100644
index 311a67a3e31..00000000000
--- a/spec/frontend/ci/reports/components/__snapshots__/grouped_issues_list_spec.js.snap
+++ /dev/null
@@ -1,26 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Grouped Issues List renders a smart virtual list with the correct props 1`] = `
-Object {
- "length": 4,
- "remain": 20,
- "rtag": "div",
- "size": 32,
- "wclass": "report-block-list",
- "wtag": "ul",
-}
-`;
-
-exports[`Grouped Issues List with data renders a report item with the correct props 1`] = `
-Object {
- "component": "CodequalityIssueBody",
- "iconComponent": "IssueStatusIcon",
- "isNew": false,
- "issue": Object {
- "name": "foo",
- },
- "showReportSectionStatusIcon": false,
- "status": "none",
- "statusIconSize": 24,
-}
-`;
diff --git a/spec/frontend/ci/reports/components/grouped_issues_list_spec.js b/spec/frontend/ci/reports/components/grouped_issues_list_spec.js
deleted file mode 100644
index 8beec220802..00000000000
--- a/spec/frontend/ci/reports/components/grouped_issues_list_spec.js
+++ /dev/null
@@ -1,83 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import GroupedIssuesList from '~/ci/reports/components/grouped_issues_list.vue';
-import ReportItem from '~/ci/reports/components/report_item.vue';
-import SmartVirtualList from '~/vue_shared/components/smart_virtual_list.vue';
-
-describe('Grouped Issues List', () => {
- let wrapper;
-
- const createComponent = ({ propsData = {}, stubs = {} } = {}) => {
- wrapper = shallowMount(GroupedIssuesList, {
- propsData,
- stubs,
- });
- };
-
- const findHeading = (groupName) => wrapper.find(`[data-testid="${groupName}Heading"`);
-
- it('renders a smart virtual list with the correct props', () => {
- createComponent({
- propsData: {
- resolvedIssues: [{ name: 'foo' }],
- unresolvedIssues: [{ name: 'bar' }],
- },
- stubs: {
- SmartVirtualList,
- },
- });
-
- expect(wrapper.findComponent(SmartVirtualList).props()).toMatchSnapshot();
- });
-
- describe('without data', () => {
- beforeEach(() => {
- createComponent();
- });
-
- it.each(['unresolved', 'resolved'])('does not a render a header for %s issues', (issueName) => {
- expect(findHeading(issueName).exists()).toBe(false);
- });
-
- it.each(['resolved', 'unresolved'])('does not render report items for %s issues', () => {
- expect(wrapper.findComponent(ReportItem).exists()).toBe(false);
- });
- });
-
- describe('with data', () => {
- it.each`
- givenIssues | givenHeading | groupName
- ${[{ name: 'foo issue' }]} | ${'Foo Heading'} | ${'resolved'}
- ${[{ name: 'bar issue' }]} | ${'Bar Heading'} | ${'unresolved'}
- `('renders the heading for $groupName issues', ({ givenIssues, givenHeading, groupName }) => {
- createComponent({
- propsData: { [`${groupName}Issues`]: givenIssues, [`${groupName}Heading`]: givenHeading },
- });
-
- expect(findHeading(groupName).text()).toBe(givenHeading);
- });
-
- it.each(['resolved', 'unresolved'])('renders all %s issues', (issueName) => {
- const issues = [{ name: 'foo' }, { name: 'bar' }];
-
- createComponent({
- propsData: { [`${issueName}Issues`]: issues },
- });
-
- expect(wrapper.findAllComponents(ReportItem)).toHaveLength(issues.length);
- });
-
- it('renders a report item with the correct props', () => {
- createComponent({
- propsData: {
- resolvedIssues: [{ name: 'foo' }],
- component: 'CodequalityIssueBody',
- },
- stubs: {
- ReportItem,
- },
- });
-
- expect(wrapper.findComponent(ReportItem).props()).toMatchSnapshot();
- });
- });
-});
diff --git a/spec/frontend/ci/reports/components/summary_row_spec.js b/spec/frontend/ci/reports/components/summary_row_spec.js
deleted file mode 100644
index b1ae9e26b5b..00000000000
--- a/spec/frontend/ci/reports/components/summary_row_spec.js
+++ /dev/null
@@ -1,63 +0,0 @@
-import { mount } from '@vue/test-utils';
-import { extendedWrapper } from 'helpers/vue_test_utils_helper';
-import HelpPopover from '~/vue_shared/components/help_popover.vue';
-import SummaryRow from '~/ci/reports/components/summary_row.vue';
-
-describe('Summary row', () => {
- let wrapper;
-
- const summary = 'SAST detected 1 new vulnerability and 1 fixed vulnerability';
- const popoverOptions = {
- title: 'Static Application Security Testing (SAST)',
- content: '<a>Learn more about SAST</a>',
- };
- const statusIcon = 'warning';
-
- const createComponent = ({ props = {}, slots = {} } = {}) => {
- wrapper = extendedWrapper(
- mount(SummaryRow, {
- propsData: {
- summary,
- popoverOptions,
- statusIcon,
- ...props,
- },
- slots,
- }),
- );
- };
-
- const findSummary = () => wrapper.findByTestId('summary-row-description');
- const findStatusIcon = () => wrapper.findByTestId('summary-row-icon');
- const findHelpPopover = () => wrapper.findComponent(HelpPopover);
-
- it('renders provided summary', () => {
- createComponent();
- expect(findSummary().text()).toContain(summary);
- });
-
- it('renders provided icon', () => {
- createComponent();
- expect(findStatusIcon().classes()).toContain('js-ci-status-icon-warning');
- });
-
- it('renders help popover if popoverOptions are provided', () => {
- createComponent();
- expect(findHelpPopover().props('options')).toEqual(popoverOptions);
- });
-
- it('does not render help popover if popoverOptions are not provided', () => {
- createComponent({ props: { popoverOptions: null } });
- expect(findHelpPopover().exists()).toBe(false);
- });
-
- describe('summary slot', () => {
- it('replaces the summary prop', () => {
- const summarySlotContent = 'Summary slot content';
- createComponent({ slots: { summary: summarySlotContent } });
-
- expect(wrapper.text()).not.toContain(summary);
- expect(findSummary().text()).toContain(summarySlotContent);
- });
- });
-});
diff --git a/spec/frontend/ci/reports/mock_data/mock_data.js b/spec/frontend/ci/reports/mock_data/mock_data.js
index 2599b0ac365..2983a9f1125 100644
--- a/spec/frontend/ci/reports/mock_data/mock_data.js
+++ b/spec/frontend/ci/reports/mock_data/mock_data.js
@@ -1,3 +1,6 @@
+import { SEVERITIES as SEVERITIES_CODE_QUALITY } from '~/ci/reports/codequality_report/constants';
+import { SEVERITIES as SEVERITIES_SAST } from '~/ci/reports/sast/constants';
+
export const failedIssue = {
result: 'failure',
name: 'Test#sum when a is 1 and b is 2 returns summary',
@@ -36,3 +39,54 @@ export const failedReport = {
},
],
};
+
+export const findingSastInfo = {
+ scale: 'sast',
+ severity: 'info',
+};
+
+export const findingSastInfoEnhanced = {
+ scale: 'sast',
+ severity: 'info',
+ class: SEVERITIES_SAST.info.class,
+ name: SEVERITIES_SAST.info.name,
+};
+
+export const findingsCodeQualityBlocker = {
+ scale: 'codeQuality',
+ severity: 'blocker',
+};
+
+export const findingCodeQualityBlockerEnhanced = {
+ scale: 'codeQuality',
+ severity: 'blocker',
+ class: SEVERITIES_CODE_QUALITY.blocker.class,
+ name: SEVERITIES_CODE_QUALITY.blocker.name,
+};
+
+export const findingCodeQualityInfo = {
+ scale: 'codeQuality',
+ severity: 'info',
+};
+
+export const findingCodeQualityInfoEnhanced = {
+ scale: 'codeQuality',
+ severity: 'info',
+ class: SEVERITIES_CODE_QUALITY.info.class,
+ name: SEVERITIES_CODE_QUALITY.info.name,
+};
+
+export const findingUnknownInfo = {
+ scale: 'codeQuality',
+ severity: 'info',
+};
+
+export const findingUnknownInfoEnhanced = {
+ scale: 'codeQuality',
+ severity: 'info',
+ class: SEVERITIES_CODE_QUALITY.info.class,
+ name: SEVERITIES_CODE_QUALITY.info.name,
+};
+
+export const findingsArray = [findingSastInfo, findingsCodeQualityBlocker];
+export const findingsArrayEnhanced = [findingSastInfoEnhanced, findingCodeQualityBlockerEnhanced];
diff --git a/spec/frontend/ci/reports/utils_spec.js b/spec/frontend/ci/reports/utils_spec.js
new file mode 100644
index 00000000000..e01aa903a97
--- /dev/null
+++ b/spec/frontend/ci/reports/utils_spec.js
@@ -0,0 +1,30 @@
+import { getSeverity } from '~/ci/reports/utils';
+
+import {
+ findingSastInfo,
+ findingSastInfoEnhanced,
+ findingCodeQualityInfo,
+ findingCodeQualityInfoEnhanced,
+ findingUnknownInfo,
+ findingUnknownInfoEnhanced,
+ findingsArray,
+ findingsArrayEnhanced,
+} from './mock_data/mock_data';
+
+describe('getSeverity utility function', () => {
+ it('should enhance finding with sast scale', () => {
+ expect(getSeverity(findingSastInfo)).toEqual(findingSastInfoEnhanced);
+ });
+
+ it('should enhance finding with codequality scale', () => {
+ expect(getSeverity(findingCodeQualityInfo)).toEqual(findingCodeQualityInfoEnhanced);
+ });
+
+ it('should use codeQuality scale when scale is unknown', () => {
+ expect(getSeverity(findingUnknownInfo)).toEqual(findingUnknownInfoEnhanced);
+ });
+
+ it('should correctly enhance an array of findings', () => {
+ expect(getSeverity(findingsArray)).toEqual(findingsArrayEnhanced);
+ });
+});
diff --git a/spec/frontend/ci/runner/admin_runner_show/admin_runner_show_app_spec.js b/spec/frontend/ci/runner/admin_runner_show/admin_runner_show_app_spec.js
index c4ed6d1bdb5..c9349c64bfb 100644
--- a/spec/frontend/ci/runner/admin_runner_show/admin_runner_show_app_spec.js
+++ b/spec/frontend/ci/runner/admin_runner_show/admin_runner_show_app_spec.js
@@ -9,10 +9,8 @@ import { visitUrl } from '~/lib/utils/url_utility';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import RunnerHeader from '~/ci/runner/components/runner_header.vue';
+import RunnerHeaderActions from '~/ci/runner/components/runner_header_actions.vue';
import RunnerDetails from '~/ci/runner/components/runner_details.vue';
-import RunnerPauseButton from '~/ci/runner/components/runner_pause_button.vue';
-import RunnerDeleteButton from '~/ci/runner/components/runner_delete_button.vue';
-import RunnerEditButton from '~/ci/runner/components/runner_edit_button.vue';
import RunnerDetailsTabs from '~/ci/runner/components/runner_details_tabs.vue';
import RunnersJobs from '~/ci/runner/components/runner_jobs.vue';
@@ -46,9 +44,7 @@ describe('AdminRunnerShowApp', () => {
const findRunnerHeader = () => wrapper.findComponent(RunnerHeader);
const findRunnerDetails = () => wrapper.findComponent(RunnerDetails);
- const findRunnerDeleteButton = () => wrapper.findComponent(RunnerDeleteButton);
- const findRunnerEditButton = () => wrapper.findComponent(RunnerEditButton);
- const findRunnerPauseButton = () => wrapper.findComponent(RunnerPauseButton);
+ const findRunnerHeaderActions = () => wrapper.findComponent(RunnerHeaderActions);
const findRunnerDetailsTabs = () => wrapper.findComponent(RunnerDetailsTabs);
const findRunnersJobs = () => wrapper.findComponent(RunnersJobs);
@@ -94,9 +90,10 @@ describe('AdminRunnerShowApp', () => {
});
it('displays the runner edit and pause buttons', () => {
- expect(findRunnerEditButton().attributes('href')).toBe(mockRunner.editAdminUrl);
- expect(findRunnerPauseButton().exists()).toBe(true);
- expect(findRunnerDeleteButton().exists()).toBe(true);
+ expect(findRunnerHeaderActions().props()).toEqual({
+ runner: mockRunner,
+ editPath: mockRunner.editAdminUrl,
+ });
});
it('shows runner details', () => {
@@ -122,54 +119,6 @@ describe('AdminRunnerShowApp', () => {
expect(wrapper.text().replace(/\s+/g, ' ')).toContain(expected);
});
- describe('when runner cannot be updated', () => {
- beforeEach(async () => {
- mockRunnerQueryResult({
- userPermissions: {
- ...mockRunner.userPermissions,
- updateRunner: false,
- },
- });
-
- await createComponent({
- mountFn: mountExtended,
- });
- });
-
- it('does not display the runner edit and pause buttons', () => {
- expect(findRunnerEditButton().exists()).toBe(false);
- expect(findRunnerPauseButton().exists()).toBe(false);
- });
-
- it('displays delete button', () => {
- expect(findRunnerDeleteButton().exists()).toBe(true);
- });
- });
-
- describe('when runner cannot be deleted', () => {
- beforeEach(async () => {
- mockRunnerQueryResult({
- userPermissions: {
- ...mockRunner.userPermissions,
- deleteRunner: false,
- },
- });
-
- await createComponent({
- mountFn: mountExtended,
- });
- });
-
- it('does not display the delete button', () => {
- expect(findRunnerDeleteButton().exists()).toBe(false);
- });
-
- it('displays edit and pause buttons', () => {
- expect(findRunnerEditButton().exists()).toBe(true);
- expect(findRunnerPauseButton().exists()).toBe(true);
- });
- });
-
describe('when runner is deleted', () => {
beforeEach(async () => {
await createComponent({
@@ -178,7 +127,7 @@ describe('AdminRunnerShowApp', () => {
});
it('redirects to the runner list page', () => {
- findRunnerDeleteButton().vm.$emit('deleted', { message: 'Runner deleted' });
+ findRunnerHeaderActions().vm.$emit('deleted', { message: 'Runner deleted' });
expect(saveAlertToLocalStorage).toHaveBeenCalledWith({
message: 'Runner deleted',
@@ -187,23 +136,6 @@ describe('AdminRunnerShowApp', () => {
expect(visitUrl).toHaveBeenCalledWith(mockRunnersPath);
});
});
-
- describe('when runner does not have an edit url', () => {
- beforeEach(async () => {
- mockRunnerQueryResult({
- editAdminUrl: null,
- });
-
- await createComponent({
- mountFn: mountExtended,
- });
- });
-
- it('does not display the runner edit button', () => {
- expect(findRunnerEditButton().exists()).toBe(false);
- expect(findRunnerPauseButton().exists()).toBe(true);
- });
- });
});
describe('When loading', () => {
diff --git a/spec/frontend/ci/runner/admin_runners/admin_runners_app_spec.js b/spec/frontend/ci/runner/admin_runners/admin_runners_app_spec.js
index fc74e2947b6..1bbcb991619 100644
--- a/spec/frontend/ci/runner/admin_runners/admin_runners_app_spec.js
+++ b/spec/frontend/ci/runner/admin_runners/admin_runners_app_spec.js
@@ -156,7 +156,7 @@ describe('AdminRunnersApp', () => {
await createComponent({ mountFn: mountExtended });
});
- // https://gitlab.com/gitlab-org/gitlab/-/issues/414975
+ // quarantine: https://gitlab.com/gitlab-org/gitlab/-/issues/414975
// eslint-disable-next-line jest/no-disabled-tests
it.skip('fetches counts', () => {
expect(mockRunnersCountHandler).toHaveBeenCalledTimes(COUNT_QUERIES);
diff --git a/spec/frontend/ci/runner/components/cells/runner_summary_cell_spec.js b/spec/frontend/ci/runner/components/cells/runner_summary_cell_spec.js
index cda3876f9b2..ad20d7682ed 100644
--- a/spec/frontend/ci/runner/components/cells/runner_summary_cell_spec.js
+++ b/spec/frontend/ci/runner/components/cells/runner_summary_cell_spec.js
@@ -1,5 +1,6 @@
+import { GlSprintf } from '@gitlab/ui';
import { __, sprintf } from '~/locale';
-import { mountExtended } from 'helpers/vue_test_utils_helper';
+import { mountExtended, shallowMountExtended } from 'helpers/vue_test_utils_helper';
import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
import RunnerSummaryCell from '~/ci/runner/components/cells/runner_summary_cell.vue';
import TimeAgo from '~/vue_shared/components/time_ago_tooltip.vue';
@@ -31,8 +32,8 @@ describe('RunnerTypeCell', () => {
wrapper.findAllComponents(RunnerSummaryField).filter((w) => w.props('icon') === icon)
.wrappers[0];
- const createComponent = (runner, options) => {
- wrapper = mountExtended(RunnerSummaryCell, {
+ const createComponent = ({ runner, mountFn = shallowMountExtended, ...options } = {}) => {
+ wrapper = mountFn(RunnerSummaryCell, {
propsData: {
runner: {
...mockRunner,
@@ -40,7 +41,7 @@ describe('RunnerTypeCell', () => {
},
},
stubs: {
- RunnerSummaryField,
+ GlSprintf,
},
...options,
});
@@ -51,6 +52,8 @@ describe('RunnerTypeCell', () => {
});
it('Displays the runner name as id and short token', () => {
+ createComponent({ mountFn: mountExtended });
+
expect(wrapper.text()).toContain(
`#${getIdFromGraphQLId(mockRunner.id)} (${mockRunner.shortSha})`,
);
@@ -58,13 +61,16 @@ describe('RunnerTypeCell', () => {
it('Displays no runner manager count', () => {
createComponent({
- managers: { count: 0 },
+ runner: { managers: { nodes: { count: 0 } } },
+ mountFn: mountExtended,
});
expect(findRunnerManagersBadge().html()).toBe('');
});
it('Displays runner manager count', () => {
+ createComponent({ mountFn: mountExtended });
+
expect(findRunnerManagersBadge().text()).toBe('2');
});
@@ -74,8 +80,8 @@ describe('RunnerTypeCell', () => {
it('Displays the locked icon for locked runners', () => {
createComponent({
- runnerType: PROJECT_TYPE,
- locked: true,
+ runner: { runnerType: PROJECT_TYPE, locked: true },
+ mountFn: mountExtended,
});
expect(findLockIcon().exists()).toBe(true);
@@ -83,8 +89,8 @@ describe('RunnerTypeCell', () => {
it('Displays the runner type', () => {
createComponent({
- runnerType: INSTANCE_TYPE,
- locked: true,
+ runner: { runnerType: INSTANCE_TYPE, locked: true },
+ mountFn: mountExtended,
});
expect(wrapper.text()).toContain(I18N_INSTANCE_TYPE);
@@ -101,7 +107,7 @@ describe('RunnerTypeCell', () => {
it('Displays "No description" for missing runner description', () => {
createComponent({
- description: null,
+ runner: { description: null },
});
expect(wrapper.findByText(I18N_NO_DESCRIPTION).classes()).toContain('gl-text-secondary');
@@ -109,7 +115,7 @@ describe('RunnerTypeCell', () => {
it('Displays last contact', () => {
createComponent({
- contactedAt: '2022-01-02',
+ runner: { contactedAt: '2022-01-02' },
});
expect(findRunnerSummaryField('clock').findComponent(TimeAgo).props('time')).toBe('2022-01-02');
@@ -124,20 +130,46 @@ describe('RunnerTypeCell', () => {
expect(findRunnerSummaryField('clock').text()).toContain(__('Never'));
});
- it('Displays ip address', () => {
- createComponent({
- ipAddress: '127.0.0.1',
+ describe('IP address', () => {
+ it('with no managers', () => {
+ createComponent({
+ runner: {
+ managers: { count: 0, nodes: [] },
+ },
+ });
+
+ expect(findRunnerSummaryField('disk')).toBeUndefined();
});
- expect(findRunnerSummaryField('disk').text()).toContain('127.0.0.1');
- });
+ it('with no ip', () => {
+ createComponent({
+ runner: {
+ managers: { count: 1, nodes: [{ ipAddress: null }] },
+ },
+ });
- it('Displays no ip address', () => {
- createComponent({
- ipAddress: null,
+ expect(findRunnerSummaryField('disk')).toBeUndefined();
});
- expect(findRunnerSummaryField('disk')).toBeUndefined();
+ it.each`
+ count | ipAddress | expected
+ ${1} | ${'127.0.0.1'} | ${'127.0.0.1'}
+ ${2} | ${'127.0.0.2'} | ${'127.0.0.2 (+1)'}
+ ${11} | ${'127.0.0.3'} | ${'127.0.0.3 (+10)'}
+ ${1001} | ${'127.0.0.4'} | ${'127.0.0.4 (+1,000)'}
+ `(
+ 'with $count managers, ip $ipAddress displays $expected',
+ ({ count, ipAddress, expected }) => {
+ createComponent({
+ runner: {
+ // `first: 1` is requested, `count` varies when there are more managers
+ managers: { count, nodes: [{ ipAddress }] },
+ },
+ });
+
+ expect(findRunnerSummaryField('disk').text()).toMatchInterpolatedText(expected);
+ },
+ );
});
it('Displays job count', () => {
@@ -146,7 +178,7 @@ describe('RunnerTypeCell', () => {
it('Formats large job counts', () => {
createComponent({
- jobCount: 1000,
+ runner: { jobCount: 1000 },
});
expect(findRunnerSummaryField('pipeline').text()).toContain('1,000');
@@ -154,7 +186,7 @@ describe('RunnerTypeCell', () => {
it('Formats large job counts with a plus symbol', () => {
createComponent({
- jobCount: 1001,
+ runner: { jobCount: 1001 },
});
expect(findRunnerSummaryField('pipeline').text()).toContain('1,000+');
@@ -165,7 +197,7 @@ describe('RunnerTypeCell', () => {
it('Displays created at ...', () => {
createComponent({
- createdBy: null,
+ runner: { createdBy: null },
});
expect(findRunnerSummaryField('calendar').text()).toMatchInterpolatedText(
@@ -177,12 +209,15 @@ describe('RunnerTypeCell', () => {
});
it('Displays created at ... by ...', () => {
+ createComponent({ mountFn: mountExtended });
+
expect(findRunnerSummaryField('calendar').text()).toMatchInterpolatedText(
sprintf(I18N_CREATED_AT_BY_LABEL, {
timeAgo: findCreatedTime().text(),
avatar: mockRunner.createdBy.username,
}),
);
+
expect(findCreatedTime().props('time')).toBe(mockRunner.createdAt);
});
@@ -200,7 +235,7 @@ describe('RunnerTypeCell', () => {
it('Displays tag list', () => {
createComponent({
- tagList: ['shell', 'linux'],
+ runner: { tagList: ['shell', 'linux'] },
});
expect(findRunnerTags().props('tagList')).toEqual(['shell', 'linux']);
@@ -209,14 +244,11 @@ describe('RunnerTypeCell', () => {
it('Displays a custom runner-name slot', () => {
const slotContent = 'My custom runner name';
- createComponent(
- {},
- {
- slots: {
- 'runner-name': slotContent,
- },
+ createComponent({
+ slots: {
+ 'runner-name': slotContent,
},
- );
+ });
expect(wrapper.text()).toContain(slotContent);
});
diff --git a/spec/frontend/ci/runner/components/registration/registration_dropdown_spec.js b/spec/frontend/ci/runner/components/registration/registration_dropdown_spec.js
index e564cf49ca0..e4373d1c198 100644
--- a/spec/frontend/ci/runner/components/registration/registration_dropdown_spec.js
+++ b/spec/frontend/ci/runner/components/registration/registration_dropdown_spec.js
@@ -1,4 +1,10 @@
-import { GlModal, GlDropdown, GlDropdownItem, GlDropdownForm, GlIcon } from '@gitlab/ui';
+import {
+ GlModal,
+ GlDisclosureDropdown,
+ GlDisclosureDropdownItem,
+ GlDropdownForm,
+ GlIcon,
+} from '@gitlab/ui';
import { createWrapper } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
import VueApollo from 'vue-apollo';
@@ -35,13 +41,16 @@ Vue.use(VueApollo);
describe('RegistrationDropdown', () => {
let wrapper;
- const findDropdown = () => wrapper.findComponent(GlDropdown);
+ const findDropdown = () => wrapper.findComponent(GlDisclosureDropdown);
const findDropdownBtn = () => findDropdown().find('button');
- const findRegistrationInstructionsDropdownItem = () => wrapper.findComponent(GlDropdownItem);
+ const findRegistrationInstructionsDropdownItem = () =>
+ wrapper.findComponent(GlDisclosureDropdownItem);
const findTokenDropdownItem = () => wrapper.findComponent(GlDropdownForm);
const findRegistrationToken = () => wrapper.findComponent(RegistrationToken);
const findRegistrationTokenInput = () =>
- wrapper.findByLabelText(RegistrationToken.i18n.registrationToken);
+ wrapper.findByLabelText(
+ `${RegistrationToken.i18n.registrationToken} ${RegistrationDropdown.i18n.supportForRegistrationTokensDeprecated}`,
+ );
const findTokenResetDropdownItem = () =>
wrapper.findComponent(RegistrationTokenResetDropdownItem);
const findModal = () => wrapper.findComponent(GlModal);
@@ -52,9 +61,8 @@ describe('RegistrationDropdown', () => {
.replace(/[\n\t\s]+/g, ' ');
const openModal = async () => {
- await findRegistrationInstructionsDropdownItem().trigger('click');
+ await findRegistrationInstructionsDropdownItem().vm.$emit('action');
findModal().vm.$emit('shown');
-
await waitForPromises();
};
@@ -65,6 +73,9 @@ describe('RegistrationDropdown', () => {
type: INSTANCE_TYPE,
...props,
},
+ stubs: {
+ GlDisclosureDropdownItem,
+ },
...options,
});
};
@@ -107,12 +118,12 @@ describe('RegistrationDropdown', () => {
createComponent();
expect(findDropdown().props()).toMatchObject({
- category: 'primary',
- variant: 'confirm',
+ category: 'tertiary',
+ variant: 'default',
});
expect(findDropdown().attributes()).toMatchObject({
- toggleclass: '',
+ toggleclass: 'gl-px-3!',
});
});
@@ -186,6 +197,26 @@ describe('RegistrationDropdown', () => {
});
});
+ describe('Dropdown is expanded', () => {
+ beforeEach(() => {
+ createComponent({}, mountExtended);
+ findDropdownBtn().vm.$emit('click');
+ });
+
+ it('has aria-expanded set to true', () => {
+ expect(findDropdownBtn().attributes('aria-expanded')).toBe('true');
+ });
+
+ describe('when token is copied', () => {
+ it('should close dropdown', async () => {
+ findRegistrationToken().vm.$emit('copy');
+ await nextTick();
+
+ expect(findDropdownBtn().attributes('aria-expanded')).toBeUndefined();
+ });
+ });
+ });
+
describe('When token is reset', () => {
const newToken = 'mock1';
@@ -217,19 +248,15 @@ describe('RegistrationDropdown', () => {
});
});
- describe.each([
- { createRunnerWorkflowForAdmin: true },
- { createRunnerWorkflowForNamespace: true },
- ])('When showing a "deprecated" warning', (glFeatures) => {
+ describe('When showing a "deprecated" warning', () => {
it('passes deprecated variant props and attributes to dropdown', () => {
- createComponent({
- provide: { glFeatures },
- });
+ createComponent();
expect(findDropdown().props()).toMatchObject({
category: 'tertiary',
variant: 'default',
- text: '',
+ toggleText: I18N_REGISTER_INSTANCE_TYPE,
+ textSrOnly: true,
});
expect(findDropdown().attributes()).toMatchObject({
@@ -249,12 +276,7 @@ describe('RegistrationDropdown', () => {
});
it('shows warning text', () => {
- createComponent(
- {
- provide: { glFeatures },
- },
- mountExtended,
- );
+ createComponent({}, mountExtended);
const text = wrapper.findByText(s__('Runners|Support for registration tokens is deprecated'));
@@ -262,12 +284,7 @@ describe('RegistrationDropdown', () => {
});
it('button shows ellipsis icon', () => {
- createComponent(
- {
- provide: { glFeatures },
- },
- mountExtended,
- );
+ createComponent({}, mountExtended);
expect(findDropdownBtn().findComponent(GlIcon).props('name')).toBe('ellipsis_v');
expect(findDropdownBtn().findAllComponents(GlIcon)).toHaveLength(1);
diff --git a/spec/frontend/ci/runner/components/registration/registration_token_reset_dropdown_item_spec.js b/spec/frontend/ci/runner/components/registration/registration_token_reset_dropdown_item_spec.js
index db54bf0c80e..d599bc1291c 100644
--- a/spec/frontend/ci/runner/components/registration/registration_token_reset_dropdown_item_spec.js
+++ b/spec/frontend/ci/runner/components/registration/registration_token_reset_dropdown_item_spec.js
@@ -1,4 +1,4 @@
-import { GlDropdownItem, GlLoadingIcon, GlToast, GlModal } from '@gitlab/ui';
+import { GlDisclosureDropdownItem, GlLoadingIcon, GlToast, GlModal } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
@@ -27,7 +27,7 @@ describe('RegistrationTokenResetDropdownItem', () => {
let showToast;
const mockEvent = { preventDefault: jest.fn() };
- const findDropdownItem = () => wrapper.findComponent(GlDropdownItem);
+ const findDropdownItem = () => wrapper.findComponent(GlDisclosureDropdownItem);
const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
const findModal = () => wrapper.findComponent(GlModal);
const clickSubmit = () => findModal().vm.$emit('primary', mockEvent);
diff --git a/spec/frontend/ci/runner/components/registration/registration_token_spec.js b/spec/frontend/ci/runner/components/registration/registration_token_spec.js
index 869c032c0b5..fd3896d5500 100644
--- a/spec/frontend/ci/runner/components/registration/registration_token_spec.js
+++ b/spec/frontend/ci/runner/components/registration/registration_token_spec.js
@@ -7,7 +7,7 @@ import { mockRegistrationToken } from '../../mock_data';
describe('RegistrationToken', () => {
let wrapper;
- let showToast;
+ const showToastMock = jest.fn();
Vue.use(GlToast);
@@ -21,9 +21,12 @@ describe('RegistrationToken', () => {
...props,
},
...options,
+ mocks: {
+ $toast: {
+ show: showToastMock,
+ },
+ },
});
-
- showToast = wrapper.vm.$toast ? jest.spyOn(wrapper.vm.$toast, 'show') : null;
};
it('Displays value and copy button', () => {
@@ -58,8 +61,14 @@ describe('RegistrationToken', () => {
it('shows a copied message', () => {
findInputCopyToggleVisibility().vm.$emit('copy');
- expect(showToast).toHaveBeenCalledTimes(1);
- expect(showToast).toHaveBeenCalledWith('Registration token copied!');
+ expect(showToastMock).toHaveBeenCalledTimes(1);
+ expect(showToastMock).toHaveBeenCalledWith('Registration token copied!');
+ });
+
+ it('emits a copy event', () => {
+ findInputCopyToggleVisibility().vm.$emit('copy');
+
+ expect(wrapper.emitted('copy')).toHaveLength(1);
});
});
@@ -76,9 +85,7 @@ describe('RegistrationToken', () => {
});
it('passes slots to the input component', () => {
- const slot = findInputCopyToggleVisibility().vm.$scopedSlots[slotName];
-
- expect(slot()[0].text).toBe(slotContent);
+ expect(findInputCopyToggleVisibility().text()).toBe(slotContent);
});
});
});
diff --git a/spec/frontend/ci/runner/components/runner_delete_action_spec.js b/spec/frontend/ci/runner/components/runner_delete_action_spec.js
new file mode 100644
index 00000000000..d6617e6e75c
--- /dev/null
+++ b/spec/frontend/ci/runner/components/runner_delete_action_spec.js
@@ -0,0 +1,223 @@
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import { stubComponent } from 'helpers/stub_component';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import runnerDeleteMutation from '~/ci/runner/graphql/shared/runner_delete.mutation.graphql';
+import waitForPromises from 'helpers/wait_for_promises';
+import { captureException } from '~/ci/runner/sentry_utils';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
+import { createAlert } from '~/alert';
+
+import RunnerDeleteAction from '~/ci/runner/components/runner_delete_action.vue';
+import RunnerDeleteModal from '~/ci/runner/components/runner_delete_modal.vue';
+import { allRunnersData } from '../mock_data';
+
+const mockRunner = allRunnersData.data.runners.nodes[0];
+const mockRunnerId = getIdFromGraphQLId(mockRunner.id);
+const mockRunnerName = `#${mockRunnerId} (${mockRunner.shortSha})`;
+
+Vue.use(VueApollo);
+
+jest.mock('~/alert');
+jest.mock('~/ci/runner/sentry_utils');
+
+describe('RunnerDeleteAction', () => {
+ let wrapper;
+ let apolloProvider;
+ let apolloCache;
+ let runnerDeleteHandler;
+ let mockModalShow;
+
+ const findBtn = () => wrapper.find('button');
+ const findModal = () => wrapper.findComponent(RunnerDeleteModal);
+
+ const createComponent = ({ props = {} } = {}) => {
+ const { runner, ...propsData } = props;
+
+ wrapper = shallowMountExtended(RunnerDeleteAction, {
+ propsData: {
+ runner: {
+ // We need typename so that cache.identify works
+ // eslint-disable-next-line no-underscore-dangle
+ __typename: mockRunner.__typename,
+ id: mockRunner.id,
+ shortSha: mockRunner.shortSha,
+ ...runner,
+ },
+ ...propsData,
+ },
+ apolloProvider,
+ stubs: {
+ RunnerDeleteModal: stubComponent(RunnerDeleteModal, {
+ methods: {
+ show: mockModalShow,
+ },
+ }),
+ },
+ scopedSlots: {
+ default: '<button :disabled="props.loading" @click="props.onClick"/>',
+ },
+ });
+ };
+
+ const clickOkAndWait = async () => {
+ findModal().vm.$emit('primary');
+ await waitForPromises();
+ };
+
+ beforeEach(() => {
+ mockModalShow = jest.fn();
+
+ runnerDeleteHandler = jest.fn().mockImplementation(() => {
+ return Promise.resolve({
+ data: {
+ runnerDelete: {
+ errors: [],
+ },
+ },
+ });
+ });
+ apolloProvider = createMockApollo([[runnerDeleteMutation, runnerDeleteHandler]]);
+ apolloCache = apolloProvider.defaultClient.cache;
+
+ jest.spyOn(apolloCache, 'evict');
+ jest.spyOn(apolloCache, 'gc');
+
+ createComponent();
+ });
+
+ it('Displays an action in the slot', () => {
+ expect(findBtn().exists()).toBe(true);
+ });
+
+ it('Displays a modal with the runner name', () => {
+ expect(findModal().props('runnerName')).toBe(mockRunnerName);
+ });
+
+ it('Displays a modal with the runner manager count', () => {
+ createComponent({
+ props: {
+ runner: { managers: { count: 2 } },
+ },
+ });
+
+ expect(findModal().props('managersCount')).toBe(2);
+ });
+
+ it('Displays a modal when action is triggered', async () => {
+ await findBtn().trigger('click');
+
+ expect(mockModalShow).toHaveBeenCalled();
+ });
+
+ describe('Before the delete button is clicked', () => {
+ it('The mutation has not been called', () => {
+ expect(runnerDeleteHandler).toHaveBeenCalledTimes(0);
+ });
+ });
+
+ describe('Immediately after the delete button is clicked', () => {
+ beforeEach(() => {
+ findModal().vm.$emit('primary');
+ });
+
+ it('The button has a loading state', () => {
+ expect(findBtn().attributes('disabled')).toBe('disabled');
+ });
+ });
+
+ describe('After clicking on the delete button', () => {
+ beforeEach(async () => {
+ await clickOkAndWait();
+ });
+
+ it('The mutation to delete is called', () => {
+ expect(runnerDeleteHandler).toHaveBeenCalledTimes(1);
+ expect(runnerDeleteHandler).toHaveBeenCalledWith({
+ input: {
+ id: mockRunner.id,
+ },
+ });
+ });
+
+ it('The user can be notified with an event', () => {
+ const done = wrapper.emitted('done');
+
+ expect(done).toHaveLength(1);
+ expect(done[0][0].message).toMatch(`#${mockRunnerId}`);
+ expect(done[0][0].message).toMatch(`${mockRunner.shortSha}`);
+ });
+
+ it('evicts runner from apollo cache', () => {
+ expect(apolloCache.evict).toHaveBeenCalledWith({
+ id: apolloCache.identify(mockRunner),
+ });
+ expect(apolloCache.gc).toHaveBeenCalled();
+ });
+ });
+
+ describe('When update fails', () => {
+ describe('On a network error', () => {
+ const mockErrorMsg = 'Update error!';
+
+ beforeEach(async () => {
+ runnerDeleteHandler.mockRejectedValueOnce(new Error(mockErrorMsg));
+
+ await clickOkAndWait();
+ });
+
+ it('error is reported to sentry', () => {
+ expect(captureException).toHaveBeenCalledWith({
+ error: new Error(mockErrorMsg),
+ component: 'RunnerDeleteAction',
+ });
+ });
+
+ it('error is shown to the user', () => {
+ expect(createAlert).toHaveBeenCalledTimes(1);
+ expect(createAlert).toHaveBeenCalledWith({
+ title: expect.stringContaining(mockRunnerName),
+ message: mockErrorMsg,
+ });
+ });
+ });
+
+ describe('On a validation error', () => {
+ const mockErrorMsg = 'Runner not found!';
+ const mockErrorMsg2 = 'User not allowed!';
+
+ beforeEach(async () => {
+ runnerDeleteHandler.mockResolvedValueOnce({
+ data: {
+ runnerDelete: {
+ errors: [mockErrorMsg, mockErrorMsg2],
+ },
+ },
+ });
+
+ await clickOkAndWait();
+ });
+
+ it('error is reported to sentry', () => {
+ expect(captureException).toHaveBeenCalledWith({
+ error: new Error(`${mockErrorMsg} ${mockErrorMsg2}`),
+ component: 'RunnerDeleteAction',
+ });
+ });
+
+ it('error is shown to the user', () => {
+ expect(createAlert).toHaveBeenCalledTimes(1);
+ expect(createAlert).toHaveBeenCalledWith({
+ title: expect.stringContaining(mockRunnerName),
+ message: `${mockErrorMsg} ${mockErrorMsg2}`,
+ });
+ });
+
+ it('does not evict runner from apollo cache', () => {
+ expect(apolloCache.evict).not.toHaveBeenCalled();
+ expect(apolloCache.gc).not.toHaveBeenCalled();
+ });
+ });
+ });
+});
diff --git a/spec/frontend/ci/runner/components/runner_delete_button_spec.js b/spec/frontend/ci/runner/components/runner_delete_button_spec.js
index 3b3f3b1770d..87e857510de 100644
--- a/spec/frontend/ci/runner/components/runner_delete_button_spec.js
+++ b/spec/frontend/ci/runner/components/runner_delete_button_spec.js
@@ -1,110 +1,73 @@
-import Vue from 'vue';
import { GlButton } from '@gitlab/ui';
-import VueApollo from 'vue-apollo';
-import createMockApollo from 'helpers/mock_apollo_helper';
+import { stubComponent } from 'helpers/stub_component';
import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
-import { shallowMountExtended, mountExtended } from 'helpers/vue_test_utils_helper';
-import runnerDeleteMutation from '~/ci/runner/graphql/shared/runner_delete.mutation.graphql';
-import waitForPromises from 'helpers/wait_for_promises';
-import { captureException } from '~/ci/runner/sentry_utils';
-import { getIdFromGraphQLId } from '~/graphql_shared/utils';
-import { createAlert } from '~/alert';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import { I18N_DELETE_RUNNER } from '~/ci/runner/constants';
import RunnerDeleteButton from '~/ci/runner/components/runner_delete_button.vue';
-import RunnerDeleteModal from '~/ci/runner/components/runner_delete_modal.vue';
+import RunnerDeleteAction from '~/ci/runner/components/runner_delete_action.vue';
import { allRunnersData } from '../mock_data';
const mockRunner = allRunnersData.data.runners.nodes[0];
-const mockRunnerId = getIdFromGraphQLId(mockRunner.id);
-const mockRunnerName = `#${mockRunnerId} (${mockRunner.shortSha})`;
-
-Vue.use(VueApollo);
jest.mock('~/alert');
jest.mock('~/ci/runner/sentry_utils');
describe('RunnerDeleteButton', () => {
let wrapper;
- let apolloProvider;
- let apolloCache;
- let runnerDeleteHandler;
const findBtn = () => wrapper.findComponent(GlButton);
- const findModal = () => wrapper.findComponent(RunnerDeleteModal);
-
const getTooltip = () => getBinding(wrapper.element, 'gl-tooltip').value;
- const getModal = () => getBinding(findBtn().element, 'gl-modal').value;
- const createComponent = ({ props = {}, mountFn = shallowMountExtended } = {}) => {
- const { runner, ...propsData } = props;
-
- wrapper = mountFn(RunnerDeleteButton, {
+ const createComponent = ({ props = {}, loading, onClick = jest.fn() } = {}) => {
+ wrapper = shallowMountExtended(RunnerDeleteButton, {
propsData: {
- runner: {
- // We need typename so that cache.identify works
- // eslint-disable-next-line no-underscore-dangle
- __typename: mockRunner.__typename,
- id: mockRunner.id,
- shortSha: mockRunner.shortSha,
- ...runner,
- },
- ...propsData,
+ runner: mockRunner,
+ ...props,
},
- apolloProvider,
directives: {
GlTooltip: createMockDirective('gl-tooltip'),
- GlModal: createMockDirective('gl-modal'),
+ },
+ stubs: {
+ RunnerDeleteAction: stubComponent(RunnerDeleteAction, {
+ render() {
+ return this.$scopedSlots.default({
+ loading,
+ onClick,
+ });
+ },
+ }),
},
});
};
- const clickOkAndWait = async () => {
- findModal().vm.$emit('primary');
- await waitForPromises();
- };
-
beforeEach(() => {
- runnerDeleteHandler = jest.fn().mockImplementation(() => {
- return Promise.resolve({
- data: {
- runnerDelete: {
- errors: [],
- },
- },
- });
- });
- apolloProvider = createMockApollo([[runnerDeleteMutation, runnerDeleteHandler]]);
- apolloCache = apolloProvider.defaultClient.cache;
-
- jest.spyOn(apolloCache, 'evict');
- jest.spyOn(apolloCache, 'gc');
-
createComponent();
});
- it('Displays a delete button without an icon', () => {
+ it('Displays a delete button without a icon or tooltip', () => {
expect(findBtn().props()).toMatchObject({
loading: false,
icon: '',
});
expect(findBtn().classes('btn-icon')).toBe(false);
expect(findBtn().text()).toBe(I18N_DELETE_RUNNER);
- });
- it('Displays a modal with the runner name', () => {
- expect(findModal().props('runnerName')).toBe(mockRunnerName);
+ expect(getTooltip()).toBe('');
});
it('Does not have tabindex when button is enabled', () => {
expect(wrapper.attributes('tabindex')).toBeUndefined();
});
- it('Displays a modal when clicked', () => {
- const modalId = `delete-runner-modal-${mockRunnerId}`;
+ it('Triggers delete when clicked', () => {
+ const mockOnClick = jest.fn();
+
+ createComponent({ onClick: mockOnClick });
+ expect(mockOnClick).not.toHaveBeenCalled();
- expect(getModal()).toBe(modalId);
- expect(findModal().attributes('modal-id')).toBe(modalId);
+ findBtn().vm.$emit('click');
+ expect(mockOnClick).toHaveBeenCalledTimes(1);
});
it('Does not display redundant text for screen readers', () => {
@@ -117,135 +80,41 @@ describe('RunnerDeleteButton', () => {
expect(findBtn().props('category')).toBe('secondary');
});
- describe(`Before the delete button is clicked`, () => {
- it('The mutation has not been called', () => {
- expect(runnerDeleteHandler).toHaveBeenCalledTimes(0);
- });
- });
-
- describe('Immediately after the delete button is clicked', () => {
+ describe('When loading result', () => {
beforeEach(() => {
- findModal().vm.$emit('primary');
+ createComponent({ loading: true });
});
it('The button has a loading state', () => {
expect(findBtn().props('loading')).toBe(true);
});
-
- it('The stale tooltip is removed', () => {
- expect(getTooltip()).toBe('');
- });
});
- describe('After clicking on the delete button', () => {
- beforeEach(async () => {
- await clickOkAndWait();
- });
-
- it('The mutation to delete is called', () => {
- expect(runnerDeleteHandler).toHaveBeenCalledTimes(1);
- expect(runnerDeleteHandler).toHaveBeenCalledWith({
- input: {
- id: mockRunner.id,
- },
- });
- });
-
- it('The user can be notified with an event', () => {
- const deleted = wrapper.emitted('deleted');
-
- expect(deleted).toHaveLength(1);
- expect(deleted[0][0].message).toMatch(`#${mockRunnerId}`);
- expect(deleted[0][0].message).toMatch(`${mockRunner.shortSha}`);
- });
-
- it('evicts runner from apollo cache', () => {
- expect(apolloCache.evict).toHaveBeenCalledWith({
- id: apolloCache.identify(mockRunner),
- });
- expect(apolloCache.gc).toHaveBeenCalled();
- });
- });
+ describe('When done after deleting', () => {
+ const doneEvent = { message: 'done!' };
- describe('When update fails', () => {
- describe('On a network error', () => {
- const mockErrorMsg = 'Update error!';
-
- beforeEach(async () => {
- runnerDeleteHandler.mockRejectedValueOnce(new Error(mockErrorMsg));
-
- await clickOkAndWait();
- });
-
- it('error is reported to sentry', () => {
- expect(captureException).toHaveBeenCalledWith({
- error: new Error(mockErrorMsg),
- component: 'RunnerDeleteButton',
- });
- });
-
- it('error is shown to the user', () => {
- expect(createAlert).toHaveBeenCalledTimes(1);
- expect(createAlert).toHaveBeenCalledWith({
- title: expect.stringContaining(mockRunnerName),
- message: mockErrorMsg,
- });
- });
+ beforeEach(() => {
+ wrapper.findComponent(RunnerDeleteAction).vm.$emit('done', doneEvent);
});
- describe('On a validation error', () => {
- const mockErrorMsg = 'Runner not found!';
- const mockErrorMsg2 = 'User not allowed!';
-
- beforeEach(async () => {
- runnerDeleteHandler.mockResolvedValueOnce({
- data: {
- runnerDelete: {
- errors: [mockErrorMsg, mockErrorMsg2],
- },
- },
- });
-
- await clickOkAndWait();
- });
-
- it('error is reported to sentry', () => {
- expect(captureException).toHaveBeenCalledWith({
- error: new Error(`${mockErrorMsg} ${mockErrorMsg2}`),
- component: 'RunnerDeleteButton',
- });
- });
-
- it('error is shown to the user', () => {
- expect(createAlert).toHaveBeenCalledTimes(1);
- expect(createAlert).toHaveBeenCalledWith({
- title: expect.stringContaining(mockRunnerName),
- message: `${mockErrorMsg} ${mockErrorMsg2}`,
- });
- });
-
- it('does not evict runner from apollo cache', () => {
- expect(apolloCache.evict).not.toHaveBeenCalled();
- expect(apolloCache.gc).not.toHaveBeenCalled();
- });
+ it('emits deleted event', () => {
+ expect(wrapper.emitted('deleted')).toEqual([[doneEvent]]);
});
});
- describe('When displaying a compact button for an active runner', () => {
+ describe('When displaying a compact button', () => {
beforeEach(() => {
createComponent({
- props: {
- runner: {
- paused: false,
- },
- compact: true,
- },
- mountFn: mountExtended,
+ props: { compact: true },
});
});
it('Displays no text', () => {
expect(findBtn().text()).toBe('');
+ });
+
+ it('Displays "x" icon', () => {
+ expect(findBtn().props('icon')).toBe('close');
expect(findBtn().classes('btn-icon')).toBe(true);
});
@@ -254,13 +123,12 @@ describe('RunnerDeleteButton', () => {
expect(getTooltip()).toBe(I18N_DELETE_RUNNER);
});
- describe('Immediately after the button is clicked', () => {
+ describe('When loading result', () => {
beforeEach(() => {
- findModal().vm.$emit('primary');
- });
-
- it('The button has a loading state', () => {
- expect(findBtn().props('loading')).toBe(true);
+ createComponent({
+ props: { compact: true },
+ loading: true,
+ });
});
it('The stale tooltip is removed', () => {
diff --git a/spec/frontend/ci/runner/components/runner_delete_disclosure_dropdown_item_spec.js b/spec/frontend/ci/runner/components/runner_delete_disclosure_dropdown_item_spec.js
new file mode 100644
index 00000000000..e311cb4d458
--- /dev/null
+++ b/spec/frontend/ci/runner/components/runner_delete_disclosure_dropdown_item_spec.js
@@ -0,0 +1,68 @@
+import { GlDisclosureDropdownItem } from '@gitlab/ui';
+import { stubComponent } from 'helpers/stub_component';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { I18N_DELETE } from '~/ci/runner/constants';
+
+import RunnerDeleteDisclosureDropdownItem from '~/ci/runner/components/runner_delete_disclosure_dropdown_item.vue';
+import RunnerDeleteAction from '~/ci/runner/components/runner_delete_action.vue';
+import { allRunnersData } from '../mock_data';
+
+const mockRunner = allRunnersData.data.runners.nodes[0];
+
+jest.mock('~/alert');
+jest.mock('~/ci/runner/sentry_utils');
+
+describe('RunnerDeleteDisclosureDropdownItem', () => {
+ let wrapper;
+ let mockOnClick;
+
+ const findDisclosureDropdownItem = () => wrapper.findComponent(GlDisclosureDropdownItem);
+
+ const createComponent = () => {
+ mockOnClick = jest.fn();
+
+ wrapper = shallowMountExtended(RunnerDeleteDisclosureDropdownItem, {
+ propsData: {
+ runner: mockRunner,
+ },
+ stubs: {
+ RunnerDeleteAction: stubComponent(RunnerDeleteAction, {
+ render() {
+ return this.$scopedSlots.default({
+ onClick: mockOnClick,
+ });
+ },
+ }),
+ },
+ });
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('Displays a delete item', () => {
+ expect(findDisclosureDropdownItem().text()).toBe(I18N_DELETE);
+ });
+
+ it('Does not trigger on load', () => {
+ expect(mockOnClick).not.toHaveBeenCalled();
+ });
+
+ it('Triggers delete when clicked', () => {
+ findDisclosureDropdownItem().vm.$emit('action');
+ expect(mockOnClick).toHaveBeenCalledTimes(1);
+ });
+
+ describe('When done after deleting', () => {
+ const doneEvent = { message: 'done!' };
+
+ beforeEach(() => {
+ wrapper.findComponent(RunnerDeleteAction).vm.$emit('done', doneEvent);
+ });
+
+ it('emits deleted event', () => {
+ expect(wrapper.emitted('deleted')).toEqual([[doneEvent]]);
+ });
+ });
+});
diff --git a/spec/frontend/ci/runner/components/runner_delete_modal_spec.js b/spec/frontend/ci/runner/components/runner_delete_modal_spec.js
index 606cc46c018..e486d708fec 100644
--- a/spec/frontend/ci/runner/components/runner_delete_modal_spec.js
+++ b/spec/frontend/ci/runner/components/runner_delete_modal_spec.js
@@ -1,5 +1,6 @@
import { GlModal } from '@gitlab/ui';
-import { mount, shallowMount } from '@vue/test-utils';
+import { shallowMount } from '@vue/test-utils';
+import { stubComponent } from 'helpers/stub_component';
import RunnerDeleteModal from '~/ci/runner/components/runner_delete_modal.vue';
describe('RunnerDeleteModal', () => {
@@ -7,7 +8,7 @@ describe('RunnerDeleteModal', () => {
const findGlModal = () => wrapper.findComponent(GlModal);
- const createComponent = ({ props = {} } = {}, mountFn = shallowMount) => {
+ const createComponent = ({ props = {}, ...options } = {}, mountFn = shallowMount) => {
wrapper = mountFn(RunnerDeleteModal, {
attachTo: document.body,
propsData: {
@@ -17,6 +18,7 @@ describe('RunnerDeleteModal', () => {
attrs: {
modalId: 'delete-runner-modal-99',
},
+ ...options,
});
};
@@ -66,15 +68,35 @@ describe('RunnerDeleteModal', () => {
});
});
- describe('When modal is confirmed by the user', () => {
+ describe('Modal API', () => {
let hideModalSpy;
+ let showModalSpy;
beforeEach(() => {
- createComponent({}, mount);
- hideModalSpy = jest.spyOn(wrapper.vm.$refs.modal, 'hide').mockImplementation(() => {});
+ hideModalSpy = jest.fn();
+ showModalSpy = jest.fn();
+
+ createComponent({
+ stubs: {
+ GlModal: stubComponent(GlModal, {
+ methods: {
+ hide: hideModalSpy,
+ show: showModalSpy,
+ },
+ }),
+ },
+ });
+ });
+
+ it('When "show" method is called, modal is shown', () => {
+ expect(showModalSpy).toHaveBeenCalledTimes(0);
+
+ wrapper.vm.show();
+
+ expect(showModalSpy).toHaveBeenCalledTimes(1);
});
- it('Modal gets hidden', () => {
+ it('When confirmed, modal gets hidden', () => {
expect(hideModalSpy).toHaveBeenCalledTimes(0);
findGlModal().vm.$emit('primary');
diff --git a/spec/frontend/ci/runner/components/runner_detail_spec.js b/spec/frontend/ci/runner/components/runner_detail_spec.js
new file mode 100644
index 00000000000..b2d91af4e3b
--- /dev/null
+++ b/spec/frontend/ci/runner/components/runner_detail_spec.js
@@ -0,0 +1,88 @@
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import RunnerDetail from '~/ci/runner/components/runner_detail.vue';
+
+describe('RunnerDetail', () => {
+ let wrapper;
+ const createWrapper = ({ props, slots }) => {
+ wrapper = shallowMountExtended(RunnerDetail, {
+ propsData: props,
+ slots,
+ });
+ };
+ const findLabelText = () => wrapper.findByTestId('label-slot').text();
+ const findValueText = () => wrapper.findByTestId('value-slot').text();
+
+ it('renders the label slot when a label prop is provided', () => {
+ createWrapper({ props: { label: 'Field Name' } });
+
+ expect(findLabelText()).toBe('Field Name');
+ });
+
+ it('does not render the label slot when no label prop is provided', () => {
+ createWrapper({ props: {} });
+
+ expect(findLabelText()).toBe('');
+ });
+
+ it('renders the value slot when a value prop is provided', () => {
+ createWrapper({ props: { value: 'testValue' } });
+
+ expect(findValueText()).toBe('testValue');
+ });
+
+ it('renders the emptyValue when no value prop is provided', () => {
+ createWrapper({ props: {} });
+
+ expect(findValueText()).toBe('None');
+ });
+
+ it('renders both the label and value slots when both label and value props are provided', () => {
+ createWrapper({ props: { label: 'Field Name', value: 'testValue' } });
+
+ expect(findLabelText()).toBe('Field Name');
+ expect(findValueText()).toBe('testValue');
+ });
+
+ it('renders the label slot when a label slot is provided', () => {
+ createWrapper({
+ slots: {
+ label: 'Label Slot Test',
+ },
+ });
+
+ expect(findLabelText()).toBe('Label Slot Test');
+ });
+
+ it('does not render the label slot when no label slot is provided', () => {
+ createWrapper({
+ slots: {},
+ });
+
+ expect(findLabelText()).toBe('');
+ });
+
+ it('renders the value slot when a value slot is provided', () => {
+ createWrapper({
+ slots: {
+ value: 'Value Slot Test',
+ },
+ });
+
+ expect(findValueText()).toBe('Value Slot Test');
+ });
+
+ it('renders the emptyValue when no value slot is provided', () => {
+ createWrapper({
+ slots: {},
+ });
+
+ expect(findValueText()).toBe('None');
+ });
+
+ it('renders both the label and value slots when both label and value slots are provided', () => {
+ createWrapper({ slots: { label: 'Label Slot Test', value: 'Value Slot Test' } });
+
+ expect(findLabelText()).toBe('Label Slot Test');
+ expect(findValueText()).toBe('Value Slot Test');
+ });
+});
diff --git a/spec/frontend/ci/runner/components/runner_edit_button_spec.js b/spec/frontend/ci/runner/components/runner_edit_button_spec.js
index 5cc1ee049f4..5e36ff77146 100644
--- a/spec/frontend/ci/runner/components/runner_edit_button_spec.js
+++ b/spec/frontend/ci/runner/components/runner_edit_button_spec.js
@@ -1,18 +1,25 @@
-import { shallowMount, mount } from '@vue/test-utils';
+import { GlButton } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
import RunnerEditButton from '~/ci/runner/components/runner_edit_button.vue';
import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
+import { I18N_EDIT } from '~/ci/runner/constants';
describe('RunnerEditButton', () => {
let wrapper;
+ const findButton = () => wrapper.findComponent(GlButton);
const getTooltipValue = () => getBinding(wrapper.element, 'gl-tooltip').value;
- const createComponent = ({ attrs = {}, mountFn = shallowMount } = {}) => {
+ const createComponent = ({ props = {}, mountFn = shallowMount, ...options } = {}) => {
wrapper = mountFn(RunnerEditButton, {
- attrs,
+ propsData: {
+ href: '/edit',
+ ...props,
+ },
directives: {
GlTooltip: createMockDirective('gl-tooltip'),
},
+ ...options,
});
};
@@ -21,17 +28,24 @@ describe('RunnerEditButton', () => {
});
it('Displays Edit text', () => {
- expect(wrapper.attributes('aria-label')).toBe('Edit');
+ expect(wrapper.attributes('aria-label')).toBe(I18N_EDIT);
});
it('Displays Edit tooltip', () => {
- expect(getTooltipValue()).toBe('Edit');
+ expect(getTooltipValue()).toBe(I18N_EDIT);
});
it('Renders a link and adds an href attribute', () => {
- createComponent({ attrs: { href: '/edit' }, mountFn: mount });
+ expect(findButton().attributes('href')).toBe('/edit');
+ });
- expect(wrapper.element.tagName).toBe('A');
- expect(wrapper.attributes('href')).toBe('/edit');
+ describe('When no href is provided', () => {
+ beforeEach(() => {
+ createComponent({ props: { href: null } });
+ });
+
+ it('does not render', () => {
+ expect(wrapper.html()).toBe('');
+ });
});
});
diff --git a/spec/frontend/ci/runner/components/runner_edit_disclosure_dropdown_item_spec.js b/spec/frontend/ci/runner/components/runner_edit_disclosure_dropdown_item_spec.js
new file mode 100644
index 00000000000..4c6b4d2d52a
--- /dev/null
+++ b/spec/frontend/ci/runner/components/runner_edit_disclosure_dropdown_item_spec.js
@@ -0,0 +1,42 @@
+import { shallowMount, mount } from '@vue/test-utils';
+import { GlDisclosureDropdownItem } from '@gitlab/ui';
+import RunnerEditDisclosureDropdownItem from '~/ci/runner/components/runner_edit_disclosure_dropdown_item.vue';
+import { I18N_EDIT } from '~/ci/runner/constants';
+
+describe('RunnerEditDisclosureDropdownItem', () => {
+ let wrapper;
+
+ const findItem = () => wrapper.findComponent(GlDisclosureDropdownItem);
+
+ const createComponent = ({ props = {}, mountFn = shallowMount, ...options } = {}) => {
+ wrapper = mountFn(RunnerEditDisclosureDropdownItem, {
+ propsData: {
+ href: '/edit',
+ ...props,
+ },
+ ...options,
+ });
+ };
+
+ it('Displays Edit text', () => {
+ createComponent({ mountFn: mount });
+
+ expect(wrapper.text()).toBe(I18N_EDIT);
+ });
+
+ it('Renders a link and adds an href attribute', () => {
+ createComponent();
+
+ expect(findItem().props('item').href).toBe('/edit');
+ });
+
+ describe('When no href is provided', () => {
+ beforeEach(() => {
+ createComponent({ props: { href: null } });
+ });
+
+ it('does not render', () => {
+ expect(wrapper.html()).toBe('');
+ });
+ });
+});
diff --git a/spec/frontend/ci/runner/components/runner_header_actions_spec.js b/spec/frontend/ci/runner/components/runner_header_actions_spec.js
new file mode 100644
index 00000000000..243ada73435
--- /dev/null
+++ b/spec/frontend/ci/runner/components/runner_header_actions_spec.js
@@ -0,0 +1,147 @@
+import { GlDisclosureDropdown } from '@gitlab/ui';
+import { s__ } from '~/locale';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+
+import RunnerHeaderActions from '~/ci/runner/components/runner_header_actions.vue';
+
+import RunnerPauseButton from '~/ci/runner/components/runner_pause_button.vue';
+import RunnerDeleteButton from '~/ci/runner/components/runner_delete_button.vue';
+import RunnerEditButton from '~/ci/runner/components/runner_edit_button.vue';
+
+import RunnerEditDisclosureDropdownItem from '~/ci/runner/components/runner_edit_disclosure_dropdown_item.vue';
+import RunnerPauseDisclosureDropdownItem from '~/ci/runner/components/runner_pause_disclosure_dropdown_item.vue';
+import RunnerDeleteDisclosureDropdownItem from '~/ci/runner/components/runner_delete_disclosure_dropdown_item.vue';
+
+import { runnerData } from '../mock_data';
+
+const mockRunner = runnerData.data.runner;
+const mockRunnerEditPath = '/edit';
+
+describe('RunnerHeaderActions', () => {
+ let wrapper;
+
+ const findRunnerEditButton = () => wrapper.findComponent(RunnerEditButton);
+ const findRunnerPauseButton = () => wrapper.findComponent(RunnerPauseButton);
+ const findRunnerDeleteButton = () => wrapper.findComponent(RunnerDeleteButton);
+
+ const findDropdown = () => wrapper.findComponent(GlDisclosureDropdown);
+ const findEditItem = () => findDropdown().findComponent(RunnerEditDisclosureDropdownItem);
+ const findPauseItem = () => findDropdown().findComponent(RunnerPauseDisclosureDropdownItem);
+ const findDeleteItem = () => findDropdown().findComponent(RunnerDeleteDisclosureDropdownItem);
+
+ const createComponent = ({ props = {}, options = {}, mountFn = shallowMountExtended } = {}) => {
+ const { runner, ...propsData } = props;
+
+ wrapper = mountFn(RunnerHeaderActions, {
+ propsData: {
+ runner: {
+ ...mockRunner,
+ ...runner,
+ },
+ editPath: mockRunnerEditPath,
+ ...propsData,
+ },
+ ...options,
+ });
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders all elements', () => {
+ // visible on md and up screens
+ expect(findRunnerEditButton().exists()).toBe(true);
+ expect(findRunnerPauseButton().exists()).toBe(true);
+ expect(findRunnerDeleteButton().exists()).toBe(true);
+
+ // visible on small screens
+ expect(findDropdown().exists()).toBe(true);
+ expect(findEditItem().exists()).toBe(true);
+ expect(findPauseItem().exists()).toBe(true);
+ expect(findDeleteItem().exists()).toBe(true);
+ });
+
+ it('renders disclosure dropdown with no caret and accesible text', () => {
+ expect(findDropdown().props()).toMatchObject({
+ icon: 'ellipsis_v',
+ toggleText: s__('Runner|Runner actions'),
+ textSrOnly: true,
+ category: 'tertiary',
+ noCaret: true,
+ });
+ });
+
+ it.each([findRunnerEditButton, findEditItem])('edit path is set (%p)', (find) => {
+ expect(find().props('href')).toEqual(mockRunnerEditPath);
+ });
+
+ it.each([findRunnerDeleteButton, findDeleteItem])('delete is emitted (%p)', (find) => {
+ const deleteEvent = { message: 'Deleted!' };
+
+ find().vm.$emit('deleted', deleteEvent);
+
+ expect(wrapper.emitted('deleted')).toEqual([[deleteEvent]]);
+ });
+
+ describe('when delete is disabled', () => {
+ beforeEach(() => {
+ createComponent({
+ props: {
+ runner: {
+ userPermissions: {
+ updateRunner: true,
+ deleteRunner: false,
+ },
+ },
+ },
+ });
+ });
+
+ it('does not render delete actions', () => {
+ expect(findRunnerDeleteButton().exists()).toBe(false);
+ expect(findDeleteItem().exists()).toBe(false);
+ });
+ });
+
+ describe('when update is disabled', () => {
+ beforeEach(() => {
+ createComponent({
+ props: {
+ runner: {
+ userPermissions: {
+ updateRunner: false,
+ deleteRunner: true,
+ },
+ },
+ },
+ });
+ });
+
+ it('does not render delete actions', () => {
+ expect(findRunnerEditButton().exists()).toBe(false);
+ expect(findRunnerPauseButton().exists()).toBe(false);
+ expect(findEditItem().exists()).toBe(false);
+ expect(findPauseItem().exists()).toBe(false);
+ });
+ });
+
+ describe('when no actions are enabled', () => {
+ beforeEach(() => {
+ createComponent({
+ props: {
+ runner: {
+ userPermissions: {
+ updateRunner: false,
+ deleteRunner: false,
+ },
+ },
+ },
+ });
+ });
+
+ it('does not render actions', () => {
+ expect(wrapper.html()).toBe('');
+ });
+ });
+});
diff --git a/spec/frontend/ci/runner/components/runner_list_empty_state_spec.js b/spec/frontend/ci/runner/components/runner_list_empty_state_spec.js
index 22797433b58..511ed88f5ab 100644
--- a/spec/frontend/ci/runner/components/runner_list_empty_state_spec.js
+++ b/spec/frontend/ci/runner/components/runner_list_empty_state_spec.js
@@ -10,7 +10,6 @@ import {
I18N_CREATE_RUNNER_LINK,
I18N_STILL_USING_REGISTRATION_TOKENS,
I18N_CONTACT_ADMIN_TO_REGISTER,
- I18N_FOLLOW_REGISTRATION_INSTRUCTIONS,
I18N_NO_RESULTS,
I18N_EDIT_YOUR_SEARCH,
} from '~/ci/runner/constants';
@@ -59,136 +58,84 @@ describe('RunnerListEmptyState', () => {
});
describe('when search is not filtered', () => {
- describe.each([
- { createRunnerWorkflowForAdmin: true },
- { createRunnerWorkflowForNamespace: true },
- ])('when createRunnerWorkflow is enabled by %o', (currentGlFeatures) => {
- beforeEach(() => {
- glFeatures = currentGlFeatures;
- });
-
- describe.each`
- newRunnerPath | registrationToken | expectedMessages
- ${mockNewRunnerPath} | ${mockRegistrationToken} | ${[I18N_CREATE_RUNNER_LINK, I18N_STILL_USING_REGISTRATION_TOKENS]}
- ${mockNewRunnerPath} | ${null} | ${[I18N_CREATE_RUNNER_LINK]}
- ${null} | ${mockRegistrationToken} | ${[I18N_STILL_USING_REGISTRATION_TOKENS]}
- ${null} | ${null} | ${[I18N_CONTACT_ADMIN_TO_REGISTER]}
- `(
- 'when newRunnerPath is $newRunnerPath and registrationToken is $registrationToken',
- ({ newRunnerPath, registrationToken, expectedMessages }) => {
- beforeEach(() => {
- createComponent({
- props: {
- newRunnerPath,
- registrationToken,
- },
- });
- });
-
- it('shows title', () => {
- expectTitleToBe(I18N_GET_STARTED);
- });
-
- it('renders an illustration', () => {
- expect(findEmptyState().props('svgPath')).toBe(EMPTY_STATE_SVG_URL);
- });
-
- it(`shows description: "${expectedMessages.join(' ')}"`, () => {
- expectDescriptionToBe([I18N_RUNNERS_ARE_AGENTS, ...expectedMessages]);
- });
- },
- );
-
- describe('with newRunnerPath and registration token', () => {
+ describe.each`
+ newRunnerPath | registrationToken | expectedMessages
+ ${mockNewRunnerPath} | ${mockRegistrationToken} | ${[I18N_CREATE_RUNNER_LINK, I18N_STILL_USING_REGISTRATION_TOKENS]}
+ ${mockNewRunnerPath} | ${null} | ${[I18N_CREATE_RUNNER_LINK]}
+ ${null} | ${mockRegistrationToken} | ${[I18N_STILL_USING_REGISTRATION_TOKENS]}
+ ${null} | ${null} | ${[I18N_CONTACT_ADMIN_TO_REGISTER]}
+ `(
+ 'when newRunnerPath is $newRunnerPath and registrationToken is $registrationToken',
+ ({ newRunnerPath, registrationToken, expectedMessages }) => {
beforeEach(() => {
createComponent({
props: {
- registrationToken: mockRegistrationToken,
- newRunnerPath: mockNewRunnerPath,
+ newRunnerPath,
+ registrationToken,
},
});
});
- it('shows links to the new runner page and registration instructions', () => {
- expect(findLinks().at(0).attributes('href')).toBe(mockNewRunnerPath);
+ it('shows title', () => {
+ expectTitleToBe(I18N_GET_STARTED);
+ });
- const { value } = getBinding(findLinks().at(1).element, 'gl-modal');
- expect(findRunnerInstructionsModal().props('modalId')).toEqual(value);
+ it('renders an illustration', () => {
+ expect(findEmptyState().props('svgPath')).toBe(EMPTY_STATE_SVG_URL);
});
- });
- describe('with newRunnerPath and no registration token', () => {
- beforeEach(() => {
- createComponent({
- props: {
- registrationToken: mockRegistrationToken,
- newRunnerPath: null,
- },
- });
+ it(`shows description: "${expectedMessages.join(' ')}"`, () => {
+ expectDescriptionToBe([I18N_RUNNERS_ARE_AGENTS, ...expectedMessages]);
});
+ },
+ );
- it('opens a runner registration instructions modal with a link', () => {
- const { value } = getBinding(findLink().element, 'gl-modal');
- expect(findRunnerInstructionsModal().props('modalId')).toEqual(value);
+ describe('with newRunnerPath and registration token', () => {
+ beforeEach(() => {
+ createComponent({
+ props: {
+ registrationToken: mockRegistrationToken,
+ newRunnerPath: mockNewRunnerPath,
+ },
});
});
- describe('with no newRunnerPath nor registration token', () => {
- beforeEach(() => {
- createComponent({
- props: {
- registrationToken: null,
- newRunnerPath: null,
- },
- });
- });
+ it('shows links to the new runner page and registration instructions', () => {
+ expect(findLinks().at(0).attributes('href')).toBe(mockNewRunnerPath);
- it('has no link', () => {
- expect(findLink().exists()).toBe(false);
- });
+ const { value } = getBinding(findLinks().at(1).element, 'gl-modal');
+ expect(findRunnerInstructionsModal().props('modalId')).toEqual(value);
});
});
- describe('when createRunnerWorkflow is disabled', () => {
- describe('when there is a registration token', () => {
- beforeEach(() => {
- createComponent({
- props: {
- registrationToken: mockRegistrationToken,
- },
- });
- });
-
- it('renders an illustration', () => {
- expect(findEmptyState().props('svgPath')).toBe(EMPTY_STATE_SVG_URL);
- });
-
- it('opens a runner registration instructions modal with a link', () => {
- const { value } = getBinding(findLink().element, 'gl-modal');
- expect(findRunnerInstructionsModal().props('modalId')).toEqual(value);
- });
-
- it('displays text with registration instructions', () => {
- expectTitleToBe(I18N_GET_STARTED);
-
- expectDescriptionToBe([I18N_RUNNERS_ARE_AGENTS, I18N_FOLLOW_REGISTRATION_INSTRUCTIONS]);
+ describe('with newRunnerPath and no registration token', () => {
+ beforeEach(() => {
+ createComponent({
+ props: {
+ registrationToken: mockRegistrationToken,
+ newRunnerPath: null,
+ },
});
});
- describe('when there is no registration token', () => {
- beforeEach(() => {
- createComponent({ props: { registrationToken: null } });
- });
-
- it('displays "contact admin" text', () => {
- expectTitleToBe(I18N_GET_STARTED);
+ it('opens a runner registration instructions modal with a link', () => {
+ const { value } = getBinding(findLink().element, 'gl-modal');
+ expect(findRunnerInstructionsModal().props('modalId')).toEqual(value);
+ });
+ });
- expectDescriptionToBe([I18N_RUNNERS_ARE_AGENTS, I18N_CONTACT_ADMIN_TO_REGISTER]);
+ describe('with no newRunnerPath nor registration token', () => {
+ beforeEach(() => {
+ createComponent({
+ props: {
+ registrationToken: null,
+ newRunnerPath: null,
+ },
});
+ });
- it('has no registration instructions link', () => {
- expect(findLink().exists()).toBe(false);
- });
+ it('has no link', () => {
+ expect(findLink().exists()).toBe(false);
});
});
});
diff --git a/spec/frontend/ci/runner/components/runner_pause_action_spec.js b/spec/frontend/ci/runner/components/runner_pause_action_spec.js
new file mode 100644
index 00000000000..b987eb1e310
--- /dev/null
+++ b/spec/frontend/ci/runner/components/runner_pause_action_spec.js
@@ -0,0 +1,180 @@
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import runnerTogglePausedMutation from '~/ci/runner/graphql/shared/runner_toggle_paused.mutation.graphql';
+import waitForPromises from 'helpers/wait_for_promises';
+import { captureException } from '~/ci/runner/sentry_utils';
+import { createAlert } from '~/alert';
+
+import RunnerPauseAction from '~/ci/runner/components/runner_pause_action.vue';
+import { allRunnersData } from '../mock_data';
+
+const mockRunner = allRunnersData.data.runners.nodes[0];
+
+Vue.use(VueApollo);
+
+jest.mock('~/alert');
+jest.mock('~/ci/runner/sentry_utils');
+
+describe('RunnerPauseAction', () => {
+ let wrapper;
+ let runnerTogglePausedHandler;
+
+ const findBtn = () => wrapper.find('button');
+
+ const createComponent = ({ props = {}, mountFn = shallowMountExtended } = {}) => {
+ const { runner, ...propsData } = props;
+
+ wrapper = mountFn(RunnerPauseAction, {
+ propsData: {
+ runner: {
+ id: mockRunner.id,
+ paused: mockRunner.paused,
+ ...runner,
+ },
+ ...propsData,
+ },
+ apolloProvider: createMockApollo([[runnerTogglePausedMutation, runnerTogglePausedHandler]]),
+ scopedSlots: {
+ default: '<button :disabled="props.loading" @click="props.onClick"/>',
+ },
+ });
+ };
+
+ const clickAndWait = async () => {
+ findBtn().trigger('click');
+ await waitForPromises();
+ };
+
+ beforeEach(() => {
+ runnerTogglePausedHandler = jest.fn().mockImplementation(({ input }) => {
+ return Promise.resolve({
+ data: {
+ runnerUpdate: {
+ runner: {
+ id: input.id,
+ paused: !input.paused,
+ },
+ errors: [],
+ },
+ },
+ });
+ });
+
+ createComponent();
+ });
+
+ describe('Pause/Resume action', () => {
+ describe.each`
+ runnerState | isPaused | newPausedValue
+ ${'paused'} | ${true} | ${false}
+ ${'active'} | ${false} | ${true}
+ `('When the runner is $runnerState', ({ isPaused, newPausedValue }) => {
+ beforeEach(() => {
+ createComponent({
+ props: {
+ runner: {
+ paused: isPaused,
+ },
+ },
+ });
+ });
+
+ it('Displays slot contents', () => {
+ expect(findBtn().exists()).toBe(true);
+ });
+
+ it('The mutation has not been called', () => {
+ expect(runnerTogglePausedHandler).not.toHaveBeenCalled();
+ });
+
+ describe('Immediately after the action is triggered', () => {
+ it('The button has a loading state', async () => {
+ await findBtn().trigger('click');
+
+ expect(findBtn().attributes('disabled')).toBe('disabled');
+ });
+ });
+
+ describe('After the action is triggered', () => {
+ beforeEach(async () => {
+ await clickAndWait();
+ });
+
+ it(`The mutation to that sets "paused" to ${newPausedValue} is called`, () => {
+ expect(runnerTogglePausedHandler).toHaveBeenCalledTimes(1);
+ expect(runnerTogglePausedHandler).toHaveBeenCalledWith({
+ input: {
+ id: mockRunner.id,
+ paused: newPausedValue,
+ },
+ });
+ });
+
+ it('The button does not have a loading state', () => {
+ expect(findBtn().attributes('disabled')).toBeUndefined();
+ });
+
+ it('The button emits "done"', () => {
+ expect(wrapper.emitted('done')).toHaveLength(1);
+ });
+ });
+
+ describe('When update fails', () => {
+ describe('On a network error', () => {
+ const mockErrorMsg = 'Update error!';
+
+ beforeEach(async () => {
+ runnerTogglePausedHandler.mockRejectedValueOnce(new Error(mockErrorMsg));
+
+ await clickAndWait();
+ });
+
+ it('error is reported to sentry', () => {
+ expect(captureException).toHaveBeenCalledWith({
+ error: new Error(mockErrorMsg),
+ component: 'RunnerPauseAction',
+ });
+ });
+
+ it('error is shown to the user', () => {
+ expect(createAlert).toHaveBeenCalledTimes(1);
+ });
+ });
+
+ describe('On a validation error', () => {
+ const mockErrorMsg = 'Runner not found!';
+ const mockErrorMsg2 = 'User not allowed!';
+
+ beforeEach(async () => {
+ runnerTogglePausedHandler.mockResolvedValueOnce({
+ data: {
+ runnerUpdate: {
+ runner: {
+ id: mockRunner.id,
+ paused: isPaused,
+ },
+ errors: [mockErrorMsg, mockErrorMsg2],
+ },
+ },
+ });
+
+ await clickAndWait();
+ });
+
+ it('error is reported to sentry', () => {
+ expect(captureException).toHaveBeenCalledWith({
+ error: new Error(`${mockErrorMsg} ${mockErrorMsg2}`),
+ component: 'RunnerPauseAction',
+ });
+ });
+
+ it('error is shown to the user', () => {
+ expect(createAlert).toHaveBeenCalledTimes(1);
+ });
+ });
+ });
+ });
+ });
+});
diff --git a/spec/frontend/ci/runner/components/runner_pause_button_spec.js b/spec/frontend/ci/runner/components/runner_pause_button_spec.js
index 1ea870e004a..f1ceecd4ae4 100644
--- a/spec/frontend/ci/runner/components/runner_pause_button_spec.js
+++ b/spec/frontend/ci/runner/components/runner_pause_button_spec.js
@@ -1,13 +1,7 @@
-import Vue, { nextTick } from 'vue';
import { GlButton } from '@gitlab/ui';
-import VueApollo from 'vue-apollo';
-import createMockApollo from 'helpers/mock_apollo_helper';
+import { stubComponent } from 'helpers/stub_component';
import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
import { shallowMountExtended, mountExtended } from 'helpers/vue_test_utils_helper';
-import runnerTogglePausedMutation from '~/ci/runner/graphql/shared/runner_toggle_paused.mutation.graphql';
-import waitForPromises from 'helpers/wait_for_promises';
-import { captureException } from '~/ci/runner/sentry_utils';
-import { createAlert } from '~/alert';
import {
I18N_PAUSE,
I18N_PAUSE_TOOLTIP,
@@ -16,244 +10,140 @@ import {
} from '~/ci/runner/constants';
import RunnerPauseButton from '~/ci/runner/components/runner_pause_button.vue';
-import { allRunnersData } from '../mock_data';
-
-const mockRunner = allRunnersData.data.runners.nodes[0];
-
-Vue.use(VueApollo);
-
-jest.mock('~/alert');
-jest.mock('~/ci/runner/sentry_utils');
+import RunnerPauseAction from '~/ci/runner/components/runner_pause_action.vue';
describe('RunnerPauseButton', () => {
let wrapper;
- let runnerTogglePausedHandler;
const getTooltip = () => getBinding(wrapper.element, 'gl-tooltip').value;
+ const findRunnerPauseAction = () => wrapper.findComponent(RunnerPauseAction);
const findBtn = () => wrapper.findComponent(GlButton);
- const createComponent = ({ props = {}, mountFn = shallowMountExtended } = {}) => {
- const { runner, ...propsData } = props;
-
+ const createComponent = ({
+ props = {},
+ loading,
+ onClick = jest.fn(),
+ mountFn = shallowMountExtended,
+ } = {}) => {
wrapper = mountFn(RunnerPauseButton, {
propsData: {
- runner: {
- id: mockRunner.id,
- paused: mockRunner.paused,
- ...runner,
- },
- ...propsData,
+ runner: {},
+ ...props,
},
- apolloProvider: createMockApollo([[runnerTogglePausedMutation, runnerTogglePausedHandler]]),
directives: {
GlTooltip: createMockDirective('gl-tooltip'),
},
+ stubs: {
+ RunnerPauseAction: stubComponent(RunnerPauseAction, {
+ render() {
+ return this.$scopedSlots.default({
+ loading,
+ onClick,
+ });
+ },
+ }),
+ },
});
};
- const clickAndWait = async () => {
- findBtn().vm.$emit('click');
- await waitForPromises();
- };
-
beforeEach(() => {
- runnerTogglePausedHandler = jest.fn().mockImplementation(({ input }) => {
- return Promise.resolve({
- data: {
- runnerUpdate: {
- runner: {
- id: input.id,
- paused: !input.paused,
- },
- errors: [],
- },
- },
- });
- });
-
createComponent();
});
- describe('Pause/Resume action', () => {
+ describe('Pause/Resume button', () => {
describe.each`
- runnerState | icon | content | tooltip | isPaused | newPausedValue
- ${'paused'} | ${'play'} | ${I18N_RESUME} | ${I18N_RESUME_TOOLTIP} | ${true} | ${false}
- ${'active'} | ${'pause'} | ${I18N_PAUSE} | ${I18N_PAUSE_TOOLTIP} | ${false} | ${true}
- `('When the runner is $runnerState', ({ icon, content, tooltip, isPaused, newPausedValue }) => {
- beforeEach(() => {
- createComponent({
- props: {
- runner: {
- paused: isPaused,
+ runnerState | paused | expectedIcon | expectedContent | expectedTooltip
+ ${'paused'} | ${true} | ${'play'} | ${I18N_RESUME} | ${I18N_RESUME_TOOLTIP}
+ ${'active'} | ${false} | ${'pause'} | ${I18N_PAUSE} | ${I18N_PAUSE_TOOLTIP}
+ `(
+ 'When the runner is $runnerState',
+ ({ paused, expectedIcon, expectedContent, expectedTooltip }) => {
+ beforeEach(() => {
+ createComponent({
+ props: {
+ runner: { paused },
},
- },
- });
- });
-
- it(`Displays a ${icon} button`, () => {
- expect(findBtn().props('loading')).toBe(false);
- expect(findBtn().props('icon')).toBe(icon);
- });
-
- it('Displays button content', () => {
- expect(findBtn().text()).toBe(content);
- expect(getTooltip()).toBe(tooltip);
- });
-
- it('Does not display redundant text for screen readers', () => {
- expect(findBtn().attributes('aria-label')).toBe(undefined);
- });
-
- describe(`Before the ${icon} button is clicked`, () => {
- it('The mutation has not been called', () => {
- expect(runnerTogglePausedHandler).not.toHaveBeenCalled();
+ });
});
- });
-
- describe(`Immediately after the ${icon} button is clicked`, () => {
- const setup = async () => {
- findBtn().vm.$emit('click');
- await nextTick();
- };
- it('The button has a loading state', async () => {
- await setup();
-
- expect(findBtn().props('loading')).toBe(true);
+ it(`Displays a ${expectedIcon} button`, () => {
+ expect(findBtn().props('loading')).toBe(false);
+ expect(findBtn().props('icon')).toBe(expectedIcon);
});
- it('The stale tooltip is removed', async () => {
- await setup();
-
- expect(getTooltip()).toBe('');
+ it('Displays button content', () => {
+ expect(findBtn().text()).toBe(expectedContent);
+ expect(getTooltip()).toBe(expectedTooltip);
});
- });
- describe(`After clicking on the ${icon} button`, () => {
- beforeEach(async () => {
- await clickAndWait();
+ it('Does not display redundant text for screen readers', () => {
+ expect(findBtn().attributes('aria-label')).toBe(undefined);
});
+ },
+ );
+ });
- it(`The mutation to that sets "paused" to ${newPausedValue} is called`, () => {
- expect(runnerTogglePausedHandler).toHaveBeenCalledTimes(1);
- expect(runnerTogglePausedHandler).toHaveBeenCalledWith({
- input: {
- id: mockRunner.id,
- paused: newPausedValue,
+ describe('Compact button', () => {
+ describe.each`
+ runnerState | paused | expectedIcon | expectedContent | expectedTooltip
+ ${'paused'} | ${true} | ${'play'} | ${I18N_RESUME} | ${I18N_RESUME_TOOLTIP}
+ ${'active'} | ${false} | ${'pause'} | ${I18N_PAUSE} | ${I18N_PAUSE_TOOLTIP}
+ `(
+ 'When the runner is $runnerState',
+ ({ paused, expectedIcon, expectedContent, expectedTooltip }) => {
+ beforeEach(() => {
+ createComponent({
+ props: {
+ runner: { paused },
+ compact: true,
},
+ mountFn: mountExtended,
});
});
- it('The button does not have a loading state', () => {
+ it(`Displays a ${expectedIcon} button`, () => {
expect(findBtn().props('loading')).toBe(false);
+ expect(findBtn().props('icon')).toBe(expectedIcon);
});
- it('The button emits toggledPaused', () => {
- expect(wrapper.emitted('toggledPaused')).toHaveLength(1);
- });
- });
-
- describe('When update fails', () => {
- describe('On a network error', () => {
- const mockErrorMsg = 'Update error!';
-
- beforeEach(async () => {
- runnerTogglePausedHandler.mockRejectedValueOnce(new Error(mockErrorMsg));
-
- await clickAndWait();
- });
-
- it('error is reported to sentry', () => {
- expect(captureException).toHaveBeenCalledWith({
- error: new Error(mockErrorMsg),
- component: 'RunnerPauseButton',
- });
- });
+ it('Displays button content', () => {
+ expect(findBtn().text()).toBe('');
+ // Note: Use <template v-if> to ensure rendering a
+ // text-less button. Ensure we don't send even empty an
+ // content slot to prevent a distorted/rectangular button.
+ expect(wrapper.find('.gl-button-text').exists()).toBe(false);
- it('error is shown to the user', () => {
- expect(createAlert).toHaveBeenCalledTimes(1);
- });
+ expect(getTooltip()).toBe(expectedTooltip);
});
- describe('On a validation error', () => {
- const mockErrorMsg = 'Runner not found!';
- const mockErrorMsg2 = 'User not allowed!';
-
- beforeEach(async () => {
- runnerTogglePausedHandler.mockResolvedValueOnce({
- data: {
- runnerUpdate: {
- runner: {
- id: mockRunner.id,
- paused: isPaused,
- },
- errors: [mockErrorMsg, mockErrorMsg2],
- },
- },
- });
-
- await clickAndWait();
- });
-
- it('error is reported to sentry', () => {
- expect(captureException).toHaveBeenCalledWith({
- error: new Error(`${mockErrorMsg} ${mockErrorMsg2}`),
- component: 'RunnerPauseButton',
- });
- });
-
- it('error is shown to the user', () => {
- expect(createAlert).toHaveBeenCalledTimes(1);
- });
+ it('Does not display redundant text for screen readers', () => {
+ expect(findBtn().attributes('aria-label')).toBe(expectedContent);
});
- });
- });
+ },
+ );
});
- describe('When displaying a compact button for an active runner', () => {
- beforeEach(() => {
- createComponent({
- props: {
- runner: {
- paused: false,
- },
- compact: true,
- },
- mountFn: mountExtended,
- });
- });
-
- it('Displays no text', () => {
- expect(findBtn().text()).toBe('');
+ it('Shows loading state', () => {
+ createComponent({ loading: true });
- // Note: Use <template v-if> to ensure rendering a
- // text-less button. Ensure we don't send even empty an
- // content slot to prevent a distorted/rectangular button.
- expect(wrapper.find('.gl-button-text').exists()).toBe(false);
- });
+ expect(findBtn().props('loading')).toBe(true);
+ expect(getTooltip()).toBe('');
+ });
- it('Display correctly for screen readers', () => {
- expect(findBtn().attributes('aria-label')).toBe(I18N_PAUSE);
- expect(getTooltip()).toBe(I18N_PAUSE_TOOLTIP);
- });
+ it('Triggers action', () => {
+ const mockOnClick = jest.fn();
- describe('Immediately after the button is clicked', () => {
- const setup = async () => {
- findBtn().vm.$emit('click');
- await nextTick();
- };
+ createComponent({ onClick: mockOnClick });
+ findBtn().vm.$emit('click');
- it('The button has a loading state', async () => {
- await setup();
+ expect(mockOnClick).toHaveBeenCalled();
+ });
- expect(findBtn().props('loading')).toBe(true);
- });
+ it('Emits toggledPaused when done', () => {
+ createComponent();
- it('The stale tooltip is removed', async () => {
- await setup();
+ findRunnerPauseAction().vm.$emit('done');
- expect(getTooltip()).toBe('');
- });
- });
+ expect(wrapper.emitted('toggledPaused')).toHaveLength(1);
});
});
diff --git a/spec/frontend/ci/runner/components/runner_pause_disclosure_dropdown_item_spec.js b/spec/frontend/ci/runner/components/runner_pause_disclosure_dropdown_item_spec.js
new file mode 100644
index 00000000000..5dc9a615b0e
--- /dev/null
+++ b/spec/frontend/ci/runner/components/runner_pause_disclosure_dropdown_item_spec.js
@@ -0,0 +1,71 @@
+import { GlDisclosureDropdownItem } from '@gitlab/ui';
+import { stubComponent } from 'helpers/stub_component';
+import { shallowMountExtended, mountExtended } from 'helpers/vue_test_utils_helper';
+import { I18N_PAUSE, I18N_RESUME } from '~/ci/runner/constants';
+
+import RunnerPauseDisclosureDropdownItem from '~/ci/runner/components/runner_pause_disclosure_dropdown_item.vue';
+import RunnerPauseAction from '~/ci/runner/components/runner_pause_action.vue';
+
+describe('RunnerPauseButton', () => {
+ let wrapper;
+
+ const findRunnerPauseAction = () => wrapper.findComponent(RunnerPauseAction);
+ const findDisclosureDropdownItem = () => wrapper.findComponent(GlDisclosureDropdownItem);
+
+ const createComponent = ({
+ props = {},
+ onClick = jest.fn(),
+ mountFn = shallowMountExtended,
+ } = {}) => {
+ wrapper = mountFn(RunnerPauseDisclosureDropdownItem, {
+ propsData: {
+ runner: {},
+ ...props,
+ },
+ stubs: {
+ RunnerPauseAction: stubComponent(RunnerPauseAction, {
+ render() {
+ return this.$scopedSlots.default({
+ onClick,
+ });
+ },
+ }),
+ },
+ });
+ };
+
+ it('Displays paused runner button content', () => {
+ createComponent({
+ props: { runner: { paused: true } },
+ mountFn: mountExtended,
+ });
+
+ expect(findDisclosureDropdownItem().text()).toBe(I18N_RESUME);
+ });
+
+ it('Displays active runner button content', () => {
+ createComponent({
+ props: { runner: { paused: false } },
+ mountFn: mountExtended,
+ });
+
+ expect(findDisclosureDropdownItem().text()).toBe(I18N_PAUSE);
+ });
+
+ it('Triggers action', () => {
+ const mockOnClick = jest.fn();
+
+ createComponent({ onClick: mockOnClick });
+ findDisclosureDropdownItem().vm.$emit('action');
+
+ expect(mockOnClick).toHaveBeenCalled();
+ });
+
+ it('Emits toggledPaused when done', () => {
+ createComponent();
+
+ findRunnerPauseAction().vm.$emit('done');
+
+ expect(wrapper.emitted('toggledPaused')).toHaveLength(1);
+ });
+});
diff --git a/spec/frontend/ci/runner/group_runner_show/group_runner_show_app_spec.js b/spec/frontend/ci/runner/group_runner_show/group_runner_show_app_spec.js
index 120388900b5..7438c47e32c 100644
--- a/spec/frontend/ci/runner/group_runner_show/group_runner_show_app_spec.js
+++ b/spec/frontend/ci/runner/group_runner_show/group_runner_show_app_spec.js
@@ -9,10 +9,8 @@ import { visitUrl } from '~/lib/utils/url_utility';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import RunnerHeader from '~/ci/runner/components/runner_header.vue';
+import RunnerHeaderActions from '~/ci/runner/components/runner_header_actions.vue';
import RunnerDetails from '~/ci/runner/components/runner_details.vue';
-import RunnerPauseButton from '~/ci/runner/components/runner_pause_button.vue';
-import RunnerDeleteButton from '~/ci/runner/components/runner_delete_button.vue';
-import RunnerEditButton from '~/ci/runner/components/runner_edit_button.vue';
import RunnerDetailsTabs from '~/ci/runner/components/runner_details_tabs.vue';
import RunnersJobs from '~/ci/runner/components/runner_jobs.vue';
@@ -47,9 +45,7 @@ describe('GroupRunnerShowApp', () => {
const findRunnerHeader = () => wrapper.findComponent(RunnerHeader);
const findRunnerDetails = () => wrapper.findComponent(RunnerDetails);
- const findRunnerDeleteButton = () => wrapper.findComponent(RunnerDeleteButton);
- const findRunnerEditButton = () => wrapper.findComponent(RunnerEditButton);
- const findRunnerPauseButton = () => wrapper.findComponent(RunnerPauseButton);
+ const findRunnerHeaderActions = () => wrapper.findComponent(RunnerHeaderActions);
const findRunnerDetailsTabs = () => wrapper.findComponent(RunnerDetailsTabs);
const findRunnersJobs = () => wrapper.findComponent(RunnersJobs);
@@ -95,10 +91,11 @@ describe('GroupRunnerShowApp', () => {
expect(findRunnerHeader().text()).toContain(`#${mockRunnerId} (${mockRunnerSha})`);
});
- it('displays the runner edit and pause buttons', () => {
- expect(findRunnerEditButton().attributes('href')).toBe(mockEditGroupRunnerPath);
- expect(findRunnerPauseButton().exists()).toBe(true);
- expect(findRunnerDeleteButton().exists()).toBe(true);
+ it('displays the runner buttons', () => {
+ expect(findRunnerHeaderActions().props()).toEqual({
+ runner: mockRunner,
+ editPath: mockEditGroupRunnerPath,
+ });
});
it('shows runner details', () => {
@@ -127,54 +124,6 @@ describe('GroupRunnerShowApp', () => {
expect(wrapper.text().replace(/\s+/g, ' ')).toContain(expected);
});
- describe('when runner cannot be updated', () => {
- beforeEach(async () => {
- mockRunnerQueryResult({
- userPermissions: {
- ...mockRunner.userPermissions,
- updateRunner: false,
- },
- });
-
- await createComponent({
- mountFn: mountExtended,
- });
- });
-
- it('does not display the runner edit and pause buttons', () => {
- expect(findRunnerEditButton().exists()).toBe(false);
- expect(findRunnerPauseButton().exists()).toBe(false);
- });
-
- it('displays delete button', () => {
- expect(findRunnerDeleteButton().exists()).toBe(true);
- });
- });
-
- describe('when runner cannot be deleted', () => {
- beforeEach(async () => {
- mockRunnerQueryResult({
- userPermissions: {
- ...mockRunner.userPermissions,
- deleteRunner: false,
- },
- });
-
- await createComponent({
- mountFn: mountExtended,
- });
- });
-
- it('does not display the delete button', () => {
- expect(findRunnerDeleteButton().exists()).toBe(false);
- });
-
- it('displays edit and pause buttons', () => {
- expect(findRunnerEditButton().exists()).toBe(true);
- expect(findRunnerPauseButton().exists()).toBe(true);
- });
- });
-
describe('when runner is deleted', () => {
beforeEach(async () => {
await createComponent({
@@ -183,7 +132,7 @@ describe('GroupRunnerShowApp', () => {
});
it('redirects to the runner list page', () => {
- findRunnerDeleteButton().vm.$emit('deleted', { message: 'Runner deleted' });
+ findRunnerHeaderActions().vm.$emit('deleted', { message: 'Runner deleted' });
expect(saveAlertToLocalStorage).toHaveBeenCalledWith({
message: 'Runner deleted',
diff --git a/spec/frontend/ci/runner/group_runners/group_runners_app_spec.js b/spec/frontend/ci/runner/group_runners/group_runners_app_spec.js
index 74eeb864cd8..f3d7ae85e0d 100644
--- a/spec/frontend/ci/runner/group_runners/group_runners_app_spec.js
+++ b/spec/frontend/ci/runner/group_runners/group_runners_app_spec.js
@@ -483,35 +483,15 @@ describe('GroupRunnersApp', () => {
expect(findRegistrationDropdown().exists()).toBe(true);
});
- it('when create_runner_workflow_for_namespace is enabled', () => {
+ it('shows the create runner button', () => {
createComponent({
props: {
newRunnerPath,
},
- provide: {
- glFeatures: {
- createRunnerWorkflowForNamespace: true,
- },
- },
});
expect(findNewRunnerBtn().attributes('href')).toBe(newRunnerPath);
});
-
- it('when create_runner_workflow_for_namespace is disabled', () => {
- createComponent({
- props: {
- newRunnerPath,
- },
- provide: {
- glFeatures: {
- createRunnerWorkflowForNamespace: false,
- },
- },
- });
-
- expect(findNewRunnerBtn().exists()).toBe(false);
- });
});
describe('when user has no permission to register group runner', () => {
@@ -524,16 +504,11 @@ describe('GroupRunnersApp', () => {
expect(findRegistrationDropdown().exists()).toBe(false);
});
- it('when create_runner_workflow_for_namespace is enabled', () => {
+ it('shows the create runner button', () => {
createComponent({
props: {
newRunnerPath: null,
},
- provide: {
- glFeatures: {
- createRunnerWorkflowForNamespace: true,
- },
- },
});
expect(findNewRunnerBtn().exists()).toBe(false);
diff --git a/spec/frontend/clusters/agents/components/create_token_modal_spec.js b/spec/frontend/clusters/agents/components/create_token_modal_spec.js
index f0fded7b7b2..40cb3b8292f 100644
--- a/spec/frontend/clusters/agents/components/create_token_modal_spec.js
+++ b/spec/frontend/clusters/agents/components/create_token_modal_spec.js
@@ -3,6 +3,7 @@ import Vue from 'vue';
import VueApollo from 'vue-apollo';
import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
+import { stubComponent, RENDER_ALL_SLOTS_TEMPLATE } from 'helpers/stub_component';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import { mockTracking } from 'helpers/tracking_helper';
import {
@@ -37,6 +38,7 @@ describe('CreateTokenModal', () => {
};
const agentName = 'cluster-agent';
const projectPath = 'path/to/project';
+ const hideModalMock = jest.fn();
const provide = {
agentName,
@@ -91,10 +93,12 @@ describe('CreateTokenModal', () => {
provide,
propsData,
stubs: {
- GlModal,
+ GlModal: stubComponent(GlModal, {
+ methods: { hide: hideModalMock },
+ template: RENDER_ALL_SLOTS_TEMPLATE,
+ }),
},
});
- wrapper.vm.$refs.modal.hide = jest.fn();
trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
};
@@ -138,6 +142,11 @@ describe('CreateTokenModal', () => {
expectDisabledAttribute(findCancelButton(), false);
});
+ it('cancel button should hide the modal', () => {
+ findCancelButton().vm.$emit('click');
+ expect(hideModalMock).toHaveBeenCalled();
+ });
+
it('renders a disabled next button', () => {
expect(findActionButton().text()).toBe('Create token');
expectDisabledAttribute(findActionButton(), true);
diff --git a/spec/frontend/clusters/agents/components/revoke_token_button_spec.js b/spec/frontend/clusters/agents/components/revoke_token_button_spec.js
index 970782a8e58..de47ff78696 100644
--- a/spec/frontend/clusters/agents/components/revoke_token_button_spec.js
+++ b/spec/frontend/clusters/agents/components/revoke_token_button_spec.js
@@ -2,6 +2,7 @@ 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 { stubComponent } from 'helpers/stub_component';
import waitForPromises from 'helpers/wait_for_promises';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import { ENTER_KEY } from '~/lib/utils/keys';
@@ -81,12 +82,15 @@ describe('RevokeTokenButton', () => {
},
propsData,
stubs: {
- GlModal,
+ GlModal: stubComponent(GlModal, {
+ methods: {
+ hide: jest.fn(),
+ },
+ }),
GlTooltip,
},
mocks: { $toast: { show: toast } },
});
- wrapper.vm.$refs.modal.hide = jest.fn();
writeQuery();
await nextTick();
diff --git a/spec/frontend/clusters_list/components/clusters_actions_spec.js b/spec/frontend/clusters_list/components/clusters_actions_spec.js
index e4e1986f705..6957862dc2b 100644
--- a/spec/frontend/clusters_list/components/clusters_actions_spec.js
+++ b/spec/frontend/clusters_list/components/clusters_actions_spec.js
@@ -1,4 +1,10 @@
-import { GlButton, GlDropdown, GlDropdownItem, GlTooltip } from '@gitlab/ui';
+import {
+ GlButton,
+ GlDisclosureDropdown,
+ GlDisclosureDropdownItem,
+ GlTooltip,
+ GlButtonGroup,
+} 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';
@@ -18,12 +24,13 @@ describe('ClustersActionsComponent', () => {
certificateBasedClustersEnabled: true,
};
+ const findButtonGroup = () => wrapper.findComponent(GlButtonGroup);
const findButton = () => wrapper.findComponent(GlButton);
- const findDropdown = () => wrapper.findComponent(GlDropdown);
- const findDropdownItems = () => wrapper.findAllComponents(GlDropdownItem);
+ const findDropdown = () => wrapper.findComponent(GlDisclosureDropdown);
+ const findDropdownItems = () => wrapper.findAllComponents(GlDisclosureDropdownItem);
const findTooltip = () => wrapper.findComponent(GlTooltip);
const findDropdownItemIds = () =>
- findDropdownItems().wrappers.map((x) => x.attributes('data-testid'));
+ findDropdownItems().wrappers.map((x) => x.find('a').attributes('data-testid'));
const findDropdownItemTexts = () => findDropdownItems().wrappers.map((x) => x.text());
const findNewClusterDocsLink = () => wrapper.findByTestId('create-cluster-link');
const findConnectClusterLink = () => wrapper.findByTestId('connect-cluster-link');
@@ -34,6 +41,10 @@ describe('ClustersActionsComponent', () => {
...defaultProvide,
...provideData,
},
+ stubs: {
+ GlDisclosureDropdown,
+ GlDisclosureDropdownItem,
+ },
directives: {
GlModalDirective: createMockDirective('gl-modal-directive'),
},
@@ -45,25 +56,23 @@ describe('ClustersActionsComponent', () => {
});
describe('when the certificate based clusters are enabled', () => {
- it('renders actions menu', () => {
+ it('renders actions menu button group with dropdown', () => {
+ expect(findButtonGroup().exists()).toBe(true);
+ expect(findButton().exists()).toBe(true);
expect(findDropdown().exists()).toBe(true);
});
- it('shows split button in dropdown', () => {
- expect(findDropdown().props('split')).toBe(true);
- });
-
it("doesn't show the tooltip", () => {
expect(findTooltip().exists()).toBe(false);
});
describe('when on project level', () => {
it(`displays default action as ${CLUSTERS_ACTIONS.connectWithAgent}`, () => {
- expect(findDropdown().props('text')).toBe(CLUSTERS_ACTIONS.connectWithAgent);
+ expect(findButton().text()).toBe(CLUSTERS_ACTIONS.connectWithAgent);
});
it('renders correct modal id for the default action', () => {
- const binding = getBinding(findDropdown().element, 'gl-modal-directive');
+ const binding = getBinding(findButton().element, 'gl-modal-directive');
expect(binding.value).toBe(INSTALL_AGENT_MODAL_ID);
});
@@ -91,6 +100,7 @@ describe('ClustersActionsComponent', () => {
it('disables dropdown', () => {
expect(findDropdown().props('disabled')).toBe(true);
+ expect(findButton().props('disabled')).toBe(true);
});
it('shows tooltip explaining why dropdown is disabled', () => {
@@ -98,7 +108,7 @@ describe('ClustersActionsComponent', () => {
});
it('does not bind split dropdown button', () => {
- const binding = getBinding(findDropdown().element, 'gl-modal-directive');
+ const binding = getBinding(findButton().element, 'gl-modal-directive');
expect(binding.value).toBe(false);
});
@@ -148,11 +158,11 @@ describe('ClustersActionsComponent', () => {
});
it(`displays default action as ${CLUSTERS_ACTIONS.connectCluster}`, () => {
- expect(findDropdown().props('text')).toBe(CLUSTERS_ACTIONS.connectCluster);
+ expect(findButton().text()).toBe(CLUSTERS_ACTIONS.connectCluster);
});
it('renders correct modal id for the default action', () => {
- const binding = getBinding(findDropdown().element, 'gl-modal-directive');
+ const binding = getBinding(findButton().element, 'gl-modal-directive');
expect(binding.value).toBe(INSTALL_AGENT_MODAL_ID);
});
diff --git a/spec/frontend/clusters_list/components/delete_agent_button_spec.js b/spec/frontend/clusters_list/components/delete_agent_button_spec.js
index 8bbb5ec92a7..afb12d9c856 100644
--- a/spec/frontend/clusters_list/components/delete_agent_button_spec.js
+++ b/spec/frontend/clusters_list/components/delete_agent_button_spec.js
@@ -9,6 +9,7 @@ import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
import DeleteAgentButton from '~/clusters_list/components/delete_agent_button.vue';
import { DELETE_AGENT_BUTTON } from '~/clusters_list/constants';
+import { stubComponent } from 'helpers/stub_component';
import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
import { getAgentResponse, mockDeleteResponse, mockErrorDeleteResponse } from '../mocks/apollo';
@@ -84,9 +85,14 @@ describe('DeleteAgentButton', () => {
},
propsData,
mocks: { $toast: { show: toast } },
- stubs: { GlModal },
+ stubs: {
+ GlModal: stubComponent(GlModal, {
+ methods: {
+ hide: jest.fn(),
+ },
+ }),
+ },
});
- wrapper.vm.$refs.modal.hide = jest.fn();
writeQuery();
await nextTick();
diff --git a/spec/frontend/comment_templates/components/__snapshots__/list_item_spec.js.snap b/spec/frontend/comment_templates/components/__snapshots__/list_item_spec.js.snap
index 8cad483e27e..d0bc7a55f8e 100644
--- a/spec/frontend/comment_templates/components/__snapshots__/list_item_spec.js.snap
+++ b/spec/frontend/comment_templates/components/__snapshots__/list_item_spec.js.snap
@@ -130,7 +130,7 @@ exports[`Comment templates list item component renders list item 1`] = `
</div>
<div
- class="gl-mt-3 gl-font-monospace"
+ class="gl-mt-3 gl-font-monospace gl-white-space-pre-wrap"
>
/assign_reviewer
</div>
diff --git a/spec/frontend/commit/commit_pipeline_status_component_spec.js b/spec/frontend/commit/commit_pipeline_status_component_spec.js
deleted file mode 100644
index e474ef9c635..00000000000
--- a/spec/frontend/commit/commit_pipeline_status_component_spec.js
+++ /dev/null
@@ -1,172 +0,0 @@
-import { GlLoadingIcon } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import Visibility from 'visibilityjs';
-import { nextTick } from 'vue';
-import fixture from 'test_fixtures/pipelines/pipelines.json';
-import { createAlert } from '~/alert';
-import Poll from '~/lib/utils/poll';
-import CommitPipelineStatus from '~/projects/tree/components/commit_pipeline_status_component.vue';
-import CiIcon from '~/vue_shared/components/ci_icon.vue';
-
-jest.mock('~/lib/utils/poll');
-jest.mock('visibilityjs');
-jest.mock('~/alert');
-
-const mockFetchData = jest.fn();
-jest.mock('~/projects/tree/services/commit_pipeline_service', () =>
- jest.fn().mockImplementation(() => ({
- fetchData: mockFetchData.mockReturnValue(Promise.resolve()),
- })),
-);
-
-describe('Commit pipeline status component', () => {
- let wrapper;
- const { pipelines } = fixture;
- const { status: mockCiStatus } = pipelines[0].details;
-
- const defaultProps = {
- endpoint: 'endpoint',
- };
-
- const createComponent = (props = {}) => {
- wrapper = shallowMount(CommitPipelineStatus, {
- propsData: {
- ...defaultProps,
- ...props,
- },
- });
- };
-
- const findLoader = () => wrapper.findComponent(GlLoadingIcon);
- const findLink = () => wrapper.find('a');
- const findCiIcon = () => findLink().findComponent(CiIcon);
-
- describe('Visibility management', () => {
- describe('when component is hidden', () => {
- beforeEach(() => {
- Visibility.hidden.mockReturnValue(true);
- createComponent();
- });
-
- it('does not start polling', () => {
- const [pollInstance] = Poll.mock.instances;
- expect(pollInstance.makeRequest).not.toHaveBeenCalled();
- });
-
- it('requests pipeline data', () => {
- expect(mockFetchData).toHaveBeenCalled();
- });
- });
-
- describe('when component is visible', () => {
- beforeEach(() => {
- Visibility.hidden.mockReturnValue(false);
- createComponent();
- });
-
- it('starts polling', () => {
- const [pollInstance] = [...Poll.mock.instances].reverse();
- expect(pollInstance.makeRequest).toHaveBeenCalled();
- });
- });
-
- describe('when component changes its visibility', () => {
- it.each`
- visibility | action
- ${false} | ${'restart'}
- ${true} | ${'stop'}
- `(
- '$action polling when component visibility becomes $visibility',
- ({ visibility, action }) => {
- Visibility.hidden.mockReturnValue(!visibility);
- createComponent();
- const [pollInstance] = Poll.mock.instances;
- expect(pollInstance[action]).not.toHaveBeenCalled();
- Visibility.hidden.mockReturnValue(visibility);
- const [visibilityHandler] = Visibility.change.mock.calls[0];
- visibilityHandler();
- expect(pollInstance[action]).toHaveBeenCalled();
- },
- );
- });
- });
-
- it('stops polling when component is destroyed', () => {
- createComponent();
- wrapper.destroy();
- const [pollInstance] = Poll.mock.instances;
- expect(pollInstance.stop).toHaveBeenCalled();
- });
-
- describe('when polling', () => {
- let pollConfig;
- beforeEach(() => {
- Poll.mockImplementation((config) => {
- pollConfig = config;
- return { makeRequest: jest.fn(), restart: jest.fn(), stop: jest.fn() };
- });
- createComponent();
- });
-
- it('shows the loading icon at start', async () => {
- createComponent();
- expect(findLoader().exists()).toBe(true);
-
- pollConfig.successCallback({
- data: { pipelines: [] },
- });
-
- await nextTick();
- expect(findLoader().exists()).toBe(false);
- });
-
- describe('is successful', () => {
- beforeEach(async () => {
- pollConfig.successCallback({
- data: { pipelines: [{ details: { status: mockCiStatus } }] },
- });
- await nextTick();
- });
-
- it('does not render loader', () => {
- expect(findLoader().exists()).toBe(false);
- });
-
- it('renders link with href', () => {
- expect(findLink().attributes('href')).toEqual(mockCiStatus.details_path);
- });
-
- it('renders CI icon with the correct title and status', () => {
- expect(findCiIcon().attributes('title')).toEqual('Pipeline: passed');
- expect(findCiIcon().props('status')).toEqual(mockCiStatus);
- });
- });
-
- describe('is not successful', () => {
- beforeEach(() => {
- pollConfig.errorCallback();
- });
-
- it('does not render loader', () => {
- expect(findLoader().exists()).toBe(false);
- });
-
- it('renders link with href', () => {
- expect(findLink().attributes('href')).toBeUndefined();
- });
-
- it('renders not found CI icon', () => {
- expect(findCiIcon().attributes('title')).toEqual('Pipeline: not found');
- expect(findCiIcon().props('status')).toEqual({
- text: 'not found',
- icon: 'status_notfound',
- group: 'notfound',
- });
- });
-
- it('displays alert error message', () => {
- expect(createAlert).toHaveBeenCalled();
- });
- });
- });
-});
diff --git a/spec/frontend/commit/commit_pipeline_status_spec.js b/spec/frontend/commit/commit_pipeline_status_spec.js
new file mode 100644
index 00000000000..73031724b12
--- /dev/null
+++ b/spec/frontend/commit/commit_pipeline_status_spec.js
@@ -0,0 +1,172 @@
+import { GlLoadingIcon } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import Visibility from 'visibilityjs';
+import { nextTick } from 'vue';
+import fixture from 'test_fixtures/pipelines/pipelines.json';
+import { createAlert } from '~/alert';
+import Poll from '~/lib/utils/poll';
+import CommitPipelineStatus from '~/projects/tree/components/commit_pipeline_status.vue';
+import CiIcon from '~/vue_shared/components/ci_icon.vue';
+
+jest.mock('~/lib/utils/poll');
+jest.mock('visibilityjs');
+jest.mock('~/alert');
+
+const mockFetchData = jest.fn();
+jest.mock('~/projects/tree/services/commit_pipeline_service', () =>
+ jest.fn().mockImplementation(() => ({
+ fetchData: mockFetchData.mockReturnValue(Promise.resolve()),
+ })),
+);
+
+describe('Commit pipeline status component', () => {
+ let wrapper;
+ const { pipelines } = fixture;
+ const { status: mockCiStatus } = pipelines[0].details;
+
+ const defaultProps = {
+ endpoint: 'endpoint',
+ };
+
+ const createComponent = (props = {}) => {
+ wrapper = shallowMount(CommitPipelineStatus, {
+ propsData: {
+ ...defaultProps,
+ ...props,
+ },
+ });
+ };
+
+ const findLoader = () => wrapper.findComponent(GlLoadingIcon);
+ const findLink = () => wrapper.find('a');
+ const findCiIcon = () => findLink().findComponent(CiIcon);
+
+ describe('Visibility management', () => {
+ describe('when component is hidden', () => {
+ beforeEach(() => {
+ Visibility.hidden.mockReturnValue(true);
+ createComponent();
+ });
+
+ it('does not start polling', () => {
+ const [pollInstance] = Poll.mock.instances;
+ expect(pollInstance.makeRequest).not.toHaveBeenCalled();
+ });
+
+ it('requests pipeline data', () => {
+ expect(mockFetchData).toHaveBeenCalled();
+ });
+ });
+
+ describe('when component is visible', () => {
+ beforeEach(() => {
+ Visibility.hidden.mockReturnValue(false);
+ createComponent();
+ });
+
+ it('starts polling', () => {
+ const [pollInstance] = [...Poll.mock.instances].reverse();
+ expect(pollInstance.makeRequest).toHaveBeenCalled();
+ });
+ });
+
+ describe('when component changes its visibility', () => {
+ it.each`
+ visibility | action
+ ${false} | ${'restart'}
+ ${true} | ${'stop'}
+ `(
+ '$action polling when component visibility becomes $visibility',
+ ({ visibility, action }) => {
+ Visibility.hidden.mockReturnValue(!visibility);
+ createComponent();
+ const [pollInstance] = Poll.mock.instances;
+ expect(pollInstance[action]).not.toHaveBeenCalled();
+ Visibility.hidden.mockReturnValue(visibility);
+ const [visibilityHandler] = Visibility.change.mock.calls[0];
+ visibilityHandler();
+ expect(pollInstance[action]).toHaveBeenCalled();
+ },
+ );
+ });
+ });
+
+ it('stops polling when component is destroyed', () => {
+ createComponent();
+ wrapper.destroy();
+ const [pollInstance] = Poll.mock.instances;
+ expect(pollInstance.stop).toHaveBeenCalled();
+ });
+
+ describe('when polling', () => {
+ let pollConfig;
+ beforeEach(() => {
+ Poll.mockImplementation((config) => {
+ pollConfig = config;
+ return { makeRequest: jest.fn(), restart: jest.fn(), stop: jest.fn() };
+ });
+ createComponent();
+ });
+
+ it('shows the loading icon at start', async () => {
+ createComponent();
+ expect(findLoader().exists()).toBe(true);
+
+ pollConfig.successCallback({
+ data: { pipelines: [] },
+ });
+
+ await nextTick();
+ expect(findLoader().exists()).toBe(false);
+ });
+
+ describe('is successful', () => {
+ beforeEach(async () => {
+ pollConfig.successCallback({
+ data: { pipelines: [{ details: { status: mockCiStatus } }] },
+ });
+ await nextTick();
+ });
+
+ it('does not render loader', () => {
+ expect(findLoader().exists()).toBe(false);
+ });
+
+ it('renders link with href', () => {
+ expect(findLink().attributes('href')).toEqual(mockCiStatus.details_path);
+ });
+
+ it('renders CI icon with the correct title and status', () => {
+ expect(findCiIcon().attributes('title')).toEqual('Pipeline: passed');
+ expect(findCiIcon().props('status')).toEqual(mockCiStatus);
+ });
+ });
+
+ describe('is not successful', () => {
+ beforeEach(() => {
+ pollConfig.errorCallback();
+ });
+
+ it('does not render loader', () => {
+ expect(findLoader().exists()).toBe(false);
+ });
+
+ it('renders link with href', () => {
+ expect(findLink().attributes('href')).toBeUndefined();
+ });
+
+ it('renders not found CI icon', () => {
+ expect(findCiIcon().attributes('title')).toEqual('Pipeline: not found');
+ expect(findCiIcon().props('status')).toEqual({
+ text: 'not found',
+ icon: 'status_notfound',
+ group: 'notfound',
+ });
+ });
+
+ it('displays alert error message', () => {
+ expect(createAlert).toHaveBeenCalled();
+ });
+ });
+ });
+});
diff --git a/spec/frontend/content_editor/components/bubble_menus/bubble_menu_spec.js b/spec/frontend/content_editor/components/bubble_menus/bubble_menu_spec.js
index 85eafa9e85c..53c098ee153 100644
--- a/spec/frontend/content_editor/components/bubble_menus/bubble_menu_spec.js
+++ b/spec/frontend/content_editor/components/bubble_menus/bubble_menu_spec.js
@@ -65,7 +65,7 @@ describe('content_editor/components/bubble_menus/bubble_menu', () => {
onHidden: expect.any(Function),
onShow: expect.any(Function),
strategy: 'fixed',
- maxWidth: 'auto',
+ maxWidth: '400px',
...tippyOptions,
}),
});
diff --git a/spec/frontend/content_editor/components/bubble_menus/link_bubble_menu_spec.js b/spec/frontend/content_editor/components/bubble_menus/link_bubble_menu_spec.js
index c79df9c9ed8..b219c506753 100644
--- a/spec/frontend/content_editor/components/bubble_menus/link_bubble_menu_spec.js
+++ b/spec/frontend/content_editor/components/bubble_menus/link_bubble_menu_spec.js
@@ -206,7 +206,7 @@ describe('content_editor/components/bubble_menus/link_bubble_menu', () => {
await buildWrapperAndDisplayMenu();
await wrapper.findByTestId('remove-link').vm.$emit('click');
- expect(tiptapEditor.getHTML()).toBe('<p>Download PDF File</p>');
+ expect(tiptapEditor.getHTML()).toBe('<p dir="auto">Download PDF File</p>');
});
});
diff --git a/spec/frontend/content_editor/components/bubble_menus/media_bubble_menu_spec.js b/spec/frontend/content_editor/components/bubble_menus/media_bubble_menu_spec.js
index 89beb76a6f2..002e19ee8cf 100644
--- a/spec/frontend/content_editor/components/bubble_menus/media_bubble_menu_spec.js
+++ b/spec/frontend/content_editor/components/bubble_menus/media_bubble_menu_spec.js
@@ -22,19 +22,19 @@ import {
PROJECT_WIKI_ATTACHMENT_DRAWIO_DIAGRAM_HTML,
} from '../../test_constants';
-const TIPTAP_AUDIO_HTML = `<p>
+const TIPTAP_AUDIO_HTML = `<p dir="auto">
<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" class="with-attachment-icon">gitlab favicon</a></span>
</p>`;
-const TIPTAP_DIAGRAM_HTML = `<p>
- <img src="https://gitlab.com/favicon.png" alt="gitlab favicon" title="gitlab favicon">
+const TIPTAP_DIAGRAM_HTML = `<p dir="auto">
+ <img src="https://gitlab.com/favicon.png" alt="gitlab favicon">
</p>`;
-const TIPTAP_IMAGE_HTML = `<p>
- <img src="https://gitlab.com/favicon.png" alt="gitlab favicon" title="gitlab favicon">
+const TIPTAP_IMAGE_HTML = `<p dir="auto">
+ <img src="https://gitlab.com/favicon.png" alt="gitlab favicon">
</p>`;
-const TIPTAP_VIDEO_HTML = `<p>
+const TIPTAP_VIDEO_HTML = `<p dir="auto">
<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" class="with-attachment-icon">gitlab favicon</a></span>
</p>`;
@@ -101,9 +101,7 @@ describe.each`
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(() => {
@@ -128,14 +126,11 @@ describe.each`
await buildWrapperAndDisplayMenu();
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.attributes()).toMatchObject({
+ href: `/group1/project1/-/wikis/${filePath}`,
+ 'aria-label': filePath,
+ target: '_blank',
+ });
expect(link.text()).toBe(filePath);
});
@@ -190,28 +185,6 @@ describe.each`
});
});
- describe('copy button', () => {
- it(`copies the canonical link to the ${mediaType} to clipboard`, async () => {
- await buildWrapperAndDisplayMenu();
-
- 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 buildWrapperAndDisplayMenu();
-
- await wrapper.findByTestId('delete-media').vm.$emit('click');
-
- expect(tiptapEditor.getHTML()).toBe('<p>\n \n</p>');
- });
- });
-
describe(`replace ${mediaType} button`, () => {
beforeEach(buildWrapperAndDisplayMenu);
@@ -252,7 +225,6 @@ describe.each`
describe('edit button', () => {
let mediaSrcInput;
- let mediaTitleInput;
let mediaAltInput;
beforeEach(async () => {
@@ -261,7 +233,6 @@ describe.each`
await wrapper.findByTestId('edit-media').vm.$emit('click');
mediaSrcInput = wrapper.findByTestId('media-src');
- mediaTitleInput = wrapper.findByTestId('media-title');
mediaAltInput = wrapper.findByTestId('media-alt');
});
@@ -269,11 +240,10 @@ describe.each`
expectLinkButtonsToExist(false);
});
- it(`shows a form to edit the ${mediaType} src/title/alt`, () => {
+ it(`shows a form to edit the ${mediaType} src/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');
});
@@ -281,7 +251,6 @@ describe.each`
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');
@@ -294,14 +263,11 @@ describe.each`
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.attributes()).toMatchObject({
+ href: 'https://gitlab.com/favicon.png',
+ 'aria-label': 'https://gitlab.com/favicon.png',
+ target: '_blank',
+ });
expect(link.text()).toBe('https://gitlab.com/favicon.png');
});
});
@@ -310,7 +276,6 @@ describe.each`
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');
});
@@ -324,12 +289,10 @@ describe.each`
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/bubble_menus/reference_bubble_menu_spec.js b/spec/frontend/content_editor/components/bubble_menus/reference_bubble_menu_spec.js
index 169f77dc054..c46aa1b657e 100644
--- a/spec/frontend/content_editor/components/bubble_menus/reference_bubble_menu_spec.js
+++ b/spec/frontend/content_editor/components/bubble_menus/reference_bubble_menu_spec.js
@@ -241,7 +241,7 @@ describe('content_editor/components/bubble_menus/reference_bubble_menu', () => {
await buildWrapperAndDisplayMenu();
await wrapper.findByTestId('remove-reference').trigger('click');
- expect(tiptapEditor.getHTML()).toBe('<p></p>');
+ expect(tiptapEditor.getHTML()).toBe('<p dir="auto"></p>');
});
});
});
diff --git a/spec/frontend/content_editor/components/content_editor_spec.js b/spec/frontend/content_editor/components/content_editor_spec.js
index 0b8321ba8eb..816c9458201 100644
--- a/spec/frontend/content_editor/components/content_editor_spec.js
+++ b/spec/frontend/content_editor/components/content_editor_spec.js
@@ -14,6 +14,7 @@ import FormattingToolbar from '~/content_editor/components/formatting_toolbar.vu
import LoadingIndicator from '~/content_editor/components/loading_indicator.vue';
import waitForPromises from 'helpers/wait_for_promises';
import { KEYDOWN_EVENT } from '~/content_editor/constants';
+import EditorModeSwitcher from '~/vue_shared/components/markdown/editor_mode_switcher.vue';
jest.mock('~/emoji');
@@ -92,19 +93,6 @@ describe('ContentEditor', () => {
expect(wrapper.findComponent(FormattingToolbar).exists()).toBe(true);
});
- it('renders footer containing quick actions help text if quick actions docs path is defined', () => {
- createWrapper({ quickActionsDocsPath: '/foo/bar' });
-
- expect(wrapper.text()).toContain('For quick actions, type /');
- expect(wrapper.findComponent(GlLink).attributes('href')).toBe('/foo/bar');
- });
-
- it('does not render footer containing quick actions help text if quick actions docs path is not defined', () => {
- createWrapper();
-
- expect(findEditorElement().text()).not.toContain('For quick actions, type /');
- });
-
it('displays an attachment button', () => {
createWrapper();
@@ -286,4 +274,10 @@ describe('ContentEditor', () => {
expect(wrapper.findComponent(component).exists()).toBe(true);
});
+
+ it('renders an editor mode dropdown', () => {
+ createWrapper();
+
+ expect(wrapper.findComponent(EditorModeSwitcher).exists()).toBe(true);
+ });
});
diff --git a/spec/frontend/content_editor/components/formatting_toolbar_spec.js b/spec/frontend/content_editor/components/formatting_toolbar_spec.js
index 9d835381ff4..6562cb517cd 100644
--- a/spec/frontend/content_editor/components/formatting_toolbar_spec.js
+++ b/spec/frontend/content_editor/components/formatting_toolbar_spec.js
@@ -2,24 +2,31 @@ import { GlTabs, GlTab } from '@gitlab/ui';
import { mockTracking } from 'helpers/tracking_helper';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import FormattingToolbar from '~/content_editor/components/formatting_toolbar.vue';
+import CommentTemplatesDropdown from '~/vue_shared/components/markdown/comment_templates_dropdown.vue';
import {
TOOLBAR_CONTROL_TRACKING_ACTION,
CONTENT_EDITOR_TRACKING_LABEL,
} from '~/content_editor/constants';
-import EditorModeSwitcher from '~/vue_shared/components/markdown/editor_mode_switcher.vue';
+import { createTestEditor, mockChainedCommands } from '../test_utils';
describe('content_editor/components/formatting_toolbar', () => {
let wrapper;
let trackingSpy;
- const buildWrapper = (props) => {
+ const contentEditor = {
+ codeSuggestionsConfig: {
+ canSuggest: true,
+ },
+ };
+
+ const buildWrapper = ({ props = {}, provide = { contentEditor } } = {}) => {
wrapper = shallowMountExtended(FormattingToolbar, {
stubs: {
GlTabs,
GlTab,
- EditorModeSwitcher,
},
propsData: props,
+ provide,
});
};
@@ -28,20 +35,22 @@ describe('content_editor/components/formatting_toolbar', () => {
});
describe.each`
- testId | controlProps
- ${'text-styles'} | ${{}}
- ${'bold'} | ${{ contentType: 'bold', iconName: 'bold', label: 'Bold text', editorCommand: 'toggleBold' }}
- ${'italic'} | ${{ contentType: 'italic', iconName: 'italic', label: 'Italic text', editorCommand: 'toggleItalic' }}
- ${'strike'} | ${{ contentType: 'strike', iconName: 'strikethrough', label: 'Strikethrough', editorCommand: 'toggleStrike' }}
- ${'blockquote'} | ${{ contentType: 'blockquote', iconName: 'quote', label: 'Insert a quote', editorCommand: 'toggleBlockquote' }}
- ${'code'} | ${{ contentType: 'code', iconName: 'code', label: 'Code', editorCommand: 'toggleCode' }}
- ${'link'} | ${{}}
- ${'bullet-list'} | ${{ contentType: 'bulletList', iconName: 'list-bulleted', label: 'Add a bullet list', editorCommand: 'toggleBulletList' }}
- ${'ordered-list'} | ${{ contentType: 'orderedList', iconName: 'list-numbered', label: 'Add a numbered list', editorCommand: 'toggleOrderedList' }}
- ${'task-list'} | ${{ contentType: 'taskList', iconName: 'list-task', label: 'Add a checklist', editorCommand: 'toggleTaskList' }}
- ${'attachment'} | ${{}}
- ${'table'} | ${{}}
- ${'more'} | ${{}}
+ testId | controlProps
+ ${'text-styles'} | ${{}}
+ ${'bold'} | ${{ contentType: 'bold', iconName: 'bold', label: 'Bold (Ctrl+B)', editorCommand: 'toggleBold' }}
+ ${'italic'} | ${{ contentType: 'italic', iconName: 'italic', label: 'Italic (Ctrl+I)', editorCommand: 'toggleItalic' }}
+ ${'strike'} | ${{ contentType: 'strike', iconName: 'strikethrough', label: 'Strikethrough (Ctrl+Shift+X)', editorCommand: 'toggleStrike' }}
+ ${'blockquote'} | ${{ contentType: 'blockquote', iconName: 'quote', label: 'Insert a quote', editorCommand: 'toggleBlockquote' }}
+ ${'code'} | ${{ contentType: 'code', iconName: 'code', label: 'Code', editorCommand: 'toggleCode' }}
+ ${'link'} | ${{ contentType: 'link', iconName: 'link', label: 'Insert link (Ctrl+K)', editorCommand: 'editLink' }}
+ ${'link'} | ${{}}
+ ${'bullet-list'} | ${{ contentType: 'bulletList', iconName: 'list-bulleted', label: 'Add a bullet list', editorCommand: 'toggleBulletList' }}
+ ${'ordered-list'} | ${{ contentType: 'orderedList', iconName: 'list-numbered', label: 'Add a numbered list', editorCommand: 'toggleOrderedList' }}
+ ${'task-list'} | ${{ contentType: 'taskList', iconName: 'list-task', label: 'Add a checklist', editorCommand: 'toggleTaskList' }}
+ ${'code-suggestion'} | ${{ contentType: 'codeSuggestion', iconName: 'doc-code', label: 'Insert suggestion', editorCommand: 'insertCodeSuggestion' }}
+ ${'attachment'} | ${{}}
+ ${'table'} | ${{}}
+ ${'more'} | ${{}}
`('given a $testId toolbar control', ({ testId, controlProps }) => {
beforeEach(() => {
buildWrapper();
@@ -69,17 +78,70 @@ describe('content_editor/components/formatting_toolbar', () => {
});
});
- it('renders an editor mode dropdown', () => {
- buildWrapper();
+ describe('MacOS shortcuts', () => {
+ beforeEach(() => {
+ window.gl = { client: { isMac: true } };
+
+ buildWrapper();
+ });
- expect(wrapper.findComponent(EditorModeSwitcher).exists()).toBe(true);
+ it.each`
+ testId | label
+ ${'bold'} | ${'Bold (⌘B)'}
+ ${'italic'} | ${'Italic (⌘I)'}
+ ${'strike'} | ${'Strikethrough (⌘⇧X)'}
+ ${'link'} | ${'Insert link (⌘K)'}
+ `('shows label $label for $testId', ({ testId, label }) => {
+ expect(wrapper.findByTestId(testId).props('label')).toBe(label);
+ });
});
describe('when attachment button is hidden', () => {
it('does not show the attachment button', () => {
- buildWrapper({ hideAttachmentButton: true });
+ buildWrapper({ props: { hideAttachmentButton: true } });
expect(wrapper.findByTestId('attachment').exists()).toBe(false);
});
});
+
+ describe('when selecting a saved reply from the comment templates dropdown', () => {
+ it('updates the rich text editor with the saved comment', async () => {
+ const tiptapEditor = createTestEditor();
+
+ buildWrapper({
+ provide: {
+ tiptapEditor,
+ contentEditor,
+ newCommentTemplatePath: 'some/path',
+ },
+ });
+
+ const commands = mockChainedCommands(tiptapEditor, ['focus', 'pasteContent', 'run']);
+ await wrapper
+ .findComponent(CommentTemplatesDropdown)
+ .vm.$emit('select', 'Some saved comment');
+
+ expect(commands.focus).toHaveBeenCalled();
+ expect(commands.pasteContent).toHaveBeenCalledWith('Some saved comment');
+ expect(commands.run).toHaveBeenCalled();
+ });
+
+ it('does not show the saved replies icon if newCommentTemplatePath is not provided', () => {
+ buildWrapper();
+
+ expect(wrapper.findComponent(CommentTemplatesDropdown).exists()).toBe(false);
+ });
+ });
+
+ it('hides code suggestions icon if the user cannot make suggestions', () => {
+ buildWrapper({
+ provide: {
+ contentEditor: {
+ codeSuggestionsConfig: { canSuggest: false },
+ },
+ },
+ });
+
+ expect(wrapper.findByTestId('code-suggestion').exists()).toBe(false);
+ });
});
diff --git a/spec/frontend/content_editor/components/suggestions_dropdown_spec.js b/spec/frontend/content_editor/components/suggestions_dropdown_spec.js
index 9d34d9d0e9e..ee3ad59bf9a 100644
--- a/spec/frontend/content_editor/components/suggestions_dropdown_spec.js
+++ b/spec/frontend/content_editor/components/suggestions_dropdown_spec.js
@@ -1,4 +1,4 @@
-import { GlDropdownItem, GlAvatarLabeled, GlLoadingIcon } from '@gitlab/ui';
+import { GlAvatarLabeled, GlLoadingIcon } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import SuggestionsDropdown from '~/content_editor/components/suggestions_dropdown.vue';
@@ -113,7 +113,7 @@ describe('~/content_editor/components/suggestions_dropdown', () => {
${'emoji'} | ${'emoji'} | ${':'} | ${exampleEmoji} | ${`😃`} | ${insertedEmojiProps}
`(
'runs a command to insert the selected $referenceType',
- ({ char, nodeType, referenceType, reference, insertedText, insertedProps }) => {
+ async ({ char, nodeType, referenceType, reference, insertedText, insertedProps }) => {
const commandSpy = jest.fn();
buildWrapper({
@@ -129,7 +129,10 @@ describe('~/content_editor/components/suggestions_dropdown', () => {
},
});
- wrapper.findComponent(GlDropdownItem).vm.$emit('click');
+ await wrapper
+ .findByTestId('content-editor-suggestions-dropdown')
+ .find('li .gl-new-dropdown-item-content')
+ .trigger('click');
expect(commandSpy).toHaveBeenCalledWith(
expect.objectContaining({
diff --git a/spec/frontend/content_editor/components/wrappers/code_block_spec.js b/spec/frontend/content_editor/components/wrappers/code_block_spec.js
index cbeea90dcb4..e802681dfc6 100644
--- a/spec/frontend/content_editor/components/wrappers/code_block_spec.js
+++ b/spec/frontend/content_editor/components/wrappers/code_block_spec.js
@@ -6,11 +6,26 @@ import eventHubFactory from '~/helpers/event_hub_factory';
import SandboxedMermaid from '~/behaviors/components/sandboxed_mermaid.vue';
import CodeBlockHighlight from '~/content_editor/extensions/code_block_highlight';
import Diagram from '~/content_editor/extensions/diagram';
+import CodeSuggestion from '~/content_editor/extensions/code_suggestion';
import CodeBlockWrapper from '~/content_editor/components/wrappers/code_block.vue';
import codeBlockLanguageLoader from '~/content_editor/services/code_block_language_loader';
-import { emitEditorEvent, createTestEditor } from '../../test_utils';
+import { emitEditorEvent, createTestEditor, mockChainedCommands } from '../../test_utils';
+
+const SAMPLE_README_CONTENT = `# Sample README
+
+This is a sample README.
+
+## Usage
+
+\`\`\`yaml
+foo: bar
+\`\`\`
+`;
jest.mock('~/content_editor/services/code_block_language_loader');
+jest.mock('~/content_editor/services/utils', () => ({
+ memoizedGet: jest.fn().mockResolvedValue(SAMPLE_README_CONTENT),
+}));
describe('content/components/wrappers/code_block', () => {
const language = 'yaml';
@@ -21,7 +36,7 @@ describe('content/components/wrappers/code_block', () => {
let eventHub;
const buildEditor = () => {
- tiptapEditor = createTestEditor({ extensions: [CodeBlockHighlight, Diagram] });
+ tiptapEditor = createTestEditor({ extensions: [CodeBlockHighlight, Diagram, CodeSuggestion] });
contentEditor = { renderDiagram: jest.fn().mockResolvedValue('url/to/some/diagram') };
eventHub = eventHubFactory();
};
@@ -76,7 +91,7 @@ describe('content/components/wrappers/code_block', () => {
it('renders label indicating that code block is frontmatter', () => {
createWrapper({ isFrontmatter: true, language });
- const label = wrapper.find('[data-testid="frontmatter-label"]');
+ const label = wrapper.findByTestId('frontmatter-label');
expect(label.text()).toEqual('frontmatter:yaml');
expect(label.classes()).toEqual(['gl-absolute', 'gl-top-0', 'gl-right-3']);
@@ -143,4 +158,222 @@ describe('content/components/wrappers/code_block', () => {
expect(wrapper.find('img').exists()).toBe(false);
});
});
+
+ describe('code suggestions', () => {
+ const nodeAttrs = { language: 'suggestion', isCodeSuggestion: true, langParams: '-0+0' };
+ const findCodeSuggestionBoxText = () =>
+ wrapper.findByTestId('code-suggestion-box').text().replace(/\s+/gm, ' ');
+ const findCodeDeleted = () =>
+ wrapper
+ .findByTestId('suggestion-deleted')
+ .findAll('code')
+ .wrappers.map((w) => w.html())
+ .join('\n');
+ const findCodeAdded = () =>
+ wrapper
+ .findByTestId('suggestion-added')
+ .findAll('code')
+ .wrappers.map((w) => w.html())
+ .join('\n');
+
+ let commands;
+
+ const clickButton = async ({ button, expectedLangParams }) => {
+ await button.trigger('click');
+
+ expect(commands.updateAttributes).toHaveBeenCalledWith('codeSuggestion', {
+ langParams: expectedLangParams,
+ });
+ expect(commands.run).toHaveBeenCalled();
+
+ await wrapper.setProps({ node: { attrs: { ...nodeAttrs, langParams: expectedLangParams } } });
+ await emitEditorEvent({ event: 'transaction', tiptapEditor });
+ };
+
+ beforeEach(async () => {
+ contentEditor = {
+ codeSuggestionsConfig: {
+ canSuggest: true,
+ line: { new_line: 5 },
+ lines: [{ new_line: 5 }],
+ showPopover: false,
+ diffFile: {
+ view_path:
+ '/gitlab-org/gitlab-test/-/blob/468abc807a2b2572f43e72c743b76cee6db24025/README.md',
+ },
+ },
+ };
+
+ commands = mockChainedCommands(tiptapEditor, ['updateAttributes', 'run']);
+
+ createWrapper(nodeAttrs);
+ await emitEditorEvent({ event: 'transaction', tiptapEditor });
+ });
+
+ it('shows a code suggestion block', () => {
+ expect(findCodeSuggestionBoxText()).toContain('Suggested change From line 5 to 5');
+ expect(findCodeDeleted()).toMatchInlineSnapshot(
+ `"<code data-line-number=\\"5\\">## Usage\u200b</code>"`,
+ );
+ expect(findCodeAdded()).toMatchInlineSnapshot(
+ `"<code data-line-number=\\"5\\">\u200b</code>"`,
+ );
+ });
+
+ describe('decrement line start button', () => {
+ let button;
+
+ beforeEach(() => {
+ button = wrapper.findByTestId('decrement-line-start');
+ });
+
+ it('decrements the start line number', async () => {
+ await clickButton({ button, expectedLangParams: '-1+0' });
+
+ expect(findCodeSuggestionBoxText()).toContain('Suggested change From line 4 to 5');
+ expect(findCodeDeleted()).toMatchInlineSnapshot(`
+ "<code data-line-number=\\"4\\">\u200b
+ </code>
+ <code data-line-number=\\"5\\">## Usage\u200b</code>"
+ `);
+ });
+
+ it('is disabled if the start line is already 1', async () => {
+ expect(button.attributes('disabled')).toBeUndefined();
+
+ await clickButton({ button, expectedLangParams: '-1+0' });
+ await clickButton({ button, expectedLangParams: '-2+0' });
+ await clickButton({ button, expectedLangParams: '-3+0' });
+ await clickButton({ button, expectedLangParams: '-4+0' });
+
+ expect(findCodeSuggestionBoxText()).toContain('Suggested change From line 1 to 5');
+ expect(findCodeDeleted()).toMatchInlineSnapshot(`
+ "<code data-line-number=\\"1\\"># Sample README\u200b
+ </code>
+ <code data-line-number=\\"2\\">\u200b
+ </code>
+ <code data-line-number=\\"3\\">This is a sample README.\u200b
+ </code>
+ <code data-line-number=\\"4\\">\u200b
+ </code>
+ <code data-line-number=\\"5\\">## Usage\u200b</code>"
+ `);
+
+ expect(button.attributes('disabled')).toBe('disabled');
+ });
+ });
+
+ describe('increment line start button', () => {
+ let decrementButton;
+ let button;
+
+ beforeEach(() => {
+ decrementButton = wrapper.findByTestId('decrement-line-start');
+ button = wrapper.findByTestId('increment-line-start');
+ });
+
+ it('is disabled if the start line is already the current line', async () => {
+ expect(button.attributes('disabled')).toBe('disabled');
+
+ // decrement once, increment once
+ await clickButton({ button: decrementButton, expectedLangParams: '-1+0' });
+ expect(button.attributes('disabled')).toBeUndefined();
+ await clickButton({ button, expectedLangParams: '-0+0' });
+
+ expect(button.attributes('disabled')).toBe('disabled');
+ });
+
+ it('increments the start line number', async () => {
+ // decrement twice, increment once
+ await clickButton({ button: decrementButton, expectedLangParams: '-1+0' });
+ await clickButton({ button: decrementButton, expectedLangParams: '-2+0' });
+ await clickButton({ button, expectedLangParams: '-1+0' });
+
+ expect(findCodeSuggestionBoxText()).toContain('Suggested change From line 4 to 5');
+ expect(findCodeDeleted()).toMatchInlineSnapshot(`
+ "<code data-line-number=\\"4\\">\u200b
+ </code>
+ <code data-line-number=\\"5\\">## Usage\u200b</code>"
+ `);
+ });
+ });
+
+ describe('decrement line end button', () => {
+ let incrementButton;
+ let button;
+
+ beforeEach(() => {
+ incrementButton = wrapper.findByTestId('increment-line-end');
+ button = wrapper.findByTestId('decrement-line-end');
+ });
+
+ it('is disabled if the line end is already the current line', async () => {
+ expect(button.attributes('disabled')).toBe('disabled');
+
+ // increment once, decrement once
+ await clickButton({ button: incrementButton, expectedLangParams: '-0+1' });
+ expect(button.attributes('disabled')).toBeUndefined();
+ await clickButton({ button, expectedLangParams: '-0+0' });
+
+ expect(button.attributes('disabled')).toBe('disabled');
+ });
+
+ it('increments the end line number', async () => {
+ // increment twice, decrement once
+ await clickButton({ button: incrementButton, expectedLangParams: '-0+1' });
+ await clickButton({ button: incrementButton, expectedLangParams: '-0+2' });
+ await clickButton({ button, expectedLangParams: '-0+1' });
+
+ expect(findCodeSuggestionBoxText()).toContain('Suggested change From line 5 to 6');
+ expect(findCodeDeleted()).toMatchInlineSnapshot(`
+ "<code data-line-number=\\"5\\">## Usage\u200b
+ </code>
+ <code data-line-number=\\"6\\">\u200b</code>"
+ `);
+ });
+ });
+
+ describe('increment line end button', () => {
+ let button;
+
+ beforeEach(() => {
+ button = wrapper.findByTestId('increment-line-end');
+ });
+
+ it('decrements the start line number', async () => {
+ await clickButton({ button, expectedLangParams: '-0+1' });
+
+ expect(findCodeSuggestionBoxText()).toContain('Suggested change From line 5 to 6');
+ expect(findCodeDeleted()).toMatchInlineSnapshot(`
+ "<code data-line-number=\\"5\\">## Usage\u200b
+ </code>
+ <code data-line-number=\\"6\\">\u200b</code>"
+ `);
+ });
+
+ it('is disabled if the end line is EOF', async () => {
+ expect(button.attributes('disabled')).toBeUndefined();
+
+ await clickButton({ button, expectedLangParams: '-0+1' });
+ await clickButton({ button, expectedLangParams: '-0+2' });
+ await clickButton({ button, expectedLangParams: '-0+3' });
+ await clickButton({ button, expectedLangParams: '-0+4' });
+
+ expect(findCodeSuggestionBoxText()).toContain('Suggested change From line 5 to 9');
+ expect(findCodeDeleted()).toMatchInlineSnapshot(`
+ "<code data-line-number=\\"5\\">## Usage\u200b
+ </code>
+ <code data-line-number=\\"6\\">\u200b
+ </code>
+ <code data-line-number=\\"7\\">\`\`\`yaml\u200b
+ </code>
+ <code data-line-number=\\"8\\">foo: bar\u200b
+ </code>
+ <code data-line-number=\\"9\\">\`\`\`\u200b</code>"
+ `);
+
+ expect(button.attributes('disabled')).toBe('disabled');
+ });
+ });
+ });
});
diff --git a/spec/frontend/content_editor/components/wrappers/image_spec.js b/spec/frontend/content_editor/components/wrappers/image_spec.js
new file mode 100644
index 00000000000..0ac3b7e9465
--- /dev/null
+++ b/spec/frontend/content_editor/components/wrappers/image_spec.js
@@ -0,0 +1,100 @@
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import ImageWrapper from '~/content_editor/components/wrappers/image.vue';
+import { createTestEditor, mockChainedCommands } from '../../test_utils';
+
+describe('content/components/wrappers/image_spec', () => {
+ let wrapper;
+ let tiptapEditor;
+
+ const createWrapper = (node = {}) => {
+ tiptapEditor = createTestEditor();
+ wrapper = shallowMountExtended(ImageWrapper, {
+ propsData: {
+ editor: tiptapEditor,
+ node,
+ getPos: jest.fn().mockReturnValue(12),
+ },
+ });
+ };
+
+ const findHandle = (handle) => wrapper.findByTestId(`image-resize-${handle}`);
+ const findImage = () => wrapper.find('img');
+
+ it('renders an image with the given attributes', () => {
+ createWrapper({
+ type: 'image',
+ attrs: { src: 'image.png', alt: 'My Image', width: 200, height: 200 },
+ });
+
+ expect(findImage().attributes()).toMatchObject({
+ src: 'image.png',
+ alt: 'My Image',
+ height: '200',
+ width: '200',
+ });
+ });
+
+ it('sets width and height to auto if not provided', () => {
+ createWrapper({ type: 'image', attrs: { src: 'image.png', alt: 'My Image' } });
+
+ expect(findImage().attributes()).toMatchObject({
+ src: 'image.png',
+ alt: 'My Image',
+ height: 'auto',
+ width: 'auto',
+ });
+ });
+
+ it('renders corner resize handles', () => {
+ createWrapper({ type: 'image', attrs: { src: 'image.png', alt: 'My Image' } });
+
+ expect(findHandle('nw').exists()).toBe(true);
+ expect(findHandle('ne').exists()).toBe(true);
+ expect(findHandle('sw').exists()).toBe(true);
+ expect(findHandle('se').exists()).toBe(true);
+ });
+
+ describe.each`
+ handle | htmlElementAttributes | tiptapNodeAttributes
+ ${'nw'} | ${{ width: '300', height: '75' }} | ${{ width: 300, height: 75 }}
+ ${'ne'} | ${{ width: '500', height: '125' }} | ${{ width: 500, height: 125 }}
+ ${'sw'} | ${{ width: '300', height: '75' }} | ${{ width: 300, height: 75 }}
+ ${'se'} | ${{ width: '500', height: '125' }} | ${{ width: 500, height: 125 }}
+ `('resizing using $handle', ({ handle, htmlElementAttributes, tiptapNodeAttributes }) => {
+ let handleEl;
+
+ const initialMousePosition = { screenX: 200, screenY: 200 };
+ const finalMousePosition = { screenX: 300, screenY: 300 };
+
+ beforeEach(() => {
+ createWrapper({
+ type: 'image',
+ attrs: { src: 'image.png', alt: 'My Image', width: 400, height: 100 },
+ });
+
+ handleEl = findHandle(handle);
+ handleEl.element.dispatchEvent(new MouseEvent('mousedown', initialMousePosition));
+ document.dispatchEvent(new MouseEvent('mousemove', finalMousePosition));
+ });
+
+ it('resizes the image properly on mousedown+mousemove', () => {
+ expect(findImage().attributes()).toMatchObject(htmlElementAttributes);
+ });
+
+ it('updates prosemirror doc state on mouse release with final size', () => {
+ const commands = mockChainedCommands(tiptapEditor, [
+ 'focus',
+ 'updateAttributes',
+ 'setNodeSelection',
+ 'run',
+ ]);
+
+ document.dispatchEvent(new MouseEvent('mouseup'));
+
+ expect(commands.focus).toHaveBeenCalled();
+ expect(commands.updateAttributes).toHaveBeenCalledWith('image', tiptapNodeAttributes);
+ expect(commands.setNodeSelection).toHaveBeenCalledWith(12);
+ expect(commands.run).toHaveBeenCalled();
+ });
+ });
+});
diff --git a/spec/frontend/content_editor/components/wrappers/reference_spec.js b/spec/frontend/content_editor/components/wrappers/reference_spec.js
index 828b92a6b1e..132e0e52ae5 100644
--- a/spec/frontend/content_editor/components/wrappers/reference_spec.js
+++ b/spec/frontend/content_editor/components/wrappers/reference_spec.js
@@ -1,4 +1,5 @@
import { GlLink } from '@gitlab/ui';
+import waitForPromises from 'helpers/wait_for_promises';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import ReferenceWrapper from '~/content_editor/components/wrappers/reference.vue';
@@ -8,6 +9,13 @@ describe('content/components/wrappers/reference', () => {
const createWrapper = (node = {}) => {
wrapper = shallowMountExtended(ReferenceWrapper, {
propsData: { node },
+ provide: {
+ contentEditor: {
+ resolveReference: jest.fn().mockResolvedValue({
+ href: 'https://gitlab.com/gitlab-org/gitlab-test/-/issues/252522',
+ }),
+ },
+ },
});
};
@@ -43,4 +51,14 @@ describe('content/components/wrappers/reference', () => {
expect(link.text()).toBe('@root');
expect(link.classes('current-user')).toBe(true);
});
+
+ it('renders the href of the reference correctly', async () => {
+ createWrapper({ attrs: { referenceType: 'issue', text: '#252522' } });
+ await waitForPromises();
+
+ const link = wrapper.findComponent(GlLink);
+ expect(link.attributes('href')).toBe(
+ 'https://gitlab.com/gitlab-org/gitlab-test/-/issues/252522',
+ );
+ });
});
diff --git a/spec/frontend/content_editor/extensions/code_suggestion_spec.js b/spec/frontend/content_editor/extensions/code_suggestion_spec.js
new file mode 100644
index 00000000000..86656fb96c3
--- /dev/null
+++ b/spec/frontend/content_editor/extensions/code_suggestion_spec.js
@@ -0,0 +1,128 @@
+import CodeBlockHighlight from '~/content_editor/extensions/code_block_highlight';
+import CodeSuggestion from '~/content_editor/extensions/code_suggestion';
+import {
+ createTestEditor,
+ createDocBuilder,
+ triggerNodeInputRule,
+ expectDocumentAfterTransaction,
+ sleep,
+} from '../test_utils';
+
+const SAMPLE_README_CONTENT = `# Sample README
+
+This is a sample README.
+
+## Usage
+
+\`\`\`yaml
+foo: bar
+\`\`\`
+`;
+
+jest.mock('~/content_editor/services/utils', () => ({
+ memoizedGet: jest.fn().mockResolvedValue(SAMPLE_README_CONTENT),
+}));
+
+describe('content_editor/extensions/code_suggestion', () => {
+ let tiptapEditor;
+ let doc;
+ let codeSuggestion;
+
+ const codeSuggestionConfig = {
+ canSuggest: true,
+ line: { new_line: 5 },
+ lines: [{ new_line: 5 }],
+ showPopover: false,
+ diffFile: {
+ view_path:
+ '/gitlab-org/gitlab-test/-/blob/468abc807a2b2572f43e72c743b76cee6db24025/README.md',
+ },
+ };
+
+ const createEditor = (config = {}) => {
+ tiptapEditor = createTestEditor({
+ extensions: [
+ CodeBlockHighlight,
+ CodeSuggestion.configure({ config: { ...codeSuggestionConfig, ...config } }),
+ ],
+ });
+
+ ({
+ builders: { doc, codeSuggestion },
+ } = createDocBuilder({
+ tiptapEditor,
+ names: {
+ codeBlock: { nodeType: CodeBlockHighlight.name },
+ codeSuggestion: { nodeType: CodeSuggestion.name },
+ },
+ }));
+ };
+
+ describe('insertCodeSuggestion command', () => {
+ it('creates a correct suggestion for a single line selection', async () => {
+ createEditor({ line: { new_line: 5 }, lines: [] });
+
+ await expectDocumentAfterTransaction({
+ number: 1,
+ tiptapEditor,
+ action: () => tiptapEditor.commands.insertCodeSuggestion(),
+ expectedDoc: doc(codeSuggestion({ langParams: '-0+0' }, '## Usage')),
+ });
+ });
+
+ it('creates a correct suggestion for a multi-line selection', async () => {
+ createEditor({
+ line: { new_line: 9 },
+ lines: [
+ { new_line: 5 },
+ { new_line: 6 },
+ { new_line: 7 },
+ { new_line: 8 },
+ { new_line: 9 },
+ ],
+ });
+
+ await expectDocumentAfterTransaction({
+ number: 1,
+ tiptapEditor,
+ action: () => tiptapEditor.commands.insertCodeSuggestion(),
+ expectedDoc: doc(
+ codeSuggestion({ langParams: '-4+0' }, '## Usage\n\n```yaml\nfoo: bar\n```'),
+ ),
+ });
+ });
+
+ it('does not insert a new suggestion if already inside a suggestion', async () => {
+ const initialDoc = codeSuggestion({ langParams: '-0+0' }, '## Usage');
+
+ createEditor({ line: { new_line: 5 }, lines: [] });
+
+ tiptapEditor.commands.setContent(doc(initialDoc).toJSON());
+
+ jest.spyOn(tiptapEditor, 'isActive').mockReturnValue(true);
+
+ tiptapEditor.commands.insertCodeSuggestion();
+ // wait some time to be sure no other transaction happened
+ await sleep();
+
+ expect(tiptapEditor.getJSON()).toEqual(doc(initialDoc).toJSON());
+ });
+ });
+
+ describe('when typing ```suggestion input rule', () => {
+ beforeEach(() => {
+ createEditor();
+
+ triggerNodeInputRule({
+ tiptapEditor,
+ inputRuleText: '```suggestion ',
+ });
+ });
+
+ it('creates a new code suggestion block with lines -0+0', () => {
+ const expectedDoc = doc(codeSuggestion({ language: 'suggestion', langParams: '-0+0' }));
+
+ expect(tiptapEditor.getJSON()).toEqual(expectedDoc.toJSON());
+ });
+ });
+});
diff --git a/spec/frontend/content_editor/extensions/comment_spec.js b/spec/frontend/content_editor/extensions/comment_spec.js
deleted file mode 100644
index 7d8ff28e4d7..00000000000
--- a/spec/frontend/content_editor/extensions/comment_spec.js
+++ /dev/null
@@ -1,30 +0,0 @@
-import Comment from '~/content_editor/extensions/comment';
-import { createTestEditor, createDocBuilder, triggerNodeInputRule } from '../test_utils';
-
-describe('content_editor/extensions/comment', () => {
- let tiptapEditor;
- let doc;
- let comment;
-
- beforeEach(() => {
- tiptapEditor = createTestEditor({ extensions: [Comment] });
- ({
- builders: { doc, comment },
- } = createDocBuilder({
- tiptapEditor,
- names: {
- comment: { nodeType: Comment.name },
- },
- }));
- });
-
- describe('when typing the comment input rule', () => {
- it('inserts a comment node', () => {
- const expectedDoc = doc(comment());
-
- triggerNodeInputRule({ tiptapEditor, inputRuleText: '<!-- ' });
-
- expect(tiptapEditor.getJSON()).toEqual(expectedDoc.toJSON());
- });
- });
-});
diff --git a/spec/frontend/content_editor/extensions/copy_paste_spec.js b/spec/frontend/content_editor/extensions/copy_paste_spec.js
new file mode 100644
index 00000000000..f8faa7869c0
--- /dev/null
+++ b/spec/frontend/content_editor/extensions/copy_paste_spec.js
@@ -0,0 +1,385 @@
+import CopyPaste from '~/content_editor/extensions/copy_paste';
+import CodeBlockHighlight from '~/content_editor/extensions/code_block_highlight';
+import Loading from '~/content_editor/extensions/loading';
+import Diagram from '~/content_editor/extensions/diagram';
+import Frontmatter from '~/content_editor/extensions/frontmatter';
+import Heading from '~/content_editor/extensions/heading';
+import Bold from '~/content_editor/extensions/bold';
+import Italic from '~/content_editor/extensions/italic';
+import { VARIANT_DANGER } from '~/alert';
+import eventHubFactory from '~/helpers/event_hub_factory';
+import { ALERT_EVENT } from '~/content_editor/constants';
+import waitForPromises from 'helpers/wait_for_promises';
+import MarkdownSerializer from '~/content_editor/services/markdown_serializer';
+import {
+ createTestEditor,
+ createDocBuilder,
+ waitUntilNextDocTransaction,
+ sleep,
+} from '../test_utils';
+
+const CODE_BLOCK_HTML = '<pre class="js-syntax-highlight" lang="javascript">var a = 2;</pre>';
+const CODE_SUGGESTION_HTML =
+ '<pre data-lang-params="-0+0" class="js-syntax-highlight language-suggestion" lang="suggestion">Suggested code</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 dir="auto">Some text with <strong>bold</strong> and <em>italic</em> text.</p>';
+
+describe('content_editor/extensions/copy_paste', () => {
+ let tiptapEditor;
+ let doc;
+ let p;
+ let bold;
+ let italic;
+ let loading;
+ let heading;
+ let codeBlock;
+ let renderMarkdown;
+ let resolveRenderMarkdownPromise;
+ let resolveRenderMarkdownPromiseAndWait;
+
+ let eventHub;
+ const defaultData = { 'text/plain': '**bold text**' };
+
+ beforeEach(() => {
+ eventHub = eventHubFactory();
+ renderMarkdown = jest.fn().mockImplementation(
+ () =>
+ new Promise((resolve) => {
+ resolveRenderMarkdownPromise = resolve;
+ resolveRenderMarkdownPromiseAndWait = (data) =>
+ waitUntilNextDocTransaction({ tiptapEditor, action: () => resolve(data) });
+ }),
+ );
+
+ jest.spyOn(eventHub, '$emit');
+
+ tiptapEditor = createTestEditor({
+ extensions: [
+ Bold,
+ Italic,
+ Loading,
+ CodeBlockHighlight,
+ Diagram,
+ Frontmatter,
+ Heading,
+ CopyPaste.configure({ renderMarkdown, eventHub, serializer: new MarkdownSerializer() }),
+ ],
+ });
+
+ ({
+ builders: { doc, p, bold, italic, heading, loading, codeBlock },
+ } = createDocBuilder({
+ tiptapEditor,
+ names: {
+ bold: { markType: Bold.name },
+ italic: { markType: Italic.name },
+ loading: { nodeType: Loading.name },
+ heading: { nodeType: Heading.name },
+ codeBlock: { nodeType: CodeBlockHighlight.name },
+ },
+ }));
+ });
+
+ const buildClipboardEvent = ({ eventName = 'paste', data = {}, types = ['text/plain'] } = {}) => {
+ return Object.assign(new Event(eventName), {
+ clipboardData: {
+ types,
+ getData: jest.fn((type) => data[type] || defaultData[type]),
+ setData: jest.fn(),
+ clearData: jest.fn(),
+ },
+ });
+ };
+
+ const triggerPasteEventHandler = (event) => {
+ return new Promise((resolve) => {
+ tiptapEditor.view.someProp('handlePaste', (eventHandler) => {
+ resolve(eventHandler(tiptapEditor.view, event));
+ });
+ });
+ };
+
+ const triggerPasteEventHandlerAndWaitForTransaction = (event) => {
+ return waitUntilNextDocTransaction({
+ tiptapEditor,
+ action: () => {
+ tiptapEditor.view.someProp('handlePaste', (eventHandler) => {
+ return eventHandler(tiptapEditor.view, event);
+ });
+ },
+ });
+ };
+
+ it.each`
+ types | data | formatDesc
+ ${['text/plain']} | ${{}} | ${'plain text'}
+ ${['text/plain', 'text/html']} | ${{}} | ${'html format'}
+ ${['text/plain', 'text/html', 'vscode-editor-data']} | ${{ 'vscode-editor-data': '{ "mode": "markdown" }' }} | ${'vscode markdown'}
+ ${['text/plain', 'text/html', 'vscode-editor-data']} | ${{ 'vscode-editor-data': '{ "mode": "ruby" }' }} | ${'vscode snippet'}
+ `('handles $formatDesc', async ({ types, data }) => {
+ expect(await triggerPasteEventHandler(buildClipboardEvent({ types, data }))).toBe(true);
+ });
+
+ it.each`
+ nodeType | html | handled | desc
+ ${'codeBlock'} | ${CODE_BLOCK_HTML} | ${false} | ${'does not handle'}
+ ${'codeSuggestion'} | ${CODE_SUGGESTION_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.each`
+ eventName | expectedDoc
+ ${'cut'} | ${() => doc(p())}
+ ${'copy'} | ${() => doc(p('Some text with ', bold('bold'), ' and ', italic('italic'), ' text.'))}
+ `('when $eventName event is triggered', ({ eventName, expectedDoc }) => {
+ let event;
+ beforeEach(() => {
+ event = buildClipboardEvent({ eventName });
+
+ jest.spyOn(event, 'preventDefault');
+ jest.spyOn(event, 'stopPropagation');
+
+ tiptapEditor.commands.insertContent(PARAGRAPH_HTML);
+ tiptapEditor.commands.selectAll();
+ tiptapEditor.view.dispatchEvent(event);
+ });
+
+ it('prevents default', () => {
+ expect(event.preventDefault).toHaveBeenCalled();
+ expect(event.stopPropagation).toHaveBeenCalled();
+ });
+
+ it('sets the clipboard data', () => {
+ expect(event.clipboardData.setData).toHaveBeenCalledWith(
+ 'text/plain',
+ 'Some text with bold and italic text.',
+ );
+ expect(event.clipboardData.setData).toHaveBeenCalledWith('text/html', PARAGRAPH_HTML);
+ expect(event.clipboardData.setData).toHaveBeenCalledWith(
+ 'text/x-gfm',
+ 'Some text with **bold** and _italic_ text.',
+ );
+ });
+
+ it('modifies the document', () => {
+ expect(tiptapEditor.state.doc.toJSON()).toEqual(expectedDoc().toJSON());
+ });
+ });
+
+ describe('when pasting raw markdown source', () => {
+ it('shows a loading indicator while markdown is being processed', async () => {
+ const expectedDoc = doc(p(loading({ id: expect.any(String) })));
+
+ await triggerPasteEventHandlerAndWaitForTransaction(buildClipboardEvent());
+
+ expect(tiptapEditor.state.doc.toJSON()).toEqual(expectedDoc.toJSON());
+ });
+
+ it('pastes in the correct position if some content is added before the markdown is processed', async () => {
+ const expectedDoc = doc(p(bold('some markdown'), 'some content'));
+ const resolvedValue = '<strong>some markdown</strong>';
+
+ await triggerPasteEventHandlerAndWaitForTransaction(buildClipboardEvent());
+
+ tiptapEditor.commands.insertContent('some content');
+ await resolveRenderMarkdownPromiseAndWait(resolvedValue);
+
+ expect(tiptapEditor.state.doc.toJSON()).toEqual(expectedDoc.toJSON());
+ expect(tiptapEditor.state.selection.from).toEqual(26); // end of the document
+ });
+
+ it('does not paste anything if the loading indicator is deleted before the markdown is processed', async () => {
+ const expectedDoc = doc(p());
+
+ await triggerPasteEventHandlerAndWaitForTransaction(buildClipboardEvent());
+ tiptapEditor.chain().selectAll().deleteSelection().run();
+ resolveRenderMarkdownPromise('some markdown');
+
+ // wait some time to be sure no transaction happened
+ await sleep();
+ expect(tiptapEditor.state.doc.toJSON()).toEqual(expectedDoc.toJSON());
+ });
+
+ describe('when rendering markdown succeeds', () => {
+ let resolvedValue;
+
+ beforeEach(() => {
+ resolvedValue = '<strong>bold text</strong>';
+ });
+
+ it('transforms pasted text into a prosemirror node', async () => {
+ const expectedDoc = doc(p(bold('bold text')));
+
+ await triggerPasteEventHandlerAndWaitForTransaction(buildClipboardEvent());
+ await resolveRenderMarkdownPromiseAndWait(resolvedValue);
+
+ expect(tiptapEditor.state.doc.toJSON()).toEqual(expectedDoc.toJSON());
+ });
+
+ describe('when pasting inline content in an existing paragraph', () => {
+ it('inserts the inline content next to the existing paragraph content', async () => {
+ const expectedDoc = doc(p('Initial text and', bold('bold text')));
+
+ tiptapEditor.commands.setContent('Initial text and ');
+
+ await triggerPasteEventHandlerAndWaitForTransaction(buildClipboardEvent());
+ await resolveRenderMarkdownPromiseAndWait(resolvedValue);
+
+ expect(tiptapEditor.state.doc.toJSON()).toEqual(expectedDoc.toJSON());
+ });
+ });
+
+ describe('when pasting inline content and there is text selected', () => {
+ it('inserts the block content after the existing paragraph', async () => {
+ const expectedDoc = doc(p('Initial text', bold('bold text')));
+
+ tiptapEditor.commands.setContent('Initial text and ');
+ tiptapEditor.commands.setTextSelection({ from: 13, to: 17 });
+
+ await triggerPasteEventHandlerAndWaitForTransaction(buildClipboardEvent());
+ await resolveRenderMarkdownPromiseAndWait(resolvedValue);
+
+ expect(tiptapEditor.state.doc.toJSON()).toEqual(expectedDoc.toJSON());
+ });
+ });
+
+ describe('when pasting block content in an existing paragraph', () => {
+ beforeEach(() => {
+ resolvedValue = '<h1>Heading</h1><p><strong>bold text</strong></p>';
+ });
+
+ it('inserts the block content after the existing paragraph', async () => {
+ const expectedDoc = doc(
+ p('Initial text and'),
+ heading({ level: 1 }, 'Heading'),
+ p(bold('bold text')),
+ );
+
+ tiptapEditor.commands.setContent('Initial text and ');
+
+ await triggerPasteEventHandlerAndWaitForTransaction(buildClipboardEvent());
+ await resolveRenderMarkdownPromiseAndWait(resolvedValue);
+
+ expect(tiptapEditor.state.doc.toJSON()).toEqual(expectedDoc.toJSON());
+ });
+ });
+ });
+
+ describe('when pasting html content', () => {
+ it('strips out any stray div, pre, span tags', async () => {
+ const resolvedValue =
+ '<div><span dir="auto"><strong>bold text</strong></span></div><pre><code>some code</code></pre>';
+
+ const expectedDoc = doc(p(bold('bold text')), p('some code'));
+
+ await triggerPasteEventHandlerAndWaitForTransaction(
+ buildClipboardEvent({
+ types: ['text/html'],
+ data: {
+ 'text/html':
+ '<div><span dir="auto"><strong>bold text</strong></span></div><pre><code>some code</code></pre>',
+ },
+ }),
+ );
+ await resolveRenderMarkdownPromiseAndWait(resolvedValue);
+
+ expect(tiptapEditor.state.doc.toJSON()).toEqual(expectedDoc.toJSON());
+ });
+ });
+
+ describe('when pasting text/x-gfm', () => {
+ it('processes the content as markdown, even if html content exists', async () => {
+ const resolvedValue = '<strong>bold text</strong>';
+ const expectedDoc = doc(p(bold('bold text')));
+
+ await triggerPasteEventHandlerAndWaitForTransaction(
+ buildClipboardEvent({
+ types: ['text/x-gfm'],
+ data: {
+ 'text/x-gfm': '**bold text**',
+ 'text/plain': 'irrelevant text',
+ 'text/html': '<div>some random irrelevant html</div>',
+ },
+ }),
+ );
+ await resolveRenderMarkdownPromiseAndWait(resolvedValue);
+
+ expect(tiptapEditor.state.doc.toJSON()).toEqual(expectedDoc.toJSON());
+ });
+ });
+
+ describe('when pasting vscode-editor-data', () => {
+ it('pastes the content as a code block', async () => {
+ const resolvedValue =
+ '<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:1-3:3" data-canonical-lang="ruby" class="code highlight js-syntax-highlight language-ruby" lang="ruby" v-pre="true"><code><span id="LC1" class="line" lang="ruby"><span class="nb">puts</span> <span class="s2">"Hello World"</span></span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>';
+
+ const expectedDoc = doc(
+ codeBlock(
+ { language: 'ruby', class: 'code highlight js-syntax-highlight language-ruby' },
+ 'puts "Hello World"',
+ ),
+ );
+
+ await triggerPasteEventHandlerAndWaitForTransaction(
+ buildClipboardEvent({
+ types: ['vscode-editor-data', 'text/plain', 'text/html'],
+ data: {
+ 'vscode-editor-data': '{ "version": 1, "mode": "ruby" }',
+ 'text/plain': 'puts "Hello World"',
+ 'text/html':
+ '<meta charset=\'utf-8\'><div style="color: #d4d4d4;background-color: #1e1e1e;font-family: \'Fira Code\', Menlo, Monaco, \'Courier New\', monospace, Menlo, Monaco, \'Courier New\', monospace;font-weight: normal;font-size: 14px;line-height: 21px;white-space: pre;"><div><span style="color: #dcdcaa;">puts</span><span style="color: #d4d4d4;"> </span><span style="color: #ce9178;">"Hello world"</span></div></div>',
+ },
+ }),
+ );
+ await resolveRenderMarkdownPromiseAndWait(resolvedValue);
+
+ expect(tiptapEditor.state.doc.toJSON()).toEqual(expectedDoc.toJSON());
+ });
+
+ it('pastes as regular markdown if language is markdown', async () => {
+ const resolvedValue = '<p><strong>bold text</strong></p>';
+
+ const expectedDoc = doc(p(bold('bold text')));
+
+ await triggerPasteEventHandlerAndWaitForTransaction(
+ buildClipboardEvent({
+ types: ['vscode-editor-data', 'text/plain', 'text/html'],
+ data: {
+ 'vscode-editor-data': '{ "version": 1, "mode": "markdown" }',
+ 'text/plain': '**bold text**',
+ 'text/html': '<p><strong>bold text</strong></p>',
+ },
+ }),
+ );
+ await resolveRenderMarkdownPromiseAndWait(resolvedValue);
+
+ expect(tiptapEditor.state.doc.toJSON()).toEqual(expectedDoc.toJSON());
+ });
+ });
+
+ describe('when rendering markdown fails', () => {
+ beforeEach(() => {
+ renderMarkdown.mockRejectedValueOnce();
+ });
+
+ it(`triggers ${ALERT_EVENT} event`, async () => {
+ await triggerPasteEventHandler(buildClipboardEvent());
+ await waitForPromises();
+
+ expect(eventHub.$emit).toHaveBeenCalledWith(ALERT_EVENT, {
+ message: expect.any(String),
+ variant: VARIANT_DANGER,
+ });
+ });
+ });
+ });
+});
diff --git a/spec/frontend/content_editor/extensions/hard_break_spec.js b/spec/frontend/content_editor/extensions/hard_break_spec.js
index 9e2e28b6e72..6a57e7eaa9b 100644
--- a/spec/frontend/content_editor/extensions/hard_break_spec.js
+++ b/spec/frontend/content_editor/extensions/hard_break_spec.js
@@ -3,35 +3,21 @@ import { createTestEditor, createDocBuilder } from '../test_utils';
describe('content_editor/extensions/hard_break', () => {
let tiptapEditor;
- let eq;
+
let doc;
let p;
- let hardBreak;
beforeEach(() => {
tiptapEditor = createTestEditor({ extensions: [HardBreak] });
({
- builders: { doc, p, hardBreak },
- eq,
+ builders: { doc, p },
} = createDocBuilder({
tiptapEditor,
names: { hardBreak: { nodeType: HardBreak.name } },
}));
});
- describe('Shift-Enter shortcut', () => {
- it('inserts a hard break when shortcut is executed', () => {
- const initialDoc = doc(p(''));
- const expectedDoc = doc(p(hardBreak()));
-
- tiptapEditor.commands.setContent(initialDoc.toJSON());
- tiptapEditor.commands.keyboardShortcut('Shift-Enter');
-
- expect(eq(tiptapEditor.state.doc, expectedDoc)).toBe(true);
- });
- });
-
describe('Mod-Enter shortcut', () => {
it('does not insert a hard break when shortcut is executed', () => {
const initialDoc = doc(p(''));
@@ -40,7 +26,7 @@ describe('content_editor/extensions/hard_break', () => {
tiptapEditor.commands.setContent(initialDoc.toJSON());
tiptapEditor.commands.keyboardShortcut('Mod-Enter');
- expect(eq(tiptapEditor.state.doc, expectedDoc)).toBe(true);
+ expect(tiptapEditor.state.doc.toJSON()).toEqual(expectedDoc.toJSON());
});
});
});
diff --git a/spec/frontend/content_editor/extensions/html_nodes_spec.js b/spec/frontend/content_editor/extensions/html_nodes_spec.js
index 24c68239025..3fe496aa708 100644
--- a/spec/frontend/content_editor/extensions/html_nodes_spec.js
+++ b/spec/frontend/content_editor/extensions/html_nodes_spec.js
@@ -28,9 +28,9 @@ describe('content_editor/extensions/html_nodes', () => {
});
it.each`
- input | insertedNodes
- ${'<div><p>foo</p></div>'} | ${() => div(p('foo'))}
- ${'<pre><p>foo</p></pre>'} | ${() => pre(p('foo'))}
+ input | insertedNodes
+ ${'<div><p dir="auto">foo</p></div>'} | ${() => div(p('foo'))}
+ ${'<pre><p dir="auto">foo</p></pre>'} | ${() => pre(p('foo'))}
`('parses and creates nodes for $input', ({ input, insertedNodes }) => {
const expectedDoc = doc(insertedNodes());
diff --git a/spec/frontend/content_editor/extensions/image_spec.js b/spec/frontend/content_editor/extensions/image_spec.js
index f73b0143fd9..69f4f4c6d65 100644
--- a/spec/frontend/content_editor/extensions/image_spec.js
+++ b/spec/frontend/content_editor/extensions/image_spec.js
@@ -35,7 +35,7 @@ describe('content_editor/extensions/image', () => {
tiptapEditor.commands.setContent(initialDoc.toJSON());
expect(tiptapEditor.getHTML()).toEqual(
- '<p><img src="/-/wikis/uploads/image.jpg" alt="image" title="this is an image"></p>',
+ '<p dir="auto"><img src="/-/wikis/uploads/image.jpg" alt="image" title="this is an image"></p>',
);
});
});
diff --git a/spec/frontend/content_editor/extensions/paragraph_spec.js b/spec/frontend/content_editor/extensions/paragraph_spec.js
new file mode 100644
index 00000000000..d04dda1871d
--- /dev/null
+++ b/spec/frontend/content_editor/extensions/paragraph_spec.js
@@ -0,0 +1,29 @@
+import { createTestEditor, createDocBuilder } from '../test_utils';
+
+describe('content_editor/extensions/paragraph', () => {
+ let tiptapEditor;
+ let doc;
+ let p;
+
+ beforeEach(() => {
+ tiptapEditor = createTestEditor();
+
+ ({
+ builders: { doc, p },
+ } = createDocBuilder({ tiptapEditor }));
+ });
+
+ describe('Shift-Enter shortcut', () => {
+ it('inserts a new paragraph when shortcut is executed', async () => {
+ const initialDoc = doc(p('hello'));
+ const expectedDoc = doc(p('hello'), p(''));
+
+ tiptapEditor.commands.setContent(initialDoc.toJSON());
+ tiptapEditor.commands.keyboardShortcut('Shift-Enter');
+
+ await Promise.resolve();
+
+ expect(tiptapEditor.state.doc.toJSON()).toEqual(expectedDoc.toJSON());
+ });
+ });
+});
diff --git a/spec/frontend/content_editor/extensions/paste_markdown_spec.js b/spec/frontend/content_editor/extensions/paste_markdown_spec.js
deleted file mode 100644
index baf0919fec8..00000000000
--- a/spec/frontend/content_editor/extensions/paste_markdown_spec.js
+++ /dev/null
@@ -1,323 +0,0 @@
-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 Heading from '~/content_editor/extensions/heading';
-import Bold from '~/content_editor/extensions/bold';
-import Italic from '~/content_editor/extensions/italic';
-import { VARIANT_DANGER } from '~/alert';
-import eventHubFactory from '~/helpers/event_hub_factory';
-import { ALERT_EVENT } from '~/content_editor/constants';
-import waitForPromises from 'helpers/wait_for_promises';
-import MarkdownSerializer from '~/content_editor/services/markdown_serializer';
-import { createTestEditor, createDocBuilder, waitUntilNextDocTransaction } from '../test_utils';
-
-const CODE_BLOCK_HTML = '<pre class="js-syntax-highlight" lang="javascript">var a = 2;</pre>';
-const DIAGRAM_HTML =
- '<img data-diagram="nomnoml" data-diagram-src="data:text/plain;base64,WzxmcmFtZT5EZWNvcmF0b3IgcGF0dGVybl0=">';
-const FRONTMATTER_HTML = '<pre lang="yaml" data-lang-params="frontmatter">key: value</pre>';
-const PARAGRAPH_HTML = '<p>Some text with <strong>bold</strong> and <em>italic</em> text.</p>';
-
-describe('content_editor/extensions/paste_markdown', () => {
- let tiptapEditor;
- let doc;
- let p;
- let bold;
- let italic;
- let heading;
- let codeBlock;
- let renderMarkdown;
- let eventHub;
- const defaultData = { 'text/plain': '**bold text**' };
-
- beforeEach(() => {
- renderMarkdown = jest.fn();
- eventHub = eventHubFactory();
-
- jest.spyOn(eventHub, '$emit');
-
- tiptapEditor = createTestEditor({
- extensions: [
- Bold,
- Italic,
- CodeBlockHighlight,
- Diagram,
- Frontmatter,
- Heading,
- PasteMarkdown.configure({ renderMarkdown, eventHub, serializer: new MarkdownSerializer() }),
- ],
- });
-
- ({
- builders: { doc, p, bold, italic, heading, codeBlock },
- } = createDocBuilder({
- tiptapEditor,
- names: {
- bold: { markType: Bold.name },
- italic: { markType: Italic.name },
- heading: { nodeType: Heading.name },
- codeBlock: { nodeType: CodeBlockHighlight.name },
- },
- }));
- });
-
- const buildClipboardEvent = ({ eventName = 'paste', data = {}, types = ['text/plain'] } = {}) => {
- return Object.assign(new Event(eventName), {
- clipboardData: {
- types,
- getData: jest.fn((type) => data[type] || defaultData[type]),
- setData: jest.fn(),
- clearData: jest.fn(),
- },
- });
- };
-
- const triggerPasteEventHandler = (event) => {
- return new Promise((resolve) => {
- tiptapEditor.view.someProp('handlePaste', (eventHandler) => {
- resolve(eventHandler(tiptapEditor.view, event));
- });
- });
- };
-
- const triggerPasteEventHandlerAndWaitForTransaction = (event) => {
- return waitUntilNextDocTransaction({
- tiptapEditor,
- action: () => {
- tiptapEditor.view.someProp('handlePaste', (eventHandler) => {
- return eventHandler(tiptapEditor.view, event);
- });
- },
- });
- };
-
- it.each`
- types | data | formatDesc
- ${['text/plain']} | ${{}} | ${'plain text'}
- ${['text/plain', 'text/html']} | ${{}} | ${'html format'}
- ${['text/plain', 'text/html', 'vscode-editor-data']} | ${{ 'vscode-editor-data': '{ "mode": "markdown" }' }} | ${'vscode markdown'}
- ${['text/plain', 'text/html', 'vscode-editor-data']} | ${{ 'vscode-editor-data': '{ "mode": "ruby" }' }} | ${'vscode snippet'}
- `('handles $formatDesc', async ({ types, data }) => {
- expect(await triggerPasteEventHandler(buildClipboardEvent({ types, data }))).toBe(true);
- });
-
- 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.each`
- eventName | expectedDoc
- ${'cut'} | ${() => doc(p())}
- ${'copy'} | ${() => doc(p('Some text with ', bold('bold'), ' and ', italic('italic'), ' text.'))}
- `('when $eventName event is triggered', ({ eventName, expectedDoc }) => {
- let event;
- beforeEach(() => {
- event = buildClipboardEvent({ eventName });
-
- jest.spyOn(event, 'preventDefault');
- jest.spyOn(event, 'stopPropagation');
-
- tiptapEditor.commands.insertContent(PARAGRAPH_HTML);
- tiptapEditor.commands.selectAll();
- tiptapEditor.view.dispatchEvent(event);
- });
-
- it('prevents default', () => {
- expect(event.preventDefault).toHaveBeenCalled();
- expect(event.stopPropagation).toHaveBeenCalled();
- });
-
- it('sets the clipboard data', () => {
- expect(event.clipboardData.setData).toHaveBeenCalledWith(
- 'text/plain',
- 'Some text with bold and italic text.',
- );
- expect(event.clipboardData.setData).toHaveBeenCalledWith('text/html', PARAGRAPH_HTML);
- expect(event.clipboardData.setData).toHaveBeenCalledWith(
- 'text/x-gfm',
- 'Some text with **bold** and _italic_ text.',
- );
- });
-
- it('modifies the document', () => {
- expect(tiptapEditor.state.doc.toJSON()).toEqual(expectedDoc().toJSON());
- });
- });
-
- describe('when pasting raw markdown source', () => {
- describe('when rendering markdown succeeds', () => {
- beforeEach(() => {
- renderMarkdown.mockResolvedValueOnce('<strong>bold text</strong>');
- });
-
- it('transforms pasted text into a prosemirror node', async () => {
- const expectedDoc = doc(p(bold('bold text')));
-
- await triggerPasteEventHandlerAndWaitForTransaction(buildClipboardEvent());
-
- expect(tiptapEditor.state.doc.toJSON()).toEqual(expectedDoc.toJSON());
- });
-
- describe('when pasting inline content in an existing paragraph', () => {
- it('inserts the inline content next to the existing paragraph content', async () => {
- const expectedDoc = doc(p('Initial text and', bold('bold text')));
-
- tiptapEditor.commands.setContent('Initial text and ');
-
- await triggerPasteEventHandlerAndWaitForTransaction(buildClipboardEvent());
-
- expect(tiptapEditor.state.doc.toJSON()).toEqual(expectedDoc.toJSON());
- });
- });
-
- describe('when pasting inline content and there is text selected', () => {
- it('inserts the block content after the existing paragraph', async () => {
- const expectedDoc = doc(p('Initial text', bold('bold text')));
-
- tiptapEditor.commands.setContent('Initial text and ');
- tiptapEditor.commands.setTextSelection({ from: 13, to: 17 });
-
- await triggerPasteEventHandlerAndWaitForTransaction(buildClipboardEvent());
-
- expect(tiptapEditor.state.doc.toJSON()).toEqual(expectedDoc.toJSON());
- });
- });
-
- describe('when pasting block content in an existing paragraph', () => {
- beforeEach(() => {
- renderMarkdown.mockReset();
- renderMarkdown.mockResolvedValueOnce('<h1>Heading</h1><p><strong>bold text</strong></p>');
- });
-
- it('inserts the block content after the existing paragraph', async () => {
- const expectedDoc = doc(
- p('Initial text and'),
- heading({ level: 1 }, 'Heading'),
- p(bold('bold text')),
- );
-
- tiptapEditor.commands.setContent('Initial text and ');
-
- await triggerPasteEventHandlerAndWaitForTransaction(buildClipboardEvent());
-
- expect(tiptapEditor.state.doc.toJSON()).toEqual(expectedDoc.toJSON());
- });
- });
- });
-
- describe('when pasting html content', () => {
- it('strips out any stray div, pre, span tags', async () => {
- renderMarkdown.mockResolvedValueOnce(
- '<div><span dir="auto"><strong>bold text</strong></span></div><pre><code>some code</code></pre>',
- );
-
- const expectedDoc = doc(p(bold('bold text')), p('some code'));
-
- await triggerPasteEventHandlerAndWaitForTransaction(
- buildClipboardEvent({
- types: ['text/html'],
- data: {
- 'text/html':
- '<div><span dir="auto"><strong>bold text</strong></span></div><pre><code>some code</code></pre>',
- },
- }),
- );
-
- expect(tiptapEditor.state.doc.toJSON()).toEqual(expectedDoc.toJSON());
- });
- });
-
- describe('when pasting text/x-gfm', () => {
- it('processes the content as markdown, even if html content exists', async () => {
- renderMarkdown.mockResolvedValueOnce('<strong>bold text</strong>');
-
- const expectedDoc = doc(p(bold('bold text')));
-
- await triggerPasteEventHandlerAndWaitForTransaction(
- buildClipboardEvent({
- types: ['text/x-gfm'],
- data: {
- 'text/x-gfm': '**bold text**',
- 'text/plain': 'irrelevant text',
- 'text/html': '<div>some random irrelevant html</div>',
- },
- }),
- );
-
- expect(tiptapEditor.state.doc.toJSON()).toEqual(expectedDoc.toJSON());
- });
- });
-
- describe('when pasting vscode-editor-data', () => {
- it('pastes the content as a code block', async () => {
- renderMarkdown.mockResolvedValueOnce(
- '<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:1-3:3" data-canonical-lang="ruby" class="code highlight js-syntax-highlight language-ruby" lang="ruby" v-pre="true"><code><span id="LC1" class="line" lang="ruby"><span class="nb">puts</span> <span class="s2">"Hello World"</span></span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>',
- );
-
- const expectedDoc = doc(
- codeBlock(
- { language: 'ruby', class: 'code highlight js-syntax-highlight language-ruby' },
- 'puts "Hello World"',
- ),
- );
-
- await triggerPasteEventHandlerAndWaitForTransaction(
- buildClipboardEvent({
- types: ['vscode-editor-data', 'text/plain', 'text/html'],
- data: {
- 'vscode-editor-data': '{ "version": 1, "mode": "ruby" }',
- 'text/plain': 'puts "Hello World"',
- 'text/html':
- '<meta charset=\'utf-8\'><div style="color: #d4d4d4;background-color: #1e1e1e;font-family: \'Fira Code\', Menlo, Monaco, \'Courier New\', monospace, Menlo, Monaco, \'Courier New\', monospace;font-weight: normal;font-size: 14px;line-height: 21px;white-space: pre;"><div><span style="color: #dcdcaa;">puts</span><span style="color: #d4d4d4;"> </span><span style="color: #ce9178;">"Hello world"</span></div></div>',
- },
- }),
- );
-
- expect(tiptapEditor.state.doc.toJSON()).toEqual(expectedDoc.toJSON());
- });
-
- it('pastes as regular markdown if language is markdown', async () => {
- renderMarkdown.mockResolvedValueOnce('<p><strong>bold text</strong></p>');
-
- const expectedDoc = doc(p(bold('bold text')));
-
- await triggerPasteEventHandlerAndWaitForTransaction(
- buildClipboardEvent({
- types: ['vscode-editor-data', 'text/plain', 'text/html'],
- data: {
- 'vscode-editor-data': '{ "version": 1, "mode": "markdown" }',
- 'text/plain': '**bold text**',
- 'text/html': '<p><strong>bold text</strong></p>',
- },
- }),
- );
-
- expect(tiptapEditor.state.doc.toJSON()).toEqual(expectedDoc.toJSON());
- });
- });
-
- describe('when rendering markdown fails', () => {
- beforeEach(() => {
- renderMarkdown.mockRejectedValueOnce();
- });
-
- it(`triggers ${ALERT_EVENT} event`, async () => {
- await triggerPasteEventHandler(buildClipboardEvent());
- await waitForPromises();
-
- expect(eventHub.$emit).toHaveBeenCalledWith(ALERT_EVENT, {
- message: expect.any(String),
- variant: VARIANT_DANGER,
- });
- });
- });
- });
-});
diff --git a/spec/frontend/content_editor/remark_markdown_processing_spec.js b/spec/frontend/content_editor/remark_markdown_processing_spec.js
index 927a7d59899..3d4d5b13120 100644
--- a/spec/frontend/content_editor/remark_markdown_processing_spec.js
+++ b/spec/frontend/content_editor/remark_markdown_processing_spec.js
@@ -1337,13 +1337,13 @@ content
alert("Hello world")
</script>
`,
- expectedHtml: '<p></p>',
+ expectedHtml: '<p dir="auto"></p>',
},
{
markdown: `
<foo>Hello</foo>
`,
- expectedHtml: '<p></p>',
+ expectedHtml: '<p dir="auto"></p>',
},
{
markdown: `
@@ -1356,7 +1356,7 @@ alert("Hello world")
<a id="link-id">Header</a> and other text
`,
expectedHtml:
- '<p><a target="_blank" rel="noopener noreferrer nofollow">Header</a> and other text</p>',
+ '<p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow">Header</a> and other text</p>',
},
{
markdown: `
@@ -1366,11 +1366,11 @@ body {
}
</style>
`,
- expectedHtml: '<p></p>',
+ expectedHtml: '<p dir="auto"></p>',
},
{
markdown: '<div style="transform">div</div>',
- expectedHtml: '<div><p>div</p></div>',
+ expectedHtml: '<div><p dir="auto">div</p></div>',
},
])(
'removes unknown tags and unsupported attributes from HTML output',
@@ -1421,6 +1421,7 @@ body {
};
};
+ // NOTE: unicode \u001 and \u003 cannot be used in test names because they cause test report XML parsing errors
it.each`
desc | urlInput | urlOutput
${'protocol-based JS injection: simple, no spaces'} | ${protocolBasedInjectionSimpleNoSpaces} | ${null}
@@ -1439,7 +1440,7 @@ body {
${'protocol-based JS injection: preceding colon'} | ${":javascript:alert('XSS');"} | ${":javascript:alert('XSS');"}
${'protocol-based JS injection: null char'} | ${"java\0script:alert('XSS')"} | ${"java�script:alert('XSS')"}
${'protocol-based JS injection: invalid URL char'} | ${"java\\script:alert('XSS')"} | ${"java\\script:alert('XSS')"}
- `('sanitize $desc:\n\tURL "$urlInput" becomes "$urlOutput"', ({ urlInput, urlOutput }) => {
+ `('sanitize $desc becomes "$urlOutput"', ({ urlInput, urlOutput }) => {
const exampleFactories = [docWithImageFactory, docWithLinkFactory];
exampleFactories.forEach(async (exampleFactory) => {
diff --git a/spec/frontend/content_editor/services/code_suggestion_utils_spec.js b/spec/frontend/content_editor/services/code_suggestion_utils_spec.js
new file mode 100644
index 00000000000..f26d33adf4c
--- /dev/null
+++ b/spec/frontend/content_editor/services/code_suggestion_utils_spec.js
@@ -0,0 +1,53 @@
+import {
+ lineOffsetToLangParams,
+ langParamsToLineOffset,
+ toAbsoluteLineOffset,
+ getLines,
+ appendNewlines,
+} from '~/content_editor/services/code_suggestion_utils';
+
+describe('content_editor/services/code_suggestion_utils', () => {
+ describe('lineOffsetToLangParams', () => {
+ it.each`
+ lineOffset | expected
+ ${[0, 0]} | ${'-0+0'}
+ ${[0, 2]} | ${'-0+2'}
+ ${[1, 1]} | ${'+1+1'}
+ ${[-1, 1]} | ${'-1+1'}
+ `('converts line offset $lineOffset to lang params $expected', ({ lineOffset, expected }) => {
+ expect(lineOffsetToLangParams(lineOffset)).toBe(expected);
+ });
+ });
+
+ describe('langParamsToLineOffset', () => {
+ it.each`
+ langParams | expected
+ ${'-0+0'} | ${[-0, 0]}
+ ${'-0+2'} | ${[-0, 2]}
+ ${'+1+1'} | ${[1, 1]}
+ ${'-1+1'} | ${[-1, 1]}
+ `('converts lang params $langParams to line offset $expected', ({ langParams, expected }) => {
+ expect(langParamsToLineOffset(langParams)).toEqual(expected);
+ });
+ });
+
+ describe('toAbsoluteLineOffset', () => {
+ it('adds line number to line offset', () => {
+ expect(toAbsoluteLineOffset([-2, 3], 72)).toEqual([70, 75]);
+ });
+ });
+
+ describe('getLines', () => {
+ it('returns lines from allLines', () => {
+ const allLines = ['foo', 'bar', 'baz', 'qux', 'quux'];
+ expect(getLines([2, 4], allLines)).toEqual(['bar', 'baz', 'qux']);
+ });
+ });
+
+ describe('appendNewlines', () => {
+ it('appends zero-width space to each line', () => {
+ const lines = ['foo', 'bar', 'baz'];
+ expect(appendNewlines(lines)).toEqual(['foo\u200b\n', 'bar\u200b\n', 'baz\u200b']);
+ });
+ });
+});
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 b9a9c3ccd17..b68d57971b9 100644
--- a/spec/frontend/content_editor/services/create_content_editor_spec.js
+++ b/spec/frontend/content_editor/services/create_content_editor_spec.js
@@ -46,14 +46,6 @@ describe('content_editor/services/create_content_editor', () => {
});
});
- it('sets gl-shadow-none! class selector to the tiptapEditor instance', () => {
- expect(editor.tiptapEditor.options.editorProps).toMatchObject({
- attributes: {
- class: 'gl-shadow-none!',
- },
- });
- });
-
it('allows providing external content editor extensions', () => {
const labelReference = 'this is a ~group::editor';
const { tiptapExtension, serializer } = createTestContentEditorExtension();
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
index a9960918e62..1f7b56ef762 100644
--- a/spec/frontend/content_editor/services/gl_api_markdown_deserializer_spec.js
+++ b/spec/frontend/content_editor/services/gl_api_markdown_deserializer_spec.js
@@ -1,6 +1,5 @@
import createMarkdownDeserializer from '~/content_editor/services/gl_api_markdown_deserializer';
import Bold from '~/content_editor/extensions/bold';
-import Comment from '~/content_editor/extensions/comment';
import { createTestEditor, createDocBuilder } from '../test_utils';
describe('content_editor/services/gl_api_markdown_deserializer', () => {
@@ -8,21 +7,19 @@ describe('content_editor/services/gl_api_markdown_deserializer', () => {
let doc;
let p;
let bold;
- let comment;
let tiptapEditor;
beforeEach(() => {
tiptapEditor = createTestEditor({
- extensions: [Bold, Comment],
+ extensions: [Bold],
});
({
- builders: { doc, p, bold, comment },
+ builders: { doc, p, bold },
} = createDocBuilder({
tiptapEditor,
names: {
bold: { markType: Bold.name },
- comment: { nodeType: Comment.name },
},
}));
renderMarkdown = jest.fn();
@@ -35,16 +32,16 @@ describe('content_editor/services/gl_api_markdown_deserializer', () => {
beforeEach(async () => {
const deserializer = createMarkdownDeserializer({ render: renderMarkdown });
- renderMarkdown.mockResolvedValueOnce(`<p><strong>${text}</strong></p><!-- some comment -->`);
+ renderMarkdown.mockResolvedValueOnce(`<p><strong>${text}</strong></p>`);
result = await deserializer.deserialize({
- markdown: '**Bold text**\n<!-- some comment -->',
+ markdown: '**Bold text**',
schema: tiptapEditor.schema,
});
});
it('transforms HTML returned by render function to a ProseMirror document', () => {
- const document = doc(p(bold(text)), comment(' some comment '));
+ const document = doc(p(bold(text)));
expect(result.document.toJSON()).toEqual(document.toJSON());
});
diff --git a/spec/frontend/content_editor/services/markdown_serializer_spec.js b/spec/frontend/content_editor/services/markdown_serializer_spec.js
index 4521822042c..7be8114902a 100644
--- a/spec/frontend/content_editor/services/markdown_serializer_spec.js
+++ b/spec/frontend/content_editor/services/markdown_serializer_spec.js
@@ -3,7 +3,6 @@ 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 Comment from '~/content_editor/extensions/comment';
import DescriptionItem from '~/content_editor/extensions/description_item';
import DescriptionList from '~/content_editor/extensions/description_list';
import Details from '~/content_editor/extensions/details';
@@ -56,7 +55,6 @@ const {
bulletList,
code,
codeBlock,
- comment,
details,
detailsContent,
div,
@@ -99,7 +97,6 @@ const {
bulletList: { nodeType: BulletList.name },
code: { markType: Code.name },
codeBlock: { nodeType: CodeBlockHighlight.name },
- comment: { nodeType: Comment.name },
details: { nodeType: Details.name },
detailsContent: { nodeType: DetailsContent.name },
descriptionItem: { nodeType: DescriptionItem.name },
@@ -187,30 +184,6 @@ describe('markdownSerializer', () => {
);
});
- it('correctly serializes a comment node', () => {
- expect(serialize(paragraph('hi'), comment(' this is a\ncomment '))).toBe(
- `
-hi
-
-<!-- this is a
-comment -->
- `.trim(),
- );
- });
-
- it('correctly renders a comment with markdown in it without adding any slashes', () => {
- expect(serialize(paragraph('hi'), comment('this is a list\n- a\n- b\n- c'))).toBe(
- `
-hi
-
-<!--this is a list
-- a
-- b
-- c-->
- `.trim(),
- );
- });
-
it('escapes < and > in a paragraph', () => {
expect(
serialize(paragraph(text("some prose: <this> and </this> looks like code, but isn't"))),
diff --git a/spec/frontend/content_editor/test_utils.js b/spec/frontend/content_editor/test_utils.js
index 2184a829cf0..f1c9fd47eb7 100644
--- a/spec/frontend/content_editor/test_utils.js
+++ b/spec/frontend/content_editor/test_utils.js
@@ -1,7 +1,4 @@
import { Node } from '@tiptap/core';
-import { Document } from '@tiptap/extension-document';
-import { Paragraph } from '@tiptap/extension-paragraph';
-import { Text } from '@tiptap/extension-text';
import { Editor } from '@tiptap/vue-2';
import { builders, eq } from 'prosemirror-test-builder';
import { nextTick } from 'vue';
@@ -12,12 +9,12 @@ 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 Comment from '~/content_editor/extensions/comment';
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 Diagram from '~/content_editor/extensions/diagram';
+import Document from '~/content_editor/extensions/document';
import DrawioDiagram from '~/content_editor/extensions/drawio_diagram';
import Emoji from '~/content_editor/extensions/emoji';
import FootnoteDefinition from '~/content_editor/extensions/footnote_definition';
@@ -36,6 +33,7 @@ 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 Paragraph from '~/content_editor/extensions/paragraph';
import ReferenceDefinition from '~/content_editor/extensions/reference_definition';
import Reference from '~/content_editor/extensions/reference';
import ReferenceLabel from '~/content_editor/extensions/reference_label';
@@ -47,10 +45,13 @@ import TableRow from '~/content_editor/extensions/table_row';
import TableOfContents from '~/content_editor/extensions/table_of_contents';
import TaskItem from '~/content_editor/extensions/task_item';
import TaskList from '~/content_editor/extensions/task_list';
+import Text from '~/content_editor/extensions/text';
import Video from '~/content_editor/extensions/video';
import HTMLMarks from '~/content_editor/extensions/html_marks';
import HTMLNodes from '~/content_editor/extensions/html_nodes';
+export const DEFAULT_WAIT_TIMEOUT = 100;
+
export const createDocBuilder = ({ tiptapEditor, names = {} }) => {
const docBuilders = builders(tiptapEditor.schema, {
p: { nodeType: 'paragraph' },
@@ -239,6 +240,16 @@ export const waitUntilTransaction = ({ tiptapEditor, number, action }) => {
});
};
+export const sleep = (time = DEFAULT_WAIT_TIMEOUT) => {
+ jest.useRealTimers();
+ const promise = new Promise((resolve) => {
+ setTimeout(resolve, time);
+ });
+ jest.useFakeTimers();
+
+ return promise;
+};
+
export const expectDocumentAfterTransaction = ({ tiptapEditor, number, expectedDoc, action }) => {
return new Promise((resolve) => {
let counter = 0;
diff --git a/spec/frontend/contribution_events/components/contribution_event/contribution_event_approved_spec.js b/spec/frontend/contribution_events/components/contribution_event/contribution_event_approved_spec.js
index 6672d3eb18b..5bce0ca3746 100644
--- a/spec/frontend/contribution_events/components/contribution_event/contribution_event_approved_spec.js
+++ b/spec/frontend/contribution_events/components/contribution_event/contribution_event_approved_spec.js
@@ -1,21 +1,18 @@
-import events from 'test_fixtures/controller/users/activity.json';
-import { mountExtended } from 'helpers/vue_test_utils_helper';
-import { EVENT_TYPE_APPROVED } from '~/contribution_events/constants';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import ContributionEventApproved from '~/contribution_events/components/contribution_event/contribution_event_approved.vue';
import ContributionEventBase from '~/contribution_events/components/contribution_event/contribution_event_base.vue';
-import TargetLink from '~/contribution_events/components/target_link.vue';
-import ResourceParentLink from '~/contribution_events/components/resource_parent_link.vue';
+import { eventApproved } from '../../utils';
-const eventApproved = events.find((event) => event.action === EVENT_TYPE_APPROVED);
+const defaultPropsData = {
+ event: eventApproved(),
+};
describe('ContributionEventApproved', () => {
let wrapper;
const createComponent = () => {
- wrapper = mountExtended(ContributionEventApproved, {
- propsData: {
- event: eventApproved,
- },
+ wrapper = shallowMountExtended(ContributionEventApproved, {
+ propsData: defaultPropsData,
});
};
@@ -25,23 +22,10 @@ describe('ContributionEventApproved', () => {
it('renders `ContributionEventBase`', () => {
expect(wrapper.findComponent(ContributionEventBase).props()).toEqual({
- event: eventApproved,
+ event: defaultPropsData.event,
iconName: 'approval-solid',
iconClass: 'gl-text-green-500',
+ message: ContributionEventApproved.i18n.message,
});
});
-
- it('renders message', () => {
- expect(wrapper.findByTestId('event-body').text()).toBe(
- `Approved merge request ${eventApproved.target.reference_link_text} in ${eventApproved.resource_parent.full_name}.`,
- );
- });
-
- it('renders target link', () => {
- expect(wrapper.findComponent(TargetLink).props('event')).toEqual(eventApproved);
- });
-
- it('renders resource parent link', () => {
- expect(wrapper.findComponent(ResourceParentLink).props('event')).toEqual(eventApproved);
- });
});
diff --git a/spec/frontend/contribution_events/components/contribution_event/contribution_event_base_spec.js b/spec/frontend/contribution_events/components/contribution_event/contribution_event_base_spec.js
index 8c951e20bed..310966243d1 100644
--- a/spec/frontend/contribution_events/components/contribution_event/contribution_event_base_spec.js
+++ b/spec/frontend/contribution_events/components/contribution_event/contribution_event_base_spec.js
@@ -1,23 +1,27 @@
import { GlAvatarLabeled, GlAvatarLink, GlIcon } from '@gitlab/ui';
-import events from 'test_fixtures/controller/users/activity.json';
-import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
import ContributionEventBase from '~/contribution_events/components/contribution_event/contribution_event_base.vue';
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
-
-const [event] = events;
+import TargetLink from '~/contribution_events/components/target_link.vue';
+import ResourceParentLink from '~/contribution_events/components/resource_parent_link.vue';
+import { eventApproved } from '../../utils';
describe('ContributionEventBase', () => {
let wrapper;
const defaultPropsData = {
- event,
+ event: eventApproved(),
iconName: 'approval-solid',
iconClass: 'gl-text-green-500',
+ message: 'Approved merge request %{targetLink} in %{resourceParentLink}.',
};
- const createComponent = () => {
- wrapper = shallowMountExtended(ContributionEventBase, {
- propsData: defaultPropsData,
+ const createComponent = ({ propsData = {} } = {}) => {
+ wrapper = mountExtended(ContributionEventBase, {
+ propsData: {
+ ...defaultPropsData,
+ ...propsData,
+ },
scopedSlots: {
default: '<div data-testid="default-slot"></div>',
'additional-info': '<div data-testid="additional-info-slot"></div>',
@@ -25,38 +29,75 @@ describe('ContributionEventBase', () => {
});
};
- beforeEach(() => {
+ it('renders avatar', () => {
createComponent();
- });
- it('renders avatar', () => {
const avatarLink = wrapper.findComponent(GlAvatarLink);
+ const avatarLabeled = avatarLink.findComponent(GlAvatarLabeled);
- expect(avatarLink.attributes('href')).toBe(event.author.web_url);
- expect(avatarLink.findComponent(GlAvatarLabeled).attributes()).toMatchObject({
- label: event.author.name,
- sublabel: `@${event.author.username}`,
- src: event.author.avatar_url,
+ expect(avatarLink.attributes('href')).toBe(defaultPropsData.event.author.web_url);
+ expect(avatarLabeled.attributes()).toMatchObject({
+ src: defaultPropsData.event.author.avatar_url,
size: '32',
});
+ expect(avatarLabeled.props()).toMatchObject({
+ label: defaultPropsData.event.author.name,
+ subLabel: `@${defaultPropsData.event.author.username}`,
+ });
});
it('renders time ago tooltip', () => {
- expect(wrapper.findComponent(TimeAgoTooltip).props('time')).toBe(event.created_at);
+ createComponent();
+
+ expect(wrapper.findComponent(TimeAgoTooltip).props('time')).toBe(
+ defaultPropsData.event.created_at,
+ );
});
it('renders icon', () => {
+ createComponent();
+
const icon = wrapper.findComponent(GlIcon);
expect(icon.props('name')).toBe(defaultPropsData.iconName);
expect(icon.classes()).toContain(defaultPropsData.iconClass);
});
- it('renders `default` slot', () => {
- expect(wrapper.findByTestId('default-slot').exists()).toBe(true);
+ describe('when `message` prop is passed', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders message', () => {
+ expect(wrapper.findByTestId('event-body').text()).toBe(
+ `Approved merge request ${defaultPropsData.event.target.reference_link_text} in ${defaultPropsData.event.resource_parent.full_name}.`,
+ );
+ });
+
+ it('renders target link', () => {
+ expect(wrapper.findComponent(TargetLink).props('event')).toEqual(defaultPropsData.event);
+ });
+
+ it('renders resource parent link', () => {
+ expect(wrapper.findComponent(ResourceParentLink).props('event')).toEqual(
+ defaultPropsData.event,
+ );
+ });
+ });
+
+ describe('when `message` prop is not passed', () => {
+ beforeEach(() => {
+ createComponent({ propsData: { message: '' } });
+ });
+
+ it('renders `default` slot', () => {
+ expect(wrapper.findByTestId('default-slot').exists()).toBe(true);
+ });
});
it('renders `additional-info` slot', () => {
+ createComponent();
+
expect(wrapper.findByTestId('additional-info-slot').exists()).toBe(true);
});
});
diff --git a/spec/frontend/contribution_events/components/contribution_event/contribution_event_expired_spec.js b/spec/frontend/contribution_events/components/contribution_event/contribution_event_expired_spec.js
new file mode 100644
index 00000000000..c58fca1ad12
--- /dev/null
+++ b/spec/frontend/contribution_events/components/contribution_event/contribution_event_expired_spec.js
@@ -0,0 +1,30 @@
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import ContributionEventExpired from '~/contribution_events/components/contribution_event/contribution_event_expired.vue';
+import ContributionEventBase from '~/contribution_events/components/contribution_event/contribution_event_base.vue';
+import { eventExpired } from '../../utils';
+
+const defaultPropsData = {
+ event: eventExpired(),
+};
+
+describe('ContributionEventExpired', () => {
+ let wrapper;
+
+ const createComponent = () => {
+ wrapper = shallowMountExtended(ContributionEventExpired, {
+ propsData: defaultPropsData,
+ });
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders `ContributionEventBase`', () => {
+ expect(wrapper.findComponent(ContributionEventBase).props()).toMatchObject({
+ event: defaultPropsData.event,
+ iconName: 'expire',
+ message: ContributionEventExpired.i18n.message,
+ });
+ });
+});
diff --git a/spec/frontend/contribution_events/components/contribution_event/contribution_event_joined_spec.js b/spec/frontend/contribution_events/components/contribution_event/contribution_event_joined_spec.js
new file mode 100644
index 00000000000..56688e2ef27
--- /dev/null
+++ b/spec/frontend/contribution_events/components/contribution_event/contribution_event_joined_spec.js
@@ -0,0 +1,30 @@
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import ContributionEventJoined from '~/contribution_events/components/contribution_event/contribution_event_joined.vue';
+import ContributionEventBase from '~/contribution_events/components/contribution_event/contribution_event_base.vue';
+import { eventJoined } from '../../utils';
+
+const defaultPropsData = {
+ event: eventJoined(),
+};
+
+describe('ContributionEventJoined', () => {
+ let wrapper;
+
+ const createComponent = () => {
+ wrapper = shallowMountExtended(ContributionEventJoined, {
+ propsData: defaultPropsData,
+ });
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders `ContributionEventBase`', () => {
+ expect(wrapper.findComponent(ContributionEventBase).props()).toMatchObject({
+ event: defaultPropsData.event,
+ iconName: 'users',
+ message: ContributionEventJoined.i18n.message,
+ });
+ });
+});
diff --git a/spec/frontend/contribution_events/components/contribution_event/contribution_event_left_spec.js b/spec/frontend/contribution_events/components/contribution_event/contribution_event_left_spec.js
new file mode 100644
index 00000000000..58cb8714d03
--- /dev/null
+++ b/spec/frontend/contribution_events/components/contribution_event/contribution_event_left_spec.js
@@ -0,0 +1,30 @@
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import ContributionEventLeft from '~/contribution_events/components/contribution_event/contribution_event_left.vue';
+import ContributionEventBase from '~/contribution_events/components/contribution_event/contribution_event_base.vue';
+import { eventLeft } from '../../utils';
+
+const defaultPropsData = {
+ event: eventLeft(),
+};
+
+describe('ContributionEventLeft', () => {
+ let wrapper;
+
+ const createComponent = () => {
+ wrapper = shallowMountExtended(ContributionEventLeft, {
+ propsData: defaultPropsData,
+ });
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders `ContributionEventBase`', () => {
+ expect(wrapper.findComponent(ContributionEventBase).props()).toMatchObject({
+ event: defaultPropsData.event,
+ iconName: 'leave',
+ message: ContributionEventLeft.i18n.message,
+ });
+ });
+});
diff --git a/spec/frontend/contribution_events/components/contribution_event/contribution_event_merged_spec.js b/spec/frontend/contribution_events/components/contribution_event/contribution_event_merged_spec.js
new file mode 100644
index 00000000000..88494c24ddf
--- /dev/null
+++ b/spec/frontend/contribution_events/components/contribution_event/contribution_event_merged_spec.js
@@ -0,0 +1,31 @@
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import ContributionEventMerged from '~/contribution_events/components/contribution_event/contribution_event_merged.vue';
+import ContributionEventBase from '~/contribution_events/components/contribution_event/contribution_event_base.vue';
+import { eventMerged } from '../../utils';
+
+const defaultPropsData = {
+ event: eventMerged(),
+};
+
+describe('ContributionEventMerged', () => {
+ let wrapper;
+
+ const createComponent = () => {
+ wrapper = shallowMountExtended(ContributionEventMerged, {
+ propsData: defaultPropsData,
+ });
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders `ContributionEventBase`', () => {
+ expect(wrapper.findComponent(ContributionEventBase).props()).toEqual({
+ event: defaultPropsData.event,
+ iconName: 'git-merge',
+ iconClass: 'gl-text-blue-600',
+ message: ContributionEventMerged.i18n.message,
+ });
+ });
+});
diff --git a/spec/frontend/contribution_events/components/contribution_event/contribution_event_private_spec.js b/spec/frontend/contribution_events/components/contribution_event/contribution_event_private_spec.js
new file mode 100644
index 00000000000..42855134a09
--- /dev/null
+++ b/spec/frontend/contribution_events/components/contribution_event/contribution_event_private_spec.js
@@ -0,0 +1,33 @@
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import ContributionEventPrivate from '~/contribution_events/components/contribution_event/contribution_event_private.vue';
+import ContributionEventBase from '~/contribution_events/components/contribution_event/contribution_event_base.vue';
+import { eventPrivate } from '../../utils';
+
+const defaultPropsData = {
+ event: eventPrivate(),
+};
+
+describe('ContributionEventPrivate', () => {
+ let wrapper;
+
+ const createComponent = () => {
+ wrapper = mountExtended(ContributionEventPrivate, {
+ propsData: defaultPropsData,
+ });
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders `ContributionEventBase`', () => {
+ expect(wrapper.findComponent(ContributionEventBase).props()).toMatchObject({
+ event: defaultPropsData.event,
+ iconName: 'eye-slash',
+ });
+ });
+
+ it('renders message', () => {
+ expect(wrapper.findByTestId('event-body').text()).toBe(ContributionEventPrivate.i18n.message);
+ });
+});
diff --git a/spec/frontend/contribution_events/components/contribution_event/contribution_event_pushed_spec.js b/spec/frontend/contribution_events/components/contribution_event/contribution_event_pushed_spec.js
new file mode 100644
index 00000000000..43f201040e3
--- /dev/null
+++ b/spec/frontend/contribution_events/components/contribution_event/contribution_event_pushed_spec.js
@@ -0,0 +1,141 @@
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import ContributionEventPushed from '~/contribution_events/components/contribution_event/contribution_event_pushed.vue';
+import ContributionEventBase from '~/contribution_events/components/contribution_event/contribution_event_base.vue';
+import ResourceParentLink from '~/contribution_events/components/resource_parent_link.vue';
+import {
+ eventPushedNewBranch,
+ eventPushedNewTag,
+ eventPushedBranch,
+ eventPushedTag,
+ eventPushedRemovedBranch,
+ eventPushedRemovedTag,
+ eventBulkPushedBranch,
+} from '../../utils';
+
+describe('ContributionEventPushed', () => {
+ let wrapper;
+
+ const createComponent = ({ propsData }) => {
+ wrapper = mountExtended(ContributionEventPushed, {
+ propsData,
+ });
+ };
+
+ describe.each`
+ event | expectedMessage | expectedIcon
+ ${eventPushedNewBranch()} | ${'Pushed a new branch'} | ${'commit'}
+ ${eventPushedNewTag()} | ${'Pushed a new tag'} | ${'commit'}
+ ${eventPushedBranch()} | ${'Pushed to branch'} | ${'commit'}
+ ${eventPushedTag()} | ${'Pushed to tag'} | ${'commit'}
+ ${eventPushedRemovedBranch()} | ${'Deleted branch'} | ${'remove'}
+ ${eventPushedRemovedTag()} | ${'Deleted tag'} | ${'remove'}
+ `('when event is $event', ({ event, expectedMessage, expectedIcon }) => {
+ beforeEach(() => {
+ createComponent({ propsData: { event } });
+ });
+
+ it('renders `ContributionEventBase` with correct props', () => {
+ expect(wrapper.findComponent(ContributionEventBase).props()).toMatchObject({
+ event,
+ iconName: expectedIcon,
+ });
+ });
+
+ it('renders message', () => {
+ expect(wrapper.findByTestId('event-body').text()).toContain(expectedMessage);
+ });
+
+ it('renders resource parent link', () => {
+ expect(wrapper.findComponent(ResourceParentLink).props('event')).toEqual(event);
+ });
+ });
+
+ describe('when ref has a path', () => {
+ const event = eventPushedNewBranch();
+ const path = '/foo';
+
+ beforeEach(() => {
+ createComponent({
+ propsData: {
+ event: {
+ ...event,
+ ref: {
+ ...event.ref,
+ path,
+ },
+ },
+ },
+ });
+ });
+
+ it('renders ref link', () => {
+ expect(wrapper.findByRole('link', { name: event.ref.name }).attributes('href')).toBe(path);
+ });
+ });
+
+ describe('when ref does not have a path', () => {
+ const event = eventPushedRemovedBranch();
+
+ beforeEach(() => {
+ createComponent({
+ propsData: {
+ event,
+ },
+ });
+ });
+
+ it('renders ref name without a link', () => {
+ expect(wrapper.findByRole('link', { name: event.ref.name }).exists()).toBe(false);
+ expect(wrapper.findByText(event.ref.name).exists()).toBe(true);
+ });
+ });
+
+ it('renders renders a link to the commit', () => {
+ const event = eventPushedNewBranch();
+ createComponent({
+ propsData: {
+ event,
+ },
+ });
+
+ expect(
+ wrapper.findByRole('link', { name: event.commit.truncated_sha }).attributes('href'),
+ ).toBe(event.commit.path);
+ });
+
+ it('renders commit title', () => {
+ const event = eventPushedNewBranch();
+ createComponent({
+ propsData: {
+ event,
+ },
+ });
+
+ expect(wrapper.findByText(event.commit.title).exists()).toBe(true);
+ });
+
+ describe('when multiple commits are pushed', () => {
+ const event = eventBulkPushedBranch();
+ beforeEach(() => {
+ createComponent({
+ propsData: {
+ event,
+ },
+ });
+ });
+
+ it('renders message', () => {
+ expect(wrapper.text()).toContain('…and 4 more commits.');
+ });
+
+ it('renders compare link', () => {
+ expect(
+ wrapper
+ .findByRole('link', {
+ name: `Compare ${event.commit.from_truncated_sha}…${event.commit.to_truncated_sha}`,
+ })
+ .attributes('href'),
+ ).toBe(event.commit.compare_path);
+ });
+ });
+});
diff --git a/spec/frontend/contribution_events/components/contribution_events_spec.js b/spec/frontend/contribution_events/components/contribution_events_spec.js
index 4bc354c393f..31e1bc3e569 100644
--- a/spec/frontend/contribution_events/components/contribution_events_spec.js
+++ b/spec/frontend/contribution_events/components/contribution_events_spec.js
@@ -1,10 +1,21 @@
-import events from 'test_fixtures/controller/users/activity.json';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
-import { EVENT_TYPE_APPROVED } from '~/contribution_events/constants';
import ContributionEvents from '~/contribution_events/components/contribution_events.vue';
import ContributionEventApproved from '~/contribution_events/components/contribution_event/contribution_event_approved.vue';
-
-const eventApproved = events.find((event) => event.action === EVENT_TYPE_APPROVED);
+import ContributionEventExpired from '~/contribution_events/components/contribution_event/contribution_event_expired.vue';
+import ContributionEventJoined from '~/contribution_events/components/contribution_event/contribution_event_joined.vue';
+import ContributionEventLeft from '~/contribution_events/components/contribution_event/contribution_event_left.vue';
+import ContributionEventPushed from '~/contribution_events/components/contribution_event/contribution_event_pushed.vue';
+import ContributionEventPrivate from '~/contribution_events/components/contribution_event/contribution_event_private.vue';
+import ContributionEventMerged from '~/contribution_events/components/contribution_event/contribution_event_merged.vue';
+import {
+ eventApproved,
+ eventExpired,
+ eventJoined,
+ eventLeft,
+ eventPushedBranch,
+ eventPrivate,
+ eventMerged,
+} from '../utils';
describe('ContributionEvents', () => {
let wrapper;
@@ -12,14 +23,28 @@ describe('ContributionEvents', () => {
const createComponent = () => {
wrapper = shallowMountExtended(ContributionEvents, {
propsData: {
- events,
+ events: [
+ eventApproved(),
+ eventExpired(),
+ eventJoined(),
+ eventLeft(),
+ eventPushedBranch(),
+ eventPrivate(),
+ eventMerged(),
+ ],
},
});
};
it.each`
expectedComponent | expectedEvent
- ${ContributionEventApproved} | ${eventApproved}
+ ${ContributionEventApproved} | ${eventApproved()}
+ ${ContributionEventExpired} | ${eventExpired()}
+ ${ContributionEventJoined} | ${eventJoined()}
+ ${ContributionEventLeft} | ${eventLeft()}
+ ${ContributionEventPushed} | ${eventPushedBranch()}
+ ${ContributionEventPrivate} | ${eventPrivate()}
+ ${ContributionEventMerged} | ${eventMerged()}
`(
'renders `$expectedComponent.name` component and passes expected event',
({ expectedComponent, expectedEvent }) => {
diff --git a/spec/frontend/contribution_events/components/resource_parent_link_spec.js b/spec/frontend/contribution_events/components/resource_parent_link_spec.js
index 8d586db2a30..815a1b751cf 100644
--- a/spec/frontend/contribution_events/components/resource_parent_link_spec.js
+++ b/spec/frontend/contribution_events/components/resource_parent_link_spec.js
@@ -1,30 +1,52 @@
import { GlLink } from '@gitlab/ui';
-import events from 'test_fixtures/controller/users/activity.json';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
-import { EVENT_TYPE_APPROVED } from '~/contribution_events/constants';
import ResourceParentLink from '~/contribution_events/components/resource_parent_link.vue';
-
-const eventApproved = events.find((event) => event.action === EVENT_TYPE_APPROVED);
+import { EVENT_TYPE_PRIVATE } from '~/contribution_events/constants';
+import { eventApproved } from '../utils';
describe('ResourceParentLink', () => {
let wrapper;
- const createComponent = () => {
+ const defaultPropsData = {
+ event: eventApproved(),
+ };
+
+ const createComponent = ({ propsData = {} } = {}) => {
wrapper = shallowMountExtended(ResourceParentLink, {
propsData: {
- event: eventApproved,
+ ...defaultPropsData,
+ ...propsData,
},
});
};
- beforeEach(() => {
- createComponent();
+ describe('when resource parent is defined', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders link', () => {
+ const link = wrapper.findComponent(GlLink);
+ const { web_url, full_name } = defaultPropsData.event.resource_parent;
+
+ expect(link.attributes('href')).toBe(web_url);
+ expect(link.text()).toBe(full_name);
+ });
});
- it('renders link', () => {
- const link = wrapper.findComponent(GlLink);
+ describe('when resource parent is not defined', () => {
+ beforeEach(() => {
+ createComponent({
+ propsData: {
+ event: {
+ type: EVENT_TYPE_PRIVATE,
+ },
+ },
+ });
+ });
- expect(link.attributes('href')).toBe(eventApproved.resource_parent.web_url);
- expect(link.text()).toBe(eventApproved.resource_parent.full_name);
+ it('renders nothing', () => {
+ expect(wrapper.html()).toBe('');
+ });
});
});
diff --git a/spec/frontend/contribution_events/components/target_link_spec.js b/spec/frontend/contribution_events/components/target_link_spec.js
index 7944375487b..b71d6eff432 100644
--- a/spec/frontend/contribution_events/components/target_link_spec.js
+++ b/spec/frontend/contribution_events/components/target_link_spec.js
@@ -1,33 +1,48 @@
import { GlLink } from '@gitlab/ui';
-import events from 'test_fixtures/controller/users/activity.json';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
-import { EVENT_TYPE_APPROVED } from '~/contribution_events/constants';
import TargetLink from '~/contribution_events/components/target_link.vue';
-
-const eventApproved = events.find((event) => event.action === EVENT_TYPE_APPROVED);
+import { eventApproved, eventJoined } from '../utils';
describe('TargetLink', () => {
let wrapper;
- const createComponent = () => {
+ const defaultPropsData = {
+ event: eventApproved(),
+ };
+
+ const createComponent = ({ propsData = {} } = {}) => {
wrapper = shallowMountExtended(TargetLink, {
propsData: {
- event: eventApproved,
+ ...defaultPropsData,
+ ...propsData,
},
});
};
- beforeEach(() => {
- createComponent();
+ describe('when target is defined', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders link', () => {
+ const link = wrapper.findComponent(GlLink);
+ const { web_url: webUrl, title, reference_link_text } = defaultPropsData.event.target;
+
+ expect(link.attributes()).toMatchObject({
+ href: webUrl,
+ title,
+ });
+ expect(link.text()).toBe(reference_link_text);
+ });
});
- it('renders link', () => {
- const link = wrapper.findComponent(GlLink);
+ describe('when target is not defined', () => {
+ beforeEach(() => {
+ createComponent({ propsData: { event: eventJoined() } });
+ });
- expect(link.attributes()).toMatchObject({
- href: eventApproved.target.web_url,
- title: eventApproved.target.title,
+ it('renders nothing', () => {
+ expect(wrapper.html()).toBe('');
});
- expect(link.text()).toBe(eventApproved.target.reference_link_text);
});
});
diff --git a/spec/frontend/contribution_events/utils.js b/spec/frontend/contribution_events/utils.js
new file mode 100644
index 00000000000..6e97455582d
--- /dev/null
+++ b/spec/frontend/contribution_events/utils.js
@@ -0,0 +1,52 @@
+import events from 'test_fixtures/controller/users/activity.json';
+import {
+ EVENT_TYPE_APPROVED,
+ EVENT_TYPE_EXPIRED,
+ EVENT_TYPE_JOINED,
+ EVENT_TYPE_LEFT,
+ EVENT_TYPE_PUSHED,
+ EVENT_TYPE_PRIVATE,
+ EVENT_TYPE_MERGED,
+ PUSH_EVENT_REF_TYPE_BRANCH,
+ PUSH_EVENT_REF_TYPE_TAG,
+} from '~/contribution_events/constants';
+
+const findEventByAction = (action) => events.find((event) => event.action === action);
+
+export const eventApproved = () => findEventByAction(EVENT_TYPE_APPROVED);
+
+export const eventExpired = () => findEventByAction(EVENT_TYPE_EXPIRED);
+
+export const eventJoined = () => findEventByAction(EVENT_TYPE_JOINED);
+
+export const eventLeft = () => findEventByAction(EVENT_TYPE_LEFT);
+
+export const eventMerged = () => findEventByAction(EVENT_TYPE_MERGED);
+
+const findPushEvent = ({
+ isNew = false,
+ isRemoved = false,
+ refType = PUSH_EVENT_REF_TYPE_BRANCH,
+ commitCount = 1,
+} = {}) => () =>
+ events.find(
+ ({ action, ref, commit }) =>
+ action === EVENT_TYPE_PUSHED &&
+ ref.is_new === isNew &&
+ ref.is_removed === isRemoved &&
+ ref.type === refType &&
+ commit.count === commitCount,
+ );
+
+export const eventPushedNewBranch = findPushEvent({ isNew: true });
+export const eventPushedNewTag = findPushEvent({ isNew: true, refType: PUSH_EVENT_REF_TYPE_TAG });
+export const eventPushedBranch = findPushEvent();
+export const eventPushedTag = findPushEvent({ refType: PUSH_EVENT_REF_TYPE_TAG });
+export const eventPushedRemovedBranch = findPushEvent({ isRemoved: true });
+export const eventPushedRemovedTag = findPushEvent({
+ isRemoved: true,
+ refType: PUSH_EVENT_REF_TYPE_TAG,
+});
+export const eventBulkPushedBranch = findPushEvent({ commitCount: 5 });
+
+export const eventPrivate = () => ({ ...events[0], action: EVENT_TYPE_PRIVATE });
diff --git a/spec/frontend/deploy_keys/components/app_spec.js b/spec/frontend/deploy_keys/components/app_spec.js
index 3dfb828b449..de4112134ce 100644
--- a/spec/frontend/deploy_keys/components/app_spec.js
+++ b/spec/frontend/deploy_keys/components/app_spec.js
@@ -6,6 +6,7 @@ import waitForPromises from 'helpers/wait_for_promises';
import { TEST_HOST } from 'spec/test_constants';
import deployKeysApp from '~/deploy_keys/components/app.vue';
import ConfirmModal from '~/deploy_keys/components/confirm_modal.vue';
+import NavigationTabs from '~/vue_shared/components/navigation_tabs.vue';
import eventHub from '~/deploy_keys/eventhub';
import axios from '~/lib/utils/axios_utils';
import { HTTP_STATUS_OK } from '~/lib/utils/http_status';
@@ -39,6 +40,7 @@ describe('Deploy keys app component', () => {
const findLoadingIcon = () => wrapper.find('.gl-spinner');
const findKeyPanels = () => wrapper.findAll('.deploy-keys .gl-tabs-nav li');
const findModal = () => wrapper.findComponent(ConfirmModal);
+ const findNavigationTabs = () => wrapper.findComponent(NavigationTabs);
it('renders loading icon while waiting for request', async () => {
mock.onGet(TEST_ENDPOINT).reply(() => new Promise());
@@ -74,55 +76,61 @@ describe('Deploy keys app component', () => {
});
});
- it('re-fetches deploy keys when enabling a key', async () => {
- const key = data.public_keys[0];
+ it('hasKeys returns true when there are keys', async () => {
await mountComponent();
- jest.spyOn(wrapper.vm.service, 'getKeys').mockImplementation(() => {});
- jest.spyOn(wrapper.vm.service, 'enableKey').mockImplementation(() => Promise.resolve());
- eventHub.$emit('enable.key', key);
-
- await nextTick();
- expect(wrapper.vm.service.enableKey).toHaveBeenCalledWith(key.id);
- expect(wrapper.vm.service.getKeys).toHaveBeenCalled();
+ expect(findNavigationTabs().exists()).toBe(true);
+ expect(findLoadingIcon().exists()).toBe(false);
});
- it('re-fetches deploy keys when disabling a key', async () => {
+ describe('enabling and disabling keys', () => {
const key = data.public_keys[0];
- await mountComponent();
- jest.spyOn(wrapper.vm.service, 'getKeys').mockImplementation(() => {});
- jest.spyOn(wrapper.vm.service, 'disableKey').mockImplementation(() => Promise.resolve());
+ let getMethodMock;
+ let putMethodMock;
- eventHub.$emit('disable.key', key, () => {});
+ const removeKey = async (keyEvent) => {
+ eventHub.$emit(keyEvent, key, () => {});
- await nextTick();
- expect(findModal().props('visible')).toBe(true);
- findModal().vm.$emit('remove');
+ await nextTick();
+ expect(findModal().props('visible')).toBe(true);
+ findModal().vm.$emit('remove');
+ };
- await nextTick();
- expect(wrapper.vm.service.disableKey).toHaveBeenCalledWith(key.id);
- expect(wrapper.vm.service.getKeys).toHaveBeenCalled();
- });
+ beforeEach(() => {
+ getMethodMock = jest.spyOn(axios, 'get');
+ putMethodMock = jest.spyOn(axios, 'put');
+ });
- it('calls disableKey when removing a key', async () => {
- const key = data.public_keys[0];
- await mountComponent();
- jest.spyOn(wrapper.vm.service, 'getKeys').mockImplementation(() => {});
- jest.spyOn(wrapper.vm.service, 'disableKey').mockImplementation(() => Promise.resolve());
+ afterEach(() => {
+ getMethodMock.mockClear();
+ putMethodMock.mockClear();
+ });
- eventHub.$emit('remove.key', key, () => {});
+ it('re-fetches deploy keys when enabling a key', async () => {
+ await mountComponent();
- await nextTick();
- expect(findModal().props('visible')).toBe(true);
- findModal().vm.$emit('remove');
+ eventHub.$emit('enable.key', key);
- await nextTick();
- expect(wrapper.vm.service.disableKey).toHaveBeenCalledWith(key.id);
- expect(wrapper.vm.service.getKeys).toHaveBeenCalled();
- });
+ expect(putMethodMock).toHaveBeenCalledWith(`${TEST_ENDPOINT}/${key.id}/enable`);
+ expect(getMethodMock).toHaveBeenCalled();
+ });
- it('hasKeys returns true when there are keys', async () => {
- await mountComponent();
- expect(wrapper.vm.hasKeys).toEqual(3);
+ it('re-fetches deploy keys when disabling a key', async () => {
+ await mountComponent();
+
+ await removeKey('disable.key');
+
+ expect(putMethodMock).toHaveBeenCalledWith(`${TEST_ENDPOINT}/${key.id}/disable`);
+ expect(getMethodMock).toHaveBeenCalled();
+ });
+
+ it('calls disableKey when removing a key', async () => {
+ await mountComponent();
+
+ await removeKey('remove.key');
+
+ expect(putMethodMock).toHaveBeenCalledWith(`${TEST_ENDPOINT}/${key.id}/disable`);
+ expect(getMethodMock).toHaveBeenCalled();
+ });
});
});
diff --git a/spec/frontend/design_management/components/design_description/description_form_spec.js b/spec/frontend/design_management/components/design_description/description_form_spec.js
index 8c01023b1a8..a61cc2af9b6 100644
--- a/spec/frontend/design_management/components/design_description/description_form_spec.js
+++ b/spec/frontend/design_management/components/design_description/description_form_spec.js
@@ -1,18 +1,15 @@
import Vue, { nextTick } from 'vue';
import VueApollo from 'vue-apollo';
-
import { GlAlert } from '@gitlab/ui';
-
import { mountExtended } from 'helpers/vue_test_utils_helper';
import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
-
import DescriptionForm from '~/design_management/components/design_description/description_form.vue';
import MarkdownEditor from '~/vue_shared/components/markdown/markdown_editor.vue';
import updateDesignDescriptionMutation from '~/design_management/graphql/mutations/update_design_description.mutation.graphql';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { renderGFM } from '~/behaviors/markdown/render_gfm';
-
+import { mockTracking } from 'helpers/tracking_helper';
import { designFactory, designUpdateFactory } from '../../mock_data/apollo_mock';
jest.mock('~/behaviors/markdown/render_gfm');
@@ -86,6 +83,8 @@ describe('Design description form', () => {
const findAlert = () => wrapper.findComponent(GlAlert);
describe('user has updateDesign permission', () => {
+ let trackingSpy;
+
const ctrlKey = {
ctrlKey: true,
};
@@ -96,6 +95,8 @@ describe('Design description form', () => {
const errorMessage = 'Could not update description. Please try again.';
beforeEach(() => {
+ trackingSpy = mockTracking(undefined, null, jest.spyOn);
+
createComponent();
});
@@ -139,19 +140,19 @@ describe('Design description form', () => {
mockDesign.id,
)}`,
markdownDocsPath: '/help/user/markdown',
- quickActionsDocsPath: '/help/user/project/quick_actions',
});
});
- it.each`
+ describe.each`
isKeyEvent | assertionName | key | keyData
${true} | ${'Ctrl + Enter keypress'} | ${'ctrl'} | ${ctrlKey}
${true} | ${'Meta + Enter keypress'} | ${'meta'} | ${metaKey}
${false} | ${'Save button click'} | ${''} | ${null}
- `(
- 'hides form and calls mutation when form is submitted via $assertionName',
- async ({ isKeyEvent, keyData }) => {
- const mockDesignUpdateResponseHandler = jest.fn().mockResolvedValue(
+ `('when form is submitted via $assertionName', ({ isKeyEvent, keyData }) => {
+ let mockDesignUpdateResponseHandler;
+
+ beforeEach(async () => {
+ mockDesignUpdateResponseHandler = jest.fn().mockResolvedValue(
designUpdateFactory({
description: mockDescription,
descriptionHtml: `<p data-sourcepos="1:1-1:16" dir="auto">${mockDescription}</p>`,
@@ -171,7 +172,9 @@ describe('Design description form', () => {
}
await nextTick();
+ });
+ it('hides form and calls mutation', async () => {
expect(mockDesignUpdateResponseHandler).toHaveBeenCalledWith({
input: {
description: 'Hello world',
@@ -182,8 +185,16 @@ describe('Design description form', () => {
await waitForPromises();
expect(findMarkdownEditor().exists()).toBe(false);
- },
- );
+ });
+
+ it('tracks submit action', () => {
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'editor_type_used', {
+ context: 'Design',
+ editorType: 'editor_type_plain_text_editor',
+ label: 'editor_tracking',
+ });
+ });
+ });
it('shows error message when mutation fails', async () => {
const failureHandler = jest.fn().mockRejectedValue(new Error(errorMessage));
diff --git a/spec/frontend/design_management/components/design_notes/__snapshots__/design_note_spec.js.snap b/spec/frontend/design_management/components/design_notes/__snapshots__/design_note_spec.js.snap
deleted file mode 100644
index 9bb85ecf569..00000000000
--- a/spec/frontend/design_management/components/design_notes/__snapshots__/design_note_spec.js.snap
+++ /dev/null
@@ -1,86 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Design note component should match the snapshot 1`] = `
-<timelineentryitem-stub
- class="design-note note-form"
- id="note_123"
->
- <glavatarlink-stub
- class="gl-float-left gl-mr-3"
- href="https://gitlab.com/user"
- >
- <glavatar-stub
- alt="avatar"
- entityid="0"
- entityname="foo-bar"
- shape="circle"
- size="32"
- src="https://gitlab.com/avatar"
- />
- </glavatarlink-stub>
-
- <div
- class="gl-display-flex gl-justify-content-space-between"
- >
- <div>
- <gllink-stub
- class="js-user-link"
- data-testid="user-link"
- data-user-id="1"
- data-username="foo-bar"
- href="https://gitlab.com/user"
- >
- <span
- class="note-header-author-name gl-font-weight-bold"
- >
-
- </span>
-
- <!---->
-
- <span
- class="note-headline-light"
- >
- @foo-bar
- </span>
- </gllink-stub>
-
- <span
- class="note-headline-light note-headline-meta"
- >
- <span
- class="system-note-message"
- />
-
- <gllink-stub
- class="note-timestamp system-note-separator gl-display-block gl-mb-2 gl-font-sm"
- href="#note_123"
- >
- <timeagotooltip-stub
- cssclass=""
- datetimeformat="DATE_WITH_TIME_FORMAT"
- time="2019-07-26T15:02:20Z"
- tooltipplacement="bottom"
- />
- </gllink-stub>
- </span>
- </div>
-
- <div
- class="gl-display-flex gl-align-items-baseline gl-mt-n2 gl-mr-n2"
- >
-
- <!---->
-
- <!---->
- </div>
- </div>
-
- <div
- class="note-text md"
- data-qa-selector="note_content"
- data-testid="note-text"
- />
-
-</timelineentryitem-stub>
-`;
diff --git a/spec/frontend/design_management/components/design_notes/design_discussion_spec.js b/spec/frontend/design_management/components/design_notes/design_discussion_spec.js
index 664a0974549..797f399eff5 100644
--- a/spec/frontend/design_management/components/design_notes/design_discussion_spec.js
+++ b/spec/frontend/design_management/components/design_notes/design_discussion_spec.js
@@ -29,6 +29,7 @@ const DEFAULT_TODO_COUNT = 2;
describe('Design discussions component', () => {
let wrapper;
+ const findDesignNotesList = () => wrapper.find('[data-testid="design-discussion-content"]');
const findDesignNotes = () => wrapper.findAllComponents(DesignNote);
const findReplyPlaceholder = () => wrapper.findComponent(ReplyPlaceholder);
const findReplyForm = () => wrapper.findComponent(DesignReplyForm);
@@ -88,6 +89,9 @@ describe('Design discussions component', () => {
},
},
},
+ stubs: {
+ EmojiPicker: true,
+ },
});
}
@@ -287,7 +291,7 @@ describe('Design discussions component', () => {
describe('when any note from a discussion is active', () => {
it.each([notes[0], notes[0].discussion.notes.nodes[1]])(
- 'applies correct class to all notes in the active discussion',
+ 'applies correct class to the active discussion',
(note) => {
createComponent({
props: { discussion: mockDiscussion },
@@ -299,11 +303,7 @@ describe('Design discussions component', () => {
},
});
- expect(
- wrapper
- .findAllComponents(DesignNote)
- .wrappers.every((designNote) => designNote.classes('gl-bg-blue-50')),
- ).toBe(true);
+ expect(findDesignNotesList().classes('gl-bg-blue-50')).toBe(true);
},
);
});
diff --git a/spec/frontend/design_management/components/design_notes/design_note_spec.js b/spec/frontend/design_management/components/design_notes/design_note_spec.js
index 661d1ac4087..8795b089551 100644
--- a/spec/frontend/design_management/components/design_notes/design_note_spec.js
+++ b/spec/frontend/design_management/components/design_notes/design_note_spec.js
@@ -1,10 +1,18 @@
import { ApolloMutation } from 'vue-apollo';
import { nextTick } from 'vue';
import { GlAvatar, GlAvatarLink, GlDisclosureDropdown, GlDisclosureDropdownItem } from '@gitlab/ui';
-import { mountExtended } from 'helpers/vue_test_utils_helper';
+import * as Sentry from '@sentry/browser';
+
+import { mountExtended, shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+
+import EmojiPicker from '~/emoji/components/picker.vue';
+import DesignNoteAwardsList from '~/design_management/components/design_notes/design_note_awards_list.vue';
import DesignNote from '~/design_management/components/design_notes/design_note.vue';
import DesignReplyForm from '~/design_management/components/design_notes/design_reply_form.vue';
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
+import designNoteAwardEmojiToggleMutation from '~/design_management/graphql/mutations/design_note_award_emoji_toggle.mutation.graphql';
+import { mockAwardEmoji } from '../../mock_data/apollo_mock';
const scrollIntoViewMock = jest.fn();
const note = {
@@ -15,9 +23,11 @@ const note = {
avatarUrl: 'https://gitlab.com/avatar',
webUrl: 'https://gitlab.com/user',
},
+ awardEmoji: mockAwardEmoji,
body: 'test',
userPermissions: {
adminNote: false,
+ awardEmoji: true,
},
createdAt: '2019-07-26T15:02:20Z',
};
@@ -27,14 +37,14 @@ const $route = {
hash: '#note_123',
};
-const mutate = jest.fn().mockResolvedValue({ data: { updateNote: {} } });
-
describe('Design note component', () => {
let wrapper;
+ let mutate;
const findUserAvatar = () => wrapper.findComponent(GlAvatar);
const findUserAvatarLink = () => wrapper.findComponent(GlAvatarLink);
const findUserLink = () => wrapper.findByTestId('user-link');
+ const findDesignNoteAwardsList = () => wrapper.findComponent(DesignNoteAwardsList);
const findReplyForm = () => wrapper.findComponent(DesignReplyForm);
const findEditButton = () => wrapper.findByTestId('note-edit');
const findNoteContent = () => wrapper.findByTestId('note-text');
@@ -43,97 +53,106 @@ describe('Design note component', () => {
const findEditDropdownItem = () => findDropdownItems().at(0);
const findDeleteDropdownItem = () => findDropdownItems().at(1);
- function createComponent(props = {}, data = { isEditing: false }) {
- wrapper = mountExtended(DesignNote, {
+ function createComponent({
+ props = {},
+ data = { isEditing: false },
+ mountFn = mountExtended,
+ mocks = {
+ $route,
+ $apollo: {
+ mutate: jest.fn().mockResolvedValue({ data: { updateNote: {} } }),
+ },
+ },
+ stubs = {
+ ApolloMutation,
+ GlDisclosureDropdown,
+ GlDisclosureDropdownItem,
+ TimelineEntryItem: true,
+ TimeAgoTooltip: true,
+ GlAvatarLink: true,
+ GlAvatar: true,
+ GlLink: true,
+ },
+ } = {}) {
+ wrapper = mountFn(DesignNote, {
propsData: {
note: {},
noteableId: 'gid://gitlab/DesignManagement::Design/6',
+ designVariables: {
+ atVersion: null,
+ filenames: ['foo.jpg'],
+ fullPath: 'gitlab-org/gitlab-test',
+ iid: '1',
+ },
...props,
},
+ provide: {
+ issueIid: '1',
+ projectPath: 'gitlab-org/gitlab-test',
+ },
data() {
return {
...data,
};
},
- mocks: {
- $route,
- $apollo: {
- mutate,
- },
- },
- stubs: {
- ApolloMutation,
- GlDisclosureDropdown,
- GlDisclosureDropdownItem,
- TimelineEntryItem: true,
- TimeAgoTooltip: true,
- GlAvatarLink: true,
- GlAvatar: true,
- GlLink: true,
- },
+ mocks,
+ stubs,
});
}
- it('should match the snapshot', () => {
- createComponent({
- note,
- });
-
- expect(wrapper.element).toMatchSnapshot();
+ beforeEach(() => {
+ window.gon = { current_user_id: 1 };
});
- it('should render avatar with correct props', () => {
- createComponent({
- note,
- });
-
- expect(findUserAvatar().props()).toMatchObject({
- src: note.author.avatarUrl,
- entityName: note.author.username,
+ describe('default', () => {
+ beforeEach(() => {
+ createComponent({ props: { note } });
});
- expect(findUserAvatarLink().attributes('href')).toBe(note.author.webUrl);
- });
+ it('should render avatar with correct props', () => {
+ expect(findUserAvatar().props()).toMatchObject({
+ src: note.author.avatarUrl,
+ entityName: note.author.username,
+ });
- it('should render author details', () => {
- createComponent({
- note,
+ expect(findUserAvatarLink().attributes()).toMatchObject({
+ href: note.author.webUrl,
+ 'data-user-id': '1',
+ 'data-username': `${note.author.username}`,
+ });
});
- expect(findUserLink().exists()).toBe(true);
- });
-
- it('should render a time ago tooltip if note has createdAt property', () => {
- createComponent({
- note,
+ it('should render author details', () => {
+ expect(findUserLink().exists()).toBe(true);
});
- expect(wrapper.findComponent(TimeAgoTooltip).exists()).toBe(true);
- });
-
- it('should not render edit icon when user does not have a permission', () => {
- createComponent({
- note,
+ it('should render a time ago tooltip if note has createdAt property', () => {
+ expect(wrapper.findComponent(TimeAgoTooltip).exists()).toBe(true);
});
- expect(findEditButton().exists()).toBe(false);
- });
+ it('should render emoji awards list', () => {
+ expect(findDesignNoteAwardsList().exists()).toBe(true);
+ });
- it('should not display a dropdown if user does not have a permission to delete note', () => {
- createComponent({
- note,
+ it('should not render edit icon when user does not have a permission', () => {
+ expect(findEditButton().exists()).toBe(false);
});
- expect(findDropdown().exists()).toBe(false);
+ it('should not display a dropdown if user does not have a permission to delete note', () => {
+ expect(findDropdown().exists()).toBe(false);
+ });
});
describe('when user has a permission to edit note', () => {
it('should open an edit form on edit button click', async () => {
createComponent({
- note: {
- ...note,
- userPermissions: {
- adminNote: true,
+ props: {
+ note: {
+ ...note,
+ userPermissions: {
+ adminNote: true,
+ awardEmoji: true,
+ },
},
},
});
@@ -147,25 +166,29 @@ describe('Design note component', () => {
describe('when edit form is rendered', () => {
beforeEach(() => {
- createComponent(
- {
+ createComponent({
+ props: {
note: {
...note,
userPermissions: {
adminNote: true,
+ awardEmoji: true,
},
},
},
- { isEditing: true },
- );
+ data: { isEditing: true },
+ });
});
it('should open an edit form on edit button click', async () => {
createComponent({
- note: {
- ...note,
- userPermissions: {
- adminNote: true,
+ props: {
+ note: {
+ ...note,
+ userPermissions: {
+ adminNote: true,
+ awardEmoji: true,
+ },
},
},
});
@@ -203,10 +226,13 @@ describe('Design note component', () => {
describe('when user has admin permissions', () => {
it('should display a dropdown', () => {
createComponent({
- note: {
- ...note,
- userPermissions: {
- adminNote: true,
+ props: {
+ note: {
+ ...note,
+ userPermissions: {
+ adminNote: true,
+ awardEmoji: true,
+ },
},
},
});
@@ -223,12 +249,15 @@ describe('Design note component', () => {
...note,
userPermissions: {
adminNote: true,
+ awardEmoji: true,
},
};
createComponent({
- note: {
- ...payload,
+ props: {
+ note: {
+ ...payload,
+ },
},
});
@@ -236,4 +265,91 @@ describe('Design note component', () => {
expect(wrapper.emitted()).toEqual({ 'delete-note': [[{ ...payload }]] });
});
+
+ describe('when user has award emoji permissions', () => {
+ const findEmojiPicker = () => wrapper.findComponent(EmojiPicker);
+ const propsData = {
+ note: {
+ ...note,
+ userPermissions: {
+ adminNote: false,
+ awardEmoji: true,
+ },
+ },
+ };
+
+ it('should render emoji-picker button', () => {
+ createComponent({ props: propsData, mountFn: shallowMountExtended });
+
+ const emojiPicker = findEmojiPicker();
+
+ expect(emojiPicker.exists()).toBe(true);
+ expect(emojiPicker.props()).toMatchObject({
+ boundary: 'viewport',
+ right: false,
+ });
+ });
+
+ it('should call mutation to add an emoji', () => {
+ mutate = jest.fn().mockResolvedValue({
+ data: {
+ awardEmojiToggle: {
+ errors: [],
+ toggledOn: true,
+ },
+ },
+ });
+ createComponent({
+ props: propsData,
+ mountFn: shallowMountExtended,
+ mocks: {
+ $route,
+ $apollo: {
+ mutate,
+ },
+ },
+ });
+
+ findEmojiPicker().vm.$emit('click', 'thumbsup');
+
+ expect(mutate).toHaveBeenCalledWith({
+ mutation: designNoteAwardEmojiToggleMutation,
+ variables: {
+ name: 'thumbsup',
+ awardableId: note.id,
+ },
+ optimisticResponse: {
+ awardEmojiToggle: {
+ errors: [],
+ toggledOn: true,
+ },
+ },
+ update: expect.any(Function),
+ });
+ });
+
+ it('should emit an error when mutation fails', async () => {
+ jest.spyOn(Sentry, 'captureException');
+ mutate = jest.fn().mockRejectedValue({});
+ createComponent({
+ props: propsData,
+ mountFn: shallowMountExtended,
+ mocks: {
+ $route,
+ $apollo: {
+ mutate,
+ },
+ },
+ });
+
+ findEmojiPicker().vm.$emit('click', 'thumbsup');
+
+ expect(mutate).toHaveBeenCalled();
+
+ await waitForPromises();
+
+ expect(Sentry.captureException).toHaveBeenCalled();
+ expect(wrapper.emitted('error')).toEqual([[{}]]);
+ });
+ });
});
diff --git a/spec/frontend/design_management/components/design_presentation_spec.js b/spec/frontend/design_management/components/design_presentation_spec.js
index fdcea6d88c0..e64dec14461 100644
--- a/spec/frontend/design_management/components/design_presentation_spec.js
+++ b/spec/frontend/design_management/components/design_presentation_spec.js
@@ -220,10 +220,6 @@ describe('Design management design presentation component', () => {
);
});
- afterEach(() => {
- jest.clearAllMocks();
- });
-
it('sets overlay position correctly when overlay is smaller than viewport', () => {
jest.spyOn(wrapper.vm.$refs.presentationViewport, 'offsetWidth', 'get').mockReturnValue(200);
jest.spyOn(wrapper.vm.$refs.presentationViewport, 'offsetHeight', 'get').mockReturnValue(200);
diff --git a/spec/frontend/design_management/components/design_todo_button_spec.js b/spec/frontend/design_management/components/design_todo_button_spec.js
index 698535d8937..2262e5fdd83 100644
--- a/spec/frontend/design_management/components/design_todo_button_spec.js
+++ b/spec/frontend/design_management/components/design_todo_button_spec.js
@@ -50,10 +50,6 @@ describe('Design management design todo button', () => {
createComponent();
});
- afterEach(() => {
- jest.clearAllMocks();
- });
-
it('renders TodoButton component', () => {
expect(wrapper.findComponent(TodoButton).exists()).toBe(true);
});
diff --git a/spec/frontend/design_management/mock_data/apollo_mock.js b/spec/frontend/design_management/mock_data/apollo_mock.js
index 063df9366e9..0d004baafd0 100644
--- a/spec/frontend/design_management/mock_data/apollo_mock.js
+++ b/spec/frontend/design_management/mock_data/apollo_mock.js
@@ -1,3 +1,27 @@
+export const mockAuthor = {
+ id: 'gid://gitlab/User/1',
+ name: 'John',
+ webUrl: 'link-to-john-profile',
+ avatarUrl: 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
+ username: 'john.doe',
+};
+
+export const mockAwardEmoji = {
+ __typename: 'AwardEmojiConnection',
+ nodes: [
+ {
+ __typename: 'AwardEmoji',
+ name: 'briefcase',
+ user: mockAuthor,
+ },
+ {
+ __typename: 'AwardEmoji',
+ name: 'baseball',
+ user: mockAuthor,
+ },
+ ],
+};
+
export const designListQueryResponseNodes = [
{
__typename: 'Design',
@@ -237,6 +261,9 @@ export const mockNoteSubmitSuccessMutationResponse = {
webUrl: 'http://127.0.0.1:3000/root',
__typename: 'UserCore',
},
+ awardEmoji: {
+ nodes: [],
+ },
body: 'New comment',
bodyHtml: "<p data-sourcepos='1:1-1:4' dir='auto'>asdd</p>",
createdAt: '2023-02-24T06:49:20Z',
@@ -257,6 +284,7 @@ export const mockNoteSubmitSuccessMutationResponse = {
userPermissions: {
adminNote: true,
repositionNote: true,
+ awardEmoji: true,
__typename: 'NotePermissions',
},
discussion: {
@@ -363,6 +391,7 @@ export const designFactory = ({
},
userPermissions: {
updateDesign,
+ awardEmoji: true,
__typename: 'IssuePermissions',
},
__typename: 'Issue',
diff --git a/spec/frontend/design_management/mock_data/discussion.js b/spec/frontend/design_management/mock_data/discussion.js
index 0e59ef29f8f..fbd5a9e0103 100644
--- a/spec/frontend/design_management/mock_data/discussion.js
+++ b/spec/frontend/design_management/mock_data/discussion.js
@@ -1,3 +1,5 @@
+import { mockAuthor, mockAwardEmoji } from './apollo_mock';
+
export default {
id: 'discussion-id-1',
resolved: false,
@@ -12,13 +14,12 @@ export default {
x: 10,
y: 15,
},
- author: {
- name: 'John',
- webUrl: 'link-to-john-profile',
- },
+ author: mockAuthor,
+ awardEmoji: mockAwardEmoji,
createdAt: '2020-05-08T07:10:45Z',
userPermissions: {
repositionNote: true,
+ awardEmoji: true,
},
resolved: false,
},
@@ -32,12 +33,15 @@ export default {
y: 25,
},
author: {
+ id: 'gid://gitlab/User/2',
name: 'Mary',
webUrl: 'link-to-mary-profile',
},
+ awardEmoji: mockAwardEmoji,
createdAt: '2020-05-08T07:10:45Z',
userPermissions: {
adminNote: true,
+ awardEmoji: true,
},
resolved: false,
},
diff --git a/spec/frontend/design_management/mock_data/notes.js b/spec/frontend/design_management/mock_data/notes.js
index 41cefaca05b..311ce4d1eb9 100644
--- a/spec/frontend/design_management/mock_data/notes.js
+++ b/spec/frontend/design_management/mock_data/notes.js
@@ -1,3 +1,4 @@
+import { mockAwardEmoji } from './apollo_mock';
import DISCUSSION_1 from './discussion';
const DISCUSSION_2 = {
@@ -17,9 +18,11 @@ const DISCUSSION_2 = {
name: 'Mary',
webUrl: 'link-to-mary-profile',
},
+ awardEmoji: mockAwardEmoji,
createdAt: '2020-05-08T07:10:45Z',
userPermissions: {
adminNote: true,
+ awardEmoji: true,
},
resolved: true,
},
diff --git a/spec/frontend/diffs/components/app_spec.js b/spec/frontend/diffs/components/app_spec.js
index b69452069c0..fb5cf4dfd0a 100644
--- a/spec/frontend/diffs/components/app_spec.js
+++ b/spec/frontend/diffs/components/app_spec.js
@@ -73,6 +73,8 @@ describe('diffs/components/app', () => {
propsData: {
endpointCoverage: `${TEST_HOST}/diff/endpointCoverage`,
endpointCodequality: '',
+ endpointSast: '',
+ projectPath: 'namespace/project',
currentUser: {},
changesEmptyStateIllustration: '',
...props,
@@ -184,6 +186,16 @@ describe('diffs/components/app', () => {
});
});
+ describe('SAST diff', () => {
+ it('does not fetch Sast data on FOSS', () => {
+ createComponent();
+ jest.spyOn(wrapper.vm, 'fetchSast');
+ wrapper.vm.fetchData(false);
+
+ expect(wrapper.vm.fetchSast).not.toHaveBeenCalled();
+ });
+ });
+
it('displays loading icon on loading', () => {
createComponent({}, ({ state }) => {
state.diffs.isLoading = true;
diff --git a/spec/frontend/diffs/components/commit_item_spec.js b/spec/frontend/diffs/components/commit_item_spec.js
index 3c092296130..fa16af92701 100644
--- a/spec/frontend/diffs/components/commit_item_spec.js
+++ b/spec/frontend/diffs/components/commit_item_spec.js
@@ -5,7 +5,7 @@ import { TEST_HOST } from 'helpers/test_constants';
import { trimText } from 'helpers/text_helper';
import Component from '~/diffs/components/commit_item.vue';
import { getTimeago } from '~/lib/utils/datetime_utility';
-import CommitPipelineStatus from '~/projects/tree/components/commit_pipeline_status_component.vue';
+import CommitPipelineStatus from '~/projects/tree/components/commit_pipeline_status.vue';
const TEST_AUTHOR_NAME = 'test';
const TEST_AUTHOR_EMAIL = 'test+test@gitlab.com';
diff --git a/spec/frontend/diffs/components/diff_code_quality_item_spec.js b/spec/frontend/diffs/components/diff_code_quality_item_spec.js
index be9fb61a77d..085eb096239 100644
--- a/spec/frontend/diffs/components/diff_code_quality_item_spec.js
+++ b/spec/frontend/diffs/components/diff_code_quality_item_spec.js
@@ -2,20 +2,22 @@ import { GlIcon, GlLink } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import DiffCodeQualityItem from '~/diffs/components/diff_code_quality_item.vue';
import { SEVERITY_CLASSES, SEVERITY_ICONS } from '~/ci/reports/codequality_report/constants';
-import { multipleFindingsArr } from '../mock_data/diff_code_quality';
+import { multipleFindingsArrCodeQualityScale } from '../mock_data/diff_code_quality';
let wrapper;
+const [codeQualityFinding] = multipleFindingsArrCodeQualityScale;
const findIcon = () => wrapper.findComponent(GlIcon);
const findButton = () => wrapper.findComponent(GlLink);
const findDescriptionPlainText = () => wrapper.findByTestId('description-plain-text');
const findDescriptionLinkSection = () => wrapper.findByTestId('description-button-section');
describe('DiffCodeQuality', () => {
- const createWrapper = ({ glFeatures = {} } = {}) => {
+ const createWrapper = ({ glFeatures = {}, link = true } = {}) => {
return shallowMountExtended(DiffCodeQualityItem, {
propsData: {
- finding: multipleFindingsArr[0],
+ finding: codeQualityFinding,
+ link,
},
provide: {
glFeatures,
@@ -28,8 +30,8 @@ describe('DiffCodeQuality', () => {
expect(findIcon().exists()).toBe(true);
expect(findIcon().attributes()).toMatchObject({
- class: `codequality-severity-icon ${SEVERITY_CLASSES[multipleFindingsArr[0].severity]}`,
- name: SEVERITY_ICONS[multipleFindingsArr[0].severity],
+ class: `codequality-severity-icon ${SEVERITY_CLASSES[codeQualityFinding.severity]}`,
+ name: SEVERITY_ICONS[codeQualityFinding.severity],
size: '12',
});
});
@@ -41,26 +43,35 @@ describe('DiffCodeQuality', () => {
codeQualityInlineDrawer: false,
},
});
- expect(findDescriptionPlainText().text()).toContain(multipleFindingsArr[0].severity);
- expect(findDescriptionPlainText().text()).toContain(multipleFindingsArr[0].description);
+ expect(findDescriptionPlainText().text()).toContain(codeQualityFinding.severity);
+ expect(findDescriptionPlainText().text()).toContain(codeQualityFinding.description);
});
});
describe('with codeQualityInlineDrawer flag true', () => {
- beforeEach(() => {
+ const [{ description, severity }] = multipleFindingsArrCodeQualityScale;
+ const renderedText = `${severity} - ${description}`;
+ it('when link prop is true, should render gl-link', () => {
wrapper = createWrapper({
glFeatures: {
codeQualityInlineDrawer: true,
},
});
- });
- it('should render severity as plain text', () => {
- expect(findDescriptionLinkSection().text()).toContain(multipleFindingsArr[0].severity);
+ expect(findButton().exists()).toBe(true);
+ expect(findButton().text()).toBe(renderedText);
});
- it('should render button with description text', () => {
- expect(findButton().text()).toContain(multipleFindingsArr[0].description);
+ it('when link prop is false, should not render gl-link', () => {
+ wrapper = createWrapper({
+ glFeatures: {
+ codeQualityInlineDrawer: true,
+ },
+ link: false,
+ });
+
+ expect(findButton().exists()).toBe(false);
+ expect(findDescriptionLinkSection().text()).toBe(renderedText);
});
});
});
diff --git a/spec/frontend/diffs/components/diff_code_quality_spec.js b/spec/frontend/diffs/components/diff_code_quality_spec.js
index 9ecfb62e1c5..73976ebd713 100644
--- a/spec/frontend/diffs/components/diff_code_quality_spec.js
+++ b/spec/frontend/diffs/components/diff_code_quality_spec.js
@@ -1,38 +1,61 @@
-import { mountExtended, shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
import DiffCodeQuality from '~/diffs/components/diff_code_quality.vue';
-import DiffCodeQualityItem from '~/diffs/components/diff_code_quality_item.vue';
-import { NEW_CODE_QUALITY_FINDINGS } from '~/diffs/i18n';
-import { multipleFindingsArr } from '../mock_data/diff_code_quality';
+import DiffInlineFindings from '~/diffs/components/diff_inline_findings.vue';
+import { NEW_CODE_QUALITY_FINDINGS, NEW_SAST_FINDINGS } from '~/diffs/i18n';
+import {
+ multipleCodeQualityNoSast,
+ multipleSastNoCodeQuality,
+} from '../mock_data/diff_code_quality';
let wrapper;
-const diffItems = () => wrapper.findAllComponents(DiffCodeQualityItem);
-const findHeading = () => wrapper.findByTestId(`diff-codequality-findings-heading`);
+const diffInlineFindings = () => wrapper.findComponent(DiffInlineFindings);
+const allDiffInlineFindings = () => wrapper.findAllComponents(DiffInlineFindings);
describe('DiffCodeQuality', () => {
- const createWrapper = (codeQuality, mountFunction = mountExtended) => {
- return mountFunction(DiffCodeQuality, {
+ const createWrapper = (findings) => {
+ return mountExtended(DiffCodeQuality, {
propsData: {
expandedLines: [],
- codeQuality,
+ codeQuality: findings.codeQuality,
+ sast: findings.sast,
},
});
};
it('hides details and throws hideCodeQualityFindings event on close click', async () => {
- wrapper = createWrapper(multipleFindingsArr);
+ wrapper = createWrapper(multipleCodeQualityNoSast);
expect(wrapper.findByTestId('diff-codequality').exists()).toBe(true);
await wrapper.findByTestId('diff-codequality-close').trigger('click');
- expect(wrapper.emitted('hideCodeQualityFindings').length).toBe(1);
+ expect(wrapper.emitted('hideCodeQualityFindings')).toHaveLength(1);
});
- it('renders heading and correct amount of list items for codequality array and their description', () => {
- wrapper = createWrapper(multipleFindingsArr, shallowMountExtended);
+ it('renders diff inline findings component with correct props for codequality array', () => {
+ wrapper = createWrapper(multipleCodeQualityNoSast);
- expect(findHeading().text()).toEqual(NEW_CODE_QUALITY_FINDINGS);
+ expect(diffInlineFindings().props('title')).toBe(NEW_CODE_QUALITY_FINDINGS);
+ expect(diffInlineFindings().props('findings')).toBe(multipleCodeQualityNoSast.codeQuality);
+ });
+
+ it('does not render codeQuality section when codeQuality array is empty', () => {
+ wrapper = createWrapper(multipleSastNoCodeQuality);
+
+ expect(diffInlineFindings().props('title')).toBe(NEW_SAST_FINDINGS);
+ expect(allDiffInlineFindings()).toHaveLength(1);
+ });
+
+ it('renders heading and correct amount of list items for sast array and their description', () => {
+ wrapper = createWrapper(multipleSastNoCodeQuality);
+
+ expect(diffInlineFindings().props('title')).toBe(NEW_SAST_FINDINGS);
+ expect(diffInlineFindings().props('findings')).toBe(multipleSastNoCodeQuality.sast);
+ });
+
+ it('does not render sast section when sast array is empty', () => {
+ wrapper = createWrapper(multipleCodeQualityNoSast);
- expect(diffItems()).toHaveLength(multipleFindingsArr.length);
- expect(diffItems().at(0).props().finding).toEqual(multipleFindingsArr[0]);
+ expect(diffInlineFindings().props('title')).toBe(NEW_CODE_QUALITY_FINDINGS);
+ expect(allDiffInlineFindings()).toHaveLength(1);
});
});
diff --git a/spec/frontend/diffs/components/diff_content_spec.js b/spec/frontend/diffs/components/diff_content_spec.js
index 39d9255aaf9..3b37edbcb1d 100644
--- a/spec/frontend/diffs/components/diff_content_spec.js
+++ b/spec/frontend/diffs/components/diff_content_spec.js
@@ -2,6 +2,10 @@ import { GlLoadingIcon } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import Vue from 'vue';
import Vuex from 'vuex';
+import waitForPromises from 'helpers/wait_for_promises';
+import { sprintf } from '~/locale';
+import { createAlert } from '~/alert';
+import * as diffRowUtils from 'ee_else_ce/diffs/components/diff_row_utils';
import DiffContentComponent from '~/diffs/components/diff_content.vue';
import DiffDiscussions from '~/diffs/components/diff_discussions.vue';
import DiffView from '~/diffs/components/diff_view.vue';
@@ -10,9 +14,11 @@ import { diffViewerModes } from '~/ide/constants';
import NoteForm from '~/notes/components/note_form.vue';
import NoPreviewViewer from '~/vue_shared/components/diff_viewer/viewers/no_preview.vue';
import NotDiffableViewer from '~/vue_shared/components/diff_viewer/viewers/not_diffable.vue';
+import { SOMETHING_WENT_WRONG, SAVING_THE_COMMENT_FAILED } from '~/diffs/i18n';
import { getDiffFileMock } from '../mock_data/diff_file';
Vue.use(Vuex);
+jest.mock('~/alert');
describe('DiffContent', () => {
let wrapper;
@@ -72,6 +78,7 @@ describe('DiffContent', () => {
getCommentFormForDiffFile: getCommentFormForDiffFileGetterMock,
diffLines: () => () => [...getDiffFileMock().parallel_diff_lines],
fileLineCodequality: () => () => [],
+ fileLineSast: () => () => [],
},
actions: {
saveDiffDiscussion: saveDiffDiscussionMock,
@@ -113,6 +120,32 @@ describe('DiffContent', () => {
expect(wrapper.findComponent(GlLoadingIcon).exists()).toBe(true);
});
+
+ it('should include Sast findings when sastReportsInInlineDiff flag is true', () => {
+ const mapParallelSpy = jest.spyOn(diffRowUtils, 'mapParallel');
+ const mapParallelNoSastSpy = jest.spyOn(diffRowUtils, 'mapParallelNoSast');
+ createComponent({
+ provide: {
+ glFeatures: {
+ sastReportsInInlineDiff: true,
+ },
+ },
+ props: { diffFile: { ...textDiffFile, renderingLines: true } },
+ });
+
+ expect(mapParallelSpy).toHaveBeenCalled();
+ expect(mapParallelNoSastSpy).not.toHaveBeenCalled();
+ });
+
+ it('should not include Sast findings when sastReportsInInlineDiff flag is false', () => {
+ const mapParallelSpy = jest.spyOn(diffRowUtils, 'mapParallel');
+ const mapParallelNoSastSpy = jest.spyOn(diffRowUtils, 'mapParallelNoSast');
+
+ createComponent({ props: { diffFile: { ...textDiffFile, renderingLines: true } } });
+
+ expect(mapParallelNoSastSpy).toHaveBeenCalled();
+ expect(mapParallelSpy).not.toHaveBeenCalled();
+ });
});
describe('with whitespace only change', () => {
@@ -218,5 +251,44 @@ describe('DiffContent', () => {
},
});
});
+
+ describe('when note-form emits `handleFormUpdate`', () => {
+ const noteStub = {};
+ const parentElement = null;
+ const errorCallback = jest.fn();
+
+ describe.each`
+ scenario | serverError | message
+ ${'with server error'} | ${{ data: { errors: 'error' } }} | ${SAVING_THE_COMMENT_FAILED}
+ ${'without server error'} | ${null} | ${SOMETHING_WENT_WRONG}
+ `('$scenario', ({ serverError, message }) => {
+ beforeEach(async () => {
+ saveDiffDiscussionMock.mockRejectedValue({ response: serverError });
+
+ createComponent({
+ props: {
+ diffFile: imageDiffFile,
+ },
+ });
+
+ wrapper
+ .findComponent(NoteForm)
+ .vm.$emit('handleFormUpdate', noteStub, parentElement, errorCallback);
+
+ await waitForPromises();
+ });
+
+ it(`renders ${serverError ? 'server' : 'generic'} error message`, () => {
+ expect(createAlert).toHaveBeenCalledWith({
+ message: sprintf(message, { reason: serverError?.data?.errors }),
+ parent: parentElement,
+ });
+ });
+
+ it('calls errorCallback', () => {
+ expect(errorCallback).toHaveBeenCalled();
+ });
+ });
+ });
});
});
diff --git a/spec/frontend/diffs/components/diff_discussions_spec.js b/spec/frontend/diffs/components/diff_discussions_spec.js
index 73d9f2d6d45..40c617da0aa 100644
--- a/spec/frontend/diffs/components/diff_discussions_spec.js
+++ b/spec/frontend/diffs/components/diff_discussions_spec.js
@@ -25,11 +25,13 @@ describe('DiffDiscussions', () => {
});
};
+ const findNoteableDiscussion = () => wrapper.findComponent(NoteableDiscussion);
+
describe('template', () => {
it('should have notes list', () => {
createComponent();
- expect(wrapper.findComponent(NoteableDiscussion).exists()).toBe(true);
+ expect(findNoteableDiscussion().exists()).toBe(true);
expect(wrapper.findComponent(DiscussionNotes).exists()).toBe(true);
expect(
wrapper.findComponent(DiscussionNotes).findAllComponents(TimelineEntryItem).length,
@@ -51,11 +53,11 @@ describe('DiffDiscussions', () => {
it('dispatches toggleDiscussion when clicking collapse button', () => {
createComponent({ shouldCollapseDiscussions: true });
- jest.spyOn(wrapper.vm.$store, 'dispatch').mockImplementation();
- const diffNotesToggle = findDiffNotesToggle();
- diffNotesToggle.trigger('click');
+ jest.spyOn(store, 'dispatch').mockImplementation();
+
+ findDiffNotesToggle().trigger('click');
- expect(wrapper.vm.$store.dispatch).toHaveBeenCalledWith('toggleDiscussion', {
+ expect(store.dispatch).toHaveBeenCalledWith('toggleDiscussion', {
discussionId: discussionsMockData.id,
});
});
@@ -77,12 +79,12 @@ describe('DiffDiscussions', () => {
discussions[0].expanded = false;
createComponent({ discussions, shouldCollapseDiscussions: true });
- expect(wrapper.findComponent(NoteableDiscussion).isVisible()).toBe(false);
+ expect(findNoteableDiscussion().isVisible()).toBe(false);
});
it('renders badge on avatar', () => {
createComponent({ renderAvatarBadge: true });
- const noteableDiscussion = wrapper.findComponent(NoteableDiscussion);
+ const noteableDiscussion = findNoteableDiscussion();
expect(noteableDiscussion.find('.design-note-pin').exists()).toBe(true);
expect(noteableDiscussion.find('.design-note-pin').text().trim()).toBe('1');
diff --git a/spec/frontend/diffs/components/diff_file_header_spec.js b/spec/frontend/diffs/components/diff_file_header_spec.js
index 3f75b086368..d3afaab492d 100644
--- a/spec/frontend/diffs/components/diff_file_header_spec.js
+++ b/spec/frontend/diffs/components/diff_file_header_spec.js
@@ -644,22 +644,14 @@ describe('DiffFileHeader component', () => {
);
});
- it.each`
- commentOnFiles | exists | existsText
- ${false} | ${false} | ${'does not'}
- ${true} | ${true} | ${'does'}
- `(
- '$existsText render comment on files button when commentOnFiles is $commentOnFiles',
- ({ commentOnFiles, exists }) => {
- window.gon = { current_user_id: 1 };
- createComponent({
- props: {
- addMergeRequestButtons: true,
- },
- options: { provide: { glFeatures: { commentOnFiles } } },
- });
+ it('should render the comment on files button', () => {
+ window.gon = { current_user_id: 1 };
+ createComponent({
+ props: {
+ addMergeRequestButtons: true,
+ },
+ });
- expect(wrapper.find('[data-testid="comment-files-button"]').exists()).toEqual(exists);
- },
- );
+ expect(wrapper.find('[data-testid="comment-files-button"]').exists()).toEqual(true);
+ });
});
diff --git a/spec/frontend/diffs/components/diff_file_spec.js b/spec/frontend/diffs/components/diff_file_spec.js
index d9c57ed1470..db6cde883f3 100644
--- a/spec/frontend/diffs/components/diff_file_spec.js
+++ b/spec/frontend/diffs/components/diff_file_spec.js
@@ -1,7 +1,11 @@
-import { shallowMount } from '@vue/test-utils';
import MockAdapter from 'axios-mock-adapter';
import Vue, { nextTick } from 'vue';
import Vuex from 'vuex';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+
+import waitForPromises from 'helpers/wait_for_promises';
+import { sprintf } from '~/locale';
+import { createAlert } from '~/alert';
import DiffContentComponent from 'jh_else_ce/diffs/components/diff_content.vue';
import DiffFileComponent from '~/diffs/components/diff_file.vue';
@@ -11,19 +15,33 @@ import {
EVT_EXPAND_ALL_FILES,
EVT_PERF_MARK_DIFF_FILES_END,
EVT_PERF_MARK_FIRST_DIFF_FILE_SHOWN,
+ FILE_DIFF_POSITION_TYPE,
} from '~/diffs/constants';
import eventHub from '~/diffs/event_hub';
-import createDiffsStore from '~/diffs/store/modules';
import { diffViewerModes, diffViewerErrors } from '~/ide/constants';
import axios from '~/lib/utils/axios_utils';
import { scrollToElement } from '~/lib/utils/common_utils';
import { HTTP_STATUS_OK } from '~/lib/utils/http_status';
import createNotesStore from '~/notes/stores/modules';
+import diffsModule from '~/diffs/store/modules';
+import { SOMETHING_WENT_WRONG, SAVING_THE_COMMENT_FAILED } from '~/diffs/i18n';
+import diffLineNoteFormMixin from '~/notes/mixins/diff_line_note_form';
import { getDiffFileMock } from '../mock_data/diff_file';
import diffFileMockDataUnreadable from '../mock_data/diff_file_unreadable';
+import diffsMockData from '../mock_data/merge_request_diffs';
jest.mock('~/lib/utils/common_utils');
+jest.mock('~/alert');
+jest.mock('~/notes/mixins/diff_line_note_form', () => ({
+ methods: {
+ addToReview: jest.fn(),
+ },
+}));
+
+Vue.use(Vuex);
+
+const saveDiffDiscussionMock = jest.fn();
function changeViewer(store, index, { automaticallyCollapsed, manuallyCollapsed, name }) {
const file = store.state.diffs.diffFiles[index];
@@ -70,18 +88,29 @@ function markFileToBeRendered(store, index = 0) {
}
function createComponent({ file, first = false, last = false, options = {}, props = {} }) {
- Vue.use(Vuex);
+ const diffs = diffsModule();
+ diffs.actions = {
+ ...diffs.actions,
+ saveDiffDiscussion: saveDiffDiscussionMock,
+ };
+
+ diffs.getters = {
+ ...diffs.getters,
+ diffCompareDropdownTargetVersions: () => [],
+ diffCompareDropdownSourceVersions: () => [],
+ };
const store = new Vuex.Store({
...createNotesStore(),
- modules: {
- diffs: createDiffsStore(),
- },
+ modules: { diffs },
});
- store.state.diffs.diffFiles = [file];
+ store.state.diffs = {
+ mergeRequestDiff: diffsMockData[0],
+ diffFiles: [file],
+ };
- const wrapper = shallowMount(DiffFileComponent, {
+ const wrapper = shallowMountExtended(DiffFileComponent, {
store,
propsData: {
file,
@@ -101,9 +130,10 @@ function createComponent({ file, first = false, last = false, options = {}, prop
}
const findDiffHeader = (wrapper) => wrapper.findComponent(DiffFileHeaderComponent);
-const findDiffContentArea = (wrapper) => wrapper.find('[data-testid="content-area"]');
-const findLoader = (wrapper) => wrapper.find('[data-testid="loader-icon"]');
-const findToggleButton = (wrapper) => wrapper.find('[data-testid="expand-button"]');
+const findDiffContentArea = (wrapper) => wrapper.findByTestId('content-area');
+const findLoader = (wrapper) => wrapper.findByTestId('loader-icon');
+const findToggleButton = (wrapper) => wrapper.findByTestId('expand-button');
+const findNoteForm = (wrapper) => wrapper.findByTestId('file-note-form');
const toggleFile = (wrapper) => findDiffHeader(wrapper).vm.$emit('toggleFile');
const getReadableFile = () => getDiffFileMock();
@@ -118,6 +148,12 @@ const makeFileManuallyCollapsed = (store, index = 0) =>
const changeViewerType = (store, newType, index = 0) =>
changeViewer(store, index, { name: diffViewerModes[newType] });
+const triggerSaveNote = (wrapper, note, parent, error) =>
+ findNoteForm(wrapper).vm.$emit('handleFormUpdate', note, parent, error);
+
+const triggerSaveDraftNote = (wrapper, note, parent, error) =>
+ findNoteForm(wrapper).vm.$emit('handleFormUpdateAddToReview', note, false, parent, error);
+
describe('DiffFile', () => {
let wrapper;
let store;
@@ -502,7 +538,7 @@ describe('DiffFile', () => {
await nextTick();
- const button = wrapper.find('[data-testid="blob-button"]');
+ const button = wrapper.findByTestId('blob-button');
expect(wrapper.text()).toContain('Changes are too large to be shown.');
expect(button.html()).toContain('View file @');
@@ -510,24 +546,6 @@ describe('DiffFile', () => {
});
});
- it('loads collapsed file on mounted when single file mode is enabled', async () => {
- const file = {
- ...getReadableFile(),
- load_collapsed_diff_url: '/diff_for_path',
- highlighted_diff_lines: [],
- parallel_diff_lines: [],
- viewer: { name: 'collapsed', automaticallyCollapsed: true },
- };
-
- axiosMock.onGet(file.load_collapsed_diff_url).reply(HTTP_STATUS_OK, getReadableFile());
-
- ({ wrapper, store } = createComponent({ file, props: { viewDiffsFileByFile: true } }));
-
- await nextTick();
-
- expect(findLoader(wrapper).exists()).toBe(true);
- });
-
describe('merge conflicts', () => {
it('does not render conflict alert', () => {
const file = {
@@ -538,7 +556,7 @@ describe('DiffFile', () => {
({ wrapper, store } = createComponent({ file }));
- expect(wrapper.find('[data-testid="conflictsAlert"]').exists()).toBe(false);
+ expect(wrapper.findByTestId('conflictsAlert').exists()).toBe(false);
});
it('renders conflict alert when conflict_type is present', () => {
@@ -550,7 +568,7 @@ describe('DiffFile', () => {
({ wrapper, store } = createComponent({ file }));
- expect(wrapper.find('[data-testid="conflictsAlert"]').exists()).toBe(true);
+ expect(wrapper.findByTestId('conflictsAlert').exists()).toBe(true);
});
});
@@ -572,10 +590,9 @@ describe('DiffFile', () => {
({ wrapper, store } = createComponent({
file,
- options: { provide: { glFeatures: { commentOnFiles: true } } },
}));
- expect(wrapper.find('[data-testid="file-discussions"]').exists()).toEqual(exists);
+ expect(wrapper.findByTestId('file-discussions').exists()).toEqual(exists);
},
);
@@ -593,10 +610,9 @@ describe('DiffFile', () => {
({ wrapper, store } = createComponent({
file,
- options: { provide: { glFeatures: { commentOnFiles: true } } },
}));
- expect(wrapper.find('[data-testid="file-note-form"]').exists()).toEqual(exists);
+ expect(findNoteForm(wrapper).exists()).toEqual(exists);
},
);
@@ -612,10 +628,99 @@ describe('DiffFile', () => {
({ wrapper, store } = createComponent({
file,
- options: { provide: { glFeatures: { commentOnFiles: true } } },
}));
- expect(wrapper.find('[data-testid="diff-file-discussions"]').exists()).toEqual(exists);
+ expect(wrapper.findByTestId('diff-file-discussions').exists()).toEqual(exists);
+ });
+
+ describe('when note-form emits `handleFormUpdate`', () => {
+ const file = {
+ ...getReadableFile(),
+ hasCommentForm: true,
+ };
+
+ const note = {};
+ const parentElement = null;
+ const errorCallback = jest.fn();
+
+ beforeEach(() => {
+ ({ wrapper, store } = createComponent({
+ file,
+ options: { provide: { glFeatures: { commentOnFiles: true } } },
+ }));
+ });
+
+ it('calls saveDiffDiscussionMock', () => {
+ triggerSaveNote(wrapper, note, parentElement, errorCallback);
+
+ expect(saveDiffDiscussionMock).toHaveBeenCalledWith(expect.any(Object), {
+ note,
+ formData: {
+ noteableData: expect.any(Object),
+ diffFile: file,
+ positionType: FILE_DIFF_POSITION_TYPE,
+ noteableType: store.getters.noteableType,
+ },
+ });
+ });
+
+ describe('when saveDiffDiscussionMock throws an error', () => {
+ describe.each`
+ scenario | serverError | message
+ ${'with server error'} | ${{ data: { errors: 'error' } }} | ${SAVING_THE_COMMENT_FAILED}
+ ${'without server error'} | ${{}} | ${SOMETHING_WENT_WRONG}
+ `('$scenario', ({ serverError, message }) => {
+ beforeEach(async () => {
+ saveDiffDiscussionMock.mockRejectedValue({ response: serverError });
+
+ triggerSaveNote(wrapper, note, parentElement, errorCallback);
+
+ await waitForPromises();
+ });
+
+ it(`renders ${serverError ? 'server' : 'generic'} error message`, () => {
+ expect(createAlert).toHaveBeenCalledWith({
+ message: sprintf(message, { reason: serverError?.data?.errors }),
+ parent: parentElement,
+ });
+ });
+
+ it('calls errorCallback', () => {
+ expect(errorCallback).toHaveBeenCalled();
+ });
+ });
+ });
+ });
+
+ describe('when note-form emits `handleFormUpdateAddToReview`', () => {
+ const file = {
+ ...getReadableFile(),
+ hasCommentForm: true,
+ };
+
+ const note = {};
+ const parentElement = null;
+ const errorCallback = jest.fn();
+
+ beforeEach(async () => {
+ ({ wrapper, store } = createComponent({
+ file,
+ options: { provide: { glFeatures: { commentOnFiles: true } } },
+ }));
+
+ triggerSaveDraftNote(wrapper, note, parentElement, errorCallback);
+
+ await nextTick();
+ });
+
+ it('calls addToReview mixin', () => {
+ expect(diffLineNoteFormMixin.methods.addToReview).toHaveBeenCalledWith(
+ note,
+ FILE_DIFF_POSITION_TYPE,
+ parentElement,
+ errorCallback,
+ );
+ });
});
});
});
diff --git a/spec/frontend/diffs/components/diff_inline_findings_spec.js b/spec/frontend/diffs/components/diff_inline_findings_spec.js
new file mode 100644
index 00000000000..9ccfb2a613d
--- /dev/null
+++ b/spec/frontend/diffs/components/diff_inline_findings_spec.js
@@ -0,0 +1,33 @@
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import DiffInlineFindings from '~/diffs/components/diff_inline_findings.vue';
+import DiffCodeQualityItem from '~/diffs/components/diff_code_quality_item.vue';
+import { NEW_CODE_QUALITY_FINDINGS } from '~/diffs/i18n';
+import { multipleCodeQualityNoSast } from '../mock_data/diff_code_quality';
+
+let wrapper;
+const heading = () => wrapper.findByTestId('diff-inline-findings-heading');
+const diffCodeQualityItems = () => wrapper.findAllComponents(DiffCodeQualityItem);
+
+describe('DiffInlineFindings', () => {
+ const createWrapper = () => {
+ return shallowMountExtended(DiffInlineFindings, {
+ propsData: {
+ title: NEW_CODE_QUALITY_FINDINGS,
+ findings: multipleCodeQualityNoSast.codeQuality,
+ },
+ });
+ };
+
+ it('renders the title correctly', () => {
+ wrapper = createWrapper();
+ expect(heading().text()).toBe(NEW_CODE_QUALITY_FINDINGS);
+ });
+
+ it('renders the correct number of DiffCodeQualityItem components with correct props', () => {
+ wrapper = createWrapper();
+ expect(diffCodeQualityItems()).toHaveLength(multipleCodeQualityNoSast.codeQuality.length);
+ expect(diffCodeQualityItems().wrappers[0].props('finding')).toEqual(
+ wrapper.props('findings')[0],
+ );
+ });
+});
diff --git a/spec/frontend/diffs/components/diff_line_note_form_spec.js b/spec/frontend/diffs/components/diff_line_note_form_spec.js
index e42b98e4d68..0ca48db2497 100644
--- a/spec/frontend/diffs/components/diff_line_note_form_spec.js
+++ b/spec/frontend/diffs/components/diff_line_note_form_spec.js
@@ -1,15 +1,20 @@
import { shallowMount } from '@vue/test-utils';
import { nextTick } from 'vue';
+import waitForPromises from 'helpers/wait_for_promises';
+import { sprintf } from '~/locale';
+import { createAlert } from '~/alert';
import DiffLineNoteForm from '~/diffs/components/diff_line_note_form.vue';
import store from '~/mr_notes/stores';
import NoteForm from '~/notes/components/note_form.vue';
import MultilineCommentForm from '~/notes/components/multiline_comment_form.vue';
import { confirmAction } from '~/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal';
import { noteableDataMock } from 'jest/notes/mock_data';
+import { SOMETHING_WENT_WRONG, SAVING_THE_COMMENT_FAILED } from '~/diffs/i18n';
import { getDiffFileMock } from '../mock_data/diff_file';
jest.mock('~/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal');
jest.mock('~/mr_notes/stores', () => jest.requireActual('helpers/mocks/mr_notes/stores'));
+jest.mock('~/alert');
describe('DiffLineNoteForm', () => {
let wrapper;
@@ -17,6 +22,8 @@ describe('DiffLineNoteForm', () => {
let diffLines;
beforeEach(() => {
+ store.reset();
+
diffFile = getDiffFileMock();
diffLines = diffFile.highlighted_diff_lines;
@@ -214,5 +221,38 @@ describe('DiffLineNoteForm', () => {
fileHash: diffFile.file_hash,
});
});
+
+ describe('when note-form emits `handleFormUpdate`', () => {
+ const noteStub = 'invalid note';
+ const parentElement = null;
+ const errorCallback = jest.fn();
+
+ describe.each`
+ scenario | serverError | message
+ ${'with server error'} | ${{ data: { errors: 'error' } }} | ${SAVING_THE_COMMENT_FAILED}
+ ${'without server error'} | ${null} | ${SOMETHING_WENT_WRONG}
+ `('$scenario', ({ serverError, message }) => {
+ beforeEach(async () => {
+ store.dispatch.mockRejectedValue({ response: serverError });
+
+ createComponent();
+
+ await findNoteForm().vm.$emit('handleFormUpdate', noteStub, parentElement, errorCallback);
+
+ await waitForPromises();
+ });
+
+ it(`renders ${serverError ? 'server' : 'generic'} error message`, () => {
+ expect(createAlert).toHaveBeenCalledWith({
+ message: sprintf(message, { reason: serverError?.data?.errors }),
+ parent: parentElement,
+ });
+ });
+
+ it('calls errorCallback', () => {
+ expect(errorCallback).toHaveBeenCalled();
+ });
+ });
+ });
});
});
diff --git a/spec/frontend/diffs/components/diff_line_spec.js b/spec/frontend/diffs/components/diff_line_spec.js
index 37368eb1461..a552a9d3e7f 100644
--- a/spec/frontend/diffs/components/diff_line_spec.js
+++ b/spec/frontend/diffs/components/diff_line_spec.js
@@ -16,6 +16,13 @@ const left = {
severity: EXAMPLE_SEVERITY,
},
],
+ sast: [
+ {
+ line: EXAMPLE_LINE_NUMBER,
+ description: EXAMPLE_DESCRIPTION,
+ severity: EXAMPLE_SEVERITY,
+ },
+ ],
},
},
};
@@ -30,6 +37,13 @@ const right = {
severity: EXAMPLE_SEVERITY,
},
],
+ sast: [
+ {
+ line: EXAMPLE_LINE_NUMBER,
+ description: EXAMPLE_DESCRIPTION,
+ severity: EXAMPLE_SEVERITY,
+ },
+ ],
},
},
};
@@ -60,6 +74,13 @@ describe('DiffLine', () => {
severity: EXAMPLE_SEVERITY,
},
]);
+ expect(wrapper.findComponent(DiffCodeQuality).props('sast')).toEqual([
+ {
+ line: EXAMPLE_LINE_NUMBER,
+ description: EXAMPLE_DESCRIPTION,
+ severity: EXAMPLE_SEVERITY,
+ },
+ ]);
});
});
});
diff --git a/spec/frontend/diffs/components/diff_row_spec.js b/spec/frontend/diffs/components/diff_row_spec.js
index 356c7ef925a..119b8f9ad7f 100644
--- a/spec/frontend/diffs/components/diff_row_spec.js
+++ b/spec/frontend/diffs/components/diff_row_spec.js
@@ -33,6 +33,14 @@ describe('DiffRow', () => {
left: { old_line: 1, discussions: [] },
right: { new_line: 1, discussions: [] },
},
+ {
+ left: {},
+ right: {},
+ isMetaLineLeft: true,
+ isMetaLineRight: false,
+ isContextLineLeft: true,
+ isContextLineRight: false,
+ },
];
const createWrapper = ({ props, state = {}, actions, isLoggedIn = true }) => {
@@ -273,6 +281,12 @@ describe('DiffRow', () => {
expect(findInteropAttributes(wrapper, '[data-testid="right-side"]')).toEqual(rightSide);
});
});
+
+ it('renders comment button when isMetaLineLeft is false and isMetaLineRight is true', () => {
+ wrapper = createWrapper({ props: { line: testLines[4], inline: false } });
+
+ expect(wrapper.find('.add-diff-note').exists()).toBe(true);
+ });
});
describe('coverage state memoization', () => {
diff --git a/spec/frontend/diffs/components/tree_list_spec.js b/spec/frontend/diffs/components/tree_list_spec.js
index 1ec8547d325..f56dd28ce9c 100644
--- a/spec/frontend/diffs/components/tree_list_spec.js
+++ b/spec/frontend/diffs/components/tree_list_spec.js
@@ -1,4 +1,3 @@
-import { shallowMount } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
import Vuex from 'vuex';
import TreeList from '~/diffs/components/tree_list.vue';
@@ -6,18 +5,21 @@ import createStore from '~/diffs/store/modules';
import batchComments from '~/batch_comments/stores/modules/batch_comments';
import DiffFileRow from '~/diffs/components//diff_file_row.vue';
import { stubComponent } from 'helpers/stub_component';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
describe('Diffs tree list component', () => {
let wrapper;
let store;
const getScroller = () => wrapper.findComponent({ name: 'RecycleScroller' });
const getFileRow = () => wrapper.findComponent(DiffFileRow);
+ const findDiffTreeSearch = () => wrapper.findByTestId('diff-tree-search');
+
Vue.use(Vuex);
- const createComponent = () => {
- wrapper = shallowMount(TreeList, {
+ const createComponent = ({ hideFileStats = false } = {}) => {
+ wrapper = shallowMountExtended(TreeList, {
store,
- propsData: { hideFileStats: false },
+ propsData: { hideFileStats },
stubs: {
// eslint will fail if we import the real component
RecycleScroller: stubComponent(
@@ -116,7 +118,10 @@ describe('Diffs tree list component', () => {
describe('search by file extension', () => {
it('hides scroller for no matches', async () => {
- wrapper.find('[data-testid="diff-tree-search"]').setValue('*.md');
+ const input = findDiffTreeSearch();
+
+ input.element.value = '*.md';
+ input.trigger('input');
await nextTick();
@@ -131,7 +136,10 @@ describe('Diffs tree list component', () => {
${'app/*.js'} | ${2}
${'*.js, *.rb'} | ${3}
`('returns $itemSize item for $extension', async ({ extension, itemSize }) => {
- wrapper.find('[data-testid="diff-tree-search"]').setValue(extension);
+ const input = findDiffTreeSearch();
+
+ input.element.value = extension;
+ input.trigger('input');
await nextTick();
@@ -143,23 +151,21 @@ describe('Diffs tree list component', () => {
expect(getScroller().props('items')).toHaveLength(2);
});
- it('hides file stats', async () => {
- wrapper.setProps({ hideFileStats: true });
-
- await nextTick();
- expect(wrapper.find('.file-row-stats').exists()).toBe(false);
+ it('hides file stats', () => {
+ createComponent({ hideFileStats: true });
+ expect(getFileRow().props('hideFileStats')).toBe(true);
});
it('calls toggleTreeOpen when clicking folder', () => {
- jest.spyOn(wrapper.vm.$store, 'dispatch').mockReturnValue(undefined);
+ jest.spyOn(store, 'dispatch').mockReturnValue(undefined);
getFileRow().vm.$emit('toggleTreeOpen', 'app');
- expect(wrapper.vm.$store.dispatch).toHaveBeenCalledWith('diffs/toggleTreeOpen', 'app');
+ expect(store.dispatch).toHaveBeenCalledWith('diffs/toggleTreeOpen', 'app');
});
it('renders when renderTreeList is false', async () => {
- wrapper.vm.$store.state.diffs.renderTreeList = false;
+ store.state.diffs.renderTreeList = false;
await nextTick();
expect(getScroller().props('items')).toHaveLength(3);
@@ -178,7 +184,7 @@ describe('Diffs tree list component', () => {
createComponent();
await nextTick();
- expect(wrapper.findComponent(DiffFileRow).props('viewedFiles')).toBe(viewedDiffFileIds);
+ expect(getFileRow().props('viewedFiles')).toBe(viewedDiffFileIds);
});
});
});
diff --git a/spec/frontend/diffs/mock_data/diff_code_quality.js b/spec/frontend/diffs/mock_data/diff_code_quality.js
index 29f16da8d89..5b9ed538e01 100644
--- a/spec/frontend/diffs/mock_data/diff_code_quality.js
+++ b/spec/frontend/diffs/mock_data/diff_code_quality.js
@@ -1,49 +1,120 @@
-export const multipleFindingsArr = [
+export const multipleFindingsArrCodeQualityScale = [
{
severity: 'minor',
description: 'mocked minor Issue',
line: 2,
+ scale: 'codeQuality',
},
{
severity: 'major',
description: 'mocked major Issue',
line: 3,
+ scale: 'codeQuality',
},
{
severity: 'info',
description: 'mocked info Issue',
line: 3,
+ scale: 'codeQuality',
},
{
severity: 'critical',
description: 'mocked critical Issue',
line: 3,
+ scale: 'codeQuality',
},
{
severity: 'blocker',
description: 'mocked blocker Issue',
line: 3,
+ scale: 'codeQuality',
},
{
severity: 'unknown',
description: 'mocked unknown Issue',
line: 3,
+ scale: 'codeQuality',
},
];
-export const fiveFindings = {
+export const multipleFindingsArrSastScale = [
+ {
+ severity: 'low',
+ description: 'mocked low Issue',
+ line: 2,
+ scale: 'sast',
+ },
+ {
+ severity: 'medium',
+ description: 'mocked medium Issue',
+ line: 3,
+ scale: 'sast',
+ },
+ {
+ severity: 'info',
+ description: 'mocked info Issue',
+ line: 3,
+ scale: 'sast',
+ },
+ {
+ severity: 'high',
+ description: 'mocked high Issue',
+ line: 3,
+ scale: 'sast',
+ },
+ {
+ severity: 'critical',
+ description: 'mocked critical Issue',
+ line: 3,
+ scale: 'sast',
+ },
+ {
+ severity: 'unknown',
+ description: 'mocked unknown Issue',
+ line: 3,
+ scale: 'sast',
+ },
+];
+
+export const multipleCodeQualityNoSast = {
+ codeQuality: multipleFindingsArrCodeQualityScale,
+ sast: [],
+};
+
+export const multipleSastNoCodeQuality = {
+ codeQuality: [],
+ sast: multipleFindingsArrSastScale,
+};
+
+export const fiveCodeQualityFindings = {
+ filePath: 'index.js',
+ codequality: multipleFindingsArrCodeQualityScale.slice(0, 5),
+};
+
+export const threeCodeQualityFindings = {
+ filePath: 'index.js',
+ codequality: multipleFindingsArrCodeQualityScale.slice(0, 3),
+};
+
+export const singularCodeQualityFinding = {
+ filePath: 'index.js',
+ codequality: [multipleFindingsArrCodeQualityScale[0]],
+};
+
+export const singularFindingSast = {
filePath: 'index.js',
- codequality: multipleFindingsArr.slice(0, 5),
+ sast: [multipleFindingsArrSastScale[0]],
};
-export const threeFindings = {
+export const threeSastFindings = {
filePath: 'index.js',
- codequality: multipleFindingsArr.slice(0, 3),
+ sast: multipleFindingsArrSastScale.slice(0, 3),
};
-export const singularFinding = {
+export const oneCodeQualityTwoSastFindings = {
filePath: 'index.js',
- codequality: [multipleFindingsArr[0]],
+ sast: multipleFindingsArrSastScale.slice(0, 2),
+ codequality: [multipleFindingsArrCodeQualityScale[0]],
};
export const diffCodeQuality = {
@@ -73,7 +144,7 @@ export const diffCodeQuality = {
old_line: null,
new_line: 2,
- codequality: [multipleFindingsArr[0]],
+ codequality: [multipleFindingsArrCodeQualityScale[0]],
lineDrafts: [],
},
},
diff --git a/spec/frontend/diffs/store/actions_spec.js b/spec/frontend/diffs/store/actions_spec.js
index 7534fe741e7..bbe748b8e1f 100644
--- a/spec/frontend/diffs/store/actions_spec.js
+++ b/spec/frontend/diffs/store/actions_spec.js
@@ -11,7 +11,7 @@ import {
PARALLEL_DIFF_VIEW_TYPE,
EVT_MR_PREPARED,
} from '~/diffs/constants';
-import { LOAD_SINGLE_DIFF_FAILED } from '~/diffs/i18n';
+import { LOAD_SINGLE_DIFF_FAILED, BUILDING_YOUR_MR, SOMETHING_WENT_WRONG } from '~/diffs/i18n';
import * as diffActions from '~/diffs/store/actions';
import * as types from '~/diffs/store/mutation_types';
import * as utils from '~/diffs/store/utils';
@@ -87,6 +87,7 @@ describe('DiffsStoreActions', () => {
a: ['z', 'hash:a'],
b: ['y', 'hash:a'],
};
+ const diffViewType = 'inline';
return testAction(
diffActions.setBaseConfig,
@@ -100,6 +101,7 @@ describe('DiffsStoreActions', () => {
dismissEndpoint,
showSuggestPopover,
mrReviews,
+ diffViewType,
},
{
endpoint: '',
@@ -124,6 +126,7 @@ describe('DiffsStoreActions', () => {
dismissEndpoint,
showSuggestPopover,
mrReviews,
+ diffViewType,
},
},
{
@@ -362,7 +365,7 @@ describe('DiffsStoreActions', () => {
{ type: types.SET_RETRIEVING_BATCHES, payload: false },
{ type: types.SET_BATCH_LOADING_STATE, payload: 'error' },
],
- [{ type: 'startRenderDiffsQueue' }, { type: 'startRenderDiffsQueue' }],
+ [],
);
});
});
@@ -418,9 +421,7 @@ describe('DiffsStoreActions', () => {
expect(createAlert).toHaveBeenCalledTimes(1);
expect(createAlert).toHaveBeenCalledWith({
- message: expect.stringMatching(
- 'Building your merge request… This page will update when the build is complete.',
- ),
+ message: BUILDING_YOUR_MR,
variant: 'warning',
});
});
@@ -482,7 +483,7 @@ describe('DiffsStoreActions', () => {
await testAction(diffActions.fetchCoverageFiles, {}, { endpointCoverage }, [], []);
expect(createAlert).toHaveBeenCalledTimes(1);
expect(createAlert).toHaveBeenCalledWith({
- message: expect.stringMatching('Something went wrong'),
+ message: SOMETHING_WENT_WRONG,
});
});
});
@@ -663,41 +664,6 @@ describe('DiffsStoreActions', () => {
});
});
- describe('startRenderDiffsQueue', () => {
- it('should set all files to RENDER_FILE', () => {
- const state = {
- diffFiles: [
- {
- id: 1,
- renderIt: false,
- viewer: {
- automaticallyCollapsed: false,
- },
- },
- {
- id: 2,
- renderIt: false,
- viewer: {
- automaticallyCollapsed: false,
- },
- },
- ],
- };
-
- const pseudoCommit = (commitType, file) => {
- expect(commitType).toBe(types.RENDER_FILE);
- Object.assign(file, {
- renderIt: true,
- });
- };
-
- diffActions.startRenderDiffsQueue({ state, commit: pseudoCommit });
-
- expect(state.diffFiles[0].renderIt).toBe(true);
- expect(state.diffFiles[1].renderIt).toBe(true);
- });
- });
-
describe('setInlineDiffViewType', () => {
it('should set diff view type to inline and also set the cookie properly', async () => {
await testAction(
@@ -1285,12 +1251,11 @@ describe('DiffsStoreActions', () => {
$emit = jest.spyOn(eventHub, '$emit');
});
- it('renders and expands file for the given discussion id', () => {
+ it('expands the file for the given discussion id', () => {
const localState = state({ collapsed: true, renderIt: false });
diffActions.renderFileForDiscussionId({ rootState, state: localState, commit }, '123');
- expect(commit).toHaveBeenCalledWith('RENDER_FILE', localState.diffFiles[0]);
expect($emit).toHaveBeenCalledTimes(1);
expect(commonUtils.scrollToElement).toHaveBeenCalledTimes(1);
});
@@ -1377,18 +1342,6 @@ describe('DiffsStoreActions', () => {
});
});
- describe('setRenderIt', () => {
- it('commits RENDER_FILE', () => {
- return testAction(
- diffActions.setRenderIt,
- 'file',
- {},
- [{ type: types.RENDER_FILE, payload: 'file' }],
- [],
- );
- });
- });
-
describe('receiveFullDiffError', () => {
it('updates state with the file that did not load', () => {
return testAction(
@@ -1513,7 +1466,7 @@ describe('DiffsStoreActions', () => {
payload: { filePath: testFilePath, lines: [preparedLine, preparedLine] },
},
],
- [{ type: 'startRenderDiffsQueue' }],
+ [],
);
},
);
diff --git a/spec/frontend/diffs/store/mutations_spec.js b/spec/frontend/diffs/store/mutations_spec.js
index b089cf22b14..274cb40dac8 100644
--- a/spec/frontend/diffs/store/mutations_spec.js
+++ b/spec/frontend/diffs/store/mutations_spec.js
@@ -12,6 +12,7 @@ describe('DiffsStoreMutations', () => {
${'endpoint'} | ${'/diffs/endpoint'}
${'projectPath'} | ${'/root/project'}
${'endpointUpdateUser'} | ${'/user/preferences'}
+ ${'diffViewType'} | ${'parallel'}
`('should set the $prop property into state', ({ prop, value }) => {
const state = {};
@@ -104,7 +105,6 @@ describe('DiffsStoreMutations', () => {
mutations[types.SET_DIFF_DATA_BATCH](state, diffMock);
- expect(state.diffFiles[0].renderIt).toEqual(true);
expect(state.diffFiles[0].collapsed).toEqual(false);
expect(state.treeEntries[mockFile.file_path].diffLoaded).toBe(true);
});
diff --git a/spec/frontend/diffs/store/utils_spec.js b/spec/frontend/diffs/store/utils_spec.js
index 888df06d6b9..117ed56e347 100644
--- a/spec/frontend/diffs/store/utils_spec.js
+++ b/spec/frontend/diffs/store/utils_spec.js
@@ -437,7 +437,7 @@ describe('DiffsStoreUtils', () => {
});
});
- it('sets the renderIt and collapsed attribute on files', () => {
+ it('sets the collapsed attribute on files', () => {
const checkLine = preparedDiff.diff_files[0][INLINE_DIFF_LINES_KEY][0];
expect(checkLine.discussions.length).toBe(0);
@@ -448,7 +448,6 @@ describe('DiffsStoreUtils', () => {
expect(firstChar).not.toBe('+');
expect(firstChar).not.toBe('-');
- expect(preparedDiff.diff_files[0].renderIt).toBe(true);
expect(preparedDiff.diff_files[0].collapsed).toBe(false);
});
@@ -529,8 +528,7 @@ describe('DiffsStoreUtils', () => {
preparedDiffFiles = utils.prepareDiffData({ diff: mock, meta: true });
});
- it('sets the renderIt and collapsed attribute on files', () => {
- expect(preparedDiffFiles[0].renderIt).toBe(true);
+ it('sets the collapsed attribute on files', () => {
expect(preparedDiffFiles[0].collapsed).toBeUndefined();
});
diff --git a/spec/frontend/drawio/drawio_editor_spec.js b/spec/frontend/drawio/drawio_editor_spec.js
index 4d93908b757..5a77b9d4689 100644
--- a/spec/frontend/drawio/drawio_editor_spec.js
+++ b/spec/frontend/drawio/drawio_editor_spec.js
@@ -66,7 +66,6 @@ describe('drawio/drawio_editor', () => {
});
afterEach(() => {
- jest.clearAllMocks();
findDrawioIframe()?.remove();
});
diff --git a/spec/frontend/dropzone_input_spec.js b/spec/frontend/dropzone_input_spec.js
index 57debf79c7b..ba4d838e44b 100644
--- a/spec/frontend/dropzone_input_spec.js
+++ b/spec/frontend/dropzone_input_spec.js
@@ -1,6 +1,5 @@
import MockAdapter from 'axios-mock-adapter';
import $ from 'jquery';
-import htmlNewMilestone from 'test_fixtures/milestones/new-milestone.html';
import mock from 'xhr-mock';
import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import waitForPromises from 'helpers/wait_for_promises';
@@ -9,6 +8,7 @@ import PasteMarkdownTable from '~/behaviors/markdown/paste_markdown_table';
import dropzoneInput from '~/dropzone_input';
import axios from '~/lib/utils/axios_utils';
import { HTTP_STATUS_BAD_REQUEST, HTTP_STATUS_OK } from '~/lib/utils/http_status';
+import htmlNewMilestone from 'test_fixtures_static/textarea.html';
const TEST_FILE = new File([], 'somefile.jpg');
TEST_FILE.upload = {};
diff --git a/spec/frontend/editor/source_editor_extension_base_spec.js b/spec/frontend/editor/source_editor_extension_base_spec.js
index 70bc1dee0ee..c820d6ac63d 100644
--- a/spec/frontend/editor/source_editor_extension_base_spec.js
+++ b/spec/frontend/editor/source_editor_extension_base_spec.js
@@ -56,7 +56,6 @@ describe('The basis for an Source Editor extension', () => {
});
afterEach(() => {
- jest.clearAllMocks();
resetHTMLFixture();
});
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 512b298bbbd..d9e1a22d60d 100644
--- a/spec/frontend/editor/source_editor_markdown_livepreview_ext_spec.js
+++ b/spec/frontend/editor/source_editor_markdown_livepreview_ext_spec.js
@@ -182,10 +182,6 @@ describe('Markdown Live Preview Extension for Source Editor', () => {
instance.togglePreview();
});
- afterEach(() => {
- jest.clearAllMocks();
- });
-
it('does not do anything if there is no model', () => {
instance.setModel(null);
@@ -199,9 +195,6 @@ describe('Markdown Live Preview Extension for Source Editor', () => {
mockAxios.onPost().reply(HTTP_STATUS_OK, { body: responseData });
await togglePreview();
});
- afterEach(() => {
- jest.clearAllMocks();
- });
it('removes the registered buttons from the toolbar', () => {
expect(instance.toolbar.removeItems).not.toHaveBeenCalled();
diff --git a/spec/frontend/editor/source_editor_yaml_ext_spec.js b/spec/frontend/editor/source_editor_yaml_ext_spec.js
index 14ec7f8b93f..4b1ed0fbb42 100644
--- a/spec/frontend/editor/source_editor_yaml_ext_spec.js
+++ b/spec/frontend/editor/source_editor_yaml_ext_spec.js
@@ -368,10 +368,6 @@ abc: def
let highlightLinesSpy;
let removeHighlightsSpy;
- afterEach(() => {
- jest.clearAllMocks();
- });
-
it.each`
highlightPathOnSetup | path | keepOnNotFound | expectHighlightLinesToBeCalled | withLines | expectRemoveHighlightsToBeCalled | storedHighlightPath
${null} | ${undefined} | ${false} | ${false} | ${undefined} | ${true} | ${null}
diff --git a/spec/frontend/emoji/index_spec.js b/spec/frontend/emoji/index_spec.js
index 36c3eeb5a52..1b948cce73a 100644
--- a/spec/frontend/emoji/index_spec.js
+++ b/spec/frontend/emoji/index_spec.js
@@ -7,6 +7,7 @@ import {
clearEmojiMock,
} from 'helpers/emoji';
import { trimText } from 'helpers/text_helper';
+import { createMockClient } from 'helpers/mock_apollo_helper';
import {
glEmojiTag,
searchEmoji,
@@ -14,6 +15,8 @@ import {
sortEmoji,
initEmojiMap,
getAllEmoji,
+ emojiFallbackImageSrc,
+ loadCustomEmojiWithNames,
} from '~/emoji';
import isEmojiUnicodeSupported, {
@@ -25,6 +28,12 @@ import isEmojiUnicodeSupported, {
isPersonZwjEmoji,
} from '~/emoji/support/is_emoji_unicode_supported';
import { NEUTRAL_INTENT_MULTIPLIER } from '~/emoji/constants';
+import customEmojiQuery from '~/emoji/queries/custom_emoji.query.graphql';
+
+let mockClient;
+jest.mock('~/lib/graphql', () => {
+ return () => mockClient;
+});
const emptySupportMap = {
personZwj: false,
@@ -45,12 +54,35 @@ const emptySupportMap = {
1.1: false,
};
+function createMockEmojiClient() {
+ mockClient = createMockClient([
+ [
+ customEmojiQuery,
+ jest.fn().mockResolvedValue({
+ data: {
+ group: {
+ id: 1,
+ customEmoji: {
+ nodes: [{ id: 1, name: 'parrot', url: 'parrot.gif' }],
+ },
+ },
+ },
+ }),
+ ],
+ ]);
+
+ window.gon = { features: { customEmoji: true } };
+ document.body.dataset.groupFullPath = 'test-group';
+}
+
describe('emoji', () => {
beforeEach(async () => {
await initEmojiMock();
});
afterEach(() => {
+ window.gon = {};
+ delete document.body.dataset.groupFullPath;
clearEmojiMock();
});
@@ -690,4 +722,67 @@ describe('emoji', () => {
expect(scoredItems.sort(sortEmoji)).toEqual(expected);
});
});
+
+ describe('emojiFallbackImageSrc', () => {
+ beforeEach(async () => {
+ createMockEmojiClient();
+
+ await initEmojiMock();
+ });
+
+ it.each`
+ emoji | src
+ ${'thumbsup'} | ${'/-/emojis/2/thumbsup.png'}
+ ${'parrot'} | ${'parrot.gif'}
+ `('returns $src for emoji with name $emoji', ({ emoji, src }) => {
+ expect(emojiFallbackImageSrc(emoji)).toBe(src);
+ });
+ });
+
+ describe('loadCustomEmojiWithNames', () => {
+ beforeEach(() => {
+ createMockEmojiClient();
+ });
+
+ describe('flag disabled', () => {
+ beforeEach(() => {
+ window.gon = {};
+ });
+
+ it('returns empty object', async () => {
+ const result = await loadCustomEmojiWithNames();
+
+ expect(result).toEqual({});
+ });
+ });
+
+ describe('when not in a group', () => {
+ beforeEach(() => {
+ delete document.body.dataset.groupFullPath;
+ });
+
+ it('returns empty object', async () => {
+ const result = await loadCustomEmojiWithNames();
+
+ expect(result).toEqual({});
+ });
+ });
+
+ describe('when in a group with flag enabled', () => {
+ it('returns empty object', async () => {
+ const result = await loadCustomEmojiWithNames();
+
+ expect(result).toEqual({
+ parrot: {
+ c: 'custom',
+ d: 'parrot',
+ e: undefined,
+ name: 'parrot',
+ src: 'parrot.gif',
+ u: 'custom',
+ },
+ });
+ });
+ });
+ });
});
diff --git a/spec/frontend/environments/edit_environment_spec.js b/spec/frontend/environments/edit_environment_spec.js
index f436c96f4a5..93fe9ed9400 100644
--- a/spec/frontend/environments/edit_environment_spec.js
+++ b/spec/frontend/environments/edit_environment_spec.js
@@ -1,15 +1,13 @@
import { GlLoadingIcon } from '@gitlab/ui';
-import MockAdapter from 'axios-mock-adapter';
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import { mountExtended } from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises';
import EditEnvironment from '~/environments/components/edit_environment.vue';
import { createAlert } from '~/alert';
-import axios from '~/lib/utils/axios_utils';
-import { HTTP_STATUS_BAD_REQUEST, HTTP_STATUS_OK } from '~/lib/utils/http_status';
import { visitUrl } from '~/lib/utils/url_utility';
import getEnvironment from '~/environments/graphql/queries/environment.query.graphql';
+import getEnvironmentWithNamespace from '~/environments/graphql/queries/environment_with_namespace.graphql';
import updateEnvironment from '~/environments/graphql/mutations/update_environment.mutation.graphql';
import { __ } from '~/locale';
import createMockApollo from '../__helpers__/mock_apollo_helper';
@@ -17,15 +15,15 @@ import createMockApollo from '../__helpers__/mock_apollo_helper';
jest.mock('~/lib/utils/url_utility');
jest.mock('~/alert');
-const newExternalUrl = 'https://google.ca';
const environment = {
id: '1',
name: 'foo',
externalUrl: 'https://foo.example.com',
clusterAgent: null,
+ kubernetesNamespace: null,
};
const resolvedEnvironment = { project: { id: '1', environment } };
-const environmentUpdate = {
+const environmentUpdateSuccess = {
environment: { id: '1', path: 'path/to/environment', clusterAgentId: null },
errors: [],
};
@@ -36,46 +34,51 @@ const environmentUpdateError = {
const provide = {
projectEnvironmentsPath: '/projects/environments',
- updateEnvironmentPath: '/projects/environments/1',
protectedEnvironmentSettingsPath: '/projects/1/settings/ci_cd',
projectPath: '/path/to/project',
+ environmentName: 'foo',
};
describe('~/environments/components/edit.vue', () => {
let wrapper;
- let mock;
- const createMockApolloProvider = (mutationResult) => {
+ const getEnvironmentQuery = jest.fn().mockResolvedValue({ data: resolvedEnvironment });
+ const getEnvironmentWithNamespaceQuery = jest
+ .fn()
+ .mockResolvedValue({ data: resolvedEnvironment });
+
+ const updateEnvironmentSuccess = jest
+ .fn()
+ .mockResolvedValue({ data: { environmentUpdate: environmentUpdateSuccess } });
+ const updateEnvironmentFail = jest
+ .fn()
+ .mockResolvedValue({ data: { environmentUpdate: environmentUpdateError } });
+
+ const createMockApolloProvider = (mutationHandler) => {
Vue.use(VueApollo);
const mocks = [
- [getEnvironment, jest.fn().mockResolvedValue({ data: resolvedEnvironment })],
- [
- updateEnvironment,
- jest.fn().mockResolvedValue({ data: { environmentUpdate: mutationResult } }),
- ],
+ [getEnvironment, getEnvironmentQuery],
+ [getEnvironmentWithNamespace, getEnvironmentWithNamespaceQuery],
+ [updateEnvironment, mutationHandler],
];
return createMockApollo(mocks);
};
- const createWrapper = () => {
- wrapper = mountExtended(EditEnvironment, {
- propsData: { environment: { id: '1', name: 'foo', external_url: 'https://foo.example.com' } },
- provide,
- });
- };
-
- const createWrapperWithApollo = async ({ mutationResult = environmentUpdate } = {}) => {
+ const createWrapperWithApollo = async ({
+ mutationHandler = updateEnvironmentSuccess,
+ kubernetesNamespaceForEnvironment = false,
+ } = {}) => {
wrapper = mountExtended(EditEnvironment, {
propsData: { environment: {} },
provide: {
...provide,
glFeatures: {
- environmentSettingsToGraphql: true,
+ kubernetesNamespaceForEnvironment,
},
},
- apolloProvider: createMockApolloProvider(mutationResult),
+ apolloProvider: createMockApolloProvider(mutationHandler),
});
await waitForPromises();
@@ -87,43 +90,46 @@ describe('~/environments/components/edit.vue', () => {
const showsLoading = () => wrapper.findComponent(GlLoadingIcon).exists();
- const submitForm = async () => {
- await findExternalUrlInput().setValue(newExternalUrl);
- await findForm().trigger('submit');
- };
-
describe('default', () => {
- beforeEach(async () => {
- await createWrapper();
+ it('performs the environment apollo query', () => {
+ createWrapperWithApollo();
+ expect(getEnvironmentQuery).toHaveBeenCalled();
+ });
+
+ it('renders loading icon when environment query is loading', () => {
+ createWrapperWithApollo();
+ expect(showsLoading()).toBe(true);
});
- it('sets the title to Edit environment', () => {
+ it('sets the title to Edit environment', async () => {
+ await createWrapperWithApollo();
+
const header = wrapper.findByRole('heading', { name: __('Edit environment') });
expect(header.exists()).toBe(true);
});
- it('renders a disabled "Name" field', () => {
- const nameInput = findNameInput();
+ it('renders a disabled "Name" field', async () => {
+ await createWrapperWithApollo();
+ const nameInput = findNameInput();
expect(nameInput.attributes().disabled).toBe('disabled');
expect(nameInput.element.value).toBe(environment.name);
});
- it('renders an "External URL" field', () => {
- const urlInput = findExternalUrlInput();
+ it('renders an "External URL" field', async () => {
+ await createWrapperWithApollo();
+ const urlInput = findExternalUrlInput();
expect(urlInput.element.value).toBe(environment.externalUrl);
});
});
- describe('when environmentSettingsToGraphql feature is enabled', () => {
- describe('when mounted', () => {
- beforeEach(() => {
- createWrapperWithApollo();
- });
- it('renders loading icon when environment query is loading', () => {
- expect(showsLoading()).toBe(true);
- });
+ describe('on submit', () => {
+ it('performs the updateEnvironment apollo mutation', async () => {
+ await createWrapperWithApollo();
+ await findForm().trigger('submit');
+
+ expect(updateEnvironmentSuccess).toHaveBeenCalled();
});
describe('when mutation successful', () => {
@@ -134,28 +140,28 @@ describe('~/environments/components/edit.vue', () => {
it('shows loader after form is submitted', async () => {
expect(showsLoading()).toBe(false);
- await submitForm();
+ await findForm().trigger('submit');
expect(showsLoading()).toBe(true);
});
it('submits the updated environment on submit', async () => {
- await submitForm();
+ await findForm().trigger('submit');
await waitForPromises();
- expect(visitUrl).toHaveBeenCalledWith(environmentUpdate.environment.path);
+ expect(visitUrl).toHaveBeenCalledWith(environmentUpdateSuccess.environment.path);
});
});
describe('when mutation failed', () => {
beforeEach(async () => {
await createWrapperWithApollo({
- mutationResult: environmentUpdateError,
+ mutationHandler: updateEnvironmentFail,
});
});
it('shows errors on error', async () => {
- await submitForm();
+ await findForm().trigger('submit');
await waitForPromises();
expect(createAlert).toHaveBeenCalledWith({ message: 'uh oh!' });
@@ -164,58 +170,10 @@ describe('~/environments/components/edit.vue', () => {
});
});
- describe('when environmentSettingsToGraphql feature is disabled', () => {
- beforeEach(() => {
- mock = new MockAdapter(axios);
- createWrapper();
- });
-
- afterEach(() => {
- mock.restore();
- });
-
- it('shows loader after form is submitted', async () => {
- expect(showsLoading()).toBe(false);
-
- mock
- .onPut(provide.updateEnvironmentPath, {
- external_url: newExternalUrl,
- id: environment.id,
- })
- .reply(...[HTTP_STATUS_OK, { path: '/test' }]);
-
- await submitForm();
-
- expect(showsLoading()).toBe(true);
- });
-
- it('submits the updated environment on submit', async () => {
- mock
- .onPut(provide.updateEnvironmentPath, {
- external_url: newExternalUrl,
- id: environment.id,
- })
- .reply(...[HTTP_STATUS_OK, { path: '/test' }]);
-
- await submitForm();
- await waitForPromises();
-
- expect(visitUrl).toHaveBeenCalledWith('/test');
- });
-
- it('shows errors on error', async () => {
- mock
- .onPut(provide.updateEnvironmentPath, {
- external_url: newExternalUrl,
- id: environment.id,
- })
- .reply(...[HTTP_STATUS_BAD_REQUEST, { message: ['uh oh!'] }]);
-
- await submitForm();
- await waitForPromises();
-
- expect(createAlert).toHaveBeenCalledWith({ message: 'uh oh!' });
- expect(showsLoading()).toBe(false);
+ describe('when `kubernetesNamespaceForEnvironment` is enabled', () => {
+ it('calls the `getEnvironmentWithNamespace` query', () => {
+ createWrapperWithApollo({ kubernetesNamespaceForEnvironment: true });
+ expect(getEnvironmentWithNamespaceQuery).toHaveBeenCalled();
});
});
});
diff --git a/spec/frontend/environments/environment_form_spec.js b/spec/frontend/environments/environment_form_spec.js
index db81c490747..803207bcce8 100644
--- a/spec/frontend/environments/environment_form_spec.js
+++ b/spec/frontend/environments/environment_form_spec.js
@@ -1,4 +1,4 @@
-import { GlLoadingIcon, GlCollapsibleListbox } from '@gitlab/ui';
+import { GlLoadingIcon, GlAlert } from '@gitlab/ui';
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import waitForPromises from 'helpers/wait_for_promises';
@@ -6,6 +6,7 @@ import { mountExtended } from 'helpers/vue_test_utils_helper';
import EnvironmentForm from '~/environments/components/environment_form.vue';
import getUserAuthorizedAgents from '~/environments/graphql/queries/user_authorized_agents.query.graphql';
import createMockApollo from '../__helpers__/mock_apollo_helper';
+import { mockKasTunnelUrl } from './mock_data';
jest.mock('~/lib/utils/csrf');
@@ -15,7 +16,10 @@ const DEFAULT_PROPS = {
cancelPath: '/cancel',
};
-const PROVIDE = { protectedEnvironmentSettingsPath: '/projects/not_real/settings/ci_cd' };
+const PROVIDE = {
+ protectedEnvironmentSettingsPath: '/projects/not_real/settings/ci_cd',
+ kasTunnelUrl: mockKasTunnelUrl,
+};
const userAccessAuthorizedAgents = [
{ agent: { id: '1', name: 'agent-1' } },
{ agent: { id: '2', name: 'agent-2' } },
@@ -24,6 +28,10 @@ const userAccessAuthorizedAgents = [
describe('~/environments/components/form.vue', () => {
let wrapper;
+ const getNamespacesQueryResult = jest
+ .fn()
+ .mockReturnValue([{ metadata: { name: 'default' } }, { metadata: { name: 'agent' } }]);
+
const createWrapper = (propsData = {}, options = {}) =>
mountExtended(EnvironmentForm, {
provide: PROVIDE,
@@ -34,37 +42,57 @@ describe('~/environments/components/form.vue', () => {
},
});
- const createWrapperWithApollo = ({ propsData = {} } = {}) => {
+ const createWrapperWithApollo = ({
+ propsData = {},
+ kubernetesNamespaceForEnvironment = false,
+ queryResult = null,
+ } = {}) => {
Vue.use(VueApollo);
+ const requestHandlers = [
+ [
+ getUserAuthorizedAgents,
+ jest.fn().mockResolvedValue({
+ data: {
+ project: {
+ id: '1',
+ userAccessAuthorizedAgents: { nodes: userAccessAuthorizedAgents },
+ },
+ },
+ }),
+ ],
+ ];
+
+ const mockResolvers = {
+ Query: {
+ k8sNamespaces: queryResult || getNamespacesQueryResult,
+ },
+ };
+
return mountExtended(EnvironmentForm, {
provide: {
...PROVIDE,
glFeatures: {
- environmentSettingsToGraphql: true,
+ kubernetesNamespaceForEnvironment,
},
},
propsData: {
...DEFAULT_PROPS,
...propsData,
},
- apolloProvider: createMockApollo([
- [
- getUserAuthorizedAgents,
- jest.fn().mockResolvedValue({
- data: {
- project: {
- id: '1',
- userAccessAuthorizedAgents: { nodes: userAccessAuthorizedAgents },
- },
- },
- }),
- ],
- ]),
+ apolloProvider: createMockApollo(requestHandlers, mockResolvers),
});
};
- const findAgentSelector = () => wrapper.findComponent(GlCollapsibleListbox);
+ const findAgentSelector = () => wrapper.findByTestId('agent-selector');
+ const findNamespaceSelector = () => wrapper.findByTestId('namespace-selector');
+ const findAlert = () => wrapper.findComponent(GlAlert);
+
+ const selectAgent = async () => {
+ findAgentSelector().vm.$emit('shown');
+ await waitForPromises();
+ await findAgentSelector().vm.$emit('select', '2');
+ };
describe('default', () => {
beforeEach(() => {
@@ -207,12 +235,6 @@ describe('~/environments/components/form.vue', () => {
expect(urlInput.element.value).toBe('https://example.com');
});
- });
-
- describe('when `environmentSettingsToGraphql feature flag is enabled', () => {
- beforeEach(() => {
- wrapper = createWrapperWithApollo();
- });
it('renders an agent selector listbox', () => {
expect(findAgentSelector().props()).toMatchObject({
@@ -224,6 +246,12 @@ describe('~/environments/components/form.vue', () => {
items: [],
});
});
+ });
+
+ describe('agent selector', () => {
+ beforeEach(() => {
+ wrapper = createWrapperWithApollo();
+ });
it('sets the items prop of the agent selector after fetching the list', async () => {
findAgentSelector().vm.$emit('shown');
@@ -253,24 +281,146 @@ describe('~/environments/components/form.vue', () => {
});
it('updates agent selector field with the name of selected agent', async () => {
- findAgentSelector().vm.$emit('shown');
- await waitForPromises();
- await findAgentSelector().vm.$emit('select', '2');
+ await selectAgent();
expect(findAgentSelector().props('toggleText')).toBe('agent-2');
});
it('emits changes to the clusterAgentId', async () => {
- findAgentSelector().vm.$emit('shown');
- await waitForPromises();
- await findAgentSelector().vm.$emit('select', '2');
+ await selectAgent();
expect(wrapper.emitted('change')).toEqual([
- [{ name: '', externalUrl: '', clusterAgentId: '2' }],
+ [{ name: '', externalUrl: '', clusterAgentId: '2', kubernetesNamespace: null }],
]);
});
});
+ describe('namespace selector', () => {
+ it("doesn't render namespace selector if `kubernetesNamespaceForEnvironment` feature flag is disabled", () => {
+ wrapper = createWrapperWithApollo();
+ expect(findNamespaceSelector().exists()).toBe(false);
+ });
+
+ describe('when `kubernetesNamespaceForEnvironment` feature flag is enabled', () => {
+ beforeEach(() => {
+ wrapper = createWrapperWithApollo({
+ kubernetesNamespaceForEnvironment: true,
+ });
+ });
+
+ it("doesn't render namespace selector by default", () => {
+ expect(findNamespaceSelector().exists()).toBe(false);
+ });
+
+ describe('when the agent was selected', () => {
+ beforeEach(async () => {
+ await selectAgent();
+ });
+
+ it('renders namespace selector', () => {
+ expect(findNamespaceSelector().exists()).toBe(true);
+ });
+
+ it('requests the kubernetes namespaces with the correct configuration', async () => {
+ const configuration = {
+ basePath: mockKasTunnelUrl.replace(/\/$/, ''),
+ baseOptions: {
+ headers: {
+ 'GitLab-Agent-Id': 2,
+ },
+ withCredentials: true,
+ },
+ };
+
+ await waitForPromises();
+
+ expect(getNamespacesQueryResult).toHaveBeenCalledWith(
+ {},
+ { configuration },
+ expect.anything(),
+ expect.anything(),
+ );
+ });
+
+ it('sets the loading prop while fetching the list', async () => {
+ expect(findNamespaceSelector().props('loading')).toBe(true);
+
+ await waitForPromises();
+
+ expect(findNamespaceSelector().props('loading')).toBe(false);
+ });
+
+ it('renders a list of available namespaces', async () => {
+ await waitForPromises();
+
+ expect(findNamespaceSelector().props('items')).toEqual([
+ { text: 'default', value: 'default' },
+ { text: 'agent', value: 'agent' },
+ ]);
+ });
+
+ it('filters the namespaces list on user search', async () => {
+ await waitForPromises();
+ await findNamespaceSelector().vm.$emit('search', 'default');
+
+ expect(findNamespaceSelector().props('items')).toEqual([
+ { value: 'default', text: 'default' },
+ ]);
+ });
+
+ it('updates namespace selector field with the name of selected namespace', async () => {
+ await waitForPromises();
+ await findNamespaceSelector().vm.$emit('select', 'agent');
+
+ expect(findNamespaceSelector().props('toggleText')).toBe('agent');
+ });
+
+ it('emits changes to the kubernetesNamespace', async () => {
+ await waitForPromises();
+ await findNamespaceSelector().vm.$emit('select', 'agent');
+
+ expect(wrapper.emitted('change')[1]).toEqual([
+ { name: '', externalUrl: '', kubernetesNamespace: 'agent' },
+ ]);
+ });
+
+ it('clears namespace selector when another agent was selected', async () => {
+ await waitForPromises();
+ await findNamespaceSelector().vm.$emit('select', 'agent');
+
+ expect(findNamespaceSelector().props('toggleText')).toBe('agent');
+
+ await findAgentSelector().vm.$emit('select', '1');
+ expect(findNamespaceSelector().props('toggleText')).toBe(
+ EnvironmentForm.i18n.namespaceHelpText,
+ );
+ });
+ });
+
+ describe('when cannot connect to the cluster', () => {
+ const error = new Error('Error from the cluster_client API');
+
+ beforeEach(async () => {
+ wrapper = createWrapperWithApollo({
+ kubernetesNamespaceForEnvironment: true,
+ queryResult: jest.fn().mockRejectedValueOnce(error),
+ });
+
+ await selectAgent();
+ await waitForPromises();
+ });
+
+ it("doesn't render the namespace selector", () => {
+ expect(findNamespaceSelector().exists()).toBe(false);
+ });
+
+ it('renders an alert', () => {
+ expect(findAlert().text()).toBe('Error from the cluster_client API');
+ });
+ });
+ });
+ });
+
describe('when environment has an associated agent', () => {
const environmentWithAgent = {
...DEFAULT_PROPS.environment,
@@ -280,11 +430,46 @@ describe('~/environments/components/form.vue', () => {
beforeEach(() => {
wrapper = createWrapperWithApollo({
propsData: { environment: environmentWithAgent },
+ kubernetesNamespaceForEnvironment: true,
});
});
it('updates agent selector field with the name of the associated agent', () => {
expect(findAgentSelector().props('toggleText')).toBe('agent-1');
});
+
+ it('renders namespace selector', async () => {
+ await waitForPromises();
+ expect(findNamespaceSelector().exists()).toBe(true);
+ });
+
+ it('renders a list of available namespaces', async () => {
+ await waitForPromises();
+
+ expect(findNamespaceSelector().props('items')).toEqual([
+ { text: 'default', value: 'default' },
+ { text: 'agent', value: 'agent' },
+ ]);
+ });
+ });
+
+ describe('when environment has an associated kubernetes namespace', () => {
+ const environmentWithAgentAndNamespace = {
+ ...DEFAULT_PROPS.environment,
+ clusterAgent: { id: '1', name: 'agent-1' },
+ clusterAgentId: '1',
+ kubernetesNamespace: 'default',
+ };
+ beforeEach(() => {
+ wrapper = createWrapperWithApollo({
+ propsData: { environment: environmentWithAgentAndNamespace },
+ kubernetesNamespaceForEnvironment: true,
+ });
+ });
+
+ it('updates namespace selector with the name of the associated namespace', async () => {
+ await waitForPromises();
+ expect(findNamespaceSelector().props('toggleText')).toBe('default');
+ });
});
});
diff --git a/spec/frontend/environments/graphql/mock_data.js b/spec/frontend/environments/graphql/mock_data.js
index 91268ade1e9..c2eafa5f51e 100644
--- a/spec/frontend/environments/graphql/mock_data.js
+++ b/spec/frontend/environments/graphql/mock_data.js
@@ -909,3 +909,8 @@ export const k8sWorkloadsMock = {
JobList: [completedJob, completedJob, failedJob],
CronJobList: [completedCronJob, suspendedCronJob, failedCronJob],
};
+
+export const k8sNamespacesMock = [
+ { metadata: { name: 'default' } },
+ { metadata: { name: 'agent' } },
+];
diff --git a/spec/frontend/environments/graphql/resolvers_spec.js b/spec/frontend/environments/graphql/resolvers_spec.js
index edffc00e185..be210ed619e 100644
--- a/spec/frontend/environments/graphql/resolvers_spec.js
+++ b/spec/frontend/environments/graphql/resolvers_spec.js
@@ -12,6 +12,7 @@ import pollIntervalQuery from '~/environments/graphql/queries/poll_interval.quer
import isEnvironmentStoppingQuery from '~/environments/graphql/queries/is_environment_stopping.query.graphql';
import pageInfoQuery from '~/environments/graphql/queries/page_info.query.graphql';
import { TEST_HOST } from 'helpers/test_constants';
+import { CLUSTER_AGENT_ERROR_MESSAGES } from '~/environments/constants';
import {
environmentsApp,
resolvedEnvironmentsApp,
@@ -20,6 +21,7 @@ import {
resolvedFolder,
k8sPodsMock,
k8sServicesMock,
+ k8sNamespacesMock,
} from './mock_data';
const ENDPOINT = `${TEST_HOST}/environments`;
@@ -319,6 +321,50 @@ describe('~/frontend/environments/graphql/resolvers', () => {
);
});
});
+ describe('k8sNamespaces', () => {
+ const mockNamespacesListFn = jest.fn().mockImplementation(() => {
+ return Promise.resolve({
+ data: {
+ items: k8sNamespacesMock,
+ },
+ });
+ });
+
+ beforeEach(() => {
+ jest
+ .spyOn(CoreV1Api.prototype, 'listCoreV1Namespace')
+ .mockImplementation(mockNamespacesListFn);
+ });
+
+ it('should request all namespaces from the cluster_client library', async () => {
+ const namespaces = await mockResolvers.Query.k8sNamespaces(null, { configuration });
+
+ expect(mockNamespacesListFn).toHaveBeenCalled();
+
+ expect(namespaces).toEqual(k8sNamespacesMock);
+ });
+ it.each([
+ ['Unauthorized', CLUSTER_AGENT_ERROR_MESSAGES.unauthorized],
+ ['Forbidden', CLUSTER_AGENT_ERROR_MESSAGES.forbidden],
+ ['Not found', CLUSTER_AGENT_ERROR_MESSAGES['not found']],
+ ['Unknown', CLUSTER_AGENT_ERROR_MESSAGES.other],
+ ])(
+ 'should throw an error if the API call fails with the reason "%s"',
+ async (reason, message) => {
+ jest.spyOn(CoreV1Api.prototype, 'listCoreV1Namespace').mockRejectedValue({
+ response: {
+ data: {
+ reason,
+ },
+ },
+ });
+
+ await expect(mockResolvers.Query.k8sNamespaces(null, { configuration })).rejects.toThrow(
+ message,
+ );
+ },
+ );
+ });
describe('stopEnvironmentREST', () => {
it('should post to the stop environment path', async () => {
mock.onPost(ENDPOINT).reply(HTTP_STATUS_OK);
diff --git a/spec/frontend/environments/new_environment_item_spec.js b/spec/frontend/environments/new_environment_item_spec.js
index eb6990ba8a8..387bc31c9aa 100644
--- a/spec/frontend/environments/new_environment_item_spec.js
+++ b/spec/frontend/environments/new_environment_item_spec.js
@@ -13,6 +13,7 @@ import Deployment from '~/environments/components/deployment.vue';
import DeployBoardWrapper from '~/environments/components/deploy_board_wrapper.vue';
import KubernetesOverview from '~/environments/components/kubernetes_overview.vue';
import getEnvironmentClusterAgent from '~/environments/graphql/queries/environment_cluster_agent.query.graphql';
+import getEnvironmentClusterAgentWithNamespace from '~/environments/graphql/queries/environment_cluster_agent_with_namespace.query.graphql';
import { resolvedEnvironment, rolloutStatus, agent } from './graphql/mock_data';
import { mockKasTunnelUrl } from './mock_data';
@@ -21,6 +22,7 @@ Vue.use(VueApollo);
describe('~/environments/components/new_environment_item.vue', () => {
let wrapper;
let queryResponseHandler;
+ let queryWithNamespaceResponseHandler;
const projectPath = '/1';
@@ -37,7 +39,21 @@ describe('~/environments/components/new_environment_item.vue', () => {
},
};
queryResponseHandler = jest.fn().mockResolvedValue(response);
- return createMockApollo([[getEnvironmentClusterAgent, queryResponseHandler]]);
+ queryWithNamespaceResponseHandler = jest.fn().mockResolvedValue({
+ data: {
+ project: {
+ id: response.data.project.id,
+ environment: {
+ ...response.data.project.environment,
+ kubernetesNamespace: 'default',
+ },
+ },
+ },
+ });
+ return createMockApollo([
+ [getEnvironmentClusterAgent, queryResponseHandler],
+ [getEnvironmentClusterAgentWithNamespace, queryWithNamespaceResponseHandler],
+ ]);
};
const createWrapper = ({ propsData = {}, provideData = {}, apolloProvider } = {}) =>
@@ -521,11 +537,6 @@ describe('~/environments/components/new_environment_item.vue', () => {
it('should request agent data when the environment is visible if the feature flag is enabled', async () => {
wrapper = createWrapper({
propsData: { environment: resolvedEnvironment },
- provideData: {
- glFeatures: {
- kasUserAccessProject: true,
- },
- },
apolloProvider: createApolloProvider(agent),
});
@@ -537,45 +548,62 @@ describe('~/environments/components/new_environment_item.vue', () => {
});
});
- it('should render if the feature flag is enabled and the environment has an agent associated', async () => {
+ it('should request agent data with kubernetes namespace when `kubernetesNamespaceForEnvironment` feature flag is enabled', async () => {
wrapper = createWrapper({
propsData: { environment: resolvedEnvironment },
provideData: {
glFeatures: {
- kasUserAccessProject: true,
+ kubernetesNamespaceForEnvironment: true,
},
},
apolloProvider: createApolloProvider(agent),
});
await expandCollapsedSection();
- await waitForPromises();
- expect(findKubernetesOverview().props()).toMatchObject({
- clusterAgent: agent,
+ expect(queryWithNamespaceResponseHandler).toHaveBeenCalledWith({
+ environmentName: resolvedEnvironment.name,
+ projectFullPath: projectPath,
});
});
- it('should not render if the feature flag is not enabled', async () => {
+ it('should render if the environment has an agent associated', async () => {
wrapper = createWrapper({
propsData: { environment: resolvedEnvironment },
apolloProvider: createApolloProvider(agent),
});
await expandCollapsedSection();
+ await waitForPromises();
- expect(queryResponseHandler).not.toHaveBeenCalled();
- expect(findKubernetesOverview().exists()).toBe(false);
+ expect(findKubernetesOverview().props()).toMatchObject({
+ clusterAgent: agent,
+ });
});
- it('should not render if the environment has no agent object', async () => {
+ it('should render with the namespace if `kubernetesNamespaceForEnvironment` feature flag is enabled and the environment has an agent associated', async () => {
wrapper = createWrapper({
propsData: { environment: resolvedEnvironment },
provideData: {
glFeatures: {
- kasUserAccessProject: true,
+ kubernetesNamespaceForEnvironment: true,
},
},
+ apolloProvider: createApolloProvider(agent),
+ });
+
+ await expandCollapsedSection();
+ await waitForPromises();
+
+ expect(findKubernetesOverview().props()).toMatchObject({
+ clusterAgent: agent,
+ namespace: 'default',
+ });
+ });
+
+ it('should not render if the environment has no agent object', async () => {
+ wrapper = createWrapper({
+ propsData: { environment: resolvedEnvironment },
apolloProvider: createApolloProvider(),
});
diff --git a/spec/frontend/environments/new_environment_spec.js b/spec/frontend/environments/new_environment_spec.js
index 749e4e5caa4..30cd9265d0d 100644
--- a/spec/frontend/environments/new_environment_spec.js
+++ b/spec/frontend/environments/new_environment_spec.js
@@ -1,5 +1,4 @@
import { GlLoadingIcon } from '@gitlab/ui';
-import MockAdapter from 'axios-mock-adapter';
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import { mountExtended } from 'helpers/vue_test_utils_helper';
@@ -7,8 +6,6 @@ import waitForPromises from 'helpers/wait_for_promises';
import NewEnvironment from '~/environments/components/new_environment.vue';
import createEnvironment from '~/environments/graphql/mutations/create_environment.mutation.graphql';
import { createAlert } from '~/alert';
-import axios from '~/lib/utils/axios_utils';
-import { HTTP_STATUS_BAD_REQUEST, HTTP_STATUS_OK } from '~/lib/utils/http_status';
import { visitUrl } from '~/lib/utils/url_utility';
import { __ } from '~/locale';
import createMockApollo from '../__helpers__/mock_apollo_helper';
@@ -16,9 +13,6 @@ import createMockApollo from '../__helpers__/mock_apollo_helper';
jest.mock('~/lib/utils/url_utility');
jest.mock('~/alert');
-const newName = 'test';
-const newExternalUrl = 'https://google.ca';
-
const provide = {
projectEnvironmentsPath: '/projects/environments',
projectPath: '/path/to/project',
@@ -32,7 +26,6 @@ const environmentCreateError = {
describe('~/environments/components/new.vue', () => {
let wrapper;
- let mock;
const createMockApolloProvider = (mutationResult) => {
Vue.use(VueApollo);
@@ -47,29 +40,13 @@ describe('~/environments/components/new.vue', () => {
const createWrapperWithApollo = async (mutationResult = environmentCreate) => {
wrapper = mountExtended(NewEnvironment, {
- provide: {
- ...provide,
- glFeatures: {
- environmentSettingsToGraphql: true,
- },
- },
+ provide,
apolloProvider: createMockApolloProvider(mutationResult),
});
await waitForPromises();
};
- const createWrapperWithAxios = () => {
- wrapper = mountExtended(NewEnvironment, {
- provide: {
- ...provide,
- glFeatures: {
- environmentSettingsToGraphql: false,
- },
- },
- });
- };
-
const findNameInput = () => wrapper.findByLabelText(__('Name'));
const findExternalUrlInput = () => wrapper.findByLabelText(__('External URL'));
const findForm = () => wrapper.findByRole('form', { name: __('New environment') });
@@ -84,7 +61,7 @@ describe('~/environments/components/new.vue', () => {
describe('default', () => {
beforeEach(() => {
- createWrapperWithAxios();
+ createWrapperWithApollo();
});
it('sets the title to New environment', () => {
@@ -103,93 +80,36 @@ describe('~/environments/components/new.vue', () => {
});
});
- describe('when environmentSettingsToGraphql feature is enabled', () => {
- describe('when mutation successful', () => {
- beforeEach(() => {
- createWrapperWithApollo();
- });
-
- it('shows loader after form is submitted', async () => {
- expect(showsLoading()).toBe(false);
-
- await submitForm();
-
- expect(showsLoading()).toBe(true);
- });
-
- it('submits the new environment on submit', async () => {
- submitForm();
- await waitForPromises();
-
- expect(visitUrl).toHaveBeenCalledWith('path/to/environment');
- });
- });
-
- describe('when failed', () => {
- beforeEach(async () => {
- createWrapperWithApollo(environmentCreateError);
- submitForm();
- await waitForPromises();
- });
-
- it('shows errors on error', () => {
- expect(createAlert).toHaveBeenCalledWith({ message: 'uh oh!' });
- expect(showsLoading()).toBe(false);
- });
- });
- });
-
- describe('when environmentSettingsToGraphql feature is disabled', () => {
+ describe('when mutation successful', () => {
beforeEach(() => {
- mock = new MockAdapter(axios);
- createWrapperWithAxios();
- });
-
- afterEach(() => {
- mock.restore();
+ createWrapperWithApollo();
});
it('shows loader after form is submitted', async () => {
expect(showsLoading()).toBe(false);
- mock
- .onPost(provide.projectEnvironmentsPath, {
- name: newName,
- external_url: newExternalUrl,
- })
- .reply(HTTP_STATUS_OK, { path: '/test' });
-
await submitForm();
expect(showsLoading()).toBe(true);
});
it('submits the new environment on submit', async () => {
- mock
- .onPost(provide.projectEnvironmentsPath, {
- name: newName,
- external_url: newExternalUrl,
- })
- .reply(HTTP_STATUS_OK, { path: '/test' });
-
- await submitForm();
+ submitForm();
await waitForPromises();
- expect(visitUrl).toHaveBeenCalledWith('/test');
+ expect(visitUrl).toHaveBeenCalledWith('path/to/environment');
});
+ });
- it('shows errors on error', async () => {
- mock
- .onPost(provide.projectEnvironmentsPath, {
- name: newName,
- external_url: newExternalUrl,
- })
- .reply(HTTP_STATUS_BAD_REQUEST, { message: ['name taken'] });
-
- await submitForm();
+ describe('when failed', () => {
+ beforeEach(async () => {
+ createWrapperWithApollo(environmentCreateError);
+ submitForm();
await waitForPromises();
+ });
- expect(createAlert).toHaveBeenCalledWith({ message: 'name taken' });
+ it('display errors', () => {
+ expect(createAlert).toHaveBeenCalledWith({ message: 'uh oh!' });
expect(showsLoading()).toBe(false);
});
});
diff --git a/spec/frontend/error_tracking/components/error_details_spec.js b/spec/frontend/error_tracking/components/error_details_spec.js
index c9238c4b636..6ef34504da7 100644
--- a/spec/frontend/error_tracking/components/error_details_spec.js
+++ b/spec/frontend/error_tracking/components/error_details_spec.js
@@ -6,6 +6,9 @@ import {
GlFormInput,
GlAlert,
GlSprintf,
+ GlDisclosureDropdown,
+ GlDisclosureDropdownItem,
+ GlDisclosureDropdownGroup,
} from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
@@ -46,7 +49,13 @@ describe('ErrorDetails', () => {
function mountComponent({ integratedErrorTrackingEnabled = false } = {}) {
wrapper = shallowMount(ErrorDetails, {
- stubs: { GlButton, GlSprintf },
+ stubs: {
+ GlButton,
+ GlSprintf,
+ GlDisclosureDropdown,
+ GlDisclosureDropdownItem,
+ GlDisclosureDropdownGroup,
+ },
store,
mocks,
propsData: {
diff --git a/spec/frontend/fixtures/groups.rb b/spec/frontend/fixtures/groups.rb
index 9c22ff176ff..e69287c879b 100644
--- a/spec/frontend/fixtures/groups.rb
+++ b/spec/frontend/fixtures/groups.rb
@@ -2,24 +2,39 @@
require 'spec_helper'
-RSpec.describe 'Groups (JavaScript fixtures)', type: :controller do
+RSpec.describe 'Groups (JavaScript fixtures)', feature_category: :groups_and_projects do
+ include ApiHelpers
include JavaScriptFixturesHelpers
- let(:user) { create(:user) }
- let(:group) { create(:group, name: 'frontend-fixtures-group', runners_token: 'runnerstoken:intabulasreferre') }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group, name: 'frontend-fixtures-group', runners_token: 'runnerstoken:intabulasreferre') }
+ let_it_be(:projects) { create_list(:project, 2, namespace: group) }
- before do
- group.add_owner(user)
- sign_in(user)
- end
+ describe GroupsController, '(JavaScript fixtures)', type: :controller do
+ render_views
- render_views
+ before do
+ group.add_owner(user)
+ sign_in(user)
+ end
- describe GroupsController, '(JavaScript fixtures)', type: :controller do
it 'groups/edit.html' do
get :edit, params: { id: group }
expect(response).to be_successful
end
end
+
+ describe API::Groups, '(JavaScript fixtures)', type: :request do
+ before do
+ group.add_owner(user)
+ sign_in(user)
+ end
+
+ it 'api/groups/projects/get.json' do
+ get api("/groups/#{group.id}/projects", user)
+
+ expect(response).to be_successful
+ end
+ end
end
diff --git a/spec/frontend/fixtures/issues.rb b/spec/frontend/fixtures/issues.rb
index e85e683b599..73594ddf686 100644
--- a/spec/frontend/fixtures/issues.rb
+++ b/spec/frontend/fixtures/issues.rb
@@ -105,7 +105,6 @@ RSpec.describe GraphQL::Query, type: :request do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project) }
- let_it_be(:issue_type) { 'issue' }
before_all do
project.add_reporter(user)
@@ -128,8 +127,7 @@ RSpec.describe GraphQL::Query, type: :request do
title: '15.2',
start_date: Date.new(2020, 7, 1),
due_date: Date.new(2020, 7, 30)
- ),
- issue_type: issue_type
+ )
)
post_graphql(query, current_user: user, variables: { projectPath: project.full_path, iid: issue.iid.to_s })
diff --git a/spec/frontend/fixtures/metrics_dashboard.rb b/spec/frontend/fixtures/metrics_dashboard.rb
deleted file mode 100644
index 036ce9eea3a..00000000000
--- a/spec/frontend/fixtures/metrics_dashboard.rb
+++ /dev/null
@@ -1,42 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe MetricsDashboard, '(JavaScript fixtures)', type: :controller do
- include JavaScriptFixturesHelpers
- include MetricsDashboardHelpers
-
- let_it_be(:user) { create(:user) }
- let_it_be(:namespace) { create(:namespace, name: 'monitoring') }
- let_it_be(:project) { project_with_dashboard_namespace('.gitlab/dashboards/test.yml', nil, namespace: namespace) }
- let_it_be(:environment) { create(:environment, id: 1, project: project) }
- let_it_be(:params) { { environment: environment } }
-
- controller(::ApplicationController) do
- include MetricsDashboard
- end
-
- before do
- stub_feature_flags(remove_monitor_metrics: false)
- sign_in(user)
- project.add_maintainer(user)
-
- allow(controller).to receive(:project).and_return(project)
- allow(controller).to receive(:environment).and_return(environment)
- allow(controller)
- .to receive(:metrics_dashboard_params)
- .and_return(params)
- end
-
- after do
- remove_repository(project)
- end
-
- it 'metrics_dashboard/environment_metrics_dashboard.json' do
- routes.draw { get "metrics_dashboard" => "anonymous#metrics_dashboard" }
-
- response = get :metrics_dashboard, format: :json
-
- expect(response).to be_successful
- end
-end
diff --git a/spec/frontend/fixtures/milestones.rb b/spec/frontend/fixtures/milestones.rb
deleted file mode 100644
index 5e39dcf190a..00000000000
--- a/spec/frontend/fixtures/milestones.rb
+++ /dev/null
@@ -1,43 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Projects::MilestonesController, '(JavaScript fixtures)', :with_license, feature_category: :team_planning, type: :controller do
- include JavaScriptFixturesHelpers
-
- let_it_be(:user) { create(:user, feed_token: 'feedtoken:coldfeed') }
- let_it_be(:namespace) { create(:namespace, name: 'frontend-fixtures') }
- let_it_be(:project) { create(:project_empty_repo, namespace: namespace, path: 'milestones-project') }
-
- render_views
-
- before do
- project.add_maintainer(user)
- sign_in(user)
- end
-
- after do
- remove_repository(project)
- end
-
- it 'milestones/new-milestone.html' do
- get :new, params: {
- namespace_id: project.namespace.to_param,
- project_id: project
- }
-
- expect(response).to be_successful
- end
-
- private
-
- def render_milestone(milestone)
- get :show, params: {
- namespace_id: project.namespace.to_param,
- project_id: project,
- id: milestone.to_param
- }
-
- expect(response).to be_successful
- end
-end
diff --git a/spec/frontend/fixtures/pipeline_schedules.rb b/spec/frontend/fixtures/pipeline_schedules.rb
index 3bfe9113e83..7bba7910b87 100644
--- a/spec/frontend/fixtures/pipeline_schedules.rb
+++ b/spec/frontend/fixtures/pipeline_schedules.rb
@@ -63,6 +63,12 @@ RSpec.describe 'Pipeline schedules (JavaScript fixtures)' do
expect_graphql_errors_to_be_empty
end
+ it "#{fixtures_path}#{get_pipeline_schedules_query}.single.json" do
+ post_graphql(query, current_user: user, variables: { projectPath: project.full_path, ids: pipeline_schedule_populated.id })
+
+ expect_graphql_errors_to_be_empty
+ end
+
it "#{fixtures_path}#{get_pipeline_schedules_query}.as_guest.json" do
guest = create(:user)
project.add_guest(user)
diff --git a/spec/frontend/fixtures/static/line_highlighter.html b/spec/frontend/fixtures/static/line_highlighter.html
index 1667097bc3b..4e1795dfcfa 100644
--- a/spec/frontend/fixtures/static/line_highlighter.html
+++ b/spec/frontend/fixtures/static/line_highlighter.html
@@ -1,154 +1,79 @@
<div class="file-holder">
<div class="file-content">
<div class="line-numbers">
-<a data-line-number="1" href="#L1" id="L1">
-<svg data-testid="link-icon" class="s12">
-<use href="/assets/icons-795a2ef2fd636a0538bbef3b8d2787dd90927b42d7617fdda8620930016b333d.svg#link"></use>
-</svg>
+<a data-line-number="1" href="#L1" id="L1">
1
</a>
-<a data-line-number="2" href="#L2" id="L2">
-<svg data-testid="link-icon" class="s12">
-<use href="/assets/icons-795a2ef2fd636a0538bbef3b8d2787dd90927b42d7617fdda8620930016b333d.svg#link"></use>
-</svg>
+<a data-line-number="2" href="#L2" id="L2">
2
</a>
-<a data-line-number="3" href="#L3" id="L3">
-<svg data-testid="link-icon" class="s12">
-<use href="/assets/icons-795a2ef2fd636a0538bbef3b8d2787dd90927b42d7617fdda8620930016b333d.svg#link"></use>
-</svg>
+<a data-line-number="3" href="#L3" id="L3">
3
</a>
-<a data-line-number="4" href="#L4" id="L4">
-<svg data-testid="link-icon" class="s12">
-<use href="/assets/icons-795a2ef2fd636a0538bbef3b8d2787dd90927b42d7617fdda8620930016b333d.svg#link"></use>
-</svg>
+<a data-line-number="4" href="#L4" id="L4">
4
</a>
-<a data-line-number="5" href="#L5" id="L5">
-<svg data-testid="link-icon" class="s12">
-<use href="/assets/icons-795a2ef2fd636a0538bbef3b8d2787dd90927b42d7617fdda8620930016b333d.svg#link"></use>
-</svg>
+<a data-line-number="5" href="#L5" id="L5">
5
</a>
<a data-line-number="6" href="#L6" id="L6">
-<svg data-testid="link-icon" class="s12">
-<use href="/assets/icons-795a2ef2fd636a0538bbef3b8d2787dd90927b42d7617fdda8620930016b333d.svg#link"></use>
-</svg>
6
</a>
<a data-line-number="7" href="#L7" id="L7">
-<svg data-testid="link-icon" class="s12">
-<use href="/assets/icons-795a2ef2fd636a0538bbef3b8d2787dd90927b42d7617fdda8620930016b333d.svg#link"></use>
-</svg>
7
</a>
<a data-line-number="8" href="#L8" id="L8">
-<svg data-testid="link-icon" class="s12">
-<use href="/assets/icons-795a2ef2fd636a0538bbef3b8d2787dd90927b42d7617fdda8620930016b333d.svg#link"></use>
-</svg>
8
</a>
<a data-line-number="9" href="#L9" id="L9">
-<svg data-testid="link-icon" class="s12">
-<use href="/assets/icons-795a2ef2fd636a0538bbef3b8d2787dd90927b42d7617fdda8620930016b333d.svg#link"></use>
-</svg>
9
</a>
<a data-line-number="10" href="#L10" id="L10">
-<svg data-testid="link-icon" class="s12">
-<use href="/assets/icons-795a2ef2fd636a0538bbef3b8d2787dd90927b42d7617fdda8620930016b333d.svg#link"></use>
-</svg>
10
</a>
<a data-line-number="11" href="#L11" id="L11">
-<svg data-testid="link-icon" class="s12">
-<use href="/assets/icons-795a2ef2fd636a0538bbef3b8d2787dd90927b42d7617fdda8620930016b333d.svg#link"></use>
-</svg>
11
</a>
<a data-line-number="12" href="#L12" id="L12">
-<svg data-testid="link-icon" class="s12">
-<use href="/assets/icons-795a2ef2fd636a0538bbef3b8d2787dd90927b42d7617fdda8620930016b333d.svg#link"></use>
-</svg>
12
</a>
<a data-line-number="13" href="#L13" id="L13">
-<svg data-testid="link-icon" class="s12">
-<use href="/assets/icons-795a2ef2fd636a0538bbef3b8d2787dd90927b42d7617fdda8620930016b333d.svg#link"></use>
-</svg>
13
</a>
<a data-line-number="14" href="#L14" id="L14">
-<svg data-testid="link-icon" class="s12">
-<use href="/assets/icons-795a2ef2fd636a0538bbef3b8d2787dd90927b42d7617fdda8620930016b333d.svg#link"></use>
-</svg>
14
</a>
<a data-line-number="15" href="#L15" id="L15">
-<svg data-testid="link-icon" class="s12">
-<use href="/assets/icons-795a2ef2fd636a0538bbef3b8d2787dd90927b42d7617fdda8620930016b333d.svg#link"></use>
-</svg>
15
</a>
<a data-line-number="16" href="#L16" id="L16">
-<svg data-testid="link-icon" class="s12">
-<use href="/assets/icons-795a2ef2fd636a0538bbef3b8d2787dd90927b42d7617fdda8620930016b333d.svg#link"></use>
-</svg>
16
</a>
<a data-line-number="17" href="#L17" id="L17">
-<svg data-testid="link-icon" class="s12">
-<use href="/assets/icons-795a2ef2fd636a0538bbef3b8d2787dd90927b42d7617fdda8620930016b333d.svg#link"></use>
-</svg>
17
</a>
<a data-line-number="18" href="#L18" id="L18">
-<svg data-testid="link-icon" class="s12">
-<use href="/assets/icons-795a2ef2fd636a0538bbef3b8d2787dd90927b42d7617fdda8620930016b333d.svg#link"></use>
-</svg>
18
</a>
<a data-line-number="19" href="#L19" id="L19">
-<svg data-testid="link-icon" class="s12">
-<use href="/assets/icons-795a2ef2fd636a0538bbef3b8d2787dd90927b42d7617fdda8620930016b333d.svg#link"></use>
-</svg>
19
</a>
<a data-line-number="20" href="#L20" id="L20">
-<svg data-testid="link-icon" class="s12">
-<use href="/assets/icons-795a2ef2fd636a0538bbef3b8d2787dd90927b42d7617fdda8620930016b333d.svg#link"></use>
-</svg>
20
</a>
<a data-line-number="21" href="#L21" id="L21">
-<svg data-testid="link-icon" class="s12">
-<use href="/assets/icons-795a2ef2fd636a0538bbef3b8d2787dd90927b42d7617fdda8620930016b333d.svg#link"></use>
-</svg>
21
</a>
<a data-line-number="22" href="#L22" id="L22">
-<svg data-testid="link-icon" class="s12">
-<use href="/assets/icons-795a2ef2fd636a0538bbef3b8d2787dd90927b42d7617fdda8620930016b333d.svg#link"></use>
-</svg>
22
</a>
<a data-line-number="23" href="#L23" id="L23">
-<svg data-testid="link-icon" class="s12">
-<use href="/assets/icons-795a2ef2fd636a0538bbef3b8d2787dd90927b42d7617fdda8620930016b333d.svg#link"></use>
-</svg>
23
</a>
<a data-line-number="24" href="#L24" id="L24">
-<svg data-testid="link-icon" class="s12">
-<use href="/assets/icons-795a2ef2fd636a0538bbef3b8d2787dd90927b42d7617fdda8620930016b333d.svg#link"></use>
-</svg>
24
</a>
<a data-line-number="25" href="#L25" id="L25">
-<svg data-testid="link-icon" class="s12">
-<use href="/assets/icons-795a2ef2fd636a0538bbef3b8d2787dd90927b42d7617fdda8620930016b333d.svg#link"></use>
-</svg>
25
</a>
</div>
diff --git a/spec/frontend/fixtures/static/textarea.html b/spec/frontend/fixtures/static/textarea.html
new file mode 100644
index 00000000000..68d5a0f2d4d
--- /dev/null
+++ b/spec/frontend/fixtures/static/textarea.html
@@ -0,0 +1,27 @@
+<body>
+<meta charset="utf-8">
+<title>Document with Textarea</title>
+<form class="milestone-form common-note-form js-quick-submit js-requires-input" id="new_milestone"
+ action="http://test.host/frontend-fixtures/milestones-project/-/milestones"
+ accept-charset="UTF-8" method="post">
+ <div class="form-group">
+ <div class="md-write-holder">
+ <div class="zen-backdrop">
+ <textarea class="note-textarea js-gfm-input js-autosize markdown-area"
+ placeholder="Write milestone description..." dir="auto"
+ data-supports-quick-actions="false" data-supports-autocomplete="true"
+ data-qa-selector="milestone_description_field" data-autofocus="false"
+ name="milestone[description]"
+ id="milestone_description"></textarea>
+ <a class="zen-control zen-control-leave js-zen-leave gl-text-gray-500"
+ href="#">
+ <svg class="s16" data-testid="minimize-icon">
+ <use href="http://test.host/assets/icons-b8c5a9711f73b1de3c81754da0aca72f43b0e6844aa06dd03092b601a493f45b.svg#minimize"></use>
+ </svg>
+ </a>
+ </div>
+ </div>
+ </div>
+</form>
+
+</body>
diff --git a/spec/frontend/fixtures/timezones.rb b/spec/frontend/fixtures/timezones.rb
index 2393f4e797d..f04e647c8eb 100644
--- a/spec/frontend/fixtures/timezones.rb
+++ b/spec/frontend/fixtures/timezones.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
RSpec.describe TimeZoneHelper, '(JavaScript fixtures)' do
include JavaScriptFixturesHelpers
- include TimeZoneHelper
+ include described_class
let(:response) { @timezones.sort_by! { |tz| tz[:name] }.to_json }
diff --git a/spec/frontend/fixtures/users.rb b/spec/frontend/fixtures/users.rb
index 89bffea7e4c..800a9af194e 100644
--- a/spec/frontend/fixtures/users.rb
+++ b/spec/frontend/fixtures/users.rb
@@ -7,7 +7,8 @@ RSpec.describe 'Users (JavaScript fixtures)', feature_category: :user_profile do
include ApiHelpers
let_it_be(:followers) { create_list(:user, 5) }
- let_it_be(:user) { create(:user, followers: followers) }
+ let_it_be(:followees) { create_list(:user, 5) }
+ let_it_be(:user) { create(:user, followers: followers, followees: followees) }
describe API::Users, '(JavaScript fixtures)', type: :request do
it 'api/users/followers/get.json' do
@@ -15,6 +16,12 @@ RSpec.describe 'Users (JavaScript fixtures)', feature_category: :user_profile do
expect(response).to be_successful
end
+
+ it 'api/users/following/get.json' do
+ get api("/users/#{user.id}/following", user)
+
+ expect(response).to be_successful
+ end
end
describe UsersController, '(JavaScript fixtures)', type: :controller do
diff --git a/spec/frontend/frequent_items/mock_data.js b/spec/frontend/frequent_items/mock_data.js
index 5e15b4b33e0..6563daee6c3 100644
--- a/spec/frontend/frequent_items/mock_data.js
+++ b/spec/frontend/frequent_items/mock_data.js
@@ -69,7 +69,7 @@ export const mockFrequentGroups = [
},
];
-export const mockSearchedGroups = [mockRawGroup];
+export const mockSearchedGroups = { data: [mockRawGroup] };
export const mockProcessedSearchedGroups = [mockGroup];
export const mockProject = {
diff --git a/spec/frontend/gfm_auto_complete_spec.js b/spec/frontend/gfm_auto_complete_spec.js
index 73284fbe5e5..2d19c9871b6 100644
--- a/spec/frontend/gfm_auto_complete_spec.js
+++ b/spec/frontend/gfm_auto_complete_spec.js
@@ -866,7 +866,7 @@ describe('GfmAutoComplete', () => {
it('should return a correct template', () => {
const actual = GfmAutoComplete.Emoji.templateFunction(mockItem);
const glEmojiTag = `<gl-emoji data-name="${mockItem.emoji.name}"></gl-emoji>`;
- const expected = `<li>${mockItem.fieldValue} ${glEmojiTag}</li>`;
+ const expected = `<li>${glEmojiTag} ${mockItem.fieldValue}</li>`;
expect(actual).toBe(expected);
});
diff --git a/spec/frontend/gitlab_version_check/components/security_patch_upgrade_alert_modal_spec.js b/spec/frontend/gitlab_version_check/components/security_patch_upgrade_alert_modal_spec.js
index f1ed32a5f79..b1a1d2d1372 100644
--- a/spec/frontend/gitlab_version_check/components/security_patch_upgrade_alert_modal_spec.js
+++ b/spec/frontend/gitlab_version_check/components/security_patch_upgrade_alert_modal_spec.js
@@ -1,6 +1,7 @@
import { GlModal, GlLink, GlSprintf } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
+import { stubComponent, RENDER_ALL_SLOTS_TEMPLATE } from 'helpers/stub_component';
import { sprintf } from '~/locale';
import SecurityPatchUpgradeAlertModal from '~/gitlab_version_check/components/security_patch_upgrade_alert_modal.vue';
import * as utils from '~/gitlab_version_check/utils';
@@ -14,6 +15,8 @@ import {
describe('SecurityPatchUpgradeAlertModal', () => {
let wrapper;
let trackingSpy;
+ const hideMock = jest.fn();
+ const { i18n } = SecurityPatchUpgradeAlertModal;
const defaultProps = {
currentVersion: '11.1.1',
@@ -28,14 +31,20 @@ describe('SecurityPatchUpgradeAlertModal', () => {
...props,
},
stubs: {
- GlModal,
GlSprintf,
+ GlModal: stubComponent(GlModal, {
+ methods: {
+ hide: hideMock,
+ },
+ template: RENDER_ALL_SLOTS_TEMPLATE,
+ }),
},
});
};
afterEach(() => {
unmockTracking();
+ hideMock.mockClear();
});
const expectDispatchedTracking = (action, label) => {
@@ -63,12 +72,12 @@ describe('SecurityPatchUpgradeAlertModal', () => {
});
it('renders the modal title correctly', () => {
- expect(findGlModalTitle().text()).toBe(wrapper.vm.$options.i18n.modalTitle);
+ expect(findGlModalTitle().text()).toBe(i18n.modalTitle);
});
it('renders modal body without suggested versions', () => {
expect(findGlModalBody().text()).toBe(
- sprintf(wrapper.vm.$options.i18n.modalBodyNoStableVersions, {
+ sprintf(i18n.modalBodyNoStableVersions, {
currentVersion: defaultProps.currentVersion,
}),
);
@@ -90,7 +99,7 @@ describe('SecurityPatchUpgradeAlertModal', () => {
describe('Learn more link', () => {
it('renders with correct text and link', () => {
- expect(findGlLink().text()).toBe(wrapper.vm.$options.i18n.learnMore);
+ expect(findGlLink().text()).toBe(i18n.learnMore);
expect(findGlLink().attributes('href')).toBe(ABOUT_RELEASES_PAGE);
});
@@ -102,12 +111,8 @@ describe('SecurityPatchUpgradeAlertModal', () => {
});
describe('Remind me button', () => {
- beforeEach(() => {
- wrapper.vm.$refs.alertModal.hide = jest.fn();
- });
-
it('renders with correct text', () => {
- expect(findGlRemindButton().text()).toBe(wrapper.vm.$options.i18n.secondaryButtonText);
+ expect(findGlRemindButton().text()).toBe(i18n.secondaryButtonText);
});
it(`tracks click ${TRACKING_LABELS.REMIND_ME_BTN} when clicked`, async () => {
@@ -126,13 +131,13 @@ describe('SecurityPatchUpgradeAlertModal', () => {
it('hides the modal', async () => {
await findGlRemindButton().vm.$emit('click');
- expect(wrapper.vm.$refs.alertModal.hide).toHaveBeenCalled();
+ expect(hideMock).toHaveBeenCalled();
});
});
describe('Upgrade button', () => {
it('renders with correct text and link', () => {
- expect(findGlUpgradeButton().text()).toBe(wrapper.vm.$options.i18n.primaryButtonText);
+ expect(findGlUpgradeButton().text()).toBe(i18n.primaryButtonText);
expect(findGlUpgradeButton().attributes('href')).toBe(UPGRADE_DOCS_URL);
});
@@ -160,7 +165,7 @@ describe('SecurityPatchUpgradeAlertModal', () => {
it('renders modal body with suggested versions', () => {
expect(findGlModalBody().text()).toBe(
- sprintf(wrapper.vm.$options.i18n.modalBodyStableVersions, {
+ sprintf(i18n.modalBodyStableVersions, {
currentVersion: defaultProps.currentVersion,
latestStableVersions: latestStableVersions.join(', '),
}),
@@ -176,9 +181,7 @@ describe('SecurityPatchUpgradeAlertModal', () => {
});
it('renders modal details', () => {
- expect(findGlModalDetails().text()).toBe(
- sprintf(wrapper.vm.$options.i18n.modalDetails, { details }),
- );
+ expect(findGlModalDetails().text()).toBe(sprintf(i18n.modalDetails, { details }));
});
});
diff --git a/spec/frontend/groups/components/app_spec.js b/spec/frontend/groups/components/app_spec.js
index b474745790e..e32c50db8bf 100644
--- a/spec/frontend/groups/components/app_spec.js
+++ b/spec/frontend/groups/components/app_spec.js
@@ -93,10 +93,9 @@ describe('AppComponent', () => {
page: 2,
filterGroupsBy: 'git',
sortBy: 'created_desc',
- archived: true,
})
.then(() => {
- expect(getGroupsSpy).toHaveBeenCalledWith(1, 2, 'git', 'created_desc', true);
+ expect(getGroupsSpy).toHaveBeenCalledWith(1, 2, 'git', 'created_desc');
});
});
@@ -154,7 +153,6 @@ describe('AppComponent', () => {
filterGroupsBy: 'foobar',
sortBy: null,
updatePagination: true,
- archived: null,
});
return fetchPromise.then(() => {
expect(vm.updateGroups).toHaveBeenCalledWith(mockSearchedGroups, true);
@@ -177,7 +175,6 @@ describe('AppComponent', () => {
page: 2,
filterGroupsBy: null,
sortBy: null,
- archived: true,
});
expect(vm.isLoading).toBe(true);
@@ -186,7 +183,6 @@ describe('AppComponent', () => {
filterGroupsBy: null,
sortBy: null,
updatePagination: true,
- archived: true,
});
return fetchPagePromise.then(() => {
@@ -471,7 +467,7 @@ describe('AppComponent', () => {
it('calls API with expected params', () => {
emitFetchFilteredAndSortedGroups();
- expect(getGroupsSpy).toHaveBeenCalledWith(undefined, undefined, search, sort, undefined);
+ expect(getGroupsSpy).toHaveBeenCalledWith(undefined, undefined, search, sort);
});
it('updates pagination', () => {
diff --git a/spec/frontend/groups/components/overview_tabs_spec.js b/spec/frontend/groups/components/overview_tabs_spec.js
index ca852f398d0..8db69295ac4 100644
--- a/spec/frontend/groups/components/overview_tabs_spec.js
+++ b/spec/frontend/groups/components/overview_tabs_spec.js
@@ -10,26 +10,29 @@ import SharedProjectsEmptyState from '~/groups/components/empty_states/shared_pr
import ArchivedProjectsEmptyState from '~/groups/components/empty_states/archived_projects_empty_state.vue';
import GroupsStore from '~/groups/store/groups_store';
import GroupsService from '~/groups/service/groups_service';
+import ArchivedProjectsService from '~/groups/service/archived_projects_service';
import { createRouter } from '~/groups/init_overview_tabs';
import eventHub from '~/groups/event_hub';
import {
ACTIVE_TAB_SUBGROUPS_AND_PROJECTS,
ACTIVE_TAB_SHARED,
ACTIVE_TAB_ARCHIVED,
- OVERVIEW_TABS_SORTING_ITEMS,
+ SORTING_ITEM_NAME,
+ SORTING_ITEM_UPDATED,
+ SORTING_ITEM_STARS,
} from '~/groups/constants';
import axios from '~/lib/utils/axios_utils';
import waitForPromises from 'helpers/wait_for_promises';
Vue.component('GroupFolder', GroupFolderComponent);
const router = createRouter();
-const [SORTING_ITEM_NAME, , SORTING_ITEM_UPDATED] = OVERVIEW_TABS_SORTING_ITEMS;
describe('OverviewTabs', () => {
let wrapper;
let axiosMock;
const defaultProvide = {
+ groupId: '1',
endpoints: {
subgroups_and_projects: '/groups/foobar/-/children.json',
shared: '/groups/foobar/-/shared_projects.json',
@@ -92,7 +95,10 @@ describe('OverviewTabs', () => {
expect(tabPanel.findComponent(GroupsApp).props()).toMatchObject({
action: ACTIVE_TAB_SUBGROUPS_AND_PROJECTS,
store: new GroupsStore({ showSchemaMarkup: true }),
- service: new GroupsService(defaultProvide.endpoints[ACTIVE_TAB_SUBGROUPS_AND_PROJECTS]),
+ service: new GroupsService(
+ defaultProvide.endpoints[ACTIVE_TAB_SUBGROUPS_AND_PROJECTS],
+ defaultProvide.initialSort,
+ ),
});
await waitForPromises();
@@ -115,7 +121,10 @@ describe('OverviewTabs', () => {
expect(tabPanel.findComponent(GroupsApp).props()).toMatchObject({
action: ACTIVE_TAB_SHARED,
store: new GroupsStore(),
- service: new GroupsService(defaultProvide.endpoints[ACTIVE_TAB_SHARED]),
+ service: new GroupsService(
+ defaultProvide.endpoints[ACTIVE_TAB_SHARED],
+ defaultProvide.initialSort,
+ ),
});
expect(tabPanel.vm.$attrs.lazy).toBe(false);
@@ -140,7 +149,7 @@ describe('OverviewTabs', () => {
expect(tabPanel.findComponent(GroupsApp).props()).toMatchObject({
action: ACTIVE_TAB_ARCHIVED,
store: new GroupsStore(),
- service: new GroupsService(defaultProvide.endpoints[ACTIVE_TAB_ARCHIVED]),
+ service: new ArchivedProjectsService(defaultProvide.groupId, defaultProvide.initialSort),
});
expect(tabPanel.vm.$attrs.lazy).toBe(false);
@@ -219,7 +228,7 @@ describe('OverviewTabs', () => {
it(`pushes expected route when ${tabToClick} tab is clicked`, async () => {
await findTab(tabToClick).trigger('click');
- expect(routerMock.push).toHaveBeenCalledWith(expectedRoute);
+ expect(routerMock.push).toHaveBeenCalledWith(expect.objectContaining(expectedRoute));
});
});
@@ -304,6 +313,52 @@ describe('OverviewTabs', () => {
sharedAssertions({ search: '', sort: SORTING_ITEM_UPDATED.asc });
});
+ describe('when tab is changed', () => {
+ describe('when selected sort is supported', () => {
+ beforeEach(async () => {
+ await createComponent({
+ route: {
+ name: ACTIVE_TAB_SUBGROUPS_AND_PROJECTS,
+ params: { group: 'foo/bar/baz' },
+ query: { sort: SORTING_ITEM_NAME.asc },
+ },
+ });
+ });
+
+ it('adds sort query string', async () => {
+ await findTab(OverviewTabs.i18n[ACTIVE_TAB_ARCHIVED]).trigger('click');
+
+ expect(routerMock.push).toHaveBeenCalledWith(
+ expect.objectContaining({
+ query: { sort: SORTING_ITEM_NAME.asc },
+ }),
+ );
+ });
+ });
+
+ describe('when selected sort is not supported', () => {
+ beforeEach(async () => {
+ await createComponent({
+ route: {
+ name: ACTIVE_TAB_SUBGROUPS_AND_PROJECTS,
+ params: { group: 'foo/bar/baz' },
+ query: { sort: SORTING_ITEM_STARS.asc },
+ },
+ });
+ });
+
+ it('defaults to sorting by name', async () => {
+ await findTab(OverviewTabs.i18n[ACTIVE_TAB_ARCHIVED]).trigger('click');
+
+ expect(routerMock.push).toHaveBeenCalledWith(
+ expect.objectContaining({
+ query: { sort: SORTING_ITEM_NAME.asc },
+ }),
+ );
+ });
+ });
+ });
+
describe('when sort direction is changed', () => {
beforeEach(async () => {
await setup();
diff --git a/spec/frontend/groups/service/archived_projects_service_spec.js b/spec/frontend/groups/service/archived_projects_service_spec.js
new file mode 100644
index 00000000000..3aec9d57ee1
--- /dev/null
+++ b/spec/frontend/groups/service/archived_projects_service_spec.js
@@ -0,0 +1,90 @@
+import projects from 'test_fixtures/api/groups/projects/get.json';
+import ArchivedProjectsService from '~/groups/service/archived_projects_service';
+import Api from '~/api';
+
+jest.mock('~/api');
+
+describe('ArchivedProjectsService', () => {
+ const groupId = 1;
+ let service;
+
+ beforeEach(() => {
+ service = new ArchivedProjectsService(groupId, 'name_asc');
+ });
+
+ describe('getGroups', () => {
+ const headers = { 'x-next-page': '2', 'x-page': '1', 'x-per-page': '20' };
+ const page = 2;
+ const query = 'git';
+ const sort = 'created_asc';
+
+ beforeEach(() => {
+ Api.groupProjects.mockResolvedValueOnce({ data: projects, headers });
+ });
+
+ it('returns promise the resolves with formatted project', async () => {
+ await expect(service.getGroups(undefined, page, query, sort)).resolves.toEqual({
+ data: projects.map((project) => {
+ return {
+ id: project.id,
+ name: project.name,
+ full_name: project.name_with_namespace,
+ markdown_description: project.description_html,
+ visibility: project.visibility,
+ avatar_url: project.avatar_url,
+ relative_path: `/${project.path_with_namespace}`,
+ edit_path: null,
+ leave_path: null,
+ can_edit: false,
+ can_leave: false,
+ can_remove: false,
+ type: 'project',
+ permission: null,
+ children: [],
+ parent_id: project.namespace.id,
+ project_count: 0,
+ subgroup_count: 0,
+ number_users_with_delimiter: 0,
+ star_count: project.star_count,
+ updated_at: project.updated_at,
+ marked_for_deletion: project.marked_for_deletion_at !== null,
+ last_activity_at: project.last_activity_at,
+ };
+ }),
+ headers,
+ });
+
+ expect(Api.groupProjects).toHaveBeenCalledWith(groupId, query, {
+ archived: true,
+ page,
+ order_by: 'created_at',
+ sort: 'asc',
+ });
+ });
+
+ describe.each`
+ sortArgument | expectedOrderByParameter | expectedSortParameter
+ ${'name_asc'} | ${'name'} | ${'asc'}
+ ${'name_desc'} | ${'name'} | ${'desc'}
+ ${'created_asc'} | ${'created_at'} | ${'asc'}
+ ${'created_desc'} | ${'created_at'} | ${'desc'}
+ ${'latest_activity_asc'} | ${'last_activity_at'} | ${'asc'}
+ ${'latest_activity_desc'} | ${'last_activity_at'} | ${'desc'}
+ ${undefined} | ${'name'} | ${'asc'}
+ `(
+ 'when the sort argument is $sortArgument',
+ ({ sortArgument, expectedSortParameter, expectedOrderByParameter }) => {
+ it(`calls the API with sort parameter set to ${expectedSortParameter} and order_by parameter set to ${expectedOrderByParameter}`, () => {
+ service.getGroups(undefined, page, query, sortArgument);
+
+ expect(Api.groupProjects).toHaveBeenCalledWith(groupId, query, {
+ archived: true,
+ page,
+ order_by: expectedOrderByParameter,
+ sort: expectedSortParameter,
+ });
+ });
+ },
+ );
+ });
+});
diff --git a/spec/frontend/groups/service/groups_service_spec.js b/spec/frontend/groups/service/groups_service_spec.js
index e037a6df1e2..ef0a7fde70a 100644
--- a/spec/frontend/groups/service/groups_service_spec.js
+++ b/spec/frontend/groups/service/groups_service_spec.js
@@ -7,7 +7,7 @@ describe('GroupsService', () => {
let service;
beforeEach(() => {
- service = new GroupsService(mockEndpoint);
+ service = new GroupsService(mockEndpoint, 'created_asc');
});
describe('getGroups', () => {
@@ -17,17 +17,28 @@ describe('GroupsService', () => {
page: 2,
filter: 'git',
sort: 'created_asc',
- archived: true,
};
- service.getGroups(55, 2, 'git', 'created_asc', true);
+ service.getGroups(55, 2, 'git', 'created_asc');
expect(axios.get).toHaveBeenCalledWith(mockEndpoint, { params: { parent_id: 55 } });
- service.getGroups(null, 2, 'git', 'created_asc', true);
+ service.getGroups(null, 2, 'git', 'created_asc');
expect(axios.get).toHaveBeenCalledWith(mockEndpoint, { params });
});
+
+ describe('when sort argument is undefined', () => {
+ it('calls API with `initialSort` argument', () => {
+ jest.spyOn(axios, 'get').mockResolvedValue();
+
+ service.getGroups(undefined, 2, 'git', undefined);
+
+ expect(axios.get).toHaveBeenCalledWith(mockEndpoint, {
+ params: { sort: 'created_asc', filter: 'git', page: 2 },
+ });
+ });
+ });
});
describe('leaveGroup', () => {
diff --git a/spec/frontend/header_search/init_spec.js b/spec/frontend/header_search/init_spec.js
index baf3c6f08b2..459ca33ee66 100644
--- a/spec/frontend/header_search/init_spec.js
+++ b/spec/frontend/header_search/init_spec.js
@@ -5,7 +5,6 @@ import initHeaderSearch, { eventHandler, cleanEventListeners } from '~/header_se
describe('Header Search EventListener', () => {
beforeEach(() => {
jest.resetModules();
- jest.restoreAllMocks();
setHTMLFixture(`
<div class="js-header-content">
<div class="header-search-form" id="js-header-search" data-autocomplete-path="/search/autocomplete" data-issues-path="/dashboard/issues" data-mr-path="/dashboard/merge_requests" data-search-context="{}" data-search-path="/search">
@@ -16,7 +15,6 @@ describe('Header Search EventListener', () => {
afterEach(() => {
resetHTMLFixture();
- jest.clearAllMocks();
});
it('attached event listener', () => {
diff --git a/spec/frontend/ide/components/ide_status_bar_spec.js b/spec/frontend/ide/components/ide_status_bar_spec.js
index 0ee16f98e7e..fe392a64013 100644
--- a/spec/frontend/ide/components/ide_status_bar_spec.js
+++ b/spec/frontend/ide/components/ide_status_bar_spec.js
@@ -1,6 +1,6 @@
-import { mount } from '@vue/test-utils';
import _ from 'lodash';
import { TEST_HOST } from 'helpers/test_constants';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
import IdeStatusBar from '~/ide/components/ide_status_bar.vue';
import IdeStatusMR from '~/ide/components/ide_status_mr.vue';
import { rightSidebarViews } from '~/ide/constants';
@@ -15,6 +15,8 @@ jest.mock('~/lib/utils/poll');
describe('IdeStatusBar component', () => {
let wrapper;
+ const dummyIntervalId = 1337;
+ let dispatchMock;
const findMRStatus = () => wrapper.findComponent(IdeStatusMR);
@@ -31,14 +33,21 @@ describe('IdeStatusBar component', () => {
...state,
});
- wrapper = mount(IdeStatusBar, { store });
+ wrapper = mountExtended(IdeStatusBar, { store });
+ dispatchMock = jest.spyOn(store, 'dispatch');
};
+ beforeEach(() => {
+ jest.spyOn(window, 'setInterval').mockReturnValue(dummyIntervalId);
+ });
+
+ const findCommitShaLink = () => wrapper.findByTestId('commit-sha-content');
+
describe('default', () => {
it('triggers a setInterval', () => {
mountComponent();
- expect(wrapper.vm.intervalId).not.toBe(null);
+ expect(window.setInterval).toHaveBeenCalledTimes(1);
});
it('renders the statusbar', () => {
@@ -47,34 +56,10 @@ describe('IdeStatusBar component', () => {
expect(wrapper.classes()).toEqual(['ide-status-bar']);
});
- describe('commitAgeUpdate', () => {
- beforeEach(() => {
- mountComponent();
- jest.spyOn(wrapper.vm, 'commitAgeUpdate').mockImplementation(() => {});
- });
-
- afterEach(() => {
- jest.clearAllTimers();
- });
-
- it('gets called every second', () => {
- expect(wrapper.vm.commitAgeUpdate).not.toHaveBeenCalled();
-
- jest.advanceTimersByTime(1000);
-
- expect(wrapper.vm.commitAgeUpdate.mock.calls).toHaveLength(1);
-
- jest.advanceTimersByTime(1000);
-
- expect(wrapper.vm.commitAgeUpdate.mock.calls).toHaveLength(2);
- });
- });
-
describe('getCommitPath', () => {
it('returns the path to the commit details', () => {
mountComponent();
-
- expect(wrapper.vm.getCommitPath('abc123de')).toBe('/commit/abc123de');
+ expect(findCommitShaLink().attributes('href')).toBe('/commit/abc123de');
});
});
@@ -95,11 +80,10 @@ describe('IdeStatusBar component', () => {
},
};
mountComponent({ pipelines });
- jest.spyOn(wrapper.vm, 'openRightPane').mockImplementation(() => {});
wrapper.find('button').trigger('click');
- expect(wrapper.vm.openRightPane).toHaveBeenCalledWith(rightSidebarViews.pipelines);
+ expect(dispatchMock).toHaveBeenCalledWith('rightPane/open', rightSidebarViews.pipelines);
});
});
diff --git a/spec/frontend/ide/components/repo_editor_spec.js b/spec/frontend/ide/components/repo_editor_spec.js
index 6747ec97050..aa99b1cacef 100644
--- a/spec/frontend/ide/components/repo_editor_spec.js
+++ b/spec/frontend/ide/components/repo_editor_spec.js
@@ -158,7 +158,6 @@ describe('RepoEditor', () => {
});
afterEach(() => {
- jest.clearAllMocks();
// create a new model each time, otherwise tests conflict with each other
// because of same model being used in multiple tests
monacoEditor.getModels().forEach((model) => model.dispose());
diff --git a/spec/frontend/ide/mock_data.js b/spec/frontend/ide/mock_data.js
index 557626b3cca..b1f192e1d98 100644
--- a/spec/frontend/ide/mock_data.js
+++ b/spec/frontend/ide/mock_data.js
@@ -13,6 +13,7 @@ export const projectData = {
can_push: true,
commit: {
id: '123',
+ short_id: 'abc123de',
},
},
},
@@ -79,6 +80,7 @@ export const jobs = [
path: 'testing',
status: {
icon: 'status_success',
+ group: 'success',
text: 'passed',
},
stage: 'test',
diff --git a/spec/frontend/invite_members/components/group_select_spec.js b/spec/frontend/invite_members/components/group_select_spec.js
index a1ca9a69926..bd90832f497 100644
--- a/spec/frontend/invite_members/components/group_select_spec.js
+++ b/spec/frontend/invite_members/components/group_select_spec.js
@@ -1,82 +1,76 @@
-import { GlAvatarLabeled, GlDropdown, GlSearchBoxByType } from '@gitlab/ui';
+import { nextTick } from 'vue';
+import { GlAvatarLabeled, GlCollapsibleListbox } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
import waitForPromises from 'helpers/wait_for_promises';
-import * as groupsApi from '~/api/groups_api';
+import { getGroups } from '~/api/groups_api';
import GroupSelect from '~/invite_members/components/group_select.vue';
+jest.mock('~/api/groups_api');
+
const group1 = { id: 1, full_name: 'Group One', avatar_url: 'test' };
const group2 = { id: 2, full_name: 'Group Two', avatar_url: 'test' };
const allGroups = [group1, group2];
-
-const createComponent = (props = {}) => {
- return mount(GroupSelect, {
- propsData: {
- invalidGroups: [],
- ...props,
- },
- });
+const headers = {
+ 'X-Next-Page': 2,
+ 'X-Page': 1,
+ 'X-Per-Page': 20,
+ 'X-Prev-Page': '',
+ 'X-Total': 40,
+ 'X-Total-Pages': 2,
};
describe('GroupSelect', () => {
let wrapper;
- beforeEach(() => {
- jest.spyOn(groupsApi, 'getGroups').mockResolvedValue(allGroups);
+ const createComponent = (props = {}) => {
+ wrapper = mount(GroupSelect, {
+ propsData: {
+ selectedGroup: {},
+ invalidGroups: [],
+ ...props,
+ },
+ });
+ };
- wrapper = createComponent();
+ beforeEach(() => {
+ getGroups.mockResolvedValueOnce({ data: allGroups, headers });
});
- const findSearchBoxByType = () => wrapper.findComponent(GlSearchBoxByType);
- const findDropdown = () => wrapper.findComponent(GlDropdown);
- const findDropdownToggle = () => findDropdown().find('button[aria-haspopup="menu"]');
+ const findListbox = () => wrapper.findComponent(GlCollapsibleListbox);
+ const findListboxToggle = () => findListbox().find('button[aria-haspopup="listbox"]');
const findAvatarByLabel = (text) =>
wrapper
.findAllComponents(GlAvatarLabeled)
.wrappers.find((dropdownItemWrapper) => dropdownItemWrapper.props('label') === text);
- it('renders GlSearchBoxByType with default attributes', () => {
- expect(findSearchBoxByType().exists()).toBe(true);
- expect(findSearchBoxByType().vm.$attrs).toMatchObject({
- placeholder: 'Search groups',
- });
- });
-
describe('when user types in the search input', () => {
- let resolveApiRequest;
-
- beforeEach(() => {
- jest.spyOn(groupsApi, 'getGroups').mockImplementation(
- () =>
- new Promise((resolve) => {
- resolveApiRequest = resolve;
- }),
- );
-
- findSearchBoxByType().vm.$emit('input', group1.name);
+ beforeEach(async () => {
+ createComponent();
+ await waitForPromises();
+ getGroups.mockClear();
+ getGroups.mockReturnValueOnce(new Promise(() => {}));
+ findListbox().vm.$emit('search', group1.name);
+ await nextTick();
});
it('calls the API', () => {
- resolveApiRequest({ data: allGroups });
-
- expect(groupsApi.getGroups).toHaveBeenCalledWith(group1.name, {
+ expect(getGroups).toHaveBeenCalledWith(group1.name, {
exclude_internal: true,
active: true,
order_by: 'similarity',
});
});
- it('displays loading icon while waiting for API call to resolve', async () => {
- expect(findSearchBoxByType().props('isLoading')).toBe(true);
-
- resolveApiRequest({ data: allGroups });
- await waitForPromises();
-
- expect(findSearchBoxByType().props('isLoading')).toBe(false);
+ it('displays loading icon while waiting for API call to resolve', () => {
+ expect(findListbox().props('searching')).toBe(true);
});
});
describe('avatar label', () => {
- it('includes the correct attributes with name and avatar_url', () => {
+ it('includes the correct attributes with name and avatar_url', async () => {
+ createComponent();
+ await waitForPromises();
+
expect(findAvatarByLabel(group1.full_name).attributes()).toMatchObject({
src: group1.avatar_url,
'entity-id': `${group1.id}`,
@@ -86,8 +80,9 @@ describe('GroupSelect', () => {
});
describe('when filtering out the group from results', () => {
- beforeEach(() => {
- wrapper = createComponent({ invalidGroups: [group1.id] });
+ beforeEach(async () => {
+ createComponent({ invalidGroups: [group1.id] });
+ await waitForPromises();
});
it('does not find an invalid group', () => {
@@ -101,16 +96,93 @@ describe('GroupSelect', () => {
});
describe('when group is selected from the dropdown', () => {
- beforeEach(() => {
- findAvatarByLabel(group1.full_name).trigger('click');
+ beforeEach(async () => {
+ createComponent({
+ selectedGroup: {
+ value: group1.id,
+ id: group1.id,
+ name: group1.full_name,
+ path: group1.path,
+ avatarUrl: group1.avatar_url,
+ },
+ });
+ await waitForPromises();
+ findListbox().vm.$emit('select', group1.id);
+ await nextTick();
});
it('emits `input` event used by `v-model`', () => {
- expect(wrapper.emitted('input')[0][0].id).toEqual(group1.id);
+ expect(wrapper.emitted('input')).toMatchObject([
+ [
+ {
+ value: group1.id,
+ id: group1.id,
+ name: group1.full_name,
+ path: group1.path,
+ avatarUrl: group1.avatar_url,
+ },
+ ],
+ ]);
});
it('sets dropdown toggle text to selected item', () => {
- expect(findDropdownToggle().text()).toBe(group1.full_name);
+ expect(findListboxToggle().text()).toBe(group1.full_name);
+ });
+ });
+
+ describe('infinite scroll', () => {
+ it('sets infinite scroll related props', async () => {
+ createComponent();
+ await waitForPromises();
+
+ expect(findListbox().props()).toMatchObject({
+ infiniteScroll: true,
+ infiniteScrollLoading: false,
+ totalItems: 40,
+ });
+ });
+
+ describe('when `bottom-reached` event is fired', () => {
+ it('indicates new groups are loading and adds them to the listbox', async () => {
+ createComponent();
+ await waitForPromises();
+
+ const infiniteScrollGroup = {
+ id: 3,
+ full_name: 'Infinite scroll group',
+ avatar_url: 'test',
+ };
+
+ getGroups.mockResolvedValueOnce({ data: [infiniteScrollGroup], headers });
+
+ findListbox().vm.$emit('bottom-reached');
+ await nextTick();
+
+ expect(findListbox().props('infiniteScrollLoading')).toBe(true);
+
+ await waitForPromises();
+
+ expect(findListbox().props('items')[2]).toMatchObject({
+ value: infiniteScrollGroup.id,
+ id: infiniteScrollGroup.id,
+ name: infiniteScrollGroup.full_name,
+ avatarUrl: infiniteScrollGroup.avatar_url,
+ });
+ });
+
+ describe('when API request fails', () => {
+ it('emits `error` event', async () => {
+ createComponent();
+ await waitForPromises();
+
+ getGroups.mockRejectedValueOnce();
+
+ findListbox().vm.$emit('bottom-reached');
+ await waitForPromises();
+
+ expect(wrapper.emitted('error')).toEqual([[GroupSelect.i18n.errorMessage]]);
+ });
+ });
});
});
});
diff --git a/spec/frontend/invite_members/components/invite_groups_modal_spec.js b/spec/frontend/invite_members/components/invite_groups_modal_spec.js
index 4f082145562..4136de75545 100644
--- a/spec/frontend/invite_members/components/invite_groups_modal_spec.js
+++ b/spec/frontend/invite_members/components/invite_groups_modal_spec.js
@@ -1,4 +1,4 @@
-import { GlModal, GlSprintf } from '@gitlab/ui';
+import { GlModal, GlSprintf, GlAlert } from '@gitlab/ui';
import { nextTick } from 'vue';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import Api from '~/api';
@@ -24,6 +24,7 @@ jest.mock('~/invite_members/utils/trigger_successful_invite_alert');
describe('InviteGroupsModal', () => {
let wrapper;
+ const mockToastShow = jest.fn();
const createComponent = (props = {}) => {
wrapper = shallowMountExtended(InviteGroupsModal, {
@@ -39,9 +40,18 @@ describe('InviteGroupsModal', () => {
template: '<div><slot></slot><slot name="modal-footer"></slot></div>',
}),
},
+ mocks: {
+ $toast: {
+ show: mockToastShow,
+ },
+ },
});
};
+ afterEach(() => {
+ mockToastShow.mockClear();
+ });
+
const createInviteGroupToProjectWrapper = () => {
createComponent({ isProject: true });
};
@@ -133,7 +143,6 @@ describe('InviteGroupsModal', () => {
createComponent();
triggerGroupSelect(sharedGroup);
- wrapper.vm.$toast = { show: jest.fn() };
jest.spyOn(Api, 'groupShareWithGroup').mockImplementation(
() =>
new Promise((resolve, reject) => {
@@ -167,7 +176,7 @@ describe('InviteGroupsModal', () => {
});
it('displays the successful toastMessage', () => {
- expect(wrapper.vm.$toast.show).toHaveBeenCalledWith('Members were successfully added', {
+ expect(mockToastShow).toHaveBeenCalledWith('Members were successfully added', {
onComplete: expect.any(Function),
});
});
@@ -187,7 +196,7 @@ describe('InviteGroupsModal', () => {
});
it('does not show the toast message on failure', () => {
- expect(wrapper.vm.$toast.show).not.toHaveBeenCalled();
+ expect(mockToastShow).not.toHaveBeenCalled();
});
it('displays the generic error for http server error', () => {
@@ -222,7 +231,6 @@ describe('InviteGroupsModal', () => {
createComponent({ reloadPageOnSubmit: true });
triggerGroupSelect(sharedGroup);
- wrapper.vm.$toast = { show: jest.fn() };
jest.spyOn(Api, 'groupShareWithGroup').mockResolvedValue({ data: groupPostData });
clickInviteButton();
@@ -238,8 +246,19 @@ describe('InviteGroupsModal', () => {
});
it('does not show the toast message on failure', () => {
- expect(wrapper.vm.$toast.show).not.toHaveBeenCalled();
+ expect(mockToastShow).not.toHaveBeenCalled();
});
});
});
+
+ describe('when group select emits an error event', () => {
+ it('displays error alert', async () => {
+ createComponent();
+
+ findGroupSelect().vm.$emit('error', GroupSelect.i18n.errorMessage);
+ await nextTick();
+
+ expect(wrapper.findComponent(GlAlert).text()).toBe(GroupSelect.i18n.errorMessage);
+ });
+ });
});
diff --git a/spec/frontend/invite_members/components/members_token_select_spec.js b/spec/frontend/invite_members/components/members_token_select_spec.js
index ff0313cc49e..925534edd7c 100644
--- a/spec/frontend/invite_members/components/members_token_select_spec.js
+++ b/spec/frontend/invite_members/components/members_token_select_spec.js
@@ -143,12 +143,19 @@ describe('MembersTokenSelect', () => {
});
describe('when input text is an email', () => {
- it('allows user defined tokens', async () => {
- tokenSelector.vm.$emit('text-input', 'foo@bar.com');
+ it.each`
+ email | result
+ ${'foo@bar.com'} | ${true}
+ ${'foo@bar.com '} | ${false}
+ ${' foo@bar.com'} | ${false}
+ ${'foo@ba r.com'} | ${false}
+ ${'fo o@bar.com'} | ${false}
+ `(`with token creation validation on $email`, async ({ email, result }) => {
+ tokenSelector.vm.$emit('text-input', email);
await nextTick();
- expect(tokenSelector.props('allowUserDefinedTokens')).toBe(true);
+ expect(tokenSelector.props('allowUserDefinedTokens')).toBe(result);
});
});
});
diff --git a/spec/frontend/issuable/components/related_issuable_item_spec.js b/spec/frontend/issuable/components/related_issuable_item_spec.js
index 7322894164b..bfb0aaa1c67 100644
--- a/spec/frontend/issuable/components/related_issuable_item_spec.js
+++ b/spec/frontend/issuable/components/related_issuable_item_spec.js
@@ -236,23 +236,21 @@ describe('RelatedIssuableItem', () => {
describe('when work item is issue and the related issue title is clicked', () => {
it('does not open', () => {
mountComponent({ props: { workItemType: 'ISSUE' } });
- wrapper.vm.$refs.modal.show = jest.fn();
findTitleLink().vm.$emit('click', { preventDefault: () => {} });
- expect(wrapper.vm.$refs.modal.show).not.toHaveBeenCalled();
+ expect(showModalSpy).not.toHaveBeenCalled();
});
});
describe('when work item is task and the related issue title is clicked', () => {
beforeEach(() => {
mountComponent({ props: { workItemType: 'TASK' } });
- wrapper.vm.$refs.modal.show = jest.fn();
findTitleLink().vm.$emit('click', { preventDefault: () => {} });
});
it('opens', () => {
- expect(wrapper.vm.$refs.modal.show).toHaveBeenCalled();
+ expect(showModalSpy).toHaveBeenCalled();
});
it('updates the url params with the work item id', () => {
diff --git a/spec/frontend/issuable/components/status_box_spec.js b/spec/frontend/issuable/components/status_box_spec.js
index d26f287d90c..0d47595c9e6 100644
--- a/spec/frontend/issuable/components/status_box_spec.js
+++ b/spec/frontend/issuable/components/status_box_spec.js
@@ -18,6 +18,8 @@ describe('Merge request status box component', () => {
${'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'}
+ ${'epic'} | ${'Open'} | ${'opened'} | ${'issuable-status-badge-open'} | ${'success'} | ${'epic'}
+ ${'epic'} | ${'Closed'} | ${'closed'} | ${'issuable-status-badge-closed'} | ${'info'} | ${'epic-closed'}
`(
'with issuableType set to "$issuableType" and state set to "$initialState"',
({ issuableType, badgeText, initialState, badgeClass, badgeVariant, badgeIcon }) => {
diff --git a/spec/frontend/issuable/issuable_form_spec.js b/spec/frontend/issuable/issuable_form_spec.js
index d7e5f9083b0..b9652327e3d 100644
--- a/spec/frontend/issuable/issuable_form_spec.js
+++ b/spec/frontend/issuable/issuable_form_spec.js
@@ -4,6 +4,9 @@ import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import IssuableForm from '~/issuable/issuable_form';
import setWindowLocation from 'helpers/set_window_location_helper';
import { confirmSensitiveAction, i18n } from '~/lib/utils/secret_detection';
+import { mockTracking } from 'helpers/tracking_helper';
+import { useLocalStorageSpy } from 'helpers/local_storage_helper';
+import { TEST_HOST } from 'helpers/test_constants';
import { getSaveableFormChildren } from './helpers';
jest.mock('~/autosave');
@@ -20,9 +23,12 @@ const createIssuable = (form) => {
};
describe('IssuableForm', () => {
+ let trackingSpy;
let $form;
let instance;
+ useLocalStorageSpy();
+
beforeEach(() => {
setHTMLFixture(`
<form>
@@ -32,6 +38,7 @@ describe('IssuableForm', () => {
</form>
`);
$form = $('form');
+ trackingSpy = mockTracking(undefined, null, jest.spyOn);
});
afterEach(() => {
@@ -266,6 +273,34 @@ describe('IssuableForm', () => {
expect(resetAutosave).toHaveBeenCalled();
});
+ it.each`
+ windowLocation | context | localStorageValue | editorType
+ ${'/gitlab-org/gitlab/-/issues/412699'} | ${'Issue'} | ${'contentEditor'} | ${'editor_type_rich_text_editor'}
+ ${'/gitlab-org/gitlab/-/merge_requests/125979/diffs'} | ${'MergeRequest'} | ${'contentEditor'} | ${'editor_type_rich_text_editor'}
+ ${'/groups/gitlab-org/-/milestones/8/edit'} | ${'Other'} | ${'contentEditor'} | ${'editor_type_rich_text_editor'}
+ ${'/gitlab-org/gitlab/-/issues/412699'} | ${'Issue'} | ${'markdownField'} | ${'editor_type_plain_text_editor'}
+ ${'/gitlab-org/gitlab/-/merge_requests/125979/diffs'} | ${'MergeRequest'} | ${'markdownField'} | ${'editor_type_plain_text_editor'}
+ ${'/groups/gitlab-org/-/milestones/8/edit'} | ${'Other'} | ${'markdownField'} | ${'editor_type_plain_text_editor'}
+ `(
+ 'tracks event on form submit',
+ ({ windowLocation, context, localStorageValue, editorType }) => {
+ setWindowLocation(`${TEST_HOST}/${windowLocation}`);
+ localStorage.setItem('gl-markdown-editor-mode', localStorageValue);
+
+ issueDescription.value = 'sample message';
+
+ createIssuable($form);
+
+ $form.submit();
+
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'editor_type_used', {
+ context,
+ editorType,
+ label: 'editor_tracking',
+ });
+ },
+ );
+
it('prevents form submission when token is present', () => {
issueDescription.value = sensitiveMessage;
diff --git a/spec/frontend/issuable/popover/components/issue_popover_spec.js b/spec/frontend/issuable/popover/components/issue_popover_spec.js
index a7605016039..0596433ce9a 100644
--- a/spec/frontend/issuable/popover/components/issue_popover_spec.js
+++ b/spec/frontend/issuable/popover/components/issue_popover_spec.js
@@ -26,7 +26,7 @@ describe('Issue Popover', () => {
apolloProvider: createMockApollo([[issueQuery, queryResponse]]),
propsData: {
target: document.createElement('a'),
- projectPath: 'foo/bar',
+ namespacePath: 'foo/bar',
iid: '1',
cachedTitle: 'Cached title',
},
diff --git a/spec/frontend/issuable/popover/components/mr_popover_spec.js b/spec/frontend/issuable/popover/components/mr_popover_spec.js
index 5b29ecfc0ba..4ed783da853 100644
--- a/spec/frontend/issuable/popover/components/mr_popover_spec.js
+++ b/spec/frontend/issuable/popover/components/mr_popover_spec.js
@@ -64,7 +64,7 @@ describe('MR Popover', () => {
apolloProvider: createMockApollo([[mergeRequestQuery, queryResponse]]),
propsData: {
target: document.createElement('a'),
- projectPath: 'foo/bar',
+ namespacePath: 'foo/bar',
iid: '1',
cachedTitle: 'Cached Title',
},
diff --git a/spec/frontend/issuable/popover/index_spec.js b/spec/frontend/issuable/popover/index_spec.js
index b1aa7f0f0b0..bf9dce4867f 100644
--- a/spec/frontend/issuable/popover/index_spec.js
+++ b/spec/frontend/issuable/popover/index_spec.js
@@ -1,6 +1,6 @@
import { setHTMLFixture } from 'helpers/fixtures';
import * as createDefaultClient from '~/lib/graphql';
-import initIssuablePopovers from '~/issuable/popover/index';
+import initIssuablePopovers, * as popover from '~/issuable/popover/index';
createDefaultClient.default = jest.fn();
@@ -9,6 +9,7 @@ describe('initIssuablePopovers', () => {
let mr2;
let mr3;
let issue1;
+ let workItem1;
beforeEach(() => {
setHTMLFixture(`
@@ -24,30 +25,69 @@ describe('initIssuablePopovers', () => {
<div id="four" class="gfm-issue" title="title" data-iid="1" data-project-path="group/project" data-reference-type="issue">
MR3
</div>
+ <div id="five" class="gfm-work_item" title="title" data-iid="1" data-project-path="group/project" data-reference-type="work_item">
+ MR3
+ </div>
`);
mr1 = document.querySelector('#one');
mr2 = document.querySelector('#two');
mr3 = document.querySelector('#three');
issue1 = document.querySelector('#four');
-
- mr1.addEventListener = jest.fn();
- mr2.addEventListener = jest.fn();
- mr3.addEventListener = jest.fn();
- issue1.addEventListener = jest.fn();
+ workItem1 = document.querySelector('#five');
});
- it('does not add the same event listener twice', () => {
- initIssuablePopovers([mr1, mr1, mr2, issue1]);
+ describe('init function', () => {
+ beforeEach(() => {
+ mr1.addEventListener = jest.fn();
+ mr2.addEventListener = jest.fn();
+ mr3.addEventListener = jest.fn();
+ issue1.addEventListener = jest.fn();
+ workItem1.addEventListener = jest.fn();
+ });
+
+ it('does not add the same event listener twice', () => {
+ initIssuablePopovers([mr1, mr1, mr2, issue1, workItem1]);
+
+ expect(mr1.addEventListener).toHaveBeenCalledTimes(1);
+ expect(mr2.addEventListener).toHaveBeenCalledTimes(1);
+ expect(issue1.addEventListener).toHaveBeenCalledTimes(1);
+ expect(workItem1.addEventListener).toHaveBeenCalledTimes(1);
+ });
- expect(mr1.addEventListener).toHaveBeenCalledTimes(1);
- expect(mr2.addEventListener).toHaveBeenCalledTimes(1);
- expect(issue1.addEventListener).toHaveBeenCalledTimes(1);
+ it('does not add listener if it does not have the necessary data attributes', () => {
+ initIssuablePopovers([mr1, mr2, mr3]);
+
+ expect(mr3.addEventListener).not.toHaveBeenCalled();
+ });
});
- it('does not add listener if it does not have the necessary data attributes', () => {
- initIssuablePopovers([mr1, mr2, mr3]);
+ describe('mount function', () => {
+ const expectedMountObject = {
+ apolloProvider: expect.anything(),
+ iid: '1',
+ namespacePath: 'group/project',
+ title: 'title',
+ };
+
+ beforeEach(() => {
+ jest.spyOn(popover, 'handleIssuablePopoverMount').mockImplementation(jest.fn());
+ });
+
+ it('calls popover mount function with components for Issue, MR, and Work Item', () => {
+ initIssuablePopovers([mr1, issue1, workItem1], popover.handleIssuablePopoverMount);
+
+ [mr1, issue1, workItem1].forEach(async (el) => {
+ await el.dispatchEvent(new Event('mouseenter', { target: el }));
- expect(mr3.addEventListener).not.toHaveBeenCalled();
+ expect(popover.handleIssuablePopoverMount).toHaveBeenCalledWith(
+ expect.objectContaining({
+ ...expectedMountObject,
+ referenceType: el.dataset.referenceType,
+ target: el,
+ }),
+ );
+ });
+ });
});
});
diff --git a/spec/frontend/issuable/related_issues/components/related_issues_block_spec.js b/spec/frontend/issuable/related_issues/components/related_issues_block_spec.js
index e97c0312181..a24bffdd363 100644
--- a/spec/frontend/issuable/related_issues/components/related_issues_block_spec.js
+++ b/spec/frontend/issuable/related_issues/components/related_issues_block_spec.js
@@ -1,6 +1,6 @@
import { nextTick } from 'vue';
import { GlIcon, GlCard } from '@gitlab/ui';
-import { mountExtended, shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import {
issuable1,
issuable2,
@@ -14,6 +14,7 @@ import {
linkedIssueTypesTextMap,
PathIdSeparator,
} from '~/related_issues/constants';
+import RelatedIssuesList from '~/related_issues/components/related_issues_list.vue';
describe('RelatedIssuesBlock', () => {
let wrapper;
@@ -21,9 +22,10 @@ describe('RelatedIssuesBlock', () => {
const findToggleButton = () => wrapper.findByTestId('toggle-links');
const findRelatedIssuesBody = () => wrapper.findByTestId('related-issues-body');
const findIssueCountBadgeAddButton = () => wrapper.findByTestId('related-issues-plus-button');
+ const findAllRelatedIssuesList = () => wrapper.findAllComponents(RelatedIssuesList);
+ const findRelatedIssuesList = (index) => findAllRelatedIssuesList().at(index);
const createComponent = ({
- mountFn = mountExtended,
pathIdSeparator = PathIdSeparator.Issue,
issuableType = TYPE_ISSUE,
canAdmin = false,
@@ -35,7 +37,7 @@ describe('RelatedIssuesBlock', () => {
autoCompleteEpics = true,
slots = '',
} = {}) => {
- wrapper = mountFn(RelatedIssuesBlock, {
+ wrapper = shallowMountExtended(RelatedIssuesBlock, {
propsData: {
pathIdSeparator,
issuableType,
@@ -76,7 +78,7 @@ describe('RelatedIssuesBlock', () => {
helpPath: '/help/user/project/issues/related_issues',
});
- expect(wrapper.find('.card-title').text()).toContain(titleText);
+ expect(wrapper.findByTestId('card-title').text()).toContain(titleText);
expect(findIssueCountBadgeAddButton().attributes('aria-label')).toBe(addButtonText);
},
);
@@ -94,12 +96,9 @@ describe('RelatedIssuesBlock', () => {
it('displays header text slot data', () => {
const headerText = '<div>custom header text</div>';
- createComponent({
- mountFn: shallowMountExtended,
- slots: { 'header-text': headerText },
- });
+ createComponent({ slots: { 'header-text': headerText } });
- expect(wrapper.find('.card-title').html()).toContain(headerText);
+ expect(wrapper.findByTestId('card-title').html()).toContain(headerText);
});
});
@@ -107,10 +106,7 @@ describe('RelatedIssuesBlock', () => {
it('displays header actions slot data', () => {
const headerActions = '<button data-testid="custom-button">custom button</button>';
- createComponent({
- mountFn: shallowMountExtended,
- slots: { 'header-actions': headerActions },
- });
+ createComponent({ slots: { 'header-actions': headerActions } });
expect(wrapper.findByTestId('custom-button').html()).toBe(headerActions);
});
@@ -153,10 +149,6 @@ describe('RelatedIssuesBlock', () => {
});
describe('showCategorizedIssues prop', () => {
- const issueList = () => wrapper.findAll('.js-related-issues-token-list-item');
- const categorizedHeadings = () => wrapper.findAll('h4');
- const headingTextAt = (index) => categorizedHeadings().at(index).text();
-
describe('when showCategorizedIssues=true', () => {
beforeEach(() =>
createComponent({
@@ -166,25 +158,25 @@ describe('RelatedIssuesBlock', () => {
);
it('should render issue tokens items', () => {
- expect(issueList()).toHaveLength(3);
+ expect(findAllRelatedIssuesList()).toHaveLength(3);
});
it('shows "Blocks" heading', () => {
- const blocks = linkedIssueTypesTextMap[linkedIssueTypesMap.BLOCKS];
-
- expect(headingTextAt(0)).toBe(blocks);
+ expect(findRelatedIssuesList(0).props('heading')).toBe(
+ linkedIssueTypesTextMap[linkedIssueTypesMap.BLOCKS],
+ );
});
it('shows "Is blocked by" heading', () => {
- const isBlockedBy = linkedIssueTypesTextMap[linkedIssueTypesMap.IS_BLOCKED_BY];
-
- expect(headingTextAt(1)).toBe(isBlockedBy);
+ expect(findRelatedIssuesList(1).props('heading')).toBe(
+ linkedIssueTypesTextMap[linkedIssueTypesMap.IS_BLOCKED_BY],
+ );
});
it('shows "Relates to" heading', () => {
- const relatesTo = linkedIssueTypesTextMap[linkedIssueTypesMap.RELATES_TO];
-
- expect(headingTextAt(2)).toBe(relatesTo);
+ expect(findRelatedIssuesList(2).props('heading')).toBe(
+ linkedIssueTypesTextMap[linkedIssueTypesMap.RELATES_TO],
+ );
});
});
@@ -194,8 +186,9 @@ describe('RelatedIssuesBlock', () => {
showCategorizedIssues: false,
relatedIssues: [issuable1, issuable2, issuable3],
});
- expect(issueList()).toHaveLength(3);
- expect(categorizedHeadings()).toHaveLength(0);
+ expect(findAllRelatedIssuesList()).toHaveLength(1);
+ expect(findRelatedIssuesList(0).props('relatedIssues')).toHaveLength(3);
+ expect(findRelatedIssuesList(0).props('heading')).toBe('');
});
});
});
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 b119c836411..6638f3d6289 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
@@ -1,6 +1,5 @@
-import { mount } from '@vue/test-utils';
+import { shallowMount } from '@vue/test-utils';
import MockAdapter from 'axios-mock-adapter';
-import { nextTick } from 'vue';
import waitForPromises from 'helpers/wait_for_promises';
import {
defaultProps,
@@ -17,7 +16,6 @@ import {
import { linkedIssueTypesMap } from '~/related_issues/constants';
import RelatedIssuesBlock from '~/related_issues/components/related_issues_block.vue';
import RelatedIssuesRoot from '~/related_issues/components/related_issues_root.vue';
-import relatedIssuesService from '~/related_issues/services/related_issues_service';
jest.mock('~/alert');
@@ -37,7 +35,7 @@ describe('RelatedIssuesRoot', () => {
});
const createComponent = ({ props = {}, data = {} } = {}) => {
- wrapper = mount(RelatedIssuesRoot, {
+ wrapper = shallowMount(RelatedIssuesRoot, {
propsData: {
...defaultProps,
...props,
@@ -58,14 +56,13 @@ describe('RelatedIssuesRoot', () => {
describe('when "relatedIssueRemoveRequest" event is emitted', () => {
describe('when emitted value is a numerical issue', () => {
beforeEach(async () => {
- jest
- .spyOn(relatedIssuesService.prototype, 'fetchRelatedIssues')
- .mockReturnValue(Promise.reject());
+ mock.onGet(defaultProps.endpoint).reply(HTTP_STATUS_OK, [issuable1]);
await createComponent();
- wrapper.vm.store.setRelatedIssues([issuable1]);
});
- it('removes related issue on API success', async () => {
+ // quarantine: https://gitlab.com/gitlab-org/gitlab/-/issues/417177
+ // eslint-disable-next-line jest/no-disabled-tests
+ it.skip('removes related issue on API success', async () => {
mock.onDelete(issuable1.referencePath).reply(HTTP_STATUS_OK, { issues: [] });
findRelatedIssuesBlock().vm.$emit('relatedIssueRemoveRequest', issuable1.id);
@@ -91,8 +88,7 @@ describe('RelatedIssuesRoot', () => {
const workItem = `gid://gitlab/WorkItem/${issuable1.id}`;
createComponent({ data: { state: { relatedIssues: [issuable1] } } });
- findRelatedIssuesBlock().vm.$emit('relatedIssueRemoveRequest', workItem);
- await nextTick();
+ await findRelatedIssuesBlock().vm.$emit('relatedIssueRemoveRequest', workItem);
expect(findRelatedIssuesBlock().props('relatedIssues')).toEqual([]);
});
@@ -103,8 +99,7 @@ describe('RelatedIssuesRoot', () => {
it('toggles related issues form to visible from hidden', async () => {
createComponent();
- findRelatedIssuesBlock().vm.$emit('toggleAddRelatedIssuesForm');
- await nextTick();
+ await findRelatedIssuesBlock().vm.$emit('toggleAddRelatedIssuesForm');
expect(findRelatedIssuesBlock().props('isFormVisible')).toBe(true);
});
@@ -112,24 +107,25 @@ describe('RelatedIssuesRoot', () => {
it('toggles related issues form to hidden from visible', async () => {
createComponent({ data: { isFormVisible: true } });
- findRelatedIssuesBlock().vm.$emit('toggleAddRelatedIssuesForm');
- await nextTick();
+ await findRelatedIssuesBlock().vm.$emit('toggleAddRelatedIssuesForm');
expect(findRelatedIssuesBlock().props('isFormVisible')).toBe(false);
});
});
describe('when "pendingIssuableRemoveRequest" event is emitted', () => {
- beforeEach(() => {
+ beforeEach(async () => {
createComponent();
- wrapper.vm.store.setPendingReferences([issuable1.reference]);
+ await findRelatedIssuesBlock().vm.$emit('addIssuableFormInput', {
+ untouchedRawReferences: [issuable1.reference],
+ touchedReference: '',
+ });
});
it('removes pending related issue', async () => {
expect(findRelatedIssuesBlock().props('pendingReferences')).toHaveLength(1);
- findRelatedIssuesBlock().vm.$emit('pendingIssuableRemoveRequest', 0);
- await nextTick();
+ await findRelatedIssuesBlock().vm.$emit('pendingIssuableRemoveRequest', 0);
expect(findRelatedIssuesBlock().props('pendingReferences')).toHaveLength(0);
});
@@ -137,33 +133,24 @@ describe('RelatedIssuesRoot', () => {
describe('when "addIssuableFormSubmit" event is emitted', () => {
beforeEach(async () => {
- jest
- .spyOn(relatedIssuesService.prototype, 'fetchRelatedIssues')
- .mockReturnValue(Promise.reject());
await createComponent();
- jest.spyOn(wrapper.vm, 'processAllReferences');
- jest.spyOn(wrapper.vm.service, 'addRelatedIssues');
createAlert.mockClear();
});
- it('processes references before submitting', () => {
+ it('processes references before submitting', async () => {
const input = '#123';
const linkedIssueType = linkedIssueTypesMap.RELATES_TO;
const emitObj = {
pendingReferences: input,
linkedIssueType,
};
-
- findRelatedIssuesBlock().vm.$emit('addIssuableFormSubmit', emitObj);
-
- expect(wrapper.vm.processAllReferences).toHaveBeenCalledWith(input);
- expect(wrapper.vm.service.addRelatedIssues).toHaveBeenCalledWith([input], linkedIssueType);
+ await findRelatedIssuesBlock().vm.$emit('addIssuableFormSubmit', emitObj);
+ expect(findRelatedIssuesBlock().props('pendingReferences')).toEqual([input]);
});
- it('submits zero pending issues as related issue', () => {
- wrapper.vm.store.setPendingReferences([]);
-
- findRelatedIssuesBlock().vm.$emit('addIssuableFormSubmit', {});
+ it('submits zero pending issues as related issue', async () => {
+ await findRelatedIssuesBlock().vm.$emit('addIssuableFormSubmit', {});
+ await waitForPromises();
expect(findRelatedIssuesBlock().props('pendingReferences')).toHaveLength(0);
expect(findRelatedIssuesBlock().props('relatedIssues')).toHaveLength(0);
@@ -177,9 +164,11 @@ describe('RelatedIssuesRoot', () => {
status: 'success',
},
});
- wrapper.vm.store.setPendingReferences([issuable1.reference]);
-
- findRelatedIssuesBlock().vm.$emit('addIssuableFormSubmit', {});
+ await findRelatedIssuesBlock().vm.$emit('addIssuableFormInput', {
+ untouchedRawReferences: [issuable1],
+ touchedReference: '',
+ });
+ await findRelatedIssuesBlock().vm.$emit('addIssuableFormSubmit', {});
await waitForPromises();
expect(findRelatedIssuesBlock().props('pendingReferences')).toHaveLength(0);
@@ -196,9 +185,11 @@ describe('RelatedIssuesRoot', () => {
status: 'success',
},
});
- wrapper.vm.store.setPendingReferences([issuable1.reference, issuable2.reference]);
-
- findRelatedIssuesBlock().vm.$emit('addIssuableFormSubmit', {});
+ await findRelatedIssuesBlock().vm.$emit('addIssuableFormInput', {
+ untouchedRawReferences: [issuable1.reference, issuable2.reference],
+ touchedReference: '',
+ });
+ await findRelatedIssuesBlock().vm.$emit('addIssuableFormSubmit', {});
await waitForPromises();
expect(findRelatedIssuesBlock().props('pendingReferences')).toHaveLength(0);
@@ -212,12 +203,15 @@ describe('RelatedIssuesRoot', () => {
const input = '#123';
const message = 'error';
mock.onPost(defaultProps.endpoint).reply(HTTP_STATUS_CONFLICT, { message });
- wrapper.vm.store.setPendingReferences([issuable1.reference, issuable2.reference]);
+ await findRelatedIssuesBlock().vm.$emit('addIssuableFormInput', {
+ untouchedRawReferences: [issuable1.reference, issuable2.reference],
+ touchedReference: '',
+ });
expect(findRelatedIssuesBlock().props('hasError')).toBe(false);
expect(findRelatedIssuesBlock().props('itemAddFailureMessage')).toBe(null);
- findRelatedIssuesBlock().vm.$emit('addIssuableFormSubmit', input);
+ await findRelatedIssuesBlock().vm.$emit('addIssuableFormSubmit', input);
await waitForPromises();
expect(findRelatedIssuesBlock().props('hasError')).toBe(true);
@@ -229,8 +223,7 @@ describe('RelatedIssuesRoot', () => {
beforeEach(() => createComponent({ data: { isFormVisible: true, inputValue: 'foo' } }));
it('hides form and resets input', async () => {
- findRelatedIssuesBlock().vm.$emit('addIssuableFormCancel');
- await nextTick();
+ await findRelatedIssuesBlock().vm.$emit('addIssuableFormCancel');
expect(findRelatedIssuesBlock().props('isFormVisible')).toBe(false);
expect(findRelatedIssuesBlock().props('inputValue')).toBe('');
@@ -243,11 +236,10 @@ describe('RelatedIssuesRoot', () => {
const input = '#123 ';
createComponent();
- findRelatedIssuesBlock().vm.$emit('addIssuableFormInput', {
+ await findRelatedIssuesBlock().vm.$emit('addIssuableFormInput', {
untouchedRawReferences: [input.trim()],
touchedReference: input,
});
- await nextTick();
expect(findRelatedIssuesBlock().props('pendingReferences')).toEqual([input.trim()]);
});
@@ -256,11 +248,10 @@ describe('RelatedIssuesRoot', () => {
const input = 'asdf/qwer#444 ';
createComponent();
- findRelatedIssuesBlock().vm.$emit('addIssuableFormInput', {
+ await findRelatedIssuesBlock().vm.$emit('addIssuableFormInput', {
untouchedRawReferences: [input.trim()],
touchedReference: input,
});
- await nextTick();
expect(findRelatedIssuesBlock().props('pendingReferences')).toEqual([input.trim()]);
});
@@ -270,11 +261,10 @@ describe('RelatedIssuesRoot', () => {
const input = `${link} `;
createComponent();
- findRelatedIssuesBlock().vm.$emit('addIssuableFormInput', {
+ await findRelatedIssuesBlock().vm.$emit('addIssuableFormInput', {
untouchedRawReferences: [input.trim()],
touchedReference: input,
});
- await nextTick();
expect(findRelatedIssuesBlock().props('pendingReferences')).toEqual([link]);
});
@@ -283,11 +273,10 @@ describe('RelatedIssuesRoot', () => {
const input = 'asdf/qwer#444 #12 ';
createComponent();
- findRelatedIssuesBlock().vm.$emit('addIssuableFormInput', {
+ await findRelatedIssuesBlock().vm.$emit('addIssuableFormInput', {
untouchedRawReferences: input.trim().split(/\s/),
touchedReference: '2',
});
- await nextTick();
expect(findRelatedIssuesBlock().props('pendingReferences')).toEqual([
'asdf/qwer#444',
@@ -299,11 +288,10 @@ describe('RelatedIssuesRoot', () => {
const input = 'something random ';
createComponent();
- findRelatedIssuesBlock().vm.$emit('addIssuableFormInput', {
+ await findRelatedIssuesBlock().vm.$emit('addIssuableFormInput', {
untouchedRawReferences: input.trim().split(/\s/),
touchedReference: '2',
});
- await nextTick();
expect(findRelatedIssuesBlock().props('pendingReferences')).toEqual([
'something',
@@ -317,11 +305,10 @@ describe('RelatedIssuesRoot', () => {
const input = '23';
createComponent({ props: { pathIdSeparator } });
- findRelatedIssuesBlock().vm.$emit('addIssuableFormInput', {
+ await findRelatedIssuesBlock().vm.$emit('addIssuableFormInput', {
untouchedRawReferences: input.trim().split(/\s/),
touchedReference: input,
});
- await nextTick();
expect(findRelatedIssuesBlock().props('inputValue')).toBe(`${pathIdSeparator}${input}`);
},
@@ -331,15 +318,13 @@ describe('RelatedIssuesRoot', () => {
describe('when "addIssuableFormBlur" event is emitted', () => {
beforeEach(() => {
createComponent();
- jest.spyOn(wrapper.vm, 'processAllReferences').mockImplementation(() => {});
});
- it('adds any references to pending when blurring', () => {
+ it('adds any references to pending when blurring', async () => {
const input = '#123';
-
- findRelatedIssuesBlock().vm.$emit('addIssuableFormBlur', input);
-
- expect(wrapper.vm.processAllReferences).toHaveBeenCalledWith(input);
+ expect(findRelatedIssuesBlock().props('pendingReferences')).toEqual([]);
+ await findRelatedIssuesBlock().vm.$emit('addIssuableFormBlur', input);
+ expect(findRelatedIssuesBlock().props('pendingReferences')).toEqual([input]);
});
});
});
diff --git a/spec/frontend/issues/dashboard/components/issues_dashboard_app_spec.js b/spec/frontend/issues/dashboard/components/issues_dashboard_app_spec.js
index c152a5ef9a8..148c6230b9f 100644
--- a/spec/frontend/issues/dashboard/components/issues_dashboard_app_spec.js
+++ b/spec/frontend/issues/dashboard/components/issues_dashboard_app_spec.js
@@ -54,6 +54,7 @@ describe('IssuesDashboardApp component', () => {
const defaultProvide = {
autocompleteAwardEmojisPath: 'autocomplete/award/emojis/path',
+ autocompleteUsersPath: 'autocomplete/users.json',
calendarPath: 'calendar/path',
dashboardLabelsPath: 'dashboard/labels/path',
dashboardMilestonesPath: 'dashboard/milestones/path',
@@ -120,7 +121,7 @@ describe('IssuesDashboardApp component', () => {
await waitForPromises();
});
- // https://gitlab.com/gitlab-org/gitlab/-/issues/391722
+ // quarantine: https://gitlab.com/gitlab-org/gitlab/-/issues/391722
// eslint-disable-next-line jest/no-disabled-tests
it.skip('renders IssuableList component', () => {
expect(findIssuableList().props()).toMatchObject({
diff --git a/spec/frontend/issues/list/components/empty_state_without_any_issues_spec.js b/spec/frontend/issues/list/components/empty_state_without_any_issues_spec.js
index a61e7ed1e86..8e69213ebba 100644
--- a/spec/frontend/issues/list/components/empty_state_without_any_issues_spec.js
+++ b/spec/frontend/issues/list/components/empty_state_without_any_issues_spec.js
@@ -23,6 +23,7 @@ describe('EmptyStateWithoutAnyIssues component', () => {
newProjectPath: 'new/project/path',
showNewIssueLink: false,
signInPath: 'sign/in/path',
+ groupId: '',
};
const findCsvImportExportButtons = () => wrapper.findComponent(CsvImportExportButtons);
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 0e87e5e6595..72bf4826056 100644
--- a/spec/frontend/issues/list/components/issues_list_app_spec.js
+++ b/spec/frontend/issues/list/components/issues_list_app_spec.js
@@ -115,6 +115,7 @@ describe('CE IssuesListApp component', () => {
rssPath: 'rss/path',
showNewIssueLink: true,
signInPath: 'sign/in/path',
+ groupId: '',
};
let defaultQueryResponse = getIssuesQueryResponse;
diff --git a/spec/frontend/issues/show/components/delete_issue_modal_spec.js b/spec/frontend/issues/show/components/delete_issue_modal_spec.js
index b8adeb24005..f122180a403 100644
--- a/spec/frontend/issues/show/components/delete_issue_modal_spec.js
+++ b/spec/frontend/issues/show/components/delete_issue_modal_spec.js
@@ -37,11 +37,14 @@ describe('DeleteIssueModal component', () => {
});
describe('when "primary" event is emitted', () => {
- let formSubmitSpy;
+ const submitMock = jest.fn();
+ // Mock the form submit method
+ Object.defineProperty(HTMLFormElement.prototype, 'submit', {
+ value: submitMock,
+ });
beforeEach(() => {
wrapper = mountComponent();
- formSubmitSpy = jest.spyOn(wrapper.vm.$refs.form, 'submit');
findModal().vm.$emit('primary');
});
@@ -50,7 +53,7 @@ describe('DeleteIssueModal component', () => {
});
it('submits the form', () => {
- expect(formSubmitSpy).toHaveBeenCalled();
+ expect(submitMock).toHaveBeenCalledTimes(1);
});
});
});
diff --git a/spec/frontend/issues/show/components/fields/description_spec.js b/spec/frontend/issues/show/components/fields/description_spec.js
index c7116f380a1..5e329d44acb 100644
--- a/spec/frontend/issues/show/components/fields/description_spec.js
+++ b/spec/frontend/issues/show/components/fields/description_spec.js
@@ -3,20 +3,19 @@ import DescriptionField from '~/issues/show/components/fields/description.vue';
import eventHub from '~/issues/show/event_hub';
import MarkdownField from '~/vue_shared/components/markdown/field.vue';
import MarkdownEditor from '~/vue_shared/components/markdown/markdown_editor.vue';
+import { mockTracking } from 'helpers/tracking_helper';
describe('Description field component', () => {
let wrapper;
+ let trackingSpy;
- const findTextarea = () => wrapper.findComponent({ ref: 'textarea' });
const findMarkdownEditor = () => wrapper.findComponent(MarkdownEditor);
-
- const mountComponent = ({ description = 'test', contentEditorOnIssues = false } = {}) =>
- shallowMount(DescriptionField, {
+ const mountComponent = ({ description = 'test', contentEditorOnIssues = false } = {}) => {
+ wrapper = shallowMount(DescriptionField, {
attachTo: document.body,
propsData: {
markdownPreviewPath: '/',
markdownDocsPath: '/',
- quickActionsDocsPath: '/',
value: description,
},
provide: {
@@ -28,90 +27,66 @@ describe('Description field component', () => {
MarkdownField,
},
});
+ };
beforeEach(() => {
+ trackingSpy = mockTracking(undefined, null, jest.spyOn);
jest.spyOn(eventHub, '$emit');
- });
-
- it('renders markdown field with description', () => {
- wrapper = mountComponent();
-
- expect(findTextarea().element.value).toBe('test');
- });
-
- it('renders markdown field with a markdown description', () => {
- const markdown = '**test**';
-
- wrapper = mountComponent({ description: markdown });
- expect(findTextarea().element.value).toBe(markdown);
+ mountComponent({ contentEditorOnIssues: true });
});
- it('focuses field when mounted', () => {
- wrapper = mountComponent();
+ it('passes feature flag to the MarkdownEditorComponent', () => {
+ expect(findMarkdownEditor().props('enableContentEditor')).toBe(true);
- expect(document.activeElement).toBe(findTextarea().element);
- });
-
- it('triggers update with meta+enter', () => {
- wrapper = mountComponent();
+ mountComponent({ contentEditorOnIssues: false });
- findTextarea().trigger('keydown.enter', { metaKey: true });
-
- expect(eventHub.$emit).toHaveBeenCalledWith('update.issuable');
+ expect(findMarkdownEditor().props('enableContentEditor')).toBe(false);
});
- it('triggers update with ctrl+enter', () => {
- wrapper = mountComponent();
-
- findTextarea().trigger('keydown.enter', { ctrlKey: true });
-
- expect(eventHub.$emit).toHaveBeenCalledWith('update.issuable');
+ it('uses the MarkdownEditor component to edit markdown', () => {
+ expect(findMarkdownEditor().props()).toMatchObject({
+ value: 'test',
+ renderMarkdownPath: '/',
+ autofocus: true,
+ supportsQuickActions: true,
+ markdownDocsPath: '/',
+ enableAutocomplete: true,
+ });
});
- describe('when contentEditorOnIssues feature flag is on', () => {
+ describe.each`
+ testDescription | metaKey | ctrlKey
+ ${'when meta+enter is pressed'} | ${true} | ${false}
+ ${'when ctrl+enter is pressed'} | ${false} | ${true}
+ `('$testDescription', ({ metaKey, ctrlKey }) => {
beforeEach(() => {
- wrapper = mountComponent({ contentEditorOnIssues: true });
- });
-
- it('uses the MarkdownEditor component to edit markdown', () => {
- expect(findMarkdownEditor().props()).toMatchObject({
- value: 'test',
- renderMarkdownPath: '/',
- autofocus: true,
- supportsQuickActions: true,
- quickActionsDocsPath: expect.any(String),
- markdownDocsPath: '/',
- enableAutocomplete: true,
- });
- });
-
- it('triggers update with meta+enter', () => {
findMarkdownEditor().vm.$emit('keydown', {
type: 'keydown',
keyCode: 13,
- metaKey: true,
+ metaKey,
+ ctrlKey,
});
+ });
+ it('triggers update', () => {
expect(eventHub.$emit).toHaveBeenCalledWith('update.issuable');
});
- it('triggers update with ctrl+enter', () => {
- findMarkdownEditor().vm.$emit('keydown', {
- type: 'keydown',
- keyCode: 13,
- ctrlKey: true,
+ it('tracks event', () => {
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'editor_type_used', {
+ context: 'Issue',
+ editorType: 'editor_type_plain_text_editor',
+ label: 'editor_tracking',
});
-
- expect(eventHub.$emit).toHaveBeenCalledWith('update.issuable');
});
+ });
- it('emits input event when MarkdownEditor emits input event', () => {
- const markdown = 'markdown';
+ it('emits input event when MarkdownEditor emits input event', () => {
+ const markdown = 'markdown';
- findMarkdownEditor().vm.$emit('input', markdown);
+ findMarkdownEditor().vm.$emit('input', markdown);
- expect(wrapper.emitted('input')).toEqual([[markdown]]);
- });
+ expect(wrapper.emitted('input')).toEqual([[markdown]]);
});
});
diff --git a/spec/frontend/issues/show/components/header_actions_spec.js b/spec/frontend/issues/show/components/header_actions_spec.js
index 9a503a2d882..8a98b2b702a 100644
--- a/spec/frontend/issues/show/components/header_actions_spec.js
+++ b/spec/frontend/issues/show/components/header_actions_spec.js
@@ -1,12 +1,20 @@
import Vue, { nextTick } from 'vue';
-import { GlDropdownItem, GlLink, GlModal, GlButton } from '@gitlab/ui';
+import { GlDropdown, GlDropdownItem, GlLink, GlModal, GlButton } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import Vuex from 'vuex';
import VueApollo from 'vue-apollo';
import waitForPromises from 'helpers/wait_for_promises';
import { mockTracking } from 'helpers/tracking_helper';
import { createAlert, VARIANT_SUCCESS } from '~/alert';
-import { STATUS_CLOSED, STATUS_OPEN, TYPE_INCIDENT, TYPE_ISSUE } from '~/issues/constants';
+import {
+ STATUS_CLOSED,
+ STATUS_OPEN,
+ TYPE_INCIDENT,
+ TYPE_ISSUE,
+ TYPE_TEST_CASE,
+ TYPE_ALERT,
+ TYPE_MERGE_REQUEST,
+} from '~/issues/constants';
import DeleteIssueModal from '~/issues/show/components/delete_issue_modal.vue';
import AbuseCategorySelector from '~/abuse_reports/components/abuse_category_selector.vue';
import HeaderActions from '~/issues/show/components/header_actions.vue';
@@ -14,6 +22,7 @@ import { ISSUE_STATE_EVENT_CLOSE, ISSUE_STATE_EVENT_REOPEN } from '~/issues/show
import issuesEventHub from '~/issues/show/event_hub';
import promoteToEpicMutation from '~/issues/show/queries/promote_to_epic.mutation.graphql';
import * as urlUtility from '~/lib/utils/url_utility';
+import { capitalizeFirstCharacter } from '~/lib/utils/text_utility';
import eventHub from '~/notes/event_hub';
import createStore from '~/notes/stores';
import createMockApollo from 'helpers/mock_apollo_helper';
@@ -690,4 +699,27 @@ describe('HeaderActions component', () => {
},
);
});
+
+ describe('issue type text', () => {
+ it.each`
+ issueType | expectedText
+ ${TYPE_ISSUE} | ${'issue'}
+ ${TYPE_INCIDENT} | ${'incident'}
+ ${TYPE_MERGE_REQUEST} | ${'merge request'}
+ ${TYPE_ALERT} | ${'alert'}
+ ${TYPE_TEST_CASE} | ${'test case'}
+ ${'unknown'} | ${'unknown'}
+ `('$issueType', ({ issueType, expectedText }) => {
+ wrapper = mountComponent({
+ movedMrSidebarEnabled: true,
+ props: { issueType, issuableEmailAddress: 'mock-email-address' },
+ });
+
+ expect(wrapper.findComponent(GlDropdown).attributes('text')).toBe(
+ `${capitalizeFirstCharacter(expectedText)} actions`,
+ );
+ expect(findDropdownBy('copy-email').text()).toBe(`Copy ${expectedText} email address`);
+ expect(findDesktopDropdownItems().at(0).text()).toBe(`New related ${expectedText}`);
+ });
+ });
});
diff --git a/spec/frontend/issues/show/components/incidents/timeline_events_item_spec.js b/spec/frontend/issues/show/components/incidents/timeline_events_item_spec.js
index 24653a23036..2500c808073 100644
--- a/spec/frontend/issues/show/components/incidents/timeline_events_item_spec.js
+++ b/spec/frontend/issues/show/components/incidents/timeline_events_item_spec.js
@@ -1,5 +1,5 @@
import timezoneMock from 'timezone-mock';
-import { GlIcon, GlDropdown, GlBadge } from '@gitlab/ui';
+import { GlIcon, GlDisclosureDropdown, GlBadge } from '@gitlab/ui';
import { nextTick } from 'vue';
import { timelineItemI18n } from '~/issues/show/components/incidents/constants';
import { mountExtended } from 'helpers/vue_test_utils_helper';
@@ -28,7 +28,7 @@ describe('IncidentTimelineEventList', () => {
const findCommentIcon = () => wrapper.findComponent(GlIcon);
const findEventTime = () => wrapper.findByTestId('event-time');
const findEventTags = () => wrapper.findAllComponents(GlBadge);
- const findDropdown = () => wrapper.findComponent(GlDropdown);
+ const findGlDropdown = () => wrapper.findComponent(GlDisclosureDropdown);
const findDeleteButton = () => wrapper.findByText(timelineItemI18n.delete);
const findEditButton = () => wrapper.findByText(timelineItemI18n.edit);
@@ -85,7 +85,7 @@ describe('IncidentTimelineEventList', () => {
describe('action dropdown', () => {
it('does not show the action dropdown by default', () => {
- expect(findDropdown().exists()).toBe(false);
+ expect(findGlDropdown().exists()).toBe(false);
expect(findDeleteButton().exists()).toBe(false);
});
@@ -100,14 +100,14 @@ describe('IncidentTimelineEventList', () => {
mockEvent: systemGeneratedMockEvent,
});
- expect(findDropdown().exists()).toBe(true);
+ expect(findGlDropdown().exists()).toBe(true);
expect(findEditButton().exists()).toBe(false);
});
it('shows dropdown and delete item when user has update permission', () => {
mountComponent({ provide: { canUpdateTimelineEvent: true } });
- expect(findDropdown().exists()).toBe(true);
+ expect(findGlDropdown().exists()).toBe(true);
expect(findDeleteButton().exists()).toBe(true);
});
diff --git a/spec/frontend/issues/show/components/task_list_item_actions_spec.js b/spec/frontend/issues/show/components/task_list_item_actions_spec.js
index 0b3ff0667b1..93cb7b5ae16 100644
--- a/spec/frontend/issues/show/components/task_list_item_actions_spec.js
+++ b/spec/frontend/issues/show/components/task_list_item_actions_spec.js
@@ -3,6 +3,8 @@ import { shallowMount } from '@vue/test-utils';
import TaskListItemActions from '~/issues/show/components/task_list_item_actions.vue';
import eventHub from '~/issues/show/event_hub';
+jest.mock('~/issues/show/event_hub');
+
describe('TaskListItemActions component', () => {
let wrapper;
@@ -37,16 +39,12 @@ describe('TaskListItemActions component', () => {
});
it('emits event when `Convert to task` dropdown item is clicked', () => {
- jest.spyOn(eventHub, '$emit');
-
findConvertToTaskItem().vm.$emit('action');
expect(eventHub.$emit).toHaveBeenCalledWith('convert-task-list-item', '3:1-3:10');
});
it('emits event when `Delete` dropdown item is clicked', () => {
- jest.spyOn(eventHub, '$emit');
-
findDeleteItem().vm.$emit('action');
expect(eventHub.$emit).toHaveBeenCalledWith('delete-task-list-item', '3:1-3:10');
diff --git a/spec/frontend/issues/show/issue_spec.js b/spec/frontend/issues/show/issue_spec.js
index 2980a6c33ee..561035242eb 100644
--- a/spec/frontend/issues/show/issue_spec.js
+++ b/spec/frontend/issues/show/issue_spec.js
@@ -19,7 +19,7 @@ const setupHTML = (initialData) => {
describe('Issue show index', () => {
describe('initIssueApp', () => {
- // https://gitlab.com/gitlab-org/gitlab/-/issues/390368
+ // quarantine: https://gitlab.com/gitlab-org/gitlab/-/issues/390368
// eslint-disable-next-line jest/no-disabled-tests
it.skip('should initialize app with no potential XSS attack', async () => {
const alertSpy = jest.spyOn(window, 'alert').mockImplementation(() => {});
diff --git a/spec/frontend/jira_connect/branches/components/project_dropdown_spec.js b/spec/frontend/jira_connect/branches/components/project_dropdown_spec.js
index 0a887efee4b..f4f4936a134 100644
--- a/spec/frontend/jira_connect/branches/components/project_dropdown_spec.js
+++ b/spec/frontend/jira_connect/branches/components/project_dropdown_spec.js
@@ -137,7 +137,6 @@ describe('ProjectDropdown', () => {
describe('when searching branches', () => {
it('triggers a refetch', async () => {
createComponent({ mountFn: mount });
- jest.clearAllMocks();
const mockSearchTerm = 'gitl';
await findDropdown().vm.$emit('search', mockSearchTerm);
diff --git a/spec/frontend/jira_connect/branches/components/source_branch_dropdown_spec.js b/spec/frontend/jira_connect/branches/components/source_branch_dropdown_spec.js
index a3bc8e861b2..cf2dacb50d8 100644
--- a/spec/frontend/jira_connect/branches/components/source_branch_dropdown_spec.js
+++ b/spec/frontend/jira_connect/branches/components/source_branch_dropdown_spec.js
@@ -104,7 +104,6 @@ describe('SourceBranchDropdown', () => {
it('triggers a refetch', async () => {
createComponent({ mountFn: mount, props: { selectedProject: mockSelectedProject } });
await waitForPromises();
- jest.clearAllMocks();
const mockSearchTerm = 'mai';
await findListbox().vm.$emit('search', mockSearchTerm);
diff --git a/spec/frontend/jira_connect/subscriptions/components/app_spec.js b/spec/frontend/jira_connect/subscriptions/components/app_spec.js
index 26a9d07321c..ea578836a12 100644
--- a/spec/frontend/jira_connect/subscriptions/components/app_spec.js
+++ b/spec/frontend/jira_connect/subscriptions/components/app_spec.js
@@ -7,6 +7,7 @@ import SignInPage from '~/jira_connect/subscriptions/pages/sign_in/sign_in_page.
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 FeedbackBanner from '~/jira_connect/subscriptions/components/feedback_banner.vue';
import createStore from '~/jira_connect/subscriptions/store';
import { SET_ALERT } from '~/jira_connect/subscriptions/store/mutation_types';
import { I18N_DEFAULT_SIGN_IN_ERROR_MESSAGE } from '~/jira_connect/subscriptions/constants';
@@ -31,6 +32,7 @@ describe('JiraConnectApp', () => {
const findSubscriptionsPage = () => wrapper.findComponent(SubscriptionsPage);
const findUserLink = () => wrapper.findComponent(UserLink);
const findBrowserSupportAlert = () => wrapper.findComponent(BrowserSupportAlert);
+ const findFeedbackBanner = () => wrapper.findComponent(FeedbackBanner);
const createComponent = ({ provide, initialState = {} } = {}) => {
store = createStore({ ...initialState, subscriptions: [mockSubscription] });
@@ -66,6 +68,12 @@ describe('JiraConnectApp', () => {
expect(findJiraConnectApp().exists()).toBe(false);
});
+ it('renders FeedbackBanner', () => {
+ createComponent();
+
+ expect(findFeedbackBanner().exists()).toBe(true);
+ });
+
describe.each`
scenario | currentUser | expectUserLink | expectSignInPage | expectSubscriptionsPage
${'user is not signed in'} | ${undefined} | ${false} | ${true} | ${false}
diff --git a/spec/frontend/jira_connect/subscriptions/components/feedback_banner_spec.js b/spec/frontend/jira_connect/subscriptions/components/feedback_banner_spec.js
new file mode 100644
index 00000000000..8debfaad5bb
--- /dev/null
+++ b/spec/frontend/jira_connect/subscriptions/components/feedback_banner_spec.js
@@ -0,0 +1,45 @@
+import { GlBanner } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import FeedbackBanner from '~/jira_connect/subscriptions/components/feedback_banner.vue';
+import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
+
+describe('FeedbackBanner', () => {
+ let wrapper;
+
+ const createComponent = () => {
+ wrapper = shallowMount(FeedbackBanner);
+ };
+
+ const findBanner = () => wrapper.findComponent(GlBanner);
+ const findLocalStorageSync = () => wrapper.findComponent(LocalStorageSync);
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders a banner with button', () => {
+ expect(findBanner().props()).toMatchObject({
+ title: FeedbackBanner.i18n.title,
+ buttonText: FeedbackBanner.i18n.buttonText,
+ buttonLink: FeedbackBanner.feedbackIssueUrl,
+ });
+ });
+
+ it('uses localStorage with default value as false', () => {
+ expect(findLocalStorageSync().props().value).toBe(false);
+ });
+
+ describe('when banner is dimsissed', () => {
+ beforeEach(() => {
+ findBanner().vm.$emit('close');
+ });
+
+ it('hides the banner', () => {
+ expect(findBanner().exists()).toBe(false);
+ });
+
+ it('updates localStorage value to true', () => {
+ expect(findLocalStorageSync().props().value).toBe(true);
+ });
+ });
+});
diff --git a/spec/frontend/jobs/components/job/job_app_spec.js b/spec/frontend/jobs/components/job/job_app_spec.js
index 394fc8ad43c..c925131dd9c 100644
--- a/spec/frontend/jobs/components/job/job_app_spec.js
+++ b/spec/frontend/jobs/components/job/job_app_spec.js
@@ -9,7 +9,7 @@ import EnvironmentsBlock from '~/jobs/components/job/environments_block.vue';
import ErasedBlock from '~/jobs/components/job/erased_block.vue';
import JobApp from '~/jobs/components/job/job_app.vue';
import JobLog from '~/jobs/components/log/log.vue';
-import JobLogTopBar from '~/jobs/components/job/job_log_controllers.vue';
+import JobLogTopBar from 'ee_else_ce/jobs/components/job/job_log_controllers.vue';
import Sidebar from '~/jobs/components/job/sidebar/sidebar.vue';
import StuckBlock from '~/jobs/components/job/stuck_block.vue';
import UnmetPrerequisitesBlock from '~/jobs/components/job/unmet_prerequisites_block.vue';
diff --git a/spec/frontend/jobs/components/job/job_container_item_spec.js b/spec/frontend/jobs/components/job/job_container_item_spec.js
index 8121aa1172f..39782130d38 100644
--- a/spec/frontend/jobs/components/job/job_container_item_spec.js
+++ b/spec/frontend/jobs/components/job/job_container_item_spec.js
@@ -9,8 +9,8 @@ import job from '../../mock_data';
describe('JobContainerItem', () => {
let wrapper;
- const findCiIconComponent = () => wrapper.findComponent(CiIcon);
- const findGlIconComponent = () => wrapper.findComponent(GlIcon);
+ const findCiIcon = () => wrapper.findComponent(CiIcon);
+ const findGlIcon = () => wrapper.findComponent(GlIcon);
function createComponent(jobData = {}, props = { isActive: false, retried: false }) {
wrapper = shallowMount(JobContainerItem, {
@@ -30,9 +30,7 @@ describe('JobContainerItem', () => {
});
it('displays a status icon', () => {
- const ciIcon = findCiIconComponent();
-
- expect(ciIcon.props('status')).toBe(job.status);
+ expect(findCiIcon().props('status')).toBe(job.status);
});
it('displays the job name', () => {
@@ -52,9 +50,7 @@ describe('JobContainerItem', () => {
});
it('displays an arrow sprite icon', () => {
- const icon = findGlIconComponent();
-
- expect(icon.props('name')).toBe('arrow-right');
+ expect(findGlIcon().props('name')).toBe('arrow-right');
});
});
@@ -64,9 +60,7 @@ describe('JobContainerItem', () => {
});
it('displays a retry icon', () => {
- const icon = findGlIconComponent();
-
- expect(icon.props('name')).toBe('retry');
+ expect(findGlIcon().props('name')).toBe('retry');
});
});
diff --git a/spec/frontend/lib/utils/common_utils_spec.js b/spec/frontend/lib/utils/common_utils_spec.js
index b4ec00ab766..444d4a96f9c 100644
--- a/spec/frontend/lib/utils/common_utils_spec.js
+++ b/spec/frontend/lib/utils/common_utils_spec.js
@@ -1140,4 +1140,38 @@ describe('common_utils', () => {
expect(result).toEqual([{ hello: '' }, { helloWorld: '' }]);
});
});
+
+ describe('isCurrentUser', () => {
+ describe('when user is not signed in', () => {
+ it('returns `false`', () => {
+ window.gon.current_user_id = null;
+
+ expect(commonUtils.isCurrentUser(1)).toBe(false);
+ });
+ });
+
+ describe('when current user id does not match the provided user id', () => {
+ it('returns `false`', () => {
+ window.gon.current_user_id = 2;
+
+ expect(commonUtils.isCurrentUser(1)).toBe(false);
+ });
+ });
+
+ describe('when current user id matches the provided user id', () => {
+ it('returns `true`', () => {
+ window.gon.current_user_id = 1;
+
+ expect(commonUtils.isCurrentUser(1)).toBe(true);
+ });
+ });
+
+ describe('when provided user id is a string and it matches current user id', () => {
+ it('returns `true`', () => {
+ window.gon.current_user_id = 1;
+
+ expect(commonUtils.isCurrentUser('1')).toBe(true);
+ });
+ });
+ });
});
diff --git a/spec/frontend/lib/utils/datetime/date_format_utility_spec.js b/spec/frontend/lib/utils/datetime/date_format_utility_spec.js
index e7a6367eeac..65018fe1625 100644
--- a/spec/frontend/lib/utils/datetime/date_format_utility_spec.js
+++ b/spec/frontend/lib/utils/datetime/date_format_utility_spec.js
@@ -152,3 +152,18 @@ describe('formatUtcOffset', () => {
expect(utils.formatUtcOffset(offset)).toEqual(expected);
});
});
+
+describe('humanTimeframe', () => {
+ it.each`
+ startDate | dueDate | returnValue
+ ${'2021-1-1'} | ${'2021-2-28'} | ${'Jan 1 – Feb 28, 2021'}
+ ${'2021-1-1'} | ${'2022-2-28'} | ${'Jan 1, 2021 – Feb 28, 2022'}
+ ${'2021-1-1'} | ${null} | ${'Jan 1, 2021 – No due date'}
+ ${null} | ${'2021-2-28'} | ${'No start date – Feb 28, 2021'}
+ `(
+ 'returns string "$returnValue" when startDate is $startDate and dueDate is $dueDate',
+ ({ startDate, dueDate, returnValue }) => {
+ expect(utils.humanTimeframe(startDate, dueDate)).toBe(returnValue);
+ },
+ );
+});
diff --git a/spec/frontend/lib/utils/downloader_spec.js b/spec/frontend/lib/utils/downloader_spec.js
index c14cba3a62b..a95b46d1440 100644
--- a/spec/frontend/lib/utils/downloader_spec.js
+++ b/spec/frontend/lib/utils/downloader_spec.js
@@ -8,10 +8,6 @@ describe('Downloader', () => {
jest.spyOn(document, 'createElement').mockImplementation(() => a);
});
- afterEach(() => {
- jest.clearAllMocks();
- });
-
describe('when inline file content is provided', () => {
const fileData = 'inline content';
const fileName = 'test.csv';
diff --git a/spec/frontend/lib/utils/forms_spec.js b/spec/frontend/lib/utils/forms_spec.js
index 2f71b26b29a..b97f5bf3c51 100644
--- a/spec/frontend/lib/utils/forms_spec.js
+++ b/spec/frontend/lib/utils/forms_spec.js
@@ -1,7 +1,12 @@
import {
serializeForm,
serializeFormObject,
+ safeTrim,
isEmptyValue,
+ hasMinimumLength,
+ isParseableAsInteger,
+ isIntegerGreaterThan,
+ isEmail,
parseRailsFormFields,
} from '~/lib/utils/forms';
@@ -99,6 +104,22 @@ describe('lib/utils/forms', () => {
});
});
+ describe('safeTrim', () => {
+ it.each`
+ input | returnValue
+ ${''} | ${''}
+ ${[]} | ${[]}
+ ${null} | ${null}
+ ${undefined} | ${undefined}
+ ${' '} | ${''}
+ ${'hello '} | ${'hello'}
+ ${'hello'} | ${'hello'}
+ ${0} | ${0}
+ `('returns $returnValue for value $input', ({ input, returnValue }) => {
+ expect(safeTrim(input)).toEqual(returnValue);
+ });
+ });
+
describe('isEmptyValue', () => {
it.each`
input | returnValue
@@ -106,14 +127,102 @@ describe('lib/utils/forms', () => {
${[]} | ${true}
${null} | ${true}
${undefined} | ${true}
+ ${' '} | ${true}
${'hello'} | ${false}
- ${' '} | ${false}
${0} | ${false}
`('returns $returnValue for value $input', ({ input, returnValue }) => {
expect(isEmptyValue(input)).toBe(returnValue);
});
});
+ describe('hasMinimumLength', () => {
+ it.each`
+ input | minLength | returnValue
+ ${['o', 't']} | ${1} | ${true}
+ ${'hello'} | ${3} | ${true}
+ ${' '} | ${2} | ${false}
+ ${''} | ${0} | ${false}
+ ${''} | ${8} | ${false}
+ ${[]} | ${0} | ${false}
+ ${null} | ${8} | ${false}
+ ${undefined} | ${8} | ${false}
+ ${'hello'} | ${8} | ${false}
+ ${0} | ${8} | ${false}
+ ${4} | ${1} | ${false}
+ `(
+ 'returns $returnValue for value $input and minLength $minLength',
+ ({ input, minLength, returnValue }) => {
+ expect(hasMinimumLength(input, minLength)).toBe(returnValue);
+ },
+ );
+ });
+
+ describe('isPareseableInteger', () => {
+ it.each`
+ input | returnValue
+ ${'0'} | ${true}
+ ${'12'} | ${true}
+ ${''} | ${false}
+ ${[]} | ${false}
+ ${null} | ${false}
+ ${undefined} | ${false}
+ ${'hello'} | ${false}
+ ${' '} | ${false}
+ ${'12.4'} | ${false}
+ ${'12ef'} | ${false}
+ `('returns $returnValue for value $input', ({ input, returnValue }) => {
+ expect(isParseableAsInteger(input)).toBe(returnValue);
+ });
+ });
+
+ describe('isIntegerGreaterThan', () => {
+ it.each`
+ input | greaterThan | returnValue
+ ${25} | ${8} | ${true}
+ ${'25'} | ${8} | ${true}
+ ${'4'} | ${1} | ${true}
+ ${'4'} | ${8} | ${false}
+ ${'9.5'} | ${8} | ${false}
+ ${'9.5e'} | ${8} | ${false}
+ ${['o', 't']} | ${0} | ${false}
+ ${'hello'} | ${0} | ${false}
+ ${' '} | ${0} | ${false}
+ ${''} | ${0} | ${false}
+ ${''} | ${8} | ${false}
+ ${[]} | ${0} | ${false}
+ ${null} | ${0} | ${false}
+ ${undefined} | ${0} | ${false}
+ ${'hello'} | ${0} | ${false}
+ ${0} | ${0} | ${false}
+ `(
+ 'returns $returnValue for value $input and greaterThan $greaterThan',
+ ({ input, greaterThan, returnValue }) => {
+ expect(isIntegerGreaterThan(input, greaterThan)).toBe(returnValue);
+ },
+ );
+ });
+
+ describe('isEmail', () => {
+ it.each`
+ input | returnValue
+ ${'user-with_special-chars@example.com'} | ${true}
+ ${'user@subdomain.example.com'} | ${true}
+ ${'user@example.com'} | ${true}
+ ${'user@example.co'} | ${true}
+ ${'user@example.c'} | ${false}
+ ${'user@example'} | ${false}
+ ${''} | ${false}
+ ${[]} | ${false}
+ ${null} | ${false}
+ ${undefined} | ${false}
+ ${'hello'} | ${false}
+ ${' '} | ${false}
+ ${'12'} | ${false}
+ `('returns $returnValue for value $input', ({ input, returnValue }) => {
+ expect(isEmail(input)).toBe(returnValue);
+ });
+ });
+
describe('serializeFormObject', () => {
it('returns an serialized object', () => {
const form = {
diff --git a/spec/frontend/lib/utils/ref_validator_spec.js b/spec/frontend/lib/utils/ref_validator_spec.js
index 7185ebf0a24..97896d74dff 100644
--- a/spec/frontend/lib/utils/ref_validator_spec.js
+++ b/spec/frontend/lib/utils/ref_validator_spec.js
@@ -65,9 +65,6 @@ describe('~/lib/utils/ref_validator', () => {
['foo.123.', validationMessages.DisallowedSequencePostfixesValidationMessage],
['foo/', validationMessages.DisallowedPostfixesValidationMessage],
-
- ['control-character\x7f', validationMessages.ControlCharactersValidationMessage],
- ['control-character\x15', validationMessages.ControlCharactersValidationMessage],
])('tag with name "%s"', (tagName, validationMessage) => {
it(`should be invalid with validation message "${validationMessage}"`, () => {
const result = validateTag(tagName);
@@ -75,5 +72,25 @@ describe('~/lib/utils/ref_validator', () => {
expect(result.validationErrors).toContain(validationMessage);
});
});
+
+ // NOTE: control characters cannot be used in test names because they cause test report XML parsing errors
+ describe.each([
+ [
+ 'control-character x7f',
+ 'control-character\x7f',
+ validationMessages.ControlCharactersValidationMessage,
+ ],
+ [
+ 'control-character x15',
+ 'control-character\x15',
+ validationMessages.ControlCharactersValidationMessage,
+ ],
+ ])('tag with name "%s"', (_, tagName, validationMessage) => {
+ it(`should be invalid with validation message "${validationMessage}"`, () => {
+ const result = validateTag(tagName);
+ expect(result.isValid).toBe(false);
+ expect(result.validationErrors).toContain(validationMessage);
+ });
+ });
});
});
diff --git a/spec/frontend/members/components/table/members_table_spec.js b/spec/frontend/members/components/table/members_table_spec.js
index e3c89bfed53..efc8c9b4459 100644
--- a/spec/frontend/members/components/table/members_table_spec.js
+++ b/spec/frontend/members/components/table/members_table_spec.js
@@ -221,9 +221,11 @@ describe('MembersTable', () => {
'col-actions',
'gl-display-none!',
'gl-lg-display-table-cell!',
+ 'gl-vertical-align-middle!',
]);
expect(findTableCellByMemberId('Actions', members[1].id).classes()).toStrictEqual([
'col-actions',
+ 'gl-vertical-align-middle!',
]);
});
});
diff --git a/spec/frontend/members/components/table/role_dropdown_spec.js b/spec/frontend/members/components/table/role_dropdown_spec.js
index 1285404fd9f..fa188f50d54 100644
--- a/spec/frontend/members/components/table/role_dropdown_spec.js
+++ b/spec/frontend/members/components/table/role_dropdown_spec.js
@@ -238,6 +238,16 @@ describe('RoleDropdown', () => {
it('does not call updateMemberRole', () => {
expect(actions.updateMemberRole).not.toHaveBeenCalled();
});
+
+ it('re-enables dropdown', async () => {
+ await waitForPromises();
+
+ expect(findListbox().props('disabled')).toBe(false);
+ });
+
+ it('resets selected dropdown item', () => {
+ expect(findListbox().props('selected')).toBe(member.validRoles.Owner);
+ });
});
});
});
diff --git a/spec/frontend/merge_requests/generated_content_spec.js b/spec/frontend/merge_requests/generated_content_spec.js
new file mode 100644
index 00000000000..f56a67ec466
--- /dev/null
+++ b/spec/frontend/merge_requests/generated_content_spec.js
@@ -0,0 +1,310 @@
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
+
+import { MergeRequestGeneratedContent } from '~/merge_requests/generated_content';
+
+function findWarningElement() {
+ return document.querySelector('.js-ai-description-warning');
+}
+
+function findCloseButton() {
+ return findWarningElement()?.querySelector('.js-close-btn');
+}
+
+function findApprovalButton() {
+ return findWarningElement()?.querySelector('.js-ai-override-description');
+}
+
+function findCancelButton() {
+ return findWarningElement()?.querySelector('.js-cancel-btn');
+}
+
+function clickButton(button) {
+ button.dispatchEvent(new Event('click'));
+}
+
+describe('MergeRequestGeneratedContent', () => {
+ const warningDOM = `
+
+<div class="js-ai-description-warning hidden">
+ <button class="js-close-btn">X</button>
+ <button class="js-ai-override-description">Do AI</button>
+ <button class="js-cancel-btn">Cancel</button>
+</div>
+
+`;
+
+ describe('class basics', () => {
+ let gen;
+
+ beforeEach(() => {
+ gen = new MergeRequestGeneratedContent();
+ });
+
+ it.each`
+ description | property
+ ${'with no editor'} | ${'hasEditor'}
+ ${'with no warning'} | ${'hasWarning'}
+ ${'unable to replace the content'} | ${'canReplaceContent'}
+ `('begins $description', ({ property }) => {
+ expect(gen[property]).toBe(false);
+ });
+ });
+
+ describe('the internal editor representation', () => {
+ let gen;
+
+ it('accepts an editor during construction', () => {
+ gen = new MergeRequestGeneratedContent({ editor: {} });
+
+ expect(gen.hasEditor).toBe(true);
+ });
+
+ it('allows adding an editor through a public API after construction', () => {
+ gen = new MergeRequestGeneratedContent();
+
+ expect(gen.hasEditor).toBe(false);
+
+ gen.setEditor({});
+
+ expect(gen.hasEditor).toBe(true);
+ });
+ });
+
+ describe('generated content', () => {
+ let gen;
+
+ beforeEach(() => {
+ gen = new MergeRequestGeneratedContent();
+ });
+
+ it('can be provided to the instance through a public API', () => {
+ expect(gen.generatedContent).toBe(null);
+
+ gen.setGeneratedContent('generated content');
+
+ expect(gen.generatedContent).toBe('generated content');
+ });
+
+ it('can be cleared from the instance through a public API', () => {
+ gen.setGeneratedContent('generated content');
+
+ expect(gen.generatedContent).toBe('generated content');
+
+ gen.clearGeneratedContent();
+
+ expect(gen.generatedContent).toBe(null);
+ });
+ });
+
+ describe('warning element', () => {
+ let gen;
+
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
+ it.each`
+ presence | withFixture
+ ${'is'} | ${true}
+ ${'is not'} | ${false}
+ `('`.hasWarning` is $withFixture when the element $presence in the DOM', ({ withFixture }) => {
+ if (withFixture) {
+ setHTMLFixture(warningDOM);
+ }
+
+ gen = new MergeRequestGeneratedContent();
+
+ expect(gen.hasWarning).toBe(withFixture);
+ });
+ });
+
+ describe('special cases', () => {
+ it.each`
+ description | value | props
+ ${'there is no internal editor representation, and no generated content'} | ${false} | ${{}}
+ ${'there is an internal editor representation, but no generated content'} | ${false} | ${{ editor: {} }}
+ ${'there is no internal editor representation, but there is generated content'} | ${false} | ${{ content: 'generated content' }}
+ ${'there is an internal editor representation, and there is generated content'} | ${true} | ${{ editor: {}, content: 'generated content' }}
+ `('`.canReplaceContent` is $value when $description', ({ value, props }) => {
+ const gen = new MergeRequestGeneratedContent();
+
+ if (props.editor) {
+ gen.setEditor(props.editor);
+ }
+ if (props.content) {
+ gen.setGeneratedContent(props.content);
+ }
+
+ expect(gen.canReplaceContent).toBe(value);
+ });
+ });
+
+ describe('behaviors', () => {
+ describe('UI', () => {
+ describe('warning element', () => {
+ let gen;
+
+ beforeEach(() => {
+ setHTMLFixture(warningDOM);
+ gen = new MergeRequestGeneratedContent({ editor: {} });
+
+ gen.setGeneratedContent('generated content');
+ });
+
+ describe('#showWarning', () => {
+ it("shows the warning if it exists in the DOM and if it's possible to replace the description", () => {
+ gen.showWarning();
+
+ expect(findWarningElement().classList.contains('hidden')).toBe(false);
+ });
+
+ it("does nothing if the warning doesn't exist or if it's not possible to replace the description", () => {
+ gen.setEditor(null);
+
+ gen.showWarning();
+
+ expect(findWarningElement().classList.contains('hidden')).toBe(true);
+
+ gen.setEditor({});
+ gen.setGeneratedContent(null);
+
+ gen.showWarning();
+
+ expect(findWarningElement().classList.contains('hidden')).toBe(true);
+
+ resetHTMLFixture();
+ gen = new MergeRequestGeneratedContent({ editor: {} });
+ gen.setGeneratedContent('generated content');
+
+ expect(() => gen.showWarning()).not.toThrow();
+ expect(findWarningElement()).toBe(null);
+ });
+ });
+
+ describe('#hideWarning', () => {
+ it('hides the warning', () => {
+ findWarningElement().classList.remove('hidden');
+
+ gen.hideWarning();
+
+ expect(findWarningElement().classList.contains('hidden')).toBe(true);
+ });
+
+ it("does nothing if there's no warning element", () => {
+ resetHTMLFixture();
+ gen = new MergeRequestGeneratedContent();
+
+ expect(() => gen.hideWarning()).not.toThrow();
+ expect(findWarningElement()).toBe(null);
+ });
+ });
+ });
+ });
+
+ describe('content', () => {
+ const editor = {};
+ let gen;
+
+ beforeEach(() => {
+ editor.setValue = jest.fn();
+ gen = new MergeRequestGeneratedContent({ editor });
+ });
+
+ describe('#replaceDescription', () => {
+ it("sets the instance's generated content value to the internal representation of the editor", () => {
+ gen.setGeneratedContent('generated content');
+
+ gen.replaceDescription();
+
+ expect(editor.setValue).toHaveBeenCalledWith('generated content');
+ });
+
+ it("does nothing if there's no editor or no generated content", () => {
+ // Starts with editor, but no content
+ gen.replaceDescription();
+
+ expect(editor.setValue).not.toHaveBeenCalled();
+
+ gen.setGeneratedContent('generated content');
+ gen.setEditor(null);
+
+ gen.replaceDescription();
+
+ expect(editor.setValue).not.toHaveBeenCalled();
+ });
+
+ it("clears the generated content so the warning can't be re-shown with stale content", () => {
+ gen.setGeneratedContent('generated content');
+
+ gen.replaceDescription();
+
+ expect(editor.setValue).toHaveBeenCalledWith('generated content');
+ expect(gen.hasEditor).toBe(true);
+ expect(gen.canReplaceContent).toBe(false);
+ expect(gen.generatedContent).toBe(null);
+ });
+ });
+ });
+ });
+
+ describe('events', () => {
+ describe('UI clicks', () => {
+ const editor = {};
+ let gen;
+
+ beforeEach(() => {
+ setHTMLFixture(warningDOM);
+ editor.setValue = jest.fn();
+ gen = new MergeRequestGeneratedContent({ editor });
+
+ gen.setGeneratedContent('generated content');
+ });
+
+ describe('banner close button', () => {
+ it('hides the warning element', () => {
+ const close = findCloseButton();
+
+ gen.showWarning();
+
+ expect(findWarningElement().classList.contains('hidden')).toBe(false);
+
+ clickButton(close);
+
+ expect(findWarningElement().classList.contains('hidden')).toBe(true);
+ });
+ });
+
+ describe('banner approval button', () => {
+ it('sends the generated content to the editor, clears the internal generated content, and hides the warning', () => {
+ const approve = findApprovalButton();
+
+ gen.showWarning();
+
+ expect(findWarningElement().classList.contains('hidden')).toBe(false);
+ expect(gen.generatedContent).toBe('generated content');
+ expect(editor.setValue).not.toHaveBeenCalled();
+
+ clickButton(approve);
+
+ expect(findWarningElement().classList.contains('hidden')).toBe(true);
+ expect(gen.generatedContent).toBe(null);
+ expect(editor.setValue).toHaveBeenCalledWith('generated content');
+ });
+ });
+
+ describe('banner cancel button', () => {
+ it('hides the warning element', () => {
+ const cancel = findCancelButton();
+
+ gen.showWarning();
+
+ expect(findWarningElement().classList.contains('hidden')).toBe(false);
+
+ clickButton(cancel);
+
+ expect(findWarningElement().classList.contains('hidden')).toBe(true);
+ });
+ });
+ });
+ });
+});
diff --git a/spec/frontend/ml/model_registry/routes/models/index/components/ml_models_index_spec.js b/spec/frontend/ml/model_registry/routes/models/index/components/ml_models_index_spec.js
new file mode 100644
index 00000000000..d1715ccd8f1
--- /dev/null
+++ b/spec/frontend/ml/model_registry/routes/models/index/components/ml_models_index_spec.js
@@ -0,0 +1,39 @@
+import { GlLink } from '@gitlab/ui';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import MlModelsIndexApp from '~/ml/model_registry/routes/models/index';
+import { TITLE_LABEL } from '~/ml/model_registry/routes/models/index/translations';
+import { mockModels } from './mock_data';
+
+let wrapper;
+const createWrapper = (models = mockModels) => {
+ wrapper = shallowMountExtended(MlModelsIndexApp, {
+ propsData: { models },
+ });
+};
+
+const findModelLink = (index) => wrapper.findAllComponents(GlLink).at(index);
+const modelLinkText = (index) => findModelLink(index).text();
+const modelLinkHref = (index) => findModelLink(index).attributes('href');
+const findTitle = () => wrapper.findByText(TITLE_LABEL);
+
+describe('MlModelsIndex', () => {
+ beforeEach(() => {
+ createWrapper();
+ });
+
+ describe('header', () => {
+ it('displays the title', () => {
+ expect(findTitle().exists()).toBe(true);
+ });
+ });
+
+ describe('model list', () => {
+ it('displays the models', () => {
+ expect(modelLinkHref(0)).toBe(mockModels[0].path);
+ expect(modelLinkText(0)).toBe(`${mockModels[0].name} / ${mockModels[0].version}`);
+
+ expect(modelLinkHref(1)).toBe(mockModels[1].path);
+ expect(modelLinkText(1)).toBe(`${mockModels[1].name} / ${mockModels[1].version}`);
+ });
+ });
+});
diff --git a/spec/frontend/ml/model_registry/routes/models/index/components/mock_data.js b/spec/frontend/ml/model_registry/routes/models/index/components/mock_data.js
new file mode 100644
index 00000000000..b8a999abbbd
--- /dev/null
+++ b/spec/frontend/ml/model_registry/routes/models/index/components/mock_data.js
@@ -0,0 +1,12 @@
+export const mockModels = [
+ {
+ name: 'model_1',
+ version: '1.0',
+ path: 'path/to/model_1',
+ },
+ {
+ name: 'model_2',
+ version: '1.0',
+ path: 'path/to/model_2',
+ },
+];
diff --git a/spec/frontend/monitoring/components/__snapshots__/dashboard_template_spec.js.snap b/spec/frontend/monitoring/components/__snapshots__/dashboard_template_spec.js.snap
deleted file mode 100644
index 3b4554700b4..00000000000
--- a/spec/frontend/monitoring/components/__snapshots__/dashboard_template_spec.js.snap
+++ /dev/null
@@ -1,155 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Dashboard template matches the default snapshot 1`] = `
-<div
- class="prometheus-graphs"
- data-testid="prometheus-graphs"
- environmentstate="available"
- metricsdashboardbasepath="/monitoring/monitor-project/-/metrics?environment=1"
- metricsendpoint="/monitoring/monitor-project/-/environments/1/additional_metrics.json"
->
- <div>
- <gl-alert-stub
- class="mb-3"
- dismissible="true"
- dismisslabel="Dismiss"
- primarybuttonlink=""
- primarybuttontext=""
- secondarybuttonlink=""
- secondarybuttontext=""
- showicon="true"
- title="Feature deprecation"
- variant="warning"
- >
- <gl-sprintf-stub
- message="The metrics feature was deprecated in GitLab 14.7."
- />
-
- <gl-sprintf-stub
- message="For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
- />
- </gl-alert-stub>
- </div>
-
- <div
- class="prometheus-graphs-header d-sm-flex flex-sm-wrap pt-2 pr-1 pb-0 pl-2 border-bottom bg-gray-light"
- >
- <div
- class="gl-mb-3 gl-mr-3 gl-display-flex gl-sm-display-block"
- >
- <dashboards-dropdown-stub
- class="flex-grow-1"
- defaultbranch="master"
- id="monitor-dashboards-dropdown"
- toggle-class="dropdown-menu-toggle"
- />
- </div>
-
- <span
- aria-hidden="true"
- class="gl-pl-3 border-left gl-mb-3 d-none d-sm-block"
- />
-
- <div
- class="mb-2 pr-2 d-flex d-sm-block"
- >
- <gl-dropdown-stub
- category="primary"
- class="flex-grow-1"
- clearalltext="Clear all"
- clearalltextclass="gl-px-5"
- data-testid="environments-dropdown"
- headertext=""
- hideheaderborder="true"
- highlighteditemstitle="Selected"
- highlighteditemstitleclass="gl-px-5"
- id="monitor-environments-dropdown"
- menu-class="monitor-environment-dropdown-menu"
- size="medium"
- text="production"
- toggleclass="dropdown-menu-toggle"
- variant="default"
- >
- <div
- class="d-flex flex-column overflow-hidden"
- >
- <gl-dropdown-section-header-stub>
- Environment
- </gl-dropdown-section-header-stub>
-
- <gl-search-box-by-type-stub
- clearbuttontitle="Clear"
- value=""
- />
-
- <div
- class="flex-fill overflow-auto"
- />
-
- <div
- class="text-secondary no-matches-message"
- >
-
- No matching results
-
- </div>
- </div>
- </gl-dropdown-stub>
- </div>
-
- <div
- class="mb-2 pr-2 d-flex d-sm-block"
- >
- <date-time-picker-stub
- class="flex-grow-1 show-last-dropdown"
- customenabled="true"
- options="[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]"
- value="[object Object]"
- />
- </div>
-
- <div
- class="mb-2 pr-2 d-flex d-sm-block"
- >
- <refresh-button-stub />
- </div>
-
- <div
- class="flex-grow-1"
- />
-
- <div
- class="d-sm-flex"
- >
- <!---->
-
- <!---->
-
- <div
- class="gl-mb-3 gl-mr-3 d-flex d-sm-block"
- >
- <actions-menu-stub
- custommetricspath="/monitoring/monitor-project/prometheus/metrics"
- defaultbranch="master"
- isootbdashboard="true"
- validatequerypath="/monitoring/monitor-project/prometheus/metrics/validate_query"
- />
- </div>
-
- <!---->
- </div>
- </div>
-
- <empty-state-stub
- clusterspath="/monitoring/monitor-project/-/clusters"
- documentationpath="/help/administration/monitoring/prometheus/index.md"
- emptygettingstartedsvgpath="/images/illustrations/monitoring/getting_started.svg"
- emptyloadingsvgpath="/images/illustrations/monitoring/loading.svg"
- emptynodatasmallsvgpath="/images/illustrations/chart-empty-state-small.svg"
- emptynodatasvgpath="/images/illustrations/monitoring/no_data.svg"
- emptyunabletoconnectsvgpath="/images/illustrations/monitoring/unable_to_connect.svg"
- selectedstate="gettingStarted"
- settingspath="/monitoring/monitor-project/-/settings/integrations/prometheus/edit"
- />
-</div>
-`;
diff --git a/spec/frontend/monitoring/components/__snapshots__/empty_state_spec.js.snap b/spec/frontend/monitoring/components/__snapshots__/empty_state_spec.js.snap
deleted file mode 100644
index 4483c9fd39f..00000000000
--- a/spec/frontend/monitoring/components/__snapshots__/empty_state_spec.js.snap
+++ /dev/null
@@ -1,55 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`EmptyState shows gettingStarted state 1`] = `
-<div>
- <!---->
-
- <gl-empty-state-stub
- contentclass=""
- description="Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments."
- invertindarkmode="true"
- primarybuttonlink="/clustersPath"
- primarybuttontext="Install on clusters"
- secondarybuttonlink="/settingsPath"
- secondarybuttontext="Configure existing installation"
- svgpath="/path/to/getting-started.svg"
- title="Get started with performance monitoring"
- />
-</div>
-`;
-
-exports[`EmptyState shows noData state 1`] = `
-<div>
- <!---->
-
- <gl-empty-state-stub
- contentclass=""
- description="You are connected to the Prometheus server, but there is currently no data to display."
- invertindarkmode="true"
- primarybuttonlink="/settingsPath"
- primarybuttontext="Configure Prometheus"
- secondarybuttonlink=""
- secondarybuttontext=""
- svgpath="/path/to/no-data.svg"
- title="No data found"
- />
-</div>
-`;
-
-exports[`EmptyState shows unableToConnect state 1`] = `
-<div>
- <!---->
-
- <gl-empty-state-stub
- contentclass=""
- description="Ensure connectivity is available from the GitLab server to the Prometheus server"
- invertindarkmode="true"
- primarybuttonlink="/documentationPath"
- primarybuttontext="View documentation"
- secondarybuttonlink="/settingsPath"
- secondarybuttontext="Configure Prometheus"
- svgpath="/path/to/unable-to-connect.svg"
- title="Unable to connect to Prometheus server"
- />
-</div>
-`;
diff --git a/spec/frontend/monitoring/components/__snapshots__/group_empty_state_spec.js.snap b/spec/frontend/monitoring/components/__snapshots__/group_empty_state_spec.js.snap
deleted file mode 100644
index 42a16a39dfd..00000000000
--- a/spec/frontend/monitoring/components/__snapshots__/group_empty_state_spec.js.snap
+++ /dev/null
@@ -1,160 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`GroupEmptyState given state BAD_QUERY passes the expected props to GlEmptyState 1`] = `
-Object {
- "compact": true,
- "contentClass": Array [],
- "description": null,
- "invertInDarkMode": true,
- "primaryButtonLink": "/path/to/settings",
- "primaryButtonText": "Verify configuration",
- "secondaryButtonLink": null,
- "secondaryButtonText": null,
- "svgHeight": null,
- "svgPath": "/path/to/empty-group-illustration.svg",
- "title": "Query cannot be processed",
-}
-`;
-
-exports[`GroupEmptyState given state BAD_QUERY renders the slotted content 1`] = `
-<div>
- <div>
- The Prometheus server responded with "bad request". Please check your queries are correct and are supported in your Prometheus version.
- <a
- href="/path/to/docs"
- >
- More information
- </a>
- </div>
-</div>
-`;
-
-exports[`GroupEmptyState given state CONNECTION_FAILED passes the expected props to GlEmptyState 1`] = `
-Object {
- "compact": true,
- "contentClass": Array [],
- "description": "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating.",
- "invertInDarkMode": true,
- "primaryButtonLink": "/path/to/settings",
- "primaryButtonText": "Verify configuration",
- "secondaryButtonLink": null,
- "secondaryButtonText": null,
- "svgHeight": null,
- "svgPath": "/path/to/empty-group-illustration.svg",
- "title": "Connection failed",
-}
-`;
-
-exports[`GroupEmptyState given state CONNECTION_FAILED renders the slotted content 1`] = `<div />`;
-
-exports[`GroupEmptyState given state FOO STATE passes the expected props to GlEmptyState 1`] = `
-Object {
- "compact": true,
- "contentClass": Array [],
- "description": "An error occurred while loading the data. Please try again.",
- "invertInDarkMode": true,
- "primaryButtonLink": null,
- "primaryButtonText": null,
- "secondaryButtonLink": null,
- "secondaryButtonText": null,
- "svgHeight": null,
- "svgPath": "/path/to/empty-group-illustration.svg",
- "title": "An error has occurred",
-}
-`;
-
-exports[`GroupEmptyState given state FOO STATE renders the slotted content 1`] = `<div />`;
-
-exports[`GroupEmptyState given state LOADING passes the expected props to GlEmptyState 1`] = `
-Object {
- "compact": true,
- "contentClass": Array [],
- "description": "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available.",
- "invertInDarkMode": true,
- "primaryButtonLink": null,
- "primaryButtonText": null,
- "secondaryButtonLink": null,
- "secondaryButtonText": null,
- "svgHeight": null,
- "svgPath": "/path/to/empty-group-illustration.svg",
- "title": "Waiting for performance data",
-}
-`;
-
-exports[`GroupEmptyState given state LOADING renders the slotted content 1`] = `<div />`;
-
-exports[`GroupEmptyState given state NO_DATA passes the expected props to GlEmptyState 1`] = `
-Object {
- "compact": true,
- "contentClass": Array [],
- "description": null,
- "invertInDarkMode": true,
- "primaryButtonLink": null,
- "primaryButtonText": null,
- "secondaryButtonLink": null,
- "secondaryButtonText": null,
- "svgHeight": null,
- "svgPath": "/path/to/empty-group-illustration.svg",
- "title": "No data to display",
-}
-`;
-
-exports[`GroupEmptyState given state NO_DATA renders the slotted content 1`] = `
-<div>
- <div>
- The data source is connected, but there is no data to display.
- <a
- href="/path/to/docs"
- >
- More information
- </a>
- </div>
-</div>
-`;
-
-exports[`GroupEmptyState given state TIMEOUT passes the expected props to GlEmptyState 1`] = `
-Object {
- "compact": true,
- "contentClass": Array [],
- "description": null,
- "invertInDarkMode": true,
- "primaryButtonLink": null,
- "primaryButtonText": null,
- "secondaryButtonLink": null,
- "secondaryButtonText": null,
- "svgHeight": null,
- "svgPath": "/path/to/empty-group-illustration.svg",
- "title": "Connection timed out",
-}
-`;
-
-exports[`GroupEmptyState given state TIMEOUT renders the slotted content 1`] = `
-<div>
- <div>
- Charts can't be displayed as the request for data has timed out.
- <a
- href="/path/to/docs"
- >
- More information
- </a>
- </div>
-</div>
-`;
-
-exports[`GroupEmptyState given state UNKNOWN_ERROR passes the expected props to GlEmptyState 1`] = `
-Object {
- "compact": true,
- "contentClass": Array [],
- "description": "An error occurred while loading the data. Please try again.",
- "invertInDarkMode": true,
- "primaryButtonLink": null,
- "primaryButtonText": null,
- "secondaryButtonLink": null,
- "secondaryButtonText": null,
- "svgHeight": null,
- "svgPath": "/path/to/empty-group-illustration.svg",
- "title": "An error has occurred",
-}
-`;
-
-exports[`GroupEmptyState given state UNKNOWN_ERROR renders the slotted content 1`] = `<div />`;
diff --git a/spec/frontend/monitoring/components/charts/annotations_spec.js b/spec/frontend/monitoring/components/charts/annotations_spec.js
deleted file mode 100644
index 1eac0935fe4..00000000000
--- a/spec/frontend/monitoring/components/charts/annotations_spec.js
+++ /dev/null
@@ -1,95 +0,0 @@
-import { generateAnnotationsSeries } from '~/monitoring/components/charts/annotations';
-import { deploymentData, annotationsData } from '../../mock_data';
-
-describe('annotations spec', () => {
- describe('generateAnnotationsSeries', () => {
- it('with default options', () => {
- const annotations = generateAnnotationsSeries();
-
- expect(annotations).toEqual(
- expect.objectContaining({
- type: 'scatter',
- yAxisIndex: 1,
- data: [],
- markLine: {
- data: [],
- symbol: 'none',
- silent: true,
- },
- }),
- );
- });
-
- it('when only deployments data is passed', () => {
- const annotations = generateAnnotationsSeries({ deployments: deploymentData });
-
- expect(annotations).toEqual(
- expect.objectContaining({
- type: 'scatter',
- yAxisIndex: 1,
- data: expect.any(Array),
- markLine: {
- data: [],
- symbol: 'none',
- silent: true,
- },
- }),
- );
-
- annotations.data.forEach((annotation) => {
- expect(annotation).toEqual(expect.any(Object));
- });
-
- expect(annotations.data).toHaveLength(deploymentData.length);
- });
-
- it('when only annotations data is passed', () => {
- const annotations = generateAnnotationsSeries({
- annotations: annotationsData,
- });
-
- expect(annotations).toEqual(
- expect.objectContaining({
- type: 'scatter',
- yAxisIndex: 1,
- data: expect.any(Array),
- markLine: expect.any(Object),
- markPoint: expect.any(Object),
- }),
- );
-
- annotations.markLine.data.forEach((annotation) => {
- expect(annotation).toEqual(expect.any(Object));
- });
-
- expect(annotations.data).toHaveLength(0);
- expect(annotations.markLine.data).toHaveLength(annotationsData.length);
- expect(annotations.markPoint.data).toHaveLength(annotationsData.length);
- });
-
- it('when deployments and annotations data is passed', () => {
- const annotations = generateAnnotationsSeries({
- deployments: deploymentData,
- annotations: annotationsData,
- });
-
- expect(annotations).toEqual(
- expect.objectContaining({
- type: 'scatter',
- yAxisIndex: 1,
- data: expect.any(Array),
- markLine: expect.any(Object),
- markPoint: expect.any(Object),
- }),
- );
-
- annotations.markLine.data.forEach((annotation) => {
- expect(annotation).toEqual(expect.any(Object));
- });
-
- expect(annotations.data).toHaveLength(deploymentData.length);
- expect(annotations.markLine.data).toHaveLength(annotationsData.length);
- expect(annotations.markPoint.data).toHaveLength(annotationsData.length);
- });
- });
-});
diff --git a/spec/frontend/monitoring/components/charts/anomaly_spec.js b/spec/frontend/monitoring/components/charts/anomaly_spec.js
deleted file mode 100644
index 3674a49f42c..00000000000
--- a/spec/frontend/monitoring/components/charts/anomaly_spec.js
+++ /dev/null
@@ -1,304 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import { TEST_HOST } from 'helpers/test_constants';
-import Anomaly from '~/monitoring/components/charts/anomaly.vue';
-
-import MonitorTimeSeriesChart from '~/monitoring/components/charts/time_series.vue';
-import { colorValues } from '~/monitoring/constants';
-import { anomalyGraphData } from '../../graph_data';
-import { anomalyDeploymentData, mockProjectDir } from '../../mock_data';
-
-const mockProjectPath = `${TEST_HOST}${mockProjectDir}`;
-
-const TEST_UPPER = 11;
-const TEST_LOWER = 9;
-
-describe('Anomaly chart component', () => {
- let wrapper;
-
- const setupAnomalyChart = (props) => {
- wrapper = shallowMount(Anomaly, {
- propsData: { ...props },
- });
- };
- const findTimeSeries = () => wrapper.findComponent(MonitorTimeSeriesChart);
- const getTimeSeriesProps = () => findTimeSeries().props();
-
- describe('wrapped monitor-time-series-chart component', () => {
- const mockValues = ['10', '10', '10'];
-
- const mockGraphData = anomalyGraphData(
- {},
- {
- upper: mockValues.map(() => String(TEST_UPPER)),
- values: mockValues,
- lower: mockValues.map(() => String(TEST_LOWER)),
- },
- );
-
- const inputThresholds = ['some threshold'];
-
- beforeEach(() => {
- setupAnomalyChart({
- graphData: mockGraphData,
- deploymentData: anomalyDeploymentData,
- thresholds: inputThresholds,
- projectPath: mockProjectPath,
- });
- });
-
- it('renders correctly', () => {
- expect(findTimeSeries().exists()).toBe(true);
- });
-
- describe('receives props correctly', () => {
- describe('graph-data', () => {
- it('receives a single "metric" series', () => {
- const { graphData } = getTimeSeriesProps();
- expect(graphData.metrics.length).toBe(1);
- });
-
- it('receives "metric" with all data', () => {
- const { graphData } = getTimeSeriesProps();
- const metric = graphData.metrics[0];
- const expectedMetric = mockGraphData.metrics[0];
- expect(metric).toEqual(expectedMetric);
- });
-
- it('receives the "metric" results', () => {
- const { graphData } = getTimeSeriesProps();
- const { result } = graphData.metrics[0];
- const { values } = result[0];
-
- expect(values).toEqual([
- [expect.any(String), 10],
- [expect.any(String), 10],
- [expect.any(String), 10],
- ]);
- });
- });
-
- describe('option', () => {
- let option;
- let series;
-
- beforeEach(() => {
- ({ option } = getTimeSeriesProps());
- ({ series } = option);
- });
-
- it('contains a boundary band', () => {
- expect(series).toEqual(expect.any(Array));
- expect(series.length).toEqual(2); // 1 upper + 1 lower boundaries
- expect(series[0].stack).toEqual(series[1].stack);
-
- series.forEach((s) => {
- expect(s.type).toBe('line');
- expect(s.lineStyle.width).toBe(0);
- expect(s.lineStyle.color).toMatch(/rgba\(.+\)/);
- expect(s.lineStyle.color).toMatch(s.color);
- expect(s.symbol).toEqual('none');
- });
- });
-
- it('upper boundary values are stacked on top of lower boundary', () => {
- const [lowerSeries, upperSeries] = series;
-
- lowerSeries.data.forEach(([, y]) => {
- expect(y).toBeCloseTo(TEST_LOWER);
- });
-
- upperSeries.data.forEach(([, y]) => {
- expect(y).toBeCloseTo(TEST_UPPER - TEST_LOWER);
- });
- });
- });
-
- describe('series-config', () => {
- let seriesConfig;
-
- beforeEach(() => {
- ({ seriesConfig } = getTimeSeriesProps());
- });
-
- it('display symbols is enabled', () => {
- expect(seriesConfig).toEqual(
- expect.objectContaining({
- type: 'line',
- symbol: 'circle',
- showSymbol: true,
- symbolSize: expect.any(Function),
- itemStyle: {
- color: expect.any(Function),
- },
- }),
- );
- });
-
- it('does not display anomalies', () => {
- const { symbolSize, itemStyle } = seriesConfig;
- mockValues.forEach((v, dataIndex) => {
- const size = symbolSize(null, { dataIndex });
- const color = itemStyle.color({ dataIndex });
-
- // normal color and small size
- expect(size).toBeCloseTo(0);
- expect(color).toBe(colorValues.primaryColor);
- });
- });
-
- it('can format y values (to use in tooltips)', () => {
- mockValues.forEach((v, dataIndex) => {
- const formatted = wrapper.vm.yValueFormatted(0, dataIndex);
- expect(parseFloat(formatted)).toEqual(parseFloat(v));
- });
- });
- });
-
- describe('inherited properties', () => {
- it('"deployment-data" keeps the same value', () => {
- const { deploymentData } = getTimeSeriesProps();
- expect(deploymentData).toEqual(anomalyDeploymentData);
- });
- it('"projectPath" keeps the same value', () => {
- const { projectPath } = getTimeSeriesProps();
- expect(projectPath).toEqual(mockProjectPath);
- });
- });
- });
- });
-
- describe('with no boundary data', () => {
- const noBoundaryData = anomalyGraphData(
- {},
- {
- upper: [],
- values: ['10', '10', '10'],
- lower: [],
- },
- );
-
- beforeEach(() => {
- setupAnomalyChart({
- graphData: noBoundaryData,
- deploymentData: anomalyDeploymentData,
- });
- });
-
- describe('option', () => {
- let option;
- let series;
-
- beforeEach(() => {
- ({ option } = getTimeSeriesProps());
- ({ series } = option);
- });
-
- it('does not display a boundary band', () => {
- expect(series).toEqual(expect.any(Array));
- expect(series.length).toEqual(0); // no boundaries
- });
-
- it('can format y values (to use in tooltips)', () => {
- expect(parseFloat(wrapper.vm.yValueFormatted(0, 0))).toEqual(10);
- expect(wrapper.vm.yValueFormatted(1, 0)).toBe(''); // missing boundary
- expect(wrapper.vm.yValueFormatted(2, 0)).toBe(''); // missing boundary
- });
- });
- });
-
- describe('with one anomaly', () => {
- const mockValues = ['10', '20', '10'];
-
- const oneAnomalyData = anomalyGraphData(
- {},
- {
- upper: mockValues.map(() => TEST_UPPER),
- values: mockValues,
- lower: mockValues.map(() => TEST_LOWER),
- },
- );
-
- beforeEach(() => {
- setupAnomalyChart({
- graphData: oneAnomalyData,
- deploymentData: anomalyDeploymentData,
- });
- });
-
- describe('series-config', () => {
- it('displays one anomaly', () => {
- const { seriesConfig } = getTimeSeriesProps();
- const { symbolSize, itemStyle } = seriesConfig;
-
- const bigDots = mockValues.filter((v, dataIndex) => {
- const size = symbolSize(null, { dataIndex });
- return size > 0.1;
- });
- const redDots = mockValues.filter((v, dataIndex) => {
- const color = itemStyle.color({ dataIndex });
- return color === colorValues.anomalySymbol;
- });
-
- expect(bigDots.length).toBe(1);
- expect(redDots.length).toBe(1);
- });
- });
- });
-
- describe('with offset', () => {
- const mockValues = ['10', '11', '12'];
- const mockUpper = ['20', '20', '20'];
- const mockLower = ['-1', '-2', '-3.70'];
- const expectedOffset = 4; // Lowest point in mock data is -3.70, it gets rounded
-
- beforeEach(() => {
- setupAnomalyChart({
- graphData: anomalyGraphData(
- {},
- {
- upper: mockUpper,
- values: mockValues,
- lower: mockLower,
- },
- ),
- deploymentData: anomalyDeploymentData,
- });
- });
-
- describe('receives props correctly', () => {
- describe('graph-data', () => {
- it('receives a single "metric" series', () => {
- const { graphData } = getTimeSeriesProps();
- expect(graphData.metrics.length).toBe(1);
- });
-
- it('receives "metric" results and applies the offset to them', () => {
- const { graphData } = getTimeSeriesProps();
- const { result } = graphData.metrics[0];
- const { values } = result[0];
-
- expect(values).toEqual(expect.any(Array));
-
- values.forEach(([, y], index) => {
- expect(y).toBeCloseTo(parseFloat(mockValues[index]) + expectedOffset);
- });
- });
- });
- });
-
- describe('option', () => {
- it('upper boundary values are stacked on top of lower boundary, plus the offset', () => {
- const { option } = getTimeSeriesProps();
- const { series } = option;
- const [lowerSeries, upperSeries] = series;
- lowerSeries.data.forEach(([, y], i) => {
- expect(y).toBeCloseTo(parseFloat(mockLower[i]) + expectedOffset);
- });
-
- upperSeries.data.forEach(([, y], i) => {
- expect(y).toBeCloseTo(parseFloat(mockUpper[i] - mockLower[i]));
- });
- });
- });
- });
-});
diff --git a/spec/frontend/monitoring/components/charts/bar_spec.js b/spec/frontend/monitoring/components/charts/bar_spec.js
deleted file mode 100644
index 5339a7a525b..00000000000
--- a/spec/frontend/monitoring/components/charts/bar_spec.js
+++ /dev/null
@@ -1,53 +0,0 @@
-import { GlBarChart } from '@gitlab/ui/dist/charts';
-import { shallowMount } from '@vue/test-utils';
-import Bar from '~/monitoring/components/charts/bar.vue';
-import { barGraphData } from '../../graph_data';
-
-jest.mock('~/lib/utils/icon_utils', () => ({
- getSvgIconPathContent: jest.fn().mockResolvedValue('mockSvgPathContent'),
-}));
-
-describe('Bar component', () => {
- let barChart;
- let store;
- let graphData;
-
- beforeEach(() => {
- graphData = barGraphData();
-
- barChart = shallowMount(Bar, {
- propsData: {
- graphData,
- },
- store,
- });
- });
-
- afterEach(() => {
- barChart.destroy();
- });
-
- describe('wrapped components', () => {
- describe('GitLab UI bar chart', () => {
- let glbarChart;
- let chartData;
-
- beforeEach(() => {
- glbarChart = barChart.findComponent(GlBarChart);
- chartData = barChart.vm.chartData[graphData.metrics[0].label];
- });
-
- it('should display a label on the x axis', () => {
- expect(glbarChart.props('xAxisTitle')).toBe(graphData.xLabel);
- });
-
- it('should return chartData as array of arrays', () => {
- expect(chartData).toBeInstanceOf(Array);
-
- chartData.forEach((item) => {
- expect(item).toBeInstanceOf(Array);
- });
- });
- });
- });
-});
diff --git a/spec/frontend/monitoring/components/charts/column_spec.js b/spec/frontend/monitoring/components/charts/column_spec.js
deleted file mode 100644
index cc38a3fd8a1..00000000000
--- a/spec/frontend/monitoring/components/charts/column_spec.js
+++ /dev/null
@@ -1,118 +0,0 @@
-import { GlColumnChart } from '@gitlab/ui/dist/charts';
-import { shallowMount } from '@vue/test-utils';
-import timezoneMock from 'timezone-mock';
-import ColumnChart from '~/monitoring/components/charts/column.vue';
-
-jest.mock('~/lib/utils/icon_utils', () => ({
- getSvgIconPathContent: jest.fn().mockResolvedValue('mockSvgPathContent'),
-}));
-
-const yAxisName = 'Y-axis mock name';
-const yAxisFormat = 'bytes';
-const yAxisPrecistion = 3;
-const dataValues = [
- [1495700554.925, '8.0390625'],
- [1495700614.925, '8.0390625'],
- [1495700674.925, '8.0390625'],
-];
-
-describe('Column component', () => {
- let wrapper;
-
- const createWrapper = (props = {}) => {
- wrapper = shallowMount(ColumnChart, {
- propsData: {
- graphData: {
- yAxis: {
- name: yAxisName,
- format: yAxisFormat,
- precision: yAxisPrecistion,
- },
- metrics: [
- {
- label: 'Mock data',
- result: [
- {
- metric: {},
- values: dataValues,
- },
- ],
- },
- ],
- },
- ...props,
- },
- });
- };
- const findChart = () => wrapper.findComponent(GlColumnChart);
- const chartProps = (prop) => findChart().props(prop);
-
- beforeEach(() => {
- createWrapper();
- });
-
- describe('xAxisLabel', () => {
- const mockDate = Date.UTC(2020, 4, 26, 20); // 8:00 PM in GMT
-
- const useXAxisFormatter = (date) => {
- const { xAxis } = chartProps('option');
- const { formatter } = xAxis.axisLabel;
- return formatter(date);
- };
-
- it('x-axis is formatted correctly in m/d h:MM TT format', () => {
- expect(useXAxisFormatter(mockDate)).toEqual('5/26 8:00 PM');
- });
-
- describe('when in PT timezone', () => {
- beforeAll(() => {
- timezoneMock.register('US/Pacific');
- });
-
- afterAll(() => {
- timezoneMock.unregister();
- });
-
- it('by default, values are formatted in PT', () => {
- createWrapper();
- expect(useXAxisFormatter(mockDate)).toEqual('5/26 1:00 PM');
- });
-
- it('when the chart uses local timezone, y-axis is formatted in PT', () => {
- createWrapper({ timezone: 'LOCAL' });
- expect(useXAxisFormatter(mockDate)).toEqual('5/26 1:00 PM');
- });
-
- it('when the chart uses UTC, y-axis is formatted in UTC', () => {
- createWrapper({ timezone: 'UTC' });
- expect(useXAxisFormatter(mockDate)).toEqual('5/26 8:00 PM');
- });
- });
- });
-
- describe('wrapped components', () => {
- describe('GitLab UI column chart', () => {
- it('receives data properties needed for proper chart render', () => {
- expect(chartProps('bars')).toEqual([{ name: 'Mock data', data: dataValues }]);
- });
-
- it('passes the y axis name correctly', () => {
- expect(chartProps('yAxisTitle')).toBe(yAxisName);
- });
-
- it('passes the y axis configuration correctly', () => {
- expect(chartProps('option').yAxis).toMatchObject({
- name: yAxisName,
- axisLabel: {
- formatter: expect.any(Function),
- },
- scale: false,
- });
- });
-
- it('passes a dataZoom configuration', () => {
- expect(chartProps('option').dataZoom).toBeDefined();
- });
- });
- });
-});
diff --git a/spec/frontend/monitoring/components/charts/empty_chart_spec.js b/spec/frontend/monitoring/components/charts/empty_chart_spec.js
deleted file mode 100644
index d755ed7c104..00000000000
--- a/spec/frontend/monitoring/components/charts/empty_chart_spec.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import EmptyChart from '~/monitoring/components/charts/empty_chart.vue';
-
-describe('Empty Chart component', () => {
- let emptyChart;
- const graphTitle = 'Memory Usage';
-
- beforeEach(() => {
- emptyChart = shallowMount(EmptyChart, {
- propsData: {
- graphTitle,
- },
- });
- });
-
- describe('Computed props', () => {
- it('sets the height for the svg container', () => {
- expect(emptyChart.vm.svgContainerStyle.height).toBe('300px');
- });
- });
-});
diff --git a/spec/frontend/monitoring/components/charts/gauge_spec.js b/spec/frontend/monitoring/components/charts/gauge_spec.js
deleted file mode 100644
index 33ea5e83598..00000000000
--- a/spec/frontend/monitoring/components/charts/gauge_spec.js
+++ /dev/null
@@ -1,210 +0,0 @@
-import { GlGaugeChart } from '@gitlab/ui/dist/charts';
-import { shallowMount } from '@vue/test-utils';
-import GaugeChart from '~/monitoring/components/charts/gauge.vue';
-import { gaugeChartGraphData } from '../../graph_data';
-
-describe('Gauge Chart component', () => {
- const defaultGraphData = gaugeChartGraphData();
-
- let wrapper;
-
- const findGaugeChart = () => wrapper.findComponent(GlGaugeChart);
-
- const createWrapper = ({ ...graphProps } = {}) => {
- wrapper = shallowMount(GaugeChart, {
- propsData: {
- graphData: {
- ...defaultGraphData,
- ...graphProps,
- },
- },
- });
- };
-
- describe('chart component', () => {
- it('is rendered when props are passed', () => {
- createWrapper();
-
- expect(findGaugeChart().exists()).toBe(true);
- });
- });
-
- describe('min and max', () => {
- const MIN_DEFAULT = 0;
- const MAX_DEFAULT = 100;
-
- it('are passed to chart component', () => {
- createWrapper();
-
- expect(findGaugeChart().props('min')).toBe(100);
- expect(findGaugeChart().props('max')).toBe(1000);
- });
-
- const invalidCases = [undefined, NaN, 'a string'];
-
- it.each(invalidCases)(
- 'if min has invalid value, defaults are used for both min and max',
- (invalidValue) => {
- createWrapper({ minValue: invalidValue });
-
- expect(findGaugeChart().props('min')).toBe(MIN_DEFAULT);
- expect(findGaugeChart().props('max')).toBe(MAX_DEFAULT);
- },
- );
-
- it.each(invalidCases)(
- 'if max has invalid value, defaults are used for both min and max',
- (invalidValue) => {
- createWrapper({ minValue: invalidValue });
-
- expect(findGaugeChart().props('min')).toBe(MIN_DEFAULT);
- expect(findGaugeChart().props('max')).toBe(MAX_DEFAULT);
- },
- );
-
- it('if min is bigger than max, defaults are used for both min and max', () => {
- createWrapper({ minValue: 100, maxValue: 0 });
-
- expect(findGaugeChart().props('min')).toBe(MIN_DEFAULT);
- expect(findGaugeChart().props('max')).toBe(MAX_DEFAULT);
- });
- });
-
- describe('thresholds', () => {
- it('thresholds are set on chart', () => {
- createWrapper();
-
- expect(findGaugeChart().props('thresholds')).toEqual([500, 800]);
- });
-
- it('when no thresholds are defined, a default threshold is defined at 95% of max_value', () => {
- createWrapper({
- minValue: 0,
- maxValue: 100,
- thresholds: {},
- });
-
- expect(findGaugeChart().props('thresholds')).toEqual([95]);
- });
-
- it('when out of min-max bounds thresholds are defined, a default threshold is defined at 95% of the range between min_value and max_value', () => {
- createWrapper({
- thresholds: {
- values: [-10, 1500],
- },
- });
-
- expect(findGaugeChart().props('thresholds')).toEqual([855]);
- });
-
- describe('when mode is absolute', () => {
- it('only valid threshold values are used', () => {
- createWrapper({
- thresholds: {
- mode: 'absolute',
- values: [undefined, 10, 110, NaN, 'a string', 400],
- },
- });
-
- expect(findGaugeChart().props('thresholds')).toEqual([110, 400]);
- });
-
- it('if all threshold values are invalid, a default threshold is defined at 95% of the range between min_value and max_value', () => {
- createWrapper({
- thresholds: {
- mode: 'absolute',
- values: [NaN, undefined, 'a string', 1500],
- },
- });
-
- expect(findGaugeChart().props('thresholds')).toEqual([855]);
- });
- });
-
- describe('when mode is percentage', () => {
- it('when values outside of 0-100 bounds are used, a default threshold is defined at 95% of max_value', () => {
- createWrapper({
- thresholds: {
- mode: 'percentage',
- values: [110],
- },
- });
-
- expect(findGaugeChart().props('thresholds')).toEqual([855]);
- });
-
- it('if all threshold values are invalid, a default threshold is defined at 95% of max_value', () => {
- createWrapper({
- thresholds: {
- mode: 'percentage',
- values: [NaN, undefined, 'a string', 1500],
- },
- });
-
- expect(findGaugeChart().props('thresholds')).toEqual([855]);
- });
- });
- });
-
- describe('split (the number of ticks on the chart arc)', () => {
- const SPLIT_DEFAULT = 10;
-
- it('is passed to chart as prop', () => {
- createWrapper();
-
- expect(findGaugeChart().props('splitNumber')).toBe(20);
- });
-
- it('if not explicitly set, passes a default value to chart', () => {
- createWrapper({ split: '' });
-
- expect(findGaugeChart().props('splitNumber')).toBe(SPLIT_DEFAULT);
- });
-
- it('if set as a number that is not an integer, passes the default value to chart', () => {
- createWrapper({ split: 10.5 });
-
- expect(findGaugeChart().props('splitNumber')).toBe(SPLIT_DEFAULT);
- });
-
- it('if set as a negative number, passes the default value to chart', () => {
- createWrapper({ split: -10 });
-
- expect(findGaugeChart().props('splitNumber')).toBe(SPLIT_DEFAULT);
- });
- });
-
- describe('text (the text displayed on the gauge for the current value)', () => {
- it('displays the query result value when format is not set', () => {
- createWrapper({ format: '' });
-
- expect(findGaugeChart().props('text')).toBe('3');
- });
-
- it('displays the query result value when format is set to invalid value', () => {
- createWrapper({ format: 'invalid' });
-
- expect(findGaugeChart().props('text')).toBe('3');
- });
-
- it('displays a formatted query result value when format is set', () => {
- createWrapper();
-
- expect(findGaugeChart().props('text')).toBe('3kB');
- });
-
- it('displays a placeholder value when metric is empty', () => {
- createWrapper({ metrics: [] });
-
- expect(findGaugeChart().props('text')).toBe('--');
- });
- });
-
- describe('value', () => {
- it('correct value is passed', () => {
- createWrapper();
-
- expect(findGaugeChart().props('value')).toBe(3);
- });
- });
-});
diff --git a/spec/frontend/monitoring/components/charts/heatmap_spec.js b/spec/frontend/monitoring/components/charts/heatmap_spec.js
deleted file mode 100644
index 54245cbdbc1..00000000000
--- a/spec/frontend/monitoring/components/charts/heatmap_spec.js
+++ /dev/null
@@ -1,93 +0,0 @@
-import { GlHeatmap } from '@gitlab/ui/dist/charts';
-import { shallowMount } from '@vue/test-utils';
-import timezoneMock from 'timezone-mock';
-import Heatmap from '~/monitoring/components/charts/heatmap.vue';
-import { heatmapGraphData } from '../../graph_data';
-
-describe('Heatmap component', () => {
- let wrapper;
- let store;
-
- const findChart = () => wrapper.findComponent(GlHeatmap);
-
- const graphData = heatmapGraphData();
-
- const createWrapper = (props = {}) => {
- wrapper = shallowMount(Heatmap, {
- propsData: {
- graphData: heatmapGraphData(),
- containerWidth: 100,
- ...props,
- },
- store,
- });
- };
-
- describe('wrapped chart', () => {
- beforeEach(() => {
- createWrapper();
- });
-
- it('should display a label on the x axis', () => {
- expect(wrapper.vm.xAxisName).toBe(graphData.xLabel);
- });
-
- it('should display a label on the y axis', () => {
- expect(wrapper.vm.yAxisName).toBe(graphData.y_label);
- });
-
- // According to the echarts docs https://echarts.apache.org/en/option.html#series-heatmap.data
- // each row of the heatmap chart is represented by an array inside another parent array
- // e.g. [[0, 0, 10]], the format represents the column, the row and finally the value
- // corresponding to the cell
-
- it('should return chartData with a length of x by y, with a length of 3 per array', () => {
- const row = wrapper.vm.chartData[0];
-
- expect(row.length).toBe(3);
- expect(wrapper.vm.chartData.length).toBe(6);
- });
-
- it('returns a series of labels for the x axis', () => {
- const { xAxisLabels } = wrapper.vm;
-
- expect(xAxisLabels.length).toBe(2);
- });
-
- describe('y axis labels', () => {
- const gmtLabels = ['8:10 PM', '8:12 PM', '8:14 PM'];
-
- it('y-axis labels are formatted in AM/PM format', () => {
- expect(findChart().props('yAxisLabels')).toEqual(gmtLabels);
- });
-
- describe('when in PT timezone', () => {
- const ptLabels = ['1:10 PM', '1:12 PM', '1:14 PM'];
- const utcLabels = gmtLabels; // Identical in this case
-
- beforeAll(() => {
- timezoneMock.register('US/Pacific');
- });
-
- afterAll(() => {
- timezoneMock.unregister();
- });
-
- it('by default, y-axis is formatted in PT', () => {
- createWrapper();
- expect(findChart().props('yAxisLabels')).toEqual(ptLabels);
- });
-
- it('when the chart uses local timezone, y-axis is formatted in PT', () => {
- createWrapper({ timezone: 'LOCAL' });
- expect(findChart().props('yAxisLabels')).toEqual(ptLabels);
- });
-
- it('when the chart uses UTC, y-axis is formatted in UTC', () => {
- createWrapper({ timezone: 'UTC' });
- expect(findChart().props('yAxisLabels')).toEqual(utcLabels);
- });
- });
- });
- });
-});
diff --git a/spec/frontend/monitoring/components/charts/options_spec.js b/spec/frontend/monitoring/components/charts/options_spec.js
deleted file mode 100644
index 064ce6f204c..00000000000
--- a/spec/frontend/monitoring/components/charts/options_spec.js
+++ /dev/null
@@ -1,327 +0,0 @@
-import { SUPPORTED_FORMATS } from '~/lib/utils/unit_format';
-import {
- getYAxisOptions,
- getTooltipFormatter,
- getValidThresholds,
-} from '~/monitoring/components/charts/options';
-
-describe('options spec', () => {
- describe('getYAxisOptions', () => {
- it('default options', () => {
- const options = getYAxisOptions();
-
- expect(options).toMatchObject({
- name: expect.any(String),
- axisLabel: {
- formatter: expect.any(Function),
- },
- scale: true,
- boundaryGap: [expect.any(Number), expect.any(Number)],
- });
-
- expect(options.name).not.toHaveLength(0);
- });
-
- it('name options', () => {
- const yAxisName = 'My axis values';
- const options = getYAxisOptions({
- name: yAxisName,
- });
-
- expect(options).toMatchObject({
- name: yAxisName,
- nameLocation: 'center',
- nameGap: expect.any(Number),
- });
- });
-
- it('formatter options defaults to engineering notation', () => {
- const options = getYAxisOptions();
-
- expect(options.axisLabel.formatter).toEqual(expect.any(Function));
- expect(options.axisLabel.formatter(3002.1)).toBe('3k');
- });
-
- it('formatter options allows for precision to be set explicitly', () => {
- const options = getYAxisOptions({
- precision: 4,
- });
-
- expect(options.axisLabel.formatter).toEqual(expect.any(Function));
- expect(options.axisLabel.formatter(5002.1)).toBe('5.0021k');
- });
-
- it('formatter options allows for overrides in milliseconds', () => {
- const options = getYAxisOptions({
- format: SUPPORTED_FORMATS.milliseconds,
- });
-
- expect(options.axisLabel.formatter).toEqual(expect.any(Function));
- expect(options.axisLabel.formatter(1.1234)).toBe('1.12ms');
- });
-
- it('formatter options allows for overrides in bytes', () => {
- const options = getYAxisOptions({
- format: SUPPORTED_FORMATS.bytes,
- });
-
- expect(options.axisLabel.formatter).toEqual(expect.any(Function));
- expect(options.axisLabel.formatter(1)).toBe('1.00B');
- });
- });
-
- describe('getTooltipFormatter', () => {
- it('default format', () => {
- const formatter = getTooltipFormatter();
-
- expect(formatter).toEqual(expect.any(Function));
- expect(formatter(0.11111)).toBe('111.1m');
- });
-
- it('defined format', () => {
- const formatter = getTooltipFormatter({
- format: SUPPORTED_FORMATS.bytes,
- });
-
- expect(formatter(1)).toBe('1.000B');
- });
- });
-
- describe('getValidThresholds', () => {
- const invalidCases = [null, undefined, NaN, 'a string', true, false];
-
- let thresholds;
-
- afterEach(() => {
- thresholds = null;
- });
-
- it('returns same thresholds when passed values within range', () => {
- thresholds = getValidThresholds({
- mode: 'absolute',
- range: { min: 0, max: 100 },
- values: [10, 50],
- });
-
- expect(thresholds).toEqual([10, 50]);
- });
-
- it('filters out thresholds that are out of range', () => {
- thresholds = getValidThresholds({
- mode: 'absolute',
- range: { min: 0, max: 100 },
- values: [-5, 10, 110],
- });
-
- expect(thresholds).toEqual([10]);
- });
- it('filters out duplicate thresholds', () => {
- thresholds = getValidThresholds({
- mode: 'absolute',
- range: { min: 0, max: 100 },
- values: [5, 5, 10, 10],
- });
-
- expect(thresholds).toEqual([5, 10]);
- });
-
- it('sorts passed thresholds and applies only the first two in ascending order', () => {
- thresholds = getValidThresholds({
- mode: 'absolute',
- range: { min: 0, max: 100 },
- values: [10, 1, 35, 20, 5],
- });
-
- expect(thresholds).toEqual([1, 5]);
- });
-
- it('thresholds equal to min or max are filtered out', () => {
- thresholds = getValidThresholds({
- mode: 'absolute',
- range: { min: 0, max: 100 },
- values: [0, 100],
- });
-
- expect(thresholds).toEqual([]);
- });
-
- it.each(invalidCases)('invalid values for thresholds are filtered out', (invalidValue) => {
- thresholds = getValidThresholds({
- mode: 'absolute',
- range: { min: 0, max: 100 },
- values: [10, invalidValue],
- });
-
- expect(thresholds).toEqual([10]);
- });
-
- describe('range', () => {
- it('when range is not defined, empty result is returned', () => {
- thresholds = getValidThresholds({
- mode: 'absolute',
- values: [10, 20],
- });
-
- expect(thresholds).toEqual([]);
- });
-
- it('when min is not defined, empty result is returned', () => {
- thresholds = getValidThresholds({
- mode: 'absolute',
- range: { max: 100 },
- values: [10, 20],
- });
-
- expect(thresholds).toEqual([]);
- });
-
- it('when max is not defined, empty result is returned', () => {
- thresholds = getValidThresholds({
- mode: 'absolute',
- range: { min: 0 },
- values: [10, 20],
- });
-
- expect(thresholds).toEqual([]);
- });
-
- it('when min is larger than max, empty result is returned', () => {
- thresholds = getValidThresholds({
- mode: 'absolute',
- range: { min: 100, max: 0 },
- values: [10, 20],
- });
-
- expect(thresholds).toEqual([]);
- });
-
- it.each(invalidCases)(
- 'when min has invalid value, empty result is returned',
- (invalidValue) => {
- thresholds = getValidThresholds({
- mode: 'absolute',
- range: { min: invalidValue, max: 100 },
- values: [10, 20],
- });
-
- expect(thresholds).toEqual([]);
- },
- );
-
- it.each(invalidCases)(
- 'when max has invalid value, empty result is returned',
- (invalidValue) => {
- thresholds = getValidThresholds({
- mode: 'absolute',
- range: { min: 0, max: invalidValue },
- values: [10, 20],
- });
-
- expect(thresholds).toEqual([]);
- },
- );
- });
-
- describe('values', () => {
- it('if values parameter is omitted, empty result is returned', () => {
- thresholds = getValidThresholds({
- mode: 'absolute',
- range: { min: 0, max: 100 },
- });
-
- expect(thresholds).toEqual([]);
- });
-
- it('if there are no values passed, empty result is returned', () => {
- thresholds = getValidThresholds({
- mode: 'absolute',
- range: { min: 0, max: 100 },
- values: [],
- });
-
- expect(thresholds).toEqual([]);
- });
-
- it.each(invalidCases)(
- 'if invalid values are passed, empty result is returned',
- (invalidValue) => {
- thresholds = getValidThresholds({
- mode: 'absolute',
- range: { min: 0, max: 100 },
- values: [invalidValue],
- });
-
- expect(thresholds).toEqual([]);
- },
- );
- });
-
- describe('mode', () => {
- it.each(invalidCases)(
- 'if invalid values are passed, empty result is returned',
- (invalidValue) => {
- thresholds = getValidThresholds({
- mode: invalidValue,
- range: { min: 0, max: 100 },
- values: [10, 50],
- });
-
- expect(thresholds).toEqual([]);
- },
- );
-
- it('if mode is not passed, empty result is returned', () => {
- thresholds = getValidThresholds({
- range: { min: 0, max: 100 },
- values: [10, 50],
- });
-
- expect(thresholds).toEqual([]);
- });
-
- describe('absolute mode', () => {
- it('absolute mode behaves correctly', () => {
- thresholds = getValidThresholds({
- mode: 'absolute',
- range: { min: 0, max: 100 },
- values: [10, 50],
- });
-
- expect(thresholds).toEqual([10, 50]);
- });
- });
-
- describe('percentage mode', () => {
- it('percentage mode behaves correctly', () => {
- thresholds = getValidThresholds({
- mode: 'percentage',
- range: { min: 0, max: 1000 },
- values: [10, 50],
- });
-
- expect(thresholds).toEqual([100, 500]);
- });
-
- const outOfPercentBoundsValues = [-1, 0, 100, 101];
- it.each(outOfPercentBoundsValues)(
- 'when values out of 0-100 range are passed, empty result is returned',
- (invalidValue) => {
- thresholds = getValidThresholds({
- mode: 'percentage',
- range: { min: 0, max: 1000 },
- values: [invalidValue],
- });
-
- expect(thresholds).toEqual([]);
- },
- );
- });
- });
-
- it('calling without passing object parameter returns empty array', () => {
- thresholds = getValidThresholds();
-
- expect(thresholds).toEqual([]);
- });
- });
-});
diff --git a/spec/frontend/monitoring/components/charts/single_stat_spec.js b/spec/frontend/monitoring/components/charts/single_stat_spec.js
deleted file mode 100644
index fa31b479296..00000000000
--- a/spec/frontend/monitoring/components/charts/single_stat_spec.js
+++ /dev/null
@@ -1,94 +0,0 @@
-import { GlSingleStat } from '@gitlab/ui/dist/charts';
-import { shallowMount } from '@vue/test-utils';
-import SingleStatChart from '~/monitoring/components/charts/single_stat.vue';
-import { singleStatGraphData } from '../../graph_data';
-
-describe('Single Stat Chart component', () => {
- let wrapper;
-
- const createComponent = (props = {}) => {
- wrapper = shallowMount(SingleStatChart, {
- propsData: {
- graphData: singleStatGraphData({}, { unit: 'MB' }),
- ...props,
- },
- });
- };
-
- const findChart = () => wrapper.findComponent(GlSingleStat);
-
- beforeEach(() => {
- createComponent();
- });
-
- describe('computed', () => {
- describe('statValue', () => {
- it('should display the correct value', () => {
- expect(findChart().props('value')).toBe('1.00');
- });
-
- it('should display the correct value unit', () => {
- expect(findChart().props('unit')).toBe('MB');
- });
-
- it('should change the value representation to a percentile one', () => {
- createComponent({
- graphData: singleStatGraphData({ max_value: 120 }, { value: 91 }),
- });
-
- expect(findChart().props('value')).toBe('75.83');
- expect(findChart().props('unit')).toBe('%');
- });
-
- it('should display NaN for non numeric maxValue values', () => {
- createComponent({
- graphData: singleStatGraphData({ max_value: 'not a number' }),
- });
-
- expect(findChart().props('value')).toContain('NaN');
- });
-
- it('should display NaN for missing query values', () => {
- createComponent({
- graphData: singleStatGraphData({ max_value: 120 }, { value: 'NaN' }),
- });
-
- expect(findChart().props('value')).toContain('NaN');
- });
-
- it('should not display `unit` when `unit` is undefined', () => {
- createComponent({
- graphData: singleStatGraphData({}, { unit: undefined }),
- });
-
- expect(findChart().props('value')).not.toContain('undefined');
- });
-
- it('should not display `unit` when `unit` is null', () => {
- createComponent({
- graphData: singleStatGraphData({}, { unit: null }),
- });
-
- expect(findChart().props('value')).not.toContain('null');
- });
-
- describe('when a field attribute is set', () => {
- it('displays a label value instead of metric value when field attribute is used', () => {
- createComponent({
- graphData: singleStatGraphData({ field: 'job' }, { isVector: true }),
- });
-
- expect(findChart().props('value')).toContain('prometheus');
- });
-
- it('displays No data to display if field attribute is not present', () => {
- createComponent({
- graphData: singleStatGraphData({ field: 'this-does-not-exist' }),
- });
-
- expect(findChart().props('value')).toContain('No data to display');
- });
- });
- });
- });
-});
diff --git a/spec/frontend/monitoring/components/charts/stacked_column_spec.js b/spec/frontend/monitoring/components/charts/stacked_column_spec.js
deleted file mode 100644
index 779ded090c2..00000000000
--- a/spec/frontend/monitoring/components/charts/stacked_column_spec.js
+++ /dev/null
@@ -1,193 +0,0 @@
-import { GlStackedColumnChart, GlChartLegend } from '@gitlab/ui/dist/charts';
-import { shallowMount, mount } from '@vue/test-utils';
-import { cloneDeep } from 'lodash';
-import timezoneMock from 'timezone-mock';
-import { nextTick } from 'vue';
-import StackedColumnChart from '~/monitoring/components/charts/stacked_column.vue';
-import { stackedColumnGraphData } from '../../graph_data';
-
-jest.mock('~/lib/utils/icon_utils', () => ({
- getSvgIconPathContent: jest.fn().mockImplementation((icon) => Promise.resolve(`${icon}-content`)),
-}));
-
-describe('Stacked column chart component', () => {
- const stackedColumnMockedData = stackedColumnGraphData();
-
- let wrapper;
-
- const findChart = () => wrapper.findComponent(GlStackedColumnChart);
- const findLegend = () => wrapper.findComponent(GlChartLegend);
-
- const createWrapper = (props = {}, mountingMethod = shallowMount) =>
- mountingMethod(StackedColumnChart, {
- propsData: {
- graphData: stackedColumnMockedData,
- ...props,
- },
- stubs: {
- GlPopover: true,
- },
- attachTo: document.body,
- });
-
- beforeEach(() => {
- wrapper = createWrapper({}, mount);
- });
-
- describe('when graphData is present', () => {
- beforeEach(async () => {
- createWrapper();
- await nextTick();
- });
-
- it('chart is rendered', () => {
- expect(findChart().exists()).toBe(true);
- });
-
- it('data should match the graphData y value for each series', () => {
- const data = findChart().props('bars');
-
- data.forEach((series, index) => {
- const { values } = stackedColumnMockedData.metrics[index].result[0];
- expect(series.data).toEqual(values.map((value) => value[1]));
- });
- });
-
- it('data should be the same length as the graphData metrics labels', () => {
- const barDataProp = findChart().props('bars');
-
- expect(barDataProp).toHaveLength(stackedColumnMockedData.metrics.length);
- barDataProp.forEach(({ name }, index) => {
- expect(stackedColumnMockedData.metrics[index].label).toBe(name);
- });
- });
-
- it('group by should be the same as the graphData first metric results', () => {
- const groupBy = findChart().props('groupBy');
-
- expect(groupBy).toEqual([
- '2015-07-01T20:10:50.000Z',
- '2015-07-01T20:12:50.000Z',
- '2015-07-01T20:14:50.000Z',
- ]);
- });
-
- it('chart options should configure data zoom and axis label', () => {
- const chartOptions = findChart().props('option');
- const xAxisType = findChart().props('xAxisType');
-
- expect(chartOptions).toMatchObject({
- dataZoom: [{ handleIcon: 'path://scroll-handle-content' }],
- xAxis: {
- axisLabel: { formatter: expect.any(Function) },
- },
- });
-
- expect(xAxisType).toBe('category');
- });
-
- it('chart options should configure category as x axis type', () => {
- const chartOptions = findChart().props('option');
- const xAxisType = findChart().props('xAxisType');
-
- expect(chartOptions).toMatchObject({
- xAxis: {
- type: 'category',
- },
- });
- expect(xAxisType).toBe('category');
- });
-
- it('format date is correct', () => {
- const { xAxis } = findChart().props('option');
- expect(xAxis.axisLabel.formatter('2020-01-30T12:01:00.000Z')).toBe('12:01 PM');
- });
-
- describe('when in PT timezone', () => {
- beforeAll(() => {
- timezoneMock.register('US/Pacific');
- });
-
- afterAll(() => {
- timezoneMock.unregister();
- });
-
- it('date is shown in local time', () => {
- const { xAxis } = findChart().props('option');
- expect(xAxis.axisLabel.formatter('2020-01-30T12:01:00.000Z')).toBe('4:01 AM');
- });
-
- it('date is shown in UTC', async () => {
- wrapper.setProps({ timezone: 'UTC' });
-
- await nextTick();
- const { xAxis } = findChart().props('option');
- expect(xAxis.axisLabel.formatter('2020-01-30T12:01:00.000Z')).toBe('12:01 PM');
- });
- });
- });
-
- describe('when graphData has results missing', () => {
- beforeEach(async () => {
- const graphData = cloneDeep(stackedColumnMockedData);
-
- graphData.metrics[0].result = null;
-
- createWrapper({ graphData });
- await nextTick();
- });
-
- it('chart is rendered', () => {
- expect(findChart().exists()).toBe(true);
- });
- });
-
- describe('legend', () => {
- beforeEach(() => {
- wrapper = createWrapper({}, mount);
- });
-
- it('allows user to override legend label texts using props', async () => {
- const legendRelatedProps = {
- legendMinText: 'legendMinText',
- legendMaxText: 'legendMaxText',
- legendAverageText: 'legendAverageText',
- legendCurrentText: 'legendCurrentText',
- };
- wrapper.setProps({
- ...legendRelatedProps,
- });
-
- await nextTick();
- expect(findChart().props()).toMatchObject(legendRelatedProps);
- });
-
- it('should render a tabular legend layout by default', () => {
- expect(findLegend().props('layout')).toBe('table');
- });
-
- describe('when inline legend layout prop is set', () => {
- beforeEach(() => {
- wrapper.setProps({
- legendLayout: 'inline',
- });
- });
-
- it('should render an inline legend layout', () => {
- expect(findLegend().props('layout')).toBe('inline');
- });
- });
-
- describe('when table legend layout prop is set', () => {
- beforeEach(() => {
- wrapper.setProps({
- legendLayout: 'table',
- });
- });
-
- it('should render a tabular legend layout', () => {
- expect(findLegend().props('layout')).toBe('table');
- });
- });
- });
-});
diff --git a/spec/frontend/monitoring/components/charts/time_series_spec.js b/spec/frontend/monitoring/components/charts/time_series_spec.js
deleted file mode 100644
index c1b51f71a7e..00000000000
--- a/spec/frontend/monitoring/components/charts/time_series_spec.js
+++ /dev/null
@@ -1,748 +0,0 @@
-import { GlLink } from '@gitlab/ui';
-import {
- GlAreaChart,
- GlLineChart,
- GlChartSeriesLabel,
- GlChartLegend,
-} from '@gitlab/ui/dist/charts';
-import { mount, shallowMount } from '@vue/test-utils';
-import timezoneMock from 'timezone-mock';
-import { nextTick } from 'vue';
-import { TEST_HOST } from 'helpers/test_constants';
-import { shallowWrapperContainsSlotText } from 'helpers/vue_test_utils_helper';
-import TimeSeries from '~/monitoring/components/charts/time_series.vue';
-import { panelTypes, chartHeight } from '~/monitoring/constants';
-import { timeSeriesGraphData } from '../../graph_data';
-import {
- deploymentData,
- mockProjectDir,
- annotationsData,
- mockFixedTimeRange,
-} from '../../mock_data';
-
-jest.mock('lodash/throttle', () =>
- // this throttle mock executes immediately
- jest.fn((func) => {
- // eslint-disable-next-line no-param-reassign
- func.cancel = jest.fn();
- return func;
- }),
-);
-jest.mock('~/lib/utils/icon_utils', () => ({
- getSvgIconPathContent: jest.fn().mockImplementation((icon) => Promise.resolve(`${icon}-content`)),
-}));
-
-describe('Time series component', () => {
- const defaultGraphData = timeSeriesGraphData();
- let wrapper;
-
- const createWrapper = (
- { graphData = defaultGraphData, ...props } = {},
- mountingMethod = shallowMount,
- ) => {
- wrapper = mountingMethod(TimeSeries, {
- propsData: {
- graphData,
- deploymentData,
- annotations: annotationsData,
- projectPath: `${TEST_HOST}${mockProjectDir}`,
- timeRange: mockFixedTimeRange,
- ...props,
- },
- stubs: {
- GlPopover: true,
- GlLineChart,
- GlAreaChart,
- },
- attachTo: document.body,
- });
- };
-
- describe('With a single time series', () => {
- describe('general functions', () => {
- const findChart = () => wrapper.findComponent({ ref: 'chart' });
-
- beforeEach(async () => {
- createWrapper({}, mount);
- await nextTick();
- });
-
- it('allows user to override legend label texts using props', async () => {
- const legendRelatedProps = {
- legendMinText: 'legendMinText',
- legendMaxText: 'legendMaxText',
- legendAverageText: 'legendAverageText',
- legendCurrentText: 'legendCurrentText',
- };
- wrapper.setProps({
- ...legendRelatedProps,
- });
-
- await nextTick();
- expect(findChart().props()).toMatchObject(legendRelatedProps);
- });
-
- it('chart sets a default height', () => {
- createWrapper();
- expect(wrapper.props('height')).toBe(chartHeight);
- });
-
- it('chart has a configurable height', async () => {
- const mockHeight = 599;
- createWrapper();
-
- wrapper.setProps({ height: mockHeight });
- await nextTick();
- expect(wrapper.props('height')).toBe(mockHeight);
- });
-
- describe('events', () => {
- describe('datazoom', () => {
- let eChartMock;
- let startValue;
- let endValue;
-
- beforeEach(async () => {
- eChartMock = {
- handlers: {},
- getOption: () => ({
- dataZoom: [
- {
- startValue,
- endValue,
- },
- ],
- }),
- off: jest.fn((eChartEvent) => {
- delete eChartMock.handlers[eChartEvent];
- }),
- on: jest.fn((eChartEvent, fn) => {
- eChartMock.handlers[eChartEvent] = fn;
- }),
- };
-
- createWrapper({}, mount);
- await nextTick();
- findChart().vm.$emit('created', eChartMock);
- });
-
- it('handles datazoom event from chart', () => {
- startValue = 1577836800000; // 2020-01-01T00:00:00.000Z
- endValue = 1577840400000; // 2020-01-01T01:00:00.000Z
- eChartMock.handlers.datazoom();
-
- expect(wrapper.emitted('datazoom')).toHaveLength(1);
- expect(wrapper.emitted('datazoom')[0]).toEqual([
- {
- start: new Date(startValue).toISOString(),
- end: new Date(endValue).toISOString(),
- },
- ]);
- });
- });
- });
-
- describe('methods', () => {
- describe('formatTooltipText', () => {
- const mockCommitUrl = deploymentData[0].commitUrl;
- const mockDate = deploymentData[0].created_at;
- const mockSha = 'f5bcd1d9';
- const mockLineSeriesData = () => ({
- seriesData: [
- {
- seriesName: wrapper.vm.chartData[0].name,
- componentSubType: 'line',
- value: [mockDate, 5.55555],
- dataIndex: 0,
- },
- ],
- value: mockDate,
- });
-
- const annotationsMetadata = {
- tooltipData: {
- sha: mockSha,
- commitUrl: mockCommitUrl,
- },
- };
-
- const mockAnnotationsSeriesData = {
- seriesData: [
- {
- componentSubType: 'scatter',
- seriesName: 'series01',
- dataIndex: 0,
- value: [mockDate, 5.55555],
- type: 'scatter',
- name: 'deployments',
- },
- ],
- value: mockDate,
- };
-
- it('does not throw error if data point is outside the zoom range', () => {
- const seriesDataWithoutValue = {
- ...mockLineSeriesData(),
- seriesData: mockLineSeriesData().seriesData.map((data) => ({
- ...data,
- value: undefined,
- })),
- };
- expect(wrapper.vm.formatTooltipText(seriesDataWithoutValue)).toBeUndefined();
- });
-
- describe('when series is of line type', () => {
- beforeEach(async () => {
- createWrapper({}, mount);
- wrapper.vm.formatTooltipText(mockLineSeriesData());
- await nextTick();
- });
-
- it('formats tooltip title', () => {
- expect(wrapper.vm.tooltip.title).toBe('16 Jul 2019, 10:14AM (UTC)');
- });
-
- it('formats tooltip content', () => {
- const name = 'Metric 1';
- const value = '5.556';
- const dataIndex = 0;
- const seriesLabel = wrapper.findComponent(GlChartSeriesLabel);
-
- expect(seriesLabel.vm.color).toBe('');
-
- expect(shallowWrapperContainsSlotText(seriesLabel, 'default', name)).toBe(true);
- expect(wrapper.vm.tooltip.content).toEqual([
- { name, value, dataIndex, color: undefined },
- ]);
-
- expect(
- shallowWrapperContainsSlotText(
- wrapper.findComponent(GlLineChart),
- 'tooltip-content',
- value,
- ),
- ).toBe(true);
- });
-
- describe('when in PT timezone', () => {
- beforeAll(() => {
- // Note: node.js env renders (GMT-0700), in the browser we see (PDT)
- timezoneMock.register('US/Pacific');
- });
-
- afterAll(() => {
- timezoneMock.unregister();
- });
-
- it('formats tooltip title in local timezone by default', async () => {
- createWrapper();
- wrapper.vm.formatTooltipText(mockLineSeriesData());
- await nextTick();
- expect(wrapper.vm.tooltip.title).toBe('16 Jul 2019, 3:14AM (GMT-0700)');
- });
-
- it('formats tooltip title in local timezone', async () => {
- createWrapper({ timezone: 'LOCAL' });
- wrapper.vm.formatTooltipText(mockLineSeriesData());
- await nextTick();
- expect(wrapper.vm.tooltip.title).toBe('16 Jul 2019, 3:14AM (GMT-0700)');
- });
-
- it('formats tooltip title in UTC format', async () => {
- createWrapper({ timezone: 'UTC' });
- wrapper.vm.formatTooltipText(mockLineSeriesData());
- await nextTick();
- expect(wrapper.vm.tooltip.title).toBe('16 Jul 2019, 10:14AM (UTC)');
- });
- });
- });
-
- describe('when series is of scatter type, for deployments', () => {
- beforeEach(async () => {
- wrapper.vm.formatTooltipText({
- ...mockAnnotationsSeriesData,
- seriesData: mockAnnotationsSeriesData.seriesData.map((data) => ({
- ...data,
- data: annotationsMetadata,
- })),
- });
- await nextTick();
- });
-
- it('set tooltip type to deployments', () => {
- expect(wrapper.vm.tooltip.type).toBe('deployments');
- });
-
- it('formats tooltip title', () => {
- expect(wrapper.vm.tooltip.title).toBe('16 Jul 2019, 10:14AM (UTC)');
- });
-
- it('formats tooltip sha', () => {
- expect(wrapper.vm.tooltip.sha).toBe('f5bcd1d9');
- });
-
- it('formats tooltip commit url', () => {
- expect(wrapper.vm.tooltip.commitUrl).toBe(mockCommitUrl);
- });
- });
-
- describe('when series is of scatter type and deployments data is missing', () => {
- beforeEach(async () => {
- wrapper.vm.formatTooltipText(mockAnnotationsSeriesData);
- await nextTick();
- });
-
- it('formats tooltip title', () => {
- expect(wrapper.vm.tooltip.title).toBe('16 Jul 2019, 10:14AM (UTC)');
- });
-
- it('formats tooltip sha', () => {
- expect(wrapper.vm.tooltip.sha).toBeUndefined();
- });
-
- it('formats tooltip commit url', () => {
- expect(wrapper.vm.tooltip.commitUrl).toBeUndefined();
- });
- });
- });
-
- describe('formatAnnotationsTooltipText', () => {
- const annotationsMetadata = {
- name: 'annotations',
- xAxis: annotationsData[0].from,
- yAxis: 0,
- tooltipData: {
- title: '2020/02/19 10:01:41',
- content: annotationsData[0].description,
- },
- };
-
- const mockMarkPoint = {
- componentType: 'markPoint',
- name: 'annotations',
- value: undefined,
- data: annotationsMetadata,
- };
-
- it('formats tooltip title and sets tooltip content', () => {
- const formattedTooltipData = wrapper.vm.formatAnnotationsTooltipText(mockMarkPoint);
- expect(formattedTooltipData.title).toBe('19 Feb 2020, 10:01AM (UTC)');
- expect(formattedTooltipData.content).toBe(annotationsMetadata.tooltipData.content);
- });
- });
- });
-
- describe('computed', () => {
- const getChartOptions = () => findChart().props('option');
-
- describe('chartData', () => {
- let chartData;
- const seriesData = () => chartData[0];
-
- beforeEach(() => {
- ({ chartData } = wrapper.vm);
- });
-
- it('utilizes all data points', () => {
- expect(chartData.length).toBe(1);
- expect(seriesData().data.length).toBe(3);
- });
-
- it('creates valid data', () => {
- const { data } = seriesData();
-
- expect(
- data.filter(
- ([time, value]) => new Date(time).getTime() > 0 && typeof value === 'number',
- ).length,
- ).toBe(data.length);
- });
-
- it('formats line width correctly', () => {
- expect(chartData[0].lineStyle.width).toBe(2);
- });
- });
-
- describe('chartOptions', () => {
- describe('x-Axis bounds', () => {
- it('is set to the time range bounds', () => {
- expect(getChartOptions().xAxis).toMatchObject({
- min: mockFixedTimeRange.start,
- max: mockFixedTimeRange.end,
- });
- });
-
- it('is not set if time range is not set or incorrectly set', async () => {
- wrapper.setProps({
- timeRange: {},
- });
- await nextTick();
- expect(getChartOptions().xAxis).not.toHaveProperty('min');
- expect(getChartOptions().xAxis).not.toHaveProperty('max');
- });
- });
-
- describe('dataZoom', () => {
- it('renders with scroll handle icons', () => {
- expect(getChartOptions().dataZoom).toHaveLength(1);
- expect(getChartOptions().dataZoom[0]).toMatchObject({
- handleIcon: 'path://scroll-handle-content',
- });
- });
- });
-
- describe('xAxis pointer', () => {
- it('snap is set to false by default', () => {
- expect(getChartOptions().xAxis.axisPointer.snap).toBe(false);
- });
- });
-
- describe('are extended by `option`', () => {
- const mockSeriesName = 'Extra series 1';
- const mockOption = {
- option1: 'option1',
- option2: 'option2',
- };
-
- it('arbitrary options', async () => {
- wrapper.setProps({
- option: mockOption,
- });
-
- await nextTick();
- expect(getChartOptions()).toEqual(expect.objectContaining(mockOption));
- });
-
- it('additional series', async () => {
- wrapper.setProps({
- option: {
- series: [
- {
- name: mockSeriesName,
- type: 'line',
- data: [],
- },
- ],
- },
- });
-
- await nextTick();
- const optionSeries = getChartOptions().series;
-
- expect(optionSeries.length).toEqual(2);
- expect(optionSeries[0].name).toEqual(mockSeriesName);
- });
-
- it('additional y-axis data', async () => {
- const mockCustomYAxisOption = {
- name: 'Custom y-axis label',
- axisLabel: {
- formatter: jest.fn(),
- },
- };
-
- wrapper.setProps({
- option: {
- yAxis: mockCustomYAxisOption,
- },
- });
-
- await nextTick();
- const { yAxis } = getChartOptions();
-
- expect(yAxis[0]).toMatchObject(mockCustomYAxisOption);
- });
-
- it('additional x axis data', async () => {
- const mockCustomXAxisOption = {
- name: 'Custom x axis label',
- };
-
- wrapper.setProps({
- option: {
- xAxis: mockCustomXAxisOption,
- },
- });
-
- await nextTick();
- const { xAxis } = getChartOptions();
-
- expect(xAxis).toMatchObject(mockCustomXAxisOption);
- });
- });
-
- describe('yAxis formatter', () => {
- let dataFormatter;
- let deploymentFormatter;
-
- beforeEach(() => {
- dataFormatter = getChartOptions().yAxis[0].axisLabel.formatter;
- deploymentFormatter = getChartOptions().yAxis[1].axisLabel.formatter;
- });
-
- it('formats by default to precision notation', () => {
- expect(dataFormatter(0.88888)).toBe('889m');
- });
-
- it('deployment formatter is set as is required to display a tooltip', () => {
- expect(deploymentFormatter).toEqual(expect.any(Function));
- });
- });
- });
-
- describe('annotationSeries', () => {
- it('utilizes deployment data', () => {
- const annotationSeries = wrapper.vm.chartOptionSeries[0];
- expect(annotationSeries.yAxisIndex).toBe(1); // same as annotations y axis
- expect(annotationSeries.data).toEqual([
- expect.objectContaining({
- symbolSize: 14,
- symbol: 'path://rocket-content',
- value: ['2019-07-16T10:14:25.589Z', expect.any(Number)],
- }),
- expect.objectContaining({
- symbolSize: 14,
- symbol: 'path://rocket-content',
- value: ['2019-07-16T11:14:25.589Z', expect.any(Number)],
- }),
- expect.objectContaining({
- symbolSize: 14,
- symbol: 'path://rocket-content',
- value: ['2019-07-16T12:14:25.589Z', expect.any(Number)],
- }),
- ]);
- });
- });
-
- describe('xAxisLabel', () => {
- const mockDate = Date.UTC(2020, 4, 26, 20); // 8:00 PM in GMT
-
- const useXAxisFormatter = (date) => {
- const { xAxis } = getChartOptions();
- const { formatter } = xAxis.axisLabel;
- return formatter(date);
- };
-
- it('x-axis is formatted correctly in m/d h:MM TT format', () => {
- expect(useXAxisFormatter(mockDate)).toEqual('5/26 8:00 PM');
- });
-
- describe('when in PT timezone', () => {
- beforeAll(() => {
- timezoneMock.register('US/Pacific');
- });
-
- afterAll(() => {
- timezoneMock.unregister();
- });
-
- it('by default, values are formatted in PT', () => {
- createWrapper();
- expect(useXAxisFormatter(mockDate)).toEqual('5/26 1:00 PM');
- });
-
- it('when the chart uses local timezone, y-axis is formatted in PT', () => {
- createWrapper({ timezone: 'LOCAL' });
- expect(useXAxisFormatter(mockDate)).toEqual('5/26 1:00 PM');
- });
-
- it('when the chart uses UTC, y-axis is formatted in UTC', () => {
- createWrapper({ timezone: 'UTC' });
- expect(useXAxisFormatter(mockDate)).toEqual('5/26 8:00 PM');
- });
- });
- });
-
- describe('yAxisLabel', () => {
- it('y-axis is configured correctly', () => {
- const { yAxis } = getChartOptions();
-
- expect(yAxis).toHaveLength(2);
-
- const [dataAxis, deploymentAxis] = yAxis;
-
- expect(dataAxis.boundaryGap).toHaveLength(2);
- expect(dataAxis.scale).toBe(true);
-
- expect(deploymentAxis.show).toBe(false);
- expect(deploymentAxis.min).toEqual(expect.any(Number));
- expect(deploymentAxis.max).toEqual(expect.any(Number));
- expect(deploymentAxis.min).toBeLessThan(deploymentAxis.max);
- });
-
- it('constructs a label for the chart y-axis', () => {
- const { yAxis } = getChartOptions();
-
- expect(yAxis[0].name).toBe('Y Axis');
- });
- });
- });
- });
-
- describe('wrapped components', () => {
- const glChartComponents = [
- {
- chartType: panelTypes.AREA_CHART,
- component: GlAreaChart,
- },
- {
- chartType: panelTypes.LINE_CHART,
- component: GlLineChart,
- },
- ];
-
- glChartComponents.forEach((dynamicComponent) => {
- describe(`GitLab UI: ${dynamicComponent.chartType}`, () => {
- const findChartComponent = () => wrapper.findComponent(dynamicComponent.component);
-
- beforeEach(async () => {
- createWrapper(
- { graphData: timeSeriesGraphData({ type: dynamicComponent.chartType }) },
- mount,
- );
- await nextTick();
- });
-
- it('exists', () => {
- expect(findChartComponent().exists()).toBe(true);
- });
-
- it('receives data properties needed for proper chart render', () => {
- const props = findChartComponent().props();
-
- expect(props.data).toBe(wrapper.vm.chartData);
- expect(props.option).toBe(wrapper.vm.chartOptions);
- expect(props.formatTooltipText).toBe(wrapper.vm.formatTooltipText);
- });
-
- it('receives a tooltip title', async () => {
- const mockTitle = 'mockTitle';
- wrapper.vm.tooltip.title = mockTitle;
-
- await nextTick();
- expect(
- shallowWrapperContainsSlotText(findChartComponent(), 'tooltip-title', mockTitle),
- ).toBe(true);
- });
-
- describe('when tooltip is showing deployment data', () => {
- const mockSha = 'mockSha';
- const commitUrl = `${mockProjectDir}/-/commit/${mockSha}`;
-
- 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({
- tooltip: {
- type: 'deployments',
- },
- });
- await nextTick();
- });
-
- it('uses deployment title', () => {
- expect(
- shallowWrapperContainsSlotText(findChartComponent(), 'tooltip-title', 'Deployed'),
- ).toBe(true);
- });
-
- it('renders clickable commit sha in tooltip content', async () => {
- wrapper.vm.tooltip.sha = mockSha;
- wrapper.vm.tooltip.commitUrl = commitUrl;
-
- await nextTick();
- const commitLink = wrapper.findComponent(GlLink);
-
- expect(shallowWrapperContainsSlotText(commitLink, 'default', mockSha)).toBe(true);
- expect(commitLink.attributes('href')).toEqual(commitUrl);
- });
- });
- });
- });
- });
- });
-
- describe('with multiple time series', () => {
- describe('General functions', () => {
- beforeEach(async () => {
- const graphData = timeSeriesGraphData({ type: panelTypes.AREA_CHART, multiMetric: true });
-
- createWrapper({ graphData }, mount);
- await nextTick();
- });
-
- describe('Color match', () => {
- let lineColors;
-
- beforeEach(() => {
- lineColors = wrapper
- .findComponent(GlAreaChart)
- .vm.series.map((item) => item.lineStyle.color);
- });
-
- it('should contain different colors for contiguous time series', () => {
- lineColors.forEach((color, index) => {
- expect(color).not.toBe(lineColors[index + 1]);
- });
- });
-
- it('should match series color with tooltip label color', () => {
- const labels = wrapper.findAllComponents(GlChartSeriesLabel);
-
- lineColors.forEach((color, index) => {
- const labelColor = labels.at(index).props('color');
- expect(color).toBe(labelColor);
- });
- });
-
- it('should match series color with legend color', () => {
- const legendColors = wrapper
- .findComponent(GlChartLegend)
- .props('seriesInfo')
- .map((item) => item.color);
-
- lineColors.forEach((color, index) => {
- expect(color).toBe(legendColors[index]);
- });
- });
- });
- });
- });
-
- describe('legend layout', () => {
- const findLegend = () => wrapper.findComponent(GlChartLegend);
-
- beforeEach(async () => {
- createWrapper({}, mount);
- await nextTick();
- });
-
- it('should render a tabular legend layout by default', () => {
- expect(findLegend().props('layout')).toBe('table');
- });
-
- describe('when inline legend layout prop is set', () => {
- beforeEach(() => {
- wrapper.setProps({
- legendLayout: 'inline',
- });
- });
-
- it('should render an inline legend layout', () => {
- expect(findLegend().props('layout')).toBe('inline');
- });
- });
-
- describe('when table legend layout prop is set', () => {
- beforeEach(() => {
- wrapper.setProps({
- legendLayout: 'table',
- });
- });
-
- it('should render a tabular legend layout', () => {
- expect(findLegend().props('layout')).toBe('table');
- });
- });
- });
-});
diff --git a/spec/frontend/monitoring/components/create_dashboard_modal_spec.js b/spec/frontend/monitoring/components/create_dashboard_modal_spec.js
deleted file mode 100644
index eb05b1f184a..00000000000
--- a/spec/frontend/monitoring/components/create_dashboard_modal_spec.js
+++ /dev/null
@@ -1,44 +0,0 @@
-import { GlModal } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import { nextTick } from 'vue';
-import CreateDashboardModal from '~/monitoring/components/create_dashboard_modal.vue';
-
-describe('Create dashboard modal', () => {
- let wrapper;
-
- const defaultProps = {
- modalId: 'id',
- projectPath: 'https://localhost/',
- addDashboardDocumentationPath: 'https://link/to/docs',
- };
-
- const findDocsButton = () => wrapper.find('[data-testid="create-dashboard-modal-docs-button"]');
- const findRepoButton = () => wrapper.find('[data-testid="create-dashboard-modal-repo-button"]');
-
- const createWrapper = (props = {}, options = {}) => {
- wrapper = shallowMount(CreateDashboardModal, {
- propsData: { ...defaultProps, ...props },
- stubs: {
- GlModal,
- },
- ...options,
- });
- };
-
- beforeEach(() => {
- createWrapper();
- });
-
- it('has button that links to the project url', async () => {
- findRepoButton().trigger('click');
-
- await nextTick();
- expect(findRepoButton().exists()).toBe(true);
- expect(findRepoButton().attributes('href')).toBe(defaultProps.projectPath);
- });
-
- it('has button that links to the docs', () => {
- expect(findDocsButton().exists()).toBe(true);
- expect(findDocsButton().attributes('href')).toBe(defaultProps.addDashboardDocumentationPath);
- });
-});
diff --git a/spec/frontend/monitoring/components/dashboard_actions_menu_spec.js b/spec/frontend/monitoring/components/dashboard_actions_menu_spec.js
deleted file mode 100644
index 4d290922707..00000000000
--- a/spec/frontend/monitoring/components/dashboard_actions_menu_spec.js
+++ /dev/null
@@ -1,421 +0,0 @@
-import { GlDropdownItem, GlModal } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import { nextTick } from 'vue';
-import CustomMetricsFormFields from '~/custom_metrics/components/custom_metrics_form_fields.vue';
-import { redirectTo } from '~/lib/utils/url_utility'; // eslint-disable-line import/no-deprecated
-import ActionsMenu from '~/monitoring/components/dashboard_actions_menu.vue';
-import { DASHBOARD_PAGE, PANEL_NEW_PAGE } from '~/monitoring/router/constants';
-import { createStore } from '~/monitoring/stores';
-import * as types from '~/monitoring/stores/mutation_types';
-import Tracking from '~/tracking';
-import { dashboardActionsMenuProps, dashboardGitResponse } from '../mock_data';
-import { setupAllDashboards, setupStoreWithData } from '../store_utils';
-
-jest.mock('~/lib/utils/url_utility', () => ({
- redirectTo: jest.fn(),
- queryToObject: jest.fn(),
-}));
-
-describe('Actions menu', () => {
- const ootbDashboards = [dashboardGitResponse[0], dashboardGitResponse[2]];
- const customDashboard = dashboardGitResponse[1];
-
- let store;
- let wrapper;
-
- const findAddMetricItem = () => wrapper.find('[data-testid="add-metric-item"]');
- const findAddPanelItemEnabled = () => wrapper.find('[data-testid="add-panel-item-enabled"]');
- const findAddPanelItemDisabled = () => wrapper.find('[data-testid="add-panel-item-disabled"]');
- const findAddMetricModal = () => wrapper.find('[data-testid="add-metric-modal"]');
- const findAddMetricModalSubmitButton = () =>
- wrapper.find('[data-testid="add-metric-modal-submit-button"]');
- const findStarDashboardItem = () => wrapper.find('[data-testid="star-dashboard-item"]');
- const findEditDashboardItemEnabled = () =>
- wrapper.find('[data-testid="edit-dashboard-item-enabled"]');
- const findEditDashboardItemDisabled = () =>
- wrapper.find('[data-testid="edit-dashboard-item-disabled"]');
- const findDuplicateDashboardItem = () => wrapper.find('[data-testid="duplicate-dashboard-item"]');
- const findDuplicateDashboardModal = () =>
- wrapper.find('[data-testid="duplicate-dashboard-modal"]');
- const findCreateDashboardItem = () => wrapper.find('[data-testid="create-dashboard-item"]');
- const findCreateDashboardModal = () => wrapper.find('[data-testid="create-dashboard-modal"]');
-
- const createShallowWrapper = (props = {}, options = {}) => {
- wrapper = shallowMount(ActionsMenu, {
- propsData: { ...dashboardActionsMenuProps, ...props },
- store,
- stubs: {
- GlModal,
- },
- ...options,
- });
- };
-
- beforeEach(() => {
- store = createStore();
- });
-
- describe('add metric item', () => {
- it('is rendered when custom metrics are available', async () => {
- createShallowWrapper();
-
- await nextTick();
- expect(findAddMetricItem().exists()).toBe(true);
- });
-
- it('is not rendered when custom metrics are not available', async () => {
- createShallowWrapper({
- addingMetricsAvailable: false,
- });
-
- await nextTick();
- expect(findAddMetricItem().exists()).toBe(false);
- });
-
- describe('when available', () => {
- beforeEach(() => {
- createShallowWrapper();
- });
-
- it('modal for custom metrics form is rendered', () => {
- expect(findAddMetricModal().exists()).toBe(true);
- expect(findAddMetricModal().props('modalId')).toBe('addMetric');
- });
-
- it('add metric modal submit button exists', () => {
- expect(findAddMetricModalSubmitButton().exists()).toBe(true);
- });
-
- it('renders custom metrics form fields', () => {
- expect(wrapper.findComponent(CustomMetricsFormFields).exists()).toBe(true);
- });
- });
-
- describe('when not available', () => {
- beforeEach(() => {
- createShallowWrapper({ addingMetricsAvailable: false });
- });
-
- it('modal for custom metrics form is not rendered', () => {
- expect(findAddMetricModal().exists()).toBe(false);
- });
- });
-
- describe('adding new metric from modal', () => {
- let origPage;
-
- beforeEach(() => {
- jest.spyOn(Tracking, 'event').mockReturnValue();
- createShallowWrapper();
-
- setupStoreWithData(store);
-
- origPage = document.body.dataset.page;
- document.body.dataset.page = 'projects:environments:metrics';
-
- return nextTick();
- });
-
- afterEach(() => {
- document.body.dataset.page = origPage;
- });
-
- it('is tracked', async () => {
- const submitButton = findAddMetricModalSubmitButton().vm;
-
- await nextTick();
- submitButton.$el.click();
- await nextTick();
- expect(Tracking.event).toHaveBeenCalledWith(document.body.dataset.page, 'click_button', {
- label: 'add_new_metric',
- property: 'modal',
- value: undefined,
- });
- });
- });
- });
-
- describe('add panel item', () => {
- const GlDropdownItemStub = {
- extends: GlDropdownItem,
- props: {
- to: [String, Object],
- },
- };
-
- let $route;
-
- beforeEach(() => {
- $route = { name: DASHBOARD_PAGE, params: { dashboard: 'my_dashboard.yml' } };
-
- createShallowWrapper(
- {
- isOotbDashboard: false,
- },
- {
- mocks: { $route },
- stubs: { GlDropdownItem: GlDropdownItemStub },
- },
- );
- });
-
- it('is disabled for ootb dashboards', async () => {
- createShallowWrapper({
- isOotbDashboard: true,
- });
-
- await nextTick();
- expect(findAddPanelItemDisabled().exists()).toBe(true);
- });
-
- it('is visible for custom dashboards', () => {
- expect(findAddPanelItemEnabled().exists()).toBe(true);
- });
-
- it('renders a link to the new panel page for custom dashboards', () => {
- expect(findAddPanelItemEnabled().props('to')).toEqual({
- name: PANEL_NEW_PAGE,
- params: {
- dashboard: 'my_dashboard.yml',
- },
- });
- });
- });
-
- describe('edit dashboard yml item', () => {
- beforeEach(() => {
- createShallowWrapper();
- });
-
- describe('when current dashboard is custom', () => {
- beforeEach(() => {
- setupAllDashboards(store, customDashboard.path);
- });
-
- it('enabled item is rendered and has falsy disabled attribute', () => {
- expect(findEditDashboardItemEnabled().exists()).toBe(true);
- expect(findEditDashboardItemEnabled().attributes('disabled')).toBe(undefined);
- });
-
- it('enabled item links to their edit path', () => {
- expect(findEditDashboardItemEnabled().attributes('href')).toBe(
- customDashboard.project_blob_path,
- );
- });
-
- it('disabled item is not rendered', () => {
- expect(findEditDashboardItemDisabled().exists()).toBe(false);
- });
- });
-
- describe.each(ootbDashboards)('when current dashboard is OOTB', (dashboard) => {
- beforeEach(() => {
- setupAllDashboards(store, dashboard.path);
- });
-
- it('disabled item is rendered and has disabled attribute set on it', () => {
- expect(findEditDashboardItemDisabled().exists()).toBe(true);
- expect(findEditDashboardItemDisabled().attributes('disabled')).toBe('');
- });
-
- it('enabled item is not rendered', () => {
- expect(findEditDashboardItemEnabled().exists()).toBe(false);
- });
- });
- });
-
- describe('duplicate dashboard item', () => {
- beforeEach(() => {
- createShallowWrapper();
- });
-
- describe.each(ootbDashboards)('when current dashboard is OOTB', (dashboard) => {
- beforeEach(() => {
- setupAllDashboards(store, dashboard.path);
- });
-
- it('is rendered', () => {
- expect(findDuplicateDashboardItem().exists()).toBe(true);
- });
-
- it('duplicate dashboard modal is rendered', () => {
- expect(findDuplicateDashboardModal().exists()).toBe(true);
- });
-
- it('clicking on item opens up the duplicate dashboard modal', async () => {
- const modalId = 'duplicateDashboard';
- const modalTrigger = findDuplicateDashboardItem();
- const rootEmit = jest.spyOn(wrapper.vm.$root, '$emit');
-
- modalTrigger.trigger('click');
-
- await nextTick();
- expect(rootEmit.mock.calls[0]).toContainEqual(modalId);
- });
- });
-
- describe('when current dashboard is custom', () => {
- beforeEach(() => {
- setupAllDashboards(store, customDashboard.path);
- });
-
- it('is not rendered', () => {
- expect(findDuplicateDashboardItem().exists()).toBe(false);
- });
-
- it('duplicate dashboard modal is not rendered', () => {
- expect(findDuplicateDashboardModal().exists()).toBe(false);
- });
- });
-
- describe('when no dashboard is set', () => {
- it('is not rendered', () => {
- expect(findDuplicateDashboardItem().exists()).toBe(false);
- });
-
- it('duplicate dashboard modal is not rendered', () => {
- expect(findDuplicateDashboardModal().exists()).toBe(false);
- });
- });
-
- describe('when a dashboard has been duplicated in the duplicate dashboard modal', () => {
- beforeEach(() => {
- store.state.monitoringDashboard.projectPath = 'root/sandbox';
-
- setupAllDashboards(store, dashboardGitResponse[0].path);
- });
-
- it('redirects to the newly created dashboard', async () => {
- const newDashboard = dashboardGitResponse[1];
-
- const newDashboardUrl = 'root/sandbox/-/metrics/dashboard.yml';
- findDuplicateDashboardModal().vm.$emit('dashboardDuplicated', newDashboard);
-
- await nextTick();
- expect(redirectTo).toHaveBeenCalled(); // eslint-disable-line import/no-deprecated
- expect(redirectTo).toHaveBeenCalledWith(newDashboardUrl); // eslint-disable-line import/no-deprecated
- });
- });
- });
-
- describe('star dashboard item', () => {
- beforeEach(() => {
- createShallowWrapper();
- setupAllDashboards(store);
-
- jest.spyOn(store, 'dispatch').mockResolvedValue();
- });
-
- it('is shown', () => {
- expect(findStarDashboardItem().exists()).toBe(true);
- });
-
- it('is not disabled', () => {
- expect(findStarDashboardItem().attributes('disabled')).toBeUndefined();
- });
-
- it('is disabled when starring is taking place', async () => {
- store.commit(`monitoringDashboard/${types.REQUEST_DASHBOARD_STARRING}`);
-
- await nextTick();
- expect(findStarDashboardItem().exists()).toBe(true);
- expect(findStarDashboardItem().attributes('disabled')).toBeDefined();
- });
-
- it('on click it dispatches a toggle star action', async () => {
- findStarDashboardItem().vm.$emit('click');
-
- await nextTick();
- expect(store.dispatch).toHaveBeenCalledWith(
- 'monitoringDashboard/toggleStarredValue',
- undefined,
- );
- });
-
- describe('when dashboard is not starred', () => {
- beforeEach(async () => {
- store.commit(`monitoringDashboard/${types.SET_INITIAL_STATE}`, {
- currentDashboard: dashboardGitResponse[0].path,
- });
- await nextTick();
- });
-
- it('item text shows "Star dashboard"', () => {
- expect(findStarDashboardItem().html()).toMatch(/Star dashboard/);
- });
- });
-
- describe('when dashboard is starred', () => {
- beforeEach(async () => {
- store.commit(`monitoringDashboard/${types.SET_INITIAL_STATE}`, {
- currentDashboard: dashboardGitResponse[1].path,
- });
- await nextTick();
- });
-
- it('item text shows "Unstar dashboard"', () => {
- expect(findStarDashboardItem().html()).toMatch(/Unstar dashboard/);
- });
- });
- });
-
- describe('create dashboard item', () => {
- beforeEach(() => {
- createShallowWrapper();
- });
-
- it('is rendered by default but it is disabled', () => {
- expect(findCreateDashboardItem().attributes('disabled')).toBeDefined();
- });
-
- describe('when project path is set', () => {
- const mockProjectPath = 'root/sandbox';
- const mockAddDashboardDocPath = '/doc/add-dashboard';
-
- beforeEach(() => {
- store.state.monitoringDashboard.projectPath = mockProjectPath;
- store.state.monitoringDashboard.addDashboardDocumentationPath = mockAddDashboardDocPath;
- });
-
- it('is not disabled', () => {
- expect(findCreateDashboardItem().attributes('disabled')).toBe(undefined);
- });
-
- it('renders a modal for creating a dashboard', () => {
- expect(findCreateDashboardModal().exists()).toBe(true);
- });
-
- it('clicking opens up the modal', async () => {
- const modalId = 'createDashboard';
- const modalTrigger = findCreateDashboardItem();
- const rootEmit = jest.spyOn(wrapper.vm.$root, '$emit');
-
- modalTrigger.trigger('click');
-
- await nextTick();
- expect(rootEmit.mock.calls[0]).toContainEqual(modalId);
- });
-
- it('modal gets passed correct props', () => {
- expect(findCreateDashboardModal().props('projectPath')).toBe(mockProjectPath);
- expect(findCreateDashboardModal().props('addDashboardDocumentationPath')).toBe(
- mockAddDashboardDocPath,
- );
- });
- });
-
- describe('when project path is not set', () => {
- beforeEach(() => {
- store.state.monitoringDashboard.projectPath = null;
- });
-
- it('is disabled', () => {
- expect(findCreateDashboardItem().attributes('disabled')).toBeDefined();
- });
-
- it('does not render a modal for creating a dashboard', () => {
- expect(findCreateDashboardModal().exists()).toBe(false);
- });
- });
- });
-});
diff --git a/spec/frontend/monitoring/components/dashboard_header_spec.js b/spec/frontend/monitoring/components/dashboard_header_spec.js
deleted file mode 100644
index 091e05ab271..00000000000
--- a/spec/frontend/monitoring/components/dashboard_header_spec.js
+++ /dev/null
@@ -1,395 +0,0 @@
-import { GlDropdownItem, GlSearchBoxByType, GlLoadingIcon, GlButton } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import { nextTick } from 'vue';
-import { redirectTo } from '~/lib/utils/url_utility'; // eslint-disable-line import/no-deprecated
-import ActionsMenu from '~/monitoring/components/dashboard_actions_menu.vue';
-import DashboardHeader from '~/monitoring/components/dashboard_header.vue';
-import DashboardsDropdown from '~/monitoring/components/dashboards_dropdown.vue';
-import RefreshButton from '~/monitoring/components/refresh_button.vue';
-import { createStore } from '~/monitoring/stores';
-import * as types from '~/monitoring/stores/mutation_types';
-import DateTimePicker from '~/vue_shared/components/date_time_picker/date_time_picker.vue';
-import { environmentData, dashboardGitResponse, dashboardHeaderProps } from '../mock_data';
-import { setupAllDashboards, setupStoreWithDashboard, setupStoreWithData } from '../store_utils';
-
-const mockProjectPath = 'https://path/to/project';
-
-jest.mock('~/lib/utils/url_utility', () => ({
- redirectTo: jest.fn(),
- queryToObject: jest.fn(),
- mergeUrlParams: jest.requireActual('~/lib/utils/url_utility').mergeUrlParams,
-}));
-
-describe('Dashboard header', () => {
- let store;
- let wrapper;
-
- const findDashboardDropdown = () => wrapper.findComponent(DashboardsDropdown);
-
- const findEnvsDropdown = () => wrapper.findComponent({ ref: 'monitorEnvironmentsDropdown' });
- const findEnvsDropdownItems = () => findEnvsDropdown().findAllComponents(GlDropdownItem);
- const findEnvsDropdownSearch = () => findEnvsDropdown().findComponent(GlSearchBoxByType);
- const findEnvsDropdownSearchMsg = () =>
- wrapper.findComponent({ ref: 'monitorEnvironmentsDropdownMsg' });
- const findEnvsDropdownLoadingIcon = () => findEnvsDropdown().findComponent(GlLoadingIcon);
-
- const findDateTimePicker = () => wrapper.findComponent(DateTimePicker);
- const findRefreshButton = () => wrapper.findComponent(RefreshButton);
-
- const findActionsMenu = () => wrapper.findComponent(ActionsMenu);
-
- const setSearchTerm = (searchTerm) => {
- store.commit(`monitoringDashboard/${types.SET_ENVIRONMENTS_FILTER}`, searchTerm);
- };
-
- const createShallowWrapper = (props = {}, options = {}) => {
- wrapper = shallowMount(DashboardHeader, {
- propsData: { ...dashboardHeaderProps, ...props },
- store,
- ...options,
- });
- };
-
- beforeEach(() => {
- store = createStore();
- });
-
- describe('dashboards dropdown', () => {
- beforeEach(() => {
- store.commit(`monitoringDashboard/${types.SET_INITIAL_STATE}`, {
- projectPath: mockProjectPath,
- });
-
- createShallowWrapper();
- });
-
- it('shows the dashboard dropdown', () => {
- expect(findDashboardDropdown().exists()).toBe(true);
- });
-
- it('when an out of the box dashboard is selected, encodes dashboard path', () => {
- findDashboardDropdown().vm.$emit('selectDashboard', {
- path: '.gitlab/dashboards/dashboard&copy.yml',
- out_of_the_box_dashboard: true,
- display_name: 'A display name',
- });
-
- // eslint-disable-next-line import/no-deprecated
- expect(redirectTo).toHaveBeenCalledWith(
- `${mockProjectPath}/-/metrics/.gitlab%2Fdashboards%2Fdashboard%26copy.yml`,
- );
- });
-
- it('when a custom dashboard is selected, encodes dashboard display name', () => {
- findDashboardDropdown().vm.$emit('selectDashboard', {
- path: '.gitlab/dashboards/file&path.yml',
- display_name: 'dashboard&copy.yml',
- });
-
- // eslint-disable-next-line import/no-deprecated
- expect(redirectTo).toHaveBeenCalledWith(`${mockProjectPath}/-/metrics/dashboard%26copy.yml`);
- });
- });
-
- describe('environments dropdown', () => {
- beforeEach(() => {
- createShallowWrapper();
- });
-
- it('shows the environments dropdown', () => {
- expect(findEnvsDropdown().exists()).toBe(true);
- });
-
- it('renders a search input', () => {
- expect(findEnvsDropdownSearch().exists()).toBe(true);
- });
-
- describe('when environments data is not loaded', () => {
- beforeEach(async () => {
- setupStoreWithDashboard(store);
- await nextTick();
- });
-
- it('there are no environments listed', () => {
- expect(findEnvsDropdownItems()).toHaveLength(0);
- });
- });
-
- describe('when environments data is loaded', () => {
- const currentDashboard = dashboardGitResponse[0].path;
- const currentEnvironmentName = environmentData[0].name;
-
- beforeEach(async () => {
- setupStoreWithData(store);
- store.state.monitoringDashboard.projectPath = mockProjectPath;
- store.state.monitoringDashboard.currentDashboard = currentDashboard;
- store.state.monitoringDashboard.currentEnvironmentName = currentEnvironmentName;
-
- await nextTick();
- });
-
- it('renders dropdown items with the environment name', () => {
- const path = `${mockProjectPath}/-/metrics/${encodeURIComponent(currentDashboard)}`;
-
- findEnvsDropdownItems().wrappers.forEach((itemWrapper, index) => {
- const { name, id } = environmentData[index];
- const idParam = encodeURIComponent(id);
-
- expect(itemWrapper.text()).toBe(name);
- expect(itemWrapper.attributes('href')).toBe(`${path}?environment=${idParam}`);
- });
- });
-
- it('environments dropdown items can be checked', () => {
- const items = findEnvsDropdownItems();
- const checkItems = findEnvsDropdownItems().filter((item) => item.props('isCheckItem'));
-
- expect(items).toHaveLength(checkItems.length);
- });
-
- it('checks the currently selected environment', () => {
- const selectedItems = findEnvsDropdownItems().filter((item) => item.props('isChecked'));
-
- expect(selectedItems).toHaveLength(1);
- expect(selectedItems.at(0).text()).toBe(currentEnvironmentName);
- });
-
- it('filters rendered dropdown items', async () => {
- const searchTerm = 'production';
- const resultEnvs = environmentData.filter(({ name }) => name.indexOf(searchTerm) !== -1);
- setSearchTerm(searchTerm);
-
- await nextTick();
- expect(findEnvsDropdownItems()).toHaveLength(resultEnvs.length);
- });
-
- it('does not filter dropdown items if search term is empty string', async () => {
- const searchTerm = '';
- setSearchTerm(searchTerm);
-
- await nextTick();
- expect(findEnvsDropdownItems()).toHaveLength(environmentData.length);
- });
-
- it("shows error message if search term doesn't match", async () => {
- const searchTerm = 'does-not-exist';
- setSearchTerm(searchTerm);
-
- await nextTick();
- expect(findEnvsDropdownSearchMsg().isVisible()).toBe(true);
- });
-
- it('shows loading element when environments fetch is still loading', async () => {
- store.commit(`monitoringDashboard/${types.REQUEST_ENVIRONMENTS_DATA}`);
-
- await nextTick();
- expect(findEnvsDropdownLoadingIcon().exists()).toBe(true);
- await store.commit(
- `monitoringDashboard/${types.RECEIVE_ENVIRONMENTS_DATA_SUCCESS}`,
- environmentData,
- );
- expect(findEnvsDropdownLoadingIcon().exists()).toBe(false);
- });
- });
- });
-
- describe('date time picker', () => {
- beforeEach(() => {
- createShallowWrapper();
- });
-
- it('is rendered', () => {
- expect(findDateTimePicker().exists()).toBe(true);
- });
-
- describe('timezone setting', () => {
- const setupWithTimezone = (value) => {
- store = createStore({ dashboardTimezone: value });
- createShallowWrapper();
- };
-
- describe('local timezone is enabled by default', () => {
- it('shows the data time picker in local timezone', () => {
- expect(findDateTimePicker().props('utc')).toBe(false);
- });
- });
-
- describe('when LOCAL timezone is enabled', () => {
- beforeEach(() => {
- setupWithTimezone('LOCAL');
- });
-
- it('shows the data time picker in local timezone', () => {
- expect(findDateTimePicker().props('utc')).toBe(false);
- });
- });
-
- describe('when UTC timezone is enabled', () => {
- beforeEach(() => {
- setupWithTimezone('UTC');
- });
-
- it('shows the data time picker in UTC format', () => {
- expect(findDateTimePicker().props('utc')).toBe(true);
- });
- });
- });
- });
-
- describe('refresh button', () => {
- beforeEach(() => {
- createShallowWrapper();
- });
-
- it('is rendered', () => {
- expect(findRefreshButton().exists()).toBe(true);
- });
- });
-
- describe('external dashboard link', () => {
- beforeEach(async () => {
- store.state.monitoringDashboard.externalDashboardUrl = '/mockUrl';
- createShallowWrapper();
-
- await nextTick();
- });
-
- it('shows the link', () => {
- const externalDashboardButton = wrapper.find('.js-external-dashboard-link');
-
- expect(externalDashboardButton.exists()).toBe(true);
- expect(externalDashboardButton.is(GlButton)).toBe(true);
- expect(externalDashboardButton.text()).toContain('View full dashboard');
- });
- });
-
- describe('actions menu', () => {
- const ootbDashboards = [dashboardGitResponse[0].path];
- const customDashboards = [dashboardGitResponse[1].path];
-
- it('is rendered', () => {
- createShallowWrapper();
-
- expect(findActionsMenu().exists()).toBe(true);
- });
-
- describe('adding metrics prop', () => {
- it.each(ootbDashboards)(
- 'gets passed true if current dashboard is OOTB',
- async (dashboardPath) => {
- createShallowWrapper({ customMetricsAvailable: true });
-
- store.state.monitoringDashboard.emptyState = false;
- setupAllDashboards(store, dashboardPath);
-
- await nextTick();
- expect(findActionsMenu().props('addingMetricsAvailable')).toBe(true);
- },
- );
-
- it.each(customDashboards)(
- 'gets passed false if current dashboard is custom',
- async (dashboardPath) => {
- createShallowWrapper({ customMetricsAvailable: true });
-
- store.state.monitoringDashboard.emptyState = false;
- setupAllDashboards(store, dashboardPath);
-
- await nextTick();
- expect(findActionsMenu().props('addingMetricsAvailable')).toBe(false);
- },
- );
-
- it('gets passed false if empty state is shown', async () => {
- createShallowWrapper({ customMetricsAvailable: true });
-
- store.state.monitoringDashboard.emptyState = true;
- setupAllDashboards(store, ootbDashboards[0]);
-
- await nextTick();
- expect(findActionsMenu().props('addingMetricsAvailable')).toBe(false);
- });
-
- it('gets passed false if custom metrics are not available', async () => {
- createShallowWrapper({ customMetricsAvailable: false });
-
- store.state.monitoringDashboard.emptyState = false;
- setupAllDashboards(store, ootbDashboards[0]);
-
- await nextTick();
- expect(findActionsMenu().props('addingMetricsAvailable')).toBe(false);
- });
- });
-
- it('custom metrics path gets passed', async () => {
- const path = 'https://path/to/customMetrics';
-
- createShallowWrapper({ customMetricsPath: path });
-
- await nextTick();
- expect(findActionsMenu().props('customMetricsPath')).toBe(path);
- });
-
- it('validate query path gets passed', async () => {
- const path = 'https://path/to/validateQuery';
-
- createShallowWrapper({ validateQueryPath: path });
-
- await nextTick();
- expect(findActionsMenu().props('validateQueryPath')).toBe(path);
- });
-
- it('default branch gets passed', async () => {
- const branch = 'branchName';
-
- createShallowWrapper({ defaultBranch: branch });
-
- await nextTick();
- expect(findActionsMenu().props('defaultBranch')).toBe(branch);
- });
- });
-
- describe('metrics settings button', () => {
- const findSettingsButton = () => wrapper.find('[data-testid="metrics-settings-button"]');
- const url = 'https://path/to/project/settings';
-
- beforeEach(() => {
- createShallowWrapper();
-
- store.state.monitoringDashboard.canAccessOperationsSettings = false;
- store.state.monitoringDashboard.operationsSettingsPath = '';
- });
-
- it('is rendered when the user can access the project settings and path to settings is available', async () => {
- store.state.monitoringDashboard.canAccessOperationsSettings = true;
- store.state.monitoringDashboard.operationsSettingsPath = url;
-
- await nextTick();
- expect(findSettingsButton().exists()).toBe(true);
- });
-
- it('is not rendered when the user can not access the project settings', async () => {
- store.state.monitoringDashboard.canAccessOperationsSettings = false;
- store.state.monitoringDashboard.operationsSettingsPath = url;
-
- await nextTick();
- expect(findSettingsButton().exists()).toBe(false);
- });
-
- it('is not rendered when the path to settings is unavailable', async () => {
- store.state.monitoringDashboard.canAccessOperationsSettings = false;
- store.state.monitoringDashboard.operationsSettingsPath = '';
-
- await nextTick();
- expect(findSettingsButton().exists()).toBe(false);
- });
-
- it('leads to the project settings page', async () => {
- store.state.monitoringDashboard.canAccessOperationsSettings = true;
- store.state.monitoringDashboard.operationsSettingsPath = url;
-
- await nextTick();
- expect(findSettingsButton().attributes('href')).toBe(url);
- });
- });
-});
diff --git a/spec/frontend/monitoring/components/dashboard_panel_builder_spec.js b/spec/frontend/monitoring/components/dashboard_panel_builder_spec.js
deleted file mode 100644
index 1cfd132b123..00000000000
--- a/spec/frontend/monitoring/components/dashboard_panel_builder_spec.js
+++ /dev/null
@@ -1,226 +0,0 @@
-import { GlCard, GlForm, GlFormTextarea, GlAlert } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import { nextTick } from 'vue';
-import DashboardPanel from '~/monitoring/components/dashboard_panel.vue';
-import DashboardPanelBuilder from '~/monitoring/components/dashboard_panel_builder.vue';
-import { createStore } from '~/monitoring/stores';
-import * as types from '~/monitoring/stores/mutation_types';
-import DateTimePicker from '~/vue_shared/components/date_time_picker/date_time_picker.vue';
-import { metricsDashboardResponse } from '../fixture_data';
-import { mockTimeRange } from '../mock_data';
-
-const mockPanel = metricsDashboardResponse.dashboard.panel_groups[0].panels[0];
-
-describe('dashboard invalid url parameters', () => {
- let store;
- let wrapper;
- let mockShowToast;
-
- const createComponent = (props = {}, options = {}) => {
- wrapper = shallowMount(DashboardPanelBuilder, {
- propsData: { ...props },
- store,
- stubs: {
- GlCard,
- },
- mocks: {
- $toast: {
- show: mockShowToast,
- },
- },
- options,
- });
- };
-
- const findForm = () => wrapper.findComponent(GlForm);
- const findTxtArea = () => findForm().findComponent(GlFormTextarea);
- const findSubmitBtn = () => findForm().find('[type="submit"]');
- const findClipboardCopyBtn = () => wrapper.findComponent({ ref: 'clipboardCopyBtn' });
- const findViewDocumentationBtn = () => wrapper.findComponent({ ref: 'viewDocumentationBtn' });
- const findOpenRepositoryBtn = () => wrapper.findComponent({ ref: 'openRepositoryBtn' });
- const findPanel = () => wrapper.findComponent(DashboardPanel);
- const findTimeRangePicker = () => wrapper.findComponent(DateTimePicker);
- const findRefreshButton = () => wrapper.find('[data-testid="previewRefreshButton"]');
-
- beforeEach(() => {
- mockShowToast = jest.fn();
- store = createStore();
- createComponent();
- jest.spyOn(store, 'dispatch').mockResolvedValue();
- });
-
- it('is mounted', () => {
- expect(wrapper.exists()).toBe(true);
- });
-
- it('displays an empty dashboard panel', () => {
- expect(findPanel().exists()).toBe(true);
- expect(findPanel().props('graphData')).toBe(null);
- });
-
- it('does not fetch initial data by default', () => {
- expect(store.dispatch).not.toHaveBeenCalled();
- });
-
- describe('yml form', () => {
- it('form exists and can be submitted', () => {
- expect(findForm().exists()).toBe(true);
- expect(findSubmitBtn().exists()).toBe(true);
- expect(findSubmitBtn().props('disabled')).toBe(false);
- });
-
- it('form has a text area with a default value', () => {
- expect(findTxtArea().exists()).toBe(true);
-
- const value = findTxtArea().attributes('value');
-
- // Panel definition should contain a title and a type
- expect(value).toContain('title:');
- expect(value).toContain('type:');
- });
-
- it('"copy to clipboard" button works', () => {
- findClipboardCopyBtn().vm.$emit('click');
- const clipboardText = findClipboardCopyBtn().attributes('data-clipboard-text');
-
- expect(clipboardText).toContain('title:');
- expect(clipboardText).toContain('type:');
-
- expect(mockShowToast).toHaveBeenCalledTimes(1);
- });
-
- it('on submit fetches a panel preview', async () => {
- findForm().vm.$emit('submit', new Event('submit'));
-
- await nextTick();
- expect(store.dispatch).toHaveBeenCalledWith(
- 'monitoringDashboard/fetchPanelPreview',
- expect.stringContaining('title:'),
- );
- });
-
- describe('when form is submitted', () => {
- beforeEach(async () => {
- store.commit(`monitoringDashboard/${types.REQUEST_PANEL_PREVIEW}`, 'mock yml content');
- await nextTick();
- });
-
- it('submit button is disabled', () => {
- expect(findSubmitBtn().props('disabled')).toBe(true);
- });
- });
- });
-
- describe('time range picker', () => {
- it('is visible by default', () => {
- expect(findTimeRangePicker().exists()).toBe(true);
- });
-
- it('when changed does not trigger data fetch unless preview panel button is clicked', async () => {
- // mimic initial state where SET_PANEL_PREVIEW_IS_SHOWN is set to false
- store.commit(`monitoringDashboard/${types.SET_PANEL_PREVIEW_IS_SHOWN}`, false);
-
- await nextTick();
- expect(store.dispatch).not.toHaveBeenCalled();
- });
-
- it('when changed triggers data fetch if preview panel button is clicked', async () => {
- findForm().vm.$emit('submit', new Event('submit'));
-
- store.commit(`monitoringDashboard/${types.SET_PANEL_PREVIEW_TIME_RANGE}`, mockTimeRange);
-
- await nextTick();
- expect(store.dispatch).toHaveBeenCalled();
- });
- });
-
- describe('refresh', () => {
- it('is visible by default', () => {
- expect(findRefreshButton().exists()).toBe(true);
- });
-
- it('when clicked does not trigger data fetch unless preview panel button is clicked', async () => {
- // mimic initial state where SET_PANEL_PREVIEW_IS_SHOWN is set to false
- store.commit(`monitoringDashboard/${types.SET_PANEL_PREVIEW_IS_SHOWN}`, false);
-
- await nextTick();
- expect(store.dispatch).not.toHaveBeenCalled();
- });
-
- it('when clicked triggers data fetch if preview panel button is clicked', async () => {
- // mimic state where preview is visible. SET_PANEL_PREVIEW_IS_SHOWN is set to true
- store.commit(`monitoringDashboard/${types.SET_PANEL_PREVIEW_IS_SHOWN}`, true);
-
- findRefreshButton().vm.$emit('click');
-
- await nextTick();
- expect(store.dispatch).toHaveBeenCalledWith(
- 'monitoringDashboard/fetchPanelPreviewMetrics',
- undefined,
- );
- });
- });
-
- describe('instructions card', () => {
- const mockDocsPath = '/docs-path';
- const mockProjectPath = '/project-path';
-
- beforeEach(() => {
- store.state.monitoringDashboard.addDashboardDocumentationPath = mockDocsPath;
- store.state.monitoringDashboard.projectPath = mockProjectPath;
-
- createComponent();
- });
-
- it('displays next actions for the user', () => {
- expect(findViewDocumentationBtn().exists()).toBe(true);
- expect(findViewDocumentationBtn().attributes('href')).toBe(mockDocsPath);
-
- expect(findOpenRepositoryBtn().exists()).toBe(true);
- expect(findOpenRepositoryBtn().attributes('href')).toBe(mockProjectPath);
- });
- });
-
- describe('when there is an error', () => {
- const mockError = 'an error occurred!';
-
- beforeEach(async () => {
- store.commit(`monitoringDashboard/${types.RECEIVE_PANEL_PREVIEW_FAILURE}`, mockError);
- await nextTick();
- });
-
- it('displays an alert', () => {
- expect(wrapper.findComponent(GlAlert).exists()).toBe(true);
- expect(wrapper.findComponent(GlAlert).text()).toBe(mockError);
- });
-
- it('displays an empty dashboard panel', () => {
- expect(findPanel().props('graphData')).toBe(null);
- });
-
- it('changing time range should not refetch data', async () => {
- store.commit(`monitoringDashboard/${types.SET_PANEL_PREVIEW_TIME_RANGE}`, mockTimeRange);
-
- await nextTick();
- expect(store.dispatch).not.toHaveBeenCalled();
- });
- });
-
- describe('when panel data is available', () => {
- beforeEach(async () => {
- store.commit(`monitoringDashboard/${types.RECEIVE_PANEL_PREVIEW_SUCCESS}`, mockPanel);
- await nextTick();
- });
-
- it('displays no alert', () => {
- expect(wrapper.findComponent(GlAlert).exists()).toBe(false);
- });
-
- it('displays panel with data', () => {
- const { title, type } = wrapper.findComponent(DashboardPanel).props('graphData');
-
- expect(title).toBe(mockPanel.title);
- expect(type).toBe(mockPanel.type);
- });
- });
-});
diff --git a/spec/frontend/monitoring/components/dashboard_panel_spec.js b/spec/frontend/monitoring/components/dashboard_panel_spec.js
deleted file mode 100644
index 491649e5b96..00000000000
--- a/spec/frontend/monitoring/components/dashboard_panel_spec.js
+++ /dev/null
@@ -1,582 +0,0 @@
-import { GlDropdownItem } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import AxiosMockAdapter from 'axios-mock-adapter';
-import Vuex from 'vuex';
-import { nextTick } from 'vue';
-import axios from '~/lib/utils/axios_utils';
-
-import MonitorAnomalyChart from '~/monitoring/components/charts/anomaly.vue';
-import MonitorBarChart from '~/monitoring/components/charts/bar.vue';
-import MonitorColumnChart from '~/monitoring/components/charts/column.vue';
-import MonitorEmptyChart from '~/monitoring/components/charts/empty_chart.vue';
-import MonitorHeatmapChart from '~/monitoring/components/charts/heatmap.vue';
-import MonitorSingleStatChart from '~/monitoring/components/charts/single_stat.vue';
-import MonitorStackedColumnChart from '~/monitoring/components/charts/stacked_column.vue';
-import MonitorTimeSeriesChart from '~/monitoring/components/charts/time_series.vue';
-import DashboardPanel from '~/monitoring/components/dashboard_panel.vue';
-import { panelTypes } from '~/monitoring/constants';
-
-import { createStore, monitoringDashboard } from '~/monitoring/stores';
-import { createStore as createEmbedGroupStore } from '~/monitoring/stores/embed_group';
-import { dashboardProps, graphData, graphDataEmpty } from '../fixture_data';
-import {
- anomalyGraphData,
- singleStatGraphData,
- heatmapGraphData,
- barGraphData,
-} from '../graph_data';
-import { mockNamespace, mockNamespacedData, mockTimeRange } from '../mock_data';
-
-const mocks = {
- $toast: {
- show: jest.fn(),
- },
-};
-
-describe('Dashboard Panel', () => {
- let axiosMock;
- let store;
- let state;
- let wrapper;
-
- const exampleText = 'example_text';
-
- const findCopyLink = () => wrapper.findComponent({ ref: 'copyChartLink' });
- const findTimeChart = () => wrapper.findComponent({ ref: 'timeSeriesChart' });
- const findTitle = () => wrapper.findComponent({ ref: 'graphTitle' });
- const findCtxMenu = () => wrapper.findComponent({ ref: 'contextualMenu' });
- const findMenuItems = () => wrapper.findAllComponents(GlDropdownItem);
- const findMenuItemByText = (text) => findMenuItems().filter((i) => i.text() === text);
-
- const createWrapper = (props, { mountFn = shallowMount, ...options } = {}) => {
- wrapper = mountFn(DashboardPanel, {
- propsData: {
- graphData,
- settingsPath: dashboardProps.settingsPath,
- ...props,
- },
- store,
- mocks,
- ...options,
- });
- };
-
- const mockGetterReturnValue = (getter, value) => {
- jest.spyOn(monitoringDashboard.getters, getter).mockReturnValue(value);
- store = new Vuex.Store({
- modules: {
- monitoringDashboard,
- },
- });
- };
-
- beforeEach(() => {
- store = createStore();
- state = store.state.monitoringDashboard;
-
- axiosMock = new AxiosMockAdapter(axios);
-
- jest.spyOn(URL, 'createObjectURL');
- });
-
- afterEach(() => {
- axiosMock.reset();
- });
-
- describe('Renders slots', () => {
- it('renders "topLeft" slot', () => {
- createWrapper(
- {},
- {
- slots: {
- 'top-left': `<div class="top-left-content">OK</div>`,
- },
- },
- );
-
- expect(wrapper.find('.top-left-content').exists()).toBe(true);
- expect(wrapper.find('.top-left-content').text()).toBe('OK');
- });
- });
-
- describe('When no graphData is available', () => {
- beforeEach(() => {
- createWrapper({
- graphData: graphDataEmpty,
- });
- });
-
- it('renders the chart title', () => {
- expect(findTitle().text()).toBe(graphDataEmpty.title);
- });
-
- it('renders no download csv link', () => {
- expect(wrapper.findComponent({ ref: 'downloadCsvLink' }).exists()).toBe(false);
- });
-
- it('does not contain graph widgets', () => {
- expect(findCtxMenu().exists()).toBe(false);
- });
-
- it('The Empty Chart component is rendered and is a Vue instance', () => {
- expect(wrapper.findComponent(MonitorEmptyChart).exists()).toBe(true);
- });
- });
-
- describe('When graphData is null', () => {
- beforeEach(() => {
- createWrapper({
- graphData: null,
- });
- });
-
- it('renders no chart title', () => {
- expect(findTitle().text()).toBe('');
- });
-
- it('renders no download csv link', () => {
- expect(wrapper.findComponent({ ref: 'downloadCsvLink' }).exists()).toBe(false);
- });
-
- it('does not contain graph widgets', () => {
- expect(findCtxMenu().exists()).toBe(false);
- });
-
- it('The Empty Chart component is rendered and is a Vue instance', () => {
- expect(wrapper.findComponent(MonitorEmptyChart).exists()).toBe(true);
- });
- });
-
- describe('When graphData is available', () => {
- beforeEach(() => {
- createWrapper();
- });
-
- it('renders the chart title', () => {
- expect(findTitle().text()).toBe(graphData.title);
- });
-
- it('contains graph widgets', () => {
- expect(findCtxMenu().exists()).toBe(true);
- expect(wrapper.findComponent({ ref: 'downloadCsvLink' }).exists()).toBe(true);
- });
-
- it('sets no clipboard copy link on dropdown by default', () => {
- expect(findCopyLink().exists()).toBe(false);
- });
-
- it('should emit `timerange` event when a zooming in/out in a chart occcurs', async () => {
- const timeRange = {
- start: '2020-01-01T00:00:00.000Z',
- end: '2020-01-01T01:00:00.000Z',
- };
-
- jest.spyOn(wrapper.vm, '$emit');
-
- findTimeChart().vm.$emit('datazoom', timeRange);
-
- await nextTick();
- expect(wrapper.vm.$emit).toHaveBeenCalledWith('timerangezoom', timeRange);
- });
-
- it('includes a default group id', () => {
- expect(wrapper.vm.groupId).toBe('dashboard-panel');
- });
-
- describe('Supports different panel types', () => {
- const dataWithType = (type) => {
- return {
- ...graphData,
- type,
- };
- };
-
- it('empty chart is rendered for empty results', () => {
- createWrapper({ graphData: graphDataEmpty });
- expect(wrapper.findComponent(MonitorEmptyChart).exists()).toBe(true);
- });
-
- it('area chart is rendered by default', () => {
- createWrapper();
- expect(wrapper.findComponent(MonitorTimeSeriesChart).exists()).toBe(true);
- });
-
- describe.each`
- data | component | hasCtxMenu
- ${dataWithType(panelTypes.AREA_CHART)} | ${MonitorTimeSeriesChart} | ${true}
- ${dataWithType(panelTypes.LINE_CHART)} | ${MonitorTimeSeriesChart} | ${true}
- ${singleStatGraphData()} | ${MonitorSingleStatChart} | ${true}
- ${anomalyGraphData()} | ${MonitorAnomalyChart} | ${false}
- ${dataWithType(panelTypes.COLUMN)} | ${MonitorColumnChart} | ${false}
- ${dataWithType(panelTypes.STACKED_COLUMN)} | ${MonitorStackedColumnChart} | ${false}
- ${heatmapGraphData()} | ${MonitorHeatmapChart} | ${false}
- ${barGraphData()} | ${MonitorBarChart} | ${false}
- `('when $data.type data is provided', ({ data, component, hasCtxMenu }) => {
- const attrs = { attr1: 'attr1Value', attr2: 'attr2Value' };
-
- beforeEach(() => {
- createWrapper({ graphData: data }, { attrs });
- });
-
- it(`renders the chart component and binds attributes`, () => {
- expect(wrapper.findComponent(component).exists()).toBe(true);
- expect(wrapper.findComponent(component).attributes()).toMatchObject(attrs);
- });
-
- it(`contextual menu is ${hasCtxMenu ? '' : 'not '}shown`, () => {
- expect(findCtxMenu().exists()).toBe(hasCtxMenu);
- });
- });
- });
-
- describe('computed', () => {
- describe('fixedCurrentTimeRange', () => {
- it('returns fixed time for valid time range', async () => {
- state.timeRange = mockTimeRange;
- await nextTick();
- expect(findTimeChart().props('timeRange')).toEqual(
- expect.objectContaining({
- start: expect.any(String),
- end: expect.any(String),
- }),
- );
- });
-
- it.each`
- input | output
- ${''} | ${{}}
- ${undefined} | ${{}}
- ${null} | ${{}}
- ${'2020-12-03'} | ${{}}
- `('returns $output for invalid input like $input', async ({ input, output }) => {
- state.timeRange = input;
- await nextTick();
- expect(findTimeChart().props('timeRange')).toEqual(output);
- });
- });
- });
- });
-
- describe('Edit custom metric dropdown item', () => {
- const findEditCustomMetricLink = () => wrapper.findComponent({ ref: 'editMetricLink' });
- const mockEditPath = '/root/kubernetes-gke-project/prometheus/metrics/23/edit';
-
- beforeEach(async () => {
- createWrapper();
- await nextTick();
- });
-
- it('is not present if the panel is not a custom metric', () => {
- expect(findEditCustomMetricLink().exists()).toBe(false);
- });
-
- it('is present when the panel contains an edit_path property', async () => {
- wrapper.setProps({
- graphData: {
- ...graphData,
- metrics: [
- {
- ...graphData.metrics[0],
- edit_path: mockEditPath,
- },
- ],
- },
- });
-
- await nextTick();
- expect(findEditCustomMetricLink().exists()).toBe(true);
- expect(findEditCustomMetricLink().text()).toBe('Edit metric');
- expect(findEditCustomMetricLink().attributes('href')).toBe(mockEditPath);
- });
-
- it('shows an "Edit metrics" link pointing to settingsPath for a panel with multiple metrics', async () => {
- wrapper.setProps({
- graphData: {
- ...graphData,
- metrics: [
- {
- ...graphData.metrics[0],
- edit_path: '/root/kubernetes-gke-project/prometheus/metrics/23/edit',
- },
- {
- ...graphData.metrics[0],
- edit_path: '/root/kubernetes-gke-project/prometheus/metrics/23/edit',
- },
- ],
- },
- });
-
- await nextTick();
- expect(findEditCustomMetricLink().text()).toBe('Edit metrics');
- expect(findEditCustomMetricLink().attributes('href')).toBe(dashboardProps.settingsPath);
- });
- });
-
- describe('when clipboard data is available', () => {
- const clipboardText = 'A value to copy.';
-
- beforeEach(() => {
- createWrapper({
- clipboardText,
- });
- });
-
- it('sets clipboard text on the dropdown', () => {
- expect(findCopyLink().exists()).toBe(true);
- expect(findCopyLink().element.dataset.clipboardText).toBe(clipboardText);
- });
-
- it('adds a copy button to the dropdown', () => {
- expect(findCopyLink().text()).toContain('Copy link to chart');
- });
-
- it('opens a toast on click', () => {
- findCopyLink().vm.$emit('click');
-
- expect(wrapper.vm.$toast.show).toHaveBeenCalled();
- });
- });
-
- describe('when clipboard data is not available', () => {
- it('there is no "copy to clipboard" link for a null value', () => {
- createWrapper({ clipboardText: null });
- expect(findCopyLink().exists()).toBe(false);
- });
-
- it('there is no "copy to clipboard" link for an empty value', () => {
- createWrapper({ clipboardText: '' });
- expect(findCopyLink().exists()).toBe(false);
- });
- });
-
- describe('when downloading metrics data as CSV', () => {
- beforeEach(async () => {
- wrapper = shallowMount(DashboardPanel, {
- propsData: {
- clipboardText: exampleText,
- settingsPath: dashboardProps.settingsPath,
- graphData: {
- y_label: 'metric',
- ...graphData,
- },
- },
- store,
- });
- await nextTick();
- });
-
- describe('csvText', () => {
- it('converts metrics data from json to csv', () => {
- const header = `timestamp,"${graphData.y_label} > ${graphData.metrics[0].label}"`;
- const data = graphData.metrics[0].result[0].values;
- const firstRow = `${data[0][0]},${data[0][1]}`;
- const secondRow = `${data[1][0]},${data[1][1]}`;
-
- expect(wrapper.vm.csvText).toMatch(`${header}\r\n${firstRow}\r\n${secondRow}\r\n`);
- });
- });
-
- describe('downloadCsv', () => {
- it('produces a link with a Blob', () => {
- expect(global.URL.createObjectURL).toHaveBeenLastCalledWith(expect.any(Blob));
- expect(global.URL.createObjectURL).toHaveBeenLastCalledWith(
- expect.objectContaining({
- size: wrapper.vm.csvText.length,
- type: 'text/plain',
- }),
- );
- });
- });
- });
-
- describe('when using dynamic modules', () => {
- const { mockDeploymentData, mockProjectPath } = mockNamespacedData;
-
- beforeEach(() => {
- store = createEmbedGroupStore();
- store.registerModule(mockNamespace, monitoringDashboard);
- store.state.embedGroup.modules.push(mockNamespace);
-
- createWrapper({ namespace: mockNamespace });
- });
-
- it('handles namespaced deployment data state', async () => {
- store.state[mockNamespace].deploymentData = mockDeploymentData;
-
- await nextTick();
- expect(findTimeChart().props().deploymentData).toEqual(mockDeploymentData);
- });
-
- it('handles namespaced project path state', async () => {
- store.state[mockNamespace].projectPath = mockProjectPath;
-
- await nextTick();
- expect(findTimeChart().props().projectPath).toBe(mockProjectPath);
- });
-
- it('renders a time series chart with no errors', () => {
- expect(wrapper.findComponent(MonitorTimeSeriesChart).exists()).toBe(true);
- });
- });
-
- describe('panel timezone', () => {
- it('displays a time chart in local timezone', () => {
- createWrapper();
- expect(findTimeChart().props('timezone')).toBe('LOCAL');
- });
-
- it('displays a heatmap in local timezone', () => {
- createWrapper({ graphData: heatmapGraphData() });
- expect(wrapper.findComponent(MonitorHeatmapChart).props('timezone')).toBe('LOCAL');
- });
-
- describe('when timezone is set to UTC', () => {
- beforeEach(() => {
- store = createStore({ dashboardTimezone: 'UTC' });
- });
-
- it('displays a time chart with UTC', () => {
- createWrapper();
- expect(findTimeChart().props('timezone')).toBe('UTC');
- });
-
- it('displays a heatmap with UTC', () => {
- createWrapper({ graphData: heatmapGraphData() });
- expect(wrapper.findComponent(MonitorHeatmapChart).props('timezone')).toBe('UTC');
- });
- });
- });
-
- describe('Expand to full screen', () => {
- const findExpandBtn = () => wrapper.findComponent({ ref: 'expandBtn' });
-
- describe('when there is no @expand listener', () => {
- it('does not show `View full screen` option', () => {
- createWrapper();
- expect(findExpandBtn().exists()).toBe(false);
- });
- });
-
- describe('when there is an @expand listener', () => {
- beforeEach(() => {
- createWrapper({}, { listeners: { expand: () => {} } });
- });
-
- it('shows the `expand` option', () => {
- expect(findExpandBtn().exists()).toBe(true);
- });
-
- it('emits the `expand` event', () => {
- const preventDefault = jest.fn();
- findExpandBtn().vm.$emit('click', { preventDefault });
- expect(wrapper.emitted('expand')).toHaveLength(1);
- expect(preventDefault).toHaveBeenCalled();
- });
- });
- });
-
- describe('When graphData contains links', () => {
- const findManageLinksItem = () => wrapper.findComponent({ ref: 'manageLinksItem' });
- const mockLinks = [
- {
- url: 'https://example.com',
- title: 'Example 1',
- },
- {
- url: 'https://gitlab.com',
- title: 'Example 2',
- },
- ];
- const createWrapperWithLinks = (links = mockLinks) => {
- createWrapper({
- graphData: {
- ...graphData,
- links,
- },
- });
- };
-
- it('custom links are shown', () => {
- createWrapperWithLinks();
-
- mockLinks.forEach(({ url, title }) => {
- const link = findMenuItemByText(title).at(0);
-
- expect(link.exists()).toBe(true);
- expect(link.attributes('href')).toBe(url);
- });
- });
-
- it("custom links don't show unsecure content", () => {
- createWrapperWithLinks([
- {
- title: '<script>alert("XSS")</script>',
- url: 'http://example.com',
- },
- ]);
-
- expect(findMenuItems().at(1).element.innerHTML).toBe(
- '&lt;script&gt;alert("XSS")&lt;/script&gt;',
- );
- });
-
- it("custom links don't show unsecure href attributes", () => {
- const title = 'Owned!';
-
- createWrapperWithLinks([
- {
- title,
- // eslint-disable-next-line no-script-url
- url: 'javascript:alert("Evil")',
- },
- ]);
-
- const link = findMenuItemByText(title).at(0);
- expect(link.attributes('href')).toBe('#');
- });
-
- it('when an editable dashboard is selected, shows `Manage chart links` link to the blob path', () => {
- const editUrl = '/edit';
- mockGetterReturnValue('selectedDashboard', {
- can_edit: true,
- project_blob_path: editUrl,
- });
- createWrapperWithLinks();
-
- expect(findManageLinksItem().exists()).toBe(true);
- expect(findManageLinksItem().attributes('href')).toBe(editUrl);
- });
-
- it('when no dashboard is selected, does not show `Manage chart links`', () => {
- mockGetterReturnValue('selectedDashboard', null);
- createWrapperWithLinks();
-
- expect(findManageLinksItem().exists()).toBe(false);
- });
-
- it('when non-editable dashboard is selected, does not show `Manage chart links`', () => {
- const editUrl = '/edit';
- mockGetterReturnValue('selectedDashboard', {
- can_edit: false,
- project_blob_path: editUrl,
- });
- createWrapperWithLinks();
-
- expect(findManageLinksItem().exists()).toBe(false);
- });
- });
-
- describe('Runbook url', () => {
- const findRunbookLinks = () => wrapper.findAll('[data-testid="runbookLink"]');
-
- beforeEach(() => {
- mockGetterReturnValue('metricsSavedToDb', []);
- });
-
- it('does not show a runbook link when alerts are not present', () => {
- createWrapper();
-
- expect(findRunbookLinks().length).toBe(0);
- });
- });
-});
diff --git a/spec/frontend/monitoring/components/dashboard_spec.js b/spec/frontend/monitoring/components/dashboard_spec.js
deleted file mode 100644
index d7f1d4873bb..00000000000
--- a/spec/frontend/monitoring/components/dashboard_spec.js
+++ /dev/null
@@ -1,784 +0,0 @@
-import MockAdapter from 'axios-mock-adapter';
-import VueDraggable from 'vuedraggable';
-import { nextTick } from 'vue';
-import setWindowLocation from 'helpers/set_window_location_helper';
-import { TEST_HOST } from 'helpers/test_constants';
-import { mountExtended, shallowMountExtended } from 'helpers/vue_test_utils_helper';
-import { createAlert } from '~/alert';
-import axios from '~/lib/utils/axios_utils';
-import { objectToQuery } from '~/lib/utils/url_utility';
-import Dashboard from '~/monitoring/components/dashboard.vue';
-import DashboardHeader from '~/monitoring/components/dashboard_header.vue';
-import DashboardPanel from '~/monitoring/components/dashboard_panel.vue';
-import EmptyState from '~/monitoring/components/empty_state.vue';
-import GraphGroup from '~/monitoring/components/graph_group.vue';
-import GroupEmptyState from '~/monitoring/components/group_empty_state.vue';
-import LinksSection from '~/monitoring/components/links_section.vue';
-import { dashboardEmptyStates, metricStates } from '~/monitoring/constants';
-import { createStore } from '~/monitoring/stores';
-import * as types from '~/monitoring/stores/mutation_types';
-import {
- metricsDashboardViewModel,
- metricsDashboardPanelCount,
- dashboardProps,
-} from '../fixture_data';
-import { dashboardGitResponse, storeVariables } from '../mock_data';
-import {
- setupAllDashboards,
- setupStoreWithDashboard,
- setMetricResult,
- setupStoreWithData,
- setupStoreWithDataForPanelCount,
- setupStoreWithLinks,
-} from '../store_utils';
-
-jest.mock('~/alert');
-
-describe('Dashboard', () => {
- let store;
- let wrapper;
- let mock;
-
- const createShallowWrapper = (props = {}, options = {}) => {
- wrapper = shallowMountExtended(Dashboard, {
- propsData: { ...dashboardProps, ...props },
- store,
- stubs: {
- DashboardHeader,
- },
- ...options,
- });
- };
-
- const createMountedWrapper = (props = {}, options = {}) => {
- wrapper = mountExtended(Dashboard, {
- propsData: { ...dashboardProps, ...props },
- store,
- stubs: {
- 'graph-group': true,
- 'dashboard-panel': true,
- 'dashboard-header': DashboardHeader,
- },
- ...options,
- });
- };
-
- beforeEach(() => {
- store = createStore();
- mock = new MockAdapter(axios);
- jest.spyOn(store, 'dispatch').mockResolvedValue();
- });
-
- afterEach(() => {
- mock.restore();
- if (store.dispatch.mockReset) {
- store.dispatch.mockReset();
- }
- });
-
- describe('request information to the server', () => {
- it('calls to set time range and fetch data', async () => {
- createShallowWrapper({ hasMetrics: true });
-
- await nextTick();
- expect(store.dispatch).toHaveBeenCalledWith(
- 'monitoringDashboard/setTimeRange',
- expect.any(Object),
- );
-
- expect(store.dispatch).toHaveBeenCalledWith('monitoringDashboard/fetchData', undefined);
- });
-
- it('shows up a loading state', async () => {
- store.state.monitoringDashboard.emptyState = dashboardEmptyStates.LOADING;
-
- createShallowWrapper({ hasMetrics: true });
-
- await nextTick();
- expect(wrapper.findComponent(EmptyState).exists()).toBe(true);
- expect(wrapper.findComponent(EmptyState).props('selectedState')).toBe(
- dashboardEmptyStates.LOADING,
- );
- });
-
- it('hides the group panels when showPanels is false', async () => {
- createMountedWrapper({ hasMetrics: true, showPanels: false });
-
- setupStoreWithData(store);
-
- await nextTick();
- expect(wrapper.vm.emptyState).toBeNull();
- expect(wrapper.findAll('.prometheus-panel')).toHaveLength(0);
- });
-
- it('fetches the metrics data with proper time window', async () => {
- createMountedWrapper({ hasMetrics: true });
-
- await nextTick();
- expect(store.dispatch).toHaveBeenCalledWith('monitoringDashboard/fetchData', undefined);
- expect(store.dispatch).toHaveBeenCalledWith(
- 'monitoringDashboard/setTimeRange',
- expect.objectContaining({ duration: { seconds: 28800 } }),
- );
- });
- });
-
- describe('panel containers layout', () => {
- const findPanelLayoutWrapperAt = (index) => {
- return wrapper
- .findComponent(GraphGroup)
- .findAll('[data-testid="dashboard-panel-layout-wrapper"]')
- .at(index);
- };
-
- beforeEach(async () => {
- createMountedWrapper({ hasMetrics: true });
- await nextTick();
- });
-
- describe('when the graph group has an even number of panels', () => {
- it('2 panels - all panel wrappers take half width of their parent', async () => {
- setupStoreWithDataForPanelCount(store, 2);
-
- await nextTick();
- expect(findPanelLayoutWrapperAt(0).classes('col-lg-6')).toBe(true);
- expect(findPanelLayoutWrapperAt(1).classes('col-lg-6')).toBe(true);
- });
-
- it('4 panels - all panel wrappers take half width of their parent', async () => {
- setupStoreWithDataForPanelCount(store, 4);
-
- await nextTick();
- expect(findPanelLayoutWrapperAt(0).classes('col-lg-6')).toBe(true);
- expect(findPanelLayoutWrapperAt(1).classes('col-lg-6')).toBe(true);
- expect(findPanelLayoutWrapperAt(2).classes('col-lg-6')).toBe(true);
- expect(findPanelLayoutWrapperAt(3).classes('col-lg-6')).toBe(true);
- });
- });
-
- describe('when the graph group has an odd number of panels', () => {
- it('1 panel - panel wrapper does not take half width of its parent', async () => {
- setupStoreWithDataForPanelCount(store, 1);
-
- await nextTick();
- expect(findPanelLayoutWrapperAt(0).classes('col-lg-6')).toBe(false);
- });
-
- it('3 panels - all panels but last take half width of their parents', async () => {
- setupStoreWithDataForPanelCount(store, 3);
-
- await nextTick();
- expect(findPanelLayoutWrapperAt(0).classes('col-lg-6')).toBe(true);
- expect(findPanelLayoutWrapperAt(1).classes('col-lg-6')).toBe(true);
- expect(findPanelLayoutWrapperAt(2).classes('col-lg-6')).toBe(false);
- });
-
- it('5 panels - all panels but last take half width of their parents', async () => {
- setupStoreWithDataForPanelCount(store, 5);
-
- await nextTick();
- expect(findPanelLayoutWrapperAt(0).classes('col-lg-6')).toBe(true);
- expect(findPanelLayoutWrapperAt(1).classes('col-lg-6')).toBe(true);
- expect(findPanelLayoutWrapperAt(2).classes('col-lg-6')).toBe(true);
- expect(findPanelLayoutWrapperAt(3).classes('col-lg-6')).toBe(true);
- expect(findPanelLayoutWrapperAt(4).classes('col-lg-6')).toBe(false);
- });
- });
- });
-
- describe('dashboard validation warning', () => {
- it('displays a warning if there are validation warnings', async () => {
- createMountedWrapper({ hasMetrics: true });
-
- store.commit(
- `monitoringDashboard/${types.RECEIVE_DASHBOARD_VALIDATION_WARNINGS_SUCCESS}`,
- true,
- );
-
- await nextTick();
- expect(createAlert).toHaveBeenCalled();
- });
-
- it('does not display a warning if there are no validation warnings', async () => {
- createMountedWrapper({ hasMetrics: true });
-
- store.commit(
- `monitoringDashboard/${types.RECEIVE_DASHBOARD_VALIDATION_WARNINGS_SUCCESS}`,
- false,
- );
-
- await nextTick();
- expect(createAlert).not.toHaveBeenCalled();
- });
- });
-
- describe('when the URL contains a reference to a panel', () => {
- const location = window.location.href;
-
- const setSearch = (searchParams) => {
- setWindowLocation(`?${objectToQuery(searchParams)}`);
- };
-
- afterEach(() => {
- setWindowLocation(location);
- });
-
- it('when the URL points to a panel it expands', async () => {
- const panelGroup = metricsDashboardViewModel.panelGroups[0];
- const panel = panelGroup.panels[0];
-
- setSearch({
- group: panelGroup.group,
- title: panel.title,
- y_label: panel.y_label,
- });
-
- createMountedWrapper({ hasMetrics: true });
- setupStoreWithData(store);
-
- await nextTick();
- expect(store.dispatch).toHaveBeenCalledWith('monitoringDashboard/setExpandedPanel', {
- group: panelGroup.group,
- panel: expect.objectContaining({
- title: panel.title,
- y_label: panel.y_label,
- }),
- });
- });
-
- it('when the URL does not link to any panel, no panel is expanded', async () => {
- setSearch();
-
- createMountedWrapper({ hasMetrics: true });
- setupStoreWithData(store);
-
- await nextTick();
- expect(store.dispatch).not.toHaveBeenCalledWith(
- 'monitoringDashboard/setExpandedPanel',
- expect.anything(),
- );
- });
-
- it('when the URL points to an incorrect panel it shows an error', async () => {
- const panelGroup = metricsDashboardViewModel.panelGroups[0];
- const panel = panelGroup.panels[0];
-
- setSearch({
- group: panelGroup.group,
- title: 'incorrect',
- y_label: panel.y_label,
- });
-
- createMountedWrapper({ hasMetrics: true });
- setupStoreWithData(store);
-
- await nextTick();
- expect(createAlert).toHaveBeenCalled();
- expect(store.dispatch).not.toHaveBeenCalledWith(
- 'monitoringDashboard/setExpandedPanel',
- expect.anything(),
- );
- });
- });
-
- describe('when the panel is expanded', () => {
- let group;
- let panel;
-
- const expandPanel = (mockGroup, mockPanel) => {
- store.commit(`monitoringDashboard/${types.SET_EXPANDED_PANEL}`, {
- group: mockGroup,
- panel: mockPanel,
- });
- };
-
- beforeEach(() => {
- setupStoreWithData(store);
-
- const { panelGroups } = store.state.monitoringDashboard.dashboard;
- group = panelGroups[0].group;
- [panel] = panelGroups[0].panels;
-
- jest.spyOn(window.history, 'pushState').mockImplementation();
- });
-
- afterEach(() => {
- window.history.pushState.mockRestore();
- });
-
- it('URL is updated with panel parameters', async () => {
- createMountedWrapper({ hasMetrics: true });
- expandPanel(group, panel);
-
- const expectedSearch = objectToQuery({
- group,
- title: panel.title,
- y_label: panel.y_label,
- });
-
- await nextTick();
- expect(window.history.pushState).toHaveBeenCalledTimes(1);
- expect(window.history.pushState).toHaveBeenCalledWith(
- expect.anything(), // state
- expect.any(String), // document title
- expect.stringContaining(`${expectedSearch}`),
- );
- });
-
- it('URL is updated with panel parameters and custom dashboard', async () => {
- const dashboard = 'dashboard.yml';
-
- store.commit(`monitoringDashboard/${types.SET_INITIAL_STATE}`, {
- currentDashboard: dashboard,
- });
- createMountedWrapper({ hasMetrics: true });
- expandPanel(group, panel);
-
- const expectedSearch = objectToQuery({
- dashboard,
- group,
- title: panel.title,
- y_label: panel.y_label,
- });
-
- await nextTick();
- expect(window.history.pushState).toHaveBeenCalledTimes(1);
- expect(window.history.pushState).toHaveBeenCalledWith(
- expect.anything(), // state
- expect.any(String), // document title
- expect.stringContaining(`${expectedSearch}`),
- );
- });
-
- it('URL is updated with no parameters', async () => {
- expandPanel(group, panel);
- createMountedWrapper({ hasMetrics: true });
- expandPanel(null, null);
-
- await nextTick();
- expect(window.history.pushState).toHaveBeenCalledTimes(1);
- expect(window.history.pushState).toHaveBeenCalledWith(
- expect.anything(), // state
- expect.any(String), // document title
- expect.not.stringMatching(/group|title|y_label/), // no panel params
- );
- });
- });
-
- describe('when all panels in the first group are loading', () => {
- const findGroupAt = (i) => wrapper.findAllComponents(GraphGroup).at(i);
-
- beforeEach(async () => {
- setupStoreWithDashboard(store);
-
- const { panels } = store.state.monitoringDashboard.dashboard.panelGroups[0];
- panels.forEach(({ metrics }) => {
- store.commit(`monitoringDashboard/${types.REQUEST_METRIC_RESULT}`, {
- metricId: metrics[0].metricId,
- });
- });
-
- createShallowWrapper();
-
- await nextTick();
- });
-
- it('a loading icon appears in the first group', () => {
- expect(findGroupAt(0).props('isLoading')).toBe(true);
- });
-
- it('a loading icon does not appear in the second group', () => {
- expect(findGroupAt(1).props('isLoading')).toBe(false);
- });
- });
-
- describe('when all requests have been committed by the store', () => {
- beforeEach(async () => {
- store.commit(`monitoringDashboard/${types.SET_INITIAL_STATE}`, {
- currentEnvironmentName: 'production',
- currentDashboard: dashboardGitResponse[0].path,
- projectPath: TEST_HOST,
- });
- createMountedWrapper({ hasMetrics: true });
- setupStoreWithData(store);
-
- await nextTick();
- });
-
- it('does not show loading icons in any group', async () => {
- setupStoreWithData(store);
-
- await nextTick();
- wrapper.findAllComponents(GraphGroup).wrappers.forEach((groupWrapper) => {
- expect(groupWrapper.props('isLoading')).toBe(false);
- });
- });
- });
-
- describe('variables section', () => {
- beforeEach(async () => {
- createShallowWrapper({ hasMetrics: true });
- setupStoreWithData(store);
- store.state.monitoringDashboard.variables = storeVariables;
- await nextTick();
- });
-
- it('shows the variables section', () => {
- expect(wrapper.vm.shouldShowVariablesSection).toBe(true);
- });
- });
-
- describe('links section', () => {
- beforeEach(async () => {
- createShallowWrapper({ hasMetrics: true });
- setupStoreWithData(store);
- setupStoreWithLinks(store);
- await nextTick();
- });
-
- it('shows the links section', () => {
- expect(wrapper.vm.shouldShowLinksSection).toBe(true);
- expect(wrapper.findComponent(LinksSection).exists()).toBe(true);
- });
- });
-
- describe('single panel expands to "full screen" mode', () => {
- const findExpandedPanel = () => wrapper.findComponent({ ref: 'expandedPanel' });
-
- describe('when the panel is not expanded', () => {
- beforeEach(async () => {
- createShallowWrapper({ hasMetrics: true });
- setupStoreWithData(store);
- await nextTick();
- });
-
- it('expanded panel is not visible', () => {
- expect(findExpandedPanel().isVisible()).toBe(false);
- });
-
- it('can set a panel as expanded', () => {
- const panel = wrapper.findAllComponents(DashboardPanel).at(1);
-
- jest.spyOn(store, 'dispatch');
-
- panel.vm.$emit('expand');
-
- const groupData = metricsDashboardViewModel.panelGroups[0];
-
- expect(store.dispatch).toHaveBeenCalledWith('monitoringDashboard/setExpandedPanel', {
- group: groupData.group,
- panel: expect.objectContaining({
- id: groupData.panels[0].id,
- }),
- });
- });
- });
-
- describe('when the panel is expanded', () => {
- let group;
- let panel;
-
- const MockPanel = {
- template: `<div><slot name="top-left"/></div>`,
- };
-
- beforeEach(async () => {
- createShallowWrapper({ hasMetrics: true }, { stubs: { DashboardPanel: MockPanel } });
- setupStoreWithData(store);
-
- const { panelGroups } = store.state.monitoringDashboard.dashboard;
-
- group = panelGroups[0].group;
- [panel] = panelGroups[0].panels;
-
- store.commit(`monitoringDashboard/${types.SET_EXPANDED_PANEL}`, {
- group,
- panel,
- });
-
- jest.spyOn(store, 'dispatch');
- await nextTick();
- });
-
- it('displays a single panel and others are hidden', () => {
- const panels = wrapper.findAllComponents(MockPanel);
- const visiblePanels = panels.filter((w) => w.isVisible());
-
- expect(findExpandedPanel().isVisible()).toBe(true);
- // v-show for hiding panels is more performant than v-if
- // check for panels to be hidden.
- expect(panels.length).toBe(metricsDashboardPanelCount + 1);
- expect(visiblePanels.length).toBe(1);
- });
-
- it('sets a link to the expanded panel', () => {
- const searchQuery =
- '?dashboard=config%2Fprometheus%2Fcommon_metrics.yml&group=System%20metrics%20(Kubernetes)&title=Memory%20Usage%20(Total)&y_label=Total%20Memory%20Used%20(GB)';
-
- expect(findExpandedPanel().attributes('clipboard-text')).toEqual(
- expect.stringContaining(searchQuery),
- );
- });
-
- it('restores full dashboard by clicking `back`', () => {
- wrapper.findComponent({ ref: 'goBackBtn' }).vm.$emit('click');
-
- expect(store.dispatch).toHaveBeenCalledWith(
- 'monitoringDashboard/clearExpandedPanel',
- undefined,
- );
- });
- });
- });
-
- describe('when one of the metrics is missing', () => {
- beforeEach(async () => {
- createShallowWrapper({ hasMetrics: true });
-
- setupStoreWithDashboard(store);
- setMetricResult({ store, result: [], panel: 2 });
- await nextTick();
- });
-
- it('shows a group empty area', () => {
- const emptyGroup = wrapper.findAllComponents({ ref: 'empty-group' });
-
- expect(emptyGroup).toHaveLength(1);
- expect(emptyGroup.is(GroupEmptyState)).toBe(true);
- });
-
- it('group empty area displays a NO_DATA state', () => {
- expect(
- wrapper.findAllComponents({ ref: 'empty-group' }).at(0).props('selectedState'),
- ).toEqual(metricStates.NO_DATA);
- });
- });
-
- describe('drag and drop function', () => {
- const findDraggables = () => wrapper.findAllComponents(VueDraggable);
- const findEnabledDraggables = () => findDraggables().filter((f) => !f.attributes('disabled'));
- const findDraggablePanels = () => wrapper.findAll('.js-draggable-panel');
- const findRearrangeButton = () => wrapper.find('.js-rearrange-button');
-
- const setup = async () => {
- // call original dispatch
- store.dispatch.mockRestore();
-
- createShallowWrapper({ hasMetrics: true });
- setupStoreWithData(store);
- await nextTick();
- };
-
- it('wraps vuedraggable', async () => {
- await setup();
-
- expect(findDraggablePanels().exists()).toBe(true);
- expect(findDraggablePanels().length).toEqual(metricsDashboardPanelCount);
- });
-
- it('is disabled by default', async () => {
- await setup();
-
- expect(findRearrangeButton().exists()).toBe(false);
- expect(findEnabledDraggables().length).toBe(0);
- });
-
- describe('when rearrange is enabled', () => {
- beforeEach(async () => {
- // call original dispatch
- store.dispatch.mockRestore();
-
- createShallowWrapper({ hasMetrics: true, rearrangePanelsAvailable: true });
- setupStoreWithData(store);
-
- await nextTick();
- });
-
- it('displays rearrange button', () => {
- expect(findRearrangeButton().exists()).toBe(true);
- });
-
- describe('when rearrange button is clicked', () => {
- const findFirstDraggableRemoveButton = () =>
- findDraggablePanels().at(0).find('.js-draggable-remove');
-
- it('enables draggables', async () => {
- findRearrangeButton().vm.$emit('click');
- await nextTick();
-
- expect(findRearrangeButton().attributes('pressed')).toBe('true');
- expect(findEnabledDraggables().wrappers).toEqual(findDraggables().wrappers);
- });
-
- it('metrics can be swapped', async () => {
- findRearrangeButton().vm.$emit('click');
- await nextTick();
-
- const firstDraggable = findDraggables().at(0);
- const mockMetrics = [...metricsDashboardViewModel.panelGroups[0].panels];
-
- const firstTitle = mockMetrics[0].title;
- const secondTitle = mockMetrics[1].title;
-
- // swap two elements and `input` them
- [mockMetrics[0], mockMetrics[1]] = [mockMetrics[1], mockMetrics[0]];
- firstDraggable.vm.$emit('input', mockMetrics);
-
- await nextTick();
-
- const { panels } = wrapper.vm.dashboard.panelGroups[0];
-
- expect(panels[1].title).toEqual(firstTitle);
- expect(panels[0].title).toEqual(secondTitle);
- });
-
- it('shows a remove button, which removes a panel', async () => {
- findRearrangeButton().vm.$emit('click');
- await nextTick();
-
- expect(findFirstDraggableRemoveButton().find('a').exists()).toBe(true);
-
- expect(findDraggablePanels().length).toEqual(metricsDashboardPanelCount);
- await findFirstDraggableRemoveButton().trigger('click');
-
- expect(findDraggablePanels().length).toEqual(metricsDashboardPanelCount - 1);
- });
-
- it('disables draggables when clicked again', async () => {
- findRearrangeButton().vm.$emit('click');
- await nextTick();
-
- findRearrangeButton().vm.$emit('click');
- await nextTick();
- expect(findRearrangeButton().attributes('pressed')).toBeUndefined();
- expect(findEnabledDraggables().length).toBe(0);
- });
- });
- });
- });
-
- describe('cluster health', () => {
- beforeEach(async () => {
- createShallowWrapper({ hasMetrics: true, showHeader: false });
-
- // all_dashboards is not defined in health dashboards
- store.commit(`monitoringDashboard/${types.SET_ALL_DASHBOARDS}`, undefined);
- await nextTick();
- });
-
- it('hides dashboard header by default', () => {
- expect(wrapper.findComponent({ ref: 'prometheusGraphsHeader' }).exists()).toEqual(false);
- });
-
- it('renders correctly', () => {
- expect(wrapper.html()).not.toBe('');
- });
- });
-
- describe('document title', () => {
- const originalTitle = 'Original Title';
- const overviewDashboardName = dashboardGitResponse[0].display_name;
-
- beforeEach(() => {
- document.title = originalTitle;
- createShallowWrapper({ hasMetrics: true });
- });
-
- afterAll(() => {
- document.title = '';
- });
-
- it('is prepended with the overview dashboard name by default', async () => {
- setupAllDashboards(store);
-
- await nextTick();
- expect(document.title.startsWith(`${overviewDashboardName} · `)).toBe(true);
- });
-
- it('is prepended with dashboard name if path is known', async () => {
- const dashboard = dashboardGitResponse[1];
- const currentDashboard = dashboard.path;
-
- setupAllDashboards(store, currentDashboard);
-
- await nextTick();
- expect(document.title.startsWith(`${dashboard.display_name} · `)).toBe(true);
- });
-
- it('is prepended with the overview dashboard name if path is not known', async () => {
- setupAllDashboards(store, 'unknown/path');
-
- await nextTick();
- expect(document.title.startsWith(`${overviewDashboardName} · `)).toBe(true);
- });
-
- it('is not modified when dashboard name is not provided', async () => {
- const dashboard = { ...dashboardGitResponse[1], display_name: null };
- const currentDashboard = dashboard.path;
-
- store.commit(`monitoringDashboard/${types.SET_ALL_DASHBOARDS}`, [dashboard]);
-
- store.commit(`monitoringDashboard/${types.SET_INITIAL_STATE}`, {
- currentDashboard,
- });
-
- await nextTick();
- expect(document.title).toBe(originalTitle);
- });
- });
-
- describe('Clipboard text in panels', () => {
- const currentDashboard = dashboardGitResponse[1].path;
- const panelIndex = 1; // skip expanded panel
-
- const getClipboardTextFirstPanel = () =>
- wrapper.findAllComponents(DashboardPanel).at(panelIndex).props('clipboardText');
-
- beforeEach(async () => {
- setupStoreWithData(store);
- store.commit(`monitoringDashboard/${types.SET_INITIAL_STATE}`, {
- currentDashboard,
- });
- createShallowWrapper({ hasMetrics: true });
- await nextTick();
- });
-
- it('contains a link to the dashboard', () => {
- const dashboardParam = `dashboard=${encodeURIComponent(currentDashboard)}`;
-
- expect(getClipboardTextFirstPanel()).toContain(dashboardParam);
- expect(getClipboardTextFirstPanel()).toContain(`group=`);
- expect(getClipboardTextFirstPanel()).toContain(`title=`);
- expect(getClipboardTextFirstPanel()).toContain(`y_label=`);
- });
- });
-
- describe('keyboard shortcuts', () => {
- const currentDashboard = dashboardGitResponse[1].path;
- const panelRef = 'dashboard-panel-response-metrics-aws-elb-4-1'; // skip expanded panel
-
- // While the recommendation in the documentation is to test
- // with a data-testid attribute, I want to make sure that
- // the dashboard panels have a ref attribute set.
- const getDashboardPanel = () => wrapper.findComponent({ ref: panelRef });
-
- beforeEach(async () => {
- setupStoreWithData(store);
- store.commit(`monitoringDashboard/${types.SET_INITIAL_STATE}`, {
- currentDashboard,
- });
- createShallowWrapper({ hasMetrics: 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({ hoveredPanel: panelRef });
- await nextTick();
- });
-
- it('contains a ref attribute inside a DashboardPanel component', () => {
- const dashboardPanel = getDashboardPanel();
-
- expect(dashboardPanel.exists()).toBe(true);
- });
- });
-});
diff --git a/spec/frontend/monitoring/components/dashboard_template_spec.js b/spec/frontend/monitoring/components/dashboard_template_spec.js
deleted file mode 100644
index 4e220d724f4..00000000000
--- a/spec/frontend/monitoring/components/dashboard_template_spec.js
+++ /dev/null
@@ -1,41 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import MockAdapter from 'axios-mock-adapter';
-import axios from '~/lib/utils/axios_utils';
-import Dashboard from '~/monitoring/components/dashboard.vue';
-import DashboardHeader from '~/monitoring/components/dashboard_header.vue';
-import { createStore } from '~/monitoring/stores';
-import { dashboardProps } from '../fixture_data';
-import { setupAllDashboards } from '../store_utils';
-
-jest.mock('~/lib/utils/url_utility');
-
-describe('Dashboard template', () => {
- let wrapper;
- let store;
- let mock;
-
- beforeEach(() => {
- store = createStore({
- currentEnvironmentName: 'production',
- });
- mock = new MockAdapter(axios);
-
- setupAllDashboards(store);
- });
-
- afterEach(() => {
- mock.restore();
- });
-
- it('matches the default snapshot', () => {
- wrapper = shallowMount(Dashboard, {
- propsData: { ...dashboardProps },
- store,
- stubs: {
- DashboardHeader,
- },
- });
-
- expect(wrapper.element).toMatchSnapshot();
- });
-});
diff --git a/spec/frontend/monitoring/components/dashboard_url_time_spec.js b/spec/frontend/monitoring/components/dashboard_url_time_spec.js
deleted file mode 100644
index b123d1e7d79..00000000000
--- a/spec/frontend/monitoring/components/dashboard_url_time_spec.js
+++ /dev/null
@@ -1,159 +0,0 @@
-import { mount } from '@vue/test-utils';
-import MockAdapter from 'axios-mock-adapter';
-import { nextTick } from 'vue';
-import { createAlert } from '~/alert';
-import axios from '~/lib/utils/axios_utils';
-import {
- queryToObject,
- redirectTo, // eslint-disable-line import/no-deprecated
- removeParams,
- mergeUrlParams,
- updateHistory,
-} from '~/lib/utils/url_utility';
-
-import Dashboard from '~/monitoring/components/dashboard.vue';
-import DashboardHeader from '~/monitoring/components/dashboard_header.vue';
-import { createStore } from '~/monitoring/stores';
-import { defaultTimeRange } from '~/vue_shared/constants';
-import { dashboardProps } from '../fixture_data';
-import { mockProjectDir } from '../mock_data';
-
-jest.mock('~/alert');
-jest.mock('~/lib/utils/url_utility');
-
-describe('dashboard invalid url parameters', () => {
- let store;
- let wrapper;
- let mock;
-
- const createMountedWrapper = (props = { hasMetrics: true }, options = {}) => {
- wrapper = mount(Dashboard, {
- propsData: { ...dashboardProps, ...props },
- store,
- stubs: { 'graph-group': true, 'dashboard-panel': true, 'dashboard-header': DashboardHeader },
- ...options,
- });
- };
-
- const findDateTimePicker = () =>
- wrapper.findComponent(DashboardHeader).findComponent({ ref: 'dateTimePicker' });
-
- beforeEach(() => {
- store = createStore();
- jest.spyOn(store, 'dispatch');
-
- mock = new MockAdapter(axios);
- });
-
- afterEach(() => {
- mock.restore();
- queryToObject.mockReset();
- });
-
- it('passes default url parameters to the time range picker', async () => {
- queryToObject.mockReturnValue({});
-
- createMountedWrapper();
-
- await nextTick();
- expect(findDateTimePicker().props('value')).toEqual(defaultTimeRange);
-
- expect(store.dispatch).toHaveBeenCalledWith(
- 'monitoringDashboard/setTimeRange',
- expect.any(Object),
- );
- expect(store.dispatch).toHaveBeenCalledWith('monitoringDashboard/fetchData', undefined);
- });
-
- it('passes a fixed time range in the URL to the time range picker', async () => {
- const params = {
- start: '2019-01-01T00:00:00.000Z',
- end: '2019-01-10T00:00:00.000Z',
- };
-
- queryToObject.mockReturnValue(params);
-
- createMountedWrapper();
-
- await nextTick();
- expect(findDateTimePicker().props('value')).toEqual(params);
-
- expect(store.dispatch).toHaveBeenCalledWith('monitoringDashboard/setTimeRange', params);
- expect(store.dispatch).toHaveBeenCalledWith('monitoringDashboard/fetchData', undefined);
- });
-
- it('passes a rolling time range in the URL to the time range picker', async () => {
- queryToObject.mockReturnValue({
- duration_seconds: '120',
- });
-
- createMountedWrapper();
-
- await nextTick();
- const expectedTimeRange = {
- duration: { seconds: 60 * 2 },
- };
-
- expect(findDateTimePicker().props('value')).toMatchObject(expectedTimeRange);
-
- expect(store.dispatch).toHaveBeenCalledWith(
- 'monitoringDashboard/setTimeRange',
- expectedTimeRange,
- );
- expect(store.dispatch).toHaveBeenCalledWith('monitoringDashboard/fetchData', undefined);
- });
-
- it('shows an error message and loads a default time range if invalid url parameters are passed', async () => {
- queryToObject.mockReturnValue({
- start: '<script>alert("XSS")</script>',
- end: '<script>alert("XSS")</script>',
- });
-
- createMountedWrapper();
-
- await nextTick();
- expect(createAlert).toHaveBeenCalled();
-
- expect(findDateTimePicker().props('value')).toEqual(defaultTimeRange);
-
- expect(store.dispatch).toHaveBeenCalledWith(
- 'monitoringDashboard/setTimeRange',
- defaultTimeRange,
- );
- expect(store.dispatch).toHaveBeenCalledWith('monitoringDashboard/fetchData', undefined);
- });
-
- it('redirects to different time range', async () => {
- const toUrl = `${mockProjectDir}/-/metrics?environment=1`;
- removeParams.mockReturnValueOnce(toUrl);
-
- createMountedWrapper();
-
- await nextTick();
- findDateTimePicker().vm.$emit('input', {
- duration: { seconds: 120 },
- });
-
- // redirect to with new parameters
- expect(mergeUrlParams).toHaveBeenCalledWith({ duration_seconds: '120' }, toUrl);
- expect(redirectTo).toHaveBeenCalledTimes(1); // eslint-disable-line import/no-deprecated
- });
-
- it('changes the url when a panel moves the time slider', async () => {
- const timeRange = {
- start: '2020-01-01T00:00:00.000Z',
- end: '2020-01-01T01:00:00.000Z',
- };
-
- queryToObject.mockReturnValue(timeRange);
-
- createMountedWrapper();
-
- await nextTick();
- wrapper.vm.onTimeRangeZoom(timeRange);
-
- expect(updateHistory).toHaveBeenCalled();
- expect(wrapper.vm.selectedTimeRange.start.toString()).toBe(timeRange.start);
- expect(wrapper.vm.selectedTimeRange.end.toString()).toBe(timeRange.end);
- });
-});
diff --git a/spec/frontend/monitoring/components/dashboards_dropdown_spec.js b/spec/frontend/monitoring/components/dashboards_dropdown_spec.js
deleted file mode 100644
index 3ccaa2d28ac..00000000000
--- a/spec/frontend/monitoring/components/dashboards_dropdown_spec.js
+++ /dev/null
@@ -1,170 +0,0 @@
-import { GlDropdownItem, GlIcon } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import { nextTick } from 'vue';
-
-import DashboardsDropdown from '~/monitoring/components/dashboards_dropdown.vue';
-
-import { dashboardGitResponse } from '../mock_data';
-
-const defaultBranch = 'main';
-const starredDashboards = dashboardGitResponse.filter(({ starred }) => starred);
-const notStarredDashboards = dashboardGitResponse.filter(({ starred }) => !starred);
-
-describe('DashboardsDropdown', () => {
- let wrapper;
- let mockDashboards;
- let mockSelectedDashboard;
-
- function createComponent(props, opts = {}) {
- const storeOpts = {
- computed: {
- allDashboards: () => mockDashboards,
- selectedDashboard: () => mockSelectedDashboard,
- },
- };
-
- wrapper = shallowMount(DashboardsDropdown, {
- propsData: {
- ...props,
- defaultBranch,
- },
- ...storeOpts,
- ...opts,
- });
- }
-
- const findItems = () => wrapper.findAllComponents(GlDropdownItem);
- const findItemAt = (i) => wrapper.findAllComponents(GlDropdownItem).at(i);
- const findSearchInput = () => wrapper.findComponent({ ref: 'monitorDashboardsDropdownSearch' });
- const findNoItemsMsg = () => wrapper.findComponent({ ref: 'monitorDashboardsDropdownMsg' });
- const findStarredListDivider = () => wrapper.findComponent({ ref: 'starredListDivider' });
- // setData usage is discouraged. See https://gitlab.com/groups/gitlab-org/-/epics/7330 for details
- // eslint-disable-next-line no-restricted-syntax
- const setSearchTerm = (searchTerm) => wrapper.setData({ searchTerm });
-
- beforeEach(() => {
- mockDashboards = dashboardGitResponse;
- mockSelectedDashboard = null;
- });
-
- describe('when it receives dashboards data', () => {
- beforeEach(() => {
- createComponent();
- });
-
- it('displays an item for each dashboard', () => {
- expect(findItems().length).toEqual(dashboardGitResponse.length);
- });
-
- it('displays items with the dashboard display name, with starred dashboards first', () => {
- expect(findItemAt(0).text()).toBe(starredDashboards[0].display_name);
- expect(findItemAt(1).text()).toBe(notStarredDashboards[0].display_name);
- expect(findItemAt(2).text()).toBe(notStarredDashboards[1].display_name);
- });
-
- it('displays separator between starred and not starred dashboards', () => {
- expect(findStarredListDivider().exists()).toBe(true);
- });
-
- it('displays a search input', () => {
- expect(findSearchInput().isVisible()).toBe(true);
- });
-
- it('hides no message text by default', () => {
- expect(findNoItemsMsg().isVisible()).toBe(false);
- });
-
- it('filters dropdown items when searched for item exists in the list', async () => {
- const searchTerm = 'Overview';
- setSearchTerm(searchTerm);
- await nextTick();
-
- expect(findItems()).toHaveLength(1);
- });
-
- it('shows no items found message when searched for item does not exists in the list', async () => {
- const searchTerm = 'does-not-exist';
- setSearchTerm(searchTerm);
- await nextTick();
-
- expect(findNoItemsMsg().isVisible()).toBe(true);
- });
- });
-
- describe('when a dashboard is selected', () => {
- beforeEach(() => {
- [mockSelectedDashboard] = starredDashboards;
- createComponent();
- });
-
- it('dashboard item is selected', () => {
- expect(findItemAt(0).props('isChecked')).toBe(true);
- expect(findItemAt(1).props('isChecked')).toBe(false);
- });
- });
-
- describe('when the dashboard is missing a display name', () => {
- beforeEach(() => {
- mockDashboards = dashboardGitResponse.map((d) => ({ ...d, display_name: undefined }));
- createComponent();
- });
-
- it('displays items with the dashboard path, with starred dashboards first', () => {
- expect(findItemAt(0).text()).toBe(starredDashboards[0].path);
- expect(findItemAt(1).text()).toBe(notStarredDashboards[0].path);
- expect(findItemAt(2).text()).toBe(notStarredDashboards[1].path);
- });
- });
-
- describe('when it receives starred dashboards', () => {
- beforeEach(() => {
- mockDashboards = starredDashboards;
- createComponent();
- });
-
- it('displays an item for each dashboard', () => {
- expect(findItems().length).toEqual(starredDashboards.length);
- });
-
- it('displays a star icon', () => {
- const star = findItemAt(0).findComponent(GlIcon);
- expect(star.exists()).toBe(true);
- expect(star.attributes('name')).toBe('star');
- });
-
- it('displays no separator between starred and not starred dashboards', () => {
- expect(findStarredListDivider().exists()).toBe(false);
- });
- });
-
- describe('when it receives only not-starred dashboards', () => {
- beforeEach(() => {
- mockDashboards = notStarredDashboards;
- createComponent();
- });
-
- it('displays an item for each dashboard', () => {
- expect(findItems().length).toEqual(notStarredDashboards.length);
- });
-
- it('displays no star icon', () => {
- const star = findItemAt(0).findComponent(GlIcon);
- expect(star.exists()).toBe(false);
- });
-
- it('displays no separator between starred and not starred dashboards', () => {
- expect(findStarredListDivider().exists()).toBe(false);
- });
- });
-
- describe('when a dashboard gets selected by the user', () => {
- beforeEach(() => {
- createComponent();
- findItemAt(1).vm.$emit('click');
- });
-
- it('emits a "selectDashboard" event with dashboard information', () => {
- expect(wrapper.emitted().selectDashboard[0]).toEqual([dashboardGitResponse[0]]);
- });
- });
-});
diff --git a/spec/frontend/monitoring/components/duplicate_dashboard_form_spec.js b/spec/frontend/monitoring/components/duplicate_dashboard_form_spec.js
deleted file mode 100644
index b54ca926dae..00000000000
--- a/spec/frontend/monitoring/components/duplicate_dashboard_form_spec.js
+++ /dev/null
@@ -1,166 +0,0 @@
-import { mount } from '@vue/test-utils';
-import { nextTick } from 'vue';
-import DuplicateDashboardForm from '~/monitoring/components/duplicate_dashboard_form.vue';
-
-import { dashboardGitResponse } from '../mock_data';
-
-let wrapper;
-
-const createMountedWrapper = (props = {}) => {
- // Use `mount` to render native input elements
- wrapper = mount(DuplicateDashboardForm, {
- propsData: { ...props },
- // We need to attach to document, so that `document.activeElement` is properly set in jsdom
- attachTo: document.body,
- });
-};
-
-describe('DuplicateDashboardForm', () => {
- const defaultBranch = 'main';
-
- const findByRef = (ref) => wrapper.findComponent({ ref });
- const setValue = (ref, val) => {
- findByRef(ref).setValue(val);
- };
- const setChecked = (value) => {
- const input = wrapper.find(`.custom-control-input[value="${value}"]`);
- input.element.checked = true;
- input.trigger('click');
- input.trigger('change');
- };
-
- beforeEach(() => {
- createMountedWrapper({ dashboard: dashboardGitResponse[0], defaultBranch });
- });
-
- it('renders correctly', () => {
- expect(wrapper.exists()).toEqual(true);
- });
-
- it('renders form elements', () => {
- expect(findByRef('fileName').exists()).toEqual(true);
- expect(findByRef('branchName').exists()).toEqual(true);
- expect(findByRef('branchOption').exists()).toEqual(true);
- expect(findByRef('commitMessage').exists()).toEqual(true);
- });
-
- describe('validates the file name', () => {
- const findInvalidFeedback = () => findByRef('fileNameFormGroup').find('.invalid-feedback');
-
- it('when is empty', async () => {
- setValue('fileName', '');
- await nextTick();
-
- expect(findByRef('fileNameFormGroup').classes()).toContain('is-valid');
- expect(findInvalidFeedback().exists()).toBe(false);
- });
-
- it('when is valid', async () => {
- setValue('fileName', 'my_dashboard.yml');
- await nextTick();
-
- expect(findByRef('fileNameFormGroup').classes()).toContain('is-valid');
- expect(findInvalidFeedback().exists()).toBe(false);
- });
-
- it('when is not valid', async () => {
- setValue('fileName', 'my_dashboard.exe');
- await nextTick();
-
- expect(findByRef('fileNameFormGroup').classes()).toContain('is-invalid');
- expect(findInvalidFeedback().text()).toBe('The file name should have a .yml extension');
- });
- });
-
- describe('emits `change` event', () => {
- const lastChange = () =>
- nextTick().then(() => {
- wrapper.find('form').trigger('change');
-
- // Resolves to the last emitted change
- const changes = wrapper.emitted().change;
- return changes[changes.length - 1][0];
- });
-
- it('with the inital form values', () => {
- expect(wrapper.emitted().change).toHaveLength(1);
-
- return expect(lastChange()).resolves.toEqual({
- branch: '',
- commitMessage: expect.any(String),
- dashboard: dashboardGitResponse[0].path,
- fileName: 'common_metrics.yml',
- });
- });
-
- it('containing an inputted file name', () => {
- setValue('fileName', 'my_dashboard.yml');
-
- return expect(lastChange()).resolves.toMatchObject({
- fileName: 'my_dashboard.yml',
- });
- });
-
- it('containing a default commit message when no message is set', () => {
- setValue('commitMessage', '');
-
- return expect(lastChange()).resolves.toMatchObject({
- commitMessage: expect.stringContaining('Create custom dashboard'),
- });
- });
-
- it('containing an inputted commit message', () => {
- setValue('commitMessage', 'My commit message');
-
- return expect(lastChange()).resolves.toMatchObject({
- commitMessage: expect.stringContaining('My commit message'),
- });
- });
-
- it('containing an inputted branch name', () => {
- setValue('branchName', 'a-new-branch');
-
- return expect(lastChange()).resolves.toMatchObject({
- branch: 'a-new-branch',
- });
- });
-
- it('when a `default` branch option is set, branch input is invisible and ignored', () => {
- setChecked(wrapper.vm.$options.radioVals.DEFAULT);
- setValue('branchName', 'a-new-branch');
-
- return Promise.all([
- expect(lastChange()).resolves.toMatchObject({
- branch: defaultBranch,
- }),
- nextTick(() => {
- expect(findByRef('branchName').isVisible()).toBe(false);
- }),
- ]);
- });
-
- it('when `new` branch option is chosen, focuses on the branch name input', async () => {
- setChecked(wrapper.vm.$options.radioVals.NEW);
-
- await nextTick();
-
- wrapper.find('form').trigger('change');
- expect(document.activeElement).toBe(findByRef('branchName').element);
- });
- });
-});
-
-describe('DuplicateDashboardForm escapes elements', () => {
- const branchToEscape = "<img/src='x'onerror=alert(document.domain)>";
-
- beforeEach(() => {
- createMountedWrapper({ dashboard: dashboardGitResponse[0], defaultBranch: branchToEscape });
- });
-
- it('should escape branch name data', () => {
- const branchOptionHtml = wrapper.vm.branchOptions[0].html;
- const escapedBranch = '&lt;img/src=&#39;x&#39;onerror=alert(document.domain)&gt';
-
- expect(branchOptionHtml).toEqual(expect.stringContaining(escapedBranch));
- });
-});
diff --git a/spec/frontend/monitoring/components/duplicate_dashboard_modal_spec.js b/spec/frontend/monitoring/components/duplicate_dashboard_modal_spec.js
deleted file mode 100644
index d83a9192876..00000000000
--- a/spec/frontend/monitoring/components/duplicate_dashboard_modal_spec.js
+++ /dev/null
@@ -1,110 +0,0 @@
-import { GlAlert, GlLoadingIcon, GlModal } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import Vue from 'vue';
-import Vuex from 'vuex';
-
-import waitForPromises from 'helpers/wait_for_promises';
-
-import DuplicateDashboardForm from '~/monitoring/components/duplicate_dashboard_form.vue';
-import DuplicateDashboardModal from '~/monitoring/components/duplicate_dashboard_modal.vue';
-
-import { dashboardGitResponse } from '../mock_data';
-
-Vue.use(Vuex);
-
-describe('duplicate dashboard modal', () => {
- let wrapper;
- let mockDashboards;
- let mockSelectedDashboard;
- let duplicateDashboardAction;
- let okEvent;
-
- function createComponent() {
- const store = new Vuex.Store({
- modules: {
- monitoringDashboard: {
- namespaced: true,
- actions: {
- duplicateSystemDashboard: duplicateDashboardAction,
- },
- getters: {
- allDashboards: () => mockDashboards,
- selectedDashboard: () => mockSelectedDashboard,
- },
- },
- },
- });
-
- return shallowMount(DuplicateDashboardModal, {
- propsData: {
- defaultBranch: 'main',
- modalId: 'id',
- },
- store,
- });
- }
-
- const findAlert = () => wrapper.findComponent(GlAlert);
- const findModal = () => wrapper.findComponent(GlModal);
- const findDuplicateDashboardForm = () => wrapper.findComponent(DuplicateDashboardForm);
-
- beforeEach(() => {
- mockDashboards = dashboardGitResponse;
- [mockSelectedDashboard] = dashboardGitResponse;
-
- duplicateDashboardAction = jest.fn().mockResolvedValue();
-
- okEvent = {
- preventDefault: jest.fn(),
- };
-
- wrapper = createComponent();
-
- wrapper.vm.$refs.duplicateDashboardModal.hide = jest.fn();
- });
-
- it('contains a form to duplicate a dashboard', () => {
- expect(findDuplicateDashboardForm().exists()).toBe(true);
- });
-
- it('saves a new dashboard', async () => {
- findModal().vm.$emit('ok', okEvent);
-
- await waitForPromises();
- expect(okEvent.preventDefault).toHaveBeenCalled();
- expect(wrapper.emitted('dashboardDuplicated')).toHaveLength(1);
- expect(wrapper.emitted().dashboardDuplicated[0]).toEqual([dashboardGitResponse[0]]);
- expect(wrapper.findComponent(GlLoadingIcon).exists()).toBe(false);
- expect(wrapper.vm.$refs.duplicateDashboardModal.hide).toHaveBeenCalled();
- expect(findAlert().exists()).toBe(false);
- });
-
- it('handles error when a new dashboard is not saved', async () => {
- const errMsg = 'An error occurred';
-
- duplicateDashboardAction.mockRejectedValueOnce(errMsg);
- findModal().vm.$emit('ok', okEvent);
-
- await waitForPromises();
-
- expect(okEvent.preventDefault).toHaveBeenCalled();
-
- expect(findAlert().exists()).toBe(true);
- expect(findAlert().text()).toBe(errMsg);
-
- expect(wrapper.findComponent(GlLoadingIcon).exists()).toBe(false);
- expect(wrapper.vm.$refs.duplicateDashboardModal.hide).not.toHaveBeenCalled();
- });
-
- it('updates the form on changes', () => {
- const formVals = {
- dashboard: 'common_metrics.yml',
- commitMessage: 'A commit message',
- };
-
- findModal().findComponent(DuplicateDashboardForm).vm.$emit('change', formVals);
-
- // Binding's second argument contains the modal id
- expect(wrapper.vm.form).toEqual(formVals);
- });
-});
diff --git a/spec/frontend/monitoring/components/embeds/embed_group_spec.js b/spec/frontend/monitoring/components/embeds/embed_group_spec.js
deleted file mode 100644
index beb698c838f..00000000000
--- a/spec/frontend/monitoring/components/embeds/embed_group_spec.js
+++ /dev/null
@@ -1,157 +0,0 @@
-import { GlButton, GlCard } from '@gitlab/ui';
-import { mount, shallowMount } from '@vue/test-utils';
-import Vue, { nextTick } from 'vue';
-import Vuex from 'vuex';
-import { TEST_HOST } from 'helpers/test_constants';
-import EmbedGroup from '~/monitoring/components/embeds/embed_group.vue';
-import MetricEmbed from '~/monitoring/components/embeds/metric_embed.vue';
-import {
- addModuleAction,
- initialEmbedGroupState,
- singleEmbedProps,
- dashboardEmbedProps,
- multipleEmbedProps,
-} from './mock_data';
-
-Vue.use(Vuex);
-
-describe('Embed Group', () => {
- let wrapper;
- let store;
- const metricsWithDataGetter = jest.fn();
-
- function mountComponent({ urls = [TEST_HOST], shallow = true, stubs } = {}) {
- const mountMethod = shallow ? shallowMount : mount;
- wrapper = mountMethod(EmbedGroup, {
- store,
- propsData: {
- urls,
- },
- stubs,
- });
- }
-
- beforeEach(() => {
- store = new Vuex.Store({
- modules: {
- embedGroup: {
- namespaced: true,
- actions: { addModule: jest.fn() },
- getters: { metricsWithData: metricsWithDataGetter },
- state: initialEmbedGroupState,
- },
- },
- });
- store.registerModule = jest.fn();
- jest.spyOn(store, 'dispatch');
- });
-
- afterEach(() => {
- metricsWithDataGetter.mockReset();
- });
-
- describe('interactivity', () => {
- it('hides the component when no chart data is loaded', () => {
- metricsWithDataGetter.mockReturnValue([]);
- mountComponent();
-
- expect(wrapper.findComponent(GlCard).isVisible()).toBe(false);
- });
-
- it('shows the component when chart data is loaded', () => {
- metricsWithDataGetter.mockReturnValue([1]);
- mountComponent();
-
- expect(wrapper.findComponent(GlCard).isVisible()).toBe(true);
- });
-
- it('is expanded by default', () => {
- metricsWithDataGetter.mockReturnValue([1]);
- mountComponent({ shallow: false, stubs: { MetricEmbed: true } });
-
- expect(wrapper.find('.gl-card-body').classes()).not.toContain('d-none');
- });
-
- it('collapses when clicked', async () => {
- metricsWithDataGetter.mockReturnValue([1]);
- mountComponent({ shallow: false, stubs: { MetricEmbed: true } });
-
- wrapper.findComponent(GlButton).trigger('click');
-
- await nextTick();
- expect(wrapper.find('.gl-card-body').classes()).toContain('d-none');
- });
- });
-
- describe('single metrics', () => {
- beforeEach(() => {
- metricsWithDataGetter.mockReturnValue([1]);
- mountComponent();
- });
-
- it('renders an Embed component', () => {
- expect(wrapper.findComponent(MetricEmbed).exists()).toBe(true);
- });
-
- it('passes the correct props to the Embed component', () => {
- expect(wrapper.findComponent(MetricEmbed).props()).toEqual(singleEmbedProps());
- });
-
- it('adds the monitoring dashboard module', () => {
- expect(store.dispatch).toHaveBeenCalledWith(addModuleAction, 'monitoringDashboard/0');
- });
- });
-
- describe('dashboard metrics', () => {
- beforeEach(() => {
- metricsWithDataGetter.mockReturnValue([2]);
- mountComponent();
- });
-
- it('passes the correct props to the dashboard Embed component', () => {
- expect(wrapper.findComponent(MetricEmbed).props()).toEqual(dashboardEmbedProps());
- });
-
- it('adds the monitoring dashboard module', () => {
- expect(store.dispatch).toHaveBeenCalledWith(addModuleAction, 'monitoringDashboard/0');
- });
- });
-
- describe('multiple metrics', () => {
- beforeEach(() => {
- metricsWithDataGetter.mockReturnValue([1, 1]);
- mountComponent({ urls: [TEST_HOST, TEST_HOST] });
- });
-
- it('creates Embed components', () => {
- expect(wrapper.findAllComponents(MetricEmbed)).toHaveLength(2);
- });
-
- it('passes the correct props to the Embed components', () => {
- expect(wrapper.findAllComponents(MetricEmbed).wrappers.map((item) => item.props())).toEqual(
- multipleEmbedProps(),
- );
- });
-
- it('adds multiple monitoring dashboard modules', () => {
- expect(store.dispatch).toHaveBeenCalledWith(addModuleAction, 'monitoringDashboard/0');
- expect(store.dispatch).toHaveBeenCalledWith(addModuleAction, 'monitoringDashboard/1');
- });
- });
-
- describe('button text', () => {
- it('has a singular label when there is one embed', () => {
- metricsWithDataGetter.mockReturnValue([1]);
- mountComponent({ shallow: false, stubs: { MetricEmbed: true } });
-
- expect(wrapper.findComponent(GlButton).text()).toBe('Hide chart');
- });
-
- it('has a plural label when there are multiple embeds', () => {
- metricsWithDataGetter.mockReturnValue([2]);
- mountComponent({ shallow: false, stubs: { MetricEmbed: true } });
-
- expect(wrapper.findComponent(GlButton).text()).toBe('Hide charts');
- });
- });
-});
diff --git a/spec/frontend/monitoring/components/embeds/metric_embed_spec.js b/spec/frontend/monitoring/components/embeds/metric_embed_spec.js
deleted file mode 100644
index db25d524592..00000000000
--- a/spec/frontend/monitoring/components/embeds/metric_embed_spec.js
+++ /dev/null
@@ -1,100 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import Vue from 'vue';
-import Vuex from 'vuex';
-import { setHTMLFixture } from 'helpers/fixtures';
-import { TEST_HOST } from 'helpers/test_constants';
-import DashboardPanel from '~/monitoring/components/dashboard_panel.vue';
-import MetricEmbed from '~/monitoring/components/embeds/metric_embed.vue';
-import { groups, initialState, metricsData, metricsWithData } from './mock_data';
-
-Vue.use(Vuex);
-
-describe('MetricEmbed', () => {
- let wrapper;
- let store;
- let actions;
- let metricsWithDataGetter;
-
- function mountComponent() {
- wrapper = shallowMount(MetricEmbed, {
- store,
- propsData: {
- dashboardUrl: TEST_HOST,
- },
- });
- }
-
- beforeEach(() => {
- setHTMLFixture('<div class="layout-page"></div>');
-
- actions = {
- setInitialState: jest.fn(),
- setShowErrorBanner: jest.fn(),
- setTimeRange: jest.fn(),
- fetchDashboard: jest.fn(),
- };
-
- metricsWithDataGetter = jest.fn();
-
- store = new Vuex.Store({
- modules: {
- monitoringDashboard: {
- namespaced: true,
- actions,
- getters: {
- metricsWithData: () => metricsWithDataGetter,
- },
- state: initialState,
- },
- },
- });
- });
-
- afterEach(() => {
- metricsWithDataGetter.mockClear();
- });
-
- describe('no metrics are available yet', () => {
- beforeEach(() => {
- mountComponent();
- });
-
- it('shows an empty state when no metrics are present', () => {
- expect(wrapper.find('.metrics-embed').exists()).toBe(true);
- expect(wrapper.findComponent(DashboardPanel).exists()).toBe(false);
- });
- });
-
- describe('metrics are available', () => {
- beforeEach(() => {
- store.state.monitoringDashboard.dashboard.panelGroups = groups;
- store.state.monitoringDashboard.dashboard.panelGroups[0].panels = metricsData;
-
- metricsWithDataGetter.mockReturnValue(metricsWithData);
-
- mountComponent();
- });
-
- it('calls actions to fetch data', () => {
- const expectedTimeRangePayload = expect.objectContaining({
- start: expect.any(String),
- end: expect.any(String),
- });
-
- expect(actions.setTimeRange).toHaveBeenCalledTimes(1);
- expect(actions.setTimeRange.mock.calls[0][1]).toEqual(expectedTimeRangePayload);
-
- expect(actions.fetchDashboard).toHaveBeenCalled();
- });
-
- it('shows a chart when metrics are present', () => {
- expect(wrapper.find('.metrics-embed').exists()).toBe(true);
- expect(wrapper.findComponent(DashboardPanel).exists()).toBe(true);
- expect(wrapper.findAllComponents(DashboardPanel).length).toBe(2);
- });
-
- it('includes groupId with dashboardUrl', () => {
- expect(wrapper.findComponent(DashboardPanel).props('groupId')).toBe(TEST_HOST);
- });
- });
-});
diff --git a/spec/frontend/monitoring/components/embeds/mock_data.js b/spec/frontend/monitoring/components/embeds/mock_data.js
deleted file mode 100644
index e32e1a08cdb..00000000000
--- a/spec/frontend/monitoring/components/embeds/mock_data.js
+++ /dev/null
@@ -1,86 +0,0 @@
-import { TEST_HOST } from 'helpers/test_constants';
-
-export const metricsWithData = ['15_metric_a', '16_metric_b'];
-
-export const groups = [
- {
- panels: [
- {
- title: 'Memory Usage (Total)',
- type: 'area-chart',
- y_label: 'Total Memory Used',
- metrics: null,
- },
- ],
- },
-];
-
-const result = [
- {
- values: [
- ['Mon', 1220],
- ['Tue', 932],
- ['Wed', 901],
- ['Thu', 934],
- ['Fri', 1290],
- ['Sat', 1330],
- ['Sun', 1320],
- ],
- },
-];
-
-export const metricsData = [
- {
- metrics: [
- {
- metricId: '15_metric_a',
- result,
- },
- ],
- },
- {
- metrics: [
- {
- metricId: '16_metric_b',
- result,
- },
- ],
- },
-];
-
-export const initialState = () => ({
- dashboard: {
- panel_groups: [],
- },
-});
-
-export const initialEmbedGroupState = () => ({
- modules: [],
-});
-
-export const singleEmbedProps = () => ({
- dashboardUrl: TEST_HOST,
- containerClass: 'col-lg-12',
- namespace: 'monitoringDashboard/0',
-});
-
-export const dashboardEmbedProps = () => ({
- dashboardUrl: TEST_HOST,
- containerClass: 'col-lg-6',
- namespace: 'monitoringDashboard/0',
-});
-
-export const multipleEmbedProps = () => [
- {
- dashboardUrl: TEST_HOST,
- containerClass: 'col-lg-6',
- namespace: 'monitoringDashboard/0',
- },
- {
- dashboardUrl: TEST_HOST,
- containerClass: 'col-lg-6',
- namespace: 'monitoringDashboard/1',
- },
-];
-
-export const addModuleAction = 'embedGroup/addModule';
diff --git a/spec/frontend/monitoring/components/empty_state_spec.js b/spec/frontend/monitoring/components/empty_state_spec.js
deleted file mode 100644
index ddefa8c5cd0..00000000000
--- a/spec/frontend/monitoring/components/empty_state_spec.js
+++ /dev/null
@@ -1,55 +0,0 @@
-import { GlLoadingIcon, GlEmptyState } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import EmptyState from '~/monitoring/components/empty_state.vue';
-import { dashboardEmptyStates } from '~/monitoring/constants';
-
-function createComponent(props) {
- return shallowMount(EmptyState, {
- propsData: {
- settingsPath: '/settingsPath',
- clustersPath: '/clustersPath',
- documentationPath: '/documentationPath',
- emptyGettingStartedSvgPath: '/path/to/getting-started.svg',
- emptyLoadingSvgPath: '/path/to/loading.svg',
- emptyNoDataSvgPath: '/path/to/no-data.svg',
- emptyNoDataSmallSvgPath: '/path/to/no-data-small.svg',
- emptyUnableToConnectSvgPath: '/path/to/unable-to-connect.svg',
- ...props,
- },
- });
-}
-
-describe('EmptyState', () => {
- it('shows loading state with a loading icon', () => {
- const wrapper = createComponent({
- selectedState: dashboardEmptyStates.LOADING,
- });
-
- expect(wrapper.findComponent(GlLoadingIcon).exists()).toBe(true);
- expect(wrapper.findComponent(GlEmptyState).exists()).toBe(false);
- });
-
- it('shows gettingStarted state', () => {
- const wrapper = createComponent({
- selectedState: dashboardEmptyStates.GETTING_STARTED,
- });
-
- expect(wrapper.element).toMatchSnapshot();
- });
-
- it('shows unableToConnect state', () => {
- const wrapper = createComponent({
- selectedState: dashboardEmptyStates.UNABLE_TO_CONNECT,
- });
-
- expect(wrapper.element).toMatchSnapshot();
- });
-
- it('shows noData state', () => {
- const wrapper = createComponent({
- selectedState: dashboardEmptyStates.NO_DATA,
- });
-
- expect(wrapper.element).toMatchSnapshot();
- });
-});
diff --git a/spec/frontend/monitoring/components/graph_group_spec.js b/spec/frontend/monitoring/components/graph_group_spec.js
deleted file mode 100644
index 593d832f297..00000000000
--- a/spec/frontend/monitoring/components/graph_group_spec.js
+++ /dev/null
@@ -1,144 +0,0 @@
-import { GlLoadingIcon, GlIcon } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import { nextTick } from 'vue';
-import GraphGroup from '~/monitoring/components/graph_group.vue';
-
-describe('Graph group component', () => {
- let wrapper;
-
- const findGroup = () => wrapper.findComponent({ ref: 'graph-group' });
- const findContent = () => wrapper.findComponent({ ref: 'graph-group-content' });
- const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
- const findCaretIcon = () => wrapper.findComponent(GlIcon);
- const findToggleButton = () => wrapper.find('[data-testid="group-toggle-button"]');
-
- const createComponent = (propsData) => {
- wrapper = shallowMount(GraphGroup, {
- propsData,
- });
- };
-
- describe('When group is not collapsed', () => {
- beforeEach(() => {
- createComponent({
- name: 'panel',
- collapseGroup: false,
- });
- });
-
- it('should not show a loading icon', () => {
- expect(findLoadingIcon().exists()).toBe(false);
- });
-
- it('should show the chevron-lg-down caret icon', () => {
- expect(findContent().isVisible()).toBe(true);
- expect(findCaretIcon().props('name')).toBe('chevron-lg-down');
- });
-
- it('should show the chevron-lg-right caret icon when the user collapses the group', async () => {
- findToggleButton().trigger('click');
-
- await nextTick();
- expect(findContent().isVisible()).toBe(false);
- expect(findCaretIcon().props('name')).toBe('chevron-lg-right');
- });
-
- it('should contain a tab index for the collapse button', () => {
- const groupToggle = findToggleButton();
-
- expect(groupToggle.attributes('tabindex')).toBeDefined();
- });
-
- it('should show the open the group when collapseGroup is set to true', async () => {
- wrapper.setProps({
- collapseGroup: true,
- });
-
- await nextTick();
- expect(findContent().isVisible()).toBe(true);
- expect(findCaretIcon().props('name')).toBe('chevron-lg-down');
- });
- });
-
- describe('When group is collapsed', () => {
- beforeEach(() => {
- createComponent({
- name: 'panel',
- collapseGroup: true,
- });
- });
-
- it('should show the chevron-lg-down caret icon when collapseGroup is true', () => {
- expect(findCaretIcon().props('name')).toBe('chevron-lg-right');
- });
-
- it('should show the chevron-lg-right caret icon when collapseGroup is false', async () => {
- findToggleButton().trigger('click');
-
- await nextTick();
- expect(findCaretIcon().props('name')).toBe('chevron-lg-down');
- });
-
- it('should call collapse the graph group content when enter is pressed on the caret icon', () => {
- const graphGroupContent = findContent();
- const button = findToggleButton();
-
- button.trigger('keyup.enter');
-
- expect(graphGroupContent.isVisible()).toBe(false);
- });
- });
-
- describe('When groups can not be collapsed', () => {
- beforeEach(() => {
- createComponent({
- name: 'panel',
- showPanels: false,
- collapseGroup: false,
- });
- });
-
- it('should not have a container when showPanels is false', () => {
- expect(findGroup().exists()).toBe(false);
- expect(findContent().exists()).toBe(true);
- });
- });
-
- describe('When group is loading', () => {
- beforeEach(() => {
- createComponent({
- name: 'panel',
- isLoading: true,
- });
- });
-
- it('should show a loading icon', () => {
- expect(findLoadingIcon().exists()).toBe(true);
- });
- });
-
- describe('When group does not show a panel heading', () => {
- beforeEach(() => {
- createComponent({
- name: 'panel',
- showPanels: false,
- collapseGroup: false,
- });
- });
-
- it('should collapse the panel content', () => {
- expect(findContent().isVisible()).toBe(true);
- expect(findCaretIcon().exists()).toBe(false);
- });
-
- it('should show the panel content when collapse is set to false', async () => {
- wrapper.setProps({
- collapseGroup: false,
- });
-
- await nextTick();
- expect(findContent().isVisible()).toBe(true);
- expect(findCaretIcon().exists()).toBe(false);
- });
- });
-});
diff --git a/spec/frontend/monitoring/components/group_empty_state_spec.js b/spec/frontend/monitoring/components/group_empty_state_spec.js
deleted file mode 100644
index d3a48be7939..00000000000
--- a/spec/frontend/monitoring/components/group_empty_state_spec.js
+++ /dev/null
@@ -1,47 +0,0 @@
-import { GlEmptyState } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import { stubComponent } from 'helpers/stub_component';
-import GroupEmptyState from '~/monitoring/components/group_empty_state.vue';
-import { metricStates } from '~/monitoring/constants';
-
-function createComponent(props) {
- return shallowMount(GroupEmptyState, {
- propsData: {
- ...props,
- documentationPath: '/path/to/docs',
- settingsPath: '/path/to/settings',
- svgPath: '/path/to/empty-group-illustration.svg',
- },
- stubs: {
- GlEmptyState: stubComponent(GlEmptyState, {
- template: '<div><slot name="description"></slot></div>',
- }),
- },
- });
-}
-
-describe('GroupEmptyState', () => {
- let wrapper;
-
- describe.each([
- metricStates.NO_DATA,
- metricStates.TIMEOUT,
- metricStates.CONNECTION_FAILED,
- metricStates.BAD_QUERY,
- metricStates.LOADING,
- metricStates.UNKNOWN_ERROR,
- 'FOO STATE', // does not fail with unknown states
- ])('given state %s', (selectedState) => {
- beforeEach(() => {
- wrapper = createComponent({ selectedState });
- });
-
- it('renders the slotted content', () => {
- expect(wrapper.element).toMatchSnapshot();
- });
-
- it('passes the expected props to GlEmptyState', () => {
- expect(wrapper.findComponent(GlEmptyState).props()).toMatchSnapshot();
- });
- });
-});
diff --git a/spec/frontend/monitoring/components/links_section_spec.js b/spec/frontend/monitoring/components/links_section_spec.js
deleted file mode 100644
index 94938e7f459..00000000000
--- a/spec/frontend/monitoring/components/links_section_spec.js
+++ /dev/null
@@ -1,64 +0,0 @@
-import { GlLink } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import { nextTick } from 'vue';
-
-import LinksSection from '~/monitoring/components/links_section.vue';
-import { createStore } from '~/monitoring/stores';
-
-describe('Links Section component', () => {
- let store;
- let wrapper;
-
- const createShallowWrapper = () => {
- wrapper = shallowMount(LinksSection, {
- store,
- });
- };
- const setState = (links) => {
- store.state.monitoringDashboard = {
- ...store.state.monitoringDashboard,
- emptyState: null,
- links,
- };
- };
- const findLinks = () => wrapper.findAllComponents(GlLink);
-
- beforeEach(() => {
- store = createStore();
- createShallowWrapper();
- });
-
- it('does not render a section if no links are present', async () => {
- setState();
-
- await nextTick();
-
- expect(findLinks().length).toBe(0);
- });
-
- it('renders a link inside a section', async () => {
- setState([
- {
- title: 'GitLab Website',
- url: 'https://gitlab.com',
- },
- ]);
-
- await nextTick();
- expect(findLinks()).toHaveLength(1);
- const firstLink = findLinks().at(0);
-
- expect(firstLink.attributes('href')).toBe('https://gitlab.com');
- expect(firstLink.text()).toBe('GitLab Website');
- });
-
- it('renders multiple links inside a section', async () => {
- const links = new Array(10)
- .fill(null)
- .map((_, i) => ({ title: `Title ${i}`, url: `https://gitlab.com/projects/${i}` }));
- setState(links);
-
- await nextTick();
- expect(findLinks()).toHaveLength(10);
- });
-});
diff --git a/spec/frontend/monitoring/components/refresh_button_spec.js b/spec/frontend/monitoring/components/refresh_button_spec.js
deleted file mode 100644
index f6cc6789b1f..00000000000
--- a/spec/frontend/monitoring/components/refresh_button_spec.js
+++ /dev/null
@@ -1,139 +0,0 @@
-import { GlDropdown, GlDropdownItem, GlButton } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import Visibility from 'visibilityjs';
-import { nextTick } from 'vue';
-import RefreshButton from '~/monitoring/components/refresh_button.vue';
-import { createStore } from '~/monitoring/stores';
-
-describe('RefreshButton', () => {
- let wrapper;
- let store;
- let dispatch;
- let documentHidden;
-
- const createWrapper = (options = {}) => {
- wrapper = shallowMount(RefreshButton, { store, ...options });
- };
-
- const findRefreshBtn = () => wrapper.findComponent(GlButton);
- const findDropdown = () => wrapper.findComponent(GlDropdown);
- const findOptions = () => findDropdown().findAllComponents(GlDropdownItem);
- const findOptionAt = (index) => findOptions().at(index);
-
- const expectFetchDataToHaveBeenCalledTimes = (times) => {
- const refreshCalls = dispatch.mock.calls.filter(([action, payload]) => {
- return action === 'monitoringDashboard/fetchDashboardData' && payload === undefined;
- });
- expect(refreshCalls).toHaveLength(times);
- };
-
- beforeEach(() => {
- store = createStore();
- jest.spyOn(store, 'dispatch').mockResolvedValue();
- dispatch = store.dispatch;
-
- documentHidden = false;
- jest.spyOn(Visibility, 'hidden').mockImplementation(() => documentHidden);
-
- createWrapper();
- });
-
- afterEach(() => {
- dispatch.mockReset();
- // eslint-disable-next-line @gitlab/vtu-no-explicit-wrapper-destroy
- wrapper.destroy();
- });
-
- it('refreshes data when "refresh" is clicked', () => {
- findRefreshBtn().vm.$emit('click');
- expectFetchDataToHaveBeenCalledTimes(1);
- });
-
- it('refresh rate is "Off" in the dropdown', () => {
- expect(findDropdown().props('text')).toBe('Off');
- });
-
- describe('refresh rate options', () => {
- it('presents multiple options', () => {
- expect(findOptions().length).toBeGreaterThan(1);
- });
-
- it('presents an "Off" option as the default option', () => {
- expect(findOptionAt(0).text()).toBe('Off');
- expect(findOptionAt(0).props('isChecked')).toBe(true);
- });
- });
-
- describe('when a refresh rate is chosen', () => {
- const optIndex = 2; // Other option than "Off"
-
- beforeEach(async () => {
- findOptionAt(optIndex).vm.$emit('click');
- await nextTick();
- });
-
- it('refresh rate appears in the dropdown', () => {
- expect(findDropdown().props('text')).toBe('10s');
- });
-
- it('refresh rate option is checked', () => {
- expect(findOptionAt(0).props('isChecked')).toBe(false);
- expect(findOptionAt(optIndex).props('isChecked')).toBe(true);
- });
-
- it('refreshes data when a new refresh rate is chosen', () => {
- expectFetchDataToHaveBeenCalledTimes(1);
- });
-
- it('refreshes data after two intervals of time have passed', async () => {
- jest.runOnlyPendingTimers();
- expectFetchDataToHaveBeenCalledTimes(2);
-
- await nextTick();
-
- jest.runOnlyPendingTimers();
- expectFetchDataToHaveBeenCalledTimes(3);
- });
-
- it('does not refresh data if the document is hidden', async () => {
- documentHidden = true;
-
- jest.runOnlyPendingTimers();
- expectFetchDataToHaveBeenCalledTimes(1);
-
- await nextTick();
-
- jest.runOnlyPendingTimers();
- expectFetchDataToHaveBeenCalledTimes(1);
- });
-
- it('data is not refreshed anymore after component is destroyed', () => {
- expect(jest.getTimerCount()).toBe(1);
-
- wrapper.destroy();
-
- expect(jest.getTimerCount()).toBe(0);
- });
-
- describe('when "Off" refresh rate is chosen', () => {
- beforeEach(async () => {
- findOptionAt(0).vm.$emit('click');
- await nextTick();
- });
-
- it('refresh rate is "Off" in the dropdown', () => {
- expect(findDropdown().props('text')).toBe('Off');
- });
-
- it('refresh rate option is appears selected', () => {
- expect(findOptionAt(0).props('isChecked')).toBe(true);
- expect(findOptionAt(optIndex).props('isChecked')).toBe(false);
- });
-
- it('stops refreshing data', () => {
- jest.runOnlyPendingTimers();
- expectFetchDataToHaveBeenCalledTimes(1);
- });
- });
- });
-});
diff --git a/spec/frontend/monitoring/components/variables/dropdown_field_spec.js b/spec/frontend/monitoring/components/variables/dropdown_field_spec.js
deleted file mode 100644
index e6c5569fa19..00000000000
--- a/spec/frontend/monitoring/components/variables/dropdown_field_spec.js
+++ /dev/null
@@ -1,62 +0,0 @@
-import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import DropdownField from '~/monitoring/components/variables/dropdown_field.vue';
-
-describe('Custom variable component', () => {
- let wrapper;
-
- const defaultProps = {
- name: 'env',
- label: 'Select environment',
- value: 'Production',
- options: {
- values: [
- { text: 'Production', value: 'prod' },
- { text: 'Canary', value: 'canary' },
- ],
- },
- };
-
- const createShallowWrapper = (props) => {
- wrapper = shallowMount(DropdownField, {
- propsData: {
- ...defaultProps,
- ...props,
- },
- });
- };
-
- const findDropdown = () => wrapper.findComponent(GlDropdown);
- const findDropdownItems = () => wrapper.findAllComponents(GlDropdownItem);
-
- it('renders dropdown element when all necessary props are passed', () => {
- createShallowWrapper();
-
- expect(findDropdown().exists()).toBe(true);
- });
-
- it('renders dropdown element with a text', () => {
- createShallowWrapper();
-
- expect(findDropdown().attributes('text')).toBe(defaultProps.value);
- });
-
- it('renders all the dropdown items', () => {
- createShallowWrapper();
-
- expect(findDropdownItems()).toHaveLength(defaultProps.options.values.length);
- });
-
- it('renders dropdown when values are missing', () => {
- createShallowWrapper({ options: {} });
-
- expect(findDropdown().exists()).toBe(true);
- });
-
- it('changing dropdown items triggers update', () => {
- createShallowWrapper();
- findDropdownItems().at(1).vm.$emit('click');
-
- expect(wrapper.emitted('input')).toEqual([['canary']]);
- });
-});
diff --git a/spec/frontend/monitoring/components/variables/text_field_spec.js b/spec/frontend/monitoring/components/variables/text_field_spec.js
deleted file mode 100644
index 20e1937c5ac..00000000000
--- a/spec/frontend/monitoring/components/variables/text_field_spec.js
+++ /dev/null
@@ -1,55 +0,0 @@
-import { GlFormInput } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import { nextTick } from 'vue';
-import TextField from '~/monitoring/components/variables/text_field.vue';
-
-describe('Text variable component', () => {
- let wrapper;
- const propsData = {
- name: 'pod',
- label: 'Select pod',
- value: 'test-pod',
- };
- const createShallowWrapper = () => {
- wrapper = shallowMount(TextField, {
- propsData,
- });
- };
-
- const findInput = () => wrapper.findComponent(GlFormInput);
-
- it('renders a text input when all props are passed', () => {
- createShallowWrapper();
-
- expect(findInput().exists()).toBe(true);
- });
-
- it('always has a default value', async () => {
- createShallowWrapper();
-
- await nextTick();
- expect(findInput().attributes('value')).toBe(propsData.value);
- });
-
- it('triggers keyup enter', async () => {
- createShallowWrapper();
-
- findInput().element.value = 'prod-pod';
- findInput().trigger('input');
- findInput().trigger('keyup.enter');
-
- await nextTick();
- expect(wrapper.emitted('input')).toEqual([['prod-pod']]);
- });
-
- it('triggers blur enter', async () => {
- createShallowWrapper();
-
- findInput().element.value = 'canary-pod';
- findInput().trigger('input');
- findInput().trigger('blur');
-
- await nextTick();
- expect(wrapper.emitted('input')).toEqual([['canary-pod']]);
- });
-});
diff --git a/spec/frontend/monitoring/components/variables_section_spec.js b/spec/frontend/monitoring/components/variables_section_spec.js
deleted file mode 100644
index d6f8aac99aa..00000000000
--- a/spec/frontend/monitoring/components/variables_section_spec.js
+++ /dev/null
@@ -1,125 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import Vuex from 'vuex';
-import { nextTick } from 'vue';
-import { updateHistory, mergeUrlParams } from '~/lib/utils/url_utility';
-import DropdownField from '~/monitoring/components/variables/dropdown_field.vue';
-import TextField from '~/monitoring/components/variables/text_field.vue';
-import VariablesSection from '~/monitoring/components/variables_section.vue';
-import { createStore } from '~/monitoring/stores';
-import { convertVariablesForURL } from '~/monitoring/utils';
-import { storeVariables } from '../mock_data';
-
-jest.mock('~/lib/utils/url_utility', () => ({
- updateHistory: jest.fn(),
- mergeUrlParams: jest.fn(),
-}));
-
-describe('Metrics dashboard/variables section component', () => {
- let store;
- let wrapper;
-
- const createShallowWrapper = () => {
- wrapper = shallowMount(VariablesSection, {
- store,
- });
- };
-
- const findTextInputs = () => wrapper.findAllComponents(TextField);
- const findCustomInputs = () => wrapper.findAllComponents(DropdownField);
-
- beforeEach(() => {
- store = createStore();
-
- store.state.monitoringDashboard.emptyState = null;
- });
-
- it('does not show the variables section', () => {
- createShallowWrapper();
- const allInputs = findTextInputs().length + findCustomInputs().length;
-
- expect(allInputs).toBe(0);
- });
-
- describe('when variables are set', () => {
- beforeEach(async () => {
- store.state.monitoringDashboard.variables = storeVariables;
- createShallowWrapper();
-
- await nextTick();
- });
-
- it('shows the variables section', () => {
- const allInputs = findTextInputs().length + findCustomInputs().length;
-
- expect(allInputs).toBe(storeVariables.length);
- });
-
- it('shows the right custom variable inputs', () => {
- const customInputs = findCustomInputs();
-
- expect(customInputs.at(0).props('name')).toBe('customSimple');
- expect(customInputs.at(1).props('name')).toBe('customAdvanced');
- });
- });
-
- describe('when changing the variable inputs', () => {
- const updateVariablesAndFetchData = jest.fn();
-
- beforeEach(() => {
- store = new Vuex.Store({
- modules: {
- monitoringDashboard: {
- namespaced: true,
- state: {
- emptyState: null,
- variables: storeVariables,
- },
- actions: {
- updateVariablesAndFetchData,
- },
- },
- },
- });
-
- createShallowWrapper();
- });
-
- it('merges the url params and refreshes the dashboard when a text-based variables inputs are updated', async () => {
- const firstInput = findTextInputs().at(0);
-
- firstInput.vm.$emit('input', 'test');
-
- await nextTick();
- expect(updateVariablesAndFetchData).toHaveBeenCalled();
- expect(mergeUrlParams).toHaveBeenCalledWith(
- convertVariablesForURL(storeVariables),
- window.location.href,
- );
- expect(updateHistory).toHaveBeenCalled();
- });
-
- it('merges the url params and refreshes the dashboard when a custom-based variables inputs are updated', async () => {
- const firstInput = findCustomInputs().at(0);
-
- firstInput.vm.$emit('input', 'test');
-
- await nextTick();
- expect(updateVariablesAndFetchData).toHaveBeenCalled();
- expect(mergeUrlParams).toHaveBeenCalledWith(
- convertVariablesForURL(storeVariables),
- window.location.href,
- );
- expect(updateHistory).toHaveBeenCalled();
- });
-
- it('does not merge the url params and refreshes the dashboard if the value entered is not different that is what currently stored', () => {
- const firstInput = findTextInputs().at(0);
-
- firstInput.vm.$emit('input', 'My default value');
-
- expect(updateVariablesAndFetchData).not.toHaveBeenCalled();
- expect(mergeUrlParams).not.toHaveBeenCalled();
- expect(updateHistory).not.toHaveBeenCalled();
- });
- });
-});
diff --git a/spec/frontend/monitoring/csv_export_spec.js b/spec/frontend/monitoring/csv_export_spec.js
deleted file mode 100644
index 42d19c21a7b..00000000000
--- a/spec/frontend/monitoring/csv_export_spec.js
+++ /dev/null
@@ -1,126 +0,0 @@
-import { graphDataToCsv } from '~/monitoring/csv_export';
-import { timeSeriesGraphData } from './graph_data';
-
-describe('monitoring export_csv', () => {
- describe('graphDataToCsv', () => {
- const expectCsvToMatchLines = (csv, lines) => expect(`${lines.join('\r\n')}\r\n`).toEqual(csv);
-
- it('should return a csv with 0 metrics', () => {
- const data = timeSeriesGraphData({}, { metricCount: 0 });
-
- expect(graphDataToCsv(data)).toEqual('');
- });
-
- it('should return a csv with 1 metric with no data', () => {
- const data = timeSeriesGraphData({}, { metricCount: 1 });
-
- // When state is NO_DATA, result is null
- data.metrics[0].result = null;
-
- expect(graphDataToCsv(data)).toEqual('');
- });
-
- it('should return a csv with 1 metric', () => {
- const data = timeSeriesGraphData({}, { metricCount: 1 });
-
- expectCsvToMatchLines(graphDataToCsv(data), [
- `timestamp,"Y Axis > Metric 1"`,
- '2015-07-01T20:10:50.000Z,1',
- '2015-07-01T20:12:50.000Z,2',
- '2015-07-01T20:14:50.000Z,3',
- ]);
- });
-
- it('should return a csv with multiple metrics and one with no data', () => {
- const data = timeSeriesGraphData({}, { metricCount: 2 });
-
- // When state is NO_DATA, result is null
- data.metrics[0].result = null;
-
- expectCsvToMatchLines(graphDataToCsv(data), [
- `timestamp,"Y Axis > Metric 2"`,
- '2015-07-01T20:10:50.000Z,1',
- '2015-07-01T20:12:50.000Z,2',
- '2015-07-01T20:14:50.000Z,3',
- ]);
- });
-
- it('should return a csv when not all metrics have the same timestamps', () => {
- const data = timeSeriesGraphData({}, { metricCount: 3 });
-
- // Add an "odd" timestamp that is not in the dataset
- Object.assign(data.metrics[2].result[0], {
- value: ['2016-01-01T00:00:00.000Z', 9],
- values: [['2016-01-01T00:00:00.000Z', 9]],
- });
-
- expectCsvToMatchLines(graphDataToCsv(data), [
- `timestamp,"Y Axis > Metric 1","Y Axis > Metric 2","Y Axis > Metric 3"`,
- '2015-07-01T20:10:50.000Z,1,1,',
- '2015-07-01T20:12:50.000Z,2,2,',
- '2015-07-01T20:14:50.000Z,3,3,',
- '2016-01-01T00:00:00.000Z,,,9',
- ]);
- });
-
- it('should escape double quotes in metric labels with two double quotes ("")', () => {
- const data = timeSeriesGraphData({}, { metricCount: 1 });
-
- data.metrics[0].label = 'My "quoted" metric';
-
- expectCsvToMatchLines(graphDataToCsv(data), [
- `timestamp,"Y Axis > My ""quoted"" metric"`,
- '2015-07-01T20:10:50.000Z,1',
- '2015-07-01T20:12:50.000Z,2',
- '2015-07-01T20:14:50.000Z,3',
- ]);
- });
-
- it('should return a csv with multiple metrics', () => {
- const data = timeSeriesGraphData({}, { metricCount: 3 });
-
- expectCsvToMatchLines(graphDataToCsv(data), [
- `timestamp,"Y Axis > Metric 1","Y Axis > Metric 2","Y Axis > Metric 3"`,
- '2015-07-01T20:10:50.000Z,1,1,1',
- '2015-07-01T20:12:50.000Z,2,2,2',
- '2015-07-01T20:14:50.000Z,3,3,3',
- ]);
- });
-
- it('should return a csv with 1 metric and multiple series with labels', () => {
- const data = timeSeriesGraphData({}, { isMultiSeries: true });
-
- expectCsvToMatchLines(graphDataToCsv(data), [
- `timestamp,"Y Axis > Metric 1","Y Axis > Metric 1"`,
- '2015-07-01T20:10:50.000Z,1,4',
- '2015-07-01T20:12:50.000Z,2,5',
- '2015-07-01T20:14:50.000Z,3,6',
- ]);
- });
-
- it('should return a csv with 1 metric and multiple series', () => {
- const data = timeSeriesGraphData({}, { isMultiSeries: true, withLabels: false });
-
- expectCsvToMatchLines(graphDataToCsv(data), [
- `timestamp,"Y Axis > __name__: up, job: prometheus, instance: localhost:9090","Y Axis > __name__: up, job: node, instance: localhost:9091"`,
- '2015-07-01T20:10:50.000Z,1,4',
- '2015-07-01T20:12:50.000Z,2,5',
- '2015-07-01T20:14:50.000Z,3,6',
- ]);
- });
-
- it('should return a csv with multiple metrics and multiple series', () => {
- const data = timeSeriesGraphData(
- {},
- { metricCount: 3, isMultiSeries: true, withLabels: false },
- );
-
- expectCsvToMatchLines(graphDataToCsv(data), [
- `timestamp,"Y Axis > __name__: up, job: prometheus, instance: localhost:9090","Y Axis > __name__: up, job: node, instance: localhost:9091","Y Axis > __name__: up, job: prometheus, instance: localhost:9090","Y Axis > __name__: up, job: node, instance: localhost:9091","Y Axis > __name__: up, job: prometheus, instance: localhost:9090","Y Axis > __name__: up, job: node, instance: localhost:9091"`,
- '2015-07-01T20:10:50.000Z,1,4,1,4,1,4',
- '2015-07-01T20:12:50.000Z,2,5,2,5,2,5',
- '2015-07-01T20:14:50.000Z,3,6,3,6,3,6',
- ]);
- });
- });
-});
diff --git a/spec/frontend/monitoring/fixture_data.js b/spec/frontend/monitoring/fixture_data.js
deleted file mode 100644
index f4062adea81..00000000000
--- a/spec/frontend/monitoring/fixture_data.js
+++ /dev/null
@@ -1,49 +0,0 @@
-import fixture from 'test_fixtures/metrics_dashboard/environment_metrics_dashboard.json';
-import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
-import { metricStates } from '~/monitoring/constants';
-import { mapToDashboardViewModel } from '~/monitoring/stores/utils';
-import { stateAndPropsFromDataset } from '~/monitoring/utils';
-
-import { metricsResult } from './mock_data';
-
-export const metricsDashboardResponse = fixture;
-
-export const metricsDashboardPayload = metricsDashboardResponse.dashboard;
-
-const datasetState = stateAndPropsFromDataset(
- convertObjectPropsToCamelCase(metricsDashboardResponse.metrics_data),
-);
-
-// new properties like addDashboardDocumentationPath prop
-// was recently added to dashboard.vue component this needs to be
-// added to fixtures data
-// https://gitlab.com/gitlab-org/gitlab/-/issues/229256
-export const dashboardProps = {
- ...datasetState.dataProps,
-};
-
-export const metricsDashboardViewModel = mapToDashboardViewModel(metricsDashboardPayload);
-
-export const metricsDashboardPanelCount = 22;
-
-// Graph data
-
-const firstPanel = metricsDashboardViewModel.panelGroups[0].panels[0];
-
-export const graphData = {
- ...firstPanel,
- metrics: firstPanel.metrics.map((metric) => ({
- ...metric,
- result: metricsResult,
- state: metricStates.OK,
- })),
-};
-
-export const graphDataEmpty = {
- ...firstPanel,
- metrics: firstPanel.metrics.map((metric) => ({
- ...metric,
- result: [],
- state: metricStates.NO_DATA,
- })),
-};
diff --git a/spec/frontend/monitoring/graph_data.js b/spec/frontend/monitoring/graph_data.js
deleted file mode 100644
index 981955efebb..00000000000
--- a/spec/frontend/monitoring/graph_data.js
+++ /dev/null
@@ -1,274 +0,0 @@
-import { panelTypes, metricStates } from '~/monitoring/constants';
-import { mapPanelToViewModel, normalizeQueryResponseData } from '~/monitoring/stores/utils';
-
-const initTime = 1435781450; // "Wed, 01 Jul 2015 20:10:50 GMT"
-const intervalSeconds = 120;
-
-const makeValue = (val) => [initTime, val];
-const makeValues = (vals) => vals.map((val, i) => [initTime + intervalSeconds * i, val]);
-
-// Raw Promethues Responses
-
-export const prometheusMatrixMultiResult = ({
- values1 = ['1', '2', '3'],
- values2 = ['4', '5', '6'],
-} = {}) => ({
- resultType: 'matrix',
- result: [
- {
- metric: {
- __name__: 'up',
- job: 'prometheus',
- instance: 'localhost:9090',
- },
- values: makeValues(values1),
- },
- {
- metric: {
- __name__: 'up',
- job: 'node',
- instance: 'localhost:9091',
- },
- values: makeValues(values2),
- },
- ],
-});
-
-// Normalized Prometheus Responses
-
-const scalarResult = ({ value = '1' } = {}) =>
- normalizeQueryResponseData({
- resultType: 'scalar',
- result: makeValue(value),
- });
-
-const vectorResult = ({ value1 = '1', value2 = '2' } = {}) =>
- normalizeQueryResponseData({
- resultType: 'vector',
- result: [
- {
- metric: {
- __name__: 'up',
- job: 'prometheus',
- instance: 'localhost:9090',
- },
- value: makeValue(value1),
- },
- {
- metric: {
- __name__: 'up',
- job: 'node',
- instance: 'localhost:9100',
- },
- value: makeValue(value2),
- },
- ],
- });
-
-const matrixSingleResult = ({ values = ['1', '2', '3'] } = {}) =>
- normalizeQueryResponseData({
- resultType: 'matrix',
- result: [
- {
- metric: {},
- values: makeValues(values),
- },
- ],
- });
-
-const matrixMultiResult = ({ values1 = ['1', '2', '3'], values2 = ['4', '5', '6'] } = {}) =>
- normalizeQueryResponseData({
- resultType: 'matrix',
- result: [
- {
- metric: {
- __name__: 'up',
- job: 'prometheus',
- instance: 'localhost:9090',
- },
- values: makeValues(values1),
- },
- {
- metric: {
- __name__: 'up',
- job: 'node',
- instance: 'localhost:9091',
- },
- values: makeValues(values2),
- },
- ],
- });
-
-// GraphData factory
-
-/**
- * Generate mock graph data according to options
- *
- * @param {Object} panelOptions - Panel options as in YML.
- * @param {Object} dataOptions
- * @param {Object} dataOptions.metricCount
- * @param {Object} dataOptions.isMultiSeries
- */
-export const timeSeriesGraphData = (panelOptions = {}, dataOptions = {}) => {
- const { metricCount = 1, isMultiSeries = false, withLabels = true } = dataOptions;
-
- return mapPanelToViewModel({
- title: 'Time Series Panel',
- type: panelTypes.LINE_CHART,
- x_label: 'X Axis',
- y_label: 'Y Axis',
- metrics: Array.from(Array(metricCount), (_, i) => ({
- label: withLabels ? `Metric ${i + 1}` : undefined,
- state: metricStates.OK,
- result: isMultiSeries ? matrixMultiResult() : matrixSingleResult(),
- })),
- ...panelOptions,
- });
-};
-
-/**
- * Generate mock graph data according to options
- *
- * @param {Object} panelOptions - Panel options as in YML.
- * @param {Object} dataOptions
- * @param {Object} dataOptions.unit
- * @param {Object} dataOptions.value
- * @param {Object} dataOptions.isVector
- */
-export const singleStatGraphData = (panelOptions = {}, dataOptions = {}) => {
- const { unit, value = '1', isVector = false } = dataOptions;
-
- return mapPanelToViewModel({
- title: 'Single Stat Panel',
- type: panelTypes.SINGLE_STAT,
- metrics: [
- {
- label: 'Metric Label',
- state: metricStates.OK,
- result: isVector ? vectorResult({ value }) : scalarResult({ value }),
- unit,
- },
- ],
- ...panelOptions,
- });
-};
-
-/**
- * Generate mock graph data according to options
- *
- * @param {Object} panelOptions - Panel options as in YML.
- * @param {Object} dataOptions
- * @param {Array} dataOptions.values - Metric values
- * @param {Array} dataOptions.upper - Upper boundary values
- * @param {Array} dataOptions.lower - Lower boundary values
- */
-export const anomalyGraphData = (panelOptions = {}, dataOptions = {}) => {
- const { values, upper, lower } = dataOptions;
-
- return mapPanelToViewModel({
- title: 'Anomaly Panel',
- type: panelTypes.ANOMALY_CHART,
- x_label: 'X Axis',
- y_label: 'Y Axis',
- metrics: [
- {
- label: `Metric`,
- state: metricStates.OK,
- result: matrixSingleResult({ values }),
- },
- {
- label: `Upper boundary`,
- state: metricStates.OK,
- result: matrixSingleResult({ values: upper }),
- },
- {
- label: `Lower boundary`,
- state: metricStates.OK,
- result: matrixSingleResult({ values: lower }),
- },
- ],
- ...panelOptions,
- });
-};
-
-/**
- * Generate mock graph data for heatmaps according to options
- */
-export const heatmapGraphData = (panelOptions = {}, dataOptions = {}) => {
- const { metricCount = 1 } = dataOptions;
-
- return mapPanelToViewModel({
- title: 'Heatmap Panel',
- type: panelTypes.HEATMAP,
- x_label: 'X Axis',
- y_label: 'Y Axis',
- metrics: Array.from(Array(metricCount), (_, i) => ({
- label: `Metric ${i + 1}`,
- state: metricStates.OK,
- result: matrixMultiResult(),
- })),
- ...panelOptions,
- });
-};
-
-/**
- * Generate gauge chart mock graph data according to options
- *
- * @param {Object} panelOptions - Panel options as in YML.
- *
- */
-export const gaugeChartGraphData = (panelOptions = {}) => {
- const {
- minValue = 100,
- maxValue = 1000,
- split = 20,
- thresholds = {
- mode: 'absolute',
- values: [500, 800],
- },
- format = 'kilobytes',
- } = panelOptions;
-
- return mapPanelToViewModel({
- title: 'Gauge Chart Panel',
- type: panelTypes.GAUGE_CHART,
- min_value: minValue,
- max_value: maxValue,
- split,
- thresholds,
- format,
- metrics: [
- {
- label: `Metric`,
- state: metricStates.OK,
- result: matrixSingleResult(),
- },
- ],
- });
-};
-
-/**
- * Generates stacked mock graph data according to options
- *
- * @param {Object} panelOptions - Panel options as in YML.
- * @param {Object} dataOptions
- */
-export const stackedColumnGraphData = (panelOptions = {}, dataOptions = {}) => {
- return {
- ...timeSeriesGraphData(panelOptions, dataOptions),
- type: panelTypes.STACKED_COLUMN,
- };
-};
-
-/**
- * Generates bar mock graph data according to options
- *
- * @param {Object} panelOptions - Panel options as in YML.
- * @param {Object} dataOptions
- */
-export const barGraphData = (panelOptions = {}, dataOptions = {}) => {
- return {
- ...timeSeriesGraphData(panelOptions, dataOptions),
- type: panelTypes.BAR,
- };
-};
diff --git a/spec/frontend/monitoring/mock_data.js b/spec/frontend/monitoring/mock_data.js
deleted file mode 100644
index 1d23190e586..00000000000
--- a/spec/frontend/monitoring/mock_data.js
+++ /dev/null
@@ -1,574 +0,0 @@
-// The path below needs to be relative because we import the mock-data to karma
-import invalidUrl from '~/lib/utils/invalid_url';
-import { TEST_HOST } from '../__helpers__/test_constants';
-// This import path needs to be relative for now because this mock data is used in
-// Karma specs too, where the helpers/test_constants alias can not be resolved
-
-export const mockProjectDir = '/frontend-fixtures/environments-project';
-export const mockApiEndpoint = `${TEST_HOST}/monitoring/mock`;
-
-export const customDashboardBasePath = '.gitlab/dashboards';
-
-const customDashboardsData = new Array(30).fill(null).map((_, idx) => ({
- default: false,
- display_name: `Custom Dashboard ${idx}`,
- can_edit: true,
- system_dashboard: false,
- out_of_the_box_dashboard: false,
- project_blob_path: `${mockProjectDir}/blob/main/dashboards/.gitlab/dashboards/dashboard_${idx}.yml`,
- path: `.gitlab/dashboards/dashboard_${idx}.yml`,
- starred: false,
-}));
-
-export const mockDashboardsErrorResponse = {
- all_dashboards: customDashboardsData,
- message: "Each 'panel_group' must define an array :panels",
- status: 'error',
-};
-
-export const anomalyDeploymentData = [
- {
- id: 111,
- iid: 3,
- sha: 'f5bcd1d9dac6fa4137e2510b9ccd134ef2e84187',
- ref: {
- name: 'main',
- },
- created_at: '2019-08-19T22:00:00.000Z',
- deployed_at: '2019-08-19T22:01:00.000Z',
- tag: false,
- 'last?': true,
- },
- {
- id: 110,
- iid: 2,
- sha: 'f5bcd1d9dac6fa4137e2510b9ccd134ef2e84187',
- ref: {
- name: 'main',
- },
- created_at: '2019-08-19T23:00:00.000Z',
- deployed_at: '2019-08-19T23:00:00.000Z',
- tag: false,
- 'last?': false,
- },
-];
-
-export const deploymentData = [
- {
- id: 111,
- iid: 3,
- sha: 'f5bcd1d9dac6fa4137e2510b9ccd134ef2e84187',
- commitUrl:
- 'http://test.host/frontend-fixtures/environments-project/-/commit/f5bcd1d9dac6fa4137e2510b9ccd134ef2e84187',
- ref: {
- name: 'main',
- },
- created_at: '2019-07-16T10:14:25.589Z',
- tag: false,
- tagUrl: 'http://test.host/frontend-fixtures/environments-project/tags/false',
- 'last?': true,
- },
- {
- id: 110,
- iid: 2,
- sha: 'f5bcd1d9dac6fa4137e2510b9ccd134ef2e84187',
- commitUrl:
- 'http://test.host/frontend-fixtures/environments-project/-/commit/f5bcd1d9dac6fa4137e2510b9ccd134ef2e84187',
- ref: {
- name: 'main',
- },
- created_at: '2019-07-16T11:14:25.589Z',
- tag: false,
- tagUrl: 'http://test.host/frontend-fixtures/environments-project/tags/false',
- 'last?': false,
- },
- {
- id: 109,
- iid: 1,
- sha: '6511e58faafaa7ad2228990ec57f19d66f7db7c2',
- commitUrl:
- 'http://test.host/frontend-fixtures/environments-project/-/commit/6511e58faafaa7ad2228990ec57f19d66f7db7c2',
- ref: {
- name: 'update2-readme',
- },
- created_at: '2019-07-16T12:14:25.589Z',
- tag: false,
- tagUrl: 'http://test.host/frontend-fixtures/environments-project/tags/false',
- 'last?': false,
- },
-];
-
-export const annotationsData = [
- {
- id: 'gid://gitlab/Metrics::Dashboard::Annotation/1',
- startingAt: '2020-04-12 12:51:53 UTC',
- endingAt: null,
- panelId: null,
- description: 'This is a test annotation',
- },
- {
- id: 'gid://gitlab/Metrics::Dashboard::Annotation/2',
- description: 'test annotation 2',
- startingAt: '2020-04-13 12:51:53 UTC',
- endingAt: null,
- panelId: null,
- },
- {
- id: 'gid://gitlab/Metrics::Dashboard::Annotation/3',
- description: 'test annotation 3',
- startingAt: '2020-04-16 12:51:53 UTC',
- endingAt: null,
- panelId: null,
- },
-];
-
-const extraEnvironmentData = new Array(15).fill(null).map((_, idx) => ({
- id: `gid://gitlab/Environments/${150 + idx}`,
- name: `no-deployment/noop-branch-${idx}`,
- state: 'available',
- created_at: '2018-07-04T18:39:41.702Z',
- updated_at: '2018-07-04T18:44:54.010Z',
-}));
-
-export const environmentData = [
- {
- id: 'gid://gitlab/Environments/34',
- name: 'production',
- state: 'available',
- external_url: 'http://root-autodevops-deploy.my-fake-domain.com',
- environment_type: null,
- stop_action: false,
- metrics_path: '/root/hello-prometheus/environments/34/metrics',
- environment_path: '/root/hello-prometheus/environments/34',
- stop_path: '/root/hello-prometheus/environments/34/stop',
- terminal_path: '/root/hello-prometheus/environments/34/terminal',
- folder_path: '/root/hello-prometheus/environments/folders/production',
- created_at: '2018-06-29T16:53:38.301Z',
- updated_at: '2018-06-29T16:57:09.825Z',
- last_deployment: {
- id: 127,
- },
- },
- {
- id: 'gid://gitlab/Environments/35',
- name: 'review/noop-branch',
- state: 'available',
- external_url: 'http://root-autodevops-deploy-review-noop-branc-die93w.my-fake-domain.com',
- environment_type: 'review',
- stop_action: true,
- metrics_path: '/root/hello-prometheus/environments/35/metrics',
- environment_path: '/root/hello-prometheus/environments/35',
- stop_path: '/root/hello-prometheus/environments/35/stop',
- terminal_path: '/root/hello-prometheus/environments/35/terminal',
- folder_path: '/root/hello-prometheus/environments/folders/review',
- created_at: '2018-07-03T18:39:41.702Z',
- updated_at: '2018-07-03T18:44:54.010Z',
- last_deployment: {
- id: 128,
- },
- },
-].concat(extraEnvironmentData);
-
-export const dashboardGitResponse = [
- {
- default: true,
- display_name: 'Overview',
- can_edit: false,
- system_dashboard: true,
- out_of_the_box_dashboard: true,
- project_blob_path: null,
- path: 'config/prometheus/common_metrics.yml',
- starred: false,
- user_starred_path: `${mockProjectDir}/metrics_user_starred_dashboards?dashboard_path=config/prometheus/common_metrics.yml`,
- },
- {
- default: false,
- display_name: 'dashboard.yml',
- can_edit: true,
- system_dashboard: false,
- out_of_the_box_dashboard: false,
- project_blob_path: `${mockProjectDir}/-/blob/main/.gitlab/dashboards/dashboard.yml`,
- path: '.gitlab/dashboards/dashboard.yml',
- starred: true,
- user_starred_path: `${mockProjectDir}/metrics_user_starred_dashboards?dashboard_path=.gitlab/dashboards/dashboard.yml`,
- },
- {
- default: false,
- display_name: 'Pod Health',
- can_edit: false,
- system_dashboard: false,
- out_of_the_box_dashboard: true,
- project_blob_path: null,
- path: 'config/prometheus/pod_metrics.yml',
- starred: false,
- user_starred_path: `${mockProjectDir}/metrics_user_starred_dashboards?dashboard_path=config/prometheus/pod_metrics.yml`,
- },
- ...customDashboardsData,
-];
-
-// Metrics mocks
-
-export const metricsResult = [
- {
- metric: {},
- values: [
- [1563272065.589, '10.396484375'],
- [1563272125.589, '10.333984375'],
- [1563272185.589, '10.333984375'],
- [1563272245.589, '10.333984375'],
- ],
- },
-];
-
-export const barMockData = {
- title: 'SLA Trends - Primary Services',
- type: 'bar',
- xLabel: 'service',
- y_label: 'percentile',
- metrics: [
- {
- id: 'sla_trends_primary_services',
- series_name: 'group 1',
- metricId: 'NO_DB_sla_trends_primary_services',
- query_range:
- 'avg(avg_over_time(slo_observation_status{environment="gprd", stage=~"main|", type=~"api|web|git|registry|sidekiq|ci-runners"}[1d])) by (type)',
- unit: 'Percentile',
- label: 'SLA',
- prometheus_endpoint_path:
- '/gitlab-com/metrics-dogfooding/-/environments/266/prometheus/api/v1/query_range?query=clamp_min%28clamp_max%28avg%28avg_over_time%28slo_observation_status%7Benvironment%3D%22gprd%22%2C+stage%3D~%22main%7C%22%2C+type%3D~%22api%7Cweb%7Cgit%7Cregistry%7Csidekiq%7Cci-runners%22%7D%5B1d%5D%29%29+by+%28type%29%2C1%29%2C0%29',
- result: [
- {
- metric: { type: 'api' },
- values: [[1583995208, '0.9935198135198128']],
- },
- {
- metric: { type: 'git' },
- values: [[1583995208, '0.9975296513504401']],
- },
- {
- metric: { type: 'registry' },
- values: [[1583995208, '0.9994716394716395']],
- },
- {
- metric: { type: 'sidekiq' },
- values: [[1583995208, '0.9948251748251747']],
- },
- {
- metric: { type: 'web' },
- values: [[1583995208, '0.9535664335664336']],
- },
- {
- metric: { type: 'postgresql_database' },
- values: [[1583995208, '0.9335664335664336']],
- },
- ],
- },
- ],
-};
-
-export const baseNamespace = 'monitoringDashboard';
-
-export const mockNamespace = `${baseNamespace}/1`;
-
-export const mockNamespaces = [`${baseNamespace}/1`, `${baseNamespace}/2`];
-
-export const mockTimeRange = { duration: { seconds: 120 } };
-
-export const mockFixedTimeRange = {
- start: '2020-06-17T19:59:08.659Z',
- end: '2020-07-17T19:59:08.659Z',
-};
-
-export const mockNamespacedData = {
- mockDeploymentData: ['mockDeploymentData'],
- mockProjectPath: '/mockProjectPath',
-};
-
-export const mockLogsPath = '/mockLogsPath';
-
-export const mockLogsHref = `${mockLogsPath}?duration_seconds=${mockTimeRange.duration.seconds}`;
-
-export const mockLinks = [
- {
- title: 'Job',
- url: 'http://intel.com/bibendum/felis/sed/interdum/venenatis.png',
- },
- {
- title: 'Solarbreeze',
- url: 'http://ebay.co.uk/primis/in/faucibus.jsp',
- },
- {
- title: 'Bentosanzap',
- url: 'http://cargocollective.com/sociis/natoque/penatibus/et/magnis/dis.js',
- },
- {
- title: 'Wrapsafe',
- url: 'https://bloomberg.com/tempus/vel/pede/morbi.aspx',
- },
- {
- title: 'Stronghold',
- url: 'https://networkadvertising.org/primis/in/faucibus/orci/luctus/et/ultrices.html',
- },
- {
- title: 'Lotstring',
- url:
- 'https://huffingtonpost.com/sapien/a/libero.aspx?et=lacus&ultrices=at&posuere=velit&cubilia=vivamus&curae=vel&duis=nulla&faucibus=eget&accumsan=eros&odio=elementum&curabitur=pellentesque&convallis=quisque&duis=porta&consequat=volutpat&dui=erat&nec=quisque&nisi=erat&volutpat=eros&eleifend=viverra&donec=eget&ut=congue&dolor=eget&morbi=semper&vel=rutrum&lectus=nulla&in=nunc&quam=purus&fringilla=phasellus&rhoncus=in&mauris=felis&enim=donec&leo=semper&rhoncus=sapien&sed=a&vestibulum=libero&sit=nam&amet=dui&cursus=proin&id=leo&turpis=odio&integer=porttitor&aliquet=id&massa=consequat&id=in&lobortis=consequat&convallis=ut&tortor=nulla&risus=sed&dapibus=accumsan&augue=felis&vel=ut&accumsan=at&tellus=dolor&nisi=quis&eu=odio',
- },
- {
- title: 'Cardify',
- url:
- 'http://nature.com/imperdiet/et/commodo/vulputate/justo/in/blandit.json?tempus=posuere&semper=felis&est=sed&quam=lacus&pharetra=morbi&magna=sem&ac=mauris&consequat=laoreet&metus=ut&sapien=rhoncus&ut=aliquet&nunc=pulvinar&vestibulum=sed&ante=nisl&ipsum=nunc&primis=rhoncus&in=dui&faucibus=vel&orci=sem&luctus=sed&et=sagittis&ultrices=nam&posuere=congue&cubilia=risus&curae=semper&mauris=porta&viverra=volutpat&diam=quam&vitae=pede&quam=lobortis&suspendisse=ligula&potenti=sit&nullam=amet&porttitor=eleifend&lacus=pede&at=libero&turpis=quis',
- },
- {
- title: 'Ventosanzap',
- url:
- 'http://stanford.edu/augue/vestibulum/ante/ipsum/primis/in/faucibus.xml?metus=morbi&sapien=quis&ut=tortor&nunc=id&vestibulum=nulla&ante=ultrices&ipsum=aliquet&primis=maecenas&in=leo&faucibus=odio&orci=condimentum&luctus=id&et=luctus&ultrices=nec&posuere=molestie&cubilia=sed&curae=justo&mauris=pellentesque&viverra=viverra&diam=pede&vitae=ac&quam=diam&suspendisse=cras&potenti=pellentesque&nullam=volutpat&porttitor=dui&lacus=maecenas&at=tristique&turpis=est&donec=et&posuere=tempus&metus=semper&vitae=est&ipsum=quam&aliquam=pharetra&non=magna&mauris=ac&morbi=consequat&non=metus',
- },
- {
- title: 'Cardguard',
- url:
- 'https://google.com.hk/lacinia/eget/tincidunt/eget/tempus/vel.js?at=eget&turpis=nunc&a=donec',
- },
- {
- title: 'Namfix',
- url:
- 'https://fotki.com/eget/rutrum/at/lorem.jsp?at=id&vulputate=nulla&vitae=ultrices&nisl=aliquet&aenean=maecenas&lectus=leo&pellentesque=odio&eget=condimentum&nunc=id&donec=luctus&quis=nec&orci=molestie&eget=sed&orci=justo&vehicula=pellentesque&condimentum=viverra&curabitur=pede&in=ac&libero=diam&ut=cras&massa=pellentesque&volutpat=volutpat&convallis=dui&morbi=maecenas&odio=tristique&odio=est&elementum=et&eu=tempus&interdum=semper&eu=est&tincidunt=quam&in=pharetra&leo=magna&maecenas=ac&pulvinar=consequat&lobortis=metus&est=sapien&phasellus=ut&sit=nunc&amet=vestibulum&erat=ante&nulla=ipsum&tempus=primis&vivamus=in&in=faucibus&felis=orci&eu=luctus&sapien=et&cursus=ultrices&vestibulum=posuere&proin=cubilia&eu=curae&mi=mauris&nulla=viverra&ac=diam&enim=vitae&in=quam&tempor=suspendisse&turpis=potenti&nec=nullam&euismod=porttitor&scelerisque=lacus&quam=at&turpis=turpis&adipiscing=donec&lorem=posuere&vitae=metus&mattis=vitae&nibh=ipsum&ligula=aliquam&nec=non&sem=mauris&duis=morbi&aliquam=non&convallis=lectus&nunc=aliquam&proin=sit&at=amet',
- },
- {
- title: 'Alpha',
- url:
- 'http://bravesites.com/tempus/vel.jpg?risus=est&auctor=phasellus&sed=sit&tristique=amet&in=erat&tempus=nulla&sit=tempus&amet=vivamus&sem=in&fusce=felis&consequat=eu&nulla=sapien&nisl=cursus&nunc=vestibulum&nisl=proin&duis=eu&bibendum=mi&felis=nulla&sed=ac&interdum=enim&venenatis=in&turpis=tempor&enim=turpis&blandit=nec&mi=euismod&in=scelerisque&porttitor=quam&pede=turpis&justo=adipiscing&eu=lorem&massa=vitae&donec=mattis&dapibus=nibh&duis=ligula',
- },
- {
- title: 'Sonsing',
- url:
- 'http://microsoft.com/blandit.js?quis=ante&lectus=vestibulum&suspendisse=ante&potenti=ipsum&in=primis&eleifend=in&quam=faucibus&a=orci&odio=luctus&in=et&hac=ultrices&habitasse=posuere&platea=cubilia&dictumst=curae&maecenas=duis&ut=faucibus&massa=accumsan&quis=odio&augue=curabitur&luctus=convallis&tincidunt=duis&nulla=consequat&mollis=dui&molestie=nec&lorem=nisi&quisque=volutpat&ut=eleifend&erat=donec&curabitur=ut&gravida=dolor&nisi=morbi&at=vel&nibh=lectus&in=in&hac=quam&habitasse=fringilla&platea=rhoncus&dictumst=mauris&aliquam=enim&augue=leo&quam=rhoncus&sollicitudin=sed&vitae=vestibulum&consectetuer=sit&eget=amet&rutrum=cursus&at=id&lorem=turpis&integer=integer&tincidunt=aliquet&ante=massa&vel=id&ipsum=lobortis&praesent=convallis&blandit=tortor&lacinia=risus&erat=dapibus&vestibulum=augue&sed=vel&magna=accumsan&at=tellus&nunc=nisi&commodo=eu&placerat=orci&praesent=mauris&blandit=lacinia&nam=sapien&nulla=quis&integer=libero',
- },
- {
- title: 'Fintone',
- url:
- 'https://linkedin.com/duis/bibendum/felis/sed/interdum/venenatis.json?ut=justo&suscipit=sollicitudin&a=ut&feugiat=suscipit&et=a&eros=feugiat&vestibulum=et&ac=eros&est=vestibulum&lacinia=ac&nisi=est&venenatis=lacinia&tristique=nisi&fusce=venenatis&congue=tristique&diam=fusce&id=congue&ornare=diam&imperdiet=id&sapien=ornare&urna=imperdiet&pretium=sapien&nisl=urna&ut=pretium&volutpat=nisl&sapien=ut&arcu=volutpat&sed=sapien&augue=arcu&aliquam=sed&erat=augue&volutpat=aliquam&in=erat&congue=volutpat&etiam=in&justo=congue&etiam=etiam&pretium=justo&iaculis=etiam&justo=pretium&in=iaculis&hac=justo&habitasse=in&platea=hac&dictumst=habitasse&etiam=platea&faucibus=dictumst&cursus=etiam&urna=faucibus&ut=cursus&tellus=urna&nulla=ut&ut=tellus&erat=nulla&id=ut&mauris=erat&vulputate=id&elementum=mauris&nullam=vulputate&varius=elementum&nulla=nullam&facilisi=varius&cras=nulla&non=facilisi&velit=cras&nec=non&nisi=velit&vulputate=nec&nonummy=nisi&maecenas=vulputate&tincidunt=nonummy&lacus=maecenas&at=tincidunt&velit=lacus&vivamus=at&vel=velit&nulla=vivamus&eget=vel&eros=nulla&elementum=eget',
- },
- {
- title: 'Fix San',
- url:
- 'http://pinterest.com/mi/in/porttitor/pede.png?varius=nibh&integer=quisque&ac=id&leo=justo&pellentesque=sit&ultrices=amet&mattis=sapien&odio=dignissim&donec=vestibulum&vitae=vestibulum&nisi=ante&nam=ipsum&ultrices=primis&libero=in&non=faucibus&mattis=orci&pulvinar=luctus&nulla=et&pede=ultrices&ullamcorper=posuere&augue=cubilia&a=curae&suscipit=nulla&nulla=dapibus&elit=dolor&ac=vel&nulla=est&sed=donec&vel=odio&enim=justo&sit=sollicitudin&amet=ut&nunc=suscipit&viverra=a&dapibus=feugiat&nulla=et&suscipit=eros&ligula=vestibulum&in=ac&lacus=est&curabitur=lacinia&at=nisi&ipsum=venenatis&ac=tristique&tellus=fusce&semper=congue&interdum=diam&mauris=id&ullamcorper=ornare&purus=imperdiet&sit=sapien&amet=urna&nulla=pretium&quisque=nisl&arcu=ut&libero=volutpat&rutrum=sapien&ac=arcu&lobortis=sed&vel=augue&dapibus=aliquam&at=erat&diam=volutpat&nam=in&tristique=congue&tortor=etiam',
- },
- {
- title: 'Ronstring',
- url:
- 'https://ebay.com/ut/erat.aspx?nulla=sed&eget=nisl&eros=nunc&elementum=rhoncus&pellentesque=dui&quisque=vel&porta=sem&volutpat=sed&erat=sagittis&quisque=nam&erat=congue&eros=risus&viverra=semper&eget=porta&congue=volutpat&eget=quam&semper=pede&rutrum=lobortis&nulla=ligula',
- },
- {
- title: 'It',
- url:
- 'http://symantec.com/tortor/sollicitudin/mi/sit/amet.json?in=nullam&libero=varius&ut=nulla&massa=facilisi&volutpat=cras&convallis=non&morbi=velit&odio=nec&odio=nisi&elementum=vulputate&eu=nonummy&interdum=maecenas&eu=tincidunt&tincidunt=lacus&in=at&leo=velit&maecenas=vivamus&pulvinar=vel&lobortis=nulla&est=eget&phasellus=eros&sit=elementum&amet=pellentesque&erat=quisque&nulla=porta&tempus=volutpat&vivamus=erat&in=quisque&felis=erat&eu=eros&sapien=viverra&cursus=eget&vestibulum=congue&proin=eget&eu=semper',
- },
- {
- title: 'Andalax',
- url:
- 'https://acquirethisname.com/tortor/eu.js?volutpat=mauris&dui=laoreet&maecenas=ut&tristique=rhoncus&est=aliquet&et=pulvinar&tempus=sed&semper=nisl&est=nunc&quam=rhoncus&pharetra=dui&magna=vel&ac=sem&consequat=sed&metus=sagittis&sapien=nam&ut=congue&nunc=risus&vestibulum=semper&ante=porta&ipsum=volutpat&primis=quam&in=pede&faucibus=lobortis&orci=ligula&luctus=sit&et=amet&ultrices=eleifend&posuere=pede&cubilia=libero&curae=quis&mauris=orci&viverra=nullam&diam=molestie&vitae=nibh&quam=in&suspendisse=lectus&potenti=pellentesque&nullam=at&porttitor=nulla&lacus=suspendisse&at=potenti&turpis=cras&donec=in&posuere=purus&metus=eu&vitae=magna&ipsum=vulputate&aliquam=luctus&non=cum&mauris=sociis&morbi=natoque&non=penatibus&lectus=et&aliquam=magnis&sit=dis&amet=parturient&diam=montes&in=nascetur&magna=ridiculus&bibendum=mus',
- },
-];
-
-export const templatingVariablesExamples = {
- text: {
- textSimple: 'My default value',
- textAdvanced: {
- label: 'Advanced text variable',
- type: 'text',
- options: {
- default_value: 'A default value',
- },
- },
- },
- custom: {
- customSimple: ['value1', 'value2', 'value3'],
- customAdvanced: {
- label: 'Advanced Var',
- type: 'custom',
- options: {
- values: [
- { value: 'value1', text: 'Var 1 Option 1' },
- {
- value: 'value2',
- text: 'Var 1 Option 2',
- default: true,
- },
- ],
- },
- },
- customAdvancedWithoutOpts: {
- type: 'custom',
- options: {},
- },
- customAdvancedWithoutLabel: {
- type: 'custom',
- options: {
- values: [
- { value: 'value1', text: 'Var 1 Option 1' },
- {
- value: 'value2',
- text: 'Var 1 Option 2',
- default: true,
- },
- ],
- },
- },
- customAdvancedWithoutType: {
- label: 'Variable 2',
- options: {
- values: [
- { value: 'value1', text: 'Var 1 Option 1' },
- {
- value: 'value2',
- text: 'Var 1 Option 2',
- default: true,
- },
- ],
- },
- },
- customAdvancedWithoutOptText: {
- label: 'Options without text',
- type: 'custom',
- options: {
- values: [
- { value: 'value1' },
- {
- value: 'value2',
- default: true,
- },
- ],
- },
- },
- },
- metricLabelValues: {
- metricLabelValuesSimple: {
- label: 'Metric Label Values',
- type: 'metric_label_values',
- options: {
- prometheus_endpoint_path: '/series',
- series_selector: 'backend:haproxy_backend_availability:ratio{env="{{env}}"}',
- label: 'backend',
- },
- },
- },
-};
-
-export const storeTextVariables = [
- {
- type: 'text',
- name: 'textSimple',
- label: 'textSimple',
- value: 'My default value',
- },
- {
- type: 'text',
- name: 'textAdvanced',
- label: 'Advanced text variable',
- value: 'A default value',
- },
-];
-
-export const storeCustomVariables = [
- {
- type: 'custom',
- name: 'customSimple',
- label: 'customSimple',
- options: {
- values: [
- { default: false, text: 'value1', value: 'value1' },
- { default: false, text: 'value2', value: 'value2' },
- { default: false, text: 'value3', value: 'value3' },
- ],
- },
- value: 'value1',
- },
- {
- type: 'custom',
- name: 'customAdvanced',
- label: 'Advanced Var',
- options: {
- values: [
- { default: false, text: 'Var 1 Option 1', value: 'value1' },
- { default: true, text: 'Var 1 Option 2', value: 'value2' },
- ],
- },
- value: 'value2',
- },
- {
- type: 'custom',
- name: 'customAdvancedWithoutOpts',
- label: 'customAdvancedWithoutOpts',
- options: { values: [] },
- value: null,
- },
- {
- type: 'custom',
- name: 'customAdvancedWithoutLabel',
- label: 'customAdvancedWithoutLabel',
- value: 'value2',
- options: {
- values: [
- { default: false, text: 'Var 1 Option 1', value: 'value1' },
- { default: true, text: 'Var 1 Option 2', value: 'value2' },
- ],
- },
- },
- {
- type: 'custom',
- name: 'customAdvancedWithoutOptText',
- label: 'Options without text',
- options: {
- values: [
- { default: false, text: 'value1', value: 'value1' },
- { default: true, text: 'value2', value: 'value2' },
- ],
- },
- value: 'value2',
- },
-];
-
-export const storeMetricLabelValuesVariables = [
- {
- type: 'metric_label_values',
- name: 'metricLabelValuesSimple',
- label: 'Metric Label Values',
- options: { prometheusEndpointPath: '/series', label: 'backend', values: [] },
- value: null,
- },
-];
-
-export const storeVariables = [
- ...storeTextVariables,
- ...storeCustomVariables,
- ...storeMetricLabelValuesVariables,
-];
-
-export const dashboardHeaderProps = {
- defaultBranch: 'main',
- isRearrangingPanels: false,
- selectedTimeRange: {
- start: '2020-01-01T00:00:00.000Z',
- end: '2020-01-01T01:00:00.000Z',
- },
-};
-
-export const dashboardActionsMenuProps = {
- defaultBranch: 'main',
- addingMetricsAvailable: true,
- customMetricsPath: 'https://path/to/customMetrics',
- validateQueryPath: 'https://path/to/validateQuery',
- isOotbDashboard: true,
-};
-
-export const mockAlert = {
- alert_path: 'alert_path',
- id: 8,
- metricId: 'mock_metric_id',
- operator: '>',
- query: 'testQuery',
- runbookUrl: invalidUrl,
- threshold: 5,
- title: 'alert title',
-};
diff --git a/spec/frontend/monitoring/pages/dashboard_page_spec.js b/spec/frontend/monitoring/pages/dashboard_page_spec.js
deleted file mode 100644
index 7fcb7607772..00000000000
--- a/spec/frontend/monitoring/pages/dashboard_page_spec.js
+++ /dev/null
@@ -1,60 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import Dashboard from '~/monitoring/components/dashboard.vue';
-import DashboardPage from '~/monitoring/pages/dashboard_page.vue';
-import { createStore } from '~/monitoring/stores';
-import { assertProps } from 'helpers/assert_props';
-import { dashboardProps } from '../fixture_data';
-
-describe('monitoring/pages/dashboard_page', () => {
- let wrapper;
- let store;
- let $route;
-
- const buildRouter = () => {
- const dashboard = {};
- $route = {
- params: { dashboard },
- query: { dashboard },
- };
- };
-
- const buildWrapper = (props = {}) => {
- wrapper = shallowMount(DashboardPage, {
- store,
- propsData: {
- ...props,
- },
- mocks: {
- $route,
- },
- });
- };
-
- const findDashboardComponent = () => wrapper.findComponent(Dashboard);
-
- beforeEach(() => {
- buildRouter();
- store = createStore();
- jest.spyOn(store, 'dispatch').mockResolvedValue();
- });
-
- it('throws errors if dashboard props are not passed', () => {
- expect(() => assertProps(DashboardPage, {})).toThrow('Missing required prop: "dashboardProps"');
- });
-
- it('renders the dashboard page with dashboard component', () => {
- buildWrapper({ dashboardProps });
-
- const allProps = {
- ...dashboardProps,
- // default props values
- rearrangePanelsAvailable: false,
- showHeader: true,
- showPanels: true,
- smallEmptyState: false,
- };
-
- expect(findDashboardComponent().exists()).toBe(true);
- expect(allProps).toMatchObject(findDashboardComponent().props());
- });
-});
diff --git a/spec/frontend/monitoring/pages/panel_new_page_spec.js b/spec/frontend/monitoring/pages/panel_new_page_spec.js
deleted file mode 100644
index 98ee6c1cb29..00000000000
--- a/spec/frontend/monitoring/pages/panel_new_page_spec.js
+++ /dev/null
@@ -1,93 +0,0 @@
-import { GlButton } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import DashboardPanelBuilder from '~/monitoring/components/dashboard_panel_builder.vue';
-import PanelNewPage from '~/monitoring/pages/panel_new_page.vue';
-import { DASHBOARD_PAGE, PANEL_NEW_PAGE } from '~/monitoring/router/constants';
-import { createStore } from '~/monitoring/stores';
-
-const dashboard = 'dashboard.yml';
-
-// Button stub that can accept `to` as router links do
-// https://bootstrap-vue.org/docs/components/button#comp-ref-b-button-props
-const GlButtonStub = {
- extends: GlButton,
- props: {
- to: [String, Object],
- },
-};
-
-describe('monitoring/pages/panel_new_page', () => {
- let store;
- let wrapper;
- let $route;
- let $router;
-
- const mountComponent = (propsData = {}, route) => {
- $route = route ?? { name: PANEL_NEW_PAGE, params: { dashboard } };
- $router = {
- push: jest.fn(),
- };
-
- wrapper = shallowMount(PanelNewPage, {
- propsData,
- store,
- stubs: {
- GlButton: GlButtonStub,
- },
- mocks: {
- $router,
- $route,
- },
- });
- };
-
- const findBackButton = () => wrapper.findComponent(GlButtonStub);
- const findPanelBuilder = () => wrapper.findComponent(DashboardPanelBuilder);
-
- beforeEach(() => {
- store = createStore();
- mountComponent();
- });
-
- describe('back to dashboard button', () => {
- it('is rendered', () => {
- expect(findBackButton().exists()).toBe(true);
- expect(findBackButton().props('icon')).toBe('go-back');
- });
-
- it('links back to the dashboard', () => {
- expect(findBackButton().props('to')).toEqual({
- name: DASHBOARD_PAGE,
- params: { dashboard },
- });
- });
-
- it('links back to the dashboard while preserving query params', () => {
- $route = {
- name: PANEL_NEW_PAGE,
- params: { dashboard },
- query: { another: 'param' },
- };
-
- mountComponent({}, $route);
-
- expect(findBackButton().props('to')).toEqual({
- name: DASHBOARD_PAGE,
- params: { dashboard },
- query: { another: 'param' },
- });
- });
- });
-
- describe('dashboard panel builder', () => {
- it('is rendered', () => {
- expect(findPanelBuilder().exists()).toBe(true);
- });
- });
-
- describe('page routing', () => {
- it('route is not updated by default', () => {
- expect($router.push).not.toHaveBeenCalled();
- });
- });
-});
diff --git a/spec/frontend/monitoring/requests/index_spec.js b/spec/frontend/monitoring/requests/index_spec.js
deleted file mode 100644
index 308895768a4..00000000000
--- a/spec/frontend/monitoring/requests/index_spec.js
+++ /dev/null
@@ -1,157 +0,0 @@
-import MockAdapter from 'axios-mock-adapter';
-import { backoffMockImplementation } from 'helpers/backoff_helper';
-import axios from '~/lib/utils/axios_utils';
-import * as commonUtils from '~/lib/utils/common_utils';
-import {
- HTTP_STATUS_BAD_REQUEST,
- HTTP_STATUS_INTERNAL_SERVER_ERROR,
- HTTP_STATUS_NO_CONTENT,
- HTTP_STATUS_OK,
- HTTP_STATUS_SERVICE_UNAVAILABLE,
- HTTP_STATUS_UNAUTHORIZED,
- HTTP_STATUS_UNPROCESSABLE_ENTITY,
-} from '~/lib/utils/http_status';
-import { getDashboard, getPrometheusQueryData } from '~/monitoring/requests';
-import { metricsDashboardResponse } from '../fixture_data';
-
-describe('monitoring metrics_requests', () => {
- let mock;
-
- beforeEach(() => {
- mock = new MockAdapter(axios);
- jest.spyOn(commonUtils, 'backOff').mockImplementation(backoffMockImplementation);
- });
-
- afterEach(() => {
- mock.reset();
-
- commonUtils.backOff.mockReset();
- });
-
- describe('getDashboard', () => {
- const response = metricsDashboardResponse;
- const dashboardEndpoint = '/dashboard';
- const params = {
- start_time: 'start_time',
- end_time: 'end_time',
- };
-
- it('returns a dashboard response', () => {
- mock.onGet(dashboardEndpoint).reply(HTTP_STATUS_OK, response);
-
- return getDashboard(dashboardEndpoint, params).then((data) => {
- expect(data).toEqual(metricsDashboardResponse);
- });
- });
-
- it('returns a dashboard response after retrying twice', () => {
- mock.onGet(dashboardEndpoint).replyOnce(HTTP_STATUS_NO_CONTENT);
- mock.onGet(dashboardEndpoint).replyOnce(HTTP_STATUS_NO_CONTENT);
- mock.onGet(dashboardEndpoint).reply(HTTP_STATUS_OK, response);
-
- return getDashboard(dashboardEndpoint, params).then((data) => {
- expect(data).toEqual(metricsDashboardResponse);
- expect(mock.history.get).toHaveLength(3);
- });
- });
-
- it('rejects after getting an error', () => {
- mock.onGet(dashboardEndpoint).reply(HTTP_STATUS_INTERNAL_SERVER_ERROR);
-
- return getDashboard(dashboardEndpoint, params).catch((error) => {
- expect(error).toEqual(expect.any(Error));
- expect(mock.history.get).toHaveLength(1);
- });
- });
- });
-
- describe('getPrometheusQueryData', () => {
- const response = {
- status: 'success',
- data: {
- resultType: 'matrix',
- result: [],
- },
- };
- const prometheusEndpoint = '/query_range';
- const params = {
- start_time: 'start_time',
- end_time: 'end_time',
- };
-
- it('returns a dashboard response', () => {
- mock.onGet(prometheusEndpoint).reply(HTTP_STATUS_OK, response);
-
- return getPrometheusQueryData(prometheusEndpoint, params).then((data) => {
- expect(data).toEqual(response.data);
- });
- });
-
- it('returns a dashboard response after retrying twice', () => {
- // Mock multiple attempts while the cache is filling up
- mock.onGet(prometheusEndpoint).replyOnce(HTTP_STATUS_NO_CONTENT);
- mock.onGet(prometheusEndpoint).replyOnce(HTTP_STATUS_NO_CONTENT);
- mock.onGet(prometheusEndpoint).reply(HTTP_STATUS_OK, response); // 3rd attempt
-
- return getPrometheusQueryData(prometheusEndpoint, params).then((data) => {
- expect(data).toEqual(response.data);
- expect(mock.history.get).toHaveLength(3);
- });
- });
-
- it('rejects after getting an HTTP 500 error', () => {
- mock.onGet(prometheusEndpoint).reply(HTTP_STATUS_INTERNAL_SERVER_ERROR, {
- status: 'error',
- error: 'An error occurred',
- });
-
- return getPrometheusQueryData(prometheusEndpoint, params).catch((error) => {
- expect(error).toEqual(new Error('Request failed with status code 500'));
- });
- });
-
- it('rejects after retrying twice and getting an HTTP 401 error', () => {
- // Mock multiple attempts while the cache is filling up and fails
- mock.onGet(prometheusEndpoint).reply(HTTP_STATUS_UNAUTHORIZED, {
- status: 'error',
- error: 'An error occurred',
- });
-
- return getPrometheusQueryData(prometheusEndpoint, params).catch((error) => {
- expect(error).toEqual(new Error('Request failed with status code 401'));
- });
- });
-
- it('rejects after retrying twice and getting an HTTP 500 error', () => {
- // Mock multiple attempts while the cache is filling up and fails
- mock.onGet(prometheusEndpoint).replyOnce(HTTP_STATUS_NO_CONTENT);
- mock.onGet(prometheusEndpoint).replyOnce(HTTP_STATUS_NO_CONTENT);
- mock.onGet(prometheusEndpoint).reply(HTTP_STATUS_INTERNAL_SERVER_ERROR, {
- status: 'error',
- error: 'An error occurred',
- }); // 3rd attempt
-
- return getPrometheusQueryData(prometheusEndpoint, params).catch((error) => {
- expect(error).toEqual(new Error('Request failed with status code 500'));
- expect(mock.history.get).toHaveLength(3);
- });
- });
-
- it.each`
- code | reason
- ${HTTP_STATUS_BAD_REQUEST} | ${'Parameters are missing or incorrect'}
- ${HTTP_STATUS_UNPROCESSABLE_ENTITY} | ${"Expression can't be executed"}
- ${HTTP_STATUS_SERVICE_UNAVAILABLE} | ${'Query timed out or aborted'}
- `('rejects with details: "$reason" after getting an HTTP $code error', ({ code, reason }) => {
- mock.onGet(prometheusEndpoint).reply(code, {
- status: 'error',
- error: reason,
- });
-
- return getPrometheusQueryData(prometheusEndpoint, params).catch((error) => {
- expect(error).toEqual(new Error(reason));
- expect(mock.history.get).toHaveLength(1);
- });
- });
- });
-});
diff --git a/spec/frontend/monitoring/router_spec.js b/spec/frontend/monitoring/router_spec.js
deleted file mode 100644
index 368bd955fb3..00000000000
--- a/spec/frontend/monitoring/router_spec.js
+++ /dev/null
@@ -1,106 +0,0 @@
-import { mount } from '@vue/test-utils';
-import Vue from 'vue';
-import VueRouter from 'vue-router';
-import Dashboard from '~/monitoring/components/dashboard.vue';
-import DashboardPage from '~/monitoring/pages/dashboard_page.vue';
-import PanelNewPage from '~/monitoring/pages/panel_new_page.vue';
-import createRouter from '~/monitoring/router';
-import { createStore } from '~/monitoring/stores';
-import { dashboardProps } from './fixture_data';
-import { dashboardHeaderProps } from './mock_data';
-
-const LEGACY_BASE_PATH = '/project/my-group/test-project/-/environments/71146/metrics';
-const BASE_PATH = '/project/my-group/test-project/-/metrics';
-
-const MockApp = {
- data() {
- return {
- dashboardProps: { ...dashboardProps, ...dashboardHeaderProps },
- };
- },
- template: `<router-view :dashboard-props="dashboardProps"/>`,
-};
-
-describe('Monitoring router', () => {
- let router;
- let store;
-
- const createWrapper = (basePath, routeArg) => {
- Vue.use(VueRouter);
-
- router = createRouter(basePath);
- if (routeArg !== undefined) {
- router.push(routeArg);
- }
-
- return mount(MockApp, {
- store,
- router,
- });
- };
-
- beforeEach(() => {
- store = createStore();
- jest.spyOn(store, 'dispatch').mockResolvedValue();
- });
-
- afterEach(() => {
- window.location.hash = '';
- });
-
- describe('support legacy URLs with full dashboard path to visit dashboard page', () => {
- it.each`
- path | currentDashboard
- ${'/dashboard.yml'} | ${'dashboard.yml'}
- ${'/folder1/dashboard.yml'} | ${'folder1/dashboard.yml'}
- ${'/?dashboard=dashboard.yml'} | ${'dashboard.yml'}
- `('"$path" renders page with dashboard "$currentDashboard"', ({ path, currentDashboard }) => {
- const wrapper = createWrapper(LEGACY_BASE_PATH, path);
-
- expect(store.dispatch).toHaveBeenCalledWith('monitoringDashboard/setCurrentDashboard', {
- currentDashboard,
- });
-
- expect(wrapper.findComponent(DashboardPage).exists()).toBe(true);
- expect(wrapper.findComponent(DashboardPage).findComponent(Dashboard).exists()).toBe(true);
- });
- });
-
- describe('supports URLs to visit dashboard page', () => {
- it.each`
- path | currentDashboard
- ${'/'} | ${null}
- ${'/dashboard.yml'} | ${'dashboard.yml'}
- ${'/folder1/dashboard.yml'} | ${'folder1/dashboard.yml'}
- ${'/folder1%2Fdashboard.yml'} | ${'folder1/dashboard.yml'}
- ${'/dashboard.yml'} | ${'dashboard.yml'}
- ${'/config/prometheus/common_metrics.yml'} | ${'config/prometheus/common_metrics.yml'}
- ${'/config/prometheus/pod_metrics.yml'} | ${'config/prometheus/pod_metrics.yml'}
- ${'/config%2Fprometheus%2Fpod_metrics.yml'} | ${'config/prometheus/pod_metrics.yml'}
- `('"$path" renders page with dashboard "$currentDashboard"', ({ path, currentDashboard }) => {
- const wrapper = createWrapper(BASE_PATH, path);
-
- expect(store.dispatch).toHaveBeenCalledWith('monitoringDashboard/setCurrentDashboard', {
- currentDashboard,
- });
-
- expect(wrapper.findComponent(DashboardPage).exists()).toBe(true);
- expect(wrapper.findComponent(DashboardPage).findComponent(Dashboard).exists()).toBe(true);
- });
- });
-
- describe('supports URLs to visit new panel page', () => {
- it.each`
- path | currentDashboard
- ${'/panel/new'} | ${undefined}
- ${'/dashboard.yml/panel/new'} | ${'dashboard.yml'}
- ${'/config/prometheus/common_metrics.yml/panel/new'} | ${'config/prometheus/common_metrics.yml'}
- ${'/config%2Fprometheus%2Fcommon_metrics.yml/panel/new'} | ${'config/prometheus/common_metrics.yml'}
- `('"$path" renders page with dashboard "$currentDashboard"', ({ path, currentDashboard }) => {
- const wrapper = createWrapper(BASE_PATH, path);
-
- expect(wrapper.vm.$route.params.dashboard).toBe(currentDashboard);
- expect(wrapper.findComponent(PanelNewPage).exists()).toBe(true);
- });
- });
-});
diff --git a/spec/frontend/monitoring/store/actions_spec.js b/spec/frontend/monitoring/store/actions_spec.js
deleted file mode 100644
index b3b198d6b51..00000000000
--- a/spec/frontend/monitoring/store/actions_spec.js
+++ /dev/null
@@ -1,1167 +0,0 @@
-import MockAdapter from 'axios-mock-adapter';
-import { backoffMockImplementation } from 'helpers/backoff_helper';
-import testAction from 'helpers/vuex_action_helper';
-import { createAlert } from '~/alert';
-import axios from '~/lib/utils/axios_utils';
-import * as commonUtils from '~/lib/utils/common_utils';
-import {
- HTTP_STATUS_BAD_REQUEST,
- HTTP_STATUS_CREATED,
- HTTP_STATUS_INTERNAL_SERVER_ERROR,
- HTTP_STATUS_OK,
- HTTP_STATUS_UNPROCESSABLE_ENTITY,
-} from '~/lib/utils/http_status';
-import { ENVIRONMENT_AVAILABLE_STATE } from '~/monitoring/constants';
-
-import getAnnotations from '~/monitoring/queries/get_annotations.query.graphql';
-import getDashboardValidationWarnings from '~/monitoring/queries/get_dashboard_validation_warnings.query.graphql';
-import getEnvironments from '~/monitoring/queries/get_environments.query.graphql';
-import { createStore } from '~/monitoring/stores';
-import {
- setGettingStartedEmptyState,
- setInitialState,
- setExpandedPanel,
- clearExpandedPanel,
- filterEnvironments,
- fetchData,
- fetchDashboard,
- receiveMetricsDashboardSuccess,
- fetchDashboardData,
- fetchPrometheusMetric,
- fetchDeploymentsData,
- fetchEnvironmentsData,
- fetchAnnotations,
- fetchDashboardValidationWarnings,
- toggleStarredValue,
- duplicateSystemDashboard,
- updateVariablesAndFetchData,
- fetchVariableMetricLabelValues,
- fetchPanelPreview,
-} from '~/monitoring/stores/actions';
-import * as getters from '~/monitoring/stores/getters';
-import * as types from '~/monitoring/stores/mutation_types';
-import storeState from '~/monitoring/stores/state';
-import {
- gqClient,
- parseEnvironmentsResponse,
- parseAnnotationsResponse,
-} from '~/monitoring/stores/utils';
-import Tracking from '~/tracking';
-import { defaultTimeRange } from '~/vue_shared/constants';
-import {
- metricsDashboardResponse,
- metricsDashboardViewModel,
- metricsDashboardPanelCount,
-} from '../fixture_data';
-import {
- deploymentData,
- environmentData,
- annotationsData,
- dashboardGitResponse,
- mockDashboardsErrorResponse,
-} from '../mock_data';
-
-jest.mock('~/alert');
-
-describe('Monitoring store actions', () => {
- const { convertObjectPropsToCamelCase } = commonUtils;
-
- let mock;
- let store;
- let state;
-
- let dispatch;
- let commit;
-
- beforeEach(() => {
- store = createStore({ getters });
- state = store.state.monitoringDashboard;
- mock = new MockAdapter(axios);
-
- commit = jest.fn();
- dispatch = jest.fn();
-
- jest.spyOn(commonUtils, 'backOff').mockImplementation(backoffMockImplementation);
- });
-
- afterEach(() => {
- mock.reset();
-
- commonUtils.backOff.mockReset();
- createAlert.mockReset();
- });
-
- // Setup
-
- describe('setGettingStartedEmptyState', () => {
- it('should commit SET_GETTING_STARTED_EMPTY_STATE mutation', () => {
- return testAction(
- setGettingStartedEmptyState,
- null,
- state,
- [
- {
- type: types.SET_GETTING_STARTED_EMPTY_STATE,
- },
- ],
- [],
- );
- });
- });
-
- describe('setInitialState', () => {
- it('should commit SET_INITIAL_STATE mutation', () => {
- return testAction(
- setInitialState,
- {
- currentDashboard: '.gitlab/dashboards/dashboard.yml',
- deploymentsEndpoint: 'deployments.json',
- },
- state,
- [
- {
- type: types.SET_INITIAL_STATE,
- payload: {
- currentDashboard: '.gitlab/dashboards/dashboard.yml',
- deploymentsEndpoint: 'deployments.json',
- },
- },
- ],
- [],
- );
- });
- });
-
- describe('setExpandedPanel', () => {
- it('Sets a panel as expanded', () => {
- const group = 'group_1';
- const panel = { title: 'A Panel' };
-
- return testAction(
- setExpandedPanel,
- { group, panel },
- state,
- [{ type: types.SET_EXPANDED_PANEL, payload: { group, panel } }],
- [],
- );
- });
- });
-
- describe('clearExpandedPanel', () => {
- it('Clears a panel as expanded', () => {
- return testAction(
- clearExpandedPanel,
- undefined,
- state,
- [{ type: types.SET_EXPANDED_PANEL, payload: { group: null, panel: null } }],
- [],
- );
- });
- });
-
- // All Data
-
- describe('fetchData', () => {
- it('dispatches fetchEnvironmentsData and fetchEnvironmentsData', () => {
- return testAction(
- fetchData,
- null,
- state,
- [],
- [
- { type: 'fetchEnvironmentsData' },
- { type: 'fetchDashboard' },
- { type: 'fetchAnnotations' },
- ],
- );
- });
-
- it('dispatches when feature metricsDashboardAnnotations is on', () => {
- window.gon = { features: { metricsDashboardAnnotations: true } };
-
- return testAction(
- fetchData,
- null,
- state,
- [],
- [
- { type: 'fetchEnvironmentsData' },
- { type: 'fetchDashboard' },
- { type: 'fetchAnnotations' },
- ],
- );
- });
- });
-
- // Metrics dashboard
-
- describe('fetchDashboard', () => {
- const response = metricsDashboardResponse;
- beforeEach(() => {
- state.dashboardEndpoint = '/dashboard';
- });
-
- it('on success, dispatches receive and success actions, then fetches dashboard warnings', () => {
- document.body.dataset.page = 'projects:environments:metrics';
- mock.onGet(state.dashboardEndpoint).reply(HTTP_STATUS_OK, response);
-
- return testAction(
- fetchDashboard,
- null,
- state,
- [],
- [
- { type: 'requestMetricsDashboard' },
- {
- type: 'receiveMetricsDashboardSuccess',
- payload: { response },
- },
- { type: 'fetchDashboardValidationWarnings' },
- ],
- );
- });
-
- describe('on failure', () => {
- let result;
- beforeEach(() => {
- const params = {};
- const localGetters = {
- fullDashboardPath: store.getters['monitoringDashboard/fullDashboardPath'],
- };
- result = () => {
- mock
- .onGet(state.dashboardEndpoint)
- .replyOnce(HTTP_STATUS_INTERNAL_SERVER_ERROR, mockDashboardsErrorResponse);
- return fetchDashboard({ state, commit, dispatch, getters: localGetters }, params);
- };
- });
-
- it('dispatches a failure', async () => {
- await result();
- expect(commit).toHaveBeenCalledWith(
- types.SET_ALL_DASHBOARDS,
- mockDashboardsErrorResponse.all_dashboards,
- );
- expect(dispatch).toHaveBeenCalledWith(
- 'receiveMetricsDashboardFailure',
- new Error('Request failed with status code 500'),
- );
- expect(createAlert).toHaveBeenCalled();
- });
-
- it('dispatches a failure action when a message is returned', async () => {
- await result();
- expect(dispatch).toHaveBeenCalledWith(
- 'receiveMetricsDashboardFailure',
- new Error('Request failed with status code 500'),
- );
- expect(createAlert).toHaveBeenCalledWith({
- message: expect.stringContaining(mockDashboardsErrorResponse.message),
- });
- });
-
- it('does not show an alert when showErrorBanner is disabled', async () => {
- state.showErrorBanner = false;
-
- await result();
- expect(dispatch).toHaveBeenCalledWith(
- 'receiveMetricsDashboardFailure',
- new Error('Request failed with status code 500'),
- );
- expect(createAlert).not.toHaveBeenCalled();
- });
- });
- });
-
- describe('receiveMetricsDashboardSuccess', () => {
- it('stores groups', () => {
- const response = metricsDashboardResponse;
- receiveMetricsDashboardSuccess({ state, commit, dispatch }, { response });
- expect(commit).toHaveBeenCalledWith(
- types.RECEIVE_METRICS_DASHBOARD_SUCCESS,
-
- metricsDashboardResponse.dashboard,
- );
- expect(dispatch).toHaveBeenCalledWith('fetchDashboardData');
- });
-
- it('sets the dashboards loaded from the repository', () => {
- const params = {};
- const response = metricsDashboardResponse;
- response.all_dashboards = dashboardGitResponse;
- receiveMetricsDashboardSuccess(
- {
- state,
- commit,
- dispatch,
- },
- {
- response,
- params,
- },
- );
- expect(commit).toHaveBeenCalledWith(types.SET_ALL_DASHBOARDS, dashboardGitResponse);
- });
- });
-
- // Metrics
-
- describe('fetchDashboardData', () => {
- beforeEach(() => {
- jest.spyOn(Tracking, 'event');
-
- state.timeRange = defaultTimeRange;
- });
-
- it('commits empty state when state.groups is empty', async () => {
- const localGetters = {
- metricsWithData: () => [],
- };
- await fetchDashboardData({ state, commit, dispatch, getters: localGetters });
- expect(Tracking.event).toHaveBeenCalledWith(document.body.dataset.page, 'dashboard_fetch', {
- label: 'custom_metrics_dashboard',
- property: 'count',
- value: 0,
- });
- expect(dispatch).toHaveBeenCalledTimes(2);
- expect(dispatch).toHaveBeenCalledWith('fetchDeploymentsData');
- expect(dispatch).toHaveBeenCalledWith('fetchVariableMetricLabelValues', {
- defaultQueryParams: {
- start_time: expect.any(String),
- end_time: expect.any(String),
- step: expect.any(Number),
- },
- });
-
- expect(createAlert).not.toHaveBeenCalled();
- });
-
- it('dispatches fetchPrometheusMetric for each panel query', async () => {
- state.dashboard.panelGroups = convertObjectPropsToCamelCase(
- metricsDashboardResponse.dashboard.panel_groups,
- );
-
- const [metric] = state.dashboard.panelGroups[0].panels[0].metrics;
- const localGetters = {
- metricsWithData: () => [metric.id],
- };
-
- await fetchDashboardData({ state, commit, dispatch, getters: localGetters });
- expect(dispatch).toHaveBeenCalledWith('fetchPrometheusMetric', {
- metric,
- defaultQueryParams: {
- start_time: expect.any(String),
- end_time: expect.any(String),
- step: expect.any(Number),
- },
- });
-
- expect(Tracking.event).toHaveBeenCalledWith(document.body.dataset.page, 'dashboard_fetch', {
- label: 'custom_metrics_dashboard',
- property: 'count',
- value: 1,
- });
- });
-
- it('dispatches fetchPrometheusMetric for each panel query, handles an error', async () => {
- state.dashboard.panelGroups = metricsDashboardViewModel.panelGroups;
- const metric = state.dashboard.panelGroups[0].panels[0].metrics[0];
-
- dispatch.mockResolvedValueOnce(); // fetchDeploymentsData
- dispatch.mockResolvedValueOnce(); // fetchVariableMetricLabelValues
- // Mock having one out of four metrics failing
- dispatch.mockRejectedValueOnce(new Error('Error fetching this metric'));
- dispatch.mockResolvedValue();
-
- await fetchDashboardData({ state, commit, dispatch });
- const defaultQueryParams = {
- start_time: expect.any(String),
- end_time: expect.any(String),
- step: expect.any(Number),
- };
-
- expect(dispatch).toHaveBeenCalledTimes(metricsDashboardPanelCount + 2); // plus 1 for deployments
- expect(dispatch).toHaveBeenCalledWith('fetchDeploymentsData');
- expect(dispatch).toHaveBeenCalledWith('fetchVariableMetricLabelValues', {
- defaultQueryParams,
- });
- expect(dispatch).toHaveBeenCalledWith('fetchPrometheusMetric', {
- metric,
- defaultQueryParams,
- });
-
- expect(createAlert).toHaveBeenCalledTimes(1);
- });
- });
-
- describe('fetchPrometheusMetric', () => {
- const defaultQueryParams = {
- start_time: '2019-08-06T12:40:02.184Z',
- end_time: '2019-08-06T20:40:02.184Z',
- step: 60,
- };
- let metric;
- let data;
- let prometheusEndpointPath;
-
- beforeEach(() => {
- state = storeState();
- [metric] = metricsDashboardViewModel.panelGroups[0].panels[0].metrics;
-
- prometheusEndpointPath = metric.prometheusEndpointPath;
-
- data = {
- metricId: metric.metricId,
- result: [1582065167.353, 5, 1582065599.353],
- };
- });
-
- it('commits result', () => {
- mock.onGet(prometheusEndpointPath).reply(HTTP_STATUS_OK, { data }); // One attempt
-
- return testAction(
- fetchPrometheusMetric,
- { metric, defaultQueryParams },
- state,
- [
- {
- type: types.REQUEST_METRIC_RESULT,
- payload: {
- metricId: metric.metricId,
- },
- },
- {
- type: types.RECEIVE_METRIC_RESULT_SUCCESS,
- payload: {
- metricId: metric.metricId,
- data,
- },
- },
- ],
- [],
- );
- });
-
- describe('without metric defined step', () => {
- const expectedParams = {
- start_time: '2019-08-06T12:40:02.184Z',
- end_time: '2019-08-06T20:40:02.184Z',
- step: 60,
- };
-
- it('uses calculated step', async () => {
- mock.onGet(prometheusEndpointPath).reply(HTTP_STATUS_OK, { data }); // One attempt
-
- await testAction(
- fetchPrometheusMetric,
- { metric, defaultQueryParams },
- state,
- [
- {
- type: types.REQUEST_METRIC_RESULT,
- payload: {
- metricId: metric.metricId,
- },
- },
- {
- type: types.RECEIVE_METRIC_RESULT_SUCCESS,
- payload: {
- metricId: metric.metricId,
- data,
- },
- },
- ],
- [],
- );
- expect(mock.history.get[0].params).toEqual(expectedParams);
- });
- });
-
- describe('with metric defined step', () => {
- beforeEach(() => {
- metric.step = 7;
- });
-
- const expectedParams = {
- start_time: '2019-08-06T12:40:02.184Z',
- end_time: '2019-08-06T20:40:02.184Z',
- step: 7,
- };
-
- it('uses metric step', async () => {
- mock.onGet(prometheusEndpointPath).reply(HTTP_STATUS_OK, { data }); // One attempt
-
- await testAction(
- fetchPrometheusMetric,
- { metric, defaultQueryParams },
- state,
- [
- {
- type: types.REQUEST_METRIC_RESULT,
- payload: {
- metricId: metric.metricId,
- },
- },
- {
- type: types.RECEIVE_METRIC_RESULT_SUCCESS,
- payload: {
- metricId: metric.metricId,
- data,
- },
- },
- ],
- [],
- );
- expect(mock.history.get[0].params).toEqual(expectedParams);
- });
- });
-
- it('commits failure, when waiting for results and getting a server error', async () => {
- mock.onGet(prometheusEndpointPath).reply(HTTP_STATUS_INTERNAL_SERVER_ERROR);
-
- const error = new Error('Request failed with status code 500');
-
- await expect(
- testAction(
- fetchPrometheusMetric,
- { metric, defaultQueryParams },
- state,
- [
- {
- type: types.REQUEST_METRIC_RESULT,
- payload: {
- metricId: metric.metricId,
- },
- },
- {
- type: types.RECEIVE_METRIC_RESULT_FAILURE,
- payload: {
- metricId: metric.metricId,
- error,
- },
- },
- ],
- [],
- ),
- ).rejects.toEqual(error);
- });
- });
-
- // Deployments
-
- describe('fetchDeploymentsData', () => {
- it('dispatches receiveDeploymentsDataSuccess on success', () => {
- state.deploymentsEndpoint = '/success';
- mock.onGet(state.deploymentsEndpoint).reply(HTTP_STATUS_OK, {
- deployments: deploymentData,
- });
-
- return testAction(
- fetchDeploymentsData,
- null,
- state,
- [],
- [{ type: 'receiveDeploymentsDataSuccess', payload: deploymentData }],
- );
- });
- it('dispatches receiveDeploymentsDataFailure on error', () => {
- state.deploymentsEndpoint = '/error';
- mock.onGet(state.deploymentsEndpoint).reply(HTTP_STATUS_INTERNAL_SERVER_ERROR);
-
- return testAction(
- fetchDeploymentsData,
- null,
- state,
- [],
- [{ type: 'receiveDeploymentsDataFailure' }],
- () => {
- expect(createAlert).toHaveBeenCalled();
- },
- );
- });
- });
-
- // Environments
-
- describe('fetchEnvironmentsData', () => {
- beforeEach(() => {
- state.projectPath = 'gitlab-org/gitlab-test';
- });
-
- it('setting SET_ENVIRONMENTS_FILTER should dispatch fetchEnvironmentsData', () => {
- jest.spyOn(gqClient, 'mutate').mockReturnValue({
- data: {
- project: {
- data: {
- environments: [],
- },
- },
- },
- });
-
- return testAction(
- filterEnvironments,
- {},
- state,
- [
- {
- type: 'SET_ENVIRONMENTS_FILTER',
- payload: {},
- },
- ],
- [
- {
- type: 'fetchEnvironmentsData',
- },
- ],
- );
- });
-
- it('fetch environments data call takes in search param', () => {
- const mockMutate = jest.spyOn(gqClient, 'mutate');
- const searchTerm = 'Something';
- const mutationVariables = {
- mutation: getEnvironments,
- variables: {
- projectPath: state.projectPath,
- search: searchTerm,
- states: [ENVIRONMENT_AVAILABLE_STATE],
- },
- };
- state.environmentsSearchTerm = searchTerm;
- mockMutate.mockResolvedValue({});
-
- return testAction(
- fetchEnvironmentsData,
- null,
- state,
- [],
- [
- { type: 'requestEnvironmentsData' },
- { type: 'receiveEnvironmentsDataSuccess', payload: [] },
- ],
- () => {
- expect(mockMutate).toHaveBeenCalledWith(mutationVariables);
- },
- );
- });
-
- it('dispatches receiveEnvironmentsDataSuccess on success', () => {
- jest.spyOn(gqClient, 'mutate').mockResolvedValue({
- data: {
- project: {
- data: {
- environments: environmentData,
- },
- },
- },
- });
-
- return testAction(
- fetchEnvironmentsData,
- null,
- state,
- [],
- [
- { type: 'requestEnvironmentsData' },
- {
- type: 'receiveEnvironmentsDataSuccess',
- payload: parseEnvironmentsResponse(environmentData, state.projectPath),
- },
- ],
- );
- });
-
- it('dispatches receiveEnvironmentsDataFailure on error', () => {
- jest.spyOn(gqClient, 'mutate').mockRejectedValue({});
-
- return testAction(
- fetchEnvironmentsData,
- null,
- state,
- [],
- [{ type: 'requestEnvironmentsData' }, { type: 'receiveEnvironmentsDataFailure' }],
- );
- });
- });
-
- describe('fetchAnnotations', () => {
- beforeEach(() => {
- state.timeRange = {
- start: '2020-04-15T12:54:32.137Z',
- end: '2020-08-15T12:54:32.137Z',
- };
- state.projectPath = 'gitlab-org/gitlab-test';
- state.currentEnvironmentName = 'production';
- state.currentDashboard = '.gitlab/dashboards/custom_dashboard.yml';
- // testAction doesn't have access to getters. The state is passed in as getters
- // instead of the actual getters inside the testAction method implementation.
- // All methods downstream that needs access to getters will throw and error.
- // For that reason, the result of the getter is set as a state variable.
- state.fullDashboardPath = store.getters['monitoringDashboard/fullDashboardPath'];
- });
-
- it('fetches annotations data and dispatches receiveAnnotationsSuccess', () => {
- const mockMutate = jest.spyOn(gqClient, 'mutate');
- const mutationVariables = {
- mutation: getAnnotations,
- variables: {
- projectPath: state.projectPath,
- environmentName: state.currentEnvironmentName,
- dashboardPath: state.currentDashboard,
- startingFrom: state.timeRange.start,
- },
- };
- const parsedResponse = parseAnnotationsResponse(annotationsData);
-
- mockMutate.mockResolvedValue({
- data: {
- project: {
- environments: {
- nodes: [
- {
- metricsDashboard: {
- annotations: {
- nodes: parsedResponse,
- },
- },
- },
- ],
- },
- },
- },
- });
-
- return testAction(
- fetchAnnotations,
- null,
- state,
- [],
- [{ type: 'receiveAnnotationsSuccess', payload: parsedResponse }],
- () => {
- expect(mockMutate).toHaveBeenCalledWith(mutationVariables);
- },
- );
- });
-
- it('dispatches receiveAnnotationsFailure if the annotations API call fails', () => {
- const mockMutate = jest.spyOn(gqClient, 'mutate');
- const mutationVariables = {
- mutation: getAnnotations,
- variables: {
- projectPath: state.projectPath,
- environmentName: state.currentEnvironmentName,
- dashboardPath: state.currentDashboard,
- startingFrom: state.timeRange.start,
- },
- };
-
- mockMutate.mockRejectedValue({});
-
- return testAction(
- fetchAnnotations,
- null,
- state,
- [],
- [{ type: 'receiveAnnotationsFailure' }],
- () => {
- expect(mockMutate).toHaveBeenCalledWith(mutationVariables);
- },
- );
- });
- });
-
- describe('fetchDashboardValidationWarnings', () => {
- let mockMutate;
- let mutationVariables;
-
- beforeEach(() => {
- state.projectPath = 'gitlab-org/gitlab-test';
- state.currentEnvironmentName = 'production';
- state.currentDashboard = '.gitlab/dashboards/dashboard_with_warnings.yml';
- // testAction doesn't have access to getters. The state is passed in as getters
- // instead of the actual getters inside the testAction method implementation.
- // All methods downstream that needs access to getters will throw and error.
- // For that reason, the result of the getter is set as a state variable.
- state.fullDashboardPath = store.getters['monitoringDashboard/fullDashboardPath'];
-
- mockMutate = jest.spyOn(gqClient, 'mutate');
- mutationVariables = {
- mutation: getDashboardValidationWarnings,
- variables: {
- projectPath: state.projectPath,
- environmentName: state.currentEnvironmentName,
- dashboardPath: state.fullDashboardPath,
- },
- };
- });
-
- it('dispatches receiveDashboardValidationWarningsSuccess with true payload when there are warnings', () => {
- mockMutate.mockResolvedValue({
- data: {
- project: {
- id: 'gid://gitlab/Project/29',
- environments: {
- nodes: [
- {
- name: 'production',
- metricsDashboard: {
- path: '.gitlab/dashboards/dashboard_errors_test.yml',
- schemaValidationWarnings: ["unit: can't be blank"],
- },
- },
- ],
- },
- },
- },
- });
-
- return testAction(
- fetchDashboardValidationWarnings,
- null,
- state,
- [],
- [{ type: 'receiveDashboardValidationWarningsSuccess', payload: true }],
- () => {
- expect(mockMutate).toHaveBeenCalledWith(mutationVariables);
- },
- );
- });
-
- it('dispatches receiveDashboardValidationWarningsSuccess with false payload when there are no warnings', () => {
- mockMutate.mockResolvedValue({
- data: {
- project: {
- id: 'gid://gitlab/Project/29',
- environments: {
- nodes: [
- {
- name: 'production',
- metricsDashboard: {
- path: '.gitlab/dashboards/dashboard_errors_test.yml',
- schemaValidationWarnings: [],
- },
- },
- ],
- },
- },
- },
- });
-
- return testAction(
- fetchDashboardValidationWarnings,
- null,
- state,
- [],
- [{ type: 'receiveDashboardValidationWarningsSuccess', payload: false }],
- () => {
- expect(mockMutate).toHaveBeenCalledWith(mutationVariables);
- },
- );
- });
-
- it('dispatches receiveDashboardValidationWarningsSuccess with false payload when the response is empty', () => {
- mockMutate.mockResolvedValue({
- data: {
- project: null,
- },
- });
-
- return testAction(
- fetchDashboardValidationWarnings,
- null,
- state,
- [],
- [{ type: 'receiveDashboardValidationWarningsSuccess', payload: false }],
- () => {
- expect(mockMutate).toHaveBeenCalledWith(mutationVariables);
- },
- );
- });
-
- it('dispatches receiveDashboardValidationWarningsFailure if the warnings API call fails', () => {
- mockMutate.mockRejectedValue({});
-
- return testAction(
- fetchDashboardValidationWarnings,
- null,
- state,
- [],
- [{ type: 'receiveDashboardValidationWarningsFailure' }],
- () => {
- expect(mockMutate).toHaveBeenCalledWith(mutationVariables);
- },
- );
- });
- });
-
- // Dashboard manipulation
-
- describe('toggleStarredValue', () => {
- let unstarredDashboard;
- let starredDashboard;
-
- beforeEach(() => {
- state.isUpdatingStarredValue = false;
- [unstarredDashboard, starredDashboard] = dashboardGitResponse;
- });
-
- it('performs no changes if no dashboard is selected', () => {
- return testAction(toggleStarredValue, null, state, [], []);
- });
-
- it('performs no changes if already changing starred value', () => {
- state.selectedDashboard = unstarredDashboard;
- state.isUpdatingStarredValue = true;
- return testAction(toggleStarredValue, null, state, [], []);
- });
-
- it('stars dashboard if it is not starred', () => {
- state.selectedDashboard = unstarredDashboard;
- mock.onPost(unstarredDashboard.user_starred_path).reply(HTTP_STATUS_OK);
-
- return testAction(toggleStarredValue, null, state, [
- { type: types.REQUEST_DASHBOARD_STARRING },
- {
- type: types.RECEIVE_DASHBOARD_STARRING_SUCCESS,
- payload: {
- newStarredValue: true,
- selectedDashboard: unstarredDashboard,
- },
- },
- ]);
- });
-
- it('unstars dashboard if it is starred', () => {
- state.selectedDashboard = starredDashboard;
- mock.onPost(starredDashboard.user_starred_path).reply(HTTP_STATUS_OK);
-
- return testAction(toggleStarredValue, null, state, [
- { type: types.REQUEST_DASHBOARD_STARRING },
- { type: types.RECEIVE_DASHBOARD_STARRING_FAILURE },
- ]);
- });
- });
-
- describe('duplicateSystemDashboard', () => {
- beforeEach(() => {
- state.dashboardsEndpoint = '/dashboards.json';
- });
-
- it('Succesful POST request resolves', async () => {
- mock.onPost(state.dashboardsEndpoint).reply(HTTP_STATUS_CREATED, {
- dashboard: dashboardGitResponse[1],
- });
-
- await testAction(duplicateSystemDashboard, {}, state, [], []);
- expect(mock.history.post).toHaveLength(1);
- });
-
- it('Succesful POST request resolves to a dashboard', async () => {
- const mockCreatedDashboard = dashboardGitResponse[1];
-
- const params = {
- dashboard: 'my-dashboard',
- fileName: 'file-name.yml',
- branch: 'my-new-branch',
- commitMessage: 'A new commit message',
- };
-
- const expectedPayload = JSON.stringify({
- dashboard: 'my-dashboard',
- file_name: 'file-name.yml',
- branch: 'my-new-branch',
- commit_message: 'A new commit message',
- });
-
- mock.onPost(state.dashboardsEndpoint).reply(HTTP_STATUS_CREATED, {
- dashboard: mockCreatedDashboard,
- });
-
- const result = await testAction(duplicateSystemDashboard, params, state, [], []);
- expect(mock.history.post).toHaveLength(1);
- expect(mock.history.post[0].data).toEqual(expectedPayload);
- expect(result).toEqual(mockCreatedDashboard);
- });
-
- it('Failed POST request throws an error', async () => {
- mock.onPost(state.dashboardsEndpoint).reply(HTTP_STATUS_BAD_REQUEST);
-
- await expect(testAction(duplicateSystemDashboard, {}, state, [], [])).rejects.toEqual(
- 'There was an error creating the dashboard.',
- );
- expect(mock.history.post).toHaveLength(1);
- });
-
- it('Failed POST request throws an error with a description', async () => {
- const backendErrorMsg = 'This file already exists!';
-
- mock.onPost(state.dashboardsEndpoint).reply(HTTP_STATUS_BAD_REQUEST, {
- error: backendErrorMsg,
- });
-
- await expect(testAction(duplicateSystemDashboard, {}, state, [], [])).rejects.toEqual(
- `There was an error creating the dashboard. ${backendErrorMsg}`,
- );
- expect(mock.history.post).toHaveLength(1);
- });
- });
-
- // Variables manipulation
-
- describe('updateVariablesAndFetchData', () => {
- it('should commit UPDATE_VARIABLE_VALUE mutation and fetch data', () => {
- return testAction(
- updateVariablesAndFetchData,
- { pod: 'POD' },
- state,
- [
- {
- type: types.UPDATE_VARIABLE_VALUE,
- payload: { pod: 'POD' },
- },
- ],
- [
- {
- type: 'fetchDashboardData',
- },
- ],
- );
- });
- });
-
- describe('fetchVariableMetricLabelValues', () => {
- const variable = {
- type: 'metric_label_values',
- name: 'label1',
- options: {
- prometheusEndpointPath: '/series?match[]=metric_name',
- label: 'job',
- },
- };
-
- const defaultQueryParams = {
- start_time: '2019-08-06T12:40:02.184Z',
- end_time: '2019-08-06T20:40:02.184Z',
- };
-
- beforeEach(() => {
- state = {
- ...state,
- timeRange: defaultTimeRange,
- variables: [variable],
- };
- });
-
- it('should commit UPDATE_VARIABLE_METRIC_LABEL_VALUES mutation and fetch data', () => {
- const data = [
- {
- __name__: 'up',
- job: 'prometheus',
- },
- {
- __name__: 'up',
- job: 'POD',
- },
- ];
-
- mock.onGet('/series?match[]=metric_name').reply(HTTP_STATUS_OK, {
- status: 'success',
- data,
- });
-
- return testAction(
- fetchVariableMetricLabelValues,
- { defaultQueryParams },
- state,
- [
- {
- type: types.UPDATE_VARIABLE_METRIC_LABEL_VALUES,
- payload: { variable, label: 'job', data },
- },
- ],
- [],
- );
- });
-
- it('should notify the user that dynamic options were not loaded', () => {
- mock.onGet('/series?match[]=metric_name').reply(HTTP_STATUS_INTERNAL_SERVER_ERROR);
-
- return testAction(fetchVariableMetricLabelValues, { defaultQueryParams }, state, [], []).then(
- () => {
- expect(createAlert).toHaveBeenCalledTimes(1);
- expect(createAlert).toHaveBeenCalledWith({
- message: expect.stringContaining('error getting options for variable "label1"'),
- });
- },
- );
- });
- });
-
- describe('fetchPanelPreview', () => {
- const panelPreviewEndpoint = '/builder.json';
- const mockYmlContent = 'mock yml content';
-
- beforeEach(() => {
- state.panelPreviewEndpoint = panelPreviewEndpoint;
- });
-
- it('should not commit or dispatch if payload is empty', () => {
- testAction(fetchPanelPreview, '', state, [], []);
- });
-
- it('should store the panel and fetch metric results', () => {
- const mockPanel = {
- title: 'Go heap size',
- type: 'area-chart',
- };
-
- mock
- .onPost(panelPreviewEndpoint, { panel_yaml: mockYmlContent })
- .reply(HTTP_STATUS_OK, mockPanel);
-
- testAction(
- fetchPanelPreview,
- mockYmlContent,
- state,
- [
- { type: types.SET_PANEL_PREVIEW_IS_SHOWN, payload: true },
- { type: types.REQUEST_PANEL_PREVIEW, payload: mockYmlContent },
- { type: types.RECEIVE_PANEL_PREVIEW_SUCCESS, payload: mockPanel },
- ],
- [{ type: 'fetchPanelPreviewMetrics' }],
- );
- });
-
- it('should display a validation error when the backend cannot process the yml', () => {
- const mockErrorMsg = 'Each "metric" must define one of :query or :query_range';
-
- mock
- .onPost(panelPreviewEndpoint, { panel_yaml: mockYmlContent })
- .reply(HTTP_STATUS_UNPROCESSABLE_ENTITY, {
- message: mockErrorMsg,
- });
-
- testAction(fetchPanelPreview, mockYmlContent, state, [
- { type: types.SET_PANEL_PREVIEW_IS_SHOWN, payload: true },
- { type: types.REQUEST_PANEL_PREVIEW, payload: mockYmlContent },
- { type: types.RECEIVE_PANEL_PREVIEW_FAILURE, payload: mockErrorMsg },
- ]);
- });
-
- it('should display a generic error when the backend fails', () => {
- mock
- .onPost(panelPreviewEndpoint, { panel_yaml: mockYmlContent })
- .reply(HTTP_STATUS_INTERNAL_SERVER_ERROR);
-
- testAction(fetchPanelPreview, mockYmlContent, state, [
- { type: types.SET_PANEL_PREVIEW_IS_SHOWN, payload: true },
- { type: types.REQUEST_PANEL_PREVIEW, payload: mockYmlContent },
- {
- type: types.RECEIVE_PANEL_PREVIEW_FAILURE,
- payload: 'Request failed with status code 500',
- },
- ]);
- });
- });
-});
diff --git a/spec/frontend/monitoring/store/embed_group/actions_spec.js b/spec/frontend/monitoring/store/embed_group/actions_spec.js
deleted file mode 100644
index 5bdfc506cff..00000000000
--- a/spec/frontend/monitoring/store/embed_group/actions_spec.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// import store from '~/monitoring/stores/embed_group';
-import * as actions from '~/monitoring/stores/embed_group/actions';
-import * as types from '~/monitoring/stores/embed_group/mutation_types';
-import { mockNamespace } from '../../mock_data';
-
-describe('Embed group actions', () => {
- describe('addModule', () => {
- it('adds a module to the store', () => {
- const commit = jest.fn();
-
- actions.addModule({ commit }, mockNamespace);
-
- expect(commit).toHaveBeenCalledWith(types.ADD_MODULE, mockNamespace);
- });
- });
-});
diff --git a/spec/frontend/monitoring/store/embed_group/getters_spec.js b/spec/frontend/monitoring/store/embed_group/getters_spec.js
deleted file mode 100644
index e3241e41f5e..00000000000
--- a/spec/frontend/monitoring/store/embed_group/getters_spec.js
+++ /dev/null
@@ -1,19 +0,0 @@
-import { metricsWithData } from '~/monitoring/stores/embed_group/getters';
-import { mockNamespaces } from '../../mock_data';
-
-describe('Embed group getters', () => {
- describe('metricsWithData', () => {
- it('correctly sums the number of metrics with data', () => {
- const mockMetric = {};
- const state = {
- modules: mockNamespaces,
- };
- const rootGetters = {
- [`${mockNamespaces[0]}/metricsWithData`]: () => [mockMetric],
- [`${mockNamespaces[1]}/metricsWithData`]: () => [mockMetric, mockMetric],
- };
-
- expect(metricsWithData(state, null, null, rootGetters)).toEqual([1, 2]);
- });
- });
-});
diff --git a/spec/frontend/monitoring/store/embed_group/mutations_spec.js b/spec/frontend/monitoring/store/embed_group/mutations_spec.js
deleted file mode 100644
index 2f8d7687aad..00000000000
--- a/spec/frontend/monitoring/store/embed_group/mutations_spec.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import * as types from '~/monitoring/stores/embed_group/mutation_types';
-import mutations from '~/monitoring/stores/embed_group/mutations';
-import state from '~/monitoring/stores/embed_group/state';
-import { mockNamespace } from '../../mock_data';
-
-describe('Embed group mutations', () => {
- describe('ADD_MODULE', () => {
- it('should add a module', () => {
- const stateCopy = state();
-
- mutations[types.ADD_MODULE](stateCopy, mockNamespace);
-
- expect(stateCopy.modules).toEqual([mockNamespace]);
- });
- });
-});
diff --git a/spec/frontend/monitoring/store/getters_spec.js b/spec/frontend/monitoring/store/getters_spec.js
deleted file mode 100644
index c7f3bdbf1f8..00000000000
--- a/spec/frontend/monitoring/store/getters_spec.js
+++ /dev/null
@@ -1,457 +0,0 @@
-import _ from 'lodash';
-import { metricStates } from '~/monitoring/constants';
-import * as getters from '~/monitoring/stores/getters';
-import * as types from '~/monitoring/stores/mutation_types';
-import mutations from '~/monitoring/stores/mutations';
-import { metricsDashboardPayload } from '../fixture_data';
-import {
- customDashboardBasePath,
- environmentData,
- metricsResult,
- dashboardGitResponse,
- storeVariables,
- mockLinks,
-} from '../mock_data';
-
-describe('Monitoring store Getters', () => {
- let state;
-
- const getMetric = ({ group = 0, panel = 0, metric = 0 } = {}) =>
- state.dashboard.panelGroups[group].panels[panel].metrics[metric];
-
- const setMetricSuccess = ({ group, panel, metric, result = metricsResult } = {}) => {
- const { metricId } = getMetric({ group, panel, metric });
- mutations[types.RECEIVE_METRIC_RESULT_SUCCESS](state, {
- metricId,
- data: {
- resultType: 'matrix',
- result,
- },
- });
- };
-
- const setMetricFailure = ({ group, panel, metric } = {}) => {
- const { metricId } = getMetric({ group, panel, metric });
- mutations[types.RECEIVE_METRIC_RESULT_FAILURE](state, {
- metricId,
- });
- };
-
- describe('getMetricStates', () => {
- let setupState;
- let getMetricStates;
-
- beforeEach(() => {
- setupState = (initState = {}) => {
- state = initState;
- getMetricStates = getters.getMetricStates(state);
- };
- });
-
- it('has method-style access', () => {
- setupState();
-
- expect(getMetricStates).toEqual(expect.any(Function));
- });
-
- it('when dashboard has no panel groups, returns empty', () => {
- setupState({
- dashboard: {
- panelGroups: [],
- },
- });
-
- expect(getMetricStates()).toEqual([]);
- });
-
- describe('when the dashboard is set', () => {
- let groups;
- beforeEach(() => {
- setupState({
- dashboard: { panelGroups: [] },
- });
- mutations[types.RECEIVE_METRICS_DASHBOARD_SUCCESS](state, metricsDashboardPayload);
- groups = state.dashboard.panelGroups;
- });
-
- it('no loaded metric returns empty', () => {
- expect(getMetricStates()).toEqual([]);
- });
-
- it('on an empty metric with no result, returns NO_DATA', () => {
- mutations[types.RECEIVE_METRICS_DASHBOARD_SUCCESS](state, metricsDashboardPayload);
- setMetricSuccess({ group: 2, result: [] });
-
- expect(getMetricStates()).toEqual([metricStates.NO_DATA]);
- });
-
- it('on a metric with a result, returns OK', () => {
- mutations[types.RECEIVE_METRICS_DASHBOARD_SUCCESS](state, metricsDashboardPayload);
- setMetricSuccess({ group: 1 });
-
- expect(getMetricStates()).toEqual([metricStates.OK]);
- });
-
- it('on a metric with an error, returns an error', () => {
- mutations[types.RECEIVE_METRICS_DASHBOARD_SUCCESS](state, metricsDashboardPayload);
- setMetricFailure({});
-
- expect(getMetricStates()).toEqual([metricStates.UNKNOWN_ERROR]);
- });
-
- it('on multiple metrics with results, returns OK', () => {
- mutations[types.RECEIVE_METRICS_DASHBOARD_SUCCESS](state, metricsDashboardPayload);
-
- setMetricSuccess({ group: 1 });
- setMetricSuccess({ group: 1, panel: 1 });
-
- expect(getMetricStates()).toEqual([metricStates.OK]);
-
- // Filtered by groups
- expect(getMetricStates(state.dashboard.panelGroups[1].key)).toEqual([metricStates.OK]);
- expect(getMetricStates(state.dashboard.panelGroups[2].key)).toEqual([]);
- });
- it('on multiple metrics errors', () => {
- mutations[types.RECEIVE_METRICS_DASHBOARD_SUCCESS](state, metricsDashboardPayload);
-
- setMetricFailure({});
- setMetricFailure({ group: 1 });
-
- // Entire dashboard fails
- expect(getMetricStates()).toEqual([metricStates.UNKNOWN_ERROR]);
- expect(getMetricStates(groups[0].key)).toEqual([metricStates.UNKNOWN_ERROR]);
- expect(getMetricStates(groups[1].key)).toEqual([metricStates.UNKNOWN_ERROR]);
- });
-
- it('on multiple metrics with errors', () => {
- mutations[types.RECEIVE_METRICS_DASHBOARD_SUCCESS](state, metricsDashboardPayload);
-
- // An success in 1 group
- setMetricSuccess({ group: 1 });
-
- // An error in 2 groups
- setMetricFailure({ group: 1, panel: 1 });
- setMetricFailure({ group: 2, panel: 0 });
-
- expect(getMetricStates()).toEqual([metricStates.OK, metricStates.UNKNOWN_ERROR]);
- expect(getMetricStates(groups[1].key)).toEqual([
- metricStates.OK,
- metricStates.UNKNOWN_ERROR,
- ]);
- expect(getMetricStates(groups[2].key)).toEqual([metricStates.UNKNOWN_ERROR]);
- });
- });
- });
-
- describe('metricsWithData', () => {
- let metricsWithData;
- let setupState;
-
- beforeEach(() => {
- setupState = (initState = {}) => {
- state = initState;
- metricsWithData = getters.metricsWithData(state);
- };
- });
-
- afterEach(() => {
- state = null;
- });
-
- it('has method-style access', () => {
- setupState();
-
- expect(metricsWithData).toEqual(expect.any(Function));
- });
-
- it('when dashboard has no panel groups, returns empty', () => {
- setupState({
- dashboard: {
- panelGroups: [],
- },
- });
-
- expect(metricsWithData()).toEqual([]);
- });
-
- describe('when the dashboard is set', () => {
- beforeEach(() => {
- setupState({
- dashboard: { panelGroups: [] },
- });
- });
-
- it('no loaded metric returns empty', () => {
- mutations[types.RECEIVE_METRICS_DASHBOARD_SUCCESS](state, metricsDashboardPayload);
-
- expect(metricsWithData()).toEqual([]);
- });
-
- it('an empty metric, returns empty', () => {
- mutations[types.RECEIVE_METRICS_DASHBOARD_SUCCESS](state, metricsDashboardPayload);
- setMetricSuccess({ result: [] });
-
- expect(metricsWithData()).toEqual([]);
- });
-
- it('a metric with results, it returns a metric', () => {
- mutations[types.RECEIVE_METRICS_DASHBOARD_SUCCESS](state, metricsDashboardPayload);
- setMetricSuccess();
-
- expect(metricsWithData()).toEqual([getMetric().metricId]);
- });
-
- it('multiple metrics with results, it return multiple metrics', () => {
- mutations[types.RECEIVE_METRICS_DASHBOARD_SUCCESS](state, metricsDashboardPayload);
- setMetricSuccess({ panel: 0 });
- setMetricSuccess({ panel: 1 });
-
- expect(metricsWithData()).toEqual([
- getMetric({ panel: 0 }).metricId,
- getMetric({ panel: 1 }).metricId,
- ]);
- });
-
- it('multiple metrics with results, it returns metrics filtered by group', () => {
- mutations[types.RECEIVE_METRICS_DASHBOARD_SUCCESS](state, metricsDashboardPayload);
-
- setMetricSuccess({ group: 1 });
- setMetricSuccess({ group: 1, panel: 1 });
-
- // First group has metrics
- expect(metricsWithData(state.dashboard.panelGroups[1].key)).toEqual([
- getMetric({ group: 1 }).metricId,
- getMetric({ group: 1, panel: 1 }).metricId,
- ]);
-
- // Second group has no metrics
- expect(metricsWithData(state.dashboard.panelGroups[2].key)).toEqual([]);
- });
- });
- });
-
- describe('filteredEnvironments', () => {
- const setupState = (initState = {}) => {
- state = {
- ...state,
- ...initState,
- };
- };
-
- beforeAll(() => {
- setupState({
- environments: environmentData,
- });
- });
-
- afterAll(() => {
- state = null;
- });
-
- [
- {
- input: '',
- output: 17,
- },
- {
- input: ' ',
- output: 17,
- },
- {
- input: null,
- output: 17,
- },
- {
- input: 'does-not-exist',
- output: 0,
- },
- {
- input: 'noop-branch-',
- output: 15,
- },
- {
- input: 'noop-branch-9',
- output: 1,
- },
- ].forEach(({ input, output }) => {
- it(`filteredEnvironments returns ${output} items for ${input}`, () => {
- setupState({
- environmentsSearchTerm: input,
- });
- expect(getters.filteredEnvironments(state).length).toBe(output);
- });
- });
- });
-
- describe('metricsSavedToDb', () => {
- let metricsSavedToDb;
- let mockData;
-
- beforeEach(() => {
- mockData = _.cloneDeep(metricsDashboardPayload);
- state = {
- dashboard: {
- panelGroups: [],
- },
- };
- });
-
- it('return no metrics when dashboard is not persisted', () => {
- mutations[types.RECEIVE_METRICS_DASHBOARD_SUCCESS](state, mockData);
- metricsSavedToDb = getters.metricsSavedToDb(state);
-
- expect(metricsSavedToDb).toEqual([]);
- });
-
- it('return a metric id when one metric is persisted', () => {
- const id = 99;
-
- const [metric] = mockData.panel_groups[0].panels[0].metrics;
-
- metric.metric_id = id;
-
- mutations[types.RECEIVE_METRICS_DASHBOARD_SUCCESS](state, mockData);
- metricsSavedToDb = getters.metricsSavedToDb(state);
-
- expect(metricsSavedToDb).toEqual([`${id}_${metric.id}`]);
- });
-
- it('return a metric id when two metrics are persisted', () => {
- const id1 = 101;
- const id2 = 102;
-
- const [metric1] = mockData.panel_groups[0].panels[0].metrics;
- const [metric2] = mockData.panel_groups[0].panels[1].metrics;
-
- // database persisted 2 metrics
- metric1.metric_id = id1;
- metric2.metric_id = id2;
-
- mutations[types.RECEIVE_METRICS_DASHBOARD_SUCCESS](state, mockData);
- metricsSavedToDb = getters.metricsSavedToDb(state);
-
- expect(metricsSavedToDb).toEqual([`${id1}_${metric1.id}`, `${id2}_${metric2.id}`]);
- });
- });
-
- describe('getCustomVariablesParams', () => {
- beforeEach(() => {
- state = {
- variables: {},
- };
- });
-
- it('transforms the variables object to an array in the [variable, variable_value] format for all variable types', () => {
- state.variables = storeVariables;
- const variablesArray = getters.getCustomVariablesParams(state);
-
- expect(variablesArray).toEqual({
- 'variables[textSimple]': 'My default value',
- 'variables[textAdvanced]': 'A default value',
- 'variables[customSimple]': 'value1',
- 'variables[customAdvanced]': 'value2',
- 'variables[customAdvancedWithoutLabel]': 'value2',
- 'variables[customAdvancedWithoutOptText]': 'value2',
- });
- });
-
- it('transforms the variables object to an empty array when no keys are present', () => {
- state.variables = [];
- const variablesArray = getters.getCustomVariablesParams(state);
-
- expect(variablesArray).toEqual({});
- });
- });
-
- describe('selectedDashboard', () => {
- const { selectedDashboard } = getters;
- const localGetters = (localState) => ({
- fullDashboardPath: getters.fullDashboardPath(localState),
- });
-
- it('returns a dashboard', () => {
- const localState = {
- allDashboards: dashboardGitResponse,
- currentDashboard: dashboardGitResponse[0].path,
- customDashboardBasePath,
- };
- expect(selectedDashboard(localState, localGetters(localState))).toEqual(
- dashboardGitResponse[0],
- );
- });
-
- it('returns a dashboard different from the overview dashboard', () => {
- const localState = {
- allDashboards: dashboardGitResponse,
- currentDashboard: dashboardGitResponse[1].path,
- customDashboardBasePath,
- };
- expect(selectedDashboard(localState, localGetters(localState))).toEqual(
- dashboardGitResponse[1],
- );
- });
-
- it('returns the overview dashboard when no dashboard is selected', () => {
- const localState = {
- allDashboards: dashboardGitResponse,
- currentDashboard: null,
- customDashboardBasePath,
- };
- expect(selectedDashboard(localState, localGetters(localState))).toEqual(
- dashboardGitResponse[0],
- );
- });
-
- it('returns the overview dashboard when dashboard cannot be found', () => {
- const localState = {
- allDashboards: dashboardGitResponse,
- currentDashboard: 'wrong_path',
- customDashboardBasePath,
- };
- expect(selectedDashboard(localState, localGetters(localState))).toEqual(
- dashboardGitResponse[0],
- );
- });
-
- it('returns null when no dashboards are present', () => {
- const localState = {
- allDashboards: [],
- currentDashboard: dashboardGitResponse[0].path,
- customDashboardBasePath,
- };
- expect(selectedDashboard(localState, localGetters(localState))).toEqual(null);
- });
- });
-
- describe('linksWithMetadata', () => {
- const setupState = (initState = {}) => {
- state = {
- ...state,
- ...initState,
- };
- };
-
- beforeAll(() => {
- setupState({
- links: mockLinks,
- });
- });
-
- afterAll(() => {
- state = null;
- });
-
- it.each`
- timeRange | output
- ${{}} | ${''}
- ${{ start: '2020-01-01T00:00:00.000Z', end: '2020-01-31T23:59:00.000Z' }} | ${'start=2020-01-01T00%3A00%3A00.000Z&end=2020-01-31T23%3A59%3A00.000Z'}
- ${{ duration: { seconds: 86400 } }} | ${'duration_seconds=86400'}
- `('linksWithMetadata returns URLs with time range', ({ timeRange, output }) => {
- setupState({ timeRange });
- const links = getters.linksWithMetadata(state);
- links.forEach(({ url }) => {
- expect(url).toMatch(output);
- });
- });
- });
-});
diff --git a/spec/frontend/monitoring/store/index_spec.js b/spec/frontend/monitoring/store/index_spec.js
deleted file mode 100644
index 4184687eec8..00000000000
--- a/spec/frontend/monitoring/store/index_spec.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import { createStore } from '~/monitoring/stores';
-
-describe('Monitoring Store Index', () => {
- it('creates store with a `monitoringDashboard` namespace', () => {
- expect(createStore().state).toEqual({
- monitoringDashboard: expect.any(Object),
- });
- });
-
- it('creates store with initial values', () => {
- const defaults = {
- deploymentsEndpoint: '/mock/deployments',
- dashboardEndpoint: '/mock/dashboard',
- dashboardsEndpoint: '/mock/dashboards',
- };
-
- const { state } = createStore(defaults);
-
- expect(state).toEqual({
- monitoringDashboard: expect.objectContaining(defaults),
- });
- });
-});
diff --git a/spec/frontend/monitoring/store/mutations_spec.js b/spec/frontend/monitoring/store/mutations_spec.js
deleted file mode 100644
index 3baef743f42..00000000000
--- a/spec/frontend/monitoring/store/mutations_spec.js
+++ /dev/null
@@ -1,586 +0,0 @@
-import { HTTP_STATUS_BAD_REQUEST, HTTP_STATUS_SERVICE_UNAVAILABLE } from '~/lib/utils/http_status';
-import { dashboardEmptyStates, metricStates } from '~/monitoring/constants';
-import * as types from '~/monitoring/stores/mutation_types';
-import mutations from '~/monitoring/stores/mutations';
-import state from '~/monitoring/stores/state';
-import { metricsDashboardPayload } from '../fixture_data';
-import { prometheusMatrixMultiResult } from '../graph_data';
-import { deploymentData, dashboardGitResponse, storeTextVariables } from '../mock_data';
-
-describe('Monitoring mutations', () => {
- let stateCopy;
-
- beforeEach(() => {
- stateCopy = state();
- });
-
- describe('REQUEST_METRICS_DASHBOARD', () => {
- it('sets an empty loading state', () => {
- mutations[types.REQUEST_METRICS_DASHBOARD](stateCopy);
-
- expect(stateCopy.emptyState).toBe(dashboardEmptyStates.LOADING);
- });
- });
-
- describe('RECEIVE_METRICS_DASHBOARD_SUCCESS', () => {
- let payload;
- const getGroups = () => stateCopy.dashboard.panelGroups;
-
- beforeEach(() => {
- stateCopy.dashboard.panelGroups = [];
- payload = metricsDashboardPayload;
- });
- it('sets an empty noData state when the dashboard is empty', () => {
- const emptyDashboardPayload = {
- ...payload,
- panel_groups: [],
- };
-
- mutations[types.RECEIVE_METRICS_DASHBOARD_SUCCESS](stateCopy, emptyDashboardPayload);
- const groups = getGroups();
-
- expect(groups).toEqual([]);
- expect(stateCopy.emptyState).toBe(dashboardEmptyStates.NO_DATA);
- });
- it('adds a key to the group', () => {
- mutations[types.RECEIVE_METRICS_DASHBOARD_SUCCESS](stateCopy, payload);
- const groups = getGroups();
-
- expect(groups[0].key).toBe('system-metrics-kubernetes-0');
- expect(groups[1].key).toBe('response-metrics-nginx-ingress-vts-1');
- expect(groups[2].key).toBe('response-metrics-nginx-ingress-2');
- });
- it('normalizes values', () => {
- mutations[types.RECEIVE_METRICS_DASHBOARD_SUCCESS](stateCopy, payload);
- const expectedLabel = 'Pod average (MB)';
-
- const { label, queryRange } = getGroups()[0].panels[2].metrics[0];
- expect(label).toEqual(expectedLabel);
- expect(queryRange.length).toBeGreaterThan(0);
- });
- it('contains six groups, with panels with a metric each', () => {
- mutations[types.RECEIVE_METRICS_DASHBOARD_SUCCESS](stateCopy, payload);
-
- const groups = getGroups();
-
- expect(groups).toBeDefined();
- expect(groups).toHaveLength(6);
-
- expect(groups[0].panels).toHaveLength(7);
- expect(groups[0].panels[0].metrics).toHaveLength(1);
- expect(groups[0].panels[1].metrics).toHaveLength(1);
- expect(groups[0].panels[2].metrics).toHaveLength(1);
-
- expect(groups[1].panels).toHaveLength(3);
- expect(groups[1].panels[0].metrics).toHaveLength(1);
- });
- it('assigns metrics a metric id', () => {
- mutations[types.RECEIVE_METRICS_DASHBOARD_SUCCESS](stateCopy, payload);
-
- const groups = getGroups();
-
- expect(groups[0].panels[0].metrics[0].metricId).toEqual(
- 'NO_DB_system_metrics_kubernetes_container_memory_total',
- );
- expect(groups[1].panels[0].metrics[0].metricId).toEqual(
- 'NO_DB_response_metrics_nginx_ingress_throughput_status_code',
- );
- expect(groups[2].panels[0].metrics[0].metricId).toEqual(
- 'NO_DB_response_metrics_nginx_ingress_16_throughput_status_code',
- );
- });
- });
-
- describe('RECEIVE_METRICS_DASHBOARD_FAILURE', () => {
- it('sets an empty noData state when an empty error occurs', () => {
- mutations[types.RECEIVE_METRICS_DASHBOARD_FAILURE](stateCopy);
-
- expect(stateCopy.emptyState).toBe(dashboardEmptyStates.NO_DATA);
- });
-
- it('sets an empty unableToConnect state when an error occurs', () => {
- mutations[types.RECEIVE_METRICS_DASHBOARD_FAILURE](stateCopy, 'myerror');
-
- expect(stateCopy.emptyState).toBe(dashboardEmptyStates.UNABLE_TO_CONNECT);
- });
- });
-
- describe('Dashboard starring mutations', () => {
- it('REQUEST_DASHBOARD_STARRING', () => {
- stateCopy = { isUpdatingStarredValue: false };
- mutations[types.REQUEST_DASHBOARD_STARRING](stateCopy);
-
- expect(stateCopy.isUpdatingStarredValue).toBe(true);
- });
-
- describe('RECEIVE_DASHBOARD_STARRING_SUCCESS', () => {
- let allDashboards;
-
- beforeEach(() => {
- allDashboards = [...dashboardGitResponse];
- stateCopy = {
- allDashboards,
- currentDashboard: allDashboards[1].path,
- isUpdatingStarredValue: true,
- };
- });
-
- it('sets a dashboard as starred', () => {
- mutations[types.RECEIVE_DASHBOARD_STARRING_SUCCESS](stateCopy, {
- selectedDashboard: stateCopy.allDashboards[1],
- newStarredValue: true,
- });
-
- expect(stateCopy.isUpdatingStarredValue).toBe(false);
- expect(stateCopy.allDashboards[1].starred).toBe(true);
- });
-
- it('sets a dashboard as unstarred', () => {
- mutations[types.RECEIVE_DASHBOARD_STARRING_SUCCESS](stateCopy, {
- selectedDashboard: stateCopy.allDashboards[1],
- newStarredValue: false,
- });
-
- expect(stateCopy.isUpdatingStarredValue).toBe(false);
- expect(stateCopy.allDashboards[1].starred).toBe(false);
- });
- });
-
- it('RECEIVE_DASHBOARD_STARRING_FAILURE', () => {
- stateCopy = { isUpdatingStarredValue: true };
- mutations[types.RECEIVE_DASHBOARD_STARRING_FAILURE](stateCopy);
-
- expect(stateCopy.isUpdatingStarredValue).toBe(false);
- });
- });
-
- describe('RECEIVE_DEPLOYMENTS_DATA_SUCCESS', () => {
- it('stores the deployment data', () => {
- stateCopy.deploymentData = [];
- mutations[types.RECEIVE_DEPLOYMENTS_DATA_SUCCESS](stateCopy, deploymentData);
- expect(stateCopy.deploymentData).toBeDefined();
- expect(stateCopy.deploymentData).toHaveLength(3);
- expect(typeof stateCopy.deploymentData[0]).toEqual('object');
- });
- });
-
- describe('SET_INITIAL_STATE', () => {
- it('should set all the endpoints', () => {
- mutations[types.SET_INITIAL_STATE](stateCopy, {
- deploymentsEndpoint: 'deployments.json',
- dashboardEndpoint: 'dashboard.json',
- projectPath: '/gitlab-org/gitlab-foss',
- currentEnvironmentName: 'production',
- });
- expect(stateCopy.deploymentsEndpoint).toEqual('deployments.json');
- expect(stateCopy.dashboardEndpoint).toEqual('dashboard.json');
- expect(stateCopy.projectPath).toEqual('/gitlab-org/gitlab-foss');
- expect(stateCopy.currentEnvironmentName).toEqual('production');
- });
-
- it('should not remove previously set properties', () => {
- mutations[types.SET_INITIAL_STATE](stateCopy, {
- dashboardEndpoint: 'dashboard.json',
- });
- mutations[types.SET_INITIAL_STATE](stateCopy, {
- projectPath: '/gitlab-org/gitlab-foss',
- });
- mutations[types.SET_INITIAL_STATE](stateCopy, {
- currentEnvironmentName: 'canary',
- });
-
- expect(stateCopy).toMatchObject({
- dashboardEndpoint: 'dashboard.json',
- projectPath: '/gitlab-org/gitlab-foss',
- currentEnvironmentName: 'canary',
- });
- });
-
- it('should not update unknown properties', () => {
- mutations[types.SET_INITIAL_STATE](stateCopy, {
- dashboardEndpoint: 'dashboard.json',
- someOtherProperty: 'some invalid value', // someOtherProperty is not allowed
- });
-
- expect(stateCopy.dashboardEndpoint).toBe('dashboard.json');
- expect(stateCopy.someOtherProperty).toBeUndefined();
- });
- });
-
- describe('SET_ENDPOINTS', () => {
- it('should set all the endpoints', () => {
- mutations[types.SET_ENDPOINTS](stateCopy, {
- deploymentsEndpoint: 'deployments.json',
- dashboardEndpoint: 'dashboard.json',
- projectPath: '/gitlab-org/gitlab-foss',
- });
- expect(stateCopy.deploymentsEndpoint).toEqual('deployments.json');
- expect(stateCopy.dashboardEndpoint).toEqual('dashboard.json');
- expect(stateCopy.projectPath).toEqual('/gitlab-org/gitlab-foss');
- });
-
- it('should not remove previously set properties', () => {
- mutations[types.SET_ENDPOINTS](stateCopy, {
- dashboardEndpoint: 'dashboard.json',
- });
- mutations[types.SET_ENDPOINTS](stateCopy, {
- projectPath: '/gitlab-org/gitlab-foss',
- });
-
- expect(stateCopy).toMatchObject({
- dashboardEndpoint: 'dashboard.json',
- projectPath: '/gitlab-org/gitlab-foss',
- });
- });
-
- it('should not update unknown properties', () => {
- mutations[types.SET_ENDPOINTS](stateCopy, {
- dashboardEndpoint: 'dashboard.json',
- someOtherProperty: 'some invalid value', // someOtherProperty is not allowed
- });
-
- expect(stateCopy.dashboardEndpoint).toBe('dashboard.json');
- expect(stateCopy.someOtherProperty).toBeUndefined();
- });
- });
-
- describe('Individual panel/metric results', () => {
- const metricId = 'NO_DB_response_metrics_nginx_ingress_throughput_status_code';
-
- const dashboard = metricsDashboardPayload;
- const getMetric = () => stateCopy.dashboard.panelGroups[1].panels[0].metrics[0];
-
- describe('REQUEST_METRIC_RESULT', () => {
- beforeEach(() => {
- mutations[types.RECEIVE_METRICS_DASHBOARD_SUCCESS](stateCopy, dashboard);
- });
- it('stores a loading state on a metric', () => {
- mutations[types.REQUEST_METRIC_RESULT](stateCopy, {
- metricId,
- });
-
- expect(getMetric()).toEqual(
- expect.objectContaining({
- loading: true,
- }),
- );
- });
- });
-
- describe('RECEIVE_METRIC_RESULT_SUCCESS', () => {
- beforeEach(() => {
- mutations[types.RECEIVE_METRICS_DASHBOARD_SUCCESS](stateCopy, dashboard);
- });
-
- it('adds results to the store', () => {
- const data = prometheusMatrixMultiResult();
-
- expect(getMetric().result).toBe(null);
-
- mutations[types.RECEIVE_METRIC_RESULT_SUCCESS](stateCopy, {
- metricId,
- data,
- });
-
- expect(getMetric().result).toHaveLength(data.result.length);
- expect(getMetric()).toEqual(
- expect.objectContaining({
- loading: false,
- state: metricStates.OK,
- }),
- );
- });
- });
-
- describe('RECEIVE_METRIC_RESULT_FAILURE', () => {
- beforeEach(() => {
- mutations[types.RECEIVE_METRICS_DASHBOARD_SUCCESS](stateCopy, dashboard);
- });
-
- it('stores a timeout error in a metric', () => {
- mutations[types.RECEIVE_METRIC_RESULT_FAILURE](stateCopy, {
- metricId,
- error: { message: 'BACKOFF_TIMEOUT' },
- });
-
- expect(getMetric()).toEqual(
- expect.objectContaining({
- loading: false,
- result: null,
- state: metricStates.TIMEOUT,
- }),
- );
- });
-
- it('stores a connection failed error in a metric', () => {
- mutations[types.RECEIVE_METRIC_RESULT_FAILURE](stateCopy, {
- metricId,
- error: {
- response: {
- status: HTTP_STATUS_SERVICE_UNAVAILABLE,
- },
- },
- });
- expect(getMetric()).toEqual(
- expect.objectContaining({
- loading: false,
- result: null,
- state: metricStates.CONNECTION_FAILED,
- }),
- );
- });
-
- it('stores a bad data error in a metric', () => {
- mutations[types.RECEIVE_METRIC_RESULT_FAILURE](stateCopy, {
- metricId,
- error: {
- response: {
- status: HTTP_STATUS_BAD_REQUEST,
- },
- },
- });
-
- expect(getMetric()).toEqual(
- expect.objectContaining({
- loading: false,
- result: null,
- state: metricStates.BAD_QUERY,
- }),
- );
- });
-
- it('stores an unknown error in a metric', () => {
- mutations[types.RECEIVE_METRIC_RESULT_FAILURE](stateCopy, {
- metricId,
- error: null, // no reason in response
- });
-
- expect(getMetric()).toEqual(
- expect.objectContaining({
- loading: false,
- result: null,
- state: metricStates.UNKNOWN_ERROR,
- }),
- );
- });
- });
- });
-
- describe('SET_ALL_DASHBOARDS', () => {
- it('stores `undefined` dashboards as an empty array', () => {
- mutations[types.SET_ALL_DASHBOARDS](stateCopy, undefined);
-
- expect(stateCopy.allDashboards).toEqual([]);
- });
-
- it('stores `null` dashboards as an empty array', () => {
- mutations[types.SET_ALL_DASHBOARDS](stateCopy, null);
-
- expect(stateCopy.allDashboards).toEqual([]);
- });
-
- it('stores dashboards loaded from the git repository', () => {
- mutations[types.SET_ALL_DASHBOARDS](stateCopy, dashboardGitResponse);
- expect(stateCopy.allDashboards).toEqual(dashboardGitResponse);
- });
- });
-
- describe('SET_EXPANDED_PANEL', () => {
- it('no expanded panel is set initally', () => {
- expect(stateCopy.expandedPanel.panel).toEqual(null);
- expect(stateCopy.expandedPanel.group).toEqual(null);
- });
-
- it('sets a panel id as the expanded panel', () => {
- const group = 'group_1';
- const panel = { title: 'A Panel' };
- mutations[types.SET_EXPANDED_PANEL](stateCopy, { group, panel });
-
- expect(stateCopy.expandedPanel).toEqual({ group, panel });
- });
-
- it('clears panel as the expanded panel', () => {
- mutations[types.SET_EXPANDED_PANEL](stateCopy, { group: null, panel: null });
-
- expect(stateCopy.expandedPanel.group).toEqual(null);
- expect(stateCopy.expandedPanel.panel).toEqual(null);
- });
- });
-
- describe('UPDATE_VARIABLE_VALUE', () => {
- it('updates only the value of the variable in variables', () => {
- stateCopy.variables = storeTextVariables;
- mutations[types.UPDATE_VARIABLE_VALUE](stateCopy, { name: 'textSimple', value: 'New Value' });
-
- expect(stateCopy.variables[0].value).toEqual('New Value');
- });
- });
-
- describe('UPDATE_VARIABLE_METRIC_LABEL_VALUES', () => {
- it('updates options in a variable', () => {
- const data = [
- {
- __name__: 'up',
- job: 'prometheus',
- env: 'prd',
- },
- {
- __name__: 'up',
- job: 'prometheus',
- env: 'stg',
- },
- {
- __name__: 'up',
- job: 'node',
- env: 'prod',
- },
- {
- __name__: 'up',
- job: 'node',
- env: 'stg',
- },
- ];
-
- const variable = {
- options: {},
- };
-
- mutations[types.UPDATE_VARIABLE_METRIC_LABEL_VALUES](stateCopy, {
- variable,
- label: 'job',
- data,
- });
-
- expect(variable.options).toEqual({
- values: [
- { text: 'prometheus', value: 'prometheus' },
- { text: 'node', value: 'node' },
- ],
- });
- });
- });
-
- describe('REQUEST_PANEL_PREVIEW', () => {
- it('saves yml content and resets other preview data', () => {
- const mockYmlContent = 'mock yml content';
- mutations[types.REQUEST_PANEL_PREVIEW](stateCopy, mockYmlContent);
-
- expect(stateCopy.panelPreviewIsLoading).toBe(true);
- expect(stateCopy.panelPreviewYml).toBe(mockYmlContent);
- expect(stateCopy.panelPreviewGraphData).toBe(null);
- expect(stateCopy.panelPreviewError).toBe(null);
- });
- });
-
- describe('RECEIVE_PANEL_PREVIEW_SUCCESS', () => {
- it('saves graph data', () => {
- mutations[types.RECEIVE_PANEL_PREVIEW_SUCCESS](stateCopy, {
- title: 'My Title',
- type: 'area-chart',
- });
-
- expect(stateCopy.panelPreviewIsLoading).toBe(false);
- expect(stateCopy.panelPreviewGraphData).toMatchObject({
- title: 'My Title',
- type: 'area-chart',
- });
- expect(stateCopy.panelPreviewError).toBe(null);
- });
- });
-
- describe('RECEIVE_PANEL_PREVIEW_FAILURE', () => {
- it('saves graph data', () => {
- mutations[types.RECEIVE_PANEL_PREVIEW_FAILURE](stateCopy, 'Error!');
-
- expect(stateCopy.panelPreviewIsLoading).toBe(false);
- expect(stateCopy.panelPreviewGraphData).toBe(null);
- expect(stateCopy.panelPreviewError).toBe('Error!');
- });
- });
-
- describe('panel preview metric', () => {
- const getPreviewMetricAt = (i) => stateCopy.panelPreviewGraphData.metrics[i];
-
- beforeEach(() => {
- stateCopy.panelPreviewGraphData = {
- title: 'Preview panel title',
- metrics: [
- {
- query: 'query',
- },
- ],
- };
- });
-
- describe('REQUEST_PANEL_PREVIEW_METRIC_RESULT', () => {
- it('sets the metric to loading for the first time', () => {
- mutations[types.REQUEST_PANEL_PREVIEW_METRIC_RESULT](stateCopy, { index: 0 });
-
- expect(getPreviewMetricAt(0).loading).toBe(true);
- expect(getPreviewMetricAt(0).state).toBe(metricStates.LOADING);
- });
-
- it('sets the metric to loading and keeps the result', () => {
- getPreviewMetricAt(0).result = [[0, 1]];
- getPreviewMetricAt(0).state = metricStates.OK;
-
- mutations[types.REQUEST_PANEL_PREVIEW_METRIC_RESULT](stateCopy, { index: 0 });
-
- expect(getPreviewMetricAt(0)).toMatchObject({
- loading: true,
- result: [[0, 1]],
- state: metricStates.OK,
- });
- });
- });
-
- describe('RECEIVE_PANEL_PREVIEW_METRIC_RESULT_SUCCESS', () => {
- it('saves the result in the metric', () => {
- const data = prometheusMatrixMultiResult();
-
- mutations[types.RECEIVE_PANEL_PREVIEW_METRIC_RESULT_SUCCESS](stateCopy, {
- index: 0,
- data,
- });
-
- expect(getPreviewMetricAt(0)).toMatchObject({
- loading: false,
- state: metricStates.OK,
- result: expect.any(Array),
- });
- expect(getPreviewMetricAt(0).result).toHaveLength(data.result.length);
- });
- });
-
- describe('RECEIVE_PANEL_PREVIEW_METRIC_RESULT_FAILURE', () => {
- it('stores an error in the metric', () => {
- mutations[types.RECEIVE_PANEL_PREVIEW_METRIC_RESULT_FAILURE](stateCopy, {
- index: 0,
- });
-
- expect(getPreviewMetricAt(0).loading).toBe(false);
- expect(getPreviewMetricAt(0).state).toBe(metricStates.UNKNOWN_ERROR);
- expect(getPreviewMetricAt(0).result).toBe(null);
-
- expect(getPreviewMetricAt(0)).toMatchObject({
- loading: false,
- result: null,
- state: metricStates.UNKNOWN_ERROR,
- });
- });
-
- it('stores a timeout error in a metric', () => {
- mutations[types.RECEIVE_PANEL_PREVIEW_METRIC_RESULT_FAILURE](stateCopy, {
- index: 0,
- error: { message: 'BACKOFF_TIMEOUT' },
- });
-
- expect(getPreviewMetricAt(0)).toMatchObject({
- loading: false,
- result: null,
- state: metricStates.TIMEOUT,
- });
- });
- });
- });
-});
diff --git a/spec/frontend/monitoring/store/utils_spec.js b/spec/frontend/monitoring/store/utils_spec.js
deleted file mode 100644
index 54f9c59308e..00000000000
--- a/spec/frontend/monitoring/store/utils_spec.js
+++ /dev/null
@@ -1,893 +0,0 @@
-import { SUPPORTED_FORMATS } from '~/lib/utils/unit_format';
-import * as urlUtils from '~/lib/utils/url_utility';
-import { NOT_IN_DB_PREFIX } from '~/monitoring/constants';
-import {
- uniqMetricsId,
- parseEnvironmentsResponse,
- parseAnnotationsResponse,
- removeLeadingSlash,
- mapToDashboardViewModel,
- normalizeQueryResponseData,
- convertToGrafanaTimeRange,
- addDashboardMetaDataToLink,
- normalizeCustomDashboardPath,
-} from '~/monitoring/stores/utils';
-import { annotationsData } from '../mock_data';
-
-const projectPath = 'gitlab-org/gitlab-test';
-
-describe('mapToDashboardViewModel', () => {
- it('maps an empty dashboard', () => {
- expect(mapToDashboardViewModel({})).toEqual({
- dashboard: '',
- panelGroups: [],
- links: [],
- variables: [],
- });
- });
-
- it('maps a simple dashboard', () => {
- const response = {
- dashboard: 'Dashboard Name',
- panel_groups: [
- {
- group: 'Group 1',
- panels: [
- {
- id: 'ID_ABC',
- title: 'Title A',
- xLabel: '',
- xAxis: {
- name: '',
- },
- type: 'chart-type',
- y_label: 'Y Label A',
- metrics: [],
- },
- ],
- },
- ],
- };
-
- expect(mapToDashboardViewModel(response)).toEqual({
- dashboard: 'Dashboard Name',
- links: [],
- variables: [],
- panelGroups: [
- {
- group: 'Group 1',
- key: 'group-1-0',
- panels: [
- {
- id: 'ID_ABC',
- title: 'Title A',
- type: 'chart-type',
- xLabel: '',
- xAxis: {
- name: '',
- },
- y_label: 'Y Label A',
- yAxis: {
- name: 'Y Label A',
- format: 'engineering',
- precision: 2,
- },
- links: [],
- metrics: [],
- },
- ],
- },
- ],
- });
- });
-
- describe('panel groups mapping', () => {
- it('key', () => {
- const response = {
- dashboard: 'Dashboard Name',
- links: [],
- variables: {},
- panel_groups: [
- {
- group: 'Group A',
- },
- {
- group: 'Group B',
- },
- {
- group: '',
- unsupported_property: 'This should be removed',
- },
- ],
- };
-
- expect(mapToDashboardViewModel(response).panelGroups).toEqual([
- {
- group: 'Group A',
- key: 'group-a-0',
- panels: [],
- },
- {
- group: 'Group B',
- key: 'group-b-1',
- panels: [],
- },
- {
- group: '',
- key: 'default-2',
- panels: [],
- },
- ]);
- });
- });
-
- describe('panel mapping', () => {
- const panelTitle = 'Panel Title';
- const yAxisName = 'Y Axis Name';
-
- let dashboard;
-
- const setupWithPanel = (panel) => {
- dashboard = {
- panel_groups: [
- {
- panels: [panel],
- },
- ],
- };
- };
-
- const getMappedPanel = () => mapToDashboardViewModel(dashboard).panelGroups[0].panels[0];
-
- it('panel with x_label', () => {
- setupWithPanel({
- id: 'ID_123',
- title: panelTitle,
- x_label: 'x label',
- });
-
- expect(getMappedPanel()).toEqual({
- id: 'ID_123',
- title: panelTitle,
- xLabel: 'x label',
- xAxis: {
- name: 'x label',
- },
- y_label: '',
- yAxis: {
- name: '',
- format: SUPPORTED_FORMATS.engineering,
- precision: 2,
- },
- links: [],
- metrics: [],
- });
- });
-
- it('group y_axis defaults', () => {
- setupWithPanel({
- id: 'ID_456',
- title: panelTitle,
- });
-
- expect(getMappedPanel()).toEqual({
- id: 'ID_456',
- title: panelTitle,
- xLabel: '',
- y_label: '',
- xAxis: {
- name: '',
- },
- yAxis: {
- name: '',
- format: SUPPORTED_FORMATS.engineering,
- precision: 2,
- },
- links: [],
- metrics: [],
- });
- });
-
- it('panel with y_axis.name', () => {
- setupWithPanel({
- y_axis: {
- name: yAxisName,
- },
- });
-
- expect(getMappedPanel().y_label).toBe(yAxisName);
- expect(getMappedPanel().yAxis.name).toBe(yAxisName);
- });
-
- it('panel with y_axis.name and y_label, displays y_axis.name', () => {
- setupWithPanel({
- y_label: 'Ignored Y Label',
- y_axis: {
- name: yAxisName,
- },
- });
-
- expect(getMappedPanel().y_label).toBe(yAxisName);
- expect(getMappedPanel().yAxis.name).toBe(yAxisName);
- });
-
- it('group y_label', () => {
- setupWithPanel({
- y_label: yAxisName,
- });
-
- expect(getMappedPanel().y_label).toBe(yAxisName);
- expect(getMappedPanel().yAxis.name).toBe(yAxisName);
- });
-
- it('group y_axis format and precision', () => {
- setupWithPanel({
- title: panelTitle,
- y_axis: {
- precision: 0,
- format: SUPPORTED_FORMATS.bytes,
- },
- });
-
- expect(getMappedPanel().yAxis.format).toBe(SUPPORTED_FORMATS.bytes);
- expect(getMappedPanel().yAxis.precision).toBe(0);
- });
-
- it('group y_axis unsupported format defaults to number', () => {
- setupWithPanel({
- title: panelTitle,
- y_axis: {
- format: 'invalid_format',
- },
- });
-
- expect(getMappedPanel().yAxis.format).toBe(SUPPORTED_FORMATS.engineering);
- });
-
- // This property allows single_stat panels to render percentile values
- it('group maxValue', () => {
- setupWithPanel({
- max_value: 100,
- });
-
- expect(getMappedPanel().maxValue).toBe(100);
- });
-
- describe('panel with links', () => {
- const title = 'Example';
- const url = 'https://example.com';
-
- it('maps an empty link collection', () => {
- setupWithPanel({
- links: undefined,
- });
-
- expect(getMappedPanel().links).toEqual([]);
- });
-
- it('maps a link', () => {
- setupWithPanel({ links: [{ title, url }] });
-
- expect(getMappedPanel().links).toEqual([{ title, url }]);
- });
-
- it('maps a link without a title', () => {
- setupWithPanel({
- links: [{ url }],
- });
-
- expect(getMappedPanel().links).toEqual([{ title: url, url }]);
- });
-
- it('maps a link without a url', () => {
- setupWithPanel({
- links: [{ title }],
- });
-
- expect(getMappedPanel().links).toEqual([{ title, url: '#' }]);
- });
-
- it('maps a link without a url or title', () => {
- setupWithPanel({
- links: [{}],
- });
-
- expect(getMappedPanel().links).toEqual([{ title: 'null', url: '#' }]);
- });
-
- it('maps a link with an unsafe url safely', () => {
- // eslint-disable-next-line no-script-url
- const unsafeUrl = 'javascript:alert("XSS")';
-
- setupWithPanel({
- links: [
- {
- title,
- url: unsafeUrl,
- },
- ],
- });
-
- expect(getMappedPanel().links).toEqual([{ title, url: '#' }]);
- });
-
- it('maps multple links', () => {
- setupWithPanel({
- links: [{ title, url }, { url }, { title }],
- });
-
- expect(getMappedPanel().links).toEqual([
- { title, url },
- { title: url, url },
- { title, url: '#' },
- ]);
- });
- });
- });
-
- describe('metrics mapping', () => {
- const defaultLabel = 'Panel Label';
- const dashboardWithMetric = (metric, label = defaultLabel) => ({
- panel_groups: [
- {
- panels: [
- {
- y_label: label,
- metrics: [metric],
- },
- ],
- },
- ],
- });
-
- const getMappedMetric = (dashboard) => {
- return mapToDashboardViewModel(dashboard).panelGroups[0].panels[0].metrics[0];
- };
-
- it('creates a metric', () => {
- const dashboard = dashboardWithMetric({ label: 'Panel Label' });
-
- expect(getMappedMetric(dashboard)).toEqual({
- label: expect.any(String),
- metricId: expect.any(String),
- loading: false,
- result: null,
- state: null,
- });
- });
-
- it('creates a metric with a correct id', () => {
- const dashboard = dashboardWithMetric({
- id: 'http_responses',
- metric_id: 1,
- });
-
- expect(getMappedMetric(dashboard).metricId).toEqual('1_http_responses');
- });
-
- it('creates a metric without a default label', () => {
- const dashboard = dashboardWithMetric({});
-
- expect(getMappedMetric(dashboard)).toMatchObject({
- label: undefined,
- });
- });
-
- it('creates a metric with an endpoint and query', () => {
- const dashboard = dashboardWithMetric({
- prometheus_endpoint_path: 'http://test',
- query_range: 'http_responses',
- });
-
- expect(getMappedMetric(dashboard)).toMatchObject({
- prometheusEndpointPath: 'http://test',
- queryRange: 'http_responses',
- });
- });
-
- it('creates a metric with an ad-hoc property', () => {
- // This behavior is deprecated and should be removed
- // https://gitlab.com/gitlab-org/gitlab/issues/207198
-
- const dashboard = dashboardWithMetric({
- x_label: 'Another label',
- unkown_option: 'unkown_data',
- });
-
- expect(getMappedMetric(dashboard)).toMatchObject({
- x_label: 'Another label',
- unkown_option: 'unkown_data',
- });
- });
- });
-
- describe('templating variables mapping', () => {
- beforeEach(() => {
- jest.spyOn(urlUtils, 'queryToObject');
- });
-
- afterEach(() => {
- urlUtils.queryToObject.mockRestore();
- });
-
- it('sets variables as-is from yml file if URL has no variables', () => {
- const response = {
- dashboard: 'Dashboard Name',
- links: [],
- templating: {
- variables: {
- pod: 'kubernetes',
- pod_2: 'kubernetes-2',
- },
- },
- };
-
- urlUtils.queryToObject.mockReturnValueOnce();
-
- expect(mapToDashboardViewModel(response).variables).toEqual([
- {
- name: 'pod',
- label: 'pod',
- type: 'text',
- value: 'kubernetes',
- },
- {
- name: 'pod_2',
- label: 'pod_2',
- type: 'text',
- value: 'kubernetes-2',
- },
- ]);
- });
-
- it('sets variables as-is from yml file if URL has no matching variables', () => {
- const response = {
- dashboard: 'Dashboard Name',
- links: [],
- templating: {
- variables: {
- pod: 'kubernetes',
- pod_2: 'kubernetes-2',
- },
- },
- };
-
- urlUtils.queryToObject.mockReturnValueOnce({
- 'var-environment': 'POD',
- });
-
- expect(mapToDashboardViewModel(response).variables).toEqual([
- {
- label: 'pod',
- name: 'pod',
- type: 'text',
- value: 'kubernetes',
- },
- {
- label: 'pod_2',
- name: 'pod_2',
- type: 'text',
- value: 'kubernetes-2',
- },
- ]);
- });
-
- it('merges variables from URL with the ones from yml file', () => {
- const response = {
- dashboard: 'Dashboard Name',
- links: [],
- templating: {
- variables: {
- pod: 'kubernetes',
- pod_2: 'kubernetes-2',
- },
- },
- };
-
- urlUtils.queryToObject.mockReturnValueOnce({
- 'var-environment': 'POD',
- 'var-pod': 'POD1',
- 'var-pod_2': 'POD2',
- });
-
- expect(mapToDashboardViewModel(response).variables).toEqual([
- {
- label: 'pod',
- name: 'pod',
- type: 'text',
- value: 'POD1',
- },
- {
- label: 'pod_2',
- name: 'pod_2',
- type: 'text',
- value: 'POD2',
- },
- ]);
- });
- });
-});
-
-describe('uniqMetricsId', () => {
- [
- { input: { id: 1 }, expected: `${NOT_IN_DB_PREFIX}_1` },
- { input: { metricId: 2 }, expected: '2_undefined' },
- { input: { metricId: 2, id: 21 }, expected: '2_21' },
- { input: { metricId: 22, id: 1 }, expected: '22_1' },
- { input: { metricId: 'aaa', id: '_a' }, expected: 'aaa__a' },
- ].forEach(({ input, expected }) => {
- it(`creates unique metric ID with ${JSON.stringify(input)}`, () => {
- expect(uniqMetricsId(input)).toEqual(expected);
- });
- });
-});
-
-describe('parseEnvironmentsResponse', () => {
- [
- {
- input: null,
- output: [],
- },
- {
- input: undefined,
- output: [],
- },
- {
- input: [],
- output: [],
- },
- {
- input: [
- {
- id: '1',
- name: 'env-1',
- },
- ],
- output: [
- {
- id: 1,
- name: 'env-1',
- metrics_path: `${projectPath}/-/metrics?environment=1`,
- },
- ],
- },
- {
- input: [
- {
- id: 'gid://gitlab/Environment/12',
- name: 'env-12',
- },
- ],
- output: [
- {
- id: 12,
- name: 'env-12',
- metrics_path: `${projectPath}/-/metrics?environment=12`,
- },
- ],
- },
- ].forEach(({ input, output }) => {
- it(`parseEnvironmentsResponse returns ${JSON.stringify(output)} with input ${JSON.stringify(
- input,
- )}`, () => {
- expect(parseEnvironmentsResponse(input, projectPath)).toEqual(output);
- });
- });
-});
-
-describe('parseAnnotationsResponse', () => {
- const parsedAnnotationResponse = [
- {
- description: 'This is a test annotation',
- endingAt: null,
- id: 'gid://gitlab/Metrics::Dashboard::Annotation/1',
- panelId: null,
- startingAt: new Date('2020-04-12T12:51:53.000Z'),
- },
- ];
- it.each`
- case | input | expected
- ${'Returns empty array for null input'} | ${null} | ${[]}
- ${'Returns empty array for undefined input'} | ${undefined} | ${[]}
- ${'Returns empty array for empty input'} | ${[]} | ${[]}
- ${'Returns parsed responses for annotations data'} | ${[annotationsData[0]]} | ${parsedAnnotationResponse}
- `('$case', ({ input, expected }) => {
- expect(parseAnnotationsResponse(input)).toEqual(expected);
- });
-});
-
-describe('removeLeadingSlash', () => {
- [
- { input: null, output: '' },
- { input: '', output: '' },
- { input: 'gitlab-org', output: 'gitlab-org' },
- { input: 'gitlab-org/gitlab', output: 'gitlab-org/gitlab' },
- { input: '/gitlab-org/gitlab', output: 'gitlab-org/gitlab' },
- { input: '////gitlab-org/gitlab', output: 'gitlab-org/gitlab' },
- ].forEach(({ input, output }) => {
- it(`removeLeadingSlash returns ${output} with input ${input}`, () => {
- expect(removeLeadingSlash(input)).toEqual(output);
- });
- });
-});
-
-describe('user-defined links utils', () => {
- const mockRelativeTimeRange = {
- metricsDashboard: {
- duration: {
- seconds: 86400,
- },
- },
- grafana: {
- from: 'now-86400s',
- to: 'now',
- },
- };
- const mockAbsoluteTimeRange = {
- metricsDashboard: {
- start: '2020-06-08T16:13:01.995Z',
- end: '2020-06-08T21:12:32.243Z',
- },
- grafana: {
- from: 1591632781995,
- to: 1591650752243,
- },
- };
- describe('convertToGrafanaTimeRange', () => {
- it('converts relative timezone to grafana timezone', () => {
- expect(convertToGrafanaTimeRange(mockRelativeTimeRange.metricsDashboard)).toEqual(
- mockRelativeTimeRange.grafana,
- );
- });
-
- it('converts absolute timezone to grafana timezone', () => {
- expect(convertToGrafanaTimeRange(mockAbsoluteTimeRange.metricsDashboard)).toEqual(
- mockAbsoluteTimeRange.grafana,
- );
- });
- });
-
- describe('addDashboardMetaDataToLink', () => {
- const link = { title: 'title', url: 'https://gitlab.com' };
- const grafanaLink = { ...link, type: 'grafana' };
-
- it('adds relative time range to link w/o type for metrics dashboards', () => {
- const adder = addDashboardMetaDataToLink({
- timeRange: mockRelativeTimeRange.metricsDashboard,
- });
- expect(adder(link)).toMatchObject({
- title: 'title',
- url: 'https://gitlab.com?duration_seconds=86400',
- });
- });
-
- it('adds relative time range to Grafana type links', () => {
- const adder = addDashboardMetaDataToLink({
- timeRange: mockRelativeTimeRange.metricsDashboard,
- });
- expect(adder(grafanaLink)).toMatchObject({
- title: 'title',
- url: 'https://gitlab.com?from=now-86400s&to=now',
- });
- });
-
- it('adds absolute time range to link w/o type for metrics dashboard', () => {
- const adder = addDashboardMetaDataToLink({
- timeRange: mockAbsoluteTimeRange.metricsDashboard,
- });
- expect(adder(link)).toMatchObject({
- title: 'title',
- url:
- 'https://gitlab.com?start=2020-06-08T16%3A13%3A01.995Z&end=2020-06-08T21%3A12%3A32.243Z',
- });
- });
-
- it('adds absolute time range to Grafana type links', () => {
- const adder = addDashboardMetaDataToLink({
- timeRange: mockAbsoluteTimeRange.metricsDashboard,
- });
- expect(adder(grafanaLink)).toMatchObject({
- title: 'title',
- url: 'https://gitlab.com?from=1591632781995&to=1591650752243',
- });
- });
- });
-});
-
-describe('normalizeQueryResponseData', () => {
- // Data examples from
- // https://prometheus.io/docs/prometheus/latest/querying/api/#expression-queries
-
- it('processes a string result', () => {
- const mockScalar = {
- resultType: 'string',
- result: [1435781451.781, '1'],
- };
-
- expect(normalizeQueryResponseData(mockScalar)).toEqual([
- {
- metric: {},
- value: ['2015-07-01T20:10:51.781Z', '1'],
- values: [['2015-07-01T20:10:51.781Z', '1']],
- },
- ]);
- });
-
- it('processes a scalar result', () => {
- const mockScalar = {
- resultType: 'scalar',
- result: [1435781451.781, '1'],
- };
-
- expect(normalizeQueryResponseData(mockScalar)).toEqual([
- {
- metric: {},
- value: ['2015-07-01T20:10:51.781Z', 1],
- values: [['2015-07-01T20:10:51.781Z', 1]],
- },
- ]);
- });
-
- it('processes a vector result', () => {
- const mockVector = {
- resultType: 'vector',
- result: [
- {
- metric: {
- __name__: 'up',
- job: 'prometheus',
- instance: 'localhost:9090',
- },
- value: [1435781451.781, '1'],
- },
- {
- metric: {
- __name__: 'up',
- job: 'node',
- instance: 'localhost:9100',
- },
- value: [1435781451.781, '0'],
- },
- ],
- };
-
- expect(normalizeQueryResponseData(mockVector)).toEqual([
- {
- metric: { __name__: 'up', job: 'prometheus', instance: 'localhost:9090' },
- value: ['2015-07-01T20:10:51.781Z', 1],
- values: [['2015-07-01T20:10:51.781Z', 1]],
- },
- {
- metric: { __name__: 'up', job: 'node', instance: 'localhost:9100' },
- value: ['2015-07-01T20:10:51.781Z', 0],
- values: [['2015-07-01T20:10:51.781Z', 0]],
- },
- ]);
- });
-
- it('processes a matrix result', () => {
- const mockMatrix = {
- resultType: 'matrix',
- result: [
- {
- metric: {
- __name__: 'up',
- job: 'prometheus',
- instance: 'localhost:9090',
- },
- values: [
- [1435781430.781, '1'],
- [1435781445.781, '2'],
- [1435781460.781, '3'],
- ],
- },
- {
- metric: {
- __name__: 'up',
- job: 'node',
- instance: 'localhost:9091',
- },
- values: [
- [1435781430.781, '4'],
- [1435781445.781, '5'],
- [1435781460.781, '6'],
- ],
- },
- ],
- };
-
- expect(normalizeQueryResponseData(mockMatrix)).toEqual([
- {
- metric: { __name__: 'up', instance: 'localhost:9090', job: 'prometheus' },
- value: ['2015-07-01T20:11:00.781Z', 3],
- values: [
- ['2015-07-01T20:10:30.781Z', 1],
- ['2015-07-01T20:10:45.781Z', 2],
- ['2015-07-01T20:11:00.781Z', 3],
- ],
- },
- {
- metric: { __name__: 'up', instance: 'localhost:9091', job: 'node' },
- value: ['2015-07-01T20:11:00.781Z', 6],
- values: [
- ['2015-07-01T20:10:30.781Z', 4],
- ['2015-07-01T20:10:45.781Z', 5],
- ['2015-07-01T20:11:00.781Z', 6],
- ],
- },
- ]);
- });
-
- it('processes a scalar result with a NaN result', () => {
- // Queries may return "NaN" string values.
- // e.g. when Prometheus cannot find a metric the query
- // `scalar(does_not_exist)` will return a "NaN" value.
-
- const mockScalar = {
- resultType: 'scalar',
- result: [1435781451.781, 'NaN'],
- };
-
- expect(normalizeQueryResponseData(mockScalar)).toEqual([
- {
- metric: {},
- value: ['2015-07-01T20:10:51.781Z', NaN],
- values: [['2015-07-01T20:10:51.781Z', NaN]],
- },
- ]);
- });
-
- it('processes a matrix result with a "NaN" value', () => {
- // Queries may return "NaN" string values.
- const mockMatrix = {
- resultType: 'matrix',
- result: [
- {
- metric: {
- __name__: 'up',
- job: 'prometheus',
- instance: 'localhost:9090',
- },
- values: [
- [1435781430.781, '1'],
- [1435781460.781, 'NaN'],
- ],
- },
- ],
- };
-
- expect(normalizeQueryResponseData(mockMatrix)).toEqual([
- {
- metric: { __name__: 'up', instance: 'localhost:9090', job: 'prometheus' },
- value: ['2015-07-01T20:11:00.781Z', NaN],
- values: [
- ['2015-07-01T20:10:30.781Z', 1],
- ['2015-07-01T20:11:00.781Z', NaN],
- ],
- },
- ]);
- });
-});
-
-describe('normalizeCustomDashboardPath', () => {
- it.each`
- input | expected
- ${[undefined]} | ${''}
- ${[null]} | ${''}
- ${[]} | ${''}
- ${['links.yml']} | ${'links.yml'}
- ${['links.yml', '.gitlab/dashboards']} | ${'.gitlab/dashboards/links.yml'}
- ${['config/prometheus/common_metrics.yml']} | ${'config/prometheus/common_metrics.yml'}
- ${['config/prometheus/common_metrics.yml', '.gitlab/dashboards']} | ${'config/prometheus/common_metrics.yml'}
- ${['dir1/links.yml', '.gitlab/dashboards']} | ${'.gitlab/dashboards/dir1/links.yml'}
- ${['dir1/dir2/links.yml', '.gitlab/dashboards']} | ${'.gitlab/dashboards/dir1/dir2/links.yml'}
- ${['.gitlab/dashboards/links.yml']} | ${'.gitlab/dashboards/links.yml'}
- ${['.gitlab/dashboards/links.yml', '.gitlab/dashboards']} | ${'.gitlab/dashboards/links.yml'}
- ${['.gitlab/dashboards/dir1/links.yml', '.gitlab/dashboards']} | ${'.gitlab/dashboards/dir1/links.yml'}
- ${['.gitlab/dashboards/dir1/dir2/links.yml', '.gitlab/dashboards']} | ${'.gitlab/dashboards/dir1/dir2/links.yml'}
- ${['config/prometheus/pod_metrics.yml', '.gitlab/dashboards']} | ${'config/prometheus/pod_metrics.yml'}
- ${['config/prometheus/pod_metrics.yml']} | ${'config/prometheus/pod_metrics.yml'}
- `(`normalizeCustomDashboardPath returns $expected for $input`, ({ input, expected }) => {
- expect(normalizeCustomDashboardPath(...input)).toEqual(expected);
- });
-});
diff --git a/spec/frontend/monitoring/store/variable_mapping_spec.js b/spec/frontend/monitoring/store/variable_mapping_spec.js
deleted file mode 100644
index 58e7175c04c..00000000000
--- a/spec/frontend/monitoring/store/variable_mapping_spec.js
+++ /dev/null
@@ -1,209 +0,0 @@
-import * as urlUtils from '~/lib/utils/url_utility';
-import {
- parseTemplatingVariables,
- mergeURLVariables,
- optionsFromSeriesData,
-} from '~/monitoring/stores/variable_mapping';
-import {
- templatingVariablesExamples,
- storeTextVariables,
- storeCustomVariables,
- storeMetricLabelValuesVariables,
-} from '../mock_data';
-
-describe('Monitoring variable mapping', () => {
- describe('parseTemplatingVariables', () => {
- it.each`
- case | input
- ${'For undefined templating object'} | ${undefined}
- ${'For empty templating object'} | ${{}}
- `('$case, returns an empty array', ({ input }) => {
- expect(parseTemplatingVariables(input)).toEqual([]);
- });
-
- it.each`
- case | input | output
- ${'Returns parsed object for text variables'} | ${templatingVariablesExamples.text} | ${storeTextVariables}
- ${'Returns parsed object for custom variables'} | ${templatingVariablesExamples.custom} | ${storeCustomVariables}
- ${'Returns parsed object for metric label value variables'} | ${templatingVariablesExamples.metricLabelValues} | ${storeMetricLabelValuesVariables}
- `('$case, returns an empty array', ({ input, output }) => {
- expect(parseTemplatingVariables(input)).toEqual(output);
- });
- });
-
- describe('mergeURLVariables', () => {
- beforeEach(() => {
- jest.spyOn(urlUtils, 'queryToObject');
- });
-
- afterEach(() => {
- urlUtils.queryToObject.mockRestore();
- });
-
- it('returns empty object if variables are not defined in yml or URL', () => {
- urlUtils.queryToObject.mockReturnValueOnce({});
-
- expect(mergeURLVariables([])).toEqual([]);
- });
-
- it('returns empty object if variables are defined in URL but not in yml', () => {
- urlUtils.queryToObject.mockReturnValueOnce({
- 'var-env': 'one',
- 'var-instance': 'localhost',
- });
-
- expect(mergeURLVariables([])).toEqual([]);
- });
-
- it('returns yml variables if variables defined in yml but not in the URL', () => {
- urlUtils.queryToObject.mockReturnValueOnce({});
-
- const variables = [
- {
- name: 'env',
- value: 'one',
- },
- {
- name: 'instance',
- value: 'localhost',
- },
- ];
-
- expect(mergeURLVariables(variables)).toEqual(variables);
- });
-
- it('returns yml variables if variables defined in URL do not match with yml variables', () => {
- const urlParams = {
- 'var-env': 'one',
- 'var-instance': 'localhost',
- };
- const variables = [
- {
- name: 'env',
- value: 'one',
- },
- {
- name: 'service',
- value: 'database',
- },
- ];
- urlUtils.queryToObject.mockReturnValueOnce(urlParams);
-
- expect(mergeURLVariables(variables)).toEqual(variables);
- });
-
- it('returns merged yml and URL variables if there is some match', () => {
- const urlParams = {
- 'var-env': 'one',
- 'var-instance': 'localhost:8080',
- };
- const variables = [
- {
- name: 'instance',
- value: 'localhost',
- },
- {
- name: 'service',
- value: 'database',
- },
- ];
-
- urlUtils.queryToObject.mockReturnValueOnce(urlParams);
-
- expect(mergeURLVariables(variables)).toEqual([
- {
- name: 'instance',
- value: 'localhost:8080',
- },
- {
- name: 'service',
- value: 'database',
- },
- ]);
- });
- });
-
- describe('optionsFromSeriesData', () => {
- it('fetches the label values from missing data', () => {
- expect(optionsFromSeriesData({ label: 'job' })).toEqual([]);
- });
-
- it('fetches the label values from a simple series', () => {
- const data = [
- {
- __name__: 'up',
- job: 'job1',
- },
- {
- __name__: 'up',
- job: 'job2',
- },
- ];
-
- expect(optionsFromSeriesData({ label: 'job', data })).toEqual([
- { text: 'job1', value: 'job1' },
- { text: 'job2', value: 'job2' },
- ]);
- });
-
- it('fetches the label values from multiple series', () => {
- const data = [
- {
- __name__: 'up',
- job: 'job1',
- instance: 'host1',
- },
- {
- __name__: 'up',
- job: 'job2',
- instance: 'host1',
- },
- {
- __name__: 'up',
- job: 'job1',
- instance: 'host2',
- },
- {
- __name__: 'up',
- job: 'job2',
- instance: 'host2',
- },
- ];
-
- expect(optionsFromSeriesData({ label: '__name__', data })).toEqual([
- { text: 'up', value: 'up' },
- ]);
-
- expect(optionsFromSeriesData({ label: 'job', data })).toEqual([
- { text: 'job1', value: 'job1' },
- { text: 'job2', value: 'job2' },
- ]);
-
- expect(optionsFromSeriesData({ label: 'instance', data })).toEqual([
- { text: 'host1', value: 'host1' },
- { text: 'host2', value: 'host2' },
- ]);
- });
-
- it('fetches the label values from a series with missing values', () => {
- const data = [
- {
- __name__: 'up',
- job: 'job1',
- },
- {
- __name__: 'up',
- job: 'job2',
- },
- {
- __name__: 'up',
- },
- ];
-
- expect(optionsFromSeriesData({ label: 'job', data })).toEqual([
- { text: 'job1', value: 'job1' },
- { text: 'job2', value: 'job2' },
- ]);
- });
- });
-});
diff --git a/spec/frontend/monitoring/store_utils.js b/spec/frontend/monitoring/store_utils.js
deleted file mode 100644
index 96219661b9b..00000000000
--- a/spec/frontend/monitoring/store_utils.js
+++ /dev/null
@@ -1,80 +0,0 @@
-import * as types from '~/monitoring/stores/mutation_types';
-import { metricsDashboardPayload } from './fixture_data';
-import { metricsResult, environmentData, dashboardGitResponse } from './mock_data';
-
-export const setMetricResult = ({ store, result, group = 0, panel = 0, metric = 0 }) => {
- const { dashboard } = store.state.monitoringDashboard;
- const { metricId } = dashboard.panelGroups[group].panels[panel].metrics[metric];
-
- store.commit(`monitoringDashboard/${types.RECEIVE_METRIC_RESULT_SUCCESS}`, {
- metricId,
- data: {
- resultType: 'matrix',
- result,
- },
- });
-};
-
-const setEnvironmentData = (store) => {
- store.commit(`monitoringDashboard/${types.RECEIVE_ENVIRONMENTS_DATA_SUCCESS}`, environmentData);
-};
-
-export const setupAllDashboards = (store, path) => {
- store.commit(`monitoringDashboard/${types.SET_ALL_DASHBOARDS}`, dashboardGitResponse);
- if (path) {
- store.commit(`monitoringDashboard/${types.SET_INITIAL_STATE}`, {
- currentDashboard: path,
- });
- }
-};
-
-export const setupStoreWithDashboard = (store) => {
- store.commit(
- `monitoringDashboard/${types.RECEIVE_METRICS_DASHBOARD_SUCCESS}`,
- metricsDashboardPayload,
- );
-};
-
-export const setupStoreWithLinks = (store) => {
- store.commit(`monitoringDashboard/${types.RECEIVE_METRICS_DASHBOARD_SUCCESS}`, {
- ...metricsDashboardPayload,
- links: [
- {
- title: 'GitLab Website',
- url: `https://gitlab.com/website`,
- },
- ],
- });
-};
-
-export const setupStoreWithData = (store) => {
- setupAllDashboards(store);
- setupStoreWithDashboard(store);
-
- setMetricResult({ store, result: [], panel: 0 });
- setMetricResult({ store, result: metricsResult, panel: 1 });
- setMetricResult({ store, result: metricsResult, panel: 2 });
-
- setEnvironmentData(store);
-};
-
-export const setupStoreWithDataForPanelCount = (store, panelCount) => {
- const payloadPanelGroup = metricsDashboardPayload.panel_groups[0];
-
- const panelGroupCustom = {
- ...payloadPanelGroup,
- panels: payloadPanelGroup.panels.slice(0, panelCount),
- };
-
- const metricsDashboardPayloadCustom = {
- ...metricsDashboardPayload,
- panel_groups: [panelGroupCustom],
- };
-
- store.commit(
- `monitoringDashboard/${types.RECEIVE_METRICS_DASHBOARD_SUCCESS}`,
- metricsDashboardPayloadCustom,
- );
-
- setMetricResult({ store, result: metricsResult, panel: 0 });
-};
diff --git a/spec/frontend/monitoring/stubs/modal_stub.js b/spec/frontend/monitoring/stubs/modal_stub.js
deleted file mode 100644
index 4cd0362096e..00000000000
--- a/spec/frontend/monitoring/stubs/modal_stub.js
+++ /dev/null
@@ -1,11 +0,0 @@
-const ModalStub = {
- name: 'glmodal-stub',
- template: `
- <div>
- <slot></slot>
- <slot name="modal-ok"></slot>
- </div>
- `,
-};
-
-export default ModalStub;
diff --git a/spec/frontend/monitoring/utils_spec.js b/spec/frontend/monitoring/utils_spec.js
deleted file mode 100644
index 348825c334a..00000000000
--- a/spec/frontend/monitoring/utils_spec.js
+++ /dev/null
@@ -1,464 +0,0 @@
-import { TEST_HOST } from 'helpers/test_constants';
-import * as urlUtils from '~/lib/utils/url_utility';
-import * as monitoringUtils from '~/monitoring/utils';
-import { metricsDashboardViewModel, graphData } from './fixture_data';
-import { singleStatGraphData, anomalyGraphData } from './graph_data';
-import { mockProjectDir, barMockData } from './mock_data';
-
-const mockPath = `${TEST_HOST}${mockProjectDir}/-/environments/29/metrics`;
-
-const generatedLink = 'http://chart.link.com';
-
-const chartTitle = 'Some metric chart';
-
-const range = {
- start: '2019-01-01T00:00:00.000Z',
- end: '2019-01-10T00:00:00.000Z',
-};
-
-const rollingRange = {
- duration: { seconds: 120 },
-};
-
-describe('monitoring/utils', () => {
- describe('trackGenerateLinkToChartEventOptions', () => {
- it('should return Cluster Monitoring options if located on Cluster Health Dashboard', () => {
- document.body.dataset.page = 'groups:clusters:show';
-
- expect(monitoringUtils.generateLinkToChartOptions(generatedLink)).toEqual({
- category: 'Cluster Monitoring',
- action: 'generate_link_to_cluster_metric_chart',
- label: 'Chart link',
- property: generatedLink,
- });
- });
-
- it('should return Incident Management event options if located on Metrics Dashboard', () => {
- document.body.dataset.page = 'metrics:show';
-
- expect(monitoringUtils.generateLinkToChartOptions(generatedLink)).toEqual({
- category: 'Incident Management::Embedded metrics',
- action: 'generate_link_to_metrics_chart',
- label: 'Chart link',
- property: generatedLink,
- });
- });
- });
-
- describe('trackDownloadCSVEvent', () => {
- it('should return Cluster Monitoring options if located on Cluster Health Dashboard', () => {
- document.body.dataset.page = 'groups:clusters:show';
-
- expect(monitoringUtils.downloadCSVOptions(chartTitle)).toEqual({
- category: 'Cluster Monitoring',
- action: 'download_csv_of_cluster_metric_chart',
- label: 'Chart title',
- property: chartTitle,
- });
- });
-
- it('should return Incident Management event options if located on Metrics Dashboard', () => {
- document.body.dataset.page = 'metriss:show';
-
- expect(monitoringUtils.downloadCSVOptions(chartTitle)).toEqual({
- category: 'Incident Management::Embedded metrics',
- action: 'download_csv_of_metrics_dashboard_chart',
- label: 'Chart title',
- property: chartTitle,
- });
- });
- });
-
- describe('graphDataValidatorForValues', () => {
- /*
- * When dealing with a metric using the query format, e.g.
- * query: 'max(go_memstats_alloc_bytes{job="prometheus"}) by (job) /1024/1024'
- * the validator will look for the `value` key instead of `values`
- */
- it('validates data with the query format', () => {
- const validGraphData = monitoringUtils.graphDataValidatorForValues(
- true,
- singleStatGraphData(),
- );
-
- expect(validGraphData).toBe(true);
- });
-
- /*
- * When dealing with a metric using the query?range format, e.g.
- * query_range: 'avg(sum(container_memory_usage_bytes{container_name!="POD",pod_name=~"^%{ci_environment_slug}-(.*)",namespace="%{kube_namespace}"}) by (job)) without (job) /1024/1024/1024',
- * the validator will look for the `values` key instead of `value`
- */
- it('validates data with the query_range format', () => {
- const validGraphData = monitoringUtils.graphDataValidatorForValues(false, graphData);
-
- expect(validGraphData).toBe(true);
- });
- });
-
- describe('graphDataValidatorForAnomalyValues', () => {
- let oneMetric;
- let threeMetrics;
- let fourMetrics;
- beforeEach(() => {
- oneMetric = singleStatGraphData();
- threeMetrics = anomalyGraphData();
-
- const metrics = [...threeMetrics.metrics];
- metrics.push(threeMetrics.metrics[0]);
- fourMetrics = {
- ...anomalyGraphData(),
- metrics,
- };
- });
- /*
- * Anomaly charts can accept results for exactly 3 metrics,
- */
- it('validates passes with the right query format', () => {
- expect(monitoringUtils.graphDataValidatorForAnomalyValues(threeMetrics)).toBe(true);
- });
-
- it('validation fails for wrong format, 1 metric', () => {
- expect(monitoringUtils.graphDataValidatorForAnomalyValues(oneMetric)).toBe(false);
- });
-
- it('validation fails for wrong format, more than 3 metrics', () => {
- expect(monitoringUtils.graphDataValidatorForAnomalyValues(fourMetrics)).toBe(false);
- });
- });
-
- describe('timeRangeFromUrl', () => {
- beforeEach(() => {
- jest.spyOn(urlUtils, 'queryToObject');
- });
-
- afterEach(() => {
- urlUtils.queryToObject.mockRestore();
- });
-
- const { timeRangeFromUrl } = monitoringUtils;
-
- it('returns a fixed range when query contains `start` and `end` parameters are given', () => {
- urlUtils.queryToObject.mockReturnValueOnce(range);
- expect(timeRangeFromUrl()).toEqual(range);
- });
-
- it('returns a rolling range when query contains `duration_seconds` parameters are given', () => {
- const { seconds } = rollingRange.duration;
-
- urlUtils.queryToObject.mockReturnValueOnce({
- dashboard: '.gitlab/dashboard/my_dashboard.yml',
- duration_seconds: `${seconds}`,
- });
-
- expect(timeRangeFromUrl()).toEqual(rollingRange);
- });
-
- it('returns null when no time range parameters are given', () => {
- urlUtils.queryToObject.mockReturnValueOnce({
- dashboard: '.gitlab/dashboards/custom_dashboard.yml',
- param1: 'value1',
- param2: 'value2',
- });
-
- expect(timeRangeFromUrl()).toBe(null);
- });
- });
-
- describe('templatingVariablesFromUrl', () => {
- const { templatingVariablesFromUrl } = monitoringUtils;
-
- beforeEach(() => {
- jest.spyOn(urlUtils, 'queryToObject');
- });
-
- afterEach(() => {
- urlUtils.queryToObject.mockRestore();
- });
-
- it('returns an object with only the custom variables', () => {
- urlUtils.queryToObject.mockReturnValueOnce({
- dashboard: '.gitlab/dashboards/custom_dashboard.yml',
- y_label: 'memory usage',
- group: 'kubernetes',
- title: 'Kubernetes memory total',
- start: '2020-05-06',
- end: '2020-05-07',
- duration_seconds: '86400',
- direction: 'left',
- anchor: 'top',
- pod: 'POD',
- 'var-pod': 'POD',
- });
-
- expect(templatingVariablesFromUrl()).toEqual(expect.objectContaining({ pod: 'POD' }));
- });
-
- it('returns an empty object when no custom variables are present', () => {
- urlUtils.queryToObject.mockReturnValueOnce({
- dashboard: '.gitlab/dashboards/custom_dashboard.yml',
- });
-
- expect(templatingVariablesFromUrl()).toStrictEqual({});
- });
- });
-
- describe('removeTimeRangeParams', () => {
- const { removeTimeRangeParams } = monitoringUtils;
-
- it('returns when query contains `start` and `end` parameters are given', () => {
- expect(removeTimeRangeParams(`${mockPath}?start=${range.start}&end=${range.end}`)).toEqual(
- mockPath,
- );
- });
- });
-
- describe('timeRangeToUrl', () => {
- const { timeRangeToUrl } = monitoringUtils;
-
- beforeEach(() => {
- jest.spyOn(urlUtils, 'mergeUrlParams');
- jest.spyOn(urlUtils, 'removeParams');
- });
-
- afterEach(() => {
- urlUtils.mergeUrlParams.mockRestore();
- urlUtils.removeParams.mockRestore();
- });
-
- it('returns a fixed range when query contains `start` and `end` parameters are given', () => {
- const toUrl = `${mockPath}?start=${range.start}&end=${range.end}`;
- const fromUrl = mockPath;
-
- urlUtils.removeParams.mockReturnValueOnce(fromUrl);
- urlUtils.mergeUrlParams.mockReturnValueOnce(toUrl);
-
- expect(timeRangeToUrl(range)).toEqual(toUrl);
- expect(urlUtils.mergeUrlParams).toHaveBeenCalledWith(range, fromUrl);
- });
-
- it('returns a rolling range when query contains `duration_seconds` parameters are given', () => {
- const { seconds } = rollingRange.duration;
-
- const toUrl = `${mockPath}?duration_seconds=${seconds}`;
- const fromUrl = mockPath;
-
- urlUtils.removeParams.mockReturnValueOnce(fromUrl);
- urlUtils.mergeUrlParams.mockReturnValueOnce(toUrl);
-
- expect(timeRangeToUrl(rollingRange)).toEqual(toUrl);
- expect(urlUtils.mergeUrlParams).toHaveBeenCalledWith(
- { duration_seconds: `${seconds}` },
- fromUrl,
- );
- });
- });
-
- describe('expandedPanelPayloadFromUrl', () => {
- const { expandedPanelPayloadFromUrl } = monitoringUtils;
- const [panelGroup] = metricsDashboardViewModel.panelGroups;
- const [panel] = panelGroup.panels;
-
- const { group } = panelGroup;
- const { title, y_label: yLabel } = panel;
-
- it('returns payload for a panel when query parameters are given', () => {
- const search = `?group=${group}&title=${title}&y_label=${yLabel}`;
-
- expect(expandedPanelPayloadFromUrl(metricsDashboardViewModel, search)).toEqual({
- group: panelGroup.group,
- panel,
- });
- });
-
- it('returns null when no parameters are given', () => {
- expect(expandedPanelPayloadFromUrl(metricsDashboardViewModel, '')).toBe(null);
- });
-
- it('throws an error when no group is provided', () => {
- const search = `?title=${panel.title}&y_label=${yLabel}`;
- expect(() => expandedPanelPayloadFromUrl(metricsDashboardViewModel, search)).toThrow();
- });
-
- it('throws an error when no title is provided', () => {
- const search = `?title=${title}&y_label=${yLabel}`;
- expect(() => expandedPanelPayloadFromUrl(metricsDashboardViewModel, search)).toThrow();
- });
-
- it('throws an error when no y_label group is provided', () => {
- const search = `?group=${group}&title=${title}`;
- expect(() => expandedPanelPayloadFromUrl(metricsDashboardViewModel, search)).toThrow();
- });
-
- it.each`
- group | title | yLabel | missingField
- ${'NOT_A_GROUP'} | ${title} | ${yLabel} | ${'group'}
- ${group} | ${'NOT_A_TITLE'} | ${yLabel} | ${'title'}
- ${group} | ${title} | ${'NOT_A_Y_LABEL'} | ${'y_label'}
- `('throws an error when $missingField is incorrect', (params) => {
- const search = `?group=${params.group}&title=${params.title}&y_label=${params.yLabel}`;
- expect(() => expandedPanelPayloadFromUrl(metricsDashboardViewModel, search)).toThrow();
- });
- });
-
- describe('panelToUrl', () => {
- const { panelToUrl } = monitoringUtils;
-
- const dashboard = 'metrics.yml';
- const [panelGroup] = metricsDashboardViewModel.panelGroups;
- const [panel] = panelGroup.panels;
-
- const getUrlParams = (url) => urlUtils.queryToObject(url.split('?')[1]);
-
- it('returns URL for a panel when query parameters are given', () => {
- const params = getUrlParams(panelToUrl(dashboard, {}, panelGroup.group, panel));
-
- expect(params).toEqual(
- expect.objectContaining({
- dashboard,
- group: panelGroup.group,
- title: panel.title,
- y_label: panel.y_label,
- }),
- );
- });
-
- it('returns a dashboard only URL if group is missing', () => {
- const params = getUrlParams(panelToUrl(dashboard, {}, null, panel));
- expect(params).toEqual(expect.objectContaining({ dashboard: 'metrics.yml' }));
- });
-
- it('returns a dashboard only URL if panel is missing', () => {
- const params = getUrlParams(panelToUrl(dashboard, {}, panelGroup.group, null));
- expect(params).toEqual(expect.objectContaining({ dashboard: 'metrics.yml' }));
- });
-
- it('returns URL for a panel when query paramters are given including custom variables', () => {
- const params = getUrlParams(panelToUrl(dashboard, { pod: 'pod' }, panelGroup.group, null));
- expect(params).toEqual(expect.objectContaining({ dashboard: 'metrics.yml', pod: 'pod' }));
- });
- });
-
- describe('barChartsDataParser', () => {
- const singleMetricExpected = {
- SLA: [
- ['0.9935198135198128', 'api'],
- ['0.9975296513504401', 'git'],
- ['0.9994716394716395', 'registry'],
- ['0.9948251748251747', 'sidekiq'],
- ['0.9535664335664336', 'web'],
- ['0.9335664335664336', 'postgresql_database'],
- ],
- };
-
- const multipleMetricExpected = {
- ...singleMetricExpected,
- SLA_2: Object.values(singleMetricExpected)[0],
- };
-
- const barMockDataWithMultipleMetrics = {
- ...barMockData,
- metrics: [
- barMockData.metrics[0],
- {
- ...barMockData.metrics[0],
- label: 'SLA_2',
- },
- ],
- };
-
- it.each([
- {
- input: { metrics: undefined },
- output: {},
- testCase: 'barChartsDataParser returns {} with undefined',
- },
- {
- input: { metrics: null },
- output: {},
- testCase: 'barChartsDataParser returns {} with null',
- },
- {
- input: { metrics: [] },
- output: {},
- testCase: 'barChartsDataParser returns {} with []',
- },
- {
- input: barMockData,
- output: singleMetricExpected,
- testCase: 'barChartsDataParser returns single series object with single metrics',
- },
- {
- input: barMockDataWithMultipleMetrics,
- output: multipleMetricExpected,
- testCase: 'barChartsDataParser returns multiple series object with multiple metrics',
- },
- ])('$testCase', ({ input, output }) => {
- expect(monitoringUtils.barChartsDataParser(input.metrics)).toEqual(
- expect.objectContaining(output),
- );
- });
- });
-
- describe('removePrefixFromLabel', () => {
- it.each`
- input | expected
- ${undefined} | ${''}
- ${null} | ${''}
- ${''} | ${''}
- ${' '} | ${' '}
- ${'pod-1'} | ${'pod-1'}
- ${'pod-var-1'} | ${'pod-var-1'}
- ${'pod-1-var'} | ${'pod-1-var'}
- ${'podvar--1'} | ${'podvar--1'}
- ${'povar-d-1'} | ${'povar-d-1'}
- ${'var-pod-1'} | ${'pod-1'}
- ${'var-var-pod-1'} | ${'var-pod-1'}
- ${'varvar-pod-1'} | ${'varvar-pod-1'}
- ${'var-pod-1-var-'} | ${'pod-1-var-'}
- `('removePrefixFromLabel returns $expected with input $input', ({ input, expected }) => {
- expect(monitoringUtils.removePrefixFromLabel(input)).toEqual(expected);
- });
- });
-
- describe('convertVariablesForURL', () => {
- it.each`
- input | expected
- ${[]} | ${{}}
- ${[{ name: 'env', value: 'prod' }]} | ${{ 'var-env': 'prod' }}
- ${[{ name: 'env1', value: 'prod' }, { name: 'env2', value: null }]} | ${{ 'var-env1': 'prod' }}
- ${[{ name: 'var-env', value: 'prod' }]} | ${{ 'var-var-env': 'prod' }}
- `('convertVariablesForURL returns $expected with input $input', ({ input, expected }) => {
- expect(monitoringUtils.convertVariablesForURL(input)).toEqual(expected);
- });
- });
-
- describe('setCustomVariablesFromUrl', () => {
- beforeEach(() => {
- window.history.pushState = jest.fn();
- jest.spyOn(urlUtils, 'updateHistory');
- });
-
- afterEach(() => {
- urlUtils.updateHistory.mockRestore();
- });
-
- it.each`
- input | urlParams
- ${[]} | ${''}
- ${[{ name: 'env', value: 'prod' }]} | ${'?var-env=prod'}
- ${[{ name: 'env1', value: 'prod' }, { name: 'env2', value: null }]} | ${'?var-env1=prod'}
- `(
- 'setCustomVariablesFromUrl updates history with query "$urlParams" with input $input',
- ({ input, urlParams }) => {
- monitoringUtils.setCustomVariablesFromUrl(input);
-
- expect(urlUtils.updateHistory).toHaveBeenCalledTimes(1);
- expect(urlUtils.updateHistory).toHaveBeenCalledWith({
- url: `${TEST_HOST}/${urlParams}`,
- title: '',
- });
- },
- );
- });
-});
diff --git a/spec/frontend/monitoring/validators_spec.js b/spec/frontend/monitoring/validators_spec.js
deleted file mode 100644
index 0c3d77a7d98..00000000000
--- a/spec/frontend/monitoring/validators_spec.js
+++ /dev/null
@@ -1,80 +0,0 @@
-import { alertsValidator, queriesValidator } from '~/monitoring/validators';
-
-describe('alertsValidator', () => {
- const validAlert = {
- alert_path: 'my/alert.json',
- operator: '<',
- threshold: 5,
- metricId: '8',
- };
- it('requires all alerts to have an alert path', () => {
- const { operator, threshold, metricId } = validAlert;
- const input = {
- [validAlert.alert_path]: {
- operator,
- threshold,
- metricId,
- },
- };
- expect(alertsValidator(input)).toEqual(false);
- });
- it('requires that the object key matches the alert path', () => {
- const input = {
- undefined: validAlert,
- };
- expect(alertsValidator(input)).toEqual(false);
- });
- it('requires all alerts to have a metric id', () => {
- const input = {
- [validAlert.alert_path]: { ...validAlert, metricId: undefined },
- };
- expect(alertsValidator(input)).toEqual(false);
- });
- it('requires the metricId to be a string', () => {
- const input = {
- [validAlert.alert_path]: { ...validAlert, metricId: 8 },
- };
- expect(alertsValidator(input)).toEqual(false);
- });
- it('requires all alerts to have an operator', () => {
- const input = {
- [validAlert.alert_path]: { ...validAlert, operator: '' },
- };
- expect(alertsValidator(input)).toEqual(false);
- });
- it('requires all alerts to have an numeric threshold', () => {
- const input = {
- [validAlert.alert_path]: { ...validAlert, threshold: '60' },
- };
- expect(alertsValidator(input)).toEqual(false);
- });
- it('correctly identifies a valid alerts object', () => {
- const input = {
- [validAlert.alert_path]: validAlert,
- };
- expect(alertsValidator(input)).toEqual(true);
- });
-});
-describe('queriesValidator', () => {
- const validQuery = {
- metricId: '8',
- alert_path: 'alert',
- label: 'alert-label',
- };
- it('requires all alerts to have a metric id', () => {
- const input = [{ ...validQuery, metricId: undefined }];
- expect(queriesValidator(input)).toEqual(false);
- });
- it('requires the metricId to be a string', () => {
- const input = [{ ...validQuery, metricId: 8 }];
- expect(queriesValidator(input)).toEqual(false);
- });
- it('requires all queries to have a label', () => {
- const input = [{ ...validQuery, label: undefined }];
- expect(queriesValidator(input)).toEqual(false);
- });
- it('correctly identifies a valid queries array', () => {
- const input = [validQuery];
- expect(queriesValidator(input)).toEqual(true);
- });
-});
diff --git a/spec/frontend/notes/components/comment_form_spec.js b/spec/frontend/notes/components/comment_form_spec.js
index 6c774a1ecd0..a6d88bdd310 100644
--- a/spec/frontend/notes/components/comment_form_spec.js
+++ b/spec/frontend/notes/components/comment_form_spec.js
@@ -20,6 +20,7 @@ import eventHub from '~/notes/event_hub';
import { COMMENT_FORM } from '~/notes/i18n';
import notesModule from '~/notes/stores/modules';
import { sprintf } from '~/locale';
+import { mockTracking } from 'helpers/tracking_helper';
import { loggedOutnoteableData, notesDataMock, userDataMock, noteableDataMock } from '../mock_data';
jest.mock('autosize');
@@ -31,6 +32,7 @@ Vue.use(Vuex);
describe('issue_comment_form component', () => {
useLocalStorageSpy();
+ let trackingSpy;
let store;
let wrapper;
let axiosMock;
@@ -121,6 +123,15 @@ describe('issue_comment_form component', () => {
provide: {
glFeatures: features,
},
+ mocks: {
+ $apollo: {
+ queries: {
+ currentUser: {
+ loading: false,
+ },
+ },
+ },
+ },
}),
);
};
@@ -128,6 +139,7 @@ describe('issue_comment_form component', () => {
beforeEach(() => {
axiosMock = new MockAdapter(axios);
store = createStore();
+ trackingSpy = mockTracking(undefined, null, jest.spyOn);
});
afterEach(() => {
@@ -150,6 +162,21 @@ describe('issue_comment_form component', () => {
expect(wrapper.vm.stopPolling).toHaveBeenCalled();
});
+ it('tracks event', () => {
+ mountComponent({ mountFunction: mount, initialData: { note: 'hello world' } });
+
+ jest.spyOn(wrapper.vm, 'saveNote').mockResolvedValue();
+ jest.spyOn(wrapper.vm, 'stopPolling');
+
+ findCloseReopenButton().trigger('click');
+
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'editor_type_used', {
+ context: 'Issue_comment',
+ editorType: 'editor_type_plain_text_editor',
+ label: 'editor_tracking',
+ });
+ });
+
it('does not report errors in the UI when the save succeeds', async () => {
mountComponent({ mountFunction: mount, initialData: { note: '/label ~sdfghj' } });
@@ -294,13 +321,13 @@ describe('issue_comment_form component', () => {
it('hides content editor switcher if feature flag content_editor_on_issues is off', () => {
mountComponent({ mountFunction: mount, features: { contentEditorOnIssues: false } });
- expect(wrapper.text()).not.toContain('Switch to rich text');
+ expect(wrapper.text()).not.toContain('Switch to rich text editing');
});
it('shows content editor switcher if feature flag content_editor_on_issues is on', () => {
mountComponent({ mountFunction: mount, features: { contentEditorOnIssues: true } });
- expect(wrapper.text()).toContain('Switch to rich text');
+ expect(wrapper.text()).toContain('Switch to rich text editing');
});
describe('textarea', () => {
@@ -327,9 +354,8 @@ describe('issue_comment_form component', () => {
jest.spyOn(wrapper.vm, 'stopPolling');
jest.spyOn(wrapper.vm, 'saveNote').mockResolvedValue();
- // setData usage is discouraged. See https://gitlab.com/groups/gitlab-org/-/epics/7330 for details
- // eslint-disable-next-line no-restricted-syntax
- await wrapper.setData({ note: 'hello world' });
+ findMarkdownEditor().vm.$emit('input', 'hello world');
+ await nextTick();
await findCommentButton().trigger('click');
@@ -347,15 +373,7 @@ describe('issue_comment_form component', () => {
const { markdownDocsPath } = notesDataMock;
- expect(wrapper.find(`a[href="${markdownDocsPath}"]`).text()).toBe('Markdown');
- });
-
- it('should link to quick actions docs', () => {
- mountComponent({ mountFunction: mount });
-
- const { quickActionsDocsPath } = notesDataMock;
-
- expect(wrapper.find(`a[href="${quickActionsDocsPath}"]`).text()).toBe('quick actions');
+ expect(wrapper.find(`[href="${markdownDocsPath}"]`).exists()).toBe(true);
});
it('should resize textarea after note discarded', async () => {
@@ -459,9 +477,8 @@ describe('issue_comment_form component', () => {
it('should enable comment button if it has note', async () => {
mountComponent();
- // setData usage is discouraged. See https://gitlab.com/groups/gitlab-org/-/epics/7330 for details
- // eslint-disable-next-line no-restricted-syntax
- await wrapper.setData({ note: 'Foo' });
+ findMarkdownEditor().vm.$emit('input', 'Foo');
+ await nextTick();
expect(findCommentTypeDropdown().props('disabled')).toBe(false);
});
diff --git a/spec/frontend/notes/components/comment_type_dropdown_spec.js b/spec/frontend/notes/components/comment_type_dropdown_spec.js
index b891c1f553d..053542a421c 100644
--- a/spec/frontend/notes/components/comment_type_dropdown_spec.js
+++ b/spec/frontend/notes/components/comment_type_dropdown_spec.js
@@ -1,4 +1,4 @@
-import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
+import { GlButton, GlCollapsibleListbox, GlListboxItem } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import CommentTypeDropdown from '~/notes/components/comment_type_dropdown.vue';
@@ -8,9 +8,9 @@ import { COMMENT_FORM } from '~/notes/i18n';
describe('CommentTypeDropdown component', () => {
let wrapper;
- const findCommentGlDropdown = () => wrapper.findComponent(GlDropdown);
- const findCommentDropdownOption = () => wrapper.findAllComponents(GlDropdownItem).at(0);
- const findDiscussionDropdownOption = () => wrapper.findAllComponents(GlDropdownItem).at(1);
+ const findCommentButton = () => wrapper.findComponent(GlButton);
+ const findCommentListboxOption = () => wrapper.findAllComponents(GlListboxItem).at(0);
+ const findDiscussionListboxOption = () => wrapper.findAllComponents(GlListboxItem).at(1);
const mountComponent = ({ props = {} } = {}) => {
wrapper = extendedWrapper(
@@ -20,6 +20,10 @@ describe('CommentTypeDropdown component', () => {
noteType: constants.COMMENT,
...props,
},
+ stubs: {
+ GlCollapsibleListbox,
+ GlListboxItem,
+ },
}),
);
};
@@ -33,15 +37,15 @@ describe('CommentTypeDropdown component', () => {
({ isInternalNote, buttonText }) => {
mountComponent({ props: { noteType: constants.COMMENT, isInternalNote } });
- expect(findCommentGlDropdown().props()).toMatchObject({ text: buttonText });
+ expect(findCommentButton().text()).toBe(buttonText);
},
);
it('Should set correct dropdown item checked when comment is selected', () => {
mountComponent({ props: { noteType: constants.COMMENT } });
- expect(findCommentDropdownOption().props()).toMatchObject({ isChecked: true });
- expect(findDiscussionDropdownOption().props()).toMatchObject({ isChecked: false });
+ expect(findCommentListboxOption().props('isSelected')).toBe(true);
+ expect(findDiscussionListboxOption().props('isSelected')).toBe(false);
});
it.each`
@@ -53,32 +57,22 @@ describe('CommentTypeDropdown component', () => {
({ isInternalNote, buttonText }) => {
mountComponent({ props: { noteType: constants.DISCUSSION, isInternalNote } });
- expect(findCommentGlDropdown().props()).toMatchObject({ text: buttonText });
+ expect(findCommentButton().text()).toBe(buttonText);
},
);
it('Should set correct dropdown item option checked when discussion is selected', () => {
mountComponent({ props: { noteType: constants.DISCUSSION } });
- expect(findCommentDropdownOption().props()).toMatchObject({ isChecked: false });
- expect(findDiscussionDropdownOption().props()).toMatchObject({ isChecked: true });
+ expect(findCommentListboxOption().props('isSelected')).toBe(false);
+ expect(findDiscussionListboxOption().props('isSelected')).toBe(true);
});
it('Should emit `change` event when clicking on an alternate dropdown option', () => {
mountComponent({ props: { noteType: constants.DISCUSSION } });
- const event = {
- type: 'click',
- stopPropagation: jest.fn(),
- preventDefault: jest.fn(),
- };
-
- findCommentDropdownOption().vm.$emit('click', event);
- findDiscussionDropdownOption().vm.$emit('click', event);
-
- // ensure the native events don't trigger anything
- expect(event.stopPropagation).toHaveBeenCalledTimes(2);
- expect(event.preventDefault).toHaveBeenCalledTimes(2);
+ findCommentListboxOption().trigger('click');
+ findDiscussionListboxOption().trigger('click');
expect(wrapper.emitted('change')[0]).toEqual([constants.COMMENT]);
expect(wrapper.emitted('change').length).toEqual(1);
@@ -87,7 +81,7 @@ describe('CommentTypeDropdown component', () => {
it('Should emit `click` event when clicking on the action button', () => {
mountComponent({ props: { noteType: constants.DISCUSSION } });
- findCommentGlDropdown().vm.$emit('click');
+ findCommentButton().vm.$emit('click');
expect(wrapper.emitted('click').length > 0).toBe(true);
});
diff --git a/spec/frontend/notes/components/diff_discussion_header_spec.js b/spec/frontend/notes/components/diff_discussion_header_spec.js
index 66b86ed3ce0..123d53de3f3 100644
--- a/spec/frontend/notes/components/diff_discussion_header_spec.js
+++ b/spec/frontend/notes/components/diff_discussion_header_spec.js
@@ -12,14 +12,21 @@ describe('diff_discussion_header component', () => {
let store;
let wrapper;
+ const createComponent = ({ propsData = {} } = {}) => {
+ wrapper = shallowMount(diffDiscussionHeader, {
+ store,
+ propsData: {
+ discussion: discussionMock,
+ ...propsData,
+ },
+ });
+ };
+
beforeEach(() => {
window.mrTabs = {};
store = createStore();
- wrapper = shallowMount(diffDiscussionHeader, {
- store,
- propsData: { discussion: discussionMock },
- });
+ createComponent({ propsData: { discussion: discussionMock } });
});
describe('Avatar', () => {
@@ -27,19 +34,23 @@ describe('diff_discussion_header component', () => {
const findAvatarLink = () => wrapper.findComponent(GlAvatarLink);
const findAvatar = () => wrapper.findComponent(GlAvatar);
- it('should render user avatar and user avatar link', () => {
+ it('should render user avatar and user avatar link with popover support', () => {
expect(findAvatar().exists()).toBe(true);
- expect(findAvatarLink().exists()).toBe(true);
+
+ const avatarLink = findAvatarLink();
+ expect(avatarLink.exists()).toBe(true);
+ expect(avatarLink.classes()).toContain('js-user-link');
+ expect(avatarLink.attributes()).toMatchObject({
+ href: firstNoteAuthor.path,
+ 'data-user-id': `${firstNoteAuthor.id}`,
+ 'data-username': `${firstNoteAuthor.username}`,
+ });
});
it('renders avatar of the first note author', () => {
- const props = findAvatar().props();
-
- expect(props).toMatchObject({
- src: firstNoteAuthor.avatar_url,
- alt: firstNoteAuthor.name,
- size: 32,
- });
+ expect(findAvatar().props('src')).toBe(firstNoteAuthor.avatar_url);
+ expect(findAvatar().props('alt')).toBe(firstNoteAuthor.name);
+ expect(findAvatar().props('size')).toBe(32);
});
});
@@ -53,14 +64,16 @@ describe('diff_discussion_header component', () => {
projectPath: 'something',
};
- wrapper.setProps({
- discussion: {
- ...discussionMock,
- for_commit: true,
- commit_id: commitId,
- diff_discussion: true,
- diff_file: {
- ...mockDiffFile,
+ createComponent({
+ propsData: {
+ discussion: {
+ ...discussionMock,
+ for_commit: true,
+ commit_id: commitId,
+ diff_discussion: true,
+ diff_file: {
+ ...mockDiffFile,
+ },
},
},
});
@@ -71,9 +84,15 @@ describe('diff_discussion_header component', () => {
describe('for diff threads without a commit id', () => {
it('should show started a thread on the diff text', async () => {
- Object.assign(wrapper.vm.discussion, {
- for_commit: false,
- commit_id: null,
+ createComponent({
+ propsData: {
+ discussion: {
+ ...discussionMock,
+ diff_discussion: true,
+ for_commit: false,
+ commit_id: null,
+ },
+ },
});
await nextTick();
@@ -81,10 +100,16 @@ describe('diff_discussion_header component', () => {
});
it('should show thread on older version text', async () => {
- Object.assign(wrapper.vm.discussion, {
- for_commit: false,
- commit_id: null,
- active: false,
+ createComponent({
+ propsData: {
+ discussion: {
+ ...discussionMock,
+ diff_discussion: true,
+ for_commit: false,
+ commit_id: null,
+ active: false,
+ },
+ },
});
await nextTick();
@@ -102,7 +127,16 @@ describe('diff_discussion_header component', () => {
describe('for diff thread with a commit id', () => {
it('should display started thread on commit header', async () => {
- wrapper.vm.discussion.for_commit = false;
+ createComponent({
+ propsData: {
+ discussion: {
+ ...discussionMock,
+ diff_discussion: true,
+ for_commit: false,
+ commit_id: commitId,
+ },
+ },
+ });
await nextTick();
expect(wrapper.text()).toContain(`started a thread on commit ${truncatedCommitId}`);
@@ -111,8 +145,17 @@ describe('diff_discussion_header component', () => {
});
it('should display outdated change on commit header', async () => {
- wrapper.vm.discussion.for_commit = false;
- wrapper.vm.discussion.active = false;
+ createComponent({
+ propsData: {
+ discussion: {
+ ...discussionMock,
+ diff_discussion: true,
+ for_commit: false,
+ commit_id: commitId,
+ active: false,
+ },
+ },
+ });
await nextTick();
expect(wrapper.text()).toContain(
diff --git a/spec/frontend/notes/components/discussion_counter_spec.js b/spec/frontend/notes/components/discussion_counter_spec.js
index ac677841ee1..e52dd87f784 100644
--- a/spec/frontend/notes/components/discussion_counter_spec.js
+++ b/spec/frontend/notes/components/discussion_counter_spec.js
@@ -1,11 +1,11 @@
-import { GlDropdownItem } from '@gitlab/ui';
+import { GlDisclosureDropdown, GlDisclosureDropdownItem } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
import Vuex from 'vuex';
import DiscussionCounter from '~/notes/components/discussion_counter.vue';
import notesModule from '~/notes/stores/modules';
import * as types from '~/notes/stores/mutation_types';
-import { noteableDataMock, discussionMock, notesDataMock, userDataMock } from '../mock_data';
+import { discussionMock, noteableDataMock, notesDataMock, userDataMock } from '../mock_data';
describe('DiscussionCounter component', () => {
let store;
@@ -101,9 +101,24 @@ describe('DiscussionCounter component', () => {
`('renders correctly if $title', async ({ resolved, groupLength }) => {
updateStore({ resolvable: true, resolved });
wrapper = mount(DiscussionCounter, { store, propsData: { blocksMerge: true } });
- await wrapper.find('.dropdown-toggle').trigger('click');
+ await wrapper.findComponent(GlDisclosureDropdown).trigger('click');
- expect(wrapper.findAllComponents(GlDropdownItem)).toHaveLength(groupLength);
+ expect(wrapper.findAllComponents(GlDisclosureDropdownItem)).toHaveLength(groupLength);
+ });
+
+ describe('resolve all with new issue link', () => {
+ it('has correct href prop', async () => {
+ updateStore({ resolvable: true });
+ wrapper = mount(DiscussionCounter, { store, propsData: { blocksMerge: true } });
+
+ const resolveDiscussionsPath =
+ store.getters.getNoteableData.create_issue_to_resolve_discussions_path;
+
+ await wrapper.findComponent(GlDisclosureDropdown).trigger('click');
+ const resolveAllLink = wrapper.find('[data-testid="resolve-all-with-issue-link"]');
+
+ expect(resolveAllLink.attributes('href')).toBe(resolveDiscussionsPath);
+ });
});
});
@@ -114,7 +129,7 @@ describe('DiscussionCounter component', () => {
store.commit(types.ADD_OR_UPDATE_DISCUSSIONS, [discussion]);
store.dispatch('updateResolvableDiscussionsCounts');
wrapper = mount(DiscussionCounter, { store, propsData: { blocksMerge: true } });
- await wrapper.find('.dropdown-toggle').trigger('click');
+ await wrapper.findComponent(GlDisclosureDropdown).trigger('click');
toggleAllButton = wrapper.find('[data-testid="toggle-all-discussions-btn"]');
};
diff --git a/spec/frontend/notes/components/mr_discussion_filter_spec.js b/spec/frontend/notes/components/mr_discussion_filter_spec.js
index beb25c30af6..2bb47fd3c9e 100644
--- a/spec/frontend/notes/components/mr_discussion_filter_spec.js
+++ b/spec/frontend/notes/components/mr_discussion_filter_spec.js
@@ -67,7 +67,7 @@ describe('Merge request discussion filter component', () => {
it('lists current filters', () => {
createComponent();
- expect(wrapper.findAllComponents(GlListboxItem).length).toBe(MR_FILTER_OPTIONS.length);
+ expect(wrapper.findAllComponents(GlListboxItem)).toHaveLength(MR_FILTER_OPTIONS.length);
});
it('updates store when selecting filter', async () => {
@@ -107,4 +107,30 @@ describe('Merge request discussion filter component', () => {
expect(wrapper.findComponent(GlButton).text()).toBe(expectedText);
});
+
+ it('when clicking de-select it de-selects all options', async () => {
+ createComponent();
+
+ wrapper.find('[data-testid="listbox-reset-button"]').vm.$emit('click');
+
+ await nextTick();
+
+ expect(wrapper.findAll('[aria-selected="true"]')).toHaveLength(0);
+ });
+
+ it('when clicking select all it selects all options', async () => {
+ createComponent();
+
+ wrapper.find('[data-testid="listbox-item-approval"]').vm.$emit('select', false);
+
+ await nextTick();
+
+ expect(wrapper.findAll('[aria-selected="true"]')).toHaveLength(9);
+
+ wrapper.find('[data-testid="listbox-select-all-button"]').vm.$emit('click');
+
+ await nextTick();
+
+ expect(wrapper.findAll('[aria-selected="true"]')).toHaveLength(10);
+ });
});
diff --git a/spec/frontend/notes/components/note_form_spec.js b/spec/frontend/notes/components/note_form_spec.js
index b5b33607282..645aef21e38 100644
--- a/spec/frontend/notes/components/note_form_spec.js
+++ b/spec/frontend/notes/components/note_form_spec.js
@@ -7,6 +7,7 @@ import MarkdownField from '~/vue_shared/components/markdown/field.vue';
import { AT_WHO_ACTIVE_CLASS } from '~/gfm_auto_complete';
import eventHub from '~/environments/event_hub';
import { mountExtended } from 'helpers/vue_test_utils_helper';
+import { mockTracking } from 'helpers/tracking_helper';
import { noteableDataMock, notesDataMock, discussionMock, note } from '../mock_data';
jest.mock('~/lib/utils/autosave');
@@ -15,6 +16,7 @@ describe('issue_note_form component', () => {
let store;
let wrapper;
let props;
+ let trackingSpy;
const createComponentWrapper = (propsData = {}, provide = {}) => {
wrapper = mountExtended(NoteForm, {
@@ -26,6 +28,15 @@ describe('issue_note_form component', () => {
provide: {
glFeatures: provide,
},
+ mocks: {
+ $apollo: {
+ queries: {
+ currentUser: {
+ loading: false,
+ },
+ },
+ },
+ },
});
};
@@ -43,6 +54,7 @@ describe('issue_note_form component', () => {
noteBody: 'Magni suscipit eius consectetur enim et ex et commodi.',
noteId: '545',
};
+ trackingSpy = mockTracking(undefined, null, jest.spyOn);
});
describe('noteHash', () => {
@@ -66,13 +78,13 @@ describe('issue_note_form component', () => {
it('hides content editor switcher if feature flag content_editor_on_issues is off', () => {
createComponentWrapper({}, { contentEditorOnIssues: false });
- expect(wrapper.text()).not.toContain('Switch to rich text');
+ expect(wrapper.text()).not.toContain('Switch to rich text editing');
});
it('shows content editor switcher if feature flag content_editor_on_issues is on', () => {
createComponentWrapper({}, { contentEditorOnIssues: true });
- expect(wrapper.text()).toContain('Switch to rich text');
+ expect(wrapper.text()).toContain('Switch to rich text editing');
});
describe('conflicts editing', () => {
@@ -213,6 +225,21 @@ describe('issue_note_form component', () => {
expect(wrapper.emitted('handleFormUpdate')).toHaveLength(1);
});
+
+ it('tracks event when save button is clicked', () => {
+ createComponentWrapper();
+
+ const textarea = wrapper.find('textarea');
+ textarea.setValue('Foo');
+ const saveButton = wrapper.find('.js-vue-issue-save');
+ saveButton.vm.$emit('click');
+
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'editor_type_used', {
+ context: 'Issue_note',
+ editorType: 'editor_type_plain_text_editor',
+ label: 'editor_tracking',
+ });
+ });
});
});
@@ -271,7 +298,9 @@ describe('issue_note_form component', () => {
await nextTick();
- expect(wrapper.emitted('handleFormUpdateAddToReview')).toEqual([['Foo', false]]);
+ expect(wrapper.emitted('handleFormUpdateAddToReview')).toStrictEqual([
+ ['Foo', false, wrapper.vm.$refs.editNoteForm, expect.any(Function)],
+ ]);
});
});
});
diff --git a/spec/frontend/notes/components/noteable_note_spec.js b/spec/frontend/notes/components/noteable_note_spec.js
index d50fb130a69..059972df56b 100644
--- a/spec/frontend/notes/components/noteable_note_spec.js
+++ b/spec/frontend/notes/components/noteable_note_spec.js
@@ -1,6 +1,6 @@
import Vue, { nextTick } from 'vue';
import Vuex from 'vuex';
-import { GlAvatar } from '@gitlab/ui';
+import { GlAvatarLink, GlAvatar } from '@gitlab/ui';
import { clone } from 'lodash';
import { mountExtended } from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises';
@@ -218,6 +218,18 @@ describe('issue_note', () => {
});
});
+ it('should render user avatar link with popover support', () => {
+ const { author } = note;
+ const avatarLink = wrapper.findComponent(GlAvatarLink);
+
+ expect(avatarLink.classes()).toContain('js-user-link');
+ expect(avatarLink.attributes()).toMatchObject({
+ href: author.path,
+ 'data-user-id': `${author.id}`,
+ 'data-username': `${author.username}`,
+ });
+ });
+
it('should render user avatar', () => {
const { author } = note;
const avatar = wrapper.findComponent(GlAvatar);
@@ -373,10 +385,24 @@ describe('issue_note', () => {
afterEach(() => updateNote.mockReset());
- it('responds to handleFormUpdate', () => {
+ it('emits handleUpdateNote', () => {
+ const updatedNote = { ...note, note_html: `<p dir="auto">${params.noteText}</p>\n` };
+
findNoteBody().vm.$emit('handleFormUpdate', params);
expect(wrapper.emitted('handleUpdateNote')).toHaveLength(1);
+
+ expect(wrapper.emitted('handleUpdateNote')[0]).toEqual([
+ {
+ note: updatedNote,
+ noteText: params.noteText,
+ resolveDiscussion: params.resolveDiscussion,
+ position: {},
+ flashContainer: wrapper.vm.$el,
+ callback: expect.any(Function),
+ errorCallback: expect.any(Function),
+ },
+ ]);
});
it('updates note content', async () => {
diff --git a/spec/frontend/notes/components/notes_app_spec.js b/spec/frontend/notes/components/notes_app_spec.js
index 0f70b264326..caf47febedd 100644
--- a/spec/frontend/notes/components/notes_app_spec.js
+++ b/spec/frontend/notes/components/notes_app_spec.js
@@ -122,7 +122,7 @@ describe('note_app', () => {
);
});
- // https://gitlab.com/gitlab-org/gitlab/-/issues/410409
+ // quarantine: https://gitlab.com/gitlab-org/gitlab/-/issues/410409
// eslint-disable-next-line jest/no-disabled-tests
it.skip('should render form comment button as disabled', () => {
expect(findCommentButton().props('disabled')).toEqual(true);
@@ -250,15 +250,7 @@ describe('note_app', () => {
it('should render markdown docs url', () => {
const { markdownDocsPath } = mockData.notesDataMock;
- expect(wrapper.find(`a[href="${markdownDocsPath}"]`).text().trim()).toEqual('Markdown');
- });
-
- it('should render quick action docs url', () => {
- const { quickActionsDocsPath } = mockData.notesDataMock;
-
- expect(wrapper.find(`a[href="${quickActionsDocsPath}"]`).text().trim()).toEqual(
- 'quick actions',
- );
+ expect(wrapper.find(`a[href="${markdownDocsPath}"]`).exists()).toBe(true);
});
});
@@ -274,19 +266,7 @@ describe('note_app', () => {
const { markdownDocsPath } = mockData.notesDataMock;
await nextTick();
- expect(wrapper.find(`.edit-note a[href="${markdownDocsPath}"]`).text().trim()).toEqual(
- 'Markdown',
- );
- });
-
- it('should render quick actions docs url', async () => {
- wrapper.find('.js-note-edit').trigger('click');
- const { quickActionsDocsPath } = mockData.notesDataMock;
-
- await nextTick();
- expect(wrapper.find(`.edit-note a[href="${quickActionsDocsPath}"]`).text().trim()).toEqual(
- 'quick actions',
- );
+ expect(wrapper.find(`.edit-note a[href="${markdownDocsPath}"]`).exists()).toBe(true);
});
});
diff --git a/spec/frontend/notes/deprecated_notes_spec.js b/spec/frontend/notes/deprecated_notes_spec.js
index 355ecb78187..0e0af3f0480 100644
--- a/spec/frontend/notes/deprecated_notes_spec.js
+++ b/spec/frontend/notes/deprecated_notes_spec.js
@@ -32,8 +32,7 @@ function wrappedDiscussionNote(note) {
return `<table><tbody>${note}</tbody></table>`;
}
-// the following test is unreliable and failing in main 2-3 times a day
-// see https://gitlab.com/gitlab-org/gitlab/issues/206906#note_290602581
+// quarantine: https://gitlab.com/gitlab-org/gitlab/-/issues/208441
// eslint-disable-next-line jest/no-disabled-tests
describe.skip('Old Notes (~/deprecated_notes.js)', () => {
beforeEach(() => {
diff --git a/spec/frontend/notes/mixins/discussion_navigation_spec.js b/spec/frontend/notes/mixins/discussion_navigation_spec.js
index b6a2b318ec3..bef8ed8e659 100644
--- a/spec/frontend/notes/mixins/discussion_navigation_spec.js
+++ b/spec/frontend/notes/mixins/discussion_navigation_spec.js
@@ -74,7 +74,6 @@ describe('Discussion navigation mixin', () => {
});
afterEach(() => {
- jest.clearAllMocks();
resetHTMLFixture();
});
diff --git a/spec/frontend/notes/mock_data.js b/spec/frontend/notes/mock_data.js
index d5b7ad73177..94549c4a73b 100644
--- a/spec/frontend/notes/mock_data.js
+++ b/spec/frontend/notes/mock_data.js
@@ -60,7 +60,7 @@ export const noteableDataMock = {
updated_at: '2017-08-04T09:53:01.226Z',
updated_by_id: 1,
web_url: '/gitlab-org/gitlab-foss/issues/26',
- noteableType: 'issue',
+ noteableType: 'Issue',
blocked_by_issues: [],
};
diff --git a/spec/frontend/notes/utils_spec.js b/spec/frontend/notes/utils_spec.js
index 0882e0a5759..3607c3c546c 100644
--- a/spec/frontend/notes/utils_spec.js
+++ b/spec/frontend/notes/utils_spec.js
@@ -1,12 +1,12 @@
import { sprintf } from '~/locale';
-import { getErrorMessages } from '~/notes/utils';
+import { createNoteErrorMessages, updateNoteErrorMessage } from '~/notes/utils';
import { HTTP_STATUS_UNPROCESSABLE_ENTITY, HTTP_STATUS_BAD_REQUEST } from '~/lib/utils/http_status';
-import { COMMENT_FORM } from '~/notes/i18n';
+import { COMMENT_FORM, UPDATE_COMMENT_FORM } from '~/notes/i18n';
-describe('getErrorMessages', () => {
+describe('createNoteErrorMessages', () => {
describe('when http status is not HTTP_STATUS_UNPROCESSABLE_ENTITY', () => {
it('returns generic error', () => {
- const errorMessages = getErrorMessages(
+ const errorMessages = createNoteErrorMessages(
{ errors: ['unknown error'] },
HTTP_STATUS_BAD_REQUEST,
);
@@ -17,7 +17,7 @@ describe('getErrorMessages', () => {
describe('when http status is HTTP_STATUS_UNPROCESSABLE_ENTITY', () => {
it('returns all errors', () => {
- const errorMessages = getErrorMessages(
+ const errorMessages = createNoteErrorMessages(
{ errors: 'error 1 and error 2' },
HTTP_STATUS_UNPROCESSABLE_ENTITY,
);
@@ -29,7 +29,7 @@ describe('getErrorMessages', () => {
describe('when response contains commands_only errors', () => {
it('only returns commands_only errors', () => {
- const errorMessages = getErrorMessages(
+ const errorMessages = createNoteErrorMessages(
{
errors: {
commands_only: ['commands_only error 1', 'commands_only error 2'],
@@ -44,3 +44,22 @@ describe('getErrorMessages', () => {
});
});
});
+
+describe('updateNoteErrorMessage', () => {
+ describe('with server error', () => {
+ it('returns error message with server error', () => {
+ const error = 'error 1 and error 2';
+ const errorMessage = updateNoteErrorMessage({ response: { data: { errors: error } } });
+
+ expect(errorMessage).toEqual(sprintf(UPDATE_COMMENT_FORM.error, { reason: error }));
+ });
+ });
+
+ describe('without server error', () => {
+ it('returns generic error message', () => {
+ const errorMessage = updateNoteErrorMessage(null);
+
+ expect(errorMessage).toEqual(UPDATE_COMMENT_FORM.defaultError);
+ });
+ });
+});
diff --git a/spec/frontend/notifications/components/notification_email_listbox_input_spec.js b/spec/frontend/notifications/components/notification_email_listbox_input_spec.js
index c490c737cf1..a3a847b9523 100644
--- a/spec/frontend/notifications/components/notification_email_listbox_input_spec.js
+++ b/spec/frontend/notifications/components/notification_email_listbox_input_spec.js
@@ -13,6 +13,7 @@ describe('NotificationEmailListboxInput', () => {
const emptyValueText = 'emptyValueText';
const value = 'value';
const disabled = false;
+ const placement = 'right';
// Finders
const findListboxInput = () => wrapper.findComponent(ListboxInput);
@@ -26,6 +27,7 @@ describe('NotificationEmailListboxInput', () => {
emptyValueText,
value,
disabled,
+ placement,
},
attachTo,
});
diff --git a/spec/frontend/observability/client_spec.js b/spec/frontend/observability/client_spec.js
new file mode 100644
index 00000000000..239d7adf986
--- /dev/null
+++ b/spec/frontend/observability/client_spec.js
@@ -0,0 +1,66 @@
+import MockAdapter from 'axios-mock-adapter';
+import { buildClient } from '~/observability/client';
+import axios from '~/lib/utils/axios_utils';
+
+jest.mock('~/lib/utils/axios_utils');
+
+describe('buildClient', () => {
+ let client;
+ let axiosMock;
+
+ const tracingUrl = 'https://example.com/tracing';
+
+ beforeEach(() => {
+ axiosMock = new MockAdapter(axios);
+ jest.spyOn(axios, 'get');
+
+ client = buildClient({
+ tracingUrl,
+ provisioningUrl: 'https://example.com/provisioning',
+ });
+ });
+
+ afterEach(() => {
+ axiosMock.restore();
+ });
+
+ describe('fetchTraces', () => {
+ it('should fetch traces from the tracing URL', async () => {
+ const mockTraces = [
+ { id: 1, spans: [{ duration_nano: 1000 }, { duration_nano: 2000 }] },
+ { id: 2, spans: [{ duration_nano: 2000 }] },
+ ];
+
+ axiosMock.onGet(tracingUrl).reply(200, {
+ traces: mockTraces,
+ });
+
+ const result = await client.fetchTraces();
+
+ expect(axios.get).toHaveBeenCalledTimes(1);
+ expect(axios.get).toHaveBeenCalledWith(tracingUrl, {
+ withCredentials: true,
+ });
+ expect(result).toEqual([
+ { id: 1, spans: [{ duration_nano: 1000 }, { duration_nano: 2000 }], duration: 3 },
+ { id: 2, spans: [{ duration_nano: 2000 }], duration: 2 },
+ ]);
+ });
+
+ it('rejects if traces are missing', () => {
+ axiosMock.onGet(tracingUrl).reply(200, {});
+
+ return expect(client.fetchTraces()).rejects.toThrow(
+ 'traces are missing/invalid in the response',
+ );
+ });
+
+ it('rejects if traces are invalid', () => {
+ axiosMock.onGet(tracingUrl).reply(200, { traces: 'invalid' });
+
+ return expect(client.fetchTraces()).rejects.toThrow(
+ 'traces are missing/invalid in the response',
+ );
+ });
+ });
+});
diff --git a/spec/frontend/observability/observability_app_spec.js b/spec/frontend/observability/observability_app_spec.js
index 4a9be71b880..392992a5962 100644
--- a/spec/frontend/observability/observability_app_spec.js
+++ b/spec/frontend/observability/observability_app_spec.js
@@ -1,4 +1,5 @@
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { stubComponent } from 'helpers/stub_component';
import ObservabilityApp from '~/observability/components/observability_app.vue';
import ObservabilitySkeleton from '~/observability/components/skeleton/index.vue';
import {
@@ -21,7 +22,7 @@ describe('ObservabilityApp', () => {
query: { otherQuery: 100 },
};
- const mockHandleSkeleton = jest.fn();
+ const mockSkeletonOnContentLoaded = jest.fn();
const findIframe = () => wrapper.findByTestId('observability-ui-iframe');
@@ -36,7 +37,9 @@ describe('ObservabilityApp', () => {
...props,
},
stubs: {
- 'observability-skeleton': ObservabilitySkeleton,
+ ObservabilitySkeleton: stubComponent(ObservabilitySkeleton, {
+ methods: { onContentLoaded: mockSkeletonOnContentLoaded },
+ }),
},
mocks: {
$route,
@@ -155,14 +158,14 @@ describe('ObservabilityApp', () => {
describe('on GOUI_LOADED', () => {
beforeEach(() => {
mountComponent();
- wrapper.vm.$refs.observabilitySkeleton.onContentLoaded = mockHandleSkeleton;
});
+
it('should call onContentLoaded method', () => {
dispatchMessageEvent({
data: { type: MESSAGE_EVENT_TYPE.GOUI_LOADED },
origin: 'https://observe.gitlab.com',
});
- expect(mockHandleSkeleton).toHaveBeenCalled();
+ expect(mockSkeletonOnContentLoaded).toHaveBeenCalled();
});
it('should not call onContentLoaded method if origin is different', () => {
@@ -170,7 +173,7 @@ describe('ObservabilityApp', () => {
data: { type: MESSAGE_EVENT_TYPE.GOUI_LOADED },
origin: 'https://example.com',
});
- expect(mockHandleSkeleton).not.toHaveBeenCalled();
+ expect(mockSkeletonOnContentLoaded).not.toHaveBeenCalled();
});
it('should not call onContentLoaded method if event type is different', () => {
@@ -178,7 +181,7 @@ describe('ObservabilityApp', () => {
data: { type: 'UNKNOWN_EVENT' },
origin: 'https://observe.gitlab.com',
});
- expect(mockHandleSkeleton).not.toHaveBeenCalled();
+ expect(mockSkeletonOnContentLoaded).not.toHaveBeenCalled();
});
});
diff --git a/spec/frontend/observability/observability_container_spec.js b/spec/frontend/observability/observability_container_spec.js
new file mode 100644
index 00000000000..1152df072d4
--- /dev/null
+++ b/spec/frontend/observability/observability_container_spec.js
@@ -0,0 +1,134 @@
+import { nextTick } from 'vue';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { stubComponent } from 'helpers/stub_component';
+import ObservabilityContainer from '~/observability/components/observability_container.vue';
+import ObservabilitySkeleton from '~/observability/components/skeleton/index.vue';
+import { buildClient } from '~/observability/client';
+
+jest.mock('~/observability/client');
+
+describe('ObservabilityContainer', () => {
+ let wrapper;
+
+ const mockSkeletonOnContentLoaded = jest.fn();
+ const mockSkeletonOnError = jest.fn();
+
+ const OAUTH_URL = 'https://example.com/oauth';
+ const TRACING_URL = 'https://example.com/tracing';
+ const PROVISIONING_URL = 'https://example.com/provisioning';
+
+ beforeEach(() => {
+ jest.spyOn(console, 'error').mockImplementation();
+
+ buildClient.mockReturnValue({});
+
+ wrapper = shallowMountExtended(ObservabilityContainer, {
+ propsData: {
+ oauthUrl: OAUTH_URL,
+ tracingUrl: TRACING_URL,
+ provisioningUrl: PROVISIONING_URL,
+ },
+ stubs: {
+ ObservabilitySkeleton: stubComponent(ObservabilitySkeleton, {
+ methods: { onContentLoaded: mockSkeletonOnContentLoaded, onError: mockSkeletonOnError },
+ }),
+ },
+ slots: {
+ default: {
+ render(h) {
+ h(`<div>mockedComponent</div>`);
+ },
+ name: 'MockComponent',
+ props: {
+ observabilityClient: {
+ type: Object,
+ required: true,
+ },
+ },
+ },
+ },
+ });
+ });
+
+ const dispatchMessageEvent = (status, origin) =>
+ window.dispatchEvent(
+ new MessageEvent('message', {
+ data: {
+ type: 'AUTH_COMPLETION',
+ status,
+ },
+ origin: origin ?? new URL(OAUTH_URL).origin,
+ }),
+ );
+
+ const findIframe = () => wrapper.findByTestId('observability-oauth-iframe');
+ const findSlotComponent = () => wrapper.findComponent({ name: 'MockComponent' });
+
+ it('should render the oauth iframe', () => {
+ const iframe = findIframe();
+ expect(iframe.exists()).toBe(true);
+ expect(iframe.attributes('hidden')).toBe('hidden');
+ expect(iframe.attributes('src')).toBe(OAUTH_URL);
+ expect(iframe.attributes('sandbox')).toBe('allow-same-origin allow-forms allow-scripts');
+ });
+
+ it('should render the ObservabilitySkeleton', () => {
+ const skeleton = wrapper.findComponent(ObservabilitySkeleton);
+ expect(skeleton.exists()).toBe(true);
+ });
+
+ it('should not render the default slot', () => {
+ expect(findSlotComponent().exists()).toBe(false);
+ });
+
+ it('renders the slot content and removes the iframe on oauth success message', async () => {
+ dispatchMessageEvent('success');
+
+ await nextTick();
+
+ expect(mockSkeletonOnContentLoaded).toHaveBeenCalledTimes(1);
+
+ const slotComponent = findSlotComponent();
+ expect(slotComponent.exists()).toBe(true);
+ expect(buildClient).toHaveBeenCalledWith({
+ provisioningUrl: PROVISIONING_URL,
+ tracingUrl: TRACING_URL,
+ });
+ expect(findIframe().exists()).toBe(false);
+ });
+
+ it('does not render the slot content and removes the iframe on oauth error message', async () => {
+ dispatchMessageEvent('error');
+
+ await nextTick();
+
+ expect(mockSkeletonOnError).toHaveBeenCalledTimes(1);
+
+ expect(findSlotComponent().exists()).toBe(false);
+ expect(findIframe().exists()).toBe(false);
+ expect(buildClient).not.toHaveBeenCalled();
+ });
+
+ it('handles oauth message only once', () => {
+ dispatchMessageEvent('success');
+ dispatchMessageEvent('success');
+
+ expect(mockSkeletonOnContentLoaded).toHaveBeenCalledTimes(1);
+ });
+
+ it('only handles messages from the oauth url', () => {
+ dispatchMessageEvent('success', 'www.fake-url.com');
+
+ expect(mockSkeletonOnContentLoaded).toHaveBeenCalledTimes(0);
+ expect(findSlotComponent().exists()).toBe(false);
+ expect(findIframe().exists()).toBe(true);
+ });
+
+ it('does not handle messages if the component has been destroyed', () => {
+ wrapper.destroy();
+
+ dispatchMessageEvent('success');
+
+ expect(mockSkeletonOnContentLoaded).toHaveBeenCalledTimes(0);
+ });
+});
diff --git a/spec/frontend/observability/skeleton_spec.js b/spec/frontend/observability/skeleton_spec.js
index 65dbb003743..979070cfb12 100644
--- a/spec/frontend/observability/skeleton_spec.js
+++ b/spec/frontend/observability/skeleton_spec.js
@@ -1,5 +1,5 @@
import { nextTick } from 'vue';
-import { GlSkeletonLoader, GlAlert } from '@gitlab/ui';
+import { GlSkeletonLoader, GlAlert, GlLoadingIcon } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import Skeleton from '~/observability/components/skeleton/index.vue';
@@ -17,9 +17,9 @@ import {
describe('Skeleton component', () => {
let wrapper;
- const SKELETON_VARIANTS = Object.values(SKELETON_VARIANTS_BY_ROUTE);
+ const SKELETON_VARIANTS = [...Object.values(SKELETON_VARIANTS_BY_ROUTE), 'spinner'];
- const findContentWrapper = () => wrapper.findByTestId('observability-wrapper');
+ const findContentWrapper = () => wrapper.findByTestId('content-wrapper');
const findExploreSkeleton = () => wrapper.findComponent(ExploreSkeleton);
@@ -42,8 +42,8 @@ describe('Skeleton component', () => {
mountComponent({ variant: 'explore' });
});
- describe('loading timers', () => {
- it('show Skeleton if content is not loaded within CONTENT_WAIT_MS', async () => {
+ describe('showing content', () => {
+ it('shows the skeleton if content is not loaded within CONTENT_WAIT_MS', async () => {
expect(findExploreSkeleton().exists()).toBe(false);
expect(findContentWrapper().isVisible()).toBe(false);
@@ -55,7 +55,7 @@ describe('Skeleton component', () => {
expect(findContentWrapper().isVisible()).toBe(false);
});
- it('does not show the skeleton if content has loaded within CONTENT_WAIT_MS', async () => {
+ it('does not show the skeleton if content loads within CONTENT_WAIT_MS', async () => {
expect(findExploreSkeleton().exists()).toBe(false);
expect(findContentWrapper().isVisible()).toBe(false);
@@ -73,9 +73,25 @@ describe('Skeleton component', () => {
expect(findContentWrapper().isVisible()).toBe(true);
expect(findExploreSkeleton().exists()).toBe(false);
});
+
+ it('hides the skeleton after content loads', async () => {
+ jest.advanceTimersByTime(DEFAULT_TIMERS.CONTENT_WAIT_MS);
+
+ await nextTick();
+
+ expect(findExploreSkeleton().exists()).toBe(true);
+ expect(findContentWrapper().isVisible()).toBe(false);
+
+ wrapper.vm.onContentLoaded();
+
+ await nextTick();
+
+ expect(findContentWrapper().isVisible()).toBe(true);
+ expect(findExploreSkeleton().exists()).toBe(false);
+ });
});
- describe('error timeout', () => {
+ describe('error handling', () => {
it('shows the error dialog if content has not loaded within TIMEOUT_MS', async () => {
expect(findAlert().exists()).toBe(false);
jest.advanceTimersByTime(DEFAULT_TIMERS.TIMEOUT_MS);
@@ -86,6 +102,17 @@ describe('Skeleton component', () => {
expect(findContentWrapper().isVisible()).toBe(false);
});
+ it('shows the error dialog if content fails to load', async () => {
+ expect(findAlert().exists()).toBe(false);
+
+ wrapper.vm.onError();
+
+ await nextTick();
+
+ expect(findAlert().exists()).toBe(true);
+ expect(findContentWrapper().isVisible()).toBe(false);
+ });
+
it('does not show the error dialog if content has loaded within TIMEOUT_MS', async () => {
wrapper.vm.onContentLoaded();
jest.advanceTimersByTime(DEFAULT_TIMERS.TIMEOUT_MS);
@@ -105,6 +132,7 @@ describe('Skeleton component', () => {
${'explore'} | ${'variant is explore'} | ${SKELETON_VARIANTS[1]}
${'manage'} | ${'variant is manage'} | ${SKELETON_VARIANTS[2]}
${'embed'} | ${'variant is embed'} | ${SKELETON_VARIANT_EMBED}
+ ${'spinner'} | ${'variant is spinner'} | ${'spinner'}
${'default'} | ${'variant is not manage, dashboards or explore'} | ${'unknown'}
`('should render $skeletonType skeleton if $condition', async ({ skeletonType, variant }) => {
mountComponent({ variant });
@@ -120,6 +148,8 @@ describe('Skeleton component', () => {
expect(findEmbedSkeleton().exists()).toBe(skeletonType === SKELETON_VARIANT_EMBED);
expect(wrapper.findComponent(GlSkeletonLoader).exists()).toBe(showsDefaultSkeleton);
+
+ expect(wrapper.findComponent(GlLoadingIcon).exists()).toBe(variant === 'spinner');
});
});
diff --git a/spec/frontend/organizations/groups_and_projects/components/app_spec.js b/spec/frontend/organizations/groups_and_projects/components/app_spec.js
new file mode 100644
index 00000000000..24e1a26336c
--- /dev/null
+++ b/spec/frontend/organizations/groups_and_projects/components/app_spec.js
@@ -0,0 +1,99 @@
+import VueApollo from 'vue-apollo';
+import Vue from 'vue';
+import { GlLoadingIcon } from '@gitlab/ui';
+import App from '~/organizations/groups_and_projects/components/app.vue';
+import resolvers from '~/organizations/groups_and_projects/graphql/resolvers';
+import ProjectsList from '~/vue_shared/components/projects_list/projects_list.vue';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
+import { createAlert } from '~/alert';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import { organizationProjects } from './mock_data';
+
+jest.mock('~/alert');
+
+Vue.use(VueApollo);
+jest.useFakeTimers();
+
+describe('GroupsAndProjectsApp', () => {
+ let wrapper;
+ let mockApollo;
+
+ const createComponent = ({ mockResolvers = resolvers } = {}) => {
+ mockApollo = createMockApollo([], mockResolvers);
+
+ wrapper = shallowMountExtended(App, { apolloProvider: mockApollo });
+ };
+
+ afterEach(() => {
+ mockApollo = null;
+ });
+
+ describe('when API call is loading', () => {
+ beforeEach(() => {
+ const mockResolvers = {
+ Query: {
+ organization: jest.fn().mockReturnValueOnce(new Promise(() => {})),
+ },
+ };
+
+ createComponent({ mockResolvers });
+ });
+
+ it('renders loading icon', () => {
+ expect(wrapper.findComponent(GlLoadingIcon).exists()).toBe(true);
+ });
+ });
+
+ describe('when API call is successful', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders `ProjectsList` component and passes correct props', async () => {
+ jest.runAllTimers();
+ await waitForPromises();
+
+ expect(wrapper.findComponent(ProjectsList).props()).toEqual({
+ projects: organizationProjects.projects.nodes.map(
+ ({ id, nameWithNamespace, accessLevel, ...project }) => ({
+ ...project,
+ id: getIdFromGraphQLId(id),
+ name: nameWithNamespace,
+ permissions: {
+ projectAccess: {
+ accessLevel: accessLevel.integerValue,
+ },
+ },
+ }),
+ ),
+ showProjectIcon: true,
+ });
+ });
+ });
+
+ describe('when API call is not successful', () => {
+ const error = new Error();
+
+ beforeEach(() => {
+ const mockResolvers = {
+ Query: {
+ organization: jest.fn().mockRejectedValueOnce(error),
+ },
+ };
+
+ createComponent({ mockResolvers });
+ });
+
+ it('displays error alert', async () => {
+ await waitForPromises();
+
+ expect(createAlert).toHaveBeenCalledWith({
+ message: App.i18n.errorMessage,
+ error,
+ captureError: true,
+ });
+ });
+ });
+});
diff --git a/spec/frontend/organizations/groups_and_projects/components/mock_data.js b/spec/frontend/organizations/groups_and_projects/components/mock_data.js
new file mode 100644
index 00000000000..c3276450745
--- /dev/null
+++ b/spec/frontend/organizations/groups_and_projects/components/mock_data.js
@@ -0,0 +1,98 @@
+export const organizationProjects = {
+ id: 'gid://gitlab/Organization/1',
+ __typename: 'Organization',
+ projects: {
+ nodes: [
+ {
+ id: 'gid://gitlab/Project/8',
+ nameWithNamespace: 'Twitter / Typeahead.Js',
+ webUrl: 'http://127.0.0.1:3000/twitter/Typeahead.Js',
+ topics: ['JavaScript', 'Vue.js'],
+ forksCount: 4,
+ avatarUrl: null,
+ starCount: 0,
+ visibility: 'public',
+ openIssuesCount: 48,
+ descriptionHtml:
+ '<p data-sourcepos="1:1-1:59" dir="auto">Optio et reprehenderit enim doloremque deserunt et commodi.</p>',
+ issuesAccessLevel: 'enabled',
+ forkingAccessLevel: 'enabled',
+ accessLevel: {
+ integerValue: 30,
+ },
+ },
+ {
+ id: 'gid://gitlab/Project/7',
+ nameWithNamespace: 'Flightjs / Flight',
+ webUrl: 'http://127.0.0.1:3000/flightjs/Flight',
+ topics: [],
+ forksCount: 0,
+ avatarUrl: null,
+ starCount: 0,
+ visibility: 'private',
+ openIssuesCount: 37,
+ descriptionHtml:
+ '<p data-sourcepos="1:1-1:49" dir="auto">Dolor dicta rerum et ut eius voluptate earum qui.</p>',
+ issuesAccessLevel: 'enabled',
+ forkingAccessLevel: 'enabled',
+ accessLevel: {
+ integerValue: 20,
+ },
+ },
+ {
+ id: 'gid://gitlab/Project/6',
+ nameWithNamespace: 'Jashkenas / Underscore',
+ webUrl: 'http://127.0.0.1:3000/jashkenas/Underscore',
+ topics: [],
+ forksCount: 0,
+ avatarUrl: null,
+ starCount: 0,
+ visibility: 'private',
+ openIssuesCount: 34,
+ descriptionHtml:
+ '<p data-sourcepos="1:1-1:52" dir="auto">Incidunt est aliquam autem nihil eveniet quis autem.</p>',
+ issuesAccessLevel: 'enabled',
+ forkingAccessLevel: 'enabled',
+ accessLevel: {
+ integerValue: 40,
+ },
+ },
+ {
+ id: 'gid://gitlab/Project/5',
+ nameWithNamespace: 'Commit451 / Lab Coat',
+ webUrl: 'http://127.0.0.1:3000/Commit451/lab-coat',
+ topics: [],
+ forksCount: 0,
+ avatarUrl: null,
+ starCount: 0,
+ visibility: 'internal',
+ openIssuesCount: 49,
+ descriptionHtml:
+ '<p data-sourcepos="1:1-1:34" dir="auto">Sint eos dolorem impedit rerum et.</p>',
+ issuesAccessLevel: 'enabled',
+ forkingAccessLevel: 'enabled',
+ accessLevel: {
+ integerValue: 10,
+ },
+ },
+ {
+ id: 'gid://gitlab/Project/1',
+ nameWithNamespace: 'Toolbox / Gitlab Smoke Tests',
+ webUrl: 'http://127.0.0.1:3000/toolbox/gitlab-smoke-tests',
+ topics: [],
+ forksCount: 0,
+ avatarUrl: null,
+ starCount: 0,
+ visibility: 'internal',
+ openIssuesCount: 34,
+ descriptionHtml:
+ '<p data-sourcepos="1:1-1:40" dir="auto">Veritatis error laboriosam libero autem.</p>',
+ issuesAccessLevel: 'enabled',
+ forkingAccessLevel: 'enabled',
+ accessLevel: {
+ integerValue: 30,
+ },
+ },
+ ],
+ },
+};
diff --git a/spec/frontend/packages_and_registries/container_registry/explorer/components/details_page/tags_list_row_spec.js b/spec/frontend/packages_and_registries/container_registry/explorer/components/details_page/tags_list_row_spec.js
index f74dfcb029d..d4b69d3e8e8 100644
--- a/spec/frontend/packages_and_registries/container_registry/explorer/components/details_page/tags_list_row_spec.js
+++ b/spec/frontend/packages_and_registries/container_registry/explorer/components/details_page/tags_list_row_spec.js
@@ -1,5 +1,11 @@
-import { GlFormCheckbox, GlSprintf, GlIcon, GlDropdown, GlDropdownItem } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
+import {
+ GlFormCheckbox,
+ GlSprintf,
+ GlIcon,
+ GlDisclosureDropdown,
+ GlDisclosureDropdownItem,
+} from '@gitlab/ui';
+import { shallowMount, mount } from '@vue/test-utils';
import { nextTick } from 'vue';
import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
@@ -37,16 +43,17 @@ describe('tags list row', () => {
const findManifestDetail = () => wrapper.find('[data-testid="manifest-detail"]');
const findConfigurationDetail = () => wrapper.find('[data-testid="configuration-detail"]');
const findWarningIcon = () => wrapper.findComponent(GlIcon);
- const findAdditionalActionsMenu = () => wrapper.findComponent(GlDropdown);
- const findDeleteButton = () => wrapper.findComponent(GlDropdownItem);
+ const findAdditionalActionsMenu = () => wrapper.findComponent(GlDisclosureDropdown);
+ const findDeleteButton = () => wrapper.findComponent(GlDisclosureDropdownItem);
- const mountComponent = (propsData = defaultProps) => {
- wrapper = shallowMount(component, {
+ const mountComponent = (propsData = defaultProps, mountFn = shallowMount) => {
+ wrapper = mountFn(component, {
stubs: {
GlSprintf,
ListItem,
DetailsRow,
- GlDropdown,
+ GlDisclosureDropdown,
+ GlDisclosureDropdownItem,
},
propsData,
directives: {
@@ -274,10 +281,10 @@ describe('tags list row', () => {
expect(findAdditionalActionsMenu().props()).toMatchObject({
icon: 'ellipsis_v',
- text: 'More actions',
+ toggleText: 'More actions',
textSrOnly: true,
category: 'tertiary',
- right: true,
+ placement: 'right',
disabled: false,
});
});
@@ -308,16 +315,19 @@ describe('tags list row', () => {
mountComponent();
expect(findDeleteButton().exists()).toBe(true);
- expect(findDeleteButton().attributes()).toMatchObject({
- variant: 'danger',
+ expect(findDeleteButton().props('item').extraAttrs).toMatchObject({
+ class: 'gl-text-red-500!',
+ 'data-testid': 'single-delete-button',
+ 'data-qa-selector': 'tag_delete_button',
});
+
expect(findDeleteButton().text()).toBe(REMOVE_TAG_BUTTON_TITLE);
});
it('delete event emits delete', () => {
- mountComponent();
+ mountComponent(undefined, mount);
- findDeleteButton().vm.$emit('click');
+ wrapper.find('[data-testid="single-delete-button"]').trigger('click');
expect(wrapper.emitted('delete')).toEqual([[]]);
});
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 1928dbf72b6..f590cff0312 100644
--- a/spec/frontend/packages_and_registries/dependency_proxy/app_spec.js
+++ b/spec/frontend/packages_and_registries/dependency_proxy/app_spec.js
@@ -6,7 +6,7 @@ import {
GlFormGroup,
GlModal,
GlSprintf,
- GlEmptyState,
+ GlSkeletonLoader,
} from '@gitlab/ui';
import Vue, { nextTick } from 'vue';
import VueApollo from 'vue-apollo';
@@ -78,7 +78,7 @@ describe('DependencyProxyApp', () => {
const findFormInputGroup = () => wrapper.findComponent(GlFormInputGroup);
const findProxyCountText = () => wrapper.findByTestId('proxy-count');
const findManifestList = () => wrapper.findComponent(ManifestsList);
- const findEmptyState = () => wrapper.findComponent(GlEmptyState);
+ const findLoader = () => wrapper.findComponent(GlSkeletonLoader);
const findClearCacheDropdownList = () => wrapper.findComponent(GlDropdown);
const findClearCacheModal = () => wrapper.findComponent(GlModal);
const findClearCacheAlert = () => wrapper.findComponent(GlAlert);
@@ -102,9 +102,16 @@ describe('DependencyProxyApp', () => {
describe('when the dependency proxy is available', () => {
describe('when is loading', () => {
- it('does not render a form group with label', () => {
+ beforeEach(() => {
createComponent();
+ });
+
+ it('renders loading component & sets loading prop', () => {
+ expect(findLoader().exists()).toBe(true);
+ expect(findManifestList().props('loading')).toBe(true);
+ });
+ it('does not render a form group with label', () => {
expect(findFormGroup().exists()).toBe(false);
});
});
@@ -120,11 +127,15 @@ describe('DependencyProxyApp', () => {
expect(findFormGroup().attributes('label')).toBe(
DependencyProxyApp.i18n.proxyImagePrefix,
);
+ expect(findFormGroup().attributes('labelfor')).toBe('proxy-url');
});
it('renders a form input group', () => {
expect(findFormInputGroup().exists()).toBe(true);
+ expect(findFormInputGroup().attributes('id')).toBe('proxy-url');
expect(findFormInputGroup().props('value')).toBe(proxyData().dependencyProxyImagePrefix);
+ expect(findFormInputGroup().attributes('readonly')).toBeDefined();
+ expect(findFormInputGroup().props('selectOnClick')).toBe(true);
});
it('form input group has a clipboard button', () => {
@@ -175,23 +186,12 @@ describe('DependencyProxyApp', () => {
return waitForPromises();
});
- it('shows the empty state message', () => {
- expect(findEmptyState().props()).toMatchObject({
- svgPath: provideDefaults.noManifestsIllustration,
- title: DependencyProxyApp.i18n.noManifestTitle,
- });
- });
-
- it('hides the list', () => {
- expect(findManifestList().exists()).toBe(false);
+ it('renders the list', () => {
+ expect(findManifestList().exists()).toBe(true);
});
});
describe('when there are manifests', () => {
- it('hides the empty state message', () => {
- expect(findEmptyState().exists()).toBe(false);
- });
-
it('shows list', () => {
expect(findManifestList().props()).toMatchObject({
dependencyProxyImagePrefix: proxyData().dependencyProxyImagePrefix,
@@ -200,26 +200,58 @@ describe('DependencyProxyApp', () => {
});
});
- it('prev-page event on list fetches the previous page', async () => {
- findManifestList().vm.$emit('prev-page');
- await waitForPromises();
+ describe('prev-page event on list', () => {
+ beforeEach(() => {
+ findManifestList().vm.$emit('prev-page');
+ });
+
+ describe('while loading', () => {
+ it('does not render loading component & sets loading prop', () => {
+ expect(findLoader().exists()).toBe(false);
+ expect(findManifestList().props('loading')).toBe(true);
+ });
- expect(resolver).toHaveBeenCalledWith({
- before: pagination().startCursor,
- first: null,
- fullPath: provideDefaults.groupPath,
- last: GRAPHQL_PAGE_SIZE,
+ it('renders form group with label', () => {
+ expect(findFormGroup().exists()).toBe(true);
+ });
+ });
+
+ it('list fetches the previous page', async () => {
+ await waitForPromises();
+
+ expect(resolver).toHaveBeenCalledWith({
+ before: pagination().startCursor,
+ first: null,
+ fullPath: provideDefaults.groupPath,
+ last: GRAPHQL_PAGE_SIZE,
+ });
});
});
- it('next-page event on list fetches the next page', async () => {
- findManifestList().vm.$emit('next-page');
- await waitForPromises();
+ describe('next-page event on list', () => {
+ beforeEach(() => {
+ findManifestList().vm.$emit('next-page');
+ });
- expect(resolver).toHaveBeenCalledWith({
- after: pagination().endCursor,
- first: GRAPHQL_PAGE_SIZE,
- fullPath: provideDefaults.groupPath,
+ describe('while loading', () => {
+ it('does not render loading component & sets loading prop', () => {
+ expect(findLoader().exists()).toBe(false);
+ expect(findManifestList().props('loading')).toBe(true);
+ });
+
+ it('renders form group with label', () => {
+ expect(findFormGroup().exists()).toBe(true);
+ });
+ });
+
+ it('fetches the next page', async () => {
+ await waitForPromises();
+
+ expect(resolver).toHaveBeenCalledWith({
+ after: pagination().endCursor,
+ first: GRAPHQL_PAGE_SIZE,
+ fullPath: provideDefaults.groupPath,
+ });
});
});
diff --git a/spec/frontend/packages_and_registries/dependency_proxy/components/manifest_list_spec.js b/spec/frontend/packages_and_registries/dependency_proxy/components/manifest_list_spec.js
index 4149f728cd8..8f445843aa8 100644
--- a/spec/frontend/packages_and_registries/dependency_proxy/components/manifest_list_spec.js
+++ b/spec/frontend/packages_and_registries/dependency_proxy/components/manifest_list_spec.js
@@ -1,6 +1,7 @@
import { GlKeysetPagination, GlSkeletonLoader } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import ManifestRow from '~/packages_and_registries/dependency_proxy/components/manifest_row.vue';
+import ManifestsEmptyState from '~/packages_and_registries/dependency_proxy/components/manifests_empty_state.vue';
import Component from '~/packages_and_registries/dependency_proxy/components/manifests_list.vue';
import {
proxyData,
@@ -24,6 +25,7 @@ describe('Manifests List', () => {
});
};
+ const findEmptyState = () => wrapper.findComponent(ManifestsEmptyState);
const findRows = () => wrapper.findAllComponents(ManifestRow);
const findPagination = () => wrapper.findComponent(GlKeysetPagination);
const findMainArea = () => wrapper.findByTestId('main-area');
@@ -38,7 +40,13 @@ describe('Manifests List', () => {
it('shows a row for every manifest', () => {
createComponent();
- expect(findRows().length).toBe(defaultProps.manifests.length);
+ expect(findRows()).toHaveLength(defaultProps.manifests.length);
+ });
+
+ it('does not show the empty state component', () => {
+ createComponent();
+
+ expect(findEmptyState().exists()).toBe(false);
});
it('binds a manifest to each row', () => {
@@ -68,6 +76,20 @@ describe('Manifests List', () => {
});
});
+ describe('when there are no manifests', () => {
+ beforeEach(() => {
+ createComponent({ ...defaultProps, manifests: [], pagination: {} });
+ });
+
+ it('shows the empty state component', () => {
+ expect(findEmptyState().exists()).toBe(true);
+ });
+
+ it('hides the list', () => {
+ expect(findRows()).toHaveLength(0);
+ });
+ });
+
describe('pagination', () => {
it('is hidden when there is no next or prev pages', () => {
createComponent({ ...defaultProps, pagination: {} });
diff --git a/spec/frontend/packages_and_registries/dependency_proxy/components/manifests_empty_state_spec.js b/spec/frontend/packages_and_registries/dependency_proxy/components/manifests_empty_state_spec.js
new file mode 100644
index 00000000000..00c1469994b
--- /dev/null
+++ b/spec/frontend/packages_and_registries/dependency_proxy/components/manifests_empty_state_spec.js
@@ -0,0 +1,81 @@
+import { GlEmptyState, GlFormGroup, GlFormInputGroup, GlLink, GlSprintf } from '@gitlab/ui';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import ManifestsEmptyState from '~/packages_and_registries/dependency_proxy/components/manifests_empty_state.vue';
+import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
+
+describe('manifests empty state', () => {
+ let wrapper;
+
+ const provideDefaults = {
+ noManifestsIllustration: 'noManifestsIllustration',
+ };
+
+ const createComponent = ({ stubs = {} } = {}) => {
+ wrapper = shallowMountExtended(ManifestsEmptyState, {
+ provide: provideDefaults,
+ stubs: {
+ GlEmptyState,
+ GlFormInputGroup,
+ ...stubs,
+ },
+ });
+ };
+
+ const findDocsLink = () => wrapper.findComponent(GlLink);
+ const findEmptyTextDescription = () => wrapper.findAllComponents(GlSprintf).at(0);
+ const findDocumentationTextDescription = () => wrapper.findAllComponents(GlSprintf).at(1);
+ const findClipBoardButton = () => wrapper.findComponent(ClipboardButton);
+ const findFormGroup = () => wrapper.findComponent(GlFormGroup);
+ const findFormInputGroup = () => wrapper.findComponent(GlFormInputGroup);
+ const findEmptyState = () => wrapper.findComponent(GlEmptyState);
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('shows the empty state message', () => {
+ expect(findEmptyState().props()).toMatchObject({
+ svgPath: provideDefaults.noManifestsIllustration,
+ title: ManifestsEmptyState.i18n.noManifestTitle,
+ });
+ });
+
+ it('renders correct description', () => {
+ expect(findEmptyTextDescription().attributes('message')).toBe(
+ ManifestsEmptyState.i18n.emptyText,
+ );
+ expect(findDocumentationTextDescription().attributes('message')).toBe(
+ ManifestsEmptyState.i18n.documentationText,
+ );
+ });
+
+ it('renders a form group with a label', () => {
+ expect(findFormGroup().attributes('label')).toBe(ManifestsEmptyState.i18n.codeExampleLabel);
+ expect(findFormGroup().attributes('label-sr-only')).toBeDefined();
+ expect(findFormGroup().attributes('label-for')).toBe('code-example');
+ });
+
+ it('renders a form input group', () => {
+ expect(findFormInputGroup().exists()).toBe(true);
+ expect(findFormInputGroup().attributes('id')).toBe('code-example');
+ expect(findFormInputGroup().props('value')).toBe(ManifestsEmptyState.codeExample);
+ expect(findFormInputGroup().attributes('readonly')).toBeDefined();
+ expect(findFormInputGroup().props('selectOnClick')).toBe(true);
+ });
+
+ it('form input group has a clipboard button', () => {
+ expect(findClipBoardButton().exists()).toBe(true);
+ expect(findClipBoardButton().props()).toMatchObject({
+ text: ManifestsEmptyState.codeExample,
+ title: ManifestsEmptyState.i18n.copyExample,
+ });
+ });
+
+ it('shows link to docs', () => {
+ createComponent({ stubs: { GlSprintf } });
+
+ expect(findDocsLink().attributes('href')).toBe(
+ ManifestsEmptyState.links.DEPENDENCY_PROXY_HELP_PAGE_PATH,
+ );
+ });
+});
diff --git a/spec/frontend/packages_and_registries/package_registry/components/details/package_files_spec.js b/spec/frontend/packages_and_registries/package_registry/components/details/package_files_spec.js
index 2b60684e60a..2c712feac86 100644
--- a/spec/frontend/packages_and_registries/package_registry/components/details/package_files_spec.js
+++ b/spec/frontend/packages_and_registries/package_registry/components/details/package_files_spec.js
@@ -1,4 +1,12 @@
-import { GlAlert, GlDropdown, GlButton, GlFormCheckbox, GlLoadingIcon, GlModal } from '@gitlab/ui';
+import {
+ GlAlert,
+ GlDisclosureDropdown,
+ GlFormCheckbox,
+ GlLoadingIcon,
+ GlModal,
+ GlKeysetPagination,
+} from '@gitlab/ui';
+import * as Sentry from '@sentry/browser';
import Vue, { nextTick } from 'vue';
import VueApollo from 'vue-apollo';
import { stubComponent } from 'helpers/stub_component';
@@ -13,6 +21,7 @@ import {
packageFilesQuery,
packageDestroyFilesMutation,
packageDestroyFilesMutationError,
+ pagination,
} from 'jest/packages_and_registries/package_registry/mock_data';
import {
DOWNLOAD_PACKAGE_ASSET_TRACKING_ACTION,
@@ -22,16 +31,22 @@ import {
DELETE_PACKAGE_FILE_ERROR_MESSAGE,
DELETE_PACKAGE_FILES_SUCCESS_MESSAGE,
DELETE_PACKAGE_FILES_ERROR_MESSAGE,
+ GRAPHQL_PACKAGE_FILES_PAGE_SIZE,
} from '~/packages_and_registries/package_registry/constants';
+import { NEXT, PREV } from '~/vue_shared/components/pagination/constants';
import PackageFiles from '~/packages_and_registries/package_registry/components/details/package_files.vue';
import FileIcon from '~/vue_shared/components/file_icon.vue';
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
-
+import { scrollToElement } from '~/lib/utils/common_utils';
import getPackageFiles from '~/packages_and_registries/package_registry/graphql/queries/get_package_files.query.graphql';
import destroyPackageFilesMutation from '~/packages_and_registries/package_registry/graphql/mutations/destroy_package_files.mutation.graphql';
Vue.use(VueApollo);
jest.mock('~/alert');
+jest.mock('~/lib/utils/common_utils', () => ({
+ ...jest.requireActual('~/lib/utils/common_utils'),
+ scrollToElement: jest.fn(),
+}));
describe('Package Files', () => {
let wrapper;
@@ -43,13 +58,15 @@ describe('Package Files', () => {
const findFirstRow = () => extendedWrapper(findAllRows().at(0));
const findSecondRow = () => extendedWrapper(findAllRows().at(1));
const findPackageFilesAlert = () => wrapper.findComponent(GlAlert);
+ const findPagination = () => wrapper.findComponent(GlKeysetPagination);
const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
const findFirstRowDownloadLink = () => findFirstRow().findByTestId('download-link');
const findFirstRowFileIcon = () => findFirstRow().findComponent(FileIcon);
const findFirstRowCreatedAt = () => findFirstRow().findComponent(TimeAgoTooltip);
- const findFirstActionMenu = () => extendedWrapper(findFirstRow().findComponent(GlDropdown));
+ const findFirstActionMenu = () =>
+ extendedWrapper(findFirstRow().findComponent(GlDisclosureDropdown));
const findActionMenuDelete = () => findFirstActionMenu().findByTestId('delete-file');
- const findFirstToggleDetailsButton = () => findFirstRow().findComponent(GlButton);
+ const findFirstToggleDetailsButton = () => findFirstRow().findByTestId('toggle-details-button');
const findFirstRowShaComponent = (id) => wrapper.findByTestId(id);
const findCheckAllCheckbox = () => wrapper.findByTestId('package-files-checkbox-all');
const findAllRowCheckboxes = () => wrapper.findAllByTestId('package-files-checkbox');
@@ -68,6 +85,7 @@ describe('Package Files', () => {
stubs,
resolver = jest.fn().mockResolvedValue(packageFilesQuery({ files: [file] })),
filesDeleteMutationResolver = jest.fn().mockResolvedValue(packageDestroyFilesMutation()),
+ options = {},
} = {}) => {
const requestHandlers = [
[getPackageFiles, resolver],
@@ -92,9 +110,14 @@ describe('Package Files', () => {
}),
...stubs,
},
+ ...options,
});
};
+ beforeEach(() => {
+ jest.spyOn(Sentry, 'captureException').mockImplementation();
+ });
+
describe('rows', () => {
it('do not get rendered when query is loading', () => {
createComponent();
@@ -123,6 +146,7 @@ describe('Package Files', () => {
await waitForPromises();
expect(findPackageFilesAlert().exists()).toBe(false);
+ expect(Sentry.captureException).not.toHaveBeenCalled();
});
it('renders gl-alert if load fails', async () => {
@@ -133,6 +157,40 @@ describe('Package Files', () => {
expect(findPackageFilesAlert().text()).toBe(
s__('PackageRegistry|Something went wrong while fetching package assets.'),
);
+ expect(Sentry.captureException).toHaveBeenCalled();
+ });
+
+ it('renders pagination', async () => {
+ createComponent({ resolver: jest.fn().mockResolvedValue(packageFilesQuery()) });
+ await waitForPromises();
+
+ const { endCursor, startCursor, hasNextPage, hasPreviousPage } = pagination();
+
+ expect(findPagination().props()).toMatchObject({
+ endCursor,
+ startCursor,
+ hasNextPage,
+ hasPreviousPage,
+ prevText: PREV,
+ nextText: NEXT,
+ disabled: false,
+ });
+ });
+
+ it('hides pagination when only one page', async () => {
+ createComponent({
+ resolver: jest.fn().mockResolvedValue(
+ packageFilesQuery({
+ extendPagination: {
+ hasNextPage: false,
+ hasPreviousPage: false,
+ },
+ }),
+ ),
+ });
+ await waitForPromises();
+
+ expect(findPagination().exists()).toBe(false);
});
});
@@ -204,7 +262,7 @@ describe('Package Files', () => {
expect(findFirstActionMenu().exists()).toBe(true);
expect(findFirstActionMenu().props('icon')).toBe('ellipsis_v');
expect(findFirstActionMenu().props('textSrOnly')).toBe(true);
- expect(findFirstActionMenu().props('text')).toMatchInterpolatedText('More actions');
+ expect(findFirstActionMenu().props('toggleText')).toMatchInterpolatedText('More actions');
});
describe('menu items', () => {
@@ -214,7 +272,7 @@ describe('Package Files', () => {
});
it('shows delete file confirmation modal', async () => {
- await findActionMenuDelete().trigger('click');
+ await findActionMenuDelete().vm.$emit('action');
expect(showMock).toHaveBeenCalledTimes(1);
@@ -354,7 +412,7 @@ describe('Package Files', () => {
resolver: jest.fn().mockResolvedValue(
packageFilesQuery({
files: [file],
- pageInfo: {
+ extendPagination: {
hasNextPage: false,
},
}),
@@ -379,7 +437,7 @@ describe('Package Files', () => {
createComponent({
resolver: jest.fn().mockResolvedValue(
packageFilesQuery({
- pageInfo: {
+ extendPagination: {
hasNextPage: false,
},
}),
@@ -421,6 +479,69 @@ describe('Package Files', () => {
});
});
+ describe('when user interacts with pagination', () => {
+ const resolver = jest.fn().mockResolvedValue(packageFilesQuery());
+
+ beforeEach(async () => {
+ createComponent({ resolver, options: { attachTo: document.body } });
+ await waitForPromises();
+ });
+
+ describe('when list emits next event', () => {
+ beforeEach(() => {
+ findPagination().vm.$emit('next');
+ });
+
+ it('fetches the next set of files', () => {
+ expect(resolver).toHaveBeenLastCalledWith(
+ expect.objectContaining({
+ after: pagination().endCursor,
+ first: GRAPHQL_PACKAGE_FILES_PAGE_SIZE,
+ }),
+ );
+ });
+
+ it('scrolls to top of package files component', async () => {
+ await waitForPromises();
+
+ expect(scrollToElement).toHaveBeenCalledWith(wrapper.vm.$el);
+ });
+
+ it('first row is the active element', async () => {
+ await waitForPromises();
+
+ expect(findFirstRow().element).toBe(document.activeElement);
+ });
+ });
+
+ describe('when list emits prev event', () => {
+ beforeEach(() => {
+ findPagination().vm.$emit('prev');
+ });
+
+ it('fetches the previous set of files', () => {
+ expect(resolver).toHaveBeenLastCalledWith(
+ expect.objectContaining({
+ before: pagination().startCursor,
+ last: GRAPHQL_PACKAGE_FILES_PAGE_SIZE,
+ }),
+ );
+ });
+
+ it('scrolls to top of package files component', async () => {
+ await waitForPromises();
+
+ expect(scrollToElement).toHaveBeenCalledWith(wrapper.vm.$el);
+ });
+
+ it('first row is the active element', async () => {
+ await waitForPromises();
+
+ expect(findFirstRow().element).toBe(document.activeElement);
+ });
+ });
+ });
+
describe('deleting a file', () => {
const doDeleteFile = async () => {
const first = findAllRowCheckboxes().at(0);
@@ -442,6 +563,7 @@ describe('Package Files', () => {
await nextTick();
expect(findLoadingIcon().exists()).toBe(true);
+ expect(findPagination().props('disabled')).toBe(true);
});
it('confirming on the modal deletes the file and shows a success message', async () => {
@@ -474,7 +596,7 @@ describe('Package Files', () => {
expect(resolver).toHaveBeenCalledTimes(2);
expect(resolver).toHaveBeenCalledWith({
id: '1',
- first: 100,
+ first: GRAPHQL_PACKAGE_FILES_PAGE_SIZE,
});
});
@@ -534,6 +656,7 @@ describe('Package Files', () => {
await nextTick();
expect(findLoadingIcon().exists()).toBe(true);
+ expect(findPagination().props('disabled')).toBe(true);
});
it('confirming on the modal deletes the file and shows a success message', async () => {
@@ -566,7 +689,7 @@ describe('Package Files', () => {
expect(resolver).toHaveBeenCalledTimes(2);
expect(resolver).toHaveBeenCalledWith({
id: '1',
- first: 100,
+ first: GRAPHQL_PACKAGE_FILES_PAGE_SIZE,
});
});
diff --git a/spec/frontend/packages_and_registries/package_registry/components/details/version_row_spec.js b/spec/frontend/packages_and_registries/package_registry/components/details/version_row_spec.js
index f7c8e909ff6..bc7203f73c9 100644
--- a/spec/frontend/packages_and_registries/package_registry/components/details/version_row_spec.js
+++ b/spec/frontend/packages_and_registries/package_registry/components/details/version_row_spec.js
@@ -1,5 +1,13 @@
-import { GlDropdownItem, GlFormCheckbox, GlIcon, GlLink, GlSprintf, GlTruncate } from '@gitlab/ui';
-import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import {
+ GlDisclosureDropdown,
+ GlDisclosureDropdownItem,
+ GlFormCheckbox,
+ GlIcon,
+ GlLink,
+ GlSprintf,
+ GlTruncate,
+} from '@gitlab/ui';
+import { mountExtended, shallowMountExtended } from 'helpers/vue_test_utils_helper';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import ListItem from '~/vue_shared/components/registry/list_item.vue';
import PackageTags from '~/packages_and_registries/shared/components/package_tags.vue';
@@ -24,10 +32,16 @@ describe('VersionRow', () => {
const findPackageName = () => wrapper.findComponent(GlTruncate);
const findWarningIcon = () => wrapper.findComponent(GlIcon);
const findBulkDeleteAction = () => wrapper.findComponent(GlFormCheckbox);
- const findDeleteDropdownItem = () => wrapper.findComponent(GlDropdownItem);
+ const findDeleteDropdownItem = () => wrapper.findComponent(GlDisclosureDropdownItem);
- function createComponent({ packageEntity = packageVersion, selected = false } = {}) {
- wrapper = shallowMountExtended(VersionRow, {
+ function createComponent(options = {}) {
+ const {
+ mountFn = shallowMountExtended,
+ packageEntity = packageVersion,
+ selected = false,
+ } = options;
+
+ wrapper = mountFn(VersionRow, {
propsData: {
packageEntity,
selected,
@@ -35,6 +49,7 @@ describe('VersionRow', () => {
stubs: {
GlSprintf,
GlTruncate,
+ GlDisclosureDropdown,
},
directives: {
GlTooltip: createMockDirective('gl-tooltip'),
@@ -100,9 +115,7 @@ describe('VersionRow', () => {
});
it('renders checkbox in selected state if selected', () => {
- createComponent({
- selected: true,
- });
+ createComponent({ selected: true });
expect(findBulkDeleteAction().attributes('checked')).toBe('true');
expect(findListItem().props('selected')).toBe(true);
@@ -116,19 +129,16 @@ describe('VersionRow', () => {
expect(findDeleteDropdownItem().exists()).toBe(false);
});
- it('exists and has the correct props', () => {
+ it('exists', () => {
createComponent();
expect(findDeleteDropdownItem().exists()).toBe(true);
- expect(findDeleteDropdownItem().attributes()).toMatchObject({
- variant: 'danger',
- });
});
- it('emits the delete event when the delete button is clicked', () => {
- createComponent();
+ it('emits the delete event when the delete button is clicked', async () => {
+ createComponent({ mountFn: mountExtended });
- findDeleteDropdownItem().vm.$emit('click');
+ await findDeleteDropdownItem().find('button').trigger('click');
expect(wrapper.emitted('delete')).toHaveLength(1);
});
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 c647230bc5f..0443fb85dc9 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
@@ -64,16 +64,12 @@ exports[`packages_list_row renders 1`] = `
withtooltip="true"
/>
- <!---->
-
<span
class="gl-ml-2"
data-testid="package-type"
>
· npm
</span>
-
- <!---->
</div>
</div>
</div>
@@ -91,15 +87,16 @@ exports[`packages_list_row renders 1`] = `
class="gl-display-flex gl-align-items-center gl-min-h-6"
>
<span
- data-testid="created-date"
+ data-testid="right-secondary"
>
- Created
- <timeago-tooltip-stub
- cssclass=""
- datetimeformat="DATE_WITH_TIME_FORMAT"
- time="2020-08-17T14:23:32Z"
- tooltipplacement="top"
- />
+ Published
+ <time
+ class=""
+ datetime="2020-05-17T14:23:32Z"
+ title="May 17, 2020 2:23pm UTC"
+ >
+ 1 month ago
+ </time>
</span>
</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 81ad47b1e13..523d5f855fc 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
@@ -5,9 +5,7 @@ import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
-
import PackagesListRow from '~/packages_and_registries/package_registry/components/list/package_list_row.vue';
-import PackagePath from '~/packages_and_registries/shared/components/package_path.vue';
import PackageTags from '~/packages_and_registries/shared/components/package_tags.vue';
import PublishMethod from '~/packages_and_registries/package_registry/components/list/publish_method.vue';
import TimeagoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
@@ -29,14 +27,13 @@ describe('packages_list_row', () => {
const defaultProvide = {
isGroupPage: false,
+ canDeletePackages: true,
};
const packageWithoutTags = { ...packageData(), project: packageProject(), ...linksData };
const packageWithTags = { ...packageWithoutTags, tags: { nodes: packageTags() } };
- const packageCannotDestroy = { ...packageData(), ...linksData, canDestroy: false };
const findPackageTags = () => wrapper.findComponent(PackageTags);
- const findPackagePath = () => wrapper.findComponent(PackagePath);
const findDeleteDropdown = () => wrapper.findByTestId('action-delete');
const findPackageType = () => wrapper.findByTestId('package-type');
const findPackageLink = () => wrapper.findByTestId('details-link');
@@ -44,8 +41,7 @@ describe('packages_list_row', () => {
const findLeftSecondaryInfos = () => wrapper.findByTestId('left-secondary-infos');
const findPackageVersion = () => findLeftSecondaryInfos().findComponent(GlTruncate);
const findPublishMethod = () => wrapper.findComponent(PublishMethod);
- const findCreatedDateText = () => wrapper.findByTestId('created-date');
- const findTimeAgoTooltip = () => wrapper.findComponent(TimeagoTooltip);
+ const findRightSecondary = () => wrapper.findByTestId('right-secondary');
const findListItem = () => wrapper.findComponent(ListItem);
const findBulkDeleteAction = () => wrapper.findComponent(GlFormCheckbox);
const findPackageName = () => wrapper.findComponent(GlTruncate);
@@ -60,6 +56,7 @@ describe('packages_list_row', () => {
stubs: {
ListItem,
GlSprintf,
+ TimeagoTooltip,
},
propsData: {
packageEntity,
@@ -106,18 +103,11 @@ describe('packages_list_row', () => {
});
});
- describe('when it is group', () => {
- it('has a package path component', () => {
- mountComponent({ provide: { isGroupPage: true } });
-
- expect(findPackagePath().exists()).toBe(true);
- expect(findPackagePath().props()).toMatchObject({ path: 'gitlab-org/gitlab-test' });
- });
- });
-
describe('delete button', () => {
it('does not exist when package cannot be destroyed', () => {
- mountComponent({ packageEntity: packageCannotDestroy });
+ mountComponent({
+ packageEntity: { ...packageWithoutTags, canDestroy: false },
+ });
expect(findDeleteDropdown().exists()).toBe(false);
});
@@ -180,7 +170,10 @@ describe('packages_list_row', () => {
describe('left action template', () => {
it('does not render checkbox if not permitted', () => {
mountComponent({
- packageEntity: { ...packageWithoutTags, canDestroy: false },
+ provide: {
+ ...defaultProvide,
+ canDeletePackages: false,
+ },
});
expect(findBulkDeleteAction().exists()).toBe(false);
@@ -223,14 +216,6 @@ describe('packages_list_row', () => {
});
});
- it('if the pipeline exists show the author message', () => {
- mountComponent({
- packageEntity: { ...packageWithoutTags, pipelines: { nodes: packagePipelines() } },
- });
-
- expect(findLeftSecondaryInfos().text()).toContain('published by Administrator');
- });
-
it('has package type with middot', () => {
mountComponent();
@@ -247,13 +232,50 @@ describe('packages_list_row', () => {
expect(findPublishMethod().props('pipeline')).toEqual(packagePipelines()[0]);
});
- it('has the created date', () => {
- mountComponent();
+ it('if the package is published through CI show the author name', () => {
+ mountComponent({
+ packageEntity: { ...packageWithoutTags, pipelines: { nodes: packagePipelines() } },
+ });
+
+ expect(findRightSecondary().text()).toBe(`Published by Administrator, 1 month ago`);
+ });
- expect(findCreatedDateText().text()).toMatchInterpolatedText(PackagesListRow.i18n.createdAt);
- expect(findTimeAgoTooltip().props()).toMatchObject({
- time: packageData().createdAt,
+ it('if the package is published manually then dont show author name', () => {
+ mountComponent({
+ packageEntity: { ...packageWithoutTags },
});
+
+ expect(findRightSecondary().text()).toBe(`Published 1 month ago`);
+ });
+ });
+
+ describe('right info for a group registry', () => {
+ it('if the package is published through CI show the project and author name', () => {
+ mountComponent({
+ provide: {
+ ...defaultProvide,
+ isGroupPage: true,
+ },
+ packageEntity: { ...packageWithoutTags, pipelines: { nodes: packagePipelines() } },
+ });
+
+ expect(findRightSecondary().text()).toBe(
+ `Published to ${packageWithoutTags.project.name} by Administrator, 1 month ago`,
+ );
+ });
+
+ it('if the package is published manually dont show project and the author name', () => {
+ mountComponent({
+ provide: {
+ ...defaultProvide,
+ isGroupPage: true,
+ },
+ packageEntity: { ...packageWithoutTags },
+ });
+
+ expect(findRightSecondary().text()).toBe(
+ `Published to ${packageWithoutTags.project.name}, 1 month ago`,
+ );
});
});
});
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 483b7a9383d..fad8863e3d9 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
@@ -41,6 +41,10 @@ describe('packages_list', () => {
groupSettings: defaultPackageGroupSettings,
};
+ const defaultProvide = {
+ canDeletePackages: true,
+ };
+
const EmptySlotStub = { name: 'empty-slot-stub', template: '<div>bar</div>' };
const findPackagesListLoader = () => wrapper.findComponent(PackagesListLoader);
@@ -52,8 +56,9 @@ describe('packages_list', () => {
const showMock = jest.fn();
- const mountComponent = (props) => {
+ const mountComponent = ({ props = {}, provide = defaultProvide } = {}) => {
wrapper = shallowMountExtended(PackagesList, {
+ provide,
propsData: {
...defaultProps,
...props,
@@ -75,7 +80,7 @@ describe('packages_list', () => {
describe('when is loading', () => {
beforeEach(() => {
- mountComponent({ isLoading: true });
+ mountComponent({ props: { isLoading: true } });
});
it('shows skeleton loader', () => {
@@ -109,6 +114,7 @@ describe('packages_list', () => {
title: '2 packages',
items: defaultProps.list,
pagination: defaultProps.pageInfo,
+ hiddenDelete: false,
isLoading: false,
});
});
@@ -137,6 +143,16 @@ describe('packages_list', () => {
});
});
+ describe('when the user does not have permission to destroy packages', () => {
+ beforeEach(() => {
+ mountComponent({ provide: { canDeletePackages: false } });
+ });
+
+ it('sets the hidden delete prop of registry list to true', () => {
+ expect(findRegistryList().props('hiddenDelete')).toBe(true);
+ });
+ });
+
describe.each`
description | finderFunction | deletePayload
${'when the user can destroy the package'} | ${findPackagesListRow} | ${firstPackage}
@@ -262,7 +278,7 @@ describe('packages_list', () => {
describe('when an error package is present', () => {
beforeEach(() => {
- mountComponent({ list: [firstPackage, errorPackage] });
+ mountComponent({ props: { list: [firstPackage, errorPackage] } });
return nextTick();
});
@@ -290,7 +306,7 @@ describe('packages_list', () => {
describe('when the list is empty', () => {
beforeEach(() => {
- mountComponent({ list: [] });
+ mountComponent({ props: { list: [] } });
});
it('show the empty slot', () => {
@@ -301,7 +317,7 @@ describe('packages_list', () => {
describe('pagination', () => {
beforeEach(() => {
- mountComponent({ pageInfo: { hasPreviousPage: true } });
+ mountComponent({ props: { pageInfo: { hasPreviousPage: true } } });
});
it('emits prev-page events when the prev event is fired', () => {
diff --git a/spec/frontend/packages_and_registries/package_registry/mock_data.js b/spec/frontend/packages_and_registries/package_registry/mock_data.js
index 6995a4cc635..91dc02f8f39 100644
--- a/spec/frontend/packages_and_registries/package_registry/mock_data.js
+++ b/spec/frontend/packages_and_registries/package_registry/mock_data.js
@@ -9,7 +9,7 @@ export const packageTags = () => [
export const packagePipelines = (extend) => [
{
commitPath: '/namespace14/project14/-/commit/b83d6e391c22777fca1ed3012fce84f633d7fed0',
- createdAt: '2020-08-17T14:23:32Z',
+ createdAt: '2020-05-17T14:23:32Z',
id: 'gid://gitlab/Ci::Pipeline/36',
path: '/namespace14/project14/-/pipelines/36',
name: 'project14',
@@ -38,7 +38,7 @@ export const packageFiles = () => [
fileSha1: 'be93151dc23ac34a82752444556fe79b32c7a1ad',
fileSha256: 'fileSha256',
size: '409600',
- createdAt: '2020-08-17T14:23:32Z',
+ createdAt: '2020-05-17T14:23:32Z',
downloadPath: 'downloadPath',
__typename: 'PackageFile',
},
@@ -49,7 +49,7 @@ export const packageFiles = () => [
fileSha1: 'be93151dc23ac34a82752444556fe79b32c7a1ss',
fileSha256: null,
size: '409600',
- createdAt: '2020-08-17T14:23:32Z',
+ createdAt: '2020-05-17T14:23:32Z',
downloadPath: 'downloadPath',
__typename: 'PackageFile',
},
@@ -92,6 +92,7 @@ export const dependencyLinks = () => [
export const packageProject = () => ({
id: '1',
+ name: 'gitlab-test',
fullPath: 'gitlab-org/gitlab-test',
webUrl: 'http://gdk.test:3000/gitlab-org/gitlab-test',
__typename: 'Project',
@@ -144,7 +145,7 @@ export const packageData = (extend) => ({
name: '@gitlab-org/package-15',
packageType: 'NPM',
version: '1.0.0',
- createdAt: '2020-08-17T14:23:32Z',
+ createdAt: '2020-05-17T14:23:32Z',
updatedAt: '2020-08-17T14:23:32Z',
lastDownloadedAt: '2021-08-17T14:23:32Z',
status: 'DEFAULT',
@@ -278,15 +279,12 @@ export const packagePipelinesQuery = (pipelines = packagePipelines()) => ({
},
});
-export const packageFilesQuery = ({ files = packageFiles(), pageInfo = {} } = {}) => ({
+export const packageFilesQuery = ({ files = packageFiles(), extendPagination = {} } = {}) => ({
data: {
package: {
id: 'gid://gitlab/Packages::Package/111',
packageFiles: {
- pageInfo: {
- hasNextPage: true,
- ...pageInfo,
- },
+ pageInfo: pagination(extendPagination),
nodes: files,
__typename: 'PackageFileConnection',
},
diff --git a/spec/frontend/packages_and_registries/package_registry/pages/list_spec.js b/spec/frontend/packages_and_registries/package_registry/pages/list_spec.js
index 2ee24200ed3..0d262036ee7 100644
--- a/spec/frontend/packages_and_registries/package_registry/pages/list_spec.js
+++ b/spec/frontend/packages_and_registries/package_registry/pages/list_spec.js
@@ -219,7 +219,11 @@ describe('PackagesListApp', () => {
await waitForPromises();
expect(resolver).toHaveBeenCalledWith(
- expect.objectContaining({ before: pagination().startCursor, last: GRAPHQL_PAGE_SIZE }),
+ expect.objectContaining({
+ first: null,
+ before: pagination().startCursor,
+ last: GRAPHQL_PAGE_SIZE,
+ }),
);
});
});
diff --git a/spec/frontend/pages/admin/jobs/components/cancel_jobs_modal_spec.js b/spec/frontend/pages/admin/jobs/components/cancel_jobs_modal_spec.js
index b1d2e443d54..d90393d8ab3 100644
--- a/spec/frontend/pages/admin/jobs/components/cancel_jobs_modal_spec.js
+++ b/spec/frontend/pages/admin/jobs/components/cancel_jobs_modal_spec.js
@@ -1,10 +1,11 @@
-import Vue, { nextTick } from 'vue';
+import { nextTick } from 'vue';
import { mount } from '@vue/test-utils';
import { GlModal } from '@gitlab/ui';
import { TEST_HOST } from 'helpers/test_constants';
import axios from '~/lib/utils/axios_utils';
import { redirectTo } from '~/lib/utils/url_utility'; // eslint-disable-line import/no-deprecated
import CancelJobsModal from '~/pages/admin/jobs/components/cancel_jobs_modal.vue';
+import { setVueErrorHandler } from '../../../../__helpers__/set_vue_error_handler';
jest.mock('~/lib/utils/url_utility', () => ({
...jest.requireActual('~/lib/utils/url_utility'),
@@ -45,8 +46,6 @@ describe('Cancel jobs modal', () => {
});
it('displays error if canceling jobs failed', async () => {
- Vue.config.errorHandler = () => {}; // silencing thrown error
-
const dummyError = new Error('canceling jobs failed');
// TODO: We can't use axios-mock-adapter because our current version
// does not support responseURL
@@ -57,6 +56,7 @@ describe('Cancel jobs modal', () => {
return Promise.reject(dummyError);
});
+ setVueErrorHandler({ instance: wrapper.vm, handler: () => {} }); // silencing thrown error
wrapper.findComponent(GlModal).vm.$emit('primary');
await nextTick();
diff --git a/spec/frontend/pages/groups/new/components/app_spec.js b/spec/frontend/pages/groups/new/components/app_spec.js
index 19240f1a044..baf0ca2beca 100644
--- a/spec/frontend/pages/groups/new/components/app_spec.js
+++ b/spec/frontend/pages/groups/new/components/app_spec.js
@@ -1,4 +1,7 @@
import { shallowMount } from '@vue/test-utils';
+import GROUP_IMPORT_SVG_URL from '@gitlab/svgs/dist/illustrations/group-import.svg?url';
+import GROUP_NEW_SVG_URL from '@gitlab/svgs/dist/illustrations/group-new.svg?url';
+
import App from '~/pages/groups/new/components/app.vue';
import NewNamespacePage from '~/vue_shared/new_namespace/new_namespace_page.vue';
@@ -27,6 +30,7 @@ describe('App component', () => {
{ href: '#', text: 'New group' },
]);
expect(findCreateGroupPanel().title).toBe('Create group');
+ expect(findCreateGroupPanel().imageSrc).toBe(GROUP_NEW_SVG_URL);
});
it('creates correct component for subgroup creation', () => {
@@ -45,5 +49,6 @@ describe('App component', () => {
]);
expect(findCreateGroupPanel().title).toBe('Create subgroup');
expect(findCreateGroupPanel().detailProps).toEqual(detailProps);
+ expect(findCreateGroupPanel().imageSrc).toBe(GROUP_IMPORT_SVG_URL);
});
});
diff --git a/spec/frontend/pages/projects/pipeline_schedules/shared/components/interval_pattern_input_spec.js b/spec/frontend/pages/projects/pipeline_schedules/shared/components/interval_pattern_input_spec.js
index 07d05293a3c..197a76f2c86 100644
--- a/spec/frontend/pages/projects/pipeline_schedules/shared/components/interval_pattern_input_spec.js
+++ b/spec/frontend/pages/projects/pipeline_schedules/shared/components/interval_pattern_input_spec.js
@@ -219,4 +219,17 @@ describe('Interval Pattern Input Component', () => {
expect(findIcon().exists()).toBe(false);
});
});
+
+ describe('cronValue event', () => {
+ it('emits cronValue event with cron value', async () => {
+ createWrapper();
+
+ findCustomInput().element.value = '0 16 * * *';
+ findCustomInput().trigger('input');
+
+ await nextTick();
+
+ expect(wrapper.emitted()).toEqual({ cronValue: [['0 16 * * *']] });
+ });
+ });
});
diff --git a/spec/frontend/pages/shared/wikis/components/wiki_form_spec.js b/spec/frontend/pages/shared/wikis/components/wiki_form_spec.js
index 1a3eb86a00e..db889abad88 100644
--- a/spec/frontend/pages/shared/wikis/components/wiki_form_spec.js
+++ b/spec/frontend/pages/shared/wikis/components/wiki_form_spec.js
@@ -7,16 +7,11 @@ import { mockTracking } from 'helpers/tracking_helper';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import WikiForm from '~/pages/shared/wikis/components/wiki_form.vue';
import MarkdownEditor from '~/vue_shared/components/markdown/markdown_editor.vue';
-import {
- CONTENT_EDITOR_LOADED_ACTION,
- SAVED_USING_CONTENT_EDITOR_ACTION,
- WIKI_CONTENT_EDITOR_TRACKING_LABEL,
- WIKI_FORMAT_LABEL,
- WIKI_FORMAT_UPDATED_ACTION,
-} from '~/pages/shared/wikis/constants';
+import { WIKI_FORMAT_LABEL, WIKI_FORMAT_UPDATED_ACTION } from '~/pages/shared/wikis/constants';
import { DRAWIO_ORIGIN } from 'spec/test_constants';
jest.mock('~/emoji');
+jest.mock('~/lib/graphql');
describe('WikiForm', () => {
let wrapper;
@@ -94,6 +89,15 @@ describe('WikiForm', () => {
GlFormInput,
GlFormGroup,
},
+ mocks: {
+ $apollo: {
+ queries: {
+ currentUser: {
+ loading: false,
+ },
+ },
+ },
+ },
}),
);
}
@@ -224,7 +228,22 @@ describe('WikiForm', () => {
});
it('triggers wiki format tracking event', () => {
- expect(trackingSpy).toHaveBeenCalledTimes(1);
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'wiki_format_updated', {
+ extra: {
+ old_format: 'markdown',
+ project_path: '/project/path/-/wikis/home',
+ value: 'markdown',
+ },
+ label: 'wiki_format',
+ });
+ });
+
+ it('tracks editor type used', () => {
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'editor_type_used', {
+ context: 'Wiki',
+ editorType: 'editor_type_plain_text_editor',
+ label: 'editor_tracking',
+ });
});
it('does not trim page content', () => {
@@ -306,12 +325,6 @@ describe('WikiForm', () => {
expect(findFormat().element.getAttribute('disabled')).toBeDefined();
});
- it('sends tracking event when editor loads', () => {
- expect(trackingSpy).toHaveBeenCalledWith(undefined, CONTENT_EDITOR_LOADED_ACTION, {
- label: WIKI_CONTENT_EDITOR_TRACKING_LABEL,
- });
- });
-
describe('when triggering form submit', () => {
const updatedMarkdown = 'hello **world**';
@@ -321,10 +334,6 @@ describe('WikiForm', () => {
});
it('triggers tracking events on form submit', () => {
- expect(trackingSpy).toHaveBeenCalledWith(undefined, SAVED_USING_CONTENT_EDITOR_ACTION, {
- label: WIKI_CONTENT_EDITOR_TRACKING_LABEL,
- });
-
expect(trackingSpy).toHaveBeenCalledWith(undefined, WIKI_FORMAT_UPDATED_ACTION, {
label: WIKI_FORMAT_LABEL,
extra: {
diff --git a/spec/frontend/pipeline_wizard/components/commit_spec.js b/spec/frontend/pipeline_wizard/components/commit_spec.js
index 7095525e948..bb9a4b85e0e 100644
--- a/spec/frontend/pipeline_wizard/components/commit_spec.js
+++ b/spec/frontend/pipeline_wizard/components/commit_spec.js
@@ -141,10 +141,6 @@ describe('Pipeline Wizard - Commit Page', () => {
it('emits a done event', () => {
expect(wrapper.emitted().done.length).toBe(1);
});
-
- afterEach(() => {
- jest.clearAllMocks();
- });
});
describe('failed commit', () => {
@@ -167,10 +163,6 @@ describe('Pipeline Wizard - Commit Page', () => {
it('will not emit a done event', () => {
expect(wrapper.emitted().done?.length).toBeUndefined();
});
-
- afterEach(() => {
- jest.clearAllMocks();
- });
});
});
diff --git a/spec/frontend/pipeline_wizard/components/editor_spec.js b/spec/frontend/pipeline_wizard/components/editor_spec.js
index 6d7d4363189..2284c875f58 100644
--- a/spec/frontend/pipeline_wizard/components/editor_spec.js
+++ b/spec/frontend/pipeline_wizard/components/editor_spec.js
@@ -1,42 +1,58 @@
import { mount } from '@vue/test-utils';
import { Document } from 'yaml';
import YamlEditor from '~/pipeline_wizard/components/editor.vue';
+import SourceEditor from '~/editor/source_editor';
describe('Pages Yaml Editor wrapper', () => {
let wrapper;
+ const defaultDoc = new Document({ foo: 'bar' });
+
const defaultOptions = {
- propsData: { doc: new Document({ foo: 'bar' }), filename: 'foo.yml' },
+ propsData: { doc: defaultDoc, filename: 'foo.yml' },
+ };
+
+ const getLatestValue = () => {
+ const latest = wrapper.emitted('update:yaml').pop();
+ return latest[0];
};
describe('mount hook', () => {
beforeEach(() => {
+ jest.spyOn(SourceEditor.prototype, 'createInstance');
+
wrapper = mount(YamlEditor, defaultOptions);
});
- it('editor is mounted', () => {
- expect(wrapper.vm.editor).not.toBeUndefined();
- expect(wrapper.find('.gl-source-editor').exists()).toBe(true);
+ it('creates a source editor instance', () => {
+ expect(SourceEditor.prototype.createInstance).toHaveBeenCalledWith({
+ el: wrapper.element,
+ blobPath: 'foo.yml',
+ language: 'yaml',
+ });
+ });
+
+ it('editor is mounted in the wrapper', () => {
+ expect(wrapper.find('.gl-source-editor.monaco-editor').exists()).toBe(true);
+ });
+
+ it("causes the editor's value to be set to the stringified document", () => {
+ expect(getLatestValue()).toEqual(defaultDoc.toString());
});
});
describe('watchers', () => {
+ beforeEach(() => {
+ wrapper = mount(YamlEditor, defaultOptions);
+ });
+
describe('doc', () => {
const doc = new Document({ baz: ['bar'] });
- beforeEach(() => {
- wrapper = mount(YamlEditor, defaultOptions);
- });
-
- it("causes the editor's value to be set to the stringified document", async () => {
- await wrapper.setProps({ doc });
- expect(wrapper.vm.editor.getValue()).toEqual(doc.toString());
- });
-
it('emits an update:yaml event with the yaml representation of doc', async () => {
await wrapper.setProps({ doc });
- const changeEvents = wrapper.emitted('update:yaml');
- expect(changeEvents[2]).toEqual([doc.toString()]);
+
+ expect(getLatestValue()).toEqual(doc.toString());
});
it('does not cause the touch event to be emitted', () => {
diff --git a/spec/frontend/pipelines/components/pipelines_list/failure_widget/failed_job_details_spec.js b/spec/frontend/pipelines/components/pipelines_list/failure_widget/failed_job_details_spec.js
new file mode 100644
index 00000000000..4ba1b82e971
--- /dev/null
+++ b/spec/frontend/pipelines/components/pipelines_list/failure_widget/failed_job_details_spec.js
@@ -0,0 +1,252 @@
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import { GlIcon, GlLink } from '@gitlab/ui';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import { createAlert } from '~/alert';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
+import FailedJobDetails from '~/pipelines/components/pipelines_list/failure_widget/failed_job_details.vue';
+import RetryMrFailedJobMutation from '~/pipelines/graphql/mutations/retry_mr_failed_job.mutation.graphql';
+import { job } from './mock';
+
+Vue.use(VueApollo);
+jest.mock('~/alert');
+
+const createFakeEvent = () => ({ stopPropagation: jest.fn() });
+
+describe('FailedJobDetails component', () => {
+ let wrapper;
+ let mockRetryResponse;
+
+ const retrySuccessResponse = {
+ data: {
+ jobRetry: {
+ errors: [],
+ },
+ },
+ };
+
+ const defaultProps = {
+ job,
+ };
+
+ const createComponent = ({ props = {} } = {}) => {
+ const handlers = [[RetryMrFailedJobMutation, mockRetryResponse]];
+
+ wrapper = shallowMountExtended(FailedJobDetails, {
+ propsData: {
+ ...defaultProps,
+ ...props,
+ },
+ apolloProvider: createMockApollo(handlers),
+ });
+ };
+
+ const findArrowIcon = () => wrapper.findComponent(GlIcon);
+ const findJobId = () => wrapper.findComponent(GlLink);
+ const findHiddenJobLog = () => wrapper.findByTestId('log-is-hidden');
+ const findVisibleJobLog = () => wrapper.findByTestId('log-is-visible');
+ const findJobName = () => wrapper.findByText(defaultProps.job.name);
+ const findRetryButton = () => wrapper.findByLabelText('Retry');
+ const findRow = () => wrapper.findByTestId('widget-row');
+ const findStageName = () => wrapper.findByText(defaultProps.job.stage.name);
+
+ beforeEach(() => {
+ mockRetryResponse = jest.fn();
+ mockRetryResponse.mockResolvedValue(retrySuccessResponse);
+ });
+
+ describe('ui', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders the job name', () => {
+ expect(findJobName().exists()).toBe(true);
+ });
+
+ it('renders the stage name', () => {
+ expect(findStageName().exists()).toBe(true);
+ });
+
+ it('renders the job id as a link', () => {
+ const jobId = getIdFromGraphQLId(defaultProps.job.id);
+
+ expect(findJobId().exists()).toBe(true);
+ expect(findJobId().text()).toContain(String(jobId));
+ });
+
+ it('does not renders the job lob', () => {
+ expect(findHiddenJobLog().exists()).toBe(true);
+ expect(findVisibleJobLog().exists()).toBe(false);
+ });
+ });
+
+ describe('Retry action', () => {
+ describe('when the job is not retryable', () => {
+ beforeEach(() => {
+ createComponent({ props: { job: { ...job, retryable: false } } });
+ });
+
+ it('disables the retry button', () => {
+ expect(findRetryButton().props().disabled).toBe(true);
+ });
+ });
+
+ describe('when the job is retryable', () => {
+ describe('and user has permission to update the build', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('enables the retry button', () => {
+ expect(findRetryButton().props().disabled).toBe(false);
+ });
+
+ describe('when clicking on the retry button', () => {
+ it('passes the loading state to the button', async () => {
+ await findRetryButton().vm.$emit('click', createFakeEvent());
+
+ expect(findRetryButton().props().loading).toBe(true);
+ });
+
+ describe('and it succeeds', () => {
+ beforeEach(async () => {
+ findRetryButton().vm.$emit('click', createFakeEvent());
+ await waitForPromises();
+ });
+
+ it('is no longer loading', () => {
+ expect(findRetryButton().props().loading).toBe(false);
+ });
+
+ it('calls the retry mutation', () => {
+ expect(mockRetryResponse).toHaveBeenCalled();
+ expect(mockRetryResponse).toHaveBeenCalledWith({
+ id: job.id,
+ });
+ });
+
+ it('emits the `retried-job` event', () => {
+ expect(wrapper.emitted('job-retried')).toStrictEqual([[job.name]]);
+ });
+ });
+
+ describe('and it fails', () => {
+ const customErrorMsg = 'Custom error message from API';
+
+ beforeEach(async () => {
+ mockRetryResponse.mockResolvedValue({
+ data: { jobRetry: { errors: [customErrorMsg] } },
+ });
+ findRetryButton().vm.$emit('click', createFakeEvent());
+
+ await waitForPromises();
+ });
+
+ it('shows an error message', () => {
+ expect(createAlert).toHaveBeenCalledWith({ message: customErrorMsg });
+ });
+
+ it('does not emits the `refetch-jobs` event', () => {
+ expect(wrapper.emitted('refetch-jobs')).toBeUndefined();
+ });
+ });
+ });
+ });
+
+ describe('and user does not have permission to update the build', () => {
+ beforeEach(() => {
+ createComponent({
+ props: { job: { ...job, retryable: true, userPermissions: { updateBuild: false } } },
+ });
+ });
+
+ it('disables the retry button', () => {
+ expect(findRetryButton().props().disabled).toBe(true);
+ });
+ });
+ });
+ });
+
+ describe('Job log', () => {
+ describe('without permissions', () => {
+ beforeEach(async () => {
+ createComponent({ props: { job: { ...job, userPermissions: { readBuild: false } } } });
+ await findRow().trigger('click');
+ });
+
+ it('does not renders the received html of the job log', () => {
+ expect(findVisibleJobLog().html()).not.toContain(defaultProps.job.trace.htmlSummary);
+ });
+
+ it('shows a permission error message', () => {
+ expect(findVisibleJobLog().text()).toBe(
+ "You do not have permission to read this job's log",
+ );
+ });
+ });
+
+ describe('with permissions', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ describe('when clicking on the row', () => {
+ beforeEach(async () => {
+ await findRow().trigger('click');
+ });
+
+ describe('while collapsed', () => {
+ it('expands the job log', () => {
+ expect(findHiddenJobLog().exists()).toBe(false);
+ expect(findVisibleJobLog().exists()).toBe(true);
+ });
+
+ it('renders the down arrow', () => {
+ expect(findArrowIcon().props().name).toBe('chevron-down');
+ });
+
+ it('renders the received html of the job log', () => {
+ expect(findVisibleJobLog().html()).toContain(defaultProps.job.trace.htmlSummary);
+ });
+ });
+
+ describe('while expanded', () => {
+ it('collapes the job log', async () => {
+ expect(findHiddenJobLog().exists()).toBe(false);
+ expect(findVisibleJobLog().exists()).toBe(true);
+
+ await findRow().trigger('click');
+
+ expect(findHiddenJobLog().exists()).toBe(true);
+ expect(findVisibleJobLog().exists()).toBe(false);
+ });
+
+ it('renders the right arrow', async () => {
+ expect(findArrowIcon().props().name).toBe('chevron-down');
+
+ await findRow().trigger('click');
+
+ expect(findArrowIcon().props().name).toBe('chevron-right');
+ });
+ });
+ });
+
+ describe('when clicking on a link element within the row', () => {
+ it('does not expands/collapse the job log', async () => {
+ expect(findHiddenJobLog().exists()).toBe(true);
+ expect(findVisibleJobLog().exists()).toBe(false);
+ expect(findArrowIcon().props().name).toBe('chevron-right');
+
+ await findJobId().vm.$emit('click');
+
+ expect(findHiddenJobLog().exists()).toBe(true);
+ expect(findVisibleJobLog().exists()).toBe(false);
+ expect(findArrowIcon().props().name).toBe('chevron-right');
+ });
+ });
+ });
+ });
+});
diff --git a/spec/frontend/pipelines/components/pipelines_list/failure_widget/failed_jobs_list_spec.js b/spec/frontend/pipelines/components/pipelines_list/failure_widget/failed_jobs_list_spec.js
new file mode 100644
index 00000000000..fc8263c6c4d
--- /dev/null
+++ b/spec/frontend/pipelines/components/pipelines_list/failure_widget/failed_jobs_list_spec.js
@@ -0,0 +1,236 @@
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+
+import { GlLoadingIcon, GlToast } from '@gitlab/ui';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import { createAlert } from '~/alert';
+import FailedJobsList from '~/pipelines/components/pipelines_list/failure_widget/failed_jobs_list.vue';
+import FailedJobDetails from '~/pipelines/components/pipelines_list/failure_widget/failed_job_details.vue';
+import * as utils from '~/pipelines/components/pipelines_list/failure_widget/utils';
+import getPipelineFailedJobs from '~/pipelines/graphql/queries/get_pipeline_failed_jobs.query.graphql';
+import { failedJobsMock, failedJobsMock2, failedJobsMockEmpty, activeFailedJobsMock } from './mock';
+
+Vue.use(VueApollo);
+Vue.use(GlToast);
+
+jest.mock('~/alert');
+
+describe('FailedJobsList component', () => {
+ let wrapper;
+ let mockFailedJobsResponse;
+ const showToast = jest.fn();
+
+ const defaultProps = {
+ graphqlResourceEtag: 'api/graphql',
+ isPipelineActive: false,
+ pipelineIid: 1,
+ pipelinePath: '/pipelines/1',
+ };
+
+ const defaultProvide = {
+ fullPath: 'namespace/project/',
+ graphqlPath: 'api/graphql',
+ };
+
+ const createComponent = ({ props = {}, provide } = {}) => {
+ const handlers = [[getPipelineFailedJobs, mockFailedJobsResponse]];
+ const mockApollo = createMockApollo(handlers);
+
+ wrapper = shallowMountExtended(FailedJobsList, {
+ propsData: {
+ ...defaultProps,
+ ...props,
+ },
+ provide: {
+ ...defaultProvide,
+ ...provide,
+ },
+ apolloProvider: mockApollo,
+ mocks: {
+ $toast: {
+ show: showToast,
+ },
+ },
+ });
+ };
+
+ const findAllHeaders = () => wrapper.findAllByTestId('header');
+ const findFailedJobRows = () => wrapper.findAllComponents(FailedJobDetails);
+ const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
+ const findNoFailedJobsText = () => wrapper.findByText('No failed jobs in this pipeline 🎉');
+
+ beforeEach(() => {
+ mockFailedJobsResponse = jest.fn();
+ });
+
+ describe('when loading failed jobs', () => {
+ beforeEach(() => {
+ mockFailedJobsResponse.mockResolvedValue(failedJobsMock);
+ createComponent();
+ });
+
+ it('shows a loading icon', () => {
+ expect(findLoadingIcon().exists()).toBe(true);
+ });
+ });
+
+ describe('when failed jobs have loaded', () => {
+ beforeEach(async () => {
+ mockFailedJobsResponse.mockResolvedValue(failedJobsMock);
+ jest.spyOn(utils, 'sortJobsByStatus');
+
+ createComponent();
+
+ await waitForPromises();
+ });
+
+ it('does not renders a loading icon', () => {
+ expect(findLoadingIcon().exists()).toBe(false);
+ });
+
+ it('renders table column', () => {
+ expect(findAllHeaders()).toHaveLength(4);
+ });
+
+ it('shows the list of failed jobs', () => {
+ expect(findFailedJobRows()).toHaveLength(
+ failedJobsMock.data.project.pipeline.jobs.nodes.length,
+ );
+ });
+
+ it('does not renders the empty state', () => {
+ expect(findNoFailedJobsText().exists()).toBe(false);
+ });
+
+ it('calls sortJobsByStatus', () => {
+ expect(utils.sortJobsByStatus).toHaveBeenCalledWith(
+ failedJobsMock.data.project.pipeline.jobs.nodes,
+ );
+ });
+ });
+
+ describe('when there are no failed jobs', () => {
+ beforeEach(async () => {
+ mockFailedJobsResponse.mockResolvedValue(failedJobsMockEmpty);
+ jest.spyOn(utils, 'sortJobsByStatus');
+
+ createComponent();
+
+ await waitForPromises();
+ });
+
+ it('renders the empty state', () => {
+ expect(findNoFailedJobsText().exists()).toBe(true);
+ });
+ });
+
+ describe('polling', () => {
+ it.each`
+ isGraphqlActive | text
+ ${true} | ${'polls'}
+ ${false} | ${'does not poll'}
+ `(`$text when isGraphqlActive: $isGraphqlActive`, async ({ isGraphqlActive }) => {
+ const defaultCount = 2;
+ const newCount = 1;
+
+ const expectedCount = isGraphqlActive ? newCount : defaultCount;
+ const expectedCallCount = isGraphqlActive ? 2 : 1;
+ const mockResponse = isGraphqlActive ? activeFailedJobsMock : failedJobsMock;
+
+ // Second result is to simulate polling with a different response
+ mockFailedJobsResponse.mockResolvedValueOnce(mockResponse);
+ mockFailedJobsResponse.mockResolvedValueOnce(failedJobsMock2);
+
+ createComponent();
+ await waitForPromises();
+
+ // Initially, we get the first response which is always the default
+ expect(mockFailedJobsResponse).toHaveBeenCalledTimes(1);
+ expect(findFailedJobRows()).toHaveLength(defaultCount);
+
+ jest.advanceTimersByTime(10000);
+ await waitForPromises();
+
+ expect(mockFailedJobsResponse).toHaveBeenCalledTimes(expectedCallCount);
+ expect(findFailedJobRows()).toHaveLength(expectedCount);
+ });
+ });
+
+ describe('when a REST action occurs', () => {
+ beforeEach(() => {
+ // Second result is to simulate polling with a different response
+ mockFailedJobsResponse.mockResolvedValueOnce(failedJobsMock);
+ mockFailedJobsResponse.mockResolvedValueOnce(failedJobsMock2);
+ });
+
+ it.each([true, false])('triggers a refetch of the jobs count', async (isPipelineActive) => {
+ const defaultCount = 2;
+ const newCount = 1;
+
+ createComponent({ props: { isPipelineActive } });
+ await waitForPromises();
+
+ // Initially, we get the first response which is always the default
+ expect(mockFailedJobsResponse).toHaveBeenCalledTimes(1);
+ expect(findFailedJobRows()).toHaveLength(defaultCount);
+
+ wrapper.setProps({ isPipelineActive: !isPipelineActive });
+ await waitForPromises();
+
+ expect(mockFailedJobsResponse).toHaveBeenCalledTimes(2);
+ expect(findFailedJobRows()).toHaveLength(newCount);
+ });
+ });
+
+ describe('when an error occurs loading jobs', () => {
+ const errorMessage = "We couldn't fetch jobs for you because you are not qualified";
+
+ beforeEach(async () => {
+ mockFailedJobsResponse.mockRejectedValue({ message: errorMessage });
+
+ createComponent();
+
+ await waitForPromises();
+ });
+ it('does not renders a loading icon', () => {
+ expect(findLoadingIcon().exists()).toBe(false);
+ });
+
+ it('calls create Alert with the error message and danger variant', () => {
+ expect(createAlert).toHaveBeenCalledWith({ message: errorMessage, variant: 'danger' });
+ });
+ });
+
+ describe('when `refetch-jobs` job is fired from the widget', () => {
+ beforeEach(async () => {
+ mockFailedJobsResponse.mockResolvedValueOnce(failedJobsMock);
+ mockFailedJobsResponse.mockResolvedValueOnce(failedJobsMock2);
+
+ createComponent();
+
+ await waitForPromises();
+ });
+
+ it('refetches all failed jobs', async () => {
+ expect(findFailedJobRows()).not.toHaveLength(
+ failedJobsMock2.data.project.pipeline.jobs.nodes.length,
+ );
+
+ await findFailedJobRows().at(0).vm.$emit('job-retried', 'job-name');
+ await waitForPromises();
+
+ expect(findFailedJobRows()).toHaveLength(
+ failedJobsMock2.data.project.pipeline.jobs.nodes.length,
+ );
+ });
+
+ it('shows a toast message', async () => {
+ await findFailedJobRows().at(0).vm.$emit('job-retried', 'job-name');
+ await waitForPromises();
+
+ expect(showToast).toHaveBeenCalledWith('job-name job is being retried');
+ });
+ });
+});
diff --git a/spec/frontend/pipelines/components/pipelines_list/failure_widget/mock.js b/spec/frontend/pipelines/components/pipelines_list/failure_widget/mock.js
index a4c90fa3876..b047b57fc34 100644
--- a/spec/frontend/pipelines/components/pipelines_list/failure_widget/mock.js
+++ b/spec/frontend/pipelines/components/pipelines_list/failure_widget/mock.js
@@ -13,13 +13,17 @@ export const job = {
},
name: 'job-name',
retried: false,
+ retryable: true,
stage: {
id: '1',
name: 'build',
},
trace: {
- htmlSummary:
- '<span>To install the missing version, run `gem install bundler:2.4.13`<br/>\tfrom /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems.rb:302:in `activate_bin_path\'<br/>\tfrom /usr/bin/bundle:23:in `&lt;main>\'<br/></span><div class="section-start" data-timestamp="1685044123" data-section="upload-artifacts-on-failure" role="button"></div><span class="term-fg-l-cyan term-bold section section-header js-s-upload-artifacts-on-failure">Uploading artifacts for failed job</span><span class="section section-header js-s-upload-artifacts-on-failure"><br/></span><span class="term-fg-l-green term-bold section line js-s-upload-artifacts-on-failure">Uploading artifacts...</span><span class="section line js-s-upload-artifacts-on-failure"><br/>Runtime platform </span><span class="section line js-s-upload-artifacts-on-failure"> arch</span><span class="section line js-s-upload-artifacts-on-failure">=arm64 os</span><span class="section line js-s-upload-artifacts-on-failure">=darwin pid</span><span class="section line js-s-upload-artifacts-on-failure">=16706 revision</span><span class="section line js-s-upload-artifacts-on-failure">=43b2dc3d version</span><span class="section line js-s-upload-artifacts-on-failure">=15.4.0<br/></span><span class="term-fg-yellow section line js-s-upload-artifacts-on-failure">WARNING: rspec.xml: no matching files. Ensure that the artifact path is relative to the working directory</span><span class="section line js-s-upload-artifacts-on-failure"> <br/></span><span class="term-fg-l-red term-bold section line js-s-upload-artifacts-on-failure">ERROR: No files to upload </span><span class="section line js-s-upload-artifacts-on-failure"> <br/></span><div class="section-end" data-section="upload-artifacts-on-failure"></div><span class="term-fg-l-red term-bold">ERROR: Job failed: exit status 1<br/></span><span><br/></span>',
+ htmlSummary: '<h1>Hello</h1>',
+ },
+ userPermissions: {
+ readBuild: true,
+ updateBuild: true,
},
webPath: '/',
};
@@ -30,16 +34,44 @@ export const allowedToFailJob = {
allowFailure: true,
};
-export const failedJobsMock = {
- data: {
- project: {
- id: 'gid://gitlab/Project/20',
- pipeline: {
- id: 'gid://gitlab/Pipeline/20',
- jobs: {
- nodes: [allowedToFailJob, job],
+export const createFailedJobsMockCount = ({ count = 4, active = false } = {}) => {
+ return {
+ data: {
+ project: {
+ id: 'gid://gitlab/Project/20',
+ pipeline: {
+ id: 'gid://gitlab/Pipeline/20',
+ active,
+ jobs: {
+ count,
+ },
},
},
},
- },
+ };
+};
+
+const createFailedJobsMock = (nodes, active = false) => {
+ return {
+ data: {
+ project: {
+ id: 'gid://gitlab/Project/20',
+ pipeline: {
+ active,
+ id: 'gid://gitlab/Pipeline/20',
+ jobs: {
+ count: nodes.length,
+ nodes,
+ },
+ },
+ },
+ },
+ };
};
+
+export const failedJobsMock = createFailedJobsMock([allowedToFailJob, job]);
+export const failedJobsMockEmpty = createFailedJobsMock([]);
+
+export const activeFailedJobsMock = createFailedJobsMock([allowedToFailJob, job], true);
+
+export const failedJobsMock2 = createFailedJobsMock([job]);
diff --git a/spec/frontend/pipelines/components/pipelines_list/failure_widget/pipeline_failed_jobs_widget_spec.js b/spec/frontend/pipelines/components/pipelines_list/failure_widget/pipeline_failed_jobs_widget_spec.js
index df6d114f683..c1a885391e9 100644
--- a/spec/frontend/pipelines/components/pipelines_list/failure_widget/pipeline_failed_jobs_widget_spec.js
+++ b/spec/frontend/pipelines/components/pipelines_list/failure_widget/pipeline_failed_jobs_widget_spec.js
@@ -1,25 +1,16 @@
-import Vue from 'vue';
-import VueApollo from 'vue-apollo';
-
-import { GlButton, GlIcon, GlLoadingIcon, GlPopover } from '@gitlab/ui';
-import createMockApollo from 'helpers/mock_apollo_helper';
+import { GlButton, GlIcon, GlPopover } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
-import waitForPromises from 'helpers/wait_for_promises';
import PipelineFailedJobsWidget from '~/pipelines/components/pipelines_list/failure_widget/pipeline_failed_jobs_widget.vue';
-import { createAlert } from '~/alert';
-import WidgetFailedJobRow from '~/pipelines/components/pipelines_list/failure_widget/widget_failed_job_row.vue';
-import * as utils from '~/pipelines/components/pipelines_list/failure_widget/utils';
-import getPipelineFailedJobs from '~/pipelines/graphql/queries/get_pipeline_failed_jobs.query.graphql';
-import { failedJobsMock } from './mock';
+import FailedJobsList from '~/pipelines/components/pipelines_list/failure_widget/failed_jobs_list.vue';
-Vue.use(VueApollo);
jest.mock('~/alert');
describe('PipelineFailedJobsWidget component', () => {
let wrapper;
- let mockFailedJobsResponse;
const defaultProps = {
+ failedJobsCount: 4,
+ isPipelineActive: false,
pipelineIid: 1,
pipelinePath: '/pipelines/1',
};
@@ -28,10 +19,7 @@ describe('PipelineFailedJobsWidget component', () => {
fullPath: 'namespace/project/',
};
- const createComponent = ({ props = {}, provide } = {}) => {
- const handlers = [[getPipelineFailedJobs, mockFailedJobsResponse]];
- const mockApollo = createMockApollo(handlers);
-
+ const createComponent = ({ props = {}, provide = {} } = {}) => {
wrapper = shallowMountExtended(PipelineFailedJobsWidget, {
propsData: {
...defaultProps,
@@ -41,29 +29,35 @@ describe('PipelineFailedJobsWidget component', () => {
...defaultProvide,
...provide,
},
- apolloProvider: mockApollo,
});
};
- const findAllHeaders = () => wrapper.findAllByTestId('header');
const findFailedJobsButton = () => wrapper.findComponent(GlButton);
- const findFailedJobRows = () => wrapper.findAllComponents(WidgetFailedJobRow);
+ const findFailedJobsList = () => wrapper.findAllComponents(FailedJobsList);
const findInfoIcon = () => wrapper.findComponent(GlIcon);
const findInfoPopover = () => wrapper.findComponent(GlPopover);
- const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
- beforeEach(() => {
- mockFailedJobsResponse = jest.fn();
+ describe('when there are no failed jobs', () => {
+ beforeEach(() => {
+ createComponent({ props: { failedJobsCount: 0 } });
+ });
+
+ it('renders the show failed jobs button with a count of 0', () => {
+ expect(findFailedJobsButton().exists()).toBe(true);
+ expect(findFailedJobsButton().text()).toBe('Show failed jobs (0)');
+ });
});
- describe('ui', () => {
+ describe('when there are failed jobs', () => {
beforeEach(() => {
createComponent();
});
- it('renders the show failed jobs button', () => {
+ it('renders the show failed jobs button with correct count', () => {
expect(findFailedJobsButton().exists()).toBe(true);
- expect(findFailedJobsButton().text()).toBe('Show failed jobs');
+ expect(findFailedJobsButton().text()).toBe(
+ `Show failed jobs (${defaultProps.failedJobsCount})`,
+ );
});
it('renders the info icon', () => {
@@ -74,71 +68,53 @@ describe('PipelineFailedJobsWidget component', () => {
expect(findInfoPopover().exists()).toBe(true);
});
- it('does not show the list of failed jobs', () => {
- expect(findFailedJobRows()).toHaveLength(0);
+ it('does not render the failed jobs widget', () => {
+ expect(findFailedJobsList().exists()).toBe(false);
});
});
- describe('when loading failed jobs', () => {
+ describe('when the job button is clicked', () => {
beforeEach(async () => {
- mockFailedJobsResponse.mockResolvedValue(failedJobsMock);
createComponent();
await findFailedJobsButton().vm.$emit('click');
});
- it('shows a loading icon', () => {
- expect(findLoadingIcon().exists()).toBe(true);
+ it('renders the failed jobs widget', () => {
+ expect(findFailedJobsList().exists()).toBe(true);
});
});
- describe('when failed jobs have loaded', () => {
- beforeEach(async () => {
- mockFailedJobsResponse.mockResolvedValue(failedJobsMock);
- jest.spyOn(utils, 'sortJobsByStatus');
-
+ describe('when the job count changes', () => {
+ beforeEach(() => {
createComponent();
-
- await findFailedJobsButton().vm.$emit('click');
- await waitForPromises();
- });
- it('does not renders a loading icon', () => {
- expect(findLoadingIcon().exists()).toBe(false);
});
- it('renders table column', () => {
- expect(findAllHeaders()).toHaveLength(3);
- });
+ describe('from the prop', () => {
+ it('updates the job count', async () => {
+ const newJobCount = 12;
- it('shows the list of failed jobs', () => {
- expect(findFailedJobRows()).toHaveLength(
- failedJobsMock.data.project.pipeline.jobs.nodes.length,
- );
- });
+ expect(findFailedJobsButton().text()).toContain(String(defaultProps.failedJobsCount));
- it('calls sortJobsByStatus', () => {
- expect(utils.sortJobsByStatus).toHaveBeenCalledWith(
- failedJobsMock.data.project.pipeline.jobs.nodes,
- );
+ await wrapper.setProps({ failedJobsCount: newJobCount });
+
+ expect(findFailedJobsButton().text()).toContain(String(newJobCount));
+ });
});
- });
- describe('when an error occurs loading jobs', () => {
- const errorMessage = "We couldn't fetch jobs for you because you are not qualified";
+ describe('from the event', () => {
+ beforeEach(async () => {
+ await findFailedJobsButton().vm.$emit('click');
+ });
- beforeEach(async () => {
- mockFailedJobsResponse.mockRejectedValue({ message: errorMessage });
+ it('updates the job count', async () => {
+ const newJobCount = 12;
- createComponent();
+ expect(findFailedJobsButton().text()).toContain(String(defaultProps.failedJobsCount));
- await findFailedJobsButton().vm.$emit('click');
- await waitForPromises();
- });
- it('does not renders a loading icon', () => {
- expect(findLoadingIcon().exists()).toBe(false);
- });
+ await findFailedJobsList().at(0).vm.$emit('failed-jobs-count', newJobCount);
- it('calls create Alert with the error message and danger variant', () => {
- expect(createAlert).toHaveBeenCalledWith({ message: errorMessage, variant: 'danger' });
+ expect(findFailedJobsButton().text()).toContain(String(newJobCount));
+ });
});
});
});
diff --git a/spec/frontend/pipelines/components/pipelines_list/failure_widget/widget_failed_job_row_spec.js b/spec/frontend/pipelines/components/pipelines_list/failure_widget/widget_failed_job_row_spec.js
deleted file mode 100644
index dfc2806840f..00000000000
--- a/spec/frontend/pipelines/components/pipelines_list/failure_widget/widget_failed_job_row_spec.js
+++ /dev/null
@@ -1,140 +0,0 @@
-import { GlIcon, GlLink } from '@gitlab/ui';
-import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
-import { getIdFromGraphQLId } from '~/graphql_shared/utils';
-import CiIcon from '~/vue_shared/components/ci_icon.vue';
-import WidgetFailedJobRow from '~/pipelines/components/pipelines_list/failure_widget/widget_failed_job_row.vue';
-
-describe('WidgetFailedJobRow component', () => {
- let wrapper;
-
- const defaultProps = {
- job: {
- id: 'gid://gitlab/Ci::Build/5240',
- detailedStatus: {
- group: 'running',
- icon: 'icon_status_running',
- },
- name: 'my-job',
- stage: {
- name: 'build',
- },
- trace: {
- htmlSummary: '<h1>job log</h1>',
- },
- webpath: '/',
- },
- };
-
- const createComponent = ({ props = {} } = {}) => {
- wrapper = shallowMountExtended(WidgetFailedJobRow, {
- propsData: {
- ...defaultProps,
- ...props,
- },
- });
- };
-
- const findArrowIcon = () => wrapper.findComponent(GlIcon);
- const findJobCiStatus = () => wrapper.findComponent(CiIcon);
- const findJobId = () => wrapper.findComponent(GlLink);
- const findHiddenJobLog = () => wrapper.findByTestId('log-is-hidden');
- const findVisibleJobLog = () => wrapper.findByTestId('log-is-visible');
- const findJobName = () => wrapper.findByText(defaultProps.job.name);
- const findRow = () => wrapper.findByTestId('widget-row');
- const findStageName = () => wrapper.findByText(defaultProps.job.stage.name);
-
- describe('ui', () => {
- beforeEach(() => {
- createComponent();
- });
-
- it('renders the job name', () => {
- expect(findJobName().exists()).toBe(true);
- });
-
- it('renders the stage name', () => {
- expect(findStageName().exists()).toBe(true);
- });
-
- it('renders the job id as a link', () => {
- const jobId = getIdFromGraphQLId(defaultProps.job.id);
-
- expect(findJobId().exists()).toBe(true);
- expect(findJobId().text()).toContain(String(jobId));
- });
-
- it('renders the ci status badge', () => {
- expect(findJobCiStatus().exists()).toBe(true);
- });
-
- it('renders the right arrow', () => {
- expect(findArrowIcon().props().name).toBe('chevron-right');
- });
-
- it('does not renders the job lob', () => {
- expect(findHiddenJobLog().exists()).toBe(true);
- expect(findVisibleJobLog().exists()).toBe(false);
- });
- });
-
- describe('Job log', () => {
- beforeEach(() => {
- createComponent();
- });
-
- describe('when clicking on the row', () => {
- beforeEach(async () => {
- await findRow().trigger('click');
- });
-
- describe('while collapsed', () => {
- it('expands the job log', () => {
- expect(findHiddenJobLog().exists()).toBe(false);
- expect(findVisibleJobLog().exists()).toBe(true);
- });
-
- it('renders the down arrow', () => {
- expect(findArrowIcon().props().name).toBe('chevron-down');
- });
-
- it('renders the received html', () => {
- expect(findVisibleJobLog().html()).toContain(defaultProps.job.trace.htmlSummary);
- });
- });
-
- describe('while expanded', () => {
- it('collapes the job log', async () => {
- expect(findHiddenJobLog().exists()).toBe(false);
- expect(findVisibleJobLog().exists()).toBe(true);
-
- await findRow().trigger('click');
-
- expect(findHiddenJobLog().exists()).toBe(true);
- expect(findVisibleJobLog().exists()).toBe(false);
- });
-
- it('renders the right arrow', async () => {
- expect(findArrowIcon().props().name).toBe('chevron-down');
-
- await findRow().trigger('click');
-
- expect(findArrowIcon().props().name).toBe('chevron-right');
- });
- });
- });
-
- describe('when clicking on a link element within the row', () => {
- it('does not expands/collapse the job log', async () => {
- expect(findHiddenJobLog().exists()).toBe(true);
- expect(findVisibleJobLog().exists()).toBe(false);
- expect(findArrowIcon().props().name).toBe('chevron-right');
-
- await findJobId().vm.$emit('click');
-
- expect(findHiddenJobLog().exists()).toBe(true);
- expect(findVisibleJobLog().exists()).toBe(false);
- expect(findArrowIcon().props().name).toBe('chevron-right');
- });
- });
- });
-});
diff --git a/spec/frontend/pipelines/graph/graph_component_wrapper_spec.js b/spec/frontend/pipelines/graph/graph_component_wrapper_spec.js
index 9599b5e6b7b..7b59d82ae6f 100644
--- a/spec/frontend/pipelines/graph/graph_component_wrapper_spec.js
+++ b/spec/frontend/pipelines/graph/graph_component_wrapper_spec.js
@@ -34,7 +34,11 @@ import getPipelineHeaderData from '~/pipelines/graphql/queries/get_pipeline_head
import * as sentryUtils from '~/pipelines/utils';
import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
import { mockRunningPipelineHeaderData } from '../mock_data';
-import { mapCallouts, mockCalloutsResponse } from './mock_data';
+import {
+ mapCallouts,
+ mockCalloutsResponse,
+ mockPipelineResponseWithTooManyJobs,
+} from './mock_data';
const defaultProvide = {
graphqlResourceEtag: 'frog/amphibirama/etag/',
@@ -49,7 +53,10 @@ describe('Pipeline graph wrapper', () => {
let wrapper;
let requestHandlers;
- const findAlert = () => wrapper.findComponent(GlAlert);
+ let pipelineDetailsHandler;
+
+ const findAlert = () => wrapper.findByTestId('error-alert');
+ const findJobCountWarning = () => wrapper.findByTestId('job-count-warning');
const findDependenciesToggle = () => wrapper.findByTestId('show-links-toggle');
const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
const findLinksLayer = () => wrapper.findComponent(LinksLayer);
@@ -83,7 +90,6 @@ describe('Pipeline graph wrapper', () => {
const createComponentWithApollo = ({
calloutsList = [],
data = {},
- getPipelineDetailsHandler = jest.fn().mockResolvedValue(mockPipelineResponse),
mountFn = shallowMountExtended,
provide = {},
} = {}) => {
@@ -92,7 +98,7 @@ describe('Pipeline graph wrapper', () => {
requestHandlers = {
getUserCalloutsHandler: jest.fn().mockResolvedValue(mockCalloutsResponse(callouts)),
getPipelineHeaderDataHandler: jest.fn().mockResolvedValue(mockRunningPipelineHeaderData),
- getPipelineDetailsHandler,
+ getPipelineDetailsHandler: pipelineDetailsHandler,
};
const handlers = [
@@ -105,24 +111,29 @@ describe('Pipeline graph wrapper', () => {
createComponent({ apolloProvider, data, provide, mountFn });
};
+ beforeEach(() => {
+ pipelineDetailsHandler = jest.fn();
+ pipelineDetailsHandler.mockResolvedValue(mockPipelineResponse);
+ });
+
describe('when data is loading', () => {
- it('displays the loading icon', () => {
+ beforeEach(() => {
createComponentWithApollo();
+ });
+
+ it('displays the loading icon', () => {
expect(findLoadingIcon().exists()).toBe(true);
});
it('does not display the alert', () => {
- createComponentWithApollo();
expect(findAlert().exists()).toBe(false);
});
it('does not display the graph', () => {
- createComponentWithApollo();
expect(findGraph().exists()).toBe(false);
});
it('skips querying headerPipeline', () => {
- createComponentWithApollo();
expect(wrapper.vm.$apollo.queries.headerPipeline.skip).toBe(true);
});
});
@@ -153,11 +164,25 @@ describe('Pipeline graph wrapper', () => {
});
});
+ describe('when a stage has 100 jobs or more', () => {
+ beforeEach(async () => {
+ pipelineDetailsHandler.mockResolvedValue(mockPipelineResponseWithTooManyJobs);
+ createComponentWithApollo();
+ await waitForPromises();
+ });
+
+ it('show a warning alert', () => {
+ expect(findJobCountWarning().exists()).toBe(true);
+ expect(findJobCountWarning().props().title).toBe(
+ 'Only the first 100 jobs per stage are displayed',
+ );
+ });
+ });
+
describe('when there is an error', () => {
beforeEach(async () => {
- createComponentWithApollo({
- getPipelineDetailsHandler: jest.fn().mockRejectedValue(new Error('GraphQL error')),
- });
+ pipelineDetailsHandler.mockRejectedValue(new Error('GraphQL error'));
+ createComponentWithApollo();
await waitForPromises();
});
@@ -270,13 +295,12 @@ describe('Pipeline graph wrapper', () => {
errors: [{ message: 'timeout' }],
};
- const failSucceedFail = jest
- .fn()
+ pipelineDetailsHandler
.mockResolvedValueOnce(errorData)
.mockResolvedValueOnce(mockPipelineResponse)
.mockResolvedValueOnce(errorData);
- createComponentWithApollo({ getPipelineDetailsHandler: failSucceedFail });
+ createComponentWithApollo();
await waitForPromises();
});
@@ -438,9 +462,9 @@ describe('Pipeline graph wrapper', () => {
localStorage.setItem(VIEW_TYPE_KEY, LAYER_VIEW);
+ pipelineDetailsHandler.mockResolvedValue(nonNeedsResponse);
createComponentWithApollo({
mountFn: mountExtended,
- getPipelineDetailsHandler: jest.fn().mockResolvedValue(nonNeedsResponse),
});
await waitForPromises();
@@ -460,9 +484,9 @@ describe('Pipeline graph wrapper', () => {
const nonNeedsResponse = { ...mockPipelineResponse };
nonNeedsResponse.data.project.pipeline.usesNeeds = false;
+ pipelineDetailsHandler.mockResolvedValue(nonNeedsResponse);
createComponentWithApollo({
mountFn: mountExtended,
- getPipelineDetailsHandler: jest.fn().mockResolvedValue(nonNeedsResponse),
});
jest.runOnlyPendingTimers();
diff --git a/spec/frontend/pipelines/graph/job_name_component_spec.js b/spec/frontend/pipelines/graph/job_name_component_spec.js
index ec432e98fdf..fca4c43d9fa 100644
--- a/spec/frontend/pipelines/graph/job_name_component_spec.js
+++ b/spec/frontend/pipelines/graph/job_name_component_spec.js
@@ -1,6 +1,6 @@
import { mount } from '@vue/test-utils';
import jobNameComponent from '~/pipelines/components/jobs_shared/job_name_component.vue';
-import ciIcon from '~/vue_shared/components/ci_icon.vue';
+import CiIcon from '~/vue_shared/components/ci_icon.vue';
describe('job name component', () => {
let wrapper;
@@ -24,7 +24,7 @@ describe('job name component', () => {
});
it('should render an icon with the provided status', () => {
- expect(wrapper.findComponent(ciIcon).exists()).toBe(true);
+ expect(wrapper.findComponent(CiIcon).exists()).toBe(true);
expect(wrapper.find('.ci-status-icon-success').exists()).toBe(true);
});
});
diff --git a/spec/frontend/pipelines/graph/linked_pipeline_spec.js b/spec/frontend/pipelines/graph/linked_pipeline_spec.js
index bf92cd585d9..8dae2aac664 100644
--- a/spec/frontend/pipelines/graph/linked_pipeline_spec.js
+++ b/spec/frontend/pipelines/graph/linked_pipeline_spec.js
@@ -10,7 +10,7 @@ import { ACTION_FAILURE, UPSTREAM, DOWNSTREAM } from '~/pipelines/components/gra
import LinkedPipelineComponent from '~/pipelines/components/graph/linked_pipeline.vue';
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 CiIcon from '~/vue_shared/components/ci_icon.vue';
import mockPipeline from './linked_pipelines_mock_data';
describe('Linked pipeline', () => {
@@ -87,7 +87,7 @@ describe('Linked pipeline', () => {
});
it('should render an svg within the status container', () => {
- const pipelineStatusElement = wrapper.findComponent(CiStatus);
+ const pipelineStatusElement = wrapper.findComponent(CiIcon);
expect(pipelineStatusElement.find('svg').exists()).toBe(true);
});
@@ -97,7 +97,7 @@ describe('Linked pipeline', () => {
});
it('should have a ci-status child component', () => {
- expect(wrapper.findComponent(CiStatus).exists()).toBe(true);
+ expect(wrapper.findComponent(CiIcon).exists()).toBe(true);
});
it('should render the pipeline id', () => {
diff --git a/spec/frontend/pipelines/graph/mock_data.js b/spec/frontend/pipelines/graph/mock_data.js
index b012e7f66e1..8d06d6931ed 100644
--- a/spec/frontend/pipelines/graph/mock_data.js
+++ b/spec/frontend/pipelines/graph/mock_data.js
@@ -1,3 +1,4 @@
+import mockPipelineResponse from 'test_fixtures/pipelines/pipeline_details.json';
import { unwrapPipelineData } from '~/pipelines/components/graph/utils';
import {
BUILD_KIND,
@@ -5,6 +6,14 @@ import {
RETRY_ACTION_TITLE,
} from '~/pipelines/components/graph/constants';
+// We mock this instead of using fixtures for performance reason.
+const mockPipelineResponseCopy = JSON.parse(JSON.stringify(mockPipelineResponse));
+const groups = new Array(100).fill({
+ ...mockPipelineResponse.data.project.pipeline.stages.nodes[0].groups.nodes[0],
+});
+mockPipelineResponseCopy.data.project.pipeline.stages.nodes[0].groups.nodes = groups;
+export const mockPipelineResponseWithTooManyJobs = mockPipelineResponseCopy;
+
export const downstream = {
nodes: [
{
diff --git a/spec/frontend/pipelines/graph_shared/links_inner_spec.js b/spec/frontend/pipelines/graph_shared/links_inner_spec.js
index 50f754393fe..b4ffd2658fe 100644
--- a/spec/frontend/pipelines/graph_shared/links_inner_spec.js
+++ b/spec/frontend/pipelines/graph_shared/links_inner_spec.js
@@ -80,7 +80,6 @@ describe('Links Inner component', () => {
};
afterEach(() => {
- jest.restoreAllMocks();
resetHTMLFixture();
});
diff --git a/spec/frontend/pipelines/header_component_spec.js b/spec/frontend/pipelines/header_component_spec.js
deleted file mode 100644
index 18def4ab62c..00000000000
--- a/spec/frontend/pipelines/header_component_spec.js
+++ /dev/null
@@ -1,246 +0,0 @@
-import { GlAlert, GlModal, GlLoadingIcon } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import { nextTick } from 'vue';
-import waitForPromises from 'helpers/wait_for_promises';
-import HeaderComponent from '~/pipelines/components/header_component.vue';
-import cancelPipelineMutation from '~/pipelines/graphql/mutations/cancel_pipeline.mutation.graphql';
-import deletePipelineMutation from '~/pipelines/graphql/mutations/delete_pipeline.mutation.graphql';
-import retryPipelineMutation from '~/pipelines/graphql/mutations/retry_pipeline.mutation.graphql';
-import { BUTTON_TOOLTIP_RETRY, BUTTON_TOOLTIP_CANCEL } from '~/pipelines/constants';
-import {
- mockCancelledPipelineHeader,
- mockFailedPipelineHeader,
- mockFailedPipelineNoPermissions,
- mockRunningPipelineHeader,
- mockRunningPipelineNoPermissions,
- mockSuccessfulPipelineHeader,
-} from './mock_data';
-
-describe('Pipeline details header', () => {
- let wrapper;
- let glModalDirective;
- let mutate = jest.fn();
-
- const findAlert = () => wrapper.findComponent(GlAlert);
- const findDeleteModal = () => wrapper.findComponent(GlModal);
- const findRetryButton = () => wrapper.find('[data-testid="retryPipeline"]');
- const findCancelButton = () => wrapper.find('[data-testid="cancelPipeline"]');
- const findDeleteButton = () => wrapper.find('[data-testid="deletePipeline"]');
- const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
-
- const defaultProvideOptions = {
- pipelineId: '14',
- pipelineIid: 1,
- paths: {
- pipelinesPath: '/namespace/my-project/-/pipelines',
- fullProject: '/namespace/my-project',
- },
- };
-
- const createComponent = (pipelineMock = mockRunningPipelineHeader, { isLoading } = false) => {
- glModalDirective = jest.fn();
-
- const $apollo = {
- queries: {
- pipeline: {
- loading: isLoading,
- stopPolling: jest.fn(),
- startPolling: jest.fn(),
- },
- },
- mutate,
- };
-
- return shallowMount(HeaderComponent, {
- data() {
- return {
- pipeline: pipelineMock,
- };
- },
- provide: {
- ...defaultProvideOptions,
- },
- directives: {
- glModal: {
- bind(_, { value }) {
- glModalDirective(value);
- },
- },
- },
- mocks: { $apollo },
- });
- };
-
- describe('initial loading', () => {
- beforeEach(() => {
- wrapper = createComponent(null, { isLoading: true });
- });
-
- it('shows a loading state while graphQL is fetching initial data', () => {
- expect(findLoadingIcon().exists()).toBe(true);
- });
- });
-
- describe('visible state', () => {
- it.each`
- state | pipelineData | retryValue | cancelValue
- ${'cancelled'} | ${mockCancelledPipelineHeader} | ${true} | ${false}
- ${'failed'} | ${mockFailedPipelineHeader} | ${true} | ${false}
- ${'running'} | ${mockRunningPipelineHeader} | ${false} | ${true}
- ${'successful'} | ${mockSuccessfulPipelineHeader} | ${false} | ${false}
- `(
- 'with a $state pipeline, it will show actions: retry $retryValue and cancel $cancelValue',
- ({ pipelineData, retryValue, cancelValue }) => {
- wrapper = createComponent(pipelineData);
-
- expect(findRetryButton().exists()).toBe(retryValue);
- expect(findCancelButton().exists()).toBe(cancelValue);
- },
- );
- });
-
- describe('actions', () => {
- describe('Retry action', () => {
- beforeEach(() => {
- wrapper = createComponent(mockCancelledPipelineHeader);
- });
-
- it('should call retryPipeline Mutation with pipeline id', () => {
- findRetryButton().vm.$emit('click');
-
- expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledWith({
- mutation: retryPipelineMutation,
- variables: { id: mockCancelledPipelineHeader.id },
- });
- });
-
- 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', () => {
- beforeEach(() => {
- mutate = jest.fn().mockRejectedValue('error');
-
- wrapper = createComponent(mockCancelledPipelineHeader);
- });
-
- it('retry button loading state should reset on error', async () => {
- findRetryButton().vm.$emit('click');
-
- await nextTick();
-
- expect(findRetryButton().props('loading')).toBe(true);
-
- await waitForPromises();
-
- expect(findRetryButton().props('loading')).toBe(false);
- });
- });
-
- describe('Cancel action', () => {
- beforeEach(() => {
- wrapper = createComponent(mockRunningPipelineHeader);
- });
-
- it('should call cancelPipeline Mutation with pipeline id', () => {
- findCancelButton().vm.$emit('click');
-
- expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledWith({
- mutation: cancelPipelineMutation,
- variables: { id: mockRunningPipelineHeader.id },
- });
- });
-
- it('should render cancel action tooltip', () => {
- expect(findCancelButton().attributes('title')).toBe(BUTTON_TOOLTIP_CANCEL);
- });
-
- 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', () => {
- beforeEach(() => {
- wrapper = createComponent(mockFailedPipelineHeader);
- });
-
- it('displays delete modal when clicking on delete and does not call the delete action', () => {
- findDeleteButton().vm.$emit('click');
-
- expect(findDeleteModal().props('modalId')).toBe(wrapper.vm.$options.DELETE_MODAL_ID);
- expect(glModalDirective).toHaveBeenCalledWith(wrapper.vm.$options.DELETE_MODAL_ID);
- expect(wrapper.vm.$apollo.mutate).not.toHaveBeenCalled();
- });
-
- it('should call deletePipeline Mutation with pipeline id when modal is submitted', () => {
- findDeleteModal().vm.$emit('primary');
-
- expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledWith({
- mutation: deletePipelineMutation,
- 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('primary');
- await waitForPromises();
-
- expect(findAlert().text()).toBe(failureMessage);
- });
- });
-
- describe('Permissions', () => {
- it('should not display the cancel action if user does not have permission', () => {
- wrapper = createComponent(mockRunningPipelineNoPermissions);
-
- expect(findCancelButton().exists()).toBe(false);
- });
-
- it('should not display the retry action if user does not have permission', () => {
- wrapper = createComponent(mockFailedPipelineNoPermissions);
-
- expect(findRetryButton().exists()).toBe(false);
- });
- });
- });
-});
diff --git a/spec/frontend/pipelines/mock_data.js b/spec/frontend/pipelines/mock_data.js
index 62c0d6e2d91..673db3b5178 100644
--- a/spec/frontend/pipelines/mock_data.js
+++ b/spec/frontend/pipelines/mock_data.js
@@ -26,19 +26,19 @@ export const pipelineRetryMutationResponseFailed = {
};
export const pipelineCancelMutationResponseSuccess = {
- data: { pipelineRetry: { errors: [] } },
+ data: { pipelineCancel: { errors: [] } },
};
export const pipelineCancelMutationResponseFailed = {
- data: { pipelineRetry: { errors: ['error'] } },
+ data: { pipelineCancel: { errors: ['error'] } },
};
export const pipelineDeleteMutationResponseSuccess = {
- data: { pipelineRetry: { errors: [] } },
+ data: { pipelineDestroy: { errors: [] } },
};
export const pipelineDeleteMutationResponseFailed = {
- data: { pipelineRetry: { errors: ['error'] } },
+ data: { pipelineDestroy: { errors: ['error'] } },
};
export const mockPipelineHeader = {
diff --git a/spec/frontend/pipelines/pipeline_details_header_spec.js b/spec/frontend/pipelines/pipeline_details_header_spec.js
index deaf5c6f72f..5c75020afad 100644
--- a/spec/frontend/pipelines/pipeline_details_header_spec.js
+++ b/spec/frontend/pipelines/pipeline_details_header_spec.js
@@ -7,7 +7,6 @@ import waitForPromises from 'helpers/wait_for_promises';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import PipelineDetailsHeader from '~/pipelines/components/pipeline_details_header.vue';
import { BUTTON_TOOLTIP_RETRY, BUTTON_TOOLTIP_CANCEL } from '~/pipelines/constants';
-import TimeAgo from '~/pipelines/components/pipelines_list/time_ago.vue';
import CiBadgeLink from '~/vue_shared/components/ci_badge_link.vue';
import cancelPipelineMutation from '~/pipelines/graphql/mutations/cancel_pipeline.mutation.graphql';
import deletePipelineMutation from '~/pipelines/graphql/mutations/delete_pipeline.mutation.graphql';
@@ -59,19 +58,20 @@ describe('Pipeline details header', () => {
const findAlert = () => wrapper.findComponent(GlAlert);
const findStatus = () => wrapper.findComponent(CiBadgeLink);
const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
- const findTimeAgo = () => wrapper.findComponent(TimeAgo);
const findAllBadges = () => wrapper.findAllComponents(GlBadge);
+ const findDeleteModal = () => wrapper.findComponent(GlModal);
+ const findCreatedTimeAgo = () => wrapper.findByTestId('pipeline-created-time-ago');
+ const findFinishedTimeAgo = () => wrapper.findByTestId('pipeline-finished-time-ago');
const findPipelineName = () => wrapper.findByTestId('pipeline-name');
const findCommitTitle = () => wrapper.findByTestId('pipeline-commit-title');
const findTotalJobs = () => wrapper.findByTestId('total-jobs');
- const findComputeCredits = () => wrapper.findByTestId('compute-credits');
+ const findComputeMinutes = () => wrapper.findByTestId('compute-minutes');
const findCommitLink = () => wrapper.findByTestId('commit-link');
const findPipelineRunningText = () => wrapper.findByTestId('pipeline-running-text').text();
const findPipelineRefText = () => wrapper.findByTestId('pipeline-ref-text').text();
const findRetryButton = () => wrapper.findByTestId('retry-pipeline');
const findCancelButton = () => wrapper.findByTestId('cancel-pipeline');
const findDeleteButton = () => wrapper.findByTestId('delete-pipeline');
- const findDeleteModal = () => wrapper.findComponent(GlModal);
const findPipelineUserLink = () => wrapper.findByTestId('pipeline-user-link');
const findPipelineDuration = () => wrapper.findByTestId('pipeline-duration-text');
@@ -89,7 +89,7 @@ describe('Pipeline details header', () => {
const defaultProps = {
name: 'Ruby 3.0 master branch pipeline',
totalJobs: '50',
- computeCredits: '0.65',
+ computeMinutes: '0.65',
yamlErrors: 'errors',
failureReason: 'pipeline failed',
badges: {
@@ -216,28 +216,36 @@ describe('Pipeline details header', () => {
});
describe('finished pipeline', () => {
- it('displays compute credits when not zero', async () => {
+ it('displays compute minutes when not zero', async () => {
createComponent();
await waitForPromises();
- expect(findComputeCredits().text()).toBe('0.65');
+ expect(findComputeMinutes().text()).toBe('0.65');
+ });
+
+ it('does not display compute minutes when zero', async () => {
+ createComponent(defaultHandlers, { ...defaultProps, computeMinutes: '0.0' });
+
+ await waitForPromises();
+
+ expect(findComputeMinutes().exists()).toBe(false);
});
- it('does not display compute credits when zero', async () => {
- createComponent(defaultHandlers, { ...defaultProps, computeCredits: '0.0' });
+ it('does not display created time ago', async () => {
+ createComponent();
await waitForPromises();
- expect(findComputeCredits().exists()).toBe(false);
+ expect(findCreatedTimeAgo().exists()).toBe(false);
});
- it('displays time ago', async () => {
+ it('displays finished time ago', async () => {
createComponent();
await waitForPromises();
- expect(findTimeAgo().exists()).toBe(true);
+ expect(findFinishedTimeAgo().exists()).toBe(true);
});
it('displays pipeline duartion text', async () => {
@@ -258,12 +266,12 @@ describe('Pipeline details header', () => {
await waitForPromises();
});
- it('does not display compute credits', () => {
- expect(findComputeCredits().exists()).toBe(false);
+ it('does not display compute minutes', () => {
+ expect(findComputeMinutes().exists()).toBe(false);
});
- it('does not display time ago', () => {
- expect(findTimeAgo().exists()).toBe(false);
+ it('does not display finished time ago', () => {
+ expect(findFinishedTimeAgo().exists()).toBe(false);
});
it('does not display pipeline duration text', () => {
@@ -273,6 +281,10 @@ describe('Pipeline details header', () => {
it('displays pipeline running text', () => {
expect(findPipelineRunningText()).toBe('In progress, queued for 3,600 seconds');
});
+
+ it('displays created time ago', () => {
+ expect(findCreatedTimeAgo().exists()).toBe(true);
+ });
});
describe('running pipeline with duration', () => {
diff --git a/spec/frontend/pipelines/pipelines_artifacts_spec.js b/spec/frontend/pipelines/pipelines_artifacts_spec.js
index 9fedbaf9b56..1abc2887682 100644
--- a/spec/frontend/pipelines/pipelines_artifacts_spec.js
+++ b/spec/frontend/pipelines/pipelines_artifacts_spec.js
@@ -1,4 +1,9 @@
-import { GlDropdown, GlDropdownItem, GlSprintf } from '@gitlab/ui';
+import {
+ GlDisclosureDropdown,
+ GlDisclosureDropdownItem,
+ GlDisclosureDropdownGroup,
+ GlSprintf,
+} from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import PipelineArtifacts from '~/pipelines/components/pipelines_list/pipelines_artifacts.vue';
@@ -25,25 +30,27 @@ describe('Pipelines Artifacts dropdown', () => {
},
stubs: {
GlSprintf,
+ GlDisclosureDropdown,
+ GlDisclosureDropdownItem,
+ GlDisclosureDropdownGroup,
},
});
};
- const findDropdown = () => wrapper.findComponent(GlDropdown);
- const findFirstGlDropdownItem = () => wrapper.findComponent(GlDropdownItem);
- const findAllGlDropdownItems = () =>
- wrapper.findComponent(GlDropdown).findAllComponents(GlDropdownItem);
+ const findGlDropdown = () => wrapper.findComponent(GlDisclosureDropdown);
+ const findFirstGlDropdownItem = () => wrapper.findComponent(GlDisclosureDropdownItem);
it('should render a dropdown with all the provided artifacts', () => {
createComponent();
- expect(findAllGlDropdownItems()).toHaveLength(artifacts.length);
+ const [{ items }] = findGlDropdown().props('items');
+ expect(items).toHaveLength(artifacts.length);
});
it('should render a link with the provided path', () => {
createComponent();
- expect(findFirstGlDropdownItem().attributes('href')).toBe(artifacts[0].path);
+ expect(findFirstGlDropdownItem().props('item').href).toBe(artifacts[0].path);
expect(findFirstGlDropdownItem().text()).toBe(artifacts[0].name);
});
@@ -51,7 +58,7 @@ describe('Pipelines Artifacts dropdown', () => {
it('should not render the dropdown', () => {
createComponent({ mockArtifacts: [] });
- expect(findDropdown().exists()).toBe(false);
+ expect(findGlDropdown().exists()).toBe(false);
});
});
});
diff --git a/spec/frontend/pipelines/pipelines_table_spec.js b/spec/frontend/pipelines/pipelines_table_spec.js
index 10752cee841..251d823cc37 100644
--- a/spec/frontend/pipelines/pipelines_table_spec.js
+++ b/spec/frontend/pipelines/pipelines_table_spec.js
@@ -10,7 +10,6 @@ import PipelineTriggerer from '~/pipelines/components/pipelines_list/pipeline_tr
import PipelineUrl from '~/pipelines/components/pipelines_list/pipeline_url.vue';
import PipelinesTable from '~/pipelines/components/pipelines_list/pipelines_table.vue';
import PipelinesTimeago from '~/pipelines/components/pipelines_list/time_ago.vue';
-import PipelineFailedJobsWidget from '~/pipelines/components/pipelines_list/failure_widget/pipeline_failed_jobs_widget.vue';
import {
PipelineKeyOptions,
BUTTON_TOOLTIP_RETRY,
@@ -74,7 +73,6 @@ describe('Pipelines Table', () => {
const findPipelineMiniGraph = () => wrapper.findComponent(PipelineMiniGraph);
const findTimeAgo = () => wrapper.findComponent(PipelinesTimeago);
const findActions = () => wrapper.findComponent(PipelineOperations);
- const findPipelineFailedJobsWidget = () => wrapper.findComponent(PipelineFailedJobsWidget);
const findTableRows = () => wrapper.findAllByTestId('pipeline-table-row');
const findStatusTh = () => wrapper.findByTestId('status-th');
@@ -218,30 +216,6 @@ describe('Pipelines Table', () => {
});
});
});
-
- describe('widget', () => {
- describe('when there are no failed jobs', () => {
- beforeEach(() => {
- createComponent(
- { pipelines: [{ ...pipeline, failed_builds: [] }] },
- provideWithDetails,
- );
- });
-
- it('does not renders', () => {
- expect(findPipelineFailedJobsWidget().exists()).toBe(false);
- });
- });
-
- describe('when there are failed jobs', () => {
- beforeEach(() => {
- createComponent({ pipelines: [pipeline] }, provideWithDetails);
- });
- it('renders', () => {
- expect(findPipelineFailedJobsWidget().exists()).toBe(true);
- });
- });
- });
});
describe('tracking', () => {
diff --git a/spec/frontend/pipelines/time_ago_spec.js b/spec/frontend/pipelines/time_ago_spec.js
index 5afe91c4784..d2aa340a980 100644
--- a/spec/frontend/pipelines/time_ago_spec.js
+++ b/spec/frontend/pipelines/time_ago_spec.js
@@ -65,22 +65,11 @@ describe('Timeago component', () => {
expect(time.exists()).toBe(true);
});
- it('should display calendar icon by default', () => {
+ it('should display calendar icon', () => {
createComponent({ duration: 0, finished_at: '2017-04-26T12:40:23.277Z' });
expect(findCalendarIcon().exists()).toBe(true);
});
-
- it('should hide calendar icon if correct prop is passed', () => {
- createComponent(
- { duration: 0, finished_at: '2017-04-26T12:40:23.277Z' },
- {
- displayCalendarIcon: false,
- },
- );
-
- expect(findCalendarIcon().exists()).toBe(false);
- });
});
describe('without finishedTime', () => {
diff --git a/spec/frontend/profile/account/components/update_username_spec.js b/spec/frontend/profile/account/components/update_username_spec.js
index fa107600d64..a7052e53062 100644
--- a/spec/frontend/profile/account/components/update_username_spec.js
+++ b/spec/frontend/profile/account/components/update_username_spec.js
@@ -1,6 +1,6 @@
import { GlModal } from '@gitlab/ui';
import MockAdapter from 'axios-mock-adapter';
-import Vue, { nextTick } from 'vue';
+import { nextTick } from 'vue';
import waitForPromises from 'helpers/wait_for_promises';
import { TEST_HOST } from 'helpers/test_constants';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
@@ -8,6 +8,7 @@ import { createAlert } from '~/alert';
import axios from '~/lib/utils/axios_utils';
import { HTTP_STATUS_BAD_REQUEST, HTTP_STATUS_OK } from '~/lib/utils/http_status';
import UpdateUsername from '~/profile/account/components/update_username.vue';
+import { setVueErrorHandler, resetVueErrorHandler } from 'helpers/set_vue_error_handler';
jest.mock('~/alert');
@@ -43,7 +44,7 @@ describe('UpdateUsername component', () => {
afterEach(() => {
axiosMock.restore();
- Vue.config.errorHandler = null;
+ resetVueErrorHandler();
});
const findElements = () => {
@@ -60,7 +61,7 @@ describe('UpdateUsername component', () => {
};
const clickModalWithErrorResponse = () => {
- Vue.config.errorHandler = jest.fn(); // silence thrown error
+ setVueErrorHandler({ instance: wrapper.vm, handler: jest.fn() }); // silence thrown error
const { modal } = findElements();
modal.vm.$emit('primary');
return waitForPromises();
diff --git a/spec/frontend/profile/components/follow_spec.js b/spec/frontend/profile/components/follow_spec.js
index 2555e41257f..a2e8d065a46 100644
--- a/spec/frontend/profile/components/follow_spec.js
+++ b/spec/frontend/profile/components/follow_spec.js
@@ -1,11 +1,19 @@
-import { GlAvatarLabeled, GlAvatarLink, GlLoadingIcon, GlPagination } from '@gitlab/ui';
+import {
+ GlAvatarLabeled,
+ GlAvatarLink,
+ GlEmptyState,
+ GlLoadingIcon,
+ GlPagination,
+} from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import users from 'test_fixtures/api/users/followers/get.json';
import Follow from '~/profile/components/follow.vue';
import { DEFAULT_PER_PAGE } from '~/api';
+import { isCurrentUser } from '~/lib/utils/common_utils';
jest.mock('~/rest_api');
+jest.mock('~/lib/utils/common_utils');
describe('FollowersTab', () => {
let wrapper;
@@ -15,6 +23,13 @@ describe('FollowersTab', () => {
loading: false,
page: 1,
totalItems: 50,
+ currentUserEmptyStateTitle: 'UserProfile|You do not have any followers.',
+ visitorEmptyStateTitle: "UserProfile|This user doesn't have any followers.",
+ };
+
+ const defaultProvide = {
+ followEmptyState: '/illustrations/empty-state/empty-friends-md.svg',
+ userId: '1',
};
const createComponent = ({ propsData = {} } = {}) => {
@@ -23,11 +38,13 @@ describe('FollowersTab', () => {
...defaultPropsData,
...propsData,
},
+ provide: defaultProvide,
});
};
const findPagination = () => wrapper.findComponent(GlPagination);
const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
+ const findEmptyState = () => wrapper.findComponent(GlEmptyState);
describe('when `loading` prop is `true`', () => {
it('renders loading icon', () => {
@@ -95,5 +112,35 @@ describe('FollowersTab', () => {
expect(wrapper.emitted('pagination-input')).toEqual([[nextPage]]);
});
});
+
+ describe('when the users prop is empty', () => {
+ describe('when user is the current user', () => {
+ beforeEach(() => {
+ isCurrentUser.mockImplementation(() => true);
+ createComponent({ propsData: { users: [] } });
+ });
+
+ it('displays empty state with correct message', () => {
+ expect(findEmptyState().props()).toMatchObject({
+ svgPath: defaultProvide.followEmptyState,
+ title: defaultPropsData.currentUserEmptyStateTitle,
+ });
+ });
+ });
+
+ describe('when user is a visitor', () => {
+ beforeEach(() => {
+ isCurrentUser.mockImplementation(() => false);
+ createComponent({ propsData: { users: [] } });
+ });
+
+ it('displays empty state with correct message', () => {
+ expect(findEmptyState().props()).toMatchObject({
+ svgPath: defaultProvide.followEmptyState,
+ title: defaultPropsData.visitorEmptyStateTitle,
+ });
+ });
+ });
+ });
});
});
diff --git a/spec/frontend/profile/components/followers_tab_spec.js b/spec/frontend/profile/components/followers_tab_spec.js
index 0370005d0a4..75586a2c9ea 100644
--- a/spec/frontend/profile/components/followers_tab_spec.js
+++ b/spec/frontend/profile/components/followers_tab_spec.js
@@ -75,6 +75,8 @@ describe('FollowersTab', () => {
loading: false,
page: 1,
totalItems: 6,
+ currentUserEmptyStateTitle: FollowersTab.i18n.currentUserEmptyStateTitle,
+ visitorEmptyStateTitle: FollowersTab.i18n.visitorEmptyStateTitle,
});
});
diff --git a/spec/frontend/profile/components/following_tab_spec.js b/spec/frontend/profile/components/following_tab_spec.js
index c0583cf4877..48d84187739 100644
--- a/spec/frontend/profile/components/following_tab_spec.js
+++ b/spec/frontend/profile/components/following_tab_spec.js
@@ -1,32 +1,114 @@
import { GlBadge, GlTab } from '@gitlab/ui';
-
+import { shallowMount } from '@vue/test-utils';
+import following from 'test_fixtures/api/users/following/get.json';
import { s__ } from '~/locale';
import FollowingTab from '~/profile/components/following_tab.vue';
-import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import Follow from '~/profile/components/follow.vue';
+import { getUserFollowing } from '~/rest_api';
+import { createAlert } from '~/alert';
+import waitForPromises from 'helpers/wait_for_promises';
+
+const MOCK_FOLLOWEES_COUNT = 2;
+const MOCK_TOTAL_FOLLOWING = 6;
+const MOCK_PAGE = 1;
+
+jest.mock('~/rest_api');
+jest.mock('~/alert');
describe('FollowingTab', () => {
let wrapper;
const createComponent = () => {
- wrapper = shallowMountExtended(FollowingTab, {
+ wrapper = shallowMount(FollowingTab, {
provide: {
- followeesCount: 3,
+ followeesCount: MOCK_FOLLOWEES_COUNT,
+ userId: 1,
+ },
+ stubs: {
+ GlTab,
},
});
};
- it('renders `GlTab` and sets title', () => {
- createComponent();
+ const findGlBadge = () => wrapper.findComponent(GlBadge);
+ const findFollow = () => wrapper.findComponent(Follow);
+
+ describe('when API request is loading', () => {
+ beforeEach(() => {
+ getUserFollowing.mockReturnValueOnce(new Promise(() => {}));
+ createComponent();
+ });
+
+ it('renders `Follow` component and sets `loading` prop to `true`', () => {
+ expect(findFollow().props('loading')).toBe(true);
+ });
+ });
+
+ describe('when API request is successful', () => {
+ beforeEach(() => {
+ getUserFollowing.mockResolvedValueOnce({
+ data: following,
+ headers: { 'X-TOTAL': `${MOCK_TOTAL_FOLLOWING}` },
+ });
+ createComponent();
+ });
+
+ it('renders `GlTab` and sets title', () => {
+ expect(wrapper.findComponent(GlTab).text()).toContain(s__('UserProfile|Following'));
+ });
+
+ it('renders `GlBadge`, sets size and content', () => {
+ expect(findGlBadge().props('size')).toBe('sm');
+ expect(findGlBadge().text()).toBe(`${MOCK_FOLLOWEES_COUNT}`);
+ });
+
+ it('renders `Follow` component and passes correct props', () => {
+ expect(findFollow().props()).toMatchObject({
+ users: following,
+ loading: false,
+ page: MOCK_PAGE,
+ totalItems: MOCK_TOTAL_FOLLOWING,
+ currentUserEmptyStateTitle: FollowingTab.i18n.currentUserEmptyStateTitle,
+ visitorEmptyStateTitle: FollowingTab.i18n.visitorEmptyStateTitle,
+ });
+ });
+
+ describe('when `Follow` component emits `pagination-input` event', () => {
+ it('calls API and updates `users` and `page` props', async () => {
+ const NEXT_PAGE = MOCK_PAGE + 1;
+ const NEXT_PAGE_FOLLOWING = [{ id: 999, name: 'page 2 following' }];
- expect(wrapper.findComponent(GlTab).element.textContent).toContain(
- s__('UserProfile|Following'),
- );
+ getUserFollowing.mockResolvedValueOnce({
+ data: NEXT_PAGE_FOLLOWING,
+ headers: { 'X-TOTAL': `${MOCK_TOTAL_FOLLOWING}` },
+ });
+
+ findFollow().vm.$emit('pagination-input', NEXT_PAGE);
+
+ await waitForPromises();
+
+ expect(findFollow().props()).toMatchObject({
+ users: NEXT_PAGE_FOLLOWING,
+ loading: false,
+ page: NEXT_PAGE,
+ totalItems: MOCK_TOTAL_FOLLOWING,
+ });
+ });
+ });
});
- it('renders `GlBadge`, sets size and content', () => {
- createComponent();
+ describe('when API request is not successful', () => {
+ beforeEach(() => {
+ getUserFollowing.mockRejectedValueOnce(new Error());
+ createComponent();
+ });
- expect(wrapper.findComponent(GlBadge).attributes('size')).toBe('sm');
- expect(wrapper.findComponent(GlBadge).element.textContent).toBe('3');
+ it('shows error alert', () => {
+ expect(createAlert).toHaveBeenCalledWith({
+ message: FollowingTab.i18n.errorMessage,
+ error: new Error(),
+ captureError: true,
+ });
+ });
});
});
diff --git a/spec/frontend/profile/components/profile_tabs_spec.js b/spec/frontend/profile/components/profile_tabs_spec.js
index f3dda2e205f..3474bbf8d0c 100644
--- a/spec/frontend/profile/components/profile_tabs_spec.js
+++ b/spec/frontend/profile/components/profile_tabs_spec.js
@@ -4,6 +4,7 @@ import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import { createAlert } from '~/alert';
import { getUserProjects } from '~/rest_api';
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
+import { VISIBILITY_LEVEL_PUBLIC_STRING } from '~/visibility_level/constants';
import OverviewTab from '~/profile/components/overview_tab.vue';
import ActivityTab from '~/profile/components/activity_tab.vue';
import GroupsTab from '~/profile/components/groups_tab.vue';
@@ -60,18 +61,30 @@ describe('ProfileTabs', () => {
});
describe('when personal projects API request is successful', () => {
- beforeEach(async () => {
+ it('passes correct props to `OverviewTab` component', async () => {
getUserProjects.mockResolvedValueOnce({ data: projects });
createComponent();
await waitForPromises();
- });
- it('passes correct props to `OverviewTab` component', () => {
expect(wrapper.findComponent(OverviewTab).props()).toMatchObject({
personalProjects: convertObjectPropsToCamelCase(projects, { deep: true }),
personalProjectsLoading: false,
});
});
+
+ describe('when projects do not have `visibility` key', () => {
+ it('sets visibility to public', async () => {
+ const [{ visibility, ...projectWithoutVisibility }] = projects;
+
+ getUserProjects.mockResolvedValueOnce({ data: [projectWithoutVisibility] });
+ createComponent();
+ await waitForPromises();
+
+ expect(wrapper.findComponent(OverviewTab).props('personalProjects')[0].visibility).toBe(
+ VISIBILITY_LEVEL_PUBLIC_STRING,
+ );
+ });
+ });
});
describe('when personal projects API request is not successful', () => {
diff --git a/spec/frontend/profile/components/snippets/snippets_tab_spec.js b/spec/frontend/profile/components/snippets/snippets_tab_spec.js
index 47e2fbcf2c0..5992bb03e4d 100644
--- a/spec/frontend/profile/components/snippets/snippets_tab_spec.js
+++ b/spec/frontend/profile/components/snippets/snippets_tab_spec.js
@@ -7,6 +7,7 @@ import { SNIPPET_MAX_LIST_COUNT } from '~/profile/constants';
import SnippetsTab from '~/profile/components/snippets/snippets_tab.vue';
import SnippetRow from '~/profile/components/snippets/snippet_row.vue';
import getUserSnippets from '~/profile/components/graphql/get_user_snippets.query.graphql';
+import { isCurrentUser } from '~/lib/utils/common_utils';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import createMockApollo from 'helpers/mock_apollo_helper';
import {
@@ -15,8 +16,14 @@ import {
MOCK_USER_SNIPPETS_RES,
MOCK_USER_SNIPPETS_PAGINATION_RES,
MOCK_USER_SNIPPETS_EMPTY_RES,
+ MOCK_NEW_SNIPPET_PATH,
} from 'jest/profile/mock_data';
+jest.mock('~/lib/utils/common_utils');
+jest.mock('~/helpers/help_page_helper', () => ({
+ helpPagePath: jest.fn().mockImplementation(() => 'http://127.0.0.1:3000/help/user/snippets'),
+}));
+
Vue.use(VueApollo);
describe('UserProfileSnippetsTab', () => {
@@ -32,6 +39,7 @@ describe('UserProfileSnippetsTab', () => {
provide: {
userId: MOCK_USER.id,
snippetsEmptyState: MOCK_SNIPPETS_EMPTY_STATE,
+ newSnippetPath: MOCK_NEW_SNIPPET_PATH,
},
});
};
@@ -52,9 +60,38 @@ describe('UserProfileSnippetsTab', () => {
expect(findSnippetRows().exists()).toBe(false);
});
- it('does render empty state with correct svg', () => {
- expect(findGlEmptyState().exists()).toBe(true);
- expect(findGlEmptyState().attributes('svgpath')).toBe(MOCK_SNIPPETS_EMPTY_STATE);
+ describe('when user is the current user', () => {
+ beforeEach(() => {
+ isCurrentUser.mockImplementation(() => true);
+ createComponent();
+ });
+
+ it('displays empty state with correct message', () => {
+ expect(findGlEmptyState().props()).toMatchObject({
+ svgPath: MOCK_SNIPPETS_EMPTY_STATE,
+ title: SnippetsTab.i18n.currentUserEmptyStateTitle,
+ description: SnippetsTab.i18n.emptyStateDescription,
+ primaryButtonLink: MOCK_NEW_SNIPPET_PATH,
+ primaryButtonText: SnippetsTab.i18n.newSnippet,
+ secondaryButtonLink: 'http://127.0.0.1:3000/help/user/snippets',
+ secondaryButtonText: SnippetsTab.i18n.learnMore,
+ });
+ });
+ });
+
+ describe('when user is a visitor', () => {
+ beforeEach(() => {
+ isCurrentUser.mockImplementation(() => false);
+ createComponent();
+ });
+
+ it('displays empty state with correct message', () => {
+ expect(findGlEmptyState().props()).toMatchObject({
+ svgPath: MOCK_SNIPPETS_EMPTY_STATE,
+ title: SnippetsTab.i18n.visitorEmptyStateTitle,
+ description: null,
+ });
+ });
});
});
diff --git a/spec/frontend/profile/mock_data.js b/spec/frontend/profile/mock_data.js
index 856534aebd3..6c4ff0a84f9 100644
--- a/spec/frontend/profile/mock_data.js
+++ b/spec/frontend/profile/mock_data.js
@@ -22,6 +22,7 @@ export const userCalendarResponse = {
};
export const MOCK_SNIPPETS_EMPTY_STATE = 'illustrations/empty-state/empty-snippets-md.svg';
+export const MOCK_NEW_SNIPPET_PATH = '/-/snippets/new';
export const MOCK_USER = {
id: '1',
diff --git a/spec/frontend/profile/preferences/components/profile_preferences_spec.js b/spec/frontend/profile/preferences/components/profile_preferences_spec.js
index 21167dccda9..144d9e76869 100644
--- a/spec/frontend/profile/preferences/components/profile_preferences_spec.js
+++ b/spec/frontend/profile/preferences/components/profile_preferences_spec.js
@@ -47,10 +47,6 @@ describe('ProfilePreferences component', () => {
);
}
- function findIntegrationsDivider() {
- return wrapper.findByTestId('profile-preferences-integrations-rule');
- }
-
function findIntegrationsHeading() {
return wrapper.findByTestId('profile-preferences-integrations-heading');
}
@@ -86,21 +82,17 @@ describe('ProfilePreferences component', () => {
it('should not render Integrations section', () => {
wrapper = createComponent();
const views = wrapper.findAllComponents(IntegrationView);
- const divider = findIntegrationsDivider();
const heading = findIntegrationsHeading();
- expect(divider.exists()).toBe(false);
expect(heading.exists()).toBe(false);
expect(views).toHaveLength(0);
});
it('should render Integration section', () => {
wrapper = createComponent({ provide: { integrationViews } });
- const divider = findIntegrationsDivider();
const heading = findIntegrationsHeading();
const views = wrapper.findAllComponents(IntegrationView);
- expect(divider.exists()).toBe(true);
expect(heading.exists()).toBe(true);
expect(views).toHaveLength(integrationViews.length);
});
diff --git a/spec/frontend/projects/commits/components/author_select_spec.js b/spec/frontend/projects/commits/components/author_select_spec.js
index 630b8feafbc..50e3f2d0f37 100644
--- a/spec/frontend/projects/commits/components/author_select_spec.js
+++ b/spec/frontend/projects/commits/components/author_select_spec.js
@@ -1,12 +1,17 @@
-import { GlDropdown, GlDropdownSectionHeader, GlSearchBoxByType, GlDropdownItem } from '@gitlab/ui';
+import { GlCollapsibleListbox, GlListboxItem } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
import Vuex from 'vuex';
-import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
+import { resetHTMLFixture, setHTMLFixture } from 'helpers/fixtures';
import setWindowLocation from 'helpers/set_window_location_helper';
-import * as urlUtility from '~/lib/utils/url_utility';
import AuthorSelect from '~/projects/commits/components/author_select.vue';
import { createStore } from '~/projects/commits/store';
+import { visitUrl } from '~/lib/utils/url_utility';
+
+jest.mock('~/lib/utils/url_utility', () => ({
+ ...jest.requireActual('~/lib/utils/url_utility'),
+ visitUrl: jest.fn(),
+}));
Vue.use(Vuex);
@@ -44,6 +49,10 @@ describe('Author Select', () => {
propsData: {
projectCommitsEl: document.querySelector('.js-project-commits-show'),
},
+ stubs: {
+ GlCollapsibleListbox,
+ GlListboxItem,
+ },
});
};
@@ -58,11 +67,9 @@ describe('Author Select', () => {
resetHTMLFixture();
});
- const findDropdownContainer = () => wrapper.findComponent({ ref: 'dropdownContainer' });
- const findDropdown = () => wrapper.findComponent(GlDropdown);
- const findDropdownHeader = () => wrapper.findComponent(GlDropdownSectionHeader);
- const findSearchBox = () => wrapper.findComponent(GlSearchBoxByType);
- const findDropdownItems = () => wrapper.findAllComponents(GlDropdownItem);
+ const findListboxContainer = () => wrapper.findComponent({ ref: 'listboxContainer' });
+ const findListbox = () => wrapper.findComponent(GlCollapsibleListbox);
+ const findListboxItems = () => wrapper.findAllComponents(GlListboxItem);
describe('user is searching via "filter by commit message"', () => {
beforeEach(() => {
@@ -70,24 +77,28 @@ describe('Author Select', () => {
createComponent();
});
- it('does not disable dropdown container', () => {
- expect(findDropdownContainer().attributes('disabled')).toBeUndefined();
+ it('does not disable listbox container', () => {
+ expect(findListboxContainer().attributes('disabled')).toBeUndefined();
});
it('has correct tooltip message', () => {
- expect(findDropdownContainer().attributes('title')).toBe(
+ expect(findListboxContainer().attributes('title')).toBe(
'Searching by both author and message is currently not supported.',
);
});
- it('disables dropdown', () => {
- expect(findDropdown().attributes('disabled')).toBeDefined();
+ it('disables listbox', () => {
+ expect(findListbox().attributes('disabled')).toBeDefined();
});
});
- describe('dropdown', () => {
+ describe('listbox', () => {
+ beforeEach(() => {
+ store.state.commitsPath = commitsPath;
+ });
+
it('displays correct default text', () => {
- expect(findDropdown().attributes('text')).toBe('Author');
+ expect(findListbox().props('toggleText')).toBe('Author');
});
it('displays the current selected author', async () => {
@@ -95,81 +106,62 @@ describe('Author Select', () => {
createComponent();
await nextTick();
- expect(findDropdown().attributes('text')).toBe(currentAuthor);
+ expect(findListbox().props('toggleText')).toBe(currentAuthor);
});
it('displays correct header text', () => {
- expect(findDropdownHeader().text()).toBe('Search by author');
+ expect(findListbox().props('headerText')).toBe('Search by author');
});
it('does not have popover text by default', () => {
expect(wrapper.attributes('title')).toBeUndefined();
});
+
+ it('passes selected author to redirectPath', () => {
+ const redirectPath = `${commitsPath}?author=${currentAuthor}`;
+
+ findListbox().vm.$emit('select', currentAuthor);
+
+ expect(visitUrl).toHaveBeenCalledWith(redirectPath);
+ });
+
+ it('does not pass any author to redirectPath', () => {
+ const redirectPath = commitsPath;
+
+ findListbox().vm.$emit('select', '');
+
+ expect(visitUrl).toHaveBeenCalledWith(redirectPath);
+ });
});
- describe('dropdown search box', () => {
+ describe('listbox search box', () => {
it('has correct placeholder', () => {
- expect(findSearchBox().attributes('placeholder')).toBe('Search');
+ expect(findListbox().props('searchPlaceholder')).toBe('Search');
});
it('fetch authors on input change', () => {
const authorName = 'lorem';
- findSearchBox().vm.$emit('input', authorName);
+ findListbox().vm.$emit('search', authorName);
expect(store.actions.fetchAuthors).toHaveBeenCalledWith(expect.anything(), authorName);
});
});
- describe('dropdown list', () => {
+ describe('listbox list', () => {
beforeEach(() => {
store.state.commitsAuthors = authors;
- store.state.commitsPath = commitsPath;
});
it('has a "Any Author" as the first list item', () => {
- expect(findDropdownItems().at(0).text()).toBe('Any Author');
+ expect(findListboxItems().at(0).text()).toBe('Any Author');
});
it('displays the project authors', () => {
- expect(findDropdownItems()).toHaveLength(authors.length + 1);
- });
-
- it('has the correct props', async () => {
- setWindowLocation(`?author=${currentAuthor}`);
- createComponent();
-
- const [{ avatar_url: avatarUrl, username }] = authors;
- const result = {
- avatarUrl,
- secondaryText: username,
- isChecked: true,
- };
-
- await nextTick();
- expect(findDropdownItems().at(1).props()).toEqual(expect.objectContaining(result));
+ expect(findListboxItems()).toHaveLength(authors.length + 1);
});
it("display the author's name", () => {
- expect(findDropdownItems().at(1).text()).toBe(currentAuthor);
- });
-
- it('passes selected author to redirectPath', () => {
- const redirectToUrl = `${commitsPath}?author=${currentAuthor}`;
- const spy = jest.spyOn(urlUtility, 'redirectTo');
- spy.mockImplementation(() => 'mock');
-
- findDropdownItems().at(1).vm.$emit('click');
-
- expect(spy).toHaveBeenCalledWith(redirectToUrl);
- });
-
- it('does not pass any author to redirectPath', () => {
- const redirectToUrl = commitsPath;
- const spy = jest.spyOn(urlUtility, 'redirectTo');
- spy.mockImplementation();
-
- findDropdownItems().at(0).vm.$emit('click');
- expect(spy).toHaveBeenCalledWith(redirectToUrl);
+ expect(findListboxItems().at(1).text()).toContain(currentAuthor);
});
});
});
diff --git a/spec/frontend/projects/compare/components/app_spec.js b/spec/frontend/projects/compare/components/app_spec.js
index ee96f46ea0c..6cc76d4a573 100644
--- a/spec/frontend/projects/compare/components/app_spec.js
+++ b/spec/frontend/projects/compare/components/app_spec.js
@@ -1,23 +1,37 @@
-import { GlButton } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
+import { GlIcon, GlLink, GlSprintf, GlFormGroup, GlFormRadioGroup, GlFormRadio } from '@gitlab/ui';
import { nextTick } from 'vue';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import CompareApp from '~/projects/compare/components/app.vue';
+import {
+ COMPARE_REVISIONS_DOCS_URL,
+ I18N,
+ COMPARE_OPTIONS,
+ COMPARE_OPTIONS_INPUT_NAME,
+} from '~/projects/compare/constants';
import RevisionCard from '~/projects/compare/components/revision_card.vue';
+import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
import { appDefaultProps as defaultProps } from './mock_data';
jest.mock('~/lib/utils/csrf', () => ({ token: 'mock-csrf-token' }));
describe('CompareApp component', () => {
let wrapper;
- const findSourceRevisionCard = () => wrapper.find('[data-testid="sourceRevisionCard"]');
- const findTargetRevisionCard = () => wrapper.find('[data-testid="targetRevisionCard"]');
+ const findSourceRevisionCard = () => wrapper.findByTestId('sourceRevisionCard');
+ const findTargetRevisionCard = () => wrapper.findByTestId('targetRevisionCard');
const createComponent = (props = {}) => {
- wrapper = shallowMount(CompareApp, {
+ wrapper = shallowMountExtended(CompareApp, {
propsData: {
...defaultProps,
...props,
},
+ directives: {
+ GlTooltip: createMockDirective('gl-tooltip'),
+ },
+ stubs: {
+ GlSprintf,
+ GlFormRadioGroup,
+ },
});
};
@@ -37,6 +51,21 @@ describe('CompareApp component', () => {
);
});
+ it('renders title', () => {
+ const title = wrapper.find('h1');
+ expect(title.text()).toBe(I18N.title);
+ });
+
+ it('renders subtitle', () => {
+ const subtitle = wrapper.find('p');
+ expect(subtitle.text()).toMatchInterpolatedText(I18N.subtitle);
+ });
+
+ it('renders link to docs', () => {
+ const docsLink = wrapper.findComponent(GlLink);
+ expect(docsLink.attributes('href')).toBe(COMPARE_REVISIONS_DOCS_URL);
+ });
+
it('contains the correct form attributes', () => {
expect(wrapper.attributes('action')).toBe(defaultProps.projectCompareIndexPath);
expect(wrapper.attributes('method')).toBe('POST');
@@ -48,20 +77,16 @@ describe('CompareApp component', () => {
);
});
- it('has ellipsis', () => {
- expect(wrapper.find('[data-testid="ellipsis"]').exists()).toBe(true);
- });
-
it('render Source and Target BranchDropdown components', () => {
const revisionCards = wrapper.findAllComponents(RevisionCard);
expect(revisionCards.length).toBe(2);
- expect(revisionCards.at(0).props('revisionText')).toBe('Source');
- expect(revisionCards.at(1).props('revisionText')).toBe('Target');
+ expect(revisionCards.at(0).props('revisionText')).toBe(I18N.source);
+ expect(revisionCards.at(1).props('revisionText')).toBe(I18N.target);
});
describe('compare button', () => {
- const findCompareButton = () => wrapper.findComponent(GlButton);
+ const findCompareButton = () => wrapper.findByTestId('compare-button');
it('renders button', () => {
expect(findCompareButton().exists()).toBe(true);
@@ -109,14 +134,19 @@ describe('CompareApp component', () => {
});
describe('swap revisions button', () => {
- const findSwapRevisionsButton = () => wrapper.find('[data-testid="swapRevisionsButton"]');
+ const findSwapRevisionsButton = () => wrapper.findByTestId('swapRevisionsButton');
it('renders the swap revisions button', () => {
expect(findSwapRevisionsButton().exists()).toBe(true);
});
- it('has the correct text', () => {
- expect(findSwapRevisionsButton().text()).toBe('Swap revisions');
+ it('renders icon', () => {
+ expect(findSwapRevisionsButton().findComponent(GlIcon).props('name')).toBe('substitute');
+ });
+
+ it('has tooltip', () => {
+ const tooltip = getBinding(findSwapRevisionsButton().element, 'gl-tooltip');
+ expect(tooltip.value).toBe(I18N.swapRevisions);
});
it('swaps revisions when clicked', async () => {
@@ -129,43 +159,43 @@ describe('CompareApp component', () => {
});
});
- describe('mode dropdown', () => {
- const findModeDropdownButton = () => wrapper.find('[data-testid="modeDropdown"]');
- const findEnableStraightModeButton = () =>
- wrapper.find('[data-testid="enableStraightModeButton"]');
- const findDisableStraightModeButton = () =>
- wrapper.find('[data-testid="disableStraightModeButton"]');
+ describe('compare options', () => {
+ const findGroup = () => wrapper.findComponent(GlFormGroup);
+ const findOptionsGroup = () => wrapper.findComponent(GlFormRadioGroup);
- it('renders the mode dropdown button', () => {
- expect(findModeDropdownButton().exists()).toBe(true);
- });
+ const findOptions = () => wrapper.findAllComponents(GlFormRadio);
- it('has the correct text', () => {
- expect(findEnableStraightModeButton().text()).toBe('...');
- expect(findDisableStraightModeButton().text()).toBe('..');
+ it('renders label for the compare options', () => {
+ expect(findGroup().attributes('label')).toBe(I18N.optionsLabel);
});
- it('straight mode button when clicked', async () => {
- expect(wrapper.props('straight')).toBe(false);
- expect(wrapper.find('input[name="straight"]').attributes('value')).toBe('false');
+ it('correct input name', () => {
+ expect(findOptionsGroup().attributes('name')).toBe(COMPARE_OPTIONS_INPUT_NAME);
+ });
- findEnableStraightModeButton().vm.$emit('click');
+ it('renders "only incoming changes" option', () => {
+ expect(findOptions().at(0).text()).toBe(COMPARE_OPTIONS[0].text);
+ });
- await nextTick();
+ it('renders "since source was created" option', () => {
+ expect(findOptions().at(1).text()).toBe(COMPARE_OPTIONS[1].text);
+ });
- expect(wrapper.find('input[name="straight"]').attributes('value')).toBe('true');
+ it('straight mode button when clicked', async () => {
+ expect(wrapper.props('straight')).toBe(false);
+ expect(wrapper.vm.isStraight).toBe(false);
- findDisableStraightModeButton().vm.$emit('click');
+ findOptionsGroup().vm.$emit('input', COMPARE_OPTIONS[1].value);
await nextTick();
- expect(wrapper.find('input[name="straight"]').attributes('value')).toBe('false');
+ expect(wrapper.vm.isStraight).toBe(true);
});
});
describe('merge request buttons', () => {
- const findProjectMrButton = () => wrapper.find('[data-testid="projectMrButton"]');
- const findCreateMrButton = () => wrapper.find('[data-testid="createMrButton"]');
+ const findProjectMrButton = () => wrapper.findByTestId('projectMrButton');
+ const findCreateMrButton = () => wrapper.findByTestId('createMrButton');
it('does not have merge request buttons', () => {
createComponent();
diff --git a/spec/frontend/projects/new/components/__snapshots__/app_spec.js.snap b/spec/frontend/projects/new/components/__snapshots__/app_spec.js.snap
new file mode 100644
index 00000000000..0c4d63c3509
--- /dev/null
+++ b/spec/frontend/projects/new/components/__snapshots__/app_spec.js.snap
@@ -0,0 +1,30 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Experimental new project creation app creates correct panels 1`] = `
+Array [
+ Object {
+ "description": "Create a blank project to store your files, plan your work, and collaborate on code, among other things.",
+ "imageSrc": "file-mock",
+ "key": "blank",
+ "name": "blank_project",
+ "selector": "#blank-project-pane",
+ "title": "Create blank project",
+ },
+ Object {
+ "description": "Create a project pre-populated with the necessary files to get you started quickly.",
+ "imageSrc": "file-mock",
+ "key": "template",
+ "name": "create_from_template",
+ "selector": "#create-from-template-pane",
+ "title": "Create from template",
+ },
+ Object {
+ "description": "Migrate your data from an external source like GitHub, Bitbucket, or another instance of GitLab.",
+ "imageSrc": "file-mock",
+ "key": "import",
+ "name": "import_project",
+ "selector": "#import-project-pane",
+ "title": "Import project",
+ },
+]
+`;
diff --git a/spec/frontend/projects/new/components/app_spec.js b/spec/frontend/projects/new/components/app_spec.js
index 60d8385eb91..006114e7254 100644
--- a/spec/frontend/projects/new/components/app_spec.js
+++ b/spec/frontend/projects/new/components/app_spec.js
@@ -23,6 +23,12 @@ describe('Experimental new project creation app', () => {
expect(wrapper.find(guidelineSelector).text()).toBe(DEMO_GUIDELINES);
});
+ it('creates correct panels', () => {
+ createComponent();
+
+ expect(findNewNamespacePage().props('panels')).toMatchSnapshot();
+ });
+
it.each`
isCiCdAvailable | outcome
${false} | ${'do not show CI/CD panel'}
diff --git a/spec/frontend/projects/settings/access_dropdown_spec.js b/spec/frontend/projects/settings/access_dropdown_spec.js
index d51360a7597..a94d7669b2b 100644
--- a/spec/frontend/projects/settings/access_dropdown_spec.js
+++ b/spec/frontend/projects/settings/access_dropdown_spec.js
@@ -158,6 +158,31 @@ describe('AccessDropdown', () => {
expect(template).not.toContain(user.name);
});
+
+ it('show user avatar correctly', () => {
+ const user = {
+ id: 613,
+ avatar_url: 'some_valid_avatar.png',
+ name: 'test',
+ username: 'test',
+ };
+ const template = dropdown.userRowHtml(user);
+
+ expect(template).toContain(user.avatar_url);
+ expect(template).not.toContain('identicon');
+ });
+
+ it('show identicon when user do not have avatar', () => {
+ const user = {
+ id: 613,
+ avatar_url: '',
+ name: 'test',
+ username: 'test',
+ };
+ const template = dropdown.userRowHtml(user);
+
+ expect(template).toContain('identicon');
+ });
});
describe('deployKeyRowHtml', () => {
diff --git a/spec/frontend/projects/settings/branch_rules/components/view/index_spec.js b/spec/frontend/projects/settings/branch_rules/components/view/index_spec.js
index 077995ab6e4..76d45692a63 100644
--- a/spec/frontend/projects/settings/branch_rules/components/view/index_spec.js
+++ b/spec/frontend/projects/settings/branch_rules/components/view/index_spec.js
@@ -91,7 +91,6 @@ describe('View branch rules', () => {
expect(findBranchName().text()).toBe(I18N.allBranches);
expect(findBranchTitle().text()).toBe(I18N.targetBranch);
- jest.restoreAllMocks();
});
it('renders the correct branch title', () => {
diff --git a/spec/frontend/projects/settings_service_desk/components/service_desk_root_spec.js b/spec/frontend/projects/settings_service_desk/components/service_desk_root_spec.js
index 7f6ecbac748..b84d1c9c0aa 100644
--- a/spec/frontend/projects/settings_service_desk/components/service_desk_root_spec.js
+++ b/spec/frontend/projects/settings_service_desk/components/service_desk_root_spec.js
@@ -13,8 +13,8 @@ describe('ServiceDeskRoot', () => {
let spy;
const provideData = {
- customEmail: 'custom.email@example.com',
- customEmailEnabled: true,
+ serviceDeskEmail: 'custom.email@example.com',
+ serviceDeskEmailEnabled: true,
endpoint: '/gitlab-org/gitlab-test/service_desk',
initialIncomingEmail: 'servicedeskaddress@example.com',
initialIsEnabled: true,
@@ -52,8 +52,8 @@ describe('ServiceDeskRoot', () => {
wrapper = createComponent();
expect(wrapper.findComponent(ServiceDeskSetting).props()).toEqual({
- customEmail: provideData.customEmail,
- customEmailEnabled: provideData.customEmailEnabled,
+ serviceDeskEmail: provideData.serviceDeskEmail,
+ serviceDeskEmailEnabled: provideData.serviceDeskEmailEnabled,
incomingEmail: provideData.initialIncomingEmail,
initialOutgoingName: provideData.outgoingName,
initialProjectKey: provideData.projectKey,
@@ -80,7 +80,7 @@ describe('ServiceDeskRoot', () => {
const alertBodyLink = alertEl.findComponent(GlLink);
expect(alertBodyLink.exists()).toBe(true);
expect(alertBodyLink.attributes('href')).toBe(
- '/help/user/project/service_desk.html#use-a-custom-email-address',
+ '/help/user/project/service_desk.html#use-an-additional-service-desk-alias-email',
);
expect(alertBodyLink.text()).toBe('How do I create a custom email address?');
});
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 5631927cc2f..260fd200f03 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
@@ -134,26 +134,26 @@ describe('ServiceDeskSetting', () => {
});
});
- describe('with customEmail', () => {
- describe('customEmail is different than incomingEmail', () => {
+ describe('with serviceDeskEmail', () => {
+ describe('serviceDeskEmail is different than incomingEmail', () => {
const incomingEmail = 'foo@bar.com';
- const customEmail = 'custom@bar.com';
+ const serviceDeskEmail = 'servicedesk@bar.com';
beforeEach(() => {
wrapper = createComponent({
- props: { incomingEmail, customEmail },
+ props: { incomingEmail, serviceDeskEmail },
});
});
- it('should see custom email', () => {
- expect(findIncomingEmail().element.value).toEqual(customEmail);
+ it('should see service desk email', () => {
+ expect(findIncomingEmail().element.value).toEqual(serviceDeskEmail);
});
});
describe('project suffix', () => {
it('input is hidden', () => {
wrapper = createComponent({
- props: { customEmailEnabled: false },
+ props: { serviceDeskEmailEnabled: false },
});
const input = wrapper.findByTestId('project-suffix');
@@ -163,7 +163,7 @@ describe('ServiceDeskSetting', () => {
it('input is enabled', () => {
wrapper = createComponent({
- props: { customEmailEnabled: true },
+ props: { serviceDeskEmailEnabled: true },
});
const input = wrapper.findByTestId('project-suffix');
@@ -174,7 +174,7 @@ describe('ServiceDeskSetting', () => {
it('shows error when value contains uppercase or special chars', async () => {
wrapper = createComponent({
- props: { email: 'foo@bar.com', customEmailEnabled: true },
+ props: { email: 'foo@bar.com', serviceDeskEmailEnabled: true },
});
const input = wrapper.findByTestId('project-suffix');
@@ -189,16 +189,16 @@ describe('ServiceDeskSetting', () => {
});
});
- describe('customEmail is the same as incomingEmail', () => {
+ describe('serviceDeskEmail is the same as incomingEmail', () => {
const email = 'foo@bar.com';
beforeEach(() => {
wrapper = createComponent({
- props: { incomingEmail: email, customEmail: email },
+ props: { incomingEmail: email, serviceDeskEmail: email },
});
});
- it('should see custom email', () => {
+ it('should see service desk email', () => {
expect(findIncomingEmail().element.value).toEqual(email);
});
});
diff --git a/spec/frontend/projects/terraform_notification/terraform_notification_spec.js b/spec/frontend/projects/terraform_notification/terraform_notification_spec.js
index 1d0faebbcb2..89f4694d1f8 100644
--- a/spec/frontend/projects/terraform_notification/terraform_notification_spec.js
+++ b/spec/frontend/projects/terraform_notification/terraform_notification_spec.js
@@ -60,14 +60,15 @@ describe('TerraformNotificationBanner', () => {
describe('when close button is clicked', () => {
beforeEach(() => {
- wrapper.vm.$refs.calloutDismisser.dismiss = userCalloutDismissSpy;
findBanner().vm.$emit('close');
});
+
it('should send the dismiss event', () => {
expect(trackingSpy).toHaveBeenCalledWith(undefined, DISMISS_EVENT, {
label: EVENT_LABEL,
});
});
+
it('should call the dismiss callback', () => {
expect(userCalloutDismissSpy).toHaveBeenCalledTimes(1);
});
diff --git a/spec/frontend/related_issues/components/related_issuable_input_spec.js b/spec/frontend/related_issues/components/related_issuable_input_spec.js
index f7333bf6893..30f957a4c45 100644
--- a/spec/frontend/related_issues/components/related_issuable_input_spec.js
+++ b/spec/frontend/related_issues/components/related_issuable_input_spec.js
@@ -1,38 +1,37 @@
import { shallowMount } from '@vue/test-utils';
-import { nextTick } from 'vue';
import { TEST_HOST } from 'helpers/test_constants';
+import GfmAutoComplete from '~/gfm_auto_complete';
import { TYPE_ISSUE } from '~/issues/constants';
import RelatedIssuableInput from '~/related_issues/components/related_issuable_input.vue';
import { PathIdSeparator } from '~/related_issues/constants';
-jest.mock('ee_else_ce/gfm_auto_complete', () => {
- return function gfmAutoComplete() {
- return {
- constructor() {},
- setup() {},
- };
- };
-});
+jest.mock('~/gfm_auto_complete');
describe('RelatedIssuableInput', () => {
- let propsData;
-
- beforeEach(() => {
- propsData = {
- inputValue: '',
- references: [],
- pathIdSeparator: PathIdSeparator.Issue,
- issuableType: TYPE_ISSUE,
- autoCompleteSources: {
- issues: `${TEST_HOST}/h5bp/html5-boilerplate/-/autocomplete_sources/issues`,
+ let wrapper;
+
+ const autoCompleteSources = {
+ issues: `${TEST_HOST}/h5bp/html5-boilerplate/-/autocomplete_sources/issues`,
+ };
+
+ const mountComponent = (props = {}) => {
+ wrapper = shallowMount(RelatedIssuableInput, {
+ propsData: {
+ inputValue: '',
+ references: [],
+ pathIdSeparator: PathIdSeparator.Issue,
+ issuableType: TYPE_ISSUE,
+ autoCompleteSources,
+ ...props,
},
- };
- });
+ attachTo: document.body,
+ });
+ };
describe('autocomplete', () => {
describe('with autoCompleteSources', () => {
it('shows placeholder text', () => {
- const wrapper = shallowMount(RelatedIssuableInput, { propsData });
+ mountComponent();
expect(wrapper.findComponent({ ref: 'input' }).element.placeholder).toBe(
'Paste issue link or <#issue id>',
@@ -40,51 +39,32 @@ describe('RelatedIssuableInput', () => {
});
it('has GfmAutoComplete', () => {
- const wrapper = shallowMount(RelatedIssuableInput, { propsData });
+ mountComponent();
- expect(wrapper.vm.gfmAutoComplete).toBeDefined();
+ expect(GfmAutoComplete).toHaveBeenCalledWith(autoCompleteSources);
});
});
describe('with no autoCompleteSources', () => {
it('shows placeholder text', () => {
- const wrapper = shallowMount(RelatedIssuableInput, {
- propsData: {
- ...propsData,
- references: ['!1', '!2'],
- },
- });
+ mountComponent({ references: ['!1', '!2'] });
expect(wrapper.findComponent({ ref: 'input' }).element.value).toBe('');
});
it('does not have GfmAutoComplete', () => {
- const wrapper = shallowMount(RelatedIssuableInput, {
- propsData: {
- ...propsData,
- autoCompleteSources: {},
- },
- });
+ mountComponent({ autoCompleteSources: {} });
- expect(wrapper.vm.gfmAutoComplete).not.toBeDefined();
+ expect(GfmAutoComplete).not.toHaveBeenCalled();
});
});
});
describe('focus', () => {
it('when clicking anywhere on the input wrapper it should focus the input', async () => {
- const wrapper = shallowMount(RelatedIssuableInput, {
- propsData: {
- ...propsData,
- references: ['foo', 'bar'],
- },
- // We need to attach to document, so that `document.activeElement` is properly set in jsdom
- attachTo: document.body,
- });
-
- wrapper.find('li').trigger('click');
+ mountComponent({ references: ['foo', 'bar'] });
- await nextTick();
+ await wrapper.find('li').trigger('click');
expect(document.activeElement).toBe(wrapper.findComponent({ ref: 'input' }).element);
});
@@ -92,11 +72,7 @@ describe('RelatedIssuableInput', () => {
describe('when filling in the input', () => {
it('emits addIssuableFormInput with data', () => {
- const wrapper = shallowMount(RelatedIssuableInput, {
- propsData,
- });
-
- wrapper.vm.$emit = jest.fn();
+ mountComponent();
const newInputValue = 'filling in things';
const untouchedRawReferences = newInputValue.trim().split(/\s/);
@@ -108,12 +84,16 @@ describe('RelatedIssuableInput', () => {
input.element.selectionEnd = newInputValue.length;
input.trigger('input');
- expect(wrapper.vm.$emit).toHaveBeenCalledWith('addIssuableFormInput', {
- newValue: newInputValue,
- caretPos: newInputValue.length,
- untouchedRawReferences,
- touchedReference,
- });
+ expect(wrapper.emitted('addIssuableFormInput')).toEqual([
+ [
+ {
+ newValue: newInputValue,
+ caretPos: newInputValue.length,
+ untouchedRawReferences,
+ touchedReference,
+ },
+ ],
+ ]);
});
});
});
diff --git a/spec/frontend/releases/components/releases_pagination_spec.js b/spec/frontend/releases/components/releases_pagination_spec.js
index 923d84ae2b3..b241eb9acd4 100644
--- a/spec/frontend/releases/components/releases_pagination_spec.js
+++ b/spec/frontend/releases/components/releases_pagination_spec.js
@@ -60,9 +60,22 @@ describe('releases_pagination.vue', () => {
const findPrevButton = () => wrapper.findByTestId('prevButton');
const findNextButton = () => wrapper.findByTestId('nextButton');
+ describe('when there is only one page of results', () => {
+ beforeEach(() => {
+ createComponent(singlePageInfo);
+ });
+
+ it('hides the "Prev" button', () => {
+ expect(findPrevButton().exists()).toBe(false);
+ });
+
+ it('hides the "Next" button', () => {
+ expect(findNextButton().exists()).toBe(false);
+ });
+ });
+
describe.each`
description | pageInfo | prevEnabled | nextEnabled
- ${'when there is only one page of results'} | ${singlePageInfo} | ${false} | ${false}
${'when there is a next page, but not a previous page'} | ${onlyNextPageInfo} | ${false} | ${true}
${'when there is a previous page, but not a next page'} | ${onlyPrevPageInfo} | ${true} | ${false}
${'when there is both a previous and next page'} | ${prevAndNextPageInfo} | ${true} | ${true}
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 6825d4afecf..ede04390586 100644
--- a/spec/frontend/repository/components/__snapshots__/last_commit_spec.js.snap
+++ b/spec/frontend/repository/components/__snapshots__/last_commit_spec.js.snap
@@ -12,13 +12,15 @@ exports[`Repository last commit component renders commit widget 1`] = `
imgsize="32"
imgsrc="https://test.com"
linkhref="/test"
+ popoveruserid=""
+ popoverusername=""
tooltipplacement="top"
tooltiptext=""
username=""
/>
<div
- class="commit-detail flex-list gl-display-flex gl-justify-content-space-between gl-align-items-flex-start gl-flex-grow-1 gl-min-w-0"
+ class="commit-detail flex-list gl-display-flex gl-justify-content-space-between gl-align-items-center gl-flex-grow-1 gl-min-w-0"
>
<div
class="commit-content"
diff --git a/spec/frontend/repository/components/blob_content_viewer_spec.js b/spec/frontend/repository/components/blob_content_viewer_spec.js
index ecd617ca44b..e2bb7cdb2d7 100644
--- a/spec/frontend/repository/components/blob_content_viewer_spec.js
+++ b/spec/frontend/repository/components/blob_content_viewer_spec.js
@@ -11,7 +11,7 @@ import BlobContent from '~/blob/components/blob_content.vue';
import BlobHeader from '~/blob/components/blob_header.vue';
import BlobButtonGroup from '~/repository/components/blob_button_group.vue';
import BlobContentViewer from '~/repository/components/blob_content_viewer.vue';
-import WebIdeLink from '~/vue_shared/components/web_ide_link.vue';
+import WebIdeLink from 'ee_else_ce/vue_shared/components/web_ide_link.vue';
import ForkSuggestion from '~/repository/components/fork_suggestion.vue';
import { loadViewer } from '~/repository/components/blob_viewers';
import DownloadViewer from '~/repository/components/blob_viewers/download_viewer.vue';
@@ -52,6 +52,8 @@ let userInfoMockResolver;
let projectInfoMockResolver;
let applicationInfoMockResolver;
+Vue.use(Vuex);
+
const mockAxios = new MockAdapter(axios);
const createMockStore = () =>
@@ -150,6 +152,7 @@ const createComponent = async (mockData = {}, mountFn = shallowMount, mockRoute
...inject,
glFeatures: {
highlightJs,
+ highlightJsWorker: false,
},
},
}),
@@ -403,7 +406,7 @@ describe('Blob content viewer component', () => {
await waitForPromises();
- expect(loadViewer).toHaveBeenCalledWith(viewer, false);
+ expect(loadViewer).toHaveBeenCalledWith(viewer, false, false, 'javascript');
expect(wrapper.findComponent(loadViewerReturnValue).exists()).toBe(true);
});
});
diff --git a/spec/frontend/repository/components/breadcrumbs_spec.js b/spec/frontend/repository/components/breadcrumbs_spec.js
index f4baa817d32..46a7f2ee1bb 100644
--- a/spec/frontend/repository/components/breadcrumbs_spec.js
+++ b/spec/frontend/repository/components/breadcrumbs_spec.js
@@ -1,6 +1,6 @@
import Vue, { nextTick } from 'vue';
import VueApollo from 'vue-apollo';
-import { GlDropdown } from '@gitlab/ui';
+import { GlDisclosureDropdown, GlDisclosureDropdownGroup } from '@gitlab/ui';
import { shallowMount, RouterLinkStub } from '@vue/test-utils';
import Breadcrumbs from '~/repository/components/breadcrumbs.vue';
import UploadBlobModal from '~/repository/components/upload_blob_modal.vue';
@@ -11,6 +11,7 @@ import permissionsQuery from 'shared_queries/repository/permissions.query.graphq
import projectPathQuery from '~/repository/queries/project_path.query.graphql';
import createApolloProvider from 'helpers/mock_apollo_helper';
+import { __ } from '~/locale';
const defaultMockRoute = {
name: 'blobPath',
@@ -61,6 +62,7 @@ describe('Repository breadcrumbs component', () => {
},
stubs: {
RouterLink: RouterLinkStub,
+ GlDisclosureDropdown,
},
mocks: {
$route: {
@@ -71,7 +73,8 @@ describe('Repository breadcrumbs component', () => {
});
};
- const findDropdown = () => wrapper.findComponent(GlDropdown);
+ const findDropdown = () => wrapper.findComponent(GlDisclosureDropdown);
+ const findDropdownGroup = () => wrapper.findComponent(GlDisclosureDropdownGroup);
const findUploadBlobModal = () => wrapper.findComponent(UploadBlobModal);
const findNewDirectoryModal = () => wrapper.findComponent(NewDirectoryModal);
const findRouterLink = () => wrapper.findAllComponents(RouterLinkStub);
@@ -146,7 +149,11 @@ describe('Repository breadcrumbs component', () => {
`(
'does render add to tree dropdown $isRendered when route is $routeName',
({ routeName, isRendered }) => {
- factory('app/assets/javascripts.js', { canCollaborate: true }, { name: routeName });
+ factory(
+ 'app/assets/javascripts.js',
+ { canCollaborate: true, canEditTree: true },
+ { name: routeName },
+ );
expect(findDropdown().exists()).toBe(isRendered);
},
);
@@ -156,7 +163,7 @@ describe('Repository breadcrumbs component', () => {
createPermissionsQueryResponse({ forkProject: true, createMergeRequestIn: true }),
);
- factory('/', { canCollaborate: true });
+ factory('/', { canCollaborate: true, canEditTree: true });
await nextTick();
expect(findDropdown().exists()).toBe(true);
@@ -193,4 +200,32 @@ describe('Repository breadcrumbs component', () => {
expect(findNewDirectoryModal().props('path')).toBe('root/master/some_dir');
});
});
+
+ describe('"this repository" dropdown group', () => {
+ it('renders when user has pushCode permissions', async () => {
+ permissionsQuerySpy.mockResolvedValue(
+ createPermissionsQueryResponse({
+ pushCode: true,
+ }),
+ );
+
+ factory('/', { canCollaborate: true });
+ await waitForPromises();
+
+ expect(findDropdownGroup().props('group').name).toBe(__('This repository'));
+ });
+
+ it('does not render when user does not have pushCode permissions', async () => {
+ permissionsQuerySpy.mockResolvedValue(
+ createPermissionsQueryResponse({
+ pushCode: false,
+ }),
+ );
+
+ factory('/', { canCollaborate: true });
+ await waitForPromises();
+
+ expect(findDropdownGroup().exists()).toBe(false);
+ });
+ });
});
diff --git a/spec/frontend/repository/mixins/highlight_mixin_spec.js b/spec/frontend/repository/mixins/highlight_mixin_spec.js
index 5f872749581..fd14f01747a 100644
--- a/spec/frontend/repository/mixins/highlight_mixin_spec.js
+++ b/spec/frontend/repository/mixins/highlight_mixin_spec.js
@@ -31,10 +31,13 @@ describe('HighlightMixin', () => {
const dummyComponent = {
mixins: [highlightMixin],
- inject: { highlightWorker: { default: workerMock } },
+ inject: {
+ highlightWorker: { default: workerMock },
+ glFeatures: { default: { highlightJsWorker: true } },
+ },
template: '<div>{{chunks[0]?.highlightedContent}}</div>',
created() {
- this.initHighlightWorker({ rawTextBlob, simpleViewer, language });
+ this.initHighlightWorker({ rawTextBlob, simpleViewer, language, fileType });
},
methods: { onError: onErrorMock },
};
@@ -84,6 +87,7 @@ describe('HighlightMixin', () => {
expect(workerMock.postMessage.mock.calls[1][0]).toMatchObject({
content: rawTextBlob,
language: languageMock,
+ fileType: TEXT_FILE_TYPE,
});
});
});
diff --git a/spec/frontend/scripts/frontend/po_to_json_spec.js b/spec/frontend/scripts/frontend/po_to_json_spec.js
index 858e3c9d3c7..47d5ccfefd4 100644
--- a/spec/frontend/scripts/frontend/po_to_json_spec.js
+++ b/spec/frontend/scripts/frontend/po_to_json_spec.js
@@ -168,7 +168,7 @@ msgstr ""
});
describe('escaping', () => {
- it('escapes quotes in msgid and translation', () => {
+ it('escapes quotes in translation', () => {
const poContent = `
# Escaped quotes in msgid and msgstr
msgid "Changes the title to \\"%{title_param}\\"."
@@ -183,7 +183,7 @@ msgstr "Ändert den Titel in \\"%{title_param}\\"."
domain: 'app',
lang: LOCALE,
},
- 'Changes the title to \\"%{title_param}\\".': [
+ 'Changes the title to "%{title_param}".': [
'Ändert den Titel in \\"%{title_param}\\".',
],
},
@@ -191,7 +191,7 @@ msgstr "Ändert den Titel in \\"%{title_param}\\"."
});
});
- it('escapes backslashes in msgid and translation', () => {
+ it('escapes backslashes in translation', () => {
const poContent = `
# Escaped backslashes in msgid and msgstr
msgid "Example: ssh\\\\:\\\\/\\\\/"
@@ -206,7 +206,7 @@ msgstr "Beispiel: ssh\\\\:\\\\/\\\\/"
domain: 'app',
lang: LOCALE,
},
- 'Example: ssh\\\\:\\\\/\\\\/': ['Beispiel: ssh\\\\:\\\\/\\\\/'],
+ 'Example: ssh\\:\\/\\/': ['Beispiel: ssh\\\\:\\\\/\\\\/'],
},
},
});
diff --git a/spec/frontend/search/mock_data.js b/spec/frontend/search/mock_data.js
index 7cf8633d749..3f23803bbf6 100644
--- a/spec/frontend/search/mock_data.js
+++ b/spec/frontend/search/mock_data.js
@@ -132,6 +132,13 @@ export const MOCK_NAVIGATION = {
active: true,
count: '2,430',
},
+ epics: {
+ label: 'Epics',
+ scope: 'epics',
+ link: '/search?scope=epics&search=et',
+ active: true,
+ count: '0',
+ },
merge_requests: {
label: 'Merge requests',
scope: 'merge_requests',
@@ -496,6 +503,14 @@ export const MOCK_NAVIGATION_ITEMS = [
items: [],
},
{
+ title: 'Epics',
+ icon: 'epic',
+ link: '/search?scope=epics&search=et',
+ is_active: true,
+ pill_count: '0',
+ items: [],
+ },
+ {
title: 'Merge requests',
icon: 'merge-request',
link: '/search?scope=merge_requests&search=et',
@@ -505,7 +520,7 @@ export const MOCK_NAVIGATION_ITEMS = [
},
{
title: 'Wiki',
- icon: 'overview',
+ icon: 'book',
link: '/search?scope=wiki_blobs&search=et',
is_active: false,
pill_count: '0',
@@ -529,7 +544,7 @@ export const MOCK_NAVIGATION_ITEMS = [
},
{
title: 'Milestones',
- icon: 'tag',
+ icon: 'clock',
link: '/search?scope=milestones&search=et',
is_active: false,
pill_count: '0',
@@ -887,3 +902,5 @@ export const MOCK_FILTERED_UNAPPLIED_SELECTED_LABELS = [
parent_full_name: 'Toolbox / Gitlab Smoke Tests',
},
];
+
+export const CURRENT_SCOPE = 'blobs';
diff --git a/spec/frontend/search/sidebar/components/label_filter_spec.js b/spec/frontend/search/sidebar/components/label_filter_spec.js
index c5df374d4ef..2a5b3a96045 100644
--- a/spec/frontend/search/sidebar/components/label_filter_spec.js
+++ b/spec/frontend/search/sidebar/components/label_filter_spec.js
@@ -92,6 +92,7 @@ describe('GlobalSearchSidebarLabelFilter', () => {
const findCheckboxFilter = () => wrapper.findAllComponents(LabelDropdownItems);
const findAlert = () => wrapper.findComponent(GlAlert);
const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
+ const findNoLabelsFoundMessage = () => wrapper.findComponentByTestId('no-labels-found-message');
describe('Renders correctly closed', () => {
beforeEach(async () => {
@@ -228,6 +229,33 @@ describe('GlobalSearchSidebarLabelFilter', () => {
});
});
+ describe('Renders no-labels state correctly', () => {
+ beforeEach(async () => {
+ createComponent();
+ store.commit(REQUEST_AGGREGATIONS);
+ await Vue.nextTick();
+
+ findSearchBox().vm.$emit('focusin');
+ findSearchBox().vm.$emit('input', 'ssssssss');
+ });
+
+ it('renders checkbox filter', () => {
+ expect(findCheckboxFilter().exists()).toBe(false);
+ });
+
+ it("doesn't render alert", () => {
+ expect(findAlert().exists()).toBe(false);
+ });
+
+ it("doesn't render items", () => {
+ expect(findAllSelectedLabelsAbove().exists()).toBe(false);
+ });
+
+ it('renders no labels found text', () => {
+ expect(findNoLabelsFoundMessage().exists()).toBe(true);
+ });
+ });
+
describe('Renders error state correctly', () => {
beforeEach(async () => {
createComponent();
@@ -294,6 +322,8 @@ describe('GlobalSearchSidebarLabelFilter', () => {
describe('dropdown checkboxes work', () => {
beforeEach(async () => {
createComponent();
+ store.commit(RECEIVE_AGGREGATIONS_SUCCESS, MOCK_LABEL_AGGREGATIONS.data);
+ await Vue.nextTick();
await findSearchBox().vm.$emit('focusin');
await Vue.nextTick();
diff --git a/spec/frontend/search/sidebar/components/scope_legacy_navigation_spec.js b/spec/frontend/search/sidebar/components/scope_legacy_navigation_spec.js
index 6a94da31a1b..786ad806ea6 100644
--- a/spec/frontend/search/sidebar/components/scope_legacy_navigation_spec.js
+++ b/spec/frontend/search/sidebar/components/scope_legacy_navigation_spec.js
@@ -7,6 +7,8 @@ import ScopeLegacyNavigation from '~/search/sidebar/components/scope_legacy_navi
Vue.use(Vuex);
+const MOCK_NAVIGATION_ENTRIES = Object.entries(MOCK_NAVIGATION);
+
describe('ScopeLegacyNavigation', () => {
let wrapper;
@@ -55,12 +57,12 @@ describe('ScopeLegacyNavigation', () => {
});
it('renders all nav item components', () => {
- expect(findGlNavItems()).toHaveLength(9);
+ expect(findGlNavItems()).toHaveLength(MOCK_NAVIGATION_ENTRIES.length);
});
it('has all proper links', () => {
const linkAtPosition = 3;
- const { link } = MOCK_NAVIGATION[Object.keys(MOCK_NAVIGATION)[linkAtPosition]];
+ const { link } = MOCK_NAVIGATION_ENTRIES[linkAtPosition][1];
expect(findGlNavItems().at(linkAtPosition).attributes('href')).toBe(link);
});
diff --git a/spec/frontend/search/sidebar/components/scope_sidebar_navigation_spec.js b/spec/frontend/search/sidebar/components/scope_sidebar_navigation_spec.js
index 4b71ff0bedc..86939bdc5d6 100644
--- a/spec/frontend/search/sidebar/components/scope_sidebar_navigation_spec.js
+++ b/spec/frontend/search/sidebar/components/scope_sidebar_navigation_spec.js
@@ -7,6 +7,8 @@ import { MOCK_QUERY, MOCK_NAVIGATION, MOCK_NAVIGATION_ITEMS } from '../../mock_d
Vue.use(Vuex);
+const MOCK_NAVIGATION_ENTRIES = Object.entries(MOCK_NAVIGATION);
+
describe('ScopeSidebarNavigation', () => {
let wrapper;
@@ -59,7 +61,7 @@ describe('ScopeSidebarNavigation', () => {
});
it('renders all nav item components', () => {
- expect(findNavItems()).toHaveLength(9);
+ expect(findNavItems()).toHaveLength(MOCK_NAVIGATION_ENTRIES.length);
});
it('has all proper links', () => {
diff --git a/spec/frontend/search/topbar/components/app_spec.js b/spec/frontend/search/topbar/components/app_spec.js
index 423ec6ff63b..9dc14b97ce0 100644
--- a/spec/frontend/search/topbar/components/app_spec.js
+++ b/spec/frontend/search/topbar/components/app_spec.js
@@ -3,6 +3,7 @@ import { shallowMount } from '@vue/test-utils';
import Vue from 'vue';
import Vuex from 'vuex';
import { MOCK_QUERY } from 'jest/search/mock_data';
+import { stubComponent } from 'helpers/stub_component';
import GlobalSearchTopbar from '~/search/topbar/components/app.vue';
import GroupFilter from '~/search/topbar/components/group_filter.vue';
import ProjectFilter from '~/search/topbar/components/project_filter.vue';
@@ -93,11 +94,20 @@ describe('GlobalSearchTopbar', () => {
});
it('dispatched correct click action', () => {
- const draweToggleSpy = jest.fn();
- wrapper.vm.$refs.markdownDrawer.toggleDrawer = draweToggleSpy;
+ const drawerToggleSpy = jest.fn();
+
+ createComponent(
+ { query: { repository_ref: '' } },
+ { elasticsearchEnabled: true, defaultBranchName: '' },
+ {
+ MarkdownDrawer: stubComponent(MarkdownDrawer, {
+ methods: { toggleDrawer: drawerToggleSpy },
+ }),
+ },
+ );
findSyntaxOptionButton().vm.$emit('click');
- expect(draweToggleSpy).toHaveBeenCalled();
+ expect(drawerToggleSpy).toHaveBeenCalled();
});
});
diff --git a/spec/frontend/search/topbar/components/group_filter_spec.js b/spec/frontend/search/topbar/components/group_filter_spec.js
index 78d9efbd686..94882d181d3 100644
--- a/spec/frontend/search/topbar/components/group_filter_spec.js
+++ b/spec/frontend/search/topbar/components/group_filter_spec.js
@@ -1,7 +1,7 @@
import { shallowMount } from '@vue/test-utils';
import Vue from 'vue';
import Vuex from 'vuex';
-import { MOCK_GROUP, MOCK_QUERY } from 'jest/search/mock_data';
+import { MOCK_GROUP, MOCK_QUERY, CURRENT_SCOPE } from 'jest/search/mock_data';
import { visitUrl, setUrlParams } from '~/lib/utils/url_utility';
import { GROUPS_LOCAL_STORAGE_KEY } from '~/search/store/constants';
import GroupFilter from '~/search/topbar/components/group_filter.vue';
@@ -37,6 +37,7 @@ describe('GroupFilter', () => {
actions: actionSpies,
getters: {
frequentGroups: () => [],
+ currentScope: () => CURRENT_SCOPE,
},
});
@@ -89,6 +90,7 @@ describe('GroupFilter', () => {
[GROUP_DATA.queryParam]: null,
[PROJECT_DATA.queryParam]: null,
nav_source: null,
+ scope: CURRENT_SCOPE,
});
expect(visitUrl).toHaveBeenCalled();
@@ -109,6 +111,7 @@ describe('GroupFilter', () => {
[GROUP_DATA.queryParam]: MOCK_GROUP.id,
[PROJECT_DATA.queryParam]: null,
nav_source: null,
+ scope: CURRENT_SCOPE,
});
expect(visitUrl).toHaveBeenCalled();
diff --git a/spec/frontend/search/topbar/components/project_filter_spec.js b/spec/frontend/search/topbar/components/project_filter_spec.js
index 9eda34b1633..c25d2b94027 100644
--- a/spec/frontend/search/topbar/components/project_filter_spec.js
+++ b/spec/frontend/search/topbar/components/project_filter_spec.js
@@ -1,7 +1,7 @@
import { shallowMount } from '@vue/test-utils';
import Vue from 'vue';
import Vuex from 'vuex';
-import { MOCK_PROJECT, MOCK_QUERY } from 'jest/search/mock_data';
+import { MOCK_PROJECT, MOCK_QUERY, CURRENT_SCOPE } from 'jest/search/mock_data';
import { visitUrl, setUrlParams } from '~/lib/utils/url_utility';
import { PROJECTS_LOCAL_STORAGE_KEY } from '~/search/store/constants';
import ProjectFilter from '~/search/topbar/components/project_filter.vue';
@@ -37,6 +37,7 @@ describe('ProjectFilter', () => {
actions: actionSpies,
getters: {
frequentProjects: () => [],
+ currentScope: () => CURRENT_SCOPE,
},
});
@@ -88,6 +89,7 @@ describe('ProjectFilter', () => {
expect(setUrlParams).toHaveBeenCalledWith({
[PROJECT_DATA.queryParam]: null,
nav_source: null,
+ scope: CURRENT_SCOPE,
});
expect(visitUrl).toHaveBeenCalled();
});
@@ -107,6 +109,7 @@ describe('ProjectFilter', () => {
[GROUP_DATA.queryParam]: MOCK_PROJECT.namespace.id,
[PROJECT_DATA.queryParam]: MOCK_PROJECT.id,
nav_source: null,
+ scope: CURRENT_SCOPE,
});
expect(visitUrl).toHaveBeenCalled();
});
diff --git a/spec/frontend/service_desk/components/info_banner_spec.js b/spec/frontend/service_desk/components/info_banner_spec.js
new file mode 100644
index 00000000000..7487d5d8b64
--- /dev/null
+++ b/spec/frontend/service_desk/components/info_banner_spec.js
@@ -0,0 +1,81 @@
+import { shallowMount } from '@vue/test-utils';
+import { GlLink, GlButton } from '@gitlab/ui';
+import InfoBanner from '~/service_desk/components/info_banner.vue';
+import { infoBannerAdminNote, enableServiceDesk } from '~/service_desk/constants';
+
+describe('InfoBanner', () => {
+ let wrapper;
+
+ const defaultProvide = {
+ serviceDeskCalloutSvgPath: 'callout.svg',
+ serviceDeskEmailAddress: 'sd@gmail.com',
+ canAdminIssues: true,
+ canEditProjectSettings: true,
+ serviceDeskSettingsPath: 'path/to/project/settings',
+ serviceDeskHelpPath: 'path/to/documentation',
+ isServiceDeskEnabled: true,
+ };
+
+ const findEnableSDButton = () => wrapper.findComponent(GlButton);
+
+ const mountComponent = (provide) => {
+ return shallowMount(InfoBanner, {
+ provide: {
+ ...defaultProvide,
+ ...provide,
+ },
+ stubs: {
+ GlLink,
+ GlButton,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ wrapper = mountComponent();
+ });
+
+ describe('Service Desk email address', () => {
+ it('renders when user can admin issues and service desk is enabled', () => {
+ expect(wrapper.text()).toContain(infoBannerAdminNote);
+ expect(wrapper.text()).toContain(wrapper.vm.serviceDeskEmailAddress);
+ });
+
+ it('does not render, when user can not admin issues', () => {
+ wrapper = mountComponent({ canAdminIssues: false });
+
+ expect(wrapper.text()).not.toContain(infoBannerAdminNote);
+ expect(wrapper.text()).not.toContain(wrapper.vm.serviceDeskEmailAddress);
+ });
+
+ it('does not render, when service desk is not setup', () => {
+ wrapper = mountComponent({ isServiceDeskEnabled: false });
+
+ expect(wrapper.text()).not.toContain(infoBannerAdminNote);
+ expect(wrapper.text()).not.toContain(wrapper.vm.serviceDeskEmailAddress);
+ });
+ });
+
+ describe('Link to Service Desk settings', () => {
+ it('renders when user can edit settings and service desk is not enabled', () => {
+ wrapper = mountComponent({ isServiceDeskEnabled: false });
+
+ expect(wrapper.text()).toContain(enableServiceDesk);
+ expect(findEnableSDButton().exists()).toBe(true);
+ });
+
+ it('does not render when service desk is enabled', () => {
+ wrapper = mountComponent();
+
+ expect(wrapper.text()).not.toContain(enableServiceDesk);
+ expect(findEnableSDButton().exists()).toBe(false);
+ });
+
+ it('does not render when user cannot edit settings', () => {
+ wrapper = mountComponent({ canEditProjectSettings: false });
+
+ expect(wrapper.text()).not.toContain(enableServiceDesk);
+ expect(findEnableSDButton().exists()).toBe(false);
+ });
+ });
+});
diff --git a/spec/frontend/service_desk/components/service_desk_list_app_spec.js b/spec/frontend/service_desk/components/service_desk_list_app_spec.js
new file mode 100644
index 00000000000..2ac789745aa
--- /dev/null
+++ b/spec/frontend/service_desk/components/service_desk_list_app_spec.js
@@ -0,0 +1,151 @@
+import { shallowMount } from '@vue/test-utils';
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import * as Sentry from '@sentry/browser';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import IssuableList from '~/vue_shared/issuable/list/components/issuable_list_root.vue';
+import { issuableListTabs } from '~/vue_shared/issuable/list/constants';
+import { STATUS_CLOSED, STATUS_OPEN } from '~/issues/constants';
+import getServiceDeskIssuesQuery from '~/service_desk/queries/get_service_desk_issues.query.graphql';
+import getServiceDeskIssuesCountsQuery from '~/service_desk/queries/get_service_desk_issues_counts.query.graphql';
+import ServiceDeskListApp from '~/service_desk/components/service_desk_list_app.vue';
+import InfoBanner from '~/service_desk/components/info_banner.vue';
+import {
+ getServiceDeskIssuesQueryResponse,
+ getServiceDeskIssuesCountsQueryResponse,
+} from '../mock_data';
+
+jest.mock('@sentry/browser');
+
+describe('ServiceDeskListApp', () => {
+ let wrapper;
+
+ Vue.use(VueApollo);
+
+ const defaultProvide = {
+ emptyStateSvgPath: 'empty-state.svg',
+ isProject: true,
+ isSignedIn: true,
+ fullPath: 'path/to/project',
+ isServiceDeskSupported: true,
+ hasAnyIssues: true,
+ };
+
+ const defaultQueryResponse = getServiceDeskIssuesQueryResponse;
+
+ const mockServiceDeskIssuesQueryResponse = jest.fn().mockResolvedValue(defaultQueryResponse);
+ const mockServiceDeskIssuesCountsQueryResponse = jest
+ .fn()
+ .mockResolvedValue(getServiceDeskIssuesCountsQueryResponse);
+
+ const findIssuableList = () => wrapper.findComponent(IssuableList);
+ const findInfoBanner = () => wrapper.findComponent(InfoBanner);
+
+ const mountComponent = ({
+ provide = {},
+ data = {},
+ serviceDeskIssuesQueryResponse = mockServiceDeskIssuesQueryResponse,
+ serviceDeskIssuesCountsQueryResponse = mockServiceDeskIssuesCountsQueryResponse,
+ stubs = {},
+ mountFn = shallowMount,
+ } = {}) => {
+ const requestHandlers = [
+ [getServiceDeskIssuesQuery, serviceDeskIssuesQueryResponse],
+ [getServiceDeskIssuesCountsQuery, serviceDeskIssuesCountsQueryResponse],
+ ];
+
+ return mountFn(ServiceDeskListApp, {
+ apolloProvider: createMockApollo(
+ requestHandlers,
+ {},
+ {
+ typePolicies: {
+ Query: {
+ fields: {
+ project: {
+ merge: true,
+ },
+ },
+ },
+ },
+ },
+ ),
+ provide: {
+ ...defaultProvide,
+ ...provide,
+ },
+ data() {
+ return data;
+ },
+ stubs,
+ });
+ };
+
+ beforeEach(() => {
+ wrapper = mountComponent();
+ return waitForPromises();
+ });
+
+ it('fetches service desk issues and renders them in the issuable list', () => {
+ expect(findIssuableList().props()).toMatchObject({
+ namespace: 'service-desk',
+ recentSearchesStorageKey: 'issues',
+ issuables: defaultQueryResponse.data.project.issues.nodes,
+ tabs: issuableListTabs,
+ currentTab: STATUS_OPEN,
+ tabCounts: {
+ opened: 1,
+ closed: 1,
+ all: 1,
+ },
+ });
+ });
+
+ describe('InfoBanner', () => {
+ it('renders when Service Desk is supported and has any number of issues', () => {
+ expect(findInfoBanner().exists()).toBe(true);
+ });
+
+ it('does not render, when there are no issues', async () => {
+ wrapper = mountComponent({ provide: { hasAnyIssues: false } });
+ await waitForPromises();
+
+ expect(findInfoBanner().exists()).toBe(false);
+ });
+ });
+
+ describe('Events', () => {
+ describe('when "click-tab" event is emitted by IssuableList', () => {
+ beforeEach(() => {
+ mountComponent();
+
+ findIssuableList().vm.$emit('click-tab', STATUS_CLOSED);
+ });
+
+ it('updates ui to the new tab', () => {
+ expect(findIssuableList().props('currentTab')).toBe(STATUS_CLOSED);
+ });
+ });
+ });
+
+ describe('Errors', () => {
+ describe.each`
+ error | mountOption | message
+ ${'fetching issues'} | ${'serviceDeskIssuesQueryResponse'} | ${ServiceDeskListApp.i18n.errorFetchingIssues}
+ ${'fetching issue counts'} | ${'serviceDeskIssuesCountsQueryResponse'} | ${ServiceDeskListApp.i18n.errorFetchingCounts}
+ `('when there is an error $error', ({ mountOption, message }) => {
+ beforeEach(() => {
+ wrapper = mountComponent({
+ [mountOption]: jest.fn().mockRejectedValue(new Error('ERROR')),
+ });
+ return waitForPromises();
+ });
+
+ it('shows an error message', () => {
+ expect(findIssuableList().props('error')).toBe(message);
+ expect(Sentry.captureException).toHaveBeenCalledWith(new Error('ERROR'));
+ });
+ });
+ });
+});
diff --git a/spec/frontend/service_desk/mock_data.js b/spec/frontend/service_desk/mock_data.js
new file mode 100644
index 00000000000..17b400e8670
--- /dev/null
+++ b/spec/frontend/service_desk/mock_data.js
@@ -0,0 +1,118 @@
+export const getServiceDeskIssuesQueryResponse = {
+ data: {
+ project: {
+ id: '1',
+ __typename: 'Project',
+ issues: {
+ __persist: true,
+ pageInfo: {
+ __typename: 'PageInfo',
+ hasNextPage: true,
+ hasPreviousPage: false,
+ startCursor: 'startcursor',
+ endCursor: 'endcursor',
+ },
+ nodes: [
+ {
+ __persist: true,
+ __typename: 'Issue',
+ id: 'gid://gitlab/Issue/123456',
+ iid: '789',
+ confidential: false,
+ createdAt: '2021-05-22T04:08:01Z',
+ downvotes: 2,
+ dueDate: '2021-05-29',
+ hidden: false,
+ humanTimeEstimate: null,
+ mergeRequestsCount: false,
+ moved: false,
+ state: 'opened',
+ title: 'Issue title',
+ updatedAt: '2021-05-22T04:08:01Z',
+ closedAt: null,
+ upvotes: 3,
+ userDiscussionsCount: 4,
+ webPath: 'project/-/issues/789',
+ webUrl: 'project/-/issues/789',
+ type: 'issue',
+ assignees: {
+ nodes: [
+ {
+ __persist: true,
+ __typename: 'UserCore',
+ id: 'gid://gitlab/User/234',
+ avatarUrl: 'avatar/url',
+ name: 'Marge Simpson',
+ username: 'msimpson',
+ webUrl: 'url/msimpson',
+ },
+ ],
+ },
+ author: {
+ __persist: true,
+ __typename: 'UserCore',
+ id: 'gid://gitlab/User/456',
+ avatarUrl: 'avatar/url',
+ name: 'GitLab Support Bot',
+ username: 'support-bot',
+ webUrl: 'url/hsimpson',
+ },
+ labels: {
+ nodes: [
+ {
+ __persist: true,
+ id: 'gid://gitlab/ProjectLabel/456',
+ color: '#333',
+ title: 'Label title',
+ description: 'Label description',
+ },
+ ],
+ },
+ milestone: null,
+ taskCompletionStatus: {
+ completedCount: 1,
+ count: 2,
+ },
+ },
+ ],
+ },
+ },
+ },
+};
+
+export const getServiceDeskIssuesQueryEmptyResponse = {
+ data: {
+ project: {
+ id: '1',
+ __typename: 'Project',
+ issues: {
+ __persist: true,
+ pageInfo: {
+ __typename: 'PageInfo',
+ hasNextPage: true,
+ hasPreviousPage: false,
+ startCursor: 'startcursor',
+ endCursor: 'endcursor',
+ },
+ nodes: [],
+ },
+ },
+ },
+};
+
+export const getServiceDeskIssuesCountsQueryResponse = {
+ data: {
+ project: {
+ id: '1',
+ openedIssues: {
+ count: 1,
+ },
+ closedIssues: {
+ count: 1,
+ },
+ allIssues: {
+ count: 1,
+ },
+ },
+ },
+};
diff --git a/spec/frontend/sidebar/components/assignees/assignee_avatar_link_spec.js b/spec/frontend/sidebar/components/assignees/assignee_avatar_link_spec.js
index 81b65f4f050..52355806487 100644
--- a/spec/frontend/sidebar/components/assignees/assignee_avatar_link_spec.js
+++ b/spec/frontend/sidebar/components/assignees/assignee_avatar_link_spec.js
@@ -1,15 +1,12 @@
import { shallowMount } from '@vue/test-utils';
import { GlLink } from '@gitlab/ui';
-import { TEST_HOST } from 'helpers/test_constants';
import { TYPENAME_USER } from '~/graphql_shared/constants';
import { convertToGraphQLId } from '~/graphql_shared/utils';
import AssigneeAvatar from '~/sidebar/components/assignees/assignee_avatar.vue';
import AssigneeAvatarLink from '~/sidebar/components/assignees/assignee_avatar_link.vue';
import userDataMock from '../../user_data_mock';
-const TOOLTIP_PLACEMENT = 'bottom';
-const { name: USER_NAME } = userDataMock();
-const TEST_ISSUABLE_TYPE = 'merge_request';
+const TEST_ISSUABLE_TYPE = 'issue';
describe('AssigneeAvatarLink component', () => {
let wrapper;
@@ -17,10 +14,6 @@ describe('AssigneeAvatarLink component', () => {
function createComponent(props = {}) {
const propsData = {
user: userDataMock(),
- showLess: true,
- rootPath: TEST_HOST,
- tooltipPlacement: TOOLTIP_PLACEMENT,
- singleUser: false,
issuableType: TEST_ISSUABLE_TYPE,
...props,
};
@@ -30,7 +23,6 @@ describe('AssigneeAvatarLink component', () => {
});
}
- const findTooltipText = () => wrapper.attributes('title');
const findUserLink = () => wrapper.findComponent(GlLink);
it('has the root url present in the assigneeUrl method', () => {
@@ -50,69 +42,6 @@ describe('AssigneeAvatarLink component', () => {
);
});
- describe.each`
- issuableType | tooltipHasName | canMerge | expected
- ${'merge_request'} | ${true} | ${true} | ${USER_NAME}
- ${'merge_request'} | ${true} | ${false} | ${`${USER_NAME} (cannot merge)`}
- ${'merge_request'} | ${false} | ${true} | ${''}
- ${'merge_request'} | ${false} | ${false} | ${'Cannot merge'}
- ${'issue'} | ${true} | ${true} | ${USER_NAME}
- ${'issue'} | ${true} | ${false} | ${USER_NAME}
- ${'issue'} | ${false} | ${true} | ${''}
- ${'issue'} | ${false} | ${false} | ${''}
- `(
- 'with $issuableType and tooltipHasName=$tooltipHasName and canMerge=$canMerge',
- ({ issuableType, tooltipHasName, canMerge, expected }) => {
- beforeEach(() => {
- createComponent({
- issuableType,
- tooltipHasName,
- user: {
- ...userDataMock(),
- can_merge: canMerge,
- },
- });
- });
-
- it('sets tooltip', () => {
- expect(findTooltipText()).toBe(expected);
- });
- },
- );
-
- describe.each`
- tooltipHasName | name | availability | canMerge | expected
- ${true} | ${"Rabbit O'Hare"} | ${''} | ${true} | ${"Rabbit O'Hare"}
- ${true} | ${"Rabbit O'Hare"} | ${'Busy'} | ${false} | ${"Rabbit O'Hare (Busy) (cannot merge)"}
- ${true} | ${'Root'} | ${'Busy'} | ${false} | ${'Root (Busy) (cannot merge)'}
- ${true} | ${'Root'} | ${'Busy'} | ${true} | ${'Root (Busy)'}
- ${true} | ${'Root'} | ${''} | ${false} | ${'Root (cannot merge)'}
- ${true} | ${'Root'} | ${''} | ${true} | ${'Root'}
- ${false} | ${'Root'} | ${'Busy'} | ${false} | ${'Cannot merge'}
- ${false} | ${'Root'} | ${'Busy'} | ${true} | ${''}
- ${false} | ${'Root'} | ${''} | ${false} | ${'Cannot merge'}
- ${false} | ${'Root'} | ${''} | ${true} | ${''}
- `(
- "with name=$name tooltipHasName=$tooltipHasName and availability='$availability' and canMerge=$canMerge",
- ({ name, tooltipHasName, availability, canMerge, expected }) => {
- beforeEach(() => {
- createComponent({
- tooltipHasName,
- user: {
- ...userDataMock(),
- name,
- can_merge: canMerge,
- availability,
- },
- });
- });
-
- it(`sets tooltip to "${expected}"`, () => {
- expect(findTooltipText()).toBe(expected);
- });
- },
- );
-
it('passes the correct user id for REST API', () => {
createComponent({
tooltipHasName: true,
@@ -135,15 +64,24 @@ describe('AssigneeAvatarLink component', () => {
expect(findUserLink().attributes('data-user-id')).toBe(String(userId));
});
- it.each`
- issuableType | userId
- ${'merge_request'} | ${undefined}
- ${'issue'} | ${'1'}
- `('sets data-user-id as $userId for $issuableType', ({ issuableType, userId }) => {
+ it('passes the correct username, cannotMerge, and CSS class for popover support', () => {
+ const moctUserData = userDataMock();
+ const { id, username } = moctUserData;
+
createComponent({
- issuableType,
+ tooltipHasName: true,
+ issuableType: 'merge_request',
+ user: { ...moctUserData, can_merge: false },
});
- expect(findUserLink().attributes('data-user-id')).toBe(userId);
+ const userLink = findUserLink();
+
+ expect(userLink.attributes()).toMatchObject({
+ 'data-user-id': `${id}`,
+ 'data-username': username,
+ 'data-cannot-merge': 'true',
+ 'data-placement': 'left',
+ });
+ expect(userLink.classes()).toContain('js-user-link');
});
});
diff --git a/spec/frontend/sidebar/components/assignees/assignee_title_spec.js b/spec/frontend/sidebar/components/assignees/assignee_title_spec.js
index d561c761c99..b2d15e76e80 100644
--- a/spec/frontend/sidebar/components/assignees/assignee_title_spec.js
+++ b/spec/frontend/sidebar/components/assignees/assignee_title_spec.js
@@ -37,27 +37,6 @@ describe('AssigneeTitle component', () => {
});
});
- describe('gutter toggle', () => {
- it('does not show toggle by default', () => {
- wrapper = createComponent({
- numberOfAssignees: 2,
- editable: false,
- });
-
- expect(wrapper.vm.$el.querySelector('.gutter-toggle')).toBeNull();
- });
-
- it('shows toggle when showToggle is true', () => {
- wrapper = createComponent({
- numberOfAssignees: 2,
- editable: false,
- showToggle: true,
- });
-
- expect(wrapper.vm.$el.querySelector('.gutter-toggle')).toEqual(expect.any(Object));
- });
- });
-
describe('when changing is false', () => {
it('renders "Edit"', () => {
wrapper = createComponent({ editable: true });
diff --git a/spec/frontend/sidebar/components/assignees/assignees_spec.js b/spec/frontend/sidebar/components/assignees/assignees_spec.js
index 1661e28abd2..65a07382ebc 100644
--- a/spec/frontend/sidebar/components/assignees/assignees_spec.js
+++ b/spec/frontend/sidebar/components/assignees/assignees_spec.js
@@ -181,7 +181,10 @@ describe('Assignee component', () => {
const userItems = findAllAvatarLinks();
expect(userItems).toHaveLength(3);
- expect(userItems.at(0).attributes('title')).toBe(users[2].name);
+ expect(userItems.at(0).attributes()).toMatchObject({
+ 'data-user-id': `${users[2].id}`,
+ 'data-username': users[2].username,
+ });
});
it('passes the sorted assignees to the collapsed-assignee-list', () => {
diff --git a/spec/frontend/sidebar/components/assignees/collapsed_assignee_list_spec.js b/spec/frontend/sidebar/components/assignees/collapsed_assignee_list_spec.js
index 40d3d090bb4..52d68d7047e 100644
--- a/spec/frontend/sidebar/components/assignees/collapsed_assignee_list_spec.js
+++ b/spec/frontend/sidebar/components/assignees/collapsed_assignee_list_spec.js
@@ -194,7 +194,7 @@ describe('CollapsedAssigneeList component', () => {
${[busyUser, canMergeUser]} | ${1} | ${1} | ${`${busyUser.name} (Busy), ${canMergeUser.name} (1/2 can merge)`}
${[busyUser]} | ${1} | ${0} | ${`${busyUser.name} (Busy) (cannot merge)`}
${[canMergeUser]} | ${0} | ${1} | ${`${canMergeUser.name}`}
- ${[]} | ${0} | ${0} | ${'Assignee(s)'}
+ ${[]} | ${0} | ${0} | ${'Assignees'}
`(
'with $users.length users, $busy is busy and $canMerge that can merge',
({ users, expected }) => {
diff --git a/spec/frontend/sidebar/components/assignees/sidebar_assignees_spec.js b/spec/frontend/sidebar/components/assignees/sidebar_assignees_spec.js
index a189d3656a2..a8b2db66723 100644
--- a/spec/frontend/sidebar/components/assignees/sidebar_assignees_spec.js
+++ b/spec/frontend/sidebar/components/assignees/sidebar_assignees_spec.js
@@ -8,6 +8,7 @@ import SidebarAssignees from '~/sidebar/components/assignees/sidebar_assignees.v
import SidebarService from '~/sidebar/services/sidebar_service';
import SidebarMediator from '~/sidebar/sidebar_mediator';
import SidebarStore from '~/sidebar/stores/sidebar_store';
+import eventHub from '~/sidebar/event_hub';
import Mock from '../../mock_data';
describe('sidebar assignees', () => {
@@ -30,6 +31,9 @@ describe('sidebar assignees', () => {
});
};
+ const findAssigness = () => wrapper.findComponent(Assigness);
+ const findAssigneesRealtime = () => wrapper.findComponent(AssigneesRealtime);
+
beforeEach(() => {
axiosMock = new AxiosMockAdapter(axios);
mediator = new SidebarMediator(Mock.mediator);
@@ -50,18 +54,20 @@ describe('sidebar assignees', () => {
expect(mediator.saveAssignees).not.toHaveBeenCalled();
- wrapper.vm.saveAssignees();
+ eventHub.$emit('sidebar.saveAssignees');
expect(mediator.saveAssignees).toHaveBeenCalled();
});
- it('calls the mediator when "assignSelf" method is called', () => {
+ it('calls the mediator when "assignSelf" method is called', async () => {
createComponent();
+ mediator.store.isFetching.assignees = false;
+ await nextTick();
expect(mediator.assignYourself).not.toHaveBeenCalled();
expect(mediator.store.assignees.length).toBe(0);
- wrapper.vm.assignSelf();
+ await findAssigness().vm.$emit('assign-self');
expect(mediator.assignYourself).toHaveBeenCalled();
expect(mediator.store.assignees.length).toBe(1);
@@ -70,19 +76,19 @@ describe('sidebar assignees', () => {
it('hides assignees until fetched', async () => {
createComponent();
- expect(wrapper.findComponent(Assigness).exists()).toBe(false);
+ expect(findAssigness().exists()).toBe(false);
- wrapper.vm.store.isFetching.assignees = false;
+ mediator.store.isFetching.assignees = false;
await nextTick();
- expect(wrapper.findComponent(Assigness).exists()).toBe(true);
+ expect(findAssigness().exists()).toBe(true);
});
describe('when issuableType is issue', () => {
it('finds AssigneesRealtime component', () => {
createComponent();
- expect(wrapper.findComponent(AssigneesRealtime).exists()).toBe(true);
+ expect(findAssigneesRealtime().exists()).toBe(true);
});
});
@@ -90,7 +96,7 @@ describe('sidebar assignees', () => {
it('does not find AssigneesRealtime component', () => {
createComponent({ issuableType: 'MR' });
- expect(wrapper.findComponent(AssigneesRealtime).exists()).toBe(false);
+ expect(findAssigneesRealtime().exists()).toBe(false);
});
});
});
diff --git a/spec/frontend/sidebar/components/lock/issuable_lock_form_spec.js b/spec/frontend/sidebar/components/lock/issuable_lock_form_spec.js
index 47f68e1fe83..da79daebb93 100644
--- a/spec/frontend/sidebar/components/lock/issuable_lock_form_spec.js
+++ b/spec/frontend/sidebar/components/lock/issuable_lock_form_spec.js
@@ -1,3 +1,4 @@
+import { GlIcon } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
import Vuex from 'vuex';
@@ -154,6 +155,13 @@ describe('IssuableLockForm', () => {
expect(tooltip).toBeDefined();
expect(tooltip.value.title).toBe(isLocked ? 'Locked' : 'Unlocked');
});
+
+ it('renders lock icon', () => {
+ const icon = findSidebarCollapseIcon().findComponent(GlIcon).props('name');
+ const expected = isLocked ? 'lock' : 'lock-open';
+
+ expect(icon).toBe(expected);
+ });
});
});
});
diff --git a/spec/frontend/sidebar/components/participants/participants_spec.js b/spec/frontend/sidebar/components/participants/participants_spec.js
index 72d83ebeca4..2b0eac46313 100644
--- a/spec/frontend/sidebar/components/participants/participants_spec.js
+++ b/spec/frontend/sidebar/components/participants/participants_spec.js
@@ -63,6 +63,19 @@ describe('Participants component', () => {
expect(findParticipantsAuthor()).toHaveLength(numberOfLessParticipants);
});
+ it('participants link has data attributes and class present for popover support', () => {
+ const numberOfLessParticipants = 2;
+ wrapper = mountComponent({ participants, numberOfLessParticipants });
+
+ const participantsLink = wrapper.find('.js-user-link');
+
+ expect(participantsLink.attributes()).toMatchObject({
+ href: `${participant.web_url}`,
+ 'data-user-id': `${participant.id}`,
+ 'data-username': `${participant.username}`,
+ });
+ });
+
it('when only showing all participants, each has an avatar', async () => {
wrapper = mountComponent({ participants, numberOfLessParticipants: 2 });
diff --git a/spec/frontend/sidebar/components/reviewers/reviewer_avatar_link_spec.js b/spec/frontend/sidebar/components/reviewers/reviewer_avatar_link_spec.js
new file mode 100644
index 00000000000..79d12fa3992
--- /dev/null
+++ b/spec/frontend/sidebar/components/reviewers/reviewer_avatar_link_spec.js
@@ -0,0 +1,66 @@
+import { shallowMount } from '@vue/test-utils';
+import { GlLink } from '@gitlab/ui';
+import { TEST_HOST } from 'helpers/test_constants';
+import ReviewerAvatar from '~/sidebar/components/reviewers/reviewer_avatar.vue';
+import ReviewerAvatarLink from '~/sidebar/components/reviewers/reviewer_avatar_link.vue';
+import userDataMock from '../../user_data_mock';
+
+const TEST_ISSUABLE_TYPE = 'merge_request';
+
+describe('ReviewerAvatarLink component', () => {
+ const mockUserData = {
+ ...userDataMock(),
+ webUrl: `${TEST_HOST}/root`,
+ };
+ let wrapper;
+
+ function createComponent(props = {}) {
+ const propsData = {
+ user: mockUserData,
+ rootPath: TEST_HOST,
+ issuableType: TEST_ISSUABLE_TYPE,
+ ...props,
+ };
+
+ wrapper = shallowMount(ReviewerAvatarLink, {
+ propsData,
+ });
+ }
+
+ const findUserLink = () => wrapper.findComponent(GlLink);
+
+ it('has the root url present in the assigneeUrl method', () => {
+ createComponent();
+
+ expect(wrapper.attributes().href).toEqual(mockUserData.web_url);
+ });
+
+ it('renders reviewer avatar', () => {
+ createComponent();
+
+ expect(wrapper.findComponent(ReviewerAvatar).props()).toMatchObject({
+ imgSize: 24,
+ user: mockUserData,
+ });
+ });
+
+ it('passes the correct user id, username, cannotMerge, and CSS class for popover support', () => {
+ const { id, username } = mockUserData;
+
+ createComponent({
+ tooltipHasName: true,
+ issuableType: 'merge_request',
+ user: mockUserData,
+ });
+
+ const userLink = findUserLink();
+
+ expect(userLink.attributes()).toMatchObject({
+ 'data-user-id': `${id}`,
+ 'data-username': username,
+ 'data-cannot-merge': 'true',
+ 'data-placement': 'left',
+ });
+ expect(userLink.classes()).toContain('js-user-link');
+ });
+});
diff --git a/spec/frontend/sidebar/components/severity/sidebar_severity_widget_spec.js b/spec/frontend/sidebar/components/severity/sidebar_severity_widget_spec.js
index bee90d2b2b6..05fb75dc0fb 100644
--- a/spec/frontend/sidebar/components/severity/sidebar_severity_widget_spec.js
+++ b/spec/frontend/sidebar/components/severity/sidebar_severity_widget_spec.js
@@ -1,4 +1,4 @@
-import { GlDropdown, GlDropdownItem, GlLoadingIcon, GlTooltip, GlSprintf } from '@gitlab/ui';
+import { GlCollapsibleListbox, GlLoadingIcon, GlTooltip, GlSprintf } from '@gitlab/ui';
import Vue, { nextTick } from 'vue';
import VueApollo from 'vue-apollo';
import createMockApollo from 'helpers/mock_apollo_helper';
@@ -51,8 +51,7 @@ describe('SidebarSeverityWidget', () => {
const findSeverityToken = () => wrapper.findAllComponents(SeverityToken);
const findEditBtn = () => wrapper.findByTestId('edit-button');
- const findDropdown = () => wrapper.findComponent(GlDropdown);
- const findCriticalSeverityDropdownItem = () => wrapper.findComponent(GlDropdownItem); // First dropdown item is critical severity
+ const findDropdown = () => wrapper.findComponent(GlCollapsibleListbox);
const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
const findTooltip = () => wrapper.findComponent(GlTooltip);
const findCollapsedSeverity = () => wrapper.findComponent({ ref: 'severity' });
@@ -87,7 +86,7 @@ describe('SidebarSeverityWidget', () => {
});
createComponent({ mutationMock });
- findCriticalSeverityDropdownItem().vm.$emit('click');
+ findDropdown().vm.$emit('select', severity);
expect(mutationMock).toHaveBeenCalledWith({
iid,
@@ -100,7 +99,7 @@ describe('SidebarSeverityWidget', () => {
const mutationMock = jest.fn().mockRejectedValue('Something went wrong');
createComponent({ mutationMock });
- findCriticalSeverityDropdownItem().vm.$emit('click');
+ findDropdown().vm.$emit('select', severity);
await waitForPromises();
expect(createAlert).toHaveBeenCalled();
@@ -110,7 +109,7 @@ describe('SidebarSeverityWidget', () => {
const mutationMock = jest.fn().mockRejectedValue({});
createComponent({ mutationMock });
- findCriticalSeverityDropdownItem().vm.$emit('click');
+ findDropdown().vm.$emit('select', severity);
await nextTick();
expect(findLoadingIcon().exists()).toBe(true);
diff --git a/spec/frontend/sidebar/components/time_tracking/create_timelog_form_spec.js b/spec/frontend/sidebar/components/time_tracking/create_timelog_form_spec.js
index a7c3867c359..a3b32e98506 100644
--- a/spec/frontend/sidebar/components/time_tracking/create_timelog_form_spec.js
+++ b/spec/frontend/sidebar/components/time_tracking/create_timelog_form_spec.js
@@ -1,9 +1,10 @@
import Vue, { nextTick } from 'vue';
import VueApollo from 'vue-apollo';
-import { GlAlert, GlModal } from '@gitlab/ui';
+import { GlAlert, GlModal, GlFormInput, GlDatepicker, GlFormTextarea } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
+import { stubComponent } from 'helpers/stub_component';
import { convertToGraphQLId } from '~/graphql_shared/utils';
import CreateTimelogForm from '~/sidebar/components/time_tracking/create_timelog_form.vue';
import createTimelogMutation from '~/sidebar/queries/create_timelog.mutation.graphql';
@@ -49,21 +50,19 @@ describe('Create Timelog Form', () => {
const findSaveButton = () => findModal().props('actionPrimary');
const findSaveButtonLoadingState = () => findSaveButton().attributes.loading;
const findSaveButtonDisabledState = () => findSaveButton().attributes.disabled;
+ const findGlFormInput = () => wrapper.findComponent(GlFormInput);
+ const findGlDatepicker = () => wrapper.findComponent(GlDatepicker);
+ const findGlFormTextarea = () => wrapper.findComponent(GlFormTextarea);
const submitForm = () => findForm().trigger('submit');
const mountComponent = (
- { props, data, providedProps } = {},
+ { props, providedProps } = {},
mutationResolverMock = rejectedMutationMock,
) => {
fakeApollo = createMockApollo([[createTimelogMutation, mutationResolverMock]]);
wrapper = shallowMountExtended(CreateTimelogForm, {
- data() {
- return {
- ...data,
- };
- },
provide: {
issuableType: 'issue',
...providedProps,
@@ -73,13 +72,17 @@ describe('Create Timelog Form', () => {
...props,
},
apolloProvider: fakeApollo,
+ stubs: {
+ GlModal: stubComponent(GlModal, {
+ methods: { close: modalCloseMock },
+ }),
+ },
});
-
- wrapper.vm.$refs.modal.close = modalCloseMock;
};
afterEach(() => {
fakeApollo = null;
+ modalCloseMock.mockClear();
});
describe('save button', () => {
@@ -90,15 +93,18 @@ describe('Create Timelog Form', () => {
expect(findSaveButtonDisabledState()).toBe(true);
});
- it('is enabled and not loading when time spent is not empty', () => {
- mountComponent({ data: { timeSpent: '2d' } });
+ it('is enabled and not loading when time spent is not empty', async () => {
+ mountComponent();
+
+ await findGlFormInput().vm.$emit('input', '2d');
expect(findSaveButtonLoadingState()).toBe(false);
expect(findSaveButtonDisabledState()).toBe(false);
});
it('is disabled and loading when the the form is submitted', async () => {
- mountComponent({ data: { timeSpent: '2d' } });
+ mountComponent();
+ await findGlFormInput().vm.$emit('input', '2d');
submitForm();
@@ -109,7 +115,8 @@ describe('Create Timelog Form', () => {
});
it('is enabled and not loading the when form is submitted but the mutation has errors', async () => {
- mountComponent({ data: { timeSpent: '2d' } });
+ mountComponent();
+ await findGlFormInput().vm.$emit('input', '2d');
submitForm();
@@ -121,7 +128,8 @@ describe('Create Timelog Form', () => {
});
it('is enabled and not loading the when form is submitted but the mutation returns errors', async () => {
- mountComponent({ data: { timeSpent: '2d' } }, resolvedMutationWithErrorsMock);
+ mountComponent({}, resolvedMutationWithErrorsMock);
+ await findGlFormInput().vm.$emit('input', '2d');
submitForm();
@@ -145,7 +153,8 @@ describe('Create Timelog Form', () => {
});
it('closes the modal after a successful mutation', async () => {
- mountComponent({ data: { timeSpent: '2d' } }, resolvedMutationWithoutErrorsMock);
+ mountComponent({}, resolvedMutationWithoutErrorsMock);
+ await findGlFormInput().vm.$emit('input', '2d');
submitForm();
@@ -166,7 +175,10 @@ describe('Create Timelog Form', () => {
const spentAt = '2022-11-20T21:53:00+0000';
const summary = 'Example';
- mountComponent({ data: { timeSpent, spentAt, summary }, providedProps: { issuableType } });
+ mountComponent({ providedProps: { issuableType } });
+ await findGlFormInput().vm.$emit('input', timeSpent);
+ await findGlDatepicker().vm.$emit('input', spentAt);
+ await findGlFormTextarea().vm.$emit('input', summary);
submitForm();
@@ -187,7 +199,8 @@ describe('Create Timelog Form', () => {
});
it('shows an error if the submission fails with a handled error', async () => {
- mountComponent({ data: { timeSpent: '2d' } }, resolvedMutationWithErrorsMock);
+ mountComponent({}, resolvedMutationWithErrorsMock);
+ await findGlFormInput().vm.$emit('input', '2d');
submitForm();
@@ -198,7 +211,8 @@ describe('Create Timelog Form', () => {
});
it('shows an error if the submission fails with an unhandled error', async () => {
- mountComponent({ data: { timeSpent: '2d' } });
+ mountComponent();
+ await findGlFormInput().vm.$emit('input', '2d');
submitForm();
diff --git a/spec/frontend/sidebar/components/time_tracking/mock_data.js b/spec/frontend/sidebar/components/time_tracking/mock_data.js
index f161ae677d0..08b6c71629a 100644
--- a/spec/frontend/sidebar/components/time_tracking/mock_data.js
+++ b/spec/frontend/sidebar/components/time_tracking/mock_data.js
@@ -148,3 +148,16 @@ export const getMrTimelogsQueryResponse = {
},
},
};
+
+export const deleteTimelogMutationResponse = {
+ data: {
+ timelogDelete: {
+ errors: [],
+ timelog: {
+ id: 'gid://gitlab/Issue/148',
+ issue: {},
+ mergeRequest: {},
+ },
+ },
+ },
+};
diff --git a/spec/frontend/sidebar/components/time_tracking/report_spec.js b/spec/frontend/sidebar/components/time_tracking/report_spec.js
index 713ae83cbf1..6f25c4a10fd 100644
--- a/spec/frontend/sidebar/components/time_tracking/report_spec.js
+++ b/spec/frontend/sidebar/components/time_tracking/report_spec.js
@@ -12,6 +12,7 @@ import getIssueTimelogsQuery from '~/sidebar/queries/get_issue_timelogs.query.gr
import getMrTimelogsQuery from '~/sidebar/queries/get_mr_timelogs.query.graphql';
import deleteTimelogMutation from '~/sidebar/queries/delete_timelog.mutation.graphql';
import {
+ deleteTimelogMutationResponse,
getIssueTimelogsQueryResponse,
getMrTimelogsQueryResponse,
timelogToRemoveId,
@@ -22,7 +23,7 @@ jest.mock('~/alert');
describe('Issuable Time Tracking Report', () => {
Vue.use(VueApollo);
let wrapper;
- let fakeApollo;
+
const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
const findDeleteButton = () => wrapper.findByTestId('deleteButton');
const successIssueQueryHandler = jest.fn().mockResolvedValue(getIssueTimelogsQueryResponse);
@@ -30,30 +31,27 @@ describe('Issuable Time Tracking Report', () => {
const mountComponent = ({
queryHandler = successIssueQueryHandler,
+ mutationHandler,
issuableType = 'issue',
mountFunction = shallowMount,
limitToHours = false,
} = {}) => {
- fakeApollo = createMockApollo([
- [getIssueTimelogsQuery, queryHandler],
- [getMrTimelogsQuery, queryHandler],
- ]);
wrapper = extendedWrapper(
mountFunction(Report, {
+ apolloProvider: createMockApollo([
+ [getIssueTimelogsQuery, queryHandler],
+ [getMrTimelogsQuery, queryHandler],
+ [deleteTimelogMutation, mutationHandler],
+ ]),
provide: {
issuableId: 1,
issuableType,
},
propsData: { limitToHours, issuableId: '1' },
- apolloProvider: fakeApollo,
}),
);
};
- afterEach(() => {
- fakeApollo = null;
- });
-
it('should render loading spinner', () => {
mountComponent();
@@ -135,50 +133,27 @@ describe('Issuable Time Tracking Report', () => {
});
describe('when clicking on the delete timelog button', () => {
- beforeEach(() => {
- mountComponent({ mountFunction: mount });
- });
-
it('calls `$apollo.mutate` with deleteTimelogMutation mutation and removes the row', async () => {
- const mutateSpy = jest.spyOn(wrapper.vm.$apollo, 'mutate').mockResolvedValue({
- data: {
- timelogDelete: {
- errors: [],
- },
- },
- });
-
+ const mutateSpy = jest.fn().mockResolvedValue(deleteTimelogMutationResponse);
+ mountComponent({ mutationHandler: mutateSpy, mountFunction: mount });
await waitForPromises();
+
await findDeleteButton().trigger('click');
await waitForPromises();
expect(createAlert).not.toHaveBeenCalled();
- expect(mutateSpy).toHaveBeenCalledWith({
- mutation: deleteTimelogMutation,
- variables: {
- input: {
- id: timelogToRemoveId,
- },
- },
- });
+ expect(mutateSpy).toHaveBeenCalledWith({ input: { id: timelogToRemoveId } });
});
it('calls `createAlert` with errorMessage and does not remove the row on promise reject', async () => {
- const mutateSpy = jest.spyOn(wrapper.vm.$apollo, 'mutate').mockRejectedValue({});
-
+ const mutateSpy = jest.fn().mockRejectedValue({});
+ mountComponent({ mutationHandler: mutateSpy, mountFunction: mount });
await waitForPromises();
+
await findDeleteButton().trigger('click');
await waitForPromises();
- expect(mutateSpy).toHaveBeenCalledWith({
- mutation: deleteTimelogMutation,
- variables: {
- input: {
- id: timelogToRemoveId,
- },
- },
- });
-
+ expect(mutateSpy).toHaveBeenCalledWith({ input: { id: timelogToRemoveId } });
expect(createAlert).toHaveBeenCalledWith({
message: 'An error occurred while removing the timelog.',
captureError: true,
diff --git a/spec/frontend/sidebar/components/todo_toggle/__snapshots__/todo_spec.js.snap b/spec/frontend/sidebar/components/todo_toggle/__snapshots__/todo_spec.js.snap
index 846f45345e7..fd525474923 100644
--- a/spec/frontend/sidebar/components/todo_toggle/__snapshots__/todo_spec.js.snap
+++ b/spec/frontend/sidebar/components/todo_toggle/__snapshots__/todo_spec.js.snap
@@ -27,6 +27,7 @@ exports[`SidebarTodo template renders component container element with proper da
label="Loading"
size="sm"
style="display: none;"
+ variant="spinner"
/>
</button>
`;
diff --git a/spec/frontend/sidebar/components/todo_toggle/todo_button_spec.js b/spec/frontend/sidebar/components/todo_toggle/todo_button_spec.js
index 472a89e9b21..4385db43a4a 100644
--- a/spec/frontend/sidebar/components/todo_toggle/todo_button_spec.js
+++ b/spec/frontend/sidebar/components/todo_toggle/todo_button_spec.js
@@ -23,7 +23,6 @@ describe('Todo Button', () => {
afterEach(() => {
dispatchEventSpy = null;
- jest.clearAllMocks();
});
it('renders GlButton', () => {
diff --git a/spec/frontend/sidebar/sidebar_mediator_spec.js b/spec/frontend/sidebar/sidebar_mediator_spec.js
index f2003aee96e..9c12088216b 100644
--- a/spec/frontend/sidebar/sidebar_mediator_spec.js
+++ b/spec/frontend/sidebar/sidebar_mediator_spec.js
@@ -25,8 +25,6 @@ describe('Sidebar mediator', () => {
SidebarService.singleton = null;
SidebarStore.singleton = null;
SidebarMediator.singleton = null;
-
- jest.clearAllMocks();
});
it('assigns yourself', () => {
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 c8d972b19a3..05c1a6dd11d 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
@@ -24,7 +24,7 @@ exports[`Snippet Description Edit component rendering matches the snapshot 1`] =
</div>
<div
- class="js-vue-markdown-field md-area position-relative gfm-form js-expanded"
+ class="js-vue-markdown-field md-area position-relative gfm-form gl-overflow-hidden js-expanded"
data-uploads-path=""
>
<markdown-header-stub
@@ -83,16 +83,17 @@ exports[`Snippet Description Edit component rendering matches the snapshot 1`] =
<markdown-toolbar-stub
canattachfile="true"
markdowndocspath="help/"
- quickactionsdocspath=""
showcommenttoolbar="true"
/>
</div>
</div>
<div
- class="js-vue-md-preview md md-preview-holder gl-px-5"
+ class="js-vue-md-preview md-preview-holder gl-px-5 md"
style="display: none;"
- />
+ >
+ <div />
+ </div>
<!---->
diff --git a/spec/frontend/snippets/components/snippet_visibility_edit_spec.js b/spec/frontend/snippets/components/snippet_visibility_edit_spec.js
index 70eb719f706..e2a9967f6ad 100644
--- a/spec/frontend/snippets/components/snippet_visibility_edit_spec.js
+++ b/spec/frontend/snippets/components/snippet_visibility_edit_spec.js
@@ -134,6 +134,17 @@ describe('Snippet Visibility Edit component', () => {
description: SNIPPET_VISIBILITY.private.description_project,
});
});
+
+ it('when project snippet, renders special public description', () => {
+ createComponent({ propsData: { isProjectSnippet: true }, deep: true });
+
+ expect(findRadiosData()[2]).toEqual({
+ value: VISIBILITY_LEVEL_PUBLIC_STRING,
+ icon: SNIPPET_VISIBILITY.public.icon,
+ text: SNIPPET_VISIBILITY.public.label,
+ description: SNIPPET_VISIBILITY.public.description_project,
+ });
+ });
});
});
diff --git a/spec/frontend/super_sidebar/components/create_menu_spec.js b/spec/frontend/super_sidebar/components/create_menu_spec.js
index fe2fd17ae4d..510a3f5b913 100644
--- a/spec/frontend/super_sidebar/components/create_menu_spec.js
+++ b/spec/frontend/super_sidebar/components/create_menu_spec.js
@@ -20,8 +20,12 @@ describe('CreateMenu component', () => {
const findInviteMembersTrigger = () => wrapper.findComponent(InviteMembersTrigger);
const findGlTooltip = () => wrapper.findComponent(GlTooltip);
- const createWrapper = () => {
+ const createWrapper = ({ provide = {} } = {}) => {
wrapper = shallowMountExtended(CreateMenu, {
+ provide: {
+ isImpersonating: false,
+ ...provide,
+ },
propsData: {
groups: createNewMenuGroups,
},
@@ -90,4 +94,13 @@ describe('CreateMenu component', () => {
expect(findGlTooltip().exists()).toBe(true);
});
});
+
+ it('decreases the dropdown offset when impersonating a user', () => {
+ createWrapper({ provide: { isImpersonating: true } });
+
+ expect(findGlDisclosureDropdown().props('dropdownOffset')).toEqual({
+ crossAxis: -115,
+ mainAxis: 4,
+ });
+ });
});
diff --git a/spec/frontend/super_sidebar/components/global_search/command_palette/command_palette_items_spec.js b/spec/frontend/super_sidebar/components/global_search/command_palette/command_palette_items_spec.js
index 21d085dc0fb..85eb7e2e241 100644
--- a/spec/frontend/super_sidebar/components/global_search/command_palette/command_palette_items_spec.js
+++ b/spec/frontend/super_sidebar/components/global_search/command_palette/command_palette_items_spec.js
@@ -6,18 +6,22 @@ import CommandPaletteItems from '~/super_sidebar/components/global_search/comman
import {
COMMAND_HANDLE,
USERS_GROUP_TITLE,
+ PATH_GROUP_TITLE,
USER_HANDLE,
+ PATH_HANDLE,
SEARCH_SCOPE,
+ MAX_ROWS,
} from '~/super_sidebar/components/global_search/command_palette/constants';
import {
commandMapper,
linksReducer,
+ fileMapper,
} from '~/super_sidebar/components/global_search/command_palette/utils';
import { getFormattedItem } from '~/super_sidebar/components/global_search/utils';
import axios from '~/lib/utils/axios_utils';
import { HTTP_STATUS_OK } from '~/lib/utils/http_status';
import waitForPromises from 'helpers/wait_for_promises';
-import { COMMANDS, LINKS, USERS } from './mock_data';
+import { COMMANDS, LINKS, USERS, FILES } from './mock_data';
const links = LINKS.reduce(linksReducer, []);
@@ -25,6 +29,8 @@ describe('CommandPaletteItems', () => {
let wrapper;
const autocompletePath = '/autocomplete';
const searchContext = { project: { id: 1 }, group: { id: 2 } };
+ const projectFilesPath = 'project/files/path';
+ const projectBlobPath = '/blob/main';
const createComponent = (props) => {
wrapper = shallowMount(CommandPaletteItems, {
@@ -42,6 +48,8 @@ describe('CommandPaletteItems', () => {
commandPaletteLinks: LINKS,
autocompletePath,
searchContext,
+ projectFilesPath,
+ projectBlobPath,
},
});
};
@@ -50,7 +58,7 @@ describe('CommandPaletteItems', () => {
const findGroups = () => wrapper.findAllComponents(GlDisclosureDropdownGroup);
const findLoader = () => wrapper.findComponent(GlLoadingIcon);
- describe('COMMANDS & LINKS', () => {
+ describe('Commands and links', () => {
it('renders all commands initially', () => {
createComponent();
const commandGroup = COMMANDS.map(commandMapper)[0];
@@ -90,7 +98,7 @@ describe('CommandPaletteItems', () => {
});
});
- describe('USERS, ISSUES, PROJECTS', () => {
+ describe('Users, issues, and projects', () => {
let mockAxios;
beforeEach(() => {
@@ -140,4 +148,83 @@ describe('CommandPaletteItems', () => {
expect(wrapper.text()).toBe('No results found');
});
});
+
+ describe('Project files', () => {
+ let mockAxios;
+
+ beforeEach(() => {
+ mockAxios = new MockAdapter(axios);
+ });
+
+ it('should request project files on first search', () => {
+ jest.spyOn(axios, 'get');
+ const searchQuery = 'gitlab-ci.yml';
+ createComponent({ handle: PATH_HANDLE, searchQuery });
+
+ expect(axios.get).toHaveBeenCalledWith(projectFilesPath);
+ expect(findLoader().exists()).toBe(true);
+ });
+
+ it(`should render all items when returned number of items is less than ${MAX_ROWS}`, async () => {
+ const numberOfItems = MAX_ROWS - 1;
+ const items = FILES.slice(0, numberOfItems).map(fileMapper.bind(null, projectBlobPath));
+ mockAxios.onGet().replyOnce(HTTP_STATUS_OK, FILES.slice(0, numberOfItems));
+ jest.spyOn(fuzzaldrinPlus, 'filter').mockReturnValue(items);
+
+ const searchQuery = 'gitlab-ci.yml';
+ createComponent({ handle: PATH_HANDLE, searchQuery });
+
+ await waitForPromises();
+
+ expect(findGroups().at(0).props('group')).toMatchObject({
+ name: PATH_GROUP_TITLE,
+ items: items.slice(0, MAX_ROWS),
+ });
+
+ expect(findItems()).toHaveLength(numberOfItems);
+ });
+
+ it(`should render first ${MAX_ROWS} returned items when number of returned items exceeds ${MAX_ROWS}`, async () => {
+ const items = FILES.map(fileMapper.bind(null, projectBlobPath));
+ mockAxios.onGet().replyOnce(HTTP_STATUS_OK, FILES);
+ jest.spyOn(fuzzaldrinPlus, 'filter').mockReturnValue(items);
+
+ const searchQuery = 'gitlab-ci.yml';
+ createComponent({ handle: PATH_HANDLE, searchQuery });
+
+ await waitForPromises();
+
+ expect(findItems()).toHaveLength(MAX_ROWS);
+ expect(findGroups().at(0).props('group')).toMatchObject({
+ name: PATH_GROUP_TITLE,
+ items: items.slice(0, MAX_ROWS),
+ });
+ });
+
+ it('should display no results message when no files matched the search query', async () => {
+ mockAxios.onGet().replyOnce(HTTP_STATUS_OK, []);
+ const searchQuery = 'gitlab-ci.yml';
+ createComponent({ handle: PATH_HANDLE, searchQuery });
+ await waitForPromises();
+ expect(wrapper.text()).toBe('No results found');
+ });
+
+ it('should not make additional server call on the search query change', async () => {
+ const searchQuery = 'gitlab-ci.yml';
+ const newSearchQuery = 'package.json';
+
+ jest.spyOn(axios, 'get');
+
+ createComponent({ handle: PATH_HANDLE, searchQuery });
+
+ mockAxios.onGet().replyOnce(HTTP_STATUS_OK, FILES);
+ await waitForPromises();
+
+ expect(axios.get).toHaveBeenCalledTimes(1);
+
+ await wrapper.setProps({ searchQuery: newSearchQuery });
+
+ expect(axios.get).toHaveBeenCalledTimes(1);
+ });
+ });
});
diff --git a/spec/frontend/super_sidebar/components/global_search/command_palette/mock_data.js b/spec/frontend/super_sidebar/components/global_search/command_palette/mock_data.js
index ec65a43d549..d01e5c85741 100644
--- a/spec/frontend/super_sidebar/components/global_search/command_palette/mock_data.js
+++ b/spec/frontend/super_sidebar/components/global_search/command_palette/mock_data.js
@@ -131,3 +131,46 @@ export const ISSUE = {
project_name: 'Flight',
url: '/flightjs/Flight/-/issues/37',
};
+
+export const FILES = [
+ '.gitattributes',
+ '.gitignore',
+ '.gitmodules',
+ 'CHANGELOG',
+ 'CONTRIBUTING.md',
+ 'Gemfile.zip',
+ 'LICENSE',
+ 'MAINTENANCE.md',
+ 'PROCESS.md',
+ 'README',
+ 'README.md',
+ 'VERSION',
+ 'bar/branch-test.txt',
+ 'custom-highlighting/test.gitlab-custom',
+ 'encoding/feature-1.txt',
+ 'encoding/feature-2.txt',
+ 'encoding/hotfix-1.txt',
+ 'encoding/hotfix-2.txt',
+ 'encoding/iso8859.txt',
+ 'encoding/russian.rb',
+ 'encoding/test.txt',
+ 'encoding/テスト.txt',
+ 'encoding/テスト.xls',
+ 'files/flat/path/correct/content.txt',
+ 'files/html/500.html',
+ 'files/images/6049019_460s.jpg',
+ 'files/images/emoji.png',
+ 'files/images/logo-black.png',
+ 'files/images/logo-white.png',
+ 'files/images/wm.svg',
+ 'files/js/application.js',
+ 'files/js/commit.coffee',
+ 'files/lfs/lfs_object.iso',
+ 'files/markdown/ruby-style-guide.md',
+ 'files/ruby/popen.rb',
+ 'files/ruby/regex.rb',
+ 'files/ruby/version_info.rb',
+ 'files/whitespace',
+ 'foo/bar/.gitkeep',
+ 'with space/README.md',
+];
diff --git a/spec/frontend/super_sidebar/components/global_search/command_palette/utils_spec.js b/spec/frontend/super_sidebar/components/global_search/command_palette/utils_spec.js
index 0b75787723e..ebc52e2d910 100644
--- a/spec/frontend/super_sidebar/components/global_search/command_palette/utils_spec.js
+++ b/spec/frontend/super_sidebar/components/global_search/command_palette/utils_spec.js
@@ -1,6 +1,7 @@
import {
commandMapper,
linksReducer,
+ fileMapper,
} from '~/super_sidebar/components/global_search/command_palette/utils';
import { COMMANDS, LINKS, TRANSFORMED_LINKS } from './mock_data';
@@ -16,3 +17,15 @@ describe('commandMapper', () => {
expect(COMMANDS.map(commandMapper)[0].items).toHaveLength(initialCommandsLength - 1);
});
});
+
+describe('fileMapper', () => {
+ it('should transform files', () => {
+ const file = 'file';
+ const projectBlobPath = 'project/blob/path';
+ expect(fileMapper(projectBlobPath, file)).toEqual({
+ icon: 'doc-code',
+ text: file,
+ href: `${projectBlobPath}/${file}`,
+ });
+ });
+});
diff --git a/spec/frontend/super_sidebar/components/global_search/components/global_search_spec.js b/spec/frontend/super_sidebar/components/global_search/components/global_search_spec.js
index 9b7b9e288df..55108e116bd 100644
--- a/spec/frontend/super_sidebar/components/global_search/components/global_search_spec.js
+++ b/spec/frontend/super_sidebar/components/global_search/components/global_search_spec.js
@@ -12,6 +12,7 @@ import CommandPaletteItems from '~/super_sidebar/components/global_search/comman
import {
SEARCH_OR_COMMAND_MODE_PLACEHOLDER,
COMMON_HANDLES,
+ PATH_HANDLE,
} from '~/super_sidebar/components/global_search/command_palette/constants';
import {
SEARCH_INPUT_DESCRIPTION,
@@ -20,8 +21,6 @@ import {
ICON_GROUP,
ICON_SUBGROUP,
SCOPE_TOKEN_MAX_LENGTH,
- IS_SEARCHING,
- SEARCH_SHORTCUTS_MIN_CHARACTERS,
} from '~/super_sidebar/components/global_search/constants';
import { SEARCH_GITLAB } from '~/vue_shared/global_search/constants';
import { truncate } from '~/lib/utils/text_utility';
@@ -33,7 +32,6 @@ import {
MOCK_USERNAME,
MOCK_DEFAULT_SEARCH_OPTIONS,
MOCK_SCOPED_SEARCH_OPTIONS,
- MOCK_SEARCH_CONTEXT_FULL,
MOCK_PROJECT,
MOCK_GROUP,
} from '../mock_data';
@@ -108,7 +106,6 @@ describe('GlobalSearchModal', () => {
const findGlobalSearchModal = () => wrapper.findComponent(GlModal);
- const findGlobalSearchForm = () => wrapper.findByTestId('global-search-form');
const findGlobalSearchInput = () => wrapper.findComponent(GlSearchBoxByType);
const findScopeToken = () => wrapper.findComponent(GlToken);
const findGlobalSearchDefaultItems = () => wrapper.findComponent(GlobalSearchDefaultItems);
@@ -203,103 +200,70 @@ describe('GlobalSearchModal', () => {
describe('input box', () => {
describe.each`
- search | searchOptions | hasToken
- ${MOCK_SEARCH} | ${[MOCK_SCOPED_SEARCH_OPTIONS[0]]} | ${true}
- ${MOCK_SEARCH} | ${[MOCK_SCOPED_SEARCH_OPTIONS[1]]} | ${true}
- ${MOCK_SEARCH} | ${[MOCK_SCOPED_SEARCH_OPTIONS[2]]} | ${true}
- ${MOCK_SEARCH} | ${[MOCK_SCOPED_SEARCH_OPTIONS[3]]} | ${true}
- ${MOCK_SEARCH} | ${[MOCK_SCOPED_SEARCH_OPTIONS[4]]} | ${true}
- ${'te'} | ${[MOCK_SCOPED_SEARCH_OPTIONS[5]]} | ${false}
- ${'x'} | ${[]} | ${false}
- `('token', ({ search, searchOptions, hasToken }) => {
+ search | hasToken
+ ${MOCK_SEARCH} | ${true}
+ ${'te'} | ${false}
+ ${'x'} | ${false}
+ ${''} | ${false}
+ `('token', ({ search, hasToken }) => {
beforeEach(() => {
window.gon.current_username = MOCK_USERNAME;
- createComponent(
- { search },
- {
- searchOptions: () => searchOptions,
- },
- );
+ createComponent({ search });
findGlobalSearchInput().vm.$emit('click');
});
- it(`${hasToken ? 'is' : 'is NOT'} rendered when data set has type "${
- searchOptions[0]?.html_id
- }"`, () => {
+ it(`${hasToken ? 'is' : 'is NOT'} rendered when search query is "${search}"`, () => {
expect(findScopeToken().exists()).toBe(hasToken);
});
-
- it(`text ${hasToken ? 'is correctly' : 'is NOT'} rendered when text is "${
- searchOptions[0]?.scope || searchOptions[0]?.description
- }"`, () => {
- expect(findScopeToken().exists() && findScopeToken().text()).toBe(
- formatScopeName(searchOptions[0]?.scope || searchOptions[0]?.description),
- );
- });
});
- });
- describe('form', () => {
- describe.each`
- searchContext | search | searchOptions
- ${MOCK_SEARCH_CONTEXT_FULL} | ${null} | ${[]}
- ${MOCK_SEARCH_CONTEXT_FULL} | ${MOCK_SEARCH} | ${[]}
- ${MOCK_SEARCH_CONTEXT_FULL} | ${MOCK_SEARCH} | ${MOCK_SCOPED_SEARCH_OPTIONS}
- ${MOCK_SEARCH_CONTEXT_FULL} | ${MOCK_SEARCH} | ${MOCK_SCOPED_SEARCH_OPTIONS}
- ${null} | ${MOCK_SEARCH} | ${MOCK_SCOPED_SEARCH_OPTIONS}
- ${null} | ${null} | ${MOCK_SCOPED_SEARCH_OPTIONS}
- ${null} | ${null} | ${[]}
- `('wrapper', ({ searchContext, search, searchOptions }) => {
+ describe.each(MOCK_SCOPED_SEARCH_OPTIONS)('token content', (searchOption) => {
beforeEach(() => {
window.gon.current_username = MOCK_USERNAME;
- createComponent({ search, searchContext }, { searchOptions: () => searchOptions });
+ createComponent(
+ { search: MOCK_SEARCH },
+ {
+ searchOptions: () => [searchOption],
+ },
+ );
+ findGlobalSearchInput().vm.$emit('click');
});
- const isSearching = search?.length > SEARCH_SHORTCUTS_MIN_CHARACTERS;
-
- it(`classes ${isSearching ? 'contain' : 'do not contain'} "${IS_SEARCHING}"`, () => {
- if (isSearching) {
- expect(findGlobalSearchForm().classes()).toContain(IS_SEARCHING);
- return;
- }
- if (!isSearching) {
- expect(findGlobalSearchForm().classes()).not.toContain(IS_SEARCHING);
+ it(`is correctly rendered`, () => {
+ if (searchOption.scope) {
+ expect(findScopeToken().text()).toBe(formatScopeName(searchOption.scope));
+ } else {
+ expect(findScopeToken().text()).toBe(formatScopeName(searchOption.description));
}
});
});
- });
- describe.each`
- search | searchOptions | hasIcon | iconName
- ${MOCK_SEARCH} | ${[MOCK_SCOPED_SEARCH_OPTIONS[0]]} | ${true} | ${ICON_PROJECT}
- ${MOCK_SEARCH} | ${[MOCK_SCOPED_SEARCH_OPTIONS[2]]} | ${true} | ${ICON_GROUP}
- ${MOCK_SEARCH} | ${[MOCK_SCOPED_SEARCH_OPTIONS[3]]} | ${true} | ${ICON_SUBGROUP}
- ${MOCK_SEARCH} | ${[MOCK_SCOPED_SEARCH_OPTIONS[4]]} | ${false} | ${false}
- `('token', ({ search, searchOptions, hasIcon, iconName }) => {
- beforeEach(() => {
- window.gon.current_username = MOCK_USERNAME;
- createComponent(
- { search },
- {
- searchOptions: () => searchOptions,
- },
- );
- findGlobalSearchInput().vm.$emit('click');
- });
-
- it(`icon for data set type "${searchOptions[0]?.html_id}" ${
- hasIcon ? 'is' : 'is NOT'
- } rendered`, () => {
- expect(findScopeToken().findComponent(GlIcon).exists()).toBe(hasIcon);
- });
+ describe.each`
+ searchOptions | iconName
+ ${[MOCK_SCOPED_SEARCH_OPTIONS[0]]} | ${ICON_PROJECT}
+ ${[MOCK_SCOPED_SEARCH_OPTIONS[2]]} | ${ICON_GROUP}
+ ${[MOCK_SCOPED_SEARCH_OPTIONS[3]]} | ${ICON_SUBGROUP}
+ ${[MOCK_SCOPED_SEARCH_OPTIONS[4]]} | ${false}
+ `('token', ({ searchOptions, iconName }) => {
+ beforeEach(() => {
+ window.gon.current_username = MOCK_USERNAME;
+ createComponent(
+ { search: MOCK_SEARCH },
+ {
+ searchOptions: () => searchOptions,
+ },
+ );
+ findGlobalSearchInput().vm.$emit('click');
+ });
- it(`render ${iconName ? `"${iconName}"` : 'NO'} icon for data set type "${
- searchOptions[0]?.html_id
- }"`, () => {
- expect(
- findScopeToken().findComponent(GlIcon).exists() &&
- findScopeToken().findComponent(GlIcon).attributes('name'),
- ).toBe(iconName);
+ it(`renders ${iconName ? `"${iconName}"` : 'NO'} icon for "${
+ searchOptions[0]?.text
+ }" scope`, () => {
+ expect(
+ findScopeToken().findComponent(GlIcon).exists() &&
+ findScopeToken().findComponent(GlIcon).attributes('name'),
+ ).toBe(iconName);
+ });
});
});
@@ -319,7 +283,7 @@ describe('GlobalSearchModal', () => {
});
});
- describe.each(COMMON_HANDLES)(
+ describe.each([...COMMON_HANDLES, PATH_HANDLE])(
'when FF `command_palette` is enabled and search handle is %s',
(handle) => {
beforeEach(() => {
@@ -338,6 +302,10 @@ describe('GlobalSearchModal', () => {
SEARCH_OR_COMMAND_MODE_PLACEHOLDER,
);
});
+
+ it('should not render the scope token', () => {
+ expect(findScopeToken().exists()).toBe(false);
+ });
},
);
});
@@ -389,33 +357,41 @@ describe('GlobalSearchModal', () => {
});
describe('Submitting a search', () => {
- beforeEach(() => {
- createComponent();
- });
-
- it('onKey-enter submits a search', () => {
+ const submitSearch = () =>
findGlobalSearchInput().vm.$emit('keydown', new KeyboardEvent({ key: ENTER_KEY }));
- expect(visitUrl).toHaveBeenCalledWith(MOCK_SEARCH_QUERY);
- });
-
- describe('with less than min characters', () => {
+ describe('in command mode', () => {
beforeEach(() => {
- createComponent({ search: 'x' });
+ createComponent({ search: '>' }, undefined, undefined, {
+ commandPalette: true,
+ });
+ submitSearch();
});
- it('onKey-enter will NOT submit a search', () => {
- findGlobalSearchInput().vm.$emit('keydown', new KeyboardEvent({ key: ENTER_KEY }));
+ it('does not submit a search', () => {
+ expect(visitUrl).not.toHaveBeenCalled();
+ });
+ });
+ describe('in search mode', () => {
+ it('will NOT submit a search with less than min characters', () => {
+ createComponent({ search: 'x' });
+ submitSearch();
expect(visitUrl).not.toHaveBeenCalledWith(MOCK_SEARCH_QUERY);
});
+
+ it('will submit a search with the sufficient number of characters', () => {
+ createComponent();
+ submitSearch();
+ expect(visitUrl).toHaveBeenCalledWith(MOCK_SEARCH_QUERY);
+ });
});
});
});
describe('Modal events', () => {
beforeEach(() => {
- createComponent();
+ createComponent({ search: 'searchQuery' });
});
it('should emit `shown` event when modal shown`', () => {
@@ -423,9 +399,10 @@ describe('GlobalSearchModal', () => {
expect(wrapper.emitted('shown')).toHaveLength(1);
});
- it('should emit `hidden` event when modal hidden`', () => {
- findGlobalSearchModal().vm.$emit('hidden');
+ it('should emit `hidden` event when modal hidden and clear the search input', () => {
+ findGlobalSearchModal().vm.$emit('hide');
expect(wrapper.emitted('hidden')).toHaveLength(1);
+ expect(actionSpies.setSearch).toHaveBeenCalledWith(expect.any(Object), '');
});
});
});
diff --git a/spec/frontend/super_sidebar/components/global_search/mock_data.js b/spec/frontend/super_sidebar/components/global_search/mock_data.js
index 0884fce567c..ad7e7b0b30b 100644
--- a/spec/frontend/super_sidebar/components/global_search/mock_data.js
+++ b/spec/frontend/super_sidebar/components/global_search/mock_data.js
@@ -62,20 +62,6 @@ export const MOCK_SEARCH_CONTEXT = {
group_metadata: {},
};
-export const MOCK_SEARCH_CONTEXT_FULL = {
- group: {
- id: 31,
- name: 'testGroup',
- full_name: 'testGroup',
- },
- group_metadata: {
- group_path: 'testGroup',
- name: 'testGroup',
- issues_path: '/groups/testGroup/-/issues',
- mr_path: '/groups/testGroup/-/merge_requests',
- },
-};
-
export const MOCK_DEFAULT_SEARCH_OPTIONS = [
{
text: MSG_ISSUES_ASSIGNED_TO_ME,
diff --git a/spec/frontend/super_sidebar/components/help_center_spec.js b/spec/frontend/super_sidebar/components/help_center_spec.js
index 6af1172e4d8..c92f8a68678 100644
--- a/spec/frontend/super_sidebar/components/help_center_spec.js
+++ b/spec/frontend/super_sidebar/components/help_center_spec.js
@@ -104,7 +104,7 @@ describe('HelpCenter component', () => {
createWrapper({ ...sidebarData, show_tanuki_bot: true });
});
- it('shows Ask GitLab Chat with the help items', () => {
+ it('shows Ask GitLab Duo with the help items', () => {
expect(findDropdownGroup(0).props('group').items).toEqual([
expect.objectContaining({
icon: 'tanuki-ai',
@@ -115,9 +115,9 @@ describe('HelpCenter component', () => {
]);
});
- describe('when Ask GitLab Chat button is clicked', () => {
+ describe('when Ask GitLab Duo button is clicked', () => {
beforeEach(() => {
- findButton('Ask GitLab Chat').click();
+ findButton('Ask GitLab Duo').click();
});
it('sets helpCenterState.showTanukiBotChatDrawer to true', () => {
diff --git a/spec/frontend/super_sidebar/components/sidebar_peek_behavior_spec.js b/spec/frontend/super_sidebar/components/sidebar_peek_behavior_spec.js
index 047dc9a6599..abd9c1dc44d 100644
--- a/spec/frontend/super_sidebar/components/sidebar_peek_behavior_spec.js
+++ b/spec/frontend/super_sidebar/components/sidebar_peek_behavior_spec.js
@@ -9,6 +9,7 @@ import SidebarPeek, {
STATE_OPEN,
STATE_WILL_CLOSE,
} from '~/super_sidebar/components/sidebar_peek_behavior.vue';
+import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
// These are measured at runtime in the browser, but statically defined here
// since Jest does not do layout/styling.
@@ -32,6 +33,7 @@ jest.mock('~/lib/utils/css_utils', () => ({
describe('SidebarPeek component', () => {
let wrapper;
+ let trackingSpy = null;
const createComponent = () => {
wrapper = mount(SidebarPeek);
@@ -54,6 +56,11 @@ describe('SidebarPeek component', () => {
beforeEach(() => {
createComponent();
+ trackingSpy = mockTracking(undefined, undefined, jest.spyOn);
+ });
+
+ afterEach(() => {
+ unmockTracking();
});
it('begins in the closed state', () => {
@@ -87,6 +94,11 @@ describe('SidebarPeek component', () => {
jest.advanceTimersByTime(1);
expect(lastNChangeEvents(2)).toEqual([STATE_WILL_OPEN, STATE_OPEN]);
+
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'nav_peek', {
+ label: 'nav_hover',
+ property: 'nav_sidebar',
+ });
});
it('cancels transition will-open -> open if mouse out of peek region', () => {
diff --git a/spec/frontend/super_sidebar/components/super_sidebar_spec.js b/spec/frontend/super_sidebar/components/super_sidebar_spec.js
index b76c637caf4..0c785109b5e 100644
--- a/spec/frontend/super_sidebar/components/super_sidebar_spec.js
+++ b/spec/frontend/super_sidebar/components/super_sidebar_spec.js
@@ -19,6 +19,7 @@ import {
isCollapsed,
} from '~/super_sidebar/super_sidebar_collapsed_state_manager';
import { stubComponent } from 'helpers/stub_component';
+import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
import { sidebarData as mockSidebarData } from '../mock_data';
const initialSidebarState = { ...sidebarState };
@@ -49,6 +50,7 @@ describe('SuperSidebar component', () => {
const findTrialStatusWidget = () => wrapper.findByTestId(trialStatusWidgetStubTestId);
const findTrialStatusPopover = () => wrapper.findByTestId(trialStatusPopoverStubTestId);
const findSidebarMenu = () => wrapper.findComponent(SidebarMenu);
+ let trackingSpy = null;
const createWrapper = ({
provide = {},
@@ -77,6 +79,11 @@ describe('SuperSidebar component', () => {
beforeEach(() => {
Object.assign(sidebarState, initialSidebarState);
+ trackingSpy = mockTracking(undefined, undefined, jest.spyOn);
+ });
+
+ afterEach(() => {
+ unmockTracking();
});
describe('default', () => {
@@ -143,12 +150,20 @@ describe('SuperSidebar component', () => {
expect(toggleSuperSidebarCollapsed).toHaveBeenCalledTimes(1);
expect(toggleSuperSidebarCollapsed).toHaveBeenCalledWith(true, true);
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'nav_hide', {
+ label: 'nav_toggle_keyboard_shortcut',
+ property: 'nav_sidebar',
+ });
isCollapsed.mockReturnValue(true);
Mousetrap.trigger('mod+\\');
expect(toggleSuperSidebarCollapsed).toHaveBeenCalledTimes(2);
expect(toggleSuperSidebarCollapsed).toHaveBeenCalledWith(false, true);
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'nav_show', {
+ label: 'nav_toggle_keyboard_shortcut',
+ property: 'nav_sidebar',
+ });
jest.spyOn(Mousetrap, 'unbind');
diff --git a/spec/frontend/super_sidebar/components/super_sidebar_toggle_spec.js b/spec/frontend/super_sidebar/components/super_sidebar_toggle_spec.js
index 8bb20186e16..23b735c2773 100644
--- a/spec/frontend/super_sidebar/components/super_sidebar_toggle_spec.js
+++ b/spec/frontend/super_sidebar/components/super_sidebar_toggle_spec.js
@@ -7,6 +7,7 @@ import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import { JS_TOGGLE_COLLAPSE_CLASS, JS_TOGGLE_EXPAND_CLASS } from '~/super_sidebar/constants';
import SuperSidebarToggle from '~/super_sidebar/components/super_sidebar_toggle.vue';
import { toggleSuperSidebarCollapsed } from '~/super_sidebar/super_sidebar_collapsed_state_manager';
+import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
jest.mock('~/super_sidebar/super_sidebar_collapsed_state_manager.js', () => ({
toggleSuperSidebarCollapsed: jest.fn(),
@@ -61,7 +62,7 @@ describe('SuperSidebarToggle component', () => {
});
});
- describe('toolip', () => {
+ describe('tooltip', () => {
it('displays collapse when expanded', () => {
createWrapper();
expect(getTooltip().title).toBe(__('Hide sidebar'));
@@ -74,15 +75,19 @@ describe('SuperSidebarToggle component', () => {
});
describe('toggle', () => {
+ let trackingSpy = null;
+
beforeEach(() => {
setHTMLFixture(`
<button class="${JS_TOGGLE_COLLAPSE_CLASS}">Hide</button>
<button class="${JS_TOGGLE_EXPAND_CLASS}">Show</button>
`);
+ trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
});
afterEach(() => {
resetHTMLFixture();
+ unmockTracking();
});
it('collapses the sidebar and focuses the other toggle', async () => {
@@ -93,6 +98,10 @@ describe('SuperSidebarToggle component', () => {
expect(document.activeElement).toEqual(
document.querySelector(`.${JS_TOGGLE_COLLAPSE_CLASS}`),
);
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'nav_hide', {
+ label: 'nav_toggle',
+ property: 'nav_sidebar',
+ });
});
it('expands the sidebar and focuses the other toggle', async () => {
@@ -101,6 +110,10 @@ describe('SuperSidebarToggle component', () => {
await nextTick();
expect(toggleSuperSidebarCollapsed).toHaveBeenCalledWith(false, true);
expect(document.activeElement).toEqual(document.querySelector(`.${JS_TOGGLE_EXPAND_CLASS}`));
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'nav_show', {
+ label: 'nav_toggle',
+ property: 'nav_sidebar',
+ });
});
});
});
diff --git a/spec/frontend/super_sidebar/components/user_bar_spec.js b/spec/frontend/super_sidebar/components/user_bar_spec.js
index ae48c0f2a75..272e0237219 100644
--- a/spec/frontend/super_sidebar/components/user_bar_spec.js
+++ b/spec/frontend/super_sidebar/components/user_bar_spec.js
@@ -7,7 +7,6 @@ import CreateMenu from '~/super_sidebar/components/create_menu.vue';
import SearchModal from '~/super_sidebar/components/global_search/components/global_search.vue';
import BrandLogo from 'jh_else_ce/super_sidebar/components/brand_logo.vue';
import MergeRequestMenu from '~/super_sidebar/components/merge_request_menu.vue';
-import Counter from '~/super_sidebar/components/counter.vue';
import UserBar from '~/super_sidebar/components/user_bar.vue';
import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
import waitForPromises from 'helpers/wait_for_promises';
@@ -19,10 +18,9 @@ describe('UserBar component', () => {
let wrapper;
const findCreateMenu = () => wrapper.findComponent(CreateMenu);
- const findCounter = (at) => wrapper.findAllComponents(Counter).at(at);
- const findIssuesCounter = () => findCounter(0);
- const findMRsCounter = () => findCounter(1);
- const findTodosCounter = () => findCounter(2);
+ const findIssuesCounter = () => wrapper.findByTestId('issues-shortcut-button');
+ const findMRsCounter = () => wrapper.findByTestId('merge-requests-shortcut-button');
+ const findTodosCounter = () => wrapper.findByTestId('todos-shortcut-button');
const findMergeRequestMenu = () => wrapper.findComponent(MergeRequestMenu);
const findBrandLogo = () => wrapper.findComponent(BrandLogo);
const findCollapseButton = () => wrapper.findByTestId('super-sidebar-collapse-button');
diff --git a/spec/frontend/super_sidebar/components/user_menu_spec.js b/spec/frontend/super_sidebar/components/user_menu_spec.js
index f0f18ca9185..662677be40f 100644
--- a/spec/frontend/super_sidebar/components/user_menu_spec.js
+++ b/spec/frontend/super_sidebar/components/user_menu_spec.js
@@ -20,7 +20,7 @@ describe('UserMenu component', () => {
const closeDropdownSpy = jest.fn();
- const createWrapper = (userDataChanges = {}, stubs = {}) => {
+ const createWrapper = (userDataChanges = {}, stubs = {}, provide = {}) => {
wrapper = mountExtended(UserMenu, {
propsData: {
data: {
@@ -35,6 +35,8 @@ describe('UserMenu component', () => {
},
provide: {
toggleNewNavEndpoint,
+ isImpersonating: false,
+ ...provide,
},
});
@@ -50,6 +52,15 @@ describe('UserMenu component', () => {
});
});
+ it('decreases the dropdown offset when impersonating a user', () => {
+ createWrapper(null, null, { isImpersonating: true });
+
+ expect(findDropdown().props('dropdownOffset')).toEqual({
+ crossAxis: -179,
+ mainAxis: 4,
+ });
+ });
+
describe('Toggle button', () => {
let toggle;
diff --git a/spec/frontend/super_sidebar/components/user_name_group_spec.js b/spec/frontend/super_sidebar/components/user_name_group_spec.js
index 6e3b18d3107..bd02f3c17e3 100644
--- a/spec/frontend/super_sidebar/components/user_name_group_spec.js
+++ b/spec/frontend/super_sidebar/components/user_name_group_spec.js
@@ -91,7 +91,7 @@ describe('UserNameGroup component', () => {
});
it('should render status message', () => {
- expect(findUserStatus().text()).toContain(userMenuMockData.status.message);
+ expect(findUserStatus().html()).toContain(userMenuMockData.status.message_html);
});
it("sets the tooltip's target to the status container", () => {
diff --git a/spec/frontend/super_sidebar/mock_data.js b/spec/frontend/super_sidebar/mock_data.js
index a3a74f7aac8..72c67e34038 100644
--- a/spec/frontend/super_sidebar/mock_data.js
+++ b/spec/frontend/super_sidebar/mock_data.js
@@ -126,6 +126,7 @@ export const userMenuMockStatus = {
customized: false,
emoji: 'art',
message: 'Working on user menu in super sidebar',
+ message_html: '<gl-emoji></gl-emoji> Working on user menu in super sidebar',
availability: 'busy',
clear_after: '2023-02-09 20:06:35 UTC',
};
diff --git a/spec/frontend/super_sidebar/super_sidebar_collapsed_state_manager_spec.js b/spec/frontend/super_sidebar/super_sidebar_collapsed_state_manager_spec.js
index 771d1f07fea..9388d837186 100644
--- a/spec/frontend/super_sidebar/super_sidebar_collapsed_state_manager_spec.js
+++ b/spec/frontend/super_sidebar/super_sidebar_collapsed_state_manager_spec.js
@@ -11,8 +11,10 @@ import {
findPage,
bindSuperSidebarCollapsedEvents,
} from '~/super_sidebar/super_sidebar_collapsed_state_manager';
+import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
const { xl, sm } = breakpoints;
+let trackingSpy = null;
jest.mock('~/lib/utils/common_utils', () => ({
getCookie: jest.fn(),
@@ -27,6 +29,15 @@ const pageHasCollapsedClass = (hasClass) => {
}
};
+const tracksCollapse = (shouldTrack) => {
+ if (shouldTrack) {
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'nav_hide', {
+ label: 'browser_resize',
+ property: 'nav_sidebar',
+ });
+ }
+};
+
describe('Super Sidebar Collapsed State Manager', () => {
beforeEach(() => {
setHTMLFixture(`
@@ -34,10 +45,12 @@ describe('Super Sidebar Collapsed State Manager', () => {
<aside class="super-sidebar"></aside>
</div>
`);
+ trackingSpy = mockTracking(undefined, undefined, jest.spyOn);
});
afterEach(() => {
resetHTMLFixture();
+ unmockTracking();
});
describe('toggleSuperSidebarCollapsed', () => {
@@ -109,14 +122,20 @@ describe('Super Sidebar Collapsed State Manager', () => {
});
it.each`
- initialWindowWidth | updatedWindowWidth | hasClassBeforeResize | hasClassAfterResize
- ${xl} | ${sm} | ${false} | ${true}
- ${sm} | ${xl} | ${true} | ${false}
- ${xl} | ${xl} | ${false} | ${false}
- ${sm} | ${sm} | ${true} | ${true}
+ initialWindowWidth | updatedWindowWidth | hasClassBeforeResize | hasClassAfterResize | sendsTrackingEvent
+ ${xl} | ${sm} | ${false} | ${true} | ${true}
+ ${sm} | ${xl} | ${true} | ${false} | ${false}
+ ${xl} | ${xl} | ${false} | ${false} | ${false}
+ ${sm} | ${sm} | ${true} | ${true} | ${false}
`(
'when changing width from $initialWindowWidth to $updatedWindowWidth expect page to have collapsed class before resize to be $hasClassBeforeResize and after resize to be $hasClassAfterResize',
- ({ initialWindowWidth, updatedWindowWidth, hasClassBeforeResize, hasClassAfterResize }) => {
+ ({
+ initialWindowWidth,
+ updatedWindowWidth,
+ hasClassBeforeResize,
+ hasClassAfterResize,
+ sendsTrackingEvent,
+ }) => {
getCookie.mockReturnValue(undefined);
window.innerWidth = initialWindowWidth;
initSuperSidebarCollapsedState();
@@ -129,6 +148,7 @@ describe('Super Sidebar Collapsed State Manager', () => {
window.dispatchEvent(new Event('resize'));
pageHasCollapsedClass(hasClassAfterResize);
+ tracksCollapse(sendsTrackingEvent);
},
);
});
diff --git a/spec/frontend/tags/components/delete_tag_modal_spec.js b/spec/frontend/tags/components/delete_tag_modal_spec.js
index 8ec9925563a..5a3104fad9b 100644
--- a/spec/frontend/tags/components/delete_tag_modal_spec.js
+++ b/spec/frontend/tags/components/delete_tag_modal_spec.js
@@ -11,6 +11,9 @@ let wrapper;
const tagName = 'test-tag';
const path = '/path/to/tag';
const isProtected = false;
+const modalHideSpy = jest.fn();
+const modalShowSpy = jest.fn();
+const formSubmitSpy = jest.spyOn(HTMLFormElement.prototype, 'submit').mockImplementation();
const createComponent = (data = {}) => {
wrapper = extendedWrapper(
@@ -27,6 +30,10 @@ const createComponent = (data = {}) => {
GlModal: stubComponent(GlModal, {
template:
'<div><slot name="modal-title"></slot><slot></slot><slot name="modal-footer"></slot></div>',
+ methods: {
+ hide: modalHideSpy,
+ show: modalShowSpy,
+ },
}),
GlButton,
GlFormInput,
@@ -61,32 +68,26 @@ describe('Delete tag modal', () => {
});
it('submits the form when the delete button is clicked', () => {
- const submitFormSpy = jest.spyOn(wrapper.vm.$refs.form, 'submit');
-
findDeleteButton().trigger('click');
expect(findForm().attributes('action')).toBe(path);
- expect(submitFormSpy).toHaveBeenCalled();
+ expect(formSubmitSpy).toHaveBeenCalledTimes(1);
});
it('calls show on the modal when a `openModal` event is received through the event hub', () => {
- const showSpy = jest.spyOn(wrapper.vm.$refs.modal, 'show');
-
eventHub.$emit('openModal', {
isProtected,
tagName,
path,
});
- expect(showSpy).toHaveBeenCalled();
+ expect(modalShowSpy).toHaveBeenCalled();
});
it('calls hide on the modal when cancel button is clicked', () => {
- const closeModalSpy = jest.spyOn(wrapper.vm.$refs.modal, 'hide');
-
findCancelButton().trigger('click');
- expect(closeModalSpy).toHaveBeenCalled();
+ expect(modalHideSpy).toHaveBeenCalled();
});
});
diff --git a/spec/frontend/token_access/outbound_token_access_spec.js b/spec/frontend/token_access/outbound_token_access_spec.js
index 7f321495d72..f9eb201eb5c 100644
--- a/spec/frontend/token_access/outbound_token_access_spec.js
+++ b/spec/frontend/token_access/outbound_token_access_spec.js
@@ -6,7 +6,6 @@ import { mountExtended, shallowMountExtended } from 'helpers/vue_test_utils_help
import waitForPromises from 'helpers/wait_for_promises';
import { createAlert } from '~/alert';
import OutboundTokenAccess from '~/token_access/components/outbound_token_access.vue';
-import addProjectCIJobTokenScopeMutation from '~/token_access/graphql/mutations/add_project_ci_job_token_scope.mutation.graphql';
import removeProjectCIJobTokenScopeMutation from '~/token_access/graphql/mutations/remove_project_ci_job_token_scope.mutation.graphql';
import updateCIJobTokenScopeMutation from '~/token_access/graphql/mutations/update_ci_job_token_scope.mutation.graphql';
import getCIJobTokenScopeQuery from '~/token_access/graphql/queries/get_ci_job_token_scope.query.graphql';
@@ -15,7 +14,6 @@ import {
enabledJobTokenScope,
disabledJobTokenScope,
projectsWithScope,
- addProjectSuccess,
removeProjectSuccess,
updateScopeSuccess,
} from './mock_data';
@@ -34,16 +32,13 @@ describe('TokenAccess component', () => {
const enabledJobTokenScopeHandler = jest.fn().mockResolvedValue(enabledJobTokenScope);
const disabledJobTokenScopeHandler = jest.fn().mockResolvedValue(disabledJobTokenScope);
const getProjectsWithScopeHandler = jest.fn().mockResolvedValue(projectsWithScope);
- const addProjectSuccessHandler = jest.fn().mockResolvedValue(addProjectSuccess);
const removeProjectSuccessHandler = jest.fn().mockResolvedValue(removeProjectSuccess);
const updateScopeSuccessHandler = jest.fn().mockResolvedValue(updateScopeSuccess);
const failureHandler = jest.fn().mockRejectedValue(error);
const findToggle = () => wrapper.findComponent(GlToggle);
const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
- const findAddProjectBtn = () => wrapper.findByRole('button', { name: 'Add project' });
const findRemoveProjectBtn = () => wrapper.findByRole('button', { name: 'Remove access' });
- const findTokenDisabledAlert = () => wrapper.findByTestId('token-disabled-alert');
const findDeprecationAlert = () => wrapper.findByTestId('deprecation-alert');
const findProjectPathInput = () => wrapper.findByTestId('project-path-input');
@@ -51,19 +46,10 @@ describe('TokenAccess component', () => {
return createMockApollo(requestHandlers);
};
- const createComponent = (
- requestHandlers,
- mountFn = shallowMountExtended,
- frozenOutboundJobTokenScopes = false,
- frozenOutboundJobTokenScopesOverride = false,
- ) => {
+ const createComponent = (requestHandlers, mountFn = shallowMountExtended) => {
wrapper = mountFn(OutboundTokenAccess, {
provide: {
fullPath: projectPath,
- glFeatures: {
- frozenOutboundJobTokenScopes,
- frozenOutboundJobTokenScopesOverride,
- },
},
apolloProvider: createMockApolloProvider(requestHandlers),
data() {
@@ -141,19 +127,6 @@ describe('TokenAccess component', () => {
await waitForPromises();
expect(findToggle().props('value')).toBe(true);
- expect(findTokenDisabledAlert().exists()).toBe(false);
- });
-
- it('the toggle is off and the alert is visible', async () => {
- createComponent([
- [getCIJobTokenScopeQuery, disabledJobTokenScopeHandler],
- [getProjectsWithCIJobTokenScopeQuery, getProjectsWithScopeHandler],
- ]);
-
- await waitForPromises();
-
- expect(findToggle().props('value')).toBe(false);
- expect(findTokenDisabledAlert().exists()).toBe(true);
});
describe('update ci job token scope', () => {
@@ -196,48 +169,37 @@ describe('TokenAccess component', () => {
expect(createAlert).toHaveBeenCalledWith({ message });
});
});
- });
- describe('add project', () => {
- it('calls add project mutation', async () => {
+ it('the toggle is off and the deprecation alert is visible', async () => {
createComponent(
[
- [getCIJobTokenScopeQuery, enabledJobTokenScopeHandler],
+ [getCIJobTokenScopeQuery, disabledJobTokenScopeHandler],
[getProjectsWithCIJobTokenScopeQuery, getProjectsWithScopeHandler],
- [addProjectCIJobTokenScopeMutation, addProjectSuccessHandler],
],
- mountExtended,
+ shallowMountExtended,
+ true,
);
await waitForPromises();
- findAddProjectBtn().trigger('click');
-
- expect(addProjectSuccessHandler).toHaveBeenCalledWith({
- input: {
- projectPath,
- targetProjectPath: 'root/test',
- },
- });
+ expect(findToggle().props('value')).toBe(false);
+ expect(findToggle().props('disabled')).toBe(true);
+ expect(findDeprecationAlert().exists()).toBe(true);
});
- it('add project handles error correctly', async () => {
+ it('contains a warning message about disabling the current configuration', async () => {
createComponent(
[
- [getCIJobTokenScopeQuery, enabledJobTokenScopeHandler],
+ [getCIJobTokenScopeQuery, disabledJobTokenScopeHandler],
[getProjectsWithCIJobTokenScopeQuery, getProjectsWithScopeHandler],
- [addProjectCIJobTokenScopeMutation, failureHandler],
],
mountExtended,
+ true,
);
await waitForPromises();
- findAddProjectBtn().trigger('click');
-
- await waitForPromises();
-
- expect(createAlert).toHaveBeenCalledWith({ message });
+ expect(findToggle().text()).toContain('Disabling this feature is a permanent change.');
});
});
@@ -284,58 +246,21 @@ describe('TokenAccess component', () => {
});
});
- describe('with the frozenOutboundJobTokenScopes feature flag enabled', () => {
- describe('toggle', () => {
- it('the toggle is off and the deprecation alert is visible', async () => {
- createComponent(
- [
- [getCIJobTokenScopeQuery, disabledJobTokenScopeHandler],
- [getProjectsWithCIJobTokenScopeQuery, getProjectsWithScopeHandler],
- ],
- shallowMountExtended,
- true,
- );
-
- await waitForPromises();
-
- expect(findToggle().props('value')).toBe(false);
- expect(findToggle().props('disabled')).toBe(true);
- expect(findDeprecationAlert().exists()).toBe(true);
- expect(findTokenDisabledAlert().exists()).toBe(false);
- });
-
- it('contains a warning message about disabling the current configuration', async () => {
- createComponent(
- [
- [getCIJobTokenScopeQuery, disabledJobTokenScopeHandler],
- [getProjectsWithCIJobTokenScopeQuery, getProjectsWithScopeHandler],
- ],
- mountExtended,
- true,
- );
-
- await waitForPromises();
-
- expect(findToggle().text()).toContain('Disabling this feature is a permanent change.');
- });
- });
-
- describe('adding a new project', () => {
- it('disables the input to add new projects', async () => {
- createComponent(
- [
- [getCIJobTokenScopeQuery, disabledJobTokenScopeHandler],
- [getProjectsWithCIJobTokenScopeQuery, getProjectsWithScopeHandler],
- ],
- mountExtended,
- true,
- false,
- );
+ describe('adding a new project', () => {
+ it('disables the input to add new projects', async () => {
+ createComponent(
+ [
+ [getCIJobTokenScopeQuery, disabledJobTokenScopeHandler],
+ [getProjectsWithCIJobTokenScopeQuery, getProjectsWithScopeHandler],
+ ],
+ mountExtended,
+ true,
+ false,
+ );
- await waitForPromises();
+ await waitForPromises();
- expect(findProjectPathInput().attributes('disabled')).toBe('disabled');
- });
+ expect(findProjectPathInput().attributes('disabled')).toBe('disabled');
});
});
});
diff --git a/spec/frontend/tracing/components/tracing_empty_state_spec.js b/spec/frontend/tracing/components/tracing_empty_state_spec.js
new file mode 100644
index 00000000000..c3df187e1c5
--- /dev/null
+++ b/spec/frontend/tracing/components/tracing_empty_state_spec.js
@@ -0,0 +1,44 @@
+import { GlButton, GlEmptyState } from '@gitlab/ui';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import TracingEmptyState from '~/tracing/components/tracing_empty_state.vue';
+
+describe('TracingEmptyState', () => {
+ let wrapper;
+
+ const findEnableButton = () => wrapper.findComponent(GlButton);
+
+ beforeEach(() => {
+ wrapper = shallowMountExtended(TracingEmptyState, {
+ propsData: {
+ enableTracing: jest.fn(),
+ },
+ stubs: { GlButton },
+ });
+ });
+
+ it('renders the component properly', () => {
+ expect(wrapper.exists()).toBe(true);
+ });
+
+ it('displays the correct title', () => {
+ const { title } = wrapper.findComponent(GlEmptyState).props();
+ expect(title).toBe('Get started with Tracing');
+ });
+
+ it('displays the correct description', () => {
+ const description = wrapper.find('span').text();
+ expect(description).toBe('Monitor your applications with GitLab Distributed Tracing.');
+ });
+
+ it('displays the enable button', () => {
+ const enableButton = findEnableButton();
+ expect(enableButton.exists()).toBe(true);
+ expect(enableButton.text()).toBe('Enable');
+ });
+
+ it('calls enableTracing method when enable button is clicked', () => {
+ findEnableButton().vm.$emit('click');
+
+ expect(wrapper.props().enableTracing).toHaveBeenCalled();
+ });
+});
diff --git a/spec/frontend/tracing/components/tracing_list_spec.js b/spec/frontend/tracing/components/tracing_list_spec.js
new file mode 100644
index 00000000000..183578cff31
--- /dev/null
+++ b/spec/frontend/tracing/components/tracing_list_spec.js
@@ -0,0 +1,131 @@
+import { GlLoadingIcon } from '@gitlab/ui';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import TracingList from '~/tracing/components/tracing_list.vue';
+import TracingEmptyState from '~/tracing/components/tracing_empty_state.vue';
+import TracingTableList from '~/tracing/components/tracing_table_list.vue';
+import waitForPromises from 'helpers/wait_for_promises';
+import { createAlert } from '~/alert';
+
+jest.mock('~/alert');
+
+describe('TracingList', () => {
+ let wrapper;
+ let observabilityClientMock;
+
+ const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
+ const findEmptyState = () => wrapper.findComponent(TracingEmptyState);
+ const findTableList = () => wrapper.findComponent(TracingTableList);
+
+ const mountComponent = async () => {
+ wrapper = shallowMountExtended(TracingList, {
+ propsData: {
+ observabilityClient: observabilityClientMock,
+ stubs: {
+ GlLoadingIcon: true,
+ TracingEmptyState: true,
+ TracingTableList: true,
+ },
+ },
+ });
+ await waitForPromises();
+ };
+
+ beforeEach(() => {
+ observabilityClientMock = {
+ isTracingEnabled: jest.fn(),
+ enableTraces: jest.fn(),
+ fetchTraces: jest.fn(),
+ };
+ });
+
+ it('renders the loading indicator while checking if tracing is enabled', () => {
+ mountComponent();
+ expect(findLoadingIcon().exists()).toBe(true);
+ expect(observabilityClientMock.isTracingEnabled).toHaveBeenCalled();
+ });
+
+ describe('when tracing is enabled', () => {
+ const mockTraces = ['trace1', 'trace2'];
+ beforeEach(async () => {
+ observabilityClientMock.isTracingEnabled.mockResolvedValueOnce(true);
+ observabilityClientMock.fetchTraces.mockResolvedValueOnce(mockTraces);
+
+ await mountComponent();
+ });
+ it('fetches the traces and renders the trace list', () => {
+ expect(observabilityClientMock.isTracingEnabled).toHaveBeenCalled();
+ expect(observabilityClientMock.fetchTraces).toHaveBeenCalled();
+ expect(findLoadingIcon().exists()).toBe(false);
+ expect(findEmptyState().exists()).toBe(false);
+ expect(findTableList().exists()).toBe(true);
+ expect(findTableList().props('traces')).toBe(mockTraces);
+ });
+
+ it('calls fetchTraces method when TracingTableList emits reload event', () => {
+ observabilityClientMock.fetchTraces.mockClear();
+ observabilityClientMock.fetchTraces.mockResolvedValueOnce(['trace1']);
+
+ findTableList().vm.$emit('reload');
+
+ expect(observabilityClientMock.fetchTraces).toHaveBeenCalledTimes(1);
+ });
+ });
+
+ describe('when tracing is not enabled', () => {
+ beforeEach(async () => {
+ observabilityClientMock.isTracingEnabled.mockResolvedValueOnce(false);
+ observabilityClientMock.fetchTraces.mockResolvedValueOnce([]);
+
+ await mountComponent();
+ });
+
+ it('renders TracingEmptyState', () => {
+ expect(findEmptyState().exists()).toBe(true);
+ });
+
+ it('set enableTracing as TracingEmptyState enable-tracing callback', () => {
+ findEmptyState().props('enableTracing')();
+
+ expect(observabilityClientMock.enableTraces).toHaveBeenCalled();
+ });
+ });
+
+ describe('error handling', () => {
+ it('if isTracingEnabled fails, it renders an alert and empty page', async () => {
+ observabilityClientMock.isTracingEnabled.mockRejectedValueOnce('error');
+
+ await mountComponent();
+
+ expect(createAlert).toHaveBeenCalledWith({ message: 'Failed to load page.' });
+ expect(findLoadingIcon().exists()).toBe(false);
+ expect(findEmptyState().exists()).toBe(false);
+ expect(findTableList().exists()).toBe(false);
+ });
+
+ it('if fetchTraces fails, it renders an alert and empty list', async () => {
+ observabilityClientMock.fetchTraces.mockRejectedValueOnce('error');
+ observabilityClientMock.isTracingEnabled.mockReturnValueOnce(true);
+
+ await mountComponent();
+
+ expect(createAlert).toHaveBeenCalledWith({ message: 'Failed to load traces.' });
+ expect(findTableList().exists()).toBe(true);
+ expect(findTableList().props('traces')).toEqual([]);
+ });
+
+ it('if enableTraces fails, it renders an alert and empty-state', async () => {
+ observabilityClientMock.isTracingEnabled.mockReturnValueOnce(false);
+ observabilityClientMock.enableTraces.mockRejectedValueOnce('error');
+
+ await mountComponent();
+
+ findEmptyState().props('enableTracing')();
+ await waitForPromises();
+
+ expect(createAlert).toHaveBeenCalledWith({ message: 'Failed to enable tracing.' });
+ expect(findLoadingIcon().exists()).toBe(false);
+ expect(findEmptyState().exists()).toBe(true);
+ expect(findTableList().exists()).toBe(false);
+ });
+ });
+});
diff --git a/spec/frontend/tracing/components/tracing_table_list_spec.js b/spec/frontend/tracing/components/tracing_table_list_spec.js
new file mode 100644
index 00000000000..773b3eb8ed2
--- /dev/null
+++ b/spec/frontend/tracing/components/tracing_table_list_spec.js
@@ -0,0 +1,63 @@
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import TracingTableList from '~/tracing/components/tracing_table_list.vue';
+
+describe('TracingTableList', () => {
+ let wrapper;
+ const mockTraces = [
+ {
+ timestamp: '2023-07-10T15:02:30.677538Z',
+ service_name: 'tracegen',
+ operation: 'lets-go',
+ duration: 150,
+ },
+ {
+ timestamp: '2023-07-10T15:02:30.677538Z',
+ service_name: 'tracegen',
+ operation: 'lets-go',
+ duration: 200,
+ },
+ ];
+
+ const mountComponent = ({ traces = mockTraces } = {}) => {
+ wrapper = mountExtended(TracingTableList, {
+ propsData: {
+ traces,
+ },
+ });
+ };
+
+ const getRows = () => wrapper.findComponent({ name: 'GlTable' }).find('tbody').findAll('tr');
+
+ const getCells = (trIdx) => getRows().at(trIdx).findAll('td');
+
+ const getCell = (trIdx, tdIdx) => {
+ return getCells(trIdx).at(tdIdx);
+ };
+
+ it('renders traces as table', () => {
+ mountComponent();
+
+ const rows = wrapper.findAll('table tbody tr');
+
+ expect(rows.length).toBe(mockTraces.length);
+
+ mockTraces.forEach((trace, i) => {
+ expect(getCells(i).length).toBe(4);
+ expect(getCell(i, 0).text()).toBe(trace.timestamp);
+ expect(getCell(i, 1).text()).toBe(trace.service_name);
+ expect(getCell(i, 2).text()).toBe(trace.operation);
+ expect(getCell(i, 3).text()).toBe(`${trace.duration} ms`);
+ });
+ });
+
+ it('renders the empty state when no traces are provided', () => {
+ mountComponent({ traces: [] });
+
+ expect(getCell(0, 0).text()).toContain('No traces to display');
+ const link = getCell(0, 0).findComponent({ name: 'GlLink' });
+ expect(link.text()).toBe('Check again');
+
+ link.trigger('click');
+ expect(wrapper.emitted('reload')).toHaveLength(1);
+ });
+});
diff --git a/spec/frontend/tracing/list_index_spec.js b/spec/frontend/tracing/list_index_spec.js
new file mode 100644
index 00000000000..a5759035c2f
--- /dev/null
+++ b/spec/frontend/tracing/list_index_spec.js
@@ -0,0 +1,37 @@
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import ListIndex from '~/tracing/list_index.vue';
+import TracingList from '~/tracing/components/tracing_list.vue';
+import ObservabilityContainer from '~/observability/components/observability_container.vue';
+
+describe('ListIndex', () => {
+ const props = {
+ oauthUrl: 'https://example.com/oauth',
+ tracingUrl: 'https://example.com/tracing',
+ provisioningUrl: 'https://example.com/provisioning',
+ };
+
+ let wrapper;
+
+ const mountComponent = () => {
+ wrapper = shallowMountExtended(ListIndex, {
+ propsData: props,
+ });
+ };
+
+ it('renders ObservabilityContainer component', () => {
+ mountComponent();
+
+ const observabilityContainer = wrapper.findComponent(ObservabilityContainer);
+ expect(observabilityContainer.exists()).toBe(true);
+ expect(observabilityContainer.props('oauthUrl')).toBe(props.oauthUrl);
+ expect(observabilityContainer.props('tracingUrl')).toBe(props.tracingUrl);
+ expect(observabilityContainer.props('provisioningUrl')).toBe(props.provisioningUrl);
+ });
+
+ it('renders TracingList component inside ObservabilityContainer', () => {
+ mountComponent();
+
+ const observabilityContainer = wrapper.findComponent(ObservabilityContainer);
+ expect(observabilityContainer.findComponent(TracingList).exists()).toBe(true);
+ });
+});
diff --git a/spec/frontend/tracking/internal_events_spec.js b/spec/frontend/tracking/internal_events_spec.js
new file mode 100644
index 00000000000..ad2ffa7cef4
--- /dev/null
+++ b/spec/frontend/tracking/internal_events_spec.js
@@ -0,0 +1,100 @@
+import API from '~/api';
+import { mockTracking } from 'helpers/tracking_helper';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import InternalEvents from '~/tracking/internal_events';
+import { GITLAB_INTERNAL_EVENT_CATEGORY, SERVICE_PING_SCHEMA } from '~/tracking/constants';
+import * as utils from '~/tracking/utils';
+import { Tracker } from '~/tracking/tracker';
+
+jest.mock('~/api', () => ({
+ trackRedisHllUserEvent: jest.fn(),
+}));
+
+jest.mock('~/tracking/utils', () => ({
+ ...jest.requireActual('~/tracking/utils'),
+ getInternalEventHandlers: jest.fn(),
+}));
+
+Tracker.enabled = jest.fn();
+
+describe('InternalEvents', () => {
+ describe('track_event', () => {
+ it('track_event calls trackRedisHllUserEvent with correct arguments', () => {
+ const event = 'TestEvent';
+
+ InternalEvents.track_event(event);
+
+ expect(API.trackRedisHllUserEvent).toHaveBeenCalledTimes(1);
+ expect(API.trackRedisHllUserEvent).toHaveBeenCalledWith(event);
+ });
+
+ it('track_event calls tracking.event functions with correct arguments', () => {
+ const trackingSpy = mockTracking(GITLAB_INTERNAL_EVENT_CATEGORY, undefined, jest.spyOn);
+
+ const event = 'TestEvent';
+
+ InternalEvents.track_event(event);
+
+ expect(trackingSpy).toHaveBeenCalledTimes(1);
+ expect(trackingSpy).toHaveBeenCalledWith(GITLAB_INTERNAL_EVENT_CATEGORY, event, {
+ context: {
+ schema: SERVICE_PING_SCHEMA,
+ data: {
+ event_name: event,
+ data_source: 'redis_hll',
+ },
+ },
+ });
+ });
+ });
+
+ describe('mixin', () => {
+ let wrapper;
+
+ beforeEach(() => {
+ const Component = {
+ render() {},
+ mixins: [InternalEvents.mixin()],
+ };
+ wrapper = shallowMountExtended(Component);
+ });
+
+ it('this.track_event function calls InternalEvent`s track function with an event', () => {
+ const event = 'TestEvent';
+ const trackEventSpy = jest.spyOn(InternalEvents, 'track_event');
+
+ wrapper.vm.track_event(event);
+
+ expect(trackEventSpy).toHaveBeenCalledTimes(1);
+ expect(trackEventSpy).toHaveBeenCalledWith(event);
+ });
+ });
+
+ describe('bindInternalEventDocument', () => {
+ it('should not bind event handlers if tracker is not enabled', () => {
+ Tracker.enabled.mockReturnValue(false);
+ const result = InternalEvents.bindInternalEventDocument();
+ expect(result).toEqual([]);
+ expect(utils.getInternalEventHandlers).not.toHaveBeenCalled();
+ });
+
+ it('should not bind event handlers if already bound', () => {
+ Tracker.enabled.mockReturnValue(true);
+ document.internalEventsTrackingBound = true;
+ const result = InternalEvents.bindInternalEventDocument();
+ expect(result).toEqual([]);
+ expect(utils.getInternalEventHandlers).not.toHaveBeenCalled();
+ });
+
+ it('should bind event handlers when not bound yet', () => {
+ Tracker.enabled.mockReturnValue(true);
+ document.internalEventsTrackingBound = false;
+ const addEventListenerMock = jest.spyOn(document, 'addEventListener');
+
+ const result = InternalEvents.bindInternalEventDocument();
+
+ expect(addEventListenerMock).toHaveBeenCalledWith('click', expect.any(Function));
+ expect(result).toEqual({ name: 'click', func: expect.any(Function) });
+ });
+ });
+});
diff --git a/spec/frontend/tracking/tracking_spec.js b/spec/frontend/tracking/tracking_spec.js
index c23790bb589..55ce8039399 100644
--- a/spec/frontend/tracking/tracking_spec.js
+++ b/spec/frontend/tracking/tracking_spec.js
@@ -59,7 +59,6 @@ describe('Tracking', () => {
window.doNotTrack = undefined;
navigator.doNotTrack = undefined;
navigator.msDoNotTrack = undefined;
- jest.clearAllMocks();
});
it('tracks to snowplow (our current tracking system)', () => {
diff --git a/spec/frontend/tracking/utils_spec.js b/spec/frontend/tracking/utils_spec.js
index d6f2c5095b4..7ba65cce15d 100644
--- a/spec/frontend/tracking/utils_spec.js
+++ b/spec/frontend/tracking/utils_spec.js
@@ -4,6 +4,8 @@ import {
addExperimentContext,
addReferrersCacheEntry,
filterOldReferrersCacheEntries,
+ InternalEventHandler,
+ createInternalEventPayload,
} from '~/tracking/utils';
import { TRACKING_CONTEXT_SCHEMA } from '~/experimentation/constants';
import { REFERRER_TTL, URLS_CACHE_STORAGE_KEY } from '~/tracking/constants';
@@ -95,5 +97,40 @@ describe('~/tracking/utils', () => {
expect(cache[0].timestamp).toBeDefined();
});
});
+
+ describe('createInternalEventPayload', () => {
+ it('should return event name from element', () => {
+ const mockEl = { dataset: { eventTracking: 'click' } };
+ const result = createInternalEventPayload(mockEl);
+ expect(result).toEqual('click');
+ });
+ });
+
+ describe('InternalEventHandler', () => {
+ it.each([
+ ['should call the provided function with the correct event payload', 'click', true],
+ [
+ 'should not call the provided function if the closest matching element is not found',
+ null,
+ false,
+ ],
+ ])('%s', (_, payload, shouldCallFunc) => {
+ const mockFunc = jest.fn();
+ const mockEl = payload ? { dataset: { eventTracking: payload } } : null;
+ const mockEvent = {
+ target: {
+ closest: jest.fn().mockReturnValue(mockEl),
+ },
+ };
+
+ InternalEventHandler(mockEvent, mockFunc);
+
+ if (shouldCallFunc) {
+ expect(mockFunc).toHaveBeenCalledWith(payload);
+ } else {
+ expect(mockFunc).not.toHaveBeenCalled();
+ }
+ });
+ });
});
});
diff --git a/spec/frontend/usage_quotas/storage/components/usage_graph_spec.js b/spec/frontend/usage_quotas/storage/components/usage_graph_spec.js
index 2662711076b..7fef20c900e 100644
--- a/spec/frontend/usage_quotas/storage/components/usage_graph_spec.js
+++ b/spec/frontend/usage_quotas/storage/components/usage_graph_spec.js
@@ -19,7 +19,7 @@ function findStorageTypeUsagesSerialized() {
.wrappers.map((wp) => wp.element.style.flex);
}
-describe('Storage Counter usage graph component', () => {
+describe('UsageGraph', () => {
beforeEach(() => {
data = {
rootStorageStatistics: {
@@ -29,7 +29,6 @@ describe('Storage Counter usage graph component', () => {
containerRegistrySize: 2500,
lfsObjectsSize: 2000,
buildArtifactsSize: 700,
- pipelineArtifactsSize: 300,
snippetsSize: 2000,
storageSize: 17000,
},
@@ -43,7 +42,6 @@ describe('Storage Counter usage graph component', () => {
const {
buildArtifactsSize,
- pipelineArtifactsSize,
lfsObjectsSize,
packagesSize,
containerRegistrySize,
@@ -69,9 +67,6 @@ describe('Storage Counter usage graph component', () => {
expect(types.at(6).text()).toMatchInterpolatedText(
`Job artifacts ${numberToHumanSize(buildArtifactsSize)}`,
);
- expect(types.at(7).text()).toMatchInterpolatedText(
- `Pipeline artifacts ${numberToHumanSize(pipelineArtifactsSize)}`,
- );
});
describe('when storage type is not used', () => {
@@ -111,7 +106,6 @@ describe('Storage Counter usage graph component', () => {
'0.11764705882352941',
'0.11764705882352941',
'0.041176470588235294',
- '0.01764705882352941',
]);
});
});
@@ -131,7 +125,6 @@ describe('Storage Counter usage graph component', () => {
'0.11764705882352941',
'0.11764705882352941',
'0.041176470588235294',
- '0.01764705882352941',
]);
});
});
diff --git a/spec/frontend/usage_quotas/storage/mock_data.js b/spec/frontend/usage_quotas/storage/mock_data.js
index 8a7f941151b..452fa83b9a7 100644
--- a/spec/frontend/usage_quotas/storage/mock_data.js
+++ b/spec/frontend/usage_quotas/storage/mock_data.js
@@ -5,7 +5,7 @@ export const mockEmptyResponse = { data: { project: null } };
export const projectData = {
storage: {
- totalUsage: '13.8 MiB',
+ totalUsage: '13.4 MiB',
storageTypes: [
{
storageType: {
@@ -29,15 +29,6 @@ export const projectData = {
},
{
storageType: {
- id: 'pipelineArtifacts',
- name: 'Pipeline artifacts',
- description: 'Pipeline artifacts created by CI/CD.',
- helpPath: '/pipeline-artifacts',
- },
- value: 400000,
- },
- {
- storageType: {
id: 'lfsObjects',
name: 'LFS',
description: 'Audio samples, videos, datasets, and graphics.',
@@ -93,7 +84,6 @@ export const projectHelpLinks = {
containerRegistry: '/container_registry',
usageQuotas: '/usage-quotas',
buildArtifacts: '/build-artifacts',
- pipelineArtifacts: '/pipeline-artifacts',
lfsObjects: '/lsf-objects',
packages: '/packages',
repository: '/repository',
diff --git a/spec/frontend/users/profile/actions/components/user_actions_app_spec.js b/spec/frontend/users/profile/actions/components/user_actions_app_spec.js
new file mode 100644
index 00000000000..d27962440ee
--- /dev/null
+++ b/spec/frontend/users/profile/actions/components/user_actions_app_spec.js
@@ -0,0 +1,38 @@
+import { GlDisclosureDropdown } from '@gitlab/ui';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import UserActionsApp from '~/users/profile/actions/components/user_actions_app.vue';
+
+describe('User Actions App', () => {
+ let wrapper;
+
+ const USER_ID = 'test-id';
+
+ const createWrapper = (propsData = {}) => {
+ wrapper = mountExtended(UserActionsApp, {
+ propsData: {
+ userId: USER_ID,
+ ...propsData,
+ },
+ });
+ };
+
+ const findDropdown = () => wrapper.findComponent(GlDisclosureDropdown);
+ const findActions = () => wrapper.findAllByTestId('disclosure-dropdown-item');
+ const findAction = (position = 0) => findActions().at(position);
+
+ it('shows dropdown', () => {
+ createWrapper();
+ expect(findDropdown().exists()).toBe(true);
+ });
+
+ it('shows actions correctly', () => {
+ createWrapper();
+ expect(findActions()).toHaveLength(1);
+ });
+
+ it('shows copy user id action', () => {
+ createWrapper();
+ expect(findAction().text()).toBe(`Copy user ID: ${USER_ID}`);
+ expect(findAction().findComponent('button').attributes('data-clipboard-text')).toBe(USER_ID);
+ });
+});
diff --git a/spec/frontend/vue_compat_test_setup.js b/spec/frontend/vue_compat_test_setup.js
index 6eba9465c80..fe43f8f2617 100644
--- a/spec/frontend/vue_compat_test_setup.js
+++ b/spec/frontend/vue_compat_test_setup.js
@@ -76,9 +76,77 @@ if (global.document) {
Vue.configureCompat(compatConfig);
installVTUCompat(VTU, fullCompatConfig, compatH);
+
+ jest.mock('vue', () => {
+ const actualVue = jest.requireActual('vue');
+ actualVue.configureCompat(compatConfig);
+ return actualVue;
+ });
+
+ jest.mock('@vue/test-utils', () => {
+ const actualVTU = jest.requireActual('@vue/test-utils');
+
+ return {
+ ...actualVTU,
+ RouterLinkStub: {
+ ...actualVTU.RouterLinkStub,
+ render() {
+ const { default: defaultSlot } = this.$slots ?? {};
+ const defaultSlotFn =
+ defaultSlot && typeof defaultSlot !== 'function' ? () => defaultSlot : defaultSlot;
+ return actualVTU.RouterLinkStub.render.call({
+ $slots: defaultSlot ? { default: defaultSlotFn } : undefined,
+ custom: this.custom,
+ });
+ },
+ },
+ };
+ });
+
+ jest.mock('portal-vue', () => ({
+ __esModule: true,
+ default: {
+ install: jest.fn(),
+ },
+ Portal: {},
+ PortalTarget: {},
+ MountingPortal: {
+ template: '<h1>MOUNTING-PORTAL</h1>',
+ },
+ Wormhole: {},
+ }));
+
VTU.config.global.renderStubDefaultSlot = true;
const noop = () => {};
+ const invalidProperties = new Set();
+
+ const getDescriptor = (root, prop) => {
+ let obj = root;
+ while (obj != null) {
+ const desc = Object.getOwnPropertyDescriptor(obj, prop);
+ if (desc) {
+ return desc;
+ }
+ obj = Object.getPrototypeOf(obj);
+ }
+ return null;
+ };
+
+ const isPropertyValidOnDomNode = (prop) => {
+ if (invalidProperties.has(prop)) {
+ return false;
+ }
+
+ const domNode = document.createElement('anonymous-stub');
+ const descriptor = getDescriptor(domNode, prop);
+ if (descriptor && descriptor.get && !descriptor.set) {
+ invalidProperties.add(prop);
+ return false;
+ }
+
+ return true;
+ };
VTU.config.plugins.createStubs = ({ name, component: rawComponent, registerStub }) => {
const component = unwrapLegacyVueExtendComponent(rawComponent);
@@ -126,7 +194,11 @@ if (global.document) {
.filter(Boolean)
: renderSlotByName('default');
- return Vue.h(`${hyphenatedName || 'anonymous'}-stub`, this.$props, slotContents);
+ const props = Object.fromEntries(
+ Object.entries(this.$props).filter(([prop]) => isPropertyValidOnDomNode(prop)),
+ );
+
+ return Vue.h(`${hyphenatedName || 'anonymous'}-stub`, props, slotContents);
},
});
diff --git a/spec/frontend/vue_merge_request_widget/components/states/mr_widget_commit_message_dropdown_spec.js b/spec/frontend/vue_merge_request_widget/components/states/mr_widget_commit_message_dropdown_spec.js
index e4febda1daa..b0f9f123950 100644
--- a/spec/frontend/vue_merge_request_widget/components/states/mr_widget_commit_message_dropdown_spec.js
+++ b/spec/frontend/vue_merge_request_widget/components/states/mr_widget_commit_message_dropdown_spec.js
@@ -1,22 +1,22 @@
-import { GlDropdownItem } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import { nextTick } from 'vue';
+import { GlDisclosureDropdown, GlDisclosureDropdownItem } from '@gitlab/ui';
+import { mount } from '@vue/test-utils';
+
import CommitMessageDropdown from '~/vue_merge_request_widget/components/states/commit_message_dropdown.vue';
const commits = [
{
title: 'Commit 1',
- short_id: '78d5b7',
+ shortId: '78d5b7',
message: 'Update test.txt',
},
{
title: 'Commit 2',
- short_id: '34cbe28b',
+ shortId: '34cbe28b',
message: 'Fixed test',
},
{
title: 'Commit 3',
- short_id: 'fa42932a',
+ shortId: 'fa42932a',
message: 'Added changelog',
},
];
@@ -25,10 +25,14 @@ describe('Commits message dropdown component', () => {
let wrapper;
const createComponent = () => {
- wrapper = shallowMount(CommitMessageDropdown, {
+ wrapper = mount(CommitMessageDropdown, {
propsData: {
commits,
},
+ stubs: {
+ GlDisclosureDropdown,
+ GlDisclosureDropdownItem,
+ },
});
};
@@ -36,7 +40,7 @@ describe('Commits message dropdown component', () => {
createComponent();
});
- const findDropdownElements = () => wrapper.findAllComponents(GlDropdownItem);
+ const findDropdownElements = () => wrapper.findAllComponents(GlDisclosureDropdownItem);
const findFirstDropdownElement = () => findDropdownElements().at(0);
it('should have 3 elements in dropdown list', () => {
@@ -48,10 +52,9 @@ describe('Commits message dropdown component', () => {
expect(findFirstDropdownElement().text()).toContain('Commit 1');
});
- it('should emit a commit title on selecting commit', async () => {
- findFirstDropdownElement().vm.$emit('click');
+ it('should emit a commit title on selecting commit', () => {
+ findFirstDropdownElement().find('button').trigger('click');
- await nextTick();
expect(wrapper.emitted().input[0]).toEqual(['Update test.txt']);
});
});
diff --git a/spec/frontend/vue_merge_request_widget/components/states/mr_widget_failed_to_merge_spec.js b/spec/frontend/vue_merge_request_widget/components/states/mr_widget_failed_to_merge_spec.js
index 38e5422325a..e1c88d7d3b6 100644
--- a/spec/frontend/vue_merge_request_widget/components/states/mr_widget_failed_to_merge_spec.js
+++ b/spec/frontend/vue_merge_request_widget/components/states/mr_widget_failed_to_merge_spec.js
@@ -1,4 +1,4 @@
-import { shallowMount } from '@vue/test-utils';
+import { shallowMount, mount } from '@vue/test-utils';
import { nextTick } from 'vue';
import MrWidgetFailedToMerge from '~/vue_merge_request_widget/components/states/mr_widget_failed_to_merge.vue';
import StateContainer from '~/vue_merge_request_widget/components/state_container.vue';
@@ -8,17 +8,14 @@ describe('MRWidgetFailedToMerge', () => {
const dummyIntervalId = 1337;
let wrapper;
- const createComponent = (props = {}, data = {}) => {
- wrapper = shallowMount(MrWidgetFailedToMerge, {
+ const createComponent = (props = {}, mountFn = shallowMount) => {
+ wrapper = mountFn(MrWidgetFailedToMerge, {
propsData: {
mr: {
mergeError: 'Merge error happened',
},
...props,
},
- data() {
- return data;
- },
});
};
@@ -121,7 +118,9 @@ describe('MRWidgetFailedToMerge', () => {
describe('while it is refreshing', () => {
it('renders Refresing now', async () => {
- createComponent({}, { isRefreshing: true });
+ createComponent({});
+
+ wrapper.vm.refresh();
await nextTick();
@@ -138,8 +137,10 @@ describe('MRWidgetFailedToMerge', () => {
createComponent();
});
- it('renders warning icon and disabled merge button', () => {
- expect(wrapper.find('.js-ci-status-icon-warning')).not.toBeNull();
+ it('renders failed icon', () => {
+ createComponent({}, mount);
+
+ expect(wrapper.find('[data-testid="status-failed-icon"]').exists()).toBe(true);
});
it('renders given error', () => {
diff --git a/spec/frontend/vue_merge_request_widget/components/states/mr_widget_ready_to_merge_spec.js b/spec/frontend/vue_merge_request_widget/components/states/mr_widget_ready_to_merge_spec.js
index 07fc0be9e51..48b86d879ad 100644
--- a/spec/frontend/vue_merge_request_widget/components/states/mr_widget_ready_to_merge_spec.js
+++ b/spec/frontend/vue_merge_request_widget/components/states/mr_widget_ready_to_merge_spec.js
@@ -58,7 +58,7 @@ const createTestMr = (customConfig) => {
mergeImmediatelyDocsPath: 'path/to/merge/immediately/docs',
transitionStateMachine: (transition) => eventHub.$emit('StateMachineValueChanged', transition),
translateStateToMachine: () => this.transitionStateMachine(),
- state: 'open',
+ state: 'readyToMerge',
canMerge: true,
mergeable: true,
userPermissions: {
@@ -113,11 +113,6 @@ const createComponent = (customConfig = {}, createState = true) => {
GlSprintf,
},
apolloProvider: createMockApollo([[readyToMergeQuery, readyToMergeResponseSpy]]),
- provide: {
- glFeatures: {
- autoMergeLabelsMrWidget: false,
- },
- },
});
};
@@ -144,6 +139,7 @@ const findDeleteSourceBranchCheckbox = () =>
const triggerApprovalUpdated = () => eventHub.$emit('ApprovalUpdated');
const triggerEditCommitInput = () =>
wrapper.find('[data-testid="widget_edit_commit_message"]').vm.$emit('input', true);
+const findMergeHelperText = () => wrapper.find('[data-testid="auto-merge-helper-text"]');
describe('ReadyToMerge', () => {
beforeEach(() => {
@@ -185,47 +181,22 @@ describe('ReadyToMerge', () => {
expect(wrapper.vm.status).toEqual('failed');
});
});
-
- describe('status icon', () => {
- it('defaults to tick icon', () => {
- createComponent({ mr: { mergeable: true } });
-
- expect(wrapper.vm.iconClass).toEqual('success');
- });
-
- it('shows tick for success status', () => {
- createComponent({ mr: { pipeline: { status: 'SUCCESS' }, mergeable: true } });
-
- expect(wrapper.vm.iconClass).toEqual('success');
- });
-
- it('shows tick for pending status', () => {
- createComponent({ mr: { pipeline: { active: true }, mergeable: true } });
-
- expect(wrapper.vm.iconClass).toEqual('success');
- });
- });
});
describe('merge button text', () => {
it('should return "Merge" when no auto merge strategies are available', () => {
- createComponent({ mr: { availableAutoMergeStrategies: [] } });
-
- expect(findMergeButton().text()).toBe('Merge');
- });
-
- it('should return "Merge when pipeline succeeds" when the MWPS auto merge strategy is available', () => {
createComponent({
- mr: { preferredAutoMergeStrategy: MWPS_MERGE_STRATEGY },
+ mr: { availableAutoMergeStrategies: [] },
});
- expect(findMergeButton().text()).toBe('Merge when pipeline succeeds');
+ expect(findMergeButton().text()).toBe('Merge');
});
- it('should return Merge when pipeline succeeds', () => {
+ it('should return Set to auto-merge in the button and Merge when pipeline succeeds in the helper text', () => {
createComponent({ mr: { preferredAutoMergeStrategy: MWPS_MERGE_STRATEGY } });
- expect(findMergeButton().text()).toBe('Merge when pipeline succeeds');
+ expect(findMergeButton().text()).toBe('Set to auto-merge');
+ expect(findMergeHelperText().text()).toBe('Merge when pipeline succeeds');
});
});
@@ -258,10 +229,10 @@ describe('ReadyToMerge', () => {
expect(findMergeButton().props('disabled')).toBe(true);
});
- it('should be disabled if merge is not allowed', () => {
- createComponent({ mr: { preventMerge: true } });
+ it('should not exist if merge is not allowed', () => {
+ createComponent({ mr: { state: 'checking' } });
- expect(findMergeButton().props('disabled')).toBe(true);
+ expect(findMergeButton().exists()).toBe(false);
});
it('should be disabled when making request', async () => {
@@ -321,7 +292,7 @@ describe('ReadyToMerge', () => {
describe('Merge Button Variant', () => {
it('defaults to confirm class', () => {
createComponent({
- mr: { availableAutoMergeStrategies: [], mergeable: true },
+ mr: { availableAutoMergeStrategies: [] },
});
expect(findMergeButton().attributes('variant')).toBe('confirm');
diff --git a/spec/frontend/vue_merge_request_widget/components/widget/__snapshots__/dynamic_content_spec.js.snap b/spec/frontend/vue_merge_request_widget/components/widget/__snapshots__/dynamic_content_spec.js.snap
index 296d7924243..02d17b8dfd2 100644
--- a/spec/frontend/vue_merge_request_widget/components/widget/__snapshots__/dynamic_content_spec.js.snap
+++ b/spec/frontend/vue_merge_request_widget/components/widget/__snapshots__/dynamic_content_spec.js.snap
@@ -16,14 +16,16 @@ exports[`~/vue_merge_request_widget/components/widget/dynamic_content.vue render
</div>
<div class=\\"gl-display-flex gl-align-items-baseline\\">
<status-icon-stub level=\\"2\\" name=\\"MyWidget\\" iconname=\\"success\\"></status-icon-stub>
- <div class=\\"gl-display-flex gl-flex-direction-column\\">
- <div>
- <p class=\\"gl-mb-0\\">Main text for the row</p>
- <gl-link-stub href=\\"https://gitlab.com\\">Optional link to display after text</gl-link-stub>
- <!---->
- <gl-badge-stub size=\\"md\\" variant=\\"info\\" iconsize=\\"md\\">
- Badge is optional. Text to be displayed inside badge
- </gl-badge-stub>
+ <div class=\\"gl-w-full gl-display-flex\\">
+ <div class=\\"gl-display-flex gl-flex-grow-1\\">
+ <div class=\\"gl-display-flex gl-flex-grow-1 gl-flex-direction-column\\">
+ <p class=\\"gl-mb-0 gl-mr-1\\">Main text for the row</p>
+ <gl-link-stub href=\\"https://gitlab.com\\">Optional link to display after text</gl-link-stub>
+ <!---->
+ <gl-badge-stub size=\\"md\\" variant=\\"info\\" iconsize=\\"md\\">
+ Badge is optional. Text to be displayed inside badge
+ </gl-badge-stub>
+ </div>
<actions-stub widget=\\"MyWidget\\" tertiarybuttons=\\"\\" class=\\"gl-ml-auto gl-pl-3\\"></actions-stub>
<p class=\\"gl-m-0 gl-font-sm\\">Optional: Smaller sub-text to be displayed below the main text</p>
</div>
@@ -40,12 +42,14 @@ exports[`~/vue_merge_request_widget/components/widget/dynamic_content.vue render
</div>
<div class=\\"gl-display-flex gl-align-items-baseline\\">
<!---->
- <div class=\\"gl-display-flex gl-flex-direction-column\\">
- <div>
- <p class=\\"gl-mb-0\\">This is recursive. It will be listed in level 3.</p>
- <!---->
- <!---->
- <!---->
+ <div class=\\"gl-w-full gl-display-flex\\">
+ <div class=\\"gl-display-flex gl-flex-grow-1\\">
+ <div class=\\"gl-display-flex gl-flex-grow-1 gl-flex-direction-column\\">
+ <p class=\\"gl-mb-0 gl-mr-1\\">This is recursive. It will be listed in level 3.</p>
+ <!---->
+ <!---->
+ <!---->
+ </div>
<actions-stub widget=\\"MyWidget\\" tertiarybuttons=\\"\\" class=\\"gl-ml-auto gl-pl-3\\"></actions-stub>
<!---->
</div>
diff --git a/spec/frontend/vue_merge_request_widget/components/widget/widget_spec.js b/spec/frontend/vue_merge_request_widget/components/widget/widget_spec.js
index 4972c522733..9343a3a5e90 100644
--- a/spec/frontend/vue_merge_request_widget/components/widget/widget_spec.js
+++ b/spec/frontend/vue_merge_request_widget/components/widget/widget_spec.js
@@ -9,6 +9,7 @@ import ActionButtons from '~/vue_merge_request_widget/components/widget/action_b
import Widget from '~/vue_merge_request_widget/components/widget/widget.vue';
import WidgetContentRow from '~/vue_merge_request_widget/components/widget/widget_content_row.vue';
import * as logger from '~/lib/logger';
+import axios from '~/lib/utils/axios_utils';
import { HTTP_STATUS_OK } from '~/lib/utils/http_status';
jest.mock('~/vue_merge_request_widget/components/extensions/telemetry', () => ({
@@ -29,7 +30,7 @@ describe('~/vue_merge_request_widget/components/widget/widget.vue', () => {
const findHelpPopover = () => wrapper.findComponent(HelpPopover);
const findDynamicScroller = () => wrapper.findByTestId('dynamic-content-scroller');
- const createComponent = ({ propsData, slots, mountFn = shallowMountExtended } = {}) => {
+ const createComponent = async ({ propsData, slots, mountFn = shallowMountExtended } = {}) => {
wrapper = mountFn(Widget, {
propsData: {
isCollapsible: false,
@@ -49,6 +50,8 @@ describe('~/vue_merge_request_widget/components/widget/widget.vue', () => {
ContentRow: WidgetContentRow,
},
});
+
+ await axios.waitForAll();
};
describe('on mount', () => {
@@ -105,9 +108,9 @@ describe('~/vue_merge_request_widget/components/widget/widget.vue', () => {
},
});
- expect(wrapper.text()).not.toContain('Loading');
- await nextTick();
expect(wrapper.text()).toContain('Loading');
+ await axios.waitForAll();
+ expect(wrapper.text()).not.toContain('Loading');
});
it('validates widget name', () => {
@@ -185,10 +188,10 @@ describe('~/vue_merge_request_widget/components/widget/widget.vue', () => {
});
describe('content', () => {
- it('displays summary property when summary slot is not provided', () => {
- createComponent({
+ it('displays summary property when summary slot is not provided', async () => {
+ await createComponent({
propsData: {
- summary: 'Hello world',
+ summary: { title: 'Hello world' },
},
});
@@ -256,8 +259,8 @@ describe('~/vue_merge_request_widget/components/widget/widget.vue', () => {
});
describe('handle collapse toggle', () => {
- it('displays the toggle button correctly', () => {
- createComponent({
+ it('displays the toggle button correctly', async () => {
+ await createComponent({
propsData: {
isCollapsible: true,
},
@@ -271,7 +274,7 @@ describe('~/vue_merge_request_widget/components/widget/widget.vue', () => {
});
it('does not display the content slot until toggle is clicked', async () => {
- createComponent({
+ await createComponent({
propsData: {
isCollapsible: true,
},
@@ -286,8 +289,8 @@ describe('~/vue_merge_request_widget/components/widget/widget.vue', () => {
expect(findExpandedSection().text()).toBe('More complex content');
});
- it('emits a toggle even when button is toggled', () => {
- createComponent({
+ it('emits a toggle even when button is toggled', async () => {
+ await createComponent({
propsData: {
isCollapsible: true,
},
@@ -301,8 +304,8 @@ describe('~/vue_merge_request_widget/components/widget/widget.vue', () => {
expect(wrapper.emitted('toggle')).toEqual([[{ expanded: true }]]);
});
- it('does not display the toggle button if isCollapsible is false', () => {
- createComponent({
+ it('does not display the toggle button if isCollapsible is false', async () => {
+ await createComponent({
propsData: {
isCollapsible: false,
},
@@ -326,7 +329,7 @@ describe('~/vue_merge_request_widget/components/widget/widget.vue', () => {
const fetchExpandedData = jest.fn().mockResolvedValue(mockDataExpanded);
- createComponent({
+ await createComponent({
propsData: {
isCollapsible: true,
fetchCollapsedData: () => Promise.resolve(mockDataCollapsed),
@@ -358,7 +361,7 @@ describe('~/vue_merge_request_widget/components/widget/widget.vue', () => {
it('allows refetching when fetch expanded data returns an error', async () => {
const fetchExpandedData = jest.fn().mockRejectedValue({ error: true });
- createComponent({
+ await createComponent({
propsData: {
isCollapsible: true,
fetchExpandedData,
@@ -385,7 +388,7 @@ describe('~/vue_merge_request_widget/components/widget/widget.vue', () => {
it('resets the error message when another request is fetched', async () => {
const fetchExpandedData = jest.fn().mockRejectedValue({ error: true });
- createComponent({
+ await createComponent({
propsData: {
isCollapsible: true,
fetchExpandedData,
@@ -465,8 +468,8 @@ describe('~/vue_merge_request_widget/components/widget/widget.vue', () => {
},
];
- beforeEach(() => {
- createComponent({
+ beforeEach(async () => {
+ await createComponent({
mountFn: mountExtended,
propsData: {
isCollapsible: true,
diff --git a/spec/frontend/vue_merge_request_widget/extentions/terraform/index_spec.js b/spec/frontend/vue_merge_request_widget/extentions/terraform/index_spec.js
index 5baed8ff211..6aa12c37374 100644
--- a/spec/frontend/vue_merge_request_widget/extentions/terraform/index_spec.js
+++ b/spec/frontend/vue_merge_request_widget/extentions/terraform/index_spec.js
@@ -5,9 +5,7 @@ import api from '~/api';
import axios from '~/lib/utils/axios_utils';
import { HTTP_STATUS_INTERNAL_SERVER_ERROR, HTTP_STATUS_OK } from '~/lib/utils/http_status';
import Poll from '~/lib/utils/poll';
-import extensionsContainer from '~/vue_merge_request_widget/components/extensions/container';
-import { registerExtension } from '~/vue_merge_request_widget/components/extensions';
-import terraformExtension from '~/vue_merge_request_widget/extensions/terraform';
+import terraformExtension from '~/vue_merge_request_widget/extensions/terraform/index.vue';
import {
plans,
validPlanWithName,
@@ -25,22 +23,20 @@ describe('Terraform extension', () => {
const endpoint = '/path/to/terraform/report.json';
const findListItem = (at) => wrapper.findAllByTestId('extension-list-item').at(at);
-
- registerExtension(terraformExtension);
+ const findActionButton = (at) => wrapper.findAllByTestId('extension-actions-button').at(at);
const mockPollingApi = (response, body, header) => {
mock.onGet(endpoint).reply(response, body, header);
};
const createComponent = () => {
- wrapper = mountExtended(extensionsContainer, {
+ wrapper = mountExtended(terraformExtension, {
propsData: {
mr: {
terraformReportsPath: endpoint,
},
},
});
- return axios.waitForAll();
};
beforeEach(() => {
@@ -54,24 +50,27 @@ describe('Terraform extension', () => {
describe('summary', () => {
describe('while loading', () => {
const loadingText = 'Loading Terraform reports...';
+
it('should render loading text', async () => {
mockPollingApi(HTTP_STATUS_OK, plans, {});
createComponent();
expect(wrapper.text()).toContain(loadingText);
+
await waitForPromises();
expect(wrapper.text()).not.toContain(loadingText);
});
});
describe('when the fetching fails', () => {
- beforeEach(() => {
+ beforeEach(async () => {
mockPollingApi(HTTP_STATUS_INTERNAL_SERVER_ERROR, null, {});
- return createComponent();
+ createComponent();
+ await axios.waitForAll();
});
- it('should generate one invalid plan and render correct summary text', () => {
- expect(wrapper.text()).toContain('1 Terraform report failed to generate');
+ it('should show the error text', () => {
+ expect(wrapper.text()).toContain('Failed to load Terraform reports');
});
});
@@ -82,9 +81,10 @@ describe('Terraform extension', () => {
${'2 valid reports'} | ${{ 0: validPlanWithName, 1: validPlanWithName }} | ${'2 Terraform reports were generated in your pipelines'} | ${''}
${'1 valid and 2 invalid reports'} | ${{ 0: validPlanWithName, 1: invalidPlanWithName, 2: invalidPlanWithName }} | ${'Terraform report was generated in your pipelines'} | ${'2 Terraform reports failed to generate'}
`('and received $responseType', ({ response, summaryTitle, summarySubtitle }) => {
- beforeEach(() => {
+ beforeEach(async () => {
mockPollingApi(HTTP_STATUS_OK, response, {});
- return createComponent();
+ createComponent();
+ await axios.waitForAll();
});
it(`should render correct summary text`, () => {
@@ -101,7 +101,8 @@ describe('Terraform extension', () => {
describe('expanded data', () => {
beforeEach(async () => {
mockPollingApi(HTTP_STATUS_OK, plans, {});
- await createComponent();
+ createComponent();
+ await axios.waitForAll();
wrapper.findByTestId('toggle-button').trigger('click');
});
@@ -136,7 +137,7 @@ describe('Terraform extension', () => {
api.trackRedisHllUserEvent.mockClear();
api.trackRedisCounterEvent.mockClear();
- findListItem(0).find('[data-testid="extension-actions-button"]').trigger('click');
+ findActionButton(0).trigger('click');
expect(api.trackRedisHllUserEvent).toHaveBeenCalledTimes(1);
expect(api.trackRedisHllUserEvent).toHaveBeenCalledWith(
@@ -161,10 +162,10 @@ describe('Terraform extension', () => {
});
describe('successful poll', () => {
- beforeEach(() => {
+ beforeEach(async () => {
mockPollingApi(HTTP_STATUS_OK, plans, {});
-
- return createComponent();
+ createComponent();
+ await axios.waitForAll();
});
it('does not make additional requests after poll is successful', () => {
@@ -173,13 +174,14 @@ describe('Terraform extension', () => {
});
describe('polling fails', () => {
- beforeEach(() => {
+ beforeEach(async () => {
mockPollingApi(HTTP_STATUS_INTERNAL_SERVER_ERROR, null, {});
- return createComponent();
+ createComponent();
+ await axios.waitForAll();
});
- it('generates one broken plan', () => {
- expect(wrapper.text()).toContain('1 Terraform report failed to generate');
+ it('renders the error text', () => {
+ expect(wrapper.text()).toContain('Failed to load Terraform reports');
});
it('does not make additional requests after poll is unsuccessful', () => {
diff --git a/spec/frontend/vue_merge_request_widget/mock_data.js b/spec/frontend/vue_merge_request_widget/mock_data.js
index 47143bb2bb8..9da687c0ff8 100644
--- a/spec/frontend/vue_merge_request_widget/mock_data.js
+++ b/spec/frontend/vue_merge_request_widget/mock_data.js
@@ -188,7 +188,11 @@ export default {
coverage: '92.16',
path: '/root/acets-app/pipelines/172',
details: {
- artifacts,
+ artifacts: artifacts.map(({ text, url, ...rest }) => ({
+ name: text,
+ path: url,
+ ...rest,
+ })),
status: {
icon: 'status_success',
favicon: 'favicon_status_success',
diff --git a/spec/frontend/vue_merge_request_widget/mr_widget_options_spec.js b/spec/frontend/vue_merge_request_widget/mr_widget_options_spec.js
index 0533471bece..ecb5a8448f9 100644
--- a/spec/frontend/vue_merge_request_widget/mr_widget_options_spec.js
+++ b/spec/frontend/vue_merge_request_widget/mr_widget_options_spec.js
@@ -1,5 +1,4 @@
import { GlBadge, GlLink, GlIcon, GlButton, GlDropdown } from '@gitlab/ui';
-import { mount, shallowMount } from '@vue/test-utils';
import MockAdapter from 'axios-mock-adapter';
import Vue, { nextTick } from 'vue';
import VueApollo from 'vue-apollo';
@@ -10,6 +9,7 @@ import getStateQueryResponse from 'test_fixtures/graphql/merge_requests/get_stat
import readyToMergeResponse from 'test_fixtures/graphql/merge_requests/states/ready_to_merge.query.graphql.json';
import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
+import { mountExtended, shallowMountExtended } from 'helpers/vue_test_utils_helper';
import api from '~/api';
import axios from '~/lib/utils/axios_utils';
import { HTTP_STATUS_OK, HTTP_STATUS_NO_CONTENT } from '~/lib/utils/http_status';
@@ -28,6 +28,8 @@ import MrWidgetOptions from '~/vue_merge_request_widget/mr_widget_options.vue';
import Approvals from '~/vue_merge_request_widget/components/approvals/approvals.vue';
import Preparing from '~/vue_merge_request_widget/components/states/mr_widget_preparing.vue';
import WidgetContainer from '~/vue_merge_request_widget/components/widget/app.vue';
+import WidgetSuggestPipeline from '~/vue_merge_request_widget/components/mr_widget_suggest_pipeline.vue';
+import MrWidgetAlertMessage from '~/vue_merge_request_widget/components/mr_widget_alert_message.vue';
import StatusIcon from '~/vue_merge_request_widget/components/extensions/status_icon.vue';
import getStateQuery from '~/vue_merge_request_widget/queries/get_state.query.graphql';
import getStateSubscription from '~/vue_merge_request_widget/queries/get_state.subscription.graphql';
@@ -76,6 +78,9 @@ describe('MrWidgetOptions', () => {
const COLLABORATION_MESSAGE = 'Members who can merge are allowed to add commits';
const findApprovalsWidget = () => wrapper.findComponent(Approvals);
const findPreparingWidget = () => wrapper.findComponent(Preparing);
+ const findMergedPipelineContainer = () => wrapper.findByTestId('merged-pipeline-container');
+ const findPipelineContainer = () => wrapper.findByTestId('pipeline-container');
+ const findAlertMessage = () => wrapper.findComponent(MrWidgetAlertMessage);
beforeEach(() => {
gl.mrWidgetData = { ...mockData };
@@ -95,7 +100,12 @@ describe('MrWidgetOptions', () => {
gl.mrWidgetData = {};
});
- const createComponent = (mrData = mockData, options = {}, data = {}, fullMount = true) => {
+ const createComponent = ({
+ mrData = mockData,
+ options = {},
+ data = {},
+ mountFn = shallowMountExtended,
+ } = {}) => {
const mockedApprovalsSubscription = createMockApolloSubscription();
queryResponse = {
data: {
@@ -114,7 +124,6 @@ describe('MrWidgetOptions', () => {
stateQueryHandler = jest.fn().mockResolvedValue(queryResponse);
stateSubscription = createMockApolloSubscription();
- const mounting = fullMount ? mount : shallowMount;
const queryHandlers = [
[approvalsQuery, jest.fn().mockResolvedValue(approvedByCurrentUser)],
[getStateQuery, stateQueryHandler],
@@ -143,7 +152,7 @@ describe('MrWidgetOptions', () => {
apolloProvider.defaultClient.setRequestHandler(query, stream);
});
- wrapper = mounting(MrWidgetOptions, {
+ wrapper = mountFn(MrWidgetOptions, {
propsData: {
mrData: { ...mrData },
},
@@ -165,8 +174,7 @@ describe('MrWidgetOptions', () => {
wrapper.find('[data-testid="widget-extension"] [data-testid="toggle-button"]');
const findExtensionLink = (linkHref) =>
wrapper.find(`[data-testid="widget-extension"] [href="${linkHref}"]`);
- const findSuggestPipeline = () => wrapper.find('[data-testid="mr-suggest-pipeline"]');
- const findSuggestPipelineButton = () => findSuggestPipeline().find('button');
+ const findSuggestPipeline = () => wrapper.findComponent(WidgetSuggestPipeline);
const findWidgetContainer = () => wrapper.findComponent(WidgetContainer);
describe('default', () => {
@@ -175,7 +183,7 @@ describe('MrWidgetOptions', () => {
return createComponent();
});
- // https://gitlab.com/gitlab-org/gitlab/-/issues/385238
+ // quarantine: https://gitlab.com/gitlab-org/gitlab/-/issues/385238
// eslint-disable-next-line jest/no-disabled-tests
describe.skip('data', () => {
it('should instantiate Store and Service', () => {
@@ -186,6 +194,7 @@ describe('MrWidgetOptions', () => {
describe('computed', () => {
describe('componentName', () => {
+ // quarantine: https://gitlab.com/gitlab-org/gitlab/-/issues/409365
// eslint-disable-next-line jest/no-disabled-tests
it.skip.each`
${'merged'} | ${'mr-widget-merged'}
@@ -206,60 +215,18 @@ describe('MrWidgetOptions', () => {
});
});
- describe('shouldRenderPipelines', () => {
- it('should return true when hasCI is true', () => {
+ describe('MrWidgetPipelineContainer', () => {
+ it('should return true when hasCI is true', async () => {
wrapper.vm.mr.hasCI = true;
-
- expect(wrapper.vm.shouldRenderPipelines).toBe(true);
+ await nextTick();
+ expect(findPipelineContainer().exists()).toBe(true);
});
- it('should return false when hasCI is false', () => {
+ it('should return false when hasCI is false', async () => {
wrapper.vm.mr.hasCI = false;
+ await nextTick();
- expect(wrapper.vm.shouldRenderPipelines).toBe(false);
- });
- });
-
- describe('shouldRenderSourceBranchRemovalStatus', () => {
- beforeEach(() => {
- wrapper.vm.mr.state = 'readyToMerge';
- });
-
- it('should return true when cannot remove source branch and branch will be removed', () => {
- wrapper.vm.mr.canRemoveSourceBranch = false;
- wrapper.vm.mr.shouldRemoveSourceBranch = true;
-
- expect(wrapper.vm.shouldRenderSourceBranchRemovalStatus).toEqual(true);
- });
-
- it('should return false when can remove source branch and branch will be removed', () => {
- wrapper.vm.mr.canRemoveSourceBranch = true;
- wrapper.vm.mr.shouldRemoveSourceBranch = true;
-
- expect(wrapper.vm.shouldRenderSourceBranchRemovalStatus).toEqual(false);
- });
-
- it('should return false when cannot remove source branch and branch will not be removed', () => {
- wrapper.vm.mr.canRemoveSourceBranch = false;
- wrapper.vm.mr.shouldRemoveSourceBranch = false;
-
- expect(wrapper.vm.shouldRenderSourceBranchRemovalStatus).toEqual(false);
- });
-
- it('should return false when in merged state', () => {
- wrapper.vm.mr.canRemoveSourceBranch = false;
- wrapper.vm.mr.shouldRemoveSourceBranch = true;
- wrapper.vm.mr.state = 'merged';
-
- expect(wrapper.vm.shouldRenderSourceBranchRemovalStatus).toEqual(false);
- });
-
- it('should return false when in nothing to merge state', () => {
- wrapper.vm.mr.canRemoveSourceBranch = false;
- wrapper.vm.mr.shouldRemoveSourceBranch = true;
- wrapper.vm.mr.state = 'nothingToMerge';
-
- expect(wrapper.vm.shouldRenderSourceBranchRemovalStatus).toEqual(false);
+ expect(findPipelineContainer().exists()).toBe(false);
});
});
@@ -320,7 +287,7 @@ describe('MrWidgetOptions', () => {
});
it('should be false', () => {
- expect(wrapper.vm.showMergePipelineForkWarning).toEqual(false);
+ expect(findAlertMessage().exists()).toBe(false);
});
});
@@ -333,7 +300,7 @@ describe('MrWidgetOptions', () => {
});
it('should be false', () => {
- expect(wrapper.vm.showMergePipelineForkWarning).toEqual(false);
+ expect(findAlertMessage().exists()).toBe(false);
});
});
@@ -346,22 +313,30 @@ describe('MrWidgetOptions', () => {
});
it('should be true', () => {
- expect(wrapper.vm.showMergePipelineForkWarning).toEqual(true);
+ expect(findAlertMessage().exists()).toBe(true);
});
});
});
describe('formattedHumanAccess', () => {
- it('when user is a tool admin but not a member of project', () => {
+ it('when user is a tool admin but not a member of project', async () => {
wrapper.vm.mr.humanAccess = null;
+ wrapper.vm.mr.mergeRequestAddCiConfigPath = 'test';
+ wrapper.vm.mr.hasCI = false;
+ wrapper.vm.mr.isDismissedSuggestPipeline = false;
+ await nextTick();
- expect(wrapper.vm.formattedHumanAccess).toEqual('');
+ expect(findSuggestPipeline().props('humanAccess')).toBe('');
});
- it('when user a member of the project', () => {
+ it('when user a member of the project', async () => {
wrapper.vm.mr.humanAccess = 'Owner';
+ wrapper.vm.mr.mergeRequestAddCiConfigPath = 'test';
+ wrapper.vm.mr.hasCI = false;
+ wrapper.vm.mr.isDismissedSuggestPipeline = false;
+ await nextTick();
- expect(wrapper.vm.formattedHumanAccess).toEqual('owner');
+ expect(findSuggestPipeline().props('humanAccess')).toBe('owner');
});
});
});
@@ -570,10 +545,10 @@ describe('MrWidgetOptions', () => {
beforeEach(() => {
wrapper.destroy();
- return createComponent(
- mockData,
- {},
- {
+ return createComponent({
+ mrData: mockData,
+ options: {},
+ data: {
pollInterval: interval,
startingPollInterval: interval,
mr: {
@@ -584,8 +559,7 @@ describe('MrWidgetOptions', () => {
checkStatus: mockCheckStatus,
},
},
- false,
- );
+ });
});
describe('normal polling behavior', () => {
@@ -653,7 +627,7 @@ describe('MrWidgetOptions', () => {
environment_available: true,
};
- beforeEach(() => {
+ it('renders multiple deployments', async () => {
wrapper.vm.mr.deployments.push(
{
...deploymentMockData,
@@ -663,19 +637,10 @@ describe('MrWidgetOptions', () => {
id: deploymentMockData.id + 1,
},
);
-
- return nextTick();
- });
-
- it('renders multiple deployments', () => {
- expect(wrapper.findAll('.deploy-heading').length).toBe(2);
- });
-
- it('renders dropdpown with multiple file changes', () => {
- expect(
- wrapper.find('.js-mr-wigdet-deployment-dropdown').findAll('.js-filtered-dropdown-result')
- .length,
- ).toEqual(changes.length);
+ await nextTick();
+ expect(findPipelineContainer().props('isPostMerge')).toBe(false);
+ expect(findPipelineContainer().props('mr').deployments).toHaveLength(2);
+ expect(findPipelineContainer().props('mr').postMergeDeployments).toHaveLength(0);
});
});
@@ -793,7 +758,7 @@ describe('MrWidgetOptions', () => {
});
it('renders pipeline block', () => {
- expect(wrapper.find('.js-post-merge-pipeline').exists()).toBe(true);
+ expect(findMergedPipelineContainer().exists()).toBe(true);
});
describe('with post merge deployments', () => {
@@ -833,7 +798,7 @@ describe('MrWidgetOptions', () => {
});
it('renders post deployment information', () => {
- expect(wrapper.find('.js-post-deployment').exists()).toBe(true);
+ expect(findMergedPipelineContainer().exists()).toBe(true);
});
});
});
@@ -846,7 +811,7 @@ describe('MrWidgetOptions', () => {
});
it('does not render pipeline block', () => {
- expect(wrapper.find('.js-post-merge-pipeline').exists()).toBe(false);
+ expect(findMergedPipelineContainer().exists()).toBe(false);
});
});
@@ -858,11 +823,7 @@ describe('MrWidgetOptions', () => {
});
it('does not render pipeline block', () => {
- expect(wrapper.find('.js-post-merge-pipeline').exists()).toBe(false);
- });
-
- it('does not render post deployment information', () => {
- expect(wrapper.find('.js-post-deployment').exists()).toBe(false);
+ expect(findMergedPipelineContainer().exists()).toBe(false);
});
});
});
@@ -880,7 +841,6 @@ describe('MrWidgetOptions', () => {
describe('given feature flag is enabled', () => {
beforeEach(async () => {
await createComponent();
-
wrapper.vm.mr.hasCI = false;
});
@@ -901,7 +861,7 @@ describe('MrWidgetOptions', () => {
});
it('should allow dismiss of the suggest pipeline message', async () => {
- await findSuggestPipelineButton().trigger('click');
+ await findSuggestPipeline().vm.$emit('dismiss');
expect(findSuggestPipeline().exists()).toBe(false);
});
@@ -915,7 +875,7 @@ describe('MrWidgetOptions', () => {
${'merged'} | ${true} | ${'shows'}
${'open'} | ${true} | ${'shows'}
`('$showText merge error when state is $state', async ({ state, show }) => {
- createComponent({ ...mockData, state, mergeError: 'Error!' });
+ createComponent({ mrData: { ...mockData, state, mergeError: 'Error!' } });
await waitForPromises();
@@ -927,7 +887,7 @@ describe('MrWidgetOptions', () => {
beforeEach(() => {
registerExtension(workingExtension());
- createComponent();
+ createComponent({ mountFn: mountExtended });
});
afterEach(() => {
@@ -987,7 +947,7 @@ describe('MrWidgetOptions', () => {
it('shows collapse button', async () => {
registerExtension(workingExtension(true));
- await createComponent();
+ await createComponent({ mountFn: mountExtended });
expect(findExtensionToggleButton().exists()).toBe(true);
});
@@ -1026,7 +986,7 @@ describe('MrWidgetOptions', () => {
]),
);
- await createComponent();
+ await createComponent({ mountFn: mountExtended });
expect(findWidgetTestExtension().html()).toContain(
'Multi polling test extension reports: parsed, count: 2',
);
@@ -1048,7 +1008,7 @@ describe('MrWidgetOptions', () => {
]),
);
- await createComponent();
+ await createComponent({ mountFn: mountExtended });
expect(findWidgetTestExtension().html()).toContain('Test extension loading...');
});
});
@@ -1057,7 +1017,7 @@ describe('MrWidgetOptions', () => {
it('does not make additional requests after poll is successful', async () => {
registerExtension(pollingExtension);
- await createComponent();
+ await createComponent({ mountFn: mountExtended });
expect(pollRequest).toHaveBeenCalledTimes(1);
});
@@ -1067,7 +1027,7 @@ describe('MrWidgetOptions', () => {
it('sets data when polling is complete', async () => {
registerExtension(pollingFullDataExtension);
- await createComponent();
+ await createComponent({ mountFn: mountExtended });
api.trackRedisHllUserEvent.mockClear();
api.trackRedisCounterEvent.mockClear();
@@ -1095,14 +1055,14 @@ describe('MrWidgetOptions', () => {
describe('error', () => {
it('does not make additional requests after poll has failed', async () => {
registerExtension(pollingErrorExtension);
- await createComponent();
+ await createComponent({ mountFn: mountExtended });
expect(pollRequest).toHaveBeenCalledTimes(1);
});
it('captures sentry error and displays error when poll has failed', async () => {
registerExtension(pollingErrorExtension);
- await createComponent();
+ await createComponent({ mountFn: mountExtended });
expect(Sentry.captureException).toHaveBeenCalled();
expect(Sentry.captureException).toHaveBeenCalledWith(new Error('Fetch error'));
@@ -1118,7 +1078,7 @@ describe('MrWidgetOptions', () => {
it('handles collapsed data fetch errors', async () => {
registerExtension(collapsedDataErrorExtension);
- await createComponent();
+ await createComponent({ mountFn: mountExtended });
expect(
wrapper.find('[data-testid="widget-extension"] [data-testid="toggle-button"]').exists(),
@@ -1130,7 +1090,7 @@ describe('MrWidgetOptions', () => {
it('handles full data fetch errors', async () => {
registerExtension(fullDataErrorExtension);
- await createComponent();
+ await createComponent({ mountFn: mountExtended });
expect(wrapper.findComponent(StatusIcon).props('iconName')).not.toBe('error');
wrapper
@@ -1153,7 +1113,7 @@ describe('MrWidgetOptions', () => {
it('triggers view events when mounted', () => {
registerExtension(workingExtension());
- createComponent();
+ createComponent({ mountFn: mountExtended });
expect(api.trackRedisHllUserEvent).toHaveBeenCalledTimes(1);
expect(api.trackRedisHllUserEvent).toHaveBeenCalledWith(
@@ -1168,7 +1128,7 @@ describe('MrWidgetOptions', () => {
describe('expand button', () => {
it('triggers expand events when clicked', async () => {
registerExtension(workingExtension());
- createComponent();
+ createComponent({ mountFn: mountExtended });
await waitForPromises();
@@ -1197,7 +1157,7 @@ describe('MrWidgetOptions', () => {
it('triggers the "full report clicked" events when the appropriate button is clicked', () => {
registerExtension(fullReportExtension);
- createComponent();
+ createComponent({ mountFn: mountExtended });
api.trackRedisHllUserEvent.mockClear();
api.trackRedisCounterEvent.mockClear();
@@ -1221,7 +1181,7 @@ describe('MrWidgetOptions', () => {
it("doesn't emit any telemetry events", async () => {
registerExtension(noTelemetryExtension);
- createComponent();
+ createComponent({ mountFn: mountExtended });
await waitForPromises();
@@ -1249,7 +1209,7 @@ describe('MrWidgetOptions', () => {
});
it('does not render the Preparing state component by default', async () => {
- await createComponent();
+ await createComponent({ mountFn: mountExtended });
expect(findApprovalsWidget().exists()).toBe(true);
expect(findPreparingWidget().exists()).toBe(false);
@@ -1257,9 +1217,11 @@ describe('MrWidgetOptions', () => {
it('renders the Preparing state component when the MR state is initially "preparing"', async () => {
await createComponent({
- ...mockData,
- state: 'opened',
- detailedMergeStatus: 'PREPARING',
+ mrData: {
+ ...mockData,
+ state: 'opened',
+ detailedMergeStatus: 'PREPARING',
+ },
});
expect(findApprovalsWidget().exists()).toBe(false);
@@ -1272,31 +1234,29 @@ describe('MrWidgetOptions', () => {
});
it("shows the Preparing widget when the MR reports it's not ready yet", async () => {
- await createComponent(
- {
+ await createComponent({
+ mrData: {
...mockData,
state: 'opened',
detailedMergeStatus: 'PREPARING',
},
- {},
- {},
- false,
- );
+ options: {},
+ data: {},
+ });
expect(wrapper.html()).toContain('mr-widget-preparing-stub');
});
it('removes the Preparing widget when the MR indicates it has been prepared', async () => {
- await createComponent(
- {
+ await createComponent({
+ mrData: {
...mockData,
state: 'opened',
detailedMergeStatus: 'PREPARING',
},
- {},
- {},
- false,
- );
+ options: {},
+ data: {},
+ });
expect(wrapper.html()).toContain('mr-widget-preparing-stub');
diff --git a/spec/frontend/vue_shared/alert_details/alert_management_sidebar_todo_spec.js b/spec/frontend/vue_shared/alert_details/alert_management_sidebar_todo_spec.js
index 217103ab25c..cfd0d5bcf89 100644
--- a/spec/frontend/vue_shared/alert_details/alert_management_sidebar_todo_spec.js
+++ b/spec/frontend/vue_shared/alert_details/alert_management_sidebar_todo_spec.js
@@ -1,5 +1,7 @@
import { mount } from '@vue/test-utils';
-import { nextTick } from 'vue';
+import Vue, { nextTick } from 'vue';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
import todoMarkDoneMutation from '~/graphql_shared/mutations/todo_mark_done.mutation.graphql';
import SidebarTodo from '~/vue_shared/alert_details/components/sidebar/sidebar_todo.vue';
import createAlertTodoMutation from '~/vue_shared/alert_details/graphql/mutations/alert_todo_create.mutation.graphql';
@@ -9,41 +11,39 @@ const mockAlert = mockAlerts[0];
describe('Alert Details Sidebar To Do', () => {
let wrapper;
+ let requestHandler;
- function mountComponent({ data, sidebarCollapsed = true, loading = false, stubs = {} } = {}) {
+ const defaultHandler = {
+ createAlertTodo: jest.fn().mockResolvedValue({}),
+ markAsDone: jest.fn().mockResolvedValue({}),
+ };
+
+ const createMockApolloProvider = (handler) => {
+ Vue.use(VueApollo);
+
+ requestHandler = handler;
+
+ return createMockApollo([
+ [todoMarkDoneMutation, handler.markAsDone],
+ [createAlertTodoMutation, handler.createAlertTodo],
+ ]);
+ };
+
+ function mountComponent({ data, sidebarCollapsed = true, handler = defaultHandler } = {}) {
wrapper = mount(SidebarTodo, {
+ apolloProvider: createMockApolloProvider(handler),
propsData: {
alert: { ...mockAlert },
...data,
sidebarCollapsed,
projectPath: 'projectPath',
},
- mocks: {
- $apollo: {
- mutate: jest.fn(),
- queries: {
- alert: {
- loading,
- },
- },
- },
- },
- stubs,
});
}
const findToDoButton = () => wrapper.find('[data-testid="alert-todo-button"]');
describe('updating the alert to do', () => {
- const mockUpdatedMutationResult = {
- data: {
- updateAlertTodo: {
- errors: [],
- alert: {},
- },
- },
- };
-
describe('adding a todo', () => {
beforeEach(() => {
mountComponent({
@@ -60,18 +60,15 @@ describe('Alert Details Sidebar To Do', () => {
});
it('calls `$apollo.mutate` with `createAlertTodoMutation` mutation and variables containing `iid`, `todoEvent`, & `projectPath`', async () => {
- jest.spyOn(wrapper.vm.$apollo, 'mutate').mockResolvedValue(mockUpdatedMutationResult);
-
findToDoButton().trigger('click');
await nextTick();
- expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledWith({
- mutation: createAlertTodoMutation,
- variables: {
+ expect(requestHandler.createAlertTodo).toHaveBeenCalledWith(
+ expect.objectContaining({
iid: '1527542',
projectPath: 'projectPath',
- },
- });
+ }),
+ );
});
});
@@ -91,17 +88,11 @@ describe('Alert Details Sidebar To Do', () => {
});
it('calls `$apollo.mutate` with `todoMarkDoneMutation` mutation and variables containing `id`', async () => {
- jest.spyOn(wrapper.vm.$apollo, 'mutate').mockResolvedValue(mockUpdatedMutationResult);
-
findToDoButton().trigger('click');
await nextTick();
- expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledWith({
- mutation: todoMarkDoneMutation,
- update: expect.anything(),
- variables: {
- id: '1234',
- },
+ expect(requestHandler.markAsDone).toHaveBeenCalledWith({
+ id: '1234',
});
});
});
diff --git a/spec/frontend/vue_shared/alert_details/alert_status_spec.js b/spec/frontend/vue_shared/alert_details/alert_status_spec.js
index 98cb2f5cb0b..90d29f0bfd4 100644
--- a/spec/frontend/vue_shared/alert_details/alert_status_spec.js
+++ b/spec/frontend/vue_shared/alert_details/alert_status_spec.js
@@ -1,7 +1,9 @@
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
-import { nextTick } from 'vue';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises';
+import createMockApollo from 'helpers/mock_apollo_helper';
import updateAlertStatusMutation from '~/graphql_shared//mutations/alert_status_update.mutation.graphql';
import Tracking from '~/tracking';
import AlertManagementStatus from '~/vue_shared/alert_details/components/alert_status.vue';
@@ -11,6 +13,27 @@ const mockAlert = mockAlerts[0];
describe('AlertManagementStatus', () => {
let wrapper;
+ let requestHandler;
+
+ const iid = '1527542';
+ const mockUpdatedMutationResult = ({ errors = [], nodes = [] } = {}) =>
+ jest.fn().mockResolvedValue({
+ data: {
+ updateAlertStatus: {
+ errors,
+ alert: {
+ id: '1',
+ iid,
+ status: 'acknowledged',
+ endedAt: 'endedAt',
+ notes: {
+ nodes,
+ },
+ },
+ },
+ },
+ });
+
const findStatusDropdown = () => wrapper.findComponent(GlDropdown);
const findFirstStatusOption = () => findStatusDropdown().findComponent(GlDropdownItem);
const findAllStatusOptions = () => findStatusDropdown().findAllComponents(GlDropdownItem);
@@ -22,8 +45,20 @@ describe('AlertManagementStatus', () => {
return waitForPromises();
};
- function mountComponent({ props = {}, provide = {}, loading = false, stubs = {} } = {}) {
+ const createMockApolloProvider = (handler) => {
+ Vue.use(VueApollo);
+ requestHandler = handler;
+
+ return createMockApollo([[updateAlertStatusMutation, handler]]);
+ };
+
+ function mountComponent({
+ props = {},
+ provide = {},
+ handler = mockUpdatedMutationResult(),
+ } = {}) {
wrapper = shallowMountExtended(AlertManagementStatus, {
+ apolloProvider: createMockApolloProvider(handler),
propsData: {
alert: { ...mockAlert },
projectPath: 'gitlab-org/gitlab',
@@ -31,17 +66,6 @@ describe('AlertManagementStatus', () => {
...props,
},
provide,
- mocks: {
- $apollo: {
- mutate: jest.fn(),
- queries: {
- alert: {
- loading,
- },
- },
- },
- },
- stubs,
});
}
@@ -63,43 +87,32 @@ describe('AlertManagementStatus', () => {
});
describe('updating the alert status', () => {
- const iid = '1527542';
- const mockUpdatedMutationResult = {
- data: {
- updateAlertStatus: {
- errors: [],
- alert: {
- iid,
- status: 'acknowledged',
- },
- },
- },
- };
-
beforeEach(() => {
- mountComponent({});
+ mountComponent();
});
- it('calls `$apollo.mutate` with `updateAlertStatus` mutation and variables containing `iid`, `status`, & `projectPath`', () => {
- jest.spyOn(wrapper.vm.$apollo, 'mutate').mockResolvedValue(mockUpdatedMutationResult);
+ it('calls `$apollo.mutate` with `updateAlertStatus` mutation and variables containing `iid`, `status`, & `projectPath`', async () => {
findFirstStatusOption().vm.$emit('click');
+ await waitForPromises();
- expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledWith({
- mutation: updateAlertStatusMutation,
- variables: {
- iid,
- status: 'TRIGGERED',
- projectPath: 'gitlab-org/gitlab',
- },
+ expect(requestHandler).toHaveBeenCalledWith({
+ iid,
+ status: 'TRIGGERED',
+ projectPath: 'gitlab-org/gitlab',
});
});
describe('when a request fails', () => {
- beforeEach(() => {
- jest.spyOn(wrapper.vm.$apollo, 'mutate').mockReturnValue(Promise.reject(new Error()));
+ beforeEach(async () => {
+ mountComponent({
+ handler: mockUpdatedMutationResult({ errors: ['<span data-testid="htmlError" />'] }),
+ });
+ await waitForPromises();
});
it('emits an error', async () => {
+ mountComponent({ handler: jest.fn().mockRejectedValue({}) });
+ await waitForPromises();
await selectFirstStatusOption();
expect(wrapper.emitted('alert-error')[0]).toEqual([
@@ -116,7 +129,6 @@ describe('AlertManagementStatus', () => {
it('emits an error when triggered a second time', async () => {
await selectFirstStatusOption();
- await nextTick();
await selectFirstStatusOption();
// Should emit two errors [0,1]
expect(wrapper.emitted('alert-error').length > 1).toBe(true);
@@ -124,19 +136,9 @@ describe('AlertManagementStatus', () => {
});
it('shows an error when response includes HTML errors', async () => {
- const mockUpdatedMutationErrorResult = {
- data: {
- updateAlertStatus: {
- errors: ['<span data-testid="htmlError" />'],
- alert: {
- iid,
- status: 'acknowledged',
- },
- },
- },
- };
-
- jest.spyOn(wrapper.vm.$apollo, 'mutate').mockResolvedValue(mockUpdatedMutationErrorResult);
+ mountComponent({
+ handler: mockUpdatedMutationResult({ errors: ['<span data-testid="htmlError" />'] }),
+ });
await selectFirstStatusOption();
@@ -160,7 +162,7 @@ describe('AlertManagementStatus', () => {
mountComponent({
props: { alert: { ...mockAlert, status }, statuses: { [status]: translatedStatus } },
});
- expect(findAllStatusOptions().length).toBe(1);
+ expect(findAllStatusOptions()).toHaveLength(1);
expect(findFirstStatusOption().text()).toBe(translatedStatus);
});
});
@@ -173,10 +175,10 @@ describe('AlertManagementStatus', () => {
it('should not track alert status updates when the tracking options do not exist', async () => {
mountComponent({});
Tracking.event.mockClear();
- jest.spyOn(wrapper.vm.$apollo, 'mutate').mockResolvedValue({});
+
findFirstStatusOption().vm.$emit('click');
- await nextTick();
+ await waitForPromises();
expect(Tracking.event).not.toHaveBeenCalled();
});
@@ -187,12 +189,14 @@ describe('AlertManagementStatus', () => {
action: 'update_alert_status',
label: 'Status',
};
- mountComponent({ provide: { trackAlertStatusUpdateOptions } });
+ mountComponent({
+ provide: { trackAlertStatusUpdateOptions },
+ handler: mockUpdatedMutationResult({ nodes: mockAlerts }),
+ });
Tracking.event.mockClear();
- jest.spyOn(wrapper.vm.$apollo, 'mutate').mockResolvedValue({});
findFirstStatusOption().vm.$emit('click');
- await nextTick();
+ await waitForPromises();
const status = findFirstStatusOption().text();
const { category, action, label } = trackAlertStatusUpdateOptions;
diff --git a/spec/frontend/vue_shared/components/actions_button_spec.js b/spec/frontend/vue_shared/components/actions_button_spec.js
index e7663e2adb2..9f9a27c6997 100644
--- a/spec/frontend/vue_shared/components/actions_button_spec.js
+++ b/spec/frontend/vue_shared/components/actions_button_spec.js
@@ -31,12 +31,13 @@ const TEST_ACTION_2 = {
describe('vue_shared/components/actions_button', () => {
let wrapper;
- function createComponent(props) {
+ function createComponent({ props = {}, slots = {} } = {}) {
wrapper = shallowMountExtended(ActionsButton, {
propsData: { actions: [TEST_ACTION, TEST_ACTION_2], toggleText: 'Edit', ...props },
stubs: {
GlDisclosureDropdownItem,
},
+ slots,
});
}
const findDropdown = () => wrapper.findComponent(GlDisclosureDropdown);
@@ -47,11 +48,29 @@ describe('vue_shared/components/actions_button', () => {
expect(findDropdown().props().toggleText).toBe('Edit');
});
+ it('dropdown has a fluid width', () => {
+ createComponent();
+
+ expect(findDropdown().props().fluidWidth).toBe(true);
+ });
+
+ it('provides a default slot', () => {
+ const slotContent = 'default text';
+
+ createComponent({
+ slots: {
+ default: slotContent,
+ },
+ });
+
+ expect(findDropdown().text()).toContain(slotContent);
+ });
+
it('allows customizing variant and category', () => {
const variant = 'confirm';
const category = 'secondary';
- createComponent({ variant, category });
+ createComponent({ props: { variant, category } });
expect(findDropdown().props()).toMatchObject({ category, variant });
});
@@ -88,4 +107,13 @@ describe('vue_shared/components/actions_button', () => {
});
});
});
+
+ it.each(['shown', 'hidden'])(
+ 'bubbles up %s event from the disclosure dropdown component',
+ (event) => {
+ createComponent();
+ findDropdown().vm.$emit(event);
+ expect(wrapper.emitted(event)).toHaveLength(1);
+ },
+ );
});
diff --git a/spec/frontend/vue_shared/components/awards_list_spec.js b/spec/frontend/vue_shared/components/awards_list_spec.js
index da5516f8db1..6c28347503c 100644
--- a/spec/frontend/vue_shared/components/awards_list_spec.js
+++ b/spec/frontend/vue_shared/components/awards_list_spec.js
@@ -74,6 +74,7 @@ describe('vue_shared/components/awards_list', () => {
return {
classes: x.classes(),
title: x.attributes('title'),
+ emojiName: x.attributes('data-emoji-name'),
html: x.find('[data-testid="award-html"]').html(),
count: Number(x.find('.js-counter').text()),
};
@@ -96,48 +97,56 @@ describe('vue_shared/components/awards_list', () => {
count: 3,
html: matchingEmojiTag(EMOJI_THUMBSUP),
title: `Ada, Leonardo, and Marie reacted with :${EMOJI_THUMBSUP}:`,
+ emojiName: EMOJI_THUMBSUP,
},
{
classes: [...REACTION_CONTROL_CLASSES, 'selected'],
count: 3,
html: matchingEmojiTag(EMOJI_THUMBSDOWN),
title: `You, Ada, and Marie reacted with :${EMOJI_THUMBSDOWN}:`,
+ emojiName: EMOJI_THUMBSDOWN,
},
{
classes: REACTION_CONTROL_CLASSES,
count: 1,
html: matchingEmojiTag(EMOJI_100),
title: `Ada reacted with :${EMOJI_100}:`,
+ emojiName: EMOJI_100,
},
{
classes: REACTION_CONTROL_CLASSES,
count: 2,
html: matchingEmojiTag(EMOJI_SMILE),
title: `Ada and Jane reacted with :${EMOJI_SMILE}:`,
+ emojiName: EMOJI_SMILE,
},
{
classes: [...REACTION_CONTROL_CLASSES, 'selected'],
count: 4,
html: matchingEmojiTag(EMOJI_OK),
title: `You, Ada, Jane, and Leonardo reacted with :${EMOJI_OK}:`,
+ emojiName: EMOJI_OK,
},
{
classes: [...REACTION_CONTROL_CLASSES, 'selected'],
count: 1,
html: matchingEmojiTag(EMOJI_CACTUS),
title: `You reacted with :${EMOJI_CACTUS}:`,
+ emojiName: EMOJI_CACTUS,
},
{
classes: REACTION_CONTROL_CLASSES,
count: 1,
html: matchingEmojiTag(EMOJI_A),
title: `Marie reacted with :${EMOJI_A}:`,
+ emojiName: EMOJI_A,
},
{
classes: [...REACTION_CONTROL_CLASSES, 'selected'],
count: 1,
html: matchingEmojiTag(EMOJI_B),
title: `You reacted with :${EMOJI_B}:`,
+ emojiName: EMOJI_B,
},
]);
});
@@ -226,12 +235,14 @@ describe('vue_shared/components/awards_list', () => {
count: 0,
html: matchingEmojiTag(EMOJI_THUMBSUP),
title: '',
+ emojiName: EMOJI_THUMBSUP,
},
{
classes: REACTION_CONTROL_CLASSES,
count: 0,
html: matchingEmojiTag(EMOJI_THUMBSDOWN),
title: '',
+ emojiName: EMOJI_THUMBSDOWN,
},
// We expect the EMOJI_100 before the EMOJI_SMILE because it was given as a defaultAward
{
@@ -239,12 +250,14 @@ describe('vue_shared/components/awards_list', () => {
count: 1,
html: matchingEmojiTag(EMOJI_100),
title: `Marie reacted with :${EMOJI_100}:`,
+ emojiName: EMOJI_100,
},
{
classes: REACTION_CONTROL_CLASSES,
count: 1,
html: matchingEmojiTag(EMOJI_SMILE),
title: `Marie reacted with :${EMOJI_SMILE}:`,
+ emojiName: EMOJI_SMILE,
},
]);
});
diff --git a/spec/frontend/vue_shared/components/blob_viewers/rich_viewer_spec.js b/spec/frontend/vue_shared/components/blob_viewers/rich_viewer_spec.js
index 6acd1f51a86..1f3029435ee 100644
--- a/spec/frontend/vue_shared/components/blob_viewers/rich_viewer_spec.js
+++ b/spec/frontend/vue_shared/components/blob_viewers/rich_viewer_spec.js
@@ -1,3 +1,4 @@
+import { nextTick } from 'vue';
import { shallowMount } from '@vue/test-utils';
import { handleBlobRichViewer } from '~/blob/viewer';
import RichViewer from '~/vue_shared/components/blob_viewers/rich_viewer.vue';
@@ -21,16 +22,24 @@ describe('Blob Rich Viewer component', () => {
}
beforeEach(() => {
+ const execImmediately = (callback) => callback();
+ jest.spyOn(window, 'requestIdleCallback').mockImplementation(execImmediately);
+
createComponent();
});
+ it('listens to requestIdleCallback', () => {
+ expect(window.requestIdleCallback).toHaveBeenCalled();
+ });
+
it('renders the passed content without transformations', () => {
expect(wrapper.html()).toContain(content);
});
- it('renders the richViewer if one is present', () => {
+ it('renders the richViewer if one is present', async () => {
const richViewer = '<div class="js-pdf-viewer"></div>';
createComponent('pdf', richViewer);
+ await nextTick();
expect(wrapper.html()).toContain(richViewer);
});
diff --git a/spec/frontend/vue_shared/components/ci_icon_spec.js b/spec/frontend/vue_shared/components/ci_icon_spec.js
index 31d63654168..c907b776b91 100644
--- a/spec/frontend/vue_shared/components/ci_icon_spec.js
+++ b/spec/frontend/vue_shared/components/ci_icon_spec.js
@@ -1,18 +1,23 @@
import { GlIcon } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
-import ciIcon from '~/vue_shared/components/ci_icon.vue';
+import CiIcon from '~/vue_shared/components/ci_icon.vue';
describe('CI Icon component', () => {
let wrapper;
- const findIconWrapper = () => wrapper.find('[data-testid="ci-icon-wrapper"]');
+ const createComponent = (props) => {
+ wrapper = shallowMount(CiIcon, {
+ propsData: {
+ ...props,
+ },
+ });
+ };
it('should render a span element with an svg', () => {
- wrapper = shallowMount(ciIcon, {
- propsData: {
- status: {
- icon: 'status_success',
- },
+ createComponent({
+ status: {
+ group: 'success',
+ icon: 'status_success',
},
});
@@ -20,49 +25,43 @@ describe('CI Icon component', () => {
expect(wrapper.findComponent(GlIcon).exists()).toBe(true);
});
- describe('active icons', () => {
- it.each`
- isActive | cssClass
- ${true} | ${'active'}
- ${false} | ${'active'}
- `('active should be $isActive', ({ isActive, cssClass }) => {
- wrapper = shallowMount(ciIcon, {
+ describe.each`
+ isActive
+ ${true}
+ ${false}
+ `('when isActive is $isActive', ({ isActive }) => {
+ it(`"active" class is ${isActive ? 'not ' : ''}added`, () => {
+ wrapper = shallowMount(CiIcon, {
propsData: {
status: {
+ group: 'success',
icon: 'status_success',
},
isActive,
},
});
- if (isActive) {
- expect(findIconWrapper().classes()).toContain(cssClass);
- } else {
- expect(findIconWrapper().classes()).not.toContain(cssClass);
- }
+ expect(wrapper.classes('active')).toBe(isActive);
});
});
- describe('interactive icons', () => {
- it.each`
- isInteractive | cssClass
- ${true} | ${'interactive'}
- ${false} | ${'interactive'}
- `('interactive should be $isInteractive', ({ isInteractive, cssClass }) => {
- wrapper = shallowMount(ciIcon, {
+ describe.each`
+ isInteractive
+ ${true}
+ ${false}
+ `('when isInteractive is $isInteractive', ({ isInteractive }) => {
+ it(`"interactive" class is ${isInteractive ? 'not ' : ''}added`, () => {
+ wrapper = shallowMount(CiIcon, {
propsData: {
status: {
+ group: 'success',
icon: 'status_success',
},
isInteractive,
},
});
- if (isInteractive) {
- expect(findIconWrapper().classes()).toContain(cssClass);
- } else {
- expect(findIconWrapper().classes()).not.toContain(cssClass);
- }
+ expect(wrapper.classes('interactive')).toBe(isInteractive);
});
});
@@ -79,7 +78,7 @@ describe('CI Icon component', () => {
${'status_canceled'} | ${'canceled'} | ${'ci-status-icon-canceled'}
${'status_manual'} | ${'manual'} | ${'ci-status-icon-manual'}
`('should render a $group status', ({ icon, group, cssClass }) => {
- wrapper = shallowMount(ciIcon, {
+ wrapper = shallowMount(CiIcon, {
propsData: {
status: {
icon,
diff --git a/spec/frontend/vue_shared/components/code_block_highlighted_spec.js b/spec/frontend/vue_shared/components/code_block_highlighted_spec.js
index 25283eb1211..5720f45f4dd 100644
--- a/spec/frontend/vue_shared/components/code_block_highlighted_spec.js
+++ b/spec/frontend/vue_shared/components/code_block_highlighted_spec.js
@@ -58,4 +58,11 @@ describe('Code Block Highlighted', () => {
</code-block-stub>
`);
});
+
+ it('renders content as plain text language is not supported', () => {
+ const content = '<script>alert("xss")</script>';
+ createComponent({ code: content, language: 'foobar' });
+
+ expect(wrapper.text()).toContain(content);
+ });
});
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 d7f94c00d09..0b5c8d9afc3 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
@@ -60,9 +60,7 @@ describe('Confirm Danger Modal', () => {
});
it('renders the correct confirmation phrase', () => {
- expect(findConfirmationPhrase().text()).toBe(
- `Please type ${phrase} to proceed or close this modal to cancel.`,
- );
+ expect(findConfirmationPhrase().text()).toBe(`Please type ${phrase} to proceed.`);
});
describe('without injected data', () => {
diff --git a/spec/frontend/vue_shared/components/diff_stats_dropdown_spec.js b/spec/frontend/vue_shared/components/diff_stats_dropdown_spec.js
index 2a4037d76b7..40232eb367a 100644
--- a/spec/frontend/vue_shared/components/diff_stats_dropdown_spec.js
+++ b/spec/frontend/vue_shared/components/diff_stats_dropdown_spec.js
@@ -8,6 +8,7 @@ import {
import fuzzaldrinPlus from 'fuzzaldrin-plus';
import { nextTick } from 'vue';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { stubComponent } from 'helpers/stub_component';
import DiffStatsDropdown, { i18n } from '~/vue_shared/components/diff_stats_dropdown.vue';
jest.mock('fuzzaldrin-plus', () => ({
@@ -38,6 +39,7 @@ const mockFiles = [
describe('Diff Stats Dropdown', () => {
let wrapper;
+ const focusInputMock = jest.fn();
const createComponent = ({ changed = 0, added = 0, deleted = 0, files = [] } = {}) => {
wrapper = shallowMountExtended(DiffStatsDropdown, {
@@ -50,6 +52,9 @@ describe('Diff Stats Dropdown', () => {
stubs: {
GlSprintf,
GlDropdown,
+ GlSearchBoxByType: stubComponent(GlSearchBoxByType, {
+ methods: { focusInput: focusInputMock },
+ }),
},
});
};
@@ -151,10 +156,8 @@ describe('Diff Stats Dropdown', () => {
});
it('should set the search input focus', () => {
- wrapper.vm.$refs.search.focusInput = jest.fn();
findChanged().vm.$emit('shown');
-
- expect(wrapper.vm.$refs.search.focusInput).toHaveBeenCalled();
+ expect(focusInputMock).toHaveBeenCalled();
});
});
});
diff --git a/spec/frontend/vue_shared/components/entity_select/entity_select_spec.js b/spec/frontend/vue_shared/components/entity_select/entity_select_spec.js
index 6e2e854adae..36772ad03fe 100644
--- a/spec/frontend/vue_shared/components/entity_select/entity_select_spec.js
+++ b/spec/frontend/vue_shared/components/entity_select/entity_select_spec.js
@@ -125,7 +125,8 @@ describe('EntitySelect', () => {
it('emits `input` event with the select value', async () => {
createComponent();
await selectGroup();
- expect(wrapper.emitted('input')[0]).toEqual(['1']);
+
+ expect(wrapper.emitted('input')[0][0]).toMatchObject(itemMock);
});
it(`uses the selected group's name as the toggle text`, async () => {
@@ -153,14 +154,14 @@ describe('EntitySelect', () => {
expect(findListbox().props('toggleText')).toBe(defaultToggleText);
});
- it('emits `input` event with `null` on reset', async () => {
+ it('emits `input` event with an empty object on reset', async () => {
createComponent();
await selectGroup();
findListbox().vm.$emit('reset');
await nextTick();
- expect(wrapper.emitted('input')[2]).toEqual([null]);
+ expect(Object.keys(wrapper.emitted('input')[2][0]).length).toBe(0);
});
});
});
diff --git a/spec/frontend/vue_shared/components/entity_select/group_select_spec.js b/spec/frontend/vue_shared/components/entity_select/group_select_spec.js
index 83560e367ea..ae551116560 100644
--- a/spec/frontend/vue_shared/components/entity_select/group_select_spec.js
+++ b/spec/frontend/vue_shared/components/entity_select/group_select_spec.js
@@ -39,6 +39,8 @@ describe('GroupSelect', () => {
const findEntitySelect = () => wrapper.findComponent(EntitySelect);
const findAlert = () => wrapper.findComponent(GlAlert);
+ const handleInput = jest.fn();
+
// Helpers
const createComponent = ({ props = {} } = {}) => {
wrapper = shallowMountExtended(GroupSelect, {
@@ -52,6 +54,9 @@ describe('GroupSelect', () => {
GlAlert,
EntitySelect,
},
+ listeners: {
+ input: handleInput,
+ },
});
};
const openListbox = () => findListbox().vm.$emit('shown');
@@ -132,4 +137,11 @@ describe('GroupSelect', () => {
expect(findAlert().exists()).toBe(true);
expect(findAlert().text()).toBe(FETCH_GROUPS_ERROR);
});
+
+ it('forwards events to the parent scope via `v-on="$listeners"`', () => {
+ createComponent();
+ findEntitySelect().vm.$emit('input');
+
+ expect(handleInput).toHaveBeenCalledTimes(1);
+ });
});
diff --git a/spec/frontend/vue_shared/components/entity_select/project_select_spec.js b/spec/frontend/vue_shared/components/entity_select/project_select_spec.js
index 0a174c98efb..9113152c975 100644
--- a/spec/frontend/vue_shared/components/entity_select/project_select_spec.js
+++ b/spec/frontend/vue_shared/components/entity_select/project_select_spec.js
@@ -45,6 +45,8 @@ describe('ProjectSelect', () => {
const findEntitySelect = () => wrapper.findComponent(EntitySelect);
const findAlert = () => wrapper.findComponent(GlAlert);
+ const handleInput = jest.fn();
+
// Helpers
const createComponent = ({ props = {} } = {}) => {
wrapper = mountExtended(ProjectSelect, {
@@ -59,6 +61,9 @@ describe('ProjectSelect', () => {
GlAlert,
EntitySelect,
},
+ listeners: {
+ input: handleInput,
+ },
});
};
const openListbox = () => findListbox().vm.$emit('shown');
@@ -255,4 +260,11 @@ describe('ProjectSelect', () => {
expect(findAlert().exists()).toBe(true);
expect(findAlert().text()).toBe(FETCH_PROJECTS_ERROR);
});
+
+ it('forwards events to the parent scope via `v-on="$listeners"`', () => {
+ createComponent();
+ findEntitySelect().vm.$emit('input');
+
+ expect(handleInput).toHaveBeenCalledTimes(1);
+ });
});
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 c0cb17f0d16..00a412d9de8 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
@@ -125,46 +125,23 @@ describe('FilteredSearchBarRoot', () => {
});
describe('sortDirectionIcon', () => {
- it('returns string "sort-lowest" when `selectedSortDirection` is "ascending"', () => {
- // setData usage is discouraged. See https://gitlab.com/groups/gitlab-org/-/epics/7330 for details
- // eslint-disable-next-line no-restricted-syntax
- wrapper.setData({
- selectedSortDirection: SORT_DIRECTION.ascending,
- });
-
- expect(wrapper.vm.sortDirectionIcon).toBe('sort-lowest');
- });
-
- it('returns string "sort-highest" when `selectedSortDirection` is "descending"', () => {
- // setData usage is discouraged. See https://gitlab.com/groups/gitlab-org/-/epics/7330 for details
- // eslint-disable-next-line no-restricted-syntax
- wrapper.setData({
- selectedSortDirection: SORT_DIRECTION.descending,
+ it('renders `sort-highest` descending icon by default', () => {
+ expect(findGlButton().props('icon')).toBe('sort-highest');
+ expect(findGlButton().attributes()).toMatchObject({
+ 'aria-label': 'Sort direction: Descending',
+ title: 'Sort direction: Descending',
});
-
- expect(wrapper.vm.sortDirectionIcon).toBe('sort-highest');
});
- });
- describe('sortDirectionTooltip', () => {
- it('returns string "Sort direction: Ascending" when `selectedSortDirection` is "ascending"', () => {
- // setData usage is discouraged. See https://gitlab.com/groups/gitlab-org/-/epics/7330 for details
- // eslint-disable-next-line no-restricted-syntax
- wrapper.setData({
- selectedSortDirection: SORT_DIRECTION.ascending,
- });
-
- expect(wrapper.vm.sortDirectionTooltip).toBe('Sort direction: Ascending');
- });
+ it('renders `sort-lowest` ascending icon when the sort button is clicked', async () => {
+ findGlButton().vm.$emit('click');
+ await nextTick();
- it('returns string "Sort direction: Descending" when `selectedSortDirection` is "descending"', () => {
- // setData usage is discouraged. See https://gitlab.com/groups/gitlab-org/-/epics/7330 for details
- // eslint-disable-next-line no-restricted-syntax
- wrapper.setData({
- selectedSortDirection: SORT_DIRECTION.descending,
+ expect(findGlButton().props('icon')).toBe('sort-lowest');
+ expect(findGlButton().attributes()).toMatchObject({
+ 'aria-label': 'Sort direction: Ascending',
+ title: 'Sort direction: Ascending',
});
-
- expect(wrapper.vm.sortDirectionTooltip).toBe('Sort direction: Descending');
});
});
diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/crm_contact_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/crm_contact_token_spec.js
index fb8cea09a9b..d34d7ff48c2 100644
--- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/crm_contact_token_spec.js
+++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/crm_contact_token_spec.js
@@ -39,7 +39,6 @@ describe('CrmContactToken', () => {
Vue.use(VueApollo);
let wrapper;
- let fakeApollo;
const getBaseToken = () => wrapper.findComponent(BaseToken);
@@ -58,9 +57,8 @@ describe('CrmContactToken', () => {
listeners = {},
queryHandler = searchGroupCrmContactsQueryHandler,
} = {}) => {
- fakeApollo = createMockApollo([[searchCrmContactsQuery, queryHandler]]);
-
wrapper = mount(CrmContactToken, {
+ apolloProvider: createMockApollo([[searchCrmContactsQuery, queryHandler]]),
propsData: {
config,
value,
@@ -75,14 +73,9 @@ describe('CrmContactToken', () => {
},
stubs,
listeners,
- apolloProvider: fakeApollo,
});
};
- afterEach(() => {
- fakeApollo = null;
- });
-
describe('methods', () => {
describe('fetchContacts', () => {
describe('for groups', () => {
@@ -160,9 +153,7 @@ describe('CrmContactToken', () => {
});
it('calls `createAlert` with alert error message when request fails', async () => {
- mountComponent();
-
- jest.spyOn(wrapper.vm.$apollo, 'query').mockRejectedValue({});
+ mountComponent({ queryHandler: jest.fn().mockRejectedValue({}) });
getBaseToken().vm.$emit('fetch-suggestions');
await waitForPromises();
@@ -173,12 +164,9 @@ describe('CrmContactToken', () => {
});
it('sets `loading` to false when request completes', async () => {
- mountComponent();
-
- jest.spyOn(wrapper.vm.$apollo, 'query').mockRejectedValue({});
+ mountComponent({ queryHandler: jest.fn().mockRejectedValue({}) });
getBaseToken().vm.$emit('fetch-suggestions');
-
await waitForPromises();
expect(getBaseToken().props('suggestionsLoading')).toBe(false);
@@ -195,13 +183,7 @@ describe('CrmContactToken', () => {
value: { data: '1' },
});
- const baseTokenEl = wrapper.findComponent(BaseToken);
-
- expect(baseTokenEl.exists()).toBe(true);
- expect(baseTokenEl.props()).toMatchObject({
- suggestions: mockCrmContacts,
- getActiveTokenValue: wrapper.vm.getActiveContact,
- });
+ expect(getBaseToken().props('suggestions')).toEqual(mockCrmContacts);
});
it.each(mockCrmContacts)('renders token item when value is selected', (contact) => {
@@ -270,12 +252,9 @@ describe('CrmContactToken', () => {
it('emits listeners in the base-token', () => {
const mockInput = jest.fn();
- mountComponent({
- listeners: {
- input: mockInput,
- },
- });
- wrapper.findComponent(BaseToken).vm.$emit('input', [{ data: 'mockData', operator: '=' }]);
+ mountComponent({ listeners: { input: mockInput } });
+
+ getBaseToken().vm.$emit('input', [{ data: 'mockData', operator: '=' }]);
expect(mockInput).toHaveBeenLastCalledWith([{ data: 'mockData', operator: '=' }]);
});
diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/crm_organization_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/crm_organization_token_spec.js
index 20369342220..17cf39e726c 100644
--- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/crm_organization_token_spec.js
+++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/crm_organization_token_spec.js
@@ -39,7 +39,6 @@ describe('CrmOrganizationToken', () => {
Vue.use(VueApollo);
let wrapper;
- let fakeApollo;
const getBaseToken = () => wrapper.findComponent(BaseToken);
@@ -58,8 +57,8 @@ describe('CrmOrganizationToken', () => {
listeners = {},
queryHandler = searchGroupCrmOrganizationsQueryHandler,
} = {}) => {
- fakeApollo = createMockApollo([[searchCrmOrganizationsQuery, queryHandler]]);
wrapper = mount(CrmOrganizationToken, {
+ apolloProvider: createMockApollo([[searchCrmOrganizationsQuery, queryHandler]]),
propsData: {
config,
value,
@@ -74,14 +73,9 @@ describe('CrmOrganizationToken', () => {
},
stubs,
listeners,
- apolloProvider: fakeApollo,
});
};
- afterEach(() => {
- fakeApollo = null;
- });
-
describe('methods', () => {
describe('fetchOrganizations', () => {
describe('for groups', () => {
@@ -159,9 +153,7 @@ describe('CrmOrganizationToken', () => {
});
it('calls `createAlert` when request fails', async () => {
- mountComponent();
-
- jest.spyOn(wrapper.vm.$apollo, 'query').mockRejectedValue({});
+ mountComponent({ queryHandler: jest.fn().mockRejectedValue({}) });
getBaseToken().vm.$emit('fetch-suggestions');
await waitForPromises();
@@ -172,9 +164,7 @@ describe('CrmOrganizationToken', () => {
});
it('sets `loading` to false when request completes', async () => {
- mountComponent();
-
- jest.spyOn(wrapper.vm.$apollo, 'query').mockRejectedValue({});
+ mountComponent({ queryHandler: jest.fn().mockRejectedValue({}) });
getBaseToken().vm.$emit('fetch-suggestions');
@@ -194,13 +184,7 @@ describe('CrmOrganizationToken', () => {
value: { data: '1' },
});
- const baseTokenEl = wrapper.findComponent(BaseToken);
-
- expect(baseTokenEl.exists()).toBe(true);
- expect(baseTokenEl.props()).toMatchObject({
- suggestions: mockCrmOrganizations,
- getActiveTokenValue: wrapper.vm.getActiveOrganization,
- });
+ expect(getBaseToken().props('suggestions')).toEqual(mockCrmOrganizations);
});
it.each(mockCrmOrganizations)('renders token item when value is selected', (organization) => {
@@ -269,12 +253,9 @@ describe('CrmOrganizationToken', () => {
it('emits listeners in the base-token', () => {
const mockInput = jest.fn();
- mountComponent({
- listeners: {
- input: mockInput,
- },
- });
- wrapper.findComponent(BaseToken).vm.$emit('input', [{ data: 'mockData', operator: '=' }]);
+ mountComponent({ listeners: { input: mockInput } });
+
+ getBaseToken().vm.$emit('input', [{ data: 'mockData', operator: '=' }]);
expect(mockInput).toHaveBeenLastCalledWith([{ data: 'mockData', operator: '=' }]);
});
diff --git a/spec/frontend/vue_shared/components/listbox_input/listbox_input_spec.js b/spec/frontend/vue_shared/components/listbox_input/listbox_input_spec.js
index 397fd270344..b782a2b19da 100644
--- a/spec/frontend/vue_shared/components/listbox_input/listbox_input_spec.js
+++ b/spec/frontend/vue_shared/components/listbox_input/listbox_input_spec.js
@@ -7,7 +7,7 @@ describe('ListboxInput', () => {
// Props
const label = 'label';
- const decription = 'decription';
+ const description = 'description';
const name = 'name';
const defaultToggleText = 'defaultToggleText';
const items = [
@@ -34,7 +34,7 @@ describe('ListboxInput', () => {
wrapper = shallowMount(ListboxInput, {
propsData: {
label,
- decription,
+ description,
name,
defaultToggleText,
items,
@@ -72,8 +72,8 @@ describe('ListboxInput', () => {
expect(findGlFormGroup().attributes('label')).toBe(label);
});
- it('passes the decription to the form group', () => {
- expect(findGlFormGroup().attributes('decription')).toBe(decription);
+ it('passes the description to the form group', () => {
+ expect(findGlFormGroup().attributes('description')).toBe(description);
});
it('sets the input name', () => {
@@ -89,6 +89,26 @@ describe('ListboxInput', () => {
});
});
+ describe('props', () => {
+ it.each([true, false])("passes %s to the listbox's fluidWidth prop", (fluidWidth) => {
+ createComponent({ fluidWidth });
+
+ expect(findGlListbox().props('fluidWidth')).toBe(fluidWidth);
+ });
+
+ it.each(['right', 'left'])("passes %s to the listbox's placement prop", (placement) => {
+ createComponent({ placement });
+
+ expect(findGlListbox().props('placement')).toBe(placement);
+ });
+
+ it.each([true, false])("passes %s to the listbox's block prop", (block) => {
+ createComponent({ block });
+
+ expect(findGlListbox().props('block')).toBe(block);
+ });
+ });
+
describe('toggle text', () => {
it('uses the default toggle text while no value is selected', () => {
createComponent();
diff --git a/spec/frontend/vue_shared/components/markdown/comment_templates_dropdown_spec.js b/spec/frontend/vue_shared/components/markdown/comment_templates_dropdown_spec.js
index aea25abb324..2bef6dd15df 100644
--- a/spec/frontend/vue_shared/components/markdown/comment_templates_dropdown_spec.js
+++ b/spec/frontend/vue_shared/components/markdown/comment_templates_dropdown_spec.js
@@ -4,13 +4,9 @@ import savedRepliesResponse from 'test_fixtures/graphql/comment_templates/saved_
import { mountExtended } from 'helpers/vue_test_utils_helper';
import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
-import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
-import { updateText } from '~/lib/utils/text_markdown';
import CommentTemplatesDropdown from '~/vue_shared/components/markdown/comment_templates_dropdown.vue';
import savedRepliesQuery from '~/vue_shared/components/markdown/saved_replies.query.graphql';
-jest.mock('~/lib/utils/text_markdown');
-
let wrapper;
let savedRepliesResp;
@@ -28,7 +24,6 @@ function createComponent(options = {}) {
const { mockApollo } = options;
return mountExtended(CommentTemplatesDropdown, {
- attachTo: '#root',
propsData: {
newCommentTemplatePath: '/new',
},
@@ -37,14 +32,6 @@ function createComponent(options = {}) {
}
describe('Comment templates dropdown', () => {
- beforeEach(() => {
- setHTMLFixture('<div class="md-area"><textarea></textarea><div id="root"></div></div>');
- });
-
- afterEach(() => {
- resetHTMLFixture();
- });
-
it('fetches data when dropdown gets opened', async () => {
const mockApollo = createMockApolloProvider(savedRepliesResponse);
wrapper = createComponent({ mockApollo });
@@ -56,7 +43,7 @@ describe('Comment templates dropdown', () => {
expect(savedRepliesResp).toHaveBeenCalled();
});
- it('adds content to textarea', async () => {
+ it('adds emits a select event on selecting a comment', async () => {
const mockApollo = createMockApolloProvider(savedRepliesResponse);
wrapper = createComponent({ mockApollo });
@@ -66,11 +53,6 @@ describe('Comment templates dropdown', () => {
wrapper.find('.gl-new-dropdown-item').trigger('click');
- expect(updateText).toHaveBeenCalledWith({
- textArea: document.querySelector('textarea'),
- tag: savedRepliesResponse.data.currentUser.savedReplies.nodes[0].content,
- cursorOffset: 0,
- wrap: false,
- });
+ expect(wrapper.emitted().select[0]).toEqual(['Saved Reply Content']);
});
});
diff --git a/spec/frontend/vue_shared/components/markdown/editor_mode_switcher_spec.js b/spec/frontend/vue_shared/components/markdown/editor_mode_switcher_spec.js
index 693353ed604..712e78458c6 100644
--- a/spec/frontend/vue_shared/components/markdown/editor_mode_switcher_spec.js
+++ b/spec/frontend/vue_shared/components/markdown/editor_mode_switcher_spec.js
@@ -1,25 +1,47 @@
-import { GlButton } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
+import { nextTick } from 'vue';
+import { GlButton, GlLink, GlPopover } from '@gitlab/ui';
+import { mount } from '@vue/test-utils';
import EditorModeSwitcher from '~/vue_shared/components/markdown/editor_mode_switcher.vue';
+import { counter } from '~/vue_shared/components/markdown/utils';
+import UserCalloutDismisser from '~/vue_shared/components/user_callout_dismisser.vue';
+import { stubComponent } from 'helpers/stub_component';
+import { useLocalStorageSpy } from 'helpers/local_storage_helper';
+
+jest.mock('~/vue_shared/components/markdown/utils', () => ({
+ counter: jest.fn().mockReturnValue(0),
+}));
describe('vue_shared/component/markdown/editor_mode_switcher', () => {
let wrapper;
+ useLocalStorageSpy();
- const createComponent = ({ value } = {}) => {
- wrapper = shallowMount(EditorModeSwitcher, {
+ const createComponent = ({
+ value,
+ userCalloutDismisserSlotProps = { dismiss: jest.fn() },
+ } = {}) => {
+ wrapper = mount(EditorModeSwitcher, {
propsData: {
value,
},
+ stubs: {
+ UserCalloutDismisser: stubComponent(UserCalloutDismisser, {
+ render() {
+ return this.$scopedSlots.default(userCalloutDismisserSlotProps);
+ },
+ }),
+ },
});
};
const findSwitcherButton = () => wrapper.findComponent(GlButton);
+ const findUserCalloutDismisser = () => wrapper.findComponent(UserCalloutDismisser);
+ const findCalloutPopover = () => wrapper.findComponent(GlPopover);
describe.each`
- modeText | value | buttonText
- ${'Rich text'} | ${'richText'} | ${'Switch to Markdown'}
- ${'Markdown'} | ${'markdown'} | ${'Switch to rich text'}
- `('when $modeText', ({ modeText, value, buttonText }) => {
+ value | buttonText
+ ${'richText'} | ${'Switch to plain text editing'}
+ ${'markdown'} | ${'Switch to rich text editing'}
+ `('when $value', ({ value, buttonText }) => {
beforeEach(() => {
createComponent({ value });
});
@@ -28,10 +50,66 @@ describe('vue_shared/component/markdown/editor_mode_switcher', () => {
expect(findSwitcherButton().text()).toEqual(buttonText);
});
- it('emits event on click', () => {
- findSwitcherButton(modeText).vm.$emit('click');
+ it('emits event on click', async () => {
+ await nextTick();
+ findSwitcherButton().vm.$emit('click');
+
+ expect(wrapper.emitted().switch).toEqual([[false]]);
+ });
+ });
+
+ describe('rich text editor callout', () => {
+ let dismiss;
+
+ beforeEach(() => {
+ dismiss = jest.fn();
+ createComponent({ value: 'markdown', userCalloutDismisserSlotProps: { dismiss } });
+ });
+
+ it('does not skip the user_callout_dismisser query', () => {
+ expect(findUserCalloutDismisser().props()).toMatchObject({
+ skipQuery: false,
+ featureName: 'rich_text_editor',
+ });
+ });
+
+ it('mounts new rich text editor popover', () => {
+ expect(findCalloutPopover().props()).toMatchObject({
+ showCloseButton: '',
+ triggers: 'manual',
+ target: 'switch-to-rich-text-editor',
+ });
+ });
+
+ it('dismisses the callout and emits "switch" event when popover close button is clicked', async () => {
+ await findCalloutPopover().findComponent(GlLink).vm.$emit('click');
+
+ expect(wrapper.emitted().switch).toEqual([[true]]);
+ expect(dismiss).toHaveBeenCalled();
+ });
+
+ it('dismisses the callout when action button is clicked', () => {
+ findSwitcherButton().vm.$emit('click');
+
+ expect(dismiss).toHaveBeenCalled();
+ });
+
+ it('does not show the callout if rich text is already enabled', async () => {
+ await wrapper.setProps({ value: 'richText' });
+
+ expect(findCalloutPopover().props()).toMatchObject({
+ show: false,
+ });
+ });
+
+ it('does not show the callout if already displayed once on the page', () => {
+ counter.mockReturnValue(1);
+
+ createComponent({ value: 'markdown' });
- expect(wrapper.emitted().input).toEqual([[]]);
+ expect(findCalloutPopover().props()).toMatchObject({
+ show: false,
+ });
});
});
});
diff --git a/spec/frontend/vue_shared/components/markdown/field_spec.js b/spec/frontend/vue_shared/components/markdown/field_spec.js
index b29f0d58d77..4ade8f28fd0 100644
--- a/spec/frontend/vue_shared/components/markdown/field_spec.js
+++ b/spec/frontend/vue_shared/components/markdown/field_spec.js
@@ -65,6 +65,16 @@ describe('Markdown field component', () => {
enablePreview,
restrictedToolBarItems,
showContentEditorSwitcher,
+ supportsQuickActions: true,
+ },
+ mocks: {
+ $apollo: {
+ queries: {
+ currentUser: {
+ loading: false,
+ },
+ },
+ },
},
},
);
@@ -206,12 +216,12 @@ describe('Markdown field component', () => {
expect(findMarkdownToolbar().props()).toEqual({
canAttachFile: true,
markdownDocsPath,
- quickActionsDocsPath: '',
showCommentToolBar: true,
+ showContentEditorSwitcher: false,
});
expect(findMarkdownHeader().props()).toMatchObject({
- showContentEditorSwitcher: false,
+ supportsQuickActions: true,
});
});
});
@@ -368,13 +378,13 @@ describe('Markdown field component', () => {
it('defaults to false', () => {
createSubject();
- expect(findMarkdownHeader().props('showContentEditorSwitcher')).toBe(false);
+ expect(findMarkdownToolbar().props('showContentEditorSwitcher')).toBe(false);
});
it('passes showContentEditorSwitcher', () => {
createSubject({ showContentEditorSwitcher: true });
- expect(findMarkdownHeader().props('showContentEditorSwitcher')).toBe(true);
+ expect(findMarkdownToolbar().props('showContentEditorSwitcher')).toBe(true);
});
});
});
diff --git a/spec/frontend/vue_shared/components/markdown/header_spec.js b/spec/frontend/vue_shared/components/markdown/header_spec.js
index 48fe5452e74..eb728879fb7 100644
--- a/spec/frontend/vue_shared/components/markdown/header_spec.js
+++ b/spec/frontend/vue_shared/components/markdown/header_spec.js
@@ -1,22 +1,28 @@
import $ from 'jquery';
import { nextTick } from 'vue';
-import { GlToggle } from '@gitlab/ui';
+import { GlToggle, GlButton } from '@gitlab/ui';
import HeaderComponent from '~/vue_shared/components/markdown/header.vue';
+import CommentTemplatesDropdown from '~/vue_shared/components/markdown/comment_templates_dropdown.vue';
import ToolbarButton from '~/vue_shared/components/markdown/toolbar_button.vue';
import DrawioToolbarButton from '~/vue_shared/components/markdown/drawio_toolbar_button.vue';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
-import EditorModeSwitcher from '~/vue_shared/components/markdown/editor_mode_switcher.vue';
+import { updateText } from '~/lib/utils/text_markdown';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
+
+jest.mock('~/lib/utils/text_markdown');
describe('Markdown field header component', () => {
let wrapper;
- const createWrapper = (props) => {
+ const createWrapper = ({ props = {}, provide = {}, attachTo = document.body } = {}) => {
wrapper = shallowMountExtended(HeaderComponent, {
+ attachTo,
propsData: {
previewMarkdown: false,
...props,
},
stubs: { GlToggle },
+ provide,
});
};
@@ -28,6 +34,7 @@ describe('Markdown field header component', () => {
.filter((button) => button.props(prop) === value)
.at(0);
const findDrawioToolbarButton = () => wrapper.findComponent(DrawioToolbarButton);
+ const findCommentTemplatesDropdown = () => wrapper.findComponent(CommentTemplatesDropdown);
beforeEach(() => {
window.gl = {
@@ -65,6 +72,39 @@ describe('Markdown field header component', () => {
});
});
+ it('renders correct title on non MacOS systems', () => {
+ window.gl = {
+ client: {
+ isMac: false,
+ },
+ };
+
+ createWrapper();
+
+ const buttons = [
+ 'Insert suggestion',
+ 'Add bold text (Ctrl+B)',
+ 'Add italic text (Ctrl+I)',
+ 'Add strikethrough text (Ctrl+Shift+X)',
+ 'Insert a quote',
+ 'Insert code',
+ 'Add a link (Ctrl+K)',
+ 'Add a bullet list',
+ 'Add a numbered list',
+ 'Add a checklist',
+ 'Indent line (Ctrl+])',
+ 'Outdent line (Ctrl+[)',
+ 'Add a collapsible section',
+ 'Add a table',
+ 'Go full screen',
+ ];
+ const elements = findToolbarButtons();
+
+ elements.wrappers.forEach((buttonEl, index) => {
+ expect(buttonEl.props('buttonTitle')).toBe(buttons[index]);
+ });
+ });
+
it('renders "Attach a file or image" button using gl-button', () => {
const button = wrapper.findByTestId('button-attach-file');
@@ -92,15 +132,16 @@ describe('Markdown field header component', () => {
});
it('shows markdown preview when previewMarkdown is true', () => {
- createWrapper({ previewMarkdown: true });
+ createWrapper({ props: { previewMarkdown: true } });
expect(findPreviewToggle().text()).toBe('Continue editing');
});
it('hides toolbar in preview mode', () => {
- createWrapper({ previewMarkdown: true });
+ createWrapper({ props: { previewMarkdown: true } });
- expect(findToolbar().classes().includes('gl-display-none!')).toBe(true);
+ // only one button is rendered in preview mode
+ expect(findToolbar().findAllComponents(GlButton)).toHaveLength(1);
});
it('emits toggle markdown event when clicking preview toggle', async () => {
@@ -150,7 +191,9 @@ describe('Markdown field header component', () => {
it('does not render suggestion button if `canSuggest` is set to false', () => {
createWrapper({
- canSuggest: false,
+ props: {
+ canSuggest: false,
+ },
});
expect(wrapper.find('.js-suggestion-btn').exists()).toBe(false);
@@ -158,7 +201,9 @@ describe('Markdown field header component', () => {
it('hides markdown preview when previewMarkdown property is false', () => {
createWrapper({
- enablePreview: false,
+ props: {
+ enablePreview: false,
+ },
});
expect(wrapper.findByTestId('preview-toggle').exists()).toBe(false);
@@ -173,7 +218,9 @@ describe('Markdown field header component', () => {
it('restricts items as per input', () => {
createWrapper({
- restrictedToolBarItems: ['quote'],
+ props: {
+ restrictedToolBarItems: ['quote'],
+ },
});
expect(findToolbarButtons().length).toBe(defaultCount - 1);
@@ -192,9 +239,11 @@ describe('Markdown field header component', () => {
beforeEach(() => {
createWrapper({
- drawioEnabled: true,
- uploadsPath,
- markdownPreviewPath,
+ props: {
+ drawioEnabled: true,
+ uploadsPath,
+ markdownPreviewPath,
+ },
});
});
@@ -206,17 +255,46 @@ describe('Markdown field header component', () => {
});
});
- describe('with content editor switcher', () => {
+ describe('when selecting a saved reply from the comment templates dropdown', () => {
beforeEach(() => {
+ setHTMLFixture('<div class="md-area"><textarea></textarea><div id="root"></div></div>');
+ });
+
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
+ it('updates the textarea with the saved comment', async () => {
createWrapper({
- showContentEditorSwitcher: true,
+ attachTo: '#root',
+ provide: {
+ newCommentTemplatePath: 'some/path',
+ glFeatures: {
+ savedReplies: true,
+ },
+ },
+ });
+
+ await findCommentTemplatesDropdown().vm.$emit('select', 'Some saved comment');
+
+ expect(updateText).toHaveBeenCalledWith({
+ textArea: document.querySelector('textarea'),
+ tag: 'Some saved comment',
+ cursorOffset: 0,
+ wrap: false,
});
});
- it('re-emits event from switcher', () => {
- wrapper.findComponent(EditorModeSwitcher).vm.$emit('input', 'richText');
+ it('does not show the saved replies button if newCommentTemplatePath is not defined', () => {
+ createWrapper({
+ provide: {
+ glFeatures: {
+ savedReplies: true,
+ },
+ },
+ });
- expect(wrapper.emitted('enableContentEditor')).toEqual([[]]);
+ expect(findCommentTemplatesDropdown().exists()).toBe(false);
});
});
});
diff --git a/spec/frontend/vue_shared/components/markdown/markdown_editor_spec.js b/spec/frontend/vue_shared/components/markdown/markdown_editor_spec.js
index e54e261b8e4..31c0fa6f699 100644
--- a/spec/frontend/vue_shared/components/markdown/markdown_editor_spec.js
+++ b/spec/frontend/vue_shared/components/markdown/markdown_editor_spec.js
@@ -21,6 +21,7 @@ import waitForPromises from 'helpers/wait_for_promises';
jest.mock('~/emoji');
jest.mock('autosize');
+jest.mock('~/lib/graphql');
describe('vue_shared/component/markdown/markdown_editor', () => {
useLocalStorageSpy();
@@ -29,7 +30,6 @@ describe('vue_shared/component/markdown/markdown_editor', () => {
const value = 'test markdown';
const renderMarkdownPath = '/api/markdown';
const markdownDocsPath = '/help/markdown';
- const quickActionsDocsPath = '/help/quickactions';
const enableAutocomplete = true;
const enablePreview = false;
const formFieldId = 'markdown_field';
@@ -43,7 +43,6 @@ describe('vue_shared/component/markdown/markdown_editor', () => {
value,
renderMarkdownPath,
markdownDocsPath,
- quickActionsDocsPath,
enableAutocomplete,
autocompleteDataSources,
enablePreview,
@@ -65,6 +64,15 @@ describe('vue_shared/component/markdown/markdown_editor', () => {
BubbleMenu: stubComponent(BubbleMenu),
...stubs,
},
+ mocks: {
+ $apollo: {
+ queries: {
+ currentUser: {
+ loading: false,
+ },
+ },
+ },
+ },
});
};
@@ -110,7 +118,7 @@ describe('vue_shared/component/markdown/markdown_editor', () => {
expect(findMarkdownField().props()).toMatchObject({
autocompleteDataSources,
markdownPreviewPath: renderMarkdownPath,
- quickActionsDocsPath,
+ supportsQuickActions: true,
canAttachFile: true,
enableAutocomplete,
textareaValue: value,
@@ -120,7 +128,7 @@ describe('vue_shared/component/markdown/markdown_editor', () => {
});
});
- // quarantine flaky spec:https://gitlab.com/gitlab-org/gitlab/-/issues/412618
+ // quarantine: https://gitlab.com/gitlab-org/gitlab/-/issues/412618
// eslint-disable-next-line jest/no-disabled-tests
it.skip('passes render_quick_actions param to renderMarkdownPath if quick actions are enabled', async () => {
buildWrapper({ propsData: { supportsQuickActions: true } });
@@ -131,7 +139,7 @@ describe('vue_shared/component/markdown/markdown_editor', () => {
expect(mock.history.post[0].url).toContain(`render_quick_actions=true`);
});
- // quarantine flaky spec: https://gitlab.com/gitlab-org/gitlab/-/issues/411565
+ // quarantine: https://gitlab.com/gitlab-org/gitlab/-/issues/411565
// eslint-disable-next-line jest/no-disabled-tests
it.skip('does not pass render_quick_actions param to renderMarkdownPath if quick actions are disabled', async () => {
buildWrapper({ propsData: { supportsQuickActions: false } });
@@ -145,27 +153,31 @@ describe('vue_shared/component/markdown/markdown_editor', () => {
it('enables content editor switcher when contentEditorEnabled prop is true', () => {
buildWrapper({ propsData: { enableContentEditor: true } });
- expect(findMarkdownField().text()).toContain('Switch to rich text');
+ expect(findMarkdownField().text()).toContain('Switch to rich text editing');
});
it('hides content editor switcher when contentEditorEnabled prop is false', () => {
buildWrapper({ propsData: { enableContentEditor: false } });
- expect(findMarkdownField().text()).not.toContain('Switch to rich text');
+ expect(findMarkdownField().text()).not.toContain('Switch to rich text editing');
});
it('passes down any additional props to markdown field component', () => {
- const propsData = {
+ const codeSuggestionsConfig = {
line: { text: 'hello world', richText: 'hello world' },
lines: [{ text: 'hello world', richText: 'hello world' }],
canSuggest: true,
};
buildWrapper({
- propsData: { ...propsData, myCustomProp: 'myCustomValue', 'data-testid': 'custom id' },
+ propsData: {
+ codeSuggestionsConfig,
+ myCustomProp: 'myCustomValue',
+ 'data-testid': 'custom id',
+ },
});
- expect(findMarkdownField().props()).toMatchObject(propsData);
+ expect(findMarkdownField().props()).toMatchObject(codeSuggestionsConfig);
expect(findMarkdownField().vm.$attrs).toMatchObject({
myCustomProp: 'myCustomValue',
@@ -201,7 +213,7 @@ describe('vue_shared/component/markdown/markdown_editor', () => {
expect(findMarkdownField().find('textarea').attributes('disabled')).toBe(undefined);
});
- // quarantine flaky spec: https://gitlab.com/gitlab-org/gitlab/-/issues/404734
+ // quarantine: https://gitlab.com/gitlab-org/gitlab/-/issues/404734
// eslint-disable-next-line jest/no-disabled-tests
it.skip('disables content editor when disabled prop is true', async () => {
buildWrapper({ propsData: { disabled: true } });
@@ -436,8 +448,6 @@ describe('vue_shared/component/markdown/markdown_editor', () => {
describe('when contentEditor is disabled', () => {
it('resets the editingMode to markdownField', () => {
- localStorage.setItem('gl-markdown-editor-mode', 'contentEditor');
-
buildWrapper({ propsData: { autosaveKey: 'issue/1234', enableContentEditor: false } });
expect(wrapper.vm.editingMode).toBe(EDITING_MODE_MARKDOWN_FIELD);
diff --git a/spec/frontend/vue_shared/components/markdown/non_gfm_markdown_spec.js b/spec/frontend/vue_shared/components/markdown/non_gfm_markdown_spec.js
new file mode 100644
index 00000000000..cd73ef6892a
--- /dev/null
+++ b/spec/frontend/vue_shared/components/markdown/non_gfm_markdown_spec.js
@@ -0,0 +1,157 @@
+import { nextTick } from 'vue';
+import Markdown from '~/vue_shared/components/markdown/non_gfm_markdown.vue';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import CodeBlockHighlighted from '~/vue_shared/components/code_block_highlighted.vue';
+import ModalCopyButton from '~/vue_shared/components/modal_copy_button.vue';
+
+describe('NonGitlabMarkdown', () => {
+ let wrapper;
+
+ const createComponent = ({ propsData = {} } = {}) => {
+ wrapper = shallowMountExtended(Markdown, {
+ propsData,
+ });
+ };
+
+ const codeBlockContent = 'stages:\n - build\n - test\n - deploy\n';
+ const codeBlockLanguage = 'yaml';
+ const nonCodeContent =
+ "Certainly! Here's an updated GitLab CI/CD configuration in YAML format that includes Kubernetes deployment:";
+ const testMarkdownWithCodeBlock = `${nonCodeContent}\n\n\`\`\`${codeBlockLanguage}\n${codeBlockContent}\n\`\`\`\n\nIn this updated configuration, we have added a \`deploy\` job that deploys the Python app to a Kubernetes cluster. The \`script\` section of the job includes commands to authenticate with GCP, set the project and zone, configure kubectl to use the GKE cluster, and deploy the application using a deployment.yaml file.\n\nNote that you will need to modify this configuration to fit your specific deployment needs, including replacing the placeholders (\`<PROJECT_ID>\`, \`<COMPUTE_ZONE>\`, \`<CLUSTER_NAME>\`, and \`<COMPUTE_REGION>\`) with your GCP and Kubernetes deployment information, and creating the deployment.yaml file with your Kubernetes deployment configuration.`;
+ const codeOnlyMarkdown = `\`\`\`${codeBlockLanguage}\n${codeBlockContent}\n\`\`\``;
+ const markdownWithMultipleCodeSnippets = `${testMarkdownWithCodeBlock}\n${testMarkdownWithCodeBlock}`;
+ const codeBlockNoLanguage = `
+ \`\`\`
+ const foo = 'bar';
+ \`\`\`
+ `;
+
+ const findCodeBlock = () => wrapper.findComponent(CodeBlockHighlighted);
+ const findCopyCodeButton = () => wrapper.findComponent(ModalCopyButton);
+ const findCodeBlockWrapper = () => wrapper.findByTestId('code-block-wrapper');
+ const findMarkdownBlock = () => wrapper.findByTestId('non-code-markdown');
+
+ describe('rendering markdown without code snippet', () => {
+ beforeEach(() => {
+ createComponent({ propsData: { markdown: nonCodeContent } });
+ });
+ it('should render non-code content', () => {
+ const markdownBlock = findMarkdownBlock();
+ expect(markdownBlock.exists()).toBe(true);
+ expect(markdownBlock.text()).toBe(nonCodeContent);
+ });
+ it('should not render code block', () => {
+ const codeBlock = findCodeBlock();
+ expect(codeBlock.exists()).toBe(false);
+ });
+ });
+
+ describe('rendering code snippet without other markdown', () => {
+ beforeEach(() => {
+ createComponent({ propsData: { markdown: codeOnlyMarkdown } });
+ });
+ it('should not render non-code content', () => {
+ const markdownBlock = findMarkdownBlock();
+ expect(markdownBlock.exists()).toBe(false);
+ });
+ it('should render code block', () => {
+ const codeBlock = findCodeBlock();
+ expect(codeBlock.exists()).toBe(true);
+ });
+ });
+
+ describe('rendering code snippet with no language specified', () => {
+ beforeEach(() => {
+ createComponent({ propsData: { markdown: codeBlockNoLanguage } });
+ });
+
+ it('should render code block', () => {
+ const codeBlock = findCodeBlock();
+ expect(codeBlock.exists()).toBe(true);
+ expect(codeBlock.props('language')).toBe('text');
+ });
+ });
+
+ describe.each`
+ markdown | codeBlocksCount | markdownBlocksCount
+ ${testMarkdownWithCodeBlock} | ${1} | ${2}
+ ${markdownWithMultipleCodeSnippets} | ${2} | ${3}
+ ${codeOnlyMarkdown} | ${1} | ${0}
+ ${nonCodeContent} | ${0} | ${1}
+ `(
+ 'extracting tokens in markdownBlocks computed',
+ ({ markdown, codeBlocksCount, markdownBlocksCount }) => {
+ beforeEach(() => {
+ createComponent({ propsData: { markdown } });
+ });
+
+ it('should create correct number of tokens', () => {
+ const findAllCodeBlocks = () => wrapper.findAllByTestId('code-block-wrapper');
+ const findAllMarkdownBlocks = () => wrapper.findAllByTestId('non-code-markdown');
+
+ expect(findAllCodeBlocks()).toHaveLength(codeBlocksCount);
+ expect(findAllMarkdownBlocks()).toHaveLength(markdownBlocksCount);
+ });
+ },
+ );
+
+ describe('rendering markdown with multiple code snippets', () => {
+ beforeEach(() => {
+ createComponent({ propsData: { markdown: markdownWithMultipleCodeSnippets } });
+ });
+
+ it('should render code block with correct props', () => {
+ const codeBlock = findCodeBlock();
+ expect(codeBlock.exists()).toBe(true);
+ expect(codeBlock.props()).toEqual(
+ expect.objectContaining({
+ language: codeBlockLanguage,
+ code: codeBlockContent,
+ }),
+ );
+ expect(wrapper.findAllComponents(CodeBlockHighlighted)).toHaveLength(2);
+ });
+
+ it('should not show copy code button', () => {
+ const copyCodeButton = findCopyCodeButton();
+ expect(copyCodeButton.exists()).toBe(false);
+ });
+
+ it('should render non-code content', () => {
+ const markdownBlock = findMarkdownBlock();
+ expect(markdownBlock.exists()).toBe(true);
+ expect(markdownBlock.text()).toContain(nonCodeContent);
+ });
+
+ describe('copy code button', () => {
+ beforeEach(() => {
+ const codeBlock = findCodeBlockWrapper();
+ codeBlock.trigger('mouseenter');
+ });
+
+ it('should render only one copy button per code block', () => {
+ const copyCodeButtons = wrapper.findAllComponents(ModalCopyButton);
+ expect(copyCodeButtons).toHaveLength(1);
+ });
+
+ it('should render code block button with correct props', () => {
+ const copyCodeButton = findCopyCodeButton();
+ expect(copyCodeButton.exists()).toBe(true);
+ expect(copyCodeButton.props()).toEqual(
+ expect.objectContaining({
+ text: codeBlockContent,
+ title: 'Copy code',
+ }),
+ );
+ });
+
+ it('should hide code block button on mouseleave', async () => {
+ const codeBlock = findCodeBlockWrapper();
+ codeBlock.trigger('mouseleave');
+ await nextTick();
+ const copyCodeButton = findCopyCodeButton();
+ expect(copyCodeButton.exists()).toBe(false);
+ });
+ });
+ });
+});
diff --git a/spec/frontend/vue_shared/components/markdown/toolbar_spec.js b/spec/frontend/vue_shared/components/markdown/toolbar_spec.js
index 2489421b697..5bf11ff2b26 100644
--- a/spec/frontend/vue_shared/components/markdown/toolbar_spec.js
+++ b/spec/frontend/vue_shared/components/markdown/toolbar_spec.js
@@ -1,18 +1,33 @@
import { mount } from '@vue/test-utils';
import Toolbar from '~/vue_shared/components/markdown/toolbar.vue';
+import EditorModeSwitcher from '~/vue_shared/components/markdown/editor_mode_switcher.vue';
+import { updateText } from '~/lib/utils/text_markdown';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
+
+jest.mock('~/lib/utils/text_markdown');
describe('toolbar', () => {
let wrapper;
- const createMountedWrapper = (props = {}) => {
+ const createWrapper = (props = {}, attachTo = document.body) => {
wrapper = mount(Toolbar, {
+ attachTo,
propsData: { markdownDocsPath: '', ...props },
+ mocks: {
+ $apollo: {
+ queries: {
+ currentUser: {
+ loading: false,
+ },
+ },
+ },
+ },
});
};
describe('user can attach file', () => {
beforeEach(() => {
- createMountedWrapper();
+ createWrapper();
});
it('should render uploading-container', () => {
@@ -22,7 +37,7 @@ describe('toolbar', () => {
describe('user cannot attach file', () => {
beforeEach(() => {
- createMountedWrapper({ canAttachFile: false });
+ createWrapper({ canAttachFile: false });
});
it('should not render uploading-container', () => {
@@ -32,15 +47,63 @@ describe('toolbar', () => {
describe('comment tool bar settings', () => {
it('does not show comment tool bar div', () => {
- createMountedWrapper({ showCommentToolBar: false });
+ createWrapper({ showCommentToolBar: false });
expect(wrapper.find('.comment-toolbar').exists()).toBe(false);
});
it('shows comment tool bar by default', () => {
- createMountedWrapper();
+ createWrapper();
expect(wrapper.find('.comment-toolbar').exists()).toBe(true);
});
});
+
+ describe('with content editor switcher', () => {
+ beforeEach(() => {
+ setHTMLFixture(
+ '<div class="md-area"><textarea>some value</textarea><div id="root"></div></div>',
+ );
+ createWrapper(
+ {
+ showContentEditorSwitcher: true,
+ },
+ '#root',
+ );
+ });
+
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
+ it('re-emits event from switcher', () => {
+ wrapper.findComponent(EditorModeSwitcher).vm.$emit('switch');
+
+ expect(wrapper.emitted('enableContentEditor')).toEqual([[]]);
+ expect(updateText).not.toHaveBeenCalled();
+ });
+
+ it('does not insert a template text if textarea has some value', () => {
+ wrapper.findComponent(EditorModeSwitcher).vm.$emit('switch', true);
+
+ expect(updateText).not.toHaveBeenCalled();
+ });
+
+ it('inserts a "getting started with rich text" template when switched for the first time', () => {
+ document.querySelector('textarea').value = '';
+
+ wrapper.findComponent(EditorModeSwitcher).vm.$emit('switch', true);
+
+ expect(updateText).toHaveBeenCalledWith(
+ expect.objectContaining({
+ tag: `### Rich text editor
+
+Try out **styling** _your_ content right here or read the [direction](https://about.gitlab.com/direction/plan/knowledge/content_editor/).`,
+ textArea: document.querySelector('textarea'),
+ cursorOffset: 0,
+ wrap: false,
+ }),
+ );
+ });
+ });
});
diff --git a/spec/frontend/vue_shared/components/new_resource_dropdown/new_resource_dropdown_spec.js b/spec/frontend/vue_shared/components/new_resource_dropdown/new_resource_dropdown_spec.js
index a116233a065..f04e1976a5f 100644
--- a/spec/frontend/vue_shared/components/new_resource_dropdown/new_resource_dropdown_spec.js
+++ b/spec/frontend/vue_shared/components/new_resource_dropdown/new_resource_dropdown_spec.js
@@ -38,7 +38,6 @@ describe('NewResourceDropdown component', () => {
};
const mountComponent = ({
- search = '',
query = searchUserProjectsWithIssuesEnabledQuery,
queryResponse = searchProjectsQueryResponse,
mountFn = shallowMount,
@@ -47,16 +46,14 @@ describe('NewResourceDropdown component', () => {
const requestHandlers = [[query, jest.fn().mockResolvedValue(queryResponse)]];
const apolloProvider = createMockApollo(requestHandlers);
- return mountFn(NewResourceDropdown, {
+ wrapper = mountFn(NewResourceDropdown, {
apolloProvider,
propsData,
- data() {
- return { search };
- },
});
};
const findDropdown = () => wrapper.findComponent(GlDropdown);
+ const findGlDropdownItem = () => wrapper.findComponent(GlDropdownItem);
const findInput = () => wrapper.findComponent(GlSearchBoxByType);
const showDropdown = async () => {
findDropdown().vm.$emit('shown');
@@ -70,13 +67,13 @@ describe('NewResourceDropdown component', () => {
});
it('renders a split dropdown', () => {
- wrapper = mountComponent();
+ mountComponent();
expect(findDropdown().props('split')).toBe(true);
});
it('renders a label for the dropdown toggle button', () => {
- wrapper = mountComponent();
+ mountComponent();
expect(findDropdown().attributes('toggle-text')).toBe(
NewResourceDropdown.i18n.toggleButtonLabel,
@@ -84,7 +81,7 @@ describe('NewResourceDropdown component', () => {
});
it('focuses on input when dropdown is shown', async () => {
- wrapper = mountComponent({ mountFn: mount });
+ mountComponent({ mountFn: mount });
const inputSpy = jest.spyOn(findInput().vm, 'focusInput');
@@ -99,7 +96,7 @@ describe('NewResourceDropdown component', () => {
${'within a group'} | ${withinGroupProps} | ${searchProjectsWithinGroupQuery} | ${searchProjectsWithinGroupQueryResponse} | ${emptySearchProjectsWithinGroupQueryResponse}
`('$description', ({ propsData, query, queryResponse, emptyResponse }) => {
it('renders projects options', async () => {
- wrapper = mountComponent({ mountFn: mount, query, queryResponse, propsData });
+ mountComponent({ mountFn: mount, query, queryResponse, propsData });
await showDropdown();
const listItems = wrapper.findAll('li');
@@ -110,14 +107,14 @@ describe('NewResourceDropdown component', () => {
});
it('renders `No matches found` when there are no matches', async () => {
- wrapper = mountComponent({
- search: 'no matches',
+ mountComponent({
query,
queryResponse: emptyResponse,
mountFn: mount,
propsData,
});
+ await findInput().vm.$emit('input', 'no matches');
await showDropdown();
expect(wrapper.find('li').text()).toBe(NewResourceDropdown.i18n.noMatchesFound);
@@ -133,7 +130,7 @@ describe('NewResourceDropdown component', () => {
({ resourceType, expectedDefaultLabel, expectedPath, expectedLabel }) => {
describe('when no project is selected', () => {
beforeEach(() => {
- wrapper = mountComponent({
+ mountComponent({
query,
queryResponse,
propsData: { ...propsData, resourceType },
@@ -151,7 +148,7 @@ describe('NewResourceDropdown component', () => {
describe('when a project is selected', () => {
beforeEach(async () => {
- wrapper = mountComponent({
+ mountComponent({
mountFn: mount,
query,
queryResponse,
@@ -159,7 +156,7 @@ describe('NewResourceDropdown component', () => {
});
await showDropdown();
- wrapper.findComponent(GlDropdownItem).vm.$emit('click', project1);
+ findGlDropdownItem().vm.$emit('click', project1);
});
it('dropdown button is a link', () => {
@@ -178,12 +175,12 @@ describe('NewResourceDropdown component', () => {
describe('without localStorage', () => {
beforeEach(() => {
- wrapper = mountComponent({ mountFn: mount });
+ mountComponent({ mountFn: mount });
});
it('does not attempt to save the selected project to the localStorage', async () => {
await showDropdown();
- wrapper.findComponent(GlDropdownItem).vm.$emit('click', project1);
+ findGlDropdownItem().vm.$emit('click', project1);
expect(localStorage.setItem).not.toHaveBeenCalled();
});
@@ -198,7 +195,7 @@ describe('NewResourceDropdown component', () => {
name: project1.name,
}),
);
- wrapper = mountComponent({ mountFn: mount, propsData: { withLocalStorage: true } });
+ mountComponent({ mountFn: mount, propsData: { withLocalStorage: true } });
await nextTick();
const dropdown = findDropdown();
@@ -216,7 +213,7 @@ describe('NewResourceDropdown component', () => {
name: project1.name,
}),
);
- wrapper = mountComponent({ mountFn: mount, propsData: { withLocalStorage: true } });
+ mountComponent({ mountFn: mount, propsData: { withLocalStorage: true } });
await nextTick();
const dropdown = findDropdown();
@@ -228,12 +225,12 @@ describe('NewResourceDropdown component', () => {
describe.each(RESOURCE_TYPES)('with resource type %s', (resourceType) => {
it('computes the local storage key without a group', async () => {
- wrapper = mountComponent({
+ mountComponent({
mountFn: mount,
propsData: { resourceType, withLocalStorage: true },
});
await showDropdown();
- wrapper.findComponent(GlDropdownItem).vm.$emit('click', project1);
+ findGlDropdownItem().vm.$emit('click', project1);
await nextTick();
expect(localStorage.setItem).toHaveBeenLastCalledWith(
@@ -244,12 +241,12 @@ describe('NewResourceDropdown component', () => {
it('computes the local storage key with a group', async () => {
const groupId = '22';
- wrapper = mountComponent({
+ mountComponent({
mountFn: mount,
propsData: { groupId, resourceType, withLocalStorage: true },
});
await showDropdown();
- wrapper.findComponent(GlDropdownItem).vm.$emit('click', project1);
+ findGlDropdownItem().vm.$emit('click', project1);
await nextTick();
expect(localStorage.setItem).toHaveBeenLastCalledWith(
diff --git a/spec/frontend/vue_shared/components/paginated_table_with_search_and_tabs/paginated_table_with_search_and_tabs_spec.js b/spec/frontend/vue_shared/components/paginated_table_with_search_and_tabs/paginated_table_with_search_and_tabs_spec.js
index a27877e7ba8..e5b641c61fd 100644
--- a/spec/frontend/vue_shared/components/paginated_table_with_search_and_tabs/paginated_table_with_search_and_tabs_spec.js
+++ b/spec/frontend/vue_shared/components/paginated_table_with_search_and_tabs/paginated_table_with_search_and_tabs_spec.js
@@ -300,6 +300,7 @@ describe('AlertManagementEmptyState', () => {
unique: true,
symbol: '@',
token: UserToken,
+ dataType: 'user',
operators: OPERATORS_IS,
fetchPath: '/link',
fetchUsers: expect.any(Function),
@@ -311,6 +312,7 @@ describe('AlertManagementEmptyState', () => {
unique: true,
symbol: '@',
token: UserToken,
+ dataType: 'user',
operators: OPERATORS_IS,
fetchPath: '/link',
fetchUsers: expect.any(Function),
diff --git a/spec/frontend/vue_shared/components/projects_list/projects_list_item_spec.js b/spec/frontend/vue_shared/components/projects_list/projects_list_item_spec.js
index 3e4d5c558f6..0e387d1c139 100644
--- a/spec/frontend/vue_shared/components/projects_list/projects_list_item_spec.js
+++ b/spec/frontend/vue_shared/components/projects_list/projects_list_item_spec.js
@@ -38,6 +38,7 @@ describe('ProjectsListItem', () => {
const findProjectTopics = () => wrapper.findByTestId('project-topics');
const findPopover = () => findProjectTopics().findComponent(GlPopover);
const findProjectDescription = () => wrapper.findByTestId('project-description');
+ const findVisibilityIcon = () => findAvatarLabeled().findComponent(GlIcon);
it('renders project avatar', () => {
createComponent();
@@ -48,11 +49,11 @@ describe('ProjectsListItem', () => {
label: project.name,
labelLink: project.webUrl,
});
+
expect(avatarLabeled.attributes()).toMatchObject({
'entity-id': project.id.toString(),
'entity-name': project.name,
shape: 'rect',
- size: '48',
});
});
@@ -66,6 +67,19 @@ describe('ProjectsListItem', () => {
expect(tooltip.value).toBe(PROJECT_VISIBILITY_TYPE[VISIBILITY_LEVEL_PRIVATE_STRING]);
});
+ describe('when visibility is not provided', () => {
+ it('does not render visibility icon', () => {
+ const { visibility, ...projectWithoutVisibility } = project;
+ createComponent({
+ propsData: {
+ project: projectWithoutVisibility,
+ },
+ });
+
+ expect(findVisibilityIcon().exists()).toBe(false);
+ });
+ });
+
it('renders access role badge', () => {
createComponent();
@@ -113,6 +127,19 @@ describe('ProjectsListItem', () => {
expect(wrapper.findComponent(TimeAgoTooltip).props('time')).toBe(project.updatedAt);
});
+ describe('when updated at is not available', () => {
+ it('does not render updated at', () => {
+ const { updatedAt, ...projectWithoutUpdatedAt } = project;
+ createComponent({
+ propsData: {
+ project: projectWithoutUpdatedAt,
+ },
+ });
+
+ expect(wrapper.findComponent(TimeAgoTooltip).exists()).toBe(false);
+ });
+ });
+
describe('when issues are enabled', () => {
it('renders issues count', () => {
createComponent();
@@ -263,4 +290,20 @@ describe('ProjectsListItem', () => {
expect(findProjectDescription().exists()).toBe(false);
});
});
+
+ describe('when `showProjectIcon` prop is `true`', () => {
+ it('shows project icon', () => {
+ createComponent({ propsData: { showProjectIcon: true } });
+
+ expect(wrapper.findByTestId('project-icon').exists()).toBe(true);
+ });
+ });
+
+ describe('when `showProjectIcon` prop is `false`', () => {
+ it('does not show project icon', () => {
+ createComponent();
+
+ expect(wrapper.findByTestId('project-icon').exists()).toBe(false);
+ });
+ });
});
diff --git a/spec/frontend/vue_shared/components/projects_list/projects_list_spec.js b/spec/frontend/vue_shared/components/projects_list/projects_list_spec.js
index 9380e19c39e..a0adbb89894 100644
--- a/spec/frontend/vue_shared/components/projects_list/projects_list_spec.js
+++ b/spec/frontend/vue_shared/components/projects_list/projects_list_spec.js
@@ -28,6 +28,7 @@ describe('ProjectsList', () => {
expect(expectedProps).toEqual(
defaultPropsData.projects.map((project) => ({
project,
+ showProjectIcon: false,
})),
);
});
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 298fa163d59..4a230f72f21 100644
--- a/spec/frontend/vue_shared/components/registry/list_item_spec.js
+++ b/spec/frontend/vue_shared/components/registry/list_item_spec.js
@@ -1,6 +1,7 @@
import { GlButton } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import { nextTick } from 'vue';
+import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
import component from '~/vue_shared/components/registry/list_item.vue';
describe('list item', () => {
@@ -27,6 +28,9 @@ describe('list item', () => {
'right-action': '<div data-testid="right-action" />',
...slots,
},
+ directives: {
+ GlTooltip: createMockDirective('gl-tooltip'),
+ },
});
};
@@ -90,6 +94,48 @@ describe('list item', () => {
expect(findToggleDetailsButton().exists()).toBe(true);
});
+ describe('when visible', () => {
+ beforeEach(async () => {
+ mountComponent({}, { 'details-foo': '<span></span>' });
+ await nextTick();
+ });
+
+ it('has tooltip', () => {
+ const tooltip = getBinding(findToggleDetailsButton().element, 'gl-tooltip');
+
+ expect(tooltip).toBeDefined();
+ expect(findToggleDetailsButton().attributes('title')).toBe(
+ component.i18n.toggleDetailsLabel,
+ );
+ });
+
+ it('has correct attributes and props', () => {
+ expect(findToggleDetailsButton().props()).toMatchObject({
+ selected: false,
+ });
+
+ expect(findToggleDetailsButton().attributes()).toMatchObject({
+ title: component.i18n.toggleDetailsLabel,
+ 'aria-label': component.i18n.toggleDetailsLabel,
+ });
+ });
+
+ it('has correct attributes and props when clicked', async () => {
+ findToggleDetailsButton().vm.$emit('click');
+ await nextTick();
+
+ expect(findToggleDetailsButton().props()).toMatchObject({
+ selected: true,
+ });
+
+ expect(findToggleDetailsButton().attributes()).toMatchObject({
+ title: component.i18n.toggleDetailsLabel,
+ 'aria-label': component.i18n.toggleDetailsLabel,
+ 'aria-expanded': 'true',
+ });
+ });
+ });
+
it('is hidden without details slot', () => {
mountComponent();
expect(findToggleDetailsButton().exists()).toBe(false);
diff --git a/spec/frontend/vue_shared/components/runner_instructions/instructions/runner_docker_instructions_spec.js b/spec/frontend/vue_shared/components/runner_instructions/instructions/runner_docker_instructions_spec.js
index 94823bb640b..b94d8c1de21 100644
--- a/spec/frontend/vue_shared/components/runner_instructions/instructions/runner_docker_instructions_spec.js
+++ b/spec/frontend/vue_shared/components/runner_instructions/instructions/runner_docker_instructions_spec.js
@@ -2,6 +2,7 @@ import { shallowMount } from '@vue/test-utils';
import { GlButton } from '@gitlab/ui';
import RunnerDockerInstructions from '~/vue_shared/components/runner_instructions/instructions/runner_docker_instructions.vue';
+import { DOCS_URL } from 'jh_else_ce/lib/utils/url_utility';
describe('RunnerDockerInstructions', () => {
let wrapper;
@@ -25,8 +26,6 @@ describe('RunnerDockerInstructions', () => {
});
it('renders link', () => {
- expect(findButton().attributes('href')).toBe(
- 'https://docs.gitlab.com/runner/install/docker.html',
- );
+ expect(findButton().attributes('href')).toBe(`${DOCS_URL}/runner/install/docker.html`);
});
});
diff --git a/spec/frontend/vue_shared/components/runner_instructions/instructions/runner_kubernetes_instructions_spec.js b/spec/frontend/vue_shared/components/runner_instructions/instructions/runner_kubernetes_instructions_spec.js
index 9d6658e002c..f0b033a2ca2 100644
--- a/spec/frontend/vue_shared/components/runner_instructions/instructions/runner_kubernetes_instructions_spec.js
+++ b/spec/frontend/vue_shared/components/runner_instructions/instructions/runner_kubernetes_instructions_spec.js
@@ -2,6 +2,7 @@ import { shallowMount } from '@vue/test-utils';
import { GlButton } from '@gitlab/ui';
import RunnerKubernetesInstructions from '~/vue_shared/components/runner_instructions/instructions/runner_kubernetes_instructions.vue';
+import { DOCS_URL } from 'jh_else_ce/lib/utils/url_utility';
describe('RunnerKubernetesInstructions', () => {
let wrapper;
@@ -25,8 +26,6 @@ describe('RunnerKubernetesInstructions', () => {
});
it('renders link', () => {
- expect(findButton().attributes('href')).toBe(
- 'https://docs.gitlab.com/runner/install/kubernetes.html',
- );
+ expect(findButton().attributes('href')).toBe(`${DOCS_URL}/runner/install/kubernetes.html`);
});
});
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 2eaf46e6209..e307e53147b 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
@@ -90,14 +90,6 @@ describe('RunnerInstructionsModal component', () => {
await waitForPromises();
});
- it('should not show alert', () => {
- expect(findAlert().exists()).toBe(false);
- });
-
- it('should not show deprecation alert', () => {
- expect(findAlert('warning').exists()).toBe(false);
- });
-
it('should contain a number of platforms buttons', () => {
expect(runnerPlatformsHandler).toHaveBeenCalledWith({});
@@ -112,19 +104,8 @@ describe('RunnerInstructionsModal component', () => {
expect(architectures).toEqual(mockPlatformList[0].architectures.nodes);
});
- describe.each`
- glFeatures | deprecationAlertExists
- ${{}} | ${false}
- ${{ createRunnerWorkflowForAdmin: true }} | ${true}
- ${{ createRunnerWorkflowForNamespace: true }} | ${true}
- `('with features $glFeatures', ({ glFeatures, deprecationAlertExists }) => {
- beforeEach(() => {
- createComponent({ provide: { glFeatures } });
- });
-
- it(`alert is ${deprecationAlertExists ? 'shown' : 'not shown'}`, () => {
- expect(findAlert('warning').exists()).toBe(deprecationAlertExists);
- });
+ it('alert is shown', () => {
+ expect(findAlert('warning').exists()).toBe(true);
});
describe('when the modal resizes', () => {
diff --git a/spec/frontend/vue_shared/components/security_reports/__snapshots__/security_summary_spec.js.snap b/spec/frontend/vue_shared/components/security_reports/__snapshots__/security_summary_spec.js.snap
deleted file mode 100644
index 66d27b5d605..00000000000
--- a/spec/frontend/vue_shared/components/security_reports/__snapshots__/security_summary_spec.js.snap
+++ /dev/null
@@ -1,144 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`SecuritySummary component given the message {"countMessage": "%{criticalStart}0 Critical%{criticalEnd} %{highStart}1 High%{highEnd} and %{otherStart}0 Others%{otherEnd}", "critical": 0, "high": 1, "message": "Security scanning detected %{totalStart}1%{totalEnd} potential vulnerability", "other": 0, "status": "", "total": 1} interpolates correctly 1`] = `
-<span>
- Security scanning detected
- <strong>
- 1
- </strong>
- potential vulnerability
- <span
- class="gl-font-sm"
- >
- <span>
- <span
- class="gl-pl-4"
- >
-
- 0 Critical
-
- </span>
- </span>
-
- <span>
- <strong
- class="gl-text-red-600 gl-px-2"
- >
-
- 1 High
-
- </strong>
- </span>
- and
- <span>
- <span
- class="gl-px-2"
- >
-
- 0 Others
-
- </span>
- </span>
- </span>
-</span>
-`;
-
-exports[`SecuritySummary component given the message {"countMessage": "%{criticalStart}1 Critical%{criticalEnd} %{highStart}0 High%{highEnd} and %{otherStart}0 Others%{otherEnd}", "critical": 1, "high": 0, "message": "Security scanning detected %{totalStart}1%{totalEnd} potential vulnerability", "other": 0, "status": "", "total": 1} interpolates correctly 1`] = `
-<span>
- Security scanning detected
- <strong>
- 1
- </strong>
- potential vulnerability
- <span
- class="gl-font-sm"
- >
- <span>
- <strong
- class="gl-text-red-800 gl-pl-4"
- >
-
- 1 Critical
-
- </strong>
- </span>
-
- <span>
- <span
- class="gl-px-2"
- >
-
- 0 High
-
- </span>
- </span>
- and
- <span>
- <span
- class="gl-px-2"
- >
-
- 0 Others
-
- </span>
- </span>
- </span>
-</span>
-`;
-
-exports[`SecuritySummary component given the message {"countMessage": "%{criticalStart}1 Critical%{criticalEnd} %{highStart}2 High%{highEnd} and %{otherStart}0 Others%{otherEnd}", "critical": 1, "high": 2, "message": "Security scanning detected %{totalStart}3%{totalEnd} potential vulnerabilities", "other": 0, "status": "", "total": 3} interpolates correctly 1`] = `
-<span>
- Security scanning detected
- <strong>
- 3
- </strong>
- potential vulnerabilities
- <span
- class="gl-font-sm"
- >
- <span>
- <strong
- class="gl-text-red-800 gl-pl-4"
- >
-
- 1 Critical
-
- </strong>
- </span>
-
- <span>
- <strong
- class="gl-text-red-600 gl-px-2"
- >
-
- 2 High
-
- </strong>
- </span>
- and
- <span>
- <span
- class="gl-px-2"
- >
-
- 0 Others
-
- </span>
- </span>
- </span>
-</span>
-`;
-
-exports[`SecuritySummary component given the message {"message": ""} interpolates correctly 1`] = `
-<span>
-
- <!---->
-</span>
-`;
-
-exports[`SecuritySummary component given the message {"message": "foo"} interpolates correctly 1`] = `
-<span>
- foo
- <!---->
-</span>
-`;
diff --git a/spec/frontend/vue_shared/components/security_reports/artifact_downloads/merge_request_artifact_download_spec.js b/spec/frontend/vue_shared/components/security_reports/artifact_downloads/merge_request_artifact_download_spec.js
deleted file mode 100644
index 6eebd129beb..00000000000
--- a/spec/frontend/vue_shared/components/security_reports/artifact_downloads/merge_request_artifact_download_spec.js
+++ /dev/null
@@ -1,104 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import Vue from 'vue';
-import VueApollo from 'vue-apollo';
-import createMockApollo from 'helpers/mock_apollo_helper';
-import {
- expectedDownloadDropdownPropsWithTitle,
- securityReportMergeRequestDownloadPathsQueryResponse,
-} from 'jest/vue_shared/security_reports/mock_data';
-import { createAlert } from '~/alert';
-import Component from '~/vue_shared/security_reports/components/artifact_downloads/merge_request_artifact_download.vue';
-import SecurityReportDownloadDropdown from '~/vue_shared/security_reports/components/security_report_download_dropdown.vue';
-import {
- REPORT_TYPE_SAST,
- REPORT_TYPE_SECRET_DETECTION,
-} from '~/vue_shared/security_reports/constants';
-import securityReportMergeRequestDownloadPathsQuery from '~/vue_shared/security_reports/graphql/queries/security_report_merge_request_download_paths.query.graphql';
-
-jest.mock('~/alert');
-
-describe('Merge request artifact Download', () => {
- let wrapper;
-
- const defaultProps = {
- reportTypes: [REPORT_TYPE_SAST, REPORT_TYPE_SECRET_DETECTION],
- targetProjectFullPath: '/path',
- mrIid: 123,
- };
-
- const createWrapper = ({ propsData, options }) => {
- wrapper = shallowMount(Component, {
- stubs: {
- SecurityReportDownloadDropdown,
- },
- propsData: {
- ...defaultProps,
- ...propsData,
- },
- ...options,
- });
- };
-
- const pendingHandler = () => new Promise(() => {});
- const successHandler = () =>
- Promise.resolve({ data: securityReportMergeRequestDownloadPathsQueryResponse });
- const failureHandler = () => Promise.resolve({ errors: [{ message: 'some error' }] });
- const createMockApolloProvider = (handler) => {
- Vue.use(VueApollo);
- const requestHandlers = [[securityReportMergeRequestDownloadPathsQuery, handler]];
-
- return createMockApollo(requestHandlers);
- };
-
- const findDownloadDropdown = () => wrapper.findComponent(SecurityReportDownloadDropdown);
-
- describe('given the query is loading', () => {
- beforeEach(() => {
- createWrapper({
- options: {
- apolloProvider: createMockApolloProvider(pendingHandler),
- },
- });
- });
-
- it('loading is true', () => {
- expect(findDownloadDropdown().props('loading')).toBe(true);
- });
- });
-
- describe('given the query loads successfully', () => {
- beforeEach(() => {
- createWrapper({
- options: {
- apolloProvider: createMockApolloProvider(successHandler),
- },
- });
- });
-
- it('renders the download dropdown', () => {
- expect(findDownloadDropdown().props()).toEqual(expectedDownloadDropdownPropsWithTitle);
- });
- });
-
- describe('given the query fails', () => {
- beforeEach(() => {
- createWrapper({
- options: {
- apolloProvider: createMockApolloProvider(failureHandler),
- },
- });
- });
-
- it('calls createAlert correctly', () => {
- expect(createAlert).toHaveBeenCalledWith({
- message: Component.i18n.apiError,
- captureError: true,
- error: expect.any(Error),
- });
- });
-
- it('renders nothing', () => {
- expect(findDownloadDropdown().props('artifacts')).toEqual([]);
- });
- });
-});
diff --git a/spec/frontend/vue_shared/components/security_reports/help_icon_spec.js b/spec/frontend/vue_shared/components/security_reports/help_icon_spec.js
deleted file mode 100644
index 2f6e633fb34..00000000000
--- a/spec/frontend/vue_shared/components/security_reports/help_icon_spec.js
+++ /dev/null
@@ -1,63 +0,0 @@
-import { GlLink, GlPopover } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import HelpIcon from '~/vue_shared/security_reports/components/help_icon.vue';
-
-const helpPath = '/docs';
-const discoverProjectSecurityPath = '/discoverProjectSecurityPath';
-
-describe('HelpIcon component', () => {
- let wrapper;
-
- const createWrapper = (props) => {
- wrapper = shallowMount(HelpIcon, {
- propsData: {
- helpPath,
- ...props,
- },
- });
- };
-
- const findLink = () => wrapper.findComponent(GlLink);
- const findPopover = () => wrapper.findComponent(GlPopover);
- const findPopoverTarget = () => wrapper.findComponent({ ref: 'discoverProjectSecurity' });
-
- describe('given a help path only', () => {
- beforeEach(() => {
- createWrapper();
- });
-
- it('does not render a popover', () => {
- expect(findPopover().exists()).toBe(false);
- });
-
- it('renders a help link', () => {
- expect(findLink().attributes()).toMatchObject({
- href: helpPath,
- target: '_blank',
- });
- });
- });
-
- describe('given a help path and discover project security path', () => {
- beforeEach(() => {
- createWrapper({ discoverProjectSecurityPath });
- });
-
- it('renders a popover', () => {
- const popover = findPopover();
- expect(popover.props('target')()).toBe(findPopoverTarget().element);
- expect(popover.attributes()).toMatchObject({
- title: HelpIcon.i18n.upgradeToManageVulnerabilities,
- triggers: 'click blur',
- });
- expect(popover.text()).toContain(HelpIcon.i18n.upgradeToInteract);
- });
-
- it('renders a link to the discover path', () => {
- expect(findLink().attributes()).toMatchObject({
- href: discoverProjectSecurityPath,
- target: '_blank',
- });
- });
- });
-});
diff --git a/spec/frontend/vue_shared/components/security_reports/security_summary_spec.js b/spec/frontend/vue_shared/components/security_reports/security_summary_spec.js
deleted file mode 100644
index 61cdc329220..00000000000
--- a/spec/frontend/vue_shared/components/security_reports/security_summary_spec.js
+++ /dev/null
@@ -1,33 +0,0 @@
-import { GlSprintf } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import SecuritySummary from '~/vue_shared/security_reports/components/security_summary.vue';
-import { groupedTextBuilder } from '~/vue_shared/security_reports/store/utils';
-
-describe('SecuritySummary component', () => {
- let wrapper;
-
- const createWrapper = (message) => {
- wrapper = shallowMount(SecuritySummary, {
- propsData: { message },
- stubs: {
- GlSprintf,
- },
- });
- };
-
- describe.each([
- { message: '' },
- { message: 'foo' },
- groupedTextBuilder({ reportType: 'Security scanning', critical: 1, high: 0, total: 1 }),
- groupedTextBuilder({ reportType: 'Security scanning', critical: 0, high: 1, total: 1 }),
- groupedTextBuilder({ reportType: 'Security scanning', critical: 1, high: 2, total: 3 }),
- ])('given the message %p', (message) => {
- beforeEach(() => {
- createWrapper(message);
- });
-
- it('interpolates correctly', () => {
- expect(wrapper.element).toMatchSnapshot();
- });
- });
-});
diff --git a/spec/frontend/vue_shared/components/source_viewer/components/chunk_new_spec.js b/spec/frontend/vue_shared/components/source_viewer/components/chunk_new_spec.js
index 919abc26e05..1154c930e5d 100644
--- a/spec/frontend/vue_shared/components/source_viewer/components/chunk_new_spec.js
+++ b/spec/frontend/vue_shared/components/source_viewer/components/chunk_new_spec.js
@@ -40,8 +40,6 @@ describe('Chunk component', () => {
describe('rendering', () => {
it('does not register window.requestIdleCallback for the first chunk, renders content immediately', () => {
- jest.clearAllMocks();
-
expect(window.requestIdleCallback).not.toHaveBeenCalled();
expect(findContent().text()).toBe(CHUNK_1.highlightedContent);
});
diff --git a/spec/frontend/vue_shared/components/source_viewer/highlight_util_spec.js b/spec/frontend/vue_shared/components/source_viewer/highlight_util_spec.js
index d2dd4afe09e..49e3083f8ed 100644
--- a/spec/frontend/vue_shared/components/source_viewer/highlight_util_spec.js
+++ b/spec/frontend/vue_shared/components/source_viewer/highlight_util_spec.js
@@ -1,10 +1,11 @@
-import hljs from 'highlight.js';
+import hljs from 'highlight.js/lib/core';
import { registerPlugins } from '~/vue_shared/components/source_viewer/plugins/index';
import { highlight } from '~/vue_shared/components/source_viewer/workers/highlight_utils';
import { LINES_PER_CHUNK, NEWLINE } from '~/vue_shared/components/source_viewer/constants';
-jest.mock('highlight.js', () => ({
+jest.mock('highlight.js/lib/core', () => ({
highlight: jest.fn().mockReturnValue({ value: 'highlighted content' }),
+ registerLanguage: jest.fn(),
}));
jest.mock('~/vue_shared/components/source_viewer/plugins/index', () => ({
@@ -14,11 +15,15 @@ jest.mock('~/vue_shared/components/source_viewer/plugins/index', () => ({
const fileType = 'text';
const rawContent = 'function test() { return true }; \n // newline';
const highlightedContent = 'highlighted content';
-const language = 'javascript';
+const language = 'json';
describe('Highlight utility', () => {
beforeEach(() => highlight(fileType, rawContent, language));
+ it('registers the language', () => {
+ expect(hljs.registerLanguage).toHaveBeenCalledWith(language, expect.any(Function));
+ });
+
it('registers the plugins', () => {
expect(registerPlugins).toHaveBeenCalled();
});
diff --git a/spec/frontend/vue_shared/components/source_viewer/plugins/wrap_child_nodes_spec.js b/spec/frontend/vue_shared/components/source_viewer/plugins/wrap_child_nodes_spec.js
index 9d2bf002d73..45fef09aa84 100644
--- a/spec/frontend/vue_shared/components/source_viewer/plugins/wrap_child_nodes_spec.js
+++ b/spec/frontend/vue_shared/components/source_viewer/plugins/wrap_child_nodes_spec.js
@@ -8,14 +8,15 @@ describe('Highlight.js plugin for wrapping _emitter nodes', () => {
children: [
{ scope: 'string', children: ['Text 1'] },
{ scope: 'string', children: ['Text 2', { scope: 'comment', children: ['Text 3'] }] },
- { scope: undefined, sublanguage: true, children: ['Text 3 (sublanguage)'] },
- 'Text4\nText5',
+ { scope: undefined, sublanguage: true, children: ['Text 4 (sublanguage)'] },
+ { scope: undefined, sublanguage: undefined, children: ['Text 5'] },
+ 'Text6\nText7',
],
},
},
};
- const outputValue = `<span class="hljs-string">Text 1</span><span class="hljs-string"><span class="hljs-string">Text 2</span><span class="hljs-comment">Text 3</span></span><span class="">Text 3 (sublanguage)</span><span class="">Text4</span>\n<span class="">Text5</span>`;
+ const outputValue = `<span class="hljs-string">Text 1</span><span class="hljs-string"><span class="hljs-string">Text 2</span><span class="hljs-comment">Text 3</span></span><span class="">Text 4 (sublanguage)</span><span class="">Text 5</span><span class="">Text6</span>\n<span class="">Text7</span>`;
wrapChildNodes(hljsResultMock);
expect(hljsResultMock.value).toBe(outputValue);
diff --git a/spec/frontend/vue_shared/components/source_viewer/plugins/wrap_lines_spec.js b/spec/frontend/vue_shared/components/source_viewer/plugins/wrap_lines_spec.js
new file mode 100644
index 00000000000..def76856dba
--- /dev/null
+++ b/spec/frontend/vue_shared/components/source_viewer/plugins/wrap_lines_spec.js
@@ -0,0 +1,12 @@
+import wrapLines from '~/vue_shared/components/source_viewer/plugins/wrap_lines';
+
+describe('Highlight.js plugin for wrapping lines', () => {
+ it('mutates the input value by wrapping each line in a div with the correct attributes', () => {
+ const inputValue = `// some content`;
+ const outputValue = `<div id="LC1" lang="javascript" class="line">${inputValue}</div>`;
+ const hljsResultMock = { value: inputValue, language: 'javascript' };
+
+ wrapLines(hljsResultMock);
+ expect(hljsResultMock.value).toBe(outputValue);
+ });
+});
diff --git a/spec/frontend/vue_shared/components/source_viewer/source_viewer_new_spec.js b/spec/frontend/vue_shared/components/source_viewer/source_viewer_new_spec.js
index 715234e56fd..6b711b6b6b2 100644
--- a/spec/frontend/vue_shared/components/source_viewer/source_viewer_new_spec.js
+++ b/spec/frontend/vue_shared/components/source_viewer/source_viewer_new_spec.js
@@ -3,9 +3,11 @@ import SourceViewer from '~/vue_shared/components/source_viewer/source_viewer_ne
import Chunk from '~/vue_shared/components/source_viewer/components/chunk_new.vue';
import { EVENT_ACTION, EVENT_LABEL_VIEWER } from '~/vue_shared/components/source_viewer/constants';
import Tracking from '~/tracking';
+import LineHighlighter from '~/blob/line_highlighter';
import addBlobLinksTracking from '~/blob/blob_links_tracking';
import { BLOB_DATA_MOCK, CHUNK_1, CHUNK_2, LANGUAGE_MOCK } from './mock_data';
+jest.mock('~/blob/line_highlighter');
jest.mock('~/blob/blob_links_tracking');
describe('Source Viewer component', () => {
@@ -25,6 +27,10 @@ describe('Source Viewer component', () => {
return createComponent();
});
+ it('instantiates the lineHighlighter class', () => {
+ expect(LineHighlighter).toHaveBeenCalled();
+ });
+
describe('event tracking', () => {
it('fires a tracking event when the component is created', () => {
const eventData = { label: EVENT_LABEL_VIEWER, property: LANGUAGE_MOCK };
diff --git a/spec/frontend/vue_shared/components/upload_dropzone/upload_dropzone_spec.js b/spec/frontend/vue_shared/components/upload_dropzone/upload_dropzone_spec.js
index 24f96195e05..776395b9717 100644
--- a/spec/frontend/vue_shared/components/upload_dropzone/upload_dropzone_spec.js
+++ b/spec/frontend/vue_shared/components/upload_dropzone/upload_dropzone_spec.js
@@ -1,6 +1,6 @@
import { GlIcon, GlSprintf } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
import { nextTick } from 'vue';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import UploadDropzone from '~/vue_shared/components/upload_dropzone/upload_dropzone.vue';
describe('Upload dropzone component', () => {
@@ -11,13 +11,13 @@ describe('Upload dropzone component', () => {
};
const findDropzoneCard = () => wrapper.find('.upload-dropzone-card');
- const findDropzoneArea = () => wrapper.find('[data-testid="dropzone-area"]');
+ const findDropzoneArea = () => wrapper.findByTestId('dropzone-area');
const findIcon = () => wrapper.findComponent(GlIcon);
- const findUploadText = () => wrapper.find('[data-testid="upload-text"]').text();
+ const findUploadText = () => wrapper.findByTestId('upload-text').text();
const findFileInput = () => wrapper.find('input[type="file"]');
- function createComponent({ slots = {}, data = {}, props = {} } = {}) {
- wrapper = shallowMount(UploadDropzone, {
+ function createComponent({ slots = {}, props = {} } = {}) {
+ wrapper = shallowMountExtended(UploadDropzone, {
slots,
propsData: {
displayAsCard: true,
@@ -26,9 +26,6 @@ describe('Upload dropzone component', () => {
stubs: {
GlSprintf,
},
- data() {
- return data;
- },
});
}
@@ -112,53 +109,50 @@ describe('Upload dropzone component', () => {
wrapper.trigger('drop', mockEvent);
await nextTick();
- expect(wrapper.emitted().change[0]).toEqual([[mockFile]]);
+ expect(wrapper.emitted('change')).toEqual([[[mockFile]]]);
});
});
describe('ondrop', () => {
- const mockData = { dragCounter: 1, isDragDataValid: true };
-
describe('when drag data is valid', () => {
it('emits upload event for valid files', () => {
- createComponent({ data: mockData });
+ createComponent();
const mockFile = { type: 'image/jpg' };
const mockEvent = mockDragEvent({ files: [mockFile] });
- wrapper.vm.ondrop(mockEvent);
- expect(wrapper.emitted().change[0]).toEqual([[mockFile]]);
+ wrapper.trigger('drop', mockEvent);
+ expect(wrapper.emitted('change')).toEqual([[[mockFile]]]);
});
it('emits error event when files are invalid', () => {
- createComponent({ data: mockData });
+ createComponent();
const mockEvent = mockDragEvent({ files: [{ type: 'audio/midi' }] });
- wrapper.vm.ondrop(mockEvent);
+ wrapper.trigger('drop', mockEvent);
expect(wrapper.emitted()).toHaveProperty('error');
});
it('allows validation function to be overwritten', () => {
- createComponent({ data: mockData, props: { isFileValid: () => true } });
+ createComponent({ props: { isFileValid: () => true } });
const mockEvent = mockDragEvent({ files: [{ type: 'audio/midi' }] });
- wrapper.vm.ondrop(mockEvent);
+ wrapper.trigger('drop', mockEvent);
expect(wrapper.emitted()).not.toHaveProperty('error');
});
describe('singleFileSelection = true', () => {
it('emits a single file on drop', () => {
createComponent({
- data: mockData,
props: { singleFileSelection: true },
});
const mockFile = { type: 'image/jpg' };
const mockEvent = mockDragEvent({ files: [mockFile] });
- wrapper.vm.ondrop(mockEvent);
- expect(wrapper.emitted().change[0]).toEqual([mockFile]);
+ wrapper.trigger('drop', mockEvent);
+ expect(wrapper.emitted('change')).toEqual([[mockFile]]);
});
});
});
diff --git a/spec/frontend/vue_shared/components/user_avatar/user_avatar_link_spec.js b/spec/frontend/vue_shared/components/user_avatar/user_avatar_link_spec.js
index 90f9156af38..443d4e32580 100644
--- a/spec/frontend/vue_shared/components/user_avatar/user_avatar_link_spec.js
+++ b/spec/frontend/vue_shared/components/user_avatar/user_avatar_link_spec.js
@@ -95,4 +95,18 @@ describe('User Avatar Link Component', () => {
expect(wrapper.html()).toContain(badge);
});
});
+
+ describe('when popover props provided', () => {
+ beforeEach(() => {
+ createWrapper({ popoverUserId: 1, popoverUsername: defaultProps.username });
+ });
+
+ it('should render GlAvatarLink with popover support', () => {
+ expect(wrapper.attributes()).toMatchObject({
+ href: defaultProps.linkHref,
+ 'data-user-id': '1',
+ 'data-username': `${defaultProps.username}`,
+ });
+ });
+ });
});
diff --git a/spec/frontend/vue_shared/components/user_avatar/user_avatar_list_spec.js b/spec/frontend/vue_shared/components/user_avatar/user_avatar_list_spec.js
index 075cb753301..32f9df8a63c 100644
--- a/spec/frontend/vue_shared/components/user_avatar/user_avatar_list_spec.js
+++ b/spec/frontend/vue_shared/components/user_avatar/user_avatar_list_spec.js
@@ -14,6 +14,7 @@ const DEFAULT_EMPTY_MESSAGE = 'None';
const createUser = (id) => ({
id,
name: 'Lorem',
+ username: 'lorem.ipsum',
web_url: `${TEST_HOST}/${id}`,
avatar_url: `${TEST_HOST}/${id}/avatar`,
});
@@ -90,6 +91,8 @@ describe('UserAvatarList', () => {
imgAlt: x.name,
tooltipText: x.name,
imgSize: TEST_IMAGE_SIZE,
+ popoverUserId: x.id,
+ popoverUsername: x.username,
}),
),
);
@@ -107,6 +110,8 @@ describe('UserAvatarList', () => {
imgAlt: x.name,
tooltipText: x.name,
imgSize: TEST_IMAGE_SIZE,
+ popoverUserId: x.id,
+ popoverUsername: x.username,
}),
),
);
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 41181ab9a68..0457044f985 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
@@ -31,6 +31,7 @@ const DEFAULT_PROPS = {
name: 'Administrator',
location: 'Vienna',
localTime: '2:30 PM',
+ webUrl: '/root',
bot: false,
bio: null,
workInformation: null,
@@ -71,11 +72,11 @@ describe('User Popover Component', () => {
});
};
- const createWrapper = (props = {}) => {
+ const createWrapper = (props = {}, target = findTarget()) => {
wrapper = mountExtended(UserPopover, {
propsData: {
...DEFAULT_PROPS,
- target: findTarget(),
+ target,
...props,
},
});
@@ -518,4 +519,35 @@ describe('User Popover Component', () => {
expect(findToggleFollowButton().exists()).toBe(false);
});
});
+
+ describe('when current user is assignee/reviewer in a Merge Request', () => {
+ const { id, username, webUrl } = DEFAULT_PROPS.user;
+ const target = document.createElement('a');
+ target.setAttribute('href', webUrl);
+ target.classList.add('js-user-link');
+ target.dataset.currentUserId = id;
+ target.dataset.currentUsername = username;
+
+ it('renders popover with warning when user unable to merge', () => {
+ target.dataset.cannotMerge = 'true';
+
+ createWrapper({}, target);
+
+ const cannotMergeWarning = wrapper.findByTestId('cannot-merge');
+
+ expect(cannotMergeWarning.exists()).toBe(true);
+ expect(cannotMergeWarning.text()).toContain('Cannot merge');
+ expect(cannotMergeWarning.findComponent(GlIcon).props('name')).toBe('warning-solid');
+ });
+
+ it('renders popover without any warning when user is able to merge', () => {
+ delete target.dataset.cannotMerge;
+
+ createWrapper({}, target);
+
+ const cannotMergeWarning = wrapper.findByTestId('cannot-merge');
+
+ expect(cannotMergeWarning.exists()).toBe(false);
+ });
+ });
});
diff --git a/spec/frontend/vue_shared/components/user_select_spec.js b/spec/frontend/vue_shared/components/user_select_spec.js
index e881bfed35e..8c7657da8bc 100644
--- a/spec/frontend/vue_shared/components/user_select_spec.js
+++ b/spec/frontend/vue_shared/components/user_select_spec.js
@@ -1,10 +1,10 @@
import { GlSearchBoxByType } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
import { cloneDeep } from 'lodash';
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 searchUsersQuery from '~/graphql_shared/queries/users_search.query.graphql';
import searchUsersQueryOnMR from '~/graphql_shared/queries/users_search_with_mr_permissions.graphql';
import { TYPE_MERGE_REQUEST } from '~/issues/constants';
@@ -44,20 +44,20 @@ Vue.use(VueApollo);
describe('User select dropdown', () => {
let wrapper;
let fakeApollo;
+ const hideDropdownMock = jest.fn();
const findSearchField = () => wrapper.findComponent(GlSearchBoxByType);
- const findParticipantsLoading = () => wrapper.find('[data-testid="loading-participants"]');
- const findSelectedParticipants = () => wrapper.findAll('[data-testid="selected-participant"]');
+ const findParticipantsLoading = () => wrapper.findByTestId('loading-participants');
+ const findSelectedParticipants = () => wrapper.findAllByTestId('selected-participant');
const findSelectedParticipantByIndex = (index) =>
findSelectedParticipants().at(index).findComponent(SidebarParticipant);
- const findUnselectedParticipants = () =>
- wrapper.findAll('[data-testid="unselected-participant"]');
+ const findUnselectedParticipants = () => wrapper.findAllByTestId('unselected-participant');
const findUnselectedParticipantByIndex = (index) =>
findUnselectedParticipants().at(index).findComponent(SidebarParticipant);
- const findCurrentUser = () => wrapper.findAll('[data-testid="current-user"]');
- const findIssuableAuthor = () => wrapper.findAll('[data-testid="issuable-author"]');
- const findUnassignLink = () => wrapper.find('[data-testid="unassign"]');
- const findEmptySearchResults = () => wrapper.find('[data-testid="empty-results"]');
+ const findCurrentUser = () => wrapper.findAllByTestId('current-user');
+ const findIssuableAuthor = () => wrapper.findAllByTestId('issuable-author');
+ const findUnassignLink = () => wrapper.findByTestId('unassign');
+ const findEmptySearchResults = () => wrapper.findAllByTestId('empty-results');
const searchQueryHandlerSuccess = jest.fn().mockResolvedValue(projectMembersResponse);
const participantsQueryHandlerSuccess = jest.fn().mockResolvedValue(participantsQueryResponse);
@@ -72,7 +72,7 @@ describe('User select dropdown', () => {
[searchUsersQueryOnMR, jest.fn().mockResolvedValue(searchResponseOnMR)],
[getIssueParticipantsQuery, participantsQueryHandler],
]);
- wrapper = shallowMount(UserSelect, {
+ wrapper = shallowMountExtended(UserSelect, {
apolloProvider: fakeApollo,
propsData: {
headerText: 'test',
@@ -97,7 +97,7 @@ describe('User select dropdown', () => {
</div>
`,
methods: {
- hide: jest.fn(),
+ hide: hideDropdownMock,
},
},
},
@@ -106,6 +106,7 @@ describe('User select dropdown', () => {
afterEach(() => {
fakeApollo = null;
+ hideDropdownMock.mockClear();
});
it('renders a loading spinner if participants are loading', () => {
@@ -290,12 +291,12 @@ describe('User select dropdown', () => {
value: [assignee],
},
});
- wrapper.vm.$refs.dropdown.hide = jest.fn();
+
await waitForPromises();
findUnassignLink().trigger('click');
- expect(wrapper.vm.$refs.dropdown.hide).toHaveBeenCalledTimes(1);
+ expect(hideDropdownMock).toHaveBeenCalledTimes(1);
});
it('emits an empty array after unselecting the only selected assignee', async () => {
diff --git a/spec/frontend/vue_shared/components/web_ide_link_spec.js b/spec/frontend/vue_shared/components/web_ide_link_spec.js
index e54de25dc0d..b6c22ceaa23 100644
--- a/spec/frontend/vue_shared/components/web_ide_link_spec.js
+++ b/spec/frontend/vue_shared/components/web_ide_link_spec.js
@@ -85,7 +85,7 @@ describe('vue_shared/components/web_ide_link', () => {
let wrapper;
- function createComponent(props, { mountFn = shallowMountExtended, glFeatures = {} } = {}) {
+ function createComponent(props, { mountFn = shallowMountExtended, slots = {} } = {}) {
const fakeApollo = createMockApollo([
[getWritableForksQuery, jest.fn().mockResolvedValue(getWritableForksResponse)],
]);
@@ -98,9 +98,7 @@ describe('vue_shared/components/web_ide_link', () => {
forkPath,
...props,
},
- provide: {
- glFeatures,
- },
+ slots,
stubs: {
GlModal: stubComponent(GlModal, {
template: `
@@ -215,6 +213,27 @@ describe('vue_shared/components/web_ide_link', () => {
expect(findActionsButton().props('actions')).toEqual(expectedActions);
});
+ it('bubbles up shown and hidden events triggered by actions button component', () => {
+ createComponent();
+
+ expect(wrapper.emitted('shown')).toBe(undefined);
+ expect(wrapper.emitted('hidden')).toBe(undefined);
+
+ findActionsButton().vm.$emit('shown');
+ findActionsButton().vm.$emit('hidden');
+
+ expect(wrapper.emitted('shown')).toHaveLength(1);
+ expect(wrapper.emitted('hidden')).toHaveLength(1);
+ });
+
+ it('exposes a default slot', () => {
+ const slotContent = 'default slot content';
+
+ createComponent({}, { slots: { default: slotContent } });
+
+ expect(wrapper.text()).toContain(slotContent);
+ });
+
describe('when pipeline editor action is available', () => {
beforeEach(() => {
createComponent({
diff --git a/spec/frontend/vue_shared/issuable/list/mock_data.js b/spec/frontend/vue_shared/issuable/list/mock_data.js
index 964b48f4275..f8cf3ba5271 100644
--- a/spec/frontend/vue_shared/issuable/list/mock_data.js
+++ b/spec/frontend/vue_shared/issuable/list/mock_data.js
@@ -5,6 +5,7 @@ import {
} from 'jest/vue_shared/components/filtered_search_bar/mock_data';
export const mockAuthor = {
+ __typename: 'UserCore',
id: 'gid://gitlab/User/1',
avatarUrl: 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
name: 'Administrator',
@@ -13,6 +14,7 @@ export const mockAuthor = {
};
export const mockRegularLabel = {
+ __typename: 'Label',
id: 'gid://gitlab/GroupLabel/2048',
title: 'Documentation Update',
description: null,
@@ -21,6 +23,7 @@ export const mockRegularLabel = {
};
export const mockScopedLabel = {
+ __typename: 'Label',
id: 'gid://gitlab/ProjectLabel/2049',
title: 'status::confirmed',
description: null,
@@ -31,6 +34,7 @@ export const mockScopedLabel = {
export const mockLabels = [mockRegularLabel, mockScopedLabel];
export const mockCurrentUserTodo = {
+ __typename: 'Todo',
id: 'gid://gitlab/Todo/489',
state: 'done',
};
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 fa38ab8d44d..d2b7b2e89c8 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,13 +1,16 @@
import { GlButton, GlBadge, GlIcon, GlAvatarLabeled, GlAvatarLink } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
+import { TYPE_ISSUE, WORKSPACE_PROJECT } from '~/issues/constants';
+import ConfidentialityBadge from '~/vue_shared/components/confidentiality_badge.vue';
import IssuableHeader from '~/vue_shared/issuable/show/components/issuable_header.vue';
-
import { mockIssuableShowProps, mockIssuable } from '../mock_data';
const issuableHeaderProps = {
...mockIssuable,
...mockIssuableShowProps,
+ issuableType: TYPE_ISSUE,
+ workspaceType: WORKSPACE_PROJECT,
};
describe('IssuableHeader', () => {
@@ -53,6 +56,14 @@ describe('IssuableHeader', () => {
setHTMLFixture('<button class="js-toggle-right-sidebar-button">Collapse sidebar</button>');
});
+ it('emits a "toggle" event', () => {
+ createComponent();
+
+ findButton().vm.$emit('click');
+
+ expect(wrapper.emitted('toggle')).toEqual([[]]);
+ });
+
it('dispatches `click` event on sidebar toggle button', () => {
createComponent();
const toggleSidebarButtonEl = document.querySelector('.js-toggle-right-sidebar-button');
@@ -94,14 +105,12 @@ describe('IssuableHeader', () => {
});
it('renders confidential icon when issuable is confidential', () => {
- createComponent({
- confidential: true,
- });
+ createComponent({ confidential: true });
- const confidentialEl = wrapper.findByTestId('confidential');
-
- expect(confidentialEl.exists()).toBe(true);
- expect(confidentialEl.findComponent(GlIcon).props('name')).toBe('eye-slash');
+ expect(wrapper.findComponent(ConfidentialityBadge).props()).toEqual({
+ issuableType: 'issue',
+ workspaceType: 'project',
+ });
});
it('renders issuable author avatar', () => {
diff --git a/spec/frontend/vue_shared/new_namespace/components/welcome_spec.js b/spec/frontend/vue_shared/new_namespace/components/welcome_spec.js
index cc8a8d86d19..3306e316ed0 100644
--- a/spec/frontend/vue_shared/new_namespace/components/welcome_spec.js
+++ b/spec/frontend/vue_shared/new_namespace/components/welcome_spec.js
@@ -39,6 +39,18 @@ describe('Welcome page', () => {
expect(trackingSpy).toHaveBeenCalledWith(undefined, 'click_tab', { label: 'test' });
});
+ it('renders image', () => {
+ const mockImgSrc = 'image1.svg';
+
+ createComponent({
+ propsData: {
+ panels: [{ name: 'test', href: '#', imageSrc: mockImgSrc }],
+ },
+ });
+
+ expect(wrapper.find('img').attributes('src')).toBe(mockImgSrc);
+ });
+
it('renders footer slot if provided', () => {
const DUMMY = 'Test message';
createComponent({
diff --git a/spec/frontend/vue_shared/new_namespace/new_namespace_page_spec.js b/spec/frontend/vue_shared/new_namespace/new_namespace_page_spec.js
index abc69da7a58..a7ddcbdd8bc 100644
--- a/spec/frontend/vue_shared/new_namespace/new_namespace_page_spec.js
+++ b/spec/frontend/vue_shared/new_namespace/new_namespace_page_spec.js
@@ -15,6 +15,7 @@ describe('Experimental new namespace creation app', () => {
const findWelcomePage = () => wrapper.findComponent(WelcomePage);
const findLegacyContainer = () => wrapper.findComponent(LegacyContainer);
const findBreadcrumb = () => wrapper.findComponent(GlBreadcrumb);
+ const findImage = () => wrapper.find('img');
const findNewTopLevelGroupAlert = () => wrapper.findComponent(NewTopLevelGroupAlert);
const findSuperSidebarToggle = () => wrapper.findComponent(SuperSidebarToggle);
@@ -22,8 +23,8 @@ describe('Experimental new namespace creation app', () => {
title: 'Create something',
initialBreadcrumbs: [{ text: 'Something', href: '#' }],
panels: [
- { name: 'panel1', selector: '#some-selector1' },
- { name: 'panel2', selector: '#some-selector2' },
+ { name: 'panel1', selector: '#some-selector1', imageSrc: 'panel1.svg' },
+ { name: 'panel2', selector: '#some-selector2', imageSrc: 'panel2.svg' },
],
persistenceKey: 'DEMO-PERSISTENCE-KEY',
};
@@ -82,6 +83,10 @@ describe('Experimental new namespace creation app', () => {
expect(breadcrumb.exists()).toBe(true);
expect(breadcrumb.props().items[0].text).toBe(DEFAULT_PROPS.initialBreadcrumbs[0].text);
});
+
+ it('renders images', () => {
+ expect(findImage().attributes('src')).toBe(DEFAULT_PROPS.panels[1].imageSrc);
+ });
});
it('renders extra description if provided', () => {
diff --git a/spec/frontend/vue_shared/security_reports/mock_data.js b/spec/frontend/vue_shared/security_reports/mock_data.js
index a9ad675e538..533d312a4de 100644
--- a/spec/frontend/vue_shared/security_reports/mock_data.js
+++ b/spec/frontend/vue_shared/security_reports/mock_data.js
@@ -341,120 +341,6 @@ export const securityReportMergeRequestDownloadPathsQueryNoArtifactsResponse = {
},
};
-export const securityReportMergeRequestDownloadPathsQueryResponse = {
- project: {
- id: '1',
- mergeRequest: {
- id: 'mr-1',
- headPipeline: {
- id: 'gid://gitlab/Ci::Pipeline/176',
- jobs: {
- nodes: [
- {
- id: 'job-1',
- name: 'secret_detection',
- artifacts: {
- nodes: [
- {
- downloadPath:
- '/gitlab-org/secrets-detection-test/-/jobs/1399/artifacts/download?file_type=trace',
- fileType: 'TRACE',
- __typename: 'CiJobArtifact',
- },
- {
- downloadPath:
- '/gitlab-org/secrets-detection-test/-/jobs/1399/artifacts/download?file_type=secret_detection',
- fileType: 'SECRET_DETECTION',
- __typename: 'CiJobArtifact',
- },
- ],
- __typename: 'CiJobArtifactConnection',
- },
- __typename: 'CiJob',
- },
- {
- id: 'job-2',
- name: 'bandit-sast',
- artifacts: {
- nodes: [
- {
- downloadPath:
- '/gitlab-org/secrets-detection-test/-/jobs/1400/artifacts/download?file_type=trace',
- fileType: 'TRACE',
- __typename: 'CiJobArtifact',
- },
- {
- downloadPath:
- '/gitlab-org/secrets-detection-test/-/jobs/1400/artifacts/download?file_type=sast',
- fileType: 'SAST',
- __typename: 'CiJobArtifact',
- },
- ],
- __typename: 'CiJobArtifactConnection',
- },
- __typename: 'CiJob',
- },
- {
- id: 'job-3',
- name: 'eslint-sast',
- artifacts: {
- nodes: [
- {
- downloadPath:
- '/gitlab-org/secrets-detection-test/-/jobs/1401/artifacts/download?file_type=trace',
- fileType: 'TRACE',
- __typename: 'CiJobArtifact',
- },
- {
- downloadPath:
- '/gitlab-org/secrets-detection-test/-/jobs/1401/artifacts/download?file_type=sast',
- fileType: 'SAST',
- __typename: 'CiJobArtifact',
- },
- ],
- __typename: 'CiJobArtifactConnection',
- },
- __typename: 'CiJob',
- },
- {
- id: 'job-4',
- name: 'all_artifacts',
- artifacts: {
- nodes: [
- {
- downloadPath:
- '/gitlab-org/secrets-detection-test/-/jobs/1402/artifacts/download?file_type=archive',
- fileType: 'ARCHIVE',
- __typename: 'CiJobArtifact',
- },
- {
- downloadPath:
- '/gitlab-org/secrets-detection-test/-/jobs/1402/artifacts/download?file_type=trace',
- fileType: 'TRACE',
- __typename: 'CiJobArtifact',
- },
- {
- downloadPath:
- '/gitlab-org/secrets-detection-test/-/jobs/1402/artifacts/download?file_type=metadata',
- fileType: 'METADATA',
- __typename: 'CiJobArtifact',
- },
- ],
- __typename: 'CiJobArtifactConnection',
- },
- __typename: 'CiJob',
- },
- ],
- __typename: 'CiJobConnection',
- },
- __typename: 'Pipeline',
- },
- __typename: 'MergeRequest',
- },
- __typename: 'Project',
- },
-};
-
export const securityReportPipelineDownloadPathsQueryResponse = {
project: {
id: 'project-1',
@@ -566,9 +452,6 @@ export const securityReportPipelineDownloadPathsQueryResponse = {
__typename: 'Project',
};
-/**
- * These correspond to SAST jobs in the securityReportMergeRequestDownloadPathsQueryResponse above.
- */
export const sastArtifacts = [
{
name: 'bandit-sast',
@@ -582,9 +465,6 @@ export const sastArtifacts = [
},
];
-/**
- * These correspond to Secret Detection jobs in the securityReportMergeRequestDownloadPathsQueryResponse above.
- */
export const secretDetectionArtifacts = [
{
name: 'secret_detection',
@@ -594,13 +474,6 @@ export const secretDetectionArtifacts = [
},
];
-export const expectedDownloadDropdownPropsWithTitle = {
- loading: false,
- artifacts: [...secretDetectionArtifacts, ...sastArtifacts],
- text: '',
- title: 'Download results',
-};
-
export const expectedDownloadDropdownPropsWithText = {
loading: false,
artifacts: [...secretDetectionArtifacts, ...sastArtifacts],
@@ -608,9 +481,6 @@ export const expectedDownloadDropdownPropsWithText = {
text: 'Download results',
};
-/**
- * These correspond to any jobs with zip archives in the securityReportMergeRequestDownloadPathsQueryResponse above.
- */
export const archiveArtifacts = [
{
name: 'all_artifacts Archive',
@@ -619,9 +489,6 @@ export const archiveArtifacts = [
},
];
-/**
- * These correspond to any jobs with trace data in the securityReportMergeRequestDownloadPathsQueryResponse above.
- */
export const traceArtifacts = [
{
name: 'secret_detection Trace',
@@ -645,9 +512,6 @@ export const traceArtifacts = [
},
];
-/**
- * These correspond to any jobs with metadata data in the securityReportMergeRequestDownloadPathsQueryResponse above.
- */
export const metadataArtifacts = [
{
name: 'all_artifacts Metadata',
diff --git a/spec/frontend/vue_shared/security_reports/security_reports_app_spec.js b/spec/frontend/vue_shared/security_reports/security_reports_app_spec.js
deleted file mode 100644
index 257f59612e8..00000000000
--- a/spec/frontend/vue_shared/security_reports/security_reports_app_spec.js
+++ /dev/null
@@ -1,267 +0,0 @@
-import { mount } from '@vue/test-utils';
-import MockAdapter from 'axios-mock-adapter';
-import { merge } from 'lodash';
-import Vue from 'vue';
-import VueApollo from 'vue-apollo';
-import Vuex from 'vuex';
-import createMockApollo from 'helpers/mock_apollo_helper';
-import { trimText } from 'helpers/text_helper';
-import waitForPromises from 'helpers/wait_for_promises';
-import {
- expectedDownloadDropdownPropsWithText,
- securityReportMergeRequestDownloadPathsQueryNoArtifactsResponse,
- securityReportMergeRequestDownloadPathsQueryResponse,
- sastDiffSuccessMock,
- secretDetectionDiffSuccessMock,
-} from 'jest/vue_shared/security_reports/mock_data';
-import { createAlert } from '~/alert';
-import axios from '~/lib/utils/axios_utils';
-import { HTTP_STATUS_INTERNAL_SERVER_ERROR, HTTP_STATUS_OK } from '~/lib/utils/http_status';
-import HelpIcon from '~/vue_shared/security_reports/components/help_icon.vue';
-import SecurityReportDownloadDropdown from '~/vue_shared/security_reports/components/security_report_download_dropdown.vue';
-import {
- REPORT_TYPE_SAST,
- REPORT_TYPE_SECRET_DETECTION,
-} from '~/vue_shared/security_reports/constants';
-import securityReportMergeRequestDownloadPathsQuery from '~/vue_shared/security_reports/graphql/queries/security_report_merge_request_download_paths.query.graphql';
-import SecurityReportsApp from '~/vue_shared/security_reports/security_reports_app.vue';
-
-jest.mock('~/alert');
-
-Vue.use(VueApollo);
-Vue.use(Vuex);
-
-const SAST_COMPARISON_PATH = '/sast.json';
-const SECRET_DETECTION_COMPARISON_PATH = '/secret_detection.json';
-
-describe('Security reports app', () => {
- let wrapper;
-
- const props = {
- pipelineId: 123,
- projectId: 456,
- securityReportsDocsPath: '/docs',
- discoverProjectSecurityPath: '/discoverProjectSecurityPath',
- };
-
- const createComponent = (options) => {
- wrapper = mount(
- SecurityReportsApp,
- merge(
- {
- propsData: { ...props },
- stubs: {
- HelpIcon: true,
- },
- },
- options,
- ),
- );
- };
-
- const pendingHandler = () => new Promise(() => {});
- const successHandler = () =>
- Promise.resolve({ data: securityReportMergeRequestDownloadPathsQueryResponse });
- const successEmptyHandler = () =>
- Promise.resolve({ data: securityReportMergeRequestDownloadPathsQueryNoArtifactsResponse });
- const failureHandler = () => Promise.resolve({ errors: [{ message: 'some error' }] });
- const createMockApolloProvider = (handler) => {
- const requestHandlers = [[securityReportMergeRequestDownloadPathsQuery, handler]];
-
- return createMockApollo(requestHandlers);
- };
-
- const findDownloadDropdown = () => wrapper.findComponent(SecurityReportDownloadDropdown);
- const findHelpIconComponent = () => wrapper.findComponent(HelpIcon);
-
- describe('given the artifacts query is loading', () => {
- beforeEach(() => {
- createComponent({
- apolloProvider: createMockApolloProvider(pendingHandler),
- });
- });
-
- // TODO: Remove this assertion as part of
- // https://gitlab.com/gitlab-org/gitlab/-/issues/273431
- it('initially renders nothing', () => {
- expect(wrapper.html()).toBe('');
- });
- });
-
- describe('given the artifacts query loads successfully', () => {
- beforeEach(() => {
- createComponent({
- apolloProvider: createMockApolloProvider(successHandler),
- });
- });
-
- it('renders the download dropdown', () => {
- expect(findDownloadDropdown().props()).toEqual(expectedDownloadDropdownPropsWithText);
- });
-
- it('renders the expected message', () => {
- expect(wrapper.text()).toContain(SecurityReportsApp.i18n.scansHaveRun);
- });
-
- it('renders a help link', () => {
- expect(findHelpIconComponent().props()).toEqual({
- helpPath: props.securityReportsDocsPath,
- discoverProjectSecurityPath: props.discoverProjectSecurityPath,
- });
- });
- });
-
- describe('given the artifacts query loads successfully with no artifacts', () => {
- beforeEach(() => {
- createComponent({
- apolloProvider: createMockApolloProvider(successEmptyHandler),
- });
- });
-
- // TODO: Remove this assertion as part of
- // https://gitlab.com/gitlab-org/gitlab/-/issues/273431
- it('initially renders nothing', () => {
- expect(wrapper.html()).toBe('');
- });
- });
-
- describe('given the artifacts query fails', () => {
- beforeEach(() => {
- createComponent({
- apolloProvider: createMockApolloProvider(failureHandler),
- });
- });
-
- it('calls createAlert correctly', () => {
- expect(createAlert).toHaveBeenCalledWith({
- message: SecurityReportsApp.i18n.apiError,
- captureError: true,
- error: expect.any(Error),
- });
- });
-
- // TODO: Remove this assertion as part of
- // https://gitlab.com/gitlab-org/gitlab/-/issues/273431
- it('renders nothing', () => {
- expect(wrapper.html()).toBe('');
- });
- });
-
- describe('given the coreSecurityMrWidgetCounts feature flag is enabled', () => {
- let mock;
-
- const createComponentWithFlagEnabled = (options) =>
- createComponent(
- merge(options, {
- provide: {
- glFeatures: {
- coreSecurityMrWidgetCounts: true,
- },
- },
- apolloProvider: createMockApolloProvider(successHandler),
- }),
- );
-
- beforeEach(() => {
- mock = new MockAdapter(axios);
- });
-
- afterEach(() => {
- mock.restore();
- });
-
- const SAST_SUCCESS_MESSAGE =
- 'Security scanning detected 1 potential vulnerability 1 Critical 0 High and 0 Others';
- const SECRET_DETECTION_SUCCESS_MESSAGE =
- 'Security scanning detected 2 potential vulnerabilities 1 Critical 1 High and 0 Others';
- describe.each`
- reportType | pathProp | path | successResponse | successMessage
- ${REPORT_TYPE_SAST} | ${'sastComparisonPath'} | ${SAST_COMPARISON_PATH} | ${sastDiffSuccessMock} | ${SAST_SUCCESS_MESSAGE}
- ${REPORT_TYPE_SECRET_DETECTION} | ${'secretDetectionComparisonPath'} | ${SECRET_DETECTION_COMPARISON_PATH} | ${secretDetectionDiffSuccessMock} | ${SECRET_DETECTION_SUCCESS_MESSAGE}
- `(
- 'given a $pathProp and $reportType artifact',
- ({ pathProp, path, successResponse, successMessage }) => {
- describe('when loading', () => {
- beforeEach(() => {
- mock = new MockAdapter(axios, { delayResponse: 1 });
- mock.onGet(path).replyOnce(HTTP_STATUS_OK, successResponse);
-
- createComponentWithFlagEnabled({
- propsData: {
- [pathProp]: path,
- },
- });
-
- return waitForPromises();
- });
-
- it('should have loading message', () => {
- expect(wrapper.text()).toContain('Security scanning is loading');
- });
-
- it('renders the download dropdown', () => {
- expect(findDownloadDropdown().props()).toEqual(expectedDownloadDropdownPropsWithText);
- });
- });
-
- describe('when successfully loaded', () => {
- beforeEach(() => {
- mock.onGet(path).replyOnce(HTTP_STATUS_OK, successResponse);
-
- createComponentWithFlagEnabled({
- propsData: {
- [pathProp]: path,
- },
- });
-
- return waitForPromises();
- });
-
- it('should show counts', () => {
- expect(trimText(wrapper.text())).toContain(successMessage);
- });
-
- it('renders the download dropdown', () => {
- expect(findDownloadDropdown().props()).toEqual(expectedDownloadDropdownPropsWithText);
- });
- });
-
- describe('when an error occurs', () => {
- beforeEach(() => {
- mock.onGet(path).replyOnce(HTTP_STATUS_INTERNAL_SERVER_ERROR);
-
- createComponentWithFlagEnabled({
- propsData: {
- [pathProp]: path,
- },
- });
-
- return waitForPromises();
- });
-
- it('should show error message', () => {
- expect(trimText(wrapper.text())).toContain('Loading resulted in an error');
- });
-
- it('renders the download dropdown', () => {
- expect(findDownloadDropdown().props()).toEqual(expectedDownloadDropdownPropsWithText);
- });
- });
-
- describe('when the comparison endpoint is not provided', () => {
- beforeEach(() => {
- mock.onGet(path).replyOnce(HTTP_STATUS_INTERNAL_SERVER_ERROR);
-
- createComponentWithFlagEnabled();
-
- return waitForPromises();
- });
-
- it('renders the basic scansHaveRun message', () => {
- expect(wrapper.text()).toContain(SecurityReportsApp.i18n.scansHaveRun);
- });
- });
- },
- );
- });
-});
diff --git a/spec/frontend/vue_shared/security_reports/store/getters_spec.js b/spec/frontend/vue_shared/security_reports/store/getters_spec.js
deleted file mode 100644
index bcc8955ba02..00000000000
--- a/spec/frontend/vue_shared/security_reports/store/getters_spec.js
+++ /dev/null
@@ -1,182 +0,0 @@
-import {
- groupedSummaryText,
- allReportsHaveError,
- areReportsLoading,
- anyReportHasError,
- areAllReportsLoading,
- anyReportHasIssues,
- summaryCounts,
-} from '~/vue_shared/security_reports/store/getters';
-import createSastState from '~/vue_shared/security_reports/store/modules/sast/state';
-import createSecretDetectionState from '~/vue_shared/security_reports/store/modules/secret_detection/state';
-import createState from '~/vue_shared/security_reports/store/state';
-import { groupedTextBuilder } from '~/vue_shared/security_reports/store/utils';
-import { CRITICAL, HIGH, LOW } from '~/vulnerabilities/constants';
-
-const generateVuln = (severity) => ({ severity });
-
-describe('Security reports getters', () => {
- let state;
-
- beforeEach(() => {
- state = createState();
- state.sast = createSastState();
- state.secretDetection = createSecretDetectionState();
- });
-
- describe('summaryCounts', () => {
- it('returns 0 count for empty state', () => {
- expect(summaryCounts(state)).toEqual({
- critical: 0,
- high: 0,
- other: 0,
- });
- });
-
- describe('combines all reports', () => {
- it('of the same severity', () => {
- state.sast.newIssues = [generateVuln(CRITICAL)];
- state.secretDetection.newIssues = [generateVuln(CRITICAL)];
-
- expect(summaryCounts(state)).toEqual({
- critical: 2,
- high: 0,
- other: 0,
- });
- });
-
- it('of different severities', () => {
- state.sast.newIssues = [generateVuln(CRITICAL)];
- state.secretDetection.newIssues = [generateVuln(HIGH), generateVuln(LOW)];
-
- expect(summaryCounts(state)).toEqual({
- critical: 1,
- high: 1,
- other: 1,
- });
- });
- });
- });
-
- describe('groupedSummaryText', () => {
- it('returns failed text', () => {
- expect(
- groupedSummaryText(state, {
- allReportsHaveError: true,
- areReportsLoading: false,
- summaryCounts: {},
- }),
- ).toEqual({ message: 'Security scanning failed loading any results' });
- });
-
- it('returns `is loading` as status text', () => {
- expect(
- groupedSummaryText(state, {
- allReportsHaveError: false,
- areReportsLoading: true,
- summaryCounts: {},
- }),
- ).toEqual(
- groupedTextBuilder({
- reportType: 'Security scanning',
- critical: 0,
- high: 0,
- other: 0,
- status: 'is loading',
- }),
- );
- });
-
- it('returns no new status text if there are existing ones', () => {
- expect(
- groupedSummaryText(state, {
- allReportsHaveError: false,
- areReportsLoading: false,
- summaryCounts: {},
- }),
- ).toEqual(
- groupedTextBuilder({
- reportType: 'Security scanning',
- critical: 0,
- high: 0,
- other: 0,
- status: '',
- }),
- );
- });
- });
-
- describe('areReportsLoading', () => {
- it('returns true when any report is loading', () => {
- state.sast.isLoading = true;
-
- expect(areReportsLoading(state)).toEqual(true);
- });
-
- it('returns false when none of the reports are loading', () => {
- expect(areReportsLoading(state)).toEqual(false);
- });
- });
-
- describe('areAllReportsLoading', () => {
- it('returns true when all reports are loading', () => {
- state.sast.isLoading = true;
- state.secretDetection.isLoading = true;
-
- expect(areAllReportsLoading(state)).toEqual(true);
- });
-
- it('returns false when some of the reports are loading', () => {
- state.sast.isLoading = true;
-
- expect(areAllReportsLoading(state)).toEqual(false);
- });
-
- it('returns false when none of the reports are loading', () => {
- expect(areAllReportsLoading(state)).toEqual(false);
- });
- });
-
- describe('allReportsHaveError', () => {
- it('returns true when all reports have error', () => {
- state.sast.hasError = true;
- state.secretDetection.hasError = true;
-
- expect(allReportsHaveError(state)).toEqual(true);
- });
-
- it('returns false when none of the reports have error', () => {
- expect(allReportsHaveError(state)).toEqual(false);
- });
-
- it('returns false when one of the reports does not have error', () => {
- state.secretDetection.hasError = true;
-
- expect(allReportsHaveError(state)).toEqual(false);
- });
- });
-
- describe('anyReportHasError', () => {
- it('returns true when any of the reports has error', () => {
- state.sast.hasError = true;
-
- expect(anyReportHasError(state)).toEqual(true);
- });
-
- it('returns false when none of the reports has error', () => {
- expect(anyReportHasError(state)).toEqual(false);
- });
- });
-
- describe('anyReportHasIssues', () => {
- it('returns true when any of the reports has new issues', () => {
- state.sast.newIssues.push(generateVuln(LOW));
-
- expect(anyReportHasIssues(state)).toEqual(true);
- });
-
- it('returns false when none of the reports has error', () => {
- expect(anyReportHasIssues(state)).toEqual(false);
- });
- });
-});
diff --git a/spec/frontend/vue_shared/security_reports/store/modules/sast/actions_spec.js b/spec/frontend/vue_shared/security_reports/store/modules/sast/actions_spec.js
deleted file mode 100644
index 0cab950cb77..00000000000
--- a/spec/frontend/vue_shared/security_reports/store/modules/sast/actions_spec.js
+++ /dev/null
@@ -1,197 +0,0 @@
-import MockAdapter from 'axios-mock-adapter';
-import testAction from 'helpers/vuex_action_helper';
-
-import axios from '~/lib/utils/axios_utils';
-import { HTTP_STATUS_NOT_FOUND, HTTP_STATUS_OK } from '~/lib/utils/http_status';
-import * as actions from '~/vue_shared/security_reports/store/modules/sast/actions';
-import * as types from '~/vue_shared/security_reports/store/modules/sast/mutation_types';
-import createState from '~/vue_shared/security_reports/store/modules/sast/state';
-
-const diffEndpoint = 'diff-endpoint.json';
-const blobPath = 'blob-path.json';
-const reports = {
- base: 'base',
- head: 'head',
- enrichData: 'enrichData',
- diff: 'diff',
-};
-const error = 'Something went wrong';
-const vulnerabilityFeedbackPath = 'vulnerability-feedback-path';
-const rootState = { vulnerabilityFeedbackPath, blobPath };
-
-let state;
-
-describe('sast report actions', () => {
- beforeEach(() => {
- state = createState();
- });
-
- describe('setDiffEndpoint', () => {
- it(`should commit ${types.SET_DIFF_ENDPOINT} with the correct path`, () => {
- return testAction(
- actions.setDiffEndpoint,
- diffEndpoint,
- state,
- [
- {
- type: types.SET_DIFF_ENDPOINT,
- payload: diffEndpoint,
- },
- ],
- [],
- );
- });
- });
-
- describe('requestDiff', () => {
- it(`should commit ${types.REQUEST_DIFF}`, () => {
- return testAction(actions.requestDiff, {}, state, [{ type: types.REQUEST_DIFF }], []);
- });
- });
-
- describe('receiveDiffSuccess', () => {
- it(`should commit ${types.RECEIVE_DIFF_SUCCESS} with the correct response`, () => {
- return testAction(
- actions.receiveDiffSuccess,
- reports,
- state,
- [
- {
- type: types.RECEIVE_DIFF_SUCCESS,
- payload: reports,
- },
- ],
- [],
- );
- });
- });
-
- describe('receiveDiffError', () => {
- it(`should commit ${types.RECEIVE_DIFF_ERROR} with the correct response`, () => {
- return testAction(
- actions.receiveDiffError,
- error,
- state,
- [
- {
- type: types.RECEIVE_DIFF_ERROR,
- payload: error,
- },
- ],
- [],
- );
- });
- });
-
- describe('fetchDiff', () => {
- let mock;
-
- beforeEach(() => {
- mock = new MockAdapter(axios);
- state.paths.diffEndpoint = diffEndpoint;
- rootState.canReadVulnerabilityFeedback = true;
- });
-
- afterEach(() => {
- mock.restore();
- });
-
- describe('when diff and vulnerability feedback endpoints respond successfully', () => {
- beforeEach(() => {
- mock
- .onGet(diffEndpoint)
- .replyOnce(HTTP_STATUS_OK, reports.diff)
- .onGet(vulnerabilityFeedbackPath)
- .replyOnce(HTTP_STATUS_OK, reports.enrichData);
- });
-
- it('should dispatch the `receiveDiffSuccess` action', () => {
- const { diff, enrichData } = reports;
- return testAction(
- actions.fetchDiff,
- {},
- { ...rootState, ...state },
- [],
- [
- { type: 'requestDiff' },
- {
- type: 'receiveDiffSuccess',
- payload: {
- diff,
- enrichData,
- },
- },
- ],
- );
- });
- });
-
- describe('when diff endpoint responds successfully and fetching vulnerability feedback is not authorized', () => {
- beforeEach(() => {
- rootState.canReadVulnerabilityFeedback = false;
- mock.onGet(diffEndpoint).replyOnce(HTTP_STATUS_OK, reports.diff);
- });
-
- it('should dispatch the `receiveDiffSuccess` action with empty enrich data', () => {
- const { diff } = reports;
- const enrichData = [];
- return testAction(
- actions.fetchDiff,
- {},
- { ...rootState, ...state },
- [],
- [
- { type: 'requestDiff' },
- {
- type: 'receiveDiffSuccess',
- payload: {
- diff,
- enrichData,
- },
- },
- ],
- );
- });
- });
-
- describe('when the vulnerability feedback endpoint fails', () => {
- beforeEach(() => {
- mock
- .onGet(diffEndpoint)
- .replyOnce(HTTP_STATUS_OK, reports.diff)
- .onGet(vulnerabilityFeedbackPath)
- .replyOnce(HTTP_STATUS_NOT_FOUND);
- });
-
- it('should dispatch the `receiveError` action', () => {
- return testAction(
- actions.fetchDiff,
- {},
- { ...rootState, ...state },
- [],
- [{ type: 'requestDiff' }, { type: 'receiveDiffError' }],
- );
- });
- });
-
- describe('when the diff endpoint fails', () => {
- beforeEach(() => {
- mock
- .onGet(diffEndpoint)
- .replyOnce(HTTP_STATUS_NOT_FOUND)
- .onGet(vulnerabilityFeedbackPath)
- .replyOnce(HTTP_STATUS_OK, reports.enrichData);
- });
-
- it('should dispatch the `receiveDiffError` action', () => {
- return testAction(
- actions.fetchDiff,
- {},
- { ...rootState, ...state },
- [],
- [{ type: 'requestDiff' }, { type: 'receiveDiffError' }],
- );
- });
- });
- });
-});
diff --git a/spec/frontend/vue_shared/security_reports/store/modules/sast/mutations_spec.js b/spec/frontend/vue_shared/security_reports/store/modules/sast/mutations_spec.js
deleted file mode 100644
index d6119f44619..00000000000
--- a/spec/frontend/vue_shared/security_reports/store/modules/sast/mutations_spec.js
+++ /dev/null
@@ -1,84 +0,0 @@
-import * as types from '~/vue_shared/security_reports/store/modules/sast/mutation_types';
-import mutations from '~/vue_shared/security_reports/store/modules/sast/mutations';
-import createState from '~/vue_shared/security_reports/store/modules/sast/state';
-
-const createIssue = ({ ...config }) => ({ changed: false, ...config });
-
-describe('sast module mutations', () => {
- const path = 'path';
- let state;
-
- beforeEach(() => {
- state = createState();
- });
-
- describe(types.SET_DIFF_ENDPOINT, () => {
- it('should set the SAST diff endpoint', () => {
- mutations[types.SET_DIFF_ENDPOINT](state, path);
-
- expect(state.paths.diffEndpoint).toBe(path);
- });
- });
-
- describe(types.REQUEST_DIFF, () => {
- it('should set the `isLoading` status to `true`', () => {
- mutations[types.REQUEST_DIFF](state);
-
- expect(state.isLoading).toBe(true);
- });
- });
-
- describe(types.RECEIVE_DIFF_SUCCESS, () => {
- beforeEach(() => {
- const reports = {
- diff: {
- added: [
- createIssue({ cve: 'CVE-1' }),
- createIssue({ cve: 'CVE-2' }),
- createIssue({ cve: 'CVE-3' }),
- ],
- fixed: [createIssue({ cve: 'CVE-4' }), createIssue({ cve: 'CVE-5' })],
- existing: [createIssue({ cve: 'CVE-6' })],
- base_report_out_of_date: true,
- },
- };
- state.isLoading = true;
- mutations[types.RECEIVE_DIFF_SUCCESS](state, reports);
- });
-
- it('should set the `isLoading` status to `false`', () => {
- expect(state.isLoading).toBe(false);
- });
-
- it('should set the `baseReportOutofDate` status to `false`', () => {
- expect(state.baseReportOutofDate).toBe(true);
- });
-
- it('should have the relevant `new` issues', () => {
- expect(state.newIssues).toHaveLength(3);
- });
-
- it('should have the relevant `resolved` issues', () => {
- expect(state.resolvedIssues).toHaveLength(2);
- });
-
- it('should have the relevant `all` issues', () => {
- expect(state.allIssues).toHaveLength(1);
- });
- });
-
- describe(types.RECEIVE_DIFF_ERROR, () => {
- beforeEach(() => {
- state.isLoading = true;
- mutations[types.RECEIVE_DIFF_ERROR](state);
- });
-
- it('should set the `isLoading` status to `false`', () => {
- expect(state.isLoading).toBe(false);
- });
-
- it('should set the `hasError` status to `true`', () => {
- expect(state.hasError).toBe(true);
- });
- });
-});
diff --git a/spec/frontend/vue_shared/security_reports/store/modules/secret_detection/actions_spec.js b/spec/frontend/vue_shared/security_reports/store/modules/secret_detection/actions_spec.js
deleted file mode 100644
index 7197784c3e8..00000000000
--- a/spec/frontend/vue_shared/security_reports/store/modules/secret_detection/actions_spec.js
+++ /dev/null
@@ -1,198 +0,0 @@
-import MockAdapter from 'axios-mock-adapter';
-import testAction from 'helpers/vuex_action_helper';
-
-import axios from '~/lib/utils/axios_utils';
-import { HTTP_STATUS_NOT_FOUND, HTTP_STATUS_OK } from '~/lib/utils/http_status';
-import * as actions from '~/vue_shared/security_reports/store/modules/secret_detection/actions';
-import * as types from '~/vue_shared/security_reports/store/modules/secret_detection/mutation_types';
-import createState from '~/vue_shared/security_reports/store/modules/secret_detection/state';
-
-const diffEndpoint = 'diff-endpoint.json';
-const blobPath = 'blob-path.json';
-const reports = {
- base: 'base',
- head: 'head',
- enrichData: 'enrichData',
- diff: 'diff',
-};
-const error = 'Something went wrong';
-const vulnerabilityFeedbackPath = 'vulnerability-feedback-path';
-const rootState = { vulnerabilityFeedbackPath, blobPath };
-
-let state;
-
-describe('secret detection report actions', () => {
- beforeEach(() => {
- state = createState();
- });
-
- describe('setDiffEndpoint', () => {
- it(`should commit ${types.SET_DIFF_ENDPOINT} with the correct path`, () => {
- return testAction(
- actions.setDiffEndpoint,
- diffEndpoint,
- state,
- [
- {
- type: types.SET_DIFF_ENDPOINT,
- payload: diffEndpoint,
- },
- ],
- [],
- );
- });
- });
-
- describe('requestDiff', () => {
- it(`should commit ${types.REQUEST_DIFF}`, () => {
- return testAction(actions.requestDiff, {}, state, [{ type: types.REQUEST_DIFF }], []);
- });
- });
-
- describe('receiveDiffSuccess', () => {
- it(`should commit ${types.RECEIVE_DIFF_SUCCESS} with the correct response`, () => {
- return testAction(
- actions.receiveDiffSuccess,
- reports,
- state,
- [
- {
- type: types.RECEIVE_DIFF_SUCCESS,
- payload: reports,
- },
- ],
- [],
- );
- });
- });
-
- describe('receiveDiffError', () => {
- it(`should commit ${types.RECEIVE_DIFF_ERROR} with the correct response`, () => {
- return testAction(
- actions.receiveDiffError,
- error,
- state,
- [
- {
- type: types.RECEIVE_DIFF_ERROR,
- payload: error,
- },
- ],
- [],
- );
- });
- });
-
- describe('fetchDiff', () => {
- let mock;
-
- beforeEach(() => {
- mock = new MockAdapter(axios);
- state.paths.diffEndpoint = diffEndpoint;
- rootState.canReadVulnerabilityFeedback = true;
- });
-
- afterEach(() => {
- mock.restore();
- });
-
- describe('when diff and vulnerability feedback endpoints respond successfully', () => {
- beforeEach(() => {
- mock
- .onGet(diffEndpoint)
- .replyOnce(HTTP_STATUS_OK, reports.diff)
- .onGet(vulnerabilityFeedbackPath)
- .replyOnce(HTTP_STATUS_OK, reports.enrichData);
- });
-
- it('should dispatch the `receiveDiffSuccess` action', () => {
- const { diff, enrichData } = reports;
-
- return testAction(
- actions.fetchDiff,
- {},
- { ...rootState, ...state },
- [],
- [
- { type: 'requestDiff' },
- {
- type: 'receiveDiffSuccess',
- payload: {
- diff,
- enrichData,
- },
- },
- ],
- );
- });
- });
-
- describe('when diff endpoint responds successfully and fetching vulnerability feedback is not authorized', () => {
- beforeEach(() => {
- rootState.canReadVulnerabilityFeedback = false;
- mock.onGet(diffEndpoint).replyOnce(HTTP_STATUS_OK, reports.diff);
- });
-
- it('should dispatch the `receiveDiffSuccess` action with empty enrich data', () => {
- const { diff } = reports;
- const enrichData = [];
- return testAction(
- actions.fetchDiff,
- {},
- { ...rootState, ...state },
- [],
- [
- { type: 'requestDiff' },
- {
- type: 'receiveDiffSuccess',
- payload: {
- diff,
- enrichData,
- },
- },
- ],
- );
- });
- });
-
- describe('when the vulnerability feedback endpoint fails', () => {
- beforeEach(() => {
- mock
- .onGet(diffEndpoint)
- .replyOnce(HTTP_STATUS_OK, reports.diff)
- .onGet(vulnerabilityFeedbackPath)
- .replyOnce(HTTP_STATUS_NOT_FOUND);
- });
-
- it('should dispatch the `receiveDiffError` action', () => {
- return testAction(
- actions.fetchDiff,
- {},
- { ...rootState, ...state },
- [],
- [{ type: 'requestDiff' }, { type: 'receiveDiffError' }],
- );
- });
- });
-
- describe('when the diff endpoint fails', () => {
- beforeEach(() => {
- mock
- .onGet(diffEndpoint)
- .replyOnce(HTTP_STATUS_NOT_FOUND)
- .onGet(vulnerabilityFeedbackPath)
- .replyOnce(HTTP_STATUS_OK, reports.enrichData);
- });
-
- it('should dispatch the `receiveDiffError` action', () => {
- return testAction(
- actions.fetchDiff,
- {},
- { ...rootState, ...state },
- [],
- [{ type: 'requestDiff' }, { type: 'receiveDiffError' }],
- );
- });
- });
- });
-});
diff --git a/spec/frontend/vue_shared/security_reports/store/modules/secret_detection/mutations_spec.js b/spec/frontend/vue_shared/security_reports/store/modules/secret_detection/mutations_spec.js
deleted file mode 100644
index 42da7476a40..00000000000
--- a/spec/frontend/vue_shared/security_reports/store/modules/secret_detection/mutations_spec.js
+++ /dev/null
@@ -1,84 +0,0 @@
-import * as types from '~/vue_shared/security_reports/store/modules/secret_detection/mutation_types';
-import mutations from '~/vue_shared/security_reports/store/modules/secret_detection/mutations';
-import createState from '~/vue_shared/security_reports/store/modules/secret_detection/state';
-
-const createIssue = ({ ...config }) => ({ changed: false, ...config });
-
-describe('secret detection module mutations', () => {
- const path = 'path';
- let state;
-
- beforeEach(() => {
- state = createState();
- });
-
- describe(types.SET_DIFF_ENDPOINT, () => {
- it('should set the secret detection diff endpoint', () => {
- mutations[types.SET_DIFF_ENDPOINT](state, path);
-
- expect(state.paths.diffEndpoint).toBe(path);
- });
- });
-
- describe(types.REQUEST_DIFF, () => {
- it('should set the `isLoading` status to `true`', () => {
- mutations[types.REQUEST_DIFF](state);
-
- expect(state.isLoading).toBe(true);
- });
- });
-
- describe(types.RECEIVE_DIFF_SUCCESS, () => {
- beforeEach(() => {
- const reports = {
- diff: {
- added: [
- createIssue({ cve: 'CVE-1' }),
- createIssue({ cve: 'CVE-2' }),
- createIssue({ cve: 'CVE-3' }),
- ],
- fixed: [createIssue({ cve: 'CVE-4' }), createIssue({ cve: 'CVE-5' })],
- existing: [createIssue({ cve: 'CVE-6' })],
- base_report_out_of_date: true,
- },
- };
- state.isLoading = true;
- mutations[types.RECEIVE_DIFF_SUCCESS](state, reports);
- });
-
- it('should set the `isLoading` status to `false`', () => {
- expect(state.isLoading).toBe(false);
- });
-
- it('should set the `baseReportOutofDate` status to `true`', () => {
- expect(state.baseReportOutofDate).toBe(true);
- });
-
- it('should have the relevant `new` issues', () => {
- expect(state.newIssues).toHaveLength(3);
- });
-
- it('should have the relevant `resolved` issues', () => {
- expect(state.resolvedIssues).toHaveLength(2);
- });
-
- it('should have the relevant `all` issues', () => {
- expect(state.allIssues).toHaveLength(1);
- });
- });
-
- describe(types.RECEIVE_DIFF_ERROR, () => {
- beforeEach(() => {
- state.isLoading = true;
- mutations[types.RECEIVE_DIFF_ERROR](state);
- });
-
- it('should set the `isLoading` status to `false`', () => {
- expect(state.isLoading).toBe(false);
- });
-
- it('should set the `hasError` status to `true`', () => {
- expect(state.hasError).toBe(true);
- });
- });
-});
diff --git a/spec/frontend/vue_shared/security_reports/store/utils_spec.js b/spec/frontend/vue_shared/security_reports/store/utils_spec.js
deleted file mode 100644
index c8750cd58a0..00000000000
--- a/spec/frontend/vue_shared/security_reports/store/utils_spec.js
+++ /dev/null
@@ -1,63 +0,0 @@
-import { enrichVulnerabilityWithFeedback } from '~/vue_shared/security_reports/store/utils';
-import {
- FEEDBACK_TYPE_DISMISSAL,
- FEEDBACK_TYPE_ISSUE,
- FEEDBACK_TYPE_MERGE_REQUEST,
-} from '~/vue_shared/security_reports/constants';
-
-describe('security reports store utils', () => {
- const vulnerability = { uuid: 1 };
-
- describe('enrichVulnerabilityWithFeedback', () => {
- const dismissalFeedback = {
- feedback_type: FEEDBACK_TYPE_DISMISSAL,
- finding_uuid: vulnerability.uuid,
- };
- const dismissalVuln = { ...vulnerability, isDismissed: true, dismissalFeedback };
-
- const issueFeedback = {
- feedback_type: FEEDBACK_TYPE_ISSUE,
- issue_iid: 1,
- finding_uuid: vulnerability.uuid,
- };
- const issueVuln = { ...vulnerability, hasIssue: true, issue_feedback: issueFeedback };
- const mrFeedback = {
- feedback_type: FEEDBACK_TYPE_MERGE_REQUEST,
- merge_request_iid: 1,
- finding_uuid: vulnerability.uuid,
- };
- const mrVuln = {
- ...vulnerability,
- hasMergeRequest: true,
- merge_request_feedback: mrFeedback,
- };
-
- it.each`
- feedbacks | expected
- ${[dismissalFeedback]} | ${dismissalVuln}
- ${[{ ...issueFeedback, issue_iid: null }]} | ${vulnerability}
- ${[issueFeedback]} | ${issueVuln}
- ${[{ ...mrFeedback, merge_request_iid: null }]} | ${vulnerability}
- ${[mrFeedback]} | ${mrVuln}
- ${[dismissalFeedback, issueFeedback, mrFeedback]} | ${{ ...dismissalVuln, ...issueVuln, ...mrVuln }}
- `('returns expected enriched vulnerability: $expected', ({ feedbacks, expected }) => {
- const enrichedVulnerability = enrichVulnerabilityWithFeedback(vulnerability, feedbacks);
-
- expect(enrichedVulnerability).toEqual(expected);
- });
-
- it('matches correct feedback objects to vulnerability', () => {
- const feedbacks = [
- dismissalFeedback,
- issueFeedback,
- mrFeedback,
- { ...dismissalFeedback, finding_uuid: 2 },
- { ...issueFeedback, finding_uuid: 2 },
- { ...mrFeedback, finding_uuid: 2 },
- ];
- const enrichedVulnerability = enrichVulnerabilityWithFeedback(vulnerability, feedbacks);
-
- expect(enrichedVulnerability).toEqual({ ...dismissalVuln, ...issueVuln, ...mrVuln });
- });
- });
-});
diff --git a/spec/frontend/vue_shared/security_reports/utils_spec.js b/spec/frontend/vue_shared/security_reports/utils_spec.js
deleted file mode 100644
index b7129ece698..00000000000
--- a/spec/frontend/vue_shared/security_reports/utils_spec.js
+++ /dev/null
@@ -1,48 +0,0 @@
-import {
- REPORT_TYPE_SAST,
- REPORT_TYPE_SECRET_DETECTION,
- REPORT_FILE_TYPES,
-} from '~/vue_shared/security_reports/constants';
-import {
- extractSecurityReportArtifactsFromMergeRequest,
- extractSecurityReportArtifactsFromPipeline,
-} from '~/vue_shared/security_reports/utils';
-import {
- securityReportMergeRequestDownloadPathsQueryResponse,
- securityReportPipelineDownloadPathsQueryResponse,
- sastArtifacts,
- secretDetectionArtifacts,
- archiveArtifacts,
- traceArtifacts,
- metadataArtifacts,
-} from './mock_data';
-
-describe.each([
- [
- 'extractSecurityReportArtifactsFromMergeRequest',
- extractSecurityReportArtifactsFromMergeRequest,
- securityReportMergeRequestDownloadPathsQueryResponse,
- ],
- [
- 'extractSecurityReportArtifactsFromPipelines',
- extractSecurityReportArtifactsFromPipeline,
- securityReportPipelineDownloadPathsQueryResponse,
- ],
-])('%s', (funcName, extractFunc, response) => {
- it.each`
- reportTypes | expectedArtifacts
- ${[]} | ${[]}
- ${['foo']} | ${[]}
- ${[REPORT_TYPE_SAST]} | ${sastArtifacts}
- ${[REPORT_TYPE_SECRET_DETECTION]} | ${secretDetectionArtifacts}
- ${[REPORT_TYPE_SAST, REPORT_TYPE_SECRET_DETECTION]} | ${[...secretDetectionArtifacts, ...sastArtifacts]}
- ${[REPORT_FILE_TYPES.ARCHIVE]} | ${archiveArtifacts}
- ${[REPORT_FILE_TYPES.TRACE]} | ${traceArtifacts}
- ${[REPORT_FILE_TYPES.METADATA]} | ${metadataArtifacts}
- `(
- 'returns the expected artifacts given report types $reportTypes',
- ({ reportTypes, expectedArtifacts }) => {
- expect(extractFunc(reportTypes, response)).toEqual(expectedArtifacts);
- },
- );
-});
diff --git a/spec/frontend/work_items/components/notes/work_item_note_actions_spec.js b/spec/frontend/work_items/components/notes/work_item_note_actions_spec.js
index 2e901783e07..e4180b2d178 100644
--- a/spec/frontend/work_items/components/notes/work_item_note_actions_spec.js
+++ b/spec/frontend/work_items/components/notes/work_item_note_actions_spec.js
@@ -1,11 +1,10 @@
import { GlDisclosureDropdown } 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 { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import { createMockDirective } from 'helpers/vue_mock_directive';
-import EmojiPicker from '~/emoji/components/picker.vue';
-import waitForPromises from 'helpers/wait_for_promises';
+import { stubComponent } from 'helpers/stub_component';
import ReplyButton from '~/notes/components/note_actions/reply_button.vue';
import WorkItemNoteActions from '~/work_items/components/notes/work_item_note_actions.vue';
import addAwardEmojiMutation from '~/work_items/graphql/notes/work_item_note_add_award_emoji.mutation.graphql';
@@ -15,18 +14,19 @@ Vue.use(VueApollo);
describe('Work Item Note Actions', () => {
let wrapper;
const noteId = '1';
+ const showSpy = jest.fn();
const findReplyButton = () => wrapper.findComponent(ReplyButton);
- const findEditButton = () => wrapper.find('[data-testid="edit-work-item-note"]');
- const findEmojiButton = () => wrapper.find('[data-testid="note-emoji-button"]');
+ const findEditButton = () => wrapper.findByTestId('edit-work-item-note');
+ const findEmojiButton = () => wrapper.findByTestId('note-emoji-button');
const findDropdown = () => wrapper.findComponent(GlDisclosureDropdown);
- const findDeleteNoteButton = () => wrapper.find('[data-testid="delete-note-action"]');
- const findCopyLinkButton = () => wrapper.find('[data-testid="copy-link-action"]');
- const findAssignUnassignButton = () => wrapper.find('[data-testid="assign-note-action"]');
- const findReportAbuseToAdminButton = () => wrapper.find('[data-testid="abuse-note-action"]');
- const findAuthorBadge = () => wrapper.find('[data-testid="author-badge"]');
- const findMaxAccessLevelBadge = () => wrapper.find('[data-testid="max-access-level-badge"]');
- const findContributorBadge = () => wrapper.find('[data-testid="contributor-badge"]');
+ const findDeleteNoteButton = () => wrapper.findByTestId('delete-note-action');
+ const findCopyLinkButton = () => wrapper.findByTestId('copy-link-action');
+ const findAssignUnassignButton = () => wrapper.findByTestId('assign-note-action');
+ const findReportAbuseToAdminButton = () => wrapper.findByTestId('abuse-note-action');
+ const findAuthorBadge = () => wrapper.findByTestId('author-badge');
+ const findMaxAccessLevelBadge = () => wrapper.findByTestId('max-access-level-badge');
+ const findContributorBadge = () => wrapper.findByTestId('contributor-badge');
const addEmojiMutationResolver = jest.fn().mockResolvedValue({
data: {
@@ -34,11 +34,6 @@ describe('Work Item Note Actions', () => {
},
});
- const EmojiPickerStub = {
- props: EmojiPicker.props,
- template: '<div></div>',
- };
-
const createComponent = ({
showReply = true,
showEdit = true,
@@ -51,10 +46,12 @@ describe('Work Item Note Actions', () => {
maxAccessLevelOfAuthor = '',
projectName = 'Project name',
} = {}) => {
- wrapper = shallowMount(WorkItemNoteActions, {
+ wrapper = shallowMountExtended(WorkItemNoteActions, {
propsData: {
showReply,
showEdit,
+ workItemIid: '1',
+ note: {},
noteId,
showAwardEmoji,
showAssignUnassign,
@@ -66,21 +63,27 @@ describe('Work Item Note Actions', () => {
projectName,
},
provide: {
+ fullPath: 'gitlab-org',
glFeatures: {
workItemsMvc2: true,
},
},
stubs: {
- EmojiPicker: EmojiPickerStub,
+ GlDisclosureDropdown: stubComponent(GlDisclosureDropdown, {
+ methods: { close: showSpy },
+ }),
},
apolloProvider: createMockApollo([[addAwardEmojiMutation, addEmojiMutationResolver]]),
directives: {
GlTooltip: createMockDirective('gl-tooltip'),
},
});
- wrapper.vm.$refs.dropdown.close = jest.fn();
};
+ afterEach(() => {
+ showSpy.mockClear();
+ });
+
describe('reply button', () => {
it('is visible by default', () => {
createComponent();
@@ -128,22 +131,6 @@ describe('Work Item Note Actions', () => {
expect(findEmojiButton().exists()).toBe(false);
});
-
- it('commits mutation on click', async () => {
- const awardName = 'carrot';
-
- createComponent();
-
- findEmojiButton().vm.$emit('click', awardName);
-
- await waitForPromises();
-
- expect(findEmojiButton().emitted('errors')).toEqual(undefined);
- expect(addEmojiMutationResolver).toHaveBeenCalledWith({
- awardableId: noteId,
- name: awardName,
- });
- });
});
describe('delete note', () => {
@@ -173,6 +160,7 @@ describe('Work Item Note Actions', () => {
findDeleteNoteButton().vm.$emit('action');
expect(wrapper.emitted('deleteNote')).toEqual([[]]);
+ expect(showSpy).toHaveBeenCalled();
});
});
@@ -188,6 +176,7 @@ describe('Work Item Note Actions', () => {
findCopyLinkButton().vm.$emit('action');
expect(wrapper.emitted('notifyCopyDone')).toEqual([[]]);
+ expect(showSpy).toHaveBeenCalled();
});
});
@@ -214,6 +203,7 @@ describe('Work Item Note Actions', () => {
findAssignUnassignButton().vm.$emit('action');
expect(wrapper.emitted('assignUser')).toEqual([[]]);
+ expect(showSpy).toHaveBeenCalled();
});
});
@@ -240,6 +230,7 @@ describe('Work Item Note Actions', () => {
findReportAbuseToAdminButton().vm.$emit('action');
expect(wrapper.emitted('reportAbuse')).toEqual([[]]);
+ expect(showSpy).toHaveBeenCalled();
});
});
diff --git a/spec/frontend/work_items/components/notes/work_item_note_awards_list_spec.js b/spec/frontend/work_items/components/notes/work_item_note_awards_list_spec.js
new file mode 100644
index 00000000000..d425f1e50dc
--- /dev/null
+++ b/spec/frontend/work_items/components/notes/work_item_note_awards_list_spec.js
@@ -0,0 +1,147 @@
+import { shallowMount } from '@vue/test-utils';
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import mockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
+import { __ } from '~/locale';
+import AwardsList from '~/vue_shared/components/awards_list.vue';
+import WorkItemNoteAwardsList from '~/work_items/components/notes/work_item_note_awards_list.vue';
+import addAwardEmojiMutation from '~/work_items/graphql/notes/work_item_note_add_award_emoji.mutation.graphql';
+import removeAwardEmojiMutation from '~/work_items/graphql/notes/work_item_note_remove_award_emoji.mutation.graphql';
+import workItemNotesByIidQuery from '~/work_items/graphql/notes/work_item_notes_by_iid.query.graphql';
+import {
+ mockWorkItemNotesResponseWithComments,
+ mockAwardEmojiThumbsUp,
+} from 'jest/work_items/mock_data';
+import { EMOJI_THUMBSUP, EMOJI_THUMBSDOWN } from '~/work_items/constants';
+
+Vue.use(VueApollo);
+
+describe('Work Item Note Awards List', () => {
+ let wrapper;
+ const workItem = mockWorkItemNotesResponseWithComments.data.workspace.workItems.nodes[0];
+ const firstNote = workItem.widgets.find((w) => w.type === 'NOTES').discussions.nodes[0].notes
+ .nodes[0];
+ const fullPath = 'test-project-path';
+ const workItemIid = workItem.iid;
+ const currentUserId = getIdFromGraphQLId(mockAwardEmojiThumbsUp.user.id);
+
+ const addAwardEmojiMutationSuccessHandler = jest.fn().mockResolvedValue({
+ data: {
+ awardEmojiAdd: {
+ errors: [],
+ },
+ },
+ });
+ const removeAwardEmojiMutationSuccessHandler = jest.fn().mockResolvedValue({
+ data: {
+ awardEmojiRemove: {
+ errors: [],
+ },
+ },
+ });
+
+ const findAwardsList = () => wrapper.findComponent(AwardsList);
+
+ const createComponent = ({
+ note = firstNote,
+ addAwardEmojiMutationHandler = addAwardEmojiMutationSuccessHandler,
+ removeAwardEmojiMutationHandler = removeAwardEmojiMutationSuccessHandler,
+ } = {}) => {
+ const apolloProvider = mockApollo([
+ [addAwardEmojiMutation, addAwardEmojiMutationHandler],
+ [removeAwardEmojiMutation, removeAwardEmojiMutationHandler],
+ ]);
+
+ apolloProvider.clients.defaultClient.writeQuery({
+ query: workItemNotesByIidQuery,
+ variables: { fullPath, iid: workItemIid },
+ ...mockWorkItemNotesResponseWithComments,
+ });
+
+ wrapper = shallowMount(WorkItemNoteAwardsList, {
+ provide: {
+ fullPath,
+ },
+ propsData: {
+ workItemIid,
+ note,
+ isModal: false,
+ },
+ apolloProvider,
+ });
+ };
+
+ beforeEach(() => {
+ window.gon.current_user_id = currentUserId;
+ });
+
+ describe('when not editing', () => {
+ it.each([true, false])('passes emoji permission to awards-list', (hasAwardEmojiPermission) => {
+ const note = {
+ ...firstNote,
+ userPermissions: {
+ ...firstNote.userPermissions,
+ awardEmoji: hasAwardEmojiPermission,
+ },
+ };
+ createComponent({ note });
+
+ expect(findAwardsList().props('canAwardEmoji')).toBe(hasAwardEmojiPermission);
+ });
+
+ it('adds award if not already awarded', async () => {
+ createComponent();
+ await waitForPromises();
+
+ findAwardsList().vm.$emit('award', EMOJI_THUMBSUP);
+
+ expect(addAwardEmojiMutationSuccessHandler).toHaveBeenCalledWith({
+ awardableId: firstNote.id,
+ name: EMOJI_THUMBSUP,
+ });
+ });
+
+ it('emits error if awarding emoji fails', async () => {
+ createComponent({
+ addAwardEmojiMutationHandler: jest.fn().mockRejectedValue('oh no'),
+ });
+ await waitForPromises();
+
+ findAwardsList().vm.$emit('award', EMOJI_THUMBSUP);
+
+ await waitForPromises();
+
+ expect(wrapper.emitted('error')).toEqual([[__('Failed to add emoji. Please try again')]]);
+ });
+
+ it('removes award if already awarded', async () => {
+ const removeAwardEmojiMutationHandler = removeAwardEmojiMutationSuccessHandler;
+
+ createComponent({ removeAwardEmojiMutationHandler });
+
+ findAwardsList().vm.$emit('award', EMOJI_THUMBSDOWN);
+
+ await waitForPromises();
+
+ expect(removeAwardEmojiMutationHandler).toHaveBeenCalledWith({
+ awardableId: firstNote.id,
+ name: EMOJI_THUMBSDOWN,
+ });
+ });
+
+ it('restores award if remove fails', async () => {
+ createComponent({
+ removeAwardEmojiMutationHandler: jest.fn().mockRejectedValue('oh no'),
+ });
+ await waitForPromises();
+
+ findAwardsList().vm.$emit('award', EMOJI_THUMBSDOWN);
+
+ await waitForPromises();
+
+ expect(wrapper.emitted('error')).toEqual([[__('Failed to remove emoji. Please try again')]]);
+ });
+ });
+});
diff --git a/spec/frontend/work_items/components/notes/work_item_note_spec.js b/spec/frontend/work_items/components/notes/work_item_note_spec.js
index 8dbd2818fc5..c5d1decfb42 100644
--- a/spec/frontend/work_items/components/notes/work_item_note_spec.js
+++ b/spec/frontend/work_items/components/notes/work_item_note_spec.js
@@ -1,11 +1,13 @@
import { shallowMount } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
import VueApollo from 'vue-apollo';
+import { GlAvatarLink } from '@gitlab/ui';
import mockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
import { updateDraft, clearDraft } from '~/lib/utils/autosave';
import EditedAt from '~/issues/show/components/edited.vue';
import WorkItemNote from '~/work_items/components/notes/work_item_note.vue';
+import WorkItemNoteAwardsList from '~/work_items/components/notes/work_item_note_awards_list.vue';
import TimelineEntryItem from '~/vue_shared/components/notes/timeline_entry_item.vue';
import NoteBody from '~/work_items/components/notes/work_item_note_body.vue';
import NoteHeader from '~/notes/components/note_header.vue';
@@ -76,6 +78,7 @@ describe('Work Item Note', () => {
const errorHandler = jest.fn().mockRejectedValue('Oops');
+ const findAwardsList = () => wrapper.findComponent(WorkItemNoteAwardsList);
const findTimelineEntryItem = () => wrapper.findComponent(TimelineEntryItem);
const findNoteHeader = () => wrapper.findComponent(NoteHeader);
const findNoteBody = () => wrapper.findComponent(NoteBody);
@@ -148,6 +151,13 @@ describe('Work Item Note', () => {
expect(findCommentForm().exists()).toBe(false);
expect(findNoteWrapper().exists()).toBe(true);
});
+
+ it('should show the awards list when in edit mode', async () => {
+ createComponent({ note: mockWorkItemCommentNote, workItemsMvc2: true });
+ findNoteActions().vm.$emit('startEditing');
+ await nextTick();
+ expect(findAwardsList().exists()).toBe(true);
+ });
});
describe('when submitting a form to edit a note', () => {
@@ -264,6 +274,19 @@ describe('Work Item Note', () => {
createComponent();
});
+ it('should show avatar link with popover support', () => {
+ const avatarLink = findTimelineEntryItem().findComponent(GlAvatarLink);
+ const { author } = mockWorkItemCommentNote;
+
+ expect(avatarLink.exists()).toBe(true);
+ expect(avatarLink.classes()).toContain('js-user-link');
+ expect(avatarLink.attributes()).toMatchObject({
+ href: author.webUrl,
+ 'data-user-id': '1',
+ 'data-username': `${author.username}`,
+ });
+ });
+
it('should have the note header, actions and body', () => {
expect(findTimelineEntryItem().exists()).toBe(true);
expect(findNoteHeader().exists()).toBe(true);
@@ -404,5 +427,12 @@ describe('Work Item Note', () => {
});
});
});
+
+ it('passes note props to awards list', () => {
+ createComponent({ note: mockWorkItemCommentNote, workItemsMvc2: true });
+
+ expect(findAwardsList().props('note')).toBe(mockWorkItemCommentNote);
+ expect(findAwardsList().props('workItemIid')).toBe('1');
+ });
});
});
diff --git a/spec/frontend/work_items/components/work_item_assignees_spec.js b/spec/frontend/work_items/components/work_item_assignees_spec.js
index 94d47bfb3be..ff1998ab2ed 100644
--- a/spec/frontend/work_items/components/work_item_assignees_spec.js
+++ b/spec/frontend/work_items/components/work_item_assignees_spec.js
@@ -274,14 +274,14 @@ describe('WorkItemAssignees component', () => {
});
describe('when assigning to current user', () => {
- it('does not show `Assign myself` button if current user is loading', () => {
+ it('does not show `Assign yourself` button if current user is loading', () => {
createComponent();
findTokenSelector().trigger('mouseover');
expect(findAssignSelfButton().exists()).toBe(false);
});
- it('does not show `Assign myself` button if work item has assignees', async () => {
+ it('does not show `Assign yourself` button if work item has assignees', async () => {
createComponent();
await waitForPromises();
findTokenSelector().trigger('mouseover');
@@ -289,7 +289,7 @@ describe('WorkItemAssignees component', () => {
expect(findAssignSelfButton().exists()).toBe(false);
});
- it('does now show `Assign myself` button if user is not logged in', async () => {
+ it('does now show `Assign yourself` button if user is not logged in', async () => {
createComponent({ currentUserQueryHandler: noCurrentUserQueryHandler, assignees: [] });
await waitForPromises();
findTokenSelector().trigger('mouseover');
@@ -304,7 +304,7 @@ describe('WorkItemAssignees component', () => {
return waitForPromises();
});
- it('renders `Assign myself` button', () => {
+ it('renders `Assign yourself` button', () => {
findTokenSelector().trigger('mouseover');
expect(findAssignSelfButton().exists()).toBe(true);
});
diff --git a/spec/frontend/work_items/components/work_item_attributes_wrapper_spec.js b/spec/frontend/work_items/components/work_item_attributes_wrapper_spec.js
new file mode 100644
index 00000000000..ba9af7b2b68
--- /dev/null
+++ b/spec/frontend/work_items/components/work_item_attributes_wrapper_spec.js
@@ -0,0 +1,107 @@
+import { shallowMount } from '@vue/test-utils';
+import WorkItemAssignees from '~/work_items/components/work_item_assignees.vue';
+import WorkItemDueDate from '~/work_items/components/work_item_due_date.vue';
+import WorkItemState from '~/work_items/components/work_item_state.vue';
+import WorkItemLabels from '~/work_items/components/work_item_labels.vue';
+import WorkItemMilestone from '~/work_items/components/work_item_milestone.vue';
+
+import WorkItemAttributesWrapper from '~/work_items/components/work_item_attributes_wrapper.vue';
+import { workItemResponseFactory } from '../mock_data';
+
+describe('WorkItemAttributesWrapper component', () => {
+ let wrapper;
+
+ const workItemQueryResponse = workItemResponseFactory({ canUpdate: true, canDelete: true });
+
+ const findWorkItemState = () => wrapper.findComponent(WorkItemState);
+ const findWorkItemDueDate = () => wrapper.findComponent(WorkItemDueDate);
+ const findWorkItemAssignees = () => wrapper.findComponent(WorkItemAssignees);
+ const findWorkItemLabels = () => wrapper.findComponent(WorkItemLabels);
+ const findWorkItemMilestone = () => wrapper.findComponent(WorkItemMilestone);
+
+ const createComponent = ({ workItem = workItemQueryResponse.data.workItem } = {}) => {
+ wrapper = shallowMount(WorkItemAttributesWrapper, {
+ propsData: {
+ workItem,
+ },
+ provide: {
+ hasIssueWeightsFeature: true,
+ hasIterationsFeature: true,
+ hasOkrsFeature: true,
+ hasIssuableHealthStatusFeature: true,
+ projectNamespace: 'namespace',
+ fullPath: 'group/project',
+ },
+ stubs: {
+ WorkItemWeight: true,
+ WorkItemIteration: true,
+ WorkItemHealthStatus: true,
+ },
+ });
+ };
+
+ describe('work item state', () => {
+ it('renders the work item state', () => {
+ createComponent();
+
+ expect(findWorkItemState().exists()).toBe(true);
+ });
+ });
+
+ describe('assignees widget', () => {
+ it('renders assignees component when widget is returned from the API', () => {
+ createComponent();
+
+ expect(findWorkItemAssignees().exists()).toBe(true);
+ });
+
+ it('does not render assignees component when widget is not returned from the API', () => {
+ createComponent({
+ workItem: workItemResponseFactory({ assigneesWidgetPresent: false }).data.workItem,
+ });
+
+ expect(findWorkItemAssignees().exists()).toBe(false);
+ });
+ });
+
+ describe('labels widget', () => {
+ it.each`
+ description | labelsWidgetPresent | exists
+ ${'renders when widget is returned from API'} | ${true} | ${true}
+ ${'does not render when widget is not returned from API'} | ${false} | ${false}
+ `('$description', ({ labelsWidgetPresent, exists }) => {
+ const response = workItemResponseFactory({ labelsWidgetPresent });
+ createComponent({ workItem: response.data.workItem });
+
+ expect(findWorkItemLabels().exists()).toBe(exists);
+ });
+ });
+
+ describe('dates widget', () => {
+ describe.each`
+ description | datesWidgetPresent | exists
+ ${'when widget is returned from API'} | ${true} | ${true}
+ ${'when widget is not returned from API'} | ${false} | ${false}
+ `('$description', ({ datesWidgetPresent, exists }) => {
+ it(`${datesWidgetPresent ? 'renders' : 'does not render'} due date component`, () => {
+ const response = workItemResponseFactory({ datesWidgetPresent });
+ createComponent({ workItem: response.data.workItem });
+
+ expect(findWorkItemDueDate().exists()).toBe(exists);
+ });
+ });
+ });
+
+ describe('milestone widget', () => {
+ it.each`
+ description | milestoneWidgetPresent | exists
+ ${'renders when widget is returned from API'} | ${true} | ${true}
+ ${'does not render when widget is not returned from API'} | ${false} | ${false}
+ `('$description', ({ milestoneWidgetPresent, exists }) => {
+ const response = workItemResponseFactory({ milestoneWidgetPresent });
+ createComponent({ workItem: response.data.workItem });
+
+ expect(findWorkItemMilestone().exists()).toBe(exists);
+ });
+ });
+});
diff --git a/spec/frontend/work_items/components/work_item_award_emoji_spec.js b/spec/frontend/work_items/components/work_item_award_emoji_spec.js
index 82be6d990e4..f8c5f8edc4c 100644
--- a/spec/frontend/work_items/components/work_item_award_emoji_spec.js
+++ b/spec/frontend/work_items/components/work_item_award_emoji_spec.js
@@ -1,4 +1,4 @@
-import Vue from 'vue';
+import Vue, { nextTick } from 'vue';
import VueApollo from 'vue-apollo';
import { shallowMount } from '@vue/test-utils';
@@ -9,36 +9,67 @@ import { isLoggedIn } from '~/lib/utils/common_utils';
import AwardList from '~/vue_shared/components/awards_list.vue';
import WorkItemAwardEmoji from '~/work_items/components/work_item_award_emoji.vue';
import updateAwardEmojiMutation from '~/work_items/graphql/update_award_emoji.mutation.graphql';
-import workItemByIidQuery from '~/work_items/graphql/work_item_by_iid.query.graphql';
-import { EMOJI_THUMBSUP, EMOJI_THUMBSDOWN } from '~/work_items/constants';
+import workItemAwardEmojiQuery from '~/work_items/graphql/award_emoji.query.graphql';
+import {
+ EMOJI_THUMBSUP,
+ EMOJI_THUMBSDOWN,
+ DEFAULT_PAGE_SIZE_EMOJIS,
+ I18N_WORK_ITEM_FETCH_AWARD_EMOJI_ERROR,
+} from '~/work_items/constants';
import {
workItemByIidResponseFactory,
mockAwardsWidget,
mockAwardEmojiThumbsUp,
getAwardEmojiResponse,
+ mockMoreThanDefaultAwardEmojisWidget,
} from '../mock_data';
jest.mock('~/lib/utils/common_utils');
+jest.mock('~/work_items/constants', () => ({
+ ...jest.requireActual('~/work_items/constants'),
+ DEFAULT_PAGE_SIZE_EMOJIS: 5,
+}));
+
Vue.use(VueApollo);
describe('WorkItemAwardEmoji component', () => {
let wrapper;
let mockApolloProvider;
- const errorMessage = 'Failed to update the award';
+ const mutationErrorMessage = 'Failed to update the award';
+
const workItemQueryResponse = workItemByIidResponseFactory();
- const workItemQueryAddAwardEmojiResponse = workItemByIidResponseFactory({
- awardEmoji: { ...mockAwardsWidget, nodes: [mockAwardEmojiThumbsUp] },
- });
- const workItemQueryRemoveAwardEmojiResponse = workItemByIidResponseFactory({
- awardEmoji: { ...mockAwardsWidget, nodes: [] },
- });
+ const mockWorkItem = workItemQueryResponse.data.workspace.workItems.nodes[0];
+
+ const awardEmojiQuerySuccessHandler = jest.fn().mockResolvedValue(workItemQueryResponse);
+ const awardEmojiQueryEmptyHandler = jest.fn().mockResolvedValue(
+ workItemByIidResponseFactory({
+ awardEmoji: {
+ ...mockAwardsWidget,
+ nodes: [],
+ },
+ }),
+ );
+ const awardEmojiQueryThumbsUpHandler = jest.fn().mockResolvedValue(
+ workItemByIidResponseFactory({
+ awardEmoji: {
+ ...mockAwardsWidget,
+ nodes: [mockAwardEmojiThumbsUp],
+ },
+ }),
+ );
+ const awardEmojiQueryFailureHandler = jest
+ .fn()
+ .mockRejectedValue(new Error(I18N_WORK_ITEM_FETCH_AWARD_EMOJI_ERROR));
+
const awardEmojiAddSuccessHandler = jest.fn().mockResolvedValue(getAwardEmojiResponse(true));
const awardEmojiRemoveSuccessHandler = jest.fn().mockResolvedValue(getAwardEmojiResponse(false));
- const awardEmojiUpdateFailureHandler = jest.fn().mockRejectedValue(new Error(errorMessage));
- const mockWorkItem = workItemQueryResponse.data.workspace.workItems.nodes[0];
- const mockAwardEmojiDifferentUserThumbsUp = {
+ const awardEmojiUpdateFailureHandler = jest
+ .fn()
+ .mockRejectedValue(new Error(mutationErrorMessage));
+
+ const mockAwardEmojiDifferentUser = {
name: 'thumbsup',
__typename: 'AwardEmoji',
user: {
@@ -49,35 +80,37 @@ describe('WorkItemAwardEmoji component', () => {
};
const createComponent = ({
- awardMutationHandler = awardEmojiAddSuccessHandler,
- workItem = mockWorkItem,
+ awardEmojiQueryHandler = awardEmojiQuerySuccessHandler,
+ awardEmojiMutationHandler = awardEmojiAddSuccessHandler,
workItemIid = '1',
- awardEmoji = { ...mockAwardsWidget, nodes: [] },
} = {}) => {
- mockApolloProvider = createMockApollo([[updateAwardEmojiMutation, awardMutationHandler]]);
-
- mockApolloProvider.clients.defaultClient.writeQuery({
- query: workItemByIidQuery,
- variables: { fullPath: workItem.project.fullPath, iid: workItemIid },
- data: {
- ...workItemQueryResponse.data,
- workspace: {
- __typename: 'Project',
- id: 'gid://gitlab/Project/1',
- workItems: {
- nodes: [workItem],
+ mockApolloProvider = createMockApollo(
+ [
+ [workItemAwardEmojiQuery, awardEmojiQueryHandler],
+ [updateAwardEmojiMutation, awardEmojiMutationHandler],
+ ],
+ {},
+ {
+ typePolicies: {
+ WorkItemWidgetAwardEmoji: {
+ fields: {
+ // If we add any key args, the awardEmoji field becomes awardEmoji({"first":10}) and
+ // kills any possibility to handle it on the widget level without hardcoding a string.
+ awardEmoji: {
+ keyArgs: false,
+ },
+ },
},
},
},
- });
+ );
wrapper = shallowMount(WorkItemAwardEmoji, {
isLoggedIn: isLoggedIn(),
apolloProvider: mockApolloProvider,
propsData: {
- workItemId: workItem.id,
- workItemFullpath: workItem.project.fullPath,
- awardEmoji,
+ workItemId: 'gid://gitlab/WorkItem/1',
+ workItemFullpath: 'test-project-path',
workItemIid,
},
});
@@ -85,17 +118,23 @@ describe('WorkItemAwardEmoji component', () => {
const findAwardsList = () => wrapper.findComponent(AwardList);
- beforeEach(() => {
+ beforeEach(async () => {
isLoggedIn.mockReturnValue(true);
window.gon = {
current_user_id: 5,
current_user_fullname: 'Dave Smith',
};
- createComponent();
+ await createComponent();
});
- it('renders the award-list component with default props', () => {
+ it('renders the award-list component with default props', async () => {
+ createComponent({
+ awardEmojiQueryHandler: awardEmojiQueryEmptyHandler,
+ });
+
+ await waitForPromises();
+
expect(findAwardsList().exists()).toBe(true);
expect(findAwardsList().props()).toEqual({
boundary: '',
@@ -108,8 +147,6 @@ describe('WorkItemAwardEmoji component', () => {
});
it('renders awards-list component with awards present', () => {
- createComponent({ awardEmoji: mockAwardsWidget });
-
expect(findAwardsList().props('awards')).toEqual([
{
name: EMOJI_THUMBSUP,
@@ -128,13 +165,32 @@ describe('WorkItemAwardEmoji component', () => {
]);
});
- it('renders awards list given by multiple users', () => {
+ it('emits error when there is an error while fetching award emojis', async () => {
createComponent({
+ awardEmojiQueryHandler: awardEmojiQueryFailureHandler,
+ });
+
+ await waitForPromises();
+
+ expect(wrapper.emitted('error')).toEqual([[I18N_WORK_ITEM_FETCH_AWARD_EMOJI_ERROR]]);
+ });
+
+ it('renders awards list given by multiple users', async () => {
+ const mockWorkItemAwardEmojiDifferentUser = workItemByIidResponseFactory({
awardEmoji: {
...mockAwardsWidget,
- nodes: [mockAwardEmojiThumbsUp, mockAwardEmojiDifferentUserThumbsUp],
+ nodes: [mockAwardEmojiThumbsUp, mockAwardEmojiDifferentUser],
},
});
+ const awardEmojiWithDifferentUsersQueryHandler = jest
+ .fn()
+ .mockResolvedValue(mockWorkItemAwardEmojiDifferentUser);
+
+ createComponent({
+ awardEmojiQueryHandler: awardEmojiWithDifferentUsersQueryHandler,
+ });
+
+ await waitForPromises();
expect(findAwardsList().props('awards')).toEqual([
{
@@ -155,21 +211,19 @@ describe('WorkItemAwardEmoji component', () => {
});
it.each`
- expectedAssertion | awardEmojiMutationHandler | mockAwardEmojiNodes | workItem
- ${'added'} | ${awardEmojiAddSuccessHandler} | ${[]} | ${workItemQueryRemoveAwardEmojiResponse.data.workspace.workItems.nodes[0]}
- ${'removed'} | ${awardEmojiRemoveSuccessHandler} | ${[mockAwardEmojiThumbsUp]} | ${workItemQueryAddAwardEmojiResponse.data.workspace.workItems.nodes[0]}
+ expectedAssertion | awardEmojiMutationHandler | awardEmojiQueryHandler
+ ${'added'} | ${awardEmojiAddSuccessHandler} | ${awardEmojiQueryEmptyHandler}
+ ${'removed'} | ${awardEmojiRemoveSuccessHandler} | ${awardEmojiQueryThumbsUpHandler}
`(
'calls mutation when an award emoji is $expectedAssertion',
- ({ awardEmojiMutationHandler, mockAwardEmojiNodes, workItem }) => {
+ async ({ awardEmojiMutationHandler, awardEmojiQueryHandler }) => {
createComponent({
- awardMutationHandler: awardEmojiMutationHandler,
- awardEmoji: {
- ...mockAwardsWidget,
- nodes: mockAwardEmojiNodes,
- },
- workItem,
+ awardEmojiMutationHandler,
+ awardEmojiQueryHandler,
});
+ await waitForPromises();
+
findAwardsList().vm.$emit('award', EMOJI_THUMBSUP);
expect(awardEmojiMutationHandler).toHaveBeenCalledWith({
@@ -183,21 +237,24 @@ describe('WorkItemAwardEmoji component', () => {
it('emits error when the update mutation fails', async () => {
createComponent({
- awardMutationHandler: awardEmojiUpdateFailureHandler,
+ awardEmojiMutationHandler: awardEmojiUpdateFailureHandler,
+ awardEmojiQueryHandler: awardEmojiQueryEmptyHandler,
});
+ await waitForPromises();
+
findAwardsList().vm.$emit('award', EMOJI_THUMBSUP);
await waitForPromises();
- expect(wrapper.emitted('error')).toEqual([[errorMessage]]);
+ expect(wrapper.emitted('error')).toEqual([[mutationErrorMessage]]);
});
describe('when user is not logged in', () => {
- beforeEach(() => {
+ beforeEach(async () => {
isLoggedIn.mockReturnValue(false);
- createComponent();
+ await createComponent();
});
it('renders the component with required props and canAwardEmoji false', () => {
@@ -213,15 +270,13 @@ describe('WorkItemAwardEmoji component', () => {
};
});
- it('calls mutation succesfully and adds the award emoji with proper user details', () => {
+ it('calls mutation succesfully and adds the award emoji with proper user details', async () => {
createComponent({
- awardMutationHandler: awardEmojiAddSuccessHandler,
- awardEmoji: {
- ...mockAwardsWidget,
- nodes: [mockAwardEmojiThumbsUp],
- },
+ awardEmojiMutationHandler: awardEmojiAddSuccessHandler,
});
+ await waitForPromises();
+
findAwardsList().vm.$emit('award', EMOJI_THUMBSUP);
expect(awardEmojiAddSuccessHandler).toHaveBeenCalledWith({
@@ -232,4 +287,62 @@ describe('WorkItemAwardEmoji component', () => {
});
});
});
+
+ describe('pagination', () => {
+ describe('when there is no next page', () => {
+ const awardEmojiQuerySingleItemHandler = jest.fn().mockResolvedValue(
+ workItemByIidResponseFactory({
+ awardEmoji: {
+ ...mockAwardsWidget,
+ nodes: [mockAwardEmojiThumbsUp],
+ },
+ }),
+ );
+
+ it('fetch more award emojis should not be called', async () => {
+ createComponent({ awardEmojiQueryHandler: awardEmojiQuerySingleItemHandler });
+ await waitForPromises();
+
+ expect(awardEmojiQuerySingleItemHandler).toHaveBeenCalledWith({
+ fullPath: 'test-project-path',
+ iid: '1',
+ pageSize: DEFAULT_PAGE_SIZE_EMOJIS,
+ after: undefined,
+ });
+ expect(awardEmojiQuerySingleItemHandler).toHaveBeenCalledTimes(1);
+ });
+ });
+
+ describe('when there is next page', () => {
+ const awardEmojisQueryMoreThanDefaultHandler = jest.fn().mockResolvedValueOnce(
+ workItemByIidResponseFactory({
+ awardEmoji: mockMoreThanDefaultAwardEmojisWidget,
+ }),
+ );
+
+ it('fetch more award emojis should be called', async () => {
+ createComponent({
+ awardEmojiQueryHandler: awardEmojisQueryMoreThanDefaultHandler,
+ });
+ await waitForPromises();
+
+ expect(awardEmojisQueryMoreThanDefaultHandler).toHaveBeenCalledWith({
+ fullPath: 'test-project-path',
+ iid: '1',
+ pageSize: DEFAULT_PAGE_SIZE_EMOJIS,
+ after: 'endCursor',
+ });
+
+ await nextTick();
+
+ expect(awardEmojisQueryMoreThanDefaultHandler).toHaveBeenCalledWith({
+ fullPath: 'test-project-path',
+ iid: '1',
+ pageSize: DEFAULT_PAGE_SIZE_EMOJIS,
+ after: mockMoreThanDefaultAwardEmojisWidget.pageInfo.endCursor,
+ });
+ expect(awardEmojisQueryMoreThanDefaultHandler).toHaveBeenCalledTimes(2);
+ });
+ });
+ });
});
diff --git a/spec/frontend/work_items/components/work_item_description_spec.js b/spec/frontend/work_items/components/work_item_description_spec.js
index b910e9854f8..8b9963b2476 100644
--- a/spec/frontend/work_items/components/work_item_description_spec.js
+++ b/spec/frontend/work_items/components/work_item_description_spec.js
@@ -12,14 +12,12 @@ import MarkdownEditor from '~/vue_shared/components/markdown/markdown_editor.vue
import WorkItemDescription from '~/work_items/components/work_item_description.vue';
import WorkItemDescriptionRendered from '~/work_items/components/work_item_description_rendered.vue';
import { TRACKING_CATEGORY_SHOW } from '~/work_items/constants';
-import workItemDescriptionSubscription from '~/work_items/graphql/work_item_description.subscription.graphql';
import updateWorkItemMutation from '~/work_items/graphql/update_work_item.mutation.graphql';
import workItemByIidQuery from '~/work_items/graphql/work_item_by_iid.query.graphql';
import { autocompleteDataSources, markdownPreviewPath } from '~/work_items/utils';
import {
updateWorkItemMutationResponse,
workItemByIidResponseFactory,
- workItemDescriptionSubscriptionResponse,
workItemQueryResponse,
} from '../mock_data';
@@ -34,7 +32,6 @@ describe('WorkItemDescription', () => {
Vue.use(VueApollo);
const mutationSuccessHandler = jest.fn().mockResolvedValue(updateWorkItemMutationResponse);
- const subscriptionHandler = jest.fn().mockResolvedValue(workItemDescriptionSubscriptionResponse);
let workItemResponseHandler;
const findForm = () => wrapper.findComponent(GlForm);
@@ -63,7 +60,6 @@ describe('WorkItemDescription', () => {
apolloProvider: createMockApollo([
[workItemByIidQuery, workItemResponseHandler],
[updateWorkItemMutation, mutationHandler],
- [workItemDescriptionSubscription, subscriptionHandler],
]),
propsData: {
workItemId: id,
@@ -83,14 +79,6 @@ describe('WorkItemDescription', () => {
}
};
- it('has a subscription', async () => {
- await createComponent();
-
- expect(subscriptionHandler).toHaveBeenCalledWith({
- issuableId: workItemQueryResponse.data.workItem.id,
- });
- });
-
describe('editing description', () => {
it('passes correct autocompletion data and preview markdown sources and enables quick actions', async () => {
const {
@@ -103,7 +91,6 @@ describe('WorkItemDescription', () => {
expect(findMarkdownEditor().props()).toMatchObject({
supportsQuickActions: true,
renderMarkdownPath: markdownPreviewPath(fullPath, iid),
- quickActionsDocsPath: wrapper.vm.$options.quickActionsDocsPath,
autocompleteDataSources: autocompleteDataSources(fullPath, iid),
});
});
diff --git a/spec/frontend/work_items/components/work_item_detail_spec.js b/spec/frontend/work_items/components/work_item_detail_spec.js
index d8ba8ea74f2..7ceae935d2d 100644
--- a/spec/frontend/work_items/components/work_item_detail_spec.js
+++ b/spec/frontend/work_items/components/work_item_detail_spec.js
@@ -5,10 +5,11 @@ import {
GlSkeletonLoader,
GlButton,
GlEmptyState,
+ GlIntersectionObserver,
} from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
import VueApollo from 'vue-apollo';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import { isLoggedIn } from '~/lib/utils/common_utils';
import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
@@ -18,12 +19,8 @@ import WorkItemDetail from '~/work_items/components/work_item_detail.vue';
import WorkItemActions from '~/work_items/components/work_item_actions.vue';
import WorkItemDescription from '~/work_items/components/work_item_description.vue';
import WorkItemCreatedUpdated from '~/work_items/components/work_item_created_updated.vue';
-import WorkItemDueDate from '~/work_items/components/work_item_due_date.vue';
-import WorkItemState from '~/work_items/components/work_item_state.vue';
+import WorkItemAttributesWrapper from '~/work_items/components/work_item_attributes_wrapper.vue';
import WorkItemTitle from '~/work_items/components/work_item_title.vue';
-import WorkItemAssignees from '~/work_items/components/work_item_assignees.vue';
-import WorkItemLabels from '~/work_items/components/work_item_labels.vue';
-import WorkItemMilestone from '~/work_items/components/work_item_milestone.vue';
import WorkItemTree from '~/work_items/components/work_item_links/work_item_tree.vue';
import WorkItemNotes from '~/work_items/components/work_item_notes.vue';
import WorkItemDetailModal from '~/work_items/components/work_item_detail_modal.vue';
@@ -31,20 +28,13 @@ import AbuseCategorySelector from '~/abuse_reports/components/abuse_category_sel
import WorkItemTodos from '~/work_items/components/work_item_todos.vue';
import { i18n } from '~/work_items/constants';
import workItemByIidQuery from '~/work_items/graphql/work_item_by_iid.query.graphql';
-import workItemDatesSubscription from '~/graphql_shared/subscriptions/work_item_dates.subscription.graphql';
-import workItemTitleSubscription from '~/work_items/graphql/work_item_title.subscription.graphql';
-import workItemAssigneesSubscription from '~/work_items/graphql/work_item_assignees.subscription.graphql';
-import workItemMilestoneSubscription from '~/work_items/graphql/work_item_milestone.subscription.graphql';
import updateWorkItemMutation from '~/work_items/graphql/update_work_item.mutation.graphql';
import updateWorkItemTaskMutation from '~/work_items/graphql/update_work_item_task.mutation.graphql';
+import workItemUpdatedSubscription from '~/work_items/graphql/work_item_updated.subscription.graphql';
import {
mockParent,
- workItemDatesSubscriptionResponse,
workItemByIidResponseFactory,
- workItemTitleSubscriptionResponse,
- workItemAssigneesSubscriptionResponse,
- workItemMilestoneSubscriptionResponse,
objectiveType,
mockWorkItemCommentNote,
} from '../mock_data';
@@ -63,16 +53,11 @@ describe('WorkItemDetail component', () => {
canDelete: true,
});
const successHandler = jest.fn().mockResolvedValue(workItemQueryResponse);
- const datesSubscriptionHandler = jest.fn().mockResolvedValue(workItemDatesSubscriptionResponse);
- const titleSubscriptionHandler = jest.fn().mockResolvedValue(workItemTitleSubscriptionResponse);
- const milestoneSubscriptionHandler = jest
- .fn()
- .mockResolvedValue(workItemMilestoneSubscriptionResponse);
- const assigneesSubscriptionHandler = jest
- .fn()
- .mockResolvedValue(workItemAssigneesSubscriptionResponse);
const showModalHandler = jest.fn();
const { id } = workItemQueryResponse.data.workspace.workItems.nodes[0];
+ const workItemUpdatedSubscriptionHandler = jest
+ .fn()
+ .mockResolvedValue({ data: { workItemUpdated: null } });
const findAlert = () => wrapper.findComponent(GlAlert);
const findEmptyState = () => wrapper.findComponent(GlEmptyState);
@@ -81,42 +66,39 @@ describe('WorkItemDetail component', () => {
const findWorkItemActions = () => wrapper.findComponent(WorkItemActions);
const findWorkItemTitle = () => wrapper.findComponent(WorkItemTitle);
const findCreatedUpdated = () => wrapper.findComponent(WorkItemCreatedUpdated);
- const findWorkItemState = () => wrapper.findComponent(WorkItemState);
const findWorkItemDescription = () => wrapper.findComponent(WorkItemDescription);
- const findWorkItemDueDate = () => wrapper.findComponent(WorkItemDueDate);
- const findWorkItemAssignees = () => wrapper.findComponent(WorkItemAssignees);
- const findWorkItemLabels = () => wrapper.findComponent(WorkItemLabels);
- const findWorkItemMilestone = () => wrapper.findComponent(WorkItemMilestone);
- const findParent = () => wrapper.find('[data-testid="work-item-parent"]');
+ const findWorkItemAttributesWrapper = () => wrapper.findComponent(WorkItemAttributesWrapper);
+ const findParent = () => wrapper.findByTestId('work-item-parent');
const findParentButton = () => findParent().findComponent(GlButton);
- const findCloseButton = () => wrapper.find('[data-testid="work-item-close"]');
- const findWorkItemType = () => wrapper.find('[data-testid="work-item-type"]');
+ const findCloseButton = () => wrapper.findByTestId('work-item-close');
+ const findWorkItemType = () => wrapper.findByTestId('work-item-type');
const findHierarchyTree = () => wrapper.findComponent(WorkItemTree);
const findNotesWidget = () => wrapper.findComponent(WorkItemNotes);
const findModal = () => wrapper.findComponent(WorkItemDetailModal);
const findAbuseCategorySelector = () => wrapper.findComponent(AbuseCategorySelector);
const findWorkItemTodos = () => wrapper.findComponent(WorkItemTodos);
+ const findIntersectionObserver = () => wrapper.findComponent(GlIntersectionObserver);
+ const findStickyHeader = () => wrapper.findByTestId('work-item-sticky-header');
+ const findWorkItemTwoColumnViewContainer = () => wrapper.findByTestId('work-item-overview');
+ const findRightSidebar = () => wrapper.findByTestId('work-item-overview-right-sidebar');
+ const triggerPageScroll = () => findIntersectionObserver().vm.$emit('disappear');
const createComponent = ({
isModal = false,
updateInProgress = false,
workItemIid = '1',
handler = successHandler,
- subscriptionHandler = titleSubscriptionHandler,
confidentialityMock = [updateWorkItemMutation, jest.fn()],
error = undefined,
workItemsMvc2Enabled = false,
} = {}) => {
const handlers = [
[workItemByIidQuery, handler],
- [workItemTitleSubscription, subscriptionHandler],
- [workItemDatesSubscription, datesSubscriptionHandler],
- [workItemAssigneesSubscription, assigneesSubscriptionHandler],
- [workItemMilestoneSubscription, milestoneSubscriptionHandler],
+ [workItemUpdatedSubscription, workItemUpdatedSubscriptionHandler],
confidentialityMock,
];
- wrapper = shallowMount(WorkItemDetail, {
+ wrapper = shallowMountExtended(WorkItemDetail, {
apolloProvider: createMockApollo(handlers),
isLoggedIn: isLoggedIn(),
propsData: {
@@ -163,13 +145,18 @@ describe('WorkItemDetail component', () => {
});
describe('when there is no `workItemIid` prop', () => {
- beforeEach(() => {
+ beforeEach(async () => {
createComponent({ workItemIid: null });
+ await waitForPromises();
});
it('skips the work item query', () => {
expect(successHandler).not.toHaveBeenCalled();
});
+
+ it('skips the work item updated subscription', () => {
+ expect(workItemUpdatedSubscriptionHandler).not.toHaveBeenCalled();
+ });
});
describe('when loading', () => {
@@ -179,7 +166,6 @@ describe('WorkItemDetail component', () => {
it('renders skeleton loader', () => {
expect(findSkeleton().exists()).toBe(true);
- expect(findWorkItemState().exists()).toBe(false);
expect(findWorkItemTitle().exists()).toBe(false);
});
});
@@ -192,7 +178,6 @@ describe('WorkItemDetail component', () => {
it('does not render skeleton', () => {
expect(findSkeleton().exists()).toBe(false);
- expect(findWorkItemState().exists()).toBe(true);
expect(findWorkItemTitle().exists()).toBe(true);
});
@@ -203,6 +188,10 @@ describe('WorkItemDetail component', () => {
it('renders todos widget if logged in', () => {
expect(findWorkItemTodos().exists()).toBe(true);
});
+
+ it('calls the work item updated subscription', () => {
+ expect(workItemUpdatedSubscriptionHandler).toHaveBeenCalledWith({ id });
+ });
});
describe('close button', () => {
@@ -488,159 +477,6 @@ describe('WorkItemDetail component', () => {
expect(findAlert().text()).toBe(updateError);
});
- describe('subscriptions', () => {
- it('calls the title subscription', async () => {
- createComponent();
- await waitForPromises();
-
- expect(titleSubscriptionHandler).toHaveBeenCalledWith({ issuableId: id });
- });
-
- describe('assignees subscription', () => {
- describe('when the assignees widget exists', () => {
- it('calls the assignees subscription', async () => {
- createComponent();
- await waitForPromises();
-
- expect(assigneesSubscriptionHandler).toHaveBeenCalledWith({ issuableId: id });
- });
- });
-
- describe('when the assignees widget does not exist', () => {
- it('does not call the assignees subscription', async () => {
- const response = workItemByIidResponseFactory({ assigneesWidgetPresent: false });
- const handler = jest.fn().mockResolvedValue(response);
- createComponent({ handler });
- await waitForPromises();
-
- expect(assigneesSubscriptionHandler).not.toHaveBeenCalled();
- });
- });
- });
-
- describe('dates subscription', () => {
- describe('when the due date widget exists', () => {
- it('calls the dates subscription', async () => {
- createComponent();
- await waitForPromises();
-
- expect(datesSubscriptionHandler).toHaveBeenCalledWith({ issuableId: id });
- });
- });
-
- describe('when the due date widget does not exist', () => {
- it('does not call the dates subscription', async () => {
- const response = workItemByIidResponseFactory({ datesWidgetPresent: false });
- const handler = jest.fn().mockResolvedValue(response);
- createComponent({ handler });
- await waitForPromises();
-
- expect(datesSubscriptionHandler).not.toHaveBeenCalled();
- });
- });
- });
- });
-
- describe('assignees widget', () => {
- it('renders assignees component when widget is returned from the API', async () => {
- createComponent();
- await waitForPromises();
-
- expect(findWorkItemAssignees().exists()).toBe(true);
- });
-
- it('does not render assignees component when widget is not returned from the API', async () => {
- createComponent({
- handler: jest
- .fn()
- .mockResolvedValue(workItemByIidResponseFactory({ assigneesWidgetPresent: false })),
- });
- await waitForPromises();
-
- expect(findWorkItemAssignees().exists()).toBe(false);
- });
- });
-
- describe('labels widget', () => {
- it.each`
- description | labelsWidgetPresent | exists
- ${'renders when widget is returned from API'} | ${true} | ${true}
- ${'does not render when widget is not returned from API'} | ${false} | ${false}
- `('$description', async ({ labelsWidgetPresent, exists }) => {
- const response = workItemByIidResponseFactory({ labelsWidgetPresent });
- const handler = jest.fn().mockResolvedValue(response);
- createComponent({ handler });
- await waitForPromises();
-
- expect(findWorkItemLabels().exists()).toBe(exists);
- });
- });
-
- describe('dates widget', () => {
- describe.each`
- description | datesWidgetPresent | exists
- ${'when widget is returned from API'} | ${true} | ${true}
- ${'when widget is not returned from API'} | ${false} | ${false}
- `('$description', ({ datesWidgetPresent, exists }) => {
- it(`${datesWidgetPresent ? 'renders' : 'does not render'} due date component`, async () => {
- const response = workItemByIidResponseFactory({ datesWidgetPresent });
- const handler = jest.fn().mockResolvedValue(response);
- createComponent({ handler });
- await waitForPromises();
-
- expect(findWorkItemDueDate().exists()).toBe(exists);
- });
- });
-
- it('shows an error message when it emits an `error` event', async () => {
- createComponent();
- await waitForPromises();
- const updateError = 'Failed to update';
-
- findWorkItemDueDate().vm.$emit('error', updateError);
- await waitForPromises();
-
- expect(findAlert().text()).toBe(updateError);
- });
- });
-
- describe('milestone widget', () => {
- it.each`
- description | milestoneWidgetPresent | exists
- ${'renders when widget is returned from API'} | ${true} | ${true}
- ${'does not render when widget is not returned from API'} | ${false} | ${false}
- `('$description', async ({ milestoneWidgetPresent, exists }) => {
- const response = workItemByIidResponseFactory({ milestoneWidgetPresent });
- const handler = jest.fn().mockResolvedValue(response);
- createComponent({ handler });
- await waitForPromises();
-
- expect(findWorkItemMilestone().exists()).toBe(exists);
- });
-
- describe('milestone subscription', () => {
- describe('when the milestone widget exists', () => {
- it('calls the milestone subscription', async () => {
- createComponent();
- await waitForPromises();
-
- expect(milestoneSubscriptionHandler).toHaveBeenCalledWith({ issuableId: id });
- });
- });
-
- describe('when the assignees widget does not exist', () => {
- it('does not call the milestone subscription', async () => {
- const response = workItemByIidResponseFactory({ milestoneWidgetPresent: false });
- const handler = jest.fn().mockResolvedValue(response);
- createComponent({ handler });
- await waitForPromises();
-
- expect(milestoneSubscriptionHandler).not.toHaveBeenCalled();
- });
- });
- });
- });
-
it('calls the work item query', async () => {
createComponent();
await waitForPromises();
@@ -796,4 +632,76 @@ describe('WorkItemDetail component', () => {
expect(findWorkItemTodos().exists()).toBe(false);
});
});
+
+ describe('work item attributes wrapper', () => {
+ beforeEach(async () => {
+ createComponent();
+ await waitForPromises();
+ });
+
+ it('renders the work item attributes wrapper', () => {
+ expect(findWorkItemAttributesWrapper().exists()).toBe(true);
+ });
+
+ it('shows an error message when it emits an `error` event', async () => {
+ const updateError = 'Failed to update';
+
+ findWorkItemAttributesWrapper().vm.$emit('error', updateError);
+ await waitForPromises();
+
+ expect(findAlert().text()).toBe(updateError);
+ });
+ });
+
+ describe('work item two column view', () => {
+ describe('when `workItemsMvc2Enabled` is false', () => {
+ beforeEach(async () => {
+ createComponent({ workItemsMvc2Enabled: false });
+ await waitForPromises();
+ });
+
+ it('does not have the `work-item-overview` class', () => {
+ expect(findWorkItemTwoColumnViewContainer().classes()).not.toContain('work-item-overview');
+ });
+
+ it('does not have sticky header', () => {
+ expect(findIntersectionObserver().exists()).toBe(false);
+ expect(findStickyHeader().exists()).toBe(false);
+ });
+
+ it('does not have right sidebar', () => {
+ expect(findRightSidebar().exists()).toBe(false);
+ });
+ });
+
+ describe('when `workItemsMvc2Enabled` is true', () => {
+ beforeEach(async () => {
+ createComponent({ workItemsMvc2Enabled: true });
+ await waitForPromises();
+ });
+
+ it('has the `work-item-overview` class', () => {
+ expect(findWorkItemTwoColumnViewContainer().classes()).toContain('work-item-overview');
+ });
+
+ it('does not show sticky header by default', () => {
+ expect(findStickyHeader().exists()).toBe(false);
+ });
+
+ it('has the sticky header when the page is scrolled', async () => {
+ expect(findIntersectionObserver().exists()).toBe(true);
+
+ global.pageYOffset = 100;
+ triggerPageScroll();
+
+ await nextTick();
+
+ expect(findStickyHeader().exists()).toBe(true);
+ });
+
+ it('has the right sidebar', () => {
+ expect(findRightSidebar().exists()).toBe(true);
+ });
+ });
+ });
});
diff --git a/spec/frontend/work_items/components/work_item_labels_spec.js b/spec/frontend/work_items/components/work_item_labels_spec.js
index 6894aa236e3..4a20e654060 100644
--- a/spec/frontend/work_items/components/work_item_labels_spec.js
+++ b/spec/frontend/work_items/components/work_item_labels_spec.js
@@ -6,7 +6,6 @@ import waitForPromises from 'helpers/wait_for_promises';
import { mountExtended } from 'helpers/vue_test_utils_helper';
import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
import labelSearchQuery from '~/sidebar/components/labels/labels_select_widget/graphql/project_labels.query.graphql';
-import workItemLabelsSubscription from 'ee_else_ce/work_items/graphql/work_item_labels.subscription.graphql';
import updateWorkItemMutation from '~/work_items/graphql/update_work_item.mutation.graphql';
import workItemByIidQuery from '~/work_items/graphql/work_item_by_iid.query.graphql';
import WorkItemLabels from '~/work_items/components/work_item_labels.vue';
@@ -16,7 +15,6 @@ import {
mockLabels,
workItemByIidResponseFactory,
updateWorkItemMutationResponse,
- workItemLabelsSubscriptionResponse,
} from '../mock_data';
Vue.use(VueApollo);
@@ -38,7 +36,6 @@ describe('WorkItemLabels component', () => {
const successUpdateWorkItemMutationHandler = jest
.fn()
.mockResolvedValue(updateWorkItemMutationResponse);
- const subscriptionHandler = jest.fn().mockResolvedValue(workItemLabelsSubscriptionResponse);
const errorHandler = jest.fn().mockRejectedValue('Houston, we have a problem');
const createComponent = ({
@@ -53,7 +50,6 @@ describe('WorkItemLabels component', () => {
[workItemByIidQuery, workItemQueryHandler],
[labelSearchQuery, searchQueryHandler],
[updateWorkItemMutation, updateWorkItemMutationHandler],
- [workItemLabelsSubscription, subscriptionHandler],
]),
provide: {
fullPath: 'test-project-path',
@@ -246,16 +242,6 @@ describe('WorkItemLabels component', () => {
expect(updateWorkItemMutationHandler).not.toHaveBeenCalled();
});
-
- it('has a subscription', async () => {
- createComponent();
-
- await waitForPromises();
-
- expect(subscriptionHandler).toHaveBeenCalledWith({
- issuableId: workItemId,
- });
- });
});
it('calls the work item query', async () => {
diff --git a/spec/frontend/work_items/components/work_item_links/work_item_tree_spec.js b/spec/frontend/work_items/components/work_item_links/work_item_tree_spec.js
index f3aa347f389..e90775a5240 100644
--- a/spec/frontend/work_items/components/work_item_links/work_item_tree_spec.js
+++ b/spec/frontend/work_items/components/work_item_links/work_item_tree_spec.js
@@ -1,12 +1,10 @@
import { nextTick } from 'vue';
-
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import WidgetWrapper from '~/work_items/components/widget_wrapper.vue';
import WorkItemTree from '~/work_items/components/work_item_links/work_item_tree.vue';
import WorkItemChildrenWrapper from '~/work_items/components/work_item_links/work_item_children_wrapper.vue';
import WorkItemLinksForm from '~/work_items/components/work_item_links/work_item_links_form.vue';
import OkrActionsSplitButton from '~/work_items/components/work_item_links/okr_actions_split_button.vue';
-
import {
FORM_TYPES,
WORK_ITEM_TYPE_ENUM_OBJECTIVE,
@@ -42,9 +40,8 @@ describe('WorkItemTree', () => {
children,
canUpdate,
},
+ stubs: { WidgetWrapper },
});
-
- wrapper.vm.$refs.wrapper.show = jest.fn();
};
it('displays Add button', () => {
diff --git a/spec/frontend/work_items/components/work_item_todos_spec.js b/spec/frontend/work_items/components/work_item_todos_spec.js
index 83b61a04298..454bd97bbee 100644
--- a/spec/frontend/work_items/components/work_item_todos_spec.js
+++ b/spec/frontend/work_items/components/work_item_todos_spec.js
@@ -1,14 +1,24 @@
import { GlButton, GlIcon } 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 { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+
import WorkItemTodos from '~/work_items/components/work_item_todos.vue';
-import { ADD, TODO_DONE_ICON, TODO_ADD_ICON } from '~/work_items/constants';
-import updateWorkItemMutation from '~/work_items/graphql/update_work_item.mutation.graphql';
+import {
+ TODO_DONE_ICON,
+ TODO_ADD_ICON,
+ TODO_PENDING_STATE,
+ TODO_DONE_STATE,
+} from '~/work_items/constants';
import { updateGlobalTodoCount } from '~/sidebar/utils';
-import { workItemResponseFactory, updateWorkItemMutationResponseFactory } from '../mock_data';
+import createWorkItemTodosMutation from '~/work_items/graphql/create_work_item_todos.mutation.graphql';
+import markDoneWorkItemTodosMutation from '~/work_items/graphql/mark_done_work_item_todos.mutation.graphql';
+import workItemByIidQuery from '~/work_items/graphql/work_item_by_iid.query.graphql';
+
+import { workItemResponseFactory, getTodosMutationResponse } from '../mock_data';
jest.mock('~/sidebar/utils');
@@ -22,27 +32,58 @@ describe('WorkItemTodo component', () => {
const errorMessage = 'Failed to add item';
const workItemQueryResponse = workItemResponseFactory({ canUpdate: true });
- const successHandler = jest
+ const mockWorkItemId = workItemQueryResponse.data.workItem.id;
+ const mockWorkItemIid = workItemQueryResponse.data.workItem.iid;
+ const mockWorkItemFullpath = workItemQueryResponse.data.workItem.project.fullPath;
+
+ const createTodoSuccessHandler = jest
.fn()
- .mockResolvedValue(updateWorkItemMutationResponseFactory({ canUpdate: true }));
+ .mockResolvedValue(getTodosMutationResponse(TODO_PENDING_STATE));
+ const markDoneTodoSuccessHandler = jest
+ .fn()
+ .mockResolvedValue(getTodosMutationResponse(TODO_DONE_STATE));
const failureHandler = jest.fn().mockRejectedValue(new Error(errorMessage));
- const inputVariables = {
- id: 'gid://gitlab/WorkItem/1',
- currentUserTodosWidget: {
- action: ADD,
- },
+ const inputVariablesCreateTodos = {
+ targetId: 'gid://gitlab/WorkItem/1',
+ };
+
+ const inputVariablesMarkDoneTodos = {
+ id: 'gid://gitlab/Todo/1',
+ };
+
+ const mockCurrentUserTodos = {
+ id: 'gid://gitlab/Todo/1',
};
const createComponent = ({
- currentUserTodosMock = [updateWorkItemMutation, successHandler],
+ mutation = createWorkItemTodosMutation,
+ currentUserTodosHandler = createTodoSuccessHandler,
currentUserTodos = [],
} = {}) => {
- const handlers = [currentUserTodosMock];
+ const mockApolloProvider = createMockApollo([[mutation, currentUserTodosHandler]]);
+
+ mockApolloProvider.clients.defaultClient.cache.writeQuery({
+ query: workItemByIidQuery,
+ variables: { fullPath: mockWorkItemFullpath, iid: mockWorkItemIid },
+ data: {
+ ...workItemQueryResponse.data,
+ workspace: {
+ __typename: 'Project',
+ id: 'gid://gitlab/Project/1',
+ workItems: {
+ nodes: [workItemQueryResponse.data.workItem],
+ },
+ },
+ },
+ });
+
wrapper = shallowMountExtended(WorkItemTodos, {
- apolloProvider: createMockApollo(handlers),
+ apolloProvider: mockApolloProvider,
propsData: {
- workItem: workItemQueryResponse.data.workItem,
+ workItemId: mockWorkItemId,
+ workItemIid: mockWorkItemIid,
+ workItemFullpath: mockWorkItemFullpath,
currentUserTodos,
},
});
@@ -58,35 +99,41 @@ describe('WorkItemTodo component', () => {
it('renders mark as done button when there is pending item', () => {
createComponent({
- currentUserTodos: [
- {
- node: {
- id: 'gid://gitlab/Todo/1',
- state: 'pending',
- },
- },
- ],
+ currentUserTodos: [mockCurrentUserTodos],
});
expect(findTodoIcon().props('name')).toEqual(TODO_DONE_ICON);
expect(findTodoIcon().classes('gl-fill-blue-500')).toBe(true);
});
- it('calls update mutation when to do button is clicked', async () => {
- createComponent();
+ it.each`
+ assertionName | mutation | currentUserTodosHandler | currentUserTodos | inputVariables
+ ${'create'} | ${createWorkItemTodosMutation} | ${createTodoSuccessHandler} | ${[]} | ${inputVariablesCreateTodos}
+ ${'mark done'} | ${markDoneWorkItemTodosMutation} | ${markDoneTodoSuccessHandler} | ${[mockCurrentUserTodos]} | ${inputVariablesMarkDoneTodos}
+ `(
+ 'calls $assertionName todos mutation when to do button is toggled',
+ async ({ mutation, currentUserTodosHandler, currentUserTodos, inputVariables }) => {
+ createComponent({
+ mutation,
+ currentUserTodosHandler,
+ currentUserTodos,
+ });
- findTodoWidget().vm.$emit('click');
+ findTodoWidget().vm.$emit('click');
- await waitForPromises();
+ await waitForPromises();
- expect(successHandler).toHaveBeenCalledWith({
- input: inputVariables,
- });
- expect(updateGlobalTodoCount).toHaveBeenCalled();
- });
+ expect(currentUserTodosHandler).toHaveBeenCalledWith({
+ input: inputVariables,
+ });
+ expect(updateGlobalTodoCount).toHaveBeenCalled();
+ },
+ );
it('emits error when the update mutation fails', async () => {
- createComponent({ currentUserTodosMock: [updateWorkItemMutation, failureHandler] });
+ createComponent({
+ currentUserTodosHandler: failureHandler,
+ });
findTodoWidget().vm.$emit('click');
diff --git a/spec/frontend/work_items/mock_data.js b/spec/frontend/work_items/mock_data.js
index a873462ea63..f88e69a7ffe 100644
--- a/spec/frontend/work_items/mock_data.js
+++ b/spec/frontend/work_items/mock_data.js
@@ -68,6 +68,38 @@ export const mockAwardEmojiThumbsDown = {
export const mockAwardsWidget = {
nodes: [mockAwardEmojiThumbsUp, mockAwardEmojiThumbsDown],
+ pageInfo: {
+ hasNextPage: false,
+ hasPreviousPage: false,
+ startCursor: null,
+ endCursor: null,
+ __typename: 'PageInfo',
+ },
+ __typename: 'AwardEmojiConnection',
+};
+
+export const mockMoreThanDefaultAwardEmojisWidget = {
+ nodes: [
+ mockAwardEmojiThumbsUp,
+ mockAwardEmojiThumbsDown,
+ { ...mockAwardEmojiThumbsUp, name: 'one' },
+ { ...mockAwardEmojiThumbsUp, name: 'two' },
+ { ...mockAwardEmojiThumbsUp, name: 'three' },
+ { ...mockAwardEmojiThumbsUp, name: 'four' },
+ { ...mockAwardEmojiThumbsUp, name: 'five' },
+ { ...mockAwardEmojiThumbsUp, name: 'six' },
+ { ...mockAwardEmojiThumbsUp, name: 'seven' },
+ { ...mockAwardEmojiThumbsUp, name: 'eight' },
+ { ...mockAwardEmojiThumbsUp, name: 'nine' },
+ { ...mockAwardEmojiThumbsUp, name: 'ten' },
+ ],
+ pageInfo: {
+ hasNextPage: true,
+ hasPreviousPage: false,
+ startCursor: null,
+ endCursor: 'endCursor',
+ __typename: 'PageInfo',
+ },
__typename: 'AwardEmojiConnection',
};
@@ -629,14 +661,10 @@ export const workItemResponseFactory = ({
? {
type: 'CURRENT_USER_TODOS',
currentUserTodos: {
- edges: [
+ nodes: [
{
- node: {
- id: 'gid://gitlab/Todo/1',
- state: 'pending',
- __typename: 'Todo',
- },
- __typename: 'TodoEdge',
+ id: 'gid://gitlab/Todo/1',
+ __typename: 'Todo',
},
],
__typename: 'TodoConnection',
@@ -803,154 +831,6 @@ export const deleteWorkItemMutationErrorResponse = {
},
};
-export const workItemDatesSubscriptionResponse = {
- data: {
- issuableDatesUpdated: {
- id: 'gid://gitlab/WorkItem/1',
- widgets: [
- {
- __typename: 'WorkItemWidgetStartAndDueDate',
- dueDate: '2022-12-31',
- startDate: '2022-01-01',
- },
- ],
- },
- },
-};
-
-export const workItemTitleSubscriptionResponse = {
- data: {
- issuableTitleUpdated: {
- id: 'gid://gitlab/WorkItem/1',
- title: 'new title',
- },
- },
-};
-
-export const workItemDescriptionSubscriptionResponse = {
- data: {
- issuableDescriptionUpdated: {
- id: 'gid://gitlab/WorkItem/1',
- widgets: [
- {
- __typename: 'WorkItemWidgetDescription',
- type: 'DESCRIPTION',
- description: 'New description',
- descriptionHtml: '<p>New description</p>',
- lastEditedAt: '2022-09-21T06:18:42Z',
- lastEditedBy: {
- id: 'gid://gitlab/User/2',
- name: 'Someone else',
- webPath: '/not-you',
- },
- },
- ],
- },
- },
-};
-
-export const workItemWeightSubscriptionResponse = {
- data: {
- issuableWeightUpdated: {
- id: 'gid://gitlab/WorkItem/1',
- widgets: [
- {
- __typename: 'WorkItemWidgetWeight',
- weight: 1,
- },
- ],
- },
- },
-};
-
-export const workItemAssigneesSubscriptionResponse = {
- data: {
- issuableAssigneesUpdated: {
- id: 'gid://gitlab/WorkItem/1',
- widgets: [
- {
- __typename: 'WorkItemAssigneesWeight',
- assignees: {
- nodes: [mockAssignees[0]],
- },
- },
- ],
- },
- },
-};
-
-export const workItemLabelsSubscriptionResponse = {
- data: {
- issuableLabelsUpdated: {
- id: 'gid://gitlab/WorkItem/1',
- widgets: [
- {
- __typename: 'WorkItemWidgetLabels',
- type: 'LABELS',
- allowsScopedLabels: false,
- labels: {
- nodes: mockLabels,
- },
- },
- ],
- },
- },
-};
-
-export const workItemIterationSubscriptionResponse = {
- data: {
- issuableIterationUpdated: {
- id: 'gid://gitlab/WorkItem/1',
- widgets: [
- {
- __typename: 'WorkItemWidgetIteration',
- iteration: {
- description: 'Iteration description',
- dueDate: '2022-07-29',
- id: 'gid://gitlab/Iteration/1125',
- iid: '95',
- startDate: '2022-06-22',
- title: 'Iteration subcription title',
- },
- },
- ],
- },
- },
-};
-
-export const workItemHealthStatusSubscriptionResponse = {
- data: {
- issuableHealthStatusUpdated: {
- id: 'gid://gitlab/WorkItem/1',
- widgets: [
- {
- __typename: 'WorkItemWidgetHealthStatus',
- healthStatus: 'needsAttention',
- },
- ],
- },
- },
-};
-
-export const workItemMilestoneSubscriptionResponse = {
- data: {
- issuableMilestoneUpdated: {
- id: 'gid://gitlab/WorkItem/1',
- widgets: [
- {
- __typename: 'WorkItemWidgetMilestone',
- type: 'MILESTONE',
- milestone: {
- id: 'gid://gitlab/Milestone/1125',
- expired: false,
- title: 'Milestone title',
- },
- },
- ],
- },
- },
-};
-
export const workItemHierarchyEmptyResponse = {
data: {
workspace: {
@@ -2130,6 +2010,9 @@ export const mockWorkItemNotesResponse = {
webUrl: 'http://127.0.0.1:3000/root',
__typename: 'UserCore',
},
+ awardEmoji: {
+ nodes: [],
+ },
__typename: 'Note',
},
],
@@ -2241,6 +2124,9 @@ export const mockWorkItemNotesByIidResponse = {
webUrl: 'http://127.0.0.1:3000/root',
__typename: 'UserCore',
},
+ awardEmoji: {
+ nodes: [],
+ },
__typename: 'Note',
},
],
@@ -2294,6 +2180,9 @@ export const mockWorkItemNotesByIidResponse = {
webUrl: 'http://127.0.0.1:3000/root',
__typename: 'UserCore',
},
+ awardEmoji: {
+ nodes: [],
+ },
__typename: 'Note',
},
],
@@ -2348,6 +2237,9 @@ export const mockWorkItemNotesByIidResponse = {
webUrl: 'http://127.0.0.1:3000/root',
__typename: 'UserCore',
},
+ awardEmoji: {
+ nodes: [],
+ },
__typename: 'Note',
},
],
@@ -2460,6 +2352,9 @@ export const mockMoreWorkItemNotesResponse = {
webUrl: 'http://127.0.0.1:3000/root',
__typename: 'UserCore',
},
+ awardEmoji: {
+ nodes: [],
+ },
__typename: 'Note',
},
],
@@ -2513,6 +2408,9 @@ export const mockMoreWorkItemNotesResponse = {
webUrl: 'http://127.0.0.1:3000/root',
__typename: 'UserCore',
},
+ awardEmoji: {
+ nodes: [],
+ },
__typename: 'Note',
},
],
@@ -2564,6 +2462,9 @@ export const mockMoreWorkItemNotesResponse = {
webUrl: 'http://127.0.0.1:3000/root',
__typename: 'UserCore',
},
+ awardEmoji: {
+ nodes: [],
+ },
__typename: 'Note',
},
],
@@ -2631,6 +2532,9 @@ export const createWorkItemNoteResponse = {
repositionNote: true,
__typename: 'NotePermissions',
},
+ awardEmoji: {
+ nodes: [],
+ },
__typename: 'Note',
},
],
@@ -2682,6 +2586,9 @@ export const mockWorkItemCommentNote = {
webUrl: 'http://127.0.0.1:3000/root',
__typename: 'UserCore',
},
+ awardEmoji: {
+ nodes: [mockAwardEmojiThumbsDown],
+ },
};
export const mockWorkItemCommentNoteByContributor = {
@@ -2781,6 +2688,9 @@ export const mockWorkItemNotesResponseWithComments = {
repositionNote: true,
__typename: 'NotePermissions',
},
+ awardEmoji: {
+ nodes: [mockAwardEmojiThumbsDown],
+ },
__typename: 'Note',
},
{
@@ -2821,6 +2731,9 @@ export const mockWorkItemNotesResponseWithComments = {
repositionNote: true,
__typename: 'NotePermissions',
},
+ awardEmoji: {
+ nodes: [],
+ },
__typename: 'Note',
},
],
@@ -2869,6 +2782,9 @@ export const mockWorkItemNotesResponseWithComments = {
webUrl: 'http://127.0.0.1:3000/root',
__typename: 'UserCore',
},
+ awardEmoji: {
+ nodes: [],
+ },
__typename: 'Note',
},
],
@@ -2945,6 +2861,9 @@ export const workItemNotesCreateSubscriptionResponse = {
webUrl: 'http://127.0.0.1:3000/root',
__typename: 'UserCore',
},
+ awardEmoji: {
+ nodes: [],
+ },
__typename: 'Note',
},
],
@@ -2972,6 +2891,9 @@ export const workItemNotesCreateSubscriptionResponse = {
webUrl: 'http://127.0.0.1:3000/root',
__typename: 'UserCore',
},
+ awardEmoji: {
+ nodes: [],
+ },
__typename: 'Note',
},
},
@@ -3017,6 +2939,9 @@ export const workItemNotesUpdateSubscriptionResponse = {
webUrl: 'http://127.0.0.1:3000/root',
__typename: 'UserCore',
},
+ awardEmoji: {
+ nodes: [],
+ },
__typename: 'Note',
},
},
@@ -3176,6 +3101,9 @@ export const workItemNotesWithSystemNotesWithChangedDescription = {
},
__typename: 'SystemNoteMetadata',
},
+ awardEmoji: {
+ nodes: [],
+ },
__typename: 'Note',
},
],
@@ -3239,6 +3167,9 @@ export const workItemNotesWithSystemNotesWithChangedDescription = {
},
__typename: 'SystemNoteMetadata',
},
+ awardEmoji: {
+ nodes: [],
+ },
__typename: 'Note',
},
],
@@ -3302,6 +3233,9 @@ export const workItemNotesWithSystemNotesWithChangedDescription = {
},
__typename: 'SystemNoteMetadata',
},
+ awardEmoji: {
+ nodes: [],
+ },
__typename: 'Note',
},
],
@@ -3350,3 +3284,17 @@ export const getAwardEmojiResponse = (toggledOn) => {
},
};
};
+
+export const getTodosMutationResponse = (state) => {
+ return {
+ data: {
+ todoMutation: {
+ todo: {
+ id: 'gid://gitlab/Todo/1',
+ state,
+ },
+ errors: [],
+ },
+ },
+ };
+};
diff --git a/spec/frontend/work_items/notes/award_utils_spec.js b/spec/frontend/work_items/notes/award_utils_spec.js
new file mode 100644
index 00000000000..8ae32ce5f40
--- /dev/null
+++ b/spec/frontend/work_items/notes/award_utils_spec.js
@@ -0,0 +1,109 @@
+import { getMutation, optimisticAwardUpdate } from '~/work_items/notes/award_utils';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
+import mockApollo from 'helpers/mock_apollo_helper';
+import { __ } from '~/locale';
+import workItemNotesByIidQuery from '~/work_items/graphql/notes/work_item_notes_by_iid.query.graphql';
+import addAwardEmojiMutation from '~/work_items/graphql/notes/work_item_note_add_award_emoji.mutation.graphql';
+import removeAwardEmojiMutation from '~/work_items/graphql/notes/work_item_note_remove_award_emoji.mutation.graphql';
+import {
+ mockWorkItemNotesResponseWithComments,
+ mockAwardEmojiThumbsUp,
+ mockAwardEmojiThumbsDown,
+} from '../mock_data';
+
+function getWorkItem(data) {
+ return data.workspace.workItems.nodes[0];
+}
+function getFirstNote(workItem) {
+ return workItem.widgets.find((w) => w.type === 'NOTES').discussions.nodes[0].notes.nodes[0];
+}
+
+describe('Work item note award utils', () => {
+ const workItem = getWorkItem(mockWorkItemNotesResponseWithComments.data);
+ const firstNote = getFirstNote(workItem);
+ const fullPath = 'test-project-path';
+ const workItemIid = workItem.iid;
+ const currentUserId = getIdFromGraphQLId(mockAwardEmojiThumbsDown.user.id);
+
+ beforeEach(() => {
+ window.gon = { current_user_id: currentUserId };
+ });
+
+ describe('getMutation', () => {
+ it('returns remove mutation when user has already awarded award', () => {
+ const note = firstNote;
+ const { name } = mockAwardEmojiThumbsDown;
+
+ expect(getMutation({ note, name })).toEqual({
+ mutation: removeAwardEmojiMutation,
+ mutationName: 'awardEmojiRemove',
+ errorMessage: __('Failed to remove emoji. Please try again'),
+ });
+ });
+
+ it('returns remove mutation when user has not already awarded award', () => {
+ const note = {};
+ const { name } = mockAwardEmojiThumbsUp;
+
+ expect(getMutation({ note, name })).toEqual({
+ mutation: addAwardEmojiMutation,
+ mutationName: 'awardEmojiAdd',
+ errorMessage: __('Failed to add emoji. Please try again'),
+ });
+ });
+ });
+
+ describe('optimisticAwardUpdate', () => {
+ let apolloProvider;
+ beforeEach(() => {
+ apolloProvider = mockApollo();
+
+ apolloProvider.clients.defaultClient.writeQuery({
+ query: workItemNotesByIidQuery,
+ variables: { fullPath, iid: workItemIid },
+ ...mockWorkItemNotesResponseWithComments,
+ });
+ });
+
+ it('adds new emoji to cache', () => {
+ const note = firstNote;
+ const { name } = mockAwardEmojiThumbsUp;
+
+ const updateFn = optimisticAwardUpdate({ note, name, fullPath, workItemIid });
+
+ updateFn(apolloProvider.clients.defaultClient.cache);
+
+ const updatedResult = apolloProvider.clients.defaultClient.readQuery({
+ query: workItemNotesByIidQuery,
+ variables: { fullPath, iid: workItemIid },
+ });
+
+ const updatedWorkItem = getWorkItem(updatedResult);
+ const updatedNote = getFirstNote(updatedWorkItem);
+
+ expect(updatedNote.awardEmoji.nodes).toEqual([
+ mockAwardEmojiThumbsDown,
+ mockAwardEmojiThumbsUp,
+ ]);
+ });
+
+ it('removes existing emoji from cache', () => {
+ const note = firstNote;
+ const { name } = mockAwardEmojiThumbsDown;
+
+ const updateFn = optimisticAwardUpdate({ note, name, fullPath, workItemIid });
+
+ updateFn(apolloProvider.clients.defaultClient.cache);
+
+ const updatedResult = apolloProvider.clients.defaultClient.readQuery({
+ query: workItemNotesByIidQuery,
+ variables: { fullPath, iid: workItemIid },
+ });
+
+ const updatedWorkItem = getWorkItem(updatedResult);
+ const updatedNote = getFirstNote(updatedWorkItem);
+
+ expect(updatedNote.awardEmoji.nodes).toEqual([]);
+ });
+ });
+});
diff --git a/spec/frontend/work_items/router_spec.js b/spec/frontend/work_items/router_spec.js
index b5d54a7c319..79ba31e7012 100644
--- a/spec/frontend/work_items/router_spec.js
+++ b/spec/frontend/work_items/router_spec.js
@@ -2,28 +2,14 @@ import { mount } from '@vue/test-utils';
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import createMockApollo from 'helpers/mock_apollo_helper';
-import {
- currentUserResponse,
- workItemAssigneesSubscriptionResponse,
- workItemDatesSubscriptionResponse,
- workItemByIidResponseFactory,
- workItemTitleSubscriptionResponse,
- workItemLabelsSubscriptionResponse,
- workItemMilestoneSubscriptionResponse,
- workItemDescriptionSubscriptionResponse,
-} from 'jest/work_items/mock_data';
+import { currentUserResponse, workItemByIidResponseFactory } from 'jest/work_items/mock_data';
import currentUserQuery from '~/graphql_shared/queries/current_user.query.graphql';
import App from '~/work_items/components/app.vue';
import workItemByIidQuery from '~/work_items/graphql/work_item_by_iid.query.graphql';
-import workItemDatesSubscription from '~/graphql_shared/subscriptions/work_item_dates.subscription.graphql';
-import workItemTitleSubscription from '~/work_items/graphql/work_item_title.subscription.graphql';
-import workItemAssigneesSubscription from '~/work_items/graphql/work_item_assignees.subscription.graphql';
-import workItemLabelsSubscription from 'ee_else_ce/work_items/graphql/work_item_labels.subscription.graphql';
-import workItemMilestoneSubscription from '~/work_items/graphql/work_item_milestone.subscription.graphql';
-import workItemDescriptionSubscription from '~/work_items/graphql/work_item_description.subscription.graphql';
import CreateWorkItem from '~/work_items/pages/create_work_item.vue';
import WorkItemsRoot from '~/work_items/pages/work_item_root.vue';
import { createRouter } from '~/work_items/router';
+import workItemUpdatedSubscription from '~/work_items/graphql/work_item_updated.subscription.graphql';
jest.mock('~/behaviors/markdown/render_gfm');
@@ -34,18 +20,9 @@ describe('Work items router', () => {
const workItemQueryHandler = jest.fn().mockResolvedValue(workItemByIidResponseFactory());
const currentUserQueryHandler = jest.fn().mockResolvedValue(currentUserResponse);
- const datesSubscriptionHandler = jest.fn().mockResolvedValue(workItemDatesSubscriptionResponse);
- const titleSubscriptionHandler = jest.fn().mockResolvedValue(workItemTitleSubscriptionResponse);
- const assigneesSubscriptionHandler = jest
+ const workItemUpdatedSubscriptionHandler = jest
.fn()
- .mockResolvedValue(workItemAssigneesSubscriptionResponse);
- const labelsSubscriptionHandler = jest.fn().mockResolvedValue(workItemLabelsSubscriptionResponse);
- const milestoneSubscriptionHandler = jest
- .fn()
- .mockResolvedValue(workItemMilestoneSubscriptionResponse);
- const descriptionSubscriptionHandler = jest
- .fn()
- .mockResolvedValue(workItemDescriptionSubscriptionResponse);
+ .mockResolvedValue({ data: { workItemUpdated: null } });
const createComponent = async (routeArg) => {
const router = createRouter('/work_item');
@@ -56,12 +33,7 @@ describe('Work items router', () => {
const handlers = [
[workItemByIidQuery, workItemQueryHandler],
[currentUserQuery, currentUserQueryHandler],
- [workItemDatesSubscription, datesSubscriptionHandler],
- [workItemTitleSubscription, titleSubscriptionHandler],
- [workItemAssigneesSubscription, assigneesSubscriptionHandler],
- [workItemLabelsSubscription, labelsSubscriptionHandler],
- [workItemMilestoneSubscription, milestoneSubscriptionHandler],
- [workItemDescriptionSubscription, descriptionSubscriptionHandler],
+ [workItemUpdatedSubscription, workItemUpdatedSubscriptionHandler],
];
wrapper = mount(App, {
@@ -81,6 +53,7 @@ describe('Work items router', () => {
WorkItemIteration: true,
WorkItemHealthStatus: true,
WorkItemNotes: true,
+ WorkItemAwardEmoji: true,
},
});
};
diff --git a/spec/frontend/work_items/utils_spec.js b/spec/frontend/work_items/utils_spec.js
index b8af5f10a5a..aa24b80cf08 100644
--- a/spec/frontend/work_items/utils_spec.js
+++ b/spec/frontend/work_items/utils_spec.js
@@ -1,9 +1,4 @@
-import {
- autocompleteDataSources,
- markdownPreviewPath,
- getWorkItemTodoOptimisticResponse,
-} from '~/work_items/utils';
-import { workItemResponseFactory } from './mock_data';
+import { autocompleteDataSources, markdownPreviewPath } from '~/work_items/utils';
describe('autocompleteDataSources', () => {
beforeEach(() => {
@@ -30,17 +25,3 @@ describe('markdownPreviewPath', () => {
);
});
});
-
-describe('getWorkItemTodoOptimisticResponse', () => {
- it.each`
- scenario | pendingTodo | result
- ${'empty'} | ${false} | ${0}
- ${'present'} | ${true} | ${1}
- `('returns correct response when pending item list is $scenario', ({ pendingTodo, result }) => {
- const workItem = workItemResponseFactory({ canUpdate: true });
- expect(
- getWorkItemTodoOptimisticResponse({ workItem, pendingTodo }).workItemUpdate.workItem
- .widgets[0].currentUserTodos.edges.length,
- ).toBe(result);
- });
-});
diff --git a/spec/frontend_integration/content_editor/content_editor_integration_spec.js b/spec/frontend_integration/content_editor/content_editor_integration_spec.js
index 6bafe609995..8419c7aae63 100644
--- a/spec/frontend_integration/content_editor/content_editor_integration_spec.js
+++ b/spec/frontend_integration/content_editor/content_editor_integration_spec.js
@@ -22,6 +22,15 @@ describe('content_editor', () => {
listeners: {
...listeners,
},
+ mocks: {
+ $apollo: {
+ queries: {
+ currentUser: {
+ loading: false,
+ },
+ },
+ },
+ },
});
};
diff --git a/spec/graphql/gitlab_schema_spec.rb b/spec/graphql/gitlab_schema_spec.rb
index b5c2d4da9ac..885bbc82ecc 100644
--- a/spec/graphql/gitlab_schema_spec.rb
+++ b/spec/graphql/gitlab_schema_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe GitlabSchema do
- let_it_be(:connections) { GitlabSchema.connections.all_wrappers }
+ let_it_be(:connections) { described_class.connections.all_wrappers }
let_it_be(:tracers) { described_class.tracers }
let(:user) { build :user }
@@ -12,10 +12,6 @@ RSpec.describe GitlabSchema do
expect(tracers).to include(BatchLoader::GraphQL)
end
- it 'enables the generic instrumenter' do
- expect(tracers).to include(instance_of(::Gitlab::Graphql::GenericTracing))
- end
-
it 'has the base mutation' do
expect(described_class.mutation).to eq(::Types::MutationType)
end
diff --git a/spec/graphql/graphql_triggers_spec.rb b/spec/graphql/graphql_triggers_spec.rb
index 864818351a1..3f58f2678d8 100644
--- a/spec/graphql/graphql_triggers_spec.rb
+++ b/spec/graphql/graphql_triggers_spec.rb
@@ -20,7 +20,7 @@ RSpec.describe GraphqlTriggers, feature_category: :shared do
issuable
)
- GraphqlTriggers.issuable_assignees_updated(issuable)
+ described_class.issuable_assignees_updated(issuable)
end
end
@@ -32,7 +32,7 @@ RSpec.describe GraphqlTriggers, feature_category: :shared do
issuable
).and_call_original
- GraphqlTriggers.issuable_title_updated(issuable)
+ described_class.issuable_title_updated(issuable)
end
end
@@ -44,7 +44,7 @@ RSpec.describe GraphqlTriggers, feature_category: :shared do
issuable
).and_call_original
- GraphqlTriggers.issuable_description_updated(issuable)
+ described_class.issuable_description_updated(issuable)
end
end
@@ -62,7 +62,7 @@ RSpec.describe GraphqlTriggers, feature_category: :shared do
issuable
)
- GraphqlTriggers.issuable_labels_updated(issuable)
+ described_class.issuable_labels_updated(issuable)
end
end
@@ -74,7 +74,7 @@ RSpec.describe GraphqlTriggers, feature_category: :shared do
issuable
).and_call_original
- GraphqlTriggers.issuable_dates_updated(issuable)
+ described_class.issuable_dates_updated(issuable)
end
end
@@ -86,7 +86,7 @@ RSpec.describe GraphqlTriggers, feature_category: :shared do
issuable
).and_call_original
- GraphqlTriggers.issuable_milestone_updated(issuable)
+ described_class.issuable_milestone_updated(issuable)
end
end
@@ -100,7 +100,7 @@ RSpec.describe GraphqlTriggers, feature_category: :shared do
merge_request
).and_call_original
- GraphqlTriggers.merge_request_reviewers_updated(merge_request)
+ described_class.merge_request_reviewers_updated(merge_request)
end
end
@@ -114,7 +114,7 @@ RSpec.describe GraphqlTriggers, feature_category: :shared do
merge_request
).and_call_original
- GraphqlTriggers.merge_request_merge_status_updated(merge_request)
+ described_class.merge_request_merge_status_updated(merge_request)
end
end
@@ -128,7 +128,7 @@ RSpec.describe GraphqlTriggers, feature_category: :shared do
merge_request
).and_call_original
- GraphqlTriggers.merge_request_approval_state_updated(merge_request)
+ described_class.merge_request_approval_state_updated(merge_request)
end
end
@@ -140,7 +140,7 @@ RSpec.describe GraphqlTriggers, feature_category: :shared do
issuable
).and_call_original
- GraphqlTriggers.work_item_updated(issuable)
+ described_class.work_item_updated(issuable)
end
context 'when triggered with an Issue' do
@@ -154,7 +154,7 @@ RSpec.describe GraphqlTriggers, feature_category: :shared do
work_item
).and_call_original
- GraphqlTriggers.work_item_updated(issue)
+ described_class.work_item_updated(issue)
end
end
end
diff --git a/spec/graphql/mutations/alert_management/prometheus_integration/create_spec.rb b/spec/graphql/mutations/alert_management/prometheus_integration/create_spec.rb
index 164bd9b1e39..c92aeb43f51 100644
--- a/spec/graphql/mutations/alert_management/prometheus_integration/create_spec.rb
+++ b/spec/graphql/mutations/alert_management/prometheus_integration/create_spec.rb
@@ -6,7 +6,8 @@ RSpec.describe Mutations::AlertManagement::PrometheusIntegration::Create do
let_it_be(:current_user) { create(:user) }
let_it_be(:project) { create(:project) }
- let(:args) { { project_path: project.full_path, active: true, api_url: 'http://prometheus.com/' } }
+ let(:api_url) { 'http://prometheus.com/' }
+ let(:args) { { project_path: project.full_path, active: true, api_url: api_url } }
specify { expect(described_class).to require_graphql_authorizations(:admin_project) }
@@ -29,6 +30,14 @@ RSpec.describe Mutations::AlertManagement::PrometheusIntegration::Create do
end
end
+ context 'when api_url is nil' do
+ let(:api_url) { nil }
+
+ it 'creates the integration' do
+ expect { resolve }.to change(::Alerting::ProjectAlertingSetting, :count).by(1)
+ end
+ end
+
context 'when UpdateService responds with success' do
it 'returns the integration with no errors' do
expect(resolve).to eq(
@@ -38,7 +47,7 @@ RSpec.describe Mutations::AlertManagement::PrometheusIntegration::Create do
end
it 'creates a corresponding token' do
- expect { resolve }.to change(::Alerting::ProjectAlertingSetting, :count).by(1)
+ expect { resolve }.to change(::Integrations::Prometheus, :count).by(1)
end
end
diff --git a/spec/graphql/mutations/ci/job_token_scope/add_project_spec.rb b/spec/graphql/mutations/ci/job_token_scope/add_project_spec.rb
index 0485796fe56..54da3061323 100644
--- a/spec/graphql/mutations/ci/job_token_scope/add_project_spec.rb
+++ b/spec/graphql/mutations/ci/job_token_scope/add_project_spec.rb
@@ -20,10 +20,6 @@ RSpec.describe Mutations::Ci::JobTokenScope::AddProject, feature_category: :cont
mutation.resolve(**mutation_args)
end
- before do
- stub_feature_flags(frozen_outbound_job_token_scopes_override: false)
- end
-
context 'when user is not logged in' do
let(:current_user) { nil }
@@ -75,42 +71,6 @@ RSpec.describe Mutations::Ci::JobTokenScope::AddProject, feature_category: :cont
end
end
- context 'when FF frozen_outbound_job_token_scopes is disabled' do
- before do
- stub_feature_flags(frozen_outbound_job_token_scopes: false)
- end
-
- it 'adds target project to the outbound job token scope by default' do
- expect do
- expect(subject).to include(ci_job_token_scope: be_present, errors: be_empty)
- end.to change { Ci::JobToken::ProjectScopeLink.outbound.count }.by(1)
- end
-
- context 'when mutation uses the direction argument' do
- let(:mutation_args) { super().merge!(direction: direction) }
-
- context 'when targeting the outbound allowlist' do
- let(:direction) { :outbound }
-
- it 'adds the target project' do
- expect do
- expect(subject).to include(ci_job_token_scope: be_present, errors: be_empty)
- end.to change { Ci::JobToken::ProjectScopeLink.outbound.count }.by(1)
- end
- end
-
- context 'when targeting the inbound allowlist' do
- let(:direction) { :inbound }
-
- it 'adds the target project' do
- expect do
- expect(subject).to include(ci_job_token_scope: be_present, errors: be_empty)
- end.to change { Ci::JobToken::ProjectScopeLink.inbound.count }.by(1)
- end
- end
- end
- end
-
context 'when the service returns an error' do
let(:service) { double(:service) }
diff --git a/spec/graphql/mutations/ci/pipeline_schedule/variable_input_type_spec.rb b/spec/graphql/mutations/ci/pipeline_schedule/variable_input_type_spec.rb
index 564bc95b352..a932002d614 100644
--- a/spec/graphql/mutations/ci/pipeline_schedule/variable_input_type_spec.rb
+++ b/spec/graphql/mutations/ci/pipeline_schedule/variable_input_type_spec.rb
@@ -5,5 +5,5 @@ require 'spec_helper'
RSpec.describe Mutations::Ci::PipelineSchedule::VariableInputType, feature_category: :continuous_integration do
specify { expect(described_class.graphql_name).to eq('PipelineScheduleVariableInput') }
- it { expect(described_class.arguments.keys).to match_array(%w[key value variableType]) }
+ it { expect(described_class.arguments.keys).to match_array(%w[id key value variableType destroy]) }
end
diff --git a/spec/graphql/mutations/issues/create_spec.rb b/spec/graphql/mutations/issues/create_spec.rb
index 24348097021..04b437b27b5 100644
--- a/spec/graphql/mutations/issues/create_spec.rb
+++ b/spec/graphql/mutations/issues/create_spec.rb
@@ -19,8 +19,7 @@ RSpec.describe Mutations::Issues::Create do
description: 'new description',
confidential: true,
due_date: Date.tomorrow,
- discussion_locked: true,
- issue_type: 'issue'
+ discussion_locked: true
}
end
@@ -29,7 +28,8 @@ RSpec.describe Mutations::Issues::Create do
project_path: project.full_path,
milestone_id: milestone.to_global_id,
labels: [project_label1.title, project_label2.title, new_label1, new_label2],
- assignee_ids: [assignee1.to_global_id, assignee2.to_global_id]
+ assignee_ids: [assignee1.to_global_id, assignee2.to_global_id],
+ issue_type: 'issue'
}.merge(expected_attributes)
end
diff --git a/spec/graphql/resolvers/alert_management/http_integrations_resolver_spec.rb b/spec/graphql/resolvers/alert_management/http_integrations_resolver_spec.rb
index 0f40565c5d3..80234aaaacf 100644
--- a/spec/graphql/resolvers/alert_management/http_integrations_resolver_spec.rb
+++ b/spec/graphql/resolvers/alert_management/http_integrations_resolver_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Resolvers::AlertManagement::HttpIntegrationsResolver do
+RSpec.describe Resolvers::AlertManagement::HttpIntegrationsResolver, feature_category: :incident_management do
include GraphqlHelpers
let_it_be(:guest) { create(:user) }
@@ -13,6 +13,7 @@ RSpec.describe Resolvers::AlertManagement::HttpIntegrationsResolver do
let_it_be(:active_http_integration) { create(:alert_management_http_integration, project: project) }
let_it_be(:inactive_http_integration) { create(:alert_management_http_integration, :inactive, project: project) }
let_it_be(:other_proj_integration) { create(:alert_management_http_integration) }
+ let_it_be(:migrated_integration) { create(:alert_management_prometheus_integration, :legacy, project: project) }
let(:params) { {} }
diff --git a/spec/graphql/resolvers/alert_management/integrations_resolver_spec.rb b/spec/graphql/resolvers/alert_management/integrations_resolver_spec.rb
index 11114d41522..ed2e7d35ee3 100644
--- a/spec/graphql/resolvers/alert_management/integrations_resolver_spec.rb
+++ b/spec/graphql/resolvers/alert_management/integrations_resolver_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Resolvers::AlertManagement::IntegrationsResolver do
+RSpec.describe Resolvers::AlertManagement::IntegrationsResolver, feature_category: :incident_management do
include GraphqlHelpers
let_it_be(:current_user) { create(:user) }
@@ -13,6 +13,7 @@ RSpec.describe Resolvers::AlertManagement::IntegrationsResolver do
let_it_be(:inactive_http_integration) { create(:alert_management_http_integration, :inactive, project: project) }
let_it_be(:other_proj_integration) { create(:alert_management_http_integration, project: project2) }
let_it_be(:other_proj_prometheus_integration) { create(:prometheus_integration, project: project2) }
+ let_it_be(:migrated_integration) { create(:alert_management_prometheus_integration, :legacy, project: project) }
let(:params) { {} }
diff --git a/spec/graphql/resolvers/board_lists_resolver_spec.rb b/spec/graphql/resolvers/board_lists_resolver_spec.rb
index 0f6e51ebbd0..1de59c5f507 100644
--- a/spec/graphql/resolvers/board_lists_resolver_spec.rb
+++ b/spec/graphql/resolvers/board_lists_resolver_spec.rb
@@ -21,6 +21,7 @@ RSpec.describe Resolvers::BoardListsResolver do
end
it 'does not create the backlog list' do
+ board.lists.backlog.delete_all
lists = resolve_board_lists
expect(lists.count).to eq 1
@@ -35,7 +36,6 @@ RSpec.describe Resolvers::BoardListsResolver do
context 'when authorized' do
let!(:label_list) { create(:list, board: board, label: label) }
- let!(:backlog_list) { create(:backlog_list, board: board) }
it 'returns a list of board lists' do
lists = resolve_board_lists
diff --git a/spec/graphql/resolvers/ci/config_resolver_spec.rb b/spec/graphql/resolvers/ci/config_resolver_spec.rb
index 692bdf58784..16a2286cb7e 100644
--- a/spec/graphql/resolvers/ci/config_resolver_spec.rb
+++ b/spec/graphql/resolvers/ci/config_resolver_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Resolvers::Ci::ConfigResolver do
+RSpec.describe Resolvers::Ci::ConfigResolver, feature_category: :continuous_integration do
include GraphqlHelpers
describe '#resolve' do
diff --git a/spec/graphql/resolvers/ci/inherited_variables_resolver_spec.rb b/spec/graphql/resolvers/ci/inherited_variables_resolver_spec.rb
index 6837d4b0459..e1a76ce0f0f 100644
--- a/spec/graphql/resolvers/ci/inherited_variables_resolver_spec.rb
+++ b/spec/graphql/resolvers/ci/inherited_variables_resolver_spec.rb
@@ -11,15 +11,16 @@ RSpec.describe Resolvers::Ci::InheritedVariablesResolver, feature_category: :sec
let_it_be(:subgroup) { create(:group, parent: group) }
let_it_be(:project) { create(:project, group: subgroup) }
let_it_be(:project_without_group) { create(:project) }
+ let_it_be(:variable1) { create(:ci_group_variable, group: group, key: 'GROUP_VAR_A', created_at: 1.day.ago) }
+ let_it_be(:variable2) { create(:ci_group_variable, group: subgroup, key: 'SUBGROUP_VAR_B') }
let_it_be(:inherited_ci_variables) do
- [
- create(:ci_group_variable, group: group, key: 'GROUP_VAR_A'),
- create(:ci_group_variable, group: subgroup, key: 'SUBGROUP_VAR_B')
- ]
+ [variable1, variable2]
end
- subject(:resolve_variables) { resolve(described_class, obj: obj, ctx: { current_user: user }, args: {}) }
+ let(:args) { {} }
+
+ subject(:resolve_variables) { resolve(described_class, obj: obj, args: args, ctx: { current_user: user }) }
context 'when project does not have a group' do
let_it_be(:obj) { project_without_group }
@@ -36,5 +37,47 @@ RSpec.describe Resolvers::Ci::InheritedVariablesResolver, feature_category: :sec
expect(resolve_variables.items.to_a).to match_array(inherited_ci_variables)
end
end
+
+ describe 'sorting behaviour' do
+ let_it_be(:obj) { project }
+
+ context 'with sort by default (created_at descending)' do
+ it 'returns variables ordered by created_at in descending order' do
+ expect(resolve_variables.items.to_a).to eq([variable2, variable1])
+ end
+ end
+
+ context 'with sort by created_at descending' do
+ let(:args) { { sort: 'CREATED_DESC' } }
+
+ it 'returns variables ordered by created_at in descending order' do
+ expect(resolve_variables.items.to_a).to eq([variable2, variable1])
+ end
+ end
+
+ context 'with sort by created_at ascending' do
+ let(:args) { { sort: 'CREATED_ASC' } }
+
+ it 'returns variables ordered by created_at in ascending order' do
+ expect(resolve_variables.items.to_a).to eq([variable1, variable2])
+ end
+ end
+
+ context 'with sort by key descending' do
+ let(:args) { { sort: 'KEY_DESC' } }
+
+ it 'returns variables ordered by key in descending order' do
+ expect(resolve_variables.items.to_a).to eq([variable2, variable1])
+ end
+ end
+
+ context 'with sort by key ascending' do
+ let(:args) { { sort: 'KEY_ASC' } }
+
+ it 'returns variables ordered by key in ascending order' do
+ expect(resolve_variables.items.to_a).to eq([variable1, variable2])
+ end
+ end
+ end
end
end
diff --git a/spec/graphql/resolvers/ci/job_token_scope_resolver_spec.rb b/spec/graphql/resolvers/ci/job_token_scope_resolver_spec.rb
index 92f4d3dd8e8..d2bcc7cd597 100644
--- a/spec/graphql/resolvers/ci/job_token_scope_resolver_spec.rb
+++ b/spec/graphql/resolvers/ci/job_token_scope_resolver_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Resolvers::Ci::JobTokenScopeResolver do
+RSpec.describe Resolvers::Ci::JobTokenScopeResolver, feature_category: :continuous_integration do
include GraphqlHelpers
let_it_be(:current_user) { create(:user) }
diff --git a/spec/graphql/resolvers/ci/project_pipeline_counts_resolver_spec.rb b/spec/graphql/resolvers/ci/project_pipeline_counts_resolver_spec.rb
index 07b4a5509b2..e04bed0f077 100644
--- a/spec/graphql/resolvers/ci/project_pipeline_counts_resolver_spec.rb
+++ b/spec/graphql/resolvers/ci/project_pipeline_counts_resolver_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Resolvers::Ci::ProjectPipelineCountsResolver do
+RSpec.describe Resolvers::Ci::ProjectPipelineCountsResolver, feature_category: :continuous_integration do
include GraphqlHelpers
let(:current_user) { create(:user) }
diff --git a/spec/graphql/resolvers/ci/runner_job_count_resolver_spec.rb b/spec/graphql/resolvers/ci/runner_job_count_resolver_spec.rb
new file mode 100644
index 00000000000..6336ea883f7
--- /dev/null
+++ b/spec/graphql/resolvers/ci/runner_job_count_resolver_spec.rb
@@ -0,0 +1,56 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Resolvers::Ci::RunnerJobCountResolver, feature_category: :runner_fleet do
+ include GraphqlHelpers
+
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:pipeline) { create(:ci_pipeline, project: project) }
+ let_it_be(:irrelevant_pipeline) { create(:ci_pipeline, project: project) }
+
+ let_it_be(:runner) { create(:ci_runner, :project, projects: [project]) }
+
+ let_it_be(:build_one) { create(:ci_build, :success, name: 'Build One', runner: runner, pipeline: pipeline) }
+ let_it_be(:build_two) { create(:ci_build, :success, name: 'Build Two', runner: runner, pipeline: pipeline) }
+ let_it_be(:build_three) { create(:ci_build, :failed, name: 'Build Three', runner: runner, pipeline: pipeline) }
+ let_it_be(:irrelevant_build) { create(:ci_build, name: 'Irrelevant Build', pipeline: irrelevant_pipeline) }
+
+ describe '#resolve' do
+ subject(:job_count) { resolve_job_count(args) }
+
+ let(:args) { {} }
+
+ context 'with authorized user', :enable_admin_mode do
+ let(:current_user) { create(:user, :admin) }
+
+ context 'with statuses argument filtering on successful builds' do
+ let(:args) { { statuses: [Types::Ci::JobStatusEnum.coerce_isolated_input('SUCCESS')] } }
+
+ it { is_expected.to eq 2 }
+ end
+
+ context 'with statuses argument filtering on failed builds' do
+ let(:args) { { statuses: [Types::Ci::JobStatusEnum.coerce_isolated_input('FAILED')] } }
+
+ it { is_expected.to eq 1 }
+ end
+
+ context 'without statuses argument' do
+ it { is_expected.to eq 3 }
+ end
+ end
+
+ context 'with unauthorized user' do
+ let(:current_user) { nil }
+
+ it { is_expected.to be_nil }
+ end
+ end
+
+ private
+
+ def resolve_job_count(args = {}, context = { current_user: current_user })
+ resolve(described_class, obj: runner, args: args, ctx: context)&.value
+ end
+end
diff --git a/spec/graphql/resolvers/ci/runner_jobs_resolver_spec.rb b/spec/graphql/resolvers/ci/runner_jobs_resolver_spec.rb
index 963a642fa4e..322bead0d3c 100644
--- a/spec/graphql/resolvers/ci/runner_jobs_resolver_spec.rb
+++ b/spec/graphql/resolvers/ci/runner_jobs_resolver_spec.rb
@@ -9,17 +9,18 @@ RSpec.describe Resolvers::Ci::RunnerJobsResolver, feature_category: :runner_flee
let_it_be(:pipeline) { create(:ci_pipeline, project: project) }
let_it_be(:irrelevant_pipeline) { create(:ci_pipeline, project: project) }
- let!(:build_one) { create(:ci_build, :success, name: 'Build One', runner: runner, pipeline: pipeline) }
- let!(:build_two) { create(:ci_build, :success, name: 'Build Two', runner: runner, pipeline: pipeline) }
- let!(:build_three) { create(:ci_build, :failed, name: 'Build Three', runner: runner, pipeline: pipeline) }
- let!(:irrelevant_build) { create(:ci_build, name: 'Irrelevant Build', pipeline: irrelevant_pipeline) }
+ let_it_be(:runner) { create(:ci_runner, :project, projects: [project]) }
- let(:args) { {} }
- let(:runner) { create(:ci_runner, :project, projects: [project]) }
-
- subject { resolve_jobs(args) }
+ let_it_be(:build_one) { create(:ci_build, :success, name: 'Build One', runner: runner, pipeline: pipeline) }
+ let_it_be(:build_two) { create(:ci_build, :success, name: 'Build Two', runner: runner, pipeline: pipeline) }
+ let_it_be(:build_three) { create(:ci_build, :failed, name: 'Build Three', runner: runner, pipeline: pipeline) }
+ let_it_be(:irrelevant_build) { create(:ci_build, name: 'Irrelevant Build', pipeline: irrelevant_pipeline) }
describe '#resolve' do
+ subject(:jobs) { resolve_jobs(args) }
+
+ let(:args) { {} }
+
context 'with authorized user', :enable_admin_mode do
let(:current_user) { create(:user, :admin) }
diff --git a/spec/graphql/resolvers/ci/runners_resolver_spec.rb b/spec/graphql/resolvers/ci/runners_resolver_spec.rb
index e4620b96cae..02fc7d28255 100644
--- a/spec/graphql/resolvers/ci/runners_resolver_spec.rb
+++ b/spec/graphql/resolvers/ci/runners_resolver_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe Resolvers::Ci::RunnersResolver, feature_category: :runner_fleet d
let(:obj) { nil }
let(:args) { {} }
- subject do
+ subject(:resolve_scope) do
resolve(described_class, obj: obj, ctx: { current_user: user }, args: args,
arg_style: :internal)
end
diff --git a/spec/graphql/resolvers/design_management/version_resolver_spec.rb b/spec/graphql/resolvers/design_management/version_resolver_spec.rb
index ab1d7d4d9c5..b72b02bf89b 100644
--- a/spec/graphql/resolvers/design_management/version_resolver_spec.rb
+++ b/spec/graphql/resolvers/design_management/version_resolver_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Resolvers::DesignManagement::VersionResolver do
+RSpec.describe Resolvers::DesignManagement::VersionResolver, feature_category: :shared do
include GraphqlHelpers
include DesignManagementTestHelpers
diff --git a/spec/graphql/resolvers/echo_resolver_spec.rb b/spec/graphql/resolvers/echo_resolver_spec.rb
index 59a121ac7de..02ec7327f74 100644
--- a/spec/graphql/resolvers/echo_resolver_spec.rb
+++ b/spec/graphql/resolvers/echo_resolver_spec.rb
@@ -14,7 +14,7 @@ RSpec.describe Resolvers::EchoResolver do
describe '#resolve' do
it 'echoes text and username' do
- expect(resolve_echo(text)).to eq %Q("#{current_user.username}" says: #{text})
+ expect(resolve_echo(text)).to eq %("#{current_user.username}" says: #{text})
end
it 'echoes text and nil as username' do
diff --git a/spec/graphql/resolvers/issue_status_counts_resolver_spec.rb b/spec/graphql/resolvers/issue_status_counts_resolver_spec.rb
index 86a4154f23b..012c40e358f 100644
--- a/spec/graphql/resolvers/issue_status_counts_resolver_spec.rb
+++ b/spec/graphql/resolvers/issue_status_counts_resolver_spec.rb
@@ -71,7 +71,7 @@ RSpec.describe Resolvers::IssueStatusCountsResolver do
context 'when both assignee_username and assignee_usernames are provided' do
it 'returns a mutually exclusive filter error' do
- expect_graphql_error_to_be_created(Gitlab::Graphql::Errors::ArgumentError, 'only one of [assigneeUsernames, assigneeUsername] arguments is allowed at the same time.') do
+ expect_graphql_error_to_be_created(Gitlab::Graphql::Errors::ArgumentError, 'only one of [assigneeUsernames, assigneeUsername, assigneeWildcardId] arguments is allowed at the same time.') do
resolve_issue_status_counts(assignee_usernames: [current_user.username], assignee_username: current_user.username)
end
end
diff --git a/spec/graphql/resolvers/metrics/dashboard_resolver_spec.rb b/spec/graphql/resolvers/metrics/dashboard_resolver_spec.rb
deleted file mode 100644
index 354fd350aa7..00000000000
--- a/spec/graphql/resolvers/metrics/dashboard_resolver_spec.rb
+++ /dev/null
@@ -1,56 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Resolvers::Metrics::DashboardResolver, feature_category: :metrics do
- include GraphqlHelpers
-
- let_it_be(:current_user) { create(:user) }
-
- describe '#resolve' do
- subject(:resolve_dashboard) { resolve(described_class, obj: parent_object, args: args, ctx: { current_user: current_user }) }
-
- let(:args) do
- {
- path: 'config/prometheus/common_metrics.yml'
- }
- end
-
- context 'for environment' do
- let(:project) { create(:project) }
- let(:parent_object) { create(:environment, project: project) }
-
- before do
- stub_feature_flags(remove_monitor_metrics: false)
- project.add_developer(current_user)
- end
-
- it 'use ActiveModel class to find matching dashboard', :aggregate_failures do
- expected_arguments = { project: project, user: current_user, path: args[:path], options: { environment: parent_object } }
-
- expect(PerformanceMonitoring::PrometheusDashboard).to receive(:find_for).with(expected_arguments).and_return(PerformanceMonitoring::PrometheusDashboard.new)
- expect(resolve_dashboard).to be_instance_of PerformanceMonitoring::PrometheusDashboard
- end
-
- context 'without parent object' do
- let(:parent_object) { nil }
-
- it 'returns nil', :aggregate_failures do
- expect(PerformanceMonitoring::PrometheusDashboard).not_to receive(:find_for)
- expect(resolve_dashboard).to be_nil
- end
- end
-
- context 'when metrics dashboard feature is unavailable' do
- before do
- stub_feature_flags(remove_monitor_metrics: true)
- end
-
- it 'returns nil', :aggregate_failures do
- expect(PerformanceMonitoring::PrometheusDashboard).not_to receive(:find_for)
- expect(resolve_dashboard).to be_nil
- end
- end
- end
- end
-end
diff --git a/spec/graphql/resolvers/project_issues_resolver_spec.rb b/spec/graphql/resolvers/project_issues_resolver_spec.rb
index a510baab5a9..faafbc465e3 100644
--- a/spec/graphql/resolvers/project_issues_resolver_spec.rb
+++ b/spec/graphql/resolvers/project_issues_resolver_spec.rb
@@ -195,7 +195,7 @@ RSpec.describe Resolvers::ProjectIssuesResolver do
context 'when both assignee_username and assignee_usernames are provided' do
it 'generates a mutually exclusive filter error' do
- expect_graphql_error_to_be_created(Gitlab::Graphql::Errors::ArgumentError, 'only one of [assigneeUsernames, assigneeUsername] arguments is allowed at the same time.') do
+ expect_graphql_error_to_be_created(Gitlab::Graphql::Errors::ArgumentError, 'only one of [assigneeUsernames, assigneeUsername, assigneeWildcardId] arguments is allowed at the same time.') do
resolve_issues(assignee_usernames: [assignee.username], assignee_username: assignee.username)
end
end
diff --git a/spec/graphql/resolvers/users/participants_resolver_spec.rb b/spec/graphql/resolvers/users/participants_resolver_spec.rb
index 63a14daabba..22111626c5b 100644
--- a/spec/graphql/resolvers/users/participants_resolver_spec.rb
+++ b/spec/graphql/resolvers/users/participants_resolver_spec.rb
@@ -137,7 +137,8 @@ RSpec.describe Resolvers::Users::ParticipantsResolver do
# 1 extra query per source (3 emojis + 2 notes) to fetch participables collection
# 2 extra queries to load work item widgets collection
- expect { query.call }.not_to exceed_query_limit(control_count).with_threshold(7)
+ # 1 extra query to load the project creator to check if they are banned
+ expect { query.call }.not_to exceed_query_limit(control_count).with_threshold(8)
end
it 'does not execute N+1 for system note metadata relation' do
diff --git a/spec/graphql/types/alert_management/alert_type_spec.rb b/spec/graphql/types/alert_management/alert_type_spec.rb
index 4428fc0683a..92e8104fc4d 100644
--- a/spec/graphql/types/alert_management/alert_type_spec.rb
+++ b/spec/graphql/types/alert_management/alert_type_spec.rb
@@ -31,7 +31,6 @@ RSpec.describe GitlabSchema.types['AlertManagementAlert'], feature_category: :in
assignees
notes
discussions
- metrics_dashboard_url
runbook
todos
details_url
diff --git a/spec/graphql/types/ci/detailed_status_type_spec.rb b/spec/graphql/types/ci/detailed_status_type_spec.rb
index 81ab1b52552..69fb2bc43c0 100644
--- a/spec/graphql/types/ci/detailed_status_type_spec.rb
+++ b/spec/graphql/types/ci/detailed_status_type_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe Types::Ci::DetailedStatusType do
include GraphqlHelpers
- let_it_be(:stage) { create(:ci_stage, status: :skipped) }
+ let_it_be(:stage) { create(:ci_stage, status: :manual) }
specify { expect(described_class.graphql_name).to eq('DetailedStatus') }
diff --git a/spec/graphql/types/ci/group_variable_type_spec.rb b/spec/graphql/types/ci/group_variable_type_spec.rb
index 106935642f2..ef6d8279523 100644
--- a/spec/graphql/types/ci/group_variable_type_spec.rb
+++ b/spec/graphql/types/ci/group_variable_type_spec.rb
@@ -5,5 +5,7 @@ require 'spec_helper'
RSpec.describe GitlabSchema.types['CiGroupVariable'] do
specify { expect(described_class.interfaces).to contain_exactly(Types::Ci::VariableInterface) }
- specify { expect(described_class).to have_graphql_fields(:environment_scope, :masked, :protected).at_least }
+ specify do
+ expect(described_class).to have_graphql_fields(:environment_scope, :masked, :protected, :description).at_least
+ end
end
diff --git a/spec/graphql/types/ci/project_variable_type_spec.rb b/spec/graphql/types/ci/project_variable_type_spec.rb
index e6e045b2bca..cec0753fcba 100644
--- a/spec/graphql/types/ci/project_variable_type_spec.rb
+++ b/spec/graphql/types/ci/project_variable_type_spec.rb
@@ -5,5 +5,7 @@ require 'spec_helper'
RSpec.describe GitlabSchema.types['CiProjectVariable'] do
specify { expect(described_class.interfaces).to contain_exactly(Types::Ci::VariableInterface) }
- specify { expect(described_class).to have_graphql_fields(:environment_scope, :masked, :protected).at_least }
+ specify do
+ expect(described_class).to have_graphql_fields(:environment_scope, :masked, :protected, :description).at_least
+ end
end
diff --git a/spec/graphql/types/commit_signatures/verification_status_enum_spec.rb b/spec/graphql/types/commit_signatures/verification_status_enum_spec.rb
index a0d99f5f0c1..7fc600745df 100644
--- a/spec/graphql/types/commit_signatures/verification_status_enum_spec.rb
+++ b/spec/graphql/types/commit_signatures/verification_status_enum_spec.rb
@@ -10,7 +10,7 @@ RSpec.describe GitlabSchema.types['VerificationStatus'] do
.to match_array(%w[
UNVERIFIED UNVERIFIED_KEY VERIFIED
SAME_USER_DIFFERENT_EMAIL OTHER_USER UNKNOWN_KEY
- MULTIPLE_SIGNATURES REVOKED_KEY
+ MULTIPLE_SIGNATURES REVOKED_KEY VERIFIED_SYSTEM
])
end
end
diff --git a/spec/graphql/types/deployment_tag_type_spec.rb b/spec/graphql/types/deployment_tag_type_spec.rb
new file mode 100644
index 00000000000..b6741c208fe
--- /dev/null
+++ b/spec/graphql/types/deployment_tag_type_spec.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['DeploymentTag'], feature_category: :continuous_delivery do
+ specify { expect(described_class.graphql_name).to eq('DeploymentTag') }
+
+ it 'has the expected fields' do
+ expected_fields = %w[
+ name path
+ ]
+
+ expect(described_class).to have_graphql_fields(*expected_fields)
+ end
+end
diff --git a/spec/graphql/types/detployment_tag_type_spec.rb b/spec/graphql/types/detployment_tag_type_spec.rb
deleted file mode 100644
index 9a7a8db0970..00000000000
--- a/spec/graphql/types/detployment_tag_type_spec.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe GitlabSchema.types['DeploymentTag'] do
- specify { expect(described_class.graphql_name).to eq('DeploymentTag') }
-
- it 'has the expected fields' do
- expected_fields = %w[
- name path
- ]
-
- expect(described_class).to have_graphql_fields(*expected_fields)
- end
-end
diff --git a/spec/graphql/types/environment_type_spec.rb b/spec/graphql/types/environment_type_spec.rb
index 721c20efc81..1d1bc4b2cb4 100644
--- a/spec/graphql/types/environment_type_spec.rb
+++ b/spec/graphql/types/environment_type_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe GitlabSchema.types['Environment'] do
it 'includes the expected fields' do
expected_fields = %w[
- name id state metrics_dashboard latest_opened_most_severe_alert path external_url deployments
+ name id state latest_opened_most_severe_alert path external_url deployments
slug createdAt updatedAt autoStopAt autoDeleteAt tier environmentType lastDeployment deployFreezes
clusterAgent
]
diff --git a/spec/graphql/types/global_id_type_spec.rb b/spec/graphql/types/global_id_type_spec.rb
index fa0b34113bc..8ce0bc2b70a 100644
--- a/spec/graphql/types/global_id_type_spec.rb
+++ b/spec/graphql/types/global_id_type_spec.rb
@@ -105,12 +105,12 @@ RSpec.describe Types::GlobalIDType do
around do |example|
# Unset all previously memoized GlobalIDTypes to allow us to define one
# that will use the constants stubbed in the `before` block.
- previous_id_types = Types::GlobalIDType.instance_variable_get(:@id_types)
- Types::GlobalIDType.instance_variable_set(:@id_types, {})
+ previous_id_types = described_class.instance_variable_get(:@id_types)
+ described_class.instance_variable_set(:@id_types, {})
example.run
ensure
- Types::GlobalIDType.instance_variable_set(:@id_types, previous_id_types)
+ described_class.instance_variable_set(:@id_types, previous_id_types)
end
before do
diff --git a/spec/graphql/types/ide_type_spec.rb b/spec/graphql/types/ide_type_spec.rb
new file mode 100644
index 00000000000..b0e43332fa8
--- /dev/null
+++ b/spec/graphql/types/ide_type_spec.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['Ide'], feature_category: :web_ide do
+ specify { expect(described_class.graphql_name).to eq('Ide') }
+
+ it 'has the expected fields' do
+ expected_fields = %w[
+ codeSuggestionsEnabled
+ ]
+
+ expect(described_class).to have_graphql_fields(*expected_fields)
+ end
+end
diff --git a/spec/graphql/types/issue_type_spec.rb b/spec/graphql/types/issue_type_spec.rb
index a9fe85ac62f..7c4f2a06147 100644
--- a/spec/graphql/types/issue_type_spec.rb
+++ b/spec/graphql/types/issue_type_spec.rb
@@ -266,7 +266,6 @@ RSpec.describe GitlabSchema.types['Issue'] do
context 'for an incident' do
before do
issue.update!(
- issue_type: WorkItems::Type.base_types[:incident],
work_item_type: WorkItems::Type.default_by_type(:incident)
)
end
diff --git a/spec/graphql/types/metrics/dashboard_type_spec.rb b/spec/graphql/types/metrics/dashboard_type_spec.rb
deleted file mode 100644
index 114db87d5f1..00000000000
--- a/spec/graphql/types/metrics/dashboard_type_spec.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe GitlabSchema.types['MetricsDashboard'] do
- specify { expect(described_class.graphql_name).to eq('MetricsDashboard') }
-
- it 'has the expected fields' do
- expected_fields = %w[
- path annotations schema_validation_warnings
- ]
-
- expect(described_class).to have_graphql_fields(*expected_fields)
- end
-
- describe 'annotations field' do
- subject { described_class.fields['annotations'] }
-
- it { is_expected.to have_graphql_type(Types::Metrics::Dashboards::AnnotationType.connection_type) }
- it { is_expected.to have_graphql_resolver(Resolvers::Metrics::Dashboards::AnnotationResolver) }
- end
-end
diff --git a/spec/graphql/types/project_statistics_type_spec.rb b/spec/graphql/types/project_statistics_type_spec.rb
index a958a5150aa..558ff41f6f4 100644
--- a/spec/graphql/types/project_statistics_type_spec.rb
+++ b/spec/graphql/types/project_statistics_type_spec.rb
@@ -3,8 +3,8 @@
require 'spec_helper'
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,
+ it 'has the expected fields' do
+ expect(described_class).to include_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, :container_registry_size)
diff --git a/spec/graphql/types/project_type_spec.rb b/spec/graphql/types/project_type_spec.rb
index bcfdb05ca90..262164a0821 100644
--- a/spec/graphql/types/project_type_spec.rb
+++ b/spec/graphql/types/project_type_spec.rb
@@ -909,6 +909,14 @@ RSpec.describe GitlabSchema.types['Project'] do
expect(forks).to contain_exactly(a_hash_including('fullPath' => fork_developer.full_path),
a_hash_including('fullPath' => fork_group_developer.full_path))
end
+
+ context 'when current user is not set' do
+ let(:user) { nil }
+
+ it 'does not return any forks' do
+ expect(forks.count).to eq(0)
+ end
+ end
end
end
end
diff --git a/spec/graphql/types/root_storage_statistics_type_spec.rb b/spec/graphql/types/root_storage_statistics_type_spec.rb
index 56f58825db0..00f4092baf4 100644
--- a/spec/graphql/types/root_storage_statistics_type_spec.rb
+++ b/spec/graphql/types/root_storage_statistics_type_spec.rb
@@ -5,11 +5,11 @@ require 'spec_helper'
RSpec.describe GitlabSchema.types['RootStorageStatistics'] do
specify { expect(described_class.graphql_name).to eq('RootStorageStatistics') }
- it 'has all the required fields' do
- expect(described_class).to have_graphql_fields(:storage_size, :repository_size, :lfs_objects_size,
+ it 'has the expected fields' do
+ expect(described_class).to include_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,
- :container_registry_size, :registry_size_estimated)
+ :container_registry_size, :container_registry_size_is_estimated, :registry_size_estimated)
end
specify { expect(described_class).to require_graphql_authorizations(:read_statistics) }
diff --git a/spec/graphql/types/user_type_spec.rb b/spec/graphql/types/user_type_spec.rb
index 777972df88b..af0f8a86b6c 100644
--- a/spec/graphql/types/user_type_spec.rb
+++ b/spec/graphql/types/user_type_spec.rb
@@ -55,6 +55,8 @@ RSpec.describe GitlabSchema.types['User'], feature_category: :user_profile do
organization
jobTitle
createdAt
+ pronouns
+ ide
]
expect(described_class).to include_graphql_fields(*expected_fields)
@@ -77,13 +79,13 @@ RSpec.describe GitlabSchema.types['User'], feature_category: :user_profile do
let(:username) { requested_user.username }
let(:query) do
- %(
+ <<~GQL
query {
user(username: "#{username}") {
name
}
}
- )
+ GQL
end
subject(:user_name) { GitlabSchema.execute(query, context: { current_user: current_user }).as_json.dig('data', 'user', 'name') }
@@ -254,4 +256,40 @@ RSpec.describe GitlabSchema.types['User'], feature_category: :user_profile do
is_expected.to have_graphql_type(Types::Users::NamespaceCommitEmailType.connection_type)
end
end
+
+ describe 'ide field' do
+ subject { described_class.fields['ide'] }
+
+ it 'returns ide' do
+ is_expected.to have_graphql_type(Types::IdeType)
+ end
+
+ context 'code suggestions enabled' do
+ let(:current_user) { create(:user) }
+ let(:query) do
+ <<~GQL
+ query {
+ currentUser {
+ ide {
+ codeSuggestionsEnabled
+ }
+ }
+ }
+ GQL
+ end
+
+ subject(:code_suggestions_enabled) do
+ GitlabSchema.execute(query, context: { current_user: current_user })
+ .as_json
+ .dig('data', 'currentUser', 'ide', 'codeSuggestionsEnabled')
+ end
+
+ it 'returns code suggestions enabled' do
+ allow(current_user).to receive(:can?).with(:access_code_suggestions).and_return(true)
+
+ expect(current_user).to receive(:can?).with(:access_code_suggestions).and_return(true)
+ expect(code_suggestions_enabled).to be true
+ end
+ end
+ end
end
diff --git a/spec/helpers/admin/application_settings/settings_helper_spec.rb b/spec/helpers/admin/application_settings/settings_helper_spec.rb
index efffc224eb2..b008f52c0eb 100644
--- a/spec/helpers/admin/application_settings/settings_helper_spec.rb
+++ b/spec/helpers/admin/application_settings/settings_helper_spec.rb
@@ -33,6 +33,12 @@ RSpec.describe Admin::ApplicationSettings::SettingsHelper do
end
describe 'Code Suggestions for Self-Managed instances', feature_category: :code_suggestions do
+ describe '#code_suggestions_description' do
+ subject { helper.code_suggestions_description }
+
+ it { is_expected.to include 'https://docs.gitlab.com/ee/user/project/repository/code_suggestions.html' }
+ end
+
describe '#code_suggestions_token_explanation' do
subject { helper.code_suggestions_token_explanation }
diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb
index 01be083b506..6ef57f8e22c 100644
--- a/spec/helpers/application_helper_spec.rb
+++ b/spec/helpers/application_helper_spec.rb
@@ -200,6 +200,60 @@ RSpec.describe ApplicationHelper do
it { expect(helper.active_when(false)).to eq(nil) }
end
+ describe '#linkedin_url?' do
+ using RSpec::Parameterized::TableSyntax
+
+ let(:user) { build_stubbed(:user) }
+
+ subject { helper.linkedin_url(user) }
+
+ before do
+ user.linkedin = linkedin_name
+ end
+
+ where(:linkedin_name, :linkedin_url) do
+ nil | 'https://www.linkedin.com/in/'
+ '' | 'https://www.linkedin.com/in/'
+ 'alice' | 'https://www.linkedin.com/in/alice'
+ 'http://www.linkedin.com/in/alice' | 'http://www.linkedin.com/in/alice'
+ 'http://linkedin.com/in/alice' | 'http://linkedin.com/in/alice'
+ 'https://www.linkedin.com/in/alice' | 'https://www.linkedin.com/in/alice'
+ 'https://linkedin.com/in/alice' | 'https://linkedin.com/in/alice'
+ 'https://linkedin.com/in/alice/more/path' | 'https://linkedin.com/in/alice/more/path'
+ end
+
+ with_them do
+ it { is_expected.to eq(linkedin_url) }
+ end
+ end
+
+ describe '#twitter_url?' do
+ using RSpec::Parameterized::TableSyntax
+
+ let(:user) { build_stubbed(:user) }
+
+ subject { helper.twitter_url(user) }
+
+ before do
+ user.twitter = twitter_name
+ end
+
+ where(:twitter_name, :twitter_url) do
+ nil | 'https://twitter.com/'
+ '' | 'https://twitter.com/'
+ 'alice' | 'https://twitter.com/alice'
+ 'http://www.twitter.com/alice' | 'http://www.twitter.com/alice'
+ 'http://twitter.com/alice' | 'http://twitter.com/alice'
+ 'https://www.twitter.com/alice' | 'https://www.twitter.com/alice'
+ 'https://twitter.com/alice' | 'https://twitter.com/alice'
+ 'https://twitter.com/alice/more/path' | 'https://twitter.com/alice/more/path'
+ end
+
+ with_them do
+ it { is_expected.to eq(twitter_url) }
+ end
+ end
+
unless Gitlab.jh?
describe '#promo_host' do
subject { helper.promo_host }
@@ -433,7 +487,8 @@ RSpec.describe ApplicationHelper do
page: 'application',
page_type_id: nil,
find_file: nil,
- group: nil
+ group: nil,
+ group_full_path: nil
}
)
end
@@ -449,7 +504,8 @@ RSpec.describe ApplicationHelper do
page: 'application',
page_type_id: nil,
find_file: nil,
- group: group.path
+ group: group.path,
+ group_full_path: group.full_path
}
)
end
@@ -473,6 +529,7 @@ RSpec.describe ApplicationHelper do
page_type_id: nil,
find_file: nil,
group: nil,
+ group_full_path: nil,
project_id: project.id,
project: project.path,
namespace_id: project.namespace.id
@@ -491,6 +548,7 @@ RSpec.describe ApplicationHelper do
page_type_id: nil,
find_file: nil,
group: project.group.name,
+ group_full_path: project.group.full_path,
project_id: project.id,
project: project.path,
namespace_id: project.namespace.id
@@ -517,6 +575,7 @@ RSpec.describe ApplicationHelper do
page_type_id: issue.id,
find_file: nil,
group: nil,
+ group_full_path: nil,
project_id: issue.project.id,
project: issue.project.path,
namespace_id: issue.project.namespace.id
@@ -590,12 +649,13 @@ RSpec.describe ApplicationHelper do
it 'adds custom form builder to options and calls `form_for`' do
options = { html: { class: 'foo-bar' } }
- expected_options = options.merge({ builder: ::Gitlab::FormBuilders::GitlabUiFormBuilder, url: '/root' })
+ expected_options = options.merge({ builder: ::Gitlab::FormBuilders::GitlabUiFormBuilder })
expect do |b|
helper.gitlab_ui_form_for(user, options, &b)
end.to yield_with_args(::Gitlab::FormBuilders::GitlabUiFormBuilder)
- expect(helper).to have_received(:form_for).with(user, expected_options)
+
+ expect(helper).to have_received(:form_for).with(user, a_hash_including(expected_options))
end
end
@@ -719,22 +779,8 @@ RSpec.describe ApplicationHelper do
end
describe 'stylesheet_link_tag_defer' do
- it 'uses print stylesheet when feature flag disabled' do
- stub_feature_flags(remove_startup_css: false)
-
- expect(helper.stylesheet_link_tag_defer('test')).to eq( '<link rel="stylesheet" media="print" href="/stylesheets/test.css" />')
- end
-
- it 'uses regular stylesheet when feature flag enabled' do
- stub_feature_flags(remove_startup_css: true)
-
- expect(helper.stylesheet_link_tag_defer('test')).to eq( '<link rel="stylesheet" media="all" href="/stylesheets/test.css" />')
- end
-
- it 'uses regular stylesheet when no_startup_css param present' do
- allow(helper.controller).to receive(:params).and_return({ no_startup_css: '' })
-
- expect(helper.stylesheet_link_tag_defer('test')).to eq( '<link rel="stylesheet" media="all" href="/stylesheets/test.css" />')
+ it 'uses media="all" in stylesheet' do
+ expect(helper.stylesheet_link_tag_defer('test')).to eq( '<link rel="stylesheet" href="/stylesheets/test.css" media="all" />')
end
end
diff --git a/spec/helpers/button_helper_spec.rb b/spec/helpers/button_helper_spec.rb
index 8a5669867bf..a59f172061e 100644
--- a/spec/helpers/button_helper_spec.rb
+++ b/spec/helpers/button_helper_spec.rb
@@ -223,4 +223,123 @@ RSpec.describe ButtonHelper do
end
end
end
+
+ describe '#link_button_to', feature_category: :design_system do
+ let(:content) { 'Button content' }
+ let(:href) { '#' }
+ let(:options) { {} }
+
+ RSpec.shared_examples 'basic behavior' do
+ it 'renders a basic link button' do
+ expect(subject.name).to eq('a')
+ expect(subject.classes).to include(*%w[gl-button btn btn-md btn-default])
+ expect(subject.attr('href')).to eq(href)
+ expect(subject.content.strip).to eq(content)
+ end
+
+ describe 'variant option' do
+ let(:options) { { variant: :danger } }
+
+ it 'renders the variant class' do
+ expect(subject.classes).to include('btn-danger')
+ end
+ end
+
+ describe 'category option' do
+ let(:options) { { category: :tertiary } }
+
+ it 'renders the category class' do
+ expect(subject.classes).to include('btn-default-tertiary')
+ end
+ end
+
+ describe 'size option' do
+ let(:options) { { size: :small } }
+
+ it 'renders the small class' do
+ expect(subject.classes).to include('btn-sm')
+ end
+ end
+
+ describe 'block option' do
+ let(:options) { { block: true } }
+
+ it 'renders the block class' do
+ expect(subject.classes).to include('btn-block')
+ end
+ end
+
+ describe 'selected option' do
+ let(:options) { { selected: true } }
+
+ it 'renders the selected class' do
+ expect(subject.classes).to include('selected')
+ end
+ end
+
+ describe 'target option' do
+ let(:options) { { target: '_blank' } }
+
+ it 'renders the target attribute' do
+ expect(subject.attr('target')).to eq('_blank')
+ end
+ end
+
+ describe 'method option' do
+ let(:options) { { method: :post } }
+
+ it 'renders the data-method attribute' do
+ expect(subject.attr('data-method')).to eq('post')
+ end
+ end
+
+ describe 'icon option' do
+ let(:options) { { icon: 'remove' } }
+
+ it 'renders the icon' do
+ icon = subject.at_css('svg.gl-icon')
+ expect(icon.attr('data-testid')).to eq('remove-icon')
+ end
+ end
+
+ describe 'icon only' do
+ let(:content) { nil }
+ let(:options) { { icon: 'remove' } }
+
+ it 'renders the icon-only class' do
+ expect(subject.classes).to include('btn-icon')
+ end
+ end
+
+ describe 'arbitrary html options' do
+ let(:content) { nil }
+ let(:options) { { data: { foo: true }, aria: { labelledby: 'foo' } } }
+
+ it 'renders the attributes' do
+ expect(subject.attr('data-foo')).to eq('true')
+ expect(subject.attr('aria-labelledby')).to eq('foo')
+ end
+ end
+ end
+
+ describe 'without block' do
+ subject do
+ tag = helper.link_button_to content, href, options
+ Nokogiri::HTML.fragment(tag).first_element_child
+ end
+
+ include_examples 'basic behavior'
+ end
+
+ describe 'with block' do
+ subject do
+ tag = helper.link_button_to href, options do
+ content
+ end
+ Nokogiri::HTML.fragment(tag).first_element_child
+ end
+
+ include_examples 'basic behavior'
+ end
+ end
end
diff --git a/spec/helpers/calendar_helper_spec.rb b/spec/helpers/calendar_helper_spec.rb
index 08993dd1dd0..a18ed479465 100644
--- a/spec/helpers/calendar_helper_spec.rb
+++ b/spec/helpers/calendar_helper_spec.rb
@@ -8,7 +8,10 @@ RSpec.describe CalendarHelper do
it "includes the current_user's feed_token" do
current_user = create(:user)
allow(helper).to receive(:current_user).and_return(current_user)
- expect(helper.calendar_url_options).to include feed_token: current_user.feed_token
+
+ feed_token = helper.calendar_url_options[:feed_token]
+ expect(feed_token).to match(Gitlab::Auth::AuthFinders::PATH_DEPENDENT_FEED_TOKEN_REGEX)
+ expect(feed_token).to end_with(current_user.id.to_s)
end
end
diff --git a/spec/helpers/ci/jobs_helper_spec.rb b/spec/helpers/ci/jobs_helper_spec.rb
index a9ab4ab3b67..30cad66af04 100644
--- a/spec/helpers/ci/jobs_helper_spec.rb
+++ b/spec/helpers/ci/jobs_helper_spec.rb
@@ -6,14 +6,19 @@ RSpec.describe Ci::JobsHelper do
describe 'job helper functions' do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:job) { create(:ci_build, project: project) }
+ let_it_be(:user) { create(:user) }
before do
helper.instance_variable_set(:@project, project)
helper.instance_variable_set(:@build, job)
+
+ allow(helper)
+ .to receive(:current_user)
+ .and_return(user)
end
it 'returns jobs data' do
- expect(helper.jobs_data).to include({
+ expect(helper.jobs_data(project, job)).to include({
"endpoint" => "/#{project.full_path}/-/jobs/#{job.id}.json",
"project_path" => project.full_path,
"artifact_help_url" => "/help/user/gitlab_com/index.md#gitlab-cicd",
diff --git a/spec/helpers/ci/pipeline_schedules_helper_spec.rb b/spec/helpers/ci/pipeline_schedules_helper_spec.rb
new file mode 100644
index 00000000000..1ba24a08b58
--- /dev/null
+++ b/spec/helpers/ci/pipeline_schedules_helper_spec.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Ci::PipelineSchedulesHelper, feature_category: :continuous_integration do
+ let_it_be(:project) { build_stubbed(:project) }
+ let_it_be(:user) { build_stubbed(:user) }
+ let_it_be(:pipeline_schedule) { build_stubbed(:ci_pipeline_schedule, project: project, owner: user) }
+ let_it_be(:timezones) { [{ identifier: "Pacific/Honolulu", name: "Hawaii" }] }
+
+ let_it_be(:pipeline_schedule_variable) do
+ build_stubbed(:ci_pipeline_schedule_variable, key: 'foo', value: 'foovalue', pipeline_schedule: pipeline_schedule)
+ end
+
+ describe '#js_pipeline_schedules_form_data' do
+ before do
+ allow(helper).to receive(:timezone_data).and_return(timezones)
+ end
+
+ it 'returns pipeline schedule form data' do
+ expect(helper.js_pipeline_schedules_form_data(project, pipeline_schedule)).to include({
+ full_path: project.full_path,
+ daily_limit: nil,
+ project_id: project.id,
+ schedules_path: pipeline_schedules_path(project),
+ settings_link: project_settings_ci_cd_path(project),
+ timezone_data: timezones.to_json
+ })
+ end
+ end
+end
diff --git a/spec/helpers/ci/pipelines_helper_spec.rb b/spec/helpers/ci/pipelines_helper_spec.rb
index 61583ca1173..00bc38dbd94 100644
--- a/spec/helpers/ci/pipelines_helper_spec.rb
+++ b/spec/helpers/ci/pipelines_helper_spec.rb
@@ -72,28 +72,6 @@ RSpec.describe Ci::PipelinesHelper do
end
end
- describe 'has_pipeline_badges?' do
- let(:pipeline) { create(:ci_empty_pipeline) }
-
- subject { helper.has_pipeline_badges?(pipeline) }
-
- context 'when pipeline has a badge' do
- before do
- pipeline.drop!(:config_error)
- end
-
- it 'shows pipeline badges' do
- expect(subject).to eq(true)
- end
- end
-
- context 'when pipeline has no badges' do
- it 'shows pipeline badges' do
- expect(subject).to eq(false)
- end
- end
- end
-
describe '#pipelines_list_data' do
let_it_be(:project) { create(:project) }
diff --git a/spec/helpers/clusters_helper_spec.rb b/spec/helpers/clusters_helper_spec.rb
index a18c82a80ed..a9fbdfbe3ca 100644
--- a/spec/helpers/clusters_helper_spec.rb
+++ b/spec/helpers/clusters_helper_spec.rb
@@ -224,21 +224,6 @@ RSpec.describe ClustersHelper do
subject
end
end
-
- context 'when remove_monitor_metrics FF is disabled' do
- before do
- stub_feature_flags(remove_monitor_metrics: false)
- end
-
- context 'integrations ' do
- let(:tab) { 'integrations' }
-
- it 'renders integrations tab' do
- expect(helper).to receive(:render).with('integrations')
- subject
- end
- end
- end
end
describe '#cluster_type_label' do
diff --git a/spec/helpers/environment_helper_spec.rb b/spec/helpers/environment_helper_spec.rb
index 64735f8b23b..b9316e46d9d 100644
--- a/spec/helpers/environment_helper_spec.rb
+++ b/spec/helpers/environment_helper_spec.rb
@@ -68,17 +68,5 @@ RSpec.describe EnvironmentHelper, feature_category: :environment_management do
graphql_etag_key: environment.etag_cache_key
}.to_json)
end
-
- context 'when metrics dashboard feature is available' do
- before do
- stub_feature_flags(remove_monitor_metrics: false)
- end
-
- it 'includes metrics path' do
- expect(Gitlab::Json.parse(subject)).to include(
- 'environment_metrics_path' => project_metrics_dashboard_path(project, environment: environment)
- )
- end
- end
end
end
diff --git a/spec/helpers/environments_helper_spec.rb b/spec/helpers/environments_helper_spec.rb
index 0ebec3ed6d0..b69d6022e70 100644
--- a/spec/helpers/environments_helper_spec.rb
+++ b/spec/helpers/environments_helper_spec.rb
@@ -22,7 +22,6 @@ RSpec.describe EnvironmentsHelper, feature_category: :environment_management do
expect(metrics_data).to include(
'settings_path' => edit_project_settings_integration_path(project, 'prometheus'),
'clusters_path' => project_clusters_path(project),
- 'metrics_dashboard_base_path' => project_metrics_dashboard_path(project, environment: environment),
'current_environment_name' => environment.name,
'documentation_path' => help_page_path('administration/monitoring/prometheus/index.md'),
'add_dashboard_documentation_path' => help_page_path('operations/metrics/dashboards/index.md', anchor: 'add-a-new-dashboard-to-your-project'),
@@ -30,7 +29,6 @@ RSpec.describe EnvironmentsHelper, feature_category: :environment_management do
'empty_loading_svg_path' => match_asset_path('/assets/illustrations/monitoring/loading.svg'),
'empty_no_data_svg_path' => match_asset_path('/assets/illustrations/monitoring/no_data.svg'),
'empty_unable_to_connect_svg_path' => match_asset_path('/assets/illustrations/monitoring/unable_to_connect.svg'),
- 'metrics_endpoint' => additional_metrics_project_environment_path(project, environment, format: :json),
'deployments_endpoint' => project_environment_deployments_path(project, environment, format: :json),
'default_branch' => 'master',
'project_path' => project_path(project),
@@ -82,30 +80,6 @@ RSpec.describe EnvironmentsHelper, feature_category: :environment_management do
it { is_expected.to include('environment_state' => 'stopped') }
end
- context 'when request is from project scoped metrics path' do
- let(:request) { double('request', path: path) }
-
- before do
- allow(helper).to receive(:request).and_return(request)
- end
-
- context '/:namespace/:project/-/metrics' do
- let(:path) { project_metrics_dashboard_path(project) }
-
- it 'uses correct path for metrics_dashboard_base_path' do
- expect(metrics_data['metrics_dashboard_base_path']).to eq(project_metrics_dashboard_path(project))
- end
- end
-
- context '/:namespace/:project/-/metrics/some_custom_dashboard.yml' do
- let(:path) { "#{project_metrics_dashboard_path(project)}/some_custom_dashboard.yml" }
-
- it 'uses correct path for metrics_dashboard_base_path' do
- expect(metrics_data['metrics_dashboard_base_path']).to eq(project_metrics_dashboard_path(project))
- end
- end
- end
-
context 'when metrics dashboard feature is unavailable' do
before do
stub_feature_flags(remove_monitor_metrics: true)
@@ -147,13 +121,4 @@ RSpec.describe EnvironmentsHelper, feature_category: :environment_management do
expect(helper.environment_logs_data(project, environment)).to eq(expected_data)
end
end
-
- describe '#environment_data' do
- it 'returns the environment as JSON' do
- expected_data = { id: environment.id,
- name: environment.name,
- external_url: environment.external_url }.to_json
- expect(helper.environment_data(environment)).to eq(expected_data)
- end
- end
end
diff --git a/spec/helpers/feed_token_helper_spec.rb b/spec/helpers/feed_token_helper_spec.rb
new file mode 100644
index 00000000000..4382758965c
--- /dev/null
+++ b/spec/helpers/feed_token_helper_spec.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe FeedTokenHelper, feature_category: :system_access do
+ describe '#generate_feed_token' do
+ context 'with type :atom' do
+ let(:current_user) { build(:user, feed_token: 'KNOWN VALUE') }
+
+ it "returns the current_user's atom feed_token" do
+ allow(helper).to receive(:current_user).and_return(current_user)
+ allow(helper).to receive(:current_request).and_return(instance_double(ActionDispatch::Request, path: 'url'))
+
+ expect(helper.generate_feed_token(:atom))
+ # The middle part is the output of OpenSSL::HMAC.hexdigest("SHA256", 'KNOWN VALUE', 'url.atom')
+ .to eq("glft-a8cc74ccb0de004d09a968705ba49099229b288b3de43f26c473a9d8d7fb7693-#{current_user.id}")
+ end
+ end
+
+ context 'when signed out' do
+ it "returns nil" do
+ allow(helper).to receive(:current_user).and_return(nil)
+
+ expect(helper.generate_feed_token(:atom)).to be_nil
+ end
+ end
+ end
+end
diff --git a/spec/helpers/groups_helper_spec.rb b/spec/helpers/groups_helper_spec.rb
index bdcf0ef57ee..1b5f23a5e8e 100644
--- a/spec/helpers/groups_helper_spec.rb
+++ b/spec/helpers/groups_helper_spec.rb
@@ -421,6 +421,20 @@ RSpec.describe GroupsHelper do
end
end
+ describe '#can_admin_service_accounts?', feature_category: :user_management do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+
+ before do
+ allow(helper).to receive(:current_user) { user }
+ group.add_owner(user)
+ end
+
+ it 'returns false when current_user can not admin members' do
+ expect(helper.can_admin_service_accounts?(group)).to be(false)
+ end
+ end
+
describe '#localized_jobs_to_be_done_choices' do
it 'has a translation for all `jobs_to_be_done` values' do
expect(localized_jobs_to_be_done_choices.keys).to match_array(NamespaceSetting.jobs_to_be_dones.keys)
@@ -489,6 +503,7 @@ RSpec.describe GroupsHelper do
it 'returns expected hash' do
expect(helper.group_overview_tabs_app_data(group)).to match(
{
+ group_id: group.id,
subgroups_and_projects_endpoint: including("/groups/#{group.path}/-/children.json"),
shared_projects_endpoint: including("/groups/#{group.path}/-/shared_projects.json"),
archived_projects_endpoint: including("/groups/#{group.path}/-/children.json?archived=only"),
diff --git a/spec/helpers/integrations_helper_spec.rb b/spec/helpers/integrations_helper_spec.rb
index ac4f882f872..f481611b2a2 100644
--- a/spec/helpers/integrations_helper_spec.rb
+++ b/spec/helpers/integrations_helper_spec.rb
@@ -275,7 +275,7 @@ RSpec.describe IntegrationsHelper, feature_category: :integrations do
with_them do
before do
- issue.assign_attributes(issue_type: issue_type, work_item_type: WorkItems::Type.default_by_type(issue_type))
+ issue.assign_attributes(work_item_type: WorkItems::Type.default_by_type(issue_type))
issue.save!(validate: false)
end
diff --git a/spec/helpers/issuables_helper_spec.rb b/spec/helpers/issuables_helper_spec.rb
index ffaffa251d1..a2b8ee061bb 100644
--- a/spec/helpers/issuables_helper_spec.rb
+++ b/spec/helpers/issuables_helper_spec.rb
@@ -666,9 +666,11 @@ RSpec.describe IssuablesHelper, feature_category: :team_planning do
describe '#sidebar_milestone_tooltip_label' do
it 'escapes HTML in the milestone title' do
- milestone = build(:milestone, title: '&lt;img onerror=alert(1)&gt;')
+ milestone = build(:milestone, title: '&lt;img onerror=alert(1)&gt;', due_date: Date.new(2022, 6, 26))
- expect(helper.sidebar_milestone_tooltip_label(milestone)).to eq('&lt;img onerror=alert(1)&gt;<br/>Milestone')
+ expect(helper.sidebar_milestone_tooltip_label(milestone)).to eq(
+ '&lt;img onerror=alert(1)&gt;<br/>Jun 26, 2022 (<strong>Past due</strong>)'
+ )
end
end
diff --git a/spec/helpers/issues_helper_spec.rb b/spec/helpers/issues_helper_spec.rb
index 38cbb5a1d66..ba323140720 100644
--- a/spec/helpers/issues_helper_spec.rb
+++ b/spec/helpers/issues_helper_spec.rb
@@ -364,7 +364,8 @@ RSpec.describe IssuesHelper do
jira_integration_path: help_page_url('integration/jira/issues', anchor: 'view-jira-issues'),
new_project_path: new_project_path(namespace_id: group.id),
rss_path: '#',
- sign_in_path: new_user_session_path
+ sign_in_path: new_user_session_path,
+ group_id: group.id
}
expect(helper.group_issues_list_data(group, current_user)).to include(expected)
diff --git a/spec/helpers/markup_helper_spec.rb b/spec/helpers/markup_helper_spec.rb
index a9f99f29f6d..562d6683d97 100644
--- a/spec/helpers/markup_helper_spec.rb
+++ b/spec/helpers/markup_helper_spec.rb
@@ -278,7 +278,7 @@ RSpec.describe MarkupHelper do
it 'ignores reference links when they are the entire body' do
text = issues[0].to_reference
act = helper.link_to_markdown(text, '/foo')
- expect(act).to eq %Q(<a href="/foo">#{issues[0].to_reference}</a>)
+ expect(act).to eq %(<a href="/foo">#{issues[0].to_reference}</a>)
end
it 'replaces commit message with emoji to link' do
diff --git a/spec/helpers/nav/new_dropdown_helper_spec.rb b/spec/helpers/nav/new_dropdown_helper_spec.rb
index 5ae057dc97d..26dadd3b4f1 100644
--- a/spec/helpers/nav/new_dropdown_helper_spec.rb
+++ b/spec/helpers/nav/new_dropdown_helper_spec.rb
@@ -81,7 +81,7 @@ RSpec.describe Nav::NewDropdownHelper, feature_category: :navigation do
track_action: 'click_link_new_project',
track_label: 'plus_menu_dropdown',
track_property: 'navigation_top',
- qa_selector: 'global_new_project_link'
+ testid: 'global_new_project_link'
}
)
)
@@ -104,7 +104,7 @@ RSpec.describe Nav::NewDropdownHelper, feature_category: :navigation do
track_action: 'click_link_new_group',
track_label: 'plus_menu_dropdown',
track_property: 'navigation_top',
- qa_selector: 'global_new_group_link'
+ testid: 'global_new_group_link'
}
)
)
@@ -127,7 +127,7 @@ RSpec.describe Nav::NewDropdownHelper, feature_category: :navigation do
track_action: 'click_link_new_snippet_parent',
track_label: 'plus_menu_dropdown',
track_property: 'navigation_top',
- qa_selector: 'global_new_snippet_link'
+ testid: 'global_new_snippet_link'
}
)
)
@@ -256,7 +256,7 @@ RSpec.describe Nav::NewDropdownHelper, feature_category: :navigation do
track_action: 'click_link_new_issue',
track_label: 'plus_menu_dropdown',
track_property: 'navigation_top',
- qa_selector: 'new_issue_link'
+ testid: 'new_issue_link'
}
)
)
@@ -340,7 +340,7 @@ RSpec.describe Nav::NewDropdownHelper, feature_category: :navigation do
track_action: 'click_link_new_issue',
track_label: 'plus_menu_dropdown',
track_property: 'navigation_top',
- qa_selector: 'new_issue_link'
+ testid: 'new_issue_link'
}
)
)
diff --git a/spec/helpers/nav/top_nav_helper_spec.rb b/spec/helpers/nav/top_nav_helper_spec.rb
index 252423aa988..6ffc2cbf694 100644
--- a/spec/helpers/nav/top_nav_helper_spec.rb
+++ b/spec/helpers/nav/top_nav_helper_spec.rb
@@ -133,7 +133,7 @@ RSpec.describe Nav::TopNavHelper do
track_action: 'click_dropdown',
track_label: 'projects_dropdown',
track_property: 'navigation_top',
- qa_selector: 'projects_dropdown'
+ testid: 'projects_dropdown'
},
icon: 'project',
id: 'project',
@@ -166,7 +166,7 @@ RSpec.describe Nav::TopNavHelper do
expected_links_primary = [
::Gitlab::Nav::TopNavMenuItem.build(
data: {
- qa_selector: 'menu_item_link',
+ testid: 'menu_item_link',
qa_title: 'View all projects',
**menu_data_tracking_attrs('view_all_projects')
},
@@ -231,7 +231,7 @@ RSpec.describe Nav::TopNavHelper do
track_action: 'click_dropdown',
track_label: 'groups_dropdown',
track_property: 'navigation_top',
- qa_selector: 'groups_dropdown'
+ testid: 'groups_dropdown'
},
icon: 'group',
id: 'groups',
@@ -264,7 +264,7 @@ RSpec.describe Nav::TopNavHelper do
expected_links_primary = [
::Gitlab::Nav::TopNavMenuItem.build(
data: {
- qa_selector: 'menu_item_link',
+ testid: 'menu_item_link',
qa_title: 'View all groups',
**menu_data_tracking_attrs('view_all_groups')
},
@@ -408,7 +408,7 @@ RSpec.describe Nav::TopNavHelper do
it 'has enter_admin_mode as last :secondary item' do
expected_enter_admin_mode_item = ::Gitlab::Nav::TopNavMenuItem.build(
data: {
- qa_selector: 'menu_item_link',
+ testid: 'menu_item_link',
qa_title: 'Enter admin mode',
**menu_data_tracking_attrs('enter_admin_mode')
},
diff --git a/spec/helpers/packages_helper_spec.rb b/spec/helpers/packages_helper_spec.rb
index ae8a7f0c14c..6d6b8e4c707 100644
--- a/spec/helpers/packages_helper_spec.rb
+++ b/spec/helpers/packages_helper_spec.rb
@@ -132,7 +132,6 @@ RSpec.describe PackagesHelper, feature_category: :package_registry do
describe '#show_container_registry_settings' do
let_it_be(:project) { create(:project) }
let_it_be(:user) { create(:user) }
- let_it_be(:admin) { create(:admin) }
before do
allow(helper).to receive(:current_user) { user }
@@ -252,4 +251,114 @@ RSpec.describe PackagesHelper, feature_category: :package_registry do
end
end
end
+
+ describe '#can_delete_packages?' do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:user) { create(:user) }
+
+ before do
+ allow(helper).to receive(:current_user) { user }
+ end
+
+ subject { helper.can_delete_packages?(project) }
+
+ context 'with package registry config enabled' do
+ before do
+ stub_config(packages: { enabled: true })
+ end
+
+ context 'when user has permission' do
+ before do
+ allow(Ability).to receive(:allowed?).with(user, :destroy_package, project).and_return(true)
+ end
+
+ it { is_expected.to be(true) }
+ end
+
+ context 'when user does not have permission' do
+ before do
+ allow(Ability).to receive(:allowed?).with(user, :destroy_package, project).and_return(false)
+ end
+
+ it { is_expected.to be(false) }
+ end
+ end
+
+ context 'with package registry config disabled' do
+ before do
+ stub_config(packages: { enabled: false })
+ end
+
+ context 'when user has permission' do
+ before do
+ allow(Ability).to receive(:allowed?).with(user, :destroy_package, project).and_return(true)
+ end
+
+ it { is_expected.to be(false) }
+ end
+
+ context 'when user does not have permission' do
+ before do
+ allow(Ability).to receive(:allowed?).with(user, :destroy_package, project).and_return(false)
+ end
+
+ it { is_expected.to be(false) }
+ end
+ end
+ end
+
+ describe '#can_delete_group_packages?' do
+ let_it_be(:group) { create(:group) }
+ let_it_be(:user) { create(:user) }
+
+ before do
+ allow(helper).to receive(:current_user) { user }
+ end
+
+ subject { helper.can_delete_group_packages?(group) }
+
+ context 'with package registry config enabled' do
+ before do
+ stub_config(packages: { enabled: true })
+ end
+
+ context 'when user has permission' do
+ before do
+ allow(Ability).to receive(:allowed?).with(user, :destroy_package, group).and_return(true)
+ end
+
+ it { is_expected.to be(true) }
+ end
+
+ context 'when user does not have permission' do
+ before do
+ allow(Ability).to receive(:allowed?).with(user, :destroy_package, group).and_return(false)
+ end
+
+ it { is_expected.to be(false) }
+ end
+ end
+
+ context 'with package registry config disabled' do
+ before do
+ stub_config(packages: { enabled: false })
+ end
+
+ context 'when user has permission' do
+ before do
+ allow(Ability).to receive(:allowed?).with(user, :destroy_package, group).and_return(true)
+ end
+
+ it { is_expected.to be(false) }
+ end
+
+ context 'when user does not have permission' do
+ before do
+ allow(Ability).to receive(:allowed?).with(user, :destroy_package, group).and_return(false)
+ end
+
+ it { is_expected.to be(false) }
+ end
+ end
+ end
end
diff --git a/spec/helpers/page_layout_helper_spec.rb b/spec/helpers/page_layout_helper_spec.rb
index b14789fd5d2..43500d98591 100644
--- a/spec/helpers/page_layout_helper_spec.rb
+++ b/spec/helpers/page_layout_helper_spec.rb
@@ -270,7 +270,7 @@ RSpec.describe PageLayoutHelper do
it 'merges the status properties with the defaults' do
is_expected.to eq({
- current_clear_status_after: time.to_s(:iso8601),
+ current_clear_status_after: time.to_fs(:iso8601),
current_availability: 'busy',
current_emoji: 'basketball',
current_message: 'Some message',
diff --git a/spec/helpers/projects/observability_helper_spec.rb b/spec/helpers/projects/observability_helper_spec.rb
new file mode 100644
index 00000000000..65b6ddf04ec
--- /dev/null
+++ b/spec/helpers/projects/observability_helper_spec.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require 'json'
+
+RSpec.describe Projects::ObservabilityHelper, type: :helper, feature_category: :tracing do
+ describe '#observability_tracing_view_model' do
+ let_it_be(:group) { build_stubbed(:group) }
+ let_it_be(:project) { build_stubbed(:project, group: group) }
+
+ it 'generates the correct JSON' do
+ expected_json = {
+ tracingUrl: Gitlab::Observability.tracing_url(project),
+ provisioningUrl: Gitlab::Observability.provisioning_url(project),
+ oauthUrl: Gitlab::Observability.oauth_url
+ }.to_json
+
+ expect(helper.observability_tracing_view_model(project)).to eq(expected_json)
+ end
+ end
+end
diff --git a/spec/helpers/projects/pipeline_helper_spec.rb b/spec/helpers/projects/pipeline_helper_spec.rb
index a69da915990..baeafe6b7e7 100644
--- a/spec/helpers/projects/pipeline_helper_spec.rb
+++ b/spec/helpers/projects/pipeline_helper_spec.rb
@@ -61,7 +61,7 @@ RSpec.describe Projects::PipelineHelper do
failed: pipeline.failure_reason?.to_s,
auto_devops: pipeline.auto_devops_source?.to_s,
detached: pipeline.detached_merge_request_pipeline?.to_s,
- stuck: pipeline.stuck?,
+ stuck: pipeline.stuck?.to_s,
ref_text: pipeline.ref_text
})
end
diff --git a/spec/helpers/projects_helper_spec.rb b/spec/helpers/projects_helper_spec.rb
index cde7fc0e272..768038d8736 100644
--- a/spec/helpers/projects_helper_spec.rb
+++ b/spec/helpers/projects_helper_spec.rb
@@ -11,6 +11,7 @@ RSpec.describe ProjectsHelper, feature_category: :source_code_management do
let_it_be(:user) { create(:user) }
before do
+ allow(helper).to receive(:current_user).and_return(user)
helper.instance_variable_set(:@project, project)
end
@@ -143,7 +144,6 @@ RSpec.describe ProjectsHelper, feature_category: :source_code_management do
let(:project) { project_with_repo }
before do
- allow(helper).to receive(:current_user).and_return(user)
allow(helper).to receive(:can?).with(user, :read_cross_project) { true }
allow(user).to receive(:max_member_access_for_project).and_return(40)
allow(Gitlab::I18n).to receive(:locale).and_return('es')
@@ -287,10 +287,6 @@ RSpec.describe ProjectsHelper, feature_category: :source_code_management do
end
describe '#show_no_ssh_key_message?' do
- before do
- allow(helper).to receive(:current_user).and_return(user)
- end
-
context 'user has no keys' do
it 'returns true' do
expect(helper.show_no_ssh_key_message?).to be_truthy
@@ -307,10 +303,6 @@ RSpec.describe ProjectsHelper, feature_category: :source_code_management do
end
describe '#show_no_password_message?' do
- before do
- allow(helper).to receive(:current_user).and_return(user)
- end
-
context 'user has password set' do
it 'returns false' do
expect(helper.show_no_password_message?).to be_falsey
@@ -346,10 +338,6 @@ RSpec.describe ProjectsHelper, feature_category: :source_code_management do
describe '#no_password_message' do
let(:user) { create(:user, password_automatically_set: true) }
- before do
- allow(helper).to receive(:current_user).and_return(user)
- end
-
context 'password authentication is enabled for Git' do
it 'returns message prompting user to set password or set up a PAT' do
stub_application_setting(password_authentication_enabled_for_git?: true)
@@ -431,10 +419,10 @@ RSpec.describe ProjectsHelper, feature_category: :source_code_management do
end
describe 'default_clone_protocol' do
+ let(:user) { nil }
+
context 'when user is not logged in and gitlab protocol is HTTP' do
it 'returns HTTP' do
- allow(helper).to receive(:current_user).and_return(nil)
-
expect(helper.send(:default_clone_protocol)).to eq('http')
end
end
@@ -442,7 +430,6 @@ RSpec.describe ProjectsHelper, feature_category: :source_code_management do
context 'when user is not logged in and gitlab protocol is HTTPS' do
it 'returns HTTPS' do
stub_config_setting(protocol: 'https')
- allow(helper).to receive(:current_user).and_return(nil)
expect(helper.send(:default_clone_protocol)).to eq('https')
end
@@ -453,10 +440,6 @@ RSpec.describe ProjectsHelper, feature_category: :source_code_management do
let(:user) { double(:user, fork_of: nil) }
let(:project) { double(:project, id: 1) }
- before do
- allow(helper).to receive(:current_user).and_return(user)
- end
-
context 'when there is no current_user' do
let(:user) { nil }
@@ -543,10 +526,6 @@ RSpec.describe ProjectsHelper, feature_category: :source_code_management do
describe '#git_user_name' do
let(:user) { build_stubbed(:user, name: 'John "A" Doe53') }
- before do
- allow(helper).to receive(:current_user).and_return(user)
- end
-
it 'parses quotes in name' do
expect(helper.send(:git_user_name)).to eq('John \"A\" Doe53')
end
@@ -554,9 +533,7 @@ RSpec.describe ProjectsHelper, feature_category: :source_code_management do
describe '#git_user_email' do
context 'not logged-in' do
- before do
- allow(helper).to receive(:current_user).and_return(nil)
- end
+ let(:user) { nil }
it 'returns your@email.com' do
expect(helper.send(:git_user_email)).to eq('your@email.com')
@@ -564,10 +541,6 @@ RSpec.describe ProjectsHelper, feature_category: :source_code_management do
end
context 'user logged in' do
- before do
- allow(helper).to receive(:current_user).and_return(user)
- end
-
context 'user has no configured commit email' do
it 'returns the primary email' do
expect(helper.send(:git_user_email)).to eq(user.email)
@@ -807,9 +780,7 @@ RSpec.describe ProjectsHelper, feature_category: :source_code_management do
describe '#can_admin_project_member?' do
context 'when user is project owner' do
- before do
- allow(helper).to receive(:current_user) { project.owner }
- end
+ let(:user) { project.owner }
it 'returns true for owner of project' do
expect(helper.can_admin_project_member?(project)).to eq true
@@ -829,7 +800,6 @@ RSpec.describe ProjectsHelper, feature_category: :source_code_management do
with_them do
before do
project.add_role(user, user_project_role)
- allow(helper).to receive(:current_user) { user }
end
it 'resolves if the user can import members' do
@@ -1016,7 +986,6 @@ RSpec.describe ProjectsHelper, feature_category: :source_code_management do
before do
allow(helper).to receive(:can?) { true }
- allow(helper).to receive(:current_user).and_return(user)
end
it 'includes project_permissions_settings' do
@@ -1188,10 +1157,6 @@ RSpec.describe ProjectsHelper, feature_category: :source_code_management do
end
shared_examples 'configure import method modal' do
- before do
- allow(helper).to receive(:current_user).and_return(user)
- end
-
context 'as a user' do
it 'returns a link to contact an administrator' do
allow(user).to receive(:can_admin_all_resources?).and_return(false)
@@ -1290,16 +1255,14 @@ RSpec.describe ProjectsHelper, feature_category: :source_code_management do
end
describe '#can_admin_associated_clusters?' do
- let_it_be(:current_user) { create(:user) }
let_it_be_with_reload(:project) { create(:project) }
subject { helper.send(:can_admin_associated_clusters?, project) }
before do
- allow(helper).to receive(:current_user).and_return(current_user)
allow(helper)
.to receive(:can?)
- .with(current_user, :admin_cluster, namespace)
+ .with(user, :admin_cluster, namespace)
.and_return(user_can_admin_cluster)
end
@@ -1394,7 +1357,7 @@ RSpec.describe ProjectsHelper, feature_category: :source_code_management do
let_it_be(:has_active_license) { true }
it 'displays the correct messagee' do
- expect(subject).to eq(s_('Clusters|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of February 2023. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}. Contact GitLab Support if you have any additional questions.'))
+ expect(subject).to eq(s_('ClusterIntegration|The certificate-based Kubernetes integration is deprecated and will be removed in the future. You should %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}. For more information, see the %{deprecationLinkStart}deprecation epic%{deprecationLinkEnd}, or contact GitLab support.'))
end
end
@@ -1402,7 +1365,7 @@ RSpec.describe ProjectsHelper, feature_category: :source_code_management do
let_it_be(:has_active_license) { false }
it 'displays the correct message' do
- expect(subject).to eq(s_('Clusters|The certificate-based Kubernetes integration has been deprecated and will be turned off at the end of February 2023. Please %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}.'))
+ expect(subject).to eq(s_('ClusterIntegration|The certificate-based Kubernetes integration is deprecated and will be removed in the future. You should %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}. For more information, see the %{deprecationLinkStart}deprecation epic%{deprecationLinkEnd}.'))
end
end
end
@@ -1477,8 +1440,6 @@ RSpec.describe ProjectsHelper, feature_category: :source_code_management do
end
it 'returns the data related to fork divergence' do
- allow(helper).to receive(:current_user).and_return(user)
-
ahead_path =
"/#{project.full_path}/-/compare/#{source_project.default_branch}...ref?from_project_id=#{source_project.id}"
behind_path =
@@ -1500,8 +1461,6 @@ RSpec.describe ProjectsHelper, feature_category: :source_code_management do
end
it 'returns view_mr_path if a merge request for the branch exists' do
- allow(helper).to receive(:current_user).and_return(user)
-
merge_request =
create(:merge_request, source_project: project, target_project: project_with_repo,
source_branch: project.default_branch, target_branch: project_with_repo.default_branch)
@@ -1523,8 +1482,6 @@ RSpec.describe ProjectsHelper, feature_category: :source_code_management do
with_them do
it 'create_mr_path is nil' do
- allow(helper).to receive(:current_user).and_return(user)
-
project.add_member(user, project_role)
source_project.add_member(user, source_project_role)
@@ -1562,4 +1519,99 @@ RSpec.describe ProjectsHelper, feature_category: :source_code_management do
it { expect(subject).to eq('ssh_url_to_repo') }
end
+
+ describe '#can_view_branch_rules?' do
+ subject { helper.can_view_branch_rules? }
+
+ context 'when user is a maintainer' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ it { is_expected.to be_truthy }
+ end
+
+ context 'when user is a developer' do
+ before do
+ project.add_developer(user)
+ end
+
+ it { is_expected.to be_falsey }
+ end
+ end
+
+ describe '#can_push_code?' do
+ subject { helper.can_push_code? }
+
+ context 'when user is nil' do
+ let(:user) { nil }
+
+ it { is_expected.to be_falsey }
+ end
+
+ context 'when user is a developer on the project' do
+ before do
+ project.add_developer(user)
+ end
+
+ it { is_expected.to be_truthy }
+ end
+
+ context 'when user is a reporter on the project' do
+ before do
+ project.add_reporter(user)
+ end
+
+ it { is_expected.to be_falsey }
+ end
+ end
+
+ describe '#can_admin_associated_clusters?(project)' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:project_clusters_exist, :user_can_admin_project_clusters, :group_clusters_exist, :user_can_admin_group_clusters, :expected) do
+ false | false | false | false | false
+ true | false | false | false | false
+ false | true | false | false | false
+ false | false | true | false | false
+ false | false | false | true | false
+ true | true | false | false | true
+ false | false | true | true | true
+ true | true | true | true | true
+ end
+
+ with_them do
+ subject { helper.can_admin_associated_clusters?(project) }
+
+ let(:clusters) { [double('Cluster')] }
+ let(:group) { double('Group') }
+
+ before do
+ allow(project)
+ .to receive(:clusters)
+ .and_return(project_clusters_exist ? clusters : [])
+ allow(helper)
+ .to receive(:can?).with(user, :admin_cluster, project)
+ .and_return(user_can_admin_project_clusters)
+
+ allow(project)
+ .to receive(:group)
+ .and_return(group)
+ allow(group)
+ .to receive(:clusters)
+ .and_return(group_clusters_exist ? clusters : [])
+ allow(helper)
+ .to receive(:can?).with(user, :admin_cluster, project.group)
+ .and_return(user_can_admin_group_clusters)
+ end
+
+ it { is_expected.to eq(expected) }
+ end
+ end
+
+ describe '#branch_rules_path' do
+ subject { helper.branch_rules_path }
+
+ it { is_expected.to eq(project_settings_repository_path(project, anchor: 'js-branch-rules')) }
+ end
end
diff --git a/spec/helpers/rss_helper_spec.rb b/spec/helpers/rss_helper_spec.rb
index 05f6ebb6c1b..f99a1f6d547 100644
--- a/spec/helpers/rss_helper_spec.rb
+++ b/spec/helpers/rss_helper_spec.rb
@@ -8,7 +8,10 @@ RSpec.describe RssHelper do
it "includes the current_user's feed_token" do
current_user = create(:user)
allow(helper).to receive(:current_user).and_return(current_user)
- expect(helper.rss_url_options).to include feed_token: current_user.feed_token
+
+ feed_token = helper.rss_url_options[:feed_token]
+ expect(feed_token).to match(Gitlab::Auth::AuthFinders::PATH_DEPENDENT_FEED_TOKEN_REGEX)
+ expect(feed_token).to end_with(current_user.id.to_s)
end
end
diff --git a/spec/helpers/search_helper_spec.rb b/spec/helpers/search_helper_spec.rb
index b2606fcfae1..1ff7e48abfc 100644
--- a/spec/helpers/search_helper_spec.rb
+++ b/spec/helpers/search_helper_spec.rb
@@ -153,15 +153,7 @@ RSpec.describe SearchHelper, feature_category: :global_search do
end
end
- [true, false].each do |enabled|
- context "with feature flag autcomplete_users_use_search_service #{enabled}" do
- before do
- stub_feature_flags(autocomplete_users_use_search_service: enabled)
- end
-
- include_examples 'for users'
- end
- end
+ include_examples 'for users'
it "includes the required project attrs" do
project = create(:project, namespace: create(:namespace, owner: user))
@@ -730,78 +722,6 @@ RSpec.describe SearchHelper, feature_category: :global_search do
end
end
- describe '#show_user_search_tab?' do
- subject { show_user_search_tab? }
-
- let(:current_user) { build(:user) }
-
- before do
- allow(self).to receive(:current_user).and_return(current_user)
- end
-
- context 'when project search' do
- before do
- @project = :some_project
-
- expect(self).to receive(:project_search_tabs?)
- .with(:users)
- .and_return(:value)
- end
-
- it 'delegates to project_search_tabs?' do
- expect(subject).to eq(:value)
- end
- end
-
- context 'when group search' do
- before do
- @group = :some_group
- end
-
- context 'when current_user can read_users_list' do
- before do
- allow(self).to receive(:can?).with(current_user, :read_users_list).and_return(true)
- end
-
- it { is_expected.to eq(true) }
- end
-
- context 'when current_user cannot read_users_list' do
- before do
- allow(self).to receive(:can?).with(current_user, :read_users_list).and_return(false)
- end
-
- it { is_expected.to eq(false) }
- end
- end
-
- context 'when global search' do
- context 'when current_user can read_users_list' do
- before do
- allow(self).to receive(:can?).with(current_user, :read_users_list).and_return(true)
- end
-
- it { is_expected.to eq(true) }
-
- context 'when global_search_user_tab feature flag is disabled' do
- before do
- stub_feature_flags(global_search_users_tab: false)
- end
-
- it { is_expected.to eq(false) }
- end
- end
-
- context 'when current_user cannot read_users_list' do
- before do
- allow(self).to receive(:can?).with(current_user, :read_users_list).and_return(false)
- end
-
- it { is_expected.to eq(false) }
- end
- end
- end
-
describe '#repository_ref' do
using RSpec::Parameterized::TableSyntax
@@ -1121,248 +1041,24 @@ RSpec.describe SearchHelper, feature_category: :global_search do
end
end
- describe '.search_navigation' do
- using RSpec::Parameterized::TableSyntax
- let(:user) { build(:user) }
- let_it_be(:project) { build(:project) }
-
- before do
- allow(self).to receive(:current_user).and_return(user)
- allow(self).to receive(:can?).and_return(true)
- allow(self).to receive(:project_search_tabs?).and_return(false)
- allow(self).to receive(:feature_flag_tab_enabled?).and_return(false)
- end
-
- context 'projects' do
- where(:global_project, :condition) do
- nil | true
- ref(:project) | false
- end
-
- with_them do
- it 'data item condition is set correctly' do
- @project = global_project
-
- expect(search_navigation[:projects][:condition]).to eq(condition)
- end
- end
- end
-
- context 'code' do
- where(:feature_flag_tab_enabled, :show_elasticsearch_tabs, :global_project, :project_search_tabs, :condition) do
- false | false | nil | false | false
- true | true | nil | true | true
- true | false | nil | false | false
- false | true | nil | false | false
- false | false | ref(:project) | true | true
- true | false | ref(:project) | false | false
- end
-
- with_them do
- it 'data item condition is set correctly' do
- @project = global_project
- allow(search_service).to receive(:show_elasticsearch_tabs?).and_return(show_elasticsearch_tabs)
- allow(self).to receive(:feature_flag_tab_enabled?).with(:global_search_code_tab).and_return(feature_flag_tab_enabled)
- allow(self).to receive(:project_search_tabs?).with(:blobs).and_return(project_search_tabs)
-
- expect(search_navigation[:blobs][:condition]).to eq(condition)
- end
- end
- end
-
- context 'issues' do
- where(:project_search_tabs, :global_search_issues_tab, :global_project, :condition) do
- false | false | nil | false
- false | true | nil | true
- false | true | ref(:project) | false
- false | false | ref(:project) | false
- true | false | nil | true
- true | true | nil | true
- true | false | ref(:project) | true
- true | true | ref(:project) | true
- end
-
- with_them do
- it 'data item condition is set correctly' do
- @project = global_project
- allow(self).to receive(:feature_flag_tab_enabled?).with(:global_search_issues_tab).and_return(global_search_issues_tab)
- allow(self).to receive(:project_search_tabs?).with(:issues).and_return(project_search_tabs)
-
- expect(search_navigation[:issues][:condition]).to eq(condition)
- end
- end
- end
-
- context 'merge requests' do
- where(:project_search_tabs, :feature_flag_tab_enabled, :global_project, :condition) do
- false | false | nil | false
- true | false | nil | true
- false | false | ref(:project) | false
- true | false | ref(:project) | true
- false | true | nil | true
- true | true | nil | true
- false | true | ref(:project) | false
- true | true | ref(:project) | true
- end
-
- with_them do
- it 'data item condition is set correctly' do
- @project = global_project
- allow(self).to receive(:feature_flag_tab_enabled?).with(:global_search_merge_requests_tab).and_return(feature_flag_tab_enabled)
- allow(self).to receive(:project_search_tabs?).with(:merge_requests).and_return(project_search_tabs)
-
- expect(search_navigation[:merge_requests][:condition]).to eq(condition)
- end
- end
- end
-
- context 'wiki' do
- where(:global_search_wiki_tab, :show_elasticsearch_tabs, :global_project, :project_search_tabs, :condition) do
- false | false | nil | true | true
- false | false | nil | false | false
- false | false | ref(:project) | false | false
- false | true | nil | false | false
- false | true | ref(:project) | false | false
- true | false | nil | false | false
- true | true | ref(:project) | false | false
- end
-
- with_them do
- it 'data item condition is set correctly' do
- @project = global_project
- allow(search_service).to receive(:show_elasticsearch_tabs?).and_return(show_elasticsearch_tabs)
- allow(self).to receive(:feature_flag_tab_enabled?).with(:global_search_wiki_tab).and_return(global_search_wiki_tab)
- allow(self).to receive(:project_search_tabs?).with(:wiki_blobs).and_return(project_search_tabs)
-
- expect(search_navigation[:wiki_blobs][:condition]).to eq(condition)
- end
- end
- end
-
- context 'commits' do
- where(:global_search_commits_tab, :show_elasticsearch_tabs, :global_project, :project_search_tabs, :condition) do
- false | false | nil | true | true
- false | false | ref(:project) | true | true
- false | false | nil | false | false
- false | true | ref(:project) | false | false
- false | true | nil | false | false
- true | false | nil | false | false
- true | false | ref(:project) | false | false
- true | true | ref(:project) | false | false
- true | true | nil | false | true
- end
-
- with_them do
- it 'data item condition is set correctly' do
- @project = global_project
- allow(search_service).to receive(:show_elasticsearch_tabs?).and_return(show_elasticsearch_tabs)
- allow(self).to receive(:feature_flag_tab_enabled?).with(:global_search_commits_tab).and_return(global_search_commits_tab)
- allow(self).to receive(:project_search_tabs?).with(:commits).and_return(project_search_tabs)
-
- expect(search_navigation[:commits][:condition]).to eq(condition)
- end
- end
- end
-
- context 'comments' do
- where(:project_search_tabs, :show_elasticsearch_tabs, :global_project, :condition) do
- true | true | nil | true
- true | true | ref(:project) | true
- false | false | nil | false
- false | false | ref(:project) | false
- false | true | nil | true
- false | true | ref(:project) | false
- true | false | nil | true
- true | false | ref(:project) | true
- end
-
- with_them do
- it 'data item condition is set correctly' do
- @project = global_project
- allow(search_service).to receive(:show_elasticsearch_tabs?).and_return(show_elasticsearch_tabs)
- allow(self).to receive(:project_search_tabs?).with(:notes).and_return(project_search_tabs)
-
- expect(search_navigation[:notes][:condition]).to eq(condition)
- end
- end
- end
-
- context 'milestones' do
- where(:global_project, :project_search_tabs, :condition) do
- ref(:project) | true | true
- nil | false | true
- ref(:project) | false | false
- nil | true | true
- end
-
- with_them do
- it 'data item condition is set correctly' do
- @project = global_project
- allow(self).to receive(:project_search_tabs?).with(:milestones).and_return(project_search_tabs)
-
- expect(search_navigation[:milestones][:condition]).to eq(condition)
- end
- end
- end
-
- context 'users' do
- where(:show_user_search_tab, :condition) do
- true | true
- false | false
- end
-
- with_them do
- it 'data item condition is set correctly' do
- allow(self).to receive(:show_user_search_tab?).and_return(show_user_search_tab)
-
- expect(search_navigation[:users][:condition]).to eq(condition)
- end
- end
- end
-
- context 'snippet_titles' do
- where(:global_project, :global_show_snippets, :global_feature_flag_enabled, :condition) do
- ref(:project) | true | false | false
- nil | false | false | false
- ref(:project) | false | false | false
- nil | true | false | false
- ref(:project) | true | true | false
- nil | false | true | false
- ref(:project) | false | true | false
- nil | true | true | true
- end
-
- with_them do
- it 'data item condition is set correctly' do
- allow(search_service).to receive(:show_snippets?).and_return(global_show_snippets)
- allow(self).to receive(:feature_flag_tab_enabled?).with(:global_search_snippet_titles_tab)
- .and_return(global_feature_flag_enabled)
- @project = global_project
-
- expect(search_navigation[:snippet_titles][:condition]).to eq(condition)
- end
- end
- end
- end
-
describe '.search_navigation_json' do
using RSpec::Parameterized::TableSyntax
- context 'with data' do
+ context 'with some tab conditions set to false' do
example_data_1 = {
projects: { label: _("Projects"), condition: true },
- blobs: { label: _("Code"), condition: false }
+ blobs: { label: _("Code"), condition: false }
}
example_data_2 = {
projects: { label: _("Projects"), condition: false },
- blobs: { label: _("Code"), condition: false }
+ blobs: { label: _("Code"), condition: false }
}
example_data_3 = {
projects: { label: _("Projects"), condition: true },
- blobs: { label: _("Code"), condition: true },
- epics: { label: _("Epics"), condition: true }
+ blobs: { label: _("Code"), condition: true },
+ epics: { label: _("Epics"), condition: true }
}
where(:data, :matcher) do
@@ -1373,28 +1069,31 @@ RSpec.describe SearchHelper, feature_category: :global_search do
with_them do
it 'renders data correctly' do
- allow(self).to receive(:search_navigation).with(no_args).and_return(data)
+ allow(self).to receive(:current_user).and_return(build(:user))
+ allow_next_instance_of(Search::Navigation) do |search_nav|
+ allow(search_nav).to receive(:tabs).and_return(data)
+ end
expect(search_navigation_json).to instance_exec(&matcher)
end
end
end
- end
- describe '.search_navigation_json with .search_navigation' do
- before do
- allow(self).to receive(:current_user).and_return(build(:user))
- allow(self).to receive(:can?).and_return(true)
- allow(self).to receive(:project_search_tabs?).and_return(true)
- allow(self).to receive(:feature_flag_tab_enabled?).and_return(true)
- allow(self).to receive(:feature_flag_tab_enabled?).and_return(true)
- allow(search_service).to receive(:show_elasticsearch_tabs?).and_return(true)
- allow(search_service).to receive(:show_snippets?).and_return(true)
- @project = nil
- end
+ context 'when all options enabled' do
+ before do
+ allow(self).to receive(:current_user).and_return(build(:user))
+ allow(search_service).to receive(:show_snippets?).and_return(true)
+ allow_next_instance_of(Search::Navigation) do |search_nav|
+ allow(search_nav).to receive(:tab_enabled_for_project?).and_return(true)
+ allow(search_nav).to receive(:feature_flag_tab_enabled?).and_return(true)
+ end
+
+ @project = nil
+ end
- it 'test search navigation item order for CE all options enabled' do
- expect(Gitlab::Json.parse(search_navigation_json).keys).to eq(%w[projects blobs issues merge_requests wiki_blobs commits notes milestones users snippet_titles])
+ it 'returns items in order' do
+ expect(Gitlab::Json.parse(search_navigation_json).keys).to eq(%w[projects blobs issues merge_requests wiki_blobs commits notes milestones users snippet_titles])
+ end
end
end
@@ -1404,9 +1103,9 @@ RSpec.describe SearchHelper, feature_category: :global_search do
context 'data' do
where(:scope, :label, :data, :search, :active_scope) do
"projects" | "Projects" | { qa_selector: 'projects_tab' } | nil | "projects"
- "snippet_titles" | "Titles and Descriptions" | nil | { snippets: "test" } | "code"
+ "snippet_titles" | "Snippets" | nil | { snippets: "test" } | "code"
"projects" | "Projects" | { qa_selector: 'projects_tab' } | nil | "issue"
- "snippet_titles" | "Titles and Descriptions" | nil | { snippets: "test" } | "snippet_titles"
+ "snippet_titles" | "Snippets" | nil | { snippets: "test" } | "snippet_titles"
end
with_them do
@@ -1439,27 +1138,12 @@ RSpec.describe SearchHelper, feature_category: :global_search do
end
end
- describe 'show_elasticsearch_tabs' do
- subject { search_service.show_elasticsearch_tabs? }
-
- let(:user) { build(:user) }
-
- before do
- allow(self).to receive(:current_user).and_return(user)
- end
-
- it { is_expected.to eq(false) }
- end
-
- describe 'show_epics' do
- subject { search_service.show_epics? }
-
- let(:user) { build(:user) }
-
- before do
- allow(self).to receive(:current_user).and_return(user)
+ describe '#wiki_blob_link' do
+ let_it_be(:project) { create :project, :wiki_repo }
+ let(:wiki_blob) do
+ Gitlab::Search::FoundBlob.new({ path: 'test', basename: 'test', ref: 'master', data: 'foo', startline: 2, project: project, project_id: project.id })
end
- it { is_expected.to eq(false) }
+ it { expect(wiki_blob_link(wiki_blob)).to eq("/#{project.namespace.path}/#{project.path}/-/wikis/#{wiki_blob.path}") }
end
end
diff --git a/spec/helpers/sidebars_helper_spec.rb b/spec/helpers/sidebars_helper_spec.rb
index 6648663b634..8d8bbcd2737 100644
--- a/spec/helpers/sidebars_helper_spec.rb
+++ b/spec/helpers/sidebars_helper_spec.rb
@@ -106,7 +106,8 @@ RSpec.describe SidebarsHelper, feature_category: :navigation do
customized: user.status&.customized?,
availability: user.status&.availability.to_s,
emoji: user.status&.emoji,
- message: user.status&.message_html&.html_safe,
+ message_html: user.status&.message_html&.html_safe,
+ message: user.status&.message&.html_safe,
clear_after: nil
},
settings: {
@@ -250,7 +251,7 @@ RSpec.describe SidebarsHelper, feature_category: :navigation do
"data-track-label": id,
"data-track-action": "click_link",
"data-track-property": "nav_create_menu",
- "data-qa-selector": 'create_menu_item',
+ "data-testid": 'create_menu_item',
"data-qa-create-menu-item": id
}
}
@@ -279,7 +280,7 @@ RSpec.describe SidebarsHelper, feature_category: :navigation do
"data-track-label": id,
"data-track-action": "click_link",
"data-track-property": "nav_create_menu",
- "data-qa-selector": 'create_menu_item',
+ "data-testid": 'create_menu_item',
"data-qa-create-menu-item": id
}
}
@@ -482,6 +483,7 @@ RSpec.describe SidebarsHelper, feature_category: :navigation do
let(:user) { build(:user) }
let(:group) { build(:group) }
let(:project) { build(:project) }
+ let(:organization) { build(:organization) }
before do
allow(helper).to receive(:project_sidebar_context_data).and_return(
@@ -516,6 +518,12 @@ RSpec.describe SidebarsHelper, feature_category: :navigation do
expect(helper.super_sidebar_nav_panel(nav: 'admin')).to be_a(Sidebars::Admin::Panel)
end
+ it 'returns Organization Panel for organization nav' do
+ expect(
+ helper.super_sidebar_nav_panel(nav: 'organization', organization: organization)
+ ).to be_a(Sidebars::Organizations::SuperSidebarPanel)
+ end
+
it 'returns "Your Work" Panel for your_work nav', :use_clean_rails_memory_store_caching do
expect(helper.super_sidebar_nav_panel(nav: 'your_work', user: user)).to be_a(Sidebars::YourWork::Panel)
end
@@ -528,4 +536,31 @@ RSpec.describe SidebarsHelper, feature_category: :navigation do
expect(helper.super_sidebar_nav_panel(user: user)).to be_a(Sidebars::YourWork::Panel)
end
end
+
+ describe '#command_palette_data' do
+ it 'returns data for project files search' do
+ project = create(:project, :repository) # rubocop:disable RSpec/FactoryBot/AvoidCreate
+
+ expect(helper.command_palette_data(project: project)).to eq(
+ project_files_url: project_files_path(
+ project, project.default_branch, format: :json),
+ project_blob_url: project_blob_path(
+ project, project.default_branch)
+ )
+ end
+
+ it 'returns empty object when project is nil' do
+ expect(helper.command_palette_data(project: nil)).to eq({})
+ end
+
+ it 'returns empty object when project does not have repo' do
+ project = build(:project)
+ expect(helper.command_palette_data(project: project)).to eq({})
+ end
+
+ it 'returns empty object when project has repo but it is empty' do
+ project = build(:project, :empty_repo)
+ expect(helper.command_palette_data(project: project)).to eq({})
+ end
+ end
end
diff --git a/spec/helpers/tree_helper_spec.rb b/spec/helpers/tree_helper_spec.rb
index e13b83feefd..1ca5b8eb954 100644
--- a/spec/helpers/tree_helper_spec.rb
+++ b/spec/helpers/tree_helper_spec.rb
@@ -274,6 +274,7 @@ RSpec.describe TreeHelper do
describe '.fork_modal_options' do
let_it_be(:blob) { project.repository.blob_at('refs/heads/master', @path) }
+ let(:fork_path) { "/#{project.path_with_namespace}/-/forks/new" }
before do
allow(helper).to receive(:current_user).and_return(user)
@@ -282,7 +283,7 @@ RSpec.describe TreeHelper do
subject { helper.fork_modal_options(project, blob) }
it 'returns correct fork path' do
- expect(subject).to match a_hash_including(fork_path: '/namespace1/project-1/-/forks/new', fork_modal_id: nil)
+ expect(subject).to match a_hash_including(fork_path: fork_path, fork_modal_id: nil)
end
context 'when show_edit_button true' do
@@ -292,7 +293,7 @@ RSpec.describe TreeHelper do
it 'returns correct fork path and modal id' do
expect(subject).to match a_hash_including(
- fork_path: '/namespace1/project-1/-/forks/new',
+ fork_path: fork_path,
fork_modal_id: 'modal-confirm-fork-edit')
end
end
@@ -304,7 +305,7 @@ RSpec.describe TreeHelper do
it 'returns correct fork path and modal id' do
expect(subject).to match a_hash_including(
- fork_path: '/namespace1/project-1/-/forks/new',
+ fork_path: fork_path,
fork_modal_id: 'modal-confirm-fork-webide')
end
end
diff --git a/spec/helpers/users_helper_spec.rb b/spec/helpers/users_helper_spec.rb
index 6ee208dfd15..c0d3c31a36d 100644
--- a/spec/helpers/users_helper_spec.rb
+++ b/spec/helpers/users_helper_spec.rb
@@ -496,13 +496,17 @@ RSpec.describe UsersHelper do
describe '#user_profile_tabs_app_data' do
before do
+ allow(helper).to receive(:current_user).and_return(user)
allow(helper).to receive(:user_calendar_path).with(user, :json).and_return('/users/root/calendar.json')
allow(helper).to receive(:user_activity_path).with(user, :json).and_return('/users/root/activity.json')
+ allow(helper).to receive(:new_snippet_path).and_return('/-/snippets/new')
allow(user).to receive_message_chain(:followers, :count).and_return(2)
allow(user).to receive_message_chain(:followees, :count).and_return(3)
end
it 'returns expected hash' do
+ allow(helper).to receive(:can?).with(user, :create_snippet).and_return(true)
+
expect(helper.user_profile_tabs_app_data(user)).to match({
followees_count: 3,
followers_count: 2,
@@ -510,9 +514,21 @@ RSpec.describe UsersHelper do
user_activity_path: '/users/root/activity.json',
utc_offset: 0,
user_id: user.id,
- snippets_empty_state: match_asset_path('illustrations/empty-state/empty-snippets-md.svg')
+ new_snippet_path: '/-/snippets/new',
+ snippets_empty_state: match_asset_path('illustrations/empty-state/empty-snippets-md.svg'),
+ follow_empty_state: match_asset_path('illustrations/empty-state/empty-friends-md.svg')
})
end
+
+ context 'when user does not have create_snippet permissions' do
+ before do
+ allow(helper).to receive(:can?).with(user, :create_snippet).and_return(false)
+ end
+
+ it 'returns nil for new_snippet_path property' do
+ expect(helper.user_profile_tabs_app_data(user)[:new_snippet_path]).to be_nil
+ end
+ end
end
describe '#load_max_project_member_accesses' do
diff --git a/spec/helpers/web_hooks/web_hooks_helper_spec.rb b/spec/helpers/web_hooks/web_hooks_helper_spec.rb
index 5c68a436ad2..ccee2c2508d 100644
--- a/spec/helpers/web_hooks/web_hooks_helper_spec.rb
+++ b/spec/helpers/web_hooks/web_hooks_helper_spec.rb
@@ -40,7 +40,7 @@ RSpec.describe WebHooks::WebHooksHelper, :clean_gitlab_redis_shared_state, featu
include_context 'a hook has failed'
it 'is true' do
- expect(helper).to be_show_project_hook_failed_callout(project: project)
+ expect(helper.show_project_hook_failed_callout?(project: project)).to eq(true)
end
it 'stores a value' do
@@ -64,7 +64,7 @@ RSpec.describe WebHooks::WebHooksHelper, :clean_gitlab_redis_shared_state, featu
contexts.each { |ctx| include_context(ctx) unless ctx == name }
it 'is false' do
- expect(helper).not_to be_show_project_hook_failed_callout(project: project)
+ expect(helper.show_project_hook_failed_callout?(project: project)).to eq(false)
end
end
end
diff --git a/spec/initializers/00_rails_disable_joins_spec.rb b/spec/initializers/00_rails_disable_joins_spec.rb
deleted file mode 100644
index 3b390f1ef17..00000000000
--- a/spec/initializers/00_rails_disable_joins_spec.rb
+++ /dev/null
@@ -1,288 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'DisableJoins' do
- let(:primary_model) do
- Class.new(ApplicationRecord) do
- self.table_name = '_test_primary_records'
-
- def self.name
- 'TestPrimary'
- end
- end
- end
-
- let(:bridge_model) do
- Class.new(ApplicationRecord) do
- self.table_name = '_test_bridge_records'
-
- def self.name
- 'TestBridge'
- end
- end
- end
-
- let(:secondary_model) do
- Class.new(ApplicationRecord) do
- self.table_name = '_test_secondary_records'
-
- def self.name
- 'TestSecondary'
- end
- end
- end
-
- context 'passing disable_joins as an association option' do
- context 'when the association is a bare has_one' do
- it 'disallows the disable_joins option' do
- expect do
- primary_model.has_one :test_bridge, disable_joins: true
- end.to raise_error(ArgumentError, /Unknown key: :disable_joins/)
- end
- end
-
- context 'when the association is a belongs_to' do
- it 'disallows the disable_joins option' do
- expect do
- bridge_model.belongs_to :test_secondary, disable_joins: true
- end.to raise_error(ArgumentError, /Unknown key: :disable_joins/)
- end
- end
-
- context 'when the association is has_one :through' do
- it 'allows the disable_joins option' do
- primary_model.has_one :test_bridge
- bridge_model.belongs_to :test_secondary
-
- expect do
- primary_model.has_one :test_secondary, through: :test_bridge, disable_joins: true
- end.not_to raise_error
- end
- end
-
- context 'when the association is a bare has_many' do
- it 'disallows the disable_joins option' do
- expect do
- primary_model.has_many :test_bridges, disable_joins: true
- end.to raise_error(ArgumentError, /Unknown key: :disable_joins/)
- end
- end
-
- context 'when the association is a has_many :through' do
- it 'allows the disable_joins option' do
- primary_model.has_many :test_bridges
- bridge_model.belongs_to :test_secondary
-
- expect do
- primary_model.has_many :test_secondaries, through: :test_bridges, disable_joins: true
- end.not_to raise_error
- end
- end
- end
-
- context 'querying has_one :through when disable_joins is set' do
- before do
- create_tables(<<~SQL)
- CREATE TABLE _test_primary_records (
- id serial NOT NULL PRIMARY KEY);
-
- CREATE TABLE _test_bridge_records (
- id serial NOT NULL PRIMARY KEY,
- primary_record_id int NOT NULL,
- secondary_record_id int NOT NULL);
-
- CREATE TABLE _test_secondary_records (
- id serial NOT NULL PRIMARY KEY);
- SQL
-
- primary_model.has_one :test_bridge, anonymous_class: bridge_model, foreign_key: :primary_record_id
- bridge_model.belongs_to :test_secondary, anonymous_class: secondary_model, foreign_key: :secondary_record_id
- primary_model.has_one :test_secondary,
- through: :test_bridge, anonymous_class: secondary_model, disable_joins: -> { joins_disabled_flag }
-
- primary_record = primary_model.create!
- secondary_record = secondary_model.create!
- bridge_model.create!(primary_record_id: primary_record.id, secondary_record_id: secondary_record.id)
- end
-
- context 'when disable_joins evaluates to true' do
- let(:joins_disabled_flag) { true }
-
- it 'executes separate queries' do
- primary_record = primary_model.first
-
- query_count = ActiveRecord::QueryRecorder.new { primary_record.test_secondary }.count
-
- expect(query_count).to eq(2)
- end
- end
-
- context 'when disable_joins evalutes to false' do
- let(:joins_disabled_flag) { false }
-
- it 'executes a single query' do
- primary_record = primary_model.first
-
- query_count = ActiveRecord::QueryRecorder.new { primary_record.test_secondary }.count
-
- expect(query_count).to eq(1)
- end
- end
- end
-
- context 'querying has_many :through when disable_joins is set' do
- before do
- create_tables(<<~SQL)
- CREATE TABLE _test_primary_records (
- id serial NOT NULL PRIMARY KEY);
-
- CREATE TABLE _test_bridge_records (
- id serial NOT NULL PRIMARY KEY,
- primary_record_id int NOT NULL);
-
- CREATE TABLE _test_secondary_records (
- id serial NOT NULL PRIMARY KEY,
- bridge_record_id int NOT NULL);
- SQL
-
- primary_model.has_many :test_bridges, anonymous_class: bridge_model, foreign_key: :primary_record_id
- bridge_model.has_many :test_secondaries, anonymous_class: secondary_model, foreign_key: :bridge_record_id
- primary_model.has_many :test_secondaries, through: :test_bridges, anonymous_class: secondary_model,
- disable_joins: -> { disabled_join_flag }
-
- primary_record = primary_model.create!
- bridge_record = bridge_model.create!(primary_record_id: primary_record.id)
- secondary_model.create!(bridge_record_id: bridge_record.id)
- end
-
- context 'when disable_joins evaluates to true' do
- let(:disabled_join_flag) { true }
-
- it 'executes separate queries' do
- primary_record = primary_model.first
-
- query_count = ActiveRecord::QueryRecorder.new { primary_record.test_secondaries.first }.count
-
- expect(query_count).to eq(2)
- end
- end
-
- context 'when disable_joins evalutes to false' do
- let(:disabled_join_flag) { false }
-
- it 'executes a single query' do
- primary_record = primary_model.first
-
- query_count = ActiveRecord::QueryRecorder.new { primary_record.test_secondaries.first }.count
-
- expect(query_count).to eq(1)
- end
- end
- end
-
- context 'querying STI relationships' do
- let(:child_bridge_model) do
- Class.new(bridge_model) do
- def self.name
- 'ChildBridge'
- end
- end
- end
-
- let(:child_secondary_model) do
- Class.new(secondary_model) do
- def self.name
- 'ChildSecondary'
- end
- end
- end
-
- before do
- create_tables(<<~SQL)
- CREATE TABLE _test_primary_records (
- id serial NOT NULL PRIMARY KEY);
-
- CREATE TABLE _test_bridge_records (
- id serial NOT NULL PRIMARY KEY,
- primary_record_id int NOT NULL,
- type text);
-
- CREATE TABLE _test_secondary_records (
- id serial NOT NULL PRIMARY KEY,
- bridge_record_id int NOT NULL,
- type text);
- SQL
-
- primary_model.has_many :child_bridges, anonymous_class: child_bridge_model, foreign_key: :primary_record_id
- child_bridge_model.has_one :child_secondary, anonymous_class: child_secondary_model, foreign_key: :bridge_record_id
- primary_model.has_many :child_secondaries, through: :child_bridges, anonymous_class: child_secondary_model, disable_joins: true
-
- primary_record = primary_model.create!
- parent_bridge_record = bridge_model.create!(primary_record_id: primary_record.id)
- child_bridge_record = child_bridge_model.create!(primary_record_id: primary_record.id)
-
- secondary_model.create!(bridge_record_id: child_bridge_record.id)
- child_secondary_model.create!(bridge_record_id: parent_bridge_record.id)
- child_secondary_model.create!(bridge_record_id: child_bridge_record.id)
- end
-
- it 'filters correctly by the STI type across multiple queries' do
- primary_record = primary_model.first
-
- query_recorder = ActiveRecord::QueryRecorder.new do
- expect(primary_record.child_secondaries.count).to eq(1)
- end
-
- expect(query_recorder.count).to eq(2)
- end
- end
-
- context 'querying polymorphic relationships' do
- before do
- create_tables(<<~SQL)
- CREATE TABLE _test_primary_records (
- id serial NOT NULL PRIMARY KEY);
-
- CREATE TABLE _test_bridge_records (
- id serial NOT NULL PRIMARY KEY,
- primaryable_id int NOT NULL,
- primaryable_type text NOT NULL);
-
- CREATE TABLE _test_secondary_records (
- id serial NOT NULL PRIMARY KEY,
- bridgeable_id int NOT NULL,
- bridgeable_type text NOT NULL);
- SQL
-
- primary_model.has_many :test_bridges, anonymous_class: bridge_model, foreign_key: :primaryable_id, as: :primaryable
- bridge_model.has_one :test_secondaries, anonymous_class: secondary_model, foreign_key: :bridgeable_id, as: :bridgeable
- primary_model.has_many :test_secondaries, through: :test_bridges, anonymous_class: secondary_model, disable_joins: true
-
- primary_record = primary_model.create!
- primary_bridge_record = bridge_model.create!(primaryable_id: primary_record.id, primaryable_type: 'TestPrimary')
- nonprimary_bridge_record = bridge_model.create!(primaryable_id: primary_record.id, primaryable_type: 'NonPrimary')
-
- secondary_model.create!(bridgeable_id: primary_bridge_record.id, bridgeable_type: 'TestBridge')
- secondary_model.create!(bridgeable_id: nonprimary_bridge_record.id, bridgeable_type: 'TestBridge')
- secondary_model.create!(bridgeable_id: primary_bridge_record.id, bridgeable_type: 'NonBridge')
- end
-
- it 'filters correctly by the polymorphic type across multiple queries' do
- primary_record = primary_model.first
-
- query_recorder = ActiveRecord::QueryRecorder.new do
- expect(primary_record.test_secondaries.count).to eq(1)
- end
-
- expect(query_recorder.count).to eq(2)
- end
- end
-
- def create_tables(table_sql)
- ApplicationRecord.connection.execute(table_sql)
-
- bridge_model.reset_column_information
- secondary_model.reset_column_information
- end
-end
diff --git a/spec/initializers/100_patch_omniauth_saml_spec.rb b/spec/initializers/100_patch_omniauth_saml_spec.rb
index de556cfa1e5..886f350ca88 100644
--- a/spec/initializers/100_patch_omniauth_saml_spec.rb
+++ b/spec/initializers/100_patch_omniauth_saml_spec.rb
@@ -6,6 +6,15 @@ RSpec.describe 'OmniAuth::Strategies::SAML', type: :strategy do
let(:idp_sso_target_url) { 'https://login.example.com/idp' }
let(:strategy) { [OmniAuth::Strategies::SAML, { idp_sso_target_url: idp_sso_target_url }] }
+ before do
+ mock_session = {}
+
+ allow(mock_session).to receive(:enabled?).and_return(true)
+ allow(mock_session).to receive(:loaded?).and_return(true)
+
+ env('rack.session', mock_session)
+ end
+
describe 'POST /users/auth/saml' do
it 'redirects to the provider login page', :aggregate_failures do
post '/users/auth/saml'
diff --git a/spec/initializers/action_dispatch_journey_router_spec.rb b/spec/initializers/action_dispatch_journey_router_spec.rb
new file mode 100644
index 00000000000..641a8c6d11f
--- /dev/null
+++ b/spec/initializers/action_dispatch_journey_router_spec.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+# Adds a missing test to provide full coverage for the patch
+RSpec.describe 'ActionDispatch::Journey::Router Patch', feature_category: :database do
+ before do
+ load Rails.root.join('config/initializers/action_dispatch_journey_router.rb')
+ end
+
+ describe '#find_routes' do
+ context 'when a route has additional constrains' do
+ it 'does not raise an error' do
+ stub_const('PagesController', Class.new(ApplicationController))
+
+ set = ActionDispatch::Routing::RouteSet.new
+
+ set.draw do
+ get "*namespace_id/:project_id/bar",
+ to: "pages#show",
+ constraints: {
+ namespace_id: %r{(?!api/)[a-zA-Z0-9_\\]+},
+ project_id: /[a-zA-Z0-9]+/
+ }
+
+ get "/api/foo/bar", to: "pages#index"
+ end
+
+ params = set.recognize_path("/api/foo/bar", method: :get)
+
+ expect(params[:controller]).to eq('pages')
+ expect(params[:action]).to eq('index')
+ end
+ end
+ end
+end
diff --git a/spec/initializers/google_api_client_spec.rb b/spec/initializers/google_api_client_spec.rb
index b3c4ac5e23b..cd3e3cf0328 100644
--- a/spec/initializers/google_api_client_spec.rb
+++ b/spec/initializers/google_api_client_spec.rb
@@ -8,7 +8,7 @@ require 'google/apis/core/base_service'
RSpec.describe Google::Apis::Core::HttpCommand do # rubocop:disable RSpec/FilePath
context('with a successful response') do
let(:client) { Google::Apis::Core::BaseService.new('', '').client }
- let(:command) { Google::Apis::Core::HttpCommand.new(:get, 'https://www.googleapis.com/zoo/animals') }
+ let(:command) { described_class.new(:get, 'https://www.googleapis.com/zoo/animals') }
before do
stub_request(:get, 'https://www.googleapis.com/zoo/animals').to_return(body: %(Hello world))
diff --git a/spec/initializers/grpc_patch_spec.rb b/spec/initializers/grpc_patch_spec.rb
new file mode 100644
index 00000000000..90d1269e4c1
--- /dev/null
+++ b/spec/initializers/grpc_patch_spec.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'GRPC monkey patch', feature_category: :shared do
+ let(:server) { GRPC::RpcServer.new }
+ let(:stub) do
+ Class.new(Gitaly::CommitService::Service) do
+ def find_all_commits(_request, _call)
+ sleep 1
+
+ nil
+ end
+ end
+ end
+
+ it 'raises DeadlineExceeded on a late server streaming response' do
+ server_port = server.add_http2_port('0.0.0.0:0', :this_port_is_insecure)
+ host = "localhost:#{server_port}"
+ server.handle(stub)
+ thr = Thread.new { server.run }
+
+ stub = Gitaly::CommitService::Stub.new(host, :this_channel_is_insecure)
+ request = Gitaly::FindAllCommitsRequest.new
+ response = stub.find_all_commits(request, deadline: Time.now + 0.1)
+ expect { response.to_a }.to raise_error(GRPC::DeadlineExceeded)
+
+ server.stop
+ thr.join
+ end
+end
diff --git a/spec/initializers/secret_token_spec.rb b/spec/initializers/secret_token_spec.rb
index 2c396a18361..5c39bee16b2 100644
--- a/spec/initializers/secret_token_spec.rb
+++ b/spec/initializers/secret_token_spec.rb
@@ -7,8 +7,8 @@ RSpec.describe 'create_tokens' do
include StubENV
let(:secrets) { ActiveSupport::OrderedOptions.new }
- let(:hex_key) { /\h{128}/.freeze }
- let(:rsa_key) { /\A-----BEGIN RSA PRIVATE KEY-----\n.+\n-----END RSA PRIVATE KEY-----\n\Z/m.freeze }
+ let(:hex_key) { /\h{128}/ }
+ let(:rsa_key) { /\A-----BEGIN RSA PRIVATE KEY-----\n.+\n-----END RSA PRIVATE KEY-----\n\Z/m }
before do
allow(Rails).to receive_message_chain(:application, :secrets).and_return(secrets)
diff --git a/spec/lib/api/entities/bulk_imports/export_batch_status_spec.rb b/spec/lib/api/entities/bulk_imports/export_batch_status_spec.rb
new file mode 100644
index 00000000000..df190a1306f
--- /dev/null
+++ b/spec/lib/api/entities/bulk_imports/export_batch_status_spec.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::Entities::BulkImports::ExportBatchStatus, feature_category: :importers do
+ let_it_be(:batch) { create(:bulk_import_export_batch) }
+
+ let(:entity) { described_class.new(batch, request: double) }
+
+ subject { entity.as_json }
+
+ it 'has the correct attributes' do
+ expect(subject).to eq(
+ status: batch.status,
+ batch_number: batch.batch_number,
+ objects_count: batch.objects_count,
+ error: batch.error,
+ updated_at: batch.updated_at
+ )
+ end
+end
diff --git a/spec/lib/api/entities/bulk_imports/export_status_spec.rb b/spec/lib/api/entities/bulk_imports/export_status_spec.rb
index 7d79e372027..b7dbf525a3d 100644
--- a/spec/lib/api/entities/bulk_imports/export_status_spec.rb
+++ b/spec/lib/api/entities/bulk_imports/export_status_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe API::Entities::BulkImports::ExportStatus do
+RSpec.describe API::Entities::BulkImports::ExportStatus, feature_category: :importers do
let_it_be(:export) { create(:bulk_import_export) }
let(:entity) { described_class.new(export, request: double) }
@@ -10,11 +10,22 @@ RSpec.describe API::Entities::BulkImports::ExportStatus do
subject { entity.as_json }
it 'has the correct attributes' do
- expect(subject).to eq({
+ expect(subject).to eq(
relation: export.relation,
status: export.status,
error: export.error,
- updated_at: export.updated_at
- })
+ updated_at: export.updated_at,
+ batched: export.batched?,
+ batches_count: export.batches_count,
+ total_objects_count: export.total_objects_count
+ )
+ end
+
+ context 'when export is batched' do
+ let_it_be(:export) { create(:bulk_import_export, :batched) }
+
+ it 'exposes batches' do
+ expect(subject).to match(hash_including(batches: []))
+ end
end
end
diff --git a/spec/lib/api/entities/plan_limit_spec.rb b/spec/lib/api/entities/plan_limit_spec.rb
index a2d183fd631..b0ad13995d7 100644
--- a/spec/lib/api/entities/plan_limit_spec.rb
+++ b/spec/lib/api/entities/plan_limit_spec.rb
@@ -20,6 +20,7 @@ RSpec.describe API::Entities::PlanLimit do
:enforcement_limit,
:generic_packages_max_file_size,
:helm_max_file_size,
+ :limits_history,
:maven_max_file_size,
:notification_limit,
:npm_max_file_size,
diff --git a/spec/lib/api/entities/project_spec.rb b/spec/lib/api/entities/project_spec.rb
index 3a5349bb59b..5d18b93228f 100644
--- a/spec/lib/api/entities/project_spec.rb
+++ b/spec/lib/api/entities/project_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe ::API::Entities::Project do
let(:options) { { current_user: current_user } }
let(:entity) do
- ::API::Entities::Project.new(project, options)
+ described_class.new(project, options)
end
subject(:json) { entity.as_json }
diff --git a/spec/lib/api/helpers/packages/npm_spec.rb b/spec/lib/api/helpers/packages/npm_spec.rb
index cfb68d2c53e..bd28fdadf02 100644
--- a/spec/lib/api/helpers/packages/npm_spec.rb
+++ b/spec/lib/api/helpers/packages/npm_spec.rb
@@ -3,6 +3,15 @@
require 'spec_helper'
RSpec.describe ::API::Helpers::Packages::Npm, feature_category: :package_registry do # rubocop: disable RSpec/FilePath
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:namespace) { group }
+ let_it_be(:project) { create(:project, :public, namespace: namespace) }
+ let_it_be(:package) { create(:npm_package, project: project) }
+
+ let(:package_name) { package.name }
+ let(:params) { { id: project.id } }
+ let(:endpoint_scope) { :project }
let(:object) { klass.new(params) }
let(:klass) do
Struct.new(:params) do
@@ -11,12 +20,6 @@ RSpec.describe ::API::Helpers::Packages::Npm, feature_category: :package_registr
end
end
- let_it_be(:user) { create(:user) }
- let_it_be(:group) { create(:group) }
- let_it_be(:namespace) { group }
- let_it_be(:project) { create(:project, :public, namespace: namespace) }
- let_it_be(:package) { create(:npm_package, project: project) }
-
before do
allow(object).to receive(:endpoint_scope).and_return(endpoint_scope)
allow(object).to receive(:current_user).and_return(user)
@@ -25,12 +28,7 @@ RSpec.describe ::API::Helpers::Packages::Npm, feature_category: :package_registr
describe '#finder_for_endpoint_scope' do
subject { object.finder_for_endpoint_scope(package_name) }
- let(:package_name) { package.name }
-
context 'when called with project scope' do
- let(:params) { { id: project.id } }
- let(:endpoint_scope) { :project }
-
it 'returns a PackageFinder for project scope' do
expect(::Packages::Npm::PackageFinder).to receive(:new).with(package_name, project: project)
@@ -142,4 +140,10 @@ RSpec.describe ::API::Helpers::Packages::Npm, feature_category: :package_registr
end
end
end
+
+ describe '#enqueue_sync_metadata_cache_worker' do
+ it_behaves_like 'enqueue a worker to sync a metadata cache' do
+ subject { object.enqueue_sync_metadata_cache_worker(project, package_name) }
+ end
+ end
end
diff --git a/spec/lib/api/helpers_spec.rb b/spec/lib/api/helpers_spec.rb
index f8d40d6e181..667ee72f821 100644
--- a/spec/lib/api/helpers_spec.rb
+++ b/spec/lib/api/helpers_spec.rb
@@ -33,7 +33,7 @@ RSpec.describe API::Helpers, feature_category: :shared do
end
it 'handles sticking when a user could be found' do
- allow_any_instance_of(API::Helpers).to receive(:initial_current_user).and_return(user)
+ allow_any_instance_of(described_class).to receive(:initial_current_user).and_return(user)
expect(ApplicationRecord.sticking)
.to receive(:stick_or_unstick_request).with(any_args, :user, 42)
@@ -44,7 +44,7 @@ RSpec.describe API::Helpers, feature_category: :shared do
end
it 'does not handle sticking if no user could be found' do
- allow_any_instance_of(API::Helpers).to receive(:initial_current_user).and_return(nil)
+ allow_any_instance_of(described_class).to receive(:initial_current_user).and_return(nil)
expect(ApplicationRecord.sticking)
.not_to receive(:stick_or_unstick_request)
@@ -55,7 +55,7 @@ RSpec.describe API::Helpers, feature_category: :shared do
end
it 'returns the user if one could be found' do
- allow_any_instance_of(API::Helpers).to receive(:initial_current_user).and_return(user)
+ allow_any_instance_of(described_class).to receive(:initial_current_user).and_return(user)
get 'user'
@@ -609,6 +609,39 @@ RSpec.describe API::Helpers, feature_category: :shared do
end
end
+ describe '#track_event' do
+ let(:user_id) { 345 }
+ let(:namespace_id) { 12 }
+ let(:project_id) { 56 }
+ let(:event_name) { 'i_compliance_dashboard' }
+ let(:unknown_event) { 'unknown' }
+
+ it 'tracks internal event' do
+ expect(Gitlab::InternalEvents).to receive(:track_event).with(
+ event_name,
+ user_id: user_id,
+ namespace_id: namespace_id,
+ project_id: project_id
+ )
+
+ helper.track_event(event_name, user_id: user_id, namespace_id: namespace_id, project_id: project_id)
+ end
+
+ it 'logs an exception for unknown event' do
+ expect(Gitlab::AppLogger).to receive(:warn).with(
+ "Internal Event tracking event failed for event: #{unknown_event}, message: Unknown event: #{unknown_event}"
+ )
+
+ helper.track_event(unknown_event, user_id: user_id, namespace_id: namespace_id, project_id: project_id)
+ end
+
+ it 'does not track event for nil user_id' do
+ expect(Gitlab::InternalEvents).not_to receive(:track_event)
+
+ helper.track_event(unknown_event, user_id: nil, namespace_id: namespace_id, project_id: project_id)
+ end
+ end
+
shared_examples '#order_options_with_tie_breaker' do
subject { Class.new.include(described_class).new.order_options_with_tie_breaker }
diff --git a/spec/lib/atlassian/jira_connect/client_spec.rb b/spec/lib/atlassian/jira_connect/client_spec.rb
index 66ae3658a92..f7597579e7a 100644
--- a/spec/lib/atlassian/jira_connect/client_spec.rb
+++ b/spec/lib/atlassian/jira_connect/client_spec.rb
@@ -214,13 +214,7 @@ RSpec.describe Atlassian::JiraConnect::Client, feature_category: :integrations d
end
describe '#store_deploy_info' do
- let_it_be(:environment) { create(:environment, name: 'DEV', project: project) }
- let_it_be(:deployments) do
- pipelines.map do |p|
- build = create(:ci_build, environment: environment.name, pipeline: p, project: project)
- create(:deployment, deployable: build, environment: environment)
- end
- end
+ let_it_be(:deployments) { create_list(:deployment, 1) }
let(:schema) do
Atlassian::Schemata.deploy_info_payload
@@ -252,18 +246,22 @@ RSpec.describe Atlassian::JiraConnect::Client, feature_category: :integrations d
subject.send(:store_deploy_info, project: project, deployments: deployments)
end
- it 'only sends information about relevant MRs' do
+ it 'calls the API if issue keys are found' do
expect(subject).to receive(:post).with(
- '/rest/deployments/0.1/bulk', { deployments: have_attributes(size: 8) }
+ '/rest/deployments/0.1/bulk', { deployments: have_attributes(size: 1) }
).and_call_original
subject.send(:store_deploy_info, project: project, deployments: deployments)
end
- it 'does not call the API if there is nothing to report' do
+ it 'does not call the API if no issue keys are found' do
+ allow_next_instances_of(Atlassian::JiraConnect::Serializers::DeploymentEntity, nil) do |entity|
+ allow(entity).to receive(:issue_keys).and_return([])
+ end
+
expect(subject).not_to receive(:post)
- subject.send(:store_deploy_info, project: project, deployments: deployments.take(1))
+ subject.send(:store_deploy_info, project: project, deployments: deployments)
end
context 'when there are errors' do
diff --git a/spec/lib/atlassian/jira_connect/serializers/deployment_entity_spec.rb b/spec/lib/atlassian/jira_connect/serializers/deployment_entity_spec.rb
index 523b7ddaa09..57e0b67e9e6 100644
--- a/spec/lib/atlassian/jira_connect/serializers/deployment_entity_spec.rb
+++ b/spec/lib/atlassian/jira_connect/serializers/deployment_entity_spec.rb
@@ -6,18 +6,16 @@ RSpec.describe Atlassian::JiraConnect::Serializers::DeploymentEntity, feature_ca
let_it_be(:user) { create_default(:user) }
let_it_be(:project) { create_default(:project, :repository) }
let_it_be(:environment) { create(:environment, name: 'prod', project: project) }
- let_it_be_with_reload(:deployment) { create(:deployment, environment: environment) }
+ let_it_be_with_refind(:deployment) { create(:deployment, environment: environment) }
subject { described_class.represent(deployment) }
- context 'when the deployment does not belong to any Jira issue' do
- describe '#issue_keys' do
- it 'is empty' do
- expect(subject.issue_keys).to be_empty
+ describe '#to_json' do
+ context 'when the deployment does not belong to any Jira issue' do
+ before do
+ allow(subject).to receive(:issue_keys).and_return([])
end
- end
- describe '#to_json' do
it 'can encode the object' do
expect(subject.to_json).to be_valid_json
end
@@ -26,9 +24,19 @@ RSpec.describe Atlassian::JiraConnect::Serializers::DeploymentEntity, feature_ca
expect(subject.to_json).not_to match_schema(Atlassian::Schemata.deployment_info)
end
end
+
+ context 'when the deployment belongs to Jira issue' do
+ before do
+ allow(subject).to receive(:issue_keys).and_return(['JIRA-1'])
+ end
+
+ it 'is valid according to the deployment info schema' do
+ expect(subject.to_json).to be_valid_json.and match_schema(Atlassian::Schemata.deployment_info)
+ end
+ end
end
- context 'this is an external deployment' do
+ context 'when deployment is an external deployment' do
before do
deployment.update!(deployable: nil)
end
@@ -36,10 +44,6 @@ RSpec.describe Atlassian::JiraConnect::Serializers::DeploymentEntity, feature_ca
it 'does not raise errors when serializing' do
expect { subject.to_json }.not_to raise_error
end
-
- it 'returns an empty list of issue keys' do
- expect(subject.issue_keys).to be_empty
- end
end
describe 'environment type' do
@@ -62,27 +66,137 @@ RSpec.describe Atlassian::JiraConnect::Serializers::DeploymentEntity, feature_ca
end
end
- context 'when the deployment can be linked to a Jira issue' do
- let(:pipeline) { create(:ci_pipeline, merge_request: merge_request) }
-
+ describe '#issue_keys' do
+ # For these tests, use a Jira issue key regex that matches a set of commit messages
+ # in the test repo.
+ #
+ # Relevant commits in this test from https://gitlab.com/gitlab-org/gitlab-test/-/commits/master:
+ #
+ # 1) 5f923865dde3436854e9ceb9cdb7815618d4e849 GitLab currently doesn't support patches [...]: add a commit here
+ # 2) 4cd80ccab63c82b4bad16faa5193fbd2aa06df40 add directory structure for tree_helper spec
+ # 3) ae73cb07c9eeaf35924a10f713b364d32b2dd34f Binary file added
+ # 4) 33f3729a45c02fc67d00adb1b8bca394b0e761d9 Image added
before do
- subject.deployable.update!(pipeline: pipeline)
+ allow(Gitlab::Regex).to receive(:jira_issue_key_regex).and_return(/add.[a-d]/)
+ end
+
+ let(:expected_issue_keys) { ['add a', 'add d', 'added'] }
+
+ it 'extracts issue keys from the commits' do
+ expect(subject.issue_keys).to contain_exactly(*expected_issue_keys)
+ end
+
+ it 'limits the number of commits scanned' do
+ stub_const("#{described_class}::COMMITS_LIMIT", 10)
+
+ expect(subject.issue_keys).to contain_exactly('add a')
+ end
+
+ context 'when `jira_deployment_issue_keys` flag is disabled' do
+ before do
+ stub_feature_flags(jira_deployment_issue_keys: false)
+ end
+
+ it 'does not extract issue keys from commits' do
+ expect(subject.issue_keys).to be_empty
+ end
+ end
+
+ context 'when deploy happened at an older commit' do
+ before do
+ # SHA is from a commit between 1) and 2) in the commit list above.
+ deployment.update!(sha: 'c7fbe50c7c7419d9701eebe64b1fdacc3df5b9dd')
+ end
+
+ it 'extracts only issue keys from that commit or older' do
+ expect(subject.issue_keys).to contain_exactly('add d', 'added')
+ end
end
- %i[jira_branch jira_title jira_description].each do |trait|
- context "because it belongs to an MR with a #{trait}" do
- let(:merge_request) { create(:merge_request, trait) }
+ context 'when the deployment has an associated merge request' do
+ let_it_be(:pipeline) do
+ create(:ci_pipeline,
+ merge_request: create(:merge_request,
+ title: 'Title addxa',
+ description: "Description\naddxa\naddya",
+ source_branch: 'feature/addza'
+ )
+ )
+ end
+
+ before do
+ subject.deployable.update!(pipeline: pipeline)
+ end
+
+ it 'includes issue keys extracted from the merge request' do
+ expect(subject.issue_keys).to contain_exactly(
+ *(expected_issue_keys + %w[addxa addya addza])
+ )
+ end
+ end
+
+ context 'when there was a successful deploy to the environment' do
+ let_it_be_with_reload(:last_deploy) do
+ # SHA is from a commit between 2) and 3) in the commit list above.
+ sha = '5937ac0a7beb003549fc5fd26fc247adbce4a52e'
+ create(:deployment, :success, sha: sha, environment: environment, finished_at: 1.hour.ago)
+ end
+
+ shared_examples 'extracts only issue keys from commits made since that deployment' do
+ specify do
+ expect(subject.issue_keys).to contain_exactly('add a', 'add d')
+ end
+ end
+
+ shared_examples 'ignores that deployment' do
+ specify do
+ expect(subject.issue_keys).to contain_exactly(*expected_issue_keys)
+ end
+ end
+
+ it_behaves_like 'extracts only issue keys from commits made since that deployment'
+
+ context 'when the deploy was for a different environment' do
+ before do
+ last_deploy.update!(environment: create(:environment))
+ end
+
+ it_behaves_like 'ignores that deployment'
+ end
+
+ context 'when the deploy was for a different branch or tag' do
+ before do
+ last_deploy.update!(ref: 'foo')
+ end
+
+ it_behaves_like 'ignores that deployment'
+ end
+
+ context 'when the deploy was not successful' do
+ before do
+ last_deploy.drop!
+ end
+
+ it_behaves_like 'ignores that deployment'
+ end
+
+ context 'when the deploy commit cannot be found' do
+ before do
+ last_deploy.update!(sha: 'foo')
+ end
+
+ it_behaves_like 'ignores that deployment'
+ end
- describe '#issue_keys' do
- it 'is not empty' do
- expect(subject.issue_keys).not_to be_empty
- end
+ context 'when there is a more recent deployment' do
+ let_it_be(:more_recent_last_deploy) do
+ # SHA is from a commit between 1) and 2) in the commit list above.
+ sha = 'c7fbe50c7c7419d9701eebe64b1fdacc3df5b9dd'
+ create(:deployment, :success, sha: sha, environment: environment, finished_at: 1.minute.ago)
end
- describe '#to_json' do
- it 'is valid according to the deployment info schema' do
- expect(subject.to_json).to be_valid_json.and match_schema(Atlassian::Schemata.deployment_info)
- end
+ it 'extracts only issue keys from commits made since that deployment' do
+ expect(subject.issue_keys).to contain_exactly('add a')
end
end
end
diff --git a/spec/lib/banzai/filter/autolink_filter_spec.rb b/spec/lib/banzai/filter/autolink_filter_spec.rb
index 2c75377ec42..c8b5a9ffa0b 100644
--- a/spec/lib/banzai/filter/autolink_filter_spec.rb
+++ b/spec/lib/banzai/filter/autolink_filter_spec.rb
@@ -169,7 +169,7 @@ RSpec.describe Banzai::Filter::AutolinkFilter, feature_category: :team_planning
it 'removes one closing punctuation mark when the punctuation in the link is unbalanced' do
complicated_link = "(#{link}(a'b[c'd]))'"
- expected_complicated_link = %Q{(<a href="#{link}(a'b[c'd]))">#{link}(a'b[c'd]))</a>'}
+ expected_complicated_link = %{(<a href="#{link}(a'b[c'd]))">#{link}(a'b[c'd]))</a>'}
actual = unescape(filter(complicated_link).to_html)
expect(actual).to eq(Rinku.auto_link(complicated_link))
@@ -178,7 +178,7 @@ RSpec.describe Banzai::Filter::AutolinkFilter, feature_category: :team_planning
it 'does not double-encode HTML entities' do
encoded_link = "#{link}?foo=bar&amp;baz=quux"
- expected_encoded_link = %Q{<a href="#{encoded_link}">#{encoded_link}</a>}
+ expected_encoded_link = %{<a href="#{encoded_link}">#{encoded_link}</a>}
actual = unescape(filter(encoded_link).to_html)
expect(actual).to eq(Rinku.auto_link(encoded_link))
diff --git a/spec/lib/banzai/filter/external_link_filter_spec.rb b/spec/lib/banzai/filter/external_link_filter_spec.rb
index de259342998..300b8601dcb 100644
--- a/spec/lib/banzai/filter/external_link_filter_spec.rb
+++ b/spec/lib/banzai/filter/external_link_filter_spec.rb
@@ -34,7 +34,7 @@ RSpec.describe Banzai::Filter::ExternalLinkFilter, feature_category: :team_plann
it 'skips internal links' do
internal = Gitlab.config.gitlab.url
- exp = act = %Q(<a href="#{internal}/sign_in">Login</a>)
+ exp = act = %(<a href="#{internal}/sign_in">Login</a>)
expect(filter(act).to_html).to eq exp
end
@@ -90,7 +90,7 @@ RSpec.describe Banzai::Filter::ExternalLinkFilter, feature_category: :team_plann
context 'with an impersonated username' do
let(:internal) { Gitlab.config.gitlab.url }
- let(:doc) { filter %Q(<a href="https://#{internal}@example.com" target="_blank">Reverse Tabnabbing</a>) }
+ let(:doc) { filter %(<a href="https://#{internal}@example.com" target="_blank">Reverse Tabnabbing</a>) }
it_behaves_like 'an external link with rel attribute'
end
@@ -112,8 +112,8 @@ RSpec.describe Banzai::Filter::ExternalLinkFilter, feature_category: :team_plann
it 'skips internal links' do
internal_link = Gitlab.config.gitlab.url + "/sign_in"
url = internal_link.gsub(/\Ahttp/, 'HtTp')
- act = %Q(<a href="#{url}">Login</a>)
- exp = %Q(<a href="#{internal_link}">Login</a>)
+ act = %(<a href="#{url}">Login</a>)
+ exp = %(<a href="#{internal_link}">Login</a>)
expect(filter(act).to_html).to eq(exp)
end
@@ -131,7 +131,7 @@ RSpec.describe Banzai::Filter::ExternalLinkFilter, feature_category: :team_plann
context 'links with RTLO character' do
# In rendered text this looks like "http://example.com/evilexe.mp3"
- let(:doc) { filter %Q(<a href="http://example.com/evil%E2%80%AE3pm.exe">http://example.com/evil\u202E3pm.exe</a>) }
+ let(:doc) { filter %(<a href="http://example.com/evil%E2%80%AE3pm.exe">http://example.com/evil\u202E3pm.exe</a>) }
it_behaves_like 'an external link with rel attribute'
@@ -142,7 +142,7 @@ RSpec.describe Banzai::Filter::ExternalLinkFilter, feature_category: :team_plann
end
it 'does not mangle the link text' do
- doc = filter %Q(<a href="http://example.com">One<span>and</span>\u202Eexe.mp3</a>)
+ doc = filter %(<a href="http://example.com">One<span>and</span>\u202Eexe.mp3</a>)
expect(doc.to_html).to include('One<span>and</span>%E2%80%AEexe.mp3</a>')
end
diff --git a/spec/lib/banzai/filter/image_link_filter_spec.rb b/spec/lib/banzai/filter/image_link_filter_spec.rb
index 2d496c447e1..6c9e798790f 100644
--- a/spec/lib/banzai/filter/image_link_filter_spec.rb
+++ b/spec/lib/banzai/filter/image_link_filter_spec.rb
@@ -9,8 +9,8 @@ RSpec.describe Banzai::Filter::ImageLinkFilter, feature_category: :team_planning
let(:context) { {} }
def image(path, alt: nil, data_src: nil)
- alt_tag = alt ? %Q{alt="#{alt}"} : ""
- data_src_tag = data_src ? %Q{data-src="#{data_src}"} : ""
+ alt_tag = alt ? %{alt="#{alt}"} : ""
+ data_src_tag = data_src ? %{data-src="#{data_src}"} : ""
%(<img src="#{path}" #{alt_tag} #{data_src_tag} />)
end
@@ -22,7 +22,7 @@ RSpec.describe Banzai::Filter::ImageLinkFilter, feature_category: :team_planning
end
it 'does not wrap a duplicate link' do
- doc = filter(%Q(<a href="/whatever">#{image(path)}</a>), context)
+ doc = filter(%(<a href="/whatever">#{image(path)}</a>), context)
expect(doc.to_html).to match %r{^<a href="/whatever"><img[^>]*></a>$}
end
@@ -34,20 +34,28 @@ RSpec.describe Banzai::Filter::ImageLinkFilter, feature_category: :team_planning
end
it 'works with inline images' do
- doc = filter(%Q(<p>test #{image(path)} inline</p>), context)
+ doc = filter(%(<p>test #{image(path)} inline</p>), context)
expect(doc.to_html).to match %r{^<p>test <a[^>]*><img[^>]*></a> inline</p>$}
end
it 'keep the data-canonical-src' do
- doc = filter(%q(<img src="http://assets.example.com/6cd/4d7" data-canonical-src="http://example.com/test.png" />), context)
+ doc = filter(
+ %q(<img src="http://assets.example.com/6cd/4d7" data-canonical-src="http://example.com/test.png" />),
+ context
+ )
expect(doc.at_css('img')['src']).to eq doc.at_css('a')['href']
expect(doc.at_css('img')['data-canonical-src']).to eq doc.at_css('a')['data-canonical-src']
end
it 'moves the data-diagram* attributes' do
- doc = filter(%q(<img class="plantuml" src="http://localhost:8080/png/U9npoazIqBLJ24uiIbImKl18pSd91m0rkGMq" data-diagram="plantuml" data-diagram-src="data:text/plain;base64,Qm9iIC0+IFNhcmEgOiBIZWxsbw==">), context)
+ # rubocop:disable Layout/LineLength
+ doc = filter(
+ %q(<img class="plantuml" src="http://localhost:8080/png/U9npoazIqBLJ24uiIbImKl18pSd91m0rkGMq" data-diagram="plantuml" data-diagram-src="data:text/plain;base64,Qm9iIC0+IFNhcmEgOiBIZWxsbw==">),
+ context
+ )
+ # rubocop:enable Layout/LineLength
expect(doc.at_css('a')['data-diagram']).to eq "plantuml"
expect(doc.at_css('a')['data-diagram-src']).to eq "data:text/plain;base64,Qm9iIC0+IFNhcmEgOiBIZWxsbw=="
diff --git a/spec/lib/banzai/filter/references/external_issue_reference_filter_spec.rb b/spec/lib/banzai/filter/references/external_issue_reference_filter_spec.rb
index 79500f43394..86fb7d3964d 100644
--- a/spec/lib/banzai/filter/references/external_issue_reference_filter_spec.rb
+++ b/spec/lib/banzai/filter/references/external_issue_reference_filter_spec.rb
@@ -223,7 +223,7 @@ RSpec.describe Banzai::Filter::References::ExternalIssueReferenceFilter, feature
end
context "jira project" do
- let_it_be(:service) { create(:jira_integration, project: project) }
+ let_it_be_with_reload(:service) { create(:jira_integration, project: project) }
let(:reference) { issue.to_reference }
@@ -250,6 +250,36 @@ RSpec.describe Banzai::Filter::References::ExternalIssueReferenceFilter, feature
expect(filter(act).to_html).to eq exp
end
end
+
+ context 'with a custom regex' do
+ before do
+ service.jira_tracker_data.update!(jira_issue_regex: '[JIRA]{2,}-\\d+')
+ end
+
+ context "with right markdown" do
+ let(:issue) { ExternalIssue.new("JIRA-123", project) }
+
+ it_behaves_like "external issue tracker"
+ end
+
+ context "with a single-letter prefix" do
+ let(:issue) { ExternalIssue.new("J-123", project) }
+
+ it "ignores reference" do
+ exp = act = "Issue #{reference}"
+ expect(filter(act).to_html).to eq exp
+ end
+ end
+
+ context "with wrong markdown" do
+ let(:issue) { ExternalIssue.new("#123", project) }
+
+ it "ignores reference" do
+ exp = act = "Issue #{reference}"
+ expect(filter(act).to_html).to eq exp
+ end
+ end
+ end
end
context "ewm project" do
diff --git a/spec/lib/banzai/filter/references/label_reference_filter_spec.rb b/spec/lib/banzai/filter/references/label_reference_filter_spec.rb
index f8d223c6611..91b051d71ec 100644
--- a/spec/lib/banzai/filter/references/label_reference_filter_spec.rb
+++ b/spec/lib/banzai/filter/references/label_reference_filter_spec.rb
@@ -344,7 +344,7 @@ RSpec.describe Banzai::Filter::References::LabelReferenceFilter, feature_categor
end
describe 'referencing a label in a link href' do
- let(:reference) { %Q{<a href="#{label.to_reference}">Label</a>} }
+ let(:reference) { %{<a href="#{label.to_reference}">Label</a>} }
it 'links to a valid reference' do
doc = reference_filter("See #{reference}")
diff --git a/spec/lib/banzai/filter/references/milestone_reference_filter_spec.rb b/spec/lib/banzai/filter/references/milestone_reference_filter_spec.rb
index ecd5d1368c9..7caa6efff66 100644
--- a/spec/lib/banzai/filter/references/milestone_reference_filter_spec.rb
+++ b/spec/lib/banzai/filter/references/milestone_reference_filter_spec.rb
@@ -132,7 +132,7 @@ RSpec.describe Banzai::Filter::References::MilestoneReferenceFilter, feature_cat
shared_examples 'referencing a milestone in a link href' do
let(:unquoted_reference) { "#{Milestone.reference_prefix}#{milestone.name}" }
- let(:link_reference) { %Q{<a href="#{unquoted_reference}">Milestone</a>} }
+ let(:link_reference) { %{<a href="#{unquoted_reference}">Milestone</a>} }
before do
milestone.update!(name: 'gfm')
@@ -169,7 +169,7 @@ RSpec.describe Banzai::Filter::References::MilestoneReferenceFilter, feature_cat
shared_examples 'linking to a milestone as the entire link' do
let(:unquoted_reference) { "#{Milestone.reference_prefix}#{milestone.name}" }
let(:link) { urls.milestone_url(milestone) }
- let(:link_reference) { %Q{<a href="#{link}">#{link}</a>} }
+ let(:link_reference) { %{<a href="#{link}">#{link}</a>} }
it 'replaces the link text with the milestone reference' do
doc = reference_filter("See #{link}")
diff --git a/spec/lib/banzai/pipeline/full_pipeline_spec.rb b/spec/lib/banzai/pipeline/full_pipeline_spec.rb
index 5d56035f6df..6ef03b58f67 100644
--- a/spec/lib/banzai/pipeline/full_pipeline_spec.rb
+++ b/spec/lib/banzai/pipeline/full_pipeline_spec.rb
@@ -28,7 +28,7 @@ RSpec.describe Banzai::Pipeline::FullPipeline, feature_category: :team_planning
end
it 'escapes the data-original attribute on a reference' do
- markdown = %Q{[">bad things](#{issue.to_reference})}
+ markdown = %{[">bad things](#{issue.to_reference})}
result = described_class.to_html(markdown, project: project)
expect(result).to include(%{data-original='\"&amp;gt;bad things'})
end
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
index 12a6be6bc18..9e79be4333a 100644
--- a/spec/lib/banzai/pipeline/incident_management/timeline_event_pipeline_spec.rb
+++ b/spec/lib/banzai/pipeline/incident_management/timeline_event_pipeline_spec.rb
@@ -73,7 +73,7 @@ RSpec.describe Banzai::Pipeline::IncidentManagement::TimelineEventPipeline do
context 'when markdown contains labels' do
let(:label) { create(:label, project: project, title: 'backend') }
- let(:markdown) { %Q(~"#{label.name}" ~unknown) }
+ let(:markdown) { %(~"#{label.name}" ~unknown) }
it 'replaces existing label to a link' do
# rubocop:disable Layout/LineLength
diff --git a/spec/lib/banzai/pipeline/plain_markdown_pipeline_spec.rb b/spec/lib/banzai/pipeline/plain_markdown_pipeline_spec.rb
index 8ff0fa3ae1e..ae01939605e 100644
--- a/spec/lib/banzai/pipeline/plain_markdown_pipeline_spec.rb
+++ b/spec/lib/banzai/pipeline/plain_markdown_pipeline_spec.rb
@@ -64,9 +64,9 @@ RSpec.describe Banzai::Pipeline::PlainMarkdownPipeline, feature_category: :team_
describe 'backslash escapes are untouched in code blocks, code spans, autolinks, or raw HTML' do
where(:markdown, :expected) do
%q(`` \@\! ``) | %q(<code>\@\!</code>)
- %q( \@\!) | %Q(<code>\\@\\!\n</code>)
- %Q(~~~\n\\@\\!\n~~~) | %Q(<code>\\@\\!\n</code>)
- %q($1+\$2$) | %q(<code data-math-style="inline">1+\\$2</code>)
+ %q( \@\!) | %(<code>\\@\\!\n</code>)
+ %(~~~\n\\@\\!\n~~~) | %(<code>\\@\\!\n</code>)
+ %q($1+\$2$) | %q(<code data-math-style="inline">1+\\$2</code>)
%q(<http://example.com?find=\@>) | %q(<a href="http://example.com?find=%5C@">http://example.com?find=\@</a>)
%q[<a href="/bar\@)">] | %q[<a href="/bar\@)">]
end
@@ -77,15 +77,15 @@ RSpec.describe Banzai::Pipeline::PlainMarkdownPipeline, feature_category: :team_
end
describe 'work in all other contexts, including URLs and link titles, link references, and info strings in fenced code blocks' do
- let(:markdown) { %Q(``` foo\\@bar\nfoo\n```) }
+ let(:markdown) { %(``` foo\\@bar\nfoo\n```) }
it 'renders correct html' do
- correct_html_included(markdown, %Q(<pre lang="foo@bar"><code>foo\n</code></pre>))
+ correct_html_included(markdown, %(<pre lang="foo@bar"><code>foo\n</code></pre>))
end
where(:markdown, :expected) do
- %q![foo](/bar\@ "\@title")! | %q(<a href="/bar@" title="@title">foo</a>)
- %Q![foo]\n\n[foo]: /bar\\@ "\\@title"! | %q(<a href="/bar@" title="@title">foo</a>)
+ %q![foo](/bar\@ "\@title")! | %q(<a href="/bar@" title="@title">foo</a>)
+ %![foo]\n\n[foo]: /bar\\@ "\\@title"! | %q(<a href="/bar@" title="@title">foo</a>)
end
with_them do
diff --git a/spec/lib/banzai/reference_parser/issue_parser_spec.rb b/spec/lib/banzai/reference_parser/issue_parser_spec.rb
index 2efdb928b6f..072df6a23aa 100644
--- a/spec/lib/banzai/reference_parser/issue_parser_spec.rb
+++ b/spec/lib/banzai/reference_parser/issue_parser_spec.rb
@@ -136,7 +136,7 @@ RSpec.describe Banzai::ReferenceParser::IssueParser, feature_category: :team_pla
end
def issue_link(issue)
- Nokogiri::HTML.fragment(%Q{<a data-issue="#{issue.id}"></a>}).children[0]
+ Nokogiri::HTML.fragment(%{<a data-issue="#{issue.id}"></a>}).children[0]
end
before do
diff --git a/spec/lib/banzai/reference_parser/merge_request_parser_spec.rb b/spec/lib/banzai/reference_parser/merge_request_parser_spec.rb
index eead5019217..bab535b67bf 100644
--- a/spec/lib/banzai/reference_parser/merge_request_parser_spec.rb
+++ b/spec/lib/banzai/reference_parser/merge_request_parser_spec.rb
@@ -61,7 +61,7 @@ RSpec.describe Banzai::ReferenceParser::MergeRequestParser, feature_category: :c
end
def merge_request_link(merge_request)
- Nokogiri::HTML.fragment(%Q{<a data-project="#{merge_request.project_id}" data-merge-request="#{merge_request.id}"></a>}).children[0]
+ Nokogiri::HTML.fragment(%{<a data-project="#{merge_request.project_id}" data-merge-request="#{merge_request.id}"></a>}).children[0]
end
before do
diff --git a/spec/lib/container_registry/client_spec.rb b/spec/lib/container_registry/client_spec.rb
index cb2da24b712..a1425169dee 100644
--- a/spec/lib/container_registry/client_spec.rb
+++ b/spec/lib/container_registry/client_spec.rb
@@ -338,7 +338,7 @@ RSpec.describe ContainerRegistry::Client do
with_them do
before do
- allow(::Gitlab).to receive(:com?).and_return(is_on_dot_com)
+ allow(::Gitlab).to receive(:com_except_jh?).and_return(is_on_dot_com)
stub_registry_tags_support(registry_tags_support_enabled)
stub_application_setting(container_registry_features: container_registry_features)
end
@@ -403,7 +403,7 @@ RSpec.describe ContainerRegistry::Client do
with_them do
before do
- allow(::Gitlab).to receive(:com?).and_return(is_on_dot_com)
+ allow(::Gitlab).to receive(:com_except_jh?).and_return(is_on_dot_com)
stub_container_registry_config(enabled: registry_enabled, api_url: registry_api_url, key: 'spec/fixtures/x509_certificate_pk.key')
stub_registry_tags_support(registry_tags_support_enabled)
stub_application_setting(container_registry_features: container_registry_features)
diff --git a/spec/lib/container_registry/gitlab_api_client_spec.rb b/spec/lib/container_registry/gitlab_api_client_spec.rb
index c70dd265073..ebc69201513 100644
--- a/spec/lib/container_registry/gitlab_api_client_spec.rb
+++ b/spec/lib/container_registry/gitlab_api_client_spec.rb
@@ -28,7 +28,7 @@ RSpec.describe ContainerRegistry::GitlabApiClient, feature_category: :container_
with_them do
before do
- allow(::Gitlab).to receive(:com?).and_return(is_on_dot_com)
+ allow(::Gitlab).to receive(:com_except_jh?).and_return(is_on_dot_com)
stub_registry_gitlab_api_support(registry_gitlab_api_enabled)
stub_application_setting(container_registry_features: container_registry_features)
end
@@ -46,7 +46,7 @@ RSpec.describe ContainerRegistry::GitlabApiClient, feature_category: :container_
context 'with 401 response' do
before do
- allow(::Gitlab).to receive(:com?).and_return(false)
+ allow(::Gitlab).to receive(:com_except_jh?).and_return(false)
stub_application_setting(container_registry_features: [])
stub_request(:get, "#{registry_api_url}/gitlab/v1/")
.to_return(status: 401, body: '')
@@ -428,7 +428,7 @@ RSpec.describe ContainerRegistry::GitlabApiClient, feature_category: :container_
with_them do
before do
- allow(::Gitlab).to receive(:com?).and_return(is_on_dot_com)
+ allow(::Gitlab).to receive(:com_except_jh?).and_return(is_on_dot_com)
stub_container_registry_config(enabled: true, api_url: registry_api_url, key: 'spec/fixtures/x509_certificate_pk.key')
stub_registry_gitlab_api_support(registry_gitlab_api_enabled)
stub_application_setting(container_registry_features: container_registry_features)
diff --git a/spec/lib/expand_variables_spec.rb b/spec/lib/expand_variables_spec.rb
index 0c5d587d8e8..ad73665326a 100644
--- a/spec/lib/expand_variables_spec.rb
+++ b/spec/lib/expand_variables_spec.rb
@@ -3,7 +3,7 @@
require 'fast_spec_helper'
require 'rspec-parameterized'
-RSpec.describe ExpandVariables do
+RSpec.describe ExpandVariables, feature_category: :secrets_management do
shared_examples 'common variable expansion' do |expander|
using RSpec::Parameterized::TableSyntax
@@ -35,7 +35,14 @@ RSpec.describe ExpandVariables do
{ key: 'variable', value: 'value' }
]
},
- "simple expansions": {
+ "expansion using %": {
+ value: 'key%variable%',
+ result: 'keyvalue',
+ variables: [
+ { key: 'variable', value: 'value' }
+ ]
+ },
+ "multiple simple expansions": {
value: 'key$variable$variable2',
result: 'keyvalueresult',
variables: [
@@ -43,7 +50,7 @@ RSpec.describe ExpandVariables do
{ key: 'variable2', value: 'result' }
]
},
- "complex expansions": {
+ "multiple complex expansions": {
value: 'key${variable}${variable2}',
result: 'keyvalueresult',
variables: [
@@ -51,6 +58,15 @@ RSpec.describe ExpandVariables do
{ key: 'variable2', value: 'result' }
]
},
+ "nested expansion is not expanded": {
+ value: 'key$variable$variable2',
+ result: 'keyvalue$variable3',
+ variables: [
+ { key: 'variable', value: 'value' },
+ { key: 'variable2', value: '$variable3' },
+ { key: 'variable3', value: 'result' }
+ ]
+ },
"out-of-order expansion": {
value: 'key$variable2$variable',
result: 'keyresultvalue',
@@ -99,10 +115,86 @@ RSpec.describe ExpandVariables do
end
end
+ shared_examples 'file variable expansion with expand_file_refs true' do |expander|
+ using RSpec::Parameterized::TableSyntax
+
+ where do
+ {
+ "simple with a file variable": {
+ value: 'key$variable',
+ result: 'keyvalue',
+ variables: [
+ { key: 'variable', value: 'value', file: true }
+ ]
+ },
+ "complex expansion with a file variable": {
+ value: 'key${variable}',
+ result: 'keyvalue',
+ variables: [
+ { key: 'variable', value: 'value', file: true }
+ ]
+ },
+ "expansion using % with a file variable": {
+ value: 'key%variable%',
+ result: 'keyvalue',
+ variables: [
+ { key: 'variable', value: 'value', file: true }
+ ]
+ }
+ }
+ end
+
+ with_them do
+ subject { expander.call(value, variables, expand_file_refs: true) }
+
+ it { is_expected.to eq(result) }
+ end
+ end
+
+ shared_examples 'file variable expansion with expand_file_refs false' do |expander|
+ using RSpec::Parameterized::TableSyntax
+
+ where do
+ {
+ "simple with a file variable": {
+ value: 'key$variable',
+ result: 'key$variable',
+ variables: [
+ { key: 'variable', value: 'value', file: true }
+ ]
+ },
+ "complex expansion with a file variable": {
+ value: 'key${variable}',
+ result: 'key${variable}',
+ variables: [
+ { key: 'variable', value: 'value', file: true }
+ ]
+ },
+ "expansion using % with a file variable": {
+ value: 'key%variable%',
+ result: 'key%variable%',
+ variables: [
+ { key: 'variable', value: 'value', file: true }
+ ]
+ }
+ }
+ end
+
+ with_them do
+ subject { expander.call(value, variables, expand_file_refs: false) }
+
+ it { is_expected.to eq(result) }
+ end
+ end
+
describe '#expand' do
context 'table tests' do
it_behaves_like 'common variable expansion', described_class.method(:expand)
+ it_behaves_like 'file variable expansion with expand_file_refs true', described_class.method(:expand)
+
+ it_behaves_like 'file variable expansion with expand_file_refs false', described_class.method(:expand)
+
context 'with missing variables' do
using RSpec::Parameterized::TableSyntax
@@ -169,6 +261,10 @@ RSpec.describe ExpandVariables do
context 'table tests' do
it_behaves_like 'common variable expansion', described_class.method(:expand_existing)
+ it_behaves_like 'file variable expansion with expand_file_refs true', described_class.method(:expand_existing)
+
+ it_behaves_like 'file variable expansion with expand_file_refs false', described_class.method(:expand_existing)
+
context 'with missing variables' do
using RSpec::Parameterized::TableSyntax
diff --git a/spec/lib/extracts_ref/requested_ref_spec.rb b/spec/lib/extracts_ref/requested_ref_spec.rb
new file mode 100644
index 00000000000..80d3575b360
--- /dev/null
+++ b/spec/lib/extracts_ref/requested_ref_spec.rb
@@ -0,0 +1,153 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ExtractsRef::RequestedRef, feature_category: :source_code_management do
+ describe '#find' do
+ subject { described_class.new(project.repository, ref_type: ref_type, ref: ref).find }
+
+ let_it_be(:project) { create(:project, :repository) }
+ let(:ref_type) { nil }
+
+ # Create branches and tags consistently with the same shas to make comparison easier to follow
+ let(:tag_sha) { RepoHelpers.sample_commit.id }
+ let(:branch_sha) { RepoHelpers.another_sample_commit.id }
+
+ shared_context 'when a branch exists' do
+ before do
+ project.repository.create_branch(branch_name, branch_sha)
+ end
+
+ after do
+ project.repository.rm_branch(project.owner, branch_name)
+ end
+ end
+
+ shared_context 'when a tag exists' do
+ before do
+ project.repository.add_tag(project.owner, tag_name, tag_sha)
+ end
+
+ after do
+ project.repository.rm_tag(project.owner, tag_name)
+ end
+ end
+
+ shared_examples 'RequestedRef when ref_type is specified' do |branch_sha, tag_sha|
+ context 'when ref_type is heads' do
+ let(:ref_type) { 'heads' }
+
+ it 'returns the branch commit' do
+ expect(subject[:ref_type]).to eq('heads')
+ expect(subject[:commit].id).to eq(branch_sha)
+ end
+ end
+
+ context 'when ref_type is tags' do
+ let(:ref_type) { 'tags' }
+
+ it 'returns the tag commit' do
+ expect(subject[:ref_type]).to eq('tags')
+ expect(subject[:commit].id).to eq(tag_sha)
+ end
+ end
+ end
+
+ context 'when the ref is the sha for a commit' do
+ let(:ref) { branch_sha }
+
+ context 'and a tag and branch with that sha as a name' do
+ include_context 'when a branch exists' do
+ let(:branch_name) { ref }
+ end
+
+ include_context 'when a tag exists' do
+ let(:tag_name) { ref }
+ end
+
+ it_behaves_like 'RequestedRef when ref_type is specified',
+ RepoHelpers.another_sample_commit.id,
+ RepoHelpers.sample_commit.id
+
+ it 'returns the commit' do
+ expect(subject[:ref_type]).to be_nil
+ expect(subject[:commit].id).to eq(ref)
+ end
+ end
+ end
+
+ context 'when ref is for a tag' do
+ include_context 'when a tag exists' do
+ let(:tag_name) { SecureRandom.uuid }
+ end
+
+ let(:ref) { tag_name }
+
+ it 'returns the tag commit' do
+ expect(subject[:ref_type]).to eq('tags')
+ expect(subject[:commit].id).to eq(tag_sha)
+ end
+
+ context 'and there is a branch with the same name' do
+ include_context 'when a branch exists' do
+ let(:branch_name) { ref }
+ end
+
+ it_behaves_like 'RequestedRef when ref_type is specified',
+ RepoHelpers.another_sample_commit.id,
+ RepoHelpers.sample_commit.id
+
+ it 'returns the tag commit' do
+ expect(subject[:ref_type]).to eq('tags')
+ expect(subject[:commit].id).to eq(tag_sha)
+ expect(subject[:ambiguous]).to be_truthy
+ end
+ end
+ end
+
+ context 'when ref is only for a branch' do
+ let(:ref) { SecureRandom.uuid }
+
+ include_context 'when a branch exists' do
+ let(:branch_name) { ref }
+ end
+
+ it 'returns the branch commit' do
+ expect(subject[:ref_type]).to eq('heads')
+ expect(subject[:commit].id).to eq(branch_sha)
+ end
+ end
+
+ context 'when ref is an abbreviated commit sha' do
+ let(:ref) { branch_sha.first(8) }
+
+ it 'returns the commit' do
+ expect(subject[:ref_type]).to be_nil
+ expect(subject[:commit].id).to eq(branch_sha)
+ end
+ end
+
+ context 'when ref does not exist' do
+ let(:ref) { SecureRandom.uuid }
+
+ it 'returns the commit' do
+ expect(subject[:ref_type]).to be_nil
+ expect(subject[:commit]).to be_nil
+ end
+ end
+
+ context 'when ref is symbolic' do
+ let(:ref) { "heads/#{branch_name}" }
+
+ include_context 'when a branch exists' do
+ let(:branch_name) { SecureRandom.uuid }
+ end
+
+ it 'returns the commit' do
+ expect(subject[:ref_type]).to be_nil
+ expect(subject[:commit].id).to eq(branch_sha)
+ expect(subject[:ambiguous]).to be_truthy
+ end
+ end
+ end
+end
diff --git a/spec/lib/generators/batched_background_migration/batched_background_migration_generator_spec.rb b/spec/lib/generators/batched_background_migration/batched_background_migration_generator_spec.rb
index d533bcf0039..d60d0c3c853 100644
--- a/spec/lib/generators/batched_background_migration/batched_background_migration_generator_spec.rb
+++ b/spec/lib/generators/batched_background_migration/batched_background_migration_generator_spec.rb
@@ -20,15 +20,17 @@ RSpec.describe BatchedBackgroundMigration::BatchedBackgroundMigrationGenerator,
rm_rf(destination_root)
end
- context 'with valid arguments' do
- let(:expected_migration_file) { load_expected_file('queue_my_batched_migration.txt') }
- let(:expected_migration_spec_file) { load_expected_file('queue_my_batched_migration_spec.txt') }
- let(:expected_migration_job_file) { load_expected_file('my_batched_migration.txt') }
- let(:expected_migration_job_spec_file) { load_expected_file('my_batched_migration_spec_matcher.txt') }
- let(:expected_migration_dictionary) { load_expected_file('my_batched_migration_dictionary_matcher.txt') }
-
- it 'generates expected files' do
- run_generator %w[my_batched_migration --table_name=projects --column_name=id --feature_category=database]
+ shared_examples "generates files common to both types of migrations" do |migration_job_file, migration_file,
+ migration_spec_file, migration_dictionary_file|
+ let(:expected_migration_job_file) { load_expected_file(migration_job_file) }
+ let(:expected_migration_file) { load_expected_file(migration_file) }
+ let(:expected_migration_spec_file) { load_expected_file(migration_spec_file) }
+ let(:expected_migration_dictionary) { load_expected_file(migration_dictionary_file) }
+
+ it 'generates expected common files' do
+ assert_file('lib/gitlab/background_migration/my_batched_migration.rb') do |migration_job_file|
+ expect(migration_job_file).to eq(expected_migration_job_file)
+ end
assert_migration('db/post_migrate/queue_my_batched_migration.rb') do |migration_file|
expect(migration_file).to eq(expected_migration_file)
@@ -38,15 +40,6 @@ RSpec.describe BatchedBackgroundMigration::BatchedBackgroundMigrationGenerator,
expect(migration_spec_file).to eq(expected_migration_spec_file)
end
- assert_file('lib/gitlab/background_migration/my_batched_migration.rb') do |migration_job_file|
- expect(migration_job_file).to eq(expected_migration_job_file)
- end
-
- assert_file('spec/lib/gitlab/background_migration/my_batched_migration_spec.rb') do |migration_job_spec_file|
- # Regex is used to match the dynamic schema: <version> in the specs
- expect(migration_job_spec_file).to match(/#{expected_migration_job_spec_file}/)
- end
-
assert_file('db/docs/batched_background_migrations/my_batched_migration.yml') do |migration_dictionary|
# Regex is used to match the dynamically generated 'milestone' in the dictionary
expect(migration_dictionary).to match(/#{expected_migration_dictionary}/)
@@ -54,23 +47,50 @@ RSpec.describe BatchedBackgroundMigration::BatchedBackgroundMigrationGenerator,
end
end
- context 'without required arguments' do
- it 'throws table_name is required error' do
- expect do
- run_generator %w[my_batched_migration]
- end.to raise_error(ArgumentError, 'table_name is required')
+ context 'when generating EE-only batched background migration' do
+ before do
+ run_generator %w[my_batched_migration --table_name=projects --column_name=id --feature_category=database
+ --ee-only]
+ end
+
+ let(:expected_ee_migration_job_file) { load_expected_file('ee_my_batched_migration.txt') }
+ let(:expected_migration_job_spec_file) { load_expected_file('my_batched_migration_spec_matcher.txt') }
+
+ include_examples "generates files common to both types of migrations",
+ 'foss_my_batched_migration.txt',
+ 'queue_my_batched_migration.txt',
+ 'queue_my_batched_migration_spec.txt',
+ 'my_batched_migration_dictionary_matcher.txt'
+
+ it 'generates expected files' do
+ assert_file('ee/lib/ee/gitlab/background_migration/my_batched_migration.rb') do |migration_job_file|
+ expect(migration_job_file).to eq(expected_ee_migration_job_file)
+ end
+
+ assert_file('ee/spec/lib/ee/gitlab/background_migration/my_batched_migration_spec.rb') do |migration_job_spec_file| # rubocop:disable Layout/LineLength
+ expect(migration_job_spec_file).to match(/#{expected_migration_job_spec_file}/)
+ end
end
+ end
- it 'throws column_name is required error' do
- expect do
- run_generator %w[my_batched_migration --table_name=projects]
- end.to raise_error(ArgumentError, 'column_name is required')
+ context 'when generating FOSS batched background migration' do
+ before do
+ run_generator %w[my_batched_migration --table_name=projects --column_name=id --feature_category=database]
end
- it 'throws feature_category is required error' do
- expect do
- run_generator %w[my_batched_migration --table_name=projects --column_name=id]
- end.to raise_error(ArgumentError, 'feature_category is required')
+ let(:expected_migration_job_spec_file) { load_expected_file('my_batched_migration_spec_matcher.txt') }
+
+ include_examples "generates files common to both types of migrations",
+ 'my_batched_migration.txt',
+ 'queue_my_batched_migration.txt',
+ 'queue_my_batched_migration_spec.txt',
+ 'my_batched_migration_dictionary_matcher.txt'
+
+ it 'generates expected files' do
+ assert_file('spec/lib/gitlab/background_migration/my_batched_migration_spec.rb') do |migration_job_spec_file|
+ # Regex is used to match the dynamic schema: <version> in the specs
+ expect(migration_job_spec_file).to match(/#{expected_migration_job_spec_file}/)
+ end
end
end
diff --git a/spec/lib/generators/batched_background_migration/expected_files/ee_my_batched_migration.txt b/spec/lib/generators/batched_background_migration/expected_files/ee_my_batched_migration.txt
new file mode 100644
index 00000000000..004ae46ca5f
--- /dev/null
+++ b/spec/lib/generators/batched_background_migration/expected_files/ee_my_batched_migration.txt
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+# See https://docs.gitlab.com/ee/development/database/batched_background_migrations.html
+# for more information on how to use batched background migrations
+
+# Update below commented lines with appropriate values.
+
+module EE
+ module Gitlab
+ module BackgroundMigration
+ module MyBatchedMigration
+ extend ActiveSupport::Concern
+ extend ::Gitlab::Utils::Override
+
+ prepended do
+ # operation_name :my_operation
+ # scope_to ->(relation) { relation.where(column: "value") }
+ end
+
+ override :perform
+ def perform
+ each_sub_batch do |sub_batch|
+ # Your action on each sub_batch
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/generators/batched_background_migration/expected_files/foss_my_batched_migration.txt b/spec/lib/generators/batched_background_migration/expected_files/foss_my_batched_migration.txt
new file mode 100644
index 00000000000..7c2e1f4fc04
--- /dev/null
+++ b/spec/lib/generators/batched_background_migration/expected_files/foss_my_batched_migration.txt
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # TODO Add a top-level documentation comment for the class
+ class MyBatchedMigration < BatchedMigrationJob
+ feature_category :database
+
+ def perform; end
+ end
+ end
+end
+
+Gitlab::BackgroundMigration::MyBatchedMigration.prepend_mod
diff --git a/spec/lib/generators/gitlab/analytics/internal_events_generator_spec.rb b/spec/lib/generators/gitlab/analytics/internal_events_generator_spec.rb
index 517ba4d7699..d9acd59aa71 100644
--- a/spec/lib/generators/gitlab/analytics/internal_events_generator_spec.rb
+++ b/spec/lib/generators/gitlab/analytics/internal_events_generator_spec.rb
@@ -15,7 +15,7 @@ RSpec.describe Gitlab::Analytics::InternalEventsGenerator, :silence_stdout, feat
let(:section) { "analytics" }
let(:mr) { "https://gitlab.com/some-group/some-project/-/merge_requests/123" }
let(:event) { "view_analytics_dashboard" }
- let(:unique_on) { "user_id" }
+ let(:unique) { "user_id" }
let(:time_frames) { %w[7d] }
let(:include_default_identifiers) { 'yes' }
let(:options) do
@@ -27,11 +27,11 @@ RSpec.describe Gitlab::Analytics::InternalEventsGenerator, :silence_stdout, feat
stage: stage,
section: section,
event: event,
- unique_on: unique_on
+ unique: unique
}.stringify_keys
end
- let(:key_path_7d) { "count_distinct_#{unique_on}_from_#{event}_7d" }
+ let(:key_path_7d) { "count_distinct_#{unique}_from_#{event}_7d" }
let(:metric_definition_path_7d) { Dir.glob(File.join(temp_dir, "metrics/counts_7d/#{key_path_7d}.yml")).first }
let(:metric_definition_7d) do
{
@@ -46,7 +46,7 @@ RSpec.describe Gitlab::Analytics::InternalEventsGenerator, :silence_stdout, feat
"milestone" => "13.9",
"introduced_by_url" => mr,
"time_frame" => "7d",
- "data_source" => "redis_hll",
+ "data_source" => "internal_events",
"data_category" => "optional",
"instrumentation_class" => "RedisHLLMetric",
"distribution" => %w[ce ee],
@@ -195,6 +195,14 @@ RSpec.describe Gitlab::Analytics::InternalEventsGenerator, :silence_stdout, feat
end
end
+ context 'with unique value passed with a dot' do
+ it 'creates a metric definition file using the template' do
+ described_class.new([], options.merge(unique: 'user.id')).invoke_all
+
+ expect(YAML.safe_load(File.read(metric_definition_path_7d))).to eq(metric_definition_7d)
+ end
+ end
+
context 'without at least one tier available' do
it 'raises error' do
expect { described_class.new([], options.merge(tiers: [])).invoke_all }
@@ -211,8 +219,8 @@ RSpec.describe Gitlab::Analytics::InternalEventsGenerator, :silence_stdout, feat
context 'without obligatory parameter' do
it 'raises error', :aggregate_failures do
- %w[unique_on event mr section stage group].each do |option|
- expect { described_class.new([], options.without(option)).invoke_all }
+ %w[unique event mr section stage group].each do |option|
+ expect { described_class.new([], options.without(option)).invoke_all }
.to raise_error(RuntimeError)
end
end
@@ -241,7 +249,7 @@ RSpec.describe Gitlab::Analytics::InternalEventsGenerator, :silence_stdout, feat
context 'for multiple time frames' do
let(:time_frames) { %w[7d 28d] }
- let(:key_path_28d) { "count_distinct_#{unique_on}_from_#{event}_28d" }
+ let(:key_path_28d) { "count_distinct_#{unique}_from_#{event}_28d" }
let(:metric_definition_path_28d) { Dir.glob(File.join(temp_dir, "metrics/counts_28d/#{key_path_28d}.yml")).first }
let(:metric_definition_28d) do
metric_definition_7d.merge(
@@ -260,7 +268,7 @@ RSpec.describe Gitlab::Analytics::InternalEventsGenerator, :silence_stdout, feat
context 'with default time frames' do
let(:time_frames) { nil }
- let(:key_path_28d) { "count_distinct_#{unique_on}_from_#{event}_28d" }
+ let(:key_path_28d) { "count_distinct_#{unique}_from_#{event}_28d" }
let(:metric_definition_path_28d) { Dir.glob(File.join(temp_dir, "metrics/counts_28d/#{key_path_28d}.yml")).first }
let(:metric_definition_28d) do
metric_definition_7d.merge(
diff --git a/spec/lib/gitlab/access/branch_protection_spec.rb b/spec/lib/gitlab/access/branch_protection_spec.rb
index 5ab610dfc8f..e54ff8807b5 100644
--- a/spec/lib/gitlab/access/branch_protection_spec.rb
+++ b/spec/lib/gitlab/access/branch_protection_spec.rb
@@ -82,4 +82,62 @@ RSpec.describe Gitlab::Access::BranchProtection do
end
end
end
+
+ describe '#to_hash' do
+ context 'for allow_force_push' do
+ subject { described_class.new(level).to_hash[:allow_force_push] }
+
+ where(:level, :result) do
+ Gitlab::Access::PROTECTION_NONE | true
+ Gitlab::Access::PROTECTION_DEV_CAN_PUSH | false
+ Gitlab::Access::PROTECTION_DEV_CAN_MERGE | true
+ Gitlab::Access::PROTECTION_FULL | false
+ Gitlab::Access::PROTECTION_DEV_CAN_INITIAL_PUSH | true
+ end
+
+ with_them { it { is_expected.to eq(result) } }
+ end
+
+ context 'for allowed_to_push' do
+ subject { described_class.new(level).to_hash[:allowed_to_push] }
+
+ where(:level, :result) do
+ Gitlab::Access::PROTECTION_NONE | [{ 'access_level' => Gitlab::Access::DEVELOPER }]
+ Gitlab::Access::PROTECTION_DEV_CAN_PUSH | [{ 'access_level' => Gitlab::Access::DEVELOPER }]
+ Gitlab::Access::PROTECTION_DEV_CAN_MERGE | [{ 'access_level' => Gitlab::Access::MAINTAINER }]
+ Gitlab::Access::PROTECTION_FULL | [{ 'access_level' => Gitlab::Access::MAINTAINER }]
+ Gitlab::Access::PROTECTION_DEV_CAN_INITIAL_PUSH | [{ 'access_level' => Gitlab::Access::MAINTAINER }]
+ end
+
+ with_them { it { is_expected.to eq(result) } }
+ end
+
+ context 'for allowed_to_merge' do
+ subject { described_class.new(level).to_hash[:allowed_to_merge] }
+
+ where(:level, :result) do
+ Gitlab::Access::PROTECTION_NONE | [{ 'access_level' => Gitlab::Access::DEVELOPER }]
+ Gitlab::Access::PROTECTION_DEV_CAN_PUSH | [{ 'access_level' => Gitlab::Access::DEVELOPER }]
+ Gitlab::Access::PROTECTION_DEV_CAN_MERGE | [{ 'access_level' => Gitlab::Access::DEVELOPER }]
+ Gitlab::Access::PROTECTION_FULL | [{ 'access_level' => Gitlab::Access::MAINTAINER }]
+ Gitlab::Access::PROTECTION_DEV_CAN_INITIAL_PUSH | [{ 'access_level' => Gitlab::Access::DEVELOPER }]
+ end
+
+ with_them { it { is_expected.to eq(result) } }
+ end
+
+ context 'for developer_can_initial_push' do
+ subject { described_class.new(level).to_hash[:developer_can_initial_push] }
+
+ where(:level, :result) do
+ Gitlab::Access::PROTECTION_NONE | nil
+ Gitlab::Access::PROTECTION_DEV_CAN_PUSH | nil
+ Gitlab::Access::PROTECTION_DEV_CAN_MERGE | nil
+ Gitlab::Access::PROTECTION_FULL | nil
+ Gitlab::Access::PROTECTION_DEV_CAN_INITIAL_PUSH | true
+ end
+
+ with_them { it { is_expected.to eq(result) } }
+ end
+ end
end
diff --git a/spec/lib/gitlab/alert_management/payload/managed_prometheus_spec.rb b/spec/lib/gitlab/alert_management/payload/managed_prometheus_spec.rb
index fa8afd47c53..d7184c89933 100644
--- a/spec/lib/gitlab/alert_management/payload/managed_prometheus_spec.rb
+++ b/spec/lib/gitlab/alert_management/payload/managed_prometheus_spec.rb
@@ -150,20 +150,4 @@ RSpec.describe Gitlab::AlertManagement::Payload::ManagedPrometheus do
it { is_expected.to eq(environment) }
end
end
-
- describe '#metrics_dashboard_url' do
- subject { parsed_payload.metrics_dashboard_url }
-
- context 'without alert' do
- it { is_expected.to be_nil }
- end
-
- context 'with gitlab alert' do
- include_context 'gitlab-managed prometheus alert attributes' do
- let(:raw_payload) { payload }
- end
-
- it { is_expected.to eq(dashboard_url_for_alert) }
- end
- end
end
diff --git a/spec/lib/gitlab/alert_management/payload/prometheus_spec.rb b/spec/lib/gitlab/alert_management/payload/prometheus_spec.rb
index 8ead292c27a..92836915f7b 100644
--- a/spec/lib/gitlab/alert_management/payload/prometheus_spec.rb
+++ b/spec/lib/gitlab/alert_management/payload/prometheus_spec.rb
@@ -178,34 +178,6 @@ RSpec.describe Gitlab::AlertManagement::Payload::Prometheus do
end
end
- describe '#metrics_dashboard_url' do
- include_context 'self-managed prometheus alert attributes' do
- let(:raw_payload) { payload }
- end
-
- subject { parsed_payload.metrics_dashboard_url }
-
- it { is_expected.to eq(dashboard_url_for_alert) }
-
- context 'without environment' do
- let(:raw_payload) { payload.except('labels') }
-
- it { is_expected.to be_nil }
- end
-
- context 'without full query' do
- let(:raw_payload) { payload.except('generatorURL') }
-
- it { is_expected.to be_nil }
- end
-
- context 'without title' do
- let(:raw_payload) { payload.except('annotations') }
-
- it { is_expected.to be_nil }
- end
- end
-
describe '#has_required_attributes?' do
let(:starts_at) { Time.current.change(usec: 0).utc }
let(:raw_payload) { { 'annotations' => { 'title' => 'title' }, 'startsAt' => starts_at.rfc3339 } }
diff --git a/spec/lib/gitlab/asciidoc/html5_converter_spec.rb b/spec/lib/gitlab/asciidoc/html5_converter_spec.rb
index de1b3e2af71..26495ab4bc6 100644
--- a/spec/lib/gitlab/asciidoc/html5_converter_spec.rb
+++ b/spec/lib/gitlab/asciidoc/html5_converter_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe Gitlab::Asciidoc::Html5Converter do
it 'appends user-content- prefix on ref (anchor)' do
doc = Asciidoctor::Document.new('')
anchor = Asciidoctor::Inline.new(doc, :anchor, '', type: :ref, id: 'cross-references')
- converter = Gitlab::Asciidoc::Html5Converter.new('gitlab_html5')
+ converter = described_class.new('gitlab_html5')
html = converter.convert_inline_anchor(anchor)
expect(html).to eq('<a id="user-content-cross-references"></a>')
end
diff --git a/spec/lib/gitlab/auth/auth_finders_spec.rb b/spec/lib/gitlab/auth/auth_finders_spec.rb
index 4498e369695..1a1e165c50a 100644
--- a/spec/lib/gitlab/auth/auth_finders_spec.rb
+++ b/spec/lib/gitlab/auth/auth_finders_spec.rb
@@ -181,7 +181,7 @@ RSpec.describe Gitlab::Auth::AuthFinders, feature_category: :system_access do
set_header('HTTP_ACCEPT', 'application/atom+xml')
end
- context 'when feed_token param is provided' do
+ context 'when old format feed_token param is provided' do
it 'returns user if valid feed_token' do
set_param(:feed_token, user.feed_token)
@@ -206,7 +206,44 @@ RSpec.describe Gitlab::Auth::AuthFinders, feature_category: :system_access do
end
end
- context 'when rss_token param is provided' do
+ context 'when path-dependent format feed_token param is provided' do
+ let_it_be(:feed_user, freeze: true) { create(:user, feed_token: 'KNOWN VALUE').tap(&:feed_token) }
+ # The middle part is the output of OpenSSL::HMAC.hexdigest("SHA256", 'KNOWN VALUE', 'url.atom')
+ let(:feed_token) { "glft-a8cc74ccb0de004d09a968705ba49099229b288b3de43f26c473a9d8d7fb7693-#{feed_user.id}" }
+
+ it 'returns user if valid feed_token' do
+ set_param(:feed_token, feed_token)
+
+ expect(find_user_from_feed_token(:rss)).to eq feed_user
+ end
+
+ it 'returns nil if valid feed_token and disabled' do
+ allow(Gitlab::CurrentSettings).to receive_messages(disable_feed_token: true)
+ set_param(:feed_token, feed_token)
+
+ expect(find_user_from_feed_token(:rss)).to be_nil
+ end
+
+ it 'returns exception if token has same HMAC but different user ID' do
+ set_param(:feed_token, "glft-a8cc74ccb0de004d09a968705ba49099229b288b3de43f26c473a9d8d7fb7693-#{user.id}")
+
+ expect { find_user_from_feed_token(:rss) }.to raise_error(Gitlab::Auth::UnauthorizedError)
+ end
+
+ it 'returns exception if token has wrong HMAC but same user ID' do
+ set_param(:feed_token, "glft-aaaaaaaaaade004d09a968705ba49099229b288b3de43f26c473a9d8d7fb7693-#{feed_user.id}")
+
+ expect { find_user_from_feed_token(:rss) }.to raise_error(Gitlab::Auth::UnauthorizedError)
+ end
+
+ it 'returns exception if user does not exist' do
+ set_param(:feed_token, "glft-a8cc74ccb0de004d09a968705ba49099229b288b3de43f26c473a9d8d7fb7693-#{non_existing_record_id}")
+
+ expect { find_user_from_feed_token(:rss) }.to raise_error(Gitlab::Auth::UnauthorizedError)
+ end
+ end
+
+ context 'when old format rss_token param is provided' do
it 'returns user if valid rss_token' do
set_param(:rss_token, user.feed_token)
@@ -468,6 +505,40 @@ RSpec.describe Gitlab::Auth::AuthFinders, feature_category: :system_access do
end
end
end
+
+ context 'automatic reuse detection' do
+ let(:token_3) { create(:personal_access_token, :revoked) }
+ let(:token_2) { create(:personal_access_token, :revoked, previous_personal_access_token_id: token_3.id) }
+ let(:token_1) { create(:personal_access_token, previous_personal_access_token_id: token_2.id) }
+
+ context 'when a revoked token is used' do
+ before do
+ set_bearer_token(token_3.token)
+ end
+
+ it 'revokes the latest rotated token' do
+ expect(token_1).not_to be_revoked
+
+ expect { find_user_from_access_token }.to raise_error(Gitlab::Auth::RevokedError)
+
+ expect(token_1.reload).to be_revoked
+ end
+
+ context 'when the feature flag is disabled' do
+ before do
+ stub_feature_flags(pat_reuse_detection: false)
+ end
+
+ it 'does not revoke the latest rotated token' do
+ expect(token_1).not_to be_revoked
+
+ expect { find_user_from_access_token }.to raise_error(Gitlab::Auth::RevokedError)
+
+ expect(token_1.reload).not_to be_revoked
+ end
+ end
+ end
+ end
end
describe '#find_user_from_web_access_token' do
diff --git a/spec/lib/gitlab/auth_spec.rb b/spec/lib/gitlab/auth_spec.rb
index b864dba58de..c4fa8513618 100644
--- a/spec/lib/gitlab/auth_spec.rb
+++ b/spec/lib/gitlab/auth_spec.rb
@@ -10,7 +10,7 @@ RSpec.describe Gitlab::Auth, :use_clean_rails_memory_store_caching, feature_cate
describe 'constants' do
it 'API_SCOPES contains all scopes for API access' do
- expect(subject::API_SCOPES).to match_array %i[api read_user read_api]
+ expect(subject::API_SCOPES).to match_array %i[api read_user read_api create_runner]
end
it 'ADMIN_SCOPES contains all scopes for ADMIN access' do
@@ -40,29 +40,29 @@ RSpec.describe Gitlab::Auth, :use_clean_rails_memory_store_caching, feature_cate
end
it 'contains all non-default scopes' do
- expect(subject.all_available_scopes).to match_array %i[api read_user read_api read_repository write_repository read_registry write_registry sudo admin_mode read_observability write_observability]
+ expect(subject.all_available_scopes).to match_array %i[api read_user read_api read_repository write_repository read_registry write_registry sudo admin_mode read_observability write_observability create_runner]
end
it 'contains for non-admin user all non-default scopes without ADMIN access and without observability scopes' do
user = build_stubbed(:user, admin: false)
- expect(subject.available_scopes_for(user)).to match_array %i[api read_user read_api read_repository write_repository read_registry write_registry]
+ expect(subject.available_scopes_for(user)).to match_array %i[api read_user read_api read_repository write_repository read_registry write_registry create_runner]
end
it 'contains for admin user all non-default scopes with ADMIN access and without observability scopes' do
user = build_stubbed(:user, admin: true)
- expect(subject.available_scopes_for(user)).to match_array %i[api read_user read_api read_repository write_repository read_registry write_registry sudo admin_mode]
+ expect(subject.available_scopes_for(user)).to match_array %i[api read_user read_api read_repository write_repository read_registry write_registry sudo admin_mode create_runner]
end
it 'contains for project all resource bot scopes without observability scopes' do
- expect(subject.available_scopes_for(project)).to match_array %i[api read_api read_repository write_repository read_registry write_registry]
+ expect(subject.available_scopes_for(project)).to match_array %i[api read_api read_repository write_repository read_registry write_registry create_runner]
end
it 'contains for group all resource bot scopes' do
group = build_stubbed(:group)
- expect(subject.available_scopes_for(group)).to match_array %i[api read_api read_repository write_repository read_registry write_registry read_observability write_observability]
+ expect(subject.available_scopes_for(group)).to match_array %i[api read_api read_repository write_repository read_registry write_registry read_observability write_observability create_runner]
end
it 'contains for unsupported type no scopes' do
@@ -70,7 +70,7 @@ RSpec.describe Gitlab::Auth, :use_clean_rails_memory_store_caching, feature_cate
end
it 'optional_scopes contains all non-default scopes' do
- expect(subject.optional_scopes).to match_array %i[read_user read_api read_repository write_repository read_registry write_registry sudo admin_mode openid profile email read_observability write_observability]
+ expect(subject.optional_scopes).to match_array %i[read_user read_api read_repository write_repository read_registry write_registry sudo admin_mode openid profile email read_observability write_observability create_runner]
end
context 'with observability_group_tab feature flag' do
@@ -82,7 +82,7 @@ RSpec.describe Gitlab::Auth, :use_clean_rails_memory_store_caching, feature_cate
it 'contains for group all resource bot scopes without observability scopes' do
group = build_stubbed(:group)
- expect(subject.available_scopes_for(group)).to match_array %i[api read_api read_repository write_repository read_registry write_registry]
+ expect(subject.available_scopes_for(group)).to match_array %i[api read_api read_repository write_repository read_registry write_registry create_runner]
end
end
@@ -94,23 +94,23 @@ RSpec.describe Gitlab::Auth, :use_clean_rails_memory_store_caching, feature_cate
end
it 'contains for other group all resource bot scopes including observability scopes' do
- expect(subject.available_scopes_for(group)).to match_array %i[api read_api read_repository write_repository read_registry write_registry read_observability write_observability]
+ expect(subject.available_scopes_for(group)).to match_array %i[api read_api read_repository write_repository read_registry write_registry read_observability write_observability create_runner]
end
it 'contains for admin user all non-default scopes with ADMIN access and without observability scopes' do
user = build_stubbed(:user, admin: true)
- expect(subject.available_scopes_for(user)).to match_array %i[api read_user read_api read_repository write_repository read_registry write_registry sudo admin_mode]
+ expect(subject.available_scopes_for(user)).to match_array %i[api read_user read_api read_repository write_repository read_registry write_registry sudo admin_mode create_runner]
end
it 'contains for project all resource bot scopes without observability scopes' do
- expect(subject.available_scopes_for(project)).to match_array %i[api read_api read_repository write_repository read_registry write_registry]
+ expect(subject.available_scopes_for(project)).to match_array %i[api read_api read_repository write_repository read_registry write_registry create_runner]
end
it 'contains for other group all resource bot scopes without observability scopes' do
other_group = build_stubbed(:group)
- expect(subject.available_scopes_for(other_group)).to match_array %i[api read_api read_repository write_repository read_registry write_registry]
+ expect(subject.available_scopes_for(other_group)).to match_array %i[api read_api read_repository write_repository read_registry write_registry create_runner]
end
end
end
@@ -242,6 +242,20 @@ RSpec.describe Gitlab::Auth, :use_clean_rails_memory_store_caching, feature_cate
expect(subject).to have_attributes(actor: build.user, project: build.project, type: :build, authentication_abilities: described_class.build_authentication_abilities)
end
+ it 'recognises project level security_policy_bot access token' do
+ build.update!(user: create(:user, :security_policy_bot))
+ project.add_guest(build.user)
+
+ expect(subject).to have_attributes(actor: build.user, project: build.project, type: :build, authentication_abilities: described_class.build_authentication_abilities)
+ end
+
+ it 'recognises group level security_policy_bot access token' do
+ build.update!(user: create(:user, :security_policy_bot))
+ group.add_guest(build.user)
+
+ expect(subject).to have_attributes(actor: build.user, project: build.project, type: :build, authentication_abilities: described_class.build_authentication_abilities)
+ end
+
it 'fails with blocked user token' do
build.update!(user: create(:user, :blocked))
@@ -351,6 +365,7 @@ RSpec.describe Gitlab::Auth, :use_clean_rails_memory_store_caching, feature_cate
'read_api' | described_class.read_only_authentication_abilities
'read_repository' | [:download_code]
'write_repository' | [:download_code, :push_code]
+ 'create_runner' | [:create_instance_runner, :create_runner]
'read_user' | []
'sudo' | []
'openid' | []
@@ -412,6 +427,12 @@ RSpec.describe Gitlab::Auth, :use_clean_rails_memory_store_caching, feature_cate
expect_results_with_abilities(personal_access_token, [:download_code, :push_code])
end
+ it 'succeeds for personal access tokens with the `create_runner` scope' do
+ personal_access_token = create(:personal_access_token, scopes: ['create_runner'])
+
+ expect_results_with_abilities(personal_access_token, [:create_instance_runner, :create_runner])
+ end
+
context 'when registry is enabled' do
before do
stub_container_registry_config(enabled: true)
diff --git a/spec/lib/gitlab/background_migration/backfill_missing_ci_cd_settings_spec.rb b/spec/lib/gitlab/background_migration/backfill_missing_ci_cd_settings_spec.rb
new file mode 100644
index 00000000000..8f7d5f25a80
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/backfill_missing_ci_cd_settings_spec.rb
@@ -0,0 +1,98 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::BackfillMissingCiCdSettings, schema: 20230628023103, feature_category: :source_code_management do # rubocop:disable Layout/LineLength
+ let(:projects_table) { table(:projects) }
+ let(:namespaces_table) { table(:namespaces) }
+ let(:ci_cd_settings_table) { table(:project_ci_cd_settings) }
+
+ let(:namespace_1) { namespaces_table.create!(name: 'namespace', path: 'namespace-path-1') }
+
+ let(:project_namespace_2) { namespaces_table.create!(name: 'namespace', path: 'namespace-path-2', type: 'Project') }
+ let(:project_namespace_3) { namespaces_table.create!(name: 'namespace', path: 'namespace-path-3', type: 'Project') }
+ let(:project_namespace_4) { namespaces_table.create!(name: 'namespace', path: 'namespace-path-4', type: 'Project') }
+ let(:project_namespace_5) { namespaces_table.create!(name: 'namespace', path: 'namespace-path-4', type: 'Project') }
+ let!(:project_1) do
+ projects_table
+ .create!(
+ name: 'project1',
+ path: 'path1',
+ namespace_id: namespace_1.id,
+ project_namespace_id: project_namespace_2.id,
+ visibility_level: 0
+ )
+ end
+
+ let!(:project_2) do
+ projects_table
+ .create!(
+ name: 'project2',
+ path: 'path2',
+ namespace_id: namespace_1.id,
+ project_namespace_id: project_namespace_3.id,
+ visibility_level: 0
+ )
+ end
+
+ let!(:project_3) do
+ projects_table
+ .create!(
+ name: 'project3',
+ path: 'path3',
+ namespace_id: namespace_1.id,
+ project_namespace_id: project_namespace_4.id,
+ visibility_level: 0
+ )
+ end
+
+ let!(:ci_cd_settings_3) do
+ ci_cd_settings_table.create!(project_id: project_3.id)
+ end
+
+ let!(:project_4) do
+ projects_table
+ .create!(
+ name: 'project4',
+ path: 'path4',
+ namespace_id: namespace_1.id,
+ project_namespace_id: project_namespace_5.id,
+ visibility_level: 0
+ )
+ end
+
+ subject(:perform_migration) do
+ described_class.new(start_id: projects_table.minimum(:id),
+ end_id: projects_table.maximum(:id),
+ batch_table: :projects,
+ batch_column: :id,
+ sub_batch_size: 2,
+ pause_ms: 0,
+ connection: projects_table.connection)
+ .perform
+ end
+
+ it 'creates ci_cd_settings for projects without ci_cd_settings' do
+ expect { subject }.to change { ci_cd_settings_table.count }.from(1).to(4)
+ end
+
+ it 'creates ci_cd_settings with default values' do
+ ci_cd_settings_table.where.not(project_id: ci_cd_settings_3.project_id).each do |ci_cd_setting|
+ expect(ci_cd_setting.attributes.except('id', 'project_id')).to eq({
+ "group_runners_enabled" => true,
+ "merge_pipelines_enabled" => nil,
+ "default_git_depth" => 20,
+ "forward_deployment_enabled" => true,
+ "merge_trains_enabled" => false,
+ "auto_rollback_enabled" => false,
+ "keep_latest_artifact" => false,
+ "restrict_user_defined_variables" => false,
+ "job_token_scope_enabled" => false,
+ "runner_token_expiration_interval" => nil,
+ "separated_caches" => true,
+ "allow_fork_pipelines_to_run_in_parent_project" => true,
+ "inbound_job_token_scope_enabled" => true
+ })
+ end
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/backfill_uuid_conversion_column_in_vulnerability_occurrences_spec.rb b/spec/lib/gitlab/background_migration/backfill_uuid_conversion_column_in_vulnerability_occurrences_spec.rb
new file mode 100644
index 00000000000..699fa39c309
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/backfill_uuid_conversion_column_in_vulnerability_occurrences_spec.rb
@@ -0,0 +1,133 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::BackfillUuidConversionColumnInVulnerabilityOccurrences, schema: 20230629095819, feature_category: :vulnerability_management do # rubocop:disable Layout/LineLength
+ let(:namespaces) { table(:namespaces) }
+ let(:projects) { table(:projects) }
+ let(:users) { table(:users) }
+ let(:members) { table(:members) }
+ let(:vulnerability_identifiers) { table(:vulnerability_identifiers) }
+ let(:vulnerability_scanners) { table(:vulnerability_scanners) }
+ let(:vulnerability_findings) { table(:vulnerability_occurrences) }
+ let!(:user) { create_user(email: "test1@example.com", username: "test1") }
+ let!(:namespace) { namespaces.create!(name: "test-1", path: "test-1", owner_id: user.id) }
+ let!(:project) do
+ projects.create!(
+ id: 9999, namespace_id: namespace.id,
+ project_namespace_id: namespace.id,
+ creator_id: user.id
+ )
+ end
+
+ let!(:membership) do
+ members.create!(access_level: 50, source_id: project.id, source_type: "Project", user_id: user.id, state: 0,
+ notification_level: 3, type: "ProjectMember", member_namespace_id: namespace.id)
+ end
+
+ let(:scanner) { create_scanner(project) }
+ let(:null_uuid) { '00000000-0000-0000-0000-000000000000' }
+
+ let(:migration_attrs) do
+ {
+ start_id: finding_with_no_converted_uuid_1.id,
+ end_id: finding_with_converted_uuid.id,
+ batch_table: :vulnerability_occurrences,
+ batch_column: :id,
+ sub_batch_size: 100,
+ pause_ms: 0,
+ connection: ApplicationRecord.connection
+ }
+ end
+
+ describe "#perform" do
+ subject(:background_migration) { described_class.new(**migration_attrs).perform }
+
+ before do
+ # We have to disable it in tests because it's triggered BEFORE INSERT OR UPDATE ON vulnerability_occurrences
+ # so it's hard to create or update the uuid_convert_string_to_uuid with null UUID value
+
+ # In reality the UPDATE query in the batched background migration could be SET id = id which would
+ # trigger UUID update trigger but we can't exactly do that and expect readable tests
+ ApplicationRecord.connection.execute("ALTER TABLE vulnerability_occurrences DISABLE TRIGGER trigger_1a857e8db6cd")
+ end
+
+ let(:finding_with_no_converted_uuid_1) do
+ create_finding(project, scanner, uuid_convert_string_to_uuid: null_uuid)
+ end
+
+ let(:finding_with_converted_uuid) do
+ uuid = SecureRandom.uuid
+ create_finding(project, scanner, uuid: uuid, uuid_convert_string_to_uuid: uuid)
+ end
+
+ after do
+ ApplicationRecord.connection.execute("ALTER TABLE vulnerability_occurrences ENABLE TRIGGER trigger_1a857e8db6cd")
+ end
+
+ it "backfills the uuid_convert_string_to_uuid column" do
+ expect { background_migration }.to change { finding_with_no_converted_uuid_1.reload.uuid_convert_string_to_uuid }
+ .from(null_uuid).to(finding_with_no_converted_uuid_1.uuid)
+ end
+
+ it "doesn't change the UUID for exisiting records" do
+ expect { background_migration }.not_to change { finding_with_converted_uuid.uuid_convert_string_to_uuid }
+ end
+ end
+
+ private
+
+ def create_scanner(project, overrides = {})
+ attrs = {
+ project_id: project.id,
+ external_id: "test_vulnerability_scanner",
+ name: "Test Vulnerabilities::Scanner"
+ }.merge(overrides)
+
+ vulnerability_scanners.create!(attrs)
+ end
+
+ def create_identifier(project, overrides = {})
+ attrs = {
+ project_id: project.id,
+ external_id: "CVE-2018-1234",
+ external_type: "CVE",
+ name: "CVE-2018-1234",
+ fingerprint: SecureRandom.hex(20)
+ }.merge(overrides)
+
+ vulnerability_identifiers.create!(attrs)
+ end
+
+ def create_finding(project, scanner, overrides = {})
+ attrs = {
+ project_id: project.id,
+ scanner_id: scanner.id,
+ severity: 5, # medium
+ confidence: 2, # unknown,
+ report_type: 99, # generic
+ primary_identifier_id: create_identifier(project).id,
+ project_fingerprint: SecureRandom.hex(20),
+ location_fingerprint: SecureRandom.hex(20),
+ uuid: SecureRandom.uuid,
+ name: "CVE-2018-1234",
+ raw_metadata: "{}",
+ metadata_version: "test:1.0"
+ }.merge(overrides)
+
+ vulnerability_findings.create!(attrs)
+ end
+
+ def create_user(overrides = {})
+ attrs = {
+ email: "test@example.com",
+ notification_email: "test@example.com",
+ name: "test",
+ username: "test",
+ state: "active",
+ projects_limit: 10
+ }.merge(overrides)
+
+ users.create!(attrs)
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy_spec.rb b/spec/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy_spec.rb
index 37fdd209622..6201e2c0fcc 100644
--- a/spec/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy_spec.rb
+++ b/spec/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy_spec.rb
@@ -2,7 +2,8 @@
require 'spec_helper'
-RSpec.describe Gitlab::BackgroundMigration::BatchingStrategies::PrimaryKeyBatchingStrategy, '#next_batch' do
+RSpec.describe Gitlab::BackgroundMigration::BatchingStrategies::PrimaryKeyBatchingStrategy,
+ '#next_batch', feature_category: :database do
let(:batching_strategy) { described_class.new(connection: ActiveRecord::Base.connection) }
let(:namespaces) { table(:namespaces) }
@@ -64,7 +65,7 @@ RSpec.describe Gitlab::BackgroundMigration::BatchingStrategies::PrimaryKeyBatchi
context 'when scope has a join which makes the column name ambiguous' do
let(:job_class) do
Class.new(Gitlab::BackgroundMigration::BatchedMigrationJob) do
- scope_to ->(r) { r.joins('LEFT JOIN users ON users.id = namespaces.owner_id') }
+ scope_to ->(r) { r.joins('LEFT JOIN namespaces as parents ON parents.id = namespaces.parent_id') }
end
end
diff --git a/spec/lib/gitlab/background_migration/legacy_upload_mover_spec.rb b/spec/lib/gitlab/background_migration/legacy_upload_mover_spec.rb
index c522c8b307f..71e9a568370 100644
--- a/spec/lib/gitlab/background_migration/legacy_upload_mover_spec.rb
+++ b/spec/lib/gitlab/background_migration/legacy_upload_mover_spec.rb
@@ -139,7 +139,7 @@ RSpec.describe Gitlab::BackgroundMigration::LegacyUploadMover, :aggregate_failur
end
context 'when an upload belongs to a legacy_diff_note' do
- let!(:merge_request) { create(:merge_request, source_project: project) }
+ let!(:merge_request) { create(:merge_request, :skip_diff_creation, source_project: project) }
let!(:note) do
create(:legacy_diff_note_on_merge_request,
diff --git a/spec/lib/gitlab/background_migration/redis/backfill_project_pipeline_status_ttl_spec.rb b/spec/lib/gitlab/background_migration/redis/backfill_project_pipeline_status_ttl_spec.rb
new file mode 100644
index 00000000000..e3b1b67cb40
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/redis/backfill_project_pipeline_status_ttl_spec.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::Redis::BackfillProjectPipelineStatusTtl,
+ :clean_gitlab_redis_cache, feature_category: :redis do
+ let(:redis) { ::Redis.new(::Gitlab::Redis::Cache.params) }
+ let(:keys) { ["cache:gitlab:project:1:pipeline_status", "cache:gitlab:project:2:pipeline_status"] }
+ let(:invalid_keys) { ["cache:gitlab:project:pipeline_status:1", "cache:gitlab:project:pipeline_status:2"] }
+
+ subject { described_class.new }
+
+ before do
+ (keys + invalid_keys).each { |key| redis.set(key, 1) }
+ end
+
+ describe '#perform' do
+ it 'sets a ttl on given keys' do
+ subject.perform(keys)
+
+ keys.each do |k|
+ expect(redis.ttl(k)).to be > 0
+ end
+ end
+ end
+
+ describe '#scan_match_pattern' do
+ it "finds all the required keys only" do
+ expect(redis.scan('0').second).to match_array(keys + invalid_keys)
+ expect(subject.redis.scan_each(match: subject.scan_match_pattern).to_a).to contain_exactly(*keys)
+ end
+ end
+
+ describe '#redis' do
+ it { expect(subject.redis.inspect).to eq(redis.inspect) }
+ end
+end
diff --git a/spec/lib/gitlab/buffered_io_spec.rb b/spec/lib/gitlab/buffered_io_spec.rb
index c6939b819e2..0ec377550c1 100644
--- a/spec/lib/gitlab/buffered_io_spec.rb
+++ b/spec/lib/gitlab/buffered_io_spec.rb
@@ -12,7 +12,7 @@ RSpec.describe Gitlab::BufferedIo do
end
subject(:readuntil) do
- Gitlab::BufferedIo.new(mock_io).readuntil('a', false, start_time)
+ described_class.new(mock_io).readuntil('a', false, start_time)
end
it 'does not raise a timeout error' do
@@ -38,7 +38,7 @@ RSpec.describe Gitlab::BufferedIo do
context 'when not passing start_time' do
subject(:readuntil) do
- Gitlab::BufferedIo.new(mock_io).readuntil('a', false)
+ described_class.new(mock_io).readuntil('a', false)
end
it 'raises a timeout error' do
diff --git a/spec/lib/gitlab/cache/ci/project_pipeline_status_spec.rb b/spec/lib/gitlab/cache/ci/project_pipeline_status_spec.rb
index ec0bda3c300..754614bffdb 100644
--- a/spec/lib/gitlab/cache/ci/project_pipeline_status_spec.rb
+++ b/spec/lib/gitlab/cache/ci/project_pipeline_status_spec.rb
@@ -188,9 +188,11 @@ RSpec.describe Gitlab::Cache::Ci::ProjectPipelineStatus, :clean_gitlab_redis_cac
pipeline_status.store_in_cache
read_sha, read_status = Gitlab::Redis::Cache.with { |redis| redis.hmget(cache_key, :sha, :status) }
+ ttl = Gitlab::Redis::Cache.with { |redis| redis.ttl(cache_key) }
expect(read_sha).to eq('123456')
expect(read_status).to eq('failed')
+ expect(ttl).to be > 0
end
end
@@ -254,14 +256,24 @@ RSpec.describe Gitlab::Cache::Ci::ProjectPipelineStatus, :clean_gitlab_redis_cac
end
describe '#load_from_cache' do
+ subject { pipeline_status.load_from_cache }
+
it 'reads the status from redis_cache' do
- pipeline_status.load_from_cache
+ subject
expect(pipeline_status.sha).to eq(sha)
expect(pipeline_status.status).to eq(status)
expect(pipeline_status.ref).to eq(ref)
end
+ it 'refreshes ttl' do
+ subject
+
+ ttl = Gitlab::Redis::Cache.with { |redis| redis.ttl(cache_key) }
+
+ expect(ttl).to be > 0
+ end
+
context 'when status is empty string' do
before do
Gitlab::Redis::Cache.with do |redis|
@@ -271,7 +283,7 @@ RSpec.describe Gitlab::Cache::Ci::ProjectPipelineStatus, :clean_gitlab_redis_cac
end
it 'reads the status as nil' do
- pipeline_status.load_from_cache
+ subject
expect(pipeline_status.status).to eq(nil)
end
diff --git a/spec/lib/gitlab/cache/client_spec.rb b/spec/lib/gitlab/cache/client_spec.rb
index 638fed1a905..6543381b86a 100644
--- a/spec/lib/gitlab/cache/client_spec.rb
+++ b/spec/lib/gitlab/cache/client_spec.rb
@@ -3,52 +3,32 @@
require 'spec_helper'
RSpec.describe Gitlab::Cache::Client, feature_category: :source_code_management do
- subject(:client) { described_class.new(metadata, backend: backend) }
+ subject(:client) { described_class.new(metrics, backend: backend) }
+ let(:metrics) { Gitlab::Cache::Metrics.new(metadata) }
let(:backend) { Rails.cache }
- let(:metadata) do
- Gitlab::Cache::Metadata.new(
- cache_identifier: cache_identifier,
- feature_category: feature_category,
- backing_resource: backing_resource
- )
- end
let(:cache_identifier) { 'MyClass#cache' }
let(:feature_category) { :source_code_management }
let(:backing_resource) { :cpu }
- let(:metadata_mock) do
+ let(:metadata) do
Gitlab::Cache::Metadata.new(
cache_identifier: cache_identifier,
- feature_category: feature_category
+ feature_category: feature_category,
+ backing_resource: backing_resource
)
end
- let(:metrics_mock) { Gitlab::Cache::Metrics.new(metadata_mock) }
-
- describe '.build_with_metadata' do
- it 'builds a cache client with metrics support' do
- attributes = {
- cache_identifier: cache_identifier,
- feature_category: feature_category,
- backing_resource: backing_resource
- }
-
- instance = described_class.build_with_metadata(**attributes)
-
- expect(instance).to be_a(described_class)
- expect(instance.metadata).to have_attributes(**attributes)
- end
+ let(:labels) do
+ {
+ feature_category: :audit_events
+ }
end
describe 'Methods', :use_clean_rails_memory_store_caching do
let(:expected_key) { 'key' }
- before do
- allow(Gitlab::Cache::Metrics).to receive(:new).and_return(metrics_mock)
- end
-
describe '#read' do
context 'when key does not exist' do
it 'returns nil' do
@@ -56,9 +36,9 @@ RSpec.describe Gitlab::Cache::Client, feature_category: :source_code_management
end
it 'increments cache miss' do
- expect(metrics_mock).to receive(:increment_cache_miss)
+ expect(metrics).to receive(:increment_cache_miss).with(labels).and_call_original
- client.read('key')
+ expect(client.read('key', nil, labels)).to be_nil
end
end
@@ -72,9 +52,9 @@ RSpec.describe Gitlab::Cache::Client, feature_category: :source_code_management
end
it 'increments cache hit' do
- expect(metrics_mock).to receive(:increment_cache_hit)
+ expect(metrics).to receive(:increment_cache_hit).with(labels)
- client.read('key')
+ expect(client.read('key', nil, labels)).to eq('value')
end
end
end
@@ -125,13 +105,13 @@ RSpec.describe Gitlab::Cache::Client, feature_category: :source_code_management
end
it 'increments a cache hit' do
- expect(metrics_mock).to receive(:increment_cache_hit)
+ expect(metrics).to receive(:increment_cache_hit).with(labels)
- client.fetch('key')
+ expect(client.fetch('key', nil, labels)).to eq('value')
end
it 'does not measure the cache generation time' do
- expect(metrics_mock).not_to receive(:observe_cache_generation)
+ expect(metrics).not_to receive(:observe_cache_generation)
client.fetch('key') { 'new-value' }
end
@@ -145,15 +125,15 @@ RSpec.describe Gitlab::Cache::Client, feature_category: :source_code_management
end
it 'increments a cache miss' do
- expect(metrics_mock).to receive(:increment_cache_miss)
+ expect(metrics).to receive(:increment_cache_miss).with(labels)
- client.fetch('key')
+ expect(client.fetch('key', nil, labels) { 'value' }).to eq('value')
end
it 'measures the cache generation time' do
- expect(metrics_mock).to receive(:observe_cache_generation)
+ expect(metrics).to receive(:observe_cache_generation).with(labels).and_call_original
- client.fetch('key') { 'value' }
+ expect(client.fetch('key', nil, labels) { 'value' }).to eq('value')
end
end
end
diff --git a/spec/lib/gitlab/cache/metadata_spec.rb b/spec/lib/gitlab/cache/metadata_spec.rb
index d2b79fb8b08..82005915c22 100644
--- a/spec/lib/gitlab/cache/metadata_spec.rb
+++ b/spec/lib/gitlab/cache/metadata_spec.rb
@@ -18,12 +18,11 @@ RSpec.describe Gitlab::Cache::Metadata, feature_category: :source_code_managemen
describe '#initialize' do
context 'when optional arguments are not set' do
it 'sets default value for them' do
- attributes = described_class.new(
- cache_identifier: cache_identifier,
- feature_category: feature_category
- )
+ attributes = described_class.new
+ expect(attributes.feature_category).to eq(:not_owned)
expect(attributes.backing_resource).to eq(:unknown)
+ expect(attributes.cache_identifier).to be_nil
end
end
@@ -44,6 +43,12 @@ RSpec.describe Gitlab::Cache::Metadata, feature_category: :source_code_managemen
end
end
+ context 'when not_owned feature category is set' do
+ let(:feature_category) { :not_owned }
+
+ it { expect(attributes.feature_category).to eq(:not_owned) }
+ end
+
context 'when backing resource is not supported' do
let(:backing_resource) { 'foo' }
diff --git a/spec/lib/gitlab/cache/metrics_spec.rb b/spec/lib/gitlab/cache/metrics_spec.rb
index 76ec0dbfa0b..c46533371d3 100644
--- a/spec/lib/gitlab/cache/metrics_spec.rb
+++ b/spec/lib/gitlab/cache/metrics_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Cache::Metrics do
+RSpec.describe Gitlab::Cache::Metrics, feature_category: :source_code_management do
subject(:metrics) { described_class.new(metadata) }
let(:metadata) do
@@ -23,12 +23,19 @@ RSpec.describe Gitlab::Cache::Metrics do
allow(Gitlab::Metrics).to receive(:counter)
.with(
:redis_hit_miss_operations_total,
- 'Hit/miss Redis cache counter'
+ 'Hit/miss Redis cache counter',
+ {
+ cache_identifier: cache_identifier,
+ feature_category: feature_category,
+ backing_resource: backing_resource
+ }
).and_return(counter_mock)
end
describe '#increment_cache_hit' do
- subject { metrics.increment_cache_hit }
+ subject { metrics.increment_cache_hit(labels) }
+
+ let(:labels) { {} }
it 'increments number of hits' do
expect(counter_mock)
@@ -44,10 +51,31 @@ RSpec.describe Gitlab::Cache::Metrics do
subject
end
+
+ context 'when labels redefine defaults' do
+ let(:labels) { { backing_resource: :gitaly } }
+
+ it 'increments number of hits' do
+ expect(counter_mock)
+ .to receive(:increment)
+ .with(
+ {
+ backing_resource: :gitaly,
+ cache_identifier: cache_identifier,
+ feature_category: feature_category,
+ cache_hit: true
+ }
+ ).once
+
+ subject
+ end
+ end
end
describe '#increment_cache_miss' do
- subject { metrics.increment_cache_miss }
+ subject { metrics.increment_cache_miss(labels) }
+
+ let(:labels) { {} }
it 'increments number of misses' do
expect(counter_mock)
@@ -63,22 +91,40 @@ RSpec.describe Gitlab::Cache::Metrics do
subject
end
+
+ context 'when labels redefine defaults' do
+ let(:labels) { { backing_resource: :gitaly } }
+
+ it 'increments number of misses' do
+ expect(counter_mock)
+ .to receive(:increment)
+ .with(
+ {
+ backing_resource: :gitaly,
+ cache_identifier: cache_identifier,
+ feature_category: feature_category,
+ cache_hit: false
+ }
+ ).once
+
+ subject
+ end
+ end
end
describe '#observe_cache_generation' do
subject do
- metrics.observe_cache_generation { action }
+ metrics.observe_cache_generation(labels) { action }
end
let(:action) { 'action' }
let(:histogram_mock) { instance_double(Prometheus::Client::Histogram) }
+ let(:labels) { {} }
before do
allow(Gitlab::Metrics::System).to receive(:monotonic_time).and_return(100.0, 500.0)
- end
- it 'updates histogram metric' do
- expect(Gitlab::Metrics).to receive(:histogram).with(
+ allow(Gitlab::Metrics).to receive(:histogram).with(
:redis_cache_generation_duration_seconds,
'Duration of Redis cache generation',
{
@@ -88,10 +134,36 @@ RSpec.describe Gitlab::Cache::Metrics do
},
[0, 1, 5]
).and_return(histogram_mock)
+ end
- expect(histogram_mock).to receive(:observe).with({}, 400.0)
+ it 'updates histogram metric' do
+ expect(histogram_mock).to receive(:observe).with(
+ {
+ cache_identifier: cache_identifier,
+ feature_category: feature_category,
+ backing_resource: backing_resource
+ },
+ 400.0
+ )
is_expected.to eq(action)
end
+
+ context 'when labels redefine defaults' do
+ let(:labels) { { backing_resource: :gitaly } }
+
+ it 'updates histogram metric' do
+ expect(histogram_mock).to receive(:observe).with(
+ {
+ cache_identifier: cache_identifier,
+ feature_category: feature_category,
+ backing_resource: :gitaly
+ },
+ 400.0
+ )
+
+ is_expected.to eq(action)
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/checks/changes_access_spec.rb b/spec/lib/gitlab/checks/changes_access_spec.rb
index 552afcdb180..854c04dd581 100644
--- a/spec/lib/gitlab/checks/changes_access_spec.rb
+++ b/spec/lib/gitlab/checks/changes_access_spec.rb
@@ -24,6 +24,14 @@ RSpec.describe Gitlab::Checks::ChangesAccess, feature_category: :source_code_man
subject.validate!
end
+
+ it 'calls file size check' do
+ expect_next_instance_of(Gitlab::Checks::GlobalFileSizeCheck) do |instance|
+ expect(instance).to receive(:validate!)
+ end
+
+ subject.validate!
+ end
end
context 'when time limit was reached' do
diff --git a/spec/lib/gitlab/checks/diff_check_spec.rb b/spec/lib/gitlab/checks/diff_check_spec.rb
index dd467537a4f..20c6ad8a6e8 100644
--- a/spec/lib/gitlab/checks/diff_check_spec.rb
+++ b/spec/lib/gitlab/checks/diff_check_spec.rb
@@ -94,7 +94,7 @@ RSpec.describe Gitlab::Checks::DiffCheck, feature_category: :source_code_managem
context 'when change is sent by a different user' do
it 'raises an error if the user is not allowed to update the file' do
- expect { subject.validate! }.to raise_error(Gitlab::GitAccess::ForbiddenError, "The path 'README' is locked in Git LFS by #{lock.user.name}")
+ expect { subject.validate! }.to raise_error(Gitlab::GitAccess::ForbiddenError, "The path 'README' is locked in Git LFS by #{lock.user.username}")
end
end
@@ -148,7 +148,7 @@ RSpec.describe Gitlab::Checks::DiffCheck, feature_category: :source_code_managem
end
it "does raise an error" do
- expect { subject.validate! }.to raise_error(Gitlab::GitAccess::ForbiddenError, "The path 'files/locked/baz.lfs' is locked in Git LFS by #{owner.name}")
+ expect { subject.validate! }.to raise_error(Gitlab::GitAccess::ForbiddenError, "The path 'files/locked/baz.lfs' is locked in Git LFS by #{owner.username}")
end
end
end
diff --git a/spec/lib/gitlab/checks/file_size_check/allow_existing_oversized_blobs_spec.rb b/spec/lib/gitlab/checks/file_size_check/allow_existing_oversized_blobs_spec.rb
new file mode 100644
index 00000000000..3b52d2e1364
--- /dev/null
+++ b/spec/lib/gitlab/checks/file_size_check/allow_existing_oversized_blobs_spec.rb
@@ -0,0 +1,86 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Checks::FileSizeCheck::AllowExistingOversizedBlobs, feature_category: :source_code_management do
+ subject { checker.find }
+
+ let_it_be(:project) { create(:project, :public, :repository) }
+ let(:checker) do
+ described_class.new(
+ project: project,
+ changes: changes,
+ file_size_limit_megabytes: 1)
+ end
+
+ describe '#find' do
+ let(:branch_name) { SecureRandom.uuid }
+ let(:other_branch_name) { SecureRandom.uuid }
+ let(:filename) { 'log.log' }
+ let(:create_file) do
+ project.repository.create_file(
+ project.owner,
+ filename,
+ initial_contents,
+ branch_name: branch_name,
+ message: 'whatever'
+ )
+ end
+
+ let(:changed_ref) do
+ project.repository.update_file(
+ project.owner,
+ filename,
+ changed_contents,
+ branch_name: other_branch_name,
+ start_branch_name: branch_name,
+ message: 'whatever'
+ )
+ end
+
+ let(:changes) { [oldrev: create_file, newrev: changed_ref] }
+
+ before do
+ # set up a branch
+ create_file
+
+ # branch off that branch
+ changed_ref
+
+ # delete stuff so it can be picked up by new_blobs
+ project.repository.delete_branch(other_branch_name)
+ end
+
+ context 'when changing from valid to oversized' do
+ let(:initial_contents) { 'a' }
+ let(:changed_contents) { 'a' * ((2**20) + 1) } # 1 MB + 1 byte
+
+ it 'returns an array with blobs that became oversized' do
+ blob = subject.first
+ expect(blob.path).to eq(filename)
+ expect(subject).to contain_exactly(blob)
+ end
+ end
+
+ context 'when changing from oversized to oversized' do
+ let(:initial_contents) { 'a' * ((2**20) + 1) } # 1 MB + 1 byte
+ let(:changed_contents) { 'a' * ((2**20) + 2) } # 1 MB + 1 byte
+
+ it { is_expected.to be_blank }
+ end
+
+ context 'when changing from oversized to valid' do
+ let(:initial_contents) { 'a' * ((2**20) + 1) } # 1 MB + 1 byte
+ let(:changed_contents) { 'aa' }
+
+ it { is_expected.to be_blank }
+ end
+
+ context 'when changing from valid to valid' do
+ let(:initial_contents) { 'abc' }
+ let(:changed_contents) { 'def' }
+
+ it { is_expected.to be_blank }
+ end
+ end
+end
diff --git a/spec/lib/gitlab/checks/file_size_check/any_oversized_blobs_spec.rb b/spec/lib/gitlab/checks/file_size_check/any_oversized_blobs_spec.rb
new file mode 100644
index 00000000000..7c786c2ba24
--- /dev/null
+++ b/spec/lib/gitlab/checks/file_size_check/any_oversized_blobs_spec.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Checks::FileSizeCheck::AnyOversizedBlobs, feature_category: :source_code_management do
+ let_it_be(:project) { create(:project, :public, :repository) }
+ let(:any_blob) do
+ described_class.new(
+ project: project,
+ changes: [{ newrev: 'bf12d2567099e26f59692896f73ac819bae45b00' }],
+ file_size_limit_megabytes: 1)
+ end
+
+ describe '#find' do
+ subject { any_blob.find }
+
+ # SHA of the 2-mb-file branch
+ let(:newrev) { 'bf12d2567099e26f59692896f73ac819bae45b00' }
+ let(:timeout) { nil }
+
+ before do
+ # Delete branch so Repository#new_blobs can return results
+ project.repository.delete_branch('2-mb-file')
+ end
+
+ it 'returns the blob exceeding the file size limit' do
+ expect(subject).to contain_exactly(kind_of(Gitlab::Git::Blob))
+ expect(subject[0].path).to eq('file.bin')
+ end
+ end
+end
diff --git a/spec/lib/gitlab/checks/global_file_size_check_spec.rb b/spec/lib/gitlab/checks/global_file_size_check_spec.rb
new file mode 100644
index 00000000000..9ea0c73b1c7
--- /dev/null
+++ b/spec/lib/gitlab/checks/global_file_size_check_spec.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Checks::GlobalFileSizeCheck, feature_category: :source_code_management do
+ include_context 'changes access checks context'
+
+ describe '#validate!' do
+ context 'when global_file_size_check is disabled' do
+ before do
+ stub_feature_flags(global_file_size_check: false)
+ end
+
+ it 'does not log' do
+ expect(subject).not_to receive(:log_timed)
+ expect(Gitlab::AppJsonLogger).not_to receive(:info)
+ expect(Gitlab::Checks::FileSizeCheck::AllowExistingOversizedBlobs).not_to receive(:new)
+ subject.validate!
+ end
+ end
+
+ it 'checks for file sizes' do
+ expect_next_instance_of(Gitlab::Checks::FileSizeCheck::AllowExistingOversizedBlobs,
+ project: project,
+ changes: changes,
+ file_size_limit_megabytes: 100
+ ) do |check|
+ expect(check).to receive(:find).and_call_original
+ end
+ expect(subject.logger).to receive(:log_timed).with('Checking for blobs over the file size limit')
+ .and_call_original
+ expect(Gitlab::AppJsonLogger).to receive(:info).with('Checking for blobs over the file size limit')
+ subject.validate!
+ end
+ end
+end
diff --git a/spec/lib/gitlab/checks/snippet_check_spec.rb b/spec/lib/gitlab/checks/snippet_check_spec.rb
index 89417aaca4d..c43b65d09c5 100644
--- a/spec/lib/gitlab/checks/snippet_check_spec.rb
+++ b/spec/lib/gitlab/checks/snippet_check_spec.rb
@@ -13,7 +13,7 @@ RSpec.describe Gitlab::Checks::SnippetCheck do
let(:creation) { false }
let(:deletion) { false }
- subject { Gitlab::Checks::SnippetCheck.new(changes, default_branch: default_branch, root_ref: snippet.repository.root_ref, logger: logger) }
+ subject { described_class.new(changes, default_branch: default_branch, root_ref: snippet.repository.root_ref, logger: logger) }
describe '#validate!' do
it 'does not raise any error' do
diff --git a/spec/lib/gitlab/ci/artifact_file_reader_spec.rb b/spec/lib/gitlab/ci/artifact_file_reader_spec.rb
index 76a596e1db3..ff918bbe558 100644
--- a/spec/lib/gitlab/ci/artifact_file_reader_spec.rb
+++ b/spec/lib/gitlab/ci/artifact_file_reader_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Ci::ArtifactFileReader do
+RSpec.describe Gitlab::Ci::ArtifactFileReader, feature_category: :pipeline_composition do
let(:job) { create(:ci_build) }
let(:path) { 'generated.yml' } # included in the ci_build_artifacts.zip
@@ -138,8 +138,8 @@ RSpec.describe Gitlab::Ci::ArtifactFileReader do
end
context 'when job does not have artifacts' do
- it 'raises ArgumentError' do
- expect { subject }.to raise_error(ArgumentError, 'Job does not have artifacts')
+ it 'raises an Error' do
+ expect { subject }.to raise_error(described_class::Error, 'Job does not have artifacts')
end
end
end
diff --git a/spec/lib/gitlab/ci/build/rules_spec.rb b/spec/lib/gitlab/ci/build/rules_spec.rb
index 9f191fed581..99577539798 100644
--- a/spec/lib/gitlab/ci/build/rules_spec.rb
+++ b/spec/lib/gitlab/ci/build/rules_spec.rb
@@ -244,59 +244,6 @@ RSpec.describe Gitlab::Ci::Build::Rules, feature_category: :pipeline_composition
when: 'never' }]))
}
end
-
- context 'when feature flag is disabled' do
- before do
- stub_feature_flags(introduce_rules_with_needs: false)
- end
-
- context 'with needs' do
- context 'when single need is specified' do
- let(:rule_list) do
- [{ if: '$VAR == null', needs: [{ name: 'test', artifacts: true, optional: false }] }]
- end
-
- it {
- is_expected.to eq(described_class::Result.new(when: 'on_success'))
- }
- end
-
- context 'when multiple needs are specified' do
- let(:rule_list) do
- [{ if: '$VAR == null',
- needs: [{ name: 'test', artifacts: true, optional: false },
- { name: 'rspec', artifacts: true, optional: false }] }]
- end
-
- it {
- is_expected.to eq(described_class::Result.new(when: 'on_success'))
- }
- end
-
- context 'when there are no needs specified' do
- let(:rule_list) { [{ if: '$VAR == null' }] }
-
- it {
- is_expected.to eq(described_class::Result.new(when: 'on_success'))
- }
- end
-
- context 'when need is specified with additional attibutes' do
- let(:rule_list) do
- [{ if: '$VAR == null', needs: [{
- artifacts: false,
- name: 'test',
- optional: true,
- when: 'never'
- }] }]
- end
-
- it {
- is_expected.to eq(described_class::Result.new(when: 'on_success'))
- }
- end
- end
- end
end
context 'with variables' do
diff --git a/spec/lib/gitlab/ci/components/instance_path_spec.rb b/spec/lib/gitlab/ci/components/instance_path_spec.rb
index b80422d03e5..511036efd37 100644
--- a/spec/lib/gitlab/ci/components/instance_path_spec.rb
+++ b/spec/lib/gitlab/ci/components/instance_path_spec.rb
@@ -101,30 +101,22 @@ RSpec.describe Gitlab::Ci::Components::InstancePath, feature_category: :pipeline
context 'when version is `~latest`' do
let(:version) { '~latest' }
- context 'when project is a catalog resource' do
- before do
- create(:catalog_resource, project: existing_project)
+ context 'when project has releases' do
+ let_it_be(:latest_release) do
+ create(:release, project: existing_project, sha: 'sha-1', released_at: Time.zone.now)
end
- context 'when project has releases' do
- let_it_be(:releases) do
- [
- create(:release, project: existing_project, sha: 'sha-1', released_at: Time.zone.now - 1.day),
- create(:release, project: existing_project, sha: 'sha-2', released_at: Time.zone.now)
- ]
- end
-
- it 'returns the sha of the latest release' do
- expect(path.sha).to eq(releases.last.sha)
- end
+ before(:all) do
+ # Previous release
+ create(:release, project: existing_project, sha: 'sha-2', released_at: Time.zone.now - 1.day)
end
- context 'when project does not have releases' do
- it { expect(path.sha).to be_nil }
+ it 'returns the sha of the latest release' do
+ expect(path.sha).to eq(latest_release.sha)
end
end
- context 'when project is not a catalog resource' do
+ context 'when project does not have releases' do
it { expect(path.sha).to be_nil }
end
end
diff --git a/spec/lib/gitlab/ci/config/external/file/artifact_spec.rb b/spec/lib/gitlab/ci/config/external/file/artifact_spec.rb
index 1f4586bd5a9..c7f18f0d01a 100644
--- a/spec/lib/gitlab/ci/config/external/file/artifact_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/file/artifact_spec.rb
@@ -41,6 +41,7 @@ RSpec.describe Gitlab::Ci::Config::External::File::Artifact, feature_category: :
it 'sets the expected error' do
expect(valid?).to be_falsy
expect(external_file.errors).to contain_exactly(expected_error)
+ expect(external_file.content).to eq(nil)
end
end
@@ -139,7 +140,7 @@ RSpec.describe Gitlab::Ci::Config::External::File::Artifact, feature_category: :
before do
allow_next_instance_of(Gitlab::Ci::ArtifactFileReader) do |reader|
- allow(reader).to receive(:read).and_return('')
+ allow(reader).to receive(:read).and_return(nil)
end
end
@@ -165,8 +166,8 @@ RSpec.describe Gitlab::Ci::Config::External::File::Artifact, feature_category: :
}
expect(context).to receive(:mutate).with(expected_attrs).and_call_original
- expect(valid?).to be_truthy
external_file.content
+ expect(valid?).to be_truthy
end
end
end
diff --git a/spec/lib/gitlab/ci/config/external/file/base_spec.rb b/spec/lib/gitlab/ci/config/external/file/base_spec.rb
index 1c5918f77ca..d6dd75f4b10 100644
--- a/spec/lib/gitlab/ci/config/external/file/base_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/file/base_spec.rb
@@ -106,7 +106,7 @@ RSpec.describe Gitlab::Ci::Config::External::File::Base, feature_category: :pipe
it 'is not a valid file' do
expect(valid?).to be_falsy
expect(file.error_message)
- .to eq('`some/file/xxxxxxxxxxxxxxxx.yml`: content does not have a valid YAML syntax')
+ .to eq('`some/file/xxxxxxxxxxxxxxxx.yml`: Invalid configuration format')
end
end
@@ -128,31 +128,6 @@ RSpec.describe Gitlab::Ci::Config::External::File::Base, feature_category: :pipe
end
end
- context 'when interpolation is disabled but there is a spec header' do
- before do
- stub_feature_flags(ci_includable_files_interpolation: false)
- end
-
- let(:location) { 'some-location.yml' }
-
- let(:content) do
- <<~YAML
- spec:
- include:
- website:
- ---
- run:
- script: deploy $[[ inputs.website ]]
- YAML
- end
-
- it 'returns an error saying that interpolation is disabled' do
- expect(valid?).to be_falsy
- expect(file.errors)
- .to include('`some-location.yml`: can not evaluate included file because interpolation is disabled')
- end
- end
-
context 'when interpolation was unsuccessful' do
let(:location) { 'some-location.yml' }
@@ -275,4 +250,17 @@ RSpec.describe Gitlab::Ci::Config::External::File::Base, feature_category: :pipe
it { is_expected.to eq([{ location: location, content: content }, nil, 'HEAD'].hash) }
end
end
+
+ describe '#load_and_validate_expanded_hash!' do
+ let(:location) { 'some/file/config.yml' }
+ let(:logger) { instance_double(::Gitlab::Ci::Pipeline::Logger, :instrument) }
+ let(:context_params) { { sha: 'HEAD', variables: variables, project: project, logger: logger } }
+
+ it 'includes instrumentation for loading and expanding the content' do
+ expect(logger).to receive(:instrument).once.ordered.with(:config_file_fetch_content_hash).and_yield
+ expect(logger).to receive(:instrument).once.ordered.with(:config_file_expand_content_includes).and_yield
+
+ file.load_and_validate_expanded_hash!
+ end
+ end
end
diff --git a/spec/lib/gitlab/ci/config/external/file/component_spec.rb b/spec/lib/gitlab/ci/config/external/file/component_spec.rb
index fe811bce9fe..7e3406413d0 100644
--- a/spec/lib/gitlab/ci/config/external/file/component_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/file/component_spec.rb
@@ -121,7 +121,7 @@ RSpec.describe Gitlab::Ci::Config::External::File::Component, feature_category:
it 'is invalid' do
expect(subject).to be_falsy
- expect(external_resource.error_message).to match(/does not have a valid YAML syntax/)
+ expect(external_resource.error_message).to match(/Invalid configuration format/)
end
end
end
diff --git a/spec/lib/gitlab/ci/config/external/mapper/filter_spec.rb b/spec/lib/gitlab/ci/config/external/mapper/filter_spec.rb
index 4da3e7e51a7..1a2a6c5beeb 100644
--- a/spec/lib/gitlab/ci/config/external/mapper/filter_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/mapper/filter_spec.rb
@@ -29,18 +29,5 @@ RSpec.describe Gitlab::Ci::Config::External::Mapper::Filter, feature_category: :
[{ local: 'config/.gitlab-ci.yml', rules: [{ if: '$VARIABLE1' }] }]
)
end
-
- context 'when FF `ci_support_include_rules_when_never` is disabled' do
- before do
- stub_feature_flags(ci_support_include_rules_when_never: false)
- end
-
- it 'filters locations according to rules ignoring when:' do
- is_expected.to eq(
- [{ local: 'config/.gitlab-ci.yml', rules: [{ if: '$VARIABLE1' }] },
- { remote: 'https://testing.com/.gitlab-ci.yml', rules: [{ if: '$VARIABLE1', when: 'never' }] }]
- )
- end
- end
end
end
diff --git a/spec/lib/gitlab/ci/config/external/processor_spec.rb b/spec/lib/gitlab/ci/config/external/processor_spec.rb
index 74afb3b1e97..935b6989dd7 100644
--- a/spec/lib/gitlab/ci/config/external/processor_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/processor_spec.rb
@@ -221,7 +221,7 @@ RSpec.describe Gitlab::Ci::Config::External::Processor, feature_category: :pipel
it 'raises an error' do
expect { processor.perform }.to raise_error(
described_class::IncludeError,
- '`lib/gitlab/ci/templates/template.yml`: content does not have a valid YAML syntax'
+ '`lib/gitlab/ci/templates/template.yml`: Invalid configuration format'
)
end
end
diff --git a/spec/lib/gitlab/ci/config/external/rules_spec.rb b/spec/lib/gitlab/ci/config/external/rules_spec.rb
index 1ba5caa1d4b..25b7998ef5e 100644
--- a/spec/lib/gitlab/ci/config/external/rules_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/rules_spec.rb
@@ -3,8 +3,7 @@
require 'spec_helper'
RSpec.describe Gitlab::Ci::Config::External::Rules, feature_category: :pipeline_composition do
- # Remove `project` property when FF `ci_support_include_rules_when_never` is removed
- let(:context) { double(variables_hash: {}, project: nil) }
+ let(:context) { double(variables_hash: {}) }
let(:rule_hashes) { [{ if: '$MY_VAR == "hello"' }] }
subject(:rules) { described_class.new(rule_hashes) }
@@ -19,11 +18,6 @@ RSpec.describe Gitlab::Ci::Config::External::Rules, feature_category: :pipeline_
end
shared_examples 'when there is a rule with if' do |rule_matched_result = true, rule_not_matched_result = false|
- # Remove this `before` block when FF `ci_support_include_rules_when_never` is removed
- before do
- allow(context).to receive(:project).and_return(nil)
- end
-
context 'when the rule matches' do
let(:context) { double(variables_hash: { 'MY_VAR' => 'hello' }) }
@@ -70,28 +64,12 @@ RSpec.describe Gitlab::Ci::Config::External::Rules, feature_category: :pipeline_
let(:rule_hashes) { [{ if: '$MY_VAR == "hello"', when: 'never' }] }
it_behaves_like 'when there is a rule with if', false, false
-
- context 'when FF `ci_support_include_rules_when_never` is disabled' do
- before do
- stub_feature_flags(ci_support_include_rules_when_never: false)
- end
-
- it_behaves_like 'when there is a rule with if'
- end
end
context 'with when: always' do
let(:rule_hashes) { [{ if: '$MY_VAR == "hello"', when: 'always' }] }
it_behaves_like 'when there is a rule with if'
-
- context 'when FF `ci_support_include_rules_when_never` is disabled' do
- before do
- stub_feature_flags(ci_support_include_rules_when_never: false)
- end
-
- it_behaves_like 'when there is a rule with if'
- end
end
context 'with when: <invalid string>' do
@@ -115,28 +93,12 @@ RSpec.describe Gitlab::Ci::Config::External::Rules, feature_category: :pipeline_
let(:rule_hashes) { [{ exists: 'Dockerfile', when: 'never' }] }
it_behaves_like 'when there is a rule with exists', false, false
-
- context 'when FF `ci_support_include_rules_when_never` is disabled' do
- before do
- stub_feature_flags(ci_support_include_rules_when_never: false)
- end
-
- it_behaves_like 'when there is a rule with exists'
- end
end
context 'with when: always' do
let(:rule_hashes) { [{ exists: 'Dockerfile', when: 'always' }] }
it_behaves_like 'when there is a rule with exists'
-
- context 'when FF `ci_support_include_rules_when_never` is disabled' do
- before do
- stub_feature_flags(ci_support_include_rules_when_never: false)
- end
-
- it_behaves_like 'when there is a rule with exists'
- end
end
context 'with when: <invalid string>' do
diff --git a/spec/lib/gitlab/ci/config/yaml/interpolator_spec.rb b/spec/lib/gitlab/ci/config/yaml/interpolator_spec.rb
index 726ed6d95a0..888756a3eb1 100644
--- a/spec/lib/gitlab/ci/config/yaml/interpolator_spec.rb
+++ b/spec/lib/gitlab/ci/config/yaml/interpolator_spec.rb
@@ -5,10 +5,10 @@ require 'spec_helper'
RSpec.describe Gitlab::Ci::Config::Yaml::Interpolator, feature_category: :pipeline_composition do
let_it_be(:project) { create(:project) }
- let(:ctx) { instance_double(Gitlab::Ci::Config::External::Context, project: project, user: build(:user, id: 1234)) }
+ let(:current_user) { build(:user, id: 1234) }
let(:result) { ::Gitlab::Ci::Config::Yaml::Result.new(config: [header, content]) }
- subject { described_class.new(result, arguments, ctx) }
+ subject { described_class.new(result, arguments, current_user: current_user) }
context 'when input data is valid' do
let(:header) do
@@ -39,7 +39,7 @@ RSpec.describe Gitlab::Ci::Config::Yaml::Interpolator, feature_category: :pipeli
end
context 'when config has a syntax error' do
- let(:result) { ::Gitlab::Ci::Config::Yaml::Result.new(error: ArgumentError.new) }
+ let(:result) { ::Gitlab::Ci::Config::Yaml::Result.new(error: 'Invalid configuration format') }
let(:arguments) do
{ website: 'gitlab.com' }
@@ -50,7 +50,7 @@ RSpec.describe Gitlab::Ci::Config::Yaml::Interpolator, feature_category: :pipeli
expect(subject).not_to be_valid
expect(subject.error_message).to eq subject.errors.first
- expect(subject.errors).to include 'content does not have a valid YAML syntax'
+ expect(subject.errors).to include 'Invalid configuration format'
end
end
@@ -142,28 +142,6 @@ RSpec.describe Gitlab::Ci::Config::Yaml::Interpolator, feature_category: :pipeli
end
describe '#to_hash' do
- context 'when interpolation is disabled' do
- before do
- stub_feature_flags(ci_includable_files_interpolation: false)
- end
-
- let(:header) do
- { spec: { inputs: { website: nil } } }
- end
-
- let(:content) do
- { test: 'deploy $[[ inputs.website ]]' }
- end
-
- let(:arguments) { {} }
-
- it 'returns an empty hash' do
- subject.interpolate!
-
- expect(subject.to_hash).to be_empty
- end
- end
-
context 'when interpolation is not used' do
let(:result) do
::Gitlab::Ci::Config::Yaml::Result.new(config: content)
@@ -202,118 +180,4 @@ RSpec.describe Gitlab::Ci::Config::Yaml::Interpolator, feature_category: :pipeli
end
end
end
-
- describe '#ready?' do
- let(:header) do
- { spec: { inputs: { website: nil } } }
- end
-
- let(:content) do
- { test: 'deploy $[[ inputs.website ]]' }
- end
-
- let(:arguments) do
- { website: 'gitlab.com' }
- end
-
- it 'returns false if interpolation has not been done yet' do
- expect(subject).not_to be_ready
- end
-
- it 'returns true if interpolation has been performed' do
- subject.interpolate!
-
- expect(subject).to be_ready
- end
-
- context 'when interpolation can not be performed' do
- let(:result) do
- ::Gitlab::Ci::Config::Yaml::Result.new(error: ArgumentError.new)
- end
-
- it 'returns true if interpolator has preliminary errors' do
- expect(subject).to be_ready
- end
-
- it 'returns true if interpolation has been attempted' do
- subject.interpolate!
-
- expect(subject).to be_ready
- end
- end
- end
-
- describe '#interpolate?' do
- let(:header) do
- { spec: { inputs: { website: nil } } }
- end
-
- let(:content) do
- { test: 'deploy $[[ inputs.something.abc ]] $[[ inputs.cde ]] $[[ efg ]]' }
- end
-
- let(:arguments) do
- { website: 'gitlab.com' }
- end
-
- context 'when interpolation can be performed' do
- it 'will perform interpolation' do
- expect(subject.interpolate?).to eq true
- end
- end
-
- context 'when interpolation is disabled' do
- before do
- stub_feature_flags(ci_includable_files_interpolation: false)
- end
-
- it 'will not perform interpolation' do
- expect(subject.interpolate?).to eq false
- end
- end
-
- context 'when an interpolation header is missing' do
- let(:header) { nil }
-
- it 'will not perform interpolation' do
- expect(subject.interpolate?).to eq false
- end
- end
-
- context 'when interpolator has preliminary errors' do
- let(:result) do
- ::Gitlab::Ci::Config::Yaml::Result.new(error: ArgumentError.new)
- end
-
- it 'will not perform interpolation' do
- expect(subject.interpolate?).to eq false
- end
- end
- end
-
- describe '#has_header?' do
- let(:content) do
- { test: 'deploy $[[ inputs.something.abc ]] $[[ inputs.cde ]] $[[ efg ]]' }
- end
-
- let(:arguments) do
- { website: 'gitlab.com' }
- end
-
- context 'when header is an empty hash' do
- let(:header) { {} }
-
- it 'does not have a header available' do
- expect(subject).not_to have_header
- end
- end
-
- context 'when header is not specified' do
- let(:header) { nil }
-
- it 'does not have a header available' do
- expect(subject).not_to have_header
- end
- end
- end
end
diff --git a/spec/lib/gitlab/ci/config/yaml/loader_spec.rb b/spec/lib/gitlab/ci/config/yaml/loader_spec.rb
index 1e417bcd8af..4e6151677e6 100644
--- a/spec/lib/gitlab/ci/config/yaml/loader_spec.rb
+++ b/spec/lib/gitlab/ci/config/yaml/loader_spec.rb
@@ -2,151 +2,58 @@
require 'spec_helper'
-RSpec.describe Gitlab::Ci::Config::Yaml::Loader, feature_category: :pipeline_composition do
- describe '#to_result' do
+RSpec.describe ::Gitlab::Ci::Config::Yaml::Loader, feature_category: :pipeline_composition do
+ describe '#load' do
let_it_be(:project) { create(:project) }
- subject(:result) { described_class.new(yaml, project: project).to_result }
-
- context 'when syntax is invalid' do
- let(:yaml) { 'some: invalid: syntax' }
-
- it 'returns an invalid result object' do
- expect(result).not_to be_valid
- expect(result.error).to be_a ::Gitlab::Config::Loader::FormatError
- end
+ let(:inputs) { { test_input: 'hello test' } }
+
+ let(:yaml) do
+ <<~YAML
+ ---
+ spec:
+ inputs:
+ test_input:
+ ---
+ test_job:
+ script:
+ - echo "$[[ inputs.test_input ]]"
+ YAML
end
- context 'when the first document is a header' do
- context 'with explicit document start marker' do
- let(:yaml) do
- <<~YAML
- ---
- spec:
- ---
- b: 2
- YAML
- end
-
- it 'considers the first document as header and the second as content' do
- expect(result).to be_valid
- expect(result.error).to be_nil
- expect(result.header).to eq({ spec: nil })
- expect(result.content).to eq({ b: 2 })
- end
- end
- end
+ subject(:result) { described_class.new(yaml, inputs: inputs, current_user: project.creator).load }
- context 'when first document is empty' do
- let(:yaml) do
- <<~YAML
- ---
- ---
- b: 2
- YAML
- end
-
- it 'considers the first document as header and the second as content' do
- expect(result).not_to have_header
- end
- end
-
- context 'when first document is an empty hash' do
- let(:yaml) do
- <<~YAML
- {}
- ---
- b: 2
- YAML
- end
+ it 'loads and interpolates CI config YAML' do
+ expected_config = { test_job: { script: ['echo "hello test"'] } }
- it 'returns second document as a content' do
- expect(result).not_to have_header
- expect(result.content).to eq({ b: 2 })
- end
+ expect(result).to be_valid
+ expect(result.content).to eq(expected_config)
end
- context 'when first an array' do
- let(:yaml) do
- <<~YAML
- ---
- - a
- - b
- ---
- b: 2
- YAML
- end
+ it 'allows the use of YAML reference tags' do
+ expect(Psych).to receive(:add_tag).once.with(
+ ::Gitlab::Ci::Config::Yaml::Tags::Reference.tag,
+ ::Gitlab::Ci::Config::Yaml::Tags::Reference
+ )
- it 'considers the first document as header and the second as content' do
- expect(result).not_to have_header
- end
+ result
end
- context 'when the first document is not a header' do
- let(:yaml) do
- <<~YAML
- a: 1
- ---
- b: 2
- YAML
- end
-
- it 'considers the first document as content for backwards compatibility' do
- expect(result).to be_valid
- expect(result.error).to be_nil
- expect(result).not_to have_header
- expect(result.content).to eq({ a: 1 })
- end
-
- context 'with explicit document start marker' do
- let(:yaml) do
- <<~YAML
- ---
- a: 1
- ---
- b: 2
- YAML
- end
+ context 'when there is an error loading the YAML' do
+ let(:yaml) { 'invalid...yaml' }
- it 'considers the first document as content for backwards compatibility' do
- expect(result).to be_valid
- expect(result.error).to be_nil
- expect(result).not_to have_header
- expect(result.content).to eq({ a: 1 })
- end
+ it 'returns an error result' do
+ expect(result).not_to be_valid
+ expect(result.error).to eq('Invalid configuration format')
end
end
- context 'when the first document is not a header and second document is empty' do
- let(:yaml) do
- <<~YAML
- a: 1
- ---
- YAML
- end
-
- it 'considers the first document as content' do
- expect(result).to be_valid
- expect(result.error).to be_nil
- expect(result).not_to have_header
- expect(result.content).to eq({ a: 1 })
- end
-
- context 'with explicit document start marker' do
- let(:yaml) do
- <<~YAML
- ---
- a: 1
- ---
- YAML
- end
+ context 'when there is an error interpolating the YAML' do
+ let(:inputs) { {} }
- it 'considers the first document as content' do
- expect(result).to be_valid
- expect(result.error).to be_nil
- expect(result).not_to have_header
- expect(result.content).to eq({ a: 1 })
- end
+ it 'returns an error result' do
+ expect(result).not_to be_valid
+ expect(result.error).to eq('`test_input` input: required value has not been provided')
end
end
end
diff --git a/spec/lib/gitlab/ci/config/yaml_spec.rb b/spec/lib/gitlab/ci/config/yaml_spec.rb
index 3576dd481c6..27d93d555f1 100644
--- a/spec/lib/gitlab/ci/config/yaml_spec.rb
+++ b/spec/lib/gitlab/ci/config/yaml_spec.rb
@@ -3,18 +3,20 @@
require 'spec_helper'
RSpec.describe Gitlab::Ci::Config::Yaml, feature_category: :pipeline_composition do
- describe '.load!' do
- it 'loads a YAML file' do
- yaml = <<~YAML
- image: 'image:1.0'
- texts:
- nested_key: 'value1'
- more_text:
- more_nested_key: 'value2'
- YAML
+ let(:yaml) do
+ <<~YAML
+ image: 'image:1.0'
+ texts:
+ nested_key: 'value1'
+ more_text:
+ more_nested_key: 'value2'
+ YAML
+ end
- config = described_class.load!(yaml)
+ describe '.load!' do
+ subject(:config) { described_class.load!(yaml) }
+ it 'loads a YAML file' do
expect(config).to eq({
image: 'image:1.0',
texts: {
@@ -30,156 +32,20 @@ RSpec.describe Gitlab::Ci::Config::Yaml, feature_category: :pipeline_composition
let(:yaml) { 'some: invalid: syntax' }
it 'raises an error' do
- expect { described_class.load!(yaml) }
+ expect { config }
.to raise_error ::Gitlab::Config::Loader::FormatError, /mapping values are not allowed in this context/
end
end
- end
-
- describe '.load_result!' do
- let_it_be(:project) { create(:project) }
-
- subject(:result) { described_class.load_result!(yaml, project: project) }
-
- context 'when syntax is invalid' do
- let(:yaml) { 'some: invalid: syntax' }
-
- it 'returns an invalid result object' do
- expect(result).not_to be_valid
- expect(result.error).to be_a ::Gitlab::Config::Loader::FormatError
- end
- end
-
- context 'when the first document is a header' do
- context 'with explicit document start marker' do
- let(:yaml) do
- <<~YAML
- ---
- spec:
- ---
- b: 2
- YAML
- end
-
- it 'considers the first document as header and the second as content' do
- expect(result).to be_valid
- expect(result.error).to be_nil
- expect(result.header).to eq({ spec: nil })
- expect(result.content).to eq({ b: 2 })
- end
- end
- end
-
- context 'when first document is empty' do
- let(:yaml) do
- <<~YAML
- ---
- ---
- b: 2
- YAML
- end
-
- it 'considers the first document as header and the second as content' do
- expect(result).not_to have_header
- end
- end
-
- context 'when first document is an empty hash' do
- let(:yaml) do
- <<~YAML
- {}
- ---
- b: 2
- YAML
- end
- it 'returns second document as a content' do
- expect(result).not_to have_header
- expect(result.content).to eq({ b: 2 })
- end
- end
+ context 'when given a user' do
+ let(:user) { instance_double(User) }
- context 'when first an array' do
- let(:yaml) do
- <<~YAML
- ---
- - a
- - b
- ---
- b: 2
- YAML
- end
-
- it 'considers the first document as header and the second as content' do
- expect(result).not_to have_header
- end
- end
-
- context 'when the first document is not a header' do
- let(:yaml) do
- <<~YAML
- a: 1
- ---
- b: 2
- YAML
- end
-
- it 'considers the first document as content for backwards compatibility' do
- expect(result).to be_valid
- expect(result.error).to be_nil
- expect(result).not_to have_header
- expect(result.content).to eq({ a: 1 })
- end
-
- context 'with explicit document start marker' do
- let(:yaml) do
- <<~YAML
- ---
- a: 1
- ---
- b: 2
- YAML
- end
-
- it 'considers the first document as content for backwards compatibility' do
- expect(result).to be_valid
- expect(result.error).to be_nil
- expect(result).not_to have_header
- expect(result.content).to eq({ a: 1 })
- end
- end
- end
-
- context 'when the first document is not a header and second document is empty' do
- let(:yaml) do
- <<~YAML
- a: 1
- ---
- YAML
- end
-
- it 'considers the first document as content' do
- expect(result).to be_valid
- expect(result.error).to be_nil
- expect(result).not_to have_header
- expect(result.content).to eq({ a: 1 })
- end
+ subject(:config) { described_class.load!(yaml, current_user: user) }
- context 'with explicit document start marker' do
- let(:yaml) do
- <<~YAML
- ---
- a: 1
- ---
- YAML
- end
+ it 'passes it to Loader' do
+ expect(::Gitlab::Ci::Config::Yaml::Loader).to receive(:new).with(yaml, current_user: user).and_call_original
- it 'considers the first document as content' do
- expect(result).to be_valid
- expect(result.error).to be_nil
- expect(result).not_to have_header
- expect(result.content).to eq({ a: 1 })
- end
+ config
end
end
end
diff --git a/spec/lib/gitlab/ci/jwt_v2_spec.rb b/spec/lib/gitlab/ci/jwt_v2_spec.rb
index 15be67329a8..575f174f737 100644
--- a/spec/lib/gitlab/ci/jwt_v2_spec.rb
+++ b/spec/lib/gitlab/ci/jwt_v2_spec.rb
@@ -62,6 +62,23 @@ RSpec.describe Gitlab::Ci::JwtV2, feature_category: :continuous_integration do
end
describe 'custom claims' do
+ let(:project_config) do
+ instance_double(
+ Gitlab::Ci::ProjectConfig,
+ url: 'gitlab.com/gitlab-org/gitlab//.gitlab-ci.yml',
+ source: :repository_source
+ )
+ end
+
+ before do
+ allow(Gitlab::Ci::ProjectConfig).to receive(:new).with(
+ project: project,
+ sha: pipeline.sha,
+ pipeline_source: pipeline.source.to_sym,
+ pipeline_source_bridge: pipeline.source_bridge
+ ).and_return(project_config)
+ end
+
describe 'runner_id' do
it 'is the ID of the runner executing the job' do
expect(payload[:runner_id]).to eq(runner.id)
@@ -113,23 +130,6 @@ RSpec.describe Gitlab::Ci::JwtV2, feature_category: :continuous_integration do
end
describe 'ci_config_ref_uri' do
- let(:project_config) do
- instance_double(
- Gitlab::Ci::ProjectConfig,
- url: 'gitlab.com/gitlab-org/gitlab//.gitlab-ci.yml',
- source: :repository_source
- )
- end
-
- before do
- allow(Gitlab::Ci::ProjectConfig).to receive(:new).with(
- project: project,
- sha: pipeline.sha,
- pipeline_source: pipeline.source.to_sym,
- pipeline_source_bridge: pipeline.source_bridge
- ).and_return(project_config)
- end
-
it 'joins project_config.url and pipeline.source_ref_path with @' do
expect(payload[:ci_config_ref_uri]).to eq('gitlab.com/gitlab-org/gitlab//.gitlab-ci.yml' \
'@refs/heads/auto-deploy-2020-03-19')
@@ -165,15 +165,31 @@ RSpec.describe Gitlab::Ci::JwtV2, feature_category: :continuous_integration do
end
end
- context 'when ci_jwt_v2_ci_config_ref_uri_claim flag is disabled' do
+ context 'when config source is not repository' do
before do
- stub_feature_flags(ci_jwt_v2_ref_uri_claim: false)
+ allow(project_config).to receive(:source).and_return(:auto_devops_source)
end
it 'is nil' do
expect(payload[:ci_config_ref_uri]).to be_nil
end
end
+ end
+
+ describe 'ci_config_sha' do
+ it 'is the SHA of the pipeline' do
+ expect(payload[:ci_config_sha]).to eq(pipeline.sha)
+ end
+
+ context 'when project config is nil' do
+ before do
+ allow(Gitlab::Ci::ProjectConfig).to receive(:new).and_return(nil)
+ end
+
+ it 'is nil' do
+ expect(payload[:ci_config_sha]).to be_nil
+ end
+ end
context 'when config source is not repository' do
before do
@@ -181,7 +197,7 @@ RSpec.describe Gitlab::Ci::JwtV2, feature_category: :continuous_integration do
end
it 'is nil' do
- expect(payload[:ci_config_ref_uri]).to be_nil
+ expect(payload[:ci_config_sha]).to be_nil
end
end
end
diff --git a/spec/lib/gitlab/ci/pipeline/chain/config/content_spec.rb b/spec/lib/gitlab/ci/pipeline/chain/config/content_spec.rb
index a9a52972294..9c268d9039e 100644
--- a/spec/lib/gitlab/ci/pipeline/chain/config/content_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/chain/config/content_spec.rb
@@ -26,7 +26,7 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Config::Content, feature_category: :
expect(pipeline.config_source).to eq 'bridge_source'
expect(command.config_content).to eq 'the-yaml'
- expect(command.pipeline_config.internal_include_prepended?).to eq(false)
+ expect(command.pipeline_config.internal_include_prepended?).to eq(true)
end
end
diff --git a/spec/lib/gitlab/ci/reports/sbom/source_spec.rb b/spec/lib/gitlab/ci/reports/sbom/source_spec.rb
index 63b8e5fdf01..c1eaea511b7 100644
--- a/spec/lib/gitlab/ci/reports/sbom/source_spec.rb
+++ b/spec/lib/gitlab/ci/reports/sbom/source_spec.rb
@@ -24,4 +24,28 @@ RSpec.describe Gitlab::Ci::Reports::Sbom::Source, feature_category: :dependency_
data: attributes[:data]
)
end
+
+ describe '#source_file_path' do
+ it 'returns the correct source_file_path' do
+ expect(subject.source_file_path).to eq('package.json')
+ end
+ end
+
+ describe '#input_file_path' do
+ it 'returns the correct input_file_path' do
+ expect(subject.input_file_path).to eq("package-lock.json")
+ end
+ end
+
+ describe '#packager' do
+ it 'returns the correct package manager name' do
+ expect(subject.packager).to eq("npm")
+ end
+ end
+
+ describe '#language' do
+ it 'returns the correct langauge' do
+ expect(subject.language).to eq("JavaScript")
+ end
+ end
end
diff --git a/spec/lib/gitlab/ci/status/stage/factory_spec.rb b/spec/lib/gitlab/ci/status/stage/factory_spec.rb
index 35d44281072..702341a7ea7 100644
--- a/spec/lib/gitlab/ci/status/stage/factory_spec.rb
+++ b/spec/lib/gitlab/ci/status/stage/factory_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Ci::Status::Stage::Factory do
+RSpec.describe Gitlab::Ci::Status::Stage::Factory, feature_category: :continuous_integration do
let(:user) { create(:user) }
let(:project) { create(:project) }
let(:pipeline) { create(:ci_empty_pipeline, project: project) }
@@ -62,7 +62,7 @@ RSpec.describe Gitlab::Ci::Status::Stage::Factory do
end
context 'when stage has manual builds' do
- (Ci::HasStatus::BLOCKED_STATUS + ['skipped']).each do |core_status|
+ Ci::HasStatus::BLOCKED_STATUS.each do |core_status|
context "when status is #{core_status}" do
let(:stage) { create(:ci_stage, pipeline: pipeline, status: core_status) }
diff --git a/spec/lib/gitlab/ci/status/stage/play_manual_spec.rb b/spec/lib/gitlab/ci/status/stage/play_manual_spec.rb
index 9fdaddc083e..e23645c106b 100644
--- a/spec/lib/gitlab/ci/status/stage/play_manual_spec.rb
+++ b/spec/lib/gitlab/ci/status/stage/play_manual_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Ci::Status::Stage::PlayManual do
+RSpec.describe Gitlab::Ci::Status::Stage::PlayManual, feature_category: :continuous_integration do
let(:stage) { double('stage') }
let(:play_manual) { described_class.new(stage) }
@@ -48,7 +48,7 @@ RSpec.describe Gitlab::Ci::Status::Stage::PlayManual do
context 'when stage is skipped' do
let(:stage) { create(:ci_stage, status: :skipped) }
- it { is_expected.to be_truthy }
+ it { is_expected.to be_falsy }
end
context 'when stage is manual' do
diff --git a/spec/lib/gitlab/ci/tags/bulk_insert_spec.rb b/spec/lib/gitlab/ci/tags/bulk_insert_spec.rb
index 5ab859241c6..b72a818c16c 100644
--- a/spec/lib/gitlab/ci/tags/bulk_insert_spec.rb
+++ b/spec/lib/gitlab/ci/tags/bulk_insert_spec.rb
@@ -31,7 +31,7 @@ RSpec.describe Gitlab::Ci::Tags::BulkInsert do
let(:inserter) { instance_double(described_class) }
it 'delegates to bulk insert class' do
- expect(Gitlab::Ci::Tags::BulkInsert)
+ expect(described_class)
.to receive(:new)
.with(statuses)
.and_return(inserter)
diff --git a/spec/lib/gitlab/ci/variables/builder_spec.rb b/spec/lib/gitlab/ci/variables/builder_spec.rb
index 6b296924b6d..28c9bdc4c4b 100644
--- a/spec/lib/gitlab/ci/variables/builder_spec.rb
+++ b/spec/lib/gitlab/ci/variables/builder_spec.rb
@@ -98,7 +98,7 @@ RSpec.describe Gitlab::Ci::Variables::Builder, :clean_gitlab_redis_cache, featur
{ key: 'CI_PAGES_DOMAIN',
value: Gitlab.config.pages.host },
{ key: 'CI_PAGES_URL',
- value: project.pages_url },
+ value: Gitlab::Pages::UrlBuilder.new(project).pages_url },
{ key: 'CI_API_V4_URL',
value: API::Helpers::Version.new('v4').root_url },
{ key: 'CI_API_GRAPHQL_URL',
diff --git a/spec/lib/gitlab/ci/variables/collection/sort_spec.rb b/spec/lib/gitlab/ci/variables/collection/sort_spec.rb
index 432225c53f0..f798945f64f 100644
--- a/spec/lib/gitlab/ci/variables/collection/sort_spec.rb
+++ b/spec/lib/gitlab/ci/variables/collection/sort_spec.rb
@@ -6,7 +6,7 @@ require 'tsort'
RSpec.describe Gitlab::Ci::Variables::Collection::Sort do
describe '#initialize with non-Collection value' do
- subject { Gitlab::Ci::Variables::Collection::Sort.new([]) }
+ subject { described_class.new([]) }
it 'raises ArgumentError' do
expect { subject }.to raise_error(ArgumentError, /Collection object was expected/)
@@ -167,7 +167,7 @@ RSpec.describe Gitlab::Ci::Variables::Collection::Sort do
let(:collection) { Gitlab::Ci::Variables::Collection.new(variables) }
- subject { Gitlab::Ci::Variables::Collection::Sort.new(collection).tsort }
+ subject { described_class.new(collection).tsort }
it 'raises TSort::Cyclic' do
expect { subject }.to raise_error(TSort::Cyclic)
diff --git a/spec/lib/gitlab/ci/variables/collection_spec.rb b/spec/lib/gitlab/ci/variables/collection_spec.rb
index 181e37de9b9..d21190ae297 100644
--- a/spec/lib/gitlab/ci/variables/collection_spec.rb
+++ b/spec/lib/gitlab/ci/variables/collection_spec.rb
@@ -3,6 +3,62 @@
require 'spec_helper'
RSpec.describe Gitlab::Ci::Variables::Collection, feature_category: :secrets_management do
+ describe '.fabricate' do
+ using RSpec::Parameterized::TableSyntax
+
+ where do
+ {
+ "given an array of variables": {
+ input: [
+ { key: 'VAR1', value: 'value1' },
+ { key: 'VAR2', value: 'value2' }
+ ]
+ },
+ "given a hash of variables": {
+ input: { 'VAR1' => 'value1', 'VAR2' => 'value2' }
+ },
+ "given a proc that evaluates to an array": {
+ input: -> do
+ [
+ { key: 'VAR1', value: 'value1' },
+ { key: 'VAR2', value: 'value2' }
+ ]
+ end
+ },
+ "given a proc that evaluates to a hash": {
+ input: -> do
+ { 'VAR1' => 'value1', 'VAR2' => 'value2' }
+ end
+ },
+ "given a collection": {
+ input: Gitlab::Ci::Variables::Collection.new(
+ [
+ { key: 'VAR1', value: 'value1' },
+ { key: 'VAR2', value: 'value2' }
+ ]
+ )
+ }
+ }
+ end
+
+ with_them do
+ subject(:collection) { Gitlab::Ci::Variables::Collection.fabricate(input) }
+
+ it 'returns a collection' do
+ expect(collection).to be_a(Gitlab::Ci::Variables::Collection)
+ expect(collection.size).to eq(2)
+ expect(collection.map(&:key)).to contain_exactly('VAR1', 'VAR2')
+ expect(collection.map(&:value)).to contain_exactly('value1', 'value2')
+ end
+ end
+
+ context 'when given an unrecognized type' do
+ it 'raises error' do
+ expect { described_class.fabricate(1) }.to raise_error(ArgumentError)
+ end
+ end
+ end
+
describe '.new' do
it 'can be initialized with an array' do
variable = { key: 'VAR', value: 'value', public: true, masked: false }
@@ -123,7 +179,7 @@ RSpec.describe Gitlab::Ci::Variables::Collection, feature_category: :secrets_man
end
describe '#[]' do
- subject { Gitlab::Ci::Variables::Collection.new(variables)[var_name] }
+ subject { described_class.new(variables)[var_name] }
shared_examples 'an array access operator' do
context 'for a non-existent variable name' do
@@ -570,7 +626,7 @@ RSpec.describe Gitlab::Ci::Variables::Collection, feature_category: :secrets_man
end
let(:errors) { 'circular variable reference detected' }
- let(:collection) { Gitlab::Ci::Variables::Collection.new(variables, errors) }
+ let(:collection) { described_class.new(variables, errors) }
subject(:result) { collection.to_s }
diff --git a/spec/lib/gitlab/ci/variables/downstream/expandable_variable_generator_spec.rb b/spec/lib/gitlab/ci/variables/downstream/expandable_variable_generator_spec.rb
new file mode 100644
index 00000000000..5b33527e06c
--- /dev/null
+++ b/spec/lib/gitlab/ci/variables/downstream/expandable_variable_generator_spec.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+
+RSpec.describe Gitlab::Ci::Variables::Downstream::ExpandableVariableGenerator, feature_category: :secrets_management do
+ let(:all_bridge_variables) do
+ Gitlab::Ci::Variables::Collection.fabricate(
+ [
+ { key: 'REF1', value: 'ref 1' },
+ { key: 'REF2', value: 'ref 2' }
+ ]
+ )
+ end
+
+ let(:context) do
+ Gitlab::Ci::Variables::Downstream::Generator::Context.new(all_bridge_variables: all_bridge_variables)
+ end
+
+ subject(:generator) { described_class.new(context) }
+
+ describe '#for' do
+ context 'when given a variable without interpolation' do
+ it 'returns an array containing the variable' do
+ var = Gitlab::Ci::Variables::Collection::Item.fabricate({ key: 'VAR1', value: 'variable 1' })
+
+ expect(generator.for(var)).to match_array([{ key: 'VAR1', value: 'variable 1' }])
+ end
+ end
+
+ context 'when given a variable with interpolation' do
+ it 'returns an array containing the expanded variables' do
+ var = Gitlab::Ci::Variables::Collection::Item.fabricate({ key: 'VAR1', value: '$REF1 $REF2 $REF3' })
+
+ expect(generator.for(var)).to match_array([{ key: 'VAR1', value: 'ref 1 ref 2 ' }])
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/variables/downstream/generator_spec.rb b/spec/lib/gitlab/ci/variables/downstream/generator_spec.rb
new file mode 100644
index 00000000000..61e8b9a8c4a
--- /dev/null
+++ b/spec/lib/gitlab/ci/variables/downstream/generator_spec.rb
@@ -0,0 +1,85 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Ci::Variables::Downstream::Generator, feature_category: :secrets_management do
+ let(:bridge_variables) do
+ Gitlab::Ci::Variables::Collection.fabricate(
+ [
+ { key: 'REF1', value: 'ref 1' },
+ { key: 'REF2', value: 'ref 2' }
+ ]
+ )
+ end
+
+ let(:yaml_variables) do
+ [
+ { key: 'VAR1', value: 'variable 1' },
+ { key: 'VAR2', value: 'variable 2' },
+ { key: 'RAW_VAR3', value: '$REF1', raw: true },
+ { key: 'INTERPOLATION_VAR4', value: 'interpolate $REF1 $REF2' }
+ ]
+ end
+
+ let(:pipeline_variables) do
+ [
+ { key: 'PIPELINE_VAR1', value: 'variable 1' },
+ { key: 'PIPELINE_VAR2', value: 'variable 2' },
+ { key: 'PIPELINE_RAW_VAR3', value: '$REF1', raw: true },
+ { key: 'PIPELINE_INTERPOLATION_VAR4', value: 'interpolate $REF1 $REF2' }
+ ]
+ end
+
+ let(:pipeline_schedule_variables) do
+ [
+ { key: 'PIPELINE_SCHEDULE_VAR1', value: 'variable 1' },
+ { key: 'PIPELINE_SCHEDULE_VAR2', value: 'variable 2' },
+ { key: 'PIPELINE_SCHEDULE_RAW_VAR3', value: '$REF1', raw: true },
+ { key: 'PIPELINE_SCHEDULE_INTERPOLATION_VAR4', value: 'interpolate $REF1 $REF2' }
+ ]
+ end
+
+ let(:bridge) do
+ instance_double(
+ 'Ci::Bridge',
+ variables: bridge_variables,
+ forward_yaml_variables?: true,
+ forward_pipeline_variables?: true,
+ yaml_variables: yaml_variables,
+ pipeline_variables: pipeline_variables,
+ pipeline_schedule_variables: pipeline_schedule_variables
+ )
+ end
+
+ subject(:generator) { described_class.new(bridge) }
+
+ describe '#calculate' do
+ it 'creates attributes for downstream pipeline variables from the ' \
+ 'given yaml variables, pipeline variables and pipeline schedule variables' do
+ expected = [
+ { key: 'VAR1', value: 'variable 1' },
+ { key: 'VAR2', value: 'variable 2' },
+ { key: 'RAW_VAR3', value: '$REF1', raw: true },
+ { key: 'INTERPOLATION_VAR4', value: 'interpolate ref 1 ref 2' },
+ { key: 'PIPELINE_VAR1', value: 'variable 1' },
+ { key: 'PIPELINE_VAR2', value: 'variable 2' },
+ { key: 'PIPELINE_RAW_VAR3', value: '$REF1', raw: true },
+ { key: 'PIPELINE_INTERPOLATION_VAR4', value: 'interpolate ref 1 ref 2' },
+ { key: 'PIPELINE_SCHEDULE_VAR1', value: 'variable 1' },
+ { key: 'PIPELINE_SCHEDULE_VAR2', value: 'variable 2' },
+ { key: 'PIPELINE_SCHEDULE_RAW_VAR3', value: '$REF1', raw: true },
+ { key: 'PIPELINE_SCHEDULE_INTERPOLATION_VAR4', value: 'interpolate ref 1 ref 2' }
+ ]
+
+ expect(generator.calculate).to contain_exactly(*expected)
+ end
+
+ it 'returns empty array when bridge has no variables' do
+ allow(bridge).to receive(:yaml_variables).and_return([])
+ allow(bridge).to receive(:pipeline_variables).and_return([])
+ allow(bridge).to receive(:pipeline_schedule_variables).and_return([])
+
+ expect(generator.calculate).to be_empty
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/variables/downstream/raw_variable_generator_spec.rb b/spec/lib/gitlab/ci/variables/downstream/raw_variable_generator_spec.rb
new file mode 100644
index 00000000000..12249071486
--- /dev/null
+++ b/spec/lib/gitlab/ci/variables/downstream/raw_variable_generator_spec.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+
+RSpec.describe Gitlab::Ci::Variables::Downstream::RawVariableGenerator, feature_category: :secrets_management do
+ let(:context) { Gitlab::Ci::Variables::Downstream::Generator::Context.new }
+
+ subject(:generator) { described_class.new(context) }
+
+ describe '#for' do
+ it 'returns an array containing the unexpanded raw variable' do
+ var = Gitlab::Ci::Variables::Collection::Item.fabricate({ key: 'VAR1', value: '$REF1', raw: true })
+
+ expect(generator.for(var)).to match_array([{ key: 'VAR1', value: '$REF1', raw: true }])
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/yaml_processor_spec.rb b/spec/lib/gitlab/ci/yaml_processor_spec.rb
index 2c020e76cb6..c4e27d0e420 100644
--- a/spec/lib/gitlab/ci/yaml_processor_spec.rb
+++ b/spec/lib/gitlab/ci/yaml_processor_spec.rb
@@ -152,7 +152,7 @@ module Gitlab
config = YAML.dump({ default: { interruptible: true },
rspec: { script: "rspec" } })
- config_processor = Gitlab::Ci::YamlProcessor.new(config).execute
+ config_processor = described_class.new(config).execute
builds = config_processor.builds.select { |b| b[:stage] == "test" }
expect(builds.size).to eq(1)
@@ -851,7 +851,7 @@ module Gitlab
context 'when `only` has an invalid value' do
let(:config) { { rspec: { script: "rspec", stage: "test", only: only } } }
- subject { Gitlab::Ci::YamlProcessor.new(YAML.dump(config)).execute }
+ subject { described_class.new(YAML.dump(config)).execute }
context 'when it is integer' do
let(:only) { 1 }
@@ -875,7 +875,7 @@ module Gitlab
context 'when `except` has an invalid value' do
let(:config) { { rspec: { script: "rspec", except: except } } }
- subject { Gitlab::Ci::YamlProcessor.new(YAML.dump(config)).execute }
+ subject { described_class.new(YAML.dump(config)).execute }
context 'when it is integer' do
let(:except) { 1 }
@@ -899,7 +899,7 @@ module Gitlab
describe "Scripts handling" do
let(:config_data) { YAML.dump(config) }
- let(:config_processor) { Gitlab::Ci::YamlProcessor.new(config_data).execute }
+ let(:config_processor) { described_class.new(config_data).execute }
subject(:test_build) { config_processor.builds.find { |build| build[:name] == 'test' } }
@@ -1131,7 +1131,7 @@ module Gitlab
before_script: ["pwd"],
rspec: { script: "rspec" } })
- config_processor = Gitlab::Ci::YamlProcessor.new(config).execute
+ config_processor = described_class.new(config).execute
rspec_build = config_processor.builds.find { |build| build[:name] == 'rspec' }
expect(rspec_build).to eq({
@@ -1165,7 +1165,7 @@ module Gitlab
command: ["/usr/local/bin/init", "run"] }, "docker:dind"],
script: "rspec" } })
- config_processor = Gitlab::Ci::YamlProcessor.new(config).execute
+ config_processor = described_class.new(config).execute
rspec_build = config_processor.builds.find { |build| build[:name] == 'rspec' }
expect(rspec_build).to eq({
@@ -1197,7 +1197,7 @@ module Gitlab
before_script: ["pwd"],
rspec: { script: "rspec" } })
- config_processor = Gitlab::Ci::YamlProcessor.new(config).execute
+ config_processor = described_class.new(config).execute
rspec_build = config_processor.builds.find { |build| build[:name] == 'rspec' }
expect(rspec_build).to eq({
@@ -1225,7 +1225,7 @@ module Gitlab
before_script: ["pwd"],
rspec: { image: "image:1.0", services: ["postgresql", "docker:dind"], script: "rspec" } })
- config_processor = Gitlab::Ci::YamlProcessor.new(config).execute
+ config_processor = described_class.new(config).execute
rspec_build = config_processor.builds.find { |build| build[:name] == 'rspec' }
expect(rspec_build).to eq({
@@ -1492,7 +1492,7 @@ module Gitlab
end
context 'when using `extends`' do
- let(:config_processor) { Gitlab::Ci::YamlProcessor.new(config).execute }
+ let(:config_processor) { described_class.new(config).execute }
subject { config_processor.builds.first }
@@ -1612,7 +1612,7 @@ module Gitlab
}
end
- subject { Gitlab::Ci::YamlProcessor.new(YAML.dump(config), opts).execute }
+ subject { described_class.new(YAML.dump(config), opts).execute }
context "when validating a ci config file with no project context" do
context "when a single string is provided" do
@@ -1744,7 +1744,7 @@ module Gitlab
variables: { 'VAR1' => 1 } })
end
- let(:config_processor) { Gitlab::Ci::YamlProcessor.new(config).execute }
+ let(:config_processor) { described_class.new(config).execute }
let(:builds) { config_processor.builds }
context 'when job is parallelized' do
@@ -1860,7 +1860,7 @@ module Gitlab
}
})
- config_processor = Gitlab::Ci::YamlProcessor.new(config).execute
+ config_processor = described_class.new(config).execute
rspec_build = config_processor.builds.find { |build| build[:name] == 'rspec' }
expect(rspec_build[:cache]).to eq(
@@ -1886,7 +1886,7 @@ module Gitlab
}
})
- config_processor = Gitlab::Ci::YamlProcessor.new(config).execute
+ config_processor = described_class.new(config).execute
rspec_build = config_processor.builds.find { |build| build[:name] == 'rspec' }
expect(rspec_build[:cache]).to eq(
@@ -1913,7 +1913,7 @@ module Gitlab
}
})
- config_processor = Gitlab::Ci::YamlProcessor.new(config).execute
+ config_processor = described_class.new(config).execute
rspec_build = config_processor.builds.find { |build| build[:name] == 'rspec' }
expect(rspec_build[:cache]).to eq(
@@ -1952,7 +1952,7 @@ module Gitlab
}
)
- config_processor = Gitlab::Ci::YamlProcessor.new(config).execute
+ config_processor = described_class.new(config).execute
rspec_build = config_processor.builds.find { |build| build[:name] == 'rspec' }
expect(rspec_build[:cache]).to eq(
@@ -1979,7 +1979,7 @@ module Gitlab
}
)
- config_processor = Gitlab::Ci::YamlProcessor.new(config).execute
+ config_processor = described_class.new(config).execute
rspec_build = config_processor.builds.find { |build| build[:name] == 'rspec' }
expect(rspec_build[:cache]).to eq(
@@ -2004,7 +2004,7 @@ module Gitlab
}
})
- config_processor = Gitlab::Ci::YamlProcessor.new(config).execute
+ config_processor = described_class.new(config).execute
rspec_build = config_processor.builds.find { |build| build[:name] == 'rspec' }
expect(rspec_build[:cache]).to eq(
@@ -2039,7 +2039,7 @@ module Gitlab
}
})
- config_processor = Gitlab::Ci::YamlProcessor.new(config).execute
+ config_processor = described_class.new(config).execute
rspec_build = config_processor.builds.find { |build| build[:name] == 'rspec' }
expect(rspec_build).to eq({
@@ -2076,7 +2076,7 @@ module Gitlab
}
})
- config_processor = Gitlab::Ci::YamlProcessor.new(config).execute
+ config_processor = described_class.new(config).execute
builds = config_processor.builds
expect(builds.size).to eq(1)
@@ -2133,7 +2133,7 @@ module Gitlab
end
describe "release" do
- let(:processor) { Gitlab::Ci::YamlProcessor.new(YAML.dump(config)).execute }
+ let(:processor) { described_class.new(YAML.dump(config)).execute }
let(:config) do
{
stages: %w[build test release],
@@ -2179,7 +2179,7 @@ module Gitlab
}
end
- subject { Gitlab::Ci::YamlProcessor.new(YAML.dump(config)).execute }
+ subject { described_class.new(YAML.dump(config)).execute }
let(:builds) { subject.builds }
@@ -2289,7 +2289,7 @@ module Gitlab
}
end
- subject { Gitlab::Ci::YamlProcessor.new(YAML.dump(config)).execute }
+ subject { described_class.new(YAML.dump(config)).execute }
let(:builds) { subject.builds }
@@ -2331,7 +2331,7 @@ module Gitlab
}
end
- subject { Gitlab::Ci::YamlProcessor.new(YAML.dump(config)).execute }
+ subject { described_class.new(YAML.dump(config)).execute }
context 'no dependencies' do
let(:dependencies) {}
@@ -2404,7 +2404,7 @@ module Gitlab
}
end
- subject { Gitlab::Ci::YamlProcessor.new(YAML.dump(config)).execute }
+ subject { described_class.new(YAML.dump(config)).execute }
context 'no needs' do
it { is_expected.to be_valid }
@@ -2678,7 +2678,7 @@ module Gitlab
end
context 'with when/rules' do
- subject { Gitlab::Ci::YamlProcessor.new(YAML.dump(config)).execute }
+ subject { described_class.new(YAML.dump(config)).execute }
let(:config) do
{
@@ -2798,7 +2798,7 @@ module Gitlab
end
describe "Hidden jobs" do
- let(:config_processor) { Gitlab::Ci::YamlProcessor.new(config).execute }
+ let(:config_processor) { described_class.new(config).execute }
subject { config_processor.builds }
@@ -2846,7 +2846,7 @@ module Gitlab
end
describe "YAML Alias/Anchor" do
- let(:config_processor) { Gitlab::Ci::YamlProcessor.new(config).execute }
+ let(:config_processor) { described_class.new(config).execute }
subject { config_processor.builds }
@@ -3390,7 +3390,7 @@ module Gitlab
end
describe '#execute' do
- subject { Gitlab::Ci::YamlProcessor.new(content).execute }
+ subject { described_class.new(content).execute }
context 'when the YAML could not be parsed' do
let(:content) { YAML.dump('invalid: yaml: test') }
@@ -3435,7 +3435,7 @@ module Gitlab
it 'returns errors and empty configuration' do
expect(subject.valid?).to eq(false)
- expect(subject.errors).to eq(['Unknown alias: bad_alias'])
+ expect(subject.errors).to all match(%r{unknown .+ bad_alias}i)
end
end
diff --git a/spec/lib/gitlab/cleanup/remote_uploads_spec.rb b/spec/lib/gitlab/cleanup/remote_uploads_spec.rb
index c59b7f004dd..fddc62a5705 100644
--- a/spec/lib/gitlab/cleanup/remote_uploads_spec.rb
+++ b/spec/lib/gitlab/cleanup/remote_uploads_spec.rb
@@ -72,4 +72,30 @@ RSpec.describe Gitlab::Cleanup::RemoteUploads do
subject
end
end
+
+ context 'when a bucket prefix is configured' do
+ let(:bucket_prefix) { 'test-prefix' }
+ let(:credentials) do
+ {
+ provider: "AWS",
+ aws_access_key_id: "AWS_ACCESS_KEY_ID",
+ aws_secret_access_key: "AWS_SECRET_ACCESS_KEY",
+ region: "eu-central-1"
+ }
+ end
+
+ let(:config) { { connection: credentials, bucket_prefix: bucket_prefix, remote_directory: 'uploads' } }
+
+ subject { described_class.new.run!(dry_run: false) }
+
+ before do
+ stub_uploads_object_storage(FileUploader, config: config)
+ end
+
+ it 'does not connect to any storage' do
+ expect(::Fog::Storage).not_to receive(:new)
+
+ expect { subject }.to raise_error(/prefixes are not supported/)
+ end
+ end
end
diff --git a/spec/lib/gitlab/cluster/mixins/puma_cluster_spec.rb b/spec/lib/gitlab/cluster/mixins/puma_cluster_spec.rb
index 05b67a8a93f..cc329c48c5f 100644
--- a/spec/lib/gitlab/cluster/mixins/puma_cluster_spec.rb
+++ b/spec/lib/gitlab/cluster/mixins/puma_cluster_spec.rb
@@ -98,7 +98,7 @@ RSpec.describe Gitlab::Cluster::Mixins::PumaCluster do
loop do
line = process.readline
puts "PUMA_DEBUG: #{line}" if ENV['PUMA_DEBUG']
- break if line =~ output
+ break if line.match?(output)
end
end
end
diff --git a/spec/lib/gitlab/config/entry/composable_array_spec.rb b/spec/lib/gitlab/config/entry/composable_array_spec.rb
index 77766cb3b0a..d8f00476444 100644
--- a/spec/lib/gitlab/config/entry/composable_array_spec.rb
+++ b/spec/lib/gitlab/config/entry/composable_array_spec.rb
@@ -47,13 +47,13 @@ RSpec.describe Gitlab::Config::Entry::ComposableArray, :aggregate_failures do
expect(entry[0].description).to eq('node definition')
expect(entry[0].key).to eq('node')
expect(entry[0].metadata).to eq({})
- expect(entry[0].parent.class).to eq(Gitlab::Config::Entry::ComposableArray)
+ expect(entry[0].parent.class).to eq(described_class)
expect(entry[0].value).to eq(DATABASE_SECRET: 'passw0rd')
expect(entry[1]).to be_a(Gitlab::Config::Entry::Node)
expect(entry[1].description).to eq('node definition')
expect(entry[1].key).to eq('node')
expect(entry[1].metadata).to eq({})
- expect(entry[1].parent.class).to eq(Gitlab::Config::Entry::ComposableArray)
+ expect(entry[1].parent.class).to eq(described_class)
expect(entry[1].value).to eq(API_TOKEN: 'passw0rd2')
end
diff --git a/spec/lib/gitlab/config/entry/composable_hash_spec.rb b/spec/lib/gitlab/config/entry/composable_hash_spec.rb
index 331c9efc741..6ce66314098 100644
--- a/spec/lib/gitlab/config/entry/composable_hash_spec.rb
+++ b/spec/lib/gitlab/config/entry/composable_hash_spec.rb
@@ -48,19 +48,19 @@ RSpec.describe Gitlab::Config::Entry::ComposableHash, :aggregate_failures do
expect(entry[:DATABASE_SECRET].description).to eq('DATABASE_SECRET node definition')
expect(entry[:DATABASE_SECRET].key).to eq(:DATABASE_SECRET)
expect(entry[:DATABASE_SECRET].metadata).to eq(name: :DATABASE_SECRET)
- expect(entry[:DATABASE_SECRET].parent.class).to eq(Gitlab::Config::Entry::ComposableHash)
+ expect(entry[:DATABASE_SECRET].parent.class).to eq(described_class)
expect(entry[:DATABASE_SECRET].value).to eq('passw0rd')
expect(entry[:API_TOKEN]).to be_a(Gitlab::Config::Entry::Node)
expect(entry[:API_TOKEN].description).to eq('API_TOKEN node definition')
expect(entry[:API_TOKEN].key).to eq(:API_TOKEN)
expect(entry[:API_TOKEN].metadata).to eq(name: :API_TOKEN)
- expect(entry[:API_TOKEN].parent.class).to eq(Gitlab::Config::Entry::ComposableHash)
+ expect(entry[:API_TOKEN].parent.class).to eq(described_class)
expect(entry[:API_TOKEN].value).to eq('passw0rd2')
expect(entry[:ACCEPT_PASSWORD]).to be_a(Gitlab::Config::Entry::Node)
expect(entry[:ACCEPT_PASSWORD].description).to eq('ACCEPT_PASSWORD node definition')
expect(entry[:ACCEPT_PASSWORD].key).to eq(:ACCEPT_PASSWORD)
expect(entry[:ACCEPT_PASSWORD].metadata).to eq(name: :ACCEPT_PASSWORD)
- expect(entry[:ACCEPT_PASSWORD].parent.class).to eq(Gitlab::Config::Entry::ComposableHash)
+ expect(entry[:ACCEPT_PASSWORD].parent.class).to eq(described_class)
expect(entry[:ACCEPT_PASSWORD].value).to eq(false)
end
diff --git a/spec/lib/gitlab/config/loader/yaml_spec.rb b/spec/lib/gitlab/config/loader/yaml_spec.rb
index bba66f33718..ec83fbc67b5 100644
--- a/spec/lib/gitlab/config/loader/yaml_spec.rb
+++ b/spec/lib/gitlab/config/loader/yaml_spec.rb
@@ -75,7 +75,7 @@ RSpec.describe Gitlab::Config::Loader::Yaml, feature_category: :pipeline_composi
it 'raises FormatError' do
expect { loader }.to raise_error(
Gitlab::Config::Loader::FormatError,
- 'Unknown alias: bad_alias'
+ %r{unknown .+ bad_alias}i
)
end
end
diff --git a/spec/lib/gitlab/current_settings_spec.rb b/spec/lib/gitlab/current_settings_spec.rb
index fda3b07eb82..0e93a85764f 100644
--- a/spec/lib/gitlab/current_settings_spec.rb
+++ b/spec/lib/gitlab/current_settings_spec.rb
@@ -276,7 +276,7 @@ RSpec.describe Gitlab::CurrentSettings do
describe '#current_application_settings?', :use_clean_rails_memory_store_caching do
before do
- allow(Gitlab::CurrentSettings).to receive(:current_application_settings?).and_call_original
+ allow(described_class).to receive(:current_application_settings?).and_call_original
end
it 'returns true when settings exist' do
diff --git a/spec/lib/gitlab/data_builder/build_spec.rb b/spec/lib/gitlab/data_builder/build_spec.rb
index 92fef93bddb..7cd0af0dcec 100644
--- a/spec/lib/gitlab/data_builder/build_spec.rb
+++ b/spec/lib/gitlab/data_builder/build_spec.rb
@@ -66,25 +66,6 @@ RSpec.describe Gitlab::DataBuilder::Build, feature_category: :integrations do
expect(control.count).to eq(14)
end
- context 'when job_webhook_retries_count feature flag is disabled' do
- before do
- stub_feature_flags(job_webhook_retries_count: false)
- end
-
- it { expect(data).not_to have_key(:retries_count) }
-
- it 'does not exceed number of expected queries' do
- ci_build # Make sure the Ci::Build model is created before recording.
-
- control = ActiveRecord::QueryRecorder.new(skip_cached: false) do
- b = Ci::Build.find(ci_build.id)
- described_class.build(b) # Don't use ci_build variable here since it has all associations loaded into memory
- end
-
- expect(control.count).to eq(13)
- end
- end
-
context 'commit author_url' do
context 'when no commit present' do
let(:build) { build(:ci_build) }
diff --git a/spec/lib/gitlab/data_builder/emoji_spec.rb b/spec/lib/gitlab/data_builder/emoji_spec.rb
new file mode 100644
index 00000000000..a9cd9824e55
--- /dev/null
+++ b/spec/lib/gitlab/data_builder/emoji_spec.rb
@@ -0,0 +1,126 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::DataBuilder::Emoji, feature_category: :team_planning do
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:issue) { create(:issue, project: project) }
+ let_it_be(:merge_request) { create(:merge_request, source_project: project) }
+ let_it_be(:snippet) { create(:snippet, project: project) }
+ let(:action) { 'award' }
+ let(:data) { described_class.build(award_emoji, user, action) }
+ let(:award_emoji) { create(:award_emoji, awardable: awardable) }
+
+ shared_examples 'includes standard data' do
+ specify do
+ expect(awardable).to receive(:hook_attrs)
+ expect(data[:object_attributes]).to have_key(:awarded_on_url)
+ expect(data[:object_kind]).to eq('emoji')
+ expect(data[:user]).to eq(user.hook_attrs)
+ end
+
+ include_examples 'project hook data'
+ end
+
+ describe 'when emoji on issue' do
+ let(:awardable) { issue }
+
+ it_behaves_like 'includes standard data'
+
+ it 'returns the issue data' do
+ expect(awardable).to receive(:hook_attrs)
+ expect(data).to have_key(:issue)
+ end
+ end
+
+ describe 'when emoji on merge request' do
+ let(:awardable) { merge_request }
+
+ it_behaves_like 'includes standard data'
+
+ it 'returns the merge request data' do
+ expect(awardable).to receive(:hook_attrs)
+ expect(data).to have_key(:merge_request)
+ end
+ end
+
+ describe 'when emoji on snippet' do
+ let(:awardable) { snippet }
+
+ it_behaves_like 'includes standard data'
+
+ it 'returns the snippet data' do
+ expect(awardable).to receive(:hook_attrs)
+ expect(data).to have_key(:snippet)
+ end
+ end
+
+ describe 'when emoji on note' do
+ describe 'when note on issue' do
+ let(:note) { create(:note, noteable: issue, project: project) }
+ let(:awardable) { note }
+
+ it_behaves_like 'includes standard data'
+
+ it 'returns the note and issue data' do
+ expect(note.noteable).to receive(:hook_attrs)
+ expect(data).to have_key(:note)
+ expect(data).to have_key(:issue)
+ end
+ end
+
+ describe 'when note on merge request' do
+ let(:note) { create(:note, noteable: merge_request, project: project) }
+ let(:awardable) { note }
+
+ it_behaves_like 'includes standard data'
+
+ it 'returns the note and merge request data' do
+ expect(note.noteable).to receive(:hook_attrs)
+ expect(data).to have_key(:note)
+ expect(data).to have_key(:merge_request)
+ end
+ end
+
+ describe 'when note on snippet' do
+ let(:note) { create(:note, noteable: snippet, project: project) }
+ let(:awardable) { note }
+
+ it_behaves_like 'includes standard data'
+
+ it 'returns the note and snippet data' do
+ expect(note.noteable).to receive(:hook_attrs)
+ expect(data).to have_key(:note)
+ expect(data).to have_key(:snippet)
+ end
+ end
+
+ describe 'when note on commit' do
+ let(:note) { create(:note_on_commit, project: project) }
+ let(:awardable) { note }
+
+ it_behaves_like 'includes standard data'
+
+ it 'returns the note and commit data' do
+ expect(note.noteable).to receive(:hook_attrs)
+ expect(data).to have_key(:note)
+ expect(data).to have_key(:commit)
+ end
+ end
+ end
+
+ describe 'when awardable does not respond to hook_attrs' do
+ let(:awardable) { issue }
+
+ it_behaves_like 'includes standard data'
+
+ it 'returns the issue data' do
+ allow(award_emoji.awardable).to receive(:respond_to?).with(:hook_attrs).and_return(false)
+ expect(Gitlab::AppLogger).to receive(:error).with(
+ 'Error building payload data for emoji webhook. Issue does not respond to hook_attrs.')
+
+ data
+ end
+ end
+end
diff --git a/spec/lib/gitlab/database/async_indexes/migration_helpers_spec.rb b/spec/lib/gitlab/database/async_indexes/migration_helpers_spec.rb
index b2ba1a60fbb..309bbf1e3f0 100644
--- a/spec/lib/gitlab/database/async_indexes/migration_helpers_spec.rb
+++ b/spec/lib/gitlab/database/async_indexes/migration_helpers_spec.rb
@@ -223,6 +223,21 @@ RSpec.describe Gitlab::Database::AsyncIndexes::MigrationHelpers, feature_categor
expect(async_index).to have_attributes(table_name: table_name, definition: index_definition)
end
end
+
+ context 'when the given SQL has whitespace' do
+ let(:index_definition) { " #{super()}" }
+ let(:async_index) { index_model.find_by(name: index_name) }
+
+ it 'creates the async index record' do
+ expect { prepare_async_index_from_sql }.to change { index_model.where(name: index_name).count }.by(1)
+ end
+
+ it 'sets the async index attributes correctly' do
+ prepare_async_index_from_sql
+
+ expect(async_index).to have_attributes(table_name: table_name, definition: index_definition.strip)
+ end
+ end
end
end
end
diff --git a/spec/lib/gitlab/database/async_indexes/postgres_async_index_spec.rb b/spec/lib/gitlab/database/async_indexes/postgres_async_index_spec.rb
index 9e37124ba28..7e111dbe08f 100644
--- a/spec/lib/gitlab/database/async_indexes/postgres_async_index_spec.rb
+++ b/spec/lib/gitlab/database/async_indexes/postgres_async_index_spec.rb
@@ -55,6 +55,21 @@ RSpec.describe Gitlab::Database::AsyncIndexes::PostgresAsyncIndex, type: :model,
it_behaves_like 'table_name is invalid'
end
+
+ context 'when passing a definition with beginning or trailing whitespace' do
+ let(:model) { super().tap { |m| m.definition = definition } }
+ let(:definition) do
+ <<-SQL
+ CREATE UNIQUE INDEX CONCURRENTLY foo_index ON bar_field (uuid);
+ SQL
+ end
+
+ it "strips the definition field" do
+ expect(model).to be_valid
+ model.save!
+ expect(model.definition).to eq(definition.strip)
+ end
+ end
end
describe 'scopes' do
diff --git a/spec/lib/gitlab/database/click_house_client_spec.rb b/spec/lib/gitlab/database/click_house_client_spec.rb
new file mode 100644
index 00000000000..502d879bf6a
--- /dev/null
+++ b/spec/lib/gitlab/database/click_house_client_spec.rb
@@ -0,0 +1,113 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'ClickHouse::Client', feature_category: :database do
+ context 'when click_house spec tag is not added' do
+ it 'does not have any ClickHouse databases configured' do
+ databases = ClickHouse::Client.configuration.databases
+
+ expect(databases).to be_empty
+ end
+ end
+
+ describe 'when click_house spec tag is added', :click_house do
+ around do |example|
+ with_net_connect_allowed do
+ example.run
+ end
+ end
+
+ it 'has a ClickHouse database configured' do
+ databases = ClickHouse::Client.configuration.databases
+
+ expect(databases).not_to be_empty
+ end
+
+ it 'returns data from the DB via `select` method' do
+ result = ClickHouse::Client.select("SELECT 1 AS value", :main)
+
+ # returns JSON if successful. Otherwise error
+ expect(result).to eq([{ 'value' => 1 }])
+ end
+
+ it 'does not return data via `execute` method' do
+ result = ClickHouse::Client.execute("SELECT 1 AS value", :main)
+
+ # does not return data, just true if successful. Otherwise error.
+ expect(result).to eq(true)
+ end
+
+ describe 'data manipulation' do
+ describe 'inserting' do
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project) }
+
+ let_it_be(:author1) { create(:user).tap { |u| project.add_developer(u) } }
+ let_it_be(:author2) { create(:user).tap { |u| project.add_developer(u) } }
+
+ let_it_be(:issue1) { create(:issue, project: project) }
+ let_it_be(:issue2) { create(:issue, project: project) }
+ let_it_be(:merge_request) { create(:merge_request, source_project: project) }
+
+ let_it_be(:event1) { create(:event, :created, target: issue1, author: author1) }
+ let_it_be(:event2) { create(:event, :closed, target: issue2, author: author2) }
+ let_it_be(:event3) { create(:event, :merged, target: merge_request, author: author1) }
+
+ let(:events) { [event1, event2, event3] }
+
+ def format_row(event)
+ path = event.project.reload.project_namespace.traversal_ids.join('/')
+
+ action = Event.actions[event.action]
+ [
+ event.id,
+ "'#{path}/'",
+ event.author_id,
+ event.target_id,
+ "'#{event.target_type}'",
+ action,
+ event.created_at.to_f,
+ event.updated_at.to_f
+ ].join(',')
+ end
+
+ describe 'RSpec hooks' do
+ it 'ensures that tables are empty' do
+ results = ClickHouse::Client.select('SELECT * FROM events', :main)
+ expect(results).to be_empty
+ end
+ end
+
+ it 'inserts and modifies data' do
+ insert_query = <<~SQL
+ INSERT INTO events
+ (id, path, author_id, target_id, target_type, action, created_at, updated_at)
+ VALUES
+ (#{format_row(event1)}),
+ (#{format_row(event2)}),
+ (#{format_row(event3)})
+ SQL
+
+ ClickHouse::Client.execute(insert_query, :main)
+
+ results = ClickHouse::Client.select('SELECT * FROM events ORDER BY id', :main)
+ expect(results.size).to eq(3)
+
+ last = results.last
+ expect(last).to match(a_hash_including(
+ 'id' => event3.id,
+ 'author_id' => event3.author_id,
+ 'created_at' => be_within(0.05).of(event3.created_at),
+ 'target_type' => event3.target_type
+ ))
+
+ ClickHouse::Client.execute("DELETE FROM events WHERE id = #{event3.id}", :main)
+
+ results = ClickHouse::Client.select("SELECT * FROM events WHERE id = #{event3.id}", :main)
+ expect(results).to be_empty
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/database/each_database_spec.rb b/spec/lib/gitlab/database/each_database_spec.rb
index 2653297c81a..d0e3c83076c 100644
--- a/spec/lib/gitlab/database/each_database_spec.rb
+++ b/spec/lib/gitlab/database/each_database_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe Gitlab::Database::EachDatabase do
- describe '.each_database_connection', :add_ci_connection do
+ describe '.each_connection', :add_ci_connection do
let(:database_base_models) { { main: ActiveRecord::Base, ci: Ci::ApplicationRecord }.with_indifferent_access }
before do
@@ -17,7 +17,7 @@ RSpec.describe Gitlab::Database::EachDatabase do
expect(Gitlab::Database::SharedModel).to receive(:using_connection)
.with(Ci::ApplicationRecord.connection).ordered.and_yield
- expect { |b| described_class.each_database_connection(&b) }
+ expect { |b| described_class.each_connection(&b) }
.to yield_successive_args(
[ActiveRecord::Base.connection, 'main'],
[Ci::ApplicationRecord.connection, 'ci']
@@ -29,7 +29,7 @@ RSpec.describe Gitlab::Database::EachDatabase do
expect(Gitlab::Database::SharedModel).to receive(:using_connection)
.with(Ci::ApplicationRecord.connection).ordered.and_yield
- expect { |b| described_class.each_database_connection(only: 'ci', &b) }
+ expect { |b| described_class.each_connection(only: 'ci', &b) }
.to yield_successive_args([Ci::ApplicationRecord.connection, 'ci'])
end
@@ -38,7 +38,7 @@ RSpec.describe Gitlab::Database::EachDatabase do
expect(Gitlab::Database::SharedModel).to receive(:using_connection)
.with(Ci::ApplicationRecord.connection).ordered.and_yield
- expect { |b| described_class.each_database_connection(only: :ci, &b) }
+ expect { |b| described_class.each_connection(only: :ci, &b) }
.to yield_successive_args([Ci::ApplicationRecord.connection, 'ci'])
end
end
@@ -46,7 +46,7 @@ RSpec.describe Gitlab::Database::EachDatabase do
context 'when the selected names are invalid' do
it 'does not yield any connections' do
expect do |b|
- described_class.each_database_connection(only: :notvalid, &b)
+ described_class.each_connection(only: :notvalid, &b)
rescue ArgumentError => e
expect(e.message).to match(/notvalid is not a valid database name/)
end.not_to yield_control
@@ -54,7 +54,7 @@ RSpec.describe Gitlab::Database::EachDatabase do
it 'raises an error' do
expect do
- described_class.each_database_connection(only: :notvalid) {}
+ described_class.each_connection(only: :notvalid) {}
end.to raise_error(ArgumentError, /notvalid is not a valid database name/)
end
end
@@ -78,7 +78,7 @@ RSpec.describe Gitlab::Database::EachDatabase do
db_config.name != 'main' ? 'main' : nil
end
- expect { |b| described_class.each_database_connection(include_shared: false, &b) }
+ expect { |b| described_class.each_connection(include_shared: false, &b) }
.to yield_successive_args([ActiveRecord::Base.connection, 'main'])
end
end
diff --git a/spec/lib/gitlab/database/gitlab_schema_spec.rb b/spec/lib/gitlab/database/gitlab_schema_spec.rb
index 48f5cdb995b..1c864239ae6 100644
--- a/spec/lib/gitlab/database/gitlab_schema_spec.rb
+++ b/spec/lib/gitlab/database/gitlab_schema_spec.rb
@@ -29,6 +29,9 @@ RSpec.describe Gitlab::Database::GitlabSchema, feature_category: :database do
'audit_events_part_5fc467ac26' | :gitlab_main
'_test_gitlab_main_table' | :gitlab_main
'_test_gitlab_ci_table' | :gitlab_ci
+ '_test_gitlab_main_clusterwide_table' | :gitlab_main_clusterwide
+ '_test_gitlab_main_cell_table' | :gitlab_main_cell
+ '_test_gitlab_pm_table' | :gitlab_pm
'_test_my_table' | :gitlab_shared
'pg_attribute' | :gitlab_internal
end
diff --git a/spec/lib/gitlab/database/health_status_spec.rb b/spec/lib/gitlab/database/health_status_spec.rb
index bc923635b1d..4a2b9eee45a 100644
--- a/spec/lib/gitlab/database/health_status_spec.rb
+++ b/spec/lib/gitlab/database/health_status_spec.rb
@@ -98,7 +98,7 @@ RSpec.describe Gitlab::Database::HealthStatus, feature_category: :database do
end
let(:deferred_worker_health_checker) do
- Gitlab::SidekiqMiddleware::DeferJobs::DatabaseHealthStatusChecker.new(
+ Gitlab::SidekiqMiddleware::SkipJobs::DatabaseHealthStatusChecker.new(
123,
deferred_worker.name
)
@@ -116,7 +116,7 @@ RSpec.describe Gitlab::Database::HealthStatus, feature_category: :database do
it 'captures sidekiq job class in the log' do
expect(Gitlab::Database::HealthStatus::Logger).to receive(:info).with(
status_checker_id: deferred_worker_health_checker.id,
- status_checker_type: 'Gitlab::SidekiqMiddleware::DeferJobs::DatabaseHealthStatusChecker',
+ status_checker_type: 'Gitlab::SidekiqMiddleware::SkipJobs::DatabaseHealthStatusChecker',
job_class_name: deferred_worker_health_checker.job_class_name,
health_status_indicator: autovacuum_indicator_class.to_s,
indicator_signal: 'Stop',
diff --git a/spec/lib/gitlab/database/load_balancing/host_spec.rb b/spec/lib/gitlab/database/load_balancing/host_spec.rb
index caae06ce43a..5ef6d9173c4 100644
--- a/spec/lib/gitlab/database/load_balancing/host_spec.rb
+++ b/spec/lib/gitlab/database/load_balancing/host_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe Gitlab::Database::LoadBalancing::Host do
end
let(:host) do
- Gitlab::Database::LoadBalancing::Host.new('localhost', load_balancer)
+ described_class.new('localhost', load_balancer)
end
before do
diff --git a/spec/lib/gitlab/database/load_balancing/load_balancer_spec.rb b/spec/lib/gitlab/database/load_balancing/load_balancer_spec.rb
index 997c7a31cba..26c8969efd8 100644
--- a/spec/lib/gitlab/database/load_balancing/load_balancer_spec.rb
+++ b/spec/lib/gitlab/database/load_balancing/load_balancer_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Database::LoadBalancing::LoadBalancer, :request_store do
+RSpec.describe Gitlab::Database::LoadBalancing::LoadBalancer, :request_store, feature_category: :database do
let(:conflict_error) { Class.new(RuntimeError) }
let(:model) { ActiveRecord::Base }
let(:db_host) { model.connection_pool.db_config.host }
@@ -71,7 +71,30 @@ RSpec.describe Gitlab::Database::LoadBalancing::LoadBalancer, :request_store do
end
end
+ shared_examples 'logs service discovery thread interruption' do |lb_method|
+ context 'with service discovery' do
+ let(:service_discovery) do
+ instance_double(
+ Gitlab::Database::LoadBalancing::ServiceDiscovery,
+ log_refresh_thread_interruption: true
+ )
+ end
+
+ before do
+ allow(lb).to receive(:service_discovery).and_return(service_discovery)
+ end
+
+ it 'calls logs service discovery thread interruption' do
+ expect(service_discovery).to receive(:log_refresh_thread_interruption)
+
+ lb.public_send(lb_method) {}
+ end
+ end
+ end
+
describe '#read' do
+ it_behaves_like 'logs service discovery thread interruption', :read
+
it 'yields a connection for a read' do
connection = double(:connection)
host = double(:host)
@@ -203,6 +226,8 @@ RSpec.describe Gitlab::Database::LoadBalancing::LoadBalancer, :request_store do
end
describe '#read_write' do
+ it_behaves_like 'logs service discovery thread interruption', :read_write
+
it 'yields a connection for a write' do
connection = ActiveRecord::Base.connection_pool.connection
diff --git a/spec/lib/gitlab/database/load_balancing/primary_host_spec.rb b/spec/lib/gitlab/database/load_balancing/primary_host_spec.rb
index 02c9499bedb..53605d14c17 100644
--- a/spec/lib/gitlab/database/load_balancing/primary_host_spec.rb
+++ b/spec/lib/gitlab/database/load_balancing/primary_host_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe Gitlab::Database::LoadBalancing::PrimaryHost do
)
end
- let(:host) { Gitlab::Database::LoadBalancing::PrimaryHost.new(load_balancer) }
+ let(:host) { described_class.new(load_balancer) }
describe '#connection' do
it 'returns a connection from the pool' do
diff --git a/spec/lib/gitlab/database/load_balancing/service_discovery_spec.rb b/spec/lib/gitlab/database/load_balancing/service_discovery_spec.rb
index 9a559c7ccb4..789919d2a51 100644
--- a/spec/lib/gitlab/database/load_balancing/service_discovery_spec.rb
+++ b/spec/lib/gitlab/database/load_balancing/service_discovery_spec.rb
@@ -58,14 +58,14 @@ RSpec.describe Gitlab::Database::LoadBalancing::ServiceDiscovery, feature_catego
end
end
- describe '#start' do
+ describe '#start', :freeze_time do
before do
allow(service)
.to receive(:loop)
.and_yield
end
- it 'starts service discovery in a new thread' do
+ it 'starts service discovery in a new thread with proper assignments' do
expect(Thread).to receive(:new).ordered.and_call_original # Thread starts
expect(service).to receive(:perform_service_discovery).ordered.and_return(5)
@@ -73,6 +73,9 @@ RSpec.describe Gitlab::Database::LoadBalancing::ServiceDiscovery, feature_catego
expect(service).to receive(:sleep).ordered.with(7) # Sleep runs after thread starts
service.start.join
+
+ expect(service.refresh_thread_last_run).to eq(Time.current)
+ expect(service.refresh_thread).to be_present
end
end
@@ -142,21 +145,6 @@ RSpec.describe Gitlab::Database::LoadBalancing::ServiceDiscovery, feature_catego
service.perform_service_discovery
end
end
-
- context 'with Exception' do
- it 'logs error and re-raises the exception' do
- error = Exception.new('uncaught-test-error')
-
- expect(service).to receive(:refresh_if_necessary).and_raise(error)
-
- expect(Gitlab::Database::LoadBalancing::Logger).to receive(:error).with(
- event: :service_discovery_unexpected_exception,
- message: "Service discovery encountered an uncaught error: uncaught-test-error"
- )
-
- expect { service.perform_service_discovery }.to raise_error(Exception, error.message)
- end
- end
end
describe '#refresh_if_necessary' do
@@ -427,4 +415,64 @@ RSpec.describe Gitlab::Database::LoadBalancing::ServiceDiscovery, feature_catego
end
end
end
+
+ describe '#log_refresh_thread_interruption' do
+ before do
+ service.refresh_thread = refresh_thread
+ service.refresh_thread_last_run = last_run_timestamp
+ end
+
+ let(:refresh_thread) { nil }
+ let(:last_run_timestamp) { nil }
+
+ subject { service.log_refresh_thread_interruption }
+
+ context 'without refresh thread timestamp' do
+ it 'does not log any interruption' do
+ expect(service.refresh_thread_last_run).to be_nil
+
+ expect(Gitlab::Database::LoadBalancing::Logger).not_to receive(:error)
+
+ subject
+ end
+ end
+
+ context 'with refresh thread timestamp' do
+ let(:last_run_timestamp) { Time.current }
+
+ it 'does not log if last run time plus delta is in future' do
+ expect(Gitlab::Database::LoadBalancing::Logger).not_to receive(:error)
+
+ subject
+ end
+
+ context 'with way past last run timestamp' do
+ let(:refresh_thread) { instance_double(Thread, status: :run, backtrace: %w[backtrace foo]) }
+ let(:last_run_timestamp) { 20.minutes.before + described_class::DISCOVERY_THREAD_REFRESH_DELTA.minutes }
+
+ it 'does not log if the interruption is already logged' do
+ service.refresh_thread_interruption_logged = true
+
+ expect(Gitlab::Database::LoadBalancing::Logger).not_to receive(:error)
+
+ subject
+ end
+
+ it 'logs the error if the interruption was not logged before' do
+ expect(service.refresh_thread_interruption_logged).not_to be_present
+
+ expect(Gitlab::Database::LoadBalancing::Logger).to receive(:error).with(
+ event: :service_discovery_refresh_thread_interrupt,
+ refresh_thread_last_run: last_run_timestamp,
+ thread_status: refresh_thread.status.to_s,
+ thread_backtrace: 'backtrace\nfoo'
+ )
+
+ subject
+
+ expect(service.refresh_thread_interruption_logged).to be_truthy
+ end
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/database/migration_helpers/automatic_lock_writes_on_tables_spec.rb b/spec/lib/gitlab/database/migration_helpers/automatic_lock_writes_on_tables_spec.rb
index e4241348b54..577bf00ba2f 100644
--- a/spec/lib/gitlab/database/migration_helpers/automatic_lock_writes_on_tables_spec.rb
+++ b/spec/lib/gitlab/database/migration_helpers/automatic_lock_writes_on_tables_spec.rb
@@ -9,7 +9,10 @@ RSpec.describe Gitlab::Database::MigrationHelpers::AutomaticLockWritesOnTables,
let(:schema_class) { Class.new(Gitlab::Database::Migration[2.1]) }
let(:skip_automatic_lock_on_writes) { false }
let(:gitlab_main_table_name) { :_test_gitlab_main_table }
+ let(:gitlab_main_clusterwide_table_name) { :_test_gitlab_main_clusterwide_table }
+ let(:gitlab_main_cell_table_name) { :_test_gitlab_main_cell_table }
let(:gitlab_ci_table_name) { :_test_gitlab_ci_table }
+ let(:gitlab_pm_table_name) { :_test_gitlab_pm_table }
let(:gitlab_geo_table_name) { :_test_gitlab_geo_table }
let(:gitlab_shared_table_name) { :_test_table }
@@ -24,8 +27,11 @@ RSpec.describe Gitlab::Database::MigrationHelpers::AutomaticLockWritesOnTables,
# Drop the created test tables, because we use non-transactional tests
after do
drop_table_if_exists(gitlab_main_table_name)
+ drop_table_if_exists(gitlab_main_clusterwide_table_name)
+ drop_table_if_exists(gitlab_main_cell_table_name)
drop_table_if_exists(gitlab_ci_table_name)
drop_table_if_exists(gitlab_geo_table_name)
+ drop_table_if_exists(gitlab_pm_table_name)
drop_table_if_exists(gitlab_shared_table_name)
drop_table_if_exists(renamed_gitlab_main_table_name)
drop_table_if_exists(renamed_gitlab_ci_table_name)
@@ -82,8 +88,12 @@ RSpec.describe Gitlab::Database::MigrationHelpers::AutomaticLockWritesOnTables,
context 'when single database' do
let(:config_model) { Gitlab::Database.database_base_models[:main] }
let(:create_gitlab_main_table_migration_class) { create_table_migration(gitlab_main_table_name) }
+ let(:create_gitlab_main_cell_table_migration_class) { create_table_migration(gitlab_main_cell_table_name) }
let(:create_gitlab_ci_table_migration_class) { create_table_migration(gitlab_ci_table_name) }
let(:create_gitlab_shared_table_migration_class) { create_table_migration(gitlab_shared_table_name) }
+ let(:create_gitlab_main_clusterwide_table_migration_class) do
+ create_table_migration(gitlab_main_clusterwide_table_name)
+ end
before do
skip_if_database_exists(:ci)
@@ -93,13 +103,19 @@ RSpec.describe Gitlab::Database::MigrationHelpers::AutomaticLockWritesOnTables,
expect(Gitlab::Database::LockWritesManager).not_to receive(:new)
create_gitlab_main_table_migration_class.migrate(:up)
+ create_gitlab_main_cell_table_migration_class.migrate(:up)
+ create_gitlab_main_clusterwide_table_migration_class.migrate(:up)
create_gitlab_ci_table_migration_class.migrate(:up)
create_gitlab_shared_table_migration_class.migrate(:up)
expect do
create_gitlab_main_table_migration_class.connection.execute("DELETE FROM #{gitlab_main_table_name}")
+ create_gitlab_main_cell_table_migration_class.connection.execute("DELETE FROM #{gitlab_main_cell_table_name}")
create_gitlab_ci_table_migration_class.connection.execute("DELETE FROM #{gitlab_ci_table_name}")
create_gitlab_shared_table_migration_class.connection.execute("DELETE FROM #{gitlab_shared_table_name}")
+ create_gitlab_main_clusterwide_table_migration_class.connection.execute(
+ "DELETE FROM #{gitlab_main_clusterwide_table_name}"
+ )
end.not_to raise_error
end
end
@@ -163,6 +179,27 @@ RSpec.describe Gitlab::Database::MigrationHelpers::AutomaticLockWritesOnTables,
end
end
+ context 'for creating a gitlab_main_clusterwide table' do
+ let(:table_name) { gitlab_main_clusterwide_table_name }
+
+ it_behaves_like 'does not lock writes on table', Gitlab::Database.database_base_models[:main]
+ it_behaves_like 'locks writes on table', Gitlab::Database.database_base_models[:ci]
+ end
+
+ context 'for creating a gitlab_main_cell table' do
+ let(:table_name) { gitlab_main_cell_table_name }
+
+ it_behaves_like 'does not lock writes on table', Gitlab::Database.database_base_models[:main]
+ it_behaves_like 'locks writes on table', Gitlab::Database.database_base_models[:ci]
+ end
+
+ context 'for creating a gitlab_pm table' do
+ let(:table_name) { gitlab_pm_table_name }
+
+ it_behaves_like 'does not lock writes on table', Gitlab::Database.database_base_models[:main]
+ it_behaves_like 'locks writes on table', Gitlab::Database.database_base_models[:ci]
+ end
+
context 'for creating a gitlab_ci table' do
let(:table_name) { gitlab_ci_table_name }
diff --git a/spec/lib/gitlab/database/migrations/lock_retry_mixin_spec.rb b/spec/lib/gitlab/database/migrations/lock_retry_mixin_spec.rb
index 6092d985ce8..dcc088c2e21 100644
--- a/spec/lib/gitlab/database/migrations/lock_retry_mixin_spec.rb
+++ b/spec/lib/gitlab/database/migrations/lock_retry_mixin_spec.rb
@@ -71,7 +71,7 @@ RSpec.describe Gitlab::Database::Migrations::LockRetryMixin do
def use_transaction?(migration)
receiver.use_transaction?(migration)
end
- end.prepend(Gitlab::Database::Migrations::LockRetryMixin::ActiveRecordMigratorLockRetries)
+ end.prepend(described_class)
end
subject { class_def.new(receiver) }
diff --git a/spec/lib/gitlab/database/migrations/redis_helpers_spec.rb b/spec/lib/gitlab/database/migrations/redis_helpers_spec.rb
new file mode 100644
index 00000000000..5f3a48289e2
--- /dev/null
+++ b/spec/lib/gitlab/database/migrations/redis_helpers_spec.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+
+RSpec.describe Gitlab::Database::Migrations::RedisHelpers, feature_category: :redis do
+ let(:migration) do
+ ActiveRecord::Migration.new.extend(described_class)
+ end
+
+ describe "#queue_redis_migration_job" do
+ let(:job_name) { 'SampleJob' }
+
+ subject { migration.queue_redis_migration_job(job_name) }
+
+ context 'when migrator does not exist' do
+ it 'raises error and fails the migration' do
+ expect { subject }.to raise_error(NotImplementedError)
+ end
+ end
+
+ context 'when migrator exists' do
+ before do
+ allow(RedisMigrationWorker).to receive(:fetch_migrator!)
+ end
+
+ it 'checks migrator and enqueues job' do
+ expect(RedisMigrationWorker).to receive(:perform_async).with(job_name, '0')
+
+ subject
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/database/migrations/test_batched_background_runner_spec.rb b/spec/lib/gitlab/database/migrations/test_batched_background_runner_spec.rb
index 6bcefa455cf..31a194ae883 100644
--- a/spec/lib/gitlab/database/migrations/test_batched_background_runner_spec.rb
+++ b/spec/lib/gitlab/database/migrations/test_batched_background_runner_spec.rb
@@ -153,6 +153,25 @@ RSpec.describe Gitlab::Database::Migrations::TestBatchedBackgroundRunner, :freez
expect(calls.size).to eq(1)
end
+ it 'does not sample a job if there are zero rows to sample' do
+ calls = []
+ define_background_migration(migration_name, with_base_class: true, scoping: ->(relation) {
+ relation.none
+ }) do |*args|
+ calls << args
+ end
+
+ queue_migration(migration_name, table_name, :id,
+ job_interval: 5.minutes,
+ batch_size: num_rows_in_table * 2,
+ sub_batch_size: num_rows_in_table * 2)
+
+ described_class.new(result_dir: result_dir, connection: connection,
+ from_id: from_id).run_jobs(for_duration: 3.minutes)
+
+ expect(calls.count).to eq(0)
+ end
+
context 'with multiple jobs to run' do
let(:last_id) do
Gitlab::Database::SharedModel.using_connection(connection) do
diff --git a/spec/lib/gitlab/database/partitioning_spec.rb b/spec/lib/gitlab/database/partitioning_spec.rb
index 8724716dd3d..a1ae75ac916 100644
--- a/spec/lib/gitlab/database/partitioning_spec.rb
+++ b/spec/lib/gitlab/database/partitioning_spec.rb
@@ -257,7 +257,7 @@ RSpec.describe Gitlab::Database::Partitioning, feature_category: :database do
end
it 'drops detached partitions for each database' do
- expect(Gitlab::Database::EachDatabase).to receive(:each_database_connection).and_yield
+ expect(Gitlab::Database::EachDatabase).to receive(:each_connection).and_yield
expect { described_class.drop_detached_partitions }
.to change { Postgresql::DetachedPartition.count }.from(2).to(0)
diff --git a/spec/lib/gitlab/database/postgresql_adapter/empty_query_ping_spec.rb b/spec/lib/gitlab/database/postgresql_adapter/empty_query_ping_spec.rb
deleted file mode 100644
index 6e1e53e0e41..00000000000
--- a/spec/lib/gitlab/database/postgresql_adapter/empty_query_ping_spec.rb
+++ /dev/null
@@ -1,43 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::PostgresqlAdapter::EmptyQueryPing do
- describe '#active?' do
- let(:adapter_class) do
- Class.new do
- include Gitlab::Database::PostgresqlAdapter::EmptyQueryPing
-
- def initialize(connection, lock)
- @connection = connection
- @lock = lock
- end
- end
- end
-
- subject { adapter_class.new(connection, lock).active? }
-
- let(:connection) { double(query: nil) }
- let(:lock) { double }
-
- before do
- allow(lock).to receive(:synchronize).and_yield
- end
-
- it 'uses an empty query to check liveness' do
- expect(connection).to receive(:query).with(';')
-
- subject
- end
-
- it 'returns true if no error was signaled' do
- expect(subject).to be_truthy
- end
-
- it 'returns false when an error occurs' do
- expect(lock).to receive(:synchronize).and_raise(PG::Error)
-
- expect(subject).to be_falsey
- end
- end
-end
diff --git a/spec/lib/gitlab/database/postgresql_adapter/type_map_cache_spec.rb b/spec/lib/gitlab/database/postgresql_adapter/type_map_cache_spec.rb
index c6542aa2adb..75c3a3650d7 100644
--- a/spec/lib/gitlab/database/postgresql_adapter/type_map_cache_spec.rb
+++ b/spec/lib/gitlab/database/postgresql_adapter/type_map_cache_spec.rb
@@ -13,7 +13,7 @@ RSpec.describe Gitlab::Database::PostgresqlAdapter::TypeMapCache do
describe '#initialize_type_map' do
it 'caches loading of types in memory' do
recorder_without_cache = ActiveRecord::QueryRecorder.new(skip_schema_queries: false) { initialize_connection.disconnect! }
- expect(recorder_without_cache.log).to include(a_string_matching(/FROM pg_type/)).twice
+ expect(recorder_without_cache.log).to include(a_string_matching(/FROM pg_type/)).exactly(4).times
recorder_with_cache = ActiveRecord::QueryRecorder.new(skip_schema_queries: false) { initialize_connection.disconnect! }
@@ -33,7 +33,7 @@ RSpec.describe Gitlab::Database::PostgresqlAdapter::TypeMapCache do
recorder = ActiveRecord::QueryRecorder.new(skip_schema_queries: false) { initialize_connection(other_config).disconnect! }
- expect(recorder.log).to include(a_string_matching(/FROM pg_type/)).twice
+ expect(recorder.log).to include(a_string_matching(/FROM pg_type/)).exactly(4).times
end
end
@@ -44,7 +44,7 @@ RSpec.describe Gitlab::Database::PostgresqlAdapter::TypeMapCache do
connection = initialize_connection
recorder = ActiveRecord::QueryRecorder.new(skip_schema_queries: false) { connection.reload_type_map }
- expect(recorder.log).to include(a_string_matching(/FROM pg_type/)).once
+ expect(recorder.log).to include(a_string_matching(/FROM pg_type/)).exactly(3).times
end
end
diff --git a/spec/lib/gitlab/database/reindexing_spec.rb b/spec/lib/gitlab/database/reindexing_spec.rb
index 4d0e58b0937..851fc7ea3cd 100644
--- a/spec/lib/gitlab/database/reindexing_spec.rb
+++ b/spec/lib/gitlab/database/reindexing_spec.rb
@@ -99,14 +99,14 @@ RSpec.describe Gitlab::Database::Reindexing, feature_category: :database, time_t
end
before do
- allow(Gitlab::Database::Reindexing).to receive(:cleanup_leftovers!)
- allow(Gitlab::Database::Reindexing).to receive(:perform_from_queue).and_return(0)
- allow(Gitlab::Database::Reindexing).to receive(:perform_with_heuristic).and_return(0)
+ allow(described_class).to receive(:cleanup_leftovers!)
+ allow(described_class).to receive(:perform_from_queue).and_return(0)
+ allow(described_class).to receive(:perform_with_heuristic).and_return(0)
end
it 'cleans up leftovers, before consuming the queue' do
- expect(Gitlab::Database::Reindexing).to receive(:cleanup_leftovers!).ordered
- expect(Gitlab::Database::Reindexing).to receive(:perform_from_queue).ordered
+ expect(described_class).to receive(:cleanup_leftovers!).ordered
+ expect(described_class).to receive(:perform_from_queue).ordered
subject
end
@@ -120,8 +120,8 @@ RSpec.describe Gitlab::Database::Reindexing, feature_category: :database, time_t
let(:limit) { 1 }
it 'does not perform reindexing with heuristic' do
- expect(Gitlab::Database::Reindexing).to receive(:perform_from_queue).and_return(limit)
- expect(Gitlab::Database::Reindexing).not_to receive(:perform_with_heuristic)
+ expect(described_class).to receive(:perform_from_queue).and_return(limit)
+ expect(described_class).not_to receive(:perform_with_heuristic)
subject
end
@@ -131,8 +131,8 @@ RSpec.describe Gitlab::Database::Reindexing, feature_category: :database, time_t
let(:limit) { 2 }
it 'continues if the queue did not have enough records' do
- expect(Gitlab::Database::Reindexing).to receive(:perform_from_queue).ordered.and_return(1)
- expect(Gitlab::Database::Reindexing).to receive(:perform_with_heuristic).with(maximum_records: 1).ordered
+ expect(described_class).to receive(:perform_from_queue).ordered.and_return(1)
+ expect(described_class).to receive(:perform_with_heuristic).with(maximum_records: 1).ordered
subject
end
diff --git a/spec/lib/gitlab/database/schema_validation/adapters/column_database_adapter_spec.rb b/spec/lib/gitlab/database/schema_validation/adapters/column_database_adapter_spec.rb
deleted file mode 100644
index d81f5f3dbec..00000000000
--- a/spec/lib/gitlab/database/schema_validation/adapters/column_database_adapter_spec.rb
+++ /dev/null
@@ -1,72 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::SchemaValidation::Adapters::ColumnDatabaseAdapter, feature_category: :database do
- subject(:adapter) { described_class.new(db_result) }
-
- let(:column_name) { 'email' }
- let(:column_default) { "'no-reply@gitlab.com'::character varying" }
- let(:not_null) { true }
- let(:partition_key) { false }
- let(:db_result) do
- {
- 'table_name' => 'projects',
- 'column_name' => column_name,
- 'data_type' => 'character varying',
- 'column_default' => column_default,
- 'not_null' => not_null,
- 'partition_key' => partition_key
- }
- end
-
- describe '#name' do
- it { expect(adapter.name).to eq('email') }
- end
-
- describe '#table_name' do
- it { expect(adapter.table_name).to eq('projects') }
- end
-
- describe '#data_type' do
- it { expect(adapter.data_type).to eq('character varying') }
- end
-
- describe '#default' do
- context "when there's no default value in the column" do
- let(:column_default) { nil }
-
- it { expect(adapter.default).to be_nil }
- end
-
- context 'when the column name is id' do
- let(:column_name) { 'id' }
-
- it { expect(adapter.default).to be_nil }
- end
-
- context 'when the column default includes nextval' do
- let(:column_default) { "nextval('my_seq'::regclass)" }
-
- it { expect(adapter.default).to be_nil }
- end
-
- it { expect(adapter.default).to eq("DEFAULT 'no-reply@gitlab.com'::character varying") }
- end
-
- describe '#nullable' do
- context 'when column is not null' do
- it { expect(adapter.nullable).to eq('NOT NULL') }
- end
-
- context 'when column is nullable' do
- let(:not_null) { false }
-
- it { expect(adapter.nullable).to be_nil }
- end
- end
-
- describe '#partition_key?' do
- it { expect(adapter.partition_key?).to be(false) }
- end
-end
diff --git a/spec/lib/gitlab/database/schema_validation/adapters/column_structure_sql_adapter_spec.rb b/spec/lib/gitlab/database/schema_validation/adapters/column_structure_sql_adapter_spec.rb
deleted file mode 100644
index 64b59e65be6..00000000000
--- a/spec/lib/gitlab/database/schema_validation/adapters/column_structure_sql_adapter_spec.rb
+++ /dev/null
@@ -1,78 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::SchemaValidation::Adapters::ColumnStructureSqlAdapter, feature_category: :database do
- subject(:adapter) { described_class.new(table_name, column_def, partition_stmt) }
-
- let(:table_name) { 'test_table' }
- let(:file_path) { Rails.root.join('spec/fixtures/structure.sql') }
- let(:table_stmts) { PgQuery.parse(File.read(file_path)).tree.stmts.filter_map { |s| s.stmt.create_stmt } }
- let(:table) { table_stmts.find { |table| table.relation.relname == table_name } }
- let(:partition_stmt) { table.partspec }
- let(:column_stmts) { table.table_elts }
- let(:column_def) { column_stmts.find { |col| col.column_def.colname == column_name }.column_def }
-
- where(:column_name, :data_type, :default_value, :nullable, :partition_key) do
- [
- ['id', 'bigint', nil, 'NOT NULL', false],
- ['integer_column', 'integer', nil, nil, false],
- ['integer_with_default_column', 'integer', 'DEFAULT 1', nil, false],
- ['smallint_with_default_column', 'smallint', 'DEFAULT 0', 'NOT NULL', false],
- ['double_precision_with_default_column', 'double precision', 'DEFAULT 1.0', nil, false],
- ['numeric_with_default_column', 'numeric', 'DEFAULT 1.0', 'NOT NULL', false],
- ['boolean_with_default_colum', 'boolean', 'DEFAULT true', 'NOT NULL', false],
- ['varying_with_default_column', 'character varying', "DEFAULT 'DEFAULT'::character varying", 'NOT NULL', false],
- ['varying_with_limit_and_default_column', 'character varying(255)', "DEFAULT 'DEFAULT'::character varying",
- nil, false],
- ['text_with_default_column', 'text', "DEFAULT ''::text", 'NOT NULL', false],
- ['array_with_default_column', 'character varying(255)[]', "DEFAULT '{one,two}'::character varying[]",
- 'NOT NULL', false],
- ['jsonb_with_default_column', 'jsonb', "DEFAULT '[]'::jsonb", 'NOT NULL', false],
- ['timestamptz_with_default_column', 'timestamp(6) with time zone', "DEFAULT now()", nil, false],
- ['timestamp_with_default_column', 'timestamp(6) without time zone',
- "DEFAULT '2022-01-23 00:00:00+00'::timestamp without time zone", 'NOT NULL', false],
- ['date_with_default_column', 'date', 'DEFAULT 2023-04-05', nil, false],
- ['inet_with_default_column', 'inet', "DEFAULT '0.0.0.0'::inet", 'NOT NULL', false],
- ['macaddr_with_default_column', 'macaddr', "DEFAULT '00-00-00-00-00-000'::macaddr", 'NOT NULL', false],
- ['uuid_with_default_column', 'uuid', "DEFAULT '00000000-0000-0000-0000-000000000000'::uuid", 'NOT NULL', false],
- ['partition_key', 'bigint', 'DEFAULT 1', 'NOT NULL', true],
- ['created_at', 'timestamp with time zone', 'DEFAULT now()', 'NOT NULL', true]
- ]
- end
-
- with_them do
- describe '#name' do
- it { expect(adapter.name).to eq(column_name) }
- end
-
- describe '#table_name' do
- it { expect(adapter.table_name).to eq(table_name) }
- end
-
- describe '#data_type' do
- it { expect(adapter.data_type).to eq(data_type) }
- end
-
- describe '#nullable' do
- it { expect(adapter.nullable).to eq(nullable) }
- end
-
- describe '#default' do
- it { expect(adapter.default).to eq(default_value) }
- end
-
- describe '#partition_key?' do
- it { expect(adapter.partition_key?).to eq(partition_key) }
- end
- end
-
- context 'when the data type is not mapped' do
- let(:column_name) { 'unmapped_column_type' }
- let(:error_class) { Gitlab::Database::SchemaValidation::Adapters::UndefinedPGType }
-
- describe '#data_type' do
- it { expect { adapter.data_type }.to raise_error(error_class) }
- end
- end
-end
diff --git a/spec/lib/gitlab/database/schema_validation/adapters/foreign_key_database_adapter_spec.rb b/spec/lib/gitlab/database/schema_validation/adapters/foreign_key_database_adapter_spec.rb
deleted file mode 100644
index cfe5572fb51..00000000000
--- a/spec/lib/gitlab/database/schema_validation/adapters/foreign_key_database_adapter_spec.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::SchemaValidation::Adapters::ForeignKeyDatabaseAdapter, feature_category: :database do
- subject(:adapter) { described_class.new(query_result) }
-
- let(:query_result) do
- {
- 'schema' => 'public',
- 'foreign_key_name' => 'fk_2e88fb7ce9',
- 'table_name' => 'members',
- 'foreign_key_definition' => 'FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE'
- }
- end
-
- describe '#name' do
- it { expect(adapter.name).to eq('public.fk_2e88fb7ce9') }
- end
-
- describe '#table_name' do
- it { expect(adapter.table_name).to eq('members') }
- end
-
- describe '#statement' do
- it { expect(adapter.statement).to eq('FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE') }
- end
-end
diff --git a/spec/lib/gitlab/database/schema_validation/adapters/foreign_key_structure_sql_adapter_spec.rb b/spec/lib/gitlab/database/schema_validation/adapters/foreign_key_structure_sql_adapter_spec.rb
deleted file mode 100644
index f7ae0c0f892..00000000000
--- a/spec/lib/gitlab/database/schema_validation/adapters/foreign_key_structure_sql_adapter_spec.rb
+++ /dev/null
@@ -1,42 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::SchemaValidation::Adapters::ForeignKeyStructureSqlAdapter, feature_category: :database do
- subject(:adapter) { described_class.new(stmt) }
-
- let(:stmt) { PgQuery.parse(sql).tree.stmts.first.stmt.alter_table_stmt }
-
- where(:sql, :name, :table_name, :statement) do
- [
- [
- 'ALTER TABLE ONLY public.issues ADD CONSTRAINT fk_05f1e72feb FOREIGN KEY (author_id) REFERENCES users (id) ' \
- 'ON DELETE SET NULL',
- 'public.fk_05f1e72feb',
- 'issues',
- 'FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE SET NULL'
- ],
- [
- 'ALTER TABLE public.import_failures ADD CONSTRAINT fk_9a9b9ba21c FOREIGN KEY (user_id) REFERENCES users(id) ' \
- 'ON DELETE CASCADE',
- 'public.fk_9a9b9ba21c',
- 'import_failures',
- 'FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE'
- ]
- ]
- end
-
- with_them do
- describe '#name' do
- it { expect(adapter.name).to eq(name) }
- end
-
- describe '#table_name' do
- it { expect(adapter.table_name).to eq(table_name) }
- end
-
- describe '#statement' do
- it { expect(adapter.statement).to eq(statement) }
- end
- end
-end
diff --git a/spec/lib/gitlab/database/schema_validation/database_spec.rb b/spec/lib/gitlab/database/schema_validation/database_spec.rb
deleted file mode 100644
index 0b5f433b1c9..00000000000
--- a/spec/lib/gitlab/database/schema_validation/database_spec.rb
+++ /dev/null
@@ -1,93 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.shared_examples 'database schema assertions for' do |fetch_by_name_method, exists_method, all_objects_method|
- subject(:database) { described_class.new(connection) }
-
- let(:database_model) { Gitlab::Database.database_base_models['main'] }
- let(:connection) { database_model.connection }
-
- before do
- allow(connection).to receive(:select_rows).and_return(results)
- allow(connection).to receive(:exec_query).and_return(results)
- end
-
- describe "##{fetch_by_name_method}" do
- it 'returns nil when schema object does not exists' do
- expect(database.public_send(fetch_by_name_method, 'invalid-object-name')).to be_nil
- end
-
- it 'returns the schema object by name' do
- expect(database.public_send(fetch_by_name_method, valid_schema_object_name).name).to eq(valid_schema_object_name)
- end
- end
-
- describe "##{exists_method}" do
- it 'returns true when schema object exists' do
- expect(database.public_send(exists_method, valid_schema_object_name)).to be_truthy
- end
-
- it 'returns false when schema object does not exists' do
- expect(database.public_send(exists_method, 'invalid-object')).to be_falsey
- end
- end
-
- describe "##{all_objects_method}" do
- it 'returns all the schema objects' do
- schema_objects = database.public_send(all_objects_method)
-
- expect(schema_objects).to all(be_a(schema_object))
- expect(schema_objects.map(&:name)).to eq([valid_schema_object_name])
- end
- end
-end
-
-RSpec.describe Gitlab::Database::SchemaValidation::Database, feature_category: :database do
- context 'when having indexes' do
- let(:schema_object) { Gitlab::Database::SchemaValidation::SchemaObjects::Index }
- let(:valid_schema_object_name) { 'index' }
- let(:results) do
- [['index', 'CREATE UNIQUE INDEX "index" ON public.achievements USING btree (namespace_id, lower(name))']]
- end
-
- include_examples 'database schema assertions for', 'fetch_index_by_name', 'index_exists?', 'indexes'
- end
-
- context 'when having triggers' do
- let(:schema_object) { Gitlab::Database::SchemaValidation::SchemaObjects::Trigger }
- let(:valid_schema_object_name) { 'my_trigger' }
- let(:results) do
- [['my_trigger', 'CREATE TRIGGER my_trigger BEFORE INSERT ON todos FOR EACH ROW EXECUTE FUNCTION trigger()']]
- end
-
- include_examples 'database schema assertions for', 'fetch_trigger_by_name', 'trigger_exists?', 'triggers'
- end
-
- context 'when having tables' do
- let(:schema_object) { Gitlab::Database::SchemaValidation::SchemaObjects::Table }
- let(:valid_schema_object_name) { 'my_table' }
- let(:results) do
- [
- {
- 'table_name' => 'my_table',
- 'column_name' => 'id',
- 'not_null' => true,
- 'data_type' => 'bigint',
- 'partition_key' => false,
- 'column_default' => "nextval('audit_events_id_seq'::regclass)"
- },
- {
- 'table_name' => 'my_table',
- 'column_name' => 'details',
- 'not_null' => false,
- 'data_type' => 'text',
- 'partition_key' => false,
- 'column_default' => nil
- }
- ]
- end
-
- include_examples 'database schema assertions for', 'fetch_table_by_name', 'table_exists?', 'tables'
- end
-end
diff --git a/spec/lib/gitlab/database/schema_validation/inconsistency_spec.rb b/spec/lib/gitlab/database/schema_validation/inconsistency_spec.rb
deleted file mode 100644
index a49ff8339a1..00000000000
--- a/spec/lib/gitlab/database/schema_validation/inconsistency_spec.rb
+++ /dev/null
@@ -1,96 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::SchemaValidation::Inconsistency, feature_category: :database do
- let(:validator) { Gitlab::Database::SchemaValidation::Validators::DifferentDefinitionIndexes }
-
- let(:database_statement) { 'CREATE INDEX index_name ON public.achievements USING btree (namespace_id)' }
- let(:structure_sql_statement) { 'CREATE INDEX index_name ON public.achievements USING btree (id)' }
-
- let(:structure_stmt) { PgQuery.parse(structure_sql_statement).tree.stmts.first.stmt.index_stmt }
- let(:database_stmt) { PgQuery.parse(database_statement).tree.stmts.first.stmt.index_stmt }
-
- let(:structure_sql_object) { Gitlab::Database::SchemaValidation::SchemaObjects::Index.new(structure_stmt) }
- let(:database_object) { Gitlab::Database::SchemaValidation::SchemaObjects::Index.new(database_stmt) }
-
- subject(:inconsistency) { described_class.new(validator, structure_sql_object, database_object) }
-
- describe '#object_name' do
- it 'returns the index name' do
- expect(inconsistency.object_name).to eq('index_name')
- end
- end
-
- describe '#diff' do
- it 'returns a diff between the structure.sql and the database' do
- expect(inconsistency.diff).to be_a(Diffy::Diff)
- expect(inconsistency.diff.string1).to eq("#{structure_sql_statement}\n")
- expect(inconsistency.diff.string2).to eq("#{database_statement}\n")
- end
- end
-
- describe '#error_message' do
- it 'returns the error message' do
- stub_const "#{validator}::ERROR_MESSAGE", 'error message %s'
-
- expect(inconsistency.error_message).to eq('error message index_name')
- end
- end
-
- describe '#type' do
- it 'returns the type of the validator' do
- expect(inconsistency.type).to eq('different_definition_indexes')
- end
- end
-
- describe '#table_name' do
- it 'returns the table name' do
- expect(inconsistency.table_name).to eq('achievements')
- end
- end
-
- describe '#object_type' do
- it 'returns the structure sql object type' do
- expect(inconsistency.object_type).to eq('Index')
- end
-
- context 'when the structure sql object is not available' do
- subject(:inconsistency) { described_class.new(validator, nil, database_object) }
-
- it 'returns the database object type' do
- expect(inconsistency.object_type).to eq('Index')
- end
- end
- end
-
- describe '#structure_sql_statement' do
- it 'returns structure sql statement' do
- expect(inconsistency.structure_sql_statement).to eq("#{structure_sql_statement}\n")
- end
- end
-
- describe '#database_statement' do
- it 'returns database statement' do
- expect(inconsistency.database_statement).to eq("#{database_statement}\n")
- end
- end
-
- describe '#inspect' do
- let(:expected_output) do
- <<~MSG
- ------------------------------------------------------
- The index_name index has a different statement between structure.sql and database
- Diff:
- \e[31m-CREATE INDEX index_name ON public.achievements USING btree (id)\e[0m
- \e[32m+CREATE INDEX index_name ON public.achievements USING btree (namespace_id)\e[0m
-
- ------------------------------------------------------
- MSG
- end
-
- it 'prints the inconsistency message' do
- expect(inconsistency.inspect).to eql(expected_output)
- end
- end
-end
diff --git a/spec/lib/gitlab/database/schema_validation/runner_spec.rb b/spec/lib/gitlab/database/schema_validation/runner_spec.rb
deleted file mode 100644
index f5d1c6ba31b..00000000000
--- a/spec/lib/gitlab/database/schema_validation/runner_spec.rb
+++ /dev/null
@@ -1,50 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::SchemaValidation::Runner, feature_category: :database do
- let(:structure_file_path) { Rails.root.join('spec/fixtures/structure.sql') }
- let(:connection) { ActiveRecord::Base.connection }
-
- let(:database) { Gitlab::Database::SchemaValidation::Database.new(connection) }
- let(:structure_sql) { Gitlab::Database::SchemaValidation::StructureSql.new(structure_file_path, 'public') }
-
- describe '#execute' do
- subject(:inconsistencies) { described_class.new(structure_sql, database).execute }
-
- it 'returns inconsistencies' do
- expect(inconsistencies).not_to be_empty
- end
-
- it 'execute all validators' do
- all_validators = Gitlab::Database::SchemaValidation::Validators::BaseValidator.all_validators
-
- expect(all_validators).to all(receive(:new).with(structure_sql, database).and_call_original)
-
- inconsistencies
- end
-
- context 'when validators are passed' do
- subject(:inconsistencies) { described_class.new(structure_sql, database, validators: validators).execute }
-
- let(:class_name) { 'Gitlab::Database::SchemaValidation::Validators::ExtraIndexes' }
- let(:inconsistency_class_name) { 'Gitlab::Database::SchemaValidation::Inconsistency' }
-
- let(:extra_indexes) { class_double(class_name) }
- let(:instace_extra_index) { instance_double(class_name, execute: [inconsistency]) }
- let(:inconsistency) { instance_double(inconsistency_class_name, object_name: 'test') }
-
- let(:validators) { [extra_indexes] }
-
- it 'only execute the validators passed' do
- expect(extra_indexes).to receive(:new).with(structure_sql, database).and_return(instace_extra_index)
-
- Gitlab::Database::SchemaValidation::Validators::BaseValidator.all_validators.each do |validator|
- expect(validator).not_to receive(:new).with(structure_sql, database)
- end
-
- expect(inconsistencies.map(&:object_name)).to eql ['test']
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/database/schema_validation/schema_objects/column_spec.rb b/spec/lib/gitlab/database/schema_validation/schema_objects/column_spec.rb
deleted file mode 100644
index 74bc5f43b50..00000000000
--- a/spec/lib/gitlab/database/schema_validation/schema_objects/column_spec.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::SchemaValidation::SchemaObjects::Column, feature_category: :database do
- subject(:column) { described_class.new(adapter) }
-
- let(:database_adapter) { 'Gitlab::Database::SchemaValidation::Adapters::ColumnDatabaseAdapter' }
- let(:adapter) do
- instance_double(database_adapter, name: 'id', table_name: 'projects',
- data_type: 'bigint', default: nil, nullable: 'NOT NULL')
- end
-
- describe '#name' do
- it { expect(column.name).to eq('id') }
- end
-
- describe '#table_name' do
- it { expect(column.table_name).to eq('projects') }
- end
-
- describe '#statement' do
- it { expect(column.statement).to eq('id bigint NOT NULL') }
- end
-end
diff --git a/spec/lib/gitlab/database/schema_validation/schema_objects/foreign_key_spec.rb b/spec/lib/gitlab/database/schema_validation/schema_objects/foreign_key_spec.rb
deleted file mode 100644
index 7500ad44f82..00000000000
--- a/spec/lib/gitlab/database/schema_validation/schema_objects/foreign_key_spec.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::SchemaValidation::SchemaObjects::ForeignKey, feature_category: :database do
- subject(:foreign_key) { described_class.new(adapter) }
-
- let(:database_adapter) { 'Gitlab::Database::SchemaValidation::Adapters::ForeignKeyDatabaseAdapter' }
- let(:adapter) do
- instance_double(database_adapter, name: 'public.fk_1d37cddf91', table_name: 'vulnerabilities',
- statement: 'FOREIGN KEY (epic_id) REFERENCES epics(id) ON DELETE SET NULL')
- end
-
- describe '#name' do
- it { expect(foreign_key.name).to eq('public.fk_1d37cddf91') }
- end
-
- describe '#table_name' do
- it { expect(foreign_key.table_name).to eq('vulnerabilities') }
- end
-
- describe '#statement' do
- it { expect(foreign_key.statement).to eq('FOREIGN KEY (epic_id) REFERENCES epics(id) ON DELETE SET NULL') }
- end
-end
diff --git a/spec/lib/gitlab/database/schema_validation/schema_objects/index_spec.rb b/spec/lib/gitlab/database/schema_validation/schema_objects/index_spec.rb
deleted file mode 100644
index 43d8fa38ec8..00000000000
--- a/spec/lib/gitlab/database/schema_validation/schema_objects/index_spec.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::SchemaValidation::SchemaObjects::Index, feature_category: :database do
- let(:statement) { 'CREATE INDEX index_name ON public.achievements USING btree (namespace_id)' }
- let(:name) { 'index_name' }
- let(:table_name) { 'achievements' }
-
- include_examples 'schema objects assertions for', 'index_stmt'
-end
diff --git a/spec/lib/gitlab/database/schema_validation/schema_objects/table_spec.rb b/spec/lib/gitlab/database/schema_validation/schema_objects/table_spec.rb
deleted file mode 100644
index 60ea9581517..00000000000
--- a/spec/lib/gitlab/database/schema_validation/schema_objects/table_spec.rb
+++ /dev/null
@@ -1,45 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::SchemaValidation::SchemaObjects::Table, feature_category: :database do
- subject(:table) { described_class.new(name, columns) }
-
- let(:name) { 'my_table' }
- let(:column_class) { 'Gitlab::Database::SchemaValidation::SchemaObjects::Column' }
- let(:columns) do
- [
- instance_double(column_class, name: 'id', statement: 'id bigint NOT NULL', partition_key?: false),
- instance_double(column_class, name: 'col', statement: 'col text', partition_key?: false),
- instance_double(column_class, name: 'partition', statement: 'partition integer DEFAULT 1', partition_key?: true)
- ]
- end
-
- describe '#name' do
- it { expect(table.name).to eq('my_table') }
- end
-
- describe '#table_name' do
- it { expect(table.table_name).to eq('my_table') }
- end
-
- describe '#statement' do
- it { expect(table.statement).to eq('CREATE TABLE my_table (id bigint NOT NULL, col text)') }
-
- it 'ignores the partition column' do
- expect(table.statement).not_to include('partition integer DEFAULT 1')
- end
- end
-
- describe '#fetch_column_by_name' do
- it { expect(table.fetch_column_by_name('col')).not_to be_nil }
-
- it { expect(table.fetch_column_by_name('invalid')).to be_nil }
- end
-
- describe '#column_exists?' do
- it { expect(table.column_exists?('col')).to eq(true) }
-
- it { expect(table.column_exists?('invalid')).to eq(false) }
- end
-end
diff --git a/spec/lib/gitlab/database/schema_validation/schema_objects/trigger_spec.rb b/spec/lib/gitlab/database/schema_validation/schema_objects/trigger_spec.rb
deleted file mode 100644
index 3c2481dfae0..00000000000
--- a/spec/lib/gitlab/database/schema_validation/schema_objects/trigger_spec.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::SchemaValidation::SchemaObjects::Trigger, feature_category: :database do
- let(:statement) { 'CREATE TRIGGER my_trigger BEFORE INSERT ON todos FOR EACH ROW EXECUTE FUNCTION trigger()' }
- let(:name) { 'my_trigger' }
- let(:table_name) { 'todos' }
-
- include_examples 'schema objects assertions for', 'create_trig_stmt'
-end
diff --git a/spec/lib/gitlab/database/schema_validation/structure_sql_spec.rb b/spec/lib/gitlab/database/schema_validation/structure_sql_spec.rb
deleted file mode 100644
index b0c056ff5db..00000000000
--- a/spec/lib/gitlab/database/schema_validation/structure_sql_spec.rb
+++ /dev/null
@@ -1,66 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.shared_examples 'structure sql schema assertions for' do |object_exists_method, all_objects_method|
- subject(:structure_sql) { described_class.new(structure_file_path, schema_name) }
-
- let(:structure_file_path) { Rails.root.join('spec/fixtures/structure.sql') }
- let(:schema_name) { 'public' }
-
- describe "##{object_exists_method}" do
- it 'returns true when schema object exists' do
- expect(structure_sql.public_send(object_exists_method, valid_schema_object_name)).to be_truthy
- end
-
- it 'returns false when schema object does not exists' do
- expect(structure_sql.public_send(object_exists_method, 'invalid-object-name')).to be_falsey
- end
- end
-
- describe "##{all_objects_method}" do
- it 'returns all the schema objects' do
- schema_objects = structure_sql.public_send(all_objects_method)
-
- expect(schema_objects).to all(be_a(schema_object))
- expect(schema_objects.map(&:name)).to eq(expected_objects)
- end
- end
-end
-
-RSpec.describe Gitlab::Database::SchemaValidation::StructureSql, feature_category: :database do
- let(:structure_file_path) { Rails.root.join('spec/fixtures/structure.sql') }
- let(:schema_name) { 'public' }
-
- subject(:structure_sql) { described_class.new(structure_file_path, schema_name) }
-
- context 'when having indexes' do
- let(:schema_object) { Gitlab::Database::SchemaValidation::SchemaObjects::Index }
- let(:valid_schema_object_name) { 'index' }
- let(:expected_objects) do
- %w[missing_index wrong_index index index_namespaces_public_groups_name_id
- index_on_deploy_keys_id_and_type_and_public index_users_on_public_email_excluding_null_and_empty]
- end
-
- include_examples 'structure sql schema assertions for', 'index_exists?', 'indexes'
- end
-
- context 'when having triggers' do
- let(:schema_object) { Gitlab::Database::SchemaValidation::SchemaObjects::Trigger }
- let(:valid_schema_object_name) { 'trigger' }
- let(:expected_objects) { %w[trigger wrong_trigger missing_trigger_1 projects_loose_fk_trigger] }
-
- include_examples 'structure sql schema assertions for', 'trigger_exists?', 'triggers'
- end
-
- context 'when having tables' do
- let(:schema_object) { Gitlab::Database::SchemaValidation::SchemaObjects::Table }
- let(:valid_schema_object_name) { 'test_table' }
- let(:expected_objects) do
- %w[test_table ci_project_mirrors wrong_table extra_table_columns missing_table missing_table_columns
- operations_user_lists]
- end
-
- include_examples 'structure sql schema assertions for', 'table_exists?', 'tables'
- end
-end
diff --git a/spec/lib/gitlab/database/schema_validation/track_inconsistency_spec.rb b/spec/lib/gitlab/database/schema_validation/track_inconsistency_spec.rb
deleted file mode 100644
index 0b104e40c11..00000000000
--- a/spec/lib/gitlab/database/schema_validation/track_inconsistency_spec.rb
+++ /dev/null
@@ -1,185 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::SchemaValidation::TrackInconsistency, feature_category: :database do
- describe '#execute' do
- let(:validator) { Gitlab::Database::SchemaValidation::Validators::DifferentDefinitionIndexes }
-
- let(:database_statement) { 'CREATE INDEX index_name ON public.achievements USING btree (namespace_id)' }
- let(:structure_sql_statement) { 'CREATE INDEX index_name ON public.achievements USING btree (id)' }
-
- let(:structure_stmt) { PgQuery.parse(structure_sql_statement).tree.stmts.first.stmt.index_stmt }
- let(:database_stmt) { PgQuery.parse(database_statement).tree.stmts.first.stmt.index_stmt }
-
- let(:structure_sql_object) { Gitlab::Database::SchemaValidation::SchemaObjects::Index.new(structure_stmt) }
- let(:database_object) { Gitlab::Database::SchemaValidation::SchemaObjects::Index.new(database_stmt) }
-
- let(:inconsistency) do
- Gitlab::Database::SchemaValidation::Inconsistency.new(validator, structure_sql_object, database_object)
- end
-
- let_it_be(:project) { create(:project) }
- let_it_be(:user) { create(:user) }
-
- subject(:execute) { described_class.new(inconsistency, project, user).execute }
-
- context 'when is not GitLab.com' do
- it 'does not create a schema inconsistency record' do
- allow(Gitlab).to receive(:com?).and_return(false)
-
- expect { execute }.not_to change { Gitlab::Database::SchemaValidation::SchemaInconsistency.count }
- end
- end
-
- context 'when the issue creation fails' do
- let(:issue_creation) { instance_double(Mutations::Issues::Create, resolve: { errors: 'error' }) }
-
- let(:convert_object) do
- instance_double('Gitlab::Database::ConvertFeatureCategoryToGroupLabel', execute: 'group_label')
- end
-
- before do
- allow(Gitlab::Database::ConvertFeatureCategoryToGroupLabel).to receive(:new).and_return(convert_object)
- allow(Mutations::Issues::Create).to receive(:new).and_return(issue_creation)
- end
-
- it 'does not create a schema inconsistency record' do
- allow(Gitlab).to receive(:com?).and_return(true)
-
- expect { execute }.not_to change { Gitlab::Database::SchemaValidation::SchemaInconsistency.count }
- end
- end
-
- context 'when a new inconsistency is found' do
- let(:convert_object) do
- instance_double('Gitlab::Database::ConvertFeatureCategoryToGroupLabel', execute: 'group_label')
- end
-
- before do
- allow(Gitlab::Database::ConvertFeatureCategoryToGroupLabel).to receive(:new).and_return(convert_object)
- project.add_developer(user)
- end
-
- it 'creates a new schema inconsistency record' do
- allow(Gitlab).to receive(:com?).and_return(true)
-
- expect { execute }.to change { Gitlab::Database::SchemaValidation::SchemaInconsistency.count }
- end
- end
-
- context 'when the schema inconsistency already exists' do
- let(:diff) do
- "-#{structure_sql_statement}\n" \
- "+#{database_statement}\n"
- end
-
- let!(:schema_inconsistency) do
- create(:schema_inconsistency, object_name: 'index_name', table_name: 'achievements',
- valitador_name: 'different_definition_indexes', diff: diff)
- end
-
- before do
- project.add_developer(user)
- end
-
- context 'when the issue has the last schema inconsistency' do
- it 'does not add a note' do
- allow(Gitlab).to receive(:com?).and_return(true)
-
- expect { execute }.not_to change { schema_inconsistency.issue.notes.count }
- end
- end
-
- context 'when the issue is outdated' do
- let!(:schema_inconsistency) do
- create(:schema_inconsistency, object_name: 'index_name', table_name: 'achievements',
- valitador_name: 'different_definition_indexes', diff: 'old_diff')
- end
-
- it 'adds a note' do
- allow(Gitlab).to receive(:com?).and_return(true)
-
- expect { execute }.to change { schema_inconsistency.issue.notes.count }.from(0).to(1)
- end
-
- it 'updates the diff' do
- allow(Gitlab).to receive(:com?).and_return(true)
-
- execute
-
- expect(schema_inconsistency.reload.diff).to eq(diff)
- end
- end
-
- context 'when the GitLab issue is open' do
- it 'does not create a new schema inconsistency record' do
- allow(Gitlab).to receive(:com?).and_return(true)
- schema_inconsistency.issue.update!(state_id: Issue.available_states[:opened])
-
- expect { execute }.not_to change { Gitlab::Database::SchemaValidation::SchemaInconsistency.count }
- end
- end
-
- context 'when the GitLab is not open' do
- let(:convert_object) do
- instance_double('Gitlab::Database::ConvertFeatureCategoryToGroupLabel', execute: 'group_label')
- end
-
- before do
- allow(Gitlab::Database::ConvertFeatureCategoryToGroupLabel).to receive(:new).and_return(convert_object)
- project.add_developer(user)
- end
-
- it 'creates a new schema inconsistency record' do
- allow(Gitlab).to receive(:com?).and_return(true)
- schema_inconsistency.issue.update!(state_id: Issue.available_states[:closed])
-
- expect { execute }.to change { Gitlab::Database::SchemaValidation::SchemaInconsistency.count }
- end
- end
- end
-
- context 'when the dictionary file is not present' do
- before do
- allow(Gitlab::Database::GitlabSchema).to receive(:dictionary_paths).and_return(['dictionary_not_found_path/'])
-
- project.add_developer(user)
- end
-
- it 'add the default labels' do
- allow(Gitlab).to receive(:com?).and_return(true)
-
- inconsistency = execute
-
- labels = inconsistency.issue.labels.map(&:name)
-
- expect(labels).to eq %w[database database-inconsistency-report type::maintenance severity::4]
- end
- end
-
- context 'when dictionary feature_categories are available' do
- let(:convert_object) do
- instance_double('Gitlab::Database::ConvertFeatureCategoryToGroupLabel', execute: 'group_label')
- end
-
- before do
- allow(Gitlab::Database::ConvertFeatureCategoryToGroupLabel).to receive(:new).and_return(convert_object)
-
- allow(Gitlab::Database::GitlabSchema).to receive(:dictionary_paths).and_return(['spec/fixtures/'])
-
- project.add_developer(user)
- end
-
- it 'add the default labels + group labels' do
- allow(Gitlab).to receive(:com?).and_return(true)
-
- inconsistency = execute
-
- labels = inconsistency.issue.labels.map(&:name)
-
- expect(labels).to eq %w[database database-inconsistency-report type::maintenance severity::4 group_label]
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/database/schema_validation/validators/base_validator_spec.rb b/spec/lib/gitlab/database/schema_validation/validators/base_validator_spec.rb
deleted file mode 100644
index e8c08277d52..00000000000
--- a/spec/lib/gitlab/database/schema_validation/validators/base_validator_spec.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::SchemaValidation::Validators::BaseValidator, feature_category: :database do
- describe '.all_validators' do
- subject(:all_validators) { described_class.all_validators }
-
- it 'returns an array of all validators' do
- expect(all_validators).to eq([
- Gitlab::Database::SchemaValidation::Validators::ExtraTables,
- Gitlab::Database::SchemaValidation::Validators::ExtraTableColumns,
- Gitlab::Database::SchemaValidation::Validators::ExtraIndexes,
- Gitlab::Database::SchemaValidation::Validators::ExtraTriggers,
- Gitlab::Database::SchemaValidation::Validators::ExtraForeignKeys,
- Gitlab::Database::SchemaValidation::Validators::MissingTables,
- Gitlab::Database::SchemaValidation::Validators::MissingTableColumns,
- Gitlab::Database::SchemaValidation::Validators::MissingIndexes,
- Gitlab::Database::SchemaValidation::Validators::MissingTriggers,
- Gitlab::Database::SchemaValidation::Validators::MissingForeignKeys,
- Gitlab::Database::SchemaValidation::Validators::DifferentDefinitionTables,
- Gitlab::Database::SchemaValidation::Validators::DifferentDefinitionIndexes,
- Gitlab::Database::SchemaValidation::Validators::DifferentDefinitionTriggers,
- Gitlab::Database::SchemaValidation::Validators::DifferentDefinitionForeignKeys
- ])
- end
- end
-
- describe '#execute' do
- let(:structure_sql) { instance_double(Gitlab::Database::SchemaValidation::StructureSql) }
- let(:database) { instance_double(Gitlab::Database::SchemaValidation::Database) }
-
- subject(:inconsistencies) { described_class.new(structure_sql, database).execute }
-
- it 'raises an exception' do
- expect { inconsistencies }.to raise_error(NoMethodError)
- end
- end
-end
diff --git a/spec/lib/gitlab/database/schema_validation/validators/different_definition_foreign_keys_spec.rb b/spec/lib/gitlab/database/schema_validation/validators/different_definition_foreign_keys_spec.rb
deleted file mode 100644
index ffebffc3ad2..00000000000
--- a/spec/lib/gitlab/database/schema_validation/validators/different_definition_foreign_keys_spec.rb
+++ /dev/null
@@ -1,8 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::SchemaValidation::Validators::DifferentDefinitionForeignKeys,
- feature_category: :database do
- include_examples 'foreign key validators', described_class, ['public.wrong_definition_fk']
-end
diff --git a/spec/lib/gitlab/database/schema_validation/validators/different_definition_indexes_spec.rb b/spec/lib/gitlab/database/schema_validation/validators/different_definition_indexes_spec.rb
deleted file mode 100644
index b9744c86b80..00000000000
--- a/spec/lib/gitlab/database/schema_validation/validators/different_definition_indexes_spec.rb
+++ /dev/null
@@ -1,8 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::SchemaValidation::Validators::DifferentDefinitionIndexes,
- feature_category: :database do
- include_examples 'index validators', described_class, ['wrong_index']
-end
diff --git a/spec/lib/gitlab/database/schema_validation/validators/different_definition_tables_spec.rb b/spec/lib/gitlab/database/schema_validation/validators/different_definition_tables_spec.rb
deleted file mode 100644
index 746418b757e..00000000000
--- a/spec/lib/gitlab/database/schema_validation/validators/different_definition_tables_spec.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::SchemaValidation::Validators::DifferentDefinitionTables, feature_category: :database do
- include_examples 'table validators', described_class, ['wrong_table']
-end
diff --git a/spec/lib/gitlab/database/schema_validation/validators/different_definition_triggers_spec.rb b/spec/lib/gitlab/database/schema_validation/validators/different_definition_triggers_spec.rb
deleted file mode 100644
index 4d065929708..00000000000
--- a/spec/lib/gitlab/database/schema_validation/validators/different_definition_triggers_spec.rb
+++ /dev/null
@@ -1,8 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::SchemaValidation::Validators::DifferentDefinitionTriggers,
- feature_category: :database do
- include_examples 'trigger validators', described_class, ['wrong_trigger']
-end
diff --git a/spec/lib/gitlab/database/schema_validation/validators/extra_foreign_keys_spec.rb b/spec/lib/gitlab/database/schema_validation/validators/extra_foreign_keys_spec.rb
deleted file mode 100644
index 053153aa214..00000000000
--- a/spec/lib/gitlab/database/schema_validation/validators/extra_foreign_keys_spec.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::SchemaValidation::Validators::ExtraForeignKeys, feature_category: :database do
- include_examples 'foreign key validators', described_class, ['public.extra_fk']
-end
diff --git a/spec/lib/gitlab/database/schema_validation/validators/extra_indexes_spec.rb b/spec/lib/gitlab/database/schema_validation/validators/extra_indexes_spec.rb
deleted file mode 100644
index 842dbb42120..00000000000
--- a/spec/lib/gitlab/database/schema_validation/validators/extra_indexes_spec.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::SchemaValidation::Validators::ExtraIndexes, feature_category: :database do
- include_examples 'index validators', described_class, ['extra_index']
-end
diff --git a/spec/lib/gitlab/database/schema_validation/validators/extra_table_columns_spec.rb b/spec/lib/gitlab/database/schema_validation/validators/extra_table_columns_spec.rb
deleted file mode 100644
index 9d17a2fffa9..00000000000
--- a/spec/lib/gitlab/database/schema_validation/validators/extra_table_columns_spec.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::SchemaValidation::Validators::ExtraTableColumns, feature_category: :database do
- include_examples 'table validators', described_class, ['extra_table_columns']
-end
diff --git a/spec/lib/gitlab/database/schema_validation/validators/extra_tables_spec.rb b/spec/lib/gitlab/database/schema_validation/validators/extra_tables_spec.rb
deleted file mode 100644
index edaf79e3c93..00000000000
--- a/spec/lib/gitlab/database/schema_validation/validators/extra_tables_spec.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::SchemaValidation::Validators::ExtraTables, feature_category: :database do
- include_examples 'table validators', described_class, ['extra_table']
-end
diff --git a/spec/lib/gitlab/database/schema_validation/validators/extra_triggers_spec.rb b/spec/lib/gitlab/database/schema_validation/validators/extra_triggers_spec.rb
deleted file mode 100644
index d2e1c18a1ab..00000000000
--- a/spec/lib/gitlab/database/schema_validation/validators/extra_triggers_spec.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::SchemaValidation::Validators::ExtraTriggers, feature_category: :database do
- include_examples 'trigger validators', described_class, ['extra_trigger']
-end
diff --git a/spec/lib/gitlab/database/schema_validation/validators/missing_foreign_keys_spec.rb b/spec/lib/gitlab/database/schema_validation/validators/missing_foreign_keys_spec.rb
deleted file mode 100644
index a47804abb91..00000000000
--- a/spec/lib/gitlab/database/schema_validation/validators/missing_foreign_keys_spec.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::SchemaValidation::Validators::MissingForeignKeys, feature_category: :database do
- include_examples 'foreign key validators', described_class, %w[public.fk_rails_536b96bff1 public.missing_fk]
-end
diff --git a/spec/lib/gitlab/database/schema_validation/validators/missing_indexes_spec.rb b/spec/lib/gitlab/database/schema_validation/validators/missing_indexes_spec.rb
deleted file mode 100644
index c402c3a2fa7..00000000000
--- a/spec/lib/gitlab/database/schema_validation/validators/missing_indexes_spec.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::SchemaValidation::Validators::MissingIndexes, feature_category: :database do
- missing_indexes = %w[
- missing_index
- index_namespaces_public_groups_name_id
- index_on_deploy_keys_id_and_type_and_public
- index_users_on_public_email_excluding_null_and_empty
- ]
-
- include_examples 'index validators', described_class, missing_indexes
-end
diff --git a/spec/lib/gitlab/database/schema_validation/validators/missing_table_columns_spec.rb b/spec/lib/gitlab/database/schema_validation/validators/missing_table_columns_spec.rb
deleted file mode 100644
index de2956b4dd9..00000000000
--- a/spec/lib/gitlab/database/schema_validation/validators/missing_table_columns_spec.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::SchemaValidation::Validators::MissingTableColumns, feature_category: :database do
- include_examples 'table validators', described_class, ['missing_table_columns']
-end
diff --git a/spec/lib/gitlab/database/schema_validation/validators/missing_tables_spec.rb b/spec/lib/gitlab/database/schema_validation/validators/missing_tables_spec.rb
deleted file mode 100644
index 7c80923e860..00000000000
--- a/spec/lib/gitlab/database/schema_validation/validators/missing_tables_spec.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::SchemaValidation::Validators::MissingTables, feature_category: :database do
- missing_tables = %w[ci_project_mirrors missing_table operations_user_lists test_table]
-
- include_examples 'table validators', described_class, missing_tables
-end
diff --git a/spec/lib/gitlab/database/schema_validation/validators/missing_triggers_spec.rb b/spec/lib/gitlab/database/schema_validation/validators/missing_triggers_spec.rb
deleted file mode 100644
index 87bc3ded808..00000000000
--- a/spec/lib/gitlab/database/schema_validation/validators/missing_triggers_spec.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::SchemaValidation::Validators::MissingTriggers, feature_category: :database do
- missing_triggers = %w[missing_trigger_1 projects_loose_fk_trigger]
-
- include_examples 'trigger validators', described_class, missing_triggers
-end
diff --git a/spec/lib/gitlab/database/similarity_score_spec.rb b/spec/lib/gitlab/database/similarity_score_spec.rb
index cfee70ed208..58ea5a58644 100644
--- a/spec/lib/gitlab/database/similarity_score_spec.rb
+++ b/spec/lib/gitlab/database/similarity_score_spec.rb
@@ -25,7 +25,7 @@ RSpec.describe Gitlab::Database::SimilarityScore do
end
let(:order_expression) do
- Gitlab::Database::SimilarityScore.build_expression(search: search, rules: [{ column: Arel.sql('path') }]).to_sql
+ described_class.build_expression(search: search, rules: [{ column: Arel.sql('path') }]).to_sql
end
subject { query_result.take(3).map { |row| row['path'] } }
@@ -43,7 +43,7 @@ RSpec.describe Gitlab::Database::SimilarityScore do
let(:search) { 'text' }
let(:order_expression) do
- Gitlab::Database::SimilarityScore.build_expression(search: search, rules: []).to_sql
+ described_class.build_expression(search: search, rules: []).to_sql
end
it 'orders by a constant 0 value' do
@@ -78,7 +78,7 @@ RSpec.describe Gitlab::Database::SimilarityScore do
describe 'score multiplier' do
let(:order_expression) do
- Gitlab::Database::SimilarityScore.build_expression(search: search, rules:
+ described_class.build_expression(search: search, rules:
[
{ column: Arel.sql('path'), multiplier: 1 },
{ column: Arel.sql('name'), multiplier: 0.8 }
@@ -94,13 +94,13 @@ RSpec.describe Gitlab::Database::SimilarityScore do
describe 'annotation' do
it 'annotates the generated SQL expression' do
- expression = Gitlab::Database::SimilarityScore.build_expression(search: 'test', rules:
+ expression = described_class.build_expression(search: 'test', rules:
[
{ column: Arel.sql('path'), multiplier: 1 },
{ column: Arel.sql('name'), multiplier: 0.8 }
])
- expect(Gitlab::Database::SimilarityScore).to be_order_by_similarity(expression)
+ expect(described_class).to be_order_by_similarity(expression)
end
end
end
diff --git a/spec/lib/gitlab/database_spec.rb b/spec/lib/gitlab/database_spec.rb
index ab3cd8fa5e6..d51319d462b 100644
--- a/spec/lib/gitlab/database_spec.rb
+++ b/spec/lib/gitlab/database_spec.rb
@@ -103,7 +103,7 @@ RSpec.describe Gitlab::Database, feature_category: :database do
before do
# CI config might not be configured
allow(ActiveRecord::Base.configurations).to receive(:configs_for)
- .with(env_name: 'test', name: 'ci', include_replicas: true)
+ .with(env_name: 'test', name: 'ci', include_hidden: true)
.and_return(ci_db_config)
end
@@ -215,7 +215,7 @@ RSpec.describe Gitlab::Database, feature_category: :database do
expect(Kernel)
.to receive(:warn)
.with(/You are using PostgreSQL/)
- .exactly(Gitlab::Database.database_base_models.length)
+ .exactly(described_class.database_base_models.length)
.times
subject
@@ -432,21 +432,21 @@ RSpec.describe Gitlab::Database, feature_category: :database do
describe '.database_base_models_with_gitlab_shared' do
before do
- Gitlab::Database.instance_variable_set(:@database_base_models_with_gitlab_shared, nil)
+ described_class.instance_variable_set(:@database_base_models_with_gitlab_shared, nil)
end
it 'memoizes the models' do
- expect { Gitlab::Database.database_base_models_with_gitlab_shared }.to change { Gitlab::Database.instance_variable_get(:@database_base_models_with_gitlab_shared) }.from(nil)
+ expect { described_class.database_base_models_with_gitlab_shared }.to change { Gitlab::Database.instance_variable_get(:@database_base_models_with_gitlab_shared) }.from(nil)
end
end
describe '.database_base_models_using_load_balancing' do
before do
- Gitlab::Database.instance_variable_set(:@database_base_models_using_load_balancing, nil)
+ described_class.instance_variable_set(:@database_base_models_using_load_balancing, nil)
end
it 'memoizes the models' do
- expect { Gitlab::Database.database_base_models_using_load_balancing }.to change { Gitlab::Database.instance_variable_get(:@database_base_models_using_load_balancing) }.from(nil)
+ expect { described_class.database_base_models_using_load_balancing }.to change { Gitlab::Database.instance_variable_get(:@database_base_models_using_load_balancing) }.from(nil)
end
end
diff --git a/spec/lib/gitlab/diff/highlight_spec.rb b/spec/lib/gitlab/diff/highlight_spec.rb
index 233dddbdad7..e39c15c8fd7 100644
--- a/spec/lib/gitlab/diff/highlight_spec.rb
+++ b/spec/lib/gitlab/diff/highlight_spec.rb
@@ -38,19 +38,19 @@ RSpec.describe Gitlab::Diff::Highlight, feature_category: :source_code_managemen
end
it 'highlights and marks unchanged lines' do
- code = %Q{ <span id="LC7" class="line" lang="ruby"> <span class="k">def</span> <span class="nf">popen</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="kp">nil</span><span class="p">)</span></span>\n}
+ code = %{ <span id="LC7" class="line" lang="ruby"> <span class="k">def</span> <span class="nf">popen</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="kp">nil</span><span class="p">)</span></span>\n}
expect(subject[2].rich_text).to eq(code)
end
it 'highlights and marks removed lines' do
- code = %Q{-<span id="LC9" class="line" lang="ruby"> <span class="k">raise</span> <span class="s2">"System commands must be given as an array of strings"</span></span>\n}
+ code = %{-<span id="LC9" class="line" lang="ruby"> <span class="k">raise</span> <span class="s2">"System commands must be given as an array of strings"</span></span>\n}
expect(subject[4].rich_text).to eq(code)
end
it 'highlights and marks added lines' do
- code = %Q{+<span id="LC9" class="line" lang="ruby"> <span class="k">raise</span> <span class="no"><span class="idiff left addition">RuntimeError</span></span><span class="p"><span class="idiff addition">,</span></span><span class="idiff right addition"> </span><span class="s2">"System commands must be given as an array of strings"</span></span>\n}
+ code = %{+<span id="LC9" class="line" lang="ruby"> <span class="k">raise</span> <span class="no"><span class="idiff left addition">RuntimeError</span></span><span class="p"><span class="idiff addition">,</span></span><span class="idiff right addition"> </span><span class="s2">"System commands must be given as an array of strings"</span></span>\n}
expect(subject[5].rich_text).to eq(code)
end
@@ -135,7 +135,7 @@ RSpec.describe Gitlab::Diff::Highlight, feature_category: :source_code_managemen
it 'blobs are highlighted as plain text without loading all data' do
expect(diff_file.blob).not_to receive(:load_all_data!)
- expect(subject[2].rich_text).to eq(%Q{ <span id="LC7" class="line" lang=""> def popen(cmd, path=nil)</span>\n})
+ expect(subject[2].rich_text).to eq(%{ <span id="LC7" class="line" lang=""> def popen(cmd, path=nil)</span>\n})
expect(subject[2].rich_text).to be_html_safe
end
end
diff --git a/spec/lib/gitlab/diff/rendered/notebook/diff_file_spec.rb b/spec/lib/gitlab/diff/rendered/notebook/diff_file_spec.rb
index e1135f4d546..4b2bb6cbb02 100644
--- a/spec/lib/gitlab/diff/rendered/notebook/diff_file_spec.rb
+++ b/spec/lib/gitlab/diff/rendered/notebook/diff_file_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Diff::Rendered::Notebook::DiffFile do
+RSpec.describe Gitlab::Diff::Rendered::Notebook::DiffFile, feature_category: :mlops do
include RepoHelpers
let_it_be(:project) { create(:project, :repository) }
diff --git a/spec/lib/gitlab/email/handler/service_desk_handler_spec.rb b/spec/lib/gitlab/email/handler/service_desk_handler_spec.rb
index ef2acc9ec92..98522c53a47 100644
--- a/spec/lib/gitlab/email/handler/service_desk_handler_spec.rb
+++ b/spec/lib/gitlab/email/handler/service_desk_handler_spec.rb
@@ -381,6 +381,125 @@ RSpec.describe Gitlab::Email::Handler::ServiceDeskHandler, feature_category: :se
it_behaves_like 'a new issue request'
end
end
+
+ context 'when receiving a service desk custom email address verification email' do
+ let(:email_raw) { service_desk_fixture('emails/service_desk_custom_email_address_verification.eml') }
+
+ shared_examples 'an early exiting handler' do
+ it 'does not trigger the verification process and does not add an issue' do
+ expect(ServiceDesk::CustomEmailVerifications::UpdateService).to receive(:execute).exactly(0).times
+ expect { receiver.execute }.to not_change { Issue.count }
+ end
+ end
+
+ shared_examples 'a handler that does not verify the custom email' do |error_identifier|
+ it 'does not verify the custom email address' do
+ # project has no owner, so only notify verification triggerer
+ expect(Notify).to receive(:service_desk_verification_result_email).once
+
+ receiver.execute
+
+ expect(settings.reload.custom_email_enabled).to be false
+ expect(verification.reload).to have_attributes(
+ state: 'failed',
+ error: error_identifier
+ )
+ end
+ end
+
+ shared_examples 'a handler that verifies Service Desk custom email verification emails' do
+ it_behaves_like 'an early exiting handler'
+
+ context 'with valid service desk settings' do
+ let_it_be(:user) { create(:user) }
+
+ let!(:settings) { create(:service_desk_setting, project: project, custom_email: 'custom-support-email@example.com') }
+ let!(:verification) { create(:service_desk_custom_email_verification, project: project, token: 'ZROT4ZZXA-Y6', triggerer: user) }
+
+ let(:message_delivery) { instance_double(ActionMailer::MessageDelivery) }
+
+ before do
+ project.add_maintainer(user)
+
+ allow(message_delivery).to receive(:deliver_later)
+ allow(Notify).to receive(:service_desk_verification_result_email).and_return(message_delivery)
+ end
+
+ it 'successfully verifies the custom email address' do
+ # project has no owner, so only notify verification triggerer
+ expect(Notify).to receive(:service_desk_verification_result_email).once
+
+ receiver.execute
+
+ expect(settings.reload.custom_email_enabled).to be false
+ expect(verification.reload).to have_attributes(
+ state: 'finished',
+ error: nil
+ )
+ end
+
+ context 'and custom email address is not the configured subaddress of the project' do
+ before do
+ settings.update!(custom_email: 'custom-support-email@example.com')
+ end
+
+ it_behaves_like 'an early exiting handler'
+ end
+
+ context 'and verification tokens do not match' do
+ before do
+ verification.update!(token: 'XXXXXXXXXXXX')
+ end
+
+ it_behaves_like 'a handler that does not verify the custom email', 'incorrect_token'
+ end
+
+ context 'and verification email ingested too late' do
+ before do
+ verification.update!(triggered_at: ServiceDesk::CustomEmailVerification::TIMEFRAME.ago)
+ end
+
+ it_behaves_like 'a handler that does not verify the custom email', 'mail_not_received_within_timeframe'
+ end
+
+ context 'and from header differs from custom email address' do
+ before do
+ settings.update!(custom_email: 'different-from@example.com')
+ end
+
+ it_behaves_like 'a handler that does not verify the custom email', 'incorrect_from'
+ end
+ end
+
+ context 'when service_desk_custom_email feature flag is disabled' do
+ before do
+ stub_feature_flags(service_desk_custom_email: false)
+ end
+
+ it 'does not trigger the verification process and adds an issue instead' do
+ expect { receiver.execute }.to change { Issue.count }.by(1)
+ end
+ end
+ end
+
+ context 'when using incoming_email address' do
+ before do
+ stub_incoming_email_setting(enabled: true, address: 'support+%{key}@example.com')
+ end
+
+ it_behaves_like 'a handler that verifies Service Desk custom email verification emails'
+ end
+
+ context 'when using service_desk_email address' do
+ let(:receiver) { Gitlab::Email::ServiceDeskReceiver.new(email_raw) }
+
+ before do
+ stub_service_desk_email_setting(enabled: true, address: 'support+%{key}@example.com')
+ end
+
+ it_behaves_like 'a handler that verifies Service Desk custom email verification emails'
+ end
+ end
end
context 'when issue email creation fails' do
diff --git a/spec/lib/gitlab/email/handler_spec.rb b/spec/lib/gitlab/email/handler_spec.rb
index d38b7d9c85c..d3a4d77c58e 100644
--- a/spec/lib/gitlab/email/handler_spec.rb
+++ b/spec/lib/gitlab/email/handler_spec.rb
@@ -75,7 +75,7 @@ RSpec.describe Gitlab::Email::Handler do
described_class.for(email, address).class
end
- expect(matched_handlers.uniq).to match_array(Gitlab::Email::Handler.handlers)
+ expect(matched_handlers.uniq).to match_array(described_class.handlers)
end
it 'can pick exactly one handler for each address' do
diff --git a/spec/lib/gitlab/email/hook/smime_signature_interceptor_spec.rb b/spec/lib/gitlab/email/hook/smime_signature_interceptor_spec.rb
index 7dd4ee7e25d..2632be98026 100644
--- a/spec/lib/gitlab/email/hook/smime_signature_interceptor_spec.rb
+++ b/spec/lib/gitlab/email/hook/smime_signature_interceptor_spec.rb
@@ -36,7 +36,7 @@ RSpec.describe Gitlab::Email::Hook::SmimeSignatureInterceptor do
end
before do
- allow(Gitlab::Email::Hook::SmimeSignatureInterceptor).to receive(:certificate).and_return(certificate)
+ allow(described_class).to receive(:certificate).and_return(certificate)
Mail.register_interceptor(described_class)
mail.deliver_now
diff --git a/spec/lib/gitlab/email/receiver_spec.rb b/spec/lib/gitlab/email/receiver_spec.rb
index e58da2478bf..ee836fc2129 100644
--- a/spec/lib/gitlab/email/receiver_spec.rb
+++ b/spec/lib/gitlab/email/receiver_spec.rb
@@ -226,6 +226,25 @@ RSpec.describe Gitlab::Email::Receiver do
end
end
+ context "when the received field is malformed" do
+ let(:email_raw) do
+ attack = "for <<" * 100_000
+ [
+ "Delivered-To: incoming+gitlabhq/gitlabhq+auth_token@appmail.example.com",
+ "Received: from mail.example.com #{attack}; Thu, 13 Jun 2013 17:03:50 -0400",
+ "To: \"support@example.com\" <support@example.com>",
+ "",
+ "Email content"
+ ].join("\n")
+ end
+
+ it 'mail_metadata has no ReDos issue' do
+ Timeout.timeout(2) do
+ Gitlab::Email::Receiver.new(email_raw).mail_metadata
+ end
+ end
+ end
+
it 'requires all handlers to have a unique metric_event' do
events = Gitlab::Email::Handler.handlers.map do |handler|
handler.new(Mail::Message.new, 'gitlabhq/gitlabhq+auth_token').metrics_event
diff --git a/spec/lib/gitlab/encrypted_configuration_spec.rb b/spec/lib/gitlab/encrypted_configuration_spec.rb
index eadc2cf71a7..95e6d99f41c 100644
--- a/spec/lib/gitlab/encrypted_configuration_spec.rb
+++ b/spec/lib/gitlab/encrypted_configuration_spec.rb
@@ -56,7 +56,7 @@ RSpec.describe Gitlab::EncryptedConfiguration do
describe '#write' do
it 'encrypts the file using the provided key' do
- encryptor = ActiveSupport::MessageEncryptor.new(Gitlab::EncryptedConfiguration.generate_key(credentials_key), cipher: 'aes-256-gcm')
+ encryptor = ActiveSupport::MessageEncryptor.new(described_class.generate_key(credentials_key), cipher: 'aes-256-gcm')
config = described_class.new(content_path: credentials_config_path, base_key: credentials_key)
config.write('sample-content')
@@ -122,7 +122,7 @@ RSpec.describe Gitlab::EncryptedConfiguration do
original_key_encryptor = encryptor(credential_key_original) # can read with the initial key
latest_key_encryptor = encryptor(credential_key_latest) # can read with the new key
both_key_encryptor = encryptor(credential_key_latest) # can read with either key
- both_key_encryptor.rotate(Gitlab::EncryptedConfiguration.generate_key(credential_key_original))
+ both_key_encryptor.rotate(described_class.generate_key(credential_key_original))
expect(original_key_encryptor.decrypt_and_verify(File.read(config_path_original))).to eq('sample-content1')
expect(both_key_encryptor.decrypt_and_verify(File.read(config_path_original))).to eq('sample-content1')
diff --git a/spec/lib/gitlab/error_tracking/logger_spec.rb b/spec/lib/gitlab/error_tracking/logger_spec.rb
index 1b722fc7896..e32a3c10cec 100644
--- a/spec/lib/gitlab/error_tracking/logger_spec.rb
+++ b/spec/lib/gitlab/error_tracking/logger_spec.rb
@@ -13,7 +13,7 @@ RSpec.describe Gitlab::ErrorTracking::Logger do
expect(log_formatter).to receive(:generate_log).with(exception, payload).and_return(log_entry)
end
- expect(Gitlab::ErrorTracking::Logger).to receive(:error).with(log_entry)
+ expect(described_class).to receive(:error).with(log_entry)
described_class.capture_exception(exception, **payload)
end
diff --git a/spec/lib/gitlab/error_tracking/processor/sanitize_error_message_processor_spec.rb b/spec/lib/gitlab/error_tracking/processor/sanitize_error_message_processor_spec.rb
index 5ec73233e77..74b6df24178 100644
--- a/spec/lib/gitlab/error_tracking/processor/sanitize_error_message_processor_spec.rb
+++ b/spec/lib/gitlab/error_tracking/processor/sanitize_error_message_processor_spec.rb
@@ -9,7 +9,9 @@ RSpec.describe Gitlab::ErrorTracking::Processor::SanitizeErrorMessageProcessor,
shared_examples 'processes the exception' do
it 'cleans the exception message' do
- expect(Gitlab::Sanitizers::ExceptionMessage).to receive(:clean).with('StandardError', 'raw error').and_return('cleaned')
+ expect(Gitlab::Sanitizers::ExceptionMessage).to receive(:clean).with(
+ 'StandardError', match('raw error')
+ ).and_return('cleaned')
expect(result_hash[:exception][:values].first).to include(
type: 'StandardError',
diff --git a/spec/lib/gitlab/error_tracking/stack_trace_highlight_decorator_spec.rb b/spec/lib/gitlab/error_tracking/stack_trace_highlight_decorator_spec.rb
index 73ebee49169..a854adca32b 100644
--- a/spec/lib/gitlab/error_tracking/stack_trace_highlight_decorator_spec.rb
+++ b/spec/lib/gitlab/error_tracking/stack_trace_highlight_decorator_spec.rb
@@ -28,7 +28,7 @@ RSpec.describe Gitlab::ErrorTracking::StackTraceHighlightDecorator do
[11, '<span id="LC1" class="line" lang="ruby"><span class="k">class</span> <span class="nc">HelloWorld</span></span>'],
[12, '<span id="LC1" class="line" lang="ruby"> <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">message</span></span>'],
[13, '<span id="LC1" class="line" lang="ruby"> <span class="vi">@name</span> <span class="o">=</span> <span class="s1">\'World\'</span></span>'],
- [14, %Q[<span id="LC1" class="line" lang="ruby"> <span class="nb">puts</span> <span class="s2">"Hello </span><span class="si">\#{</span><span class="vi">@name</span><span class="si">}</span><span class="s2">"</span></span>]],
+ [14, %[<span id="LC1" class="line" lang="ruby"> <span class="nb">puts</span> <span class="s2">"Hello </span><span class="si">\#{</span><span class="vi">@name</span><span class="si">}</span><span class="s2">"</span></span>]],
[15, '<span id="LC1" class="line" lang="ruby"> <span class="k">end</span></span>'],
[16, '<span id="LC1" class="line" lang="ruby"><span class="k">end</span></span>']
]
diff --git a/spec/lib/gitlab/exception_log_formatter_spec.rb b/spec/lib/gitlab/exception_log_formatter_spec.rb
index 82166971603..179054e2d15 100644
--- a/spec/lib/gitlab/exception_log_formatter_spec.rb
+++ b/spec/lib/gitlab/exception_log_formatter_spec.rb
@@ -67,5 +67,53 @@ RSpec.describe Gitlab::ExceptionLogFormatter do
expect(payload['exception.sql']).to eq('SELECT SELECT FROM SELECT')
end
end
+
+ context 'when exception is a gRPC bad status' do
+ let(:unavailable_error) do
+ ::GRPC::Unavailable.new(
+ "unavailable",
+ gitaly_error_metadata: {
+ storage: 'default',
+ address: 'unix://gitaly.socket',
+ service: :ref_service,
+ rpc: :find_local_branches
+ }
+ )
+ end
+
+ context 'when the gRPC error is wrapped by ::Gitlab::Git::BaseError' do
+ let(:exception) { ::Gitlab::Git::CommandError.new(unavailable_error) }
+
+ it 'adds gitaly metadata to payload' do
+ described_class.format!(exception, payload)
+
+ expect(payload['exception.gitaly']).to eq('{:storage=>"default", :address=>"unix://gitaly.socket", :service=>:ref_service, :rpc=>:find_local_branches}')
+ end
+ end
+
+ context 'when the gRPC error is wrapped by another error' do
+ before do
+ allow(exception).to receive(:cause).and_return(unavailable_error)
+ end
+
+ it 'adds gitaly metadata to payload' do
+ described_class.format!(exception, payload)
+
+ expect(payload['exception.cause_class']).to eq('GRPC::Unavailable')
+ expect(payload['exception.gitaly']).to eq('{:storage=>"default", :address=>"unix://gitaly.socket", :service=>:ref_service, :rpc=>:find_local_branches}')
+ end
+ end
+
+ context 'when the gRPC error is not wrapped' do
+ let(:exception) { unavailable_error }
+
+ it 'adds gitaly metadata to payload' do
+ described_class.format!(exception, payload)
+
+ expect(payload['exception.cause_class']).to be_nil
+ expect(payload['exception.gitaly']).to eq('{:storage=>"default", :address=>"unix://gitaly.socket", :service=>:ref_service, :rpc=>:find_local_branches}')
+ end
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/gfm/reference_rewriter_spec.rb b/spec/lib/gitlab/gfm/reference_rewriter_spec.rb
index 8bb649e78e0..6de7cab9c42 100644
--- a/spec/lib/gitlab/gfm/reference_rewriter_spec.rb
+++ b/spec/lib/gitlab/gfm/reference_rewriter_spec.rb
@@ -78,13 +78,13 @@ RSpec.describe Gitlab::Gfm::ReferenceRewriter do
context 'label referenced by id' do
let(:text) { '#1 and ~123' }
- it { is_expected.to eq %Q{#{old_project_ref}#1 and #{old_project_ref}~123} }
+ it { is_expected.to eq %{#{old_project_ref}#1 and #{old_project_ref}~123} }
end
context 'label referenced by text' do
let(:text) { '#1 and ~"test"' }
- it { is_expected.to eq %Q{#{old_project_ref}#1 and #{old_project_ref}~123} }
+ it { is_expected.to eq %{#{old_project_ref}#1 and #{old_project_ref}~123} }
end
end
@@ -99,13 +99,13 @@ RSpec.describe Gitlab::Gfm::ReferenceRewriter do
context 'label referenced by id' do
let(:text) { '#1 and ~321' }
- it { is_expected.to eq %Q{#{old_project_ref}#1 and #{old_project_ref}~321} }
+ it { is_expected.to eq %{#{old_project_ref}#1 and #{old_project_ref}~321} }
end
context 'label referenced by text' do
let(:text) { '#1 and ~"group label"' }
- it { is_expected.to eq %Q{#{old_project_ref}#1 and #{old_project_ref}~321} }
+ it { is_expected.to eq %{#{old_project_ref}#1 and #{old_project_ref}~321} }
end
end
end
@@ -149,7 +149,7 @@ RSpec.describe Gitlab::Gfm::ReferenceRewriter do
let(:text) { 'milestone: %"9.0"' }
- it { is_expected.to eq %Q[milestone: #{old_project_ref}%"9.0"] }
+ it { is_expected.to eq %[milestone: #{old_project_ref}%"9.0"] }
end
context 'when referring to group milestone' do
diff --git a/spec/lib/gitlab/git/base_error_spec.rb b/spec/lib/gitlab/git/base_error_spec.rb
index d4db7cf2430..6efebd778b7 100644
--- a/spec/lib/gitlab/git/base_error_spec.rb
+++ b/spec/lib/gitlab/git/base_error_spec.rb
@@ -21,7 +21,7 @@ RSpec.describe Gitlab::Git::BaseError do
it { is_expected.to eq(result) }
end
- describe "When initialized with GRPC errors" do
+ describe "when initialized with GRPC errors without metadata" do
let(:grpc_error) { GRPC::DeadlineExceeded.new }
let(:git_error) { described_class.new grpc_error }
@@ -29,6 +29,33 @@ RSpec.describe Gitlab::Git::BaseError do
expect(git_error.service).to eq('git')
expect(git_error.status).to eq(4)
expect(git_error.code).to eq('deadline_exceeded')
+ expect(git_error.metadata).to eq({})
+ end
+ end
+
+ describe "when initialized with GRPC errors with metadata" do
+ let(:grpc_error) do
+ GRPC::DeadlineExceeded.new(
+ "deadline exceeded",
+ gitaly_error_metadata: {
+ storage: "default",
+ address: "unix://gitaly.socket",
+ service: :ref_service, rpc: :find_local_branches
+ }
+ )
+ end
+
+ let(:git_error) { described_class.new grpc_error }
+
+ it "has status, code, and metadata fields" do
+ expect(git_error.service).to eq('git')
+ expect(git_error.status).to eq(4)
+ expect(git_error.code).to eq('deadline_exceeded')
+ expect(git_error.metadata).to eq(
+ storage: "default",
+ address: "unix://gitaly.socket",
+ service: :ref_service, rpc: :find_local_branches
+ )
end
end
end
diff --git a/spec/lib/gitlab/git/blame_spec.rb b/spec/lib/gitlab/git/blame_spec.rb
index 45d88f57c09..676ea2663d2 100644
--- a/spec/lib/gitlab/git/blame_spec.rb
+++ b/spec/lib/gitlab/git/blame_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe Gitlab::Git::Blame do
let(:path) { 'CONTRIBUTING.md' }
let(:range) { nil }
- subject(:blame) { Gitlab::Git::Blame.new(repository, sha, path, range: range) }
+ subject(:blame) { described_class.new(repository, sha, path, range: range) }
let(:result) do
[].tap do |data|
diff --git a/spec/lib/gitlab/git/blob_spec.rb b/spec/lib/gitlab/git/blob_spec.rb
index d35d288050a..5bb4b84835d 100644
--- a/spec/lib/gitlab/git/blob_spec.rb
+++ b/spec/lib/gitlab/git/blob_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe Gitlab::Git::Blob do
let_it_be(:repository) { project.repository.raw }
describe 'initialize' do
- let(:blob) { Gitlab::Git::Blob.new(name: 'test') }
+ let(:blob) { described_class.new(name: 'test') }
it 'handles nil data' do
expect(described_class).not_to receive(:gitlab_blob_size)
@@ -20,14 +20,14 @@ RSpec.describe Gitlab::Git::Blob do
it 'records blob size' do
expect(described_class).to receive(:gitlab_blob_size).and_call_original
- Gitlab::Git::Blob.new(name: 'test', size: 4, data: 'abcd')
+ described_class.new(name: 'test', size: 4, data: 'abcd')
end
context 'when untruncated' do
it 'attempts to record gitlab_blob_truncated_false' do
expect(described_class).to receive(:gitlab_blob_truncated_false).and_call_original
- Gitlab::Git::Blob.new(name: 'test', size: 4, data: 'abcd')
+ described_class.new(name: 'test', size: 4, data: 'abcd')
end
end
@@ -35,32 +35,32 @@ RSpec.describe Gitlab::Git::Blob do
it 'attempts to record gitlab_blob_truncated_true' do
expect(described_class).to receive(:gitlab_blob_truncated_true).and_call_original
- Gitlab::Git::Blob.new(name: 'test', size: 40, data: 'abcd')
+ described_class.new(name: 'test', size: 40, data: 'abcd')
end
end
end
shared_examples '.find' do
context 'nil path' do
- let(:blob) { Gitlab::Git::Blob.find(repository, TestEnv::BRANCH_SHA['master'], nil) }
+ let(:blob) { described_class.find(repository, TestEnv::BRANCH_SHA['master'], nil) }
it { expect(blob).to eq(nil) }
end
context 'utf-8 branch' do
- let(:blob) { Gitlab::Git::Blob.find(repository, 'Ääh-test-utf-8', "files/ruby/popen.rb") }
+ let(:blob) { described_class.find(repository, 'Ääh-test-utf-8', "files/ruby/popen.rb") }
it { expect(blob.id).to eq(SeedRepo::RubyBlob::ID) }
end
context 'blank path' do
- let(:blob) { Gitlab::Git::Blob.find(repository, TestEnv::BRANCH_SHA['master'], '') }
+ let(:blob) { described_class.find(repository, TestEnv::BRANCH_SHA['master'], '') }
it { expect(blob).to eq(nil) }
end
context 'file in subdir' do
- let(:blob) { Gitlab::Git::Blob.find(repository, TestEnv::BRANCH_SHA['master'], "files/ruby/popen.rb") }
+ let(:blob) { described_class.find(repository, TestEnv::BRANCH_SHA['master'], "files/ruby/popen.rb") }
it { expect(blob.id).to eq(SeedRepo::RubyBlob::ID) }
it { expect(blob.name).to eq(SeedRepo::RubyBlob::NAME) }
@@ -72,7 +72,7 @@ RSpec.describe Gitlab::Git::Blob do
end
context 'file in root' do
- let(:blob) { Gitlab::Git::Blob.find(repository, TestEnv::BRANCH_SHA['master'], ".gitignore") }
+ let(:blob) { described_class.find(repository, TestEnv::BRANCH_SHA['master'], ".gitignore") }
it { expect(blob.id).to eq("dfaa3f97ca337e20154a98ac9d0be76ddd1fcc82") }
it { expect(blob.name).to eq(".gitignore") }
@@ -85,7 +85,7 @@ RSpec.describe Gitlab::Git::Blob do
end
context 'file in root with leading slash' do
- let(:blob) { Gitlab::Git::Blob.find(repository, TestEnv::BRANCH_SHA['master'], "/.gitignore") }
+ let(:blob) { described_class.find(repository, TestEnv::BRANCH_SHA['master'], "/.gitignore") }
it { expect(blob.id).to eq("dfaa3f97ca337e20154a98ac9d0be76ddd1fcc82") }
it { expect(blob.name).to eq(".gitignore") }
@@ -97,13 +97,13 @@ RSpec.describe Gitlab::Git::Blob do
end
context 'non-exist file' do
- let(:blob) { Gitlab::Git::Blob.find(repository, TestEnv::BRANCH_SHA['master'], "missing.rb") }
+ let(:blob) { described_class.find(repository, TestEnv::BRANCH_SHA['master'], "missing.rb") }
it { expect(blob).to be_nil }
end
context 'six submodule' do
- let(:blob) { Gitlab::Git::Blob.find(repository, TestEnv::BRANCH_SHA['master'], 'six') }
+ let(:blob) { described_class.find(repository, TestEnv::BRANCH_SHA['master'], 'six') }
it { expect(blob.id).to eq('409f37c4f05865e4fb208c771485f211a22c4c2d') }
it { expect(blob.data).to eq('') }
@@ -119,7 +119,7 @@ RSpec.describe Gitlab::Git::Blob do
end
context 'large file' do
- let(:blob) { Gitlab::Git::Blob.find(repository, TestEnv::BRANCH_SHA['master'], 'files/images/6049019_460s.jpg') }
+ let(:blob) { described_class.find(repository, TestEnv::BRANCH_SHA['master'], 'files/images/6049019_460s.jpg') }
let(:blob_size) { 111803 }
let(:stub_limit) { 1000 }
@@ -141,7 +141,7 @@ RSpec.describe Gitlab::Git::Blob do
end
it 'marks the blob as binary' do
- expect(Gitlab::Git::Blob).to receive(:new)
+ expect(described_class).to receive(:new)
.with(hash_including(binary: true))
.and_call_original
@@ -167,8 +167,8 @@ RSpec.describe Gitlab::Git::Blob do
end
describe '.raw' do
- let(:raw_blob) { Gitlab::Git::Blob.raw(repository, SeedRepo::RubyBlob::ID) }
- let(:bad_blob) { Gitlab::Git::Blob.raw(repository, SeedRepo::BigCommit::ID) }
+ let(:raw_blob) { described_class.raw(repository, SeedRepo::RubyBlob::ID) }
+ let(:bad_blob) { described_class.raw(repository, SeedRepo::BigCommit::ID) }
it { expect(raw_blob.id).to eq(SeedRepo::RubyBlob::ID) }
it { expect(raw_blob.data[0..10]).to eq("require \'fi") }
@@ -305,7 +305,7 @@ RSpec.describe Gitlab::Git::Blob do
describe '.batch_lfs_pointers' do
let(:non_lfs_blob) do
- Gitlab::Git::Blob.find(
+ described_class.find(
repository,
'master',
'README.md'
@@ -313,7 +313,7 @@ RSpec.describe Gitlab::Git::Blob do
end
let(:lfs_blob) do
- Gitlab::Git::Blob.find(
+ described_class.find(
repository,
TestEnv::BRANCH_SHA['master'],
'files/lfs/lfs_object.iso'
@@ -324,7 +324,7 @@ RSpec.describe Gitlab::Git::Blob do
blobs = described_class.batch_lfs_pointers(repository, [lfs_blob.id])
expect(blobs.count).to eq(1)
- expect(blobs).to all( be_a(Gitlab::Git::Blob) )
+ expect(blobs).to all( be_a(described_class) )
expect(blobs).to be_an(Array)
end
@@ -332,7 +332,7 @@ RSpec.describe Gitlab::Git::Blob do
blobs = described_class.batch_lfs_pointers(repository, [lfs_blob.id].lazy)
expect(blobs.count).to eq(1)
- expect(blobs).to all( be_a(Gitlab::Git::Blob) )
+ expect(blobs).to all( be_a(described_class) )
end
it 'handles empty list of IDs gracefully' do
@@ -361,7 +361,7 @@ RSpec.describe Gitlab::Git::Blob do
describe 'encoding', :aggregate_failures do
context 'file with russian text' do
- let(:blob) { Gitlab::Git::Blob.find(repository, TestEnv::BRANCH_SHA['master'], "encoding/russian.rb") }
+ let(:blob) { described_class.find(repository, TestEnv::BRANCH_SHA['master'], "encoding/russian.rb") }
it 'has the correct blob attributes' do
expect(blob.name).to eq("russian.rb")
@@ -375,7 +375,7 @@ RSpec.describe Gitlab::Git::Blob do
end
context 'file with Japanese text' do
- let(:blob) { Gitlab::Git::Blob.find(repository, TestEnv::BRANCH_SHA['master'], "encoding/テスト.txt") }
+ let(:blob) { described_class.find(repository, TestEnv::BRANCH_SHA['master'], "encoding/テスト.txt") }
it 'has the correct blob attributes' do
expect(blob.name).to eq("テスト.txt")
@@ -387,7 +387,7 @@ RSpec.describe Gitlab::Git::Blob do
end
context 'file with ISO-8859 text' do
- let(:blob) { Gitlab::Git::Blob.find(repository, TestEnv::BRANCH_SHA['master'], "encoding/iso8859.txt") }
+ let(:blob) { described_class.find(repository, TestEnv::BRANCH_SHA['master'], "encoding/iso8859.txt") }
it 'has the correct blob attributes' do
expect(blob.name).to eq("iso8859.txt")
@@ -402,7 +402,7 @@ RSpec.describe Gitlab::Git::Blob do
describe 'mode' do
context 'file regular' do
let(:blob) do
- Gitlab::Git::Blob.find(
+ described_class.find(
repository,
TestEnv::BRANCH_SHA['master'],
'files/ruby/regex.rb'
@@ -417,7 +417,7 @@ RSpec.describe Gitlab::Git::Blob do
context 'file binary' do
let(:blob) do
- Gitlab::Git::Blob.find(
+ described_class.find(
repository,
TestEnv::BRANCH_SHA['with-executables'],
'files/executables/ls'
@@ -432,7 +432,7 @@ RSpec.describe Gitlab::Git::Blob do
context 'file symlink to regular' do
let(:blob) do
- Gitlab::Git::Blob.find(
+ described_class.find(
repository,
'88ce9520c07b7067f589b7f83a30b6250883115c',
'symlink'
@@ -449,7 +449,7 @@ RSpec.describe Gitlab::Git::Blob do
describe 'lfs_pointers' do
context 'file a valid lfs pointer' do
let(:blob) do
- Gitlab::Git::Blob.find(
+ described_class.find(
repository,
TestEnv::BRANCH_SHA['png-lfs'],
'files/images/emoji.png'
@@ -469,7 +469,7 @@ RSpec.describe Gitlab::Git::Blob do
describe '#load_all_data!' do
let(:full_data) { 'abcd' }
- let(:blob) { Gitlab::Git::Blob.new(name: 'test', size: 4, data: 'abc') }
+ let(:blob) { described_class.new(name: 'test', size: 4, data: 'abc') }
subject { blob.load_all_data!(repository) }
@@ -483,7 +483,7 @@ RSpec.describe Gitlab::Git::Blob do
end
context 'with a fully loaded blob' do
- let(:blob) { Gitlab::Git::Blob.new(name: 'test', size: 4, data: full_data) }
+ let(:blob) { described_class.new(name: 'test', size: 4, data: full_data) }
it "doesn't perform any loading" do
expect(repository.gitaly_blob_client).not_to receive(:get_blob)
@@ -497,7 +497,7 @@ RSpec.describe Gitlab::Git::Blob do
describe '#truncated?' do
context 'when blob.size is nil' do
- let(:nil_size_blob) { Gitlab::Git::Blob.new(name: 'test', data: 'abcd') }
+ let(:nil_size_blob) { described_class.new(name: 'test', data: 'abcd') }
it 'returns false' do
expect(nil_size_blob.truncated?).to be_falsey
@@ -505,7 +505,7 @@ RSpec.describe Gitlab::Git::Blob do
end
context 'when blob.data is missing' do
- let(:nil_data_blob) { Gitlab::Git::Blob.new(name: 'test', size: 4) }
+ let(:nil_data_blob) { described_class.new(name: 'test', size: 4) }
it 'returns false' do
expect(nil_data_blob.truncated?).to be_falsey
@@ -513,7 +513,7 @@ RSpec.describe Gitlab::Git::Blob do
end
context 'when the blob is truncated' do
- let(:truncated_blob) { Gitlab::Git::Blob.new(name: 'test', size: 40, data: 'abcd') }
+ let(:truncated_blob) { described_class.new(name: 'test', size: 40, data: 'abcd') }
it 'returns true' do
expect(truncated_blob.truncated?).to be_truthy
@@ -521,7 +521,7 @@ RSpec.describe Gitlab::Git::Blob do
end
context 'when the blob is untruncated' do
- let(:untruncated_blob) { Gitlab::Git::Blob.new(name: 'test', size: 4, data: 'abcd') }
+ let(:untruncated_blob) { described_class.new(name: 'test', size: 4, data: 'abcd') }
it 'returns false' do
expect(untruncated_blob.truncated?).to be_falsey
@@ -547,7 +547,7 @@ RSpec.describe Gitlab::Git::Blob do
context 'when the encoding cannot be detected' do
it 'successfully splits the data' do
data = "test\nblob"
- blob = Gitlab::Git::Blob.new(name: 'test', size: data.bytesize, data: data)
+ blob = described_class.new(name: 'test', size: data.bytesize, data: data)
expect(blob).to receive(:ruby_encoding) { nil }
expect(blob.lines).to eq(data.split("\n"))
diff --git a/spec/lib/gitlab/git/commit_spec.rb b/spec/lib/gitlab/git/commit_spec.rb
index e5f8918f7bb..dd9f77f0211 100644
--- a/spec/lib/gitlab/git/commit_spec.rb
+++ b/spec/lib/gitlab/git/commit_spec.rb
@@ -420,7 +420,7 @@ RSpec.describe Gitlab::Git::Commit, feature_category: :source_code_management do
commits = described_class.batch_by_oid(repository, oids)
expect(commits.count).to eq(2)
- expect(commits).to all( be_a(Gitlab::Git::Commit) )
+ expect(commits).to all( be_a(described_class) )
expect(commits.first.sha).to eq(SeedRepo::Commit::ID)
expect(commits.second.sha).to eq(SeedRepo::FirstCommit::ID)
end
@@ -476,7 +476,7 @@ RSpec.describe Gitlab::Git::Commit, feature_category: :source_code_management do
let(:commit_id) { '0b4bc9a49b562e85de7cc9e834518ea6828729b9' }
it 'returns signature and signed text' do
- signature, signed_text = subject
+ signature, signed_text, signer = subject.values_at(:signature, :signed_text, :signer)
expected_signature = <<~SIGNATURE
-----BEGIN PGP SIGNATURE-----
@@ -509,6 +509,7 @@ RSpec.describe Gitlab::Git::Commit, feature_category: :source_code_management do
expect(signed_text).to eq(expected_signed_text)
expect(signed_text).to be_a_binary_string
+ expect(signer).to eq(:SIGNER_USER)
end
end
diff --git a/spec/lib/gitlab/git/compare_spec.rb b/spec/lib/gitlab/git/compare_spec.rb
index e8c683cf8aa..81b5aa94656 100644
--- a/spec/lib/gitlab/git/compare_spec.rb
+++ b/spec/lib/gitlab/git/compare_spec.rb
@@ -5,8 +5,8 @@ require "spec_helper"
RSpec.describe Gitlab::Git::Compare do
let_it_be(:repository) { create(:project, :repository).repository.raw }
- let(:compare) { Gitlab::Git::Compare.new(repository, SeedRepo::BigCommit::ID, SeedRepo::Commit::ID, straight: false) }
- let(:compare_straight) { Gitlab::Git::Compare.new(repository, SeedRepo::BigCommit::ID, SeedRepo::Commit::ID, straight: true) }
+ let(:compare) { described_class.new(repository, SeedRepo::BigCommit::ID, SeedRepo::Commit::ID, straight: false) }
+ let(:compare_straight) { described_class.new(repository, SeedRepo::BigCommit::ID, SeedRepo::Commit::ID, straight: true) }
describe '#commits' do
subject do
@@ -21,25 +21,25 @@ RSpec.describe Gitlab::Git::Compare do
it { is_expected.not_to include(SeedRepo::BigCommit::PARENT_ID) }
context 'non-existing base ref' do
- let(:compare) { Gitlab::Git::Compare.new(repository, 'no-such-branch', SeedRepo::Commit::ID) }
+ let(:compare) { described_class.new(repository, 'no-such-branch', SeedRepo::Commit::ID) }
it { is_expected.to be_empty }
end
context 'non-existing head ref' do
- let(:compare) { Gitlab::Git::Compare.new(repository, SeedRepo::BigCommit::ID, '1234567890') }
+ let(:compare) { described_class.new(repository, SeedRepo::BigCommit::ID, '1234567890') }
it { is_expected.to be_empty }
end
context 'base ref is equal to head ref' do
- let(:compare) { Gitlab::Git::Compare.new(repository, SeedRepo::BigCommit::ID, SeedRepo::BigCommit::ID) }
+ let(:compare) { described_class.new(repository, SeedRepo::BigCommit::ID, SeedRepo::BigCommit::ID) }
it { is_expected.to be_empty }
end
context 'providing nil as base ref or head ref' do
- let(:compare) { Gitlab::Git::Compare.new(repository, nil, nil) }
+ let(:compare) { described_class.new(repository, nil, nil) }
it { is_expected.to be_empty }
end
@@ -58,13 +58,13 @@ RSpec.describe Gitlab::Git::Compare do
it { is_expected.not_to include('LICENSE') }
context 'non-existing base ref' do
- let(:compare) { Gitlab::Git::Compare.new(repository, 'no-such-branch', SeedRepo::Commit::ID) }
+ let(:compare) { described_class.new(repository, 'no-such-branch', SeedRepo::Commit::ID) }
it { is_expected.to be_empty }
end
context 'non-existing head ref' do
- let(:compare) { Gitlab::Git::Compare.new(repository, SeedRepo::BigCommit::ID, '1234567890') }
+ let(:compare) { described_class.new(repository, SeedRepo::BigCommit::ID, '1234567890') }
it { is_expected.to be_empty }
end
@@ -78,7 +78,7 @@ RSpec.describe Gitlab::Git::Compare do
it { is_expected.to eq(false) }
context 'base ref is equal to head ref' do
- let(:compare) { Gitlab::Git::Compare.new(repository, SeedRepo::BigCommit::ID, SeedRepo::BigCommit::ID) }
+ let(:compare) { described_class.new(repository, SeedRepo::BigCommit::ID, SeedRepo::BigCommit::ID) }
it { is_expected.to eq(true) }
end
diff --git a/spec/lib/gitlab/git/diff_collection_spec.rb b/spec/lib/gitlab/git/diff_collection_spec.rb
index 5fa0447091c..72ddd0759ec 100644
--- a/spec/lib/gitlab/git/diff_collection_spec.rb
+++ b/spec/lib/gitlab/git/diff_collection_spec.rb
@@ -45,7 +45,7 @@ RSpec.describe Gitlab::Git::DiffCollection do
end
subject do
- Gitlab::Git::DiffCollection.new(
+ described_class.new(
iterator,
max_files: max_files,
max_lines: max_lines,
@@ -495,7 +495,7 @@ RSpec.describe Gitlab::Git::DiffCollection do
end
describe 'empty collection' do
- subject { Gitlab::Git::DiffCollection.new([]) }
+ subject { described_class.new([]) }
it_behaves_like 'overflow stuff'
@@ -533,7 +533,7 @@ RSpec.describe Gitlab::Git::DiffCollection do
describe '#each' do
context 'when diff are too large' do
let(:collection) do
- Gitlab::Git::DiffCollection.new([{ diff: 'a' * 204800 }])
+ described_class.new([{ diff: 'a' * 204800 }])
end
it 'yields Diff instances even when they are too large' do
@@ -612,7 +612,7 @@ RSpec.describe Gitlab::Git::DiffCollection do
let(:iterator) { [fake_diff(1, 1)] * 4 }
before do
- allow(Gitlab::Git::DiffCollection)
+ allow(described_class)
.to receive(:default_limits)
.and_return({ max_files: 2, max_lines: max_lines })
end
@@ -641,7 +641,7 @@ RSpec.describe Gitlab::Git::DiffCollection do
end
before do
- allow(Gitlab::Git::DiffCollection)
+ allow(described_class)
.to receive(:default_limits)
.and_return({ max_files: max_files, max_lines: 80 })
end
@@ -672,7 +672,7 @@ RSpec.describe Gitlab::Git::DiffCollection do
before do
allow(Gitlab::CurrentSettings).to receive(:diff_max_patch_bytes).and_return(1.megabyte)
- allow(Gitlab::Git::DiffCollection)
+ allow(described_class)
.to receive(:default_limits)
.and_return({ max_files: 4, max_lines: 3000 })
end
@@ -713,7 +713,7 @@ RSpec.describe Gitlab::Git::DiffCollection do
context 'when offset_index is given' do
subject do
- Gitlab::Git::DiffCollection.new(
+ described_class.new(
iterator,
max_files: max_files,
max_lines: max_lines,
@@ -760,7 +760,7 @@ RSpec.describe Gitlab::Git::DiffCollection do
end
before do
- allow(Gitlab::Git::DiffCollection)
+ allow(described_class)
.to receive(:default_limits)
.and_return({ max_files: max_files, max_lines: 80 })
end
diff --git a/spec/lib/gitlab/git/finders/refs_finder_spec.rb b/spec/lib/gitlab/git/finders/refs_finder_spec.rb
new file mode 100644
index 00000000000..63d794d1e59
--- /dev/null
+++ b/spec/lib/gitlab/git/finders/refs_finder_spec.rb
@@ -0,0 +1,62 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+
+RSpec.describe Gitlab::Git::Finders::RefsFinder, feature_category: :source_code_management do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project, :repository) }
+
+ let(:repository) { project.repository }
+ let(:finder) { described_class.new(repository, **params) }
+ let(:params) { {} }
+
+ describe "#execute" do
+ subject { finder.execute }
+
+ context "when :ref_type is :branches" do
+ let(:params) do
+ { search: "mast", ref_type: :branches }
+ end
+
+ it { is_expected.to be_an(Array) }
+
+ it "returns matching ref object" do
+ expect(subject.length).to eq(1)
+
+ ref = subject.first
+
+ expect(ref).to be_a(Gitaly::ListRefsResponse::Reference)
+ expect(ref.name).to eq("refs/heads/master")
+ expect(ref.target).to be_a(String)
+ end
+ end
+
+ context "when :ref_type is :tags" do
+ let(:params) do
+ { search: "v1.0.", ref_type: :tags }
+ end
+
+ it { is_expected.to be_an(Array) }
+
+ it "returns matching ref object" do
+ expect(subject.length).to eq(1)
+
+ ref = subject.first
+
+ expect(ref).to be_a(Gitaly::ListRefsResponse::Reference)
+ expect(ref.name).to eq("refs/tags/v1.0.0")
+ expect(ref.target).to be_a(String)
+ end
+ end
+
+ context "when :ref_type is invalid" do
+ let(:params) do
+ { search: "master", ref_type: nil }
+ end
+
+ it "raises an error" do
+ expect { subject }.to raise_error(described_class::UnknownRefTypeError)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/git/keep_around_spec.rb b/spec/lib/gitlab/git/keep_around_spec.rb
index d6359d55646..65bed3f2ae6 100644
--- a/spec/lib/gitlab/git/keep_around_spec.rb
+++ b/spec/lib/gitlab/git/keep_around_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe Gitlab::Git::KeepAround do
let(:repository) { create(:project, :repository).repository }
let(:service) { described_class.new(repository) }
+ let(:keep_around_ref_name) { "refs/#{::Repository::REF_KEEP_AROUND}/#{sample_commit.id}" }
it "does not fail if we attempt to reference bad commit" do
expect(service.kept_around?('abc1234')).to be_falsey
@@ -16,6 +17,7 @@ RSpec.describe Gitlab::Git::KeepAround do
service.execute([sample_commit.id])
expect(service.kept_around?(sample_commit.id)).to be_truthy
+ expect(repository.list_refs([keep_around_ref_name])).not_to be_empty
end
it "does not fail if writting the ref fails" do
@@ -45,4 +47,17 @@ RSpec.describe Gitlab::Git::KeepAround do
expect(service.kept_around?(another_sample_commit.id)).to be_truthy
end
end
+
+ context 'when disable_keep_around_refs feature flag is enabled' do
+ before do
+ stub_feature_flags(disable_keep_around_refs: true)
+ end
+
+ it 'does not create keep-around refs' do
+ service.execute([sample_commit.id])
+
+ expect(service.kept_around?(sample_commit.id)).to be_truthy
+ expect(repository.list_refs([keep_around_ref_name])).to be_empty
+ end
+ end
end
diff --git a/spec/lib/gitlab/git/repository_spec.rb b/spec/lib/gitlab/git/repository_spec.rb
index b137157f2d5..9ce8a674146 100644
--- a/spec/lib/gitlab/git/repository_spec.rb
+++ b/spec/lib/gitlab/git/repository_spec.rb
@@ -285,6 +285,28 @@ RSpec.describe Gitlab::Git::Repository, feature_category: :source_code_managemen
subject { repository.size }
it { is_expected.to be > 0 }
+ it { is_expected.to be_a(Float) }
+
+ it "uses repository_info for size" do
+ expect(repository.gitaly_repository_client).to receive(:repository_info).and_call_original
+
+ subject
+ end
+
+ context "when use_repository_info_for_repository_size feature flag is disabled" do
+ before do
+ stub_feature_flags(use_repository_info_for_repository_size: false)
+ end
+
+ it { is_expected.to be > 0 }
+ it { is_expected.to be_a(Float) }
+
+ it "uses repository_size for size" do
+ expect(repository.gitaly_repository_client).to receive(:repository_size).and_call_original
+
+ subject
+ end
+ end
end
describe '#to_s' do
@@ -1151,7 +1173,31 @@ RSpec.describe Gitlab::Git::Repository, feature_category: :source_code_managemen
commit_result.newrev
end
- subject { repository.new_blobs(newrevs).to_a }
+ subject { repository.new_blobs(newrevs) }
+
+ describe 'memoization' do
+ before do
+ allow(repository).to receive(:blobs).once.with(["--not", "--all", "--not", "revision1"], kind_of(Hash))
+ .and_return(['first result'])
+ repository.new_blobs(['revision1'])
+ end
+
+ it 'calls blobs only once' do
+ expect(repository.new_blobs(['revision1'])).to eq(['first result'])
+ end
+
+ context 'when called with a different revision' do
+ before do
+ allow(repository).to receive(:blobs).once.with(["--not", "--all", "--not", "revision2"], kind_of(Hash))
+ .and_return(['second result'])
+ repository.new_blobs(['revision2'])
+ end
+
+ it 'memoizes the different arguments' do
+ expect(repository.new_blobs(['revision2'])).to eq(['second result'])
+ end
+ end
+ end
shared_examples '#new_blobs with revisions' do
before do
@@ -1173,7 +1219,9 @@ RSpec.describe Gitlab::Git::Repository, feature_category: :source_code_managemen
it 'memoizes results' do
expect(subject).to match_array(expected_blobs)
- expect(subject).to match_array(expected_blobs)
+
+ # call subject again
+ expect(repository.new_blobs(newrevs)).to match_array(expected_blobs)
end
end
@@ -2146,10 +2194,10 @@ RSpec.describe Gitlab::Git::Repository, feature_category: :source_code_managemen
expect(repository.refs_by_oid(oid: Gitlab::Git::BLANK_SHA, limit: 0)).to eq([])
end
- it 'returns nil for an empty repo' do
+ it 'returns empty for an empty repo' do
project = create(:project)
- expect(project.repository.refs_by_oid(oid: TestEnv::BRANCH_SHA['master'], limit: 0)).to be_nil
+ expect(project.repository.refs_by_oid(oid: TestEnv::BRANCH_SHA['master'], limit: 0)).to eq([])
end
end
diff --git a/spec/lib/gitlab/git/tree_spec.rb b/spec/lib/gitlab/git/tree_spec.rb
index 2a68fa66b18..4a20e0b1156 100644
--- a/spec/lib/gitlab/git/tree_spec.rb
+++ b/spec/lib/gitlab/git/tree_spec.rb
@@ -160,6 +160,15 @@ RSpec.describe Gitlab::Git::Tree do
expect(cursor.next_cursor).to be_present
end
end
+
+ context 'and invalid reference is used' do
+ it 'returns no entries and nil cursor' do
+ allow(repository.gitaly_commit_client).to receive(:tree_entries).and_raise(Gitlab::Git::Index::IndexError)
+
+ expect(entries.count).to eq(0)
+ expect(cursor).to be_nil
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/git_access_snippet_spec.rb b/spec/lib/gitlab/git_access_snippet_spec.rb
index 0d069d36e48..becf97bb24e 100644
--- a/spec/lib/gitlab/git_access_snippet_spec.rb
+++ b/spec/lib/gitlab/git_access_snippet_spec.rb
@@ -24,7 +24,7 @@ RSpec.describe Gitlab::GitAccessSnippet do
let(:push_access_check) { access.check('git-receive-pack', changes) }
let(:pull_access_check) { access.check('git-upload-pack', changes) }
- subject(:access) { Gitlab::GitAccessSnippet.new(actor, snippet, protocol, authentication_abilities: authentication_abilities) }
+ subject(:access) { described_class.new(actor, snippet, protocol, authentication_abilities: authentication_abilities) }
describe 'when actor is a DeployKey' do
let(:actor) { build(:deploy_key) }
diff --git a/spec/lib/gitlab/gitaly_client/call_spec.rb b/spec/lib/gitlab/gitaly_client/call_spec.rb
index 099307fc4e1..c3c3c7bb2e8 100644
--- a/spec/lib/gitlab/gitaly_client/call_spec.rb
+++ b/spec/lib/gitlab/gitaly_client/call_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::GitalyClient::Call do
+RSpec.describe Gitlab::GitalyClient::Call, feature_category: :gitaly do
describe '#call', :request_store do
let(:client) { Gitlab::GitalyClient }
let(:storage) { 'default' }
@@ -50,7 +50,7 @@ RSpec.describe Gitlab::GitalyClient::Call do
expect_call_details_to_match
end
- context 'when err' do
+ context 'when the call raises an standard error' do
before do
allow(client).to receive(:execute).and_raise(StandardError)
end
@@ -62,6 +62,25 @@ RSpec.describe Gitlab::GitalyClient::Call do
expect_call_details_to_match
end
end
+
+ context 'when the call raises a BadStatus error' do
+ before do
+ allow(client).to receive(:execute).and_raise(GRPC::Unavailable)
+ end
+
+ it 'attaches gitaly metadata' do
+ expect { subject }.to raise_error do |err|
+ expect(err.metadata).to eql(
+ gitaly_error_metadata: {
+ storage: storage,
+ address: client.address(storage),
+ service: service,
+ rpc: rpc
+ }
+ )
+ end
+ end
+ end
end
context 'when the response is an enumerator' do
@@ -103,7 +122,7 @@ RSpec.describe Gitlab::GitalyClient::Call do
expect_call_details_to_match(duration_higher_than: 0.1)
end
- context 'when err' do
+ context 'when the call raises an standard error' do
let(:response) do
Enumerator.new do |yielder|
sleep 0.2
@@ -119,6 +138,28 @@ RSpec.describe Gitlab::GitalyClient::Call do
expect_call_details_to_match(duration_higher_than: 0.2)
end
end
+
+ context 'when the call raises a BadStatus error' do
+ let(:response) do
+ Enumerator.new do |yielder|
+ yielder << 1
+ raise GRPC::Unavailable
+ end
+ end
+
+ it 'attaches gitaly metadata' do
+ expect { subject.to_a }.to raise_error do |err|
+ expect(err.metadata).to eql(
+ gitaly_error_metadata: {
+ storage: storage,
+ address: client.address(storage),
+ service: service,
+ rpc: rpc
+ }
+ )
+ end
+ end
+ end
end
end
end
diff --git a/spec/lib/gitlab/gitaly_client/commit_service_spec.rb b/spec/lib/gitlab/gitaly_client/commit_service_spec.rb
index 70c4a2a71ff..fd66efe12c8 100644
--- a/spec/lib/gitlab/gitaly_client/commit_service_spec.rb
+++ b/spec/lib/gitlab/gitaly_client/commit_service_spec.rb
@@ -334,112 +334,6 @@ RSpec.describe Gitlab::GitalyClient::CommitService, feature_category: :gitaly do
include_examples 'uses requests format'
end
end
-
- context 'when feature flag "find_changed_paths_new_format" is disabled' do
- before do
- stub_feature_flags(find_changed_paths_new_format: false)
- end
-
- shared_examples 'uses commits format' do
- it do
- subject
- expect(Gitaly::FindChangedPathsRequest)
- .to have_received(:new).with(
- repository: repository_message,
- commits: commits,
- merge_commit_diff_mode: mapped_merge_commit_diff_mode
- )
- end
- end
-
- context 'when merge_commit_diff_mode is nil' do
- let(:merge_commit_diff_mode) { nil }
-
- include_examples 'includes paths different in any parent'
-
- include_examples 'uses commits format'
- end
-
- context 'when merge_commit_diff_mode is :unspecified' do
- let(:merge_commit_diff_mode) { :unspecified }
-
- include_examples 'includes paths different in any parent'
-
- include_examples 'uses commits format'
- end
-
- context 'when merge_commit_diff_mode is :include_merges' do
- let(:merge_commit_diff_mode) { :include_merges }
-
- include_examples 'includes paths different in any parent'
-
- include_examples 'uses commits format'
- end
-
- context 'when merge_commit_diff_mode is invalid' do
- let(:merge_commit_diff_mode) { 'invalid' }
-
- include_examples 'includes paths different in any parent'
-
- include_examples 'uses commits format'
- end
-
- context 'when merge_commit_diff_mode is :all_parents' do
- let(:merge_commit_diff_mode) { :all_parents }
-
- include_examples 'includes paths different in all parents'
-
- include_examples 'uses commits format'
- end
-
- context 'when feature flag "merge_commit_diff_modes" is disabled' do
- let(:mapped_merge_commit_diff_mode) { nil }
-
- before do
- stub_feature_flags(merge_commit_diff_modes: false)
- end
-
- context 'when merge_commit_diff_mode is nil' do
- let(:merge_commit_diff_mode) { nil }
-
- include_examples 'includes paths different in any parent'
-
- include_examples 'uses commits format'
- end
-
- context 'when merge_commit_diff_mode is :unspecified' do
- let(:merge_commit_diff_mode) { :unspecified }
-
- include_examples 'includes paths different in any parent'
-
- include_examples 'uses commits format'
- end
-
- context 'when merge_commit_diff_mode is :include_merges' do
- let(:merge_commit_diff_mode) { :include_merges }
-
- include_examples 'includes paths different in any parent'
-
- include_examples 'uses commits format'
- end
-
- context 'when merge_commit_diff_mode is invalid' do
- let(:merge_commit_diff_mode) { 'invalid' }
-
- include_examples 'includes paths different in any parent'
-
- include_examples 'uses commits format'
- end
-
- context 'when merge_commit_diff_mode is :all_parents' do
- let(:merge_commit_diff_mode) { :all_parents }
-
- include_examples 'includes paths different in any parent'
-
- include_examples 'uses commits format'
- end
- end
- end
end
describe '#tree_entries' do
@@ -1144,4 +1038,38 @@ RSpec.describe Gitlab::GitalyClient::CommitService, feature_category: :gitaly do
end
end
end
+
+ describe '#get_commit_signatures' do
+ let(:project) { create(:project, :test_repo) }
+
+ it 'returns commit signatures for specified commit ids', :aggregate_failures do
+ without_signature = "e63f41fe459e62e1228fcef60d7189127aeba95a" # has no signature
+
+ signed_by_user = [
+ "a17a9f66543673edf0a3d1c6b93bdda3fe600f32", # has signature
+ "7b5160f9bb23a3d58a0accdbe89da13b96b1ece9" # SSH signature
+ ]
+
+ large_signed_text = "8cf8e80a5a0546e391823c250f2b26b9cf15ce88" # has signature and commit message > 4MB
+
+ signatures = client.get_commit_signatures(
+ [without_signature, large_signed_text, *signed_by_user]
+ )
+
+ expect(signatures.keys).to match_array([large_signed_text, *signed_by_user])
+
+ [large_signed_text, *signed_by_user].each do |commit_id|
+ expect(signatures[commit_id][:signature]).to be_present
+ expect(signatures[commit_id][:signer]).to eq(:SIGNER_USER)
+ end
+
+ signed_by_user.each do |commit_id|
+ commit = project.commit(commit_id)
+ expect(signatures[commit_id][:signed_text]).to include(commit.message)
+ expect(signatures[commit_id][:signed_text]).to include(commit.description)
+ end
+
+ expect(signatures[large_signed_text][:signed_text].size).to eq(4971878)
+ end
+ end
end
diff --git a/spec/lib/gitlab/gitaly_client/operation_service_spec.rb b/spec/lib/gitlab/gitaly_client/operation_service_spec.rb
index 869195a92b3..4a3607ed6db 100644
--- a/spec/lib/gitlab/gitaly_client/operation_service_spec.rb
+++ b/spec/lib/gitlab/gitaly_client/operation_service_spec.rb
@@ -173,7 +173,7 @@ RSpec.describe Gitlab::GitalyClient::OperationService, feature_category: :source
let(:payload) do
{ source_sha: source_sha, branch: 'branch', target_ref: ref,
- message: message, first_parent_ref: first_parent_ref, allow_conflicts: true }
+ message: message, first_parent_ref: first_parent_ref }
end
it 'sends a user_merge_to_ref message' do
@@ -182,6 +182,7 @@ RSpec.describe Gitlab::GitalyClient::OperationService, feature_category: :source
expect(options).to be_kind_of(Hash)
expect(request.to_h).to eq(
payload.merge({
+ allow_conflicts: false,
repository: repository.gitaly_repository.to_h,
message: message.dup.force_encoding(Encoding::ASCII_8BIT),
user: Gitlab::Git::User.from_gitlab(user).to_gitaly.to_h,
diff --git a/spec/lib/gitlab/gitaly_client/repository_service_spec.rb b/spec/lib/gitlab/gitaly_client/repository_service_spec.rb
index f457ba06074..08457e20ec3 100644
--- a/spec/lib/gitlab/gitaly_client/repository_service_spec.rb
+++ b/spec/lib/gitlab/gitaly_client/repository_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::GitalyClient::RepositoryService do
+RSpec.describe Gitlab::GitalyClient::RepositoryService, feature_category: :gitaly do
using RSpec::Parameterized::TableSyntax
let_it_be(:project) { create(:project, :repository) }
@@ -79,6 +79,21 @@ RSpec.describe Gitlab::GitalyClient::RepositoryService do
end
end
+ describe '#repository_info' do
+ it 'sends a repository_info message' do
+ expect_any_instance_of(Gitaly::RepositoryService::Stub)
+ .to receive(:repository_info)
+ .with(gitaly_request_with_path(storage_name, relative_path), kind_of(Hash))
+ .and_call_original
+
+ response = client.repository_info
+
+ expect(response.size).to be_an(Integer)
+ expect(response.references).to be_a(Gitaly::RepositoryInfoResponse::ReferencesInfo)
+ expect(response.objects).to be_a(Gitaly::RepositoryInfoResponse::ObjectsInfo)
+ end
+ end
+
describe '#get_object_directory_size' do
it 'sends a get_object_directory_size message' do
expect_any_instance_of(Gitaly::RepositoryService::Stub)
diff --git a/spec/lib/gitlab/github_import/client_pool_spec.rb b/spec/lib/gitlab/github_import/client_pool_spec.rb
new file mode 100644
index 00000000000..aabb47c2cf1
--- /dev/null
+++ b/spec/lib/gitlab/github_import/client_pool_spec.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::GithubImport::ClientPool, feature_category: :importers do
+ subject(:pool) { described_class.new(token_pool: %w[foo bar], per_page: 1, parallel: true) }
+
+ describe '#best_client' do
+ it 'returns the client with the most remaining requests' do
+ allow(Gitlab::GithubImport::Client).to receive(:new).and_return(
+ instance_double(
+ Gitlab::GithubImport::Client,
+ requests_remaining?: true, remaining_requests: 10, rate_limit_resets_in: 1
+ ),
+ instance_double(
+ Gitlab::GithubImport::Client,
+ requests_remaining?: true, remaining_requests: 20, rate_limit_resets_in: 2
+ )
+ )
+
+ expect(pool.best_client.remaining_requests).to eq(20)
+ end
+
+ context 'when all clients are rate limited' do
+ it 'returns the client with the closest rate limit reset time' do
+ allow(Gitlab::GithubImport::Client).to receive(:new).and_return(
+ instance_double(
+ Gitlab::GithubImport::Client,
+ requests_remaining?: false, remaining_requests: 10, rate_limit_resets_in: 10
+ ),
+ instance_double(
+ Gitlab::GithubImport::Client,
+ requests_remaining?: false, remaining_requests: 20, rate_limit_resets_in: 20
+ )
+ )
+
+ expect(pool.best_client.rate_limit_resets_in).to eq(10)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/github_import/importer/issue_importer_spec.rb b/spec/lib/gitlab/github_import/importer/issue_importer_spec.rb
index 1692aac49f2..bf2ffda3bf1 100644
--- a/spec/lib/gitlab/github_import/importer/issue_importer_spec.rb
+++ b/spec/lib/gitlab/github_import/importer/issue_importer_spec.rb
@@ -58,54 +58,24 @@ RSpec.describe Gitlab::GithubImport::Importer::IssueImporter, :clean_gitlab_redi
describe '#execute' do
let(:importer) { described_class.new(issue, project, client) }
- context 'when :issues_full_test_search is disabled' do
- before do
- stub_feature_flags(issues_full_text_search: false)
- end
-
- it 'creates the issue and assignees but does not update search data' do
- expect(importer)
- .to receive(:create_issue)
- .and_return(10)
-
- expect(importer)
- .to receive(:create_assignees)
- .with(10)
+ it 'creates the issue and assignees and updates_search_data' do
+ expect(importer)
+ .to receive(:create_issue)
+ .and_return(10)
- expect(importer.issuable_finder)
- .to receive(:cache_database_id)
- .with(10)
+ expect(importer)
+ .to receive(:create_assignees)
+ .with(10)
- expect(importer).not_to receive(:update_search_data)
+ expect(importer.issuable_finder)
+ .to receive(:cache_database_id)
+ .with(10)
- importer.execute
- end
- end
-
- context 'when :issues_full_text_search feature is enabled' do
- before do
- stub_feature_flags(issues_full_text_search: true)
- end
+ expect(importer)
+ .to receive(:update_search_data)
+ .with(10)
- it 'creates the issue and assignees and updates_search_data' do
- expect(importer)
- .to receive(:create_issue)
- .and_return(10)
-
- expect(importer)
- .to receive(:create_assignees)
- .with(10)
-
- expect(importer.issuable_finder)
- .to receive(:cache_database_id)
- .with(10)
-
- expect(importer)
- .to receive(:update_search_data)
- .with(10)
-
- importer.execute
- end
+ importer.execute
end
end
diff --git a/spec/lib/gitlab/github_import/settings_spec.rb b/spec/lib/gitlab/github_import/settings_spec.rb
index 43e096863b8..d670aaea482 100644
--- a/spec/lib/gitlab/github_import/settings_spec.rb
+++ b/spec/lib/gitlab/github_import/settings_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::GithubImport::Settings do
+RSpec.describe Gitlab::GithubImport::Settings, feature_category: :importers do
subject(:settings) { described_class.new(project) }
let_it_be(:project) { create(:project) }
@@ -55,19 +55,26 @@ RSpec.describe Gitlab::GithubImport::Settings do
describe '#write' do
let(:data_input) do
{
- single_endpoint_issue_events_import: true,
- single_endpoint_notes_import: 'false',
- attachments_import: nil,
- collaborators_import: false,
- foo: :bar
+ optional_stages: {
+ single_endpoint_issue_events_import: true,
+ single_endpoint_notes_import: 'false',
+ attachments_import: nil,
+ collaborators_import: false,
+ foo: :bar
+ },
+ additional_access_tokens: %w[foo bar]
}.stringify_keys
end
- it 'puts optional steps flags into projects import_data' do
+ it 'puts optional steps & access tokens into projects import_data' do
+ project.create_or_update_import_data(credentials: { user: 'token' })
+
settings.write(data_input)
expect(project.import_data.data['optional_stages'])
.to eq optional_stages.stringify_keys
+ expect(project.import_data.credentials.fetch(:additional_access_tokens))
+ .to eq(data_input['additional_access_tokens'])
end
end
diff --git a/spec/lib/gitlab/github_import/user_finder_spec.rb b/spec/lib/gitlab/github_import/user_finder_spec.rb
index b6e369cb35b..1739425c294 100644
--- a/spec/lib/gitlab/github_import/user_finder_spec.rb
+++ b/spec/lib/gitlab/github_import/user_finder_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::GithubImport::UserFinder, :clean_gitlab_redis_cache do
+RSpec.describe Gitlab::GithubImport::UserFinder, :clean_gitlab_redis_cache, feature_category: :importers do
let(:project) do
create(
:project,
@@ -223,75 +223,40 @@ RSpec.describe Gitlab::GithubImport::UserFinder, :clean_gitlab_redis_cache do
context 'when an Email address is not cached' do
let(:user) { { email: email } }
- it 'retrieves the Email address from the GitHub API' do
- expect(client).to receive(:user).with('kittens').and_return(user)
- expect(finder.email_for_github_username('kittens')).to eq(email)
- end
-
- it 'caches the Email address when an Email address is available' do
- expect(client).to receive(:user).with('kittens').and_return(user)
+ it 'retrieves and caches the Email address when an Email address is available' do
+ expect(client).to receive(:user).with('kittens').and_return(user).once
expect(Gitlab::Cache::Import::Caching)
.to receive(:write)
- .with(an_instance_of(String), email, timeout: Gitlab::Cache::Import::Caching::TIMEOUT)
-
- finder.email_for_github_username('kittens')
- end
+ .with(an_instance_of(String), email, timeout: Gitlab::Cache::Import::Caching::TIMEOUT).and_call_original
- it 'returns nil if the user does not exist' do
- expect(client)
- .to receive(:user)
- .with('kittens')
- .and_return(nil)
-
- expect(Gitlab::Cache::Import::Caching)
- .not_to receive(:write)
-
- expect(finder.email_for_github_username('kittens')).to be_nil
+ expect(finder.email_for_github_username('kittens')).to eq(email)
+ expect(finder.email_for_github_username('kittens')).to eq(email)
end
it 'shortens the timeout for Email address in cache when an Email address is private/nil from GitHub' do
user = { email: nil }
- expect(client).to receive(:user).with('kittens').and_return(user)
+ expect(client).to receive(:user).with('kittens').and_return(user).once
expect(Gitlab::Cache::Import::Caching)
- .to receive(:write).with(an_instance_of(String), nil, timeout: Gitlab::Cache::Import::Caching::SHORTER_TIMEOUT)
+ .to receive(:write)
+ .with(an_instance_of(String), '', timeout: Gitlab::Cache::Import::Caching::SHORTER_TIMEOUT)
+ .and_call_original
expect(finder.email_for_github_username('kittens')).to be_nil
+ expect(finder.email_for_github_username('kittens')).to be_nil
end
context 'when a username does not exist on GitHub' do
- context 'when github username inexistence is not cached' do
- it 'caches github username inexistence' do
- expect(client)
- .to receive(:user)
- .with('kittens')
- .and_raise(::Octokit::NotFound)
-
- expect(Gitlab::Cache::Import::Caching)
- .to receive(:write).with(
- described_class::INEXISTENCE_OF_GITHUB_USERNAME_CACHE_KEY % 'kittens', true
- )
-
- expect(finder.email_for_github_username('kittens')).to be_nil
- end
- end
-
- context 'when github username inexistence is already cached' do
- it 'does not make request to the client' do
- expect(Gitlab::Cache::Import::Caching)
- .to receive(:read).with(described_class::EMAIL_FOR_USERNAME_CACHE_KEY % 'kittens')
-
- expect(Gitlab::Cache::Import::Caching)
- .to receive(:read).with(
- described_class::INEXISTENCE_OF_GITHUB_USERNAME_CACHE_KEY % 'kittens'
- ).and_return('true')
-
- expect(client)
- .not_to receive(:user)
-
- expect(finder.email_for_github_username('kittens')).to be_nil
- end
+ it 'caches github username inexistence' do
+ expect(client)
+ .to receive(:user)
+ .with('kittens')
+ .and_raise(::Octokit::NotFound)
+ .once
+
+ expect(finder.email_for_github_username('kittens')).to be_nil
+ expect(finder.email_for_github_username('kittens')).to be_nil
end
end
end
diff --git a/spec/lib/gitlab/github_import_spec.rb b/spec/lib/gitlab/github_import_spec.rb
index 1ea9f003098..c4ed4b09f04 100644
--- a/spec/lib/gitlab/github_import_spec.rb
+++ b/spec/lib/gitlab/github_import_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::GithubImport do
+RSpec.describe Gitlab::GithubImport, feature_category: :importers do
before do
stub_feature_flags(github_importer_lower_per_page_limit: false)
end
@@ -11,6 +11,8 @@ RSpec.describe Gitlab::GithubImport do
let(:project) { double(:project, import_url: 'http://t0ken@github.com/user/repo.git', id: 1, group: nil) }
it 'returns a new Client with a custom token' do
+ allow(project).to receive(:import_data)
+
expect(described_class::Client)
.to receive(:new)
.with('123', host: nil, parallel: true, per_page: 100)
@@ -24,6 +26,7 @@ RSpec.describe Gitlab::GithubImport do
expect(project)
.to receive(:import_data)
.and_return(import_data)
+ .twice
expect(described_class::Client)
.to receive(:new)
@@ -46,12 +49,31 @@ RSpec.describe Gitlab::GithubImport do
described_class.ghost_user_id
end
end
+
+ context 'when there are additional access tokens' do
+ it 'returns a new ClientPool containing all tokens' do
+ import_data = double(:import_data, credentials: { user: '123', additional_access_tokens: %w[foo bar] })
+
+ expect(project)
+ .to receive(:import_data)
+ .and_return(import_data)
+ .twice
+
+ expect(described_class::ClientPool)
+ .to receive(:new)
+ .with(token_pool: %w[foo bar], host: nil, parallel: true, per_page: 100)
+
+ described_class.new_client_for(project)
+ end
+ end
end
context 'GitHub Enterprise' do
let(:project) { double(:project, import_url: 'http://t0ken@github.another-domain.com/repo-org/repo.git', group: nil) }
it 'returns a new Client with a custom token' do
+ allow(project).to receive(:import_data)
+
expect(described_class::Client)
.to receive(:new)
.with('123', host: 'http://github.another-domain.com/api/v3', parallel: true, per_page: 100)
@@ -65,6 +87,7 @@ RSpec.describe Gitlab::GithubImport do
expect(project)
.to receive(:import_data)
.and_return(import_data)
+ .twice
expect(described_class::Client)
.to receive(:new)
diff --git a/spec/lib/gitlab/gl_repository/repo_type_spec.rb b/spec/lib/gitlab/gl_repository/repo_type_spec.rb
index 4345df1b018..4ff8137dbd4 100644
--- a/spec/lib/gitlab/gl_repository/repo_type_spec.rb
+++ b/spec/lib/gitlab/gl_repository/repo_type_spec.rb
@@ -20,7 +20,7 @@ RSpec.describe Gitlab::GlRepository::RepoType do
let(:expected_identifier) { "project-#{expected_id}" }
let(:expected_suffix) { '' }
let(:expected_container) { project }
- let(:expected_repository) { ::Repository.new(project.full_path, project, shard: project.repository_storage, disk_path: project.disk_path, repo_type: Gitlab::GlRepository::PROJECT) }
+ let(:expected_repository) { ::Repository.new(project.full_path, project, shard: project.repository_storage, disk_path: project.disk_path, repo_type: described_class) }
end
it 'knows its type' do
@@ -51,7 +51,7 @@ RSpec.describe Gitlab::GlRepository::RepoType do
let(:expected_identifier) { "wiki-#{expected_id}" }
let(:expected_suffix) { '.wiki' }
let(:expected_container) { wiki }
- let(:expected_repository) { ::Repository.new(wiki.full_path, wiki, shard: wiki.repository_storage, disk_path: wiki.disk_path, repo_type: Gitlab::GlRepository::WIKI) }
+ let(:expected_repository) { ::Repository.new(wiki.full_path, wiki, shard: wiki.repository_storage, disk_path: wiki.disk_path, repo_type: described_class) }
end
it 'knows its type' do
@@ -80,7 +80,7 @@ RSpec.describe Gitlab::GlRepository::RepoType do
let(:expected_id) { personal_snippet.id }
let(:expected_identifier) { "snippet-#{expected_id}" }
let(:expected_suffix) { '' }
- let(:expected_repository) { ::Repository.new(personal_snippet.full_path, personal_snippet, shard: personal_snippet.repository_storage, disk_path: personal_snippet.disk_path, repo_type: Gitlab::GlRepository::SNIPPET) }
+ let(:expected_repository) { ::Repository.new(personal_snippet.full_path, personal_snippet, shard: personal_snippet.repository_storage, disk_path: personal_snippet.disk_path, repo_type: described_class) }
let(:expected_container) { personal_snippet }
end
@@ -109,7 +109,7 @@ RSpec.describe Gitlab::GlRepository::RepoType do
let(:expected_id) { project_snippet.id }
let(:expected_identifier) { "snippet-#{expected_id}" }
let(:expected_suffix) { '' }
- let(:expected_repository) { ::Repository.new(project_snippet.full_path, project_snippet, shard: project_snippet.repository_storage, disk_path: project_snippet.disk_path, repo_type: Gitlab::GlRepository::SNIPPET) }
+ let(:expected_repository) { ::Repository.new(project_snippet.full_path, project_snippet, shard: project_snippet.repository_storage, disk_path: project_snippet.disk_path, repo_type: described_class) }
let(:expected_container) { project_snippet }
end
diff --git a/spec/lib/gitlab/gpg/commit_spec.rb b/spec/lib/gitlab/gpg/commit_spec.rb
index 819a5633a78..6cd5cda69b8 100644
--- a/spec/lib/gitlab/gpg/commit_spec.rb
+++ b/spec/lib/gitlab/gpg/commit_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Gpg::Commit do
+RSpec.describe Gitlab::Gpg::Commit, feature_category: :source_code_management do
let_it_be(:project) { create(:project, :repository, path: 'sample-project') }
let(:commit_sha) { '0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33' }
@@ -12,15 +12,17 @@ RSpec.describe Gitlab::Gpg::Commit do
let(:user) { create(:user, email: user_email) }
let(:commit) { create(:commit, project: project, sha: commit_sha, committer_email: committer_email) }
let(:crypto) { instance_double(GPGME::Crypto) }
+ let(:signer) { :SIGNER_USER }
let(:mock_signature_data?) { true }
# gpg_keys must be pre-loaded so that they can be found during signature verification.
let!(:gpg_key) { create(:gpg_key, key: public_key, user: user) }
let(:signature_data) do
- [
- GpgHelpers::User1.signed_commit_signature,
- GpgHelpers::User1.signed_commit_base_data
- ]
+ {
+ signature: GpgHelpers::User1.signed_commit_signature,
+ signed_text: GpgHelpers::User1.signed_commit_base_data,
+ signer: signer
+ }
end
before do
@@ -55,11 +57,12 @@ RSpec.describe Gitlab::Gpg::Commit do
context 'invalid signature' do
let(:signature_data) do
- [
+ {
# Corrupt the key
- GpgHelpers::User1.signed_commit_signature.tr('=', 'a'),
- GpgHelpers::User1.signed_commit_base_data
- ]
+ signature: GpgHelpers::User1.signed_commit_signature.tr('=', 'a'),
+ signed_text: GpgHelpers::User1.signed_commit_base_data,
+ signer: signer
+ }
end
it 'returns nil' do
@@ -185,10 +188,11 @@ RSpec.describe Gitlab::Gpg::Commit do
end
let(:signature_data) do
- [
- GpgHelpers::User3.signed_commit_signature,
- GpgHelpers::User3.signed_commit_base_data
- ]
+ {
+ signature: GpgHelpers::User3.signed_commit_signature,
+ signed_text: GpgHelpers::User3.signed_commit_base_data,
+ signer: signer
+ }
end
it 'returns a valid signature' do
@@ -339,6 +343,25 @@ RSpec.describe Gitlab::Gpg::Commit do
expect(recorder.count).to eq(1)
end
end
+
+ context 'when signature created by GitLab' do
+ let(:signer) { :SIGNER_SYSTEM }
+ let(:gpg_key) { nil }
+
+ it 'returns a valid signature' do
+ expect(described_class.new(commit).signature).to have_attributes(
+ commit_sha: commit_sha,
+ project: project,
+ gpg_key: nil,
+ gpg_key_primary_keyid: GpgHelpers::User1.primary_keyid,
+ gpg_key_user_name: nil,
+ gpg_key_user_email: nil,
+ verification_status: 'verified_system'
+ )
+ end
+
+ it_behaves_like 'returns the cached signature on second call'
+ end
end
describe '#update_signature!' do
diff --git a/spec/lib/gitlab/gpg/invalid_gpg_signature_updater_spec.rb b/spec/lib/gitlab/gpg/invalid_gpg_signature_updater_spec.rb
index 5d444775e53..db88e99970c 100644
--- a/spec/lib/gitlab/gpg/invalid_gpg_signature_updater_spec.rb
+++ b/spec/lib/gitlab/gpg/invalid_gpg_signature_updater_spec.rb
@@ -4,7 +4,13 @@ require 'spec_helper'
RSpec.describe Gitlab::Gpg::InvalidGpgSignatureUpdater do
describe '#run' do
- let(:signature) { [GpgHelpers::User1.signed_commit_signature, GpgHelpers::User1.signed_commit_base_data] }
+ let(:signature) do
+ {
+ signature: GpgHelpers::User1.signed_commit_signature,
+ signed_text: GpgHelpers::User1.signed_commit_base_data
+ }
+ end
+
let(:committer_email) { GpgHelpers::User1.emails.first }
let!(:commit_sha) { '0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33' }
let!(:project) { create :project, :repository, path: 'sample-project' }
@@ -183,7 +189,13 @@ RSpec.describe Gitlab::Gpg::InvalidGpgSignatureUpdater do
end
context 'gpg signature did not have an associated gpg subkey' do
- let(:signature) { [GpgHelpers::User3.signed_commit_signature, GpgHelpers::User3.signed_commit_base_data] }
+ let(:signature) do
+ {
+ signature: GpgHelpers::User3.signed_commit_signature,
+ signed_text: GpgHelpers::User3.signed_commit_base_data
+ }
+ end
+
let(:committer_email) { GpgHelpers::User3.emails.first }
let!(:user) { create :user, email: GpgHelpers::User3.emails.first }
diff --git a/spec/lib/gitlab/grape_logging/loggers/response_logger_spec.rb b/spec/lib/gitlab/grape_logging/loggers/response_logger_spec.rb
index 449096a6faf..1bf97e87708 100644
--- a/spec/lib/gitlab/grape_logging/loggers/response_logger_spec.rb
+++ b/spec/lib/gitlab/grape_logging/loggers/response_logger_spec.rb
@@ -20,14 +20,6 @@ RSpec.describe Gitlab::GrapeLogging::Loggers::ResponseLogger do
it { expect(subject).to eq({ response_bytes: response1.bytesize + response2.bytesize }) }
end
- context 'with log_response_length disabled' do
- before do
- stub_feature_flags(log_response_length: false)
- end
-
- it { expect(subject).to eq({}) }
- end
-
context 'when response is a String' do
let(:response) { response1 }
diff --git a/spec/lib/gitlab/graphql/generic_tracing_spec.rb b/spec/lib/gitlab/graphql/generic_tracing_spec.rb
deleted file mode 100644
index 04fe7760f62..00000000000
--- a/spec/lib/gitlab/graphql/generic_tracing_spec.rb
+++ /dev/null
@@ -1,89 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Graphql::GenericTracing, feature_category: :application_performance do
- let(:graphql_duration_seconds_histogram) { double('Gitlab::Metrics::NullMetric') }
-
- context 'when graphql_generic_tracing_metrics_deactivate is disabled' do
- before do
- stub_feature_flags(graphql_generic_tracing_metrics_deactivate: false)
- end
-
- it 'updates graphql histogram with expected labels' do
- query = 'query { users { id } }'
- tracer = described_class.new
-
- allow(tracer)
- .to receive(:graphql_duration_seconds)
- .and_return(graphql_duration_seconds_histogram)
-
- expect_metric('graphql.lex', 'lex')
- expect_metric('graphql.parse', 'parse')
- expect_metric('graphql.validate', 'validate')
- expect_metric('graphql.analyze', 'analyze_multiplex')
- expect_metric('graphql.execute', 'execute_query_lazy')
- expect_metric('graphql.execute', 'execute_multiplex')
-
- GitlabSchema.execute(query, context: { tracers: [tracer] })
- end
- end
-
- context 'when graphql_generic_tracing_metrics_deactivate is enabled' do
- it 'does not updates graphql histogram with expected labels' do
- query = 'query { users { id } }'
- tracer = described_class.new
-
- allow(tracer)
- .to receive(:graphql_duration_seconds)
- .and_return(graphql_duration_seconds_histogram)
-
- GitlabSchema.execute(query, context: { tracers: [tracer] })
-
- expect(graphql_duration_seconds_histogram)
- .not_to receive(:observe)
- end
- end
-
- context "when labkit tracing is enabled" do
- before do
- expect(Labkit::Tracing).to receive(:enabled?).and_return(true)
- end
-
- it 'yields with labkit tracing' do
- expected_tags = {
- 'component' => 'web',
- 'span.kind' => 'server',
- 'platform_key' => 'pkey',
- 'key' => 'key'
- }
-
- expect(Labkit::Tracing)
- .to receive(:with_tracing)
- .with(operation_name: "pkey.key", tags: expected_tags)
- .and_yield
-
- expect { |b| described_class.new.platform_trace('pkey', 'key', nil, &b) }.to yield_control
- end
- end
-
- context "when labkit tracing is disabled" do
- before do
- expect(Labkit::Tracing).to receive(:enabled?).and_return(false)
- end
-
- it 'yields without measurement' do
- expect(Labkit::Tracing).not_to receive(:with_tracing)
-
- expect { |b| described_class.new.platform_trace('pkey', 'key', nil, &b) }.to yield_control
- end
- end
-
- private
-
- def expect_metric(platform_key, key)
- expect(graphql_duration_seconds_histogram)
- .to receive(:observe)
- .with({ platform_key: platform_key, key: key }, be > 0.0)
- end
-end
diff --git a/spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb b/spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb
index 773df9b20ee..56fef37f939 100644
--- a/spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb
+++ b/spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb
@@ -104,7 +104,7 @@ RSpec.describe Gitlab::Graphql::Pagination::Keyset::Connection do
let(:nodes) { Project.all.order(Gitlab::Pagination::Keyset::Order.build([column_order_updated_at, column_order_created_at, column_order_id])) }
it 'returns the encoded value of the order' do
- expect(decoded_cursor(cursor)).to include('updated_at' => project.updated_at.to_s(:inspect))
+ expect(decoded_cursor(cursor)).to include('updated_at' => project.updated_at.to_fs(:inspect))
end
end
end
diff --git a/spec/lib/gitlab/highlight_spec.rb b/spec/lib/gitlab/highlight_spec.rb
index d7ae6ed06a4..173131b1d5c 100644
--- a/spec/lib/gitlab/highlight_spec.rb
+++ b/spec/lib/gitlab/highlight_spec.rb
@@ -34,7 +34,7 @@ RSpec.describe Gitlab::Highlight do
end
it 'highlights' do
- expected = %Q[<span id="LC1" class="line" lang="common_lisp"><span class="p">(</span><span class="nb">make-pathname</span> <span class="ss">:defaults</span> <span class="nv">name</span></span>
+ expected = %[<span id="LC1" class="line" lang="common_lisp"><span class="p">(</span><span class="nb">make-pathname</span> <span class="ss">:defaults</span> <span class="nv">name</span></span>
<span id="LC2" class="line" lang="common_lisp"><span class="ss">:type</span> <span class="s">"assem"</span><span class="p">)</span></span>]
expect(described_class.highlight(file_name, content)).to eq(expected)
diff --git a/spec/lib/gitlab/hook_data/emoji_builder_spec.rb b/spec/lib/gitlab/hook_data/emoji_builder_spec.rb
new file mode 100644
index 00000000000..9c9f74c7da2
--- /dev/null
+++ b/spec/lib/gitlab/hook_data/emoji_builder_spec.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::HookData::EmojiBuilder, feature_category: :team_planning do
+ let_it_be(:award_emoji) { create(:award_emoji) }
+
+ let(:builder) { described_class.new(award_emoji) }
+
+ describe '#build' do
+ let(:data) { builder.build }
+
+ it 'includes safe attributes' do
+ expect(data.keys).to match_array(
+ %w[
+ user_id
+ created_at
+ id
+ name
+ awardable_type
+ awardable_id
+ updated_at
+ ]
+ )
+ end
+ end
+end
diff --git a/spec/lib/gitlab/i18n/pluralization_spec.rb b/spec/lib/gitlab/i18n/pluralization_spec.rb
index 857562d549c..6bfc500c8b8 100644
--- a/spec/lib/gitlab/i18n/pluralization_spec.rb
+++ b/spec/lib/gitlab/i18n/pluralization_spec.rb
@@ -2,6 +2,7 @@
require 'fast_spec_helper'
require 'rspec-parameterized'
+require 'rails/version'
require 'gettext_i18n_rails'
RSpec.describe Gitlab::I18n::Pluralization, feature_category: :internationalization do
diff --git a/spec/lib/gitlab/import_export/all_models.yml b/spec/lib/gitlab/import_export/all_models.yml
index f6bdbc86cc5..981802ad09d 100644
--- a/spec/lib/gitlab/import_export/all_models.yml
+++ b/spec/lib/gitlab/import_export/all_models.yml
@@ -72,6 +72,10 @@ issues:
- issuable_resource_links
work_item_type:
- issues
+- namespace
+- work_items
+- widget_definitions
+- enabled_widget_definitions
events:
- author
- project
@@ -139,6 +143,7 @@ milestone:
- boards
- milestone_releases
- releases
+- user_agent_detail
snippets:
- author
- project
@@ -249,6 +254,8 @@ merge_request_diff:
- merge_request_diff_commits
- merge_request_diff_detail
- merge_request_diff_files
+- merge_request_diff_llm_summary
+- merge_request_review_llm_summaries
merge_request_diff_commits:
- merge_request_diff
- commit_author
@@ -807,6 +814,9 @@ project:
- design_management_repository
- design_management_repository_state
- compliance_standards_adherence
+- scan_result_policy_reads
+- project_state
+- security_policy_bots
award_emoji:
- awardable
- user
diff --git a/spec/lib/gitlab/import_export/attribute_configuration_spec.rb b/spec/lib/gitlab/import_export/attribute_configuration_spec.rb
index 1d84cba3825..9a9f9e7ebdd 100644
--- a/spec/lib/gitlab/import_export/attribute_configuration_spec.rb
+++ b/spec/lib/gitlab/import_export/attribute_configuration_spec.rb
@@ -6,7 +6,7 @@ require 'spec_helper'
# Checks whether there are new attributes in models that are currently being exported as part of the
# project Import/Export feature.
# If there are new attributes, these will have to either be added to this spec in case we want them
-# to be included as part of the export, or blacklist them using the import_export.yml configuration file.
+# to be included as part of the export, or add them to excluded_attributes in the import_export.yml configuration file.
# Likewise, new models added to import_export.yml, will need to be added with their correspondent attributes
# to this spec.
RSpec.describe 'Import/Export attribute configuration', feature_category: :importers do
diff --git a/spec/lib/gitlab/import_export/group/relation_tree_restorer_spec.rb b/spec/lib/gitlab/import_export/group/relation_tree_restorer_spec.rb
index 495cefa002a..9852f6c9652 100644
--- a/spec/lib/gitlab/import_export/group/relation_tree_restorer_spec.rb
+++ b/spec/lib/gitlab/import_export/group/relation_tree_restorer_spec.rb
@@ -71,20 +71,22 @@ RSpec.describe Gitlab::ImportExport::Group::RelationTreeRestorer, feature_catego
before do
allow(shared.logger).to receive(:info).and_call_original
allow(relation_reader).to receive(:consume_relation).and_call_original
-
- allow(relation_reader)
- .to receive(:consume_relation)
- .with(importable_name, 'labels')
- .and_return([[label, 0]])
end
context 'when relation object is new' do
+ before do
+ allow(relation_reader)
+ .to receive(:consume_relation)
+ .with(importable_name, 'boards')
+ .and_return([[board, 0]])
+ end
+
context 'when relation object has invalid subrelations' do
- let(:label) do
+ let(:board) do
{
- 'title' => 'test',
- 'priorities' => [LabelPriority.new, LabelPriority.new],
- 'type' => 'GroupLabel'
+ 'name' => 'test',
+ 'lists' => [List.new, List.new],
+ 'group_id' => importable.id
}
end
@@ -94,26 +96,33 @@ RSpec.describe Gitlab::ImportExport::Group::RelationTreeRestorer, feature_catego
.with(
message: '[Project/Group Import] Invalid subrelation',
group_id: importable.id,
- relation_key: 'labels',
- error_messages: "Project can't be blank, Priority can't be blank, and Priority is not a number"
+ relation_key: 'boards',
+ error_messages: "Label can't be blank, Position can't be blank, and Position is not a number"
)
subject
- label = importable.labels.first
+ board = importable.boards.last
failure = importable.import_failures.first
expect(importable.import_failures.count).to eq(2)
- expect(label.title).to eq('test')
+ expect(board.name).to eq('test')
expect(failure.exception_class).to eq('ActiveRecord::RecordInvalid')
expect(failure.source).to eq('RelationTreeRestorer#save_relation_object')
expect(failure.exception_message)
- .to eq("Project can't be blank, Priority can't be blank, and Priority is not a number")
+ .to eq("Label can't be blank, Position can't be blank, and Position is not a number")
end
end
end
context 'when relation object is persisted' do
+ before do
+ allow(relation_reader)
+ .to receive(:consume_relation)
+ .with(importable_name, 'labels')
+ .and_return([[label, 0]])
+ end
+
context 'when relation object is invalid' do
let(:label) { create(:group_label, group: group, title: 'test') }
diff --git a/spec/lib/gitlab/import_export/project/object_builder_spec.rb b/spec/lib/gitlab/import_export/project/object_builder_spec.rb
index 5fa8590e8fd..43794ce01a3 100644
--- a/spec/lib/gitlab/import_export/project/object_builder_spec.rb
+++ b/spec/lib/gitlab/import_export/project/object_builder_spec.rb
@@ -146,6 +146,31 @@ RSpec.describe Gitlab::ImportExport::Project::ObjectBuilder do
end
end
+ context 'work item types', :request_store, feature_category: :team_planning do
+ it 'returns the correct type by base type' do
+ task_type = described_class.new(WorkItems::Type, { 'base_type' => 'task' }).find
+ incident_type = described_class.new(WorkItems::Type, { 'base_type' => 'incident' }).find
+ default_type = described_class.new(WorkItems::Type, { 'base_type' => 'bad_input' }).find
+
+ expect(task_type).to eq(WorkItems::Type.default_by_type(:task))
+ expect(incident_type).to eq(WorkItems::Type.default_by_type(:incident))
+ expect(default_type).to eq(WorkItems::Type.default_by_type(:issue))
+ end
+
+ it 'caches the results' do
+ builder = described_class.new(WorkItems::Type, { 'base_type' => 'task' })
+
+ # Make sure finder works
+ expect(builder.find).to be_a(WorkItems::Type)
+
+ query_count = ActiveRecord::QueryRecorder.new(skip_cached: false) do
+ builder.find
+ end.count
+
+ expect(query_count).to be_zero
+ end
+ end
+
context 'merge_request' do
it 'finds the existing merge_request' do
merge_request = create(:merge_request, title: 'MergeRequest', iid: 7, target_project: project, source_project: project)
diff --git a/spec/lib/gitlab/import_export/project/relation_factory_spec.rb b/spec/lib/gitlab/import_export/project/relation_factory_spec.rb
index d133f54ade5..7252457849e 100644
--- a/spec/lib/gitlab/import_export/project/relation_factory_spec.rb
+++ b/spec/lib/gitlab/import_export/project/relation_factory_spec.rb
@@ -9,10 +9,11 @@ RSpec.describe Gitlab::ImportExport::Project::RelationFactory, :use_clean_rails_
let(:admin) { create(:admin) }
let(:importer_user) { admin }
let(:excluded_keys) { [] }
+ let(:additional_relation_attributes) { {} }
let(:created_object) do
described_class.create( # rubocop:disable Rails/SaveBang
relation_sym: relation_sym,
- relation_hash: relation_hash,
+ relation_hash: relation_hash.merge(additional_relation_attributes),
relation_index: 1,
object_builder: Gitlab::ImportExport::Project::ObjectBuilder,
members_mapper: members_mapper,
@@ -63,6 +64,7 @@ RSpec.describe Gitlab::ImportExport::Project::RelationFactory, :use_clean_rails_
'job_events' => false,
'wiki_page_events' => true,
'releases_events' => false,
+ 'emoji_events' => false,
'token' => token
}
end
@@ -239,6 +241,34 @@ RSpec.describe Gitlab::ImportExport::Project::RelationFactory, :use_clean_rails_
end
end
end
+
+ context 'when issue_type is provided in the hash' do
+ let(:additional_relation_attributes) { { 'issue_type' => 'task' } }
+
+ it 'sets the correct work_item_type' do
+ expect(created_object.work_item_type).to eq(WorkItems::Type.default_by_type(:task))
+ end
+ end
+
+ context 'when work_item_type is provided in the hash' do
+ let(:incident_type) { WorkItems::Type.default_by_type(:incident) }
+ let(:additional_relation_attributes) { { 'work_item_type' => incident_type } }
+
+ it 'sets the correct work_item_type' do
+ expect(created_object.work_item_type).to eq(incident_type)
+ end
+ end
+
+ context 'when issue_type is provided in the hash as well as a work_item_type' do
+ let(:incident_type) { WorkItems::Type.default_by_type(:incident) }
+ let(:additional_relation_attributes) do
+ { 'issue_type' => 'task', 'work_item_type' => incident_type }
+ end
+
+ it 'makes work_item_type take precedence over issue_type' do
+ expect(created_object.work_item_type).to eq(incident_type)
+ end
+ end
end
context 'label object' do
diff --git a/spec/lib/gitlab/import_export/project/tree_restorer_spec.rb b/spec/lib/gitlab/import_export/project/tree_restorer_spec.rb
index 5aa16f9508d..47003707172 100644
--- a/spec/lib/gitlab/import_export/project/tree_restorer_spec.rb
+++ b/spec/lib/gitlab/import_export/project/tree_restorer_spec.rb
@@ -164,6 +164,25 @@ RSpec.describe Gitlab::ImportExport::Project::TreeRestorer, feature_category: :i
expect(pipeline_metadata.project_id).to eq(pipeline.project_id)
end
+ it 'preserves work_item_type for all issues (legacy with issue_type and new with work_item_type)',
+ :aggregate_failures do
+ task_issue1 = Issue.find_by(title: 'task by issue_type')
+ task_issue2 = Issue.find_by(title: 'task by both attributes')
+ incident_issue = Issue.find_by(title: 'incident by work_item_type')
+ issue_type = WorkItems::Type.default_by_type(:issue)
+ task_type = WorkItems::Type.default_by_type(:task)
+
+ expect(task_issue1.work_item_type).to eq(task_type)
+ expect(task_issue2.work_item_type).to eq(task_type)
+ expect(incident_issue.work_item_type).to eq(WorkItems::Type.default_by_type(:incident))
+
+ other_issue_types = Issue.preload(:work_item_type).where.not(
+ id: [task_issue1.id, task_issue2.id, incident_issue.id]
+ ).map(&:work_item_type)
+
+ expect(other_issue_types).to all(eq(issue_type))
+ end
+
it 'preserves updated_at on issues' do
issue = Issue.find_by(description: 'Aliquam enim illo et possimus.')
diff --git a/spec/lib/gitlab/import_export/project/tree_saver_spec.rb b/spec/lib/gitlab/import_export/project/tree_saver_spec.rb
index d8b8903c8ca..aa8290d7a05 100644
--- a/spec/lib/gitlab/import_export/project/tree_saver_spec.rb
+++ b/spec/lib/gitlab/import_export/project/tree_saver_spec.rb
@@ -158,6 +158,12 @@ RSpec.describe Gitlab::ImportExport::Project::TreeSaver, :with_license, feature_
it { is_expected.not_to be_empty }
+ it 'has a work_item_type' do
+ issue = subject.first
+
+ expect(issue['work_item_type']).to eq('base_type' => 'task')
+ end
+
it 'has issue comments' do
notes = subject.first['notes']
@@ -481,7 +487,7 @@ RSpec.describe Gitlab::ImportExport::Project::TreeSaver, :with_license, feature_
group: group,
approvals_before_merge: 1)
- issue = create(:issue, assignees: [user], project: project)
+ issue = create(:issue, :task, assignees: [user], project: project)
snippet = create(:project_snippet, project: project)
project_label = create(:label, project: project)
group_label = create(:group_label, group: group)
diff --git a/spec/lib/gitlab/import_export/references_configuration_spec.rb b/spec/lib/gitlab/import_export/references_configuration_spec.rb
index 84c5b564cb1..a9765a8747d 100644
--- a/spec/lib/gitlab/import_export/references_configuration_spec.rb
+++ b/spec/lib/gitlab/import_export/references_configuration_spec.rb
@@ -6,7 +6,7 @@ require 'spec_helper'
# Checks whether there are new reference attributes ending with _id in models that are currently being exported as part of the
# project Import/Export feature.
# If there are new references (foreign keys), these will have to either be replaced with actual relation
-# or to be blacklisted by using the import_export.yml configuration file.
+# or to be denylisted by using the import_export.yml configuration file.
# Likewise, new models added to import_export.yml, will need to be added with their correspondent relations
# to this spec.
RSpec.describe 'Import/Export Project configuration', feature_category: :importers do
diff --git a/spec/lib/gitlab/import_export/safe_model_attributes.yml b/spec/lib/gitlab/import_export/safe_model_attributes.yml
index abdd8741377..b6328994c5b 100644
--- a/spec/lib/gitlab/import_export/safe_model_attributes.yml
+++ b/spec/lib/gitlab/import_export/safe_model_attributes.yml
@@ -608,6 +608,7 @@ ProjectHook:
- confidential_note_events
- repository_update_events
- releases_events
+- emoji_events
ProtectedBranch:
- id
- project_id
@@ -905,7 +906,7 @@ List:
- max_issue_count
- max_issue_weight
- limit_metric
-ExternalPullRequest:
+Ci::ExternalPullRequest:
- id
- created_at
- updated_at
@@ -1084,3 +1085,5 @@ ApprovalProjectRulesProtectedBranch:
- protected_branch_id
- approval_project_rule_id
- branch_name
+WorkItems::Type:
+ - base_type
diff --git a/spec/lib/gitlab/import_formatter_spec.rb b/spec/lib/gitlab/import_formatter_spec.rb
index 0feff61725b..6687c4fc224 100644
--- a/spec/lib/gitlab/import_formatter_spec.rb
+++ b/spec/lib/gitlab/import_formatter_spec.rb
@@ -3,7 +3,7 @@
require 'fast_spec_helper'
RSpec.describe Gitlab::ImportFormatter do
- let(:formatter) { Gitlab::ImportFormatter.new }
+ let(:formatter) { described_class.new }
describe '#comment' do
it 'creates the correct string' do
diff --git a/spec/lib/gitlab/inactive_projects_deletion_warning_tracker_spec.rb b/spec/lib/gitlab/inactive_projects_deletion_warning_tracker_spec.rb
index cb4fdeed1a1..a4b5847e480 100644
--- a/spec/lib/gitlab/inactive_projects_deletion_warning_tracker_spec.rb
+++ b/spec/lib/gitlab/inactive_projects_deletion_warning_tracker_spec.rb
@@ -7,68 +7,68 @@ RSpec.describe Gitlab::InactiveProjectsDeletionWarningTracker, :freeze_time do
describe '.notified_projects', :clean_gitlab_redis_shared_state do
before do
- Gitlab::InactiveProjectsDeletionWarningTracker.new(project_id).mark_notified
+ described_class.new(project_id).mark_notified
end
it 'returns the list of projects for which deletion warning email has been sent' do
expected_hash = { "project:1" => Date.current.to_s }
- expect(Gitlab::InactiveProjectsDeletionWarningTracker.notified_projects).to eq(expected_hash)
+ expect(described_class.notified_projects).to eq(expected_hash)
end
end
describe '.reset_all' do
before do
- Gitlab::InactiveProjectsDeletionWarningTracker.new(project_id).mark_notified
+ described_class.new(project_id).mark_notified
end
it 'deletes all the projects for which deletion warning email was sent' do
- Gitlab::InactiveProjectsDeletionWarningTracker.reset_all
+ described_class.reset_all
- expect(Gitlab::InactiveProjectsDeletionWarningTracker.notified_projects).to eq({})
+ expect(described_class.notified_projects).to eq({})
end
end
describe '#notified?' do
before do
- Gitlab::InactiveProjectsDeletionWarningTracker.new(project_id).mark_notified
+ described_class.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)
+ expect(described_class.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)
+ expect(described_class.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
+ described_class.new(project_id).mark_notified
- expect(Gitlab::InactiveProjectsDeletionWarningTracker.new(project_id).notified?).to eq(true)
+ expect(described_class.new(project_id).notified?).to eq(true)
end
end
describe '#notification_date', :clean_gitlab_redis_shared_state do
before do
- Gitlab::InactiveProjectsDeletionWarningTracker.new(project_id).mark_notified
+ described_class.new(project_id).mark_notified
end
it 'returns the date if a deletion warning email has been sent for a given project' do
- expect(Gitlab::InactiveProjectsDeletionWarningTracker.new(project_id).notification_date).to eq(Date.current.to_s)
+ expect(described_class.new(project_id).notification_date).to eq(Date.current.to_s)
end
it 'returns nil if a deletion warning email has not been sent for a given project' do
- expect(Gitlab::InactiveProjectsDeletionWarningTracker.new(2).notification_date).to eq(nil)
+ expect(described_class.new(2).notification_date).to eq(nil)
end
end
describe '#scheduled_deletion_date', :clean_gitlab_redis_shared_state do
shared_examples 'returns the expected deletion date' do
it do
- expect(Gitlab::InactiveProjectsDeletionWarningTracker.new(project_id).scheduled_deletion_date)
+ expect(described_class.new(project_id).scheduled_deletion_date)
.to eq(1.month.from_now.to_date.to_s)
end
end
@@ -84,7 +84,7 @@ RSpec.describe Gitlab::InactiveProjectsDeletionWarningTracker, :freeze_time do
context 'with a stored deletion email date' do
before do
- Gitlab::InactiveProjectsDeletionWarningTracker.new(project_id).mark_notified
+ described_class.new(project_id).mark_notified
end
it_behaves_like 'returns the expected deletion date'
@@ -93,13 +93,13 @@ RSpec.describe Gitlab::InactiveProjectsDeletionWarningTracker, :freeze_time do
describe '#reset' do
before do
- Gitlab::InactiveProjectsDeletionWarningTracker.new(project_id).mark_notified
+ described_class.new(project_id).mark_notified
end
it 'resets the project as not being notified' do
- Gitlab::InactiveProjectsDeletionWarningTracker.new(project_id).reset
+ described_class.new(project_id).reset
- expect(Gitlab::InactiveProjectsDeletionWarningTracker.new(project_id).notified?).to eq(false)
+ expect(described_class.new(project_id).notified?).to eq(false)
end
end
end
diff --git a/spec/lib/gitlab/instrumentation/redis_interceptor_spec.rb b/spec/lib/gitlab/instrumentation/redis_interceptor_spec.rb
index f3c240317c8..6271885d80e 100644
--- a/spec/lib/gitlab/instrumentation/redis_interceptor_spec.rb
+++ b/spec/lib/gitlab/instrumentation/redis_interceptor_spec.rb
@@ -4,8 +4,15 @@ require 'spec_helper'
require 'rspec-parameterized'
require 'support/helpers/rails_helpers'
-RSpec.describe Gitlab::Instrumentation::RedisInterceptor, :clean_gitlab_redis_shared_state, :request_store, feature_category: :scalability do
+RSpec.describe Gitlab::Instrumentation::RedisInterceptor, :request_store, feature_category: :scalability do
using RSpec::Parameterized::TableSyntax
+ include RedisHelpers
+
+ let_it_be(:redis_store_class) { define_helper_redis_store_class }
+
+ before do
+ redis_store_class.with(&:flushdb)
+ end
describe 'read and write' do
where(:setup, :command, :expect_write, :expect_read) do
@@ -32,7 +39,7 @@ RSpec.describe Gitlab::Instrumentation::RedisInterceptor, :clean_gitlab_redis_sh
with_them do
it 'counts bytes read and written' do
- Gitlab::Redis::SharedState.with do |redis|
+ redis_store_class.with do |redis|
setup.each { |cmd| redis.call(cmd) }
RequestStore.clear!
redis.call(command)
@@ -45,18 +52,18 @@ RSpec.describe Gitlab::Instrumentation::RedisInterceptor, :clean_gitlab_redis_sh
end
describe 'counting' do
- let(:instrumentation_class) { Gitlab::Redis::SharedState.instrumentation_class }
+ let(:instrumentation_class) { redis_store_class.instrumentation_class }
it 'counts successful requests' do
expect(instrumentation_class).to receive(:instance_count_request).with(1).and_call_original
- Gitlab::Redis::SharedState.with { |redis| redis.call(:get, 'foobar') }
+ redis_store_class.with { |redis| redis.call(:get, 'foobar') }
end
it 'counts successful pipelined requests' do
expect(instrumentation_class).to receive(:instance_count_request).with(2).and_call_original
- Gitlab::Redis::SharedState.with do |redis|
+ redis_store_class.with do |redis|
redis.pipelined do |pipeline|
pipeline.call(:get, '{foobar}buz')
pipeline.call(:get, '{foobar}baz')
@@ -68,12 +75,12 @@ RSpec.describe Gitlab::Instrumentation::RedisInterceptor, :clean_gitlab_redis_sh
where(:case_name, :exception, :exception_counter) do
'generic exception' | Redis::CommandError | :instance_count_exception
'moved redirection' | Redis::CommandError.new("MOVED 123 127.0.0.1:6380") | :instance_count_cluster_redirection
- 'ask redirection' | Redis::CommandError.new("ASK 123 127.0.0.1:6380") | :instance_count_cluster_redirection
+ 'ask redirection' | Redis::CommandError.new("ASK 123 127.0.0.1:6380") | :instance_count_cluster_redirection
end
with_them do
before do
- Gitlab::Redis::SharedState.with do |redis|
+ redis_store_class.with do |redis|
# We need to go 1 layer deeper to stub _client as we monkey-patch Redis::Client
# with the interceptor. Stubbing `redis` will skip the instrumentation_class.
allow(redis._client).to receive(:process).and_raise(exception)
@@ -88,7 +95,7 @@ RSpec.describe Gitlab::Instrumentation::RedisInterceptor, :clean_gitlab_redis_sh
expect(instrumentation_class).to receive(:instance_count_request).and_call_original
expect do
- Gitlab::Redis::SharedState.with { |redis| redis.call(:auth, 'foo', 'bar') }
+ redis_store_class.with { |redis| redis.call(:auth, 'foo', 'bar') }
end.to raise_exception(Redis::CommandError)
end
end
@@ -103,7 +110,7 @@ RSpec.describe Gitlab::Instrumentation::RedisInterceptor, :clean_gitlab_redis_sh
expect(instrumentation_class).to receive(:increment_cross_slot_request_count).and_call_original
expect(instrumentation_class).not_to receive(:increment_allowed_cross_slot_request_count).and_call_original
- Gitlab::Redis::SharedState.with { |redis| redis.call(:mget, 'foo', 'bar') }
+ redis_store_class.with { |redis| redis.call(:mget, 'foo', 'bar') }
end
it 'does not count allowed cross-slot requests' do
@@ -111,7 +118,7 @@ RSpec.describe Gitlab::Instrumentation::RedisInterceptor, :clean_gitlab_redis_sh
expect(instrumentation_class).to receive(:increment_allowed_cross_slot_request_count).and_call_original
Gitlab::Instrumentation::RedisClusterValidator.allow_cross_slot_commands do
- Gitlab::Redis::SharedState.with { |redis| redis.call(:mget, 'foo', 'bar') }
+ redis_store_class.with { |redis| redis.call(:mget, 'foo', 'bar') }
end
end
@@ -120,7 +127,7 @@ RSpec.describe Gitlab::Instrumentation::RedisInterceptor, :clean_gitlab_redis_sh
expect(instrumentation_class).not_to receive(:increment_allowed_cross_slot_request_count).and_call_original
Gitlab::Instrumentation::RedisClusterValidator.allow_cross_slot_commands do
- Gitlab::Redis::SharedState.with { |redis| redis.call(:get, 'bar') }
+ redis_store_class.with { |redis| redis.call(:get, 'bar') }
end
end
@@ -128,7 +135,7 @@ RSpec.describe Gitlab::Instrumentation::RedisInterceptor, :clean_gitlab_redis_sh
expect(instrumentation_class).not_to receive(:increment_cross_slot_request_count).and_call_original
expect(instrumentation_class).not_to receive(:increment_allowed_cross_slot_request_count).and_call_original
- Gitlab::Redis::SharedState.with { |redis| redis.call(:mget, '{foo}bar', '{foo}baz') }
+ redis_store_class.with { |redis| redis.call(:mget, '{foo}bar', '{foo}baz') }
end
end
@@ -139,14 +146,14 @@ RSpec.describe Gitlab::Instrumentation::RedisInterceptor, :clean_gitlab_redis_sh
it 'still runs cross-slot validation' do
expect do
- Gitlab::Redis::SharedState.with { |redis| redis.mget('foo', 'bar') }
+ redis_store_class.with { |redis| redis.mget('foo', 'bar') }
end.to raise_error(instance_of(Gitlab::Instrumentation::RedisClusterValidator::CrossSlotError))
end
end
end
describe 'latency' do
- let(:instrumentation_class) { Gitlab::Redis::SharedState.instrumentation_class }
+ let(:instrumentation_class) { redis_store_class.instrumentation_class }
describe 'commands in the apdex' do
where(:command) do
@@ -161,7 +168,7 @@ RSpec.describe Gitlab::Instrumentation::RedisInterceptor, :clean_gitlab_redis_sh
expect(instrumentation_class).to receive(:instance_observe_duration).with(a_value > 0)
.and_call_original
- Gitlab::Redis::SharedState.with { |redis| redis.call(*command) }
+ redis_store_class.with { |redis| redis.call(*command) }
end
end
@@ -170,7 +177,7 @@ RSpec.describe Gitlab::Instrumentation::RedisInterceptor, :clean_gitlab_redis_sh
expect(instrumentation_class).to receive(:instance_observe_duration).twice.with(a_value > 0)
.and_call_original
- Gitlab::Redis::SharedState.with do |redis|
+ redis_store_class.with do |redis|
redis.pipelined do |pipeline|
pipeline.call(:get, '{foobar}buz')
pipeline.call(:get, '{foobar}baz')
@@ -180,7 +187,7 @@ RSpec.describe Gitlab::Instrumentation::RedisInterceptor, :clean_gitlab_redis_sh
it 'raises error when keys are not from the same slot' do
expect do
- Gitlab::Redis::SharedState.with do |redis|
+ redis_store_class.with do |redis|
redis.pipelined do |pipeline|
pipeline.call(:get, 'foo')
pipeline.call(:get, 'bar')
@@ -206,11 +213,11 @@ RSpec.describe Gitlab::Instrumentation::RedisInterceptor, :clean_gitlab_redis_sh
with_them do
it 'skips requests we do not want in the apdex' do
- Gitlab::Redis::SharedState.with { |redis| setup.each { |cmd| redis.call(*cmd) } }
+ redis_store_class.with { |redis| setup.each { |cmd| redis.call(*cmd) } }
expect(instrumentation_class).not_to receive(:instance_observe_duration)
- Gitlab::Redis::SharedState.with { |redis| redis.call(*command) }
+ redis_store_class.with { |redis| redis.call(*command) }
end
end
@@ -218,7 +225,7 @@ RSpec.describe Gitlab::Instrumentation::RedisInterceptor, :clean_gitlab_redis_sh
it 'skips requests that have blocking commands' do
expect(instrumentation_class).not_to receive(:instance_observe_duration)
- Gitlab::Redis::SharedState.with do |redis|
+ redis_store_class.with do |redis|
redis.pipelined do |pipeline|
pipeline.call(:get, '{foobar}buz')
pipeline.call(:rpush, '{foobar}baz', 1)
diff --git a/spec/lib/gitlab/instrumentation/redis_spec.rb b/spec/lib/gitlab/instrumentation/redis_spec.rb
index 1b7774bc229..b965a6444e8 100644
--- a/spec/lib/gitlab/instrumentation/redis_spec.rb
+++ b/spec/lib/gitlab/instrumentation/redis_spec.rb
@@ -4,6 +4,8 @@ require 'spec_helper'
require 'support/helpers/rails_helpers'
RSpec.describe Gitlab::Instrumentation::Redis do
+ include RedisHelpers
+
def stub_storages(method, value)
described_class::STORAGES.each do |storage|
allow(storage).to receive(method) { value }
@@ -30,20 +32,22 @@ RSpec.describe Gitlab::Instrumentation::Redis do
it_behaves_like 'aggregation of redis storage data', :write_bytes
describe '.payload', :request_store do
+ let_it_be(:redis_store_class) { define_helper_redis_store_class }
+
before do
# If this is the first spec in a spec run that uses Redis, there
# will be an extra SELECT command to choose the right database. We
# don't want to make the spec less precise, so we force that to
# happen (if needed) first, then clear the counts.
- Gitlab::Redis::Sessions.with { |redis| redis.info }
+ redis_store_class.with { |redis| redis.info }
RequestStore.clear!
stub_rails_env('staging') # to avoid raising CrossSlotError
- Gitlab::Redis::Sessions.with { |redis| redis.mset('cache-test', 321, 'cache-test-2', 321) }
+ redis_store_class.with { |redis| redis.mset('cache-test', 321, 'cache-test-2', 321) }
Gitlab::Instrumentation::RedisClusterValidator.allow_cross_slot_commands do
- Gitlab::Redis::Sessions.with { |redis| redis.mget('cache-test', 'cache-test-2') }
+ redis_store_class.with { |redis| redis.mget('cache-test', 'cache-test-2') }
end
- Gitlab::Redis::SharedState.with { |redis| redis.set('shared-state-test', 123) }
+ Gitlab::Redis::Queues.with { |redis| redis.set('shared-state-test', 123) }
end
it 'returns payload filtering out zeroed values' do
@@ -64,11 +68,11 @@ RSpec.describe Gitlab::Instrumentation::Redis do
redis_sessions_read_bytes: be >= 0,
redis_sessions_write_bytes: be >= 0,
- # Shared state results
- redis_shared_state_calls: 1,
- redis_shared_state_duration_s: be >= 0,
- redis_shared_state_read_bytes: be >= 0,
- redis_shared_state_write_bytes: be >= 0
+ # Queues results
+ redis_queues_calls: 1,
+ redis_queues_duration_s: be >= 0,
+ redis_queues_read_bytes: be >= 0,
+ redis_queues_write_bytes: be >= 0
}
expect(described_class.payload).to include(expected_payload)
diff --git a/spec/lib/gitlab/internal_events/event_definitions_spec.rb b/spec/lib/gitlab/internal_events/event_definitions_spec.rb
new file mode 100644
index 00000000000..f6f79d9d906
--- /dev/null
+++ b/spec/lib/gitlab/internal_events/event_definitions_spec.rb
@@ -0,0 +1,102 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+
+RSpec.describe Gitlab::InternalEvents::EventDefinitions, feature_category: :product_analytics do
+ after(:all) do
+ described_class.clear_events
+ end
+
+ context 'when using actual metric definitions' do
+ it 'they can load' do
+ expect { described_class.load_configurations }.not_to raise_error
+ end
+ end
+
+ context 'when using mock data' do
+ let(:definition1) { instance_double(Gitlab::Usage::MetricDefinition) }
+ let(:definition2) { instance_double(Gitlab::Usage::MetricDefinition) }
+ let(:events1) { { 'event1' => nil } }
+ let(:events2) { { 'event2' => nil } }
+
+ before do
+ allow(Gitlab::Usage::MetricDefinition).to receive(:metric_definitions_changed?).and_return(true)
+ allow(Gitlab::Usage::MetricDefinition).to receive(:all).and_return([definition1, definition2])
+ allow(definition1).to receive(:available?).and_return(true)
+ allow(definition2).to receive(:available?).and_return(true)
+ allow(definition1).to receive(:events).and_return(events1)
+ allow(definition2).to receive(:events).and_return(events2)
+ end
+
+ describe ".unique_property" do
+ context 'when event has valid unique value with a period', :aggregate_failures do
+ let(:events1) { { 'event1' => :'user.id' } }
+ let(:events2) { { 'event2' => :'project.id' } }
+
+ it 'is returned' do
+ expect(described_class.unique_property('event1')).to eq(:user)
+ expect(described_class.unique_property('event2')).to eq(:project)
+ end
+ end
+
+ context 'when event has no periods in unique property', :aggregate_failures do
+ let(:events1) { { 'event1' => :plan_id } }
+
+ it 'fails' do
+ expect { described_class.unique_property('event1') }
+ .to raise_error(described_class::InvalidMetricConfiguration, /Invalid unique value/)
+ end
+ end
+
+ context 'when event has more than one period in unique property' do
+ let(:events1) { { 'event1' => :'project.namespace.id' } }
+
+ it 'fails' do
+ expect { described_class.unique_property('event1') }
+ .to raise_error(described_class::InvalidMetricConfiguration, /Invalid unique value/)
+ end
+ end
+
+ context 'when event does not have unique property' do
+ it 'unique fails' do
+ expect { described_class.unique_property('event1') }
+ .to raise_error(described_class::InvalidMetricConfiguration, /Unique property not defined for/)
+ end
+ end
+ end
+
+ describe ".load_configurations" do
+ context 'when unique property for event is ambiguous' do
+ let(:events1) { { 'event1' => :user_id } }
+ let(:events2) { { 'event1' => :project_id } }
+
+ it 'logs error when loading' do
+ expect(Gitlab::ErrorTracking).to receive(:track_and_raise_for_dev_exception)
+ .with(described_class::InvalidMetricConfiguration)
+
+ described_class.load_configurations
+ end
+ end
+ end
+
+ describe ".known_events" do
+ it 'has known events', :aggregate_failures do
+ expect(described_class.known_event?('event1')).to be_truthy
+ expect(described_class.known_event?('event2')).to be_truthy
+ expect(described_class.known_event?('event3')).to be_falsy
+ end
+
+ context 'when a metric fails to load' do
+ before do
+ allow(definition1).to receive(:available?).and_raise(ArgumentError)
+ end
+
+ it 'loads the healthy metrics', :aggregate_failures do
+ expect(Gitlab::ErrorTracking).to receive(:track_and_raise_for_dev_exception).at_least(:once)
+ expect(described_class.known_event?('event1')).to be_falsy
+ expect(described_class.known_event?('event2')).to be_truthy
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/internal_events_spec.rb b/spec/lib/gitlab/internal_events_spec.rb
index f23979fc56a..86215434ba4 100644
--- a/spec/lib/gitlab/internal_events_spec.rb
+++ b/spec/lib/gitlab/internal_events_spec.rb
@@ -7,14 +7,16 @@ RSpec.describe Gitlab::InternalEvents, :snowplow, feature_category: :product_ana
include SnowplowHelpers
before do
+ allow(Gitlab::ErrorTracking).to receive(:track_and_raise_for_dev_exception)
allow(Gitlab::UsageDataCounters::HLLRedisCounter).to receive(:track_event)
allow(Gitlab::Tracking).to receive(:tracker).and_return(fake_snowplow)
+ allow(Gitlab::InternalEvents::EventDefinitions).to receive(:unique_property).and_return(:user)
allow(fake_snowplow).to receive(:event)
end
def expect_redis_hll_tracking(event_name)
expect(Gitlab::UsageDataCounters::HLLRedisCounter).to have_received(:track_event)
- .with(event_name, anything)
+ .with(event_name, values: unique_value)
end
def expect_snowplow_tracking(event_name)
@@ -33,23 +35,24 @@ RSpec.describe Gitlab::InternalEvents, :snowplow, feature_category: :product_ana
.with('InternalEventTracking', event_name, context: contexts)
end
- let_it_be(:user) { build(:user) }
- let_it_be(:project) { build(:project) }
+ let_it_be(:user) { build(:user, id: 1) }
+ let_it_be(:project) { build(:project, id: 2) }
let_it_be(:namespace) { project.namespace }
let(:fake_snowplow) { instance_double(Gitlab::Tracking::Destinations::Snowplow) }
let(:event_name) { 'g_edit_by_web_ide' }
+ let(:unique_value) { user.id }
it 'updates both RedisHLL and Snowplow', :aggregate_failures do
- params = { user_id: user.id, project_id: project.id, namespace_id: namespace.id }
+ params = { user: user, project: project, namespace: namespace }
described_class.track_event(event_name, **params)
expect_redis_hll_tracking(event_name)
expect_snowplow_tracking(event_name) # Add test for arguments
end
- it 'rescues error' do
- params = { user_id: user.id, project_id: project.id, namespace_id: namespace.id }
+ it 'rescues error', :aggregate_failures do
+ params = { user: user, project: project, namespace: namespace }
error = StandardError.new("something went wrong")
allow(fake_snowplow).to receive(:event).and_raise(error)
@@ -62,4 +65,68 @@ RSpec.describe Gitlab::InternalEvents, :snowplow, feature_category: :product_ana
expect { described_class.track_event(event_name, **params) }.not_to raise_error
end
+
+ it 'logs error on unknown event', :aggregate_failures do
+ expect(Gitlab::ErrorTracking).to receive(:track_and_raise_for_dev_exception)
+ .with(described_class::UnknownEventError, event_name: 'unknown_event', kwargs: {})
+
+ expect { described_class.track_event('unknown_event') }.not_to raise_error
+ end
+
+ it 'logs error on missing property' do
+ expect { described_class.track_event(event_name, merge_request_id: 1) }.not_to raise_error
+
+ expect(Gitlab::ErrorTracking).to have_received(:track_and_raise_for_dev_exception)
+ .with(described_class::InvalidPropertyError, event_name: event_name, kwargs: { merge_request_id: 1 })
+ end
+
+ context 'when unique property is missing' do
+ before do
+ allow(Gitlab::InternalEvents::EventDefinitions).to receive(:unique_property)
+ .and_raise(Gitlab::InternalEvents::EventDefinitions::InvalidMetricConfiguration)
+ end
+
+ it 'fails on missing unique property' do
+ expect { described_class.track_event(event_name, merge_request_id: 1) }.not_to raise_error
+
+ expect(Gitlab::ErrorTracking).to have_received(:track_and_raise_for_dev_exception)
+ end
+ end
+
+ context 'when unique key is defined' do
+ let(:event_name) { 'p_ci_templates_terraform_base_latest' }
+ let(:unique_value) { project.id }
+ let(:property_name) { :project }
+
+ before do
+ allow(Gitlab::InternalEvents::EventDefinitions).to receive(:unique_property)
+ .with(event_name)
+ .and_return(property_name)
+ end
+
+ it 'is used when logging to RedisHLL', :aggregate_failures do
+ described_class.track_event(event_name, user: user, project: project)
+
+ expect_redis_hll_tracking(event_name)
+ expect_snowplow_tracking(event_name)
+ end
+
+ context 'when property is missing' do
+ it 'logs error' do
+ expect { described_class.track_event(event_name, merge_request_id: 1) }.not_to raise_error
+
+ expect(Gitlab::ErrorTracking).to have_received(:track_and_raise_for_dev_exception)
+ .with(described_class::InvalidPropertyError, event_name: event_name, kwargs: { merge_request_id: 1 })
+ end
+ end
+
+ context 'when method does not exist on property' do
+ it 'logs error on missing method' do
+ expect { described_class.track_event(event_name, project: "a_string") }.not_to raise_error
+
+ expect(Gitlab::ErrorTracking).to have_received(:track_and_raise_for_dev_exception)
+ .with(described_class::InvalidMethodError, event_name: event_name, kwargs: { project: 'a_string' })
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/issues/rebalancing/state_spec.rb b/spec/lib/gitlab/issues/rebalancing/state_spec.rb
index a849330ad35..5adf1328b87 100644
--- a/spec/lib/gitlab/issues/rebalancing/state_spec.rb
+++ b/spec/lib/gitlab/issues/rebalancing/state_spec.rb
@@ -160,12 +160,11 @@ RSpec.describe Gitlab::Issues::Rebalancing::State, :clean_gitlab_redis_shared_st
before do
generate_and_cache_issues_ids(count: 3)
rebalance_caching.cache_current_index(123)
- rebalance_caching.cache_current_project_id(456)
rebalance_caching.track_new_running_rebalance
end
it 'removes cache keys' do
- expect(check_existing_keys).to eq(4)
+ expect(check_existing_keys).to eq(3)
rebalance_caching.cleanup_cache
diff --git a/spec/lib/gitlab/jwt_authenticatable_spec.rb b/spec/lib/gitlab/jwt_authenticatable_spec.rb
index 9a06f9b91df..98c87ef627a 100644
--- a/spec/lib/gitlab/jwt_authenticatable_spec.rb
+++ b/spec/lib/gitlab/jwt_authenticatable_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::JwtAuthenticatable do
+RSpec.describe Gitlab::JwtAuthenticatable, feature_category: :system_access do
let(:test_class) do
Class.new do
include Gitlab::JwtAuthenticatable
@@ -198,5 +198,29 @@ RSpec.describe Gitlab::JwtAuthenticatable do
end
end
end
+
+ context 'algorithm' do
+ context 'with default algorithm' do
+ it 'accepts a correct header' do
+ encoded_message = JWT.encode(payload, test_class.secret, 'HS256')
+
+ expect { test_class.decode_jwt(encoded_message) }.not_to raise_error
+ end
+ end
+
+ context 'with provided algorithm' do
+ it 'accepts a correct header' do
+ encoded_message = JWT.encode(payload, test_class.secret, 'HS256')
+
+ expect { test_class.decode_jwt(encoded_message, algorithm: 'HS256') }.not_to raise_error
+ end
+
+ it 'raises an error when the header is signed with the wrong algorithm' do
+ encoded_message = JWT.encode(payload, test_class.secret, 'HS256')
+
+ expect { test_class.decode_jwt(encoded_message, algorithm: 'RS256') }.to raise_error(JWT::DecodeError)
+ end
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/kas/client_spec.rb b/spec/lib/gitlab/kas/client_spec.rb
index 5668c265611..e8884ce352f 100644
--- a/spec/lib/gitlab/kas/client_spec.rb
+++ b/spec/lib/gitlab/kas/client_spec.rb
@@ -77,8 +77,9 @@ RSpec.describe Gitlab::Kas::Client do
let(:request) { instance_double(Gitlab::Agent::ConfigurationProject::Rpc::ListAgentConfigFilesRequest) }
let(:response) { double(Gitlab::Agent::ConfigurationProject::Rpc::ListAgentConfigFilesResponse, config_files: agent_configurations) }
- let(:repository) { instance_double(Gitlab::Agent::Modserver::Repository) }
- let(:gitaly_address) { instance_double(Gitlab::Agent::Modserver::GitalyAddress) }
+ let(:repository) { instance_double(Gitlab::Agent::Entity::GitalyRepository) }
+ let(:gitaly_info) { instance_double(Gitlab::Agent::Entity::GitalyInfo) }
+ let(:gitaly_features) { Feature::Gitaly.server_feature_flags }
let(:agent_configurations) { [double] }
@@ -89,16 +90,16 @@ RSpec.describe Gitlab::Kas::Client do
.with('example.kas.internal', :this_channel_is_insecure, timeout: described_class::TIMEOUT)
.and_return(stub)
- expect(Gitlab::Agent::Modserver::Repository).to receive(:new)
+ expect(Gitlab::Agent::Entity::GitalyRepository).to receive(:new)
.with(project.repository.gitaly_repository.to_h)
.and_return(repository)
- expect(Gitlab::Agent::Modserver::GitalyAddress).to receive(:new)
- .with(Gitlab::GitalyClient.connection_data(project.repository_storage))
- .and_return(gitaly_address)
+ expect(Gitlab::Agent::Entity::GitalyInfo).to receive(:new)
+ .with(Gitlab::GitalyClient.connection_data(project.repository_storage).merge(features: gitaly_features))
+ .and_return(gitaly_info)
expect(Gitlab::Agent::ConfigurationProject::Rpc::ListAgentConfigFilesRequest).to receive(:new)
- .with(repository: repository, gitaly_address: gitaly_address)
+ .with(repository: repository, gitaly_info: gitaly_info)
.and_return(request)
expect(stub).to receive(:list_agent_config_files)
@@ -112,7 +113,8 @@ RSpec.describe Gitlab::Kas::Client do
describe '#send_git_push_event' do
let(:stub) { instance_double(Gitlab::Agent::Notifications::Rpc::Notifications::Stub) }
let(:request) { instance_double(Gitlab::Agent::Notifications::Rpc::GitPushEventRequest) }
- let(:project_param) { instance_double(Gitlab::Agent::Notifications::Rpc::Project) }
+ let(:event_param) { instance_double(Gitlab::Agent::Event::GitPushEvent) }
+ let(:project_param) { instance_double(Gitlab::Agent::Event::Project) }
let(:response) { double(Gitlab::Agent::Notifications::Rpc::GitPushEventResponse) }
subject { described_class.new.send_git_push_event(project: project) }
@@ -122,12 +124,16 @@ RSpec.describe Gitlab::Kas::Client do
.with('example.kas.internal', :this_channel_is_insecure, timeout: described_class::TIMEOUT)
.and_return(stub)
- expect(Gitlab::Agent::Notifications::Rpc::Project).to receive(:new)
+ expect(Gitlab::Agent::Event::Project).to receive(:new)
.with(id: project.id, full_path: project.full_path)
.and_return(project_param)
- expect(Gitlab::Agent::Notifications::Rpc::GitPushEventRequest).to receive(:new)
+ expect(Gitlab::Agent::Event::GitPushEvent).to receive(:new)
.with(project: project_param)
+ .and_return(event_param)
+
+ expect(Gitlab::Agent::Notifications::Rpc::GitPushEventRequest).to receive(:new)
+ .with(event: event_param)
.and_return(request)
expect(stub).to receive(:git_push_event)
diff --git a/spec/lib/gitlab/kas/user_access_spec.rb b/spec/lib/gitlab/kas/user_access_spec.rb
index a8296d23a18..8a52d76215b 100644
--- a/spec/lib/gitlab/kas/user_access_spec.rb
+++ b/spec/lib/gitlab/kas/user_access_spec.rb
@@ -11,42 +11,6 @@ RSpec.describe Gitlab::Kas::UserAccess, feature_category: :deployment_management
end
it { is_expected.to be true }
-
- context 'when flag kas_user_access is disabled' do
- before do
- stub_feature_flags(kas_user_access: false)
- end
-
- it { is_expected.to be false }
- end
- end
-
- describe '.enabled_for?' do
- subject { described_class.enabled_for?(agent) }
-
- let(:agent) { build(:cluster_agent) }
-
- before do
- allow(::Gitlab::Kas).to receive(:enabled?).and_return true
- end
-
- it { is_expected.to be true }
-
- context 'when flag kas_user_access is disabled' do
- before do
- stub_feature_flags(kas_user_access: false)
- end
-
- it { is_expected.to be false }
- end
-
- context 'when flag kas_user_access_project is disabled' do
- before do
- stub_feature_flags(kas_user_access_project: false)
- end
-
- it { is_expected.to be false }
- end
end
describe '.{encrypt,decrypt}_public_session_id' do
diff --git a/spec/lib/gitlab/kubernetes/kube_client_spec.rb b/spec/lib/gitlab/kubernetes/kube_client_spec.rb
index 2ead188dc93..d0b89afccdc 100644
--- a/spec/lib/gitlab/kubernetes/kube_client_spec.rb
+++ b/spec/lib/gitlab/kubernetes/kube_client_spec.rb
@@ -145,7 +145,7 @@ RSpec.describe Gitlab::Kubernetes::KubeClient do
defaults = Gitlab::Kubernetes::KubeClient::DEFAULT_KUBECLIENT_OPTIONS
expect(client.kubeclient_options[:timeouts]).to eq(defaults[:timeouts])
- client = Gitlab::Kubernetes::KubeClient.new(api_url, timeouts: { read: 7 })
+ client = described_class.new(api_url, timeouts: { read: 7 })
expect(client.kubeclient_options[:timeouts][:read]).to eq(7)
expect(client.kubeclient_options[:timeouts][:open]).to eq(defaults[:timeouts][:open])
end
diff --git a/spec/lib/gitlab/lograge/custom_options_spec.rb b/spec/lib/gitlab/lograge/custom_options_spec.rb
index 090b79c5d3c..3460a8fb080 100644
--- a/spec/lib/gitlab/lograge/custom_options_spec.rb
+++ b/spec/lib/gitlab/lograge/custom_options_spec.rb
@@ -60,16 +60,6 @@ RSpec.describe Gitlab::Lograge::CustomOptions do
expect(subject[:response_bytes]).to eq(1234)
end
- context 'with log_response_length disabled' do
- before do
- stub_feature_flags(log_response_length: false)
- end
-
- it 'does not add the response length' do
- expect(subject).not_to include(:response_bytes)
- end
- end
-
it 'adds Cloudflare headers' do
expect(subject[:cf_ray]).to eq(event.payload[:cf_ray])
expect(subject[:cf_request_id]).to eq(event.payload[:cf_request_id])
diff --git a/spec/lib/gitlab/manifest_import/metadata_spec.rb b/spec/lib/gitlab/manifest_import/metadata_spec.rb
index c8158d3e148..c55b407088d 100644
--- a/spec/lib/gitlab/manifest_import/metadata_spec.rb
+++ b/spec/lib/gitlab/manifest_import/metadata_spec.rb
@@ -4,24 +4,29 @@ require 'spec_helper'
RSpec.describe Gitlab::ManifestImport::Metadata, :clean_gitlab_redis_shared_state do
let(:user) { double(id: 1) }
- let(:repositories) do
+ let_it_be(:repositories) do
[
{ id: 'test1', url: 'http://demo.host/test1' },
{ id: 'test2', url: 'http://demo.host/test2' }
]
end
+ let_it_be(:hashtag_repositories_key) { 'manifest_import:metadata:user:{1}:repositories' }
+ let_it_be(:hashtag_group_id_key) { 'manifest_import:metadata:user:{1}:group_id' }
+ let_it_be(:repositories_key) { 'manifest_import:metadata:user:1:repositories' }
+ let_it_be(:group_id_key) { 'manifest_import:metadata:user:1:group_id' }
+
describe '#save' do
- it 'stores data in Redis with an expiry of EXPIRY_TIME' do
- status = described_class.new(user)
- repositories_key = 'manifest_import:metadata:user:1:repositories'
- group_id_key = 'manifest_import:metadata:user:1:group_id'
+ let(:status) { described_class.new(user) }
- status.save(repositories, 2)
+ subject { status.save(repositories, 2) }
+
+ it 'stores data in Redis with an expiry of EXPIRY_TIME' do
+ subject
Gitlab::Redis::SharedState.with do |redis|
- expect(redis.ttl(repositories_key)).to be_within(5).of(described_class::EXPIRY_TIME)
- expect(redis.ttl(group_id_key)).to be_within(5).of(described_class::EXPIRY_TIME)
+ expect(redis.ttl(hashtag_repositories_key)).to be_within(5).of(described_class::EXPIRY_TIME)
+ expect(redis.ttl(hashtag_group_id_key)).to be_within(5).of(described_class::EXPIRY_TIME)
end
end
end
@@ -41,6 +46,16 @@ RSpec.describe Gitlab::ManifestImport::Metadata, :clean_gitlab_redis_shared_stat
expect(status.repositories).to eq(repositories)
end
+
+ it 'reads non-hash-tagged keys if hash-tag keys are missing' do
+ status = described_class.new(user)
+
+ Gitlab::Redis::SharedState.with do |redis|
+ redis.set(repositories_key, Gitlab::Json.dump(repositories))
+ end
+
+ expect(status.repositories).to eq(repositories)
+ end
end
describe '#group_id' do
@@ -58,5 +73,13 @@ RSpec.describe Gitlab::ManifestImport::Metadata, :clean_gitlab_redis_shared_stat
expect(status.group_id).to eq(3)
end
+
+ it 'reads non-hash-tagged keys if hash-tag keys are missing' do
+ status = described_class.new(user)
+
+ Gitlab::Redis::SharedState.with { |redis| redis.set(group_id_key, 2) }
+
+ expect(status.group_id).to eq(2)
+ end
end
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 2246272d3af..e33c60ef592 100644
--- a/spec/lib/gitlab/markdown_cache/active_record/extension_spec.rb
+++ b/spec/lib/gitlab/markdown_cache/active_record/extension_spec.rb
@@ -147,7 +147,7 @@ RSpec.describe Gitlab::MarkdownCache::ActiveRecord::Extension do
end
describe '.attributes' do
- it 'excludes cache attributes that is blacklisted by default' do
+ it 'excludes cache attributes that are denylisted by default' do
expect(thing.attributes.keys.sort).not_to include(%w[description_html])
end
end
diff --git a/spec/lib/gitlab/markdown_cache/redis/extension_spec.rb b/spec/lib/gitlab/markdown_cache/redis/extension_spec.rb
index da5431a370b..071f6e090c6 100644
--- a/spec/lib/gitlab/markdown_cache/redis/extension_spec.rb
+++ b/spec/lib/gitlab/markdown_cache/redis/extension_spec.rb
@@ -65,9 +65,7 @@ RSpec.describe Gitlab::MarkdownCache::Redis::Extension, :clean_gitlab_redis_cach
Gitlab::Redis::Cache.with do |redis|
expect(redis).to receive(:pipelined).and_call_original
- times = Gitlab::Redis::ClusterUtil.cluster?(redis) ? 2 : 1
-
- expect_next_instances_of(Redis::PipelinedConnection, times) do |pipeline|
+ expect_next_instance_of(Redis::PipelinedConnection) do |pipeline|
expect(pipeline).to receive(:mapped_hmget).once.and_call_original
end
end
diff --git a/spec/lib/gitlab/memory/reporter_spec.rb b/spec/lib/gitlab/memory/reporter_spec.rb
index 64ae740a5d7..1d19d7129cf 100644
--- a/spec/lib/gitlab/memory/reporter_spec.rb
+++ b/spec/lib/gitlab/memory/reporter_spec.rb
@@ -136,7 +136,7 @@ RSpec.describe Gitlab::Memory::Reporter, :aggregate_failures, feature_category:
end
context 'when cause was compression command failing' do
- let(:error_message) { "StandardError: exit 1: cat:" }
+ let(:error_message) { "StandardError.+exit 1: cat:" }
before do
stub_const('Gitlab::Memory::Reporter::COMPRESS_CMD', %w[cat --bad-flag])
diff --git a/spec/lib/gitlab/metrics/dashboard/url_spec.rb b/spec/lib/gitlab/metrics/dashboard/url_spec.rb
index d49200f87cc..a035cf02da4 100644
--- a/spec/lib/gitlab/metrics/dashboard/url_spec.rb
+++ b/spec/lib/gitlab/metrics/dashboard/url_spec.rb
@@ -5,78 +5,6 @@ require 'spec_helper'
RSpec.describe Gitlab::Metrics::Dashboard::Url do
include Gitlab::Routing.url_helpers
- describe '#metrics_regex' do
- let(:environment_id) { 1 }
- let(:url_params) do
- [
- 'foo',
- 'bar',
- environment_id,
- {
- start: '2019-08-02T05:43:09.000Z',
- dashboard: 'config/prometheus/common_metrics.yml',
- group: 'awesome group',
- anchor: 'title'
- }
- ]
- end
-
- let(:expected_params) do
- {
- 'url' => url,
- 'namespace' => 'foo',
- 'project' => 'bar',
- 'environment' => '1',
- 'query' => '?dashboard=config%2Fprometheus%2Fcommon_metrics.yml&group=awesome+group&start=2019-08-02T05%3A43%3A09.000Z',
- 'anchor' => '#title'
- }
- end
-
- subject { described_class.metrics_regex }
-
- context 'for /-/environments/:environment_id/metrics route' do
- let(:url) { metrics_namespace_project_environment_url(*url_params) }
-
- it_behaves_like 'regex which matches url when expected'
- end
-
- context 'for /-/metrics?environment=:environment_id route' do
- let(:url) { namespace_project_metrics_dashboard_url(*url_params) }
- let(:url_params) do
- [
- 'namespace1',
- 'project1',
- {
- environment: environment_id,
- start: '2019-08-02T05:43:09.000Z',
- dashboard: 'config/prometheus/common_metrics.yml',
- group: 'awesome group',
- anchor: 'title'
- }
- ]
- end
-
- let(:expected_params) do
- {
- 'url' => url,
- 'namespace' => 'namespace1',
- 'project' => 'project1',
- 'environment' => environment_id.to_s,
- 'query' => "?dashboard=config%2Fprometheus%2Fcommon_metrics.yml&environment=#{environment_id}&group=awesome+group&start=2019-08-02T05%3A43%3A09.000Z",
- 'anchor' => '#title'
- }
- end
-
- it_behaves_like 'regex which matches url when expected'
- end
-
- context 'for metrics_dashboard route' do
- let(:url) { metrics_dashboard_namespace_project_environment_url(*url_params) }
-
- it_behaves_like 'regex which matches url when expected'
- end
- end
-
describe '#clusters_regex' do
let(:url) { Gitlab::Routing.url_helpers.namespace_project_cluster_url(*url_params) }
let(:url_params) do
@@ -130,33 +58,6 @@ RSpec.describe Gitlab::Metrics::Dashboard::Url do
end
end
- describe '#grafana_regex' do
- let(:url) do
- namespace_project_grafana_api_metrics_dashboard_url(
- 'foo',
- 'bar',
- start: '2019-08-02T05:43:09.000Z',
- dashboard: 'config/prometheus/common_metrics.yml',
- group: 'awesome group',
- anchor: 'title'
- )
- end
-
- let(:expected_params) do
- {
- 'url' => url,
- 'namespace' => 'foo',
- 'project' => 'bar',
- 'query' => '?dashboard=config%2Fprometheus%2Fcommon_metrics.yml&group=awesome+group&start=2019-08-02T05%3A43%3A09.000Z',
- 'anchor' => '#title'
- }
- end
-
- subject { described_class.grafana_regex }
-
- it_behaves_like 'regex which matches url when expected'
- end
-
describe '#alert_regex' do
let(:url) { Gitlab::Routing.url_helpers.metrics_dashboard_namespace_project_prometheus_alert_url(*url_params) }
let(:url_params) do
@@ -202,12 +103,4 @@ RSpec.describe Gitlab::Metrics::Dashboard::Url do
end
end
end
-
- describe '#build_dashboard_url' do
- it 'builds the url for the dashboard endpoint' do
- url = described_class.build_dashboard_url('foo', 'bar', 1)
-
- expect(url).to match described_class.metrics_regex
- end
- end
end
diff --git a/spec/lib/gitlab/metrics/environment_spec.rb b/spec/lib/gitlab/metrics/environment_spec.rb
index e94162e625e..4e3b1b5273e 100644
--- a/spec/lib/gitlab/metrics/environment_spec.rb
+++ b/spec/lib/gitlab/metrics/environment_spec.rb
@@ -1,8 +1,7 @@
# frozen_string_literal: true
require 'fast_spec_helper'
require 'rspec-parameterized'
-
-require_relative '../../../support/helpers/stub_env'
+require 'gitlab/rspec/all'
RSpec.describe Gitlab::Metrics::Environment, feature_category: :error_budgets do
include StubENV
diff --git a/spec/lib/gitlab/metrics/sidekiq_slis_spec.rb b/spec/lib/gitlab/metrics/sidekiq_slis_spec.rb
index eef9a9c79e6..9536b42cd92 100644
--- a/spec/lib/gitlab/metrics/sidekiq_slis_spec.rb
+++ b/spec/lib/gitlab/metrics/sidekiq_slis_spec.rb
@@ -4,23 +4,30 @@ require 'spec_helper'
RSpec.describe Gitlab::Metrics::SidekiqSlis, feature_category: :error_budgets do
using RSpec::Parameterized::TableSyntax
+ let(:labels) do
+ [
+ {
+ worker: "Projects::RecordTargetPlatformsWorker",
+ feature_category: "projects",
+ urgency: "low"
+ }
+ ]
+ end
+
+ describe ".initialize_execution_slis!" do
+ it "initializes the apdex and error rate SLIs" do
+ expect(Gitlab::Metrics::Sli::Apdex).to receive(:initialize_sli).with(:sidekiq_execution, labels)
+ expect(Gitlab::Metrics::Sli::ErrorRate).to receive(:initialize_sli).with(:sidekiq_execution, labels)
- describe ".initialize_slis!" do
- let(:possible_labels) do
- [
- {
- worker: "Projects::RecordTargetPlatformsWorker",
- feature_category: "projects",
- urgency: "low"
- }
- ]
+ described_class.initialize_execution_slis!(labels)
end
+ end
- it "initializes the apdex and error rate SLIs" do
- expect(Gitlab::Metrics::Sli::Apdex).to receive(:initialize_sli).with(:sidekiq_execution, possible_labels)
- expect(Gitlab::Metrics::Sli::ErrorRate).to receive(:initialize_sli).with(:sidekiq_execution, possible_labels)
+ describe ".initialize_queueing_slis!" do
+ it "initializes the apdex SLIs" do
+ expect(Gitlab::Metrics::Sli::Apdex).to receive(:initialize_sli).with(:sidekiq_queueing, labels)
- described_class.initialize_slis!(possible_labels)
+ described_class.initialize_queueing_slis!(labels)
end
end
@@ -62,4 +69,29 @@ RSpec.describe Gitlab::Metrics::SidekiqSlis, feature_category: :error_budgets do
described_class.record_execution_error(labels, error)
end
end
+
+ describe ".record_queueing_apdex" do
+ where(:urgency, :duration, :success) do
+ "high" | 5 | true
+ "high" | 11 | false
+ "low" | 50 | true
+ "low" | 70 | false
+ "throttled" | 100 | true
+ "throttled" | 1_000_000 | true
+ "not_found" | 50 | true
+ "not_found" | 70 | false
+ end
+
+ with_them do
+ it "increments the apdex SLI with success based on urgency requirement" do
+ labels = { urgency: urgency }
+ expect(Gitlab::Metrics::Sli::Apdex[:sidekiq_queueing]).to receive(:increment).with(
+ labels: labels,
+ success: success
+ )
+
+ described_class.record_queueing_apdex(labels, duration)
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/middleware/go_spec.rb b/spec/lib/gitlab/middleware/go_spec.rb
index 83d4d3fb612..a3835f9eed0 100644
--- a/spec/lib/gitlab/middleware/go_spec.rb
+++ b/spec/lib/gitlab/middleware/go_spec.rb
@@ -136,7 +136,7 @@ RSpec.describe Gitlab::Middleware::Go, feature_category: :source_code_management
it_behaves_like 'unauthorized'
end
- context 'with a blacklisted ip' do
+ context 'with a denylisted ip' do
it 'returns forbidden' do
expect(Gitlab::Auth).to receive(:find_for_git_client).and_raise(Gitlab::Auth::IpBlocked)
response = go
diff --git a/spec/lib/gitlab/multi_destination_logger_spec.rb b/spec/lib/gitlab/multi_destination_logger_spec.rb
index e0d76afd9bf..53a8541bcb7 100644
--- a/spec/lib/gitlab/multi_destination_logger_spec.rb
+++ b/spec/lib/gitlab/multi_destination_logger_spec.rb
@@ -2,9 +2,6 @@
require 'spec_helper'
-class FakeLogger
-end
-
class LoggerA < Gitlab::Logger
def self.file_name_noext
'loggerA'
diff --git a/spec/lib/gitlab/observability_spec.rb b/spec/lib/gitlab/observability_spec.rb
index 5082d193197..61f69a0171a 100644
--- a/spec/lib/gitlab/observability_spec.rb
+++ b/spec/lib/gitlab/observability_spec.rb
@@ -3,6 +3,9 @@
require 'spec_helper'
RSpec.describe Gitlab::Observability, feature_category: :error_tracking do
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, group: group) }
+
describe '.observability_url' do
let(:gitlab_url) { 'https://example.com' }
@@ -31,6 +34,24 @@ RSpec.describe Gitlab::Observability, feature_category: :error_tracking do
end
end
+ describe '.oauth_url' do
+ subject { described_class.oauth_url }
+
+ it { is_expected.to eq("#{described_class.observability_url}/v1/auth/start") }
+ end
+
+ describe '.tracing_url' do
+ subject { described_class.tracing_url(project) }
+
+ it { is_expected.to eq("#{described_class.observability_url}/query/#{group.id}/#{project.id}/v1/traces") }
+ end
+
+ describe '.provisioning_url' do
+ subject { described_class.provisioning_url(project) }
+
+ it { is_expected.to eq(described_class.observability_url.to_s) }
+ end
+
describe '.build_full_url' do
let_it_be(:group) { build_stubbed(:group, id: 123) }
let(:observability_url) { described_class.observability_url }
@@ -148,6 +169,27 @@ RSpec.describe Gitlab::Observability, feature_category: :error_tracking do
end
end
+ describe '.tracing_enabled?' do
+ let_it_be(:project) { create(:project, :repository) }
+
+ it 'returns true if feature is enabled globally' do
+ expect(described_class.tracing_enabled?(project)).to eq(true)
+ end
+
+ it 'returns true if feature is enabled for the project' do
+ stub_feature_flags(observability_tracing: false)
+ stub_feature_flags(observability_tracing: project)
+
+ expect(described_class.tracing_enabled?(project)).to eq(true)
+ end
+
+ it 'returns false if feature is disabled globally' do
+ stub_feature_flags(observability_tracing: false)
+
+ expect(described_class.tracing_enabled?(project)).to eq(false)
+ end
+ end
+
describe '.allowed_for_action?' do
let(:group) { build_stubbed(:group) }
let(:user) { build_stubbed(:user) }
diff --git a/spec/lib/gitlab/pages/url_builder_spec.rb b/spec/lib/gitlab/pages/url_builder_spec.rb
new file mode 100644
index 00000000000..8e1581704cb
--- /dev/null
+++ b/spec/lib/gitlab/pages/url_builder_spec.rb
@@ -0,0 +1,227 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Pages::UrlBuilder, feature_category: :pages do
+ let(:pages_enabled) { true }
+ let(:artifacts_server) { true }
+ let(:access_control) { true }
+
+ let(:port) { nil }
+ let(:host) { 'example.com' }
+
+ let(:full_path) { 'group/project' }
+ let(:project_public) { true }
+ let(:unique_domain) { 'unique-domain' }
+ let(:unique_domain_enabled) { false }
+
+ let(:project_setting) do
+ instance_double(
+ ProjectSetting,
+ pages_unique_domain: unique_domain,
+ pages_unique_domain_enabled?: unique_domain_enabled
+ )
+ end
+
+ let(:project) do
+ instance_double(
+ Project,
+ flipper_id: 'project:1', # required for the feature flag check
+ public?: project_public,
+ project_setting: project_setting,
+ full_path: full_path
+ )
+ end
+
+ subject(:builder) { described_class.new(project) }
+
+ before do
+ stub_pages_setting(
+ enabled: pages_enabled,
+ host: host,
+ url: 'http://example.com',
+ protocol: 'http',
+ artifacts_server: artifacts_server,
+ access_control: access_control,
+ port: port
+ )
+ end
+
+ describe '#pages_url' do
+ subject(:pages_url) { builder.pages_url }
+
+ it { is_expected.to eq('http://group.example.com/project') }
+
+ context 'when namespace is upper cased' do
+ let(:full_path) { 'Group/project' }
+
+ it { is_expected.to eq('http://group.example.com/project') }
+ end
+
+ context 'when project is in a nested group page' do
+ let(:full_path) { 'group/subgroup/project' }
+
+ it { is_expected.to eq('http://group.example.com/subgroup/project') }
+ end
+
+ context 'when using domain pages' do
+ let(:full_path) { 'group/group.example.com' }
+
+ it { is_expected.to eq('http://group.example.com') }
+
+ context 'in development mode' do
+ let(:port) { 3010 }
+
+ before do
+ stub_rails_env('development')
+ end
+
+ it { is_expected.to eq('http://group.example.com:3010') }
+ end
+ end
+
+ context 'when not using pages_unique_domain' do
+ subject(:pages_url) { builder.pages_url(with_unique_domain: false) }
+
+ context 'when pages_unique_domain feature flag is disabled' do
+ before do
+ stub_feature_flags(pages_unique_domain: false)
+ end
+
+ it { is_expected.to eq('http://group.example.com/project') }
+ end
+
+ context 'when pages_unique_domain feature flag is enabled' do
+ before do
+ stub_feature_flags(pages_unique_domain: true)
+ end
+
+ context 'when pages_unique_domain_enabled is false' do
+ let(:unique_domain_enabled) { false }
+
+ it { is_expected.to eq('http://group.example.com/project') }
+ end
+
+ context 'when pages_unique_domain_enabled is true' do
+ let(:unique_domain_enabled) { true }
+
+ it { is_expected.to eq('http://group.example.com/project') }
+ end
+ end
+ end
+
+ context 'when using pages_unique_domain' do
+ subject(:pages_url) { builder.pages_url(with_unique_domain: true) }
+
+ context 'when pages_unique_domain feature flag is disabled' do
+ before do
+ stub_feature_flags(pages_unique_domain: false)
+ end
+
+ it { is_expected.to eq('http://group.example.com/project') }
+ end
+
+ context 'when pages_unique_domain feature flag is enabled' do
+ before do
+ stub_feature_flags(pages_unique_domain: true)
+ end
+
+ context 'when pages_unique_domain_enabled is false' do
+ let(:unique_domain_enabled) { false }
+
+ it { is_expected.to eq('http://group.example.com/project') }
+ end
+
+ context 'when pages_unique_domain_enabled is true' do
+ let(:unique_domain_enabled) { true }
+
+ it { is_expected.to eq('http://unique-domain.example.com') }
+ end
+ end
+ end
+ end
+
+ describe '#unique_host' do
+ subject(:unique_host) { builder.unique_host }
+
+ context 'when pages_unique_domain feature flag is disabled' do
+ before do
+ stub_feature_flags(pages_unique_domain: false)
+ end
+
+ it { is_expected.to be_nil }
+ end
+
+ context 'when pages_unique_domain feature flag is enabled' do
+ before do
+ stub_feature_flags(pages_unique_domain: true)
+ end
+
+ context 'when pages_unique_domain_enabled is false' do
+ let(:unique_domain_enabled) { false }
+
+ it { is_expected.to be_nil }
+ end
+
+ context 'when pages_unique_domain_enabled is true' do
+ let(:unique_domain_enabled) { true }
+
+ it { is_expected.to eq('unique-domain.example.com') }
+ end
+ end
+ end
+
+ describe '#artifact_url' do
+ let(:job) { instance_double(Ci::Build, id: 1) }
+ let(:artifact) do
+ instance_double(
+ Gitlab::Ci::Build::Artifacts::Metadata::Entry,
+ name: artifact_name,
+ path: "path/#{artifact_name}")
+ end
+
+ subject(:artifact_url) { builder.artifact_url(artifact, job) }
+
+ context 'with not allowed extension' do
+ let(:artifact_name) { 'file.gif' }
+
+ it { is_expected.to be_nil }
+ end
+
+ context 'with allowed extension' do
+ let(:artifact_name) { 'file.txt' }
+
+ it { is_expected.to eq("http://group.example.com/-/project/-/jobs/1/artifacts/path/file.txt") }
+
+ context 'when port is configured' do
+ let(:port) { 1234 }
+
+ it { is_expected.to eq("http://group.example.com:1234/-/project/-/jobs/1/artifacts/path/file.txt") }
+ end
+ end
+ end
+
+ describe '#artifact_url_available?' do
+ let(:job) { instance_double(Ci::Build, id: 1) }
+ let(:artifact) do
+ instance_double(
+ Gitlab::Ci::Build::Artifacts::Metadata::Entry,
+ name: artifact_name,
+ path: "path/#{artifact_name}")
+ end
+
+ subject(:artifact_url_available) { builder.artifact_url_available?(artifact, job) }
+
+ context 'with not allowed extensions' do
+ let(:artifact_name) { 'file.gif' }
+
+ it { is_expected.to be false }
+ end
+
+ context 'with allowed extensions' do
+ let(:artifact_name) { 'file.txt' }
+
+ it { is_expected.to be true }
+ end
+ end
+end
diff --git a/spec/lib/gitlab/pagination/gitaly_keyset_pager_spec.rb b/spec/lib/gitlab/pagination/gitaly_keyset_pager_spec.rb
index b5ed583b1f1..2e87c582040 100644
--- a/spec/lib/gitlab/pagination/gitaly_keyset_pager_spec.rb
+++ b/spec/lib/gitlab/pagination/gitaly_keyset_pager_spec.rb
@@ -106,7 +106,7 @@ RSpec.describe Gitlab::Pagination::GitalyKeysetPager do
context 'when next page could be available' do
let(:branches) { [branch1, branch2] }
- let(:expected_next_page_link) { %Q(<#{incoming_api_projects_url}?#{query.merge(page_token: branch2.name).to_query}>; rel="next") }
+ let(:expected_next_page_link) { %(<#{incoming_api_projects_url}?#{query.merge(page_token: branch2.name).to_query}>; rel="next") }
it 'uses keyset pagination and adds link headers' do
expect(request_context).to receive(:header).with('Link', expected_next_page_link)
diff --git a/spec/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder_spec.rb b/spec/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder_spec.rb
index cc85c897019..1c67c9e0b95 100644
--- a/spec/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder_spec.rb
+++ b/spec/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder_spec.rb
@@ -33,6 +33,18 @@ RSpec.describe Gitlab::Pagination::Keyset::InOperatorOptimization::QueryBuilder
]
end
+ let_it_be(:ignored_column_model) do
+ Class.new(ApplicationRecord) do
+ self.table_name = 'issues'
+
+ include IgnorableColumns
+
+ ignore_column :title, remove_with: '16.4', remove_after: '2023-08-22'
+ end
+ end
+
+ let(:scope_model) { Issue }
+ let(:created_records) { issues }
let(:iterator) do
Gitlab::Pagination::Keyset::Iterator.new(
scope: scope.limit(batch_size),
@@ -79,6 +91,55 @@ RSpec.describe Gitlab::Pagination::Keyset::InOperatorOptimization::QueryBuilder
end
end
+ context 'when the scope model has ignored columns' do
+ let(:scope) { ignored_column_model.order(id: :desc) }
+ let(:expected_order) { ignored_column_model.where(id: issues.map(&:id)).sort_by(&:id).reverse }
+
+ let(:in_operator_optimization_options) do
+ {
+ array_scope: Project.where(namespace_id: top_level_group.self_and_descendants.select(:id)).select(:id),
+ array_mapping_scope: -> (id_expression) { ignored_column_model.where(ignored_column_model.arel_table[:project_id].eq(id_expression)) },
+ finder_query: -> (id_expression) { ignored_column_model.where(ignored_column_model.arel_table[:id].eq(id_expression)) }
+ }
+ end
+
+ context 'when iterating records one by one' do
+ let(:batch_size) { 1 }
+
+ it_behaves_like 'correct ordering examples'
+
+ context 'when scope selects only some columns' do
+ let(:scope) { ignored_column_model.order(id: :desc).select(:id) }
+
+ it_behaves_like 'correct ordering examples'
+ end
+ end
+
+ context 'when iterating records with LIMIT 3' do
+ let(:batch_size) { 3 }
+
+ it_behaves_like 'correct ordering examples'
+
+ context 'when scope selects only some columns' do
+ let(:scope) { ignored_column_model.order(id: :desc).select(:id) }
+
+ it_behaves_like 'correct ordering examples'
+ end
+ end
+
+ context 'when loading records at once' do
+ let(:batch_size) { issues.size + 1 }
+
+ it_behaves_like 'correct ordering examples'
+
+ context 'when scope selects only some columns' do
+ let(:scope) { ignored_column_model.order(id: :desc).select(:id) }
+
+ it_behaves_like 'correct ordering examples'
+ end
+ end
+ end
+
context 'when ordering by issues.id DESC' do
let(:scope) { Issue.order(id: :desc) }
let(:expected_order) { issues.sort_by(&:id).reverse }
@@ -332,7 +393,7 @@ RSpec.describe Gitlab::Pagination::Keyset::InOperatorOptimization::QueryBuilder
end
context 'when ordering by JOIN-ed columns' do
- let(:scope) { cte_with_issues_and_projects.apply_to(Issue.where({})).reorder(order) }
+ let(:scope) { cte_with_issues_and_projects.apply_to(Issue.where({}).select(Arel.star)).reorder(order) }
let(:cte_with_issues_and_projects) do
cte_query = Issue.select('issues.id AS id', 'project_id', 'projects.id AS projects_id', 'projects.name AS projects_name').joins(:project)
diff --git a/spec/lib/gitlab/pagination/keyset/in_operator_optimization/strategies/record_loader_strategy_spec.rb b/spec/lib/gitlab/pagination/keyset/in_operator_optimization/strategies/record_loader_strategy_spec.rb
index 5180403b493..3fe858f33da 100644
--- a/spec/lib/gitlab/pagination/keyset/in_operator_optimization/strategies/record_loader_strategy_spec.rb
+++ b/spec/lib/gitlab/pagination/keyset/in_operator_optimization/strategies/record_loader_strategy_spec.rb
@@ -3,12 +3,12 @@
require 'spec_helper'
RSpec.describe Gitlab::Pagination::Keyset::InOperatorOptimization::Strategies::RecordLoaderStrategy do
- let(:finder_query) { -> (created_at_value, id_value) { Project.where(Project.arel_table[:id].eq(id_value)) } }
+ let(:finder_query) { -> (created_at_value, id_value) { model.where(model.arel_table[:id].eq(id_value)) } }
let(:model) { Project }
let(:keyset_scope) do
scope, _ = Gitlab::Pagination::Keyset::SimpleOrderBuilder.build(
- Project.order(:created_at, :id)
+ model.order(:created_at, :id)
)
scope
@@ -22,6 +22,16 @@ RSpec.describe Gitlab::Pagination::Keyset::InOperatorOptimization::Strategies::R
Gitlab::Pagination::Keyset::InOperatorOptimization::OrderByColumns.new(keyset_order.column_definitions, model.arel_table)
end
+ let_it_be(:ignored_column_model) do
+ Class.new(ApplicationRecord) do
+ self.table_name = 'projects'
+
+ include IgnorableColumns
+
+ ignore_column :name, remove_with: '16.4', remove_after: '2023-08-22'
+ end
+ end
+
subject(:strategy) { described_class.new(finder_query, model, order_by_columns) }
describe '#initializer_columns' do
@@ -57,4 +67,22 @@ RSpec.describe Gitlab::Pagination::Keyset::InOperatorOptimization::Strategies::R
expect(strategy.columns).to eq([expected_loader_query.chomp])
end
end
+
+ describe '#final_projections' do
+ context 'when model does not have ignored columns' do
+ it 'does not specify the selected column names' do
+ expect(strategy.final_projections).to contain_exactly("(#{described_class::RECORDS_COLUMN}).*")
+ end
+ end
+
+ context 'when model has ignored columns' do
+ let(:model) { ignored_column_model }
+
+ it 'specifies the selected column names' do
+ expect(strategy.final_projections).to match_array(
+ model.default_select_columns.map { |column| "(#{described_class::RECORDS_COLUMN}).#{column.name}" }
+ )
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/pagination/keyset/iterator_spec.rb b/spec/lib/gitlab/pagination/keyset/iterator_spec.rb
index eee743c5e48..afaad48d363 100644
--- a/spec/lib/gitlab/pagination/keyset/iterator_spec.rb
+++ b/spec/lib/gitlab/pagination/keyset/iterator_spec.rb
@@ -87,7 +87,7 @@ RSpec.describe Gitlab::Pagination::Keyset::Iterator do
time = Time.current
iterator.each_batch(of: 2) do |relation|
- Issue.connection.execute("UPDATE issues SET updated_at = '#{time.to_s(:inspect)}' WHERE id IN (#{relation.reselect(:id).to_sql})")
+ Issue.connection.execute("UPDATE issues SET updated_at = '#{time.to_fs(:inspect)}' WHERE id IN (#{relation.reselect(:id).to_sql})")
end
expect(Issue.pluck(:updated_at)).to all(be_within(5.seconds).of(time))
diff --git a/spec/lib/gitlab/pagination/keyset/order_spec.rb b/spec/lib/gitlab/pagination/keyset/order_spec.rb
index e99846ad424..05bb0bb8b3a 100644
--- a/spec/lib/gitlab/pagination/keyset/order_spec.rb
+++ b/spec/lib/gitlab/pagination/keyset/order_spec.rb
@@ -148,7 +148,7 @@ RSpec.describe Gitlab::Pagination::Keyset::Order do
end
let(:order) do
- Gitlab::Pagination::Keyset::Order.build(
+ described_class.build(
[
Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
attribute_name: 'id',
@@ -193,7 +193,7 @@ RSpec.describe Gitlab::Pagination::Keyset::Order do
end
let(:order) do
- Gitlab::Pagination::Keyset::Order.build(
+ described_class.build(
[
Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
attribute_name: 'year',
@@ -260,7 +260,7 @@ RSpec.describe Gitlab::Pagination::Keyset::Order do
end
let(:order) do
- Gitlab::Pagination::Keyset::Order.build(
+ described_class.build(
[
Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
attribute_name: 'year',
@@ -327,7 +327,7 @@ RSpec.describe Gitlab::Pagination::Keyset::Order do
end
let(:order) do
- Gitlab::Pagination::Keyset::Order.build(
+ described_class.build(
[
Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
attribute_name: 'year',
@@ -394,7 +394,7 @@ RSpec.describe Gitlab::Pagination::Keyset::Order do
end
let(:order) do
- Gitlab::Pagination::Keyset::Order.build(
+ described_class.build(
[
Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
attribute_name: 'year',
@@ -452,7 +452,7 @@ RSpec.describe Gitlab::Pagination::Keyset::Order do
context 'when ordering by the named function LOWER' do
let(:order) do
- Gitlab::Pagination::Keyset::Order.build(
+ described_class.build(
[
Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
attribute_name: 'title',
@@ -494,7 +494,7 @@ RSpec.describe Gitlab::Pagination::Keyset::Order do
context 'when the passed cursor values do not match with the order definition' do
let(:order) do
- Gitlab::Pagination::Keyset::Order.build(
+ described_class.build(
[
Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
attribute_name: 'year',
@@ -564,7 +564,7 @@ RSpec.describe Gitlab::Pagination::Keyset::Order do
context 'when string attribute name is given' do
let(:order) do
- Gitlab::Pagination::Keyset::Order.build(
+ described_class.build(
[
Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
attribute_name: 'id',
@@ -580,7 +580,7 @@ RSpec.describe Gitlab::Pagination::Keyset::Order do
context 'when symbol attribute name is given' do
let(:order) do
- Gitlab::Pagination::Keyset::Order.build(
+ described_class.build(
[
Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
attribute_name: :id,
@@ -606,7 +606,7 @@ RSpec.describe Gitlab::Pagination::Keyset::Order do
context 'when there are additional_projections' do
let(:order) do
- order = Gitlab::Pagination::Keyset::Order.build(
+ order = described_class.build(
[
Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
attribute_name: 'created_at_field',
@@ -645,6 +645,16 @@ RSpec.describe Gitlab::Pagination::Keyset::Order do
let_it_be(:user_2) { create(:user, created_at: five_months_ago) }
let_it_be(:user_3) { create(:user, created_at: 1.month.ago) }
let_it_be(:user_4) { create(:user, created_at: 2.months.ago) }
+ let_it_be(:ignored_column_model) do
+ Class.new(ApplicationRecord) do
+ self.table_name = 'users'
+
+ include IgnorableColumns
+ include FromUnion
+
+ ignore_column :username, remove_with: '16.4', remove_after: '2023-08-22'
+ end
+ end
let(:expected_results) { [user_3, user_4, user_2, user_1] }
let(:scope) { User.order(created_at: :desc, id: :desc) }
@@ -672,6 +682,26 @@ RSpec.describe Gitlab::Pagination::Keyset::Order do
iterator_options[:use_union_optimization] = true
end
+ context 'when the scope model has ignored columns' do
+ let(:ignored_expected_results) { expected_results.map { |r| r.becomes(ignored_column_model) } } # rubocop:disable Cop/AvoidBecomes
+
+ context 'when scope selects all columns' do
+ let(:scope) { ignored_column_model.order(created_at: :desc, id: :desc) }
+
+ it 'returns items in the correct order' do
+ expect(items).to eq(ignored_expected_results)
+ end
+ end
+
+ context 'when scope selects only specific columns' do
+ let(:scope) { ignored_column_model.order(created_at: :desc, id: :desc).select(:id, :created_at) }
+
+ it 'returns items in the correct order' do
+ expect(items).to eq(ignored_expected_results)
+ end
+ end
+ end
+
it 'returns items in the correct order' do
expect(items).to eq(expected_results)
end
@@ -687,7 +717,7 @@ RSpec.describe Gitlab::Pagination::Keyset::Order do
it 'builds UNION query' do
cursor_attributes = { created_at: five_months_ago, id: user_2.id }
- order = Gitlab::Pagination::Keyset::Order.extract_keyset_order_object(keyset_aware_scope)
+ order = described_class.extract_keyset_order_object(keyset_aware_scope)
query = order.apply_cursor_conditions(scope, cursor_attributes, use_union_optimization: true).to_sql
expect(query).to include('UNION ALL')
@@ -698,7 +728,7 @@ RSpec.describe Gitlab::Pagination::Keyset::Order do
describe '#attribute_names' do
let(:expected_attribute_names) { %w(id name) }
let(:order) do
- Gitlab::Pagination::Keyset::Order.build(
+ described_class.build(
[
Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
attribute_name: 'id',
diff --git a/spec/lib/gitlab/pagination/offset_pagination_spec.rb b/spec/lib/gitlab/pagination/offset_pagination_spec.rb
index dc32f471756..836b3cb55d6 100644
--- a/spec/lib/gitlab/pagination/offset_pagination_spec.rb
+++ b/spec/lib/gitlab/pagination/offset_pagination_spec.rb
@@ -44,9 +44,9 @@ RSpec.describe Gitlab::Pagination::OffsetPagination do
expect_header('X-Prev-Page', '')
expect_header('Link', anything) do |_key, val|
- expect(val).to include(%Q(<#{incoming_api_projects_url}?#{query.merge(page: 1).to_query}>; rel="first"))
- expect(val).to include(%Q(<#{incoming_api_projects_url}?#{query.merge(page: 2).to_query}>; rel="last"))
- expect(val).to include(%Q(<#{incoming_api_projects_url}?#{query.merge(page: 2).to_query}>; rel="next"))
+ expect(val).to include(%(<#{incoming_api_projects_url}?#{query.merge(page: 1).to_query}>; rel="first"))
+ expect(val).to include(%(<#{incoming_api_projects_url}?#{query.merge(page: 2).to_query}>; rel="last"))
+ expect(val).to include(%(<#{incoming_api_projects_url}?#{query.merge(page: 2).to_query}>; rel="next"))
expect(val).not_to include('rel="prev"')
end
@@ -91,8 +91,8 @@ RSpec.describe Gitlab::Pagination::OffsetPagination do
expect_header('X-Prev-Page', '')
expect_header('Link', anything) do |_key, val|
- expect(val).to include(%Q(<#{incoming_api_projects_url}?#{query.merge(page: 1).to_query}>; rel="first"))
- expect(val).to include(%Q(<#{incoming_api_projects_url}?#{query.merge(page: 2).to_query}>; rel="next"))
+ expect(val).to include(%(<#{incoming_api_projects_url}?#{query.merge(page: 1).to_query}>; rel="first"))
+ expect(val).to include(%(<#{incoming_api_projects_url}?#{query.merge(page: 2).to_query}>; rel="next"))
expect(val).not_to include('rel="last"')
expect(val).not_to include('rel="prev"')
end
@@ -113,8 +113,8 @@ RSpec.describe Gitlab::Pagination::OffsetPagination do
expect_header('X-Prev-Page', '')
expect_header('Link', anything) do |_key, val|
- expect(val).to include(%Q(<#{incoming_api_projects_url}?#{query.merge(page: 1).to_query}>; rel="first"))
- expect(val).to include(%Q(<#{incoming_api_projects_url}?#{query.merge(page: 2).to_query}>; rel="next"))
+ expect(val).to include(%(<#{incoming_api_projects_url}?#{query.merge(page: 1).to_query}>; rel="first"))
+ expect(val).to include(%(<#{incoming_api_projects_url}?#{query.merge(page: 2).to_query}>; rel="next"))
expect(val).not_to include('rel="last"')
expect(val).not_to include('rel="prev"')
end
@@ -242,9 +242,9 @@ RSpec.describe Gitlab::Pagination::OffsetPagination do
expect_header('X-Prev-Page', '1')
expect_header('Link', anything) do |_key, val|
- expect(val).to include(%Q(<#{incoming_api_projects_url}?#{query.merge(page: 1).to_query}>; rel="first"))
- expect(val).to include(%Q(<#{incoming_api_projects_url}?#{query.merge(page: 2).to_query}>; rel="last"))
- expect(val).to include(%Q(<#{incoming_api_projects_url}?#{query.merge(page: 1).to_query}>; rel="prev"))
+ expect(val).to include(%(<#{incoming_api_projects_url}?#{query.merge(page: 1).to_query}>; rel="first"))
+ expect(val).to include(%(<#{incoming_api_projects_url}?#{query.merge(page: 2).to_query}>; rel="last"))
+ expect(val).to include(%(<#{incoming_api_projects_url}?#{query.merge(page: 1).to_query}>; rel="prev"))
expect(val).not_to include('rel="next"')
end
@@ -291,8 +291,8 @@ RSpec.describe Gitlab::Pagination::OffsetPagination do
expect_header('X-Prev-Page', '')
expect_header('Link', anything) do |_key, val|
- expect(val).to include(%Q(<#{incoming_api_projects_url}?#{query.merge(page: 1).to_query}>; rel="first"))
- expect(val).to include(%Q(<#{incoming_api_projects_url}?#{query.merge(page: 1).to_query}>; rel="last"))
+ expect(val).to include(%(<#{incoming_api_projects_url}?#{query.merge(page: 1).to_query}>; rel="first"))
+ expect(val).to include(%(<#{incoming_api_projects_url}?#{query.merge(page: 1).to_query}>; rel="last"))
expect(val).not_to include('rel="prev"')
expect(val).not_to include('rel="next"')
expect(val).not_to include('page=0')
diff --git a/spec/lib/gitlab/patch/action_cable_redis_listener_spec.rb b/spec/lib/gitlab/patch/action_cable_redis_listener_spec.rb
deleted file mode 100644
index 14f556ff348..00000000000
--- a/spec/lib/gitlab/patch/action_cable_redis_listener_spec.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Patch::ActionCableRedisListener do
- let(:adapter) { instance_double('ActionCable::SubscriptionAdapter::Redis') }
- let(:connection) { instance_double('Redis') }
- let(:listener) { ActionCable::SubscriptionAdapter::Redis::Listener.new(adapter, nil) }
-
- before do
- allow(Thread).to receive(:new).and_yield
- allow(adapter).to receive(:redis_connection_for_subscriptions).and_return(connection)
- end
-
- it 'catches Redis connection errors and restarts Action Cable' do
- expect(connection).to receive(:without_reconnect).and_raise Redis::ConnectionError
- expect(ActionCable).to receive_message_chain(:server, :restart)
-
- expect { listener.add_channel('test_channel', nil) }.not_to raise_error
- end
-
- it 're-raises other exceptions' do
- expect(connection).to receive(:without_reconnect).and_raise StandardError
- expect(ActionCable).not_to receive(:server)
-
- expect { listener.add_channel('test_channel', nil) }.to raise_error(StandardError)
- end
-end
diff --git a/spec/lib/gitlab/prometheus/query_variables_spec.rb b/spec/lib/gitlab/prometheus/query_variables_spec.rb
index d9cac3e1064..d0947eef2d9 100644
--- a/spec/lib/gitlab/prometheus/query_variables_spec.rb
+++ b/spec/lib/gitlab/prometheus/query_variables_spec.rb
@@ -20,7 +20,7 @@ RSpec.describe Gitlab::Prometheus::QueryVariables do
it do
is_expected.to include(environment_filter:
- %Q[container_name!="POD",environment="#{slug}"])
+ %[container_name!="POD",environment="#{slug}"])
end
context 'without deployment platform' do
diff --git a/spec/lib/gitlab/rack_attack/request_spec.rb b/spec/lib/gitlab/rack_attack/request_spec.rb
index ae0abfd0bc5..e8433d99d15 100644
--- a/spec/lib/gitlab/rack_attack/request_spec.rb
+++ b/spec/lib/gitlab/rack_attack/request_spec.rb
@@ -258,6 +258,11 @@ RSpec.describe Gitlab::RackAttack::Request do
valid_token = SecureRandom.base64(ActionController::RequestForgeryProtection::AUTHENTICITY_TOKEN_LENGTH)
other_token = SecureRandom.base64(ActionController::RequestForgeryProtection::AUTHENTICITY_TOKEN_LENGTH)
+ before do
+ allow(session).to receive(:enabled?).and_return(true)
+ allow(session).to receive(:loaded?).and_return(true)
+ end
+
where(:session, :env, :expected) do
{} | {} | false
{} | { 'HTTP_X_CSRF_TOKEN' => valid_token } | false
diff --git a/spec/lib/gitlab/redis/cross_slot_spec.rb b/spec/lib/gitlab/redis/cross_slot_spec.rb
index b3eac4357e8..e2f5fcf7694 100644
--- a/spec/lib/gitlab/redis/cross_slot_spec.rb
+++ b/spec/lib/gitlab/redis/cross_slot_spec.rb
@@ -3,10 +3,18 @@
require 'spec_helper'
RSpec.describe Gitlab::Redis::CrossSlot, feature_category: :redis do
+ include RedisHelpers
+
+ let_it_be(:redis_store_class) { define_helper_redis_store_class }
+
+ before do
+ redis_store_class.with(&:flushdb)
+ end
+
describe '.pipelined' do
context 'when using redis client' do
before do
- Gitlab::Redis::Queues.with { |redis| redis.set('a', 1) }
+ redis_store_class.with { |redis| redis.set('a', 1) }
end
it 'performs redis-rb pipelined' do
@@ -14,7 +22,7 @@ RSpec.describe Gitlab::Redis::CrossSlot, feature_category: :redis do
expect(
Gitlab::Instrumentation::RedisClusterValidator.allow_cross_slot_commands do
- Gitlab::Redis::Queues.with do |redis|
+ redis_store_class.with do |redis|
described_class::Pipeline.new(redis).pipelined do |p|
p.get('a')
p.set('b', 1)
@@ -26,16 +34,15 @@ RSpec.describe Gitlab::Redis::CrossSlot, feature_category: :redis do
end
context 'when using with MultiStore' do
- let(:multistore) do
- Gitlab::Redis::MultiStore.new(
- ::Redis.new(::Gitlab::Redis::SharedState.params),
- ::Redis.new(::Gitlab::Redis::Sessions.params),
- 'testing')
- end
+ let_it_be(:primary_db) { 1 }
+ let_it_be(:secondary_db) { 2 }
+ let_it_be(:primary_store) { create_redis_store(redis_store_class.params, db: primary_db, serializer: nil) }
+ let_it_be(:secondary_store) { create_redis_store(redis_store_class.params, db: secondary_db, serializer: nil) }
+ let_it_be(:multistore) { Gitlab::Redis::MultiStore.new(primary_store, secondary_store, 'testing') }
before do
- Gitlab::Redis::SharedState.with { |redis| redis.set('a', 1) }
- Gitlab::Redis::Sessions.with { |redis| redis.set('a', 1) }
+ primary_store.set('a', 1)
+ secondary_store.set('a', 1)
skip_feature_flags_yaml_validation
skip_default_enabled_yaml_check
end
diff --git a/spec/lib/gitlab/redis/multi_store_spec.rb b/spec/lib/gitlab/redis/multi_store_spec.rb
index 80d5915b819..e15375c88c7 100644
--- a/spec/lib/gitlab/redis/multi_store_spec.rb
+++ b/spec/lib/gitlab/redis/multi_store_spec.rb
@@ -4,20 +4,9 @@ require 'spec_helper'
RSpec.describe Gitlab::Redis::MultiStore, feature_category: :redis do
using RSpec::Parameterized::TableSyntax
+ include RedisHelpers
- let_it_be(:redis_store_class) do
- Class.new(Gitlab::Redis::Wrapper) do
- def config_file_name
- config_file_name = "spec/fixtures/config/redis_new_format_host.yml"
- Rails.root.join(config_file_name).to_s
- end
-
- def self.name
- 'Sessions'
- end
- end
- end
-
+ let_it_be(:redis_store_class) { define_helper_redis_store_class }
let_it_be(:primary_db) { 1 }
let_it_be(:secondary_db) { 2 }
let_it_be(:primary_store) { create_redis_store(redis_store_class.params, db: primary_db, serializer: nil) }
@@ -269,8 +258,8 @@ RSpec.describe Gitlab::Redis::MultiStore, feature_category: :redis do
multi_store.default_store.flushdb
end
- it 'does not call the fallback store' do
- expect(multi_store.fallback_store).not_to receive(name)
+ it 'does not call the non_default_store' do
+ expect(multi_store.non_default_store).not_to receive(name)
end
end
@@ -574,21 +563,33 @@ RSpec.describe Gitlab::Redis::MultiStore, feature_category: :redis do
end
end
- context 'when executing on the primary instance is raising an exception' do
+ context 'when executing on the default instance is raising an exception' do
+ before do
+ allow(multi_store.default_store).to receive(name).with(*expected_args).and_raise(StandardError)
+ allow(Gitlab::ErrorTracking).to receive(:log_exception)
+ end
+
+ it 'raises error and does not execute on non default instance', :aggregate_failures do
+ expect(multi_store.non_default_store).not_to receive(name).with(*expected_args)
+ expect { subject }.to raise_error(StandardError)
+ end
+ end
+
+ context 'when executing on the non default instance is raising an exception' do
before do
- allow(primary_store).to receive(name).with(*expected_args).and_raise(StandardError)
+ allow(multi_store.non_default_store).to receive(name).with(*expected_args).and_raise(StandardError)
allow(Gitlab::ErrorTracking).to receive(:log_exception)
end
- it 'logs the exception and execute on secondary instance', :aggregate_failures do
+ it 'logs the exception and execute on default instance', :aggregate_failures do
expect(Gitlab::ErrorTracking).to receive(:log_exception).with(an_instance_of(StandardError),
hash_including(:multi_store_error_message, command_name: name, instance_name: instance_name))
- expect(secondary_store).to receive(name).with(*expected_args).and_call_original
+ expect(multi_store.default_store).to receive(name).with(*expected_args).and_call_original
subject
end
- include_examples 'verify that store contains values', :secondary_store
+ include_examples 'verify that store contains values', :default_store
end
context 'when the command is executed within pipelined block' do
@@ -661,21 +662,33 @@ RSpec.describe Gitlab::Redis::MultiStore, feature_category: :redis do
include_examples 'verify that store contains values', :secondary_store
end
- context 'when executing on the primary instance is raising an exception' do
+ context 'when executing on the default instance is raising an exception' do
before do
- allow(primary_store).to receive(name).and_raise(StandardError)
+ allow(multi_store.default_store).to receive(name).and_raise(StandardError)
+ end
+
+ it 'raises error and does not execute on non default instance', :aggregate_failures do
+ expect(multi_store.non_default_store).not_to receive(name)
+
+ expect { subject }.to raise_error(StandardError)
+ end
+ end
+
+ context 'when executing on the non default instance is raising an exception' do
+ before do
+ allow(multi_store.non_default_store).to receive(name).and_raise(StandardError)
allow(Gitlab::ErrorTracking).to receive(:log_exception)
end
- it 'logs the exception and execute on secondary instance', :aggregate_failures do
+ it 'logs the exception and execute on default instance', :aggregate_failures do
expect(Gitlab::ErrorTracking).to receive(:log_exception).with(an_instance_of(StandardError),
hash_including(:multi_store_error_message, command_name: name))
- expect(secondary_store).to receive(name).and_call_original
+ expect(multi_store.default_store).to receive(name).and_call_original
subject
end
- include_examples 'verify that store contains values', :secondary_store
+ include_examples 'verify that store contains values', :default_store
end
describe 'return values from a pipelined command' do
@@ -708,15 +721,16 @@ RSpec.describe Gitlab::Redis::MultiStore, feature_category: :redis do
context 'when the value exists on both but differ' do
before do
- primary_store.set(key1, value1)
- secondary_store.set(key1, value2)
+ multi_store.non_default_store.set(key1, value1)
+ multi_store.default_store.set(key1, value2)
end
it 'returns the value from the secondary store, logging an error' do
expect(Gitlab::ErrorTracking).to receive(:log_exception).with(
pipeline_diff_error_with_stacktrace(
'Pipelined command executed on both stores successfully but results differ between them. ' \
- "Result from the primary: [#{value1.inspect}]. Result from the secondary: [#{value2.inspect}]."
+ "Result from the non-default store: [#{value1.inspect}]. " \
+ "Result from the default store: [#{value2.inspect}]."
),
hash_including(command_name: name, instance_name: instance_name)
).and_call_original
@@ -726,16 +740,16 @@ RSpec.describe Gitlab::Redis::MultiStore, feature_category: :redis do
end
end
- context 'when the value does not exist on the primary but it does on the secondary' do
+ context 'when the value does not exist on the non-default store but it does on the default' do
before do
- secondary_store.set(key1, value2)
+ multi_store.default_store.set(key1, value2)
end
it 'returns the value from the secondary store, logging an error' do
expect(Gitlab::ErrorTracking).to receive(:log_exception).with(
pipeline_diff_error_with_stacktrace(
'Pipelined command executed on both stores successfully but results differ between them. ' \
- "Result from the primary: [nil]. Result from the secondary: [#{value2.inspect}]."
+ "Result from the non-default store: [nil]. Result from the default store: [#{value2.inspect}]."
),
hash_including(command_name: name, instance_name: instance_name)
)
@@ -784,23 +798,53 @@ RSpec.describe Gitlab::Redis::MultiStore, feature_category: :redis do
end
context 'when either store is a an instance of ::Redis::Cluster' do
+ let(:pipeline) { double }
+ let(:client) { double }
+
before do
- client = double
allow(client).to receive(:instance_of?).with(::Redis::Cluster).and_return(true)
- allow(primary_store).to receive(:_client).and_return(client)
+ allow(pipeline).to receive(:pipelined)
+ allow(multi_store.default_store).to receive(:_client).and_return(client)
end
it 'calls cross-slot pipeline within multistore' do
if name == :pipelined
# we intentionally exclude `.and_call_original` since primary_store/secondary_store
# may not be running on a proper Redis Cluster.
- expect(Gitlab::Redis::CrossSlot::Pipeline).to receive(:new).with(primary_store).exactly(:once)
- expect(Gitlab::Redis::CrossSlot::Pipeline).not_to receive(:new).with(secondary_store)
+ expect(Gitlab::Redis::CrossSlot::Pipeline).to receive(:new)
+ .with(multi_store.default_store)
+ .exactly(:once)
+ .and_return(pipeline)
+ expect(Gitlab::Redis::CrossSlot::Pipeline).not_to receive(:new).with(multi_store.non_default_store)
end
subject
end
end
+
+ context 'when with_readonly_pipeline is used' do
+ it 'calls the default store only' do
+ expect(primary_store).to receive(:send).and_call_original
+ expect(secondary_store).not_to receive(:send).and_call_original
+
+ multi_store.with_readonly_pipeline { subject }
+ end
+
+ context 'when used in a nested manner' do
+ subject(:nested_subject) do
+ multi_store.with_readonly_pipeline do
+ multi_store.with_readonly_pipeline { subject }
+ end
+ end
+
+ it 'raises error' do
+ expect { nested_subject }.to raise_error(Gitlab::Redis::MultiStore::NestedReadonlyPipelineError)
+ expect { nested_subject }.to raise_error { |e|
+ expect(e.message).to eq('Nested use of with_readonly_pipeline is detected.')
+ }
+ end
+ end
+ end
end
end
@@ -1086,8 +1130,4 @@ RSpec.describe Gitlab::Redis::MultiStore, feature_category: :redis do
end
end
end
-
- def create_redis_store(options, extras = {})
- ::Redis::Store.new(options.merge(extras))
- end
end
diff --git a/spec/lib/gitlab/reference_extractor_spec.rb b/spec/lib/gitlab/reference_extractor_spec.rb
index 62fcb4821fc..37db13b76b9 100644
--- a/spec/lib/gitlab/reference_extractor_spec.rb
+++ b/spec/lib/gitlab/reference_extractor_spec.rb
@@ -31,7 +31,7 @@ RSpec.describe Gitlab::ReferenceExtractor do
project.add_reporter(@u_foo)
project.add_reporter(@u_bar)
- subject.analyze(%Q{
+ subject.analyze(%{
Inline code: `@foo`
Code block:
diff --git a/spec/lib/gitlab/relative_positioning/range_spec.rb b/spec/lib/gitlab/relative_positioning/range_spec.rb
index da1f0166d5d..cb3e1504a7a 100644
--- a/spec/lib/gitlab/relative_positioning/range_spec.rb
+++ b/spec/lib/gitlab/relative_positioning/range_spec.rb
@@ -27,19 +27,19 @@ RSpec.describe Gitlab::RelativePositioning::Range do
it 'constructs a closed range when both termini are provided' do
range = Gitlab::RelativePositioning.range(item_a, item_b)
- expect(range).to be_a_kind_of(Gitlab::RelativePositioning::Range)
+ expect(range).to be_a_kind_of(described_class)
expect(range).to be_a_kind_of(Gitlab::RelativePositioning::ClosedRange)
end
it 'constructs a starting-from range when only the LHS is provided' do
range = Gitlab::RelativePositioning.range(item_a, nil)
- expect(range).to be_a_kind_of(Gitlab::RelativePositioning::Range)
+ expect(range).to be_a_kind_of(described_class)
expect(range).to be_a_kind_of(Gitlab::RelativePositioning::StartingFrom)
end
it 'constructs an ending-at range when only the RHS is provided' do
range = Gitlab::RelativePositioning.range(nil, item_b)
- expect(range).to be_a_kind_of(Gitlab::RelativePositioning::Range)
+ expect(range).to be_a_kind_of(described_class)
expect(range).to be_a_kind_of(Gitlab::RelativePositioning::EndingAt)
end
end
diff --git a/spec/lib/gitlab/request_forgery_protection_spec.rb b/spec/lib/gitlab/request_forgery_protection_spec.rb
index 10842173365..dbf9f295706 100644
--- a/spec/lib/gitlab/request_forgery_protection_spec.rb
+++ b/spec/lib/gitlab/request_forgery_protection_spec.rb
@@ -13,6 +13,11 @@ RSpec.describe Gitlab::RequestForgeryProtection, :allow_forgery_protection do
}
end
+ before do
+ allow(env['rack.session']).to receive(:enabled?).and_return(true)
+ allow(env['rack.session']).to receive(:loaded?).and_return(true)
+ end
+
it 'logs to /dev/null' do
expect(ActiveSupport::Logger).to receive(:new).with(File::NULL)
diff --git a/spec/lib/gitlab/runtime_spec.rb b/spec/lib/gitlab/runtime_spec.rb
index fa0fad65520..01cfa91bb59 100644
--- a/spec/lib/gitlab/runtime_spec.rb
+++ b/spec/lib/gitlab/runtime_spec.rb
@@ -95,7 +95,7 @@ RSpec.describe Gitlab::Runtime, feature_category: :application_performance do
it_behaves_like "valid runtime", :puma, 3 + Gitlab::ActionCable::Config.worker_pool_size
it 'identifies as an application runtime' do
- expect(Gitlab::Runtime.application?).to be true
+ expect(described_class.application?).to be true
end
context "when ActionCable worker pool size is configured" do
@@ -133,7 +133,7 @@ RSpec.describe Gitlab::Runtime, feature_category: :application_performance do
it_behaves_like "valid runtime", :sidekiq, 5
it 'identifies as an application runtime' do
- expect(Gitlab::Runtime.application?).to be true
+ expect(described_class.application?).to be true
end
end
@@ -145,7 +145,7 @@ RSpec.describe Gitlab::Runtime, feature_category: :application_performance do
it_behaves_like "valid runtime", :console, 1
it 'does not identify as an application runtime' do
- expect(Gitlab::Runtime.application?).to be false
+ expect(described_class.application?).to be false
end
end
@@ -157,7 +157,7 @@ RSpec.describe Gitlab::Runtime, feature_category: :application_performance do
it_behaves_like "valid runtime", :test_suite, 1
it 'does not identify as an application runtime' do
- expect(Gitlab::Runtime.application?).to be false
+ expect(described_class.application?).to be false
end
end
@@ -177,7 +177,7 @@ RSpec.describe Gitlab::Runtime, feature_category: :application_performance do
it_behaves_like "valid runtime", :rails_runner, 1
it 'does not identify as an application runtime' do
- expect(Gitlab::Runtime.application?).to be false
+ expect(described_class.application?).to be false
end
end
end
diff --git a/spec/lib/gitlab/search/found_wiki_page_spec.rb b/spec/lib/gitlab/search/found_wiki_page_spec.rb
index fc166ad3851..b84a27fa2cf 100644
--- a/spec/lib/gitlab/search/found_wiki_page_spec.rb
+++ b/spec/lib/gitlab/search/found_wiki_page_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Search::FoundWikiPage do
+RSpec.describe Gitlab::Search::FoundWikiPage, feature_category: :global_search do
let(:project) { create(:project, :public, :repository) }
describe 'policy' do
diff --git a/spec/lib/gitlab/search_results_spec.rb b/spec/lib/gitlab/search_results_spec.rb
index ce54f853e1b..662eab11cc0 100644
--- a/spec/lib/gitlab/search_results_spec.rb
+++ b/spec/lib/gitlab/search_results_spec.rb
@@ -302,18 +302,6 @@ RSpec.describe Gitlab::SearchResults, feature_category: :global_search do
results.objects('users')
end
-
- context 'when autocomplete_users_use_search_service feature flag is disabled' do
- before do
- stub_feature_flags(autocomplete_users_use_search_service: false)
- end
-
- it 'calls the UsersFinder without use_minimum_char_limit' do
- expect(UsersFinder).to receive(:new).with(user, search: 'foo').and_call_original
-
- results.objects('users')
- end
- end
end
end
diff --git a/spec/lib/gitlab/seeder_spec.rb b/spec/lib/gitlab/seeder_spec.rb
index a94ae2bca7a..e5453d338a0 100644
--- a/spec/lib/gitlab/seeder_spec.rb
+++ b/spec/lib/gitlab/seeder_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe Gitlab::Seeder do
subject { described_class }
it 'has not_mass_generated scope' do
- expect { Namespace.not_mass_generated }.to raise_error(NoMethodError)
+ expect { described_class.not_mass_generated }.to raise_error(NoMethodError)
Gitlab::Seeder.quiet do
expect { Namespace.not_mass_generated }.not_to raise_error
diff --git a/spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb b/spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb
index 1c23a619b38..4e46a26e89f 100644
--- a/spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb
+++ b/spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb
@@ -426,7 +426,7 @@ RSpec.describe Gitlab::SidekiqLogging::StructuredLogger do
end
context 'when the job is deferred' do
- it 'logs start and end of job with deferred job_status' do
+ it 'logs start and end of job with "deferred" job_status' do
travel_to(timestamp) do
expect(logger).to receive(:info).with(start_payload).ordered
expect(logger).to receive(:info).with(deferred_payload).ordered
@@ -436,10 +436,48 @@ RSpec.describe Gitlab::SidekiqLogging::StructuredLogger do
call_subject(job, 'test_queue') do
job['deferred'] = true
job['deferred_by'] = :feature_flag
+ job['deferred_count'] = 1
end
end
end
end
+
+ context 'when the job is dropped' do
+ it 'logs start and end of job with "dropped" job_status' do
+ travel_to(timestamp) do
+ expect(logger).to receive(:info).with(start_payload).ordered
+ expect(logger).to receive(:info).with(dropped_payload).ordered
+ expect(subject).to receive(:log_job_start).and_call_original
+ expect(subject).to receive(:log_job_done).and_call_original
+
+ call_subject(job, 'test_queue') do
+ job['dropped'] = true
+ end
+ end
+ end
+ end
+
+ context 'with a real worker' do
+ let(:worker_class) { AuthorizedKeysWorker.name }
+
+ let(:expected_end_payload) do
+ end_payload.merge(
+ 'urgency' => 'high',
+ 'target_duration_s' => 10
+ )
+ end
+
+ it 'logs job done with urgency and target_duration_s fields' do
+ travel_to(timestamp) do
+ expect(logger).to receive(:info).with(start_payload).ordered
+ expect(logger).to receive(:info).with(expected_end_payload).ordered
+ expect(subject).to receive(:log_job_start).and_call_original
+ expect(subject).to receive(:log_job_done).and_call_original
+
+ call_subject(job, 'test_queue') {}
+ end
+ end
+ end
end
describe '#add_time_keys!' do
diff --git a/spec/lib/gitlab/sidekiq_middleware/defer_jobs_spec.rb b/spec/lib/gitlab/sidekiq_middleware/defer_jobs_spec.rb
deleted file mode 100644
index 195a79c22ec..00000000000
--- a/spec/lib/gitlab/sidekiq_middleware/defer_jobs_spec.rb
+++ /dev/null
@@ -1,111 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::SidekiqMiddleware::DeferJobs, feature_category: :scalability do
- let(:job) { { 'jid' => 123, 'args' => [456] } }
- let(:queue) { 'test_queue' }
- let(:deferred_worker) do
- Class.new do
- def self.name
- 'TestDeferredWorker'
- end
- include ApplicationWorker
- end
- end
-
- let(:undeferred_worker) do
- Class.new do
- def self.name
- 'UndeferredWorker'
- end
- include ApplicationWorker
- end
- end
-
- subject { described_class.new }
-
- before do
- stub_const('TestDeferredWorker', deferred_worker)
- stub_const('UndeferredWorker', undeferred_worker)
- end
-
- describe '#call' do
- context 'with worker not opted for database health check' do
- context 'when sidekiq_defer_jobs feature flag is enabled for a worker' do
- before do
- stub_feature_flags("defer_sidekiq_jobs_#{TestDeferredWorker.name}": true)
- stub_feature_flags("defer_sidekiq_jobs_#{UndeferredWorker.name}": false)
- end
-
- context 'for the affected worker' do
- it 'defers the job' do
- expect(TestDeferredWorker).to receive(:perform_in).with(described_class::DELAY, *job['args'])
- expect { |b| subject.call(TestDeferredWorker.new, job, queue, &b) }.not_to yield_control
- end
- end
-
- context 'for other workers' do
- it 'runs the job normally' do
- expect { |b| subject.call(UndeferredWorker.new, job, queue, &b) }.to yield_control
- end
- end
-
- it 'increments the counter' do
- subject.call(TestDeferredWorker.new, job, queue)
-
- counter = ::Gitlab::Metrics.registry.get(:sidekiq_jobs_deferred_total)
- expect(counter.get({ worker: "TestDeferredWorker" })).to eq(1)
- end
- end
-
- context 'when sidekiq_defer_jobs feature flag is disabled' do
- before do
- stub_feature_flags("defer_sidekiq_jobs_#{TestDeferredWorker.name}": false)
- stub_feature_flags("defer_sidekiq_jobs_#{UndeferredWorker.name}": false)
- end
-
- it 'runs the job normally' do
- expect { |b| subject.call(TestDeferredWorker.new, job, queue, &b) }.to yield_control
- expect { |b| subject.call(UndeferredWorker.new, job, queue, &b) }.to yield_control
- end
- end
- end
-
- context 'with worker opted for database health check' do
- let(:health_signal_attrs) { { gitlab_schema: :gitlab_main, delay: 1.minute, tables: [:users] } }
-
- around do |example|
- with_sidekiq_server_middleware do |chain|
- chain.add described_class
- Sidekiq::Testing.inline! { example.run }
- end
- end
-
- before do
- stub_feature_flags("defer_sidekiq_jobs_#{TestDeferredWorker.name}": false)
-
- TestDeferredWorker.defer_on_database_health_signal(*health_signal_attrs.values)
- end
-
- context 'without any stop signal from database health check' do
- it 'runs the job normally' do
- expect { |b| subject.call(TestDeferredWorker.new, job, queue, &b) }.to yield_control
- end
- end
-
- context 'with stop signal from database health check' do
- before do
- stop_signal = instance_double("Gitlab::Database::HealthStatus::Signals::Stop", stop?: true)
- allow(Gitlab::Database::HealthStatus).to receive(:evaluate).and_return([stop_signal])
- end
-
- it 'defers the job by set time' do
- expect(TestDeferredWorker).to receive(:perform_in).with(health_signal_attrs[:delay], *job['args'])
-
- TestDeferredWorker.perform_async(*job['args'])
- end
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job_spec.rb b/spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job_spec.rb
index a46275d90b6..c22e7a1240f 100644
--- a/spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job_spec.rb
+++ b/spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job_spec.rb
@@ -226,6 +226,14 @@ RSpec.describe Gitlab::SidekiqMiddleware::DuplicateJobs::DuplicateJob, :clean_gi
expect(redis_ttl(cookie_key)).to be_within(1).of(expected_ttl)
end
+ it 'does not try to set an invalid ttl at the end of expiry' do
+ with_redis { |r| r.expire(cookie_key, 1) }
+
+ sleep 0.5 # sleep 500ms to redis would round the remaining ttl to 0
+
+ expect { subject }.not_to raise_error
+ end
+
context 'and low offsets' do
let(:existing_cookie) do
{
@@ -241,6 +249,24 @@ RSpec.describe Gitlab::SidekiqMiddleware::DuplicateJobs::DuplicateJob, :clean_gi
expect(cookie['offsets']).to eq({ 'c1' => 1, 'c2' => 2, 'c3' => 3 })
end
end
+
+ context 'when a WAL location is nil with existing offsets' do
+ let(:existing_cookie) do
+ {
+ 'offsets' => { 'main' => 8, 'ci' => 5 },
+ 'wal_locations' => { 'main' => 'loc1old', 'ci' => 'loc2old' }
+ }
+ end
+
+ let(:argv) { ['main', 9, 'loc1', 'ci', nil, 'loc2'] }
+
+ it 'only updates the main connection' do
+ subject
+
+ expect(cookie['wal_locations']).to eq({ 'main' => 'loc1', 'ci' => 'loc2old' })
+ expect(cookie['offsets']).to eq({ 'main' => 9, 'ci' => 5 })
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb b/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb
index f04ada688d5..bc69f232d9e 100644
--- a/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb
+++ b/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb
@@ -59,25 +59,28 @@ RSpec.describe Gitlab::SidekiqMiddleware::ServerMetrics do
described_class.initialize_process_metrics
end
- context 'when sidekiq_execution_application_slis FF is turned on' do
- it 'initializes sidekiq SLIs for the workers in the current Sidekiq process' do
+ shared_examples "initializes sidekiq SLIs for the workers in the current process" do
+ before do
allow(Gitlab::SidekiqConfig)
.to receive(:current_worker_queue_mappings)
.and_return('MergeWorker' => 'merge', 'Ci::BuildFinishedWorker' => 'default')
-
allow(completion_seconds_metric).to receive(:get)
+ end
+ it "initializes the SLIs with labels" do
expect(Gitlab::Metrics::SidekiqSlis)
- .to receive(:initialize_slis!).with([
+ .to receive(initialize_sli_method).with([
{
worker: 'MergeWorker',
urgency: 'high',
- feature_category: 'source_code_management'
+ feature_category: 'source_code_management',
+ external_dependencies: 'no'
},
{
worker: 'Ci::BuildFinishedWorker',
urgency: 'high',
- feature_category: 'continuous_integration'
+ feature_category: 'continuous_integration',
+ external_dependencies: 'no'
}
])
@@ -85,19 +88,47 @@ RSpec.describe Gitlab::SidekiqMiddleware::ServerMetrics do
end
end
- context 'when sidekiq_execution_application_slis FF is turned off' do
- before do
- stub_feature_flags(sidekiq_execution_application_slis: false)
- end
-
+ shared_examples "not initializing sidekiq SLIs" do
it 'does not initialize sidekiq SLIs' do
expect(Gitlab::Metrics::SidekiqSlis)
- .not_to receive(:initialize_slis!)
+ .not_to receive(initialize_sli_method)
described_class.initialize_process_metrics
end
end
+ context 'initializing execution SLIs' do
+ let(:initialize_sli_method) { :initialize_execution_slis! }
+
+ context 'when sidekiq_execution_application_slis FF is turned on' do
+ it_behaves_like "initializes sidekiq SLIs for the workers in the current process"
+ end
+
+ context 'when sidekiq_execution_application_slis FF is turned off' do
+ before do
+ stub_feature_flags(sidekiq_execution_application_slis: false)
+ end
+
+ it_behaves_like "not initializing sidekiq SLIs"
+ end
+ end
+
+ context 'initializing queueing SLIs' do
+ let(:initialize_sli_method) { :initialize_queueing_slis! }
+
+ context 'when sidekiq_queueing_application_slis FF is turned on' do
+ it_behaves_like "initializes sidekiq SLIs for the workers in the current process"
+ end
+
+ context 'when sidekiq_queueing_application_slis FF is turned off' do
+ before do
+ stub_feature_flags(sidekiq_queueing_application_slis: false)
+ end
+
+ it_behaves_like "not initializing sidekiq SLIs"
+ end
+ end
+
context 'when the sidekiq_job_completion_metric_initialize feature flag is disabled' do
before do
stub_feature_flags(sidekiq_job_completion_metric_initialize: false)
@@ -119,15 +150,16 @@ RSpec.describe Gitlab::SidekiqMiddleware::ServerMetrics do
described_class.initialize_process_metrics
end
- it 'does not initializes sidekiq SLIs' do
- allow(Gitlab::SidekiqConfig)
- .to receive(:current_worker_queue_mappings)
- .and_return('MergeWorker' => 'merge', 'Ci::BuildFinishedWorker' => 'default')
+ context 'sidekiq execution SLIs' do
+ let(:initialize_sli_method) { :initialize_execution_slis! }
- expect(Gitlab::Metrics::SidekiqSlis)
- .not_to receive(:initialize_slis!)
+ it_behaves_like 'not initializing sidekiq SLIs'
+ end
- described_class.initialize_process_metrics
+ context 'sidekiq queueing SLIs' do
+ let(:initialize_sli_method) { :initialize_queueing_slis! }
+
+ it_behaves_like 'not initializing sidekiq SLIs'
end
end
end
@@ -162,10 +194,19 @@ RSpec.describe Gitlab::SidekiqMiddleware::ServerMetrics do
expect(sidekiq_mem_total_bytes).to receive(:set).with(labels_with_job_status, mem_total_bytes)
expect(Gitlab::Metrics::SidekiqSlis).to receive(:record_execution_apdex).with(labels.slice(:worker,
:feature_category,
- :urgency), monotonic_time_duration)
+ :urgency,
+ :external_dependencies), monotonic_time_duration)
expect(Gitlab::Metrics::SidekiqSlis).to receive(:record_execution_error).with(labels.slice(:worker,
:feature_category,
- :urgency), false)
+ :urgency,
+ :external_dependencies), false)
+
+ if queue_duration_for_job
+ expect(Gitlab::Metrics::SidekiqSlis).to receive(:record_queueing_apdex).with(labels.slice(:worker,
+ :feature_category,
+ :urgency,
+ :external_dependencies), queue_duration_for_job)
+ end
subject.call(worker, job, :test) { nil }
end
@@ -221,7 +262,8 @@ RSpec.describe Gitlab::SidekiqMiddleware::ServerMetrics do
expect(Gitlab::Metrics::SidekiqSlis).not_to receive(:record_execution_apdex)
expect(Gitlab::Metrics::SidekiqSlis).to receive(:record_execution_error).with(labels.slice(:worker,
:feature_category,
- :urgency), true)
+ :urgency,
+ :external_dependencies), true)
expect { subject.call(worker, job, :test) { raise StandardError, "Failed" } }.to raise_error(StandardError, "Failed")
end
@@ -259,6 +301,18 @@ RSpec.describe Gitlab::SidekiqMiddleware::ServerMetrics do
subject.call(worker, job, :test) { nil }
end
end
+
+ context 'when sidekiq_queueing_application_slis FF is turned off' do
+ before do
+ stub_feature_flags(sidekiq_queueing_application_slis: false)
+ end
+
+ it 'does not call record_queueing_apdex' do
+ expect(Gitlab::Metrics::SidekiqSlis).not_to receive(:record_queueing_apdex)
+
+ subject.call(worker, job, :test) { nil }
+ end
+ end
end
end
@@ -400,7 +454,7 @@ RSpec.describe Gitlab::SidekiqMiddleware::ServerMetrics do
Gitlab::SidekiqMiddleware.server_configurator(
metrics: true,
arguments_logger: false,
- defer_jobs: false
+ skip_jobs: false
).call(chain)
Sidekiq::Testing.inline! { example.run }
diff --git a/spec/lib/gitlab/sidekiq_middleware/size_limiter/client_spec.rb b/spec/lib/gitlab/sidekiq_middleware/size_limiter/client_spec.rb
index df8e47d60f0..e1ee12e309f 100644
--- a/spec/lib/gitlab/sidekiq_middleware/size_limiter/client_spec.rb
+++ b/spec/lib/gitlab/sidekiq_middleware/size_limiter/client_spec.rb
@@ -51,7 +51,7 @@ RSpec.describe Gitlab::SidekiqMiddleware::SizeLimiter::Client, :clean_gitlab_red
context 'when the validator validates the job suscessfully' do
before do
# Do nothing
- allow(Gitlab::SidekiqMiddleware::SizeLimiter::Client).to receive(:validate!)
+ allow(described_class).to receive(:validate!)
end
it 'raises an exception when scheduling job with #perform_at' do
diff --git a/spec/lib/gitlab/sidekiq_middleware/skip_jobs_spec.rb b/spec/lib/gitlab/sidekiq_middleware/skip_jobs_spec.rb
new file mode 100644
index 00000000000..4be21591a40
--- /dev/null
+++ b/spec/lib/gitlab/sidekiq_middleware/skip_jobs_spec.rb
@@ -0,0 +1,151 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::SidekiqMiddleware::SkipJobs, feature_category: :scalability do
+ let(:job) { { 'jid' => 123, 'args' => [456] } }
+ let(:queue) { 'test_queue' }
+ let(:worker) do
+ Class.new do
+ def self.name
+ 'TestWorker'
+ end
+ include ApplicationWorker
+ end
+ end
+
+ subject { described_class.new }
+
+ before do
+ stub_const('TestWorker', worker)
+ stub_feature_flags("drop_sidekiq_jobs_#{TestWorker.name}": false)
+ end
+
+ describe '#call' do
+ context 'with worker not opted for database health check' do
+ describe "with all combinations of drop and defer FFs" do
+ using RSpec::Parameterized::TableSyntax
+
+ let(:metric) { instance_double(Prometheus::Client::Counter, increment: true) }
+
+ shared_examples 'runs the job normally' do
+ it 'yields control' do
+ expect { |b| subject.call(TestWorker.new, job, queue, &b) }.to yield_control
+ end
+
+ it 'does not increment any metric counter' do
+ expect(metric).not_to receive(:increment)
+
+ subject.call(TestWorker.new, job, queue) { nil }
+ end
+
+ it 'does not increment deferred_count' do
+ subject.call(TestWorker.new, job, queue) { nil }
+
+ expect(job).not_to include('deferred_count')
+ end
+ end
+
+ shared_examples 'drops the job' do
+ it 'does not yield control' do
+ expect { |b| subject.call(TestWorker.new, job, queue, &b) }.not_to yield_control
+ end
+
+ it 'increments counter' do
+ expect(metric).to receive(:increment).with({ worker: "TestWorker", action: "dropped" })
+
+ subject.call(TestWorker.new, job, queue) { nil }
+ end
+
+ it 'does not increment deferred_count' do
+ subject.call(TestWorker.new, job, queue) { nil }
+
+ expect(job).not_to include('deferred_count')
+ end
+
+ it 'has dropped field in job equal to true' do
+ subject.call(TestWorker.new, job, queue) { nil }
+
+ expect(job).to include({ 'dropped' => true })
+ end
+ end
+
+ shared_examples 'defers the job' do
+ it 'does not yield control' do
+ expect { |b| subject.call(TestWorker.new, job, queue, &b) }.not_to yield_control
+ end
+
+ it 'delays the job' do
+ expect(TestWorker).to receive(:perform_in).with(described_class::DELAY, *job['args'])
+
+ subject.call(TestWorker.new, job, queue) { nil }
+ end
+
+ it 'increments counter' do
+ expect(metric).to receive(:increment).with({ worker: "TestWorker", action: "deferred" })
+
+ subject.call(TestWorker.new, job, queue) { nil }
+ end
+
+ it 'has deferred related fields in job payload' do
+ subject.call(TestWorker.new, job, queue) { nil }
+
+ expect(job).to include({ 'deferred' => true, 'deferred_by' => :feature_flag, 'deferred_count' => 1 })
+ end
+ end
+
+ before do
+ stub_feature_flags("drop_sidekiq_jobs_#{TestWorker.name}": drop_ff)
+ stub_feature_flags("run_sidekiq_jobs_#{TestWorker.name}": run_ff)
+ allow(Gitlab::Metrics).to receive(:counter).and_call_original
+ allow(Gitlab::Metrics).to receive(:counter).with(described_class::COUNTER, anything).and_return(metric)
+ end
+
+ where(:drop_ff, :run_ff, :resulting_behavior) do
+ false | true | "runs the job normally"
+ true | true | "drops the job"
+ false | false | "defers the job"
+ true | false | "drops the job"
+ end
+
+ with_them do
+ it_behaves_like params[:resulting_behavior]
+ end
+ end
+ end
+
+ context 'with worker opted for database health check' do
+ let(:health_signal_attrs) { { gitlab_schema: :gitlab_main, delay: 1.minute, tables: [:users] } }
+
+ around do |example|
+ with_sidekiq_server_middleware do |chain|
+ chain.add described_class
+ Sidekiq::Testing.inline! { example.run }
+ end
+ end
+
+ before do
+ TestWorker.defer_on_database_health_signal(*health_signal_attrs.values)
+ end
+
+ context 'without any stop signal from database health check' do
+ it 'runs the job normally' do
+ expect { |b| subject.call(TestWorker.new, job, queue, &b) }.to yield_control
+ end
+ end
+
+ context 'with stop signal from database health check' do
+ before do
+ stop_signal = instance_double("Gitlab::Database::HealthStatus::Signals::Stop", stop?: true)
+ allow(Gitlab::Database::HealthStatus).to receive(:evaluate).and_return([stop_signal])
+ end
+
+ it 'defers the job by set time' do
+ expect(TestWorker).to receive(:perform_in).with(health_signal_attrs[:delay], *job['args'])
+
+ TestWorker.perform_async(*job['args'])
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/sidekiq_middleware_spec.rb b/spec/lib/gitlab/sidekiq_middleware_spec.rb
index 7e53b6598b6..5a38d1b7750 100644
--- a/spec/lib/gitlab/sidekiq_middleware_spec.rb
+++ b/spec/lib/gitlab/sidekiq_middleware_spec.rb
@@ -31,7 +31,7 @@ RSpec.describe Gitlab::SidekiqMiddleware do
shared_examples "a middleware chain" do
before do
configurator.call(chain)
- stub_feature_flags("defer_sidekiq_jobs_#{worker_class.name}": false) # not letting this worker deferring its jobs
+ stub_feature_flags("drop_sidekiq_jobs_#{worker_class.name}": false) # not dropping the job
end
it "passes through the right middlewares", :aggregate_failures do
enabled_sidekiq_middlewares.each do |middleware|
@@ -70,7 +70,7 @@ RSpec.describe Gitlab::SidekiqMiddleware do
::Gitlab::SidekiqMiddleware::WorkerContext::Server,
::Gitlab::SidekiqMiddleware::DuplicateJobs::Server,
::Gitlab::Database::LoadBalancing::SidekiqServerMiddleware,
- ::Gitlab::SidekiqMiddleware::DeferJobs
+ ::Gitlab::SidekiqMiddleware::SkipJobs
]
end
@@ -80,9 +80,7 @@ RSpec.describe Gitlab::SidekiqMiddleware do
described_class.server_configurator(
metrics: true,
arguments_logger: true,
- # defer_jobs has to be false because this middleware defers jobs from a worker based on
- # `worker` type feature flag which is enabled by default in test
- defer_jobs: false
+ skip_jobs: false
).call(chain)
Sidekiq::Testing.inline! { example.run }
@@ -115,7 +113,7 @@ RSpec.describe Gitlab::SidekiqMiddleware do
described_class.server_configurator(
metrics: false,
arguments_logger: false,
- defer_jobs: false
+ skip_jobs: false
)
end
@@ -123,7 +121,7 @@ RSpec.describe Gitlab::SidekiqMiddleware do
[
Gitlab::SidekiqMiddleware::ServerMetrics,
Gitlab::SidekiqMiddleware::ArgumentsLogger,
- Gitlab::SidekiqMiddleware::DeferJobs
+ Gitlab::SidekiqMiddleware::SkipJobs
]
end
diff --git a/spec/lib/gitlab/slash_commands/presenters/access_spec.rb b/spec/lib/gitlab/slash_commands/presenters/access_spec.rb
index 5d62e96971b..3af0ae03256 100644
--- a/spec/lib/gitlab/slash_commands/presenters/access_spec.rb
+++ b/spec/lib/gitlab/slash_commands/presenters/access_spec.rb
@@ -38,7 +38,7 @@ RSpec.describe Gitlab::SlashCommands::Presenters::Access do
it { is_expected.to be_a(Hash) }
it_behaves_like 'displays an error message' do
- let(:error_message) { 'your account has been deactivated by your administrator' }
+ let(:error_message) { "your #{Gitlab.config.gitlab.url} account needs to be reactivated" }
end
end
diff --git a/spec/lib/gitlab/spamcheck/client_spec.rb b/spec/lib/gitlab/spamcheck/client_spec.rb
index 080c2803ddd..354f25c0b01 100644
--- a/spec/lib/gitlab/spamcheck/client_spec.rb
+++ b/spec/lib/gitlab/spamcheck/client_spec.rb
@@ -107,7 +107,7 @@ RSpec.describe Gitlab::Spamcheck::Client, feature_category: :instance_resiliency
before do
allow(generic_spammable).to receive_messages(
- spammable_entity_type: 'generic',
+ to_ability_name: 'generic_spammable',
spammable_text: 'generic spam',
created_at: generic_created_at,
updated_at: generic_updated_at,
@@ -152,7 +152,7 @@ RSpec.describe Gitlab::Spamcheck::Client, feature_category: :instance_resiliency
generic_pb, _ = described_class.new.send(:build_protobuf, spammable: generic_spammable, user: user, context: cxt, extra_features: {})
expect(generic_pb.text).to eq 'generic spam'
- expect(generic_pb.type).to eq 'generic'
+ expect(generic_pb.type).to eq 'generic_spammable'
expect(generic_pb.created_at).to eq timestamp_to_protobuf_timestamp(generic_created_at)
expect(generic_pb.updated_at).to eq timestamp_to_protobuf_timestamp(generic_updated_at)
expect(generic_pb.action).to be ::Spamcheck::Action.lookup(::Spamcheck::Action::CREATE)
diff --git a/spec/lib/gitlab/ssh/commit_spec.rb b/spec/lib/gitlab/ssh/commit_spec.rb
index 77f37857c82..3b53ed9d1db 100644
--- a/spec/lib/gitlab/ssh/commit_spec.rb
+++ b/spec/lib/gitlab/ssh/commit_spec.rb
@@ -9,7 +9,8 @@ RSpec.describe Gitlab::Ssh::Commit, feature_category: :source_code_management do
let(:commit) { create(:commit, project: project) }
let(:signature_text) { 'signature_text' }
let(:signed_text) { 'signed_text' }
- let(:signature_data) { [signature_text, signed_text] }
+ let(:signer) { :SIGNER_USER }
+ let(:signature_data) { { signature: signature_text, signed_text: signed_text, signer: signer } }
let(:verifier) { instance_double('Gitlab::Ssh::Signature') }
let(:verification_status) { :verified }
@@ -27,7 +28,7 @@ RSpec.describe Gitlab::Ssh::Commit, feature_category: :source_code_management do
})
allow(Gitlab::Ssh::Signature).to receive(:new)
- .with(signature_text, signed_text, commit.committer_email)
+ .with(signature_text, signed_text, signer, commit.committer_email)
.and_return(verifier)
end
diff --git a/spec/lib/gitlab/ssh/signature_spec.rb b/spec/lib/gitlab/ssh/signature_spec.rb
index ee9b38cae7d..cb0b1ff049c 100644
--- a/spec/lib/gitlab/ssh/signature_spec.rb
+++ b/spec/lib/gitlab/ssh/signature_spec.rb
@@ -10,6 +10,7 @@ RSpec.describe Gitlab::Ssh::Signature, feature_category: :source_code_management
let_it_be_with_reload(:key) { create(:key, usage_type: :signing, key: public_key_text, user: user) }
let(:signed_text) { 'This message was signed by an ssh key' }
+ let(:signer) { :SIGNER_USER }
let(:signature_text) do
# ssh-keygen -Y sign -n git -f id_test message.txt
@@ -27,6 +28,7 @@ RSpec.describe Gitlab::Ssh::Signature, feature_category: :source_code_management
described_class.new(
signature_text,
signed_text,
+ signer,
committer_email
)
end
@@ -266,6 +268,15 @@ RSpec.describe Gitlab::Ssh::Signature, feature_category: :source_code_management
expect(signature.verification_status).to eq(:other_user)
end
end
+
+ context 'when signature created by GitLab' do
+ let(:signer) { :SIGNER_SYSTEM }
+
+ it 'reports verified_system status' do
+ expect(signature.verification_status).to eq(:verified_system)
+ expect(signature.key_fingerprint).to eq('dw7gPSvYtkCBU+BbTolbbckUEX3sL6NsGIJTQ4PYEnM')
+ end
+ end
end
describe '#key_fingerprint' do
diff --git a/spec/lib/gitlab/url_sanitizer_spec.rb b/spec/lib/gitlab/url_sanitizer_spec.rb
index c02cbef8328..5f76c1de5b1 100644
--- a/spec/lib/gitlab/url_sanitizer_spec.rb
+++ b/spec/lib/gitlab/url_sanitizer_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe Gitlab::UrlSanitizer do
describe '.sanitize' do
def sanitize_url(url)
# We want to try with multi-line content because is how error messages are formatted
- described_class.sanitize(%Q{
+ described_class.sanitize(%{
remote: Not Found
fatal: repository `#{url}` not found
})
diff --git a/spec/lib/gitlab/usage/metric_definition_spec.rb b/spec/lib/gitlab/usage/metric_definition_spec.rb
index c336a4850d2..d67bb477350 100644
--- a/spec/lib/gitlab/usage/metric_definition_spec.rb
+++ b/spec/lib/gitlab/usage/metric_definition_spec.rb
@@ -178,6 +178,45 @@ RSpec.describe Gitlab::Usage::MetricDefinition do
end
end
+ describe '#events' do
+ context 'when metric is not event based' do
+ it 'returns empty hash' do
+ expect(definition.events).to eq({})
+ end
+ end
+
+ context 'when metric is using old format' do
+ let(:attributes) { { options: { events: ['my_event'] } } }
+
+ it 'returns a correct hash' do
+ expect(definition.events).to eq({ 'my_event' => nil })
+ end
+ end
+
+ context 'when metric is using new format' do
+ let(:attributes) { { events: [{ name: 'my_event', unique: 'user_id' }] } }
+
+ it 'returns a correct hash' do
+ expect(definition.events).to eq({ 'my_event' => :user_id })
+ end
+ end
+
+ context 'when metric is using both formats' do
+ let(:attributes) do
+ {
+ options: {
+ events: ['a_event']
+ },
+ events: [{ name: 'my_event', unique: 'project_id' }]
+ }
+ end
+
+ it 'uses the new format' do
+ expect(definition.events).to eq({ 'my_event' => :project_id })
+ end
+ end
+ end
+
describe '#valid_service_ping_status?' do
context 'when metric has active status' do
it 'has to return true' do
@@ -305,4 +344,71 @@ RSpec.describe Gitlab::Usage::MetricDefinition do
is_expected.to eq([attributes, other_attributes].map(&:deep_stringify_keys).to_yaml)
end
end
+
+ describe '.metric_definitions_changed?', :freeze_time do
+ let(:metric1) { Dir.mktmpdir('metric1') }
+ let(:metric2) { Dir.mktmpdir('metric2') }
+
+ before do
+ allow(Rails).to receive_message_chain(:env, :development?).and_return(is_dev)
+ allow(described_class).to receive(:paths).and_return(
+ [
+ File.join(metric1, '**', '*.yml'),
+ File.join(metric2, '**', '*.yml')
+ ]
+ )
+
+ write_metric(metric1, path, yaml_content)
+ write_metric(metric2, path, yaml_content)
+ end
+
+ after do
+ FileUtils.rm_rf(metric1)
+ FileUtils.rm_rf(metric2)
+ end
+
+ context 'in development', :freeze_time do
+ let(:is_dev) { true }
+
+ it 'has changes on the first invocation' do
+ expect(described_class.metric_definitions_changed?).to be_truthy
+ end
+
+ context 'when no files are changed' do
+ it 'does not have changes on the second invocation' do
+ described_class.metric_definitions_changed?
+
+ expect(described_class.metric_definitions_changed?).to be_falsy
+ end
+ end
+
+ context 'when file is changed' do
+ it 'has changes on the next invocation when more than 3 seconds have passed' do
+ described_class.metric_definitions_changed?
+
+ write_metric(metric1, path, yaml_content)
+ travel_to 10.seconds.from_now
+
+ expect(described_class.metric_definitions_changed?).to be_truthy
+ end
+
+ it 'does not have changes on the next invocation when less than 3 seconds have passed' do
+ described_class.metric_definitions_changed?
+
+ write_metric(metric1, path, yaml_content)
+ travel_to 1.second.from_now
+
+ expect(described_class.metric_definitions_changed?).to be_falsy
+ end
+ end
+
+ context 'in production' do
+ let(:is_dev) { false }
+
+ it 'does not detect changes' do
+ expect(described_class.metric_definitions_changed?).to be_falsy
+ end
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/usage/metrics/aggregates/aggregate_spec.rb b/spec/lib/gitlab/usage/metrics/aggregates/aggregate_spec.rb
index 8be0769a379..c3060cd4927 100644
--- a/spec/lib/gitlab/usage/metrics/aggregates/aggregate_spec.rb
+++ b/spec/lib/gitlab/usage/metrics/aggregates/aggregate_spec.rb
@@ -28,6 +28,10 @@ RSpec.describe Gitlab::Usage::Metrics::Aggregates::Aggregate, :clean_gitlab_redi
7 | 'OR' | 'redis_hll' | :calculate_metrics_union
28 | 'OR' | 'database' | :calculate_metrics_union
7 | 'OR' | 'database' | :calculate_metrics_union
+ 28 | 'AND' | 'internal_events' | :calculate_metrics_intersections
+ 7 | 'AND' | 'internal_events' | :calculate_metrics_intersections
+ 28 | 'OR' | 'internal_events' | :calculate_metrics_union
+ 7 | 'OR' | 'internal_events' | :calculate_metrics_union
end
with_them do
@@ -152,6 +156,7 @@ RSpec.describe Gitlab::Usage::Metrics::Aggregates::Aggregate, :clean_gitlab_redi
where(:time_frame, :operator, :datasource) do
'28d' | 'OR' | 'redis_hll'
'7d' | 'OR' | 'database'
+ '28d' | 'OR' | 'internal_events'
end
with_them do
diff --git a/spec/lib/gitlab/usage/metrics/aggregates/sources/redis_hll_spec.rb b/spec/lib/gitlab/usage/metrics/aggregates/sources/redis_hll_spec.rb
index 83b155b41b1..a137a97a978 100644
--- a/spec/lib/gitlab/usage/metrics/aggregates/sources/redis_hll_spec.rb
+++ b/spec/lib/gitlab/usage/metrics/aggregates/sources/redis_hll_spec.rb
@@ -40,7 +40,7 @@ RSpec.describe Gitlab::Usage::Metrics::Aggregates::Sources::RedisHll do
.and_return(5)
end
- expect(Gitlab::Usage::Metrics::Aggregates::Sources::RedisHll).to receive(:calculate_metrics_union)
+ expect(described_class).to receive(:calculate_metrics_union)
.with(metric_names: event_names, start_date: start_date, end_date: end_date, recorded_at: recorded_at)
.and_return(2)
@@ -48,7 +48,7 @@ RSpec.describe Gitlab::Usage::Metrics::Aggregates::Sources::RedisHll do
end
it 'raises error if union is < 0' do
- allow(Gitlab::Usage::Metrics::Aggregates::Sources::RedisHll).to receive(:calculate_metrics_union).and_raise(Gitlab::Usage::Metrics::Aggregates::Sources::UnionNotAvailable)
+ allow(described_class).to receive(:calculate_metrics_union).and_raise(Gitlab::Usage::Metrics::Aggregates::Sources::UnionNotAvailable)
expect { calculate_metrics_intersections }.to raise_error(Gitlab::Usage::Metrics::Aggregates::Sources::UnionNotAvailable)
end
diff --git a/spec/lib/gitlab/usage/metrics/instrumentations/batched_background_migrations_metric_spec.rb b/spec/lib/gitlab/usage/metrics/instrumentations/batched_background_migrations_metric_spec.rb
new file mode 100644
index 00000000000..f7b15539400
--- /dev/null
+++ b/spec/lib/gitlab/usage/metrics/instrumentations/batched_background_migrations_metric_spec.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Usage::Metrics::Instrumentations::BatchedBackgroundMigrationsMetric, feature_category: :database do
+ let(:expected_value) do
+ [
+ {
+ job_class_name: 'test',
+ elapsed_time: 2.days.to_i
+ }
+ ]
+ end
+
+ let_it_be(:active_migration) { create(:batched_background_migration, :active) }
+ let_it_be(:finished_migration) do
+ create(:batched_background_migration, :finished, job_class_name: 'test', started_at: 5.days.ago,
+ finished_at: 3.days.ago)
+ end
+
+ let_it_be(:old_finished_migration) do
+ create(:batched_background_migration, :finished, job_class_name: 'old_test', started_at: 100.days.ago,
+ finished_at: 99.days.ago)
+ end
+
+ it_behaves_like 'a correct instrumented metric value', { time_frame: '7d' }
+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
index 317929f77e6..eee5396bdbf 100644
--- 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
@@ -30,8 +30,8 @@ RSpec.describe Gitlab::Usage::Metrics::Instrumentations::CountBulkImportsEntitie
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(:start) { 30.days.ago.to_fs(:db) }
+ let(:finish) { 2.days.ago.to_fs(: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}'"
@@ -63,8 +63,8 @@ RSpec.describe Gitlab::Usage::Metrics::Instrumentations::CountBulkImportsEntitie
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(:start) { 30.days.ago.to_fs(:db) }
+ let(:finish) { 2.days.ago.to_fs(: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}'"\
@@ -92,8 +92,8 @@ RSpec.describe Gitlab::Usage::Metrics::Instrumentations::CountBulkImportsEntitie
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(:start) { 30.days.ago.to_fs(:db) }
+ let(:finish) { 2.days.ago.to_fs(: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}'"\
@@ -121,8 +121,8 @@ RSpec.describe Gitlab::Usage::Metrics::Instrumentations::CountBulkImportsEntitie
context 'for 28d time frame' do
let(:expected_value) { 4 }
- let(:start) { 30.days.ago.to_s(:db) }
- let(:finish) { 2.days.ago.to_s(:db) }
+ let(:start) { 30.days.ago.to_fs(:db) }
+ let(:finish) { 2.days.ago.to_fs(: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}'"\
@@ -150,8 +150,8 @@ RSpec.describe Gitlab::Usage::Metrics::Instrumentations::CountBulkImportsEntitie
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(:start) { 30.days.ago.to_fs(:db) }
+ let(:finish) { 2.days.ago.to_fs(: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}'"\
@@ -202,8 +202,8 @@ RSpec.describe Gitlab::Usage::Metrics::Instrumentations::CountBulkImportsEntitie
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(:start) { 30.days.ago.to_fs(:db) }
+ let(:finish) { 2.days.ago.to_fs(: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}' " \
@@ -249,8 +249,8 @@ RSpec.describe Gitlab::Usage::Metrics::Instrumentations::CountBulkImportsEntitie
context 'for 28d time frame' do
context 'with project entity' do
let(:expected_value) { 2 }
- let(:start) { 30.days.ago.to_s(:db) }
- let(:finish) { 2.days.ago.to_s(:db) }
+ let(:start) { 30.days.ago.to_fs(:db) }
+ let(:finish) { 2.days.ago.to_fs(: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}' " \
@@ -265,8 +265,8 @@ RSpec.describe Gitlab::Usage::Metrics::Instrumentations::CountBulkImportsEntitie
context 'with group entity' do
let(:expected_value) { 2 }
- let(:start) { 30.days.ago.to_s(:db) }
- let(:finish) { 2.days.ago.to_s(:db) }
+ let(:start) { 30.days.ago.to_fs(:db) }
+ let(:finish) { 2.days.ago.to_fs(: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}' " \
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
index b7da9b27e19..8ae64e8db23 100644
--- 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
@@ -43,8 +43,8 @@ RSpec.describe Gitlab::Usage::Metrics::Instrumentations::CountImportedProjectsMe
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(:start) { 30.days.ago.to_fs(:db) }
+ let(:finish) { 2.days.ago.to_fs(:db) }
let(:expected_query) do
"SELECT COUNT(\"projects\".\"id\") FROM \"projects\" WHERE \"projects\".\"created_at\""\
" BETWEEN '#{start}' AND '#{finish}' AND \"projects\".\"import_type\" = 'gitea'"
@@ -70,8 +70,8 @@ RSpec.describe Gitlab::Usage::Metrics::Instrumentations::CountImportedProjectsMe
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(:start) { 30.days.ago.to_fs(:db) }
+ let(:finish) { 2.days.ago.to_fs(:db) }
let(:expected_query) do
"SELECT COUNT(\"projects\".\"id\") FROM \"projects\" WHERE \"projects\".\"created_at\""\
" BETWEEN '#{start}' AND '#{finish}' AND \"projects\".\"import_type\" = 'bitbucket'"
diff --git a/spec/lib/gitlab/usage/metrics/instrumentations/count_imported_projects_total_metric_spec.rb b/spec/lib/gitlab/usage/metrics/instrumentations/count_imported_projects_total_metric_spec.rb
index bfc4240def6..bd432b614e7 100644
--- a/spec/lib/gitlab/usage/metrics/instrumentations/count_imported_projects_total_metric_spec.rb
+++ b/spec/lib/gitlab/usage/metrics/instrumentations/count_imported_projects_total_metric_spec.rb
@@ -45,8 +45,8 @@ RSpec.describe Gitlab::Usage::Metrics::Instrumentations::CountImportedProjectsTo
context 'for 28d time frame' do
let(:expected_value) { 8 }
- let(:start) { 30.days.ago.to_s(:db) }
- let(:finish) { 2.days.ago.to_s(:db) }
+ let(:start) { 30.days.ago.to_fs(:db) }
+ let(:finish) { 2.days.ago.to_fs(:db) }
let(:expected_query) do
"SELECT (SELECT COUNT(\"projects\".\"id\") FROM \"projects\" WHERE \"projects\".\"import_type\""\
" IN ('gitlab_project', 'gitlab', 'github', 'bitbucket', 'bitbucket_server', 'gitea', 'git', 'manifest',"\
diff --git a/spec/lib/gitlab/usage/metrics/instrumentations/count_projects_with_jira_dvcs_integration_metric_spec.rb b/spec/lib/gitlab/usage/metrics/instrumentations/count_projects_with_jira_dvcs_integration_metric_spec.rb
new file mode 100644
index 00000000000..a2d86fc5044
--- /dev/null
+++ b/spec/lib/gitlab/usage/metrics/instrumentations/count_projects_with_jira_dvcs_integration_metric_spec.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Usage::Metrics::Instrumentations::CountProjectsWithJiraDvcsIntegrationMetric,
+ feature_category: :integrations do
+ describe 'metric value and query' do
+ let_it_be_with_reload(:project_1) { create(:project) }
+ let_it_be_with_reload(:project_2) { create(:project) }
+ let_it_be_with_reload(:project_3) { create(:project) }
+
+ before do
+ project_1.feature_usage.log_jira_dvcs_integration_usage(cloud: false)
+ project_2.feature_usage.log_jira_dvcs_integration_usage(cloud: false)
+ project_3.feature_usage.log_jira_dvcs_integration_usage(cloud: true)
+ end
+
+ context 'when counting cloud integrations' do
+ let(:expected_value) { 1 }
+ let(:expected_query) do
+ 'SELECT COUNT("project_feature_usages"."project_id") FROM "project_feature_usages" ' \
+ 'WHERE "project_feature_usages"."jira_dvcs_cloud_last_sync_at" IS NOT NULL'
+ end
+
+ it_behaves_like 'a correct instrumented metric value and query', { time_frame: 'all', options: { cloud: true } }
+ end
+
+ context 'when counting non-cloud integrations' do
+ let(:expected_value) { 2 }
+ let(:expected_query) do
+ 'SELECT COUNT("project_feature_usages"."project_id") FROM "project_feature_usages" ' \
+ 'WHERE "project_feature_usages"."jira_dvcs_server_last_sync_at" IS NOT NULL'
+ end
+
+ it_behaves_like 'a correct instrumented metric value and query', { time_frame: 'all', options: { cloud: false } }
+ end
+ end
+
+ it "raises an exception if option is not present" do
+ expect do
+ described_class.new(options: {}, time_frame: 'all')
+ end.to raise_error(ArgumentError, %r{must be a boolean})
+ end
+
+ it "raises an exception if option has invalid value" do
+ expect do
+ described_class.new(options: { cloud: 'yes' }, time_frame: 'all')
+ end.to raise_error(ArgumentError, %r{must be a boolean})
+ end
+end
diff --git a/spec/lib/gitlab/usage/metrics/instrumentations/count_slack_app_installations_gbp_metric_spec.rb b/spec/lib/gitlab/usage/metrics/instrumentations/count_slack_app_installations_gbp_metric_spec.rb
new file mode 100644
index 00000000000..aa14ffed25b
--- /dev/null
+++ b/spec/lib/gitlab/usage/metrics/instrumentations/count_slack_app_installations_gbp_metric_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Usage::Metrics::Instrumentations::CountSlackAppInstallationsGbpMetric, feature_category: :integrations do
+ let_it_be(:slack_integration) { create(:slack_integration) }
+ let_it_be(:slack_integration_legacy) { create(:slack_integration, :legacy) }
+
+ let(:expected_value) { 1 }
+ let(:expected_query) do
+ 'SELECT COUNT("slack_integrations"."id") FROM "slack_integrations" ' \
+ 'WHERE "slack_integrations"."bot_user_id" IS NOT NULL'
+ end
+
+ it_behaves_like 'a correct instrumented metric value and query', { time_frame: 'all' }
+end
diff --git a/spec/lib/gitlab/usage/metrics/instrumentations/count_slack_app_installations_metric_spec.rb b/spec/lib/gitlab/usage/metrics/instrumentations/count_slack_app_installations_metric_spec.rb
new file mode 100644
index 00000000000..cfbecdad468
--- /dev/null
+++ b/spec/lib/gitlab/usage/metrics/instrumentations/count_slack_app_installations_metric_spec.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Usage::Metrics::Instrumentations::CountSlackAppInstallationsMetric, feature_category: :integrations do
+ let_it_be(:slack_integration) { create(:slack_integration) }
+ let_it_be(:slack_integration_legacy) { create(:slack_integration, :legacy) }
+
+ let(:expected_value) { 2 }
+ let(:expected_query) { 'SELECT COUNT("slack_integrations"."id") FROM "slack_integrations"' }
+
+ it_behaves_like 'a correct instrumented metric value and query', { time_frame: 'all' }
+end
diff --git a/spec/lib/gitlab/usage/metrics/instrumentations/count_users_creating_issues_metric_spec.rb b/spec/lib/gitlab/usage/metrics/instrumentations/count_users_creating_issues_metric_spec.rb
index 3fb4c3a4e3f..86aa37b494a 100644
--- a/spec/lib/gitlab/usage/metrics/instrumentations/count_users_creating_issues_metric_spec.rb
+++ b/spec/lib/gitlab/usage/metrics/instrumentations/count_users_creating_issues_metric_spec.rb
@@ -16,8 +16,8 @@ RSpec.describe Gitlab::Usage::Metrics::Instrumentations::CountUsersCreatingIssue
context 'for 28d time frame' do
let(:expected_value) { 1 }
- let(:start) { 30.days.ago.to_s(:db) }
- let(:finish) { 2.days.ago.to_s(:db) }
+ let(:start) { 30.days.ago.to_fs(:db) }
+ let(:finish) { 2.days.ago.to_fs(:db) }
let(:expected_query) { "SELECT COUNT(DISTINCT \"issues\".\"author_id\") FROM \"issues\" WHERE \"issues\".\"created_at\" BETWEEN '#{start}' AND '#{finish}'" }
it_behaves_like 'a correct instrumented metric value and query', { time_frame: '28d' }
diff --git a/spec/lib/gitlab/usage/metrics/instrumentations/gitaly_apdex_metric_spec.rb b/spec/lib/gitlab/usage/metrics/instrumentations/gitaly_apdex_metric_spec.rb
new file mode 100644
index 00000000000..fc1e546ef8b
--- /dev/null
+++ b/spec/lib/gitlab/usage/metrics/instrumentations/gitaly_apdex_metric_spec.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Usage::Metrics::Instrumentations::GitalyApdexMetric, feature_category: :service_ping do
+ let(:prometheus_client) { instance_double(Gitlab::PrometheusClient) }
+ let(:metric) { described_class.new(time_frame: 'none') }
+
+ before do
+ allow(prometheus_client).to receive(:query)
+ .with(/gitlab_usage_ping:gitaly_apdex:ratio_avg_over_time_5m/)
+ .and_return(
+ [
+ { 'metric' => {},
+ 'value' => [1616016381.473, '0.95'] }
+ ])
+ # rubocop:disable RSpec/AnyInstanceOf
+ allow_any_instance_of(Gitlab::Utils::UsageData).to receive(:with_prometheus_client).and_yield(prometheus_client)
+ # rubocop:enable RSpec/AnyInstanceOf
+ end
+
+ it 'gathers gitaly apdex', :aggregate_failures do
+ expect(metric.value).to be_within(0.001).of(0.95)
+ end
+end
diff --git a/spec/lib/gitlab/usage/metrics/instrumentations/index_inconsistencies_metric_spec.rb b/spec/lib/gitlab/usage/metrics/instrumentations/index_inconsistencies_metric_spec.rb
index 92a576d1a9f..d8c5204d3d8 100644
--- a/spec/lib/gitlab/usage/metrics/instrumentations/index_inconsistencies_metric_spec.rb
+++ b/spec/lib/gitlab/usage/metrics/instrumentations/index_inconsistencies_metric_spec.rb
@@ -12,8 +12,8 @@ RSpec.describe Gitlab::Usage::Metrics::Instrumentations::IndexInconsistenciesMet
]
end
- let(:runner) { instance_double(Gitlab::Database::SchemaValidation::Runner, execute: inconsistencies) }
- let(:inconsistency_class) { Gitlab::Database::SchemaValidation::Inconsistency }
+ let(:runner) { instance_double(Gitlab::Schema::Validation::Runner, execute: inconsistencies) }
+ let(:inconsistency_class) { Gitlab::Schema::Validation::Inconsistency }
let(:inconsistencies) do
[
@@ -24,7 +24,7 @@ RSpec.describe Gitlab::Usage::Metrics::Instrumentations::IndexInconsistenciesMet
end
before do
- allow(Gitlab::Database::SchemaValidation::Runner).to receive(:new).and_return(runner)
+ allow(Gitlab::Schema::Validation::Runner).to receive(:new).and_return(runner)
end
end
end
diff --git a/spec/lib/gitlab/usage/metrics/instrumentations/ldap_encrypted_secrets_metric_spec.rb b/spec/lib/gitlab/usage/metrics/instrumentations/ldap_encrypted_secrets_metric_spec.rb
new file mode 100644
index 00000000000..1775304ad87
--- /dev/null
+++ b/spec/lib/gitlab/usage/metrics/instrumentations/ldap_encrypted_secrets_metric_spec.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Usage::Metrics::Instrumentations::LdapEncryptedSecretsMetric, feature_category: :service_ping do
+ using RSpec::Parameterized::TableSyntax
+
+ let(:encrypted_config) { instance_double(Gitlab::EncryptedConfiguration) }
+
+ where(:ldap_encrypted_secrets_enabled, :expected_value) do
+ true | true
+ false | false
+ end
+
+ with_them do
+ before do
+ allow(Gitlab::Auth::Ldap::Config).to receive(:encrypted_secrets).and_return(encrypted_config)
+ allow(encrypted_config).to receive(:active?).and_return(ldap_encrypted_secrets_enabled)
+ end
+
+ it_behaves_like 'a correct instrumented metric value', { time_frame: 'none' }
+ end
+end
diff --git a/spec/lib/gitlab/usage/metrics/instrumentations/operating_system_metric_spec.rb b/spec/lib/gitlab/usage/metrics/instrumentations/operating_system_metric_spec.rb
new file mode 100644
index 00000000000..26f4cfd252e
--- /dev/null
+++ b/spec/lib/gitlab/usage/metrics/instrumentations/operating_system_metric_spec.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Usage::Metrics::Instrumentations::OperatingSystemMetric, feature_category: :service_ping do
+ let(:ohai_data) { { "platform" => "ubuntu", "platform_version" => "20.04" } }
+ let(:expected_value) { 'ubuntu-20.04' }
+
+ before do
+ allow_next_instance_of(Ohai::System) do |ohai|
+ allow(ohai).to receive(:data).and_return(ohai_data)
+ end
+ end
+
+ it_behaves_like 'a correct instrumented metric value', { time_frame: 'none' }
+
+ context 'when on Debian with armv architecture' do
+ let(:ohai_data) { { "platform" => "debian", "platform_version" => "10", 'kernel' => { 'machine' => 'armv' } } }
+ let(:expected_value) { 'raspbian-10' }
+
+ it_behaves_like 'a correct instrumented metric value', { time_frame: 'none' }
+ end
+end
diff --git a/spec/lib/gitlab/usage/metrics/instrumentations/schema_inconsistencies_metric_spec.rb b/spec/lib/gitlab/usage/metrics/instrumentations/schema_inconsistencies_metric_spec.rb
new file mode 100644
index 00000000000..603e68991cc
--- /dev/null
+++ b/spec/lib/gitlab/usage/metrics/instrumentations/schema_inconsistencies_metric_spec.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Usage::Metrics::Instrumentations::SchemaInconsistenciesMetric, feature_category: :database do
+ before do
+ allow(Gitlab::Schema::Validation::Runner).to receive(:new).and_return(runner)
+ end
+
+ let(:runner) { instance_double(Gitlab::Schema::Validation::Runner, execute: inconsistencies) }
+ let(:inconsistency_class) { Gitlab::Schema::Validation::Inconsistency }
+
+ let(:inconsistencies) do
+ [
+ instance_double(inconsistency_class, object_name: 'index_name_1', type: 'wrong_indexes', object_type: 'index'),
+ instance_double(inconsistency_class, object_name: 'index_name_2', type: 'missing_indexes',
+ object_type: 'index'),
+ instance_double(inconsistency_class, object_name: 'index_name_3', type: 'extra_indexes', object_type: 'index')
+ ]
+ end
+
+ it_behaves_like 'a correct instrumented metric value', { time_frame: 'all' } do
+ let(:expected_value) do
+ [
+ { inconsistency_type: 'wrong_indexes', object_name: 'index_name_1', object_type: 'index' },
+ { inconsistency_type: 'missing_indexes', object_name: 'index_name_2', object_type: 'index' },
+ { inconsistency_type: 'extra_indexes', object_name: 'index_name_3', object_type: 'index' }
+ ]
+ end
+ end
+
+ context 'when the max number of inconsistencies is exceeded' do
+ before do
+ stub_const('Gitlab::Usage::Metrics::Instrumentations::SchemaInconsistenciesMetric::MAX_INCONSISTENCIES', 1)
+ end
+
+ it_behaves_like 'a correct instrumented metric value', { time_frame: 'all' } do
+ let(:expected_value) do
+ [{ inconsistency_type: 'wrong_indexes', object_name: 'index_name_1', object_type: 'index' }]
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/usage/metrics/instrumentations/smtp_encrypted_secrets_metric_spec.rb b/spec/lib/gitlab/usage/metrics/instrumentations/smtp_encrypted_secrets_metric_spec.rb
new file mode 100644
index 00000000000..cf9cec8118f
--- /dev/null
+++ b/spec/lib/gitlab/usage/metrics/instrumentations/smtp_encrypted_secrets_metric_spec.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Usage::Metrics::Instrumentations::SmtpEncryptedSecretsMetric, feature_category: :service_ping do
+ using RSpec::Parameterized::TableSyntax
+
+ let(:encrypted_config) { instance_double(Gitlab::EncryptedConfiguration) }
+
+ where(:smtp_encrypted_secrets_enabled, :expected_value) do
+ true | true
+ false | false
+ end
+
+ with_them do
+ before do
+ allow(Gitlab::Email::SmtpConfig).to receive(:encrypted_secrets).and_return(encrypted_config)
+ allow(encrypted_config).to receive(:active?).and_return(smtp_encrypted_secrets_enabled)
+ end
+
+ it_behaves_like 'a correct instrumented metric value', { time_frame: 'none' }
+ end
+end
diff --git a/spec/lib/gitlab/usage/metrics/names_suggestions/generator_spec.rb b/spec/lib/gitlab/usage/metrics/names_suggestions/generator_spec.rb
index 5002ee7599f..884d73a70f3 100644
--- a/spec/lib/gitlab/usage/metrics/names_suggestions/generator_spec.rb
+++ b/spec/lib/gitlab/usage/metrics/names_suggestions/generator_spec.rb
@@ -88,8 +88,8 @@ RSpec.describe Gitlab::Usage::Metrics::NamesSuggestions::Generator, feature_cate
context 'for alt_usage_data metrics' do
it_behaves_like 'name suggestion' do
- # corresponding metric is collected with alt_usage_data(fallback: nil) { operating_system }
- let(:key_path) { 'settings.operating_system' }
+ # corresponding metric is collected with alt_usage_data { ApplicationRecord.database.version }
+ let(:key_path) { 'database.version' }
let(:name_suggestion) { /<please fill metric name>/ }
end
end
diff --git a/spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb b/spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb
index 50fb9f9df6e..fc1d66d1d62 100644
--- a/spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb
+++ b/spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb
@@ -18,28 +18,71 @@ RSpec.describe Gitlab::UsageDataCounters::HLLRedisCounter, :clean_gitlab_redis_s
# depending on which day of the week test is run.
# Monday 6th of June
described_class.clear_memoization(:known_events)
+ described_class.clear_memoization(:known_events_names)
reference_time = Time.utc(2020, 6, 1)
travel_to(reference_time) { example.run }
described_class.clear_memoization(:known_events)
+ described_class.clear_memoization(:known_events_names)
end
describe '.known_events' do
- let(:ce_temp_dir) { Dir.mktmpdir }
- let(:ce_temp_file) { Tempfile.new(%w[common .yml], ce_temp_dir) }
let(:ce_event) { { "name" => "ce_event" } }
- before do
- stub_const("#{described_class}::KNOWN_EVENTS_PATH", File.expand_path('*.yml', ce_temp_dir))
- File.open(ce_temp_file.path, "w+b") { |f| f.write [ce_event].to_yaml }
- end
+ context 'with use_metric_definitions_for_events_list disabled' do
+ let(:ce_temp_dir) { Dir.mktmpdir }
+ let(:ce_temp_file) { Tempfile.new(%w[common .yml], ce_temp_dir) }
+
+ before do
+ stub_feature_flags(use_metric_definitions_for_events_list: false)
+ stub_const("#{described_class}::KNOWN_EVENTS_PATH", File.expand_path('*.yml', ce_temp_dir))
+ File.open(ce_temp_file.path, "w+b") { |f| f.write [ce_event].to_yaml }
+ end
- after do
- ce_temp_file.unlink
- FileUtils.remove_entry(ce_temp_dir) if Dir.exist?(ce_temp_dir)
+ after do
+ ce_temp_file.unlink
+ FileUtils.remove_entry(ce_temp_dir) if Dir.exist?(ce_temp_dir)
+ end
+
+ it 'returns ce events' do
+ expect(described_class.known_events).to include(ce_event)
+ end
end
- it 'returns ce events' do
- expect(described_class.known_events).to include(ce_event)
+ context 'with use_metric_definitions_for_events_list enabled' do
+ let(:removed_ce_event) { { "name" => "removed_ce_event" } }
+ let(:metric_definition) do
+ Gitlab::Usage::MetricDefinition.new('ce_metric',
+ {
+ key_path: 'ce_metric_weekly',
+ status: 'active',
+ options: {
+ events: [ce_event['name']]
+ }
+ })
+ end
+
+ let(:removed_metric_definition) do
+ Gitlab::Usage::MetricDefinition.new('removed_ce_metric',
+ {
+ key_path: 'removed_ce_metric_weekly',
+ status: 'removed',
+ options: {
+ events: [removed_ce_event['name']]
+ }
+ })
+ end
+
+ before do
+ allow(Gitlab::Usage::MetricDefinition).to receive(:all).and_return([metric_definition, removed_metric_definition])
+ end
+
+ it 'returns ce events' do
+ expect(described_class.known_events).to include(ce_event)
+ end
+
+ it 'does not return removed events' do
+ expect(described_class.known_events).not_to include(removed_ce_event)
+ end
end
end
diff --git a/spec/lib/gitlab/usage_data_counters/issue_activity_unique_counter_spec.rb b/spec/lib/gitlab/usage_data_counters/issue_activity_unique_counter_spec.rb
index ba83d979cad..50e20e4fbcf 100644
--- a/spec/lib/gitlab/usage_data_counters/issue_activity_unique_counter_spec.rb
+++ b/spec/lib/gitlab/usage_data_counters/issue_activity_unique_counter_spec.rb
@@ -66,7 +66,7 @@ RSpec.describe Gitlab::UsageDataCounters::IssueActivityUniqueCounter, :clean_git
end
context 'for Issue created actions' do
- it_behaves_like 'tracked issuable snowplow and service ping events with project' do
+ it_behaves_like 'tracked issuable internal event with project' do
let(:action) { described_class::ISSUE_CREATED }
let(:original_params) { { namespace: project.project_namespace.reload } }
diff --git a/spec/lib/gitlab/usage_data_counters/kubernetes_agent_counter_spec.rb b/spec/lib/gitlab/usage_data_counters/kubernetes_agent_counter_spec.rb
index 42855271e22..9562f1c5500 100644
--- a/spec/lib/gitlab/usage_data_counters/kubernetes_agent_counter_spec.rb
+++ b/spec/lib/gitlab/usage_data_counters/kubernetes_agent_counter_spec.rb
@@ -13,7 +13,9 @@ RSpec.describe Gitlab::UsageDataCounters::KubernetesAgentCounter do
{
'gitops_sync' => 1,
'k8s_api_proxy_request' => 2,
- 'flux_git_push_notifications_total' => 3
+ 'flux_git_push_notifications_total' => 3,
+ 'k8s_api_proxy_requests_via_ci_access' => 4,
+ 'k8s_api_proxy_requests_via_user_access' => 5
}
end
@@ -27,7 +29,10 @@ RSpec.describe Gitlab::UsageDataCounters::KubernetesAgentCounter do
expect(described_class.totals).to eq(
kubernetes_agent_gitops_sync: 3,
kubernetes_agent_k8s_api_proxy_request: 6,
- kubernetes_agent_flux_git_push_notifications_total: 9)
+ kubernetes_agent_flux_git_push_notifications_total: 9,
+ kubernetes_agent_k8s_api_proxy_requests_via_ci_access: 12,
+ kubernetes_agent_k8s_api_proxy_requests_via_user_access: 15
+ )
end
context 'with empty events' do
diff --git a/spec/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter_spec.rb b/spec/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter_spec.rb
index 25c57aa00c6..53eee62b386 100644
--- a/spec/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter_spec.rb
+++ b/spec/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter_spec.rb
@@ -54,11 +54,6 @@ RSpec.describe Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter, :cl
let(:merge_request) { create(:merge_request) }
let(:target_project) { merge_request.target_project }
- let(:fake_tracker) { instance_spy(Gitlab::Tracking::Destinations::Snowplow) }
-
- before do
- allow(Gitlab::Tracking).to receive(:tracker).and_return(fake_tracker)
- end
it_behaves_like 'a tracked merge request unique event' do
let(:action) { described_class::MR_USER_CREATE_ACTION }
@@ -68,36 +63,10 @@ RSpec.describe Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter, :cl
let(:action) { described_class::MR_CREATE_ACTION }
end
- it 'logs to Snowplow', :aggregate_failures do
- # This logic should be extracted to shared_examples
- namespace = target_project.namespace
-
- expect(Gitlab::Tracking::StandardContext)
- .to receive(:new)
- .with(
- project_id: target_project.id,
- user_id: user.id,
- namespace_id: namespace.id,
- plan_name: namespace.actual_plan_name
- )
- .and_call_original
-
- expect(Gitlab::Tracking::ServicePingContext)
- .to receive(:new)
- .with(data_source: :redis_hll, event: described_class::MR_USER_CREATE_ACTION)
- .and_call_original
-
- expect(fake_tracker).to receive(:event)
- .with(
- 'InternalEventTracking',
- described_class::MR_USER_CREATE_ACTION,
- context: [
- an_instance_of(SnowplowTracker::SelfDescribingJson),
- an_instance_of(SnowplowTracker::SelfDescribingJson)
- ]
- )
- .exactly(:once)
- subject
+ it_behaves_like 'internal event tracking' do
+ let(:action) { described_class::MR_USER_CREATE_ACTION }
+ let(:project) { target_project }
+ let(:namespace) { project.namespace }
end
end
diff --git a/spec/lib/gitlab/usage_data_metrics_spec.rb b/spec/lib/gitlab/usage_data_metrics_spec.rb
index 1f52819fd9e..06e85a34ec9 100644
--- a/spec/lib/gitlab/usage_data_metrics_spec.rb
+++ b/spec/lib/gitlab/usage_data_metrics_spec.rb
@@ -55,7 +55,11 @@ RSpec.describe Gitlab::UsageDataMetrics, :with_license, feature_category: :servi
let(:metric_files_key_paths) do
Gitlab::Usage::MetricDefinition
.definitions
- .select { |k, v| v.attributes[:data_source] == 'redis_hll' && v.key_path.starts_with?('redis_hll_counters') && v.available? }
+ .select do |_, v|
+ (v.data_source == 'redis_hll' || v.data_source == 'internal_events') &&
+ v.key_path.starts_with?('redis_hll_counters') &&
+ v.available?
+ end
.keys
.sort
end
diff --git a/spec/lib/gitlab/usage_data_spec.rb b/spec/lib/gitlab/usage_data_spec.rb
index 9df869f8801..94c4544f754 100644
--- a/spec/lib/gitlab/usage_data_spec.rb
+++ b/spec/lib/gitlab/usage_data_spec.rb
@@ -20,7 +20,6 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures, feature_category: :servic
is_expected.to include(:counts_monthly)
is_expected.to include(:counts_weekly)
is_expected.to include(:license)
- is_expected.to include(:settings)
# usage_activity_by_stage data
is_expected.to include(:usage_activity_by_stage)
@@ -98,6 +97,7 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures, feature_category: :servic
it 'includes accurate usage_activity_by_stage data' do
for_defined_days_back do
user = create(:user)
+ project = create(:project, creator: user)
create(:cluster, user: user)
create(:cluster, :disabled, user: user)
create(:cluster_provider_gcp, :created)
@@ -108,6 +108,9 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures, feature_category: :servic
create(:cluster, :instance, :disabled, :production_environment)
create(:cluster, :instance, :production_environment)
create(:cluster, :management_project)
+ create(:integrations_slack, project: project)
+ create(:slack_slash_commands_integration, project: project)
+ create(:prometheus_integration, project: project)
end
expect(described_class.usage_activity_by_stage_configure({})).to include(
@@ -122,7 +125,9 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures, feature_category: :servic
group_clusters_disabled: 2,
group_clusters_enabled: 2,
project_clusters_disabled: 2,
- project_clusters_enabled: 10
+ project_clusters_enabled: 10,
+ projects_slack_notifications_active: 2,
+ projects_slack_slash_active: 2
)
expect(described_class.usage_activity_by_stage_configure(described_class.monthly_time_range_db_params)).to include(
clusters_management_project: 1,
@@ -136,7 +141,9 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures, feature_category: :servic
group_clusters_disabled: 1,
group_clusters_enabled: 1,
project_clusters_disabled: 1,
- project_clusters_enabled: 5
+ project_clusters_enabled: 5,
+ projects_slack_notifications_active: 1,
+ projects_slack_slash_active: 1
)
end
end
@@ -804,7 +811,6 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures, feature_category: :servic
let(:project) { create(:project) }
let(:description_with_embed) { "Some comment\n\nhttps://grafana.example.com/d/xvAk4q0Wk/go-processes?orgId=1&from=1573238522762&to=1573240322762&var-job=prometheus&var-interval=10m&panelId=1&fullscreen" }
let(:description_with_unintegrated_embed) { "Some comment\n\nhttps://grafana.exp.com/d/xvAk4q0Wk/go-processes?orgId=1&from=1573238522762&to=1573240322762&var-job=prometheus&var-interval=10m&panelId=1&fullscreen" }
- let(:description_with_non_grafana_inline_metric) { "Some comment\n\n#{Gitlab::Routing.url_helpers.metrics_namespace_project_environment_url(*['foo', 'bar', 12])}" }
shared_examples "zero count" do
it "does not count the issue" do
@@ -824,7 +830,6 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures, feature_category: :servic
create(:issue, project: project, description: description_with_embed)
# In-Valid
create(:issue, project: project, description: description_with_unintegrated_embed)
- create(:issue, project: project, description: description_with_non_grafana_inline_metric)
create(:issue, project: project, description: nil)
create(:issue, project: project, description: '')
create(:issue, project: project)
@@ -862,97 +867,6 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures, feature_category: :servic
end
end
end
-
- describe ".operating_system" do
- let(:ohai_data) { { "platform" => "ubuntu", "platform_version" => "20.04" } }
-
- before do
- allow_next_instance_of(Ohai::System) do |ohai|
- allow(ohai).to receive(:data).and_return(ohai_data)
- end
- end
-
- subject { described_class.operating_system }
-
- it { is_expected.to eq("ubuntu-20.04") }
-
- context 'when on Debian with armv architecture' do
- let(:ohai_data) { { "platform" => "debian", "platform_version" => "10", 'kernel' => { 'machine' => 'armv' } } }
-
- it { is_expected.to eq("raspbian-10") }
- end
- end
-
- describe ".system_usage_data_settings" do
- let(:prometheus_client) { double(Gitlab::PrometheusClient) }
- let(:snowplow_gitlab_host?) { Gitlab::CurrentSettings.snowplow_collector_hostname == 'snowplow.trx.gitlab.net' }
-
- before do
- allow(described_class).to receive(:operating_system).and_return('ubuntu-20.04')
- expect(prometheus_client).to receive(:query)
- .with(/gitlab_usage_ping:gitaly_apdex:ratio_avg_over_time_5m/)
- .and_return(
- [
- { 'metric' => {},
- 'value' => [1616016381.473, '0.95'] }
- ])
- expect(described_class).to receive(:with_prometheus_client).and_yield(prometheus_client)
- end
-
- subject { described_class.system_usage_data_settings }
-
- it 'gathers encrypted secrets usage data', :aggregate_failures do
- expect(subject[:settings][:ldap_encrypted_secrets_enabled]).to eq(Gitlab::Auth::Ldap::Config.encrypted_secrets.active?)
- expect(subject[:settings][:smtp_encrypted_secrets_enabled]).to eq(Gitlab::Email::SmtpConfig.encrypted_secrets.active?)
- end
-
- it 'populates operating system information' do
- expect(subject[:settings][:operating_system]).to eq('ubuntu-20.04')
- end
-
- it 'gathers gitaly apdex', :aggregate_failures do
- expect(subject[:settings][:gitaly_apdex]).to be_within(0.001).of(0.95)
- end
-
- it 'reports collected data categories' do
- expected_value = %w[standard subscription operational optional]
-
- allow_next_instance_of(ServicePing::PermitDataCategories) do |instance|
- expect(instance).to receive(:execute).and_return(expected_value)
- end
-
- expect(subject[:settings][:collected_data_categories]).to eq(expected_value)
- end
-
- it 'gathers service_ping_features_enabled' do
- expect(subject[:settings][:service_ping_features_enabled]).to eq(Gitlab::CurrentSettings.usage_ping_features_enabled)
- end
-
- it 'gathers user_cap_feature_enabled' do
- expect(subject[:settings][:user_cap_feature_enabled]).to eq(Gitlab::CurrentSettings.new_user_signups_cap)
- end
-
- it 'reports status of the certificate_based_clusters feature flag as true' do
- expect(subject[:settings][:certificate_based_clusters_ff]).to eq(true)
- end
-
- context 'with certificate_based_clusters disabled' do
- before do
- stub_feature_flags(certificate_based_clusters: false)
- end
-
- it 'reports status of the certificate_based_clusters feature flag as false' do
- expect(subject[:settings][:certificate_based_clusters_ff]).to eq(false)
- end
- end
-
- context 'snowplow stats' do
- it 'gathers snowplow stats' do
- expect(subject[:settings][:snowplow_enabled]).to eq(Gitlab::CurrentSettings.snowplow_enabled?)
- expect(subject[:settings][:snowplow_configured_to_gitlab_collector]).to eq(snowplow_gitlab_host?)
- end
- end
- end
end
def for_defined_days_back(days: [31, 3])
diff --git a/spec/lib/gitlab/utils/measuring_spec.rb b/spec/lib/gitlab/utils/measuring_spec.rb
index 4d2791f771f..da5ef7e08a7 100644
--- a/spec/lib/gitlab/utils/measuring_spec.rb
+++ b/spec/lib/gitlab/utils/measuring_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe Gitlab::Utils::Measuring do
let(:result) { "result" }
before do
- allow(ActiveSupport::Logger).to receive(:logger_outputs_to?).with(Gitlab::Utils::Measuring.logger, $stdout).and_return(false)
+ allow(ActiveSupport::Logger).to receive(:logger_outputs_to?).with(described_class.logger, $stdout).and_return(false)
end
let(:measurement) { described_class.new(base_log_data) }
diff --git a/spec/lib/gitlab/utils/strong_memoize_spec.rb b/spec/lib/gitlab/utils/strong_memoize_spec.rb
deleted file mode 100644
index ea8083e7d7f..00000000000
--- a/spec/lib/gitlab/utils/strong_memoize_spec.rb
+++ /dev/null
@@ -1,374 +0,0 @@
-# frozen_string_literal: true
-
-require 'fast_spec_helper'
-require 'rspec-benchmark'
-require 'rspec-parameterized'
-require 'active_support/testing/time_helpers'
-
-RSpec.configure do |config|
- config.include RSpec::Benchmark::Matchers
-end
-
-RSpec.describe Gitlab::Utils::StrongMemoize, feature_category: :shared do
- include ActiveSupport::Testing::TimeHelpers
-
- let(:klass) do
- strong_memoize_class = described_class
-
- Struct.new(:value) do
- include strong_memoize_class
-
- def self.method_added_list
- @method_added_list ||= []
- end
-
- def self.method_added(name)
- method_added_list << name
- end
-
- def method_name
- strong_memoize(:method_name) do # rubocop: disable Gitlab/StrongMemoizeAttr
- trace << value
- value
- end
- end
-
- def method_name_with_expiration
- strong_memoize_with_expiration(:method_name_with_expiration, 1) do
- trace << value
- value
- end
- end
-
- def method_name_attr
- trace << value
- value
- end
- strong_memoize_attr :method_name_attr
-
- def enabled?
- trace << value
- value
- end
- strong_memoize_attr :enabled?
-
- def method_name_with_args(*args)
- strong_memoize_with(:method_name_with_args, args) do
- trace << [value, args]
- value
- end
- end
-
- def trace
- @trace ||= []
- end
-
- protected
-
- def private_method; end
- private :private_method
- strong_memoize_attr :private_method
-
- public
-
- def protected_method; end
- protected :protected_method
- strong_memoize_attr :protected_method
-
- private
-
- def public_method; end
- public :public_method
- strong_memoize_attr :public_method
- end
- end
-
- subject(:object) { klass.new(value) }
-
- shared_examples 'caching the value' do
- let(:member_name) { described_class.normalize_key(method_name) }
-
- it 'only calls the block once' do
- value0 = object.send(method_name)
- value1 = object.send(method_name)
-
- expect(value0).to eq(value)
- expect(value1).to eq(value)
- expect(object.trace).to contain_exactly(value)
- end
-
- it 'returns and defines the instance variable for the exact value' do
- returned_value = object.send(method_name)
- memoized_value = object.instance_variable_get(:"@#{member_name}")
-
- expect(returned_value).to eql(value)
- expect(memoized_value).to eql(value)
- end
- end
-
- describe '#strong_memoize' do
- [nil, false, true, 'value', 0, [0]].each do |value|
- context "with value #{value}" do
- let(:value) { value }
- let(:method_name) { :method_name }
-
- it_behaves_like 'caching the value'
-
- it 'raises exception for invalid type as key' do
- expect { object.strong_memoize(10) { 20 } }.to raise_error /Invalid type of '10'/
- end
-
- it 'raises exception for invalid characters in key' do
- expect { object.strong_memoize(:enabled?) { 20 } }
- .to raise_error /is not allowed as an instance variable name/
- end
- end
- end
-
- context "memory allocation", type: :benchmark do
- let(:value) { 'aaa' }
-
- before do
- object.method_name # warmup
- end
-
- [:method_name, "method_name"].each do |argument|
- context "for #{argument.class}" do
- it 'does allocate exactly one string when fetching value' do
- expect do
- object.strong_memoize(argument) { 10 }
- end.to perform_allocation(1)
- end
-
- it 'does allocate exactly one string when storing value' do
- object.clear_memoization(:method_name) # clear to force set
-
- expect do
- object.strong_memoize(argument) { 10 }
- end.to perform_allocation(1)
- end
- end
- end
- end
- end
-
- describe '#strong_memoize_with_expiration' do
- [nil, false, true, 'value', 0, [0]].each do |value|
- context "with value #{value}" do
- let(:value) { value }
- let(:method_name) { :method_name_with_expiration }
-
- it_behaves_like 'caching the value'
-
- it 'raises exception for invalid type as key' do
- expect { object.strong_memoize_with_expiration(10, 1) { 20 } }.to raise_error /Invalid type of '10'/
- end
-
- it 'raises exception for invalid characters in key' do
- expect { object.strong_memoize_with_expiration(:enabled?, 1) { 20 } }
- .to raise_error /is not allowed as an instance variable name/
- end
- end
- end
-
- context 'value memoization test' do
- let(:value) { 'value' }
-
- it 'caches the value for specified number of seconds' do
- object.method_name_with_expiration
- object.method_name_with_expiration
-
- expect(object.trace.count).to eq(1)
-
- travel_to(Time.current + 2.seconds) do
- object.method_name_with_expiration
-
- expect(object.trace.count).to eq(2)
- end
- end
- end
- end
-
- describe '#strong_memoize_with' do
- [nil, false, true, 'value', 0, [0]].each do |value|
- context "with value #{value}" do
- let(:value) { value }
-
- it 'only calls the block once' do
- value0 = object.method_name_with_args(1)
- value1 = object.method_name_with_args(1)
- value2 = object.method_name_with_args([2, 3])
- value3 = object.method_name_with_args([2, 3])
-
- expect(value0).to eq(value)
- expect(value1).to eq(value)
- expect(value2).to eq(value)
- expect(value3).to eq(value)
-
- expect(object.trace).to contain_exactly([value, [1]], [value, [[2, 3]]])
- end
-
- it 'returns and defines the instance variable for the exact value' do
- returned_value = object.method_name_with_args(1, 2, 3)
- memoized_value = object.instance_variable_get(:@method_name_with_args)
-
- expect(returned_value).to eql(value)
- expect(memoized_value).to eql({ [[1, 2, 3]] => value })
- end
- end
- end
- end
-
- describe '#strong_memoized?' do
- shared_examples 'memoization check' do |method_name|
- context "for #{method_name}" do
- let(:value) { :anything }
-
- subject { object.strong_memoized?(method_name) }
-
- it 'returns false if the value is uncached' do
- is_expected.to be(false)
- end
-
- it 'returns true if the value is cached' do
- object.public_send(method_name)
-
- is_expected.to be(true)
- end
- end
- end
-
- it_behaves_like 'memoization check', :method_name
- it_behaves_like 'memoization check', :enabled?
- end
-
- describe '#clear_memoization' do
- shared_examples 'clearing memoization' do |method_name|
- let(:member_name) { described_class.normalize_key(method_name) }
- let(:value) { 'mepmep' }
-
- it 'removes the instance variable' do
- object.public_send(method_name)
-
- object.clear_memoization(method_name)
-
- expect(object.instance_variable_defined?(:"@#{member_name}")).to be(false)
- end
- end
-
- it_behaves_like 'clearing memoization', :method_name
- it_behaves_like 'clearing memoization', :enabled?
- end
-
- describe '.strong_memoize_attr' do
- [nil, false, true, 'value', 0, [0]].each do |value|
- context "with value '#{value}'" do
- let(:value) { value }
-
- context 'memoized after method definition' do
- let(:method_name) { :method_name_attr }
-
- it_behaves_like 'caching the value'
-
- it 'calls the existing .method_added' do
- expect(klass.method_added_list).to include(:method_name_attr)
- end
-
- it 'retains method arity' do
- expect(klass.instance_method(method_name).arity).to eq(0)
- end
- end
- end
- end
-
- describe 'method visibility' do
- it 'sets private visibility' do
- expect(klass.private_instance_methods).to include(:private_method)
- expect(klass.protected_instance_methods).not_to include(:private_method)
- expect(klass.public_instance_methods).not_to include(:private_method)
- end
-
- it 'sets protected visibility' do
- expect(klass.private_instance_methods).not_to include(:protected_method)
- expect(klass.protected_instance_methods).to include(:protected_method)
- expect(klass.public_instance_methods).not_to include(:protected_method)
- end
-
- it 'sets public visibility' do
- expect(klass.private_instance_methods).not_to include(:public_method)
- expect(klass.protected_instance_methods).not_to include(:public_method)
- expect(klass.public_instance_methods).to include(:public_method)
- end
- end
-
- context "when method doesn't exist" do
- let(:klass) do
- strong_memoize_class = described_class
-
- Struct.new(:value) do
- include strong_memoize_class
- end
- end
-
- subject { klass.strong_memoize_attr(:nonexistent_method) }
-
- it 'fails when strong-memoizing a nonexistent method' do
- expect { subject }.to raise_error(NameError, %r{undefined method `nonexistent_method' for class})
- end
- end
-
- context 'when memoized method has parameters' do
- it 'raises an error' do
- expected_message = /Using `strong_memoize_attr` on methods with parameters is not supported/
-
- expect do
- strong_memoize_class = described_class
-
- Class.new do
- include strong_memoize_class
-
- def method_with_parameters(params); end
- strong_memoize_attr :method_with_parameters
- end
- end.to raise_error(RuntimeError, expected_message)
- end
- end
- end
-
- describe '.normalize_key' do
- using RSpec::Parameterized::TableSyntax
-
- subject { described_class.normalize_key(input) }
-
- where(:input, :output, :valid) do
- :key | :key | true
- "key" | "key" | true
- :key? | "key?" | true
- "key?" | "key?" | true
- :key! | "keyï¼" | true
- "key!" | "keyï¼" | true
- # invalid cases caught elsewhere
- :"ke?y" | :"ke?y" | false
- "ke?y" | "ke?y" | false
- :"ke!y" | :"ke!y" | false
- "ke!y" | "ke!y" | false
- end
-
- with_them do
- let(:ivar) { "@#{output}" }
-
- it { is_expected.to eq(output) }
-
- if params[:valid]
- it 'is a valid ivar name' do
- expect { instance_variable_defined?(ivar) }.not_to raise_error
- end
- else
- it 'raises a NameError error' do
- expect { instance_variable_defined?(ivar) }
- .to raise_error(NameError, /not allowed as an instance/)
- end
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/utils_spec.rb b/spec/lib/gitlab/utils_spec.rb
deleted file mode 100644
index 7b9504366ec..00000000000
--- a/spec/lib/gitlab/utils_spec.rb
+++ /dev/null
@@ -1,477 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Utils do
- using RSpec::Parameterized::TableSyntax
-
- delegate :to_boolean, :boolean_to_yes_no, :slugify, :which,
- :ensure_array_from_string, :bytes_to_megabytes,
- :append_path, :remove_leading_slashes, :allowlisted?,
- :decode_path, :ms_to_round_sec, to: :described_class
-
- describe '.allowlisted?' do
- let(:allowed_paths) { ['/home/foo', '/foo/bar', '/etc/passwd'] }
-
- it 'returns true if path is allowed' do
- expect(allowlisted?('/foo/bar', allowed_paths)).to be(true)
- end
-
- it 'returns false if path is not allowed' do
- expect(allowlisted?('/test/test', allowed_paths)).to be(false)
- end
- end
-
- describe '.decode_path' do
- it 'returns path unencoded for singled-encoded paths' do
- expect(decode_path('%2Fhome%2Fbar%3Fasd%3Dqwe')).to eq('/home/bar?asd=qwe')
- end
-
- it 'returns path when it is unencoded' do
- expect(decode_path('/home/bar?asd=qwe')).to eq('/home/bar?asd=qwe')
- end
-
- [
- '..%252F..%252F..%252Fetc%252Fpasswd',
- '%25252Fresult%25252Fchosennickname%25253D%252522jj%252522'
- ].each do |multiple_encoded_path|
- it 'raises an exception when the path is multiple-encoded' do
- expect { decode_path(multiple_encoded_path) }.to raise_error(/path #{multiple_encoded_path} is not allowed/)
- end
- end
- end
-
- describe '.slugify' do
- {
- 'TEST' => 'test',
- 'project_with_underscores' => 'project-with-underscores',
- 'namespace/project' => 'namespace-project',
- 'a' * 70 => 'a' * 63,
- 'test_trailing_' => 'test-trailing'
- }.each do |original, expected|
- it "slugifies #{original} to #{expected}" do
- expect(slugify(original)).to eq(expected)
- end
- end
- end
-
- describe '.ms_to_round_sec' do
- where(:original, :expected) do
- 1999.8999 | 1.9999
- 12384 | 12.384
- 333 | 0.333
- 1333.33333333 | 1.333333
- end
-
- with_them do
- it "returns rounded seconds" do
- expect(ms_to_round_sec(original)).to eq(expected)
- end
- end
- end
-
- describe '.nlbr' do
- it 'replaces new lines with <br>' do
- expect(described_class.nlbr("<b>hello</b>\n<i>world</i>")).to eq("hello<br>world")
- end
- end
-
- describe '.remove_line_breaks' do
- where(:original, :expected) do
- "foo\nbar\nbaz" | "foobarbaz"
- "foo\r\nbar\r\nbaz" | "foobarbaz"
- "foobar" | "foobar"
- end
-
- with_them do
- it "replace line breaks with an empty string" do
- expect(described_class.remove_line_breaks(original)).to eq(expected)
- end
- end
- end
-
- describe '.to_boolean' do
- it 'accepts booleans' do
- expect(to_boolean(true)).to be(true)
- expect(to_boolean(false)).to be(false)
- end
-
- it 'converts a valid value to a boolean' do
- expect(to_boolean(true)).to be(true)
- expect(to_boolean('true')).to be(true)
- expect(to_boolean('YeS')).to be(true)
- expect(to_boolean('t')).to be(true)
- expect(to_boolean('1')).to be(true)
- expect(to_boolean(1)).to be(true)
- expect(to_boolean('ON')).to be(true)
-
- expect(to_boolean('FaLse')).to be(false)
- expect(to_boolean('F')).to be(false)
- expect(to_boolean('NO')).to be(false)
- expect(to_boolean('n')).to be(false)
- expect(to_boolean('0')).to be(false)
- expect(to_boolean(0)).to be(false)
- expect(to_boolean('oFF')).to be(false)
- end
-
- it 'converts an invalid value to nil' do
- expect(to_boolean('fals')).to be_nil
- expect(to_boolean('yeah')).to be_nil
- expect(to_boolean('')).to be_nil
- expect(to_boolean(nil)).to be_nil
- end
-
- it 'accepts a default value, and does not return it when a valid value is given' do
- expect(to_boolean(true, default: false)).to be(true)
- expect(to_boolean('true', default: false)).to be(true)
- expect(to_boolean('YeS', default: false)).to be(true)
- expect(to_boolean('t', default: false)).to be(true)
- expect(to_boolean('1', default: 'any value')).to be(true)
- expect(to_boolean('ON', default: 42)).to be(true)
-
- expect(to_boolean('FaLse', default: true)).to be(false)
- expect(to_boolean('F', default: true)).to be(false)
- expect(to_boolean('NO', default: true)).to be(false)
- expect(to_boolean('n', default: true)).to be(false)
- expect(to_boolean('0', default: 'any value')).to be(false)
- expect(to_boolean('oFF', default: 42)).to be(false)
- end
-
- it 'accepts a default value, and returns it when an invalid value is given' do
- expect(to_boolean('fals', default: true)).to eq(true)
- expect(to_boolean('yeah', default: false)).to eq(false)
- expect(to_boolean('', default: 'any value')).to eq('any value')
- expect(to_boolean(nil, default: 42)).to eq(42)
- end
- end
-
- describe '.boolean_to_yes_no' do
- it 'converts booleans to Yes or No' do
- expect(boolean_to_yes_no(true)).to eq('Yes')
- expect(boolean_to_yes_no(false)).to eq('No')
- end
- end
-
- describe '.which' do
- before do
- stub_env('PATH', '/sbin:/usr/bin:/home/joe/bin')
- end
-
- it 'finds the full path to an executable binary in order of appearance' do
- expect(File).to receive(:executable?).with('/sbin/tool').ordered.and_return(false)
- expect(File).to receive(:executable?).with('/usr/bin/tool').ordered.and_return(true)
- expect(File).not_to receive(:executable?).with('/home/joe/bin/tool')
-
- expect(which('tool')).to eq('/usr/bin/tool')
- end
- end
-
- describe '.ensure_array_from_string' do
- it 'returns the same array if given one' do
- arr = ['a', 4, true, { test: 1 }]
-
- expect(ensure_array_from_string(arr)).to eq(arr)
- end
-
- it 'turns comma-separated strings into arrays' do
- str = 'seven, eight, 9, 10'
-
- expect(ensure_array_from_string(str)).to eq(%w[seven eight 9 10])
- end
- end
-
- describe '.bytes_to_megabytes' do
- it 'converts bytes to megabytes' do
- bytes = 1.megabyte
-
- expect(bytes_to_megabytes(bytes)).to eq(1)
- end
- end
-
- describe '.append_path' do
- where(:host, :path, :result) do
- 'http://test/' | '/foo/bar' | 'http://test/foo/bar'
- 'http://test/' | '//foo/bar' | 'http://test/foo/bar'
- 'http://test//' | '/foo/bar' | 'http://test/foo/bar'
- 'http://test' | 'foo/bar' | 'http://test/foo/bar'
- 'http://test//' | '' | 'http://test/'
- 'http://test//' | nil | 'http://test/'
- '' | '/foo/bar' | '/foo/bar'
- nil | '/foo/bar' | '/foo/bar'
- end
-
- with_them do
- it 'makes sure there is only one slash as path separator' do
- expect(append_path(host, path)).to eq(result)
- end
- end
- end
-
- describe '.remove_leading_slashes' do
- where(:str, :result) do
- '/foo/bar' | 'foo/bar'
- '//foo/bar' | 'foo/bar'
- '/foo/bar/' | 'foo/bar/'
- 'foo/bar' | 'foo/bar'
- '' | ''
- nil | ''
- end
-
- with_them do
- it 'removes leading slashes' do
- expect(remove_leading_slashes(str)).to eq(result)
- end
- end
- end
-
- describe '.ensure_utf8_size' do
- context 'string is has less bytes than expected' do
- it 'backfills string with null characters' do
- transformed = described_class.ensure_utf8_size('a' * 10, bytes: 32)
-
- expect(transformed.bytesize).to eq 32
- expect(transformed).to eq(('a' * 10) + ('0' * 22))
- end
- end
-
- context 'string size is exactly the one that is expected' do
- it 'returns original value' do
- transformed = described_class.ensure_utf8_size('a' * 32, bytes: 32)
-
- expect(transformed).to eq 'a' * 32
- expect(transformed.bytesize).to eq 32
- end
- end
-
- context 'when string contains a few multi-byte UTF characters' do
- it 'backfills string with null characters' do
- transformed = described_class.ensure_utf8_size('â¤' * 6, bytes: 32)
-
- expect(transformed).to eq 'â¤â¤â¤â¤â¤â¤' + ('0' * 14)
- expect(transformed.bytesize).to eq 32
- end
- end
-
- context 'when string has multiple multi-byte UTF chars exceeding 32 bytes' do
- it 'truncates string to 32 characters and backfills it if needed' do
- transformed = described_class.ensure_utf8_size('â¤' * 18, bytes: 32)
-
- expect(transformed).to eq(('â¤' * 10) + ('0' * 2))
- expect(transformed.bytesize).to eq 32
- end
- end
- end
-
- describe '.deep_indifferent_access' do
- let(:hash) do
- { "variables" => [{ "key" => "VAR1", "value" => "VALUE2" }] }
- end
-
- subject { described_class.deep_indifferent_access(hash) }
-
- it 'allows to access hash keys with symbols' do
- expect(subject[:variables]).to be_a(Array)
- end
-
- it 'allows to access array keys with symbols' do
- expect(subject[:variables].first[:key]).to eq('VAR1')
- end
- end
-
- describe '.deep_symbolized_access' do
- let(:hash) do
- { "variables" => [{ "key" => "VAR1", "value" => "VALUE2" }] }
- end
-
- subject { described_class.deep_symbolized_access(hash) }
-
- it 'allows to access hash keys with symbols' do
- expect(subject[:variables]).to be_a(Array)
- end
-
- it 'allows to access array keys with symbols' do
- expect(subject[:variables].first[:key]).to eq('VAR1')
- end
- end
-
- describe '.try_megabytes_to_bytes' do
- context 'when the size can be converted to megabytes' do
- it 'returns the size in megabytes' do
- size = described_class.try_megabytes_to_bytes(1)
-
- expect(size).to eq(1.megabytes)
- end
- end
-
- context 'when the size can not be converted to megabytes' do
- it 'returns the input size' do
- size = described_class.try_megabytes_to_bytes('foo')
-
- expect(size).to eq('foo')
- end
- end
- end
-
- describe '.string_to_ip_object' do
- it 'returns nil when string is nil' do
- expect(described_class.string_to_ip_object(nil)).to eq(nil)
- end
-
- it 'returns nil when string is invalid IP' do
- expect(described_class.string_to_ip_object('invalid ip')).to eq(nil)
- expect(described_class.string_to_ip_object('')).to eq(nil)
- end
-
- it 'returns IP object when string is valid IP' do
- expect(described_class.string_to_ip_object('192.168.1.1')).to eq(IPAddr.new('192.168.1.1'))
- expect(described_class.string_to_ip_object('::ffff:a9fe:a864')).to eq(IPAddr.new('::ffff:a9fe:a864'))
- expect(described_class.string_to_ip_object('[::ffff:a9fe:a864]')).to eq(IPAddr.new('::ffff:a9fe:a864'))
- expect(described_class.string_to_ip_object('127.0.0.0/28')).to eq(IPAddr.new('127.0.0.0/28'))
- expect(described_class.string_to_ip_object('1:0:0:0:0:0:0:0/124')).to eq(IPAddr.new('1:0:0:0:0:0:0:0/124'))
- end
- end
-
- describe ".safe_downcase!" do
- where(:str, :result) do
- "test" | "test"
- "Test" | "test"
- "test" | "test"
- "Test" | "test"
- end
-
- with_them do
- it "downcases the string" do
- expect(described_class.safe_downcase!(str)).to eq(result)
- end
- end
- end
-
- describe '.parse_url' do
- it 'returns Addressable::URI object' do
- expect(described_class.parse_url('http://gitlab.com')).to be_instance_of(Addressable::URI)
- end
-
- it 'returns nil when URI cannot be parsed' do
- expect(described_class.parse_url('://gitlab.com')).to be nil
- end
-
- it 'returns nil with invalid parameter' do
- expect(described_class.parse_url(1)).to be nil
- end
- end
-
- describe '.add_url_parameters' do
- subject { described_class.add_url_parameters(url, params) }
-
- where(:url, :params, :expected_url) do
- nil | nil | ''
- nil | { b: 3, a: 2 } | '?a=2&b=3'
- 'https://gitlab.com' | nil | 'https://gitlab.com'
- 'https://gitlab.com' | { b: 3, a: 2 } | 'https://gitlab.com?a=2&b=3'
- 'https://gitlab.com?a=1#foo' | { b: 3, 'a': 2 } | 'https://gitlab.com?a=2&b=3#foo'
- 'https://gitlab.com?a=1#foo' | [[:b, 3], [:a, 2]] | 'https://gitlab.com?a=2&b=3#foo'
- end
-
- with_them do
- it { is_expected.to eq(expected_url) }
- end
- end
-
- describe '.removes_sensitive_data_from_url' do
- it 'returns string object' do
- expect(described_class.removes_sensitive_data_from_url('http://gitlab.com')).to be_instance_of(String)
- end
-
- it 'returns nil when URI cannot be parsed' do
- expect(described_class.removes_sensitive_data_from_url('://gitlab.com')).to be nil
- end
-
- it 'returns nil with invalid parameter' do
- expect(described_class.removes_sensitive_data_from_url(1)).to be nil
- end
-
- it 'returns string with filtered access_token param' do
- expect(described_class.removes_sensitive_data_from_url('http://gitlab.com/auth.html#access_token=secret_token')).to eq('http://gitlab.com/auth.html#access_token=filtered')
- end
-
- it 'returns string with filtered access_token param but other params preserved' do
- expect(described_class.removes_sensitive_data_from_url('http://gitlab.com/auth.html#access_token=secret_token&token_type=Bearer&state=test'))
- .to include('&token_type=Bearer', '&state=test')
- end
- end
-
- describe 'multiple_key_invert' do
- it 'invert keys with array values' do
- hash = {
- dast: [:vulnerabilities_count, :scanned_resources_count],
- sast: [:vulnerabilities_count]
- }
- expect(described_class.multiple_key_invert(hash)).to eq({
- vulnerabilities_count: [:dast, :sast],
- scanned_resources_count: [:dast]
- })
- end
- end
-
- describe '.stable_sort_by' do
- subject(:sorted_list) { described_class.stable_sort_by(list) { |obj| obj[:priority] } }
-
- context 'when items have the same priority' do
- let(:list) do
- [
- { name: 'obj 1', priority: 1 },
- { name: 'obj 2', priority: 1 },
- { name: 'obj 3', priority: 1 }
- ]
- end
-
- it 'does not change order in cases of ties' do
- expect(sorted_list).to eq(list)
- end
- end
-
- context 'when items have different priorities' do
- let(:list) do
- [
- { name: 'obj 1', priority: 2 },
- { name: 'obj 2', priority: 1 },
- { name: 'obj 3', priority: 3 }
- ]
- end
-
- it 'sorts items like the regular sort_by' do
- expect(sorted_list).to eq(
- [
- { name: 'obj 2', priority: 1 },
- { name: 'obj 1', priority: 2 },
- { name: 'obj 3', priority: 3 }
- ])
- end
- end
- end
-
- describe '.valid_brackets?' do
- where(:input, :allow_nested, :valid) do
- 'no brackets' | true | true
- 'no brackets' | false | true
- 'user[avatar]' | true | true
- 'user[avatar]' | false | true
- 'user[avatar][friends]' | true | true
- 'user[avatar][friends]' | false | true
- 'user[avatar[image[url]]]' | true | true
- 'user[avatar[image[url]]]' | false | false
- 'user[avatar[]friends]' | true | true
- 'user[avatar[]friends]' | false | false
- 'user[avatar]]' | true | false
- 'user[avatar]]' | false | false
- 'user][avatar]]' | true | false
- 'user][avatar]]' | false | false
- 'user[avatar' | true | false
- 'user[avatar' | false | false
- end
-
- with_them do
- it { expect(described_class.valid_brackets?(input, allow_nested: allow_nested)).to eq(valid) }
- end
- end
-end
diff --git a/spec/lib/gitlab/version_info_spec.rb b/spec/lib/gitlab/version_info_spec.rb
deleted file mode 100644
index 99c7a762392..00000000000
--- a/spec/lib/gitlab/version_info_spec.rb
+++ /dev/null
@@ -1,193 +0,0 @@
-# frozen_string_literal: true
-
-require 'fast_spec_helper'
-
-RSpec.describe Gitlab::VersionInfo do
- before do
- @unknown = described_class.new
- @v0_0_1 = described_class.new(0, 0, 1)
- @v0_1_0 = described_class.new(0, 1, 0)
- @v1_0_0 = described_class.new(1, 0, 0)
- @v1_0_1 = described_class.new(1, 0, 1)
- @v1_0_1_b1 = described_class.new(1, 0, 1, '-b1')
- @v1_0_1_rc1 = described_class.new(1, 0, 1, '-rc1')
- @v1_0_1_rc2 = described_class.new(1, 0, 1, '-rc2')
- @v1_1_0 = described_class.new(1, 1, 0)
- @v1_1_0_beta1 = described_class.new(1, 1, 0, '-beta1')
- @v2_0_0 = described_class.new(2, 0, 0)
- @v13_10_1_1574_89 = described_class.parse("v13.10.1~beta.1574.gf6ea9389", parse_suffix: true)
- @v13_10_1_1575_89 = described_class.parse("v13.10.1~beta.1575.gf6ea9389", parse_suffix: true)
- @v13_10_1_1575_90 = described_class.parse("v13.10.1~beta.1575.gf6ea9390", parse_suffix: true)
- end
-
- describe '>' do
- it { expect(@v2_0_0).to be > @v1_1_0 }
- it { expect(@v1_1_0).to be > @v1_0_1 }
- it { expect(@v1_0_1_b1).to be > @v1_0_0 }
- it { expect(@v1_0_1_rc1).to be > @v1_0_0 }
- it { expect(@v1_0_1_rc1).to be > @v1_0_1_b1 }
- it { expect(@v1_0_1_rc2).to be > @v1_0_1_rc1 }
- it { expect(@v1_0_1).to be > @v1_0_1_rc1 }
- it { expect(@v1_0_1).to be > @v1_0_1_rc2 }
- it { expect(@v1_0_1).to be > @v1_0_0 }
- it { expect(@v1_0_0).to be > @v0_1_0 }
- it { expect(@v1_1_0_beta1).to be > @v1_0_1_rc2 }
- it { expect(@v1_1_0).to be > @v1_1_0_beta1 }
- it { expect(@v0_1_0).to be > @v0_0_1 }
- end
-
- describe '>=' do
- it { expect(@v2_0_0).to be >= described_class.new(2, 0, 0) }
- it { expect(@v2_0_0).to be >= @v1_1_0 }
- it { expect(@v1_0_1_rc2).to be >= @v1_0_1_rc1 }
- end
-
- describe '<' do
- it { expect(@v0_0_1).to be < @v0_1_0 }
- it { expect(@v0_1_0).to be < @v1_0_0 }
- it { expect(@v1_0_0).to be < @v1_0_1 }
- it { expect(@v1_0_1).to be < @v1_1_0 }
- it { expect(@v1_0_0).to be < @v1_0_1_rc2 }
- it { expect(@v1_0_1_rc1).to be < @v1_0_1 }
- it { expect(@v1_0_1_rc1).to be < @v1_0_1_rc2 }
- it { expect(@v1_0_1_rc2).to be < @v1_0_1 }
- it { expect(@v1_1_0).to be < @v2_0_0 }
- it { expect(@v13_10_1_1574_89).to be < @v13_10_1_1575_89 }
- it { expect(@v13_10_1_1575_89).to be < @v13_10_1_1575_90 }
- end
-
- describe '<=' do
- it { expect(@v0_0_1).to be <= described_class.new(0, 0, 1) }
- it { expect(@v0_0_1).to be <= @v0_1_0 }
- it { expect(@v1_0_1_b1).to be <= @v1_0_1_rc1 }
- it { expect(@v1_0_1_rc1).to be <= @v1_0_1_rc2 }
- it { expect(@v1_1_0_beta1).to be <= @v1_1_0 }
- end
-
- describe '==' do
- it { expect(@v0_0_1).to eq(described_class.new(0, 0, 1)) }
- it { expect(@v0_1_0).to eq(described_class.new(0, 1, 0)) }
- it { expect(@v1_0_0).to eq(described_class.new(1, 0, 0)) }
- it { expect(@v1_0_1_rc1).to eq(described_class.new(1, 0, 1, '-rc1')) }
- end
-
- describe '!=' do
- it { expect(@v0_0_1).not_to eq(@v0_1_0) }
- it { expect(@v1_0_1_rc1).not_to eq(@v1_0_1_rc2) }
- end
-
- describe '.unknown' do
- it { expect(@unknown).not_to be @v0_0_1 }
- it { expect(@unknown).not_to be described_class.new }
- it { expect { @unknown > @v0_0_1 }.to raise_error(ArgumentError) }
- it { expect { @unknown < @v0_0_1 }.to raise_error(ArgumentError) }
- end
-
- describe '.parse' do
- it { expect(described_class.parse(described_class.new(1, 0, 0))).to eq(@v1_0_0) }
- it { expect(described_class.parse("1.0.0")).to eq(@v1_0_0) }
- it { expect(described_class.parse("1.0.0.1")).to eq(@v1_0_0) }
- it { expect(described_class.parse("1.0.0-ee")).to eq(@v1_0_0) }
- it { expect(described_class.parse("1.0.0-rc1")).to eq(@v1_0_0) }
- it { expect(described_class.parse("1.0.0-rc1-ee")).to eq(@v1_0_0) }
- it { expect(described_class.parse("git 1.0.0b1")).to eq(@v1_0_0) }
- it { expect(described_class.parse("git 1.0b1")).not_to be_valid }
- it { expect(described_class.parse("1.1.#{'1' * described_class::MAX_VERSION_LENGTH}")).not_to be_valid }
- it { expect(described_class.parse(nil)).not_to be_valid }
-
- context 'with parse_suffix: true' do
- let(:versions) do
- <<-VERSIONS.lines
- 0.0.1
- 0.1.0
- 1.0.0
- 1.0.1-b1
- 1.0.1-rc1
- 1.0.1-rc2
- 1.0.1
- 1.1.0-beta1
- 1.1.0
- 2.0.0
- v13.10.0-pre
- v13.10.0-rc1
- v13.10.0-rc2
- v13.10.0
- v13.10.1~beta.1574.gf6ea9389
- v13.10.1~beta.1575.gf6ea9389
- v13.10.1-rc1
- v13.10.1-rc2
- v13.10.1
- VERSIONS
- end
-
- let(:parsed_versions) do
- versions.map(&:strip).map { |version| described_class.parse(version, parse_suffix: true) }
- end
-
- it 'versions are returned in a correct order' do
- expect(parsed_versions.shuffle.sort).to eq(parsed_versions)
- end
- end
- end
-
- describe '.to_s' do
- it { expect(@v1_0_0.to_s).to eq("1.0.0") }
- it { expect(@v1_0_1_rc1.to_s).to eq("1.0.1-rc1") }
- it { expect(@unknown.to_s).to eq("Unknown") }
- end
-
- describe '.to_json' do
- let(:correct_version) do
- "{\"major\":1,\"minor\":0,\"patch\":1}"
- end
-
- let(:unknown_version) do
- "{\"major\":0,\"minor\":0,\"patch\":0}"
- end
-
- it { expect(@v1_0_1.to_json).to eq(correct_version) }
- it { expect(@v1_0_1_rc2.to_json).to eq(correct_version) }
- it { expect(@unknown.to_json).to eq(unknown_version) }
- end
-
- describe '.hash' do
- it { expect(described_class.parse("1.0.0").hash).to eq(@v1_0_0.hash) }
- it { expect(described_class.parse("1.0.0.1").hash).to eq(@v1_0_0.hash) }
- it { expect(described_class.parse("1.0.1b1").hash).to eq(@v1_0_1.hash) }
- it { expect(described_class.parse("1.0.1-rc1", parse_suffix: true).hash).to eq(@v1_0_1_rc1.hash) }
- end
-
- describe '.eql?' do
- it { expect(described_class.parse("1.0.0").eql?(@v1_0_0)).to be_truthy }
- it { expect(described_class.parse("1.0.0.1").eql?(@v1_0_0)).to be_truthy }
- it { expect(@v1_0_1_rc1.eql?(@v1_0_1_rc1)).to be_truthy }
- it { expect(@v1_0_1_rc1.eql?(@v1_0_1_rc2)).to be_falsey }
- it { expect(@v1_0_1_rc1.eql?(@v1_0_1)).to be_falsey }
- it { expect(@v1_0_1.eql?(@v1_0_0)).to be_falsey }
- it { expect(@v1_1_0.eql?(@v1_0_0)).to be_falsey }
- it { expect(@v1_0_0.eql?(@v1_0_0)).to be_truthy }
- it { expect([@v1_0_0, @v1_1_0, @v1_0_0, @v1_0_1_rc1, @v1_0_1_rc1].uniq).to eq [@v1_0_0, @v1_1_0, @v1_0_1_rc1] }
- end
-
- describe '.same_minor_version?' do
- it { expect(@v0_1_0.same_minor_version?(@v0_0_1)).to be_falsey }
- it { expect(@v1_0_1.same_minor_version?(@v1_0_0)).to be_truthy }
- it { expect(@v1_0_1_rc1.same_minor_version?(@v1_0_0)).to be_truthy }
- it { expect(@v1_0_0.same_minor_version?(@v1_0_1)).to be_truthy }
- it { expect(@v1_1_0.same_minor_version?(@v1_0_0)).to be_falsey }
- it { expect(@v2_0_0.same_minor_version?(@v1_0_0)).to be_falsey }
- end
-
- describe '.without_patch' do
- it { expect(@v0_1_0.without_patch).to eq(@v0_1_0) }
- it { expect(@v1_0_0.without_patch).to eq(@v1_0_0) }
- it { expect(@v1_0_1.without_patch).to eq(@v1_0_0) }
- it { expect(@v1_0_1_rc1.without_patch).to eq(@v1_0_0) }
- end
-
- describe 'MAX_VERSION_LENGTH' do
- subject { described_class::MAX_VERSION_LENGTH }
-
- it { is_expected.to eq(128) }
- end
-end
diff --git a/spec/lib/gitlab/webpack/file_loader_spec.rb b/spec/lib/gitlab/webpack/file_loader_spec.rb
index c2e9cd8124d..16bf380fd13 100644
--- a/spec/lib/gitlab/webpack/file_loader_spec.rb
+++ b/spec/lib/gitlab/webpack/file_loader_spec.rb
@@ -32,15 +32,15 @@ RSpec.describe Gitlab::Webpack::FileLoader do
end
it "returns content when responds successfully" do
- expect(Gitlab::Webpack::FileLoader.load(file_path)).to eq(file_contents)
+ expect(described_class.load(file_path)).to eq(file_contents)
end
it "raises error when 404" do
- expect { Gitlab::Webpack::FileLoader.load("not_found") }.to raise_error("HTTP error 404")
+ expect { described_class.load("not_found") }.to raise_error("HTTP error 404")
end
it "raises error when errors out" do
- expect { Gitlab::Webpack::FileLoader.load(error_file_path) }.to raise_error(Gitlab::Webpack::FileLoader::DevServerLoadError)
+ expect { described_class.load(error_file_path) }.to raise_error(Gitlab::Webpack::FileLoader::DevServerLoadError)
end
end
@@ -53,7 +53,7 @@ RSpec.describe Gitlab::Webpack::FileLoader do
end
it "raises error if catches SSLError" do
- expect { Gitlab::Webpack::FileLoader.load(error_file_path) }.to raise_error(Gitlab::Webpack::FileLoader::DevServerSSLError)
+ expect { described_class.load(error_file_path) }.to raise_error(Gitlab::Webpack::FileLoader::DevServerSSLError)
end
end
@@ -66,11 +66,11 @@ RSpec.describe Gitlab::Webpack::FileLoader do
describe ".load" do
it "returns file content from file path" do
- expect(Gitlab::Webpack::FileLoader.load(file_path)).to be(file_contents)
+ expect(described_class.load(file_path)).to be(file_contents)
end
it "throws error if file cannot be read" do
- expect { Gitlab::Webpack::FileLoader.load(error_file_path) }.to raise_error(Gitlab::Webpack::FileLoader::StaticLoadError)
+ expect { described_class.load(error_file_path) }.to raise_error(Gitlab::Webpack::FileLoader::StaticLoadError)
end
end
end
diff --git a/spec/lib/gitlab/webpack/manifest_spec.rb b/spec/lib/gitlab/webpack/manifest_spec.rb
index 24a36258379..cbf3e4d2951 100644
--- a/spec/lib/gitlab/webpack/manifest_spec.rb
+++ b/spec/lib/gitlab/webpack/manifest_spec.rb
@@ -17,24 +17,24 @@ RSpec.describe Gitlab::Webpack::Manifest do
end
around do |example|
- Gitlab::Webpack::Manifest.clear_manifest!
+ described_class.clear_manifest!
example.run
- Gitlab::Webpack::Manifest.clear_manifest!
+ described_class.clear_manifest!
end
shared_examples_for "a valid manifest" do
it "returns single entry asset paths from the manifest" do
- expect(Gitlab::Webpack::Manifest.asset_paths("entry2")).to eq(["/public_path/entry2.js"])
+ expect(described_class.asset_paths("entry2")).to eq(["/public_path/entry2.js"])
end
it "returns multiple entry asset paths from the manifest" do
- expect(Gitlab::Webpack::Manifest.asset_paths("entry1")).to eq(["/public_path/entry1.js", "/public_path/entry1-a.js"])
+ expect(described_class.asset_paths("entry1")).to eq(["/public_path/entry1.js", "/public_path/entry1-a.js"])
end
it "errors on a missing entry point" do
- expect { Gitlab::Webpack::Manifest.asset_paths("herp") }.to raise_error(Gitlab::Webpack::Manifest::AssetMissingError)
+ expect { described_class.asset_paths("herp") }.to raise_error(Gitlab::Webpack::Manifest::AssetMissingError)
end
end
@@ -60,7 +60,7 @@ RSpec.describe Gitlab::Webpack::Manifest do
allow(Gitlab.config.webpack).to receive(:manifest_filename).and_return('broken.json')
stub_request(:get, "http://hostname:2000/public_path/broken.json").to_raise(SocketError)
- expect { Gitlab::Webpack::Manifest.asset_paths("entry1") }.to raise_error(Gitlab::Webpack::Manifest::ManifestLoadError)
+ expect { described_class.asset_paths("entry1") }.to raise_error(Gitlab::Webpack::Manifest::ManifestLoadError)
end
describe "webpack errors" do
@@ -73,7 +73,7 @@ RSpec.describe Gitlab::Webpack::Manifest do
]).to_json
stub_request(:get, "http://hostname:2000/public_path/my_manifest.json").to_return(body: error_manifest, status: 200)
- expect { Gitlab::Webpack::Manifest.asset_paths("entry1") }.to raise_error(Gitlab::Webpack::Manifest::WebpackError)
+ expect { described_class.asset_paths("entry1") }.to raise_error(Gitlab::Webpack::Manifest::WebpackError)
end
end
@@ -82,14 +82,14 @@ RSpec.describe Gitlab::Webpack::Manifest do
error_manifest = Gitlab::Json.parse(manifest).merge("errors" => ["something went wrong"]).to_json
stub_request(:get, "http://hostname:2000/public_path/my_manifest.json").to_return(body: error_manifest, status: 200)
- expect { Gitlab::Webpack::Manifest.asset_paths("entry1") }.not_to raise_error
+ expect { described_class.asset_paths("entry1") }.not_to raise_error
end
end
it "does not error if errors is present but empty" do
error_manifest = Gitlab::Json.parse(manifest).merge("errors" => []).to_json
stub_request(:get, "http://hostname:2000/public_path/my_manifest.json").to_return(body: error_manifest, status: 200)
- expect { Gitlab::Webpack::Manifest.asset_paths("entry1") }.not_to raise_error
+ expect { described_class.asset_paths("entry1") }.not_to raise_error
end
end
end
@@ -107,7 +107,7 @@ RSpec.describe Gitlab::Webpack::Manifest do
it "errors if we can't find the manifest" do
allow(Gitlab.config.webpack).to receive(:manifest_filename).and_return('broken.json')
stub_file_read(::Rails.root.join("manifest_output/broken.json"), error: Errno::ENOENT)
- expect { Gitlab::Webpack::Manifest.asset_paths("entry1") }.to raise_error(Gitlab::Webpack::Manifest::ManifestLoadError)
+ expect { described_class.asset_paths("entry1") }.to raise_error(Gitlab::Webpack::Manifest::ManifestLoadError)
end
end
end
diff --git a/spec/lib/gitlab/x509/commit_spec.rb b/spec/lib/gitlab/x509/commit_spec.rb
index c7d56e49fab..412fa6e5a7f 100644
--- a/spec/lib/gitlab/x509/commit_spec.rb
+++ b/spec/lib/gitlab/x509/commit_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe Gitlab::X509::Commit do
let(:user) { create(:user, email: X509Helpers::User1.certificate_email) }
let(:project) { create(:project, :repository, path: X509Helpers::User1.path, creator: user) }
let(:commit) { project.commit_by(oid: commit_sha ) }
- let(:signature) { Gitlab::X509::Commit.new(commit).signature }
+ let(:signature) { described_class.new(commit).signature }
let(:store) { OpenSSL::X509::Store.new }
let(:certificate) { OpenSSL::X509::Certificate.new(X509Helpers::User1.trust_cert) }
diff --git a/spec/lib/gitlab/x509/signature_spec.rb b/spec/lib/gitlab/x509/signature_spec.rb
index eb8c0bd0aff..d119a4e2b9d 100644
--- a/spec/lib/gitlab/x509/signature_spec.rb
+++ b/spec/lib/gitlab/x509/signature_spec.rb
@@ -197,9 +197,9 @@ RSpec.describe Gitlab::X509::Signature do
context 'certificate_crl' do
describe 'valid crlDistributionPoints' do
before do
- allow_any_instance_of(Gitlab::X509::Signature).to receive(:get_certificate_extension).and_call_original
+ allow_any_instance_of(described_class).to receive(:get_certificate_extension).and_call_original
- allow_any_instance_of(Gitlab::X509::Signature).to receive(:get_certificate_extension)
+ allow_any_instance_of(described_class).to receive(:get_certificate_extension)
.with('crlDistributionPoints')
.and_return("\nFull Name:\n URI:http://ch.siemens.com/pki?ZZZZZZA2.crl\n URI:ldap://cl.siemens.net/CN=ZZZZZZA2,L=PKI?certificateRevocationList\n URI:ldap://cl.siemens.com/CN=ZZZZZZA2,o=Trustcenter?certificateRevocationList\n")
end
@@ -218,9 +218,9 @@ RSpec.describe Gitlab::X509::Signature do
describe 'valid crlDistributionPoints providing multiple http URIs' do
before do
- allow_any_instance_of(Gitlab::X509::Signature).to receive(:get_certificate_extension).and_call_original
+ allow_any_instance_of(described_class).to receive(:get_certificate_extension).and_call_original
- allow_any_instance_of(Gitlab::X509::Signature).to receive(:get_certificate_extension)
+ allow_any_instance_of(described_class).to receive(:get_certificate_extension)
.with('crlDistributionPoints')
.and_return("\nFull Name:\n URI:http://cdp1.pca.dfn.de/dfn-ca-global-g2/pub/crl/cacrl.crl\n\nFull Name:\n URI:http://cdp2.pca.dfn.de/dfn-ca-global-g2/pub/crl/cacrl.crl\n")
end
@@ -241,9 +241,9 @@ RSpec.describe Gitlab::X509::Signature do
context 'email' do
describe 'subjectAltName with email, othername' do
before do
- allow_any_instance_of(Gitlab::X509::Signature).to receive(:get_certificate_extension).and_call_original
+ allow_any_instance_of(described_class).to receive(:get_certificate_extension).and_call_original
- allow_any_instance_of(Gitlab::X509::Signature).to receive(:get_certificate_extension)
+ allow_any_instance_of(described_class).to receive(:get_certificate_extension)
.with('subjectAltName')
.and_return("email:gitlab@example.com, othername:<unsupported>")
end
@@ -262,9 +262,9 @@ RSpec.describe Gitlab::X509::Signature do
describe 'subjectAltName with othername, email' do
before do
- allow_any_instance_of(Gitlab::X509::Signature).to receive(:get_certificate_extension).and_call_original
+ allow_any_instance_of(described_class).to receive(:get_certificate_extension).and_call_original
- allow_any_instance_of(Gitlab::X509::Signature).to receive(:get_certificate_extension)
+ allow_any_instance_of(described_class).to receive(:get_certificate_extension)
.with('subjectAltName')
.and_return("othername:<unsupported>, email:gitlab@example.com")
end
diff --git a/spec/lib/gitlab_settings/options_spec.rb b/spec/lib/gitlab_settings/options_spec.rb
index 23cb2180edd..abb895032c9 100644
--- a/spec/lib/gitlab_settings/options_spec.rb
+++ b/spec/lib/gitlab_settings/options_spec.rb
@@ -7,6 +7,33 @@ RSpec.describe GitlabSettings::Options, :aggregate_failures, feature_category: :
subject(:options) { described_class.build(config) }
+ shared_examples 'do not mutate' do |method|
+ context 'when in production env' do
+ it 'returns the unchanged internal hash' do
+ stub_rails_env('production')
+
+ expect(Gitlab::ErrorTracking)
+ .to receive(:track_and_raise_for_dev_exception)
+ .with(RuntimeError.new("Warning: Do not mutate GitlabSettings::Options objects: `#{method}`"), method: method)
+ .and_call_original
+
+ expect(options.send(method)).to be_truthy
+ end
+ end
+
+ context 'when not in production env' do
+ it 'raises an exception to avoid changing the internal keys' do
+ exception = "Warning: Do not mutate GitlabSettings::Options objects: `#{method}`"
+
+ stub_rails_env('development')
+ expect { options.send(method) }.to raise_error(exception)
+
+ stub_rails_env('test')
+ expect { options.send(method) }.to raise_error(exception)
+ end
+ end
+ end
+
describe '.build' do
context 'when argument is a hash' do
it 'creates a new GitlabSettings::Options instance' do
@@ -19,6 +46,16 @@ RSpec.describe GitlabSettings::Options, :aggregate_failures, feature_category: :
end
end
+ describe '#default' do
+ it 'returns the option value' do
+ expect(options.default).to be_nil
+
+ options['default'] = 'The default value'
+
+ expect(options.default).to eq('The default value')
+ end
+ end
+
describe '#[]' do
it 'accesses the configuration key as string' do
expect(options['foo']).to be_a described_class
@@ -96,7 +133,7 @@ RSpec.describe GitlabSettings::Options, :aggregate_failures, feature_category: :
end
describe '#merge' do
- it 'merges a hash to the existing options' do
+ it 'returns a new object with the options merged' do
expect(options.merge(more: 'configs').to_hash).to eq(
'foo' => { 'bar' => 'baz' },
'more' => 'configs'
@@ -104,14 +141,33 @@ RSpec.describe GitlabSettings::Options, :aggregate_failures, feature_category: :
end
context 'when the merge hash replaces existing configs' do
- it 'merges a hash to the existing options' do
+ it 'returns a new object with the duplicated options replaced' do
expect(options.merge(foo: 'configs').to_hash).to eq('foo' => 'configs')
end
end
end
+ describe '#merge!' do
+ it 'merges in place with the existing options' do
+ options.merge!(more: 'configs') # rubocop: disable Performance/RedundantMerge
+
+ expect(options.to_hash).to eq(
+ 'foo' => { 'bar' => 'baz' },
+ 'more' => 'configs'
+ )
+ end
+
+ context 'when the merge hash replaces existing configs' do
+ it 'merges in place with the duplicated options replaced' do
+ options.merge!(foo: 'configs') # rubocop: disable Performance/RedundantMerge
+
+ expect(options.to_hash).to eq('foo' => 'configs')
+ end
+ end
+ end
+
describe '#deep_merge' do
- it 'merges a hash to the existing options' do
+ it 'returns a new object with the options merged' do
expect(options.deep_merge(foo: { more: 'configs' }).to_hash).to eq('foo' => {
'bar' => 'baz',
'more' => 'configs'
@@ -119,7 +175,24 @@ RSpec.describe GitlabSettings::Options, :aggregate_failures, feature_category: :
end
context 'when the merge hash replaces existing configs' do
- it 'merges a hash to the existing options' do
+ it 'returns a new object with the duplicated options replaced' do
+ expect(options.deep_merge(foo: { bar: 'configs' }).to_hash).to eq('foo' => {
+ 'bar' => 'configs'
+ })
+ end
+ end
+ end
+
+ describe '#deep_merge!' do
+ it 'merges in place with the existing options' do
+ expect(options.deep_merge(foo: { more: 'configs' }).to_hash).to eq('foo' => {
+ 'bar' => 'baz',
+ 'more' => 'configs'
+ })
+ end
+
+ context 'when the merge hash replaces existing configs' do
+ it 'merges in place with the duplicated options replaced' do
expect(options.deep_merge(foo: { bar: 'configs' }).to_hash).to eq('foo' => {
'bar' => 'configs'
})
@@ -135,6 +208,14 @@ RSpec.describe GitlabSettings::Options, :aggregate_failures, feature_category: :
end
end
+ describe '#symbolize_keys!' do
+ it_behaves_like 'do not mutate', :symbolize_keys!
+ end
+
+ describe '#stringify_keys!' do
+ it_behaves_like 'do not mutate', :stringify_keys!
+ end
+
describe '#method_missing' do
context 'when method is an option' do
it 'delegates methods to options keys' do
@@ -149,10 +230,31 @@ RSpec.describe GitlabSettings::Options, :aggregate_failures, feature_category: :
end
context 'when method is not an option' do
- it 'delegates the method to the internal options hash' do
- expect { options.foo.delete('bar') }
- .to change { options.to_hash }
- .to({ 'foo' => {} })
+ context 'when in production env' do
+ it 'delegates the method to the internal options hash' do
+ stub_rails_env('production')
+
+ expect(Gitlab::ErrorTracking)
+ .to receive(:track_and_raise_for_dev_exception)
+ .with(RuntimeError.new('Calling a hash method on GitlabSettings::Options: `delete`'), method: :delete)
+ .and_call_original
+
+ expect { options.foo.delete('bar') }
+ .to change { options.to_hash }
+ .to({ 'foo' => {} })
+ end
+ end
+
+ context 'when not in production env' do
+ it 'delegates the method to the internal options hash' do
+ exception = 'Calling a hash method on GitlabSettings::Options: `delete`'
+
+ stub_rails_env('development')
+ expect { options.foo.delete('bar') }.to raise_error(exception)
+
+ stub_rails_env('test')
+ expect { options.foo.delete('bar') }.to raise_error(exception)
+ end
end
end
diff --git a/spec/lib/result_spec.rb b/spec/lib/result_spec.rb
new file mode 100644
index 00000000000..2b88521fe14
--- /dev/null
+++ b/spec/lib/result_spec.rb
@@ -0,0 +1,328 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+
+# NOTE:
+# This spec is intended to serve as documentation examples of idiomatic usage for the `Result` type.
+# These examples can be executed as-is in a Rails console to see the results.
+#
+# To support this, we have intentionally used some `rubocop:disable` comments to allow for more
+# explicit and readable examples.
+# rubocop:disable RSpec/DescribedClass, Lint/ConstantDefinitionInBlock, RSpec/LeakyConstantDeclaration
+RSpec.describe Result, feature_category: :remote_development do
+ describe 'usage of Result.ok and Result.err' do
+ context 'when checked with .ok? and .err?' do
+ it 'works with ok result' do
+ result = Result.ok(:success)
+ expect(result.ok?).to eq(true)
+ expect(result.err?).to eq(false)
+ expect(result.unwrap).to eq(:success)
+ end
+
+ it 'works with error result' do
+ result = Result.err(:failure)
+ expect(result.err?).to eq(true)
+ expect(result.ok?).to eq(false)
+ expect(result.unwrap_err).to eq(:failure)
+ end
+ end
+
+ context 'when checked with destructuring' do
+ it 'works with ok result' do
+ Result.ok(:success) => { ok: } # example of rightward assignment
+ expect(ok).to eq(:success)
+
+ Result.ok(:success) => { ok: success_value } # rightward assignment destructuring to different var
+ expect(success_value).to eq(:success)
+ end
+
+ it 'works with error result' do
+ Result.err(:failure) => { err: }
+ expect(err).to eq(:failure)
+
+ Result.err(:failure) => { err: error_value }
+ expect(error_value).to eq(:failure)
+ end
+ end
+
+ context 'when checked with pattern matching' do
+ def check_result_with_pattern_matching(result)
+ case result
+ in { ok: Symbol => ok_value }
+ { success: ok_value }
+ in { err: String => error_value }
+ { failure: error_value }
+ else
+ raise "Unmatched result type: #{result.unwrap.class.name}"
+ end
+ end
+
+ it 'works with ok result' do
+ ok_result = Result.ok(:success_symbol)
+ expect(check_result_with_pattern_matching(ok_result)).to eq({ success: :success_symbol })
+ end
+
+ it 'works with error result' do
+ error_result = Result.err('failure string')
+ expect(check_result_with_pattern_matching(error_result)).to eq({ failure: 'failure string' })
+ end
+
+ it 'raises error with unmatched type in pattern match' do
+ unmatched_type_result = Result.ok([])
+ expect do
+ check_result_with_pattern_matching(unmatched_type_result)
+ end.to raise_error(RuntimeError, 'Unmatched result type: Array')
+ end
+
+ it 'raises error with invalid pattern matching key' do
+ result = Result.ok(:success)
+ expect do
+ case result
+ in { invalid_pattern_match_because_it_is_not_ok_or_err: :value }
+ :unreachable_from_case
+ else
+ :unreachable_from_else
+ end
+ end.to raise_error(ArgumentError, 'Use either :ok or :err for pattern matching')
+ end
+ end
+ end
+
+ describe 'usage of #and_then' do
+ context 'when passed a proc' do
+ it 'returns last ok value in successful chain' do
+ initial_result = Result.ok(1)
+ final_result =
+ initial_result
+ .and_then(->(value) { Result.ok(value + 1) })
+ .and_then(->(value) { Result.ok(value + 1) })
+
+ expect(final_result.ok?).to eq(true)
+ expect(final_result.unwrap).to eq(3)
+ end
+
+ it 'short-circuits the rest of the chain on the first err value encountered' do
+ initial_result = Result.ok(1)
+ final_result =
+ initial_result
+ .and_then(->(value) { Result.err("invalid: #{value}") })
+ .and_then(->(value) { Result.ok(value + 1) })
+
+ expect(final_result.err?).to eq(true)
+ expect(final_result.unwrap_err).to eq('invalid: 1')
+ end
+ end
+
+ context 'when passed a module or class (singleton) method object' do
+ module MyModuleUsingResult
+ def self.double(value)
+ Result.ok(value * 2)
+ end
+
+ def self.return_err(value)
+ Result.err("invalid: #{value}")
+ end
+
+ class MyClassUsingResult
+ def self.triple(value)
+ Result.ok(value * 3)
+ end
+ end
+ end
+
+ it 'returns last ok value in successful chain' do
+ initial_result = Result.ok(1)
+ final_result =
+ initial_result
+ .and_then(::MyModuleUsingResult.method(:double))
+ .and_then(::MyModuleUsingResult::MyClassUsingResult.method(:triple))
+
+ expect(final_result.ok?).to eq(true)
+ expect(final_result.unwrap).to eq(6)
+ end
+
+ it 'returns first err value in failed chain' do
+ initial_result = Result.ok(1)
+ final_result =
+ initial_result
+ .and_then(::MyModuleUsingResult.method(:double))
+ .and_then(::MyModuleUsingResult::MyClassUsingResult.method(:triple))
+ .and_then(::MyModuleUsingResult.method(:return_err))
+ .and_then(::MyModuleUsingResult.method(:double))
+
+ expect(final_result.err?).to eq(true)
+ expect(final_result.unwrap_err).to eq('invalid: 6')
+ end
+ end
+
+ describe 'type checking validation' do
+ describe 'enforcement of argument type' do
+ it 'raises TypeError if passed anything other than a lambda or singleton method object' do
+ ex = TypeError
+ msg = /expects a lambda or singleton method object/
+ # noinspection RubyMismatchedArgumentType
+ expect { Result.ok(1).and_then('string') }.to raise_error(ex, msg)
+ expect { Result.ok(1).and_then(proc { Result.ok(1) }) }.to raise_error(ex, msg)
+ expect { Result.ok(1).and_then(1.method(:to_s)) }.to raise_error(ex, msg)
+ expect { Result.ok(1).and_then(Integer.method(:to_s)) }.to raise_error(ex, msg)
+ end
+ end
+
+ describe 'enforcement of argument arity' do
+ it 'raises ArgumentError if passed lambda or singleton method object with an arity other than 1' do
+ expect do
+ Result.ok(1).and_then(->(a, b) { Result.ok(a + b) })
+ end.to raise_error(ArgumentError, /expects .* with a single argument \(arity of 1\)/)
+ end
+ end
+
+ describe 'enforcement that passed lambda or method returns a Result type' do
+ it 'raises ArgumentError if passed lambda or singleton method object which returns non-Result type' do
+ expect do
+ Result.ok(1).and_then(->(a) { a + 1 })
+ end.to raise_error(TypeError, /expects .* which returns a 'Result' type/)
+ end
+ end
+ end
+ end
+
+ describe 'usage of #map' do
+ context 'when passed a proc' do
+ it 'returns last ok value in successful chain' do
+ initial_result = Result.ok(1)
+ final_result =
+ initial_result
+ .map(->(value) { value + 1 })
+ .map(->(value) { value + 1 })
+
+ expect(final_result.ok?).to eq(true)
+ expect(final_result.unwrap).to eq(3)
+ end
+
+ it 'returns first err value in failed chain' do
+ initial_result = Result.ok(1)
+ final_result =
+ initial_result
+ .and_then(->(value) { Result.err("invalid: #{value}") })
+ .map(->(value) { value + 1 })
+
+ expect(final_result.err?).to eq(true)
+ expect(final_result.unwrap_err).to eq('invalid: 1')
+ end
+ end
+
+ context 'when passed a module or class (singleton) method object' do
+ module MyModuleNotUsingResult
+ def self.double(value)
+ value * 2
+ end
+
+ class MyClassNotUsingResult
+ def self.triple(value)
+ value * 3
+ end
+ end
+ end
+
+ it 'returns last ok value in successful chain' do
+ initial_result = Result.ok(1)
+ final_result =
+ initial_result
+ .map(::MyModuleNotUsingResult.method(:double))
+ .map(::MyModuleNotUsingResult::MyClassNotUsingResult.method(:triple))
+
+ expect(final_result.ok?).to eq(true)
+ expect(final_result.unwrap).to eq(6)
+ end
+
+ it 'returns first err value in failed chain' do
+ initial_result = Result.ok(1)
+ final_result =
+ initial_result
+ .map(::MyModuleNotUsingResult.method(:double))
+ .and_then(->(value) { Result.err("invalid: #{value}") })
+ .map(::MyModuleUsingResult.method(:double))
+
+ expect(final_result.err?).to eq(true)
+ expect(final_result.unwrap_err).to eq('invalid: 2')
+ end
+ end
+
+ describe 'type checking validation' do
+ describe 'enforcement of argument type' do
+ it 'raises TypeError if passed anything other than a lambda or singleton method object' do
+ ex = TypeError
+ msg = /expects a lambda or singleton method object/
+ # noinspection RubyMismatchedArgumentType
+ expect { Result.ok(1).map('string') }.to raise_error(ex, msg)
+ expect { Result.ok(1).map(proc { 1 }) }.to raise_error(ex, msg)
+ expect { Result.ok(1).map(1.method(:to_s)) }.to raise_error(ex, msg)
+ expect { Result.ok(1).map(Integer.method(:to_s)) }.to raise_error(ex, msg)
+ end
+ end
+
+ describe 'enforcement of argument arity' do
+ it 'raises ArgumentError if passed lambda or singleton method object with an arity other than 1' do
+ expect do
+ Result.ok(1).map(->(a, b) { a + b })
+ end.to raise_error(ArgumentError, /expects .* with a single argument \(arity of 1\)/)
+ end
+ end
+
+ describe 'enforcement that passed lambda or method does not return a Result type' do
+ it 'raises TypeError if passed lambda or singleton method object which returns non-Result type' do
+ expect do
+ Result.ok(1).map(->(a) { Result.ok(a + 1) })
+ end.to raise_error(TypeError, /expects .* which returns an unwrapped value, not a 'Result'/)
+ end
+ end
+ end
+ end
+
+ describe '#unwrap' do
+ it 'returns wrapped value if ok' do
+ expect(Result.ok(1).unwrap).to eq(1)
+ end
+
+ it 'raises error if err' do
+ expect { Result.err('error').unwrap }.to raise_error(RuntimeError, /called.*unwrap.*on an 'err' Result/i)
+ end
+ end
+
+ describe '#unwrap_err' do
+ it 'returns wrapped value if err' do
+ expect(Result.err('error').unwrap_err).to eq('error')
+ end
+
+ it 'raises error if ok' do
+ expect { Result.ok(1).unwrap_err }.to raise_error(RuntimeError, /called.*unwrap_err.*on an 'ok' Result/i)
+ end
+ end
+
+ describe '#==' do
+ it 'implements equality' do
+ expect(Result.ok(1)).to eq(Result.ok(1))
+ expect(Result.err('error')).to eq(Result.err('error'))
+ expect(Result.ok(1)).not_to eq(Result.ok(2))
+ expect(Result.err('error')).not_to eq(Result.err('other error'))
+ expect(Result.ok(1)).not_to eq(Result.err(1))
+ end
+ end
+
+ describe 'validation' do
+ context 'for enforcing usage of only public interface' do
+ context 'when private constructor is called with invalid params' do
+ it 'raises ArgumentError if both ok_value and err_value are passed' do
+ expect { Result.new(ok_value: :ignored, err_value: :ignored) }
+ .to raise_error(ArgumentError, 'Do not directly use private constructor, use Result.ok or Result.err')
+ end
+
+ it 'raises ArgumentError if neither ok_value nor err_value are passed' do
+ expect { Result.new }
+ .to raise_error(ArgumentError, 'Do not directly use private constructor, use Result.ok or Result.err')
+ end
+ end
+ end
+ end
+end
+# rubocop:enable RSpec/DescribedClass, Lint/ConstantDefinitionInBlock, RSpec/LeakyConstantDeclaration
diff --git a/spec/lib/search/navigation_spec.rb b/spec/lib/search/navigation_spec.rb
new file mode 100644
index 00000000000..da8c27b4990
--- /dev/null
+++ b/spec/lib/search/navigation_spec.rb
@@ -0,0 +1,280 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Search::Navigation, feature_category: :global_search do
+ let(:user) { instance_double(User) }
+ let(:project_double) { instance_double(Project) }
+ let(:options) { {} }
+ let(:search_navigation) { described_class.new(user: user, project: project, options: options) }
+
+ describe '#tab_enabled_for_project?' do
+ let(:project) { project_double }
+ let(:tab) { :blobs }
+
+ subject(:tab_enabled_for_project) { search_navigation.tab_enabled_for_project?(tab) }
+
+ context 'when user has ability for tab' do
+ before do
+ allow(search_navigation).to receive(:can?).with(user, :read_code, project_double).and_return(true)
+ end
+
+ it { is_expected.to eq(true) }
+ end
+
+ context 'when user does not have ability for tab' do
+ before do
+ allow(search_navigation).to receive(:can?).with(user, :read_code, project_double).and_return(false)
+ end
+
+ it { is_expected.to eq(false) }
+ end
+
+ context 'when an array of projects is provided' do
+ let(:project) { Array.wrap(project_double) }
+
+ before do
+ allow(search_navigation).to receive(:can?).with(user, :read_code, project_double).and_return(true)
+ end
+
+ it { is_expected.to eq(true) }
+ end
+
+ context 'when project is not present' do
+ let_it_be(:project) { nil }
+
+ it { is_expected.to eq(false) }
+ end
+ end
+
+ describe '#tabs' do
+ using RSpec::Parameterized::TableSyntax
+
+ before do
+ allow(search_navigation).to receive(:can?).and_return(true)
+ allow(search_navigation).to receive(:tab_enabled_for_project?).and_return(false)
+ allow(search_navigation).to receive(:feature_flag_tab_enabled?).and_return(false)
+ end
+
+ subject(:tabs) { search_navigation.tabs }
+
+ context 'for projects tab' do
+ where(:project, :condition) do
+ nil | true
+ ref(:project_double) | false
+ end
+
+ with_them do
+ it 'data item condition is set correctly' do
+ expect(tabs[:projects][:condition]).to eq(condition)
+ end
+ end
+ end
+
+ context 'for code tab' do
+ where(:feature_flag_enabled, :show_elasticsearch_tabs, :project, :tab_enabled, :condition) do
+ false | false | nil | false | false
+ true | true | nil | true | true
+ true | false | nil | false | false
+ false | true | nil | false | false
+ false | false | ref(:project_double) | true | true
+ true | false | ref(:project_double) | false | false
+ end
+
+ with_them do
+ let(:options) { { show_elasticsearch_tabs: show_elasticsearch_tabs } }
+
+ it 'data item condition is set correctly' do
+ allow(search_navigation).to receive(:feature_flag_tab_enabled?)
+ .with(:global_search_code_tab).and_return(feature_flag_enabled)
+ allow(search_navigation).to receive(:tab_enabled_for_project?).with(:blobs).and_return(tab_enabled)
+
+ expect(tabs[:blobs][:condition]).to eq(condition)
+ end
+ end
+ end
+
+ context 'for issues tab' do
+ where(:tab_enabled, :feature_flag_enabled, :project, :condition) do
+ false | false | nil | false
+ false | true | nil | true
+ false | true | ref(:project_double) | false
+ false | false | ref(:project_double) | false
+ true | false | nil | true
+ true | true | nil | true
+ true | false | ref(:project_double) | true
+ true | true | ref(:project_double) | true
+ end
+
+ with_them do
+ it 'data item condition is set correctly' do
+ allow(search_navigation).to receive(:feature_flag_tab_enabled?)
+ .with(:global_search_issues_tab).and_return(feature_flag_enabled)
+ allow(search_navigation).to receive(:tab_enabled_for_project?).with(:issues).and_return(tab_enabled)
+
+ expect(tabs[:issues][:condition]).to eq(condition)
+ end
+ end
+ end
+
+ context 'for merge requests tab' do
+ where(:tab_enabled, :feature_flag_enabled, :project, :condition) do
+ false | false | nil | false
+ true | false | nil | true
+ false | false | ref(:project_double) | false
+ true | false | ref(:project_double) | true
+ false | true | nil | true
+ true | true | nil | true
+ false | true | ref(:project_double) | false
+ true | true | ref(:project_double) | true
+ end
+
+ with_them do
+ it 'data item condition is set correctly' do
+ allow(search_navigation).to receive(:feature_flag_tab_enabled?)
+ .with(:global_search_merge_requests_tab).and_return(feature_flag_enabled)
+ allow(search_navigation).to receive(:tab_enabled_for_project?).with(:merge_requests).and_return(tab_enabled)
+
+ expect(tabs[:merge_requests][:condition]).to eq(condition)
+ end
+ end
+ end
+
+ context 'for wiki tab' do
+ where(:feature_flag_enabled, :show_elasticsearch_tabs, :project, :tab_enabled, :condition) do
+ false | false | nil | true | true
+ false | false | nil | false | false
+ false | false | ref(:project_double) | false | false
+ false | true | nil | false | false
+ false | true | ref(:project_double) | false | false
+ true | false | nil | false | false
+ true | true | ref(:project_double) | false | false
+ end
+
+ with_them do
+ let(:options) { { show_elasticsearch_tabs: show_elasticsearch_tabs } }
+
+ it 'data item condition is set correctly' do
+ allow(search_navigation).to receive(:feature_flag_tab_enabled?)
+ .with(:global_search_wiki_tab).and_return(feature_flag_enabled)
+ allow(search_navigation).to receive(:tab_enabled_for_project?).with(:wiki_blobs).and_return(tab_enabled)
+
+ expect(tabs[:wiki_blobs][:condition]).to eq(condition)
+ end
+ end
+ end
+
+ context 'for commits tab' do
+ where(:feature_flag_enabled, :show_elasticsearch_tabs, :project, :tab_enabled, :condition) do
+ false | false | nil | true | true
+ false | false | ref(:project_double) | true | true
+ false | false | nil | false | false
+ false | true | ref(:project_double) | false | false
+ false | true | nil | false | false
+ true | false | nil | false | false
+ true | false | ref(:project_double) | false | false
+ true | true | ref(:project_double) | false | false
+ true | true | nil | false | true
+ end
+
+ with_them do
+ let(:options) { { show_elasticsearch_tabs: show_elasticsearch_tabs } }
+
+ it 'data item condition is set correctly' do
+ allow(search_navigation).to receive(:feature_flag_tab_enabled?)
+ .with(:global_search_commits_tab).and_return(feature_flag_enabled)
+ allow(search_navigation).to receive(:tab_enabled_for_project?).with(:commits).and_return(tab_enabled)
+
+ expect(tabs[:commits][:condition]).to eq(condition)
+ end
+ end
+ end
+
+ context 'for comments tab' do
+ where(:tab_enabled, :show_elasticsearch_tabs, :project, :condition) do
+ true | true | nil | true
+ true | true | ref(:project_double) | true
+ false | false | nil | false
+ false | false | ref(:project_double) | false
+ false | true | nil | true
+ false | true | ref(:project_double) | false
+ true | false | nil | true
+ true | false | ref(:project_double) | true
+ end
+
+ with_them do
+ let(:options) { { show_elasticsearch_tabs: show_elasticsearch_tabs } }
+
+ it 'data item condition is set correctly' do
+ allow(search_navigation).to receive(:tab_enabled_for_project?).with(:notes).and_return(tab_enabled)
+
+ expect(tabs[:notes][:condition]).to eq(condition)
+ end
+ end
+ end
+
+ context 'for milestones tab' do
+ where(:project, :tab_enabled, :condition) do
+ ref(:project_double) | true | true
+ nil | false | true
+ ref(:project_double) | false | false
+ nil | true | true
+ end
+
+ with_them do
+ it 'data item condition is set correctly' do
+ allow(search_navigation).to receive(:tab_enabled_for_project?).with(:milestones).and_return(tab_enabled)
+
+ expect(tabs[:milestones][:condition]).to eq(condition)
+ end
+ end
+ end
+
+ context 'for users tab' do
+ where(:feature_flag_enabled, :can_read_users_list, :project, :tab_enabled, :condition) do
+ false | false | ref(:project_double) | true | true
+ false | false | nil | false | false
+ false | true | nil | false | false
+ false | true | ref(:project_double) | false | false
+ true | true | nil | false | true
+ true | true | ref(:project_double) | false | false
+ end
+
+ with_them do
+ it 'data item condition is set correctly' do
+ allow(search_navigation).to receive(:tab_enabled_for_project?).with(:users).and_return(tab_enabled)
+ allow(search_navigation).to receive(:can?)
+ .with(user, :read_users_list, project_double).and_return(can_read_users_list)
+ allow(search_navigation).to receive(:feature_flag_tab_enabled?)
+ .with(:global_search_users_tab).and_return(feature_flag_enabled)
+
+ expect(tabs[:users][:condition]).to eq(condition)
+ end
+ end
+ end
+
+ context 'for snippet_titles tab' do
+ where(:project, :show_snippets, :feature_flag_enabled, :condition) do
+ ref(:project_double) | true | false | false
+ nil | false | false | false
+ ref(:project_double) | false | false | false
+ nil | true | false | false
+ ref(:project_double) | true | true | false
+ nil | false | true | false
+ ref(:project_double) | false | true | false
+ nil | true | true | true
+ end
+
+ with_them do
+ let(:options) { { show_snippets: show_snippets } }
+
+ it 'data item condition is set correctly' do
+ allow(search_navigation).to receive(:feature_flag_tab_enabled?)
+ .with(:global_search_snippet_titles_tab).and_return(feature_flag_enabled)
+
+ expect(tabs[:snippet_titles][:condition]).to eq(condition)
+ 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
index 793f3066097..bbd66390403 100644
--- a/spec/lib/service_ping/devops_report_spec.rb
+++ b/spec/lib/service_ping/devops_report_spec.rb
@@ -4,7 +4,7 @@ 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(:subject) { described_class.new(Gitlab::Json.parse(data)) }
let_it_be(:devops_report) { DevOpsReport::Metric.new }
describe '#execute' do
diff --git a/spec/lib/sidebars/groups/super_sidebar_menus/analyze_menu_spec.rb b/spec/lib/sidebars/groups/super_sidebar_menus/analyze_menu_spec.rb
index 3d3d304a5a0..cc2809df85f 100644
--- a/spec/lib/sidebars/groups/super_sidebar_menus/analyze_menu_spec.rb
+++ b/spec/lib/sidebars/groups/super_sidebar_menus/analyze_menu_spec.rb
@@ -15,6 +15,8 @@ RSpec.describe Sidebars::Groups::SuperSidebarMenus::AnalyzeMenu, feature_categor
it 'defines list of NilMenuItem placeholders' do
expect(items.map(&:class).uniq).to eq([Sidebars::NilMenuItem])
expect(items.map(&:item_id)).to eq([
+ :analytics_dashboards,
+ :dashboards_analytics,
:cycle_analytics,
:ci_cd_analytics,
:contribution_analytics,
diff --git a/spec/lib/sidebars/organizations/menus/manage_menu_spec.rb b/spec/lib/sidebars/organizations/menus/manage_menu_spec.rb
new file mode 100644
index 00000000000..08fc352a6cd
--- /dev/null
+++ b/spec/lib/sidebars/organizations/menus/manage_menu_spec.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Sidebars::Organizations::Menus::ManageMenu, feature_category: :navigation do
+ let_it_be(:organization) { build(:organization) }
+ let_it_be(:user) { build(:user) }
+ let_it_be(:context) { Sidebars::Context.new(current_user: user, container: organization) }
+
+ let(:items) { subject.instance_variable_get(:@items) }
+
+ subject { described_class.new(context) }
+
+ it 'has title and sprite_icon' do
+ expect(subject.title).to eq(s_("Navigation|Manage"))
+ expect(subject.sprite_icon).to eq("users")
+ end
+
+ describe 'Menu items' do
+ subject { described_class.new(context).renderable_items.find { |e| e.item_id == item_id } }
+
+ describe 'Groups and projects' do
+ let(:item_id) { :organization_groups_and_projects }
+
+ it { is_expected.not_to be_nil }
+ end
+ end
+end
diff --git a/spec/lib/sidebars/organizations/menus/scope_menu_spec.rb b/spec/lib/sidebars/organizations/menus/scope_menu_spec.rb
new file mode 100644
index 00000000000..bc03787e95f
--- /dev/null
+++ b/spec/lib/sidebars/organizations/menus/scope_menu_spec.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Sidebars::Organizations::Menus::ScopeMenu, feature_category: :navigation do
+ let_it_be(:organization) { build(:organization) }
+ let_it_be(:user) { build(:user) }
+ let_it_be(:context) { Sidebars::Context.new(current_user: user, container: organization) }
+
+ it_behaves_like 'serializable as super_sidebar_menu_args' do
+ let(:menu) { described_class.new(context) }
+ let(:extra_attrs) do
+ {
+ title: s_('Organization|Organization overview'),
+ sprite_icon: 'organization',
+ super_sidebar_parent: ::Sidebars::StaticMenu,
+ item_id: :organization_overview
+ }
+ end
+ end
+end
diff --git a/spec/lib/sidebars/organizations/panel_spec.rb b/spec/lib/sidebars/organizations/panel_spec.rb
new file mode 100644
index 00000000000..1f0b8d72aef
--- /dev/null
+++ b/spec/lib/sidebars/organizations/panel_spec.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Sidebars::Organizations::Panel, feature_category: :navigation do
+ let_it_be(:organization) { build(:organization) }
+ let_it_be(:user) { build(:user) }
+ let_it_be(:context) { Sidebars::Context.new(current_user: user, container: organization) }
+
+ subject { described_class.new(context) }
+
+ it 'has a scope menu' do
+ expect(subject.scope_menu).to be_a(Sidebars::Organizations::Menus::ScopeMenu)
+ end
+
+ it_behaves_like 'a panel with uniquely identifiable menu items'
+end
diff --git a/spec/lib/sidebars/organizations/super_sidebar_panel_spec.rb b/spec/lib/sidebars/organizations/super_sidebar_panel_spec.rb
new file mode 100644
index 00000000000..99b33a5edf8
--- /dev/null
+++ b/spec/lib/sidebars/organizations/super_sidebar_panel_spec.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Sidebars::Organizations::SuperSidebarPanel, feature_category: :navigation do
+ let_it_be(:organization) { build(:organization) }
+ let_it_be(:user) { build(:user) }
+ let_it_be(:context) do
+ Sidebars::Context.new(
+ current_user: user,
+ container: organization
+ )
+ end
+
+ subject { described_class.new(context) }
+
+ it 'implements #super_sidebar_context_header' do
+ expect(subject.super_sidebar_context_header).to eq(
+ {
+ title: organization.name,
+ id: organization.id
+ })
+ end
+
+ describe '#renderable_menus' do
+ let(:category_menu) do
+ [
+ Sidebars::StaticMenu,
+ Sidebars::Organizations::Menus::ManageMenu
+ ]
+ end
+
+ it "is exposed as a renderable menu" do
+ expect(subject.instance_variable_get(:@menus).map(&:class)).to eq(category_menu)
+ end
+ end
+
+ it_behaves_like 'a panel with uniquely identifiable menu items'
+end
diff --git a/spec/lib/sidebars/panel_spec.rb b/spec/lib/sidebars/panel_spec.rb
index 2c1b9c73595..857cb1139b5 100644
--- a/spec/lib/sidebars/panel_spec.rb
+++ b/spec/lib/sidebars/panel_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
RSpec.describe Sidebars::Panel, feature_category: :navigation do
let(:context) { Sidebars::Context.new(current_user: nil, container: nil) }
- let(:panel) { Sidebars::Panel.new(context) }
+ let(:panel) { described_class.new(context) }
let(:menu1) { Sidebars::Menu.new(context) }
let(:menu2) { Sidebars::Menu.new(context) }
let(:menu3) { Sidebars::Menu.new(context) }
diff --git a/spec/lib/sidebars/projects/menus/deployments_menu_spec.rb b/spec/lib/sidebars/projects/menus/deployments_menu_spec.rb
index a63acdb5dc2..75f612e9c7c 100644
--- a/spec/lib/sidebars/projects/menus/deployments_menu_spec.rb
+++ b/spec/lib/sidebars/projects/menus/deployments_menu_spec.rb
@@ -68,5 +68,31 @@ RSpec.describe Sidebars::Projects::Menus::DeploymentsMenu, feature_category: :na
it_behaves_like 'access rights checks'
end
+
+ describe 'Pages' do
+ let(:item_id) { :pages }
+
+ before do
+ allow(project).to receive(:pages_available?).and_return(pages_enabled)
+ end
+
+ describe 'when pages are enabled' do
+ let(:pages_enabled) { true }
+
+ it { is_expected.not_to be_nil }
+
+ describe 'when the user does not have access' do
+ let(:user) { nil }
+
+ it { is_expected.to be_nil }
+ end
+ end
+
+ describe 'when pages are not enabled' do
+ let(:pages_enabled) { false }
+
+ it { is_expected.to be_nil }
+ end
+ end
end
end
diff --git a/spec/lib/sidebars/projects/menus/monitor_menu_spec.rb b/spec/lib/sidebars/projects/menus/monitor_menu_spec.rb
index 363822ee5e4..c0787aa9db5 100644
--- a/spec/lib/sidebars/projects/menus/monitor_menu_spec.rb
+++ b/spec/lib/sidebars/projects/menus/monitor_menu_spec.rb
@@ -7,7 +7,9 @@ RSpec.describe Sidebars::Projects::Menus::MonitorMenu, feature_category: :naviga
let(:user) { project.first_owner }
let(:show_cluster_hint) { true }
- let(:context) { Sidebars::Projects::Context.new(current_user: user, container: project, show_cluster_hint: show_cluster_hint) }
+ let(:context) do
+ Sidebars::Projects::Context.new(current_user: user, container: project, show_cluster_hint: show_cluster_hint)
+ end
subject { described_class.new(context) }
@@ -86,5 +88,19 @@ RSpec.describe Sidebars::Projects::Menus::MonitorMenu, feature_category: :naviga
it_behaves_like 'access rights checks'
end
+
+ describe 'Tracing' do
+ let(:item_id) { :tracing }
+
+ specify { is_expected.not_to be_nil }
+
+ describe 'when feature is disabled' do
+ before do
+ stub_feature_flags(observability_tracing: false)
+ end
+
+ specify { is_expected.to be_nil }
+ end
+ end
end
end
diff --git a/spec/lib/sidebars/projects/menus/settings_menu_spec.rb b/spec/lib/sidebars/projects/menus/settings_menu_spec.rb
index a60e46582f9..605cec8be5e 100644
--- a/spec/lib/sidebars/projects/menus/settings_menu_spec.rb
+++ b/spec/lib/sidebars/projects/menus/settings_menu_spec.rb
@@ -10,10 +10,6 @@ RSpec.describe Sidebars::Projects::Menus::SettingsMenu, feature_category: :navig
subject { described_class.new(context) }
- before do
- stub_feature_flags(show_pages_in_deployments_menu: false)
- end
-
describe '#render?' do
it 'returns false when menu does not have any menu items' do
allow(subject).to receive(:has_renderable_items?).and_return(false)
@@ -117,32 +113,6 @@ RSpec.describe Sidebars::Projects::Menus::SettingsMenu, feature_category: :navig
end
end
- describe 'Pages' do
- let(:item_id) { :pages }
-
- before do
- allow(project).to receive(:pages_available?).and_return(pages_enabled)
- end
-
- describe 'when pages are enabled' do
- let(:pages_enabled) { true }
-
- specify { is_expected.not_to be_nil }
-
- describe 'when the user does not have access' do
- let(:user) { nil }
-
- specify { is_expected.to be_nil }
- end
- end
-
- describe 'when pages are not enabled' do
- let(:pages_enabled) { false }
-
- specify { is_expected.to be_nil }
- end
- end
-
describe 'Merge requests' do
let(:item_id) { :merge_requests }
diff --git a/spec/lib/sidebars/projects/super_sidebar_menus/analyze_menu_spec.rb b/spec/lib/sidebars/projects/super_sidebar_menus/analyze_menu_spec.rb
index b7d05867d77..d459d47c31a 100644
--- a/spec/lib/sidebars/projects/super_sidebar_menus/analyze_menu_spec.rb
+++ b/spec/lib/sidebars/projects/super_sidebar_menus/analyze_menu_spec.rb
@@ -23,7 +23,8 @@ RSpec.describe Sidebars::Projects::SuperSidebarMenus::AnalyzeMenu, feature_categ
:code_review,
:merge_request_analytics,
:issues,
- :insights
+ :insights,
+ :model_experiments
])
end
end
diff --git a/spec/lib/sidebars/projects/super_sidebar_menus/deploy_menu_spec.rb b/spec/lib/sidebars/projects/super_sidebar_menus/deploy_menu_spec.rb
index 50eee173d31..98d62948ac3 100644
--- a/spec/lib/sidebars/projects/super_sidebar_menus/deploy_menu_spec.rb
+++ b/spec/lib/sidebars/projects/super_sidebar_menus/deploy_menu_spec.rb
@@ -18,8 +18,7 @@ RSpec.describe Sidebars::Projects::SuperSidebarMenus::DeployMenu, feature_catego
:releases,
:feature_flags,
:packages_registry,
- :container_registry,
- :model_experiments
+ :container_registry
])
end
end
diff --git a/spec/lib/sidebars/projects/super_sidebar_menus/monitor_menu_spec.rb b/spec/lib/sidebars/projects/super_sidebar_menus/monitor_menu_spec.rb
index e59062c7eaf..e5c5204e0b4 100644
--- a/spec/lib/sidebars/projects/super_sidebar_menus/monitor_menu_spec.rb
+++ b/spec/lib/sidebars/projects/super_sidebar_menus/monitor_menu_spec.rb
@@ -15,6 +15,7 @@ RSpec.describe Sidebars::Projects::SuperSidebarMenus::MonitorMenu, feature_categ
it 'defines list of NilMenuItem placeholders' do
expect(items.map(&:class).uniq).to eq([Sidebars::NilMenuItem])
expect(items.map(&:item_id)).to eq([
+ :tracing,
:error_tracking,
:alert_management,
:incidents,
diff --git a/spec/lib/slack/manifest_spec.rb b/spec/lib/slack/manifest_spec.rb
new file mode 100644
index 00000000000..d4fdea80ff5
--- /dev/null
+++ b/spec/lib/slack/manifest_spec.rb
@@ -0,0 +1,99 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Slack::Manifest, feature_category: :integrations do
+ describe '.to_h' do
+ it 'creates the correct manifest' do
+ expect(described_class.to_h).to eq({
+ display_information: {
+ name: "GitLab (#{Gitlab.config.gitlab.host})",
+ description: s_('SlackIntegration|Interact with GitLab without leaving your Slack workspace!'),
+ background_color: '#171321',
+ long_description: "Generated for #{Gitlab.config.gitlab.host} by GitLab #{Gitlab::VERSION}.\r\n\r\n" \
+ "- *Notifications:* Get notifications to your team's Slack channel about events " \
+ "happening inside your GitLab projects.\r\n\r\n- *Slash commands:* Quickly open, " \
+ 'access, or close issues from Slack using the `/gitlab` command. Streamline your ' \
+ 'GitLab deployments with ChatOps.'
+ },
+ features: {
+ app_home: {
+ home_tab_enabled: true,
+ messages_tab_enabled: false,
+ messages_tab_read_only_enabled: true
+ },
+ bot_user: {
+ display_name: 'GitLab',
+ always_online: true
+ },
+ slash_commands: [
+ {
+ command: '/gitlab',
+ url: "#{Gitlab.config.gitlab.url}/api/v4/slack/trigger",
+ description: 'GitLab slash commands',
+ usage_hint: 'your-project-name-or-alias command',
+ should_escape: false
+ }
+ ]
+ },
+ oauth_config: {
+ redirect_urls: [
+ Gitlab.config.gitlab.url
+ ],
+ scopes: {
+ bot: %w[
+ commands
+ chat:write
+ chat:write.public
+ ]
+ }
+ },
+ settings: {
+ event_subscriptions: {
+ request_url: "#{Gitlab.config.gitlab.url}/api/v4/integrations/slack/events",
+ bot_events: %w[
+ app_home_opened
+ ]
+ },
+ interactivity: {
+ is_enabled: true,
+ request_url: "#{Gitlab.config.gitlab.url}/api/v4/integrations/slack/interactions",
+ message_menu_options_url: "#{Gitlab.config.gitlab.url}/api/v4/integrations/slack/options"
+ },
+ org_deploy_enabled: false,
+ socket_mode_enabled: false,
+ token_rotation_enabled: false
+ }
+ })
+ end
+ end
+
+ describe '.to_json' do
+ subject(:to_json) { described_class.to_json }
+
+ shared_examples 'a manifest that matches the JSON schema' do
+ # JSON schema file downloaded from
+ # https://raw.githubusercontent.com/slackapi/manifest-schema/v0.0.0/schemas/manifest.schema.2.0.0.json
+ # via https://github.com/slackapi/manifest-schema.
+ it { is_expected.to match_schema('slack/manifest') }
+ end
+
+ it_behaves_like 'a manifest that matches the JSON schema'
+
+ context 'when the host name is very long' do
+ before do
+ allow(Gitlab.config.gitlab).to receive(:host).and_return('abc' * 20)
+ end
+
+ it_behaves_like 'a manifest that matches the JSON schema'
+ end
+ end
+
+ describe '.share_url' do
+ it 'URI encodes the manifest' do
+ allow(described_class).to receive(:to_h).and_return({ foo: 'bar' })
+
+ expect(described_class.share_url).to eq('https://api.slack.com/apps?new_app=1&manifest_json=%7B%22foo%22%3A%22bar%22%7D')
+ end
+ end
+end
diff --git a/spec/mailers/emails/in_product_marketing_spec.rb b/spec/mailers/emails/in_product_marketing_spec.rb
index 5419c9e6798..2d332dd99d6 100644
--- a/spec/mailers/emails/in_product_marketing_spec.rb
+++ b/spec/mailers/emails/in_product_marketing_spec.rb
@@ -80,7 +80,7 @@ RSpec.describe Emails::InProductMarketing do
is_expected.to have_body_text(message.subtitle)
is_expected.to have_body_text(CGI.unescapeHTML(message.cta_link))
- if track =~ /(create|verify)/
+ if /create|verify/.match?(track)
is_expected.to have_body_text(message.invite_text)
is_expected.to have_body_text(CGI.unescapeHTML(message.invite_link))
else
diff --git a/spec/mailers/emails/issues_spec.rb b/spec/mailers/emails/issues_spec.rb
index b5f3972f38e..b35e83dfb75 100644
--- a/spec/mailers/emails/issues_spec.rb
+++ b/spec/mailers/emails/issues_spec.rb
@@ -36,6 +36,15 @@ RSpec.describe Emails::Issues, feature_category: :team_planning do
expect(subject).to have_body_text "23, 34, 58"
end
+ it "shows issuable errors with column" do
+ @results = { success: 0, error_lines: [], parse_error: false,
+ preprocess_errors:
+ { milestone_errors: { missing: { header: 'Milestone', titles: %w[15.10 15.11] } } } }
+
+ expect(subject).to have_body_text "Could not find the following milestone values in \
+#{project.full_name}: 15.10, 15.11"
+ end
+
context 'with header and footer' do
let(:results) { { success: 165, error_lines: [], parse_error: false } }
diff --git a/spec/mailers/emails/projects_spec.rb b/spec/mailers/emails/projects_spec.rb
index ef3c21b32ce..1f0f09f7ca2 100644
--- a/spec/mailers/emails/projects_spec.rb
+++ b/spec/mailers/emails/projects_spec.rb
@@ -104,7 +104,6 @@ RSpec.describe Emails::Projects do
let_it_be(:environment) { create(:environment, project: project) }
let(:payload) { { 'gitlab_environment_name' => environment.name } }
- let(:metrics_url) { metrics_project_environment_url(project, environment) }
it_behaves_like 'an email sent from GitLab'
it_behaves_like 'it should not have Gmail Actions links'
@@ -131,7 +130,6 @@ RSpec.describe Emails::Projects do
let(:alert) { create(:alert_management_alert, :prometheus, :from_payload, payload: payload, project: project) }
let(:title) { "#{prometheus_alert.title} #{prometheus_alert.computed_operator} #{prometheus_alert.threshold}" }
- let(:metrics_url) { metrics_project_environment_url(project, environment) }
before do
payload['labels'] = {
@@ -157,7 +155,6 @@ RSpec.describe Emails::Projects do
is_expected.to have_body_text(environment.name)
is_expected.to have_body_text('Metric:')
is_expected.to have_body_text(prometheus_alert.full_query)
- is_expected.to have_body_text(metrics_url)
is_expected.not_to have_body_text('Description:')
end
end
diff --git a/spec/mailers/emails/releases_spec.rb b/spec/mailers/emails/releases_spec.rb
index e8ca9533256..4c92762e624 100644
--- a/spec/mailers/emails/releases_spec.rb
+++ b/spec/mailers/emails/releases_spec.rb
@@ -57,7 +57,7 @@ RSpec.describe Emails::Releases do
let(:release) { create(:release, project: project, description: "Attachment: [Test file](#{upload_path})") }
it 'renders absolute links' do
- is_expected.to have_body_text(%Q(<a href="#{project.web_url}#{upload_path}" data-canonical-src="#{upload_path}" data-link="true" class="gfm">Test file</a>))
+ is_expected.to have_body_text(%(<a href="#{project.web_url}#{upload_path}" data-canonical-src="#{upload_path}" data-link="true" class="gfm">Test file</a>))
end
end
end
diff --git a/spec/mailers/emails/service_desk_spec.rb b/spec/mailers/emails/service_desk_spec.rb
index 22b910b3dae..8c0efe3f480 100644
--- a/spec/mailers/emails/service_desk_spec.rb
+++ b/spec/mailers/emails/service_desk_spec.rb
@@ -340,8 +340,8 @@ RSpec.describe Emails::ServiceDesk, feature_category: :service_desk do
end
end
- let_it_be(:expected_html) { %Q(a new comment with <a href="#{project.web_url}#{upload_path}" data-canonical-src="#{upload_path}" data-link="true" class="gfm">#{filename}</a>) }
- let_it_be(:expected_template_html) { %Q(some text #{expected_html}) }
+ let_it_be(:expected_html) { %(a new comment with <a href="#{project.web_url}#{upload_path}" data-canonical-src="#{upload_path}" data-link="true" class="gfm">#{filename}</a>) }
+ let_it_be(:expected_template_html) { %(some text #{expected_html}) }
it_behaves_like 'a service desk notification email'
it_behaves_like 'a service desk notification email with template content', 'new_note'
@@ -357,7 +357,7 @@ RSpec.describe Emails::ServiceDesk, feature_category: :service_desk do
end
context 'when upload name is not changed in markdown' do
- let_it_be(:expected_template_html) { %Q(some text a new comment with <strong>#{filename}</strong>) }
+ let_it_be(:expected_template_html) { %(some text a new comment with <strong>#{filename}</strong>) }
it_behaves_like 'a service desk notification email', 1
it_behaves_like 'a service desk notification email with template content', 'new_note', 1
@@ -366,9 +366,9 @@ RSpec.describe Emails::ServiceDesk, feature_category: :service_desk do
context 'when upload name is changed in markdown' do
let_it_be(:upload_name_in_markdown) { 'Custom name' }
let_it_be(:note) { create(:note_on_issue, noteable: issue, project: project, note: "a new comment with [#{upload_name_in_markdown}](#{upload_path})") }
- let_it_be(:expected_text) { %Q(a new comment with [#{upload_name_in_markdown}](#{upload_path})) }
- let_it_be(:expected_html) { %Q(a new comment with <strong>#{upload_name_in_markdown} (#{filename})</strong>) }
- let_it_be(:expected_template_html) { %Q(some text #{expected_html}) }
+ let_it_be(:expected_text) { %(a new comment with [#{upload_name_in_markdown}](#{upload_path})) }
+ let_it_be(:expected_html) { %(a new comment with <strong>#{upload_name_in_markdown} (#{filename})</strong>) }
+ let_it_be(:expected_template_html) { %(some text #{expected_html}) }
it_behaves_like 'a service desk notification email', 1
it_behaves_like 'a service desk notification email with template content', 'new_note', 1
@@ -392,16 +392,16 @@ RSpec.describe Emails::ServiceDesk, feature_category: :service_desk do
let_it_be(:upload_1) { create(:upload, :issuable_upload, :with_file, model: note.project, path: path_1, secret: secret_1) }
- let_it_be(:expected_html) { %Q(a new comment with <strong>#{filename}</strong> <strong>#{filename_1}</strong>) }
- let_it_be(:expected_template_html) { %Q(some text #{expected_html}) }
+ let_it_be(:expected_html) { %(a new comment with <strong>#{filename}</strong> <strong>#{filename_1}</strong>) }
+ let_it_be(:expected_template_html) { %(some text #{expected_html}) }
it_behaves_like 'a service desk notification email', 2
it_behaves_like 'a service desk notification email with template content', 'new_note', 2
end
context 'when not all uploads processed correct' do
- let_it_be(:expected_html) { %Q(a new comment with <strong>#{filename}</strong> <a href="#{project.web_url}#{upload_path_1}" data-canonical-src="#{upload_path_1}" data-link="true" class="gfm">#{filename_1}</a>) }
- let_it_be(:expected_template_html) { %Q(some text #{expected_html}) }
+ let_it_be(:expected_html) { %(a new comment with <strong>#{filename}</strong> <a href="#{project.web_url}#{upload_path_1}" data-canonical-src="#{upload_path_1}" data-link="true" class="gfm">#{filename_1}</a>) }
+ let_it_be(:expected_template_html) { %(some text #{expected_html}) }
it_behaves_like 'a service desk notification email', 1
it_behaves_like 'a service desk notification email with template content', 'new_note', 1
@@ -417,7 +417,7 @@ RSpec.describe Emails::ServiceDesk, feature_category: :service_desk do
expect(Gitlab::ErrorTracking).to receive(:track_exception).with(StandardError, project_id: note.project_id)
end
- let_it_be(:expected_template_html) { %Q(some text a new comment with <a href="#{project.web_url}#{upload_path}" data-canonical-src="#{upload_path}" data-link="true" class="gfm">#{filename}</a>) }
+ let_it_be(:expected_template_html) { %(some text a new comment with <a href="#{project.web_url}#{upload_path}" data-canonical-src="#{upload_path}" data-link="true" class="gfm">#{filename}</a>) }
it_behaves_like 'a service desk notification email with template content', 'new_note'
end
@@ -430,7 +430,7 @@ RSpec.describe Emails::ServiceDesk, feature_category: :service_desk do
expect(Gitlab::ErrorTracking).to receive(:track_exception).with(StandardError, project_id: note.project_id)
end
- let_it_be(:expected_template_html) { %Q(some text a new comment with <a href="#{project.web_url}#{upload_path}" data-canonical-src="#{upload_path}" data-link="true" class="gfm">#{filename}</a>) }
+ let_it_be(:expected_template_html) { %(some text a new comment with <a href="#{project.web_url}#{upload_path}" data-canonical-src="#{upload_path}" data-link="true" class="gfm">#{filename}</a>) }
it_behaves_like 'a service desk notification email with template content', 'new_note'
end
diff --git a/spec/mailers/notify_spec.rb b/spec/mailers/notify_spec.rb
index 372808b64d3..629dfdaf55e 100644
--- a/spec/mailers/notify_spec.rb
+++ b/spec/mailers/notify_spec.rb
@@ -109,8 +109,14 @@ RSpec.describe Notify do
is_expected.to have_body_text issue.description
end
- it 'does not add a reason header' do
- is_expected.not_to have_header('X-GitLab-NotificationReason', /.+/)
+ context 'when issue is confidential' do
+ before do
+ issue.update_attribute(:confidential, true)
+ end
+
+ it 'has a confidential header set to true' do
+ is_expected.to have_header('X-GitLab-ConfidentialIssue', 'true')
+ end
end
context 'when sent with a reason' do
@@ -819,6 +825,10 @@ RSpec.describe Notify do
let_it_be(:second_note) { create(:discussion_note_on_issue, in_reply_to: first_note, project: project) }
let_it_be(:third_note) { create(:discussion_note_on_issue, in_reply_to: second_note, project: project) }
+ before_all do
+ first_note.noteable.update_attribute(:confidential, "true")
+ end
+
subject { described_class.note_issue_email(recipient.id, third_note.id) }
it_behaves_like 'an email sent to a user'
@@ -840,17 +850,29 @@ RSpec.describe Notify do
it 'has X-GitLab-Discussion-ID header' do
expect(subject.header['X-GitLab-Discussion-ID'].value).to eq(third_note.discussion.id)
end
+
+ it 'has a confidential header set to true' do
+ is_expected.to have_header('X-GitLab-ConfidentialIssue', 'true')
+ end
end
context 'individual issue comments' do
let_it_be(:note) { create(:note_on_issue, project: project) }
+ before_all do
+ note.noteable.update_attribute(:confidential, "true")
+ end
+
subject { described_class.note_issue_email(recipient.id, note.id) }
it_behaves_like 'an email sent to a user'
it_behaves_like 'appearance header and footer enabled'
it_behaves_like 'appearance header and footer not enabled'
+ it 'has a confidential header set to true' do
+ expect(subject.header['X-GitLab-ConfidentialIssue'].value).to eq('true')
+ end
+
it 'has In-Reply-To header pointing to the issue' do
expect(subject.header['In-Reply-To'].message_ids).to eq(["issue_#{note.noteable.id}@#{host}"])
end
@@ -1572,16 +1594,22 @@ RSpec.describe Notify do
context 'when custom email is enabled' do
let_it_be(:credentials) { create(:service_desk_custom_email_credential, project: project) }
+ let_it_be(:verification) { create(:service_desk_custom_email_verification, project: project) }
let_it_be(:settings) do
create(
:service_desk_setting,
project: project,
- custom_email_enabled: true,
custom_email: 'supersupport@example.com'
)
end
+ before_all do
+ verification.mark_as_finished!
+ project.reset
+ settings.update!(custom_email_enabled: true)
+ end
+
it 'uses custom email and service bot name in "from" header' do
expect_sender(User.support_bot, sender_email: 'supersupport@example.com')
end
@@ -1630,22 +1658,23 @@ RSpec.describe Notify do
end
context 'when custom email is enabled' do
- let_it_be(:credentials) do
- create(
- :service_desk_custom_email_credential,
- project: project
- )
- end
+ let_it_be(:credentials) { create(:service_desk_custom_email_credential, project: project) }
+ let_it_be(:verification) { create(:service_desk_custom_email_verification, project: project) }
let_it_be(:settings) do
create(
:service_desk_setting,
project: project,
- custom_email_enabled: true,
custom_email: 'supersupport@example.com'
)
end
+ before_all do
+ verification.mark_as_finished!
+ project.reset
+ settings.update!(custom_email_enabled: true)
+ end
+
it 'uses custom email and author\'s name in "from" header' do
expect_sender(first_note.author, sender_email: project.service_desk_setting.custom_email)
end
diff --git a/spec/metrics_server/metrics_server_spec.rb b/spec/metrics_server/metrics_server_spec.rb
index ad80835549f..baf15a773b1 100644
--- a/spec/metrics_server/metrics_server_spec.rb
+++ b/spec/metrics_server/metrics_server_spec.rb
@@ -69,136 +69,29 @@ RSpec.describe MetricsServer, feature_category: :application_performance do # ru
end
describe '.spawn' do
- 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)
-
- pid = described_class.spawn(target, metrics_dir: metrics_dir)
-
- expect(pid).to eq(99)
- end
+ let(:expected_env) do
+ {
+ 'METRICS_SERVER_TARGET' => target,
+ 'WIPE_METRICS_DIR' => '0',
+ 'GITLAB_CONFIG' => 'path/to/config/gitlab.yml'
+ }
end
- context 'for Golang server' do
- let(:log_enabled) { false }
- let(:settings) do
- GitlabSettings::Options.build(
- {
- '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
- {
- 'GOGC' => '10',
- 'GME_MMAP_METRICS_DIR' => metrics_dir,
- 'GME_PROBES' => 'self,mmap,mmap_stats',
- '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,
- '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, path: '/path/to/gme/')
- end
+ before do
+ stub_env('GITLAB_CONFIG', 'path/to/config/gitlab.yml')
+ 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
+ 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)
- context 'when TLS settings are present' do
- before do
- settings.web_exporter['tls_enabled'] = true
- settings.web_exporter['tls_cert_path'] = '/path/to/cert.pem'
- settings.web_exporter['tls_key_path'] = '/path/to/key.pem'
+ pid = described_class.spawn(target, metrics_dir: metrics_dir)
- settings.sidekiq_exporter['tls_enabled'] = true
- settings.sidekiq_exporter['tls_cert_path'] = '/path/to/cert.pem'
- settings.sidekiq_exporter['tls_key_path'] = '/path/to/key.pem'
- end
-
- it 'sets the correct environment variables' do
- expect(Process).to receive(:spawn).with(
- expected_env.merge(
- 'GME_CERT_FILE' => '/path/to/cert.pem',
- 'GME_CERT_KEY' => '/path/to/key.pem'
- ),
- '/path/to/gme/gitlab-metrics-exporter',
- hash_including(pgroup: true)
- ).and_return(99)
-
- described_class.spawn(target, metrics_dir: metrics_dir, path: '/path/to/gme/')
- end
- end
+ expect(pid).to eq(99)
end
end
end
@@ -214,21 +107,10 @@ RSpec.describe MetricsServer, feature_category: :application_performance do # ru
end
describe '.spawn' do
- 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
+ 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
end
@@ -345,21 +227,10 @@ RSpec.describe MetricsServer, feature_category: :application_performance do # ru
end
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)
+ it 'forks the parent process' do
+ expect(Process).to receive(:fork).and_return(42)
- 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
+ described_class.start_for_sidekiq(metrics_dir: '/path/to/metrics')
end
end
diff --git a/spec/migrations/20230523101514_finalize_user_type_migration_spec.rb b/spec/migrations/20230523101514_finalize_user_type_migration_spec.rb
index abf3a506748..01c05c38098 100644
--- a/spec/migrations/20230523101514_finalize_user_type_migration_spec.rb
+++ b/spec/migrations/20230523101514_finalize_user_type_migration_spec.rb
@@ -5,7 +5,14 @@ require_migration!
RSpec.describe FinalizeUserTypeMigration, feature_category: :devops_reports do
it 'finalizes MigrateHumanUserType migration' do
- expect(described_class).to be_finalize_background_migration_of('MigrateHumanUserType')
+ expect_next_instance_of(described_class) do |instance|
+ expect(instance).to receive(:ensure_batched_background_migration_is_finished).with(
+ job_class_name: 'MigrateHumanUserType',
+ table_name: :users,
+ column_name: :id,
+ job_arguments: []
+ )
+ end
migrate!
end
diff --git a/spec/migrations/20230530012406_finalize_backfill_resource_link_events_spec.rb b/spec/migrations/20230530012406_finalize_backfill_resource_link_events_spec.rb
new file mode 100644
index 00000000000..0298b470ac8
--- /dev/null
+++ b/spec/migrations/20230530012406_finalize_backfill_resource_link_events_spec.rb
@@ -0,0 +1,68 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe FinalizeBackfillResourceLinkEvents, feature_category: :team_planning do
+ let(:batched_migrations) { table(:batched_background_migrations) }
+
+ context 'when migration is missing' do
+ before do
+ batched_migrations.where(job_class_name: described_class::MIGRATION).delete_all
+ end
+
+ it 'warns migration not found' do
+ expect(Gitlab::AppLogger)
+ .to receive(:warn).with(/Could not find batched background migration for the given configuration:/)
+ .once
+
+ migrate!
+ end
+ end
+
+ context 'with migration present' do
+ let!(:batched_migration) do
+ batched_migrations.create!(
+ job_class_name: described_class::MIGRATION,
+ table_name: :system_note_metadata,
+ column_name: :id,
+ interval: 2.minutes,
+ min_value: 1,
+ max_value: 5,
+ batch_size: 5,
+ sub_batch_size: 5,
+ gitlab_schema: :gitlab_main,
+ status: status
+ )
+ end
+
+ context 'when migrations have finished' do
+ let(:status) { 3 } # finished enum value
+
+ it 'does not raise an error' do
+ expect { migrate! }.not_to raise_error
+ end
+ end
+
+ context 'with different migration statuses' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:status, :description) do
+ 0 | 'paused'
+ 1 | 'active'
+ 4 | 'failed'
+ 5 | 'finalizing'
+ end
+
+ with_them do
+ it 'finalizes the migration' do
+ expect do
+ migrate!
+
+ batched_migration.reload
+ end.to change { batched_migration.status }.from(status).to(3)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/migrations/20230613192703_ensure_ci_build_needs_big_int_backfill_is_finished_for_self_hosts_spec.rb b/spec/migrations/20230613192703_ensure_ci_build_needs_big_int_backfill_is_finished_for_self_hosts_spec.rb
new file mode 100644
index 00000000000..0fe9cecb729
--- /dev/null
+++ b/spec/migrations/20230613192703_ensure_ci_build_needs_big_int_backfill_is_finished_for_self_hosts_spec.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe EnsureCiBuildNeedsBigIntBackfillIsFinishedForSelfHosts, migration: :gitlab_ci, feature_category: :continuous_integration do
+ describe '#up' do
+ let(:migration_arguments) do
+ {
+ job_class_name: 'CopyColumnUsingBackgroundMigrationJob',
+ table_name: 'ci_build_needs',
+ column_name: 'id',
+ job_arguments: [['id'], ['id_convert_to_bigint']]
+ }
+ end
+
+ it 'ensures the migration is completed' do
+ expect_next_instance_of(described_class) do |instance|
+ expect(instance).to receive(:ensure_batched_background_migration_is_finished).with(migration_arguments)
+ end
+
+ migrate!
+ end
+ end
+end
diff --git a/spec/migrations/20230613192703_swap_ci_build_needs_to_big_int_for_self_hosts_spec.rb b/spec/migrations/20230613192703_swap_ci_build_needs_to_big_int_for_self_hosts_spec.rb
new file mode 100644
index 00000000000..3db5d3b3c16
--- /dev/null
+++ b/spec/migrations/20230613192703_swap_ci_build_needs_to_big_int_for_self_hosts_spec.rb
@@ -0,0 +1,146 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe SwapCiBuildNeedsToBigIntForSelfHosts, feature_category: :continuous_integration do
+ after do
+ connection = described_class.new.connection
+ connection.execute('ALTER TABLE ci_build_needs DROP COLUMN IF EXISTS id_convert_to_bigint')
+ end
+
+ describe '#up' do
+ context 'when on GitLab.com, dev, or test' do
+ before do
+ connection = described_class.new.connection
+ connection.execute('ALTER TABLE ci_build_needs ALTER COLUMN id TYPE bigint')
+ connection.execute('ALTER TABLE ci_build_needs DROP COLUMN IF EXISTS id_convert_to_bigint')
+ end
+
+ it 'does not swap the columns' do
+ # rubocop: disable RSpec/AnyInstanceOf
+ allow_any_instance_of(described_class).to receive(:com_or_dev_or_test_but_not_jh?).and_return(true)
+ # rubocop: enable RSpec/AnyInstanceOf
+
+ ci_build_needs = table(:ci_build_needs)
+
+ disable_migrations_output do
+ reversible_migration do |migration|
+ migration.before -> {
+ ci_build_needs.reset_column_information
+
+ expect(ci_build_needs.columns.find { |c| c.name == 'id' }.sql_type).to eq('bigint')
+ expect(ci_build_needs.columns.find { |c| c.name == 'id_convert_to_bigint' }).to be nil
+ }
+
+ migration.after -> {
+ ci_build_needs.reset_column_information
+
+ expect(ci_build_needs.columns.find { |c| c.name == 'id' }.sql_type).to eq('bigint')
+ expect(ci_build_needs.columns.find { |c| c.name == 'id_convert_to_bigint' }).to be nil
+ }
+ end
+ end
+ end
+ end
+
+ context 'when a self-hosted installation has already completed the swap' do
+ before do
+ connection = described_class.new.connection
+ connection.execute('ALTER TABLE ci_build_needs ALTER COLUMN id TYPE bigint')
+ connection.execute('ALTER TABLE ci_build_needs ADD COLUMN IF NOT EXISTS id_convert_to_bigint integer')
+ end
+
+ it 'does not swap the columns' do
+ # rubocop: disable RSpec/AnyInstanceOf
+ allow_any_instance_of(described_class).to receive(:com_or_dev_or_test_but_not_jh?).and_return(false)
+ # rubocop: enable RSpec/AnyInstanceOf
+
+ ci_build_needs = table(:ci_build_needs)
+
+ migrate!
+
+ expect(ci_build_needs.columns.find { |c| c.name == 'id' }.sql_type).to eq('bigint')
+ expect(ci_build_needs.columns.find do |c|
+ c.name == 'id_convert_to_bigint'
+ end.sql_type).to eq('integer')
+ end
+ end
+
+ context 'when a self-hosted installation has the `id_convert_to_bigint` column already dropped' do
+ before do
+ connection = described_class.new.connection
+ connection.execute('ALTER TABLE ci_build_needs ALTER COLUMN id TYPE bigint')
+ connection.execute('ALTER TABLE ci_build_needs DROP COLUMN IF EXISTS id_convert_to_bigint')
+ end
+
+ it 'does not swap the columns' do
+ # rubocop: disable RSpec/AnyInstanceOf
+ allow_any_instance_of(described_class).to receive(:com_or_dev_or_test_but_not_jh?).and_return(false)
+ # rubocop: enable RSpec/AnyInstanceOf
+
+ ci_build_needs = table(:ci_build_needs)
+
+ disable_migrations_output do
+ reversible_migration do |migration|
+ migration.before -> {
+ ci_build_needs.reset_column_information
+
+ expect(ci_build_needs.columns.find { |c| c.name == 'id' }.sql_type).to eq('bigint')
+ expect(ci_build_needs.columns.find { |c| c.name == 'id_convert_to_bigint' }).to be nil
+ }
+
+ migration.after -> {
+ ci_build_needs.reset_column_information
+
+ expect(ci_build_needs.columns.find { |c| c.name == 'id' }.sql_type).to eq('bigint')
+ expect(ci_build_needs.columns.find { |c| c.name == 'id_convert_to_bigint' }).to be nil
+ }
+ end
+ end
+ end
+ end
+
+ context 'when an installation is self-hosted' do
+ before do
+ connection = described_class.new.connection
+ connection.execute('ALTER TABLE ci_build_needs ALTER COLUMN id TYPE integer')
+ connection.execute('ALTER TABLE ci_build_needs ADD COLUMN IF NOT EXISTS id_convert_to_bigint bigint')
+ connection.execute('ALTER TABLE ci_build_needs ALTER COLUMN id_convert_to_bigint TYPE bigint')
+ connection.execute('DROP INDEX IF EXISTS index_ci_build_needs_on_id_convert_to_bigint')
+ connection.execute('CREATE OR REPLACE FUNCTION trigger_3207b8d0d6f3() RETURNS trigger LANGUAGE plpgsql AS $$
+ BEGIN NEW."id_convert_to_bigint" := NEW."id"; RETURN NEW; END; $$;')
+ end
+
+ it 'swaps the columns' do
+ # rubocop: disable RSpec/AnyInstanceOf
+ allow_any_instance_of(described_class).to receive(:com_or_dev_or_test_but_not_jh?).and_return(false)
+ # rubocop: enable RSpec/AnyInstanceOf
+
+ ci_build_needs = table(:ci_build_needs)
+
+ disable_migrations_output do
+ reversible_migration do |migration|
+ migration.before -> {
+ ci_build_needs.reset_column_information
+
+ expect(ci_build_needs.columns.find { |c| c.name == 'id' }.sql_type).to eq('integer')
+ expect(ci_build_needs.columns.find do |c|
+ c.name == 'id_convert_to_bigint'
+ end.sql_type).to eq('bigint')
+ }
+
+ migration.after -> {
+ ci_build_needs.reset_column_information
+
+ expect(ci_build_needs.columns.find { |c| c.name == 'id' }.sql_type).to eq('bigint')
+ expect(ci_build_needs.columns.find do |c|
+ c.name == 'id_convert_to_bigint'
+ end.sql_type).to eq('integer')
+ }
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/migrations/20230616082958_add_unique_index_for_npm_packages_on_project_id_name_version_spec.rb b/spec/migrations/20230616082958_add_unique_index_for_npm_packages_on_project_id_name_version_spec.rb
new file mode 100644
index 00000000000..c7c97b16f97
--- /dev/null
+++ b/spec/migrations/20230616082958_add_unique_index_for_npm_packages_on_project_id_name_version_spec.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe AddUniqueIndexForNpmPackagesOnProjectIdNameVersion, feature_category: :package_registry do
+ it 'schedules an index creation' do
+ reversible_migration do |migration|
+ migration.before -> {
+ expect(ActiveRecord::Base.connection.indexes('packages_packages').map(&:name))
+ .not_to include('idx_packages_on_project_id_name_version_unique_when_npm')
+ }
+
+ migration.after -> {
+ expect(ActiveRecord::Base.connection.indexes('packages_packages').map(&:name))
+ .to include('idx_packages_on_project_id_name_version_unique_when_npm')
+ }
+ end
+ end
+end
diff --git a/spec/migrations/20230621070810_update_requeue_workers_in_application_settings_for_gitlab_com_spec.rb b/spec/migrations/20230621070810_update_requeue_workers_in_application_settings_for_gitlab_com_spec.rb
new file mode 100644
index 00000000000..763d9ea610c
--- /dev/null
+++ b/spec/migrations/20230621070810_update_requeue_workers_in_application_settings_for_gitlab_com_spec.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe UpdateRequeueWorkersInApplicationSettingsForGitlabCom, feature_category: :global_search do
+ let(:settings) { table(:application_settings) }
+
+ describe "#up" do
+ it 'does nothing' do
+ record = settings.create!
+
+ expect { migrate! }.not_to change { record.reload.elasticsearch_requeue_workers }
+ end
+
+ it 'updates elasticsearch_requeue_workers when gitlab.com' do
+ allow(Gitlab).to receive(:com?).and_return(true)
+
+ record = settings.create!
+
+ expect { migrate! }.to change { record.reload.elasticsearch_requeue_workers }.from(false).to(true)
+ end
+ end
+
+ describe "#down" do
+ it 'does nothing' do
+ record = settings.create!(elasticsearch_requeue_workers: true)
+
+ migrate!
+
+ expect { schema_migrate_down! }.not_to change { record.reload.elasticsearch_requeue_workers }
+ end
+
+ it 'updates elasticsearch_requeue_workers when gitlab.com' do
+ allow(Gitlab).to receive(:com?).and_return(true)
+
+ record = settings.create!(elasticsearch_requeue_workers: true)
+
+ migrate!
+
+ expect { schema_migrate_down! }.to change { record.reload.elasticsearch_requeue_workers }.from(true).to(false)
+ end
+ end
+end
diff --git a/spec/migrations/20230621074611_update_elasticsearch_number_of_shards_in_application_settings_for_gitlab_com_spec.rb b/spec/migrations/20230621074611_update_elasticsearch_number_of_shards_in_application_settings_for_gitlab_com_spec.rb
new file mode 100644
index 00000000000..80a1f9f59e2
--- /dev/null
+++ b/spec/migrations/20230621074611_update_elasticsearch_number_of_shards_in_application_settings_for_gitlab_com_spec.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe UpdateElasticsearchNumberOfShardsInApplicationSettingsForGitlabCom, feature_category: :global_search do
+ let(:settings) { table(:application_settings) }
+
+ describe "#up" do
+ it 'does nothing when not in gitlab.com' do
+ record = settings.create!
+
+ expect { migrate! }.not_to change { record.reload.elasticsearch_worker_number_of_shards }
+ end
+
+ it 'updates elasticsearch_worker_number_of_shards when gitlab.com' do
+ allow(Gitlab).to receive(:com?).and_return(true)
+
+ record = settings.create!
+
+ expect { migrate! }.to change { record.reload.elasticsearch_worker_number_of_shards }.from(2).to(16)
+ end
+ end
+
+ describe "#down" do
+ it 'does nothing when not in gitlab.com' do
+ record = settings.create!(elasticsearch_worker_number_of_shards: 16)
+
+ migrate!
+
+ expect { schema_migrate_down! }.not_to change { record.reload.elasticsearch_worker_number_of_shards }
+ end
+
+ it 'updates elasticsearch_worker_number_of_shards when gitlab.com' do
+ allow(Gitlab).to receive(:com?).and_return(true)
+
+ record = settings.create!(elasticsearch_worker_number_of_shards: 16)
+
+ migrate!
+
+ expect { schema_migrate_down! }.to change { record.reload.elasticsearch_worker_number_of_shards }.from(16).to(2)
+ end
+ end
+end
diff --git a/spec/migrations/20230628023103_queue_backfill_missing_ci_cd_settings_spec.rb b/spec/migrations/20230628023103_queue_backfill_missing_ci_cd_settings_spec.rb
new file mode 100644
index 00000000000..f6c470260ff
--- /dev/null
+++ b/spec/migrations/20230628023103_queue_backfill_missing_ci_cd_settings_spec.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe QueueBackfillMissingCiCdSettings, feature_category: :source_code_management do
+ let!(:batched_migration) { described_class::MIGRATION }
+
+ it 'schedules a new batched migration' do
+ reversible_migration do |migration|
+ migration.before -> {
+ expect(batched_migration).not_to have_scheduled_batched_migration
+ }
+
+ migration.after -> {
+ expect(batched_migration).to have_scheduled_batched_migration(
+ table_name: :projects,
+ column_name: :id,
+ interval: described_class::DELAY_INTERVAL,
+ batch_size: described_class::BATCH_SIZE,
+ sub_batch_size: described_class::SUB_BATCH_SIZE
+ )
+ }
+ end
+ end
+end
diff --git a/spec/migrations/20230629095819_queue_backfill_uuid_conversion_column_in_vulnerability_occurrences_spec.rb b/spec/migrations/20230629095819_queue_backfill_uuid_conversion_column_in_vulnerability_occurrences_spec.rb
new file mode 100644
index 00000000000..eb9a131008a
--- /dev/null
+++ b/spec/migrations/20230629095819_queue_backfill_uuid_conversion_column_in_vulnerability_occurrences_spec.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe QueueBackfillUuidConversionColumnInVulnerabilityOccurrences, feature_category: :vulnerability_management do
+ let!(:batched_migration) { described_class::MIGRATION }
+
+ it 'schedules a new batched migration' do
+ reversible_migration do |migration|
+ migration.before -> {
+ expect(batched_migration).not_to have_scheduled_batched_migration
+ }
+
+ migration.after -> {
+ expect(batched_migration).to have_scheduled_batched_migration(
+ table_name: :vulnerability_occurrences,
+ column_name: :id,
+ interval: described_class::DELAY_INTERVAL,
+ batch_size: described_class::BATCH_SIZE,
+ sub_batch_size: described_class::SUB_BATCH_SIZE
+ )
+ }
+ end
+ end
+end
diff --git a/spec/migrations/20230703024031_cleanup_project_pipeline_status_key_spec.rb b/spec/migrations/20230703024031_cleanup_project_pipeline_status_key_spec.rb
new file mode 100644
index 00000000000..4232162134a
--- /dev/null
+++ b/spec/migrations/20230703024031_cleanup_project_pipeline_status_key_spec.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe CleanupProjectPipelineStatusKey, feature_category: :redis do
+ it 'enqueues a RedisMigrationWorker job from cursor 0' do
+ expect(RedisMigrationWorker).to receive(:perform_async).with('BackfillProjectPipelineStatusTtl', '0')
+
+ migrate!
+ end
+end
diff --git a/spec/migrations/cleanup_bigint_conversion_for_merge_request_metrics_for_self_hosts_spec.rb b/spec/migrations/cleanup_bigint_conversion_for_merge_request_metrics_for_self_hosts_spec.rb
new file mode 100644
index 00000000000..dc4adae9138
--- /dev/null
+++ b/spec/migrations/cleanup_bigint_conversion_for_merge_request_metrics_for_self_hosts_spec.rb
@@ -0,0 +1,107 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe CleanupBigintConversionForMergeRequestMetricsForSelfHosts, feature_category: :database do
+ after do
+ connection = described_class.new.connection
+ connection.execute('ALTER TABLE merge_request_metrics DROP COLUMN IF EXISTS id_convert_to_bigint')
+ end
+
+ describe '#up' do
+ context 'when is GitLab.com, dev, or test' do
+ before do
+ # As we call `schema_migrate_down!` before each example, and for this migration
+ # `#down` is same as `#up`, we need to ensure we start from the expected state.
+ connection = described_class.new.connection
+ connection.execute('ALTER TABLE merge_request_metrics DROP COLUMN IF EXISTS id_convert_to_bigint')
+ end
+
+ it 'does nothing' do
+ # rubocop: disable RSpec/AnyInstanceOf
+ allow_any_instance_of(described_class).to receive(:com_or_dev_or_test_but_not_jh?).and_return(true)
+ # rubocop: enable RSpec/AnyInstanceOf
+
+ merge_request_metrics = table(:merge_request_metrics)
+
+ disable_migrations_output do
+ reversible_migration do |migration|
+ migration.before -> {
+ merge_request_metrics.reset_column_information
+
+ expect(merge_request_metrics.columns.find { |c| c.name == 'id_convert_to_bigint' }).to be nil
+ }
+
+ migration.after -> {
+ merge_request_metrics.reset_column_information
+
+ expect(merge_request_metrics.columns.find { |c| c.name == 'id_convert_to_bigint' }).to be nil
+ }
+ end
+ end
+ end
+ end
+
+ context 'when is a self-host customer with the temporary column already dropped' do
+ before do
+ # As we call `schema_migrate_down!` before each example, and for this migration
+ # `#down` is same as `#up`, we need to ensure we start from the expected state.
+ connection = described_class.new.connection
+ connection.execute('ALTER TABLE merge_request_metrics ALTER COLUMN id TYPE bigint')
+ connection.execute('ALTER TABLE merge_request_metrics DROP COLUMN IF EXISTS id_convert_to_bigint')
+ end
+
+ it 'does nothing' do
+ # rubocop: disable RSpec/AnyInstanceOf
+ allow_any_instance_of(described_class).to receive(:com_or_dev_or_test_but_not_jh?).and_return(false)
+ # rubocop: enable RSpec/AnyInstanceOf
+
+ merge_request_metrics = table(:merge_request_metrics)
+
+ migrate!
+
+ expect(merge_request_metrics.columns.find { |c| c.name == 'id' }.sql_type).to eq('bigint')
+ expect(merge_request_metrics.columns.find { |c| c.name == 'id_convert_to_bigint' }).to be nil
+ end
+ end
+
+ context 'when is a self-host with the temporary columns' do
+ before do
+ # As we call `schema_migrate_down!` before each example, and for this migration
+ # `#down` is same as `#up`, we need to ensure we start from the expected state.
+ connection = described_class.new.connection
+ connection.execute('ALTER TABLE merge_request_metrics ALTER COLUMN id TYPE bigint')
+ connection.execute('ALTER TABLE merge_request_metrics ADD COLUMN IF NOT EXISTS id_convert_to_bigint integer')
+ end
+
+ it 'drop the temporary columns' do
+ # rubocop: disable RSpec/AnyInstanceOf
+ allow_any_instance_of(described_class).to receive(:com_or_dev_or_test_but_not_jh?).and_return(false)
+ # rubocop: enable RSpec/AnyInstanceOf
+
+ merge_request_metrics = table(:merge_request_metrics)
+
+ disable_migrations_output do
+ reversible_migration do |migration|
+ migration.before -> {
+ merge_request_metrics.reset_column_information
+
+ expect(merge_request_metrics.columns.find { |c| c.name == 'id' }.sql_type).to eq('bigint')
+ expect(merge_request_metrics.columns.find do |c|
+ c.name == 'id_convert_to_bigint'
+ end.sql_type).to eq('integer')
+ }
+
+ migration.after -> {
+ merge_request_metrics.reset_column_information
+
+ expect(merge_request_metrics.columns.find { |c| c.name == 'id' }.sql_type).to eq('bigint')
+ expect(merge_request_metrics.columns.find { |c| c.name == 'id_convert_to_bigint' }).to be nil
+ }
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/migrations/deduplicate_inactive_alert_integrations_spec.rb b/spec/migrations/deduplicate_inactive_alert_integrations_spec.rb
new file mode 100644
index 00000000000..7f963a9bd0a
--- /dev/null
+++ b/spec/migrations/deduplicate_inactive_alert_integrations_spec.rb
@@ -0,0 +1,71 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe DeduplicateInactiveAlertIntegrations, feature_category: :incident_management do
+ let!(:namespace_class) { table(:namespaces) }
+ let!(:project_class) { table(:projects) }
+ let!(:integration_class) { table(:alert_management_http_integrations) }
+
+ let!(:namespace_0) { namespace_class.create!(name: 'namespace1', path: 'namespace1') }
+ let!(:namespace_1) { namespace_class.create!(name: 'namespace2', path: 'namespace2') }
+ let!(:namespace_2) { namespace_class.create!(name: 'namespace3', path: 'namespace3') }
+
+ let!(:project_with_inactive_duplicate) { create_project(namespace_0, namespace_0) }
+ let!(:project_with_multiple_duplicates) { create_project(namespace_0, namespace_1) }
+ let!(:project_without_duplicates) { create_project(namespace_0, namespace_2) }
+
+ let!(:integrations) do
+ [
+ create_integration(project_with_inactive_duplicate, 'default'),
+ create_integration(project_with_inactive_duplicate, 'other'),
+ create_integration(project_with_inactive_duplicate, 'other', active: false),
+ create_integration(project_with_multiple_duplicates, 'default', active: false),
+ create_integration(project_with_multiple_duplicates, 'default', active: false),
+ create_integration(project_with_multiple_duplicates, 'other', active: false),
+ create_integration(project_with_multiple_duplicates, 'other'),
+ create_integration(project_without_duplicates, 'default'),
+ create_integration(project_without_duplicates, 'other', active: false)
+ ]
+ end
+
+ describe '#up' do
+ it 'updates the endpoint identifier of duplicate inactive integrations' do
+ expect { migrate! }
+ .to not_change { integrations[0].reload }
+ .and not_change { integrations[1].reload }
+ .and not_change { integrations[6].reload }
+ .and not_change { integrations[7].reload }
+ .and not_change { integrations[8].reload }
+
+ expect { integrations[2].reload }.to raise_error(ActiveRecord::RecordNotFound)
+ expect { integrations[3].reload }.to raise_error(ActiveRecord::RecordNotFound)
+ expect { integrations[4].reload }.to raise_error(ActiveRecord::RecordNotFound)
+ expect { integrations[5].reload }.to raise_error(ActiveRecord::RecordNotFound)
+
+ endpoints = integration_class.pluck(:endpoint_identifier, :project_id)
+ expect(endpoints.uniq).to match_array(endpoints)
+ end
+ end
+
+ private
+
+ def create_integration(project, endpoint_identifier, active: true)
+ integration_class.create!(
+ project_id: project.id,
+ endpoint_identifier: endpoint_identifier,
+ active: active,
+ encrypted_token_iv: 'iv',
+ encrypted_token: 'token',
+ name: "HTTP Integration - #{endpoint_identifier}"
+ )
+ end
+
+ def create_project(namespace, project_namespace)
+ project_class.create!(
+ namespace_id: namespace.id,
+ project_namespace_id: project_namespace.id
+ )
+ end
+end
diff --git a/spec/migrations/ensure_events_bigint_backfill_is_finished_for_gitlab_dot_com_spec.rb b/spec/migrations/ensure_events_bigint_backfill_is_finished_for_gitlab_dot_com_spec.rb
new file mode 100644
index 00000000000..6694b690d30
--- /dev/null
+++ b/spec/migrations/ensure_events_bigint_backfill_is_finished_for_gitlab_dot_com_spec.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe EnsureEventsBigintBackfillIsFinishedForGitlabDotCom, feature_category: :database do
+ describe '#up' do
+ let(:migration_arguments) do
+ {
+ job_class_name: 'CopyColumnUsingBackgroundMigrationJob',
+ table_name: 'events',
+ column_name: 'id',
+ job_arguments: [['target_id'], ['target_id_convert_to_bigint']]
+ }
+ end
+
+ it 'ensures the migration is completed for GitLab.com, dev, or test' do
+ expect_next_instance_of(described_class) do |instance|
+ expect(instance).to receive(:com_or_dev_or_test_but_not_jh?).and_return(true)
+ expect(instance).to receive(:ensure_batched_background_migration_is_finished).with(migration_arguments)
+ end
+
+ migrate!
+ end
+
+ it 'skips the check for other instances' do
+ expect_next_instance_of(described_class) do |instance|
+ expect(instance).to receive(:com_or_dev_or_test_but_not_jh?).and_return(false)
+ expect(instance).not_to receive(:ensure_batched_background_migration_is_finished)
+ end
+
+ migrate!
+ end
+ end
+end
diff --git a/spec/models/abuse/trust_score_spec.rb b/spec/models/abuse/trust_score_spec.rb
index 755309ac699..85fffcc167b 100644
--- a/spec/models/abuse/trust_score_spec.rb
+++ b/spec/models/abuse/trust_score_spec.rb
@@ -26,7 +26,6 @@ RSpec.describe Abuse::TrustScore, feature_category: :instance_resiliency do
before do
allow(Labkit::Correlation::CorrelationId).to receive(:current_id).and_return('123abc')
- stub_const('Abuse::TrustScore::MAX_EVENTS', 2)
end
context 'if correlation ID is nil' do
@@ -42,16 +41,5 @@ RSpec.describe Abuse::TrustScore, feature_category: :instance_resiliency do
expect(subject.correlation_id_value).to eq('already-set')
end
end
-
- context 'if max events is exceeded' do
- it 'removes the oldest events' do
- first = create(:abuse_trust_score, user: user)
- create(:abuse_trust_score, user: user)
- create(:abuse_trust_score, user: user)
-
- expect(user.abuse_trust_scores.count).to eq(2)
- expect(described_class.find_by_id(first.id)).to eq(nil)
- end
- end
end
end
diff --git a/spec/models/abuse/user_trust_score_spec.rb b/spec/models/abuse/user_trust_score_spec.rb
new file mode 100644
index 00000000000..6b2cfa6a504
--- /dev/null
+++ b/spec/models/abuse/user_trust_score_spec.rb
@@ -0,0 +1,130 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Abuse::UserTrustScore, feature_category: :instance_resiliency do
+ let_it_be(:user1) { create(:user) }
+ let_it_be(:user2) { create(:user) }
+ let(:user_1_scores) { described_class.new(user1) }
+ let(:user_2_scores) { described_class.new(user2) }
+
+ describe '#spammer?' do
+ context 'when the user is a spammer' do
+ before do
+ allow(user_1_scores).to receive(:spam_score).and_return(0.9)
+ end
+
+ it 'classifies the user as a spammer' do
+ expect(user_1_scores).to be_spammer
+ end
+ end
+
+ context 'when the user is not a spammer' do
+ before do
+ allow(user_1_scores).to receive(:spam_score).and_return(0.1)
+ end
+
+ it 'does not classify the user as a spammer' do
+ expect(user_1_scores).not_to be_spammer
+ end
+ end
+ end
+
+ describe '#spam_score' do
+ context 'when the user is a spammer' do
+ before do
+ create(:abuse_trust_score, user: user1, score: 0.8)
+ create(:abuse_trust_score, user: user1, score: 0.9)
+ end
+
+ it 'returns the expected score' do
+ expect(user_1_scores.spam_score).to be_within(0.01).of(0.85)
+ end
+ end
+
+ context 'when the user is not a spammer' do
+ before do
+ create(:abuse_trust_score, user: user1, score: 0.1)
+ create(:abuse_trust_score, user: user1, score: 0.0)
+ end
+
+ it 'returns the expected score' do
+ expect(user_1_scores.spam_score).to be_within(0.01).of(0.05)
+ end
+ end
+ end
+
+ describe '#telesign_score' do
+ context 'when the user has a telesign risk score' do
+ before do
+ create(:abuse_trust_score, user: user1, score: 12.0, source: :telesign)
+ create(:abuse_trust_score, user: user1, score: 24.0, source: :telesign)
+ end
+
+ it 'returns the latest score' do
+ expect(user_1_scores.telesign_score).to be(24.0)
+ end
+ end
+
+ context 'when the user does not have a telesign risk score' do
+ it 'defaults to zero' do
+ expect(user_2_scores.telesign_score).to be(0.0)
+ end
+ end
+ end
+
+ describe '#arkose_global_score' do
+ context 'when the user has an arkose global risk score' do
+ before do
+ create(:abuse_trust_score, user: user1, score: 12.0, source: :arkose_global_score)
+ create(:abuse_trust_score, user: user1, score: 24.0, source: :arkose_global_score)
+ end
+
+ it 'returns the latest score' do
+ expect(user_1_scores.arkose_global_score).to be(24.0)
+ end
+ end
+
+ context 'when the user does not have an arkose global risk score' do
+ it 'defaults to zero' do
+ expect(user_2_scores.arkose_global_score).to be(0.0)
+ end
+ end
+ end
+
+ describe '#arkose_custom_score' do
+ context 'when the user has an arkose custom risk score' do
+ before do
+ create(:abuse_trust_score, user: user1, score: 12.0, source: :arkose_custom_score)
+ create(:abuse_trust_score, user: user1, score: 24.0, source: :arkose_custom_score)
+ end
+
+ it 'returns the latest score' do
+ expect(user_1_scores.arkose_custom_score).to be(24.0)
+ end
+ end
+
+ context 'when the user does not have an arkose custom risk score' do
+ it 'defaults to zero' do
+ expect(user_2_scores.arkose_custom_score).to be(0.0)
+ end
+ end
+ end
+
+ describe '#remove_old_scores' do
+ context 'if max events is exceeded' do
+ before do
+ stub_const('Abuse::UserTrustScore::MAX_EVENTS', 2)
+ end
+
+ it 'removes the oldest events' do
+ first = create(:abuse_trust_score, user: user1)
+ create(:abuse_trust_score, user: user1)
+ create(:abuse_trust_score, user: user1)
+
+ expect(user1.abuse_trust_scores.count).to eq(2)
+ expect(Abuse::TrustScore.find_by_id(first.id)).to eq(nil)
+ end
+ end
+ end
+end
diff --git a/spec/models/active_session_spec.rb b/spec/models/active_session_spec.rb
index 8717b2a1075..54169c254a6 100644
--- a/spec/models/active_session_spec.rb
+++ b/spec/models/active_session_spec.rb
@@ -24,19 +24,19 @@ RSpec.describe ActiveSession, :clean_gitlab_redis_sessions do
describe '#current?' do
it 'returns true if the active session matches the current session' do
- active_session = ActiveSession.new(session_private_id: rack_session.private_id)
+ active_session = described_class.new(session_private_id: rack_session.private_id)
expect(active_session.current?(session)).to be true
end
it 'returns false if the active session does not match the current session' do
- active_session = ActiveSession.new(session_id: Rack::Session::SessionId.new('59822c7d9fcdfa03725eff41782ad97d'))
+ active_session = described_class.new(session_id: Rack::Session::SessionId.new('59822c7d9fcdfa03725eff41782ad97d'))
expect(active_session.current?(session)).to be false
end
it 'returns false if the session id is nil' do
- active_session = ActiveSession.new(session_id: nil)
+ active_session = described_class.new(session_id: nil)
session = double(:session, id: nil)
expect(active_session.current?(session)).to be false
@@ -96,7 +96,7 @@ RSpec.describe ActiveSession, :clean_gitlab_redis_sessions do
)
end
- expect(ActiveSession.list(user)).to contain_exactly(session)
+ expect(described_class.list(user)).to contain_exactly(session)
Gitlab::Redis::Sessions.with do |redis|
expect(redis.sscan_each(lookup_key)).to contain_exactly session_id
@@ -119,7 +119,7 @@ RSpec.describe ActiveSession, :clean_gitlab_redis_sessions do
end
it 'returns an empty array if the user does not have any active session' do
- expect(ActiveSession.list(user)).to be_empty
+ expect(described_class.list(user)).to be_empty
end
end
@@ -138,7 +138,7 @@ RSpec.describe ActiveSession, :clean_gitlab_redis_sessions do
)
end
- expect(ActiveSession.list_sessions(user)).to eq [{ _csrf_token: 'abcd' }]
+ expect(described_class.list_sessions(user)).to eq [{ _csrf_token: 'abcd' }]
end
end
@@ -148,7 +148,7 @@ RSpec.describe ActiveSession, :clean_gitlab_redis_sessions do
redis.sadd(lookup_key, %w[a b c])
end
- expect(ActiveSession.session_ids_for_user(user.id).map(&:to_s)).to match_array(%w[a b c])
+ expect(described_class.session_ids_for_user(user.id).map(&:to_s)).to match_array(%w[a b c])
end
end
@@ -159,13 +159,13 @@ RSpec.describe ActiveSession, :clean_gitlab_redis_sessions do
redis.set("session:gitlab:#{rack_session.private_id}", Marshal.dump({ _csrf_token: 'abcd' }))
end
- expect(ActiveSession.sessions_from_ids([rack_session.private_id])).to eq [{ _csrf_token: 'abcd' }]
+ expect(described_class.sessions_from_ids([rack_session.private_id])).to eq [{ _csrf_token: 'abcd' }]
end
it 'avoids a redis lookup for an empty array' do
expect(Gitlab::Redis::Sessions).not_to receive(:with)
- expect(ActiveSession.sessions_from_ids([])).to eq([])
+ expect(described_class.sessions_from_ids([])).to eq([])
end
it 'uses redis lookup in batches' do
@@ -178,13 +178,13 @@ RSpec.describe ActiveSession, :clean_gitlab_redis_sessions do
mget_responses = sessions.map { |session| [Marshal.dump(session)] }
expect(redis).to receive(:mget).twice.times.and_return(*mget_responses)
- expect(ActiveSession.sessions_from_ids([1, 2])).to eql(sessions)
+ expect(described_class.sessions_from_ids([1, 2])).to eql(sessions)
end
end
describe '.set' do
it 'sets a new redis entry for the user session and a lookup entry' do
- ActiveSession.set(user, request)
+ described_class.set(user, request)
session_id = "2::418729c72310bbf349a032f0bb6e3fce9f5a69df8f000d8ae0ac5d159d8f21ae"
@@ -276,10 +276,10 @@ RSpec.describe ActiveSession, :clean_gitlab_redis_sessions do
end
context 'destroy called with Rack::Session::SessionId#private_id' do
- subject { ActiveSession.destroy_session(user, rack_session.private_id) }
+ subject { described_class.destroy_session(user, rack_session.private_id) }
it 'calls .destroy_sessions' do
- expect(ActiveSession).to(
+ expect(described_class).to(
receive(:destroy_sessions)
.with(anything, user, [rack_session.private_id]))
@@ -287,7 +287,7 @@ RSpec.describe ActiveSession, :clean_gitlab_redis_sessions do
end
context 'ActiveSession with session_private_id' do
- let(:active_session) { ActiveSession.new(session_private_id: rack_session.private_id) }
+ let(:active_session) { described_class.new(session_private_id: rack_session.private_id) }
let(:active_session_lookup_key) { rack_session.private_id }
context 'when using old session key serialization' do
@@ -311,7 +311,7 @@ RSpec.describe ActiveSession, :clean_gitlab_redis_sessions do
it 'gracefully handles a nil session ID' do
expect(described_class).not_to receive(:destroy_sessions)
- ActiveSession.destroy_all_but_current(user, nil)
+ described_class.destroy_all_but_current(user, nil)
end
shared_examples 'with user sessions' do
@@ -338,15 +338,15 @@ RSpec.describe ActiveSession, :clean_gitlab_redis_sessions do
end
it 'removes the entry associated with the all user sessions but current' do
- expect { ActiveSession.destroy_all_but_current(user, request.session) }
+ expect { described_class.destroy_all_but_current(user, request.session) }
.to(change { ActiveSession.session_ids_for_user(user.id).size }.from(2).to(1))
- expect(ActiveSession.session_ids_for_user(9999).size).to eq(1)
+ expect(described_class.session_ids_for_user(9999).size).to eq(1)
end
it 'removes the lookup entry of deleted sessions' do
session_private_id = Rack::Session::SessionId.new(current_session_id).private_id
- ActiveSession.destroy_all_but_current(user, request.session)
+ described_class.destroy_all_but_current(user, request.session)
Gitlab::Redis::Sessions.with do |redis|
expect(redis.smembers(lookup_key)).to contain_exactly session_private_id
@@ -361,9 +361,9 @@ RSpec.describe ActiveSession, :clean_gitlab_redis_sessions do
redis.sadd?(lookup_key, impersonated_session_id)
end
- expect { ActiveSession.destroy_all_but_current(user, request.session) }.to change { ActiveSession.session_ids_for_user(user.id).size }.from(3).to(2)
+ expect { described_class.destroy_all_but_current(user, request.session) }.to change { ActiveSession.session_ids_for_user(user.id).size }.from(3).to(2)
- expect(ActiveSession.session_ids_for_user(9999).size).to eq(1)
+ expect(described_class.session_ids_for_user(9999).size).to eq(1)
end
end
@@ -407,7 +407,7 @@ RSpec.describe ActiveSession, :clean_gitlab_redis_sessions do
redis.sadd(lookup_key, [current_session_id, '59822c7d9fcdfa03725eff41782ad97d'])
end
- ActiveSession.cleanup(user)
+ described_class.cleanup(user)
Gitlab::Redis::Sessions.with do |redis|
expect(redis.smembers(lookup_key)).to contain_exactly current_session_id
@@ -416,7 +416,7 @@ RSpec.describe ActiveSession, :clean_gitlab_redis_sessions do
end
it 'does not bail if there are no lookup entries' do
- ActiveSession.cleanup(user)
+ described_class.cleanup(user)
end
context 'cleaning up old sessions' do
@@ -436,7 +436,7 @@ RSpec.describe ActiveSession, :clean_gitlab_redis_sessions do
end
it 'removes obsolete active sessions entries' do
- ActiveSession.cleanup(user)
+ described_class.cleanup(user)
Gitlab::Redis::Sessions.with do |redis|
sessions = described_class.list(user)
@@ -450,7 +450,7 @@ RSpec.describe ActiveSession, :clean_gitlab_redis_sessions do
end
it 'removes obsolete lookup entries' do
- ActiveSession.cleanup(user)
+ described_class.cleanup(user)
Gitlab::Redis::Sessions.with do |redis|
lookup_entries = redis.smembers(lookup_key)
@@ -465,7 +465,7 @@ RSpec.describe ActiveSession, :clean_gitlab_redis_sessions do
redis.sadd?(lookup_key, (max_number_of_sessions_plus_two + 1).to_s)
end
- ActiveSession.cleanup(user)
+ described_class.cleanup(user)
Gitlab::Redis::Sessions.with do |redis|
lookup_entries = redis.smembers(lookup_key)
@@ -654,7 +654,7 @@ RSpec.describe ActiveSession, :clean_gitlab_redis_sessions do
let(:auth) { double(cookies: {}) }
it 'sets marketing cookie' do
- ActiveSession.set_active_user_cookie(auth)
+ described_class.set_active_user_cookie(auth)
expect(auth.cookies[:about_gitlab_active_user][:value]).to be_truthy
end
end
@@ -663,11 +663,11 @@ RSpec.describe ActiveSession, :clean_gitlab_redis_sessions do
let(:auth) { double(cookies: {}) }
before do
- ActiveSession.set_active_user_cookie(auth)
+ described_class.set_active_user_cookie(auth)
end
it 'unsets marketing cookie' do
- ActiveSession.unset_active_user_cookie(auth)
+ described_class.unset_active_user_cookie(auth)
expect(auth.cookies[:about_gitlab_active_user]).to be_nil
end
end
diff --git a/spec/models/ai/service_access_token_spec.rb b/spec/models/ai/service_access_token_spec.rb
new file mode 100644
index 00000000000..12ed24f3bd6
--- /dev/null
+++ b/spec/models/ai/service_access_token_spec.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Ai::ServiceAccessToken, type: :model, feature_category: :application_performance do
+ describe '.expired', :freeze_time do
+ let_it_be(:expired_token) { create(:service_access_token, :code_suggestions, :expired) }
+ let_it_be(:active_token) { create(:service_access_token, :code_suggestions, :active) }
+
+ it 'selects all expired tokens' do
+ expect(described_class.expired).to match_array([expired_token])
+ end
+ end
+
+ # There is currently only one category, please expand this test when a new category is added.
+ describe '.for_category' do
+ let(:code_suggestions_token) { create(:service_access_token, :code_suggestions) }
+ let(:category) { :code_suggestions }
+
+ it 'only selects tokens from the selected category' do
+ expect(described_class.for_category(category)).to match_array([code_suggestions_token])
+ end
+ end
+
+ describe '#token' do
+ let(:token_value) { 'Abc' }
+
+ it 'is encrypted' do
+ subject.token = token_value
+
+ aggregate_failures do
+ expect(subject.encrypted_token_iv).to be_present
+ expect(subject.encrypted_token).to be_present
+ expect(subject.encrypted_token).not_to eq(token_value)
+ expect(subject.token).to eq(token_value)
+ end
+ end
+
+ describe 'validations' do
+ it { is_expected.to validate_presence_of(:token) }
+ it { is_expected.to validate_presence_of(:category) }
+ it { is_expected.to validate_presence_of(:expires_at) }
+ end
+ end
+end
diff --git a/spec/models/alert_management/alert_spec.rb b/spec/models/alert_management/alert_spec.rb
index ff77ca2ab64..ed5cde3ca3b 100644
--- a/spec/models/alert_management/alert_spec.rb
+++ b/spec/models/alert_management/alert_spec.rb
@@ -2,13 +2,13 @@
require 'spec_helper'
-RSpec.describe AlertManagement::Alert do
+RSpec.describe AlertManagement::Alert, feature_category: :incident_management do
let_it_be(:project) { create(:project) }
let_it_be(:project2) { create(:project) }
- let_it_be(:triggered_alert, reload: true) { create(:alert_management_alert, :triggered, project: project) }
- let_it_be(:acknowledged_alert, reload: true) { create(:alert_management_alert, :acknowledged, project: project) }
- let_it_be(:resolved_alert, reload: true) { create(:alert_management_alert, :resolved, project: project2) }
- let_it_be(:ignored_alert, reload: true) { create(:alert_management_alert, :ignored, project: project2) }
+ let_it_be_with_refind(:triggered_alert) { create(:alert_management_alert, :triggered, project: project) }
+ let_it_be_with_refind(:acknowledged_alert) { create(:alert_management_alert, :acknowledged, project: project) }
+ let_it_be_with_refind(:resolved_alert) { create(:alert_management_alert, :resolved, project: project2) }
+ let_it_be_with_refind(:ignored_alert) { create(:alert_management_alert, :ignored, project: project2) }
describe 'associations' do
it { is_expected.to belong_to(:project) }
@@ -168,7 +168,7 @@ RSpec.describe AlertManagement::Alert do
let_it_be(:alert) { triggered_alert }
let_it_be(:assignee) { create(:user) }
- subject { AlertManagement::Alert.for_assignee_username(assignee_username) }
+ subject { described_class.for_assignee_username(assignee_username) }
before_all do
alert.update!(assignees: [assignee])
@@ -269,7 +269,7 @@ RSpec.describe AlertManagement::Alert do
alert.update!(title: 'Title', description: 'Desc', service: 'Service', monitoring_tool: 'Monitor')
end
- subject { AlertManagement::Alert.search(query) }
+ subject { described_class.search(query) }
context 'does not contain search string' do
let(:query) { 'something else' }
diff --git a/spec/models/alert_management/http_integration_spec.rb b/spec/models/alert_management/http_integration_spec.rb
index 606b53aeacd..479ae8a4966 100644
--- a/spec/models/alert_management/http_integration_spec.rb
+++ b/spec/models/alert_management/http_integration_spec.rb
@@ -29,13 +29,13 @@ RSpec.describe AlertManagement::HttpIntegration, feature_category: :incident_man
# Uniqueness spec saves integration with `validate: false` otherwise.
subject { create(:alert_management_http_integration, :legacy) }
- it { is_expected.to validate_uniqueness_of(:endpoint_identifier).scoped_to(:project_id, :active) }
+ it { is_expected.to validate_uniqueness_of(:endpoint_identifier).scoped_to(:project_id) }
end
context 'when inactive' do
subject { create(:alert_management_http_integration, :legacy, :inactive) }
- it { is_expected.not_to validate_uniqueness_of(:endpoint_identifier).scoped_to(:project_id, :active) }
+ it { is_expected.to validate_uniqueness_of(:endpoint_identifier).scoped_to(:project_id) }
end
context 'payload_attribute_mapping' do
@@ -90,7 +90,7 @@ RSpec.describe AlertManagement::HttpIntegration, feature_category: :incident_man
describe 'scopes' do
let_it_be(:integration_1) { create(:alert_management_http_integration) }
let_it_be(:integration_2) { create(:alert_management_http_integration, :inactive, project: project) }
- let_it_be(:integration_3) { create(:alert_management_http_integration, :prometheus, project: project) }
+ let_it_be(:integration_3) { create(:alert_management_prometheus_integration, project: project) }
let_it_be(:integration_4) { create(:alert_management_http_integration, :legacy, :inactive) }
describe '.for_endpoint_identifier' do
@@ -129,12 +129,6 @@ RSpec.describe AlertManagement::HttpIntegration, feature_category: :incident_man
it { is_expected.to contain_exactly(integration_1, integration_3) }
end
- describe '.legacy' do
- subject { described_class.legacy }
-
- it { is_expected.to contain_exactly(integration_4) }
- end
-
describe '.ordered_by_type_and_id' do
before do
# Rearrange cache by saving to avoid false-positives
@@ -232,9 +226,16 @@ RSpec.describe AlertManagement::HttpIntegration, feature_category: :incident_man
end
context 'when included in initialization args' do
- let(:integration) { described_class.new(endpoint_identifier: 'legacy') }
+ let(:required_args) { { project: project, name: 'Name' } }
- it { is_expected.to eq('legacy') }
+ AlertManagement::HttpIntegration::LEGACY_IDENTIFIERS.each do |identifier|
+ context "for endpoint identifier \"#{identifier}\"" do
+ let(:integration) { described_class.new(**required_args, endpoint_identifier: identifier) }
+
+ it { is_expected.to eq(identifier) }
+ specify { expect(integration).to be_valid }
+ end
+ end
end
context 'when reassigning' do
@@ -293,7 +294,7 @@ RSpec.describe AlertManagement::HttpIntegration, feature_category: :incident_man
end
context 'for a prometheus integration' do
- let(:integration) { build(:alert_management_http_integration, :prometheus) }
+ let(:integration) { build(:alert_management_prometheus_integration) }
it do
is_expected.to eq(
@@ -307,7 +308,7 @@ RSpec.describe AlertManagement::HttpIntegration, feature_category: :incident_man
end
context 'for a legacy integration' do
- let(:integration) { build(:alert_management_http_integration, :prometheus, :legacy) }
+ let(:integration) { build(:alert_management_prometheus_integration, :legacy) }
it do
is_expected.to eq(
diff --git a/spec/models/analytics/cycle_analytics/stage_spec.rb b/spec/models/analytics/cycle_analytics/stage_spec.rb
index 960d8d3e964..54ae0feca2c 100644
--- a/spec/models/analytics/cycle_analytics/stage_spec.rb
+++ b/spec/models/analytics/cycle_analytics/stage_spec.rb
@@ -3,10 +3,23 @@
require 'spec_helper'
RSpec.describe Analytics::CycleAnalytics::Stage, feature_category: :value_stream_management do
- describe 'uniqueness validation on name' do
+ describe 'validations' do
subject { build(:cycle_analytics_stage) }
it { is_expected.to validate_uniqueness_of(:name).scoped_to([:group_id, :group_value_stream_id]) }
+
+ it 'validates count of stages per value stream' do
+ stub_const("#{described_class.name}::MAX_STAGES_PER_VALUE_STREAM", 1)
+ value_stream = create(:cycle_analytics_value_stream, name: 'test')
+ create(:cycle_analytics_stage, name: "stage 1", value_stream: value_stream)
+
+ new_stage = build(:cycle_analytics_stage, name: "stage 2", value_stream: value_stream)
+
+ expect do
+ new_stage.save!
+ end.to raise_error(ActiveRecord::RecordInvalid,
+ _('Validation failed: Value stream Maximum number of stages per value stream exceeded'))
+ end
end
describe 'associations' do
diff --git a/spec/models/analytics/cycle_analytics/value_stream_spec.rb b/spec/models/analytics/cycle_analytics/value_stream_spec.rb
index f290cf25ae6..3b3187e0b51 100644
--- a/spec/models/analytics/cycle_analytics/value_stream_spec.rb
+++ b/spec/models/analytics/cycle_analytics/value_stream_spec.rb
@@ -25,6 +25,19 @@ RSpec.describe Analytics::CycleAnalytics::ValueStream, type: :model, feature_cat
it_behaves_like 'value stream analytics namespace models' do
let(:factory_name) { :cycle_analytics_value_stream }
end
+
+ it 'validates count of value streams per namespace' do
+ stub_const("#{described_class.name}::MAX_VALUE_STREAMS_PER_NAMESPACE", 1)
+ group = create(:group)
+ create(:cycle_analytics_value_stream, name: 'test', namespace: group)
+
+ new_value_stream = build(:cycle_analytics_value_stream, name: 'test2', namespace: group)
+
+ expect do
+ new_value_stream.save!
+ end.to raise_error(ActiveRecord::RecordInvalid,
+ _('Validation failed: Namespace Maximum number of value streams per namespace exceeded'))
+ end
end
describe 'scopes' do
diff --git a/spec/models/application_record_spec.rb b/spec/models/application_record_spec.rb
index ee3065cf8f2..9ea5c1ec92c 100644
--- a/spec/models/application_record_spec.rb
+++ b/spec/models/application_record_spec.rb
@@ -257,7 +257,7 @@ RSpec.describe ApplicationRecord do
end
before do
- ApplicationRecord.connection.execute(<<~SQL)
+ described_class.connection.execute(<<~SQL)
create table _test_tests (
id bigserial primary key not null,
ignore_me text
diff --git a/spec/models/application_setting_spec.rb b/spec/models/application_setting_spec.rb
index 12ab061fa03..8dcafaa90a0 100644
--- a/spec/models/application_setting_spec.rb
+++ b/spec/models/application_setting_spec.rb
@@ -59,8 +59,7 @@ RSpec.describe ApplicationSetting, feature_category: :shared, type: :model do
it { is_expected.to allow_value("dev.gitlab.com").for(:commit_email_hostname) }
it { is_expected.not_to allow_value("@dev.gitlab").for(:commit_email_hostname) }
- it { is_expected.to allow_value(true).for(:container_expiration_policies_enable_historic_entries) }
- it { is_expected.to allow_value(false).for(:container_expiration_policies_enable_historic_entries) }
+ it { is_expected.to allow_value(true, false).for(:container_expiration_policies_enable_historic_entries) }
it { is_expected.not_to allow_value(nil).for(:container_expiration_policies_enable_historic_entries) }
it { is_expected.to allow_value("myemail@gitlab.com").for(:lets_encrypt_notification_email) }
@@ -100,8 +99,7 @@ RSpec.describe ApplicationSetting, feature_category: :shared, type: :model do
it { is_expected.to validate_numericality_of(:container_registry_cleanup_tags_service_max_list_size).only_integer.is_greater_than_or_equal_to(0) }
it { is_expected.to validate_numericality_of(:container_registry_data_repair_detail_worker_max_concurrency).only_integer.is_greater_than_or_equal_to(0) }
it { is_expected.to validate_numericality_of(:container_registry_expiration_policies_worker_capacity).only_integer.is_greater_than_or_equal_to(0) }
- it { is_expected.to allow_value(true).for(:container_registry_expiration_policies_caching) }
- it { is_expected.to allow_value(false).for(:container_registry_expiration_policies_caching) }
+ it { is_expected.to allow_value(true, false).for(:container_registry_expiration_policies_caching) }
it { is_expected.to validate_numericality_of(:container_registry_import_max_tags_count).only_integer.is_greater_than_or_equal_to(0) }
it { is_expected.to validate_numericality_of(:container_registry_import_max_retries).only_integer.is_greater_than_or_equal_to(0) }
@@ -134,8 +132,7 @@ RSpec.describe ApplicationSetting, feature_category: :shared, type: :model do
it { is_expected.to validate_numericality_of(:snippet_size_limit).only_integer.is_greater_than(0) }
it { is_expected.to validate_numericality_of(:wiki_page_max_content_bytes).only_integer.is_greater_than_or_equal_to(1024) }
- it { is_expected.to allow_value(true).for(:wiki_asciidoc_allow_uri_includes) }
- it { is_expected.to allow_value(false).for(:wiki_asciidoc_allow_uri_includes) }
+ it { is_expected.to allow_value(true, false).for(:wiki_asciidoc_allow_uri_includes) }
it { is_expected.not_to allow_value(nil).for(:wiki_asciidoc_allow_uri_includes) }
it { is_expected.to validate_presence_of(:max_artifacts_size) }
it { is_expected.to validate_numericality_of(:max_artifacts_size).only_integer.is_greater_than(0) }
@@ -148,8 +145,7 @@ RSpec.describe ApplicationSetting, feature_category: :shared, type: :model do
it { is_expected.to validate_presence_of(:max_terraform_state_size_bytes) }
it { is_expected.to validate_numericality_of(:max_terraform_state_size_bytes).only_integer.is_greater_than_or_equal_to(0) }
- it { is_expected.to allow_value(true).for(:user_defaults_to_private_profile) }
- it { is_expected.to allow_value(false).for(:user_defaults_to_private_profile) }
+ it { is_expected.to allow_value(true, false).for(:user_defaults_to_private_profile) }
it { is_expected.not_to allow_value(nil).for(:user_defaults_to_private_profile) }
it { is_expected.to allow_values([true, false]).for(:deny_all_requests_except_allowed) }
@@ -250,16 +246,13 @@ RSpec.describe ApplicationSetting, feature_category: :shared, type: :model do
it { is_expected.to allow_value(http).for(:jira_connect_proxy_url) }
it { is_expected.to allow_value(https).for(:jira_connect_proxy_url) }
- it { is_expected.to allow_value(true).for(:bulk_import_enabled) }
- it { is_expected.to allow_value(false).for(:bulk_import_enabled) }
+ it { is_expected.to allow_value(true, false).for(:bulk_import_enabled) }
it { is_expected.not_to allow_value(nil).for(:bulk_import_enabled) }
- it { is_expected.to allow_value(true).for(:allow_runner_registration_token) }
- it { is_expected.to allow_value(false).for(:allow_runner_registration_token) }
+ it { is_expected.to allow_value(true, false).for(:allow_runner_registration_token) }
it { is_expected.not_to allow_value(nil).for(:allow_runner_registration_token) }
- it { is_expected.to allow_value(true).for(:gitlab_dedicated_instance) }
- it { is_expected.to allow_value(false).for(:gitlab_dedicated_instance) }
+ it { is_expected.to allow_value(true, false).for(:gitlab_dedicated_instance) }
it { is_expected.not_to allow_value(nil).for(:gitlab_dedicated_instance) }
it { is_expected.not_to allow_value(random: :value).for(:database_apdex_settings) }
@@ -493,6 +486,37 @@ RSpec.describe ApplicationSetting, feature_category: :shared, type: :model do
end
end
+ describe 'GitLab for Slack app settings' do
+ before do
+ setting.slack_app_enabled = slack_app_enabled
+ end
+
+ context 'when GitLab for Slack app is disabled' do
+ let(:slack_app_enabled) { false }
+
+ it { is_expected.to allow_value(nil).for(:slack_app_id) }
+ it { is_expected.to allow_value(nil).for(:slack_app_secret) }
+ it { is_expected.to allow_value(nil).for(:slack_app_signing_secret) }
+ it { is_expected.to allow_value(nil).for(:slack_app_verification_token) }
+ end
+
+ context 'when GitLab for Slack app is enabled' do
+ let(:slack_app_enabled) { true }
+
+ it { is_expected.to allow_value('123456789a').for(:slack_app_id) }
+ it { is_expected.not_to allow_value(nil).for(:slack_app_id) }
+
+ it { is_expected.to allow_value('secret').for(:slack_app_secret) }
+ it { is_expected.not_to allow_value(nil).for(:slack_app_secret) }
+
+ it { is_expected.to allow_value('signing-secret').for(:slack_app_signing_secret) }
+ it { is_expected.not_to allow_value(nil).for(:slack_app_signing_secret) }
+
+ it { is_expected.to allow_value('token').for(:slack_app_verification_token) }
+ it { is_expected.not_to allow_value(nil).for(:slack_app_verification_token) }
+ end
+ end
+
describe 'default_artifacts_expire_in' do
it 'sets an error if it cannot parse' do
expect do
@@ -1569,7 +1593,7 @@ RSpec.describe ApplicationSetting, feature_category: :shared, type: :model do
it 'ignores the plaintext token' do
subject
- ApplicationSetting.update_all(static_objects_external_storage_auth_token: 'Test')
+ described_class.update_all(static_objects_external_storage_auth_token: 'Test')
setting.reload
expect(setting[:static_objects_external_storage_auth_token]).to be_nil
diff --git a/spec/models/award_emoji_spec.rb b/spec/models/award_emoji_spec.rb
index 99006f8ddce..586ec8f723a 100644
--- a/spec/models/award_emoji_spec.rb
+++ b/spec/models/award_emoji_spec.rb
@@ -141,36 +141,51 @@ RSpec.describe AwardEmoji do
end
end
- describe 'expiring ETag cache' do
+ describe 'broadcasting updates' do
context 'on a note' do
let(:note) { create(:note_on_issue) }
let(:award_emoji) { build(:award_emoji, user: build(:user), awardable: note) }
- it 'calls expire_etag_cache on the note when saved' do
+ it 'broadcasts updates on the note when saved' do
expect(note).to receive(:expire_etag_cache)
+ expect(note).to receive(:trigger_note_subscription_update)
award_emoji.save!
end
- it 'calls expire_etag_cache on the note when destroyed' do
+ it 'broadcasts updates on the note when destroyed' do
expect(note).to receive(:expire_etag_cache)
+ expect(note).to receive(:trigger_note_subscription_update)
award_emoji.destroy!
end
+
+ context 'when importing' do
+ let(:award_emoji) { build(:award_emoji, user: build(:user), awardable: note, importing: true) }
+
+ it 'does not broadcast updates on the note when saved' do
+ expect(note).not_to receive(:expire_etag_cache)
+ expect(note).not_to receive(:trigger_note_subscription_update)
+
+ award_emoji.save!
+ end
+ end
end
context 'on another awardable' do
let(:issue) { create(:issue) }
let(:award_emoji) { build(:award_emoji, user: build(:user), awardable: issue) }
- it 'does not call expire_etag_cache on the issue when saved' do
+ it 'does not broadcast updates on the issue when saved' do
expect(issue).not_to receive(:expire_etag_cache)
+ expect(issue).not_to receive(:trigger_note_subscription_update)
award_emoji.save!
end
- it 'does not call expire_etag_cache on the issue when destroyed' do
+ it 'does not broadcast updates on the issue when destroyed' do
expect(issue).not_to receive(:expire_etag_cache)
+ expect(issue).not_to receive(:trigger_note_subscription_update)
award_emoji.destroy!
end
diff --git a/spec/models/bulk_import_spec.rb b/spec/models/bulk_import_spec.rb
index acb1f4a2ef7..a50fc6eaba4 100644
--- a/spec/models/bulk_import_spec.rb
+++ b/spec/models/bulk_import_spec.rb
@@ -75,4 +75,22 @@ RSpec.describe BulkImport, type: :model, feature_category: :importers do
end
end
end
+
+ describe '#supports_batched_export?' do
+ context 'when source version is greater than min supported version for batched migrations' do
+ it 'returns true' do
+ bulk_import = build(:bulk_import, source_version: '16.2.0')
+
+ expect(bulk_import.supports_batched_export?).to eq(true)
+ end
+ end
+
+ context 'when source version is less than min supported version for batched migrations' do
+ it 'returns false' do
+ bulk_import = build(:bulk_import, source_version: '15.5.0')
+
+ expect(bulk_import.supports_batched_export?).to eq(false)
+ end
+ end
+ end
end
diff --git a/spec/models/bulk_imports/entity_spec.rb b/spec/models/bulk_imports/entity_spec.rb
index c7ace3d2b78..7179ed7cb42 100644
--- a/spec/models/bulk_imports/entity_spec.rb
+++ b/spec/models/bulk_imports/entity_spec.rb
@@ -255,6 +255,27 @@ RSpec.describe BulkImports::Entity, type: :model, feature_category: :importers d
expect(entity.export_relations_url_path).to eq("/projects/#{entity.source_xid}/export_relations")
end
end
+
+ context 'when batched' do
+ context 'when source supports batched export' do
+ it 'returns batched export relations url' do
+ import = build(:bulk_import, source_version: '16.2.0')
+ entity = build(:bulk_import_entity, :project_entity, bulk_import: import)
+
+ expect(entity.export_relations_url_path(batched: true))
+ .to eq("/projects/#{entity.source_xid}/export_relations?batched=true")
+ end
+ end
+
+ context 'when source does not support batched export' do
+ it 'returns export relations url' do
+ entity = build(:bulk_import_entity)
+
+ expect(entity.export_relations_url_path(batched: true))
+ .to eq("/groups/#{entity.source_xid}/export_relations")
+ end
+ end
+ end
end
describe '#relation_download_url_path' do
@@ -264,6 +285,27 @@ RSpec.describe BulkImports::Entity, type: :model, feature_category: :importers d
expect(entity.relation_download_url_path('test'))
.to eq("/groups/#{entity.source_xid}/export_relations/download?relation=test")
end
+
+ context 'when batch number is present' do
+ context 'when source supports batched export' do
+ it 'returns export relations url with download query string and batch number' do
+ import = build(:bulk_import, source_version: '16.2.0')
+ entity = build(:bulk_import_entity, :project_entity, bulk_import: import)
+
+ expect(entity.relation_download_url_path('test', 1))
+ .to eq("/projects/#{entity.source_xid}/export_relations/download?batch_number=1&batched=true&relation=test")
+ end
+ end
+
+ context 'when source does not support batched export' do
+ it 'returns export relations url' do
+ entity = build(:bulk_import_entity)
+
+ expect(entity.relation_download_url_path('test', 1))
+ .to eq("/groups/#{entity.source_xid}/export_relations/download?relation=test")
+ end
+ end
+ end
end
describe '#entity_type' do
diff --git a/spec/models/bulk_imports/export_spec.rb b/spec/models/bulk_imports/export_spec.rb
index 7173d032bc2..e5c0632b113 100644
--- a/spec/models/bulk_imports/export_spec.rb
+++ b/spec/models/bulk_imports/export_spec.rb
@@ -83,4 +83,29 @@ RSpec.describe BulkImports::Export, type: :model, feature_category: :importers d
end
end
end
+
+ describe '#remove_existing_upload!' do
+ context 'when upload exists' do
+ it 'removes the upload' do
+ export = create(:bulk_import_export)
+ upload = create(:bulk_import_export_upload, export: export)
+ upload.update!(export_file: fixture_file_upload('spec/fixtures/bulk_imports/gz/labels.ndjson.gz'))
+
+ expect_any_instance_of(BulkImports::ExportUpload) do |upload|
+ expect(upload).to receive(:remove_export_file!)
+ expect(upload).to receive(:save!)
+ end
+
+ export.remove_existing_upload!
+ end
+ end
+
+ context 'when upload does not exist' do
+ it 'returns' do
+ export = build(:bulk_import_export)
+
+ expect { export.remove_existing_upload! }.not_to change { export.upload }
+ end
+ end
+ end
end
diff --git a/spec/models/bulk_imports/export_status_spec.rb b/spec/models/bulk_imports/export_status_spec.rb
index 0921c3bdce2..c3faa2db19c 100644
--- a/spec/models/bulk_imports/export_status_spec.rb
+++ b/spec/models/bulk_imports/export_status_spec.rb
@@ -2,16 +2,28 @@
require 'spec_helper'
-RSpec.describe BulkImports::ExportStatus do
+RSpec.describe BulkImports::ExportStatus, feature_category: :importers do
let_it_be(:relation) { 'labels' }
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, source_full_path: 'foo') }
let_it_be(:tracker) { create(:bulk_import_tracker, entity: entity) }
+ let(:batched) { false }
+ let(:batches) { [] }
let(:response_double) do
instance_double(HTTParty::Response,
- parsed_response: [{ 'relation' => 'labels', 'status' => status, 'error' => 'error!' }]
+ parsed_response: [
+ {
+ 'relation' => 'labels',
+ 'status' => status,
+ 'error' => 'error!',
+ 'batched' => batched,
+ 'batches' => batches,
+ 'batches_count' => 1,
+ 'total_objects_count' => 1
+ }
+ ]
)
end
@@ -190,4 +202,84 @@ RSpec.describe BulkImports::ExportStatus do
end
end
end
+
+ describe 'batching information' do
+ let(:status) { BulkImports::Export::FINISHED }
+
+ describe '#batched?' do
+ context 'when export is batched' do
+ let(:batched) { true }
+
+ it 'returns true' do
+ expect(subject.batched?).to eq(true)
+ end
+ end
+
+ context 'when export is not batched' do
+ it 'returns false' do
+ expect(subject.batched?).to eq(false)
+ end
+ end
+
+ context 'when export batch information is missing' do
+ let(:response_double) do
+ instance_double(HTTParty::Response, parsed_response: [{ 'relation' => 'labels', 'status' => status }])
+ end
+
+ it 'returns false' do
+ expect(subject.batched?).to eq(false)
+ end
+ end
+ end
+
+ describe '#batches_count' do
+ context 'when batches count is present' do
+ it 'returns batches count' do
+ expect(subject.batches_count).to eq(1)
+ end
+ end
+
+ context 'when batches count is missing' do
+ let(:response_double) do
+ instance_double(HTTParty::Response, parsed_response: [{ 'relation' => 'labels', 'status' => status }])
+ end
+
+ it 'returns 0' do
+ expect(subject.batches_count).to eq(0)
+ end
+ end
+ end
+
+ describe '#batch' do
+ context 'when export is batched' do
+ let(:batched) { true }
+ let(:batches) do
+ [
+ { 'relation' => 'labels', 'status' => status, 'batch_number' => 1 },
+ { 'relation' => 'milestones', 'status' => status, 'batch_number' => 2 }
+ ]
+ end
+
+ context 'when batch number is in range' do
+ it 'returns batch information' do
+ expect(subject.batch(1)['relation']).to eq('labels')
+ expect(subject.batch(2)['relation']).to eq('milestones')
+ expect(subject.batch(3)).to eq(nil)
+ end
+ end
+ end
+
+ context 'when batch number is less than 1' do
+ it 'raises error' do
+ expect { subject.batch(0) }.to raise_error(ArgumentError)
+ end
+ end
+
+ context 'when export is not batched' do
+ it 'returns nil' do
+ expect(subject.batch(1)).to eq(nil)
+ end
+ end
+ end
+ end
end
diff --git a/spec/models/bulk_imports/file_transfer/group_config_spec.rb b/spec/models/bulk_imports/file_transfer/group_config_spec.rb
index e50f52c728f..9e1e7cf6d6e 100644
--- a/spec/models/bulk_imports/file_transfer/group_config_spec.rb
+++ b/spec/models/bulk_imports/file_transfer/group_config_spec.rb
@@ -40,7 +40,12 @@ RSpec.describe BulkImports::FileTransfer::GroupConfig, feature_category: :import
describe '#top_relation_tree' do
it 'returns relation tree of a top level relation' do
- expect(subject.top_relation_tree('labels')).to eq('priorities' => {})
+ expect(subject.top_relation_tree('boards')).to include(
+ 'lists' => a_hash_including({
+ 'board' => anything,
+ 'label' => anything
+ })
+ )
end
end
diff --git a/spec/models/ci/artifact_blob_spec.rb b/spec/models/ci/artifact_blob_spec.rb
index c00f46683b9..2e0b13c35ea 100644
--- a/spec/models/ci/artifact_blob_spec.rb
+++ b/spec/models/ci/artifact_blob_spec.rb
@@ -2,105 +2,93 @@
require 'spec_helper'
-RSpec.describe Ci::ArtifactBlob do
- let_it_be(:project) { create(:project, :public) }
+RSpec.describe Ci::ArtifactBlob, feature_category: :continuous_integration do
+ let_it_be(:project) { create(:project, :public, path: 'project1') }
let_it_be(:build) { create(:ci_build, :artifacts, project: project) }
+ let(:pages_port) { nil }
let(:entry) { build.artifacts_metadata_entry('other_artifacts_0.1.2/another-subdirectory/banana_sample.gif') }
- subject { described_class.new(entry) }
+ subject(:blob) { described_class.new(entry) }
+
+ before do
+ stub_pages_setting(
+ enabled: true,
+ artifacts_server: true,
+ access_control: true,
+ port: pages_port
+ )
+ end
describe '#id' do
it 'returns a hash of the path' do
- expect(subject.id).to eq(Digest::SHA1.hexdigest(entry.path))
+ expect(blob.id).to eq(Digest::SHA1.hexdigest(entry.path))
end
end
describe '#name' do
it 'returns the entry name' do
- expect(subject.name).to eq(entry.name)
+ expect(blob.name).to eq(entry.name)
end
end
describe '#path' do
it 'returns the entry path' do
- expect(subject.path).to eq(entry.path)
+ expect(blob.path).to eq(entry.path)
end
end
describe '#size' do
it 'returns the entry size' do
- expect(subject.size).to eq(entry.metadata[:size])
+ expect(blob.size).to eq(entry.metadata[:size])
end
end
describe '#mode' do
it 'returns the entry mode' do
- expect(subject.mode).to eq(entry.metadata[:mode])
+ expect(blob.mode).to eq(entry.metadata[:mode])
end
end
describe '#external_storage' do
it 'returns :build_artifact' do
- expect(subject.external_storage).to eq(:build_artifact)
+ expect(blob.external_storage).to eq(:build_artifact)
end
end
describe '#external_url' do
- before do
- allow(Gitlab.config.pages).to receive(:enabled).and_return(true)
- allow(Gitlab.config.pages).to receive(:artifacts_server).and_return(true)
- end
+ subject(:url) { blob.external_url(build) }
- describe '.gif extension' do
- it 'returns nil' do
- expect(subject.external_url(build.project, build)).to be_nil
- end
+ context 'with not allowed extension' do
+ it { is_expected.to be_nil }
end
- context 'txt extensions' do
+ context 'with allowed extension' do
let(:path) { 'other_artifacts_0.1.2/doc_sample.txt' }
let(:entry) { build.artifacts_metadata_entry(path) }
- it 'returns a URL' do
- url = subject.external_url(build.project, build)
-
- expect(url).not_to be_nil
- expect(url).to eq("http://#{project.namespace.path}.#{Gitlab.config.pages.host}/-/#{project.path}/-/jobs/#{build.id}/artifacts/#{path}")
- end
+ it { is_expected.to eq("http://#{project.namespace.path}.example.com/-/project1/-/jobs/#{build.id}/artifacts/other_artifacts_0.1.2/doc_sample.txt") }
context 'when port is configured' do
- let(:port) { 1234 }
-
- it 'returns an URL with port number' do
- allow(Gitlab.config.pages).to receive(:url).and_return("#{Gitlab.config.pages.url}:#{port}")
-
- url = subject.external_url(build.project, build)
+ let(:pages_port) { 1234 }
- expect(url).not_to be_nil
- expect(url).to eq("http://#{project.namespace.path}.#{Gitlab.config.pages.host}:#{port}/-/#{project.path}/-/jobs/#{build.id}/artifacts/#{path}")
- end
+ it { is_expected.to eq("http://#{project.namespace.path}.example.com:1234/-/project1/-/jobs/#{build.id}/artifacts/other_artifacts_0.1.2/doc_sample.txt") }
end
end
end
describe '#external_link?' do
- before do
- allow(Gitlab.config.pages).to receive(:enabled).and_return(true)
- allow(Gitlab.config.pages).to receive(:artifacts_server).and_return(true)
- end
-
- context 'gif extensions' do
+ context 'with not allowed extensions' do
it 'returns false' do
- expect(subject.external_link?(build)).to be false
+ expect(blob.external_link?(build)).to be false
end
end
- context 'txt extensions' do
+ context 'with allowed extensions' do
let(:entry) { build.artifacts_metadata_entry('other_artifacts_0.1.2/doc_sample.txt') }
it 'returns true' do
- expect(subject.external_link?(build)).to be true
+ expect(blob.external_link?(build)).to be true
end
end
end
diff --git a/spec/models/ci/bridge_spec.rb b/spec/models/ci/bridge_spec.rb
index ac994735928..d93250af177 100644
--- a/spec/models/ci/bridge_spec.rb
+++ b/spec/models/ci/bridge_spec.rb
@@ -378,6 +378,91 @@ RSpec.describe Ci::Bridge, feature_category: :continuous_integration do
end
end
+ describe '#variables' do
+ it 'returns bridge scoped variables and pipeline persisted variables' do
+ expect(bridge.variables.to_hash)
+ .to eq(bridge.scoped_variables.concat(bridge.pipeline.persisted_variables).to_hash)
+ end
+ end
+
+ describe '#pipeline_variables' do
+ it 'returns the pipeline variables' do
+ expect(bridge.pipeline_variables).to eq(bridge.pipeline.variables)
+ end
+ end
+
+ describe '#pipeline_schedule_variables' do
+ context 'when pipeline is on a schedule' do
+ let(:pipeline_schedule) { create(:ci_pipeline_schedule, project: project) }
+ let(:pipeline) { create(:ci_pipeline, pipeline_schedule: pipeline_schedule) }
+
+ it 'returns the pipeline schedule variables' do
+ create(:ci_pipeline_schedule_variable, key: 'FOO', value: 'foo', pipeline_schedule: pipeline.pipeline_schedule)
+
+ pipeline_schedule_variables = bridge.reload.pipeline_schedule_variables
+ expect(pipeline_schedule_variables).to match_array([have_attributes({ key: 'FOO', value: 'foo' })])
+ end
+ end
+
+ context 'when pipeline is not on a schedule' do
+ it 'returns empty array' do
+ expect(bridge.pipeline_schedule_variables).to eq([])
+ end
+ end
+ end
+
+ describe '#forward_yaml_variables?' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:forward, :result) do
+ true | true
+ false | false
+ nil | true
+ end
+
+ with_them do
+ let(:options) do
+ {
+ trigger: {
+ project: 'my/project',
+ branch: 'master',
+ forward: { yaml_variables: forward }.compact
+ }
+ }
+ end
+
+ let(:bridge) { build(:ci_bridge, options: options) }
+
+ it { expect(bridge.forward_yaml_variables?).to eq(result) }
+ end
+ end
+
+ describe '#forward_pipeline_variables?' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:forward, :result) do
+ true | true
+ false | false
+ nil | false
+ end
+
+ with_them do
+ let(:options) do
+ {
+ trigger: {
+ project: 'my/project',
+ branch: 'master',
+ forward: { pipeline_variables: forward }.compact
+ }
+ }
+ end
+
+ let(:bridge) { build(:ci_bridge, options: options) }
+
+ it { expect(bridge.forward_pipeline_variables?).to eq(result) }
+ end
+ end
+
describe 'metadata support' do
it 'reads YAML variables from metadata' do
expect(bridge.yaml_variables).not_to be_empty
diff --git a/spec/models/ci/build_dependencies_spec.rb b/spec/models/ci/build_dependencies_spec.rb
index 0709aa47ff1..ab32234eba3 100644
--- a/spec/models/ci/build_dependencies_spec.rb
+++ b/spec/models/ci/build_dependencies_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::BuildDependencies do
+RSpec.describe Ci::BuildDependencies, feature_category: :continuous_integration do
let_it_be(:user) { create(:user) }
let_it_be(:project, reload: true) { create(:project, :repository) }
diff --git a/spec/models/ci/build_metadata_spec.rb b/spec/models/ci/build_metadata_spec.rb
index 8ed0e50e4b0..bd21de1f05a 100644
--- a/spec/models/ci/build_metadata_spec.rb
+++ b/spec/models/ci/build_metadata_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::BuildMetadata do
+RSpec.describe Ci::BuildMetadata, feature_category: :continuous_integration do
let_it_be(:user) { create(:user) }
let_it_be(:group) { create(:group) }
let_it_be(:project) { create(:project, :repository, group: group, build_timeout: 2000) }
diff --git a/spec/models/ci/build_report_result_spec.rb b/spec/models/ci/build_report_result_spec.rb
index 90426f60c73..8f6c95053c9 100644
--- a/spec/models/ci/build_report_result_spec.rb
+++ b/spec/models/ci/build_report_result_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::BuildReportResult do
+RSpec.describe Ci::BuildReportResult, feature_category: :continuous_integration do
let_it_be_with_reload(:build_report_result) { create(:ci_build_report_result, :with_junit_success) }
it_behaves_like 'cleanup by a loose foreign key' do
diff --git a/spec/models/ci/build_runner_session_spec.rb b/spec/models/ci/build_runner_session_spec.rb
index 002aff25593..dac7edbe6cc 100644
--- a/spec/models/ci/build_runner_session_spec.rb
+++ b/spec/models/ci/build_runner_session_spec.rb
@@ -33,7 +33,7 @@ RSpec.describe Ci::BuildRunnerSession, model: true, feature_category: :continuou
session = build_with_local_runner_session_url.reload.runner_session
expect(session.errors).to be_empty
- expect(session).to be_a(Ci::BuildRunnerSession)
+ expect(session).to be_a(described_class)
expect(session.url).to eq(url)
end
end
@@ -59,7 +59,7 @@ RSpec.describe Ci::BuildRunnerSession, model: true, feature_category: :continuou
simple_build.save!
session = simple_build.reload.runner_session
- expect(session).to be_a(Ci::BuildRunnerSession)
+ expect(session).to be_a(described_class)
expect(session.url).to eq(url)
end
diff --git a/spec/models/ci/build_spec.rb b/spec/models/ci/build_spec.rb
index 51cd6efb85f..b7f457962a0 100644
--- a/spec/models/ci/build_spec.rb
+++ b/spec/models/ci/build_spec.rb
@@ -2282,7 +2282,7 @@ RSpec.describe Ci::Build, feature_category: :continuous_integration, factory_def
describe '.keep_artifacts!' do
let!(:build) { create(:ci_build, artifacts_expire_at: Time.current + 7.days, pipeline: pipeline) }
let!(:builds_for_update) do
- Ci::Build.where(id: create_list(:ci_build, 3, artifacts_expire_at: Time.current + 7.days, pipeline: pipeline).map(&:id))
+ described_class.where(id: create_list(:ci_build, 3, artifacts_expire_at: Time.current + 7.days, pipeline: pipeline).map(&:id))
end
it 'resets expire_at' do
@@ -2899,7 +2899,7 @@ RSpec.describe Ci::Build, feature_category: :continuous_integration, factory_def
{ key: 'CI_DEFAULT_BRANCH', value: project.default_branch, public: true, masked: false },
{ key: 'CI_CONFIG_PATH', value: project.ci_config_path_or_default, public: true, masked: false },
{ key: 'CI_PAGES_DOMAIN', value: Gitlab.config.pages.host, public: true, masked: false },
- { key: 'CI_PAGES_URL', value: project.pages_url, public: true, masked: false },
+ { key: 'CI_PAGES_URL', value: Gitlab::Pages::UrlBuilder.new(project).pages_url, public: true, masked: false },
{ key: 'CI_DEPENDENCY_PROXY_SERVER', value: Gitlab.host_with_port, public: true, masked: false },
{ key: 'CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX',
value: "#{Gitlab.host_with_port}/#{project.namespace.root_ancestor.path.downcase}#{DependencyProxy::URL_SUFFIX}",
diff --git a/spec/models/ci/catalog/resource_spec.rb b/spec/models/ci/catalog/resource_spec.rb
index 4c1ade5c308..45d49d65b02 100644
--- a/spec/models/ci/catalog/resource_spec.rb
+++ b/spec/models/ci/catalog/resource_spec.rb
@@ -22,6 +22,8 @@ RSpec.describe Ci::Catalog::Resource, feature_category: :pipeline_composition do
it { is_expected.to delegate_method(:star_count).to(:project) }
it { is_expected.to delegate_method(:forks_count).to(:project) }
+ it { is_expected.to define_enum_for(:state).with_values({ draft: 0, published: 1 }) }
+
describe '.for_projects' do
it 'returns catalog resources for the given project IDs' do
resources_for_projects = described_class.for_projects(project.id)
@@ -65,4 +67,10 @@ RSpec.describe Ci::Catalog::Resource, feature_category: :pipeline_composition do
expect(resource.latest_version).to eq(release3)
end
end
+
+ describe '#state' do
+ it 'defaults to draft' do
+ expect(resource.state).to eq('draft')
+ end
+ end
end
diff --git a/spec/models/ci/daily_build_group_report_result_spec.rb b/spec/models/ci/daily_build_group_report_result_spec.rb
index 6f73d89d760..5de7f5a527f 100644
--- a/spec/models/ci/daily_build_group_report_result_spec.rb
+++ b/spec/models/ci/daily_build_group_report_result_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::DailyBuildGroupReportResult do
+RSpec.describe Ci::DailyBuildGroupReportResult, feature_category: :continuous_integration do
let(:daily_build_group_report_result) { build(:ci_daily_build_group_report_result) }
describe 'associations' do
diff --git a/spec/models/ci/external_pull_request_spec.rb b/spec/models/ci/external_pull_request_spec.rb
new file mode 100644
index 00000000000..2a273146626
--- /dev/null
+++ b/spec/models/ci/external_pull_request_spec.rb
@@ -0,0 +1,242 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Ci::ExternalPullRequest, feature_category: :continuous_integration do
+ let_it_be(:project) { create(:project, :repository) }
+
+ let(:source_branch) { 'the-branch' }
+ let(:status) { :open }
+
+ it { is_expected.to belong_to(:project) }
+
+ shared_examples 'has errors on' do |attribute|
+ it "has errors for #{attribute}" do
+ expect(subject).not_to be_valid
+ expect(subject.errors[attribute]).not_to be_empty
+ end
+ end
+
+ describe 'validations' do
+ context 'when source branch not present' do
+ subject { build(:external_pull_request, source_branch: nil) }
+
+ it_behaves_like 'has errors on', :source_branch
+ end
+
+ context 'when status not present' do
+ subject { build(:external_pull_request, status: nil) }
+
+ it_behaves_like 'has errors on', :status
+ end
+
+ context 'when pull request is from a fork' do
+ subject { build(:external_pull_request, source_repository: 'the-fork', target_repository: 'the-target') }
+
+ it_behaves_like 'has errors on', :base
+ end
+ end
+
+ describe 'create_or_update_from_params' do
+ subject { described_class.create_or_update_from_params(params) }
+
+ context 'when pull request does not exist' do
+ context 'when params are correct' do
+ let(:params) do
+ {
+ project_id: project.id,
+ pull_request_iid: 123,
+ source_branch: 'feature',
+ target_branch: 'master',
+ source_repository: 'the-repository',
+ target_repository: 'the-repository',
+ source_sha: '97de212e80737a608d939f648d959671fb0a0142',
+ target_sha: 'a09386439ca39abe575675ffd4b89ae824fec22f',
+ status: :open
+ }
+ end
+
+ it 'saves the model successfully and returns it' do
+ expect(subject).to be_persisted
+ expect(subject).to be_valid
+ end
+
+ it 'yields the model' do
+ yielded_value = nil
+
+ result = described_class.create_or_update_from_params(params) do |pull_request|
+ yielded_value = pull_request
+ end
+
+ expect(result).to eq(yielded_value)
+ end
+ end
+
+ context 'when params are not correct' do
+ let(:params) do
+ {
+ pull_request_iid: 123,
+ source_branch: 'feature',
+ target_branch: 'master',
+ source_repository: 'the-repository',
+ target_repository: 'the-repository',
+ source_sha: nil,
+ target_sha: nil,
+ status: :open
+ }
+ end
+
+ it 'returns an invalid model' do
+ expect(subject).not_to be_persisted
+ expect(subject).not_to be_valid
+ end
+ end
+ end
+
+ context 'when pull request exists' do
+ let!(:pull_request) do
+ create(:external_pull_request,
+ project: project,
+ source_sha: '97de212e80737a608d939f648d959671fb0a0142')
+ end
+
+ context 'when params are correct' do
+ let(:params) do
+ {
+ pull_request_iid: pull_request.pull_request_iid,
+ source_branch: pull_request.source_branch,
+ target_branch: pull_request.target_branch,
+ source_repository: 'the-repository',
+ target_repository: 'the-repository',
+ source_sha: 'ce84140e8b878ce6e7c4d298c7202ff38170e3ac',
+ target_sha: pull_request.target_sha,
+ status: :open
+ }
+ end
+
+ it 'updates the model successfully and returns it' do
+ expect(subject).to be_valid
+ expect(subject.source_sha).to eq(params[:source_sha])
+ expect(pull_request.reload.source_sha).to eq(params[:source_sha])
+ end
+ end
+
+ context 'when params are not correct' do
+ let(:params) do
+ {
+ pull_request_iid: pull_request.pull_request_iid,
+ source_branch: pull_request.source_branch,
+ target_branch: pull_request.target_branch,
+ source_repository: 'the-repository',
+ target_repository: 'the-repository',
+ source_sha: nil,
+ target_sha: nil,
+ status: :open
+ }
+ end
+
+ it 'returns an invalid model' do
+ expect(subject).not_to be_valid
+ expect(pull_request.reload.source_sha).not_to be_nil
+ expect(pull_request.target_sha).not_to be_nil
+ end
+ end
+ end
+ end
+
+ describe '#open?' do
+ it 'returns true if status is open' do
+ pull_request = create(:external_pull_request, status: :open)
+
+ expect(pull_request).to be_open
+ end
+
+ it 'returns false if status is not open' do
+ pull_request = create(:external_pull_request, status: :closed)
+
+ expect(pull_request).not_to be_open
+ end
+ end
+
+ describe '#closed?' do
+ it 'returns true if status is closed' do
+ pull_request = build(:external_pull_request, status: :closed)
+
+ expect(pull_request).to be_closed
+ end
+
+ it 'returns false if status is not closed' do
+ pull_request = build(:external_pull_request, status: :open)
+
+ expect(pull_request).not_to be_closed
+ end
+ end
+
+ describe '#actual_branch_head?' do
+ let(:project) { create(:project, :repository) }
+ let(:branch) { project.repository.branches.first }
+ let(:source_branch) { branch.name }
+
+ let(:pull_request) do
+ create(:external_pull_request,
+ project: project,
+ source_branch: source_branch,
+ source_sha: source_sha)
+ end
+
+ context 'when source sha matches the head of the branch' do
+ let(:source_sha) { branch.target }
+
+ it 'returns true' do
+ expect(pull_request).to be_actual_branch_head
+ end
+ end
+
+ context 'when source sha does not match the head of the branch' do
+ let(:source_sha) { project.repository.commit('HEAD').sha }
+
+ it 'returns true' do
+ expect(pull_request).not_to be_actual_branch_head
+ end
+ end
+ end
+
+ describe '#from_fork?' do
+ it 'returns true if source_repository differs from target_repository' do
+ pull_request = build(:external_pull_request,
+ source_repository: 'repository-1',
+ target_repository: 'repository-2')
+
+ expect(pull_request).to be_from_fork
+ end
+
+ it 'returns false if source_repository is the same as target_repository' do
+ pull_request = build(:external_pull_request,
+ source_repository: 'repository-1',
+ target_repository: 'repository-1')
+
+ expect(pull_request).not_to be_from_fork
+ end
+ end
+
+ describe '#modified_paths' do
+ let(:pull_request) do
+ build(:external_pull_request, project: project, target_sha: '281d3a7', source_sha: '498214d')
+ end
+
+ subject(:modified_paths) { pull_request.modified_paths }
+
+ it 'returns modified paths' do
+ expect(modified_paths).to eq ['bar/branch-test.txt',
+ 'files/js/commit.coffee',
+ 'with space/README.md']
+ end
+ end
+
+ context 'with a loose foreign key on external_pull_requests.project_id' do
+ it_behaves_like 'cleanup by a loose foreign key' do
+ let!(:parent) { create(:project) }
+ let!(:model) { create(:external_pull_request, project: parent) }
+ end
+ end
+end
diff --git a/spec/models/ci/group_variable_spec.rb b/spec/models/ci/group_variable_spec.rb
index 5a8a2b391e1..bf2405a5936 100644
--- a/spec/models/ci/group_variable_spec.rb
+++ b/spec/models/ci/group_variable_spec.rb
@@ -13,13 +13,19 @@ RSpec.describe Ci::GroupVariable, feature_category: :secrets_management do
it { is_expected.to include_module(Presentable) }
it { is_expected.to include_module(Ci::Maskable) }
it { is_expected.to include_module(HasEnvironmentScope) }
- it { is_expected.to validate_uniqueness_of(:key).scoped_to([:group_id, :environment_scope]).with_message(/\(\w+\) has already been taken/) }
+
+ describe 'validations' do
+ it { is_expected.to validate_uniqueness_of(:key).scoped_to([:group_id, :environment_scope]).with_message(/\(\w+\) has already been taken/) }
+ it { is_expected.to allow_values('').for(:description) }
+ it { is_expected.to allow_values(nil).for(:description) }
+ it { is_expected.to validate_length_of(:description).is_at_most(255) }
+ end
describe '.by_environment_scope' do
let!(:matching_variable) { create(:ci_group_variable, environment_scope: 'production ') }
let!(:non_matching_variable) { create(:ci_group_variable, environment_scope: 'staging') }
- subject { Ci::GroupVariable.by_environment_scope('production') }
+ subject { described_class.by_environment_scope('production') }
it { is_expected.to contain_exactly(matching_variable) }
end
@@ -84,6 +90,49 @@ RSpec.describe Ci::GroupVariable, feature_category: :secrets_management do
end
end
+ describe 'sort_by_attribute' do
+ let_it_be(:group) { create(:group) }
+ let_it_be(:environment_scope) { 'env_scope' }
+ let_it_be(:variable1) { create(:ci_group_variable, key: 'd_var', group: group, environment_scope: environment_scope, created_at: 4.days.ago) }
+ let_it_be(:variable2) { create(:ci_group_variable, key: 'a_var', group: group, environment_scope: environment_scope, created_at: 3.days.ago) }
+ let_it_be(:variable3) { create(:ci_group_variable, key: 'c_var', group: group, environment_scope: environment_scope, created_at: 2.days.ago) }
+ let_it_be(:variable4) { create(:ci_group_variable, key: 'b_var', group: group, environment_scope: environment_scope, created_at: 1.day.ago) }
+
+ let(:sort_by_attribute) { described_class.sort_by_attribute(method).pluck(:key) }
+
+ describe '.created_at_asc' do
+ let(:method) { 'created_at_asc' }
+
+ it 'order by created_at ascending' do
+ expect(sort_by_attribute).to eq(%w[d_var a_var c_var b_var])
+ end
+ end
+
+ describe '.created_at_desc' do
+ let(:method) { 'created_at_desc' }
+
+ it 'order by created_at descending' do
+ expect(sort_by_attribute).to eq(%w[b_var c_var a_var d_var])
+ end
+ end
+
+ describe '.key_asc' do
+ let(:method) { 'key_asc' }
+
+ it 'order by key ascending' do
+ expect(sort_by_attribute).to eq(%w[a_var b_var c_var d_var])
+ end
+ end
+
+ describe '.key_desc' do
+ let(:method) { 'key_desc' }
+
+ it 'order by key descending' do
+ expect(sort_by_attribute).to eq(%w[d_var c_var b_var a_var])
+ end
+ end
+ end
+
it_behaves_like 'cleanup by a loose foreign key' do
let!(:model) { create(:ci_group_variable) }
diff --git a/spec/models/ci/job_artifact_spec.rb b/spec/models/ci/job_artifact_spec.rb
index a34657adf60..83c233fa942 100644
--- a/spec/models/ci/job_artifact_spec.rb
+++ b/spec/models/ci/job_artifact_spec.rb
@@ -204,7 +204,7 @@ RSpec.describe Ci::JobArtifact, feature_category: :build_artifacts do
describe '.associated_file_types_for' do
using RSpec::Parameterized::TableSyntax
- subject { Ci::JobArtifact.associated_file_types_for(file_type) }
+ subject { described_class.associated_file_types_for(file_type) }
where(:file_type, :result) do
'codequality' | %w(codequality)
diff --git a/spec/models/ci/persistent_ref_spec.rb b/spec/models/ci/persistent_ref_spec.rb
index e488580ae7b..ecaa8f59ecf 100644
--- a/spec/models/ci/persistent_ref_spec.rb
+++ b/spec/models/ci/persistent_ref_spec.rb
@@ -3,14 +3,28 @@
require 'spec_helper'
RSpec.describe Ci::PersistentRef do
- it 'cleans up persistent refs after pipeline finished' do
+ it 'cleans up persistent refs after pipeline finished', :sidekiq_inline do
pipeline = create(:ci_pipeline, :running)
- expect(pipeline.persistent_ref).to receive(:delete).once
+ expect(Ci::PipelineCleanupRefWorker).to receive(:perform_async).with(pipeline.id)
pipeline.succeed!
end
+ context 'when pipeline_cleanup_ref_worker_async is disabled' do
+ before do
+ stub_feature_flags(pipeline_cleanup_ref_worker_async: false)
+ end
+
+ it 'cleans up persistent refs after pipeline finished' do
+ pipeline = create(:ci_pipeline, :running)
+
+ expect(pipeline.persistent_ref).to receive(:delete).once
+
+ pipeline.succeed!
+ end
+ end
+
describe '#exist?' do
subject { pipeline.persistent_ref.exist? }
@@ -72,7 +86,7 @@ RSpec.describe Ci::PersistentRef do
describe '#delete' do
subject { pipeline.persistent_ref.delete }
- let(:pipeline) { create(:ci_pipeline, sha: sha, project: project) }
+ let(:pipeline) { create(:ci_pipeline, :success, sha: sha, project: project) }
let(:project) { create(:project, :repository) }
let(:sha) { project.repository.commit.sha }
diff --git a/spec/models/ci/pipeline_artifact_spec.rb b/spec/models/ci/pipeline_artifact_spec.rb
index 3038cdc944b..eb89c7af208 100644
--- a/spec/models/ci/pipeline_artifact_spec.rb
+++ b/spec/models/ci/pipeline_artifact_spec.rb
@@ -101,7 +101,7 @@ RSpec.describe Ci::PipelineArtifact, type: :model do
end
describe '.report_exists?' do
- subject(:pipeline_artifact) { Ci::PipelineArtifact.report_exists?(file_type) }
+ subject(:pipeline_artifact) { described_class.report_exists?(file_type) }
context 'when file_type is code_coverage' do
let(:file_type) { :code_coverage }
@@ -149,7 +149,7 @@ RSpec.describe Ci::PipelineArtifact, type: :model do
end
describe '.find_by_file_type' do
- subject(:pipeline_artifact) { Ci::PipelineArtifact.find_by_file_type(file_type) }
+ subject(:pipeline_artifact) { described_class.find_by_file_type(file_type) }
context 'when file_type is code_coverage' do
let(:file_type) { :code_coverage }
@@ -204,7 +204,7 @@ RSpec.describe Ci::PipelineArtifact, type: :model do
let(:size) { file['tempfile'].size }
subject do
- Ci::PipelineArtifact.create_or_replace_for_pipeline!(
+ described_class.create_or_replace_for_pipeline!(
pipeline: pipeline,
file_type: file_type,
file: file,
@@ -231,7 +231,7 @@ RSpec.describe Ci::PipelineArtifact, type: :model do
end
it "creates a new pipeline artifact with pipeline's locked state" do
- artifact = Ci::PipelineArtifact.create_or_replace_for_pipeline!(
+ artifact = described_class.create_or_replace_for_pipeline!(
pipeline: pipeline,
file_type: file_type,
file: file,
diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb
index b9e331affb1..ae3725a0b08 100644
--- a/spec/models/ci/pipeline_spec.rb
+++ b/spec/models/ci/pipeline_spec.rb
@@ -1328,11 +1328,34 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep, feature_category:
%w[succeed! drop! cancel! skip! block! delay!].each do |action|
context "when the pipeline received #{action} event" do
- it 'deletes a persistent ref' do
- expect(pipeline.persistent_ref).to receive(:delete).once
+ it 'deletes a persistent ref asynchronously', :sidekiq_inline do
+ expect(pipeline.persistent_ref).not_to receive(:delete_refs)
+
+ expect(Ci::PipelineCleanupRefWorker).to receive(:perform_async)
+ .with(pipeline.id).and_call_original
+
+ expect_next_instance_of(Ci::PersistentRef) do |persistent_ref|
+ expect(persistent_ref).to receive(:delete_refs)
+ .with("refs/#{Repository::REF_PIPELINES}/#{pipeline.id}").once
+ end
pipeline.public_send(action)
end
+
+ context 'when pipeline_cleanup_ref_worker_async is disabled' do
+ before do
+ stub_feature_flags(pipeline_cleanup_ref_worker_async: false)
+ end
+
+ it 'deletes a persistent ref synchronously' do
+ expect(Ci::PipelineCleanupRefWorker).not_to receive(:perform_async).with(pipeline.id)
+
+ expect(pipeline.persistent_ref).to receive(:delete_refs).once
+ .with("refs/#{Repository::REF_PIPELINES}/#{pipeline.id}")
+
+ pipeline.public_send(action)
+ end
+ end
end
end
@@ -5323,7 +5346,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep, feature_category:
it 'raises an exception' do
pipeline.save!
- pipeline_id = Ci::Pipeline.where(id: pipeline.id).select(:id).first
+ pipeline_id = described_class.where(id: pipeline.id).select(:id).first
expect { pipeline_id.age_in_minutes }.to raise_error(ArgumentError)
end
diff --git a/spec/models/ci/processable_spec.rb b/spec/models/ci/processable_spec.rb
index 86894ebcf2d..e1c449e18ac 100644
--- a/spec/models/ci/processable_spec.rb
+++ b/spec/models/ci/processable_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe Ci::Processable, feature_category: :continuous_integration do
let_it_be(:pipeline) { create(:ci_pipeline, project: project) }
describe 'delegations' do
- subject { Ci::Processable.new }
+ subject { described_class.new }
it { is_expected.to delegate_method(:merge_request?).to(:pipeline) }
it { is_expected.to delegate_method(:merge_request_ref?).to(:pipeline) }
@@ -401,7 +401,7 @@ RSpec.describe Ci::Processable, feature_category: :continuous_integration do
let!(:another_build) { create(:ci_build, project: project) }
before do
- Ci::Processable.update_all(scheduling_type: nil)
+ described_class.update_all(scheduling_type: nil)
end
it 'populates scheduling_type of processables' do
diff --git a/spec/models/ci/ref_spec.rb b/spec/models/ci/ref_spec.rb
index eab5a40bc30..a60aed98a21 100644
--- a/spec/models/ci/ref_spec.rb
+++ b/spec/models/ci/ref_spec.rb
@@ -74,7 +74,7 @@ RSpec.describe Ci::Ref do
it 'returns an existing ci_ref' do
expect { subject }.not_to change { described_class.count }
- expect(subject).to eq(Ci::Ref.find_by(project_id: project.id, ref_path: expected_ref_path))
+ expect(subject).to eq(described_class.find_by(project_id: project.id, ref_path: expected_ref_path))
end
end
@@ -84,7 +84,7 @@ RSpec.describe Ci::Ref do
it 'creates a new ci_ref' do
expect { subject }.to change { described_class.count }.by(1)
- expect(subject).to eq(Ci::Ref.find_by(project_id: project.id, ref_path: expected_ref_path))
+ expect(subject).to eq(described_class.find_by(project_id: project.id, ref_path: expected_ref_path))
end
end
end
diff --git a/spec/models/ci/runner_manager_spec.rb b/spec/models/ci/runner_manager_spec.rb
index d69c9ef845e..80cffb98dff 100644
--- a/spec/models/ci/runner_manager_spec.rb
+++ b/spec/models/ci/runner_manager_spec.rb
@@ -69,6 +69,49 @@ RSpec.describe Ci::RunnerManager, feature_category: :runner_fleet, type: :model
it { is_expected.to eq(7.days.ago) }
end
+ describe '.for_runner' do
+ subject(:runner_managers) { described_class.for_runner(runner_arg) }
+
+ let_it_be(:runner1) { create(:ci_runner) }
+ let_it_be(:runner_manager11) { create(:ci_runner_machine, runner: runner1) }
+ let_it_be(:runner_manager12) { create(:ci_runner_machine, runner: runner1) }
+
+ context 'with single runner' do
+ let(:runner_arg) { runner1 }
+
+ it { is_expected.to contain_exactly(runner_manager11, runner_manager12) }
+ end
+
+ context 'with multiple runners' do
+ let(:runner_arg) { [runner1, runner2] }
+
+ let_it_be(:runner2) { create(:ci_runner) }
+ let_it_be(:runner_manager2) { create(:ci_runner_machine, runner: runner2) }
+
+ it { is_expected.to contain_exactly(runner_manager11, runner_manager12, runner_manager2) }
+ end
+ end
+
+ describe '.aggregate_upgrade_status_by_runner_id' do
+ let!(:runner_version1) { create(:ci_runner_version, version: '16.0.0', status: :recommended) }
+ let!(:runner_version2) { create(:ci_runner_version, version: '16.0.1', status: :available) }
+
+ let!(:runner1) { create(:ci_runner) }
+ let!(:runner2) { create(:ci_runner) }
+ let!(:runner_manager11) { create(:ci_runner_machine, runner: runner1, version: runner_version1.version) }
+ let!(:runner_manager12) { create(:ci_runner_machine, runner: runner1, version: runner_version2.version) }
+ let!(:runner_manager2) { create(:ci_runner_machine, runner: runner2, version: runner_version2.version) }
+
+ subject { described_class.aggregate_upgrade_status_by_runner_id }
+
+ it 'contains aggregate runner upgrade status by runner ID' do
+ is_expected.to eq({
+ runner1.id => :recommended,
+ runner2.id => :available
+ })
+ end
+ end
+
describe '#status', :freeze_time do
let(:runner_manager) { build(:ci_runner_machine, created_at: 8.days.ago) }
diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb
index b0ff070e4a6..50e2ded695c 100644
--- a/spec/models/ci/runner_spec.rb
+++ b/spec/models/ci/runner_spec.rb
@@ -316,8 +316,7 @@ RSpec.describe Ci::Runner, type: :model, feature_category: :runner do
context 'when use_traversal_ids* are disabled' do
before do
stub_feature_flags(
- use_traversal_ids: false,
- use_traversal_ids_for_ancestors: false
+ use_traversal_ids: false
)
end
diff --git a/spec/models/ci/stage_spec.rb b/spec/models/ci/stage_spec.rb
index 79e92082ee1..1be50083cd4 100644
--- a/spec/models/ci/stage_spec.rb
+++ b/spec/models/ci/stage_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::Stage, :models do
+RSpec.describe Ci::Stage, :models, feature_category: :continuous_integration do
let_it_be(:pipeline) { create(:ci_empty_pipeline) }
let(:stage) { create(:ci_stage, pipeline: pipeline, project: pipeline.project) }
diff --git a/spec/models/ci/variable_spec.rb b/spec/models/ci/variable_spec.rb
index 85327dbeb34..c93f355718a 100644
--- a/spec/models/ci/variable_spec.rb
+++ b/spec/models/ci/variable_spec.rb
@@ -15,13 +15,16 @@ RSpec.describe Ci::Variable, feature_category: :secrets_management do
it { is_expected.to include_module(Ci::Maskable) }
it { is_expected.to include_module(HasEnvironmentScope) }
it { is_expected.to validate_uniqueness_of(:key).scoped_to(:project_id, :environment_scope).with_message(/\(\w+\) has already been taken/) }
+ it { is_expected.to allow_values('').for(:description) }
+ it { is_expected.to allow_values(nil).for(:description) }
+ it { is_expected.to validate_length_of(:description).is_at_most(255) }
end
describe '.by_environment_scope' do
let!(:matching_variable) { create(:ci_variable, environment_scope: 'production ') }
let!(:non_matching_variable) { create(:ci_variable, environment_scope: 'staging') }
- subject { Ci::Variable.by_environment_scope('production') }
+ subject { described_class.by_environment_scope('production') }
it { is_expected.to contain_exactly(matching_variable) }
end
diff --git a/spec/models/ci_platform_metric_spec.rb b/spec/models/ci_platform_metric_spec.rb
index e59730792b8..1f25f10c5d2 100644
--- a/spec/models/ci_platform_metric_spec.rb
+++ b/spec/models/ci_platform_metric_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe CiPlatformMetric, feature_category: :continuous_integration do
subject { build(:ci_platform_metric) }
- it_behaves_like 'a BulkInsertSafe model', CiPlatformMetric do
+ it_behaves_like 'a BulkInsertSafe model', described_class do
let(:valid_items_for_bulk_insertion) { build_list(:ci_platform_metric, 10) }
let(:invalid_items_for_bulk_insertion) { [] } # class does not have any non-constraint validations defined
end
diff --git a/spec/models/clusters/agent_spec.rb b/spec/models/clusters/agent_spec.rb
index 7c546f42d5d..6201b7b1861 100644
--- a/spec/models/clusters/agent_spec.rb
+++ b/spec/models/clusters/agent_spec.rb
@@ -198,14 +198,6 @@ RSpec.describe Clusters::Agent, feature_category: :deployment_management do
it { is_expected.to eq(allowed) }
end
-
- context 'when expose_authorized_cluster_agents feature flag is disabled' do
- before do
- stub_feature_flags(expose_authorized_cluster_agents: false)
- end
-
- it { is_expected.to eq(false) }
- end
end
context 'with group-level authorization' do
@@ -226,14 +218,6 @@ RSpec.describe Clusters::Agent, feature_category: :deployment_management do
it { is_expected.to eq(allowed) }
end
-
- context 'when expose_authorized_cluster_agents feature flag is disabled' do
- before do
- stub_feature_flags(expose_authorized_cluster_agents: false)
- end
-
- it { is_expected.to eq(false) }
- end
end
end
@@ -269,14 +253,6 @@ RSpec.describe Clusters::Agent, feature_category: :deployment_management do
it { is_expected.to eq(allowed) }
end
-
- context 'when expose_authorized_cluster_agents feature flag is disabled' do
- before do
- stub_feature_flags(expose_authorized_cluster_agents: false)
- end
-
- it { is_expected.to eq(false) }
- end
end
context 'with group-level authorization' do
@@ -297,14 +273,6 @@ RSpec.describe Clusters::Agent, feature_category: :deployment_management do
it { is_expected.to eq(allowed) }
end
-
- context 'when expose_authorized_cluster_agents feature flag is disabled' do
- before do
- stub_feature_flags(expose_authorized_cluster_agents: false)
- end
-
- it { is_expected.to eq(false) }
- end
end
end
diff --git a/spec/models/clusters/cluster_spec.rb b/spec/models/clusters/cluster_spec.rb
index 99932dc27d1..73df283d996 100644
--- a/spec/models/clusters/cluster_spec.rb
+++ b/spec/models/clusters/cluster_spec.rb
@@ -983,7 +983,7 @@ RSpec.describe Clusters::Cluster, :use_clean_rails_memory_store_caching,
end
describe '#make_cleanup_errored!' do
- non_errored_states = Clusters::Cluster.state_machines[:cleanup_status].states.keys - [:cleanup_errored]
+ non_errored_states = described_class.state_machines[:cleanup_status].states.keys - [:cleanup_errored]
non_errored_states.each do |state|
it "transitions cleanup_status from #{state} to cleanup_errored" do
diff --git a/spec/models/commit_spec.rb b/spec/models/commit_spec.rb
index edb856d34df..dd3d4f1865c 100644
--- a/spec/models/commit_spec.rb
+++ b/spec/models/commit_spec.rb
@@ -88,7 +88,7 @@ RSpec.describe Commit do
it 'returns a Commit' do
commit = described_class.build_from_sidekiq_hash(project, id: '123')
- expect(commit).to be_an_instance_of(Commit)
+ expect(commit).to be_an_instance_of(described_class)
end
it 'parses date strings into Time instances' do
diff --git a/spec/models/commit_status_spec.rb b/spec/models/commit_status_spec.rb
index 38c45e8c975..ac356bcd65a 100644
--- a/spec/models/commit_status_spec.rb
+++ b/spec/models/commit_status_spec.rb
@@ -113,7 +113,7 @@ RSpec.describe CommitStatus, feature_category: :continuous_integration do
let!(:stale_scheduled) { create(:commit_status, scheduled_at: 1.day.ago) }
let!(:fresh_scheduled) { create(:commit_status, scheduled_at: 1.minute.ago) }
- subject { CommitStatus.scheduled_at_before(1.hour.ago) }
+ subject { described_class.scheduled_at_before(1.hour.ago) }
it { is_expected.to contain_exactly(stale_scheduled) }
end
@@ -141,7 +141,7 @@ RSpec.describe CommitStatus, feature_category: :continuous_integration do
commit_status.update!(retried: false, status: :pending)
# another process does mark object as processed
- CommitStatus.find(commit_status.id).update_column(:processed, true)
+ described_class.find(commit_status.id).update_column(:processed, true)
# subsequent status transitions on the same instance
# always saves processed=false to DB even though
@@ -149,7 +149,7 @@ RSpec.describe CommitStatus, feature_category: :continuous_integration do
commit_status.update!(retried: false, status: :running)
# we look at a persisted state in DB
- expect(CommitStatus.find(commit_status.id).processed).to eq(false)
+ expect(described_class.find(commit_status.id).processed).to eq(false)
end
end
diff --git a/spec/models/concerns/batch_destroy_dependent_associations_spec.rb b/spec/models/concerns/batch_destroy_dependent_associations_spec.rb
index e8d84fe9630..256cd386ce2 100644
--- a/spec/models/concerns/batch_destroy_dependent_associations_spec.rb
+++ b/spec/models/concerns/batch_destroy_dependent_associations_spec.rb
@@ -27,7 +27,7 @@ RSpec.describe BatchDestroyDependentAssociations do
let_it_be(:build) { create(:ci_build, project: project) }
let_it_be(:notification_setting) { create(:notification_setting, project: project) }
let_it_be(:note) { create(:note, project: project) }
- let_it_be(:merge_request) { create(:merge_request, source_project: project) }
+ let_it_be(:merge_request) { create(:merge_request, :skip_diff_creation, source_project: project) }
it 'destroys multiple notes' do
create(:note, project: project)
diff --git a/spec/models/concerns/counter_attribute_spec.rb b/spec/models/concerns/counter_attribute_spec.rb
index c8224c64ba2..cde58e4088c 100644
--- a/spec/models/concerns/counter_attribute_spec.rb
+++ b/spec/models/concerns/counter_attribute_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe CounterAttribute, :counter_attribute, :clean_gitlab_redis_shared_
let(:project_statistics) { create(:project_statistics) }
let(:model) { CounterAttributeModel.find(project_statistics.id) }
- it_behaves_like CounterAttribute, [:build_artifacts_size, :commit_count, :packages_size] do
+ it_behaves_like described_class, [:build_artifacts_size, :commit_count, :packages_size] do
let(:model) { CounterAttributeModel.find(project_statistics.id) }
end
diff --git a/spec/models/concerns/database_event_tracking_spec.rb b/spec/models/concerns/database_event_tracking_spec.rb
index 502cecaaf76..a99b4737537 100644
--- a/spec/models/concerns/database_event_tracking_spec.rb
+++ b/spec/models/concerns/database_event_tracking_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe DatabaseEventTracking, :snowplow do
+RSpec.describe DatabaseEventTracking, :snowplow, feature_category: :service_ping do
before do
allow(Gitlab::Tracking).to receive(:database_event).and_call_original
end
@@ -31,18 +31,6 @@ RSpec.describe DatabaseEventTracking, :snowplow do
end
end
- context 'if product_intelligence_database_event_tracking FF is off' do
- before do
- stub_feature_flags(product_intelligence_database_event_tracking: false)
- end
-
- it 'does not track the event' do
- create_test_class_record
-
- expect_no_snowplow_event(tracking_method: :database_event)
- end
- end
-
describe 'event tracking' do
let(:category) { test_class.to_s }
let(:event) { 'database_event' }
diff --git a/spec/models/concerns/expirable_spec.rb b/spec/models/concerns/expirable_spec.rb
index 68a25917ce1..78fe265a6bb 100644
--- a/spec/models/concerns/expirable_spec.rb
+++ b/spec/models/concerns/expirable_spec.rb
@@ -12,7 +12,7 @@ RSpec.describe Expirable do
end
describe '.expired' do
- it { expect(ProjectMember.expired).to match_array([expired]) }
+ it { expect(ProjectMember.expired).to contain_exactly(expired) }
it 'scopes the query when multiple models are expirable' do
expired_access_token = create(:personal_access_token, :expired, user: no_expire.user)
diff --git a/spec/models/concerns/group_descendant_spec.rb b/spec/models/concerns/group_descendant_spec.rb
index d593d829dca..f27f3a5e6a0 100644
--- a/spec/models/concerns/group_descendant_spec.rb
+++ b/spec/models/concerns/group_descendant_spec.rb
@@ -19,16 +19,15 @@ RSpec.describe GroupDescendant do
query_count = ActiveRecord::QueryRecorder.new { test_group.hierarchy }.count
- # use_traversal_ids_for_ancestors_upto actor based feature flag check adds an extra query.
- expect(query_count).to eq(2)
+ expect(query_count).to eq(1)
end
it 'only queries once for the ancestors when a top is given' do
test_group = create(:group, parent: subsub_group).reload
recorder = ActiveRecord::QueryRecorder.new { test_group.hierarchy(subgroup) }
- # use_traversal_ids_for_ancestors_upto actor based feature flag check adds an extra query.
- expect(recorder.count).to eq(2)
+
+ expect(recorder.count).to eq(1)
end
it 'builds a hierarchy for a group' do
diff --git a/spec/models/concerns/has_user_type_spec.rb b/spec/models/concerns/has_user_type_spec.rb
index f9bf576d75b..49c3d11ed6b 100644
--- a/spec/models/concerns/has_user_type_spec.rb
+++ b/spec/models/concerns/has_user_type_spec.rb
@@ -15,7 +15,7 @@ RSpec.describe User, feature_category: :system_access do
describe 'validations' do
it 'validates type presence' do
- expect(User.new).to validate_presence_of(:user_type)
+ expect(described_class.new).to validate_presence_of(:user_type)
end
end
diff --git a/spec/models/concerns/integrations/enable_ssl_verification_spec.rb b/spec/models/concerns/integrations/enable_ssl_verification_spec.rb
index 802e950c0c2..418f3f4dbc6 100644
--- a/spec/models/concerns/integrations/enable_ssl_verification_spec.rb
+++ b/spec/models/concerns/integrations/enable_ssl_verification_spec.rb
@@ -19,5 +19,5 @@ RSpec.describe Integrations::EnableSslVerification do
let(:integration) { described_class.new }
- include_context Integrations::EnableSslVerification
+ include_context described_class
end
diff --git a/spec/models/concerns/integrations/reset_secret_fields_spec.rb b/spec/models/concerns/integrations/reset_secret_fields_spec.rb
index a372550c70f..3b15b95fea9 100644
--- a/spec/models/concerns/integrations/reset_secret_fields_spec.rb
+++ b/spec/models/concerns/integrations/reset_secret_fields_spec.rb
@@ -15,5 +15,5 @@ RSpec.describe Integrations::ResetSecretFields do
let(:integration) { described_class.new }
- it_behaves_like Integrations::ResetSecretFields
+ it_behaves_like described_class
end
diff --git a/spec/models/concerns/issuable_spec.rb b/spec/models/concerns/issuable_spec.rb
index 4e99419a7f2..e4af778b967 100644
--- a/spec/models/concerns/issuable_spec.rb
+++ b/spec/models/concerns/issuable_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Issuable do
+RSpec.describe Issuable, feature_category: :team_planning do
include ProjectForksHelper
using RSpec::Parameterized::TableSyntax
diff --git a/spec/models/concerns/milestoneish_spec.rb b/spec/models/concerns/milestoneish_spec.rb
index 46a876f34e9..01efe66a419 100644
--- a/spec/models/concerns/milestoneish_spec.rb
+++ b/spec/models/concerns/milestoneish_spec.rb
@@ -356,4 +356,20 @@ RSpec.describe Milestone, 'Milestoneish', factory_default: :keep do
expect(milestone.human_total_time_estimate).to be_nil
end
end
+
+ describe '#expires_at' do
+ it 'returns the date when milestone expires' do
+ due_date = Date.today + 1.day
+ milestone.due_date = due_date
+
+ expect(milestone.expires_at).to eq("expires on #{due_date.to_fs(:medium)}")
+ end
+
+ it 'returns the date when milestone expires' do
+ due_date = Date.today - 1.day
+ milestone.due_date = due_date
+
+ expect(milestone.expires_at).to eq("expired on #{due_date.to_fs(:medium)}")
+ end
+ end
end
diff --git a/spec/models/concerns/resolvable_note_spec.rb b/spec/models/concerns/resolvable_note_spec.rb
index 69c58a5cfe5..09646f6c4eb 100644
--- a/spec/models/concerns/resolvable_note_spec.rb
+++ b/spec/models/concerns/resolvable_note_spec.rb
@@ -18,25 +18,25 @@ RSpec.describe Note, ResolvableNote do
describe '.potentially_resolvable' do
it 'includes diff and discussion notes on merge requests' do
- expect(Note.potentially_resolvable).to match_array([note3, note4, note6])
+ expect(described_class.potentially_resolvable).to match_array([note3, note4, note6])
end
end
describe '.resolvable' do
it 'includes non-system diff and discussion notes on merge requests' do
- expect(Note.resolvable).to match_array([note3, note4])
+ expect(described_class.resolvable).to match_array([note3, note4])
end
end
describe '.resolved' do
it 'includes resolved non-system diff and discussion notes on merge requests' do
- expect(Note.resolved).to match_array([note3])
+ expect(described_class.resolved).to match_array([note3])
end
end
describe '.unresolved' do
it 'includes non-resolved non-system diff and discussion notes on merge requests' do
- expect(Note.unresolved).to match_array([note4])
+ expect(described_class.unresolved).to match_array([note4])
end
end
end
diff --git a/spec/models/concerns/spammable_spec.rb b/spec/models/concerns/spammable_spec.rb
index 8a2fa6675e5..7ef0473aea8 100644
--- a/spec/models/concerns/spammable_spec.rb
+++ b/spec/models/concerns/spammable_spec.rb
@@ -71,8 +71,8 @@ RSpec.describe Spammable, feature_category: :instance_resiliency do
expect(issue.check_for_spam?(user: issue.author)).to eq(true)
end
- it 'returns false for other visibility levels' do
- expect(issue.check_for_spam?(user: issue.author)).to eq(false)
+ it 'returns true for other visibility levels' do
+ expect(issue.check_for_spam?(user: issue.author)).to eq(true)
end
end
@@ -82,7 +82,7 @@ RSpec.describe Spammable, feature_category: :instance_resiliency do
end
context 'when the model is spam' do
- where(model: [:issue, :merge_request, :snippet, :spammable_model])
+ where(model: [:issue, :merge_request, :note, :snippet, :spammable_model])
with_them do
subject do
@@ -94,21 +94,7 @@ RSpec.describe Spammable, feature_category: :instance_resiliency do
it 'has an error related to spam on the model' do
expect(subject.errors.messages[:base])
- .to match_array /Your #{subject.class.model_name.human.downcase} has been recognized as spam./
- end
- end
-
- context 'when the spammable model is a Note' do
- subject do
- Note.new.tap do |m|
- m.spam!
- m.invalidate_if_spam
- end
- end
-
- it 'has an error related to spam on the model' do
- expect(subject.errors.messages[:base])
- .to match_array /Your comment has been recognized as spam./
+ .to match_array /Your #{subject.spammable_entity_type} has been recognized as spam./
end
end
end
@@ -293,7 +279,9 @@ RSpec.describe Spammable, feature_category: :instance_resiliency do
end
describe '#allow_possible_spam?' do
- subject { issue.allow_possible_spam? }
+ let_it_be(:user) { build(:user) }
+
+ subject { spammable_model.allow_possible_spam?(user) }
context 'when the `allow_possible_spam` application setting is turned off' do
it { is_expected.to eq(false) }
diff --git a/spec/models/concerns/token_authenticatable_spec.rb b/spec/models/concerns/token_authenticatable_spec.rb
index 70123eaac26..cbfc1df64f1 100644
--- a/spec/models/concerns/token_authenticatable_spec.rb
+++ b/spec/models/concerns/token_authenticatable_spec.rb
@@ -112,8 +112,8 @@ RSpec.describe PersonalAccessToken, 'TokenAuthenticatable' do
it 'sets new token' do
subject
- expect(personal_access_token.token).to eq("#{PersonalAccessToken.token_prefix}#{token_value}")
- expect(personal_access_token.token_digest).to eq(Gitlab::CryptoHelper.sha256("#{PersonalAccessToken.token_prefix}#{token_value}"))
+ expect(personal_access_token.token).to eq("#{described_class.token_prefix}#{token_value}")
+ expect(personal_access_token.token_digest).to eq(Gitlab::CryptoHelper.sha256("#{described_class.token_prefix}#{token_value}"))
end
end
@@ -138,7 +138,7 @@ RSpec.describe PersonalAccessToken, 'TokenAuthenticatable' do
end
describe '.find_by_token' do
- subject { PersonalAccessToken.find_by_token(token_value) }
+ subject { described_class.find_by_token(token_value) }
it 'finds the token' do
personal_access_token.save!
@@ -347,7 +347,7 @@ RSpec.describe Ci::Runner, 'TokenAuthenticatable', :freeze_time do
end
describe '.find_by_token' do
- subject { Ci::Runner.find_by_token(runner.token) }
+ subject { described_class.find_by_token(runner.token) }
context 'when runner has no token expiration' do
let(:runner) { non_expirable_runner }
diff --git a/spec/models/concerns/vulnerability_finding_signature_helpers_spec.rb b/spec/models/concerns/vulnerability_finding_signature_helpers_spec.rb
index 0a71699971e..842020896d9 100644
--- a/spec/models/concerns/vulnerability_finding_signature_helpers_spec.rb
+++ b/spec/models/concerns/vulnerability_finding_signature_helpers_spec.rb
@@ -16,6 +16,7 @@ RSpec.describe VulnerabilityFindingSignatureHelpers do
describe '#priority' do
it 'returns numeric values of the priority string' do
+ expect(cls.new('scope_offset_compressed').priority).to eq(4)
expect(cls.new('scope_offset').priority).to eq(3)
expect(cls.new('location').priority).to eq(2)
expect(cls.new('hash').priority).to eq(1)
@@ -24,6 +25,7 @@ RSpec.describe VulnerabilityFindingSignatureHelpers do
describe '#self.priority' do
it 'returns the numeric value of the provided string' do
+ expect(cls.priority('scope_offset_compressed')).to eq(4)
expect(cls.priority('scope_offset')).to eq(3)
expect(cls.priority('location')).to eq(2)
expect(cls.priority('hash')).to eq(1)
diff --git a/spec/models/container_expiration_policy_spec.rb b/spec/models/container_expiration_policy_spec.rb
index b88eddf19dc..e5f9fdd410e 100644
--- a/spec/models/container_expiration_policy_spec.rb
+++ b/spec/models/container_expiration_policy_spec.rb
@@ -11,8 +11,7 @@ RSpec.describe ContainerExpirationPolicy, type: :model do
it { is_expected.to validate_presence_of(:project) }
describe '#enabled' do
- it { is_expected.to allow_value(true).for(:enabled) }
- it { is_expected.to allow_value(false).for(:enabled) }
+ it { is_expected.to allow_value(true, false).for(:enabled) }
it { is_expected.not_to allow_value(nil).for(:enabled) }
end
diff --git a/spec/models/container_repository_spec.rb b/spec/models/container_repository_spec.rb
index d8019e74c71..93fe070e5c4 100644
--- a/spec/models/container_repository_spec.rb
+++ b/spec/models/container_repository_spec.rb
@@ -810,7 +810,7 @@ RSpec.describe ContainerRepository, :aggregate_failures, feature_category: :cont
subject { repository.size }
before do
- allow(::Gitlab).to receive(:com?).and_return(on_com)
+ allow(::Gitlab).to receive(:com_except_jh?).and_return(on_com)
allow(repository).to receive(:created_at).and_return(created_at)
end
@@ -1568,7 +1568,7 @@ RSpec.describe ContainerRepository, :aggregate_failures, feature_category: :cont
context 'on gitlab.com' do
before do
- allow(::Gitlab).to receive(:com?).and_return(true)
+ allow(::Gitlab).to receive(:com_except_jh?).and_return(true)
end
it { is_expected.to eq(true) }
@@ -1576,7 +1576,7 @@ RSpec.describe ContainerRepository, :aggregate_failures, feature_category: :cont
context 'not on gitlab.com' do
before do
- allow(::Gitlab).to receive(:com?).and_return(false)
+ allow(::Gitlab).to receive(:com_except_jh?).and_return(false)
end
it { is_expected.to eq(false) }
diff --git a/spec/models/customer_relations/contact_spec.rb b/spec/models/customer_relations/contact_spec.rb
index 6beb5323f60..3d78a9089ca 100644
--- a/spec/models/customer_relations/contact_spec.rb
+++ b/spec/models/customer_relations/contact_spec.rb
@@ -127,7 +127,7 @@ RSpec.describe CustomerRelations::Contact, type: :model do
before do
old_root_group.update!(parent: new_root_group)
- CustomerRelations::Contact.move_to_root_group(old_root_group)
+ described_class.move_to_root_group(old_root_group)
end
it 'moves contacts with unique emails and deletes the rest' do
diff --git a/spec/models/customer_relations/organization_spec.rb b/spec/models/customer_relations/organization_spec.rb
index 350a4e613c6..8151bf18bed 100644
--- a/spec/models/customer_relations/organization_spec.rb
+++ b/spec/models/customer_relations/organization_spec.rb
@@ -65,7 +65,7 @@ RSpec.describe CustomerRelations::Organization, type: :model do
before do
old_root_group.update!(parent: new_root_group)
- CustomerRelations::Organization.move_to_root_group(old_root_group)
+ described_class.move_to_root_group(old_root_group)
end
it 'moves organizations with unique names and deletes the rest' do
diff --git a/spec/models/dependency_proxy/image_ttl_group_policy_spec.rb b/spec/models/dependency_proxy/image_ttl_group_policy_spec.rb
index 9f6358e1286..a58e8df45e4 100644
--- a/spec/models/dependency_proxy/image_ttl_group_policy_spec.rb
+++ b/spec/models/dependency_proxy/image_ttl_group_policy_spec.rb
@@ -11,8 +11,7 @@ RSpec.describe DependencyProxy::ImageTtlGroupPolicy, type: :model do
it { is_expected.to validate_presence_of(:group) }
describe '#enabled' do
- it { is_expected.to allow_value(true).for(:enabled) }
- it { is_expected.to allow_value(false).for(:enabled) }
+ it { is_expected.to allow_value(true, false).for(:enabled) }
it { is_expected.not_to allow_value(nil).for(:enabled) }
end
diff --git a/spec/models/dependency_proxy/manifest_spec.rb b/spec/models/dependency_proxy/manifest_spec.rb
index d43079f607a..174fa400d72 100644
--- a/spec/models/dependency_proxy/manifest_spec.rb
+++ b/spec/models/dependency_proxy/manifest_spec.rb
@@ -51,7 +51,7 @@ RSpec.describe DependencyProxy::Manifest, type: :model do
let_it_be(:file_name) { 'foo' }
let_it_be(:digest) { 'bar' }
- subject { DependencyProxy::Manifest.find_by_file_name_or_digest(file_name: file_name, digest: digest) }
+ subject { described_class.find_by_file_name_or_digest(file_name: file_name, digest: digest) }
context 'no manifest exists' do
it { is_expected.to be_nil }
diff --git a/spec/models/deployment_spec.rb b/spec/models/deployment_spec.rb
index ede96d79656..227ac69133b 100644
--- a/spec/models/deployment_spec.rb
+++ b/spec/models/deployment_spec.rb
@@ -650,7 +650,7 @@ RSpec.describe Deployment, feature_category: :continuous_delivery do
context 'when there are no deployments and builds' do
it do
- expect(subject_method(environment)).to eq(Deployment.none)
+ expect(subject_method(environment)).to eq(described_class.none)
end
end
@@ -663,7 +663,7 @@ RSpec.describe Deployment, feature_category: :continuous_delivery do
end
it do
- expect(subject_method(environment)).to eq(Deployment.none)
+ expect(subject_method(environment)).to eq(described_class.none)
end
end
@@ -1285,7 +1285,7 @@ RSpec.describe Deployment, feature_category: :continuous_delivery do
let(:build_status) { :created }
it_behaves_like 'gracefully handling error' do
- let(:error_message) { %Q{Status cannot transition via \"create\"} }
+ let(:error_message) { %{Status cannot transition via \"create\"} }
end
end
@@ -1315,7 +1315,7 @@ RSpec.describe Deployment, feature_category: :continuous_delivery do
let(:build_status) { :created }
it_behaves_like 'gracefully handling error' do
- let(:error_message) { %Q{Status cannot transition via \"create\"} }
+ let(:error_message) { %{Status cannot transition via \"create\"} }
end
end
@@ -1323,7 +1323,7 @@ RSpec.describe Deployment, feature_category: :continuous_delivery do
let(:build_status) { :running }
it_behaves_like 'gracefully handling error' do
- let(:error_message) { %Q{Status cannot transition via \"run\"} }
+ let(:error_message) { %{Status cannot transition via \"run\"} }
end
end
diff --git a/spec/models/environment_spec.rb b/spec/models/environment_spec.rb
index 7b7b92a0b8d..066763645ab 100644
--- a/spec/models/environment_spec.rb
+++ b/spec/models/environment_spec.rb
@@ -15,6 +15,7 @@ RSpec.describe Environment, :use_clean_rails_memory_store_caching, feature_categ
it { is_expected.to be_kind_of(ReactiveCaching) }
it { is_expected.to nullify_if_blank(:external_url) }
+ it { is_expected.to nullify_if_blank(:kubernetes_namespace) }
it { is_expected.to belong_to(:project).required }
it { is_expected.to belong_to(:merge_request).optional }
@@ -36,6 +37,7 @@ RSpec.describe Environment, :use_clean_rails_memory_store_caching, feature_categ
it { is_expected.to validate_length_of(:slug).is_at_most(24) }
it { is_expected.to validate_length_of(:external_url).is_at_most(255) }
+ it { is_expected.to validate_length_of(:kubernetes_namespace).is_at_most(63) }
describe 'validation' do
it 'does not become invalid record when external_url is empty' do
@@ -80,15 +82,6 @@ RSpec.describe Environment, :use_clean_rails_memory_store_caching, feature_categ
expect(env).to validate_presence_of(:tier).on(:update)
end
end
-
- context 'when FF is disabled' do
- before do
- stub_feature_flags(validate_environment_tier_presence: false)
- end
-
- it { expect(env).to validate_presence_of(:tier).on(:create) }
- it { expect(env).not_to validate_presence_of(:tier).on(:update) }
- end
end
end
diff --git a/spec/models/external_pull_request_spec.rb b/spec/models/external_pull_request_spec.rb
deleted file mode 100644
index 10136dd0bdb..00000000000
--- a/spec/models/external_pull_request_spec.rb
+++ /dev/null
@@ -1,242 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe ExternalPullRequest do
- let_it_be(:project) { create(:project, :repository) }
-
- let(:source_branch) { 'the-branch' }
- let(:status) { :open }
-
- it { is_expected.to belong_to(:project) }
-
- shared_examples 'has errors on' do |attribute|
- it "has errors for #{attribute}" do
- expect(subject).not_to be_valid
- expect(subject.errors[attribute]).not_to be_empty
- end
- end
-
- describe 'validations' do
- context 'when source branch not present' do
- subject { build(:external_pull_request, source_branch: nil) }
-
- it_behaves_like 'has errors on', :source_branch
- end
-
- context 'when status not present' do
- subject { build(:external_pull_request, status: nil) }
-
- it_behaves_like 'has errors on', :status
- end
-
- context 'when pull request is from a fork' do
- subject { build(:external_pull_request, source_repository: 'the-fork', target_repository: 'the-target') }
-
- it_behaves_like 'has errors on', :base
- end
- end
-
- describe 'create_or_update_from_params' do
- subject { described_class.create_or_update_from_params(params) }
-
- context 'when pull request does not exist' do
- context 'when params are correct' do
- let(:params) do
- {
- project_id: project.id,
- pull_request_iid: 123,
- source_branch: 'feature',
- target_branch: 'master',
- source_repository: 'the-repository',
- target_repository: 'the-repository',
- source_sha: '97de212e80737a608d939f648d959671fb0a0142',
- target_sha: 'a09386439ca39abe575675ffd4b89ae824fec22f',
- status: :open
- }
- end
-
- it 'saves the model successfully and returns it' do
- expect(subject).to be_persisted
- expect(subject).to be_valid
- end
-
- it 'yields the model' do
- yielded_value = nil
-
- result = described_class.create_or_update_from_params(params) do |pull_request|
- yielded_value = pull_request
- end
-
- expect(result).to eq(yielded_value)
- end
- end
-
- context 'when params are not correct' do
- let(:params) do
- {
- pull_request_iid: 123,
- source_branch: 'feature',
- target_branch: 'master',
- source_repository: 'the-repository',
- target_repository: 'the-repository',
- source_sha: nil,
- target_sha: nil,
- status: :open
- }
- end
-
- it 'returns an invalid model' do
- expect(subject).not_to be_persisted
- expect(subject).not_to be_valid
- end
- end
- end
-
- context 'when pull request exists' do
- let!(:pull_request) do
- create(:external_pull_request,
- project: project,
- source_sha: '97de212e80737a608d939f648d959671fb0a0142')
- end
-
- context 'when params are correct' do
- let(:params) do
- {
- pull_request_iid: pull_request.pull_request_iid,
- source_branch: pull_request.source_branch,
- target_branch: pull_request.target_branch,
- source_repository: 'the-repository',
- target_repository: 'the-repository',
- source_sha: 'ce84140e8b878ce6e7c4d298c7202ff38170e3ac',
- target_sha: pull_request.target_sha,
- status: :open
- }
- end
-
- it 'updates the model successfully and returns it' do
- expect(subject).to be_valid
- expect(subject.source_sha).to eq(params[:source_sha])
- expect(pull_request.reload.source_sha).to eq(params[:source_sha])
- end
- end
-
- context 'when params are not correct' do
- let(:params) do
- {
- pull_request_iid: pull_request.pull_request_iid,
- source_branch: pull_request.source_branch,
- target_branch: pull_request.target_branch,
- source_repository: 'the-repository',
- target_repository: 'the-repository',
- source_sha: nil,
- target_sha: nil,
- status: :open
- }
- end
-
- it 'returns an invalid model' do
- expect(subject).not_to be_valid
- expect(pull_request.reload.source_sha).not_to be_nil
- expect(pull_request.target_sha).not_to be_nil
- end
- end
- end
- end
-
- describe '#open?' do
- it 'returns true if status is open' do
- pull_request = create(:external_pull_request, status: :open)
-
- expect(pull_request).to be_open
- end
-
- it 'returns false if status is not open' do
- pull_request = create(:external_pull_request, status: :closed)
-
- expect(pull_request).not_to be_open
- end
- end
-
- describe '#closed?' do
- it 'returns true if status is closed' do
- pull_request = build(:external_pull_request, status: :closed)
-
- expect(pull_request).to be_closed
- end
-
- it 'returns false if status is not closed' do
- pull_request = build(:external_pull_request, status: :open)
-
- expect(pull_request).not_to be_closed
- end
- end
-
- describe '#actual_branch_head?' do
- let(:project) { create(:project, :repository) }
- let(:branch) { project.repository.branches.first }
- let(:source_branch) { branch.name }
-
- let(:pull_request) do
- create(:external_pull_request,
- project: project,
- source_branch: source_branch,
- source_sha: source_sha)
- end
-
- context 'when source sha matches the head of the branch' do
- let(:source_sha) { branch.target }
-
- it 'returns true' do
- expect(pull_request).to be_actual_branch_head
- end
- end
-
- context 'when source sha does not match the head of the branch' do
- let(:source_sha) { project.repository.commit('HEAD').sha }
-
- it 'returns true' do
- expect(pull_request).not_to be_actual_branch_head
- end
- end
- end
-
- describe '#from_fork?' do
- it 'returns true if source_repository differs from target_repository' do
- pull_request = build(:external_pull_request,
- source_repository: 'repository-1',
- target_repository: 'repository-2')
-
- expect(pull_request).to be_from_fork
- end
-
- it 'returns false if source_repository is the same as target_repository' do
- pull_request = build(:external_pull_request,
- source_repository: 'repository-1',
- target_repository: 'repository-1')
-
- expect(pull_request).not_to be_from_fork
- end
- end
-
- describe '#modified_paths' do
- let(:pull_request) do
- build(:external_pull_request, project: project, target_sha: '281d3a7', source_sha: '498214d')
- end
-
- subject(:modified_paths) { pull_request.modified_paths }
-
- it 'returns modified paths' do
- expect(modified_paths).to eq ['bar/branch-test.txt',
- 'files/js/commit.coffee',
- 'with space/README.md']
- end
- end
-
- context 'loose foreign key on external_pull_requests.project_id' do
- it_behaves_like 'cleanup by a loose foreign key' do
- let!(:parent) { create(:project) }
- let!(:model) { create(:external_pull_request, project: parent) }
- end
- end
-end
diff --git a/spec/models/group_spec.rb b/spec/models/group_spec.rb
index 527ee96ca86..01fd17bfe10 100644
--- a/spec/models/group_spec.rb
+++ b/spec/models/group_spec.rb
@@ -703,10 +703,6 @@ RSpec.describe Group, feature_category: :groups_and_projects do
it { expect(group.ancestors.to_sql).not_to include 'traversal_ids <@' }
end
- describe '#ancestors_upto' do
- it { expect(group.ancestors_upto.to_sql).not_to include "WITH ORDINALITY" }
- end
-
describe '.shortest_traversal_ids_prefixes' do
it { expect { described_class.shortest_traversal_ids_prefixes }.to raise_error /Feature not supported since the `:use_traversal_ids` is disabled/ }
end
@@ -737,14 +733,6 @@ RSpec.describe Group, feature_category: :groups_and_projects do
it 'hierarchy order' do
expect(group.ancestors(hierarchy_order: :asc).to_sql).to include 'ORDER BY "depth" ASC'
end
-
- context 'ancestor linear queries feature flag disabled' do
- before do
- stub_feature_flags(use_traversal_ids_for_ancestors: false)
- end
-
- it { expect(group.ancestors.to_sql).not_to include 'traversal_ids <@' }
- end
end
describe '#ancestors_upto' do
@@ -856,7 +844,29 @@ RSpec.describe Group, feature_category: :groups_and_projects do
end
it 'returns groups without integration' do
- expect(Group.without_integration(instance_integration)).to contain_exactly(another_group)
+ expect(described_class.without_integration(instance_integration)).to contain_exactly(another_group)
+ end
+ end
+
+ describe '.execute_integrations' do
+ let(:integration) { create(:integrations_slack, :group, group: group) }
+ let(:test_data) { { 'foo' => 'bar' } }
+
+ before do
+ allow(group.integrations).to receive(:public_send).and_return([])
+ allow(group.integrations).to receive(:public_send).with(:push_hooks).and_return([integration])
+ end
+
+ it 'executes integrations with a matching scope' do
+ expect(integration).to receive(:async_execute).with(test_data)
+
+ group.execute_integrations(test_data, :push_hooks)
+ end
+
+ it 'ignores integrations without a matching scope' do
+ expect(integration).not_to receive(:async_execute).with(test_data)
+
+ group.execute_integrations(test_data, :note_hooks)
end
end
@@ -1848,22 +1858,29 @@ RSpec.describe Group, feature_category: :groups_and_projects do
end
context 'user-related methods' do
- let(:user_a) { create(:user) }
- let(:user_b) { create(:user) }
- let(:user_c) { create(:user) }
- let(:user_d) { create(:user) }
+ let_it_be(:user_a) { create(:user) }
+ let_it_be(:user_b) { create(:user) }
+ let_it_be(:user_c) { create(:user) }
+ let_it_be(:user_d) { create(:user) }
- let(:group) { create(:group) }
- let(:nested_group) { create(:group, parent: group) }
- let(:deep_nested_group) { create(:group, parent: nested_group) }
- let(:project) { create(:project, namespace: group) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:nested_group) { create(:group, parent: group) }
+ let_it_be(:deep_nested_group) { create(:group, parent: nested_group) }
+ let_it_be(:project) { create(:project, namespace: group) }
- before do
+ let_it_be(:another_group) { create(:group) }
+ let_it_be(:another_user) { create(:user) }
+
+ before_all do
group.add_developer(user_a)
group.add_developer(user_c)
nested_group.add_developer(user_b)
deep_nested_group.add_developer(user_a)
project.add_developer(user_d)
+
+ another_group.add_developer(another_user)
+
+ create(:group_group_link, shared_group: group, shared_with_group: another_group)
end
describe '#direct_and_indirect_users' do
@@ -1876,6 +1893,13 @@ RSpec.describe Group, feature_category: :groups_and_projects do
it 'does not return members of projects belonging to ancestor groups' do
expect(nested_group.direct_and_indirect_users).not_to include(user_d)
end
+
+ context 'when share_with_groups is true' do
+ it 'also returns members of groups invited to this group' do
+ expect(group.direct_and_indirect_users(share_with_groups: true))
+ .to contain_exactly(user_a, user_b, user_c, user_d, another_user)
+ end
+ end
end
describe '#direct_and_indirect_users_with_inactive' do
@@ -2643,232 +2667,6 @@ RSpec.describe Group, feature_category: :groups_and_projects do
end
end
- describe '#update_shared_runners_setting!' do
- context 'enabled' do
- subject { group.update_shared_runners_setting!('enabled') }
-
- context 'group that its ancestors have shared runners disabled' do
- let_it_be(:parent, reload: true) { create(:group, :shared_runners_disabled) }
- let_it_be(:group, reload: true) { create(:group, :shared_runners_disabled, parent: parent) }
- let_it_be(:project, reload: true) { create(:project, shared_runners_enabled: false, group: group) }
-
- it 'raises exception' do
- expect { subject }
- .to raise_error(ActiveRecord::RecordInvalid, 'Validation failed: Shared runners enabled cannot be enabled because parent group has shared Runners disabled')
- end
-
- it 'does not enable shared runners' do
- expect do
- begin
- subject
- rescue StandardError
- nil
- end
-
- parent.reload
- group.reload
- project.reload
- end.to not_change { parent.shared_runners_enabled }
- .and not_change { group.shared_runners_enabled }
- .and not_change { project.shared_runners_enabled }
- end
- end
-
- context 'root group with shared runners disabled' do
- let_it_be(:group) { create(:group, :shared_runners_disabled) }
- let_it_be(:sub_group) { create(:group, :shared_runners_disabled, parent: group) }
- let_it_be(:project) { create(:project, shared_runners_enabled: false, group: sub_group) }
-
- it 'enables shared Runners only for itself' do
- expect { subject_and_reload(group, sub_group, project) }
- .to change { group.shared_runners_enabled }.from(false).to(true)
- .and not_change { sub_group.shared_runners_enabled }
- .and not_change { project.shared_runners_enabled }
- end
- end
- end
-
- context 'disabled_and_unoverridable' do
- let_it_be(:group) { create(:group) }
- let_it_be(:sub_group) { create(:group, :shared_runners_disabled, :allow_descendants_override_disabled_shared_runners, parent: group) }
- let_it_be(:sub_group_2) { create(:group, parent: group) }
- let_it_be(:project) { create(:project, group: group, shared_runners_enabled: true) }
- let_it_be(:project_2) { create(:project, group: sub_group_2, shared_runners_enabled: true) }
-
- subject { group.update_shared_runners_setting!(Namespace::SR_DISABLED_AND_UNOVERRIDABLE) }
-
- it 'disables shared Runners for all descendant groups and projects' do
- expect { subject_and_reload(group, sub_group, sub_group_2, project, project_2) }
- .to change { group.shared_runners_enabled }.from(true).to(false)
- .and not_change { group.allow_descendants_override_disabled_shared_runners }
- .and not_change { sub_group.shared_runners_enabled }
- .and change { sub_group.allow_descendants_override_disabled_shared_runners }.from(true).to(false)
- .and change { sub_group_2.shared_runners_enabled }.from(true).to(false)
- .and not_change { sub_group_2.allow_descendants_override_disabled_shared_runners }
- .and change { project.shared_runners_enabled }.from(true).to(false)
- .and change { project_2.shared_runners_enabled }.from(true).to(false)
- end
-
- context 'with override on self' do
- let_it_be(:group) { create(:group, :shared_runners_disabled, :allow_descendants_override_disabled_shared_runners) }
-
- it 'disables it' do
- expect { subject_and_reload(group) }
- .to not_change { group.shared_runners_enabled }
- .and change { group.allow_descendants_override_disabled_shared_runners }.from(true).to(false)
- end
- end
- end
-
- context 'disabled_and_overridable' do
- subject { group.update_shared_runners_setting!(Namespace::SR_DISABLED_AND_OVERRIDABLE) }
-
- context 'top level group' do
- let_it_be(:group) { create(:group, :shared_runners_disabled) }
- let_it_be(:sub_group) { create(:group, :shared_runners_disabled, parent: group) }
- let_it_be(:project) { create(:project, shared_runners_enabled: false, group: sub_group) }
-
- it 'enables allow descendants to override only for itself' do
- expect { subject_and_reload(group, sub_group, project) }
- .to change { group.allow_descendants_override_disabled_shared_runners }.from(false).to(true)
- .and not_change { group.shared_runners_enabled }
- .and not_change { sub_group.allow_descendants_override_disabled_shared_runners }
- .and not_change { sub_group.shared_runners_enabled }
- .and not_change { project.shared_runners_enabled }
- end
- end
-
- context 'group that its ancestors have shared Runners disabled but allows to override' do
- let_it_be(:parent) { create(:group, :shared_runners_disabled, :allow_descendants_override_disabled_shared_runners) }
- let_it_be(:group) { create(:group, :shared_runners_disabled, parent: parent) }
- let_it_be(:project) { create(:project, shared_runners_enabled: false, group: group) }
-
- it 'enables allow descendants to override' do
- expect { subject_and_reload(parent, group, project) }
- .to not_change { parent.allow_descendants_override_disabled_shared_runners }
- .and not_change { parent.shared_runners_enabled }
- .and change { group.allow_descendants_override_disabled_shared_runners }.from(false).to(true)
- .and not_change { group.shared_runners_enabled }
- .and not_change { project.shared_runners_enabled }
- end
- end
-
- context 'when parent does not allow' do
- let_it_be(:parent, reload: true) { create(:group, :shared_runners_disabled, allow_descendants_override_disabled_shared_runners: false) }
- let_it_be(:group, reload: true) { create(:group, :shared_runners_disabled, allow_descendants_override_disabled_shared_runners: false, parent: parent) }
-
- it 'raises exception' do
- expect { subject }
- .to raise_error(ActiveRecord::RecordInvalid, 'Validation failed: Allow descendants override disabled shared runners cannot be enabled because parent group does not allow it')
- end
-
- it 'does not allow descendants to override' do
- expect do
- begin
- subject
- rescue StandardError
- nil
- end
-
- parent.reload
- group.reload
- end.to not_change { parent.allow_descendants_override_disabled_shared_runners }
- .and not_change { parent.shared_runners_enabled }
- .and not_change { group.allow_descendants_override_disabled_shared_runners }
- .and not_change { group.shared_runners_enabled }
- end
- end
-
- context 'top level group that has shared Runners enabled' do
- let_it_be(:group) { create(:group, shared_runners_enabled: true) }
- let_it_be(:sub_group) { create(:group, shared_runners_enabled: true, parent: group) }
- let_it_be(:project) { create(:project, shared_runners_enabled: true, group: sub_group) }
-
- it 'enables allow descendants to override & disables shared runners everywhere' do
- expect { subject_and_reload(group, sub_group, project) }
- .to change { group.shared_runners_enabled }.from(true).to(false)
- .and change { group.allow_descendants_override_disabled_shared_runners }.from(false).to(true)
- .and change { sub_group.shared_runners_enabled }.from(true).to(false)
- .and change { project.shared_runners_enabled }.from(true).to(false)
- end
- end
- end
-
- context 'disabled_with_override (deprecated)' do
- subject { group.update_shared_runners_setting!(Namespace::SR_DISABLED_WITH_OVERRIDE) }
-
- context 'top level group' do
- let_it_be(:group) { create(:group, :shared_runners_disabled) }
- let_it_be(:sub_group) { create(:group, :shared_runners_disabled, parent: group) }
- let_it_be(:project) { create(:project, shared_runners_enabled: false, group: sub_group) }
-
- it 'enables allow descendants to override only for itself' do
- expect { subject_and_reload(group, sub_group, project) }
- .to change { group.allow_descendants_override_disabled_shared_runners }.from(false).to(true)
- .and not_change { group.shared_runners_enabled }
- .and not_change { sub_group.allow_descendants_override_disabled_shared_runners }
- .and not_change { sub_group.shared_runners_enabled }
- .and not_change { project.shared_runners_enabled }
- end
- end
-
- context 'group that its ancestors have shared Runners disabled but allows to override' do
- let_it_be(:parent) { create(:group, :shared_runners_disabled, :allow_descendants_override_disabled_shared_runners) }
- let_it_be(:group) { create(:group, :shared_runners_disabled, parent: parent) }
- let_it_be(:project) { create(:project, shared_runners_enabled: false, group: group) }
-
- it 'enables allow descendants to override' do
- expect { subject_and_reload(parent, group, project) }
- .to not_change { parent.allow_descendants_override_disabled_shared_runners }
- .and not_change { parent.shared_runners_enabled }
- .and change { group.allow_descendants_override_disabled_shared_runners }.from(false).to(true)
- .and not_change { group.shared_runners_enabled }
- .and not_change { project.shared_runners_enabled }
- end
- end
-
- context 'when parent does not allow' do
- let_it_be(:parent, reload: true) { create(:group, :shared_runners_disabled, allow_descendants_override_disabled_shared_runners: false) }
- let_it_be(:group, reload: true) { create(:group, :shared_runners_disabled, allow_descendants_override_disabled_shared_runners: false, parent: parent) }
-
- it 'raises exception' do
- expect { subject }
- .to raise_error(ActiveRecord::RecordInvalid, 'Validation failed: Allow descendants override disabled shared runners cannot be enabled because parent group does not allow it')
- end
-
- it 'does not allow descendants to override' do
- expect do
- begin
- subject
- rescue StandardError
- nil
- end
-
- parent.reload
- group.reload
- end.to not_change { parent.allow_descendants_override_disabled_shared_runners }
- .and not_change { parent.shared_runners_enabled }
- .and not_change { group.allow_descendants_override_disabled_shared_runners }
- .and not_change { group.shared_runners_enabled }
- end
- end
-
- context 'top level group that has shared Runners enabled' do
- let_it_be(:group) { create(:group, shared_runners_enabled: true) }
- let_it_be(:sub_group) { create(:group, shared_runners_enabled: true, parent: group) }
- let_it_be(:project) { create(:project, shared_runners_enabled: true, group: sub_group) }
-
- it 'enables allow descendants to override & disables shared runners everywhere' do
- expect { subject_and_reload(group, sub_group, project) }
- .to change { group.shared_runners_enabled }.from(true).to(false)
- .and change { group.allow_descendants_override_disabled_shared_runners }.from(false).to(true)
- .and change { sub_group.shared_runners_enabled }.from(true).to(false)
- .and change { project.shared_runners_enabled }.from(true).to(false)
- end
- end
- end
- end
-
describe "#default_branch_name" do
context "when group.namespace_settings does not have a default branch name" do
it "returns nil" do
diff --git a/spec/models/import_failure_spec.rb b/spec/models/import_failure_spec.rb
index a8ada156dd7..6da4045bc00 100644
--- a/spec/models/import_failure_spec.rb
+++ b/spec/models/import_failure_spec.rb
@@ -12,15 +12,15 @@ RSpec.describe ImportFailure do
let_it_be(:unrelated_failure) { create(:import_failure, project: project) }
it 'returns failures with external_identifiers' do
- expect(ImportFailure.with_external_identifiers).to match_array([github_import_failure])
+ expect(described_class.with_external_identifiers).to match_array([github_import_failure])
end
it 'returns failures for the given correlation ID' do
- expect(ImportFailure.failures_by_correlation_id(correlation_id)).to match_array([hard_failure, soft_failure])
+ expect(described_class.failures_by_correlation_id(correlation_id)).to match_array([hard_failure, soft_failure])
end
it 'returns hard failures for the given correlation ID' do
- expect(ImportFailure.hard_failures_by_correlation_id(correlation_id)).to eq([hard_failure])
+ expect(described_class.hard_failures_by_correlation_id(correlation_id)).to eq([hard_failure])
end
it 'orders hard failures by newest first' do
diff --git a/spec/models/incident_management/timeline_event_spec.rb b/spec/models/incident_management/timeline_event_spec.rb
index 036f5affb87..40adf46e7d5 100644
--- a/spec/models/incident_management/timeline_event_spec.rb
+++ b/spec/models/incident_management/timeline_event_spec.rb
@@ -76,7 +76,7 @@ RSpec.describe IncidentManagement::TimelineEvent do
end
let(:expected_note_html) do
- %Q(<p>note <strong>bold</strong> <em>italic</em> <code>code</code> #{expected_image_html} #{expected_emoji_html}</p>)
+ %(<p>note <strong>bold</strong> <em>italic</em> <code>code</code> #{expected_image_html} #{expected_emoji_html}</p>)
end
# rubocop:enable Layout/LineLength
diff --git a/spec/models/integration_spec.rb b/spec/models/integration_spec.rb
index ed49009d6d9..7fcd74cd37f 100644
--- a/spec/models/integration_spec.rb
+++ b/spec/models/integration_spec.rb
@@ -246,31 +246,41 @@ RSpec.describe Integration, feature_category: :integrations do
end
end
+ describe '#ci?' do
+ it 'is true when integration is a CI integration' do
+ expect(build(:jenkins_integration).ci?).to eq(true)
+ end
+
+ it 'is false when integration is not a ci integration' do
+ expect(build(:integration).ci?).to eq(false)
+ end
+ end
+
describe '.find_or_initialize_non_project_specific_integration' do
let!(:integration_1) { create(:jira_integration, project_id: nil, group_id: group.id) }
let!(:integration_2) { create(:jira_integration, project: project) }
it 'returns the right integration' do
- expect(Integration.find_or_initialize_non_project_specific_integration('jira', group_id: group))
+ expect(described_class.find_or_initialize_non_project_specific_integration('jira', group_id: group))
.to eq(integration_1)
end
it 'does not create a new integration' do
- expect { Integration.find_or_initialize_non_project_specific_integration('redmine', group_id: group) }
- .not_to change(Integration, :count)
+ expect { described_class.find_or_initialize_non_project_specific_integration('redmine', group_id: group) }
+ .not_to change(described_class, :count)
end
end
describe '.find_or_initialize_all_non_project_specific' do
shared_examples 'integration instances' do
it 'returns the available integration instances' do
- expect(Integration.find_or_initialize_all_non_project_specific(Integration.for_instance).map(&:to_param))
- .to match_array(Integration.available_integration_names(include_project_specific: false))
+ expect(described_class.find_or_initialize_all_non_project_specific(described_class.for_instance).map(&:to_param))
+ .to match_array(described_class.available_integration_names(include_project_specific: false))
end
it 'does not create integration instances' do
- expect { Integration.find_or_initialize_all_non_project_specific(Integration.for_instance) }
- .not_to change(Integration, :count)
+ expect { described_class.find_or_initialize_all_non_project_specific(described_class.for_instance) }
+ .not_to change(described_class, :count)
end
end
@@ -282,19 +292,19 @@ RSpec.describe Integration, feature_category: :integrations do
end
before do
- attrs = Integration.available_integration_types(include_project_specific: false).map do
+ attrs = described_class.available_integration_types(include_project_specific: false).map do
integration_hash(_1)
end
- Integration.insert_all(attrs)
+ described_class.insert_all(attrs)
end
it_behaves_like 'integration instances'
context 'with a previous existing integration (:mock_ci) and a new integration (:asana)' do
before do
- Integration.insert(integration_hash(:mock_ci))
- Integration.delete_by(**integration_hash(:asana))
+ described_class.insert(integration_hash(:mock_ci))
+ described_class.delete_by(**integration_hash(:asana))
end
it_behaves_like 'integration instances'
@@ -1352,5 +1362,17 @@ RSpec.describe Integration, feature_category: :integrations do
async_execute
end
end
+
+ context 'when the Gitlab::SilentMode is enabled' do
+ before do
+ allow(Gitlab::SilentMode).to receive(:enabled?).and_return(true)
+ end
+
+ it 'does not queue a worker' do
+ expect(Integrations::ExecuteWorker).not_to receive(:perform_async)
+
+ async_execute
+ end
+ end
end
end
diff --git a/spec/models/integrations/apple_app_store_spec.rb b/spec/models/integrations/apple_app_store_spec.rb
index f3346acae0a..9864fe38d3f 100644
--- a/spec/models/integrations/apple_app_store_spec.rb
+++ b/spec/models/integrations/apple_app_store_spec.rb
@@ -13,8 +13,7 @@ RSpec.describe Integrations::AppleAppStore, feature_category: :mobile_devops do
it { is_expected.to validate_presence_of :app_store_key_id }
it { is_expected.to validate_presence_of :app_store_private_key }
it { is_expected.to validate_presence_of :app_store_private_key_file_name }
- it { is_expected.to allow_value(true).for(:app_store_protected_refs) }
- it { is_expected.to allow_value(false).for(:app_store_protected_refs) }
+ it { is_expected.to allow_value(true, false).for(:app_store_protected_refs) }
it { is_expected.not_to allow_value(nil).for(:app_store_protected_refs) }
it { is_expected.to allow_value('aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee').for(:app_store_issuer_id) }
it { is_expected.not_to allow_value('abcde').for(:app_store_issuer_id) }
diff --git a/spec/models/integrations/asana_spec.rb b/spec/models/integrations/asana_spec.rb
index 43e876a4f47..376aec1088e 100644
--- a/spec/models/integrations/asana_spec.rb
+++ b/spec/models/integrations/asana_spec.rb
@@ -2,20 +2,24 @@
require 'spec_helper'
-RSpec.describe Integrations::Asana do
+RSpec.describe Integrations::Asana, feature_category: :integrations do
describe 'Validations' do
- context 'active' do
+ context 'when active' do
before do
subject.active = true
end
it { is_expected.to validate_presence_of :api_key }
end
+
+ context 'when inactive' do
+ it { is_expected.not_to validate_presence_of :api_key }
+ end
end
- describe 'Execute' do
- let_it_be(:user) { create(:user) }
- let_it_be(:project) { create(:project) }
+ describe '#execute' do
+ let_it_be(:user) { build(:user) }
+ let_it_be(:project) { build(:project) }
let(:gid) { "123456789ABCD" }
let(:asana_task) { double(::Asana::Resources::Task) }
diff --git a/spec/models/integrations/assembla_spec.rb b/spec/models/integrations/assembla_spec.rb
index e9f4274952d..28cda0a1e75 100644
--- a/spec/models/integrations/assembla_spec.rb
+++ b/spec/models/integrations/assembla_spec.rb
@@ -2,34 +2,49 @@
require 'spec_helper'
-RSpec.describe Integrations::Assembla do
+RSpec.describe Integrations::Assembla, feature_category: :integrations do
include StubRequests
it_behaves_like Integrations::ResetSecretFields do
let(:integration) { described_class.new }
end
- describe "Execute" do
- let(:user) { create(:user) }
- let(:project) { create(:project, :repository) }
+ describe 'Validations' do
+ context 'when active' do
+ before do
+ subject.active = true
+ end
+
+ it { is_expected.to validate_presence_of :token }
+ end
+
+ context 'when inactive' do
+ it { is_expected.not_to validate_presence_of :token }
+ end
+ end
+
+ describe "#execute" do
+ let_it_be(:user) { build(:user) }
+ let_it_be(:project) { create(:project, :repository) }
+
+ let(:assembla_integration) { described_class.new }
+ let(:sample_data) { Gitlab::DataBuilder::Push.build_sample(project, user) }
+ let(:api_url) { 'https://atlas.assembla.com/spaces/project_name/github_tool?secret_key=verySecret' }
before do
- @assembla_integration = described_class.new
- allow(@assembla_integration).to receive_messages(
+ allow(assembla_integration).to receive_messages(
project_id: project.id,
project: project,
token: 'verySecret',
subdomain: 'project_name'
)
- @sample_data = Gitlab::DataBuilder::Push.build_sample(project, user)
- @api_url = 'https://atlas.assembla.com/spaces/project_name/github_tool?secret_key=verySecret'
- stub_full_request(@api_url, method: :post)
+ stub_full_request(api_url, method: :post)
end
it "calls Assembla API" do
- @assembla_integration.execute(@sample_data)
- expect(WebMock).to have_requested(:post, stubbed_hostname(@api_url)).with(
- body: /#{@sample_data[:before]}.*#{@sample_data[:after]}.*#{project.path}/
+ assembla_integration.execute(sample_data)
+ expect(WebMock).to have_requested(:post, stubbed_hostname(api_url)).with(
+ body: /#{sample_data[:before]}.*#{sample_data[:after]}.*#{project.path}/
).once
end
end
diff --git a/spec/models/integrations/bamboo_spec.rb b/spec/models/integrations/bamboo_spec.rb
index 1d2c90dad51..3b459ab9d5b 100644
--- a/spec/models/integrations/bamboo_spec.rb
+++ b/spec/models/integrations/bamboo_spec.rb
@@ -2,26 +2,15 @@
require 'spec_helper'
-RSpec.describe Integrations::Bamboo, :use_clean_rails_memory_store_caching do
+RSpec.describe Integrations::Bamboo, :use_clean_rails_memory_store_caching, feature_category: :integrations do
include ReactiveCachingHelpers
include StubRequests
let(:bamboo_url) { 'http://gitlab.com/bamboo' }
- let_it_be(:project) { create(:project) }
-
- subject(:integration) do
- described_class.create!(
- active: true,
- project: project,
- properties: {
- bamboo_url: bamboo_url,
- username: 'mic',
- password: 'password',
- build_key: 'foo'
- }
- )
- end
+ let_it_be(:project) { build(:project) }
+
+ subject(:integration) { build(:bamboo_integration, project: project, bamboo_url: bamboo_url) }
it_behaves_like Integrations::BaseCi
diff --git a/spec/models/integrations/base_chat_notification_spec.rb b/spec/models/integrations/base_chat_notification_spec.rb
index 13dd9e03ab1..675035095c5 100644
--- a/spec/models/integrations/base_chat_notification_spec.rb
+++ b/spec/models/integrations/base_chat_notification_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe Integrations::BaseChatNotification, feature_category: :integratio
it { expect(subject.category).to eq(:chat) }
end
- describe 'validations' do
+ describe 'Validations' do
before do
subject.active = active
@@ -112,9 +112,9 @@ RSpec.describe Integrations::BaseChatNotification, feature_category: :integratio
end
context 'when the data object has a label' do
- let_it_be(:label) { create(:label, project: project, name: 'Bug') }
- let_it_be(:label_2) { create(:label, project: project, name: 'Community contribution') }
- let_it_be(:label_3) { create(:label, project: project, name: 'Backend') }
+ let_it_be(:label) { build(:label, project: project, name: 'Bug') }
+ let_it_be(:label_2) { build(:label, project: project, name: 'Community contribution') }
+ let_it_be(:label_3) { build(:label, project: project, name: 'Backend') }
let_it_be(:issue) { create(:labeled_issue, project: project, labels: [label, label_2, label_3]) }
let_it_be(:note) { create(:note, noteable: issue, project: project) }
diff --git a/spec/models/integrations/base_issue_tracker_spec.rb b/spec/models/integrations/base_issue_tracker_spec.rb
index e1a764cd7cb..1bb24876222 100644
--- a/spec/models/integrations/base_issue_tracker_spec.rb
+++ b/spec/models/integrations/base_issue_tracker_spec.rb
@@ -2,10 +2,10 @@
require 'spec_helper'
-RSpec.describe Integrations::BaseIssueTracker do
- let(:integration) { Integrations::Redmine.new(project: project, active: true, issue_tracker_data: build(:issue_tracker_data)) }
+RSpec.describe Integrations::BaseIssueTracker, feature_category: :integrations do
+ let(:integration) { build(:redmine_integration, project: project, active: true, issue_tracker_data: build(:issue_tracker_data)) }
- let_it_be_with_refind(:project) { create :project }
+ let_it_be_with_refind(:project) { create(:project) }
describe 'default values' do
it { expect(subject.category).to eq(:issue_tracker) }
diff --git a/spec/models/integrations/base_slack_notification_spec.rb b/spec/models/integrations/base_slack_notification_spec.rb
index 8f7f4e8858d..ab977ca8fcc 100644
--- a/spec/models/integrations/base_slack_notification_spec.rb
+++ b/spec/models/integrations/base_slack_notification_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Integrations::BaseSlackNotification do
+RSpec.describe Integrations::BaseSlackNotification, feature_category: :integrations do
# This spec should only contain tests that cannot be tested through
# `base_slack_notification_shared_examples.rb`.
diff --git a/spec/models/integrations/base_third_party_wiki_spec.rb b/spec/models/integrations/base_third_party_wiki_spec.rb
index dbead636cb9..763f7131b94 100644
--- a/spec/models/integrations/base_third_party_wiki_spec.rb
+++ b/spec/models/integrations/base_third_party_wiki_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Integrations::BaseThirdPartyWiki do
+RSpec.describe Integrations::BaseThirdPartyWiki, feature_category: :integrations do
describe 'default values' do
it { expect(subject.category).to eq(:third_party_wiki) }
end
@@ -11,7 +11,7 @@ RSpec.describe Integrations::BaseThirdPartyWiki do
let_it_be_with_reload(:project) { create(:project) }
describe 'only one third party wiki per project' do
- subject(:integration) { create(:shimo_integration, project: project, active: true) }
+ subject(:integration) { build(:shimo_integration, project: project, active: true) }
before_all do
create(:confluence_integration, project: project, active: true)
@@ -35,7 +35,7 @@ RSpec.describe Integrations::BaseThirdPartyWiki do
end
context 'when integration is not on the project level' do
- subject(:integration) { create(:shimo_integration, :instance, active: true) }
+ subject(:integration) { build(:shimo_integration, :instance, active: true) }
it 'executes the validation' do
expect(integration.valid?(:manual_change)).to be_truthy
diff --git a/spec/models/integrations/bugzilla_spec.rb b/spec/models/integrations/bugzilla_spec.rb
index f05bc26d066..cef58589231 100644
--- a/spec/models/integrations/bugzilla_spec.rb
+++ b/spec/models/integrations/bugzilla_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Integrations::Bugzilla do
+RSpec.describe Integrations::Bugzilla, feature_category: :integrations do
describe 'Validations' do
context 'when integration is active' do
before do
diff --git a/spec/models/integrations/buildkite_spec.rb b/spec/models/integrations/buildkite_spec.rb
index 29c649af6c6..f3231d50eae 100644
--- a/spec/models/integrations/buildkite_spec.rb
+++ b/spec/models/integrations/buildkite_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Integrations::Buildkite, :use_clean_rails_memory_store_caching do
+RSpec.describe Integrations::Buildkite, :use_clean_rails_memory_store_caching, feature_category: :integrations do
include ReactiveCachingHelpers
include StubRequests
@@ -71,9 +71,7 @@ RSpec.describe Integrations::Buildkite, :use_clean_rails_memory_store_caching do
describe '#hook_url' do
it 'returns the webhook url' do
- expect(integration.hook_url).to eq(
- 'https://webhook.buildkite.com/deliver/{webhook_token}'
- )
+ expect(integration.hook_url).to eq('https://webhook.buildkite.com/deliver/{webhook_token}')
end
end
@@ -103,9 +101,7 @@ RSpec.describe Integrations::Buildkite, :use_clean_rails_memory_store_caching do
describe '#calculate_reactive_cache' do
describe '#commit_status' do
- let(:buildkite_full_url) do
- 'https://gitlab.buildkite.com/status/secret-sauce-status-token.json?commit=123'
- end
+ let(:buildkite_full_url) { 'https://gitlab.buildkite.com/status/secret-sauce-status-token.json?commit=123' }
subject { integration.calculate_reactive_cache('123', 'unused')[:commit_status] }
diff --git a/spec/models/integrations/chat_message/group_mention_message_spec.rb b/spec/models/integrations/chat_message/group_mention_message_spec.rb
new file mode 100644
index 00000000000..6fa486f3dc3
--- /dev/null
+++ b/spec/models/integrations/chat_message/group_mention_message_spec.rb
@@ -0,0 +1,193 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::ChatMessage::GroupMentionMessage, feature_category: :integrations do
+ subject { described_class.new(args) }
+
+ let(:color) { '#345' }
+ let(:args) do
+ {
+ object_kind: 'group_mention',
+ mentioned: {
+ object_kind: 'group',
+ name: 'test/group',
+ url: 'http://test/group'
+ },
+ user: {
+ name: 'Test User',
+ username: 'test.user',
+ avatar_url: 'http://avatar'
+ },
+ project_name: 'Test Project',
+ project_url: 'http://project'
+ }
+ end
+
+ context 'for issue descriptions' do
+ let(:attachments) { [{ text: "Issue\ndescription\n123", color: color }] }
+
+ before do
+ args[:object_attributes] = {
+ object_kind: 'issue',
+ iid: '42',
+ title: 'Test Issue',
+ description: "Issue\ndescription\n123",
+ url: 'http://issue'
+ }
+ end
+
+ it 'returns the appropriate message' do
+ expect(subject.pretext).to eq(
+ 'Group <http://test/group|test/group> was mentioned ' \
+ 'in <http://issue|issue #42> ' \
+ 'of <http://project|Test Project>: ' \
+ '*Test Issue*'
+ )
+ expect(subject.attachments).to eq(attachments)
+ end
+
+ context 'with markdown' do
+ before do
+ args[:markdown] = true
+ end
+
+ it 'returns the appropriate message' do
+ expect(subject.pretext).to eq(
+ 'Group [test/group](http://test/group) was mentioned ' \
+ 'in [issue #42](http://issue) ' \
+ 'of [Test Project](http://project): ' \
+ '*Test Issue*'
+ )
+ expect(subject.attachments).to eq("Issue\ndescription\n123")
+ expect(subject.activity).to eq(
+ {
+ title: 'Group [test/group](http://test/group) was mentioned in [issue #42](http://issue)',
+ subtitle: 'of [Test Project](http://project)',
+ text: 'Test Issue',
+ image: 'http://avatar'
+ }
+ )
+ end
+ end
+ end
+
+ context 'for merge request descriptions' do
+ let(:attachments) { [{ text: "MR\ndescription\n123", color: color }] }
+
+ before do
+ args[:object_attributes] = {
+ object_kind: 'merge_request',
+ iid: '42',
+ title: 'Test MR',
+ description: "MR\ndescription\n123",
+ url: 'http://merge_request'
+ }
+ end
+
+ it 'returns the appropriate message' do
+ expect(subject.pretext).to eq(
+ 'Group <http://test/group|test/group> was mentioned ' \
+ 'in <http://merge_request|merge request !42> ' \
+ 'of <http://project|Test Project>: ' \
+ '*Test MR*'
+ )
+ expect(subject.attachments).to eq(attachments)
+ end
+ end
+
+ context 'for notes' do
+ let(:attachments) { [{ text: 'Test Comment', color: color }] }
+
+ before do
+ args[:object_attributes] = {
+ object_kind: 'note',
+ note: 'Test Comment',
+ url: 'http://note'
+ }
+ end
+
+ context 'on commits' do
+ before do
+ args[:commit] = {
+ id: '5f163b2b95e6f53cbd428f5f0b103702a52b9a23',
+ title: 'Test Commit',
+ message: "Commit\nmessage\n123\n"
+ }
+ end
+
+ it 'returns the appropriate message' do
+ expect(subject.pretext).to eq(
+ 'Group <http://test/group|test/group> was mentioned ' \
+ 'in <http://note|commit 5f163b2b> ' \
+ 'of <http://project|Test Project>: ' \
+ '*Test Commit*'
+ )
+ expect(subject.attachments).to eq(attachments)
+ end
+ end
+
+ context 'on issues' do
+ before do
+ args[:issue] = {
+ iid: '42',
+ title: 'Test Issue'
+ }
+ end
+
+ it 'returns the appropriate message' do
+ expect(subject.pretext).to eq(
+ 'Group <http://test/group|test/group> was mentioned ' \
+ 'in <http://note|issue #42> ' \
+ 'of <http://project|Test Project>: ' \
+ '*Test Issue*'
+ )
+ expect(subject.attachments).to eq(attachments)
+ end
+ end
+
+ context 'on merge requests' do
+ before do
+ args[:merge_request] = {
+ iid: '42',
+ title: 'Test MR'
+ }
+ end
+
+ it 'returns the appropriate message' do
+ expect(subject.pretext).to eq(
+ 'Group <http://test/group|test/group> was mentioned ' \
+ 'in <http://note|merge request !42> ' \
+ 'of <http://project|Test Project>: ' \
+ '*Test MR*'
+ )
+ expect(subject.attachments).to eq(attachments)
+ end
+ end
+ end
+
+ context 'for unsupported object types' do
+ before do
+ args[:object_attributes] = { object_kind: 'unsupported' }
+ end
+
+ it 'raises an error' do
+ expect { described_class.new(args) }.to raise_error(NotImplementedError)
+ end
+ end
+
+ context 'for notes on unsupported object types' do
+ before do
+ args[:object_attributes] = {
+ object_kind: 'note',
+ note: 'Test Comment',
+ url: 'http://note'
+ }
+ # Not adding a supported object type's attributes
+ end
+
+ it 'raises an error' do
+ expect { described_class.new(args) }.to raise_error(NotImplementedError)
+ end
+ end
+end
diff --git a/spec/models/integrations/confluence_spec.rb b/spec/models/integrations/confluence_spec.rb
index 999a532527d..d267e4a71c2 100644
--- a/spec/models/integrations/confluence_spec.rb
+++ b/spec/models/integrations/confluence_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Integrations::Confluence do
+RSpec.describe Integrations::Confluence, feature_category: :integrations do
let_it_be(:project) { create(:project) }
describe 'Validations' do
@@ -49,10 +49,11 @@ RSpec.describe Integrations::Confluence do
end
context 'when the project wiki is not enabled' do
- it 'returns nil when both active or inactive', :aggregate_failures do
- project = create(:project, :wiki_disabled)
- subject.project = project
+ before do
+ allow(project).to receive(:wiki_enabled?).and_return(false)
+ end
+ it 'returns nil when both active or inactive', :aggregate_failures do
[true, false].each do |active|
subject.active = active
diff --git a/spec/models/integrations/custom_issue_tracker_spec.rb b/spec/models/integrations/custom_issue_tracker_spec.rb
index 11f98b99bbe..4be95a25a43 100644
--- a/spec/models/integrations/custom_issue_tracker_spec.rb
+++ b/spec/models/integrations/custom_issue_tracker_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Integrations::CustomIssueTracker do
+RSpec.describe Integrations::CustomIssueTracker, feature_category: :integrations do
describe 'Validations' do
context 'when integration is active' do
before do
diff --git a/spec/models/integrations/drone_ci_spec.rb b/spec/models/integrations/drone_ci_spec.rb
index c46face9702..2cb86fb680a 100644
--- a/spec/models/integrations/drone_ci_spec.rb
+++ b/spec/models/integrations/drone_ci_spec.rb
@@ -184,7 +184,7 @@ RSpec.describe Integrations::DroneCi, :use_clean_rails_memory_store_caching do
"success" => "success"
}.each do |drone_status, our_status|
it "sets commit status to #{our_status.inspect} when returned status is #{drone_status.inspect}" do
- stub_request(body: %Q({"status":"#{drone_status}"}))
+ stub_request(body: %({"status":"#{drone_status}"}))
is_expected.to eq(our_status)
end
diff --git a/spec/models/integrations/microsoft_teams_spec.rb b/spec/models/integrations/microsoft_teams_spec.rb
index f1d9071d232..4f5b4daad42 100644
--- a/spec/models/integrations/microsoft_teams_spec.rb
+++ b/spec/models/integrations/microsoft_teams_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Integrations::MicrosoftTeams do
+RSpec.describe Integrations::MicrosoftTeams, feature_category: :integrations do
it_behaves_like "chat integration", "Microsoft Teams" do
let(:client) { ::MicrosoftTeams::Notifier }
let(:client_arguments) { webhook_url }
diff --git a/spec/models/integrations/prometheus_spec.rb b/spec/models/integrations/prometheus_spec.rb
index 8aa9b12c4f0..da43d851b31 100644
--- a/spec/models/integrations/prometheus_spec.rb
+++ b/spec/models/integrations/prometheus_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
require 'googleauth'
-RSpec.describe Integrations::Prometheus, :use_clean_rails_memory_store_caching, :snowplow do
+RSpec.describe Integrations::Prometheus, :use_clean_rails_memory_store_caching, :snowplow, feature_category: :metrics do
include PrometheusHelpers
include ReactiveCachingHelpers
@@ -37,8 +37,8 @@ RSpec.describe Integrations::Prometheus, :use_clean_rails_memory_store_caching,
integration.manual_configuration = true
end
- it 'validates presence of api_url' do
- expect(integration).to validate_presence_of(:api_url)
+ it 'does not validates presence of api_url' do
+ expect(integration).not_to validate_presence_of(:api_url)
end
end
@@ -119,7 +119,7 @@ RSpec.describe Integrations::Prometheus, :use_clean_rails_memory_store_caching,
context 'when configuration is not valid' do
before do
- integration.api_url = nil
+ integration.manual_configuration = nil
end
it 'returns failure message' do
diff --git a/spec/models/integrations/teamcity_spec.rb b/spec/models/integrations/teamcity_spec.rb
index e32088a2f79..c4c7202fae0 100644
--- a/spec/models/integrations/teamcity_spec.rb
+++ b/spec/models/integrations/teamcity_spec.rb
@@ -307,7 +307,7 @@ RSpec.describe Integrations::Teamcity, :use_clean_rails_memory_store_caching do
def stub_post_to_build_queue(branch:)
teamcity_full_url = "#{teamcity_url}/httpAuth/app/rest/buildQueue"
- body ||= %Q(<build branchName=\"#{branch}\"><buildType id=\"foo\"/></build>)
+ body ||= %(<build branchName=\"#{branch}\"><buildType id=\"foo\"/></build>)
auth = %w(mic password)
stub_full_request(teamcity_full_url, method: :post).with(
@@ -322,7 +322,7 @@ RSpec.describe Integrations::Teamcity, :use_clean_rails_memory_store_caching do
def stub_request(status: 200, body: nil, build_status: 'success')
auth = %w(mic password)
- body ||= %Q({"build":{"status":"#{build_status}","id":"666"}})
+ body ||= %({"build":{"status":"#{build_status}","id":"666"}})
stub_full_request(teamcity_full_url).with(basic_auth: auth).to_return(
status: status,
diff --git a/spec/models/integrations/unify_circuit_spec.rb b/spec/models/integrations/unify_circuit_spec.rb
index 7a91b2d3c11..017443c799f 100644
--- a/spec/models/integrations/unify_circuit_spec.rb
+++ b/spec/models/integrations/unify_circuit_spec.rb
@@ -2,7 +2,7 @@
require "spec_helper"
-RSpec.describe Integrations::UnifyCircuit do
+RSpec.describe Integrations::UnifyCircuit, feature_category: :integrations do
it_behaves_like "chat integration", "Unify Circuit" do
let(:client_arguments) { webhook_url }
let(:payload) do
diff --git a/spec/models/integrations/webex_teams_spec.rb b/spec/models/integrations/webex_teams_spec.rb
index b5cba6762aa..50a1383292b 100644
--- a/spec/models/integrations/webex_teams_spec.rb
+++ b/spec/models/integrations/webex_teams_spec.rb
@@ -2,7 +2,7 @@
require "spec_helper"
-RSpec.describe Integrations::WebexTeams do
+RSpec.describe Integrations::WebexTeams, feature_category: :integrations do
it_behaves_like "chat integration", "Webex Teams" do
let(:client_arguments) { webhook_url }
let(:payload) do
diff --git a/spec/models/internal_id_spec.rb b/spec/models/internal_id_spec.rb
index 59ade8783e5..0d4756659d6 100644
--- a/spec/models/internal_id_spec.rb
+++ b/spec/models/internal_id_spec.rb
@@ -89,7 +89,7 @@ RSpec.describe InternalId do
it 'increments counter with in_transaction: "false"' do
allow(ApplicationRecord.connection).to receive(:transaction_open?) { false }
- expect(InternalId.internal_id_transactions_total).to receive(:increment)
+ expect(described_class.internal_id_transactions_total).to receive(:increment)
.with(operation: :generate, usage: 'issues', in_transaction: 'false').and_call_original
subject
@@ -98,7 +98,7 @@ RSpec.describe InternalId do
context 'when executed within transaction' do
it 'increments counter with in_transaction: "true"' do
- expect(InternalId.internal_id_transactions_total).to receive(:increment)
+ expect(described_class.internal_id_transactions_total).to receive(:increment)
.with(operation: :generate, usage: 'issues', in_transaction: 'true').and_call_original
InternalId.transaction { subject }
@@ -148,7 +148,7 @@ RSpec.describe InternalId do
it 'increments counter with in_transaction: "false"' do
allow(ApplicationRecord.connection).to receive(:transaction_open?) { false }
- expect(InternalId.internal_id_transactions_total).to receive(:increment)
+ expect(described_class.internal_id_transactions_total).to receive(:increment)
.with(operation: :reset, usage: 'issues', in_transaction: 'false').and_call_original
subject
@@ -159,7 +159,7 @@ RSpec.describe InternalId do
let(:value) { 2 }
it 'increments counter with in_transaction: "true"' do
- expect(InternalId.internal_id_transactions_total).to receive(:increment)
+ expect(described_class.internal_id_transactions_total).to receive(:increment)
.with(operation: :reset, usage: 'issues', in_transaction: 'true').and_call_original
InternalId.transaction { subject }
@@ -219,7 +219,7 @@ RSpec.describe InternalId do
it 'increments counter with in_transaction: "false"' do
allow(ApplicationRecord.connection).to receive(:transaction_open?) { false }
- expect(InternalId.internal_id_transactions_total).to receive(:increment)
+ expect(described_class.internal_id_transactions_total).to receive(:increment)
.with(operation: :track_greatest, usage: 'issues', in_transaction: 'false').and_call_original
subject
@@ -228,7 +228,7 @@ RSpec.describe InternalId do
context 'when executed within transaction' do
it 'increments counter with in_transaction: "true"' do
- expect(InternalId.internal_id_transactions_total).to receive(:increment)
+ expect(described_class.internal_id_transactions_total).to receive(:increment)
.with(operation: :track_greatest, usage: 'issues', in_transaction: 'true').and_call_original
InternalId.transaction { subject }
diff --git a/spec/models/issue_assignee_spec.rb b/spec/models/issue_assignee_spec.rb
index df8e91cd133..64afed37714 100644
--- a/spec/models/issue_assignee_spec.rb
+++ b/spec/models/issue_assignee_spec.rb
@@ -27,9 +27,9 @@ RSpec.describe IssueAssignee do
context 'in_projects' do
it 'returns issue assignees for given project' do
- expect(IssueAssignee.count).to eq 2
+ expect(described_class.count).to eq 2
- assignees = IssueAssignee.in_projects([project])
+ assignees = described_class.in_projects([project])
expect(assignees.count).to eq 1
expect(assignees.first.user_id).to eq project_issue.issue_assignees.first.user_id
@@ -39,9 +39,9 @@ RSpec.describe IssueAssignee do
context 'on_issues' do
it 'returns issue assignees for given issues' do
- expect(IssueAssignee.count).to eq 2
+ expect(described_class.count).to eq 2
- assignees = IssueAssignee.on_issues([project_issue])
+ assignees = described_class.on_issues([project_issue])
expect(assignees.count).to eq 1
expect(assignees.first.issue_id).to eq project_issue.issue_assignees.first.issue_id
diff --git a/spec/models/issue_spec.rb b/spec/models/issue_spec.rb
index ee47f90fb40..8d25ac93263 100644
--- a/spec/models/issue_spec.rb
+++ b/spec/models/issue_spec.rb
@@ -127,22 +127,6 @@ RSpec.describe Issue, feature_category: :team_planning do
end
end
- describe 'issue_type' do
- let(:issue) { build(:issue, issue_type: issue_type) }
-
- context 'when a valid type' do
- let(:issue_type) { :issue }
-
- it { is_expected.to eq(true) }
- end
-
- context 'empty type' do
- let(:issue_type) { nil }
-
- it { is_expected.to eq(false) }
- end
- end
-
describe '#allowed_work_item_type_change' do
where(:old_type, :new_type, :is_valid) do
:issue | :incident | true
@@ -161,7 +145,7 @@ RSpec.describe Issue, feature_category: :team_planning do
it 'is possible to change type only between selected types' do
issue = create(:issue, old_type, project: reusable_project)
- issue.assign_attributes(work_item_type: WorkItems::Type.default_by_type(new_type), issue_type: new_type)
+ issue.assign_attributes(work_item_type: WorkItems::Type.default_by_type(new_type))
expect(issue.valid?).to eq(is_valid)
end
@@ -177,7 +161,7 @@ RSpec.describe Issue, feature_category: :team_planning do
let_it_be(:link) { create(:parent_link, work_item: child, work_item_parent: parent) }
it 'does not allow to make child not-confidential' do
- issue = Issue.find(child.id)
+ issue = described_class.find(child.id)
issue.confidential = false
expect(issue).not_to be_valid
@@ -186,7 +170,7 @@ RSpec.describe Issue, feature_category: :team_planning do
end
it 'allows to make parent not-confidential' do
- issue = Issue.find(parent.id)
+ issue = described_class.find(parent.id)
issue.confidential = false
expect(issue).to be_valid
@@ -199,7 +183,7 @@ RSpec.describe Issue, feature_category: :team_planning do
let_it_be(:link) { create(:parent_link, work_item: child, work_item_parent: parent) }
it 'does not allow to make parent confidential' do
- issue = Issue.find(parent.id)
+ issue = described_class.find(parent.id)
issue.confidential = true
expect(issue).not_to be_valid
@@ -208,7 +192,7 @@ RSpec.describe Issue, feature_category: :team_planning do
end
it 'allows to make child confidential' do
- issue = Issue.find(child.id)
+ issue = described_class.find(child.id)
issue.confidential = true
expect(issue).to be_valid
@@ -272,7 +256,7 @@ RSpec.describe Issue, feature_category: :team_planning do
expect(issue.work_item_type_id).to eq(issue_type.id)
expect(WorkItems::Type).not_to receive(:default_by_type)
- issue.update!(work_item_type: incident_type, issue_type: :incident)
+ issue.update!(work_item_type: incident_type)
expect(issue.work_item_type_id).to eq(incident_type.id)
end
@@ -301,36 +285,13 @@ RSpec.describe Issue, feature_category: :team_planning do
expect(issue.work_item_type_id).to be_nil
expect(WorkItems::Type).not_to receive(:default_by_type)
- issue.update!(work_item_type: incident_type, issue_type: :incident)
+ issue.update!(work_item_type: incident_type)
expect(issue.work_item_type_id).to eq(incident_type.id)
end
end
end
- describe '#check_issue_type_in_sync' do
- it 'raises an error if issue_type is out of sync' do
- issue = build(:issue, issue_type: :issue, work_item_type: WorkItems::Type.default_by_type(:task))
-
- expect do
- issue.save!
- end.to raise_error(Issue::IssueTypeOutOfSyncError)
- end
-
- it 'uses attributes to compare both issue_type values' do
- issue_type = WorkItems::Type.default_by_type(:issue)
- issue = build(:issue, issue_type: :issue, work_item_type: issue_type)
-
- attributes = double(:attributes)
- allow(issue).to receive(:attributes).and_return(attributes)
-
- expect(attributes).to receive(:[]).with('issue_type').twice.and_return('issue')
- expect(issue_type).to receive(:base_type).and_call_original
-
- issue.save!
- end
- end
-
describe '#record_create_action' do
it 'records the creation action after saving' do
expect(Gitlab::UsageDataCounters::IssueActivityUniqueCounter).to receive(:track_issue_created_action)
@@ -338,11 +299,13 @@ RSpec.describe Issue, feature_category: :team_planning do
create(:issue)
end
- it_behaves_like 'issue_edit snowplow tracking' do
+ it_behaves_like 'internal event tracking' do
let(:issue) { create(:issue) }
let(:project) { issue.project }
- let(:property) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_CREATED }
let(:user) { issue.author }
+ let(:action) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_CREATED }
+ let(:namespace) { project.namespace }
+
subject(:service_action) { issue }
end
end
@@ -465,18 +428,6 @@ RSpec.describe Issue, feature_category: :team_planning do
expect(described_class.with_issue_type([]).to_sql).to include('WHERE 1=0')
end
end
-
- context 'when the issue_type_uses_work_item_types_table feature flag is disabled' do
- before do
- stub_feature_flags(issue_type_uses_work_item_types_table: false)
- end
-
- it 'uses the issue_type column for filtering' do
- expect do
- described_class.with_issue_type(:issue).to_a
- end.to make_queries_matching(/"issues"\."issue_type" = 0/)
- end
- end
end
describe '.without_issue_type' do
@@ -504,18 +455,6 @@ RSpec.describe Issue, feature_category: :team_planning do
}x
)
end
-
- context 'when the issue_type_uses_work_item_types_table feature flag is disabled' do
- before do
- stub_feature_flags(issue_type_uses_work_item_types_table: false)
- end
-
- it 'uses the issue_type column for filtering' do
- expect do
- described_class.without_issue_type(:issue).to_a
- end.to make_queries_matching(/"issues"\."issue_type" != 0/)
- end
- end
end
describe '.order_severity' do
@@ -1532,52 +1471,58 @@ RSpec.describe Issue, feature_category: :team_planning do
end
describe '#publicly_visible?' do
- context 'using a public project' do
- let(:project) { create(:project, :public) }
+ let(:project) { build(:project, project_visiblity) }
+ let(:issue) { build(:issue, confidential: confidential, project: project) }
- it 'returns true for a regular issue' do
- issue = build(:issue, project: project)
+ subject { issue.send(:publicly_visible?) }
- expect(issue).to be_truthy
- end
-
- it 'returns false for a confidential issue' do
- issue = build(:issue, :confidential, project: project)
+ where(:project_visiblity, :confidential, :expected_value) do
+ :public | false | true
+ :public | true | false
+ :internal | false | false
+ :internal | true | false
+ :private | false | false
+ :private | true | false
+ end
- expect(issue).not_to be_falsy
- end
+ with_them do
+ it { is_expected.to eq(expected_value) }
end
+ end
- context 'using an internal project' do
- let(:project) { create(:project, :internal) }
+ describe '#allow_possible_spam?' do
+ let_it_be(:issue) { build(:issue) }
- it 'returns false for a regular issue' do
- issue = build(:issue, project: project)
+ subject { issue.allow_possible_spam?(issue.author) }
- expect(issue).not_to be_falsy
- end
+ context 'when the `allow_possible_spam` application setting is turned off' do
+ context 'when the issue is private' do
+ it { is_expected.to eq(true) }
- it 'returns false for a confidential issue' do
- issue = build(:issue, :confidential, project: project)
+ context 'when the user is the support bot' do
+ before do
+ allow(issue.author).to receive(:support_bot?).and_return(true)
+ end
- expect(issue).not_to be_falsy
+ it { is_expected.to eq(false) }
+ end
end
- end
-
- context 'using a private project' do
- let(:project) { create(:project, :private) }
- it 'returns false for a regular issue' do
- issue = build(:issue, project: project)
+ context 'when the issue is public' do
+ before do
+ allow(issue).to receive(:publicly_visible?).and_return(true)
+ end
- expect(issue).not_to be_falsy
+ it { is_expected.to eq(false) }
end
+ end
- it 'returns false for a confidential issue' do
- issue = build(:issue, :confidential, project: project)
-
- expect(issue).not_to be_falsy
+ context 'when the `allow_possible_spam` application setting is turned on' do
+ before do
+ stub_application_setting(allow_possible_spam: true)
end
+
+ it { is_expected.to eq(true) }
end
end
@@ -1590,24 +1535,24 @@ RSpec.describe Issue, feature_category: :team_planning do
false | Gitlab::VisibilityLevel::PUBLIC | false | { description: 'new' } | true
false | Gitlab::VisibilityLevel::PUBLIC | false | { title: 'new' } | true
# confidential to non-confidential
- false | Gitlab::VisibilityLevel::PUBLIC | true | { confidential: false } | true
+ false | Gitlab::VisibilityLevel::PUBLIC | true | { confidential: false } | false
# non-confidential to confidential
false | Gitlab::VisibilityLevel::PUBLIC | false | { confidential: true } | false
# spammable attributes changing on confidential
- false | Gitlab::VisibilityLevel::PUBLIC | true | { description: 'new' } | false
+ false | Gitlab::VisibilityLevel::PUBLIC | true | { description: 'new' } | true
# spammable attributes changing while changing to confidential
- false | Gitlab::VisibilityLevel::PUBLIC | false | { title: 'new', confidential: true } | false
+ false | Gitlab::VisibilityLevel::PUBLIC | false | { title: 'new', confidential: true } | true
# spammable attribute not changing
false | Gitlab::VisibilityLevel::PUBLIC | false | { description: 'original description' } | false
# non-spammable attribute changing
false | Gitlab::VisibilityLevel::PUBLIC | false | { weight: 3 } | false
# spammable attributes changing on non-public
- false | Gitlab::VisibilityLevel::INTERNAL | false | { description: 'new' } | false
- false | Gitlab::VisibilityLevel::PRIVATE | false | { description: 'new' } | false
+ false | Gitlab::VisibilityLevel::INTERNAL | false | { description: 'new' } | true
+ false | Gitlab::VisibilityLevel::PRIVATE | false | { description: 'new' } | true
### support-bot cases
# confidential to non-confidential
- true | Gitlab::VisibilityLevel::PUBLIC | true | { confidential: false } | true
+ true | Gitlab::VisibilityLevel::PUBLIC | true | { confidential: false } | false
# non-confidential to confidential
true | Gitlab::VisibilityLevel::PUBLIC | false | { confidential: true } | false
# spammable attributes changing on confidential
@@ -1877,39 +1822,17 @@ RSpec.describe Issue, feature_category: :team_planning do
describe '#issue_type' do
let_it_be(:issue) { create(:issue) }
- context 'when the issue_type_uses_work_item_types_table feature flag is enabled' do
- it 'gets the type field from the work_item_types table' do
- expect(issue).to receive_message_chain(:work_item_type, :base_type)
-
- issue.issue_type
- end
+ it 'gets the type field from the work_item_types table' do
+ expect(issue).to receive_message_chain(:work_item_type, :base_type)
- context 'when the issue is not persisted' do
- it 'uses the default work item type' do
- non_persisted_issue = build(:issue, work_item_type: nil)
-
- expect(non_persisted_issue.issue_type).to eq(described_class::DEFAULT_ISSUE_TYPE.to_s)
- end
- end
+ issue.issue_type
end
- context 'when the issue_type_uses_work_item_types_table feature flag is disabled' do
- before do
- stub_feature_flags(issue_type_uses_work_item_types_table: false)
- end
-
- it 'does not get the value from the work_item_types table' do
- expect(issue).not_to receive(:work_item_type)
+ context 'when the issue is not persisted' do
+ it 'uses the default work item type' do
+ non_persisted_issue = build(:issue, work_item_type: nil)
- issue.issue_type
- end
-
- context 'when the issue is not persisted' do
- it 'uses the default work item type' do
- non_persisted_issue = build(:issue, work_item_type: nil)
-
- expect(non_persisted_issue.issue_type).to eq(described_class::DEFAULT_ISSUE_TYPE.to_s)
- end
+ expect(non_persisted_issue.issue_type).to eq(described_class::DEFAULT_ISSUE_TYPE.to_s)
end
end
end
@@ -1944,7 +1867,7 @@ RSpec.describe Issue, feature_category: :team_planning do
with_them do
before do
- issue.update!(issue_type: issue_type, work_item_type: WorkItems::Type.default_by_type(issue_type))
+ issue.update!(work_item_type: WorkItems::Type.default_by_type(issue_type))
end
specify do
@@ -1964,7 +1887,7 @@ RSpec.describe Issue, feature_category: :team_planning do
with_them do
before do
- issue.update!(issue_type: issue_type, work_item_type: WorkItems::Type.default_by_type(issue_type))
+ issue.update!(work_item_type: WorkItems::Type.default_by_type(issue_type))
end
specify do
@@ -2080,7 +2003,7 @@ RSpec.describe Issue, feature_category: :team_planning do
end
describe '#work_item_type_with_default' do
- subject { Issue.new.work_item_type_with_default }
+ subject { described_class.new.work_item_type_with_default }
it { is_expected.to eq(WorkItems::Type.default_by_type(::Issue::DEFAULT_ISSUE_TYPE)) }
end
@@ -2108,51 +2031,4 @@ RSpec.describe Issue, feature_category: :team_planning do
expect { issue1.unsubscribe_email_participant(email) }.not_to change { issue2.issue_email_participants.count }
end
end
-
- describe 'issue_type enum generated methods' do
- describe '#<issue_type>?' do
- let_it_be(:issue) { create(:issue, project: reusable_project) }
-
- where(issue_type: WorkItems::Type.base_types.keys)
-
- with_them do
- it 'raises an error if called' do
- expect { issue.public_send("#{issue_type}?".to_sym) }.to raise_error(
- Issue::ForbiddenColumnUsed,
- a_string_matching(/`issue\.#{issue_type}\?` uses the `issue_type` column underneath/)
- )
- end
- end
- end
-
- describe '.<issue_type> scopes' do
- where(issue_type: WorkItems::Type.base_types.keys)
-
- with_them do
- it 'raises an error if called' do
- expect { Issue.public_send(issue_type.to_sym) }.to raise_error(
- Issue::ForbiddenColumnUsed,
- a_string_matching(/`Issue\.#{issue_type}` uses the `issue_type` column underneath/)
- )
- end
-
- context 'when called in a production environment' do
- before do
- stub_rails_env('production')
- end
-
- it 'returns issues scoped by type instead of raising an error' do
- issue = create(
- :issue,
- issue_type: issue_type,
- work_item_type: WorkItems::Type.default_by_type(issue_type),
- project: reusable_project
- )
-
- expect(Issue.public_send(issue_type.to_sym)).to contain_exactly(issue)
- end
- end
- end
- end
- end
end
diff --git a/spec/models/label_link_spec.rb b/spec/models/label_link_spec.rb
index c6bec215145..15931e18715 100644
--- a/spec/models/label_link_spec.rb
+++ b/spec/models/label_link_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe LabelLink do
it { is_expected.to belong_to(:label) }
it { is_expected.to belong_to(:target) }
- it_behaves_like 'a BulkInsertSafe model', LabelLink do
+ it_behaves_like 'a BulkInsertSafe model', described_class do
let(:valid_items_for_bulk_insertion) { build_list(:label_link, 10) }
let(:invalid_items_for_bulk_insertion) { [] } # class does not have any validations defined
end
diff --git a/spec/models/lfs_objects_project_spec.rb b/spec/models/lfs_objects_project_spec.rb
index 7378beeed06..c9b43a55ca7 100644
--- a/spec/models/lfs_objects_project_spec.rb
+++ b/spec/models/lfs_objects_project_spec.rb
@@ -31,7 +31,7 @@ RSpec.describe LfsObjectsProject do
expect do
result = described_class.link_to_project!(subject.lfs_object, subject.project)
- expect(result).to be_a(LfsObjectsProject)
+ expect(result).to be_a(described_class)
end.not_to change { described_class.count }
end
diff --git a/spec/models/loose_foreign_keys/deleted_record_spec.rb b/spec/models/loose_foreign_keys/deleted_record_spec.rb
index 2513a9043ad..0c16a725663 100644
--- a/spec/models/loose_foreign_keys/deleted_record_spec.rb
+++ b/spec/models/loose_foreign_keys/deleted_record_spec.rb
@@ -146,7 +146,7 @@ RSpec.describe LooseForeignKeys::DeletedRecord, type: :model do
expect { described_class.create!(fully_qualified_table_name: table, primary_key_value: 5) }.not_to raise_error
# after processing old records
- LooseForeignKeys::DeletedRecord.for_partition(1).update_all(status: :processed)
+ described_class.for_partition(1).update_all(status: :processed)
partition_manager.sync_partitions
diff --git a/spec/models/member_spec.rb b/spec/models/member_spec.rb
index b242de48be0..d21edea9751 100644
--- a/spec/models/member_spec.rb
+++ b/spec/models/member_spec.rb
@@ -254,18 +254,18 @@ RSpec.describe Member, feature_category: :groups_and_projects do
]
end
- subject { Member.in_hierarchy(project) }
+ subject { described_class.in_hierarchy(project) }
it { is_expected.to contain_exactly(*hierarchy_members) }
context 'with scope prefix' do
- subject { Member.where.not(source: project).in_hierarchy(subgroup) }
+ subject { described_class.where.not(source: project).in_hierarchy(subgroup) }
it { is_expected.to contain_exactly(root_ancestor_member, subgroup_member, subgroup_project_member) }
end
context 'with scope suffix' do
- subject { Member.in_hierarchy(project).where.not(source: project) }
+ subject { described_class.in_hierarchy(project).where.not(source: project) }
it { is_expected.to contain_exactly(root_ancestor_member, subgroup_member, subgroup_project_member) }
end
@@ -668,6 +668,15 @@ RSpec.describe Member, feature_category: :groups_and_projects do
end
end
+ describe '.with_user' do
+ it 'returns the member' do
+ not_a_member = create(:user)
+
+ expect(described_class.with_user(@owner_user)).to eq([@owner])
+ expect(described_class.with_user(not_a_member)).to be_empty
+ end
+ end
+
describe '.active_state' do
let_it_be(:active_group_member) { create(:group_member, group: group) }
let_it_be(:active_project_member) { create(:project_member, project: project) }
@@ -859,7 +868,7 @@ RSpec.describe Member, feature_category: :groups_and_projects do
expect(member.invite_accepted_at).to be_nil
expect(member.invite_token).not_to be_nil
- expect_any_instance_of(Member).not_to receive(:after_accept_invite)
+ expect_any_instance_of(described_class).not_to receive(:after_accept_invite)
end
it 'schedules a TasksToBeDone::CreateWorker task' do
diff --git a/spec/models/members/group_member_spec.rb b/spec/models/members/group_member_spec.rb
index e197d83b621..a07829abece 100644
--- a/spec/models/members/group_member_spec.rb
+++ b/spec/models/members/group_member_spec.rb
@@ -31,15 +31,6 @@ RSpec.describe GroupMember, feature_category: :cell do
expect(described_class.of_ldap_type).to eq([group_member])
end
end
-
- describe '.with_user' do
- it 'returns requested user' do
- group_member = create(:group_member, user: user_2)
- create(:group_member, user: user_1)
-
- expect(described_class.with_user(user_2)).to eq([group_member])
- end
- end
end
describe 'delegations' do
diff --git a/spec/models/merge_request/diff_llm_summary_spec.rb b/spec/models/merge_request/diff_llm_summary_spec.rb
deleted file mode 100644
index 860457add62..00000000000
--- a/spec/models/merge_request/diff_llm_summary_spec.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe ::MergeRequest::DiffLlmSummary, feature_category: :code_review_workflow do
- let_it_be_with_reload(:project) { create(:project, :repository) }
-
- subject(:merge_request_diff_llm_summary) { build(:merge_request_diff_llm_summary) }
-
- describe 'associations' do
- it { is_expected.to belong_to(:merge_request_diff) }
- it { is_expected.to belong_to(:user).optional }
- it { is_expected.to validate_uniqueness_of(:merge_request_diff_id) }
- it { is_expected.to validate_presence_of(:content) }
- it { is_expected.to validate_length_of(:content).is_at_most(2056) }
- it { is_expected.to validate_presence_of(:provider) }
- end
-end
diff --git a/spec/models/merge_request/metrics_spec.rb b/spec/models/merge_request/metrics_spec.rb
index b1c2a9b1111..e9e4956dc41 100644
--- a/spec/models/merge_request/metrics_spec.rb
+++ b/spec/models/merge_request/metrics_spec.rb
@@ -94,7 +94,7 @@ RSpec.describe MergeRequest::Metrics do
end
end
- it_behaves_like 'database events tracking batch 2' do
+ it_behaves_like 'database events tracking', feature_category: :service_ping do
let(:merge_request) { create(:merge_request) }
let(:record) { merge_request.metrics }
diff --git a/spec/models/merge_request_assignee_spec.rb b/spec/models/merge_request_assignee_spec.rb
index 73bf7d02468..fd13027bcc4 100644
--- a/spec/models/merge_request_assignee_spec.rb
+++ b/spec/models/merge_request_assignee_spec.rb
@@ -28,9 +28,9 @@ RSpec.describe MergeRequestAssignee do
context 'in_projects' do
it 'returns issue assignees for given project' do
- expect(MergeRequestAssignee.count).to eq 2
+ expect(described_class.count).to eq 2
- assignees = MergeRequestAssignee.in_projects([project])
+ assignees = described_class.in_projects([project])
expect(assignees.count).to eq 1
expect(assignees.first.user_id).to eq project_merge_request.merge_request_assignees.first.user_id
diff --git a/spec/models/merge_request_diff_commit_spec.rb b/spec/models/merge_request_diff_commit_spec.rb
index 78f9fb5b7d3..5cb96809970 100644
--- a/spec/models/merge_request_diff_commit_spec.rb
+++ b/spec/models/merge_request_diff_commit_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe MergeRequestDiffCommit, feature_category: :code_review_workflow d
let(:merge_request) { create(:merge_request) }
let(:project) { merge_request.project }
- it_behaves_like 'a BulkInsertSafe model', MergeRequestDiffCommit do
+ it_behaves_like 'a BulkInsertSafe model', described_class do
let(:valid_items_for_bulk_insertion) do
build_list(:merge_request_diff_commit, 10) do |mr_diff_commit|
mr_diff_commit.merge_request_diff = create(:merge_request_diff)
@@ -82,7 +82,7 @@ RSpec.describe MergeRequestDiffCommit, feature_category: :code_review_workflow d
described_class.create_bulk(diff.id, [commits.first])
- commit_row = MergeRequestDiffCommit
+ commit_row = described_class
.find_by(merge_request_diff_id: diff.id, relative_order: 0)
commit_user_row =
diff --git a/spec/models/merge_request_diff_file_spec.rb b/spec/models/merge_request_diff_file_spec.rb
index eee7fe67ffb..1ad9de78c92 100644
--- a/spec/models/merge_request_diff_file_spec.rb
+++ b/spec/models/merge_request_diff_file_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe MergeRequestDiffFile, feature_category: :code_review_workflow do
- it_behaves_like 'a BulkInsertSafe model', MergeRequestDiffFile do
+ it_behaves_like 'a BulkInsertSafe model', described_class do
let(:valid_items_for_bulk_insertion) do
build_list(:merge_request_diff_file, 10) do |mr_diff_file|
mr_diff_file.merge_request_diff = create(:merge_request_diff)
diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb
index e16f7a94eb7..bf71d289105 100644
--- a/spec/models/merge_request_spec.rb
+++ b/spec/models/merge_request_spec.rb
@@ -415,8 +415,8 @@ RSpec.describe MergeRequest, factory_default: :keep, feature_category: :code_rev
it 'does not create duplicated metrics records when MR is concurrently updated' do
merge_request.metrics.destroy!
- instance1 = MergeRequest.find(merge_request.id)
- instance2 = MergeRequest.find(merge_request.id)
+ instance1 = described_class.find(merge_request.id)
+ instance2 = described_class.find(merge_request.id)
instance1.ensure_metrics!
instance2.ensure_metrics!
@@ -3259,6 +3259,20 @@ RSpec.describe MergeRequest, factory_default: :keep, feature_category: :code_rev
end
end
+ describe '#skipped_mergeable_checks' do
+ subject { build_stubbed(:merge_request).skipped_mergeable_checks(options) }
+
+ where(:options, :skip_ci_check) do
+ {} | false
+ { auto_merge_requested: false } | false
+ { auto_merge_requested: true } | true
+ end
+
+ with_them do
+ it { is_expected.to include(skip_ci_check: skip_ci_check) }
+ end
+ end
+
describe '#check_mergeability' do
let(:mergeability_service) { double }
@@ -5105,6 +5119,32 @@ RSpec.describe MergeRequest, factory_default: :keep, feature_category: :code_rev
end
end
+ describe '#schedule_cleanup_refs' do
+ subject { merge_request.schedule_cleanup_refs(only: :train) }
+
+ let(:merge_request) { build(:merge_request, source_project: create(:project, :repository)) }
+
+ it 'does schedule MergeRequests::CleanupRefWorker' do
+ expect(MergeRequests::CleanupRefWorker).to receive(:perform_async).with(merge_request.id, 'train')
+
+ subject
+ end
+
+ context 'when merge_request_cleanup_ref_worker_async is disabled' do
+ before do
+ stub_feature_flags(merge_request_cleanup_ref_worker_async: false)
+ end
+
+ it 'deletes all refs from the target project' do
+ expect(merge_request.target_project.repository)
+ .to receive(:delete_refs)
+ .with(merge_request.train_ref_path)
+
+ subject
+ end
+ end
+ end
+
describe '#cleanup_refs' do
subject { merge_request.cleanup_refs(only: only) }
@@ -5272,7 +5312,7 @@ RSpec.describe MergeRequest, factory_default: :keep, feature_category: :code_rev
environment: envs[2]
)
- merge_request_relation = MergeRequest.where(id: merge_request.id)
+ merge_request_relation = described_class.where(id: merge_request.id)
created.link_merge_requests(merge_request_relation)
success.link_merge_requests(merge_request_relation)
failed.link_merge_requests(merge_request_relation)
diff --git a/spec/models/milestone_spec.rb b/spec/models/milestone_spec.rb
index 1c43eafb576..1f0f89fea60 100644
--- a/spec/models/milestone_spec.rb
+++ b/spec/models/milestone_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Milestone do
+RSpec.describe Milestone, feature_category: :team_planning do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, :public) }
let_it_be(:group) { create(:group) }
@@ -146,11 +146,11 @@ RSpec.describe Milestone do
let_it_be(:milestone) { create(:milestone, project: project) }
it 'returns true for a predefined Milestone ID' do
- expect(Milestone.predefined_id?(described_class::Upcoming.id)).to be true
+ expect(described_class.predefined_id?(described_class::Upcoming.id)).to be true
end
it 'returns false for a Milestone ID that is not predefined' do
- expect(Milestone.predefined_id?(milestone.id)).to be false
+ expect(described_class.predefined_id?(milestone.id)).to be false
end
end
@@ -732,4 +732,44 @@ RSpec.describe Milestone do
expect(milestone.lock_version).to be_present
end
end
+
+ describe '#check_for_spam?' do
+ let_it_be(:milestone) { build_stubbed(:milestone, project: project) }
+
+ subject { milestone.check_for_spam? }
+
+ context 'when spammable attribute title has changed' do
+ before do
+ milestone.title = 'New title'
+ end
+
+ it { is_expected.to eq(true) }
+ end
+
+ context 'when spammable attribute description has changed' do
+ before do
+ milestone.description = 'New description'
+ end
+
+ it { is_expected.to eq(true) }
+ end
+
+ context 'when spammable attribute has changed but parent is private' do
+ before do
+ milestone.title = 'New title'
+ milestone.parent.update_attribute(:visibility_level, Gitlab::VisibilityLevel::PRIVATE)
+ end
+
+ it { is_expected.to eq(false) }
+ end
+
+ context 'when no spammable attribute has changed' do
+ before do
+ milestone.title = milestone.title_was
+ milestone.description = milestone.description_was
+ end
+
+ it { is_expected.to eq(false) }
+ end
+ end
end
diff --git a/spec/models/ml/experiment_spec.rb b/spec/models/ml/experiment_spec.rb
index 9738a88b5b8..1ee35d6da03 100644
--- a/spec/models/ml/experiment_spec.rb
+++ b/spec/models/ml/experiment_spec.rb
@@ -14,6 +14,21 @@ RSpec.describe Ml::Experiment, feature_category: :mlops do
it { is_expected.to belong_to(:user) }
it { is_expected.to have_many(:candidates) }
it { is_expected.to have_many(:metadata) }
+ it { is_expected.to belong_to(:model).class_name('Ml::Model') }
+ end
+
+ describe '#destroy' do
+ it 'allow experiment without model to be destroyed' do
+ experiment = create(:ml_experiments, project: exp.project)
+
+ expect { experiment.destroy! }.to change { Ml::Experiment.count }.by(-1)
+ end
+
+ it 'throws error when destroying experiment with model' do
+ experiment = create(:ml_models, project: exp.project).default_experiment
+
+ expect { experiment.destroy! }.to raise_error(ActiveRecord::ActiveRecordError)
+ end
end
describe '.package_name' do
diff --git a/spec/models/ml/model_spec.rb b/spec/models/ml/model_spec.rb
new file mode 100644
index 00000000000..397ea23dd85
--- /dev/null
+++ b/spec/models/ml/model_spec.rb
@@ -0,0 +1,62 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Ml::Model, feature_category: :mlops do
+ describe 'associations' do
+ it { is_expected.to belong_to(:project) }
+ it { is_expected.to have_one(:default_experiment) }
+ it { is_expected.to have_many(:versions) }
+ end
+
+ describe '#valid?' do
+ using RSpec::Parameterized::TableSyntax
+
+ let_it_be(:project) { create(:project) }
+ let_it_be(:existing_model) { create(:ml_models, name: 'an_existing_model', project: project) }
+ let_it_be(:valid_name) { 'a_valid_name' }
+ let_it_be(:default_experiment) { create(:ml_experiments, name: valid_name, project: project) }
+
+ let(:name) { valid_name }
+
+ subject(:errors) do
+ m = described_class.new(name: name, project: project, default_experiment: default_experiment)
+ m.validate
+ m.errors
+ end
+
+ it 'validates a valid model version' do
+ expect(errors).to be_empty
+ end
+
+ describe 'name' do
+ where(:ctx, :name) do
+ 'name is blank' | ''
+ 'name is not valid package name' | '!!()()'
+ 'name is too large' | ('a' * 256)
+ 'name is not unique in the project' | 'an_existing_model'
+ end
+ with_them do
+ it { expect(errors).to include(:name) }
+ end
+ end
+
+ describe 'default_experiment' do
+ context 'when experiment name name is different than model name' do
+ before do
+ allow(default_experiment).to receive(:name).and_return("#{name}a")
+ end
+
+ it { expect(errors).to include(:default_experiment) }
+ end
+
+ context 'when model version project is different than model project' do
+ before do
+ allow(default_experiment).to receive(:project_id).and_return(project.id + 1)
+ end
+
+ it { expect(errors).to include(:default_experiment) }
+ end
+ end
+ end
+end
diff --git a/spec/models/ml/model_version_spec.rb b/spec/models/ml/model_version_spec.rb
new file mode 100644
index 00000000000..ef53a1ac3a0
--- /dev/null
+++ b/spec/models/ml/model_version_spec.rb
@@ -0,0 +1,90 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Ml::ModelVersion, feature_category: :mlops do
+ using RSpec::Parameterized::TableSyntax
+
+ let_it_be(:base_project) { create(:project) }
+
+ describe 'associations' do
+ it { is_expected.to belong_to(:project) }
+ it { is_expected.to belong_to(:model) }
+ it { is_expected.to belong_to(:package) }
+ end
+
+ describe 'validation' do
+ let_it_be(:valid_version) { 'valid_version' }
+ let_it_be(:model) { create(:ml_models, project: base_project) }
+ let_it_be(:valid_package) do
+ build_stubbed(:ml_model_package, project: base_project, version: valid_version, name: model.name)
+ end
+
+ let(:package) { valid_package }
+ let(:version) { valid_version }
+
+ subject(:errors) do
+ mv = described_class.new(version: version, model: model, package: package, project: model.project)
+ mv.validate
+ mv.errors
+ end
+
+ it 'validates a valid model version' do
+ expect(errors).to be_empty
+ end
+
+ describe 'version' do
+ where(:ctx, :version) do
+ 'version is blank' | ''
+ 'version is not valid package version' | '!!()()'
+ 'version is too large' | ('a' * 256)
+ end
+ with_them do
+ it { expect(errors).to include(:version) }
+ end
+
+ context 'when version is not unique in project+name' do
+ let_it_be(:existing_model_version) do
+ create(:ml_model_versions, model: model)
+ end
+
+ let(:version) { existing_model_version.version }
+
+ it { expect(errors).to include(:version) }
+ end
+ end
+
+ describe 'model' do
+ context 'when project is different' do
+ before do
+ allow(model).to receive(:project_id).and_return(non_existing_record_id)
+ end
+
+ it { expect(errors[:model]).to include('model project must be the same') }
+ end
+ end
+
+ describe 'package' do
+ where(:property, :value, :error_message) do
+ :name | 'another_name' | 'package name must be the same'
+ :version | 'another_version' | 'package version must be the same'
+ :project_id | 0 | 'package project must be the same'
+ end
+ with_them do
+ before do
+ allow(package).to receive(property).and_return(:value)
+ end
+
+ it { expect(errors[:package]).to include(error_message) }
+ end
+
+ context 'when package is not ml_model' do
+ let(:package) do
+ build_stubbed(:generic_package, project: base_project, name: model.name, version: valid_version)
+ end
+
+ it { expect(errors[:package]).to include('package must be ml_model') }
+ end
+ end
+ end
+end
diff --git a/spec/models/namespace/package_setting_spec.rb b/spec/models/namespace/package_setting_spec.rb
index 72ecad42a70..9dfb58301b1 100644
--- a/spec/models/namespace/package_setting_spec.rb
+++ b/spec/models/namespace/package_setting_spec.rb
@@ -11,11 +11,9 @@ RSpec.describe Namespace::PackageSetting do
it { is_expected.to validate_presence_of(:namespace) }
describe '#maven_duplicates_allowed' do
- it { is_expected.to allow_value(true).for(:maven_duplicates_allowed) }
- it { is_expected.to allow_value(false).for(:maven_duplicates_allowed) }
+ it { is_expected.to allow_value(true, false).for(:maven_duplicates_allowed) }
it { is_expected.not_to allow_value(nil).for(:maven_duplicates_allowed) }
- it { is_expected.to allow_value(true).for(:generic_duplicates_allowed) }
- it { is_expected.to allow_value(false).for(:generic_duplicates_allowed) }
+ it { is_expected.to allow_value(true, false).for(:generic_duplicates_allowed) }
it { is_expected.not_to allow_value(nil).for(:generic_duplicates_allowed) }
end
diff --git a/spec/models/namespace/root_storage_statistics_spec.rb b/spec/models/namespace/root_storage_statistics_spec.rb
index a7f21e3a07f..f2c661c1cfb 100644
--- a/spec/models/namespace/root_storage_statistics_spec.rb
+++ b/spec/models/namespace/root_storage_statistics_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Namespace::RootStorageStatistics, type: :model do
+RSpec.describe Namespace::RootStorageStatistics, type: :model, feature_category: :consumables_cost_management do
it { is_expected.to belong_to :namespace }
it { is_expected.to have_one(:route).through(:namespace) }
@@ -123,10 +123,21 @@ RSpec.describe Namespace::RootStorageStatistics, type: :model do
let_it_be(:group1) { create(:group, parent: root_group) }
let_it_be(:subgroup1) { create(:group, parent: group1) }
let_it_be(:group2) { create(:group, parent: root_group) }
- let_it_be(:root_namespace_stat) { create(:namespace_statistics, namespace: root_group, storage_size: 100, dependency_proxy_size: 100) }
- let_it_be(:group1_namespace_stat) { create(:namespace_statistics, namespace: group1, storage_size: 200, dependency_proxy_size: 200) }
- let_it_be(:group2_namespace_stat) { create(:namespace_statistics, namespace: group2, storage_size: 300, dependency_proxy_size: 300) }
- let_it_be(:subgroup1_namespace_stat) { create(:namespace_statistics, namespace: subgroup1, storage_size: 300, dependency_proxy_size: 100) }
+ let_it_be(:root_namespace_stat) do
+ create(:namespace_statistics, namespace: root_group, storage_size: 100, dependency_proxy_size: 100)
+ end
+
+ let_it_be(:group1_namespace_stat) do
+ create(:namespace_statistics, namespace: group1, storage_size: 200, dependency_proxy_size: 200)
+ end
+
+ let_it_be(:group2_namespace_stat) do
+ create(:namespace_statistics, namespace: group2, storage_size: 300, dependency_proxy_size: 300)
+ end
+
+ let_it_be(:subgroup1_namespace_stat) do
+ create(:namespace_statistics, namespace: subgroup1, storage_size: 300, dependency_proxy_size: 100)
+ end
let(:namespace) { root_group }
@@ -148,8 +159,12 @@ RSpec.describe Namespace::RootStorageStatistics, type: :model do
total_pipeline_artifacts_size = project_stat1.pipeline_artifacts_size + project_stat2.pipeline_artifacts_size
total_uploads_size = project_stat1.uploads_size + project_stat2.uploads_size
total_wiki_size = project_stat1.wiki_size + project_stat2.wiki_size
- total_dependency_proxy_size = root_namespace_stat.dependency_proxy_size + group1_namespace_stat.dependency_proxy_size + group2_namespace_stat.dependency_proxy_size + subgroup1_namespace_stat.dependency_proxy_size
- total_storage_size = project_stat1.storage_size + project_stat2.storage_size + root_namespace_stat.storage_size + group1_namespace_stat.storage_size + group2_namespace_stat.storage_size + subgroup1_namespace_stat.storage_size
+ total_dependency_proxy_size = root_namespace_stat.dependency_proxy_size +
+ group1_namespace_stat.dependency_proxy_size + group2_namespace_stat.dependency_proxy_size +
+ subgroup1_namespace_stat.dependency_proxy_size
+ total_storage_size = project_stat1.storage_size + project_stat2.storage_size +
+ root_namespace_stat.storage_size + group1_namespace_stat.storage_size +
+ group2_namespace_stat.storage_size + subgroup1_namespace_stat.storage_size
expect(root_storage_statistics.repository_size).to eq(total_repository_size)
expect(root_storage_statistics.lfs_objects_size).to eq(total_lfs_objects_size)
@@ -209,7 +224,8 @@ RSpec.describe Namespace::RootStorageStatistics, type: :model do
root_storage_statistics.recalculate!
- expect(root_storage_statistics.snippets_size).to eq(total_personal_snippets_size + total_project_snippets_size)
+ total = total_personal_snippets_size + total_project_snippets_size
+ expect(root_storage_statistics.snippets_size).to eq(total)
end
context 'when personal snippets do not have statistics' do
@@ -219,7 +235,8 @@ RSpec.describe Namespace::RootStorageStatistics, type: :model do
root_storage_statistics.recalculate!
- expect(root_storage_statistics.snippets_size).to eq(total_project_snippets_size + snippets.last.statistics.repository_size)
+ total = total_project_snippets_size + snippets.last.statistics.repository_size
+ expect(root_storage_statistics.snippets_size).to eq(total)
end
end
end
@@ -293,7 +310,9 @@ RSpec.describe Namespace::RootStorageStatistics, type: :model do
root_storage_statistics.reload
expect(root_storage_statistics.private_forks_storage_size).to eq(project_fork.statistics.storage_size)
- expect(root_storage_statistics.storage_size).to eq(project.statistics.storage_size + project_fork.statistics.storage_size)
+
+ total = project.statistics.storage_size + project_fork.statistics.storage_size
+ expect(root_storage_statistics.storage_size).to eq(total)
end
it 'sets the public forks storage size back to zero' do
diff --git a/spec/models/namespace_spec.rb b/spec/models/namespace_spec.rb
index 3d7d5062ca7..1c02b4754fa 100644
--- a/spec/models/namespace_spec.rb
+++ b/spec/models/namespace_spec.rb
@@ -15,6 +15,7 @@ RSpec.describe Namespace, feature_category: :groups_and_projects do
let(:repository_storage) { 'default' }
describe 'associations' do
+ it { is_expected.to belong_to :organization }
it { is_expected.to have_many :projects }
it { is_expected.to have_many :project_statistics }
it { is_expected.to belong_to :parent }
@@ -375,7 +376,7 @@ RSpec.describe Namespace, feature_category: :groups_and_projects do
describe 'handling STI', :aggregate_failures do
let(:namespace_type) { nil }
let(:parent) { nil }
- let(:namespace) { Namespace.find(create(:namespace, type: namespace_type, parent: parent).id) }
+ let(:namespace) { described_class.find(create(:namespace, type: namespace_type, parent: parent).id) }
context 'creating a Group' do
let(:namespace_type) { group_sti_name }
@@ -392,7 +393,7 @@ RSpec.describe Namespace, feature_category: :groups_and_projects do
let(:parent) { create(:group) }
it 'is the correct type of namespace' do
- expect(Namespace.find(namespace.id)).to be_a(Namespaces::ProjectNamespace)
+ expect(described_class.find(namespace.id)).to be_a(Namespaces::ProjectNamespace)
expect(namespace.kind).to eq('project')
expect(namespace.project_namespace?).to be_truthy
end
@@ -402,7 +403,7 @@ RSpec.describe Namespace, feature_category: :groups_and_projects do
let(:namespace_type) { user_sti_name }
it 'is the correct type of namespace' do
- expect(Namespace.find(namespace.id)).to be_a(Namespaces::UserNamespace)
+ expect(described_class.find(namespace.id)).to be_a(Namespaces::UserNamespace)
expect(namespace.kind).to eq('user')
expect(namespace.user_namespace?).to be_truthy
end
@@ -421,7 +422,7 @@ RSpec.describe Namespace, feature_category: :groups_and_projects do
let(:namespace_type) { 'nonsense' }
it 'creates a default Namespace' do
- expect(Namespace.find(namespace.id)).to be_a(Namespace)
+ expect(described_class.find(namespace.id)).to be_a(described_class)
expect(namespace.kind).to eq('user')
expect(namespace.user_namespace?).to be_truthy
end
@@ -587,7 +588,7 @@ RSpec.describe Namespace, feature_category: :groups_and_projects do
end
it 'returns value that matches database' do
- expect(namespace.traversal_ids).to eq Namespace.find(namespace.id).traversal_ids
+ expect(namespace.traversal_ids).to eq described_class.find(namespace.id).traversal_ids
end
end
@@ -598,7 +599,7 @@ RSpec.describe Namespace, feature_category: :groups_and_projects do
end
it 'returns database value' do
- expect(namespace.traversal_ids).to eq Namespace.find(namespace.id).traversal_ids
+ expect(namespace.traversal_ids).to eq described_class.find(namespace.id).traversal_ids
end
end
@@ -684,14 +685,6 @@ RSpec.describe Namespace, feature_category: :groups_and_projects do
it_behaves_like 'makes recursive queries'
end
-
- context 'when feature flag :use_traversal_ids_for_descendants_scopes is disabled' do
- before do
- stub_feature_flags(use_traversal_ids_for_descendants_scopes: false)
- end
-
- it_behaves_like 'makes recursive queries'
- end
end
describe '.self_and_descendant_ids' do
@@ -708,14 +701,6 @@ RSpec.describe Namespace, feature_category: :groups_and_projects do
it_behaves_like 'makes recursive queries'
end
-
- context 'when feature flag :use_traversal_ids_for_descendants_scopes is disabled' do
- before do
- stub_feature_flags(use_traversal_ids_for_descendants_scopes: false)
- end
-
- it_behaves_like 'makes recursive queries'
- end
end
end
@@ -889,6 +874,7 @@ RSpec.describe Namespace, feature_category: :groups_and_projects do
context 'when Gitlab API is supported' do
before do
+ allow(Gitlab).to receive(:com_except_jh?).and_return(true)
allow(ContainerRegistry::GitlabApiClient).to receive(:supports_gitlab_api?).and_return(true)
stub_container_registry_config(enabled: true, api_url: 'http://container-registry', key: 'spec/fixtures/x509_certificate_pk.key')
end
@@ -931,7 +917,7 @@ RSpec.describe Namespace, feature_category: :groups_and_projects do
before do
allow(ContainerRegistry::GitlabApiClient).to receive(:one_project_with_container_registry_tag).and_return(nil)
stub_container_registry_config(enabled: true, api_url: 'http://container-registry', key: 'spec/fixtures/x509_certificate_pk.key')
- allow(Gitlab).to receive(:com?).and_return(true)
+ allow(Gitlab).to receive(:com_except_jh?).and_return(true)
allow(ContainerRegistry::GitlabApiClient).to receive(:supports_gitlab_api?).and_return(gitlab_api_supported)
allow(project_namespace).to receive_message_chain(:all_container_repositories, :empty?).and_return(no_container_repositories)
allow(project_namespace).to receive_message_chain(:all_container_repositories, :all_migrated?).and_return(all_migrated)
@@ -1142,8 +1128,9 @@ RSpec.describe Namespace, feature_category: :groups_and_projects do
project1
project2
statistics = described_class.with_statistics.find(namespace.id)
+ expected_storage_size = project1.statistics.storage_size + project2.statistics.storage_size
- expect(statistics.storage_size).to eq 3995
+ expect(statistics.storage_size).to eq expected_storage_size
expect(statistics.repository_size).to eq 111
expect(statistics.wiki_size).to eq 555
expect(statistics.lfs_objects_size).to eq 222
@@ -1606,96 +1593,6 @@ RSpec.describe Namespace, feature_category: :groups_and_projects do
end
end
- describe '#use_traversal_ids_for_ancestors?' do
- let_it_be(:namespace, reload: true) { create(:namespace) }
-
- subject { namespace.use_traversal_ids_for_ancestors? }
-
- context 'when use_traversal_ids_for_ancestors? feature flag is true' do
- before do
- stub_feature_flags(use_traversal_ids_for_ancestors: true)
- end
-
- it { is_expected.to eq true }
-
- it_behaves_like 'disabled feature flag when traversal_ids is blank'
- end
-
- context 'when use_traversal_ids_for_ancestors? feature flag is false' do
- before do
- stub_feature_flags(use_traversal_ids_for_ancestors: false)
- end
-
- it { is_expected.to eq false }
- end
-
- context 'when use_traversal_ids? feature flag is false' do
- before do
- stub_feature_flags(use_traversal_ids: false)
- end
-
- it { is_expected.to eq false }
- end
- end
-
- describe '#use_traversal_ids_for_ancestors_upto?' do
- let_it_be(:namespace, reload: true) { create(:namespace) }
-
- subject { namespace.use_traversal_ids_for_ancestors_upto? }
-
- context 'when use_traversal_ids_for_ancestors_upto feature flag is true' do
- before do
- stub_feature_flags(use_traversal_ids_for_ancestors_upto: true)
- end
-
- it { is_expected.to eq true }
-
- it_behaves_like 'disabled feature flag when traversal_ids is blank'
- end
-
- context 'when use_traversal_ids_for_ancestors_upto feature flag is false' do
- before do
- stub_feature_flags(use_traversal_ids_for_ancestors_upto: false)
- end
-
- it { is_expected.to eq false }
- end
-
- context 'when use_traversal_ids? feature flag is false' do
- before do
- stub_feature_flags(use_traversal_ids: false)
- end
-
- it { is_expected.to eq false }
- end
- end
-
- describe '#use_traversal_ids_for_self_and_hierarchy?' do
- let_it_be(:namespace, reload: true) { create(:namespace) }
-
- subject { namespace.use_traversal_ids_for_self_and_hierarchy? }
-
- it { is_expected.to eq true }
-
- it_behaves_like 'disabled feature flag when traversal_ids is blank'
-
- context 'when use_traversal_ids_for_self_and_hierarchy feature flag is false' do
- before do
- stub_feature_flags(use_traversal_ids_for_self_and_hierarchy: false)
- end
-
- it { is_expected.to eq false }
- end
-
- context 'when use_traversal_ids? feature flag is false' do
- before do
- stub_feature_flags(use_traversal_ids: false)
- end
-
- it { is_expected.to eq false }
- end
- end
-
describe '#users_with_descendants' do
let(:user_a) { create(:user) }
let(:user_b) { create(:user) }
@@ -2747,4 +2644,11 @@ RSpec.describe Namespace, feature_category: :groups_and_projects do
end
end
end
+
+ context 'with loose foreign key on organization_id' do
+ it_behaves_like 'cleanup by a loose foreign key' do
+ let!(:parent) { create(:organization) }
+ let!(:model) { create(:namespace, organization: parent) }
+ end
+ end
end
diff --git a/spec/models/oauth_access_token_spec.rb b/spec/models/oauth_access_token_spec.rb
index 5fa590eab58..b21a2bf2079 100644
--- a/spec/models/oauth_access_token_spec.rb
+++ b/spec/models/oauth_access_token_spec.rb
@@ -32,7 +32,7 @@ RSpec.describe OauthAccessToken do
end
it 'finds a token by plaintext token' do
- expect(described_class.by_token(token.plaintext_token)).to be_a(OauthAccessToken)
+ expect(described_class.by_token(token.plaintext_token)).to be_a(described_class)
end
context 'when the token is stored in plaintext' do
@@ -43,7 +43,7 @@ RSpec.describe OauthAccessToken do
end
it 'falls back to plaintext token comparison' do
- expect(described_class.by_token(plaintext_token)).to be_a(OauthAccessToken)
+ expect(described_class.by_token(plaintext_token)).to be_a(described_class)
end
end
end
@@ -57,7 +57,7 @@ RSpec.describe OauthAccessToken do
describe '#expires_in' do
context 'when token has expires_in value set' do
it 'uses the expires_in value' do
- token = OauthAccessToken.new(expires_in: 1.minute)
+ token = described_class.new(expires_in: 1.minute)
expect(token).to be_valid
end
@@ -65,7 +65,7 @@ RSpec.describe OauthAccessToken do
context 'when token has nil expires_in' do
it 'uses default value' do
- token = OauthAccessToken.new(expires_in: nil)
+ token = described_class.new(expires_in: nil)
expect(token).to be_invalid
end
diff --git a/spec/models/organizations/organization_setting_spec.rb b/spec/models/organizations/organization_setting_spec.rb
new file mode 100644
index 00000000000..376d0b7fe77
--- /dev/null
+++ b/spec/models/organizations/organization_setting_spec.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Organizations::OrganizationSetting, type: :model, feature_category: :cell do
+ let_it_be(:organization) { create(:organization) }
+
+ describe 'associations' do
+ it { is_expected.to belong_to :organization }
+ end
+
+ describe 'validations' do
+ context 'for json schema' do
+ let(:restricted_visibility_levels) { [] }
+ let(:settings) do
+ {
+ restricted_visibility_levels: restricted_visibility_levels
+ }
+ end
+
+ it { is_expected.to allow_value(settings).for(:settings) }
+
+ context 'when trying to store an unsupported key' do
+ let(:settings) do
+ {
+ unsupported_key: 'some_value'
+ }
+ end
+
+ it { is_expected.not_to allow_value(settings).for(:settings) }
+ end
+
+ context "when key 'restricted_visibility_levels' is invalid" do
+ let(:restricted_visibility_levels) { ['some_string'] }
+
+ it { is_expected.not_to allow_value(settings).for(:settings) }
+ end
+ end
+
+ context 'when setting restricted_visibility_levels' do
+ it 'is one or more of Gitlab::VisibilityLevel constants' do
+ setting = build(:organization_setting)
+
+ setting.restricted_visibility_levels = [123]
+
+ expect(setting.valid?).to be false
+ expect(setting.errors.full_messages).to include(
+ "Restricted visibility levels '123' is not a valid visibility level"
+ )
+
+ setting.restricted_visibility_levels = [Gitlab::VisibilityLevel::PUBLIC, Gitlab::VisibilityLevel::PRIVATE,
+ Gitlab::VisibilityLevel::INTERNAL]
+ expect(setting.valid?).to be true
+ end
+ end
+ end
+end
diff --git a/spec/models/organizations/organization_spec.rb b/spec/models/organizations/organization_spec.rb
index 4a75f352b6f..a9cac30e9a1 100644
--- a/spec/models/organizations/organization_spec.rb
+++ b/spec/models/organizations/organization_spec.rb
@@ -6,6 +6,13 @@ RSpec.describe Organizations::Organization, type: :model, feature_category: :cel
let_it_be(:organization) { create(:organization) }
let_it_be(:default_organization) { create(:organization, :default) }
+ describe 'associations' do
+ it { is_expected.to have_many :namespaces }
+ it { is_expected.to have_many :groups }
+ it { is_expected.to have_many(:users).through(:organization_users).inverse_of(:organizations) }
+ it { is_expected.to have_many(:organization_users).inverse_of(:organization) }
+ end
+
describe 'validations' do
subject { create(:organization) }
@@ -141,4 +148,18 @@ RSpec.describe Organizations::Organization, type: :model, feature_category: :cel
expect(organization.to_param).to eq('org_path')
end
end
+
+ context 'on deleting organizations via SQL' do
+ it 'does not allow to delete default organization' do
+ expect { default_organization.delete }.to raise_error(
+ ActiveRecord::StatementInvalid, /Deletion of the default Organization is not allowed/
+ )
+ end
+
+ it 'allows to delete any other organization' do
+ organization.delete
+
+ expect(described_class.where(id: organization)).not_to exist
+ end
+ end
end
diff --git a/spec/models/organizations/organization_user_spec.rb b/spec/models/organizations/organization_user_spec.rb
new file mode 100644
index 00000000000..392ffa1b5be
--- /dev/null
+++ b/spec/models/organizations/organization_user_spec.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Organizations::OrganizationUser, type: :model, feature_category: :cell do
+ describe 'associations' do
+ it { is_expected.to belong_to(:organization).inverse_of(:organization_users).required }
+ it { is_expected.to belong_to(:user).inverse_of(:organization_users).required }
+ end
+end
diff --git a/spec/models/packages/dependency_spec.rb b/spec/models/packages/dependency_spec.rb
index 80ec7f77fda..9918a2bdb14 100644
--- a/spec/models/packages/dependency_spec.rb
+++ b/spec/models/packages/dependency_spec.rb
@@ -27,7 +27,7 @@ RSpec.describe Packages::Dependency, type: :model, feature_category: :package_re
let(:chunk_size) { 50 }
let(:rows_limit) { 50 }
- subject { Packages::Dependency.ids_for_package_names_and_version_patterns(names_and_version_patterns, chunk_size, rows_limit) }
+ subject { described_class.ids_for_package_names_and_version_patterns(names_and_version_patterns, chunk_size, rows_limit) }
it { is_expected.to match_array(expected_ids) }
@@ -97,7 +97,7 @@ RSpec.describe Packages::Dependency, type: :model, feature_category: :package_re
let(:names_and_version_patterns) { build_names_and_version_patterns(package_dependency1, package_dependency2) }
- subject { Packages::Dependency.for_package_names_and_version_patterns(names_and_version_patterns) }
+ subject { described_class.for_package_names_and_version_patterns(names_and_version_patterns) }
it { is_expected.to match_array(expected_array) }
diff --git a/spec/models/packages/maven/metadatum_spec.rb b/spec/models/packages/maven/metadatum_spec.rb
index 0000543cb18..ef55bcdcd20 100644
--- a/spec/models/packages/maven/metadatum_spec.rb
+++ b/spec/models/packages/maven/metadatum_spec.rb
@@ -43,7 +43,7 @@ RSpec.describe Packages::Maven::Metadatum, type: :model do
describe '.for_package_ids' do
let_it_be(:metadata) { create_list(:maven_metadatum, 3, package: package) }
- subject { Packages::Maven::Metadatum.for_package_ids(package.id) }
+ subject { described_class.for_package_ids(package.id) }
it { is_expected.to match_array(metadata) }
end
diff --git a/spec/models/packages/npm/metadatum_spec.rb b/spec/models/packages/npm/metadatum_spec.rb
index 418194bffdd..e5586dca15c 100644
--- a/spec/models/packages/npm/metadatum_spec.rb
+++ b/spec/models/packages/npm/metadatum_spec.rb
@@ -38,7 +38,9 @@ RSpec.describe Packages::Npm::Metadatum, type: :model, feature_category: :packag
it { is_expected.not_to allow_value({}).for(:package_json) }
- it { is_expected.not_to allow_value(test: 'test' * 10000).for(:package_json) }
+ it {
+ is_expected.not_to allow_value(test: 'test' * 10000).for(:package_json).with_message(/structure is too large/)
+ }
def with_dist
valid_json.tap do |h|
diff --git a/spec/models/packages/package_spec.rb b/spec/models/packages/package_spec.rb
index 90a5d815427..120b7d72cd9 100644
--- a/spec/models/packages/package_spec.rb
+++ b/spec/models/packages/package_spec.rb
@@ -804,15 +804,6 @@ RSpec.describe Packages::Package, type: :model, feature_category: :package_regis
let!(:package2) { create(:npm_package, version: '1.0.1') }
let!(:package3) { create(:npm_package, version: '1.0.1') }
- describe '.last_of_each_version' do
- subject { described_class.last_of_each_version }
-
- it 'includes only latest package per version' do
- is_expected.to include(package1, package3)
- is_expected.not_to include(package2)
- end
- end
-
describe '.has_version' do
subject { described_class.has_version }
@@ -1023,6 +1014,32 @@ RSpec.describe Packages::Package, type: :model, feature_category: :package_regis
end
end
+ describe '.select_only_first_by_name' do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:package1) { create(:package, name: 'p1', created_at: 1000, project: project) }
+ let_it_be(:package2) { create(:package, name: 'p1', created_at: 1001, project: project) }
+ let_it_be(:package3) { create(:package, name: 'p2', project: project) }
+
+ subject { described_class.order_name_desc_version_desc.select_only_first_by_name }
+
+ it 'returns only the most recent package by name' do
+ is_expected.to eq([package3, package2])
+ end
+ end
+
+ describe '.order_name_desc_version_desc' do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:package1) { create(:package, name: 'p1', created_at: 1000, project: project) }
+ let_it_be(:package2) { create(:package, name: 'p1', created_at: 1001, project: project) }
+ let_it_be(:package3) { create(:package, name: 'p2', project: project) }
+
+ subject { described_class.order_name_desc_version_desc }
+
+ it 'sorts packages by name desc and created desc' do
+ is_expected.to eq([package3, package2, package1])
+ end
+ end
+
context 'sorting' do
let_it_be(:project) { create(:project, name: 'aaa') }
let_it_be(:project2) { create(:project, name: 'bbb') }
@@ -1032,22 +1049,22 @@ RSpec.describe Packages::Package, type: :model, feature_category: :package_regis
let_it_be(:package4) { create(:package, project: project) }
it 'orders packages by their projects name ascending' do
- expect(Packages::Package.order_project_name).to eq([package1, package4, package2, package3])
+ expect(described_class.order_project_name).to eq([package1, package4, package2, package3])
end
it 'orders packages by their projects name descending' do
- expect(Packages::Package.order_project_name_desc).to eq([package2, package3, package1, package4])
+ expect(described_class.order_project_name_desc).to eq([package2, package3, package1, package4])
end
shared_examples 'order_project_path scope' do
it 'orders packages by their projects path asc, then package id asc' do
- expect(Packages::Package.order_project_path).to eq([package1, package4, package2, package3])
+ expect(described_class.order_project_path).to eq([package1, package4, package2, package3])
end
end
shared_examples 'order_project_path_desc scope' do
it 'orders packages by their projects path desc, then package id desc' do
- expect(Packages::Package.order_project_path_desc).to eq([package3, package2, package4, package1])
+ expect(described_class.order_project_path_desc).to eq([package3, package2, package4, package1])
end
end
diff --git a/spec/models/pages/lookup_path_spec.rb b/spec/models/pages/lookup_path_spec.rb
index 88fd1bd9e56..62152f9d3a4 100644
--- a/spec/models/pages/lookup_path_spec.rb
+++ b/spec/models/pages/lookup_path_spec.rb
@@ -8,7 +8,12 @@ RSpec.describe Pages::LookupPath, feature_category: :pages do
subject(:lookup_path) { described_class.new(project) }
before do
- stub_pages_setting(access_control: true, external_https: ["1.1.1.1:443"])
+ stub_pages_setting(
+ access_control: true,
+ external_https: ["1.1.1.1:443"],
+ url: 'http://example.com',
+ protocol: 'http'
+ )
stub_pages_object_storage(::Pages::DeploymentUploader)
end
@@ -120,18 +125,14 @@ RSpec.describe Pages::LookupPath, feature_category: :pages do
describe '#prefix' do
it 'returns "/" for pages group root projects' do
- project = instance_double(Project, pages_namespace_url: "namespace.test", pages_url: "namespace.test")
+ project = instance_double(Project, full_path: "namespace/namespace.example.com")
lookup_path = described_class.new(project, trim_prefix: 'mygroup')
expect(lookup_path.prefix).to eq('/')
end
it 'returns the project full path with the provided prefix removed' do
- project = instance_double(
- Project,
- pages_namespace_url: "namespace.test",
- pages_url: "namespace.other",
- full_path: 'mygroup/myproject')
+ project = instance_double(Project, full_path: 'mygroup/myproject')
lookup_path = described_class.new(project, trim_prefix: 'mygroup')
expect(lookup_path.prefix).to eq('/myproject/')
diff --git a/spec/models/pages_deployment_spec.rb b/spec/models/pages_deployment_spec.rb
index 767db511d85..553491f6eff 100644
--- a/spec/models/pages_deployment_spec.rb
+++ b/spec/models/pages_deployment_spec.rb
@@ -184,7 +184,7 @@ RSpec.describe PagesDeployment, feature_category: :pages do
# new deployment
create(:pages_deployment)
- expect(PagesDeployment.older_than(deployment.id)).to eq(old_deployments)
+ expect(described_class.older_than(deployment.id)).to eq(old_deployments)
end
end
end
diff --git a/spec/models/pages_domain_spec.rb b/spec/models/pages_domain_spec.rb
index 2c63306bd0a..3030756a413 100644
--- a/spec/models/pages_domain_spec.rb
+++ b/spec/models/pages_domain_spec.rb
@@ -579,7 +579,7 @@ RSpec.describe PagesDomain do
it 'lookup is case-insensitive' do
pages_domain = create(:pages_domain, domain: "Pages.IO")
- expect(PagesDomain.find_by_domain_case_insensitive('pages.io')).to eq(pages_domain)
+ expect(described_class.find_by_domain_case_insensitive('pages.io')).to eq(pages_domain)
end
end
end
diff --git a/spec/models/performance_monitoring/prometheus_dashboard_spec.rb b/spec/models/performance_monitoring/prometheus_dashboard_spec.rb
index 21b16bdeb17..f338e5439ad 100644
--- a/spec/models/performance_monitoring/prometheus_dashboard_spec.rb
+++ b/spec/models/performance_monitoring/prometheus_dashboard_spec.rb
@@ -32,7 +32,7 @@ RSpec.describe PerformanceMonitoring::PrometheusDashboard do
subject { described_class.from_json(json_content) }
it 'creates a PrometheusDashboard object' do
- expect(subject).to be_a PerformanceMonitoring::PrometheusDashboard
+ expect(subject).to be_a described_class
expect(subject.dashboard).to eq(json_content['dashboard'])
expect(subject.panel_groups).to all(be_a PerformanceMonitoring::PrometheusPanelGroup)
end
diff --git a/spec/models/performance_monitoring/prometheus_metric_spec.rb b/spec/models/performance_monitoring/prometheus_metric_spec.rb
index b5b9cd58aa8..58bb59793cf 100644
--- a/spec/models/performance_monitoring/prometheus_metric_spec.rb
+++ b/spec/models/performance_monitoring/prometheus_metric_spec.rb
@@ -16,7 +16,7 @@ RSpec.describe PerformanceMonitoring::PrometheusMetric do
subject { described_class.from_json(json_content) }
it 'creates a PrometheusMetric object' do
- expect(subject).to be_a PerformanceMonitoring::PrometheusMetric
+ expect(subject).to be_a described_class
expect(subject.id).to eq(json_content['id'])
expect(subject.unit).to eq(json_content['unit'])
expect(subject.label).to eq(json_content['label'])
diff --git a/spec/models/performance_monitoring/prometheus_panel_group_spec.rb b/spec/models/performance_monitoring/prometheus_panel_group_spec.rb
index 9e92cb27954..497f80483eb 100644
--- a/spec/models/performance_monitoring/prometheus_panel_group_spec.rb
+++ b/spec/models/performance_monitoring/prometheus_panel_group_spec.rb
@@ -24,7 +24,7 @@ RSpec.describe PerformanceMonitoring::PrometheusPanelGroup do
subject { described_class.from_json(json_content) }
it 'creates a PrometheusPanelGroup object' do
- expect(subject).to be_a PerformanceMonitoring::PrometheusPanelGroup
+ expect(subject).to be_a described_class
expect(subject.group).to eq(json_content['group'])
expect(subject.panels).to all(be_a PerformanceMonitoring::PrometheusPanel)
end
diff --git a/spec/models/performance_monitoring/prometheus_panel_spec.rb b/spec/models/performance_monitoring/prometheus_panel_spec.rb
index c5c6b1fdafd..42dcbbdb8e0 100644
--- a/spec/models/performance_monitoring/prometheus_panel_spec.rb
+++ b/spec/models/performance_monitoring/prometheus_panel_spec.rb
@@ -33,7 +33,7 @@ RSpec.describe PerformanceMonitoring::PrometheusPanel do
subject { described_class.from_json(json_content) }
it 'creates a PrometheusPanelGroup object' do
- expect(subject).to be_a PerformanceMonitoring::PrometheusPanel
+ expect(subject).to be_a described_class
expect(subject.type).to eq(json_content['type'])
expect(subject.title).to eq(json_content['title'])
expect(subject.y_label).to eq(json_content['y_label'])
diff --git a/spec/models/personal_access_token_spec.rb b/spec/models/personal_access_token_spec.rb
index 8e86518912c..7437e9b463e 100644
--- a/spec/models/personal_access_token_spec.rb
+++ b/spec/models/personal_access_token_spec.rb
@@ -21,6 +21,12 @@ RSpec.describe PersonalAccessToken, feature_category: :system_access do
end
end
+ describe 'associations' do
+ subject(:project_access_token) { create(:personal_access_token) }
+
+ it { is_expected.to belong_to(:previous_personal_access_token).class_name('PersonalAccessToken') }
+ end
+
describe 'scopes' do
describe '.project_access_tokens' do
let_it_be(:user) { create(:user, :project_bot) }
@@ -257,7 +263,7 @@ RSpec.describe PersonalAccessToken, feature_category: :system_access do
end
context 'validates expires_at' do
- let(:max_expiration_date) { described_class::MAX_PERSONAL_ACCESS_TOKEN_LIFETIME_IN_DAYS.days.from_now }
+ let(:max_expiration_date) { Date.current + described_class::MAX_PERSONAL_ACCESS_TOKEN_LIFETIME_IN_DAYS }
it "can't be blank" do
personal_access_token.expires_at = nil
@@ -274,12 +280,14 @@ RSpec.describe PersonalAccessToken, feature_category: :system_access do
end
end
- context 'when expires_in is more than MAX_PERSONAL_ACCESS_TOKEN_LIFETIME_IN_DAYS days' do
+ context 'when expires_in is more than MAX_PERSONAL_ACCESS_TOKEN_LIFETIME_IN_DAYS days', :freeze_time do
it 'is invalid' do
personal_access_token.expires_at = max_expiration_date + 1.day
expect(personal_access_token).not_to be_valid
- expect(personal_access_token.errors[:expires_at].first).to eq('must expire in 365 days')
+ expect(personal_access_token.errors.full_messages.to_sentence).to eq(
+ "Expiration date must be before #{max_expiration_date}"
+ )
end
end
end
diff --git a/spec/models/plan_limits_spec.rb b/spec/models/plan_limits_spec.rb
index d211499e9e9..bee1c4f47b0 100644
--- a/spec/models/plan_limits_spec.rb
+++ b/spec/models/plan_limits_spec.rb
@@ -302,94 +302,136 @@ RSpec.describe PlanLimits do
end
end
- describe '#log_limits_changes', :freeze_time do
+ describe '#format_limits_history', :freeze_time do
let(:user) { create(:user) }
let(:plan_limits) { create(:plan_limits) }
let(:current_timestamp) { Time.current.utc.to_i }
- let(:history) { plan_limits.limits_history }
- it 'logs a single attribute change' do
- plan_limits.log_limits_changes(user, enforcement_limit: 5_000)
-
- expect(history).to eq(
- { 'enforcement_limit' => [{ 'user_id' => user.id, 'username' => user.username,
- 'timestamp' => current_timestamp, 'value' => 5_000 }] }
+ it 'formats a single attribute change' do
+ formatted_limits_history = plan_limits.format_limits_history(user, enforcement_limit: 5_000)
+
+ expect(formatted_limits_history).to eq(
+ {
+ "enforcement_limit" => [
+ {
+ "user_id" => user.id,
+ "username" => user.username,
+ "timestamp" => current_timestamp,
+ "value" => 5000
+ }
+ ]
+ }
)
end
- it 'logs multiple attribute changes' do
- plan_limits.log_limits_changes(user, enforcement_limit: 10_000, notification_limit: 20_000)
+ it 'does not format limits_history for non-allowed attributes' do
+ formatted_limits_history = plan_limits.format_limits_history(user,
+ { enforcement_limit: 20_000, pipeline_hierarchy_size: 10_000 })
- expect(history).to eq(
- { 'enforcement_limit' => [{ 'user_id' => user.id, 'username' => user.username,
- 'timestamp' => current_timestamp, 'value' => 10_000 }],
- 'notification_limit' => [{ 'user_id' => user.id, 'username' => user.username,
- 'timestamp' => current_timestamp,
- 'value' => 20_000 }] }
- )
+ expect(formatted_limits_history).to eq({
+ "enforcement_limit" => [
+ {
+ "user_id" => user.id,
+ "username" => user.username,
+ "timestamp" => current_timestamp,
+ "value" => 20_000
+ }
+ ]
+ })
end
- it 'allows logging dashboard_limit_enabled_at from console (without user)' do
- plan_limits.log_limits_changes(nil, dashboard_limit_enabled_at: current_timestamp)
+ it 'does not format attributes for values that do not change' do
+ plan_limits.update!(enforcement_limit: 20_000)
+ formatted_limits_history = plan_limits.format_limits_history(user, enforcement_limit: 20_000)
- expect(history).to eq(
- { 'dashboard_limit_enabled_at' => [{ 'user_id' => nil, 'username' => nil, 'timestamp' => current_timestamp,
- 'value' => current_timestamp }] }
+ expect(formatted_limits_history).to eq({})
+ end
+
+ it 'formats multiple attribute changes' do
+ formatted_limits_history = plan_limits.format_limits_history(user, enforcement_limit: 10_000,
+ notification_limit: 20_000, dashboard_limit_enabled_at: current_timestamp)
+
+ expect(formatted_limits_history).to eq(
+ {
+ "notification_limit" => [
+ {
+ "user_id" => user.id,
+ "username" => user.username,
+ "timestamp" => current_timestamp,
+ "value" => 20000
+ }
+ ],
+ "enforcement_limit" => [
+ {
+ "user_id" => user.id,
+ "username" => user.username,
+ "timestamp" => current_timestamp,
+ "value" => 10000
+ }
+ ],
+ "dashboard_limit_enabled_at" => [
+ {
+ "user_id" => user.id,
+ "username" => user.username,
+ "timestamp" => current_timestamp,
+ "value" => current_timestamp
+ }
+ ]
+ }
)
end
- context 'with previous history avilable' do
+ context 'with previous history available' do
let(:plan_limits) do
- create(:plan_limits,
- limits_history: { 'enforcement_limit' => [{ user_id: user.id, username: user.username,
- timestamp: current_timestamp,
- value: 20_000 },
- { user_id: user.id, username: user.username, timestamp: current_timestamp,
- value: 50_000 }] })
+ create(
+ :plan_limits,
+ limits_history: {
+ 'enforcement_limit' => [
+ {
+ user_id: user.id,
+ username: user.username,
+ timestamp: current_timestamp,
+ value: 20_000
+ },
+ {
+ user_id: user.id,
+ username: user.username,
+ timestamp: current_timestamp,
+ value: 50_000
+ }
+ ]
+ }
+ )
end
it 'appends to it' do
- plan_limits.log_limits_changes(user, enforcement_limit: 60_000)
- expect(history).to eq(
+ formatted_limits_history = plan_limits.format_limits_history(user, enforcement_limit: 60_000)
+
+ expect(formatted_limits_history).to eq(
{
- 'enforcement_limit' => [
- { 'user_id' => user.id, 'username' => user.username, 'timestamp' => current_timestamp,
- 'value' => 20_000 },
- { 'user_id' => user.id, 'username' => user.username, 'timestamp' => current_timestamp,
- 'value' => 50_000 },
- { 'user_id' => user.id, 'username' => user.username, 'timestamp' => current_timestamp, 'value' => 60_000 }
+ "enforcement_limit" => [
+ {
+ "user_id" => user.id,
+ "username" => user.username,
+ "timestamp" => current_timestamp,
+ "value" => 20000
+ },
+ {
+ "user_id" => user.id,
+ "username" => user.username,
+ "timestamp" => current_timestamp,
+ "value" => 50000
+ },
+ {
+ "user_id" => user.id,
+ "username" => user.username,
+ "timestamp" => current_timestamp,
+ "value" => 60000
+ }
]
}
)
end
end
end
-
- describe '#limit_attribute_changes', :freeze_time do
- let(:user) { create(:user) }
- let(:current_timestamp) { Time.current.utc.to_i }
- let(:plan_limits) do
- create(:plan_limits,
- limits_history: { 'enforcement_limit' => [
- { user_id: user.id, username: user.username, timestamp: current_timestamp,
- value: 20_000 }, { user_id: user.id, username: user.username, timestamp: current_timestamp,
- value: 50_000 }
- ] })
- end
-
- it 'returns an empty array for attribute with no changes' do
- changes = plan_limits.limit_attribute_changes(:notification_limit)
-
- expect(changes).to eq([])
- end
-
- it 'returns the changes for a specific attribute' do
- changes = plan_limits.limit_attribute_changes(:enforcement_limit)
-
- expect(changes).to eq(
- [{ timestamp: current_timestamp, value: 20_000, username: user.username, user_id: user.id },
- { timestamp: current_timestamp, value: 50_000, username: user.username, user_id: user.id }]
- )
- end
- end
end
diff --git a/spec/models/postgresql/detached_partition_spec.rb b/spec/models/postgresql/detached_partition_spec.rb
index aaa99e842b4..d9e77b70368 100644
--- a/spec/models/postgresql/detached_partition_spec.rb
+++ b/spec/models/postgresql/detached_partition_spec.rb
@@ -4,15 +4,15 @@ require 'spec_helper'
RSpec.describe Postgresql::DetachedPartition do
describe '#ready_to_drop' do
- let_it_be(:drop_before) { Postgresql::DetachedPartition.create!(drop_after: 1.day.ago, table_name: 'old_table') }
- let_it_be(:drop_after) { Postgresql::DetachedPartition.create!(drop_after: 1.day.from_now, table_name: 'new_table') }
+ let_it_be(:drop_before) { described_class.create!(drop_after: 1.day.ago, table_name: 'old_table') }
+ let_it_be(:drop_after) { described_class.create!(drop_after: 1.day.from_now, table_name: 'new_table') }
it 'includes partitions that should be dropped before now' do
- expect(Postgresql::DetachedPartition.ready_to_drop.to_a).to include(drop_before)
+ expect(described_class.ready_to_drop.to_a).to include(drop_before)
end
it 'does not include partitions that should be dropped after now' do
- expect(Postgresql::DetachedPartition.ready_to_drop.to_a).not_to include(drop_after)
+ expect(described_class.ready_to_drop.to_a).not_to include(drop_after)
end
end
end
diff --git a/spec/models/preloaders/user_max_access_level_in_projects_preloader_spec.rb b/spec/models/preloaders/user_max_access_level_in_projects_preloader_spec.rb
index a2ab59f56ab..17db284c61e 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
@@ -32,7 +32,7 @@ RSpec.describe Preloaders::UserMaxAccessLevelInProjectsPreloader do
context 'when user is present' do
before do
- Preloaders::UserMaxAccessLevelInProjectsPreloader.new(projects_arg, user).execute
+ described_class.new(projects_arg, user).execute
end
it 'avoids N+1 queries' do
@@ -61,7 +61,7 @@ RSpec.describe Preloaders::UserMaxAccessLevelInProjectsPreloader do
context 'when user is not present' do
before do
- Preloaders::UserMaxAccessLevelInProjectsPreloader.new(projects_arg, nil).execute
+ described_class.new(projects_arg, nil).execute
end
it 'does not avoid N+1 queries' do
diff --git a/spec/models/project_label_spec.rb b/spec/models/project_label_spec.rb
index ba9ea759c6a..62839f5fb4f 100644
--- a/spec/models/project_label_spec.rb
+++ b/spec/models/project_label_spec.rb
@@ -107,14 +107,14 @@ RSpec.describe ProjectLabel do
context 'using name' do
it 'returns cross reference with label name' do
expect(label.to_reference(project, format: :name))
- .to eq %Q(#{label.project.full_path}~"#{label.name}")
+ .to eq %(#{label.project.full_path}~"#{label.name}")
end
end
context 'using id' do
it 'returns cross reference with label id' do
expect(label.to_reference(project, format: :id))
- .to eq %Q(#{label.project.full_path}~#{label.id})
+ .to eq %(#{label.project.full_path}~#{label.id})
end
end
end
diff --git a/spec/models/project_setting_spec.rb b/spec/models/project_setting_spec.rb
index 4b2760d7699..6928cc8ba08 100644
--- a/spec/models/project_setting_spec.rb
+++ b/spec/models/project_setting_spec.rb
@@ -27,8 +27,7 @@ RSpec.describe ProjectSetting, type: :model, feature_category: :groups_and_proje
it { is_expected.to validate_length_of(:issue_branch_template).is_at_most(255) }
it { is_expected.not_to allow_value(nil).for(:suggested_reviewers_enabled) }
- it { is_expected.to allow_value(true).for(:suggested_reviewers_enabled) }
- it { is_expected.to allow_value(false).for(:suggested_reviewers_enabled) }
+ it { is_expected.to allow_value(true, false).for(:suggested_reviewers_enabled) }
it 'allows any combination of the allowed target platforms' do
valid_target_platform_combinations.each do |target_platforms|
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index f44331521e9..044408e86e9 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -342,8 +342,8 @@ RSpec.describe Project, factory_default: :keep, feature_category: :groups_and_pr
context 'when same project is being updated in 2 instances' do
it 'syncs only changed attributes' do
- project1 = Project.last
- project2 = Project.last
+ project1 = described_class.last
+ project2 = described_class.last
project_name = project1.name
project_path = project1.path
@@ -2170,6 +2170,32 @@ RSpec.describe Project, factory_default: :keep, feature_category: :groups_and_pr
end
end
+ describe '.with_slack_integration' do
+ it 'returns projects with both active and inactive slack integrations' do
+ create(:project)
+ with_active_slack = create(:integrations_slack).project
+ with_disabled_slack = create(:integrations_slack, active: false).project
+
+ expect(described_class.with_slack_integration).to contain_exactly(
+ with_active_slack,
+ with_disabled_slack
+ )
+ end
+ end
+
+ describe '.with_slack_slash_commands_integration' do
+ it 'returns projects with both active and inactive slack slash commands integrations' do
+ create(:project)
+ with_active_slash_commands = create(:slack_slash_commands_integration).project
+ with_disabled_slash_commands = create(:slack_slash_commands_integration, active: false).project
+
+ expect(described_class.with_slack_slash_commands_integration).to contain_exactly(
+ with_active_slash_commands,
+ with_disabled_slash_commands
+ )
+ end
+ end
+
describe '.cached_count', :use_clean_rails_memory_store_caching do
let(:group) { create(:group, :public) }
let!(:project1) { create(:project, :public, group: group) }
@@ -2382,11 +2408,11 @@ RSpec.describe Project, factory_default: :keep, feature_category: :groups_and_pr
create(:service_desk_setting, project_key: 'key2')
create(:service_desk_setting)
- expect(Project.with_service_desk_key('key1')).to contain_exactly(project1, project2)
+ expect(described_class.with_service_desk_key('key1')).to contain_exactly(project1, project2)
end
it 'returns empty if there is no project with the key' do
- expect(Project.with_service_desk_key('key1')).to be_empty
+ expect(described_class.with_service_desk_key('key1')).to be_empty
end
end
@@ -2439,7 +2465,7 @@ RSpec.describe Project, factory_default: :keep, feature_category: :groups_and_pr
create(:jira_integration, project: project_3, inherit_from_id: nil)
create(:integrations_slack, project: project_4, inherit_from_id: nil)
- expect(Project.without_integration(instance_integration)).to contain_exactly(project_4)
+ expect(described_class.without_integration(instance_integration)).to contain_exactly(project_4)
end
end
@@ -2780,224 +2806,6 @@ RSpec.describe Project, factory_default: :keep, feature_category: :groups_and_pr
end
end
- describe '#pages_url', feature_category: :pages do
- let(:group_name) { 'group' }
- let(:project_name) { 'project' }
-
- let(:group) { create(:group, name: group_name) }
- let(:nested_group) { create(:group, parent: group) }
-
- let(:project_path) { project_name.downcase }
- let(:project) do
- create(
- :project,
- namespace: group,
- name: project_name,
- path: project_path)
- end
-
- let(:domain) { 'Example.com' }
- let(:port) { nil }
-
- subject { project.pages_url }
-
- before do
- allow(Settings.pages).to receive(:host).and_return(domain)
- allow(Gitlab.config.pages)
- .to receive(:url)
- .and_return(['http://example.com', port].compact.join(':'))
- end
-
- context 'when not using pages_unique_domain' do
- subject { project.pages_url(with_unique_domain: false) }
-
- context 'when pages_unique_domain feature flag is disabled' do
- before do
- stub_feature_flags(pages_unique_domain: false)
- end
-
- it { is_expected.to eq('http://group.example.com/project') }
- end
-
- context 'when pages_unique_domain feature flag is enabled' do
- before do
- stub_feature_flags(pages_unique_domain: true)
-
- project.project_setting.update!(
- pages_unique_domain_enabled: pages_unique_domain_enabled,
- pages_unique_domain: 'unique-domain'
- )
- end
-
- context 'when pages_unique_domain_enabled is false' do
- let(:pages_unique_domain_enabled) { false }
-
- it { is_expected.to eq('http://group.example.com/project') }
- end
-
- context 'when pages_unique_domain_enabled is true' do
- let(:pages_unique_domain_enabled) { true }
-
- it { is_expected.to eq('http://group.example.com/project') }
- end
- end
- end
-
- context 'when using pages_unique_domain' do
- subject { project.pages_url(with_unique_domain: true) }
-
- context 'when pages_unique_domain feature flag is disabled' do
- before do
- stub_feature_flags(pages_unique_domain: false)
- end
-
- it { is_expected.to eq('http://group.example.com/project') }
- end
-
- context 'when pages_unique_domain feature flag is enabled' do
- before do
- stub_feature_flags(pages_unique_domain: true)
-
- project.project_setting.update!(
- pages_unique_domain_enabled: pages_unique_domain_enabled,
- pages_unique_domain: 'unique-domain'
- )
- end
-
- context 'when pages_unique_domain_enabled is false' do
- let(:pages_unique_domain_enabled) { false }
-
- it { is_expected.to eq('http://group.example.com/project') }
- end
-
- context 'when pages_unique_domain_enabled is true' do
- let(:pages_unique_domain_enabled) { true }
-
- it { is_expected.to eq('http://unique-domain.example.com') }
- end
- end
- end
-
- context 'with nested group' do
- let(:project) { create(:project, namespace: nested_group, name: project_name) }
- let(:expected_url) { "http://group.example.com/#{nested_group.path}/#{project.path}" }
-
- context 'group page' do
- let(:project_name) { 'group.example.com' }
-
- it { is_expected.to eq(expected_url) }
- end
-
- context 'project page' do
- let(:project_name) { 'Project' }
-
- it { is_expected.to eq(expected_url) }
- end
- end
-
- context 'when the project matches its namespace url' do
- let(:project_name) { 'group.example.com' }
-
- it { is_expected.to eq('http://group.example.com') }
-
- context 'with different group name capitalization' do
- let(:group_name) { 'Group' }
-
- it { is_expected.to eq("http://group.example.com") }
- end
-
- context 'with different project path capitalization' do
- let(:project_path) { 'Group.example.com' }
-
- it { is_expected.to eq("http://group.example.com") }
- end
-
- context 'with different project name capitalization' do
- let(:project_name) { 'Project' }
-
- it { is_expected.to eq("http://group.example.com/project") }
- end
-
- context 'when there is an explicit port' do
- let(:port) { 3000 }
-
- context 'when not in dev mode' do
- before do
- stub_rails_env('production')
- end
-
- it { is_expected.to eq('http://group.example.com:3000/group.example.com') }
- end
-
- context 'when in dev mode' do
- before do
- stub_rails_env('development')
- end
-
- it { is_expected.to eq('http://group.example.com:3000') }
- end
- end
- end
- end
-
- describe '#pages_unique_url', feature_category: :pages do
- let(:project_settings) { create(:project_setting, pages_unique_domain: 'unique-domain') }
- let(:project) { build(:project, project_setting: project_settings) }
- let(:domain) { 'example.com' }
-
- before do
- allow(Settings.pages).to receive(:host).and_return(domain)
- allow(Gitlab.config.pages).to receive(:url).and_return("http://#{domain}")
- end
-
- it 'returns the pages unique url' do
- expect(project.pages_unique_url).to eq('http://unique-domain.example.com')
- end
- end
-
- describe '#pages_unique_host', feature_category: :pages do
- let(:project_settings) { create(:project_setting, pages_unique_domain: 'unique-domain') }
- let(:project) { build(:project, project_setting: project_settings) }
- let(:domain) { 'example.com' }
-
- before do
- allow(Settings.pages).to receive(:host).and_return(domain)
- allow(Gitlab.config.pages).to receive(:url).and_return("http://#{domain}")
- end
-
- it 'returns the pages unique url' do
- expect(project.pages_unique_host).to eq('unique-domain.example.com')
- end
- end
-
- describe '#pages_namespace_url', feature_category: :pages do
- let(:group) { create(:group, name: group_name) }
- let(:project) { create(:project, namespace: group, name: project_name) }
- let(:domain) { 'Example.com' }
- let(:port) { 1234 }
-
- subject { project.pages_namespace_url }
-
- before do
- allow(Settings.pages).to receive(:host).and_return(domain)
- allow(Gitlab.config.pages).to receive(:url).and_return("http://example.com:#{port}")
- end
-
- context 'group page' do
- let(:group_name) { 'Group' }
- let(:project_name) { 'group.example.com' }
-
- it { is_expected.to eq("http://group.example.com:#{port}") }
- end
-
- context 'project page' do
- let(:group_name) { 'Group' }
- let(:project_name) { 'Project' }
-
- it { is_expected.to eq("http://group.example.com:#{port}") }
- end
- end
-
describe '.search' do
let_it_be(:project) { create(:project, description: 'kitten mittens') }
@@ -6311,6 +6119,36 @@ RSpec.describe Project, factory_default: :keep, feature_category: :groups_and_pr
expect(recorder.count).to be_zero
end
+
+ context 'with a CI integration' do
+ let!(:ci_integration) do
+ create(:jenkins_integration, push_events: true, active: true, project: integration.project)
+ end
+
+ it 'executes the integrations' do
+ [Integrations::Jenkins, Integrations::Slack].each do |integration_type|
+ expect_next_found_instance_of(integration_type) do |instance|
+ expect(instance).to receive(:async_execute).with('data').once
+ end
+ end
+
+ integration.project.execute_integrations('data', :push_hooks)
+ end
+
+ context 'and skipping ci' do
+ it 'does not execute ci integrations' do
+ expect_next_found_instance_of(Integrations::Jenkins) do |instance|
+ expect(instance).not_to receive(:async_execute)
+ end
+
+ expect_next_found_instance_of(Integrations::Slack) do |instance|
+ expect(instance).to receive(:async_execute).with('data').once
+ end
+
+ integration.project.execute_integrations('data', :push_hooks, skip_ci: true)
+ end
+ end
+ end
end
describe '#has_active_hooks?' do
@@ -6338,6 +6176,14 @@ RSpec.describe Project, factory_default: :keep, feature_category: :groups_and_pr
expect(project.has_active_hooks?(:merge_request_hooks)).to eq(true)
expect(project.has_active_hooks?).to eq(true)
end
+
+ context 'with :emoji_hooks scope' do
+ it 'returns true when a matching emoji hook exists' do
+ create(:project_hook, emoji_events: true, project: project)
+
+ expect(project.has_active_hooks?(:emoji_hooks)).to eq(true)
+ end
+ end
end
describe '#has_active_integrations?' do
@@ -6576,7 +6422,8 @@ RSpec.describe Project, factory_default: :keep, feature_category: :groups_and_pr
it 'does not allow access to branches for which the merge request was closed' do
create(
- :merge_request, :closed,
+ :merge_request,
+ :closed,
target_project: target_project,
target_branch: 'target-branch',
source_project: project,
@@ -7542,7 +7389,7 @@ RSpec.describe Project, factory_default: :keep, feature_category: :groups_and_pr
describe 'with_issues_or_mrs_available_for_user' do
before do
- Project.delete_all
+ described_class.delete_all
end
it 'returns correct projects' do
@@ -9028,6 +8875,67 @@ RSpec.describe Project, factory_default: :keep, feature_category: :groups_and_pr
end
end
+ describe '.without_created_and_owned_by_banned_user' do
+ let_it_be(:other_project) { create(:project) }
+
+ subject(:results) { described_class.without_created_and_owned_by_banned_user }
+
+ context 'when project creator is not banned' do
+ let_it_be(:project_of_active_user) { create(:project, creator: create(:user)) }
+
+ it 'includes the project' do
+ expect(results).to match_array([other_project, project_of_active_user])
+ end
+ end
+
+ context 'when project creator is banned' do
+ let_it_be(:banned_user) { create(:user, :banned) }
+ let_it_be(:project_of_banned_user) { create(:project, creator: banned_user) }
+
+ context 'when project creator is also an owner' do
+ let_it_be(:project_auth) do
+ project = project_of_banned_user
+ create(:project_authorization, :owner, user: project.creator, project: project)
+ end
+
+ it 'excludes the project' do
+ expect(results).to match_array([other_project])
+ end
+ end
+
+ context 'when project creator is not an owner' do
+ it 'includes the project' do
+ expect(results).to match_array([other_project, project_of_banned_user])
+ end
+ end
+ end
+ end
+
+ describe '#created_and_owned_by_banned_user?' do
+ subject { project.created_and_owned_by_banned_user? }
+
+ context 'when creator is banned' do
+ let_it_be(:creator) { create(:user, :banned) }
+ let_it_be(:project) { create(:project, creator: creator) }
+
+ it { is_expected.to eq false }
+
+ context 'when creator is an owner' do
+ let_it_be(:project_auth) do
+ create(:project_authorization, :owner, user: project.creator, project: project)
+ end
+
+ it { is_expected.to eq true }
+ end
+ end
+
+ context 'when creator is not banned' do
+ let_it_be(:project) { create(:project) }
+
+ it { is_expected.to eq false }
+ end
+ end
+
it_behaves_like 'something that has web-hooks' do
let_it_be_with_reload(:object) { create(:project) }
@@ -9081,7 +8989,9 @@ RSpec.describe Project, factory_default: :keep, feature_category: :groups_and_pr
def create_build(new_pipeline = pipeline, name = 'test')
create(
- :ci_build, :success, :artifacts,
+ :ci_build,
+ :success,
+ :artifacts,
pipeline: new_pipeline,
status: new_pipeline.status,
name: name
diff --git a/spec/models/project_statistics_spec.rb b/spec/models/project_statistics_spec.rb
index a24903f8b4e..71c205fca7c 100644
--- a/spec/models/project_statistics_spec.rb
+++ b/spec/models/project_statistics_spec.rb
@@ -360,7 +360,6 @@ RSpec.describe ProjectStatistics do
wiki_size: 4,
lfs_objects_size: 3,
snippets_size: 2,
- pipeline_artifacts_size: 3,
build_artifacts_size: 3,
packages_size: 6,
uploads_size: 5
@@ -368,7 +367,7 @@ RSpec.describe ProjectStatistics do
statistics.reload
- expect(statistics.storage_size).to eq 28
+ expect(statistics.storage_size).to eq 25
end
it 'excludes the container_registry_size' do
@@ -383,6 +382,18 @@ RSpec.describe ProjectStatistics do
expect(statistics.storage_size).to eq 7
end
+ it 'excludes the pipeline_artifacts_size' do
+ statistics.update!(
+ repository_size: 2,
+ uploads_size: 5,
+ pipeline_artifacts_size: 10
+ )
+
+ statistics.reload
+
+ expect(statistics.storage_size).to eq 7
+ end
+
it 'works during wiki_size backfill' do
statistics.update!(
repository_size: 2,
@@ -428,7 +439,7 @@ RSpec.describe ProjectStatistics do
storage_size: 0
)
- expect { refresh_storage_size }.to change { statistics.reload.storage_size }.from(0).to(28)
+ expect { refresh_storage_size }.to change { statistics.reload.storage_size }.from(0).to(25)
end
context 'when nullable columns are nil' do
@@ -464,10 +475,9 @@ RSpec.describe ProjectStatistics do
.by(increment.amount)
end
- it 'increases also storage size by that amount' do
+ it 'does not increase the storage size by that amount' do
expect { described_class.increment_statistic(project, stat, increment) }
- .to change { statistics.reload.storage_size }
- .by(increment.amount)
+ .not_to change { statistics.reload.storage_size }
end
it 'schedules a namespace aggregation worker' do
@@ -572,10 +582,9 @@ RSpec.describe ProjectStatistics do
.by(total_amount)
end
- it 'increases also storage size by that amount' do
+ it 'does not increase the storage size by that amount' do
expect { described_class.bulk_increment_statistic(project, stat, increments) }
- .to change { statistics.reload.storage_size }
- .by(total_amount)
+ .not_to change { statistics.reload.storage_size }
end
it 'schedules a namespace aggregation worker' do
diff --git a/spec/models/projects/topic_spec.rb b/spec/models/projects/topic_spec.rb
index d0bda6f51a1..568a4166de7 100644
--- a/spec/models/projects/topic_spec.rb
+++ b/spec/models/projects/topic_spec.rb
@@ -27,8 +27,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) }
+ it { expect(described_class.new).to validate_presence_of(:title) }
+ it { expect(described_class.new).to validate_length_of(:title).is_at_most(255) }
it { is_expected.not_to allow_value("new\nline").for(:name).with_message(name_format_message) }
it { is_expected.not_to allow_value("new\rline").for(:name).with_message(name_format_message) }
it { is_expected.not_to allow_value("new\vline").for(:name).with_message(name_format_message) }
diff --git a/spec/models/projects/triggered_hooks_spec.rb b/spec/models/projects/triggered_hooks_spec.rb
index 3c885bdac8e..581ccb500e2 100644
--- a/spec/models/projects/triggered_hooks_spec.rb
+++ b/spec/models/projects/triggered_hooks_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Projects::TriggeredHooks do
+RSpec.describe Projects::TriggeredHooks, feature_category: :webhooks do
let_it_be(:project) { create(:project) }
let_it_be(:universal_push_hook) { create(:project_hook, project: project, push_events: true) }
@@ -10,6 +10,7 @@ RSpec.describe Projects::TriggeredHooks do
let_it_be(:issues_hook) { create(:project_hook, project: project, issues_events: true, push_events: false) }
let(:wh_service) { instance_double(::WebHookService, async_execute: true) }
+ let(:data) { { some: 'data', as: 'json' } }
def run_hooks(scope, data)
hooks = described_class.new(scope, data)
@@ -18,8 +19,6 @@ RSpec.describe Projects::TriggeredHooks do
end
it 'executes hooks by scope' do
- data = { some: 'data', as: 'json' }
-
expect_hook_execution(issues_hook, data, 'issue_hooks')
run_hooks(:issue_hooks, data)
@@ -42,6 +41,40 @@ RSpec.describe Projects::TriggeredHooks do
run_hooks(:push_hooks, data)
end
+ context 'with emoji hooks' do
+ let_it_be(:emoji_hook) { create(:project_hook, project: project, emoji_events: true) }
+
+ it 'executes hook' do
+ expect_hook_execution(emoji_hook, data, 'emoji_hooks')
+
+ run_hooks(:emoji_hooks, data)
+ end
+
+ context 'when emoji_webhooks feature flag is disabled' do
+ before do
+ stub_feature_flags(emoji_webhooks: false)
+ end
+
+ it 'does not execute the hook' do
+ expect(WebHookService).not_to receive(:new)
+
+ run_hooks(:emoji_hooks, data)
+ end
+ end
+
+ context 'when emoji_webhooks feature flag is enabled for the project' do
+ before do
+ stub_feature_flags(emoji_webhooks: emoji_hook.project)
+ end
+
+ it 'executes the hook' do
+ expect_hook_execution(emoji_hook, data, 'emoji_hooks')
+
+ run_hooks(:emoji_hooks, data)
+ end
+ end
+ end
+
def expect_hook_execution(hook, data, scope)
expect(WebHookService).to receive(:new).with(hook, data, scope).and_return(wh_service)
end
diff --git a/spec/models/protected_branch/push_access_level_spec.rb b/spec/models/protected_branch/push_access_level_spec.rb
index e56ff2241b1..05e10fd6763 100644
--- a/spec/models/protected_branch/push_access_level_spec.rb
+++ b/spec/models/protected_branch/push_access_level_spec.rb
@@ -4,81 +4,6 @@ require 'spec_helper'
RSpec.describe ProtectedBranch::PushAccessLevel, feature_category: :source_code_management do
include_examples 'protected branch access'
+ include_examples 'protected ref deploy_key access'
include_examples 'protected ref access allowed_access_levels'
-
- describe 'associations' do
- it { is_expected.to belong_to(:deploy_key) }
- end
-
- describe 'validations' do
- it 'is not valid when a record exists with the same access level' do
- protected_branch = create(:protected_branch)
- create(:protected_branch_push_access_level, protected_branch: protected_branch)
- level = build(:protected_branch_push_access_level, protected_branch: protected_branch)
-
- expect(level).to be_invalid
- end
-
- it 'is not valid when a record exists with the same access level' do
- protected_branch = create(:protected_branch)
- deploy_key = create(:deploy_key, projects: [protected_branch.project])
- create(:protected_branch_push_access_level, protected_branch: protected_branch, deploy_key: deploy_key)
- level = build(:protected_branch_push_access_level, protected_branch: protected_branch, deploy_key: deploy_key)
-
- expect(level).to be_invalid
- end
-
- 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(ActiveRecord::RecordInvalid)
- expect(level.errors.full_messages).to contain_exactly('Deploy key is not enabled for this project')
- end
- end
-
- describe '#check_access' do
- let_it_be(:project) { create(:project) }
- let_it_be(:protected_branch) { create(:protected_branch, :no_one_can_push, project: project) }
- let_it_be(:user) { create(:user) }
- let_it_be(:deploy_key) { create(:deploy_key, user: user) }
-
- let!(:deploy_keys_project) { create(:deploy_keys_project, project: project, deploy_key: deploy_key, can_push: can_push) }
- let(:can_push) { true }
-
- before_all do
- project.add_maintainer(user)
- end
-
- context 'when this push_access_level is tied to a deploy key' do
- let(:push_access_level) { create(:protected_branch_push_access_level, protected_branch: protected_branch, deploy_key: deploy_key) }
-
- context 'when the deploy key is among the active keys for this project' do
- specify do
- expect(push_access_level.check_access(user)).to be_truthy
- end
- end
-
- context 'when the deploy key is not among the active keys of this project' do
- let(:can_push) { false }
-
- it 'is false' do
- expect(push_access_level.check_access(user)).to be_falsey
- end
- end
- end
- end
-
- describe '#type' do
- let(:push_level_access) { build(:protected_branch_push_access_level) }
-
- it 'returns :deploy_key when a deploy key is tied to the protected branch' do
- push_level_access.deploy_key = create(:deploy_key)
-
- expect(push_level_access.type).to eq(:deploy_key)
- end
-
- it 'returns :role by default' do
- expect(push_level_access.type).to eq(:role)
- end
- end
end
diff --git a/spec/models/protected_tag/create_access_level_spec.rb b/spec/models/protected_tag/create_access_level_spec.rb
index 8eeccdc9b34..d795399060e 100644
--- a/spec/models/protected_tag/create_access_level_spec.rb
+++ b/spec/models/protected_tag/create_access_level_spec.rb
@@ -4,134 +4,6 @@ require 'spec_helper'
RSpec.describe ProtectedTag::CreateAccessLevel, feature_category: :source_code_management do
include_examples 'protected tag access'
+ include_examples 'protected ref deploy_key access'
include_examples 'protected ref access allowed_access_levels'
-
- describe 'associations' do
- it { is_expected.to belong_to(:deploy_key) }
- end
-
- describe 'validations', :aggregate_failures do
- let_it_be(:protected_tag) { create(:protected_tag) }
-
- context 'when deploy key enabled for the project' do
- let(:deploy_key) { create(:deploy_key, projects: [protected_tag.project]) }
-
- it 'is valid' do
- level = build(:protected_tag_create_access_level, protected_tag: protected_tag, deploy_key: deploy_key)
-
- expect(level).to be_valid
- end
- end
-
- context 'when a record exists with the same access level' do
- before do
- create(:protected_tag_create_access_level, protected_tag: protected_tag)
- end
-
- it 'is not valid' do
- level = build(:protected_tag_create_access_level, protected_tag: protected_tag)
-
- expect(level).to be_invalid
- expect(level.errors.full_messages).to include('Access level has already been taken')
- end
- end
-
- context 'when a deploy key already added for this access level' do
- let!(:create_access_level) do
- create(:protected_tag_create_access_level, protected_tag: protected_tag, deploy_key: deploy_key)
- end
-
- let(:deploy_key) { create(:deploy_key, projects: [protected_tag.project]) }
-
- it 'is not valid' do
- level = build(:protected_tag_create_access_level, protected_tag: protected_tag, deploy_key: deploy_key)
-
- expect(level).to be_invalid
- expect(level.errors.full_messages).to contain_exactly('Deploy key has already been taken')
- end
- end
-
- context 'when deploy key is not enabled for the project' do
- let(:create_access_level) do
- build(:protected_tag_create_access_level, protected_tag: protected_tag, deploy_key: create(:deploy_key))
- end
-
- it 'returns an error' do
- expect(create_access_level).to be_invalid
- expect(create_access_level.errors.full_messages).to contain_exactly(
- 'Deploy key is not enabled for this project'
- )
- end
- end
- end
-
- describe '#check_access' do
- let_it_be(:project) { create(:project) }
- let_it_be(:protected_tag) { create(:protected_tag, :no_one_can_create, project: project) }
- let_it_be(:user) { create(:user) }
- let_it_be(:deploy_key) { create(:deploy_key, user: user) }
-
- let!(:deploy_keys_project) do
- create(:deploy_keys_project, project: project, deploy_key: deploy_key, can_push: can_push)
- end
-
- let(:create_access_level) { protected_tag.create_access_levels.first }
- let(:can_push) { true }
-
- before_all do
- project.add_maintainer(user)
- end
-
- it { expect(create_access_level.check_access(user)).to be_falsey }
-
- context 'when this create_access_level is tied to a deploy key' do
- let(:create_access_level) do
- create(:protected_tag_create_access_level, protected_tag: protected_tag, deploy_key: deploy_key)
- end
-
- context 'when the deploy key is among the active keys for this project' do
- it { expect(create_access_level.check_access(user)).to be_truthy }
- end
-
- context 'when user is missing' do
- it { expect(create_access_level.check_access(nil)).to be_falsey }
- end
-
- context 'when deploy key does not belong to the user' do
- let(:another_user) { create(:user) }
-
- it { expect(create_access_level.check_access(another_user)).to be_falsey }
- end
-
- context 'when user cannot access the project' do
- before do
- allow(user).to receive(:can?).with(:read_project, project).and_return(false)
- end
-
- it { expect(create_access_level.check_access(user)).to be_falsey }
- end
-
- context 'when the deploy key is not among the active keys of this project' do
- let(:can_push) { false }
-
- it { expect(create_access_level.check_access(user)).to be_falsey }
- end
- end
- end
-
- describe '#type' do
- let(:create_access_level) { build(:protected_tag_create_access_level) }
-
- it 'returns :role by default' do
- expect(create_access_level.type).to eq(:role)
- end
-
- context 'when a deploy key is tied to the protected branch' do
- let(:create_access_level) { build(:protected_tag_create_access_level, deploy_key: build(:deploy_key)) }
-
- it 'returns :deploy_key' do
- expect(create_access_level.type).to eq(:deploy_key)
- end
- end
- end
end
diff --git a/spec/models/release_highlight_spec.rb b/spec/models/release_highlight_spec.rb
index 50a607040b6..6369f0e5c26 100644
--- a/spec/models/release_highlight_spec.rb
+++ b/spec/models/release_highlight_spec.rb
@@ -12,12 +12,12 @@ RSpec.describe ReleaseHighlight, :clean_gitlab_redis_cache, feature_category: :r
end
after do
- ReleaseHighlight.instance_variable_set(:@file_paths, nil)
+ described_class.instance_variable_set(:@file_paths, nil)
end
describe '.paginated_query' do
context 'with page param' do
- subject { ReleaseHighlight.paginated_query(page: page) }
+ subject { described_class.paginated_query(page: page) }
context 'when there is another page of results' do
let(:page) { 3 }
@@ -49,7 +49,7 @@ RSpec.describe ReleaseHighlight, :clean_gitlab_redis_cache, feature_category: :r
describe '.paginated' do
context 'with no page param' do
- subject { ReleaseHighlight.paginated }
+ subject { described_class.paginated }
it 'uses multiple levels of cache' do
expect(Rails.cache).to receive(:fetch).with("release_highlight:all_tiers:items:page-1:#{Gitlab.revision}", { expires_in: described_class::CACHE_DURATION }).and_call_original
@@ -100,7 +100,7 @@ RSpec.describe ReleaseHighlight, :clean_gitlab_redis_cache, feature_category: :r
end
describe '.most_recent_item_count' do
- subject { ReleaseHighlight.most_recent_item_count }
+ subject { described_class.most_recent_item_count }
it 'uses process memory cache' do
expect(Gitlab::ProcessMemoryCache.cache_backend).to receive(:fetch).with("release_highlight:all_tiers:recent_item_count:#{Gitlab.revision}", expires_in: described_class::CACHE_DURATION)
@@ -110,7 +110,7 @@ RSpec.describe ReleaseHighlight, :clean_gitlab_redis_cache, feature_category: :r
context 'when recent release items exist' do
it 'returns the count from the most recent file' do
- allow(ReleaseHighlight).to receive(:paginated).and_return(double(:paginated, items: [double(:item)]))
+ allow(described_class).to receive(:paginated).and_return(double(:paginated, items: [double(:item)]))
expect(subject).to eq(1)
end
@@ -118,7 +118,7 @@ RSpec.describe ReleaseHighlight, :clean_gitlab_redis_cache, feature_category: :r
context 'when recent release items do NOT exist' do
it 'returns nil' do
- allow(ReleaseHighlight).to receive(:paginated).and_return(nil)
+ allow(described_class).to receive(:paginated).and_return(nil)
expect(subject).to be_nil
end
@@ -126,7 +126,7 @@ RSpec.describe ReleaseHighlight, :clean_gitlab_redis_cache, feature_category: :r
end
describe '.most_recent_version_digest' do
- subject { ReleaseHighlight.most_recent_version_digest }
+ subject { described_class.most_recent_version_digest }
it 'uses process memory cache' do
expect(Gitlab::ProcessMemoryCache.cache_backend).to receive(:fetch).with("release_highlight:all_tiers:most_recent_version_digest:#{Gitlab.revision}", expires_in: described_class::CACHE_DURATION)
@@ -143,7 +143,7 @@ RSpec.describe ReleaseHighlight, :clean_gitlab_redis_cache, feature_category: :r
context 'when recent release items do NOT exist' do
it 'returns nil' do
- allow(ReleaseHighlight).to receive(:paginated).and_return(nil)
+ allow(described_class).to receive(:paginated).and_return(nil)
expect(subject).to be_nil
end
diff --git a/spec/models/release_spec.rb b/spec/models/release_spec.rb
index bddd0516400..446ef4180d2 100644
--- a/spec/models/release_spec.rb
+++ b/spec/models/release_spec.rb
@@ -174,7 +174,7 @@ RSpec.describe Release, feature_category: :release_orchestration do
end
describe '#assets_count' do
- subject { Release.find(release.id).assets_count }
+ subject { described_class.find(release.id).assets_count }
it 'returns the number of sources' do
is_expected.to eq(Gitlab::Workhorse::ARCHIVE_FORMATS.count)
@@ -188,7 +188,7 @@ RSpec.describe Release, feature_category: :release_orchestration do
end
it "excludes sources count when asked" do
- assets_count = Release.find(release.id).assets_count(except: [:sources])
+ assets_count = described_class.find(release.id).assets_count(except: [:sources])
expect(assets_count).to eq(1)
end
end
diff --git a/spec/models/remote_mirror_spec.rb b/spec/models/remote_mirror_spec.rb
index 382718620f5..537fdbc7c8f 100644
--- a/spec/models/remote_mirror_spec.rb
+++ b/spec/models/remote_mirror_spec.rb
@@ -289,6 +289,14 @@ RSpec.describe RemoteMirror, :mailer do
end
end
+ context 'with silent mode enabled' do
+ it 'returns nil' do
+ allow(Gitlab::SilentMode).to receive(:enabled?).and_return(true)
+
+ expect(remote_mirror.sync).to be_nil
+ end
+ end
+
context 'with remote mirroring enabled' do
it 'defaults to disabling only protected branches' do
expect(remote_mirror.only_protected_branches?).to be_falsey
diff --git a/spec/models/route_spec.rb b/spec/models/route_spec.rb
index 929eaca85f7..0bdaa4994e5 100644
--- a/spec/models/route_spec.rb
+++ b/spec/models/route_spec.rb
@@ -281,14 +281,14 @@ RSpec.describe Route do
it 'does not delete the original route' do
# before deleting the route, check its there
- expect(Route.where(path: offending_route.path).count).to eq(1)
+ expect(described_class.where(path: offending_route.path).count).to eq(1)
expect do
Group.delete(conflicting_group) # delete group with conflicting route
end.to change { described_class.count }.by(-1)
# check the conflicting route is gone
- expect(Route.where(path: offending_route.path).count).to eq(0)
+ expect(described_class.where(path: offending_route.path).count).to eq(0)
expect(route.path).to eq(offending_route.path)
expect(route.valid?).to be_truthy
end
diff --git a/spec/models/service_desk_setting_spec.rb b/spec/models/service_desk_setting_spec.rb
index b9679b82bd0..34165fc2bf3 100644
--- a/spec/models/service_desk_setting_spec.rb
+++ b/spec/models/service_desk_setting_spec.rb
@@ -3,12 +3,9 @@
require 'spec_helper'
RSpec.describe ServiceDeskSetting, feature_category: :service_desk do
- let(:verification) { build(:service_desk_custom_email_verification) }
- let(:project) { build(:project) }
+ subject(:setting) { build(:service_desk_setting) }
describe 'validations' do
- subject(:service_desk_setting) { create(:service_desk_setting) }
-
it { is_expected.to validate_presence_of(:project_id) }
it { is_expected.to validate_length_of(:outgoing_name).is_at_most(255) }
it { is_expected.to validate_length_of(:project_key).is_at_most(255) }
@@ -18,14 +15,56 @@ RSpec.describe ServiceDeskSetting, feature_category: :service_desk do
it { is_expected.to validate_length_of(:custom_email).is_at_most(255) }
describe '#custom_email_enabled' do
- it { expect(subject.custom_email_enabled).to be_falsey }
+ it { expect(setting.custom_email_enabled).to be_falsey }
it { expect(described_class.new(custom_email_enabled: true).custom_email_enabled).to be_truthy }
+
+ context 'when set to true' do
+ let(:expected_error_part) { 'cannot be enabled until verification process has finished.' }
+
+ before do
+ setting.custom_email = 'user@example.com'
+ setting.custom_email_enabled = true
+ end
+
+ it 'is not valid' do
+ is_expected.not_to be_valid
+ expect(setting.errors[:custom_email_enabled].join).to include(expected_error_part)
+ end
+
+ context 'when custom email records exist' do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:credential) { create(:service_desk_custom_email_credential, project: project) }
+
+ let!(:verification) { create(:service_desk_custom_email_verification, project: project) }
+
+ subject(:setting) { build_stubbed(:service_desk_setting, project: project) }
+
+ before do
+ project.reset
+ end
+
+ context 'when custom email verification started' do
+ it 'is not valid' do
+ is_expected.not_to be_valid
+ expect(setting.errors[:custom_email_enabled].join).to include(expected_error_part)
+ end
+ end
+
+ context 'when custom email verification has been finished' do
+ before do
+ verification.mark_as_finished!
+ end
+
+ it { is_expected.to be_valid }
+ end
+ end
+ end
end
context 'when custom_email_enabled is true' do
before do
# Test without ServiceDesk::CustomEmailVerification for simplicity
- subject.custom_email_enabled = true
+ setting.custom_email_enabled = true
end
it { is_expected.to validate_presence_of(:custom_email) }
@@ -66,13 +105,13 @@ RSpec.describe ServiceDeskSetting, feature_category: :service_desk do
describe '#custom_email_address_for_verification' do
it 'returns nil' do
- expect(subject.custom_email_address_for_verification).to be_nil
+ expect(setting.custom_email_address_for_verification).to be_nil
end
context 'when custom_email exists' do
it 'returns correct verification address' do
- subject.custom_email = 'support@example.com'
- expect(subject.custom_email_address_for_verification).to eq('support+verify@example.com')
+ setting.custom_email = 'support@example.com'
+ expect(setting.custom_email_address_for_verification).to eq('support+verify@example.com')
end
end
end
@@ -114,6 +153,8 @@ RSpec.describe ServiceDeskSetting, feature_category: :service_desk do
end
describe 'associations' do
+ let(:project) { build(:project) }
+ let(:verification) { build(:service_desk_custom_email_verification) }
let(:custom_email_settings) do
build_stubbed(
:service_desk_setting,
diff --git a/spec/models/todo_spec.rb b/spec/models/todo_spec.rb
index 8669db4af16..2d6a674d3ce 100644
--- a/spec/models/todo_spec.rb
+++ b/spec/models/todo_spec.rb
@@ -446,7 +446,7 @@ RSpec.describe Todo do
end
specify do
- expect(Todo.count_grouped_by_user_id_and_state).to eq({ [user1.id, "done"] => 1, [user1.id, "pending"] => 2, [user2.id, "pending"] => 1 })
+ expect(described_class.count_grouped_by_user_id_and_state).to eq({ [user1.id, "done"] => 1, [user1.id, "pending"] => 2, [user2.id, "pending"] => 1 })
end
end
diff --git a/spec/models/user_custom_attribute_spec.rb b/spec/models/user_custom_attribute_spec.rb
index 934956926f0..7d3806fcdfa 100644
--- a/spec/models/user_custom_attribute_spec.rb
+++ b/spec/models/user_custom_attribute_spec.rb
@@ -22,19 +22,19 @@ RSpec.describe UserCustomAttribute, feature_category: :user_profile do
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) }
+ subject { described_class.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) }
+ subject { described_class.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') }
+ subject { described_class.by_key('blocked_at') }
it { is_expected.to match_array([custom_attribute]) }
end
@@ -44,7 +44,7 @@ RSpec.describe UserCustomAttribute, feature_category: :user_profile do
let_it_be(:user) { create(:user) }
let(:abuse_report) { create(:abuse_report, user: user) }
- subject { UserCustomAttribute.set_banned_by_abuse_report(abuse_report) }
+ subject { described_class.set_banned_by_abuse_report(abuse_report) }
it 'adds the abuse report ID to user custom attributes' do
subject
@@ -66,7 +66,7 @@ RSpec.describe UserCustomAttribute, feature_category: :user_profile do
end
describe '#upsert_custom_attributes' do
- subject { UserCustomAttribute.upsert_custom_attributes(custom_attributes) }
+ subject { described_class.upsert_custom_attributes(custom_attributes) }
let_it_be_with_reload(:user) { create(:user) }
diff --git a/spec/models/user_preference_spec.rb b/spec/models/user_preference_spec.rb
index 17899012aaa..729635b5a27 100644
--- a/spec/models/user_preference_spec.rb
+++ b/spec/models/user_preference_spec.rb
@@ -49,8 +49,7 @@ RSpec.describe UserPreference, feature_category: :user_profile do
end
describe 'pass_user_identities_to_ci_jwt' do
- it { is_expected.to allow_value(true).for(:pass_user_identities_to_ci_jwt) }
- it { is_expected.to allow_value(false).for(:pass_user_identities_to_ci_jwt) }
+ it { is_expected.to allow_value(true, false).for(:pass_user_identities_to_ci_jwt) }
it { is_expected.not_to allow_value(nil).for(:pass_user_identities_to_ci_jwt) }
it { is_expected.not_to allow_value("").for(:pass_user_identities_to_ci_jwt) }
end
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index 690c0be3b7a..059cbac638b 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -137,6 +137,7 @@ RSpec.describe User, feature_category: :user_profile do
it { is_expected.to have_one(:banned_user) }
it { is_expected.to have_many(:snippets).dependent(:destroy) }
it { is_expected.to have_many(:members) }
+ it { is_expected.to have_many(:member_namespaces) }
it { is_expected.to have_many(:project_members) }
it { is_expected.to have_many(:group_members) }
it { is_expected.to have_many(:groups) }
@@ -186,6 +187,15 @@ RSpec.describe User, feature_category: :user_profile do
it { is_expected.to have_many(:merge_request_assignment_events).class_name('ResourceEvents::MergeRequestAssignmentEvent') }
it do
+ is_expected.to have_many(:organization_users).class_name('Organizations::OrganizationUser').inverse_of(:user)
+ end
+
+ it do
+ is_expected.to have_many(:organizations)
+ .through(:organization_users).class_name('Organizations::Organization').inverse_of(:users)
+ end
+
+ it do
is_expected.to have_many(:alert_assignees).class_name('::AlertManagement::AlertAssignee').inverse_of(:assignee)
end
@@ -358,13 +368,13 @@ RSpec.describe User, feature_category: :user_profile do
context 'when password is updated' do
context 'default behaviour' do
it 'enqueues the `password changed` email' do
- user.password = User.random_password
+ user.password = described_class.random_password
expect { user.save! }.to have_enqueued_mail(DeviseMailer, :password_change)
end
it 'does not enqueue the `admin changed your password` email' do
- user.password = User.random_password
+ user.password = described_class.random_password
expect { user.save! }.not_to have_enqueued_mail(DeviseMailer, :password_change_by_admin)
end
@@ -372,21 +382,21 @@ RSpec.describe User, feature_category: :user_profile do
context '`admin changed your password` email' do
it 'is enqueued only when explicitly allowed' do
- user.password = User.random_password
+ user.password = described_class.random_password
user.send_only_admin_changed_your_password_notification!
expect { user.save! }.to have_enqueued_mail(DeviseMailer, :password_change_by_admin)
end
it '`password changed` email is not enqueued if it is explicitly allowed' do
- user.password = User.random_password
+ user.password = described_class.random_password
user.send_only_admin_changed_your_password_notification!
expect { user.save! }.not_to have_enqueued_mail(DeviseMailer, :password_changed)
end
it 'is not enqueued if sending notifications on password updates is turned off as per Devise config' do
- user.password = User.random_password
+ user.password = described_class.random_password
user.send_only_admin_changed_your_password_notification!
allow(Devise).to receive(:send_password_change_notification).and_return(false)
@@ -412,7 +422,7 @@ RSpec.describe User, feature_category: :user_profile do
context 'when email is changed to another before performing the job that sends confirmation instructions for previous email change request' do
it "mentions the recipient's email in the message body", :aggregate_failures do
- same_user = User.find(user.id)
+ same_user = described_class.find(user.id)
same_user.update!(email: unconfirmed_email)
user.update!(email: another_unconfirmed_email)
@@ -537,7 +547,7 @@ RSpec.describe User, feature_category: :user_profile do
end
it 'does not check if the user is a new record' do
- user = User.new(username: 'newuser')
+ user = described_class.new(username: 'newuser')
expect(user.new_record?).to eq(true)
expect(user).not_to receive(:namespace_move_dir_allowed)
@@ -1171,7 +1181,7 @@ RSpec.describe User, feature_category: :user_profile do
let(:random_password) { described_class.random_password }
before do
- expect(User).to receive(:password_length).and_return(88..128)
+ expect(described_class).to receive(:password_length).and_return(88..128)
end
context 'length' do
@@ -1405,7 +1415,7 @@ RSpec.describe User, feature_category: :user_profile do
context 'strip attributes' do
context 'name' do
- let(:user) { User.new(name: ' John Smith ') }
+ let(:user) { described_class.new(name: ' John Smith ') }
it 'strips whitespaces on validation' do
expect { user.valid? }.to change { user.name }.to('John Smith')
@@ -1677,7 +1687,7 @@ RSpec.describe User, feature_category: :user_profile do
end
it 'returns the correct highest role' do
- users = User.includes(:user_highest_role).where(id: [user.id, another_user.id])
+ users = described_class.includes(:user_highest_role).where(id: [user.id, another_user.id])
expect(users.collect { |u| [u.id, u.highest_role] }).to contain_exactly(
[user.id, Gitlab::Access::MAINTAINER],
@@ -2054,7 +2064,7 @@ RSpec.describe User, feature_category: :user_profile do
describe '#generate_password' do
it 'does not generate password by default' do
- password = User.random_password
+ password = described_class.random_password
user = create(:user, password: password)
expect(user.password).to eq(password)
@@ -2741,9 +2751,9 @@ RSpec.describe User, feature_category: :user_profile do
let_it_be(:admin_issue_board_list) { create_list(:user, 12, :admin, :with_sign_ins) }
it 'returns up to the ten most recently active instance admins' do
- active_admins_in_recent_sign_in_desc_order = User.admins.active.order_recent_sign_in.limit(10)
+ active_admins_in_recent_sign_in_desc_order = described_class.admins.active.order_recent_sign_in.limit(10)
- expect(User.instance_access_request_approvers_to_be_notified).to eq(active_admins_in_recent_sign_in_desc_order)
+ expect(described_class.instance_access_request_approvers_to_be_notified).to eq(active_admins_in_recent_sign_in_desc_order)
end
end
@@ -2950,56 +2960,6 @@ RSpec.describe User, feature_category: :user_profile do
end
end
- describe '#spammer?' do
- let_it_be(:user) { create(:user) }
-
- context 'when the user is a spammer' do
- before do
- allow(user).to receive(:spam_score).and_return(0.9)
- end
-
- it 'classifies the user as a spammer' do
- expect(user).to be_spammer
- end
- end
-
- context 'when the user is not a spammer' do
- before do
- allow(user).to receive(:spam_score).and_return(0.1)
- end
-
- it 'does not classify the user as a spammer' do
- expect(user).not_to be_spammer
- end
- end
- end
-
- describe '#spam_score' do
- let_it_be(:user) { create(:user) }
-
- context 'when the user is a spammer' do
- before do
- create(:abuse_trust_score, user: user, score: 0.8)
- create(:abuse_trust_score, user: user, score: 0.9)
- end
-
- it 'returns the expected score' do
- expect(user.spam_score).to be_within(0.01).of(0.85)
- end
- end
-
- context 'when the user is not a spammer' do
- before do
- create(:abuse_trust_score, user: user, score: 0.1)
- create(:abuse_trust_score, user: user, score: 0.0)
- end
-
- it 'returns the expected score' do
- expect(user.spam_score).to be_within(0.01).of(0.05)
- end
- end
- end
-
describe '.find_for_database_authentication' do
it 'strips whitespace from login' do
user = create(:user)
@@ -4497,7 +4457,7 @@ RSpec.describe User, feature_category: :user_profile do
it { is_expected.to include(group) }
it 'avoids N+1 queries' do
- fresh_user = User.find(user.id)
+ fresh_user = described_class.find(user.id)
control_count = ActiveRecord::QueryRecorder.new do
fresh_user.solo_owned_groups
end.count
@@ -6145,7 +6105,9 @@ RSpec.describe User, feature_category: :user_profile do
context 'when the user is a spammer' do
before do
- allow(user).to receive(:spammer?).and_return(true)
+ user_scores = Abuse::UserTrustScore.new(user)
+ allow(Abuse::UserTrustScore).to receive(:new).and_return(user_scores)
+ allow(user_scores).to receive(:spammer?).and_return(true)
end
context 'when the user account is less than 7 days old' do
@@ -6154,7 +6116,7 @@ RSpec.describe User, feature_category: :user_profile do
it 'creates an abuse report with the correct data' do
expect { subject }.to change { AbuseReport.count }.from(0).to(1)
expect(AbuseReport.last.attributes).to include({
- reporter_id: User.security_bot.id,
+ reporter_id: described_class.security_bot.id,
user_id: user.id,
category: "spam",
message: 'Potential spammer account deletion'
@@ -6175,7 +6137,7 @@ RSpec.describe User, feature_category: :user_profile do
end
context 'when there is an existing abuse report' do
- let!(:abuse_report) { create(:abuse_report, user: user, reporter: User.security_bot, message: 'Existing') }
+ let!(:abuse_report) { create(:abuse_report, user: user, reporter: described_class.security_bot, message: 'Existing') }
it 'updates the abuse report' do
subject
@@ -6230,6 +6192,29 @@ RSpec.describe User, feature_category: :user_profile do
expect { user.delete_async(deleted_by: deleted_by) }.not_to change { user.note }
end
end
+
+ describe '#allow_possible_spam?' do
+ context 'when no custom attribute is set' do
+ it 'is false' do
+ expect(user.allow_possible_spam?).to be_falsey
+ end
+ end
+
+ context 'when the custom attribute is set' do
+ before do
+ user.custom_attributes.upsert_custom_attributes(
+ [{
+ user_id: user.id,
+ key: UserCustomAttribute::ALLOW_POSSIBLE_SPAM,
+ value: "test"
+ }])
+ end
+
+ it '#allow_possible_spam? is true' do
+ expect(user.allow_possible_spam?).to be_truthy
+ end
+ end
+ end
end
end
@@ -6414,9 +6399,8 @@ RSpec.describe User, feature_category: :user_profile do
describe '#required_terms_not_accepted?' do
let(:user) { build(:user) }
- let(:project_bot) { create(:user, :project_bot) }
- subject { user.required_terms_not_accepted? }
+ subject(:required_terms_not_accepted) { user.required_terms_not_accepted? }
context 'when terms are not enforced' do
it { is_expected.to be_falsey }
@@ -6428,17 +6412,25 @@ RSpec.describe User, feature_category: :user_profile do
end
it 'is not accepted by the user' do
- expect(subject).to be_truthy
+ expect(required_terms_not_accepted).to be_truthy
end
it 'is accepted by the user' do
accept_terms(user)
- expect(subject).to be_falsey
+ expect(required_terms_not_accepted).to be_falsey
end
- it 'auto accepts the term for project bots' do
- expect(project_bot.required_terms_not_accepted?).to be_falsey
+ context "with bot users" do
+ %i[project_bot service_account security_policy_bot].each do |user_type|
+ context "when user is #{user_type}" do
+ let(:user) { build(:user, user_type) }
+
+ it 'auto accepts the terms' do
+ expect(required_terms_not_accepted).to be_falsey
+ end
+ end
+ end
end
end
end
@@ -7690,7 +7682,7 @@ RSpec.describe User, feature_category: :user_profile do
context 'when confirmation period is expired' do
before do
- travel_to(User.allow_unconfirmed_access_for.from_now + 1.day)
+ travel_to(described_class.allow_unconfirmed_access_for.from_now + 1.day)
end
it { is_expected.to be(true) }
@@ -8110,70 +8102,4 @@ RSpec.describe User, feature_category: :user_profile do
end
end
end
-
- describe '#telesign_score' do
- let_it_be(:user1) { create(:user) }
- let_it_be(:user2) { create(:user) }
-
- context 'when the user has a telesign risk score' do
- before do
- create(:abuse_trust_score, user: user1, score: 12.0, source: :telesign)
- create(:abuse_trust_score, user: user1, score: 24.0, source: :telesign)
- end
-
- it 'returns the latest score' do
- expect(user1.telesign_score).to be(24.0)
- end
- end
-
- context 'when the user does not have a telesign risk score' do
- it 'defaults to zero' do
- expect(user2.telesign_score).to be(0.0)
- end
- end
- end
-
- describe '#arkose_global_score' do
- let_it_be(:user1) { create(:user) }
- let_it_be(:user2) { create(:user) }
-
- context 'when the user has an arkose global risk score' do
- before do
- create(:abuse_trust_score, user: user1, score: 12.0, source: :arkose_global_score)
- create(:abuse_trust_score, user: user1, score: 24.0, source: :arkose_global_score)
- end
-
- it 'returns the latest score' do
- expect(user1.arkose_global_score).to be(24.0)
- end
- end
-
- context 'when the user does not have an arkose global risk score' do
- it 'defaults to zero' do
- expect(user2.arkose_global_score).to be(0.0)
- end
- end
- end
-
- describe '#arkose_custom_score' do
- let_it_be(:user1) { create(:user) }
- let_it_be(:user2) { create(:user) }
-
- context 'when the user has an arkose custom risk score' do
- before do
- create(:abuse_trust_score, user: user1, score: 12.0, source: :arkose_custom_score)
- create(:abuse_trust_score, user: user1, score: 24.0, source: :arkose_custom_score)
- end
-
- it 'returns the latest score' do
- expect(user1.arkose_custom_score).to be(24.0)
- end
- end
-
- context 'when the user does not have an arkose custom risk score' do
- it 'defaults to zero' do
- expect(user2.arkose_custom_score).to be(0.0)
- end
- end
- end
end
diff --git a/spec/models/users/merge_request_interaction_spec.rb b/spec/models/users/merge_request_interaction_spec.rb
index 0b1888bd9a6..c7ffb62e5f1 100644
--- a/spec/models/users/merge_request_interaction_spec.rb
+++ b/spec/models/users/merge_request_interaction_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe ::Users::MergeRequestInteraction do
let_it_be(:merge_request) { create(:merge_request, source_project: project) }
subject(:interaction) do
- ::Users::MergeRequestInteraction.new(user: user, merge_request: merge_request.reset)
+ described_class.new(user: user, merge_request: merge_request.reset)
end
describe 'declarative policy delegation' do
diff --git a/spec/models/users_statistics_spec.rb b/spec/models/users_statistics_spec.rb
index add9bd18755..d1ca9ff5125 100644
--- a/spec/models/users_statistics_spec.rb
+++ b/spec/models/users_statistics_spec.rb
@@ -63,7 +63,7 @@ RSpec.describe UsersStatistics do
context 'when unsuccessful' do
it 'raises an ActiveRecord::RecordInvalid exception' do
- allow(UsersStatistics).to receive(:create!).and_raise(ActiveRecord::RecordInvalid)
+ allow(described_class).to receive(:create!).and_raise(ActiveRecord::RecordInvalid)
expect { described_class.create_current_stats! }.to raise_error(ActiveRecord::RecordInvalid)
end
diff --git a/spec/models/wiki_directory_spec.rb b/spec/models/wiki_directory_spec.rb
index c30e79f79ce..93e7ecd7646 100644
--- a/spec/models/wiki_directory_spec.rb
+++ b/spec/models/wiki_directory_spec.rb
@@ -33,18 +33,18 @@ RSpec.describe WikiDirectory do
expect(entries).to match(
[
- a_kind_of(WikiDirectory).and(
+ a_kind_of(described_class).and(
having_attributes(
slug: 'Home', entries: [homechild]
)
),
toplevel1,
- a_kind_of(WikiDirectory).and(
+ a_kind_of(described_class).and(
having_attributes(
slug: 'parent1', entries: [
child1,
child2,
- a_kind_of(WikiDirectory).and(
+ a_kind_of(described_class).and(
having_attributes(
slug: 'parent1/subparent',
entries: [grandchild1, grandchild2]
@@ -53,7 +53,7 @@ RSpec.describe WikiDirectory do
]
)
),
- a_kind_of(WikiDirectory).and(
+ a_kind_of(described_class).and(
having_attributes(
slug: 'parent2',
entries: [child3]
diff --git a/spec/models/work_item_spec.rb b/spec/models/work_item_spec.rb
index e0ec54fd5ff..7963c0898b3 100644
--- a/spec/models/work_item_spec.rb
+++ b/spec/models/work_item_spec.rb
@@ -87,6 +87,14 @@ RSpec.describe WorkItem, feature_category: :portfolio_management do
end
end
+ describe '#todoable_target_type_name' do
+ it 'returns correct target name' do
+ work_item = build(:work_item)
+
+ expect(work_item.todoable_target_type_name).to contain_exactly('Issue', 'WorkItem')
+ end
+ end
+
describe '#widgets' do
subject { build(:work_item).widgets }
@@ -176,17 +184,32 @@ RSpec.describe WorkItem, feature_category: :portfolio_management do
is_expected.not_to include(:due, :remove_due_date)
end
end
+
+ context 'when work item supports the current user todos widget' do
+ it 'returns todos related quick action commands' do
+ is_expected.to include(:todo, :done)
+ end
+ end
+
+ context 'when work item does not support current user todos widget' do
+ let(:work_item) { build(:work_item, :task) }
+
+ before do
+ WorkItems::Type.default_by_type(:task).widget_definitions
+ .find_by_widget_type(:current_user_todos).update!(disabled: true)
+ end
+
+ it 'omits todos related quick action commands' do
+ is_expected.not_to include(:todo, :done)
+ end
+ end
end
describe 'transform_quick_action_params' do
+ let(:command_params) { { title: 'bar', assignee_ids: ['foo'] } }
let(:work_item) { build(:work_item, :task) }
- subject(:transformed_params) do
- work_item.transform_quick_action_params({
- title: 'bar',
- assignee_ids: ['foo']
- })
- end
+ subject(:transformed_params) { work_item.transform_quick_action_params(command_params) }
it 'correctly separates widget params from regular params' do
expect(transformed_params).to eq({
@@ -200,6 +223,30 @@ RSpec.describe WorkItem, feature_category: :portfolio_management do
}
})
end
+
+ context 'with current user todos widget' do
+ let(:command_params) { { title: 'bar', todo_event: param } }
+
+ where(:param, :expected) do
+ 'done' | 'mark_as_done'
+ 'add' | 'add'
+ end
+
+ with_them do
+ it 'correctly transform todo_event param' do
+ expect(transformed_params).to eq({
+ common: {
+ title: 'bar'
+ },
+ widgets: {
+ current_user_todos_widget: {
+ action: expected
+ }
+ }
+ })
+ end
+ end
+ end
end
describe 'callbacks' do
@@ -212,11 +259,13 @@ RSpec.describe WorkItem, feature_category: :portfolio_management do
create(:work_item)
end
- it_behaves_like 'issue_edit snowplow tracking' do
+ it_behaves_like 'internal event tracking' do
let(:work_item) { create(:work_item) }
- let(:property) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_CREATED }
+ let(:action) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_CREATED }
let(:project) { work_item.project }
let(:user) { work_item.author }
+ let(:namespace) { project.namespace }
+
subject(:service_action) { work_item }
end
end
@@ -255,22 +304,6 @@ RSpec.describe WorkItem, feature_category: :portfolio_management do
describe 'validations' do
subject { work_item.valid? }
- describe 'issue_type' do
- let(:work_item) { build(:work_item, issue_type: issue_type) }
-
- context 'when a valid type' do
- let(:issue_type) { :issue }
-
- it { is_expected.to eq(true) }
- end
-
- context 'empty type' do
- let(:issue_type) { nil }
-
- it { is_expected.to eq(false) }
- end
- end
-
describe 'confidentiality' do
let_it_be(:project) { create(:project) }
diff --git a/spec/models/work_items/parent_link_spec.rb b/spec/models/work_items/parent_link_spec.rb
index f1aa81f46d2..d7f87da1965 100644
--- a/spec/models/work_items/parent_link_spec.rb
+++ b/spec/models/work_items/parent_link_spec.rb
@@ -51,8 +51,8 @@ RSpec.describe WorkItems::ParentLink, feature_category: :portfolio_management do
it 'validates if child can be added to the parent' do
parent_type = WorkItems::Type.default_by_type(parent_type_sym)
child_type = WorkItems::Type.default_by_type(child_type_sym)
- parent = build(:work_item, issue_type: parent_type_sym, work_item_type: parent_type, project: project)
- child = build(:work_item, issue_type: child_type_sym, work_item_type: child_type, project: project)
+ parent = build(:work_item, work_item_type: parent_type, project: project)
+ child = build(:work_item, work_item_type: child_type, project: project)
link = build(:parent_link, work_item: child, work_item_parent: parent)
expect(link.valid?).to eq(is_valid)
diff --git a/spec/models/work_items/type_spec.rb b/spec/models/work_items/type_spec.rb
index e5c88634b26..f5806c296ac 100644
--- a/spec/models/work_items/type_spec.rb
+++ b/spec/models/work_items/type_spec.rb
@@ -49,10 +49,10 @@ RSpec.describe WorkItems::Type do
it 'deletes type but not unrelated issues' do
type = create(:work_item_type)
- expect(WorkItems::Type.count).to eq(8)
+ expect(described_class.count).to eq(8)
expect { type.destroy! }.not_to change(Issue, :count)
- expect(WorkItems::Type.count).to eq(7)
+ expect(described_class.count).to eq(7)
end
end
diff --git a/spec/models/work_items/widgets/base_spec.rb b/spec/models/work_items/widgets/base_spec.rb
index 9b4b4d9e98f..29b54a706c2 100644
--- a/spec/models/work_items/widgets/base_spec.rb
+++ b/spec/models/work_items/widgets/base_spec.rb
@@ -16,4 +16,10 @@ RSpec.describe WorkItems::Widgets::Base do
it { is_expected.to eq(:base) }
end
+
+ describe '.process_quick_action_param' do
+ subject { described_class.process_quick_action_param(:label_ids, [1, 2]) }
+
+ it { is_expected.to eq({ label_ids: [1, 2] }) }
+ end
end
diff --git a/spec/models/work_items/widgets/current_user_todos_spec.rb b/spec/models/work_items/widgets/current_user_todos_spec.rb
new file mode 100644
index 00000000000..9fdf28beada
--- /dev/null
+++ b/spec/models/work_items/widgets/current_user_todos_spec.rb
@@ -0,0 +1,60 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe WorkItems::Widgets::CurrentUserTodos, feature_category: :team_planning do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:milestone) { create(:milestone, project: project) }
+ let_it_be(:work_item) { create(:work_item, :issue, project: project, milestone: milestone) }
+
+ describe '.type' do
+ subject { described_class.type }
+
+ it { is_expected.to eq(:current_user_todos) }
+ end
+
+ describe '#type' do
+ subject { described_class.new(work_item).type }
+
+ it { is_expected.to eq(:current_user_todos) }
+ end
+
+ describe '.quick_action_params' do
+ subject { described_class.quick_action_params }
+
+ it { is_expected.to contain_exactly(:todo_event) }
+ end
+
+ describe '.quick_action_commands' do
+ subject { described_class.quick_action_commands }
+
+ it { is_expected.to contain_exactly(:todo, :done) }
+ end
+
+ describe '.process_quick_action_param' do
+ subject { described_class.process_quick_action_param(param_name, param_value) }
+
+ context 'when quick action param is todo_event' do
+ let(:param_name) { :todo_event }
+
+ context 'when param value is `done`' do
+ let(:param_value) { 'done' }
+
+ it { is_expected.to eq({ action: 'mark_as_done' }) }
+ end
+
+ context 'when param value is `add`' do
+ let(:param_value) { 'add' }
+
+ it { is_expected.to eq({ action: 'add' }) }
+ end
+ end
+
+ context 'when quick action param is not todo_event' do
+ let(:param_name) { :foo }
+ let(:param_value) { 'foo' }
+
+ it { is_expected.to eq({ foo: 'foo' }) }
+ end
+ end
+end
diff --git a/spec/models/work_items/widgets/milestone_spec.rb b/spec/models/work_items/widgets/milestone_spec.rb
index 7b2d661df29..385614984fe 100644
--- a/spec/models/work_items/widgets/milestone_spec.rb
+++ b/spec/models/work_items/widgets/milestone_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe WorkItems::Widgets::Milestone do
let_it_be(:project) { create(:project) }
let_it_be(:milestone) { create(:milestone, project: project) }
- let_it_be(:work_item) { create(:work_item, :issue, project: project, milestone: milestone) }
+ let_it_be(:work_item) { create(:work_item, project: project, milestone: milestone) }
describe '.type' do
subject { described_class.type }
diff --git a/spec/policies/global_policy_spec.rb b/spec/policies/global_policy_spec.rb
index dce97fab252..4fafe392aac 100644
--- a/spec/policies/global_policy_spec.rb
+++ b/spec/policies/global_policy_spec.rb
@@ -694,59 +694,5 @@ RSpec.describe GlobalPolicy, feature_category: :shared do
it { is_expected.to be_disallowed(:create_instance_runner) }
end
-
- context 'create_runner_workflow_for_admin flag disabled' do
- before do
- stub_feature_flags(create_runner_workflow_for_admin: false)
- end
-
- context 'admin' do
- let(:current_user) { admin_user }
-
- context 'when admin mode is enabled', :enable_admin_mode do
- it { is_expected.to be_disallowed(:create_instance_runner) }
- end
-
- context 'when admin mode is disabled' do
- it { is_expected.to be_disallowed(:create_instance_runner) }
- end
- end
-
- context 'with project_bot' do
- let(:current_user) { project_bot }
-
- it { is_expected.to be_disallowed(:create_instance_runner) }
- end
-
- context 'with migration_bot' do
- let(:current_user) { migration_bot }
-
- it { is_expected.to be_disallowed(:create_instance_runner) }
- end
-
- context 'with security_bot' do
- let(:current_user) { security_bot }
-
- it { is_expected.to be_disallowed(:create_instance_runner) }
- end
-
- context 'with llm_bot' do
- let(:current_user) { llm_bot }
-
- it { is_expected.to be_disallowed(:create_instance_runners) }
- end
-
- context 'with regular user' do
- let(:current_user) { user }
-
- it { is_expected.to be_disallowed(:create_instance_runner) }
- end
-
- context 'with anonymous' do
- let(:current_user) { nil }
-
- it { is_expected.to be_disallowed(:create_instance_runner) }
- end
- end
end
end
diff --git a/spec/policies/group_policy_spec.rb b/spec/policies/group_policy_spec.rb
index fcde094939a..89f083a69d6 100644
--- a/spec/policies/group_policy_spec.rb
+++ b/spec/policies/group_policy_spec.rb
@@ -1483,155 +1483,81 @@ RSpec.describe GroupPolicy, feature_category: :system_access do
end
end
- context 'create_runner_workflow_for_namespace flag enabled' do
- before do
- stub_feature_flags(create_runner_workflow_for_namespace: [group])
- end
+ context 'admin' do
+ let(:current_user) { admin }
- context 'admin' do
- let(:current_user) { admin }
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it { is_expected.to be_allowed(:create_runner) }
- context 'when admin mode is enabled', :enable_admin_mode do
- it { is_expected.to be_allowed(:create_runner) }
+ context 'with specific group runner registration disabled' do
+ before do
+ group.runner_registration_enabled = false
+ end
- context 'with specific group runner registration disabled' do
- before do
- group.runner_registration_enabled = false
- end
+ it { is_expected.to be_allowed(:create_runner) }
+ end
- it { is_expected.to be_allowed(:create_runner) }
+ context 'with group runner registration disabled' do
+ before do
+ stub_application_setting(valid_runner_registrars: ['project'])
+ group.runner_registration_enabled = runner_registration_enabled
end
- context 'with group runner registration disabled' do
- before do
- stub_application_setting(valid_runner_registrars: ['project'])
- group.runner_registration_enabled = runner_registration_enabled
- end
+ context 'with specific group runner registration enabled' do
+ let(:runner_registration_enabled) { true }
- context 'with specific group runner registration enabled' do
- let(:runner_registration_enabled) { true }
-
- it { is_expected.to be_allowed(:create_runner) }
- end
+ it { is_expected.to be_allowed(:create_runner) }
+ end
- context 'with specific group runner registration disabled' do
- let(:runner_registration_enabled) { false }
+ context 'with specific group runner registration disabled' do
+ let(:runner_registration_enabled) { false }
- it { is_expected.to be_allowed(:create_runner) }
- end
+ it { is_expected.to be_allowed(:create_runner) }
end
end
-
- context 'when admin mode is disabled' do
- it { is_expected.to be_disallowed(:create_runner) }
- end
- end
-
- context 'with owner' do
- let(:current_user) { owner }
-
- it { is_expected.to be_allowed(:create_runner) }
-
- it_behaves_like 'disallowed when group runner registration disabled'
- end
-
- context 'with maintainer' do
- let(:current_user) { maintainer }
-
- it { is_expected.to be_disallowed(:create_runner) }
end
- context 'with reporter' do
- let(:current_user) { reporter }
-
- it { is_expected.to be_disallowed(:create_runner) }
- end
-
- context 'with guest' do
- let(:current_user) { guest }
-
- it { is_expected.to be_disallowed(:create_runner) }
- end
-
- context 'with developer' do
- let(:current_user) { developer }
-
- it { is_expected.to be_disallowed(:create_runner) }
- end
-
- context 'with anonymous' do
- let(:current_user) { nil }
-
+ context 'when admin mode is disabled' do
it { is_expected.to be_disallowed(:create_runner) }
end
end
- context 'with create_runner_workflow_for_namespace flag disabled' do
- before do
- stub_feature_flags(create_runner_workflow_for_namespace: [other_group])
- end
-
- let_it_be(:other_group) { create(:group) }
-
- context 'admin' do
- let(:current_user) { admin }
-
- context 'when admin mode is enabled', :enable_admin_mode do
- it { is_expected.to be_disallowed(:create_runner) }
-
- context 'with specific group runner registration disabled' do
- before do
- group.runner_registration_enabled = false
- end
-
- it { is_expected.to be_disallowed(:create_runner) }
- end
-
- it_behaves_like 'disallowed when group runner registration disabled'
- end
-
- context 'when admin mode is disabled' do
- it { is_expected.to be_disallowed(:create_runner) }
- end
- end
-
- context 'with owner' do
- let(:current_user) { owner }
+ context 'with owner' do
+ let(:current_user) { owner }
- it { is_expected.to be_disallowed(:create_runner) }
+ it { is_expected.to be_allowed(:create_runner) }
- it_behaves_like 'disallowed when group runner registration disabled'
- end
+ it_behaves_like 'disallowed when group runner registration disabled'
+ end
- context 'with maintainer' do
- let(:current_user) { maintainer }
+ context 'with maintainer' do
+ let(:current_user) { maintainer }
- it { is_expected.to be_disallowed(:create_runner) }
- end
+ it { is_expected.to be_disallowed(:create_runner) }
+ end
- context 'with reporter' do
- let(:current_user) { reporter }
+ context 'with reporter' do
+ let(:current_user) { reporter }
- it { is_expected.to be_disallowed(:create_runner) }
- end
+ it { is_expected.to be_disallowed(:create_runner) }
+ end
- context 'with guest' do
- let(:current_user) { guest }
+ context 'with guest' do
+ let(:current_user) { guest }
- it { is_expected.to be_disallowed(:create_runner) }
- end
+ it { is_expected.to be_disallowed(:create_runner) }
+ end
- context 'with developer' do
- let(:current_user) { developer }
+ context 'with developer' do
+ let(:current_user) { developer }
- it { is_expected.to be_disallowed(:create_runner) }
- end
+ it { is_expected.to be_disallowed(:create_runner) }
+ end
- context 'with anonymous' do
- let(:current_user) { nil }
+ context 'with anonymous' do
+ let(:current_user) { nil }
- it { is_expected.to be_disallowed(:create_runner) }
- end
+ it { is_expected.to be_disallowed(:create_runner) }
end
end
diff --git a/spec/policies/merge_request_policy_spec.rb b/spec/policies/merge_request_policy_spec.rb
index c21e1244402..285f52956eb 100644
--- a/spec/policies/merge_request_policy_spec.rb
+++ b/spec/policies/merge_request_policy_spec.rb
@@ -462,6 +462,37 @@ RSpec.describe MergeRequestPolicy do
end
end
+ context 'when enabling generate diff summary permission' do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:mr) { create(:merge_request, target_project: project, source_project: project) }
+ let_it_be(:user) { create(:user) }
+ let(:policy) { permissions(user, mr) }
+
+ context 'when can read_merge_request' do
+ before do
+ project.add_developer(user)
+ end
+
+ it 'allows to generate_diff_summary' do
+ expect(policy).to be_allowed(:generate_diff_summary)
+ end
+ end
+
+ context 'when can not read_merge_request' do
+ it 'does not allow to generate_diff_summary' do
+ expect(policy).not_to be_allowed(:generate_diff_summary)
+ end
+
+ context 'and when is the LLM bot' do
+ let(:user) { create(:user, :llm_bot) }
+
+ it 'allows to generate_diff_summary' do
+ expect(policy).to be_allowed(:generate_diff_summary)
+ end
+ end
+ end
+ end
+
context 'when the author of the merge request is banned', feature_category: :insider_threat do
let_it_be(:user) { create(:user) }
let_it_be(:admin) { create(:user, :admin) }
diff --git a/spec/policies/note_policy_spec.rb b/spec/policies/note_policy_spec.rb
index b2191e6925d..de300f933f6 100644
--- a/spec/policies/note_policy_spec.rb
+++ b/spec/policies/note_policy_spec.rb
@@ -271,7 +271,7 @@ RSpec.describe NotePolicy, feature_category: :team_planning do
end
context 'when noteable is issue' do
- let(:noteable) { create(:work_item, :issue, project: project) }
+ let(:noteable) { create(:work_item, project: project) }
let(:note) { create(:note, system: true, noteable: noteable, author: user, project: project) }
it_behaves_like 'user can read the note'
diff --git a/spec/policies/project_policy_spec.rb b/spec/policies/project_policy_spec.rb
index ee8d811971a..602b7148d0e 100644
--- a/spec/policies/project_policy_spec.rb
+++ b/spec/policies/project_policy_spec.rb
@@ -2879,42 +2879,10 @@ RSpec.describe ProjectPolicy, feature_category: :system_access do
end
describe 'create_runner' do
- context 'create_runner_workflow_for_namespace flag enabled' do
- before do
- stub_feature_flags(create_runner_workflow_for_namespace: [project.namespace])
- end
-
- context 'admin' do
- let(:current_user) { admin }
-
- context 'when admin mode is enabled', :enable_admin_mode do
- it { is_expected.to be_allowed(:create_runner) }
-
- context 'with project runner registration disabled' do
- before do
- stub_application_setting(valid_runner_registrars: ['group'])
- end
-
- it { is_expected.to be_allowed(:create_runner) }
- end
-
- context 'with specific project runner registration disabled' do
- before do
- project.update!(runner_registration_enabled: false)
- end
-
- it { is_expected.to be_allowed(:create_runner) }
- end
- end
-
- context 'when admin mode is disabled' do
- it { is_expected.to be_disallowed(:create_runner) }
- end
- end
-
- context 'with owner' do
- let(:current_user) { owner }
+ context 'admin' do
+ let(:current_user) { admin }
+ context 'when admin mode is enabled', :enable_admin_mode do
it { is_expected.to be_allowed(:create_runner) }
context 'with project runner registration disabled' do
@@ -2922,7 +2890,7 @@ RSpec.describe ProjectPolicy, feature_category: :system_access do
stub_application_setting(valid_runner_registrars: ['group'])
end
- it { is_expected.to be_disallowed(:create_runner) }
+ it { is_expected.to be_allowed(:create_runner) }
end
context 'with specific project runner registration disabled' do
@@ -2930,125 +2898,65 @@ RSpec.describe ProjectPolicy, feature_category: :system_access do
project.update!(runner_registration_enabled: false)
end
- it { is_expected.to be_disallowed(:create_runner) }
+ it { is_expected.to be_allowed(:create_runner) }
end
end
- context 'with maintainer' do
- let(:current_user) { maintainer }
-
- it { is_expected.to be_allowed(:create_runner) }
- end
-
- context 'with reporter' do
- let(:current_user) { reporter }
-
- it { is_expected.to be_disallowed(:create_runner) }
- end
-
- context 'with guest' do
- let(:current_user) { guest }
-
- it { is_expected.to be_disallowed(:create_runner) }
- end
-
- context 'with developer' do
- let(:current_user) { developer }
-
- it { is_expected.to be_disallowed(:create_runner) }
- end
-
- context 'with anonymous' do
- let(:current_user) { nil }
-
+ context 'when admin mode is disabled' do
it { is_expected.to be_disallowed(:create_runner) }
end
end
- context 'create_runner_workflow_for_namespace flag disabled' do
- before do
- stub_feature_flags(create_runner_workflow_for_namespace: [group])
- end
-
- context 'admin' do
- let(:current_user) { admin }
-
- context 'when admin mode is enabled', :enable_admin_mode do
- it { is_expected.to be_disallowed(:create_runner) }
-
- context 'with project runner registration disabled' do
- before do
- stub_application_setting(valid_runner_registrars: ['group'])
- end
-
- it { is_expected.to be_disallowed(:create_runner) }
- end
-
- context 'with specific project runner registration disabled' do
- before do
- project.update!(runner_registration_enabled: false)
- end
+ context 'with owner' do
+ let(:current_user) { owner }
- it { is_expected.to be_disallowed(:create_runner) }
- end
- end
+ it { is_expected.to be_allowed(:create_runner) }
- context 'when admin mode is disabled' do
- it { is_expected.to be_disallowed(:create_runner) }
+ context 'with project runner registration disabled' do
+ before do
+ stub_application_setting(valid_runner_registrars: ['group'])
end
- end
-
- context 'with owner' do
- let(:current_user) { owner }
it { is_expected.to be_disallowed(:create_runner) }
+ end
- context 'with project runner registration disabled' do
- before do
- stub_application_setting(valid_runner_registrars: ['group'])
- end
-
- it { is_expected.to be_disallowed(:create_runner) }
+ context 'with specific project runner registration disabled' do
+ before do
+ project.update!(runner_registration_enabled: false)
end
- context 'with specific project runner registration disabled' do
- before do
- project.update!(runner_registration_enabled: false)
- end
-
- it { is_expected.to be_disallowed(:create_runner) }
- end
+ it { is_expected.to be_disallowed(:create_runner) }
end
+ end
- context 'with maintainer' do
- let(:current_user) { maintainer }
+ context 'with maintainer' do
+ let(:current_user) { maintainer }
- it { is_expected.to be_disallowed(:create_runner) }
- end
+ it { is_expected.to be_allowed(:create_runner) }
+ end
- context 'with reporter' do
- let(:current_user) { reporter }
+ context 'with reporter' do
+ let(:current_user) { reporter }
- it { is_expected.to be_disallowed(:create_runner) }
- end
+ it { is_expected.to be_disallowed(:create_runner) }
+ end
- context 'with guest' do
- let(:current_user) { guest }
+ context 'with guest' do
+ let(:current_user) { guest }
- it { is_expected.to be_disallowed(:create_runner) }
- end
+ it { is_expected.to be_disallowed(:create_runner) }
+ end
- context 'with developer' do
- let(:current_user) { developer }
+ context 'with developer' do
+ let(:current_user) { developer }
- it { is_expected.to be_disallowed(:create_runner) }
- end
+ it { is_expected.to be_disallowed(:create_runner) }
+ end
- context 'with anonymous' do
- let(:current_user) { nil }
+ context 'with anonymous' do
+ let(:current_user) { nil }
- it { is_expected.to be_disallowed(:create_runner) }
- end
+ it { is_expected.to be_disallowed(:create_runner) }
end
end
@@ -3309,6 +3217,57 @@ RSpec.describe ProjectPolicy, feature_category: :system_access do
end
end
+ describe ':write_model_experiments' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:ff_ml_experiment_tracking, :current_user, :access_level, :allowed) do
+ false | ref(:owner) | Featurable::ENABLED | false
+ true | ref(:reporter) | Featurable::ENABLED | true
+ true | ref(:reporter) | Featurable::PRIVATE | true
+ true | ref(:reporter) | Featurable::DISABLED | false
+ true | ref(:guest) | Featurable::ENABLED | false
+ true | ref(:non_member) | Featurable::ENABLED | false
+ end
+ with_them do
+ before do
+ stub_feature_flags(ml_experiment_tracking: ff_ml_experiment_tracking)
+ project.project_feature.update!(model_experiments_access_level: access_level)
+ end
+
+ if params[:allowed]
+ it { is_expected.to be_allowed(:write_model_experiments) }
+ else
+ it { is_expected.not_to be_allowed(:write_model_experiments) }
+ end
+ end
+ end
+
+ describe 'when project is created and owned by a banned user' do
+ let_it_be(:project) { create(:project, :public) }
+
+ let(:current_user) { guest }
+
+ before do
+ allow(project).to receive(:created_and_owned_by_banned_user?).and_return(true)
+ end
+
+ it { expect_disallowed(:read_project) }
+
+ context 'when current user is an admin', :enable_admin_mode do
+ let(:current_user) { admin }
+
+ it { expect_allowed(:read_project) }
+ end
+
+ context 'when hide_projects_of_banned_users FF is disabled' do
+ before do
+ stub_feature_flags(hide_projects_of_banned_users: false)
+ end
+
+ it { expect_allowed(:read_project) }
+ end
+ end
+
private
def project_subject(project_type)
diff --git a/spec/presenters/alert_management/alert_presenter_spec.rb b/spec/presenters/alert_management/alert_presenter_spec.rb
index fe228f174fe..eedb2e07fb6 100644
--- a/spec/presenters/alert_management/alert_presenter_spec.rb
+++ b/spec/presenters/alert_management/alert_presenter_spec.rb
@@ -91,24 +91,6 @@ RSpec.describe AlertManagement::AlertPresenter do
)
end
end
-
- context 'with metrics_dashboard_url' do
- before do
- allow(alert.parsed_payload).to receive(:metrics_dashboard_url).and_return('https://gitlab.com/metrics')
- end
-
- it do
- is_expected.to eq(
- <<~MARKDOWN.chomp
- **Start time:** #{presenter.start_time}#{markdown_line_break}
- **Severity:** #{presenter.severity}#{markdown_line_break}
- **GitLab alert:** #{alert_url}
-
- [](https://gitlab.com/metrics)
- MARKDOWN
- )
- end
- end
end
describe '#start_time' do
diff --git a/spec/presenters/blob_presenter_spec.rb b/spec/presenters/blob_presenter_spec.rb
index e776716bd2d..150c7bd5f3e 100644
--- a/spec/presenters/blob_presenter_spec.rb
+++ b/spec/presenters/blob_presenter_spec.rb
@@ -7,28 +7,52 @@ RSpec.describe BlobPresenter do
let_it_be(:user) { project.first_owner }
let(:repository) { project.repository }
- let(:blob) { repository.blob_at('HEAD', 'files/ruby/regex.rb') }
+ let(:blob) { repository.blob_at(ref, path) }
+ let(:ref) { 'HEAD' }
+ let(:path) { 'files/ruby/regex.rb' }
subject(:presenter) { described_class.new(blob, current_user: user) }
describe '#web_url' do
- it { expect(presenter.web_url).to eq("http://localhost/#{project.full_path}/-/blob/#{blob.commit_id}/#{blob.path}") }
+ it { expect(presenter.web_url).to eq("http://localhost/#{project.full_path}/-/blob/#{ref}/#{path}") }
end
describe '#web_path' do
- it { expect(presenter.web_path).to eq("/#{project.full_path}/-/blob/#{blob.commit_id}/#{blob.path}") }
+ it { expect(presenter.web_path).to eq("/#{project.full_path}/-/blob/#{ref}/#{path}") }
end
describe '#edit_blob_path' do
- it { expect(presenter.edit_blob_path).to eq("/#{project.full_path}/-/edit/#{blob.commit_id}/#{blob.path}") }
+ it { expect(presenter.edit_blob_path).to eq("/#{project.full_path}/-/edit/#{ref}/#{path}") }
end
describe '#raw_path' do
- it { expect(presenter.raw_path).to eq("/#{project.full_path}/-/raw/#{blob.commit_id}/#{blob.path}") }
+ it { expect(presenter.raw_path).to eq("/#{project.full_path}/-/raw/#{ref}/#{path}") }
end
describe '#replace_path' do
- it { expect(presenter.replace_path).to eq("/#{project.full_path}/-/update/#{blob.commit_id}/#{blob.path}") }
+ it { expect(presenter.replace_path).to eq("/#{project.full_path}/-/update/#{ref}/#{path}") }
+ end
+
+ shared_examples_for '#can_current_user_push_to_branch?' do
+ let(:branch_exists) { true }
+
+ before do
+ allow(project.repository).to receive(:branch_exists?).with(blob.commit_id).and_return(branch_exists)
+ end
+
+ it { expect(presenter.can_current_user_push_to_branch?).to eq(true) }
+
+ context 'current_user is nil' do
+ let(:user) { nil }
+
+ it { expect(presenter.can_current_user_push_to_branch?).to eq(false) }
+ end
+
+ context 'branch does not exist' do
+ let(:branch_exists) { false }
+
+ it { expect(presenter.can_current_user_push_to_branch?).to eq(false) }
+ end
end
context 'when blob has ref_type' do
@@ -37,46 +61,67 @@ RSpec.describe BlobPresenter do
end
describe '#web_url' do
- it { expect(presenter.web_url).to eq("http://localhost/#{project.full_path}/-/blob/#{blob.commit_id}/#{blob.path}?ref_type=heads") }
+ it { expect(presenter.web_url).to eq("http://localhost/#{project.full_path}/-/blob/#{ref}/#{path}?ref_type=heads") }
end
describe '#web_path' do
- it { expect(presenter.web_path).to eq("/#{project.full_path}/-/blob/#{blob.commit_id}/#{blob.path}?ref_type=heads") }
+ it { expect(presenter.web_path).to eq("/#{project.full_path}/-/blob/#{ref}/#{path}?ref_type=heads") }
end
describe '#edit_blob_path' do
- it { expect(presenter.edit_blob_path).to eq("/#{project.full_path}/-/edit/#{blob.commit_id}/#{blob.path}?ref_type=heads") }
+ it { expect(presenter.edit_blob_path).to eq("/#{project.full_path}/-/edit/#{ref}/#{path}?ref_type=heads") }
end
describe '#raw_path' do
- it { expect(presenter.raw_path).to eq("/#{project.full_path}/-/raw/#{blob.commit_id}/#{blob.path}?ref_type=heads") }
+ it { expect(presenter.raw_path).to eq("/#{project.full_path}/-/raw/#{ref}/#{path}?ref_type=heads") }
end
describe '#replace_path' do
- it { expect(presenter.replace_path).to eq("/#{project.full_path}/-/update/#{blob.commit_id}/#{blob.path}?ref_type=heads") }
+ it { expect(presenter.replace_path).to eq("/#{project.full_path}/-/update/#{ref}/#{path}?ref_type=heads") }
end
+
+ it_behaves_like '#can_current_user_push_to_branch?'
end
- describe '#can_current_user_push_to_branch' do
- let(:branch_exists) { true }
+ describe '#can_modify_blob?' do
+ context 'when blob is store externally' do
+ before do
+ allow(blob).to receive(:stored_externally?).and_return(true)
+ end
- before do
- allow(project.repository).to receive(:branch_exists?).with(blob.commit_id).and_return(branch_exists)
+ it { expect(presenter.can_modify_blob?).to be_falsey }
end
- it { expect(presenter.can_current_user_push_to_branch?).to eq(true) }
+ context 'when the user cannot edit the tree' do
+ before do
+ allow(presenter).to receive(:can_edit_tree?).with(project, ref).and_return(false)
+ end
- context 'current_user is nil' do
- let(:user) { nil }
+ it { expect(presenter.can_modify_blob?).to be_falsey }
+ end
- it { expect(presenter.can_current_user_push_to_branch?).to eq(false) }
+ context 'when ref is a branch' do
+ let(:ref) { 'feature' }
+
+ it { expect(presenter.can_modify_blob?).to be_truthy }
end
+ end
- context 'branch does not exist' do
- let(:branch_exists) { false }
+ describe '#can_current_user_push_to_branch?' do
+ context 'when ref is a branch' do
+ let(:ref) { 'feature' }
- it { expect(presenter.can_current_user_push_to_branch?).to eq(false) }
+ it 'delegates to UserAccess' do
+ allow_next_instance_of(Gitlab::UserAccess) do |instance|
+ expect(instance).to receive(:can_push_to_branch?).with(ref).and_call_original
+ end
+ expect(presenter.can_current_user_push_to_branch?).to be_truthy
+ end
end
+
+ it_behaves_like '#can_current_user_push_to_branch?'
+
+ it { expect(presenter.can_current_user_push_to_branch?).to be_falsey }
end
describe '#archived?' do
@@ -95,9 +140,10 @@ RSpec.describe BlobPresenter do
)
end
- let(:blob) { repository.blob_at('main', '.gitlab-ci.yml') }
+ let(:ref) { 'main' }
+ let(:path) { '.gitlab-ci.yml' }
- it { expect(presenter.pipeline_editor_path).to eq("/#{project.full_path}/-/ci/editor?branch_name=#{blob.commit_id}") }
+ it { expect(presenter.pipeline_editor_path).to eq("/#{project.full_path}/-/ci/editor?branch_name=#{ref}") }
end
end
@@ -114,7 +160,7 @@ RSpec.describe BlobPresenter do
context 'Gitpod enabled for application and user' do
describe '#gitpod_blob_url' do
- it { expect(presenter.gitpod_blob_url).to eq("#{gitpod_url}##{"http://localhost/#{project.full_path}/-/tree/#{blob.commit_id}/#{blob.path}"}") }
+ it { expect(presenter.gitpod_blob_url).to eq("#{gitpod_url}##{"http://localhost/#{project.full_path}/-/tree/#{ref}/#{path}"}") }
end
end
@@ -157,7 +203,7 @@ RSpec.describe BlobPresenter do
let!(:deployment) { create(:deployment, :success, environment: environment, project: project, sha: blob.commit_id) }
before do
- allow(project).to receive(:public_path_for_source_path).with(blob.path, blob.commit_id).and_return(blob.path)
+ allow(project).to receive(:public_path_for_source_path).with(path, blob.commit_id).and_return(path)
end
describe '#environment_formatted_external_url' do
@@ -165,7 +211,7 @@ RSpec.describe BlobPresenter do
end
describe '#environment_external_url_for_route_map' do
- it { expect(presenter.environment_external_url_for_route_map).to eq("#{external_url}/#{blob.path}") }
+ it { expect(presenter.environment_external_url_for_route_map).to eq("#{external_url}/#{path}") }
end
describe 'chooses the latest deployed environment for #environment_formatted_external_url and #environment_external_url_for_route_map' do
@@ -174,7 +220,7 @@ RSpec.describe BlobPresenter do
let!(:another_deployment) { create(:deployment, :success, environment: another_environment, project: project, sha: blob.commit_id) }
it { expect(presenter.environment_formatted_external_url).to eq("another.environment") }
- it { expect(presenter.environment_external_url_for_route_map).to eq("#{another_external_url}/#{blob.path}") }
+ it { expect(presenter.environment_external_url_for_route_map).to eq("#{another_external_url}/#{path}") }
end
end
@@ -219,7 +265,7 @@ RSpec.describe BlobPresenter do
end
describe '#code_navigation_path' do
- let(:code_navigation_path) { Gitlab::CodeNavigationPath.new(project, blob.commit_id).full_json_path_for(blob.path) }
+ let(:code_navigation_path) { Gitlab::CodeNavigationPath.new(project, blob.commit_id).full_json_path_for(path) }
it { expect(presenter.code_navigation_path).to eq(code_navigation_path) }
end
@@ -232,11 +278,11 @@ RSpec.describe BlobPresenter do
let(:blob) { Gitlab::Graphql::Representation::TreeEntry.new(super(), repository) }
describe '#web_url' do
- it { expect(presenter.web_url).to eq("http://localhost/#{project.full_path}/-/blob/#{blob.commit_id}/#{blob.path}") }
+ it { expect(presenter.web_url).to eq("http://localhost/#{project.full_path}/-/blob/#{ref}/#{path}") }
end
describe '#web_path' do
- it { expect(presenter.web_path).to eq("/#{project.full_path}/-/blob/#{blob.commit_id}/#{blob.path}") }
+ it { expect(presenter.web_path).to eq("/#{project.full_path}/-/blob/#{ref}/#{path}") }
end
end
diff --git a/spec/presenters/ci/pipeline_presenter_spec.rb b/spec/presenters/ci/pipeline_presenter_spec.rb
index cc68cdff7c1..fc13b377014 100644
--- a/spec/presenters/ci/pipeline_presenter_spec.rb
+++ b/spec/presenters/ci/pipeline_presenter_spec.rb
@@ -146,69 +146,6 @@ RSpec.describe Ci::PipelinePresenter do
end
end
- describe '#ref_text_legacy' do
- subject { presenter.ref_text_legacy }
-
- context 'when pipeline is detached merge request pipeline' do
- let(:merge_request) { create(:merge_request, :with_detached_merge_request_pipeline) }
- let(:pipeline) { merge_request.all_pipelines.last }
-
- it 'returns a correct ref text' do
- is_expected.to eq("for <a class=\"mr-iid\" href=\"#{project_merge_request_path(merge_request.project, merge_request)}\">#{merge_request.to_reference}</a> " \
- "with <a class=\"ref-name gl-link gl-bg-blue-50 gl-rounded-base gl-px-2\" href=\"#{project_commits_path(merge_request.source_project, merge_request.source_branch)}\">#{merge_request.source_branch}</a>")
- end
- end
-
- context 'when pipeline is merge request pipeline' do
- let(:merge_request) { create(:merge_request, :with_merge_request_pipeline) }
- let(:pipeline) { merge_request.all_pipelines.last }
-
- it 'returns a correct ref text' do
- is_expected.to eq("for <a class=\"mr-iid\" href=\"#{project_merge_request_path(merge_request.project, merge_request)}\">#{merge_request.to_reference}</a> " \
- "with <a class=\"ref-name gl-link gl-bg-blue-50 gl-rounded-base gl-px-2\" href=\"#{project_commits_path(merge_request.source_project, merge_request.source_branch)}\">#{merge_request.source_branch}</a> " \
- "into <a class=\"ref-name gl-link gl-bg-blue-50 gl-rounded-base gl-px-2\" href=\"#{project_commits_path(merge_request.target_project, merge_request.target_branch)}\">#{merge_request.target_branch}</a>")
- end
- end
-
- context 'when pipeline is branch pipeline' do
- context 'when ref exists in the repository' do
- before do
- allow(pipeline).to receive(:ref_exists?) { true }
- end
-
- it 'returns a correct ref text' do
- is_expected.to eq("for <a class=\"ref-name gl-link gl-bg-blue-50 gl-rounded-base gl-px-2\" href=\"#{project_commits_path(pipeline.project, pipeline.ref)}\">#{pipeline.ref}</a>")
- end
-
- context 'when ref contains malicious script' do
- let(:pipeline) { create(:ci_pipeline, ref: "<script>alter('1')</script>", project: project) }
-
- it 'does not include the malicious script' do
- is_expected.not_to include("<script>alter('1')</script>")
- end
- end
- end
-
- context 'when ref does not exist in the repository' do
- before do
- allow(pipeline).to receive(:ref_exists?) { false }
- end
-
- it 'returns a correct ref text' do
- is_expected.to eq("for <span class=\"ref-name\">#{pipeline.ref}</span>")
- end
-
- context 'when ref contains malicious script' do
- let(:pipeline) { create(:ci_pipeline, ref: "<script>alter('1')</script>", project: project) }
-
- it 'does not include the malicious script' do
- is_expected.not_to include("<script>alter('1')</script>")
- end
- end
- end
- end
- end
-
describe '#ref_text' do
subject { presenter.ref_text }
@@ -272,49 +209,6 @@ RSpec.describe Ci::PipelinePresenter do
end
end
- describe '#all_related_merge_request_text' do
- subject { presenter.all_related_merge_request_text }
-
- let_it_be(:mr_1) { create(:merge_request) }
- let_it_be(:mr_2) { create(:merge_request) }
-
- context 'with zero related merge requests (branch pipeline)' do
- it { is_expected.to eq('No related merge requests found.') }
- end
-
- context 'with one related merge request' do
- before do
- allow(pipeline).to receive(:all_merge_requests).and_return(MergeRequest.where(id: mr_1.id))
- end
-
- it {
- is_expected.to eq("1 related merge request: " \
- "<a class=\"mr-iid\" href=\"#{merge_request_path(mr_1)}\">#{mr_1.to_reference} #{mr_1.title}</a>")
- }
- end
-
- context 'with two related merge requests' do
- before do
- allow(pipeline).to receive(:all_merge_requests).and_return(MergeRequest.where(id: [mr_1.id, mr_2.id]))
- end
-
- it {
- is_expected.to eq("2 related merge requests: " \
- "<a class=\"mr-iid\" href=\"#{merge_request_path(mr_2)}\">#{mr_2.to_reference} #{mr_2.title}</a>, " \
- "<a class=\"mr-iid\" href=\"#{merge_request_path(mr_1)}\">#{mr_1.to_reference} #{mr_1.title}</a>")
- }
-
- context 'with a limit passed' do
- subject { presenter.all_related_merge_request_text(limit: 1) }
-
- it {
- is_expected.to eq("2 related merge requests: " \
- "<a class=\"mr-iid\" href=\"#{merge_request_path(mr_2)}\">#{mr_2.to_reference} #{mr_2.title}</a>")
- }
- end
- end
- end
-
describe '#all_related_merge_requests' do
subject(:all_related_merge_requests) do
presenter.send(:all_related_merge_requests)
diff --git a/spec/presenters/ml/models_index_presenter_spec.rb b/spec/presenters/ml/models_index_presenter_spec.rb
new file mode 100644
index 00000000000..697b57a51c1
--- /dev/null
+++ b/spec/presenters/ml/models_index_presenter_spec.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Ml::ModelsIndexPresenter, feature_category: :mlops do
+ let_it_be(:project) { build_stubbed(:project) }
+ let_it_be(:model1) { build_stubbed(:ml_model_package, project: project) }
+ let_it_be(:model2) { build_stubbed(:ml_model_package, project: project) }
+ let_it_be(:models) do
+ [model1, model2]
+ end
+
+ describe '#execute' do
+ subject { Gitlab::Json.parse(described_class.new(models).present)['models'] }
+
+ it 'presents models correctly' do
+ expected_models = [
+ {
+ 'name' => model1.name,
+ 'version' => model1.version,
+ 'path' => "/#{project.full_path}/-/packages/#{model1.id}"
+ },
+ {
+ 'name' => model2.name,
+ 'version' => model2.version,
+ 'path' => "/#{project.full_path}/-/packages/#{model2.id}"
+ }
+ ]
+
+ is_expected.to match_array(expected_models)
+ end
+ end
+end
diff --git a/spec/presenters/project_presenter_spec.rb b/spec/presenters/project_presenter_spec.rb
index b61847b37bb..42c43a59fe2 100644
--- a/spec/presenters/project_presenter_spec.rb
+++ b/spec/presenters/project_presenter_spec.rb
@@ -388,6 +388,35 @@ RSpec.describe ProjectPresenter do
end
end
+ describe '#terraform_states_anchor_data' do
+ using RSpec::Parameterized::TableSyntax
+
+ let(:anchor_goto_terraform) do
+ have_attributes(
+ is_link: true,
+ label: a_string_including(project.terraform_states.size.to_s),
+ link: presenter.project_terraform_index_path(project)
+ )
+ end
+
+ where(:terraform_states_exists, :can_read_terraform_state, :expected_result) do
+ true | true | ref(:anchor_goto_terraform)
+ true | false | nil
+ false | true | nil
+ false | false | nil
+ end
+
+ with_them do
+ before do
+ allow(project.terraform_states).to receive(:exists?).and_return(terraform_states_exists)
+ allow(presenter).to receive(:can?).with(user, :read_terraform_state,
+ project).and_return(can_read_terraform_state)
+ end
+
+ it { expect(presenter.terraform_states_anchor_data).to match(expected_result) }
+ end
+ end
+
describe '#tags_anchor_data' do
it 'returns tags data' do
expect(presenter.tags_anchor_data).to have_attributes(
diff --git a/spec/presenters/snippet_blob_presenter_spec.rb b/spec/presenters/snippet_blob_presenter_spec.rb
index d7f56c30b5e..cdd02241fbf 100644
--- a/spec/presenters/snippet_blob_presenter_spec.rb
+++ b/spec/presenters/snippet_blob_presenter_spec.rb
@@ -46,7 +46,7 @@ RSpec.describe SnippetBlobPresenter do
let(:file) { 'test.ipynb' }
it 'returns rich notebook content' do
- expect(subject.strip).to eq %Q(<div class="file-content" data-endpoint="#{data_endpoint_url}" data-relative-raw-path="#{data_raw_dir}" id="js-notebook-viewer"></div>)
+ expect(subject.strip).to eq %(<div class="file-content" data-endpoint="#{data_endpoint_url}" data-relative-raw-path="#{data_raw_dir}" id="js-notebook-viewer"></div>)
end
end
@@ -54,7 +54,7 @@ RSpec.describe SnippetBlobPresenter do
let(:file) { 'openapi.yml' }
it 'returns rich openapi content' do
- expect(subject).to eq %Q(<div class="file-content" data-endpoint="#{data_endpoint_url}" id="js-openapi-viewer"></div>\n)
+ expect(subject).to eq %(<div class="file-content" data-endpoint="#{data_endpoint_url}" id="js-openapi-viewer"></div>\n)
end
end
diff --git a/spec/requests/admin/users_controller_spec.rb b/spec/requests/admin/users_controller_spec.rb
index 5344a2c2bb7..21cf8ab2c79 100644
--- a/spec/requests/admin/users_controller_spec.rb
+++ b/spec/requests/admin/users_controller_spec.rb
@@ -6,12 +6,12 @@ RSpec.describe Admin::UsersController, :enable_admin_mode, feature_category: :us
let_it_be(:admin) { create(:admin) }
let_it_be(:user) { create(:user) }
+ before do
+ sign_in(admin)
+ end
+
describe 'PUT #block' do
context 'when request format is :json' do
- before do
- sign_in(admin)
- end
-
subject(:request) { put block_admin_user_path(user, format: :json) }
context 'when user was blocked' do
@@ -39,4 +39,16 @@ RSpec.describe Admin::UsersController, :enable_admin_mode, feature_category: :us
end
end
end
+
+ describe 'PUT #unlock' do
+ before do
+ user.lock_access!
+ end
+
+ subject(:request) { put unlock_admin_user_path(user) }
+
+ it 'unlocks the user' do
+ expect { request }.to change { user.reload.access_locked? }.from(true).to(false)
+ end
+ end
end
diff --git a/spec/requests/api/admin/instance_clusters_spec.rb b/spec/requests/api/admin/instance_clusters_spec.rb
index f2e62533b78..6fad020150c 100644
--- a/spec/requests/api/admin/instance_clusters_spec.rb
+++ b/spec/requests/api/admin/instance_clusters_spec.rb
@@ -363,7 +363,7 @@ RSpec.describe ::API::Admin::InstanceClusters, feature_category: :deployment_man
end
it 'returns validation error' do
- expect(json_response['message']['platform_kubernetes.base'].first).to eq(_('Cannot modify managed Kubernetes cluster'))
+ expect(json_response['message']['platform_kubernetes'].first).to eq(_('Cannot modify managed Kubernetes cluster'))
end
end
diff --git a/spec/requests/api/admin/plan_limits_spec.rb b/spec/requests/api/admin/plan_limits_spec.rb
index cad1111b76b..97eb8a2b13f 100644
--- a/spec/requests/api/admin/plan_limits_spec.rb
+++ b/spec/requests/api/admin/plan_limits_spec.rb
@@ -26,6 +26,7 @@ RSpec.describe API::Admin::PlanLimits, 'PlanLimits', feature_category: :shared d
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)
+ expect(json_response['limits_history']).to eq(Plan.default.actual_limits.limits_history)
expect(json_response['maven_max_file_size']).to eq(Plan.default.actual_limits.maven_max_file_size)
expect(json_response['npm_max_file_size']).to eq(Plan.default.actual_limits.npm_max_file_size)
expect(json_response['nuget_max_file_size']).to eq(Plan.default.actual_limits.nuget_max_file_size)
@@ -86,7 +87,9 @@ RSpec.describe API::Admin::PlanLimits, 'PlanLimits', feature_category: :shared d
let(:params) { { 'plan_name': 'default' } }
end
- context 'as an admin user' do
+ context 'as an admin user', :freeze_time do
+ let(:current_timestamp) { Time.current.utc.to_i }
+
context 'correct params' do
it 'updates multiple plan limits', :aggregate_failures do
put api(path, admin, admin_mode: true), params: {
@@ -124,6 +127,11 @@ RSpec.describe API::Admin::PlanLimits, 'PlanLimits', feature_category: :shared d
expect(json_response['enforcement_limit']).to eq(15)
expect(json_response['generic_packages_max_file_size']).to eq(20)
expect(json_response['helm_max_file_size']).to eq(25)
+ expect(json_response['limits_history']).to eq(
+ { "enforcement_limit" => [{ "user_id" => admin.id, "username" => admin.username, "timestamp" => current_timestamp, "value" => 15 }],
+ "notification_limit" => [{ "user_id" => admin.id, "username" => admin.username, "timestamp" => current_timestamp, "value" => 90 }],
+ "storage_size_limit" => [{ "user_id" => admin.id, "username" => admin.username, "timestamp" => current_timestamp, "value" => 80 }] }
+ )
expect(json_response['maven_max_file_size']).to eq(30)
expect(json_response['notification_limit']).to eq(90)
expect(json_response['npm_max_file_size']).to eq(40)
diff --git a/spec/requests/api/ci/job_artifacts_spec.rb b/spec/requests/api/ci/job_artifacts_spec.rb
index 7cea744cdb9..6f4e7fd66ed 100644
--- a/spec/requests/api/ci/job_artifacts_spec.rb
+++ b/spec/requests/api/ci/job_artifacts_spec.rb
@@ -541,7 +541,7 @@ RSpec.describe API::Ci::JobArtifacts, feature_category: :build_artifacts do
let(:download_headers) do
{ 'Content-Transfer-Encoding' => 'binary',
'Content-Disposition' =>
- %Q(attachment; filename="#{job_with_artifacts.artifacts_file.filename}"; filename*=UTF-8''#{job.artifacts_file.filename}) }
+ %(attachment; filename="#{job_with_artifacts.artifacts_file.filename}"; filename*=UTF-8''#{job.artifacts_file.filename}) }
end
it { expect(response).to have_gitlab_http_status(:ok) }
diff --git a/spec/requests/api/ci/pipeline_schedules_spec.rb b/spec/requests/api/ci/pipeline_schedules_spec.rb
index d760e4ddf28..d5f60e62b06 100644
--- a/spec/requests/api/ci/pipeline_schedules_spec.rb
+++ b/spec/requests/api/ci/pipeline_schedules_spec.rb
@@ -311,7 +311,8 @@ RSpec.describe API::Ci::PipelineSchedules, feature_category: :continuous_integra
end
end
- describe 'POST /projects/:id/pipeline_schedules' do
+ # Move this from `shared_context` to `describe` when `ci_refactoring_pipeline_schedule_create_service` is removed.
+ shared_context 'POST /projects/:id/pipeline_schedules' do # rubocop:disable RSpec/ContextWording
let(:params) { attributes_for(:ci_pipeline_schedule) }
context 'authenticated user with valid permissions' do
@@ -368,7 +369,8 @@ RSpec.describe API::Ci::PipelineSchedules, feature_category: :continuous_integra
end
end
- describe 'PUT /projects/:id/pipeline_schedules/:pipeline_schedule_id' do
+ # Move this from `shared_context` to `describe` when `ci_refactoring_pipeline_schedule_create_service` is removed.
+ shared_context 'PUT /projects/:id/pipeline_schedules/:pipeline_schedule_id' do
let(:pipeline_schedule) do
create(:ci_pipeline_schedule, project: project, owner: developer)
end
@@ -437,6 +439,18 @@ RSpec.describe API::Ci::PipelineSchedules, feature_category: :continuous_integra
end
end
+ it_behaves_like 'POST /projects/:id/pipeline_schedules'
+ it_behaves_like 'PUT /projects/:id/pipeline_schedules/:pipeline_schedule_id'
+
+ context 'when the FF ci_refactoring_pipeline_schedule_create_service is disabled' do
+ before do
+ stub_feature_flags(ci_refactoring_pipeline_schedule_create_service: false)
+ end
+
+ it_behaves_like 'POST /projects/:id/pipeline_schedules'
+ it_behaves_like 'PUT /projects/:id/pipeline_schedules/:pipeline_schedule_id'
+ end
+
describe 'POST /projects/:id/pipeline_schedules/:pipeline_schedule_id/take_ownership' do
let(:pipeline_schedule) do
create(:ci_pipeline_schedule, project: project, owner: developer)
diff --git a/spec/requests/api/ci/variables_spec.rb b/spec/requests/api/ci/variables_spec.rb
index e937c4c2b8f..a1446e1040e 100644
--- a/spec/requests/api/ci/variables_spec.rb
+++ b/spec/requests/api/ci/variables_spec.rb
@@ -48,6 +48,7 @@ RSpec.describe API::Ci::Variables, feature_category: :secrets_management do
expect(json_response['masked']).to eq(variable.masked?)
expect(json_response['raw']).to eq(variable.raw?)
expect(json_response['variable_type']).to eq('env_var')
+ expect(json_response['description']).to be_nil
end
it 'responds with 404 Not Found if requesting non-existing variable' do
@@ -140,7 +141,7 @@ RSpec.describe API::Ci::Variables, feature_category: :secrets_management do
it 'creates variable with optional attributes' do
expect do
- post api("/projects/#{project.id}/variables", user), params: { variable_type: 'file', key: 'TEST_VARIABLE_2', value: 'VALUE_2' }
+ post api("/projects/#{project.id}/variables", user), params: { variable_type: 'file', key: 'TEST_VARIABLE_2', value: 'VALUE_2', description: 'description' }
end.to change { project.variables.count }.by(1)
expect(response).to have_gitlab_http_status(:created)
@@ -150,6 +151,7 @@ RSpec.describe API::Ci::Variables, feature_category: :secrets_management do
expect(json_response['masked']).to be_falsey
expect(json_response['raw']).to be_falsey
expect(json_response['variable_type']).to eq('file')
+ expect(json_response['description']).to eq('description')
end
it 'does not allow to duplicate variable key' do
@@ -226,7 +228,7 @@ RSpec.describe API::Ci::Variables, feature_category: :secrets_management do
initial_variable = project.variables.reload.first
value_before = initial_variable.value
- put api("/projects/#{project.id}/variables/#{variable.key}", user), params: { variable_type: 'file', value: 'VALUE_1_UP', protected: true }
+ put api("/projects/#{project.id}/variables/#{variable.key}", user), params: { variable_type: 'file', value: 'VALUE_1_UP', protected: true, description: 'updated' }
updated_variable = project.variables.reload.first
@@ -235,6 +237,7 @@ RSpec.describe API::Ci::Variables, feature_category: :secrets_management do
expect(updated_variable.value).to eq('VALUE_1_UP')
expect(updated_variable).to be_protected
expect(updated_variable.variable_type).to eq('file')
+ expect(updated_variable.description).to eq('updated')
end
it 'masks the new value when logging' do
diff --git a/spec/requests/api/container_repositories_spec.rb b/spec/requests/api/container_repositories_spec.rb
index 4c1e52df4fc..605fa0d92f6 100644
--- a/spec/requests/api/container_repositories_spec.rb
+++ b/spec/requests/api/container_repositories_spec.rb
@@ -119,7 +119,7 @@ RSpec.describe API::ContainerRepositories, feature_category: :container_registry
let(:created_at) { ::ContainerRepository::MIGRATION_PHASE_1_STARTED_AT + 3.months }
before do
- allow(::Gitlab).to receive(:com?).and_return(on_com)
+ allow(::Gitlab).to receive(:com_except_jh?).and_return(on_com)
repository.update_column(:created_at, created_at)
end
diff --git a/spec/requests/api/debian_group_packages_spec.rb b/spec/requests/api/debian_group_packages_spec.rb
index 9c726e5a5f7..25b99862100 100644
--- a/spec/requests/api/debian_group_packages_spec.rb
+++ b/spec/requests/api/debian_group_packages_spec.rb
@@ -6,48 +6,28 @@ RSpec.describe API::DebianGroupPackages, feature_category: :package_registry do
include WorkhorseHelpers
include_context 'Debian repository shared context', :group, false do
- shared_examples 'a Debian package tracking event' do |action|
- include_context 'Debian repository access', :public, :developer, :basic do
- let(:snowplow_gitlab_standard_context) do
- { project: nil, namespace: container, user: user, property: 'i_package_debian_user' }
- end
-
- it_behaves_like 'a package tracking event', described_class.name, action
- end
- end
-
- shared_examples 'not a Debian package tracking event' do
- include_context 'Debian repository access', :public, :developer, :basic do
- it_behaves_like 'not a package tracking event', described_class.name, /.*/
- end
- end
-
context 'with invalid parameter' do
let(:url) { "/groups/1/-/packages/debian/dists/with+space/InRelease" }
it_behaves_like 'Debian packages GET request', :bad_request, /^distribution is invalid$/
- it_behaves_like 'not a Debian package tracking event'
end
describe 'GET groups/:id/-/packages/debian/dists/*distribution/Release.gpg' do
let(:url) { "/groups/#{container.id}/-/packages/debian/dists/#{distribution.codename}/Release.gpg" }
it_behaves_like 'Debian packages read endpoint', 'GET', :success, /^-----BEGIN PGP SIGNATURE-----/
- it_behaves_like 'not a Debian package tracking event'
end
describe 'GET groups/:id/-/packages/debian/dists/*distribution/Release' do
let(:url) { "/groups/#{container.id}/-/packages/debian/dists/#{distribution.codename}/Release" }
it_behaves_like 'Debian packages read endpoint', 'GET', :success, /^Codename: fixture-distribution\n$/
- it_behaves_like 'a Debian package tracking event', 'list_package'
end
describe 'GET groups/:id/-/packages/debian/dists/*distribution/InRelease' do
let(:url) { "/groups/#{container.id}/-/packages/debian/dists/#{distribution.codename}/InRelease" }
it_behaves_like 'Debian packages read endpoint', 'GET', :success, /^-----BEGIN PGP SIGNED MESSAGE-----/
- it_behaves_like 'a Debian package tracking event', 'list_package'
end
describe 'GET groups/:id/-/packages/debian/dists/*distribution/:component/binary-:architecture/Packages' do
@@ -56,14 +36,12 @@ RSpec.describe API::DebianGroupPackages, feature_category: :package_registry do
let(:url) { "/groups/#{container.id}/-/packages/debian/dists/#{distribution.codename}/#{target_component_name}/binary-#{architecture.name}/Packages" }
it_behaves_like 'Debian packages index endpoint', /Description: This is an incomplete Packages file/
- it_behaves_like 'a Debian package tracking event', 'list_package'
end
describe 'GET groups/:id/-/packages/debian/dists/*distribution/:component/binary-:architecture/Packages.gz' do
let(:url) { "/groups/#{container.id}/-/packages/debian/dists/#{distribution.codename}/#{component.name}/binary-#{architecture.name}/Packages.gz" }
it_behaves_like 'Debian packages read endpoint', 'GET', :not_found, /Format gz is not supported/
- it_behaves_like 'not a Debian package tracking event'
end
describe 'GET groups/:id/-/packages/debian/dists/*distribution/:component/binary-:architecture/by-hash/SHA256/:file_sha256' do
@@ -73,7 +51,6 @@ RSpec.describe API::DebianGroupPackages, feature_category: :package_registry do
let(:url) { "/groups/#{container.id}/-/packages/debian/dists/#{distribution.codename}/#{target_component_name}/binary-#{architecture.name}/by-hash/SHA256/#{target_sha256}" }
it_behaves_like 'Debian packages index sha256 endpoint', /^Other SHA256$/
- it_behaves_like 'a Debian package tracking event', 'list_package'
end
describe 'GET groups/:id/-/packages/debian/dists/*distribution/:component/source/Sources' do
@@ -82,7 +59,6 @@ RSpec.describe API::DebianGroupPackages, feature_category: :package_registry do
let(:url) { "/groups/#{container.id}/-/packages/debian/dists/#{distribution.codename}/#{target_component_name}/source/Sources" }
it_behaves_like 'Debian packages index endpoint', /^Description: This is an incomplete Sources file$/
- it_behaves_like 'a Debian package tracking event', 'list_package'
end
describe 'GET groups/:id/-/packages/debian/dists/*distribution/:component/source/by-hash/SHA256/:file_sha256' do
@@ -92,7 +68,6 @@ RSpec.describe API::DebianGroupPackages, feature_category: :package_registry do
let(:url) { "/groups/#{container.id}/-/packages/debian/dists/#{distribution.codename}/#{target_component_name}/source/by-hash/SHA256/#{target_sha256}" }
it_behaves_like 'Debian packages index sha256 endpoint', /^Other SHA256$/
- it_behaves_like 'a Debian package tracking event', 'list_package'
end
describe 'GET groups/:id/-/packages/debian/dists/*distribution/:component/debian-installer/binary-:architecture/Packages' do
@@ -101,14 +76,12 @@ RSpec.describe API::DebianGroupPackages, feature_category: :package_registry do
let(:url) { "/groups/#{container.id}/-/packages/debian/dists/#{distribution.codename}/#{target_component_name}/debian-installer/binary-#{architecture.name}/Packages" }
it_behaves_like 'Debian packages index endpoint', /Description: This is an incomplete D-I Packages file/
- it_behaves_like 'a Debian package tracking event', 'list_package'
end
describe 'GET groups/:id/-/packages/debian/dists/*distribution/:component/debian-installer/binary-:architecture/Packages.gz' do
let(:url) { "/groups/#{container.id}/-/packages/debian/dists/#{distribution.codename}/#{component.name}/debian-installer/binary-#{architecture.name}/Packages.gz" }
it_behaves_like 'Debian packages read endpoint', 'GET', :not_found, /Format gz is not supported/
- it_behaves_like 'not a Debian package tracking event'
end
describe 'GET groups/:id/-/packages/debian/dists/*distribution/:component/debian-installer/binary-:architecture/by-hash/SHA256/:file_sha256' do
@@ -118,7 +91,6 @@ RSpec.describe API::DebianGroupPackages, feature_category: :package_registry do
let(:url) { "/groups/#{container.id}/-/packages/debian/dists/#{distribution.codename}/#{target_component_name}/debian-installer/binary-#{architecture.name}/by-hash/SHA256/#{target_sha256}" }
it_behaves_like 'Debian packages index sha256 endpoint', /^Other SHA256$/
- it_behaves_like 'a Debian package tracking event', 'list_package'
end
describe 'GET groups/:id/-/packages/debian/pool/:codename/:project_id/:letter/:package_name/:package_version/:file_name' do
@@ -139,7 +111,6 @@ RSpec.describe API::DebianGroupPackages, feature_category: :package_registry do
with_them do
it_behaves_like 'Debian packages read endpoint', 'GET', :success, params[:success_body]
- it_behaves_like 'a Debian package tracking event', 'pull_package'
context 'for bumping last downloaded at' do
include_context 'Debian repository access', :public, :developer, :basic do
diff --git a/spec/requests/api/debian_project_packages_spec.rb b/spec/requests/api/debian_project_packages_spec.rb
index b1566860ffc..7f3f633a35c 100644
--- a/spec/requests/api/debian_project_packages_spec.rb
+++ b/spec/requests/api/debian_project_packages_spec.rb
@@ -7,22 +7,6 @@ RSpec.describe API::DebianProjectPackages, feature_category: :package_registry d
include WorkhorseHelpers
include_context 'Debian repository shared context', :project, false do
- shared_examples 'a Debian package tracking event' do |action|
- include_context 'Debian repository access', :public, :developer, :basic do
- let(:snowplow_gitlab_standard_context) do
- { project: container, namespace: container.namespace, user: user, property: 'i_package_debian_user' }
- end
-
- it_behaves_like 'a package tracking event', described_class.name, action
- end
- end
-
- shared_examples 'not a Debian package tracking event' do
- include_context 'Debian repository access', :public, :developer, :basic do
- it_behaves_like 'not a package tracking event', described_class.name, /.*/
- end
- end
-
shared_examples 'accept GET request on private project with access to package registry for everyone' do
include_context 'Debian repository access', :private, :anonymous, :basic do
before do
@@ -37,14 +21,12 @@ RSpec.describe API::DebianProjectPackages, feature_category: :package_registry d
let(:url) { "/projects/1/packages/debian/dists/with+space/InRelease" }
it_behaves_like 'Debian packages GET request', :bad_request, /^distribution is invalid$/
- it_behaves_like 'not a Debian package tracking event'
end
describe 'GET projects/:id/packages/debian/dists/*distribution/Release.gpg' do
let(:url) { "/projects/#{container.id}/packages/debian/dists/#{distribution.codename}/Release.gpg" }
it_behaves_like 'Debian packages read endpoint', 'GET', :success, /^-----BEGIN PGP SIGNATURE-----/
- it_behaves_like 'not a Debian package tracking event'
it_behaves_like 'accept GET request on private project with access to package registry for everyone'
end
@@ -52,7 +34,6 @@ RSpec.describe API::DebianProjectPackages, feature_category: :package_registry d
let(:url) { "/projects/#{container.id}/packages/debian/dists/#{distribution.codename}/Release" }
it_behaves_like 'Debian packages read endpoint', 'GET', :success, /^Codename: fixture-distribution\n$/
- it_behaves_like 'a Debian package tracking event', 'list_package'
it_behaves_like 'accept GET request on private project with access to package registry for everyone'
end
@@ -60,7 +41,6 @@ RSpec.describe API::DebianProjectPackages, feature_category: :package_registry d
let(:url) { "/projects/#{container.id}/packages/debian/dists/#{distribution.codename}/InRelease" }
it_behaves_like 'Debian packages read endpoint', 'GET', :success, /^-----BEGIN PGP SIGNED MESSAGE-----/
- it_behaves_like 'a Debian package tracking event', 'list_package'
it_behaves_like 'accept GET request on private project with access to package registry for everyone'
end
@@ -70,7 +50,6 @@ RSpec.describe API::DebianProjectPackages, feature_category: :package_registry d
let(:url) { "/projects/#{container.id}/packages/debian/dists/#{distribution.codename}/#{target_component_name}/binary-#{architecture.name}/Packages" }
it_behaves_like 'Debian packages index endpoint', /Description: This is an incomplete Packages file/
- it_behaves_like 'a Debian package tracking event', 'list_package'
it_behaves_like 'accept GET request on private project with access to package registry for everyone'
end
@@ -78,7 +57,6 @@ RSpec.describe API::DebianProjectPackages, feature_category: :package_registry d
let(:url) { "/projects/#{container.id}/packages/debian/dists/#{distribution.codename}/#{component.name}/binary-#{architecture.name}/Packages.gz" }
it_behaves_like 'Debian packages read endpoint', 'GET', :not_found, /Format gz is not supported/
- it_behaves_like 'not a Debian package tracking event'
end
describe 'GET projects/:id/packages/debian/dists/*distribution/:component/binary-:architecture/by-hash/SHA256/:file_sha256' do
@@ -88,7 +66,6 @@ RSpec.describe API::DebianProjectPackages, feature_category: :package_registry d
let(:url) { "/projects/#{container.id}/packages/debian/dists/#{distribution.codename}/#{target_component_name}/binary-#{architecture.name}/by-hash/SHA256/#{target_sha256}" }
it_behaves_like 'Debian packages index sha256 endpoint', /^Other SHA256$/
- it_behaves_like 'a Debian package tracking event', 'list_package'
it_behaves_like 'accept GET request on private project with access to package registry for everyone'
end
@@ -98,7 +75,6 @@ RSpec.describe API::DebianProjectPackages, feature_category: :package_registry d
let(:url) { "/projects/#{container.id}/packages/debian/dists/#{distribution.codename}/#{target_component_name}/source/Sources" }
it_behaves_like 'Debian packages index endpoint', /^Description: This is an incomplete Sources file$/
- it_behaves_like 'a Debian package tracking event', 'list_package'
it_behaves_like 'accept GET request on private project with access to package registry for everyone'
end
@@ -109,7 +85,6 @@ RSpec.describe API::DebianProjectPackages, feature_category: :package_registry d
let(:url) { "/projects/#{container.id}/packages/debian/dists/#{distribution.codename}/#{target_component_name}/source/by-hash/SHA256/#{target_sha256}" }
it_behaves_like 'Debian packages index sha256 endpoint', /^Other SHA256$/
- it_behaves_like 'a Debian package tracking event', 'list_package'
it_behaves_like 'accept GET request on private project with access to package registry for everyone'
end
@@ -119,7 +94,6 @@ RSpec.describe API::DebianProjectPackages, feature_category: :package_registry d
let(:url) { "/projects/#{container.id}/packages/debian/dists/#{distribution.codename}/#{target_component_name}/debian-installer/binary-#{architecture.name}/Packages" }
it_behaves_like 'Debian packages index endpoint', /Description: This is an incomplete D-I Packages file/
- it_behaves_like 'a Debian package tracking event', 'list_package'
it_behaves_like 'accept GET request on private project with access to package registry for everyone'
end
@@ -127,7 +101,6 @@ RSpec.describe API::DebianProjectPackages, feature_category: :package_registry d
let(:url) { "/projects/#{container.id}/packages/debian/dists/#{distribution.codename}/#{component.name}/debian-installer/binary-#{architecture.name}/Packages.gz" }
it_behaves_like 'Debian packages read endpoint', 'GET', :not_found, /Format gz is not supported/
- it_behaves_like 'not a Debian package tracking event'
end
describe 'GET projects/:id/packages/debian/dists/*distribution/:component/debian-installer/binary-:architecture/by-hash/SHA256/:file_sha256' do
@@ -137,7 +110,6 @@ RSpec.describe API::DebianProjectPackages, feature_category: :package_registry d
let(:url) { "/projects/#{container.id}/packages/debian/dists/#{distribution.codename}/#{target_component_name}/debian-installer/binary-#{architecture.name}/by-hash/SHA256/#{target_sha256}" }
it_behaves_like 'Debian packages index sha256 endpoint', /^Other SHA256$/
- it_behaves_like 'a Debian package tracking event', 'list_package'
it_behaves_like 'accept GET request on private project with access to package registry for everyone'
end
@@ -159,7 +131,6 @@ RSpec.describe API::DebianProjectPackages, feature_category: :package_registry d
with_them do
it_behaves_like 'Debian packages read endpoint', 'GET', :success, params[:success_body]
- it_behaves_like 'a Debian package tracking event', 'pull_package'
context 'for bumping last downloaded at' do
include_context 'Debian repository access', :public, :developer, :basic do
@@ -182,13 +153,11 @@ RSpec.describe API::DebianProjectPackages, feature_category: :package_registry d
it_behaves_like 'Debian packages write endpoint', 'upload', :created, nil
it_behaves_like 'Debian packages endpoint catching ObjectStorage::RemoteStoreError'
- it_behaves_like 'a Debian package tracking event', 'push_package'
context 'with codename and component' do
let(:extra_params) { { distribution: distribution.codename, component: 'main' } }
it_behaves_like 'Debian packages write endpoint', 'upload', :created, nil
- it_behaves_like 'a Debian package tracking event', 'push_package'
end
context 'with codename and without component' do
@@ -197,8 +166,6 @@ RSpec.describe API::DebianProjectPackages, feature_category: :package_registry d
include_context 'Debian repository access', :public, :developer, :basic do
it_behaves_like 'Debian packages GET request', :bad_request, /component is missing/
end
-
- it_behaves_like 'not a Debian package tracking event'
end
end
@@ -209,8 +176,6 @@ RSpec.describe API::DebianProjectPackages, feature_category: :package_registry d
it_behaves_like "Debian packages upload request", :created, nil
end
- it_behaves_like 'a Debian package tracking event', 'push_package'
-
context 'with codename and component' do
let(:extra_params) { { distribution: distribution.codename, component: 'main' } }
@@ -218,8 +183,6 @@ RSpec.describe API::DebianProjectPackages, feature_category: :package_registry d
it_behaves_like "Debian packages upload request", :bad_request,
/^file_name Only debs, udebs and ddebs can be directly added to a distribution$/
end
-
- it_behaves_like 'not a Debian package tracking event'
end
end
@@ -227,7 +190,6 @@ RSpec.describe API::DebianProjectPackages, feature_category: :package_registry d
let(:file_name) { 'sample_1.2.3~alpha2_amd64.changes' }
it_behaves_like 'Debian packages write endpoint', 'upload', :created, nil
- it_behaves_like 'a Debian package tracking event', 'push_package'
end
end
@@ -237,7 +199,6 @@ RSpec.describe API::DebianProjectPackages, feature_category: :package_registry d
let(:url) { "/projects/#{container.id}/packages/debian/#{file_name}/authorize" }
it_behaves_like 'Debian packages write endpoint', 'upload authorize', :created, nil
- it_behaves_like 'not a Debian package tracking event'
end
end
end
diff --git a/spec/requests/api/deployments_spec.rb b/spec/requests/api/deployments_spec.rb
index d7056adfcb6..82ac2eed83d 100644
--- a/spec/requests/api/deployments_spec.rb
+++ b/spec/requests/api/deployments_spec.rb
@@ -424,7 +424,7 @@ RSpec.describe API::Deployments, feature_category: :continuous_delivery do
)
expect(response).to have_gitlab_http_status(:bad_request)
- expect(json_response['message']['status']).to include(%Q{cannot transition via \"run\"})
+ expect(json_response['message']['status']).to include(%{cannot transition via \"run\"})
end
it 'links merge requests when the deployment status changes to success', :sidekiq_inline do
diff --git a/spec/requests/api/discussions_spec.rb b/spec/requests/api/discussions_spec.rb
index c5126dbd1c2..a65dc6e0175 100644
--- a/spec/requests/api/discussions_spec.rb
+++ b/spec/requests/api/discussions_spec.rb
@@ -30,7 +30,7 @@ RSpec.describe API::Discussions, feature_category: :team_planning do
end
context 'when noteable is a WorkItem' do
- let!(:work_item) { create(:work_item, :issue, project: project, author: user) }
+ let!(:work_item) { create(:work_item, project: project, author: user) }
let!(:work_item_note) { create(:discussion_note_on_issue, noteable: work_item, project: project, author: user) }
let(:parent) { project }
diff --git a/spec/requests/api/environments_spec.rb b/spec/requests/api/environments_spec.rb
index 9a435b3bce9..498e030da0b 100644
--- a/spec/requests/api/environments_spec.rb
+++ b/spec/requests/api/environments_spec.rb
@@ -31,6 +31,14 @@ RSpec.describe API::Environments, feature_category: :continuous_delivery do
expect(json_response.first).not_to have_key('last_deployment')
end
+ it 'returns 200 HTTP status when using JOB-TOKEN auth' do
+ job = create(:ci_build, :running, project: project, user: user)
+
+ get api("/projects/#{project.id}/environments"), params: { job_token: job.token }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+
context 'when filtering' do
let_it_be(:stopped_environment) { create(:environment, :stopped, project: project) }
@@ -132,6 +140,14 @@ RSpec.describe API::Environments, feature_category: :continuous_delivery do
expect(json_response['external']).to be nil
end
+ it 'returns 200 HTTP status when using JOB-TOKEN auth' do
+ job = create(:ci_build, :running, project: project, user: user)
+
+ post api("/projects/#{project.id}/environments"), params: { name: "mepmep", job_token: job.token }
+
+ expect(response).to have_gitlab_http_status(:created)
+ end
+
it 'requires name to be passed' do
post api("/projects/#{project.id}/environments", user), params: { external_url: 'test.gitlab.com' }
@@ -173,6 +189,15 @@ RSpec.describe API::Environments, feature_category: :continuous_delivery do
expect(response).to have_gitlab_http_status(:ok)
end
+ it 'returns 200 HTTP status when using JOB-TOKEN auth' do
+ job = create(:ci_build, :running, project: project, user: user)
+
+ post api("/projects/#{project.id}/environments/stop_stale"),
+ params: { before: 1.week.ago.to_date.to_s, job_token: job.token }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+
it 'returns a 400 for bad input date' do
post api("/projects/#{project.id}/environments/stop_stale", user), params: { before: 1.day.ago.to_date.to_s }
@@ -229,6 +254,15 @@ RSpec.describe API::Environments, feature_category: :continuous_delivery do
expect(json_response['tier']).to eq('production')
end
+ it 'returns 200 HTTP status when using JOB-TOKEN auth' do
+ job = create(:ci_build, :running, project: project, user: user)
+
+ put api("/projects/#{project.id}/environments/#{environment.id}"),
+ params: { tier: 'production', job_token: job.token }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+
it "won't allow slug to be changed" do
slug = environment.slug
api_url = api("/projects/#{project.id}/environments/#{environment.id}", user)
@@ -261,6 +295,17 @@ RSpec.describe API::Environments, feature_category: :continuous_delivery do
expect(response).to have_gitlab_http_status(:no_content)
end
+ it 'returns 204 HTTP status when using JOB-TOKEN auth' do
+ environment.stop
+
+ job = create(:ci_build, :running, project: project, user: user)
+
+ delete api("/projects/#{project.id}/environments/#{environment.id}"),
+ params: { job_token: job.token }
+
+ expect(response).to have_gitlab_http_status(:no_content)
+ end
+
it 'returns a 404 for non existing id' do
delete api("/projects/#{project.id}/environments/#{non_existing_record_id}", user)
@@ -291,17 +336,23 @@ RSpec.describe API::Environments, feature_category: :continuous_delivery do
context 'with a stoppable environment' do
before do
environment.update!(state: :available)
-
- post api("/projects/#{project.id}/environments/#{environment.id}/stop", user)
end
it 'returns a 200' do
+ post api("/projects/#{project.id}/environments/#{environment.id}/stop", user)
+
expect(response).to have_gitlab_http_status(:ok)
expect(response).to match_response_schema('public_api/v4/environment')
+ expect(environment.reload).to be_stopped
end
- it 'actually stops the environment' do
- expect(environment.reload).to be_stopped
+ it 'returns 200 HTTP status when using JOB-TOKEN auth' do
+ job = create(:ci_build, :running, project: project, user: user)
+
+ post api("/projects/#{project.id}/environments/#{environment.id}/stop"),
+ params: { job_token: job.token }
+
+ expect(response).to have_gitlab_http_status(:ok)
end
end
@@ -333,6 +384,15 @@ RSpec.describe API::Environments, feature_category: :continuous_delivery do
expect(response).to match_response_schema('public_api/v4/environment')
expect(json_response['last_deployment']).to be_present
end
+
+ it 'returns 200 HTTP status when using JOB-TOKEN auth' do
+ job = create(:ci_build, :running, project: project, user: user)
+
+ get api("/projects/#{project.id}/environments/#{environment.id}"),
+ params: { job_token: job.token }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
end
context 'as non member' do
diff --git a/spec/requests/api/error_tracking/project_settings_spec.rb b/spec/requests/api/error_tracking/project_settings_spec.rb
index bde90627983..93ad0233ca3 100644
--- a/spec/requests/api/error_tracking/project_settings_spec.rb
+++ b/spec/requests/api/error_tracking/project_settings_spec.rb
@@ -3,10 +3,20 @@
require 'spec_helper'
RSpec.describe API::ErrorTracking::ProjectSettings, feature_category: :error_tracking do
- let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project) }
let_it_be(:setting) { create(:project_error_tracking_setting, project: project) }
let_it_be(:project_without_setting) { create(:project) }
+ let_it_be(:developer) { create(:user) }
+ let_it_be(:maintainer) { create(:user) }
+ let_it_be(:non_member) { create(:user) }
+ let(:user) { maintainer }
+
+ before_all do
+ project.add_developer(developer)
+ project.add_maintainer(maintainer)
+ project_without_setting.add_developer(developer)
+ project_without_setting.add_maintainer(maintainer)
+ end
shared_examples 'returns project settings' do
it 'returns correct project settings' do
@@ -108,10 +118,6 @@ RSpec.describe API::ErrorTracking::ProjectSettings, feature_category: :error_tra
end
context 'when authenticated as maintainer' do
- before do
- project.add_maintainer(user)
- end
-
context 'with integrated_error_tracking feature enabled' do
it_behaves_like 'returns project settings'
end
@@ -179,10 +185,6 @@ RSpec.describe API::ErrorTracking::ProjectSettings, feature_category: :error_tra
context 'without a project setting' do
let(:project) { project_without_setting }
- before do
- project.add_maintainer(user)
- end
-
it_behaves_like 'returns no project settings'
end
@@ -208,14 +210,14 @@ RSpec.describe API::ErrorTracking::ProjectSettings, feature_category: :error_tra
end
context 'when authenticated as developer' do
- before do
- project.add_developer(user)
- end
+ let(:user) { developer }
it_behaves_like 'returns 403'
end
context 'when authenticated as non-member' do
+ let(:user) { non_member }
+
it_behaves_like 'returns 404'
end
@@ -232,10 +234,6 @@ RSpec.describe API::ErrorTracking::ProjectSettings, feature_category: :error_tra
end
context 'when authenticated as maintainer' do
- before do
- project.add_maintainer(user)
- end
-
it_behaves_like 'returns project settings'
context 'when integrated_error_tracking feature disabled' do
@@ -250,22 +248,18 @@ RSpec.describe API::ErrorTracking::ProjectSettings, feature_category: :error_tra
context 'without a project setting' do
let(:project) { project_without_setting }
- before do
- project.add_maintainer(user)
- end
-
it_behaves_like 'returns no project settings'
end
context 'when authenticated as developer' do
- before do
- project.add_developer(user)
- end
+ let(:user) { developer }
it_behaves_like 'returns 403'
end
context 'when authenticated as non-member' do
+ let(:user) { non_member }
+
it_behaves_like 'returns 404'
end
@@ -287,14 +281,8 @@ RSpec.describe API::ErrorTracking::ProjectSettings, feature_category: :error_tra
context 'when authenticated' do
context 'as maintainer' do
- before do
- project.add_maintainer(user)
- end
-
context "when integrated" do
context "with existing setting" do
- let(:project) { setting.project }
- let(:setting) { create(:project_error_tracking_setting, :integrated) }
let(:active) { false }
it "updates a setting" do
@@ -302,13 +290,7 @@ RSpec.describe API::ErrorTracking::ProjectSettings, feature_category: :error_tra
expect(response).to have_gitlab_http_status(:ok)
- expect(json_response).to eq(
- "active" => false,
- "api_url" => nil,
- "integrated" => integrated,
- "project_name" => nil,
- "sentry_external_url" => nil
- )
+ expect(json_response).to include("integrated" => true)
end
end
@@ -366,14 +348,14 @@ RSpec.describe API::ErrorTracking::ProjectSettings, feature_category: :error_tra
end
context "as developer" do
- before do
- project.add_developer(user)
- end
+ let(:user) { developer }
it_behaves_like 'returns 403'
end
context 'as non-member' do
+ let(:user) { non_member }
+
it_behaves_like 'returns 404'
end
end
diff --git a/spec/requests/api/files_spec.rb b/spec/requests/api/files_spec.rb
index ed84e3e5f48..ea341703301 100644
--- a/spec/requests/api/files_spec.rb
+++ b/spec/requests/api/files_spec.rb
@@ -141,11 +141,9 @@ RSpec.describe API::Files, feature_category: :source_code_management do
it 'caches sha256 of the content', :use_clean_rails_redis_caching do
head api(route(file_path), current_user, **options), params: params
- expect(Gitlab::Cache::Client).to receive(:build_with_metadata).with(
- cache_identifier: 'API::Files#content_sha',
- feature_category: :source_code_management,
- backing_resource: :gitaly
- ).and_call_original
+ expect_next_instance_of(Gitlab::Cache::Client) do |instance|
+ expect(instance).to receive(:fetch).with(anything, nil, { cache_identifier: 'API::Files#content_sha', backing_resource: :gitaly }).and_call_original
+ end
expect(Rails.cache.fetch("blob_content_sha256:#{project.full_path}:#{response.headers['X-Gitlab-Blob-Id']}"))
.to eq(content_sha256)
diff --git a/spec/requests/api/graphql/boards/board_list_issues_query_spec.rb b/spec/requests/api/graphql/boards/board_list_issues_query_spec.rb
index 2775c3d4c5a..86e2b288890 100644
--- a/spec/requests/api/graphql/boards/board_list_issues_query_spec.rb
+++ b/spec/requests/api/graphql/boards/board_list_issues_query_spec.rb
@@ -19,7 +19,7 @@ RSpec.describe 'get board lists', feature_category: :team_planning do
let(:confidential) { false }
let(:board_parent_type) { board_parent.class.to_s.downcase }
let(:board_data) { graphql_data[board_parent_type]['boards']['nodes'][0] }
- let(:lists_data) { board_data['lists']['nodes'][0] }
+ let(:lists_data) { board_data['lists']['nodes'][1] }
let(:issues_data) { lists_data['issues']['nodes'] }
let(:issue_params) { { filters: { label_name: label2.title, confidential: confidential }, first: 3 } }
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 2f23e93e2c6..c1ad9bc8728 100644
--- a/spec/requests/api/graphql/boards/board_lists_query_spec.rb
+++ b/spec/requests/api/graphql/boards/board_lists_query_spec.rb
@@ -90,7 +90,7 @@ RSpec.describe 'get board lists', feature_category: :team_planning do
context 'when using default sorting' do
let!(:label_list) { create(:list, board: board, label: label, position: 10) }
let!(:label_list2) { create(:list, board: board, label: label2, position: 2) }
- let!(:backlog_list) { create(:backlog_list, board: board) }
+ let(:backlog_list) { board.lists.find_by(list_type: :backlog) }
let(:closed_list) { board.lists.find_by(list_type: :closed) }
let(:lists) { [backlog_list, label_list2, label_list, closed_list] }
diff --git a/spec/requests/api/graphql/ci/inherited_ci_variables_spec.rb b/spec/requests/api/graphql/ci/inherited_ci_variables_spec.rb
index 3b4014c178c..defddc64851 100644
--- a/spec/requests/api/graphql/ci/inherited_ci_variables_spec.rb
+++ b/spec/requests/api/graphql/ci/inherited_ci_variables_spec.rb
@@ -12,9 +12,15 @@ RSpec.describe 'Query.project(fullPath).inheritedCiVariables', feature_category:
let(:query) do
%(
- query {
+ query($limit: Int, $sort: CiGroupVariablesSort) {
project(fullPath: "#{project.full_path}") {
- inheritedCiVariables {
+ inheritedCiVariables(first: $limit, sort: $sort) {
+ pageInfo {
+ hasNextPage
+ hasPreviousPage
+ startCursor
+ endCursor
+ }
nodes {
id
key
@@ -32,6 +38,34 @@ RSpec.describe 'Query.project(fullPath).inheritedCiVariables', feature_category:
)
end
+ let(:expected_var_b) do
+ {
+ 'id' => subgroup_var.to_global_id.to_s,
+ 'key' => 'SUBGROUP_VAR_B',
+ 'environmentScope' => '*',
+ 'groupName' => subgroup.name,
+ 'groupCiCdSettingsPath' => subgroup_var.group_ci_cd_settings_path,
+ 'masked' => true,
+ 'protected' => false,
+ 'raw' => false,
+ 'variableType' => 'FILE'
+ }
+ end
+
+ let(:expected_var_a) do
+ {
+ 'id' => group_var.to_global_id.to_s,
+ 'key' => 'GROUP_VAR_A',
+ 'environmentScope' => 'production',
+ 'groupName' => group.name,
+ 'groupCiCdSettingsPath' => group_var.group_ci_cd_settings_path,
+ 'masked' => false,
+ 'protected' => true,
+ 'raw' => true,
+ 'variableType' => 'ENV_VAR'
+ }
+ end
+
def create_variables
create(:ci_group_variable, group: group)
create(:ci_group_variable, group: subgroup)
@@ -50,45 +84,115 @@ RSpec.describe 'Query.project(fullPath).inheritedCiVariables', feature_category:
end
context 'when user is a project maintainer' do
+ let!(:group_var) do
+ create(:ci_group_variable, group: group, key: 'GROUP_VAR_A',
+ environment_scope: 'production', masked: false, protected: true, raw: true, created_at: 1.day.ago)
+ end
+
+ let!(:subgroup_var) do
+ create(:ci_group_variable, group: subgroup, key: 'SUBGROUP_VAR_B',
+ masked: true, protected: false, raw: false, variable_type: 'file')
+ end
+
before do
project.add_maintainer(user)
end
it "returns the project's CI variables inherited from its parent group and ancestors" do
- group_var = create(:ci_group_variable, group: group, key: 'GROUP_VAR_A',
- environment_scope: 'production', masked: false, protected: true, raw: true)
-
- subgroup_var = create(:ci_group_variable, group: subgroup, key: 'SUBGROUP_VAR_B',
- masked: true, protected: false, raw: false, variable_type: 'file')
-
post_graphql(query, current_user: user)
- expect(graphql_data.dig('project', 'inheritedCiVariables', 'nodes')).to eq([
- {
- 'id' => group_var.to_global_id.to_s,
- 'key' => 'GROUP_VAR_A',
- 'environmentScope' => 'production',
- 'groupName' => group.name,
- 'groupCiCdSettingsPath' => group_var.group_ci_cd_settings_path,
- 'masked' => false,
- 'protected' => true,
- 'raw' => true,
- 'variableType' => 'ENV_VAR'
- },
- {
- 'id' => subgroup_var.to_global_id.to_s,
- 'key' => 'SUBGROUP_VAR_B',
- 'environmentScope' => '*',
- 'groupName' => subgroup.name,
- 'groupCiCdSettingsPath' => subgroup_var.group_ci_cd_settings_path,
- 'masked' => true,
- 'protected' => false,
- 'raw' => false,
- 'variableType' => 'FILE'
- }
+ expect(graphql_data.dig('project', 'inheritedCiVariables', 'nodes')).to match_array([
+ expected_var_b, expected_var_a
])
end
+ context 'when limiting the number of results' do
+ it 'returns pagination information' do
+ post_graphql(query, current_user: user, variables: { limit: 1 })
+
+ expect(has_next_page).to be_truthy
+ expect(has_prev_page).to be_falsey
+
+ expect(graphql_data.dig('project', 'inheritedCiVariables', 'nodes')).to match_array([
+ expected_var_b
+ ])
+ end
+ end
+
+ describe 'sorting behaviour' do
+ before do
+ post_graphql(query, current_user: user, variables: { sort: sort })
+ end
+
+ shared_examples_for 'unexpected sort parameter' do
+ it 'raises a NoData exception' do
+ expect { graphql_data }.to raise_error(GraphqlHelpers::NoData)
+ end
+ end
+
+ context 'with sort by created_at ascenidng' do
+ let(:sort) { 'CREATED_ASC' }
+
+ it 'returns variables ordered by created_at in ascending order' do
+ expect(graphql_data.dig('project', 'inheritedCiVariables', 'nodes')).to eq([
+ expected_var_a, expected_var_b
+ ])
+ end
+ end
+
+ context 'with not existing sort parameter' do
+ let(:sort) { 'WRONG' }
+
+ it_behaves_like 'unexpected sort parameter'
+ end
+
+ context 'with empty sort parameter' do
+ let(:sort) { '' }
+
+ it_behaves_like 'unexpected sort parameter'
+ end
+
+ context 'with no sort parameter' do
+ let(:sort) { nil }
+
+ it 'returns variables by default in descending order by created_at' do
+ expect(graphql_data.dig('project', 'inheritedCiVariables', 'nodes')).to eq([
+ expected_var_b, expected_var_a
+ ])
+ end
+ end
+
+ context 'with sort by created_at descending' do
+ let(:sort) { 'CREATED_DESC' }
+
+ it 'returns variables ordered by created_at in descending order' do
+ expect(graphql_data.dig('project', 'inheritedCiVariables', 'nodes')).to eq([
+ expected_var_b, expected_var_a
+ ])
+ end
+ end
+
+ context 'with sort by key ascending' do
+ let(:sort) { 'KEY_ASC' }
+
+ it 'returns variables ordered by key in ascending order' do
+ expect(graphql_data.dig('project', 'inheritedCiVariables', 'nodes')).to eq([
+ expected_var_a, expected_var_b
+ ])
+ end
+ end
+
+ context 'with sort by key descending' do
+ let(:sort) { 'KEY_DESC' }
+
+ it 'returns variables ordered by key in descending order' do
+ expect(graphql_data.dig('project', 'inheritedCiVariables', 'nodes')).to eq([
+ expected_var_b, expected_var_a
+ ])
+ end
+ end
+ end
+
it 'avoids N+1 database queries' do
create_variables
@@ -105,4 +209,16 @@ RSpec.describe 'Query.project(fullPath).inheritedCiVariables', feature_category:
expect(multi).not_to exceed_query_limit(baseline)
end
end
+
+ def pagination_info
+ graphql_data_at('project', 'inheritedCiVariables', 'pageInfo')
+ end
+
+ def has_next_page
+ pagination_info['hasNextPage']
+ end
+
+ def has_prev_page
+ pagination_info['hasPreviousPage']
+ end
end
diff --git a/spec/requests/api/graphql/ci/runner_spec.rb b/spec/requests/api/graphql/ci/runner_spec.rb
index 63a657f3962..6acd705c982 100644
--- a/spec/requests/api/graphql/ci/runner_spec.rb
+++ b/spec/requests/api/graphql/ci/runner_spec.rb
@@ -272,12 +272,13 @@ RSpec.describe 'Query.runner(id)', feature_category: :runner_fleet do
let_it_be(:build1) { create(:ci_build, :running, runner: active_project_runner, pipeline: pipeline1) }
let_it_be(:build2) { create(:ci_build, :running, runner: active_project_runner, pipeline: pipeline2) }
- let(:runner_query_fragment) { 'id jobCount' }
let(:query) do
%(
query {
- runner1: runner(id: "#{active_project_runner.to_global_id}") { #{runner_query_fragment} }
- runner2: runner(id: "#{inactive_instance_runner.to_global_id}") { #{runner_query_fragment} }
+ runner1: runner(id: "#{active_project_runner.to_global_id}") { id jobCount(statuses: [RUNNING]) }
+ runner2: runner(id: "#{active_project_runner.to_global_id}") { id jobCount(statuses: FAILED) }
+ runner3: runner(id: "#{active_project_runner.to_global_id}") { id jobCount }
+ runner4: runner(id: "#{inactive_instance_runner.to_global_id}") { id jobCount }
}
)
end
@@ -287,7 +288,9 @@ RSpec.describe 'Query.runner(id)', feature_category: :runner_fleet do
expect(graphql_data).to match a_hash_including(
'runner1' => a_graphql_entity_for(active_project_runner, job_count: 2),
- 'runner2' => a_graphql_entity_for(inactive_instance_runner, job_count: 0)
+ 'runner2' => a_graphql_entity_for(active_project_runner, job_count: 0),
+ 'runner3' => a_graphql_entity_for(active_project_runner, job_count: 2),
+ 'runner4' => a_graphql_entity_for(inactive_instance_runner, job_count: 0)
)
end
@@ -301,7 +304,9 @@ RSpec.describe 'Query.runner(id)', feature_category: :runner_fleet do
expect(graphql_data).to match a_hash_including(
'runner1' => a_graphql_entity_for(active_project_runner, job_count: 1),
- 'runner2' => a_graphql_entity_for(inactive_instance_runner, job_count: 0)
+ 'runner2' => a_graphql_entity_for(active_project_runner, job_count: 0),
+ 'runner3' => a_graphql_entity_for(active_project_runner, job_count: 1),
+ 'runner4' => a_graphql_entity_for(inactive_instance_runner, job_count: 0)
)
end
end
diff --git a/spec/requests/api/graphql/container_repository/container_repository_details_spec.rb b/spec/requests/api/graphql/container_repository/container_repository_details_spec.rb
index 88f63fd59d7..118a11851dd 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
@@ -241,7 +241,7 @@ RSpec.describe 'container repository details', feature_category: :container_regi
end
before do
- allow(::Gitlab).to receive(:com?).and_return(on_com)
+ allow(::Gitlab).to receive(:com_except_jh?).and_return(on_com)
container_repository.update_column(:created_at, created_at)
end
diff --git a/spec/requests/api/graphql/gitlab_schema_spec.rb b/spec/requests/api/graphql/gitlab_schema_spec.rb
index c5286b93251..ad21006f99a 100644
--- a/spec/requests/api/graphql/gitlab_schema_spec.rb
+++ b/spec/requests/api/graphql/gitlab_schema_spec.rb
@@ -264,8 +264,8 @@ RSpec.describe 'GitlabSchema configurations', feature_category: :integrations do
let(:headers) { {} }
before do
- allow(GitlabSchema).to receive(:execute).and_wrap_original do |method, *args|
- mock_schema.execute(*args)
+ allow(GitlabSchema).to receive(:execute).and_wrap_original do |method, *args, **kwargs|
+ mock_schema.execute(*args, **kwargs)
end
end
diff --git a/spec/requests/api/graphql/metrics/dashboard/annotations_spec.rb b/spec/requests/api/graphql/metrics/dashboard/annotations_spec.rb
deleted file mode 100644
index 143bc1672f8..00000000000
--- a/spec/requests/api/graphql/metrics/dashboard/annotations_spec.rb
+++ /dev/null
@@ -1,104 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Getting Metrics Dashboard Annotations', feature_category: :metrics do
- include GraphqlHelpers
-
- let_it_be(:project) { create(:project) }
- let_it_be(:environment) { create(:environment, project: project) }
- let_it_be(:current_user) { create(:user) }
- let_it_be(:path) { 'config/prometheus/common_metrics.yml' }
- let_it_be(:from) { "2020-04-01T03:29:25Z" }
- let_it_be(:to) { Time.zone.now.advance(minutes: 5) }
- let_it_be(:annotation) { create(:metrics_dashboard_annotation, environment: environment, dashboard_path: path) }
- let_it_be(:annotation_for_different_env) { create(:metrics_dashboard_annotation, dashboard_path: path) }
- let_it_be(:annotation_for_different_dashboard) { create(:metrics_dashboard_annotation, environment: environment, dashboard_path: ".gitlab/dashboards/test.yml") }
- let_it_be(:to_old_annotation) do
- create(:metrics_dashboard_annotation, environment: environment, starting_at: Time.parse(from).advance(minutes: -5), dashboard_path: path)
- end
-
- let_it_be(:to_new_annotation) do
- create(:metrics_dashboard_annotation, environment: environment, starting_at: to.advance(minutes: 5), dashboard_path: path)
- end
-
- let(:remove_monitor_metrics) { false }
- let(:args) { "from: \"#{from}\", to: \"#{to}\"" }
- let(:fields) do
- <<~QUERY
- #{all_graphql_fields_for('MetricsDashboardAnnotation'.classify)}
- QUERY
- end
-
- let(:query) do
- %(
- query {
- project(fullPath: "#{project.full_path}") {
- environments(name: "#{environment.name}") {
- nodes {
- metricsDashboard(path: "#{path}") {
- annotations(#{args}) {
- nodes {
- #{fields}
- }
- }
- }
- }
- }
- }
- }
- )
- end
-
- before do
- stub_feature_flags(remove_monitor_metrics: remove_monitor_metrics)
- project.add_developer(current_user)
- post_graphql(query, current_user: current_user)
- end
-
- it_behaves_like 'a working graphql query'
-
- it 'returns annotations' do
- annotations = graphql_data.dig('project', 'environments', 'nodes')[0].dig('metricsDashboard', 'annotations', 'nodes')
-
- expect(annotations).to match_array [{
- "description" => annotation.description,
- "id" => annotation.to_global_id.to_s,
- "panelId" => annotation.panel_xid,
- "startingAt" => annotation.starting_at.iso8601,
- "endingAt" => nil
- }]
- end
-
- context 'arguments' do
- context 'from is missing' do
- let(:args) { "to: \"#{from}\"" }
-
- it 'returns error' do
- post_graphql(query, current_user: current_user)
-
- expect(graphql_errors[0]).to include("message" => "Field 'annotations' is missing required arguments: from")
- end
- end
-
- context 'to is missing' do
- let(:args) { "from: \"#{from}\"" }
-
- it_behaves_like 'a working graphql query'
- end
- end
-
- context 'when metrics dashboard feature is unavailable' do
- let(:remove_monitor_metrics) { true }
-
- it_behaves_like 'a working graphql query'
-
- it 'returns nil' do
- annotations = graphql_data.dig(
- 'project', 'environments', 'nodes', 0, 'metricsDashboard', 'annotations'
- )
-
- expect(annotations).to be_nil
- end
- end
-end
diff --git a/spec/requests/api/graphql/metrics/dashboard_query_spec.rb b/spec/requests/api/graphql/metrics/dashboard_query_spec.rb
deleted file mode 100644
index b7d9b59f5fe..00000000000
--- a/spec/requests/api/graphql/metrics/dashboard_query_spec.rb
+++ /dev/null
@@ -1,114 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Getting Metrics Dashboard', feature_category: :metrics do
- include GraphqlHelpers
-
- let_it_be(:current_user) { create(:user) }
-
- let(:project) { create(:project) }
- let(:environment) { create(:environment, project: project) }
-
- let(:query) do
- graphql_query_for(
- 'project', { 'fullPath' => project.full_path },
- query_graphql_field(
- :environments, { 'name' => environment.name },
- query_graphql_field(
- :nodes, nil,
- query_graphql_field(
- :metricsDashboard, { 'path' => path },
- all_graphql_fields_for('MetricsDashboard'.classify)
- )
- )
- )
- )
- end
-
- context 'for anonymous user' do
- before do
- post_graphql(query, current_user: current_user)
- end
-
- context 'requested dashboard is available' do
- let(:path) { 'config/prometheus/common_metrics.yml' }
-
- it_behaves_like 'a working graphql query'
-
- it 'returns nil' do
- dashboard = graphql_data.dig('project', 'environments', 'nodes')
-
- expect(dashboard).to be_nil
- end
- end
- end
-
- context 'for user with developer access' do
- let(:remove_monitor_metrics) { false }
-
- before do
- stub_feature_flags(remove_monitor_metrics: remove_monitor_metrics)
- project.add_developer(current_user)
- post_graphql(query, current_user: current_user)
- end
-
- context 'requested dashboard is available' do
- let(:path) { 'config/prometheus/common_metrics.yml' }
-
- it_behaves_like 'a working graphql query'
-
- it 'returns metrics dashboard' do
- dashboard = graphql_data.dig('project', 'environments', 'nodes', 0, 'metricsDashboard')
-
- expect(dashboard).to eql("path" => path, "schemaValidationWarnings" => nil)
- end
-
- context 'invalid dashboard' do
- let(:path) { '.gitlab/dashboards/metrics.yml' }
- let(:project) { create(:project, :repository, :custom_repo, namespace: current_user.namespace, files: { path => "---\ndashboard: 'test'" }) }
-
- it 'returns metrics dashboard' do
- dashboard = graphql_data.dig('project', 'environments', 'nodes', 0, 'metricsDashboard')
-
- expect(dashboard).to eql("path" => path, "schemaValidationWarnings" => ["panel_groups: should be an array of panel_groups objects"])
- end
- end
-
- context 'empty dashboard' do
- let(:path) { '.gitlab/dashboards/metrics.yml' }
- let(:project) { create(:project, :repository, :custom_repo, namespace: current_user.namespace, files: { path => "" }) }
-
- it 'returns metrics dashboard' do
- dashboard = graphql_data.dig('project', 'environments', 'nodes', 0, 'metricsDashboard')
-
- expect(dashboard).to eql("path" => path, "schemaValidationWarnings" => ["dashboard: can't be blank", "panel_groups: should be an array of panel_groups objects"])
- end
- end
-
- context 'metrics dashboard feature is unavailable' do
- let(:remove_monitor_metrics) { true }
-
- it_behaves_like 'a working graphql query'
-
- it 'returns nil' do
- dashboard = graphql_data.dig('project', 'environments', 'nodes', 0, 'metricsDashboard')
-
- expect(dashboard).to be_nil
- end
- end
- end
-
- context 'requested dashboard can not be found' do
- let(:path) { 'config/prometheus/i_am_not_here.yml' }
-
- it_behaves_like 'a working graphql query'
-
- it 'returns nil' do
- dashboard = graphql_data.dig('project', 'environments', 'nodes', 0, 'metricsDashboard')
-
- expect(dashboard).to be_nil
- end
- end
- end
-end
diff --git a/spec/requests/api/graphql/mutations/alert_management/prometheus_integration/create_spec.rb b/spec/requests/api/graphql/mutations/alert_management/prometheus_integration/create_spec.rb
index 3dee7f50af3..ec94760e3f0 100644
--- a/spec/requests/api/graphql/mutations/alert_management/prometheus_integration/create_spec.rb
+++ b/spec/requests/api/graphql/mutations/alert_management/prometheus_integration/create_spec.rb
@@ -8,11 +8,13 @@ RSpec.describe 'Creating a new Prometheus Integration', feature_category: :incid
let_it_be(:current_user) { create(:user) }
let_it_be(:project) { create(:project) }
+ let(:api_url) { 'https://prometheus-url.com' }
+
let(:variables) do
{
project_path: project.full_path,
active: false,
- api_url: 'https://prometheus-url.com'
+ api_url: api_url
}
end
@@ -56,7 +58,20 @@ RSpec.describe 'Creating a new Prometheus Integration', feature_category: :incid
expect(integration_response['apiUrl']).to eq(new_integration.api_url)
end
- [:project_path, :active, :api_url].each do |argument|
+ context 'without api url' do
+ let(:api_url) { nil }
+
+ it 'creates a new integration' do
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ integration_response = mutation_response['integration']
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(integration_response['apiUrl']).to be_nil
+ end
+ end
+
+ [:project_path, :active].each do |argument|
context "without required argument #{argument}" do
before do
variables.delete(argument)
diff --git a/spec/requests/api/graphql/mutations/ci/job_token_scope/add_project_spec.rb b/spec/requests/api/graphql/mutations/ci/job_token_scope/add_project_spec.rb
index 8791d793cb4..947e7dbcb37 100644
--- a/spec/requests/api/graphql/mutations/ci/job_token_scope/add_project_spec.rb
+++ b/spec/requests/api/graphql/mutations/ci/job_token_scope/add_project_spec.rb
@@ -53,7 +53,6 @@ RSpec.describe 'CiJobTokenScopeAddProject', feature_category: :continuous_integr
before do
target_project.add_developer(current_user)
- stub_feature_flags(frozen_outbound_job_token_scopes_override: false)
end
it 'adds the target project to the inbound job token scope' do
@@ -64,20 +63,6 @@ RSpec.describe 'CiJobTokenScopeAddProject', feature_category: :continuous_integr
end.to change { Ci::JobToken::ProjectScopeLink.inbound.count }.by(1)
end
- context 'when FF frozen_outbound_job_token_scopes is disabled' do
- before do
- stub_feature_flags(frozen_outbound_job_token_scopes: false)
- end
-
- it 'adds the target project to the outbound job token scope' do
- expect do
- post_graphql_mutation(mutation, current_user: current_user)
- expect(response).to have_gitlab_http_status(:success)
- expect(mutation_response.dig('ciJobTokenScope', 'projects', 'nodes')).not_to be_empty
- end.to change { Ci::JobToken::ProjectScopeLink.outbound.count }.by(1)
- end
- end
-
context 'when invalid target project is provided' do
before do
variables[:target_project_path] = 'unknown/project'
diff --git a/spec/requests/api/graphql/mutations/ci/pipeline_schedule/create_spec.rb b/spec/requests/api/graphql/mutations/ci/pipeline_schedule/create_spec.rb
new file mode 100644
index 00000000000..0d5e5f5d2fb
--- /dev/null
+++ b/spec/requests/api/graphql/mutations/ci/pipeline_schedule/create_spec.rb
@@ -0,0 +1,162 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'PipelineSchedulecreate', feature_category: :continuous_integration do
+ include GraphqlHelpers
+
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project, :public, :repository) }
+
+ let(:mutation) do
+ variables = {
+ project_path: project.full_path,
+ **pipeline_schedule_parameters
+ }
+
+ graphql_mutation(
+ :pipeline_schedule_create,
+ variables,
+ <<-QL
+ pipelineSchedule {
+ id
+ description
+ cron
+ refForDisplay
+ active
+ cronTimezone
+ variables {
+ nodes {
+ key
+ value
+ }
+ }
+ owner {
+ id
+ }
+ }
+ errors
+ QL
+ )
+ end
+
+ let(:pipeline_schedule_parameters) do
+ {
+ description: 'created_desc',
+ cron: '0 1 * * *',
+ cronTimezone: 'UTC',
+ ref: 'patch-x',
+ active: true,
+ variables: [
+ { key: 'AAA', value: "AAA123", variableType: 'ENV_VAR' }
+ ]
+ }
+ end
+
+ let(:mutation_response) { graphql_mutation_response(:pipeline_schedule_create) }
+
+ context 'when unauthorized' do
+ it 'returns an error' do
+ post_graphql_mutation(mutation, current_user: user)
+
+ expect(graphql_errors).not_to be_empty
+ expect(graphql_errors[0]['message'])
+ .to eq(
+ "The resource that you are attempting to access does not exist " \
+ "or you don't have permission to perform this action"
+ )
+ end
+ end
+
+ # Move this from `shared_context` to `context` when `ci_refactoring_pipeline_schedule_create_service` is removed.
+ shared_context 'when authorized' do # rubocop:disable RSpec/ContextWording
+ before_all do
+ project.add_developer(user)
+ end
+
+ context 'when success' do
+ it do
+ post_graphql_mutation(mutation, current_user: user)
+
+ expect(response).to have_gitlab_http_status(:success)
+
+ expect(mutation_response['pipelineSchedule']['owner']['id']).to eq(user.to_global_id.to_s)
+
+ %w[description cron cronTimezone active].each do |key|
+ expect(mutation_response['pipelineSchedule'][key]).to eq(pipeline_schedule_parameters[key.to_sym])
+ end
+
+ expect(mutation_response['pipelineSchedule']['refForDisplay']).to eq(pipeline_schedule_parameters[:ref])
+
+ expect(mutation_response['pipelineSchedule']['variables']['nodes'][0]['key']).to eq('AAA')
+ expect(mutation_response['pipelineSchedule']['variables']['nodes'][0]['value']).to eq('AAA123')
+
+ expect(mutation_response['pipelineSchedule']['owner']['id']).to eq(user.to_global_id.to_s)
+
+ expect(mutation_response['errors']).to eq([])
+ end
+ end
+
+ context 'when failure' do
+ context 'when params are invalid' do
+ let(:pipeline_schedule_parameters) do
+ {
+ description: 'some description',
+ cron: 'abc',
+ cronTimezone: 'cCc',
+ ref: 'asd',
+ active: true,
+ variables: []
+ }
+ end
+
+ it do
+ post_graphql_mutation(mutation, current_user: user)
+
+ expect(response).to have_gitlab_http_status(:success)
+
+ expect(mutation_response['errors'])
+ .to match_array(
+ ["Cron is invalid syntax", "Cron timezone is invalid syntax"]
+ )
+ end
+ end
+
+ context 'when variables have duplicate name' do
+ before do
+ pipeline_schedule_parameters.merge!(
+ {
+ variables: [
+ { key: 'AAA', value: "AAA123", variableType: 'ENV_VAR' },
+ { key: 'AAA', value: "AAA123", variableType: 'ENV_VAR' }
+ ]
+ }
+ )
+ end
+
+ it 'returns error' do
+ post_graphql_mutation(mutation, current_user: user)
+
+ expect(response).to have_gitlab_http_status(:success)
+
+ expect(mutation_response['errors'])
+ .to match_array(
+ [
+ "Variables have duplicate values (AAA)"
+ ]
+ )
+ end
+ end
+ end
+ end
+
+ it_behaves_like 'when authorized'
+
+ context 'when the FF ci_refactoring_pipeline_schedule_create_service is disabled' do
+ before do
+ stub_feature_flags(ci_refactoring_pipeline_schedule_create_service: false)
+ end
+
+ it_behaves_like 'when authorized'
+ end
+end
diff --git a/spec/requests/api/graphql/mutations/ci/pipeline_schedule/delete_spec.rb b/spec/requests/api/graphql/mutations/ci/pipeline_schedule/delete_spec.rb
new file mode 100644
index 00000000000..e79395bb52c
--- /dev/null
+++ b/spec/requests/api/graphql/mutations/ci/pipeline_schedule/delete_spec.rb
@@ -0,0 +1,82 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'PipelineScheduleDelete', feature_category: :continuous_integration do
+ include GraphqlHelpers
+
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:pipeline_schedule) { create(:ci_pipeline_schedule, project: project, owner: user) }
+
+ let(:mutation) do
+ graphql_mutation(
+ :pipeline_schedule_delete,
+ { id: pipeline_schedule_id },
+ <<-QL
+ errors
+ QL
+ )
+ end
+
+ let(:pipeline_schedule_id) { pipeline_schedule.to_global_id.to_s }
+ let(:mutation_response) { graphql_mutation_response(:pipeline_schedule_delete) }
+
+ context 'when unauthorized' do
+ it 'returns an error' do
+ post_graphql_mutation(mutation, current_user: create(:user))
+
+ expect(graphql_errors).not_to be_empty
+ expect(graphql_errors[0]['message'])
+ .to eq(
+ "The resource that you are attempting to access does not exist " \
+ "or you don't have permission to perform this action"
+ )
+ end
+ end
+
+ context 'when authorized' do
+ before_all do
+ project.add_maintainer(user)
+ end
+
+ context 'when success' do
+ it do
+ post_graphql_mutation(mutation, current_user: user)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(mutation_response['errors']).to eq([])
+ end
+ end
+
+ context 'when failure' do
+ context 'when destroy fails' do
+ before do
+ allow_next_found_instance_of(Ci::PipelineSchedule) do |pipeline_schedule|
+ allow(pipeline_schedule).to receive(:destroy).and_return(false)
+ end
+ end
+
+ it do
+ post_graphql_mutation(mutation, current_user: user)
+
+ expect(response).to have_gitlab_http_status(:success)
+
+ expect(mutation_response['errors']).to match_array(['Failed to remove the pipeline schedule'])
+ end
+ end
+
+ context 'when pipeline schedule not found' do
+ let(:pipeline_schedule_id) { 'gid://gitlab/Ci::PipelineSchedule/0' }
+
+ it do
+ post_graphql_mutation(mutation, current_user: user)
+
+ expect(graphql_errors).not_to be_empty
+ expect(graphql_errors[0]['message'])
+ .to eq("Internal server error: Couldn't find Ci::PipelineSchedule with 'id'=0")
+ end
+ end
+ end
+ end
+end
diff --git a/spec/requests/api/graphql/mutations/ci/pipeline_schedule/play_spec.rb b/spec/requests/api/graphql/mutations/ci/pipeline_schedule/play_spec.rb
new file mode 100644
index 00000000000..55ecf8f287e
--- /dev/null
+++ b/spec/requests/api/graphql/mutations/ci/pipeline_schedule/play_spec.rb
@@ -0,0 +1,80 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'PipelineSchedulePlay', feature_category: :continuous_integration do
+ include GraphqlHelpers
+
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:pipeline_schedule) do
+ create(
+ :ci_pipeline_schedule,
+ :every_minute,
+ project: project,
+ owner: user
+ )
+ end
+
+ let(:mutation) do
+ graphql_mutation(
+ :pipeline_schedule_play,
+ { id: pipeline_schedule.to_global_id.to_s },
+ <<-QL
+ pipelineSchedule { id, nextRunAt }
+ errors
+ QL
+ )
+ end
+
+ let(:mutation_response) { graphql_mutation_response(:pipeline_schedule_play) }
+
+ context 'when unauthorized' do
+ it 'returns an error' do
+ post_graphql_mutation(mutation, current_user: create(:user))
+
+ expect(graphql_errors).not_to be_empty
+ expect(graphql_errors[0]['message'])
+ .to eq(
+ "The resource that you are attempting to access does not exist " \
+ "or you don't have permission to perform this action"
+ )
+ end
+ end
+
+ context 'when authorized', :sidekiq_inline do
+ before_all do
+ project.add_maintainer(user)
+ pipeline_schedule.update_columns(next_run_at: 2.hours.ago)
+ end
+
+ context 'when mutation succeeds' do
+ let(:service_response) { instance_double('ServiceResponse', payload: new_pipeline) }
+ let(:new_pipeline) { instance_double('Ci::Pipeline', persisted?: true) }
+
+ it do
+ expect(Ci::CreatePipelineService).to receive_message_chain(:new, :execute).and_return(service_response)
+ post_graphql_mutation(mutation, current_user: user)
+
+ expect(mutation_response['pipelineSchedule']['id']).to include(pipeline_schedule.id.to_s)
+ new_next_run_at = DateTime.parse(mutation_response['pipelineSchedule']['nextRunAt'])
+ expect(new_next_run_at).not_to eq(pipeline_schedule.next_run_at)
+ expect(new_next_run_at).to eq(pipeline_schedule.reset.next_run_at)
+ expect(mutation_response['errors']).to eq([])
+ end
+ end
+
+ context 'when mutation fails' do
+ it do
+ expect(RunPipelineScheduleWorker)
+ .to receive(:perform_async)
+ .with(pipeline_schedule.id, user.id).and_return(nil)
+
+ post_graphql_mutation(mutation, current_user: user)
+
+ expect(mutation_response['pipelineSchedule']).to be_nil
+ expect(mutation_response['errors']).to match_array(['Unable to schedule a pipeline to run immediately.'])
+ end
+ end
+ end
+end
diff --git a/spec/requests/api/graphql/mutations/ci/pipeline_schedule_take_ownership_spec.rb b/spec/requests/api/graphql/mutations/ci/pipeline_schedule/take_ownership_spec.rb
index 2d1f1565a73..2d1f1565a73 100644
--- a/spec/requests/api/graphql/mutations/ci/pipeline_schedule_take_ownership_spec.rb
+++ b/spec/requests/api/graphql/mutations/ci/pipeline_schedule/take_ownership_spec.rb
diff --git a/spec/requests/api/graphql/mutations/ci/pipeline_schedule/update_spec.rb b/spec/requests/api/graphql/mutations/ci/pipeline_schedule/update_spec.rb
new file mode 100644
index 00000000000..ec1595f393f
--- /dev/null
+++ b/spec/requests/api/graphql/mutations/ci/pipeline_schedule/update_spec.rb
@@ -0,0 +1,189 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'PipelineScheduleUpdate', feature_category: :continuous_integration do
+ include GraphqlHelpers
+
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project, :public, :repository) }
+ let_it_be(:pipeline_schedule) { create(:ci_pipeline_schedule, project: project, owner: user) }
+
+ let_it_be(:variable_one) do
+ create(:ci_pipeline_schedule_variable, key: 'foo', value: 'foovalue', pipeline_schedule: pipeline_schedule)
+ end
+
+ let_it_be(:variable_two) do
+ create(:ci_pipeline_schedule_variable, key: 'bar', value: 'barvalue', pipeline_schedule: pipeline_schedule)
+ end
+
+ let(:mutation) do
+ variables = {
+ id: pipeline_schedule.to_global_id.to_s,
+ **pipeline_schedule_parameters
+ }
+
+ graphql_mutation(
+ :pipeline_schedule_update,
+ variables,
+ <<-QL
+ pipelineSchedule {
+ id
+ description
+ cron
+ refForDisplay
+ active
+ cronTimezone
+ variables {
+ nodes {
+ key
+ value
+ variableType
+ }
+ }
+ }
+ errors
+ QL
+ )
+ end
+
+ let(:pipeline_schedule_parameters) { {} }
+ let(:mutation_response) { graphql_mutation_response(:pipeline_schedule_update) }
+
+ context 'when unauthorized' do
+ it 'returns an error' do
+ post_graphql_mutation(mutation, current_user: create(:user))
+
+ expect(graphql_errors).not_to be_empty
+ expect(graphql_errors[0]['message'])
+ .to eq(
+ "The resource that you are attempting to access does not exist " \
+ "or you don't have permission to perform this action"
+ )
+ end
+ end
+
+ context 'when authorized' do
+ before_all do
+ project.add_developer(user)
+ end
+
+ context 'when success' do
+ let(:pipeline_schedule_parameters) do
+ {
+ description: 'updated_desc',
+ cron: '0 1 * * *',
+ cronTimezone: 'UTC',
+ ref: 'patch-x',
+ active: true,
+ variables: [
+ { key: 'AAA', value: "AAA123", variableType: 'ENV_VAR' }
+ ]
+ }
+ end
+
+ it do
+ post_graphql_mutation(mutation, current_user: user)
+
+ expect(response).to have_gitlab_http_status(:success)
+
+ expect_graphql_errors_to_be_empty
+
+ expect(mutation_response['pipelineSchedule']['id']).to eq(pipeline_schedule.to_global_id.to_s)
+
+ %w[description cron cronTimezone active].each do |key|
+ expect(mutation_response['pipelineSchedule'][key]).to eq(pipeline_schedule_parameters[key.to_sym])
+ end
+
+ expect(mutation_response['pipelineSchedule']['refForDisplay']).to eq(pipeline_schedule_parameters[:ref])
+
+ expect(mutation_response['pipelineSchedule']['variables']['nodes'][2]['key']).to eq('AAA')
+ expect(mutation_response['pipelineSchedule']['variables']['nodes'][2]['value']).to eq('AAA123')
+ end
+ end
+
+ context 'when updating and removing variables' do
+ let(:pipeline_schedule_parameters) do
+ {
+ variables: [
+ { key: 'ABC', value: "ABC123", variableType: 'ENV_VAR', destroy: false },
+ { id: variable_one.to_global_id.to_s,
+ key: 'foo', value: "foovalue",
+ variableType: 'ENV_VAR',
+ destroy: true },
+ { id: variable_two.to_global_id.to_s, key: 'newbar', value: "newbarvalue", variableType: 'ENV_VAR' }
+ ]
+ }
+ end
+
+ it 'processes variables correctly' do
+ post_graphql_mutation(mutation, current_user: user)
+
+ expect(response).to have_gitlab_http_status(:success)
+
+ expect(mutation_response['pipelineSchedule']['variables']['nodes'])
+ .to match_array(
+ [
+ { "key" => 'newbar', "value" => 'newbarvalue', "variableType" => 'ENV_VAR' },
+ { "key" => 'ABC', "value" => "ABC123", "variableType" => 'ENV_VAR' }
+ ]
+ )
+ end
+ end
+
+ context 'when failure' do
+ context 'when params are invalid' do
+ let(:pipeline_schedule_parameters) do
+ {
+ description: '',
+ cron: 'abc',
+ cronTimezone: 'cCc',
+ ref: '',
+ active: true,
+ variables: []
+ }
+ end
+
+ it do
+ post_graphql_mutation(mutation, current_user: user)
+
+ expect(response).to have_gitlab_http_status(:success)
+
+ expect(mutation_response['errors'])
+ .to match_array(
+ [
+ "Cron is invalid syntax",
+ "Cron timezone is invalid syntax",
+ "Ref can't be blank",
+ "Description can't be blank"
+ ]
+ )
+ end
+ end
+
+ context 'when params have duplicate variables' do
+ let(:pipeline_schedule_parameters) do
+ {
+ variables: [
+ { key: 'AAA', value: "AAA123", variableType: 'ENV_VAR' },
+ { key: 'AAA', value: "AAA123", variableType: 'ENV_VAR' }
+ ]
+ }
+ end
+
+ it 'returns error' do
+ post_graphql_mutation(mutation, current_user: user)
+
+ expect(response).to have_gitlab_http_status(:success)
+
+ expect(mutation_response['errors'])
+ .to match_array(
+ [
+ "Variables have duplicate values (AAA)"
+ ]
+ )
+ end
+ end
+ end
+ end
+end
diff --git a/spec/requests/api/graphql/mutations/ci/pipeline_schedule_create_spec.rb b/spec/requests/api/graphql/mutations/ci/pipeline_schedule_create_spec.rb
deleted file mode 100644
index 4a45d255d99..00000000000
--- a/spec/requests/api/graphql/mutations/ci/pipeline_schedule_create_spec.rb
+++ /dev/null
@@ -1,151 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'PipelineSchedulecreate' do
- include GraphqlHelpers
-
- let_it_be(:user) { create(:user) }
- let_it_be(:project) { create(:project, :public, :repository) }
-
- let(:mutation) do
- variables = {
- project_path: project.full_path,
- **pipeline_schedule_parameters
- }
-
- graphql_mutation(
- :pipeline_schedule_create,
- variables,
- <<-QL
- pipelineSchedule {
- id
- description
- cron
- refForDisplay
- active
- cronTimezone
- variables {
- nodes {
- key
- value
- }
- }
- owner {
- id
- }
- }
- errors
- QL
- )
- end
-
- let(:pipeline_schedule_parameters) do
- {
- description: 'created_desc',
- cron: '0 1 * * *',
- cronTimezone: 'UTC',
- ref: 'patch-x',
- active: true,
- variables: [
- { key: 'AAA', value: "AAA123", variableType: 'ENV_VAR' }
- ]
- }
- end
-
- let(:mutation_response) { graphql_mutation_response(:pipeline_schedule_create) }
-
- context 'when unauthorized' do
- it 'returns an error' do
- post_graphql_mutation(mutation, current_user: user)
-
- expect(graphql_errors).not_to be_empty
- expect(graphql_errors[0]['message'])
- .to eq(
- "The resource that you are attempting to access does not exist " \
- "or you don't have permission to perform this action"
- )
- end
- end
-
- context 'when authorized' do
- before do
- project.add_developer(user)
- end
-
- context 'when success' do
- it do
- post_graphql_mutation(mutation, current_user: user)
-
- expect(response).to have_gitlab_http_status(:success)
-
- expect(mutation_response['pipelineSchedule']['owner']['id']).to eq(user.to_global_id.to_s)
-
- %w[description cron cronTimezone active].each do |key|
- expect(mutation_response['pipelineSchedule'][key]).to eq(pipeline_schedule_parameters[key.to_sym])
- end
-
- expect(mutation_response['pipelineSchedule']['refForDisplay']).to eq(pipeline_schedule_parameters[:ref])
-
- expect(mutation_response['pipelineSchedule']['variables']['nodes'][0]['key']).to eq('AAA')
- expect(mutation_response['pipelineSchedule']['variables']['nodes'][0]['value']).to eq('AAA123')
-
- expect(mutation_response['pipelineSchedule']['owner']['id']).to eq(user.to_global_id.to_s)
-
- expect(mutation_response['errors']).to eq([])
- end
- end
-
- context 'when failure' do
- context 'when params are invalid' do
- let(:pipeline_schedule_parameters) do
- {
- description: 'some description',
- cron: 'abc',
- cronTimezone: 'cCc',
- ref: 'asd',
- active: true,
- variables: []
- }
- end
-
- it do
- post_graphql_mutation(mutation, current_user: user)
-
- expect(response).to have_gitlab_http_status(:success)
-
- expect(mutation_response['errors'])
- .to match_array(
- ["Cron is invalid syntax", "Cron timezone is invalid syntax"]
- )
- end
- end
-
- context 'when variables have duplicate name' do
- before do
- pipeline_schedule_parameters.merge!(
- {
- variables: [
- { key: 'AAA', value: "AAA123", variableType: 'ENV_VAR' },
- { key: 'AAA', value: "AAA123", variableType: 'ENV_VAR' }
- ]
- }
- )
- end
-
- it 'returns error' do
- post_graphql_mutation(mutation, current_user: user)
-
- expect(response).to have_gitlab_http_status(:success)
-
- expect(mutation_response['errors'])
- .to match_array(
- [
- "Variables have duplicate values (AAA)"
- ]
- )
- end
- end
- end
- end
-end
diff --git a/spec/requests/api/graphql/mutations/ci/pipeline_schedule_delete_spec.rb b/spec/requests/api/graphql/mutations/ci/pipeline_schedule_delete_spec.rb
deleted file mode 100644
index b846ff0aec8..00000000000
--- a/spec/requests/api/graphql/mutations/ci/pipeline_schedule_delete_spec.rb
+++ /dev/null
@@ -1,82 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'PipelineScheduleDelete', feature_category: :continuous_integration do
- include GraphqlHelpers
-
- let_it_be(:user) { create(:user) }
- let_it_be(:project) { create(:project) }
- let_it_be(:pipeline_schedule) { create(:ci_pipeline_schedule, project: project, owner: user) }
-
- let(:mutation) do
- graphql_mutation(
- :pipeline_schedule_delete,
- { id: pipeline_schedule_id },
- <<-QL
- errors
- QL
- )
- end
-
- let(:pipeline_schedule_id) { pipeline_schedule.to_global_id.to_s }
- let(:mutation_response) { graphql_mutation_response(:pipeline_schedule_delete) }
-
- context 'when unauthorized' do
- it 'returns an error' do
- post_graphql_mutation(mutation, current_user: create(:user))
-
- expect(graphql_errors).not_to be_empty
- expect(graphql_errors[0]['message'])
- .to eq(
- "The resource that you are attempting to access does not exist " \
- "or you don't have permission to perform this action"
- )
- end
- end
-
- context 'when authorized' do
- before do
- project.add_maintainer(user)
- end
-
- context 'when success' do
- it do
- post_graphql_mutation(mutation, current_user: user)
-
- expect(response).to have_gitlab_http_status(:success)
- expect(mutation_response['errors']).to eq([])
- end
- end
-
- context 'when failure' do
- context 'when destroy fails' do
- before do
- allow_next_found_instance_of(Ci::PipelineSchedule) do |pipeline_schedule|
- allow(pipeline_schedule).to receive(:destroy).and_return(false)
- end
- end
-
- it do
- post_graphql_mutation(mutation, current_user: user)
-
- expect(response).to have_gitlab_http_status(:success)
-
- expect(mutation_response['errors']).to match_array(['Failed to remove the pipeline schedule'])
- end
- end
-
- context 'when pipeline schedule not found' do
- let(:pipeline_schedule_id) { 'gid://gitlab/Ci::PipelineSchedule/0' }
-
- it do
- post_graphql_mutation(mutation, current_user: user)
-
- expect(graphql_errors).not_to be_empty
- expect(graphql_errors[0]['message'])
- .to eq("Internal server error: Couldn't find Ci::PipelineSchedule with 'id'=0")
- end
- end
- end
- end
-end
diff --git a/spec/requests/api/graphql/mutations/ci/pipeline_schedule_play_spec.rb b/spec/requests/api/graphql/mutations/ci/pipeline_schedule_play_spec.rb
deleted file mode 100644
index 492c6946c99..00000000000
--- a/spec/requests/api/graphql/mutations/ci/pipeline_schedule_play_spec.rb
+++ /dev/null
@@ -1,80 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'PipelineSchedulePlay', feature_category: :continuous_integration do
- include GraphqlHelpers
-
- let_it_be(:user) { create(:user) }
- let_it_be(:project) { create(:project) }
- let_it_be(:pipeline_schedule) do
- create(
- :ci_pipeline_schedule,
- :every_minute,
- project: project,
- owner: user
- )
- end
-
- let(:mutation) do
- graphql_mutation(
- :pipeline_schedule_play,
- { id: pipeline_schedule.to_global_id.to_s },
- <<-QL
- pipelineSchedule { id, nextRunAt }
- errors
- QL
- )
- end
-
- let(:mutation_response) { graphql_mutation_response(:pipeline_schedule_play) }
-
- context 'when unauthorized' do
- it 'returns an error' do
- post_graphql_mutation(mutation, current_user: create(:user))
-
- expect(graphql_errors).not_to be_empty
- expect(graphql_errors[0]['message'])
- .to eq(
- "The resource that you are attempting to access does not exist " \
- "or you don't have permission to perform this action"
- )
- end
- end
-
- context 'when authorized', :sidekiq_inline do
- before do
- project.add_maintainer(user)
- pipeline_schedule.update_columns(next_run_at: 2.hours.ago)
- end
-
- context 'when mutation succeeds' do
- let(:service_response) { instance_double('ServiceResponse', payload: new_pipeline) }
- let(:new_pipeline) { instance_double('Ci::Pipeline', persisted?: true) }
-
- it do
- expect(Ci::CreatePipelineService).to receive_message_chain(:new, :execute).and_return(service_response)
- post_graphql_mutation(mutation, current_user: user)
-
- expect(mutation_response['pipelineSchedule']['id']).to include(pipeline_schedule.id.to_s)
- new_next_run_at = DateTime.parse(mutation_response['pipelineSchedule']['nextRunAt'])
- expect(new_next_run_at).not_to eq(pipeline_schedule.next_run_at)
- expect(new_next_run_at).to eq(pipeline_schedule.reset.next_run_at)
- expect(mutation_response['errors']).to eq([])
- end
- end
-
- context 'when mutation fails' do
- it do
- expect(RunPipelineScheduleWorker)
- .to receive(:perform_async)
- .with(pipeline_schedule.id, user.id).and_return(nil)
-
- post_graphql_mutation(mutation, current_user: user)
-
- expect(mutation_response['pipelineSchedule']).to be_nil
- expect(mutation_response['errors']).to match_array(['Unable to schedule a pipeline to run immediately.'])
- end
- end
- end
-end
diff --git a/spec/requests/api/graphql/mutations/ci/pipeline_schedule_update_spec.rb b/spec/requests/api/graphql/mutations/ci/pipeline_schedule_update_spec.rb
deleted file mode 100644
index c1da231a4a6..00000000000
--- a/spec/requests/api/graphql/mutations/ci/pipeline_schedule_update_spec.rb
+++ /dev/null
@@ -1,151 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'PipelineScheduleUpdate', feature_category: :continuous_integration do
- include GraphqlHelpers
-
- let_it_be(:user) { create(:user) }
- let_it_be(:project) { create(:project, :public, :repository) }
- let_it_be(:pipeline_schedule) { create(:ci_pipeline_schedule, project: project, owner: user) }
-
- let(:mutation) do
- variables = {
- id: pipeline_schedule.to_global_id.to_s,
- **pipeline_schedule_parameters
- }
-
- graphql_mutation(
- :pipeline_schedule_update,
- variables,
- <<-QL
- pipelineSchedule {
- id
- description
- cron
- refForDisplay
- active
- cronTimezone
- variables {
- nodes {
- key
- value
- }
- }
- }
- errors
- QL
- )
- end
-
- let(:pipeline_schedule_parameters) { {} }
- let(:mutation_response) { graphql_mutation_response(:pipeline_schedule_update) }
-
- context 'when unauthorized' do
- it 'returns an error' do
- post_graphql_mutation(mutation, current_user: create(:user))
-
- expect(graphql_errors).not_to be_empty
- expect(graphql_errors[0]['message'])
- .to eq(
- "The resource that you are attempting to access does not exist " \
- "or you don't have permission to perform this action"
- )
- end
- end
-
- context 'when authorized' do
- before do
- project.add_developer(user)
- end
-
- context 'when success' do
- let(:pipeline_schedule_parameters) do
- {
- description: 'updated_desc',
- cron: '0 1 * * *',
- cronTimezone: 'UTC',
- ref: 'patch-x',
- active: true,
- variables: [
- { key: 'AAA', value: "AAA123", variableType: 'ENV_VAR' }
- ]
- }
- end
-
- it do
- post_graphql_mutation(mutation, current_user: user)
-
- expect(response).to have_gitlab_http_status(:success)
-
- expect_graphql_errors_to_be_empty
-
- expect(mutation_response['pipelineSchedule']['id']).to eq(pipeline_schedule.to_global_id.to_s)
-
- %w[description cron cronTimezone active].each do |key|
- expect(mutation_response['pipelineSchedule'][key]).to eq(pipeline_schedule_parameters[key.to_sym])
- end
-
- expect(mutation_response['pipelineSchedule']['refForDisplay']).to eq(pipeline_schedule_parameters[:ref])
-
- expect(mutation_response['pipelineSchedule']['variables']['nodes'][0]['key']).to eq('AAA')
- expect(mutation_response['pipelineSchedule']['variables']['nodes'][0]['value']).to eq('AAA123')
- end
- end
-
- context 'when failure' do
- context 'when params are invalid' do
- let(:pipeline_schedule_parameters) do
- {
- description: '',
- cron: 'abc',
- cronTimezone: 'cCc',
- ref: '',
- active: true,
- variables: []
- }
- end
-
- it do
- post_graphql_mutation(mutation, current_user: user)
-
- expect(response).to have_gitlab_http_status(:success)
-
- expect(mutation_response['errors'])
- .to match_array(
- [
- "Cron is invalid syntax",
- "Cron timezone is invalid syntax",
- "Ref can't be blank",
- "Description can't be blank"
- ]
- )
- end
- end
-
- context 'when params have duplicate variables' do
- let(:pipeline_schedule_parameters) do
- {
- variables: [
- { key: 'AAA', value: "AAA123", variableType: 'ENV_VAR' },
- { key: 'AAA', value: "AAA123", variableType: 'ENV_VAR' }
- ]
- }
- end
-
- it 'returns error' do
- post_graphql_mutation(mutation, current_user: user)
-
- expect(response).to have_gitlab_http_status(:success)
-
- expect(mutation_response['errors'])
- .to match_array(
- [
- "Variables have duplicate values (AAA)"
- ]
- )
- end
- 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
index fd92ed198e7..6e101d07b9f 100644
--- 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
@@ -5,10 +5,6 @@ require 'spec_helper'
RSpec.describe 'ProjectCiCdSettingsUpdate', feature_category: :continuous_integration do
include GraphqlHelpers
- before do
- stub_feature_flags(frozen_outbound_job_token_scopes_override: false)
- end
-
let_it_be(:project) do
create(:project,
keep_latest_artifact: true,
@@ -101,22 +97,6 @@ RSpec.describe 'ProjectCiCdSettingsUpdate', feature_category: :continuous_integr
end
end
- context 'when FF frozen_outbound_job_token_scopes is disabled' do
- before do
- stub_feature_flags(frozen_outbound_job_token_scopes: false)
- end
-
- it 'allows setting job_token_scope_enabled to true' do
- project.update!(ci_outbound_job_token_scope_enabled: true)
- post_graphql_mutation(mutation, current_user: user)
-
- project.reload
-
- expect(response).to have_gitlab_http_status(:success)
- expect(project.ci_outbound_job_token_scope_enabled).to eq(false)
- end
- end
-
it 'does not update job_token_scope_enabled if not specified' do
variables.except!(:job_token_scope_enabled)
diff --git a/spec/requests/api/graphql/mutations/ci/runner/create_spec.rb b/spec/requests/api/graphql/mutations/ci/runner/create_spec.rb
index 1658c277ed0..b697b9f73b7 100644
--- a/spec/requests/api/graphql/mutations/ci/runner/create_spec.rb
+++ b/spec/requests/api/graphql/mutations/ci/runner/create_spec.rb
@@ -95,18 +95,6 @@ RSpec.describe 'RunnerCreate', feature_category: :runner_fleet do
end
end
- shared_context 'when :create_runner_workflow_for_namespace feature flag is disabled' do
- before do
- stub_feature_flags(create_runner_workflow_for_namespace: [other_group])
- end
-
- it 'returns an error' do
- post_graphql_mutation(mutation, current_user: current_user)
-
- expect_graphql_errors_to_include('`create_runner_workflow_for_namespace` feature flag is disabled.')
- end
- end
-
shared_examples 'when runner is created successfully' do
it do
expected_args = { user: current_user, params: anything }
@@ -139,18 +127,6 @@ RSpec.describe 'RunnerCreate', feature_category: :runner_fleet do
context 'when user has permissions', :enable_admin_mode do
let(:current_user) { admin }
- context 'when :create_runner_workflow_for_admin feature flag is disabled' do
- before do
- stub_feature_flags(create_runner_workflow_for_admin: false)
- end
-
- it 'returns an error' do
- post_graphql_mutation(mutation, current_user: current_user)
-
- expect_graphql_errors_to_include('`create_runner_workflow_for_admin` feature flag is disabled.')
- end
- end
-
it_behaves_like 'when runner is created successfully'
it_behaves_like 'when model is invalid returns error'
end
@@ -164,17 +140,12 @@ RSpec.describe 'RunnerCreate', feature_category: :runner_fleet do
}
end
- before do
- stub_feature_flags(create_runner_workflow_for_namespace: [group])
- end
-
it_behaves_like 'when user does not have permissions'
context 'when user has permissions' do
context 'when user is group owner' do
let(:current_user) { group_owner }
- it_behaves_like 'when :create_runner_workflow_for_namespace feature flag is disabled'
it_behaves_like 'when runner is created successfully'
it_behaves_like 'when model is invalid returns error'
@@ -226,7 +197,6 @@ RSpec.describe 'RunnerCreate', feature_category: :runner_fleet do
context 'when user is admin in admin mode', :enable_admin_mode do
let(:current_user) { admin }
- it_behaves_like 'when :create_runner_workflow_for_namespace feature flag is disabled'
it_behaves_like 'when runner is created successfully'
it_behaves_like 'when model is invalid returns error'
end
@@ -249,7 +219,6 @@ RSpec.describe 'RunnerCreate', feature_category: :runner_fleet do
context 'when user is group owner' do
let(:current_user) { group_owner }
- it_behaves_like 'when :create_runner_workflow_for_namespace feature flag is disabled'
it_behaves_like 'when runner is created successfully'
it_behaves_like 'when model is invalid returns error'
@@ -304,7 +273,6 @@ RSpec.describe 'RunnerCreate', feature_category: :runner_fleet do
context 'when user is admin in admin mode', :enable_admin_mode do
let(:current_user) { admin }
- it_behaves_like 'when :create_runner_workflow_for_namespace feature flag is disabled'
it_behaves_like 'when runner is created successfully'
it_behaves_like 'when model is invalid returns error'
end
diff --git a/spec/requests/api/graphql/mutations/issues/update_spec.rb b/spec/requests/api/graphql/mutations/issues/update_spec.rb
index e51c057c182..97ead687a82 100644
--- a/spec/requests/api/graphql/mutations/issues/update_spec.rb
+++ b/spec/requests/api/graphql/mutations/issues/update_spec.rb
@@ -51,9 +51,7 @@ RSpec.describe 'Update of an existing issue', feature_category: :team_planning d
expect do
post_graphql_mutation(mutation, current_user: current_user)
issue.reload
- end.to change { issue.work_item_type.base_type }.from('issue').to('incident').and(
- change(issue, :issue_type).from('issue').to('incident')
- )
+ end.to change { issue.work_item_type.base_type }.from('issue').to('incident')
end
end
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 e6feba059c4..37bcdf61d23 100644
--- a/spec/requests/api/graphql/mutations/notes/create/note_spec.rb
+++ b/spec/requests/api/graphql/mutations/notes/create/note_spec.rb
@@ -105,7 +105,7 @@ RSpec.describe 'Adding a Note', feature_category: :team_planning do
context 'as work item' do
let_it_be(:project) { create(:project) }
- let_it_be(:noteable) { create(:work_item, :issue, project: project) }
+ let_it_be(:noteable) { create(:work_item, project: project) }
context 'when using internal param' do
let(:variables_extra) { { internal: true } }
diff --git a/spec/requests/api/graphql/mutations/notes/destroy_spec.rb b/spec/requests/api/graphql/mutations/notes/destroy_spec.rb
index f40518a574b..9d63eed276d 100644
--- a/spec/requests/api/graphql/mutations/notes/destroy_spec.rb
+++ b/spec/requests/api/graphql/mutations/notes/destroy_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe 'Destroying a Note', feature_category: :team_planning do
include GraphqlHelpers
- let(:noteable) { create(:work_item, :issue) }
+ let(:noteable) { create(:work_item) }
let!(:note) { create(:note, noteable: noteable, project: noteable.project) }
let(:global_note_id) { GitlabSchema.id_from_object(note).to_s }
let(:variables) { { id: global_note_id } }
diff --git a/spec/requests/api/graphql/mutations/notes/update/note_spec.rb b/spec/requests/api/graphql/mutations/notes/update/note_spec.rb
index 7918bc860fe..7102f817d4c 100644
--- a/spec/requests/api/graphql/mutations/notes/update/note_spec.rb
+++ b/spec/requests/api/graphql/mutations/notes/update/note_spec.rb
@@ -41,7 +41,7 @@ RSpec.describe 'Updating a Note', feature_category: :team_planning do
it_behaves_like 'a Note mutation update only with quick actions'
context 'for work item' do
- let(:noteable) { create(:work_item, :issue) }
+ let(:noteable) { create(:work_item) }
let(:note) { create(:note, noteable: noteable, project: noteable.project, note: original_body) }
it_behaves_like 'a Note mutation updates a note successfully'
diff --git a/spec/requests/api/graphql/mutations/snippets/destroy_spec.rb b/spec/requests/api/graphql/mutations/snippets/destroy_spec.rb
index 09e884d9412..c3f818b6627 100644
--- a/spec/requests/api/graphql/mutations/snippets/destroy_spec.rb
+++ b/spec/requests/api/graphql/mutations/snippets/destroy_spec.rb
@@ -53,7 +53,7 @@ RSpec.describe 'Destroying a Snippet', feature_category: :source_code_management
let!(:snippet_gid) { project.to_gid.to_s }
it 'returns an error' do
- err_message = %Q["#{snippet_gid}" does not represent an instance of Snippet]
+ err_message = %["#{snippet_gid}" does not represent an instance of Snippet]
post_graphql_mutation(mutation, current_user: current_user)
diff --git a/spec/requests/api/graphql/mutations/work_items/update_spec.rb b/spec/requests/api/graphql/mutations/work_items/update_spec.rb
index 60b5795ee9b..ea9516f256c 100644
--- a/spec/requests/api/graphql/mutations/work_items/update_spec.rb
+++ b/spec/requests/api/graphql/mutations/work_items/update_spec.rb
@@ -839,14 +839,14 @@ RSpec.describe 'Update a work item', feature_category: :team_planning do
context 'when changing work item type' do
let_it_be(:work_item) { create(:work_item, :task, project: project) }
- let(:description) { "/type Issue" }
+ let(:description) { "/type issue" }
let(:input) { { 'descriptionWidget' => { 'description' => description } } }
context 'with multiple commands' do
let_it_be(:work_item) { create(:work_item, :task, project: project) }
- let(:description) { "Updating work item\n/type Issue\n/due tomorrow\n/title Foo" }
+ let(:description) { "Updating work item\n/type issue\n/due tomorrow\n/title Foo" }
it 'updates the work item type and other attributes' do
expect do
diff --git a/spec/requests/api/graphql/project/alert_management/alert/metrics_dashboard_url_spec.rb b/spec/requests/api/graphql/project/alert_management/alert/metrics_dashboard_url_spec.rb
deleted file mode 100644
index 3417f9529bd..00000000000
--- a/spec/requests/api/graphql/project/alert_management/alert/metrics_dashboard_url_spec.rb
+++ /dev/null
@@ -1,85 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'getting Alert Management Alert Assignees', feature_category: :incident_management do
- include GraphqlHelpers
-
- let_it_be(:project) { create(:project) }
- let_it_be(:current_user) { create(:user) }
-
- let(:fields) do
- <<~QUERY
- nodes {
- iid
- metricsDashboardUrl
- }
- QUERY
- end
-
- let(:graphql_query) do
- graphql_query_for(
- 'project',
- { 'fullPath' => project.full_path },
- query_graphql_field('alertManagementAlerts', {}, fields)
- )
- end
-
- let(:alerts) { graphql_data.dig('project', 'alertManagementAlerts', 'nodes') }
- let(:first_alert) { alerts.first }
-
- before do
- stub_feature_flags(remove_monitor_metrics: false)
- project.add_developer(current_user)
- end
-
- context 'with self-managed prometheus payload' do
- include_context 'self-managed prometheus alert attributes'
-
- before do
- create(:alert_management_alert, :prometheus, project: project, payload: payload)
- end
-
- it 'includes the correct metrics dashboard url' do
- post_graphql(graphql_query, current_user: current_user)
-
- expect(first_alert).to include('metricsDashboardUrl' => dashboard_url_for_alert)
- end
-
- context 'when metrics dashboard feature is unavailable' do
- before do
- stub_feature_flags(remove_monitor_metrics: true)
- end
-
- it 'returns nil' do
- post_graphql(graphql_query, current_user: current_user)
- expect(first_alert['metricsDashboardUrl']).to be_nil
- end
- end
- end
-
- context 'with gitlab-managed prometheus payload' do
- include_context 'gitlab-managed prometheus alert attributes'
-
- before do
- create(:alert_management_alert, :prometheus, project: project, payload: payload, prometheus_alert: prometheus_alert)
- end
-
- it 'includes the correct metrics dashboard url' do
- post_graphql(graphql_query, current_user: current_user)
-
- expect(first_alert).to include('metricsDashboardUrl' => dashboard_url_for_alert)
- end
-
- context 'when metrics dashboard feature is unavailable' do
- before do
- stub_feature_flags(remove_monitor_metrics: true)
- end
-
- it 'returns nil' do
- post_graphql(graphql_query, current_user: current_user)
- expect(first_alert['metricsDashboardUrl']).to be_nil
- end
- end
- end
-end
diff --git a/spec/requests/api/graphql/project/alert_management/alerts_spec.rb b/spec/requests/api/graphql/project/alert_management/alerts_spec.rb
index 55d223daf27..7f586edd510 100644
--- a/spec/requests/api/graphql/project/alert_management/alerts_spec.rb
+++ b/spec/requests/api/graphql/project/alert_management/alerts_spec.rb
@@ -74,7 +74,6 @@ RSpec.describe 'getting Alert Management Alerts', feature_category: :incident_ma
'details' => { 'custom.alert' => 'payload', 'runbook' => 'runbook' },
'createdAt' => triggered_alert.created_at.strftime('%Y-%m-%dT%H:%M:%SZ'),
'updatedAt' => triggered_alert.updated_at.strftime('%Y-%m-%dT%H:%M:%SZ'),
- 'metricsDashboardUrl' => nil,
'detailsUrl' => triggered_alert.details_url,
'prometheusAlert' => nil,
'runbook' => 'runbook'
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
index 7587b227d9f..dd383226e17 100644
--- a/spec/requests/api/graphql/project/incident_management/timeline_events_spec.rb
+++ b/spec/requests/api/graphql/project/incident_management/timeline_events_spec.rb
@@ -15,7 +15,7 @@ RSpec.describe 'getting incident timeline events', feature_category: :incident_m
let_it_be(:promoted_from_note) { create(:note, project: project, noteable: incident) }
let_it_be(:issue_url) { project_issue_url(private_project, issue) }
let_it_be(:issue_ref) { "#{private_project.full_path}##{issue.iid}" }
- let_it_be(:issue_link) { %Q(<a href="#{issue_url}">#{issue_url}</a>) }
+ let_it_be(:issue_link) { %(<a href="#{issue_url}">#{issue_url}</a>) }
let_it_be(:timeline_event) do
create(
diff --git a/spec/requests/api/graphql/project/jobs_spec.rb b/spec/requests/api/graphql/project/jobs_spec.rb
index aea6cad9e62..2c45c7e9b79 100644
--- a/spec/requests/api/graphql/project/jobs_spec.rb
+++ b/spec/requests/api/graphql/project/jobs_spec.rb
@@ -11,6 +11,9 @@ RSpec.describe 'Query.project.jobs', feature_category: :continuous_integration d
create(:ci_pipeline, project: project, user: user)
end
+ let!(:job1) { create(:ci_build, pipeline: pipeline, name: 'job 1') }
+ let!(:job2) { create(:ci_build, pipeline: pipeline, name: 'job 2') }
+
let(:query) do
<<~QUERY
{
@@ -18,11 +21,6 @@ RSpec.describe 'Query.project.jobs', feature_category: :continuous_integration d
jobs {
nodes {
name
- previousStageJobsAndNeeds {
- nodes {
- name
- }
- }
}
}
}
@@ -30,27 +28,10 @@ RSpec.describe 'Query.project.jobs', feature_category: :continuous_integration d
QUERY
end
- it 'does not generate N+1 queries', :request_store, :use_sql_query_cache do
- build_stage = create(:ci_stage, position: 1, name: 'build', project: project, pipeline: pipeline)
- test_stage = create(:ci_stage, position: 2, name: 'test', project: project, pipeline: pipeline)
- create(:ci_build, pipeline: pipeline, name: 'docker 1 2', ci_stage: build_stage)
- create(:ci_build, pipeline: pipeline, name: 'docker 2 2', ci_stage: build_stage)
- create(:ci_build, pipeline: pipeline, name: 'rspec 1 2', ci_stage: test_stage)
- test_job = create(:ci_build, pipeline: pipeline, name: 'rspec 2 2', ci_stage: test_stage)
- create(:ci_build_need, build: test_job, name: 'docker 1 2')
-
+ it 'fetches jobs' do
post_graphql(query, current_user: user)
+ expect_graphql_errors_to_be_empty
- control = ActiveRecord::QueryRecorder.new(skip_cached: false) do
- post_graphql(query, current_user: user)
- end
-
- create(:ci_build, name: 'test-a', ci_stage: test_stage, pipeline: pipeline)
- test_b_job = create(:ci_build, name: 'test-b', ci_stage: test_stage, pipeline: pipeline)
- create(:ci_build_need, build: test_b_job, name: 'docker 2 2')
-
- expect do
- post_graphql(query, current_user: user)
- end.not_to exceed_all_query_limit(control)
+ expect(graphql_data['project']['jobs']['nodes'].pluck('name')).to contain_exactly('job 1', 'job 2')
end
end
diff --git a/spec/requests/api/graphql/project/pipeline_spec.rb b/spec/requests/api/graphql/project/pipeline_spec.rb
index fb1489372fc..d20ee5bfdff 100644
--- a/spec/requests/api/graphql/project/pipeline_spec.rb
+++ b/spec/requests/api/graphql/project/pipeline_spec.rb
@@ -337,16 +337,33 @@ RSpec.describe 'getting pipeline information nested in a project', feature_categ
end
end
- context 'N+1 queries on pipeline jobs' do
+ context 'N+1 queries on pipeline jobs.previousStageJobsOrNeeds' do
let(:pipeline) { create(:ci_pipeline, project: project) }
let(:fields) do
<<~FIELDS
- jobs {
+ stages {
nodes {
- previousStageJobsAndNeeds {
+ groups {
nodes {
- name
+ jobs {
+ nodes {
+ previousStageJobsOrNeeds {
+ nodes {
+ ... on JobNeedUnion {
+ ... on CiBuildNeed {
+ id
+ name
+ }
+ ... on CiJob {
+ id
+ name
+ }
+ }
+ }
+ }
+ }
+ }
}
}
}
@@ -357,13 +374,15 @@ RSpec.describe 'getting pipeline information nested in a project', feature_categ
it 'does not generate N+1 queries', :request_store, :use_sql_query_cache do
build_stage = create(:ci_stage, position: 1, name: 'build', project: project, pipeline: pipeline)
test_stage = create(:ci_stage, position: 2, name: 'test', project: project, pipeline: pipeline)
- create(:ci_build, pipeline: pipeline, name: 'docker 1 2', ci_stage: build_stage)
+
+ docker_1_2 = create(:ci_build, pipeline: pipeline, name: 'docker 1 2', ci_stage: build_stage)
create(:ci_build, pipeline: pipeline, name: 'docker 2 2', ci_stage: build_stage)
create(:ci_build, pipeline: pipeline, name: 'rspec 1 2', ci_stage: test_stage)
- test_job = create(:ci_build, pipeline: pipeline, name: 'rspec 2 2', ci_stage: test_stage)
- create(:ci_build_need, build: test_job, name: 'docker 1 2')
+ create(:ci_build, :dependent, needed: docker_1_2, pipeline: pipeline, name: 'rspec 2 2', ci_stage: test_stage)
+ # warm up
post_graphql(query, current_user: current_user)
+ expect_graphql_errors_to_be_empty
control = ActiveRecord::QueryRecorder.new(skip_cached: false) do
post_graphql(query, current_user: current_user)
@@ -371,7 +390,7 @@ RSpec.describe 'getting pipeline information nested in a project', feature_categ
create(:ci_build, name: 'test-a', ci_stage: test_stage, pipeline: pipeline)
test_b_job = create(:ci_build, name: 'test-b', ci_stage: test_stage, pipeline: pipeline)
- create(:ci_build_need, build: test_b_job, name: 'docker 2 2')
+ create(:ci_build, :dependent, needed: test_b_job, pipeline: pipeline, name: 'docker 2 2', ci_stage: test_stage)
expect do
post_graphql(query, current_user: current_user)
@@ -424,6 +443,7 @@ RSpec.describe 'getting pipeline information nested in a project', feature_categ
# warm up
post_graphql(query, current_user: current_user)
+ expect_graphql_errors_to_be_empty
control = ActiveRecord::QueryRecorder.new(skip_cached: false) do
post_graphql(query, current_user: current_user)
diff --git a/spec/requests/api/graphql/user_query_spec.rb b/spec/requests/api/graphql/user_query_spec.rb
index ca319ed1b2e..440eb2f52be 100644
--- a/spec/requests/api/graphql/user_query_spec.rb
+++ b/spec/requests/api/graphql/user_query_spec.rb
@@ -503,4 +503,51 @@ RSpec.describe 'getting user information', feature_category: :user_management do
end
end
end
+
+ context 'authored merge requests' do
+ let_it_be(:current_user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:subgroup) { create(:group, parent: group) }
+ let_it_be(:project) { create(:project, :public, group: group) }
+ let_it_be(:merge_request1) do
+ create(:merge_request, source_project: project, source_branch: '1', author: current_user)
+ end
+
+ let_it_be(:merge_request2) do
+ create(:merge_request, source_project: project, source_branch: '2', author: current_user)
+ end
+
+ let_it_be(:merge_request_different_user) do
+ create(:merge_request, source_project: project, source_branch: '3', author: create(:user))
+ end
+
+ let_it_be(:merge_request_different_group) do
+ create(:merge_request, source_project: create(:project, :public), author: current_user)
+ end
+
+ let_it_be(:merge_request_subgroup) do
+ create(:merge_request, source_project: create(:project, :public, group: subgroup), author: current_user)
+ end
+
+ let(:query) do
+ %(
+ query {
+ currentUser {
+ authoredMergeRequests(groupId: "#{group.to_global_id}") {
+ nodes {
+ id
+ }
+ }
+ }
+ }
+ )
+ end
+
+ it 'returns merge requests for the current user for the specified group' do
+ post_graphql(query, current_user: current_user)
+
+ expect(graphql_data_at(:current_user, :authored_merge_requests, :nodes).pluck('id')).to contain_exactly(
+ merge_request1.to_global_id.to_s, merge_request2.to_global_id.to_s, merge_request_subgroup.to_global_id.to_s)
+ end
+ end
end
diff --git a/spec/requests/api/group_clusters_spec.rb b/spec/requests/api/group_clusters_spec.rb
index 58d0e6a1eb5..7c194627f82 100644
--- a/spec/requests/api/group_clusters_spec.rb
+++ b/spec/requests/api/group_clusters_spec.rb
@@ -453,7 +453,7 @@ RSpec.describe API::GroupClusters, feature_category: :deployment_management do
end
it 'returns validation error' do
- expect(json_response['message']['platform_kubernetes.base'].first).to eq(_('Cannot modify managed Kubernetes cluster'))
+ expect(json_response['message']['platform_kubernetes'].first).to eq(_('Cannot modify managed Kubernetes cluster'))
end
end
diff --git a/spec/requests/api/group_export_spec.rb b/spec/requests/api/group_export_spec.rb
index 9dd5fe6f7c4..b4add2494b0 100644
--- a/spec/requests/api/group_export_spec.rb
+++ b/spec/requests/api/group_export_spec.rb
@@ -168,8 +168,9 @@ RSpec.describe API::GroupExport, feature_category: :importers do
end
describe 'relations export' do
+ let(:relation) { 'labels' }
let(:path) { "/groups/#{group.id}/export_relations" }
- let(:download_path) { "/groups/#{group.id}/export_relations/download?relation=labels" }
+ let(:download_path) { "/groups/#{group.id}/export_relations/download?relation=#{relation}" }
let(:status_path) { "/groups/#{group.id}/export_relations/status" }
before do
@@ -196,46 +197,131 @@ RSpec.describe API::GroupExport, feature_category: :importers do
expect(response).to have_gitlab_http_status(:error)
end
end
+
+ context 'when request is to export in batches' do
+ it 'accepts the request' do
+ expect(BulkImports::ExportService)
+ .to receive(:new)
+ .with(portable: group, user: user, batched: true)
+ .and_call_original
+
+ post api(path, user), params: { batched: true }
+
+ expect(response).to have_gitlab_http_status(:accepted)
+ end
+ end
end
describe 'GET /groups/:id/export_relations/download' do
- let(:export) { create(:bulk_import_export, group: group, relation: 'labels') }
- let(:upload) { create(:bulk_import_export_upload, export: export) }
+ context 'when export request is not batched' do
+ let(:export) { create(:bulk_import_export, group: group, relation: 'labels') }
+ let(:upload) { create(:bulk_import_export_upload, export: export) }
+
+ context 'when export file exists' do
+ it 'downloads exported group archive' do
+ upload.update!(export_file: fixture_file_upload('spec/fixtures/bulk_imports/gz/labels.ndjson.gz'))
+
+ get api(download_path, user)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+
+ context 'when export_file.file does not exist' do
+ it 'returns 404' do
+ allow(export).to receive(:upload).and_return(nil)
+
+ get api(download_path, user)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ expect(json_response['message']).to eq('Export file not found')
+ end
+ end
+
+ context 'when export is batched' do
+ let(:relation) { 'milestones' }
+
+ let_it_be(:export) { create(:bulk_import_export, :batched, group: group, relation: 'milestones') }
+
+ it 'returns 400' do
+ export.update!(batched: true)
+
+ get api(download_path, user)
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['message']).to eq('Export is batched')
+ end
+ end
+ end
- context 'when export file exists' do
- it 'downloads exported group archive' do
+ context 'when export request is batched' do
+ let(:export) { create(:bulk_import_export, :batched, group: group, relation: 'labels') }
+ let(:upload) { create(:bulk_import_export_upload) }
+ let!(:batch) { create(:bulk_import_export_batch, export: export, upload: upload) }
+
+ it 'downloads exported batch' do
upload.update!(export_file: fixture_file_upload('spec/fixtures/bulk_imports/gz/labels.ndjson.gz'))
- get api(download_path, user)
+ get api(download_path, user), params: { batched: true, batch_number: batch.batch_number }
expect(response).to have_gitlab_http_status(:ok)
+ expect(response.header['Content-Disposition'])
+ .to eq("attachment; filename=\"labels.ndjson.gz\"; filename*=UTF-8''labels.ndjson.gz")
end
- end
- context 'when export_file.file does not exist' do
- it 'returns 404' do
- allow(export).to receive(:upload).and_return(nil)
+ context 'when request is to download not batched export' do
+ it 'returns 400' do
+ get api(download_path, user)
- get api(download_path, user)
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['message']).to eq('Export is batched')
+ end
+ end
- expect(response).to have_gitlab_http_status(:not_found)
- expect(json_response['message']).to eq('404 Not found')
+ context 'when batch cannot be found' do
+ it 'returns 404' do
+ get api(download_path, user), params: { batched: true, batch_number: 0 }
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ expect(json_response['message']).to eq('Batch not found')
+ end
+ end
+
+ context 'when batch file cannot be found' do
+ it 'returns 404' do
+ batch.upload.destroy!
+
+ get api(download_path, user), params: { batched: true, batch_number: batch.batch_number }
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ expect(json_response['message']).to eq('Batch file not found')
+ end
end
end
end
describe 'GET /groups/:id/export_relations/status' do
- it 'returns a list of relation export statuses' do
- create(:bulk_import_export, :started, group: group, relation: 'labels')
- create(:bulk_import_export, :finished, group: group, relation: 'milestones')
- create(:bulk_import_export, :failed, group: group, relation: 'badges')
+ let_it_be(:started_export) { create(:bulk_import_export, :started, group: group, relation: 'labels') }
+ let_it_be(:finished_export) { create(:bulk_import_export, :finished, group: group, relation: 'milestones') }
+ let_it_be(:failed_export) { create(:bulk_import_export, :failed, group: group, relation: 'badges') }
+ it 'returns a list of relation export statuses' do
get api(status_path, user)
expect(response).to have_gitlab_http_status(:ok)
expect(json_response.pluck('relation')).to contain_exactly('labels', 'milestones', 'badges')
expect(json_response.pluck('status')).to contain_exactly(-1, 0, 1)
end
+
+ context 'when relation is specified' do
+ it 'return a single relation export status' do
+ get api(status_path, user), params: { relation: 'labels' }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['relation']).to eq('labels')
+ expect(json_response['status']).to eq(0)
+ end
+ end
end
context 'when bulk import is disabled' do
diff --git a/spec/requests/api/group_variables_spec.rb b/spec/requests/api/group_variables_spec.rb
index 6849b087211..d0edc181b65 100644
--- a/spec/requests/api/group_variables_spec.rb
+++ b/spec/requests/api/group_variables_spec.rb
@@ -56,6 +56,7 @@ RSpec.describe API::GroupVariables, feature_category: :secrets_management do
expect(json_response['protected']).to eq(variable.protected?)
expect(json_response['variable_type']).to eq(variable.variable_type)
expect(json_response['environment_scope']).to eq(variable.environment_scope)
+ expect(json_response['description']).to be_nil
end
it 'responds with 404 Not Found if requesting non-existing variable' do
@@ -115,7 +116,7 @@ RSpec.describe API::GroupVariables, feature_category: :secrets_management do
it 'creates variable with optional attributes' do
expect do
- post api("/groups/#{group.id}/variables", user), params: { variable_type: 'file', key: 'TEST_VARIABLE_2', value: 'VALUE_2' }
+ post api("/groups/#{group.id}/variables", user), params: { variable_type: 'file', key: 'TEST_VARIABLE_2', value: 'VALUE_2', description: 'description' }
end.to change { group.variables.count }.by(1)
expect(response).to have_gitlab_http_status(:created)
@@ -126,6 +127,7 @@ RSpec.describe API::GroupVariables, feature_category: :secrets_management do
expect(json_response['raw']).to be_falsey
expect(json_response['variable_type']).to eq('file')
expect(json_response['environment_scope']).to eq('*')
+ expect(json_response['description']).to eq('description')
end
it 'does not allow to duplicate variable key' do
@@ -182,7 +184,7 @@ RSpec.describe API::GroupVariables, feature_category: :secrets_management do
initial_variable = group.variables.reload.first
value_before = initial_variable.value
- put api("/groups/#{group.id}/variables/#{variable.key}", user), params: { variable_type: 'file', value: 'VALUE_1_UP', protected: true, masked: true, raw: true }
+ put api("/groups/#{group.id}/variables/#{variable.key}", user), params: { variable_type: 'file', value: 'VALUE_1_UP', protected: true, masked: true, raw: true, description: 'updated' }
updated_variable = group.variables.reload.first
@@ -193,6 +195,7 @@ RSpec.describe API::GroupVariables, feature_category: :secrets_management do
expect(json_response['variable_type']).to eq('file')
expect(json_response['masked']).to be_truthy
expect(json_response['raw']).to be_truthy
+ expect(json_response['description']).to eq('updated')
end
it 'masks the new value when logging' do
diff --git a/spec/requests/api/groups_spec.rb b/spec/requests/api/groups_spec.rb
index 2adf71f2a18..5296a8b3e93 100644
--- a/spec/requests/api/groups_spec.rb
+++ b/spec/requests/api/groups_spec.rb
@@ -270,29 +270,17 @@ RSpec.describe API::Groups, feature_category: :groups_and_projects do
end
it "includes statistics if requested", :aggregate_failures do
- attributes = {
- storage_size: 4093,
- repository_size: 123,
- wiki_size: 456,
- lfs_objects_size: 234,
- build_artifacts_size: 345,
- pipeline_artifacts_size: 456,
- packages_size: 567,
- snippets_size: 1234,
- uploads_size: 678
- }.stringify_keys
- exposed_attributes = attributes.dup
- exposed_attributes['job_artifacts_size'] = exposed_attributes.delete('build_artifacts_size')
-
- project1.statistics.update!(attributes)
+ stat_keys = %w[storage_size repository_size wiki_size
+ lfs_objects_size job_artifacts_size pipeline_artifacts_size
+ packages_size snippets_size uploads_size]
get api("/groups", admin, admin_mode: true), params: { statistics: true }
expect(response).to have_gitlab_http_status(:ok)
expect(response).to include_pagination_headers
expect(json_response).to be_an Array
- expect(json_response)
- .to satisfy_one { |group| group['statistics'] == exposed_attributes }
+
+ expect(json_response[0]["statistics"].keys).to match_array(stat_keys)
end
end
@@ -856,6 +844,39 @@ RSpec.describe API::Groups, feature_category: :groups_and_projects do
expect(shared_with_groups).to contain_exactly(group_link_1.shared_with_group_id, group_link_2.shared_with_group_id)
end
end
+
+ context "expose shared_runners_setting attribute" do
+ let(:group) { create(:group, shared_runners_enabled: true) }
+
+ before do
+ group.add_owner(user1)
+ end
+
+ it "returns the group with shared_runners_setting as 'enabled'", :aggregate_failures do
+ get api("/groups/#{group.id}", user1)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['shared_runners_setting']).to eq("enabled")
+ end
+
+ it "returns the group with shared_runners_setting as 'disabled_and_unoverridable'", :aggregate_failures do
+ group.update!(shared_runners_enabled: false, allow_descendants_override_disabled_shared_runners: false)
+
+ get api("/groups/#{group.id}", user1)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['shared_runners_setting']).to eq("disabled_and_unoverridable")
+ end
+
+ it "returns the group with shared_runners_setting as 'disabled_and_overridable'", :aggregate_failures do
+ group.update!(shared_runners_enabled: false, allow_descendants_override_disabled_shared_runners: true)
+
+ get api("/groups/#{group.id}", user1)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['shared_runners_setting']).to eq("disabled_and_overridable")
+ end
+ end
end
end
@@ -1070,6 +1091,50 @@ RSpec.describe API::Groups, feature_category: :groups_and_projects do
end
end
+ context 'with owned' do
+ let_it_be(:group) { create(:group) }
+
+ let_it_be(:project1) { create(:project, group: group) }
+ let_it_be(:project1_guest) { create(:user) }
+ let_it_be(:project1_owner) { create(:user) }
+ let_it_be(:project1_maintainer) { create(:user) }
+
+ let_it_be(:project2) { create(:project, group: group) }
+
+ before do
+ project1.add_guest(project1_guest)
+ project1.add_owner(project1_owner)
+ project1.add_maintainer(project1_maintainer)
+
+ project2_owner = project1_owner
+ project2.add_owner(project2_owner)
+ end
+
+ context "as a guest" do
+ it 'returns no projects' do
+ get api("/groups/#{group.id}/projects", project1_guest), params: { owned: true }
+ project_ids = json_response.map { |proj| proj['id'] }
+ expect(project_ids).to match_array([])
+ end
+ end
+
+ context "as a maintainer" do
+ it 'returns no projects' do
+ get api("/groups/#{group.id}/projects", project1_maintainer), params: { owned: true }
+ project_ids = json_response.map { |proj| proj['id'] }
+ expect(project_ids).to match_array([])
+ end
+ end
+
+ context "as an owner" do
+ it 'returns projects with owner access level' do
+ get api("/groups/#{group.id}/projects", project1_owner), params: { owned: true }
+ project_ids = json_response.map { |proj| proj['id'] }
+ expect(project_ids).to match_array([project1.id, project2.id])
+ end
+ end
+ end
+
it "returns the group's projects", :aggregate_failures do
get api("/groups/#{group1.id}/projects", user1)
diff --git a/spec/requests/api/helpers_spec.rb b/spec/requests/api/helpers_spec.rb
index 0be9df41e8f..7304437bc42 100644
--- a/spec/requests/api/helpers_spec.rb
+++ b/spec/requests/api/helpers_spec.rb
@@ -32,6 +32,9 @@ RSpec.describe API::Helpers, :enable_admin_mode, feature_category: :system_acces
before do
allow_any_instance_of(self.class).to receive(:options).and_return({})
+
+ allow(env['rack.session']).to receive(:enabled?).and_return(true)
+ allow(env['rack.session']).to receive(:loaded?).and_return(true)
end
def warden_authenticate_returns(value)
@@ -567,6 +570,9 @@ RSpec.describe API::Helpers, :enable_admin_mode, feature_category: :system_acces
context 'using warden authentication' do
before do
+ allow(session).to receive(:enabled?).and_return(true)
+ allow(session).to receive(:loaded?).and_return(true)
+
warden_authenticate_returns admin
env[API::Helpers::SUDO_HEADER] = user.username
end
diff --git a/spec/requests/api/import_github_spec.rb b/spec/requests/api/import_github_spec.rb
index 9b5ae72526c..e394b92c0a2 100644
--- a/spec/requests/api/import_github_spec.rb
+++ b/spec/requests/api/import_github_spec.rb
@@ -5,7 +5,8 @@ require 'spec_helper'
RSpec.describe API::ImportGithub, feature_category: :importers do
let(:token) { "asdasd12345" }
let(:provider) { :github }
- let(:access_params) { { github_access_token: token } }
+ let(:access_params) { { github_access_token: token, additional_access_tokens: additional_access_tokens } }
+ let(:additional_access_tokens) { nil }
let(:provider_username) { user.username }
let(:provider_user) { double('provider', login: provider_username).as_null_object }
let(:provider_repo) do
@@ -51,7 +52,7 @@ RSpec.describe API::ImportGithub, feature_category: :importers do
it 'returns 201 response when the project is imported successfully' do
allow(Gitlab::LegacyGithubImport::ProjectCreator)
.to receive(:new).with(provider_repo, provider_repo[:name], user.namespace, user, type: provider, **access_params)
- .and_return(double(execute: project))
+ .and_return(double(execute: project))
post api("/import/github", user), params: {
target_namespace: user.namespace_path,
@@ -120,6 +121,28 @@ RSpec.describe API::ImportGithub, feature_category: :importers do
expect(response).to have_gitlab_http_status(:unauthorized)
end
end
+
+ context 'when additional access tokens are provided' do
+ let(:additional_access_tokens) { 'token1,token2' }
+
+ it 'returns 201' do
+ expected_access_params = { github_access_token: token, additional_access_tokens: %w[token1 token2] }
+
+ expect(Gitlab::LegacyGithubImport::ProjectCreator)
+ .to receive(:new)
+ .with(provider_repo, provider_repo[:name], user.namespace, user, type: provider, **expected_access_params)
+ .and_return(double(execute: project))
+
+ post api("/import/github", user), params: {
+ target_namespace: user.namespace_path,
+ personal_access_token: token,
+ repo_id: non_existing_record_id,
+ additional_access_tokens: 'token1,token2'
+ }
+
+ expect(response).to have_gitlab_http_status(:created)
+ end
+ end
end
describe "POST /import/github/cancel" do
diff --git a/spec/requests/api/internal/kubernetes_spec.rb b/spec/requests/api/internal/kubernetes_spec.rb
index 3c76fba4e2c..09170ca952f 100644
--- a/spec/requests/api/internal/kubernetes_spec.rb
+++ b/spec/requests/api/internal/kubernetes_spec.rb
@@ -122,14 +122,28 @@ RSpec.describe API::Internal::Kubernetes, feature_category: :deployment_manageme
it 'tracks events and unique events', :aggregate_failures do
request_count = 2
- counters = { gitops_sync: 10, k8s_api_proxy_request: 5, flux_git_push_notifications_total: 42 }
- unique_counters = { agent_users_using_ci_tunnel: [10, 999, 777, 10] }
+ counters = {
+ gitops_sync: 10,
+ k8s_api_proxy_request: 5,
+ flux_git_push_notifications_total: 42,
+ k8s_api_proxy_requests_via_ci_access: 43,
+ k8s_api_proxy_requests_via_user_access: 44
+ }
+ unique_counters = {
+ agent_users_using_ci_tunnel: [10, 999, 777, 10],
+ k8s_api_proxy_requests_unique_users_via_ci_access: [10, 999, 777, 10],
+ k8s_api_proxy_requests_unique_agents_via_ci_access: [10, 999, 777, 10],
+ k8s_api_proxy_requests_unique_users_via_user_access: [10, 999, 777, 10],
+ k8s_api_proxy_requests_unique_agents_via_user_access: [10, 999, 777, 10],
+ flux_git_push_notified_unique_projects: [10, 999, 777, 10]
+ }
expected_counters = {
kubernetes_agent_gitops_sync: request_count * counters[:gitops_sync],
kubernetes_agent_k8s_api_proxy_request: request_count * counters[:k8s_api_proxy_request],
- kubernetes_agent_flux_git_push_notifications_total: request_count * counters[:flux_git_push_notifications_total]
+ kubernetes_agent_flux_git_push_notifications_total: request_count * counters[:flux_git_push_notifications_total],
+ kubernetes_agent_k8s_api_proxy_requests_via_ci_access: request_count * counters[:k8s_api_proxy_requests_via_ci_access],
+ kubernetes_agent_k8s_api_proxy_requests_via_user_access: request_count * counters[:k8s_api_proxy_requests_via_user_access]
}
- expected_hll_count = unique_counters[:agent_users_using_ci_tunnel].uniq.count
request_count.times do
send_request(params: { counters: counters, unique_counters: unique_counters })
@@ -137,13 +151,15 @@ RSpec.describe API::Internal::Kubernetes, feature_category: :deployment_manageme
expect(Gitlab::UsageDataCounters::KubernetesAgentCounter.totals).to eq(expected_counters)
- expect(
- Gitlab::UsageDataCounters::HLLRedisCounter
- .unique_events(
- event_names: 'agent_users_using_ci_tunnel',
- start_date: Date.current, end_date: Date.current + 10
- )
- ).to eq(expected_hll_count)
+ unique_counters.each do |c, xs|
+ expect(
+ Gitlab::UsageDataCounters::HLLRedisCounter
+ .unique_events(
+ event_names: c.to_s,
+ start_date: Date.current, end_date: Date.current + 10
+ )
+ ).to eq(xs.uniq.count)
+ end
end
end
end
@@ -231,7 +247,7 @@ RSpec.describe API::Internal::Kubernetes, feature_category: :deployment_manageme
'gitaly_info' => a_hash_including(
'address' => match(/\.socket$/),
'token' => 'secret',
- 'features' => {}
+ 'features' => Feature::Gitaly.server_feature_flags
),
'gitaly_repository' => a_hash_including(
'storage_name' => project.repository_storage,
@@ -274,7 +290,7 @@ RSpec.describe API::Internal::Kubernetes, feature_category: :deployment_manageme
'gitaly_info' => a_hash_including(
'address' => match(/\.socket$/),
'token' => 'secret',
- 'features' => {}
+ 'features' => Feature::Gitaly.server_feature_flags
),
'gitaly_repository' => a_hash_including(
'storage_name' => project.repository_storage,
@@ -531,18 +547,6 @@ RSpec.describe API::Internal::Kubernetes, feature_category: :deployment_manageme
expect(response).to have_gitlab_http_status(:forbidden)
end
- it 'returns 401 when global flag is disabled' do
- stub_feature_flags(kas_user_access: false)
-
- deployment_project.add_member(user, :developer)
- token = new_token
- public_id = stub_user_session(user, token)
- access_key = Gitlab::Kas::UserAccess.encrypt_public_session_id(public_id)
- send_request(params: { agent_id: agent.id, access_type: 'session_cookie', access_key: access_key, csrf_token: mask_token(token) })
-
- expect(response).to have_gitlab_http_status(:unauthorized)
- end
-
it 'returns 401 when user id is not found in session' do
deployment_project.add_member(user, :developer)
token = new_token
diff --git a/spec/requests/api/lint_spec.rb b/spec/requests/api/lint_spec.rb
index 05a9d98a9d0..7fe17760220 100644
--- a/spec/requests/api/lint_spec.rb
+++ b/spec/requests/api/lint_spec.rb
@@ -3,16 +3,6 @@
require 'spec_helper'
RSpec.describe API::Lint, feature_category: :pipeline_composition do
- describe 'POST /ci/lint' do
- it 'responds with a 410' do
- user = create(:user)
-
- post api('/ci/lint', user), params: { content: "test_job:\n script: ls" }
-
- expect(response).to have_gitlab_http_status(:gone)
- end
- end
-
describe 'GET /projects/:id/ci/lint' do
subject(:ci_lint) { get api("/projects/#{project.id}/ci/lint", api_user), params: { dry_run: dry_run, include_jobs: include_jobs } }
diff --git a/spec/requests/api/merge_requests_spec.rb b/spec/requests/api/merge_requests_spec.rb
index 50e70a9dc0f..f4cac0854e7 100644
--- a/spec/requests/api/merge_requests_spec.rb
+++ b/spec/requests/api/merge_requests_spec.rb
@@ -2,7 +2,8 @@
require "spec_helper"
-RSpec.describe API::MergeRequests, :aggregate_failures, feature_category: :source_code_management do
+RSpec.describe API::MergeRequests, :aggregate_failures, feature_category: :source_code_management,
+ quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/418757' do
include ProjectForksHelper
let_it_be(:base_time) { Time.now }
@@ -60,13 +61,14 @@ RSpec.describe API::MergeRequests, :aggregate_failures, feature_category: :sourc
end
context 'with merge status recheck projection' do
- it 'does not enqueue a merge status recheck' do
+ it 'does not check mergeability', :sidekiq_inline do
expect(check_service_class).not_to receive(:new)
- get(api(endpoint_path), params: { with_merge_status_recheck: true })
+ get(api(endpoint_path, user2), params: { with_merge_status_recheck: true })
expect_successful_response_with_paginated_array
expect(mr_entity['merge_status']).to eq('unchecked')
+ expect(merge_request.reload.merge_status).to eq('unchecked')
end
end
end
@@ -112,16 +114,32 @@ RSpec.describe API::MergeRequests, :aggregate_failures, feature_category: :sourc
end
context 'with merge status recheck projection' do
- it 'checks mergeability asynchronously' do
- expect_next_instances_of(check_service_class, (1..2)) do |service|
- expect(service).not_to receive(:execute)
- expect(service).to receive(:async_execute).and_call_original
+ context 'with batched_api_mergeability_checks FF on' do
+ it 'checks mergeability asynchronously in batch', :sidekiq_inline do
+ get(api(endpoint_path, user2), params: { with_merge_status_recheck: true })
+
+ expect_successful_response_with_paginated_array
+
+ expect(merge_request.reload.merge_status).to eq('can_be_merged')
end
+ end
- get(api(endpoint_path, user2), params: { with_merge_status_recheck: true })
+ context 'with batched_api_mergeability_checks FF off' do
+ before do
+ stub_feature_flags(batched_api_mergeability_checks: false)
+ end
- expect_successful_response_with_paginated_array
- expect(mr_entity['merge_status']).to eq('checking')
+ it 'checks mergeability asynchronously' do
+ expect_next_instances_of(check_service_class, (1..2)) do |service|
+ expect(service).not_to receive(:execute)
+ expect(service).to receive(:async_execute).and_call_original
+ end
+
+ get(api(endpoint_path, user2), params: { with_merge_status_recheck: true })
+
+ expect_successful_response_with_paginated_array
+ expect(mr_entity['merge_status']).to eq('checking')
+ end
end
end
@@ -139,13 +157,14 @@ RSpec.describe API::MergeRequests, :aggregate_failures, feature_category: :sourc
context 'with a reporter role' do
context 'with merge status recheck projection' do
- it 'does not enqueue a merge status recheck' do
+ it 'does not check mergeability', :sidekiq_inline do
expect(check_service_class).not_to receive(:new)
get(api(endpoint_path, user2), params: { with_merge_status_recheck: true })
expect_successful_response_with_paginated_array
expect(mr_entity['merge_status']).to eq('unchecked')
+ expect(merge_request.reload.merge_status).to eq('unchecked')
end
end
@@ -154,17 +173,33 @@ RSpec.describe API::MergeRequests, :aggregate_failures, feature_category: :sourc
stub_feature_flags(restrict_merge_status_recheck: false)
end
- context 'with merge status recheck projection' do
- it 'does enqueue a merge status recheck' do
- expect_next_instances_of(check_service_class, (1..2)) do |service|
- expect(service).not_to receive(:execute)
- expect(service).to receive(:async_execute).and_call_original
- end
-
+ context 'with batched_api_mergeability_checks FF on' do
+ it 'checks mergeability asynchronously in batch', :sidekiq_inline do
get(api(endpoint_path, user2), params: { with_merge_status_recheck: true })
expect_successful_response_with_paginated_array
- expect(mr_entity['merge_status']).to eq('checking')
+
+ expect(merge_request.reload.merge_status).to eq('can_be_merged')
+ end
+ end
+
+ context 'with batched_api_mergeability_checks FF off' do
+ before do
+ stub_feature_flags(batched_api_mergeability_checks: false)
+ end
+
+ context 'with merge status recheck projection' do
+ it 'does enqueue a merge status recheck' do
+ expect_next_instances_of(check_service_class, (1..2)) do |service|
+ expect(service).not_to receive(:execute)
+ expect(service).to receive(:async_execute).and_call_original
+ end
+
+ get(api(endpoint_path, user2), params: { with_merge_status_recheck: true })
+
+ expect_successful_response_with_paginated_array
+ expect(mr_entity['merge_status']).to eq('checking')
+ end
end
end
end
diff --git a/spec/requests/api/ml_model_packages_spec.rb b/spec/requests/api/ml_model_packages_spec.rb
index 9c19f522e46..3166298b430 100644
--- a/spec/requests/api/ml_model_packages_spec.rb
+++ b/spec/requests/api/ml_model_packages_spec.rb
@@ -75,6 +75,48 @@ RSpec.describe ::API::MlModelPackages, feature_category: :mlops do
:private | :developer | true | :deploy_token | true | :success
:private | :developer | true | :deploy_token | false | :unauthorized
end
+
+ # :visibility, :user_role, :member, :token_type, :valid_token, :expected_status
+ def download_permissions_tables
+ :public | :developer | true | :personal_access_token | true | :success
+ :public | :guest | true | :personal_access_token | true | :success
+ :public | :developer | true | :personal_access_token | false | :unauthorized
+ :public | :guest | true | :personal_access_token | false | :unauthorized
+ :public | :developer | false | :personal_access_token | true | :success
+ :public | :guest | false | :personal_access_token | true | :success
+ :public | :developer | false | :personal_access_token | false | :unauthorized
+ :public | :guest | false | :personal_access_token | false | :unauthorized
+ :public | :anonymous | false | :personal_access_token | true | :success
+ :private | :developer | true | :personal_access_token | true | :success
+ :private | :guest | true | :personal_access_token | true | :forbidden
+ :private | :developer | true | :personal_access_token | false | :unauthorized
+ :private | :guest | true | :personal_access_token | false | :unauthorized
+ :private | :developer | false | :personal_access_token | true | :not_found
+ :private | :guest | false | :personal_access_token | true | :not_found
+ :private | :developer | false | :personal_access_token | false | :unauthorized
+ :private | :guest | false | :personal_access_token | false | :unauthorized
+ :private | :anonymous | false | :personal_access_token | true | :not_found
+ :public | :developer | true | :job_token | true | :success
+ :public | :guest | true | :job_token | true | :success
+ :public | :developer | true | :job_token | false | :unauthorized
+ :public | :guest | true | :job_token | false | :unauthorized
+ :public | :developer | false | :job_token | true | :success
+ :public | :guest | false | :job_token | true | :success
+ :public | :developer | false | :job_token | false | :unauthorized
+ :public | :guest | false | :job_token | false | :unauthorized
+ :private | :developer | true | :job_token | true | :success
+ :private | :guest | true | :job_token | true | :forbidden
+ :private | :developer | true | :job_token | false | :unauthorized
+ :private | :guest | true | :job_token | false | :unauthorized
+ :private | :developer | false | :job_token | true | :not_found
+ :private | :guest | false | :job_token | true | :not_found
+ :private | :developer | false | :job_token | false | :unauthorized
+ :private | :guest | false | :job_token | false | :unauthorized
+ :public | :developer | true | :deploy_token | true | :success
+ :public | :developer | true | :deploy_token | false | :unauthorized
+ :private | :developer | true | :deploy_token | true | :success
+ :private | :developer | true | :deploy_token | false | :unauthorized
+ end
# rubocop:enable Metrics/AbcSize
end
@@ -82,18 +124,23 @@ RSpec.describe ::API::MlModelPackages, feature_category: :mlops do
project.send("add_#{user_role}", user) if member && user_role != :anonymous
end
- subject(:api_response) do
- request
- response
- end
-
- describe 'PUT /api/v4/projects/:id/packages/ml_models/:package_name/:package_version/:file_name/authorize' do
+ describe 'PUT /api/v4/projects/:id/packages/ml_models/:model_name/:model_version/:file_name/authorize' do
include_context 'ml model authorize permissions table'
let(:token) { tokens[:personal_access_token] }
let(:user_headers) { { 'HTTP_AUTHORIZATION' => token } }
let(:headers) { user_headers.merge(workhorse_headers) }
let(:request) { authorize_upload_file(headers) }
+ let(:model_name) { 'my_package' }
+ let(:file_name) { 'myfile.tar.gz' }
+
+ subject(:api_response) do
+ url = "/projects/#{project.id}/packages/ml_models/#{model_name}/0.0.1/#{file_name}/authorize"
+
+ put api(url), headers: headers
+
+ response
+ end
describe 'user access' do
where(:visibility, :user_role, :member, :token_type, :valid_token, :expected_status) do
@@ -115,16 +162,14 @@ RSpec.describe ::API::MlModelPackages, feature_category: :mlops do
end
describe 'application security' do
- where(:param_name, :param_value) do
- :package_name | 'my-package/../'
- :package_name | 'my-package%2f%2e%2e%2f'
- :file_name | '../.ssh%2fauthorized_keys'
- :file_name | '%2e%2e%2f.ssh%2fauthorized_keys'
+ where(:model_name, :file_name) do
+ 'my-package/../' | 'myfile.tar.gz'
+ 'my-package%2f%2e%2e%2f' | 'myfile.tar.gz'
+ 'my_package' | '../.ssh%2fauthorized_keys'
+ 'my_package' | '%2e%2e%2f.ssh%2fauthorized_keys'
end
with_them do
- let(:request) { authorize_upload_file(headers, param_name => param_value) }
-
it 'rejects malicious request' do
is_expected.to have_gitlab_http_status(:bad_request)
end
@@ -132,7 +177,7 @@ RSpec.describe ::API::MlModelPackages, feature_category: :mlops do
end
end
- describe 'PUT /api/v4/projects/:id/packages/ml_models/:package_name/:package_version/:file_name' do
+ describe 'PUT /api/v4/projects/:id/packages/ml_models/:model_name/:model_version/:file_name' do
include_context 'ml model authorize permissions table'
let_it_be(:file_name) { 'model.md5' }
@@ -143,9 +188,21 @@ RSpec.describe ::API::MlModelPackages, feature_category: :mlops do
let(:params) { { file: temp_file(file_name) } }
let(:file_key) { :file }
let(:send_rewritten_field) { true }
+ let(:model_name) { 'my_package' }
+
+ subject(:api_response) do
+ url = "/projects/#{project.id}/packages/ml_models/#{model_name}/0.0.1/#{file_name}"
- let(:request) do
- upload_file(headers)
+ workhorse_finalize(
+ api(url),
+ method: :put,
+ file_key: file_key,
+ params: params,
+ headers: headers,
+ send_rewritten_field: send_rewritten_field
+ )
+
+ response
end
describe 'success' do
@@ -179,22 +236,49 @@ RSpec.describe ::API::MlModelPackages, feature_category: :mlops do
end
end
- def authorize_upload_file(request_headers, package_name: 'mypackage', file_name: 'myfile.tar.gz')
- url = "/projects/#{project.id}/packages/ml_models/#{package_name}/0.0.1/#{file_name}/authorize"
+ describe 'GET /api/v4/projects/:project_id/packages/ml_models/:model_name/:model_version/:file_name' do
+ include_context 'ml model authorize permissions table'
- put api(url), headers: request_headers
- end
+ let_it_be(:package) { create(:ml_model_package, project: project, name: 'model', version: '0.0.1') }
+ let_it_be(:package_file) { create(:package_file, :generic, package: package, file_name: 'model.md5') }
- def upload_file(request_headers, package_name: 'mypackage')
- url = "/projects/#{project.id}/packages/ml_models/#{package_name}/0.0.1/#{file_name}"
-
- workhorse_finalize(
- api(url),
- method: :put,
- file_key: file_key,
- params: params,
- headers: request_headers,
- send_rewritten_field: send_rewritten_field
- )
+ let(:model_name) { package.name }
+ let(:model_version) { package.version }
+ let(:file_name) { package_file.file_name }
+
+ let(:token) { tokens[:personal_access_token] }
+ let(:user_headers) { { 'HTTP_AUTHORIZATION' => token } }
+ let(:headers) { user_headers.merge(workhorse_headers) }
+
+ subject(:api_response) do
+ url = "/projects/#{project.id}/packages/ml_models/#{model_name}/#{model_version}/#{file_name}"
+
+ get api(url), headers: headers
+
+ response
+ end
+
+ describe 'user access' do
+ where(:visibility, :user_role, :member, :token_type, :valid_token, :expected_status) do
+ download_permissions_tables
+ end
+
+ with_them do
+ let(:token) { valid_token ? tokens[token_type] : 'invalid-token123' }
+ let(:user_headers) { user_role == :anonymous ? {} : { 'HTTP_AUTHORIZATION' => token } }
+
+ before do
+ project.update_column(:visibility_level, Gitlab::VisibilityLevel.level_value(visibility.to_s))
+ end
+
+ if params[:expected_status] == :success
+ it_behaves_like 'process ml model package download'
+ else
+ it { is_expected.to have_gitlab_http_status(expected_status) }
+ end
+ end
+
+ it_behaves_like 'Endpoint not found if read_model_registry not available'
+ end
end
end
diff --git a/spec/requests/api/npm_group_packages_spec.rb b/spec/requests/api/npm_group_packages_spec.rb
index d97c7682b4b..431c59cf1b8 100644
--- a/spec/requests/api/npm_group_packages_spec.rb
+++ b/spec/requests/api/npm_group_packages_spec.rb
@@ -2,7 +2,8 @@
require 'spec_helper'
-RSpec.describe API::NpmGroupPackages, feature_category: :package_registry do
+RSpec.describe API::NpmGroupPackages, feature_category: :package_registry,
+ quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/418757' do
using RSpec::Parameterized::TableSyntax
include_context 'npm api setup'
@@ -152,6 +153,14 @@ RSpec.describe API::NpmGroupPackages, feature_category: :package_registry do
it_behaves_like 'returning response status', params[:expected_status]
end
end
+
+ context 'when metadata cache exists' do
+ let_it_be(:npm_metadata_cache) { create(:npm_metadata_cache, package_name: package.name, project_id: project.id) }
+
+ subject { get(url) }
+
+ it_behaves_like 'generates metadata response "on-the-fly"'
+ end
end
describe 'GET /api/v4/packages/npm/-/package/*package_name/dist-tags' do
@@ -164,12 +173,31 @@ RSpec.describe API::NpmGroupPackages, feature_category: :package_registry do
it_behaves_like 'handling create dist tag requests', scope: :group do
let(:url) { api("/groups/#{group.id}/-/packages/npm/-/package/#{package_name}/dist-tags/#{tag_name}") }
end
+
+ it_behaves_like 'enqueue a worker to sync a metadata cache' do
+ let(:tag_name) { 'test' }
+ let(:url) { api("/groups/#{group.id}/-/packages/npm/-/package/#{package_name}/dist-tags/#{tag_name}") }
+ let(:env) { { 'api.request.body': package.version } }
+ let(:headers) { build_token_auth_header(personal_access_token.token) }
+
+ subject { put(url, env: env, headers: headers) }
+ end
end
describe 'DELETE /api/v4/packages/npm/-/package/*package_name/dist-tags/:tag' do
it_behaves_like 'handling delete dist tag requests', scope: :group do
let(:url) { api("/groups/#{group.id}/-/packages/npm/-/package/#{package_name}/dist-tags/#{tag_name}") }
end
+
+ it_behaves_like 'enqueue a worker to sync a metadata cache' do
+ let_it_be(:package_tag) { create(:packages_tag, package: package) }
+
+ let(:tag_name) { package_tag.name }
+ let(:url) { api("/groups/#{group.id}/-/packages/npm/-/package/#{package_name}/dist-tags/#{tag_name}") }
+ let(:headers) { build_token_auth_header(personal_access_token.token) }
+
+ subject { delete(url, headers: headers) }
+ end
end
describe 'POST /api/v4/groups/:id/-/packages/npm/-/npm/v1/security/advisories/bulk' do
diff --git a/spec/requests/api/npm_instance_packages_spec.rb b/spec/requests/api/npm_instance_packages_spec.rb
index 97de7fa9e52..4f965d86d66 100644
--- a/spec/requests/api/npm_instance_packages_spec.rb
+++ b/spec/requests/api/npm_instance_packages_spec.rb
@@ -45,6 +45,14 @@ RSpec.describe API::NpmInstancePackages, feature_category: :package_registry do
end
end
end
+
+ context 'when metadata cache exists' do
+ let_it_be(:npm_metadata_cache) { create(:npm_metadata_cache, package_name: package.name, project_id: project.id) }
+
+ subject { get(url) }
+
+ it_behaves_like 'generates metadata response "on-the-fly"'
+ end
end
describe 'GET /api/v4/packages/npm/-/package/*package_name/dist-tags' do
@@ -57,12 +65,31 @@ RSpec.describe API::NpmInstancePackages, feature_category: :package_registry do
it_behaves_like 'handling create dist tag requests', scope: :instance do
let(:url) { api("/packages/npm/-/package/#{package_name}/dist-tags/#{tag_name}") }
end
+
+ it_behaves_like 'enqueue a worker to sync a metadata cache' do
+ let(:tag_name) { 'test' }
+ let(:url) { api("/packages/npm/-/package/#{package_name}/dist-tags/#{tag_name}") }
+ let(:env) { { 'api.request.body': package.version } }
+ let(:headers) { build_token_auth_header(personal_access_token.token) }
+
+ subject { put(url, env: env, headers: headers) }
+ end
end
describe 'DELETE /api/v4/packages/npm/-/package/*package_name/dist-tags/:tag' do
it_behaves_like 'handling delete dist tag requests', scope: :instance do
let(:url) { api("/packages/npm/-/package/#{package_name}/dist-tags/#{tag_name}") }
end
+
+ it_behaves_like 'enqueue a worker to sync a metadata cache' do
+ let_it_be(:package_tag) { create(:packages_tag, package: package) }
+
+ let(:tag_name) { package_tag.name }
+ let(:url) { api("/packages/npm/-/package/#{package_name}/dist-tags/#{tag_name}") }
+ let(:headers) { build_token_auth_header(personal_access_token.token) }
+
+ subject { delete(url, headers: headers) }
+ end
end
describe 'POST /api/v4/packages/npm/-/npm/v1/security/advisories/bulk' do
diff --git a/spec/requests/api/npm_project_packages_spec.rb b/spec/requests/api/npm_project_packages_spec.rb
index 60d4bddc502..8c0b9572af3 100644
--- a/spec/requests/api/npm_project_packages_spec.rb
+++ b/spec/requests/api/npm_project_packages_spec.rb
@@ -2,7 +2,8 @@
require 'spec_helper'
-RSpec.describe API::NpmProjectPackages, feature_category: :package_registry do
+RSpec.describe API::NpmProjectPackages, feature_category: :package_registry,
+ quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/418757' do
include ExclusiveLeaseHelpers
include_context 'npm api setup'
@@ -26,6 +27,51 @@ RSpec.describe API::NpmProjectPackages, feature_category: :package_registry do
it_behaves_like 'rejects invalid package names' do
subject { get(url) }
end
+
+ context 'when metadata cache exists', :aggregate_failures do
+ let!(:npm_metadata_cache) { create(:npm_metadata_cache, package_name: package.name, project_id: project.id) }
+ let(:metadata) { Gitlab::Json.parse(npm_metadata_cache.file.read.gsub('dist_tags', 'dist-tags')) }
+
+ subject { get(url) }
+
+ before do
+ project.add_developer(user)
+ end
+
+ it 'returns response from metadata cache' do
+ expect(Packages::Npm::GenerateMetadataService).not_to receive(:new)
+ expect(Packages::Npm::MetadataCache).to receive(:find_by_package_name_and_project_id)
+ .with(package.name, project.id).and_call_original
+
+ subject
+
+ expect(json_response).to eq(metadata)
+ end
+
+ it 'bumps last_downloaded_at of metadata cache' do
+ expect { subject }
+ .to change { npm_metadata_cache.reload.last_downloaded_at }.from(nil).to(instance_of(ActiveSupport::TimeWithZone))
+ end
+
+ it_behaves_like 'does not enqueue a worker to sync a metadata cache'
+
+ context 'when npm_metadata_cache disabled' do
+ before do
+ stub_feature_flags(npm_metadata_cache: false)
+ end
+
+ it_behaves_like 'generates metadata response "on-the-fly"'
+ end
+
+ context 'when metadata cache file does not exist' do
+ before do
+ FileUtils.rm_rf(npm_metadata_cache.file.path)
+ end
+
+ it_behaves_like 'generates metadata response "on-the-fly"'
+ it_behaves_like 'enqueue a worker to sync a metadata cache'
+ end
+ end
end
describe 'GET /api/v4/projects/:id/packages/npm/-/package/*package_name/dist-tags' do
@@ -39,12 +85,31 @@ RSpec.describe API::NpmProjectPackages, feature_category: :package_registry do
it_behaves_like 'handling create dist tag requests', scope: :project do
let(:url) { api("/projects/#{project.id}/packages/npm/-/package/#{package_name}/dist-tags/#{tag_name}") }
end
+
+ it_behaves_like 'enqueue a worker to sync a metadata cache' do
+ let(:tag_name) { 'test' }
+ let(:url) { api("/projects/#{project.id}/packages/npm/-/package/#{package_name}/dist-tags/#{tag_name}") }
+ let(:env) { { 'api.request.body': package.version } }
+ let(:headers) { build_token_auth_header(personal_access_token.token) }
+
+ subject { put(url, env: env, headers: headers) }
+ end
end
describe 'DELETE /api/v4/projects/:id/packages/npm/-/package/*package_name/dist-tags/:tag' do
it_behaves_like 'handling delete dist tag requests', scope: :project do
let(:url) { api("/projects/#{project.id}/packages/npm/-/package/#{package_name}/dist-tags/#{tag_name}") }
end
+
+ it_behaves_like 'enqueue a worker to sync a metadata cache' do
+ let_it_be(:package_tag) { create(:packages_tag, package: package) }
+
+ let(:tag_name) { package_tag.name }
+ let(:url) { api("/projects/#{project.id}/packages/npm/-/package/#{package_name}/dist-tags/#{tag_name}") }
+ let(:headers) { build_token_auth_header(personal_access_token.token) }
+
+ subject { delete(url, headers: headers) }
+ end
end
describe 'POST /api/v4/projects/:id/packages/npm/-/npm/v1/security/advisories/bulk' do
@@ -176,12 +241,13 @@ RSpec.describe API::NpmProjectPackages, feature_category: :package_registry do
subject(:upload_package_with_token) { upload_with_token(package_name, params) }
- shared_examples 'handling invalid record with 400 error' do
+ shared_examples 'handling invalid record with 400 error' do |error_message|
it 'handles an ActiveRecord::RecordInvalid exception with 400 error' do
expect { upload_package_with_token }
.not_to change { project.packages.count }
expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error']).to eq(error_message)
end
end
@@ -191,7 +257,7 @@ RSpec.describe API::NpmProjectPackages, feature_category: :package_registry do
let(:package_name) { "@#{group.path}/my_inv@@lid_package_name" }
let(:params) { upload_params(package_name: package_name) }
- it_behaves_like 'handling invalid record with 400 error'
+ it_behaves_like 'handling invalid record with 400 error', "Validation failed: Name is invalid, Name #{Gitlab::Regex.npm_package_name_regex_message}"
it_behaves_like 'not a package tracking event'
end
@@ -213,7 +279,7 @@ RSpec.describe API::NpmProjectPackages, feature_category: :package_registry do
with_them do
let(:params) { upload_params(package_name: package_name, package_version: version) }
- it_behaves_like 'handling invalid record with 400 error'
+ it_behaves_like 'handling invalid record with 400 error', "Validation failed: Version #{Gitlab::Regex.semver_regex_message}"
it_behaves_like 'not a package tracking event'
end
end
@@ -222,7 +288,7 @@ RSpec.describe API::NpmProjectPackages, feature_category: :package_registry do
let(:package_name) { "@#{group.path}/my_package_name" }
let(:params) { upload_params(package_name: package_name, file: 'npm/payload_with_empty_attachment.json') }
- it_behaves_like 'handling invalid record with 400 error'
+ it_behaves_like 'handling invalid record with 400 error', 'Attachment data is empty.'
it_behaves_like 'not a package tracking event'
end
end
@@ -297,6 +363,10 @@ RSpec.describe API::NpmProjectPackages, feature_category: :package_registry do
it_behaves_like 'handling upload with different authentications'
end
+ it_behaves_like 'enqueue a worker to sync a metadata cache' do
+ let(:package_name) { "@#{group.path}/my_package_name" }
+ end
+
context 'with an existing package' do
let_it_be(:second_project) { create(:project, namespace: namespace) }
@@ -305,7 +375,7 @@ RSpec.describe API::NpmProjectPackages, feature_category: :package_registry do
let(:package_name) { "@#{group.path}/test" }
- it_behaves_like 'handling invalid record with 400 error'
+ it_behaves_like 'handling invalid record with 400 error', 'Validation failed: Package already exists'
it_behaves_like 'not a package tracking event'
context 'with a new version' do
@@ -340,6 +410,11 @@ RSpec.describe API::NpmProjectPackages, feature_category: :package_registry do
.not_to change { project.packages.count }
expect(response).to have_gitlab_http_status(:forbidden)
+ expect(json_response['error']).to eq('Package already exists.')
+ end
+
+ it_behaves_like 'does not enqueue a worker to sync a metadata cache' do
+ subject { upload_package_with_token }
end
end
@@ -389,7 +464,8 @@ RSpec.describe API::NpmProjectPackages, feature_category: :package_registry do
.not_to change { project.packages.count }
expect(response).to have_gitlab_http_status(:bad_request)
- expect(response.body).to include('Could not obtain package lease.')
+ expect(response.body).to include('Could not obtain package lease. Please try again.')
+ expect(json_response['error']).to eq('Could not obtain package lease. Please try again.')
end
end
@@ -415,15 +491,8 @@ RSpec.describe API::NpmProjectPackages, feature_category: :package_registry do
end
end
+ it_behaves_like 'handling invalid record with 400 error', 'Validation failed: Package json structure is too large. Maximum size is 20000 characters'
it_behaves_like 'not a package tracking event'
-
- it 'returns an error' do
- expect { upload_package_with_token }
- .not_to change { project.packages.count }
-
- expect(response).to have_gitlab_http_status(:bad_request)
- expect(response.body).to include('Validation failed: Package json structure is too large')
- end
end
end
diff --git a/spec/requests/api/project_attributes.yml b/spec/requests/api/project_attributes.yml
index e0e9c944fe4..86ff739da7e 100644
--- a/spec/requests/api/project_attributes.yml
+++ b/spec/requests/api/project_attributes.yml
@@ -27,6 +27,7 @@ itself: # project
- mirror_overwrites_diverged_branches
- mirror_trigger_builds
- mirror_user_id
+ - mirror_branch_regex
- only_mirror_protected_branches
- pages_https_only
- pending_delete
@@ -42,7 +43,7 @@ itself: # project
- runners_token_encrypted
- storage_version
- topic_list
- - mirror_branch_regex
+ - verification_checksum
remapped_attributes:
avatar: avatar_url
build_allow_git_fetch: build_git_strategy
diff --git a/spec/requests/api/project_clusters_spec.rb b/spec/requests/api/project_clusters_spec.rb
index c52948a4cb0..99c190757ca 100644
--- a/spec/requests/api/project_clusters_spec.rb
+++ b/spec/requests/api/project_clusters_spec.rb
@@ -443,7 +443,7 @@ RSpec.describe API::ProjectClusters, feature_category: :deployment_management do
it 'returns validation error' do
expect(response).to have_gitlab_http_status(:bad_request)
- expect(json_response['message']['platform_kubernetes.base'].first)
+ expect(json_response['message']['platform_kubernetes'].first)
.to eq(_('Cannot modify managed Kubernetes cluster'))
end
end
diff --git a/spec/requests/api/project_export_spec.rb b/spec/requests/api/project_export_spec.rb
index 434936c0ee7..3603a71151e 100644
--- a/spec/requests/api/project_export_spec.rb
+++ b/spec/requests/api/project_export_spec.rb
@@ -567,54 +567,138 @@ RSpec.describe API::ProjectExport, :aggregate_failures, :clean_gitlab_redis_cach
expect(response).to have_gitlab_http_status(:error)
end
end
+
+ context 'when request is to export in batches' do
+ it 'accepts the request' do
+ expect(BulkImports::ExportService)
+ .to receive(:new)
+ .with(portable: project, user: user, batched: true)
+ .and_call_original
+
+ post api(path, user), params: { batched: true }
+
+ expect(response).to have_gitlab_http_status(:accepted)
+ end
+ end
end
describe 'GET /projects/:id/export_relations/download' do
- let_it_be(:export) { create(:bulk_import_export, project: project, relation: 'labels') }
- let_it_be(:upload) { create(:bulk_import_export_upload, export: export) }
+ context 'when export request is not batched' do
+ let_it_be(:export) { create(:bulk_import_export, project: project, relation: 'labels') }
+ let_it_be(:upload) { create(:bulk_import_export_upload, export: export) }
+
+ context 'when export file exists' do
+ it 'downloads exported project relation archive' do
+ upload.update!(export_file: fixture_file_upload('spec/fixtures/bulk_imports/gz/labels.ndjson.gz'))
+
+ get api(download_path, user)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response.header['Content-Disposition']).to eq("attachment; filename=\"labels.ndjson.gz\"; filename*=UTF-8''labels.ndjson.gz")
+ end
+ end
+
+ context 'when relation is not portable' do
+ let(:relation) { ::BulkImports::FileTransfer::ProjectConfig.new(project).skipped_relations.first }
+
+ it_behaves_like '400 response' do
+ subject(:request) { get api(download_path, user) }
+ end
+ end
+
+ context 'when export file does not exist' do
+ it 'returns 404' do
+ allow(upload).to receive(:export_file).and_return(nil)
+
+ get api(download_path, user)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ context 'when export is batched' do
+ let(:relation) { 'issues' }
+
+ let_it_be(:export) { create(:bulk_import_export, :batched, project: project, relation: 'issues') }
- context 'when export file exists' do
- it 'downloads exported project relation archive' do
+ it 'returns 400' do
+ export.update!(batched: true)
+
+ get api(download_path, user)
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['message']).to eq('Export is batched')
+ end
+ end
+ end
+
+ context 'when export request is batched' do
+ let(:export) { create(:bulk_import_export, :batched, project: project, relation: 'labels') }
+ let(:upload) { create(:bulk_import_export_upload) }
+ let!(:batch) { create(:bulk_import_export_batch, export: export, upload: upload) }
+
+ it 'downloads exported batch' do
upload.update!(export_file: fixture_file_upload('spec/fixtures/bulk_imports/gz/labels.ndjson.gz'))
- get api(download_path, user)
+ get api(download_path, user), params: { batched: true, batch_number: batch.batch_number }
expect(response).to have_gitlab_http_status(:ok)
expect(response.header['Content-Disposition']).to eq("attachment; filename=\"labels.ndjson.gz\"; filename*=UTF-8''labels.ndjson.gz")
end
- end
- context 'when relation is not portable' do
- let(:relation) { ::BulkImports::FileTransfer::ProjectConfig.new(project).skipped_relations.first }
+ context 'when request is to download not batched export' do
+ it 'returns 400' do
+ get api(download_path, user)
- it_behaves_like '400 response' do
- subject(:request) { get api(download_path, user) }
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['message']).to eq('Export is batched')
+ end
end
- end
- context 'when export file does not exist' do
- it 'returns 404' do
- allow(upload).to receive(:export_file).and_return(nil)
+ context 'when batch cannot be found' do
+ it 'returns 404' do
+ get api(download_path, user), params: { batched: true, batch_number: 0 }
- get api(download_path, user)
+ expect(response).to have_gitlab_http_status(:not_found)
+ expect(json_response['message']).to eq('Batch not found')
+ end
+ end
+
+ context 'when batch file cannot be found' do
+ it 'returns 404' do
+ batch.upload.destroy!
+
+ get api(download_path, user), params: { batched: true, batch_number: batch.batch_number }
- expect(response).to have_gitlab_http_status(:not_found)
+ expect(response).to have_gitlab_http_status(:not_found)
+ expect(json_response['message']).to eq('Batch file not found')
+ end
end
end
end
describe 'GET /projects/:id/export_relations/status' do
- it 'returns a list of relation export statuses' do
- create(:bulk_import_export, :started, project: project, relation: 'labels')
- create(:bulk_import_export, :finished, project: project, relation: 'milestones')
- create(:bulk_import_export, :failed, project: project, relation: 'project_badges')
+ let_it_be(:started_export) { create(:bulk_import_export, :started, project: project, relation: 'labels') }
+ let_it_be(:finished_export) { create(:bulk_import_export, :finished, project: project, relation: 'milestones') }
+ let_it_be(:failed_export) { create(:bulk_import_export, :failed, project: project, relation: 'project_badges') }
+ it 'returns a list of relation export statuses' do
get api(status_path, user)
expect(response).to have_gitlab_http_status(:ok)
expect(json_response.pluck('relation')).to contain_exactly('labels', 'milestones', 'project_badges')
expect(json_response.pluck('status')).to contain_exactly(-1, 0, 1)
end
+
+ context 'when relation is specified' do
+ it 'return a single relation export status' do
+ get api(status_path, user), params: { relation: 'labels' }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['relation']).to eq('labels')
+ expect(json_response['status']).to eq(0)
+ end
+ end
end
context 'with bulk_import is disabled' do
diff --git a/spec/requests/api/project_hooks_spec.rb b/spec/requests/api/project_hooks_spec.rb
index c6bf77e5dcf..9d94b5437b7 100644
--- a/spec/requests/api/project_hooks_spec.rb
+++ b/spec/requests/api/project_hooks_spec.rb
@@ -57,6 +57,7 @@ RSpec.describe API::ProjectHooks, 'ProjectHooks', feature_category: :webhooks do
job_events
deployment_events
releases_events
+ emoji_events
]
end
diff --git a/spec/requests/api/project_packages_spec.rb b/spec/requests/api/project_packages_spec.rb
index b84b7e9c52d..09991be998a 100644
--- a/spec/requests/api/project_packages_spec.rb
+++ b/spec/requests/api/project_packages_spec.rb
@@ -660,6 +660,12 @@ RSpec.describe API::ProjectPackages, feature_category: :package_registry do
expect(response).to have_gitlab_http_status(:no_content)
end
+ it_behaves_like 'enqueue a worker to sync a metadata cache' do
+ let(:package_name) { package1.name }
+
+ subject { delete api(package_url, user) }
+ end
+
context 'with JOB-TOKEN auth' do
let(:job) { create(:ci_build, :running, user: user, project: project) }
@@ -692,6 +698,14 @@ RSpec.describe API::ProjectPackages, feature_category: :package_registry do
delete api(package_url, user)
end
+
+ it_behaves_like 'does not enqueue a worker to sync a metadata cache' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ subject { delete api(package_url, user) }
+ end
end
end
end
diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb
index bb96771b3d5..f5d1bbbc7e8 100644
--- a/spec/requests/api/projects_spec.rb
+++ b/spec/requests/api/projects_spec.rb
@@ -223,14 +223,6 @@ RSpec.describe API::Projects, :aggregate_failures, feature_category: :groups_and
include_examples 'includes container_registry_access_level'
- context 'when projects_preloader_fix is disabled' do
- before do
- stub_feature_flags(projects_preloader_fix: false)
- end
-
- include_examples 'includes container_registry_access_level'
- end
-
it 'includes various project feature fields' do
get api(path, user)
project_response = json_response.find { |p| p['id'] == project.id }
@@ -1843,6 +1835,72 @@ RSpec.describe API::Projects, :aggregate_failures, feature_category: :groups_and
end
end
+ describe 'GET /users/:user_id/contributed_projects/' do
+ let(:path) { "/users/#{user3.id}/contributed_projects/" }
+
+ let_it_be(:project1) { create(:project, :public, path: 'my-project') }
+ let_it_be(:project2) { create(:project, :public) }
+ let_it_be(:project3) { create(:project, :public) }
+ let_it_be(:private_project) { create(:project, :private) }
+
+ before do
+ private_project.add_maintainer(user3)
+
+ create(:push_event, project: project1, author: user3)
+ create(:push_event, project: project2, author: user3)
+ create(:push_event, project: private_project, author: user3)
+ end
+
+ it 'returns error when user not found' do
+ get api("/users/#{non_existing_record_id}/contributed_projects/", user)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ expect(json_response['message']).to eq('404 User Not Found')
+ end
+
+ context 'with a public profile' do
+ it 'returns projects filtered by user' do
+ get api(path, user)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to include_pagination_headers
+ expect(json_response).to be_an Array
+ expect(json_response.map { |project| project['id'] })
+ .to contain_exactly(project1.id, project2.id)
+ end
+ end
+
+ context 'with a private profile' do
+ before do
+ user3.update!(private_profile: true)
+ user3.reload
+ end
+
+ context 'user does not have access to view the private profile' do
+ it 'returns no projects' do
+ get api(path, user)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to include_pagination_headers
+ expect(json_response).to be_an Array
+ expect(json_response).to be_empty
+ end
+ end
+
+ context 'user has access to view the private profile as an admin' do
+ it 'returns projects filtered by user' do
+ get api(path, admin, admin_mode: true)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to include_pagination_headers
+ expect(json_response).to be_an Array
+ expect(json_response.map { |project| project['id'] })
+ .to contain_exactly(project1.id, project2.id, private_project.id)
+ end
+ end
+ end
+ end
+
describe 'POST /projects/user/:id' do
let(:path) { "/projects/user/#{user.id}" }
@@ -2588,12 +2646,12 @@ RSpec.describe API::Projects, :aggregate_failures, feature_category: :groups_and
expect(diff).to be_empty, failure_message(diff)
end
- def failure_message(_diff)
+ def failure_message(diff)
<<~MSG
It looks like project's set of exposed attributes is different from the expected set.
The following attributes are missing or newly added:
- {diff.to_a.to_sentence}
+ #{diff.to_a.to_sentence}
Please update #{project_attributes_file} file"
MSG
diff --git a/spec/requests/api/protected_branches_spec.rb b/spec/requests/api/protected_branches_spec.rb
index 04d5f7ac20a..b79cff5a905 100644
--- a/spec/requests/api/protected_branches_spec.rb
+++ b/spec/requests/api/protected_branches_spec.rb
@@ -121,7 +121,18 @@ RSpec.describe API::ProtectedBranches, feature_category: :source_code_management
get api(route, user)
expect(json_response['push_access_levels']).to include(
- a_hash_including('access_level_description' => 'Deploy key', 'deploy_key_id' => deploy_key.id)
+ a_hash_including('access_level_description' => deploy_key.title, 'deploy_key_id' => deploy_key.id)
+ )
+ end
+ end
+
+ context 'when a deploy key is not present' do
+ it 'returns null deploy key field' do
+ create(:protected_branch_push_access_level, protected_branch: protected_branch)
+ get api(route, user)
+
+ expect(json_response['push_access_levels']).to include(
+ a_hash_including('deploy_key_id' => nil)
)
end
end
diff --git a/spec/requests/api/protected_tags_spec.rb b/spec/requests/api/protected_tags_spec.rb
index c6398e624f8..8a98c751877 100644
--- a/spec/requests/api/protected_tags_spec.rb
+++ b/spec/requests/api/protected_tags_spec.rb
@@ -95,7 +95,18 @@ RSpec.describe API::ProtectedTags, feature_category: :source_code_management do
get api(route, user)
expect(json_response['create_access_levels']).to include(
- a_hash_including('access_level_description' => 'Deploy key', 'deploy_key_id' => deploy_key.id)
+ a_hash_including('access_level_description' => deploy_key.title, 'deploy_key_id' => deploy_key.id)
+ )
+ end
+ end
+
+ context 'when a deploy key is not present' do
+ it 'returns null deploy key field' do
+ create(:protected_tag_create_access_level, protected_tag: protected_tag)
+ get api(route, user)
+
+ expect(json_response['create_access_levels']).to include(
+ a_hash_including('deploy_key_id' => nil)
)
end
end
diff --git a/spec/requests/api/search_spec.rb b/spec/requests/api/search_spec.rb
index 1b331e9c099..0feff90d088 100644
--- a/spec/requests/api/search_spec.rb
+++ b/spec/requests/api/search_spec.rb
@@ -688,6 +688,16 @@ RSpec.describe API::Search, :clean_gitlab_redis_rate_limiting, feature_category:
end
end
+ context 'when user does not have permissions for scope' do
+ it 'returns an empty array' do
+ project.project_feature.update!(issues_access_level: Gitlab::VisibilityLevel::PRIVATE)
+
+ get api(endpoint, user), params: { scope: 'issues', search: 'awesome' }
+
+ expect(json_response).to be_empty
+ end
+ end
+
context 'when project does not exist' do
it 'returns 404 error' do
get api('/projects/0/search', user), params: { scope: 'issues', search: 'awesome' }
@@ -861,7 +871,7 @@ RSpec.describe API::Search, :clean_gitlab_redis_rate_limiting, feature_category:
get api(endpoint, user), params: { scope: 'wiki_blobs', search: 'awesome' }
end
- it_behaves_like 'response is correct', schema: 'public_api/v4/blobs'
+ it_behaves_like 'response is correct', schema: 'public_api/v4/wiki_blobs'
it_behaves_like 'ping counters', scope: :wiki_blobs
diff --git a/spec/requests/api/settings_spec.rb b/spec/requests/api/settings_spec.rb
index 79e96d7ea3e..dfaba969153 100644
--- a/spec/requests/api/settings_spec.rb
+++ b/spec/requests/api/settings_spec.rb
@@ -80,6 +80,7 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting, featu
expect(json_response['valid_runner_registrars']).to match_array(%w(project group))
expect(json_response['ci_max_includes']).to eq(150)
expect(json_response['allow_account_deletion']).to eq(true)
+ expect(json_response['gitlab_shell_operation_limit']).to eq(600)
end
end
@@ -190,13 +191,9 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting, featu
default_syntax_highlighting_theme: 2,
projects_api_rate_limit_unauthenticated: 100,
silent_mode_enabled: true,
- slack_app_enabled: true,
- slack_app_id: 'SLACK_APP_ID',
- slack_app_secret: 'SLACK_APP_SECRET',
- slack_app_signing_secret: 'SLACK_APP_SIGNING_SECRET',
- slack_app_verification_token: 'SLACK_APP_VERIFICATION_TOKEN',
valid_runner_registrars: ['group'],
- allow_account_deletion: false
+ allow_account_deletion: false,
+ gitlab_shell_operation_limit: 500
}
expect(response).to have_gitlab_http_status(:ok)
@@ -270,16 +267,23 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting, featu
expect(json_response['default_syntax_highlighting_theme']).to eq(2)
expect(json_response['projects_api_rate_limit_unauthenticated']).to be(100)
expect(json_response['silent_mode_enabled']).to be(true)
- expect(json_response['slack_app_enabled']).to be(true)
- expect(json_response['slack_app_id']).to eq('SLACK_APP_ID')
- expect(json_response['slack_app_secret']).to eq('SLACK_APP_SECRET')
- expect(json_response['slack_app_signing_secret']).to eq('SLACK_APP_SIGNING_SECRET')
- expect(json_response['slack_app_verification_token']).to eq('SLACK_APP_VERIFICATION_TOKEN')
expect(json_response['valid_runner_registrars']).to eq(['group'])
expect(json_response['allow_account_deletion']).to be(false)
+ expect(json_response['gitlab_shell_operation_limit']).to be(500)
end
end
+ it "updates default_branch_protection_defaults from the default_branch_protection param" do
+ expected_update = ::Gitlab::Access::BranchProtection.protected_against_developer_pushes.stringify_keys
+
+ put api("/application/settings", admin),
+ params: { default_branch_protection: ::Gitlab::Access::PROTECTION_DEV_CAN_MERGE }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['default_branch_protection']).to eq(Gitlab::Access::PROTECTION_DEV_CAN_MERGE)
+ expect(ApplicationSetting.first.default_branch_protection_defaults).to eq(expected_update)
+ end
+
it "supports legacy performance_bar_allowed_group_id" do
put api("/application/settings", admin),
params: { performance_bar_allowed_group_id: group.full_path }
@@ -550,6 +554,85 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting, featu
end
end
+ context 'GitLab for Slack app settings' do
+ let(:settings) do
+ {
+ slack_app_enabled: slack_app_enabled,
+ slack_app_id: slack_app_id,
+ slack_app_secret: slack_app_secret,
+ slack_app_signing_secret: slack_app_signing_secret,
+ slack_app_verification_token: slack_app_verification_token
+ }
+ end
+
+ context 'when GitLab for Slack app is enabled' do
+ let(:slack_app_enabled) { true }
+
+ context 'when other params are blank' do
+ let(:slack_app_id) { nil }
+ let(:slack_app_secret) { nil }
+ let(:slack_app_signing_secret) { nil }
+ let(:slack_app_verification_token) { nil }
+
+ it 'does not update the settings' do
+ put api("/application/settings", admin), params: settings
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+
+ expect(json_response['slack_app_enabled']).to be(nil)
+ expect(json_response['slack_app_id']).to be(nil)
+ expect(json_response['slack_app_secret']).to be(nil)
+ expect(json_response['slack_app_signing_secret']).to be(nil)
+ expect(json_response['slack_app_verification_token']).to be(nil)
+
+ message = json_response['message']
+
+ expect(message['slack_app_id']).to include("can't be blank")
+ expect(message['slack_app_secret']).to include("can't be blank")
+ expect(message['slack_app_signing_secret']).to include("can't be blank")
+ expect(message['slack_app_verification_token']).to include("can't be blank")
+ end
+ end
+
+ context 'when other params are present' do
+ let(:slack_app_id) { 'ID' }
+ let(:slack_app_secret) { 'SECRET' }
+ let(:slack_app_signing_secret) { 'SIGNING_SECRET' }
+ let(:slack_app_verification_token) { 'VERIFICATION_TOKEN' }
+
+ it 'updates the settings' do
+ put api("/application/settings", admin), params: settings
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['slack_app_enabled']).to be(true)
+ expect(json_response['slack_app_id']).to eq('ID')
+ expect(json_response['slack_app_secret']).to eq('SECRET')
+ expect(json_response['slack_app_signing_secret']).to eq('SIGNING_SECRET')
+ expect(json_response['slack_app_verification_token']).to eq('VERIFICATION_TOKEN')
+ end
+ end
+ end
+
+ context 'when GitLab for Slack app is not enabled' do
+ let(:slack_app_enabled) { false }
+ let(:slack_app_id) { nil }
+ let(:slack_app_secret) { nil }
+ let(:slack_app_signing_secret) { nil }
+ let(:slack_app_verification_token) { nil }
+
+ it 'allows blank attributes' do
+ put api("/application/settings", admin), params: settings
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['slack_app_enabled']).to be(false)
+ expect(json_response['slack_app_id']).to be(nil)
+ expect(json_response['slack_app_secret']).to be(nil)
+ expect(json_response['slack_app_signing_secret']).to be(nil)
+ expect(json_response['slack_app_verification_token']).to be(nil)
+ end
+ end
+ end
+
context "missing plantuml_url value when plantuml_enabled is true" do
it "returns a blank parameter error message" do
put api("/application/settings", admin), params: { plantuml_enabled: true }
diff --git a/spec/requests/api/statistics_spec.rb b/spec/requests/api/statistics_spec.rb
index baac39abf2c..76190d4e272 100644
--- a/spec/requests/api/statistics_spec.rb
+++ b/spec/requests/api/statistics_spec.rb
@@ -59,7 +59,7 @@ RSpec.describe API::Statistics, 'Statistics', :aggregate_failures, feature_categ
create_list(:note, 2, author: admin, project: projects.first, noteable: issues.first)
create_list(:milestone, 3, project: projects.first)
create(:key, user: admin)
- create(:merge_request, source_project: projects.first)
+ create(:merge_request, :skip_diff_creation, source_project: projects.first)
fork_project(projects.first, admin)
# Make sure the reltuples have been updated
diff --git a/spec/requests/api/usage_data_spec.rb b/spec/requests/api/usage_data_spec.rb
index 935ddbf4764..c8f1e8d6973 100644
--- a/spec/requests/api/usage_data_spec.rb
+++ b/spec/requests/api/usage_data_spec.rb
@@ -164,6 +164,61 @@ RSpec.describe API::UsageData, feature_category: :service_ping do
end
end
+ describe 'POST /usage_data/track_event' do
+ let(:endpoint) { '/usage_data/track_event' }
+ let(:known_event) { 'i_compliance_dashboard' }
+ let(:unknown_event) { 'unknown' }
+ let(:namespace_id) { 123 }
+ let(:project_id) { 123 }
+
+ context 'without CSRF token' do
+ it 'returns forbidden' do
+ allow(Gitlab::RequestForgeryProtection).to receive(:verified?).and_return(false)
+
+ post api(endpoint, user), params: { event: known_event, namespace_id: namespace_id, project_id: project_id }
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+
+ context 'usage_data_api feature not enabled' do
+ it 'returns not_found' do
+ stub_feature_flags(usage_data_api: false)
+
+ post api(endpoint, user), params: { event: known_event, namespace_id: namespace_id, project_id: project_id }
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ context 'without authentication' do
+ it 'returns 401 response' do
+ post api(endpoint), params: { event: known_event, namespace_id: namespace_id, project_id: project_id }
+
+ expect(response).to have_gitlab_http_status(:unauthorized)
+ end
+ end
+
+ context 'with authentication' do
+ before do
+ stub_application_setting(usage_ping_enabled: true)
+ allow(Gitlab::RequestForgeryProtection).to receive(:verified?).and_return(true)
+ end
+
+ context 'with correct params' do
+ it 'returns status ok' do
+ expect(Gitlab::InternalEvents).to receive(:track_event).with(known_event, anything)
+ # allow other events to also get triggered
+ allow(Gitlab::InternalEvents).to receive(:track_event)
+
+ post api(endpoint, user), params: { event: known_event, namespace_id: namespace_id, project_id: project_id }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+ end
+ end
+
describe 'GET /usage_data/metric_definitions' do
let(:endpoint) { '/usage_data/metric_definitions' }
let(:metric_yaml) do
diff --git a/spec/requests/api/user_runners_spec.rb b/spec/requests/api/user_runners_spec.rb
new file mode 100644
index 00000000000..0e40dcade19
--- /dev/null
+++ b/spec/requests/api/user_runners_spec.rb
@@ -0,0 +1,243 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::UserRunners, :aggregate_failures, feature_category: :runner_fleet do
+ let_it_be(:admin) { create(:admin) }
+ let_it_be(:user, reload: true) { create(:user, username: 'user.withdot') }
+
+ describe 'POST /user/runners' do
+ subject(:request) { post api(path, current_user, **post_args), params: runner_attrs }
+
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, namespace: group) }
+ let_it_be(:group_owner) { create(:user).tap { |user| group.add_owner(user) } }
+ let_it_be(:group_maintainer) { create(:user).tap { |user| group.add_maintainer(user) } }
+ let_it_be(:project_developer) { create(:user).tap { |user| project.add_developer(user) } }
+
+ let(:post_args) { { admin_mode: true } }
+ let(:runner_attrs) { { runner_type: 'instance_type' } }
+ let(:path) { '/user/runners' }
+
+ shared_examples 'when runner creation fails due to authorization' do
+ it 'does not create a runner' do
+ expect do
+ request
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end.not_to change { Ci::Runner.count }
+ end
+ end
+
+ shared_context 'when user does not have sufficient permissions returns forbidden' do
+ context 'when user is admin and admin mode is disabled' do
+ let(:current_user) { admin }
+ let(:post_args) { { admin_mode: false } }
+
+ it_behaves_like 'when runner creation fails due to authorization'
+ end
+
+ context 'when user is not an admin or a member of the namespace' do
+ let(:current_user) { user }
+
+ it_behaves_like 'when runner creation fails due to authorization'
+ end
+ end
+
+ shared_examples 'creates a runner' do
+ it 'creates a runner' do
+ expect do
+ request
+
+ expect(response).to have_gitlab_http_status(:created)
+ end.to change { Ci::Runner.count }.by(1)
+ end
+ end
+
+ shared_examples 'fails to create runner with expected_status_code' do
+ let(:expected_message) { nil }
+ let(:expected_error) { nil }
+
+ it 'does not create runner' do
+ expect do
+ request
+
+ expect(response).to have_gitlab_http_status(expected_status_code)
+ expect(json_response['message']).to include(expected_message) if expected_message
+ expect(json_response['error']).to include(expected_error) if expected_error
+ end.not_to change { Ci::Runner.count }
+ end
+ end
+
+ shared_context 'with request authorized with access token' do
+ let(:current_user) { nil }
+ let(:pat) { create(:personal_access_token, user: token_user, scopes: [scope]) }
+ let(:path) { "/user/runners?private_token=#{pat.token}" }
+
+ %i[create_runner api].each do |scope|
+ context "with #{scope} scope" do
+ let(:scope) { scope }
+
+ it_behaves_like 'creates a runner'
+ end
+ end
+
+ context 'with read_api scope' do
+ let(:scope) { :read_api }
+
+ it_behaves_like 'fails to create runner with expected_status_code' do
+ let(:expected_status_code) { :forbidden }
+ let(:expected_error) { 'insufficient_scope' }
+ end
+ end
+ end
+
+ context 'when runner_type is :instance_type' do
+ let(:runner_attrs) { { runner_type: 'instance_type' } }
+
+ context 'when user has sufficient permissions' do
+ let(:current_user) { admin }
+
+ it_behaves_like 'creates a runner'
+ end
+
+ context 'with admin mode enabled', :enable_admin_mode do
+ let(:token_user) { admin }
+
+ it_behaves_like 'with request authorized with access token'
+ end
+
+ it_behaves_like 'when user does not have sufficient permissions returns forbidden'
+
+ context 'when user is not an admin' do
+ let(:current_user) { user }
+
+ it_behaves_like 'when runner creation fails due to authorization'
+ end
+
+ context 'when model validation fails' do
+ let(:runner_attrs) { { runner_type: 'instance_type', run_untagged: false, tag_list: [] } }
+ let(:current_user) { admin }
+
+ it_behaves_like 'fails to create runner with expected_status_code' do
+ let(:expected_status_code) { :bad_request }
+ let(:expected_message) { 'Tags list can not be empty' }
+ end
+ end
+ end
+
+ context 'when runner_type is :group_type' do
+ let(:post_args) { {} }
+
+ context 'when group_id is specified' do
+ let(:runner_attrs) { { runner_type: 'group_type', group_id: group.id } }
+
+ context 'when user has sufficient permissions' do
+ let(:current_user) { group_owner }
+
+ it_behaves_like 'creates a runner'
+ end
+
+ it_behaves_like 'with request authorized with access token' do
+ let(:token_user) { group_owner }
+ end
+
+ it_behaves_like 'when user does not have sufficient permissions returns forbidden'
+
+ context 'when user is a maintainer' do
+ let(:current_user) { group_maintainer }
+
+ it_behaves_like 'when runner creation fails due to authorization'
+ end
+ end
+
+ context 'when group_id is not specified' do
+ let(:runner_attrs) { { runner_type: 'group_type' } }
+ let(:current_user) { group_owner }
+
+ it 'fails to create runner with :bad_request' do
+ expect do
+ request
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error']).to include('group_id is missing')
+ end.not_to change { Ci::Runner.count }
+ end
+ end
+ end
+
+ context 'when runner_type is :project_type' do
+ let(:post_args) { {} }
+
+ context 'when project_id is specified' do
+ let(:runner_attrs) { { runner_type: 'project_type', project_id: project.id } }
+
+ context 'when user has sufficient permissions' do
+ let(:current_user) { group_owner }
+
+ it_behaves_like 'creates a runner'
+ end
+
+ it_behaves_like 'with request authorized with access token' do
+ let(:token_user) { group_owner }
+ end
+
+ it_behaves_like 'when user does not have sufficient permissions returns forbidden'
+
+ context 'when user is a developer' do
+ let(:current_user) { project_developer }
+
+ it_behaves_like 'when runner creation fails due to authorization'
+ end
+ end
+
+ context 'when project_id is not specified' do
+ let(:runner_attrs) { { runner_type: 'project_type' } }
+ let(:current_user) { group_owner }
+
+ it 'fails to create runner with :bad_request' do
+ expect do
+ request
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error']).to include('project_id is missing')
+ end.not_to change { Ci::Runner.count }
+ end
+ end
+ end
+
+ context 'with missing runner_type' do
+ let(:runner_attrs) { {} }
+ let(:current_user) { admin }
+
+ it 'fails to create runner with :bad_request' do
+ expect do
+ request
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error']).to eq('runner_type is missing, runner_type does not have a valid value')
+ end.not_to change { Ci::Runner.count }
+ end
+ end
+
+ context 'with unknown runner_type' do
+ let(:runner_attrs) { { runner_type: 'unknown' } }
+ let(:current_user) { admin }
+
+ it 'fails to create runner with :bad_request' do
+ expect do
+ request
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error']).to eq('runner_type does not have a valid value')
+ end.not_to change { Ci::Runner.count }
+ end
+ end
+
+ it 'returns a 401 error if unauthorized' do
+ post api(path), params: runner_attrs
+
+ expect(response).to have_gitlab_http_status(:unauthorized)
+ end
+ end
+end
diff --git a/spec/requests/api/users_spec.rb b/spec/requests/api/users_spec.rb
index 3737c91adbc..2bbcf6b3f38 100644
--- a/spec/requests/api/users_spec.rb
+++ b/spec/requests/api/users_spec.rb
@@ -4851,169 +4851,4 @@ RSpec.describe API::Users, :aggregate_failures, feature_category: :user_profile
let(:attributable) { user }
let(:other_attributable) { admin }
end
-
- describe 'POST /user/runners', feature_category: :runner_fleet do
- subject(:request) { post api(path, current_user, **post_args), params: runner_attrs }
-
- let_it_be(:group_owner) { create(:user) }
- let_it_be(:group) { create(:group) }
- let_it_be(:project) { create(:project, namespace: group) }
-
- let(:post_args) { { admin_mode: true } }
- let(:runner_attrs) { { runner_type: 'instance_type' } }
- let(:path) { '/user/runners' }
-
- before do
- group.add_owner(group_owner)
- end
-
- shared_context 'returns forbidden when user does not have sufficient permissions' do
- let(:current_user) { admin }
- let(:post_args) { { admin_mode: false } }
-
- it 'does not create a runner' do
- expect do
- request
-
- expect(response).to have_gitlab_http_status(:forbidden)
- end.not_to change { Ci::Runner.count }
- end
- end
-
- shared_examples 'creates a runner' do
- it 'creates a runner' do
- expect do
- request
-
- expect(response).to have_gitlab_http_status(:created)
- end.to change { Ci::Runner.count }.by(1)
- end
- end
-
- shared_examples 'fails to create runner with :bad_request' do
- it 'does not create runner' do
- expect do
- request
-
- expect(response).to have_gitlab_http_status(:bad_request)
- expect(json_response['message']).to include(expected_error)
- end.not_to change { Ci::Runner.count }
- end
- end
-
- context 'when runner_type is :instance_type' do
- let(:runner_attrs) { { runner_type: 'instance_type' } }
-
- context 'when user has sufficient permissions' do
- let(:current_user) { admin }
-
- it_behaves_like 'creates a runner'
- end
-
- it_behaves_like 'returns forbidden when user does not have sufficient permissions'
-
- context 'when model validation fails' do
- let(:runner_attrs) { { runner_type: 'instance_type', run_untagged: false, tag_list: [] } }
- let(:current_user) { admin }
-
- it_behaves_like 'fails to create runner with :bad_request' do
- let(:expected_error) { 'Tags list can not be empty' }
- end
- end
- end
-
- context 'when runner_type is :group_type' do
- let(:post_args) { {} }
-
- context 'when group_id is specified' do
- let(:runner_attrs) { { runner_type: 'group_type', group_id: group.id } }
-
- context 'when user has sufficient permissions' do
- let(:current_user) { group_owner }
-
- it_behaves_like 'creates a runner'
- end
-
- it_behaves_like 'returns forbidden when user does not have sufficient permissions'
- end
-
- context 'when group_id is not specified' do
- let(:runner_attrs) { { runner_type: 'group_type' } }
- let(:current_user) { group_owner }
-
- it 'fails to create runner with :bad_request' do
- expect do
- request
-
- expect(response).to have_gitlab_http_status(:bad_request)
- expect(json_response['error']).to include('group_id is missing')
- end.not_to change { Ci::Runner.count }
- end
- end
- end
-
- context 'when runner_type is :project_type' do
- let(:post_args) { {} }
-
- context 'when project_id is specified' do
- let(:runner_attrs) { { runner_type: 'project_type', project_id: project.id } }
-
- context 'when user has sufficient permissions' do
- let(:current_user) { group_owner }
-
- it_behaves_like 'creates a runner'
- end
-
- it_behaves_like 'returns forbidden when user does not have sufficient permissions'
- end
-
- context 'when project_id is not specified' do
- let(:runner_attrs) { { runner_type: 'project_type' } }
- let(:current_user) { group_owner }
-
- it 'fails to create runner with :bad_request' do
- expect do
- request
-
- expect(response).to have_gitlab_http_status(:bad_request)
- expect(json_response['error']).to include('project_id is missing')
- end.not_to change { Ci::Runner.count }
- end
- end
- end
-
- context 'with missing runner_type' do
- let(:runner_attrs) { {} }
- let(:current_user) { admin }
-
- it 'fails to create runner with :bad_request' do
- expect do
- request
-
- expect(response).to have_gitlab_http_status(:bad_request)
- expect(json_response['error']).to eq('runner_type is missing, runner_type does not have a valid value')
- end.not_to change { Ci::Runner.count }
- end
- end
-
- context 'with unknown runner_type' do
- let(:runner_attrs) { { runner_type: 'unknown' } }
- let(:current_user) { admin }
-
- it 'fails to create runner with :bad_request' do
- expect do
- request
-
- expect(response).to have_gitlab_http_status(:bad_request)
- expect(json_response['error']).to eq('runner_type does not have a valid value')
- end.not_to change { Ci::Runner.count }
- end
- end
-
- it 'returns a 401 error if unauthorized' do
- post api(path), params: runner_attrs
-
- expect(response).to have_gitlab_http_status(:unauthorized)
- end
- end
end
diff --git a/spec/requests/git_http_spec.rb b/spec/requests/git_http_spec.rb
index 5b50e8a1021..d3d1a2a6cd0 100644
--- a/spec/requests/git_http_spec.rb
+++ b/spec/requests/git_http_spec.rb
@@ -236,11 +236,6 @@ RSpec.describe 'Git HTTP requests', feature_category: :source_code_management do
allow(::Users::ActivityService).to receive(:new).and_return(activity_service)
allow(activity_service).to receive(:execute)
- # During project creation, we need to track the project wiki
- # repository. So it is over the query limit threshold, and we
- # have to adjust it.
- allow(Gitlab::QueryLimiting::Transaction).to receive(:threshold).and_return(101)
-
expect do
upload(path, user: user.username, password: user.password) do |response|
expect(response).to have_gitlab_http_status(:ok)
diff --git a/spec/requests/groups/observability_controller_spec.rb b/spec/requests/groups/observability_controller_spec.rb
index b82cf2b0bad..247535bc990 100644
--- a/spec/requests/groups/observability_controller_spec.rb
+++ b/spec/requests/groups/observability_controller_spec.rb
@@ -17,6 +17,10 @@ RSpec.describe Groups::ObservabilityController, feature_category: :tracing do
end
it_behaves_like 'observability csp policy' do
+ before_all do
+ group.add_developer(user)
+ end
+
let(:tested_path) { path }
end
diff --git a/spec/requests/lfs_http_spec.rb b/spec/requests/lfs_http_spec.rb
index b07296a0df2..199138eb3a9 100644
--- a/spec/requests/lfs_http_spec.rb
+++ b/spec/requests/lfs_http_spec.rb
@@ -807,7 +807,7 @@ RSpec.describe 'Git LFS API and storage', feature_category: :source_code_managem
end
end
- describe 'to one project' do
+ describe 'to one project', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/418757' do
describe 'when user is authenticated' do
describe 'when user has push access to the project' do
before do
diff --git a/spec/requests/openid_connect_spec.rb b/spec/requests/openid_connect_spec.rb
index 82f972e7f94..217241200ff 100644
--- a/spec/requests/openid_connect_spec.rb
+++ b/spec/requests/openid_connect_spec.rb
@@ -270,13 +270,20 @@ RSpec.describe 'OpenID Connect requests', feature_category: :system_access do
end
context 'OpenID configuration information' do
+ let(:expected_scopes) do
+ %w[
+ admin_mode api read_user read_api read_repository write_repository sudo openid profile email
+ read_observability write_observability create_runner
+ ]
+ end
+
it 'correctly returns the configuration' do
get '/.well-known/openid-configuration'
expect(response).to have_gitlab_http_status(:ok)
expect(json_response['issuer']).to eq('http://localhost')
expect(json_response['jwks_uri']).to eq('http://www.example.com/oauth/discovery/keys')
- expect(json_response['scopes_supported']).to match_array %w[admin_mode api read_user read_api read_repository write_repository sudo openid profile email read_observability write_observability]
+ expect(json_response['scopes_supported']).to match_array expected_scopes
end
context 'with a cross-origin request' do
@@ -286,7 +293,7 @@ RSpec.describe 'OpenID Connect requests', feature_category: :system_access do
expect(response).to have_gitlab_http_status(:ok)
expect(json_response['issuer']).to eq('http://localhost')
expect(json_response['jwks_uri']).to eq('http://www.example.com/oauth/discovery/keys')
- expect(json_response['scopes_supported']).to match_array %w[admin_mode api read_user read_api read_repository write_repository sudo openid profile email read_observability write_observability]
+ expect(json_response['scopes_supported']).to match_array expected_scopes
end
it_behaves_like 'cross-origin GET request'
diff --git a/spec/requests/organizations/organizations_controller_spec.rb b/spec/requests/organizations/organizations_controller_spec.rb
index a51a5751831..bd54b50de99 100644
--- a/spec/requests/organizations/organizations_controller_spec.rb
+++ b/spec/requests/organizations/organizations_controller_spec.rb
@@ -5,9 +5,7 @@ require 'spec_helper'
RSpec.describe Organizations::OrganizationsController, feature_category: :cell do
let_it_be(:organization) { create(:organization) }
- describe 'GET #directory' do
- subject(:gitlab_request) { get directory_organization_path(organization) }
-
+ RSpec.shared_examples 'basic organization controller action' do
before do
sign_in(user)
end
@@ -42,4 +40,16 @@ RSpec.describe Organizations::OrganizationsController, feature_category: :cell d
end
end
end
+
+ describe 'GET #show' do
+ subject(:gitlab_request) { get organization_path(organization) }
+
+ it_behaves_like 'basic organization controller action'
+ end
+
+ describe 'GET #groups_and_projects' do
+ subject(:gitlab_request) { get groups_and_projects_organization_path(organization) }
+
+ it_behaves_like 'basic organization controller action'
+ end
end
diff --git a/spec/requests/projects/alert_management_controller_spec.rb b/spec/requests/projects/alert_management_controller_spec.rb
new file mode 100644
index 00000000000..698087bf761
--- /dev/null
+++ b/spec/requests/projects/alert_management_controller_spec.rb
@@ -0,0 +1,69 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::AlertManagementController, feature_category: :incident_management do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:developer) { create(:user) }
+ let_it_be(:reporter) { create(:user) }
+ let_it_be(:id) { 1 }
+
+ before_all do
+ project.add_developer(developer)
+ project.add_reporter(reporter)
+ end
+
+ before do
+ sign_in(user)
+ end
+
+ describe 'GET #index' do
+ context 'when user is authorized' do
+ let(:user) { developer }
+
+ it 'shows the page' do
+ get project_alert_management_index_path(project)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+
+ context 'when user is unauthorized' do
+ let(:user) { reporter }
+
+ it 'shows 404' do
+ get project_alert_management_index_path(project)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+ end
+
+ describe 'GET #details' do
+ context 'when user is authorized' do
+ let(:user) { developer }
+
+ it 'shows the page' do
+ get project_alert_management_alert_path(project, id)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+
+ it 'sets alert id from the route' do
+ get project_alert_management_alert_path(project, id)
+
+ expect(assigns(:alert_id)).to eq(id.to_s)
+ end
+ end
+
+ context 'when user is unauthorized' do
+ let(:user) { reporter }
+
+ it 'shows 404' do
+ get project_alert_management_alert_path(project, id)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+ end
+end
diff --git a/spec/requests/projects/incidents_controller_spec.rb b/spec/requests/projects/incidents_controller_spec.rb
new file mode 100644
index 00000000000..9a0d6cdf8ce
--- /dev/null
+++ b/spec/requests/projects/incidents_controller_spec.rb
@@ -0,0 +1,116 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::IncidentsController, feature_category: :incident_management do
+ let_it_be_with_refind(:project) { create(:project) }
+ let_it_be(:developer) { create(:user) }
+ let_it_be(:guest) { create(:user) }
+ let_it_be(:anonymous) { nil }
+
+ before_all do
+ project.add_guest(guest)
+ project.add_developer(developer)
+ end
+
+ before do
+ sign_in(user) if user
+ end
+
+ subject { make_request }
+
+ shared_examples 'not found' do
+ include_examples 'returning response status', :not_found
+ end
+
+ shared_examples 'login required' do
+ it 'redirects to the login page' do
+ subject
+
+ expect(response).to redirect_to(new_user_session_path)
+ end
+ end
+
+ describe 'GET #index' do
+ def make_request
+ get project_incidents_path(project)
+ end
+
+ let(:user) { developer }
+
+ it 'shows the page' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to render_template(:index)
+ end
+
+ context 'when user is unauthorized' do
+ let(:user) { anonymous }
+
+ it_behaves_like 'login required'
+ end
+
+ context 'when user is a guest' do
+ let(:user) { guest }
+
+ it 'shows the page' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to render_template(:index)
+ end
+ end
+ end
+
+ describe 'GET #show' do
+ def make_request
+ get incident_project_issues_path(project, resource)
+ end
+
+ let_it_be(:resource) { create(:incident, project: project) }
+
+ let(:user) { developer }
+
+ it 'renders incident page' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to render_template(:show)
+
+ expect(assigns(:incident)).to be_present
+ expect(assigns(:incident).author.association(:status)).to be_loaded
+ expect(assigns(:issue)).to be_present
+ expect(assigns(:noteable)).to eq(assigns(:incident))
+ end
+
+ context 'with non existing id' do
+ let(:resource) { non_existing_record_id }
+
+ it_behaves_like 'not found'
+ end
+
+ context 'for issue' do
+ let_it_be(:resource) { create(:issue, project: project) }
+
+ it_behaves_like 'not found'
+ end
+
+ context 'when user is a guest' do
+ let(:user) { guest }
+
+ it 'shows the page' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to render_template(:show)
+ end
+ end
+
+ context 'when unauthorized' do
+ let(:user) { anonymous }
+
+ it_behaves_like 'login required'
+ end
+ end
+end
diff --git a/spec/requests/projects/issues_controller_spec.rb b/spec/requests/projects/issues_controller_spec.rb
index 583fd5f586e..1ae65939c86 100644
--- a/spec/requests/projects/issues_controller_spec.rb
+++ b/spec/requests/projects/issues_controller_spec.rb
@@ -17,6 +17,11 @@ RSpec.describe Projects::IssuesController, feature_category: :team_planning do
describe 'GET #new' do
include_context 'group project issue'
+ before do
+ group.add_developer(user)
+ login_as(user)
+ end
+
it_behaves_like "observability csp policy", described_class do
let(:tested_path) do
new_project_issue_path(project)
@@ -26,11 +31,13 @@ RSpec.describe Projects::IssuesController, feature_category: :team_planning do
describe 'GET #show' do
before do
+ group.add_developer(user)
login_as(user)
end
it_behaves_like "observability csp policy", described_class do
include_context 'group project issue'
+
let(:tested_path) do
project_issue_path(project, issue)
end
diff --git a/spec/requests/projects/merge_requests/creations_spec.rb b/spec/requests/projects/merge_requests/creations_spec.rb
index ace6ef0f7b8..e8a073fef5f 100644
--- a/spec/requests/projects/merge_requests/creations_spec.rb
+++ b/spec/requests/projects/merge_requests/creations_spec.rb
@@ -6,8 +6,13 @@ RSpec.describe 'merge requests creations', feature_category: :code_review_workfl
describe 'GET /:namespace/:project/merge_requests/new' do
include ProjectForksHelper
- let(:project) { create(:project, :repository) }
- let(:user) { project.first_owner }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, :repository, group: group) }
+ let_it_be(:user) { create(:user) }
+
+ before_all do
+ group.add_developer(user)
+ end
before do
login_as(user)
@@ -26,16 +31,13 @@ RSpec.describe 'merge requests creations', feature_category: :code_review_workfl
end
it_behaves_like "observability csp policy", Projects::MergeRequests::CreationsController do
- let_it_be(:group) { create(:group) }
- let_it_be(:user) { create(:user) }
- let_it_be(:project) { create(:project, group: group) }
let(:tested_path) do
project_new_merge_request_path(project, merge_request: {
title: 'Some feature',
- source_branch: 'fix',
- target_branch: 'feature',
- target_project: project,
- source_project: project
+ source_branch: 'fix',
+ target_branch: 'feature',
+ target_project: project,
+ source_project: project
})
end
end
diff --git a/spec/requests/projects/merge_requests_controller_spec.rb b/spec/requests/projects/merge_requests_controller_spec.rb
index 955e6822211..955b6e53686 100644
--- a/spec/requests/projects/merge_requests_controller_spec.rb
+++ b/spec/requests/projects/merge_requests_controller_spec.rb
@@ -16,6 +16,7 @@ RSpec.describe Projects::MergeRequestsController, feature_category: :source_code
context 'when logged in' do
before do
+ group.add_developer(user)
login_as(user)
end
diff --git a/spec/requests/projects/ml/candidates_controller_spec.rb b/spec/requests/projects/ml/candidates_controller_spec.rb
index eec7af99063..4c7491970e1 100644
--- a/spec/requests/projects/ml/candidates_controller_spec.rb
+++ b/spec/requests/projects/ml/candidates_controller_spec.rb
@@ -10,13 +10,17 @@ RSpec.describe Projects::Ml::CandidatesController, feature_category: :mlops do
let(:ff_value) { true }
let(:candidate_iid) { candidate.iid }
- let(:model_experiments_enabled) { true }
+ let(:read_model_experiments) { true }
+ let(:write_model_experiments) { true }
before do
allow(Ability).to receive(:allowed?).and_call_original
allow(Ability).to receive(:allowed?)
.with(user, :read_model_experiments, project)
- .and_return(model_experiments_enabled)
+ .and_return(read_model_experiments)
+ allow(Ability).to receive(:allowed?)
+ .with(user, :write_model_experiments, project)
+ .and_return(write_model_experiments)
sign_in(user)
end
@@ -34,9 +38,9 @@ RSpec.describe Projects::Ml::CandidatesController, feature_category: :mlops do
end
end
- shared_examples '404 when model experiments is unavailable' do
+ shared_examples 'requires read_model_experiments' do
context 'when user does not have access' do
- let(:model_experiments_enabled) { false }
+ let(:read_model_experiments) { false }
it_behaves_like 'renders 404'
end
@@ -61,7 +65,7 @@ RSpec.describe Projects::Ml::CandidatesController, feature_category: :mlops do
end
it_behaves_like '404 if candidate does not exist'
- it_behaves_like '404 when model experiments is unavailable'
+ it_behaves_like 'requires read_model_experiments'
end
describe 'DELETE #destroy' do
@@ -83,7 +87,14 @@ RSpec.describe Projects::Ml::CandidatesController, feature_category: :mlops do
end
it_behaves_like '404 if candidate does not exist'
- it_behaves_like '404 when model experiments is unavailable'
+
+ describe 'requires write_model_experiments' do
+ let(:write_model_experiments) { false }
+
+ it 'is 404' do
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
end
private
diff --git a/spec/requests/projects/ml/experiments_controller_spec.rb b/spec/requests/projects/ml/experiments_controller_spec.rb
index e2d26e84f75..9440c716640 100644
--- a/spec/requests/projects/ml/experiments_controller_spec.rb
+++ b/spec/requests/projects/ml/experiments_controller_spec.rb
@@ -15,13 +15,17 @@ RSpec.describe Projects::Ml::ExperimentsController, feature_category: :mlops do
let(:ff_value) { true }
let(:basic_params) { { namespace_id: project.namespace.to_param, project_id: project } }
let(:experiment_iid) { experiment.iid }
- let(:model_experiments_enabled) { true }
+ let(:read_model_experiments) { true }
+ let(:write_model_experiments) { true }
before do
allow(Ability).to receive(:allowed?).and_call_original
allow(Ability).to receive(:allowed?)
.with(user, :read_model_experiments, project)
- .and_return(model_experiments_enabled)
+ .and_return(read_model_experiments)
+ allow(Ability).to receive(:allowed?)
+ .with(user, :write_model_experiments, project)
+ .and_return(write_model_experiments)
sign_in(user)
end
@@ -40,9 +44,9 @@ RSpec.describe Projects::Ml::ExperimentsController, feature_category: :mlops do
end
end
- shared_examples '404 when model experiments is unavailable' do
+ shared_examples 'requires read_model_experiments' do
context 'when user does not have access' do
- let(:model_experiments_enabled) { false }
+ let(:read_model_experiments) { false }
it_behaves_like 'renders 404'
end
@@ -100,7 +104,7 @@ RSpec.describe Projects::Ml::ExperimentsController, feature_category: :mlops do
end
end
- it_behaves_like '404 when model experiments is unavailable' do
+ it_behaves_like 'requires read_model_experiments' do
before do
list_experiments
end
@@ -211,7 +215,7 @@ RSpec.describe Projects::Ml::ExperimentsController, feature_category: :mlops do
end
it_behaves_like '404 if experiment does not exist'
- it_behaves_like '404 when model experiments is unavailable'
+ it_behaves_like 'requires read_model_experiments'
end
end
@@ -243,7 +247,7 @@ RSpec.describe Projects::Ml::ExperimentsController, feature_category: :mlops do
end
it_behaves_like '404 if experiment does not exist'
- it_behaves_like '404 when model experiments is unavailable'
+ it_behaves_like 'requires read_model_experiments'
end
end
end
@@ -268,7 +272,14 @@ RSpec.describe Projects::Ml::ExperimentsController, feature_category: :mlops do
end
it_behaves_like '404 if experiment does not exist'
- it_behaves_like '404 when model experiments is unavailable'
+
+ describe 'requires write_model_experiments' do
+ let(:write_model_experiments) { false }
+
+ it 'is 404' do
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
end
private
diff --git a/spec/requests/projects/ml/models_controller_spec.rb b/spec/requests/projects/ml/models_controller_spec.rb
new file mode 100644
index 00000000000..d03748c8dff
--- /dev/null
+++ b/spec/requests/projects/ml/models_controller_spec.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::Ml::ModelsController, feature_category: :mlops do
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:user) { project.first_owner }
+ let_it_be(:model1_a) { create(:ml_model_package, project: project) }
+ let_it_be(:model1_b) { create(:ml_model_package, project: project, name: model1_a.name) }
+ let_it_be(:model2) { create(:ml_model_package, project: project) }
+
+ let(:model_registry_enabled) { true }
+
+ before do
+ allow(Ability).to receive(:allowed?).and_call_original
+ allow(Ability).to receive(:allowed?)
+ .with(user, :read_model_registry, project)
+ .and_return(model_registry_enabled)
+
+ sign_in(user)
+ end
+
+ describe 'GET index' do
+ subject(:index_request) do
+ list_models
+ response
+ end
+
+ it 'renders the template' do
+ expect(index_request).to render_template('projects/ml/models/index')
+ end
+
+ it 'fetches the models using the finder' do
+ expect(::Projects::Ml::ModelFinder).to receive(:new).with(project).and_call_original
+
+ index_request
+ end
+
+ it 'prepares model view using the presenter' do
+ expect(::Ml::ModelsIndexPresenter).to receive(:new).and_call_original
+
+ index_request
+ end
+
+ it 'does not perform N+1 sql queries' do
+ control_count = ActiveRecord::QueryRecorder.new(skip_cached: false) { list_models }
+
+ create_list(:ml_model_package, 4, project: project)
+
+ expect { list_models }.not_to exceed_all_query_limit(control_count)
+ end
+
+ context 'when user does not have access' do
+ let(:model_registry_enabled) { false }
+
+ it 'renders 404' do
+ is_expected.to have_gitlab_http_status(:not_found)
+ end
+ end
+ end
+
+ private
+
+ def list_models
+ get project_ml_models_path(project)
+ end
+end
diff --git a/spec/requests/projects/packages/package_files_controller_spec.rb b/spec/requests/projects/packages/package_files_controller_spec.rb
index e5849be9f13..4f1793b831d 100644
--- a/spec/requests/projects/packages/package_files_controller_spec.rb
+++ b/spec/requests/projects/packages/package_files_controller_spec.rb
@@ -22,7 +22,7 @@ RSpec.describe Projects::Packages::PackageFilesController, feature_category: :pa
subject
expect(response.headers['Content-Disposition'])
- .to eq(%Q(attachment; filename="#{filename}"; filename*=UTF-8''#{filename}))
+ .to eq(%(attachment; filename="#{filename}"; filename*=UTF-8''#{filename}))
end
it_behaves_like 'bumping the package last downloaded at field'
diff --git a/spec/requests/projects/service_desk/custom_email_controller_spec.rb b/spec/requests/projects/service_desk/custom_email_controller_spec.rb
new file mode 100644
index 00000000000..8ce238ab99c
--- /dev/null
+++ b/spec/requests/projects/service_desk/custom_email_controller_spec.rb
@@ -0,0 +1,380 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::ServiceDesk::CustomEmailController, feature_category: :service_desk do
+ let_it_be_with_reload(:project) do
+ create(:project, :private, service_desk_enabled: true)
+ end
+
+ let_it_be(:custom_email_path) { project_service_desk_custom_email_path(project, format: :json) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:illegitimite_user) { create(:user) }
+
+ let(:message) { instance_double(Mail::Message) }
+ let(:error_cannot_create_custom_email) { s_("ServiceDesk|Cannot create custom email") }
+ let(:error_cannot_update_custom_email) { s_("ServiceDesk|Cannot update custom email") }
+ let(:error_does_not_exist) { s_('ServiceDesk|Custom email does not exist') }
+ let(:error_custom_email_exists) { s_('ServiceDesk|Custom email already exists') }
+
+ let(:custom_email_params) do
+ {
+ custom_email: 'user@example.com',
+ smtp_address: 'smtp.example.com',
+ smtp_port: '587',
+ smtp_username: 'user@example.com',
+ smtp_password: 'supersecret'
+ }
+ end
+
+ let(:empty_json_response) do
+ {
+ "custom_email" => nil,
+ "custom_email_enabled" => false,
+ "custom_email_verification_state" => nil,
+ "custom_email_verification_error" => nil,
+ "custom_email_smtp_address" => nil,
+ "error_message" => nil
+ }
+ end
+
+ before_all do
+ project.add_developer(illegitimite_user)
+ project.add_maintainer(user)
+ end
+
+ shared_examples 'a json response with empty values' do
+ it 'returns json response with empty values' do
+ perform_request
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to include(empty_json_response)
+ end
+ end
+
+ shared_examples 'a controller that responds with status' do |status|
+ it "responds with #{status} for GET custom email" do
+ get custom_email_path
+ expect(response).to have_gitlab_http_status(status)
+ end
+
+ it "responds with #{status} for POST custom email" do
+ post custom_email_path
+ expect(response).to have_gitlab_http_status(status)
+ end
+
+ it "responds with #{status} for PUT custom email" do
+ put custom_email_path
+ expect(response).to have_gitlab_http_status(status)
+ end
+
+ it "responds with #{status} for DELETE custom email" do
+ delete custom_email_path
+ expect(response).to have_gitlab_http_status(status)
+ end
+ end
+
+ shared_examples 'a controller with disabled feature flag with status' do |status|
+ context 'when feature flag service_desk_custom_email is disabled' do
+ before do
+ stub_feature_flags(service_desk_custom_email: false)
+ end
+
+ it_behaves_like 'a controller that responds with status', status
+ end
+ end
+
+ shared_examples 'a deletable resource' do
+ describe 'DELETE custom email' do
+ let(:perform_request) { delete custom_email_path }
+
+ it_behaves_like 'a json response with empty values'
+ end
+ end
+
+ context 'with legitimate user signed in' do
+ before do
+ sign_out(illegitimite_user)
+ sign_in(user)
+ end
+
+ # because CustomEmailController check_feature_flag_enabled responds
+ it_behaves_like 'a controller with disabled feature flag with status', :not_found
+
+ describe 'GET custom email' do
+ let(:perform_request) { get custom_email_path }
+
+ it_behaves_like 'a json response with empty values'
+ end
+
+ describe 'POST custom email' do
+ before do
+ # We send verification email directly
+ allow(message).to receive(:deliver)
+ allow(Notify).to receive(:service_desk_custom_email_verification_email).and_return(message)
+ end
+
+ it 'adds custom email and kicks of verification' do
+ post custom_email_path, params: custom_email_params
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to include(
+ "custom_email" => custom_email_params[:custom_email],
+ "custom_email_enabled" => false,
+ "custom_email_verification_state" => "started",
+ "custom_email_verification_error" => nil,
+ "custom_email_smtp_address" => custom_email_params[:smtp_address],
+ "error_message" => nil
+ )
+ end
+
+ context 'when custom_email param is not valid' do
+ it 'does not add custom email' do
+ post custom_email_path, params: custom_email_params.merge(custom_email: 'useratexample.com')
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ expect(json_response).to include(
+ empty_json_response.merge("error_message" => error_cannot_create_custom_email)
+ )
+ end
+ end
+
+ context 'when smtp_password param is not valid' do
+ it 'does not add custom email' do
+ post custom_email_path, params: custom_email_params.merge(smtp_password: '2short')
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ expect(json_response).to include(
+ empty_json_response.merge("error_message" => error_cannot_create_custom_email)
+ )
+ end
+ end
+
+ context 'when the verification process fails fast' do
+ before do
+ # Could not establish connection, invalid host etc.
+ allow(message).to receive(:deliver).and_raise(SocketError)
+ end
+
+ it 'adds custom email and kicks of verification and returns verification error state' do
+ post custom_email_path, params: custom_email_params
+
+ # In terms of "custom email object creation", failing fast on the
+ # verification is a legit state that we don't treat as an error.
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to include(
+ "custom_email" => custom_email_params[:custom_email],
+ "custom_email_enabled" => false,
+ "custom_email_verification_state" => "failed",
+ "custom_email_verification_error" => "smtp_host_issue",
+ "custom_email_smtp_address" => custom_email_params[:smtp_address],
+ "error_message" => nil
+ )
+ end
+ end
+ end
+
+ describe 'PUT custom email' do
+ let(:custom_email_params) { { custom_email_enabled: true } }
+
+ it 'does not update records' do
+ put custom_email_path, params: custom_email_params
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ expect(json_response).to include(
+ empty_json_response.merge("error_message" => error_cannot_update_custom_email)
+ )
+ end
+ end
+
+ describe 'DELETE custom email' do
+ it 'does not touch any records' do
+ delete custom_email_path
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ expect(json_response).to include(
+ empty_json_response.merge("error_message" => error_does_not_exist)
+ )
+ end
+ end
+
+ context 'when custom email is set up' do
+ let!(:settings) { create(:service_desk_setting, project: project, custom_email: 'user@example.com') }
+ let!(:credential) { create(:service_desk_custom_email_credential, project: project) }
+
+ before do
+ project.reset
+ end
+
+ context 'and verification started' do
+ let!(:verification) do
+ create(:service_desk_custom_email_verification, project: project)
+ end
+
+ it_behaves_like 'a deletable resource'
+
+ describe 'GET custom email' do
+ it 'returns custom email in its current state' do
+ get custom_email_path
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to include(
+ "custom_email" => "user@example.com",
+ "custom_email_enabled" => false,
+ "custom_email_verification_state" => "started",
+ "custom_email_verification_error" => nil,
+ "custom_email_smtp_address" => "smtp.example.com",
+ "error_message" => nil
+ )
+ end
+ end
+
+ describe 'POST custom email' do
+ it 'returns custom email in its current state' do
+ post custom_email_path, params: custom_email_params
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ expect(json_response).to include(
+ "custom_email" => custom_email_params[:custom_email],
+ "custom_email_enabled" => false,
+ "custom_email_verification_state" => "started",
+ "custom_email_verification_error" => nil,
+ "custom_email_smtp_address" => custom_email_params[:smtp_address],
+ "error_message" => error_custom_email_exists
+ )
+ end
+ end
+
+ describe 'PUT custom email' do
+ let(:custom_email_params) { { custom_email_enabled: true } }
+
+ it 'marks custom email as enabled' do
+ put custom_email_path, params: custom_email_params
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ expect(json_response).to include(
+ "custom_email" => "user@example.com",
+ "custom_email_enabled" => false,
+ "custom_email_verification_state" => "started",
+ "custom_email_verification_error" => nil,
+ "custom_email_smtp_address" => "smtp.example.com",
+ "error_message" => error_cannot_update_custom_email
+ )
+ end
+ end
+ end
+
+ context 'and verification finished' do
+ let!(:verification) do
+ create(:service_desk_custom_email_verification, project: project, state: :finished, token: nil)
+ end
+
+ it_behaves_like 'a deletable resource'
+
+ describe 'GET custom email' do
+ it 'returns custom email in its current state' do
+ get custom_email_path
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to include(
+ "custom_email" => "user@example.com",
+ "custom_email_enabled" => false,
+ "custom_email_verification_state" => "finished",
+ "custom_email_verification_error" => nil,
+ "custom_email_smtp_address" => "smtp.example.com",
+ "error_message" => nil
+ )
+ end
+ end
+
+ describe 'PUT custom email' do
+ let(:custom_email_params) { { custom_email_enabled: true } }
+
+ it 'marks custom email as enabled' do
+ put custom_email_path, params: custom_email_params
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to include(
+ "custom_email" => "user@example.com",
+ "custom_email_enabled" => true,
+ "custom_email_verification_state" => "finished",
+ "custom_email_verification_error" => nil,
+ "custom_email_smtp_address" => "smtp.example.com",
+ "error_message" => nil
+ )
+ end
+ end
+ end
+
+ context 'and verification failed' do
+ let!(:verification) do
+ create(:service_desk_custom_email_verification,
+ project: project,
+ state: :failed,
+ token: nil,
+ error: :smtp_host_issue
+ )
+ end
+
+ it_behaves_like 'a deletable resource'
+
+ describe 'GET custom email' do
+ it 'returns custom email in its current state' do
+ get custom_email_path
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to include(
+ "custom_email" => "user@example.com",
+ "custom_email_enabled" => false,
+ "custom_email_verification_state" => "failed",
+ "custom_email_verification_error" => "smtp_host_issue",
+ "custom_email_smtp_address" => "smtp.example.com",
+ "error_message" => nil
+ )
+ end
+ end
+
+ describe 'PUT custom email' do
+ let(:custom_email_params) { { custom_email_enabled: true } }
+
+ it 'does not mark custom email as enabled' do
+ put custom_email_path, params: custom_email_params
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ expect(json_response).to include(
+ "custom_email" => "user@example.com",
+ "custom_email_enabled" => false,
+ "custom_email_verification_state" => "failed",
+ "custom_email_verification_error" => "smtp_host_issue",
+ "custom_email_smtp_address" => "smtp.example.com",
+ "error_message" => error_cannot_update_custom_email
+ )
+ end
+ end
+ end
+ end
+ end
+
+ context 'when user is anonymous' do
+ before do
+ sign_out(user)
+ sign_out(illegitimite_user)
+ end
+
+ # because Projects::ApplicationController :authenticate_user! responds
+ # with redirect to login page
+ it_behaves_like 'a controller that responds with status', :found
+ it_behaves_like 'a controller with disabled feature flag with status', :found
+ end
+
+ context 'with illegitimate user signed in' do
+ before do
+ sign_out(user)
+ sign_in(illegitimite_user)
+ end
+
+ it_behaves_like 'a controller that responds with status', :not_found
+ # because CustomEmailController check_feature_flag_enabled responds
+ it_behaves_like 'a controller with disabled feature flag with status', :not_found
+ end
+end
diff --git a/spec/requests/projects/service_desk_controller_spec.rb b/spec/requests/projects/service_desk_controller_spec.rb
new file mode 100644
index 00000000000..54fe176e244
--- /dev/null
+++ b/spec/requests/projects/service_desk_controller_spec.rb
@@ -0,0 +1,109 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::ServiceDeskController, feature_category: :service_desk do
+ let_it_be(:project) do
+ create(:project, :private, :custom_repo,
+ service_desk_enabled: true,
+ files: { '.gitlab/issue_templates/service_desk.md' => 'template' })
+ end
+
+ let_it_be(:user) { create(:user) }
+
+ before_all do
+ project.add_maintainer(user)
+ end
+
+ before do
+ allow(Gitlab::Email::IncomingEmail).to receive(:enabled?).and_return(true)
+ allow(Gitlab::Email::IncomingEmail).to receive(:supports_wildcard?).and_return(true)
+
+ sign_in(user)
+ end
+
+ describe 'GET #show' do
+ it 'returns service_desk JSON data' do
+ get project_service_desk_path(project, format: :json)
+
+ expect(json_response["service_desk_address"]).to match(/\A[^@]+@[^@]+\z/)
+ expect(json_response["service_desk_enabled"]).to be_truthy
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+
+ context 'when user is not project maintainer' do
+ let(:guest) { create(:user) }
+
+ it 'renders 404' do
+ project.add_guest(guest)
+ sign_in(guest)
+
+ get project_service_desk_path(project, format: :json)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ context 'when issue template is present' do
+ it 'returns template_file_missing as false' do
+ create(:service_desk_setting, project: project, issue_template_key: 'service_desk')
+
+ get project_service_desk_path(project, format: :json)
+
+ response_hash = Gitlab::Json.parse(response.body)
+ expect(response_hash['template_file_missing']).to eq(false)
+ end
+ end
+
+ context 'when issue template file becomes outdated' do
+ it 'returns template_file_missing as true' do
+ service = ServiceDeskSetting.new(project_id: project.id, issue_template_key: 'deleted')
+ service.save!(validate: false)
+
+ get project_service_desk_path(project, format: :json)
+
+ expect(json_response['template_file_missing']).to eq(true)
+ end
+ end
+ end
+
+ describe 'PUT #update' do
+ it 'toggles services desk incoming email' do
+ project.update!(service_desk_enabled: false)
+
+ put project_service_desk_refresh_path(project, format: :json), params: { service_desk_enabled: true }
+
+ expect(json_response["service_desk_address"]).to be_present
+ expect(json_response["service_desk_enabled"]).to be_truthy
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+
+ it 'sets issue_template_key' do
+ put project_service_desk_refresh_path(project, format: :json), params: { issue_template_key: 'service_desk' }
+
+ settings = project.service_desk_setting
+ expect(settings).to be_present
+ expect(settings.issue_template_key).to eq('service_desk')
+ expect(json_response['template_file_missing']).to eq(false)
+ expect(json_response['issue_template_key']).to eq('service_desk')
+ end
+
+ it 'returns an error when update of service desk settings fails' do
+ put project_service_desk_refresh_path(project, format: :json), params: { issue_template_key: 'invalid key' }
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ expect(json_response['message']).to eq('Issue template key is empty or does not exist')
+ end
+
+ context 'when user cannot admin the project' do
+ let(:other_user) { create(:user) }
+
+ it 'renders 404' do
+ sign_in(other_user)
+ put project_service_desk_refresh_path(project, format: :json), params: { service_desk_enabled: true }
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+ end
+end
diff --git a/spec/requests/projects/tracing_controller_spec.rb b/spec/requests/projects/tracing_controller_spec.rb
new file mode 100644
index 00000000000..eecaa0d962a
--- /dev/null
+++ b/spec/requests/projects/tracing_controller_spec.rb
@@ -0,0 +1,68 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::TracingController, feature_category: :tracing do
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, group: group) }
+ let_it_be(:user) { create(:user) }
+ let(:path) { nil }
+ let(:observability_tracing_ff) { true }
+
+ subject do
+ get path
+ response
+ end
+
+ describe 'GET #index' do
+ before do
+ stub_feature_flags(observability_tracing: observability_tracing_ff)
+ sign_in(user)
+ end
+
+ let(:path) { project_tracing_index_path(project) }
+
+ it_behaves_like 'observability csp policy' do
+ before_all do
+ project.add_developer(user)
+ end
+
+ let(:tested_path) { path }
+ end
+
+ context 'when user does not have permissions' do
+ it 'returns 404' do
+ expect(subject).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ context 'when user has permissions' do
+ before_all do
+ project.add_developer(user)
+ end
+
+ it 'returns 200' do
+ expect(subject).to have_gitlab_http_status(:ok)
+ end
+
+ it 'renders the js-tracing element correctly' do
+ element = Nokogiri::HTML.parse(subject.body).at_css('#js-tracing')
+
+ expected_view_model = {
+ tracingUrl: Gitlab::Observability.tracing_url(project),
+ provisioningUrl: Gitlab::Observability.provisioning_url(project),
+ oauthUrl: Gitlab::Observability.oauth_url
+ }.to_json
+ expect(element.attributes['data-view-model'].value).to eq(expected_view_model)
+ end
+
+ context 'when feature is disabled' do
+ let(:observability_tracing_ff) { false }
+
+ it 'returns 404' do
+ expect(subject).to have_gitlab_http_status(:not_found)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/requests/search_controller_spec.rb b/spec/requests/search_controller_spec.rb
index f2d4e288ddc..365b20ad4aa 100644
--- a/spec/requests/search_controller_spec.rb
+++ b/spec/requests/search_controller_spec.rb
@@ -39,7 +39,8 @@ RSpec.describe SearchController, type: :request, feature_category: :global_searc
context 'for issues scope' do
let(:object) { :issue }
- let(:creation_args) { { project: project, title: 'foo' } }
+ let(:labels) { create_list(:label, 3, project: project) }
+ let(:creation_args) { { project: project, title: 'foo', labels: labels } }
let(:params) { { search: 'foo', scope: 'issues' } }
# some N+1 queries still exist
# each issue runs an extra query for group namespaces
@@ -50,8 +51,9 @@ RSpec.describe SearchController, type: :request, feature_category: :global_searc
context 'for merge_requests scope' do
let(:creation_traits) { [:unique_branches] }
+ let(:labels) { create_list(:label, 3, project: project) }
let(:object) { :merge_request }
- let(:creation_args) { { source_project: project, title: 'bar' } }
+ let(:creation_args) { { source_project: project, title: 'bar', labels: labels } }
let(:params) { { search: 'bar', scope: 'merge_requests' } }
# some N+1 queries still exist
# each merge request runs an extra query for project routes
diff --git a/spec/requests/users_controller_spec.rb b/spec/requests/users_controller_spec.rb
index c49dbb6a269..f96d7864782 100644
--- a/spec/requests/users_controller_spec.rb
+++ b/spec/requests/users_controller_spec.rb
@@ -598,15 +598,10 @@ RSpec.describe UsersController, feature_category: :user_management do
expect(response).to have_gitlab_http_status(:ok)
expect(response.body).not_to be_empty
end
-
- it 'does not list projects aimed for deletion' do
- expect(response).to have_gitlab_http_status(:ok)
- expect(assigns(:contributed_projects)).to eq([project])
- end
end
%i(html json).each do |format|
- context "format: #{format}" do
+ context "with format: #{format}" do
let(:format) { format }
context 'with public profile' do
@@ -626,6 +621,13 @@ RSpec.describe UsersController, feature_category: :user_management do
let(:user) { create(:admin) }
it_behaves_like 'renders contributed projects'
+
+ if format == :json
+ it 'does not list projects aimed for deletion' do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response.body).not_to include aimed_for_deletion_project.name
+ end
+ end
end
end
end
@@ -652,15 +654,10 @@ RSpec.describe UsersController, feature_category: :user_management do
expect(response).to have_gitlab_http_status(:ok)
expect(response.body).not_to be_empty
end
-
- it 'does not list projects aimed for deletion' do
- expect(response).to have_gitlab_http_status(:ok)
- expect(assigns(:starred_projects)).to eq([project])
- end
end
%i(html json).each do |format|
- context "format: #{format}" do
+ context "with format: #{format}" do
let(:format) { format }
context 'with public profile' do
@@ -680,6 +677,13 @@ RSpec.describe UsersController, feature_category: :user_management do
let(:user) { create(:admin) }
it_behaves_like 'renders starred projects'
+
+ if format == :json
+ it 'does not list projects aimed for deletion' do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response.body).not_to include aimed_for_deletion_project.name
+ end
+ end
end
end
end
diff --git a/spec/requests/verifies_with_email_spec.rb b/spec/requests/verifies_with_email_spec.rb
index 6325ecc1184..f3f8e4a1a83 100644
--- a/spec/requests/verifies_with_email_spec.rb
+++ b/spec/requests/verifies_with_email_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'VerifiesWithEmail', :clean_gitlab_redis_sessions, :clean_gitlab_redis_rate_limiting,
-feature_category: :user_management do
+ feature_category: :instance_resiliency do
include SessionHelpers
include EmailHelpers
diff --git a/spec/routing/organizations/organizations_controller_routing_spec.rb b/spec/routing/organizations/organizations_controller_routing_spec.rb
index 5b6124300ba..2b43f6d3afa 100644
--- a/spec/routing/organizations/organizations_controller_routing_spec.rb
+++ b/spec/routing/organizations/organizations_controller_routing_spec.rb
@@ -5,8 +5,13 @@ require 'spec_helper'
RSpec.describe Organizations::OrganizationsController, :routing, feature_category: :cell do
let_it_be(:organization) { build(:organization) }
- it 'routes to #directory' do
- expect(get("/-/organizations/#{organization.path}/directory"))
- .to route_to('organizations/organizations#directory', organization_path: organization.path)
+ it 'routes to #show' do
+ expect(get("/-/organizations/#{organization.path}"))
+ .to route_to('organizations/organizations#show', organization_path: organization.path)
+ end
+
+ it 'routes to #groups_and_projects' do
+ expect(get("/-/organizations/#{organization.path}/groups_and_projects"))
+ .to route_to('organizations/organizations#groups_and_projects', organization_path: organization.path)
end
end
diff --git a/spec/rubocop/cop/avoid_return_from_blocks_spec.rb b/spec/rubocop/cop/avoid_return_from_blocks_spec.rb
index e35705ae791..1b41e140454 100644
--- a/spec/rubocop/cop/avoid_return_from_blocks_spec.rb
+++ b/spec/rubocop/cop/avoid_return_from_blocks_spec.rb
@@ -41,10 +41,10 @@ RSpec.describe RuboCop::Cop::AvoidReturnFromBlocks do
RUBY
end
- shared_examples 'examples with whitelisted method' do |whitelisted_method|
- it "doesn't flag violation for return inside #{whitelisted_method}" do
+ shared_examples 'examples with allowlisted method' do |allowlisted_method|
+ it "doesn't flag violation for return inside #{allowlisted_method}" do
expect_no_offenses(<<~RUBY)
- items.#{whitelisted_method} do |item|
+ items.#{allowlisted_method} do |item|
do_something
return if something_else
end
@@ -52,8 +52,8 @@ RSpec.describe RuboCop::Cop::AvoidReturnFromBlocks do
end
end
- %i[each each_filename times loop].each do |whitelisted_method|
- it_behaves_like 'examples with whitelisted method', whitelisted_method
+ %i[each each_filename times loop].each do |allowlisted_method|
+ it_behaves_like 'examples with allowlisted method', allowlisted_method
end
shared_examples 'examples with def methods' do |def_method|
diff --git a/spec/rubocop/cop/background_migration/avoid_silent_rescue_exceptions_spec.rb b/spec/rubocop/cop/background_migration/avoid_silent_rescue_exceptions_spec.rb
new file mode 100644
index 00000000000..ea4f7d5fca8
--- /dev/null
+++ b/spec/rubocop/cop/background_migration/avoid_silent_rescue_exceptions_spec.rb
@@ -0,0 +1,107 @@
+# frozen_string_literal: true
+
+require 'rubocop_spec_helper'
+require_relative '../../../../rubocop/cop/background_migration/avoid_silent_rescue_exceptions'
+
+RSpec.describe RuboCop::Cop::BackgroundMigration::AvoidSilentRescueExceptions, feature_category: :database do
+ shared_examples 'expecting offense when' do |node|
+ it 'throws offense when rescuing exceptions without re-raising them' do
+ %w[Gitlab::BackgroundMigration::BatchedMigrationJob BatchedMigrationJob].each do |base_class|
+ expect_offense(<<~RUBY)
+ module Gitlab
+ module BackgroundMigration
+ class MyJob < #{base_class}
+ #{node}
+ end
+ end
+ end
+ RUBY
+ end
+ end
+ end
+
+ shared_examples 'not expecting offense when' do |node|
+ it 'does not throw any offense if exception is re-raised' do
+ %w[Gitlab::BackgroundMigration::BatchedMigrationJob BatchedMigrationJob].each do |base_class|
+ expect_no_offenses(<<~RUBY)
+ module Gitlab
+ module BackgroundMigration
+ class MyJob < #{base_class}
+ #{node}
+ end
+ end
+ end
+ RUBY
+ end
+ end
+ end
+
+ context "when the migration class doesn't inherits from BatchedMigrationJob" do
+ it 'does not throw any offense' do
+ expect_no_offenses(<<~RUBY)
+ module Gitlab
+ module BackgroundMigration
+ class MyClass < ::Gitlab::BackgroundMigration::Logger
+ def my_method
+ execute
+ rescue StandardError => error
+ puts error.message
+ end
+ end
+ end
+ end
+ RUBY
+ end
+ end
+
+ context 'when the migration class inherits from BatchedMigrationJob' do
+ context 'when specifying an error class' do
+ it_behaves_like 'expecting offense when', <<~RUBY
+ def perform
+ connection.execute('SELECT 1;')
+ rescue JSON::ParserError
+ ^^^^^^^^^^^^^^^^^^^^^^^^ #{described_class::MSG}
+ logger.error(message: error.message, class: self.class.name)
+ end
+ RUBY
+
+ it_behaves_like 'expecting offense when', <<~RUBY
+ def perform
+ connection.execute('SELECT 1;')
+ rescue StandardError, ActiveRecord::StatementTimeout => error
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{described_class::MSG}
+ logger.error(message: error.message, class: self.class.name)
+ end
+ RUBY
+
+ it_behaves_like 'not expecting offense when', <<~RUBY
+ def perform
+ connection.execute('SELECT 1;')
+ rescue StandardError, ActiveRecord::StatementTimeout => error
+ logger.error(message: error.message, class: self.class.name)
+ raise error
+ end
+ RUBY
+ end
+
+ context 'without specifying an error class' do
+ it_behaves_like 'expecting offense when', <<~RUBY
+ def perform
+ connection.execute('SELECT 1;')
+ rescue => error
+ ^^^^^^ #{described_class::MSG}
+ logger.error(message: error.message, class: self.class.name)
+ end
+ RUBY
+
+ it_behaves_like 'not expecting offense when', <<~RUBY
+ def perform
+ connection.execute('SELECT 1;')
+ rescue => error
+ logger.error(message: error.message, class: self.class.name)
+ raise error
+ end
+ RUBY
+ end
+ end
+end
diff --git a/spec/rubocop/cop/gitlab/mark_used_feature_flags_spec.rb b/spec/rubocop/cop/gitlab/mark_used_feature_flags_spec.rb
index 96ff01108c3..4b7ea6b72e5 100644
--- a/spec/rubocop/cop/gitlab/mark_used_feature_flags_spec.rb
+++ b/spec/rubocop/cop/gitlab/mark_used_feature_flags_spec.rb
@@ -48,35 +48,35 @@ RSpec.describe RuboCop::Cop::Gitlab::MarkUsedFeatureFlags do
].each do |feature_flag_method|
context "#{feature_flag_method} method" do
context 'a string feature flag' do
- include_examples 'sets flag as used', %Q|#{feature_flag_method}("foo")|, 'foo'
+ include_examples 'sets flag as used', %|#{feature_flag_method}("foo")|, 'foo'
end
context 'a symbol feature flag' do
- include_examples 'sets flag as used', %Q|#{feature_flag_method}(:foo)|, 'foo'
+ include_examples 'sets flag as used', %|#{feature_flag_method}(:foo)|, 'foo'
end
context 'an interpolated string feature flag with a string prefix' do
- include_examples 'sets flag as used', %Q|#{feature_flag_method}("foo_\#{bar}")|, %w[foo_hello foo_world]
+ include_examples 'sets flag as used', %|#{feature_flag_method}("foo_\#{bar}")|, %w[foo_hello foo_world]
end
context 'an interpolated symbol feature flag with a string prefix' do
- include_examples 'sets flag as used', %Q|#{feature_flag_method}(:"foo_\#{bar}")|, %w[foo_hello foo_world]
+ include_examples 'sets flag as used', %|#{feature_flag_method}(:"foo_\#{bar}")|, %w[foo_hello foo_world]
end
context 'a string with a "/" in it' do
- include_examples 'sets flag as used', %Q|#{feature_flag_method}("bar/baz")|, 'bar_baz'
+ include_examples 'sets flag as used', %|#{feature_flag_method}("bar/baz")|, 'bar_baz'
end
context 'an interpolated string feature flag with a string prefix and suffix' do
- include_examples 'does not set any flags as used', %Q|#{feature_flag_method}(:"foo_\#{bar}_baz")|
+ include_examples 'does not set any flags as used', %|#{feature_flag_method}(:"foo_\#{bar}_baz")|
end
context 'a dynamic string feature flag as a variable' do
- include_examples 'does not set any flags as used', %Q|#{feature_flag_method}(a_variable, an_arg)|
+ include_examples 'does not set any flags as used', %|#{feature_flag_method}(a_variable, an_arg)|
end
context 'an integer feature flag' do
- include_examples 'does not set any flags as used', %Q|#{feature_flag_method}(123)|
+ include_examples 'does not set any flags as used', %|#{feature_flag_method}(123)|
end
end
end
@@ -87,31 +87,31 @@ RSpec.describe RuboCop::Cop::Gitlab::MarkUsedFeatureFlags do
].each do |feature_flag_method|
context "#{feature_flag_method} method" do
context 'a string feature flag' do
- include_examples 'sets flag as used', %Q|#{feature_flag_method}("foo")|, 'gitaly_foo'
+ include_examples 'sets flag as used', %|#{feature_flag_method}("foo")|, 'gitaly_foo'
end
context 'a symbol feature flag' do
- include_examples 'sets flag as used', %Q|#{feature_flag_method}(:foo)|, 'gitaly_foo'
+ include_examples 'sets flag as used', %|#{feature_flag_method}(:foo)|, 'gitaly_foo'
end
context 'an interpolated string feature flag with a string prefix' do
- include_examples 'sets flag as used', %Q|#{feature_flag_method}("foo_\#{bar}")|, %w[foo_hello foo_world]
+ include_examples 'sets flag as used', %|#{feature_flag_method}("foo_\#{bar}")|, %w[foo_hello foo_world]
end
context 'an interpolated symbol feature flag with a string prefix' do
- include_examples 'sets flag as used', %Q|#{feature_flag_method}(:"foo_\#{bar}")|, %w[foo_hello foo_world]
+ include_examples 'sets flag as used', %|#{feature_flag_method}(:"foo_\#{bar}")|, %w[foo_hello foo_world]
end
context 'an interpolated string feature flag with a string prefix and suffix' do
- include_examples 'does not set any flags as used', %Q|#{feature_flag_method}(:"foo_\#{bar}_baz")|
+ include_examples 'does not set any flags as used', %|#{feature_flag_method}(:"foo_\#{bar}_baz")|
end
context 'a dynamic string feature flag as a variable' do
- include_examples 'does not set any flags as used', %Q|#{feature_flag_method}(a_variable, an_arg)|
+ include_examples 'does not set any flags as used', %|#{feature_flag_method}(a_variable, an_arg)|
end
context 'an integer feature flag' do
- include_examples 'does not set any flags as used', %Q|#{feature_flag_method}(123)|
+ include_examples 'does not set any flags as used', %|#{feature_flag_method}(123)|
end
end
end
@@ -126,15 +126,15 @@ RSpec.describe RuboCop::Cop::Gitlab::MarkUsedFeatureFlags do
end
context 'an interpolated string feature flag with a string prefix' do
- include_examples 'sets flag as used', %Q|experiment("foo_\#{bar}")|, %w[foo_hello foo_world]
+ include_examples 'sets flag as used', %|experiment("foo_\#{bar}")|, %w[foo_hello foo_world]
end
context 'an interpolated symbol feature flag with a string prefix' do
- include_examples 'sets flag as used', %Q|experiment(:"foo_\#{bar}")|, %w[foo_hello foo_world]
+ include_examples 'sets flag as used', %|experiment(:"foo_\#{bar}")|, %w[foo_hello foo_world]
end
context 'an interpolated string feature flag with a string prefix and suffix' do
- include_examples 'does not set any flags as used', %Q|experiment(:"foo_\#{bar}_baz")|
+ include_examples 'does not set any flags as used', %|experiment(:"foo_\#{bar}_baz")|
end
context 'a dynamic string feature flag as a variable' do
@@ -151,31 +151,31 @@ RSpec.describe RuboCop::Cop::Gitlab::MarkUsedFeatureFlags do
].each do |feature_flag_method|
context "#{feature_flag_method} method" do
context 'a string feature flag' do
- include_examples 'sets flag as used', %Q|#{feature_flag_method}(arg, "baz")|, 'baz'
+ include_examples 'sets flag as used', %|#{feature_flag_method}(arg, "baz")|, 'baz'
end
context 'a symbol feature flag' do
- include_examples 'sets flag as used', %Q|#{feature_flag_method}(arg, :baz)|, 'baz'
+ include_examples 'sets flag as used', %|#{feature_flag_method}(arg, :baz)|, 'baz'
end
context 'an interpolated string feature flag with a string prefix' do
- include_examples 'sets flag as used', %Q|#{feature_flag_method}(arg, "foo_\#{bar}")|, %w[foo_hello foo_world]
+ include_examples 'sets flag as used', %|#{feature_flag_method}(arg, "foo_\#{bar}")|, %w[foo_hello foo_world]
end
context 'an interpolated symbol feature flag with a string prefix' do
- include_examples 'sets flag as used', %Q|#{feature_flag_method}(arg, :"foo_\#{bar}")|, %w[foo_hello foo_world]
+ include_examples 'sets flag as used', %|#{feature_flag_method}(arg, :"foo_\#{bar}")|, %w[foo_hello foo_world]
end
context 'an interpolated string feature flag with a string prefix and suffix' do
- include_examples 'does not set any flags as used', %Q|#{feature_flag_method}(arg, :"foo_\#{bar}_baz")|
+ include_examples 'does not set any flags as used', %|#{feature_flag_method}(arg, :"foo_\#{bar}_baz")|
end
context 'a dynamic string feature flag as a variable' do
- include_examples 'does not set any flags as used', %Q|#{feature_flag_method}(a_variable, an_arg)|
+ include_examples 'does not set any flags as used', %|#{feature_flag_method}(a_variable, an_arg)|
end
context 'an integer feature flag' do
- include_examples 'does not set any flags as used', %Q|#{feature_flag_method}(arg, 123)|
+ include_examples 'does not set any flags as used', %|#{feature_flag_method}(arg, 123)|
end
end
end
diff --git a/spec/rubocop/cop/gitlab/strong_memoize_attr_spec.rb b/spec/rubocop/cop/gitlab/strong_memoize_attr_spec.rb
index fde53f8f98c..75455a390f4 100644
--- a/spec/rubocop/cop/gitlab/strong_memoize_attr_spec.rb
+++ b/spec/rubocop/cop/gitlab/strong_memoize_attr_spec.rb
@@ -100,4 +100,42 @@ RSpec.describe RuboCop::Cop::Gitlab::StrongMemoizeAttr do
RUBY
end
end
+
+ context 'when strong_memoize_with() is called without parameters' do
+ it 'registers an offense and autocorrects' do
+ expect_offense(<<~RUBY)
+ class Foo
+ def memoized_method
+ strong_memoize_with(:memoized_method) do
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Use `strong_memoize_attr`, instead of using `strong_memoize_with` without parameters.
+ 'This is a memoized method'
+ end
+ end
+ end
+ RUBY
+
+ expect_correction(<<~RUBY)
+ class Foo
+ def memoized_method
+ 'This is a memoized method'
+ end
+ strong_memoize_attr :memoized_method
+ end
+ RUBY
+ end
+ end
+
+ context 'when strong_memoize_with() is called with parameters' do
+ it 'does not register an offense' do
+ expect_no_offenses(<<~RUBY)
+ class Foo
+ def memoized_method(param)
+ strong_memoize_with(:memoized_method, param) do
+ param.to_s
+ end
+ end
+ end
+ RUBY
+ end
+ end
end
diff --git a/spec/rubocop/cop/graphql/gid_expected_type_spec.rb b/spec/rubocop/cop/graphql/gid_expected_type_spec.rb
deleted file mode 100644
index 563c16a99df..00000000000
--- a/spec/rubocop/cop/graphql/gid_expected_type_spec.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-require 'rubocop_spec_helper'
-
-require_relative '../../../../rubocop/cop/graphql/gid_expected_type'
-
-RSpec.describe RuboCop::Cop::Graphql::GIDExpectedType do
- it 'adds an offense when there is no expected_type parameter' do
- expect_offense(<<~TYPE)
- GitlabSchema.object_from_id(received_id)
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Add an expected_type parameter to #object_from_id calls if possible.
- TYPE
- end
-
- it 'does not add an offense for calls that have an expected_type parameter' do
- expect_no_offenses(<<~TYPE.strip)
- GitlabSchema.object_from_id("some_id", expected_type: SomeClass)
- TYPE
- end
-end
diff --git a/spec/rubocop/cop/graphql/id_type_spec.rb b/spec/rubocop/cop/graphql/id_type_spec.rb
index 3a56753d39e..6eb4890c064 100644
--- a/spec/rubocop/cop/graphql/id_type_spec.rb
+++ b/spec/rubocop/cop/graphql/id_type_spec.rb
@@ -12,8 +12,8 @@ RSpec.describe RuboCop::Cop::Graphql::IDType do
TYPE
end
- context 'whitelisted arguments' do
- RuboCop::Cop::Graphql::IDType::WHITELISTED_ARGUMENTS.each do |arg|
+ context 'allowlisted arguments' do
+ RuboCop::Cop::Graphql::IDType::ALLOWLISTED_ARGUMENTS.each do |arg|
it "does not add an offense for calls to #argument with #{arg} as argument name" do
expect_no_offenses(<<~TYPE.strip)
argument #{arg}, GraphQL::Types::ID, some: other, params: do_not_matter
diff --git a/spec/rubocop/cop/ignored_columns_spec.rb b/spec/rubocop/cop/ignored_columns_spec.rb
index 8d2c6b92c70..c8f47f8aee9 100644
--- a/spec/rubocop/cop/ignored_columns_spec.rb
+++ b/spec/rubocop/cop/ignored_columns_spec.rb
@@ -4,20 +4,20 @@ require 'rubocop_spec_helper'
require_relative '../../../rubocop/cop/ignored_columns'
RSpec.describe RuboCop::Cop::IgnoredColumns, feature_category: :database do
- it 'flags use of `self.ignored_columns +=` instead of the IgnoredColumns concern' do
+ it 'flags use of `self.ignored_columns +=` instead of the IgnorableColumns concern' do
expect_offense(<<~RUBY)
class Foo < ApplicationRecord
self.ignored_columns += %i[id]
- ^^^^^^^^^^^^^^^ Use `IgnoredColumns` concern instead of adding to `self.ignored_columns`.
+ ^^^^^^^^^^^^^^^ Use `IgnorableColumns` concern instead of adding to `self.ignored_columns`.
end
RUBY
end
- it 'flags use of `self.ignored_columns =` instead of the IgnoredColumns concern' do
+ it 'flags use of `self.ignored_columns =` instead of the IgnorableColumns concern' do
expect_offense(<<~RUBY)
class Foo < ApplicationRecord
self.ignored_columns = %i[id]
- ^^^^^^^^^^^^^^^ Use `IgnoredColumns` concern instead of setting `self.ignored_columns`.
+ ^^^^^^^^^^^^^^^ Use `IgnorableColumns` concern instead of setting `self.ignored_columns`.
end
RUBY
end
diff --git a/spec/rubocop/cop/migration/avoid_finalize_background_migration_spec.rb b/spec/rubocop/cop/migration/avoid_finalize_background_migration_spec.rb
new file mode 100644
index 00000000000..e4eec39e3ff
--- /dev/null
+++ b/spec/rubocop/cop/migration/avoid_finalize_background_migration_spec.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+require 'rubocop_spec_helper'
+require_relative '../../../../rubocop/cop/migration/avoid_finalize_background_migration'
+
+RSpec.describe RuboCop::Cop::Migration::AvoidFinalizeBackgroundMigration, feature_category: :database do
+ context 'when file is under db/post_migration' do
+ it "flags the use of 'finalize_background_migration' method" do
+ expect_offense(<<~RUBY)
+ class FinalizeMyMigration < Gitlab::Database::Migration[2.1]
+ MIGRATION = 'MyMigration'
+
+ def up
+ finalize_background_migration(MIGRATION)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{described_class::MSG}
+ end
+ end
+ RUBY
+ end
+ end
+end
diff --git a/spec/rubocop/cop/qa/element_with_pattern_spec.rb b/spec/rubocop/cop/qa/element_with_pattern_spec.rb
index 1febdaf9c3b..ccc03d7f5ae 100644
--- a/spec/rubocop/cop/qa/element_with_pattern_spec.rb
+++ b/spec/rubocop/cop/qa/element_with_pattern_spec.rb
@@ -40,7 +40,7 @@ RSpec.describe RuboCop::Cop::QA::ElementWithPattern do
end
end
- context 'outside of a migration spec file' do
+ context 'when outside of a QA spec file' do
it "does not register an offense" do
expect_no_offenses(<<-RUBY)
describe 'foo' do
diff --git a/spec/rubocop/cop/rake/require_spec.rb b/spec/rubocop/cop/rake/require_spec.rb
index bb8c6a1f063..de484643d6e 100644
--- a/spec/rubocop/cop/rake/require_spec.rb
+++ b/spec/rubocop/cop/rake/require_spec.rb
@@ -7,54 +7,84 @@ require_relative '../../../../rubocop/cop/rake/require'
RSpec.describe RuboCop::Cop::Rake::Require do
let(:msg) { described_class::MSG }
- it 'registers an offenses for require methods' do
- expect_offense(<<~RUBY)
- require 'json'
- ^^^^^^^^^^^^^^ #{msg}
- require_relative 'gitlab/json'
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{msg}
- RUBY
+ describe '#in_rake_file?' do
+ context 'in a Rake file' do
+ let(:node) { double(location: double(expression: double(source_buffer: double(name: 'foo/bar.rake')))) } # rubocop:disable RSpec/VerifiedDoubles
+
+ it { expect(subject.__send__(:in_rake_file?, node)).to be(true) }
+ end
+
+ context 'when outside of a Rake file' do
+ let(:node) { double(location: double(expression: double(source_buffer: double(name: 'foo/bar.rb')))) } # rubocop:disable RSpec/VerifiedDoubles
+
+ it { expect(subject.__send__(:in_rake_file?, node)).to be(false) }
+ end
end
- it 'does not register offense inside `task` definition' do
- expect_no_offenses(<<~RUBY)
- task :parse do
+ context 'in a Rake file' do
+ before do
+ allow(cop).to receive(:in_rake_file?).and_return(true)
+ end
+
+ it 'registers an offenses for require methods' do
+ expect_offense(<<~RUBY)
require 'json'
- end
+ ^^^^^^^^^^^^^^ #{msg}
+ require_relative 'gitlab/json'
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{msg}
+ RUBY
+ end
- namespace :some do
- task parse: :env do
- require_relative 'gitlab/json'
+ it 'does not register offense inside `task` definition' do
+ expect_no_offenses(<<~RUBY)
+ task :parse do
+ require 'json'
end
- end
- RUBY
- end
- it 'does not register offense inside a block definition' do
- expect_no_offenses(<<~RUBY)
- RSpec::Core::RakeTask.new(:parse_json) do |t, args|
- require 'json'
- end
- RUBY
- end
+ namespace :some do
+ task parse: :env do
+ require_relative 'gitlab/json'
+ end
+ end
+ RUBY
+ end
- it 'does not register offense inside a method definition' do
- expect_no_offenses(<<~RUBY)
- def load_deps
- require 'json'
- end
+ it 'does not register offense inside a block definition' do
+ expect_no_offenses(<<~RUBY)
+ RSpec::Core::RakeTask.new(:parse_json) do |t, args|
+ require 'json'
+ end
+ RUBY
+ end
+
+ it 'does not register offense inside a method definition' do
+ expect_no_offenses(<<~RUBY)
+ def load_deps
+ require 'json'
+ end
- task :parse do
- load_deps
- end
- RUBY
+ task :parse do
+ load_deps
+ end
+ RUBY
+ end
+
+ it 'does not register offense when require task related files' do
+ expect_no_offenses(<<~RUBY)
+ require 'rubocop/rake_tasks'
+ require 'gettext_i18n_rails/tasks'
+ require_relative '../../rubocop/check_graceful_task'
+ RUBY
+ end
end
- it 'does not register offense when require task related files' do
- expect_no_offenses(<<~RUBY)
- require 'rubocop/rake_tasks'
- require 'gettext_i18n_rails/tasks'
- require_relative '../../rubocop/check_graceful_task'
- RUBY
+ context 'when outside of a Rake file' do
+ before do
+ allow(cop).to receive(:in_rake_file?).and_return(false)
+ end
+
+ it 'registers an offenses for require methods' do
+ expect_no_offenses("require 'json'")
+ end
end
end
diff --git a/spec/rubocop/cop/rspec/before_all_role_assignment_spec.rb b/spec/rubocop/cop/rspec/before_all_role_assignment_spec.rb
new file mode 100644
index 00000000000..f8a9a6e22c4
--- /dev/null
+++ b/spec/rubocop/cop/rspec/before_all_role_assignment_spec.rb
@@ -0,0 +1,234 @@
+# frozen_string_literal: true
+
+require 'rubocop_spec_helper'
+require 'rspec-parameterized'
+require_relative '../../../../rubocop/cop/rspec/before_all_role_assignment'
+
+RSpec.describe Rubocop::Cop::RSpec::BeforeAllRoleAssignment, :rubocop_rspec, feature_category: :tooling do
+ context 'with `let`' do
+ context 'and `before_all`' do
+ it 'does not register an offense' do
+ expect_no_offenses(<<~RUBY)
+ context 'with something' do
+ let(:project) { create(:project) }
+ let(:guest) { create(:user) }
+
+ before_all do
+ project.add_guest(guest)
+ end
+ end
+ RUBY
+ end
+ end
+
+ context 'and `before`' do
+ it 'does not register an offense' do
+ expect_no_offenses(<<~RUBY)
+ context 'with something' do
+ let(:project) { create(:project) }
+ let(:guest) { create(:user) }
+
+ before do
+ project.add_guest(guest)
+ end
+ end
+ RUBY
+ end
+ end
+ end
+
+ shared_examples '`let_it_be` definitions' do |let_it_be|
+ context 'and `before_all`' do
+ it 'does not register an offense' do
+ expect_no_offenses(<<~RUBY)
+ context 'with something' do
+ #{let_it_be}(:project) { create(:project) }
+ #{let_it_be}(:guest) { create(:user) }
+
+ before_all do
+ project.add_guest(guest)
+ end
+ end
+ RUBY
+ end
+ end
+
+ context 'and `before`' do
+ context 'and without role methods' do
+ it 'does not register an offense' do
+ expect_no_offenses(<<~RUBY)
+ context 'with something' do
+ #{let_it_be}(:project) { create(:project) }
+ #{let_it_be}(:guest) { create(:user) }
+
+ before do
+ project.add_details(guest)
+ end
+ end
+ RUBY
+ end
+ end
+
+ context 'and role methods' do
+ where(:role_method) { described_class::ROLE_METHODS.to_a }
+
+ with_them do
+ it 'registers an offense' do
+ expect_offense(<<~RUBY, role_method: role_method)
+ context 'with something' do
+ #{let_it_be}(:project) { create(:project) }
+ #{let_it_be}(:guest) { create(:user) }
+
+ before do
+ project.%{role_method}(guest)
+ ^^^^^^^^^{role_method}^^^^^^^ Use `before_all` when used with `#{let_it_be}`.
+ end
+ end
+ RUBY
+ end
+ end
+ end
+
+ context 'without nested contexts' do
+ it 'registers an offense' do
+ expect_offense(<<~RUBY)
+ context 'with something' do
+ #{let_it_be}(:project) { create(:project) }
+ #{let_it_be}(:guest) { create(:user) }
+
+ before do
+ project.add_guest(guest)
+ ^^^^^^^^^^^^^^^^^^^^^^^^ Use `before_all` when used with `#{let_it_be}`.
+ end
+ end
+ RUBY
+ end
+ end
+
+ context 'with nested contexts' do
+ it 'registers an offense' do
+ expect_offense(<<~RUBY)
+ context 'when first context' do
+ #{let_it_be}(:guest) { create(:user) }
+
+ context 'when second context' do
+ #{let_it_be}(:project) { create(:project) }
+
+ context 'when third context' do
+ before do
+ project.add_guest(guest)
+ ^^^^^^^^^^^^^^^^^^^^^^^^ Use `before_all` when used with `#{let_it_be}`.
+ end
+ end
+ end
+ end
+ RUBY
+ end
+ end
+
+ describe 'edge cases' do
+ context 'with unrelated `let_it_be` definition' do
+ it 'does not register an offense' do
+ expect_no_offenses(<<~RUBY)
+ context 'with something' do
+ let(:project) { create(:project) }
+ #{let_it_be}(:user) { create(:user) }
+
+ before do
+ project.add_guest(guest)
+ end
+ end
+ RUBY
+ end
+ end
+
+ context 'with many role method calls' do
+ it 'registers an offense' do
+ expect_offense(<<~RUBY)
+ context 'with something' do
+ let(:project) { create(:project) }
+ #{let_it_be}(:other_project) { create(:user) }
+
+ before do
+ project.add_guest(guest)
+ other_project.add_guest(guest)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Use `before_all` when used with `#{let_it_be}`.
+ end
+ end
+ RUBY
+ end
+ end
+
+ context 'with alternative example groups' do
+ it 'registers an offense' do
+ expect_offense(<<~RUBY)
+ describe 'with something' do
+ #{let_it_be}(:project) { create(:user) }
+
+ before do
+ project.add_guest(guest)
+ ^^^^^^^^^^^^^^^^^^^^^^^^ Use `before_all` when used with `#{let_it_be}`.
+ end
+ end
+
+ it_behaves_like 'with something' do
+ #{let_it_be}(:project) { create(:user) }
+
+ before do
+ project.add_guest(guest)
+ ^^^^^^^^^^^^^^^^^^^^^^^^ Use `before_all` when used with `#{let_it_be}`.
+ end
+ end
+
+ include_examples 'with something' do
+ #{let_it_be}(:project) { create(:user) }
+
+ before do
+ project.add_guest(guest)
+ ^^^^^^^^^^^^^^^^^^^^^^^^ Use `before_all` when used with `#{let_it_be}`.
+ end
+ end
+ RUBY
+ end
+ end
+
+ context 'with `let_it_be` outside of the ancestors chain' do
+ it 'does not register an offense' do
+ expect_no_offenses(<<~RUBY)
+ context 'when in main context' do
+ let(:project) { create(:user) }
+
+ before do
+ project.add_guest(guest)
+ end
+
+ context 'when in a separate context' do
+ #{let_it_be}(:project) { create(:user) }
+
+ before do
+ project
+ end
+ end
+ end
+ RUBY
+ end
+ end
+ end
+ end
+ end
+
+ context 'with `let_it_be` variants' do
+ before do
+ other_cops.tap do |config|
+ config.dig('RSpec', 'Language', 'Helpers')
+ .push('let_it_be', 'let_it_be_with_reload', 'let_it_be_with_refind')
+ end
+ end
+
+ where(:let_it_be) { %i[let_it_be let_it_be_with_reload let_it_be_with_refind] }
+
+ with_them do
+ include_examples '`let_it_be` definitions', params[:let_it_be]
+ end
+ end
+end
diff --git a/spec/rubocop/cop/search/avoid_checking_finished_on_deprecated_migrations_spec.rb b/spec/rubocop/cop/search/avoid_checking_finished_on_deprecated_migrations_spec.rb
new file mode 100644
index 00000000000..9853423e758
--- /dev/null
+++ b/spec/rubocop/cop/search/avoid_checking_finished_on_deprecated_migrations_spec.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+require 'rubocop_spec_helper'
+require_relative '../../../../rubocop/cop/search/avoid_checking_finished_on_deprecated_migrations'
+
+RSpec.describe RuboCop::Cop::Search::AvoidCheckingFinishedOnDeprecatedMigrations, feature_category: :global_search do
+ context 'when a deprecated class is used with migration_has_finished?' do
+ it 'flags it as an offense' do
+ expect_offense <<~SOURCE
+ return if Elastic::DataMigrationService.migration_has_finished?(:backfill_project_permissions_in_blobs_using_permutations)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Migration is deprecated and can not be used with `migration_has_finished?`.
+ SOURCE
+ end
+ end
+
+ context 'when a non deprecated class is used with migration_has_finished?' do
+ it 'does not flag it as an offense' do
+ expect_no_offenses <<~SOURCE
+ return if Elastic::DataMigrationService.migration_has_finished?(:backfill_project_permissions_in_blobs)
+ SOURCE
+ end
+ end
+
+ context 'when migration_has_finished? method is called on another class' do
+ it 'does not flag it as an offense' do
+ expect_no_offenses <<~SOURCE
+ return if Klass.migration_has_finished?(:backfill_project_permissions_in_blobs_using_permutations)
+ SOURCE
+ end
+ end
+end
diff --git a/spec/rubocop/cop/usage_data/distinct_count_by_large_foreign_key_spec.rb b/spec/rubocop/cop/usage_data/distinct_count_by_large_foreign_key_spec.rb
index b4d113a9bcc..53bf5de6243 100644
--- a/spec/rubocop/cop/usage_data/distinct_count_by_large_foreign_key_spec.rb
+++ b/spec/rubocop/cop/usage_data/distinct_count_by_large_foreign_key_spec.rb
@@ -13,33 +13,45 @@ RSpec.describe RuboCop::Cop::UsageData::DistinctCountByLargeForeignKey do
})
end
- context 'when counting by disallowed key' do
- it 'registers an offense' do
- expect_offense(<<~CODE)
- distinct_count(Issue, :creator_id)
- ^^^^^^^^^^^^^^ #{msg}
- CODE
+ context 'in an usage data file' do
+ before do
+ allow(cop).to receive(:in_usage_data_file?).and_return(true)
end
- it 'does not register an offense when batch is false' do
- expect_no_offenses('distinct_count(Issue, :creator_id, batch: false)')
+ context 'when counting by disallowed key' do
+ it 'registers an offense' do
+ expect_offense(<<~CODE)
+ distinct_count(Issue, :creator_id)
+ ^^^^^^^^^^^^^^ #{msg}
+ CODE
+ end
+
+ it 'does not register an offense when batch is false' do
+ expect_no_offenses('distinct_count(Issue, :creator_id, batch: false)')
+ end
+
+ it 'registers an offense when batch is true' do
+ expect_offense(<<~CODE)
+ distinct_count(Issue, :creator_id, batch: true)
+ ^^^^^^^^^^^^^^ #{msg}
+ CODE
+ end
end
- it 'registers an offense when batch is true' do
- expect_offense(<<~CODE)
- distinct_count(Issue, :creator_id, batch: true)
- ^^^^^^^^^^^^^^ #{msg}
- CODE
- end
- end
+ context 'when calling by allowed key' do
+ it 'does not register an offense with symbol' do
+ expect_no_offenses('distinct_count(Issue, :author_id)')
+ end
- context 'when calling by allowed key' do
- it 'does not register an offense with symbol' do
- expect_no_offenses('distinct_count(Issue, :author_id)')
+ it 'does not register an offense with string' do
+ expect_no_offenses("distinct_count(Issue, 'merge_requests.target_project_id')")
+ end
end
+ end
- it 'does not register an offense with string' do
- expect_no_offenses("distinct_count(Issue, 'merge_requests.target_project_id')")
+ context 'when outside of an usage data file' do
+ it 'does not register an offense' do
+ expect_no_offenses('distinct_count(Issue, :creator_id)')
end
end
end
diff --git a/spec/rubocop/cop/usage_data/histogram_with_large_table_spec.rb b/spec/rubocop/cop/usage_data/histogram_with_large_table_spec.rb
index efa4e27dc9c..0de14310e13 100644
--- a/spec/rubocop/cop/usage_data/histogram_with_large_table_spec.rb
+++ b/spec/rubocop/cop/usage_data/histogram_with_large_table_spec.rb
@@ -14,93 +14,105 @@ RSpec.describe RuboCop::Cop::UsageData::HistogramWithLargeTable do
})
end
- context 'with large tables' do
- context 'with one-level constants' do
- context 'when calling histogram(Issue)' do
- it 'registers an offense' do
- expect_offense(<<~CODE)
- histogram(Issue, :project_id, buckets: 1..100)
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{msg} Issue
- CODE
+ context 'in an usage data file' do
+ before do
+ allow(cop).to receive(:in_usage_data_file?).and_return(true)
+ end
+
+ context 'with large tables' do
+ context 'with one-level constants' do
+ context 'when calling histogram(Issue)' do
+ it 'registers an offense' do
+ expect_offense(<<~CODE)
+ histogram(Issue, :project_id, buckets: 1..100)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{msg} Issue
+ CODE
+ end
end
- end
- context 'when calling histogram(::Issue)' do
- it 'registers an offense' do
- expect_offense(<<~CODE)
- histogram(::Issue, :project_id, buckets: 1..100)
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{msg} Issue
- CODE
+ context 'when calling histogram(::Issue)' do
+ it 'registers an offense' do
+ expect_offense(<<~CODE)
+ histogram(::Issue, :project_id, buckets: 1..100)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{msg} Issue
+ CODE
+ end
end
- end
- context 'when calling histogram(Issue.closed)' do
- it 'registers an offense' do
- expect_offense(<<~CODE)
- histogram(Issue.closed, :project_id, buckets: 1..100)
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{msg} Issue
- CODE
+ context 'when calling histogram(Issue.closed)' do
+ it 'registers an offense' do
+ expect_offense(<<~CODE)
+ histogram(Issue.closed, :project_id, buckets: 1..100)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{msg} Issue
+ CODE
+ end
end
- end
- context 'when calling histogram(::Issue.closed)' do
- it 'registers an offense' do
- expect_offense(<<~CODE)
- histogram(::Issue.closed, :project_id, buckets: 1..100)
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{msg} Issue
- CODE
+ context 'when calling histogram(::Issue.closed)' do
+ it 'registers an offense' do
+ expect_offense(<<~CODE)
+ histogram(::Issue.closed, :project_id, buckets: 1..100)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{msg} Issue
+ CODE
+ end
end
end
- end
- context 'with two-level constants' do
- context 'when calling histogram(::Ci::Build)' do
- it 'registers an offense' do
- expect_offense(<<~CODE)
- histogram(::Ci::Build, buckets: 1..100)
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{msg} Ci::Build
- CODE
+ context 'with two-level constants' do
+ context 'when calling histogram(::Ci::Build)' do
+ it 'registers an offense' do
+ expect_offense(<<~CODE)
+ histogram(::Ci::Build, buckets: 1..100)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{msg} Ci::Build
+ CODE
+ end
end
- end
- context 'when calling histogram(::Ci::Build.active)' do
- it 'registers an offense' do
- expect_offense(<<~CODE)
- histogram(::Ci::Build.active, buckets: 1..100)
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{msg} Ci::Build
- CODE
+ context 'when calling histogram(::Ci::Build.active)' do
+ it 'registers an offense' do
+ expect_offense(<<~CODE)
+ histogram(::Ci::Build.active, buckets: 1..100)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{msg} Ci::Build
+ CODE
+ end
end
- end
- context 'when calling histogram(Ci::Build)' do
- it 'registers an offense' do
- expect_offense(<<~CODE)
- histogram(Ci::Build, buckets: 1..100)
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{msg} Ci::Build
- CODE
+ context 'when calling histogram(Ci::Build)' do
+ it 'registers an offense' do
+ expect_offense(<<~CODE)
+ histogram(Ci::Build, buckets: 1..100)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{msg} Ci::Build
+ CODE
+ end
end
- end
- context 'when calling histogram(Ci::Build.active)' do
- it 'registers an offense' do
- expect_offense(<<~CODE)
- histogram(Ci::Build.active, buckets: 1..100)
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{msg} Ci::Build
- CODE
+ context 'when calling histogram(Ci::Build.active)' do
+ it 'registers an offense' do
+ expect_offense(<<~CODE)
+ histogram(Ci::Build.active, buckets: 1..100)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{msg} Ci::Build
+ CODE
+ end
end
end
end
- end
- context 'with non related class' do
- it 'does not register an offense' do
- expect_no_offenses('histogram(MergeRequest, buckets: 1..100)')
+ context 'with non related class' do
+ it 'does not register an offense' do
+ expect_no_offenses('histogram(MergeRequest, buckets: 1..100)')
+ end
+ end
+
+ context 'with non related method' do
+ it 'does not register an offense' do
+ expect_no_offenses('count(Issue, buckets: 1..100)')
+ end
end
end
- context 'with non related method' do
+ context 'when outside of an usage data file' do
it 'does not register an offense' do
- expect_no_offenses('count(Issue, buckets: 1..100)')
+ expect_no_offenses('histogram(Issue, :project_id, buckets: 1..100)')
end
end
end
diff --git a/spec/rubocop/cop/usage_data/instrumentation_superclass_spec.rb b/spec/rubocop/cop/usage_data/instrumentation_superclass_spec.rb
index a55f0852f35..f208a5451cb 100644
--- a/spec/rubocop/cop/usage_data/instrumentation_superclass_spec.rb
+++ b/spec/rubocop/cop/usage_data/instrumentation_superclass_spec.rb
@@ -14,49 +14,63 @@ RSpec.describe RuboCop::Cop::UsageData::InstrumentationSuperclass do
})
end
- context 'with class definition' do
- context 'when inheriting from allowed superclass' do
- it 'does not register an offense' do
- expect_no_offenses('class NewMetric < GenericMetric; end')
- end
+ context 'when in an instrumentation file' do
+ before do
+ allow(cop).to receive(:in_instrumentation_file?).and_return(true)
end
- context 'when inheriting from some other superclass' do
- it 'registers an offense' do
- expect_offense(<<~CODE)
- class NewMetric < BaseMetric; end
- ^^^^^^^^^^ #{msg}
- CODE
+ context 'with class definition' do
+ context 'when inheriting from allowed superclass' do
+ it 'does not register an offense' do
+ expect_no_offenses('class NewMetric < GenericMetric; end')
+ end
end
- end
- context 'when not inheriting' do
- it 'does not register an offense' do
- expect_no_offenses('class NewMetric; end')
+ context 'when inheriting from some other superclass' do
+ it 'registers an offense' do
+ expect_offense(<<~CODE)
+ class NewMetric < BaseMetric; end
+ ^^^^^^^^^^ #{msg}
+ CODE
+ end
end
- end
- end
- context 'with dynamic class definition' do
- context 'when inheriting from allowed superclass' do
- it 'does not register an offense' do
- expect_no_offenses('NewMetric = Class.new(GenericMetric)')
+ context 'when not inheriting' do
+ it 'does not register an offense' do
+ expect_no_offenses('class NewMetric; end')
+ end
end
end
- context 'when inheriting from some other superclass' do
- it 'registers an offense' do
- expect_offense(<<~CODE)
- NewMetric = Class.new(BaseMetric)
- ^^^^^^^^^^ #{msg}
- CODE
+ context 'with dynamic class definition' do
+ context 'when inheriting from allowed superclass' do
+ it 'does not register an offense' do
+ expect_no_offenses('NewMetric = Class.new(GenericMetric)')
+ end
end
- end
- context 'when not inheriting' do
- it 'does not register an offense' do
- expect_no_offenses('NewMetric = Class.new')
+ context 'when inheriting from some other superclass' do
+ it 'registers an offense' do
+ expect_offense(<<~CODE)
+ NewMetric = Class.new(BaseMetric)
+ ^^^^^^^^^^ #{msg}
+ CODE
+ end
end
+
+ context 'when not inheriting' do
+ it 'does not register an offense' do
+ expect_no_offenses('NewMetric = Class.new')
+ end
+ end
+ end
+ end
+
+ context 'when outside of an instrumentation file' do
+ it "does not register an offense" do
+ expect_no_offenses(<<-RUBY)
+ class NewMetric < BaseMetric; end
+ RUBY
end
end
end
diff --git a/spec/rubocop/cop/usage_data/large_table_spec.rb b/spec/rubocop/cop/usage_data/large_table_spec.rb
index fa94f878cea..ceeb1143690 100644
--- a/spec/rubocop/cop/usage_data/large_table_spec.rb
+++ b/spec/rubocop/cop/usage_data/large_table_spec.rb
@@ -18,9 +18,9 @@ RSpec.describe RuboCop::Cop::UsageData::LargeTable do
})
end
- context 'when in usage_data files' do
+ context 'in an usage data file' do
before do
- allow(cop).to receive(:usage_data_files?).and_return(true)
+ allow(cop).to receive(:in_usage_data_file?).and_return(true)
end
context 'with large tables' do
@@ -76,4 +76,10 @@ RSpec.describe RuboCop::Cop::UsageData::LargeTable do
end
end
end
+
+ context 'when outside of an usage data file' do
+ it 'does not register an offense' do
+ expect_no_offenses('Issue.active.count')
+ end
+ end
end
diff --git a/spec/rubocop/cop_todo_spec.rb b/spec/rubocop/cop_todo_spec.rb
index c641001789f..49206d76d5a 100644
--- a/spec/rubocop/cop_todo_spec.rb
+++ b/spec/rubocop/cop_todo_spec.rb
@@ -3,7 +3,7 @@
require 'rubocop_spec_helper'
require_relative '../../rubocop/cop_todo'
-RSpec.describe RuboCop::CopTodo do
+RSpec.describe RuboCop::CopTodo, feature_category: :tooling do
let(:cop_name) { 'Cop/Rule' }
subject(:cop_todo) { described_class.new(cop_name) }
@@ -32,6 +32,19 @@ RSpec.describe RuboCop::CopTodo do
end
end
+ describe '#add_files' do
+ it 'adds files' do
+ cop_todo.add_files(%w[a.rb b.rb])
+ cop_todo.add_files(%w[a.rb])
+ cop_todo.add_files(%w[])
+
+ expect(cop_todo).to have_attributes(
+ files: contain_exactly('a.rb', 'b.rb'),
+ offense_count: 0
+ )
+ end
+ end
+
describe '#autocorrectable?' do
subject { cop_todo.autocorrectable? }
diff --git a/spec/rubocop/formatter/todo_formatter_spec.rb b/spec/rubocop/formatter/todo_formatter_spec.rb
index 5494d518605..55a64198289 100644
--- a/spec/rubocop/formatter/todo_formatter_spec.rb
+++ b/spec/rubocop/formatter/todo_formatter_spec.rb
@@ -1,4 +1,5 @@
# frozen_string_literal: true
+
# rubocop:disable RSpec/VerifiedDoubles
require 'fast_spec_helper'
@@ -10,7 +11,7 @@ require 'tmpdir'
require_relative '../../../rubocop/formatter/todo_formatter'
require_relative '../../../rubocop/todo_dir'
-RSpec.describe RuboCop::Formatter::TodoFormatter do
+RSpec.describe RuboCop::Formatter::TodoFormatter, feature_category: :tooling do
let(:stdout) { StringIO.new }
let(:tmp_dir) { Dir.mktmpdir }
let(:real_tmp_dir) { File.join(tmp_dir, 'real') }
@@ -97,6 +98,40 @@ RSpec.describe RuboCop::Formatter::TodoFormatter do
YAML
end
+ context 'with existing HAML exclusions' do
+ before do
+ todo_dir.write('B/TooManyOffenses', <<~YAML)
+ ---
+ B/TooManyOffenses:
+ Exclude:
+ - 'd.rb'
+ - 'app/views/project.html.haml.rb'
+ - 'app/views/project.haml.rb'
+ - 'app/views/project.text.haml.rb'
+ - 'app/views/unrelated.html.haml.rb.ext'
+ - 'app/views/unrelated.html.haml.ext'
+ - 'app/views/unrelated.html.haml'
+ YAML
+
+ todo_dir.inspect_all
+ end
+
+ it 'does not remove them' do
+ run_formatter
+
+ expect(todo_yml('B/TooManyOffenses')).to eq(<<~YAML)
+ ---
+ B/TooManyOffenses:
+ Exclude:
+ - 'a.rb'
+ - 'app/views/project.haml.rb'
+ - 'app/views/project.html.haml.rb'
+ - 'app/views/project.text.haml.rb'
+ - 'c.rb'
+ YAML
+ end
+ end
+
context 'when cop previously not explicitly disabled' do
before do
todo_dir.write('B/TooManyOffenses', <<~YAML)
@@ -105,6 +140,8 @@ RSpec.describe RuboCop::Formatter::TodoFormatter do
Exclude:
- 'x.rb'
YAML
+
+ todo_dir.inspect_all
end
it 'does not disable cop' do
@@ -158,6 +195,8 @@ RSpec.describe RuboCop::Formatter::TodoFormatter do
Exclude:
- 'x.rb'
YAML
+
+ todo_dir.inspect_all
end
it 'keeps cop disabled' do
diff --git a/spec/scripts/generate_failed_package_and_test_mr_message_spec.rb b/spec/scripts/generate_failed_package_and_test_mr_message_spec.rb
index 79e63c95f65..7aff33855aa 100644
--- a/spec/scripts/generate_failed_package_and_test_mr_message_spec.rb
+++ b/spec/scripts/generate_failed_package_and_test_mr_message_spec.rb
@@ -1,8 +1,8 @@
# frozen_string_literal: true
require 'fast_spec_helper'
+require 'gitlab/rspec/all'
require_relative '../../scripts/generate-failed-package-and-test-mr-message'
-require_relative '../support/helpers/stub_env'
RSpec.describe GenerateFailedPackageAndTestMrMessage, feature_category: :tooling do
include StubENV
diff --git a/spec/scripts/generate_message_to_run_e2e_pipeline_spec.rb b/spec/scripts/generate_message_to_run_e2e_pipeline_spec.rb
index aee16334003..61307937101 100644
--- a/spec/scripts/generate_message_to_run_e2e_pipeline_spec.rb
+++ b/spec/scripts/generate_message_to_run_e2e_pipeline_spec.rb
@@ -3,8 +3,8 @@
# rubocop:disable RSpec/VerifiedDoubles
require 'fast_spec_helper'
+require 'gitlab/rspec/all'
require_relative '../../scripts/generate-message-to-run-e2e-pipeline'
-require_relative '../support/helpers/stub_env'
RSpec.describe GenerateMessageToRunE2ePipeline, feature_category: :tooling do
include StubENV
diff --git a/spec/scripts/lib/glfm/update_example_snapshots_spec.rb b/spec/scripts/lib/glfm/update_example_snapshots_spec.rb
index 87b2c42c5b8..78ea31c8e39 100644
--- a/spec/scripts/lib/glfm/update_example_snapshots_spec.rb
+++ b/spec/scripts/lib/glfm/update_example_snapshots_spec.rb
@@ -312,7 +312,7 @@ RSpec.describe Glfm::UpdateExampleSnapshots, '#process', feature_category: :team
static: |-
<p>This is the manually modified static HTML which will be preserved</p>
wysiwyg: |-
- <p>This is the manually modified WYSIWYG HTML which will be preserved</p>
+ <p dir="auto">This is the manually modified WYSIWYG HTML which will be preserved</p>
YAML
end
@@ -631,33 +631,33 @@ RSpec.describe Glfm::UpdateExampleSnapshots, '#process', feature_category: :team
static: |-
<p data-sourcepos="1:1-1:8" dir="auto"><strong>bold</strong></p>
wysiwyg: |-
- <p><strong>bold</strong></p>
+ <p dir="auto"><strong>bold</strong></p>
02_01_00__inlines__strong__002:
canonical: |
<p><strong>bold with more text</strong></p>
static: |-
<p data-sourcepos="1:1-1:23" dir="auto"><strong>bold with more text</strong></p>
wysiwyg: |-
- <p><strong>bold with more text</strong></p>
+ <p dir="auto"><strong>bold with more text</strong></p>
02_03_00__inlines__strikethrough_extension__001:
canonical: |
<p><del>Hi</del> Hello, world!</p>
static: |-
<p data-sourcepos="1:1-1:20" dir="auto"><del>Hi</del> Hello, world!</p>
wysiwyg: |-
- <p><s>Hi</s> Hello, world!</p>
+ <p dir="auto"><s>Hi</s> Hello, world!</p>
03_01_00__first_gitlab_specific_section_with_examples__strong_but_with_two_asterisks__001:
canonical: |
<p><strong>bold</strong></p>
wysiwyg: |-
- <p><strong>bold</strong></p>
+ <p dir="auto"><strong>bold</strong></p>
03_02_01__first_gitlab_specific_section_with_examples__h2_which_contains_an_h3__example_in_an_h3__001:
canonical: |
<p>Example in an H3</p>
static: |-
<p data-sourcepos="1:1-1:16" dir="auto">Example in an H3</p>
wysiwyg: |-
- <p>Example in an H3</p>
+ <p dir="auto">Example in an H3</p>
04_01_00__second_gitlab_specific_section_with_examples__strong_but_with_html__001:
canonical: |
<p><strong>
@@ -673,42 +673,42 @@ RSpec.describe Glfm::UpdateExampleSnapshots, '#process', feature_category: :team
static: |-
<p>This is the manually modified static HTML which will be preserved</p>
wysiwyg: |-
- <p>This is the manually modified WYSIWYG HTML which will be preserved</p>
+ <p dir="auto">This is the manually modified WYSIWYG HTML which will be preserved</p>
06_01_00__api_request_overrides__group_upload_link__001:
canonical: |
<p><a href="groups-test-file">groups-test-file</a></p>
static: |-
<p data-sourcepos="1:1-1:45" dir="auto"><a href="/groups/glfm_group/-/uploads/groups-test-file" data-canonical-src="/uploads/groups-test-file" data-link="true" class="gfm">groups-test-file</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="/uploads/groups-test-file">groups-test-file</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="/uploads/groups-test-file">groups-test-file</a></p>
06_02_00__api_request_overrides__project_repo_link__001:
canonical: |
<p><a href="projects-test-file">projects-test-file</a></p>
static: |-
<p data-sourcepos="1:1-1:40" dir="auto"><a href="/glfm_group/glfm_project/-/blob/master/projects-test-file" class="gfm">projects-test-file</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="projects-test-file">projects-test-file</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="projects-test-file">projects-test-file</a></p>
06_03_00__api_request_overrides__project_snippet_ref__001:
canonical: |
<p>This project snippet ID reference IS filtered: <a href="/glfm_group/glfm_project/-/snippets/88888">$88888</a>
static: |-
<p data-sourcepos="1:1-1:53" dir="auto">This project snippet ID reference IS filtered: <a href="/glfm_group/glfm_project/-/snippets/88888" data-reference-type="snippet" data-original="$88888" data-link="false" data-link-reference="false" data-project="77777" data-snippet="88888" data-container="body" data-placement="top" title="glfm_project_snippet" class="gfm gfm-snippet has-tooltip">$88888</a></p>
wysiwyg: |-
- <p>This project snippet ID reference IS filtered: $88888</p>
+ <p dir="auto">This project snippet ID reference IS filtered: $88888</p>
06_04_00__api_request_overrides__personal_snippet_ref__001:
canonical: |
<p>This personal snippet ID reference is NOT filtered: $99999</p>
static: |-
<p data-sourcepos="1:1-1:58" dir="auto">This personal snippet ID reference is NOT filtered: $99999</p>
wysiwyg: |-
- <p>This personal snippet ID reference is NOT filtered: $99999</p>
+ <p dir="auto">This personal snippet ID reference is NOT filtered: $99999</p>
06_05_00__api_request_overrides__project_wiki_link__001:
canonical: |
<p><a href="project-wikis-test-file">project-wikis-test-file</a></p>
static: |-
<p data-sourcepos="1:1-1:50" dir="auto"><a href="/glfm_group/glfm_project/-/wikis/project-wikis-test-file" data-canonical-src="project-wikis-test-file">project-wikis-test-file</a></p>
wysiwyg: |-
- <p><a target="_blank" rel="noopener noreferrer nofollow" href="project-wikis-test-file">project-wikis-test-file</a></p>
+ <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="project-wikis-test-file">project-wikis-test-file</a></p>
YAML
end
diff --git a/spec/scripts/trigger-build_spec.rb b/spec/scripts/trigger-build_spec.rb
index 78cc57b6c91..3ac383e8d30 100644
--- a/spec/scripts/trigger-build_spec.rb
+++ b/spec/scripts/trigger-build_spec.rb
@@ -211,6 +211,7 @@ RSpec.describe Trigger, feature_category: :tooling do
context "when set in a file" do
before do
allow(File).to receive(:read).and_call_original
+ stub_env(version_file, nil)
end
it 'includes the version from the file' do
diff --git a/spec/serializers/context_commits_diff_entity_spec.rb b/spec/serializers/context_commits_diff_entity_spec.rb
index e8f38527f5b..9d74fbc9160 100644
--- a/spec/serializers/context_commits_diff_entity_spec.rb
+++ b/spec/serializers/context_commits_diff_entity_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe ContextCommitsDiffEntity do
let_it_be(:mrcc2) { create(:merge_request_context_commit, merge_request: merge_request, sha: "ae73cb07c9eeaf35924a10f713b364d32b2dd34f") }
context 'as json' do
- subject { ContextCommitsDiffEntity.represent(merge_request.context_commits_diff).as_json }
+ subject { described_class.represent(merge_request.context_commits_diff).as_json }
it 'exposes commits_count' do
expect(subject[:commits_count]).to eq(2)
diff --git a/spec/serializers/diff_viewer_entity_spec.rb b/spec/serializers/diff_viewer_entity_spec.rb
index 84d2bdceb78..7ee2f8ec12f 100644
--- a/spec/serializers/diff_viewer_entity_spec.rb
+++ b/spec/serializers/diff_viewer_entity_spec.rb
@@ -16,47 +16,27 @@ RSpec.describe DiffViewerEntity do
subject { described_class.new(viewer).as_json(options) }
- context 'when add_ignore_all_white_spaces is enabled' do
- before do
- stub_feature_flags(add_ignore_all_white_spaces: true)
- end
-
- it 'serializes diff file viewer' do
- expect(subject.with_indifferent_access).to match_schema('entities/diff_viewer')
- end
-
- it 'contains whitespace_only attribute' do
- expect(subject.with_indifferent_access).to include(:whitespace_only)
- end
-
- context 'when whitespace_only option is true' do
- let(:options) { { whitespace_only: true } }
+ it 'serializes diff file viewer' do
+ expect(subject.with_indifferent_access).to match_schema('entities/diff_viewer')
+ end
- it 'returns the whitespace_only attribute true' do
- expect(subject.with_indifferent_access[:whitespace_only]).to eq true
- end
- end
+ it 'contains whitespace_only attribute' do
+ expect(subject.with_indifferent_access).to include(:whitespace_only)
+ end
- context 'when whitespace_only option is false' do
- let(:options) { { whitespace_only: false } }
+ context 'when whitespace_only option is true' do
+ let(:options) { { whitespace_only: true } }
- it 'returns the whitespace_only attribute false' do
- expect(subject.with_indifferent_access[:whitespace_only]).to eq false
- end
+ it 'returns the whitespace_only attribute true' do
+ expect(subject.with_indifferent_access[:whitespace_only]).to eq true
end
end
- context 'when add_ignore_all_white_spaces is disabled ' do
- before do
- stub_feature_flags(add_ignore_all_white_spaces: false)
- end
-
- it 'serializes diff file viewer' do
- expect(subject.with_indifferent_access).to match_schema('entities/diff_viewer')
- end
+ context 'when whitespace_only option is false' do
+ let(:options) { { whitespace_only: false } }
- it 'does not contain whitespace_only attribute' do
- expect(subject.with_indifferent_access).not_to include(:whitespace_only)
+ it 'returns the whitespace_only attribute false' do
+ expect(subject.with_indifferent_access[:whitespace_only]).to eq false
end
end
end
diff --git a/spec/serializers/environment_entity_spec.rb b/spec/serializers/environment_entity_spec.rb
index c60bead12c2..551acd2860d 100644
--- a/spec/serializers/environment_entity_spec.rb
+++ b/spec/serializers/environment_entity_spec.rb
@@ -83,32 +83,6 @@ RSpec.describe EnvironmentEntity do
end
end
- context 'when metrics dashboard feature is available' do
- before do
- stub_feature_flags(remove_monitor_metrics: false)
- end
-
- context 'metrics disabled' do
- before do
- allow(environment).to receive(:has_metrics?).and_return(false)
- end
-
- it "doesn't expose metrics path" do
- expect(subject).not_to include(:metrics_path)
- end
- end
-
- context 'metrics enabled' do
- before do
- allow(environment).to receive(:has_metrics?).and_return(true)
- end
-
- it 'exposes metrics path' do
- expect(subject).to include(:metrics_path)
- end
- end
- end
-
it "doesn't expose metrics path" do
expect(subject).not_to include(:metrics_path)
end
diff --git a/spec/serializers/issue_sidebar_basic_entity_spec.rb b/spec/serializers/issue_sidebar_basic_entity_spec.rb
index d81d87f4060..ef80bcd5eb1 100644
--- a/spec/serializers/issue_sidebar_basic_entity_spec.rb
+++ b/spec/serializers/issue_sidebar_basic_entity_spec.rb
@@ -45,7 +45,6 @@ RSpec.describe IssueSidebarBasicEntity do
context 'for an incident issue' do
before do
issue.update!(
- issue_type: WorkItems::Type.base_types[:incident],
work_item_type: WorkItems::Type.default_by_type(:incident)
)
end
diff --git a/spec/serializers/lfs_file_lock_entity_spec.rb b/spec/serializers/lfs_file_lock_entity_spec.rb
index 5869941c920..d0ff6fb60af 100644
--- a/spec/serializers/lfs_file_lock_entity_spec.rb
+++ b/spec/serializers/lfs_file_lock_entity_spec.rb
@@ -16,6 +16,6 @@ RSpec.describe LfsFileLockEntity do
it 'exposes the owner info' do
expect(subject).to include(:owner)
- expect(subject[:owner][:name]).to eq(user.name)
+ expect(subject[:owner][:name]).to eq(user.username)
end
end
diff --git a/spec/serializers/merge_request_poll_widget_entity_spec.rb b/spec/serializers/merge_request_poll_widget_entity_spec.rb
index 726f35418a1..6b80609c348 100644
--- a/spec/serializers/merge_request_poll_widget_entity_spec.rb
+++ b/spec/serializers/merge_request_poll_widget_entity_spec.rb
@@ -60,7 +60,7 @@ RSpec.describe MergeRequestPollWidgetEntity do
end
end
- context 'when head pipeline is running' do
+ context 'when head pipeline is running', unless: Gitlab.ee? do
before do
create(:ci_pipeline, :running, project: project, ref: resource.source_branch, sha: resource.diff_head_sha)
resource.update_head_pipeline
diff --git a/spec/serializers/prometheus_alert_entity_spec.rb b/spec/serializers/prometheus_alert_entity_spec.rb
deleted file mode 100644
index 02da5a5bb88..00000000000
--- a/spec/serializers/prometheus_alert_entity_spec.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe PrometheusAlertEntity do
- let(:user) { build_stubbed(:user) }
- let(:prometheus_alert) { build_stubbed(:prometheus_alert) }
- let(:request) { double('prometheus_alert', current_user: user) }
- let(:entity) { described_class.new(prometheus_alert, request: request) }
-
- subject { entity.as_json }
-
- context 'when user can read prometheus alerts' do
- before do
- prometheus_alert.project.add_maintainer(user)
- end
-
- it 'exposes prometheus_alert attributes' do
- expect(subject).to include(:id, :title, :query, :operator, :threshold, :runbook_url)
- end
- end
-end
diff --git a/spec/serializers/stage_entity_spec.rb b/spec/serializers/stage_entity_spec.rb
index 5cb5724ebdc..fe8ee027245 100644
--- a/spec/serializers/stage_entity_spec.rb
+++ b/spec/serializers/stage_entity_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe StageEntity do
+RSpec.describe StageEntity, feature_category: :continuous_integration do
let(:pipeline) { create(:ci_pipeline) }
let(:request) { double('request') }
let(:user) { create(:user) }
@@ -76,8 +76,8 @@ RSpec.describe StageEntity do
context 'with a skipped stage ' do
let(:stage) { create(:ci_stage, status: 'skipped') }
- it 'contains play_all_manual' do
- expect(subject[:status][:action]).to be_present
+ it 'does not contain play_all_manual' do
+ expect(subject[:status][:action]).not_to be_present
end
end
diff --git a/spec/services/admin/plan_limits/update_service_spec.rb b/spec/services/admin/plan_limits/update_service_spec.rb
index 4a384b98299..718367fadc2 100644
--- a/spec/services/admin/plan_limits/update_service_spec.rb
+++ b/spec/services/admin/plan_limits/update_service_spec.rb
@@ -33,12 +33,10 @@ RSpec.describe Admin::PlanLimits::UpdateService, feature_category: :shared do
subject(:update_plan_limits) { described_class.new(params, current_user: user, plan: plan).execute }
context 'when current_user is an admin', :enable_admin_mode do
- context 'when the update is successful' do
- it 'updates all attributes' do
- expect_next_instance_of(described_class) do |instance|
- expect(instance).to receive(:parsed_params).and_call_original
- end
+ context 'when the update is successful', :freeze_time do
+ let(:current_timestamp) { Time.current.utc.to_i }
+ it 'updates all attributes' do
update_plan_limits
params.each do |key, value|
@@ -46,6 +44,22 @@ RSpec.describe Admin::PlanLimits::UpdateService, feature_category: :shared do
end
end
+ it 'logs the allowed attributes only' do
+ update_plan_limits
+
+ expect(limits.limits_history).to eq(
+ { "enforcement_limit" =>
+ [{ "user_id" => user.id, "username" => user.username,
+ "timestamp" => current_timestamp, "value" => 15 }],
+ "notification_limit" =>
+ [{ "user_id" => user.id, "username" => user.username,
+ "timestamp" => current_timestamp, "value" => 30 }],
+ "storage_size_limit" =>
+ [{ "user_id" => user.id, "username" => user.username,
+ "timestamp" => current_timestamp, "value" => 90 }] }
+ )
+ end
+
it 'returns success' do
response = update_plan_limits
diff --git a/spec/services/alert_management/alerts/todo/create_service_spec.rb b/spec/services/alert_management/alerts/todo/create_service_spec.rb
index fd81c0893ed..c883466cf25 100644
--- a/spec/services/alert_management/alerts/todo/create_service_spec.rb
+++ b/spec/services/alert_management/alerts/todo/create_service_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe AlertManagement::Alerts::Todo::CreateService, feature_category: :
let(:current_user) { user }
describe '#execute' do
- subject(:result) { AlertManagement::Alerts::Todo::CreateService.new(alert, current_user).execute }
+ subject(:result) { described_class.new(alert, current_user).execute }
shared_examples 'permissions error' do
it 'returns an error', :aggregate_failures do
diff --git a/spec/services/application_settings/update_service_spec.rb b/spec/services/application_settings/update_service_spec.rb
index 79d4fc67538..a05219a0a49 100644
--- a/spec/services/application_settings/update_service_spec.rb
+++ b/spec/services/application_settings/update_service_spec.rb
@@ -314,6 +314,15 @@ RSpec.describe ApplicationSettings::UpdateService do
end
end
+ context 'when default_branch_protection is updated' do
+ let(:expected) { ::Gitlab::Access::BranchProtection.protected_against_developer_pushes.stringify_keys }
+ let(:params) { { default_branch_protection: ::Gitlab::Access::PROTECTION_DEV_CAN_MERGE } }
+
+ it "updates default_branch_protection_defaults from the default_branch_protection param" do
+ expect { subject.execute }.to change { application_settings.default_branch_protection_defaults }.from({}).to(expected)
+ end
+ end
+
context 'when protected path settings are passed' do
let(:params) do
{
diff --git a/spec/services/auth/dependency_proxy_authentication_service_spec.rb b/spec/services/auth/dependency_proxy_authentication_service_spec.rb
index 8f92fbe272c..3ef9c8fc96e 100644
--- a/spec/services/auth/dependency_proxy_authentication_service_spec.rb
+++ b/spec/services/auth/dependency_proxy_authentication_service_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe Auth::DependencyProxyAuthenticationService, feature_category: :dependency_proxy do
let_it_be(:user) { create(:user) }
- let(:service) { Auth::DependencyProxyAuthenticationService.new(nil, user) }
+ let(:service) { described_class.new(nil, user) }
before do
stub_config(dependency_proxy: { enabled: true })
diff --git a/spec/services/auto_merge/merge_when_pipeline_succeeds_service_spec.rb b/spec/services/auto_merge/merge_when_pipeline_succeeds_service_spec.rb
index a0b22267960..79c931990bb 100644
--- a/spec/services/auto_merge/merge_when_pipeline_succeeds_service_spec.rb
+++ b/spec/services/auto_merge/merge_when_pipeline_succeeds_service_spec.rb
@@ -3,30 +3,7 @@
require 'spec_helper'
RSpec.describe AutoMerge::MergeWhenPipelineSucceedsService, feature_category: :code_review_workflow do
- let_it_be(:user) { create(:user) }
- let_it_be(:project) { create(:project, :repository) }
-
- let(:mr_merge_if_green_enabled) do
- create(:merge_request, merge_when_pipeline_succeeds: true, merge_user: user,
- source_branch: "master", target_branch: 'feature',
- source_project: project, target_project: project, state: "opened")
- end
-
- let(:pipeline) do
- create(:ci_pipeline, ref: mr_merge_if_green_enabled.source_branch, project: project)
- end
-
- let(:service) do
- described_class.new(project, user, commit_message: 'Awesome message')
- end
-
- before_all do
- project.add_maintainer(user)
- end
-
- before do
- allow(MergeWorker).to receive(:with_status).and_return(MergeWorker)
- end
+ include_context 'for auto_merge strategy context'
describe "#available_for?" do
subject { service.available_for?(mr_merge_if_green_enabled) }
@@ -64,152 +41,24 @@ RSpec.describe AutoMerge::MergeWhenPipelineSucceedsService, feature_category: :c
end
describe "#execute" do
- let(:merge_request) do
- create(:merge_request, target_project: project, source_project: project,
- source_branch: "feature", target_branch: 'master')
- end
-
- context 'first time enabling' do
- before do
- allow(merge_request)
- .to receive_messages(head_pipeline: pipeline, actual_head_pipeline: pipeline)
- expect(MailScheduler::NotificationServiceWorker).to receive(:perform_async).with('merge_when_pipeline_succeeds', merge_request, user).once
-
- service.execute(merge_request)
- end
-
- it 'sets the params, merge_user, and flag' do
- expect(merge_request).to be_valid
- expect(merge_request.merge_when_pipeline_succeeds).to be_truthy
- expect(merge_request.merge_params).to include 'commit_message' => 'Awesome message'
- expect(merge_request.merge_user).to be user
- expect(merge_request.auto_merge_strategy).to eq AutoMergeService::STRATEGY_MERGE_WHEN_PIPELINE_SUCCEEDS
- end
-
- it 'creates a system note' do
- pipeline = build(:ci_pipeline)
- allow(merge_request).to receive(:actual_head_pipeline) { pipeline }
-
- note = merge_request.notes.last
- expect(note.note).to match "enabled an automatic merge when the pipeline for #{pipeline.sha}"
- end
- end
-
- context 'already approved' do
- let(:service) { described_class.new(project, user, should_remove_source_branch: true) }
- let(:build) { create(:ci_build, ref: mr_merge_if_green_enabled.source_branch) }
-
- before do
- allow(mr_merge_if_green_enabled)
- .to receive_messages(head_pipeline: pipeline, actual_head_pipeline: pipeline)
-
- allow(mr_merge_if_green_enabled).to receive(:mergeable?)
- .and_return(true)
-
- allow(pipeline).to receive(:success?).and_return(true)
- end
-
- it 'updates the merge params' do
- expect(SystemNoteService).not_to receive(:merge_when_pipeline_succeeds)
- expect(MailScheduler::NotificationServiceWorker).not_to receive(:perform_async).with('merge_when_pipeline_succeeds', any_args)
-
- service.execute(mr_merge_if_green_enabled)
- expect(mr_merge_if_green_enabled.merge_params).to have_key('should_remove_source_branch')
+ it_behaves_like 'auto_merge service #execute', 'merge_when_pipeline_succeeds' do
+ let(:auto_merge_strategy) { AutoMergeService::STRATEGY_MERGE_WHEN_PIPELINE_SUCCEEDS }
+ let(:expected_note) do
+ "enabled an automatic merge when the pipeline for #{pipeline.sha}"
end
end
end
describe "#process" do
- let(:merge_request_ref) { mr_merge_if_green_enabled.source_branch }
- let(:merge_request_head) do
- project.commit(mr_merge_if_green_enabled.source_branch).id
- end
-
- context 'when triggered by pipeline with valid ref and sha' do
- let(:triggering_pipeline) do
- create(:ci_pipeline, project: project, ref: merge_request_ref,
- sha: merge_request_head, status: 'success',
- head_pipeline_of: mr_merge_if_green_enabled)
- end
-
- it "merges all merge requests with merge when the pipeline succeeds enabled" do
- allow(mr_merge_if_green_enabled)
- .to receive_messages(head_pipeline: triggering_pipeline, actual_head_pipeline: triggering_pipeline)
-
- expect(MergeWorker).to receive(:perform_async)
- service.process(mr_merge_if_green_enabled)
- end
- end
-
- context 'when triggered by an old pipeline' do
- let(:old_pipeline) do
- create(:ci_pipeline, project: project, ref: merge_request_ref,
- sha: '1234abcdef', status: 'success')
- end
-
- it 'does not merge request' do
- expect(MergeWorker).not_to receive(:perform_async)
- service.process(mr_merge_if_green_enabled)
- end
- end
-
- context 'when triggered by pipeline from a different branch' do
- let(:unrelated_pipeline) do
- create(:ci_pipeline, project: project, ref: 'feature',
- sha: merge_request_head, status: 'success')
- end
-
- it 'does not merge request' do
- expect(MergeWorker).not_to receive(:perform_async)
- service.process(mr_merge_if_green_enabled)
- end
- end
-
- context 'when pipeline is merge request pipeline' do
- let(:pipeline) do
- create(:ci_pipeline, :success,
- source: :merge_request_event,
- ref: mr_merge_if_green_enabled.merge_ref_path,
- merge_request: mr_merge_if_green_enabled,
- merge_requests_as_head_pipeline: [mr_merge_if_green_enabled])
- end
-
- it 'merges the associated merge request' do
- allow(mr_merge_if_green_enabled)
- .to receive_messages(head_pipeline: pipeline, actual_head_pipeline: pipeline)
-
- expect(MergeWorker).to receive(:perform_async)
- service.process(mr_merge_if_green_enabled)
- end
- end
+ it_behaves_like 'auto_merge service #process'
end
- describe "#cancel" do
- before do
- service.cancel(mr_merge_if_green_enabled)
- end
-
- it "resets all the pipeline succeeds params" do
- expect(mr_merge_if_green_enabled.merge_when_pipeline_succeeds).to be_falsey
- expect(mr_merge_if_green_enabled.merge_params).to eq({})
- expect(mr_merge_if_green_enabled.merge_user).to be nil
- end
-
- it 'posts a system note' do
- note = mr_merge_if_green_enabled.notes.last
- expect(note.note).to include 'canceled the automatic merge'
- end
+ describe '#cancel' do
+ it_behaves_like 'auto_merge service #cancel'
end
- describe "#abort" do
- before do
- service.abort(mr_merge_if_green_enabled, 'an error')
- end
-
- it 'posts a system note' do
- note = mr_merge_if_green_enabled.notes.last
- expect(note.note).to include 'aborted the automatic merge'
- end
+ describe '#abort' do
+ it_behaves_like 'auto_merge service #abort'
end
describe 'pipeline integration' do
diff --git a/spec/services/auto_merge_service_spec.rb b/spec/services/auto_merge_service_spec.rb
index 94f4b414dca..64473884b13 100644
--- a/spec/services/auto_merge_service_spec.rb
+++ b/spec/services/auto_merge_service_spec.rb
@@ -17,10 +17,11 @@ RSpec.describe AutoMergeService, feature_category: :code_review_workflow do
it 'returns all strategies in preference order' do
if Gitlab.ee?
- is_expected.to eq(
- [AutoMergeService::STRATEGY_MERGE_TRAIN,
+ is_expected.to contain_exactly(
+ AutoMergeService::STRATEGY_MERGE_TRAIN,
AutoMergeService::STRATEGY_ADD_TO_MERGE_TRAIN_WHEN_PIPELINE_SUCCEEDS,
- AutoMergeService::STRATEGY_MERGE_WHEN_PIPELINE_SUCCEEDS])
+ AutoMergeService::STRATEGY_MERGE_WHEN_CHECKS_PASS,
+ AutoMergeService::STRATEGY_MERGE_WHEN_PIPELINE_SUCCEEDS)
else
is_expected.to eq([AutoMergeService::STRATEGY_MERGE_WHEN_PIPELINE_SUCCEEDS])
end
@@ -74,11 +75,15 @@ RSpec.describe AutoMergeService, feature_category: :code_review_workflow do
merge_request.update_head_pipeline
end
- it 'returns preferred strategy' do
+ it 'returns preferred strategy', if: Gitlab.ee? do
+ is_expected.to eq('merge_when_checks_pass')
+ end
+
+ it 'returns preferred strategy', unless: Gitlab.ee? do
is_expected.to eq('merge_when_pipeline_succeeds')
end
- context 'when the head piipeline succeeded' do
+ context 'when the head pipeline succeeded' do
let(:pipeline_status) { :success }
it 'returns available strategies' do
@@ -142,7 +147,11 @@ RSpec.describe AutoMergeService, feature_category: :code_review_workflow do
context 'when strategy is not specified' do
let(:strategy) {}
- it 'chooses the most preferred strategy' do
+ it 'chooses the most preferred strategy', if: Gitlab.ee? do
+ is_expected.to eq(:merge_when_checks_pass)
+ end
+
+ it 'chooses the most preferred strategy', unless: Gitlab.ee? do
is_expected.to eq(:merge_when_pipeline_succeeds)
end
end
diff --git a/spec/services/award_emojis/add_service_spec.rb b/spec/services/award_emojis/add_service_spec.rb
index 99dbe6dc606..e90ea284f29 100644
--- a/spec/services/award_emojis/add_service_spec.rb
+++ b/spec/services/award_emojis/add_service_spec.rb
@@ -53,6 +53,12 @@ RSpec.describe AwardEmojis::AddService, feature_category: :team_planning do
expect(award.user).to eq(user)
end
+ it 'executes hooks' do
+ expect(service).to receive(:execute_hooks).with(kind_of(AwardEmoji), 'award')
+
+ service.execute
+ end
+
describe 'marking Todos as done' do
subject { service.execute }
diff --git a/spec/services/award_emojis/base_service_spec.rb b/spec/services/award_emojis/base_service_spec.rb
index f1ee4d1cfb8..0f67c619a48 100644
--- a/spec/services/award_emojis/base_service_spec.rb
+++ b/spec/services/award_emojis/base_service_spec.rb
@@ -3,15 +3,17 @@
require 'spec_helper'
RSpec.describe AwardEmojis::BaseService, feature_category: :team_planning do
- let(:awardable) { build(:note) }
- let(:current_user) { build(:user) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, group: group) }
+ let_it_be(:current_user) { create(:user) }
+ let_it_be_with_reload(:awardable) { create(:note, project: project) }
+
+ let(:emoji_name) { 'horse' }
describe '.initialize' do
subject { described_class }
it 'uses same emoji name if not an alias' do
- emoji_name = 'horse'
-
expect(subject.new(awardable, emoji_name, current_user).name).to eq(emoji_name)
end
@@ -22,4 +24,31 @@ RSpec.describe AwardEmojis::BaseService, feature_category: :team_planning do
expect(subject.new(awardable, emoji_alias, current_user).name).to eq(emoji_name)
end
end
+
+ describe '.execute_hooks' do
+ let(:award_emoji) { create(:award_emoji, awardable: awardable) }
+ let(:action) { 'award' }
+
+ subject { described_class.new(awardable, emoji_name, current_user) }
+
+ context 'with no emoji hooks configured' do
+ it 'does not build hook_data' do
+ expect(Gitlab::DataBuilder::Emoji).not_to receive(:build)
+ expect(award_emoji.awardable.project).not_to receive(:execute_hooks)
+
+ subject.execute_hooks(award_emoji, action)
+ end
+ end
+
+ context 'with emoji hooks configured' do
+ it 'builds hook_data and calls execute_hooks for project' do
+ hook_data = {}
+ create(:project_hook, project: project, emoji_events: true)
+ expect(Gitlab::DataBuilder::Emoji).to receive(:build).and_return(hook_data)
+ expect(award_emoji.awardable.project).to receive(:execute_hooks).with(hook_data, :emoji_hooks)
+
+ subject.execute_hooks(award_emoji, action)
+ end
+ end
+ end
end
diff --git a/spec/services/award_emojis/destroy_service_spec.rb b/spec/services/award_emojis/destroy_service_spec.rb
index 109bdbfa986..fbadee87f45 100644
--- a/spec/services/award_emojis/destroy_service_spec.rb
+++ b/spec/services/award_emojis/destroy_service_spec.rb
@@ -85,6 +85,12 @@ RSpec.describe AwardEmojis::DestroyService, feature_category: :team_planning do
expect(result[:award]).to eq(award_from_user)
expect(result[:award]).to be_destroyed
end
+
+ it 'executes hooks' do
+ expect(service).to receive(:execute_hooks).with(award_from_user, 'revoke')
+
+ service.execute
+ end
end
end
end
diff --git a/spec/services/boards/issues/list_service_spec.rb b/spec/services/boards/issues/list_service_spec.rb
index 4089e9e6da0..c9d00f61a90 100644
--- a/spec/services/boards/issues/list_service_spec.rb
+++ b/spec/services/boards/issues/list_service_spec.rb
@@ -20,10 +20,10 @@ RSpec.describe Boards::Issues::ListService, feature_category: :team_planning do
let_it_be(:p2) { create(:label, title: 'P2', project: project, priority: 2) }
let_it_be(:p3) { create(:label, title: 'P3', project: project, priority: 3) }
- let_it_be(:backlog) { create(:backlog_list, board: board) }
+ let_it_be(:backlog) { board.lists.backlog.first }
let_it_be(:list1) { create(:list, board: board, label: development, position: 0) }
let_it_be(:list2) { create(:list, board: board, label: testing, position: 1) }
- let_it_be(:closed) { create(:closed_list, board: board) }
+ let_it_be(:closed) { board.lists.closed.first }
let_it_be(:opened_issue1) { create(:labeled_issue, project: project, milestone: m1, title: 'Issue 1', labels: [bug]) }
let_it_be(:opened_issue2) { create(:labeled_issue, project: project, milestone: m2, title: 'Issue 2', labels: [p2]) }
@@ -109,10 +109,10 @@ RSpec.describe Boards::Issues::ListService, feature_category: :team_planning do
let(:p2_project1) { create(:label, title: 'P2_project1', project: project1, priority: 2) }
let(:p3_project1) { create(:label, title: 'P3_project1', project: project1, priority: 3) }
- let!(:backlog) { create(:backlog_list, board: board) }
+ let!(:backlog) { board.lists.backlog.first }
let!(:list1) { create(:list, board: board, label: development, position: 0) }
let!(:list2) { create(:list, board: board, label: testing, position: 1) }
- let!(:closed) { create(:closed_list, board: board) }
+ let!(:closed) { board.lists.closed.first }
let!(:opened_issue1) { create(:labeled_issue, project: project, milestone: m1, title: 'Issue 1', labels: [bug]) }
let!(:opened_issue2) { create(:labeled_issue, project: project, milestone: m2, title: 'Issue 2', labels: [p2, p2_project]) }
@@ -145,7 +145,6 @@ RSpec.describe Boards::Issues::ListService, feature_category: :team_planning do
context 'when the group is an ancestor' do
let(:parent) { create(:group) }
let(:group) { create(:group, parent: parent) }
- let!(:backlog) { create(:backlog_list, board: board) }
let(:board) { create(:board, group: parent) }
before do
@@ -161,7 +160,6 @@ RSpec.describe Boards::Issues::ListService, feature_category: :team_planning do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, :empty_repo) }
let_it_be(:board) { create(:board, project: project) }
- let_it_be(:backlog) { create(:backlog_list, board: board) }
let(:issue) { create(:issue, project: project, relative_position: nil) }
diff --git a/spec/services/boards/lists/list_service_spec.rb b/spec/services/boards/lists/list_service_spec.rb
index 90b705e05c3..97bd5e13454 100644
--- a/spec/services/boards/lists/list_service_spec.rb
+++ b/spec/services/boards/lists/list_service_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe Boards::Lists::ListService, feature_category: :team_planning do
RSpec.shared_examples 'FOSS lists only' do
context 'when board contains a non FOSS list' do
# This scenario may happen when there used to be an EE license and user downgraded
- let!(:backlog_list) { create_backlog_list(board) }
+ let_it_be(:backlog_list) { board.lists.backlog.first }
let_it_be(:milestone) { create(:milestone, group: group) }
let_it_be(:assignee_list) do
list = build(:list, board: board, user_id: user.id, list_type: List.list_types[:assignee], position: 0)
@@ -59,9 +59,5 @@ RSpec.describe Boards::Lists::ListService, feature_category: :team_planning do
it_behaves_like 'lists list service'
it_behaves_like 'FOSS lists only'
end
-
- def create_backlog_list(board)
- create(:backlog_list, board: board)
- end
end
end
diff --git a/spec/services/ci/create_pipeline_service/rules_spec.rb b/spec/services/ci/create_pipeline_service/rules_spec.rb
index 87112137675..a81d1487fab 100644
--- a/spec/services/ci/create_pipeline_service/rules_spec.rb
+++ b/spec/services/ci/create_pipeline_service/rules_spec.rb
@@ -452,42 +452,6 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes
expect(job4.needs).to contain_exactly(an_object_having_attributes(name: 'job3'))
end
end
-
- context 'when the FF introduce_rules_with_needs is disabled' do
- before do
- stub_feature_flags(introduce_rules_with_needs: false)
- end
-
- context 'when the `$var` rule matches' do
- it 'creates a pipeline without overridden needs' do
- expect(pipeline).to be_persisted
- expect(build_names).to contain_exactly('job1', 'job2', 'job3', 'job4')
-
- expect(job1.needs).to be_empty
- expect(job2.needs).to be_empty
- expect(job3.needs).to be_empty
- expect(job4.needs).to contain_exactly(an_object_having_attributes(name: 'job1'))
- end
- end
-
- context 'when the `$var` rule does not match' do
- let(:initialization_params) { base_initialization_params.merge(variables_attributes: variables_attributes) }
-
- let(:variables_attributes) do
- [{ key: 'var', secret_value: 'SOME_VAR' }]
- end
-
- it 'creates a pipeline without overridden needs' do
- expect(pipeline).to be_persisted
- expect(build_names).to contain_exactly('job1', 'job2', 'job3', 'job4')
-
- expect(job1.needs).to be_empty
- expect(job2.needs).to be_empty
- expect(job3.needs).to be_empty
- expect(job4.needs).to contain_exactly(an_object_having_attributes(name: 'job1'))
- end
- end
- end
end
end
diff --git a/spec/services/ci/create_pipeline_service_spec.rb b/spec/services/ci/create_pipeline_service_spec.rb
index f75c95c66f9..a28ede89cee 100644
--- a/spec/services/ci/create_pipeline_service_spec.rb
+++ b/spec/services/ci/create_pipeline_service_spec.rb
@@ -2035,7 +2035,7 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes
expect(pipeline).to be_persisted
expect(pipeline.yaml_errors)
- .to include 'content does not have a valid YAML syntax'
+ .to include 'mapping values are not allowed'
end
end
end
@@ -2172,7 +2172,7 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes
expect(pipeline).to be_persisted
expect(pipeline.yaml_errors)
- .to include 'content does not have a valid YAML syntax'
+ .to include 'mapping values are not allowed'
end
end
end
diff --git a/spec/services/ci/pipeline_processing/atomic_processing_service_spec.rb b/spec/services/ci/pipeline_processing/atomic_processing_service_spec.rb
index c43f1e5264e..15f2cc0990c 100644
--- a/spec/services/ci/pipeline_processing/atomic_processing_service_spec.rb
+++ b/spec/services/ci/pipeline_processing/atomic_processing_service_spec.rb
@@ -1094,34 +1094,6 @@ RSpec.describe Ci::PipelineProcessing::AtomicProcessingService, feature_category
process_pipeline
end
end
-
- context 'when FF `ci_reset_skipped_jobs_in_atomic_processing` is disabled' do
- before do
- stub_feature_flags(ci_reset_skipped_jobs_in_atomic_processing: false)
-
- process_pipeline # First pipeline processing
-
- # Change the manual jobs from stopped to alive status
- manual1.enqueue!
- manual2.enqueue!
-
- mock_play_jobs_during_processing([manual1, manual2])
- end
-
- it 'does not run ResetSkippedJobsService' do
- expect(Ci::ResetSkippedJobsService).not_to receive(:new)
-
- process_pipeline
-
- expect(all_builds_names_and_statuses).to eq(statuses_2)
- end
-
- it 'does not log event' do
- expect(Gitlab::AppJsonLogger).not_to receive(:info)
-
- process_pipeline
- end
- end
end
context 'when a bridge job has parallel:matrix config', :sidekiq_inline do
diff --git a/spec/services/ci/pipeline_processing/test_cases/dag_build_fails_test_skips_rollback_on_failure.yml b/spec/services/ci/pipeline_processing/test_cases/dag_build_fails_test_skips_rollback_on_failure.yml
new file mode 100644
index 00000000000..591e66304eb
--- /dev/null
+++ b/spec/services/ci/pipeline_processing/test_cases/dag_build_fails_test_skips_rollback_on_failure.yml
@@ -0,0 +1,47 @@
+config:
+ build:
+ stage: build
+ script: exit 1
+
+ test:
+ stage: test
+ script: exit 0
+
+ deploy:
+ stage: deploy
+ script: exit 0
+ needs: [build, test]
+
+ rollback:
+ stage: deploy
+ script: exit 0
+ when: on_failure
+ needs: [build, test]
+
+init:
+ expect:
+ pipeline: pending
+ stages:
+ build: pending
+ test: created
+ deploy: created
+ jobs:
+ build: pending
+ test: created
+ deploy: created
+ rollback: created
+
+transitions:
+ - event: drop
+ jobs: [build]
+ expect:
+ pipeline: failed
+ stages:
+ build: failed
+ test: skipped
+ deploy: skipped
+ jobs:
+ build: failed
+ test: skipped
+ deploy: skipped
+ rollback: skipped
diff --git a/spec/services/ci/pipeline_schedules/create_service_spec.rb b/spec/services/ci/pipeline_schedules/create_service_spec.rb
new file mode 100644
index 00000000000..a01c71432c3
--- /dev/null
+++ b/spec/services/ci/pipeline_schedules/create_service_spec.rb
@@ -0,0 +1,86 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Ci::PipelineSchedules::CreateService, feature_category: :continuous_integration do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:reporter) { create(:user) }
+ let_it_be(:project) { create(:project, :public, :repository) }
+
+ before_all do
+ project.add_maintainer(user)
+ project.add_reporter(reporter)
+ end
+
+ describe "execute" do
+ context 'when user does not have permission' do
+ subject(:service) { described_class.new(project, reporter, {}) }
+
+ it 'returns ServiceResponse.error' do
+ result = service.execute
+
+ expect(result).to be_a(ServiceResponse)
+ expect(result.error?).to be(true)
+
+ error_message = _('The current user is not authorized to create the pipeline schedule')
+ expect(result.message).to match_array([error_message])
+ expect(result.payload.errors).to match_array([error_message])
+ end
+ end
+
+ context 'when user has permission' do
+ let(:params) do
+ {
+ description: 'desc',
+ ref: 'patch-x',
+ active: false,
+ cron: '*/1 * * * *',
+ cron_timezone: 'UTC'
+ }
+ end
+
+ subject(:service) { described_class.new(project, user, params) }
+
+ it 'saves values with passed params' do
+ result = service.execute
+
+ expect(result.payload).to have_attributes(
+ description: 'desc',
+ ref: 'patch-x',
+ active: false,
+ cron: '*/1 * * * *',
+ cron_timezone: 'UTC'
+ )
+ end
+
+ it 'returns ServiceResponse.success' do
+ result = service.execute
+
+ expect(result).to be_a(ServiceResponse)
+ expect(result.success?).to be(true)
+ end
+
+ context 'when schedule save fails' do
+ subject(:service) { described_class.new(project, user, {}) }
+
+ before do
+ errors = ActiveModel::Errors.new(project)
+ errors.add(:base, 'An error occurred')
+
+ allow_next_instance_of(Ci::PipelineSchedule) do |instance|
+ allow(instance).to receive(:save).and_return(false)
+ allow(instance).to receive(:errors).and_return(errors)
+ end
+ end
+
+ it 'returns ServiceResponse.error' do
+ result = service.execute
+
+ expect(result).to be_a(ServiceResponse)
+ expect(result.error?).to be(true)
+ expect(result.message).to match_array(['An error occurred'])
+ end
+ end
+ end
+ end
+end
diff --git a/spec/services/ci/pipeline_schedules/update_service_spec.rb b/spec/services/ci/pipeline_schedules/update_service_spec.rb
index 838f49f6dea..c31a652ed93 100644
--- a/spec/services/ci/pipeline_schedules/update_service_spec.rb
+++ b/spec/services/ci/pipeline_schedules/update_service_spec.rb
@@ -8,9 +8,16 @@ RSpec.describe Ci::PipelineSchedules::UpdateService, feature_category: :continuo
let_it_be(:project) { create(:project, :public, :repository) }
let_it_be(:pipeline_schedule) { create(:ci_pipeline_schedule, project: project, owner: user) }
+ let_it_be(:pipeline_schedule_variable) do
+ create(:ci_pipeline_schedule_variable,
+ key: 'foo', value: 'foovalue', pipeline_schedule: pipeline_schedule)
+ end
+
before_all do
project.add_maintainer(user)
project.add_reporter(reporter)
+
+ pipeline_schedule.reload
end
describe "execute" do
@@ -22,7 +29,10 @@ RSpec.describe Ci::PipelineSchedules::UpdateService, feature_category: :continuo
expect(result).to be_a(ServiceResponse)
expect(result.error?).to be(true)
- expect(result.message).to eq(_('The current user is not authorized to update the pipeline schedule'))
+
+ error_message = _('The current user is not authorized to update the pipeline schedule')
+ expect(result.message).to match_array([error_message])
+ expect(pipeline_schedule.errors).to match_array([error_message])
end
end
@@ -32,7 +42,10 @@ RSpec.describe Ci::PipelineSchedules::UpdateService, feature_category: :continuo
description: 'updated_desc',
ref: 'patch-x',
active: false,
- cron: '*/1 * * * *'
+ cron: '*/1 * * * *',
+ variables_attributes: [
+ { id: pipeline_schedule_variable.id, key: 'bar', secret_value: 'barvalue' }
+ ]
}
end
@@ -44,6 +57,42 @@ RSpec.describe Ci::PipelineSchedules::UpdateService, feature_category: :continuo
.and change { pipeline_schedule.ref }.from('master').to('patch-x')
.and change { pipeline_schedule.active }.from(true).to(false)
.and change { pipeline_schedule.cron }.from('0 1 * * *').to('*/1 * * * *')
+ .and change { pipeline_schedule.variables.last.key }.from('foo').to('bar')
+ .and change { pipeline_schedule.variables.last.value }.from('foovalue').to('barvalue')
+ end
+
+ context 'when creating a variable' do
+ let(:params) do
+ {
+ variables_attributes: [
+ { key: 'ABC', secret_value: 'ABC123' }
+ ]
+ }
+ end
+
+ it 'creates the new variable' do
+ expect { service.execute }.to change { Ci::PipelineScheduleVariable.count }.by(1)
+
+ expect(pipeline_schedule.variables.last.key).to eq('ABC')
+ expect(pipeline_schedule.variables.last.value).to eq('ABC123')
+ end
+ end
+
+ context 'when deleting a variable' do
+ let(:params) do
+ {
+ variables_attributes: [
+ {
+ id: pipeline_schedule_variable.id,
+ _destroy: true
+ }
+ ]
+ }
+ end
+
+ it 'deletes the existing variable' do
+ expect { service.execute }.to change { Ci::PipelineScheduleVariable.count }.by(-1)
+ end
end
it 'returns ServiceResponse.success' do
@@ -58,7 +107,7 @@ RSpec.describe Ci::PipelineSchedules::UpdateService, feature_category: :continuo
subject(:service) { described_class.new(pipeline_schedule, user, {}) }
before do
- allow(pipeline_schedule).to receive(:update).and_return(false)
+ allow(pipeline_schedule).to receive(:save).and_return(false)
errors = ActiveModel::Errors.new(pipeline_schedule)
errors.add(:base, 'An error occurred')
diff --git a/spec/services/ci/pipeline_trigger_service_spec.rb b/spec/services/ci/pipeline_trigger_service_spec.rb
index b6e07e82bb5..fbd1a765351 100644
--- a/spec/services/ci/pipeline_trigger_service_spec.rb
+++ b/spec/services/ci/pipeline_trigger_service_spec.rb
@@ -23,8 +23,8 @@ RSpec.describe Ci::PipelineTriggerService, feature_category: :continuous_integra
shared_examples 'detecting an unprocessable pipeline trigger' do
context 'when the pipeline was not created successfully' do
let(:fail_pipeline) do
- receive(:execute).and_wrap_original do |original, *args|
- response = original.call(*args)
+ receive(:execute).and_wrap_original do |original, *args, **kwargs|
+ response = original.call(*args, **kwargs)
pipeline = response.payload
pipeline.update!(failure_reason: 'unknown_failure')
diff --git a/spec/services/ci/process_sync_events_service_spec.rb b/spec/services/ci/process_sync_events_service_spec.rb
index 84b6d7d96f6..ff9bcd0f8e9 100644
--- a/spec/services/ci/process_sync_events_service_spec.rb
+++ b/spec/services/ci/process_sync_events_service_spec.rb
@@ -145,9 +145,9 @@ RSpec.describe Ci::ProcessSyncEventsService, feature_category: :continuous_integ
end
end
- context 'when the FFs use_traversal_ids and use_traversal_ids_for_ancestors are disabled' do
+ context 'when the use_traversal_ids FF is disabled' do
before do
- stub_feature_flags(use_traversal_ids: false, use_traversal_ids_for_ancestors: false)
+ stub_feature_flags(use_traversal_ids: false)
end
it_behaves_like 'event consuming'
diff --git a/spec/services/ci/register_job_service_spec.rb b/spec/services/ci/register_job_service_spec.rb
index 6fb61bb3ec5..61fec82c688 100644
--- a/spec/services/ci/register_job_service_spec.rb
+++ b/spec/services/ci/register_job_service_spec.rb
@@ -417,8 +417,8 @@ module Ci
context 'when first build is stalled' do
before do
- allow_any_instance_of(Ci::RegisterJobService).to receive(:assign_runner!).and_call_original
- allow_any_instance_of(Ci::RegisterJobService).to receive(:assign_runner!)
+ allow_any_instance_of(described_class).to receive(:assign_runner!).and_call_original
+ allow_any_instance_of(described_class).to receive(:assign_runner!)
.with(pending_job, anything).and_raise(ActiveRecord::StaleObjectError)
end
diff --git a/spec/services/ci/runners/register_runner_service_spec.rb b/spec/services/ci/runners/register_runner_service_spec.rb
index b5921773364..7252763c13e 100644
--- a/spec/services/ci/runners/register_runner_service_spec.rb
+++ b/spec/services/ci/runners/register_runner_service_spec.rb
@@ -173,7 +173,7 @@ RSpec.describe ::Ci::Runners::RegisterRunnerService, '#execute', feature_categor
expect(runner).to be_an_instance_of(::Ci::Runner)
expect(runner.persisted?).to be_falsey
expect(runner.errors.messages).to eq(
- 'runner_projects.base': ['Maximum number of ci registered project runners (1) exceeded']
+ runner_projects: ['Maximum number of ci registered project runners (1) exceeded']
)
expect(project.runners.reload.size).to eq(1)
end
@@ -252,7 +252,7 @@ RSpec.describe ::Ci::Runners::RegisterRunnerService, '#execute', feature_categor
expect(runner).to be_an_instance_of(::Ci::Runner)
expect(runner.persisted?).to be_falsey
expect(runner.errors.messages).to eq(
- 'runner_namespaces.base': ['Maximum number of ci registered group runners (1) exceeded']
+ runner_namespaces: ['Maximum number of ci registered group runners (1) exceeded']
)
expect(group.runners.reload.size).to eq(1)
end
diff --git a/spec/services/clusters/agent_tokens/create_service_spec.rb b/spec/services/clusters/agent_tokens/create_service_spec.rb
index 431d7ce2079..fde39b1099e 100644
--- a/spec/services/clusters/agent_tokens/create_service_spec.rb
+++ b/spec/services/clusters/agent_tokens/create_service_spec.rb
@@ -89,21 +89,6 @@ RSpec.describe Clusters::AgentTokens::CreateService, feature_category: :deployme
expect(subject.status).to eq(:error)
expect(subject.message).to eq('An agent can have only two active tokens at a time')
end
-
- context 'when cluster_agents_limit_tokens_created feature flag is disabled' do
- before do
- stub_feature_flags(cluster_agents_limit_tokens_created: false)
- end
-
- it 'creates a new token' do
- expect { subject }.to change { ::Clusters::AgentToken.count }.by(1)
- end
-
- it 'returns success status', :aggregate_failures do
- expect(subject.status).to eq(:success)
- expect(subject.message).to be_nil
- end
- end
end
end
end
diff --git a/spec/services/clusters/agents/authorize_proxy_user_service_spec.rb b/spec/services/clusters/agents/authorize_proxy_user_service_spec.rb
index 2d6c79c5cb3..b1e28c903f4 100644
--- a/spec/services/clusters/agents/authorize_proxy_user_service_spec.rb
+++ b/spec/services/clusters/agents/authorize_proxy_user_service_spec.rb
@@ -31,6 +31,8 @@ RSpec.describe Clusters::Agents::AuthorizeProxyUserService, feature_category: :d
it 'returns forbidden when user has no access to any project', :aggregate_failures do
expect(service_response).to be_error
expect(service_response.reason).to eq :forbidden
+ expect(service_response.message)
+ .to eq 'You must be a member of `projects` or `groups` under the `user_access` keyword.'
end
context 'when user is member of an authorized group' do
@@ -45,6 +47,8 @@ RSpec.describe Clusters::Agents::AuthorizeProxyUserService, feature_category: :d
deployment_group.add_member(user, :reporter)
expect(service_response).to be_error
expect(service_response.reason).to eq :forbidden
+ expect(service_response.message)
+ .to eq 'You must be a member of `projects` or `groups` under the `user_access` keyword.'
end
end
@@ -60,6 +64,18 @@ RSpec.describe Clusters::Agents::AuthorizeProxyUserService, feature_category: :d
deployment_project.add_member(user, :reporter)
expect(service_response).to be_error
expect(service_response.reason).to eq :forbidden
+ expect(service_response.message)
+ .to eq 'You must be a member of `projects` or `groups` under the `user_access` keyword.'
+ end
+ end
+
+ context 'when config is empty' do
+ let(:user_access_config) { {} }
+
+ it 'returns an error', :aggregate_failures do
+ expect(service_response).to be_error
+ expect(service_response.reason).to eq :forbidden
+ expect(service_response.message).to eq '`user_access` keyword is not found in agent config file.'
end
end
end
diff --git a/spec/services/clusters/integrations/prometheus_health_check_service_spec.rb b/spec/services/clusters/integrations/prometheus_health_check_service_spec.rb
deleted file mode 100644
index 9390d4b368b..00000000000
--- a/spec/services/clusters/integrations/prometheus_health_check_service_spec.rb
+++ /dev/null
@@ -1,115 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Clusters::Integrations::PrometheusHealthCheckService, '#execute', feature_category: :deployment_management do
- let(:service) { described_class.new(cluster) }
-
- subject { service.execute }
-
- RSpec.shared_examples 'no alert' do
- it 'does not send alert' do
- expect(Projects::Alerting::NotifyService).not_to receive(:new)
-
- subject
- end
- end
-
- RSpec.shared_examples 'sends alert' do
- it 'sends an alert' do
- expect_next_instance_of(Projects::Alerting::NotifyService) do |notify_service|
- expect(notify_service).to receive(:execute).with(integration.token, integration)
- end
-
- subject
- end
- end
-
- RSpec.shared_examples 'correct health stored' do
- it 'stores the correct health of prometheus' do
- subject
-
- expect(prometheus.healthy?).to eq(client_healthy)
- end
- end
-
- context 'when cluster is not project_type' do
- let(:cluster) { create(:cluster, :instance) }
-
- it { expect { subject }.to raise_error(RuntimeError, 'Invalid cluster type. Only project types are allowed.') }
- end
-
- context 'when cluster is project_type' do
- let_it_be(:project) { create(:project) }
- let_it_be(:integration) { create(:alert_management_http_integration, project: project) }
-
- let(:previous_health_status) { :healthy }
- let(:prometheus) { create(:clusters_integrations_prometheus, enabled: prometheus_enabled, health_status: previous_health_status) }
- let(:cluster) { create(:cluster, :project, integration_prometheus: prometheus, projects: [project]) }
-
- context 'when prometheus not enabled' do
- let(:prometheus_enabled) { false }
-
- it { expect(subject).to eq(nil) }
-
- include_examples 'no alert'
- end
-
- context 'when prometheus enabled' do
- let(:prometheus_enabled) { true }
-
- before do
- client = instance_double('Gitlab::PrometheusClient', healthy?: client_healthy)
- expect(prometheus).to receive(:prometheus_client).and_return(client)
- end
-
- context 'when newly unhealthy' do
- let(:previous_health_status) { :healthy }
- let(:client_healthy) { false }
-
- include_examples 'sends alert'
- include_examples 'correct health stored'
- end
-
- context 'when newly healthy' do
- let(:previous_health_status) { :unhealthy }
- let(:client_healthy) { true }
-
- include_examples 'no alert'
- include_examples 'correct health stored'
- end
-
- context 'when continuously unhealthy' do
- let(:previous_health_status) { :unhealthy }
- let(:client_healthy) { false }
-
- include_examples 'no alert'
- include_examples 'correct health stored'
- end
-
- context 'when continuously healthy' do
- let(:previous_health_status) { :healthy }
- let(:client_healthy) { true }
-
- include_examples 'no alert'
- include_examples 'correct health stored'
- end
-
- context 'when first health check and healthy' do
- let(:previous_health_status) { :unknown }
- let(:client_healthy) { true }
-
- include_examples 'no alert'
- include_examples 'correct health stored'
- end
-
- context 'when first health check and not healthy' do
- let(:previous_health_status) { :unknown }
- let(:client_healthy) { false }
-
- include_examples 'sends alert'
- include_examples 'correct health stored'
- end
- end
- end
-end
diff --git a/spec/services/design_management/generate_image_versions_service_spec.rb b/spec/services/design_management/generate_image_versions_service_spec.rb
index 08442f221fa..d02d472f897 100644
--- a/spec/services/design_management/generate_image_versions_service_spec.rb
+++ b/spec/services/design_management/generate_image_versions_service_spec.rb
@@ -15,7 +15,7 @@ RSpec.describe DesignManagement::GenerateImageVersionsService, feature_category:
.from(nil).to(CarrierWave::SanitizedFile)
end
- it 'skips generating image versions if the mime type is not whitelisted' do
+ it 'skips generating image versions if the mime type is not allowlisted' do
stub_const('DesignManagement::DesignV432x230Uploader::MIME_TYPE_ALLOWLIST', [])
described_class.new(version).execute
diff --git a/spec/services/draft_notes/create_service_spec.rb b/spec/services/draft_notes/create_service_spec.rb
index 93731a80dcc..6288579025f 100644
--- a/spec/services/draft_notes/create_service_spec.rb
+++ b/spec/services/draft_notes/create_service_spec.rb
@@ -108,4 +108,18 @@ RSpec.describe DraftNotes::CreateService, feature_category: :code_review_workflo
end
end
end
+
+ context 'when the draft note is invalid' do
+ before do
+ allow_next_instance_of(DraftNote) do |draft|
+ allow(draft).to receive(:valid?).and_return(false)
+ end
+ end
+
+ it 'does not create the note' do
+ draft_note = create_draft(note: 'invalid note')
+
+ expect(draft_note).not_to be_persisted
+ end
+ end
end
diff --git a/spec/services/environments/create_service_spec.rb b/spec/services/environments/create_service_spec.rb
index d7fdfd2a38e..c7d32f9111a 100644
--- a/spec/services/environments/create_service_spec.rb
+++ b/spec/services/environments/create_service_spec.rb
@@ -14,7 +14,7 @@ RSpec.describe Environments::CreateService, feature_category: :environment_manag
describe '#execute' do
subject { service.execute }
- let(:params) { { name: 'production', external_url: 'https://gitlab.com', tier: :production } }
+ let(:params) { { name: 'production', external_url: 'https://gitlab.com', tier: :production, kubernetes_namespace: 'default' } }
it 'creates an environment' do
expect { subject }.to change { ::Environment.count }.by(1)
@@ -27,6 +27,7 @@ RSpec.describe Environments::CreateService, feature_category: :environment_manag
expect(response.payload[:environment].name).to eq('production')
expect(response.payload[:environment].external_url).to eq('https://gitlab.com')
expect(response.payload[:environment].tier).to eq('production')
+ expect(response.payload[:environment].kubernetes_namespace).to eq('default')
end
context 'with a cluster agent' do
diff --git a/spec/services/environments/update_service_spec.rb b/spec/services/environments/update_service_spec.rb
index 84220c0930b..808d6340314 100644
--- a/spec/services/environments/update_service_spec.rb
+++ b/spec/services/environments/update_service_spec.rb
@@ -28,6 +28,21 @@ RSpec.describe Environments::UpdateService, feature_category: :environment_manag
expect(response.payload[:environment]).to eq(environment)
end
+ context 'when setting a kubernetes namespace to the environment' do
+ let(:params) { { kubernetes_namespace: 'default' } }
+
+ it 'updates the kubernetes namespace' do
+ expect { subject }.to change { environment.reload.kubernetes_namespace }.to('default')
+ end
+
+ it 'returns successful response' do
+ response = subject
+
+ expect(response).to be_success
+ expect(response.payload[:environment]).to eq(environment)
+ end
+ end
+
context 'when setting a cluster agent to the environment' do
let_it_be(:agent_management_project) { create(:project) }
let_it_be(:cluster_agent) { create(:cluster_agent, project: agent_management_project) }
diff --git a/spec/services/error_tracking/issue_details_service_spec.rb b/spec/services/error_tracking/issue_details_service_spec.rb
index 7ac41ffead6..b1c963e2487 100644
--- a/spec/services/error_tracking/issue_details_service_spec.rb
+++ b/spec/services/error_tracking/issue_details_service_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe ErrorTracking::IssueDetailsService, feature_category: :error_tracking do
include_context 'sentry error tracking context'
- subject { described_class.new(project, user, params) }
+ subject(:service) { described_class.new(project, user, params) }
describe '#execute' do
context 'with authorized user' do
@@ -41,26 +41,41 @@ RSpec.describe ErrorTracking::IssueDetailsService, feature_category: :error_trac
include_examples 'error tracking service http status handling', :issue_details
context 'with integrated error tracking' do
- let_it_be(:error) { create(:error_tracking_error, project: project) }
-
- let(:params) { { issue_id: error.id } }
+ let(:error_repository) { instance_double(Gitlab::ErrorTracking::ErrorRepository) }
+ let(:params) { { issue_id: issue_id } }
before do
error_tracking_setting.update!(integrated: true)
+
+ allow(service).to receive(:error_repository).and_return(error_repository)
end
- it 'returns the error in detailed format' do
- expect(result[:status]).to eq(:success)
- expect(result[:issue].to_json).to eq(error.to_sentry_detailed_error.to_json)
+ context 'when error is found' do
+ let(:error) { build_stubbed(:error_tracking_open_api_error, project_id: project.id) }
+ let(:issue_id) { error.fingerprint }
+
+ before do
+ allow(error_repository).to receive(:find_error).with(issue_id).and_return(error)
+ end
+
+ it 'returns the error in detailed format' do
+ expect(result[:status]).to eq(:success)
+ expect(result[:issue]).to eq(error)
+ end
end
context 'when error does not exist' do
- let(:params) { { issue_id: non_existing_record_id } }
+ let(:issue_id) { non_existing_record_id }
+
+ before do
+ allow(error_repository).to receive(:find_error).with(issue_id)
+ .and_raise(Gitlab::ErrorTracking::ErrorRepository::DatabaseError.new('Error not found'))
+ end
it 'returns the error in detailed format' do
expect(result).to match(
status: :error,
- message: /Couldn't find ErrorTracking::Error/,
+ message: /Error not found/,
http_status: :bad_request
)
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 bfde14c7ef1..7e0e8dd56a0 100644
--- a/spec/services/error_tracking/issue_latest_event_service_spec.rb
+++ b/spec/services/error_tracking/issue_latest_event_service_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe ErrorTracking::IssueLatestEventService, feature_category: :error_
let(:params) { {} }
- subject { described_class.new(project, user, params) }
+ subject(:service) { described_class.new(project, user, params) }
describe '#execute' do
context 'with authorized user' do
@@ -29,27 +29,42 @@ RSpec.describe ErrorTracking::IssueLatestEventService, feature_category: :error_
include_examples 'error tracking service http status handling', :issue_latest_event
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) }
-
- let(:params) { { issue_id: error.id } }
+ let(:error_repository) { instance_double(Gitlab::ErrorTracking::ErrorRepository) }
+ let(:params) { { issue_id: issue_id } }
before do
error_tracking_setting.update!(integrated: true)
+
+ allow(service).to receive(:error_repository).and_return(error_repository)
end
- it 'returns the latest event in expected format' do
- expect(result[:status]).to eq(:success)
- expect(result[:latest_event].to_json).to eq(event.to_sentry_error_event.to_json)
+ context 'when error is found' do
+ let(:error) { build_stubbed(:error_tracking_open_api_error, project_id: project.id) }
+ let(:event) { build_stubbed(:error_tracking_open_api_error_event, fingerprint: error.fingerprint) }
+ let(:issue_id) { error.fingerprint }
+
+ before do
+ allow(error_repository).to receive(:last_event_for).with(issue_id).and_return(event)
+ end
+
+ it 'returns the latest event in expected format' do
+ expect(result[:status]).to eq(:success)
+ expect(result[:latest_event]).to eq(event)
+ end
end
context 'when error does not exist' do
- let(:params) { { issue_id: non_existing_record_id } }
+ let(:issue_id) { non_existing_record_id }
+
+ before do
+ allow(error_repository).to receive(:last_event_for).with(issue_id)
+ .and_raise(Gitlab::ErrorTracking::ErrorRepository::DatabaseError.new('Error not found'))
+ end
it 'returns the error in detailed format' do
expect(result).to match(
status: :error,
- message: /Couldn't find ErrorTracking::Error/,
+ message: /Error not found/,
http_status: :bad_request
)
end
diff --git a/spec/services/error_tracking/issue_update_service_spec.rb b/spec/services/error_tracking/issue_update_service_spec.rb
index 4dae6cc2fa0..989ebc86abe 100644
--- a/spec/services/error_tracking/issue_update_service_spec.rb
+++ b/spec/services/error_tracking/issue_update_service_spec.rb
@@ -113,17 +113,45 @@ RSpec.describe ErrorTracking::IssueUpdateService, feature_category: :error_track
include_examples 'error tracking service sentry error handling', :update_issue
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 } }
+ let(:error_repository) { instance_double(Gitlab::ErrorTracking::ErrorRepository) }
+ let(:error) { build_stubbed(:error_tracking_open_api_error, project_id: project.id) }
+ let(:issue_id) { error.fingerprint }
+ let(:arguments) { { issue_id: issue_id, status: 'resolved' } }
before do
error_tracking_setting.update!(integrated: true)
+
+ allow(update_service).to receive(:error_repository).and_return(error_repository)
+ allow(error_repository).to receive(:update_error)
+ .with(issue_id, status: 'resolved').and_return(updated)
end
- it 'resolves the error and responds with expected format' do
- expect(update_service.execute).to eq(update_issue_response)
- expect(error.reload.status).to eq('resolved')
+ context 'when update succeeded' do
+ let(:updated) { true }
+
+ it 'returns success with updated true' do
+ expect(project.error_tracking_setting).to receive(:expire_issues_cache)
+
+ expect(update_service.execute).to eq(
+ status: :success,
+ updated: true,
+ closed_issue_iid: nil
+ )
+ end
+ end
+
+ context 'when update failed' do
+ let(:updated) { false }
+
+ it 'returns success with updated false' do
+ expect(project.error_tracking_setting).to receive(:expire_issues_cache)
+
+ expect(update_service.execute).to eq(
+ status: :success,
+ updated: false,
+ closed_issue_iid: nil
+ )
+ end
end
end
end
diff --git a/spec/services/error_tracking/list_issues_service_spec.rb b/spec/services/error_tracking/list_issues_service_spec.rb
index 2c35c2b8acd..5a6e9b56f6c 100644
--- a/spec/services/error_tracking/list_issues_service_spec.rb
+++ b/spec/services/error_tracking/list_issues_service_spec.rb
@@ -7,10 +7,10 @@ RSpec.describe ErrorTracking::ListIssuesService, feature_category: :error_tracki
let(:params) { {} }
- subject { described_class.new(project, user, params) }
+ subject(:service) { described_class.new(project, user, params) }
describe '#execute' do
- context 'Sentry backend' do
+ context 'with Sentry backend' do
let(:params) { { search_term: 'something', sort: 'last_seen', cursor: 'some-cursor' } }
let(:list_sentry_issues_args) do
@@ -42,7 +42,7 @@ RSpec.describe ErrorTracking::ListIssuesService, feature_category: :error_tracki
expect(result).to eq(status: :success, pagination: {}, issues: issues)
end
- it 'returns bad request for an issue_status not on the whitelist' do
+ it 'returns bad request with invalid issue_status' do
params[:issue_status] = 'assigned'
expect(error_tracking_setting).not_to receive(:list_sentry_issues)
@@ -65,22 +65,84 @@ RSpec.describe ErrorTracking::ListIssuesService, feature_category: :error_tracki
end
end
- context 'GitLab backend' do
- let_it_be(:error1) { create(:error_tracking_error, name: 'foo', project: project) }
- let_it_be(:error2) { create(:error_tracking_error, name: 'bar', project: project) }
+ context 'with integrated error tracking' do
+ let(:error_repository) { instance_double(Gitlab::ErrorTracking::ErrorRepository) }
+ let(:errors) { [] }
+ let(:pagination) { Gitlab::ErrorTracking::ErrorRepository::Pagination.new(nil, nil) }
+ let(:opts) { default_opts }
- let(:params) { { limit: '1' } }
+ let(:default_opts) do
+ {
+ filters: { status: described_class::DEFAULT_ISSUE_STATUS },
+ query: nil,
+ sort: described_class::DEFAULT_SORT,
+ limit: described_class::DEFAULT_LIMIT,
+ cursor: nil
+ }
+ end
+
+ let(:params) { {} }
before do
error_tracking_setting.update!(integrated: true)
+
+ allow(service).to receive(:error_repository).and_return(error_repository)
end
- it 'returns the error in expected format' do
- expect(result[:status]).to eq(:success)
- expect(result[:issues].size).to eq(1)
- expect(result[:issues].first.to_json).to eq(error2.to_sentry_error.to_json)
- expect(result[:pagination][:next][:cursor]).to be_present
- expect(result[:pagination][:previous]).to be_nil
+ context 'when errors are found' do
+ let(:error) { build_stubbed(:error_tracking_open_api_error, project_id: project.id) }
+ let(:errors) { [error] }
+
+ before do
+ allow(error_repository).to receive(:list_errors)
+ .with(**opts)
+ .and_return([errors, pagination])
+ end
+
+ context 'without params' do
+ it 'returns the errors without pagination' do
+ expect(result[:status]).to eq(:success)
+ expect(result[:issues]).to eq(errors)
+ expect(result[:pagination]).to eq({})
+ expect(error_repository).to have_received(:list_errors).with(**opts)
+ end
+ end
+
+ context 'with pagination' do
+ context 'with next page' do
+ before do
+ pagination.next = 'next cursor'
+ end
+
+ it 'has next cursor' do
+ expect(result[:pagination]).to eq(next: { cursor: 'next cursor' })
+ end
+ end
+
+ context 'with prev page' do
+ before do
+ pagination.prev = 'prev cursor'
+ end
+
+ it 'has prev cursor' do
+ expect(result[:pagination]).to eq(previous: { cursor: 'prev cursor' })
+ end
+ end
+
+ context 'with next and prev page' do
+ before do
+ pagination.next = 'next cursor'
+ pagination.prev = 'prev cursor'
+ end
+
+ it 'has both cursors' do
+ expect(result[:pagination]).to eq(
+ next: { cursor: 'next cursor' },
+ previous: { cursor: 'prev cursor' }
+ )
+ end
+ end
+ end
end
end
end
diff --git a/spec/services/git/base_hooks_service_spec.rb b/spec/services/git/base_hooks_service_spec.rb
index 8a686a19c4c..60883db0cd5 100644
--- a/spec/services/git/base_hooks_service_spec.rb
+++ b/spec/services/git/base_hooks_service_spec.rb
@@ -102,10 +102,25 @@ RSpec.describe Git::BaseHooksService, feature_category: :source_code_management
it 'executes the services' do
expect(subject).to receive(:push_data).at_least(:once).and_call_original
- expect(project).to receive(:execute_integrations)
+ expect(project).to receive(:execute_integrations).with(kind_of(Hash), subject.hook_name, skip_ci: false)
subject.execute
end
+
+ context 'with integrations.skip_ci push option' do
+ before do
+ params[:push_options] = {
+ integrations: { skip_ci: true }
+ }
+ end
+
+ it 'executes the services' do
+ expect(subject).to receive(:push_data).at_least(:once).and_call_original
+ expect(project).to receive(:execute_integrations).with(kind_of(Hash), subject.hook_name, skip_ci: true)
+
+ subject.execute
+ end
+ end
end
context 'with inactive integrations' do
diff --git a/spec/services/git/branch_hooks_service_spec.rb b/spec/services/git/branch_hooks_service_spec.rb
index f567624068a..3050d6c5eca 100644
--- a/spec/services/git/branch_hooks_service_spec.rb
+++ b/spec/services/git/branch_hooks_service_spec.rb
@@ -29,6 +29,7 @@ RSpec.describe Git::BranchHooksService, :clean_gitlab_redis_shared_state, featur
before: oldrev,
after: newrev,
ref: ref,
+ ref_protected: project.protected_for?(ref),
user_id: user.id,
user_name: user.name,
project_id: project.id
diff --git a/spec/services/git/tag_hooks_service_spec.rb b/spec/services/git/tag_hooks_service_spec.rb
index 73f6eff36ba..3e06443126b 100644
--- a/spec/services/git/tag_hooks_service_spec.rb
+++ b/spec/services/git/tag_hooks_service_spec.rb
@@ -63,6 +63,7 @@ RSpec.describe Git::TagHooksService, :service, feature_category: :source_code_ma
is_expected.to match a_hash_including(
object_kind: 'tag_push',
ref: ref,
+ ref_protected: project.protected_for?(ref),
before: oldrev,
after: newrev,
message: tag.message,
diff --git a/spec/services/groups/participants_service_spec.rb b/spec/services/groups/participants_service_spec.rb
index eee9cfce1b1..0b370ca9fd8 100644
--- a/spec/services/groups/participants_service_spec.rb
+++ b/spec/services/groups/participants_service_spec.rb
@@ -3,25 +3,78 @@
require 'spec_helper'
RSpec.describe Groups::ParticipantsService, feature_category: :groups_and_projects do
- describe '#group_members' do
- let(:user) { create(:user) }
- let(:parent_group) { create(:group) }
- let(:group) { create(:group, parent: parent_group) }
- let(:subgroup) { create(:group, parent: group) }
- let(:subproject) { create(:project, group: subgroup) }
+ describe '#execute' do
+ let_it_be(:developer) { create(:user) }
+ let_it_be(:parent_group) { create(:group) }
+ let_it_be(:group) { create(:group, parent: parent_group) }
+ let_it_be(:subgroup) { create(:group, parent: group) }
+ let_it_be(:subproject) { create(:project, group: subgroup) }
+
+ let(:service) { described_class.new(group, developer) }
+
+ subject(:service_result) { service.execute(nil) }
+
+ before_all do
+ parent_group.add_developer(developer)
+ end
+
+ before do
+ stub_feature_flags(disable_all_mention: false)
+ end
+
+ it 'includes `All Group Members`' do
+ group.add_developer(create(:user))
+
+ # These should not be included in the count for the @all entry
+ subgroup.add_developer(create(:user))
+ subproject.add_developer(create(:user))
+
+ expect(service_result).to include(a_hash_including({ username: "all", name: "All Group Members", count: 1 }))
+ end
+
+ context 'when `disable_all_mention` FF is enabled' do
+ before do
+ stub_feature_flags(disable_all_mention: true)
+ end
+
+ it 'does not include `All Group Members`' do
+ expect(service_result).not_to include(a_hash_including({ username: "all", name: "All Group Members" }))
+ end
+ end
it 'returns all members in parent groups, sub-groups, and sub-projects' do
parent_group.add_developer(create(:user))
subgroup.add_developer(create(:user))
subproject.add_developer(create(:user))
- result = described_class.new(group, user).execute(nil)
-
expected_users = (group.self_and_hierarchy.flat_map(&:users) + subproject.users)
.map { |user| user_to_autocompletable(user) }
- expect(expected_users.count).to eq(3)
- expect(result).to include(*expected_users)
+ expect(expected_users.count).to eq(4)
+ expect(service_result).to include(*expected_users)
+ end
+
+ context 'when shared with a private group' do
+ let_it_be(:private_group_member) { create(:user) }
+ let_it_be(:private_group) { create(:group, :private, :nested) }
+
+ before_all do
+ private_group.add_owner(private_group_member)
+
+ create(:group_group_link, shared_group: parent_group, shared_with_group: private_group)
+ end
+
+ subject(:usernames) { service_result.pluck(:username) }
+
+ context 'when current_user is not a member' do
+ let(:service) { described_class.new(group, create(:user)) }
+
+ it { is_expected.not_to include(private_group_member.username) }
+ end
+
+ context 'when current_user is a member' do
+ it { is_expected.to include(private_group_member.username) }
+ end
end
end
diff --git a/spec/services/groups/update_service_spec.rb b/spec/services/groups/update_service_spec.rb
index 2842097199f..3819bcee36d 100644
--- a/spec/services/groups/update_service_spec.rb
+++ b/spec/services/groups/update_service_spec.rb
@@ -333,17 +333,27 @@ RSpec.describe Groups::UpdateService, feature_category: :groups_and_projects do
described_class.new(internal_group, user, default_branch_protection: Gitlab::Access::PROTECTION_NONE)
end
+ let(:settings) { internal_group.namespace_settings }
+ let(:expected_settings) { Gitlab::Access::BranchProtection.protection_none.stringify_keys }
+
context 'for users who have the ability to update default_branch_protection' do
- it 'updates the attribute' do
+ it 'updates default_branch_protection attribute' do
+ internal_group.add_owner(user)
+
+ expect { service.execute }.to change { internal_group.default_branch_protection }.from(Gitlab::Access::PROTECTION_FULL).to(Gitlab::Access::PROTECTION_NONE)
+ end
+
+ it 'updates default_branch_protection_defaults to match default_branch_protection' do
internal_group.add_owner(user)
- expect { service.execute }.to change { internal_group.default_branch_protection }.to(Gitlab::Access::PROTECTION_NONE)
+ expect { service.execute }.to change { settings.default_branch_protection_defaults }.from({}).to(expected_settings)
end
end
context 'for users who do not have the ability to update default_branch_protection' do
it 'does not update the attribute' do
expect { service.execute }.not_to change { internal_group.default_branch_protection }
+ expect { service.execute }.not_to change { internal_group.namespace_settings.default_branch_protection_defaults }
end
end
end
diff --git a/spec/services/groups/update_shared_runners_service_spec.rb b/spec/services/groups/update_shared_runners_service_spec.rb
index 0acf1ec3d35..00eabb5c875 100644
--- a/spec/services/groups/update_shared_runners_service_spec.rb
+++ b/spec/services/groups/update_shared_runners_service_spec.rb
@@ -3,15 +3,17 @@
require 'spec_helper'
RSpec.describe Groups::UpdateSharedRunnersService, feature_category: :groups_and_projects do
+ include ReloadHelpers
+
let(:user) { create(:user) }
- let(:group) { create(:group) }
let(:params) { {} }
+ let(:service) { described_class.new(group, user, params) }
describe '#execute' do
- subject { described_class.new(group, user, params).execute }
+ subject { service.execute }
context 'when current_user is not the group owner' do
- let_it_be(:group) { create(:group) }
+ let(:group) { create(:group) }
let(:params) { { shared_runners_setting: 'enabled' } }
@@ -19,9 +21,7 @@ RSpec.describe Groups::UpdateSharedRunnersService, feature_category: :groups_and
group.add_maintainer(user)
end
- it 'results error and does not call any method' do
- expect(group).not_to receive(:update_shared_runners_setting!)
-
+ it 'returns error' do
expect(subject[:status]).to eq(:error)
expect(subject[:message]).to eq('Operation not allowed')
expect(subject[:http_status]).to eq(403)
@@ -36,23 +36,36 @@ RSpec.describe Groups::UpdateSharedRunnersService, feature_category: :groups_and
context 'enable shared Runners' do
let(:params) { { shared_runners_setting: 'enabled' } }
- context 'group that its ancestors have shared runners disabled' do
- let_it_be(:parent) { create(:group, :shared_runners_disabled) }
- let_it_be(:group) { create(:group, :shared_runners_disabled, parent: parent) }
+ context 'when ancestor disable shared runners' do
+ let(:parent) { create(:group, :shared_runners_disabled) }
+ let(:group) { create(:group, :shared_runners_disabled, parent: parent) }
+ let!(:project) { create(:project, shared_runners_enabled: false, group: group) }
- it 'results error' do
- expect(subject[:status]).to eq(:error)
- expect(subject[:message]).to eq('Validation failed: Shared runners enabled cannot be enabled because parent group has shared Runners disabled')
+ it 'returns an error and does not enable shared runners' do
+ expect do
+ expect(subject[:status]).to eq(:error)
+ expect(subject[:message]).to eq('Validation failed: Shared runners enabled cannot be enabled because parent group has shared Runners disabled')
+
+ reload_models(parent, group, project)
+ end.to not_change { parent.shared_runners_enabled }
+ .and not_change { group.shared_runners_enabled }
+ .and not_change { project.shared_runners_enabled }
end
end
- context 'root group with shared runners disabled' do
- let_it_be(:group) { create(:group, :shared_runners_disabled) }
+ context 'when updating root group' do
+ let(:group) { create(:group, :shared_runners_disabled) }
+ let(:sub_group) { create(:group, :shared_runners_disabled, parent: group) }
+ let!(:project) { create(:project, shared_runners_enabled: false, group: sub_group) }
- it 'receives correct method and succeeds' do
- expect(group).to receive(:update_shared_runners_setting!).with('enabled')
+ it 'enables shared Runners for itself and descendants' do
+ expect do
+ expect(subject[:status]).to eq(:success)
- expect(subject[:status]).to eq(:success)
+ reload_models(group, sub_group, project)
+ end.to change { group.shared_runners_enabled }.from(false).to(true)
+ .and change { sub_group.shared_runners_enabled }.from(false).to(true)
+ .and change { project.shared_runners_enabled }.from(false).to(true)
end
end
@@ -75,7 +88,7 @@ RSpec.describe Groups::UpdateSharedRunnersService, feature_category: :groups_and
let(:params) { { shared_runners_setting: 'invalid_enabled' } }
it 'does not update pending builds for the group' do
- expect(::Ci::UpdatePendingBuildService).not_to receive(:new).and_call_original
+ expect(::Ci::UpdatePendingBuildService).not_to receive(:new)
subject
@@ -87,20 +100,46 @@ RSpec.describe Groups::UpdateSharedRunnersService, feature_category: :groups_and
end
context 'disable shared Runners' do
- let_it_be(:group) { create(:group) }
+ let!(:group) { create(:group) }
+ let!(:sub_group) { create(:group, :shared_runners_disabled, :allow_descendants_override_disabled_shared_runners, parent: group) }
+ let!(:sub_group2) { create(:group, parent: group) }
+ let!(:project) { create(:project, group: group, shared_runners_enabled: true) }
+ let!(:project2) { create(:project, group: sub_group2, shared_runners_enabled: true) }
let(:params) { { shared_runners_setting: Namespace::SR_DISABLED_AND_UNOVERRIDABLE } }
- it 'receives correct method and succeeds' do
- expect(group).to receive(:update_shared_runners_setting!).with(Namespace::SR_DISABLED_AND_UNOVERRIDABLE)
+ it 'disables shared Runners for all descendant groups and projects' do
+ expect do
+ expect(subject[:status]).to eq(:success)
+
+ reload_models(group, sub_group, sub_group2, project, project2)
+ end.to change { group.shared_runners_enabled }.from(true).to(false)
+ .and not_change { group.allow_descendants_override_disabled_shared_runners }
+ .and not_change { sub_group.shared_runners_enabled }
+ .and change { sub_group.allow_descendants_override_disabled_shared_runners }.from(true).to(false)
+ .and change { sub_group2.shared_runners_enabled }.from(true).to(false)
+ .and not_change { sub_group2.allow_descendants_override_disabled_shared_runners }
+ .and change { project.shared_runners_enabled }.from(true).to(false)
+ .and change { project2.shared_runners_enabled }.from(true).to(false)
+ end
+
+ context 'with override on self' do
+ let(:group) { create(:group, :shared_runners_disabled, :allow_descendants_override_disabled_shared_runners) }
+
+ it 'disables it' do
+ expect do
+ expect(subject[:status]).to eq(:success)
- expect(subject[:status]).to eq(:success)
+ group.reload
+ end
+ .to not_change { group.shared_runners_enabled }
+ .and change { group.allow_descendants_override_disabled_shared_runners }.from(true).to(false)
+ end
end
context 'when group has pending builds' do
- let_it_be(:project) { create(:project, namespace: group) }
- let_it_be(:pending_build_1) { create(:ci_pending_build, project: project, instance_runners_enabled: true) }
- let_it_be(:pending_build_2) { create(:ci_pending_build, project: project, instance_runners_enabled: true) }
+ let!(:pending_build_1) { create(:ci_pending_build, project: project, instance_runners_enabled: true) }
+ let!(:pending_build_2) { create(:ci_pending_build, project: project, instance_runners_enabled: true) }
it 'updates pending builds for the group' do
expect(::Ci::UpdatePendingBuildService).to receive(:new).and_call_original
@@ -113,53 +152,91 @@ RSpec.describe Groups::UpdateSharedRunnersService, feature_category: :groups_and
end
end
- context 'allow descendants to override' do
- let(:params) { { shared_runners_setting: Namespace::SR_DISABLED_AND_OVERRIDABLE } }
-
+ shared_examples 'allow descendants to override' do
context 'top level group' do
- let_it_be(:group) { create(:group, :shared_runners_disabled) }
+ let!(:group) { create(:group, :shared_runners_disabled) }
+ let!(:sub_group) { create(:group, :shared_runners_disabled, parent: group) }
+ let!(:project) { create(:project, shared_runners_enabled: false, group: sub_group) }
- it 'receives correct method and succeeds' do
- expect(group).to receive(:update_shared_runners_setting!).with(Namespace::SR_DISABLED_AND_OVERRIDABLE)
+ it 'enables allow descendants to override only for itself' do
+ expect do
+ expect(subject[:status]).to eq(:success)
- expect(subject[:status]).to eq(:success)
+ reload_models(group, sub_group, project)
+ end.to change { group.allow_descendants_override_disabled_shared_runners }.from(false).to(true)
+ .and not_change { group.shared_runners_enabled }
+ .and not_change { sub_group.allow_descendants_override_disabled_shared_runners }
+ .and not_change { sub_group.shared_runners_enabled }
+ .and not_change { project.shared_runners_enabled }
end
end
- context 'when parent does not allow' do
- let_it_be(:parent) { create(:group, :shared_runners_disabled, allow_descendants_override_disabled_shared_runners: false) }
- let_it_be(:group) { create(:group, :shared_runners_disabled, allow_descendants_override_disabled_shared_runners: false, parent: parent) }
+ context 'when ancestor disables shared Runners but allows to override' do
+ let!(:parent) { create(:group, :shared_runners_disabled, :allow_descendants_override_disabled_shared_runners) }
+ let!(:group) { create(:group, :shared_runners_disabled, parent: parent) }
+ let!(:project) { create(:project, shared_runners_enabled: false, group: group) }
- it 'results error' do
- expect(subject[:status]).to eq(:error)
- expect(subject[:message]).to eq('Validation failed: Allow descendants override disabled shared runners cannot be enabled because parent group does not allow it')
+ it 'enables allow descendants to override' do
+ expect do
+ expect(subject[:status]).to eq(:success)
+
+ reload_models(parent, group, project)
+ end
+ .to not_change { parent.allow_descendants_override_disabled_shared_runners }
+ .and not_change { parent.shared_runners_enabled }
+ .and change { group.allow_descendants_override_disabled_shared_runners }.from(false).to(true)
+ .and not_change { group.shared_runners_enabled }
+ .and not_change { project.shared_runners_enabled }
end
end
- context 'when using DISABLED_WITH_OVERRIDE (deprecated)' do
- let(:params) { { shared_runners_setting: Namespace::SR_DISABLED_WITH_OVERRIDE } }
+ context 'when ancestor disables shared runners' do
+ let(:parent) { create(:group, :shared_runners_disabled) }
+ let(:group) { create(:group, :shared_runners_disabled, parent: parent) }
+ let!(:project) { create(:project, shared_runners_enabled: false, group: group) }
- context 'top level group' do
- let_it_be(:group) { create(:group, :shared_runners_disabled) }
-
- it 'receives correct method and succeeds' do
- expect(group).to receive(:update_shared_runners_setting!).with(Namespace::SR_DISABLED_WITH_OVERRIDE)
+ it 'returns an error and does not enable shared runners' do
+ expect do
+ expect(subject[:status]).to eq(:error)
+ expect(subject[:message]).to eq('Validation failed: Allow descendants override disabled shared runners cannot be enabled because parent group does not allow it')
- expect(subject[:status]).to eq(:success)
- end
+ reload_models(parent, group, project)
+ end.to not_change { parent.shared_runners_enabled }
+ .and not_change { group.shared_runners_enabled }
+ .and not_change { project.shared_runners_enabled }
end
+ end
- context 'when parent does not allow' do
- let_it_be(:parent) { create(:group, :shared_runners_disabled, allow_descendants_override_disabled_shared_runners: false) }
- let_it_be(:group) { create(:group, :shared_runners_disabled, allow_descendants_override_disabled_shared_runners: false, parent: parent) }
+ context 'top level group that has shared Runners enabled' do
+ let!(:group) { create(:group, shared_runners_enabled: true) }
+ let!(:sub_group) { create(:group, shared_runners_enabled: true, parent: group) }
+ let!(:project) { create(:project, shared_runners_enabled: true, group: sub_group) }
- it 'results error' do
- expect(subject[:status]).to eq(:error)
- expect(subject[:message]).to eq('Validation failed: Allow descendants override disabled shared runners cannot be enabled because parent group does not allow it')
+ it 'enables allow descendants to override & disables shared runners everywhere' do
+ expect do
+ expect(subject[:status]).to eq(:success)
+
+ reload_models(group, sub_group, project)
end
+ .to change { group.shared_runners_enabled }.from(true).to(false)
+ .and change { group.allow_descendants_override_disabled_shared_runners }.from(false).to(true)
+ .and change { sub_group.shared_runners_enabled }.from(true).to(false)
+ .and change { project.shared_runners_enabled }.from(true).to(false)
end
end
end
+
+ context "when using SR_DISABLED_AND_OVERRIDABLE" do
+ let(:params) { { shared_runners_setting: Namespace::SR_DISABLED_AND_OVERRIDABLE } }
+
+ include_examples 'allow descendants to override'
+ end
+
+ context "when using SR_DISABLED_WITH_OVERRIDE" do
+ let(:params) { { shared_runners_setting: Namespace::SR_DISABLED_WITH_OVERRIDE } }
+
+ include_examples 'allow descendants to override'
+ end
end
end
end
diff --git a/spec/services/import/github_service_spec.rb b/spec/services/import/github_service_spec.rb
index 21dc24e28f6..982b8b11383 100644
--- a/spec/services/import/github_service_spec.rb
+++ b/spec/services/import/github_service_spec.rb
@@ -5,7 +5,13 @@ require 'spec_helper'
RSpec.describe Import::GithubService, feature_category: :importers do
let_it_be(:user) { create(:user) }
let_it_be(:token) { 'complex-token' }
- let_it_be(:access_params) { { github_access_token: 'github-complex-token' } }
+ let_it_be(:access_params) do
+ {
+ github_access_token: 'github-complex-token',
+ additional_access_tokens: %w[foo bar]
+ }
+ end
+
let(:settings) { instance_double(Gitlab::GithubImport::Settings) }
let(:user_namespace_path) { user.namespace_path }
let(:optional_stages) { nil }
@@ -26,7 +32,12 @@ RSpec.describe Import::GithubService, feature_category: :importers do
before do
allow(Gitlab::GithubImport::Settings).to receive(:new).with(project_double).and_return(settings)
- allow(settings).to receive(:write).with(optional_stages)
+ allow(settings)
+ .to receive(:write)
+ .with(
+ optional_stages: optional_stages,
+ additional_access_tokens: access_params[:additional_access_tokens]
+ )
end
context 'do not raise an exception on input error' do
@@ -82,7 +93,9 @@ RSpec.describe Import::GithubService, feature_category: :importers do
context 'when there is no repository size limit defined' do
it 'skips the check, succeeds, and tracks an access level' do
expect(subject.execute(access_params, :github)).to include(status: :success)
- expect(settings).to have_received(:write).with(nil)
+ expect(settings)
+ .to have_received(:write)
+ .with(optional_stages: nil, additional_access_tokens: access_params[:additional_access_tokens])
expect_snowplow_event(
category: 'Import::GithubService',
action: 'create',
@@ -102,7 +115,9 @@ RSpec.describe Import::GithubService, feature_category: :importers do
it 'succeeds when the repository is smaller than the limit' do
expect(subject.execute(access_params, :github)).to include(status: :success)
- expect(settings).to have_received(:write).with(nil)
+ expect(settings)
+ .to have_received(:write)
+ .with(optional_stages: nil, additional_access_tokens: access_params[:additional_access_tokens])
expect_snowplow_event(
category: 'Import::GithubService',
action: 'create',
@@ -129,7 +144,9 @@ RSpec.describe Import::GithubService, feature_category: :importers do
context 'when application size limit is defined' do
it 'succeeds when the repository is smaller than the limit' do
expect(subject.execute(access_params, :github)).to include(status: :success)
- expect(settings).to have_received(:write).with(nil)
+ expect(settings)
+ .to have_received(:write)
+ .with(optional_stages: nil, additional_access_tokens: access_params[:additional_access_tokens])
expect_snowplow_event(
category: 'Import::GithubService',
action: 'create',
@@ -160,7 +177,22 @@ RSpec.describe Import::GithubService, feature_category: :importers do
it 'saves optional stages choice to import_data' do
subject.execute(access_params, :github)
- expect(settings).to have_received(:write).with(optional_stages)
+ expect(settings)
+ .to have_received(:write)
+ .with(
+ optional_stages: optional_stages,
+ additional_access_tokens: access_params[:additional_access_tokens]
+ )
+ end
+ end
+
+ context 'when additional access tokens are present' do
+ it 'saves additional access tokens to import_data' do
+ subject.execute(access_params, :github)
+
+ expect(settings)
+ .to have_received(:write)
+ .with(optional_stages: optional_stages, additional_access_tokens: %w[foo bar])
end
end
end
diff --git a/spec/services/import_csv/preprocess_milestones_service_spec.rb b/spec/services/import_csv/preprocess_milestones_service_spec.rb
new file mode 100644
index 00000000000..d21be52c9b9
--- /dev/null
+++ b/spec/services/import_csv/preprocess_milestones_service_spec.rb
@@ -0,0 +1,83 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ImportCsv::PreprocessMilestonesService, feature_category: :importers do
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, group: group) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:provided_titles) { %w[15.10 10.1] }
+
+ let(:service) { described_class.new(user, project, provided_titles) }
+
+ subject { service.execute }
+
+ describe '#execute' do
+ let(:project_milestones) { ::MilestonesFinder.new({ project_ids: [project.id] }).execute }
+
+ shared_examples 'csv import' do |is_success:, milestone_errors:|
+ it 'does not create milestones' do
+ expect { subject }.not_to change { project_milestones.count }
+ end
+
+ it 'reports any missing milestones' do
+ result = subject
+
+ if is_success
+ expect(result).to be_success
+ else
+ expect(result[:status]).to eq(:error)
+ expect(result.payload).to match(milestone_errors)
+ end
+ end
+ end
+
+ context 'with csv that has missing or unavailable milestones' do
+ it_behaves_like 'csv import',
+ { is_success: false, milestone_errors: { missing: { header: 'Milestone', titles: %w[15.10 10.1] } } }
+ end
+
+ context 'with csv that includes project milestones' do
+ let!(:project_milestone) { create(:milestone, project: project, title: '15.10') }
+
+ it_behaves_like 'csv import',
+ { is_success: false, milestone_errors: { missing: { header: 'Milestone', titles: ["10.1"] } } }
+ end
+
+ context 'with csv that includes milestones column' do
+ let!(:project_milestone) { create(:milestone, project: project, title: '15.10') }
+
+ context 'when milestones exist in the importing projects group' do
+ let!(:group_milestone) { create(:milestone, group: group, title: '10.1') }
+
+ it_behaves_like 'csv import', { is_success: true, milestone_errors: nil }
+ end
+
+ context 'when milestones exist in a subgroup of the importing projects group' do
+ let_it_be(:subgroup) { create(:group, parent: group) }
+ let!(:group_milestone) { create(:milestone, group: subgroup, title: '10.1') }
+
+ it_behaves_like 'csv import',
+ { is_success: false, milestone_errors: { missing: { header: 'Milestone', titles: ["10.1"] } } }
+ end
+
+ context 'when milestones exist in a different project from the importing project' do
+ let_it_be(:second_project) { create(:project, group: group) }
+ let!(:second_project_milestone) { create(:milestone, project: second_project, title: '10.1') }
+
+ it_behaves_like 'csv import',
+ { is_success: false, milestone_errors: { missing: { header: 'Milestone', titles: ["10.1"] } } }
+ end
+
+ context 'when duplicate milestones exist in the projects group and parent group' do
+ let_it_be(:sub_group) { create(:group, parent: group) }
+ let_it_be(:project) { create(:project, group: sub_group) }
+ let!(:ancestor_group_milestone) { create(:milestone, group: group, title: '15.10') }
+ let!(:ancestor_group_milestone_two) { create(:milestone, group: group, title: '10.1') }
+ let!(:group_milestone) { create(:milestone, group: sub_group, title: '10.1') }
+
+ it_behaves_like 'csv import', { is_success: true, milestone_errors: nil }
+ end
+ end
+ end
+end
diff --git a/spec/services/incident_management/issuable_escalation_statuses/after_update_service_spec.rb b/spec/services/incident_management/issuable_escalation_statuses/after_update_service_spec.rb
index 9b1994af1bb..528921a80ee 100644
--- a/spec/services/incident_management/issuable_escalation_statuses/after_update_service_spec.rb
+++ b/spec/services/incident_management/issuable_escalation_statuses/after_update_service_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe IncidentManagement::IssuableEscalationStatuses::AfterUpdateServic
let_it_be(:issue, reload: true) { escalation_status.issue }
let_it_be(:project) { issue.project }
- let(:service) { IncidentManagement::IssuableEscalationStatuses::AfterUpdateService.new(issue, current_user) }
+ let(:service) { described_class.new(issue, current_user) }
subject(:result) do
issue.update!(incident_management_issuable_escalation_status_attributes: update_params)
diff --git a/spec/services/integrations/group_mention_service_spec.rb b/spec/services/integrations/group_mention_service_spec.rb
new file mode 100644
index 00000000000..72d53ce6d06
--- /dev/null
+++ b/spec/services/integrations/group_mention_service_spec.rb
@@ -0,0 +1,143 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::GroupMentionService, feature_category: :integrations do
+ subject(:execute) { described_class.new(mentionable, hook_data: hook_data, is_confidential: is_confidential).execute }
+
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+
+ before do
+ allow(mentionable).to receive(:referenced_groups).with(user).and_return([group])
+ end
+
+ shared_examples 'group_mention_hooks' do
+ specify do
+ expect(group).to receive(:execute_integrations).with(anything, :group_mention_hooks)
+ expect(execute).to be_success
+ end
+ end
+
+ shared_examples 'group_confidential_mention_hooks' do
+ specify do
+ expect(group).to receive(:execute_integrations).with(anything, :group_confidential_mention_hooks)
+ expect(execute).to be_success
+ end
+ end
+
+ context 'for issue descriptions' do
+ let(:hook_data) { mentionable.to_hook_data(user) }
+ let(:is_confidential) { mentionable.confidential? }
+
+ context 'in public projects' do
+ let_it_be(:project) { create(:project, :public) }
+
+ context 'in public issues' do
+ let(:mentionable) do
+ create(:issue, confidential: false, project: project, author: user, description: "@#{group.full_path}")
+ end
+
+ it_behaves_like 'group_mention_hooks'
+ end
+
+ context 'in confidential issues' do
+ let(:mentionable) do
+ create(:issue, confidential: true, project: project, author: user, description: "@#{group.full_path}")
+ end
+
+ it_behaves_like 'group_confidential_mention_hooks'
+ end
+ end
+
+ context 'in private projects' do
+ let_it_be(:project) { create(:project, :private) }
+
+ context 'in public issues' do
+ let(:mentionable) do
+ create(:issue, confidential: false, project: project, author: user, description: "@#{group.full_path}")
+ end
+
+ it_behaves_like 'group_confidential_mention_hooks'
+ end
+
+ context 'in confidential issues' do
+ let(:mentionable) do
+ create(:issue, confidential: true, project: project, author: user, description: "@#{group.full_path}")
+ end
+
+ it_behaves_like 'group_confidential_mention_hooks'
+ end
+ end
+ end
+
+ context 'for merge request descriptions' do
+ let(:hook_data) { mentionable.to_hook_data(user) }
+ let(:is_confidential) { false }
+ let(:mentionable) do
+ create(:merge_request, source_project: project, target_project: project, author: user,
+ description: "@#{group.full_path}")
+ end
+
+ context 'in public projects' do
+ let_it_be(:project) { create(:project, :public) }
+
+ it_behaves_like 'group_mention_hooks'
+ end
+
+ context 'in private projects' do
+ let_it_be(:project) { create(:project, :private) }
+
+ it_behaves_like 'group_confidential_mention_hooks'
+ end
+ end
+
+ context 'for issue notes' do
+ let(:hook_data) { Gitlab::DataBuilder::Note.build(mentionable, mentionable.author) }
+ let(:is_confidential) { mentionable.confidential?(include_noteable: true) }
+
+ context 'in public projects' do
+ let_it_be(:project) { create(:project, :public) }
+
+ context 'in public issues' do
+ let(:issue) do
+ create(:issue, confidential: false, project: project, author: user, description: "@#{group.full_path}")
+ end
+
+ context 'for public notes' do
+ let(:mentionable) { create(:note_on_issue, noteable: issue, project: project, author: user) }
+
+ it_behaves_like 'group_mention_hooks'
+ end
+
+ context 'for internal notes' do
+ let(:mentionable) { create(:note_on_issue, :confidential, noteable: issue, project: project, author: user) }
+
+ it_behaves_like 'group_confidential_mention_hooks'
+ end
+ end
+ end
+
+ context 'in private projects' do
+ let_it_be(:project) { create(:project, :private) }
+
+ context 'in public issues' do
+ let(:issue) do
+ create(:issue, confidential: false, project: project, author: user, description: "@#{group.full_path}")
+ end
+
+ context 'for public notes' do
+ let(:mentionable) { create(:note_on_issue, noteable: issue, project: project, author: user) }
+
+ it_behaves_like 'group_confidential_mention_hooks'
+ end
+
+ context 'for internal notes' do
+ let(:mentionable) { create(:note_on_issue, :confidential, noteable: issue, project: project, author: user) }
+
+ it_behaves_like 'group_confidential_mention_hooks'
+ end
+ end
+ end
+ end
+end
diff --git a/spec/services/issuable/discussions_list_service_spec.rb b/spec/services/issuable/discussions_list_service_spec.rb
index 03b6a1b4556..446cc286e28 100644
--- a/spec/services/issuable/discussions_list_service_spec.rb
+++ b/spec/services/issuable/discussions_list_service_spec.rb
@@ -20,7 +20,7 @@ RSpec.describe Issuable::DiscussionsListService, feature_category: :team_plannin
it_behaves_like 'listing issuable discussions', :guest, 1, 7
context 'without notes widget' do
- let_it_be(:issuable) { create(:work_item, :issue, project: project) }
+ let_it_be(:issuable) { create(:work_item, project: project) }
before do
WorkItems::Type.default_by_type(:issue).widget_definitions.find_by_widget_type(:notes).update!(disabled: true)
diff --git a/spec/services/issuable/import_csv/base_service_spec.rb b/spec/services/issuable/import_csv/base_service_spec.rb
new file mode 100644
index 00000000000..b07c4556694
--- /dev/null
+++ b/spec/services/issuable/import_csv/base_service_spec.rb
@@ -0,0 +1,92 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Issuable::ImportCsv::BaseService, feature_category: :importers do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, group: group) }
+ let_it_be(:csv_io) { double }
+
+ let(:importer_klass) do
+ Class.new(described_class) do
+ def email_results_to_user
+ # no-op
+ end
+ end
+ end
+
+ let(:service) do
+ uploader = FileUploader.new(project)
+ uploader.store!(file)
+
+ importer_klass.new(user, project, uploader)
+ end
+
+ subject { service.execute }
+
+ describe '#preprocess_milestones' do
+ let(:utility_class) { ImportCsv::PreprocessMilestonesService }
+ let(:file) { fixture_file_upload('spec/fixtures/csv_missing_milestones.csv') }
+ let(:mocked_object) { double }
+
+ before do
+ allow(service).to receive(:create_object).and_return(mocked_object)
+ allow(mocked_object).to receive(:persisted?).and_return(true)
+ end
+
+ context 'with csv that has milestone heading' do
+ before do
+ allow(utility_class).to receive(:new).and_return(utility_class)
+ allow(utility_class).to receive(:execute).and_return(ServiceResponse.success)
+ end
+
+ it 'calls PreprocessMilestonesService' do
+ subject
+ expect(utility_class).to have_received(:new)
+ end
+
+ it 'calls PreprocessMilestonesService with unique milestone titles' do
+ subject
+ expect(utility_class).to have_received(:new).with(user, project, %w[15.10 10.1])
+ expect(utility_class).to have_received(:execute)
+ end
+ end
+
+ context 'with csv that does not have milestone heading' do
+ let(:file) { fixture_file_upload('spec/fixtures/work_items_valid_types.csv') }
+
+ before do
+ allow(utility_class).to receive(:new).and_return(utility_class)
+ end
+
+ it 'does not call PreprocessMilestonesService' do
+ subject
+ expect(utility_class).not_to have_received(:new)
+ end
+ end
+
+ context 'when one or more milestones do not exist' do
+ it 'returns the expected error in results payload' do
+ results = subject
+
+ expect(results[:success]).to eq(0)
+ expect(results[:preprocess_errors]).to match({
+ milestone_errors: { missing: { header: 'Milestone', titles: %w[15.10 10.1] } }
+ })
+ end
+ end
+
+ context 'when all milestones exist' do
+ let!(:group_milestone) { create(:milestone, group: group, title: '10.1') }
+ let!(:project_milestone) { create(:milestone, project: project, title: '15.10') }
+
+ it 'returns a successful response' do
+ results = subject
+
+ expect(results[:preprocess_errors]).to be_empty
+ expect(results[:success]).to eq(4)
+ end
+ end
+ end
+end
diff --git a/spec/services/issuable/process_assignees_spec.rb b/spec/services/issuable/process_assignees_spec.rb
index 2c8d4c5e11d..2751267c08b 100644
--- a/spec/services/issuable/process_assignees_spec.rb
+++ b/spec/services/issuable/process_assignees_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe Issuable::ProcessAssignees, feature_category: :team_planning do
describe '#execute' do
it 'returns assignee_ids when add_assignee_ids and remove_assignee_ids are not specified' do
- process = Issuable::ProcessAssignees.new(assignee_ids: %w(5 7 9),
+ process = described_class.new(assignee_ids: %w(5 7 9),
add_assignee_ids: nil,
remove_assignee_ids: nil,
existing_assignee_ids: %w(1 3 9),
@@ -16,7 +16,7 @@ RSpec.describe Issuable::ProcessAssignees, feature_category: :team_planning do
end
it 'combines other ids when assignee_ids is nil' do
- process = Issuable::ProcessAssignees.new(assignee_ids: nil,
+ process = described_class.new(assignee_ids: nil,
add_assignee_ids: nil,
remove_assignee_ids: nil,
existing_assignee_ids: %w(1 3 11),
@@ -27,7 +27,7 @@ RSpec.describe Issuable::ProcessAssignees, feature_category: :team_planning do
end
it 'combines other ids when both add_assignee_ids and remove_assignee_ids are not empty' do
- process = Issuable::ProcessAssignees.new(assignee_ids: %w(5 7 9),
+ process = described_class.new(assignee_ids: %w(5 7 9),
add_assignee_ids: %w(2 4 6),
remove_assignee_ids: %w(4 7 11),
existing_assignee_ids: %w(1 3 11),
@@ -38,7 +38,7 @@ RSpec.describe Issuable::ProcessAssignees, feature_category: :team_planning do
end
it 'combines other ids when remove_assignee_ids is not empty' do
- process = Issuable::ProcessAssignees.new(assignee_ids: %w(5 7 9),
+ process = described_class.new(assignee_ids: %w(5 7 9),
add_assignee_ids: nil,
remove_assignee_ids: %w(4 7 11),
existing_assignee_ids: %w(1 3 11),
@@ -49,7 +49,7 @@ RSpec.describe Issuable::ProcessAssignees, feature_category: :team_planning do
end
it 'combines other ids when add_assignee_ids is not empty' do
- process = Issuable::ProcessAssignees.new(assignee_ids: %w(5 7 9),
+ process = described_class.new(assignee_ids: %w(5 7 9),
add_assignee_ids: %w(2 4 6),
remove_assignee_ids: nil,
existing_assignee_ids: %w(1 3 11),
@@ -60,7 +60,7 @@ RSpec.describe Issuable::ProcessAssignees, feature_category: :team_planning do
end
it 'combines ids when existing_assignee_ids and extra_assignee_ids are omitted' do
- process = Issuable::ProcessAssignees.new(assignee_ids: %w(5 7 9),
+ process = described_class.new(assignee_ids: %w(5 7 9),
add_assignee_ids: %w(2 4 6),
remove_assignee_ids: %w(4 7 11))
result = process.execute
@@ -69,7 +69,7 @@ RSpec.describe Issuable::ProcessAssignees, feature_category: :team_planning do
end
it 'handles mixed string and integer arrays' do
- process = Issuable::ProcessAssignees.new(assignee_ids: %w(5 7 9),
+ process = described_class.new(assignee_ids: %w(5 7 9),
add_assignee_ids: [2, 4, 6],
remove_assignee_ids: %w(4 7 11),
existing_assignee_ids: [1, 3, 11],
diff --git a/spec/services/issues/build_service_spec.rb b/spec/services/issues/build_service_spec.rb
index 8368a34caf0..c51371ca0f2 100644
--- a/spec/services/issues/build_service_spec.rb
+++ b/spec/services/issues/build_service_spec.rb
@@ -205,7 +205,6 @@ RSpec.describe Issues::BuildService, feature_category: :team_planning do
issue = build_issue(**issue_params)
expect(issue.work_item_type_id).to eq(work_item_type_id)
- expect(issue.attributes['issue_type']).to eq(resulting_issue_type)
end
end
end
diff --git a/spec/services/issues/create_service_spec.rb b/spec/services/issues/create_service_spec.rb
index 3dfc9571c9c..2daba8e359d 100644
--- a/spec/services/issues/create_service_spec.rb
+++ b/spec/services/issues/create_service_spec.rb
@@ -149,6 +149,12 @@ RSpec.describe Issues::CreateService, feature_category: :team_planning do
issue
end
+ it 'calls GroupMentionWorker' do
+ expect(Integrations::GroupMentionWorker).to receive(:perform_async)
+
+ issue
+ end
+
context 'when a build_service is provided' do
let(:result) { described_class.new(container: project, current_user: user, params: opts, build_service: build_service).execute }
@@ -162,6 +168,29 @@ RSpec.describe Issues::CreateService, feature_category: :team_planning do
end
end
+ context 'when issue template is provided' do
+ let_it_be(:files) { { '.gitlab/issue_templates/Default.md' => 'Default template contents' } }
+ let_it_be_with_reload(:project) { create(:project, :custom_repo, group: group, files: files).tap { |project| project.add_guest(user) } }
+
+ context 'when description is blank' do
+ it 'sets template contents as description when description is blank' do
+ opts[:description] = ''
+
+ expect(result).to be_success
+ expect(issue).to be_persisted
+ expect(issue).to have_attributes(description: 'Default template contents')
+ end
+ end
+
+ context 'when description is not blank' do
+ it 'does not apply template when description is not blank' do
+ expect(result).to be_success
+ expect(issue).to be_persisted
+ expect(issue).to have_attributes(description: 'please fix')
+ end
+ end
+ end
+
context 'when skip_system_notes is true' do
let(:issue) { described_class.new(container: project, current_user: user, params: opts).execute(skip_system_notes: true) }
diff --git a/spec/services/issues/relative_position_rebalancing_service_spec.rb b/spec/services/issues/relative_position_rebalancing_service_spec.rb
index 68f1af49b5f..512990b5b3d 100644
--- a/spec/services/issues/relative_position_rebalancing_service_spec.rb
+++ b/spec/services/issues/relative_position_rebalancing_service_spec.rb
@@ -156,5 +156,98 @@ RSpec.describe Issues::RelativePositionRebalancingService, :clean_gitlab_redis_s
subject.execute
end
end
+
+ shared_examples 'no-op on the retried job' do
+ it 'does not update positions in the 2nd .execute' do
+ original_order = issues_in_position_order.map(&:id)
+
+ # preloads issue ids on both runs
+ expect(service).to receive(:preload_issue_ids).twice.and_call_original
+
+ # 1st run performs rebalancing
+ expect(service).to receive(:update_positions_with_retry).exactly(9).times.and_call_original
+ expect { service.execute }.to raise_error(StandardError)
+
+ # 2nd run is a no-op
+ expect(service).not_to receive(:update_positions_with_retry)
+ expect { service.execute }.to raise_error(StandardError)
+
+ # order is preserved
+ expect(original_order).to match_array(issues_in_position_order.map(&:id))
+ end
+ end
+
+ context 'when error is raised in cache cleanup step' do
+ let_it_be(:root_namespace_id) { project.root_namespace.id }
+
+ context 'when srem fails' do
+ before do
+ Gitlab::Redis::SharedState.with do |redis|
+ allow(redis).to receive(:srem?).and_raise(StandardError)
+ end
+ end
+
+ it_behaves_like 'no-op on the retried job'
+ end
+
+ context 'when delete issues ids sorted set fails' do
+ before do
+ Gitlab::Redis::SharedState.with do |redis|
+ allow(redis).to receive(:del).and_call_original
+ allow(redis).to receive(:del)
+ .with("#{Gitlab::Issues::Rebalancing::State::REDIS_KEY_PREFIX}:#{root_namespace_id}")
+ .and_raise(StandardError)
+ end
+ end
+
+ it_behaves_like 'no-op on the retried job'
+ end
+
+ context 'when delete current_index_key fails' do
+ before do
+ Gitlab::Redis::SharedState.with do |redis|
+ allow(redis).to receive(:del).and_call_original
+ allow(redis).to receive(:del)
+ .with("#{Gitlab::Issues::Rebalancing::State::REDIS_KEY_PREFIX}:#{root_namespace_id}:current_index")
+ .and_raise(StandardError)
+ end
+ end
+
+ it_behaves_like 'no-op on the retried job'
+ end
+
+ context 'when setting recently finished key fails' do
+ before do
+ Gitlab::Redis::SharedState.with do |redis|
+ allow(redis).to receive(:set).and_call_original
+ allow(redis).to receive(:set)
+ .with(
+ "#{Gitlab::Issues::Rebalancing::State::RECENTLY_FINISHED_REBALANCE_PREFIX}:2:#{project.id}",
+ anything,
+ anything
+ )
+ .and_raise(StandardError)
+ end
+ end
+
+ it 'reruns the next job in full' do
+ original_order = issues_in_position_order.map(&:id)
+
+ # preloads issue ids on both runs
+ expect(service).to receive(:preload_issue_ids).twice.and_call_original
+
+ # 1st run performs rebalancing
+ expect(service).to receive(:update_positions_with_retry).exactly(9).times.and_call_original
+ expect { service.execute }.to raise_error(StandardError)
+
+ # 2nd run performs rebalancing in full
+ expect(service).to receive(:update_positions_with_retry).exactly(9).times.and_call_original
+ expect { service.execute }.to raise_error(StandardError)
+
+ # order is preserved
+ expect(original_order).to match_array(issues_in_position_order.map(&:id))
+ end
+ end
+ end
end
end
diff --git a/spec/services/issues/reopen_service_spec.rb b/spec/services/issues/reopen_service_spec.rb
index bb1151dfac7..377efdb3f9f 100644
--- a/spec/services/issues/reopen_service_spec.rb
+++ b/spec/services/issues/reopen_service_spec.rb
@@ -68,6 +68,12 @@ RSpec.describe Issues::ReopenService, feature_category: :team_planning do
expect { execute }.not_to change { issue.incident_management_timeline_events.count }
end
+ it 'does not call GroupMentionWorker' do
+ expect(Integrations::GroupMentionWorker).not_to receive(:perform_async)
+
+ issue
+ end
+
context 'issue is incident type' do
let(:issue) { create(:incident, :closed, project: project) }
let(:current_user) { user }
diff --git a/spec/services/members/invite_service_spec.rb b/spec/services/members/invite_service_spec.rb
index 1c0466980f4..76cd5d6c89e 100644
--- a/spec/services/members/invite_service_spec.rb
+++ b/spec/services/members/invite_service_spec.rb
@@ -219,6 +219,18 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_
expect(result[:message][params[:email]]).to eq("Invite email is invalid")
end
end
+
+ context 'with email that has trailing spaces' do
+ let(:params) { { email: ' foo@bar.com ' } }
+
+ it 'returns an error' do
+ expect_not_to_create_members
+ expect(result[:status]).to eq(:error)
+ expect(result[:message][params[:email]]).to eq("Invite email is invalid")
+ end
+
+ it_behaves_like 'does not record an onboarding progress action'
+ end
end
context 'with duplicate invites' do
diff --git a/spec/services/merge_requests/after_create_service_spec.rb b/spec/services/merge_requests/after_create_service_spec.rb
index 7255d19ef8a..1126539b25a 100644
--- a/spec/services/merge_requests/after_create_service_spec.rb
+++ b/spec/services/merge_requests/after_create_service_spec.rb
@@ -75,6 +75,12 @@ RSpec.describe MergeRequests::AfterCreateService, feature_category: :code_review
execute_service
end
+ it 'calls GroupMentionWorker' do
+ expect(Integrations::GroupMentionWorker).to receive(:perform_async)
+
+ execute_service
+ end
+
it_behaves_like 'records an onboarding progress action', :merge_request_created do
let(:namespace) { merge_request.target_project.namespace }
end
diff --git a/spec/services/merge_requests/cleanup_refs_service_spec.rb b/spec/services/merge_requests/cleanup_refs_service_spec.rb
index 960b8101c36..efb6265e3d8 100644
--- a/spec/services/merge_requests/cleanup_refs_service_spec.rb
+++ b/spec/services/merge_requests/cleanup_refs_service_spec.rb
@@ -18,6 +18,8 @@ RSpec.describe MergeRequests::CleanupRefsService, feature_category: :code_review
describe '#execute' do
before do
+ stub_feature_flags(merge_request_cleanup_ref_worker_async: false)
+
# Need to re-enable this as it's being stubbed in spec_helper for
# performance reasons but is needed to run for this test.
allow(Gitlab::Git::KeepAround).to receive(:execute).and_call_original
diff --git a/spec/services/merge_requests/merge_orchestration_service_spec.rb b/spec/services/merge_requests/merge_orchestration_service_spec.rb
index 389956bf258..b9bf936eddd 100644
--- a/spec/services/merge_requests/merge_orchestration_service_spec.rb
+++ b/spec/services/merge_requests/merge_orchestration_service_spec.rb
@@ -45,7 +45,17 @@ RSpec.describe MergeRequests::MergeOrchestrationService, feature_category: :code
subject
expect(merge_request).to be_auto_merge_enabled
- expect(merge_request.auto_merge_strategy).to eq(AutoMergeService::STRATEGY_MERGE_WHEN_PIPELINE_SUCCEEDS)
+
+ if Gitlab.ee?
+ expect(merge_request.auto_merge_strategy).to(
+ eq(AutoMergeService::STRATEGY_MERGE_WHEN_CHECKS_PASS)
+ )
+ else
+ expect(merge_request.auto_merge_strategy).to(
+ eq(AutoMergeService::STRATEGY_MERGE_WHEN_PIPELINE_SUCCEEDS)
+ )
+ end
+
expect(merge_request).not_to be_merged
end
end
@@ -108,7 +118,11 @@ RSpec.describe MergeRequests::MergeOrchestrationService, feature_category: :code
merge_request.update_head_pipeline
end
- it 'fetches perferred auto merge strategy' do
+ it 'fetches preferred auto merge strategy', if: Gitlab.ee? do
+ is_expected.to eq(AutoMergeService::STRATEGY_MERGE_WHEN_CHECKS_PASS)
+ end
+
+ it 'fetches preferred auto merge strategy', unless: Gitlab.ee? do
is_expected.to eq(AutoMergeService::STRATEGY_MERGE_WHEN_PIPELINE_SUCCEEDS)
end
end
diff --git a/spec/services/merge_requests/merge_to_ref_service_spec.rb b/spec/services/merge_requests/merge_to_ref_service_spec.rb
index 8200f60b072..4e951f1bc85 100644
--- a/spec/services/merge_requests/merge_to_ref_service_spec.rb
+++ b/spec/services/merge_requests/merge_to_ref_service_spec.rb
@@ -288,17 +288,5 @@ RSpec.describe MergeRequests::MergeToRefService, feature_category: :code_review_
end
end
end
-
- context 'allow conflicts to be merged in diff' do
- let(:params) { { allow_conflicts: true } }
-
- it 'calls merge_to_ref with allow_conflicts param' do
- expect(project.repository).to receive(:merge_to_ref) do |user, **kwargs|
- expect(kwargs[:allow_conflicts]).to eq(true)
- end.and_call_original
-
- service.execute(merge_request)
- end
- end
end
end
diff --git a/spec/services/merge_requests/mergeability_check_batch_service_spec.rb b/spec/services/merge_requests/mergeability_check_batch_service_spec.rb
new file mode 100644
index 00000000000..099b8039f3e
--- /dev/null
+++ b/spec/services/merge_requests/mergeability_check_batch_service_spec.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe MergeRequests::MergeabilityCheckBatchService, feature_category: :code_review_workflow do
+ describe '#execute' do
+ subject { described_class.new(merge_requests, user).execute }
+
+ let(:merge_requests) { [] }
+ let_it_be(:user) { create(:user) }
+
+ context 'when merge_requests are not empty' do
+ let_it_be(:merge_request_1) { create(:merge_request) }
+ let_it_be(:merge_request_2) { create(:merge_request) }
+ let_it_be(:merge_requests) { [merge_request_1, merge_request_2] }
+
+ it 'triggers batch mergeability checks' do
+ expect(MergeRequests::MergeabilityCheckBatchWorker).to receive(:perform_async)
+ .with([merge_request_1.id, merge_request_2.id], user.id)
+
+ subject
+ end
+
+ context 'when user is nil' do
+ let(:user) { nil }
+
+ it 'trigger mergeability checks with nil user_id' do
+ expect(MergeRequests::MergeabilityCheckBatchWorker).to receive(:perform_async)
+ .with([merge_request_1.id, merge_request_2.id], nil)
+
+ subject
+ end
+ end
+ end
+
+ context 'when merge_requests is empty' do
+ let(:merge_requests) { MergeRequest.none }
+
+ it 'does not trigger mergeability checks' do
+ expect(MergeRequests::MergeabilityCheckBatchWorker).not_to receive(:perform_async)
+
+ subject
+ end
+ end
+ end
+end
diff --git a/spec/services/merge_requests/refresh_service_spec.rb b/spec/services/merge_requests/refresh_service_spec.rb
index 4d533b67690..06932af26dc 100644
--- a/spec/services/merge_requests/refresh_service_spec.rb
+++ b/spec/services/merge_requests/refresh_service_spec.rb
@@ -1024,4 +1024,49 @@ RSpec.describe MergeRequests::RefreshService, feature_category: :code_review_wor
end
end
end
+
+ describe '#abort_auto_merges' do
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:author) { user }
+
+ let_it_be(:merge_request, refind: true) do
+ create(
+ :merge_request,
+ source_project: project,
+ target_project: project,
+ merge_user: user,
+ auto_merge_enabled: true,
+ auto_merge_strategy: AutoMergeService::STRATEGY_MERGE_WHEN_PIPELINE_SUCCEEDS
+ )
+ end
+
+ let(:service) { described_class.new(project: project, current_user: user) }
+ let(:oldrev) { merge_request.diff_refs.base_sha }
+ let(:newrev) { merge_request.diff_refs.head_sha }
+ let(:merge_sha) { oldrev }
+
+ before do
+ merge_request.merge_params[:sha] = merge_sha
+ merge_request.save!
+
+ service.execute(oldrev, newrev, "refs/heads/#{merge_request.source_branch}")
+
+ merge_request.reload
+ end
+
+ it 'aborts MWPS for merge requests' do
+ expect(merge_request.auto_merge_enabled?).to be_falsey
+ expect(merge_request.merge_user).to be_nil
+ end
+
+ context 'when merge params contains up-to-date sha' do
+ let(:merge_sha) { newrev }
+
+ it 'maintains MWPS for merge requests' do
+ expect(merge_request.auto_merge_enabled?).to be_truthy
+ expect(merge_request.merge_user).to eq(user)
+ end
+ end
+ end
end
diff --git a/spec/services/merge_requests/reopen_service_spec.rb b/spec/services/merge_requests/reopen_service_spec.rb
index 7399b29d06e..e173cd382f2 100644
--- a/spec/services/merge_requests/reopen_service_spec.rb
+++ b/spec/services/merge_requests/reopen_service_spec.rb
@@ -40,6 +40,10 @@ RSpec.describe MergeRequests::ReopenService, feature_category: :code_review_work
.with(merge_request, 'reopen')
end
+ it 'does not call GroupMentionWorker' do
+ expect(Integrations::GroupMentionWorker).not_to receive(:perform_async)
+ end
+
it 'sends email to user2 about reopen of merge_request', :sidekiq_might_not_need_inline do
email = ActionMailer::Base.deliveries.last
expect(email.to.first).to eq(user2.email)
diff --git a/spec/services/merge_requests/update_service_spec.rb b/spec/services/merge_requests/update_service_spec.rb
index 52999b5a1ea..79f608a4614 100644
--- a/spec/services/merge_requests/update_service_spec.rb
+++ b/spec/services/merge_requests/update_service_spec.rb
@@ -108,7 +108,7 @@ RSpec.describe MergeRequests::UpdateService, :mailer, feature_category: :code_re
expect(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter)
.to receive(:track_description_edit_action).once.with(user: user)
- MergeRequests::UpdateService.new(project: project, current_user: user, params: opts).execute(merge_request2)
+ described_class.new(project: project, current_user: user, params: opts).execute(merge_request2)
end
it 'tracks Draft marking' do
@@ -117,7 +117,7 @@ RSpec.describe MergeRequests::UpdateService, :mailer, feature_category: :code_re
opts[:title] = "Draft: #{opts[:title]}"
- MergeRequests::UpdateService.new(project: project, current_user: user, params: opts).execute(merge_request2)
+ described_class.new(project: project, current_user: user, params: opts).execute(merge_request2)
end
it 'tracks Draft un-marking' do
@@ -126,7 +126,7 @@ RSpec.describe MergeRequests::UpdateService, :mailer, feature_category: :code_re
opts[:title] = "Non-draft/wip title string"
- MergeRequests::UpdateService.new(project: project, current_user: user, params: opts).execute(draft_merge_request)
+ described_class.new(project: project, current_user: user, params: opts).execute(draft_merge_request)
end
context 'when MR is locked' do
@@ -137,7 +137,7 @@ RSpec.describe MergeRequests::UpdateService, :mailer, feature_category: :code_re
opts[:discussion_locked] = true
- MergeRequests::UpdateService.new(project: project, current_user: user, params: opts).execute(merge_request)
+ described_class.new(project: project, current_user: user, params: opts).execute(merge_request)
end
end
@@ -148,7 +148,7 @@ RSpec.describe MergeRequests::UpdateService, :mailer, feature_category: :code_re
opts[:discussion_locked] = false
- MergeRequests::UpdateService.new(project: project, current_user: user, params: opts).execute(merge_request)
+ described_class.new(project: project, current_user: user, params: opts).execute(merge_request)
end
end
end
@@ -163,7 +163,7 @@ RSpec.describe MergeRequests::UpdateService, :mailer, feature_category: :code_re
opts[:discussion_locked] = false
- MergeRequests::UpdateService.new(project: project, current_user: user, params: opts).execute(merge_request)
+ described_class.new(project: project, current_user: user, params: opts).execute(merge_request)
end
end
@@ -174,7 +174,7 @@ RSpec.describe MergeRequests::UpdateService, :mailer, feature_category: :code_re
opts[:discussion_locked] = true
- MergeRequests::UpdateService.new(project: project, current_user: user, params: opts).execute(merge_request)
+ described_class.new(project: project, current_user: user, params: opts).execute(merge_request)
end
end
end
@@ -193,7 +193,7 @@ RSpec.describe MergeRequests::UpdateService, :mailer, feature_category: :code_re
spent_at: Date.parse('2021-02-24')
}
- MergeRequests::UpdateService.new(project: project, current_user: user, params: opts).execute(merge_request)
+ described_class.new(project: project, current_user: user, params: opts).execute(merge_request)
end
it 'tracks milestone change' do
@@ -202,7 +202,7 @@ RSpec.describe MergeRequests::UpdateService, :mailer, feature_category: :code_re
opts[:milestone_id] = milestone.id
- MergeRequests::UpdateService.new(project: project, current_user: user, params: opts).execute(merge_request)
+ described_class.new(project: project, current_user: user, params: opts).execute(merge_request)
end
it 'track labels change' do
@@ -211,7 +211,7 @@ RSpec.describe MergeRequests::UpdateService, :mailer, feature_category: :code_re
opts[:label_ids] = [label2.id]
- MergeRequests::UpdateService.new(project: project, current_user: user, params: opts).execute(merge_request)
+ described_class.new(project: project, current_user: user, params: opts).execute(merge_request)
end
context 'reviewers' do
@@ -222,7 +222,7 @@ RSpec.describe MergeRequests::UpdateService, :mailer, feature_category: :code_re
opts[:reviewers] = [user2]
- MergeRequests::UpdateService.new(project: project, current_user: user, params: opts).execute(merge_request)
+ described_class.new(project: project, current_user: user, params: opts).execute(merge_request)
end
end
@@ -233,7 +233,7 @@ RSpec.describe MergeRequests::UpdateService, :mailer, feature_category: :code_re
opts[:reviewers] = merge_request.reviewers
- MergeRequests::UpdateService.new(project: project, current_user: user, params: opts).execute(merge_request)
+ described_class.new(project: project, current_user: user, params: opts).execute(merge_request)
end
end
end
@@ -449,7 +449,7 @@ RSpec.describe MergeRequests::UpdateService, :mailer, feature_category: :code_re
let(:milestone) { create(:milestone, project: project) }
let(:req_opts) { { source_branch: 'feature', target_branch: 'master' } }
- subject { MergeRequests::UpdateService.new(project: project, current_user: user, params: opts).execute(merge_request) }
+ subject { described_class.new(project: project, current_user: user, params: opts).execute(merge_request) }
context 'when mentionable attributes change' do
let(:opts) { { description: "Description with #{user.to_reference}" }.merge(req_opts) }
@@ -552,7 +552,8 @@ RSpec.describe MergeRequests::UpdateService, :mailer, feature_category: :code_re
head_pipeline_of: merge_request
)
- expect(AutoMerge::MergeWhenPipelineSucceedsService).to receive(:new).with(project, user, { sha: merge_request.diff_head_sha })
+ strategies_count = Gitlab.ee? ? :twice : :once
+ expect(AutoMerge::MergeWhenPipelineSucceedsService).to receive(:new).exactly(strategies_count).with(project, user, { sha: merge_request.diff_head_sha })
.and_return(service_mock)
allow(service_mock).to receive(:available_for?) { true }
expect(service_mock).to receive(:execute).with(merge_request)
diff --git a/spec/services/metrics/dashboard/cluster_dashboard_service_spec.rb b/spec/services/metrics/dashboard/cluster_dashboard_service_spec.rb
index beed23a366f..53def716de3 100644
--- a/spec/services/metrics/dashboard/cluster_dashboard_service_spec.rb
+++ b/spec/services/metrics/dashboard/cluster_dashboard_service_spec.rb
@@ -36,7 +36,7 @@ RSpec.describe Metrics::Dashboard::ClusterDashboardService, :use_clean_rails_mem
end
describe '#get_dashboard' do
- let(:service_params) { [project, user, { cluster: cluster, cluster_type: :project }] }
+ let(:service_params) { [project, user, { cluster: cluster, cluster_type: :admin }] }
let(:service_call) { subject.get_dashboard }
subject { described_class.new(*service_params) }
diff --git a/spec/services/milestones/create_service_spec.rb b/spec/services/milestones/create_service_spec.rb
index 78cb05532eb..70010d88fbd 100644
--- a/spec/services/milestones/create_service_spec.rb
+++ b/spec/services/milestones/create_service_spec.rb
@@ -3,24 +3,70 @@
require 'spec_helper'
RSpec.describe Milestones::CreateService, feature_category: :team_planning do
- let(:project) { create(:project) }
- let(:user) { create(:user) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:params) { { title: 'New Milestone', description: 'Description' } }
+
+ subject(:create_milestone) { described_class.new(project, user, params) }
describe '#execute' do
- context "valid params" do
+ context 'when milestone is saved successfully' do
+ it 'creates a new milestone' do
+ expect { create_milestone.execute }.to change { Milestone.count }.by(1)
+ end
+
+ it 'opens the milestone if it is a project milestone' do
+ expect_next_instance_of(EventCreateService) do |instance|
+ expect(instance).to receive(:open_milestone)
+ end
+
+ create_milestone.execute
+ end
+
+ it 'returns the created milestone' do
+ milestone = create_milestone.execute
+ expect(milestone).to be_a(Milestone)
+ expect(milestone.title).to eq('New Milestone')
+ expect(milestone.description).to eq('Description')
+ end
+ end
+
+ context 'when milestone fails to save' do
before do
- project.add_maintainer(user)
+ allow_next_instance_of(Milestone) do |instance|
+ allow(instance).to receive(:save).and_return(false)
+ end
+ end
+
+ it 'does not create a new milestone' do
+ expect { create_milestone.execute }.not_to change { Milestone.count }
+ end
- opts = {
- title: 'v2.1.9',
- description: 'Patch release to fix security issue'
- }
+ it 'does not open the milestone' do
+ expect(EventCreateService).not_to receive(:open_milestone)
+
+ create_milestone.execute
+ end
- @milestone = described_class.new(project, user, opts).execute
+ it 'returns the unsaved milestone' do
+ milestone = create_milestone.execute
+ expect(milestone).to be_a(Milestone)
+ expect(milestone.title).to eq('New Milestone')
+ expect(milestone.persisted?).to be_falsey
end
+ end
+
+ it 'calls before_create method' do
+ expect(create_milestone).to receive(:before_create)
+ create_milestone.execute
+ end
+ end
- it { expect(@milestone).to be_valid }
- it { expect(@milestone.title).to eq('v2.1.9') }
+ describe '#before_create' do
+ it 'checks for spam' do
+ milestone = build(:milestone)
+ expect(milestone).to receive(:check_for_spam).with(user: user, action: :create)
+ subject.send(:before_create, milestone)
end
end
end
diff --git a/spec/services/milestones/update_service_spec.rb b/spec/services/milestones/update_service_spec.rb
index 76110af2514..44de49960d4 100644
--- a/spec/services/milestones/update_service_spec.rb
+++ b/spec/services/milestones/update_service_spec.rb
@@ -2,40 +2,86 @@
require 'spec_helper'
RSpec.describe Milestones::UpdateService, feature_category: :team_planning do
- let(:project) { create(:project) }
- let(:user) { build(:user) }
- let(:milestone) { create(:milestone, project: project) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:milestone) { create(:milestone, project: project) }
+ let_it_be(:params) { { title: 'New Title' } }
+
+ subject(:update_milestone) { described_class.new(project, user, params) }
describe '#execute' do
- context "valid params" do
- let(:inner_service) { double(:service) }
+ context 'when state_event is "activate"' do
+ let(:params) { { state_event: 'activate' } }
- before do
- project.add_maintainer(user)
+ it 'calls Milestones::ReopenService' do
+ reopen_service = instance_double(Milestones::ReopenService)
+ expect(Milestones::ReopenService).to receive(:new).with(project, user, {}).and_return(reopen_service)
+ expect(reopen_service).to receive(:execute).with(milestone)
+
+ update_milestone.execute(milestone)
end
+ end
- subject { described_class.new(project, user, { title: 'new_title' }).execute(milestone) }
+ context 'when state_event is "close"' do
+ let(:params) { { state_event: 'close' } }
+
+ it 'calls Milestones::CloseService' do
+ close_service = instance_double(Milestones::CloseService)
+ expect(Milestones::CloseService).to receive(:new).with(project, user, {}).and_return(close_service)
+ expect(close_service).to receive(:execute).with(milestone)
+
+ update_milestone.execute(milestone)
+ end
+ end
- it { expect(subject).to be_valid }
- it { expect(subject.title).to eq('new_title') }
+ context 'when params are present' do
+ it 'assigns the params to the milestone' do
+ expect(milestone).to receive(:assign_attributes).with(params.except(:state_event))
- context 'state_event is activate' do
- it 'calls ReopenService' do
- expect(Milestones::ReopenService).to receive(:new).with(project, user, {}).and_return(inner_service)
- expect(inner_service).to receive(:execute).with(milestone)
+ update_milestone.execute(milestone)
+ end
+ end
- described_class.new(project, user, { state_event: 'activate' }).execute(milestone)
- end
+ context 'when milestone is changed' do
+ before do
+ allow(milestone).to receive(:changed?).and_return(true)
end
- context 'state_event is close' do
- it 'calls ReopenService' do
- expect(Milestones::CloseService).to receive(:new).with(project, user, {}).and_return(inner_service)
- expect(inner_service).to receive(:execute).with(milestone)
+ it 'calls before_update' do
+ expect(update_milestone).to receive(:before_update).with(milestone)
- described_class.new(project, user, { state_event: 'close' }).execute(milestone)
- end
+ update_milestone.execute(milestone)
end
end
+
+ context 'when milestone is not changed' do
+ before do
+ allow(milestone).to receive(:changed?).and_return(false)
+ end
+
+ it 'does not call before_update' do
+ expect(update_milestone).not_to receive(:before_update)
+
+ update_milestone.execute(milestone)
+ end
+ end
+
+ it 'saves the milestone' do
+ expect(milestone).to receive(:save)
+
+ update_milestone.execute(milestone)
+ end
+
+ it 'returns the milestone' do
+ expect(update_milestone.execute(milestone)).to eq(milestone)
+ end
+ end
+
+ describe '#before_update' do
+ it 'checks for spam' do
+ expect(milestone).to receive(:check_for_spam).with(user: user, action: :update)
+
+ update_milestone.send(:before_update, milestone)
+ end
end
end
diff --git a/spec/services/namespace_settings/update_service_spec.rb b/spec/services/namespace_settings/update_service_spec.rb
index daffae1dda7..37cbaf19a6e 100644
--- a/spec/services/namespace_settings/update_service_spec.rb
+++ b/spec/services/namespace_settings/update_service_spec.rb
@@ -45,6 +45,22 @@ RSpec.describe NamespaceSettings::UpdateService, feature_category: :groups_and_p
end
end
+ context 'when default_branch_protection is updated' do
+ let(:namespace_settings) { group.namespace_settings }
+ let(:expected) { ::Gitlab::Access::BranchProtection.protected_against_developer_pushes.stringify_keys }
+ let(:settings) { { default_branch_protection: ::Gitlab::Access::PROTECTION_DEV_CAN_MERGE } }
+
+ before do
+ group.add_owner(user)
+ end
+
+ it "updates default_branch_protection_defaults from the default_branch_protection param" do
+ expect { service.execute }
+ .to change { namespace_settings.default_branch_protection_defaults }
+ .from({}).to(expected)
+ end
+ end
+
context "updating :resource_access_token_creation_allowed" do
let(:settings) { { resource_access_token_creation_allowed: false } }
diff --git a/spec/services/notes/post_process_service_spec.rb b/spec/services/notes/post_process_service_spec.rb
index 0bcfd6b63d2..35d3620e429 100644
--- a/spec/services/notes/post_process_service_spec.rb
+++ b/spec/services/notes/post_process_service_spec.rb
@@ -22,6 +22,9 @@ RSpec.describe Notes::PostProcessService, feature_category: :team_planning do
it do
expect(project).to receive(:execute_hooks)
expect(project).to receive(:execute_integrations)
+ expect_next_instance_of(Integrations::GroupMentionService) do |group_mention_service|
+ expect(group_mention_service).to receive(:execute)
+ end
described_class.new(@note).execute
end
diff --git a/spec/services/notes/quick_actions_service_spec.rb b/spec/services/notes/quick_actions_service_spec.rb
index cd3a4e8a395..c51e381014d 100644
--- a/spec/services/notes/quick_actions_service_spec.rb
+++ b/spec/services/notes/quick_actions_service_spec.rb
@@ -182,7 +182,7 @@ RSpec.describe Notes::QuickActionsService, feature_category: :team_planning do
context 'on an incident' do
before do
- issue.update!(issue_type: :incident, work_item_type: WorkItems::Type.default_by_type(:incident))
+ issue.update!(work_item_type: WorkItems::Type.default_by_type(:incident))
end
it 'leaves the note empty' do
@@ -224,7 +224,7 @@ RSpec.describe Notes::QuickActionsService, feature_category: :team_planning do
context 'on an incident' do
before do
- issue.update!(issue_type: :incident, work_item_type: WorkItems::Type.default_by_type(:incident))
+ issue.update!(work_item_type: WorkItems::Type.default_by_type(:incident))
end
it 'leaves the note empty' do
diff --git a/spec/services/notification_service_spec.rb b/spec/services/notification_service_spec.rb
index 99f3134f06f..1d1dd045a09 100644
--- a/spec/services/notification_service_spec.rb
+++ b/spec/services/notification_service_spec.rb
@@ -532,7 +532,7 @@ RSpec.describe NotificationService, :mailer, feature_category: :team_planning do
allow(::Gitlab::Email::IncomingEmail).to receive(:supports_wildcard?) { true }
end
- let(:subject) { NotificationService.new }
+ let(:subject) { described_class.new }
let(:mailer) { double(deliver_later: true) }
let(:issue) { create(:issue, author: User.support_bot) }
let(:project) { issue.project }
@@ -3889,7 +3889,7 @@ RSpec.describe NotificationService, :mailer, feature_category: :team_planning do
let(:note) { create(:note, noteable: issue, project: project) }
let(:member) { create(:user) }
- subject { NotificationService.new }
+ subject { described_class.new }
before do
project.add_maintainer(member)
diff --git a/spec/services/packages/cleanup/execute_policy_service_spec.rb b/spec/services/packages/cleanup/execute_policy_service_spec.rb
index a083dc0d4ea..249fd50588f 100644
--- a/spec/services/packages/cleanup/execute_policy_service_spec.rb
+++ b/spec/services/packages/cleanup/execute_policy_service_spec.rb
@@ -122,13 +122,13 @@ RSpec.describe Packages::Cleanup::ExecutePolicyService, feature_category: :packa
def mock_service_timeout(on_iteration:)
execute_call_count = 1
expect_next_instances_of(::Packages::MarkPackageFilesForDestructionService, 3) do |service|
- expect(service).to receive(:execute).and_wrap_original do |m, *args|
+ expect(service).to receive(:execute).and_wrap_original do |m, *args, **kwargs|
# timeout if we are on the right iteration
if execute_call_count == on_iteration
service_timeout_response
else
execute_call_count += 1
- m.call(*args)
+ m.call(*args, **kwargs)
end
end
end
diff --git a/spec/services/packages/debian/find_or_create_package_service_spec.rb b/spec/services/packages/debian/find_or_create_package_service_spec.rb
deleted file mode 100644
index c2ae3d56864..00000000000
--- a/spec/services/packages/debian/find_or_create_package_service_spec.rb
+++ /dev/null
@@ -1,83 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Packages::Debian::FindOrCreatePackageService, feature_category: :package_registry do
- let_it_be(:distribution) { create(:debian_project_distribution, :with_suite) }
- let_it_be(:distribution2) { create(:debian_project_distribution, :with_suite) }
-
- let_it_be(:project) { distribution.project }
- let_it_be(:user) { create(:user) }
-
- let(:service) { described_class.new(project, user, params) }
- let(:params2) { params }
- let(:service2) { described_class.new(project, user, params2) }
-
- let(:package) { subject.payload[:package] }
- let(:package2) { service2.execute.payload[:package] }
-
- shared_examples 'find or create Debian package' do
- it 'returns the same object' do
- expect { subject }.to change { ::Packages::Package.count }.by(1)
- expect(subject).to be_success
- expect(package).to be_valid
- expect(package.project_id).to eq(project.id)
- expect(package.creator_id).to eq(user.id)
- expect(package.name).to eq('foo')
- expect(package.version).to eq('1.0+debian')
- expect(package).to be_debian
- expect(package.debian_publication.distribution).to eq(distribution)
-
- expect { package2 }.not_to change { ::Packages::Package.count }
- expect(package2.id).to eq(package.id)
- end
-
- context 'with package marked as pending_destruction' do
- it 'creates a new package' do
- expect { subject }.to change { ::Packages::Package.count }.by(1)
-
- package.pending_destruction!
-
- expect { package2 }.to change { ::Packages::Package.count }.by(1)
- expect(package2.id).not_to eq(package.id)
- end
- end
- end
-
- describe '#execute' do
- subject { service.execute }
-
- context 'with a codename as distribution name' do
- let(:params) { { name: 'foo', version: '1.0+debian', distribution_name: distribution.codename } }
-
- it_behaves_like 'find or create Debian package'
- end
-
- context 'with a suite as distribution name' do
- let(:params) { { name: 'foo', version: '1.0+debian', distribution_name: distribution.suite } }
-
- it_behaves_like 'find or create Debian package'
- end
-
- context 'with existing package in another distribution' do
- let(:params) { { name: 'foo', version: '1.0+debian', distribution_name: distribution.codename } }
- let(:params2) { { name: 'foo', version: '1.0+debian', distribution_name: distribution2.codename } }
-
- it 'raises ArgumentError' do
- expect { subject }.to change { ::Packages::Package.count }.by(1)
-
- expect { package2 }.to raise_error(ArgumentError, "Debian package #{package.name} #{package.version} exists " \
- "in distribution #{distribution.codename}")
- end
- end
-
- context 'with non-existing distribution' do
- let(:params) { { name: 'foo', version: '1.0+debian', distribution_name: 'not-existing' } }
-
- it 'raises ActiveRecord::RecordNotFound' do
- expect { package }.to raise_error(ActiveRecord::RecordNotFound,
- /^Couldn't find Packages::Debian::ProjectDistribution/)
- end
- end
- end
-end
diff --git a/spec/services/packages/debian/process_changes_service_spec.rb b/spec/services/packages/debian/process_changes_service_spec.rb
deleted file mode 100644
index 39b917cf1bc..00000000000
--- a/spec/services/packages/debian/process_changes_service_spec.rb
+++ /dev/null
@@ -1,140 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Packages::Debian::ProcessChangesService, feature_category: :package_registry do
- describe '#execute' do
- let_it_be(:user) { create(:user) }
- let_it_be_with_reload(:distribution) { create(:debian_project_distribution, :with_file, suite: 'unstable') }
-
- let!(:incoming) { create(:debian_incoming, project: distribution.project, with_changes_file: true) }
-
- let(:package_file) { incoming.package_files.with_file_name('sample_1.2.3~alpha2_amd64.changes').first }
-
- subject { described_class.new(package_file, user) }
-
- context 'with valid package file' do
- it 'updates package and package file', :aggregate_failures do
- expect(::Packages::Debian::GenerateDistributionWorker).to receive(:perform_async).with(:project, distribution.id)
- expect { subject.execute }
- .to change { Packages::Package.count }.from(1).to(2)
- .and not_change { Packages::PackageFile.count }
- .and change { incoming.package_files.count }.from(8).to(0)
- .and change { package_file.debian_file_metadatum&.reload&.file_type }.from('unknown').to('changes')
-
- created_package = Packages::Package.last
- expect(created_package.name).to eq 'sample'
- expect(created_package.version).to eq '1.2.3~alpha2'
- expect(created_package.creator).to eq user
- end
-
- context 'with non-matching distribution' do
- before do
- distribution.update! suite: FFaker::Lorem.word
- end
-
- it { expect { subject.execute }.to raise_error(ActiveRecord::RecordNotFound) }
- end
-
- context 'with missing field in .changes file' do
- shared_examples 'raises error with missing field' do |missing_field|
- before do
- allow_next_instance_of(::Packages::Debian::ExtractChangesMetadataService) do |extract_changes_metadata_service|
- expect(extract_changes_metadata_service).to receive(:execute).once.and_wrap_original do |m, *args|
- metadata = m.call(*args)
- metadata[:fields].delete(missing_field)
- metadata
- end
- end
- end
-
- it { expect { subject.execute }.to raise_error(ArgumentError, "missing #{missing_field} field") }
- end
-
- it_behaves_like 'raises error with missing field', 'Source'
- it_behaves_like 'raises error with missing field', 'Version'
- it_behaves_like 'raises error with missing field', 'Distribution'
- end
-
- context 'with existing package in the same distribution' do
- let_it_be_with_reload(:existing_package) do
- create(:debian_package, name: 'sample', version: '1.2.3~alpha2', project: distribution.project, published_in: distribution)
- end
-
- it 'does not create a package and assigns the package_file to the existing package' do
- expect { subject.execute }
- .to not_change { Packages::Package.count }
- .and not_change { Packages::PackageFile.count }
- .and change { package_file.package }.to(existing_package)
- end
-
- context 'and marked as pending_destruction' do
- it 'does not re-use the existing package' do
- existing_package.pending_destruction!
-
- expect { subject.execute }
- .to change { Packages::Package.count }.by(1)
- .and not_change { Packages::PackageFile.count }
- end
- end
- end
-
- context 'with existing package in another distribution' do
- let_it_be_with_reload(:existing_package) do
- create(:debian_package, name: 'sample', version: '1.2.3~alpha2', project: distribution.project)
- end
-
- it 'raise ExtractionError' do
- expect(::Packages::Debian::GenerateDistributionWorker).not_to receive(:perform_async)
- expect { subject.execute }
- .to not_change { Packages::Package.count }
- .and not_change { Packages::PackageFile.count }
- .and not_change { incoming.package_files.count }
- .and raise_error(ArgumentError,
- "Debian package #{existing_package.name} #{existing_package.version} exists " \
- "in distribution #{existing_package.debian_distribution.codename}")
- end
-
- context 'and marked as pending_destruction' do
- it 'does not re-use the existing package' do
- existing_package.pending_destruction!
-
- expect { subject.execute }
- .to change { Packages::Package.count }.by(1)
- .and not_change { Packages::PackageFile.count }
- end
- end
- end
- end
-
- context 'with invalid package file' do
- let(:package_file) { incoming.package_files.first }
-
- it 'raise ExtractionError', :aggregate_failures do
- expect(::Packages::Debian::GenerateDistributionWorker).not_to receive(:perform_async)
- expect { subject.execute }
- .to not_change { Packages::Package.count }
- .and not_change { Packages::PackageFile.count }
- .and not_change { incoming.package_files.count }
- .and raise_error(Packages::Debian::ExtractChangesMetadataService::ExtractionError, 'is not a changes file')
- end
- end
-
- context 'when creating package fails' do
- before do
- allow_next_instance_of(::Packages::Debian::FindOrCreatePackageService) do |find_or_create_package_service|
- expect(find_or_create_package_service).to receive(:execute).and_raise(ActiveRecord::ConnectionTimeoutError, 'connect timeout')
- end
- end
-
- it 're-raise error', :aggregate_failures do
- expect(::Packages::Debian::GenerateDistributionWorker).not_to receive(:perform_async)
- expect { subject.execute }
- .to not_change { Packages::Package.count }
- .and not_change { Packages::PackageFile.count }
- .and not_change { incoming.package_files.count }
- .and raise_error(ActiveRecord::ConnectionTimeoutError, 'connect timeout')
- end
- end
- end
-end
diff --git a/spec/services/packages/npm/create_metadata_cache_service_spec.rb b/spec/services/packages/npm/create_metadata_cache_service_spec.rb
index 02f29dd94df..f4010a7d548 100644
--- a/spec/services/packages/npm/create_metadata_cache_service_spec.rb
+++ b/spec/services/packages/npm/create_metadata_cache_service_spec.rb
@@ -46,7 +46,7 @@ RSpec.describe Packages::Npm::CreateMetadataCacheService, :clean_gitlab_redis_sh
new_metadata = Gitlab::Json.parse(npm_metadata_cache.file.read)
expect(new_metadata).not_to eq(metadata)
- expect(new_metadata['dist_tags'].keys).to include(tag_name)
+ expect(new_metadata['dist-tags'].keys).to include(tag_name)
expect(npm_metadata_cache.reload.size).not_to eq(metadata_size)
end
end
diff --git a/spec/services/packages/npm/create_package_service_spec.rb b/spec/services/packages/npm/create_package_service_spec.rb
index a12d86412d8..8b94bce6650 100644
--- a/spec/services/packages/npm/create_package_service_spec.rb
+++ b/spec/services/packages/npm/create_package_service_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe Packages::Npm::CreatePackageService, feature_category: :package_r
let(:namespace) { create(:namespace) }
let(:project) { create(:project, namespace: namespace) }
- let(:user) { create(:user) }
+ let(:user) { project.owner }
let(:version) { '1.0.1' }
let(:params) do
@@ -69,7 +69,7 @@ RSpec.describe Packages::Npm::CreatePackageService, feature_category: :package_r
field_sizes: expected_field_sizes
)
- expect { subject }.to raise_error(ActiveRecord::RecordInvalid, 'Validation failed: Package json structure is too large')
+ expect { subject }.to raise_error(ActiveRecord::RecordInvalid, /structure is too large/)
.and not_change { Packages::Package.count }
.and not_change { Packages::Package.npm.count }
.and not_change { Packages::Tag.count }
@@ -171,6 +171,12 @@ RSpec.describe Packages::Npm::CreatePackageService, feature_category: :package_r
it_behaves_like 'valid package'
end
+ context 'when user is no project member' do
+ let(:user) { create(:user) }
+
+ it_behaves_like 'valid package'
+ end
+
context 'scoped package not following the naming convention' do
let(:package_name) { '@any-scope/package' }
@@ -290,7 +296,7 @@ RSpec.describe Packages::Npm::CreatePackageService, feature_category: :package_r
end
with_them do
- it { expect { subject }.to raise_error(ActiveRecord::RecordInvalid, 'Validation failed: Version is invalid') }
+ it { expect { subject }.to raise_error(ActiveRecord::RecordInvalid, "Validation failed: Version #{Gitlab::Regex.semver_regex_message}") }
end
end
@@ -313,7 +319,7 @@ RSpec.describe Packages::Npm::CreatePackageService, feature_category: :package_r
end
it { expect(subject[:http_status]).to eq 400 }
- it { expect(subject[:message]).to eq 'Could not obtain package lease.' }
+ it { expect(subject[:message]).to eq 'Could not obtain package lease. Please try again.' }
end
context 'when many of the same packages are created at the same time', :delete do
diff --git a/spec/services/packages/npm/generate_metadata_service_spec.rb b/spec/services/packages/npm/generate_metadata_service_spec.rb
index 1e3b0f71972..fdd0ab0ccee 100644
--- a/spec/services/packages/npm/generate_metadata_service_spec.rb
+++ b/spec/services/packages/npm/generate_metadata_service_spec.rb
@@ -11,7 +11,7 @@ RSpec.describe ::Packages::Npm::GenerateMetadataService, feature_category: :pack
let_it_be(:package2) { create(:npm_package, version: '2.0.6', project: project, name: package_name) }
let_it_be(:latest_package) { create(:npm_package, version: '2.0.11', project: project, name: package_name) }
- let(:packages) { project.packages.npm.with_name(package_name).last_of_each_version }
+ let(:packages) { project.packages.npm.with_name(package_name) }
let(:metadata) { described_class.new(package_name, packages).execute }
describe '#versions' do
@@ -157,14 +157,14 @@ RSpec.describe ::Packages::Npm::GenerateMetadataService, feature_category: :pack
end
def check_n_plus_one(only_dist_tags: false)
- pkgs = project.packages.npm.with_name(package_name).last_of_each_version.preload_files
+ pkgs = project.packages.npm.with_name(package_name).preload_files
control = ActiveRecord::QueryRecorder.new do
described_class.new(package_name, pkgs).execute(only_dist_tags: only_dist_tags)
end
yield
- pkgs = project.packages.npm.with_name(package_name).last_of_each_version.preload_files
+ pkgs = project.packages.npm.with_name(package_name).preload_files
expect do
described_class.new(package_name, pkgs).execute(only_dist_tags: only_dist_tags)
diff --git a/spec/services/packages/nuget/extract_metadata_content_service_spec.rb b/spec/services/packages/nuget/extract_metadata_content_service_spec.rb
new file mode 100644
index 00000000000..ff1b26e8b28
--- /dev/null
+++ b/spec/services/packages/nuget/extract_metadata_content_service_spec.rb
@@ -0,0 +1,64 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Packages::Nuget::ExtractMetadataContentService, feature_category: :package_registry do
+ let(:nuspec_file_content) { fixture_file(nuspec_filepath) }
+
+ let(:service) { described_class.new(nuspec_file_content) }
+
+ describe '#execute' do
+ subject { service.execute.payload }
+
+ context 'with nuspec file content' do
+ context 'with dependencies' do
+ let(:nuspec_filepath) { 'packages/nuget/with_dependencies.nuspec' }
+
+ it { is_expected.to have_key(:package_dependencies) }
+
+ it 'extracts dependencies' do
+ dependencies = subject[:package_dependencies]
+
+ expect(dependencies).to include(name: 'Moqi', version: '2.5.6')
+ expect(dependencies).to include(name: 'Castle.Core')
+ expect(dependencies).to include(name: 'Test.Dependency', version: '2.3.7',
+ target_framework: '.NETStandard2.0')
+ expect(dependencies).to include(name: 'Newtonsoft.Json', version: '12.0.3',
+ target_framework: '.NETStandard2.0')
+ end
+ end
+
+ context 'with package types' do
+ let(:nuspec_filepath) { 'packages/nuget/with_package_types.nuspec' }
+
+ it { is_expected.to have_key(:package_types) }
+
+ it 'extracts package types' do
+ expect(subject[:package_types]).to include('SymbolsPackage')
+ end
+ end
+
+ context 'with a nuspec file with metadata' do
+ let(:nuspec_filepath) { 'packages/nuget/with_metadata.nuspec' }
+
+ it { expect(subject[:package_tags].sort).to eq(%w[foo bar test tag1 tag2 tag3 tag4 tag5].sort) }
+ end
+ end
+
+ context 'with a nuspec file content with metadata' do
+ let_it_be(:nuspec_filepath) { 'packages/nuget/with_metadata.nuspec' }
+
+ it 'returns the correct metadata' do
+ expected_metadata = {
+ authors: 'Author Test',
+ description: 'Description Test',
+ license_url: 'https://opensource.org/licenses/MIT',
+ project_url: 'https://gitlab.com/gitlab-org/gitlab',
+ icon_url: 'https://opensource.org/files/osi_keyhole_300X300_90ppi_0.png'
+ }
+
+ expect(subject.slice(*expected_metadata.keys)).to eq(expected_metadata)
+ end
+ end
+ end
+end
diff --git a/spec/services/packages/nuget/extract_metadata_file_service_spec.rb b/spec/services/packages/nuget/extract_metadata_file_service_spec.rb
new file mode 100644
index 00000000000..412c22fe8de
--- /dev/null
+++ b/spec/services/packages/nuget/extract_metadata_file_service_spec.rb
@@ -0,0 +1,100 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Packages::Nuget::ExtractMetadataFileService, feature_category: :package_registry do
+ let_it_be(:package_file) { create(:nuget_package).package_files.first }
+
+ let(:service) { described_class.new(package_file.id) }
+
+ describe '#execute' do
+ subject { service.execute }
+
+ shared_examples 'raises an error' do |error_message|
+ it { expect { subject }.to raise_error(described_class::ExtractionError, error_message) }
+ end
+
+ context 'with valid package file id' do
+ expected_metadata = <<~XML.squish
+ <package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
+ <metadata>
+ <id>DummyProject.DummyPackage</id>
+ <version>1.0.0</version>
+ <title>Dummy package</title>
+ <authors>Test</authors>
+ <owners>Test</owners>
+ <requireLicenseAcceptance>false</requireLicenseAcceptance>
+ <description>This is a dummy project</description>
+ <dependencies>
+ <group targetFramework=".NETCoreApp3.0">
+ <dependency id="Newtonsoft.Json" version="12.0.3" exclude="Build,Analyzers" />
+ </group>
+ </dependencies>
+ </metadata>
+ </package>
+ XML
+
+ it 'returns the nuspec file content' do
+ expect(subject.payload.squish).to include(expected_metadata)
+ end
+ end
+
+ context 'with invalid package file id' do
+ let(:package_file) { instance_double('Packages::PackageFile', id: 555) }
+
+ it_behaves_like 'raises an error', 'invalid package file'
+ end
+
+ context 'when linked to a non nuget package' do
+ before do
+ package_file.package.maven!
+ end
+
+ it_behaves_like 'raises an error', 'invalid package file'
+ end
+
+ context 'with a 0 byte package file id' do
+ before do
+ allow_next_instance_of(Packages::PackageFileUploader) do |instance|
+ allow(instance).to receive(:size).and_return(0)
+ end
+ end
+
+ it_behaves_like 'raises an error', 'invalid package file'
+ end
+
+ context 'without the nuspec file' do
+ before do
+ allow_next_instance_of(Zip::File) do |instance|
+ allow(instance).to receive(:glob).and_return([])
+ end
+ end
+
+ it_behaves_like 'raises an error', 'nuspec file not found'
+ end
+
+ context 'with a too big nuspec file' do
+ before do
+ allow_next_instance_of(Zip::File) do |instance|
+ allow(instance).to receive(:glob).and_return([instance_double('File', size: 6.megabytes)])
+ end
+ end
+
+ it_behaves_like 'raises an error', 'nuspec file too big'
+ end
+
+ context 'with a corrupted nupkg file with a wrong entry size' do
+ let(:nupkg_fixture_path) { expand_fixture_path('packages/nuget/corrupted_package.nupkg') }
+
+ before do
+ allow(Zip::File).to receive(:new).and_return(Zip::File.new(nupkg_fixture_path, false, false))
+ end
+
+ it_behaves_like 'raises an error',
+ <<~ERROR.squish
+ nuspec file has the wrong entry size: entry 'DummyProject.DummyPackage.nuspec' should be 255B,
+ but is larger when inflated.
+ ERROR
+ end
+ end
+end
diff --git a/spec/services/packages/nuget/metadata_extraction_service_spec.rb b/spec/services/packages/nuget/metadata_extraction_service_spec.rb
index 8954b89971e..c8c06414830 100644
--- a/spec/services/packages/nuget/metadata_extraction_service_spec.rb
+++ b/spec/services/packages/nuget/metadata_extraction_service_spec.rb
@@ -5,17 +5,33 @@ require 'spec_helper'
RSpec.describe Packages::Nuget::MetadataExtractionService, feature_category: :package_registry do
let_it_be(:package_file) { create(:nuget_package).package_files.first }
- let(:service) { described_class.new(package_file.id) }
+ subject { described_class.new(package_file.id) }
describe '#execute' do
- subject { service.execute }
-
- shared_examples 'raises an error' do |error_message|
- it { expect { subject }.to raise_error(described_class::ExtractionError, error_message) }
+ let(:nuspec_file_content) do
+ <<~XML.squish
+ <?xml version="1.0" encoding="utf-8"?>
+ <package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
+ <metadata>
+ <id>DummyProject.DummyPackage</id>
+ <version>1.0.0</version>
+ <title>Dummy package</title>
+ <authors>Test</authors>
+ <owners>Test</owners>
+ <requireLicenseAcceptance>false</requireLicenseAcceptance>
+ <description>This is a dummy project</description>
+ <dependencies>
+ <group targetFramework=".NETCoreApp3.0">
+ <dependency id="Newtonsoft.Json" version="12.0.3" exclude="Build,Analyzers" />
+ </group>
+ </dependencies>
+ </metadata>
+ </package>
+ XML
end
- context 'with valid package file id' do
- expected_metadata = {
+ let(:expected_metadata) do
+ {
package_name: 'DummyProject.DummyPackage',
package_version: '1.0.0',
authors: 'Test',
@@ -30,113 +46,21 @@ RSpec.describe Packages::Nuget::MetadataExtractionService, feature_category: :pa
package_tags: [],
package_types: []
}
-
- it { is_expected.to eq(expected_metadata) }
end
- context 'with nuspec file' do
- before do
- allow(service).to receive(:nuspec_file_content).and_return(fixture_file(nuspec_filepath))
- end
-
- context 'with dependencies' do
- let(:nuspec_filepath) { 'packages/nuget/with_dependencies.nuspec' }
-
- it { is_expected.to have_key(:package_dependencies) }
-
- it 'extracts dependencies' do
- dependencies = subject[:package_dependencies]
-
- expect(dependencies).to include(name: 'Moqi', version: '2.5.6')
- expect(dependencies).to include(name: 'Castle.Core')
- expect(dependencies).to include(name: 'Test.Dependency', version: '2.3.7', target_framework: '.NETStandard2.0')
- expect(dependencies).to include(name: 'Newtonsoft.Json', version: '12.0.3', target_framework: '.NETStandard2.0')
- end
- end
-
- context 'with package types' do
- let(:nuspec_filepath) { 'packages/nuget/with_package_types.nuspec' }
-
- it { is_expected.to have_key(:package_types) }
-
- it 'extracts package types' do
- expect(subject[:package_types]).to include('SymbolsPackage')
+ it 'calls the necessary services and executes the metadata extraction' do
+ expect(::Packages::Nuget::ExtractMetadataFileService).to receive(:new).with(package_file.id) do
+ double.tap do |service|
+ expect(service).to receive(:execute).and_return(double(payload: nuspec_file_content))
end
end
- context 'with a nuspec file with metadata' do
- let(:nuspec_filepath) { 'packages/nuget/with_metadata.nuspec' }
-
- it { expect(subject[:package_tags].sort).to eq(%w(foo bar test tag1 tag2 tag3 tag4 tag5).sort) }
- end
- end
-
- context 'with a nuspec file with metadata' do
- let_it_be(:nuspec_filepath) { 'packages/nuget/with_metadata.nuspec' }
-
- before do
- allow(service).to receive(:nuspec_file_content).and_return(fixture_file(nuspec_filepath))
- end
-
- it 'returns the correct metadata' do
- expected_metadata = {
- authors: 'Author Test',
- description: 'Description Test',
- license_url: 'https://opensource.org/licenses/MIT',
- project_url: 'https://gitlab.com/gitlab-org/gitlab',
- icon_url: 'https://opensource.org/files/osi_keyhole_300X300_90ppi_0.png'
- }
-
- expect(subject.slice(*expected_metadata.keys)).to eq(expected_metadata)
- end
- end
+ expect(::Packages::Nuget::ExtractMetadataContentService).to receive_message_chain(:new, :execute)
+ .with(nuspec_file_content).with(no_args).and_return(double(payload: expected_metadata))
- context 'with invalid package file id' do
- let(:package_file) { double('file', id: 555) }
-
- it_behaves_like 'raises an error', 'invalid package file'
- end
-
- context 'linked to a non nuget package' do
- before do
- package_file.package.maven!
- end
-
- it_behaves_like 'raises an error', 'invalid package file'
- end
-
- context 'with a 0 byte package file id' do
- before do
- allow_any_instance_of(Packages::PackageFileUploader).to receive(:size).and_return(0)
- end
-
- it_behaves_like 'raises an error', 'invalid package file'
- end
-
- context 'without the nuspec file' do
- before do
- allow_any_instance_of(Zip::File).to receive(:glob).and_return([])
- end
-
- it_behaves_like 'raises an error', 'nuspec file not found'
- end
-
- context 'with a too big nuspec file' do
- before do
- allow_any_instance_of(Zip::File).to receive(:glob).and_return([double('file', size: 6.megabytes)])
- end
-
- it_behaves_like 'raises an error', 'nuspec file too big'
- end
-
- context 'with a corrupted nupkg file with a wrong entry size' do
- let(:nupkg_fixture_path) { expand_fixture_path('packages/nuget/corrupted_package.nupkg') }
-
- before do
- allow(Zip::File).to receive(:new).and_return(Zip::File.new(nupkg_fixture_path, false, false))
- end
+ metadata = subject.execute.payload
- it_behaves_like 'raises an error', "nuspec file has the wrong entry size: entry 'DummyProject.DummyPackage.nuspec' should be 255B, but is larger when inflated."
+ expect(metadata).to eq(expected_metadata)
end
end
end
diff --git a/spec/services/packages/nuget/update_package_from_metadata_service_spec.rb b/spec/services/packages/nuget/update_package_from_metadata_service_spec.rb
index fa7d994c13c..caa4e42d002 100644
--- a/spec/services/packages/nuget/update_package_from_metadata_service_spec.rb
+++ b/spec/services/packages/nuget/update_package_from_metadata_service_spec.rb
@@ -228,7 +228,7 @@ RSpec.describe Packages::Nuget::UpdatePackageFromMetadataService, :clean_gitlab_
end
end
- it_behaves_like 'raising an', ::Packages::Nuget::MetadataExtractionService::ExtractionError, with_message: 'nuspec file not found'
+ it_behaves_like 'raising an', ::Packages::Nuget::ExtractMetadataFileService::ExtractionError, with_message: 'nuspec file not found'
end
context 'with a symbol package' do
diff --git a/spec/services/personal_access_tokens/last_used_service_spec.rb b/spec/services/personal_access_tokens/last_used_service_spec.rb
index 77ea5e10379..32544b5d6b4 100644
--- a/spec/services/personal_access_tokens/last_used_service_spec.rb
+++ b/spec/services/personal_access_tokens/last_used_service_spec.rb
@@ -43,49 +43,5 @@ RSpec.describe PersonalAccessTokens::LastUsedService, feature_category: :system_
expect(subject).to be_nil
end
end
-
- context 'when update_personal_access_token_usage_information_every_10_minutes is disabled' do
- before do
- stub_feature_flags(update_personal_access_token_usage_information_every_10_minutes: false)
- end
-
- context 'when the personal access token was used 1 day ago', :freeze_time do
- let(:personal_access_token) { create(:personal_access_token, last_used_at: 1.day.ago) }
-
- it 'updates the last_used_at timestamp' do
- expect { subject }.to change { personal_access_token.last_used_at }
- end
-
- it 'does not run on read-only GitLab instances' do
- allow(::Gitlab::Database).to receive(:read_only?).and_return(true)
-
- expect { subject }.not_to change { personal_access_token.last_used_at }
- end
- end
-
- context 'when the personal access token was used less than 1 day ago', :freeze_time do
- let(:personal_access_token) { create(:personal_access_token, last_used_at: (1.day - 1.second).ago) }
-
- it 'does not update the last_used_at timestamp' do
- expect { subject }.not_to change { personal_access_token.last_used_at }
- end
- end
-
- context 'when the last_used_at timestamp is nil' do
- let_it_be(:personal_access_token) { create(:personal_access_token, last_used_at: nil) }
-
- it 'updates the last_used_at timestamp' do
- expect { subject }.to change { personal_access_token.last_used_at }
- end
- end
-
- context 'when not a personal access token' do
- let_it_be(:personal_access_token) { create(:oauth_access_token) }
-
- it 'does not execute' do
- expect(subject).to be_nil
- end
- end
- end
end
end
diff --git a/spec/services/personal_access_tokens/revoke_token_family_service_spec.rb b/spec/services/personal_access_tokens/revoke_token_family_service_spec.rb
new file mode 100644
index 00000000000..3e32200cc77
--- /dev/null
+++ b/spec/services/personal_access_tokens/revoke_token_family_service_spec.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe PersonalAccessTokens::RevokeTokenFamilyService, feature_category: :system_access do
+ describe '#execute' do
+ let_it_be(:token_3) { create(:personal_access_token, :revoked) }
+ let_it_be(:token_2) { create(:personal_access_token, :revoked, previous_personal_access_token_id: token_3.id) }
+ let_it_be(:token_1) { create(:personal_access_token, previous_personal_access_token_id: token_2.id) }
+
+ subject(:response) { described_class.new(token_3).execute }
+
+ it 'revokes the latest token from the chain of rotated tokens' do
+ expect(response).to be_success
+ expect(token_1.reload).to be_revoked
+ end
+ end
+end
diff --git a/spec/services/personal_access_tokens/rotate_service_spec.rb b/spec/services/personal_access_tokens/rotate_service_spec.rb
index e026b0b6485..522506870f6 100644
--- a/spec/services/personal_access_tokens/rotate_service_spec.rb
+++ b/spec/services/personal_access_tokens/rotate_service_spec.rb
@@ -25,6 +25,13 @@ RSpec.describe PersonalAccessTokens::RotateService, feature_category: :system_ac
expect(new_token).not_to be_revoked
end
+ it 'saves the previous token as previous PAT attribute' do
+ response
+
+ new_token = response.payload[:personal_access_token]
+ expect(new_token.previous_personal_access_token).to eql(token)
+ end
+
context 'when user tries to rotate already revoked token' do
let_it_be(:token, reload: true) { create(:personal_access_token, :revoked) }
diff --git a/spec/services/projects/create_service_spec.rb b/spec/services/projects/create_service_spec.rb
index 59db0b47a3c..8a737e4df56 100644
--- a/spec/services/projects/create_service_spec.rb
+++ b/spec/services/projects/create_service_spec.rb
@@ -1030,17 +1030,17 @@ RSpec.describe Projects::CreateService, '#execute', feature_category: :groups_an
end
before do
- group.update_shared_runners_setting!(shared_runners_setting)
+ group.update!(shared_runners_enabled: shared_runners_enabled,
+ allow_descendants_override_disabled_shared_runners: allow_to_override)
user.refresh_authorized_projects # Ensure cache is warm
end
context 'default value based on parent group setting' do
- where(:shared_runners_setting, :desired_config_for_new_project, :expected_result_for_project) do
- Namespace::SR_ENABLED | nil | true
- Namespace::SR_DISABLED_WITH_OVERRIDE | nil | false
- Namespace::SR_DISABLED_AND_OVERRIDABLE | nil | false
- Namespace::SR_DISABLED_AND_UNOVERRIDABLE | nil | false
+ where(:shared_runners_enabled, :allow_to_override, :desired_config_for_new_project, :expected_result_for_project) do
+ true | false | nil | true
+ false | true | nil | false
+ false | false | nil | false
end
with_them do
@@ -1057,14 +1057,12 @@ RSpec.describe Projects::CreateService, '#execute', feature_category: :groups_an
end
context 'parent group is present and allows desired config' do
- where(:shared_runners_setting, :desired_config_for_new_project, :expected_result_for_project) do
- Namespace::SR_ENABLED | true | true
- Namespace::SR_ENABLED | false | false
- Namespace::SR_DISABLED_WITH_OVERRIDE | false | false
- Namespace::SR_DISABLED_WITH_OVERRIDE | true | true
- Namespace::SR_DISABLED_AND_OVERRIDABLE | false | false
- Namespace::SR_DISABLED_AND_OVERRIDABLE | true | true
- Namespace::SR_DISABLED_AND_UNOVERRIDABLE | false | false
+ where(:shared_runners_enabled, :allow_to_override, :desired_config_for_new_project, :expected_result_for_project) do
+ true | false | true | true
+ true | false | false | false
+ false | true | false | false
+ false | true | true | true
+ false | false | false | false
end
with_them do
@@ -1080,8 +1078,8 @@ RSpec.describe Projects::CreateService, '#execute', feature_category: :groups_an
end
context 'parent group is present and disallows desired config' do
- where(:shared_runners_setting, :desired_config_for_new_project) do
- Namespace::SR_DISABLED_AND_UNOVERRIDABLE | true
+ where(:shared_runners_enabled, :allow_to_override, :desired_config_for_new_project) do
+ false | false | true
end
with_them do
diff --git a/spec/services/projects/destroy_service_spec.rb b/spec/services/projects/destroy_service_spec.rb
index 7aa6980fb24..ccf58964c71 100644
--- a/spec/services/projects/destroy_service_spec.rb
+++ b/spec/services/projects/destroy_service_spec.rb
@@ -456,14 +456,63 @@ RSpec.describe Projects::DestroyService, :aggregate_failures, :event_store_publi
end
context 'repository removal' do
- # 1. Project repository
- # 2. Wiki repository
- it 'removal of existing repos' do
- expect_next_instances_of(Repositories::DestroyService, 2) do |instance|
- expect(instance).to receive(:execute).and_return(status: :success)
+ describe '.trash_project_repositories!' do
+ let(:trash_project_repositories!) { described_class.new(project, user, {}).send(:trash_project_repositories!) }
+
+ # Destroys 3 repositories:
+ # 1. Project repository
+ # 2. Wiki repository
+ # 3. Design repository
+
+ it 'Repositories::DestroyService is called for existing repos' do
+ expect_next_instances_of(Repositories::DestroyService, 3) do |instance|
+ expect(instance).to receive(:execute).and_return(status: :success)
+ end
+
+ trash_project_repositories!
end
- described_class.new(project, user, {}).execute
+ context 'when the removal has errors' do
+ using RSpec::Parameterized::TableSyntax
+
+ let(:mock_error) { instance_double(Repositories::DestroyService, execute: { message: 'foo', status: :error }) }
+ let(:project_repository) { project.repository }
+ let(:wiki_repository) { project.wiki.repository }
+ let(:design_repository) { project.design_repository }
+
+ where(:repo, :message) do
+ ref(:project_repository) | 'Failed to remove project repository. Please try again or contact administrator.'
+ ref(:wiki_repository) | 'Failed to remove wiki repository. Please try again or contact administrator.'
+ ref(:design_repository) | 'Failed to remove design repository. Please try again or contact administrator.'
+ end
+
+ with_them do
+ before do
+ allow(Repositories::DestroyService).to receive(:new).with(anything).and_call_original
+ allow(Repositories::DestroyService).to receive(:new).with(repo).and_return(mock_error)
+ end
+
+ it 'raises correct error' do
+ expect { trash_project_repositories! }.to raise_error(Projects::DestroyService::DestroyError, message)
+ end
+ end
+ end
+ end
+
+ it 'removes project repository' do
+ expect { destroy_project(project, user, {}) }.to change { project.repository.exists? }.from(true).to(false)
+ end
+
+ it 'removes wiki repository' do
+ project.create_wiki unless project.wiki.repository.exists?
+
+ expect { destroy_project(project, user, {}) }.to change { project.wiki.repository.exists? }.from(true).to(false)
+ end
+
+ it 'removes design repository' do
+ project.design_repository.create_if_not_exists
+
+ expect { destroy_project(project, user, {}) }.to change { project.design_repository.exists? }.from(true).to(false)
end
end
diff --git a/spec/services/projects/download_service_spec.rb b/spec/services/projects/download_service_spec.rb
index e062ee04bf4..a0b14a36106 100644
--- a/spec/services/projects/download_service_spec.rb
+++ b/spec/services/projects/download_service_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe Projects::DownloadService, feature_category: :groups_and_projects
@project = create(:project, creator_id: @user.id, namespace: @user.namespace)
end
- context 'for a URL that is not on whitelist' do
+ context 'for a URL that is not on allowlist' do
before do
url = 'https://code.jquery.com/jquery-2.1.4.min.js'
@link_to_file = download_file(@project, url)
@@ -18,7 +18,7 @@ RSpec.describe Projects::DownloadService, feature_category: :groups_and_projects
it { expect(@link_to_file).to eq(nil) }
end
- context 'for URLs that are on the whitelist' do
+ context 'for URLs that are on the allowlist' do
before do
# `ssrf_filter` resolves the hostname. See https://github.com/carrierwaveuploader/carrierwave/commit/91714adda998bc9e8decf5b1f5d260d808761304
stub_request(:get, %r{http://[\d.]+/rails_sample.jpg}).to_return(body: File.read(Rails.root + 'spec/fixtures/rails_sample.jpg'))
diff --git a/spec/services/projects/participants_service_spec.rb b/spec/services/projects/participants_service_spec.rb
index 2f090577805..04c43dff2dc 100644
--- a/spec/services/projects/participants_service_spec.rb
+++ b/spec/services/projects/participants_service_spec.rb
@@ -10,12 +10,18 @@ RSpec.describe Projects::ParticipantsService, feature_category: :groups_and_proj
before_all do
project.add_developer(user)
+
+ stub_feature_flags(disable_all_mention: false)
end
def run_service
described_class.new(project, user).execute(noteable)
end
+ it 'includes `All Project and Group Members`' do
+ expect(run_service).to include(a_hash_including({ username: "all", name: "All Project and Group Members" }))
+ end
+
context 'N+1 checks' do
before do
run_service # warmup, runs table cache queries and create queries
@@ -99,6 +105,16 @@ RSpec.describe Projects::ParticipantsService, feature_category: :groups_and_proj
end
end
end
+
+ context 'when `disable_all_mention` FF is enabled' do
+ before do
+ stub_feature_flags(disable_all_mention: true)
+ end
+
+ it 'does not include `All Project and Group Members`' do
+ expect(run_service).not_to include(a_hash_including({ username: "all", name: "All Project and Group Members" }))
+ end
+ end
end
describe '#project_members' do
diff --git a/spec/services/projects/update_service_spec.rb b/spec/services/projects/update_service_spec.rb
index badbc8b628e..bfcd2be6ce4 100644
--- a/spec/services/projects/update_service_spec.rb
+++ b/spec/services/projects/update_service_spec.rb
@@ -690,7 +690,7 @@ RSpec.describe Projects::UpdateService, feature_category: :groups_and_projects d
attributes_for(
:prometheus_integration,
project: project,
- properties: { api_url: nil, manual_configuration: "1" }
+ properties: { api_url: 'invalid-url', manual_configuration: "1" }
)
end
diff --git a/spec/services/prometheus/proxy_variable_substitution_service_spec.rb b/spec/services/prometheus/proxy_variable_substitution_service_spec.rb
index fbee4b9c7d7..a5395eed1b4 100644
--- a/spec/services/prometheus/proxy_variable_substitution_service_spec.rb
+++ b/spec/services/prometheus/proxy_variable_substitution_service_spec.rb
@@ -53,7 +53,7 @@ RSpec.describe Prometheus::ProxyVariableSubstitutionService, feature_category: :
end
it_behaves_like 'success' do
- let(:expected_query) { %Q[up{environment="#{environment.slug}"}] }
+ let(:expected_query) { %[up{environment="#{environment.slug}"}] }
end
end
end
diff --git a/spec/services/quick_actions/interpret_service_spec.rb b/spec/services/quick_actions/interpret_service_spec.rb
index bd09dae0a5a..186b532233e 100644
--- a/spec/services/quick_actions/interpret_service_spec.rb
+++ b/spec/services/quick_actions/interpret_service_spec.rb
@@ -35,6 +35,7 @@ RSpec.describe QuickActions::InterpretService, feature_category: :team_planning
end
describe '#execute' do
+ let_it_be(:work_item) { create(:work_item, :task, project: project) }
let(:merge_request) { create(:merge_request, source_project: project) }
shared_examples 'reopen command' do
@@ -301,7 +302,7 @@ RSpec.describe QuickActions::InterpretService, feature_category: :team_planning
it 'returns due_date message: Date.new(2016, 8, 28) if content contains /due 2016-08-28' do
_, _, message = service.execute(content, issuable)
- expect(message).to eq("Set the due date to #{expected_date.to_s(:medium)}.")
+ expect(message).to eq("Set the due date to #{expected_date.to_fs(:medium)}.")
end
end
@@ -538,7 +539,12 @@ RSpec.describe QuickActions::InterpretService, feature_category: :team_planning
_, updates, message = service.execute(content, issuable)
expect(updates).to eq(merge: merge_request.diff_head_sha)
- expect(message).to eq('Scheduled to merge this merge request (Merge when pipeline succeeds).')
+
+ if Gitlab.ee?
+ expect(message).to eq('Scheduled to merge this merge request (Merge when checks pass).')
+ else
+ expect(message).to eq('Scheduled to merge this merge request (Merge when pipeline succeeds).')
+ end
end
end
@@ -1369,6 +1375,11 @@ RSpec.describe QuickActions::InterpretService, feature_category: :team_planning
let(:issuable) { merge_request }
end
+ it_behaves_like 'done command' do
+ let(:content) { '/done' }
+ let(:issuable) { work_item }
+ end
+
it_behaves_like 'subscribe command' do
let(:content) { '/subscribe' }
let(:issuable) { issue }
@@ -1590,6 +1601,12 @@ RSpec.describe QuickActions::InterpretService, feature_category: :team_planning
end
end
+ context 'if issuable is a work item' do
+ it_behaves_like 'todo command' do
+ let(:issuable) { work_item }
+ end
+ end
+
context 'if issuable is a MergeRequest' do
it_behaves_like 'todo command' do
let(:issuable) { merge_request }
@@ -2860,13 +2877,13 @@ RSpec.describe QuickActions::InterpretService, feature_category: :team_planning
let_it_be(:project) { create(:project, :private) }
let_it_be(:work_item) { create(:work_item, :task, project: project) }
- let(:command) { '/type Issue' }
+ let(:command) { '/type issue' }
it 'has command available' do
_, explanations = service.explain(command, work_item)
expect(explanations)
- .to contain_exactly("Converts work item to Issue. Widgets not supported in new type are removed.")
+ .to contain_exactly("Converts work item to issue. Widgets not supported in new type are removed.")
end
end
diff --git a/spec/services/resource_access_tokens/create_service_spec.rb b/spec/services/resource_access_tokens/create_service_spec.rb
index 31e4e008d4f..940d9858cdd 100644
--- a/spec/services/resource_access_tokens/create_service_spec.rb
+++ b/spec/services/resource_access_tokens/create_service_spec.rb
@@ -199,16 +199,14 @@ RSpec.describe ResourceAccessTokens::CreateService, feature_category: :system_ac
end
end
- context 'expiry of the project bot member' do
- it 'project bot membership does not expire' do
- response = subject
- access_token = response.payload[:access_token]
- project_bot = access_token.user
+ it 'project bot membership expires when PAT expires' do
+ response = subject
+ access_token = response.payload[:access_token]
+ project_bot = access_token.user
- expect(resource.members.find_by(user_id: project_bot.id).expires_at).to eq(
- max_pat_access_token_lifetime.to_date
- )
- end
+ expect(resource.members.find_by(user_id: project_bot.id).expires_at).to eq(
+ max_pat_access_token_lifetime.to_date
+ )
end
end
diff --git a/spec/services/resource_events/synthetic_label_notes_builder_service_spec.rb b/spec/services/resource_events/synthetic_label_notes_builder_service_spec.rb
index 3396abaff9e..7c1c5884fd2 100644
--- a/spec/services/resource_events/synthetic_label_notes_builder_service_spec.rb
+++ b/spec/services/resource_events/synthetic_label_notes_builder_service_spec.rb
@@ -13,7 +13,7 @@ RSpec.describe ResourceEvents::SyntheticLabelNotesBuilderService, feature_catego
let_it_be(:event3) { create(:resource_label_event, issue: issue) }
it 'returns the expected synthetic notes' do
- notes = ResourceEvents::SyntheticLabelNotesBuilderService.new(issue, user).execute
+ notes = described_class.new(issue, user).execute
expect(notes.size).to eq(3)
end
diff --git a/spec/services/service_desk/custom_emails/create_service_spec.rb b/spec/services/service_desk/custom_emails/create_service_spec.rb
new file mode 100644
index 00000000000..0d9582ba235
--- /dev/null
+++ b/spec/services/service_desk/custom_emails/create_service_spec.rb
@@ -0,0 +1,185 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ServiceDesk::CustomEmails::CreateService, feature_category: :service_desk do
+ describe '#execute' do
+ let_it_be_with_reload(:project) { create(:project) }
+ let_it_be(:user) { create(:user) }
+
+ let(:service) { described_class.new(project: project, current_user: user, params: params) }
+ let(:error_feature_flag_disabled) { 'Feature flag service_desk_custom_email is not enabled' }
+ let(:error_user_not_authorized) { s_('ServiceDesk|User cannot manage project.') }
+ let(:error_cannot_create_custom_email) { s_('ServiceDesk|Cannot create custom email') }
+ let(:error_custom_email_exists) { s_('ServiceDesk|Custom email already exists') }
+ let(:error_params_missing) { s_('ServiceDesk|Parameters missing') }
+ let(:expected_error_message) { nil }
+ let(:params) { {} }
+ let(:message_delivery) { instance_double(ActionMailer::MessageDelivery) }
+ let(:message) { instance_double(Mail::Message) }
+
+ shared_examples 'a service that exits with error' do
+ it 'exits early' do
+ response = service.execute
+
+ expect(response).to be_error
+ expect(response.message).to eq(expected_error_message)
+ end
+ end
+
+ shared_examples 'a failing service that does not create records' do
+ it 'exits with error and does not create records' do
+ response = service.execute
+ project.reset
+
+ expect(response).to be_error
+ expect(response.message).to eq(expected_error_message)
+ expect(project.service_desk_custom_email_verification).to be nil
+ expect(project.service_desk_custom_email_credential).to be nil
+ expect(project.service_desk_setting).to have_attributes(
+ custom_email: nil,
+ custom_email_enabled: false
+ )
+ end
+ end
+
+ context 'when feature flag service_desk_custom_email is disabled' do
+ let(:expected_error_message) { error_feature_flag_disabled }
+
+ before do
+ stub_feature_flags(service_desk_custom_email: false)
+ end
+
+ it_behaves_like 'a service that exits with error'
+ end
+
+ context 'with illegitimate user' do
+ let(:expected_error_message) { error_user_not_authorized }
+
+ before do
+ stub_member_access_level(project, developer: user)
+ end
+
+ it_behaves_like 'a service that exits with error'
+ end
+
+ context 'with legitimate user' do
+ let!(:settings) { create(:service_desk_setting, project: project) }
+
+ let(:expected_error_message) { error_params_missing }
+
+ before do
+ stub_member_access_level(project, maintainer: user)
+
+ # We send verification email directly and it will fail with
+ # smtp.example.com because it expects a valid DNS record
+ allow(message).to receive(:deliver)
+ allow(Notify).to receive(:service_desk_custom_email_verification_email).and_return(message)
+ end
+
+ it_behaves_like 'a service that exits with error'
+
+ context 'with params but custom_email missing' do
+ let(:params) do
+ {
+ smtp_address: 'smtp.example.com',
+ smtp_port: '587',
+ smtp_username: 'user@example.com',
+ smtp_password: 'supersecret'
+ }
+ end
+
+ it_behaves_like 'a failing service that does not create records'
+ end
+
+ context 'with params but smtp username empty' do
+ let(:params) do
+ {
+ custom_email: 'user@example.com',
+ smtp_address: 'smtp.example.com',
+ smtp_port: '587',
+ smtp_username: nil,
+ smtp_password: 'supersecret'
+ }
+ end
+
+ it_behaves_like 'a failing service that does not create records'
+ end
+
+ context 'with params but smtp password is too short' do
+ let(:expected_error_message) { error_cannot_create_custom_email }
+ let(:params) do
+ {
+ custom_email: 'user@example.com',
+ smtp_address: 'smtp.example.com',
+ smtp_port: '587',
+ smtp_username: 'user@example.com',
+ smtp_password: '2short'
+ }
+ end
+
+ it_behaves_like 'a failing service that does not create records'
+ end
+
+ context 'with params but custom_email is invalid' do
+ let(:expected_error_message) { error_cannot_create_custom_email }
+ let(:params) do
+ {
+ custom_email: 'useratexampledotcom',
+ smtp_address: 'smtp.example.com',
+ smtp_port: '587',
+ smtp_username: 'user@example.com',
+ smtp_password: 'supersecret'
+ }
+ end
+
+ it_behaves_like 'a failing service that does not create records'
+ end
+
+ context 'with full set of params' do
+ let(:params) do
+ {
+ custom_email: 'user@example.com',
+ smtp_address: 'smtp.example.com',
+ smtp_port: '587',
+ smtp_username: 'user@example.com',
+ smtp_password: 'supersecret'
+ }
+ end
+
+ it 'creates all records returns a successful response' do
+ response = service.execute
+ project.reset
+
+ expect(response).to be_success
+
+ expect(project.service_desk_setting).to have_attributes(
+ custom_email: params[:custom_email],
+ custom_email_enabled: false
+ )
+ expect(project.service_desk_custom_email_credential).to have_attributes(
+ smtp_address: params[:smtp_address],
+ smtp_port: params[:smtp_port].to_i,
+ smtp_username: params[:smtp_username],
+ smtp_password: params[:smtp_password]
+ )
+ expect(project.service_desk_custom_email_verification).to have_attributes(
+ state: 'started',
+ triggerer: user,
+ error: nil
+ )
+ end
+
+ context 'when custom email aready exists' do
+ let!(:settings) { create(:service_desk_setting, project: project, custom_email: 'user@example.com') }
+ let!(:credential) { create(:service_desk_custom_email_credential, project: project) }
+ let!(:verification) { create(:service_desk_custom_email_verification, project: project) }
+
+ let(:expected_error_message) { error_custom_email_exists }
+
+ it_behaves_like 'a service that exits with error'
+ end
+ end
+ end
+ end
+end
diff --git a/spec/services/service_desk/custom_emails/destroy_service_spec.rb b/spec/services/service_desk/custom_emails/destroy_service_spec.rb
new file mode 100644
index 00000000000..f5a22e26865
--- /dev/null
+++ b/spec/services/service_desk/custom_emails/destroy_service_spec.rb
@@ -0,0 +1,95 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ServiceDesk::CustomEmails::DestroyService, feature_category: :service_desk do
+ describe '#execute' do
+ let_it_be_with_reload(:project) { create(:project) }
+
+ let(:user) { build_stubbed(:user) }
+ let(:service) { described_class.new(project: project, current_user: user) }
+ let(:error_feature_flag_disabled) { 'Feature flag service_desk_custom_email is not enabled' }
+ let(:error_user_not_authorized) { s_('ServiceDesk|User cannot manage project.') }
+ let(:error_does_not_exist) { s_('ServiceDesk|Custom email does not exist') }
+ let(:expected_error_message) { nil }
+
+ shared_examples 'a service that exits with error' do
+ it 'exits early' do
+ response = service.execute
+
+ expect(response).to be_error
+ expect(response.message).to eq(expected_error_message)
+ end
+ end
+
+ shared_examples 'a successful service that destroys all custom email records' do
+ it 'ensures no custom email records exist' do
+ project.reset
+
+ response = service.execute
+
+ expect(response).to be_success
+ expect(project.service_desk_custom_email_verification).to be nil
+ expect(project.service_desk_custom_email_credential).to be nil
+ expect(project.service_desk_setting).to have_attributes(
+ custom_email: nil,
+ custom_email_enabled: false
+ )
+ end
+ end
+
+ context 'when feature flag service_desk_custom_email is disabled' do
+ let(:expected_error_message) { error_feature_flag_disabled }
+
+ before do
+ stub_feature_flags(service_desk_custom_email: false)
+ end
+
+ it_behaves_like 'a service that exits with error'
+ end
+
+ context 'with illegitimate user' do
+ let(:expected_error_message) { error_user_not_authorized }
+
+ before do
+ stub_member_access_level(project, developer: user)
+ end
+
+ it_behaves_like 'a service that exits with error'
+ end
+
+ context 'with legitimate user' do
+ let(:expected_error_message) { error_does_not_exist }
+
+ before do
+ stub_member_access_level(project, maintainer: user)
+ end
+
+ it_behaves_like 'a service that exits with error'
+
+ context 'when service desk setting exists' do
+ let!(:settings) { create(:service_desk_setting, project: project) }
+
+ it_behaves_like 'a successful service that destroys all custom email records'
+
+ context 'when custom email is present' do
+ let!(:settings) { create(:service_desk_setting, project: project, custom_email: 'user@example.com') }
+
+ it_behaves_like 'a successful service that destroys all custom email records'
+
+ context 'when credential exists' do
+ let!(:credential) { create(:service_desk_custom_email_credential, project: project) }
+
+ it_behaves_like 'a successful service that destroys all custom email records'
+
+ context 'when verification exists' do
+ let!(:verification) { create(:service_desk_custom_email_verification, project: project) }
+
+ it_behaves_like 'a successful service that destroys all custom email records'
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/services/service_desk_settings/update_service_spec.rb b/spec/services/service_desk_settings/update_service_spec.rb
index 342fb2b6b7a..ff564963677 100644
--- a/spec/services/service_desk_settings/update_service_spec.rb
+++ b/spec/services/service_desk_settings/update_service_spec.rb
@@ -10,9 +10,9 @@ RSpec.describe ServiceDeskSettings::UpdateService, feature_category: :service_de
let(:params) { { outgoing_name: 'some name', project_key: 'foo' } }
it 'updates service desk settings' do
- result = described_class.new(settings.project, user, params).execute
+ response = described_class.new(settings.project, user, params).execute
- expect(result[:status]).to eq :success
+ expect(response).to be_success
expect(settings.reload.outgoing_name).to eq 'some name'
expect(settings.reload.project_key).to eq 'foo'
end
@@ -22,9 +22,9 @@ RSpec.describe ServiceDeskSettings::UpdateService, feature_category: :service_de
let(:params) { { project_key: '' } }
it 'sets nil project_key' do
- result = described_class.new(settings.project, user, params).execute
+ response = described_class.new(settings.project, user, params).execute
- expect(result[:status]).to eq :success
+ expect(response).to be_success
expect(settings.reload.project_key).to be_nil
end
end
@@ -33,10 +33,10 @@ RSpec.describe ServiceDeskSettings::UpdateService, feature_category: :service_de
let(:params) { { outgoing_name: 'x' * 256 } }
it 'does not update service desk settings' do
- result = described_class.new(settings.project, user, params).execute
+ response = described_class.new(settings.project, user, params).execute
- expect(result[:status]).to eq :error
- expect(result[:message]).to eq 'Outgoing name is too long (maximum is 255 characters)'
+ expect(response).to be_error
+ expect(response.message).to eq 'Outgoing name is too long (maximum is 255 characters)'
expect(settings.reload.outgoing_name).to eq 'original name'
end
end
diff --git a/spec/services/service_response_spec.rb b/spec/services/service_response_spec.rb
index 6171ca1a8a6..03fcc11b6bd 100644
--- a/spec/services/service_response_spec.rb
+++ b/spec/services/service_response_spec.rb
@@ -214,4 +214,17 @@ RSpec.describe ServiceResponse, feature_category: :shared do
end
end
end
+
+ describe '#deconstruct_keys' do
+ it 'supports pattern matching' do
+ status =
+ case described_class.error(message: 'Bad apple')
+ in { status: Symbol => status }
+ status
+ else
+ raise
+ end
+ expect(status).to eq(:error)
+ end
+ end
end
diff --git a/spec/services/snippets/update_service_spec.rb b/spec/services/snippets/update_service_spec.rb
index b428897ce27..f36560480e3 100644
--- a/spec/services/snippets/update_service_spec.rb
+++ b/spec/services/snippets/update_service_spec.rb
@@ -22,7 +22,7 @@ RSpec.describe Snippets::UpdateService, feature_category: :source_code_managemen
let(:options) { base_opts.merge(extra_opts) }
let(:updater) { user }
- let(:service) { Snippets::UpdateService.new(project: project, current_user: updater, params: options, perform_spam_check: true) }
+ let(:service) { described_class.new(project: project, current_user: updater, params: options, perform_spam_check: true) }
subject { service.execute(snippet) }
diff --git a/spec/services/spam/spam_action_service_spec.rb b/spec/services/spam/spam_action_service_spec.rb
index 15cb4977b61..bc73a5cbfaf 100644
--- a/spec/services/spam/spam_action_service_spec.rb
+++ b/spec/services/spam/spam_action_service_spec.rb
@@ -2,7 +2,8 @@
require 'spec_helper'
-RSpec.describe Spam::SpamActionService, feature_category: :instance_resiliency do
+RSpec.describe Spam::SpamActionService, feature_category: :instance_resiliency,
+ quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/418757' do
include_context 'includes Spam constants'
let(:issue) { create(:issue, project: project, author: author) }
diff --git a/spec/services/spam/spam_verdict_service_spec.rb b/spec/services/spam/spam_verdict_service_spec.rb
index 6b14cf33041..70f43d82ead 100644
--- a/spec/services/spam/spam_verdict_service_spec.rb
+++ b/spec/services/spam/spam_verdict_service_spec.rb
@@ -136,6 +136,38 @@ RSpec.describe Spam::SpamVerdictService, feature_category: :instance_resiliency
end
end
+ context 'if allow_possible_spam user custom attribute is set' do
+ before do
+ UserCustomAttribute.upsert_custom_attributes(
+ [{
+ user_id: user.id,
+ key: 'allow_possible_spam',
+ value: 'does not matter'
+ }]
+ )
+ end
+
+ context 'and a service returns a verdict that should be overridden' do
+ before do
+ allow(service).to receive(:get_spamcheck_verdict).and_return(BLOCK_USER)
+ end
+
+ it 'overrides and renders the override verdict' do
+ is_expected.to eq OVERRIDE_VIA_ALLOW_POSSIBLE_SPAM
+ end
+ end
+
+ context 'and a service returns a verdict that does not need to be overridden' do
+ before do
+ allow(service).to receive(:get_spamcheck_verdict).and_return(ALLOW)
+ end
+
+ it 'does not override and renders the original verdict' do
+ is_expected.to eq ALLOW
+ end
+ end
+ end
+
context 'records metrics' do
let(:histogram) { instance_double(Prometheus::Client::Histogram) }
@@ -237,6 +269,8 @@ RSpec.describe Spam::SpamVerdictService, feature_category: :instance_resiliency
end
context 'if the endpoint is accessible' do
+ let(:user_scores) { Abuse::UserTrustScore.new(user) }
+
before do
allow(service).to receive(:spamcheck_client).and_return(spam_client)
allow(spam_client).to receive(:spam?).and_return(spam_client_result)
@@ -248,7 +282,7 @@ RSpec.describe Spam::SpamVerdictService, feature_category: :instance_resiliency
it 'returns the verdict' do
is_expected.to eq(NOOP)
- expect(user.spam_score).to eq(0.0)
+ expect(user_scores.spam_score).to eq(0.0)
end
end
@@ -259,7 +293,7 @@ RSpec.describe Spam::SpamVerdictService, feature_category: :instance_resiliency
context 'the result was evaluated' do
it 'returns the verdict and updates the spam score' do
is_expected.to eq(ALLOW)
- expect(user.spam_score).to be_within(0.000001).of(verdict_score)
+ expect(user_scores.spam_score).to be_within(0.000001).of(verdict_score)
end
end
@@ -268,7 +302,7 @@ RSpec.describe Spam::SpamVerdictService, feature_category: :instance_resiliency
it 'returns the verdict and does not update the spam score' do
expect(subject).to eq(ALLOW)
- expect(user.spam_score).to eq(0.0)
+ expect(user_scores.spam_score).to eq(0.0)
end
end
end
@@ -290,7 +324,7 @@ RSpec.describe Spam::SpamVerdictService, feature_category: :instance_resiliency
with_them do
it "returns expected spam constant and updates the spam score" do
is_expected.to eq(expected)
- expect(user.spam_score).to be_within(0.000001).of(verdict_score)
+ expect(user_scores.spam_score).to be_within(0.000001).of(verdict_score)
end
end
end
@@ -369,7 +403,24 @@ RSpec.describe Spam::SpamVerdictService, feature_category: :instance_resiliency
describe 'issue' do
let(:target) { issue }
- it_behaves_like 'execute spam verdict service'
+ context 'when issue is publicly visible' do
+ before do
+ allow(issue).to receive(:publicly_visible?).and_return(true)
+ end
+
+ it_behaves_like 'execute spam verdict service'
+ end
+
+ context 'when issue is not publicly visible' do
+ before do
+ allow(issue).to receive(:publicly_visible?).and_return(false)
+ allow(service).to receive(:get_spamcheck_verdict).and_return(BLOCK_USER)
+ end
+
+ it 'overrides and renders the override verdict' do
+ expect(service.execute).to eq OVERRIDE_VIA_ALLOW_POSSIBLE_SPAM
+ end
+ end
end
describe 'snippet' do
diff --git a/spec/services/system_notes/time_tracking_service_spec.rb b/spec/services/system_notes/time_tracking_service_spec.rb
index 71228050085..a3793880ff1 100644
--- a/spec/services/system_notes/time_tracking_service_spec.rb
+++ b/spec/services/system_notes/time_tracking_service_spec.rb
@@ -25,7 +25,7 @@ RSpec.describe ::SystemNotes::TimeTrackingService, feature_category: :team_plann
context 'when both dates are added' do
it 'sets the correct note message' do
- expect(note.note).to eq("changed start date to #{start_date.to_s(:long)} and changed due date to #{due_date.to_s(:long)}")
+ expect(note.note).to eq("changed start date to #{start_date.to_fs(:long)} and changed due date to #{due_date.to_fs(:long)}")
end
end
@@ -37,7 +37,7 @@ RSpec.describe ::SystemNotes::TimeTrackingService, feature_category: :team_plann
end
it 'sets the correct note message' do
- expect(note.note).to eq("removed start date #{start_date.to_s(:long)} and removed due date #{due_date.to_s(:long)}")
+ expect(note.note).to eq("removed start date #{start_date.to_fs(:long)} and removed due date #{due_date.to_fs(:long)}")
end
end
@@ -45,14 +45,14 @@ RSpec.describe ::SystemNotes::TimeTrackingService, feature_category: :team_plann
let(:changed_dates) { { 'due_date' => [nil, due_date] } }
it 'sets the correct note message' do
- expect(note.note).to eq("changed due date to #{due_date.to_s(:long)}")
+ expect(note.note).to eq("changed due date to #{due_date.to_fs(:long)}")
end
context 'and start date removed' do
let(:changed_dates) { { 'due_date' => [nil, due_date], 'start_date' => [start_date, nil] } }
it 'sets the correct note message' do
- expect(note.note).to eq("removed start date #{start_date.to_s(:long)} and changed due date to #{due_date.to_s(:long)}")
+ expect(note.note).to eq("removed start date #{start_date.to_fs(:long)} and changed due date to #{due_date.to_fs(:long)}")
end
end
end
@@ -73,14 +73,14 @@ RSpec.describe ::SystemNotes::TimeTrackingService, feature_category: :team_plann
end
it 'sets the correct note message' do
- expect(note.note).to eq("changed start date to #{start_date.to_s(:long)}")
+ expect(note.note).to eq("changed start date to #{start_date.to_fs(:long)}")
end
context 'and due date removed' do
let(:changed_dates) { { 'due_date' => [due_date, nil], 'start_date' => [nil, start_date] } }
it 'sets the correct note message' do
- expect(note.note).to eq("changed start date to #{start_date.to_s(:long)} and removed due date #{due_date.to_s(:long)}")
+ expect(note.note).to eq("changed start date to #{start_date.to_fs(:long)} and removed due date #{due_date.to_fs(:long)}")
end
end
end
diff --git a/spec/services/test_hooks/project_service_spec.rb b/spec/services/test_hooks/project_service_spec.rb
index 31f97edbd08..35c827d5448 100644
--- a/spec/services/test_hooks/project_service_spec.rb
+++ b/spec/services/test_hooks/project_service_spec.rb
@@ -207,5 +207,26 @@ RSpec.describe TestHooks::ProjectService, feature_category: :code_testing do
expect(service.execute).to include(success_result)
end
end
+
+ context 'emoji' do
+ let(:trigger) { 'emoji_events' }
+ let(:trigger_key) { :emoji_hooks }
+
+ it 'returns error message if not enough data' do
+ expect(hook).not_to receive(:execute)
+ expect(service.execute).to have_attributes(status: :error, message: 'Ensure the project has notes.')
+ end
+
+ it 'executes hook' do
+ note = create(:note)
+ allow(project).to receive_message_chain(:notes, :any?).and_return(true)
+ allow(project).to receive_message_chain(:notes, :last).and_return(note)
+ allow(Gitlab::DataBuilder::Emoji).to receive(:build).with(anything, current_user, 'award')
+ .and_return(sample_data)
+
+ expect(hook).to receive(:execute).with(sample_data, trigger_key, force: true).and_return(success_result)
+ expect(service.execute).to include(success_result)
+ end
+ end
end
end
diff --git a/spec/services/todo_service_spec.rb b/spec/services/todo_service_spec.rb
index 1ec6a3250fc..32e17df4d69 100644
--- a/spec/services/todo_service_spec.rb
+++ b/spec/services/todo_service_spec.rb
@@ -717,6 +717,57 @@ RSpec.describe TodoService, feature_category: :team_planning do
end
end
+ describe 'Work Items' do
+ let_it_be(:work_item) { create(:work_item, :task, project: project, author: author) }
+
+ describe '#mark_todo' do
+ it 'creates a todo from a work item' do
+ service.mark_todo(work_item, author)
+
+ should_create_todo(user: author, target: work_item, action: Todo::MARKED)
+ end
+ end
+
+ describe '#todo_exists?' do
+ it 'returns false when no todo exist for the given work_item' do
+ expect(service.todo_exist?(work_item, author)).to be_falsy
+ end
+
+ it 'returns true when a todo exist for the given work_item' do
+ service.mark_todo(work_item, author)
+
+ expect(service.todo_exist?(work_item, author)).to be_truthy
+ end
+ end
+
+ describe '#resolve_todos_for_target' do
+ it 'marks related pending todos to the target for the user as done' do
+ first_todo = create(:todo, :assigned, user: john_doe, project: project, target: work_item, author: author)
+ second_todo = create(:todo, :assigned, user: john_doe, project: project, target: work_item, author: author)
+
+ service.resolve_todos_for_target(work_item, john_doe)
+
+ expect(first_todo.reload).to be_done
+ expect(second_todo.reload).to be_done
+ end
+
+ describe 'cached counts' do
+ it 'updates when todos change' do
+ create(:todo, :assigned, user: john_doe, project: project, target: work_item, author: author)
+
+ expect(john_doe.todos_done_count).to eq(0)
+ expect(john_doe.todos_pending_count).to eq(1)
+ expect(john_doe).to receive(:update_todos_count_cache).and_call_original
+
+ service.resolve_todos_for_target(work_item, john_doe)
+
+ expect(john_doe.todos_done_count).to eq(1)
+ expect(john_doe.todos_pending_count).to eq(0)
+ end
+ end
+ end
+ end
+
describe '#reassigned_assignable' do
let(:described_method) { :reassigned_assignable }
diff --git a/spec/services/user_project_access_changed_service_spec.rb b/spec/services/user_project_access_changed_service_spec.rb
index 563af8e7e9e..a50bd3ee2f1 100644
--- a/spec/services/user_project_access_changed_service_spec.rb
+++ b/spec/services/user_project_access_changed_service_spec.rb
@@ -61,7 +61,7 @@ RSpec.describe UserProjectAccessChangedService, feature_category: :system_access
end
context 'with load balancing enabled' do
- let(:service) { UserProjectAccessChangedService.new([1, 2]) }
+ let(:service) { described_class.new([1, 2]) }
before do
expect(AuthorizedProjectsWorker).to receive(:bulk_perform_async)
@@ -81,7 +81,7 @@ RSpec.describe UserProjectAccessChangedService, feature_category: :system_access
service.execute
end
- service = UserProjectAccessChangedService.new([1, 2, 3, 4, 5])
+ service = described_class.new([1, 2, 3, 4, 5])
allow(AuthorizedProjectsWorker).to receive(:bulk_perform_async)
.with([[1], [2], [3], [4], [5]])
diff --git a/spec/services/users/allow_possible_spam_service_spec.rb b/spec/services/users/allow_possible_spam_service_spec.rb
new file mode 100644
index 00000000000..53618f0c8e9
--- /dev/null
+++ b/spec/services/users/allow_possible_spam_service_spec.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Users::AllowPossibleSpamService, feature_category: :user_management do
+ let_it_be(:current_user) { create(:admin) }
+
+ subject(:service) { described_class.new(current_user) }
+
+ describe '#execute' do
+ let(:user) { create(:user) }
+
+ subject(:operation) { service.execute(user) }
+
+ it 'updates the custom attributes', :aggregate_failures do
+ expect(user.custom_attributes).to be_empty
+
+ operation
+ user.reload
+
+ expect(user.custom_attributes.by_key(UserCustomAttribute::ALLOW_POSSIBLE_SPAM)).to be_present
+ end
+ end
+end
diff --git a/spec/services/users/ban_service_spec.rb b/spec/services/users/ban_service_spec.rb
index 5be5de82e91..7e342340f88 100644
--- a/spec/services/users/ban_service_spec.rb
+++ b/spec/services/users/ban_service_spec.rb
@@ -38,6 +38,13 @@ RSpec.describe Users::BanService, feature_category: :user_management do
ban_user
end
+
+ it 'tracks the event', :experiment do
+ expect(experiment(:phone_verification_for_low_risk_users))
+ .to track(:banned).on_next_instance.with_context(user: user)
+
+ ban_user
+ end
end
context 'when failed' do
diff --git a/spec/services/users/disallow_possible_spam_service_spec.rb b/spec/services/users/disallow_possible_spam_service_spec.rb
new file mode 100644
index 00000000000..32a47e05525
--- /dev/null
+++ b/spec/services/users/disallow_possible_spam_service_spec.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Users::DisallowPossibleSpamService, feature_category: :user_management do
+ let_it_be(:current_user) { create(:admin) }
+
+ subject(:service) { described_class.new(current_user) }
+
+ describe '#execute' do
+ let(:user) { create(:user) }
+
+ subject(:operation) { service.execute(user) }
+
+ before do
+ UserCustomAttribute.upsert_custom_attributes(
+ [{
+ user_id: user.id,
+ key: :allow_possible_spam,
+ value: 'not important'
+ }]
+ )
+ end
+
+ it 'updates the custom attributes', :aggregate_failures do
+ expect(user.custom_attributes.by_key(UserCustomAttribute::ALLOW_POSSIBLE_SPAM)).to be_present
+
+ operation
+ user.reload
+
+ expect(user.custom_attributes).to be_empty
+ end
+ end
+end
diff --git a/spec/services/web_hook_service_spec.rb b/spec/services/web_hook_service_spec.rb
index 2aa62f932ed..fb7d487b29b 100644
--- a/spec/services/web_hook_service_spec.rb
+++ b/spec/services/web_hook_service_spec.rb
@@ -69,20 +69,23 @@ RSpec.describe WebHookService, :request_store, :clean_gitlab_redis_shared_state,
end
describe '#execute' do
- let!(:uuid) { SecureRandom.uuid }
+ let(:uuid) { SecureRandom.uuid }
+ let!(:recursion_uuid) { SecureRandom.uuid }
let(:headers) do
{
'Content-Type' => 'application/json',
'User-Agent' => "GitLab/#{Gitlab::VERSION}",
+ 'X-Gitlab-Webhook-UUID' => uuid,
'X-Gitlab-Event' => 'Push Hook',
- 'X-Gitlab-Event-UUID' => uuid,
+ 'X-Gitlab-Event-UUID' => recursion_uuid,
'X-Gitlab-Instance' => Gitlab.config.gitlab.base_url
}
end
before do
- # Set a stable value for the `X-Gitlab-Event-UUID` header.
- Gitlab::WebHooks::RecursionDetection.set_request_uuid(uuid)
+ # Set stable values for the `X-Gitlab-Webhook-UUID` and `X-Gitlab-Event-UUID` headers.
+ allow(SecureRandom).to receive(:uuid).and_return(uuid)
+ Gitlab::WebHooks::RecursionDetection.set_request_uuid(recursion_uuid)
end
context 'when there is an interpolation error' do
diff --git a/spec/services/webauthn/authenticate_service_spec.rb b/spec/services/webauthn/authenticate_service_spec.rb
index ca940dff0eb..99b8c7b0b36 100644
--- a/spec/services/webauthn/authenticate_service_spec.rb
+++ b/spec/services/webauthn/authenticate_service_spec.rb
@@ -28,7 +28,7 @@ RSpec.describe Webauthn::AuthenticateService, feature_category: :system_access d
get_result = client.get(challenge: challenge)
get_result['clientExtensionResults'] = {}
- service = Webauthn::AuthenticateService.new(user, get_result.to_json, challenge)
+ service = described_class.new(user, get_result.to_json, challenge)
expect(service.execute).to eq true
end
@@ -41,7 +41,7 @@ RSpec.describe Webauthn::AuthenticateService, feature_category: :system_access d
get_result = other_client.get(challenge: challenge)
get_result['clientExtensionResults'] = {}
- service = Webauthn::AuthenticateService.new(user, get_result.to_json, challenge)
+ service = described_class.new(user, get_result.to_json, challenge)
expect(service.execute).to eq false
end
@@ -49,7 +49,7 @@ RSpec.describe Webauthn::AuthenticateService, feature_category: :system_access d
context 'when device response includes invalid json' do
it 'returns false' do
- service = Webauthn::AuthenticateService.new(user, 'invalid JSON', '')
+ service = described_class.new(user, 'invalid JSON', '')
expect(service.execute).to eq false
end
end
diff --git a/spec/services/webauthn/register_service_spec.rb b/spec/services/webauthn/register_service_spec.rb
index 2286d261e94..734e8444b5d 100644
--- a/spec/services/webauthn/register_service_spec.rb
+++ b/spec/services/webauthn/register_service_spec.rb
@@ -16,7 +16,7 @@ RSpec.describe Webauthn::RegisterService, feature_category: :system_access do
webauthn_credential = WebAuthn::Credential.from_create(create_result)
params = { device_response: create_result.to_json, name: 'abc' }
- service = Webauthn::RegisterService.new(user, params, challenge)
+ service = described_class.new(user, params, challenge)
registration = service.execute
expect(registration.credential_xid).to eq(Base64.strict_encode64(webauthn_credential.raw_id))
@@ -27,7 +27,7 @@ RSpec.describe Webauthn::RegisterService, feature_category: :system_access do
create_result = client.create(challenge: Base64.strict_encode64(SecureRandom.random_bytes(16))) # rubocop:disable Rails/SaveBang
params = { device_response: create_result.to_json, name: 'abc' }
- service = Webauthn::RegisterService.new(user, params, challenge)
+ service = described_class.new(user, params, challenge)
registration = service.execute
expect(registration.errors.size).to eq(1)
diff --git a/spec/services/work_items/export_csv_service_spec.rb b/spec/services/work_items/export_csv_service_spec.rb
index 948ff89245e..4566289231f 100644
--- a/spec/services/work_items/export_csv_service_spec.rb
+++ b/spec/services/work_items/export_csv_service_spec.rb
@@ -61,7 +61,7 @@ RSpec.describe WorkItems::ExportCsvService, :with_license, feature_category: :te
end
specify 'created_at' do
- expect(csv[0]['Created At (UTC)']).to eq(work_item_1.created_at.to_s(:csv))
+ expect(csv[0]['Created At (UTC)']).to eq(work_item_1.created_at.to_fs(:csv))
end
specify 'description' do
diff --git a/spec/services/work_items/update_service_spec.rb b/spec/services/work_items/update_service_spec.rb
index 30c16458353..8e19650d980 100644
--- a/spec/services/work_items/update_service_spec.rb
+++ b/spec/services/work_items/update_service_spec.rb
@@ -44,7 +44,7 @@ RSpec.describe WorkItems::UpdateService, feature_category: :team_planning do
context 'when work item type is not the default Issue' do
before do
task_type = WorkItems::Type.default_by_type(:task)
- work_item.update_columns(issue_type: task_type.base_type, work_item_type_id: task_type.id)
+ work_item.update_columns(work_item_type_id: task_type.id)
end
it 'does not apply the quick action' do
@@ -55,7 +55,7 @@ RSpec.describe WorkItems::UpdateService, feature_category: :team_planning do
end
context 'when work item type is the default Issue' do
- let(:issue) { create(:work_item, :issue, description: '') }
+ let(:issue) { create(:work_item, description: '') }
it 'applies the quick action' do
expect do
@@ -383,6 +383,38 @@ RSpec.describe WorkItems::UpdateService, feature_category: :team_planning do
end
end
end
+
+ context 'for current user todos widget' do
+ let_it_be(:user_todo) { create(:todo, target: work_item, user: developer, project: project, state: :pending) }
+ let_it_be(:other_todo) { create(:todo, target: work_item, user: create(:user), project: project, state: :pending) }
+
+ context 'when action is mark_as_done' do
+ let(:widget_params) { { current_user_todos_widget: { action: 'mark_as_done' } } }
+
+ it 'marks current user todo as done' do
+ expect do
+ update_work_item
+ user_todo.reload
+ other_todo.reload
+ end.to change(user_todo, :state).from('pending').to('done').and not_change { other_todo.state }
+ end
+
+ it_behaves_like 'update service that triggers GraphQL work_item_updated subscription' do
+ subject(:execute_service) { update_work_item }
+ end
+ end
+
+ context 'when action is add' do
+ let(:widget_params) { { current_user_todos_widget: { action: 'add' } } }
+
+ it 'adds a ToDo for the work item' do
+ expect do
+ update_work_item
+ work_item.reload
+ end.to change(Todo, :count).by(1)
+ end
+ end
+ end
end
describe 'label updates' do
diff --git a/spec/services/work_items/widgets/current_user_todos_service/update_service_spec.rb b/spec/services/work_items/widgets/current_user_todos_service/update_service_spec.rb
index 85b7e7a70df..aa7257e9e62 100644
--- a/spec/services/work_items/widgets/current_user_todos_service/update_service_spec.rb
+++ b/spec/services/work_items/widgets/current_user_todos_service/update_service_spec.rb
@@ -56,7 +56,7 @@ RSpec.describe WorkItems::Widgets::CurrentUserTodosService::UpdateService, featu
todo = current_user.todos.last
- expect(todo.target).to eq(work_item)
+ expect(todo.target.id).to eq(work_item.id)
expect(todo).to be_pending
end
end
diff --git a/spec/simplecov_env.rb b/spec/simplecov_env.rb
index bea312369f7..47a2f43e30c 100644
--- a/spec/simplecov_env.rb
+++ b/spec/simplecov_env.rb
@@ -3,7 +3,7 @@
require 'simplecov'
require 'simplecov-cobertura'
require 'simplecov-lcov'
-require_relative '../lib/gitlab/utils'
+require 'gitlab/utils/all'
module SimpleCovEnv
extend self
@@ -53,31 +53,40 @@ module SimpleCovEnv
def configure_profile
SimpleCov.configure do
load_profile 'test_frameworks'
- track_files '{app,config/initializers,config/initializers_before_autoloader,db/post_migrate,haml_lint,lib,rubocop,tooling}/**/*.rb'
- add_filter '/vendor/ruby/'
- add_filter '/bin/'
- add_filter 'db/fixtures/development/' # Matches EE files as well
- add_filter %r|db/migrate/\d{14}_init_schema\.rb\z|
+ add_filter %r{^/(ee/)?(bin|gems|vendor)}
+ add_filter %r{^/(ee/)?db/fixtures/development}
+ add_filter %r{^/(ee/)?db/migrate/\d{14}_init_schema\.rb\z}
- add_group 'Channels', 'app/channels' # Matches EE files as well
- add_group 'Controllers', 'app/controllers' # Matches EE files as well
- add_group 'Finders', 'app/finders' # Matches EE files as well
- add_group 'GraphQL', 'app/graphql' # Matches EE files as well
- add_group 'Helpers', 'app/helpers' # Matches EE files as well
- add_group 'Mailers', 'app/mailers' # Matches EE files as well
- add_group 'Models', 'app/models' # Matches EE files as well
- add_group 'Policies', 'app/policies' # Matches EE files as well
- add_group 'Presenters', 'app/presenters' # Matches EE files as well
- add_group 'Serializers', 'app/serializers' # Matches EE files as well
- add_group 'Services', 'app/services' # Matches EE files as well
- add_group 'Uploaders', 'app/uploaders' # Matches EE files as well
- add_group 'Validators', 'app/validators' # Matches EE files as well
- add_group 'Workers', %w[app/jobs app/workers] # Matches EE files as well
- add_group 'Initializers', %w[config/initializers config/initializers_before_autoloader] # Matches EE files as well
- add_group 'Migrations', %w[db/migrate db/optional_migrations db/post_migrate] # Matches EE files as well
- add_group 'Libraries', %w[/lib /ee/lib]
- add_group 'Tooling', %w[/haml_lint /rubocop /tooling]
+ add_group 'Channels', %r{^/(ee/)?app/channels}
+ add_group 'Components', %r{^/(ee/)?app/components}
+ add_group 'Config', %r{^/(ee/)?config}
+ add_group 'Controllers', %r{^/(ee/)?app/controllers}
+ add_group 'Elastic migrations', %r{^/(ee/)?elastic}
+ add_group 'Enums', %r{^/(ee/)?app/enums}
+ add_group 'Events', %r{^/(ee/)?app/events}
+ add_group 'Experiments', %r{^/(ee/)?app/experiments}
+ add_group 'Finders', %r{^/(ee/)?app/finders}
+ add_group 'Fixtures', %r{^/(ee/)?db/fixtures}
+ add_group 'GraphQL', %r{^/(ee/)?app/graphql}
+ add_group 'Helpers', %r{^/(ee/)?app/helpers}
+ add_group 'Libraries', %r{^/(ee/)?lib}
+ add_group 'Mailers', %r{^/(ee/)?app/mailers}
+ add_group 'Metrics server', %r{^/(ee/)?metrics_server}
+ add_group 'Migrations', %r{^/(ee/)?db/(geo/)?(migrate|optional_migrations|post_migrate)}
+ add_group 'Models', %r{^/(ee/)?app/models}
+ add_group 'Policies', %r{^/(ee/)?app/policies}
+ add_group 'Presenters', %r{^/(ee/)?app/presenters}
+ add_group 'Replicators', %r{^/(ee/)?app/replicators}
+ add_group 'Seeds', %r{^/(ee/)?db/seeds}
+ add_group 'Serializers', %r{^/(ee/)?app/serializers}
+ add_group 'Services', %r{^/(ee/)?app/services}
+ add_group 'Sidekiq cluster', %r{^/(ee/)?sidekiq_cluster}
+ add_group 'Tooling', %r{^/(ee/)?(danger|haml_lint|rubocop|scripts|tooling)}
+ add_group 'Uploaders', %r{^/(ee/)?app/uploaders}
+ add_group 'Validators', %r{^/(ee/)?app/validators}
+ add_group 'Views', %r{^/(ee/)?app/views}
+ add_group 'Workers', %r{^/(ee/)?app/workers}
merge_timeout 365 * 24 * 3600
end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index a2afa3d0ca7..4d66784d943 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -38,6 +38,8 @@ require 'test_prof/factory_prof/nate_heckler'
require 'parslet/rig/rspec'
require 'axe-rspec'
+require 'rspec_flaky'
+
rspec_profiling_is_configured =
ENV['RSPEC_PROFILING_POSTGRES_URL'].present? ||
ENV['RSPEC_PROFILING']
@@ -100,6 +102,32 @@ RSpec.configure do |config|
end
end
+ config.after do |example|
+ # We fail early if we detect a PG::QueryCanceled error
+ #
+ # See https://gitlab.com/gitlab-org/gitlab/-/issues/402915
+ if example.exception && example.exception.message.include?('PG::QueryCanceled')
+ ENV['RSPEC_BYPASS_SYSTEM_EXIT_PROTECTION'] = 'true'
+
+ warn
+ warn "********************************************************************************************"
+ warn "********************************************************************************************"
+ warn "********************************************************************************************"
+ warn "* *"
+ warn "* We have detected a PG::QueryCanceled error in the specs, so we're failing early. *"
+ warn "* Please retry this job. *"
+ warn "* *"
+ warn "* See https://gitlab.com/gitlab-org/gitlab/-/issues/402915 for more info. *"
+ warn "* *"
+ warn "********************************************************************************************"
+ warn "********************************************************************************************"
+ warn "********************************************************************************************"
+ warn
+
+ exit 3
+ end
+ end
+
config.define_derived_metadata(file_path: %r{(ee)?/spec/.+_spec\.rb\z}) do |metadata|
location = metadata[:location]
@@ -124,7 +152,7 @@ RSpec.configure do |config|
# Admin controller specs get auto admin mode enabled since they are
# protected by the 'EnforcesAdminAuthentication' concern
- metadata[:enable_admin_mode] = true if location =~ %r{(ee)?/spec/controllers/admin/}
+ metadata[:enable_admin_mode] = true if %r{(ee)?/spec/controllers/admin/}.match?(location)
end
config.define_derived_metadata(file_path: %r{(ee)?/spec/.+_docs\.rb\z}) do |metadata|
@@ -202,11 +230,7 @@ RSpec.configure do |config|
config.exceptions_to_hard_fail = [DeprecationToolkitEnv::DeprecationBehaviors::SelectiveRaise::RaiseDisallowedDeprecation]
end
- require_relative '../tooling/rspec_flaky/config'
-
if RspecFlaky::Config.generate_report?
- require_relative '../tooling/rspec_flaky/listener'
-
config.reporter.register_listener(
RspecFlaky::Listener.new,
:example_passed,
@@ -312,6 +336,9 @@ RSpec.configure do |config|
# most cases. We do test the email verification flow in the appropriate specs.
stub_feature_flags(require_email_verification: false)
+ # Keep-around refs should only be turned off for specific projects/repositories.
+ stub_feature_flags(disable_keep_around_refs: false)
+
allow(Gitlab::GitalyClient).to receive(:can_use_disk?).and_return(enable_rugged)
else
unstub_all_feature_flags
@@ -407,7 +434,7 @@ RSpec.configure do |config|
Gitlab::SidekiqMiddleware.server_configurator(
metrics: false, # The metrics don't go anywhere in tests
arguments_logger: false, # We're not logging the regular messages for inline jobs
- defer_jobs: false # We're not deferring jobs for inline tests
+ skip_jobs: false # We're not skipping jobs for inline tests
).call(chain)
chain.add DisableQueryLimit
chain.insert_after ::Gitlab::SidekiqMiddleware::RequestStoreMiddleware, IsolatedRequestStore
diff --git a/spec/support/ability_check.rb b/spec/support/ability_check.rb
index 213944506bb..5b56b9925f6 100644
--- a/spec/support/ability_check.rb
+++ b/spec/support/ability_check.rb
@@ -1,6 +1,6 @@
# frozen_string_literal: true
-require 'gitlab/utils/strong_memoize'
+require 'gitlab/utils/all'
module Support
module AbilityCheck
diff --git a/spec/support/capybara.rb b/spec/support/capybara.rb
index c7b2a03fde2..392743fda4a 100644
--- a/spec/support/capybara.rb
+++ b/spec/support/capybara.rb
@@ -5,6 +5,7 @@ require 'capybara/rails'
require 'capybara/rspec'
require 'capybara-screenshot/rspec'
require 'selenium-webdriver'
+require 'gitlab/utils/all'
# Give CI some extra time
timeout = ENV['CI'] || ENV['CI_SERVER'] ? 30 : 10
@@ -117,7 +118,7 @@ Capybara.register_driver :firefox do |app|
options.add_argument("--window-size=#{CAPYBARA_WINDOW_SIZE.join(',')}")
# Run headless by default unless WEBDRIVER_HEADLESS specified
- options.add_argument("--headless") unless ENV['WEBDRIVER_HEADLESS'] =~ /^(false|no|0)$/i
+ options.add_argument("--headless") unless Gitlab::Utils.to_boolean(ENV['WEBDRIVER_HEADLESS'], default: false)
Capybara::Selenium::Driver.new(
app,
@@ -233,5 +234,6 @@ RSpec.configure do |config|
# We don't reset the session when the example failed, because we need capybara-screenshot to have access to it.
Capybara.reset_sessions! unless example.exception
block_and_wait_for_requests_complete
+ block_and_wait_for_action_cable_requests_complete
end
end
diff --git a/spec/support/database/click_house/hooks.rb b/spec/support/database/click_house/hooks.rb
new file mode 100644
index 00000000000..27abd19dc3f
--- /dev/null
+++ b/spec/support/database/click_house/hooks.rb
@@ -0,0 +1,55 @@
+# frozen_string_literal: true
+
+# rubocop: disable Gitlab/NamespacedClass
+class ClickHouseTestRunner
+ def truncate_tables
+ ClickHouse::Client.configuration.databases.each_key do |db|
+ tables_for(db).each do |table|
+ ClickHouse::Client.execute("TRUNCATE TABLE #{table}", db)
+ end
+ end
+ end
+
+ def ensure_schema
+ return if @ensure_schema
+
+ ClickHouse::Client.configuration.databases.each_key do |db|
+ # drop all tables
+ lookup_tables(db).each do |table|
+ ClickHouse::Client.execute("DROP TABLE IF EXISTS #{table}", db)
+ end
+
+ # run the schema SQL files
+ Dir[Rails.root.join("db/click_house/#{db}/*.sql")].each do |file|
+ ClickHouse::Client.execute(File.read(file), db)
+ end
+ end
+
+ @ensure_schema = true
+ end
+
+ private
+
+ def tables_for(db)
+ @tables ||= {}
+ @tables[db] ||= lookup_tables(db)
+ end
+
+ def lookup_tables(db)
+ ClickHouse::Client.select('SHOW TABLES', db).pluck('name')
+ end
+end
+# rubocop: enable Gitlab/NamespacedClass
+
+RSpec.configure do |config|
+ click_house_test_runner = ClickHouseTestRunner.new
+
+ config.around(:each, :click_house) do |example|
+ with_net_connect_allowed do
+ click_house_test_runner.ensure_schema
+ click_house_test_runner.truncate_tables
+
+ example.run
+ end
+ end
+end
diff --git a/spec/support/database/prevent_cross_joins.rb b/spec/support/database/prevent_cross_joins.rb
index 540c287bdad..443216ba9df 100644
--- a/spec/support/database/prevent_cross_joins.rb
+++ b/spec/support/database/prevent_cross_joins.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
# This module tries to discover and prevent cross-joins across tables
-# This will forbid usage of tables between CI and main database
+# This will forbid usage of tables of different gitlab_schemas
# on a same query unless explicitly allowed by. This will change execution
# from a given point to allow cross-joins. The state will be cleared
# on a next test run.
diff --git a/spec/support/db_cleaner.rb b/spec/support/db_cleaner.rb
index b9a99eff413..17b4270fa20 100644
--- a/spec/support/db_cleaner.rb
+++ b/spec/support/db_cleaner.rb
@@ -99,7 +99,7 @@ module DbCleaner
AND pid <> pg_backend_pid();
SQL
- Gitlab::Database::EachDatabase.each_database_connection(include_shared: false) do |connection|
+ Gitlab::Database::EachDatabase.each_connection(include_shared: false) do |connection|
connection.execute(cmd)
end
diff --git a/spec/support/finder_collection_allowlist.yml b/spec/support/finder_collection_allowlist.yml
index 7ac7e88867a..5de8e8cdca2 100644
--- a/spec/support/finder_collection_allowlist.yml
+++ b/spec/support/finder_collection_allowlist.yml
@@ -6,6 +6,7 @@
- Namespaces::BilledUsersFinder # Reason: There is no need to have anything else besides the ids is current structure
- Namespaces::FreeUserCap::UsersFinder # Reason: There is no need to have anything else besides the count
- Groups::EnvironmentScopesFinder # Reason: There is no need to have anything else besides the simple strucutre with the scope name
+- Security::RelatedPipelinesFinder # Reason: There is no need to have anything else besides the IDs of pipelines
# Temporary excludes (aka TODOs)
# For example:
diff --git a/spec/support/formatters/json_formatter.rb b/spec/support/formatters/json_formatter.rb
index 10af5445b7a..1fb0c7c91ec 100644
--- a/spec/support/formatters/json_formatter.rb
+++ b/spec/support/formatters/json_formatter.rb
@@ -26,11 +26,15 @@ module Support
hash[:exceptions] = exceptions.map do |exception|
hash = {
class: exception.class.name,
- message: exception.message,
- message_lines: strip_ansi_codes(notification.message_lines),
- backtrace: notification.formatted_backtrace
+ message: exception.message
}
+ hash[:backtrace] = notification.formatted_backtrace if notification.respond_to?(:formatted_backtrace)
+
+ if notification.respond_to?(:message_lines)
+ hash[:message_lines] = strip_ansi_codes(notification.message_lines)
+ end
+
if loglinking
hash.merge!(
correlation_id: exception.message[match_data_after(loglinking::CORRELATION_ID_TITLE)],
@@ -74,7 +78,8 @@ module Support
product_group: example.metadata[:product_group],
feature_category: example.metadata[:feature_category],
ci_job_url: ENV['CI_JOB_URL'],
- retry_attempts: example.metadata[:retry_attempts]
+ retry_attempts: example.metadata[:retry_attempts],
+ level: example.metadata[:level]
}
end
diff --git a/spec/support/helpers/content_editor_helpers.rb b/spec/support/helpers/content_editor_helpers.rb
index 83c18f8073f..a6cc2560d0b 100644
--- a/spec/support/helpers/content_editor_helpers.rb
+++ b/spec/support/helpers/content_editor_helpers.rb
@@ -1,8 +1,16 @@
# frozen_string_literal: true
module ContentEditorHelpers
+ def close_rich_text_promo_popover_if_present
+ return unless page.has_css?("[data-testid='rich-text-promo-popover']")
+
+ page.within("[data-testid='rich-text-promo-popover']") do
+ click_button "Close"
+ end
+ end
+
def switch_to_content_editor
- click_button("Switch to rich text")
+ click_button("Switch to rich text editing")
end
def type_in_content_editor(keys)
diff --git a/spec/support/helpers/database/migration_testing_helpers.rb b/spec/support/helpers/database/migration_testing_helpers.rb
index 916446e66b7..87557860ab6 100644
--- a/spec/support/helpers/database/migration_testing_helpers.rb
+++ b/spec/support/helpers/database/migration_testing_helpers.rb
@@ -2,11 +2,13 @@
module Database
module MigrationTestingHelpers
- def define_background_migration(name)
- klass = Class.new do
+ def define_background_migration(name, with_base_class: false, scoping: nil)
+ klass = Class.new(with_base_class ? Gitlab::BackgroundMigration::BatchedMigrationJob : Object) 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) }
+
+ scope_to(scoping) if scoping
end
stub_const("Gitlab::BackgroundMigration::#{name}", klass)
klass
diff --git a/spec/support/helpers/database/multiple_databases_helpers.rb b/spec/support/helpers/database/multiple_databases_helpers.rb
index fcdf820642d..bccd6979af1 100644
--- a/spec/support/helpers/database/multiple_databases_helpers.rb
+++ b/spec/support/helpers/database/multiple_databases_helpers.rb
@@ -19,7 +19,7 @@ module Database
def execute_on_each_database(query, databases: %I[main ci])
databases = databases.select { |database_name| database_exists?(database_name) }
- Gitlab::Database::EachDatabase.each_database_connection(only: databases, include_shared: false) do |connection, _|
+ Gitlab::Database::EachDatabase.each_connection(only: databases, include_shared: false) do |connection, _|
next unless Gitlab::Database.gitlab_schemas_for_connection(connection).include?(:gitlab_shared)
connection.execute(query)
diff --git a/spec/support/helpers/emails_helper_test_helper.rb b/spec/support/helpers/emails_helper_test_helper.rb
index ea7dbc89ebd..572b2f6853d 100644
--- a/spec/support/helpers/emails_helper_test_helper.rb
+++ b/spec/support/helpers/emails_helper_test_helper.rb
@@ -2,7 +2,7 @@
module EmailsHelperTestHelper
def default_header_logo
- %r{<img alt="GitLab" src="/images/mailers/gitlab_logo\.(?:gif|png)" width="\d+" height="\d+" />}
+ %r{<img alt="GitLab" src="http://test.host/images/mailers/gitlab_logo\.(?:gif|png)" width="\d+" height="\d+" />}
end
end
diff --git a/spec/support/helpers/features/autocomplete_helpers.rb b/spec/support/helpers/features/autocomplete_helpers.rb
new file mode 100644
index 00000000000..106e823afef
--- /dev/null
+++ b/spec/support/helpers/features/autocomplete_helpers.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+module Features
+ module AutocompleteHelpers
+ def find_autocomplete_menu
+ find('.atwho-view ul', visible: true)
+ end
+
+ def find_highlighted_autocomplete_item
+ find('.atwho-view li.cur', visible: true)
+ end
+ end
+end
diff --git a/spec/support/helpers/features/invite_members_modal_helpers.rb b/spec/support/helpers/features/invite_members_modal_helpers.rb
index 75573616686..deb75cffe0d 100644
--- a/spec/support/helpers/features/invite_members_modal_helpers.rb
+++ b/spec/support/helpers/features/invite_members_modal_helpers.rb
@@ -52,7 +52,7 @@ module Features
click_on 'Select a group'
wait_for_requests
- click_button name
+ find('[role="option"]', text: name).click
choose_options(role, expires_at)
submit_invites
diff --git a/spec/support/helpers/features/iteration_helpers.rb b/spec/support/helpers/features/iteration_helpers.rb
index fab373a547f..7ae546fb83c 100644
--- a/spec/support/helpers/features/iteration_helpers.rb
+++ b/spec/support/helpers/features/iteration_helpers.rb
@@ -3,7 +3,7 @@
module Features
module IterationHelpers
def iteration_period(iteration)
- "#{iteration.start_date.to_s(:medium)} - #{iteration.due_date.to_s(:medium)}"
+ "#{iteration.start_date.to_fs(:medium)} - #{iteration.due_date.to_fs(:medium)}"
end
end
end
diff --git a/spec/support/helpers/gitaly_setup.rb b/spec/support/helpers/gitaly_setup.rb
index 7db9e0aaf09..06390406efc 100644
--- a/spec/support/helpers/gitaly_setup.rb
+++ b/spec/support/helpers/gitaly_setup.rb
@@ -10,8 +10,7 @@ require 'securerandom'
require 'socket'
require 'logger'
require 'fileutils'
-
-require_relative '../../../lib/gitlab/utils'
+require 'gitlab/utils/all'
module GitalySetup
extend self
diff --git a/spec/support/helpers/graphql_helpers.rb b/spec/support/helpers/graphql_helpers.rb
index a9ad853b028..62e05129fb2 100644
--- a/spec/support/helpers/graphql_helpers.rb
+++ b/spec/support/helpers/graphql_helpers.rb
@@ -473,7 +473,7 @@ module GraphqlHelpers
end
def with_signature(variables, query)
- %Q[query(#{variables.map(&:sig).join(', ')}) #{wrap_query(query)}]
+ %[query(#{variables.map(&:sig).join(', ')}) #{wrap_query(query)}]
end
def var(type)
diff --git a/spec/support/helpers/ldap_helpers.rb b/spec/support/helpers/ldap_helpers.rb
index 48b593fb3d1..84b06747f45 100644
--- a/spec/support/helpers/ldap_helpers.rb
+++ b/spec/support/helpers/ldap_helpers.rb
@@ -17,7 +17,7 @@ module LdapHelpers
# admin_group: 'my-admin-group'
# )
def stub_ldap_config(messages)
- allow_any_instance_of(::Gitlab::Auth::Ldap::Config).to receive_messages(messages)
+ allow_any_instance_of(::Gitlab::Auth::Ldap::Config).to receive_messages(to_settings(messages))
end
def stub_ldap_setting(messages)
diff --git a/spec/support/helpers/next_found_instance_of.rb b/spec/support/helpers/next_found_instance_of.rb
index c7079e64ffd..f53798c1856 100644
--- a/spec/support/helpers/next_found_instance_of.rb
+++ b/spec/support/helpers/next_found_instance_of.rb
@@ -2,7 +2,7 @@
module NextFoundInstanceOf
ERROR_MESSAGE = 'NextFoundInstanceOf mock helpers can only be used with ActiveRecord targets'
- HELPER_METHOD_PATTERN = /(?:allow|expect)_next_found_(?<number>\d+)_instances_of/.freeze
+ HELPER_METHOD_PATTERN = /(?:allow|expect)_next_found_(?<number>\d+)_instances_of/
def method_missing(method_name, ...)
return super unless match_data = method_name.match(HELPER_METHOD_PATTERN)
diff --git a/spec/support/helpers/next_instance_of.rb b/spec/support/helpers/next_instance_of.rb
index 3c88715615d..5cc63fe5c6e 100644
--- a/spec/support/helpers/next_instance_of.rb
+++ b/spec/support/helpers/next_instance_of.rb
@@ -31,8 +31,9 @@ module NextInstanceOf
receive_new.exactly(number).times
end
- target.to receive_new.and_wrap_original do |method, *original_args|
- method.call(*original_args).tap(&blk)
+ target.to receive_new.and_wrap_original do |*original_args, **original_kwargs|
+ method, *original_args = original_args
+ method.call(*original_args, **original_kwargs).tap(&blk)
end
end
end
diff --git a/spec/support/helpers/redis_helpers.rb b/spec/support/helpers/redis_helpers.rb
index 2c5ceb2f09e..b501ee79b26 100644
--- a/spec/support/helpers/redis_helpers.rb
+++ b/spec/support/helpers/redis_helpers.rb
@@ -6,4 +6,22 @@ module RedisHelpers
instance_class.with(&:flushdb)
end
end
+
+ # Defines a class of wrapper that uses `resque.yml` regardless of `config/redis.yml.example`
+ # this allows us to test against a standalone Redis even if Cache and SharedState are using
+ # Redis Cluster. We do not use queue as it does not perform redis cluster validations.
+ def define_helper_redis_store_class(store_name = "Sessions")
+ Class.new(Gitlab::Redis::Wrapper) do
+ define_singleton_method(:name) { store_name }
+
+ def config_file_name
+ config_file_name = "spec/fixtures/config/redis_new_format_host.yml"
+ Rails.root.join(config_file_name).to_s
+ end
+ end
+ end
+
+ def create_redis_store(options, extras = {})
+ ::Redis::Store.new(options.merge(extras))
+ end
end
diff --git a/spec/support/helpers/reload_helpers.rb b/spec/support/helpers/reload_helpers.rb
index 71becd535b0..6b120c61ff2 100644
--- a/spec/support/helpers/reload_helpers.rb
+++ b/spec/support/helpers/reload_helpers.rb
@@ -4,9 +4,4 @@ module ReloadHelpers
def reload_models(*models)
models.compact.map(&:reload)
end
-
- def subject_and_reload(...)
- subject
- reload_models(...)
- end
end
diff --git a/spec/support/helpers/require_migration.rb b/spec/support/helpers/require_migration.rb
index ee28f8e504c..c9cb7b4d90c 100644
--- a/spec/support/helpers/require_migration.rb
+++ b/spec/support/helpers/require_migration.rb
@@ -15,7 +15,7 @@ class RequireMigration
end
MIGRATION_FOLDERS = %w[db/migrate db/post_migrate].freeze
- SPEC_FILE_PATTERN = %r{.+/(?:\d+_)?(?<file_name>.+)_spec\.rb}.freeze
+ SPEC_FILE_PATTERN = %r{.+/(?:\d+_)?(?<file_name>.+)_spec\.rb}
class << self
def require_migration!(file_name)
diff --git a/spec/support/helpers/stub_env.rb b/spec/support/helpers/stub_env.rb
deleted file mode 100644
index afa501d6279..00000000000
--- a/spec/support/helpers/stub_env.rb
+++ /dev/null
@@ -1,52 +0,0 @@
-# frozen_string_literal: true
-
-# Inspired by https://github.com/ljkbennett/stub_env/blob/master/lib/stub_env/helpers.rb
-module StubENV
- # Stub ENV variables
- #
- # You can provide either a key and value as separate params or both in a Hash format
- #
- # Keys and values will always be converted to String, to comply with how ENV behaves
- #
- # @param key_or_hash [String, Hash<String,String>]
- # @param value [String]
- def stub_env(key_or_hash, value = nil)
- init_stub unless env_stubbed?
-
- if key_or_hash.is_a? Hash
- key_or_hash.each do |key, value|
- add_stubbed_value(key, ensure_env_type(value))
- end
- else
- add_stubbed_value key_or_hash, ensure_env_type(value)
- end
- end
-
- private
-
- STUBBED_KEY = '__STUBBED__'
-
- def add_stubbed_value(key, value)
- allow(ENV).to receive(:[]).with(key).and_return(value)
- allow(ENV).to receive(:key?).with(key).and_return(true)
- allow(ENV).to receive(:fetch).with(key).and_return(value)
- allow(ENV).to receive(:fetch).with(key, anything) do |_, default_val|
- value || default_val
- end
- end
-
- def env_stubbed?
- ENV[STUBBED_KEY]
- end
-
- def init_stub
- allow(ENV).to receive(:[]).and_call_original
- allow(ENV).to receive(:key?).and_call_original
- allow(ENV).to receive(:fetch).and_call_original
- add_stubbed_value(STUBBED_KEY, true)
- end
-
- def ensure_env_type(value)
- value.nil? ? value : value.to_s
- end
-end
diff --git a/spec/support/helpers/test_env.rb b/spec/support/helpers/test_env.rb
index da4954c1a5f..b95adb3fe4d 100644
--- a/spec/support/helpers/test_env.rb
+++ b/spec/support/helpers/test_env.rb
@@ -523,7 +523,7 @@ module TestEnv
def component_matches_git_sha?(component_folder, expected_version)
# Not a git SHA, so return early
- return false unless expected_version =~ ::Gitlab::Git::COMMIT_ID
+ return false unless ::Gitlab::Git::COMMIT_ID.match?(expected_version)
return false unless Dir.exist?(component_folder)
diff --git a/spec/support/helpers/usage_data_helpers.rb b/spec/support/helpers/usage_data_helpers.rb
index 73f7a79dd5b..8ac3b0c134b 100644
--- a/spec/support/helpers/usage_data_helpers.rb
+++ b/spec/support/helpers/usage_data_helpers.rb
@@ -50,8 +50,6 @@ module UsageDataHelpers
projects_asana_active
projects_jenkins_active
projects_jira_active
- projects_jira_dvcs_cloud_active
- projects_jira_dvcs_server_active
projects_slack_active
projects_slack_slash_commands_active
projects_custom_issue_tracker_active
diff --git a/spec/support/helpers/wait_for_requests.rb b/spec/support/helpers/wait_for_requests.rb
index 5e2e8ad53e0..b7a3b77a694 100644
--- a/spec/support/helpers/wait_for_requests.rb
+++ b/spec/support/helpers/wait_for_requests.rb
@@ -27,6 +27,17 @@ module WaitForRequests
Gitlab::Testing::RequestBlockerMiddleware.allow_requests!
end
+ def block_and_wait_for_action_cable_requests_complete
+ block_action_cable_requests { wait_for_action_cable_requests }
+ end
+
+ def block_action_cable_requests
+ Gitlab::Testing::ActionCableBlocker.block_requests!
+ yield
+ ensure
+ Gitlab::Testing::ActionCableBlocker.allow_requests!
+ end
+
# Wait for client-side AJAX requests
def wait_for_requests
wait_for('JS requests complete', max_wait_time: 2 * Capybara.default_max_wait_time) do
@@ -42,6 +53,12 @@ module WaitForRequests
end
end
+ def wait_for_action_cable_requests
+ wait_for('Action Cable requests complete') do
+ Gitlab::Testing::ActionCableBlocker.num_active_requests == 0
+ end
+ end
+
private
def finished_all_rack_requests?
diff --git a/spec/support/import_export/configuration_helper.rb b/spec/support/import_export/configuration_helper.rb
index b731ee626c0..28797229661 100644
--- a/spec/support/import_export/configuration_helper.rb
+++ b/spec/support/import_export/configuration_helper.rb
@@ -4,7 +4,7 @@ module ConfigurationHelper
# Returns a list of models from hashes/arrays contained in +project_tree+
def names_from_tree(project_tree)
project_tree.map do |branch_or_model|
- branch_or_model = branch_or_model.to_s if branch_or_model.is_a?(Symbol)
+ branch_or_model = branch_or_model.to_s if branch_or_model.is_a?(Symbol)
branch_or_model.is_a?(String) ? branch_or_model : names_from_tree(branch_or_model)
end
diff --git a/spec/support/import_export/export_file_helper.rb b/spec/support/import_export/export_file_helper.rb
index ee1b4a3c33a..3be2d39906d 100644
--- a/spec/support/import_export/export_file_helper.rb
+++ b/spec/support/import_export/export_file_helper.rb
@@ -92,7 +92,7 @@ module ExportFileHelper
end
# Returns the offended ObjectWithParent object if a sensitive word is found inside a hash,
- # excluding the whitelisted safe hashes.
+ # excluding the allowlisted safe hashes.
def find_sensitive_attributes(sensitive_word, project_hash)
loop do
object_with_parent = deep_find_with_parent(sensitive_word, project_hash)
diff --git a/spec/support/matchers/exceed_query_limit.rb b/spec/support/matchers/exceed_query_limit.rb
index 4b08c13945c..29ebe5a3918 100644
--- a/spec/support/matchers/exceed_query_limit.rb
+++ b/spec/support/matchers/exceed_query_limit.rb
@@ -63,7 +63,7 @@ module ExceedQueryLimitHelpers
end
end
- MARGINALIA_ANNOTATION_REGEX = %r{\s*/\*.*\*/}.freeze
+ MARGINALIA_ANNOTATION_REGEX = %r{\s*/\*.*\*/}
DB_QUERY_RE = Regexp.union(
[
diff --git a/spec/support/matchers/have_native_text_validation_message.rb b/spec/support/matchers/have_native_text_validation_message.rb
new file mode 100644
index 00000000000..3923086dc70
--- /dev/null
+++ b/spec/support/matchers/have_native_text_validation_message.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+RSpec::Matchers.define :have_native_text_validation_message do |field|
+ match do |page|
+ message = page.find_field(field).native.attribute('validationMessage')
+ expect(message).to match(/Please fill [a-z]+ this field./)
+ end
+end
diff --git a/spec/support/matchers/result_matchers.rb b/spec/support/matchers/result_matchers.rb
new file mode 100644
index 00000000000..4fc2c06ba69
--- /dev/null
+++ b/spec/support/matchers/result_matchers.rb
@@ -0,0 +1,66 @@
+# frozen_string_literal: true
+
+# Example usage:
+#
+# expect(Result.ok(1)).to be_ok_result(1)
+#
+# expect(Result.err('hello')).to be_err_result do |result_value|
+# expect(result_value).to match(/hello/i)
+# end
+#
+# Argument to matcher is the expected value to be matched via '=='.
+# For more complex matching, pass a block to the matcher which will receive the result value as an argument.
+
+module ResultMatchers
+ def be_ok_result(expected_value = nil)
+ BeResult.new(ok_or_err: :ok, expected_value: expected_value)
+ end
+
+ def be_err_result(expected_value = nil)
+ BeResult.new(ok_or_err: :err, expected_value: expected_value)
+ end
+
+ class BeResult
+ attr_reader :ok_or_err, :actual, :failure_message_suffix, :expected_value
+
+ def initialize(ok_or_err:, expected_value:)
+ @ok_or_err = ok_or_err
+ @expected_value = expected_value
+ end
+
+ def matches?(actual, &block)
+ @actual = actual
+
+ raise "#{actual} must be a #{::Result}, but it was a #{actual.class}" unless actual.is_a?(::Result)
+
+ @failure_message_suffix = "be an '#{ok_or_err}' type"
+ return false unless actual.ok? == ok?
+
+ actual_value = actual.ok? ? actual.unwrap : actual.unwrap_err
+
+ if expected_value
+ @failure_message_suffix =
+ "have a value of #{expected_value.inspect}, but it was #{actual_value.inspect}"
+ return false unless actual_value == expected_value
+ end
+
+ # NOTE: A block can be passed to the matcher to perform more sophisticated matching,
+ # or to provide more concise and specific failure messages.
+ block ? block.yield(actual_value) : true
+ end
+
+ def failure_message
+ "expected #{actual.inspect} to #{failure_message_suffix}"
+ end
+
+ def failure_message_when_negated
+ "expected #{actual.inspect} not to #{failure_message_suffix}"
+ end
+
+ private
+
+ def ok?
+ ok_or_err == :ok
+ end
+ end
+end
diff --git a/spec/support/rspec.rb b/spec/support/rspec.rb
index 94c43669173..4479e679d67 100644
--- a/spec/support/rspec.rb
+++ b/spec/support/rspec.rb
@@ -5,10 +5,10 @@ require_relative "system_exit_detected"
require_relative "helpers/stub_configuration"
require_relative "helpers/stub_metrics"
require_relative "helpers/stub_object_storage"
-require_relative "helpers/stub_env"
require_relative "helpers/fast_rails_root"
-require_relative "../../lib/gitlab/utils"
+require 'gitlab/rspec/all'
+require 'gitlab/utils/all'
RSpec::Expectations.configuration.on_potential_false_positives = :raise
diff --git a/spec/support/rspec_order_todo.yml b/spec/support/rspec_order_todo.yml
index 4168820a2b3..3cce22c00e6 100644
--- a/spec/support/rspec_order_todo.yml
+++ b/spec/support/rspec_order_todo.yml
@@ -166,7 +166,6 @@
- './ee/spec/controllers/security/vulnerabilities_controller_spec.rb'
- './ee/spec/controllers/sitemap_controller_spec.rb'
- './ee/spec/controllers/subscriptions_controller_spec.rb'
-- './ee/spec/controllers/subscriptions/groups_controller_spec.rb'
- './ee/spec/controllers/trial_registrations_controller_spec.rb'
- './ee/spec/controllers/users_controller_spec.rb'
- './ee/spec/db/production/license_spec.rb'
@@ -1213,8 +1212,6 @@
- './ee/spec/lib/elastic/latest/merge_request_config_spec.rb'
- './ee/spec/lib/elastic/latest/note_config_spec.rb'
- './ee/spec/lib/elastic/latest/project_instance_proxy_spec.rb'
-- './ee/spec/lib/elastic/latest/project_wiki_class_proxy_spec.rb'
-- './ee/spec/lib/elastic/latest/project_wiki_instance_proxy_spec.rb'
- './ee/spec/lib/elastic/latest/routing_spec.rb'
- './ee/spec/lib/elastic/latest/snippet_instance_proxy_spec.rb'
- './ee/spec/lib/elastic/migration_spec.rb'
@@ -1523,8 +1520,6 @@
- './ee/spec/lib/gitlab/usage/metrics/instrumentations/count_groups_with_event_streaming_destinations_metric_spec.rb'
- './ee/spec/lib/gitlab/usage/metrics/instrumentations/count_projects_with_external_status_checks_metric_spec.rb'
- './ee/spec/lib/gitlab/usage/metrics/instrumentations/count_saml_group_links_metric_spec.rb'
-- './ee/spec/lib/gitlab/usage/metrics/instrumentations/count_slack_app_installations_gbp_metric_spec.rb'
-- './ee/spec/lib/gitlab/usage/metrics/instrumentations/count_slack_app_installations_metric_spec.rb'
- './ee/spec/lib/gitlab/usage/metrics/instrumentations/count_users_associating_group_milestones_to_releases_metric_spec.rb'
- './ee/spec/lib/gitlab/usage/metrics/instrumentations/count_users_creating_ci_builds_metric_spec.rb'
- './ee/spec/lib/gitlab/usage/metrics/instrumentations/count_users_deployment_approvals_spec.rb'
@@ -3538,8 +3533,6 @@
- './spec/db/schema_spec.rb'
- './spec/dependencies/omniauth_saml_spec.rb'
- './spec/experiments/application_experiment_spec.rb'
-- './spec/experiments/concerns/project_commit_count_spec.rb'
-- './spec/experiments/force_company_trial_experiment_spec.rb'
- './spec/experiments/in_product_guidance_environments_webide_experiment_spec.rb'
- './spec/experiments/ios_specific_templates_experiment_spec.rb'
- './spec/features/abuse_report_spec.rb'
@@ -4151,7 +4144,6 @@
- './spec/features/projects/settings/registry_settings_spec.rb'
- './spec/features/projects/settings/repository_settings_spec.rb'
- './spec/features/projects/settings/secure_files_spec.rb'
-- './spec/features/projects/settings/service_desk_setting_spec.rb'
- './spec/features/projects/settings/user_archives_project_spec.rb'
- './spec/features/projects/settings/user_changes_avatar_spec.rb'
- './spec/features/projects/settings/user_changes_default_branch_spec.rb'
@@ -5251,7 +5243,6 @@
- './spec/lib/atlassian/jira_connect/serializers/base_entity_spec.rb'
- './spec/lib/atlassian/jira_connect/serializers/branch_entity_spec.rb'
- './spec/lib/atlassian/jira_connect/serializers/build_entity_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/serializers/pull_request_entity_spec.rb'
- './spec/lib/atlassian/jira_connect/serializers/repository_entity_spec.rb'
@@ -6492,7 +6483,6 @@
- './spec/lib/gitlab/graphql/batch_key_spec.rb'
- './spec/lib/gitlab/graphql/calls_gitaly/field_extension_spec.rb'
- './spec/lib/gitlab/graphql/copy_field_description_spec.rb'
-- './spec/lib/gitlab/graphql/generic_tracing_spec.rb'
- './spec/lib/gitlab/graphql/known_operations_spec.rb'
- './spec/lib/gitlab/graphql/lazy_spec.rb'
- './spec/lib/gitlab/graphql/loaders/batch_commit_loader_spec.rb'
@@ -9064,7 +9054,6 @@
- './spec/services/clusters/create_service_spec.rb'
- './spec/services/clusters/destroy_service_spec.rb'
- './spec/services/clusters/integrations/create_service_spec.rb'
-- './spec/services/clusters/integrations/prometheus_health_check_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/kubernetes/fetch_kubernetes_token_service_spec.rb'
@@ -9126,10 +9115,6 @@
- './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/error_tracking/issue_details_service_spec.rb'
-- './spec/services/error_tracking/issue_latest_event_service_spec.rb'
-- './spec/services/error_tracking/issue_update_service_spec.rb'
-- './spec/services/error_tracking/list_issues_service_spec.rb'
- './spec/services/error_tracking/list_projects_service_spec.rb'
- './spec/services/event_create_service_spec.rb'
- './spec/services/events/destroy_service_spec.rb'
@@ -9694,7 +9679,6 @@
- './spec/support_specs/helpers/stub_method_calls_spec.rb'
- './spec/support_specs/matchers/be_sorted_spec.rb'
- './spec/support_specs/matchers/exceed_query_limit_helpers_spec.rb'
-- './spec/support_specs/time_travel_spec.rb'
- './spec/tasks/admin_mode_spec.rb'
- './spec/tasks/cache/clear/redis_spec.rb'
- './spec/tasks/config_lint_spec.rb'
@@ -9763,12 +9747,6 @@
- './spec/tooling/lib/tooling/test_map_packer_spec.rb'
- './spec/tooling/merge_request_spec.rb'
- './spec/tooling/quality/test_level_spec.rb'
-- './spec/tooling/rspec_flaky/config_spec.rb'
-- './spec/tooling/rspec_flaky/example_spec.rb'
-- './spec/tooling/rspec_flaky/flaky_examples_collection_spec.rb'
-- './spec/tooling/rspec_flaky/flaky_example_spec.rb'
-- './spec/tooling/rspec_flaky/listener_spec.rb'
-- './spec/tooling/rspec_flaky/report_spec.rb'
- './spec/uploaders/attachment_uploader_spec.rb'
- './spec/uploaders/avatar_uploader_spec.rb'
- './spec/uploaders/ci/pipeline_artifact_uploader_spec.rb'
@@ -9872,7 +9850,6 @@
- './spec/views/layouts/profile.html.haml_spec.rb'
- './spec/views/layouts/_published_experiments.html.haml_spec.rb'
- './spec/views/layouts/signup_onboarding.html.haml_spec.rb'
-- './spec/views/layouts/simple_registration.html.haml_spec.rb'
- './spec/views/layouts/terms.html.haml_spec.rb'
- './spec/views/notify/autodevops_disabled_email.text.erb_spec.rb'
- './spec/views/notify/changed_milestone_email.html.haml_spec.rb'
diff --git a/spec/support/shared_contexts/email_shared_context.rb b/spec/support/shared_contexts/email_shared_context.rb
index 12d4af5170b..8b4c1c1e243 100644
--- a/spec/support/shared_contexts/email_shared_context.rb
+++ b/spec/support/shared_contexts/email_shared_context.rb
@@ -24,7 +24,10 @@ end
def service_desk_fixture(path, slug: nil, key: 'mykey')
slug ||= project.full_path_slug.to_s
- fixture_file(path).gsub('project_slug', slug).gsub('project_key', key)
+ fixture_file(path)
+ .gsub('project_slug', slug)
+ .gsub('project_key', key)
+ .gsub('project_id', project.project_id.to_s)
end
RSpec.shared_examples 'reply processing shared examples' do
diff --git a/spec/support/shared_contexts/features/integrations/integrations_shared_context.rb b/spec/support/shared_contexts/features/integrations/integrations_shared_context.rb
index 21d9dccbb8d..8c17136b1e2 100644
--- a/spec/support/shared_contexts/features/integrations/integrations_shared_context.rb
+++ b/spec/support/shared_contexts/features/integrations/integrations_shared_context.rb
@@ -56,7 +56,7 @@ RSpec.shared_context 'with integration' do
hash.merge!(k => 'key:value')
elsif integration == 'packagist' && k == :server
hash.merge!(k => 'https://packagist.example.com')
- elsif k =~ /^(.*_url|url|webhook)/
+ elsif /^(.*_url|url|webhook)/.match?(k)
hash.merge!(k => "http://example.com")
elsif integration_klass.method_defined?("#{k}?")
hash.merge!(k => true)
diff --git a/spec/support/shared_contexts/finders/packages/npm/package_finder_shared_context.rb b/spec/support/shared_contexts/finders/packages/npm/package_finder_shared_context.rb
deleted file mode 100644
index a2cb9d41f45..00000000000
--- a/spec/support/shared_contexts/finders/packages/npm/package_finder_shared_context.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-RSpec.shared_context 'last_of_each_version setup context' do
- let_it_be(:package1) { create(:npm_package, name: 'test', version: '1.2.3', project: project) }
- let_it_be(:package2) { create(:npm_package, name: 'test2', version: '1.2.3', project: project) }
-
- let(:package_name) { 'test' }
- let(:version) { '1.2.3' }
-
- before do
- # create a duplicated package without triggering model validation errors
- package2.update_column(:name, 'test')
- end
-end
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 1b50ef3fcff..69c20a00c5a 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
@@ -4,10 +4,11 @@ RSpec.shared_context 'structured_logger' do
let(:timestamp) { Time.iso8601('2018-01-01T12:00:00.000Z') }
let(:created_at) { timestamp - 1.second }
let(:scheduling_latency_s) { 1.0 }
+ let(:worker_class) { "TestWorker" }
let(:job) do
{
- "class" => "TestWorker",
+ "class" => worker_class,
"args" => [1234, 'hello', { 'key' => 'value' }],
"retry" => false,
"queue" => "cronjob:test_queue",
@@ -31,7 +32,7 @@ RSpec.shared_context 'structured_logger' do
job.except(
'exception.backtrace', 'exception.class', 'exception.message'
).merge(
- 'message' => 'TestWorker JID-da883554ee4fe414012f5f42: start',
+ 'message' => "#{worker_class} JID-da883554ee4fe414012f5f42: start",
'job_status' => 'start',
'pid' => Process.pid,
'created_at' => created_at.to_f,
@@ -55,7 +56,7 @@ RSpec.shared_context 'structured_logger' do
let(:end_payload) do
start_payload.merge(db_payload_defaults).merge(
- 'message' => 'TestWorker JID-da883554ee4fe414012f5f42: done: 0.0 sec',
+ 'message' => "#{worker_class} JID-da883554ee4fe414012f5f42: done: 0.0 sec",
'job_status' => 'done',
'duration_s' => 0.0,
'completed_at' => timestamp.to_f,
@@ -67,15 +68,23 @@ RSpec.shared_context 'structured_logger' do
let(:deferred_payload) do
end_payload.merge(
- 'message' => 'TestWorker JID-da883554ee4fe414012f5f42: deferred: 0.0 sec',
+ 'message' => "#{worker_class} JID-da883554ee4fe414012f5f42: deferred: 0.0 sec",
'job_status' => 'deferred',
- 'job_deferred_by' => :feature_flag
+ 'job_deferred_by' => :feature_flag,
+ 'deferred_count' => 1
+ )
+ end
+
+ let(:dropped_payload) do
+ end_payload.merge(
+ 'message' => 'TestWorker JID-da883554ee4fe414012f5f42: dropped: 0.0 sec',
+ 'job_status' => 'dropped'
)
end
let(:exception_payload) do
end_payload.merge(
- 'message' => 'TestWorker JID-da883554ee4fe414012f5f42: fail: 0.0 sec',
+ 'message' => "#{worker_class} JID-da883554ee4fe414012f5f42: fail: 0.0 sec",
'job_status' => 'fail',
'exception.class' => 'ArgumentError',
'exception.message' => 'Something went wrong',
diff --git a/spec/support/shared_contexts/merge_request_create_shared_context.rb b/spec/support/shared_contexts/merge_request_create_shared_context.rb
index fc9a3767365..bf8eeeb7ab6 100644
--- a/spec/support/shared_contexts/merge_request_create_shared_context.rb
+++ b/spec/support/shared_contexts/merge_request_create_shared_context.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
RSpec.shared_context 'merge request create context' do
+ include ContentEditorHelpers
+
let(:user) { create(:user) }
let(:user2) { create(:user) }
let(:target_project) { create(:project, :public, :repository) }
@@ -23,5 +25,7 @@ RSpec.shared_context 'merge request create context' do
source_branch: 'fix',
target_branch: 'master'
})
+
+ close_rich_text_promo_popover_if_present
end
end
diff --git a/spec/support/shared_contexts/merge_request_edit_shared_context.rb b/spec/support/shared_contexts/merge_request_edit_shared_context.rb
index f0e89b0c5f9..8fe0174b13e 100644
--- a/spec/support/shared_contexts/merge_request_edit_shared_context.rb
+++ b/spec/support/shared_contexts/merge_request_edit_shared_context.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
RSpec.shared_context 'merge request edit context' do
+ include ContentEditorHelpers
+
let(:user) { create(:user) }
let(:user2) { create(:user) }
let!(:milestone) { create(:milestone, project: target_project) }
@@ -25,5 +27,6 @@ RSpec.shared_context 'merge request edit context' do
sign_in(user)
visit edit_project_merge_request_path(target_project, merge_request)
+ close_rich_text_promo_popover_if_present
end
end
diff --git a/spec/support/shared_contexts/navbar_structure_context.rb b/spec/support/shared_contexts/navbar_structure_context.rb
index efb4d244c10..0abf688566a 100644
--- a/spec/support/shared_contexts/navbar_structure_context.rb
+++ b/spec/support/shared_contexts/navbar_structure_context.rb
@@ -82,6 +82,7 @@ RSpec.shared_context 'project navbar structure' do
{
nav_item: _('Monitor'),
nav_sub_items: [
+ _('Tracing'),
_('Error Tracking'),
_('Alerts'),
_('Incidents')
diff --git a/spec/support/shared_contexts/prometheus/alert_shared_context.rb b/spec/support/shared_contexts/prometheus/alert_shared_context.rb
index 932ab899270..13e739680c8 100644
--- a/spec/support/shared_contexts/prometheus/alert_shared_context.rb
+++ b/spec/support/shared_contexts/prometheus/alert_shared_context.rb
@@ -37,17 +37,6 @@ RSpec.shared_context 'self-managed prometheus alert attributes' do
}
}
end
-
- let(:dashboard_url_for_alert) do
- Gitlab::Routing.url_helpers.metrics_dashboard_project_environment_url(
- project,
- environment,
- embed_json: embed_content,
- embedded: true,
- end: '2018-03-12T09:36:00Z',
- start: '2018-03-12T08:36:00Z'
- )
- end
end
RSpec.shared_context 'gitlab-managed prometheus alert attributes' do
diff --git a/spec/support/shared_contexts/requests/api/npm_packages_metadata_shared_examples.rb b/spec/support/shared_contexts/requests/api/npm_packages_metadata_shared_examples.rb
new file mode 100644
index 00000000000..7faf7cb32ba
--- /dev/null
+++ b/spec/support/shared_contexts/requests/api/npm_packages_metadata_shared_examples.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'generates metadata response "on-the-fly"' do
+ let(:metadata) do
+ {
+ 'dist-tags' => {
+ 'latest' => package.version
+ },
+ 'name' => package.name,
+ 'versions' => {
+ package.version => {
+ 'dist' => {
+ 'shasum' => 'be93151dc23ac34a82752444556fe79b32c7a1ad',
+ 'tarball' => "http://localhost/api/v4/projects/#{project.id}/packages/npm/#{package.name}/-/foo-1.0.1.tgz"
+ },
+ 'name' => package.name,
+ 'version' => package.version
+ }
+ }
+ }
+ end
+
+ before do
+ Grape::Endpoint.before_each do |endpoint|
+ expect(endpoint).not_to receive(:present_carrierwave_file!) # rubocop:disable RSpec/ExpectInHook
+ end
+ end
+
+ after do
+ Grape::Endpoint.before_each nil
+ end
+
+ it 'generates metadata response "on-the-fly"', :aggregate_failures do
+ expect(Packages::Npm::GenerateMetadataService).to receive(:new).and_call_original
+
+ subject
+
+ expect(json_response).to eq(metadata)
+ end
+end
diff --git a/spec/support/shared_contexts/requests/api/npm_packages_shared_context.rb b/spec/support/shared_contexts/requests/api/npm_packages_shared_context.rb
index 1e50505162d..36103b94542 100644
--- a/spec/support/shared_contexts/requests/api/npm_packages_shared_context.rb
+++ b/spec/support/shared_contexts/requests/api/npm_packages_shared_context.rb
@@ -8,7 +8,6 @@ RSpec.shared_context 'npm api setup' do
let_it_be(:group) { create(:group, name: 'test-group') }
let_it_be(:namespace) { group }
let_it_be(:project, reload: true) { create(:project, :public, namespace: namespace) }
- let_it_be(:package1, reload: true) { create(:npm_package, project: project, name: "@#{group.path}/scoped_package", version: '1.2.4') }
let_it_be(:package, reload: true) { create(:npm_package, project: project, name: "@#{group.path}/scoped_package", version: '1.2.3') }
let_it_be(:token) { create(:oauth_access_token, scopes: 'api', resource_owner: user) }
let_it_be(:personal_access_token) { create(:personal_access_token, user: user) }
@@ -18,11 +17,6 @@ RSpec.shared_context 'npm api setup' do
let(:package_name) { package.name }
let(:snowplow_gitlab_standard_context) { { project: project, namespace: project.namespace, property: 'i_package_npm_user' } }
-
- before do
- # create a duplicated package without triggering model validation errors
- package1.update_column(:version, '1.2.3')
- end
end
RSpec.shared_context 'set package name from package name type' do
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 b34d95519a2..24f0d22da47 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
@@ -8,7 +8,7 @@ RSpec.shared_context 'stubbed service ping metrics definitions' do
let(:standard_metrics) do
[
metric_attributes('recorded_at', 'standard'),
- metric_attributes('settings.collected_data_categories', 'standard', 'object')
+ metric_attributes('settings.collected_data_categories', 'standard', 'object', 'CollectedDataCategoriesMetric')
]
end
diff --git a/spec/support/shared_contexts/user_contribution_events_shared_context.rb b/spec/support/shared_contexts/user_contribution_events_shared_context.rb
index 681c2f0d811..48f0ac1e4ac 100644
--- a/spec/support/shared_contexts/user_contribution_events_shared_context.rb
+++ b/spec/support/shared_contexts/user_contribution_events_shared_context.rb
@@ -95,27 +95,52 @@ RSpec.shared_context 'with user contribution events' do
end
# pushed
- let_it_be(:push_event_payload_pushed) do
+ commit_title = 'Initial commit'
+ let_it_be(:push_event_branch_payload_pushed) do
event = create(:push_event, project: project, author: user)
- create(:push_event_payload, event: event)
+ create(:push_event_payload, event: event, commit_title: commit_title)
event
end
- let_it_be(:push_event_payload_created) do
+ let_it_be(:push_event_branch_payload_created) do
event = create(:push_event, project: project, author: user)
- create(:push_event_payload, event: event, action: :created)
+ create(:push_event_payload, event: event, action: :created, commit_title: commit_title)
event
end
- let_it_be(:push_event_payload_removed) do
+ let_it_be(:push_event_branch_payload_removed) do
event = create(:push_event, project: project, author: user)
create(:push_event_payload, event: event, action: :removed)
event
end
+ let_it_be(:push_event_tag_payload_pushed) do
+ event = create(:push_event, project: project, author: user)
+ create(:push_event_payload, event: event, ref_type: :tag, commit_title: commit_title)
+ event
+ end
+
+ let_it_be(:push_event_tag_payload_created) do
+ event = create(:push_event, project: project, author: user)
+ create(:push_event_payload, event: event, ref_type: :tag, action: :created, commit_title: commit_title)
+ event
+ end
+
+ let_it_be(:push_event_tag_payload_removed) do
+ event = create(:push_event, project: project, author: user)
+ create(:push_event_payload, event: event, ref_type: :tag, action: :removed)
+ event
+ end
+
let_it_be(:bulk_push_event) do
event = create(:push_event, project: project, author: user)
- create(:push_event_payload, event: event, commit_count: 5, commit_from: '83c6aa31482b9076531ed3a880e75627fd6b335c')
+ create(
+ :push_event_payload,
+ event: event,
+ commit_count: 5,
+ commit_from: '83c6aa31482b9076531ed3a880e75627fd6b335c',
+ commit_title: commit_title
+ )
event
end
diff --git a/spec/support/shared_examples/ci/stage_shared_examples.rb b/spec/support/shared_examples/ci/stage_shared_examples.rb
index a2849e00d27..cdb1058e584 100644
--- a/spec/support/shared_examples/ci/stage_shared_examples.rb
+++ b/spec/support/shared_examples/ci/stage_shared_examples.rb
@@ -21,7 +21,7 @@ RSpec.shared_examples 'manual playable stage' do |stage_type|
context 'when is skipped' do
let(:status) { 'skipped' }
- it { is_expected.to be_truthy }
+ it { is_expected.to be_falsy }
end
end
end
diff --git a/spec/support/shared_examples/config/metrics/every_metric_definition_shared_examples.rb b/spec/support/shared_examples/config/metrics/every_metric_definition_shared_examples.rb
index c8eaef764af..e61c884cd2b 100644
--- a/spec/support/shared_examples/config/metrics/every_metric_definition_shared_examples.rb
+++ b/spec/support/shared_examples/config/metrics/every_metric_definition_shared_examples.rb
@@ -113,7 +113,8 @@ RSpec.shared_examples 'every metric definition' do
Gitlab::Usage::Metrics::Instrumentations::DatabaseMetric,
Gitlab::Usage::Metrics::Instrumentations::RedisMetric,
Gitlab::Usage::Metrics::Instrumentations::RedisHLLMetric,
- Gitlab::Usage::Metrics::Instrumentations::NumbersMetric
+ Gitlab::Usage::Metrics::Instrumentations::NumbersMetric,
+ Gitlab::Usage::Metrics::Instrumentations::PrometheusMetric
]
end
diff --git a/spec/support/shared_examples/controllers/internal_event_tracking_examples.rb b/spec/support/shared_examples/controllers/internal_event_tracking_examples.rb
new file mode 100644
index 00000000000..e2a4fb31361
--- /dev/null
+++ b/spec/support/shared_examples/controllers/internal_event_tracking_examples.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+
+# Requires a context containing:
+# - subject
+# - action
+# - user
+# Optionally, the context can contain:
+# - project
+# - namespace
+
+RSpec.shared_examples 'internal event tracking' do
+ let(:fake_tracker) { instance_spy(Gitlab::Tracking::Destinations::Snowplow) }
+ let(:namespace) { nil }
+ let(:proejct) { nil }
+
+ before do
+ allow(Gitlab::Tracking).to receive(:tracker).and_return(fake_tracker)
+
+ allow(Gitlab::Tracking::StandardContext).to receive(:new).and_call_original
+ allow(Gitlab::Tracking::ServicePingContext).to receive(:new).and_call_original
+ end
+
+ it 'logs to Snowplow', :aggregate_failures do
+ subject
+
+ expect(Gitlab::Tracking::StandardContext)
+ .to have_received(:new)
+ .with(
+ project_id: project&.id,
+ user_id: user.id,
+ namespace_id: namespace&.id,
+ plan_name: namespace&.actual_plan_name
+ )
+
+ expect(Gitlab::Tracking::ServicePingContext)
+ .to have_received(:new)
+ .with(data_source: :redis_hll, event: action)
+
+ expect(fake_tracker).to have_received(:event)
+ .with(
+ 'InternalEventTracking',
+ action,
+ context: [
+ an_instance_of(SnowplowTracker::SelfDescribingJson),
+ an_instance_of(SnowplowTracker::SelfDescribingJson)
+ ]
+ )
+ .exactly(:once)
+ end
+end
diff --git a/spec/support/shared_examples/controllers/metrics_dashboard_shared_examples.rb b/spec/support/shared_examples/controllers/metrics_dashboard_shared_examples.rb
deleted file mode 100644
index 5b63ef10c85..00000000000
--- a/spec/support/shared_examples/controllers/metrics_dashboard_shared_examples.rb
+++ /dev/null
@@ -1,44 +0,0 @@
-# frozen_string_literal: true
-
-RSpec.shared_examples_for 'GET #metrics_dashboard correctly formatted response' do
- it 'returns a json object with the correct keys' do
- get :metrics_dashboard, params: metrics_dashboard_req_params, format: :json
-
- # Exclude `all_dashboards` to handle separately, at spec/controllers/projects/environments_controller_spec.rb:565
- # because `all_dashboards` key is not part of expected shared behavior
- found_keys = json_response.keys - ['all_dashboards']
-
- expect(response).to have_gitlab_http_status(status_code)
- expect(found_keys).to contain_exactly(*expected_keys)
- end
-end
-
-RSpec.shared_examples_for 'GET #metrics_dashboard for dashboard' do |dashboard_name|
- let(:expected_keys) { %w(dashboard status metrics_data) }
- let(:status_code) { :ok }
-
- before do
- stub_feature_flags(remove_monitor_metrics: false)
- end
-
- it_behaves_like 'GET #metrics_dashboard correctly formatted response'
-
- it 'returns correct dashboard' do
- get :metrics_dashboard, params: metrics_dashboard_req_params, format: :json
-
- expect(json_response['dashboard']['dashboard']).to eq(dashboard_name)
- end
-
- context 'when metrics dashboard feature is unavailable' do
- before do
- stub_feature_flags(remove_monitor_metrics: true)
- end
-
- it 'returns 404 not found' do
- get :metrics_dashboard, params: metrics_dashboard_req_params, format: :json
-
- expect(response).to have_gitlab_http_status(:not_found)
- expect(response.body).to be_empty
- end
- 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 9cf35325202..ba3b08751da 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
@@ -75,7 +75,7 @@ RSpec.shared_examples 'a controller that can serve LFS files' do |options = {}|
file_uri = URI.parse(response.location)
params = CGI.parse(file_uri.query)
- expect(params["response-content-disposition"].first).to eq(%Q(attachment; filename="#{filename}"; filename*=UTF-8''#{filename}))
+ expect(params["response-content-disposition"].first).to eq(%(attachment; filename="#{filename}"; filename*=UTF-8''#{filename}))
end
end
end
diff --git a/spec/support/shared_examples/controllers/snowplow_event_tracking_examples.rb b/spec/support/shared_examples/controllers/snowplow_event_tracking_examples.rb
index ba00e3e0610..3d3b619451d 100644
--- a/spec/support/shared_examples/controllers/snowplow_event_tracking_examples.rb
+++ b/spec/support/shared_examples/controllers/snowplow_event_tracking_examples.rb
@@ -6,7 +6,7 @@
# - category
# - action
# - namespace
-# Optionaly, the context can contain:
+# Optionally, the context can contain:
# - project
# - property
# - user
diff --git a/spec/support/shared_examples/controllers/uploads_actions_shared_examples.rb b/spec/support/shared_examples/controllers/uploads_actions_shared_examples.rb
index 0792ac14e47..772e03950da 100644
--- a/spec/support/shared_examples/controllers/uploads_actions_shared_examples.rb
+++ b/spec/support/shared_examples/controllers/uploads_actions_shared_examples.rb
@@ -94,14 +94,6 @@ RSpec.shared_examples 'handle uploads' do
expect(response).to have_gitlab_http_status(:not_found)
end
-
- it 'is a working exploit without the validation' do
- allow_any_instance_of(FileUploader).to receive(:secret) { secret }
-
- show_upload
-
- expect(response).to have_gitlab_http_status(:ok)
- end
end
context 'when accessing a specific upload via different model' do
diff --git a/spec/support/shared_examples/features/cascading_settings_shared_examples.rb b/spec/support/shared_examples/features/cascading_settings_shared_examples.rb
index cb80751ff49..2bda352c11f 100644
--- a/spec/support/shared_examples/features/cascading_settings_shared_examples.rb
+++ b/spec/support/shared_examples/features/cascading_settings_shared_examples.rb
@@ -24,14 +24,6 @@ RSpec.shared_examples 'a cascading setting' do
include_examples 'subgroup settings are disabled'
- context 'when use_traversal_ids_for_ancestors is disabled' do
- before do
- stub_feature_flags(use_traversal_ids_for_ancestors: false)
- end
-
- include_examples 'subgroup settings are disabled'
- end
-
it 'does not show enforcement checkbox in subgroups' do
visit subgroup_path
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 f70288168d7..254bc3c83ac 100644
--- a/spec/support/shared_examples/features/content_editor_shared_examples.rb
+++ b/spec/support/shared_examples/features/content_editor_shared_examples.rb
@@ -506,6 +506,8 @@ RSpec.shared_examples 'edits content using the content editor' do |params = { wi
switch_to_content_editor
type_in_content_editor :enter
+
+ stub_feature_flags(disable_all_mention: false)
end
if params[:with_expanded_references]
@@ -545,12 +547,32 @@ RSpec.shared_examples 'edits content using the content editor' do |params = { wi
expect(page).to have_text('@abc123')
end
+ context 'when `disable_all_mention` is enabled' do
+ before do
+ stub_feature_flags(disable_all_mention: true)
+ end
+
+ it 'shows suggestions for members with descriptions' do
+ type_in_content_editor '@a'
+
+ expect(find(suggestions_dropdown)).to have_text('abc123')
+ expect(find(suggestions_dropdown)).not_to have_text('All Group Members')
+
+ type_in_content_editor 'bc'
+
+ send_keys [:arrow_down, :enter]
+
+ expect(page).not_to have_css(suggestions_dropdown)
+ expect(page).to have_text('@abc123')
+ end
+ end
+
it 'shows suggestions for merge requests' do
type_in_content_editor '!'
expect(find(suggestions_dropdown)).to have_text('My Cool Merge Request')
- send_keys :enter
+ send_keys [:arrow_down, :enter]
expect(page).not_to have_css(suggestions_dropdown)
expect(page).to have_text('!1')
@@ -561,7 +583,7 @@ RSpec.shared_examples 'edits content using the content editor' do |params = { wi
expect(find(suggestions_dropdown)).to have_text('My Cool Linked Issue')
- send_keys :enter
+ send_keys [:arrow_down, :enter]
expect(page).not_to have_css(suggestions_dropdown)
expect(page).to have_text('#1')
@@ -572,7 +594,7 @@ RSpec.shared_examples 'edits content using the content editor' do |params = { wi
expect(find(suggestions_dropdown)).to have_text('My Cool Milestone')
- send_keys :enter
+ send_keys [:arrow_down, :enter]
expect(page).not_to have_css(suggestions_dropdown)
expect(page).to have_text('%My Cool Milestone')
@@ -584,7 +606,7 @@ RSpec.shared_examples 'edits content using the content editor' do |params = { wi
expect(find(suggestions_dropdown)).to have_text('🙂 slight_smile')
expect(find(suggestions_dropdown)).to have_text('😸 smile_cat')
- send_keys :enter
+ send_keys [:arrow_down, :enter]
expect(page).not_to have_css(suggestions_dropdown)
@@ -614,7 +636,7 @@ RSpec.shared_examples 'edits content using the content editor' do |params = { wi
end
def dropdown_scroll_top
- evaluate_script("document.querySelector('#{suggestions_dropdown} .gl-dropdown-inner').scrollTop")
+ evaluate_script("document.querySelector('#{suggestions_dropdown}').scrollTop")
end
end
end
diff --git a/spec/support/shared_examples/features/discussion_comments_shared_example.rb b/spec/support/shared_examples/features/discussion_comments_shared_example.rb
index d6f1efc09fc..430a8ac39d7 100644
--- a/spec/support/shared_examples/features/discussion_comments_shared_example.rb
+++ b/spec/support/shared_examples/features/discussion_comments_shared_example.rb
@@ -3,8 +3,8 @@
RSpec.shared_examples 'thread comments for commit and snippet' do |resource_name|
let(:form_selector) { '.js-main-target-form' }
let(:dropdown_selector) { "#{form_selector} .comment-type-dropdown" }
- let(:toggle_selector) { "#{dropdown_selector} .gl-dropdown-toggle" }
- let(:menu_selector) { "#{dropdown_selector} .dropdown-menu" }
+ let(:toggle_selector) { "#{dropdown_selector} .gl-new-dropdown-toggle" }
+ let(:menu_selector) { "#{dropdown_selector} .gl-new-dropdown-contents" }
let(:submit_selector) { "#{form_selector} .js-comment-submit-button > button:first-child" }
let(:close_selector) { "#{form_selector} .btn-comment-and-close" }
let(:comments_selector) { '.timeline > .note.timeline-entry:not(.being-posted)' }
@@ -63,33 +63,6 @@ RSpec.shared_examples 'thread comments for commit and snippet' do |resource_name
expect(page).not_to have_selector menu_selector
end
- it 'clicking the ul padding or divider should not change the text' do
- execute_script("document.querySelector('#{menu_selector}').click()")
-
- # on issues page, the menu closes when clicking anywhere, on other pages it will
- # remain open if clicking divider or menu padding, but should not change button action
- #
- # if dropdown menu is not toggled (and also not present),
- # it's "issue-type" dropdown
- if first(menu_selector, minimum: 0).nil?
- expect(find(dropdown_selector)).to have_content 'Comment'
-
- find(toggle_selector).click
- execute_script("document.querySelector('#{menu_selector} .dropdown-divider').click()")
- else
- execute_script("document.querySelector('#{menu_selector}').click()")
-
- expect(page).to have_selector menu_selector
- expect(find(dropdown_selector)).to have_content 'Comment'
-
- execute_script("document.querySelector('#{menu_selector} .dropdown-divider').click()")
-
- expect(page).to have_selector menu_selector
- end
-
- expect(find(dropdown_selector)).to have_content 'Comment'
- end
-
describe 'when selecting "Start thread"' do
before do
find("#{menu_selector} li", match: :first)
@@ -177,21 +150,27 @@ RSpec.shared_examples 'thread comments for commit and snippet' do |resource_name
end
RSpec.shared_examples 'thread comments for issue, epic and merge request' do |resource_name|
+ include ContentEditorHelpers
+
let(:form_selector) { '.js-main-target-form' }
- let(:dropdown_selector) { "#{form_selector} [data-testid='comment-button']" }
- let(:submit_button_selector) { "#{dropdown_selector} .split-content-button" }
- let(:toggle_selector) { "#{dropdown_selector} .dropdown-toggle-split" }
- let(:menu_selector) { "#{dropdown_selector} .dropdown-menu" }
+ let(:dropdown_selector) { "#{form_selector} .comment-type-dropdown" }
+ let(:toggle_selector) { "#{dropdown_selector} .gl-new-dropdown-toggle" }
+ let(:menu_selector) { "#{dropdown_selector} .gl-new-dropdown-contents" }
+ let(:submit_selector) { "#{form_selector} .js-comment-submit-button > button:first-child" }
let(:close_selector) { "#{form_selector} .btn-comment-and-close" }
let(:comments_selector) { '.timeline > .note.timeline-entry:not(.being-posted)' }
let(:comment) { 'My comment' }
+ before do
+ close_rich_text_promo_popover_if_present
+ end
+
it 'clicking "Comment" will post a comment' do
expect(page).to have_selector toggle_selector
find("#{form_selector} .note-textarea").send_keys(comment)
- find(submit_button_selector).click
+ find(submit_selector).click
wait_for_all_requests
@@ -260,7 +239,7 @@ RSpec.shared_examples 'thread comments for issue, epic and merge request' do |re
describe 'creating a thread' do
before do
- find(submit_button_selector).click
+ find(submit_selector).click
wait_for_requests
find(comments_selector, match: :first)
@@ -284,7 +263,7 @@ RSpec.shared_examples 'thread comments for issue, epic and merge request' do |re
expect(new_comment).to have_css('.discussion-with-resolve-btn')
end
- if resource_name =~ /(issue|merge request)/
+ if /(issue|merge request)/.match?(resource_name)
it 'can be replied to' do
submit_reply('some text')
@@ -366,14 +345,14 @@ RSpec.shared_examples 'thread comments for issue, epic and merge request' do |re
end
it 'updates the submit button text and closes the dropdown' do
- button = find(submit_button_selector)
+ button = find(submit_selector)
expect(button).to have_content 'Comment'
expect(page).not_to have_selector menu_selector
end
- if resource_name =~ /(issue|merge request)/
+ if /(issue|merge request)/.match?(resource_name)
it 'updates the close button text' do
expect(find(close_selector)).to have_content "Comment & close #{resource_name}"
end
@@ -402,7 +381,7 @@ RSpec.shared_examples 'thread comments for issue, epic and merge request' do |re
end
end
- if resource_name =~ /(issue|merge request)/
+ if /(issue|merge request)/.match?(resource_name)
describe "on a closed #{resource_name}" do
before do
find("#{form_selector} .js-note-target-close").click
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 14e53dc8655..f802404518b 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
@@ -125,7 +125,11 @@ RSpec.shared_examples 'an editable merge request' do
it 'allows to unselect "Remove source branch"', :js do
expect(merge_request.merge_params['force_remove_source_branch']).to be_truthy
- visit edit_project_merge_request_path(target_project, merge_request)
+ begin
+ visit edit_project_merge_request_path(target_project, merge_request)
+ rescue Selenium::WebDriver::Error::UnexpectedAlertOpenError
+ end
+
uncheck 'Delete source branch when merge request is accepted'
click_button 'Save changes'
diff --git a/spec/support/shared_examples/features/inviting_members_shared_examples.rb b/spec/support/shared_examples/features/inviting_members_shared_examples.rb
index 2eca2a72997..178f85cb85b 100644
--- a/spec/support/shared_examples/features/inviting_members_shared_examples.rb
+++ b/spec/support/shared_examples/features/inviting_members_shared_examples.rb
@@ -159,6 +159,40 @@ RSpec.shared_examples 'inviting members' do |snowplow_invite_label|
end
end
+ context 'when a user already exists, and private email is used' do
+ it 'fails with an error', :js do
+ visit subentity_members_page_path
+
+ invite_member(user2.email, role: role)
+
+ invite_modal = page.find(invite_modal_selector)
+ expect(invite_modal).to have_content "#{user2.email}: Access level should be greater than or equal to " \
+ "Developer inherited membership from group #{group.name}"
+
+ page.refresh
+
+ page.within find_invited_member_row(user2.name) do
+ expect(page).to have_content('Developer')
+ expect(page).not_to have_button('Developer')
+ end
+ end
+
+ it 'does not allow inviting of an email that has spaces', :js do
+ visit subentity_members_page_path
+
+ click_on _('Invite members')
+
+ page.within invite_modal_selector do
+ choose_options(role, nil)
+ find(member_dropdown_selector).set("#{user2.email} ")
+ wait_for_requests
+
+ expect(page).to have_content('No matches found')
+ expect(page).not_to have_button("#{user2.email} ")
+ end
+ end
+ end
+
context 'when there are multiple users invited with errors' do
let_it_be(:user3) { create(:user) }
diff --git a/spec/support/shared_examples/features/milestone_editing_shared_examples.rb b/spec/support/shared_examples/features/milestone_editing_shared_examples.rb
index d21bf62ecfa..53498a1bb39 100644
--- a/spec/support/shared_examples/features/milestone_editing_shared_examples.rb
+++ b/spec/support/shared_examples/features/milestone_editing_shared_examples.rb
@@ -1,7 +1,9 @@
# frozen_string_literal: true
RSpec.shared_examples 'milestone handling version conflicts' do
- it 'warns about version conflict when milestone has been updated in the background' do
+ it 'warns about version conflict when milestone has been updated in the background', :js do
+ wait_for_all_requests
+
# Update the milestone in the background in order to trigger a version conflict
milestone.update!(title: "New title")
diff --git a/spec/support/shared_examples/features/nav_sidebar_shared_examples.rb b/spec/support/shared_examples/features/nav_sidebar_shared_examples.rb
new file mode 100644
index 00000000000..34821fb9eda
--- /dev/null
+++ b/spec/support/shared_examples/features/nav_sidebar_shared_examples.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'page has active tab' do |title|
+ it "activates #{title} tab" do
+ expect(page).to have_selector('.sidebar-top-level-items > li.active', count: 1)
+ expect(find('.sidebar-top-level-items > li.active')).to have_content(title)
+ end
+end
+
+RSpec.shared_examples 'page has active sub tab' do |title|
+ it "activates #{title} sub tab" do
+ expect(page).to have_selector('.sidebar-sub-level-items > li.active:not(.fly-out-top-item)', count: 1)
+ expect(find('.sidebar-sub-level-items > li.active:not(.fly-out-top-item)'))
+ .to have_content(title)
+ 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 5126e849c2e..8e8e7e8ad05 100644
--- a/spec/support/shared_examples/features/packages_shared_examples.rb
+++ b/spec/support/shared_examples/features/packages_shared_examples.rb
@@ -9,7 +9,7 @@ RSpec.shared_examples 'packages list' do |check_project_name: false|
expect(package_row).to have_content(pkg.name)
expect(package_row).to have_content(pkg.version)
- expect(package_row).to have_content(pkg.project.path) if check_project_name
+ expect(package_row).to have_content(pkg.project.name) if check_project_name
end
end
diff --git a/spec/support/shared_examples/features/project_upload_files_shared_examples.rb b/spec/support/shared_examples/features/project_upload_files_shared_examples.rb
index 7737f8a73c5..806ffdad2f1 100644
--- a/spec/support/shared_examples/features/project_upload_files_shared_examples.rb
+++ b/spec/support/shared_examples/features/project_upload_files_shared_examples.rb
@@ -4,8 +4,8 @@ RSpec.shared_examples 'it uploads and commits a new text file' do |drop: false|
it 'uploads and commits a new text file', :js do
find('.add-to-tree').click
- page.within('.dropdown-menu') do
- click_link('Upload file')
+ page.within('.repo-breadcrumb') do
+ click_button('Upload file')
wait_for_requests
end
@@ -40,8 +40,8 @@ RSpec.shared_examples 'it uploads and commits a new image file' do |drop: false|
it 'uploads and commits a new image file', :js do
find('.add-to-tree').click
- page.within('.dropdown-menu') do
- click_link('Upload file')
+ page.within('.repo-breadcrumb') do
+ click_button('Upload file')
wait_for_requests
end
@@ -70,8 +70,8 @@ RSpec.shared_examples 'it uploads and commits a new pdf file' do |drop: false|
it 'uploads and commits a new pdf file', :js do
find('.add-to-tree').click
- page.within('.dropdown-menu') do
- click_link('Upload file')
+ page.within('.repo-breadcrumb') do
+ click_button('Upload file')
wait_for_requests
end
@@ -111,7 +111,7 @@ RSpec.shared_examples 'it uploads and commits a new file to a forked project' do
wait_for_all_requests
find('.add-to-tree').click
- click_link('Upload file')
+ click_button('Upload file')
if drop
find(".upload-dropzone-card").drop(File.join(Rails.root, 'spec', 'fixtures', 'doc_sample.txt'))
@@ -149,7 +149,7 @@ RSpec.shared_examples 'it uploads a file to a sub-directory' do |drop: false|
end
find('.add-to-tree').click
- click_link('Upload file')
+ click_button('Upload file')
if drop
find(".upload-dropzone-card").drop(File.join(Rails.root, 'spec', 'fixtures', 'doc_sample.txt'))
diff --git a/spec/support/shared_examples/features/resolving_discussions_in_issues_shared_examples.rb b/spec/support/shared_examples/features/resolving_discussions_in_issues_shared_examples.rb
index 337b3f3cbd0..7e3b507c1ba 100644
--- a/spec/support/shared_examples/features/resolving_discussions_in_issues_shared_examples.rb
+++ b/spec/support/shared_examples/features/resolving_discussions_in_issues_shared_examples.rb
@@ -24,6 +24,6 @@ RSpec.shared_examples 'creating an issue for a thread' do
expect(discussion.resolved?).to eq(true)
# Issue title inludes MR title
- expect(page).to have_content(%Q(Follow-up from "#{merge_request.title}"))
+ expect(page).to have_content(%(Follow-up from "#{merge_request.title}"))
end
end
diff --git a/spec/support/shared_examples/features/rss_shared_examples.rb b/spec/support/shared_examples/features/rss_shared_examples.rb
index f6566214e32..a6b9c98923a 100644
--- a/spec/support/shared_examples/features/rss_shared_examples.rb
+++ b/spec/support/shared_examples/features/rss_shared_examples.rb
@@ -2,20 +2,20 @@
RSpec.shared_examples "an autodiscoverable RSS feed with current_user's feed token" do
it "has an RSS autodiscovery link tag with current_user's feed token" do
- expect(page).to have_css("link[type*='atom+xml'][href*='feed_token=#{user.feed_token}']", visible: false)
+ expect(page).to have_css("link[type*='atom+xml'][href*='feed_token=glft-'][href*='-#{user.id}']", visible: false)
end
end
RSpec.shared_examples "it has an RSS button with current_user's feed token" do
it "shows the RSS button with current_user's feed token" do
expect(page)
- .to have_css("a:has([data-testid='rss-icon'])[href*='feed_token=#{user.feed_token}']")
+ .to have_css("a:has([data-testid='rss-icon'])[href*='feed_token=glft-'][href*='-#{user.id}']")
end
end
RSpec.shared_examples "it has an RSS link with current_user's feed token" do
it "shows the RSS link with current_user's feed token" do
- expect(page).to have_link 'Subscribe to RSS feed', href: /feed_token=#{user.feed_token}/
+ expect(page).to have_link 'Subscribe to RSS feed', href: /feed_token=glft-.*-#{user.id}/
end
end
@@ -51,11 +51,17 @@ RSpec.shared_examples "updates atom feed link" do |type|
auto_discovery_params = CGI.parse(URI.parse(auto_discovery_link[:href]).query)
expected = {
- 'feed_token' => [user.feed_token],
'assignee_id' => [user.id.to_s]
}
expect(params).to include(expected)
+ feed_token_param = params['feed_token']
+ expect(feed_token_param).to match([Gitlab::Auth::AuthFinders::PATH_DEPENDENT_FEED_TOKEN_REGEX])
+ expect(feed_token_param.first).to end_with(user.id.to_s)
+
expect(auto_discovery_params).to include(expected)
+ feed_token_param = auto_discovery_params['feed_token']
+ expect(feed_token_param).to match([Gitlab::Auth::AuthFinders::PATH_DEPENDENT_FEED_TOKEN_REGEX])
+ expect(feed_token_param.first).to end_with(user.id.to_s)
end
end
diff --git a/spec/support/shared_examples/features/sidebar/sidebar_due_date_shared_examples.rb b/spec/support/shared_examples/features/sidebar/sidebar_due_date_shared_examples.rb
index 206116d66c8..865f5aff476 100644
--- a/spec/support/shared_examples/features/sidebar/sidebar_due_date_shared_examples.rb
+++ b/spec/support/shared_examples/features/sidebar/sidebar_due_date_shared_examples.rb
@@ -26,7 +26,7 @@ RSpec.shared_examples 'date sidebar widget' do
wait_for_requests
- expect(page).to have_content(today.to_s(:medium))
+ expect(page).to have_content(today.to_fs(:medium))
expect(due_date_value.text).to have_content Time.current.strftime('%b %-d, %Y')
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 ed885d7a226..c3df89c8002 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
@@ -6,6 +6,7 @@
RSpec.shared_examples 'User creates wiki page' do
include WikiHelpers
+ include ContentEditorHelpers
before do
sign_in(user)
@@ -18,6 +19,7 @@ RSpec.shared_examples 'User creates wiki page' do
wait_for_svg_to_be_loaded(example)
click_link "Create your first page"
+ close_rich_text_promo_popover_if_present
end
it 'shows all available formats in the dropdown' do
@@ -190,6 +192,7 @@ RSpec.shared_examples 'User creates wiki page' do
context "via the `new wiki page` page", :js do
it "creates a page with a single word" do
click_link("New page")
+ close_rich_text_promo_popover_if_present
page.within(".wiki-form") do
fill_in(:wiki_title, with: "foo")
@@ -208,6 +211,7 @@ RSpec.shared_examples 'User creates wiki page' do
it "creates a page with spaces in the name", :js do
click_link("New page")
+ close_rich_text_promo_popover_if_present
page.within(".wiki-form") do
fill_in(:wiki_title, with: "Spaces in the name")
@@ -226,6 +230,7 @@ RSpec.shared_examples 'User creates wiki page' do
it "creates a page with hyphens in the name", :js do
click_link("New page")
+ close_rich_text_promo_popover_if_present
page.within(".wiki-form") do
fill_in(:wiki_title, with: "hyphens-in-the-name")
@@ -249,6 +254,7 @@ RSpec.shared_examples 'User creates wiki page' do
context 'when a server side validation error is returned' do
it "still displays edit form", :js do
click_link("New page")
+ close_rich_text_promo_popover_if_present
page.within(".wiki-form") do
fill_in(:wiki_title, with: "home")
@@ -266,6 +272,7 @@ RSpec.shared_examples 'User creates wiki page' do
it "shows the emoji autocompletion dropdown", :js do
click_link("New page")
+ close_rich_text_promo_popover_if_present
page.within(".wiki-form") do
find("#wiki_content").native.send_keys("")
diff --git a/spec/support/shared_examples/features/wiki/user_previews_wiki_changes_shared_examples.rb b/spec/support/shared_examples/features/wiki/user_previews_wiki_changes_shared_examples.rb
index ca68df9a89b..827c875494a 100644
--- a/spec/support/shared_examples/features/wiki/user_previews_wiki_changes_shared_examples.rb
+++ b/spec/support/shared_examples/features/wiki/user_previews_wiki_changes_shared_examples.rb
@@ -5,6 +5,8 @@
# user
RSpec.shared_examples 'User previews wiki changes' do
+ include ContentEditorHelpers
+
let(:wiki_page) { build(:wiki_page, wiki: wiki) }
before do
@@ -74,6 +76,7 @@ RSpec.shared_examples 'User previews wiki changes' do
before do
wiki_page.create # rubocop:disable Rails/SaveBang
visit wiki_page_path(wiki, wiki_page, action: :edit)
+ close_rich_text_promo_popover_if_present
end
it_behaves_like 'relative links' do
diff --git a/spec/support/shared_examples/features/wiki/user_updates_wiki_page_shared_examples.rb b/spec/support/shared_examples/features/wiki/user_updates_wiki_page_shared_examples.rb
index 91cacaf9209..d06f04db1ce 100644
--- a/spec/support/shared_examples/features/wiki/user_updates_wiki_page_shared_examples.rb
+++ b/spec/support/shared_examples/features/wiki/user_updates_wiki_page_shared_examples.rb
@@ -6,6 +6,8 @@
RSpec.shared_examples 'User updates wiki page' do
include WikiHelpers
+ include ContentEditorHelpers
+
let(:diagramsnet_url) { 'https://embed.diagrams.net' }
before do
@@ -21,6 +23,7 @@ RSpec.shared_examples 'User updates wiki page' do
wait_for_svg_to_be_loaded(example)
click_link "Create your first page"
+ close_rich_text_promo_popover_if_present
end
it 'redirects back to the home edit page' do
@@ -67,6 +70,7 @@ RSpec.shared_examples 'User updates wiki page' do
visit(wiki_path(wiki))
click_link('Edit')
+ close_rich_text_promo_popover_if_present
end
it 'updates a page', :js do
@@ -126,10 +130,6 @@ RSpec.shared_examples 'User updates wiki page' do
expect(page).to have_content('Updated Wiki Content')
end
- it 'focuses on the content field', :js do
- expect(page).to have_selector '.note-textarea:focus'
- end
-
it 'cancels editing of a page' do
page.within(:css, '.wiki-form .form-actions') do
click_on('Cancel')
@@ -164,6 +164,7 @@ RSpec.shared_examples 'User updates wiki page' do
before do
visit wiki_page_path(wiki, wiki_page, action: :edit)
+ close_rich_text_promo_popover_if_present
end
it 'moves the page to the root folder', :js do
@@ -234,6 +235,7 @@ RSpec.shared_examples 'User updates wiki page' do
stub_application_setting(wiki_page_max_content_bytes: 10)
visit wiki_page_path(wiki_page.wiki, wiki_page, action: :edit)
+ close_rich_text_promo_popover_if_present
end
it 'allows changing the title if the content does not change', :js do
diff --git a/spec/support/shared_examples/features/wiki/user_views_wiki_page_shared_examples.rb b/spec/support/shared_examples/features/wiki/user_views_wiki_page_shared_examples.rb
index 767caffd417..3ee7725305e 100644
--- a/spec/support/shared_examples/features/wiki/user_views_wiki_page_shared_examples.rb
+++ b/spec/support/shared_examples/features/wiki/user_views_wiki_page_shared_examples.rb
@@ -6,6 +6,7 @@
RSpec.shared_examples 'User views a wiki page' do
include WikiHelpers
+ include ContentEditorHelpers
let(:path) { 'image.png' }
let(:wiki_page) do
@@ -269,6 +270,7 @@ RSpec.shared_examples 'User views a wiki page' do
wait_for_svg_to_be_loaded
click_link "Create your first page"
+ close_rich_text_promo_popover_if_present
expect(page).to have_content('Create New Page')
end
diff --git a/spec/support/shared_examples/features/work_items_shared_examples.rb b/spec/support/shared_examples/features/work_items_shared_examples.rb
index 128bd28410c..4c15b682458 100644
--- a/spec/support/shared_examples/features/work_items_shared_examples.rb
+++ b/spec/support/shared_examples/features/work_items_shared_examples.rb
@@ -166,7 +166,8 @@ RSpec.shared_examples 'work items comments' do |type|
end
RSpec.shared_examples 'work items assignees' do
- it 'successfully assigns the current user by searching' do
+ it 'successfully assigns the current user by searching',
+ quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/413074' do
# The button is only when the mouse is over the input
find('[data-testid="work-item-assignees-input"]').fill_in(with: user.username)
wait_for_requests
diff --git a/spec/support/shared_examples/finders/assignees_filter_shared_examples.rb b/spec/support/shared_examples/finders/assignees_filter_shared_examples.rb
index 5cbbed1468f..38954e6f9cc 100644
--- a/spec/support/shared_examples/finders/assignees_filter_shared_examples.rb
+++ b/spec/support/shared_examples/finders/assignees_filter_shared_examples.rb
@@ -42,6 +42,12 @@ RSpec.shared_examples 'no assignee filter' do
expect(issuables).to contain_exactly(*expected_issuables)
end
+
+ it 'returns issuables not assigned to any assignee' do
+ params[:assignee_wildcard_id] = 'none'
+
+ expect(issuables).to contain_exactly(*expected_issuables)
+ end
end
RSpec.shared_examples 'any assignee filter' do
@@ -57,5 +63,11 @@ RSpec.shared_examples 'any assignee filter' do
expect(issuables).to contain_exactly(*expected_issuables)
end
+
+ it 'returns issuables assigned to any assignee' do
+ params[:assignee_wildcard_id] = 'any'
+
+ expect(issuables).to contain_exactly(*expected_issuables)
+ end
end
end
diff --git a/spec/support/shared_examples/finders/issues_finder_shared_examples.rb b/spec/support/shared_examples/finders/issues_finder_shared_examples.rb
index 67fed00b5ca..30041456d00 100644
--- a/spec/support/shared_examples/finders/issues_finder_shared_examples.rb
+++ b/spec/support/shared_examples/finders/issues_finder_shared_examples.rb
@@ -663,18 +663,6 @@ RSpec.shared_examples 'issues or work items finder' do |factory, execute_context
expect(items).to contain_exactly(japanese)
end
end
-
- context 'when full-text search is disabled' do
- let(:search_term) { 'ometh' }
-
- before do
- stub_feature_flags(issues_full_text_search: false)
- end
-
- it 'allows partial word matches' do
- expect(items).to contain_exactly(english)
- end
- end
end
context 'filtering by item term in title' do
diff --git a/spec/support/shared_examples/graphql/label_fields.rb b/spec/support/shared_examples/graphql/label_fields.rb
index 030a2feafcd..809c801de62 100644
--- a/spec/support/shared_examples/graphql/label_fields.rb
+++ b/spec/support/shared_examples/graphql/label_fields.rb
@@ -93,7 +93,7 @@ RSpec.shared_examples 'querying a GraphQL type with labels' do
describe 'performance' do
def query_for(*labels)
selections = labels.map do |label|
- %Q[#{label.title.gsub(/:+/, '_')}: label(title: "#{label.title}") { description }]
+ %[#{label.title.gsub(/:+/, '_')}: label(title: "#{label.title}") { description }]
end
make_query(selections)
diff --git a/spec/support/shared_examples/graphql/mutations/boards_list_create_shared_examples.rb b/spec/support/shared_examples/graphql/mutations/boards_list_create_shared_examples.rb
index b096a5e17c0..13d2447754c 100644
--- a/spec/support/shared_examples/graphql/mutations/boards_list_create_shared_examples.rb
+++ b/spec/support/shared_examples/graphql/mutations/boards_list_create_shared_examples.rb
@@ -33,6 +33,10 @@ RSpec.shared_examples 'board lists create mutation' do
describe 'backlog list' do
let(:list_create_params) { { backlog: true } }
+ before do
+ board.lists.backlog.delete_all
+ end
+
it 'creates one and only one backlog' do
expect { subject }.to change { board.lists.backlog.count }.by(1)
expect(board.lists.backlog.first.list_type).to eq 'backlog'
diff --git a/spec/support/shared_examples/graphql/notes_quick_actions_for_work_items_shared_examples.rb b/spec/support/shared_examples/graphql/notes_quick_actions_for_work_items_shared_examples.rb
index 30212e44c6a..c666b72d492 100644
--- a/spec/support/shared_examples/graphql/notes_quick_actions_for_work_items_shared_examples.rb
+++ b/spec/support/shared_examples/graphql/notes_quick_actions_for_work_items_shared_examples.rb
@@ -157,10 +157,10 @@ RSpec.shared_examples 'work item supports type change via quick actions' do
let_it_be(:assignee) { create(:user) }
let_it_be(:task_type) { WorkItems::Type.default_by_type(:task) }
- let(:body) { "Updating type.\n/type Issue" }
+ let(:body) { "Updating type.\n/type issue" }
before do
- noteable.update!(work_item_type: task_type, issue_type: task_type.base_type)
+ noteable.update!(work_item_type: task_type)
end
it 'updates type' do
@@ -211,4 +211,15 @@ RSpec.shared_examples 'work item supports type change via quick actions' do
.to include("Commands only Type changed successfully. Assigned @#{assignee.username}.")
end
end
+
+ context 'when the type name is upper case' do
+ let(:body) { "Updating type.\n/type Issue" }
+
+ it 'changes type to issue' do
+ expect do
+ post_graphql_mutation(mutation, current_user: current_user)
+ noteable.reload
+ end.to change { noteable.work_item_type.base_type }.from('task').to('issue')
+ end
+ end
end
diff --git a/spec/support/shared_examples/graphql/types/merge_request_interactions_type_shared_examples.rb b/spec/support/shared_examples/graphql/types/merge_request_interactions_type_shared_examples.rb
index d8cc6f697d7..c32e758d921 100644
--- a/spec/support/shared_examples/graphql/types/merge_request_interactions_type_shared_examples.rb
+++ b/spec/support/shared_examples/graphql/types/merge_request_interactions_type_shared_examples.rb
@@ -50,6 +50,8 @@ RSpec.shared_examples "a user type with merge request interaction type" do
organization
jobTitle
createdAt
+ pronouns
+ ide
]
# TODO: 'workspaces' needs to be included, but only when this spec is run in EE context, to account for the
diff --git a/spec/support/shared_examples/lib/banzai/filters/sanitization_filter_shared_examples.rb b/spec/support/shared_examples/lib/banzai/filters/sanitization_filter_shared_examples.rb
index 47655f86558..e6433f963f4 100644
--- a/spec/support/shared_examples/lib/banzai/filters/sanitization_filter_shared_examples.rb
+++ b/spec/support/shared_examples/lib/banzai/filters/sanitization_filter_shared_examples.rb
@@ -25,7 +25,7 @@ RSpec.shared_examples 'default allowlist' do
expect(filter(act).to_html).to eq exp
end
- it 'allows whitelisted HTML tags from the user' do
+ it 'allows allowlisted HTML tags from the user' do
exp = act = "<dl>\n<dt>Term</dt>\n<dd>Definition</dd>\n</dl>"
expect(filter(act).to_html).to eq exp
end
@@ -110,7 +110,7 @@ RSpec.shared_examples 'XSS prevention' do
},
'protocol-based JS injection: Unicode' => {
- input: %Q(<a href="\u0001java\u0003script:alert('XSS')">foo</a>),
+ input: %(<a href="\u0001java\u0003script:alert('XSS')">foo</a>),
output: '<a>foo</a>'
},
diff --git a/spec/support/shared_examples/lib/gitlab/database/foreign_key_validators_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/database/foreign_key_validators_shared_examples.rb
deleted file mode 100644
index a1e75e4af7e..00000000000
--- a/spec/support/shared_examples/lib/gitlab/database/foreign_key_validators_shared_examples.rb
+++ /dev/null
@@ -1,48 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.shared_examples 'foreign key validators' do |validator, expected_result|
- subject(:result) { validator.new(structure_file, database).execute }
-
- let(:structure_file_path) { Rails.root.join('spec/fixtures/structure.sql') }
- let(:structure_file) { Gitlab::Database::SchemaValidation::StructureSql.new(structure_file_path, schema) }
- let(:inconsistency_type) { validator.name.demodulize.underscore }
- let(:database_name) { 'main' }
- let(:schema) { 'public' }
- let(:database_model) { Gitlab::Database.database_base_models[database_name] }
- let(:connection) { database_model.connection }
- let(:database) { Gitlab::Database::SchemaValidation::Database.new(connection) }
-
- let(:database_query) do
- [
- {
- 'schema' => schema,
- 'table_name' => 'web_hooks',
- 'foreign_key_name' => 'web_hooks_project_id_fkey',
- 'foreign_key_definition' => 'FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE'
- },
- {
- 'schema' => schema,
- 'table_name' => 'issues',
- 'foreign_key_name' => 'wrong_definition_fk',
- 'foreign_key_definition' => 'FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE CASCADE'
- },
- {
- 'schema' => schema,
- 'table_name' => 'projects',
- 'foreign_key_name' => 'extra_fk',
- 'foreign_key_definition' => 'FOREIGN KEY (creator_id) REFERENCES users(id) ON DELETE CASCADE'
- }
- ]
- end
-
- before do
- allow(connection).to receive(:exec_query).and_return(database_query)
- end
-
- it 'returns trigger inconsistencies' do
- expect(result.map(&:object_name)).to match_array(expected_result)
- expect(result.map(&:type)).to all(eql inconsistency_type)
- end
-end
diff --git a/spec/support/shared_examples/lib/gitlab/database/index_validators_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/database/index_validators_shared_examples.rb
deleted file mode 100644
index 6f0cede7130..00000000000
--- a/spec/support/shared_examples/lib/gitlab/database/index_validators_shared_examples.rb
+++ /dev/null
@@ -1,38 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.shared_examples "index validators" do |validator, expected_result|
- let(:structure_file_path) { Rails.root.join('spec/fixtures/structure.sql') }
- let(:database_indexes) do
- [
- ['wrong_index', 'CREATE UNIQUE INDEX wrong_index ON public.table_name (column_name)'],
- ['extra_index', 'CREATE INDEX extra_index ON public.table_name (column_name)'],
- ['index', 'CREATE UNIQUE INDEX "index" ON public.achievements USING btree (namespace_id, lower(name))']
- ]
- end
-
- let(:inconsistency_type) { validator.name.demodulize.underscore }
-
- let(:database_name) { 'main' }
-
- let(:database_model) { Gitlab::Database.database_base_models[database_name] }
-
- let(:connection) { database_model.connection }
-
- let(:schema) { connection.current_schema }
-
- let(:database) { Gitlab::Database::SchemaValidation::Database.new(connection) }
- let(:structure_file) { Gitlab::Database::SchemaValidation::StructureSql.new(structure_file_path, schema) }
-
- subject(:result) { validator.new(structure_file, database).execute }
-
- before do
- allow(connection).to receive(:select_rows).and_return(database_indexes)
- end
-
- it 'returns index inconsistencies' do
- expect(result.map(&:object_name)).to match_array(expected_result)
- expect(result.map(&:type)).to all(eql inconsistency_type)
- end
-end
diff --git a/spec/support/shared_examples/lib/gitlab/database/table_validators_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/database/table_validators_shared_examples.rb
deleted file mode 100644
index 96e58294675..00000000000
--- a/spec/support/shared_examples/lib/gitlab/database/table_validators_shared_examples.rb
+++ /dev/null
@@ -1,84 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.shared_examples "table validators" do |validator, expected_result|
- subject(:result) { validator.new(structure_file, database).execute }
-
- let(:structure_file_path) { Rails.root.join('spec/fixtures/structure.sql') }
- let(:inconsistency_type) { validator.name.demodulize.underscore }
- let(:database_model) { Gitlab::Database.database_base_models['main'] }
- let(:connection) { database_model.connection }
- let(:schema) { connection.current_schema }
- let(:database) { Gitlab::Database::SchemaValidation::Database.new(connection) }
- let(:structure_file) { Gitlab::Database::SchemaValidation::StructureSql.new(structure_file_path, schema) }
- let(:database_tables) do
- [
- {
- 'table_name' => 'wrong_table',
- 'column_name' => 'id',
- 'not_null' => true,
- 'data_type' => 'integer',
- 'column_default' => "nextval('audit_events_id_seq'::regclass)"
- },
- {
- 'table_name' => 'wrong_table',
- 'column_name' => 'description',
- 'not_null' => true,
- 'data_type' => 'character varying',
- 'column_default' => nil
- },
- {
- 'table_name' => 'extra_table',
- 'column_name' => 'id',
- 'not_null' => true,
- 'data_type' => 'integer',
- 'column_default' => "nextval('audit_events_id_seq'::regclass)"
- },
- {
- 'table_name' => 'extra_table',
- 'column_name' => 'email',
- 'not_null' => true,
- 'data_type' => 'character varying',
- 'column_default' => nil
- },
- {
- 'table_name' => 'extra_table_columns',
- 'column_name' => 'id',
- 'not_null' => true,
- 'data_type' => 'bigint',
- 'column_default' => "nextval('audit_events_id_seq'::regclass)"
- },
- {
- 'table_name' => 'extra_table_columns',
- 'column_name' => 'name',
- 'not_null' => true,
- 'data_type' => 'character varying(255)',
- 'column_default' => nil
- },
- {
- 'table_name' => 'extra_table_columns',
- 'column_name' => 'extra_column',
- 'not_null' => true,
- 'data_type' => 'character varying(255)',
- 'column_default' => nil
- },
- {
- 'table_name' => 'missing_table_columns',
- 'column_name' => 'id',
- 'not_null' => true,
- 'data_type' => 'bigint',
- 'column_default' => 'NOT NULL'
- }
- ]
- end
-
- before do
- allow(connection).to receive(:exec_query).and_return(database_tables)
- end
-
- it 'returns table inconsistencies' do
- expect(result.map(&:object_name)).to match_array(expected_result)
- expect(result.map(&:type)).to all(eql inconsistency_type)
- end
-end
diff --git a/spec/support/shared_examples/lib/gitlab/database/trigger_validators_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/database/trigger_validators_shared_examples.rb
deleted file mode 100644
index 13a112275c2..00000000000
--- a/spec/support/shared_examples/lib/gitlab/database/trigger_validators_shared_examples.rb
+++ /dev/null
@@ -1,33 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.shared_examples 'trigger validators' do |validator, expected_result|
- subject(:result) { validator.new(structure_file, database).execute }
-
- let(:structure_file_path) { Rails.root.join('spec/fixtures/structure.sql') }
- let(:structure_file) { Gitlab::Database::SchemaValidation::StructureSql.new(structure_file_path, schema) }
- let(:inconsistency_type) { validator.name.demodulize.underscore }
- let(:database_name) { 'main' }
- let(:schema) { 'public' }
- let(:database_model) { Gitlab::Database.database_base_models[database_name] }
- let(:connection) { database_model.connection }
- let(:database) { Gitlab::Database::SchemaValidation::Database.new(connection) }
-
- let(:database_triggers) do
- [
- ['trigger', 'CREATE TRIGGER trigger AFTER INSERT ON public.t1 FOR EACH ROW EXECUTE FUNCTION t1()'],
- ['wrong_trigger', 'CREATE TRIGGER wrong_trigger BEFORE UPDATE ON public.t2 FOR EACH ROW EXECUTE FUNCTION t2()'],
- ['extra_trigger', 'CREATE TRIGGER extra_trigger BEFORE INSERT ON public.t4 FOR EACH ROW EXECUTE FUNCTION t4()']
- ]
- end
-
- before do
- allow(connection).to receive(:select_rows).and_return(database_triggers)
- end
-
- it 'returns trigger inconsistencies' do
- expect(result.map(&:object_name)).to match_array(expected_result)
- expect(result.map(&:type)).to all(eql inconsistency_type)
- end
-end
diff --git a/spec/support/shared_examples/lib/gitlab/usage_data_counters/issuable_activity_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/usage_data_counters/issuable_activity_shared_examples.rb
index 169fceced7a..9dc18555340 100644
--- a/spec/support/shared_examples/lib/gitlab/usage_data_counters/issuable_activity_shared_examples.rb
+++ b/spec/support/shared_examples/lib/gitlab/usage_data_counters/issuable_activity_shared_examples.rb
@@ -1,6 +1,6 @@
# frozen_string_literal: true
-RSpec.shared_examples 'tracked issuable snowplow and service ping events for given event params' do
+RSpec.shared_examples 'tracked issuable events' do
before do
stub_application_setting(usage_ping_enabled: true)
end
@@ -21,6 +21,10 @@ RSpec.shared_examples 'tracked issuable snowplow and service ping events for giv
it 'does not track edit actions if author is not present' do
expect(track_action({ author: nil }.merge(track_params))).to be_nil
end
+end
+
+RSpec.shared_examples 'tracked issuable snowplow and service ping events for given event params' do
+ it_behaves_like 'tracked issuable events'
it 'emits snowplow event' do
track_action({ author: user1 }.merge(track_params))
@@ -29,6 +33,23 @@ RSpec.shared_examples 'tracked issuable snowplow and service ping events for giv
end
end
+RSpec.shared_examples 'tracked issuable internal event for given event params' do
+ it_behaves_like 'tracked issuable events'
+
+ it_behaves_like 'internal event tracking' do
+ subject(:track_event) { track_action({ author: user1 }.merge(track_params)) }
+
+ let(:user) { user1 }
+ let(:namespace) { project&.namespace }
+ end
+end
+
+RSpec.shared_examples 'tracked issuable internal event with project' do
+ it_behaves_like 'tracked issuable internal event for given event params' do
+ let(:track_params) { original_params || { project: project } }
+ end
+end
+
RSpec.shared_examples 'tracked issuable snowplow and service ping events with project' do
it_behaves_like 'tracked issuable snowplow and service ping events for given event params' do
let(:context) do
diff --git a/spec/support/shared_examples/models/concerns/analytics/cycle_analytics/stage_event_model_examples.rb b/spec/support/shared_examples/models/concerns/analytics/cycle_analytics/stage_event_model_examples.rb
index 6f104f400bc..52f0e7847b0 100644
--- a/spec/support/shared_examples/models/concerns/analytics/cycle_analytics/stage_event_model_examples.rb
+++ b/spec/support/shared_examples/models/concerns/analytics/cycle_analytics/stage_event_model_examples.rb
@@ -2,7 +2,7 @@
RSpec.shared_examples 'StageEventModel' do
describe '.upsert_data' do
- let(:time) { Time.parse(Time.current.to_s(:db)) } # truncating the timestamp so we can compare it with the timestamp loaded from the DB
+ let(:time) { Time.parse(Time.current.to_fs(:db)) } # truncating the timestamp so we can compare it with the timestamp loaded from the DB
let(:input_data) do
[
{
diff --git a/spec/support/shared_examples/models/concerns/protected_ref_access_examples.rb b/spec/support/shared_examples/models/concerns/protected_ref_access_examples.rb
index 4753d7a4556..0e9200f1fd9 100644
--- a/spec/support/shared_examples/models/concerns/protected_ref_access_examples.rb
+++ b/spec/support/shared_examples/models/concerns/protected_ref_access_examples.rb
@@ -6,16 +6,34 @@ RSpec.shared_examples 'protected ref access' do |association|
let_it_be(:project) { create(:project) }
let_it_be(:protected_ref) { create(association, project: project) } # rubocop:disable Rails/SaveBang
- it { is_expected.to validate_inclusion_of(:access_level).in_array(described_class.allowed_access_levels) }
+ describe 'validations' do
+ subject { build(described_class.model_name.singular) }
- it { is_expected.to validate_presence_of(:access_level) }
+ context 'when role?' do
+ it { is_expected.to validate_inclusion_of(:access_level).in_array(described_class.allowed_access_levels) }
- context 'when not role?' do
- before do
- allow(subject).to receive(:role?).and_return(false)
+ it { is_expected.to validate_presence_of(:access_level) }
+
+ it do
+ is_expected.to validate_uniqueness_of(:access_level)
+ .scoped_to("#{described_class.module_parent.model_name.singular}_id")
+ end
end
- it { is_expected.not_to validate_presence_of(:access_level) }
+ context 'when not role?' do
+ before do
+ allow(subject).to receive(:role?).and_return(false)
+ end
+
+ it { is_expected.not_to validate_presence_of(:access_level) }
+
+ it { is_expected.not_to validate_inclusion_of(:access_level).in_array(described_class.allowed_access_levels) }
+
+ it do
+ is_expected.not_to validate_uniqueness_of(:access_level)
+ .scoped_to("#{described_class.module_parent.model_name.singular}_id")
+ end
+ end
end
describe '::human_access_levels' do
diff --git a/spec/support/shared_examples/models/concerns/protected_ref_deploy_key_access_examples.rb b/spec/support/shared_examples/models/concerns/protected_ref_deploy_key_access_examples.rb
new file mode 100644
index 00000000000..f2e79dc377b
--- /dev/null
+++ b/spec/support/shared_examples/models/concerns/protected_ref_deploy_key_access_examples.rb
@@ -0,0 +1,132 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'protected ref deploy_key access' do
+ let_it_be(:described_instance) { described_class.model_name.singular }
+ let_it_be(:protected_ref_name) { described_class.module_parent.model_name.singular }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:protected_ref) { create(protected_ref_name, project: project) } # rubocop:disable Rails/SaveBang
+
+ describe 'associations' do
+ it { is_expected.to belong_to(:deploy_key) }
+ end
+
+ describe 'validations' do
+ context 'when deploy_key?' do
+ context 'when deploy key enabled for the project' do
+ let(:deploy_key) do
+ create(:deploy_keys_project, :write_access, project: project).deploy_key
+ end
+
+ it 'is valid' do
+ level = build(described_instance, protected_ref_name => protected_ref, deploy_key: deploy_key)
+
+ expect(level).to be_valid
+ end
+ end
+
+ context 'when a deploy key already added for this access level' do
+ let(:deploy_key) { create(:deploy_keys_project, :write_access, project: project).deploy_key }
+
+ before do
+ create(described_instance, protected_ref_name => protected_ref, deploy_key: deploy_key)
+ end
+
+ subject(:access_level) do
+ build(described_instance, protected_ref_name => protected_ref, deploy_key: deploy_key)
+ end
+
+ it 'is not valid', :aggregate_failures do
+ is_expected.to be_invalid
+ expect(access_level.errors.full_messages).to contain_exactly('Deploy key has already been taken')
+ end
+ end
+
+ context 'when deploy key is not enabled for the project' do
+ subject(:access_level) do
+ build(described_instance, protected_ref_name => protected_ref, deploy_key: create(:deploy_key))
+ end
+
+ it 'is not valid', :aggregate_failures do
+ is_expected.to be_invalid
+ expect(access_level.errors.full_messages).to contain_exactly('Deploy key is not enabled for this project')
+ end
+ end
+
+ context 'when deploy key is not active for the project' do
+ subject(:access_level) do
+ deploy_key = create(:deploy_keys_project, :readonly_access, project: project).deploy_key
+ build(described_instance, protected_ref_name => protected_ref, deploy_key: deploy_key)
+ end
+
+ it 'is not valid', :aggregate_failures do
+ is_expected.to be_invalid
+ expect(access_level.errors.full_messages).to contain_exactly('Deploy key is not enabled for this project')
+ end
+ end
+ end
+ end
+
+ describe '#check_access' do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:deploy_key) { create(:deploy_key, user: user) }
+ let_it_be(:deploy_keys_project) do
+ create(:deploy_keys_project, :write_access, project: project, deploy_key: deploy_key)
+ end
+
+ before_all do
+ project.add_maintainer(user)
+ end
+
+ context "when this #{described_class.model_name.singular} is tied to a deploy key" do
+ let!(:access_level) do
+ create(described_instance, protected_ref_name => protected_ref, deploy_key: deploy_key)
+ end
+
+ context 'when the deploy key is among the active keys for this project' do
+ it { expect(access_level.check_access(user)).to be_truthy }
+ end
+
+ context 'when user is missing' do
+ it { expect(access_level.check_access(nil)).to be_falsey }
+ end
+
+ context 'when deploy key does not belong to the user' do
+ let(:another_user) { create(:user) }
+
+ it { expect(access_level.check_access(another_user)).to be_falsey }
+ end
+
+ context 'when user cannot access the project' do
+ before do
+ allow(user).to receive(:can?).with(:read_project, project).and_return(false)
+ end
+
+ it { expect(access_level.check_access(user)).to be_falsey }
+ end
+
+ context 'when the deploy key is not among the active keys of this project' do
+ before do
+ deploy_keys_project.update!(can_push: false)
+ end
+
+ after do
+ deploy_keys_project.update!(can_push: true)
+ end
+
+ it { expect(access_level.check_access(user)).to be_falsey }
+ end
+ end
+ end
+
+ describe '#type' do
+ let(:access_level) { build(described_instance) }
+
+ context 'when deploy_key?' do
+ let(:access_level) { build(described_instance, deploy_key: build(:deploy_key)) }
+
+ it 'returns :deploy_key' do
+ expect(access_level.type).to eq(:deploy_key)
+ end
+ end
+ end
+end
diff --git a/spec/support/shared_examples/models/database_event_tracking_shared_examples.rb b/spec/support/shared_examples/models/database_event_tracking_shared_examples.rb
index 3d98d9136e2..56b36b3ea07 100644
--- a/spec/support/shared_examples/models/database_event_tracking_shared_examples.rb
+++ b/spec/support/shared_examples/models/database_event_tracking_shared_examples.rb
@@ -12,7 +12,6 @@ RSpec.shared_examples 'database events tracking' do
let(:category) { described_class.to_s }
let(:label) { described_class.table_name }
let(:action) { "database_event_#{property}" }
- let(:feature_flag_name) { :product_intelligence_database_event_tracking }
let(:record_tracked_attributes) { record.attributes.slice(*described_class::SNOWPLOW_ATTRIBUTES.map(&:to_s)) }
let(:base_extra) { record_tracked_attributes.merge(project: try(:project), namespace: try(:namespace)) }
@@ -48,9 +47,3 @@ RSpec.shared_examples 'database events tracking' do
end
end
end
-
-RSpec.shared_examples 'database events tracking batch 2' do
- it_behaves_like 'database events tracking' do
- let(:feature_flag_name) { :product_intelligence_database_event_tracking_batch2 }
- end
-end
diff --git a/spec/support/shared_examples/models/integrations/base_slash_commands_shared_examples.rb b/spec/support/shared_examples/models/integrations/base_slash_commands_shared_examples.rb
index 0cf109ce5c5..ff3cc1841b4 100644
--- a/spec/support/shared_examples/models/integrations/base_slash_commands_shared_examples.rb
+++ b/spec/support/shared_examples/models/integrations/base_slash_commands_shared_examples.rb
@@ -122,7 +122,7 @@ RSpec.shared_examples Integrations::BaseSlashCommands do
end
it_behaves_like 'blocks command execution' do
- let(:error_message) { 'your account has been deactivated by your administrator' }
+ let(:error_message) { "your #{Gitlab.config.gitlab.url} account needs to be reactivated" }
end
end
end
diff --git a/spec/support/shared_examples/namespaces/traversal_examples.rb b/spec/support/shared_examples/namespaces/traversal_examples.rb
index 600539f7d0a..4dff4f68995 100644
--- a/spec/support/shared_examples/namespaces/traversal_examples.rb
+++ b/spec/support/shared_examples/namespaces/traversal_examples.rb
@@ -239,13 +239,11 @@ RSpec.shared_examples 'namespace traversal' do
end
describe '#ancestors_upto' do
- context 'with use_traversal_ids_for_ancestors_upto enabled' do
- include_examples '#ancestors_upto'
- end
+ include_examples '#ancestors_upto'
- context 'with use_traversal_ids_for_ancestors_upto disabled' do
+ context 'with use_traversal_ids disabled' do
before do
- stub_feature_flags(use_traversal_ids_for_ancestors_upto: false)
+ stub_feature_flags(use_traversal_ids: false)
end
include_examples '#ancestors_upto'
diff --git a/spec/support/shared_examples/namespaces/traversal_scope_examples.rb b/spec/support/shared_examples/namespaces/traversal_scope_examples.rb
index 0c4e5ce51fc..b308295b5fb 100644
--- a/spec/support/shared_examples/namespaces/traversal_scope_examples.rb
+++ b/spec/support/shared_examples/namespaces/traversal_scope_examples.rb
@@ -70,10 +70,9 @@ RSpec.shared_examples 'namespace traversal scopes' do
end
describe '.roots' do
- context "use_traversal_ids_roots feature flag is true" do
+ context "use_traversal_ids feature flag is true" do
before do
stub_feature_flags(use_traversal_ids: true)
- stub_feature_flags(use_traversal_ids_roots: true)
end
it_behaves_like '.roots'
@@ -83,9 +82,9 @@ RSpec.shared_examples 'namespace traversal scopes' do
end
end
- context "use_traversal_ids_roots feature flag is false" do
+ context "use_traversal_ids feature flag is false" do
before do
- stub_feature_flags(use_traversal_ids_roots: false)
+ stub_feature_flags(use_traversal_ids: false)
end
it_behaves_like '.roots'
diff --git a/spec/support/shared_examples/nav_sidebar_shared_examples.rb b/spec/support/shared_examples/nav_sidebar_shared_examples.rb
deleted file mode 100644
index 4b815988bc5..00000000000
--- a/spec/support/shared_examples/nav_sidebar_shared_examples.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-# frozen_string_literal: true
-
-RSpec.shared_examples 'has nav sidebar' do
- it 'has collapsed nav sidebar on mobile' do
- render
-
- expect(rendered).to have_selector('.nav-sidebar')
- expect(rendered).not_to have_selector('.sidebar-collapsed-desktop')
- expect(rendered).not_to have_selector('.sidebar-expanded-mobile')
- end
-end
-
-RSpec.shared_examples 'page has active tab' do |title|
- it "activates #{title} tab" do
- expect(page).to have_selector('.sidebar-top-level-items > li.active', count: 1)
- expect(find('.sidebar-top-level-items > li.active')).to have_content(title)
- end
-end
-
-RSpec.shared_examples 'page has active sub tab' do |title|
- it "activates #{title} sub tab" do
- expect(page).to have_selector('.sidebar-sub-level-items > li.active:not(.fly-out-top-item)', count: 1)
- expect(find('.sidebar-sub-level-items > li.active:not(.fly-out-top-item)'))
- .to have_content(title)
- end
-end
-
-RSpec.shared_examples 'sidebar includes snowplow attributes' do |track_action, track_label, track_property|
- specify do
- stub_application_setting(snowplow_enabled: true)
-
- render
-
- expect(rendered).to have_css(".nav-sidebar[data-track-action=\"#{track_action}\"][data-track-label=\"#{track_label}\"][data-track-property=\"#{track_property}\"]")
- end
-end
diff --git a/spec/support/shared_examples/npm_sync_metadata_cache_worker_shared_examples.rb b/spec/support/shared_examples/npm_sync_metadata_cache_worker_shared_examples.rb
new file mode 100644
index 00000000000..de2dc4c3725
--- /dev/null
+++ b/spec/support/shared_examples/npm_sync_metadata_cache_worker_shared_examples.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'does not enqueue a worker to sync a metadata cache' do
+ it 'does not enqueue a worker to sync a metadata cache' do
+ expect(Packages::Npm::CreateMetadataCacheWorker).not_to receive(:perform_async)
+
+ subject
+ end
+end
+
+RSpec.shared_examples 'enqueue a worker to sync a metadata cache' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ it 'enqueues a worker to create a metadata cache' do
+ expect(Packages::Npm::CreateMetadataCacheWorker)
+ .to receive(:perform_async).with(project.id, package_name)
+
+ subject
+ end
+
+ context 'with npm_metadata_cache disabled' do
+ before do
+ stub_feature_flags(npm_metadata_cache: false)
+ end
+
+ it_behaves_like 'does not enqueue a worker to sync a metadata cache'
+ end
+end
diff --git a/spec/support/shared_examples/observability/csp_shared_examples.rb b/spec/support/shared_examples/observability/csp_shared_examples.rb
index 9d6e7e75f4d..9002ccd5878 100644
--- a/spec/support/shared_examples/observability/csp_shared_examples.rb
+++ b/spec/support/shared_examples/observability/csp_shared_examples.rb
@@ -5,23 +5,28 @@
# It requires the following variables declared in the context including this example:
#
# - `tested_path`: the path under test
-# - `user`: the test user
-# - `group`: the test group
#
# e.g.
#
# ```
-# let_it_be(:group) { create(:group) }
-# let_it_be(:user) { create(:user) }
# it_behaves_like "observability csp policy" do
# let(:tested_path) { ....the path under test }
# end
# ```
#
+# Note that the context's user is expected to be logged-in and the
+# related resources (group, project, etc) are supposed to be provided with proper
+# permissions already, e.g.
+#
+# before do
+# login_as(user)
+# group.add_developer(user)
+# end
+#
# It optionally supports specifying the controller class handling the tested path as a parameter, e.g.
#
# ```
-# it_behaves_like "observability csp policy", Groups::ObservabilityController
+# it_behaves_like "observability csp policy", Projects::TracingController
# ```
# (If not specified it will default to `described_class`)
#
@@ -41,9 +46,6 @@ RSpec.shared_examples 'observability csp policy' do |controller_class = describe
before do
setup_csp_for_controller(controller_class, csp, any_time: true)
- group.add_developer(user)
- login_as(user)
- stub_feature_flags(observability_group_tab: true)
end
subject do
@@ -59,93 +61,127 @@ RSpec.shared_examples 'observability csp policy' do |controller_class = describe
end
end
- context 'when observability is disabled' do
- let(:csp) do
- ActionDispatch::ContentSecurityPolicy.new do |p|
- p.frame_src 'https://something.test'
+ describe 'frame-src' do
+ context 'when frame-src exists in the CSP config' do
+ let(:csp) do
+ ActionDispatch::ContentSecurityPolicy.new do |p|
+ p.frame_src 'https://something.test'
+ end
end
- end
- before do
- stub_feature_flags(observability_group_tab: false)
+ it 'appends the proper url to frame-src CSP directives' do
+ expect(subject).to include(
+ "frame-src https://something.test #{observability_url} #{signin_url} #{oauth_url}")
+ end
end
- it 'does not add observability urls to the csp header' do
- expect(subject).to include("frame-src https://something.test")
- expect(subject).not_to include("#{observability_url} #{signin_url} #{oauth_url}")
- end
- end
+ context 'when signin url is already present in the policy' do
+ let(:csp) do
+ ActionDispatch::ContentSecurityPolicy.new do |p|
+ p.frame_src signin_url
+ end
+ end
- context 'when frame-src exists in the CSP config' do
- let(:csp) do
- ActionDispatch::ContentSecurityPolicy.new do |p|
- p.frame_src 'https://something.test'
+ it 'does not append signin again' do
+ expect(subject).to include(
+ "frame-src #{signin_url} #{observability_url} #{oauth_url};")
end
end
- it 'appends the proper url to frame-src CSP directives' do
- expect(subject).to include(
- "frame-src https://something.test #{observability_url} #{signin_url} #{oauth_url}")
- end
- end
+ context 'when oauth url is already present in the policy' do
+ let(:csp) do
+ ActionDispatch::ContentSecurityPolicy.new do |p|
+ p.frame_src oauth_url
+ end
+ end
- context 'when signin is already present in the policy' do
- let(:csp) do
- ActionDispatch::ContentSecurityPolicy.new do |p|
- p.frame_src signin_url
+ it 'does not append oauth again' do
+ expect(subject).to include(
+ "frame-src #{oauth_url} #{observability_url} #{signin_url};")
end
end
- it 'does not append signin again' do
- expect(subject).to include(
- "frame-src #{signin_url} #{observability_url} #{oauth_url};")
- end
- end
+ context 'when default-src exists in the CSP config' do
+ let(:csp) do
+ ActionDispatch::ContentSecurityPolicy.new do |p|
+ p.default_src 'https://something.test'
+ end
+ end
+
+ it 'does not change default-src' do
+ expect(subject).to include(
+ "default-src https://something.test;")
+ end
- context 'when oauth is already present in the policy' do
- let(:csp) do
- ActionDispatch::ContentSecurityPolicy.new do |p|
- p.frame_src oauth_url
+ it 'appends the proper url to frame-src CSP directives' do
+ expect(subject).to include(
+ "frame-src https://something.test #{observability_url} #{signin_url} #{oauth_url}")
end
end
- it 'does not append oauth again' do
- expect(subject).to include(
- "frame-src #{oauth_url} #{observability_url} #{signin_url};")
+ context 'when frame-src and default-src exist in the CSP config' do
+ let(:csp) do
+ ActionDispatch::ContentSecurityPolicy.new do |p|
+ p.default_src 'https://something_default.test'
+ p.frame_src 'https://something.test'
+ end
+ end
+
+ it 'appends to frame-src CSP directives' do
+ expect(subject).to include(
+ "frame-src https://something.test #{observability_url} #{signin_url} #{oauth_url}")
+ expect(subject).to include(
+ "default-src https://something_default.test")
+ end
end
end
- context 'when default-src exists in the CSP config' do
- let(:csp) do
- ActionDispatch::ContentSecurityPolicy.new do |p|
- p.default_src 'https://something.test'
+ describe 'connect-src' do
+ context 'when connect-src exists in the CSP config' do
+ let(:csp) do
+ ActionDispatch::ContentSecurityPolicy.new do |p|
+ p.connect_src 'https://something.test'
+ end
end
- end
- it 'does not change default-src' do
- expect(subject).to include(
- "default-src https://something.test;")
+ it 'appends the proper url to connect-src CSP directives' do
+ expect(subject).to include(
+ "connect-src https://something.test localhost #{observability_url}")
+ end
end
- it 'appends the proper url to frame-src CSP directives' do
- expect(subject).to include(
- "frame-src https://something.test #{observability_url} #{signin_url} #{oauth_url}")
- end
- end
+ context 'when default-src exists in the CSP config' do
+ let(:csp) do
+ ActionDispatch::ContentSecurityPolicy.new do |p|
+ p.default_src 'https://something.test'
+ end
+ end
+
+ it 'does not change default-src' do
+ expect(subject).to include(
+ "default-src https://something.test;")
+ end
- context 'when frame-src and default-src exist in the CSP config' do
- let(:csp) do
- ActionDispatch::ContentSecurityPolicy.new do |p|
- p.default_src 'https://something_default.test'
- p.frame_src 'https://something.test'
+ it 'appends the proper url to connect-src CSP directives' do
+ expect(subject).to include(
+ "connect-src https://something.test localhost #{observability_url}")
end
end
- it 'appends to frame-src CSP directives' do
- expect(subject).to include(
- "frame-src https://something.test #{observability_url} #{signin_url} #{oauth_url}")
- expect(subject).to include(
- "default-src https://something_default.test")
+ context 'when connect-src and default-src exist in the CSP config' do
+ let(:csp) do
+ ActionDispatch::ContentSecurityPolicy.new do |p|
+ p.default_src 'https://something_default.test'
+ p.connect_src 'https://something.test'
+ end
+ end
+
+ it 'appends to connect-src CSP directives' do
+ expect(subject).to include(
+ "connect-src https://something.test localhost #{observability_url}")
+ expect(subject).to include(
+ "default-src https://something_default.test")
+ end
end
end
end
diff --git a/spec/support/shared_examples/quick_actions/issuable/close_quick_action_shared_examples.rb b/spec/support/shared_examples/quick_actions/issuable/close_quick_action_shared_examples.rb
index 7cbaf40721a..4b27f1f2520 100644
--- a/spec/support/shared_examples/quick_actions/issuable/close_quick_action_shared_examples.rb
+++ b/spec/support/shared_examples/quick_actions/issuable/close_quick_action_shared_examples.rb
@@ -2,6 +2,7 @@
RSpec.shared_examples 'close quick action' do |issuable_type|
include Features::NotesHelpers
+ include ContentEditorHelpers
before do
project.add_maintainer(maintainer)
@@ -76,6 +77,7 @@ RSpec.shared_examples 'close quick action' do |issuable_type|
context "preview of note on #{issuable_type}", :js do
it 'explains close quick action' do
visit public_send("project_#{issuable_type}_path", project, issuable)
+ close_rich_text_promo_popover_if_present
preview_note("this is done, close\n/close") do
expect(page).not_to have_content '/close'
diff --git a/spec/support/shared_examples/quick_actions/merge_request/merge_quick_action_shared_examples.rb b/spec/support/shared_examples/quick_actions/merge_request/merge_quick_action_shared_examples.rb
index acbc6429646..cf5a67f6096 100644
--- a/spec/support/shared_examples/quick_actions/merge_request/merge_quick_action_shared_examples.rb
+++ b/spec/support/shared_examples/quick_actions/merge_request/merge_quick_action_shared_examples.rb
@@ -41,7 +41,13 @@ RSpec.shared_examples 'merge quick action' do
it 'schedules to merge the MR' do
add_note("/merge")
- expect(page).to have_content "Scheduled to merge this merge request (Merge when pipeline succeeds)."
+ if Gitlab.ee?
+ expect(page).to(
+ have_content("Scheduled to merge this merge request (Merge when checks pass).")
+ )
+ else
+ expect(page).to have_content "Scheduled to merge this merge request (Merge when pipeline succeeds)."
+ end
expect(merge_request.reload).to be_auto_merge_enabled
expect(merge_request.reload).not_to be_merged
diff --git a/spec/support/shared_examples/quick_actions/work_item/type_change_quick_actions_shared_examples.rb b/spec/support/shared_examples/quick_actions/work_item/type_change_quick_actions_shared_examples.rb
index 9ccb7c0ae42..0fc914d71d5 100644
--- a/spec/support/shared_examples/quick_actions/work_item/type_change_quick_actions_shared_examples.rb
+++ b/spec/support/shared_examples/quick_actions/work_item/type_change_quick_actions_shared_examples.rb
@@ -20,7 +20,7 @@ RSpec.shared_examples 'quick actions that change work item type' do
end
context 'when new type is the same as current type' do
- let(:command) { '/type Issue' }
+ let(:command) { '/type issue' }
it_behaves_like 'quick command error', 'Types are the same'
end
@@ -57,7 +57,7 @@ RSpec.shared_examples 'quick actions that change work item type' do
it 'populates :issue_type: and :work_item_type' do
_, updates, message = service.execute(command, work_item)
- expect(message).to eq(_('Work Item promoted successfully.'))
+ expect(message).to eq(_('Work item promoted successfully.'))
expect(updates).to eq({ issue_type: 'incident', work_item_type: WorkItems::Type.default_by_type(:incident) })
end
@@ -73,7 +73,7 @@ RSpec.shared_examples 'quick actions that change work item type' do
it 'populates :issue_type: and :work_item_type' do
_, updates, message = service.execute(command, work_item)
- expect(message).to eq(_('Work Item promoted successfully.'))
+ expect(message).to eq(_('Work item promoted successfully.'))
expect(updates).to eq({ issue_type: 'issue', work_item_type: WorkItems::Type.default_by_type(:issue) })
end
diff --git a/spec/support/shared_examples/requests/api/debian_packages_shared_examples.rb b/spec/support/shared_examples/requests/api/debian_packages_shared_examples.rb
index 5cb6c3d310f..513f9802b34 100644
--- a/spec/support/shared_examples/requests/api/debian_packages_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/debian_packages_shared_examples.rb
@@ -20,7 +20,6 @@ RSpec.shared_examples 'Debian packages upload request' do |status, body = nil|
if status == :created
it 'creates package files', :aggregate_failures do
expect(::Packages::Debian::CreatePackageFileService).to receive(:new).with(package: be_a(Packages::Package), current_user: be_an(User), params: be_an(Hash)).and_call_original
- expect(::Packages::Debian::ProcessChangesWorker).not_to receive(:perform_async)
if extra_params[:distribution] || file_name.end_with?('.changes')
expect(::Packages::Debian::FindOrCreateIncomingService).not_to receive(:new)
diff --git a/spec/support/shared_examples/requests/api/graphql/issue_list_shared_examples.rb b/spec/support/shared_examples/requests/api/graphql/issue_list_shared_examples.rb
index 930c47dac52..6eceb7c350d 100644
--- a/spec/support/shared_examples/requests/api/graphql/issue_list_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/graphql/issue_list_shared_examples.rb
@@ -17,6 +17,10 @@ RSpec.shared_examples 'graphql issue list request spec' do
end
describe 'filters' do
+ let(:mutually_exclusive_error) do
+ 'only one of [assigneeUsernames, assigneeUsername, assigneeWildcardId] arguments is allowed at the same time.'
+ end
+
before_all do
issue_a.assignee_ids = current_user.id
issue_b.assignee_ids = another_user.id
@@ -31,9 +35,45 @@ RSpec.shared_examples 'graphql issue list request spec' do
it 'returns a mutually exclusive param error' do
post_query
- expect_graphql_errors_to_include(
- 'only one of [assigneeUsernames, assigneeUsername] arguments is allowed at the same time.'
- )
+ expect_graphql_errors_to_include(mutually_exclusive_error)
+ end
+ end
+
+ context 'when both assignee_username and assignee_wildcard_id filters are provided' do
+ let(:issue_filter_params) do
+ { assignee_username: current_user.username, assignee_wildcard_id: :ANY }
+ end
+
+ it 'returns a mutually exclusive param error' do
+ post_query
+
+ expect_graphql_errors_to_include(mutually_exclusive_error)
+ end
+ end
+
+ context 'when filtering by assignee_wildcard_id' do
+ context 'when filtering for all issues with assignees' do
+ let(:issue_filter_params) do
+ { assignee_wildcard_id: :ANY }
+ end
+
+ it 'returns all issues with assignees' do
+ post_query
+
+ expect(issue_ids).to match_array([issue_a, issue_b].map { |i| i.to_gid.to_s })
+ end
+ end
+
+ context 'when filtering for issues without assignees' do
+ let(:issue_filter_params) do
+ { assignee_wildcard_id: :NONE }
+ end
+
+ it 'returns all issues without assignees' do
+ post_query
+
+ expect(issue_ids).to match_array([issue_c, issue_d, issue_e].map { |i| i.to_gid.to_s })
+ end
end
end
@@ -492,7 +532,7 @@ RSpec.shared_examples 'graphql issue list request spec' do
end
before do
- issue_a.update_columns(issue_type: WorkItems::Type.base_types[:incident], work_item_type_id: incident_type.id)
+ issue_a.update_columns(work_item_type_id: incident_type.id)
end
it 'returns the escalation status values' do
diff --git a/spec/support/shared_examples/requests/api/graphql/remote_development_shared_examples.rb b/spec/support/shared_examples/requests/api/graphql/remote_development_shared_examples.rb
new file mode 100644
index 00000000000..7c32c7bf2a9
--- /dev/null
+++ b/spec/support/shared_examples/requests/api/graphql/remote_development_shared_examples.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'workspaces query in licensed environment and with feature flag on' do
+ describe 'when licensed and remote_development_feature_flag feature flag is enabled' do
+ before do
+ stub_licensed_features(remote_development: true)
+
+ post_graphql(query, current_user: current_user)
+ end
+
+ it_behaves_like 'a working graphql query'
+
+ # noinspection RubyResolve
+ it { is_expected.to match_array(a_hash_including('name' => workspace.name)) }
+ # noinspection RubyResolve
+
+ context 'when user is not authorized' do
+ let(:current_user) { create(:user) }
+
+ it { is_expected.to eq([]) }
+ end
+ end
+end
+
+RSpec.shared_examples 'workspaces query in unlicensed environment and with feature flag off' do
+ describe 'when remote_development feature is unlicensed' do
+ before do
+ stub_licensed_features(remote_development: false)
+ post_graphql(query, current_user: current_user)
+ end
+
+ it 'returns an error' do
+ expect(subject).to be_nil
+ expect_graphql_errors_to_include(/'remote_development' licensed feature is not available/)
+ end
+ end
+
+ describe 'when remote_development_feature_flag feature flag is disabled' do
+ before do
+ stub_licensed_features(remote_development: true)
+ stub_feature_flags(remote_development_feature_flag: false)
+ post_graphql(query, current_user: current_user)
+ end
+
+ it 'returns an error' do
+ expect(subject).to be_nil
+ expect_graphql_errors_to_include(/'remote_development_feature_flag' feature flag is disabled/)
+ end
+ end
+end
diff --git a/spec/support/shared_examples/requests/api/ml_model_packages_shared_examples.rb b/spec/support/shared_examples/requests/api/ml_model_packages_shared_examples.rb
index 81ff004779a..47cbd268a65 100644
--- a/spec/support/shared_examples/requests/api/ml_model_packages_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/ml_model_packages_shared_examples.rb
@@ -27,7 +27,7 @@ RSpec.shared_examples 'creates model experiments package files' do
end
it 'returns bad request if package creation fails' do
- allow_next_instance_of(::Packages::MlModel::CreatePackageFileService) do |instance|
+ expect_next_instance_of(::Packages::MlModel::CreatePackageFileService) do |instance|
expect(instance).to receive(:execute).and_return(nil)
end
@@ -106,3 +106,19 @@ RSpec.shared_examples 'process ml model package upload' do
end
end
end
+
+RSpec.shared_examples 'process ml model package download' do
+ context 'when package file exists' do
+ it { is_expected.to have_gitlab_http_status(:success) }
+ end
+
+ context 'when record does not exist' do
+ it 'response is not found' do
+ expect_next_instance_of(::Packages::MlModel::PackageFinder) do |instance|
+ expect(instance).to receive(:execute!).and_raise(ActiveRecord::RecordNotFound)
+ end
+
+ expect(api_response).to have_gitlab_http_status(:not_found)
+ end
+ end
+end
diff --git a/spec/support/shared_examples/requests/api/npm_packages_shared_examples.rb b/spec/support/shared_examples/requests/api/npm_packages_shared_examples.rb
index 5284ed2de21..6b6bf375827 100644
--- a/spec/support/shared_examples/requests/api/npm_packages_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/npm_packages_shared_examples.rb
@@ -44,11 +44,7 @@ RSpec.shared_examples 'handling get metadata requests' do |scope: :project|
end
shared_examples 'reject metadata request' do |status:|
- it 'rejects the metadata request' do
- subject
-
- expect(response).to have_gitlab_http_status(status)
- end
+ it_behaves_like 'returning response status', status
end
shared_examples 'redirect metadata request' do |status:|
@@ -280,13 +276,15 @@ RSpec.shared_examples 'handling get metadata requests' do |scope: :project|
example_name = 'redirect metadata request'
status = :redirected
else
- example_name = 'reject metadata request'
status = :not_found
end
end
status = :not_found if scope == :group && params[:package_name_type] == :non_existing && !params[:request_forward]
+ # Check the error message for :not_found
+ example_name = 'returning response status with error' if status == :not_found
+
it_behaves_like example_name, status: status
end
end
@@ -361,11 +359,11 @@ RSpec.shared_examples 'handling audit request' do |path:, scope: :project|
end
shared_examples 'reject audit request' do |status:|
- it 'rejects the audit request' do
- subject
+ it_behaves_like 'returning response status', status
+ end
- expect(response).to have_gitlab_http_status(status)
- end
+ shared_examples 'reject audit request with error' do |status:|
+ it_behaves_like 'returning response status with error', status: status, error: 'Project not found'
end
shared_examples 'redirect audit request' do |status:|
@@ -464,7 +462,7 @@ RSpec.shared_examples 'handling audit request' do |path:, scope: :project|
example_name = 'redirect audit request'
status = :temporary_redirect
else
- example_name = 'reject audit request'
+ example_name = 'reject audit request with error'
status = :not_found
end
end
@@ -633,12 +631,12 @@ RSpec.shared_examples 'handling get dist tags requests' do |scope: :project|
example_name = "#{params[:expected_result]} package tags request"
status = params[:expected_status]
- if scope == :instance && params[:package_name_type] != :scoped_naming_convention
- example_name = 'reject package tags request'
+ if (scope == :instance && params[:package_name_type] != :scoped_naming_convention) || (scope == :group && params[:package_name_type] == :non_existing)
status = :not_found
end
- status = :not_found if scope == :group && params[:package_name_type] == :non_existing
+ # Check the error message for :not_found
+ example_name = 'returning response status with error' if status == :not_found
it_behaves_like example_name, status: status
end
@@ -858,6 +856,9 @@ RSpec.shared_examples 'handling different package names, visibilities and user r
status = :not_found if scope == :group && params[:package_name_type] == :non_existing && params[:auth].present?
+ # Check the error message for :not_found
+ example_name = 'returning response status with error' if status == :not_found
+
it_behaves_like example_name, status: status
end
end
diff --git a/spec/support/shared_examples/requests/api/npm_packages_tags_shared_examples.rb b/spec/support/shared_examples/requests/api/npm_packages_tags_shared_examples.rb
index 7c20ea661b5..403344efe03 100644
--- a/spec/support/shared_examples/requests/api/npm_packages_tags_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/npm_packages_tags_shared_examples.rb
@@ -36,18 +36,18 @@ RSpec.shared_examples 'accept package tags request' do |status:|
end
context 'with invalid package name' do
- where(:package_name, :status) do
- '%20' | :bad_request
- nil | :not_found
+ where(:package_name, :status, :error) do
+ '%20' | :bad_request | '"Package Name" not given'
+ nil | :not_found | %r{\A(Packages|Project) not found\z}
end
with_them do
- it_behaves_like 'returning response status', params[:status]
+ it_behaves_like 'returning response status with error', status: params[:status], error: params[:error]
end
end
end
-RSpec.shared_examples 'accept create package tag request' do |user_type|
+RSpec.shared_examples 'accept create package tag request' do |status:|
using RSpec::Parameterized::TableSyntax
context 'with valid package name' do
@@ -92,45 +92,55 @@ RSpec.shared_examples 'accept create package tag request' do |user_type|
expect(response.body).to be_empty
end
end
+
+ context 'with ActiveRecord::RecordInvalid error' do
+ before do
+ allow_next_instance_of(Packages::Tag) do |tag|
+ allow(tag).to receive(:save!).and_raise(ActiveRecord::RecordInvalid)
+ end
+ end
+
+ it_behaves_like 'returning response status with error', status: :bad_request, error: 'Record invalid'
+ end
end
context 'with invalid package name' do
- where(:package_name, :status) do
- 'unknown' | :not_found
- '' | :not_found
- '%20' | :bad_request
+ where(:package_name, :status, :error) do
+ 'unknown' | :not_found | %r{\A(Package|Project) not found\z}
+ '' | :not_found | '404 Not Found'
+ '%20' | :bad_request | '"Package Name" not given'
end
with_them do
- it_behaves_like 'returning response status', params[:status]
+ it_behaves_like 'returning response status with error', status: params[:status], error: params[:error]
end
end
context 'with invalid tag name' do
- where(:tag_name, :status) do
- '' | :not_found
- '%20' | :bad_request
+ where(:tag_name, :status, :error) do
+ '' | :not_found | '404 Not Found'
+ '%20' | :bad_request | '"Tag" not given'
end
with_them do
- it_behaves_like 'returning response status', params[:status]
+ it_behaves_like 'returning response status with error', status: params[:status], error: params[:error]
end
end
context 'with invalid version' do
- where(:version, :status) do
- ' ' | :bad_request
- '' | :bad_request
- nil | :bad_request
+ where(:version, :status, :error) do
+ ' ' | :bad_request | '"Version" not given'
+ '' | :bad_request | '"Version" not given'
+ nil | :bad_request | '"Version" not given'
end
with_them do
- it_behaves_like 'returning response status', params[:status]
+ it_behaves_like 'returning response status with error', status: params[:status], error: params[:error]
end
end
end
-RSpec.shared_examples 'accept delete package tag request' do |user_type|
+RSpec.shared_examples 'accept delete package tag request' do |status:|
using RSpec::Parameterized::TableSyntax
context 'with valid package name' do
@@ -159,29 +169,39 @@ RSpec.shared_examples 'accept delete package tag request' do |user_type|
it_behaves_like 'returning response status', :not_found
end
+
+ context 'with ActiveRecord::RecordInvalid error' do
+ before do
+ allow_next_instance_of(::Packages::RemoveTagService) do |service|
+ allow(service).to receive(:execute).and_raise(ActiveRecord::RecordInvalid)
+ end
+ end
+
+ it_behaves_like 'returning response status with error', status: :bad_request, error: 'Record invalid'
+ end
end
context 'with invalid package name' do
- where(:package_name, :status) do
- 'unknown' | :not_found
- '' | :not_found
- '%20' | :bad_request
+ where(:package_name, :status, :error) do
+ 'unknown' | :not_found | %r{\A(Package tag|Project) not found\z}
+ '' | :not_found | '404 Not Found'
+ '%20' | :bad_request | '"Package Name" not given'
end
with_them do
- it_behaves_like 'returning response status', params[:status]
+ it_behaves_like 'returning response status with error', status: params[:status], error: params[:error]
end
end
context 'with invalid tag name' do
- where(:tag_name, :status) do
- 'unknown' | :not_found
- '' | :not_found
- '%20' | :bad_request
+ where(:tag_name, :status, :error) do
+ 'unknown' | :not_found | %r{\A(Package tag|Project) not found\z}
+ '' | :not_found | '404 Not Found'
+ '%20' | :bad_request | '"Tag" not given'
end
with_them do
- it_behaves_like 'returning response status', params[:status]
+ it_behaves_like 'returning response status with error', status: params[:status], error: params[:error]
end
end
end
diff --git a/spec/support/shared_examples/requests/response_status_with_error_shared_examples.rb b/spec/support/shared_examples/requests/response_status_with_error_shared_examples.rb
new file mode 100644
index 00000000000..de012aebaad
--- /dev/null
+++ b/spec/support/shared_examples/requests/response_status_with_error_shared_examples.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'returning response status with error' do |status:, error: nil|
+ it "returns #{status} and error message" do
+ subject
+
+ expect(response).to have_gitlab_http_status(status)
+ expect(json_response['error']).to be_present
+ expect(json_response['error']).to match(error) if error
+ end
+end
diff --git a/spec/support/shared_examples/services/auto_merge_shared_examples.rb b/spec/support/shared_examples/services/auto_merge_shared_examples.rb
new file mode 100644
index 00000000000..b295b65fdd1
--- /dev/null
+++ b/spec/support/shared_examples/services/auto_merge_shared_examples.rb
@@ -0,0 +1,182 @@
+# frozen_string_literal: true
+
+RSpec.shared_context 'for auto_merge strategy context' do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project, :repository) }
+
+ let(:mr_merge_if_green_enabled) do
+ create(:merge_request,
+ merge_when_pipeline_succeeds: true,
+ merge_user: user,
+ source_branch: 'master', target_branch: 'feature',
+ source_project: project, target_project: project,
+ state: 'opened')
+ end
+
+ let(:pipeline) { create(:ci_pipeline, ref: mr_merge_if_green_enabled.source_branch, project: project) }
+
+ let(:service) { described_class.new(project, user, commit_message: 'Awesome message') }
+
+ before_all do
+ project.add_maintainer(user)
+ end
+
+ before do
+ allow(MergeWorker).to receive(:with_status).and_return(MergeWorker)
+ end
+end
+
+RSpec.shared_examples 'auto_merge service #execute' do
+ let(:merge_request) do
+ create(:merge_request, target_project: project, source_project: project,
+ source_branch: 'feature', target_branch: 'master')
+ end
+
+ context 'when first time enabling' do
+ before do
+ allow(merge_request)
+ .to receive_messages(head_pipeline: pipeline, actual_head_pipeline: pipeline)
+ allow(MailScheduler::NotificationServiceWorker).to receive(:perform_async)
+
+ service.execute(merge_request)
+ end
+
+ it 'sets the params, merge_user, and flag' do
+ expect(merge_request).to be_valid
+ expect(merge_request.merge_when_pipeline_succeeds).to be_truthy
+ expect(merge_request.merge_params).to include 'commit_message' => 'Awesome message'
+ expect(merge_request.merge_user).to be user
+ expect(merge_request.auto_merge_strategy).to eq auto_merge_strategy
+ end
+
+ it 'schedules a notification' do
+ expect(MailScheduler::NotificationServiceWorker).to have_received(:perform_async).with(
+ 'merge_when_pipeline_succeeds', merge_request, user).once
+ end
+
+ it 'creates a system note' do
+ pipeline = build(:ci_pipeline)
+ allow(merge_request).to receive(:actual_head_pipeline) { pipeline }
+
+ note = merge_request.notes.last
+ expect(note.note).to match expected_note
+ end
+ end
+
+ context 'when already approved' do
+ let(:service) { described_class.new(project, user, should_remove_source_branch: true) }
+ let(:build) { create(:ci_build, ref: mr_merge_if_green_enabled.source_branch) }
+
+ before do
+ allow(mr_merge_if_green_enabled)
+ .to receive_messages(head_pipeline: pipeline, actual_head_pipeline: pipeline)
+
+ allow(mr_merge_if_green_enabled).to receive(:mergeable?)
+ .and_return(true)
+
+ allow(pipeline).to receive(:success?).and_return(true)
+ end
+
+ it 'updates the merge params' do
+ expect(SystemNoteService).not_to receive(:merge_when_pipeline_succeeds)
+ expect(MailScheduler::NotificationServiceWorker).not_to receive(:perform_async).with(
+ 'merge_when_pipeline_succeeds', any_args)
+
+ service.execute(mr_merge_if_green_enabled)
+ expect(mr_merge_if_green_enabled.merge_params).to have_key('should_remove_source_branch')
+ end
+ end
+end
+
+RSpec.shared_examples 'auto_merge service #process' do
+ let(:merge_request_ref) { mr_merge_if_green_enabled.source_branch }
+ let(:merge_request_head) do
+ project.commit(mr_merge_if_green_enabled.source_branch).id
+ end
+
+ context 'when triggered by pipeline with valid ref and sha' do
+ let(:triggering_pipeline) do
+ create(:ci_pipeline, project: project, ref: merge_request_ref,
+ sha: merge_request_head, status: 'success',
+ head_pipeline_of: mr_merge_if_green_enabled)
+ end
+
+ it "merges all merge requests with merge when the pipeline succeeds enabled" do
+ allow(mr_merge_if_green_enabled)
+ .to receive_messages(head_pipeline: triggering_pipeline, actual_head_pipeline: triggering_pipeline)
+
+ expect(MergeWorker).to receive(:perform_async)
+ service.process(mr_merge_if_green_enabled)
+ end
+ end
+
+ context 'when triggered by an old pipeline' do
+ let(:old_pipeline) do
+ create(:ci_pipeline, project: project, ref: merge_request_ref,
+ sha: '1234abcdef', status: 'success')
+ end
+
+ it 'does not merge request' do
+ expect(MergeWorker).not_to receive(:perform_async)
+ service.process(mr_merge_if_green_enabled)
+ end
+ end
+
+ context 'when triggered by pipeline from a different branch' do
+ let(:unrelated_pipeline) do
+ create(:ci_pipeline, project: project, ref: 'feature',
+ sha: merge_request_head, status: 'success')
+ end
+
+ it 'does not merge request' do
+ expect(MergeWorker).not_to receive(:perform_async)
+ service.process(mr_merge_if_green_enabled)
+ end
+ end
+
+ context 'when pipeline is merge request pipeline' do
+ let(:pipeline) do
+ create(:ci_pipeline, :success,
+ source: :merge_request_event,
+ ref: mr_merge_if_green_enabled.merge_ref_path,
+ merge_request: mr_merge_if_green_enabled,
+ merge_requests_as_head_pipeline: [mr_merge_if_green_enabled])
+ end
+
+ it 'merges the associated merge request' do
+ allow(mr_merge_if_green_enabled)
+ .to receive_messages(head_pipeline: pipeline, actual_head_pipeline: pipeline)
+
+ expect(MergeWorker).to receive(:perform_async)
+ service.process(mr_merge_if_green_enabled)
+ end
+ end
+end
+
+RSpec.shared_examples 'auto_merge service #cancel' do
+ before do
+ service.cancel(mr_merge_if_green_enabled)
+ end
+
+ it "resets all the pipeline succeeds params" do
+ expect(mr_merge_if_green_enabled.merge_when_pipeline_succeeds).to be_falsey
+ expect(mr_merge_if_green_enabled.merge_params).to eq({})
+ expect(mr_merge_if_green_enabled.merge_user).to be nil
+ end
+
+ it 'posts a system note' do
+ note = mr_merge_if_green_enabled.notes.last
+ expect(note.note).to include 'canceled the automatic merge'
+ end
+end
+
+RSpec.shared_examples 'auto_merge service #abort' do
+ before do
+ service.abort(mr_merge_if_green_enabled, 'an error')
+ end
+
+ it 'posts a system note' do
+ note = mr_merge_if_green_enabled.notes.last
+ expect(note.note).to include 'aborted the automatic merge'
+ end
+end
diff --git a/spec/support/shared_examples/services/boards/issues_move_service_shared_examples.rb b/spec/support/shared_examples/services/boards/issues_move_service_shared_examples.rb
index 162be24fe8f..9d016e4830e 100644
--- a/spec/support/shared_examples/services/boards/issues_move_service_shared_examples.rb
+++ b/spec/support/shared_examples/services/boards/issues_move_service_shared_examples.rb
@@ -54,7 +54,7 @@ RSpec.shared_examples 'issues move service' do |group|
context 'when moving to backlog' do
let(:milestone) { create(:milestone, project: project) }
- let!(:backlog) { create(:backlog_list, board: board1) }
+ let!(:backlog) { board1.lists.backlog.first }
let(:issue) { create(:labeled_issue, project: project, labels: [bug, development, testing, regression], milestone: milestone) }
let(:params) { { board_id: board1.id, from_list_id: list2.id, to_list_id: backlog.id } }
diff --git a/spec/support/shared_examples/services/boards/lists_list_service_shared_examples.rb b/spec/support/shared_examples/services/boards/lists_list_service_shared_examples.rb
index b9f28fab558..716ed482b4b 100644
--- a/spec/support/shared_examples/services/boards/lists_list_service_shared_examples.rb
+++ b/spec/support/shared_examples/services/boards/lists_list_service_shared_examples.rb
@@ -2,7 +2,7 @@
RSpec.shared_examples 'lists list service' do
context 'when the board has a backlog list' do
- let!(:backlog_list) { create_backlog_list(board) }
+ let(:backlog_list) { board.lists.backlog.first }
it 'does not create a backlog list' do
expect { service.execute(board) }.not_to change { board.lists.count }
@@ -34,6 +34,10 @@ RSpec.shared_examples 'lists list service' do
end
context 'when the board does not have a backlog list' do
+ before do
+ board.lists.backlog.delete_all
+ end
+
it 'creates a backlog list' do
expect { service.execute(board) }.to change { board.lists.count }.by(1)
end
diff --git a/spec/support/shared_examples/services/issuable/issuable_import_csv_service_shared_examples.rb b/spec/support/shared_examples/services/issuable/issuable_import_csv_service_shared_examples.rb
index 5336e0f4c2f..8a3ab07bbfe 100644
--- a/spec/support/shared_examples/services/issuable/issuable_import_csv_service_shared_examples.rb
+++ b/spec/support/shared_examples/services/issuable/issuable_import_csv_service_shared_examples.rb
@@ -30,6 +30,7 @@ RSpec.shared_examples 'issuable import csv service' do |issuable_type|
context 'with a file generated by Gitlab CSV export' do
let(:file) { fixture_file_upload('spec/fixtures/csv_gitlab_export.csv') }
+ let!(:test_milestone) { create(:milestone, project: project, title: 'v1.0') }
it 'imports the CSV without errors' do
expect(subject[:success]).to eq(4)
diff --git a/spec/support/shared_examples/views/nav_sidebar_shared_examples.rb b/spec/support/shared_examples/views/nav_sidebar_shared_examples.rb
new file mode 100644
index 00000000000..d4c00738bdb
--- /dev/null
+++ b/spec/support/shared_examples/views/nav_sidebar_shared_examples.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'has nav sidebar' do
+ it 'has collapsed nav sidebar on mobile' do
+ render
+
+ expect(rendered).to have_selector('.nav-sidebar')
+ expect(rendered).not_to have_selector('.sidebar-collapsed-desktop')
+ expect(rendered).not_to have_selector('.sidebar-expanded-mobile')
+ end
+end
+
+RSpec.shared_examples 'sidebar includes snowplow attributes' do |track_action, track_label, track_property|
+ specify do
+ stub_application_setting(snowplow_enabled: true)
+
+ render
+
+ expect(rendered)
+ .to have_css(
+ ".nav-sidebar[data-track-action=\"#{track_action}\"]" \
+ "[data-track-label=\"#{track_label}\"][data-track-property=\"#{track_property}\"]"
+ )
+ end
+end
diff --git a/spec/support/shared_examples/views/pipeline_status_changes_email.rb b/spec/support/shared_examples/views/pipeline_status_changes_email.rb
index fe6cc5e03d2..a2db05c319e 100644
--- a/spec/support/shared_examples/views/pipeline_status_changes_email.rb
+++ b/spec/support/shared_examples/views/pipeline_status_changes_email.rb
@@ -25,6 +25,8 @@ RSpec.shared_examples 'pipeline status changes email' do
end
shared_examples_for 'renders the pipeline status changes email correctly' do
+ let(:pipeline_name_or_id) { pipeline.name || "##{pipeline.id}" }
+
context 'pipeline with user' do
it 'renders the email correctly' do
render
@@ -33,11 +35,12 @@ RSpec.shared_examples 'pipeline status changes email' do
expect(rendered).to have_content pipeline.project.name
expect(rendered).to have_content pipeline.git_commit_message.truncate(50).gsub(/\s+/, ' ')
expect(rendered).to have_content pipeline.commit.author_name
- expect(rendered).to have_content "##{pipeline.id}"
+ expect(rendered).to have_content pipeline_name_or_id
expect(rendered).to have_content pipeline.user.name
if status == :failed
expect(rendered).to have_content build.name
+ expect(rendered).to include("#{build.project.full_path}/-/jobs/#{build.id}") unless build.is_a?(Ci::Bridge)
end
end
@@ -56,11 +59,12 @@ RSpec.shared_examples 'pipeline status changes email' do
expect(rendered).to have_content pipeline.project.name
expect(rendered).to have_content pipeline.git_commit_message.truncate(50).gsub(/\s+/, ' ')
expect(rendered).to have_content pipeline.commit.author_name
- expect(rendered).to have_content "##{pipeline.id}"
+ expect(rendered).to have_content pipeline_name_or_id
expect(rendered).to have_content "by API"
if status == :failed
expect(rendered).to have_content build.name
+ expect(rendered).to include("#{build.project.full_path}/-/jobs/#{build.id}") unless build.is_a?(Ci::Bridge)
end
end
end
diff --git a/spec/support/shared_examples/views/preferred_language.rb b/spec/support/shared_examples/views/preferred_language.rb
new file mode 100644
index 00000000000..bd6c34bfcc7
--- /dev/null
+++ b/spec/support/shared_examples/views/preferred_language.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'a layout which reflects the preferred language' do
+ context 'when changing the a preferred language' do
+ before do
+ Gitlab::I18n.locale = :es
+ end
+
+ after do
+ Gitlab::I18n.use_default_locale
+ end
+
+ it 'renders the correct `lang` attribute in the html element' do
+ render
+
+ expect(rendered).to have_css('html[lang=es]')
+ end
+ end
+end
diff --git a/spec/support/stub_dot_com_check.rb b/spec/support/stub_dot_com_check.rb
index 6934b33d111..53fa4e4e92e 100644
--- a/spec/support/stub_dot_com_check.rb
+++ b/spec/support/stub_dot_com_check.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
RSpec.configure do |config|
- %i[saas saas_registration].each do |metadata|
+ %i[saas saas_registration saas_trial].each do |metadata|
config.before(:context, metadata) do
# Ensure Gitlab.com? returns true during context.
# This is needed for let_it_be which is shared across examples,
diff --git a/spec/support/system_exit_detected.rb b/spec/support/system_exit_detected.rb
index 86c6af3ba8c..62158e3877f 100644
--- a/spec/support/system_exit_detected.rb
+++ b/spec/support/system_exit_detected.rb
@@ -10,6 +10,9 @@ RSpec.configure do |config|
# because it'll skip any following tests from running.
# Convert it to something that won't skip everything.
# See https://gitlab.com/gitlab-org/gitlab/-/issues/350060
+
+ raise if ENV['RSPEC_BYPASS_SYSTEM_EXIT_PROTECTION'] == 'true'
+
raise SystemExitDetected, "SystemExit should be rescued in the tests!"
end
end
diff --git a/spec/support/time_travel.rb b/spec/support/time_travel.rb
deleted file mode 100644
index 9dfbfd20524..00000000000
--- a/spec/support/time_travel.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-require 'active_support/testing/time_helpers'
-
-RSpec.configure do |config|
- config.include ActiveSupport::Testing::TimeHelpers
-
- config.around(:example, :freeze_time) do |example|
- freeze_time { example.run }
- end
-
- config.around(:example, :time_travel_to) do |example|
- date_or_time = example.metadata[:time_travel_to]
-
- unless date_or_time.respond_to?(:to_time) && date_or_time.to_time.present?
- raise 'The time_travel_to RSpec metadata must have a Date or Time value.'
- end
-
- travel_to(date_or_time) { example.run }
- end
-end
diff --git a/spec/support/webmock.rb b/spec/support/webmock.rb
index 171c7ace2d2..1df92ce70cf 100644
--- a/spec/support/webmock.rb
+++ b/spec/support/webmock.rb
@@ -26,7 +26,14 @@ end
def allowed_host_and_ip(url)
host = URI.parse(url).host
ip_address = Addrinfo.ip(host).ip_address
- [host, ip_address]
+
+ allowed = [host, ip_address]
+
+ # Sometimes IPv6 address has square brackets around it
+ parsed_ip = IPAddr.new(ip_address)
+ allowed << "[#{ip_address}]" if parsed_ip.ipv6?
+
+ allowed
end
def with_net_connect_allowed
diff --git a/spec/support_specs/helpers/graphql_helpers_spec.rb b/spec/support_specs/helpers/graphql_helpers_spec.rb
index 12a6e561257..5d567bb7a13 100644
--- a/spec/support_specs/helpers/graphql_helpers_spec.rb
+++ b/spec/support_specs/helpers/graphql_helpers_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe GraphqlHelpers do
- include GraphqlHelpers
+ include described_class
# Normalize irrelevant whitespace to make comparison easier
def norm(query)
diff --git a/spec/support_specs/matchers/exceed_query_limit_helpers_spec.rb b/spec/support_specs/matchers/exceed_query_limit_helpers_spec.rb
index 0e79e32b78a..19581064626 100644
--- a/spec/support_specs/matchers/exceed_query_limit_helpers_spec.rb
+++ b/spec/support_specs/matchers/exceed_query_limit_helpers_spec.rb
@@ -156,8 +156,8 @@ RSpec.describe ExceedQueryLimitHelpers do
expect(test_matcher.count_queries(recorder)).to eq({
'SELECT "schema_migrations".* FROM "schema_migrations"' => {
- %Q[WHERE "schema_migrations"."version" = 'foo\nbar\nbaz' LIMIT 1] => 2,
- %Q[WHERE "schema_migrations"."version" = 'foo\nbiz\nbaz' LIMIT 1] => 1
+ %[WHERE "schema_migrations"."version" = 'foo\nbar\nbaz' LIMIT 1] => 2,
+ %[WHERE "schema_migrations"."version" = 'foo\nbiz\nbaz' LIMIT 1] => 1
}
})
end
diff --git a/spec/support_specs/matchers/result_matchers_spec.rb b/spec/support_specs/matchers/result_matchers_spec.rb
new file mode 100644
index 00000000000..0c30dd08009
--- /dev/null
+++ b/spec/support_specs/matchers/result_matchers_spec.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+
+require_relative '../../../spec/support/matchers/result_matchers'
+
+RSpec.describe 'result matchers', feature_category: :remote_development do
+ include ResultMatchers
+
+ it 'works with value asserted via argument' do
+ expect(Result.ok(1)).to be_ok_result(1)
+ expect(Result.ok(1)).not_to be_ok_result(2)
+ expect(Result.ok(1)).not_to be_err_result(1)
+ end
+
+ it 'works with value asserted via block' do
+ expect(Result.err('hello')).to be_err_result do |result_value|
+ expect(result_value).to match(/hello/i)
+ end
+ end
+end
diff --git a/spec/support_specs/time_travel_spec.rb b/spec/support_specs/time_travel_spec.rb
deleted file mode 100644
index 8fa51c0c1f0..00000000000
--- a/spec/support_specs/time_travel_spec.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'time travel' do
- describe ':freeze_time' do
- it 'freezes time around a spec example', :freeze_time do
- expect { sleep 0.1 }.not_to change { Time.now.to_f }
- end
- end
-
- describe ':time_travel_to' do
- it 'time-travels to the specified date', time_travel_to: '2020-01-01' do
- expect(Date.current).to eq(Date.new(2020, 1, 1))
- end
-
- it 'time-travels to the specified date & time', time_travel_to: '2020-02-02 10:30:45 -0700' do
- expect(Time.current).to eq(Time.new(2020, 2, 2, 17, 30, 45, '+00:00'))
- end
- end
-end
diff --git a/spec/tasks/dev_rake_spec.rb b/spec/tasks/dev_rake_spec.rb
index 82c9bb4faa2..f5490832982 100644
--- a/spec/tasks/dev_rake_spec.rb
+++ b/spec/tasks/dev_rake_spec.rb
@@ -86,7 +86,7 @@ RSpec.describe 'dev rake tasks' do
end
def expect_connections_to_be_terminated
- expect(Gitlab::Database::EachDatabase).to receive(:each_database_connection)
+ expect(Gitlab::Database::EachDatabase).to receive(:each_connection)
.with(include_shared: false)
.and_call_original
diff --git a/spec/tasks/gitlab/db_rake_spec.rb b/spec/tasks/gitlab/db_rake_spec.rb
index 14bc6095b85..11c541ddfed 100644
--- a/spec/tasks/gitlab/db_rake_spec.rb
+++ b/spec/tasks/gitlab/db_rake_spec.rb
@@ -353,8 +353,8 @@ RSpec.describe 'gitlab:db namespace rake task', :silence_stdout, feature_categor
end
describe 'schema inconsistencies' do
- let(:runner) { instance_double(Gitlab::Database::SchemaValidation::Runner, execute: inconsistencies) }
- let(:inconsistency_class) { Gitlab::Database::SchemaValidation::Inconsistency }
+ let(:runner) { instance_double(Gitlab::Schema::Validation::Runner, execute: inconsistencies) }
+ let(:inconsistency_class) { Gitlab::Schema::Validation::Inconsistency }
let(:inconsistencies) do
[
@@ -375,7 +375,7 @@ RSpec.describe 'gitlab:db namespace rake task', :silence_stdout, feature_categor
end
before do
- allow(Gitlab::Database::SchemaValidation::Runner).to receive(:new).and_return(runner)
+ allow(Gitlab::Schema::Validation::Runner).to receive(:new).and_return(runner)
end
it 'prints the inconsistency message' do
@@ -1109,7 +1109,7 @@ RSpec.describe 'gitlab:db namespace rake task', :silence_stdout, feature_categor
before do
each_database = class_double('Gitlab::Database::EachDatabase').as_stubbed_const
- allow(each_database).to receive(:each_database_connection)
+ allow(each_database).to receive(:each_connection)
.and_yield(connections[:main], 'main')
.and_yield(connections[:ci], 'ci')
diff --git a/spec/tasks/gitlab/feature_categories_rake_spec.rb b/spec/tasks/gitlab/feature_categories_rake_spec.rb
index 33f4bca4c85..f495c7e8911 100644
--- a/spec/tasks/gitlab/feature_categories_rake_spec.rb
+++ b/spec/tasks/gitlab/feature_categories_rake_spec.rb
@@ -40,7 +40,8 @@ RSpec.describe 'gitlab:feature_categories:index', :silence_stdout, feature_categ
)
),
'database_tables' => a_hash_including(
- 'container_scanning' => a_collection_including('vulnerability_advisories')
+ 'continuous_integration' => a_collection_including('ci_pipelines'),
+ 'user_profile' => a_collection_including('users')
)
}
diff --git a/spec/tasks/gitlab/metrics_exporter_rake_spec.rb b/spec/tasks/gitlab/metrics_exporter_rake_spec.rb
deleted file mode 100644
index ca37fc1b5d7..00000000000
--- a/spec/tasks/gitlab/metrics_exporter_rake_spec.rb
+++ /dev/null
@@ -1,81 +0,0 @@
-# frozen_string_literal: true
-
-require 'rake_helper'
-require_relative '../../support/helpers/next_instance_of'
-
-RSpec.describe 'gitlab:metrics_exporter:install', feature_category: :metrics 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: an_instance_of(String),
- 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/tasks/gitlab/packages/events_rake_spec.rb b/spec/tasks/gitlab/packages/events_rake_spec.rb
deleted file mode 100644
index 87f4db360ca..00000000000
--- a/spec/tasks/gitlab/packages/events_rake_spec.rb
+++ /dev/null
@@ -1,55 +0,0 @@
-# frozen_string_literal: true
-
-require 'rake_helper'
-
-RSpec.describe 'gitlab:packages:events namespace rake task', :silence_stdout do
- before :all do
- Rake.application.rake_require 'tasks/gitlab/packages/events'
- end
-
- subject do
- file = double('file')
- yml_file = nil
-
- allow(file).to receive(:<<) { |contents| yml_file = contents }
- allow(File).to receive(:open).and_yield(file)
-
- run_rake_task("gitlab:packages:events:#{task}")
-
- YAML.safe_load(yml_file)
- end
-
- describe 'generate_unique' do
- let(:task) { 'generate_unique' }
-
- it 'excludes guest events' do
- expect(subject.find { |event| event['name'].include?("guest") }).to be_nil
- end
-
- Packages::Event::EVENT_SCOPES.keys.each do |event_scope|
- it "includes `#{event_scope}` scope" do
- expect(subject.find { |event| event['name'].include?(event_scope) }).not_to be_nil
- end
- end
-
- it 'excludes some event types' do
- expect(subject.grep(/search_package/)).to be_empty
- expect(subject.grep(/list_package/)).to be_empty
- end
- end
-
- describe 'generate_counts' do
- let(:task) { 'generate_counts' }
-
- Packages::Event::EVENT_SCOPES.keys.each do |event_scope|
- it "includes `#{event_scope}` scope" do
- expect(subject.find { |event| event.include?(event_scope) }).not_to be_nil
- end
- end
-
- it 'excludes some event types' do
- expect(subject.find { |event| event.include?("search_package") }).to be_nil
- expect(subject.find { |event| event.include?("list_package") }).to be_nil
- end
- end
-end
diff --git a/spec/tasks/gitlab/shell_rake_spec.rb b/spec/tasks/gitlab/shell_rake_spec.rb
index 195859eac70..30f512205f9 100644
--- a/spec/tasks/gitlab/shell_rake_spec.rb
+++ b/spec/tasks/gitlab/shell_rake_spec.rb
@@ -24,21 +24,75 @@ RSpec.describe 'gitlab:shell rake tasks', :silence_stdout do
end
describe 'setup task' do
- it 'writes authorized keys into the file' do
- allow(Gitlab::CurrentSettings).to receive(:authorized_keys_enabled?).and_return(true)
- stub_env('force', 'yes')
+ let!(:auth_key) { create(:key) }
+ let!(:auth_and_signing_key) { create(:key, usage_type: :auth_and_signing) }
- auth_key = create(:key)
- auth_and_signing_key = create(:key, usage_type: :auth_and_signing)
+ before do
create(:key, usage_type: :signing)
- expect_next_instance_of(Gitlab::AuthorizedKeys) do |instance|
- expect(instance).to receive(:batch_add_keys).once do |keys|
- expect(keys).to match_array([auth_key, auth_and_signing_key])
+ allow(Gitlab::CurrentSettings).to receive(:authorized_keys_enabled?).and_return(write_to_authorized_keys)
+ end
+
+ context 'when "Write to authorized keys" is enabled' do
+ let(:write_to_authorized_keys) { true }
+
+ before do
+ stub_env('force', force)
+ end
+
+ context 'when "force" is not set' do
+ let(:force) { nil }
+
+ context 'when the user answers "yes"' do
+ it 'writes authorized keys into the file' do
+ allow(main_object).to receive(:ask_to_continue)
+
+ expect_next_instance_of(Gitlab::AuthorizedKeys) do |instance|
+ expect(instance).to receive(:batch_add_keys).once do |keys|
+ expect(keys).to match_array([auth_key, auth_and_signing_key])
+ end
+ end
+
+ run_rake_task('gitlab:shell:setup')
+ end
+ end
+
+ context 'when the user answers "no"' do
+ it 'does not write authorized keys into the file' do
+ allow(main_object).to receive(:ask_to_continue).and_raise(Gitlab::TaskAbortedByUserError)
+
+ expect(Gitlab::AuthorizedKeys).not_to receive(:new)
+
+ expect do
+ run_rake_task('gitlab:shell:setup')
+ end.to raise_error(SystemExit)
+ end
+ end
+ end
+
+ context 'when "force" is set to "yes"' do
+ let(:force) { 'yes' }
+
+ it 'writes authorized keys into the file' do
+ expect_next_instance_of(Gitlab::AuthorizedKeys) do |instance|
+ expect(instance).to receive(:batch_add_keys).once do |keys|
+ expect(keys).to match_array([auth_key, auth_and_signing_key])
+ end
+ end
+
+ run_rake_task('gitlab:shell:setup')
end
end
+ end
+
+ context 'when "Write to authorized keys" is disabled' do
+ let(:write_to_authorized_keys) { false }
- run_rake_task('gitlab:shell:setup')
+ it 'does not write authorized keys into the file' do
+ expect(Gitlab::AuthorizedKeys).not_to receive(:new)
+
+ run_rake_task('gitlab:shell:setup')
+ end
end
end
end
diff --git a/spec/tasks/gitlab/usage_data_rake_spec.rb b/spec/tasks/gitlab/usage_data_rake_spec.rb
index 11aab1b1b42..170b1319154 100644
--- a/spec/tasks/gitlab/usage_data_rake_spec.rb
+++ b/spec/tasks/gitlab/usage_data_rake_spec.rb
@@ -69,23 +69,6 @@ RSpec.describe 'gitlab:usage data take tasks', :silence_stdout, :with_license, f
expect { run_rake_task('gitlab:usage_data:generate_and_send') }.to output(/.*201.*/).to_stdout
end
- describe 'generate_ci_template_events' do
- around do |example|
- FileUtils.rm_rf(Gitlab::UsageDataCounters::CiTemplateUniqueCounter::KNOWN_EVENTS_FILE_PATH)
-
- example.run
-
- `git checkout -- #{Gitlab::UsageDataCounters::CiTemplateUniqueCounter::KNOWN_EVENTS_FILE_PATH}`
- end
-
- it "generates #{Gitlab::UsageDataCounters::CiTemplateUniqueCounter::KNOWN_EVENTS_FILE_PATH}",
- quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/386191' do
- run_rake_task('gitlab:usage_data:generate_ci_template_events')
-
- expect(File.exist?(Gitlab::UsageDataCounters::CiTemplateUniqueCounter::KNOWN_EVENTS_FILE_PATH)).to be true
- end
- end
-
private
def stub_response(body:, url: service_ping_payload_url, status: 201)
diff --git a/spec/tooling/danger/experiments_spec.rb b/spec/tooling/danger/experiments_spec.rb
new file mode 100644
index 00000000000..85f8060a3ec
--- /dev/null
+++ b/spec/tooling/danger/experiments_spec.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+require 'gitlab-dangerfiles'
+require 'gitlab/dangerfiles/spec_helper'
+
+require_relative '../../../tooling/danger/experiments'
+
+RSpec.describe Tooling::Danger::Experiments, feature_category: :tooling do
+ include_context "with dangerfile"
+
+ let(:fake_danger) { DangerSpecHelper.fake_danger.include(described_class) }
+
+ subject(:experiments) { fake_danger.new(helper: fake_helper) }
+
+ describe '#removed_experiments' do
+ let(:removed_experiments_yml_files) do
+ [
+ 'config/feature_flags/experiment/tier_badge.yml',
+ 'ee/config/feature_flags/experiment/direct_to_trial.yml'
+ ]
+ end
+
+ let(:deleted_files) do
+ [
+ 'app/models/model.rb',
+ 'app/assets/javascripts/file.js'
+ ] + removed_experiments_yml_files
+ end
+
+ it 'returns names of removed experiments' do
+ expect(experiments.removed_experiments).to eq(%w[tier_badge direct_to_trial])
+ end
+ end
+
+ describe '#class_files_removed?' do
+ let(:removed_experiments_name) { current_experiment_with_class_files_example }
+
+ context 'when yml file is deleted but not class file' do
+ let(:deleted_files) { ["config/feature_flags/experiment/#{removed_experiments_name}.yml"] }
+
+ it 'returns false' do
+ expect(experiments.class_files_removed?).to eq(false)
+ end
+ end
+
+ context 'when yml file is deleted but no corresponding class file exists' do
+ let(:deleted_files) { ["config/feature_flags/experiment/fake_experiment.yml"] }
+
+ it 'returns true' do
+ expect(experiments.class_files_removed?).to eq(true)
+ end
+ end
+ end
+
+ def current_experiment_with_class_files_example
+ path = Dir.glob("app/experiments/*.rb").last
+ File.basename(path).chomp('_experiment.rb')
+ end
+end
diff --git a/spec/tooling/danger/project_helper_spec.rb b/spec/tooling/danger/project_helper_spec.rb
index 3910f569400..5ae0a8695eb 100644
--- a/spec/tooling/danger/project_helper_spec.rb
+++ b/spec/tooling/danger/project_helper_spec.rb
@@ -5,9 +5,9 @@ require 'gitlab-dangerfiles'
require 'danger'
require 'danger/plugins/internal/helper'
require 'gitlab/dangerfiles/spec_helper'
+require 'gitlab/rspec/all'
require_relative '../../../danger/plugins/project_helper'
-require_relative '../../../spec/support/helpers/stub_env'
RSpec.describe Tooling::Danger::ProjectHelper do
include StubENV
@@ -65,6 +65,11 @@ RSpec.describe Tooling::Danger::ProjectHelper do
'config/foo.js' | [:frontend]
'config/deep/foo.js' | [:frontend]
+ 'app/components/pajamas/empty_state_component.html.haml' | [:frontend, :backend]
+ 'ee/app/components/pajamas/empty_state_component.html.haml' | [:frontend, :backend]
+ 'app/components/diffs/overflow_warning_component.html.haml' | [:frontend, :backend]
+ 'app/components/layouts/horizontal_section_component.rb' | [:frontend, :backend]
+
'ee/app/assets/foo' | [:frontend]
'ee/app/views/foo' | [:frontend, :backend]
'ee/spec/frontend/bar' | [:frontend]
@@ -80,6 +85,7 @@ RSpec.describe Tooling::Danger::ProjectHelper do
'.rubocop.yml' | [:backend]
'.rubocop_todo.yml' | [:backend]
'.rubocop_todo/cop/name.yml' | [:backend]
+ 'gems/foo/.rubocop.yml' | [:backend]
'spec/foo' | [:backend]
'spec/foo/bar' | [:backend]
@@ -112,7 +118,7 @@ RSpec.describe Tooling::Danger::ProjectHelper do
'scripts/glfm/bar.rb' | [:backend]
'scripts/glfm/bar.js' | [:frontend]
- 'scripts/remote_development/run-smoke-test-suite.sh' | [:remote_development]
+ 'scripts/remote_development/run-smoke-test-suite.sh' | [:remote_development_be]
'scripts/lib/glfm/bar.rb' | [:backend]
'scripts/lib/glfm/bar.js' | [:frontend]
'scripts/bar.rb' | [:backend, :tooling]
@@ -136,6 +142,8 @@ RSpec.describe Tooling::Danger::ProjectHelper do
'tooling/bin/find_foss_tests' | [:tooling]
'.codeclimate.yml' | [:tooling]
'.gitlab/CODEOWNERS' | [:tooling]
+ 'gems/gem.gitlab-ci.yml' | [:tooling]
+ 'gems/config/rubocop.yml' | [:tooling]
'lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml' | [:ci_template]
'lib/gitlab/ci/templates/dotNET-Core.yml' | [:ci_template]
diff --git a/spec/tooling/lib/tooling/find_changes_spec.rb b/spec/tooling/lib/tooling/find_changes_spec.rb
index 43c3da5699d..fef29ad3f2c 100644
--- a/spec/tooling/lib/tooling/find_changes_spec.rb
+++ b/spec/tooling/lib/tooling/find_changes_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
require_relative '../../../../tooling/lib/tooling/find_changes'
-require_relative '../../../support/helpers/stub_env'
+require 'gitlab/rspec/all'
require 'json'
require 'tempfile'
diff --git a/spec/tooling/lib/tooling/find_tests_spec.rb b/spec/tooling/lib/tooling/find_tests_spec.rb
index 905f81c4bbd..67b6650b335 100644
--- a/spec/tooling/lib/tooling/find_tests_spec.rb
+++ b/spec/tooling/lib/tooling/find_tests_spec.rb
@@ -2,7 +2,7 @@
require 'tempfile'
require_relative '../../../../tooling/lib/tooling/find_tests'
-require_relative '../../../support/helpers/stub_env'
+require 'gitlab/rspec/all'
RSpec.describe Tooling::FindTests, feature_category: :tooling do
include StubENV
diff --git a/spec/tooling/lib/tooling/gettext_extractor_spec.rb b/spec/tooling/lib/tooling/gettext_extractor_spec.rb
index 3c0f91342c2..14310c804f1 100644
--- a/spec/tooling/lib/tooling/gettext_extractor_spec.rb
+++ b/spec/tooling/lib/tooling/gettext_extractor_spec.rb
@@ -1,9 +1,9 @@
# frozen_string_literal: true
require 'rspec/parameterized'
+require 'gitlab/rspec/all'
require_relative '../../../../tooling/lib/tooling/gettext_extractor'
-require_relative '../../../support/helpers/stub_env'
require_relative '../../../support/tmpdir'
RSpec.describe Tooling::GettextExtractor, feature_category: :tooling do
diff --git a/spec/tooling/lib/tooling/predictive_tests_spec.rb b/spec/tooling/lib/tooling/predictive_tests_spec.rb
index b82364fe6f6..fdb7d09a3e2 100644
--- a/spec/tooling/lib/tooling/predictive_tests_spec.rb
+++ b/spec/tooling/lib/tooling/predictive_tests_spec.rb
@@ -2,8 +2,8 @@
require 'tempfile'
require 'fileutils'
+require 'gitlab/rspec/all'
require_relative '../../../../tooling/lib/tooling/predictive_tests'
-require_relative '../../../support/helpers/stub_env'
RSpec.describe Tooling::PredictiveTests, feature_category: :tooling do
include StubENV
diff --git a/spec/tooling/quality/test_level_spec.rb b/spec/tooling/quality/test_level_spec.rb
index a7e4e42206a..6ccd2e46f7b 100644
--- a/spec/tooling/quality/test_level_spec.rb
+++ b/spec/tooling/quality/test_level_spec.rb
@@ -238,7 +238,7 @@ RSpec.describe Quality::TestLevel, feature_category: :tooling do
it 'ensures all spec/ folders are covered by a test level' do
Dir['{,ee/}spec/**/*/'].each do |path|
- next if path =~ %r{\A(ee/)?spec/(benchmarks|docs_screenshots|fixtures|frontend_integration|support)/}
+ next if %r{\A(ee/)?spec/(benchmarks|docs_screenshots|fixtures|frontend_integration|support)/}.match?(path)
expect { subject.level_for(path) }.not_to raise_error
end
diff --git a/spec/tooling/rspec_flaky/config_spec.rb b/spec/tooling/rspec_flaky/config_spec.rb
deleted file mode 100644
index 63f42d7c6cc..00000000000
--- a/spec/tooling/rspec_flaky/config_spec.rb
+++ /dev/null
@@ -1,106 +0,0 @@
-# frozen_string_literal: true
-
-require 'rspec-parameterized'
-require_relative '../../support/helpers/stub_env'
-
-require_relative '../../../tooling/rspec_flaky/config'
-
-RSpec.describe RspecFlaky::Config, :aggregate_failures do
- include StubENV
-
- before do
- # Stub these env variables otherwise specs don't behave the same on the CI
- stub_env('FLAKY_RSPEC_GENERATE_REPORT', nil)
- stub_env('FLAKY_RSPEC_SUITE_REPORT_PATH', nil)
- stub_env('FLAKY_RSPEC_REPORT_PATH', nil)
- stub_env('NEW_FLAKY_RSPEC_REPORT_PATH', nil)
- # Ensure the behavior is the same locally and on CI (where Rails is defined since we run this test as part of the whole suite), i.e. Rails isn't defined
- allow(described_class).to receive(:rails_path).and_wrap_original do |method, path|
- path
- end
- end
-
- describe '.generate_report?' do
- context "when ENV['FLAKY_RSPEC_GENERATE_REPORT'] is not set" do
- it 'returns false' do
- expect(described_class).not_to be_generate_report
- end
- end
-
- context "when ENV['FLAKY_RSPEC_GENERATE_REPORT'] is set" do
- using RSpec::Parameterized::TableSyntax
-
- where(:env_value, :result) do
- '1' | true
- 'true' | true
- 'foo' | false
- '0' | false
- 'false' | false
- end
-
- with_them do
- before do
- stub_env('FLAKY_RSPEC_GENERATE_REPORT', env_value)
- end
-
- it 'returns false' do
- expect(described_class.generate_report?).to be(result)
- end
- end
- end
- end
-
- describe '.suite_flaky_examples_report_path' do
- context "when ENV['FLAKY_RSPEC_SUITE_REPORT_PATH'] is not set" do
- it 'returns the default path' do
- expect(described_class.suite_flaky_examples_report_path).to eq('rspec/flaky/suite-report.json')
- end
- end
-
- context "when ENV['FLAKY_RSPEC_SUITE_REPORT_PATH'] is set" do
- before do
- stub_env('FLAKY_RSPEC_SUITE_REPORT_PATH', 'foo/suite-report.json')
- end
-
- it 'returns the value of the env variable' do
- expect(described_class.suite_flaky_examples_report_path).to eq('foo/suite-report.json')
- end
- end
- end
-
- describe '.flaky_examples_report_path' do
- context "when ENV['FLAKY_RSPEC_REPORT_PATH'] is not set" do
- it 'returns the default path' do
- expect(described_class.flaky_examples_report_path).to eq('rspec/flaky/report.json')
- end
- end
-
- context "when ENV['FLAKY_RSPEC_REPORT_PATH'] is set" do
- before do
- stub_env('FLAKY_RSPEC_REPORT_PATH', 'foo/report.json')
- end
-
- it 'returns the value of the env variable' do
- expect(described_class.flaky_examples_report_path).to eq('foo/report.json')
- end
- end
- end
-
- describe '.new_flaky_examples_report_path' do
- context "when ENV['NEW_FLAKY_RSPEC_REPORT_PATH'] is not set" do
- it 'returns the default path' do
- expect(described_class.new_flaky_examples_report_path).to eq('rspec/flaky/new-report.json')
- end
- end
-
- context "when ENV['NEW_FLAKY_RSPEC_REPORT_PATH'] is set" do
- before do
- stub_env('NEW_FLAKY_RSPEC_REPORT_PATH', 'foo/new-report.json')
- end
-
- it 'returns the value of the env variable' do
- expect(described_class.new_flaky_examples_report_path).to eq('foo/new-report.json')
- end
- end
- end
-end
diff --git a/spec/tooling/rspec_flaky/example_spec.rb b/spec/tooling/rspec_flaky/example_spec.rb
deleted file mode 100644
index d001ed32444..00000000000
--- a/spec/tooling/rspec_flaky/example_spec.rb
+++ /dev/null
@@ -1,99 +0,0 @@
-# frozen_string_literal: true
-
-require_relative '../../../tooling/rspec_flaky/example'
-
-RSpec.describe RspecFlaky::Example do
- let(:example_attrs) do
- {
- id: 'spec/foo/bar_spec.rb:2',
- metadata: {
- file_path: 'spec/foo/bar_spec.rb',
- line_number: 2,
- full_description: 'hello world',
- feature_category: :feature_category
- },
- execution_result: double(status: 'passed', exception: 'BOOM!'),
- attempts: 1
- }
- end
-
- let(:rspec_example) { double(example_attrs) }
-
- describe '#initialize' do
- shared_examples 'a valid Example instance' do
- it 'returns valid attributes' do
- example = described_class.new(args)
-
- expect(example.example_id).to eq(example_attrs[:id])
- end
- end
-
- context 'when given an Rspec::Core::Example that responds to #example' do
- let(:args) { double(example: rspec_example) }
-
- it_behaves_like 'a valid Example instance'
- end
-
- context 'when given an Rspec::Core::Example that does not respond to #example' do
- let(:args) { rspec_example }
-
- it_behaves_like 'a valid Example instance'
- end
- end
-
- subject { described_class.new(rspec_example) }
-
- describe '#uid' do
- it 'returns a hash of the full description' do
- expect(subject.uid).to eq(Digest::MD5.hexdigest("#{subject.description}-#{subject.file}"))
- end
- end
-
- describe '#example_id' do
- it 'returns the ID of the RSpec::Core::Example' do
- expect(subject.example_id).to eq(rspec_example.id)
- end
- end
-
- describe '#attempts' do
- it 'returns the attempts of the RSpec::Core::Example' do
- expect(subject.attempts).to eq(rspec_example.attempts)
- end
- end
-
- describe '#file' do
- it 'returns the metadata[:file_path] of the RSpec::Core::Example' do
- expect(subject.file).to eq(rspec_example.metadata[:file_path])
- end
- end
-
- describe '#line' do
- it 'returns the metadata[:line_number] of the RSpec::Core::Example' do
- expect(subject.line).to eq(rspec_example.metadata[:line_number])
- end
- end
-
- describe '#description' do
- it 'returns the metadata[:full_description] of the RSpec::Core::Example' do
- expect(subject.description).to eq(rspec_example.metadata[:full_description])
- end
- end
-
- describe '#status' do
- it 'returns the execution_result.status of the RSpec::Core::Example' do
- expect(subject.status).to eq(rspec_example.execution_result.status)
- end
- end
-
- describe '#exception' do
- it 'returns the execution_result.exception of the RSpec::Core::Example' do
- expect(subject.exception).to eq(rspec_example.execution_result.exception)
- end
- end
-
- describe '#feature_category' do
- it 'returns the metadata[:feature_category] of the RSpec::Core::Example' do
- expect(subject.feature_category).to eq(rspec_example.metadata[:feature_category])
- end
- end
-end
diff --git a/spec/tooling/rspec_flaky/flaky_example_spec.rb b/spec/tooling/rspec_flaky/flaky_example_spec.rb
deleted file mode 100644
index 511f3286f56..00000000000
--- a/spec/tooling/rspec_flaky/flaky_example_spec.rb
+++ /dev/null
@@ -1,148 +0,0 @@
-# frozen_string_literal: true
-
-require_relative '../../support/helpers/stub_env'
-require_relative '../../support/time_travel'
-
-require_relative '../../../tooling/rspec_flaky/flaky_example'
-
-RSpec.describe RspecFlaky::FlakyExample, :aggregate_failures do
- include ActiveSupport::Testing::TimeHelpers
- include StubENV
-
- let(:example_attrs) do
- {
- example_id: 'spec/foo/bar_spec.rb:2',
- file: 'spec/foo/bar_spec.rb',
- line: 2,
- description: 'hello world',
- last_attempts_count: 2,
- feature_category: :feature_category
- }
- end
-
- before do
- # Stub these env variables otherwise specs don't behave the same on the CI
- stub_env('CI_JOB_URL', nil)
- end
-
- describe '#initialize', :freeze_time do
- shared_examples 'a valid FlakyExample instance' do
- let(:flaky_example) { described_class.new(args) }
-
- it 'returns valid attributes' do
- attrs = flaky_example.to_h
-
- expect(attrs[:uid]).to eq(example_attrs[:uid])
- expect(attrs[:file]).to eq(example_attrs[:file])
- expect(attrs[:line]).to eq(example_attrs[:line])
- expect(attrs[:description]).to eq(example_attrs[:description])
- expect(attrs[:feature_category]).to eq(example_attrs[:feature_category])
- expect(attrs[:first_flaky_at]).to eq(expected_first_flaky_at)
- expect(attrs[:last_flaky_at]).to eq(expected_last_flaky_at)
- expect(attrs[:last_attempts_count]).to eq(example_attrs[:last_attempts_count])
- expect(attrs[:flaky_reports]).to eq(expected_flaky_reports)
- end
- end
-
- context 'when given an Example.to_h' do
- it_behaves_like 'a valid FlakyExample instance' do
- let(:args) { example_attrs }
- let(:expected_first_flaky_at) { Time.now }
- let(:expected_last_flaky_at) { Time.now }
- let(:expected_flaky_reports) { 0 }
- end
- end
- end
-
- describe '#update!' do
- shared_examples 'an up-to-date FlakyExample instance' do
- let(:flaky_example) { described_class.new(args) }
-
- it 'sets the first_flaky_at if none exists' do
- args[:first_flaky_at] = nil
-
- freeze_time do
- flaky_example.update!(example_attrs)
-
- expect(flaky_example.to_h[:first_flaky_at]).to eq(Time.now)
- end
- end
-
- it 'maintains the first_flaky_at if exists' do
- flaky_example.update!(example_attrs)
- expected_first_flaky_at = flaky_example.to_h[:first_flaky_at]
-
- travel_to(Time.now + 42) do
- flaky_example.update!(example_attrs)
- expect(flaky_example.to_h[:first_flaky_at]).to eq(expected_first_flaky_at)
- end
- end
-
- it 'updates the last_flaky_at' do
- travel_to(Time.now + 42) do
- the_future = Time.now
- flaky_example.update!(example_attrs)
-
- expect(flaky_example.to_h[:last_flaky_at]).to eq(the_future)
- end
- end
-
- it 'updates the flaky_reports' do
- expected_flaky_reports = flaky_example.to_h[:first_flaky_at] ? flaky_example.to_h[:flaky_reports] + 1 : 1
-
- expect { flaky_example.update!(example_attrs) }.to change { flaky_example.to_h[:flaky_reports] }.by(1)
- expect(flaky_example.to_h[:flaky_reports]).to eq(expected_flaky_reports)
- end
-
- it 'updates the last_attempts_count' do
- example_attrs[:last_attempts_count] = 42
- flaky_example.update!(example_attrs)
-
- expect(flaky_example.to_h[:last_attempts_count]).to eq(42)
- end
-
- context 'when run on the CI' do
- let(:job_url) { 'https://gitlab.com/gitlab-org/gitlab-foss/-/jobs/42' }
-
- before do
- stub_env('CI_JOB_URL', job_url)
- end
-
- it 'updates the last_flaky_job' do
- flaky_example.update!(example_attrs)
-
- expect(flaky_example.to_h[:last_flaky_job]).to eq(job_url)
- end
- end
- end
-
- context 'when given an Example hash' do
- it_behaves_like 'an up-to-date FlakyExample instance' do
- let(:args) { example_attrs }
- end
- end
- end
-
- describe '#to_h', :freeze_time do
- shared_examples 'a valid FlakyExample hash' do
- let(:additional_attrs) { {} }
-
- it 'returns a valid hash' do
- flaky_example = described_class.new(args)
- final_hash = example_attrs.merge(additional_attrs)
-
- expect(flaky_example.to_h).to eq(final_hash)
- end
- end
-
- context 'when given an Example hash' do
- let(:args) { example_attrs }
-
- it_behaves_like 'a valid FlakyExample hash' do
- let(:additional_attrs) do
- { first_flaky_at: Time.now, last_flaky_at: Time.now, last_flaky_job: nil, flaky_reports: 0 }
- end
- end
- end
- end
-end
diff --git a/spec/tooling/rspec_flaky/flaky_examples_collection_spec.rb b/spec/tooling/rspec_flaky/flaky_examples_collection_spec.rb
deleted file mode 100644
index 9d75c97febe..00000000000
--- a/spec/tooling/rspec_flaky/flaky_examples_collection_spec.rb
+++ /dev/null
@@ -1,85 +0,0 @@
-# frozen_string_literal: true
-
-require_relative '../../support/time_travel'
-
-require_relative '../../../tooling/rspec_flaky/flaky_examples_collection'
-
-RSpec.describe RspecFlaky::FlakyExamplesCollection, :aggregate_failures, :freeze_time do
- let(:collection_hash) do
- {
- a: { example_id: 'spec/foo/bar_spec.rb:2' },
- b: { example_id: 'spec/foo/baz_spec.rb:3' }
- }
- end
-
- let(:collection_report) do
- {
- a: {
- example_id: 'spec/foo/bar_spec.rb:2',
- first_flaky_at: Time.now,
- last_flaky_at: Time.now,
- last_flaky_job: nil,
- flaky_reports: 0,
- feature_category: nil,
- last_attempts_count: nil
- },
- b: {
- example_id: 'spec/foo/baz_spec.rb:3',
- first_flaky_at: Time.now,
- last_flaky_at: Time.now,
- last_flaky_job: nil,
- flaky_reports: 0,
- feature_category: nil,
- last_attempts_count: nil
- }
- }
- end
-
- describe '#initialize' do
- it 'accepts no argument' do
- expect { described_class.new }.not_to raise_error
- end
-
- it 'accepts a hash' do
- expect { described_class.new(collection_hash) }.not_to raise_error
- end
-
- it 'does not accept anything else' do
- expect { described_class.new([1, 2, 3]) }.to raise_error(ArgumentError, "`collection` must be a Hash, Array given!")
- end
- end
-
- describe '#to_h' do
- it 'calls #to_h on the values' do
- collection = described_class.new(collection_hash)
-
- expect(collection.to_h).to eq(collection_report)
- end
- end
-
- describe '#-' do
- it 'returns only examples that are not present in the given collection' do
- collection1 = described_class.new(collection_hash)
- collection2 = described_class.new(
- a: { example_id: 'spec/foo/bar_spec.rb:2' },
- c: { example_id: 'spec/bar/baz_spec.rb:4' })
-
- expect((collection2 - collection1).to_h).to eq(
- c: {
- example_id: 'spec/bar/baz_spec.rb:4',
- first_flaky_at: Time.now,
- last_flaky_at: Time.now,
- last_flaky_job: nil,
- flaky_reports: 0,
- feature_category: nil,
- last_attempts_count: nil
- })
- end
-
- it 'fails if the given collection does not respond to `#key?`' do
- collection = described_class.new(collection_hash)
-
- expect { collection - [1, 2, 3] }.to raise_error(ArgumentError, "`other` must respond to `#key?`, Array does not!")
- end
- end
-end
diff --git a/spec/tooling/rspec_flaky/listener_spec.rb b/spec/tooling/rspec_flaky/listener_spec.rb
deleted file mode 100644
index 0bbd6454969..00000000000
--- a/spec/tooling/rspec_flaky/listener_spec.rb
+++ /dev/null
@@ -1,228 +0,0 @@
-# frozen_string_literal: true
-
-require_relative '../../support/helpers/stub_env'
-require_relative '../../support/time_travel'
-
-require_relative '../../../tooling/rspec_flaky/listener'
-
-RSpec.describe RspecFlaky::Listener, :aggregate_failures do
- include ActiveSupport::Testing::TimeHelpers
- include StubENV
-
- let(:already_flaky_example_uid) { '6e869794f4cfd2badd93eb68719371d1' }
- let(:suite_flaky_example_report) do
- {
- "#{already_flaky_example_uid}": {
- example_id: 'spec/foo/bar_spec.rb:2',
- file: 'spec/foo/bar_spec.rb',
- line: 2,
- description: 'hello world',
- first_flaky_at: 1234,
- last_flaky_at: 4321,
- last_attempts_count: 3,
- flaky_reports: 1,
- last_flaky_job: nil
- }
- }
- end
-
- let(:already_flaky_example_attrs) do
- {
- id: 'spec/foo/bar_spec.rb:2',
- metadata: {
- file_path: 'spec/foo/bar_spec.rb',
- line_number: 2,
- full_description: 'hello world'
- },
- execution_result: double(status: 'passed', exception: nil)
- }
- end
-
- let(:already_flaky_example) { RspecFlaky::FlakyExample.new(suite_flaky_example_report[already_flaky_example_uid]) }
- let(:new_example_attrs) do
- {
- id: 'spec/foo/baz_spec.rb:3',
- metadata: {
- file_path: 'spec/foo/baz_spec.rb',
- line_number: 3,
- full_description: 'hello GitLab'
- },
- execution_result: double(status: 'passed', exception: nil)
- }
- end
-
- before do
- # Stub these env variables otherwise specs don't behave the same on the CI
- stub_env('CI_JOB_URL', nil)
- stub_env('FLAKY_RSPEC_SUITE_REPORT_PATH', nil)
- end
-
- describe '#initialize' do
- shared_examples 'a valid Listener instance' do
- let(:expected_suite_flaky_examples) { {} }
-
- it 'returns a valid Listener instance' do
- listener = described_class.new
-
- expect(listener.suite_flaky_examples.to_h).to eq(expected_suite_flaky_examples)
- expect(listener.flaky_examples).to eq({})
- end
- end
-
- context 'when no report file exists' do
- it_behaves_like 'a valid Listener instance'
- end
-
- context 'when FLAKY_RSPEC_SUITE_REPORT_PATH is set' do
- let(:report_file_path) { 'foo/report.json' }
-
- before do
- stub_env('FLAKY_RSPEC_SUITE_REPORT_PATH', report_file_path)
- end
-
- context 'and report file exists' do
- before do
- expect(File).to receive(:exist?).with(report_file_path).and_return(true)
- end
-
- it 'delegates the load to RspecFlaky::Report' do
- report = RspecFlaky::Report.new(RspecFlaky::FlakyExamplesCollection.new(suite_flaky_example_report))
-
- expect(RspecFlaky::Report).to receive(:load).with(report_file_path).and_return(report)
- expect(described_class.new.suite_flaky_examples.to_h).to eq(report.flaky_examples.to_h)
- end
- end
-
- context 'and report file does not exist' do
- before do
- expect(File).to receive(:exist?).with(report_file_path).and_return(false)
- end
-
- it 'return an empty hash' do
- expect(RspecFlaky::Report).not_to receive(:load)
- expect(described_class.new.suite_flaky_examples.to_h).to eq({})
- end
- end
- end
- end
-
- describe '#example_passed' do
- let(:rspec_example) { double(new_example_attrs) }
- let(:notification) { double(example: rspec_example) }
- let(:listener) { described_class.new(suite_flaky_example_report.to_json) }
-
- shared_examples 'a non-flaky example' do
- it 'does not change the flaky examples hash' do
- expect { listener.example_passed(notification) }
- .not_to change { listener.flaky_examples }
- end
- end
-
- shared_examples 'an existing flaky example' do
- let(:expected_flaky_example) do
- {
- example_id: 'spec/foo/bar_spec.rb:2',
- file: 'spec/foo/bar_spec.rb',
- line: 2,
- description: 'hello world',
- first_flaky_at: 1234,
- last_attempts_count: 2,
- flaky_reports: 2,
- feature_category: nil,
- last_flaky_job: nil
- }
- end
-
- it 'changes the flaky examples hash' do
- new_example = RspecFlaky::Example.new(rspec_example)
-
- travel_to(Time.now + 42) do
- the_future = Time.now
- expect { listener.example_passed(notification) }
- .to change { listener.flaky_examples[new_example.uid].to_h }
- expect(listener.flaky_examples[new_example.uid].to_h)
- .to eq(expected_flaky_example.merge(last_flaky_at: the_future))
- end
- end
- end
-
- shared_examples 'a new flaky example' do
- let(:expected_flaky_example) do
- {
- example_id: 'spec/foo/baz_spec.rb:3',
- file: 'spec/foo/baz_spec.rb',
- line: 3,
- description: 'hello GitLab',
- last_attempts_count: 2,
- flaky_reports: 1,
- feature_category: nil,
- last_flaky_job: nil
- }
- end
-
- it 'changes the all flaky examples hash' do
- new_example = RspecFlaky::Example.new(rspec_example)
-
- travel_to(Time.now + 42) do
- the_future = Time.now
- expect { listener.example_passed(notification) }
- .to change { listener.flaky_examples[new_example.uid].to_h }
- expect(listener.flaky_examples[new_example.uid].to_h)
- .to eq(expected_flaky_example.merge(first_flaky_at: the_future, last_flaky_at: the_future))
- end
- end
- end
-
- describe 'when the RSpec example does not respond to attempts' do
- it_behaves_like 'a non-flaky example'
- end
-
- describe 'when the RSpec example has 1 attempt' do
- let(:rspec_example) { double(new_example_attrs.merge(attempts: 1)) }
-
- it_behaves_like 'a non-flaky example'
- end
-
- describe 'when the RSpec example has 2 attempts' do
- let(:rspec_example) { double(new_example_attrs.merge(attempts: 2)) }
-
- it_behaves_like 'a new flaky example'
-
- context 'with an existing flaky example' do
- let(:rspec_example) { double(already_flaky_example_attrs.merge(attempts: 2)) }
-
- it_behaves_like 'an existing flaky example'
- end
- end
- end
-
- describe '#dump_summary' do
- let(:listener) { described_class.new(suite_flaky_example_report.to_json) }
- let(:new_flaky_rspec_example) { double(new_example_attrs.merge(attempts: 2)) }
- let(:already_flaky_rspec_example) { double(already_flaky_example_attrs.merge(attempts: 2)) }
- let(:notification_new_flaky_rspec_example) { double(example: new_flaky_rspec_example) }
- let(:notification_already_flaky_rspec_example) { double(example: already_flaky_rspec_example) }
-
- before do
- allow(Kernel).to receive(:warn)
- end
-
- context 'when a report file path is set by FLAKY_RSPEC_REPORT_PATH' do
- it 'delegates the writes to RspecFlaky::Report' do
- listener.example_passed(notification_new_flaky_rspec_example)
- listener.example_passed(notification_already_flaky_rspec_example)
-
- report1 = double
- report2 = double
-
- expect(RspecFlaky::Report).to receive(:new).with(listener.flaky_examples).and_return(report1)
- expect(report1).to receive(:write).with(RspecFlaky::Config.flaky_examples_report_path)
-
- expect(RspecFlaky::Report).to receive(:new).with(listener.__send__(:new_flaky_examples)).and_return(report2)
- expect(report2).to receive(:write).with(RspecFlaky::Config.new_flaky_examples_report_path)
-
- listener.dump_summary(nil)
- end
- end
- end
-end
diff --git a/spec/tooling/rspec_flaky/report_spec.rb b/spec/tooling/rspec_flaky/report_spec.rb
deleted file mode 100644
index e7365c1e150..00000000000
--- a/spec/tooling/rspec_flaky/report_spec.rb
+++ /dev/null
@@ -1,138 +0,0 @@
-# frozen_string_literal: true
-
-require 'tempfile'
-
-require_relative '../../support/time_travel'
-
-require_relative '../../../tooling/rspec_flaky/report'
-
-RSpec.describe RspecFlaky::Report, :aggregate_failures, :freeze_time do
- let(:thirty_one_days) { 3600 * 24 * 31 }
- let(:collection_hash) do
- {
- a: { example_id: 'spec/foo/bar_spec.rb:2' },
- b: { example_id: 'spec/foo/baz_spec.rb:3', first_flaky_at: (Time.now - thirty_one_days).to_s, last_flaky_at: (Time.now - thirty_one_days).to_s }
- }
- end
-
- let(:suite_flaky_example_report) do
- {
- '6e869794f4cfd2badd93eb68719371d1': {
- example_id: 'spec/foo/bar_spec.rb:2',
- file: 'spec/foo/bar_spec.rb',
- line: 2,
- description: 'hello world',
- first_flaky_at: 1234,
- last_flaky_at: 4321,
- last_attempts_count: 3,
- flaky_reports: 1,
- feature_category: 'feature_category',
- last_flaky_job: nil
- }
- }
- end
-
- let(:flaky_examples) { RspecFlaky::FlakyExamplesCollection.new(collection_hash) }
- let(:report) { described_class.new(flaky_examples) }
-
- before do
- allow(Kernel).to receive(:warn)
- end
-
- describe '.load' do
- let!(:report_file) do
- Tempfile.new(%w[rspec_flaky_report .json]).tap do |f|
- f.write(JSON.pretty_generate(suite_flaky_example_report)) # rubocop:disable Gitlab/Json
- f.rewind
- end
- end
-
- after do
- report_file.close
- report_file.unlink
- end
-
- it 'loads the report file' do
- expect(described_class.load(report_file.path).flaky_examples.to_h).to eq(suite_flaky_example_report)
- end
- end
-
- describe '.load_json' do
- let(:report_json) do
- JSON.pretty_generate(suite_flaky_example_report) # rubocop:disable Gitlab/Json
- end
-
- it 'loads the report file' do
- expect(described_class.load_json(report_json).flaky_examples.to_h).to eq(suite_flaky_example_report)
- end
- end
-
- describe '#initialize' do
- it 'accepts a RspecFlaky::FlakyExamplesCollection' do
- expect { report }.not_to raise_error
- end
-
- it 'does not accept anything else' do
- expect { described_class.new([1, 2, 3]) }.to raise_error(ArgumentError, "`flaky_examples` must be a RspecFlaky::FlakyExamplesCollection, Array given!")
- end
- end
-
- it 'delegates to #flaky_examples using SimpleDelegator' do
- expect(report.__getobj__).to eq(flaky_examples)
- end
-
- describe '#write' do
- let(:report_file_path) { File.join('tmp', 'rspec_flaky_report.json') }
-
- before do
- FileUtils.rm(report_file_path) if File.exist?(report_file_path)
- end
-
- after do
- FileUtils.rm(report_file_path) if File.exist?(report_file_path)
- end
-
- context 'when RspecFlaky::Config.generate_report? is false' do
- before do
- allow(RspecFlaky::Config).to receive(:generate_report?).and_return(false)
- end
-
- it 'does not write any report file' do
- report.write(report_file_path)
-
- expect(File.exist?(report_file_path)).to be(false)
- end
- end
-
- context 'when RspecFlaky::Config.generate_report? is true' do
- before do
- allow(RspecFlaky::Config).to receive(:generate_report?).and_return(true)
- end
-
- it 'delegates the writes to RspecFlaky::Report' do
- report.write(report_file_path)
-
- expect(File.exist?(report_file_path)).to be(true)
- expect(File.read(report_file_path))
- .to eq(JSON.pretty_generate(report.flaky_examples.to_h)) # rubocop:disable Gitlab/Json
- end
- end
- end
-
- describe '#prune_outdated' do
- it 'returns a new collection without the examples older than 30 days by default' do
- new_report = flaky_examples.to_h.dup.tap { |r| r.delete(:b) }
- new_flaky_examples = report.prune_outdated
-
- expect(new_flaky_examples).to be_a(described_class)
- expect(new_flaky_examples.to_h).to eq(new_report)
- expect(flaky_examples).to have_key(:b)
- end
-
- it 'accepts a given number of days' do
- new_flaky_examples = report.prune_outdated(days: 32)
-
- expect(new_flaky_examples.to_h).to eq(report.to_h)
- end
- end
-end
diff --git a/spec/uploaders/avatar_uploader_spec.rb b/spec/uploaders/avatar_uploader_spec.rb
index e472ac46e66..bba7eb78f99 100644
--- a/spec/uploaders/avatar_uploader_spec.rb
+++ b/spec/uploaders/avatar_uploader_spec.rb
@@ -47,7 +47,7 @@ RSpec.describe AvatarUploader do
end
end
- context 'accept whitelist file content type' do
+ context 'accept allowlist file content type' do
# We need to feed through a valid path, but we force the parsed mime type
# in a stub below so we can set any path.
let_it_be(:path) { File.join('spec', 'fixtures', 'video_sample.mp4') }
@@ -61,13 +61,13 @@ RSpec.describe AvatarUploader do
end
end
- context 'upload non-whitelisted file content type' do
+ context 'upload denylisted file content type' do
let_it_be(:path) { File.join('spec', 'fixtures', 'sanitized.svg') }
it_behaves_like 'denied carrierwave upload'
end
- context 'upload misnamed non-whitelisted file content type' do
+ context 'upload misnamed denylisted file content type' do
let_it_be(:path) { File.join('spec', 'fixtures', 'not_a_png.png') }
it_behaves_like 'denied carrierwave upload'
diff --git a/spec/uploaders/design_management/design_v432x230_uploader_spec.rb b/spec/uploaders/design_management/design_v432x230_uploader_spec.rb
index f3dd77d67a0..3991058b32d 100644
--- a/spec/uploaders/design_management/design_v432x230_uploader_spec.rb
+++ b/spec/uploaders/design_management/design_v432x230_uploader_spec.rb
@@ -58,7 +58,7 @@ RSpec.describe DesignManagement::DesignV432x230Uploader do
)
end
- context 'accept whitelist file content type' do
+ context 'accept allowlisted file content type' do
# We need to feed through a valid path, but we force the parsed mime type
# in a stub below so we can set any path.
let_it_be(:path) { File.join('spec', 'fixtures', 'dk.png') }
@@ -72,13 +72,13 @@ RSpec.describe DesignManagement::DesignV432x230Uploader do
end
end
- context 'upload non-whitelisted file content type' do
+ context 'upload denylisted file content type' do
let_it_be(:path) { File.join('spec', 'fixtures', 'logo_sample.svg') }
it_behaves_like 'denied carrierwave upload'
end
- context 'upload misnamed non-whitelisted file content type' do
+ context 'upload misnamed denylisted file content type' do
let_it_be(:path) { File.join('spec', 'fixtures', 'not_a_png.png') }
it_behaves_like 'denied carrierwave upload'
diff --git a/spec/uploaders/favicon_uploader_spec.rb b/spec/uploaders/favicon_uploader_spec.rb
index 7f452075293..ab14397c27d 100644
--- a/spec/uploaders/favicon_uploader_spec.rb
+++ b/spec/uploaders/favicon_uploader_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe FaviconUploader do
let_it_be(:model) { build_stubbed(:user) }
let_it_be(:uploader) { described_class.new(model, :favicon) }
- context 'accept whitelist file content type' do
+ context 'accept allowlist file content type' do
include_context 'ignore extension allowlist check'
# We need to feed through a valid path, but we force the parsed mime type
@@ -22,7 +22,7 @@ RSpec.describe FaviconUploader do
end
end
- context 'upload non-whitelisted file content type' do
+ context 'upload denylisted file content type' do
include_context 'ignore extension allowlist check'
let_it_be(:path) { File.join('spec', 'fixtures', 'sanitized.svg') }
@@ -30,7 +30,7 @@ RSpec.describe FaviconUploader do
it_behaves_like 'denied carrierwave upload'
end
- context 'upload misnamed non-whitelisted file content type' do
+ context 'upload misnamed denylisted file content type' do
include_context 'ignore extension allowlist check'
let_it_be(:path) { File.join('spec', 'fixtures', 'not_a_png.png') }
diff --git a/spec/validators/cron_validator_spec.rb b/spec/validators/cron_validator_spec.rb
index bd7fe242957..52a57f6e160 100644
--- a/spec/validators/cron_validator_spec.rb
+++ b/spec/validators/cron_validator_spec.rb
@@ -29,7 +29,7 @@ RSpec.describe CronValidator do
expect(subject.valid?).to be_falsy
end
- context 'cron field is not whitelisted' do
+ context 'cron field is not allowlisted' do
subject do
Class.new do
include ActiveModel::Model
@@ -43,7 +43,7 @@ RSpec.describe CronValidator do
it 'raises an error' do
subject.cron_partytime = '0 23 * * 5'
- expect { subject.valid? }.to raise_error(StandardError, "Non-whitelisted attribute")
+ expect { subject.valid? }.to raise_error(StandardError, "Non-allowlisted attribute")
end
end
end
diff --git a/spec/validators/html_safety_validator_spec.rb b/spec/validators/html_safety_validator_spec.rb
index 4d9425235e3..b33d1dcab6c 100644
--- a/spec/validators/html_safety_validator_spec.rb
+++ b/spec/validators/html_safety_validator_spec.rb
@@ -13,7 +13,7 @@ RSpec.describe HtmlSafetyValidator do
it 'adds an error when a script is included in the name' do
validate('My group <script>evil_script</script>')
- expect(group.errors[:name]).to eq([HtmlSafetyValidator.error_message])
+ expect(group.errors[:name]).to eq([described_class.error_message])
end
it 'does not add an error when an ampersand is included in the name' do
diff --git a/spec/views/admin/application_settings/_slack.html.haml_spec.rb b/spec/views/admin/application_settings/_slack.html.haml_spec.rb
new file mode 100644
index 00000000000..6f89d2b7de4
--- /dev/null
+++ b/spec/views/admin/application_settings/_slack.html.haml_spec.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'admin/application_settings/_slack.html.haml', feature_category: :integrations do
+ let(:app_settings) { build(:application_setting) }
+
+ before do
+ assign(:application_setting, app_settings)
+ end
+
+ it 'renders the form correctly', :aggregate_failures do
+ render
+
+ expect(rendered).to have_field('Client ID', type: 'text')
+ expect(rendered).to have_field('Client secret', type: 'text')
+ expect(rendered).to have_field('Signing secret', type: 'text')
+ expect(rendered).to have_field('Verification token', type: 'text')
+ expect(rendered).to have_link(
+ 'Create Slack app',
+ href: slack_app_manifest_share_admin_application_settings_path
+ )
+ expect(rendered).to have_link(
+ 'Download latest manifest file',
+ href: slack_app_manifest_download_admin_application_settings_path
+ )
+ end
+
+ context 'when GitLab.com', :saas do
+ it 'renders the form correctly', :aggregate_failures do
+ render
+
+ expect(rendered).to have_field('Client ID', type: 'text')
+ expect(rendered).to have_field('Client secret', type: 'text')
+ expect(rendered).to have_field('Signing secret', type: 'text')
+ expect(rendered).to have_field('Verification token', type: 'text')
+
+ expect(rendered).not_to have_link('Create Slack app')
+ expect(rendered).not_to have_link('Download latest manifest file')
+ end
+ end
+end
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 861f3fffa83..ee518041fbd 100644
--- a/spec/views/admin/application_settings/general.html.haml_spec.rb
+++ b/spec/views/admin/application_settings/general.html.haml_spec.rb
@@ -96,7 +96,10 @@ RSpec.describe 'admin/application_settings/general.html.haml' do
it 'expects display token and reset token to be available' do
expect(rendered).to have_content(app_settings.error_tracking_access_token)
- expect(rendered).to have_button('Reset error tracking access token')
+ expect(rendered).to have_link(
+ 'Reset error tracking access token',
+ href: reset_error_tracking_access_token_admin_application_settings_url
+ )
end
end
diff --git a/spec/views/explore/projects/topic.html.haml_spec.rb b/spec/views/explore/projects/topic.html.haml_spec.rb
new file mode 100644
index 00000000000..1d2085b3be6
--- /dev/null
+++ b/spec/views/explore/projects/topic.html.haml_spec.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'explore/projects/topic.html.haml', feature_category: :groups_and_projects do
+ let(:topic) { build_stubbed(:topic, name: 'test-topic', title: 'Test topic') }
+ let(:project) { build_stubbed(:project, :public, topic_list: topic.name) }
+
+ before do
+ assign(:topic, topic)
+ assign(:projects, [project])
+
+ controller.params[:controller] = 'explore/projects'
+ controller.params[:action] = 'topic'
+
+ allow(view).to receive(:current_user).and_return(nil)
+
+ render
+ end
+
+ it 'renders atom feed button with matching path' do
+ expect(rendered).to have_link(href: topic_explore_projects_path(topic.name, format: 'atom'))
+ end
+end
diff --git a/spec/views/groups/packages/index.html.haml_spec.rb b/spec/views/groups/packages/index.html.haml_spec.rb
index 26f6268a224..3c6305d1ed9 100644
--- a/spec/views/groups/packages/index.html.haml_spec.rb
+++ b/spec/views/groups/packages/index.html.haml_spec.rb
@@ -36,4 +36,22 @@ RSpec.describe 'groups/packages/index.html.haml', feature_category: :package_reg
)
end
end
+
+ describe 'can_delete_packages' do
+ it 'without permission sets false' do
+ allow(view).to receive(:can_delete_group_packages?).and_return(false)
+
+ render
+
+ expect(rendered).to have_selector('[data-can-delete-packages="false"]')
+ end
+
+ it 'with permission sets true' do
+ allow(view).to receive(:can_delete_group_packages?).and_return(true)
+
+ render
+
+ expect(rendered).to have_selector('[data-can-delete-packages="true"]')
+ end
+ end
end
diff --git a/spec/views/layouts/_head.html.haml_spec.rb b/spec/views/layouts/_head.html.haml_spec.rb
index a44c69748e5..504a9492d7a 100644
--- a/spec/views/layouts/_head.html.haml_spec.rb
+++ b/spec/views/layouts/_head.html.haml_spec.rb
@@ -44,13 +44,13 @@ RSpec.describe 'layouts/_head' do
it 'adds a link dns-prefetch tag' do
render
- expect(rendered).to match(%Q(<link href="#{asset_host}" rel="dns-prefetch">))
+ expect(rendered).to match(%(<link href="#{asset_host}" rel="dns-prefetch">))
end
it 'adds a link preconnect tag' do
render
- expect(rendered).to match(%Q(<link crossorigin="" href="#{asset_host}" rel="preconnect">))
+ expect(rendered).to match(%(<link crossorigin="" href="#{asset_host}" rel="preconnect">))
end
end
@@ -59,7 +59,7 @@ RSpec.describe 'layouts/_head' do
render
- expect(rendered).to match('<link rel="stylesheet" media="all" href="/stylesheets/highlight/themes/solarised-light.css" />')
+ expect(rendered).to match('<link rel="stylesheet" href="/stylesheets/highlight/themes/solarised-light.css" media="all" />')
end
context 'when an asset_host is set and snowplow url is set', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/346542' do
@@ -82,7 +82,7 @@ RSpec.describe 'layouts/_head' do
it 'adds a link preconnect tag' do
render
- expect(rendered).to match(%Q(<link crossorigin="" href="#{snowplow_collector_hostname}" rel="preconnect">))
+ expect(rendered).to match(%(<link crossorigin="" href="#{snowplow_collector_hostname}" rel="preconnect">))
end
end
diff --git a/spec/views/layouts/application.html.haml_spec.rb b/spec/views/layouts/application.html.haml_spec.rb
index d4d40a9ade9..a3613329984 100644
--- a/spec/views/layouts/application.html.haml_spec.rb
+++ b/spec/views/layouts/application.html.haml_spec.rb
@@ -11,6 +11,7 @@ RSpec.describe 'layouts/application' do
end
it_behaves_like 'a layout which reflects the application theme setting'
+ it_behaves_like 'a layout which reflects the preferred language'
describe "visual review toolbar" do
context "ENV['REVIEW_APPS_ENABLED'] is set to true" do
diff --git a/spec/views/layouts/devise.html.haml_spec.rb b/spec/views/layouts/devise.html.haml_spec.rb
index a9215730370..9c31f4984fa 100644
--- a/spec/views/layouts/devise.html.haml_spec.rb
+++ b/spec/views/layouts/devise.html.haml_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe 'layouts/devise', feature_category: :user_management do
it_behaves_like 'a layout which reflects the application theme setting'
+ it_behaves_like 'a layout which reflects the preferred language'
describe 'logo' do
it 'renders GitLab logo' do
diff --git a/spec/views/layouts/devise_empty.html.haml_spec.rb b/spec/views/layouts/devise_empty.html.haml_spec.rb
index 06d742e74dd..8c4c421922b 100644
--- a/spec/views/layouts/devise_empty.html.haml_spec.rb
+++ b/spec/views/layouts/devise_empty.html.haml_spec.rb
@@ -4,4 +4,5 @@ require 'spec_helper'
RSpec.describe 'layouts/devise_empty' do
it_behaves_like 'a layout which reflects the application theme setting'
+ it_behaves_like 'a layout which reflects the preferred language'
end
diff --git a/spec/views/layouts/fullscreen.html.haml_spec.rb b/spec/views/layouts/fullscreen.html.haml_spec.rb
index 7b345fea2ad..2309e885b75 100644
--- a/spec/views/layouts/fullscreen.html.haml_spec.rb
+++ b/spec/views/layouts/fullscreen.html.haml_spec.rb
@@ -35,6 +35,7 @@ RSpec.describe 'layouts/fullscreen' do
end
it_behaves_like 'a layout which reflects the application theme setting'
+ it_behaves_like 'a layout which reflects the preferred language'
describe 'sidebar' do
context 'when nav is set' do
diff --git a/spec/views/layouts/signup_onboarding.html.haml_spec.rb b/spec/views/layouts/signup_onboarding.html.haml_spec.rb
index 8748c673616..24fba191cab 100644
--- a/spec/views/layouts/signup_onboarding.html.haml_spec.rb
+++ b/spec/views/layouts/signup_onboarding.html.haml_spec.rb
@@ -4,4 +4,5 @@ require 'spec_helper'
RSpec.describe 'layouts/signup_onboarding' do
it_behaves_like 'a layout which reflects the application theme setting'
+ it_behaves_like 'a layout which reflects the preferred language'
end
diff --git a/spec/views/layouts/simple_registration.html.haml_spec.rb b/spec/views/layouts/simple_registration.html.haml_spec.rb
deleted file mode 100644
index 98553a12ad8..00000000000
--- a/spec/views/layouts/simple_registration.html.haml_spec.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'layouts/simple_registration' do
- it_behaves_like 'a layout which reflects the application theme setting'
-end
diff --git a/spec/views/layouts/terms.html.haml_spec.rb b/spec/views/layouts/terms.html.haml_spec.rb
index 520882449c5..7bf97debbf9 100644
--- a/spec/views/layouts/terms.html.haml_spec.rb
+++ b/spec/views/layouts/terms.html.haml_spec.rb
@@ -10,4 +10,5 @@ RSpec.describe 'layouts/terms' do
end
it_behaves_like 'a layout which reflects the application theme setting'
+ it_behaves_like 'a layout which reflects the preferred language'
end
diff --git a/spec/views/notify/approved_merge_request_email.html.haml_spec.rb b/spec/views/notify/approved_merge_request_email.html.haml_spec.rb
index 7d19e628eb8..64a2e4f8573 100644
--- a/spec/views/notify/approved_merge_request_email.html.haml_spec.rb
+++ b/spec/views/notify/approved_merge_request_email.html.haml_spec.rb
@@ -23,4 +23,6 @@ RSpec.describe 'notify/approved_merge_request_email.html.haml' do
expect(rendered).to have_content("was approved by")
expect(rendered).to have_content(user.name.to_s)
end
+
+ it_behaves_like 'a layout which reflects the preferred language'
end
diff --git a/spec/views/notify/import_issues_csv_email.html.haml_spec.rb b/spec/views/notify/import_issues_csv_email.html.haml_spec.rb
index c3d320a837b..2165cb6af85 100644
--- a/spec/views/notify/import_issues_csv_email.html.haml_spec.rb
+++ b/spec/views/notify/import_issues_csv_email.html.haml_spec.rb
@@ -8,6 +8,10 @@ RSpec.describe 'notify/import_issues_csv_email.html.haml' do
let(:correct_results) { { success: 3, parse_error: false } }
let(:errored_results) { { success: 3, error_lines: [5, 6, 7], parse_error: false } }
let(:parse_error_results) { { success: 0, parse_error: true } }
+ let(:milestone_error_results) do
+ { success: 0,
+ preprocess_errors: { milestone_errors: { missing: { header: 'Milestone', titles: %w[15.10 15.11] } } } }
+ end
before do
assign(:user, user)
@@ -58,4 +62,29 @@ a delimited text file that uses a comma to separate values.")
Please make sure it has the correct format: a delimited text file that uses a comma to separate values.")
end
end
+
+ context 'when preprocess errors reported while importing' do
+ before do
+ assign(:results, milestone_error_results)
+ end
+
+ it 'renders with project name error' do
+ render
+
+ expect(rendered).to have_content("Could not find the following milestone values in \
+#{project.full_name}: 15.10, 15.11")
+ end
+
+ context 'with a project in a group' do
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, group: group) }
+
+ it 'renders with group clause error' do
+ render
+
+ expect(rendered).to have_content("Could not find the following milestone values in #{project.full_name} \
+or its parent groups: 15.10, 15.11")
+ end
+ end
+ end
end
diff --git a/spec/views/notify/pipeline_failed_email.html.haml_spec.rb b/spec/views/notify/pipeline_failed_email.html.haml_spec.rb
index defd8190eda..1623c375754 100644
--- a/spec/views/notify/pipeline_failed_email.html.haml_spec.rb
+++ b/spec/views/notify/pipeline_failed_email.html.haml_spec.rb
@@ -2,9 +2,22 @@
require 'spec_helper'
-RSpec.describe 'notify/pipeline_failed_email.html.haml' do
- it_behaves_like 'pipeline status changes email' do
+RSpec.describe 'notify/pipeline_failed_email.html.haml', feature_category: :continuous_integration do
+ context 'when pipeline has a name attribute' do
+ before do
+ build_stubbed(:ci_pipeline_metadata, pipeline: pipeline, name: "My Pipeline")
+ end
+
+ let(:title) { "Pipeline #{pipeline.name} has failed!" }
+ let(:status) { :failed }
+
+ it_behaves_like 'pipeline status changes email'
+ end
+
+ context 'when pipeline does not have a name attribute' do
let(:title) { "Pipeline ##{pipeline.id} has failed!" }
let(:status) { :failed }
+
+ it_behaves_like 'pipeline status changes email'
end
end
diff --git a/spec/views/notify/pipeline_failed_email.text.erb_spec.rb b/spec/views/notify/pipeline_failed_email.text.erb_spec.rb
index 9bd5722954f..b22a670d895 100644
--- a/spec/views/notify/pipeline_failed_email.text.erb_spec.rb
+++ b/spec/views/notify/pipeline_failed_email.text.erb_spec.rb
@@ -1,55 +1,22 @@
# frozen_string_literal: true
require 'spec_helper'
-RSpec.describe 'notify/pipeline_failed_email.text.erb' do
- include Devise::Test::ControllerHelpers
-
- let(:user) { create(:user, developer_projects: [project]) }
- let(:project) { create(:project, :repository) }
- let(:merge_request) { create(:merge_request, :simple, source_project: project) }
-
- let(:pipeline) do
- create(
- :ci_pipeline,
- :failed,
- project: project,
- user: user,
- ref: project.default_branch,
- sha: project.commit.sha
- )
- end
-
- before do
- assign(:project, project)
- assign(:pipeline, pipeline)
- assign(:merge_request, merge_request)
- end
-
- shared_examples_for 'renders the pipeline failed email correctly' do
- it 'renders the email correctly' do
- render
-
- expect(rendered).to have_content("Pipeline ##{pipeline.id} has failed!")
- expect(rendered).to have_content(pipeline.project.name)
- expect(rendered).to have_content(pipeline.git_commit_message.truncate(50).gsub(/\s+/, ' '))
- expect(rendered).to have_content(pipeline.commit.author_name)
- expect(rendered).to have_content("##{pipeline.id}")
- expect(rendered).to have_content(pipeline.user.name)
- expect(rendered).to have_content(build.id)
+RSpec.describe 'notify/pipeline_failed_email.text.erb', feature_category: :continuous_integration do
+ context 'when pipeline has a name attribute' do
+ before do
+ build_stubbed(:ci_pipeline_metadata, pipeline: pipeline, name: "My Pipeline")
end
- it_behaves_like 'correct pipeline information for pipelines for merge requests'
- end
-
- context 'when the pipeline contains a failed job' do
- let!(:build) { create(:ci_build, :failed, pipeline: pipeline, project: pipeline.project) }
+ let(:title) { "Pipeline #{pipeline.name} has failed!" }
+ let(:status) { :failed }
- it_behaves_like 'renders the pipeline failed email correctly'
+ it_behaves_like 'pipeline status changes email'
end
- context 'when the latest failed job is a bridge job' do
- let!(:build) { create(:ci_bridge, status: :failed, pipeline: pipeline, project: pipeline.project) }
+ context 'when pipeline does not have a name attribute' do
+ let(:title) { "Pipeline ##{pipeline.id} has failed!" }
+ let(:status) { :failed }
- it_behaves_like 'renders the pipeline failed email correctly'
+ it_behaves_like 'pipeline status changes email'
end
end
diff --git a/spec/views/notify/pipeline_fixed_email.html.haml_spec.rb b/spec/views/notify/pipeline_fixed_email.html.haml_spec.rb
index bdfc8fb5f6b..4c26de4650e 100644
--- a/spec/views/notify/pipeline_fixed_email.html.haml_spec.rb
+++ b/spec/views/notify/pipeline_fixed_email.html.haml_spec.rb
@@ -2,9 +2,22 @@
require 'spec_helper'
-RSpec.describe 'notify/pipeline_fixed_email.html.haml' do
- it_behaves_like 'pipeline status changes email' do
+RSpec.describe 'notify/pipeline_fixed_email.html.haml', feature_category: :continuous_integration do
+ context 'when pipeline has a name attribute' do
+ before do
+ build_stubbed(:ci_pipeline_metadata, pipeline: pipeline, name: "My Pipeline")
+ end
+
+ let(:title) { "Pipeline has been fixed and #{pipeline.name} has passed!" }
+ let(:status) { :success }
+
+ it_behaves_like 'pipeline status changes email'
+ end
+
+ context 'when pipeline does not have a name attribute' do
let(:title) { "Pipeline has been fixed and ##{pipeline.id} has passed!" }
let(:status) { :success }
+
+ it_behaves_like 'pipeline status changes email'
end
end
diff --git a/spec/views/notify/pipeline_fixed_email.text.erb_spec.rb b/spec/views/notify/pipeline_fixed_email.text.erb_spec.rb
index d0bc110f95c..dae2991b775 100644
--- a/spec/views/notify/pipeline_fixed_email.text.erb_spec.rb
+++ b/spec/views/notify/pipeline_fixed_email.text.erb_spec.rb
@@ -2,9 +2,22 @@
require 'spec_helper'
-RSpec.describe 'notify/pipeline_fixed_email.text.erb' do
- it_behaves_like 'pipeline status changes email' do
+RSpec.describe 'notify/pipeline_fixed_email.text.erb', feature_category: :continuous_integration do
+ context 'when pipeline has a name attribute' do
+ before do
+ build_stubbed(:ci_pipeline_metadata, pipeline: pipeline, name: "My Pipeline")
+ end
+
+ let(:title) { "Pipeline has been fixed and #{pipeline.name} has passed!" }
+ let(:status) { :success }
+
+ it_behaves_like 'pipeline status changes email'
+ end
+
+ context 'when pipeline does not have a name attribute' do
let(:title) { "Pipeline has been fixed and ##{pipeline.id} has passed!" }
let(:status) { :success }
+
+ it_behaves_like 'pipeline status changes email'
end
end
diff --git a/spec/views/notify/pipeline_success_email.html.haml_spec.rb b/spec/views/notify/pipeline_success_email.html.haml_spec.rb
index ce03f672700..d6958c5f491 100644
--- a/spec/views/notify/pipeline_success_email.html.haml_spec.rb
+++ b/spec/views/notify/pipeline_success_email.html.haml_spec.rb
@@ -2,9 +2,22 @@
require 'spec_helper'
-RSpec.describe 'notify/pipeline_success_email.html.haml' do
- it_behaves_like 'pipeline status changes email' do
+RSpec.describe 'notify/pipeline_success_email.html.haml', feature_category: :continuous_integration do
+ context 'when pipeline has a name attribute' do
+ before do
+ build_stubbed(:ci_pipeline_metadata, pipeline: pipeline, name: "My Pipeline")
+ end
+
+ let(:title) { "Pipeline #{pipeline.name} has passed!" }
+ let(:status) { :success }
+
+ it_behaves_like 'pipeline status changes email'
+ end
+
+ context 'when pipeline does not have a name attribute' do
let(:title) { "Pipeline ##{pipeline.id} has passed!" }
let(:status) { :success }
+
+ it_behaves_like 'pipeline status changes email'
end
end
diff --git a/spec/views/notify/pipeline_success_email.text.erb_spec.rb b/spec/views/notify/pipeline_success_email.text.erb_spec.rb
index 02334a48fa3..ac1ff68b81d 100644
--- a/spec/views/notify/pipeline_success_email.text.erb_spec.rb
+++ b/spec/views/notify/pipeline_success_email.text.erb_spec.rb
@@ -2,9 +2,22 @@
require 'spec_helper'
-RSpec.describe 'notify/pipeline_success_email.text.erb' do
- it_behaves_like 'pipeline status changes email' do
+RSpec.describe 'notify/pipeline_success_email.text.erb', feature_category: :continuous_integration do
+ context 'when pipeline has a name attribute' do
+ before do
+ build_stubbed(:ci_pipeline_metadata, pipeline: pipeline, name: "My Pipeline")
+ end
+
+ let(:title) { "Pipeline #{pipeline.name} has passed!" }
+ let(:status) { :success }
+
+ it_behaves_like 'pipeline status changes email'
+ end
+
+ context 'when pipeline does not have a name attribute' do
let(:title) { "Pipeline ##{pipeline.id} has passed!" }
let(:status) { :success }
+
+ it_behaves_like 'pipeline status changes email'
end
end
diff --git a/spec/views/profiles/keys/_key_details.html.haml_spec.rb b/spec/views/profiles/keys/_key_details.html.haml_spec.rb
index c223d6702c5..c0381594feb 100644
--- a/spec/views/profiles/keys/_key_details.html.haml_spec.rb
+++ b/spec/views/profiles/keys/_key_details.html.haml_spec.rb
@@ -29,4 +29,19 @@ RSpec.describe 'profiles/keys/_key_details.html.haml' do
end
end
end
+
+ describe 'displays key attributes' do
+ let(:key) { create(:key, :expired, last_used_at: Date.today, user: user) }
+
+ it 'renders key attributes' do
+ render
+
+ expect(rendered).to have_text(key.title)
+ expect(rendered).to have_text(key.created_at.to_fs(:medium))
+ expect(rendered).to have_text(key.expires_at.to_fs(:medium))
+ expect(rendered).to have_text(key.last_used_at.to_fs(:medium))
+ expect(rendered).to have_text(key.fingerprint)
+ expect(rendered).to have_text(key.fingerprint_sha256)
+ end
+ end
end
diff --git a/spec/views/profiles/show.html.haml_spec.rb b/spec/views/profiles/show.html.haml_spec.rb
index ea0a9ebb02c..e88b1bf4053 100644
--- a/spec/views/profiles/show.html.haml_spec.rb
+++ b/spec/views/profiles/show.html.haml_spec.rb
@@ -46,7 +46,7 @@ RSpec.describe 'profiles/show' do
)
expect(rendered).to have_field(
'user[status][clear_status_after]',
- with: user_status.clear_status_at.to_s(:iso8601),
+ with: user_status.clear_status_at.to_fs(:iso8601),
type: :hidden
)
end
diff --git a/spec/views/projects/commit/show.html.haml_spec.rb b/spec/views/projects/commit/show.html.haml_spec.rb
index 6d2237e773e..4cfff00d390 100644
--- a/spec/views/projects/commit/show.html.haml_spec.rb
+++ b/spec/views/projects/commit/show.html.haml_spec.rb
@@ -71,14 +71,12 @@ RSpec.describe 'projects/commit/show.html.haml', feature_category: :source_code_
let(:title) { badge_attributes['data-title'].value }
let(:content) { badge_attributes['data-content'].value }
- before do
- render
- end
-
context 'with GPG' do
let(:commit) { project.commit(GpgHelpers::SIGNED_COMMIT_SHA) }
it 'renders unverified badge' do
+ render
+
expect(title).to include('This commit was signed with an unverified signature.')
expect(content).to include(commit.signature.gpg_key_primary_keyid)
end
@@ -88,15 +86,34 @@ RSpec.describe 'projects/commit/show.html.haml', feature_category: :source_code_
let(:commit) { project.commit('7b5160f9bb23a3d58a0accdbe89da13b96b1ece9') }
it 'renders unverified badge' do
+ render
+
expect(title).to include('This commit was signed with an unverified signature.')
expect(content).to match(/SSH key fingerprint:[\s\S].+#{commit.signature.key_fingerprint_sha256}/)
end
+
+ context 'when the commit has been signed by GitLab' do
+ it 'renders verified badge' do
+ allow_next_instance_of(Gitlab::Ssh::Commit) do |instance|
+ allow(instance).to receive(:signer).and_return(:SIGNER_SYSTEM)
+ end
+
+ render
+
+ expect(content).to match(/SSH key fingerprint:[\s\S].+#{commit.signature.key_fingerprint_sha256}/)
+ expect(title).to include(
+ 'This commit was created in the GitLab UI, and signed with a GitLab-verified signature.'
+ )
+ end
+ end
end
context 'with X.509' do
let(:commit) { project.commit('189a6c924013fc3fe40d6f1ec1dc20214183bc97') }
it 'renders unverified badge' do
+ render
+
expect(title).to include('This commit was signed with an <strong>unverified</strong> signature.')
expect(content).to include(commit.signature.x509_certificate.subject_key_identifier.tr(":", " "))
end
diff --git a/spec/views/projects/edit.html.haml_spec.rb b/spec/views/projects/edit.html.haml_spec.rb
index 77336aa7d86..8c1a8cf21d0 100644
--- a/spec/views/projects/edit.html.haml_spec.rb
+++ b/spec/views/projects/edit.html.haml_spec.rb
@@ -105,26 +105,10 @@ RSpec.describe 'projects/edit' do
end
describe 'pages menu entry callout' do
- context 'with feature flag disabled' do
- before do
- stub_feature_flags(show_pages_in_deployments_menu: false)
- end
-
- it 'does not show a callout' do
- render
- expect(rendered).not_to have_content('GitLab Pages has moved')
- end
- end
-
- context 'with feature flag enabled' do
- before do
- stub_feature_flags(show_pages_in_deployments_menu: true)
- end
+ it 'does show a callout' do
+ render
- it 'does show a callout' do
- render
- expect(rendered).to have_content('GitLab Pages has moved')
- end
+ expect(rendered).to have_content(_('GitLab Pages has moved'))
end
end
end
diff --git a/spec/views/projects/packages/index.html.haml_spec.rb b/spec/views/projects/packages/index.html.haml_spec.rb
index 2557ceb70b3..e59db289ad4 100644
--- a/spec/views/projects/packages/index.html.haml_spec.rb
+++ b/spec/views/projects/packages/index.html.haml_spec.rb
@@ -36,4 +36,22 @@ RSpec.describe 'projects/packages/packages/index.html.haml', feature_category: :
)
end
end
+
+ describe 'can_delete_packages' do
+ it 'without permission sets empty settings path' do
+ allow(view).to receive(:can_delete_packages?).and_return(false)
+
+ render
+
+ expect(rendered).to have_selector('[data-can-delete-packages="false"]')
+ end
+
+ it 'with permission sets project settings path' do
+ allow(view).to receive(:can_delete_packages?).and_return(true)
+
+ render
+
+ expect(rendered).to have_selector('[data-can-delete-packages="true"]')
+ end
+ end
end
diff --git a/spec/views/projects/pipelines/show.html.haml_spec.rb b/spec/views/projects/pipelines/show.html.haml_spec.rb
index 3c15d5846e9..81a11874886 100644
--- a/spec/views/projects/pipelines/show.html.haml_spec.rb
+++ b/spec/views/projects/pipelines/show.html.haml_spec.rb
@@ -11,7 +11,6 @@ RSpec.describe 'projects/pipelines/show', feature_category: :pipeline_compositio
let(:presented_pipeline) { pipeline.present(current_user: user) }
before do
- stub_feature_flags(pipeline_details_header_vue: false)
assign(:project, project)
assign(:pipeline, presented_pipeline)
allow(view).to receive(:current_user) { user }
diff --git a/spec/views/projects/runners/_project_runners.html.haml_spec.rb b/spec/views/projects/runners/_project_runners.html.haml_spec.rb
index d96b77b368c..7dd5e829686 100644
--- a/spec/views/projects/runners/_project_runners.html.haml_spec.rb
+++ b/spec/views/projects/runners/_project_runners.html.haml_spec.rb
@@ -15,66 +15,27 @@ RSpec.describe 'projects/runners/_project_runners.html.haml', feature_category:
allow(view).to receive(:reset_registration_token_namespace_project_settings_ci_cd_path).and_return('banana_url')
end
- context 'when create_runner_workflow_for_namespace is disabled' do
+ context 'when user can create project runner' do
before do
- stub_feature_flags(create_runner_workflow_for_namespace: false)
+ allow(view).to receive(:can?).with(user, :create_runner, project).and_return(true)
end
- context 'when project runner registration is allowed' do
- before do
- stub_application_setting(valid_runner_registrars: ['project'])
- allow(view).to receive(:can?).with(user, :register_project_runners, project).and_return(true)
- end
+ it 'renders the New project runner button' do
+ render 'projects/runners/project_runners', project: project
- it 'enables the Remove project button for a project' do
- render 'projects/runners/project_runners', project: project
-
- expect(rendered).to have_selector '#js-install-runner'
- expect(rendered).not_to have_content 'Please contact an admin to register runners.'
- end
- end
-
- context 'when project runner registration is not allowed' do
- before do
- stub_application_setting(valid_runner_registrars: ['group'])
- end
-
- it 'does not enable the Remove project button for a project' do
- render 'projects/runners/project_runners', project: project
-
- expect(rendered).to have_content 'Please contact an admin to register runners.'
- expect(rendered).not_to have_selector '#js-install-runner'
- end
+ expect(rendered).to have_link(s_('Runners|New project runner'), href: new_project_runner_path(project))
end
end
- context 'when create_runner_workflow_for_namespace is enabled' do
+ context 'when user cannot create project runner' do
before do
- stub_feature_flags(create_runner_workflow_for_namespace: project.namespace)
+ allow(view).to receive(:can?).with(user, :create_runner, project).and_return(false)
end
- context 'when user can create project runner' do
- before do
- allow(view).to receive(:can?).with(user, :create_runner, project).and_return(true)
- end
-
- it 'renders the New project runner button' do
- render 'projects/runners/project_runners', project: project
-
- expect(rendered).to have_link(s_('Runners|New project runner'), href: new_project_runner_path(project))
- end
- end
-
- context 'when user cannot create project runner' do
- before do
- allow(view).to receive(:can?).with(user, :create_runner, project).and_return(false)
- end
-
- it 'does not render the New project runner button' do
- render 'projects/runners/project_runners', project: project
+ it 'does not render the New project runner button' do
+ render 'projects/runners/project_runners', project: project
- expect(rendered).not_to have_link(s_('Runners|New project runner'))
- end
+ expect(rendered).not_to have_link(s_('Runners|New project runner'))
end
end
end
diff --git a/spec/views/registrations/welcome/show.html.haml_spec.rb b/spec/views/registrations/welcome/show.html.haml_spec.rb
index e229df555b1..866f4f62493 100644
--- a/spec/views/registrations/welcome/show.html.haml_spec.rb
+++ b/spec/views/registrations/welcome/show.html.haml_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'registrations/welcome/show' do
+RSpec.describe 'registrations/welcome/show', feature_category: :onboarding do
let_it_be(:user) { create(:user) }
before do
diff --git a/spec/views/search/_results.html.haml_spec.rb b/spec/views/search/_results.html.haml_spec.rb
index 832cc5b7cf3..ebeb4226434 100644
--- a/spec/views/search/_results.html.haml_spec.rb
+++ b/spec/views/search/_results.html.haml_spec.rb
@@ -68,7 +68,8 @@ RSpec.describe 'search/_results', feature_category: :global_search do
context 'rendering all types of search results' do
let_it_be(:project) { create(:project, :repository, :wiki_repo) }
- let_it_be(:issue) { create(:issue, project: project, title: 'testing') }
+ let_it_be(:label) { create(:label, project: project, title: 'test label') }
+ let_it_be(:issue) { create(:issue, project: project, title: 'testing', labels: [label]) }
let_it_be(:merge_request) { create(:merge_request, title: 'testing', source_project: project, target_project: project) }
let_it_be(:milestone) { create(:milestone, title: 'testing', project: project) }
let_it_be(:note) { create(:discussion_note_on_issue, project: project, note: 'testing') }
diff --git a/spec/views/shared/notes/_form.html.haml_spec.rb b/spec/views/shared/notes/_form.html.haml_spec.rb
deleted file mode 100644
index ccf1e08b7e7..00000000000
--- a/spec/views/shared/notes/_form.html.haml_spec.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'shared/notes/_form' do
- include Devise::Test::ControllerHelpers
-
- let(:user) { create(:user) }
- let(:project) { create(:project, :repository) }
-
- before do
- project.add_maintainer(user)
- assign(:project, project)
- assign(:note, note)
-
- allow(view).to receive(:current_user).and_return(user)
-
- render
- end
-
- %w[issue merge_request commit].each do |noteable|
- context "with a note on #{noteable}" do
- let(:note) { build(:"note_on_#{noteable}", project: project) }
-
- it 'says that markdown and quick actions are supported' do
- expect(rendered).to have_content('Supports Markdown. For quick actions, type /.')
- end
- end
- end
-end
diff --git a/spec/workers/bulk_imports/entity_worker_spec.rb b/spec/workers/bulk_imports/entity_worker_spec.rb
index dada4ef63b3..8238721df01 100644
--- a/spec/workers/bulk_imports/entity_worker_spec.rb
+++ b/spec/workers/bulk_imports/entity_worker_spec.rb
@@ -17,7 +17,7 @@ RSpec.describe BulkImports::EntityWorker, feature_category: :importers do
let(:job_args) { entity.id }
it 'updates pipeline trackers to enqueued state when selected' do
- worker = BulkImports::EntityWorker.new
+ worker = described_class.new
next_tracker = worker.send(:next_pipeline_trackers_for, entity.id).first
diff --git a/spec/workers/bulk_imports/export_request_worker_spec.rb b/spec/workers/bulk_imports/export_request_worker_spec.rb
index 2faa28ba489..0acc44c5cbf 100644
--- a/spec/workers/bulk_imports/export_request_worker_spec.rb
+++ b/spec/workers/bulk_imports/export_request_worker_spec.rb
@@ -112,6 +112,36 @@ RSpec.describe BulkImports::ExportRequestWorker, feature_category: :importers do
it_behaves_like 'requests relations export for api resource'
end
+
+ context 'when source supports batched migration' do
+ let_it_be(:bulk_import) { create(:bulk_import, source_version: BulkImport.min_gl_version_for_migration_in_batches) }
+ let_it_be(:config) { create(:bulk_import_configuration, bulk_import: bulk_import) }
+ let_it_be(:entity) { create(:bulk_import_entity, :project_entity, source_full_path: 'foo/bar', bulk_import: bulk_import) }
+
+ it 'requests relations export & schedules entity worker' do
+ expected_url = "/projects/#{entity.source_xid}/export_relations?batched=true"
+
+ expect_next_instance_of(BulkImports::Clients::HTTP) do |client|
+ expect(client).to receive(:post).with(expected_url)
+ end
+
+ described_class.new.perform(entity.id)
+ end
+
+ context 'when bulk_imports_batched_import_export feature flag is disabled' do
+ it 'requests relation export without batched param' do
+ stub_feature_flags(bulk_imports_batched_import_export: false)
+
+ expected_url = "/projects/#{entity.source_xid}/export_relations"
+
+ expect_next_instance_of(BulkImports::Clients::HTTP) do |client|
+ expect(client).to receive(:post).with(expected_url)
+ end
+
+ described_class.new.perform(entity.id)
+ end
+ end
+ end
end
describe '#sidekiq_retries_exhausted' do
diff --git a/spec/workers/bulk_imports/finish_batched_pipeline_worker_spec.rb b/spec/workers/bulk_imports/finish_batched_pipeline_worker_spec.rb
new file mode 100644
index 00000000000..6fe6b420f2b
--- /dev/null
+++ b/spec/workers/bulk_imports/finish_batched_pipeline_worker_spec.rb
@@ -0,0 +1,75 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe BulkImports::FinishBatchedPipelineWorker, feature_category: :importers do
+ let_it_be(:bulk_import) { create(:bulk_import) }
+ let_it_be(:config) { create(:bulk_import_configuration, bulk_import: bulk_import) }
+ let_it_be(:entity) { create(:bulk_import_entity, bulk_import: bulk_import) }
+
+ let(:status_event) { :finish }
+ let(:pipeline_tracker) { create(:bulk_import_tracker, :started, :batched, entity: entity) }
+
+ subject(:worker) { described_class.new }
+
+ describe '#perform' do
+ it 'finishes pipeline and enqueues entity worker' do
+ expect(BulkImports::EntityWorker)
+ .to receive(:perform_async)
+ .with(entity.id, pipeline_tracker.stage)
+
+ subject.perform(pipeline_tracker.id)
+
+ expect(pipeline_tracker.reload.finished?).to eq(true)
+ end
+
+ context 'when import is in progress' do
+ it 're-enqueues' do
+ create(:bulk_import_batch_tracker, :started, tracker: pipeline_tracker)
+
+ expect(described_class)
+ .to receive(:perform_in)
+ .with(described_class::REQUEUE_DELAY, pipeline_tracker.id)
+
+ subject.perform(pipeline_tracker.id)
+ end
+ end
+
+ context 'when pipeline tracker is stale' do
+ let(:pipeline_tracker) { create(:bulk_import_tracker, :started, :batched, :stale, entity: entity) }
+
+ it 'fails pipeline tracker and its batches' do
+ create(:bulk_import_batch_tracker, :finished, tracker: pipeline_tracker)
+
+ subject.perform(pipeline_tracker.id)
+
+ expect(pipeline_tracker.reload.failed?).to eq(true)
+ expect(pipeline_tracker.batches.first.reload.failed?).to eq(true)
+ end
+ end
+
+ context 'when pipeline is not batched' do
+ let(:pipeline_tracker) { create(:bulk_import_tracker, :started, entity: entity) }
+
+ it 'returns' do
+ expect_next_instance_of(BulkImports::Tracker) do |instance|
+ expect(instance).not_to receive(:finish!)
+ end
+
+ subject.perform(pipeline_tracker.id)
+ end
+ end
+
+ context 'when pipeline is not started' do
+ let(:status_event) { :start }
+
+ it 'returns' do
+ expect_next_instance_of(BulkImports::Tracker) do |instance|
+ expect(instance).not_to receive(:finish!)
+ end
+
+ described_class.new.perform(pipeline_tracker.id)
+ end
+ end
+ end
+end
diff --git a/spec/workers/bulk_imports/pipeline_batch_worker_spec.rb b/spec/workers/bulk_imports/pipeline_batch_worker_spec.rb
new file mode 100644
index 00000000000..c10e1b486ab
--- /dev/null
+++ b/spec/workers/bulk_imports/pipeline_batch_worker_spec.rb
@@ -0,0 +1,136 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe BulkImports::PipelineBatchWorker, feature_category: :importers do
+ let_it_be(:bulk_import) { create(:bulk_import) }
+ let_it_be(:config) { create(:bulk_import_configuration, bulk_import: bulk_import) }
+ let_it_be(:entity) { create(:bulk_import_entity, bulk_import: bulk_import) }
+
+ let(:pipeline_class) do
+ Class.new do
+ def initialize(_); end
+
+ def run; end
+
+ def self.file_extraction_pipeline?
+ false
+ end
+ end
+ end
+
+ let(:tracker) do
+ create(
+ :bulk_import_tracker,
+ entity: entity,
+ pipeline_name: 'FakePipeline',
+ status_event: 'enqueue'
+ )
+ end
+
+ let(:batch) { create(:bulk_import_batch_tracker, :created, tracker: tracker) }
+
+ subject(:worker) { described_class.new }
+
+ before do
+ stub_const('FakePipeline', pipeline_class)
+
+ allow(subject).to receive(:jid).and_return('jid')
+ allow(entity).to receive(:pipeline_exists?).with('FakePipeline').and_return(true)
+ allow_next_instance_of(BulkImports::Groups::Stage) do |instance|
+ allow(instance)
+ .to receive(:pipelines)
+ .and_return([{ stage: 0, pipeline: pipeline_class }])
+ end
+ end
+
+ describe '#perform' do
+ it 'runs the given pipeline batch successfully' do
+ expect(BulkImports::FinishBatchedPipelineWorker).to receive(:perform_async).with(tracker.id)
+
+ subject.perform(batch.id)
+
+ expect(batch.reload).to be_finished
+ end
+
+ context 'when tracker is failed' do
+ let(:tracker) { create(:bulk_import_tracker, :failed) }
+
+ it 'skips the batch' do
+ subject.perform(batch.id)
+
+ expect(batch.reload).to be_skipped
+ end
+ end
+
+ context 'when tracker is finished' do
+ let(:tracker) { create(:bulk_import_tracker, :finished) }
+
+ it 'skips the batch' do
+ subject.perform(batch.id)
+
+ expect(batch.reload).to be_skipped
+ end
+ end
+
+ context 'when exclusive lease cannot be obtained' do
+ it 'does not run the pipeline' do
+ expect(subject).to receive(:try_obtain_lease).and_return(false)
+ expect(subject).not_to receive(:run)
+
+ subject.perform(batch.id)
+ end
+ end
+
+ context 'when pipeline raises an exception' do
+ context 'when pipeline is retryable' do
+ it 'retries the batch' do
+ allow_next_instance_of(pipeline_class) do |instance|
+ allow(instance)
+ .to receive(:run)
+ .and_raise(BulkImports::RetryPipelineError.new('Error!', 60))
+ end
+
+ expect(described_class).to receive(:perform_in).with(60, batch.id)
+
+ subject.perform(batch.id)
+
+ expect(batch.reload).to be_created
+ end
+ end
+
+ context 'when pipeline is not retryable' do
+ it 'fails the batch and creates a failure record' do
+ allow_next_instance_of(pipeline_class) do |instance|
+ allow(instance).to receive(:run).and_raise(StandardError, 'Something went wrong')
+ end
+
+ expect(Gitlab::ErrorTracking).to receive(:track_exception).with(
+ instance_of(StandardError),
+ hash_including(
+ batch_id: batch.id,
+ tracker_id: tracker.id,
+ pipeline_class: 'FakePipeline',
+ pipeline_step: 'pipeline_batch_worker_run'
+ )
+ )
+
+ expect(BulkImports::Failure).to receive(:create).with(
+ bulk_import_entity_id: entity.id,
+ pipeline_class: 'FakePipeline',
+ pipeline_step: 'pipeline_batch_worker_run',
+ exception_class: 'StandardError',
+ exception_message: 'Something went wrong',
+ correlation_id_value: anything
+ )
+
+ expect(BulkImports::FinishBatchedPipelineWorker).to receive(:perform_async).with(tracker.id)
+
+ subject.perform(batch.id)
+
+ expect(batch.reload).to be_failed
+ end
+ end
+ end
+ end
+end
diff --git a/spec/workers/bulk_imports/pipeline_worker_spec.rb b/spec/workers/bulk_imports/pipeline_worker_spec.rb
index e8b0714471d..320f62dc93e 100644
--- a/spec/workers/bulk_imports/pipeline_worker_spec.rb
+++ b/spec/workers/bulk_imports/pipeline_worker_spec.rb
@@ -387,8 +387,9 @@ RSpec.describe BulkImports::PipelineWorker, feature_category: :importers do
stub_const('NdjsonPipeline', file_extraction_pipeline)
allow_next_instance_of(BulkImports::Groups::Stage) do |instance|
- allow(instance).to receive(:pipelines)
- .and_return([{ stage: 0, pipeline: file_extraction_pipeline }])
+ allow(instance)
+ .to receive(:pipelines)
+ .and_return([{ stage: 0, pipeline: file_extraction_pipeline }])
end
end
@@ -397,6 +398,7 @@ RSpec.describe BulkImports::PipelineWorker, feature_category: :importers do
allow(status).to receive(:started?).and_return(false)
allow(status).to receive(:empty?).and_return(false)
allow(status).to receive(:failed?).and_return(false)
+ allow(status).to receive(:batched?).and_return(false)
end
subject.perform(pipeline_tracker.id, pipeline_tracker.stage, entity.id)
@@ -410,6 +412,7 @@ RSpec.describe BulkImports::PipelineWorker, feature_category: :importers do
allow(status).to receive(:started?).and_return(true)
allow(status).to receive(:empty?).and_return(false)
allow(status).to receive(:failed?).and_return(false)
+ allow(status).to receive(:batched?).and_return(false)
end
expect(described_class)
@@ -431,6 +434,7 @@ RSpec.describe BulkImports::PipelineWorker, feature_category: :importers do
allow(status).to receive(:started?).and_return(false)
allow(status).to receive(:empty?).and_return(true)
allow(status).to receive(:failed?).and_return(false)
+ allow(status).to receive(:batched?).and_return(false)
end
pipeline_tracker.update!(created_at: created_at)
@@ -572,5 +576,43 @@ RSpec.describe BulkImports::PipelineWorker, feature_category: :importers do
expect(pipeline_tracker.reload.status_name).to eq(:failed)
end
end
+
+ context 'when export is batched' do
+ let(:batches_count) { 2 }
+
+ before do
+ allow_next_instance_of(BulkImports::ExportStatus) do |status|
+ allow(status).to receive(:batched?).and_return(true)
+ allow(status).to receive(:batches_count).and_return(batches_count)
+ allow(status).to receive(:started?).and_return(false)
+ allow(status).to receive(:empty?).and_return(false)
+ allow(status).to receive(:failed?).and_return(false)
+ end
+ end
+
+ it 'enqueues pipeline batches' do
+ expect(BulkImports::PipelineBatchWorker).to receive(:perform_async).twice
+
+ subject.perform(pipeline_tracker.id, pipeline_tracker.stage, entity.id)
+
+ pipeline_tracker.reload
+
+ expect(pipeline_tracker.status_name).to eq(:started)
+ expect(pipeline_tracker.batched).to eq(true)
+ expect(pipeline_tracker.batches.count).to eq(batches_count)
+ end
+
+ context 'when batches count is less than 1' do
+ let(:batches_count) { 0 }
+
+ it 'marks tracker as finished' do
+ expect(subject).not_to receive(:enqueue_batches)
+
+ subject.perform(pipeline_tracker.id, pipeline_tracker.stage, entity.id)
+
+ expect(pipeline_tracker.reload.status_name).to eq(:finished)
+ end
+ end
+ end
end
end
diff --git a/spec/workers/bulk_imports/relation_export_worker_spec.rb b/spec/workers/bulk_imports/relation_export_worker_spec.rb
index f91db0388a4..646af6c2a9c 100644
--- a/spec/workers/bulk_imports/relation_export_worker_spec.rb
+++ b/spec/workers/bulk_imports/relation_export_worker_spec.rb
@@ -47,28 +47,14 @@ RSpec.describe BulkImports::RelationExportWorker, feature_category: :importers d
context 'when export is batched' do
let(:batched) { true }
- context 'when bulk_imports_batched_import_export feature flag is disabled' do
- before do
- stub_feature_flags(bulk_imports_batched_import_export: false)
- end
-
- include_examples 'export service', BulkImports::RelationExportService
+ context 'when relation is batchable' do
+ include_examples 'export service', BulkImports::BatchedRelationExportService
end
- context 'when bulk_imports_batched_import_export feature flag is enabled' do
- before do
- stub_feature_flags(bulk_imports_batched_import_export: true)
- end
-
- context 'when relation is batchable' do
- include_examples 'export service', BulkImports::BatchedRelationExportService
- end
+ context 'when relation is not batchable' do
+ let(:relation) { 'namespace_settings' }
- context 'when relation is not batchable' do
- let(:relation) { 'namespace_settings' }
-
- include_examples 'export service', BulkImports::RelationExportService
- end
+ include_examples 'export service', BulkImports::RelationExportService
end
end
diff --git a/spec/workers/ci/merge_requests/cleanup_ref_worker_spec.rb b/spec/workers/ci/merge_requests/cleanup_ref_worker_spec.rb
new file mode 100644
index 00000000000..41ee1047adf
--- /dev/null
+++ b/spec/workers/ci/merge_requests/cleanup_ref_worker_spec.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe MergeRequests::CleanupRefWorker, :sidekiq_inline, feature_category: :code_review_workflow do
+ include ExclusiveLeaseHelpers
+
+ let_it_be(:source_project) { create(:project, :repository) }
+ let_it_be(:merge_request) { create(:merge_request, source_project: source_project) }
+
+ let(:worker) { described_class.new }
+ let(:only) { :all }
+
+ subject { worker.perform(merge_request.id, only) }
+
+ it 'does remove all merge request refs' do
+ expect(MergeRequest).to receive(:find_by_id).with(merge_request.id).and_return(merge_request)
+ expect(merge_request.target_project.repository)
+ .to receive(:delete_refs)
+ .with(merge_request.ref_path, merge_request.merge_ref_path, merge_request.train_ref_path)
+
+ subject
+ end
+
+ context 'when only is :train' do
+ let(:only) { :train }
+
+ it 'does remove only car merge request train ref' do
+ expect(MergeRequest).to receive(:find_by_id).with(merge_request.id).and_return(merge_request)
+ expect(merge_request.target_project.repository)
+ .to receive(:delete_refs)
+ .with(merge_request.train_ref_path)
+
+ subject
+ end
+ end
+
+ context 'when max retry attempts reach' do
+ let(:lease_key) { "projects/#{merge_request.target_project_id}/serialized_remove_refs" }
+ let!(:lease) { stub_exclusive_lease_taken(lease_key) }
+
+ it 'does not raise error' do
+ expect(lease).to receive(:try_obtain).exactly(described_class::LOCK_RETRY + 1).times
+ expect { subject }.to raise_error(Gitlab::ExclusiveLeaseHelpers::FailedToObtainLockError)
+ end
+ end
+end
diff --git a/spec/workers/ci/pipeline_cleanup_ref_worker_spec.rb b/spec/workers/ci/pipeline_cleanup_ref_worker_spec.rb
new file mode 100644
index 00000000000..af7b505602e
--- /dev/null
+++ b/spec/workers/ci/pipeline_cleanup_ref_worker_spec.rb
@@ -0,0 +1,61 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Ci::PipelineCleanupRefWorker, :sidekiq_inline, feature_category: :continuous_integration do
+ include ExclusiveLeaseHelpers
+
+ let_it_be(:pipeline) { create(:ci_pipeline, :success) }
+
+ let(:worker) { described_class.new }
+
+ subject { worker.perform(pipeline.id) }
+
+ it 'does remove persistent ref' do
+ expect_next_instance_of(Ci::PersistentRef) do |persistent_ref|
+ expect(persistent_ref).to receive(:delete).once
+ end
+
+ subject
+ end
+
+ context 'when pipeline is still running' do
+ let_it_be(:pipeline) { create(:ci_pipeline, :running) }
+
+ it 'does not remove persistent ref' do
+ expect_next_instance_of(Ci::PersistentRef) do |persistent_ref|
+ expect(persistent_ref).not_to receive(:delete)
+ end
+
+ subject
+ end
+ end
+
+ context 'when pipeline status changes while being locked' do
+ let_it_be(:pipeline) { create(:ci_pipeline, :success) }
+
+ it 'does not remove persistent ref' do
+ expect_next_instance_of(Ci::PersistentRef) do |persistent_ref|
+ expect(persistent_ref).not_to receive(:delete_refs)
+ end
+
+ expect(worker).to receive(:in_lock).and_wrap_original do |method, *args, **kwargs, &block|
+ pipeline.run!
+
+ method.call(*args, **kwargs, &block)
+ end
+
+ subject
+ end
+ end
+
+ context 'when max retry attempts reach' do
+ let(:lease_key) { "projects/#{pipeline.project_id}/serialized_remove_refs" }
+ let!(:lease) { stub_exclusive_lease_taken(lease_key) }
+
+ it 'does not raise error' do
+ expect(lease).to receive(:try_obtain).exactly(described_class::LOCK_RETRY + 1).times
+ expect { subject }.to raise_error(Gitlab::ExclusiveLeaseHelpers::FailedToObtainLockError)
+ end
+ end
+end
diff --git a/spec/workers/container_registry/cleanup_worker_spec.rb b/spec/workers/container_registry/cleanup_worker_spec.rb
index 955d2175085..ef54bd40ede 100644
--- a/spec/workers/container_registry/cleanup_worker_spec.rb
+++ b/spec/workers/container_registry/cleanup_worker_spec.rb
@@ -71,6 +71,7 @@ RSpec.describe ContainerRegistry::CleanupWorker, :aggregate_failures, feature_ca
let(:relation) { instance_double(ActiveRecord::Relation) }
before do
+ allow(::Gitlab).to receive(:com_except_jh?).and_return(true)
allow(ContainerRegistry::GitlabApiClient).to receive(:supports_gitlab_api?).and_return(true)
allow(Project).to receive(:pending_data_repair_analysis).and_return(relation)
end
@@ -116,23 +117,5 @@ RSpec.describe ContainerRegistry::CleanupWorker, :aggregate_failures, feature_ca
it_behaves_like 'does not enqueue record repair detail jobs'
end
-
- context 'for counts logging' do
- let_it_be(:delete_started_at) { (described_class::STALE_DELETE_THRESHOLD + 5.minutes).ago }
- let_it_be(:stale_delete_container_repository) do
- create(:container_repository, :status_delete_ongoing, delete_started_at: delete_started_at)
- end
-
- before do
- container_repository.delete_scheduled!
- end
-
- it 'logs the counts' do
- expect(worker).to receive(:log_extra_metadata_on_done).with(:delete_scheduled_container_repositories_count, 1)
- expect(worker).to receive(:log_extra_metadata_on_done).with(:stale_delete_container_repositories_count, 1)
-
- perform
- end
- end
end
end
diff --git a/spec/workers/container_registry/record_data_repair_detail_worker_spec.rb b/spec/workers/container_registry/record_data_repair_detail_worker_spec.rb
index 118b897b26f..d8da45cfdcb 100644
--- a/spec/workers/container_registry/record_data_repair_detail_worker_spec.rb
+++ b/spec/workers/container_registry/record_data_repair_detail_worker_spec.rb
@@ -36,8 +36,17 @@ RSpec.describe ContainerRegistry::RecordDataRepairDetailWorker, :aggregate_failu
end
context 'when on Gitlab.com', :saas do
+ before do
+ allow(::Gitlab).to receive(:com_except_jh?).and_return(true)
+ end
+
it 'obtains exclusive lease on the project' do
- expect(Project).to receive(:pending_data_repair_analysis).and_call_original
+ pending_analysis = Project.pending_data_repair_analysis
+ limited_pending_analysis = Project.pending_data_repair_analysis
+ expect(pending_analysis).to receive(:limit).and_return(limited_pending_analysis)
+ expect(limited_pending_analysis).to receive(:sample).and_call_original
+
+ expect(Project).to receive(:pending_data_repair_analysis).and_return(pending_analysis)
expect_to_obtain_exclusive_lease("container_registry_data_repair_detail_worker:#{project.id}",
timeout: described_class::LEASE_TIMEOUT)
expect_to_cancel_exclusive_lease("container_registry_data_repair_detail_worker:#{project.id}", 'uuid')
diff --git a/spec/workers/every_sidekiq_worker_spec.rb b/spec/workers/every_sidekiq_worker_spec.rb
index cf1667cb0ff..38959b6d764 100644
--- a/spec/workers/every_sidekiq_worker_spec.rb
+++ b/spec/workers/every_sidekiq_worker_spec.rb
@@ -122,11 +122,9 @@ RSpec.describe 'Every Sidekiq worker', feature_category: :shared do
'AdminEmailsWorker' => 3,
'Analytics::CodeReviewMetricsWorker' => 3,
'Analytics::DevopsAdoption::CreateSnapshotWorker' => 3,
- 'Analytics::InstanceStatistics::CounterJobWorker' => 3,
'Analytics::UsageTrends::CounterJobWorker' => 3,
'ApprovalRules::ExternalApprovalRulePayloadWorker' => 3,
'ApproveBlockedPendingApprovalUsersWorker' => 3,
- 'ArchiveTraceWorker' => 3,
'AuthorizedKeysWorker' => 3,
'AuthorizedProjectUpdate::UserRefreshOverUserRangeWorker' => 3,
'AuthorizedProjectUpdate::UserRefreshWithLowUrgencyWorker' => 3,
@@ -136,7 +134,6 @@ RSpec.describe 'Every Sidekiq worker', feature_category: :shared do
'AutoMergeProcessWorker' => 3,
'BackgroundMigrationWorker' => 3,
'BackgroundMigration::CiDatabaseWorker' => 3,
- 'BuildFinishedWorker' => 3,
'BuildHooksWorker' => 3,
'BuildQueueWorker' => 3,
'BuildSuccessWorker' => 3,
@@ -144,6 +141,7 @@ RSpec.describe 'Every Sidekiq worker', feature_category: :shared do
'BulkImports::ExportRequestWorker' => 5,
'BulkImports::EntityWorker' => false,
'BulkImports::PipelineWorker' => false,
+ 'BulkImports::PipelineBatchWorker' => false,
'Chaos::CpuSpinWorker' => 3,
'Chaos::DbSpinWorker' => 3,
'Chaos::KillWorker' => false,
@@ -165,6 +163,7 @@ RSpec.describe 'Every Sidekiq worker', feature_category: :shared do
'Ci::Llm::GenerateConfigWorker' => 3,
'Ci::PipelineArtifacts::CoverageReportWorker' => 3,
'Ci::PipelineArtifacts::CreateQualityReportWorker' => 3,
+ 'Ci::PipelineCleanupRefWorker' => 3,
'Ci::PipelineBridgeStatusWorker' => 3,
'Ci::PipelineSuccessUnlockArtifactsWorker' => 3,
'Ci::RefDeleteUnlockArtifactsWorker' => 3,
@@ -186,7 +185,6 @@ RSpec.describe 'Every Sidekiq worker', feature_category: :shared do
'Clusters::Applications::DeactivateIntegrationWorker' => 3,
'Clusters::Applications::UninstallWorker' => 3,
'Clusters::Applications::WaitForUninstallAppWorker' => 3,
- 'Clusters::Cleanup::AppWorker' => 3,
'Clusters::Cleanup::ProjectNamespaceWorker' => 3,
'Clusters::Cleanup::ServiceAccountWorker' => 3,
'ContainerExpirationPolicies::CleanupContainerRepositoryWorker' => 0,
@@ -206,10 +204,7 @@ RSpec.describe 'Every Sidekiq worker', feature_category: :shared do
'DependencyProxy::CleanupBlobWorker' => 3,
'DependencyProxy::CleanupManifestWorker' => 3,
'Deployments::AutoRollbackWorker' => 3,
- 'Deployments::FinishedWorker' => 3,
- 'Deployments::ForwardDeploymentWorker' => 3,
'Deployments::LinkMergeRequestWorker' => 3,
- 'Deployments::SuccessWorker' => 3,
'Deployments::UpdateEnvironmentWorker' => 3,
'Deployments::ApprovalWorker' => 3,
'DesignManagement::CopyDesignCollectionWorker' => 3,
@@ -251,6 +246,7 @@ RSpec.describe 'Every Sidekiq worker', feature_category: :shared do
'Geo::RepositoryVerification::Primary::SingleWorker' => false,
'Geo::RepositoryVerification::Secondary::SingleWorker' => false,
'Geo::ReverificationBatchWorker' => 0,
+ 'Geo::BulkMarkPendingBatchWorker' => 0,
'Geo::Scheduler::Primary::SchedulerWorker' => false,
'Geo::Scheduler::SchedulerWorker' => false,
'Geo::Scheduler::Secondary::SchedulerWorker' => false,
@@ -259,7 +255,6 @@ RSpec.describe 'Every Sidekiq worker', feature_category: :shared do
'Geo::VerificationTimeoutWorker' => false,
'Geo::VerificationWorker' => 3,
'GeoRepositoryDestroyWorker' => 3,
- 'GitGarbageCollectWorker' => false,
'Gitlab::BitbucketServerImport::AdvanceStageWorker' => 3,
'Gitlab::BitbucketServerImport::Stage::FinishImportWorker' => 3,
'Gitlab::BitbucketServerImport::Stage::ImportLfsObjectsWorker' => 3,
@@ -355,8 +350,8 @@ RSpec.describe 'Every Sidekiq worker', feature_category: :shared do
'MergeRequestCleanupRefsWorker' => 3,
'MergeRequestMergeabilityCheckWorker' => 3,
'MergeRequestResetApprovalsWorker' => 3,
- 'MergeRequests::AssigneesChangeWorker' => 3,
'MergeRequests::CaptureSuggestedReviewersAcceptedWorker' => 3,
+ 'MergeRequests::CleanupRefWorker' => 3,
'MergeRequests::CreatePipelineWorker' => 3,
'MergeRequests::DeleteSourceBranchWorker' => 3,
'MergeRequests::FetchSuggestedReviewersWorker' => 3,
@@ -366,15 +361,12 @@ RSpec.describe 'Every Sidekiq worker', feature_category: :shared do
'MergeRequests::SyncCodeOwnerApprovalRulesWorker' => 3,
'MergeTrains::RefreshWorker' => 3,
'MergeWorker' => 3,
- 'Metrics::Dashboard::PruneOldAnnotationsWorker' => 3,
- 'Metrics::Dashboard::SyncDashboardsWorker' => 3,
'MigrateExternalDiffsWorker' => 3,
'Onboarding::IssueCreatedWorker' => 3,
'Onboarding::PipelineCreatedWorker' => 3,
'Onboarding::ProgressWorker' => 3,
'Onboarding::UserAddedWorker' => 3,
'Namespaces::FreeUserCap::OverLimitNotificationWorker' => false,
- 'Namespaces::RefreshRootStatisticsWorker' => 3,
'Namespaces::RootStatisticsWorker' => 3,
'Namespaces::ScheduleAggregationWorker' => 3,
'Namespaces::FreeUserCap::NotificationClearingWorker' => false,
@@ -412,9 +404,7 @@ RSpec.describe 'Every Sidekiq worker', feature_category: :shared do
'ProjectDestroyWorker' => 3,
'ProjectExportWorker' => false,
'ProjectImportScheduleWorker' => 1,
- 'ProjectScheduleBulkRepositoryShardMovesWorker' => 3,
'ProjectTemplateExportWorker' => false,
- 'ProjectUpdateRepositoryStorageWorker' => 3,
'Projects::DeregisterSuggestedReviewersProjectWorker' => 3,
'Projects::DisableLegacyOpenSourceLicenseForInactiveProjectsWorker' => 3,
'Projects::GitGarbageCollectWorker' => false,
@@ -447,13 +437,12 @@ RSpec.describe 'Every Sidekiq worker', feature_category: :shared do
'RequirementsManagement::ProcessRequirementsReportsWorker' => 3,
'RunPipelineScheduleWorker' => 3,
'ScanSecurityReportSecretsWorker' => 17,
+ 'Search::ElasticGroupAssociationDeletionWorker' => 3,
'Security::AutoFixWorker' => 3,
'Security::StoreScansWorker' => 3,
'Security::TrackSecureScansWorker' => 1,
'ServiceDeskEmailReceiverWorker' => 3,
'SetUserStatusBasedOnUserCapSettingWorker' => 3,
- 'SnippetScheduleBulkRepositoryShardMovesWorker' => 3,
- 'SnippetUpdateRepositoryStorageWorker' => 3,
'Snippets::ScheduleBulkRepositoryShardMovesWorker' => 3,
'Snippets::UpdateRepositoryStorageWorker' => 3,
'StageUpdateWorker' => 3,
@@ -481,7 +470,6 @@ RSpec.describe 'Every Sidekiq worker', feature_category: :shared do
'VulnerabilityExports::ExportWorker' => 3,
'WaitForClusterCreationWorker' => 3,
'WebHookWorker' => 4,
- 'WebHooks::DestroyWorker' => 3,
'WebHooks::LogExecutionWorker' => 3,
'Wikis::GitGarbageCollectWorker' => false,
'WorkItems::ImportWorkItemsCsvWorker' => 3,
@@ -491,6 +479,23 @@ RSpec.describe 'Every Sidekiq worker', feature_category: :shared do
}.merge(extra_retry_exceptions)
end
+ it 'defines `retry_exceptions` only for existing workers', if: Gitlab.ee? do
+ removed_workers = retry_exceptions.keys - retry_exception_workers.map { |worker| worker.klass.to_s }
+ message = -> do
+ list = removed_workers.map { |name| "- #{name}" }
+
+ <<~MESSAGE
+ The following workers no longer exist but are defined in `retry_exceptions`:
+
+ #{list.join("\n")}
+
+ Make sure to remove them from `retry_exceptions` because their definition is unnecessary.
+ MESSAGE
+ end
+
+ expect(removed_workers).to be_empty, message
+ end
+
it 'uses the default number of retries for new jobs' do
expect(workers_without_defaults - cronjobs - retry_exception_workers).to all(have_attributes(retries: true))
end
diff --git a/spec/workers/gitlab/github_import/stage/import_attachments_worker_spec.rb b/spec/workers/gitlab/github_import/stage/import_attachments_worker_spec.rb
index 2945bcbe641..e385a5aaf3f 100644
--- a/spec/workers/gitlab/github_import/stage/import_attachments_worker_spec.rb
+++ b/spec/workers/gitlab/github_import/stage/import_attachments_worker_spec.rb
@@ -10,7 +10,7 @@ RSpec.describe Gitlab::GithubImport::Stage::ImportAttachmentsWorker, feature_cat
let(:stage_enabled) { true }
before do
- settings.write({ attachments_import: stage_enabled })
+ settings.write({ optional_stages: { attachments_import: stage_enabled } })
end
describe '#import' do
diff --git a/spec/workers/gitlab/github_import/stage/import_collaborators_worker_spec.rb b/spec/workers/gitlab/github_import/stage/import_collaborators_worker_spec.rb
index 33ecf848997..808f6e827ed 100644
--- a/spec/workers/gitlab/github_import/stage/import_collaborators_worker_spec.rb
+++ b/spec/workers/gitlab/github_import/stage/import_collaborators_worker_spec.rb
@@ -16,7 +16,7 @@ RSpec.describe Gitlab::GithubImport::Stage::ImportCollaboratorsWorker, feature_c
let(:push_rights_granted) { true }
before do
- settings.write({ collaborators_import: stage_enabled })
+ settings.write({ optional_stages: { collaborators_import: stage_enabled } })
allow(client).to receive(:repository).with(project.import_source)
.and_return({ permissions: { push: push_rights_granted } })
end
diff --git a/spec/workers/gitlab/github_import/stage/import_issue_events_worker_spec.rb b/spec/workers/gitlab/github_import/stage/import_issue_events_worker_spec.rb
index c70ee0250e8..7b0cf77bbbe 100644
--- a/spec/workers/gitlab/github_import/stage/import_issue_events_worker_spec.rb
+++ b/spec/workers/gitlab/github_import/stage/import_issue_events_worker_spec.rb
@@ -11,7 +11,7 @@ RSpec.describe Gitlab::GithubImport::Stage::ImportIssueEventsWorker, feature_cat
let(:stage_enabled) { true }
before do
- settings.write({ single_endpoint_issue_events_import: stage_enabled })
+ settings.write({ optional_stages: { single_endpoint_issue_events_import: stage_enabled } })
end
describe '#import' do
diff --git a/spec/workers/gitlab/github_import/stage/import_issues_and_diff_notes_worker_spec.rb b/spec/workers/gitlab/github_import/stage/import_issues_and_diff_notes_worker_spec.rb
index 872201ece93..188cf3530f7 100644
--- a/spec/workers/gitlab/github_import/stage/import_issues_and_diff_notes_worker_spec.rb
+++ b/spec/workers/gitlab/github_import/stage/import_issues_and_diff_notes_worker_spec.rb
@@ -10,7 +10,7 @@ RSpec.describe Gitlab::GithubImport::Stage::ImportIssuesAndDiffNotesWorker, feat
let(:single_endpoint_optional_stage) { true }
before do
- settings.write({ single_endpoint_notes_import: single_endpoint_optional_stage })
+ settings.write({ optional_stages: { single_endpoint_notes_import: single_endpoint_optional_stage } })
end
describe '#import' do
diff --git a/spec/workers/gitlab/github_import/stage/import_notes_worker_spec.rb b/spec/workers/gitlab/github_import/stage/import_notes_worker_spec.rb
index 8c0004c0f3f..dcceeb1d6c2 100644
--- a/spec/workers/gitlab/github_import/stage/import_notes_worker_spec.rb
+++ b/spec/workers/gitlab/github_import/stage/import_notes_worker_spec.rb
@@ -10,7 +10,7 @@ RSpec.describe Gitlab::GithubImport::Stage::ImportNotesWorker, feature_category:
let(:single_endpoint_optional_stage) { true }
before do
- settings.write({ single_endpoint_notes_import: single_endpoint_optional_stage })
+ settings.write({ optional_stages: { single_endpoint_notes_import: single_endpoint_optional_stage } })
end
describe '#import' do
diff --git a/spec/workers/incident_management/close_incident_worker_spec.rb b/spec/workers/incident_management/close_incident_worker_spec.rb
index 3c2e69a4675..02ca5260fbd 100644
--- a/spec/workers/incident_management/close_incident_worker_spec.rb
+++ b/spec/workers/incident_management/close_incident_worker_spec.rb
@@ -36,7 +36,7 @@ RSpec.describe IncidentManagement::CloseIncidentWorker, feature_category: :incid
context 'when issue type is not incident' do
before do
- issue.update!(issue_type: :issue, work_item_type: WorkItems::Type.default_by_type(:issue))
+ issue.update!(work_item_type: WorkItems::Type.default_by_type(:issue))
end
it_behaves_like 'does not call the close issue service'
diff --git a/spec/workers/integrations/execute_worker_spec.rb b/spec/workers/integrations/execute_worker_spec.rb
index 717e3c65820..369fc5fd091 100644
--- a/spec/workers/integrations/execute_worker_spec.rb
+++ b/spec/workers/integrations/execute_worker_spec.rb
@@ -36,4 +36,18 @@ RSpec.describe Integrations::ExecuteWorker, '#perform', feature_category: :integ
end.not_to raise_error
end
end
+
+ context 'when the Gitlab::SilentMode is enabled' do
+ before do
+ allow(Gitlab::SilentMode).to receive(:enabled?).and_return(true)
+ end
+
+ it 'completes silently and does not log an error' do
+ expect(Gitlab::IntegrationsLogger).not_to receive(:error)
+
+ expect do
+ worker.perform(non_existing_record_id, {})
+ end.not_to raise_error
+ end
+ end
end
diff --git a/spec/workers/integrations/group_mention_worker_spec.rb b/spec/workers/integrations/group_mention_worker_spec.rb
new file mode 100644
index 00000000000..111e3f5a107
--- /dev/null
+++ b/spec/workers/integrations/group_mention_worker_spec.rb
@@ -0,0 +1,65 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::GroupMentionWorker, :clean_gitlab_redis_shared_state, feature_category: :integrations do
+ describe '#perform' do
+ let(:worker) { described_class.new }
+ let(:service_class) { Integrations::GroupMentionService }
+
+ let_it_be(:project) { create(:project, :public) }
+ let_it_be(:user) { create(:user) }
+
+ let(:issue) { create(:issue, confidential: false, project: project, author: user) }
+ let(:hook_data) { issue.to_hook_data(user) }
+ let(:is_confidential) { issue.confidential? }
+
+ let(:args) do
+ {
+ mentionable_type: 'Issue',
+ mentionable_id: issue.id,
+ hook_data: hook_data,
+ is_confidential: is_confidential
+ }
+ end
+
+ it 'executes the service' do
+ expect_next_instance_of(service_class, issue, hook_data: hook_data, is_confidential: is_confidential) do |service|
+ expect(service).to receive(:execute)
+ end
+
+ worker.perform(args)
+ end
+
+ it_behaves_like 'an idempotent worker' do
+ let(:job_args) { [args] }
+ end
+
+ context 'when mentionable_type is not supported' do
+ let(:args) do
+ {
+ mentionable_type: 'Unsupported',
+ mentionable_id: 23,
+ hook_data: {},
+ is_confidential: false
+ }
+ end
+
+ it 'does not execute the service' do
+ expect(service_class).not_to receive(:new)
+
+ worker.perform(args)
+ end
+
+ it 'logs an error' do
+ expect(Sidekiq.logger).to receive(:error).with({
+ message: 'Integrations::GroupMentionWorker: mentionable not supported',
+ mentionable_type: 'Unsupported',
+ mentionable_id: 23
+ })
+
+ worker.perform(args)
+ end
+ end
+ end
+end
diff --git a/spec/workers/jira_connect/retry_request_worker_spec.rb b/spec/workers/jira_connect/retry_request_worker_spec.rb
index e96a050da13..5453711f24e 100644
--- a/spec/workers/jira_connect/retry_request_worker_spec.rb
+++ b/spec/workers/jira_connect/retry_request_worker_spec.rb
@@ -11,7 +11,7 @@ RSpec.describe JiraConnect::RetryRequestWorker, feature_category: :integrations
subject(:perform) { described_class.new.perform(event_url, jwt, attempts) }
it 'sends the request, with the appropriate headers' do
- expect(JiraConnect::RetryRequestWorker).not_to receive(:perform_in)
+ expect(described_class).not_to receive(:perform_in)
stub_request(:post, event_url)
@@ -26,7 +26,7 @@ RSpec.describe JiraConnect::RetryRequestWorker, feature_category: :integrations
end
it 'arranges to retry the request' do
- expect(JiraConnect::RetryRequestWorker).to receive(:perform_in).with(1.hour, event_url, jwt, attempts - 1)
+ expect(described_class).to receive(:perform_in).with(1.hour, event_url, jwt, attempts - 1)
perform
end
@@ -35,7 +35,7 @@ RSpec.describe JiraConnect::RetryRequestWorker, feature_category: :integrations
let(:attempts) { 0 }
it 'does not retry' do
- expect(JiraConnect::RetryRequestWorker).not_to receive(:perform_in)
+ expect(described_class).not_to receive(:perform_in)
perform
end
diff --git a/spec/workers/merge_requests/mergeability_check_batch_worker_spec.rb b/spec/workers/merge_requests/mergeability_check_batch_worker_spec.rb
index 2c429ed62fb..828ffb0c811 100644
--- a/spec/workers/merge_requests/mergeability_check_batch_worker_spec.rb
+++ b/spec/workers/merge_requests/mergeability_check_batch_worker_spec.rb
@@ -5,6 +5,8 @@ require 'spec_helper'
RSpec.describe MergeRequests::MergeabilityCheckBatchWorker, feature_category: :code_review_workflow do
subject { described_class.new }
+ let_it_be(:user) { create(:user) }
+
describe '#perform' do
context 'when some merge_requests do not exist' do
it 'ignores unknown merge request ids' do
@@ -12,26 +14,49 @@ RSpec.describe MergeRequests::MergeabilityCheckBatchWorker, feature_category: :c
expect(Sidekiq.logger).not_to receive(:error)
- subject.perform([1234, 5678])
+ subject.perform([1234, 5678], user.id)
end
end
context 'when some merge_requests needs mergeability checks' do
let(:merge_request_1) { create(:merge_request, merge_status: :unchecked) }
- let(:merge_request_2) { create(:merge_request, merge_status: :cannot_be_merged_rechecking) }
+ let(:merge_request_2) { create(:merge_request, merge_status: :unchecked) }
let(:merge_request_3) { create(:merge_request, merge_status: :can_be_merged) }
+ before do
+ merge_request_1.project.add_developer(user)
+ merge_request_2.project.add_reporter(user)
+ merge_request_3.project.add_developer(user)
+ end
+
it 'executes MergeabilityCheckService on merge requests that needs to be checked' do
expect_next_instance_of(MergeRequests::MergeabilityCheckService, merge_request_1) do |service|
expect(service).to receive(:execute).and_return(ServiceResponse.success)
end
- expect_next_instance_of(MergeRequests::MergeabilityCheckService, merge_request_2) do |service|
- expect(service).to receive(:execute).and_return(ServiceResponse.success)
- end
+ expect(MergeRequests::MergeabilityCheckService).not_to receive(:new).with(merge_request_2.id)
expect(MergeRequests::MergeabilityCheckService).not_to receive(:new).with(merge_request_3.id)
expect(MergeRequests::MergeabilityCheckService).not_to receive(:new).with(1234)
- subject.perform([merge_request_1.id, merge_request_2.id, merge_request_3.id, 1234])
+ subject.perform([merge_request_1.id, merge_request_2.id, merge_request_3.id, 1234], user.id)
+ end
+
+ context 'when restrict_merge_status_recheck FF is off' do
+ before do
+ stub_feature_flags(restrict_merge_status_recheck: false)
+ end
+
+ it 'executes MergeabilityCheckService on merge requests that needs to be checked' do
+ expect_next_instance_of(MergeRequests::MergeabilityCheckService, merge_request_1) do |service|
+ expect(service).to receive(:execute).and_return(ServiceResponse.success)
+ end
+ expect_next_instance_of(MergeRequests::MergeabilityCheckService, merge_request_2) do |service|
+ expect(service).to receive(:execute).and_return(ServiceResponse.success)
+ end
+ expect(MergeRequests::MergeabilityCheckService).not_to receive(:new).with(merge_request_3.id)
+ expect(MergeRequests::MergeabilityCheckService).not_to receive(:new).with(1234)
+
+ subject.perform([merge_request_1.id, merge_request_2.id, merge_request_3.id, 1234], user.id)
+ end
end
it 'structurally logs a failed mergeability check' do
@@ -45,13 +70,26 @@ RSpec.describe MergeRequests::MergeabilityCheckBatchWorker, feature_category: :c
worker: described_class.to_s,
message: 'Failed to check mergeability of merge request: solar flares')
- subject.perform([merge_request_1.id])
+ subject.perform([merge_request_1.id], user.id)
+ end
+
+ context 'when user is nil' do
+ let(:user) { nil }
+
+ it 'does not run any mergeability checks' do
+ expect(MergeRequests::MergeabilityCheckService).not_to receive(:new).with(merge_request_1.id)
+ expect(MergeRequests::MergeabilityCheckService).not_to receive(:new).with(merge_request_2.id)
+ expect(MergeRequests::MergeabilityCheckService).not_to receive(:new).with(merge_request_3.id)
+ expect(MergeRequests::MergeabilityCheckService).not_to receive(:new).with(1234)
+
+ subject.perform([merge_request_1.id, merge_request_2.id, merge_request_3.id, 1234], user&.id)
+ end
end
end
it_behaves_like 'an idempotent worker' do
let(:merge_request) { create(:merge_request) }
- let(:job_args) { [merge_request.id] }
+ let(:job_args) { [[merge_request.id], user.id] }
it 'is mergeable' do
subject
diff --git a/spec/workers/packages/debian/process_changes_worker_spec.rb b/spec/workers/packages/debian/process_changes_worker_spec.rb
deleted file mode 100644
index 435ca33b223..00000000000
--- a/spec/workers/packages/debian/process_changes_worker_spec.rb
+++ /dev/null
@@ -1,133 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Packages::Debian::ProcessChangesWorker, type: :worker, feature_category: :package_registry do
- let_it_be(:user) { create(:user) }
- let_it_be_with_reload(:distribution) do
- create(:debian_project_distribution, :with_file, codename: FFaker::Lorem.word, suite: 'unstable')
- end
-
- let(:incoming) { create(:debian_incoming, project: distribution.project, with_changes_file: true) }
- let(:package_file) { incoming.package_files.with_file_name('sample_1.2.3~alpha2_amd64.changes').first }
- let(:worker) { described_class.new }
-
- describe '#perform' do
- let(:package_file_id) { package_file.id }
- let(:user_id) { user.id }
-
- subject { worker.perform(package_file_id, user_id) }
-
- context 'with mocked service' do
- it 'calls ProcessChangesService' do
- expect(Gitlab::ErrorTracking).not_to receive(:log_exception)
- expect_next_instance_of(::Packages::Debian::ProcessChangesService) do |service|
- expect(service).to receive(:execute)
- .with(no_args)
- end
-
- subject
- end
- end
-
- context 'with non existing package file' do
- let(:package_file_id) { non_existing_record_id }
-
- it 'returns early without error' do
- expect(Gitlab::ErrorTracking).not_to receive(:log_exception)
- expect(::Packages::Debian::ProcessChangesService).not_to receive(:new)
-
- subject
- end
- end
-
- context 'with nil package file id' do
- let(:package_file_id) { nil }
-
- it 'returns early without error' do
- expect(Gitlab::ErrorTracking).not_to receive(:log_exception)
- expect(::Packages::Debian::ProcessChangesService).not_to receive(:new)
-
- subject
- end
- end
-
- context 'with non existing user' do
- let(:user_id) { non_existing_record_id }
-
- it 'returns early without error' do
- expect(Gitlab::ErrorTracking).not_to receive(:log_exception)
- expect(::Packages::Debian::ProcessChangesService).not_to receive(:new)
-
- subject
- end
- end
-
- context 'with nil user id' do
- let(:user_id) { nil }
-
- it 'returns early without error' do
- expect(Gitlab::ErrorTracking).not_to receive(:log_exception)
- expect(::Packages::Debian::ProcessChangesService).not_to receive(:new)
-
- subject
- end
- end
-
- context 'without a distribution' do
- before do
- distribution.destroy!
- end
-
- it 'removes package file and log exception', :aggregate_failures do
- expect(Gitlab::ErrorTracking).to receive(:log_exception).with(
- instance_of(ActiveRecord::RecordNotFound),
- package_file_id: package_file_id,
- user_id: user_id
- )
- expect { subject }
- .to not_change { Packages::Package.count }
- .and change { Packages::PackageFile.count }.by(-1)
- .and change { incoming.package_files.count }.from(8).to(7)
- end
- end
-
- context 'when the service raises an error' do
- let(:package_file) { incoming.package_files.first }
-
- it 'removes package file and log exception', :aggregate_failures do
- expect(Gitlab::ErrorTracking).to receive(:log_exception).with(
- instance_of(Packages::Debian::ExtractChangesMetadataService::ExtractionError),
- package_file_id: package_file_id,
- user_id: user_id
- )
- expect { subject }
- .to not_change { Packages::Package.count }
- .and change { Packages::PackageFile.count }.by(-1)
- .and change { incoming.package_files.count }.from(8).to(7)
-
- expect { package_file.reload }.to raise_error(ActiveRecord::RecordNotFound)
- end
- end
-
- it_behaves_like 'an idempotent worker' do
- let(:job_args) { [package_file.id, user.id] }
-
- it 'sets the Debian file type as changes', :aggregate_failures do
- expect(Gitlab::ErrorTracking).not_to receive(:log_exception)
-
- # Using subject inside this block will process the job multiple times
- expect { subject }
- .to change { Packages::Package.count }.from(1).to(2)
- .and not_change { Packages::PackageFile.count }
- .and change { incoming.package_files.count }.from(8).to(0)
- .and change { package_file&.debian_file_metadatum&.reload&.file_type }.from('unknown').to('changes')
-
- created_package = Packages::Package.last
- expect(created_package.name).to eq 'sample'
- expect(created_package.version).to eq '1.2.3~alpha2'
- expect(created_package.creator).to eq user
- end
- end
- end
-end
diff --git a/spec/workers/packages/nuget/extraction_worker_spec.rb b/spec/workers/packages/nuget/extraction_worker_spec.rb
index c1d42d556c2..11eaa1b5dde 100644
--- a/spec/workers/packages/nuget/extraction_worker_spec.rb
+++ b/spec/workers/packages/nuget/extraction_worker_spec.rb
@@ -61,7 +61,7 @@ RSpec.describe Packages::Nuget::ExtractionWorker, type: :worker, feature_categor
allow_any_instance_of(Zip::File).to receive(:glob).and_return([])
end
- it_behaves_like 'handling the metadata error', exception_class: ::Packages::Nuget::MetadataExtractionService::ExtractionError
+ it_behaves_like 'handling the metadata error', exception_class: ::Packages::Nuget::ExtractMetadataFileService::ExtractionError
end
context 'with package with an invalid package name' do
diff --git a/spec/workers/pipeline_schedule_worker_spec.rb b/spec/workers/pipeline_schedule_worker_spec.rb
index da6a0254a17..48138034c33 100644
--- a/spec/workers/pipeline_schedule_worker_spec.rb
+++ b/spec/workers/pipeline_schedule_worker_spec.rb
@@ -77,8 +77,18 @@ RSpec.describe PipelineScheduleWorker, :sidekiq_inline, feature_category: :conti
stub_ci_pipeline_yaml_file(YAML.dump(rspec: { variables: 'rspec' } ))
end
- it 'does not creates a new pipeline' do
- expect { subject }.not_to change { project.ci_pipelines.count }
+ it 'creates a new pipeline' do
+ expect { subject }.to change { project.ci_pipelines.count }.by(1)
+ end
+
+ context 'with feature flag persist_failed_pipelines_from_schedules disabled' do
+ before do
+ stub_feature_flags(persist_failed_pipelines_from_schedules: false)
+ end
+
+ it 'does not create a new pipeline' do
+ expect { subject }.not_to change { project.ci_pipelines.count }
+ end
end
end
end
diff --git a/spec/workers/redis_migration_worker_spec.rb b/spec/workers/redis_migration_worker_spec.rb
new file mode 100644
index 00000000000..ad0186e929d
--- /dev/null
+++ b/spec/workers/redis_migration_worker_spec.rb
@@ -0,0 +1,73 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe RedisMigrationWorker, :clean_gitlab_redis_shared_state, feature_category: :redis do
+ describe '.fetch_migrator!' do
+ it 'raise error if class does not exist' do
+ expect { described_class.fetch_migrator!('UnknownClass') }.to raise_error(NotImplementedError)
+ end
+
+ context 'when class exists' do
+ it 'returns an instance' do
+ expect(
+ described_class.fetch_migrator!('BackfillProjectPipelineStatusTtl')
+ ).to be_a Gitlab::BackgroundMigration::Redis::BackfillProjectPipelineStatusTtl
+ end
+ end
+ end
+
+ describe '#perform' do
+ let(:job_class_name) { 'SampleJob' }
+ let(:migrator_class) do
+ Class.new do
+ def perform(keys)
+ keys.each { |key| redis.set(key, "adjusted", ex: 10) }
+ end
+
+ def scan_match_pattern
+ 'sample:*:pattern'
+ end
+
+ def redis
+ ::Redis.new(::Gitlab::Redis::Cache.params)
+ end
+ end
+ end
+
+ let(:migrator) { migrator_class.new }
+
+ before do
+ allow(described_class).to receive(:fetch_migrator!).with(job_class_name).and_return(migrator)
+
+ 100.times do |i|
+ migrator.redis.set("sample:#{i}:pattern", i)
+ end
+ end
+
+ it 'runs migration logic on scanned keys' do
+ expect(migrator).to receive(:perform)
+
+ subject.perform(job_class_name, '0')
+ end
+
+ context 'when job exceeds deadline' do
+ before do
+ # stub Time.now to force the 3rd invocation to timeout
+ now = Time.now # rubocop:disable Rails/TimeZone
+ allow(Time).to receive(:now).and_return(now, now, now + 5.minutes)
+ end
+
+ it 'enqueues another job and returns' do
+ expect(described_class).to receive(:perform_async)
+
+ # use smaller scan_size to ensure multiple scans are required
+ subject.perform(job_class_name, '0', { scan_size: 10 })
+ end
+ end
+
+ it_behaves_like 'an idempotent worker' do
+ let(:job_args) { [job_class_name, '0'] }
+ end
+ end
+end
diff --git a/spec/workers/run_pipeline_schedule_worker_spec.rb b/spec/workers/run_pipeline_schedule_worker_spec.rb
index d0e4de1aa98..4b46ca1e125 100644
--- a/spec/workers/run_pipeline_schedule_worker_spec.rb
+++ b/spec/workers/run_pipeline_schedule_worker_spec.rb
@@ -61,7 +61,7 @@ RSpec.describe RunPipelineScheduleWorker, feature_category: :continuous_integrat
before do
expect(Ci::CreatePipelineService).to receive(:new).with(project, user, ref: pipeline_schedule.ref).and_return(create_pipeline_service)
- expect(create_pipeline_service).to receive(:execute).with(:schedule, ignore_skip_ci: true, save_on_errors: false, schedule: pipeline_schedule).and_return(service_response)
+ expect(create_pipeline_service).to receive(:execute).with(:schedule, ignore_skip_ci: true, save_on_errors: true, schedule: pipeline_schedule).and_return(service_response)
end
context "when pipeline is persisted" do
@@ -124,7 +124,26 @@ RSpec.describe RunPipelineScheduleWorker, feature_category: :continuous_integrat
it 'creates a pipeline' do
expect(Ci::CreatePipelineService).to receive(:new).with(project, user, ref: pipeline_schedule.ref).and_return(create_pipeline_service)
- expect(create_pipeline_service).to receive(:execute).with(:schedule, ignore_skip_ci: true, save_on_errors: false, schedule: pipeline_schedule).and_return(service_response)
+ expect(create_pipeline_service).to receive(:execute).with(:schedule, ignore_skip_ci: true, save_on_errors: true, schedule: pipeline_schedule).and_return(service_response)
+
+ worker.perform(pipeline_schedule.id, user.id)
+ end
+ end
+
+ context 'with feature flag persist_failed_pipelines_from_schedules disabled' do
+ before do
+ stub_feature_flags(persist_failed_pipelines_from_schedules: false)
+ end
+
+ it 'does not save_on_errors' do
+ expect(Ci::CreatePipelineService).to receive(:new).with(project, user, ref: pipeline_schedule.ref).and_return(create_pipeline_service)
+
+ expect(create_pipeline_service).to receive(:execute).with(
+ :schedule,
+ ignore_skip_ci: true,
+ save_on_errors: false,
+ schedule: pipeline_schedule
+ )
worker.perform(pipeline_schedule.id, user.id)
end
diff --git a/tooling/bin/find_only_allowed_files_changes b/tooling/bin/find_only_allowed_files_changes
index c40048c66fa..1e903a4199f 100755
--- a/tooling/bin/find_only_allowed_files_changes
+++ b/tooling/bin/find_only_allowed_files_changes
@@ -3,6 +3,8 @@
require_relative '../lib/tooling/find_changes'
+ALLOWED_FILE_TYPES = ['.js', '.vue', '.md', '.scss'].freeze
+
if Tooling::FindChanges.new(from: :api).only_allowed_files_changed
puts "Only files with extensions #{ALLOWED_FILE_TYPES.join(', ')} were changed"
exit 0
diff --git a/tooling/bin/gettext_extractor b/tooling/bin/gettext_extractor
index 39f029616df..c430e89a9d3 100755
--- a/tooling/bin/gettext_extractor
+++ b/tooling/bin/gettext_extractor
@@ -4,6 +4,7 @@
require_relative '../lib/tooling/gettext_extractor'
pot_file = ARGV.shift
+silent = '--silent' in ARGV
if !pot_file || !Dir.exist?(File.dirname(pot_file))
abort <<~MSG
@@ -12,9 +13,11 @@ if !pot_file || !Dir.exist?(File.dirname(pot_file))
MSG
end
-puts <<~MSG
- Extracting translatable strings from source files...
-MSG
+unless silent
+ puts <<~MSG
+ Extracting translatable strings from source files...
+ MSG
+end
root_dir = File.expand_path('../../', __dir__)
@@ -24,6 +27,8 @@ extractor = Tooling::GettextExtractor.new(
File.write(pot_file, extractor.generate_pot)
-puts <<~MSG
- All done. Please commit the changes to `#{pot_file}`.
-MSG
+unless silent
+ puts <<~MSG
+ All done. Please commit the changes to `#{pot_file}`.
+ MSG
+end
diff --git a/tooling/danger/analytics_instrumentation.rb b/tooling/danger/analytics_instrumentation.rb
index 767ae8dfb4c..69cc30f51fb 100644
--- a/tooling/danger/analytics_instrumentation.rb
+++ b/tooling/danger/analytics_instrumentation.rb
@@ -77,7 +77,7 @@ module Tooling
def metric_scope_affected
select_models(helper.modified_files).each_with_object(Hash.new { |h, k| h[k] = [] }) do |file_name, matched_files|
helper.changed_lines(file_name).each do |mod_line, _i|
- next unless mod_line =~ /^\+\s+scope :\w+/
+ next unless /^\+\s+scope :\w+/.match?(mod_line)
affected_scope = mod_line.match(/:\w+/)
next if affected_scope.nil?
diff --git a/tooling/danger/config_files.rb b/tooling/danger/config_files.rb
index e165792471f..1b09da6c8c9 100644
--- a/tooling/danger/config_files.rb
+++ b/tooling/danger/config_files.rb
@@ -8,7 +8,7 @@ module Tooling
module ConfigFiles
include ::Tooling::Danger::Suggestor
- MISSING_INTRODUCED_BY_REGEX = /^\+?(?<attr_name>\s*introduced_by_url):\s*$/.freeze
+ MISSING_INTRODUCED_BY_REGEX = /^\+?(?<attr_name>\s*introduced_by_url):\s*$/
CONFIG_DIRS = %w[
config/feature_flags
diff --git a/tooling/danger/customer_success.rb b/tooling/danger/customer_success.rb
index 43bdeadd8a4..22911adee06 100644
--- a/tooling/danger/customer_success.rb
+++ b/tooling/danger/customer_success.rb
@@ -11,8 +11,8 @@ module Tooling
The following files require a review:
MSG
- FILE_PATH_REGEX = %r{((ee|jh)/)?config/metrics/.+\.yml}.freeze
- CATEGORY_CHANGED = /data_category: operational/i.freeze
+ FILE_PATH_REGEX = %r{((ee|jh)/)?config/metrics/.+\.yml}
+ CATEGORY_CHANGED = /data_category: operational/i
def build_message
return unless impacted?
diff --git a/tooling/danger/database_dictionary.rb b/tooling/danger/database_dictionary.rb
index 8776532ff84..2ea937efd73 100644
--- a/tooling/danger/database_dictionary.rb
+++ b/tooling/danger/database_dictionary.rb
@@ -14,7 +14,7 @@ module Tooling
def database_dictionary_files(change_type:)
files = helper.public_send("#{change_type}_files") # rubocop:disable GitlabSecurity/PublicSend
- files.filter_map { |path| Found.new(path) if path =~ DICTIONARY_PATH_REGEXP }
+ files.filter_map { |path| Found.new(path) if DICTIONARY_PATH_REGEXP.match?(path) }
end
class Found
diff --git a/tooling/danger/datateam.rb b/tooling/danger/datateam.rb
index dfa8e1549ef..86e413e55b6 100644
--- a/tooling/danger/datateam.rb
+++ b/tooling/danger/datateam.rb
@@ -13,10 +13,10 @@ module Tooling
MSG
DATA_WAREHOUSE_SCOPE = 'Data Warehouse::'
- FILE_PATH_REGEX = %r{((ee|jh)/)?config/metrics(/.+\.yml)}.freeze
- PERFORMANCE_INDICATOR_REGEX = %r{gmau|smau|paid_gmau|umau}.freeze
- METRIC_REMOVED = %r{\+status: removed}.freeze
- DATABASE_REGEX = %r{\Adb/structure\.sql}.freeze
+ FILE_PATH_REGEX = %r{((ee|jh)/)?config/metrics(/.+\.yml)}
+ PERFORMANCE_INDICATOR_REGEX = %r{gmau|smau|paid_gmau|umau}
+ METRIC_REMOVED = %r{\+status: removed}
+ DATABASE_REGEX = %r{\Adb/structure\.sql}
STRUCTURE_SQL_FILE = %w(db/structure.sql).freeze
def build_message
diff --git a/tooling/danger/experiments.rb b/tooling/danger/experiments.rb
new file mode 100644
index 00000000000..49489419bab
--- /dev/null
+++ b/tooling/danger/experiments.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+module Tooling
+ module Danger
+ module Experiments
+ EXPERIMENTS_YML_REGEX = %r{\A(ee/)?config/feature_flags/experiment/}
+ CLASS_FILES_DIR = %w[app/experiments/ ee/app/experiments/].freeze
+
+ def class_files_removed?
+ (removed_experiments & current_experiments_with_class_files).empty?
+ end
+
+ def removed_experiments
+ yml_files_paths = helper.deleted_files
+
+ yml_files_paths.select { |path| path =~ EXPERIMENTS_YML_REGEX }.map { |path| File.basename(path).chomp('.yml') }
+ end
+
+ private
+
+ def current_experiments_with_class_files
+ experiment_names = []
+
+ CLASS_FILES_DIR.each do |directory_path|
+ experiment_names += Dir.glob("#{directory_path}*.rb").map do |path|
+ File.basename(path).chomp('_experiment.rb')
+ end
+ end
+
+ experiment_names
+ end
+ end
+ end
+end
diff --git a/tooling/danger/project_helper.rb b/tooling/danger/project_helper.rb
index 9ab6c5fa32e..f7c8f4f5133 100644
--- a/tooling/danger/project_helper.rb
+++ b/tooling/danger/project_helper.rb
@@ -70,6 +70,7 @@ module Tooling
%r{\A((ee|jh)/)?app/assets/} => :frontend,
%r{\A((ee|jh)/)?app/views/.*\.svg} => :frontend,
%r{\A((ee|jh)/)?app/views/} => [:frontend, :backend],
+ %r{\A((ee|jh)/)?app/components/} => [:frontend, :backend],
%r{\A((ee|jh)/)?public/} => :frontend,
%r{\A((ee|jh)/)?spec/(javascripts|frontend|frontend_integration)/} => :frontend,
%r{\A((ee|jh)/)?spec/contracts/consumer} => :frontend,
@@ -112,10 +113,12 @@ module Tooling
%r{\A\.editorconfig\z} => :tooling,
%r{Dangerfile\z} => :tooling,
%r{\A((ee|jh)/)?(danger/|tooling/danger/)} => :tooling,
+ %r{\Agems/gem\.gitlab-ci\.yml\z} => :tooling,
+ %r{\Agems/config/} => :tooling,
%r{\A((ee|jh)/)?scripts/(lib/)?glfm/.*\.rb} => [:backend],
%r{\A((ee|jh)/)?scripts/(lib/)?glfm/.*\.js} => [:frontend],
- %r{\A((ee|jh)/)?scripts/remote_development/.*} => [:remote_development],
+ %r{\A((ee|jh)/)?scripts/remote_development/.*} => [:remote_development_be],
%r{\A((ee|jh)/)?scripts/.*\.rb} => [:backend, :tooling],
%r{\A((ee|jh)/)?scripts/.*\.js} => [:frontend, :tooling],
%r{\A((ee|jh)/)?scripts/} => :tooling,
@@ -161,6 +164,7 @@ module Tooling
%r{\A(Gemfile.*|Rakefile)\z} => :backend,
%r{\A[A-Z_]+_VERSION\z} => :backend,
%r{\A\.rubocop(_todo)?\.yml\z} => :backend,
+ %r{\Agems/.*/\.rubocop\.yml\z} => :backend,
%r{\A\.rubocop_todo/.*\.yml\z} => :backend,
%r{\Afile_hooks/} => :backend,
diff --git a/tooling/danger/specs/feature_category_suggestion.rb b/tooling/danger/specs/feature_category_suggestion.rb
index 5acf73c8956..00cb99f368b 100644
--- a/tooling/danger/specs/feature_category_suggestion.rb
+++ b/tooling/danger/specs/feature_category_suggestion.rb
@@ -18,7 +18,7 @@ module Tooling
changed_lines = helper.changed_lines(filename)
changed_lines.each do |changed_line|
- next unless changed_line =~ RSPEC_TOP_LEVEL_DESCRIBE_REGEX
+ next unless RSPEC_TOP_LEVEL_DESCRIBE_REGEX.match?(changed_line)
line_number = file_lines.find_index(changed_line.delete_prefix('+'))
next unless line_number
diff --git a/tooling/danger/stable_branch.rb b/tooling/danger/stable_branch.rb
index bba198d1310..efcd3cfc967 100644
--- a/tooling/danger/stable_branch.rb
+++ b/tooling/danger/stable_branch.rb
@@ -5,7 +5,7 @@ module Tooling
module StableBranch
VersionApiError = Class.new(StandardError)
- STABLE_BRANCH_REGEX = %r{\A(?<version>\d+-\d+)-stable-ee\z}.freeze
+ STABLE_BRANCH_REGEX = %r{\A(?<version>\d+-\d+)-stable-ee\z}
FAILING_PACKAGE_AND_TEST_STATUSES = %w[manual canceled].freeze
# rubocop:disable Lint/MixedRegexpCaptureTypes
@@ -16,7 +16,7 @@ module Tooling
(-(?<rc>rc(?<rc_number>\d*)))?
(-\h+\.\h+)?
(-ee|\.ee\.\d+)?\z
- }x.freeze
+ }x
# rubocop:enable Lint/MixedRegexpCaptureTypes
MAINTENANCE_POLICY_URL = 'https://docs.gitlab.com/ee/policy/maintenance.html'
diff --git a/tooling/lib/tooling/kubernetes_client.rb b/tooling/lib/tooling/kubernetes_client.rb
index 5579f130a84..276a7e64473 100644
--- a/tooling/lib/tooling/kubernetes_client.rb
+++ b/tooling/lib/tooling/kubernetes_client.rb
@@ -6,7 +6,7 @@ require_relative '../../../lib/gitlab/popen' unless defined?(Gitlab::Popen)
module Tooling
class KubernetesClient
- K8S_ALLOWED_NAMESPACES_REGEX = /^review-(?!apps).+/.freeze
+ K8S_ALLOWED_NAMESPACES_REGEX = /^review-(?!apps).+/
CommandFailedError = Class.new(StandardError)
def cleanup_namespaces_by_created_at(created_before:)
diff --git a/tooling/lib/tooling/mappings/view_to_js_mappings.rb b/tooling/lib/tooling/mappings/view_to_js_mappings.rb
index b78c354f9d2..56168592f0d 100644
--- a/tooling/lib/tooling/mappings/view_to_js_mappings.rb
+++ b/tooling/lib/tooling/mappings/view_to_js_mappings.rb
@@ -10,10 +10,10 @@ module Tooling
include Helpers::PredictiveTestsHelper
# The HTML attribute value pattern we're looking for to match an HTML file to a JS file.
- HTML_ATTRIBUTE_VALUE_REGEXP = /js-[-\w]+/.freeze
+ HTML_ATTRIBUTE_VALUE_REGEXP = /js-[-\w]+/
# Search for Rails partials included in an HTML file
- RAILS_PARTIAL_INVOCATION_REGEXP = %r{(?:render|render_if_exists)(?: |\()(?:partial: ?)?['"]([\w/-]+)['"]}.freeze
+ RAILS_PARTIAL_INVOCATION_REGEXP = %r{(?:render|render_if_exists)(?: |\()(?:partial: ?)?['"]([\w/-]+)['"]}
def initialize(
changed_files_pathname, predictive_tests_pathname,
diff --git a/tooling/rspec_flaky/config.rb b/tooling/rspec_flaky/config.rb
deleted file mode 100644
index 0e36e985aad..00000000000
--- a/tooling/rspec_flaky/config.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-module RspecFlaky
- class Config
- def self.generate_report?
- !!(ENV['FLAKY_RSPEC_GENERATE_REPORT'] =~ /1|true/)
- end
-
- def self.suite_flaky_examples_report_path
- ENV['FLAKY_RSPEC_SUITE_REPORT_PATH'] || rails_path("rspec/flaky/suite-report.json")
- end
-
- def self.flaky_examples_report_path
- ENV['FLAKY_RSPEC_REPORT_PATH'] || rails_path("rspec/flaky/report.json")
- end
-
- def self.new_flaky_examples_report_path
- ENV['NEW_FLAKY_RSPEC_REPORT_PATH'] || rails_path("rspec/flaky/new-report.json")
- end
-
- def self.rails_path(path)
- return path unless defined?(Rails)
-
- Rails.root.join(path)
- end
- end
-end
diff --git a/tooling/rspec_flaky/example.rb b/tooling/rspec_flaky/example.rb
deleted file mode 100644
index 8f369c99c5b..00000000000
--- a/tooling/rspec_flaky/example.rb
+++ /dev/null
@@ -1,68 +0,0 @@
-# frozen_string_literal: true
-
-require 'forwardable'
-require 'digest'
-
-module RspecFlaky
- # This is a wrapper class for RSpec::Core::Example
- class Example
- extend Forwardable
-
- def_delegators :execution_result, :status, :exception
-
- def initialize(rspec_example)
- @rspec_example = rspec_example.respond_to?(:example) ? rspec_example.example : rspec_example
- end
-
- def uid
- @uid ||= Digest::MD5.hexdigest("#{description}-#{file}")
- end
-
- def example_id
- rspec_example.id
- end
-
- def file
- metadata[:file_path]
- end
-
- def line
- metadata[:line_number]
- end
-
- def description
- metadata[:full_description]
- end
-
- def attempts
- rspec_example.respond_to?(:attempts) ? rspec_example.attempts : 1
- end
-
- def feature_category
- metadata[:feature_category]
- end
-
- def to_h
- {
- example_id: example_id,
- file: file,
- line: line,
- description: description,
- last_attempts_count: attempts,
- feature_category: feature_category
- }
- end
-
- private
-
- attr_reader :rspec_example
-
- def metadata
- rspec_example.metadata
- end
-
- def execution_result
- rspec_example.execution_result
- end
- end
-end
diff --git a/tooling/rspec_flaky/flaky_example.rb b/tooling/rspec_flaky/flaky_example.rb
deleted file mode 100644
index 3ce48ce1cd3..00000000000
--- a/tooling/rspec_flaky/flaky_example.rb
+++ /dev/null
@@ -1,59 +0,0 @@
-# frozen_string_literal: true
-
-require 'ostruct'
-
-module RspecFlaky
- ALLOWED_ATTRIBUTES = %i[
- example_id
- file
- line
- description
- first_flaky_at
- last_flaky_at
- last_flaky_job
- last_attempts_count
- flaky_reports
- feature_category
- ].freeze
-
- # This represents a flaky RSpec example and is mainly meant to be saved in a JSON file
- class FlakyExample
- def initialize(example_hash)
- @attributes = {
- first_flaky_at: Time.now,
- last_flaky_at: Time.now,
- last_flaky_job: nil,
- last_attempts_count: example_hash[:attempts],
- flaky_reports: 0,
- feature_category: example_hash[:feature_category]
- }.merge(example_hash.slice(*ALLOWED_ATTRIBUTES))
-
- %i[first_flaky_at last_flaky_at].each do |attr|
- attributes[attr] = Time.parse(attributes[attr]) if attributes[attr].is_a?(String)
- end
- end
-
- def update!(example_hash)
- attributes[:file] = example_hash[:file]
- attributes[:line] = example_hash[:line]
- attributes[:description] = example_hash[:description]
- attributes[:first_flaky_at] ||= Time.now
- attributes[:last_flaky_at] = Time.now
- attributes[:flaky_reports] += 1
- attributes[:feature_category] = example_hash[:feature_category]
- attributes[:last_attempts_count] = example_hash[:last_attempts_count] if example_hash[:last_attempts_count]
-
- if ENV['CI_JOB_URL']
- attributes[:last_flaky_job] = "#{ENV['CI_JOB_URL']}"
- end
- end
-
- def to_h
- attributes.dup
- end
-
- private
-
- attr_reader :attributes
- end
-end
diff --git a/tooling/rspec_flaky/flaky_examples_collection.rb b/tooling/rspec_flaky/flaky_examples_collection.rb
deleted file mode 100644
index 019ebf703da..00000000000
--- a/tooling/rspec_flaky/flaky_examples_collection.rb
+++ /dev/null
@@ -1,38 +0,0 @@
-# frozen_string_literal: true
-
-require 'active_support/hash_with_indifferent_access'
-require 'delegate'
-
-require_relative 'flaky_example'
-
-module RspecFlaky
- class FlakyExamplesCollection < SimpleDelegator
- def initialize(collection = {})
- unless collection.is_a?(Hash)
- raise ArgumentError, "`collection` must be a Hash, #{collection.class} given!"
- end
-
- collection_of_flaky_examples =
- collection.map do |uid, example|
- [
- uid,
- RspecFlaky::FlakyExample.new(example.to_h.symbolize_keys)
- ]
- end
-
- super(Hash[collection_of_flaky_examples])
- end
-
- def to_h
- transform_values { |example| example.to_h }.deep_symbolize_keys
- end
-
- def -(other)
- unless other.respond_to?(:key)
- raise ArgumentError, "`other` must respond to `#key?`, #{other.class} does not!"
- end
-
- self.class.new(reject { |uid, _| other.key?(uid) })
- end
- end
-end
diff --git a/tooling/rspec_flaky/listener.rb b/tooling/rspec_flaky/listener.rb
deleted file mode 100644
index 3431d814a8a..00000000000
--- a/tooling/rspec_flaky/listener.rb
+++ /dev/null
@@ -1,70 +0,0 @@
-# frozen_string_literal: true
-
-require 'json'
-
-require_relative 'config'
-require_relative 'example'
-require_relative 'flaky_example'
-require_relative 'flaky_examples_collection'
-require_relative 'report'
-
-module RspecFlaky
- class Listener
- # - suite_flaky_examples: contains all the currently tracked flacky example
- # for the whole RSpec suite
- # - flaky_examples: contains the examples detected as flaky during the
- # current RSpec run
- attr_reader :suite_flaky_examples, :flaky_examples
-
- def initialize(suite_flaky_examples_json = nil)
- @flaky_examples = RspecFlaky::FlakyExamplesCollection.new
- @suite_flaky_examples = init_suite_flaky_examples(suite_flaky_examples_json)
- end
-
- def example_passed(notification)
- current_example = RspecFlaky::Example.new(notification.example)
-
- return unless current_example.attempts > 1
-
- flaky_example = suite_flaky_examples.fetch(current_example.uid) { RspecFlaky::FlakyExample.new(current_example.to_h) }
- flaky_example.update!(current_example.to_h)
-
- flaky_examples[current_example.uid] = flaky_example
- end
-
- def dump_summary(_)
- RspecFlaky::Report.new(flaky_examples).write(RspecFlaky::Config.flaky_examples_report_path)
- # write_report_file(flaky_examples, RspecFlaky::Config.flaky_examples_report_path)
-
- if new_flaky_examples.any?
- rails_logger_warn("\nNew flaky examples detected:\n")
- rails_logger_warn(JSON.pretty_generate(new_flaky_examples.to_h)) # rubocop:disable Gitlab/Json
-
- RspecFlaky::Report.new(new_flaky_examples).write(RspecFlaky::Config.new_flaky_examples_report_path)
- # write_report_file(new_flaky_examples, RspecFlaky::Config.new_flaky_examples_report_path)
- end
- end
-
- private
-
- def new_flaky_examples
- @new_flaky_examples ||= flaky_examples - suite_flaky_examples
- end
-
- def init_suite_flaky_examples(suite_flaky_examples_json = nil)
- if suite_flaky_examples_json
- RspecFlaky::Report.load_json(suite_flaky_examples_json).flaky_examples
- else
- return {} unless File.exist?(RspecFlaky::Config.suite_flaky_examples_report_path)
-
- RspecFlaky::Report.load(RspecFlaky::Config.suite_flaky_examples_report_path).flaky_examples
- end
- end
-
- def rails_logger_warn(text)
- target = defined?(Rails) ? Rails.logger : Kernel
-
- target.warn(text)
- end
- end
-end
diff --git a/tooling/rspec_flaky/report.rb b/tooling/rspec_flaky/report.rb
deleted file mode 100644
index 17dbb277446..00000000000
--- a/tooling/rspec_flaky/report.rb
+++ /dev/null
@@ -1,57 +0,0 @@
-# frozen_string_literal: true
-
-require 'json'
-require 'time'
-
-require_relative 'config'
-require_relative 'flaky_examples_collection'
-
-module RspecFlaky
- # This class is responsible for loading/saving JSON reports, and pruning
- # outdated examples.
- class Report < SimpleDelegator
- OUTDATED_DAYS_THRESHOLD = 7
-
- attr_reader :flaky_examples
-
- def self.load(file_path)
- load_json(File.read(file_path))
- end
-
- def self.load_json(json)
- new(RspecFlaky::FlakyExamplesCollection.new(JSON.parse(json)))
- end
-
- def initialize(flaky_examples)
- unless flaky_examples.is_a?(RspecFlaky::FlakyExamplesCollection)
- raise ArgumentError, "`flaky_examples` must be a RspecFlaky::FlakyExamplesCollection, #{flaky_examples.class} given!"
- end
-
- @flaky_examples = flaky_examples
- super(flaky_examples)
- end
-
- def write(file_path)
- unless RspecFlaky::Config.generate_report?
- Kernel.warn "! Generating reports is disabled. To enable it, please set the `FLAKY_RSPEC_GENERATE_REPORT=1` !"
- return
- end
-
- report_path_dir = File.dirname(file_path)
- FileUtils.mkdir_p(report_path_dir) unless Dir.exist?(report_path_dir)
-
- File.write(file_path, JSON.pretty_generate(flaky_examples.to_h))
- end
-
- def prune_outdated(days: OUTDATED_DAYS_THRESHOLD)
- outdated_date_threshold = Time.now - (3600 * 24 * days)
- recent_flaky_examples = flaky_examples.dup
- .delete_if do |_uid, flaky_example|
- last_flaky_at = flaky_example.to_h[:last_flaky_at]
- last_flaky_at && last_flaky_at.to_i < outdated_date_threshold.to_i
- end
-
- self.class.new(RspecFlaky::FlakyExamplesCollection.new(recent_flaky_examples))
- end
- end
-end
diff --git a/vendor/gems/attr_encrypted/.gitlab-ci.yml b/vendor/gems/attr_encrypted/.gitlab-ci.yml
index 7d954de43a0..c285eef6e64 100644
--- a/vendor/gems/attr_encrypted/.gitlab-ci.yml
+++ b/vendor/gems/attr_encrypted/.gitlab-ci.yml
@@ -1,26 +1,12 @@
-workflow:
- rules:
- - if: $CI_MERGE_REQUEST_ID
-
-default:
- image: "ruby:${RUBY_VERSION}"
+include:
+ - local: gems/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "attr_encrypted"
+ gem_path_prefix: "vendor/gems/"
rspec:
- cache:
- key: attr_encrypted-ruby
- paths:
- - vendor/gems/attr_encrypted/vendor/ruby
- before_script:
- - cd vendor/gems/attr_encrypted
- - ruby -v # Print out ruby version for debugging
- - gem install bundler --no-document # Bundler is not installed with the image
- - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby
- - bundle config set with 'development' # This is set to 'deployment' otherwise
- - bundle config set --local frozen 'true' # Disallow Gemfile.lock changes on CI
- - bundle config # Show bundler configuration
- - bundle install -j $(nproc)
script:
- bundle exec rake test
parallel:
matrix:
- - RUBY_VERSION: ["2.7", "3.0", "3.1"]
+ - RUBY_VERSION: ["3.0", "3.1"] # 3.2 isn't supported yet
diff --git a/vendor/gems/attr_encrypted/Gemfile.lock b/vendor/gems/attr_encrypted/Gemfile.lock
index 1094e6da3fc..ac362d2625e 100644
--- a/vendor/gems/attr_encrypted/Gemfile.lock
+++ b/vendor/gems/attr_encrypted/Gemfile.lock
@@ -7,30 +7,29 @@ PATH
GEM
remote: https://rubygems.org/
specs:
- actionpack (6.1.7)
- actionview (= 6.1.7)
- activesupport (= 6.1.7)
- rack (~> 2.0, >= 2.0.9)
+ actionpack (7.0.6)
+ actionview (= 7.0.6)
+ activesupport (= 7.0.6)
+ rack (~> 2.0, >= 2.2.4)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.2.0)
- actionview (6.1.7)
- activesupport (= 6.1.7)
+ actionview (7.0.6)
+ activesupport (= 7.0.6)
builder (~> 3.1)
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.1, >= 1.2.0)
- activemodel (6.1.7)
- activesupport (= 6.1.7)
- activerecord (6.1.7)
- activemodel (= 6.1.7)
- activesupport (= 6.1.7)
- activesupport (6.1.7)
+ activemodel (7.0.6)
+ activesupport (= 7.0.6)
+ activerecord (7.0.6)
+ activemodel (= 7.0.6)
+ activesupport (= 7.0.6)
+ activesupport (7.0.6)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 1.6, < 2)
minitest (>= 5.1)
tzinfo (~> 2.0)
- zeitwerk (~> 2.3)
addressable (2.8.1)
public_suffix (>= 2.0.2, < 6.0)
bcrypt (3.1.18)
@@ -91,31 +90,31 @@ GEM
data_objects (= 0.10.17)
docile (1.4.0)
encryptor (3.0.0)
- erubi (1.11.0)
+ erubi (1.12.0)
fastercsv (1.5.5)
i18n (1.12.0)
concurrent-ruby (~> 1.0)
json (1.8.6)
json_pure (1.8.6)
- loofah (2.19.0)
+ loofah (2.19.1)
crass (~> 1.0.2)
nokogiri (>= 1.5.9)
mini_portile2 (2.8.0)
minitest (5.16.3)
multi_json (1.15.0)
- nokogiri (1.13.8)
+ nokogiri (1.14.0)
mini_portile2 (~> 2.8.0)
racc (~> 1.4)
public_suffix (5.0.0)
- racc (1.6.0)
- rack (2.2.4)
+ racc (1.6.2)
+ rack (2.2.6.2)
rack-test (2.0.2)
rack (>= 1.3)
rails-dom-testing (2.0.3)
activesupport (>= 4.2.0)
nokogiri (>= 1.6)
- rails-html-sanitizer (1.4.3)
- loofah (~> 2.3)
+ rails-html-sanitizer (1.5.0)
+ loofah (~> 2.19, >= 2.19.1)
rake (13.0.6)
sequel (5.60.1)
simplecov (0.21.2)
@@ -132,14 +131,13 @@ GEM
tzinfo (2.0.5)
concurrent-ruby (~> 1.0)
uuidtools (2.2.0)
- zeitwerk (2.6.1)
PLATFORMS
ruby
DEPENDENCIES
- actionpack (~> 6.1)
- activerecord (~> 6.1)
+ actionpack (~> 7.0.6)
+ activerecord (~> 7.0.6)
attr_encrypted!
codeclimate-test-reporter (<= 0.6.0)
datamapper
diff --git a/vendor/gems/attr_encrypted/attr_encrypted.gemspec b/vendor/gems/attr_encrypted/attr_encrypted.gemspec
index b6a39bddd2c..026fe84034d 100644
--- a/vendor/gems/attr_encrypted/attr_encrypted.gemspec
+++ b/vendor/gems/attr_encrypted/attr_encrypted.gemspec
@@ -31,7 +31,7 @@ Forked from https://github.com/attr-encrypted/attr_encrypted."
s.add_dependency('encryptor', ['~> 3.0.0'])
- activerecord_version = "~> 6.1"
+ activerecord_version = "~> 7.0.6"
s.add_development_dependency('activerecord', activerecord_version)
s.add_development_dependency('actionpack', activerecord_version)
s.add_development_dependency('datamapper')
diff --git a/vendor/gems/bundler-checksum/.gitlab-ci.yml b/vendor/gems/bundler-checksum/.gitlab-ci.yml
index 2de1c5e982c..0ec9a5d94f1 100644
--- a/vendor/gems/bundler-checksum/.gitlab-ci.yml
+++ b/vendor/gems/bundler-checksum/.gitlab-ci.yml
@@ -1,24 +1,10 @@
-workflow:
- rules:
- - if: $CI_MERGE_REQUEST_ID
+include:
+ - local: gems/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "bundler-checksum"
+ gem_path_prefix: "vendor/gems/"
rspec:
- image: "ruby:${RUBY_VERSION}"
- cache:
- key: bundler-checksum
- paths:
- - vendor/gems/bundler-checksum/vendor/ruby
- before_script:
- - cd vendor/gems/bundler-checksum
- - ruby -v # Print out ruby version for debugging
- - gem install bundler --no-document # Bundler is not installed with the image
- - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby
- - bundle config set with 'development'
- - bundle config set --local frozen 'true' # Disallow Gemfile.lock changes on CI
- - bundle config # Show bundler configuration
- - bundle install -j $(nproc)
+ extends: .ruby_matrix
script:
- pushd test/project_with_checksum_lock && scripts/test
- parallel:
- matrix:
- - RUBY_VERSION: ["2.7", "3.0", "3.1", "3.2"]
diff --git a/vendor/gems/cloud_profiler_agent/.gitlab-ci.yml b/vendor/gems/cloud_profiler_agent/.gitlab-ci.yml
index 9e508d920e8..aa4638486e5 100644
--- a/vendor/gems/cloud_profiler_agent/.gitlab-ci.yml
+++ b/vendor/gems/cloud_profiler_agent/.gitlab-ci.yml
@@ -1,32 +1,5 @@
-workflow:
- rules:
- - if: $CI_MERGE_REQUEST_ID
-
-.rspec:
- cache:
- key: cloud_profiler_agent-ruby-${RUBY_VERSION}
- paths:
- - vendor/gems/cloud_profiler_agent/vendor/ruby
- before_script:
- - cd vendor/gems/cloud_profiler_agent
- - ruby -v # Print out ruby version for debugging
- - gem install bundler --no-document # Bundler is not installed with the image
- - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby
- - bundle config set with 'development'
- - bundle config set --local frozen 'true' # Disallow Gemfile.lock changes on CI
- - bundle config # Show bundler configuration
- - bundle install -j $(nproc)
- script:
- - bundle exec rspec
-
-rspec-3.0:
- image: "ruby:3.0"
- extends: .rspec
-
-rspec-3.1:
- image: "ruby:3.1"
- extends: .rspec
-
-rspec-3.2:
- image: "ruby:3.2"
- extends: .rspec
+include:
+ - local: gems/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "cloud_profiler_agent"
+ gem_path_prefix: "vendor/gems/"
diff --git a/vendor/gems/devise-pbkdf2-encryptable/.gitlab-ci.yml b/vendor/gems/devise-pbkdf2-encryptable/.gitlab-ci.yml
index ed5e27f5a8c..c8698943ca9 100644
--- a/vendor/gems/devise-pbkdf2-encryptable/.gitlab-ci.yml
+++ b/vendor/gems/devise-pbkdf2-encryptable/.gitlab-ci.yml
@@ -1,28 +1,5 @@
-workflow:
- rules:
- - if: $CI_MERGE_REQUEST_ID
-
-.rspec:
- cache:
- key: devise-pbkdf2-encryptable
- paths:
- - vendor/gems/devise-pbkdf2-encryptable/vendor/ruby
- before_script:
- - cd vendor/gems/devise-pbkdf2-encryptable
- - ruby -v # Print out ruby version for debugging
- - gem install bundler --no-document # Bundler is not installed with the image
- - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby
- - bundle config set with 'development'
- - bundle config set --local frozen 'true' # Disallow Gemfile.lock changes on CI
- - bundle config # Show bundler configuration
- - bundle install -j $(nproc)
- script:
- - bundle exec rspec
-
-rspec-2.7:
- image: "ruby:2.7"
- extends: .rspec
-
-rspec-3.0:
- image: "ruby:3.0"
- extends: .rspec
+include:
+ - local: gems/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "devise-pbkdf2-encryptable"
+ gem_path_prefix: "vendor/gems/"
diff --git a/vendor/gems/gitlab_active_record/.gitlab-ci.yml b/vendor/gems/gitlab_active_record/.gitlab-ci.yml
deleted file mode 100644
index a1e883119e8..00000000000
--- a/vendor/gems/gitlab_active_record/.gitlab-ci.yml
+++ /dev/null
@@ -1,28 +0,0 @@
-workflow:
- rules:
- - if: $CI_MERGE_REQUEST_ID
-
-.rspec:
- cache:
- key: gitlab_active_record-ruby
- paths:
- - vendor/gems/gitlab_active_record/vendor/ruby
- before_script:
- - cd vendor/gems/gitlab_active_record
- - ruby -v # Print out ruby version for debugging
- - gem install bundler --no-document # Bundler is not installed with the image
- - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby
- - bundle config set with 'development'
- - bundle config set --local frozen 'true' # Disallow Gemfile.lock changes on CI
- - bundle config # Show bundler configuration
- - bundle install -j $(nproc)
- script:
- - bundle exec rspec
-
-rspec-2.7:
- image: "ruby:2.7"
- extends: .rspec
-
-rspec-3.0:
- image: "ruby:3.0"
- extends: .rspec
diff --git a/vendor/gems/gitlab_active_record/Gemfile b/vendor/gems/gitlab_active_record/Gemfile
deleted file mode 100644
index e694fe26c66..00000000000
--- a/vendor/gems/gitlab_active_record/Gemfile
+++ /dev/null
@@ -1,6 +0,0 @@
-# frozen_string_literal: true
-
-source "https://rubygems.org"
-
-# Specify your gem's dependencies in gitlab_active_record.gemspec
-gemspec
diff --git a/vendor/gems/gitlab_active_record/Gemfile.lock b/vendor/gems/gitlab_active_record/Gemfile.lock
deleted file mode 100644
index 93aecbc7276..00000000000
--- a/vendor/gems/gitlab_active_record/Gemfile.lock
+++ /dev/null
@@ -1,54 +0,0 @@
-PATH
- remote: .
- specs:
- gitlab_active_record (0.1.0)
- activerecord (~> 6.1)
- activesupport (~> 6.1)
-
-GEM
- remote: https://rubygems.org/
- specs:
- activemodel (6.1.7)
- activesupport (= 6.1.7)
- activerecord (6.1.7)
- activemodel (= 6.1.7)
- activesupport (= 6.1.7)
- activesupport (6.1.7)
- concurrent-ruby (~> 1.0, >= 1.0.2)
- i18n (>= 1.6, < 2)
- minitest (>= 5.1)
- tzinfo (~> 2.0)
- zeitwerk (~> 2.3)
- concurrent-ruby (1.1.10)
- diff-lcs (1.5.0)
- i18n (1.12.0)
- concurrent-ruby (~> 1.0)
- minitest (5.16.3)
- rake (13.0.6)
- rspec (3.11.0)
- rspec-core (~> 3.11.0)
- rspec-expectations (~> 3.11.0)
- rspec-mocks (~> 3.11.0)
- rspec-core (3.11.0)
- rspec-support (~> 3.11.0)
- rspec-expectations (3.11.0)
- diff-lcs (>= 1.2.0, < 2.0)
- rspec-support (~> 3.11.0)
- rspec-mocks (3.11.0)
- diff-lcs (>= 1.2.0, < 2.0)
- rspec-support (~> 3.11.0)
- rspec-support (3.11.0)
- tzinfo (2.0.5)
- concurrent-ruby (~> 1.0)
- zeitwerk (2.6.6)
-
-PLATFORMS
- ruby
-
-DEPENDENCIES
- gitlab_active_record!
- rake (~> 13.0)
- rspec (~> 3.0)
-
-BUNDLED WITH
- 2.3.26
diff --git a/vendor/gems/gitlab_active_record/LICENSE b/vendor/gems/gitlab_active_record/LICENSE
deleted file mode 100644
index aafb7f79450..00000000000
--- a/vendor/gems/gitlab_active_record/LICENSE
+++ /dev/null
@@ -1,7 +0,0 @@
-Copyright 2022 GitLab B.V.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/vendor/gems/gitlab_active_record/Rakefile b/vendor/gems/gitlab_active_record/Rakefile
deleted file mode 100644
index b6ae734104e..00000000000
--- a/vendor/gems/gitlab_active_record/Rakefile
+++ /dev/null
@@ -1,8 +0,0 @@
-# frozen_string_literal: true
-
-require "bundler/gem_tasks"
-require "rspec/core/rake_task"
-
-RSpec::Core::RakeTask.new(:spec)
-
-task default: :spec
diff --git a/vendor/gems/gitlab_active_record/bin/console b/vendor/gems/gitlab_active_record/bin/console
deleted file mode 100755
index a436c04dd66..00000000000
--- a/vendor/gems/gitlab_active_record/bin/console
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env ruby
-# frozen_string_literal: true
-
-require "bundler/setup"
-require "gitlab_active_record"
-
-# You can add fixtures and/or initialization code here to make experimenting
-# with your gem easier. You can also use a different console, if you like.
-
-# (If you use this, don't forget to add pry to your Gemfile!)
-# require "pry"
-# Pry.start
-
-require "irb"
-IRB.start(__FILE__)
diff --git a/vendor/gems/gitlab_active_record/bin/setup b/vendor/gems/gitlab_active_record/bin/setup
deleted file mode 100755
index dce67d860af..00000000000
--- a/vendor/gems/gitlab_active_record/bin/setup
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/usr/bin/env bash
-set -euo pipefail
-IFS=$'\n\t'
-set -vx
-
-bundle install
-
-# Do any other automated setup that you need to do here
diff --git a/vendor/gems/gitlab_active_record/gitlab_active_record.gemspec b/vendor/gems/gitlab_active_record/gitlab_active_record.gemspec
deleted file mode 100644
index 17e7d8f40d6..00000000000
--- a/vendor/gems/gitlab_active_record/gitlab_active_record.gemspec
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-require_relative "lib/gitlab_active_record/version"
-
-Gem::Specification.new do |spec|
- spec.name = "gitlab_active_record"
- spec.version = GitlabActiveRecord::VERSION
- spec.authors = ["GitLab"]
- spec.email = [""]
-
- spec.summary = "ActiveRecord patches for CI partitioning"
- spec.description = "ActiveRecord patches for CI partitioning"
- spec.homepage = "https://gitlab.com/gitlab-org/gitlab"
- spec.required_ruby_version = ">= 2.6.0"
-
- spec.metadata["homepage_uri"] = spec.homepage
- spec.metadata["source_code_uri"] = "https://gitlab.com/gitlab-org/gitlab"
-
- spec.files = Dir.glob("lib/**/*")
- spec.bindir = "exe"
- spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
- spec.require_paths = ["lib"]
-
- spec.add_dependency 'activerecord', '~> 6.1'
- spec.add_dependency 'activesupport', '~> 6.1'
-
- spec.add_development_dependency 'rake', '~> 13.0'
- spec.add_development_dependency 'rspec', '~> 3.0'
-end
diff --git a/vendor/gems/gitlab_active_record/lib/gitlab_active_record.rb b/vendor/gems/gitlab_active_record/lib/gitlab_active_record.rb
deleted file mode 100644
index 2ac8c71939f..00000000000
--- a/vendor/gems/gitlab_active_record/lib/gitlab_active_record.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-require_relative "gitlab_active_record/version"
-
-module GitlabActiveRecord
- class Error < StandardError; end
-end
diff --git a/vendor/gems/gitlab_active_record/lib/gitlab_active_record/version.rb b/vendor/gems/gitlab_active_record/lib/gitlab_active_record/version.rb
deleted file mode 100644
index d274361efd7..00000000000
--- a/vendor/gems/gitlab_active_record/lib/gitlab_active_record/version.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-# frozen_string_literal: true
-
-module GitlabActiveRecord
- VERSION = "0.1.0"
-end
diff --git a/vendor/gems/gitlab_active_record/spec/gitlab_active_record_spec.rb b/vendor/gems/gitlab_active_record/spec/gitlab_active_record_spec.rb
deleted file mode 100644
index d9263a08dfd..00000000000
--- a/vendor/gems/gitlab_active_record/spec/gitlab_active_record_spec.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-RSpec.describe GitlabActiveRecord do
- it "has a version number" do
- expect(GitlabActiveRecord::VERSION).not_to be nil
- end
-end
diff --git a/vendor/gems/gitlab_active_record/spec/spec_helper.rb b/vendor/gems/gitlab_active_record/spec/spec_helper.rb
deleted file mode 100644
index 3cfabb45b1a..00000000000
--- a/vendor/gems/gitlab_active_record/spec/spec_helper.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-require "gitlab_active_record"
-
-RSpec.configure do |config|
- # Enable flags like --only-failures and --next-failure
- config.example_status_persistence_file_path = ".rspec_status"
-
- # Disable RSpec exposing methods globally on `Module` and `main`
- config.disable_monkey_patching!
-
- config.expect_with :rspec do |c|
- c.syntax = :expect
- end
-end
diff --git a/vendor/gems/ipynbdiff/.gitignore b/vendor/gems/ipynbdiff/.gitignore
deleted file mode 100644
index 4f284c35a42..00000000000
--- a/vendor/gems/ipynbdiff/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.gem
-.bundle
diff --git a/vendor/gems/ipynbdiff/.gitlab-ci.yml b/vendor/gems/ipynbdiff/.gitlab-ci.yml
deleted file mode 100644
index bf8f8b15c26..00000000000
--- a/vendor/gems/ipynbdiff/.gitlab-ci.yml
+++ /dev/null
@@ -1,34 +0,0 @@
-# You can override the included template(s) by including variable overrides
-# SAST customization: https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings
-# Secret Detection customization: https://docs.gitlab.com/ee/user/application_security/secret_detection/#customizing-settings
-# Dependency Scanning customization: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings
-# Note that environment variables can be set in several places
-# See https://docs.gitlab.com/ee/ci/variables/#cicd-variable-precedence
-workflow:
- rules:
- - if: $CI_MERGE_REQUEST_ID
-
-.rspec:
- cache:
- key: ipynbdiff
- paths:
- - vendor/gems/ipynbdiff/vendor/ruby
- before_script:
- - cd vendor/gems/ipynbdiff
- - ruby -v # Print out ruby version for debugging
- - gem install bundler --no-document # Bundler is not installed with the image
- - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby
- - bundle config set with 'development'
- - bundle config set --local frozen 'true' # Disallow Gemfile.lock changes on CI
- - bundle config # Show bundler configuration
- - bundle install -j $(nproc)
- script:
- - bundle exec rspec
-
-rspec-2.7:
- image: "ruby:2.7"
- extends: .rspec
-
-rspec-3.0:
- image: "ruby:3.0"
- extends: .rspec
diff --git a/vendor/gems/ipynbdiff/Gemfile.lock b/vendor/gems/ipynbdiff/Gemfile.lock
deleted file mode 100644
index 6a8d3750602..00000000000
--- a/vendor/gems/ipynbdiff/Gemfile.lock
+++ /dev/null
@@ -1,67 +0,0 @@
-PATH
- remote: .
- specs:
- ipynbdiff (0.4.7)
- diffy (~> 3.4)
- oj (~> 3.13.16)
-
-GEM
- remote: https://rubygems.org/
- specs:
- ast (2.4.2)
- benchmark-memory (0.2.0)
- memory_profiler (~> 1)
- binding_ninja (0.2.3)
- coderay (1.1.3)
- diff-lcs (1.5.0)
- diffy (3.4.2)
- memory_profiler (1.0.0)
- method_source (1.0.0)
- oj (3.13.16)
- parser (3.1.2.0)
- ast (~> 2.4.1)
- proc_to_ast (0.1.0)
- coderay
- parser
- unparser
- pry (0.14.1)
- coderay (~> 1.1)
- method_source (~> 1.0)
- rake (13.0.6)
- rspec (3.11.0)
- rspec-core (~> 3.11.0)
- rspec-expectations (~> 3.11.0)
- rspec-mocks (~> 3.11.0)
- rspec-core (3.11.0)
- rspec-support (~> 3.11.0)
- rspec-expectations (3.11.0)
- diff-lcs (>= 1.2.0, < 2.0)
- rspec-support (~> 3.11.0)
- rspec-mocks (3.11.1)
- diff-lcs (>= 1.2.0, < 2.0)
- rspec-support (~> 3.11.0)
- rspec-parameterized (0.5.2)
- binding_ninja (>= 0.2.3)
- parser
- proc_to_ast
- rspec (>= 2.13, < 4)
- unparser
- rspec-support (3.11.0)
- unparser (0.6.5)
- diff-lcs (~> 1.3)
- parser (>= 3.1.0)
-
-PLATFORMS
- ruby
-
-DEPENDENCIES
- benchmark-memory (~> 0.2.0)
- bundler (~> 2.2)
- ipynbdiff!
- pry (~> 0.14)
- rake (~> 13.0)
- rspec (~> 3.10)
- rspec-parameterized (~> 0.5.1)
-
-BUNDLED WITH
- 2.3.16
diff --git a/vendor/gems/ipynbdiff/ipynbdiff.gemspec b/vendor/gems/ipynbdiff/ipynbdiff.gemspec
deleted file mode 100644
index 014005029ef..00000000000
--- a/vendor/gems/ipynbdiff/ipynbdiff.gemspec
+++ /dev/null
@@ -1,34 +0,0 @@
-# frozen_string_literal: true
-
-lib = File.expand_path('lib/..', __dir__)
-$LOAD_PATH.unshift lib unless $LOAD_PATH.include?(lib)
-
-require 'lib/version'
-
-Gem::Specification.new do |s|
- s.name = 'ipynbdiff'
- s.version = IpynbDiff::VERSION
- s.summary = 'Human Readable diffs for Jupyter Notebooks'
- s.description = 'Better diff for Jupyter Notebooks by first preprocessing them and removing clutter'
- s.authors = ['Eduardo Bonet']
- s.email = 'ebonet@gitlab.com'
- # Specify which files should be added to the gem when it is released.
- # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
- s.files = Dir.glob("lib/**/*.*")
- s.test_files = Dir.glob("spec/**/*.*")
- s.homepage =
- 'https://gitlab.com/gitlab-org/incubation-engineering/mlops/rb-ipynbdiff'
- s.license = 'MIT'
-
- s.require_paths = ['lib']
-
- s.add_runtime_dependency 'diffy', '~> 3.4'
- s.add_runtime_dependency 'oj', '~> 3.13.16'
-
- s.add_development_dependency 'bundler', '~> 2.2'
- s.add_development_dependency 'pry', '~> 0.14'
- s.add_development_dependency 'rake', '~> 13.0'
- s.add_development_dependency 'rspec', '~> 3.10'
- s.add_development_dependency 'rspec-parameterized', '~> 0.5.1'
- s.add_development_dependency 'benchmark-memory', '~>0.2.0'
-end
diff --git a/vendor/gems/ipynbdiff/lib/ipynbdiff.rb b/vendor/gems/ipynbdiff/lib/ipynbdiff.rb
deleted file mode 100644
index 1765e434bf9..00000000000
--- a/vendor/gems/ipynbdiff/lib/ipynbdiff.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-# Human Readable Jupyter Diffs
-module IpynbDiff
- require 'transformer'
- require 'diff'
-
- def self.diff(from, to, raise_if_invalid_nb: false, include_frontmatter: false, hide_images: false, diffy_opts: {})
- transformer = Transformer.new(include_frontmatter: include_frontmatter, hide_images: hide_images)
-
- Diff.new(transformer.transform(from), transformer.transform(to), diffy_opts)
- rescue InvalidNotebookError
- raise if raise_if_invalid_nb
- end
-
- def self.transform(notebook, raise_errors: false, include_frontmatter: true, hide_images: false)
- return unless notebook
-
- Transformer.new(include_frontmatter: include_frontmatter, hide_images: hide_images).transform(notebook).as_text
- rescue InvalidNotebookError
- raise if raise_errors
- end
-end
diff --git a/vendor/gems/ipynbdiff/lib/output_transformer.rb b/vendor/gems/ipynbdiff/lib/output_transformer.rb
deleted file mode 100644
index 57e8a9edce3..00000000000
--- a/vendor/gems/ipynbdiff/lib/output_transformer.rb
+++ /dev/null
@@ -1,72 +0,0 @@
-# frozen_string_literal: true
-
-module IpynbDiff
- # Transforms Jupyter output data into markdown
- class OutputTransformer
- require 'symbolized_markdown_helper'
- include SymbolizedMarkdownHelper
-
- HIDDEN_IMAGE_OUTPUT = ' [Hidden Image Output]'
-
- ORDERED_KEYS = {
- 'execute_result' => %w[image/png image/svg+xml image/jpeg text/markdown text/latex text/plain],
- 'display_data' => %w[image/png image/svg+xml image/jpeg text/markdown text/latex],
- 'stream' => %w[text]
- }.freeze
-
- def initialize(hide_images = false)
- @hide_images = hide_images
- end
-
- def transform(output, symbol)
- case (output_type = output['output_type'])
- when 'error'
- transform_error(output['traceback'], symbol / 'traceback')
- when 'execute_result', 'display_data'
- transform_non_error(ORDERED_KEYS[output_type], output['data'], symbol / 'data')
- when 'stream'
- transform_element('text', output['text'], symbol)
- end
- end
-
- def transform_error(traceback, symbol)
- traceback.map.with_index do |t, idx|
- t.split("\n").map do |l|
- _(symbol / idx, l.gsub(/\[[0-9][0-9;]*m/, '').sub("\u001B", ' ').gsub(/\u001B/, '').rstrip)
- end
- end
- end
-
- def transform_non_error(accepted_keys, elements, symbol)
- accepted_keys.filter { |key| elements.key?(key) }.map do |key|
- transform_element(key, elements[key], symbol)
- end
- end
-
- def transform_element(output_type, output_element, symbol_prefix)
- new_symbol = symbol_prefix / output_type
- case output_type
- when 'image/png', 'image/jpeg'
- transform_image(output_type + ';base64', output_element, new_symbol)
- when 'image/svg+xml'
- transform_image(output_type + ';utf8', output_element, new_symbol)
- when 'text/markdown', 'text/latex', 'text/plain', 'text'
- transform_text(output_element, new_symbol)
- end
- end
-
- def transform_image(image_type, image_content, symbol)
- return _(nil, HIDDEN_IMAGE_OUTPUT) if @hide_images
-
- lines = image_content.is_a?(Array) ? image_content : [image_content]
-
- single_line = lines.map(&:strip).join.gsub(/\s+/, ' ')
-
- _(symbol, " ![](data:#{image_type},#{single_line})")
- end
-
- def transform_text(text_content, symbol)
- symbolize_array(symbol, text_content) { |l| " #{l.rstrip}" }
- end
- end
-end
diff --git a/vendor/gems/ipynbdiff/lib/symbol_map.rb b/vendor/gems/ipynbdiff/lib/symbol_map.rb
deleted file mode 100644
index 89cbccbed1b..00000000000
--- a/vendor/gems/ipynbdiff/lib/symbol_map.rb
+++ /dev/null
@@ -1,107 +0,0 @@
-# frozen_string_literal: true
-
-module IpynbDiff
- require 'oj'
-
- # Creates a map from a symbol to the line number it appears in a Json file
- #
- # Example:
- #
- # Input:
- #
- # 1. {
- # 2. 'obj1': [
- # 3. {
- # 4. 'obj2': 5
- # 5. },
- # 6. 3,
- # 7. {
- # 8. 'obj3': {
- # 9. 'obj4': 'b'
- # 10. }
- # 11. }
- # 12. ]
- # 13.}
- #
- # Output:
- #
- # Symbol Line Number
- # .obj1 -> 2
- # .obj1.0 -> 3
- # .obj1.0 -> 3
- # .obj1.0.obj2 -> 4
- # .obj1.1 -> 6
- # .obj1.2 -> 7
- # .obj1.2.obj3 -> 8
- # .obj1.2.obj3.obj4 -> 9
- #
- class SymbolMap
- class << self
- def handler
- @handler ||= SymbolMap.new
- end
-
- def parser
- @parser ||= Oj::Parser.new(:saj).tap { |p| p.handler = handler }
- end
-
- def parse(notebook, *args)
- handler.reset
- parser.parse(notebook)
- handler.symbols
- end
- end
-
- attr_accessor :symbols
-
- def hash_start(key, line, column)
- add_symbol(key_or_index(key), line)
- end
-
- def hash_end(key, line, column)
- @current_path.pop
- end
-
- def array_start(key, line, column)
- @current_array_index << 0
-
- add_symbol(key, line)
- end
-
- def array_end(key, line, column)
- @current_path.pop
- @current_array_index.pop
- end
-
- def add_value(value, key, line, column)
- add_symbol(key_or_index(key), line)
-
- @current_path.pop
- end
-
- def add_symbol(symbol, line)
- @symbols[@current_path.append(symbol).join('.')] = line if symbol
- end
-
- def key_or_index(key)
- if key.nil? # value in an array
- if @current_path.empty?
- @current_path = ['']
- return nil
- end
-
- symbol = @current_array_index.last
- @current_array_index[-1] += 1
- symbol
- else
- key
- end
- end
-
- def reset
- @current_path = []
- @symbols = {}
- @current_array_index = []
- end
- end
-end
diff --git a/vendor/gems/ipynbdiff/lib/symbolized_markdown_helper.rb b/vendor/gems/ipynbdiff/lib/symbolized_markdown_helper.rb
deleted file mode 100644
index c075aa0d878..00000000000
--- a/vendor/gems/ipynbdiff/lib/symbolized_markdown_helper.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-# frozen_string_literal: true
-
-module IpynbDiff
- # Helper functions
- module SymbolizedMarkdownHelper
-
- def _(symbol = nil, content = '')
- { symbol: symbol, content: content }
- end
-
- def symbolize_array(symbol, content, &block)
- if content.is_a?(Array)
- content.map.with_index { |l, idx| _(symbol / idx, block.call(l)) }
- else
- content.split("\n").map { |c| _(symbol, c) }
- end
- end
- end
-
- # Simple wrapper for a string
- class JsonSymbol < String
- def /(other)
- JsonSymbol.new((other.is_a?(Array) ? [self, *other] : [self, other]).join('.'))
- end
- end
-end
diff --git a/vendor/gems/ipynbdiff/lib/transformer.rb b/vendor/gems/ipynbdiff/lib/transformer.rb
deleted file mode 100644
index 9e666a20aa5..00000000000
--- a/vendor/gems/ipynbdiff/lib/transformer.rb
+++ /dev/null
@@ -1,112 +0,0 @@
-# frozen_string_literal: true
-
-module IpynbDiff
- require 'oj'
-
- class InvalidNotebookError < StandardError
- end
-
- # Returns a markdown version of the Jupyter Notebook
- class Transformer
- require 'json'
- require 'yaml'
- require 'output_transformer'
- require 'symbolized_markdown_helper'
- require 'symbol_map'
- require 'transformed_notebook'
- include SymbolizedMarkdownHelper
-
- @include_frontmatter = true
-
- def initialize(include_frontmatter: true, hide_images: false)
- @include_frontmatter = include_frontmatter
- @hide_images = hide_images
- @out_transformer = OutputTransformer.new(hide_images)
- end
-
- def validate_notebook(notebook)
- notebook_json = Oj::Parser.usual.parse(notebook)
-
- return notebook_json if notebook_json&.key?('cells')
-
- raise InvalidNotebookError
- rescue EncodingError, Oj::ParseError, JSON::ParserError
- raise InvalidNotebookError
- end
-
- def transform(notebook)
- return TransformedNotebook.new unless notebook
-
- notebook_json = validate_notebook(notebook)
- transformed = transform_document(notebook_json)
- symbol_map = SymbolMap.parse(notebook)
-
- TransformedNotebook.new(transformed, symbol_map)
- end
-
- def transform_document(notebook)
- symbol = JsonSymbol.new('.cells')
-
- transformed_blocks = notebook['cells'].map.with_index do |cell, idx|
- decorate_cell(transform_cell(cell, notebook, symbol / idx), cell, symbol / idx)
- end
-
- transformed_blocks.prepend(transform_metadata(notebook)) if @include_frontmatter
- transformed_blocks.flatten
- end
-
- def decorate_cell(rows, cell, symbol)
- tags = cell['metadata']&.fetch('tags', [])
- type = cell['cell_type'] || 'raw'
-
- [
- _(symbol, %(%% Cell type:#{type} id:#{cell['id']} tags:#{tags&.join(',')})),
- _,
- rows,
- _
- ]
- end
-
- def transform_cell(cell, notebook, symbol)
- cell['cell_type'] == 'code' ? transform_code_cell(cell, notebook, symbol) : transform_text_cell(cell, symbol)
- end
-
- def transform_code_cell(cell, notebook, symbol)
- [
- _(symbol / 'source', %(``` #{notebook.dig('metadata', 'kernelspec', 'language') || ''})),
- symbolize_array(symbol / 'source', cell['source'], &:rstrip),
- _(nil, '```'),
- transform_outputs(cell['outputs'], symbol)
- ]
- end
-
- def transform_outputs(outputs, symbol)
- transformed = outputs.map
- .with_index { |output, i| @out_transformer.transform(output, symbol / ['outputs', i]) }
- .compact
- .map { |el| [_, el] }
-
- [
- transformed.empty? ? [] : [_, _(symbol / 'outputs', '%% Output')],
- transformed
- ]
- end
-
- def transform_text_cell(cell, symbol)
- symbolize_array(symbol / 'source', cell['source'], &:rstrip)
- end
-
- def transform_metadata(notebook_json)
- as_yaml = {
- 'jupyter' => {
- 'kernelspec' => notebook_json['metadata']['kernelspec'],
- 'language_info' => notebook_json['metadata']['language_info'],
- 'nbformat' => notebook_json['nbformat'],
- 'nbformat_minor' => notebook_json['nbformat_minor']
- }
- }.to_yaml
-
- as_yaml.split("\n").map { |l| _(nil, l) }.append(_(nil, '---'), _)
- end
- end
-end
diff --git a/vendor/gems/ipynbdiff/lib/version.rb b/vendor/gems/ipynbdiff/lib/version.rb
deleted file mode 100644
index 1451bb4ef32..00000000000
--- a/vendor/gems/ipynbdiff/lib/version.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-# frozen_string_literal: true
-
-module IpynbDiff
- VERSION = '0.4.7'
-end
diff --git a/vendor/gems/ipynbdiff/spec/benchmark.rb b/vendor/gems/ipynbdiff/spec/benchmark.rb
deleted file mode 100644
index 99f088f2056..00000000000
--- a/vendor/gems/ipynbdiff/spec/benchmark.rb
+++ /dev/null
@@ -1,64 +0,0 @@
-require 'ipynbdiff'
-require 'benchmark'
-require 'benchmark/memory'
-require_relative 'test_helper'
-
-large_cell = '{
- "cell_type": "code",
- "execution_count": 9,
- "id": "24f32781-48bf-4378-b30c-ccdce7b05ba0",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAABj0AAAHwCAYAAAD91q10AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAA9hAAAPYQGoP6dpAABPSUlEQVR4nO39eZCfd34f+L2fxkmAAAiCBO/7PobHkCAxIEjcV/eWHTl/yOVKvFaloo3kTZXjlKUa2bVS4tiyna2JElmudaUqK+0m9m4ceVVxutEAiIMXeIEEObyG4PC+QPAEQIA4+8kfD1pf/DgkhwC78XT/+vWqYmHQnybxLml6COCNz/dT1XUdAAAAAACA8a6n7QAAAAAAAAAjQekBAAAAAAB0BaUHAAAAAADQFZQeAAAAAABAV1B6AAAAAAAAXUHpAQAAAAAAdAWlBwAAAAAA0BUmtx3g66qqqpJcnGR/21kAAAAAAIAxYVaSD+q6rr/rk8Zc6ZGm8Hiv7RAAAAAAAMCYcmmS97/rE8Zi6bE/Sd59993Mnj277SwAAAAAAECL9u3bl8suuyz5Hi9EjcXSI0kye/ZspQcAAAAAAPC9OWQOAAAAAAB0BaUHAAAAAADQFZQeAAAAAABAV1B6AAAAAAAAXUHpAQAAAAAAdAWlBwAAAAAA0BWUHgAAAAAAQFdQegAAAAAAAF1B6QEAAAAAAHQFpQcAAAAAANAVlB4AAAAAAEBXUHoAAAAAAABdQekBAAAAAAB0BaUHAAAAAADQFZQeAAAAAABAV1B6AAAAAAAAXeGUSo+qqn5aVdXTVVXtr6pqT1VVf1VV1Q1f+5w/r6qq/tpfT4xsbAAAAAAA6DKffJJs2dJ2inFt8il+/pIkf5bk6RN/7z9LsrGqqpvruj5w0ucNJvmtk75/5AelBAAAAACAblPXyXPPJf39ycBA8sQTyfTpyaefJmed1Xa6cemUSo+6rtee/P2qqn4ryZ4kdyV5+KTR4bqud//weAAAAAAA0EX27082by5FxwcfdM6vvz55773kuuvayTfOneqmx9fNOfHtZ1/7+NKqqvYk+SLJQ0n+cV3Xe77pH1BV1bQk00760KwfmAkAAAAAAMaO115rSo7+/uThh5MjJz2ONGNGsnJl0teX9PYml17aXs4ucNqlR1VVVZKfJXm0rusXTxqtT/Ifkryd5Kok/zTJlqqq7qrr+vA3/KN+muQPTzcHAAAAAACMKYcPN+XG8DbHa691zq+5pik5+vqSBx5onrRiRFR1XZ/e31hVf5akL8niuq7f+47PuyhNAfK367r+j98w/6ZNj/f27t2b2bNnn1Y2AAAAAAA4o95/vyk4BgaSTZuSAyedwZ4ypSk3enubouP665Oqai/rOLNv377MmTMnSebUdb3vuz73tDY9qqr60yR/I8kD31V4JEld1x9WVfV2km98gOzE9sdfb4BU/h8NAAAAAMBYd/x48tRT5dmq557rnF94YSk5Vq5M/CH/M+KUSo8TT1r9aZLfSLK0rus3v8ffMy/JZUk+PK2EAAAAAAAwFnz2WbJhQ1NyDA4mn35aZlWV3HNPebbqjjuSnp7Wok5Up7rp8WdJ/k6Sv5lkf1VVF574+N66rr+qqursJH+U5C/TlBxXJvnnST5J8j+NRGAAAAAAADgj6jp54YXmyar+/mT79mRoqMznzEnWrGlKjrVrk/nz28tKklMvPX7nxLfbvvbx30ry50mOJ/lRkr+b5Jw0xcfWJL9Z1/X+0w0JAAAAAABnxIEDyZYt5Qj5u+92zm+5pWxzLFqUTD6tKxKMklP6/0Zd1995cKOu66+SrPlBiQAAAAAA4Ex6441ym2PbtuTw4TKbPj1ZsaIpOXp7kyuuaC0mv54KCgAAAACAieXo0eTRR0vR8YtfdM6vuKJscyxblpx1Vjs5OWVKDwAAAAAAut/u3cn69U3JsWlTsm9fmU2alCxeXIqOm25qDpMz7ig9AAAAAADoPkNDyY4d5Qj5jh2d8/PPb56r6u1NVq9OzjmnlZiMLKUHAAAAAADdYe/eZOPGpuRYvz7Zs6dzfvfdTcnR19f8556ednIyapQeAAAAAACMT3WdvPJKU3IMDDR3Oo4dK/NZs5otjr6+ZN265MIL28vKGaH0AAAAAABg/Pjqq2TbtnKE/K23Ouc33lhuc9x3XzJ1ahspaYnSAwAAAACAse2dd8o2x+bNTfExbNq0ZNmy8mzV1Ve3l5PWKT0AAAAAABhbjh1LHn+8bHO8+GLn/NJLyzbH8uXJzJnt5GTMUXoAAAAAANC+jz9OBgebkmPDhuSLL8qspydZtKgUHbfemlRVa1EZu5QeAAAAAACceXWd7NxZtjmeeqr52LB585K1a5uSY82a5Nxz28vKuKH0AAAAAADgzNi/P9m0qbnNMTCQfPhh5/yOO8o2xz33JJMmtRKT8UvpAQAAAADA6Nm1q2xzPPxwcvRomc2cmaxa1ZQc69Yll1zSXk66gtIDAAAAAICRc/hw8tBDTckxMJD88ped82uvLdscDzyQTJvWTk66ktIDAAAAAIAf5v33m4Kjvz958MHkwIEymzIlWbKkFB3XXddeTrqe0gMAAAAAgFNz/Hjy5JPl2arnn++cX3RR0tvblBwrVyazZrWTkwlH6QEAAAAAwK/32WfJ4GBTcgwONt8fVlXJvfeWbY477mg+BmeY0gMAAAAAgF9V18kLL5RtjscfT4aGyvycc5K1a5uNjrVrk/PPby0qDFN6AAAAAADQOHAg2by5HCF/773O+a23lm2On/wkmey3mBlb/DcSAAAAAGAie/31coR827bk8OEyO+usZMWKZpujtze54orWYsL3ofQAAAAAAJhIjhxJHn20PFv16qud8yuvLNscS5c2xQeME0oPAAAAAIBut3t3s80xMJBs3Jjs319mkycnixeXouPGGx0hZ9xSegAAAAAAdJuhoWTHjrLN8cwznfP588uTVatXJ3PmtJMTRpjSAwAAAACgG3zxRbPFMTCQrF+f7NnTOb/77rLNcdddSU9PKzFhNCk9AAAAAADGo7pOXnmlbHM8+mhy/HiZz57dbHH09ibr1iUXXtheVjhDlB4AAAAAAOPFV18lW7c2JcfAQPLWW53zG28s2xz33ZdMndpKTGiL0gMAAAAAYCx7++1ScmzZ0hQfw6ZNS5Yta7Y5+vqSq69uLyeMAUoPAAAAAICx5NixZPv28mzVSy91zi+9tGxzLF+ezJzZTk4Yg5QeAAAAAABt+/jj5vh4f3+yYUOyd2+Z9fQkixaVouPWW5Oqai8rjGFKDwAAAACAM21oKNm5s2xzPP10c5h82Lx5zfHxvr7mGPm557aXFcYRpQcAAAAAwJmwb1/y4IPlPsfu3Z3zO+8stznuuSeZNKmdnDCOKT0AAAAAAEZDXSe7dpVtjkceSY4eLfOZM5NVq5qSo7c3ufji9rJCl1B6AAAAAACMlEOHkoceKtscr7/eOb/uunKb4/77k2nT2skJXUrpAQAAAADwQ7z3XlNw9Pc3z1cdPFhmU6cmS5aUZ6uuu669nDABKD0AAAAAAE7F8ePJE0+UZ6t+/vPO+cUXl5Jj5crk7LPbyQkTkNIDAAAAAODX+fTTZHCw2egYHEw++6zMqipZuLA8W3X77c3HgDNO6QEAAAAA8HV13WxwDG9zPPFEMjRU5nPnJmvXNhsda9cm553XXlbgryk9AAAAAACS5Msvk82bm22OgYHmVsfJfvSjss2xcGEy2W+vwljjqxIAAAAAmLhef71sc2zblhw5UmZnndXc5Ojtbf66/PLWYgLfj9IDAAAAAJg4jhxJHnmkFB27dnXOr7qqbHMsXZpMn95KTOD0KD0AAAAAgO724YflyapNm5L9+8ts8uTk/vubTY6+vuTGGx0hh3FM6QEAAAAAdJehoeTpp8s2x7PPds7nzy8lx6pVyZw57eQERpzSAwAAAAAY/774ItmwoSk5BgeTjz/unC9Y0JQcvb3JXXclPT2txARGl9IDAAAAABh/6jp56aXmyar+/uSxx5Ljx8t89uxk9eqm6Fi3LrnggvayAmeM0gMAAAAAGB8OHky2bm1KjoGB5O23O+c33VSOkN93XzJlSjs5gdYoPQAAAACAseutt8ptjq1bk0OHymzatGT58vJs1VVXtRYTGBuUHgAAAADA2HH0aLJ9eyk6Xn65c37ZZWWbY/nyZMaMdnICY5LSAwAAAABo1549yfr1TcmxcWOyd2+ZTZqULFpUio5bbkmqqr2swJim9AAAAAAAzqyhoeTZZ8s2x44dzWHyYeed1xwf7+1N1qxJ5s5tLyswrig9AAAAAIDRt29fsmlTOUL+0Ued8x//uCk5+vqSBQuaDQ+AU6T0AAAAAABGXl0nr75atjkeeSQ5dqzMzz47WbWqKTnWrUsuvri9rEDXUHoAAAAAACPj0KFk27ayzfHGG53z668v2xz3359Mm9ZKTKB7KT0AAAAAgNP37rtNwdHfn2zenBw8WGZTpyZLl5ai49prW4sJTAxKDwAAAADg+zt2LHniifJs1QsvdM4vvrgpOPr6khUrmmesAM4QpQcAAAAA8N0++STZsKEpOQYHk88/L7OenmThwrLNcfvtSVW1lxWY0JQeAAAAAECnuk6ef75sczz5ZDI0VOZz5yZr1zYlx5o1yXnntZcV4CRKDwAAAAAg+fLL5MEHyxHyDz7onN92W1Ny9PY2mx2T/dYiMPb4XyYAAAAAmKh++cuyzfHQQ8mRI2U2Y0Zzk2O46LjssvZyAnxPSg8AAAAAmCiOHEkefrhsc+za1Tm/+upyhHzJkmT69HZyApwmpQcAAAAAdLMPPkjWr2+Kjk2bmmeshk2enNx/fyk6brjBEXJgXFN6AAAAAEA3OX48efrp8mzVzp2d8wsuaJ6r6utLVq1KZs9uJyfAKFB6AAAAAMB49/nnyYYNTckxOJh88kmZVVWyYEG5zfHjHyc9Pe1lBRhFSg8AAAAAGG/qOnnppbLNsX17s+ExbM6cZM2apuRYty6ZP7+9rABnkNIDAAAAAMaDgweTLVvKEfJ33umc33xzuc2xaFEyZUo7OQFapPQAAAAAgLHqzTdLybF1a3LoUJlNn54sX16erbryytZiAowVSg8AAAAAGCuOHk0efbQpOfr7k1de6ZxffnnZ5li2LJkxo52cAGOU0gMAAAAA2vTRR8n69U3JsXFjsm9fmU2alNx3Xyk6br65OUwOwDdSegAAAADAmTQ0lDzzTDlCvmNH5/z885vj4319yapVydy57eQEGIeUHgAAAAAw2vbuTTZtakqO9eub7Y6T3XVXc5ejry9ZsCDp6WknJ8A4p/QAAAAAgJFW18kvflG2OR59NDl2rMxnzWq2OPr6mq2Oiy5qLytAF1F6AAAAAMBIOHQo2bq1HCF/883O+Q03NCVHb29y//3J1Knt5AToYkoPAAAAADhd775btjk2b06++qrMpk5Nli4tR8ivuaa1mAATxSmVHlVV/TTJ30pyY5KvkmxP8vt1Xb960udUSf4wyW8nmZvkySR/v67rl0YqNAAAAAC04tix5PHHyzbHCy90zi+5pGxzrFiRnH12OzkBJqhT3fRYkuTPkjx94u/9Z0k2VlV1c13XB058zu8l+YdJ/l6SXUn+SZJNVVXdUNf1/hFJDQAAAABnyiefJIODTcmxYUPy+edl1tOTLFxYtjluuy2pqvayAkxwVV3Xp/83V9X5SfYkWVLX9cMntjw+SPIndV3/yxOfMy3JR2k2Qv7t9/hnzk6yd+/evZk9e/ZpZwMAAACA01LXyXPPNSXHwEDyxBPNx4ade26ydm1TcqxZk8yb11pUgIlg3759mTNnTpLMqet633d97g+96THnxLefnfj2qiQXJtk4/Al1XR+uquqhJIuS/ErpcaIUmXbSh2b9wEwAAAAAcGr2729ucgwXHR980Dm/7bayzXHvvclkp3IBxqLT/l/nE1sdP0vyaF3XL5748IUnvv3oa5/+UZIrvuUf9dM0N0AAAAAA4Mx57bVyhPzhh5MjR8psxoxk5cpyn+PSS9vLCcD39kMq6X+d5LYki79h9vU3s6pv+NiwP05TngybleS9H5ALAAAAAH7V4cNNuTG8zfHaa53za64pJceSJcn06e3kBOC0nVbpUVXVnyb5G0keqOv65IJi94lvL0zy4Ukfn59f3f5I0jx/leTwSf/s04kEAAAAAL/q/feT9eubouPBB5MvvyyzyZOTBx4oz1Zdf70j5ADj3CmVHieetPrTJL+RZGld129+7VPeTFN8rEqy88TfMzXJkiS//4PTAgAAAMB3OX48eeqp8mzVc891zi+8sNnk6Otrnq+aPbuVmACMjlPd9PizJH8nyd9Msr+qquEbHnvruv6qruu6qqo/SfIHVVW9luS1JH+Q5GCSfzdCmQEAAACg+OyzZMOGpuQYHEw+/bTMqiq5557ybNWddyY9Pe1lBWBUnWrp8Tsnvt32tY//VpI/P/Gf/1WSs5L8myRzkzyZZHVd1/tPLyIAAAAAnKSukxdeaO5y9Pcn27cnQ0NlPmdOsmZNU3SsXZvMn99eVgDOqKquv+2+eDuqqpqdZO/evXsz23ohAAAAAEly4ECyZUs5Qv7uu53zW24ptzkWLWrudQDQFfbt25c5c+YkyZy6rvd91+f6X38AAAAAxqY33ii3ObZtSw4fLrPp05MVK8qzVVdc0VpMAMYOpQcAAAAAY8ORI8ljj5Wi4xe/6JxfcUXZ5li2LDnrrHZyAjBmKT0AAAAAaM/u3cn69U3JsXFjsv+ks7CTJiWLF5ei46abmsPkAPAtlB4AAAAAnDlDQ8mOHeU2x44dnfPzz2+eq+rtTVavTs45p5WYAIxPSg8AAAAARtcXXySbNjVFx/r1yZ49nfO77irbHHffnfT0tBITgPFP6QEAAADAyKrr5JVXym2Oxx5Ljh0r81mzmi2Ovr5k3brkwgvbywpAV1F6AAAAAPDDffVVsm1bKTreeqtzfsMNZZtj8eJk6tQ2UgLQ5ZQeAAAAAJyed94pJceWLU3xMWzatGTp0qbk6O1NrrmmtZgATBxKDwAAAAC+n2PHku3byxHyF1/snF96aSk5VqxIZs5sJycAE5bSAwAAAIBv9/HHyeBgU3Rs2NAcJR/W05P85Cfl2aof/SipqtaiAoDSAwAAAICirpOdO8s2x5NPNh8bdu65zfHxvr7mGPm8ee1lBYCvUXoAAAAATHT79ycPPliKjg8/7JzffnvZ5rj33mTSpHZyAsCvofQAAAAAmIh27SpHyB9+ODl6tMxmzkxWrmxKjnXrmlsdADAOKD0AAAAAJoLDh5tyY7jo+OUvO+fXXFO2OZYsSaZNaycnAPwASg8AAACAbvX++81zVf39zfNVBw6U2ZQpyQMPlKLj+uvbywkAI0TpAQAAANAtjh9vDo8PFx3PPdc5v+iipLe3KTlWrkxmzWolJgCMFqUHAAAAwHj22WfJhg1NyTE4mHz6aZlVVXLPPWWb4447kp6e1qICwGhTegAAAACMJ3WdvPBCuc3x+OPJ0FCZn3NOsmZNU3KsXZucf35rUQHgTFN6AAAAAIx1Bw4kmzc3JcfAQPLee53zW29tSo7e3mTRomSy3/IBYGLyb0AAAACAsej118ttjm3bksOHy+yss5Lly0vRccUVrcUEgLFE6QEAAAAwFhw5kjz6aHm26tVXO+dXXllucyxd2hQfAEAHpQcAAABAW3bvbrY5BgaSjRuT/fvLbPLkZPHiZpOjry+56abmMDkA8K2UHgAAAABnytBQ8vTT5dmqZ57pnM+fn6xb15Qcq1cnc+a0kxMAximlBwAAAMBo+uKLZoujvz9Zvz75+OPO+d13l2er7ror6elpJSYAdAOlBwAAAMBIquvk5ZfLbY7HHkuOHy/z2bObLY7e3mar48IL28sKAF1G6QEAAADwQ331VbJ1ayk63n67c37jjWWb4777kqlT28kJAF1O6QEAAABwOt5+u5QcW7Ykhw6V2bRpybJl5Qj51Ve3lxMAJhClBwAAAMD3cexYsn17KTpeeqlzfumlZZtj+fJk5sx2cgLABKb0AAAAAPg2H3/cHB/v7082bEj27i2znp5k0aJSdNx6a1JV7WUFAJQeAAAAAH9taCjZuTMZGGiKjqeeag6TD5s3L1m7tik51qxJzj23vawAwK9QegAAAAAT2/79yaZNTckxMJDs3t05v+OOss1xzz3JpEmtxAQAfj2lBwAAADCx1HWya1fZ5nj44eTo0TKfOTNZtaopOdatSy65pL2sAMApUXoAAAAA3e/w4eShh8oR8tdf75xfd11TcvT2Jg88kEyb1k5OAOAHUXoAAAAA3en998uTVQ8+mBw4UGZTpiRLlpRnq667rr2cAMCIUXoAAAAA3eH48eTJJ8s2x/PPd84vvrjZ5OjrS1asSGbNaicnADBqlB4AAADA+PXZZ8ngYFNyDA423x9WVcnCheXZqjvuaD4GAHQtpQcAAAAwftR18vOfl2erHn88GRoq83POSdaubYqOtWuT885rLSoAcOYpPQAAAICx7cCBZPPmUnS8917n/Ec/Krc5Fi5MJvvtDgCYqPwsAAAAABh7Xn+93ObYti05cqTMzjorWbmyebKqtze5/PLWYgIAY4vSAwAAAGjfkSPJI4+UomPXrs75VVeVbY6lS5Pp01uJCQCMbUoPAAAAoB0ffpisX9+UHJs2Jfv3l9nkycn99zebHH19yY03OkIOAPxaSg8AAADgzBgaSp5+umxzPPts53z+/FJyrFqVzJnTTk4AYNxSegAAAACj54svkg0bmpJjcDD5+OPO+YIFTcnR25vcdVfS09NKTACgOyg9AAAAgJFT18nLL5dtjsceS44fL/PZs5PVq5uiY9265IIL2ssKAHQdpQcAAADwwxw8mGzd2pQcAwPJ2293zm+6qRwhv+++ZMqUdnICAF1P6QEAAACcurfeagqO/v5ky5bk0KEymzYtWbasFB1XXdVaTABgYlF6AAAAAL/e0aPJ9u3l2aqXX+6cX3ZZKTmWL09mzGgnJwAwoSk9AAAAgG+2Z0+yfn2z0bFhQ7J3b5lNmpQsWlSOkN96a1JV7WUFAIjSAwAAABg2NJTs3Fm2OZ5+ujlMPmzevOb4eF9fsmZNMndue1kBAL6B0gMAAAAmsn37kk2bmpJj/fpk9+7O+Z13lmerFixoNjwAAMYopQcAAABMJHWd7NpVtjkeeaS51zHs7LOTVauaJ6t6e5OLL24vKwDAKVJ6AAAAQLc7dCh56KFSdLzxRuf8uuvKNsf99yfTprWTEwDgB1J6AAAAQDd6772m4BgYSB58MDl4sMymTk2WLClHyK+7rr2cAAAjSOkBAAAA3eDYseTJJ8s2x89/3jm/+OKyzbFiRfOMFQBAl1F6AAAAwHj16afJ4GBTcmzYkHz2WZn19CQLFzabHH19ye23J1XVXlYAgDNA6QEAAADjRV0nzz/fPFnV35888UQyNFTmc+cma9c2JceaNcl557WXFQCgBUoPAAAAGMu+/DLZvLnc53j//c75bbeV2xwLFyaT/VIfAJi4/EwIAAAAxppf/rLc5njooeTIkTKbMaO5yTFcdFx2WXs5AQDGGKUHAAAAtO3IkeThh8uzVbt2dc6vvrocIV+yJJk+vZ2cAABjnNIDAAAA2vDhh6Xk2LSpecZq2OTJyQMPlG2OG25whBwA4HtQegAAAMCZcPx48vTT5TbHs892zi+4oCk4+vqSVauS2bPbyQkAMI4pPQAAAGC0fP55snFjU3SsX5988kmZVVWyYEHZ5vjxj5OenvayAgB0AaUHAAAAjJS6Tl56qRwh37692fAYNnt2smZNU3SsW5fMn99eVgCALqT0AAAAgB/i4MFky5Zyn+OddzrnN99cjpAvWpRMmdJOTgCACUDpAQAAAKfqrbfKNsfWrcmhQ2U2fXqyfHm5z3HllW2lBACYcJQeAAAA8OscPZo89lg5Qv7yy53zyy8v2xzLliUzZrSTEwBgglN6AAAAwDfZs6c5Pt7f3xwj37u3zCZNSu67r2xz3HJLc5gcAIBWKT0AAAAgSYaGkmefLc9W7djRHCYfdt55zfHxvr5k9epk7tz2sgIA8I2UHgAAAExc+/Y1WxwDA81fH33UOf/xj8uzVXff3Wx4AAAwZik9AAAAmDjqOnn11bLN8cgjybFjZX722cmqVU3JsW5dcvHF7WUFAOCUKT0AAADobocOJdu2lSPkb7zROb/++rLNcf/9ydSprcQEAOCHO+XSo6qqB5L8oyR3JbkoyW/Udf1XJ83/PMl//rW/7cm6rheefkwAAAA4Be++2xQc/f3J5s3JwYNlNnVqsnRpU3L09ibXXttaTAAARtbpbHrMTPJ8kv82yV9+y+cMJvmtk75/5DR+HAAAAPh+jh1LnniiPFv1wgud80suaQqOvr5kxYrmGSsAALrOKZcedV2vT7I+Saqq+rZPO1zX9e4fkAsAAAC+2yefJIODTcmxYUPy+edl1tOTLFxYnq267bbk238NCwBAlxitmx5Lq6rak+SLJA8l+cd1Xe/5pk+sqmpakmknfWjWKGUCAABgPKvr5Lnnym2OJ55oPjbs3HOTtWubjY61a5N581qLCgBAO0aj9Fif5D8keTvJVUn+aZItVVXdVdf14W/4/J8m+cNRyAEAAMB49+WXyYMPlqLjgw8657fdVrY57r03mTxaf7YPAIDxYMR/NljX9f940ndfrKpqR5oCpC/Jf/yGv+WPk/zspO/PSvLeSOcCAABgnHjttXKb4+GHkyMnnYmcMSNZubIcIb/00vZyAgAw5oz6H4Gp6/rDqqreTnLdt8wPJ/nrDZDvuBMCAABANzp8uCk3hrc5Xnutc3711WWbY8mSZPr0dnICADDmjXrpUVXVvCSXJflwtH8sAAAAxokPPmgKjv7+5vmqL78ss8mTkwceKEXH9dc7Qg4AwPdyyqVHVVVnJ7n2pA9dVVXVHUk+O/HXHyX5yzQlx5VJ/nmST5L8Tz8sKgAAAOPW8ePJU0+VbY6dOzvnF17YPFfV19c8XzV7djs5AQAY105n0+PuJFtP+v7wPY6/SPI7SX6U5O8mOSdN8bE1yW/Wdb3/9GMCAAAw7nz+ebJhQ1N0DA4mn3xSZlWVLFhQtjnuvDPp6WkvKwAAXeGUS4+6rrcl+a694jWnnQYAAIDxq66TF18sR8i3b0+Ghsp8zpxkzZqm5Fi7Npk/v72sAAB0pVG/6QEAAEAXO3gw2by53Od4993O+S23lGerFi1KpkxpJycAABOC0gMAAIBT8+abZZtj69bk8OEymz49Wb68KTl6e5Mrr2wtJgAAE4/SAwAAgO929Gjy6KNlm+OVVzrnV1xRbnMsXZrMmNFKTAAAUHoAAADwqz76KFm/vik5Nm5M9u0rs0mTkvvuK0XHzTc3h8kBAKBlSg8AAACag+PPPFOerdqxo3N+/vnJunXNk1WrVydz57aTEwAAvoPSAwAAYKLau7fZ4hgYaLY6Pvqoc37XXeU2x4IFSU9POzkBAOB7UnoAAABMFHXd3OMYvs3x6KPJsWNlPmtWsmpVU3SsW5dcdFF7WQEA4DQoPQAAALrZV18l27aVZ6veeqtzfsMN5TbH4sXJ1KltpAQAgBGh9AAAAOg277zTFBwDA8nmzU3xMWzq1GTZsvJs1TXXtJcTAABGmNIDAABgvDt2LHn88bLN8eKLnfNLL20Kjr6+ZMWKZObMdnICAMAoU3oAAACMRx9/nAwONiXHhg3JF1+UWU9P8pOflGerfvSjpKpaiwoAAGeK0gMAAGA8qOtk587ybNWTTzYfG3buuc3x8b6+ZPXqZN689rICAEBLlB4AAABj1f79yYMPlqLjww8757ffXrY57r03mTSpnZwAADBGKD0AAADGkl27Ssnx0EPJ0aNlNnNmsnJlOUJ+ySXt5QQAgDFI6QEAANCmw4eThx8uR8h/+cvO+bXXlpJjyZJk2rR2cgIAwDig9AAAADjT3n+/2eTo72+erzpwoMymTEkeeKA8W3X99e3lBACAcUbpAQAAMNqOH0+eeqpsczz3XOf8oouaTY6+vub5qlmzWokJAADjndIDAABgNHz2WbJhQ1NyDA4mn35aZlWV3HNP2ea4446kp6e1qAAA0C2UHgAAACOhrpMXXijPVm3fngwNlfk55yRr1jQlx9q1yfnntxYVAAC6ldIDAADgdB04kGzZ0pQcAwPJu+92zm+9tTxbtWhRMtkvwQAAYDT5GTcAAMCpeOONcptj27bk8OEyO+usZPnypuTo7U2uuKK1mAAAMBEpPQAAAL7LkSPJY4+VouMXv+icX3llKTmWLWuKDwAAoBVKDwAAgK/bvTtZv74pOTZuTPbvL7NJk5LFi8sR8ptuag6TAwAArVN6AAAADA0lO3aUbY5nnumcz5+frFvXlByrVjVHyQEAgDFH6QEAAExMX3zRbHEMDDRbHXv2dM7vvrs8W3X33UlPTysxAQCA70/pAQAATAx1nbzyStnmePTR5PjxMp81K1m9uik61q1LLrywvawAAMBpUXoAAADd66uvkq1bm5JjYCB5663O+Y03ltsc992XTJ3aSkwAAGBkKD0AAIDu8vbbpeTYsqUpPoZNm5YsW9Y8WdXXl1x9dXs5AQCAEaf0AAAAxrdjx5Lt28uzVS+91Dm/9NKyzbF8eTJzZjs5AQCAUaf0AAAAxp+PP26Oj/f3Jxs2JHv3lllPT7JoUSk6br01qar2sgIAAGeM0gMAABj7hoaSnTubJ6v6+5OnnmoOkw+bNy9Zu7YpOdasSc49t72sAABAa5QeAADA2LR/f7JpU7nPsXt35/yOO8o2xz33JJMmtRITAAAYO5QeAADA2FDXya5dZZvj4YeTo0fLfObMZNWqpuRYty655JL2sgIAAGOS0gMAAGjP4cPJQw+VI+Svv945v/bass3xwAPJtGnt5AQAAMYFpQcAAHBmvfde2ebYvDk5cKDMpkxJlixpSo7e3uT669vLCQAAjDtKDwAAYHQdP548+WTZ5nj++c75RRc1BUdfX7JyZTJrVjs5AQCAcU/pAQAAjLzPPksGB5uSY3Cw+f6wqkruvbc8W3XHHc3HAAAAfiClBwAA8MPVdfLznzclx8BA8vjjydBQmZ9zTrJmTVNyrF2bnH9+a1EBAIDupfQAAABOz4EDzU2O4aLjvfc657feWrY5fvKTZLJffgAAAKPLrzoAAIDv7/XXy22ObduSI0fK7KyzkhUryhHyyy9vLSYAADAxKT0AAIBvd+RI8sgjZZvj1Vc751ddVUqOpUub4gMAAKAlSg8AAKDThx82BcfAQLJpU7J/f5lNnpwsXlyerbrxRkfIAQCAMUPpAQAAE93QUPL00+XZqmef7ZzPn99scvT1JatWJXPmtJMTAADg11B6AADARPTFF8mGDU3JMTiYfPxx53zBgvJs1V13JT09rcQEAAA4FUoPAACYCOo6eeml5smq/v7ksceS48fLfPbsZPXqpuhYty654IL2sgIAAJwmpQcAAHSrgweTrVvLEfK33+6c33RTuc1x333JlCnt5AQAABghSg8AAOgmb71VSo4tW5JDh8ps2rRk+fJyn+Oqq1qLCQAAMBqUHgAAMJ4dPZps316OkL/8cuf8ssvKNsfy5cmMGe3kBAAAOAOUHgAAMN7s2ZOsX9+UHBs3Jnv3ltmkScmiRaXouOWWpKraywoAAHAGKT0AAGCsGxpKdu4s2xxPP90cJh82b15zfLyvL1mzJpk7t72sAAAALVJ6AADAWLRvX7JpU1NyrF+f7N7dOb/zzrLNsWBBs+EBAAAwwSk9AABgLKjrZNeuss3xyCPNvY5hZ5+drFrVHCHv7U0uvri9rAAAAGOU0gMAANpy6FDy0EOl6Hjjjc75ddeVbY7770+mTWsnJwAAwDih9AAAgDPpvfeSgYGm5HjwweTgwTKbOjVZsqQpOXp7m9IDAACA703pAQAAo+n48eSJJ8o2x89/3jm/+OKm4OjrS1aubJ6xAgAA4LQoPQAAYKR9+mkyONhsdAwOJp99VmZVlSxcWJ6tuv325mMAAAD8YEoPAAD4oeq62eAY3uZ44olkaKjM585N1q5tSo41a5LzzmsvKwAAQBdTegAAwOn48stk8+Zmm2NgoLnVcbLbbivPVi1cmEz2U28AAIDR5ldeAADwfb3+etnm2LYtOXKkzGbMSFasKEfIL7ustZgAAAATldIDAAC+zZEjySOPlKJj167O+dVXl5Jj6dJk+vRWYgIAANBQegAAwMk+/DBZv74pOTZtSvbvL7PJk5P77y9HyG+4wRFyAACAMUTpAQDAxDY0lDz9dNnmePbZzvkFF5TbHKtWJbNnt5MTAACAX0vpAQDAxPPFF8mGDU3JMTiYfPxxmVVVsmBB2ea4886kp6e1qAAAAHx/Sg8AALpfXScvvZQMDDRFx2OPJcePl/mcOcmaNc1Gx7p1yfz57WUFAADgtCk9AADoTgcPJlu3NiXHwEDy9tud85tvLtscixYlU6a0kxMAAIARo/QAAKB7vPVWuc2xdWty6FCZTZ+eLF9e7nNceWVbKQEAABglSg8AAMavo0eT7dtL0fHyy53zyy8v2xzLliUzZrSTEwAAgDNC6QEAwPiyZ0+yfn1TcmzcmOzdW2aTJiX33deUHL29yS23NIfJAQAAmBCUHgAAjG1DQ8mzz5Ztjh07msPkw847rzk+3teXrF6dzJ3bXlYAAABapfQAAGDs2bcv2bSpHCH/6KPO+Y9/XLY5FixoNjwAAACY8JQeAAC0r66TV18t2xyPPJIcO1bmZ5+drFrVFB3r1iUXX9xeVgAAAMasUy49qqp6IMk/SnJXkouS/EZd13910rxK8odJfjvJ3CRPJvn7dV2/NBKBAQDoEocOJdu2lW2ON97onF9/fbPJ0deX3H9/Mm1aKzEBAAAYP05n02NmkueT/LdJ/vIb5r+X5B8m+XtJdiX5J0k2VVV1Q13X+08zJwAA3eDdd5uCo78/2bw5OXiwzKZOTZYuLUXHtde2FhMAAIDx6ZRLj7qu1ydZnyTNUkdxYsvjHyT5Z3Vd/8cTH/vPk3yU5O8k+bc/LC4AAOPKsWPJE0+UZ6teeKFzfvHFTcHR15esWNE8YwUAAACnaaRvelyV5MIkG4c/UNf14aqqHkqyKN9QelRVNS3JyW8VzBrhTAAAnEmffJJs2NCUHIODyeefl1lPT7JwYdnmuP325Gt/kAYAAABO10iXHhee+Pajr338oyRXfMvf89M0N0AAABiP6jp5/vmyzfHkk8nQUJnPnZusXduUHGvWJOed115WAAAAutpIlx7D6q99v/qGjw374yQ/O+n7s5K8NxqhAAAYIV9+mTz4YDlC/sEHnfPbbmtKjt7eZrNj8mj9tBMAAACKkf7V5+4T316Y5MOTPj4/v7r9kaR5/irJ4eHvf/1OCAAAY8Qvf1m2OR56KDlypMxmzGhucgwXHZdd1l5OAAAAJqyRLj3eTFN8rEqyM0mqqpqaZEmS3x/hHwsAgNF05Ejy8MNlm2PXrs751VeXI+RLliTTp7eTEwAAAE445dKjqqqzk1x70oeuqqrqjiSf1XX9TlVVf5LkD6qqei3Ja0n+IMnBJP/uh8cFAGBUffBBsn59U3Rs2tQ8YzVs8uTk/vtL0XHDDY6QAwAAMKaczqbH3Um2nvT94Xscf5Hk7yX5V0nOSvJvksxN8mSS1XVd7z/9mAAAjIrjx5Onny7PVu3c2Tm/4ILmuaq+vmTVqmT27HZyAgAAwPdQ1fW33RdvR1VVs5Ps3bt3b2b7RTUAwMj7/PNkw4am5BgcTD75pMyqKlmwoNzm+PGPk56e9rICAAAw4e3bty9z5sxJkjl1Xe/7rs8d6ZseAACMNXWdvPRS2ebYvr3Z8Bg2Z06yZk1Tcqxbl8yf315WAAAA+AGUHgAA3ejgwWTLlnKE/J13Ouc331xucyxalEyZ0k5OAAAAGEFKDwCAbvHmm6Xk2Lo1OXSozKZPT5YvL89WXXllazEBAABgtCg9AADGq6NHk0cfbUqO/v7klVc655dfXrY5li1LZsxoJycAAACcIUoPAIDx5KOPkvXrm5Jj48Zk30n32yZNSu67rxQdN9/cHCYHAACACULpAQAwlg0NJc88U7Y5nn66c37++c3x8b6+ZNWqZO7cdnICAADAGKD0AAAYa/buTTZtakqO9eub7Y6T3XVXc5ejry9ZsCDp6WknJwAAAIwxSg8AgLbVdfKLXzQlR39/c6fj2LEynzWr2eLo62u2Oi66qL2sAAAAMIYpPQAA2nDoULJ1a3m26s03O+c33NCUHL29yf33J1OntpMTAAAAxhGlBwDAmfLuu2WbY/Pm5Kuvymzq1GTp0nKE/JprWosJAAAA45XSAwBgtBw7ljz+eNnmeOGFzvkll5SSY8WKZObMdnICAABAl1B6AACMpE8+SQYHm5Jjw4bk88/LrKcnWbiwFB233ZZUVXtZAQAAoMsoPQAAfoi6Tp57rik5BgaSJ55oPjbs3HOTtWubkmPNmmTevNaiAgAAQLdTegAAnKr9+5ubHMNFxwcfdM5vv70cIV+4MJk0qZ2cAAAAMMEoPQAAvo/XXitHyB9+ODlypMxmzEhWrixFx6WXtpcTAAAAJjClBwDANzl8uCk3hrc5Xnutc37NNeU2xwMPJNOnt5MTAAAA+GtKDwCAYe+/n6xf3xQdDz6YfPllmU2Z0pQbvb1N0XH99Y6QAwAAwBij9AAAJq7jx5OnnirPVj33XOf8wgtLybFyZTJ7disxAQAAgO9H6QEATCyffZZs2NCUHIODyaeflllVJffcU56tuuOOpKentagAAADAqVF6AADdra6TF15o7nL09yfbtydDQ2U+Z06yZk1Tcqxdm8yf315WAAAA4AdRegAA3efAgWTLlnKE/N13O+e33FK2ORYtSib7KREAAAB0A7/CBwC6wxtvlNsc27Ylhw+X2fTpyYoVTcnR25tccUVrMQEAAIDRo/QAAManI0eSxx4rRccvftE5v+KKss2xbFly1lnt5AQAAADOGKUHADB+7N6drF/flBwbNyb795fZpEnJ4sWl6LjppuYwOQAAADBhKD0AgLFraCjZsaPc5tixo3N+/vnNc1W9vcnq1ck557QSEwAAABgblB4AwNiyd2+zxdHf32x17NnTOb/rrrLNcffdSU9POzkBAACAMUfpAQC0q66TV14p2xyPPpocO1bms2Y1Wxx9fcm6dcmFF7aXFQAAABjTlB4AwJn31VfJtm3lCPlbb3XOb7ihbHMsXpxMndpGSgAAAGCcUXoAAGfGO++UkmPLlqb4GDZtWrJ0aVNy9PYm11zTWkwAAABg/FJ6AACj49ix5PHHS9Hx4oud80svLSXHihXJzJnt5AQAAAC6htIDABg5H3+cDA42JceGDckXX5RZT0/yk5+UZ6t+9KOkqlqLCgAAAHQfpQcAcPrqOtm5s2xzPPVU87Fh556brF3blBxr1iTz5rWXFQAAAOh6Sg8A4NTs359s2pQMDDR/ffhh5/yOO5onq/r6knvvTSZNaiUmAAAAMPEoPQCAX2/XrrLN8fDDydGjZTZzZrJyZbnPcckl7eUEAAAAJjSlBwDwqw4fTh56qCk5BgaSX/6yc37tteU2xwMPJNOmtZMTAAAA4CRKDwCg8d575cmqBx9MDhwosylTmnJjuOi4/vr2cgIAAAB8C6UHAExUx48nTz5Znq16/vnO+UUXldscK1cms2a1kxMAAADge1J6AMBE8tlnyeBgU3IMDjbfH1ZVzeHx4W2OO+5oPgYAAAAwTig9AKCb1XXy85+X2xyPP54MDZX5Oecka9c2Gx1r1ybnn99aVAAAAIAfSukBAN3mwIFk8+ZSdLz3Xuf81lvLNsdPfpJM9tMBAAAAoDv4XQ4A6Aavv15Kjm3bksOHy+yss5IVK5qSY9265IorWosJAAAAMJqUHgAwHh05kjz6aDlC/uqrnfOrrmpKjt7eZOnSpvgAAAAA6HJKDwAYL3bvbjY5+vuTTZuS/fvLbPLkZPHi8mzVjTc6Qg4AAABMOEoPABirhoaSHTvKNsczz3TO589vNjl6e5PVq5M5c9rJCQAAADBGKD0AYCz54otk48am5Fi/Pvn448753XeXbY677kp6elqJCQAAADAWKT0AoE11nbzyStnmePTR5PjxMp89u9ni6OtL1q5NLrywvawAAAAAY5zSAwDOtK++SrZubUqOgYHkrbc65zfeWLY5Fi9OpkxpJSYAAADAeKP0AIAz4e23S8mxZUtTfAybNi1ZtqwpOXp7k6uvbi8nAAAAwDim9ACA0XD0aPL44+XZqpde6pxfemnZ5li+PJk5s52cAAAAAF1E6QEAI+Xjj5vj4/39yYYNyd69ZdbTkyxaVIqOW29Nqqq9rAAAAABdSOkBAKdraCjZubNsczz9dHOYfNi8ecm6dU3JsXp1cu657WUFAAAAmACUHgBwKvbtSx58sNzn2L27c37nneU2xz33JJMmtZMTAAAAYAJSegDAd6nrZNeuss3xyCPNvY5hM2cmq1aVouPii9vLCgAAADDBKT0A4OsOHUoeeqhsc7z+euf8uuvKbY7770+mTWsnJwAAAAAdlB4AkCTvvdcUHP39zfNVBw+W2dSpyZIlzSZHX19TegAAAAAw5ig9AJiYjh9PnniiPFv18593zi++uJQcK1cmZ5/dTk4AAAAAvjelBwATx6efJoODzUbH4GDy2WdlVlXJwoXl2arbb28+BgAAAMC4ofQAoHvVdbPBMbzN8cQTydBQmc+dm6xd22x0rF2bnHdee1kBAAAA+MGUHgB0ly+/TDZvLkfI33+/c/6jH5VtjoULk8n+VQgAAADQLfxODwDj3+uvl22ObduSI0fKbMaMZMWKpuRYty65/PLWYgIAAAAwupQeAIw/R44kjzxSio5duzrnV11VtjmWLk2mT28lJgAAAABnltIDgPHhww+b56oGBpJNm5L9+8ts8uTk/vubkqO3N7nxRkfIAQAAACYgpQcAY9PQUPL002Wb49lnO+cXXNA8V9XXl6xalcyZ005OAAAAAMYMpQcAY8cXXyQbNjTbHOvXJx9/3DlfsKA8W/XjHyc9Pa3EBAAAAGBsUnoA0J66Tl56qSk5+vuTxx5Ljh8v89mzk9WryxHyCy5oLysAAAAAY57SA4Az6+DBZOvWpuQYGEjefrtzftNN5TbH4sXJlCnt5AQAAABg3FF6ADD63nqr3ObYujU5dKjMpk1Lli8vRcdVV7UWEwAAAIDxTekBwMg7erR5qmr42aqXX+6cX3ZZuc2xfHkyY0Y7OQEAAADoKkoPAEbGnj3N8fH+/mTjxmTv3jKbNClZtKgUHbfcklRVe1kBAAAA6EpKDwBOz9BQ8uyz5dmqHTuaw+TDzjuvOT7e19ccI587t72sAAAAAEwISg8Avr99+5otjoGB5q+PPuqc//jHzV2Ovr5kwYJmwwMAAAAAzpARLz2qqvqjJH/4tQ9/VNf1hSP9YwEwyuo6efXVss3xyCPJsWNlfvbZyapVTcmxbl1y8cXtZQUAAABgwhutTY+Xkqw86fvHR+nHAWCkHTqUbNvWlBwDA8kbb3TOr7++3OZYvDiZNq2VmAAAAADwdaNVehyr63r3KP2zARhp777bFBz9/cnmzcnBg2U2dWqyZEkpOq69tr2cAAAAAPAdRqv0uK6qqg+SHE7yZJI/qOv6jW/6xKqqpiU5+Y8JzxqlTAAMO3YseeKJ8mzVCy90zi+5pNzmWLGiecYKAAAAAMa40Sg9nkzyd5PsSnJBkn+SZHtVVbfUdf3pN3z+T/OrN0AAGGmffJIMDjYlx4YNyeefl1lPT7JwYVNy9PYmt9+eVFV7WQEAAADgNFR1XY/uD1BVM5O8nuRf1XX9s2+Yf9Omx3t79+7N7NmzRzUbQFer6+T558s2x5NPJkNDZT53brJ2bVN0rF2bzJvXXlYAAAAA+Bb79u3LnDlzkmROXdf7vutzR+t5q79W1/WBqqpeSHLdt8wPp3kGK0lS+ZPFAKfvyy+TBx8sR8g/+KBzfttt5TbHvfcmk0f9XwMAAAAAcMaM+u92ndjkuCnJI6P9YwFMSK+9Vo6QP/RQcuRImc2Y0dzkGH626rLL2ssJAAAAAKNsxEuPqqr+6yT/Kck7SeanuekxO8lfjPSPBTAhHTmSPPxwebbqtdc651dfXbY5lixJpk9vJycAAAAAnGGjselxaZJ/n+S8JB8neSLJwrqu3x6FHwtgYvjgg2T9+qbk2LSpecZq2OTJyQMPlG2OG25whBwAAACACWnES4+6rv/2SP8zASac48eTp58u2xw7d3bOL7igKTj6+pJVq5LZs9vJCQAAAABjiAu2AGPF558nGzY09znWr08++aTMqipZsKBsc/z4x0lPT3tZAQAAAGAMUnoAtKWuk5deKtsc27c3Gx7D5sxJ1qxpSo5165L589vLCgAAAADjgNID4Ew6eDDZsqUpOQYGknfe6ZzffHM5Qr5oUTJlSjs5AQAAAGAcUnoAjLa33irbHFu3JocOldn06cny5eXZqiuvbCslAAAAAIx7Sg+AkXb0aPLYY2Wb4+WXO+eXX162OZYtS2bMaCcnAAAAAHQZpQfASNizpzk+3t+fbNyY7N1bZpMmJffdV4qOm29uDpMDAAAAACNK6QFwOoaGkmefLc9W7djRHCYfdv75zfHxvr5k9erknHNaiwoAAAAAE4XSA+D72rev2eIYGGj++uijzvldd5XbHAsWJD097eQEAAAAgAlK6QHwbeo6efXVss3xyCPJsWNlPmtWsmpVU3SsW5dcdFF7WQEAAAAApQdAh0OHkm3byhHyN97onN9wQ7nNsXhxMnVqKzEBAAAAgF+l9AB4992m4OjvTzZvTg4eLLOpU5OlS0vRcc01rcUEAAAAAL6b0gOYeI4dS554ojxb9cILnfNLLiklx4oVycyZ7eQEAAAAAE6J0gOYGD75JBkcbEqODRuSzz8vs56eZOHCUnTcdltSVe1lBQAAAABOi9ID6E51nTz3XLnN8cQTzceGnXtusnZtU3KsWZPMm9daVAAAAABgZCg9gO7x5ZfJgw+WouODDzrnt9/elBy9vc1mx6RJ7eQEAAAAAEaF0gMY3157rdzmePjh5MiRMpsxI1m5shQdl17aXk4AAAAAYNQpPYDx5fDhptwY3uZ47bXO+dVXl9scS5Yk06e3kxMAAAAAOOOUHsDY98EHTcHR3988X/Xll2U2eXLywAOl6Lj+ekfIAQAAAGCCUnoAY8/x48lTT5Vtjp07O+cXXtg8V9XX1zxfNXt2OzkBAAAAgDFF6QGMDZ9/nmzY0BQdg4PJJ5+UWVUlCxaUbY4770x6etrLCgAAAACMSUoPoB11nbz4YjlCvn17MjRU5nPmJGvWNCXH2rXJ/PntZQUAAAAAxgWlB3DmHDyYbN5c7nO8+27n/JZbyrNVixYlU6a0kxMAAAAAGJeUHsDoevPNss2xdWty+HCZTZ+eLF/elBy9vcmVV7YWEwAAAAAY/5QewMg6ejR59NGyzfHKK53zK64otzmWLk1mzGglJgAAAADQfZQewA/30UfJ+vVNybFxY7JvX5lNmpTcd18pOm6+uTlMDgAAAAAwwpQewKkbGkqeeaY8W7VjR+f8/POTdeuaJ6tWr07mzm0nJwAAAAAwoSg9gO9n795mi6O/v9nq2LOnc37XXeU2x4IFSU9POzkBAAAAgAlL6QF8s7pu7nEM3+Z49NHk2LEynzUrWbWqKTrWrUsuuqi9rAAAAAAAUXoAJ/vqq2TbtvJs1Vtvdc5vuKHc5li8OJk6tY2UAAAAAADfSOkBE9077zQFx8BAsnlzU3wMmzo1WbasPFt1zTXt5QQAAAAA+DWUHjDRHDuWbN9enq168cXO+aWXNgVHX1+yYkUyc2Y7OQEAAAAATpHSAyaCjz9OBgebkmPDhuSLL8qspyf5yU/Ks1U/+lFSVa1FBQAAAAA4XUoP6EZ1nezcWW5zPPVU87Fh557bHB/v60tWr07mzWsvKwAAAADACFF6QLfYvz958MFyn+PDDzvnd9xRnq26995k0qRWYgIAAAAAjBalB4xnu3aVbY6HH06OHi2zmTOTlSvLEfJLLmkvJwAAAADAGaD0gPHk8OGm3BguOn75y875NdeU2xxLliTTprWTEwAAAACgBUoPGOvef795rqq/v3m+6sCBMpsyJXnggVJ0XH99ezkBAAAAAFqm9ICx5vjx5MknS9Hx3HOd84suKrc5Vq5MZs1qJSYAAAAAwFij9ICx4LPPkg0bmpJjcDD59NMyq6rknnvKNscddyQ9Pa1FBQAAAAAYq5Qe0Ia6Tl54oWxzbN+eDA2V+TnnJGvWNCXH2rXJ+ee3FhUAAAAAYLxQesCZcuBAsmVLU3IMDCTvvts5v/XW8mzVokXJZF+eAAAAAACnwu+qwmh6442m5OjvT7ZtSw4fLrOzzkqWL29Kjt7e5IorWosJAAAAANANlB4wko4cSR57rBQdv/hF5/zKK0vJsWxZU3wAAAAAADAilB7wQ+3enaxf35QcGzcm+/eX2aRJyeLF5Qj5TTc1h8kBAAAAABhxSg84VUNDyY4dZZvjmWc65/PnJ+vWNSXHqlXNUXIAAAAAAEad0gO+jy++aLY4BgaarY49ezrnd99dnq26++6kp6eVmAAAAAAAE5nSA75JXSevvFK2OR59NDl+vMxnz05Wr25KjnXrkgsvbC8rAAAAAABJlB5QfPVVsnVrU3IMDCRvvdU5v/HGcpvjvvuSqVNbiQkAAAAAwDdTejCxvf12KTm2bGmKj2HTpiXLlpVnq66+ur2cAAAAAAD8WkoPJpZjx5Lt28uzVS+91Dm/9NKyzbF8eTJzZjs5AQAAAAA4ZUoPut/HHzfHx/v7kw0bkr17y6ynJ1m0qBQdt96aVFV7WQEAAAAAOG1KD7rP0FCyc2fzZFV/f/LUU81h8mHz5jXHx/v6mmPk557bXlYAAAAAAEaM0oPusH9/smlTuc+xe3fn/I47yjbHPfckkya1EhMAAAAAgNGj9GB8qutk166yzfHww8nRo2U+c2ayalVTcqxbl1xySXtZAQAAAAA4I5QejB+HDycPPVSOkL/+euf82mvLNscDDyTTprWTEwAAAACAVig9GNvee69sc2zenBw4UGZTpiRLlpSi47rr2ssJAAAAAEDrlB6MLcePJ08+WbY5nn++c37RRUlvb1NyrFyZzJrVTk4AAAAAAMYcpQft++yzZHCwKTkGB5vvD6uq5N57yzbHHXc0HwMAAAAAgK9RenDm1XXy8583JcfAQPL448nQUJmfc06yZk1Tcqxdm5x/fmtRAQAAAAAYP5QenBkHDjQ3OYaLjvfe65zfemvZ5vjJT5LJ/qsJAAAAAMCp8TvLjJ7XXy+3ObZtS44cKbOzzkpWrGhKjt7e5PLLW4sJAAAAAEB3UHowco4cSR55pGxzvPpq5/yqq0rJsXRpU3wAAAAAAMAIUXrww3z4YVNwDAwkmzYl+/eX2eTJyeLF5dmqG290hBwAAAAAgFGj9ODUDA0lTz9dnq169tnO+fz5zSZHX1+yalUyZ047OQEAAAAAmHCUHvx6X3yRbNjQlByDg8nHH3fOFywoz1bddVfS09NKTAAAAAAAJjalB7+qrpOXXmqerOrvTx57LDl+vMxnz05Wr26KjnXrkgsuaC8rAAAAAACcoPSgcfBgsnVrOUL+9tud85tuKrc57rsvmTKlnZwAAAAAAPAtlB4T2VtvlZJjy5bk0KEymzYtWb683Oe46qrWYgIAAAAAwPeh9JhIjh5Ntm8vR8hffrlzftllZZtj+fJkxox2cgIAAAAAwGlQenS7PXuS9eubkmPjxmTv3jKbNClZtKgUHbfcklRVe1kBAAAAAOAHUHp0m6GhZOfOss3x9NPNYfJh8+Y1x8f7+pI1a5K5c9vLCgAAAAAAI2jUSo+qqn43yT9KclGSl5L8g7quHxmtH29C27cv2bSpKTnWr0927+6c33ln2eZYsKDZ8AAAAAAAgC4zKqVHVVW/meRPkvxukseS/BdJ1ldVdXNd1++Mxo85odR1smtX2eZ45JHmXsewmTOTVauakqO3N7n44vayAgAAAADAGVLVJz99NFL/0Kp6MsmzdV3/zkkfeyXJX9V1/dNf8/fOTrJ37969mT179ohnG7cOH062bStFxxtvdM6vu65sc9x/fzJtWisxAQAAAABgJO3bty9z5sxJkjl1Xe/7rs8d8U2PqqqmJrkryb/42mhjkkXf8PnTkpz8O/SzRjpTV9i5M1m7tnx/6tRkyZJmk6Ovryk9AAAAAABgAhuN563OSzIpyUdf+/hHSS78hs//aZI/HIUc3WXBguT225tv+/qSlSuTs89uOxUAAAAAAIwZo3bIPMnX382qvuFjSfLHSX520vdnJXlvtEKNW5MmJc8913YKAAAAAAAYs0aj9PgkyfH86lbH/Pzq9kfquj6c5PDw96uqGoVIAAAAAABAt+sZ6X9gXddHkjyTZNXXRquSbB/pHw8AAAAAACAZveetfpbkv6+qakeSx5P8dpLLk/w3o/TjAQAAAAAAE9yolB51Xf+PVVXNS/JfJbkoyYtJeuu6fns0fjwAAAAAAIBRO2Re1/W/SfJvRuufDwAAAAAAcLIRv+kBAAAAAADQBqUHAAAAAADQFZQeAAAAAABAV1B6AAAAAAAAXUHpAQAAAAAAdAWlBwAAAAAA0BWUHgAAAAAAQFdQegAAAAAAAF1B6QEAAAAAAHQFpQcAAAAAANAVlB4AAAAAAEBXUHoAAAAAAABdYXLbAb7Nvn372o4AAAAAAAC07FT6gqqu61GMcuqqqrokyXtt5wAAAAAAAMaUS+u6fv+7PmEslh5VkouT7G87yxg0K00hdGn83wfONF9/0B5ff9AuX4PQHl9/0B5ff9AuX4N8k1lJPqh/Takx5p63OhH4O5uaiarpg5Ik++u69v4XnEG+/qA9vv6gXb4GoT2+/qA9vv6gXb4G+Rbf678LDpkDAAAAAABdQekBAAAAAAB0BaXH+HI4yf/hxLfAmeXrD9rj6w/a5WsQ2uPrD9rj6w/a5WuQ0zbmDpkDAAAAAACcDpseAAAAAABAV1B6AAAAAAAAXUHpAQAAAAAAdAWlBwAAAAAA0BWUHgAAAAAAQFdQeowTVVX9blVVb1ZVdaiqqmeqqrq/7UwwEVRV9dOqqp6uqmp/VVV7qqr6q6qqbmg7F0xEJ74e66qq/qTtLDARVFV1SVVV/8+qqj6tqupgVVXPVVV1V9u5YCKoqmpyVVX/pxO/Bvyqqqo3qqr6r6qq8mt4GGFVVT1QVdV/qqrqgxM/1/yffW1eVVX1RyfmX1VVta2qqltaigtd5bu+/qqqmlJV1b+squqFqqoOnPic/66qqotbjMw44SdM40BVVb+Z5E+S/LMkdyZ5JMn6qqoubzMXTBBLkvxZkoVJViWZnGRjVVUzW00FE0xVVQuS/HaSn7edBSaCqqrmJnksydEk65LcnOR/n+SLFmPBRPL7Sf43Sf7LJDcl+b0k/yjJ/7bNUNClZiZ5Ps3X2zf5vST/8MR8QZLdSTZVVTXrzMSDrvZdX38zkvw4yT898e3fSnJ9kv/vGUvHuFXVdd12Bn6NqqqeTPJsXde/c9LHXknyV3Vd/7S9ZDDxVFV1fpI9SZbUdf1w23lgIqiq6uwkzyb53ST/JMlzdV3/g1ZDQZerqupfJLmvrmvbxdCCqqr+f0k+quv6f3XSx/4yycG6rv+X7SWD7lZVVZ3kN+q6/qsT36+SfJDkT+q6/pcnPjYtyUdJfr+u63/bVlboNl//+vuWz1mQ5KkkV9R1/c6Zysb4Y9NjjKuqamqSu5Js/NpoY5JFZz4RTHhzTnz7WaspYGL5syT9dV0/2HYQmED+RpIdVVX9hxPPO+6squp/3XYomEAeTbKiqqrrk6SqqtuTLE4y0GoqmHiuSnJhTvo9mbquDyd5KH5PBtowJ0kd28f8GpPbDsCvdV6SSWn+FMHJPkrzL17gDDnxp3x+luTRuq5fbDsPTARVVf3tNKvMC9rOAhPM1Ul+J82/9/55knuS/N+qqjpc1/V/12oymBj+ZZrf2PlFVVXH0/ya8B/Xdf3v240FE87w77t80+/JXHGGs8CEVlXV9CT/Ism/q+t6X9t5GNuUHuPH198hq77hY8Do+tdJbkvzp+yAUVZV1WVJ/q9JVtd1fajtPDDB9CTZUdf1H5z4/s4TR1t/J4nSA0bfbyb5XyT5O0leSnJHkj+pquqDuq7/os1gMEH5PRloUVVVU5L8D2l+jvq7LcdhHFB6jH2fJDmeX93qmJ9f/ZMGwCipqupP0zz18UBd1++1nQcmiLvS/PvumWbRKknzJ10fqKrqv0wyra7r422Fgy73YZKXv/axV5L8z1vIAhPR/znJv6jr+n848f0Xqqq6IslPkyg94MzZfeLbC9P8u3GY35OBM+RE4fH/TvPc3HJbHnwfbnqMcXVdH0nyTJJVXxutSrL9zCeCiaVq/OskfyvNv1zfbDsTTCCbk/wozZ9uHf5rR5L/V5I7FB4wqh5LcsPXPnZ9krdbyAIT0YwkQ1/72PH4NTycaW+mKT7++vdkTtxeXRK/JwOj7qTC47okK+u6/rTlSIwTNj3Gh58l+e+rqtqR5PEkv53k8iT/TaupYGL4szTPCvzNJPurqhreutpb1/VX7cWC7lfX9f4kHfdzqqo6kORTd3Vg1P1fkmyvquoP0vxC8540Pwf97VZTwcTxn5L846qq3knzvNWdSf5hkv9Hq6mgC1VVdXaSa0/60FVVVd2R5LO6rt+pqupPkvxBVVWvJXktyR8kOZjk353prNBtvuvrL8kHSf4/aW48/mdJJp30ezKfnfiD4vCNqrr2BOF4UFXV7yb5vSQXpfkNoP9dXdcPt5sKul9VVd/2P5K/Vdf1n5/JLEBSVdW2JM/Vdf0PWo4CXa+qqv8syR+n+ZN1byb5WV3X//d2U8HEUFXVrCT/NMlvpHlG54Mk/z7J/9Fv8sDIqqpqaZKt3zD6i7qu/17VvLP6h0n+iyRzkzyZ5O/7Qzjww33X11+SP0rzc9Bvsqyu622jEoquoPQAAAAAAAC6gvdAAQAAAACArqD0AAAAAAAAuoLSAwAAAAAA6ApKDwAAAAAAoCsoPQAAAAAAgK6g9AAAAAAAALqC0gMAAAAAAOgKSg8AAAAAAKArKD0AAAAAAICuoPQAAAAAAAC6gtIDAAAAAADoCv9/1MXeuKac8eEAAAAASUVORK5CYII=\n",
- "text/plain": [
- "<Figure size 2000x600 with 1 Axes>"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "do_plot(is_sin = False)"
- ]
-},'
-
-base = '{
- "cells": [
- <<>>{
- "cell_type": "markdown",
- "id": "1",
- "metadata": {
- "tags": [
- "hello",
- "world"
- ]
- },
- "source": [
- "# A\n",
- "\n",
- "B"
- ]
- }
- ],
- "metadata": {
- }
-}'
-
-SMALL_NOTEBOOK = base.gsub('<<>>', large_cell)
-LARGE_NOTEBOOK = base.gsub('<<>>', Array.new(100, large_cell).join("\n"))
-
-puts "Small Notebook: #{SMALL_NOTEBOOK.bytesize}"
-puts "Large Notebook: #{LARGE_NOTEBOOK.bytesize}"
-
-def cases(benchmark_runner)
- benchmark_runner.report('small_notebook') { IpynbDiff.transform(SMALL_NOTEBOOK) }
- benchmark_runner.report('large_notebook') { IpynbDiff.transform(LARGE_NOTEBOOK) }
-end
-
-Benchmark.benchmark { |x| cases(x) }
-Benchmark.memory { |x| cases(x) }
diff --git a/vendor/gems/ipynbdiff/spec/ipynbdiff_spec.rb b/vendor/gems/ipynbdiff/spec/ipynbdiff_spec.rb
deleted file mode 100644
index 1c2a2188edf..00000000000
--- a/vendor/gems/ipynbdiff/spec/ipynbdiff_spec.rb
+++ /dev/null
@@ -1,126 +0,0 @@
-# frozen_string_literal: true
-
-require 'ipynbdiff'
-require 'rspec'
-require 'rspec-parameterized'
-
-BASE_PATH = File.join(File.expand_path(File.dirname(__FILE__)), 'testdata')
-
-describe IpynbDiff do
- def diff_signs(diff)
- diff.to_s(:text).scan(/.*\n/).map { |l| l[0] }.join('')
- end
-
- describe 'diff' do
- let(:from_path) { File.join(BASE_PATH, 'from.ipynb') }
- let(:to_path) { File.join(BASE_PATH,'to.ipynb') }
- let(:from) { File.read(from_path) }
- let(:to) { File.read(to_path) }
- let(:include_frontmatter) { false }
- let(:hide_images) { false }
-
- subject { IpynbDiff.diff(from, to, include_frontmatter: include_frontmatter, hide_images: hide_images) }
-
- context 'if preprocessing is active' do
- it 'html tables are stripped' do
- is_expected.to_not include('<td>')
- end
- end
-
- context 'when to is nil' do
- let(:to) { nil }
- let(:from_path) { File.join(BASE_PATH, 'only_md', 'input.ipynb') }
-
- it 'all lines are removals' do
- expect(diff_signs(subject)).to eq('-----')
- end
- end
-
- context 'when to is nil' do
- let(:from) { nil }
- let(:to_path) { File.join(BASE_PATH, 'only_md', 'input.ipynb') }
-
- it 'all lines are additions' do
- expect(diff_signs(subject)).to eq('+++++')
- end
- end
-
- context 'When include_frontmatter is true' do
- let(:include_frontmatter) { true }
-
- it 'should show changes metadata in the metadata' do
- expect(subject.to_s(:text)).to include('+ display_name: New Python 3 (ipykernel)')
- end
- end
-
- context 'When hide_images is true' do
- let(:hide_images) { true }
-
- it 'hides images' do
- expect(subject.to_s(:text)).to include(' [Hidden Image Output]')
- end
- end
-
- context 'When include_frontmatter is false' do
- it 'should drop metadata from the diff' do
- expect(subject.to_s(:text)).to_not include('+ display_name: New Python 3 (ipykernel)')
- end
- end
-
- context 'when either notebook can not be processed' do
- using RSpec::Parameterized::TableSyntax
-
- where(:ctx, :from, :to) do
- 'because from is invalid' | 'a' | nil
- 'because from does not have the cell tag' | '{"metadata":[]}' | nil
- 'because to is invalid' | nil | 'a'
- 'because to does not have the cell tag' | nil | '{"metadata":[]}'
- end
-
- with_them do
- it { is_expected.to be_nil }
- end
- end
- end
-
- describe 'transform' do
- [nil, 'a', '{"metadata":[]}'].each do |invalid_nb|
- context "when json is invalid (#{invalid_nb || 'nil'})" do
- it 'is nil' do
- expect(IpynbDiff.transform(invalid_nb)).to be_nil
- end
- end
- end
-
- context 'options' do
- let(:include_frontmatter) { false }
- let(:hide_images) { false }
-
- subject do
- IpynbDiff.transform(File.read(File.join(BASE_PATH, 'from.ipynb')),
- include_frontmatter: include_frontmatter,
- hide_images: hide_images)
- end
-
- context 'include_frontmatter is false' do
- it { is_expected.to_not include('display_name: Python 3 (ipykernel)') }
- end
-
- context 'include_frontmatter is true' do
- let(:include_frontmatter) { true }
-
- it { is_expected.to include('display_name: Python 3 (ipykernel)') }
- end
-
- context 'hide_images is false' do
- it { is_expected.not_to include('[Hidden Image Output]') }
- end
-
- context 'hide_images is true' do
- let(:hide_images) { true }
-
- it { is_expected.to include(' [Hidden Image Output]') }
- end
- end
- end
-end
diff --git a/vendor/gems/ipynbdiff/spec/symbol_map_spec.rb b/vendor/gems/ipynbdiff/spec/symbol_map_spec.rb
deleted file mode 100644
index 5fba47c85af..00000000000
--- a/vendor/gems/ipynbdiff/spec/symbol_map_spec.rb
+++ /dev/null
@@ -1,58 +0,0 @@
-# frozen_string_literal: true
-
-require 'rspec'
-require 'json'
-require 'rspec-parameterized'
-require 'symbol_map'
-
-describe IpynbDiff::SymbolMap do
- def res(*cases)
- cases&.to_h || []
- end
-
- describe '#parse' do
- subject { IpynbDiff::SymbolMap.parse(JSON.pretty_generate(source)) }
-
- context 'Object with blank key' do
- let(:source) { { "": { "": 5 } }}
-
- it { is_expected.to match_array(res([".", 2], ["..", 3])) }
- end
-
- context 'Empty object' do
- let(:source) { {} }
-
- it { is_expected.to be_empty }
- end
-
- context 'Empty array' do
- let(:source) { [] }
-
- it { is_expected.to be_empty }
- end
-
- context 'Object with inner object and number' do
- let(:source) { { obj1: { obj2: 1 } } }
-
- it { is_expected.to match_array(res( ['.obj1', 2], ['.obj1.obj2', 3])) }
- end
-
- context 'Object with inner object and number, string and array with object' do
- let(:source) { { obj1: { obj2: [123, 2, true], obj3: "hel\nlo", obj4: true, obj5: 123, obj6: 'a' } } }
-
- it do
- is_expected.to match_array(
- res(['.obj1', 2],
- ['.obj1.obj2', 3],
- ['.obj1.obj2.0', 4],
- ['.obj1.obj2.1', 5],
- ['.obj1.obj2.2', 6],
- ['.obj1.obj3', 8],
- ['.obj1.obj4', 9],
- ['.obj1.obj5', 10],
- ['.obj1.obj6', 11])
- )
- end
- end
- end
-end
diff --git a/vendor/gems/ipynbdiff/spec/test_helper.rb b/vendor/gems/ipynbdiff/spec/test_helper.rb
deleted file mode 100644
index f9c416885a1..00000000000
--- a/vendor/gems/ipynbdiff/spec/test_helper.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-BASE_PATH = File.join(File.expand_path(File.dirname(__FILE__)), 'testdata')
-
-FROM_PATH = File.join(BASE_PATH, 'from.ipynb')
-TO_PATH = File.join(BASE_PATH, 'to.ipynb')
-
-FROM_IPYNB = File.read(FROM_PATH)
-TO_IPYNB = File.read(TO_PATH)
-
-def input_for_test(test_case)
- File.join(BASE_PATH, test_case, 'input.ipynb')
-end
-
-def expected_symbols(test_case)
- File.join(BASE_PATH, test_case, 'expected_symbols.txt')
-end
-
-def expected_md(test_case)
- File.join(BASE_PATH, test_case, 'expected.md')
-end
-
-def expected_line_numbers(test_case)
- File.join(BASE_PATH, test_case, 'expected_line_numbers.txt')
-end
diff --git a/vendor/gems/ipynbdiff/spec/transformer_spec.rb b/vendor/gems/ipynbdiff/spec/transformer_spec.rb
deleted file mode 100644
index 660d0a2bd79..00000000000
--- a/vendor/gems/ipynbdiff/spec/transformer_spec.rb
+++ /dev/null
@@ -1,117 +0,0 @@
-# frozen_string_literal: true
-
-require 'rspec'
-require 'ipynbdiff'
-require 'json'
-require 'rspec-parameterized'
-
-TRANSFORMER_BASE_PATH = File.join(File.expand_path(File.dirname(__FILE__)), 'testdata')
-
-def read_file(*paths)
- File.read(File.join(TRANSFORMER_BASE_PATH, *paths))
-end
-
-def default_config
- @default_config ||= {
- include_frontmatter: false,
- hide_images: false
- }
-end
-
-def from_ipynb
- @from_ipynb ||= read_file('from.ipynb')
-end
-
-def read_notebook(input_path)
- read_file(input_path, 'input.ipynb')
-rescue Errno::ENOENT
- from_ipynb
-end
-
-describe IpynbDiff::Transformer do
- describe 'When notebook is valid' do
- using RSpec::Parameterized::TableSyntax
-
- where(:ctx, :test_case, :config) do
- 'renders metadata' | 'no_cells' | { include_frontmatter: true }
- 'is empty for no cells, but metadata is false' | 'no_cells_no_metadata' | {}
- 'adds markdown cell' | 'only_md' | {}
- 'adds block with only one line of markdown' | 'single_line_md' | {}
- 'adds raw block' | 'only_raw' | {}
- 'code cell, but no output' | 'only_code' | {}
- 'code cell, but no language' | 'only_code_no_language' | {}
- 'code cell, but no kernelspec' | 'only_code_no_kernelspec' | {}
- 'code cell, but no nb metadata' | 'only_code_no_metadata' | {}
- 'text output' | 'text_output' | {}
- 'ignores html output' | 'ignore_html_output' | {}
- 'extracts png output along with text' | 'text_png_output' | {}
- 'embeds svg as image' | 'svg' | {}
- 'extracts latex output' | 'latex_output' | {}
- 'extracts error output' | 'error_output' | {}
- 'does not fetch tags if there is no cell metadata' | 'no_metadata_on_cell' | {}
- 'generates :percent decorator' | 'percent_decorator' | {}
- 'parses stream output' | 'stream_text' | {}
- 'ignores unknown output type' | 'unknown_output_type' | {}
- 'handles backslash correctly' | 'backslash_as_last_char' | {}
- 'multiline png output' | 'multiline_png_output' | {}
- 'hides images when option passed' | 'hide_images' | { hide_images: true }
- '\n within source lines' | 'source_with_linebreak' | { hide_images: true }
- end
-
- with_them do
- let(:expected_md) { read_file(test_case, 'expected.md') }
- let(:expected_symbols) { read_file(test_case, 'expected_symbols.txt') }
- let(:input) { read_notebook(test_case) }
- let(:transformed) { IpynbDiff::Transformer.new(**default_config.merge(config)).transform(input) }
-
- it 'generates the expected markdown' do
- expect(transformed.as_text).to eq expected_md
- end
-
- it 'marks the lines correctly' do
- blocks = transformed.blocks.map { |b| b[:source_symbol] }.join("\n")
- result = expected_symbols
-
- expect(blocks).to eq result
- end
- end
- end
-
- it 'generates the correct transformed to source line map' do
- input = read_file('text_png_output', 'input.ipynb' )
- expected_line_numbers = read_file('text_png_output', 'expected_line_numbers.txt' )
-
- transformed = IpynbDiff::Transformer.new(**{ include_frontmatter: false }).transform(input)
-
- line_numbers = transformed.blocks.map { |b| b[:source_line] }.join("\n")
-
- expect(line_numbers).to eq(expected_line_numbers)
-
- end
-
- context 'When the notebook is invalid' do
- [
- ['because the json is invalid', 'a'],
- ['because it doesnt have the cell tag', '{"metadata":[]}']
- ].each do |ctx, notebook|
- context ctx do
- it 'raises error' do
- expect do
- IpynbDiff::Transformer.new.transform(notebook)
- end.to raise_error(IpynbDiff::InvalidNotebookError)
- end
- end
- end
-
- context 'when notebook can not be parsed' do
- it 'raises error' do
- notebook = '{"cells":[]}'
- allow(Oj::Parser.usual).to receive(:parse).and_return(nil)
-
- expect do
- IpynbDiff::Transformer.new.transform(notebook)
- end.to raise_error(IpynbDiff::InvalidNotebookError)
- end
- end
- end
-end
diff --git a/vendor/gems/mail-smtp_pool/.gitlab-ci.yml b/vendor/gems/mail-smtp_pool/.gitlab-ci.yml
index dee865f3cd6..260bc1aaa1f 100644
--- a/vendor/gems/mail-smtp_pool/.gitlab-ci.yml
+++ b/vendor/gems/mail-smtp_pool/.gitlab-ci.yml
@@ -1,28 +1,10 @@
-workflow:
- rules:
- - if: $CI_MERGE_REQUEST_ID
+include:
+ - local: gems/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "mail-smtp_pool"
+ gem_path_prefix: "vendor/gems/"
-.rspec:
- cache:
- key: mail-smtp_pool-ruby
- paths:
- - vendor/gems/mail-smtp_pool/vendor/ruby
- before_script:
- - cd vendor/gems/mail-smtp_pool
- - ruby -v # Print out ruby version for debugging
- - gem install bundler --no-document # Bundler is not installed with the image
- - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby
- - bundle config set with 'development'
- - bundle config set --local frozen 'true' # Disallow Gemfile.lock changes on CI
- - bundle config # Show bundler configuration
- - bundle install -j $(nproc)
- script:
- - bundle exec rspec
-
-rspec-2.7:
- image: "ruby:2.7"
- extends: .rspec
-
-rspec-3.0:
- image: "ruby:3.0"
- extends: .rspec
+rspec:
+ parallel:
+ matrix:
+ - RUBY_VERSION: ["3.0"] # 3.1 & 3.2 aren't supported yet
diff --git a/vendor/gems/microsoft_graph_mailer/.gitlab-ci.yml b/vendor/gems/microsoft_graph_mailer/.gitlab-ci.yml
index 1b10debb1b9..d1055958749 100644
--- a/vendor/gems/microsoft_graph_mailer/.gitlab-ci.yml
+++ b/vendor/gems/microsoft_graph_mailer/.gitlab-ci.yml
@@ -1,32 +1,5 @@
-workflow:
- rules:
- - if: $CI_MERGE_REQUEST_ID
-
-.rspec:
- cache:
- key: microsoft_graph_mailer-ruby
- paths:
- - vendor/gems/microsoft_graph_mailer/vendor/ruby
- before_script:
- - cd vendor/gems/microsoft_graph_mailer
- - ruby -v # Print out ruby version for debugging
- - gem install bundler --no-document # Bundler is not installed with the image
- - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby
- - bundle config set with 'development'
- - bundle config set --local frozen 'true' # Disallow Gemfile.lock changes on CI
- - bundle config # Show bundler configuration
- - bundle install -j $(nproc)
- script:
- - bundle exec rspec
-
-rspec-2.7:
- image: "ruby:2.7"
- extends: .rspec
-
-rspec-3.0:
- image: "ruby:3.0"
- extends: .rspec
-
-rspec-3.1:
- image: "ruby:3.1"
- extends: .rspec
+include:
+ - local: gems/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "microsoft_graph_mailer"
+ gem_path_prefix: "vendor/gems/"
diff --git a/vendor/gems/omniauth-azure-oauth2/.gitlab-ci.yml b/vendor/gems/omniauth-azure-oauth2/.gitlab-ci.yml
index 816b868915f..b49143ebd33 100644
--- a/vendor/gems/omniauth-azure-oauth2/.gitlab-ci.yml
+++ b/vendor/gems/omniauth-azure-oauth2/.gitlab-ci.yml
@@ -1,36 +1,5 @@
-workflow:
- rules:
- - if: $CI_MERGE_REQUEST_ID
-
-.rspec:
- cache:
- key: omniauth-azure-oauth2
- paths:
- - vendor/gems/omniauth-azure-oauth2/vendor/ruby
- before_script:
- - cd vendor/gems/omniauth-azure-oauth2
- - ruby -v # Print out ruby version for debugging
- - gem install bundler --no-document # Bundler is not installed with the image
- - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby
- - bundle config set with 'development'
- - bundle config set --local frozen 'true' # Disallow Gemfile.lock changes on CI
- - bundle config # Show bundler configuration
- - bundle install -j $(nproc)
- script:
- - bundle exec rspec
-
-rspec-2.7:
- image: "ruby:2.7"
- extends: .rspec
-
-rspec-3.0:
- image: "ruby:3.0"
- extends: .rspec
-
-rspec-3.1:
- image: "ruby:3.1"
- extends: .rspec
-
-rspec-3.2:
- image: "ruby:3.2"
- extends: .rspec
+include:
+ - local: gems/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "omniauth-azure-oauth2"
+ gem_path_prefix: "vendor/gems/"
diff --git a/vendor/gems/omniauth-gitlab/.gitlab-ci.yml b/vendor/gems/omniauth-gitlab/.gitlab-ci.yml
index a802029c008..10382723643 100644
--- a/vendor/gems/omniauth-gitlab/.gitlab-ci.yml
+++ b/vendor/gems/omniauth-gitlab/.gitlab-ci.yml
@@ -1,36 +1,5 @@
-workflow:
- rules:
- - if: $CI_MERGE_REQUEST_ID
-
-.rspec:
- cache:
- key: omniauth-gitlab-ruby
- paths:
- - vendor/gems/omniauth-gitlab/vendor/ruby
- before_script:
- - cd vendor/gems/omniauth-gitlab
- - ruby -v # Print out ruby version for debugging
- - gem install bundler --no-document # Bundler is not installed with the image
- - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby
- - bundle config set with 'development'
- - bundle config set --local frozen 'true' # Disallow Gemfile.lock changes on CI
- - bundle config # Show bundler configuration
- - bundle install -j $(nproc)
- script:
- - bundle exec rspec
-
-rspec-2.7:
- image: "ruby:2.7"
- extends: .rspec
-
-rspec-3.0:
- image: "ruby:3.0"
- extends: .rspec
-
-rspec-3.1:
- image: "ruby:3.1"
- extends: .rspec
-
-rspec-3.2:
- image: "ruby:3.2"
- extends: .rspec
+include:
+ - local: gems/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "omniauth-gitlab"
+ gem_path_prefix: "vendor/gems/"
diff --git a/vendor/gems/omniauth-salesforce/.gitlab-ci.yml b/vendor/gems/omniauth-salesforce/.gitlab-ci.yml
index 15e7392e46b..bd630fbdcd0 100644
--- a/vendor/gems/omniauth-salesforce/.gitlab-ci.yml
+++ b/vendor/gems/omniauth-salesforce/.gitlab-ci.yml
@@ -1,36 +1,5 @@
-workflow:
- rules:
- - if: $CI_MERGE_REQUEST_ID
-
-.rspec:
- cache:
- key: omniauth-salesforce
- paths:
- - vendor/gems/omniauth-salesforce/vendor/ruby
- before_script:
- - cd vendor/gems/omniauth-salesforce
- - ruby -v # Print out ruby version for debugging
- - gem install bundler --no-document # Bundler is not installed with the image
- - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby
- - bundle config set with 'development'
- - bundle config set --local frozen 'true' # Disallow Gemfile.lock changes on CI
- - bundle config # Show bundler configuration
- - bundle install -j $(nproc)
- script:
- - bundle exec rspec
-
-rspec-2.7:
- image: "ruby:2.7"
- extends: .rspec
-
-rspec-3.0:
- image: "ruby:3.0"
- extends: .rspec
-
-rspec-3.1:
- image: "ruby:3.1"
- extends: .rspec
-
-rspec-3.2:
- image: "ruby:3.2"
- extends: .rspec
+include:
+ - local: gems/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "omniauth-salesforce"
+ gem_path_prefix: "vendor/gems/"
diff --git a/vendor/gems/omniauth_crowd/.gitlab-ci.yml b/vendor/gems/omniauth_crowd/.gitlab-ci.yml
index ddc5d2fa5c3..9265f7a04a0 100644
--- a/vendor/gems/omniauth_crowd/.gitlab-ci.yml
+++ b/vendor/gems/omniauth_crowd/.gitlab-ci.yml
@@ -1,36 +1,5 @@
-workflow:
- rules:
- - if: $CI_MERGE_REQUEST_ID
-
-.rspec:
- cache:
- key: omniauth_crowd
- paths:
- - vendor/gems/omniauth_crowd/vendor/ruby
- before_script:
- - cd vendor/gems/omniauth_crowd
- - ruby -v # Print out ruby version for debugging
- - gem install bundler --no-document # Bundler is not installed with the image
- - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby
- - bundle config set with 'development'
- - bundle config set --local frozen 'true' # Disallow Gemfile.lock changes on CI
- - bundle config # Show bundler configuration
- - bundle install -j $(nproc)
- script:
- - bundle exec rspec
-
-rspec-2.7:
- image: "ruby:2.7"
- extends: .rspec
-
-rspec-3.0:
- image: "ruby:3.0"
- extends: .rspec
-
-rspec-3.1:
- image: "ruby:3.1"
- extends: .rspec
-
-rspec-3.2:
- image: "ruby:3.2"
- extends: .rspec
+include:
+ - local: gems/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "omniauth_crowd"
+ gem_path_prefix: "vendor/gems/"
diff --git a/vendor/gems/sidekiq-reliable-fetch/.gitlab-ci.yml b/vendor/gems/sidekiq-reliable-fetch/.gitlab-ci.yml
index b87a454bccc..9df01687447 100644
--- a/vendor/gems/sidekiq-reliable-fetch/.gitlab-ci.yml
+++ b/vendor/gems/sidekiq-reliable-fetch/.gitlab-ci.yml
@@ -1,77 +1,54 @@
-workflow:
- rules:
- - if: $CI_MERGE_REQUEST_ID
-
-default:
- image: ruby:3.0
-
-before_script:
- - cd vendor/gems/sidekiq-reliable-fetch
- - ruby -v
- - which ruby
- - gem install bundler
- - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby
- - bundle config set with 'development' # This is set to 'deployment' otherwise
- - bundle config set --local frozen 'true' # Disallow Gemfile.lock changes on CI
- - bundle config # Show bundler configuration
- - bundle install --jobs $(nproc) "${FLAGS[@]}"
-
-variables:
- REDIS_URL: "redis://redis"
+include:
+ - local: gems/gem.gitlab-ci.yml
+ inputs:
+ gem_name: "sidekiq-reliable-fetch"
+ gem_path_prefix: "vendor/gems/"
rspec:
- stage: test
- coverage: '/LOC \((\d+\.\d+%)\) covered.$/'
- script:
- - bundle exec rspec
+ extends:
+ - .with_redis
+ parallel:
+ matrix:
+ - RUBY_VERSION: ["3.0", "3.1"] # 3.2 isn't supported yet
+
+.with_redis:
services:
- redis:alpine
- artifacts:
- expire_in: 31d
- when: always
- paths:
- - coverage/
+ variables:
+ REDIS_URL: "redis://redis"
-.integration:
- stage: test
+.reliability:
+ extends:
+ - .with_redis
+ - .ruby_matrix
script:
- cd tests/reliability
- bundle exec ruby reliability_test.rb
- services:
- - redis:alpine
integration_semi:
- extends: .integration
+ extends: .reliability
variables:
JOB_FETCHER: semi
integration_reliable:
- extends: .integration
+ extends: .reliability
variables:
JOB_FETCHER: reliable
-integration_basic:
- extends: .integration
- allow_failure: yes
- variables:
- JOB_FETCHER: basic
-
-kill_interruption:
- stage: test
+.interruption:
+ extends:
+ - .with_redis
+ - .ruby_matrix
script:
- cd tests/interruption
- - bundle exec ruby test_kill_signal.rb
- services:
- - redis:alpine
+ - bundle exec ruby "test_${SIGNAL}_signal.rb"
-term_interruption:
- stage: test
- script:
- - cd tests/interruption
- - bundle exec ruby test_term_signal.rb
- services:
- - redis:alpine
+kill_interruption:
+ extends: .interruption
+ variables:
+ SIGNAL: kill
-# rubocop:
-# script:
-# - bundle exec rubocop
+term_interruption:
+ extends: .interruption
+ variables:
+ SIGNAL: term
diff --git a/vendor/gems/sidekiq-reliable-fetch/lib/sidekiq/base_reliable_fetch.rb b/vendor/gems/sidekiq-reliable-fetch/lib/sidekiq/base_reliable_fetch.rb
index e9c9f050982..39b98a0109f 100644
--- a/vendor/gems/sidekiq-reliable-fetch/lib/sidekiq/base_reliable_fetch.rb
+++ b/vendor/gems/sidekiq-reliable-fetch/lib/sidekiq/base_reliable_fetch.rb
@@ -57,6 +57,11 @@ module Sidekiq
Sidekiq.logger.info('GitLab reliable fetch activated!')
+ # Set the heartbeat immediately to prevent a race condition where
+ # worker_dead? returns true in another thread. `start_heartbeat_thread`
+ # isn't guaranteed to have run before Sidekiq attempts to fetch jobs.
+ heartbeat
+
start_heartbeat_thread
end
diff --git a/vendor/project_templates/typo3_distribution.tar.gz b/vendor/project_templates/typo3_distribution.tar.gz
index 13c158d1462..1de92d781af 100644
--- a/vendor/project_templates/typo3_distribution.tar.gz
+++ b/vendor/project_templates/typo3_distribution.tar.gz
Binary files differ
diff --git a/workhorse/.tool-versions b/workhorse/.tool-versions
index e8249f49e4f..bf7f6cc9184 100644
--- a/workhorse/.tool-versions
+++ b/workhorse/.tool-versions
@@ -1 +1 @@
-golang 1.20.5
+golang 1.20.6
diff --git a/workhorse/Makefile b/workhorse/Makefile
index ac6c5456340..267eaa47b57 100644
--- a/workhorse/Makefile
+++ b/workhorse/Makefile
@@ -34,8 +34,6 @@ ifeq (${FIPS_MODE}, 1)
endif
endif
-MINIMUM_SUPPORTED_GO_VERSION := 1.11
-
export GOBIN := $(TARGET_DIR)/bin
export PATH := $(GOBIN):$(PATH)
export GOPROXY ?= https://proxy.golang.org
@@ -189,7 +187,7 @@ check-formatting: install-goimports
staticcheck:
$(call message,Verify: $@)
go install honnef.co/go/tools/cmd/staticcheck
- @ $(GOBIN)/staticcheck -go $(MINIMUM_SUPPORTED_GO_VERSION) ./...
+ @ $(GOBIN)/staticcheck ./...
# In addition to fixing imports, goimports also formats your code in the same style as gofmt
# so it can be used as a replacement.
diff --git a/workhorse/go.mod b/workhorse/go.mod
index 7d5e0143dab..d07786dd721 100644
--- a/workhorse/go.mod
+++ b/workhorse/go.mod
@@ -4,9 +4,9 @@ go 1.18
require (
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0
- github.com/BurntSushi/toml v1.3.0
+ github.com/BurntSushi/toml v1.3.2
github.com/FZambia/sentinel v1.1.1
- github.com/alecthomas/chroma/v2 v2.7.0
+ github.com/alecthomas/chroma/v2 v2.8.0
github.com/aws/aws-sdk-go v1.44.256
github.com/disintegration/imaging v1.6.2
github.com/getsentry/raven-go v0.2.0
@@ -20,30 +20,30 @@ require (
github.com/johannesboyne/gofakes3 v0.0.0-20230506070712-04da935ef877
github.com/jpillora/backoff v1.0.0
github.com/mitchellh/copystructure v1.2.0
- github.com/prometheus/client_golang v1.15.1
+ github.com/prometheus/client_golang v1.16.0
github.com/rafaeljusto/redigomock/v3 v3.1.2
github.com/sebest/xff v0.0.0-20210106013422-671bd2870b3a
github.com/sirupsen/logrus v1.9.3
github.com/smartystreets/goconvey v1.7.2
github.com/stretchr/testify v1.8.4
- gitlab.com/gitlab-org/gitaly/v16 v16.0.4
+ gitlab.com/gitlab-org/gitaly/v16 v16.1.2
gitlab.com/gitlab-org/labkit v1.19.0
gocloud.dev v0.29.0
golang.org/x/image v0.7.0
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616
- golang.org/x/net v0.9.0
- golang.org/x/oauth2 v0.5.0
+ golang.org/x/net v0.10.0
+ golang.org/x/oauth2 v0.6.0
golang.org/x/tools v0.8.0
- google.golang.org/grpc v1.54.0
+ google.golang.org/grpc v1.55.0
google.golang.org/protobuf v1.30.0
honnef.co/go/tools v0.4.3
)
require (
- cloud.google.com/go v0.109.0 // indirect
+ cloud.google.com/go v0.110.0 // indirect
cloud.google.com/go/compute v1.18.0 // indirect
cloud.google.com/go/compute/metadata v0.2.3 // indirect
- cloud.google.com/go/iam v0.10.0 // indirect
+ cloud.google.com/go/iam v0.12.0 // indirect
cloud.google.com/go/monitoring v1.12.0 // indirect
cloud.google.com/go/profiler v0.1.0 // indirect
cloud.google.com/go/storage v1.29.0 // indirect
@@ -58,7 +58,7 @@ require (
github.com/DataDog/datadog-go v4.4.0+incompatible // indirect
github.com/DataDog/sketches-go v1.0.0 // indirect
github.com/Microsoft/go-winio v0.6.0 // indirect
- github.com/beevik/ntp v0.3.2 // indirect
+ github.com/beevik/ntp v1.0.0 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect
github.com/certifi/gocertifi v0.0.0-20210507211836-431795d63e8d // indirect
@@ -95,7 +95,7 @@ require (
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
github.com/prometheus/client_model v0.3.0 // indirect
github.com/prometheus/common v0.42.0 // indirect
- github.com/prometheus/procfs v0.9.0 // indirect
+ github.com/prometheus/procfs v0.10.1 // indirect
github.com/prometheus/prometheus v0.42.0 // indirect
github.com/ryszard/goskiplist v0.0.0-20150312221310-2dfbae5fcf46 // indirect
github.com/shabbyrobe/gocovmerge v0.0.0-20190829150210-3e036491d500 // indirect
@@ -109,17 +109,17 @@ require (
github.com/yusufpapurcu/wmi v1.2.2 // indirect
go.opencensus.io v0.24.0 // indirect
go.uber.org/atomic v1.10.0 // indirect
- golang.org/x/crypto v0.7.0 // indirect
+ golang.org/x/crypto v0.10.0 // indirect
golang.org/x/exp/typeparams v0.0.0-20221208152030-732eee02a75a // indirect
golang.org/x/mod v0.10.0 // indirect
- golang.org/x/sync v0.2.0 // indirect
- golang.org/x/sys v0.8.0 // indirect
- golang.org/x/text v0.9.0 // indirect
+ golang.org/x/sync v0.3.0 // indirect
+ golang.org/x/sys v0.9.0 // indirect
+ golang.org/x/text v0.10.0 // indirect
golang.org/x/time v0.3.0 // indirect
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect
google.golang.org/api v0.110.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
- google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc // indirect
+ google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 // indirect
gopkg.in/DataDog/dd-trace-go.v1 v1.32.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
diff --git a/workhorse/go.sum b/workhorse/go.sum
index 881cbc0c5d2..e3d2e38c8c8 100644
--- a/workhorse/go.sum
+++ b/workhorse/go.sum
@@ -40,8 +40,9 @@ cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34h
cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA=
cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM=
cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I=
-cloud.google.com/go v0.109.0 h1:38CZoKGlCnPZjGdyj0ZfpoGae0/wgNfy5F0byyxg0Gk=
cloud.google.com/go v0.109.0/go.mod h1:2sYycXt75t/CSB5R9M2wPU1tJmire7AQZTPtITcGBVE=
+cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys=
+cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY=
cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4=
cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw=
cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o=
@@ -217,8 +218,9 @@ cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3Q
cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc=
cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg=
cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE=
-cloud.google.com/go/iam v0.10.0 h1:fpP/gByFs6US1ma53v7VxhvbJpO2Aapng6wabJ99MuI=
cloud.google.com/go/iam v0.10.0/go.mod h1:nXAECrMt2qHpF6RZUZseteD6QyanL68reN4OXPw0UWM=
+cloud.google.com/go/iam v0.12.0 h1:DRtTY29b75ciH6Ov1PHb4/iat2CLCvrOm40Q0a6DFpE=
+cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY=
cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc=
cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A=
cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM=
@@ -238,8 +240,8 @@ cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6
cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw=
cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE=
cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc=
-cloud.google.com/go/longrunning v0.4.0 h1:v+X4EwhHl6xE+TG1XgXj4T1XpKKs7ZevcAJ3FOu0YmY=
cloud.google.com/go/longrunning v0.4.0/go.mod h1:eF3Qsw58iX/bkKtVjMTYpH0LRjQ2goDkjkNQTlzq/ZM=
+cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM=
cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE=
cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM=
cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI=
@@ -479,8 +481,8 @@ github.com/AzureAD/microsoft-authentication-library-for-go v0.5.1/go.mod h1:Vt9s
github.com/AzureAD/microsoft-authentication-library-for-go v0.8.1 h1:oPdPEZFSbl7oSPEAIPMPBMUmiL+mqgzBJwM/9qYcwNg=
github.com/AzureAD/microsoft-authentication-library-for-go v0.8.1/go.mod h1:4qFor3D/HDsvBME35Xy9rwW9DecL+M2sNw1ybjPtwA0=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-github.com/BurntSushi/toml v1.3.0 h1:Ws8e5YmnrGEHzZEzg0YvK/7COGYtTC5PbaH9oSSbgfA=
-github.com/BurntSushi/toml v1.3.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
+github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8=
+github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
github.com/DataDog/datadog-go v4.4.0+incompatible h1:R7WqXWP4fIOAqWJtUKmSfuc7eDsBT58k9AY5WSHVosk=
@@ -535,8 +537,8 @@ github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/
github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
github.com/alecthomas/assert/v2 v2.2.1 h1:XivOgYcduV98QCahG8T5XTezV5bylXe+lBxLG2K2ink=
-github.com/alecthomas/chroma/v2 v2.7.0 h1:hm1rY6c/Ob4eGclpQ7X/A3yhqBOZNUTk9q+yhyLIViI=
-github.com/alecthomas/chroma/v2 v2.7.0/go.mod h1:yrkMI9807G1ROx13fhe1v6PN2DDeaR73L3d+1nmYQtw=
+github.com/alecthomas/chroma/v2 v2.8.0 h1:w9WJUjFFmHHB2e8mRpL9jjy3alYDlU0QLDezj1xE264=
+github.com/alecthomas/chroma/v2 v2.8.0/go.mod h1:yrkMI9807G1ROx13fhe1v6PN2DDeaR73L3d+1nmYQtw=
github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
@@ -616,8 +618,8 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.18.3/go.mod h1:b+psTJn33Q4qGoDaM7ZiO
github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E=
github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8=
github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA=
-github.com/beevik/ntp v0.3.2 h1:tWwrPRUDbURCK/Voh3Daxl2c60mOiA1z+bOqm4j/aSY=
-github.com/beevik/ntp v0.3.2/go.mod h1:hg8DSzEy+KlFOOmR19XMea1MsLaA6vojqM04e2IhuUo=
+github.com/beevik/ntp v1.0.0 h1:d0Lgy1xbNNqVyGfvg2Z96ItKcfyn3lzgus/oRoj9vnk=
+github.com/beevik/ntp v1.0.0/go.mod h1:JN7/74B0Z4GUGO/1aUeRI2adARlfJGUeaJb0y0Wvnf4=
github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
@@ -1689,8 +1691,8 @@ github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqr
github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ=
github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=
-github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI=
-github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk=
+github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8=
+github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc=
github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
@@ -1733,8 +1735,8 @@ github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=
-github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI=
-github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY=
+github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg=
+github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM=
github.com/prometheus/prometheus v0.35.0/go.mod h1:7HaLx5kEPKJ0GDgbODG0fZgXbQ8K/XjZNJXQmbmgQlY=
github.com/prometheus/prometheus v0.42.0 h1:G769v8covTkOiNckXFIwLx01XE04OE6Fr0JPA0oR2nI=
github.com/prometheus/prometheus v0.42.0/go.mod h1:Pfqb/MLnnR2KK+0vchiaH39jXxvLMBk+3lnIGP4N7Vk=
@@ -1858,6 +1860,7 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
@@ -1928,8 +1931,8 @@ github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX
github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA=
github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg=
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
-gitlab.com/gitlab-org/gitaly/v16 v16.0.4 h1:sw42Xp+JBo8VF5BMBjla3i6+qbX5YZkvupu2srL8G/c=
-gitlab.com/gitlab-org/gitaly/v16 v16.0.4/go.mod h1:GDDfuCzp8ewfG+cPaYJa6czKluTQhsZyEr5WAtaqbbk=
+gitlab.com/gitlab-org/gitaly/v16 v16.1.2 h1:l7sltwjB/shkqlbuQzfeS3PonrQljCBKOZ2Uozk8ewA=
+gitlab.com/gitlab-org/gitaly/v16 v16.1.2/go.mod h1:gfmwpE66X4lwAO/RdchFhNINSwteGFer4loUOa94nQE=
gitlab.com/gitlab-org/labkit v1.19.0 h1:7j5NOHE42R0Eu3Bj2BgfbGf4aN2HXMTmCN7H2wcqqyA=
gitlab.com/gitlab-org/labkit v1.19.0/go.mod h1:zeATDAaSBelPcPLbTTq8J3ZJEHyPTLVBM1q3nva+/W4=
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
@@ -2084,8 +2087,8 @@ golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0
golang.org/x/crypto v0.0.0-20221012134737-56aed061732a/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
-golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A=
-golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
+golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM=
+golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I=
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=
@@ -2101,7 +2104,7 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
golang.org/x/exp v0.0.0-20230108222341-4b8118a2686a/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
golang.org/x/exp v0.0.0-20230124195608-d38c7dcee874/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
-golang.org/x/exp v0.0.0-20230425010034-47ecfdc1ba53 h1:5llv2sWeaMSnA3w2kS57ouQQ4pudlXrR0dCgw51QK9o=
+golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc=
golang.org/x/exp/typeparams v0.0.0-20221208152030-732eee02a75a h1:Jw5wfR+h9mnIYH+OtGT2im5wV1YGGDora5vTv/aa5bE=
golang.org/x/exp/typeparams v0.0.0-20221208152030-732eee02a75a/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
@@ -2232,8 +2235,9 @@ golang.org/x/net v0.3.1-0.20221206200815-1e63c2f08a10/go.mod h1:MBQ8lrhLObU/6UmL
golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
-golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
+golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
+golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/oauth2 v0.0.0-20170912212905-13449ad91cb2/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -2265,8 +2269,9 @@ golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri
golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk=
golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec=
-golang.org/x/oauth2 v0.5.0 h1:HuArIo48skDwlrvM3sEdHXElYslAMsf3KwRkkW4MC4s=
golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I=
+golang.org/x/oauth2 v0.6.0 h1:Lh8GPgSKBfWSwFvtuWOfeI3aAAnbXTSutYxJiOJFgIw=
+golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw=
golang.org/x/sync v0.0.0-20170517211232-f52d1811a629/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -2285,8 +2290,8 @@ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI=
-golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
+golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -2443,8 +2448,8 @@ golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
-golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s=
+golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
@@ -2470,8 +2475,9 @@ golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58=
+golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/time v0.0.0-20170424234030-8be79e1e0910/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -2802,8 +2808,9 @@ google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ
google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
-google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc h1:ijGwO+0vL2hJt5gaygqP2j6PfflOBrRot0IczKbmtio=
google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
+google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 h1:DdoeryqhaXp1LtT/emMP1BRJPHHKFi5akj/nbx/zNTA=
+google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s=
google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
google.golang.org/grpc v1.2.1-0.20170921194603-d4b75ebd4f9f/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
@@ -2849,8 +2856,8 @@ google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCD
google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww=
google.golang.org/grpc v1.52.1/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY=
google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw=
-google.golang.org/grpc v1.54.0 h1:EhTqbhiYeixwWQtAEZAxmV9MGqcjEU2mFx52xCzNyag=
-google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g=
+google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag=
+google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8=
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=
diff --git a/workhorse/internal/lsif_transformer/parser/hovers.go b/workhorse/internal/lsif_transformer/parser/hovers.go
index 33d45829295..b78c64d1556 100644
--- a/workhorse/internal/lsif_transformer/parser/hovers.go
+++ b/workhorse/internal/lsif_transformer/parser/hovers.go
@@ -30,11 +30,6 @@ type HoverRef struct {
HoverId Id `json:"inV"`
}
-type ResultSetRef struct {
- ResultSetId Id `json:"outV"`
- RefId Id `json:"inV"`
-}
-
func NewHovers() (*Hovers, error) {
file, err := os.CreateTemp("", "hovers")
if err != nil {
@@ -67,18 +62,14 @@ func (h *Hovers) Read(label string, line []byte) error {
if err := h.addHoverRef(line); err != nil {
return err
}
- case "textDocument/references":
- if err := h.addResultSetRef(line); err != nil {
- return err
- }
}
return nil
}
-func (h *Hovers) For(refId Id) json.RawMessage {
+func (h *Hovers) For(resultSetId Id) json.RawMessage {
var offset Offset
- if err := h.Offsets.Entry(refId, &offset); err != nil || offset.Len == 0 {
+ if err := h.Offsets.Entry(resultSetId, &offset); err != nil || offset.Len == 0 {
return nil
}
@@ -143,17 +134,3 @@ func (h *Hovers) addHoverRef(line []byte) error {
return h.Offsets.SetEntry(hoverRef.ResultSetId, &offset)
}
-
-func (h *Hovers) addResultSetRef(line []byte) error {
- var ref ResultSetRef
- if err := json.Unmarshal(line, &ref); err != nil {
- return err
- }
-
- var offset Offset
- if err := h.Offsets.Entry(ref.ResultSetId, &offset); err != nil {
- return nil
- }
-
- return h.Offsets.SetEntry(ref.RefId, &offset)
-}
diff --git a/workhorse/internal/lsif_transformer/parser/hovers_test.go b/workhorse/internal/lsif_transformer/parser/hovers_test.go
index 5b2166c07a1..0a6cba8a411 100644
--- a/workhorse/internal/lsif_transformer/parser/hovers_test.go
+++ b/workhorse/internal/lsif_transformer/parser/hovers_test.go
@@ -13,7 +13,7 @@ func TestHoversRead(t *testing.T) {
require.NoError(t, h.Offsets.Entry(2, &offset))
require.Equal(t, Offset{At: 0, Len: 19}, offset)
- require.Equal(t, `[{"value":"hello"}]`, string(h.For(1)))
+ require.Equal(t, `[{"value":"hello"}]`, string(h.For(3)))
require.NoError(t, h.Close())
}
@@ -24,7 +24,6 @@ func setupHovers(t *testing.T) *Hovers {
require.NoError(t, h.Read("hoverResult", []byte(`{"id":"2","label":"hoverResult","result":{"contents": ["hello"]}}`)))
require.NoError(t, h.Read("textDocument/hover", []byte(`{"id":4,"label":"textDocument/hover","outV":"3","inV":2}`)))
- require.NoError(t, h.Read("textDocument/references", []byte(`{"id":"3","label":"textDocument/references","outV":3,"inV":"1"}`)))
return h
}
diff --git a/workhorse/internal/lsif_transformer/parser/ranges.go b/workhorse/internal/lsif_transformer/parser/ranges.go
index 0b4bd588e16..56472a34447 100644
--- a/workhorse/internal/lsif_transformer/parser/ranges.go
+++ b/workhorse/internal/lsif_transformer/parser/ranges.go
@@ -7,15 +7,10 @@ import (
"strconv"
)
-const (
- definitions = "definitions"
- references = "references"
-)
-
type Ranges struct {
DefRefs map[Id]Item
References *References
- Hovers *Hovers
+ ResultSet *ResultSet
Cache *cache
}
@@ -25,9 +20,9 @@ type RawRange struct {
}
type Range struct {
- Line int32 `json:"line"`
- Character int32 `json:"character"`
- RefId Id
+ Line int32 `json:"line"`
+ Character int32 `json:"character"`
+ ResultSetId Id
}
type RawItem struct {
@@ -51,7 +46,7 @@ type SerializedRange struct {
}
func NewRanges() (*Ranges, error) {
- hovers, err := NewHovers()
+ resultSet, err := NewResultSet()
if err != nil {
return nil, err
}
@@ -69,8 +64,8 @@ func NewRanges() (*Ranges, error) {
return &Ranges{
DefRefs: make(map[Id]Item),
References: references,
- Hovers: hovers,
Cache: cache,
+ ResultSet: resultSet,
}, nil
}
@@ -85,7 +80,7 @@ func (r *Ranges) Read(label string, line []byte) error {
return err
}
default:
- return r.Hovers.Read(label, line)
+ return r.ResultSet.Read(label, line)
}
return nil
@@ -108,9 +103,9 @@ func (r *Ranges) Serialize(f io.Writer, rangeIds []Id, docs map[Id]string) error
serializedRange := SerializedRange{
StartLine: entry.Line,
StartChar: entry.Character,
- DefinitionPath: r.definitionPathFor(docs, entry.RefId),
- Hover: r.Hovers.For(entry.RefId),
- References: r.References.For(docs, entry.RefId),
+ DefinitionPath: r.definitionPathFor(docs, entry.ResultSetId),
+ Hover: r.ResultSet.Hovers.For(entry.ResultSetId),
+ References: r.References.For(docs, entry.ResultSetId),
}
if err := encoder.Encode(serializedRange); err != nil {
return err
@@ -133,7 +128,7 @@ func (r *Ranges) Close() error {
for _, err := range []error{
r.Cache.Close(),
r.References.Close(),
- r.Hovers.Close(),
+ r.ResultSet.Close(),
} {
if err != nil {
return err
@@ -168,23 +163,23 @@ func (r *Ranges) addItem(line []byte) error {
return err
}
- if rawItem.Property != definitions && rawItem.Property != references {
- return nil
- }
-
if len(rawItem.RangeIds) == 0 {
return errors.New("no range IDs")
}
- var references []Item
+ resultSetRef, err := r.ResultSet.RefById(rawItem.RefId)
+ if err != nil {
+ return nil
+ }
+ var references []Item
for _, rangeId := range rawItem.RangeIds {
rg, err := r.getRange(rangeId)
if err != nil {
- return err
+ break
}
- rg.RefId = rawItem.RefId
+ rg.ResultSetId = resultSetRef.Id
if err := r.Cache.SetEntry(rangeId, rg); err != nil {
return err
@@ -195,14 +190,19 @@ func (r *Ranges) addItem(line []byte) error {
DocId: rawItem.DocId,
}
- if rawItem.Property == definitions {
- r.DefRefs[rawItem.RefId] = item
+ definitionItem := r.DefRefs[resultSetRef.Id]
+ if item == definitionItem {
+ continue
+ }
+
+ if resultSetRef.IsDefinition() {
+ r.DefRefs[resultSetRef.Id] = item
} else {
references = append(references, item)
}
}
- if err := r.References.Store(rawItem.RefId, references); err != nil {
+ if err := r.References.Store(resultSetRef.Id, references); err != nil {
return err
}
diff --git a/workhorse/internal/lsif_transformer/parser/ranges_test.go b/workhorse/internal/lsif_transformer/parser/ranges_test.go
index 807945b41b1..bab132115e6 100644
--- a/workhorse/internal/lsif_transformer/parser/ranges_test.go
+++ b/workhorse/internal/lsif_transformer/parser/ranges_test.go
@@ -11,17 +11,17 @@ func TestRangesRead(t *testing.T) {
r, cleanup := setup(t)
defer cleanup()
- firstRange := Range{Line: 1, Character: 2, RefId: 4}
+ firstRange := Range{Line: 1, Character: 2, ResultSetId: 4}
rg, err := r.getRange(1)
require.NoError(t, err)
require.Equal(t, &firstRange, rg)
- secondRange := Range{Line: 5, Character: 4, RefId: 4}
+ secondRange := Range{Line: 5, Character: 4, ResultSetId: 4}
rg, err = r.getRange(2)
require.NoError(t, err)
require.Equal(t, &secondRange, rg)
- thirdRange := Range{Line: 7, Character: 4, RefId: 4}
+ thirdRange := Range{Line: 7, Character: 4, ResultSetId: 4}
rg, err = r.getRange(3)
require.NoError(t, err)
require.Equal(t, &thirdRange, rg)
@@ -49,9 +49,17 @@ func setup(t *testing.T) (*Ranges, func()) {
require.NoError(t, r.Read("range", []byte(`{"id":"2","label":"range","start":{"line":5,"character":4}}`)))
require.NoError(t, r.Read("range", []byte(`{"id":"3","label":"range","start":{"line":7,"character":4}}`)))
- require.NoError(t, r.Read("item", []byte(`{"id":5,"label":"item","property":"definitions","outV":"4","inVs":[1],"document":"6"}`)))
- require.NoError(t, r.Read("item", []byte(`{"id":"6","label":"item","property":"references","outV":4,"inVs":["2"],"document":"7"}`)))
- require.NoError(t, r.Read("item", []byte(`{"id":"7","label":"item","property":"references","outV":4,"inVs":["3"],"document":"7"}`)))
+ require.NoError(t, r.Read("resultSet", []byte(`{"id":"4","label":"resultSet"}`)))
+ require.NoError(t, r.Read("referenceResult", []byte(`{"id":"5","label":"referenceResult"}`)))
+ require.NoError(t, r.Read("definitionResult", []byte(`{"id":"6","label":"definitionResult"}`)))
+
+ require.NoError(t, r.Read("textDocument/references", []byte(`{"id":7,"label":"textDocument/references","outV":"4","inV":5}`)))
+ require.NoError(t, r.Read("textDocument/definition", []byte(`{"id":8,"label":"textDocument/definition","outV":"4","inV":6}`)))
+
+ require.NoError(t, r.Read("item", []byte(`{"id":10,"label":"item","outV":"6","inVs":[1,14],"document":"6"}`)))
+ require.NoError(t, r.Read("item", []byte(`{"id":11,"label":"item","outV":"5","inVs":[1,15],"document":"6"}`)))
+ require.NoError(t, r.Read("item", []byte(`{"id":"12","label":"item","outV":5,"inVs":["2"],"document":"7"}`)))
+ require.NoError(t, r.Read("item", []byte(`{"id":"13","label":"item","outV":5,"inVs":["3"],"document":"7"}`)))
cleanup := func() {
require.NoError(t, r.Close())
diff --git a/workhorse/internal/lsif_transformer/parser/result_set.go b/workhorse/internal/lsif_transformer/parser/result_set.go
new file mode 100644
index 00000000000..aa0b212d0ca
--- /dev/null
+++ b/workhorse/internal/lsif_transformer/parser/result_set.go
@@ -0,0 +1,100 @@
+package parser
+
+import (
+ "encoding/json"
+)
+
+type Property int8
+
+const (
+ DefinitionProp Property = iota
+ ReferencesProp
+)
+
+type ResultSet struct {
+ Hovers *Hovers
+ Cache *cache
+}
+
+type ResultSetRef struct {
+ Id Id
+ Property Property
+}
+
+type RawResultSetRef struct {
+ ResultSetId Id `json:"outV"`
+ RefId Id `json:"inV"`
+}
+
+func NewResultSet() (*ResultSet, error) {
+ hovers, err := NewHovers()
+ if err != nil {
+ return nil, err
+ }
+
+ cache, err := newCache("results-set-refs", &ResultSetRef{})
+ if err != nil {
+ return nil, err
+ }
+
+ return &ResultSet{
+ Hovers: hovers,
+ Cache: cache,
+ }, nil
+}
+
+func (r *ResultSet) Read(label string, line []byte) error {
+ switch label {
+ case "textDocument/references":
+ if err := r.addResultSetRef(line, ReferencesProp); err != nil {
+ return err
+ }
+ case "textDocument/definition":
+ if err := r.addResultSetRef(line, DefinitionProp); err != nil {
+ return err
+ }
+ default:
+ return r.Hovers.Read(label, line)
+ }
+
+ return nil
+}
+
+func (r *ResultSet) RefById(refId Id) (*ResultSetRef, error) {
+ var ref ResultSetRef
+ if err := r.Cache.Entry(refId, &ref); err != nil {
+ return nil, err
+ }
+
+ return &ref, nil
+}
+
+func (r *ResultSet) Close() error {
+ for _, err := range []error{
+ r.Cache.Close(),
+ r.Hovers.Close(),
+ } {
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+func (r *ResultSet) addResultSetRef(line []byte, property Property) error {
+ var rawRef RawResultSetRef
+ if err := json.Unmarshal(line, &rawRef); err != nil {
+ return err
+ }
+
+ ref := &ResultSetRef{
+ Id: rawRef.ResultSetId,
+ Property: property,
+ }
+
+ return r.Cache.SetEntry(rawRef.RefId, ref)
+}
+
+func (r *ResultSetRef) IsDefinition() bool {
+ return r.Property == DefinitionProp
+}
diff --git a/workhorse/internal/lsif_transformer/parser/result_set_test.go b/workhorse/internal/lsif_transformer/parser/result_set_test.go
new file mode 100644
index 00000000000..9a7e6a1d037
--- /dev/null
+++ b/workhorse/internal/lsif_transformer/parser/result_set_test.go
@@ -0,0 +1,48 @@
+package parser
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/require"
+)
+
+func TestResultSetRead(t *testing.T) {
+ r := setupResultSet(t)
+
+ var ref ResultSetRef
+ require.NoError(t, r.Cache.Entry(2, &ref))
+ require.Equal(t, ResultSetRef{Id: 1, Property: ReferencesProp}, ref)
+ require.False(t, ref.IsDefinition())
+
+ require.NoError(t, r.Cache.Entry(4, &ref))
+ require.Equal(t, ResultSetRef{Id: 3, Property: DefinitionProp}, ref)
+ require.True(t, ref.IsDefinition())
+
+ require.NoError(t, r.Close())
+}
+
+func TestResultSetRefById(t *testing.T) {
+ r := setupResultSet(t)
+
+ ref, err := r.RefById(2)
+ require.NoError(t, err)
+ require.Equal(t, &ResultSetRef{Id: 1, Property: ReferencesProp}, ref)
+ require.False(t, ref.IsDefinition())
+
+ ref, err = r.RefById(4)
+ require.NoError(t, err)
+ require.Equal(t, &ResultSetRef{Id: 3, Property: DefinitionProp}, ref)
+ require.True(t, ref.IsDefinition())
+
+ require.NoError(t, r.Close())
+}
+
+func setupResultSet(t *testing.T) *ResultSet {
+ r, err := NewResultSet()
+ require.NoError(t, err)
+
+ require.NoError(t, r.Read("textDocument/references", []byte(`{"id":4,"label":"textDocument/references","outV":"1","inV":2}`)))
+ require.NoError(t, r.Read("textDocument/definition", []byte(`{"id":5,"label":"textDocument/definition","outV":"3","inV":4}`)))
+
+ return r
+}
diff --git a/workhorse/internal/senddata/contentprocessor/contentprocessor_test.go b/workhorse/internal/senddata/contentprocessor/contentprocessor_test.go
index e863935be6f..28a8d905ff2 100644
--- a/workhorse/internal/senddata/contentprocessor/contentprocessor_test.go
+++ b/workhorse/internal/senddata/contentprocessor/contentprocessor_test.go
@@ -85,6 +85,12 @@ func TestSetProperContentTypeAndDisposition(t *testing.T) {
body: "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 0 330 82\"><title>SVG logo combined with the W3C logo, set horizontally</title><desc>The logo combines three entities displayed horizontall</desc><metadata>",
},
{
+ desc: "Incomplete SVG start tag",
+ contentType: "image/svg+xml",
+ contentDisposition: "attachment",
+ body: "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"",
+ },
+ {
desc: "Application type",
contentType: "application/octet-stream",
contentDisposition: "attachment",
diff --git a/workhorse/internal/utils/svg/svg.go b/workhorse/internal/utils/svg/svg.go
index b209cb5bf33..72bda6d656f 100644
--- a/workhorse/internal/utils/svg/svg.go
+++ b/workhorse/internal/utils/svg/svg.go
@@ -13,7 +13,7 @@ import (
var (
htmlCommentRegex = regexp.MustCompile(`(?i)<!--([\s\S]*?)-->`)
- svgRegex = regexp.MustCompile(`(?i)^\s*(?:<\?xml[^>]*>\s*)?(?:<!doctype svg[^>]*>\s*)?<svg[^>]*>`)
+ svgRegex = regexp.MustCompile(`(?i)^\s*(?:<\?xml[^>]*>\s*)?(?:<!doctype svg[^>]*>\s*)?<svg[^>]*`)
)
// isBinary checks if the given buffer is a binary file.
diff --git a/yarn.lock b/yarn.lock
index 83cb3e69579..2282ff0ddfc 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,6 +2,11 @@
# yarn lockfile v1
+"@aashutoshrathi/word-wrap@^1.2.3":
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf"
+ integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==
+
"@ampproject/remapping@^2.1.0":
version "2.1.2"
resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.2.tgz#4edca94973ded9630d20101cd8559cedb8d8bd34"
@@ -1044,14 +1049,14 @@
resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.4.0.tgz#3e61c564fcd6b921cb789838631c5ee44df09403"
integrity sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==
-"@eslint/eslintrc@^2.0.3":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.3.tgz#4910db5505f4d503f27774bf356e3704818a0331"
- integrity sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==
+"@eslint/eslintrc@^2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.0.tgz#82256f164cc9e0b59669efc19d57f8092706841d"
+ integrity sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==
dependencies:
ajv "^6.12.4"
debug "^4.3.2"
- espree "^9.5.2"
+ espree "^9.6.0"
globals "^13.19.0"
ignore "^5.2.0"
import-fresh "^3.2.1"
@@ -1059,10 +1064,10 @@
minimatch "^3.1.2"
strip-json-comments "^3.1.1"
-"@eslint/js@8.41.0":
- version "8.41.0"
- resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.41.0.tgz#080321c3b68253522f7646b55b577dd99d2950b3"
- integrity sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==
+"@eslint/js@8.44.0":
+ version "8.44.0"
+ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.44.0.tgz#961a5903c74139390478bdc808bcde3fc45ab7af"
+ integrity sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==
"@floating-ui/core@^1.2.6":
version "1.2.6"
@@ -1108,10 +1113,10 @@
resolved "https://registry.yarnpkg.com/@gitlab/favicon-overlay/-/favicon-overlay-2.0.0.tgz#2f32d0b6a4d5b8ac44e2927083d9ab478a78c984"
integrity sha512-GNcORxXJ98LVGzOT9dDYKfbheqH6lNgPDD72lyXRnQIH7CjgGyos8i17aSBPq1f4s3zF3PyedFiAR4YEZbva2Q==
-"@gitlab/fonts@^1.2.0":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@gitlab/fonts/-/fonts-1.2.0.tgz#140bea5316e71d9b20d084fb10030db4e4ae73bd"
- integrity sha512-9wn+xnMgzvs9EAwMU0kbkcX5IKLXDOVUf6oBOi0zrFpwtM0wY4pfXkswSMl1kfMyNn6nW2n35g7sbv/Uy/QezQ==
+"@gitlab/fonts@^1.3.0":
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/@gitlab/fonts/-/fonts-1.3.0.tgz#df89c1bb6714e4a8a5d3272568aa4de7fb337267"
+ integrity sha512-DoMUIN3DqjEn7wvcxBg/b7Ite5fTdF5EmuOZoBRo2j0UBGweDXmNBi+9HrTZs4cBU660dOxcf1hATFcG3npbPg==
"@gitlab/stylelint-config@4.1.0":
version "4.1.0"
@@ -1122,15 +1127,15 @@
stylelint-declaration-strict-value "1.8.0"
stylelint-scss "4.2.0"
-"@gitlab/svgs@3.53.0":
- version "3.53.0"
- resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-3.53.0.tgz#6f952e59db6a3ebb59f034c240d7001a2dc8a92d"
- integrity sha512-WgDZtl3ZmZgP0Fw62/YnNH/VjJbCp0bTU+qaBudic7T/ohu/Ex11RBcwakJyUZ5KWueFChGkulWKxVZz9baaDA==
+"@gitlab/svgs@3.55.0":
+ version "3.55.0"
+ resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-3.55.0.tgz#c67c5dddf54c400485762aff6a693e1f5a643739"
+ integrity sha512-1wuXRGhrWKfWXSM9ZI1aRHlZ0wv4X7tJjDil+AQVjPBANB6oBXAPAiga+qkzkBHss7TzyOjY7OytG/9L5weDLg==
-"@gitlab/ui@64.10.1":
- version "64.10.1"
- resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-64.10.1.tgz#4696429f9a0f128537646d01b08eecea7e6c6529"
- integrity sha512-C1E6iAQ/7aLpGwXFmhyPs1ci6aTZe+bCN1xbGW8OJ2Ozet41tr4osI8cm1Pj4WLQL0IXqhQjg5z930HAlTR0Iw==
+"@gitlab/ui@64.20.1":
+ version "64.20.1"
+ resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-64.20.1.tgz#4ca5ca7a854be5c15afcc464d16498b9b833ad6e"
+ integrity sha512-yB4gRRzQCIQxxHnD50j3uOAcg5mhSBw9+tRi9kDqn+CxozDUNC/SNfTy+v7cTLJBn2mdxHfw++cuJcH3gRajxQ==
dependencies:
"@floating-ui/dom" "1.2.9"
bootstrap-vue "2.23.1"
@@ -1146,15 +1151,15 @@
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==
-"@gitlab/web-ide@0.0.1-dev-20230614124516":
- version "0.0.1-dev-20230614124516"
- resolved "https://registry.yarnpkg.com/@gitlab/web-ide/-/web-ide-0.0.1-dev-20230614124516.tgz#87ef511112e954dc3614e28fdf635b140bab22b7"
- integrity sha512-VRKiDzhRNIHsyKbln8YtQjVvsOkF+4N1OUqaldu2gYX4Nfw9g57sTwnnX44aYcHFgPVgo5a/ScRpnCiBl6Phxg==
+"@gitlab/web-ide@0.0.1-dev-20230713160749":
+ version "0.0.1-dev-20230713160749"
+ resolved "https://registry.yarnpkg.com/@gitlab/web-ide/-/web-ide-0.0.1-dev-20230713160749.tgz#427aed5e9fa6be1d1f58dde282500759df204b6c"
+ integrity sha512-QySxWa5dzuZw1XGtkFDuTX9CF/kvBMGoiM9PySH2cvx6mGvC9dphis06eeliNKkNZG3arjwNSC6/8JRkg96B5A==
-"@graphql-eslint/eslint-plugin@3.19.1":
- version "3.19.1"
- resolved "https://registry.yarnpkg.com/@graphql-eslint/eslint-plugin/-/eslint-plugin-3.19.1.tgz#b8e1b6a061b46fd7ad0bbf431b2dc2657ef484e7"
- integrity sha512-8hllEu0dFXDk9poJRN0gIqrGoBblMe1TpRJFx0We+ZKWNQgaxvQ0QGmJPDak+BZV5BcOAM7m/GH2XWDgVB2nQA==
+"@graphql-eslint/eslint-plugin@3.20.0":
+ version "3.20.0"
+ resolved "https://registry.yarnpkg.com/@graphql-eslint/eslint-plugin/-/eslint-plugin-3.20.0.tgz#66b80cc8f1dec3c092fd68adbe3fc354fdd0916c"
+ integrity sha512-zvGJf7sNkh4QTRGHogwS/A9Ob5ZFC2A7U9ASIJ1RWkSex3wd5P0Fcwt98eagICnDguMWBIzsSko4vWoRgovbvg==
dependencies:
"@babel/code-frame" "^7.18.6"
"@graphql-tools/code-file-loader" "^7.3.6"
@@ -1333,10 +1338,10 @@
resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.2.tgz#6fc464307cbe3c8ca5064549b806360d84457b04"
integrity sha512-9anpBMM9mEgZN4wr2v8wHJI2/u5TnnggewRN6OlvXTTnuVyoY19X6rOv9XTqKRw6dcGKwZsBi8n0kDE2I5i4VA==
-"@humanwhocodes/config-array@^0.11.8":
- version "0.11.8"
- resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9"
- integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==
+"@humanwhocodes/config-array@^0.11.10":
+ version "0.11.10"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2"
+ integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==
dependencies:
"@humanwhocodes/object-schema" "^1.2.1"
debug "^4.1.1"
@@ -1352,6 +1357,18 @@
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
+"@isaacs/cliui@^8.0.2":
+ version "8.0.2"
+ resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550"
+ integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==
+ dependencies:
+ string-width "^5.1.2"
+ string-width-cjs "npm:string-width@^4.2.0"
+ strip-ansi "^7.0.1"
+ strip-ansi-cjs "npm:strip-ansi@^6.0.1"
+ wrap-ansi "^8.1.0"
+ wrap-ansi-cjs "npm:wrap-ansi@^7.0.0"
+
"@istanbuljs/load-nyc-config@^1.0.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced"
@@ -1678,6 +1695,11 @@
consola "^2.15.0"
node-fetch "^2.6.1"
+"@pkgjs/parseargs@^0.11.0":
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
+ integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
+
"@polka/url@^1.0.0-next.9":
version "1.0.0-next.12"
resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.12.tgz#431ec342a7195622f86688bbda82e3166ce8cb28"
@@ -1688,15 +1710,15 @@
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"
- resolved "https://registry.yarnpkg.com/@rails/actioncable/-/actioncable-6.1.4-7.tgz#da60f6c8b3ec8ec5118db877dd2e416d40e0bce6"
- integrity sha512-ml1ykETFb716oDb/vivA9FNO/+nQe9s46H5Gb+24dIxhLjhYEfMAjFlTG0ASRNpZzGbIi5XMPfNZkdxM3ftK8w==
+"@rails/actioncable@7.0.6":
+ version "7.0.6"
+ resolved "https://registry.yarnpkg.com/@rails/actioncable/-/actioncable-7.0.6.tgz#60765c8e9c357a0ba0840fb1e409caedc233ea0d"
+ integrity sha512-ybBsUrIsu5geM8BtqnpM7ZA9D8uzSz+e1B4JR57NaCmasHKWap6AX5DT7NHIbp21opVet1qqoVSdsoLDqXeB2A==
-"@rails/ujs@6.1.4-7":
- version "6.1.4-7"
- resolved "https://registry.yarnpkg.com/@rails/ujs/-/ujs-6.1.4-7.tgz#ef0b83ef40f64bc6704e13ae6624236a4a91fa6f"
- integrity sha512-842WcLh0BErNgGE8rdqNh31VnqGQcklPQ7RXzQfA0ilQNZcU7AO+t576g1m//18Lk8m7cXZ8fIKA1YB41LKWAQ==
+"@rails/ujs@7.0.6":
+ version "7.0.6"
+ resolved "https://registry.yarnpkg.com/@rails/ujs/-/ujs-7.0.6.tgz#fd8937c92335f3da9495e07292511ad5f7547a6a"
+ integrity sha512-s5v3AC6AywOIFMz0RIMW83Xc8FPIvKMkP3ZHFlM4ISNkhdUwP9HdhVtxxo6z3dIhe9vI0Our2A8kN/QpUV02Qg==
"@remirror/core-constants@^2.0.0":
version "2.0.0"
@@ -2958,10 +2980,10 @@ acorn@^7.1.1:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
-acorn@^8.0.4, acorn@^8.5.0, acorn@^8.8.0:
- version "8.8.0"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8"
- integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==
+acorn@^8.0.4, acorn@^8.5.0, acorn@^8.9.0:
+ version "8.10.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5"
+ integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==
agent-base@6:
version "6.0.2"
@@ -3049,6 +3071,11 @@ ansi-regex@^5.0.0, ansi-regex@^5.0.1:
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+ansi-regex@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a"
+ integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==
+
ansi-styles@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
@@ -3068,6 +3095,11 @@ ansi-styles@^5.0.0:
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b"
integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==
+ansi-styles@^6.1.0:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5"
+ integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==
+
anymatch@^3.0.3, anymatch@~3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
@@ -4047,10 +4079,10 @@ commander@^6.0.0:
resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c"
integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==
-commander@~9.4.0:
- version "9.4.0"
- resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.0.tgz#bc4a40918fefe52e22450c111ecd6b7acce6f11c"
- integrity sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==
+commander@~11.0.0:
+ version "11.0.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-11.0.0.tgz#43e19c25dbedc8256203538e8d7e9346877a6f67"
+ integrity sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==
commondir@^1.0.1:
version "1.0.1"
@@ -4350,7 +4382,7 @@ cross-spawn@^6.0.5:
shebang-command "^1.2.0"
which "^1.2.9"
-cross-spawn@^7.0.2, cross-spawn@^7.0.3:
+cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
@@ -5413,6 +5445,11 @@ duplexify@^3.4.2, duplexify@^3.6.0:
readable-stream "^2.0.0"
stream-shift "^1.0.0"
+eastasianwidth@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
+ integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
+
echarts@^5.3.2:
version "5.3.3"
resolved "https://registry.yarnpkg.com/echarts/-/echarts-5.3.3.tgz#df97b09c4c0e2ffcdfb44acf518d50c50e0b838e"
@@ -5474,6 +5511,11 @@ emoji-regex@^8.0.0:
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+emoji-regex@^9.2.2:
+ version "9.2.2"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
+ integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
+
emojis-list@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
@@ -5831,16 +5873,16 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994"
integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==
-eslint@8.41.0:
- version "8.41.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.41.0.tgz#3062ca73363b4714b16dbc1e60f035e6134b6f1c"
- integrity sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==
+eslint@8.44.0:
+ version "8.44.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.44.0.tgz#51246e3889b259bbcd1d7d736a0c10add4f0e500"
+ integrity sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==
dependencies:
"@eslint-community/eslint-utils" "^4.2.0"
"@eslint-community/regexpp" "^4.4.0"
- "@eslint/eslintrc" "^2.0.3"
- "@eslint/js" "8.41.0"
- "@humanwhocodes/config-array" "^0.11.8"
+ "@eslint/eslintrc" "^2.1.0"
+ "@eslint/js" "8.44.0"
+ "@humanwhocodes/config-array" "^0.11.10"
"@humanwhocodes/module-importer" "^1.0.1"
"@nodelib/fs.walk" "^1.2.8"
ajv "^6.10.0"
@@ -5851,7 +5893,7 @@ eslint@8.41.0:
escape-string-regexp "^4.0.0"
eslint-scope "^7.2.0"
eslint-visitor-keys "^3.4.1"
- espree "^9.5.2"
+ espree "^9.6.0"
esquery "^1.4.2"
esutils "^2.0.2"
fast-deep-equal "^3.1.3"
@@ -5871,17 +5913,17 @@ eslint@8.41.0:
lodash.merge "^4.6.2"
minimatch "^3.1.2"
natural-compare "^1.4.0"
- optionator "^0.9.1"
+ optionator "^0.9.3"
strip-ansi "^6.0.1"
strip-json-comments "^3.1.0"
text-table "^0.2.0"
-espree@^9.3.1, espree@^9.5.2:
- version "9.5.2"
- resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.2.tgz#e994e7dc33a082a7a82dceaf12883a829353215b"
- integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==
+espree@^9.3.1, espree@^9.6.0:
+ version "9.6.0"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.0.tgz#80869754b1c6560f32e3b6929194a3fe07c5b82f"
+ integrity sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==
dependencies:
- acorn "^8.8.0"
+ acorn "^8.9.0"
acorn-jsx "^5.3.2"
eslint-visitor-keys "^3.4.1"
@@ -6310,6 +6352,14 @@ for-in@^1.0.2:
resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
+foreground-child@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d"
+ integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==
+ dependencies:
+ cross-spawn "^7.0.0"
+ signal-exit "^4.0.1"
+
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"
@@ -6541,7 +6591,7 @@ glob-parent@^6.0.2:
once "^1.3.0"
path-is-absolute "^1.0.0"
-glob@^8.0.3, glob@~8.0.3:
+glob@^8.0.3:
version "8.0.3"
resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e"
integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==
@@ -6552,6 +6602,17 @@ glob@^8.0.3, glob@~8.0.3:
minimatch "^5.0.1"
once "^1.3.0"
+glob@~10.2.7:
+ version "10.2.7"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-10.2.7.tgz#9dd2828cd5bc7bd861e7738d91e7113dda41d7d8"
+ integrity sha512-jTKehsravOJo8IJxUGfZILnkvVJM/MOfHRs8QcXolVef2zNI9Tqyy5+SeuOAZd3upViEZQLyFpQhYiHLrMUNmA==
+ dependencies:
+ foreground-child "^3.1.0"
+ jackspeak "^2.0.3"
+ minimatch "^9.0.1"
+ minipass "^5.0.0 || ^6.0.2"
+ path-scurry "^1.7.0"
+
global-modules@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780"
@@ -7107,10 +7168,10 @@ ignore-by-default@^1.0.1:
resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09"
integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk=
-ignore@^5.2.0, ignore@~5.2.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
- integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
+ignore@^5.2.0, ignore@~5.2.4:
+ version "5.2.4"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324"
+ integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==
immediate@~3.0.5:
version "3.0.6"
@@ -7616,6 +7677,15 @@ iterall@^1.2.1:
resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea"
integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==
+jackspeak@^2.0.3:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.2.1.tgz#655e8cf025d872c9c03d3eb63e8f0c024fef16a6"
+ integrity sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==
+ dependencies:
+ "@isaacs/cliui" "^8.0.2"
+ optionalDependencies:
+ "@pkgjs/parseargs" "^0.11.0"
+
jed@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/jed/-/jed-1.1.1.tgz#7a549bbd9ffe1585b0cd0a191e203055bee574b4"
@@ -8164,10 +8234,10 @@ json5@^2.1.2, json5@^2.2.1:
resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c"
integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==
-jsonc-parser@^3.0.0, jsonc-parser@~3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.1.0.tgz#73b8f0e5c940b83d03476bc2e51a20ef0932615d"
- integrity sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==
+jsonc-parser@^3.0.0, jsonc-parser@~3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76"
+ integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==
jsonfile@^4.0.0:
version "4.0.0"
@@ -8555,6 +8625,11 @@ lru-cache@^6.0.0:
dependencies:
yallist "^4.0.0"
+lru-cache@^9.1.1:
+ version "9.1.2"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-9.1.2.tgz#255fdbc14b75589d6d0e73644ca167a8db506835"
+ integrity sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==
+
magic-string@^0.25.7:
version "0.25.9"
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c"
@@ -8627,33 +8702,45 @@ markdown-table@^3.0.0:
resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.2.tgz#9b59eb2c1b22fe71954a65ff512887065a7bb57c"
integrity sha512-y8j3a5/DkJCmS5x4dMCQL+OR0+2EAq3DOtio1COSHsmW2BGXnNCK3v12hJt1LrUz5iZH5g0LmuYOjDdI+czghA==
-markdownlint-cli@0.32.2:
- version "0.32.2"
- resolved "https://registry.yarnpkg.com/markdownlint-cli/-/markdownlint-cli-0.32.2.tgz#b7b5c5808039aef4022aef603efaa607caf8e0de"
- integrity sha512-xmJT1rGueUgT4yGNwk6D0oqQr90UJ7nMyakXtqjgswAkEhYYqjHew9RY8wDbOmh2R270IWjuKSeZzHDEGPAUkQ==
+markdownlint-cli@0.35.0:
+ version "0.35.0"
+ resolved "https://registry.yarnpkg.com/markdownlint-cli/-/markdownlint-cli-0.35.0.tgz#1a6386777c6f20681e1425c0b7a056cf130bc46f"
+ integrity sha512-lVIIIV1MrUtjoocgDqXLxUCxlRbn7Ve8rsWppfwciUNwLlNS28AhNiyQ3PU7jjj4Qvj+rWTTvwkqg7AcdG988g==
dependencies:
- commander "~9.4.0"
+ commander "~11.0.0"
get-stdin "~9.0.0"
- glob "~8.0.3"
- ignore "~5.2.0"
+ glob "~10.2.7"
+ ignore "~5.2.4"
js-yaml "^4.1.0"
- jsonc-parser "~3.1.0"
- markdownlint "~0.26.2"
- markdownlint-rule-helpers "~0.17.2"
- minimatch "~5.1.0"
+ jsonc-parser "~3.2.0"
+ markdownlint "~0.29.0"
+ minimatch "~9.0.1"
run-con "~1.2.11"
-markdownlint-rule-helpers@~0.17.2:
- version "0.17.2"
- resolved "https://registry.yarnpkg.com/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.17.2.tgz#64d6e8c66e497e631b0e40cf1cef7ca622a0b654"
- integrity sha512-XaeoW2NYSlWxMCZM2B3H7YTG6nlaLfkEZWMBhr4hSPlq9MuY2sy83+Xr89jXOqZMZYjvi5nBCGoFh7hHoPKZmA==
+markdownlint-micromark@0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/markdownlint-micromark/-/markdownlint-micromark-0.1.2.tgz#5520e04febffa46741875a2f297509ffdb561f5c"
+ integrity sha512-jRxlQg8KpOfM2IbCL9RXM8ZiYWz2rv6DlZAnGv8ASJQpUh6byTBnEsbuMZ6T2/uIgntyf7SKg/mEaEBo1164fQ==
-markdownlint@~0.26.2:
- version "0.26.2"
- resolved "https://registry.yarnpkg.com/markdownlint/-/markdownlint-0.26.2.tgz#11d3d03e7f0dd3c2e239753ee8fd064a861d9237"
- integrity sha512-2Am42YX2Ex5SQhRq35HxYWDfz1NLEOZWWN25nqd2h3AHRKsGRE+Qg1gt1++exW792eXTrR4jCNHfShfWk9Nz8w==
+markdownlint-micromark@0.1.5:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/markdownlint-micromark/-/markdownlint-micromark-0.1.5.tgz#a23400b101be32cd4336f2b6b4c47da31825524c"
+ integrity sha512-HvofNU4QCvfUCWnocQP1IAWaqop5wpWrB0mKB6SSh0fcpV0PdmQNS6tdUuFew1utpYlUvYYzz84oDkrD76GB9A==
+
+markdownlint-rule-helpers@^0.20.0:
+ version "0.20.0"
+ resolved "https://registry.yarnpkg.com/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.20.0.tgz#c61bc7708f72891fb0eb1c1a93caf4c61788d009"
+ integrity sha512-9pPhgNcJmPCoFS+6aos0L/2tRSji8++7OLMlQZs0vsU23yj2/5m6IYxOLlbiPL13Z4MJ5RQLIbnEs3UZPcD11g==
+ dependencies:
+ markdownlint-micromark "0.1.2"
+
+markdownlint@~0.29.0:
+ version "0.29.0"
+ resolved "https://registry.yarnpkg.com/markdownlint/-/markdownlint-0.29.0.tgz#9647478b7d5485965c557502fe54ee5a550033f2"
+ integrity sha512-ASAzqpODstu/Qsk0xW5BPgWnK/qjpBQ4e7IpsSvvFXcfYIjanLTdwFRJK1SIEEh0fGSMKXcJf/qhaZYHyME0wA==
dependencies:
markdown-it "13.0.1"
+ markdownlint-micromark "0.1.5"
marked-bidi@^1.0.3:
version "1.0.3"
@@ -9315,13 +9402,20 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2:
dependencies:
brace-expansion "^1.1.7"
-minimatch@^5.0.1, minimatch@~5.1.0:
+minimatch@^5.0.1:
version "5.1.0"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7"
integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==
dependencies:
brace-expansion "^2.0.1"
+minimatch@^9.0.1, minimatch@~9.0.1:
+ version "9.0.1"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.1.tgz#8a555f541cf976c622daf078bb28f29fb927c253"
+ integrity sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==
+ dependencies:
+ brace-expansion "^2.0.1"
+
minimist-options@4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619"
@@ -9364,6 +9458,11 @@ minipass@^3.0.0, minipass@^3.1.1:
dependencies:
yallist "^4.0.0"
+"minipass@^5.0.0 || ^6.0.2":
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-6.0.2.tgz#542844b6c4ce95b202c0995b0a471f1229de4c81"
+ integrity sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==
+
minizlib@^2.1.1:
version "2.1.2"
resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931"
@@ -9865,17 +9964,17 @@ optionator@^0.8.1:
type-check "~0.3.2"
word-wrap "~1.2.3"
-optionator@^0.9.1:
- version "0.9.1"
- resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
- integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==
+optionator@^0.9.3:
+ version "0.9.3"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64"
+ integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==
dependencies:
+ "@aashutoshrathi/word-wrap" "^1.2.3"
deep-is "^0.1.3"
fast-levenshtein "^2.0.6"
levn "^0.4.1"
prelude-ls "^1.2.1"
type-check "^0.4.0"
- word-wrap "^1.2.3"
orderedmap@^2.0.0, orderedmap@^2.1.1:
version "2.1.1"
@@ -10075,6 +10174,14 @@ path-parse@^1.0.7:
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+path-scurry@^1.7.0:
+ version "1.9.2"
+ resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.9.2.tgz#90f9d296ac5e37e608028e28a447b11d385b3f63"
+ integrity sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==
+ dependencies:
+ lru-cache "^9.1.1"
+ minipass "^5.0.0 || ^6.0.2"
+
path-to-regexp@0.1.7:
version "0.1.7"
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
@@ -10416,10 +10523,10 @@ prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.1.2, prosemirror-keymap@^1.2.0:
prosemirror-state "^1.0.0"
w3c-keyname "^2.2.0"
-prosemirror-markdown@1.11.0, prosemirror-markdown@^1.10.1:
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/prosemirror-markdown/-/prosemirror-markdown-1.11.0.tgz#75f2d6f14655762b4b8a247436b87ed81e22c7ee"
- integrity sha512-yP9mZqPRstjZhhf3yykCQNE3AijxARrHe4e7esV9A+gp4cnGOH4QvrKYPpXLHspNWyvJJ+0URH+iIvV5qP1I2Q==
+prosemirror-markdown@1.11.1, prosemirror-markdown@^1.10.1:
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/prosemirror-markdown/-/prosemirror-markdown-1.11.1.tgz#441ad0ac4ab7c30f50623517e65c6bb8e966e9e3"
+ integrity sha512-CLOieKoaSSEusKyYcXIj8v2qHGLW+tnuffci+8678Sen48NEFQE7M3o0Nx0gj9v63iVDj+yLibj2gCe8eb3jIw==
dependencies:
markdown-it "^13.0.1"
prosemirror-model "^1.0.0"
@@ -11395,6 +11502,11 @@ signal-exit@^3.0.3, signal-exit@^3.0.7:
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
+signal-exit@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.0.2.tgz#ff55bb1d9ff2114c13b400688fa544ac63c36967"
+ integrity sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==
+
simple-update-notifier@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz#7edf75c5bdd04f88828d632f762b2bc32996a9cc"
@@ -11678,7 +11790,7 @@ string-length@^4.0.1:
char-regex "^1.0.2"
strip-ansi "^6.0.0"
-string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
+"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@@ -11687,6 +11799,15 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
+string-width@^5.0.1, string-width@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794"
+ integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==
+ dependencies:
+ eastasianwidth "^0.2.0"
+ emoji-regex "^9.2.2"
+ strip-ansi "^7.0.1"
+
string.prototype.trimend@^1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533"
@@ -11712,6 +11833,13 @@ string_decoder@^1.0.0, string_decoder@^1.1.1, string_decoder@~1.1.1:
dependencies:
safe-buffer "~5.1.0"
+"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
strip-ansi@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
@@ -11719,12 +11847,12 @@ strip-ansi@^5.2.0:
dependencies:
ansi-regex "^4.1.0"
-strip-ansi@^6.0.0, strip-ansi@^6.0.1:
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
- integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+strip-ansi@^7.0.1:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45"
+ integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==
dependencies:
- ansi-regex "^5.0.1"
+ ansi-regex "^6.0.1"
strip-bom@^3.0.0:
version "3.0.0"
@@ -13179,7 +13307,7 @@ wildcard@^2.0.0:
resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec"
integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==
-word-wrap@^1.2.3, word-wrap@~1.2.3:
+word-wrap@~1.2.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
@@ -13199,6 +13327,15 @@ worker-loader@^2.0.0:
loader-utils "^1.0.0"
schema-utils "^0.4.0"
+"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
wrap-ansi@^6.2.0:
version "6.2.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
@@ -13208,14 +13345,14 @@ wrap-ansi@^6.2.0:
string-width "^4.1.0"
strip-ansi "^6.0.0"
-wrap-ansi@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
- integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+wrap-ansi@^8.1.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"
+ integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==
dependencies:
- ansi-styles "^4.0.0"
- string-width "^4.1.0"
- strip-ansi "^6.0.0"
+ ansi-styles "^6.1.0"
+ string-width "^5.0.1"
+ strip-ansi "^7.0.1"
wrappy@1:
version "1.0.2"